Structure avec plusieurs 'banque de mémoire' et début du principe de callback

This commit is contained in:
Samuel 2026-07-17 19:44:42 +02:00
parent 1c03a2db56
commit 9c4588958c
6 changed files with 143 additions and 73 deletions

View File

@ -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
)

View File

@ -2,7 +2,7 @@
#include <stdio.h>
#include "communication.h"
#include "messagerie.h"
#include "tusb.h"
//#include "tusb.h"
#define TAMPON_TAILLE 1020

View File

@ -1,3 +1,3 @@
#include "messagerie_applicative.h"
void communication_reception_message(void);
void communication_init(void);

View File

@ -1,5 +1,8 @@
#ifndef MESSAGERIE_H
#define MESSAGERIE_H
#include "pico/stdlib.h"
#include "messages_propulsion.h"
#include <string.h>
#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

View File

@ -1,9 +1,18 @@
#include <string.h>
#include "messagerie_applicative.h"
#include <stdio.h>
#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<NB_BANK; i++){
list_memoire_echange[i].mémoire_id = 0;
}
// On contrôle qu'on est bien dans la mémoire
if(adresse < TAILLE_MEMOIRE_ECHANGE && adresse >= 0){
memoire_echange[adresse] = donnée;
}
}
struct bank_mémoire_t * assigner_bank_mémoire(uint8_t bank_id){
for(uint8_t i=0; i<NB_BANK; i++){
if(list_memoire_echange[i].mémoire_id == 0){
list_memoire_echange[i].mémoire_id = bank_id;
return &(list_memoire_echange[i]);
}
}
}
struct bank_mémoire_t * get_bank_mémoire(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]);
}
}
return NULL;
}
uint8_t * get_mémoire_modifiée(uint8_t bank_id, uint8_t registre){
struct bank_mémoire_t * bank_memoire;
bank_memoire = get_bank_mémoire(bank_id);
if(bank_memoire == NULL){
return false;
}
if(bank_memoire->modifications[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<message_applicatif.taille_donnees; num_octet++){
uint32_t adresse = num_octet + message_applicatif.adresse_registre;
if(bank_memoire != NULL){
if(adresse < TAILLE_MEMOIRE_ECHANGE){
ma_memoire_echange[adresse] = message_applicatif.donnees_applicative.donnees[num_octet];
set_mémoire_modifiée(bank_memoire, adresse);
}
}
}
}
/// @brief Appelle la fonction callback si la mémoire d'échange au registre en question a été modifiée.
/// Dans ce cas l'adresse du registre est envoyée à la fonction callback
/// @param id_carte Adresse de la bank / carte_id
/// @param registre Registre écrit
/// @param callback Fonction à appeler.
void messagerie_applicative_callback(uint8_t id_carte, uint8_t registre, void (*callback) (uint8_t *)){
uint8_t * mémoire = get_mémoire_modifiée(id_carte, registre);
if(mémoire){
(*callback)(mémoire);
}
}

View File

@ -1,11 +1,30 @@
#include <stdint.h>
#include <stdbool.h>
#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;