You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

953 regels
25 KiB

  1. #include "WiFiCtrl.h"
  2. #include "string.h"
  3. #include "driver/include/nmasic.h"
  4. #include <stdint.h>
  5. //#include "socket/include/socket.h"
  6. #include "define.h"
  7. #include "Terminal.h"
  8. #include "driver/include/m2m_periph.h"
  9. #include "ProtocolDefs.h"
  10. #include "BoardCfg.h"
  11. #include "timer.h"
  12. #include "BootloaderProtocol.h"
  13. #include "SPI_Flash.h"
  14. #include "FlashMapping.h"
  15. #include "NetworkProtocol.h"
  16. /** IP address of host. */
  17. uint32 gu32HostIp = 0;
  18. /** Retry count. */
  19. uint8 gu8RetryCount = 0;
  20. /** TCP client socket handlers. */
  21. static SOCKET tcp_client_socket = -1;
  22. SOCKET TerminalSocket = -1, TerminalServerSocket = -1;
  23. uint8 TerminalRxBuf[1024];
  24. #ifdef USE_SYSLOG
  25. SOCKET SyslogSocket = -1, SyslogServerSocket = -1;
  26. uint8 SyslogRxBuf[200]; //Syslog shall not receive much data
  27. #endif
  28. SOCKET NetworkSocket = -1, NetworkServerSocket = -1;
  29. uint8 NetworkRxBuf[1024];
  30. SOCKET BootloaderSocket = -1, BootloaderServerSocket = -1;
  31. uint8 BootloaderRxBuf[1024];
  32. SOCKET AudioConsoleIFSocket = -1;
  33. uint8 AudioConsoleIFRxBuf[1024];
  34. /** Receive buffer definition. */
  35. static uint8 gau8ReceivedBuffer[MAIN_WIFI_M2M_BUFFER_SIZE] = {0};
  36. /** Wi-Fi status variable. */
  37. static bool gbConnectedWifi = false;
  38. /** Get host IP status variable. */
  39. static bool gbHostIpByName = false;
  40. /** TCP Connection status variable. */
  41. static bool gbTcpConnection = false;
  42. /** Server host name. */
  43. static char server_host_name[] = MAIN_WEATHER_SERVER_NAME;
  44. tstrWifiInitParam param;
  45. uint8 mac_addr[6];
  46. uint8 u8IsMacAddrValid;
  47. struct sockaddr_in addr_in;
  48. uint32 mCurIPAddress;
  49. tstrM2MIPConfig mModuleIPConfig;
  50. bool mWiFiInitOK = false;
  51. char mWiFiState = WIFI_MODULE_OFF_STATE; //JFM wifi module is always OFF at boot...
  52. /**
  53. * \brief Callback function of IP address.
  54. *
  55. * \param[in] hostName Domain name.
  56. * \param[in] hostIp Server IP.
  57. *
  58. * \return None.
  59. */
  60. static void resolve_cb(uint8 *hostName, uint32 hostIp)
  61. {
  62. gu32HostIp = hostIp;
  63. gbHostIpByName = true;
  64. char IP1,IP2,IP3,IP4;
  65. IP1 = IPV4_BYTE(hostIp, 0);
  66. IP2 = IPV4_BYTE(hostIp, 1);
  67. IP3 = IPV4_BYTE(hostIp, 2);
  68. IP4 = IPV4_BYTE(hostIp, 3);
  69. printf("Host IP is %d.%d.%d.%d\r\n",
  70. (int)IPV4_BYTE(hostIp, 0),
  71. (int)IPV4_BYTE(hostIp, 1),
  72. (int)IPV4_BYTE(hostIp, 2),
  73. (int)IPV4_BYTE(hostIp, 3));
  74. printf("Host Name is %s\r\n", hostName);
  75. }
  76. static void socket_cb(SOCKET sock, uint8 u8Msg, void *pvMsg)
  77. {
  78. /* Check for socket event on TCP socket. */
  79. //if(sock == TerminalSocket)
  80. {
  81. switch(u8Msg)
  82. {
  83. case SOCKET_MSG_BIND:
  84. {
  85. tstrSocketBindMsg *pstrBind = (tstrSocketBindMsg*)pvMsg;
  86. if(pstrBind->status == 0)
  87. {
  88. if(sock == TerminalServerSocket)
  89. {
  90. listen(TerminalServerSocket, 0);
  91. }
  92. else if(sock == SyslogServerSocket)
  93. {
  94. listen(SyslogServerSocket,0);
  95. }
  96. else if(sock == NetworkServerSocket)
  97. {
  98. listen(NetworkServerSocket,0);
  99. }
  100. else if(sock == BootloaderServerSocket)
  101. {
  102. listen(BootloaderServerSocket,0);
  103. printf("Bootloader server started\n");
  104. }
  105. }
  106. else
  107. {
  108. printf("Bind Failed\n");
  109. }
  110. break;
  111. }
  112. case SOCKET_MSG_LISTEN:
  113. {
  114. tstrSocketListenMsg *pstrListen = (tstrSocketListenMsg*)pvMsg;
  115. if(pstrListen->status != 0)
  116. {
  117. printf("socket %d listen Failed. Error: %d\n",(int)sock, pstrListen->status);
  118. break;
  119. }
  120. if(sock == SyslogServerSocket)
  121. {
  122. m2m_periph_gpio_set_val(M2M_PERIPH_GPIO3,1);
  123. }
  124. break;
  125. }
  126. case SOCKET_MSG_ACCEPT:
  127. {
  128. // New Socket is accepted.
  129. tstrSocketAcceptMsg *pstrAccept = (tstrSocketAcceptMsg *)pvMsg;
  130. if(pstrAccept->sock >= 0)
  131. {
  132. if(sock == TerminalServerSocket)
  133. {
  134. memset(TerminalRxBuf,0,sizeof(TerminalRxBuf));
  135. // Get the accepted socket.
  136. TerminalSocket = pstrAccept->sock;
  137. recv(TerminalSocket, TerminalRxBuf, sizeof(TerminalRxBuf), 0);
  138. SendTerminalData("Bienvenue au chalet!\nLe chalet parle en anglais comme Mr. Pepin\nIf you need help... type help\n\n",strlen("Bienvenue au chalet!\nLe chalet parle en anglais comme Mr. Pepin\nIf you need help... type help\n\n"));
  139. // SendSyslogData("Terminal client connected\n",strlen("Terminal client connected\n"));
  140. printf("Terminal client connected\n");
  141. m2m_periph_gpio_set_val(M2M_PERIPH_GPIO4,1);
  142. }
  143. else if(sock == SyslogServerSocket)
  144. {
  145. memset(SyslogRxBuf,0,sizeof(SyslogRxBuf));
  146. // Get the accepted socket.
  147. SyslogSocket = pstrAccept->sock;
  148. recv(SyslogSocket, SyslogRxBuf, sizeof(SyslogRxBuf), 0);
  149. m2m_periph_gpio_set_val(M2M_PERIPH_GPIO4,1);
  150. SendSyslogData("Syslog Welcome\n",strlen("Syslog Welcome\n"));
  151. }
  152. else if(sock == NetworkServerSocket)
  153. {
  154. memset(NetworkRxBuf,0,sizeof(NetworkRxBuf));
  155. // Get the accepted socket.
  156. NetworkSocket = pstrAccept->sock;
  157. recv(NetworkSocket, NetworkRxBuf, sizeof(NetworkRxBuf), 0);
  158. printf("Network client connected\n");
  159. }
  160. else if(sock == BootloaderServerSocket)
  161. {
  162. memset(BootloaderRxBuf,0,sizeof(BootloaderRxBuf));
  163. // Get the accepted socket.
  164. BootloaderSocket = pstrAccept->sock;
  165. recv(BootloaderSocket, BootloaderRxBuf, sizeof(BootloaderRxBuf), 0);
  166. printf("Bootloader client connected\n");
  167. }
  168. }
  169. else
  170. {
  171. printf("Socket %d : Accept Failed\n", sock);
  172. }
  173. break;
  174. }
  175. case SOCKET_MSG_CONNECT:
  176. {
  177. // Connect Event Handler.
  178. tstrSocketConnectMsg *pstrConnect = (tstrSocketConnectMsg*)pvMsg;
  179. if(pstrConnect->s8Error == 0)
  180. {
  181. //connected..
  182. if(sock == AudioConsoleIFSocket)
  183. {
  184. recv(AudioConsoleIFSocket, AudioConsoleIFRxBuf, sizeof(AudioConsoleIFRxBuf), 0);
  185. printf("Audio console interface connected to MasterCtrl\n");
  186. }
  187. }
  188. else
  189. {
  190. printf("TCP Connection Failed\n");
  191. }
  192. break;
  193. }
  194. case SOCKET_MSG_RECV:
  195. {
  196. tstrSocketRecvMsg *pstrRecvMsg = (tstrSocketRecvMsg*)pvMsg;
  197. if((pstrRecvMsg->pu8Buffer != NULL) && (pstrRecvMsg->s16BufferSize > 0))
  198. {
  199. // Process the received message
  200. if(sock == TerminalSocket)
  201. {
  202. //Fwd data to Terminal...
  203. recv(TerminalSocket, TerminalRxBuf, sizeof(TerminalRxBuf), 0);
  204. RxTerminalBuf(TerminalRxBuf, pstrRecvMsg->s16BufferSize);
  205. }
  206. else if(sock == SyslogSocket)
  207. {
  208. //Fwd data to stdin...
  209. recv(SyslogSocket, SyslogRxBuf, sizeof(SyslogRxBuf), 0);
  210. RxSyslogBuf(SyslogRxBuf, pstrRecvMsg->s16BufferSize);
  211. }
  212. else if(sock == NetworkSocket)
  213. {
  214. recv(NetworkSocket, NetworkRxBuf, sizeof(NetworkRxBuf), 0);
  215. }
  216. else if(sock == BootloaderSocket)
  217. {
  218. if(recv(BootloaderSocket, BootloaderRxBuf, sizeof(BootloaderRxBuf), 0) != 0)
  219. {
  220. char toto;
  221. toto = 1;
  222. }
  223. BootloaderProtocolProtocolAnalyzeNewData(pstrRecvMsg->pu8Buffer, pstrRecvMsg->s16BufferSize);
  224. }
  225. else if(sock == AudioConsoleIFSocket)
  226. {
  227. recv(AudioConsoleIFSocket, AudioConsoleIFRxBuf, sizeof(AudioConsoleIFRxBuf), 0);
  228. ProtocolAnalyzeBuffer(AudioConsoleIFRxBuf, pstrRecvMsg->s16BufferSize,NETWORK_PROTOCOL_USER_AUDIO_CONSOLE_IF);
  229. }
  230. }
  231. else //Socket must be closed.
  232. {
  233. if(sock == TerminalSocket)
  234. {
  235. close(TerminalSocket);
  236. TerminalSocket = -1;
  237. // SendSyslogData("Terminal client disconnected\n",strlen("Terminal client disconnected\n"));
  238. printf("Terminal client disconnected\n");
  239. m2m_periph_gpio_set_val(M2M_PERIPH_GPIO4,0);
  240. }
  241. else if(sock == SyslogSocket)
  242. {
  243. close(SyslogSocket);
  244. SyslogSocket = -1;
  245. m2m_periph_gpio_set_val(M2M_PERIPH_GPIO4,0);
  246. }
  247. else if(sock == NetworkSocket)
  248. {
  249. close(NetworkSocket);
  250. NetworkSocket = -1;
  251. printf("Network client disconnected\n");
  252. }
  253. else if(sock == BootloaderSocket)
  254. {
  255. close(BootloaderSocket);
  256. BootloaderSocket = -1;
  257. printf("Bootloader client disconnected\n");
  258. BootloaderDeactivateBootloader();
  259. }
  260. else if(sock == AudioConsoleIFSocket)
  261. {
  262. close(AudioConsoleIFSocket);
  263. AudioConsoleIFSocket = -1;
  264. printf("Audio Console Interface with Master Ctrl disconnected\n");
  265. }
  266. }
  267. break;
  268. }
  269. case SOCKET_MSG_SEND:
  270. {
  271. if(sock == SyslogSocket)
  272. {
  273. }
  274. }
  275. }
  276. }
  277. }
  278. static void set_dev_name_to_mac(uint8 *name, uint8 *mac_addr)
  279. {
  280. /* Name must be in the format WINC1500_00:00 */
  281. uint16 len;
  282. // len = m2m_strlen(name);
  283. if (len >= 5) {
  284. name[len - 1] = MAIN_HEX2ASCII((mac_addr[5] >> 0) & 0x0f);
  285. name[len - 2] = MAIN_HEX2ASCII((mac_addr[5] >> 4) & 0x0f);
  286. name[len - 4] = MAIN_HEX2ASCII((mac_addr[4] >> 0) & 0x0f);
  287. name[len - 5] = MAIN_HEX2ASCII((mac_addr[4] >> 4) & 0x0f);
  288. }
  289. }
  290. /**
  291. * \brief Callback to get the Wi-Fi status update.
  292. *
  293. * \param[in] u8MsgType Type of Wi-Fi notification.
  294. * \param[in] pvMsg A pointer to a buffer containing the notification parameters.
  295. *
  296. * \return None.
  297. */
  298. static void wifi_cb(uint8 u8MsgType, void *pvMsg)
  299. {
  300. switch (u8MsgType) {
  301. case M2M_WIFI_RESP_CON_STATE_CHANGED: {
  302. tstrM2mWifiStateChanged *pstrWifiState = (tstrM2mWifiStateChanged *)pvMsg;
  303. if (pstrWifiState->u8CurrState == M2M_WIFI_CONNECTED)
  304. {
  305. printf("Wi-Fi connected\r\n");
  306. if(mUseDHCP == true)
  307. {
  308. // m2m_wifi_request_dhcp_client();
  309. }
  310. else
  311. {
  312. m2m_wifi_set_static_ip(&mModuleIPConfig);
  313. gbConnectedWifi = true;
  314. mCurIPAddress = mModuleIPConfig.u32StaticIP;
  315. }
  316. //#ifndef USE_STATIC_IP
  317. // // m2m_wifi_request_dhcp_client();
  318. //#else
  319. // m2m_wifi_set_static_ip(&mModuleIPConfig);
  320. // gbConnectedWifi = true;
  321. // mCurIPAddress = mModuleIPConfig.u32StaticIP;
  322. //#endif
  323. mWiFiState = WIFI_CONNECTED_STATE;
  324. } else if (pstrWifiState->u8CurrState == M2M_WIFI_DISCONNECTED)
  325. {
  326. printf("Wi-Fi disconnected\r\n");
  327. gbConnectedWifi = false;
  328. mWiFiState = WIFI_DISCONNECTED_STATE;
  329. CloseSockets();
  330. m2m_periph_gpio_set_val(M2M_PERIPH_GPIO3,0);
  331. mCurIPAddress = 0xFFFFFFFF;
  332. }
  333. break;
  334. }
  335. case M2M_WIFI_REQ_DHCP_CONF:
  336. {
  337. tstrM2MIPConfig *IPConfig;
  338. IPConfig = (tstrM2MIPConfig*)pvMsg;
  339. // mCurIPAddress = *(uint32*)pvMsg;
  340. mCurIPAddress = IPConfig->u32StaticIP;
  341. unsigned char ip1,ip2,ip3,ip4;
  342. ip1 = IPV4_BYTE(mCurIPAddress,0);
  343. ip2 = IPV4_BYTE(mCurIPAddress,1);
  344. ip3 = IPV4_BYTE(mCurIPAddress,2);
  345. ip4 = IPV4_BYTE(mCurIPAddress,3);
  346. /* Turn LED0 on to declare that IP address received. */
  347. // printf("Wi-Fi IP is %u.%u.%u.%u\r\n", pu8IPAddress[0], pu8IPAddress[1], pu8IPAddress[2], pu8IPAddress[3]);
  348. gbConnectedWifi = true;
  349. /* Obtain the IP Address by network name */
  350. gethostbyname((uint8 *)server_host_name);
  351. break;
  352. }
  353. case M2M_WIFI_RESP_PROVISION_INFO:
  354. {
  355. tstrM2MProvisionInfo *pstrProvInfo = (tstrM2MProvisionInfo *)pvMsg;
  356. printf("wifi_cb: M2M_WIFI_RESP_PROVISION_INFO.\r\n");
  357. if (pstrProvInfo->u8Status == M2M_SUCCESS) {
  358. m2m_wifi_connect((char *)pstrProvInfo->au8SSID,
  359. strlen((char *)pstrProvInfo->au8SSID),
  360. pstrProvInfo->u8SecType,
  361. pstrProvInfo->au8Password,
  362. M2M_WIFI_CH_ALL);
  363. } else {
  364. printf("wifi_cb: Provision failed.\r\n");
  365. }
  366. } break;
  367. default: {
  368. break;
  369. }
  370. }
  371. }
  372. int InitWiFi()
  373. {
  374. tstrWifiInitParam param;
  375. int8_t ret;
  376. gbTcpConnection = false;
  377. TimerStart(WIFI_RECONNECT_TIMER,1);
  378. mCurIPAddress = 0xFFFFFFFF;
  379. char IP1,IP2,IP3,IP4,GW1,GW2,GW3,GW4;
  380. //Load WiFi parameters from flash if present
  381. if(SPIFlashIsPresent() == 1 && USE_IP_STORED_IN_FLASH == 1)
  382. {
  383. char StoredIPConfig[11];
  384. if(SPIFlashReadBuffer(StoredIPConfig,11,FLASH_WIFI_IP_ADDRESS) != RET_ERROR)
  385. {
  386. mUseDHCP = StoredIPConfig[8]; //Use DHCP
  387. //if(mUseDHCP == 0)
  388. {
  389. IP1 = StoredIPConfig[0];
  390. IP2 = StoredIPConfig[1];
  391. IP3 = StoredIPConfig[2];
  392. IP4 = StoredIPConfig[3];
  393. GW1 = StoredIPConfig[4];
  394. GW2 = StoredIPConfig[5];
  395. GW3 = StoredIPConfig[6];
  396. GW4 = StoredIPConfig[7];
  397. if((IP1 == (char)0xFF) && (IP2 == (char)0xFF) && (IP3 == (char)0xFF) && (IP4 == (char)0xFF) || \
  398. ((GW1 == (char)0xFF && GW2 == (char)0xFF && GW3 == (char)0xFF && GW4 == (char)0xFF)))
  399. {
  400. IP1 = STATIC_IP_ADDRESS_1;
  401. IP2 = STATIC_IP_ADDRESS_2;
  402. IP3 = STATIC_IP_ADDRESS_3;
  403. IP4 = STATIC_IP_ADDRESS_4;
  404. GW1 = GATEWAY_ADDRESS_1;
  405. GW2 = GATEWAY_ADDRESS_2;
  406. GW3 = GATEWAY_ADDRESS_3;
  407. GW4 = GATEWAY_ADDRESS_4;
  408. }
  409. }
  410. char APNameLength, APPassLenght;
  411. APNameLength = StoredIPConfig[9];
  412. APPassLenght = StoredIPConfig[10];
  413. if((APNameLength > 64) || APPassLenght > 64)
  414. {
  415. strcpy(mAPName,HOME_AP_NAME);
  416. strcpy(mAPPassword,HOME_AP_PWD);
  417. }
  418. else
  419. {
  420. if(SPIFlashReadBuffer(mAPName,APNameLength,FLASH_WIFI_IP_ADDRESS+11) != RET_OK)
  421. {
  422. strcpy(mAPName,HOME_AP_NAME);
  423. }
  424. if(SPIFlashReadBuffer(mAPPassword,APPassLenght,FLASH_WIFI_IP_ADDRESS+11+APNameLength) != RET_OK)
  425. {
  426. strcpy(mAPPassword,HOME_AP_PWD);
  427. }
  428. }
  429. }
  430. }
  431. else
  432. {
  433. IP1 = STATIC_IP_ADDRESS_1;
  434. IP2 = STATIC_IP_ADDRESS_2;
  435. IP3 = STATIC_IP_ADDRESS_3;
  436. IP4 = STATIC_IP_ADDRESS_4;
  437. GW1 = GATEWAY_ADDRESS_1;
  438. GW2 = GATEWAY_ADDRESS_2;
  439. GW3 = GATEWAY_ADDRESS_3;
  440. GW4 = GATEWAY_ADDRESS_4;
  441. strcpy(mAPPassword,HOME_AP_PWD);
  442. strcpy(mAPName,HOME_AP_NAME);
  443. #ifdef USE_STATIC_IP
  444. mUseDHCP = 0;
  445. #else
  446. mUseDHCP = 1;
  447. #endif
  448. }
  449. memset(&mModuleIPConfig,0,sizeof(mModuleIPConfig));
  450. // mModuleIPConfig.u32StaticIP = IP_TO_U32(STATIC_IP_ADDRESS_1,STATIC_IP_ADDRESS_2,STATIC_IP_ADDRESS_3,STATIC_IP_ADDRESS_4);
  451. mModuleIPConfig.u32StaticIP = IP_TO_U32(IP1,IP2,IP3,IP4);
  452. mModuleIPConfig.u32DNS = IP_TO_U32(DEFAULT_DNS_ADD_1,DEFAULT_DNS_ADD_2,DEFAULT_DNS_ADD_3,DEFAULT_DNS_ADD_4);
  453. // mModuleIPConfig.u32AlternateDNS = IP_TO_U32(ALT_DNS_ADD_1,ALT_DNS_ADD_2,ALT_DNS_ADD_3,ALT_DNS_ADD_4);
  454. // mModuleIPConfig.u32Gateway = IP_TO_U32(GATEWAY_ADDRESS_1,GATEWAY_ADDRESS_2,GATEWAY_ADDRESS_3,GATEWAY_ADDRESS_4);
  455. mModuleIPConfig.u32Gateway = IP_TO_U32(GW1,GW2,GW3,GW4);
  456. mModuleIPConfig.u32SubnetMask = IP_TO_U32(SUBNET_MASK_1,SUBNET_MASK_2,SUBNET_MASK_3,SUBNET_MASK_4);
  457. /* Initialize the BSP. */
  458. // nm_bsp_init();
  459. /* Initialize Wi-Fi parameters structure. */
  460. memset((uint8_t *)&param, 0, sizeof(tstrWifiInitParam));
  461. /* Initialize Wi-Fi driver with data and status callbacks. */
  462. param.pfAppWifiCb = (void*) &wifi_cb;
  463. ret = m2m_wifi_init(&param);
  464. if (M2M_SUCCESS != ret)
  465. {
  466. mWiFiInitOK = false;
  467. mWiFiState = WIFI_INIT_ERROR_STATE;
  468. return RET_ERROR;
  469. }
  470. mWiFiInitOK = true;
  471. mWiFiState = WIFI_DISCONNECTED_STATE;
  472. socketInit();
  473. registerSocketCallback(socket_cb, resolve_cb);
  474. //Get MAC address from the module
  475. m2m_wifi_get_otp_mac_address(mac_addr, &u8IsMacAddrValid);
  476. if (!u8IsMacAddrValid) {
  477. m2m_wifi_set_mac_address(gau8MacAddr);
  478. }
  479. //Get the working MAC address from driver.
  480. m2m_wifi_get_mac_address(gau8MacAddr);
  481. //Initialize the human readable MAC address based on the working MAC
  482. set_dev_name_to_mac((uint8 *)gacDeviceName, gau8MacAddr);
  483. //Use the MAC to define the SSID of the module
  484. set_dev_name_to_mac((uint8 *)gstrM2MAPConfig.au8SSID, gau8MacAddr);
  485. // m2m_wifi_set_device_name((uint8 *)gacDeviceName, (uint8)m2m_strlen((uint8 *)gacDeviceName));
  486. //#ifdef USE_STATIC_IP
  487. // //Use static ip --> disable dhcp client before connecting
  488. // m2m_wifi_enable_dhcp(0);
  489. //#endif
  490. // if(m2m_wifi_connect(HOME_AP_NAME,sizeof(HOME_AP_NAME),HOME_AP_SEC_TYPE,HOME_AP_PWD,M2M_WIFI_CH_ALL) != M2M_SUCCESS)
  491. // {
  492. // //wifi connect error...
  493. // printf("error");
  494. // }
  495. if(mUseDHCP == 1)
  496. {
  497. m2m_wifi_enable_dhcp(1);
  498. }
  499. else
  500. {
  501. m2m_wifi_enable_dhcp(0);
  502. }
  503. if(m2m_wifi_connect(mAPName,strlen(mAPName),HOME_AP_SEC_TYPE,mAPPassword,M2M_WIFI_CH_ALL) != M2M_SUCCESS)
  504. {
  505. //wifi connect error...
  506. printf("Wifi Connect error");
  507. }
  508. tstrPerphInitParam tst;
  509. m2m_periph_init(&tst);
  510. //Set all IOs as inputs except the LED (IO3)..
  511. m2m_periph_gpio_set_dir(M2M_PERIPH_GPIO3,1);
  512. m2m_periph_gpio_set_dir(M2M_PERIPH_GPIO4,1);
  513. m2m_periph_gpio_set_dir(M2M_PERIPH_GPIO15,1);
  514. m2m_periph_gpio_set_dir(M2M_PERIPH_GPIO16,0);
  515. m2m_periph_gpio_set_dir(M2M_PERIPH_GPIO18,0);
  516. // m2m_periph_gpio_set_dir(M2M_PERIPH_GPIO6,0);
  517. m2m_periph_gpio_set_val(M2M_PERIPH_GPIO3,0);
  518. m2m_periph_gpio_set_val(M2M_PERIPH_GPIO4,0);
  519. m2m_periph_gpio_set_val(M2M_PERIPH_GPIO15,0);
  520. m2m_periph_gpio_set_val(M2M_PERIPH_GPIO16,0);
  521. m2m_periph_gpio_set_val(M2M_PERIPH_GPIO18,0);
  522. // m2m_periph_gpio_set_val(M2M_PERIPH_GPIO6,0);
  523. TimerStart(WIFI_RECONNECT_TIMER,WIFI_CONNECT_TIMEOUT);
  524. // m2m_wifi_start_provision_mode((tstrM2MAPConfig *)&gstrM2MAPConfig, (char *)gacHttpProvDomainName, 1);
  525. // printf("Provision Mode started.\r\nConnect to [%s] via AP[%s] and fill up the page.\r\n",
  526. // MAIN_HTTP_PROV_SERVER_DOMAIN_NAME,
  527. // gstrM2MAPConfig.au8SSID);
  528. }
  529. int TurnOFFWiFi()
  530. {
  531. int shit;
  532. CloseSockets();
  533. socketDeinit();
  534. m2m_wifi_disconnect();
  535. m2m_wifi_deinit(&shit);
  536. WIFI_CHP_EN_PIN = 0;
  537. WIFI_CHP_RST_PIN = 0;
  538. mWiFiInitOK = false;
  539. gbConnectedWifi = false;
  540. HEARTBEAT_LED_2_PIN = LED_OFF;
  541. mCurIPAddress = 0xFFFFFFFF;
  542. // WIFI
  543. mWiFiState = WIFI_MODULE_OFF_STATE;
  544. return RET_OK;
  545. }
  546. int CloseSockets()
  547. {
  548. gbTcpConnection = false;
  549. close(TerminalServerSocket);
  550. if(TerminalSocket != -1)
  551. {
  552. close(TerminalSocket);
  553. }
  554. close(NetworkServerSocket);
  555. if(NetworkSocket != -1)
  556. {
  557. close(NetworkSocket);
  558. }
  559. #ifdef USE_SYSLOG
  560. close(SyslogServerSocket);
  561. if(SyslogSocket != -1)
  562. {
  563. close(SyslogSocket);
  564. }
  565. #endif
  566. close(BootloaderServerSocket);
  567. if(BootloaderSocket != -1)
  568. {
  569. close(BootloaderSocket);
  570. }
  571. }
  572. char GetWiFiSate()
  573. {
  574. return mWiFiState;
  575. }
  576. bool IsWiFiConnected()
  577. {
  578. return mWiFiState == WIFI_CONNECTED_STATE;
  579. }
  580. uint32 GetCurIPAddress()
  581. {
  582. return mCurIPAddress;
  583. }
  584. void TickWiFi()
  585. {
  586. if(mWiFiInitOK == false)
  587. {
  588. return;
  589. }
  590. if(mWiFiState == WIFI_DISCONNECTED_STATE && gbConnectedWifi == false)//we should be connected.. if the timer is expired, retry
  591. {
  592. if(IsTimerExpired(WIFI_RECONNECT_TIMER))
  593. {
  594. //m2m_wifi_disconnect();
  595. //m2m_wifi_connect(HOME_AP_NAME,sizeof(HOME_AP_NAME),HOME_AP_SEC_TYPE,HOME_AP_PWD,M2M_WIFI_CH_ALL);
  596. m2m_wifi_connect(mAPName,strlen(mAPName),HOME_AP_SEC_TYPE,mAPPassword,M2M_WIFI_CH_ALL);
  597. TimerStart(WIFI_RECONNECT_TIMER,WIFI_CONNECT_TIMEOUT);
  598. }
  599. }
  600. // if(IsTimerExpired(WIFI_TICK_TIMER))
  601. // {
  602. m2m_wifi_handle_events();
  603. // TimerStart(WIFI_TICK_TIMER,1);
  604. // }
  605. if (gbConnectedWifi && !gbTcpConnection)
  606. {
  607. OpenTerminalServer();
  608. //OpenNetworkServer();
  609. // OpenBootloaderServer();
  610. // BootloaderActivateBootloader();
  611. #ifdef USE_SYSLOG
  612. OpenSyslogServer();
  613. #endif
  614. gbTcpConnection = true;
  615. }
  616. }
  617. //Terminal server implementation
  618. int OpenTerminalServer()
  619. {
  620. struct sockaddr_in strAddr;
  621. TerminalServerSocket = socket(AF_INET, SOCK_STREAM,0);
  622. uint16 TerminalPort = TERMINAL_SERVER_PORT;
  623. if(TerminalServerSocket >= 0)
  624. {
  625. strAddr.sin_family = AF_INET;
  626. strAddr.sin_port = _htons(TerminalPort);
  627. strAddr.sin_addr.s_addr = 0;
  628. bind(TerminalServerSocket, (struct sockaddr*)&strAddr, sizeof(struct sockaddr_in));
  629. return RET_OK;
  630. }
  631. else
  632. {
  633. return RET_ERROR;
  634. }
  635. }
  636. void SendTerminalData(uint8 *data, int size)
  637. {
  638. if(TerminalSocket != -1)
  639. {
  640. send(TerminalSocket,data,size,0);
  641. recv(TerminalSocket,TerminalRxBuf,sizeof(TerminalRxBuf),0);
  642. }
  643. }
  644. void SentTerminalByte(uint8 data)
  645. {
  646. if(TerminalSocket != -1)
  647. {
  648. send(TerminalSocket,&data,1,0);
  649. recv(TerminalSocket,TerminalRxBuf,sizeof(TerminalRxBuf),0);
  650. }
  651. }
  652. int OpenNetworkServer()
  653. {
  654. struct sockaddr_in strAddr;
  655. NetworkServerSocket = socket(AF_INET, SOCK_STREAM,0);
  656. uint16 ServerPort = NETWORK_SERVER_PORT;
  657. if(NetworkServerSocket >= 0)
  658. {
  659. strAddr.sin_family = AF_INET;
  660. strAddr.sin_port = _htons(ServerPort);
  661. strAddr.sin_addr.s_addr = 0;
  662. bind(NetworkServerSocket, (struct sockaddr*)&strAddr, sizeof(struct sockaddr_in));
  663. return RET_OK;
  664. }
  665. else
  666. {
  667. return RET_ERROR;
  668. }
  669. }
  670. void SendNetworkData(uint8 *data, int size)
  671. {
  672. if(NetworkSocket != -1)
  673. {
  674. send(NetworkSocket,data,size,0);
  675. recv(NetworkSocket,TerminalRxBuf,sizeof(TerminalRxBuf),0);
  676. }
  677. }
  678. void SentNetworkByte(uint8 data)
  679. {
  680. if(NetworkSocket != -1)
  681. {
  682. send(NetworkSocket,&data,1,0);
  683. recv(NetworkSocket,TerminalRxBuf,sizeof(TerminalRxBuf),0);
  684. }
  685. }
  686. //Printf Server Implementation
  687. #ifdef USE_SYSLOG
  688. int OpenSyslogServer()
  689. {
  690. struct sockaddr_in strAddr;
  691. SyslogServerSocket = socket(AF_INET, SOCK_STREAM,0);
  692. uint16 ServerPort = SYSLOG_SERVER_PORT;
  693. if(SyslogServerSocket >= 0)
  694. {
  695. strAddr.sin_family = AF_INET;
  696. strAddr.sin_port = _htons(ServerPort);
  697. strAddr.sin_addr.s_addr = 0;
  698. bind(SyslogServerSocket, (struct sockaddr*)&strAddr, sizeof(struct sockaddr_in));
  699. return RET_OK;
  700. }
  701. else
  702. {
  703. return RET_ERROR;
  704. }
  705. }
  706. void SendSyslogData(uint8 *data, int size)
  707. {
  708. if(SyslogSocket != -1);
  709. {
  710. send(SyslogSocket,data,size,0);
  711. recv(SyslogSocket,SyslogRxBuf,sizeof(SyslogRxBuf),0);
  712. }
  713. }
  714. void SendSyslogByte(uint8 data)
  715. {
  716. if(SyslogSocket != -1)
  717. {
  718. send(SyslogSocket,&data,1,0);
  719. recv(SyslogSocket,SyslogRxBuf,sizeof(SyslogRxBuf),0);
  720. }
  721. }
  722. int IsSyslogClientConnected()
  723. {
  724. if(SyslogSocket == -1)
  725. {
  726. return 0;
  727. }
  728. return 1;
  729. }
  730. #endif
  731. int OpenBootloaderServer()
  732. {
  733. struct sockaddr_in strAddr;
  734. BootloaderServerSocket = socket(AF_INET, SOCK_STREAM,0);
  735. uint16 ServerPort = BOOTLOADER_SERVER_PORT;
  736. if(BootloaderServerSocket >= 0)
  737. {
  738. strAddr.sin_family = AF_INET;
  739. strAddr.sin_port = _htons(ServerPort);
  740. strAddr.sin_addr.s_addr = 0;
  741. bind(BootloaderServerSocket, (struct sockaddr*)&strAddr, sizeof(struct sockaddr_in));
  742. return RET_OK;
  743. }
  744. else
  745. {
  746. return RET_ERROR;
  747. }
  748. }
  749. int CloseBootloaderServer()
  750. {
  751. close(BootloaderServerSocket);
  752. BootloaderServerSocket = -1;
  753. if(BootloaderSocket != -1)
  754. {
  755. close(BootloaderSocket);
  756. BootloaderSocket = -1;
  757. }
  758. }
  759. void SendBootloaderData(uint8 *data, int size)
  760. {
  761. if(BootloaderSocket != -1);
  762. {
  763. send(BootloaderSocket,data,size,0);
  764. recv(BootloaderSocket,BootloaderRxBuf,sizeof(BootloaderRxBuf),0);
  765. }
  766. }
  767. void SendSBootloaderByte(uint8 data)
  768. {
  769. if(BootloaderSocket != -1)
  770. {
  771. send(BootloaderSocket,&data,1,0);
  772. recv(BootloaderSocket,BootloaderRxBuf,sizeof(BootloaderRxBuf),0);
  773. }
  774. }
  775. int IsBootloaderClientConnected()
  776. {
  777. if(BootloaderSocket == -1)
  778. {
  779. return 0;
  780. }
  781. return 1;
  782. }
  783. int ConnectAudioInterface()
  784. {
  785. if(IsWiFiConnected() == false)
  786. {
  787. return 0;
  788. }
  789. struct sockaddr_in strAddr;
  790. AudioConsoleIFSocket = socket(AF_INET, SOCK_STREAM,0);
  791. uint16 ServerPort = MASTERCTRL_SERVER_PORT;
  792. if(AudioConsoleIFSocket >= 0)
  793. {
  794. strAddr.sin_family = AF_INET;
  795. strAddr.sin_port = _htons(ServerPort);
  796. strAddr.sin_addr.s_addr = IP_TO_U32(MASTERCTRL_IP_ADDRESS_1,MASTERCTRL_IP_ADDRESS_2,MASTERCTRL_IP_ADDRESS_3,MASTERCTRL_IP_ADDRESS_4);
  797. connect(AudioConsoleIFSocket, (struct sockaddr*)&strAddr, sizeof(struct sockaddr_in));
  798. return RET_OK;
  799. }
  800. else
  801. {
  802. return RET_ERROR;
  803. }
  804. return 1;
  805. }
  806. int DisconnectAudioInterface()
  807. {
  808. close(AudioConsoleIFSocket);
  809. AudioConsoleIFSocket = -1;
  810. return 1;
  811. }
  812. int SendAudioInterfaceData(uint8 *data, int size)
  813. {
  814. if(AudioConsoleIFSocket != -1);
  815. {
  816. send(AudioConsoleIFSocket,data,size,0);
  817. recv(AudioConsoleIFSocket,AudioConsoleIFRxBuf,sizeof(AudioConsoleIFRxBuf),0);
  818. }
  819. return 1;
  820. }
  821. int IsAudioInterfaceConnected()
  822. {
  823. if(AudioConsoleIFSocket < 0)
  824. {
  825. return 0;
  826. }
  827. return 1;
  828. }