LoraInterface dev

This commit is contained in:
jfmartel 2023-03-26 15:19:11 -04:00
parent c51e755208
commit 2bcca0fc0f
14 changed files with 3147 additions and 7019 deletions

View File

@ -3,6 +3,8 @@
#include "E220Module.h"
#include "BoardCfg.h"
#include "timer.h"
#include "Uart.h"
#include "ProtocolDefs.h"
int InitLoraModule()
@ -23,4 +25,97 @@ int SetLoraModuleConfigMode()
LORA_MODULE_M0_PIN = 0;
LORA_MODULE_M1_PIN = 0;
return RET_OK;
}
}
int ReadLoraModuleConfig()
{
char Cmd[3]={0xC1,0x00,E220_CONFIG_SIZE};
SetLoraModuleConfigMode();
Sleep(100);
SendInternalUartDataBlocking(Cmd,3,LORA_MODULE_UART_PORT);
return RET_OK;
}
int ReadLoraModuleRSSI()
{
char Cmd[6]={0xC0,0xC1,0xC2,0xC3,0x00,0x02};
Sleep(100);
SendInternalUartDataBlocking(Cmd,6,LORA_MODULE_UART_PORT);
return RET_OK;
}
int AnalyzeLoraModuleConfigData(char *Data, int size)
{
char header = Data[0];
if(header != (char)0xC1)
{
return RET_ERROR;
}
unsigned char StartAddress = Data[1];
unsigned char DataLength = Data[2];
if(DataLength != E220_CONFIG_SIZE)
{
//This function must be use to analyze all registers.
return RET_ERROR;
}
mModuleInternalAddress = Data[3];
mModuleInternalAddress <<= 8;
mModuleInternalAddress |= Data[4];
unsigned char Byte2 = Data[5];
mModuleAirRate = Byte2 & E220_AIR_RATE_MASK;
Byte2 >>= 3;
mModuleUARTParity = Byte2 & E220_UART_PARITY_MASK;
Byte2 >>= 2;
mModuleUARTRate = Byte2 & E220_UART_RATE_MASK;
unsigned char Byte3 = Data[6];
mModuleTxPower = Byte3 & E220_TX_POWER_MASK;
Byte3 >>= 5; //Bit 4,3,2 are reserved
mModuleRSSIEnabled = Byte3 & 0x01;
Byte3 >>= 1;
mModuleSubPacket = Byte3 & E220_PACKET_SIZE_MASK;
mModuleInternalChannel = Data[7];
unsigned char Byte5 = Data[8];
mModuleWORCycle = Byte5 & E220_WOR_CYCLE_MASK;
Byte5 >>= 4; //Bit 3 is reserved
mModuleLBTEnabled = Byte5 & 0x01;
Byte5 >>= 2; //Bit 5 is reserved
mModuleTxMethod = Byte5 & 0x01;
Byte5 >>= 1;
mModuleRSSIByteEnabled = Byte5 & 0x01;
return RET_OK;
}
int AnalyzeLoraModuleRSSI(char *Data, int size)
{
char header = Data[0];
if(header != (char)0xC1)
{
return RET_ERROR;
}
char StartAddress = Data[1];
char Size = Data[2];
mModuleAmbientRSSI = Data[3];
if(Size == (char)2)
{
mModuleLastRxRSSI = Data[4];
}
}

View File

