|
- #include "LTENetworkInterface.h"
- #include "NetworkProtocol.h"
- #include "SIM7080GInterface.h"
- #include "timer.h"
- #include "ChaletPowerRelay.h"
- #include "HarakiriRelay.h"
- #include "BatteryMonitor.h"
- #include "LedLightCtrl.h"
- #include "TemperatureSensor.h"
- #include "SPI_Flash.h"
- #include "FlashMapping.h"
- #include "LoraWatchdog.h"
- #include "versionbuild.h"
- #include "WiFiCtrl.h"
- #include "BoardCfg.h"
-
- int mLTENWISMState;
- static const char mFirmwareVersion[15] = VERSIONNUMBER;
- #define LORA_CHALET_STATUS_CUR_SENSOR_MASK 0x02
- #define LORA_CHALET_STATUS_POWER_RELAY_MASK 0x01
-
- unsigned int mLTETotalMasterNbRequests = 0;
-
- void LTENetworkInterfaceInit()
- {
- ProtocolInit(NETWORK_PROTOCOL_USER_LTE);
-
- mLTENWISMState = LTE_NWI_INIT_STATE;
- }
-
- void ExecuteLTEMasterCommand(int SenderID, int Command, unsigned char *Data, int DataSize)
- {
- KickLoraWatchdog();
- // ChaletPowerRelayKickTimer();
- mLTETotalMasterNbRequests++;
- // LTE_MODULE_RX_LED_PIN = LED_OFF;
- switch(SenderID)
- {
- case ID_MASTER:
- {
- switch(Command)
- {
- case CHALET_INTERFACE_ACK:
- {
- break;
- }
- case CHALET_GENERAL_STATUS_REQUEST:
- {
- // float FloatVoltage = GetBatteryVoltage(1);
- //// float FloatTemperature = TempSensorGetTemp();
- // unsigned int BattVoltage = *((int*)&FloatVoltage);
- // unsigned int Temperature = *((int*)&FloatTemperature);
- // int SolarPanelCurrent = GetSolarPanelCurrent();
- // int SOC = GetBatterySOC();
- //
- // char GeneralStatus = 0;
- // char ChaletStatus[18];
- //
- // if(GetChaletPowerRelayState() == CHALET_POWER_RELAY_ON_STATE)
- // {
- // GeneralStatus |= LORA_CHALET_STATUS_POWER_RELAY_MASK;
- // }
- // if(GetCurrentModuleOK() == true)
- // {
- // GeneralStatus |= LORA_CHALET_STATUS_CUR_SENSOR_MASK;
- // }
- //
- // ChaletStatus[0] = GeneralStatus; //General Status
- // ChaletStatus[1] = GetWiFiSate(); //Wifi Module state
- //
- // ChaletStatus[2] = (char)(BattVoltage & 0x000000FF); //Battery Voltage 1
- // BattVoltage >>= 8;
- // ChaletStatus[3] = (char)(BattVoltage & 0x000000FF); //Battery Voltage 2
- // BattVoltage >>= 8;
- // ChaletStatus[4] = (char)(BattVoltage & 0x000000FF); //Battery Voltage 3
- // BattVoltage >>= 8;
- // ChaletStatus[5] = (char)(BattVoltage & 0x000000FF); //Battery Voltage 4
- //
- // ChaletStatus[6] = (char)(SolarPanelCurrent & 0x000000FF); //Solar panel Current 1
- // SolarPanelCurrent >>= 8;
- // ChaletStatus[7] = (char)(SolarPanelCurrent & 0x000000FF); //Solar panel Current 2
- //
- // ChaletStatus[8] = (char)(SOC & 0x000000FF); //Battery SOC 1
- // SolarPanelCurrent >>= 8;
- // ChaletStatus[9] = (char)(SolarPanelCurrent & 0x000000FF); //Battery SOC 2
- //
- // ChaletStatus[10] = (char)(Temperature & 0x000000FF); //Temperature 1
- // Temperature >>= 8;
- // ChaletStatus[11] = (char)(Temperature & 0x000000FF); //Temperature 2
- // Temperature >>= 8;
- // ChaletStatus[12] = (char)(Temperature & 0x000000FF); //BTemperature 3
- // Temperature >>= 8;
- // ChaletStatus[13] = (char)(Temperature & 0x000000FF); //Temperature 4
- //
- // int tmp = mLTETotalMasterNbRequests;
- // ChaletStatus[14] = (char)(mLTETotalMasterNbRequests & 0x000000FF); //Total Nb Requests 1
- // mLTETotalMasterNbRequests >>= 8;
- // ChaletStatus[15] = (char)(mLTETotalMasterNbRequests & 0x000000FF); //Total Nb Requests 2
- // mLTETotalMasterNbRequests >>= 8;
- // ChaletStatus[16] = (char)(mLTETotalMasterNbRequests & 0x000000FF); //Total Nb Requests 3
- // mLTETotalMasterNbRequests >>= 8;
- // ChaletStatus[17] = (char)(mLTETotalMasterNbRequests & 0x000000FF); //Total Nb Requests 4
- // mLTETotalMasterNbRequests = tmp;
- //
- //
- // SendLTENetworkCommand(CHALET_GENERAL_STATUS_RESPONSE,ChaletStatus,18);
- //
- // HEARTBEAT_LED_1_PIN = ~HEARTBEAT_LED_1_PIN;
-
- break;
- }
- case CHALET_AC_POWER_STATE_STATUS_REQUEST:
- {
- // char PowerStatus = GetChaletPowerRelayState();
- // SendLTENetworkCommand(CHALET_AC_POWER_STATE_STATUS_RESPONSE,&PowerStatus,1);
- break;
- }
- case CHALET_AC_POWER_SET_STATE_REQUEST:
- {
- // char response = CHALET_POWER_RELAY_UNKNOWN_STATE;
- // if(Data[0] == CHALET_POWER_RELAY_OFF_STATE)
- // {
- // ChaletPowerRelayTurnOff();
- // response = CHALET_POWER_RELAY_OFF_STATE;
- // }
- // else if(Data[0] == CHALET_POWER_RELAY_ON_STATE)
- // {
- // ChaletPowerRelayTurnOn();
- // response = CHALET_POWER_RELAY_ON_STATE;
- // }
- // else
- // {
- // //invalid state requested.... don't do anything
- // response = CHALET_POWER_RELAY_UNKNOWN_STATE;
- // }
- //
- // SendLTENetworkCommand(CHALET_AC_POWER_SET_STATE_RESPONSE,&response,1);
- //
- break;
- }
- case CHALET_BATTERY_VOLTAGE_REQUEST:
- {
-
- break;
- }
- case CHALET_WIFI_STATUS_REQUEST:
- {
- char response[5];
- uint32 IPAddress = GetCurIPAddress();
-
- response[0] = GetWiFiSate(); //Wifi Module state
- response[1] = IPV4_BYTE(IPAddress,0);
- response[2] = IPV4_BYTE(IPAddress,1);
- response[3] = IPV4_BYTE(IPAddress,2);
- response[4] = IPV4_BYTE(IPAddress,3);
- SendLTENetworkCommand(CHALET_WIFI_STATUS_RESPONSE,(unsigned char*)&response,5);
- break;
- }
- case CHALET_WIFI_SET_STATE_REQUEST:
- {
- char response = WIFI_UNKNOWN_STATE;
- if(Data[0] == 0)
- {
- TurnOFFWiFi();
- response = 0;
- }
- else if(Data[0] == 1)
- {
- if(GetWiFiSate() != WIFI_CONNECTED_STATE)
- {
- InitWiFi();
- response = GetWiFiSate();
- }
- else
- {
- response = 1;
- }
- }
- else
- {
- //invalid state requested.... don't do anything
- response = WIFI_UNKNOWN_STATE;
- }
-
- SendLTENetworkCommand(CHALET_WIFI_SET_STATE_RESPONSE,&response,1);
- break;
- }
- case CHALET_DO_HARAKIRI_REQUEST:
- {
- // char response;
- // if(Data[0] == 0xBA &&
- // Data[1] == 0xAD &&
- // Data[2] == 0xBE &&
- // Data[3] == 0xEF)
- // {
- // //Magic word is OK... let's suicide...
- // response = 0x01;
- // //First, send an ACK to master (this is blocking so it's OK)
- // SendLTENetworkCommand(CHALET_DO_HARAKIRI_CONFIRMATION,&response,1);
- // HarakiriRelayTurnOff();
- // }
- // else
- // {
- // response = 0x00;
- // SendLTENetworkCommand(CHALET_DO_HARAKIRI_CONFIRMATION,&response,1);
- // }
- break;
- }
- case CHALET_REBOOT_CPU_REQUEST:
- {
- char response;
- if(Data[0] == 0xBA &&
- Data[1] == 0xAD &&
- Data[2] == 0xCA &&
- Data[3] == 0xFE)
- {
- //Magic word is OK... let's reboot...
- response = 0x01;
- //First, send an ACK to master (this is blocking so it's OK)
- SendLTENetworkCommand(CHALET_REBOOT_CPU_RESPONSE,&response,1);
- Sleep(100);
- TurnOFFWiFi();
- Sleep(100);
- SoftReset();
- }
- else
- {
- response = 0x00;
- SendLTENetworkCommand(CHALET_DO_HARAKIRI_CONFIRMATION,&response,1);
- }
- break;
- }
- case CHALET_GET_STORED_WIFI_SETTINGS_REQUEST:
- {
- char response[140];
- char WifiDataSize;
- SPIFlashReadBuffer(response,11,FLASH_WIFI_IP_ADDRESS);
- WifiDataSize = 11 + response[9] + response[10];
- if(WifiDataSize > 140)
- break;
- SPIFlashReadBuffer(response,WifiDataSize,FLASH_WIFI_IP_ADDRESS);
- SendLTENetworkCommand(CHALET_GET_STORED_WIFI_SETTINGS_RESPONSE,response,WifiDataSize);
- break;
- }
- case CHALET_SET_STORED_WIFI_SETTINGS_REQUEST:
- {
- char response = 0;
- if(SPIFlashWriteBuffer(Data,DataSize,FLASH_WIFI_IP_ADDRESS) == 1)
- {
- response = 1;
- }
-
- SendLTENetworkCommand(CHALET_SET_STORED_WIFI_SETTINGS_RESPONSE,&response,1);
- break;
- }
- case CHALET_GET_FIRMWARE_VERSION_REQUEST:
- {
- SendLTENetworkCommand(CHALET_GET_FIRMWARE_VERSION_RESPONSE,(unsigned char*)mFirmwareVersion,15);
- break;
- }
- case CHALET_CLEAR_COMMS_STATISTICS_REQUEST:
- {
- char response = 1;
- mLTETotalMasterNbRequests = 0;
- SendLTENetworkCommand(CHALET_CLEAR_COMMS_STATISTICS_RESPONSE,&response,1);
- break;
- }
- case ETH_NETWK_DEVICE_INFO_REQUEST:
- {
- char data[2];
- data[0] = ID_CHALET_DEVICE;
- data[1] = MY_DEVICE_ADDRESS;
- int PayloadSize;
- unsigned char *response = ProtocolGetFrame(ID_MASTER,MASTER_ADDRESS,ID_ETHERNET_VIRTUAL,ETH_NETWK_DEVICE_INFO_RESPONSE, data,2,0, &PayloadSize);
- LTESendDataToMaster((char*)response,PayloadSize);
-
- break;
- }
- case ETH_NETWK_SET_DEVICE_INFO_ACK:
- {
- LTENetworInterfaceExecSM(LTE_NWI_MASTER_CONNECTED_EVENT);
- break;
- }
- case ETH_NETWK_CONNECTION_REFUSED:
- {
- //TODO: reset the TCP module to retry connection???
- break;
- }
- }
- break;
- }
- default:
- {
- break;
- }
- }
- }
-
- void TickLTENetworkInterface()
- {
- LTENetworInterfaceExecSM(LTE_NWI_TICK_EVENT);
- }
-
- void LTENetworInterfaceExecSM(int Event)
- {
- switch(mLTENWISMState)
- {
- case LTE_NWI_INIT_STATE:
- {
- mLTENWISMState = LTE_NWI_CONNECT_TO_MASTER_STATE;
- TimerStart(LTE_NWI_TIMER,LTE_NWI_MASTER_CONNECT_POLL_INTERVAL);
- break;
- }
- case LTE_NWI_WAIT_FOR_LTE_STATE:
- {
- //Not necessary... master will init handshake on TCP connection....
- break;
- }
- case LTE_NWI_CONNECT_TO_MASTER_STATE: //Here we wait for the master to initiate the handshake after a TCP connection
- {
- if(Event == LTE_NWI_MASTER_CONNECTED_EVENT)
- {
- mLTENWISMState = LTE_NWI_OPERATE_STATE;
- }
- break;
- }
- case LTE_NWI_OPERATE_STATE:
- {
- if(Event == LTE_NWI_TICK_EVENT)
- {
-
- }
- break;
- }
- }
- }
-
- void SendLTENetworkCommand(int Command, unsigned char *Data, unsigned int DataSize)
- {
- unsigned char *Payload;
- unsigned int PayloadSize;
- Payload = ProtocolGetFrame(ID_MASTER,MASTER_ADDRESS,ID_CHALET_DEVICE,Command,Data,DataSize,0,&PayloadSize);
- LTESendDataToMaster(Payload,PayloadSize);
- }
|