Structure avec plusieurs 'banque de mémoire' et début du principe de callback
This commit is contained in:
parent
1c03a2db56
commit
9c4588958c
@ -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
|
||||
)
|
||||
@ -2,7 +2,7 @@
|
||||
#include <stdio.h>
|
||||
#include "communication.h"
|
||||
#include "messagerie.h"
|
||||
#include "tusb.h"
|
||||
//#include "tusb.h"
|
||||
|
||||
#define TAMPON_TAILLE 1020
|
||||
|
||||
|
||||
@ -1,3 +1,3 @@
|
||||
|
||||
#include "messagerie_applicative.h"
|
||||
void communication_reception_message(void);
|
||||
void communication_init(void);
|
||||
|
||||
22
messagerie.h
22
messagerie.h
@ -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
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user