AudioConsole/AudioConsole.X/Source/LoraNetworkInterface.c
2025-02-15 11:05:28 -05:00

307 lines
9.0 KiB
C

#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);
}