diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 2f9adff..1722356 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -17,7 +17,7 @@ "problemMatcher": [], "group": { "kind": "build", - "isDefault": true + "isDefault": false } } ], diff --git a/communication.c b/communication.c index ca8af9f..ab79b67 100644 --- a/communication.c +++ b/communication.c @@ -50,7 +50,7 @@ void communication_reception_message(){ // Si un caractère est reçu, ajout du caractère au tampon tournant /// TODO: Tester le code suivant à la place de while get_char(); - + /* char nb_recu=0; if(tud_cdc_available()){ char tampon_usb[128]; @@ -64,8 +64,9 @@ void communication_reception_message(){ } com_reception_buffer.tampon[com_reception_buffer.index_tampon_ecriture] = input_char; } - } - /* + }*/ + + input_char = stdio_getchar_timeout_us(0); while(input_char != PICO_ERROR_TIMEOUT){ com_reception_buffer.index_tampon_ecriture++; if(com_reception_buffer.index_tampon_ecriture >= TAMPON_TAILLE){ @@ -76,7 +77,6 @@ void communication_reception_message(){ // Caractère suivant ? input_char = stdio_getchar_timeout_us(0); } - */ // Copie du tampon tournant dans une chaine // Parce que c'est plus simple à traiter @@ -100,30 +100,33 @@ void communication_reception_message(){ int fin_message = 0; for(int i=0; i ... ... + if(i + 2 < index_chaine_recue){ + // Test début message + if(chaîne_octets_reçus[i] == 0xFF && chaîne_octets_reçus[i+1] == 0xFF){ + //printf("Debut message: 0xFF 0xFF\n"); + // Taille du message (sans l'entête) + uint8_t offset = chaîne_octets_reçus[i+2]; + if(i + 2 + offset < index_chaine_recue){ + // printf("Message totalement reçu, taille %d\n", offset); + // Test fin message + if(chaîne_octets_reçus[i + 2 + offset] == 0x00){ + // printf("Fin message OK\n"); + // Lecture du message + message.type = 'b'; // Message binaire (par opposition à un message Texte) + message.taille_donnees = offset - 1; + for(int index_donnees = 0; index_donnees < message.taille_donnees; index_donnees++){ + message.donnees[index_donnees] = chaîne_octets_reçus[index_donnees + i + 3]; + } + fin_message = i + 2 + offset; + messagerie_put_message(message); + }else{ + // printf("Fin message NOK, attendu 0x00, recu %x\n", chaîne_octets_reçus[i + 2 + offset]); } - i = index_fin_message; - fin_message = index_fin_message; - index_fin_message = i; - messagerie_put_message(message); } } } - if(chaîne_octets_reçus[i] == 'd'){ - } if(chaîne_octets_reçus[i] == '>'){ message.type = chaîne_octets_reçus[i]; message.taille_donnees=0; diff --git a/communication.h b/communication.h index 76c84bd..a074357 100644 --- a/communication.h +++ b/communication.h @@ -1,3 +1,3 @@ -void communication_reception_message(); -void communication_init(); +void communication_reception_message(void); +void communication_init(void); diff --git a/main.c b/main.c index 4adf714..ff57bb0 100644 --- a/main.c +++ b/main.c @@ -30,12 +30,20 @@ void envoie_donnees(char * donnees, uint16_t length){ void envoie_structure(const void * donnees, size_t size){ const unsigned char *byte; + // Entête du message : debut + putchar(0xFF); + putchar(0xFF); + putchar(size + 1); + // Entête du message : fin + // Données for ( byte = donnees; size--; ++byte ) { putchar(*byte); //printf("%2X ", *byte); } - //printf("\n"); + // Caractère de fin + putchar(0x00); + printf("\n"); } void main(void) @@ -48,11 +56,10 @@ void main(void) struct message_requete_t message_requete_detection; unsigned char message_binaire[100]; - message_requete_detection.type = 'd'; + message_requete_detection.commande = 'd'; message_requete_detection.id_carte = 'D'; message_requete_detection.adresse_registre = 0; message_requete_detection.taille_donnees = 19; - message_requete_detection.fin_de_message = 0; message_binaire[0]='r'; @@ -90,6 +97,8 @@ void main(void) gpio_put(PICO_DEFAULT_LED_PIN, 0); temps_message_detection = get_absolute_time(); + unsigned int temps_ms; + temps_ms = get_absolute_time() / 1000.; communication_init(); @@ -106,31 +115,47 @@ void main(void) start_time_us = get_absolute_time(); communication_reception_message(); + if(messagerie_message_disponible()){ + uint8_t id_carte, registre; while(messagerie_message_disponible()){ message = messagerie_get_message(); nb_message++; - if(message.type == 'r'){ - if(message.id_carte == 'D'){ - temps_message_detection = get_absolute_time(); - if(message.donnees[0] > 0 && message.donnees[0] < 30){ - //printf(">LED ON\n"); - gpio_put(PICO_DEFAULT_LED_PIN, 1); - }else{ - //printf(">LED OFF\n"); - gpio_put(PICO_DEFAULT_LED_PIN, 0); - } + + if(message.type == 'b'){ + switch(message.donnees[0]){ + case 'r': // réception de données + // Reception de données + // données[0]: commande ('r' ici) + // données[1]: id de la carte + // données[2]: 1er registre + // données[3 à tailles_données -1]: valeurs + id_carte = message.donnees[1]; + registre = message.donnees[2]; + if(id_carte == 'D'){ + temps_message_detection = get_absolute_time(); + if(message.donnees[4] > 0 && message.donnees[4] < 30){ + //printf(">LED ON\n"); + gpio_put(PICO_DEFAULT_LED_PIN, 1); + }else{ + //printf(">LED OFF\n"); + gpio_put(PICO_DEFAULT_LED_PIN, 0); + } + } + break; } } } + current_time_us = get_absolute_time(); + //printf(">temps_reception:%lld\n", current_time_us - start_time_us); + //printf(">nb_message:%u\n",nb_message); } - current_time_us = get_absolute_time(); - //printf(">temps_reception:%lld\n", current_time_us - start_time_us); - printf(">nb_message:%u\n",nb_message); - - + if(get_absolute_time() / 1000. - temps_ms > 100){ + temps_ms = get_absolute_time() / 1000.; + printf(">nb_message:%u\n", nb_message); + } } } diff --git a/messagerie.h b/messagerie.h index 5f0cd59..6eec6fc 100644 --- a/messagerie.h +++ b/messagerie.h @@ -11,11 +11,10 @@ struct message_t{ }; struct message_requete_t{ - uint8_t type; + uint8_t commande; uint8_t id_carte; // Identifiant de la carte (on reprend les adresses I2C) uint8_t adresse_registre; // Adresse du registre lu uint8_t taille_donnees; - uint8_t fin_de_message; };