25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

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