@ -9,11 +9,101 @@
#define E220_MODULE_H
#include "define.h"
#define E220_CONFIG_SIZE 6 //Nb of bytes composing the configuration of the module
#define E220_UART_RATE_MASK 0x07
enum eE220UartRates
{
E220_UART_1200 = 0,
E220_UART_2400,
E220_UART_4800,
E220_UART_9600,
E220_UART_19200,
E220_UART_38400,
E220_UART_57600,
E220_UART_115200
};
#define E220_UART_PARITY_MASK 0x03
enum eE220ParityBit
{
E220_UART_8N1=0,
E220_UART_8O1,
E220_UART_8E1,
E220_UART_8N1_bis
};
#define E220_AIR_RATE_MASK 0x07
enum e220AirDataRates
{
E220_AIR_RATE_24K = 0,
E220_AIR_RATE_24K_1,
E220_AIR_RATE_24K_2,
E220_AIR_RATE_48K,
E220_AIR_RATE_96K,
E220_AIR_RATE_192K,
E220_AIR_RATE_384K,
E220_AIR_RATE_625K
};
#define E220_PACKET_SIZE_MASK 0x03
enum e220PacketSizes
{
E220_PACKET_200,
E220_PACKET_128,
E220_PACKET_64,
E220_PACKET_32
};
#define E220_TX_POWER_MASK 0x03
enum e220TransmitPower
{
E220_TX_PWR_30,
E220_TX_PWR_27,
E220_TX_PWR_24,
E220_TX_PWR_21
};
#define E220_WOR_CYCLE_MASK 0x07
enum e220WORCycles
{
E220_WOR_500MS,
E220_WOR_1000MS,
E220_WOR_1500MS,
E220_WOR_2000MS,
E220_WOR_2500MS,
E220_WOR_3000MS,
E220_WOR_3500MS,
E220_WOR_4000MS
};
int InitLoraModule();
int SetLoraModuleTxMode();
int SetLoraModuleConfigMode();
int ReadLoraModuleConfig();
int AnalyzeLoraModuleConfigData(char *Data, int size);
int ReadLoraModuleRSSI();
int AnalyzeLoraModuleRSSI(char *Data, int size);
unsigned short mModuleInternalAddress;
unsigned char mModuleUARTParity;
unsigned char mModuleUARTRate;
unsigned char mModuleAirRate;
unsigned char mModuleSubPacket;
unsigned char mModuleRSSIEnabled;
unsigned char mModuleTxPower;
unsigned char mModuleInternalChannel;
unsigned char mModuleRSSIByteEnabled;
unsigned char mModuleTxMethod;
unsigned char mModuleLBTEnabled;
unsigned char mModuleWORCycle;
unsigned char mModuleAmbientRSSI;
unsigned char mModuleLastRxRSSI;
#endif /* E220_MODULE_H */

View File

