//#include #include "HarakiriRelay.h" #include "BoardCfg.h" #include "timer.h" #include "LoraWatchdog.h" #include "SIM7080GInterface.h" int mLoraSMState; void InitLoraWatchdog() { mLoraSMState = LORA_WATCHDOG_OK_STATE; TimerStart(LORA_WATCHDOG_TIMER,LORA_WATCHDOG_MODULE_RESET_TIMEOUT); } void TickLoraWatchdog() { LoraWatchdogStateMachine(LORA_SM_TICK_EVENT); } void LoraWatchdogStateMachine(int Event) { switch(mLoraSMState) { case LORA_WATCHDOG_OK_STATE: { switch(Event) { case LORA_SM_TICK_EVENT: { if(IsTimerExpired(LORA_WATCHDOG_TIMER)) { //We lost the comm... reset the LoRa module LORA_MODULE_RELAY_PIN = 1; //Turn OFF the LoRa module TimerStart(LORA_WATCHDOG_TIMER,LORA_WATCHDOG_MODULE_OFF_TIMEOUT); mLoraSMState = LORA_WATCHDOG_RESET_LORA_MODULE_STATE; } break; } case LORA_SM_KICK_EVENT: { //All is well... TimerStart(LORA_WATCHDOG_TIMER,LORA_WATCHDOG_MODULE_RESET_TIMEOUT); break; } } break; } case LORA_WATCHDOG_RESET_LORA_MODULE_STATE: { switch(Event) { case LORA_SM_TICK_EVENT: case LORA_SM_KICK_EVENT://That would be very weird since the LoRa module is OFF!!! { if(IsTimerExpired(LORA_WATCHDOG_TIMER)) { //Reset is done, turn module back ON. LORA_MODULE_RELAY_PIN = 0; //Turn ON the LoRa module TimerStart(LORA_WATCHDOG_TIMER,LORA_WATCHDOG_REBOOT_TIMEOUT); //If we don't get Comm. back after this delay... reboot the PIC mLoraSMState = LORA_WATCHDOG_WAIT_FOR_RECONNECT_STATE; LTEModuleReset(); } break; } } break; } case LORA_WATCHDOG_WAIT_FOR_RECONNECT_STATE: { switch(Event) { case LORA_SM_TICK_EVENT: { if(IsTimerExpired(LORA_WATCHDOG_TIMER)) { TurnOFFWiFi(); Sleep(100); SoftReset(); } break; } case LORA_SM_KICK_EVENT: { //Communication is re-established. TimerStart(LORA_WATCHDOG_TIMER,LORA_WATCHDOG_MODULE_RESET_TIMEOUT); mLoraSMState = LORA_WATCHDOG_OK_STATE; break; } } break; } } } void KickLoraWatchdog() { LoraWatchdogStateMachine(LORA_SM_KICK_EVENT); }