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

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