Compare commits

..

No commits in common. "101c1ac29ba0895e3c24977c69e9796023671a24" and "d2552f198b01d1cdf7659f4a4f3f188c33923f7c" have entirely different histories.

4 changed files with 27 additions and 334 deletions

288
hid_app.c
View File

@ -24,7 +24,6 @@
*/ */
#include "bsp/board_api.h" #include "bsp/board_api.h"
#include "hid_app.h"
#include "tusb.h" #include "tusb.h"
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+
@ -44,107 +43,11 @@ static struct
{ {
uint8_t report_count; uint8_t report_count;
tuh_hid_report_info_t report_info[MAX_REPORT]; tuh_hid_report_info_t report_info[MAX_REPORT];
uint16_t vid, pid;
}hid_info[CFG_TUH_HID]; }hid_info[CFG_TUH_HID];
static void process_kbd_report(hid_keyboard_report_t const *report); static void process_kbd_report(hid_keyboard_report_t const *report);
static void process_mouse_report(hid_mouse_report_t const * report); static void process_mouse_report(hid_mouse_report_t const * report);
static void process_generic_report(uint8_t dev_addr, uint8_t instance, uint8_t const* report, uint16_t len); static void process_generic_report(uint8_t dev_addr, uint8_t instance, uint8_t const* report, uint16_t len);
struct gamepad_data_t process_8bitpro_report(uint8_t dev_addr, uint8_t instance, uint8_t const* report, uint16_t len);
struct gamepad_data_t process_SonyDualShock4_report(uint8_t dev_addr, uint8_t instance, uint8_t const* report, uint16_t len);
struct gamepad_data_t process_BDA_NSW_report(uint8_t dev_addr, uint8_t instance, uint8_t const* report, uint16_t len);
void affiche_gamepad_data(struct gamepad_data_t _gamepad_report);
void refresh_gamepad_data(struct gamepad_data_t * gamepad_data);
// HID report from 8bitPro
typedef struct TU_ATTR_PACKED
{
uint8_t report_id;
uint b1:1; // Bouton A
uint b2:1; // Bouton B
uint b3:1; // 4 : ???
uint b4:1; // Bouton X
uint b5:1; // Bouton Y
uint b6:1; // 32 : ???
uint b7:1; // Bouton L
uint b8:1; // Bouton R
uint b9:1; // Bouton L2
uint b10:1; // Bouton R2
uint b11:1; // Start
uint b12:1; // Select
uint b13:1;
uint b14:1; // Click joystick gauche
uint b15:1; // Click joystick droit
uint b16:1; // 16 bits
uint8_t hat_switch; // OK
uint8_t x, y; // joystick Xg, Yg
uint8_t z, rz; // joystick Xd, Yd
uint8_t gachette_gauche; // ok
uint8_t gachette_droite; // ok
} _8bitpro_report_t ;
typedef struct TU_ATTR_PACKED
{
uint8_t report_id;
uint8_t x, y, z, rz; // joystick
uint hat_switch:4;
uint b1:1;
uint b2:1;
uint b3:1;
uint b4:1;
// 8 bits
uint b5:1;
uint b6:1;
uint b7:1;
uint b8:1;
uint b9:1;
uint b10:1;
uint b11:1;
uint b12:1; // 16 bits
uint data_1:8;
uint gachette_gauche:8;
uint gachette_droite:8;
} SonyDualShock4_report_t ;
typedef struct TU_ATTR_PACKED
{
uint b1:1; // Bouton Y
uint b2:1; // Bouton B
uint b3:1; // Bouton A
uint b4:1; // Bouton X
uint b5:1; // Bouton L
uint b6:1; // Bouton R
uint b7:1; // Bouton L2
uint b8:1; // Bouton R2
uint b9:1; // Bouton -
uint b10:1; // Bouton +
uint b11:1; // Bouton joystick droit
uint b12:1; // Bouton joystick gauche
uint b13:1; // Bouton Start
uint b14:1; // Bouton Select
uint b15:1; // --
uint b16:1; // --
uint8_t hat_switch; // OK
uint8_t x, y; // joystick Xg, Yg
uint8_t z, rz; // joystick Xd, Yd
} BDA_NSW_report_t ;
struct gamepad_data_t gamepad_data;
void hid_app_task(void) void hid_app_task(void)
{ {
@ -164,7 +67,6 @@ void tuh_hid_mount_cb(uint8_t dev_addr, uint8_t instance, uint8_t const* desc_re
{ {
printf("HID device address = %d, instance = %d is mounted\r\n", dev_addr, instance); printf("HID device address = %d, instance = %d is mounted\r\n", dev_addr, instance);
// Interface protocol (hid_interface_protocol_enum_t) // Interface protocol (hid_interface_protocol_enum_t)
const char* protocol_str[] = { "None", "Keyboard", "Mouse" }; const char* protocol_str[] = { "None", "Keyboard", "Mouse" };
uint8_t const itf_protocol = tuh_hid_interface_protocol(dev_addr, instance); uint8_t const itf_protocol = tuh_hid_interface_protocol(dev_addr, instance);
@ -175,26 +77,8 @@ void tuh_hid_mount_cb(uint8_t dev_addr, uint8_t instance, uint8_t const* desc_re
// Therefore for this simple example, we only need to parse generic report descriptor (with built-in parser) // Therefore for this simple example, we only need to parse generic report descriptor (with built-in parser)
if ( itf_protocol == HID_ITF_PROTOCOL_NONE ) if ( itf_protocol == HID_ITF_PROTOCOL_NONE )
{ {
uint16_t vid, pid;
tuh_vid_pid_get(dev_addr, &vid, &pid);
printf("VID = %04x, PID = %04x\r\n", vid, pid);
hid_info[instance].vid = vid;
hid_info[instance].pid = pid;
hid_info[instance].report_count = tuh_hid_parse_report_descriptor(hid_info[instance].report_info, MAX_REPORT, desc_report, desc_len); hid_info[instance].report_count = tuh_hid_parse_report_descriptor(hid_info[instance].report_info, MAX_REPORT, desc_report, desc_len);
printf("HID has %u reports \r\n", hid_info[instance].report_count); printf("HID has %u reports \r\n", hid_info[instance].report_count);
for(int i=0; i< hid_info[instance].report_count; i++){
if(hid_info[instance].report_info->usage == 5 &&
hid_info[instance].report_info->usage_page == 1){
printf("Found Gamepad descriptor\n");
//create_gamepad_configuration(dev_addr, instance, desc_report, desc_len);
}
}
} }
// request to receive report // request to receive report
@ -230,16 +114,7 @@ void tuh_hid_report_received_cb(uint8_t dev_addr, uint8_t instance, uint8_t cons
default: default:
// Generic report requires matching ReportID and contents with previous parsed report info // Generic report requires matching ReportID and contents with previous parsed report info
// Report - 2dc8:6002 8BitDo 8BitDo SN30 Pro+ process_generic_report(dev_addr, instance, report, len);
if(hid_info[instance].vid == 0x2dc8 && hid_info[instance].pid == 0x6002){
gamepad_data = process_8bitpro_report(dev_addr, instance, report, len);
}else if(hid_info[instance].vid == 0x054c && hid_info[instance].pid == 0x05c4){
gamepad_data = process_SonyDualShock4_report(dev_addr, instance, report, len);
}else if(hid_info[instance].vid == 0x20d6 && hid_info[instance].pid == 0xa713){
gamepad_data = process_BDA_NSW_report(dev_addr, instance, report, len);
}else{
process_generic_report(dev_addr, instance, report, len);
}
break; break;
} }
@ -354,113 +229,6 @@ static void process_mouse_report(hid_mouse_report_t const * report)
cursor_movement(report->x, report->y, report->wheel); cursor_movement(report->x, report->y, report->wheel);
} }
//--------------------------------------------------------------------+
// Report - 2dc8:6002 8BitDo 8BitDo SN30 Pro+
//--------------------------------------------------------------------+
struct gamepad_data_t process_8bitpro_report(uint8_t dev_addr, uint8_t instance, uint8_t const* report, uint16_t len){
struct gamepad_data_t gamepad_data;
_8bitpro_report_t gamepad_report;
memcpy(&gamepad_report, report, sizeof(gamepad_report));
refresh_gamepad_data(&gamepad_data);
// Copie des données du rapport vers la structure standard
gamepad_data.joystick_x_gauche = gamepad_report.x;
gamepad_data.joystick_y_gauche = gamepad_report.y;
gamepad_data.joystick_x_droit = gamepad_report.z;
gamepad_data.joystick_y_droit = gamepad_report.rz;
gamepad_data.bouton_A = gamepad_report.b1;
gamepad_data.bouton_B = gamepad_report.b2;
gamepad_data.bouton_X = gamepad_report.b4;
gamepad_data.bouton_Y = gamepad_report.b5;
gamepad_data.bouton_L = gamepad_report.b7;
gamepad_data.bouton_R = gamepad_report.b8;
gamepad_data.bouton_L2 = gamepad_report.b9;
gamepad_data.bouton_R2 = gamepad_report.b10;
gamepad_data.bouton_Start = gamepad_report.b11;
gamepad_data.bouton_Select = gamepad_report.b12;
gamepad_data.bouton_joystick_gauche = gamepad_report.b15;
gamepad_data.bouton_joystick_droit = gamepad_report.b14;
gamepad_data.dpad = gamepad_report.hat_switch;
gamepad_data.gachette_droite = gamepad_report.gachette_droite;
gamepad_data.gachette_gauche = gamepad_report.gachette_gauche;
affiche_gamepad_data(gamepad_data);
return gamepad_data;
}
//--------------------------------------------------------------------+
// 054c:05c4 Sony Corp. DualShock 4 [CUH-ZCT1x]
//--------------------------------------------------------------------+
struct gamepad_data_t process_SonyDualShock4_report(uint8_t dev_addr, uint8_t instance, uint8_t const* report, uint16_t len){
struct gamepad_data_t gamepad_data;
SonyDualShock4_report_t gamepad_report;
memcpy(&gamepad_report, report, sizeof(gamepad_report));
refresh_gamepad_data(&gamepad_data);
// Copie des données du rapport vers la structure standard
gamepad_data.joystick_x_gauche = gamepad_report.x;
gamepad_data.joystick_y_gauche = gamepad_report.y;
gamepad_data.joystick_x_droit = gamepad_report.z;
gamepad_data.joystick_y_droit = gamepad_report.rz;
gamepad_data.bouton_Y = gamepad_report.b4;
gamepad_data.bouton_A = gamepad_report.b3;
gamepad_data.bouton_B = gamepad_report.b2;
gamepad_data.bouton_X = gamepad_report.b1;
gamepad_data.bouton_joystick_droit = gamepad_report.b11;
gamepad_data.bouton_joystick_gauche = gamepad_report.b12;
gamepad_data.bouton_Select = gamepad_report.b10;
gamepad_data.bouton_Start = gamepad_report.b9;
gamepad_data.bouton_R2 = gamepad_report.b8;
gamepad_data.bouton_L2 = gamepad_report.b7;
gamepad_data.bouton_R = gamepad_report.b6;
gamepad_data.bouton_L = gamepad_report.b5;
gamepad_data.dpad = gamepad_report.hat_switch;
gamepad_data.gachette_droite = gamepad_report.gachette_droite;
gamepad_data.gachette_gauche = gamepad_report.gachette_gauche;
affiche_gamepad_data(gamepad_data);
return gamepad_data;
}
//--------------------------------------------------------------------+
// Report - 20d6:a713 BDA NSW wired controller
//--------------------------------------------------------------------+
struct gamepad_data_t process_BDA_NSW_report(uint8_t dev_addr, uint8_t instance, uint8_t const* report, uint16_t len){
struct gamepad_data_t gamepad_data;
BDA_NSW_report_t gamepad_report;
memcpy(&gamepad_report, report, sizeof(gamepad_report));
refresh_gamepad_data(&gamepad_data);
// Copie des données du rapport vers la structure standard
gamepad_data.joystick_x_gauche = gamepad_report.x;
gamepad_data.joystick_y_gauche = gamepad_report.y;
gamepad_data.joystick_x_droit = gamepad_report.z;
gamepad_data.joystick_y_droit = gamepad_report.rz;
gamepad_data.bouton_Y = gamepad_report.b1;
gamepad_data.bouton_B = gamepad_report.b2;
gamepad_data.bouton_A = gamepad_report.b3;
gamepad_data.bouton_X = gamepad_report.b4;
gamepad_data.bouton_L = gamepad_report.b5;
gamepad_data.bouton_R = gamepad_report.b6;
gamepad_data.bouton_L2 = gamepad_report.b7;
gamepad_data.bouton_R2 = gamepad_report.b8;
gamepad_data.bouton_joystick_gauche = gamepad_report.b12;
gamepad_data.bouton_joystick_droit = gamepad_report.b11;
gamepad_data.bouton_Start = gamepad_report.b13;
gamepad_data.bouton_Select = gamepad_report.b14;
gamepad_data.dpad = gamepad_report.hat_switch;
affiche_gamepad_data(gamepad_data);
return gamepad_data;
}
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+
// Generic Report // Generic Report
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+
@ -471,14 +239,6 @@ static void process_generic_report(uint8_t dev_addr, uint8_t instance, uint8_t c
uint8_t const rpt_count = hid_info[instance].report_count; uint8_t const rpt_count = hid_info[instance].report_count;
tuh_hid_report_info_t* rpt_info_arr = hid_info[instance].report_info; tuh_hid_report_info_t* rpt_info_arr = hid_info[instance].report_info;
tuh_hid_report_info_t* rpt_info = NULL; tuh_hid_report_info_t* rpt_info = NULL;
//printf("HID Report brut\n");
printf(">a:1\n");
for(int i=0; i< len; i++){
printf("0x%X ", report[i]);
}
printf("\n");
if ( rpt_count == 1 && rpt_info_arr[0].report_id == 0) if ( rpt_count == 1 && rpt_info_arr[0].report_id == 0)
{ {
@ -532,53 +292,7 @@ static void process_generic_report(uint8_t dev_addr, uint8_t instance, uint8_t c
process_mouse_report( (hid_mouse_report_t const*) report ); process_mouse_report( (hid_mouse_report_t const*) report );
break; break;
case HID_USAGE_DESKTOP_GAMEPAD:
break;
default: break; default: break;
} }
} }
} }
void process_gamepad_report(){
}
void affiche_gamepad_data(struct gamepad_data_t _gamepad_report){
printf(">jxd:%d\n", _gamepad_report.joystick_x_gauche);
printf(">jyd:%d\n", _gamepad_report.joystick_y_gauche);
printf(">jxg:%d\n", _gamepad_report.joystick_x_droit);
printf(">jyg:%d\n", _gamepad_report.joystick_y_droit);
printf(">hat:%d\n", _gamepad_report.dpad);
printf(">ba:%d\n", _gamepad_report.bouton_A);
printf(">bb:%d\n", _gamepad_report.bouton_B);
printf(">bx:%d\n", _gamepad_report.bouton_X);
printf(">by:%d\n", _gamepad_report.bouton_Y);
printf(">bstart:%d\n", _gamepad_report.bouton_Start);
printf(">bselect:%d\n", _gamepad_report.bouton_Select);
printf(">bl:%d\n", _gamepad_report.bouton_L);
printf(">br:%d\n", _gamepad_report.bouton_R);
printf(">bl2:%d\n", _gamepad_report.bouton_L2);
printf(">br2:%d\n", _gamepad_report.bouton_R2);
printf(">bjg:%d\n", _gamepad_report.bouton_joystick_droit);
printf(">bjd:%d\n", _gamepad_report.bouton_joystick_gauche);
//printf(">data1:%d\n", _gamepad_report.data_1);
printf(">gd:%d\n", _gamepad_report.gachette_droite);
printf(">gg:%d\n", _gamepad_report.gachette_gauche);
}
void refresh_gamepad_data(struct gamepad_data_t * gamepad_data){
gamepad_data->temps_ms = (uint32_t) get_absolute_time() / 1000;
}
bool gamepad_connecte(){
return ((get_absolute_time() / 1000) - gamepad_data.temps_ms < 1000);
}
struct gamepad_data_t get_gamepad_data(){
return gamepad_data;
}

View File

@ -1,29 +0,0 @@
#include <stdlib.h>
struct gamepad_data_t{
uint32_t temps_ms;
uint8_t joystick_x_gauche;
uint8_t joystick_y_gauche;
uint8_t joystick_x_droit;
uint8_t joystick_y_droit;
uint8_t gachette_gauche;
uint8_t gachette_droite;
uint8_t dpad;
bool bouton_A;
bool bouton_B;
bool bouton_X;
bool bouton_Y;
bool bouton_Start;
bool bouton_Select;
bool bouton_L;
bool bouton_L2;
bool bouton_R;
bool bouton_R2;
bool bouton_joystick_gauche;
bool bouton_joystick_droit;
};
bool gamepad_connecte();
struct gamepad_data_t get_gamepad_data();

35
main.c
View File

@ -36,7 +36,6 @@
#include "com_usb.h" #include "com_usb.h"
#include "pico/multicore.h" #include "pico/multicore.h"
#include "ws2812.h" #include "ws2812.h"
#include "hid_app.h"
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+
// MACRO CONSTANT TYPEDEF PROTYPES // MACRO CONSTANT TYPEDEF PROTYPES
@ -144,19 +143,17 @@ void core1_functions(){
/*------------- MAIN -------------*/ /*------------- MAIN -------------*/
int main(void) { int main(void) {
board_init();
gpio_set_function(12, UART_FUNCSEL_NUM(uart0, 12)); gpio_set_function(12, UART_FUNCSEL_NUM(uart0, 12));
gpio_set_function(13, UART_FUNCSEL_NUM(uart0, 13)); gpio_set_function(13, UART_FUNCSEL_NUM(uart0, 13));
printf("TinyUSB Host CDC MSC HID - LED2\r\n"); printf("TinyUSB Host CDC MSC HID - Logs\r\n");
multicore_launch_core1(core1_functions); multicore_launch_core1(core1_functions);
board_init();
ws2812_init(); ws2812_init();
ws2812_set_buffer_rgb(2,2,2,0); ws2812_set_buffer_rgb(2,2,2,0);
ws2812_set_buffer_rgb(2,2,2,3); ws2812_set_buffer_rgb(2,2,2,3);
// Init detection carte SD // Init detection carte SD
gpio_init(1); gpio_init(1);
gpio_set_dir(1, GPIO_IN); gpio_set_dir(1, GPIO_IN);
@ -189,7 +186,7 @@ int main(void) {
ws2812_set_mode(LED_ID_DETECTION, LED_PULSE_RAPIDE, 0x000004); ws2812_set_mode(LED_ID_DETECTION, LED_PULSE_RAPIDE, 0x000004);
//while(1){ while(1){
f = get_absolute_time() / 1000. - start_time; f = get_absolute_time() / 1000. - start_time;
f = f / 1000.; f = f / 1000.;
if(f > 1){ if(f > 1){
@ -208,7 +205,7 @@ int main(void) {
ws2812_set_mode(LED_ID_DETECTION, LED_PULSE_RAPIDE, 0x000004); ws2812_set_mode(LED_ID_DETECTION, LED_PULSE_RAPIDE, 0x000004);
ws2812_set_mode(LED_ID_DIVERS, LED_STABLE, 0x000004); ws2812_set_mode(LED_ID_DIVERS, LED_STABLE, 0x000004);
sleep_ms(1000); sleep_ms(3000);
ws2812_set_mode(LED_ID_SD_CARD, LED_CLI_RAPIDE, 0x000404); ws2812_set_mode(LED_ID_SD_CARD, LED_CLI_RAPIDE, 0x000404);
ws2812_set_mode(LED_ID_USB, LED_CLI_NORMAL, 0x000404); ws2812_set_mode(LED_ID_USB, LED_CLI_NORMAL, 0x000404);
@ -216,7 +213,7 @@ int main(void) {
ws2812_set_mode(LED_ID_DETECTION, LED_CLI_PANIQUE_1, 0x000404); ws2812_set_mode(LED_ID_DETECTION, LED_CLI_PANIQUE_1, 0x000404);
ws2812_set_mode(LED_ID_DIVERS, LED_CLI_PANIQUE_2, 0x000404); ws2812_set_mode(LED_ID_DIVERS, LED_CLI_PANIQUE_2, 0x000404);
sleep_ms(1000); sleep_ms(3000);
ws2812_set_mode(LED_ID_SD_CARD, LED_CLI_PANIQUE_3, 0x040000); ws2812_set_mode(LED_ID_SD_CARD, LED_CLI_PANIQUE_3, 0x040000);
ws2812_set_mode(LED_ID_USB, LED_PULSE_RAPIDE, 0x040000); ws2812_set_mode(LED_ID_USB, LED_PULSE_RAPIDE, 0x040000);
@ -224,10 +221,11 @@ int main(void) {
ws2812_set_mode(LED_ID_DETECTION, LED_PULSE_LENT, 0x040000); ws2812_set_mode(LED_ID_DETECTION, LED_PULSE_LENT, 0x040000);
ws2812_set_mode(LED_ID_DIVERS, LED_STABLE, 0x040000); ws2812_set_mode(LED_ID_DIVERS, LED_STABLE, 0x040000);
sleep_ms(1000); sleep_ms(3000);
sleep_ms(1); sleep_ms(1);
//} }
@ -268,17 +266,26 @@ int main(void) {
log_init(drive_path); log_init(drive_path);
//multicore_launch_core1(routine_log_sd);
const char buffer[]= "Ceci est le test de Poivron Robotique\n";
char big_big_buffer[0x10000]; // 16 ko
int size = 0;
big_big_buffer[0]= '\0';
while(size + strlen(buffer) < 0x10000){
strcat(big_big_buffer, buffer);
size += strlen(buffer);
}
while (1) { while (1) {
struct gamepad_data_t gamepad_data;
// tinyusb host task // tinyusb host task
tuh_task(); tuh_task();
led_blinking_task(); led_blinking_task();
cdc_app_task(); cdc_app_task();
hid_app_task(); hid_app_task();
gamepad_data = get_gamepad_data();
ws2812_set_mode(LED_ID_DIVERS, LED_STABLE, (gamepad_data.joystick_x_droit) << 8 | gamepad_data.joystick_y_droit);
//log_to_sd(big_big_buffer); //log_to_sd(big_big_buffer);
//log_to_usb(big_big_buffer); // à commenter pour obtenir un test juste sur la carte SD.(ou simplement ne pas brancher de clé USB) //log_to_usb(big_big_buffer); // à commenter pour obtenir un test juste sur la carte SD.(ou simplement ne pas brancher de clé USB)

View File

@ -13,8 +13,6 @@
uint32_t couleur[13]; uint32_t couleur[13];
uint32_t buffer_couleur[12]; uint32_t buffer_couleur[12];
PIO pio;
struct ws2812_type_gestion_t struct ws2812_type_gestion_t
{ {
enum led_type_gestion_t led_type_gestion; enum led_type_gestion_t led_type_gestion;
@ -68,7 +66,7 @@ void ws2812_init(){
couleur[12]=0x00FF00;*/ couleur[12]=0x00FF00;*/
// initialisation du PIO // initialisation du PIO
pio = pio1; PIO pio = pio0;
int sm = 0; int sm = 0;
uint offset = pio_add_program(pio, &ws2812_program); uint offset = pio_add_program(pio, &ws2812_program);
@ -104,7 +102,7 @@ void ws2812_arc_en_ciel(){
} }
static inline void put_pixel(uint32_t pixel_grb) { static inline void put_pixel(uint32_t pixel_grb) {
pio_sm_put_blocking(pio, 0, pixel_grb << 8u); pio_sm_put_blocking(pio0, 0, pixel_grb << 8u);
} }
static inline uint32_t urgb_u32(uint8_t r, uint8_t g, uint8_t b) { static inline uint32_t urgb_u32(uint8_t r, uint8_t g, uint8_t b) {
@ -210,9 +208,12 @@ void ws2812_gestion(void){
temps_ref =100000; temps_ref =100000;
nb_cli = 1; nb_cli = 1;
phase_led =(get_absolute_time() / temps_ref) % (nb_cli*2 + 4) ; phase_led =(get_absolute_time() / temps_ref) % (nb_cli*2 + 4) ;
printf(">l:%d\n", phase_led);
if(phase_led >= nb_cli*2){ if(phase_led >= nb_cli*2){
ws2812_set_buffer(0x000000, led_id); ws2812_set_buffer(0x000000, led_id);
}else{ }else{
printf(">l1:%d\n",phase_led );
if(phase_led % 2){ if(phase_led % 2){
ws2812_set_buffer(ws2812_type_gestion[led_id].couleur, led_id); ws2812_set_buffer(ws2812_type_gestion[led_id].couleur, led_id);
}else{ }else{