Communication v2 fonctionnelle
This commit is contained in:
parent
11c278e368
commit
e20a8a0a7e
2
.vscode/tasks.json
vendored
2
.vscode/tasks.json
vendored
@ -17,7 +17,7 @@
|
|||||||
"problemMatcher": [],
|
"problemMatcher": [],
|
||||||
"group": {
|
"group": {
|
||||||
"kind": "build",
|
"kind": "build",
|
||||||
"isDefault": true
|
"isDefault": false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|||||||
@ -50,7 +50,7 @@ void communication_reception_message(){
|
|||||||
// Si un caractère est reçu, ajout du caractère au tampon tournant
|
// 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();
|
/// TODO: Tester le code suivant à la place de while get_char();
|
||||||
|
/*
|
||||||
char nb_recu=0;
|
char nb_recu=0;
|
||||||
if(tud_cdc_available()){
|
if(tud_cdc_available()){
|
||||||
char tampon_usb[128];
|
char tampon_usb[128];
|
||||||
@ -64,8 +64,9 @@ void communication_reception_message(){
|
|||||||
}
|
}
|
||||||
com_reception_buffer.tampon[com_reception_buffer.index_tampon_ecriture] = input_char;
|
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){
|
while(input_char != PICO_ERROR_TIMEOUT){
|
||||||
com_reception_buffer.index_tampon_ecriture++;
|
com_reception_buffer.index_tampon_ecriture++;
|
||||||
if(com_reception_buffer.index_tampon_ecriture >= TAMPON_TAILLE){
|
if(com_reception_buffer.index_tampon_ecriture >= TAMPON_TAILLE){
|
||||||
@ -76,7 +77,6 @@ void communication_reception_message(){
|
|||||||
// Caractère suivant ?
|
// Caractère suivant ?
|
||||||
input_char = stdio_getchar_timeout_us(0);
|
input_char = stdio_getchar_timeout_us(0);
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
// Copie du tampon tournant dans une chaine
|
// Copie du tampon tournant dans une chaine
|
||||||
// Parce que c'est plus simple à traiter
|
// Parce que c'est plus simple à traiter
|
||||||
@ -100,30 +100,33 @@ void communication_reception_message(){
|
|||||||
int fin_message = 0;
|
int fin_message = 0;
|
||||||
for(int i=0; i<index_chaine_recue; i++){
|
for(int i=0; i<index_chaine_recue; i++){
|
||||||
int index_fin_message = 0;
|
int index_fin_message = 0;
|
||||||
if(chaîne_octets_reçus[i] == 'r' || chaîne_octets_reçus[i] == 'w'){
|
// Com v2
|
||||||
if(i+3 < index_chaine_recue){
|
// OxFF OxFF <taille> ... ... <fin (0x00)>
|
||||||
message.taille_donnees = chaîne_octets_reçus[i+3];
|
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){
|
||||||
index_fin_message = i+4 + message.taille_donnees;
|
//printf("Debut message: 0xFF 0xFF\n");
|
||||||
if(index_fin_message < index_chaine_recue){
|
// Taille du message (sans l'entête)
|
||||||
if(chaîne_octets_reçus[index_fin_message] == 0){
|
uint8_t offset = chaîne_octets_reçus[i+2];
|
||||||
message.type = chaîne_octets_reçus[i];
|
if(i + 2 + offset < index_chaine_recue){
|
||||||
message.id_carte = chaîne_octets_reçus[i+1];
|
// printf("Message totalement reçu, taille %d\n", offset);
|
||||||
message.adresse_registre = chaîne_octets_reçus[i+2];
|
// Test fin message
|
||||||
message.taille_donnees = chaîne_octets_reçus[i+3];
|
if(chaîne_octets_reçus[i + 2 + offset] == 0x00){
|
||||||
for(int index_donnees=0; index_donnees<message.taille_donnees; index_donnees++){
|
// printf("Fin message OK\n");
|
||||||
message.donnees[index_donnees] = chaîne_octets_reçus[i + 4 + index_donnees];
|
// 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] == '>'){
|
if(chaîne_octets_reçus[i] == '>'){
|
||||||
message.type = chaîne_octets_reçus[i];
|
message.type = chaîne_octets_reçus[i];
|
||||||
message.taille_donnees=0;
|
message.taille_donnees=0;
|
||||||
|
|||||||
@ -1,3 +1,3 @@
|
|||||||
|
|
||||||
void communication_reception_message();
|
void communication_reception_message(void);
|
||||||
void communication_init();
|
void communication_init(void);
|
||||||
|
|||||||
61
main.c
61
main.c
@ -30,12 +30,20 @@ void envoie_donnees(char * donnees, uint16_t length){
|
|||||||
|
|
||||||
void envoie_structure(const void * donnees, size_t size){
|
void envoie_structure(const void * donnees, size_t size){
|
||||||
const unsigned char *byte;
|
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 )
|
for ( byte = donnees; size--; ++byte )
|
||||||
{
|
{
|
||||||
putchar(*byte);
|
putchar(*byte);
|
||||||
//printf("%2X ", *byte);
|
//printf("%2X ", *byte);
|
||||||
}
|
}
|
||||||
//printf("\n");
|
// Caractère de fin
|
||||||
|
putchar(0x00);
|
||||||
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void main(void)
|
void main(void)
|
||||||
@ -48,11 +56,10 @@ void main(void)
|
|||||||
struct message_requete_t message_requete_detection;
|
struct message_requete_t message_requete_detection;
|
||||||
unsigned char message_binaire[100];
|
unsigned char message_binaire[100];
|
||||||
|
|
||||||
message_requete_detection.type = 'd';
|
message_requete_detection.commande = 'd';
|
||||||
message_requete_detection.id_carte = 'D';
|
message_requete_detection.id_carte = 'D';
|
||||||
message_requete_detection.adresse_registre = 0;
|
message_requete_detection.adresse_registre = 0;
|
||||||
message_requete_detection.taille_donnees = 19;
|
message_requete_detection.taille_donnees = 19;
|
||||||
message_requete_detection.fin_de_message = 0;
|
|
||||||
|
|
||||||
|
|
||||||
message_binaire[0]='r';
|
message_binaire[0]='r';
|
||||||
@ -90,6 +97,8 @@ void main(void)
|
|||||||
gpio_put(PICO_DEFAULT_LED_PIN, 0);
|
gpio_put(PICO_DEFAULT_LED_PIN, 0);
|
||||||
|
|
||||||
temps_message_detection = get_absolute_time();
|
temps_message_detection = get_absolute_time();
|
||||||
|
unsigned int temps_ms;
|
||||||
|
temps_ms = get_absolute_time() / 1000.;
|
||||||
|
|
||||||
communication_init();
|
communication_init();
|
||||||
|
|
||||||
@ -106,31 +115,47 @@ void main(void)
|
|||||||
|
|
||||||
start_time_us = get_absolute_time();
|
start_time_us = get_absolute_time();
|
||||||
communication_reception_message();
|
communication_reception_message();
|
||||||
|
|
||||||
if(messagerie_message_disponible()){
|
if(messagerie_message_disponible()){
|
||||||
|
uint8_t id_carte, registre;
|
||||||
while(messagerie_message_disponible()){
|
while(messagerie_message_disponible()){
|
||||||
message = messagerie_get_message();
|
message = messagerie_get_message();
|
||||||
nb_message++;
|
nb_message++;
|
||||||
if(message.type == 'r'){
|
|
||||||
if(message.id_carte == 'D'){
|
if(message.type == 'b'){
|
||||||
temps_message_detection = get_absolute_time();
|
switch(message.donnees[0]){
|
||||||
if(message.donnees[0] > 0 && message.donnees[0] < 30){
|
case 'r': // réception de données
|
||||||
//printf(">LED ON\n");
|
// Reception de données
|
||||||
gpio_put(PICO_DEFAULT_LED_PIN, 1);
|
// données[0]: commande ('r' ici)
|
||||||
}else{
|
// données[1]: id de la carte
|
||||||
//printf(">LED OFF\n");
|
// données[2]: 1er registre
|
||||||
gpio_put(PICO_DEFAULT_LED_PIN, 0);
|
// 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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -11,11 +11,10 @@ struct message_t{
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct message_requete_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 id_carte; // Identifiant de la carte (on reprend les adresses I2C)
|
||||||
uint8_t adresse_registre; // Adresse du registre lu
|
uint8_t adresse_registre; // Adresse du registre lu
|
||||||
uint8_t taille_donnees;
|
uint8_t taille_donnees;
|
||||||
uint8_t fin_de_message;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user