LTE fonctionnel
This commit is contained in:
@@ -373,7 +373,7 @@ int SendInternalUartData(char *p_pcDataBuf, int p_iDataSize, int p_iUartPort, ch
|
||||
// KickWatchdog();
|
||||
U5TXREG = *p_stUartDataPtr->pcTxDataPtr++;
|
||||
while(U5STAbits.TRMT == 0);
|
||||
LTE_MODULE_TX_LED_PIN = ~ LTE_MODULE_TX_LED_PIN;
|
||||
// LTE_MODULE_TX_LED_PIN = ~ LTE_MODULE_TX_LED_PIN;
|
||||
}
|
||||
p_stUartDataPtr->iIsBusy = 0;
|
||||
DataSentNotification(p_stUartDataPtr->iUartHandle,iBufSize);
|
||||
@@ -429,11 +429,11 @@ int SendInternalUartDataBlocking(char *p_pcDataBuf, int p_iDataSize, int p_iUart
|
||||
IEC2bits.U5TXIE = 0;
|
||||
for(i = 0; i < p_iDataSize; i++)
|
||||
{
|
||||
LTE_MODULE_TX_LED_PIN = ~ LTE_MODULE_TX_LED_PIN;
|
||||
// LTE_MODULE_TX_LED_PIN = ~ LTE_MODULE_TX_LED_PIN;
|
||||
U2TXREG = *p_pcDataBuf++;
|
||||
while(U5STAbits.TRMT == 0);
|
||||
}
|
||||
LTE_MODULE_TX_LED_PIN = LED_OFF;
|
||||
// LTE_MODULE_TX_LED_PIN = LED_OFF;
|
||||
IFS2bits.U5TXIF = 0;
|
||||
IEC2 = temp;
|
||||
break;
|
||||
@@ -636,14 +636,17 @@ void __ISR(_UART_5_VECTOR, ipl7) InternalUart5Interrupt(void)
|
||||
}
|
||||
else
|
||||
{
|
||||
// LTE_MODULE_TX_LED_PIN = LED_ON;
|
||||
do
|
||||
{
|
||||
U5TXREG = *p_acUartDataPtr->pcTxDataPtr++; //send data
|
||||
p_acUartDataPtr->iNbFIFOPendingBytes--;
|
||||
LTE_MODULE_TX_LED_PIN = ~ LTE_MODULE_TX_LED_PIN;
|
||||
|
||||
}
|
||||
while((U5STAbits.UTXBF == 0) && //while there is space in buffer
|
||||
(p_acUartDataPtr->iNbFIFOPendingBytes != 0)); //and data to send
|
||||
|
||||
// LTE_MODULE_TX_LED_PIN = LED_OFF;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,2 +1,344 @@
|
||||
#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);
|
||||
}
|
||||
@@ -8,7 +8,33 @@
|
||||
#ifndef LTENETWORKINTERFACE_H
|
||||
#define LTENETWORKINTERFACE_H
|
||||
|
||||
#define LTE_NWI_MASTER_CONNECT_POLL_INTERVAL 5000
|
||||
|
||||
enum eLTENWISMStates
|
||||
{
|
||||
LTE_NWI_INIT_STATE,
|
||||
LTE_NWI_WAIT_FOR_LTE_STATE,
|
||||
LTE_NWI_CONNECT_TO_MASTER_STATE,
|
||||
LTE_NWI_OPERATE_STATE,
|
||||
|
||||
LTE_NWI_MAX_STATE
|
||||
};
|
||||
|
||||
enum eLTENWISMEvents
|
||||
{
|
||||
LTE_NWI_TICK_EVENT,
|
||||
LTE_NWI_MASTER_CONNECTED_EVENT,
|
||||
|
||||
LTE_NWI_MAX_EVENT
|
||||
};
|
||||
|
||||
|
||||
void LTENetworkInterfaceInit();
|
||||
void ExecuteLTEMasterCommand(int SenderID, int Command, unsigned char *Data, int DataSize);
|
||||
|
||||
void TickLTENetworkInterface();
|
||||
void LTENetworInterfaceExecSM(int Event);
|
||||
void SendLTENetworkCommand(int Command, unsigned char *Data, unsigned int DataSize);
|
||||
|
||||
#endif /* LTENETWORKINTERFACE_H */
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#include "LoraWatchdog.h"
|
||||
#include "versionbuild.h"
|
||||
#include "WiFiCtrl.h"
|
||||
|
||||
//#include "WiFiCtrl.h"
|
||||
//
|
||||
|
||||
@@ -31,7 +32,13 @@ unsigned char mLoraPreamble[3]={0x00,LORA_MASTER_ADDRESS,LORA_CHANNEL};
|
||||
static const char mFirmwareVersion[15] = VERSIONNUMBER;
|
||||
unsigned int mTotalMasterNbRequests = 0;
|
||||
|
||||
void ExecuteMasterCommand(int Command, unsigned char *Data, int DataSize)
|
||||
|
||||
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;
|
||||
|
||||
@@ -10,7 +10,8 @@
|
||||
#define LORA_CHALET_STATUS_POWER_RELAY_MASK 0x01
|
||||
#define LORA_CHALET_STATUS_CUR_SENSOR_MASK 0x02
|
||||
|
||||
void ExecuteMasterCommand(int Command, unsigned char *Data, int DataSize);
|
||||
void LoraNetworkInterfaceInit();
|
||||
void ExecuteLoraMasterCommand(int Command, unsigned char *Data, int DataSize);
|
||||
void SendLoraNetworkCommand(int Command, unsigned char *Data, unsigned int DataSize);
|
||||
void SendLoraNetworkCommandBlocking(int Command, unsigned char *Data, unsigned int DataSize); //USE WITH CARE
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include "BoardCfg.h"
|
||||
#include "timer.h"
|
||||
#include "LoraWatchdog.h"
|
||||
#include "SIM7080GInterface.h"
|
||||
|
||||
int mLoraSMState;
|
||||
|
||||
@@ -61,6 +62,7 @@ void LoraWatchdogStateMachine(int Event)
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -15,79 +15,89 @@ jean-francois.martel@polymtl.ca
|
||||
#include "NetworkProtocol.h"
|
||||
#include "Uart.h"
|
||||
#include <string.h>
|
||||
#include "ProtocolDefs.h"
|
||||
|
||||
#include "MasterCtrlInterface.h"
|
||||
#include "LoraNetworkInterface.h"
|
||||
#include "LTENetworkInterface.h"
|
||||
|
||||
|
||||
|
||||
|
||||
unsigned char mRxData[MAX_MESSAGE_SIZE+10], mTxData[MAX_MESSAGE_SIZE+10];
|
||||
unsigned int DataSize = 0;
|
||||
unsigned int DataCtr = 0;
|
||||
unsigned int BufPtr = 0;
|
||||
unsigned char RxPtr = 0;
|
||||
unsigned char Command = 0;
|
||||
unsigned char State = RxHeader;
|
||||
unsigned char CRC = 0;
|
||||
unsigned char SenderID = 0;
|
||||
unsigned char SenderAddress = 0;
|
||||
unsigned char Flags = 0;
|
||||
unsigned char IsUpdating = 0;
|
||||
unsigned char *BmpDataPtr = 0;
|
||||
|
||||
static char MyDeviceID = ID_SPRINKLER_DEVICE;
|
||||
|
||||
void ProtocolInit(void)
|
||||
char mFrameData[MAX_MESSAGE_SIZE+10];
|
||||
|
||||
ProtocolData_t mLoraProtocolData;
|
||||
ProtocolData_t mLTEProtocolData;
|
||||
|
||||
|
||||
void ProtocolInit(int User)
|
||||
{
|
||||
ResetStateMachine();
|
||||
ProtocolData_t *DataStruct;
|
||||
switch(User)
|
||||
{
|
||||
case NETWORK_PROTOCOL_USER_LORA:
|
||||
{
|
||||
DataStruct = &mLoraProtocolData;
|
||||
break;
|
||||
}
|
||||
case NETWORK_PROTOCOL_USER_LTE:
|
||||
{
|
||||
DataStruct = &mLTEProtocolData;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
return;
|
||||
break;
|
||||
}
|
||||
ResetStateMachine(DataStruct);
|
||||
|
||||
}
|
||||
|
||||
void StateMachine(unsigned char Data)
|
||||
void StateMachine(unsigned char Data,ProtocolData_t *ProtocolData )
|
||||
{
|
||||
switch(State)
|
||||
switch(ProtocolData->State)
|
||||
{
|
||||
case Initialization: //Reset all pointers and data...
|
||||
{
|
||||
DataSize = 0;
|
||||
BufPtr = 0;
|
||||
RxPtr = 0;
|
||||
Command = 0;
|
||||
CRC = 0;
|
||||
State = RxHeader;
|
||||
ProtocolData->DataSize = 0;
|
||||
ProtocolData->BufPtr = 0;
|
||||
ProtocolData->RxPtr = 0;
|
||||
ProtocolData->Command = 0;
|
||||
ProtocolData->CRC = 0;
|
||||
ProtocolData->State = RxHeader;
|
||||
break;
|
||||
}
|
||||
case RxHeader: //Wait for data header...
|
||||
{
|
||||
if(Data == FRAME_HEADER)
|
||||
{
|
||||
mRxData[BufPtr++] = Data;
|
||||
State = RxAdd;
|
||||
CRC ^= Data;
|
||||
ProtocolData->mRxData[ProtocolData->BufPtr++] = Data;
|
||||
ProtocolData->State = RxAdd;
|
||||
ProtocolData->CRC ^= Data;
|
||||
}
|
||||
else
|
||||
{
|
||||
DataSize = 0;
|
||||
ResetStateMachine();
|
||||
ProtocolData->DataSize = 0;
|
||||
ResetStateMachine(ProtocolData);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case RxAdd: //Sender Address.
|
||||
{
|
||||
SenderAddress = Data;
|
||||
mRxData[BufPtr++] = Data;
|
||||
State = RxID;
|
||||
CRC ^= Data;
|
||||
ProtocolData->SenderAddress = Data;
|
||||
ProtocolData->mRxData[ProtocolData->BufPtr++] = Data;
|
||||
ProtocolData->State = RxID;
|
||||
ProtocolData->CRC ^= Data;
|
||||
break;
|
||||
}
|
||||
case RxID: //Sender ID
|
||||
{
|
||||
mRxData[BufPtr++] = Data;
|
||||
State = RxMyID;
|
||||
SenderID = Data;
|
||||
CRC ^= Data;
|
||||
ProtocolData->mRxData[ProtocolData->BufPtr++] = Data;
|
||||
ProtocolData->State = RxMyID;
|
||||
ProtocolData->SenderID = Data;
|
||||
ProtocolData->CRC ^= Data;
|
||||
break;
|
||||
}
|
||||
case RxMyID:
|
||||
@@ -97,158 +107,182 @@ void StateMachine(unsigned char Data)
|
||||
// ResetStateMachine();
|
||||
// break;
|
||||
// }
|
||||
mRxData[BufPtr++] = Data;
|
||||
State = RxMyAddress;
|
||||
CRC ^= Data;
|
||||
ProtocolData->mRxData[ProtocolData->BufPtr++] = Data;
|
||||
ProtocolData->State = RxMyAddress;
|
||||
ProtocolData->CRC ^= Data;
|
||||
break;
|
||||
}
|
||||
case RxMyAddress:
|
||||
{
|
||||
if(Data != MY_DEVICE_ADDRESS && Data != BROADCAST_VALUE) //Message is not for this device address and it's not a broadcast
|
||||
{
|
||||
ResetStateMachine();
|
||||
ResetStateMachine(ProtocolData);
|
||||
break;
|
||||
}
|
||||
mRxData[BufPtr++] = Data;
|
||||
State = RxFlags;
|
||||
CRC ^= Data;
|
||||
ProtocolData->mRxData[ProtocolData->BufPtr++] = Data;
|
||||
ProtocolData->State = RxFlags;
|
||||
ProtocolData->CRC ^= Data;
|
||||
break;
|
||||
}
|
||||
case RxFlags:
|
||||
{
|
||||
Flags = Data;
|
||||
mRxData[BufPtr++] = Data;
|
||||
State = RxCMD;
|
||||
CRC ^= Data;
|
||||
ProtocolData->Flags = Data;
|
||||
ProtocolData->mRxData[ProtocolData->BufPtr++] = Data;
|
||||
ProtocolData->State = RxCMD;
|
||||
ProtocolData->CRC ^= Data;
|
||||
break;
|
||||
}
|
||||
case RxCMD:
|
||||
{
|
||||
Command = Data;
|
||||
mRxData[BufPtr++] = Data;
|
||||
State = RxSize1;
|
||||
CRC ^= Data;
|
||||
ProtocolData->Command = Data;
|
||||
ProtocolData->mRxData[ProtocolData->BufPtr++] = Data;
|
||||
ProtocolData->State = RxSize1;
|
||||
ProtocolData->CRC ^= Data;
|
||||
break;
|
||||
}
|
||||
case RxSize1: //Data size MSB
|
||||
{
|
||||
DataSize = 0;
|
||||
DataSize = (unsigned int)Data;
|
||||
DataSize <<= 8;
|
||||
mRxData[BufPtr++] = Data;
|
||||
ProtocolData->DataSize = 0;
|
||||
ProtocolData->DataSize = (unsigned int)Data;
|
||||
ProtocolData->DataSize <<= 8;
|
||||
ProtocolData->mRxData[ProtocolData->BufPtr++] = Data;
|
||||
|
||||
|
||||
State = RxSize2;
|
||||
CRC ^= Data;
|
||||
ProtocolData->State = RxSize2;
|
||||
ProtocolData->CRC ^= Data;
|
||||
break;
|
||||
}
|
||||
case RxSize2: //Data size
|
||||
{
|
||||
DataSize |= (unsigned int)Data;
|
||||
DataSize <<= 8;
|
||||
mRxData[BufPtr++] = Data;
|
||||
ProtocolData->DataSize |= (unsigned int)Data;
|
||||
ProtocolData->DataSize <<= 8;
|
||||
ProtocolData->mRxData[ProtocolData->BufPtr++] = Data;
|
||||
|
||||
|
||||
State = RxSize3;
|
||||
CRC ^= Data;
|
||||
ProtocolData->State = RxSize3;
|
||||
ProtocolData->CRC ^= Data;
|
||||
break;
|
||||
}
|
||||
case RxSize3: //Data size
|
||||
{
|
||||
DataSize |= (unsigned int)Data;
|
||||
DataSize <<= 8;
|
||||
mRxData[BufPtr++] = Data;
|
||||
ProtocolData->DataSize |= (unsigned int)Data;
|
||||
ProtocolData->DataSize <<= 8;
|
||||
ProtocolData->mRxData[ProtocolData->BufPtr++] = Data;
|
||||
|
||||
|
||||
State = RxSize4;
|
||||
CRC ^= Data;
|
||||
ProtocolData->State = RxSize4;
|
||||
ProtocolData->CRC ^= Data;
|
||||
break;
|
||||
}
|
||||
|
||||
case RxSize4: //Data size LSB
|
||||
{
|
||||
DataSize |= (unsigned int)Data;
|
||||
mRxData[BufPtr++] = Data;
|
||||
ProtocolData->DataSize |= (unsigned int)Data;
|
||||
ProtocolData->mRxData[ProtocolData->BufPtr++] = Data;
|
||||
|
||||
if(DataSize > MAX_MESSAGE_SIZE)
|
||||
ResetStateMachine();
|
||||
if(ProtocolData->DataSize > MAX_MESSAGE_SIZE)
|
||||
ResetStateMachine(ProtocolData);
|
||||
|
||||
if(DataSize == 0)
|
||||
State = RxCRC;
|
||||
if(ProtocolData->DataSize == 0)
|
||||
ProtocolData->State = RxCRC;
|
||||
else
|
||||
State = RxData;
|
||||
ProtocolData->State = RxData;
|
||||
|
||||
CRC ^= Data;
|
||||
ProtocolData->CRC ^= Data;
|
||||
break;
|
||||
}
|
||||
case RxData:
|
||||
{
|
||||
CRC ^= Data;
|
||||
ProtocolData->CRC ^= Data;
|
||||
|
||||
mRxData[BufPtr++] = Data;
|
||||
DataCtr++;
|
||||
ProtocolData->mRxData[ProtocolData->BufPtr++] = Data;
|
||||
ProtocolData->DataCtr++;
|
||||
|
||||
if(DataCtr == DataSize)
|
||||
if(ProtocolData->DataCtr == ProtocolData->DataSize)
|
||||
{
|
||||
State = RxCRC;
|
||||
ProtocolData->State = RxCRC;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case RxCRC:
|
||||
{
|
||||
if(Data != CRC)
|
||||
if(Data != ProtocolData->CRC)
|
||||
{
|
||||
ResetStateMachine();
|
||||
ResetStateMachine(ProtocolData);
|
||||
// ProtocolAcknowledge(0,Command,0);
|
||||
break;
|
||||
}
|
||||
// NewMasterMessageReceived(mRxData);
|
||||
ExecuteMasterCommand(Command,ProtocolMsgDataPtr(),DataSize);
|
||||
ResetStateMachine();
|
||||
if(ProtocolData == &mLoraProtocolData)
|
||||
{
|
||||
ExecuteLoraMasterCommand(ProtocolData->Command,ProtocolMsgDataPtr(ProtocolData),ProtocolData->DataSize);
|
||||
}
|
||||
else if(ProtocolData == &mLTEProtocolData)
|
||||
{
|
||||
ExecuteLTEMasterCommand(ProtocolData->SenderID, ProtocolData->Command,ProtocolMsgDataPtr(ProtocolData),ProtocolData->DataSize);
|
||||
}
|
||||
ResetStateMachine(ProtocolData);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
ResetStateMachine();
|
||||
ResetStateMachine(ProtocolData);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ProtocolAnalyzeNewData(unsigned char Data)
|
||||
void ProtocolAnalyzeNewData(unsigned char Data, int User)
|
||||
{
|
||||
ProtocolData_t *DataStruct;
|
||||
switch(User)
|
||||
{
|
||||
case NETWORK_PROTOCOL_USER_LORA:
|
||||
{
|
||||
DataStruct = &mLoraProtocolData;
|
||||
break;
|
||||
}
|
||||
case NETWORK_PROTOCOL_USER_LTE:
|
||||
{
|
||||
DataStruct = &mLTEProtocolData;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
return;
|
||||
break;
|
||||
}
|
||||
// mRxData[RxPtr] = Data;
|
||||
// printf("%X",Data);
|
||||
StateMachine(Data);
|
||||
StateMachine(Data, DataStruct);
|
||||
}
|
||||
|
||||
void ResetStateMachine(void)
|
||||
void ResetStateMachine(ProtocolData_t *ProtocolData)
|
||||
{
|
||||
DataSize = 0;
|
||||
BufPtr = 0;
|
||||
RxPtr = 0;
|
||||
Command = 0;
|
||||
CRC = 0;
|
||||
State = RxHeader;
|
||||
DataCtr = 0;
|
||||
Flags = 0;
|
||||
SenderAddress = 0;
|
||||
ProtocolData->DataSize = 0;
|
||||
ProtocolData->BufPtr = 0;
|
||||
ProtocolData->RxPtr = 0;
|
||||
ProtocolData->Command = 0;
|
||||
ProtocolData->CRC = 0;
|
||||
ProtocolData->State = RxHeader;
|
||||
ProtocolData->DataCtr = 0;
|
||||
ProtocolData->Flags = 0;
|
||||
ProtocolData->SenderAddress = 0;
|
||||
}
|
||||
|
||||
void ProtocolExecCmd(void)
|
||||
{
|
||||
switch(Command)
|
||||
{
|
||||
case RX_GET_STATUS:
|
||||
{
|
||||
unsigned char StatusByte =0;
|
||||
// memcpy(&StatusByte, &IRRemoteStatus, sizeof(IRRemoteStatus));
|
||||
// ProtocolSendCmd(TX_DEADBOLT_STATUS,&StatusByte,sizeof(StatusByte),1,0);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
// switch(Command)
|
||||
// {
|
||||
// case RX_GET_STATUS:
|
||||
// {
|
||||
// unsigned char StatusByte =0;
|
||||
//// memcpy(&StatusByte, &IRRemoteStatus, sizeof(IRRemoteStatus));
|
||||
//// ProtocolSendCmd(TX_DEADBOLT_STATUS,&StatusByte,sizeof(StatusByte),1,0);
|
||||
//
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
void ProtocolAcknowledge(unsigned char Answer,unsigned char Cmd, unsigned char Data)
|
||||
@@ -281,10 +315,10 @@ unsigned char ProtocolCalcCrc(unsigned char* Buffer,unsigned char size)
|
||||
|
||||
unsigned char ProtocolIsReceiving(void)
|
||||
{
|
||||
if(State == RxHeader)
|
||||
return 0; // Idle...
|
||||
else
|
||||
return 1; //receiving from serial port
|
||||
// if(State == RxHeader)
|
||||
// return 0; // Idle...
|
||||
// else
|
||||
// return 1; //receiving from serial port
|
||||
|
||||
}
|
||||
|
||||
@@ -295,30 +329,32 @@ unsigned char* ProtocolGetFrame(unsigned char DestDevice,unsigned char DestAddre
|
||||
if(Size > MAX_MESSAGE_SIZE)
|
||||
{
|
||||
*FrameSize = 0;
|
||||
return &mTxData[FRAME_HEADER_INDEX];
|
||||
return &mFrameData[FRAME_HEADER_INDEX];
|
||||
}
|
||||
|
||||
mTxData[FRAME_HEADER_INDEX] = FRAME_HEADER; //header
|
||||
mTxData[FRAME_SENDER_ADDRESS_INDEX] = MY_DEVICE_ADDRESS; //My Address
|
||||
mTxData[FRAME_SENDER_DEVICE_ID_INDEX] = SenderDevice; //My ID
|
||||
mTxData[FRAME_DEST_DEVICE_ID_INDEX] = DestDevice; //Destination ID
|
||||
mTxData[FRAME_DEST_ADDRESS_INDEX] = DestAddress ;//Address; //Destination Address
|
||||
mTxData[FRAME_FLAGS_INDEX] = Flags; //Flags
|
||||
mTxData[FRAME_COMMAND_INDEX] = Cmd; //Command to send
|
||||
mTxData[FRAME_SIZE1_INDEX] = (unsigned char)((Size >> 24) & 0xFF);
|
||||
mTxData[FRAME_SIZE2_INDEX] = (unsigned char)((Size >> 16) & 0xFF);
|
||||
mTxData[FRAME_SIZE3_INDEX] = (unsigned char)((Size >> 8) & 0xFF);
|
||||
mTxData[FRAME_SIZE4_INDEX] = (unsigned char)(Size & 0xFF);
|
||||
memcpy((void*)&mTxData[FRAME_DATA_INDEX],(void*)Data,Size); //Cmd data
|
||||
mTxData[Size+FRAME_DATA_INDEX] = ProtocolCalcCrc(mTxData,Size + FRAME_DATA_INDEX); // CRC
|
||||
|
||||
|
||||
mFrameData[FRAME_HEADER_INDEX] = FRAME_HEADER; //header
|
||||
mFrameData[FRAME_SENDER_ADDRESS_INDEX] = MY_DEVICE_ADDRESS; //My Address
|
||||
mFrameData[FRAME_SENDER_DEVICE_ID_INDEX] = SenderDevice; //My ID
|
||||
mFrameData[FRAME_DEST_DEVICE_ID_INDEX] = DestDevice; //Destination ID
|
||||
mFrameData[FRAME_DEST_ADDRESS_INDEX] = DestAddress ;//Address; //Destination Address
|
||||
mFrameData[FRAME_FLAGS_INDEX] = Flags; //Flags
|
||||
mFrameData[FRAME_COMMAND_INDEX] = Cmd; //Command to send
|
||||
mFrameData[FRAME_SIZE1_INDEX] = (unsigned char)((Size >> 24) & 0xFF);
|
||||
mFrameData[FRAME_SIZE2_INDEX] = (unsigned char)((Size >> 16) & 0xFF);
|
||||
mFrameData[FRAME_SIZE3_INDEX] = (unsigned char)((Size >> 8) & 0xFF);
|
||||
mFrameData[FRAME_SIZE4_INDEX] = (unsigned char)(Size & 0xFF);
|
||||
memcpy((void*)&mFrameData[FRAME_DATA_INDEX],(void*)Data,Size); //Cmd data
|
||||
mFrameData[Size+FRAME_DATA_INDEX] = ProtocolCalcCrc(mFrameData,Size + FRAME_DATA_INDEX); // CRC
|
||||
|
||||
*FrameSize = Size + FRAME_INDEX_NBR;
|
||||
|
||||
return &mTxData[FRAME_HEADER_INDEX];
|
||||
return &mFrameData[FRAME_HEADER_INDEX];
|
||||
|
||||
}
|
||||
|
||||
unsigned char *ProtocolMsgDataPtr()
|
||||
unsigned char *ProtocolMsgDataPtr(ProtocolData_t *ProtocolData)
|
||||
{
|
||||
return &mRxData[FRAME_DATA_INDEX];
|
||||
return &ProtocolData->mRxData[FRAME_DATA_INDEX];
|
||||
}
|
||||
@@ -17,12 +17,19 @@ jean-francois.martel@polymtl.ca
|
||||
#define BOOTLOADERINTERFACE_H
|
||||
|
||||
//Protocol buffer specific definitions
|
||||
#include "ProtocolDefs.h"
|
||||
|
||||
#define MASTER_ADDRESS 0x01
|
||||
#define MY_DEVICE_ADDRESS 0x01
|
||||
|
||||
#define ADDRESS 0x01
|
||||
|
||||
enum eProtocolUser
|
||||
{
|
||||
NETWORK_PROTOCOL_USER_LORA,
|
||||
NETWORK_PROTOCOL_USER_LTE
|
||||
};
|
||||
|
||||
//State Machine states
|
||||
enum States
|
||||
{
|
||||
@@ -63,15 +70,33 @@ enum States
|
||||
|
||||
//State machine states definition
|
||||
|
||||
void ProtocolInit(void);
|
||||
void StateMachine(unsigned char STATE);
|
||||
void ProtocolAnalyzeNewData(unsigned char RxByte);
|
||||
void ResetStateMachine(void);
|
||||
typedef struct stProtocolData
|
||||
{
|
||||
unsigned char mRxData[MAX_MESSAGE_SIZE+10];
|
||||
unsigned char mTxData[MAX_MESSAGE_SIZE+10];
|
||||
unsigned int DataSize;
|
||||
unsigned int DataCtr;
|
||||
unsigned int BufPtr;
|
||||
unsigned char RxPtr;
|
||||
unsigned char Command;
|
||||
unsigned char State;
|
||||
unsigned char CRC;
|
||||
unsigned char SenderID;
|
||||
unsigned char SenderAddress;
|
||||
unsigned char Flags;
|
||||
unsigned char IsUpdating;
|
||||
unsigned char *BmpDataPtr;
|
||||
}ProtocolData_t;
|
||||
|
||||
void ProtocolInit(int User);
|
||||
void StateMachine(unsigned char STATE, ProtocolData_t *ProtocolData);
|
||||
void ProtocolAnalyzeNewData(unsigned char RxByte, int User);
|
||||
void ResetStateMachine(ProtocolData_t *ProtocolData);
|
||||
void ProtocolExecCmd(void);
|
||||
void ProtocolAcknowledge(unsigned char Answer,unsigned char Cmd, unsigned char Data);
|
||||
unsigned char* ProtocolGetFrame(unsigned char DestDevice,unsigned char DestAddress, unsigned char SenderDevice, unsigned char Cmd, unsigned char *Data,unsigned int Size,unsigned char Flags, int *FrameSize);
|
||||
unsigned char ProtocolCalcCrc(unsigned char* Buffer,unsigned char size);
|
||||
unsigned char ProtocolIsReceiving(void);
|
||||
unsigned char *ProtocolMsgDataPtr();
|
||||
unsigned char *ProtocolMsgDataPtr(ProtocolData_t *ProtocolData);
|
||||
|
||||
#endif
|
||||
@@ -6,11 +6,12 @@
|
||||
#include "WiFiCtrl.h"
|
||||
#include "ATCmdInterpreter.h"
|
||||
#include "ProtocolDefs.h"
|
||||
#include "NetworkProtocol.h"
|
||||
|
||||
static BYTE mActivateNetworkCmd[] = "AT+CNACT=0,1\r";
|
||||
static BYTE mDisconnectNetworkCmd[] = "AT+CNACT=0,0\r";
|
||||
static BYTE mCheckAPNConnectionCmd[] = "AT+CNACT?\r";
|
||||
static BYTE mConnectToMasterCmd[] = "AT+CAOPEN=0,0,\"TCP\",\"grosgin.myftp.org\",6463\r";
|
||||
static BYTE mConnectToMasterCmd[] = "AT+CAOPEN=0,0,\"TCP\",\"grosgin.myftp.org\",2182\r";
|
||||
static BYTE mDisconnectFromMasterCmd[] = "AT+CACLOSE=0\r";
|
||||
static BYTE mReceiveDataCmd[] = "AT+CARECV=0,100\r";
|
||||
|
||||
@@ -85,6 +86,7 @@ void LTEModuleSM(int SMEvent)
|
||||
LTE_MODULE_PWR_PIN = 1;
|
||||
TimerStart(LTE_MODULE_TIMER,LTE_MODULE_WAIT_INIT_TIMEOUT);
|
||||
mLTEModuleSMState = LTE_MODULE_SM_WAIT_RDY_STATE;
|
||||
TimerStart(LTE_COMM_TIMER, LTE_MODULE_MAX_COMM_TIMEOUT);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -96,11 +98,10 @@ void LTEModuleSM(int SMEvent)
|
||||
}
|
||||
else if(SMEvent == LTE_MODULE_SM_TICK_EVENT)
|
||||
{
|
||||
//TODO: it module takes too much time... reset..
|
||||
// if(IsTimerExpired(LTE_MODULE_TIMER) == true)
|
||||
// {
|
||||
// mLTEModuleSMState = LTE_MODULE_SM_SETAPN_STATE;
|
||||
// }
|
||||
if(IsTimerExpired(LTE_COMM_TIMER) == true)
|
||||
{
|
||||
LTEModuleReset();
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -278,6 +279,7 @@ int LTEEnableSerialDebug(bool EnModule, bool EnPic)
|
||||
|
||||
void SendDataToLteModule(char *Data, int Size)
|
||||
{
|
||||
|
||||
if(mPICSerialDebugEnabled)
|
||||
{
|
||||
char *ptr = Data;
|
||||
@@ -410,12 +412,12 @@ void LTEModuleAPNConnectionStatus(int Status)
|
||||
if(Status == LTE_MODULE_APN_CONNECTED)
|
||||
{
|
||||
mAPNConnected = true;
|
||||
// SyslogNewString("APN connected\n");
|
||||
// SyslogNewString("APN connected\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
mAPNConnected = false;
|
||||
// SyslogNewString("APN disconnected\n");
|
||||
// SyslogNewString("APN disconnected\n");
|
||||
}
|
||||
}
|
||||
void LTEModuleMasterConnectionStatus(int Status)
|
||||
@@ -423,18 +425,18 @@ void LTEModuleMasterConnectionStatus(int Status)
|
||||
if(Status == LTE_MODULE_MASTER_CONNECTED)
|
||||
{
|
||||
mMasterConnected = true;
|
||||
// SyslogNewString("Master connected\n");
|
||||
// SyslogNewString("Master connected\n");
|
||||
}
|
||||
else if(Status == LTE_MODULE_MASTER_SOCKET_ERROR)
|
||||
{
|
||||
mMasterConnected = false;
|
||||
mMasterSocketError = true;
|
||||
// SyslogNewString("Master socket error\n");
|
||||
// SyslogNewString("Master socket error\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
mMasterConnected = false;
|
||||
// SyslogNewString("Master disconnected\n");
|
||||
// SyslogNewString("Master disconnected\n");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -461,14 +463,17 @@ void LTEModuleOperationSM(int OperationEvent)
|
||||
LTESendCommandToModule(LTE_MODULE_CHECK_APN_CONNECTION_CMD);
|
||||
mLTEModuleOperationSMState = LTE_MODULE_OPERATION_CHECK_APN_STATE;
|
||||
}
|
||||
if(OperationEvent == LTE_MODULE_OP_APN_CONN_FAILED_EVENT)
|
||||
else if(OperationEvent == LTE_MODULE_OP_APN_CONN_FAILED_EVENT)
|
||||
{
|
||||
//TODO: What do we do??
|
||||
LTEModuleReset(); //Something's wrong... reset the module.
|
||||
}
|
||||
else if(OperationEvent == LTE_MODULE_OP_TICK_EVENT)
|
||||
{
|
||||
//TODO: manage timeouts
|
||||
if(IsTimerExpired(LTE_COMM_TIMER) == true)
|
||||
{
|
||||
LTEModuleReset();
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -490,18 +495,18 @@ void LTEModuleOperationSM(int OperationEvent)
|
||||
mLTEModuleOperationSMState = LTE_MODULE_OPERATION_STANDBY_STATE;
|
||||
}
|
||||
}
|
||||
if(OperationEvent == LTE_MODULE_OP_APN_DISCONNECTED_EVENT)
|
||||
else if(OperationEvent == LTE_MODULE_OP_APN_DISCONNECTED_EVENT)
|
||||
{
|
||||
//TODO: What do we do??
|
||||
|
||||
//Send the request to connect to Mastercontroller
|
||||
// mCurrentCmd = LTE_MODULE_CONNECT_TO_MASTER_CMD;
|
||||
// SendDataToLteModule(mConnectToMasterCmd,strlen(mConnectToMasterCmd));
|
||||
// mLTEModuleOperationSMState = LTE_MODULE_OPERATION_WAIT_CONNECT_SERVER_STATE;
|
||||
//Let the main loop retry later...
|
||||
mCurrentCmd = LTE_MODULE_NO_CMD;
|
||||
mLTEModuleOperationSMState = LTE_MODULE_OPERATION_STANDBY_STATE;
|
||||
}
|
||||
else if(OperationEvent == LTE_MODULE_OP_TICK_EVENT)
|
||||
{
|
||||
//TODO: manage timeouts
|
||||
if(IsTimerExpired(LTE_COMM_TIMER) == true)
|
||||
{
|
||||
LTEModuleReset();
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -513,22 +518,26 @@ void LTEModuleOperationSM(int OperationEvent)
|
||||
mLTEModuleOperationSMState = LTE_MODULE_OPERATION_STANDBY_STATE;
|
||||
TimerStart(LTE_MODULE_TIMER,LTE_MODULE_CONNECTION_CHECK_TIMEOUT);
|
||||
}
|
||||
if(OperationEvent == LTE_MODULE_OP_SERVER_DISCONNECTED_EVENT)
|
||||
else if(OperationEvent == LTE_MODULE_OP_SERVER_DISCONNECTED_EVENT)
|
||||
{
|
||||
//TODO: What do we do?
|
||||
|
||||
mCurrentCmd = LTE_MODULE_NO_CMD;
|
||||
mLTEModuleOperationSMState = LTE_MODULE_OPERATION_STANDBY_STATE;
|
||||
TimerStart(LTE_MODULE_TIMER,LTE_MODULE_CONNECTION_CHECK_TIMEOUT);
|
||||
|
||||
}
|
||||
if(OperationEvent == LTE_MODULE_OP_SERVER_CONN_FAILED_EVENT)
|
||||
else if(OperationEvent == LTE_MODULE_OP_SERVER_CONN_FAILED_EVENT)
|
||||
{
|
||||
mCurrentCmd = LTE_MODULE_NO_CMD;
|
||||
//TODO: What do we do?
|
||||
}
|
||||
else if(OperationEvent == LTE_MODULE_OP_TICK_EVENT)
|
||||
{
|
||||
//TODO: manage timeouts
|
||||
if(IsTimerExpired(LTE_COMM_TIMER) == true)
|
||||
{
|
||||
LTEModuleReset();
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -540,12 +549,23 @@ void LTEModuleOperationSM(int OperationEvent)
|
||||
mLTEModuleOperationSMState = LTE_MODULE_OPERATION_WAIT_CONNECT_SERVER_STATE;
|
||||
LTESendCommandToModule(LTE_MODULE_CONNECT_TO_MASTER_CMD);
|
||||
}
|
||||
else if(OperationEvent == LTE_MODULE_OP_TICK_EVENT)
|
||||
{
|
||||
if(IsTimerExpired(LTE_COMM_TIMER) == true)
|
||||
{
|
||||
LTEModuleReset();
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case LTE_MODULE_OPERATION_STANDBY_STATE:
|
||||
{
|
||||
if(OperationEvent == LTE_MODULE_OP_TICK_EVENT)
|
||||
{
|
||||
if(IsTimerRunning(LTE_COMM_TIMER) == true)
|
||||
{
|
||||
TimerStop(LTE_COMM_TIMER);
|
||||
}
|
||||
switch(mLTEModuleOperationSMSubState)
|
||||
{
|
||||
case LTE_MODULE_OPERATION_NOMINAL_SUBSTATE:
|
||||
@@ -557,7 +577,6 @@ void LTEModuleOperationSM(int OperationEvent)
|
||||
char tmp[] = "Ca marche\n\r";
|
||||
mNbMasterReconnectCount = 0;
|
||||
TimerStart(LTE_MODULE_TIMER,LTE_MODULE_CONNECTION_CHECK_TIMEOUT);
|
||||
LTESendDataToMaster(tmp,strlen(tmp));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -568,7 +587,7 @@ void LTEModuleOperationSM(int OperationEvent)
|
||||
mLTEModuleOperationSMSubState = LTE_MODULE_OPERATION_RECONNECT_MASTER_SUBSTATE;
|
||||
mLTEModuleOperationSMState = LTE_MODULE_OPERATION_WAIT_DISCONNECT_SERVER_STATE;
|
||||
LTESendCommandToModule(LTE_MODULE_DISCONNECT_FROM_MASTER_CMD); //Always disconnect before reconnecting...
|
||||
// SyslogNewString("Master reconnection attempt\n");
|
||||
// SyslogNewString("Master reconnection attempt\n");
|
||||
}
|
||||
else //We tried 10 times, check the APN
|
||||
{
|
||||
@@ -576,7 +595,7 @@ void LTEModuleOperationSM(int OperationEvent)
|
||||
mLTEModuleOperationSMSubState = LTE_MODULE_OPERATION_CHECK_APN_SUBSTATE;
|
||||
LTESendCommandToModule(LTE_MODULE_CHECK_APN_CONNECTION_CMD);
|
||||
mNbMasterReconnectCount = 0;
|
||||
// SyslogNewString("Master reconnection attempt count reached.. checking APN\n");
|
||||
// SyslogNewString("Master reconnection attempt count reached.. checking APN\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -586,14 +605,14 @@ void LTEModuleOperationSM(int OperationEvent)
|
||||
{
|
||||
mLTEModuleOperationSMSubState = LTE_MODULE_OPERATION_NOMINAL_SUBSTATE;
|
||||
//TODO: check for SOCKET ERROR result code and reset APN directly here?
|
||||
// if(mMasterSocketError == true)
|
||||
// {
|
||||
// mMasterSocketError = false;
|
||||
// mLTEModuleOperationSMState = LTE_MODULE_OPERATION_CHECK_APN_STATE;
|
||||
// mLTEModuleOperationSMSubState = LTE_MODULE_OPERATION_CHECK_APN_SUBSTATE;
|
||||
// LTESendCommandToModule(LTE_MODULE_CHECK_APN_CONNECTION_CMD);
|
||||
// mNbMasterReconnectCount = 0;
|
||||
// }
|
||||
// if(mMasterSocketError == true)
|
||||
// {
|
||||
// mMasterSocketError = false;
|
||||
// mLTEModuleOperationSMState = LTE_MODULE_OPERATION_CHECK_APN_STATE;
|
||||
// mLTEModuleOperationSMSubState = LTE_MODULE_OPERATION_CHECK_APN_SUBSTATE;
|
||||
// LTESendCommandToModule(LTE_MODULE_CHECK_APN_CONNECTION_CMD);
|
||||
// mNbMasterReconnectCount = 0;
|
||||
// }
|
||||
break;
|
||||
}
|
||||
case LTE_MODULE_OPERATION_CHECK_APN_SUBSTATE:
|
||||
@@ -638,15 +657,18 @@ void LTEModuleOperationSM(int OperationEvent)
|
||||
}
|
||||
case LTE_MODULE_OPERATION_WAIT_FOR_DATA_STATE:
|
||||
{
|
||||
if(OperationEvent == LTE_MODULE_OP_TICK_EVENT)
|
||||
{
|
||||
//TODO: manage timeouts
|
||||
}
|
||||
if(OperationEvent == LTE_MODULE_OP_MASTER_DATA_RECEIVED_EVENT)
|
||||
{
|
||||
mCurrentCmd = LTE_MODULE_NO_CMD;
|
||||
mLTEModuleOperationSMState = LTE_MODULE_OPERATION_STANDBY_STATE;
|
||||
}
|
||||
else if(OperationEvent == LTE_MODULE_OP_TICK_EVENT)
|
||||
{
|
||||
if(IsTimerExpired(LTE_COMM_TIMER) == true)
|
||||
{
|
||||
LTEModuleReset();
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
@@ -654,9 +676,12 @@ void LTEModuleOperationSM(int OperationEvent)
|
||||
{
|
||||
if(OperationEvent == LTE_MODULE_OP_TICK_EVENT)
|
||||
{
|
||||
//TODO: manage timeouts
|
||||
if(IsTimerExpired(LTE_COMM_TIMER) == true)
|
||||
{
|
||||
LTEModuleReset();
|
||||
}
|
||||
}
|
||||
if(OperationEvent == LTE_MODULE_OP_MASTER_DATA_SENT_EVENT)
|
||||
else if(OperationEvent == LTE_MODULE_OP_MASTER_DATA_SENT_EVENT)
|
||||
{
|
||||
mCurrentCmd = LTE_MODULE_NO_CMD;
|
||||
mLTEModuleOperationSMState = LTE_MODULE_OPERATION_STANDBY_STATE;
|
||||
@@ -674,7 +699,11 @@ void LTEModuleNewDataReady()
|
||||
void LTEModuleDataReceived(char *Data, int Size)
|
||||
{
|
||||
LTEModuleOperationSM(LTE_MODULE_OP_MASTER_DATA_RECEIVED_EVENT);
|
||||
//Execute command..
|
||||
int i;
|
||||
for(i = 0; i < Size; i++)
|
||||
{
|
||||
ProtocolAnalyzeNewData(Data[i], NETWORK_PROTOCOL_USER_LTE);
|
||||
}
|
||||
}
|
||||
|
||||
int LTESendCommandToModule(int Cmd)
|
||||
@@ -682,6 +711,7 @@ int LTESendCommandToModule(int Cmd)
|
||||
switch(Cmd)
|
||||
{
|
||||
|
||||
TimerStart(LTE_COMM_TIMER,LTE_MODULE_MAX_COMM_TIMEOUT);
|
||||
case LTE_MODULE_CONNECT_APN_CMD:
|
||||
{
|
||||
mCurrentCmd = LTE_MODULE_CONNECT_APN_CMD;
|
||||
@@ -733,6 +763,7 @@ int LTESendCommandToModule(int Cmd)
|
||||
case LTE_MODULE_NO_CMD:
|
||||
default:
|
||||
{
|
||||
TimerStop(LTE_COMM_TIMER);
|
||||
mCurrentCmd = LTE_MODULE_NO_CMD;
|
||||
return RET_ERROR;
|
||||
break;
|
||||
@@ -748,13 +779,14 @@ void LTEModuleMasterCtrlCommStatus(bool Offline)
|
||||
{
|
||||
mMasterConnected = false;
|
||||
}
|
||||
// else
|
||||
// mMasterConnected = true;
|
||||
// else
|
||||
// mMasterConnected = true;
|
||||
}
|
||||
|
||||
//This is the function to call from outside to send data to the server
|
||||
int LTESendDataToMaster(char *Buffer, int Size)
|
||||
{
|
||||
LTE_MODULE_TX_LED_PIN = LED_ON;
|
||||
if(Size > MAX_MESSAGE_SIZE)
|
||||
{
|
||||
return RET_ERROR;
|
||||
@@ -774,5 +806,11 @@ int LTESendDataToMaster(char *Buffer, int Size)
|
||||
int LTESendMasterBufferToModule()
|
||||
{
|
||||
SendDataToLteModule(mMasterTxBuffer,mMasterTxSize);
|
||||
LTE_MODULE_TX_LED_PIN = LED_OFF;
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
bool LTEModuleIsMasterConnected()
|
||||
{
|
||||
return mMasterConnected;
|
||||
}
|
||||
@@ -15,6 +15,7 @@
|
||||
#define LTE_MODULE_CONNECTION_CHECK_TIMEOUT 5000
|
||||
#define LTE_MODULE_MAX_CMD_LENGTH 128
|
||||
#define LTE_MODULE_MAX_MASTER_CONNECT_RETRY 5
|
||||
#define LTE_MODULE_MAX_COMM_TIMEOUT 10000
|
||||
|
||||
enum eLTEModuleCommands
|
||||
{
|
||||
@@ -146,5 +147,7 @@ void LTEModuleNewDataReady();
|
||||
void LTEModuleDataReceived(char *Data, int Size);
|
||||
void LTEModuleMasterCtrlCommStatus(bool Offline);
|
||||
|
||||
bool LTEModuleIsMasterConnected();
|
||||
|
||||
#endif /* SIM7080GINTERFACE_H */
|
||||
|
||||
|
||||
@@ -43,6 +43,7 @@
|
||||
#include "LoraWatchdog.h"
|
||||
#include "LCDCtrl.h"
|
||||
#include "SIM7080GInterface.h"
|
||||
#include "LTENetworkInterface.h"
|
||||
|
||||
#include "BootloaderInterface.h"
|
||||
|
||||
@@ -60,6 +61,7 @@
|
||||
void _mon_putc(char c); //override from stdio to redirect stdout on uart 3B
|
||||
#elif defined USE_SYSLOG
|
||||
#include "Syslog.h"
|
||||
#include "LoraNetworkInterface.h"
|
||||
void _mon_putc(char c); //override from stdio to redirect stdout on uart 3B
|
||||
#endif
|
||||
|
||||
@@ -102,13 +104,16 @@ int main(void)
|
||||
|
||||
|
||||
InitUart();
|
||||
ProtocolInit();
|
||||
LoraNetworkInterfaceInit();
|
||||
InitLoraWatchdog();
|
||||
|
||||
|
||||
|
||||
InitSPIFlash();
|
||||
InitLCDCtrl();
|
||||
|
||||
InitLTEModule();
|
||||
|
||||
LTENetworkInterfaceInit();
|
||||
|
||||
|
||||
#ifdef USE_SYSLOG
|
||||
@@ -207,9 +212,10 @@ int main(void)
|
||||
SyslogTick();
|
||||
TickTempSensor();
|
||||
BootloaderInterfaceTick();
|
||||
// TickLoraWatchdog();
|
||||
TickLoraWatchdog();
|
||||
TickLCDCtrl();
|
||||
TickLTEModule();
|
||||
TickLTENetworkInterface();
|
||||
|
||||
if(IsTimerExpired(HEARTBEAT_LED_TMR))
|
||||
{
|
||||
|
||||
@@ -52,6 +52,8 @@ typedef enum
|
||||
LORA_WATCHDOG_TIMER,
|
||||
LCD_CTRL_TIMER,
|
||||
LTE_MODULE_TIMER,
|
||||
LTE_COMM_TIMER,
|
||||
LTE_NWI_TIMER,
|
||||
TIMER_MAX_ID
|
||||
}eTimerID;
|
||||
|
||||
|
||||
Binary file not shown.
+1866
-1863
File diff suppressed because it is too large
Load Diff
BIN
Binary file not shown.
+8333
-8073
File diff suppressed because it is too large
Load Diff
+1883
-1878
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
||||
#
|
||||
#Mon Dec 30 11:51:17 EST 2024
|
||||
#Mon Dec 30 20:57:03 EST 2024
|
||||
ChaletDuinoV2_795F512H_.languagetoolchain.dir=C\:\\Program Files\\Microchip\\xc32\\v1.33\\bin
|
||||
default.languagetoolchain.dir=C\:\\Program Files\\Microchip\\xc32\\v1.33\\bin
|
||||
proj.dir=D\:\\Main\\PicDev\\Projets\\ChaletLora\\ChaletLora.X
|
||||
@@ -13,7 +13,7 @@ host.platform=windows
|
||||
ChaletDuinoV2_795F512H_.com-microchip-mplab-nbide-toolchain-xc32-XC32LanguageToolchain.md5=de2d3bc95a22a3f432c2e39f49efafbc
|
||||
ChaletDuinoV2_795F512H_.Pack.dfplocation=C\:\\Users\\JF\\.mchp_packs\\Microchip\\PIC32MX_DFP\\1.3.231
|
||||
ChaletDuino_775F512H_.languagetoolchain.dir=C\:\\Program Files\\Microchip\\xc32\\v1.33\\bin
|
||||
host.id=2r0w-c3lh-oj
|
||||
host.id=1ig4-46sv-sm
|
||||
conf.ids=default,ChaletDuino_775F512H_,ChaletDuinoV2_795F512H_
|
||||
default.languagetoolchain.version=1.33
|
||||
ChaletDuinoV2_795F512H_.languagetoolchain.version=1.33
|
||||
|
||||
@@ -1,6 +1,37 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project-private xmlns="http://www.netbeans.org/ns/project-private/1">
|
||||
<editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/2" lastBookmarkId="9">
|
||||
<editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/2" lastBookmarkId="11">
|
||||
<file>
|
||||
<url>Source/hd44780.c</url>
|
||||
<bookmark id="7">
|
||||
<name/>
|
||||
<line>340</line>
|
||||
<key/>
|
||||
</bookmark>
|
||||
</file>
|
||||
<file>
|
||||
<url>Source/SIM7080GInterface.c</url>
|
||||
<bookmark id="11">
|
||||
<name/>
|
||||
<line>119</line>
|
||||
<key/>
|
||||
</bookmark>
|
||||
<bookmark id="10">
|
||||
<name/>
|
||||
<line>201</line>
|
||||
<key/>
|
||||
</bookmark>
|
||||
<bookmark id="8">
|
||||
<name/>
|
||||
<line>443</line>
|
||||
<key/>
|
||||
</bookmark>
|
||||
<bookmark id="9">
|
||||
<name/>
|
||||
<line>560</line>
|
||||
<key/>
|
||||
</bookmark>
|
||||
</file>
|
||||
<file>
|
||||
<url>Source/BootloaderInterface.c</url>
|
||||
<bookmark id="5">
|
||||
@@ -14,32 +45,8 @@
|
||||
<key/>
|
||||
</bookmark>
|
||||
</file>
|
||||
<file>
|
||||
<url>Source/hd44780.c</url>
|
||||
<bookmark id="7">
|
||||
<name/>
|
||||
<line>340</line>
|
||||
<key/>
|
||||
</bookmark>
|
||||
</file>
|
||||
<file>
|
||||
<url>Source/SIM7080GInterface.c</url>
|
||||
<bookmark id="8">
|
||||
<name/>
|
||||
<line>426</line>
|
||||
<key/>
|
||||
</bookmark>
|
||||
<bookmark id="9">
|
||||
<name/>
|
||||
<line>527</line>
|
||||
<key/>
|
||||
</bookmark>
|
||||
</file>
|
||||
</editor-bookmarks>
|
||||
<open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2">
|
||||
<group>
|
||||
<file>file:/D:/Main/PicDev/Projets/ChaletLora/ChaletLora.X/Source/SIM7080GInterface.c</file>
|
||||
<file>file:/D:/Main/PicDev/Projets/ChaletLora/ChaletLora.X/Source/SIM7080GInterface.h</file>
|
||||
</group>
|
||||
<group/>
|
||||
</open-files>
|
||||
</project-private>
|
||||
|
||||
Reference in New Issue
Block a user