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:
parent
244d1eea21
commit
61b0b740d2
5 changed files with 53 additions and 20 deletions
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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[] = {
|
||||||
|
|
|
||||||
28
src/main.cpp
28
src/main.cpp
|
|
@ -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() {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue