@@ -29,7 +29,9 @@ LOG_MODULE_REGISTER(badge_shell);
2929#define LED_DELAY K_MSEC(600)
3030#define RGB (_r , _g , _b ) ((struct led_rgb) { .r = (_r), .g = (_g), .b = (_b)})
3131static const struct device * const strip = DEVICE_DT_GET (STRIP_NODE );
32+
3233static struct led_rgb pixels [STRIP_NUM_PIXELS ];
34+
3335static void set_led_color (struct led_rgb color )
3436{
3537 for (int i = 0 ; i < STRIP_NUM_PIXELS ; i ++ ){
@@ -42,23 +44,32 @@ static void set_led_color(struct led_rgb color)
4244 LOG_INF ("LED color set: R=%u G=%u B=%u" , color .r , color .g , color .b );
4345 }
4446}
47+
4548static int cmd_led (const struct shell * shell , size_t argc , char * * argv )
4649{
47- if (argc != 2 ){
48- shell_print (shell , "Usage: led<r/g/b> " );
50+ if (argc != 4 ){
51+ shell_print (shell , "Usage: led <red> <green> <blue> (each 0-255) " );
4952 return - EINVAL ;
5053 }
51- const char * c = argv [1 ];
52- if (strcmp (c , "r" ) == 0 ){
53- set_led_color (RGB (0x0F , 0x00 , 0x00 ));
54- } else if (strcmp (c , "g" ) == 0 ){
55- set_led_color (RGB (0x00 , 0x0F , 0x00 ));
56- }else if (strcmp (c , "b" ) == 0 ){
57- set_led_color (RGB (0x00 , 0x00 , 0x0F ));
58- }else {
59- shell_error (shell , "Invalid color (r/g/b)" );
54+
55+ char * endptr ;
56+ long r = strtol (argv [1 ], & endptr , 10 );
57+ if (* endptr != '\0' || r < 0 || r > 255 ) {
58+ shell_error (shell , "Invalid red value (0-255)" );
59+ return - EINVAL ;
60+ }
61+ long g = strtol (argv [2 ], & endptr , 10 );
62+ if (* endptr != '\0' || g < 0 || g > 255 ) {
63+ shell_error (shell , "Invalid green value (0-255)" );
64+ return - EINVAL ;
65+ }
66+ long b = strtol (argv [3 ], & endptr , 10 );
67+ if (* endptr != '\0' || b < 0 || b > 255 ) {
68+ shell_error (shell , "Invalid blue value (0-255)" );
6069 return - EINVAL ;
6170 }
71+
72+ set_led_color (RGB ((uint8_t )r , (uint8_t )g , (uint8_t )b ));
6273 return 0 ;
6374}
6475SHELL_CMD_REGISTER (led , NULL , "Set LED color (r, g, b)" , cmd_led );
@@ -373,7 +384,12 @@ char text[MAX_STRINGS][32]= {
373384void badge_init_entry (void * arg )
374385{
375386 LOG_INF ("Badge init entry" );
376-
387+ if (!device_is_ready (strip )){
388+ LOG_ERR ("LED strip not ready" );
389+ return ;
390+ }
391+ LOG_INF ("LED strip ready. Use shell command: led r/g/b" );
392+ set_led_color (RGB (0x0F , 0x0F , 0x0F )); // Default: white
377393 // Initialize display work queue
378394 k_work_queue_init (& display_work_q );
379395 k_work_queue_start (& display_work_q , display_stack , K_THREAD_STACK_SIZEOF (display_stack ),
@@ -507,13 +523,7 @@ int main(void)
507523{
508524 int32_t ret ;
509525 int rc ;
510-
511- if (!device_is_ready (strip )){
512- LOG_ERR ("LED strip not ready" );
513- return ;
514- }
515- LOG_INF ("LED strip ready. Use shell command: led r/g/b" );
516- set_led_color (RGB (0x0F , 0x0F , 0x0F )); // Default: white
526+
517527 smf_set_initial (SMF_CTX (& s_obj ), & badge_states [BADGE_STATE_INIT ]);
518528 while (1 ) {
519529 rc = k_msgq_get (& event_msgq , & s_obj .event , K_NO_WAIT );
0 commit comments