diff --git a/lib/Transmitter/ITransmitter.h b/lib/Transmitter/ITransmitter.h index 30191b9..ac24ad0 100644 --- a/lib/Transmitter/ITransmitter.h +++ b/lib/Transmitter/ITransmitter.h @@ -2,10 +2,17 @@ #include #include +enum class TransmitError : int16_t { + OK = 0, + INIT_FAILED = -1, + JOIN_FAILED = -2, + SEND_FAILED = -3, +}; + class ITransmitter { public: virtual ~ITransmitter() = default; - virtual void init() = 0; - virtual void join() = 0; - virtual void send(uint8_t* payload, size_t size) = 0; + virtual TransmitError init() = 0; + virtual TransmitError join() = 0; + virtual TransmitError send(uint8_t* payload, size_t size) = 0; }; \ No newline at end of file diff --git a/lib/Transmitter/LoRaTransmitter.cpp b/lib/Transmitter/LoRaTransmitter.cpp index aeb4454..bf1870d 100644 --- a/lib/Transmitter/LoRaTransmitter.cpp +++ b/lib/Transmitter/LoRaTransmitter.cpp @@ -18,7 +18,7 @@ LoRaTransmitter::LoRaTransmitter( memset(_noncesBuffer, 0, RADIOLIB_LORAWAN_NONCES_BUF_SIZE); } -void LoRaTransmitter::init() +TransmitError LoRaTransmitter::init() { _reset(); SPI.begin(LORA_SCK, LORA_MISO, LORA_MOSI, LORA_NSS); @@ -28,15 +28,13 @@ void LoRaTransmitter::init() if (state != RADIOLIB_ERR_NONE) { Serial.printf("ERREUR %d\n", state); - while (true) - { - delay(1000); - } + return TransmitError::INIT_FAILED; } Serial.println("OK"); + return TransmitError::OK; } -void LoRaTransmitter::join() +TransmitError LoRaTransmitter::join() { int16_t state = RADIOLIB_ERR_NETWORK_NOT_JOINED; @@ -50,29 +48,31 @@ void LoRaTransmitter::join() if (state != RADIOLIB_LORAWAN_NEW_SESSION) { Serial.printf("Echec : %d\n", state); - while (true) - { - delay(1000); - } + return TransmitError::JOIN_FAILED; } } Serial.println("OK"); _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); if (state == RADIOLIB_ERR_NONE || state == RADIOLIB_LORAWAN_NO_DOWNLINK) { Serial.println("[TX] OK"); + _saveSession(); + return TransmitError::OK; } else { Serial.printf("[TX] Erreur : %d\n", state); + _saveSession(); + return TransmitError::SEND_FAILED; } - _saveSession(); + } void LoRaTransmitter::_reset() diff --git a/lib/Transmitter/LoRaTransmitter.h b/lib/Transmitter/LoRaTransmitter.h index a152c53..0dbd777 100644 --- a/lib/Transmitter/LoRaTransmitter.h +++ b/lib/Transmitter/LoRaTransmitter.h @@ -22,9 +22,9 @@ public: uint8_t* appKey ); - void init() override; - void join() override; - void send(uint8_t* payload, size_t size) override; + TransmitError init() override; + TransmitError join() override; + TransmitError send(uint8_t* payload, size_t size) override; private: uint64_t _joinEUI; diff --git a/src/config.h b/src/config.h index 7161b59..79a3bc1 100644 --- a/src/config.h +++ b/src/config.h @@ -1,5 +1,7 @@ #pragma once +#define MAX_RESTART 3 + uint64_t joinEUI = 0x35f48318e1324e2e; uint64_t devEUI = 0x0586fe41112d83d9; uint8_t appKey[] = { diff --git a/src/main.cpp b/src/main.cpp index 31df6ee..48125c3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2,6 +2,8 @@ #include "LoRaTransmitter.h" #include "config.h" +RTC_DATA_ATTR uint8_t restartCount = 0; + ITransmitter* transmitter = new LoRaTransmitter( joinEUI, devEUI, @@ -9,12 +11,34 @@ ITransmitter* transmitter = new LoRaTransmitter( 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() { Serial.begin(115200); delay(2000); - transmitter->init(); - transmitter->join(); + if (transmitter->init() != TransmitError::OK){ + 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() {