#include "SIM7080GInterface.h" #include "BoardCfg.h" #include "timer.h" #include "Uart.h" #include "Syslog.h" #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\",2182\r"; static BYTE mDisconnectFromMasterCmd[] = "AT+CACLOSE=0\r"; static BYTE mReceiveDataCmd[] = "AT+CARECV=0,100\r"; char mMasterTxBuffer[MAX_MESSAGE_SIZE]; int mMasterTxSize; int mLTEModuleSMState; int mLTEModuleOperationSMState; int mLTEModuleOperationSMSubState; int mNbCmdCharsReceived; char mATCmd[LTE_MODULE_MAX_CMD_LENGTH]; bool mIsPassthroughEnabled; bool mModuleSerialDebugEnabled; bool mPICSerialDebugEnabled; int mCurrentCmd; bool mIsInitializing; int mNbMasterReconnectCount; bool mMasterConnected; bool mMasterSocketError; bool mAPNConnected; void InitLTEModule() { mLTEModuleSMState = LTE_MODULE_SM_INIT_STATE; mLTEModuleOperationSMState = LTE_MODULE_OPERATION_INIT_STATE; mLTEModuleOperationSMSubState = LTE_MODULE_OPERATION_NOMINAL_SUBSTATE; mNbCmdCharsReceived = 0; mIsPassthroughEnabled = false; mModuleSerialDebugEnabled = false; mPICSerialDebugEnabled = false; mCurrentCmd = LTE_MODULE_NO_CMD; mIsInitializing = true; mNbMasterReconnectCount = 0; mMasterSocketError = false; mMasterConnected = false; mAPNConnected = false; } int LTEModuleReset() { InitLTEModule(); return RET_OK; } void LTEModuleSM(int SMEvent) { switch(mLTEModuleSMState) { case LTE_MODULE_SM_INIT_STATE: { // LORA_MODULE_RELAY_PIN = 1; TimerStart(LTE_MODULE_TIMER,LTE_MODULE_POWERUP_TIMEOUT); mLTEModuleSMState = LTE_MODULE_SM_RESET_STATE; break; } case LTE_MODULE_SM_RESET_STATE: { if(IsTimerExpired(LTE_MODULE_TIMER) == true) { // LORA_MODULE_RELAY_PIN = 0; // LTE_MODULE_PWR_PIN = 0; TimerStart(LTE_MODULE_TIMER,LTE_MODULE_POWERUP_TIMEOUT); mLTEModuleSMState = LTE_MODULE_SM_POWERUP_STATE; } break; } case LTE_MODULE_SM_POWERUP_STATE: { if(IsTimerExpired(LTE_MODULE_TIMER) == true) { // 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; } case LTE_MODULE_SM_WAIT_RDY_STATE: { if(SMEvent == LTE_MODULE_RX_RDY_EVENT) { mLTEModuleSMState = LTE_MODULE_SM_SETECHOOFF_STATE; } else if(SMEvent == LTE_MODULE_SM_TICK_EVENT) { if(IsTimerExpired(LTE_COMM_TIMER) == true) { LTEModuleReset(); } } break; } case LTE_MODULE_SM_SETECHOOFF_STATE: { char Cmd[5] = {'A','T','E','0','\r'}; //UartTransmitData(LTE_IF_UART_PORT,Cmd,5); SendDataToLteModule(Cmd,5); TimerStart(LTE_MODULE_TIMER,LTE_MODULE_POWERUP_TIMEOUT); mLTEModuleSMState = LTE_MODULE_SM_DELAY_STATE; break; } case LTE_MODULE_SM_SETAPN_STATE: { char Cmd[10] = {'A','T','+','C','G','N','A','P','N','\r'}; //UartTransmitData(LTE_IF_UART_PORT,Cmd,10); SendDataToLteModule(Cmd,10); TimerStart(LTE_MODULE_TIMER,LTE_MODULE_POWERUP_TIMEOUT); mLTEModuleSMState = LTE_MODULE_SM_DELAY_STATE; break; } case LTE_MODULE_SM_DELAY_STATE: { if(IsTimerExpired(LTE_MODULE_TIMER) == true) { mLTEModuleSMState = LTE_MODULE_SM_RUN_STATE; } break; } case LTE_MODULE_SM_RUN_STATE: { if(SMEvent == LTE_MODULE_ENTER_PASSTHROUGH_EVENT) { mLTEModuleSMState = LTE_MODULE_SM_PASSTHROUGH_STATE; SyslogNewString("LTE Module entering passthrough mode..."); } if(SMEvent == LTE_MODULE_SM_TICK_EVENT) { LTEModuleOperationSM(LTE_MODULE_OP_TICK_EVENT); } break; } case LTE_MODULE_SM_PASSTHROUGH_STATE: { if(SMEvent == LTE_MODULE_EXIT_PASSTHROUGH_EVENT) { SyslogNewString("LTE Module exiting passthrough mode..."); mLTEModuleSMState = LTE_MODULE_SM_RUN_STATE; } break; } } } void TickLTEModule() { LTEModuleSM(LTE_MODULE_SM_TICK_EVENT); } void LTEModuleNewData(unsigned char Data) { if(mIsPassthroughEnabled == true) { SyslogNewByte(Data); // SendSyslogByte(Data); return; } if(mModuleSerialDebugEnabled == true) { SyslogNewByte(Data); } if(Data == '\n') //ignore line feeds return; if(Data != '\r') { if(mLTEModuleOperationSMState == LTE_MODULE_OPERATION_SENDING_DATA_STATE && Data == '>') { LTESendMasterBufferToModule(); } else if(mNbCmdCharsReceived < LTE_MODULE_MAX_CMD_LENGTH) { mATCmd[mNbCmdCharsReceived] = Data; mNbCmdCharsReceived++; } else { //error... mNbCmdCharsReceived = 0; } } else { if(mNbCmdCharsReceived != 0) //New Command received { if(mLTEModuleSMState == LTE_MODULE_SM_WAIT_RDY_STATE) { if(mATCmd[0] == 'R' && mATCmd[1] == 'D' && mATCmd[2] == 'Y') { LTEModuleSM(LTE_MODULE_RX_RDY_EVENT); } } else if(mLTEModuleSMState == LTE_MODULE_SM_RUN_STATE) { AnalyzeNewATString(mATCmd,mNbCmdCharsReceived,mCurrentCmd); mNbCmdCharsReceived = mNbCmdCharsReceived; } mNbCmdCharsReceived = 0; } } } void LTEEnterSerialPassthrough() { LTEModuleSM(LTE_MODULE_ENTER_PASSTHROUGH_EVENT); mIsPassthroughEnabled = true; SyslogSetLTEPassthrough(true); mPICSerialDebugEnabled = false; mModuleSerialDebugEnabled = false; } void LTEExitSerialPassthrough() { LTEModuleSM(LTE_MODULE_EXIT_PASSTHROUGH_EVENT); mIsPassthroughEnabled = false; SyslogSetLTEPassthrough(false); } void LTEFwdPassthroughData(char Data) { if(mIsPassthroughEnabled == true) { UartTransmitData(LTE_IF_UART_PORT,&Data,1); } } int LTEEnableSerialDebug(bool EnModule, bool EnPic) { if(EnModule == true) { if(mIsPassthroughEnabled == true) { return RET_ERROR; } mModuleSerialDebugEnabled = true; } else { mModuleSerialDebugEnabled = false; } if(EnPic == true) { if(mIsPassthroughEnabled == true) { return RET_ERROR; } mPICSerialDebugEnabled = true; } else { mPICSerialDebugEnabled = false; } return RET_OK; } void SendDataToLteModule(char *Data, int Size) { if(mPICSerialDebugEnabled) { char *ptr = Data; int i; for(i = 0; i < Size; i++) { SyslogNewByte(*ptr++); } } UartTransmitData(LTE_IF_UART_PORT,Data,Size); } void LTECmdResponseReceived(int Cmd, int Result) { switch(Cmd) { case LTE_MODULE_NO_CMD: { break; } case LTE_MODULE_CONNECT_APN_CMD: { if(Result == LTE_MODULE_RESULT_OK) { LTEModuleOperationSM(LTE_MODULE_OP_APN_CONN_OK_EVENT); } else if(Result == LTE_MODULE_RESULT_ERROR) { LTEModuleOperationSM(LTE_MODULE_OP_APN_CONN_FAILED_EVENT); } break; } case LTE_MODULE_DISCONNECT_APN_CMD: { break; } case LTE_MODULE_CHECK_APN_CONNECTION_CMD: { if(Result == LTE_MODULE_RESULT_OK) { if(mAPNConnected == true) { LTEModuleOperationSM(LTE_MODULE_OP_APN_CONNECTED_EVENT); } else { LTEModuleOperationSM(LTE_MODULE_OP_APN_DISCONNECTED_EVENT); } } else if(Result == LTE_MODULE_RESULT_ERROR) { LTEModuleOperationSM(LTE_MODULE_OP_APN_CONN_FAILED_EVENT); } break; } case LTE_MODULE_CONNECT_TO_MASTER_CMD: { if(Result == LTE_MODULE_RESULT_OK) { if(mMasterConnected == true) { LTEModuleOperationSM(LTE_MODULE_OP_SERVER_CONNECTED_EVENT); } else { LTEModuleOperationSM(LTE_MODULE_OP_SERVER_DISCONNECTED_EVENT); } } else if(Result == LTE_MODULE_RESULT_ERROR) { LTEModuleOperationSM(LTE_MODULE_OP_SERVER_CONN_FAILED_EVENT); } break; } case LTE_MODULE_DISCONNECT_FROM_MASTER_CMD: { if(Result == LTE_MODULE_RESULT_OK) { LTEModuleOperationSM(LTE_MODULE_OP_SERVER_DISCONNECTED_EVENT); } else if(Result == LTE_MODULE_RESULT_ERROR) { LTEModuleOperationSM(LTE_MODULE_OP_SERVER_DISCONNECTED_EVENT); } break; } case LTE_MODULE_CHECK_MASTER_CONNECTION_CMD: { if(Result == LTE_MODULE_RESULT_OK) { } else if(Result == LTE_MODULE_RESULT_ERROR) { } break; } case LTE_MODULE_RX_DATA_CMD: { if(Result == LTE_MODULE_RESULT_OK) { //This case is managed by LTEModuleDataReceived() } else if(Result == LTE_MODULE_RESULT_ERROR) { LTEModuleOperationSM(LTE_MODULE_OP_MASTER_DATA_RECEIVED_EVENT); } break; } case LTE_MODULE_TX_DATA_CMD: { if(Result == LTE_MODULE_RESULT_OK) { LTEModuleOperationSM(LTE_MODULE_OP_MASTER_DATA_SENT_EVENT); } else if(Result == LTE_MODULE_RESULT_ERROR) { //TODO: Manage a TX error... LTEModuleOperationSM(LTE_MODULE_OP_MASTER_DATA_SENT_EVENT); } break; } } } void LTEModuleAPNConnectionStatus(int Status) { if(Status == LTE_MODULE_APN_CONNECTED) { mAPNConnected = true; // SyslogNewString("APN connected\n"); } else { mAPNConnected = false; // SyslogNewString("APN disconnected\n"); } } void LTEModuleMasterConnectionStatus(int Status) { if(Status == LTE_MODULE_MASTER_CONNECTED) { mMasterConnected = true; // SyslogNewString("Master connected\n"); } else if(Status == LTE_MODULE_MASTER_SOCKET_ERROR) { mMasterConnected = false; mMasterSocketError = true; // SyslogNewString("Master socket error\n"); } else { mMasterConnected = false; // SyslogNewString("Master disconnected\n"); } } void LTEModuleOperationSM(int OperationEvent) { switch(mLTEModuleOperationSMState) { case LTE_MODULE_OPERATION_INIT_STATE: { mIsInitializing = true; //Send the request to connect module APN LTESendCommandToModule(LTE_MODULE_CONNECT_APN_CMD); mLTEModuleOperationSMState = LTE_MODULE_OPERATION_WAIT_CONNECT_APN_STATE; break; } case LTE_MODULE_OPERATION_WAIT_CONNECT_APN_STATE: { if(OperationEvent == LTE_MODULE_OP_APN_CONN_OK_EVENT) { //Send the request to confirm the state of the connection LTESendCommandToModule(LTE_MODULE_CHECK_APN_CONNECTION_CMD); mLTEModuleOperationSMState = LTE_MODULE_OPERATION_CHECK_APN_STATE; } 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) { if(IsTimerExpired(LTE_COMM_TIMER) == true) { LTEModuleReset(); } } break; } case LTE_MODULE_OPERATION_CHECK_APN_STATE: { if(OperationEvent == LTE_MODULE_OP_APN_CONNECTED_EVENT) { if(mIsInitializing == true) //The first time, try to connect the server immediately { mIsInitializing = false; //Send the request to connect to Mastercontroller LTESendCommandToModule(LTE_MODULE_CONNECT_TO_MASTER_CMD); mLTEModuleOperationSMState = LTE_MODULE_OPERATION_WAIT_CONNECT_SERVER_STATE; } else { mCurrentCmd = LTE_MODULE_NO_CMD; mLTEModuleOperationSMState = LTE_MODULE_OPERATION_STANDBY_STATE; } } else if(OperationEvent == LTE_MODULE_OP_APN_DISCONNECTED_EVENT) { //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) { if(IsTimerExpired(LTE_COMM_TIMER) == true) { LTEModuleReset(); } } break; } case LTE_MODULE_OPERATION_WAIT_CONNECT_SERVER_STATE: { if(OperationEvent == LTE_MODULE_OP_SERVER_CONNECTED_EVENT) { mCurrentCmd = LTE_MODULE_NO_CMD; mLTEModuleOperationSMState = LTE_MODULE_OPERATION_STANDBY_STATE; TimerStart(LTE_MODULE_TIMER,LTE_MODULE_CONNECTION_CHECK_TIMEOUT); } else if(OperationEvent == LTE_MODULE_OP_SERVER_DISCONNECTED_EVENT) { mCurrentCmd = LTE_MODULE_NO_CMD; mLTEModuleOperationSMState = LTE_MODULE_OPERATION_STANDBY_STATE; TimerStart(LTE_MODULE_TIMER,LTE_MODULE_CONNECTION_CHECK_TIMEOUT); } else if(OperationEvent == LTE_MODULE_OP_SERVER_CONN_FAILED_EVENT) { //TODO: Should we reset the module instead? mCurrentCmd = LTE_MODULE_NO_CMD; mLTEModuleOperationSMState = LTE_MODULE_OPERATION_STANDBY_STATE; TimerStart(LTE_MODULE_TIMER,LTE_MODULE_CONNECTION_CHECK_TIMEOUT); } else if(OperationEvent == LTE_MODULE_OP_TICK_EVENT) { if(IsTimerExpired(LTE_COMM_TIMER) == true) { LTEModuleReset(); } } break; } case LTE_MODULE_OPERATION_WAIT_DISCONNECT_SERVER_STATE: { if(OperationEvent == LTE_MODULE_OP_SERVER_DISCONNECTED_EVENT) { //Always reconnect after a forced disconnection.. 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: { if(IsTimerExpired(LTE_MODULE_TIMER) == true) { if(mMasterConnected == true) //All is good for now... { char tmp[] = "Ca marche\n\r"; mNbMasterReconnectCount = 0; TimerStart(LTE_MODULE_TIMER,LTE_MODULE_CONNECTION_CHECK_TIMEOUT); } else { //Master connection is lost... try to reconnect. if(mNbMasterReconnectCount < LTE_MODULE_MAX_MASTER_CONNECT_RETRY) { mNbMasterReconnectCount++; 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"); } else //We tried 10 times, check the APN { mLTEModuleOperationSMState = LTE_MODULE_OPERATION_CHECK_APN_STATE; 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"); } } } break; } case LTE_MODULE_OPERATION_RECONNECT_MASTER_SUBSTATE: { 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; // } break; } case LTE_MODULE_OPERATION_CHECK_APN_SUBSTATE: { if(mAPNConnected == true) { mLTEModuleOperationSMSubState = LTE_MODULE_OPERATION_NOMINAL_SUBSTATE; } else //APN is disconnected.. try reconnecting. { mLTEModuleOperationSMState = LTE_MODULE_OPERATION_WAIT_CONNECT_APN_STATE; mLTEModuleOperationSMSubState = LTE_MODULE_OPERATION_RECONNECT_APN_SUBSTATE; LTESendCommandToModule(LTE_MODULE_CONNECT_APN_CMD); } break; } case LTE_MODULE_OPERATION_RECONNECT_APN_SUBSTATE: { mLTEModuleOperationSMSubState = LTE_MODULE_OPERATION_NOMINAL_SUBSTATE; break; } default: { break; } } } else if(OperationEvent == LTE_MODULE_OP_MASTER_DATA_READY_EVENT) { LTESendCommandToModule(LTE_MODULE_RX_DATA_CMD); mLTEModuleOperationSMState = LTE_MODULE_OPERATION_WAIT_FOR_DATA_STATE; } else if(OperationEvent == LTE_MODULE_OP_MASTER_SEND_DATA_REQUEST_EVENT) { if(mMasterConnected == true) { LTESendCommandToModule(LTE_MODULE_TX_DATA_CMD); mLTEModuleOperationSMState = LTE_MODULE_OPERATION_SENDING_DATA_STATE; } } break; } case LTE_MODULE_OPERATION_WAIT_FOR_DATA_STATE: { 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; } case LTE_MODULE_OPERATION_SENDING_DATA_STATE: { if(OperationEvent == LTE_MODULE_OP_TICK_EVENT) { if(IsTimerExpired(LTE_COMM_TIMER) == true) { LTEModuleReset(); } } else if(OperationEvent == LTE_MODULE_OP_MASTER_DATA_SENT_EVENT) { mCurrentCmd = LTE_MODULE_NO_CMD; mLTEModuleOperationSMState = LTE_MODULE_OPERATION_STANDBY_STATE; } break; } } } void LTEModuleNewDataReady() { LTEModuleOperationSM(LTE_MODULE_OP_MASTER_DATA_READY_EVENT); } void LTEModuleDataReceived(char *Data, int Size) { LTEModuleOperationSM(LTE_MODULE_OP_MASTER_DATA_RECEIVED_EVENT); int i; for(i = 0; i < Size; i++) { ProtocolAnalyzeNewData(Data[i], NETWORK_PROTOCOL_USER_LTE); } } 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; SendDataToLteModule(mActivateNetworkCmd,strlen(mActivateNetworkCmd)); break; } case LTE_MODULE_DISCONNECT_APN_CMD: { mCurrentCmd = LTE_MODULE_DISCONNECT_APN_CMD; SendDataToLteModule(mDisconnectNetworkCmd,strlen(mDisconnectNetworkCmd)); break; } case LTE_MODULE_CONNECT_TO_MASTER_CMD: { mCurrentCmd = LTE_MODULE_CONNECT_TO_MASTER_CMD; SendDataToLteModule(mConnectToMasterCmd,strlen(mConnectToMasterCmd)); break; } case LTE_MODULE_DISCONNECT_FROM_MASTER_CMD: { mCurrentCmd = LTE_MODULE_DISCONNECT_FROM_MASTER_CMD; SendDataToLteModule(mDisconnectFromMasterCmd,strlen(mDisconnectFromMasterCmd)); break; } case LTE_MODULE_RX_DATA_CMD: { mCurrentCmd = LTE_MODULE_RX_DATA_CMD; SendDataToLteModule(mReceiveDataCmd,strlen(mReceiveDataCmd)); break; } case LTE_MODULE_TX_DATA_CMD: { char Cmd[25]; sprintf(Cmd,"AT+CASEND=0,%d\r",mMasterTxSize); mCurrentCmd = LTE_MODULE_TX_DATA_CMD; SendDataToLteModule(Cmd,strlen(Cmd)); break; } case LTE_MODULE_CHECK_APN_CONNECTION_CMD: { mCurrentCmd = LTE_MODULE_CHECK_APN_CONNECTION_CMD; SendDataToLteModule(mCheckAPNConnectionCmd,strlen(mCheckAPNConnectionCmd)); break; } case LTE_MODULE_CHECK_MASTER_CONNECTION_CMD: { break; } case LTE_MODULE_NO_CMD: default: { TimerStop(LTE_COMM_TIMER); mCurrentCmd = LTE_MODULE_NO_CMD; return RET_ERROR; break; } } return RET_OK; } void LTEModuleMasterCtrlCommStatus(bool Offline) { if(Offline == true) { mMasterConnected = false; } // 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; } if(mMasterConnected == false) { return RET_ERROR; } memcpy(mMasterTxBuffer,Buffer,Size); mMasterTxSize = Size; LTEModuleOperationSM(LTE_MODULE_OP_MASTER_SEND_DATA_REQUEST_EVENT); return RET_OK; } //The module is ready... send the payload so it can transmit it to the master int LTESendMasterBufferToModule() { SendDataToLteModule(mMasterTxBuffer,mMasterTxSize); // LTE_MODULE_TX_LED_PIN = LED_OFF; return RET_OK; } bool LTEModuleIsMasterConnected() { return mMasterConnected; }