@ -8,15 +8,20 @@
#include "Uart.h"
short mModuleModel;
int InitLoraInterface()
{
mModuleModel = LORA_MODULE_MODEL;
mModuleModel = LORA_MODULE_MODEL;
InitLoraModule();
SetLoraModuleTxMode();
return RET_OK;
LoraResetRxStateMachine();
LoraInterfaceRequestModuleConfig();
return RET_OK;
}
int LoraInterfaceRxData(char Data)
@ -25,6 +30,7 @@ int LoraInterfaceRxData(char Data)
return RET_OK;
}
//Analyze data coming from lora module COM port
int LoraRxStateMachine(char Data, int Event)
{
switch(mLoraRxSMState)
@ -47,7 +53,7 @@ int LoraRxStateMachine(char Data, int Event)
}
break;
}
case LORA_RX_SM_RECEIVING_STATE:
case LORA_RX_SM_RECEIVING_STATE: //Receiving wireless data from remote device
{
switch(Event)
{
@ -68,6 +74,46 @@ int LoraRxStateMachine(char Data, int Event)
{
SendNetworkCommand(LORA_IF_NEW_FRAME_RESPONSE,mLoraModuleBuffer,mBufferIndex);
LoraResetRxStateMachine();
LoraInterfaceRequestModuleRSSI();
}
break;
}
}
break;
}
case LORA_RX_SM_CONFIG_STATE: //we are waiting for answer from module command
{
switch(Event)
{
case LORA_RX_SM_NEW_DATA_EVENT:
{
mLoraModuleBuffer[mBufferIndex++] = Data;
TimerStart(LORA_MODULE_COMM_TIMER,LORA_RX_INTERBYTE_TIMEOUT);
if(mBufferIndex >= MAX_LORA_BUFFER_SIZE)
{
//TODO: Manage the exception with the MasterCtrl.
LoraResetRxStateMachine();
}
break;
}
case LORA_RX_SM_TICK_EVENT:
{
if(IsTimerExpired(LORA_MODULE_COMM_TIMER))
{
switch(mLastConfigCommand)
{
case LORA_CONFIG_READ_CONFIG_CMD:
{
SetLoraModuleTxMode();
AnalyzeLoraModuleConfigData(mLoraModuleBuffer,mBufferIndex);
break;
}
case LORA_CONFIG_READ_RSSI_CMD:
{
AnalyzeLoraModuleRSSI(mLoraModuleBuffer,mBufferIndex);
}
}
LoraResetRxStateMachine();
}
break;
}
@ -90,10 +136,11 @@ int LoraInterfaceTransmitLoRaData(char *Payload, unsigned int PayloadSize)
{
//TODO: Manage this...
// return LORA_IF_RET_BUSY_CHANNEL;
return LORA_IF_RET_BUSY_CHANNEL;
}
SendInternalUartDataBlocking(Payload,PayloadSize,LORA_MODULE_UART_PORT);
TimerStart(LORA_MODULE_COMM_TIMER,LORA_RX_INTERBYTE_TIMEOUT);
return LORA_IF_RET_OK;
}
@ -101,4 +148,28 @@ int LoraInterfaceTransmitLoRaData(char *Payload, unsigned int PayloadSize)
void LoraInterfaceTick()
{
LoraRxStateMachine(0,LORA_RX_SM_TICK_EVENT);
}
void LoraInterfaceRequestModuleConfig()
{
mLoraRxSMState = LORA_RX_SM_CONFIG_STATE;
ReadLoraModuleConfig();
mLastConfigCommand = LORA_CONFIG_READ_CONFIG_CMD;
TimerStart(LORA_MODULE_COMM_TIMER,LORA_RX_INTERBYTE_TIMEOUT);
}
void LoraInterfaceRequestModuleRSSI()
{
mLoraRxSMState = LORA_RX_SM_CONFIG_STATE;
ReadLoraModuleRSSI();
mLastConfigCommand = LORA_CONFIG_READ_RSSI_CMD;
TimerStart(LORA_MODULE_COMM_TIMER,LORA_RX_INTERBYTE_TIMEOUT);
}
int LoraInterfaceIsBusy()
{
if(mLoraRxSMState != LORA_RX_SM_STANBY_STATE)
{
return 1;
}
return 0;
}

View File

@ -8,6 +8,7 @@
#ifndef LORA_INTERFACE_H
#define LORA_INTERFACE_H
#include "define.h"
#include "E220Module.h"
#define MAX_LORA_BUFFER_SIZE 2048
#define LORA_RX_INTERBYTE_TIMEOUT 200 //ms
@ -16,6 +17,7 @@
int mLoraRxSMState;
char mLoraModuleBuffer[MAX_LORA_BUFFER_SIZE];
int mBufferIndex;
int mLastConfigCommand;
enum eLoraModuleModel
{
@ -26,10 +28,11 @@ enum eLoraModuleModel
};
enum eLoraRxSMStates
enum eLoraNetworkRxSMStates
{
LORA_RX_SM_STANBY_STATE,
LORA_RX_SM_RECEIVING_STATE,
LORA_RX_SM_CONFIG_STATE,
LORA_RX_SM_MAX_STATE
};
@ -52,6 +55,14 @@ enum eLoraInterfaceStatusCodes
};
enum eLoraConfigCmds
{
LORA_CONFIG_READ_CONFIG_CMD,
LORA_CONFIG_READ_RSSI_CMD,
LORA_CONFIG_MAX_CMD
};
#define LORA_MODULE_MODEL LORA_MODULE_E220_MODEL
int InitLoraInterface();
@ -60,6 +71,9 @@ int LoraRxStateMachine(char Data, int Event);
void LoraResetRxStateMachine();
int LoraInterfaceTransmitLoRaData(char *Payload, unsigned int PayloadSize);
void LoraInterfaceTick();
void LoraInterfaceRequestModuleConfig();
void LoraInterfaceRequestModuleRSSI();
int LoraInterfaceIsBusy();
#endif /* LORA_MODULE_H */

View File

