2026-03-05 08:37:38 +01:00

134 lines
3.2 KiB
C++

#include <SPI.h>
#include <RH_RF95.h>
#include <M5Stack.h>
//Déclaration des constantes
#define RFM95_CS 5 //M5 LoRa
#define RFM95_DIO0 36 //M5 LoRa
RH_RF95 rf95(RFM95_CS, RFM95_DIO0);
uint8_t state;
uint8_t txbuf[RH_RF95_MAX_MESSAGE_LEN];
uint8_t rxbuf[RH_RF95_MAX_MESSAGE_LEN];
uint8_t rxlen=RH_RF95_MAX_MESSAGE_LEN;
uint8_t RxSeq;
//Constantes d'états
#define E0 0
#define E1 1
#define E2 2
#define E3 3
//Constante de type
#define TYPE_DATA 1
#define TYPE_ACK 2
//Constate d'adresse
#define LOCAL_ADDR 0
//Constantes d'infos champ de trame
#define F_S_ADDR 0 //Adresse source
#define F_D_ADDR 1 //Adresse destination
#define F_TYPE 2 //Type
#define F_NUM_SEQ 3 //Numéro de séquence
#define F_MIN_PAYLOAD 4 //Indice du debut de payload
#define F_MAX_PAYLOAD 5 //Indice de fin de payload
#define TAILLE_ACK 4 //Taille de la trame
void setup() {
M5.begin();
M5.Power.begin();
Serial.println("====Recepteur CAP4====");
M5.Lcd.println("====Recepteur CAP4====");
delay(3000);
if(!rf95.init()){
Serial.println("Echec de la mise en place");
M5.Lcd.println("Echec de la mise en place");
}
else{
Serial.println("Mise en place reussie !!!");
M5.Lcd.println("Mise en place reussie !!!");
rf95.setModemConfig(RH_RF95::Bw125Cr45Sf128);
rf95.setFrequency(867.8);
state=E0;
//Serial.println("Boucle principale");
//M5.Lcd.println("Boucle principale");
RxSeq=255;
delay(1000);
}
}
void loop() {
switch(state){
case E0:
//Serial.println("Mode Reception");
//M5.Lcd.println("Mode Reception");
rf95.setModeRx();
state=E1;
break;
case E1:
if(rf95.recv(rxbuf, &rxlen)){
if((rxbuf[F_TYPE]==TYPE_DATA) && (rxbuf[F_D_ADDR]==LOCAL_ADDR)){
//Réception d'un ACK et pour le récepteur
state=E2;
}
else{
state=E0;
}
}
break;
case E2:
if(RxSeq!=rxbuf[F_NUM_SEQ]){
M5.Lcd.printf("===Message Recu===\n");
M5.Lcd.printf("Recu de [%02X]\n",rxbuf[F_S_ADDR]);
RxSeq=rxbuf[F_NUM_SEQ];
Serial.printf("[%d] ", RxSeq);
M5.Lcd.printf("[%d] ", RxSeq);
Serial.printf("DATA de %d octets :", rxlen);
M5.Lcd.printf("DATA de %d octets :", rxlen);
Serial.println();
M5.Lcd.println();
for(int i=0;i<rxlen;i++){
Serial.printf("%02x|", rxbuf[i]);
M5.Lcd.printf("%02x|", rxbuf[i]);
}
Serial.println();
M5.Lcd.println();
}
else{
Serial.printf("===Duplication===\n");
M5.Lcd.printf("===Duplication===\n");
}
state=E3;
break;
case E3:
Serial.println("===Envoi ACK===");
M5.Lcd.println("===Envoi ACK===");
txbuf[F_S_ADDR]=LOCAL_ADDR; //Adresse du sink
txbuf[F_D_ADDR]=rxbuf[F_S_ADDR]; //Émission du ACK vers source DATA
txbuf[F_TYPE]=TYPE_ACK;
txbuf[F_NUM_SEQ]=rxbuf[F_NUM_SEQ];
rf95.send(txbuf,TAILLE_ACK);
rf95.waitPacketSent();
state=E0;
break;
default:
break;
}
}