From 7deaa4a49b1d0fb2112a69719141709b9c261c7c Mon Sep 17 00:00:00 2001 From: guowenxue <guowenxue@gmail.com> Date: Wed, 21 Aug 2024 16:05:07 +0800 Subject: [PATCH] Update leds source code --- hal/api/leds.c | 226 +++++++++++++++++++++++++------------------------------- 1 files changed, 102 insertions(+), 124 deletions(-) diff --git a/hal/api/leds.c b/hal/api/leds.c index 1918a0b..5905885 100644 --- a/hal/api/leds.c +++ b/hal/api/leds.c @@ -24,88 +24,18 @@ #include <time.h> #include <errno.h> #include <signal.h> - -#include <gpiod.h> - -#define DELAY 300 - -#define ON 1 -#define OFF 0 - -/* Three LEDs number */ -enum -{ - LED_R = 0, - LED_G, - LED_B, - LEDCNT, -}; - -enum -{ - ACTIVE_HIGH, /* High level will turn led on */ - ACTIVE_LOW, /* Low level will turn led on */ -}; - -/* Three LEDs hardware information */ -typedef struct led_s -{ - const char *name; /* RGB 3-color LED name */ - int chip_num; /* RGB 3-color LED connect chip */ - int gpio_num; /* RGB 3-color LED connect line */ - int active; /* RGB 3-color LED active level */ - struct gpiod_line_request *request; /* libgpiod gpio request handler */ -} led_t; - -static led_t leds_info[LEDCNT] = -{ - {"red", 0, 23, ACTIVE_HIGH, NULL }, /* GPIO1_IO23 on chip0 line 23, active high */ - {"green", 4, 1, ACTIVE_HIGH, NULL }, /* GPIO5_IO01 on chip4 line 1, active high */ - {"blue", 4, 8, ACTIVE_HIGH, NULL }, /* GPIO5_IO08 on chip4 line 8, active high */ -}; - -/* Three LEDs API context */ -typedef struct leds_s -{ - led_t *leds; /* led pointer to leds_info */ - int count; /* led count */ -} leds_t; - - -/* function declaration */ -int init_led(leds_t *leds); -int term_led(leds_t *leds); -int turn_led(leds_t *leds, int which, int cmd); -static inline void msleep(unsigned long ms); - +#include "leds.h" int g_stop = 0; -void sig_handler(int signum) -{ - switch( signum ) - { - case SIGINT: - case SIGTERM: - g_stop = 1; - - default: - break; - } - - return ; -} +static inline void msleep(unsigned long ms); +void sig_handler(int signum); int main(int argc, char *argv[]) { int rv; - leds_t leds = - { - .leds = leds_info, - .count = LEDCNT, - }; - if( (rv=init_led(&leds)) < 0 ) + if( (rv=init_led()) < 0 ) { printf("initial leds gpio failure, rv=%d\n", rv); return 1; @@ -117,55 +47,43 @@ while( !g_stop ) { - turn_led(&leds, LED_R, ON); + turn_led(LED_R, ON); msleep(DELAY); - turn_led(&leds, LED_R, OFF); + turn_led(LED_R, OFF); msleep(DELAY); - turn_led(&leds, LED_G, ON); + toggle_led(LED_G); msleep(DELAY); - turn_led(&leds, LED_G, OFF); + toggle_led(LED_G); msleep(DELAY); - turn_led(&leds, LED_B, ON); - msleep(DELAY); - turn_led(&leds, LED_B, OFF); - msleep(DELAY); + blink_led(LED_B, DELAY); } - term_led(&leds); + term_led(); return 0; } -int term_led(leds_t *leds) + +/*+---------------------------------+ + *| Leds API based on libgpiod v2.0 | + *+---------------------------------+*/ + +static led_t leds_info[LEDCNT] = { - int i; - led_t *led; + {"red", 0, 23, ACTIVE_HIGH, 0, NULL}, /* GPIO1_IO23 on chip0 line 23, active high */ + {"green", 4, 1, ACTIVE_HIGH, 0, NULL}, /* GPIO5_IO01 on chip4 line 1, active high */ + {"blue", 4, 8, ACTIVE_HIGH, 0, NULL}, /* GPIO5_IO08 on chip4 line 8, active high */ +}; - printf("terminate RGB Led gpios\n"); +/* Leds context */ +static leds_t leds = +{ + .leds = leds_info, + .count = LEDCNT, +}; - if( !leds ) - { - printf("Invalid input arguments\n"); - return -1; - } - - for(i=0; i<leds->count; i++) - { - led = &leds->leds[i]; - - if( led->request ) - { - turn_led(leds, i, OFF); - gpiod_line_request_release(led->request); - } - } - - return 0; -} - - -int init_led(leds_t *leds) +int init_led(void) { led_t *led; int i, rv = 0; @@ -174,14 +92,6 @@ struct gpiod_line_settings *settings; /* gpio direction, bias, active_low, value */ struct gpiod_line_config *line_cfg; /* gpio line */ struct gpiod_request_config *req_cfg; /* gpio consumer, it can be NULL */ - - - if( !leds ) - { - printf("Invalid input arguments\n"); - return -1; - } - /* defined in libgpiod-2.0/lib/line-settings.c: @@ -239,9 +149,9 @@ goto cleanup; } - for(i=0; i<leds->count; i++) + for(i=0; i<leds.count; i++) { - led = &leds->leds[i]; + led = &leds.leds[i]; snprintf(chip_dev, sizeof(chip_dev), "/dev/gpiochip%d", led->chip_num); chip = gpiod_chip_open(chip_dev); @@ -275,7 +185,7 @@ cleanup: if( rv< 0 ) - term_led(leds); + term_led(); if( line_cfg ) gpiod_line_config_free(line_cfg); @@ -289,26 +199,78 @@ return rv; } -int turn_led(leds_t *leds, int which, int cmd) +int term_led(void) +{ + int i; + led_t *led; + + printf("terminate RGB Led gpios\n"); + + for(i=0; i<leds.count; i++) + { + led = &leds.leds[i]; + + if( led->request ) + { + turn_led(i, OFF); + gpiod_line_request_release(led->request); + } + } + + return 0; +} + +int turn_led(int which, int cmd) { led_t *led; int rv = 0; int value = 0; - if( !leds || which<0 || which>=leds->count ) + if( which<0 || which>=leds.count ) { printf("Invalid input arguments\n"); return -1; } - led = &leds->leds[which]; + led = &leds.leds[which]; value = OFF==cmd ? GPIOD_LINE_VALUE_INACTIVE : GPIOD_LINE_VALUE_ACTIVE; - gpiod_line_request_set_value(led->request, led->gpio_num, value); + + led->status = OFF==cmd ? OFF : ON; return 0; } + +int toggle_led(int which) +{ + led_t *led; + + if( which<0 || which>=leds.count ) + { + printf("Invalid input arguments\n"); + return -1; + } + + led = &leds.leds[which]; + + return turn_led(which, !led->status); +} + +void blink_led(int which, int interval) +{ + led_t *led; + + turn_led(which, ON); + msleep(interval); + + turn_led(which, OFF); + msleep(interval); +} + +/*+-------------------------------+ + *| Misc functions API | + *+-------------------------------+*/ static inline void msleep(unsigned long ms) { @@ -330,3 +292,19 @@ return ; } + +void sig_handler(int signum) +{ + switch( signum ) + { + case SIGINT: + case SIGTERM: + g_stop = 1; + + default: + break; + } + + return ; +} + -- Gitblit v1.9.1