feat: improve error management to avoid infinite loop

The device goes in deep sleep after 3 restarts when connection is not
successful
This commit is contained in:
Alexis Fourmaux 2026-05-06 17:51:04 +02:00
parent 244d1eea21
commit 61b0b740d2
5 changed files with 53 additions and 20 deletions

View file

@ -2,10 +2,17 @@
#include <stdint.h> #include <stdint.h>
#include <stddef.h> #include <stddef.h>
enum class TransmitError : int16_t {
OK = 0,
INIT_FAILED = -1,
JOIN_FAILED = -2,
SEND_FAILED = -3,
};
class ITransmitter { class ITransmitter {
public: public:
virtual ~ITransmitter() = default; virtual ~ITransmitter() = default;
virtual void init() = 0; virtual TransmitError init() = 0;
virtual void join() = 0; virtual TransmitError join() = 0;
virtual void send(uint8_t* payload, size_t size) = 0; virtual TransmitError send(uint8_t* payload, size_t size) = 0;
}; };

View file

@ -18,7 +18,7 @@ LoRaTransmitter::LoRaTransmitter(
memset(_noncesBuffer, 0, RADIOLIB_LORAWAN_NONCES_BUF_SIZE); memset(_noncesBuffer, 0, RADIOLIB_LORAWAN_NONCES_BUF_SIZE);
} }
void LoRaTransmitter::init() TransmitError LoRaTransmitter::init()
{ {
_reset(); _reset();
SPI.begin(LORA_SCK, LORA_MISO, LORA_MOSI, LORA_NSS); SPI.begin(LORA_SCK, LORA_MISO, LORA_MOSI, LORA_NSS);
@ -28,15 +28,13 @@ void LoRaTransmitter::init()
if (state != RADIOLIB_ERR_NONE) if (state != RADIOLIB_ERR_NONE)
{ {
Serial.printf("ERREUR %d\n", state); Serial.printf("ERREUR %d\n", state);
while (true) return TransmitError::INIT_FAILED;
{
delay(1000);
}
} }
Serial.println("OK"); Serial.println("OK");
return TransmitError::OK;
} }
void LoRaTransmitter::join() TransmitError LoRaTransmitter::join()
{ {
int16_t state = RADIOLIB_ERR_NETWORK_NOT_JOINED; int16_t state = RADIOLIB_ERR_NETWORK_NOT_JOINED;
@ -50,29 +48,31 @@ void LoRaTransmitter::join()
if (state != RADIOLIB_LORAWAN_NEW_SESSION) if (state != RADIOLIB_LORAWAN_NEW_SESSION)
{ {
Serial.printf("Echec : %d\n", state); Serial.printf("Echec : %d\n", state);
while (true) return TransmitError::JOIN_FAILED;
{
delay(1000);
}
} }
} }
Serial.println("OK"); Serial.println("OK");
_saveSession(); _saveSession();
return TransmitError::OK;
} }
void LoRaTransmitter::send(uint8_t payload[], size_t size) TransmitError LoRaTransmitter::send(uint8_t payload[], size_t size)
{ {
int state = _node.sendReceive(payload, size, 1); int state = _node.sendReceive(payload, size, 1);
if (state == RADIOLIB_ERR_NONE || state == RADIOLIB_LORAWAN_NO_DOWNLINK) if (state == RADIOLIB_ERR_NONE || state == RADIOLIB_LORAWAN_NO_DOWNLINK)
{ {
Serial.println("[TX] OK"); Serial.println("[TX] OK");
_saveSession();
return TransmitError::OK;
} }
else else
{ {
Serial.printf("[TX] Erreur : %d\n", state); Serial.printf("[TX] Erreur : %d\n", state);
_saveSession();
return TransmitError::SEND_FAILED;
} }
_saveSession();
} }
void LoRaTransmitter::_reset() void LoRaTransmitter::_reset()

View file

@ -22,9 +22,9 @@ public:
uint8_t* appKey uint8_t* appKey
); );
void init() override; TransmitError init() override;
void join() override; TransmitError join() override;
void send(uint8_t* payload, size_t size) override; TransmitError send(uint8_t* payload, size_t size) override;
private: private:
uint64_t _joinEUI; uint64_t _joinEUI;

View file

@ -1,5 +1,7 @@
#pragma once #pragma once
#define MAX_RESTART 3
uint64_t joinEUI = 0x35f48318e1324e2e; uint64_t joinEUI = 0x35f48318e1324e2e;
uint64_t devEUI = 0x0586fe41112d83d9; uint64_t devEUI = 0x0586fe41112d83d9;
uint8_t appKey[] = { uint8_t appKey[] = {

View file

@ -2,6 +2,8 @@
#include "LoRaTransmitter.h" #include "LoRaTransmitter.h"
#include "config.h" #include "config.h"
RTC_DATA_ATTR uint8_t restartCount = 0;
ITransmitter* transmitter = new LoRaTransmitter( ITransmitter* transmitter = new LoRaTransmitter(
joinEUI, joinEUI,
devEUI, devEUI,
@ -9,12 +11,34 @@ ITransmitter* transmitter = new LoRaTransmitter(
appKey appKey
); );
void fatalError(const char* msg){
Serial.printf("[FATAL] %s\n", msg);
Serial.flush();
delay(100);
if (restartCount < MAX_RESTART) {
restartCount++;
Serial.printf("[FATAL] Redémarrage %d/3\n", restartCount);
Serial.flush();
ESP.restart();
}
Serial.printf("[FATAL] %d redémarrages : l'appareil entre en sommeil profond permanent\n", MAX_RESTART);
Serial.flush();
esp_deep_sleep_start();
}
void setup() { void setup() {
Serial.begin(115200); Serial.begin(115200);
delay(2000); delay(2000);
transmitter->init(); if (transmitter->init() != TransmitError::OK){
transmitter->join(); fatalError("Initialisation du périphérique radio échouée");
}
if (transmitter->join() != TransmitError::OK){
fatalError("Connexion au concentrateur LoRaWAN échouée");
}
restartCount = 0;
} }
void loop() { void loop() {