#include "LoraNetworkInterface.h" #include "ProtocolDefs.h" #include "NetworkProtocol.h" #include "InternalUart.h" #include "define.h" #include "BoardCfg.h" #include "Uart.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 "WiFiCtrl.h" // //enum eWiFiState //{ // WIFI_MODULE_OFF_STATE = 0, // WIFI_CONNECTED_STATE, // WIFI_DISCONNECTED_STATE, // WIFI_INIT_ERROR_STATE, // WIFI_UNKNOWN_STATE //}; unsigned char mLoraPreamble[3]={0x00,LORA_MASTER_ADDRESS,LORA_CHANNEL}; static const char mFirmwareVersion[15] = VERSIONNUMBER; unsigned int mTotalMasterNbRequests = 0; void LoraNetworkInterfaceInit() { ProtocolInit(NETWORK_PROTOCOL_USER_LORA); } void ExecuteLoraMasterCommand(int Command, unsigned char *Data, int DataSize) { //Whatever was the command, we are online... // LORA_MODULE_RX_LED_PIN = LED_OFF; KickLoraWatchdog(); // printf("EXEC\n\n"); // ChaletPowerRelayKickTimer(); mTotalMasterNbRequests++; 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 = mTotalMasterNbRequests; // ChaletStatus[14] = (char)(mTotalMasterNbRequests & 0x000000FF); //Total Nb Requests 1 // mTotalMasterNbRequests >>= 8; // ChaletStatus[15] = (char)(mTotalMasterNbRequests & 0x000000FF); //Total Nb Requests 2 // mTotalMasterNbRequests >>= 8; // ChaletStatus[16] = (char)(mTotalMasterNbRequests & 0x000000FF); //Total Nb Requests 3 // mTotalMasterNbRequests >>= 8; // ChaletStatus[17] = (char)(mTotalMasterNbRequests & 0x000000FF); //Total Nb Requests 4 // mTotalMasterNbRequests = tmp; // // // SendLoraNetworkCommand(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(); // SendLoraNetworkCommand(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; // } // // SendLoraNetworkCommand(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); SendLoraNetworkCommand(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; } SendLoraNetworkCommand(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) // SendLoraNetworkCommand(CHALET_DO_HARAKIRI_CONFIRMATION,&response,1); // HarakiriRelayTurnOff(); // } // else // { // response = 0x00; // SendLoraNetworkCommand(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) SendLoraNetworkCommandBlocking(CHALET_REBOOT_CPU_RESPONSE,&response,1); Sleep(100); TurnOFFWiFi(); Sleep(100); SoftReset(); } else { response = 0x00; SendLoraNetworkCommand(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); SendLoraNetworkCommand(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; } SendLoraNetworkCommand(CHALET_SET_STORED_WIFI_SETTINGS_RESPONSE,&response,1); break; } case CHALET_GET_FIRMWARE_VERSION_REQUEST: { SendLoraNetworkCommand(CHALET_GET_FIRMWARE_VERSION_RESPONSE,(unsigned char*)mFirmwareVersion,15); break; } case CHALET_CLEAR_COMMS_STATISTICS_REQUEST: { char response = 1; mTotalMasterNbRequests = 0; SendLoraNetworkCommand(CHALET_CLEAR_COMMS_STATISTICS_RESPONSE,&response,1); break; } } } void SendLoraNetworkCommand(int Command, unsigned char *Data, unsigned int DataSize) { unsigned char *Payload; unsigned int PayloadSize; //unsigned char DestDevice,unsigned char DestAddress, unsigned char SenderDevice, unsigned char Cmd, unsigned char *Data,unsigned int Size,unsigned char Flags, int *FrameSize) Payload = ProtocolGetFrame(ID_MASTER,MASTER_ADDRESS,ID_CHALET_DEVICE,Command,Data,DataSize,0,&PayloadSize); UartTransmitData(NETWORK_UART_PORT,mLoraPreamble,3); UartTransmitData(NETWORK_UART_PORT,Payload,PayloadSize); } void SendLoraNetworkCommandBlocking(int Command, unsigned char *Data, unsigned int DataSize) { unsigned char *Payload; unsigned int PayloadSize; //unsigned char DestDevice,unsigned char DestAddress, unsigned char SenderDevice, unsigned char Cmd, unsigned char *Data,unsigned int Size,unsigned char Flags, int *FrameSize) Payload = ProtocolGetFrame(ID_MASTER,MASTER_ADDRESS,ID_CHALET_DEVICE,Command,Data,DataSize,0,&PayloadSize); SendInternalUartDataBlocking(mLoraPreamble,3,NETWORK_UART_PORT); SendInternalUartDataBlocking(Payload,PayloadSize,NETWORK_UART_PORT); } void TestTx() { char toto = 0x03; SendInternalUartDataBlocking(mLoraPreamble,3,NETWORK_UART_PORT); }