Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 
 

344 řádky
14 KiB

  1. #include "LTENetworkInterface.h"
  2. #include "NetworkProtocol.h"
  3. #include "SIM7080GInterface.h"
  4. #include "timer.h"
  5. #include "ChaletPowerRelay.h"
  6. #include "HarakiriRelay.h"
  7. #include "BatteryMonitor.h"
  8. #include "LedLightCtrl.h"
  9. #include "TemperatureSensor.h"
  10. #include "SPI_Flash.h"
  11. #include "FlashMapping.h"
  12. #include "LoraWatchdog.h"
  13. #include "versionbuild.h"
  14. #include "WiFiCtrl.h"
  15. #include "BoardCfg.h"
  16. int mLTENWISMState;
  17. static const char mFirmwareVersion[15] = VERSIONNUMBER;
  18. #define LORA_CHALET_STATUS_CUR_SENSOR_MASK 0x02
  19. #define LORA_CHALET_STATUS_POWER_RELAY_MASK 0x01
  20. unsigned int mLTETotalMasterNbRequests = 0;
  21. void LTENetworkInterfaceInit()
  22. {
  23. ProtocolInit(NETWORK_PROTOCOL_USER_LTE);
  24. mLTENWISMState = LTE_NWI_INIT_STATE;
  25. }
  26. void ExecuteLTEMasterCommand(int SenderID, int Command, unsigned char *Data, int DataSize)
  27. {
  28. KickLoraWatchdog();
  29. // ChaletPowerRelayKickTimer();
  30. mLTETotalMasterNbRequests++;
  31. // LTE_MODULE_RX_LED_PIN = LED_OFF;
  32. switch(SenderID)
  33. {
  34. case ID_MASTER:
  35. {
  36. switch(Command)
  37. {
  38. case CHALET_INTERFACE_ACK:
  39. {
  40. break;
  41. }
  42. case CHALET_GENERAL_STATUS_REQUEST:
  43. {
  44. // float FloatVoltage = GetBatteryVoltage(1);
  45. //// float FloatTemperature = TempSensorGetTemp();
  46. // unsigned int BattVoltage = *((int*)&FloatVoltage);
  47. // unsigned int Temperature = *((int*)&FloatTemperature);
  48. // int SolarPanelCurrent = GetSolarPanelCurrent();
  49. // int SOC = GetBatterySOC();
  50. //
  51. // char GeneralStatus = 0;
  52. // char ChaletStatus[18];
  53. //
  54. // if(GetChaletPowerRelayState() == CHALET_POWER_RELAY_ON_STATE)
  55. // {
  56. // GeneralStatus |= LORA_CHALET_STATUS_POWER_RELAY_MASK;
  57. // }
  58. // if(GetCurrentModuleOK() == true)
  59. // {
  60. // GeneralStatus |= LORA_CHALET_STATUS_CUR_SENSOR_MASK;
  61. // }
  62. //
  63. // ChaletStatus[0] = GeneralStatus; //General Status
  64. // ChaletStatus[1] = GetWiFiSate(); //Wifi Module state
  65. //
  66. // ChaletStatus[2] = (char)(BattVoltage & 0x000000FF); //Battery Voltage 1
  67. // BattVoltage >>= 8;
  68. // ChaletStatus[3] = (char)(BattVoltage & 0x000000FF); //Battery Voltage 2
  69. // BattVoltage >>= 8;
  70. // ChaletStatus[4] = (char)(BattVoltage & 0x000000FF); //Battery Voltage 3
  71. // BattVoltage >>= 8;
  72. // ChaletStatus[5] = (char)(BattVoltage & 0x000000FF); //Battery Voltage 4
  73. //
  74. // ChaletStatus[6] = (char)(SolarPanelCurrent & 0x000000FF); //Solar panel Current 1
  75. // SolarPanelCurrent >>= 8;
  76. // ChaletStatus[7] = (char)(SolarPanelCurrent & 0x000000FF); //Solar panel Current 2
  77. //
  78. // ChaletStatus[8] = (char)(SOC & 0x000000FF); //Battery SOC 1
  79. // SolarPanelCurrent >>= 8;
  80. // ChaletStatus[9] = (char)(SolarPanelCurrent & 0x000000FF); //Battery SOC 2
  81. //
  82. // ChaletStatus[10] = (char)(Temperature & 0x000000FF); //Temperature 1
  83. // Temperature >>= 8;
  84. // ChaletStatus[11] = (char)(Temperature & 0x000000FF); //Temperature 2
  85. // Temperature >>= 8;
  86. // ChaletStatus[12] = (char)(Temperature & 0x000000FF); //BTemperature 3
  87. // Temperature >>= 8;
  88. // ChaletStatus[13] = (char)(Temperature & 0x000000FF); //Temperature 4
  89. //
  90. // int tmp = mLTETotalMasterNbRequests;
  91. // ChaletStatus[14] = (char)(mLTETotalMasterNbRequests & 0x000000FF); //Total Nb Requests 1
  92. // mLTETotalMasterNbRequests >>= 8;
  93. // ChaletStatus[15] = (char)(mLTETotalMasterNbRequests & 0x000000FF); //Total Nb Requests 2
  94. // mLTETotalMasterNbRequests >>= 8;
  95. // ChaletStatus[16] = (char)(mLTETotalMasterNbRequests & 0x000000FF); //Total Nb Requests 3
  96. // mLTETotalMasterNbRequests >>= 8;
  97. // ChaletStatus[17] = (char)(mLTETotalMasterNbRequests & 0x000000FF); //Total Nb Requests 4
  98. // mLTETotalMasterNbRequests = tmp;
  99. //
  100. //
  101. // SendLTENetworkCommand(CHALET_GENERAL_STATUS_RESPONSE,ChaletStatus,18);
  102. //
  103. // HEARTBEAT_LED_1_PIN = ~HEARTBEAT_LED_1_PIN;
  104. break;
  105. }
  106. case CHALET_AC_POWER_STATE_STATUS_REQUEST:
  107. {
  108. // char PowerStatus = GetChaletPowerRelayState();
  109. // SendLTENetworkCommand(CHALET_AC_POWER_STATE_STATUS_RESPONSE,&PowerStatus,1);
  110. break;
  111. }
  112. case CHALET_AC_POWER_SET_STATE_REQUEST:
  113. {
  114. // char response = CHALET_POWER_RELAY_UNKNOWN_STATE;
  115. // if(Data[0] == CHALET_POWER_RELAY_OFF_STATE)
  116. // {
  117. // ChaletPowerRelayTurnOff();
  118. // response = CHALET_POWER_RELAY_OFF_STATE;
  119. // }
  120. // else if(Data[0] == CHALET_POWER_RELAY_ON_STATE)
  121. // {
  122. // ChaletPowerRelayTurnOn();
  123. // response = CHALET_POWER_RELAY_ON_STATE;
  124. // }
  125. // else
  126. // {
  127. // //invalid state requested.... don't do anything
  128. // response = CHALET_POWER_RELAY_UNKNOWN_STATE;
  129. // }
  130. //
  131. // SendLTENetworkCommand(CHALET_AC_POWER_SET_STATE_RESPONSE,&response,1);
  132. //
  133. break;
  134. }
  135. case CHALET_BATTERY_VOLTAGE_REQUEST:
  136. {
  137. break;
  138. }
  139. case CHALET_WIFI_STATUS_REQUEST:
  140. {
  141. char response[5];
  142. uint32 IPAddress = GetCurIPAddress();
  143. response[0] = GetWiFiSate(); //Wifi Module state
  144. response[1] = IPV4_BYTE(IPAddress,0);
  145. response[2] = IPV4_BYTE(IPAddress,1);
  146. response[3] = IPV4_BYTE(IPAddress,2);
  147. response[4] = IPV4_BYTE(IPAddress,3);
  148. SendLTENetworkCommand(CHALET_WIFI_STATUS_RESPONSE,(unsigned char*)&response,5);
  149. break;
  150. }
  151. case CHALET_WIFI_SET_STATE_REQUEST:
  152. {
  153. char response = WIFI_UNKNOWN_STATE;
  154. if(Data[0] == 0)
  155. {
  156. TurnOFFWiFi();
  157. response = 0;
  158. }
  159. else if(Data[0] == 1)
  160. {
  161. if(GetWiFiSate() != WIFI_CONNECTED_STATE)
  162. {
  163. InitWiFi();
  164. response = GetWiFiSate();
  165. }
  166. else
  167. {
  168. response = 1;
  169. }
  170. }
  171. else
  172. {
  173. //invalid state requested.... don't do anything
  174. response = WIFI_UNKNOWN_STATE;
  175. }
  176. SendLTENetworkCommand(CHALET_WIFI_SET_STATE_RESPONSE,&response,1);
  177. break;
  178. }
  179. case CHALET_DO_HARAKIRI_REQUEST:
  180. {
  181. // char response;
  182. // if(Data[0] == 0xBA &&
  183. // Data[1] == 0xAD &&
  184. // Data[2] == 0xBE &&
  185. // Data[3] == 0xEF)
  186. // {
  187. // //Magic word is OK... let's suicide...
  188. // response = 0x01;
  189. // //First, send an ACK to master (this is blocking so it's OK)
  190. // SendLTENetworkCommand(CHALET_DO_HARAKIRI_CONFIRMATION,&response,1);
  191. // HarakiriRelayTurnOff();
  192. // }
  193. // else
  194. // {
  195. // response = 0x00;
  196. // SendLTENetworkCommand(CHALET_DO_HARAKIRI_CONFIRMATION,&response,1);
  197. // }
  198. break;
  199. }
  200. case CHALET_REBOOT_CPU_REQUEST:
  201. {
  202. char response;
  203. if(Data[0] == 0xBA &&
  204. Data[1] == 0xAD &&
  205. Data[2] == 0xCA &&
  206. Data[3] == 0xFE)
  207. {
  208. //Magic word is OK... let's reboot...
  209. response = 0x01;
  210. //First, send an ACK to master (this is blocking so it's OK)
  211. SendLTENetworkCommand(CHALET_REBOOT_CPU_RESPONSE,&response,1);
  212. Sleep(100);
  213. TurnOFFWiFi();
  214. Sleep(100);
  215. SoftReset();
  216. }
  217. else
  218. {
  219. response = 0x00;
  220. SendLTENetworkCommand(CHALET_DO_HARAKIRI_CONFIRMATION,&response,1);
  221. }
  222. break;
  223. }
  224. case CHALET_GET_STORED_WIFI_SETTINGS_REQUEST:
  225. {
  226. char response[140];
  227. char WifiDataSize;
  228. SPIFlashReadBuffer(response,11,FLASH_WIFI_IP_ADDRESS);
  229. WifiDataSize = 11 + response[9] + response[10];
  230. if(WifiDataSize > 140)
  231. break;
  232. SPIFlashReadBuffer(response,WifiDataSize,FLASH_WIFI_IP_ADDRESS);
  233. SendLTENetworkCommand(CHALET_GET_STORED_WIFI_SETTINGS_RESPONSE,response,WifiDataSize);
  234. break;
  235. }
  236. case CHALET_SET_STORED_WIFI_SETTINGS_REQUEST:
  237. {
  238. char response = 0;
  239. if(SPIFlashWriteBuffer(Data,DataSize,FLASH_WIFI_IP_ADDRESS) == 1)
  240. {
  241. response = 1;
  242. }
  243. SendLTENetworkCommand(CHALET_SET_STORED_WIFI_SETTINGS_RESPONSE,&response,1);
  244. break;
  245. }
  246. case CHALET_GET_FIRMWARE_VERSION_REQUEST:
  247. {
  248. SendLTENetworkCommand(CHALET_GET_FIRMWARE_VERSION_RESPONSE,(unsigned char*)mFirmwareVersion,15);
  249. break;
  250. }
  251. case CHALET_CLEAR_COMMS_STATISTICS_REQUEST:
  252. {
  253. char response = 1;
  254. mLTETotalMasterNbRequests = 0;
  255. SendLTENetworkCommand(CHALET_CLEAR_COMMS_STATISTICS_RESPONSE,&response,1);
  256. break;
  257. }
  258. case ETH_NETWK_DEVICE_INFO_REQUEST:
  259. {
  260. char data[2];
  261. data[0] = ID_CHALET_DEVICE;
  262. data[1] = MY_DEVICE_ADDRESS;
  263. int PayloadSize;
  264. unsigned char *response = ProtocolGetFrame(ID_MASTER,MASTER_ADDRESS,ID_ETHERNET_VIRTUAL,ETH_NETWK_DEVICE_INFO_RESPONSE, data,2,0, &PayloadSize);
  265. LTESendDataToMaster((char*)response,PayloadSize);
  266. break;
  267. }
  268. case ETH_NETWK_SET_DEVICE_INFO_ACK:
  269. {
  270. LTENetworInterfaceExecSM(LTE_NWI_MASTER_CONNECTED_EVENT);
  271. break;
  272. }
  273. case ETH_NETWK_CONNECTION_REFUSED:
  274. {
  275. //TODO: reset the TCP module to retry connection???
  276. break;
  277. }
  278. }
  279. break;
  280. }
  281. default:
  282. {
  283. break;
  284. }
  285. }
  286. }
  287. void TickLTENetworkInterface()
  288. {
  289. LTENetworInterfaceExecSM(LTE_NWI_TICK_EVENT);
  290. }
  291. void LTENetworInterfaceExecSM(int Event)
  292. {
  293. switch(mLTENWISMState)
  294. {
  295. case LTE_NWI_INIT_STATE:
  296. {
  297. mLTENWISMState = LTE_NWI_CONNECT_TO_MASTER_STATE;
  298. TimerStart(LTE_NWI_TIMER,LTE_NWI_MASTER_CONNECT_POLL_INTERVAL);
  299. break;
  300. }
  301. case LTE_NWI_WAIT_FOR_LTE_STATE:
  302. {
  303. //Not necessary... master will init handshake on TCP connection....
  304. break;
  305. }
  306. case LTE_NWI_CONNECT_TO_MASTER_STATE: //Here we wait for the master to initiate the handshake after a TCP connection
  307. {
  308. if(Event == LTE_NWI_MASTER_CONNECTED_EVENT)
  309. {
  310. mLTENWISMState = LTE_NWI_OPERATE_STATE;
  311. }
  312. break;
  313. }
  314. case LTE_NWI_OPERATE_STATE:
  315. {
  316. if(Event == LTE_NWI_TICK_EVENT)
  317. {
  318. }
  319. break;
  320. }
  321. }
  322. }
  323. void SendLTENetworkCommand(int Command, unsigned char *Data, unsigned int DataSize)
  324. {
  325. unsigned char *Payload;
  326. unsigned int PayloadSize;
  327. Payload = ProtocolGetFrame(ID_MASTER,MASTER_ADDRESS,ID_CHALET_DEVICE,Command,Data,DataSize,0,&PayloadSize);
  328. LTESendDataToMaster(Payload,PayloadSize);
  329. }