25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 
 
 

307 satır
9.0 KiB

  1. #include "LoraNetworkInterface.h"
  2. #include "ProtocolDefs.h"
  3. #include "NetworkProtocol.h"
  4. #include "InternalUart.h"
  5. #include "define.h"
  6. #include "BoardCfg.h"
  7. #include "Uart.h"
  8. #include "ChaletPowerRelay.h"
  9. #include "HarakiriRelay.h"
  10. #include "BatteryMonitor.h"
  11. #include "LedLightCtrl.h"
  12. #include "TemperatureSensor.h"
  13. #include "SPI_Flash.h"
  14. #include "FlashMapping.h"
  15. #include "LoraWatchdog.h"
  16. #include "versionbuild.h"
  17. #include "WiFiCtrl.h"
  18. //#include "WiFiCtrl.h"
  19. //
  20. //enum eWiFiState
  21. //{
  22. // WIFI_MODULE_OFF_STATE = 0,
  23. // WIFI_CONNECTED_STATE,
  24. // WIFI_DISCONNECTED_STATE,
  25. // WIFI_INIT_ERROR_STATE,
  26. // WIFI_UNKNOWN_STATE
  27. //};
  28. unsigned char mLoraPreamble[3]={0x00,LORA_MASTER_ADDRESS,LORA_CHANNEL};
  29. static const char mFirmwareVersion[15] = VERSIONNUMBER;
  30. unsigned int mTotalMasterNbRequests = 0;
  31. void LoraNetworkInterfaceInit()
  32. {
  33. ProtocolInit(NETWORK_PROTOCOL_USER_LORA);
  34. }
  35. void ExecuteLoraMasterCommand(int Command, unsigned char *Data, int DataSize)
  36. {
  37. //Whatever was the command, we are online...
  38. // LORA_MODULE_RX_LED_PIN = LED_OFF;
  39. KickLoraWatchdog();
  40. // printf("EXEC\n\n");
  41. // ChaletPowerRelayKickTimer();
  42. mTotalMasterNbRequests++;
  43. switch(Command)
  44. {
  45. case CHALET_INTERFACE_ACK:
  46. {
  47. break;
  48. }
  49. case CHALET_GENERAL_STATUS_REQUEST:
  50. {
  51. // float FloatVoltage = GetBatteryVoltage(1);
  52. // float FloatTemperature = TempSensorGetTemp();
  53. // unsigned int BattVoltage = *((int*)&FloatVoltage);
  54. // unsigned int Temperature = *((int*)&FloatTemperature);
  55. // int SolarPanelCurrent = GetSolarPanelCurrent();
  56. // int SOC = GetBatterySOC();
  57. //
  58. // char GeneralStatus = 0;
  59. // char ChaletStatus[18];
  60. //
  61. // if(GetChaletPowerRelayState() == CHALET_POWER_RELAY_ON_STATE)
  62. // {
  63. // GeneralStatus |= LORA_CHALET_STATUS_POWER_RELAY_MASK;
  64. // }
  65. // if(GetCurrentModuleOK() == true)
  66. // {
  67. // GeneralStatus |= LORA_CHALET_STATUS_CUR_SENSOR_MASK;
  68. // }
  69. //
  70. // ChaletStatus[0] = GeneralStatus; //General Status
  71. // ChaletStatus[1] = GetWiFiSate(); //Wifi Module state
  72. //
  73. // ChaletStatus[2] = (char)(BattVoltage & 0x000000FF); //Battery Voltage 1
  74. // BattVoltage >>= 8;
  75. // ChaletStatus[3] = (char)(BattVoltage & 0x000000FF); //Battery Voltage 2
  76. // BattVoltage >>= 8;
  77. // ChaletStatus[4] = (char)(BattVoltage & 0x000000FF); //Battery Voltage 3
  78. // BattVoltage >>= 8;
  79. // ChaletStatus[5] = (char)(BattVoltage & 0x000000FF); //Battery Voltage 4
  80. //
  81. // ChaletStatus[6] = (char)(SolarPanelCurrent & 0x000000FF); //Solar panel Current 1
  82. // SolarPanelCurrent >>= 8;
  83. // ChaletStatus[7] = (char)(SolarPanelCurrent & 0x000000FF); //Solar panel Current 2
  84. //
  85. // ChaletStatus[8] = (char)(SOC & 0x000000FF); //Battery SOC 1
  86. // SolarPanelCurrent >>= 8;
  87. // ChaletStatus[9] = (char)(SolarPanelCurrent & 0x000000FF); //Battery SOC 2
  88. //
  89. // ChaletStatus[10] = (char)(Temperature & 0x000000FF); //Temperature 1
  90. // Temperature >>= 8;
  91. // ChaletStatus[11] = (char)(Temperature & 0x000000FF); //Temperature 2
  92. // Temperature >>= 8;
  93. // ChaletStatus[12] = (char)(Temperature & 0x000000FF); //BTemperature 3
  94. // Temperature >>= 8;
  95. // ChaletStatus[13] = (char)(Temperature & 0x000000FF); //Temperature 4
  96. //
  97. // int tmp = mTotalMasterNbRequests;
  98. // ChaletStatus[14] = (char)(mTotalMasterNbRequests & 0x000000FF); //Total Nb Requests 1
  99. // mTotalMasterNbRequests >>= 8;
  100. // ChaletStatus[15] = (char)(mTotalMasterNbRequests & 0x000000FF); //Total Nb Requests 2
  101. // mTotalMasterNbRequests >>= 8;
  102. // ChaletStatus[16] = (char)(mTotalMasterNbRequests & 0x000000FF); //Total Nb Requests 3
  103. // mTotalMasterNbRequests >>= 8;
  104. // ChaletStatus[17] = (char)(mTotalMasterNbRequests & 0x000000FF); //Total Nb Requests 4
  105. // mTotalMasterNbRequests = tmp;
  106. //
  107. //
  108. // SendLoraNetworkCommand(CHALET_GENERAL_STATUS_RESPONSE,ChaletStatus,18);
  109. HEARTBEAT_LED_1_PIN = ~HEARTBEAT_LED_1_PIN;
  110. break;
  111. }
  112. case CHALET_AC_POWER_STATE_STATUS_REQUEST:
  113. {
  114. // char PowerStatus = GetChaletPowerRelayState();
  115. // SendLoraNetworkCommand(CHALET_AC_POWER_STATE_STATUS_RESPONSE,&PowerStatus,1);
  116. break;
  117. }
  118. case CHALET_AC_POWER_SET_STATE_REQUEST:
  119. {
  120. // char response = CHALET_POWER_RELAY_UNKNOWN_STATE;
  121. // if(Data[0] == CHALET_POWER_RELAY_OFF_STATE)
  122. // {
  123. // ChaletPowerRelayTurnOff();
  124. // response = CHALET_POWER_RELAY_OFF_STATE;
  125. // }
  126. // else if(Data[0] == CHALET_POWER_RELAY_ON_STATE)
  127. // {
  128. // ChaletPowerRelayTurnOn();
  129. // response = CHALET_POWER_RELAY_ON_STATE;
  130. // }
  131. // else
  132. // {
  133. // //invalid state requested.... don't do anything
  134. // response = CHALET_POWER_RELAY_UNKNOWN_STATE;
  135. // }
  136. //
  137. // SendLoraNetworkCommand(CHALET_AC_POWER_SET_STATE_RESPONSE,&response,1);
  138. break;
  139. }
  140. case CHALET_BATTERY_VOLTAGE_REQUEST:
  141. {
  142. break;
  143. }
  144. case CHALET_WIFI_STATUS_REQUEST:
  145. {
  146. char response[5];
  147. uint32 IPAddress = GetCurIPAddress();
  148. response[0] = GetWiFiSate(); //Wifi Module state
  149. response[1] = IPV4_BYTE(IPAddress,0);
  150. response[2] = IPV4_BYTE(IPAddress,1);
  151. response[3] = IPV4_BYTE(IPAddress,2);
  152. response[4] = IPV4_BYTE(IPAddress,3);
  153. SendLoraNetworkCommand(CHALET_WIFI_STATUS_RESPONSE,(unsigned char*)&response,5);
  154. break;
  155. }
  156. case CHALET_WIFI_SET_STATE_REQUEST:
  157. {
  158. char response = WIFI_UNKNOWN_STATE;
  159. if(Data[0] == 0)
  160. {
  161. TurnOFFWiFi();
  162. response = 0;
  163. }
  164. else if(Data[0] == 1)
  165. {
  166. if(GetWiFiSate() != WIFI_CONNECTED_STATE)
  167. {
  168. InitWiFi();
  169. response = GetWiFiSate();
  170. }
  171. else
  172. {
  173. response = 1;
  174. }
  175. }
  176. else
  177. {
  178. //invalid state requested.... don't do anything
  179. response = WIFI_UNKNOWN_STATE;
  180. }
  181. SendLoraNetworkCommand(CHALET_WIFI_SET_STATE_RESPONSE,&response,1);
  182. break;
  183. }
  184. case CHALET_DO_HARAKIRI_REQUEST:
  185. {
  186. // char response;
  187. // if(Data[0] == 0xBA &&
  188. // Data[1] == 0xAD &&
  189. // Data[2] == 0xBE &&
  190. // Data[3] == 0xEF)
  191. // {
  192. // //Magic word is OK... let's suicide...
  193. // response = 0x01;
  194. // //First, send an ACK to master (this is blocking so it's OK)
  195. // SendLoraNetworkCommand(CHALET_DO_HARAKIRI_CONFIRMATION,&response,1);
  196. // HarakiriRelayTurnOff();
  197. // }
  198. // else
  199. // {
  200. // response = 0x00;
  201. // SendLoraNetworkCommand(CHALET_DO_HARAKIRI_CONFIRMATION,&response,1);
  202. // }
  203. break;
  204. }
  205. case CHALET_REBOOT_CPU_REQUEST:
  206. {
  207. char response;
  208. if(Data[0] == 0xBA &&
  209. Data[1] == 0xAD &&
  210. Data[2] == 0xCA &&
  211. Data[3] == 0xFE)
  212. {
  213. //Magic word is OK... let's reboot...
  214. response = 0x01;
  215. //First, send an ACK to master (this is blocking so it's OK)
  216. SendLoraNetworkCommandBlocking(CHALET_REBOOT_CPU_RESPONSE,&response,1);
  217. Sleep(100);
  218. TurnOFFWiFi();
  219. Sleep(100);
  220. SoftReset();
  221. }
  222. else
  223. {
  224. response = 0x00;
  225. SendLoraNetworkCommand(CHALET_DO_HARAKIRI_CONFIRMATION,&response,1);
  226. }
  227. break;
  228. }
  229. case CHALET_GET_STORED_WIFI_SETTINGS_REQUEST:
  230. {
  231. char response[140];
  232. char WifiDataSize;
  233. SPIFlashReadBuffer(response,11,FLASH_WIFI_IP_ADDRESS);
  234. WifiDataSize = 11 + response[9] + response[10];
  235. if(WifiDataSize > 140)
  236. break;
  237. SPIFlashReadBuffer(response,WifiDataSize,FLASH_WIFI_IP_ADDRESS);
  238. SendLoraNetworkCommand(CHALET_GET_STORED_WIFI_SETTINGS_RESPONSE,response,WifiDataSize);
  239. break;
  240. }
  241. case CHALET_SET_STORED_WIFI_SETTINGS_REQUEST:
  242. {
  243. char response = 0;
  244. if(SPIFlashWriteBuffer(Data,DataSize,FLASH_WIFI_IP_ADDRESS) == 1)
  245. {
  246. response = 1;
  247. }
  248. SendLoraNetworkCommand(CHALET_SET_STORED_WIFI_SETTINGS_RESPONSE,&response,1);
  249. break;
  250. }
  251. case CHALET_GET_FIRMWARE_VERSION_REQUEST:
  252. {
  253. SendLoraNetworkCommand(CHALET_GET_FIRMWARE_VERSION_RESPONSE,(unsigned char*)mFirmwareVersion,15);
  254. break;
  255. }
  256. case CHALET_CLEAR_COMMS_STATISTICS_REQUEST:
  257. {
  258. char response = 1;
  259. mTotalMasterNbRequests = 0;
  260. SendLoraNetworkCommand(CHALET_CLEAR_COMMS_STATISTICS_RESPONSE,&response,1);
  261. break;
  262. }
  263. }
  264. }
  265. void SendLoraNetworkCommand(int Command, unsigned char *Data, unsigned int DataSize)
  266. {
  267. unsigned char *Payload;
  268. unsigned int PayloadSize;
  269. //unsigned char DestDevice,unsigned char DestAddress, unsigned char SenderDevice, unsigned char Cmd, unsigned char *Data,unsigned int Size,unsigned char Flags, int *FrameSize)
  270. Payload = ProtocolGetFrame(ID_MASTER,MASTER_ADDRESS,ID_CHALET_DEVICE,Command,Data,DataSize,0,&PayloadSize);
  271. UartTransmitData(NETWORK_UART_PORT,mLoraPreamble,3);
  272. UartTransmitData(NETWORK_UART_PORT,Payload,PayloadSize);
  273. }
  274. void SendLoraNetworkCommandBlocking(int Command, unsigned char *Data, unsigned int DataSize)
  275. {
  276. unsigned char *Payload;
  277. unsigned int PayloadSize;
  278. //unsigned char DestDevice,unsigned char DestAddress, unsigned char SenderDevice, unsigned char Cmd, unsigned char *Data,unsigned int Size,unsigned char Flags, int *FrameSize)
  279. Payload = ProtocolGetFrame(ID_MASTER,MASTER_ADDRESS,ID_CHALET_DEVICE,Command,Data,DataSize,0,&PayloadSize);
  280. SendInternalUartDataBlocking(mLoraPreamble,3,NETWORK_UART_PORT);
  281. SendInternalUartDataBlocking(Payload,PayloadSize,NETWORK_UART_PORT);
  282. }
  283. void TestTx()
  284. {
  285. char toto = 0x03;
  286. SendInternalUartDataBlocking(mLoraPreamble,3,NETWORK_UART_PORT);
  287. }