host_main.c 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. static void reset(void) {
  2. prov_active=prov_request=prov_step=prov_len=prov_ready=prov_bad=0;
  3. saves=0;
  4. wifi_state=WIFI_TRANS;tx_phase=TX_IDLE;wifi_tx_len=0;
  5. at_pending=at_retries=wifi_ack_delay=deferred_close=wifi_set_ssid=0;
  6. g_wifi_rx_head=g_wifi_rx_last=0;g_wifi_rx_fault=0;
  7. ticks=writes=commands=uart_fail=inject_prompt=0;
  8. retry_wait=0;
  9. wifi_rx_reset();
  10. }
  11. static void feed(const char *p) {put(p,(unsigned)strlen(p));WIFI_recv_deal();}
  12. static unsigned make_frame(uint8_t *b, unsigned size) {
  13. unsigned i,sum;
  14. b[0]=0xaa;b[1]=0x55;b[2]=1;b[3]=0x12;b[4]=size;b[5]=0;
  15. for(i=0;i<size;i++) b[6+i]=(uint8_t)i;
  16. if(size>=3) {b[6]='>';b[7]='\r';b[8]='\n';}
  17. sum=checkSum(b+2,size+4);b[size+6]=sum;b[size+7]=sum>>8;
  18. return size+8;
  19. }
  20. int main(void) {
  21. uint8_t b[136],payload[10]={0};
  22. unsigned n,i,split;
  23. char header[40],tiny[3];
  24. /* Real production formatting and real DecodeNew are compiled below. */
  25. assert(my_sprintf(tiny,sizeof(tiny),"%s","abcd")==4 && !strcmp(tiny,"ab"));
  26. reset();g_wifi_rx_head=g_wifi_rx_last=253;
  27. assert(WIFI_Send_Data(payload,10,1)==10);
  28. assert(!strcmp(last_write,"AT+CIPSEND=0,10\r\n"));
  29. assert(WIFI_ReSend()==-2 && writes==1);
  30. feed("\r\nOK\r\n> ");
  31. assert(writes==2 && last_len==10 && tx_phase==TX_WAIT_RESULT);
  32. feed(">");assert(writes==2);
  33. ticks=6500;WIFI_send_deal();assert(tx_phase==TX_WAIT_RESULT);
  34. feed("\r\nSEND OK\r\n");assert(tx_phase==TX_IDLE && wifi_tx_len==0);
  35. reset();WIFI_Send_Data(payload,10,1);ticks=3000;WIFI_send_deal();
  36. assert(tx_phase==TX_FAULT && writes==1);
  37. ticks=100000;WIFI_send_deal();assert(writes==1);
  38. feed("ready\r\n");assert(tx_phase==TX_IDLE && wifi_state==WIFI_POWERON);
  39. /* Every split point of a maximum-size protocol frame across IPD segments. */
  40. n=make_frame(b,128);
  41. for(split=0;split<=n;split++) {
  42. reset();my_sprintf(header,sizeof(header),"+IPD,0,%d",split);
  43. feed(header);feed(":");put(b,split);WIFI_recv_deal();
  44. my_sprintf(header,sizeof(header),"+IPD,0,%d:",n-split);
  45. feed(header);put(b+split,n-split);WIFI_recv_deal();
  46. assert(commands==1 && tx_phase!=TX_FAULT);
  47. }
  48. reset();n=make_frame(b,4);WIFI_Send_Data(payload,10,1);
  49. /* Prompt before IPD in the same ring snapshot, binary delimiters inside. */
  50. put("> +IPD,0,24:",12);put(b,n);put(b,n);WIFI_recv_deal();
  51. assert(writes==2 && commands==2);
  52. reset();WIFI_Send_Data(payload,10,1);inject_prompt=1;
  53. put("+IPD,0,12:",10);put(b,n);WIFI_recv_deal();
  54. assert(commands==1 && writes==2); /* Arrival during dispatch is preserved. */
  55. reset();feed("+IPD,0,24:");b[n-1]^=1;put(b,n);b[n-1]^=1;put(b,n);
  56. WIFI_recv_deal();assert(commands==1);
  57. for(i=0;i<1000;i++) {feed("+IPD,0,12:");put(b,n);WIFI_recv_deal();}
  58. assert(commands==1001);
  59. reset();feed("+IPD,1,12:");put(b,n);WIFI_recv_deal();assert(commands==0);
  60. reset();feed("+IPD,0,1200:");
  61. for(i=0;i<100;i++) {put(b,n);WIFI_recv_deal();}
  62. assert(commands==100 && !rx_ipd_left); /* larger than the hardware ring */
  63. reset();g_wifi_rx_fault=1;WIFI_recv_deal();assert(tx_phase==TX_FAULT);
  64. reset();uart_fail=1;assert(WIFI_Send_Data(payload,10,1)<0 && tx_phase==TX_FAULT);
  65. reset();wifi_enter(WIFI_LISTEN);sysinf.connectTcpFlag=1;
  66. strcpy(sysinf.TCP_IP_Addr,"192.168.3.1");strcpy(sysinf.TCP_IP_PORT,"8002");
  67. WIFI_send_deal();assert(strstr(last_write,"AT+CIPSTART=0,\"TCP\""));
  68. feed("0,CONNECT\r\nOK\r\n");assert(wifi_state==WIFI_TCPOPT);
  69. WIFI_send_deal();assert(!strcmp(last_write,"AT+CIPTCPOPT=0,,,6000\r\n"));
  70. feed("OK\r\n");assert(wifi_state==WIFI_TRANS);
  71. reset();wifi_enter(WIFI_LISTEN);sysinf.connectTcpFlag=0;
  72. WIFI_send_deal();feed("OK\r\n");assert(wifi_state==WIFI_TRANS);
  73. reset();wifi_enter(WIFI_CWLAP);strcpy(sysinf.wifiname,"lab");WIFI_send_deal();
  74. feed("+CWLAP:(3,\"lab\",-45,\"12:34:56:78:90:ab\",1)\r\nOK\r\n");
  75. assert(wifi_state==WIFI_DISAUTO && !strcmp(MAC_ADDR,"12:34:56:78:90:ab"));
  76. reset();wifi_enter(WIFI_CWLAP);WIFI_send_deal();feed("ERROR\r\n");
  77. WIFI_send_deal();assert(writes==1);ticks=1999;WIFI_send_deal();assert(writes==1);
  78. ticks=2000;WIFI_send_deal();assert(writes==2);
  79. reset();wifi_enter(WIFI_LINK_AP);WIFI_send_deal();
  80. feed("WIFI DISCONNECT\r\n");assert(wifi_state==WIFI_LINK_AP && at_pending);
  81. feed("WIFI CONNECTED\r\nWIFI GOT IP\r\nOK\r\n");assert(wifi_state==WIFI_GET_IP);
  82. reset();feed("WIFI DISCONNECT\r\n");assert(wifi_state==WIFI_POWEROFF);
  83. /* Full SoftAP setup and fragmented JSON, including a nonzero link ID. */
  84. reset();assert(WIFI_provision_request());WIFI_process();
  85. assert(prov_active && !strcmp(last_write,"AT+RST\r\n"));
  86. feed("OK\r\nready\r\n");
  87. for (i=1;i<=8;i++) {WIFI_process();assert(at_pending);feed("OK\r\n");}
  88. WIFI_process();assert(prov_step==10);
  89. feed("+IPD,2,16:{\"ssid\":\"lab\",\"p");
  90. feed("+IPD,2,13:assword\":\"x\"}");
  91. WIFI_process();assert(prov_step==11 && saves==1);
  92. assert(strstr(last_write,"AT+CIPSEND=2,"));
  93. i=writes;feed("OK\r\n");assert(writes==i);
  94. feed(">");assert(writes==i+1 && strstr(last_write,"accepted"));
  95. feed("SEND OK\r\n");WIFI_process();assert(!prov_active);
  96. /* A queued provisioning request cannot interrupt an active payload. */
  97. reset();WIFI_Send_Data(payload,10,1);WIFI_provision_request();WIFI_process();
  98. assert(!prov_active && writes==1);
  99. ticks=3000;WIFI_process();assert(tx_phase==TX_FAULT && !prov_active && writes==1);
  100. reset();feed("+IPD,0,-1:");assert(tx_phase==TX_FAULT);
  101. reset();assert(WIFI_SendIlde());WIFI_Send_Data(payload,10,1);assert(!WIFI_SendIlde());
  102. /* Search must not match stale bytes beyond the valid ring tail. */
  103. reset();memcpy(g_wifi_rx_buf,"xxOK",4);g_wifi_rx_last=3;
  104. assert(!find_str_loop(g_wifi_rx_buf,256,&g_wifi_rx_head,3,"OK"));
  105. puts("PASS: DecodeNew, splits/wrap, 1000 frames, AT/IPD ordering, timeouts, TCP/UDP, SoftAP, valid-range search");
  106. return 0;
  107. }