@ -27,16 +27,38 @@ unsigned int mTotalMasterNbRequests = 0;
void ExecuteMasterCommand(int Command, unsigned char *Data, int DataSize)
{
//Whatever was the command, we are online...
if(LoraInterfaceIsBusy() == 1)
return;
mTotalMasterNbRequests++;
switch(Command)
{
case LORA_IF_GET_STATUS_REQUEST:
{
char ModuleModel = LORA_MODULE_MODEL;
SendNetworkCommand(LORA_IF_GET_STATUS_RESPONSE,&ModuleModel,1);
char Payload[20];
char temp;
Payload[0] = LORA_MODULE_MODEL;
temp = (char)(mModuleInternalAddress & 0xFF);
Payload[2] = temp;
temp = (char)((mModuleInternalAddress >> 8) & 0xFF);
Payload[1] = temp;
Payload[3] = mModuleUARTParity;
Payload[4] = mModuleUARTRate;
Payload[5] = mModuleAirRate;
Payload[6] = mModuleSubPacket;
Payload[7] = mModuleRSSIEnabled;
Payload[8] = mModuleTxPower;
Payload[9] = mModuleInternalChannel;
Payload[10] = mModuleRSSIByteEnabled;
Payload[11] = mModuleTxMethod;
Payload[12] = mModuleLBTEnabled;
Payload[13] = mModuleWORCycle;
Payload[14] = mModuleAmbientRSSI;
Payload[15] = mModuleLastRxRSSI;
SendNetworkCommand(LORA_IF_GET_STATUS_RESPONSE,Payload,16);
break;
}
case LORA_IF_SEND_FRAME_REQUEST:
@ -84,7 +106,7 @@ void SendNetworkCommand(int Command, unsigned char *Data, unsigned int DataSize)
{
unsigned char *Payload;
unsigned int PayloadSize;
Payload = ProtocolGetFrame(ID_MASTER,MASTER_ADDRESS,ID_LORA_INTERFACE,Command,Data,DataSize,0,&PayloadSize);
Payload = ProtocolGetFrame(ID_MASTER,MASTER_ADDRESS,ID_LORA_INTERFACE_DEVICE,Command,Data,DataSize,0,&PayloadSize);
UartTransmitData(NETWORK_UART_PORT,Payload,PayloadSize);
@ -95,7 +117,7 @@ void SendNetworkCommandBlocking(int Command, unsigned char *Data, unsigned int D
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_LORA_INTERFACE,Command,Data,DataSize,0,&PayloadSize);
Payload = ProtocolGetFrame(ID_MASTER,MASTER_ADDRESS,ID_LORA_INTERFACE_DEVICE,Command,Data,DataSize,0,&PayloadSize);
SendInternalUartDataBlocking(Payload,PayloadSize,NETWORK_UART_PORT);
}

View File

@ -36,7 +36,7 @@ unsigned char Flags = 0;
unsigned char IsUpdating = 0;
unsigned char *BmpDataPtr = 0;
static char MyDeviceID = ID_LORA_INTERFACE;
static char MyDeviceID = ID_LORA_INTERFACE_DEVICE;
void ProtocolInit(void)
{

View File

@ -67,10 +67,11 @@ enum DEVICES_IDS
ID_AVRECEIVER_INTERFACE,
ID_CHALET_INTERFACE,
ID_CHALET_DEVICE,
ID_BOOTLOADER_VIRTUAL,
ID_LORA_INTERFACE,
ID_ISPINDEL_INTERFACE,
ID_LORA_INTERFACE_DEVICE,
ID_LORA_INTERFACE_INTERFACE,
ID_NB_DEVICE_ID
};
// Commands definitions
@ -375,4 +376,14 @@ enum LORA_INTERFACE_CMDS
MAX_LORA_IF_CMD
};
enum LORA_MODULE_IF_INTERFACE_CMDS
{
LORA_MODULE_IF_INTERFACE_ACK = 1,
LORA_MODULE_IF_INTERFACE_GENERAL_STATUS_REQUEST,
LORA_MODULE_IF_INTERFACE_GENERAL_STATUS_RESPONSE,
MAX_LORA_MODULE_IF_INTERFACE_CMD
};
#endif

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
#
#Tue Mar 21 14:58:27 EDT 2023
#Tue Mar 21 16:04:54 EDT 2023
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\\LoraInterface\\LoraInterface.X

BIN
~$$Comm Patterns.~vsd Normal file

Binary file not shown.