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": [],
|
||||
"group": {
|
||||
"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
|
||||
|
||||
/// 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<index_chaine_recue; i++){
|
||||
int index_fin_message = 0;
|
||||
if(chaîne_octets_reçus[i] == 'r' || chaîne_octets_reçus[i] == 'w'){
|
||||
if(i+3 < index_chaine_recue){
|
||||
message.taille_donnees = chaîne_octets_reçus[i+3];
|
||||
}
|
||||
|
||||
index_fin_message = i+4 + message.taille_donnees;
|
||||
if(index_fin_message < index_chaine_recue){
|
||||
if(chaîne_octets_reçus[index_fin_message] == 0){
|
||||
message.type = chaîne_octets_reçus[i];
|
||||
message.id_carte = chaîne_octets_reçus[i+1];
|
||||
message.adresse_registre = chaîne_octets_reçus[i+2];
|
||||
message.taille_donnees = chaîne_octets_reçus[i+3];
|
||||
for(int index_donnees=0; index_donnees<message.taille_donnees; index_donnees++){
|
||||
message.donnees[index_donnees] = chaîne_octets_reçus[i + 4 + index_donnees];
|
||||
// Com v2
|
||||
// OxFF OxFF <taille> ... ... <fin (0x00)>
|
||||
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;
|
||||
|
||||
@ -1,3 +1,3 @@
|
||||
|
||||
void communication_reception_message();
|
||||
void communication_init();
|
||||
void communication_reception_message(void);
|
||||
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){
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user