diff --git a/CMakeLists.txt b/CMakeLists.txt index 7dac81b..1ede92c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,13 @@ project(Mod_Communication C) +pico_sdk_init() + add_library(Mod_Communication - Communication.c + communication.c messagerie_applicative.c + messagerie.c ) +target_link_libraries(Mod_Communication + pico_stdlib +) \ No newline at end of file diff --git a/communication.c b/communication.c index ab79b67..74359ab 100644 --- a/communication.c +++ b/communication.c @@ -2,7 +2,7 @@ #include #include "communication.h" #include "messagerie.h" -#include "tusb.h" +//#include "tusb.h" #define TAMPON_TAILLE 1020 diff --git a/communication.h b/communication.h index a074357..9275aa9 100644 --- a/communication.h +++ b/communication.h @@ -1,3 +1,3 @@ - +#include "messagerie_applicative.h" void communication_reception_message(void); void communication_init(void); diff --git a/messagerie.h b/messagerie.h index 9554886..6d916cc 100644 --- a/messagerie.h +++ b/messagerie.h @@ -1,5 +1,8 @@ +#ifndef MESSAGERIE_H +#define MESSAGERIE_H #include "pico/stdlib.h" -#include "messages_propulsion.h" +#include + #define MESSAGE_TIMEOUT_US 2000 @@ -16,21 +19,8 @@ struct message_requete_t{ uint8_t taille_donnees; }; -struct message_applicatif_t{ - uint8_t commande; // 'r' : réception de données, 'd' : demande de données - uint8_t id_carte; // Identifiant de la carte (on reprend les adresses I2C) - uint8_t adresse_registre; // Adresse du registre lu ou écrit - uint8_t taille_donnees; - union{ - uint8_t donnees[0xFF]; -#ifdef MESSAGE_PROPULSION_H - struct msg_propulsion_position_t msg_propulsion_position; -#endif - - }donnees_applicative; - -}; - bool messagerie_message_disponible(); struct message_t messagerie_get_message(); void messagerie_put_message(struct message_t message); + +#endif diff --git a/messagerie_applicative.c b/messagerie_applicative.c index 7290b4a..835fdfe 100644 --- a/messagerie_applicative.c +++ b/messagerie_applicative.c @@ -1,9 +1,18 @@ #include #include "messagerie_applicative.h" - +#include #define TAILLE_MEMOIRE_ECHANGE 0xFF +#define NB_BANK 10 -uint8_t memoire_echange[TAILLE_MEMOIRE_ECHANGE]; +//uint8_t mémoire_échange[NB_BANK][TAILLE_MEMOIRE_ECHANGE]; + +/// @brief Meta-données de la mémoire +/// modifications: un bit par octet pour indiquer si la donnée a été modifiée. +struct bank_mémoire_t{ + uint8_t mémoire_id; + uint8_t mémoire_échange[TAILLE_MEMOIRE_ECHANGE]; + uint32_t modifications[4]; +} list_memoire_echange[NB_BANK]; @@ -16,56 +25,102 @@ bool mise_a_jour_trajectoire = false; bool mise_a_jour_config_trajet = false; bool mise_a_jour_cde_inv_traj = false; -void get_données_reçues(uint8_t * dst, unsigned int taille, unsigned int registre){ - memcpy(dst, &(memoire_echange[registre]), taille); -} - -void mise_données_dans_échange(uint8_t * source, unsigned int taille, unsigned int registre){ - memcpy(&(memoire_echange[registre]), source, taille); -} - -void écriture_données(unsigned int adresse, uint8_t donnée){ - if( adresse < 11){ // 0x0B - // Position du robot - mise_a_jour_position = true; - }else if(adresse <= 12){ // 0x0C - // Read only - - }else if(adresse <= 13){ // 0x0D - // Mode - mise_a_jour_mode = true; - }else if(adresse <= 17){ // 0x11 - // PWM moteur - mise_a_jour_pwm = true; - }else if(adresse <= 25){ // 0x19 - // Vitesse roues - mise_a_jour_vitesse_roues = true; - }else if(adresse <= 33){ // 0x21 - // Vitesse robot - mise_a_jour_vitesse_robot = true; - }else if(adresse <= 0x59){ // - // Trajectoire - mise_a_jour_trajectoire = true; - - }else if(adresse <= 0x61){ - // Trajet config - mise_a_jour_config_trajet = true; - - /* - }else if(adresse <= 0x62){ - // Trajet config - mise_a_jour_cde_inv_traj = true; - */ - }else { - // Hors mémoire - return; +void message_applicatif_init(){ + for(uint8_t i=0; i= 0){ - memoire_echange[adresse] = donnée; - } - - +} +struct bank_mémoire_t * assigner_bank_mémoire(uint8_t bank_id){ + for(uint8_t i=0; imodifications[registre / 32] & (1 << (registre % 32))){ + return &(bank_memoire->mémoire_échange[registre]); + } + return false; +} + +void set_mémoire_modifiée(struct bank_mémoire_t * bank_memoire, uint8_t registre){ + bank_memoire->modifications[registre / 32] |= 1 << registre % 32; +} + +void reset_mémoire_modifiée(struct bank_mémoire_t * bank_memoire, uint8_t registre){ + for(int i=0; i< 4; i++){ + bank_memoire->modifications[1] = 0; + } +} + +uint8_t * get_memoire_echange(uint8_t bank_id){ + for (uint8_t i = 0; i< NB_BANK ; i++){ + if(list_memoire_echange[i].mémoire_id == bank_id){ + return list_memoire_echange[i].mémoire_échange; + } + } + return NULL; +} + +void get_données_reçues(uint8_t * dst, uint8_t taille, uint8_t registre, uint8_t bank_id){ + uint8_t * ma_memoire_echange = get_memoire_echange(bank_id); + memcpy(dst, &(ma_memoire_echange[registre]), taille); +} + +void mise_données_dans_échange(uint8_t * source, uint8_t taille, uint8_t registre, uint8_t bank_id){ + uint8_t * ma_memoire_echange = get_memoire_echange(bank_id); + memcpy(&(ma_memoire_echange[registre]), source, taille); +} + +/// @brief Copie le message dans la mémoire d'échange +/// @param message_applicatif message reçu +void réception_données(struct message_applicatif_t message_applicatif){ + struct bank_mémoire_t * bank_memoire = get_bank_mémoire(message_applicatif.id_carte); + if(bank_memoire == NULL){ + bank_memoire = assigner_bank_mémoire(message_applicatif.id_carte); + } + + uint8_t * ma_memoire_echange = bank_memoire->mémoire_échange; + + for (int num_octet=0; num_octet #include +#include "messagerie.h" +struct message_applicatif_t{ + uint8_t commande; // 'r' : réception de données, 'd' : demande de données + uint8_t id_carte; // Identifiant de la carte (on reprend les adresses I2C) + uint8_t adresse_registre; // Adresse du registre lu ou écrit + uint8_t taille_donnees; + union{ + uint8_t donnees[0xFF]; +#ifdef MESSAGE_PROPULSION_H + struct msg_propulsion_position_t msg_propulsion_position; +#endif + + }donnees_applicative; + +}; + +void réception_données(struct message_applicatif_t message_applicatif); void écriture_données(unsigned int adresse, uint8_t donnée); -void get_données_reçues(uint8_t * dst, unsigned int taille, unsigned int registre); -void mise_données_dans_échange(uint8_t * source, unsigned int taille, unsigned int registre); +void get_données_reçues(uint8_t * dst, uint8_t taille, uint8_t registre, uint8_t bank_id); +void mise_données_dans_échange(uint8_t * source, uint8_t taille, uint8_t registre, uint8_t bank_id); +uint8_t * get_mémoire_modifiée(uint8_t bank_id, uint8_t registre); +void messagerie_applicative_callback(uint8_t id_carte, uint8_t registre, void (*callback) (uint8_t *)); +void message_applicatif_init(); -extern uint8_t memoire_echange[]; extern bool mise_a_jour_position; extern bool mise_a_jour_mode;