WiredLanTask.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687
  1. /********************************************************************************
  2. * File Name: WiredLanTask
  3. * Function Describe:The Wired Lan Task
  4. * Relate Module:
  5. * Explain:
  6. * Writer: slw
  7. * Date:
  8. *******************************************************************************/
  9. #define THIS_FILE_ID 11
  10. //---------------------------------------------------------------------------------
  11. #include "includes.h"
  12. #include "spi.h"
  13. #include "socket.h"
  14. #include "Internet/TcpEchoServer.h"
  15. #include "Internet/dhcp.h"
  16. /* Private typedef -----------------------------------------------------------*/
  17. /* Private define ------------------------------------------------------------*/
  18. //SOCKET 分配
  19. #define SOCK_UDPS_DHCP 0 //DHCP 用于动态分配本地IP
  20. #define SOCK_TCPS_APP1 1 //Clinet
  21. #define SOCK_TCPS_LOOPBACK 7 //回环测试
  22. uint8_t DHCP_MSG_BUF[548];//548
  23. #define DATA_BUF_SIZE 900//1500
  24. STATUE ServerStatus;
  25. SUT_WL_STATUS sutWLanStatus;
  26. OS_TID idWLanTask=0;
  27. U64 stkWLANTask[WIRE_LAN_TASK_STK_SIZE];
  28. uint8_t gDATABUF[DATA_BUF_SIZE];
  29. // Default Network Configuration
  30. wiz_NetInfo gWIZNETINFO = { .mac = {0x00, 0x08, 0xdc,0x00, 0xab, 0xcd},
  31. .ip = {0, 0, 0, 0},
  32. .sn = {255,255,255,0},
  33. .gw = {0, 0, 0, 0},
  34. .dns = {0,0,0,0},
  35. .dhcp = NETINFO_DHCP };//dhcp:=NETINFO_STATIC or NETINFO_DHCP
  36. /* Private variables ---------------------------------------------------------*/
  37. /* Private function prototypes -----------------------------------------------*/
  38. /* Private functions ---------------------------------------------------------*/
  39. void network_init(void); // Initialize Network information and display it
  40. void cb_ip_assign(void); //callback func when IP is assigned from DHCP server first
  41. void cb_ip_update(void); // callback func when IP is changed
  42. void cb_ip_conflict(void); // callback func when the assigned IP is conflict with others.
  43. uint8_t ClientInit(void);
  44. void ClientRun(void);
  45. int32_t WiredSendTcpData(uint8_t *data,uint16_t len);
  46. void SetIoMode(uint8_t iomode);//SOCK_IO_NONBLOCK;//SOCK_IO_BLOCK;
  47. /* ************************************************************************
  48. W5500 PMODE配置
  49. 111: ALL CAPABLE,Auto-Negotiation enable
  50. * ************************************************************************/
  51. void W5500_PMODE_CONFIG(void)
  52. {
  53. GPIO_InitTypeDef GPIO_InitStruct;
  54. //PB5->PMODE0,PB6->PMODE1,PB7->PMODE2
  55. GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6|GPIO_Pin_7;
  56. GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  57. GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
  58. GPIO_Init(GPIOB, &GPIO_InitStruct);
  59. GPIO_SetBits(GPIOB,(GPIO_Pin_5 | GPIO_Pin_6|GPIO_Pin_7));
  60. }
  61. /* ************************************************************************
  62. W5500 RESET 配置
  63. (Active low) RESET should be held low at least 500 us for W550
  64. * ************************************************************************/
  65. void W5500_RESET_CONFIG(void)
  66. {
  67. GPIO_InitTypeDef GPIO_InitStruct;
  68. //PB2->RESET
  69. GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;
  70. GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  71. GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
  72. GPIO_Init(GPIOB, &GPIO_InitStruct);
  73. GPIO_ResetBits(GPIOB,GPIO_Pin_2);
  74. os_dly_wait(1);
  75. GPIO_SetBits(GPIOB,GPIO_Pin_2);
  76. }
  77. //192.168.1.107
  78. unsigned char* StrTocharIP(unsigned char* SIP,unsigned char *ip)
  79. {
  80. char i =0;
  81. char j=0;
  82. // static unsigned char ip[4]={0};
  83. unsigned char buf[20]={0};
  84. while(*SIP!=0){
  85. if(*SIP=='.'){
  86. buf[i]=0;
  87. // printf("buf2====%d\r\n",buf[0]);
  88. ip[j]=atoi(buf);
  89. // printf("buf2====%s\r\n",buf);
  90. // printf("ip[%d]=%d\r\n",j,ip[j]);
  91. j++;
  92. SIP++;
  93. i=0;
  94. }
  95. buf[i]=*SIP;
  96. SIP++;
  97. i++;
  98. }
  99. buf[i]=0;
  100. ip[j]=atoi(buf);
  101. return ip;
  102. }
  103. /*
  104. 链接服务器
  105. 成功 返回1
  106. 失败 返回0
  107. */
  108. int8_t ConnectServer(void)
  109. {
  110. uint8_t mode;
  111. char tracebuf[35];//22
  112. unsigned char buf2[4]={0};
  113. int8_t r;
  114. SlwTrace(DEBUG,"Connect server...\r\n");
  115. memset(buf2,0,sizeof(buf2));
  116. StrTocharIP(sutProductPara.SIP,buf2);
  117. r=connect(SOCK_TCPS_APP1,buf2,sutProductPara.Port);//StrTocharIP(sutProductPara.SIP)
  118. snprintf(tracebuf,sizeof(tracebuf),"IP=%s..port=%d\r\n",sutProductPara.SIP,sutProductPara.Port);
  119. SlwTrace(DEBUG,tracebuf);
  120. if(r==SOCK_OK){
  121. SlwTrace(DEBUG,"Connect OK!\r\n");
  122. return 1;
  123. }else if(r==SOCKERR_SOCKINIT || r==SOCKERR_SOCKMODE){//socket未初始化,初始化之
  124. SlwTrace(DEBUG,"socket init...\r\n");
  125. mode=SOCK_IO_NONBLOCK;
  126. socket(SOCK_TCPS_APP1,Sn_MR_TCP,6000,SF_TCP_NODELAY);
  127. ctlsocket(SOCK_TCPS_APP1,CS_SET_IOMODE,&mode);
  128. }else if(r==SOCKERR_TIMEOUT){
  129. SlwTrace(DEBUG,"Connect timeout!\r\n");
  130. //os_dly_wait(1000);
  131. }else{
  132. sprintf(tracebuf,"connect err=%d\r\n",r);
  133. SlwTrace(DEBUG,tracebuf);
  134. }
  135. return 0;
  136. }
  137. void DhcpDisplayIP(void)
  138. {
  139. #if 0
  140. uint8_t ip[4];
  141. char tracebuf[30];
  142. getIPfromDHCP(ip);
  143. sprintf(tracebuf,"LC IP=%d.%d.%d.%d\r\n",ip[0],ip[1],ip[2],ip[3]);
  144. SlwTrace(DEBUG,tracebuf);
  145. getGWfromDHCP(ip);
  146. sprintf(tracebuf,"GW IP=%d.%d.%d.%d\r\n",ip[0],ip[1],ip[2],ip[3]);
  147. SlwTrace(DEBUG,tracebuf);
  148. getSNfromDHCP(ip);
  149. sprintf(tracebuf,"SN IP=%d.%d.%d.%d\r\n",ip[0],ip[1],ip[2],ip[3]);
  150. SlwTrace(DEBUG,tracebuf);
  151. getDNSfromDHCP(ip);
  152. sprintf(tracebuf,"DNS IP=%d.%d.%d.%d\r\n",ip[0],ip[1],ip[2],ip[3]);
  153. SlwTrace(DEBUG,tracebuf);
  154. #else
  155. char tracebuf[30];
  156. sprintf(tracebuf,"LC IP=%d.%d.%d.%d\r\n",gWIZNETINFO.ip[0],gWIZNETINFO.ip[1],gWIZNETINFO.ip[2],gWIZNETINFO.ip[3]);
  157. SlwTrace(DEBUG,tracebuf);
  158. sprintf(tracebuf,"GW IP=%d.%d.%d.%d\r\n",gWIZNETINFO.gw[0],gWIZNETINFO.gw[1],gWIZNETINFO.gw[2],gWIZNETINFO.gw[3]);
  159. SlwTrace(DEBUG,tracebuf);
  160. sprintf(tracebuf,"SN IP=%d.%d.%d.%d\r\n",gWIZNETINFO.sn[0],gWIZNETINFO.sn[1],gWIZNETINFO.sn[2],gWIZNETINFO.sn[3]);
  161. SlwTrace(DEBUG,tracebuf);
  162. sprintf(tracebuf,"DNS IP=%d.%d.%d.%d\r\n",gWIZNETINFO.dns[0],gWIZNETINFO.dns[1],gWIZNETINFO.dns[2],gWIZNETINFO.dns[3]);
  163. SlwTrace(DEBUG,tracebuf);
  164. #endif
  165. }
  166. /**************************************************************************************
  167. cb_ip_assign
  168. callback func when IP is assigned from DHCP server first
  169. ***************************************************************************************/
  170. void cb_ip_assign(void)
  171. {
  172. default_ip_assign();
  173. SlwTrace(DEBUG,"IP is assigned from DHCP!\r\n");
  174. ctlnetwork(CN_GET_NETINFO, (void*)&gWIZNETINFO);
  175. DhcpDisplayIP();
  176. sutWLanStatus.NetFlag=3;//
  177. //ClientInit();
  178. }
  179. /**************************************************************************************
  180. cb_ip_update
  181. callback func when IP is changed
  182. ***************************************************************************************/
  183. void cb_ip_update(void)
  184. {
  185. default_ip_update();
  186. SlwTrace(DEBUG,"IP is update from DHCP!\r\n");
  187. ctlnetwork(CN_GET_NETINFO, (void*)&gWIZNETINFO);
  188. DhcpDisplayIP();
  189. }
  190. /**************************************************************************************
  191. cb_ip_conflict
  192. callback func when the assigned IP is conflict with others.
  193. ***************************************************************************************/
  194. void cb_ip_conflict(void)
  195. {
  196. SlwTrace(DEBUG,"IP Conflict!\r\n");
  197. default_ip_conflict();
  198. }
  199. /**
  200. * @brief Intialize the network information to be used in WIZCHIP
  201. * @retval None
  202. */
  203. void network_init(void)
  204. {
  205. char tacebuf[100];
  206. uint8_t tmpstr[6];
  207. getNetMacByPSN(sutProductPara.MAC,sutProductPara.PSN);
  208. //MAC
  209. memcpy(gWIZNETINFO.mac,sutProductPara.MAC,6);
  210. ctlnetwork(CN_SET_NETINFO, (void*)&gWIZNETINFO);
  211. ctlnetwork(CN_GET_NETINFO, (void*)&gWIZNETINFO);
  212. if(0!=memcmp(gWIZNETINFO.mac,sutProductPara.MAC,6)){
  213. W5500_RESET_CONFIG();
  214. os_dly_wait(20);
  215. memcpy(gWIZNETINFO.mac,sutProductPara.MAC,6);
  216. ctlnetwork(CN_SET_NETINFO, (void*)&gWIZNETINFO);
  217. ctlnetwork(CN_GET_NETINFO, (void*)&gWIZNETINFO);
  218. if(0!=memcmp(gWIZNETINFO.mac,sutProductPara.MAC,6)){
  219. SlwTrace(DEBUG,"W5500 Init fail!\r\nWiredLan Stop!\r\n");
  220. while(1){
  221. os_dly_wait(10000);
  222. }
  223. }
  224. }
  225. // Display Network Information
  226. ctlwizchip(CW_GET_ID,(void*)tmpstr);
  227. snprintf(tacebuf,sizeof(tacebuf),"\r\n=== %s NET CONF ===\r\n",(char*)tmpstr);
  228. SlwTrace(DEBUG,tacebuf);
  229. snprintf(tacebuf,sizeof(tacebuf),"MAC: %02X:%02X:%02X:%02X:%02X:%02X\r\n",gWIZNETINFO.mac[0],gWIZNETINFO.mac[1],gWIZNETINFO.mac[2],
  230. gWIZNETINFO.mac[3],gWIZNETINFO.mac[4],gWIZNETINFO.mac[5]);
  231. SlwTrace(DEBUG,tacebuf);
  232. snprintf(tacebuf,sizeof(tacebuf),"SIP: %d.%d.%d.%d\r\n", gWIZNETINFO.ip[0],gWIZNETINFO.ip[1],gWIZNETINFO.ip[2],gWIZNETINFO.ip[3]);
  233. SlwTrace(DEBUG,tacebuf);
  234. snprintf(tacebuf,sizeof(tacebuf),"GAR: %d.%d.%d.%d\r\n", gWIZNETINFO.gw[0],gWIZNETINFO.gw[1],gWIZNETINFO.gw[2],gWIZNETINFO.gw[3]);
  235. SlwTrace(DEBUG,tacebuf);
  236. snprintf(tacebuf,sizeof(tacebuf),"SUB: %d.%d.%d.%d\r\n", gWIZNETINFO.sn[0],gWIZNETINFO.sn[1],gWIZNETINFO.sn[2],gWIZNETINFO.sn[3]);
  237. SlwTrace(DEBUG,tacebuf);
  238. snprintf(tacebuf,sizeof(tacebuf),"DNS: %d.%d.%d.%d\r\n", gWIZNETINFO.dns[0],gWIZNETINFO.dns[1],gWIZNETINFO.dns[2],gWIZNETINFO.dns[3]);
  239. SlwTrace(DEBUG,tacebuf);
  240. SlwTrace(DEBUG,"======================\r\n");
  241. }
  242. //int32_t RecvDataFromServer()
  243. //{
  244. // char tracebuf[20];
  245. // int32_t r;
  246. // r=recv(SOCK_TCPS_APP1,gDATABUF, sizeof(gDATABUF));
  247. // if(r>0){
  248. // snprintf(tracebuf,sizeof(tracebuf),"<Recv[%d]<\r\n",r);
  249. // SlwTrace(DEBUG,tracebuf);
  250. // gDATABUF[r]=0;
  251. // SlwTrace(DEBUG,(char *)gDATABUF);
  252. // TcpRecvData(gDATABUF,r);
  253. // }
  254. // return r;
  255. //}
  256. int32_t SendTestServer(void)
  257. {
  258. // int16_t len;
  259. // SlwTrace(DEBUG,">>SendUpload>>\r\n");
  260. // sutTestData.CSQ=0;
  261. // sutTestData.NetMode=2;
  262. // len=TcpPackingSendTest(g_ucTcpSendBuf);
  263. // return WiredSendTcpData(g_ucTcpSendBuf,len);
  264. return 0;
  265. }
  266. int32_t SendRegServer(void)
  267. {
  268. int r,len;
  269. // SlwTrace(DEBUG,">>SendReg>>\r\n");
  270. // sutModemStatus.TcpSendTimeCt++;
  271. // sutTestData.NetMode=2;//LAN模式上传
  272. // len=TcpPackingReg(g_ucTcpSendBuf);
  273. // if(len==0)return -1;
  274. // Debugsend(g_ucTcpSendBuf, len);//打印发送的数据
  275. // r = WiredSendTcpData(g_ucTcpSendBuf,len);
  276. return r;
  277. }
  278. /*
  279. SOCK_IO_NONBLOCK;//SOCK_IO_BLOCK;
  280. */
  281. void SetIoMode(uint8_t iomode)
  282. {
  283. static uint8_t mode;
  284. mode=iomode;
  285. ctlsocket(SOCK_TCPS_APP1,CS_SET_IOMODE,&mode);
  286. }
  287. //void ClientRun(void)
  288. //{
  289. // static uint8_t sucCt=0;
  290. // static uint8_t sucSendRegCt=0;
  291. // static uint8_t sucSendTestCt=0;
  292. // if(sutWLanStatus.Connected==1)
  293. // RecvDataFromServer();//接收处理 非阻塞模式
  294. // if(++sucCt>100){
  295. // sucCt=0;
  296. // }else return;
  297. //
  298. // if(sutWLanStatus.Connected==0){//未链接
  299. // if(SOCK_OK==ConnectServer()){//链接服务器 阻塞模式
  300. // sutWLanStatus.Connected=1;
  301. // sucSendRegCt=0;
  302. // sucSendTestCt=30;
  303. // SendReg2Server();
  304. // }
  305. // }else if(sutWLanStatus.Logined==0){//已链接,但未登陆,定时发登陆包
  306. // if(++sucSendRegCt>5){
  307. // sucSendRegCt=0;
  308. // sucSendTestCt=30;
  309. // if(SendReg2Server()<0){
  310. // sutWLanStatus.Connected=0;
  311. // }
  312. // }
  313. // }else{//已登陆
  314. // if(++sucSendTestCt>30){
  315. // sucSendTestCt=0;
  316. // SendTest2Server();
  317. // }
  318. // }
  319. //}
  320. /*
  321. 通过有线通道发送TCP数据
  322. */
  323. int32_t WiredSendTcpData(uint8_t *data,uint16_t len)
  324. {
  325. char buf[30];
  326. int i,flag;
  327. int32_t r;
  328. sprintf(buf,">WD Send %d>\r\n",len);
  329. SlwTrace(DEBUG,buf);
  330. //-------------------------------
  331. //sutModemStatus.TcpSendTimeCt++; //测试暂时注销
  332. r=send(SOCK_TCPS_APP1,data,len);
  333. switch(r){
  334. case SOCKERR_TIMEOUT://- Timeout occurred \n
  335. SlwTrace(DEBUG,"err:SOCKERR_TIMEOUT\r\n");
  336. break;
  337. case SOCKERR_SOCKMODE://Invalid operation in the socket \n
  338. SlwTrace(DEBUG,"err:SOCKERR_SOCKMODE\r\n");
  339. break;
  340. case SOCKERR_SOCKNUM://Invalid socket number \n
  341. SlwTrace(DEBUG,"err:SOCKERR_SOCKNUM\r\n");
  342. break;
  343. case SOCKERR_DATALEN://zero data length \n
  344. SlwTrace(DEBUG,"err:SOCKERR_DATALEN\r\n");
  345. break;
  346. case SOCK_BUSY://Socket is busy.
  347. SlwTrace(DEBUG,"err:SOCK_BUSY\r\n");
  348. break;
  349. sut_sys_status.Resend=1;
  350. }
  351. if(sutDeviceConfig.DebugPrintEn != 0 && r>0){
  352. snprintf(buf,sizeof(buf),"Send[%d/%d] OK!\r\n",r,len);
  353. SlwTrace(DEBUG,buf);
  354. sut_sys_status.Resend=0;
  355. }
  356. return r;
  357. }
  358. /*******************************************************************
  359. *WiredLanTask
  360. *有线网络任务
  361. ********************************************************************/
  362. __task void WiredLanTask(void)
  363. {
  364. static unsigned short susSendUploadCt=0;
  365. static unsigned char sucSendTickCt=0;
  366. static unsigned char sucSendWaitAckCt=0;//发送后等待ACK计数器
  367. char tracebuf[50];
  368. uint8_t SecCt=0;
  369. uint8_t tmp;
  370. int32_t ret = 0;
  371. uint8_t memsize[2][8] = {{2,2,2,2,2,2,2,2},{2,2,2,2,2,2,2,2}};
  372. uint8_t flag=1;
  373. sutProductPara.ConnectType=0; //0---有线 1---无线
  374. WIRED_LAN_TASK_START:
  375. HeartTimeOut=20;
  376. SlwTrace(DEBUG,"WiredLanTask Start...\r\n");
  377. memset(&sutWLanStatus,0,sizeof(SUT_WL_STATUS));
  378. W5500_PMODE_CONFIG();
  379. W5500_RESET_CONFIG();
  380. SPI_Configuration();//Config SPI
  381. reg_wizchip_cris_cbfunc(SPI_CrisEnter, SPI_CrisExit); //注册临界区函数
  382. #if _WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_VDM_
  383. reg_wizchip_cs_cbfunc(SPI_CS_Select, SPI_CS_Deselect);//注册SPI片选信号函数
  384. #elif _WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_SPI_FDM_
  385. reg_wizchip_cs_cbfunc(SPI_CS_Select, SPI_CS_Deselect); // CS must be tried with LOW.
  386. #else
  387. #if (_WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_SIP_) != _WIZCHIP_IO_MODE_SIP_
  388. #error "Unknown _WIZCHIP_IO_MODE_"
  389. #else
  390. reg_wizchip_cs_cbfunc(wizchip_select, wizchip_deselect);
  391. #endif
  392. #endif
  393. /* SPI Read & Write callback function */
  394. reg_wizchip_spi_cbfunc(SPI_ReadByte, SPI_WriteByte); //注册读写函数
  395. /* WIZCHIP SOCKET Buffer initialize */
  396. if(ctlwizchip(CW_INIT_WIZCHIP,(void*)memsize) == -1){
  397. SlwTrace(DEBUG,"WIZCHIP Initialized fail.\r\n");
  398. GPIO_ResetBits(GPIOB,GPIO_Pin_2);//set W5500 Reset
  399. os_dly_wait(10);//6000
  400. goto WIRED_LAN_TASK_START;
  401. }
  402. /* PHY link status check */
  403. do{
  404. if(ctlwizchip(CW_GET_PHYLINK, (void*)&tmp) == -1){
  405. SlwTrace(DEBUG,"Unknown PHY Link stauts.\r\n");
  406. }
  407. os_dly_wait(100);
  408. if(++SecCt>10){
  409. SecCt=0;
  410. while(1){
  411. //跑无线任务
  412. os_dly_wait(100);
  413. if(sutProductPara.ConnectType==0)sutProductPara.ConnectType=1;
  414. }
  415. SlwTrace(DEBUG,"4444444444444444444\r\n");
  416. goto WIRED_LAN_TASK_START;
  417. }
  418. }while(tmp == PHY_LINK_OFF);
  419. sutWLanStatus.NetFlag=1;//网络IC初始化成功 ////////////////////////////////////////////
  420. /* Network initialization */
  421. network_init();
  422. //检查网线是否已插入
  423. while((getPHYCFGR()&PHYCFGR_LNK_ON)==PHYCFGR_LNK_OFF){
  424. SlwTrace(DEBUG,"Network cable not inserted!\r\n");
  425. os_dly_wait(100);
  426. if(++SecCt>30){ //改为30S //180
  427. goto WIRED_LAN_TASK_START;
  428. }
  429. };
  430. sutWLanStatus.NetFlag=2;//网线已插入 ////////////////////////////////////////////
  431. //DHCP client initialization
  432. DHCP_init(SOCK_UDPS_DHCP,DHCP_MSG_BUF);
  433. //Register DHCP call back function
  434. reg_dhcp_cbfunc(cb_ip_assign,cb_ip_update,cb_ip_conflict);
  435. memset(&sutWLanStatus,0,sizeof(SUT_WL_STATUS)); //清0
  436. sutWLanStatus.SendTestInterval=20;//发送间隔
  437. /* Main loop */
  438. SecCt=0;
  439. while(1){
  440. //os_dly_wait(10);
  441. FEED_EXTWATCHDOG();
  442. IWDG_ReloadCounter();
  443. os_dly_wait(1);
  444. //DHCP client in the main loop
  445. DHCP_run();
  446. //处理接收
  447. // typedef struct SUT_WL_STATUS
  448. //{
  449. // uint8_t NetFlag;//网络状态 0--网络芯片未完成初始化 1--网络IC初始化成功但网线未链接 2--网线已插入但DHCP未分配IP 3--DHCP已分配内网IP
  450. // uint8_t ConnectEnable;//链接使能 0--不允许链接服务器 1--允许链接服务器
  451. // uint8_t SocketOpened;//Socket已绑定
  452. // uint8_t Connected;//0未链接 1已链接
  453. // uint8_t Logined;//0未登陆 1已登陆
  454. // uint8_t SendRegCt; //发送登陆包次数计数器
  455. // uint8_t SendRegCtrlCt;//发送登陆包控制计数器
  456. // uint8_t SendTestCt; //发测试包次数计数器
  457. // uint8_t SendTestCtrlCt;//发测试包控制计数器
  458. // uint8_t SendTestInterval;//发送Test间隔
  459. // uint16_t TaskRunSec;//运行了多久
  460. // uint16_t OffLineCt;//离线时间
  461. //}SUT_WL_STATUS;
  462. //
  463. sutWLanStatus.ConnectEnable=1;
  464. if(sutWLanStatus.ConnectEnable==1 && sutWLanStatus.Connected==1){
  465. ret=recv(SOCK_TCPS_APP1,gDATABUF, sizeof(gDATABUF));
  466. if(ret==SOCKERR_SOCKSTATUS){
  467. if(flag){
  468. SlwTrace(DEBUG,"recv err:SOCKERR_SOCKSTATUS\r\n");
  469. flag=0;
  470. }
  471. sutWLanStatus.Connected=0;
  472. sutWLanStatus.Logined=0;
  473. }else if(ret>0){
  474. flag=1;
  475. sutWLanStatus.Connected=1;
  476. sutWLanStatus.SendTestCt=0;
  477. snprintf(tracebuf,sizeof(tracebuf),"<Recv[%d]<\r\n",ret);
  478. SlwTrace(DEBUG,tracebuf);
  479. // SlwTrace(DEBUG,(char *)gDATABUF);
  480. //TcpProcess2(gDATABUF);
  481. TcpProcess(gDATABUF,ret);//接受到的数据
  482. }else if(ret<0){
  483. snprintf(tracebuf,sizeof(tracebuf),"Recv err:%d\r\n",ret);
  484. SlwTrace(DEBUG,tracebuf);
  485. }
  486. }
  487. if( sut_sys_status.OnceFlag==1 && sut_sys_status.Logined==1)
  488. {
  489. /**********************接收完一次,发现数据改变立即上行******************************/
  490. //判断是否区别立即上传
  491. if(memcmp(&sut_device_read,&Device_Up.Devices,sizeof(sut_device_read)))
  492. {
  493. memcpy(&Device_Up.Devices,&sut_device_read,sizeof(sut_device_read));
  494. SlwTrace(DEBUG,"chang====================================\r\n");
  495. TSStatueSendPosition(TS_LOCATION_INFORMATION_REPORTING); //上行
  496. }
  497. sut_sys_status.OnceFlag=0;
  498. }else if(sut_sys_status.Resend==1)
  499. {
  500. memcpy(&Device_Up.Devices,&sut_device_read,sizeof(sut_device_read));
  501. SlwTrace(DEBUG,"重传====================================\r\n");
  502. TSStatueSendPosition(TS_LOCATION_INFORMATION_REPORTING); //上行
  503. }
  504. //----------以下控制每秒执行1次-----------
  505. static U32 os_old_time=0;
  506. U32 os_cur_time=os_time_get();
  507. if((os_cur_time-os_old_time)>100)os_old_time=os_cur_time;
  508. else continue;
  509. if(sutWLanStatus.TaskRunSec<0xffff)sutWLanStatus.TaskRunSec++;
  510. //判断网线是否已插入
  511. if((getPHYCFGR()&PHYCFGR_LNK_ON)==PHYCFGR_LNK_OFF){
  512. if(sutWLanStatus.NetFlag!=1){
  513. sutWLanStatus.NetFlag=1;//网线未插入
  514. SlwTrace(DEBUG,"Network cable not inserted!\r\n");
  515. }
  516. }else if(sutWLanStatus.NetFlag<2){//网线已插入
  517. SlwTrace(DEBUG,"Network cable inserted!\r\n");
  518. if(gWIZNETINFO.ip[0]!=0){
  519. sutWLanStatus.NetFlag=3;
  520. }else{
  521. sutWLanStatus.NetFlag=2;
  522. }
  523. }
  524. //DHCP 1s Tick Timer handler
  525. DHCP_time_handler();
  526. //---
  527. if(sutWLanStatus.Connected==0){//------TCP未链接 则连接之-----
  528. ServerStatus=CLOSED;
  529. sutWLanStatus.Connected=ConnectServer();
  530. sutWLanStatus.SendRegCtrlCt=9;
  531. sutWLanStatus.SendRegCt=0;
  532. }else if(ServerStatus!=OPENED){//----服务器未登陆则发登陆包-----
  533. // /***************************/
  534. // ServerStatus=OPENED; //测试
  535. // sut_sys_status.Logined=1;
  536. // /**************************/
  537. sutWLanStatus.SendTestCt=0;
  538. sutWLanStatus.SendTestCtrlCt=sutWLanStatus.SendTestInterval-1;//
  539. //控制每10秒发1次登陆包,直到已登陆
  540. if(++sutWLanStatus.SendRegCtrlCt>10){
  541. sutWLanStatus.SendRegCtrlCt=0;
  542. //SendRegServer();
  543. TSStatueSendPosition(TS_TERMINAL_LOGIN); //登录包
  544. //连续发了5次还是无法登陆,则延时一段时间后重来
  545. if(++sutWLanStatus.SendRegCt>5){
  546. sutWLanStatus.SendRegCt=0;
  547. os_dly_wait(1);
  548. goto WIRED_LAN_TASK_START;//
  549. }
  550. }
  551. }else{//------已登陆服务器,定时发Test-----
  552. //控制发Test包
  553. //if(!HeartTimeOut--)goto WIRED_LAN_TASK_START;
  554. if(sucSendWaitAckCt>0) sucSendWaitAckCt--; //15S
  555. if(sucSendWaitAckCt==0){
  556. if(++susSendUploadCt>15){
  557. susSendUploadCt=0;
  558. sucSendWaitAckCt=1;
  559. //SendTestServer(); //心跳
  560. TSStatueSendPosition(TS_TERMINAL_HEARTBEAT);
  561. SlwTrace(DEBUG,"SendValue 111111\r\n");
  562. printf("ConnectEnable==%d,Connected===%d\r\n",sutWLanStatus.ConnectEnable,sutWLanStatus.Connected);
  563. }
  564. }
  565. }
  566. }
  567. }