static void reset(void) { prov_active=prov_request=prov_step=prov_len=prov_ready=prov_bad=0; saves=0; wifi_state=WIFI_TRANS;tx_phase=TX_IDLE;wifi_tx_len=0; at_pending=at_retries=wifi_ack_delay=deferred_close=wifi_set_ssid=0; g_wifi_rx_head=g_wifi_rx_last=0;g_wifi_rx_fault=0; ticks=writes=commands=uart_fail=inject_prompt=0; retry_wait=0; wifi_rx_reset(); } static void feed(const char *p) {put(p,(unsigned)strlen(p));WIFI_recv_deal();} static unsigned make_frame(uint8_t *b, unsigned size) { unsigned i,sum; b[0]=0xaa;b[1]=0x55;b[2]=1;b[3]=0x12;b[4]=size;b[5]=0; for(i=0;i=3) {b[6]='>';b[7]='\r';b[8]='\n';} sum=checkSum(b+2,size+4);b[size+6]=sum;b[size+7]=sum>>8; return size+8; } int main(void) { uint8_t b[136],payload[10]={0}; unsigned n,i,split; char header[40],tiny[3]; /* Real production formatting and real DecodeNew are compiled below. */ assert(my_sprintf(tiny,sizeof(tiny),"%s","abcd")==4 && !strcmp(tiny,"ab")); reset();g_wifi_rx_head=g_wifi_rx_last=253; assert(WIFI_Send_Data(payload,10,1)==10); assert(!strcmp(last_write,"AT+CIPSEND=0,10\r\n")); assert(WIFI_ReSend()==-2 && writes==1); feed("\r\nOK\r\n> "); assert(writes==2 && last_len==10 && tx_phase==TX_WAIT_RESULT); feed(">");assert(writes==2); ticks=6500;WIFI_send_deal();assert(tx_phase==TX_WAIT_RESULT); feed("\r\nSEND OK\r\n");assert(tx_phase==TX_IDLE && wifi_tx_len==0); reset();WIFI_Send_Data(payload,10,1);ticks=3000;WIFI_send_deal(); assert(tx_phase==TX_FAULT && writes==1); ticks=100000;WIFI_send_deal();assert(writes==1); feed("ready\r\n");assert(tx_phase==TX_IDLE && wifi_state==WIFI_POWERON); /* Every split point of a maximum-size protocol frame across IPD segments. */ n=make_frame(b,128); for(split=0;split<=n;split++) { reset();my_sprintf(header,sizeof(header),"+IPD,0,%d",split); feed(header);feed(":");put(b,split);WIFI_recv_deal(); my_sprintf(header,sizeof(header),"+IPD,0,%d:",n-split); feed(header);put(b+split,n-split);WIFI_recv_deal(); assert(commands==1 && tx_phase!=TX_FAULT); } reset();n=make_frame(b,4);WIFI_Send_Data(payload,10,1); /* Prompt before IPD in the same ring snapshot, binary delimiters inside. */ put("> +IPD,0,24:",12);put(b,n);put(b,n);WIFI_recv_deal(); assert(writes==2 && commands==2); reset();WIFI_Send_Data(payload,10,1);inject_prompt=1; put("+IPD,0,12:",10);put(b,n);WIFI_recv_deal(); assert(commands==1 && writes==2); /* Arrival during dispatch is preserved. */ reset();feed("+IPD,0,24:");b[n-1]^=1;put(b,n);b[n-1]^=1;put(b,n); WIFI_recv_deal();assert(commands==1); for(i=0;i<1000;i++) {feed("+IPD,0,12:");put(b,n);WIFI_recv_deal();} assert(commands==1001); reset();feed("+IPD,1,12:");put(b,n);WIFI_recv_deal();assert(commands==0); reset();feed("+IPD,0,1200:"); for(i=0;i<100;i++) {put(b,n);WIFI_recv_deal();} assert(commands==100 && !rx_ipd_left); /* larger than the hardware ring */ reset();g_wifi_rx_fault=1;WIFI_recv_deal();assert(tx_phase==TX_FAULT); reset();uart_fail=1;assert(WIFI_Send_Data(payload,10,1)<0 && tx_phase==TX_FAULT); reset();wifi_enter(WIFI_LISTEN);sysinf.connectTcpFlag=1; strcpy(sysinf.TCP_IP_Addr,"192.168.3.1");strcpy(sysinf.TCP_IP_PORT,"8002"); WIFI_send_deal();assert(strstr(last_write,"AT+CIPSTART=0,\"TCP\"")); feed("0,CONNECT\r\nOK\r\n");assert(wifi_state==WIFI_TCPOPT); WIFI_send_deal();assert(!strcmp(last_write,"AT+CIPTCPOPT=0,,,6000\r\n")); feed("OK\r\n");assert(wifi_state==WIFI_TRANS); reset();wifi_enter(WIFI_LISTEN);sysinf.connectTcpFlag=0; WIFI_send_deal();feed("OK\r\n");assert(wifi_state==WIFI_TRANS); reset();wifi_enter(WIFI_CWLAP);strcpy(sysinf.wifiname,"lab");WIFI_send_deal(); feed("+CWLAP:(3,\"lab\",-45,\"12:34:56:78:90:ab\",1)\r\nOK\r\n"); assert(wifi_state==WIFI_DISAUTO && !strcmp(MAC_ADDR,"12:34:56:78:90:ab")); reset();wifi_enter(WIFI_CWLAP);WIFI_send_deal();feed("ERROR\r\n"); WIFI_send_deal();assert(writes==1);ticks=1999;WIFI_send_deal();assert(writes==1); ticks=2000;WIFI_send_deal();assert(writes==2); reset();wifi_enter(WIFI_LINK_AP);WIFI_send_deal(); feed("WIFI DISCONNECT\r\n");assert(wifi_state==WIFI_LINK_AP && at_pending); feed("WIFI CONNECTED\r\nWIFI GOT IP\r\nOK\r\n");assert(wifi_state==WIFI_GET_IP); reset();feed("WIFI DISCONNECT\r\n");assert(wifi_state==WIFI_POWEROFF); /* Full SoftAP setup and fragmented JSON, including a nonzero link ID. */ reset();assert(WIFI_provision_request());WIFI_process(); assert(prov_active && !strcmp(last_write,"AT+RST\r\n")); feed("OK\r\nready\r\n"); for (i=1;i<=8;i++) {WIFI_process();assert(at_pending);feed("OK\r\n");} WIFI_process();assert(prov_step==10); feed("+IPD,2,16:{\"ssid\":\"lab\",\"p"); feed("+IPD,2,13:assword\":\"x\"}"); WIFI_process();assert(prov_step==11 && saves==1); assert(strstr(last_write,"AT+CIPSEND=2,")); i=writes;feed("OK\r\n");assert(writes==i); feed(">");assert(writes==i+1 && strstr(last_write,"accepted")); feed("SEND OK\r\n");WIFI_process();assert(!prov_active); /* A queued provisioning request cannot interrupt an active payload. */ reset();WIFI_Send_Data(payload,10,1);WIFI_provision_request();WIFI_process(); assert(!prov_active && writes==1); ticks=3000;WIFI_process();assert(tx_phase==TX_FAULT && !prov_active && writes==1); reset();feed("+IPD,0,-1:");assert(tx_phase==TX_FAULT); reset();assert(WIFI_SendIlde());WIFI_Send_Data(payload,10,1);assert(!WIFI_SendIlde()); /* Search must not match stale bytes beyond the valid ring tail. */ reset();memcpy(g_wifi_rx_buf,"xxOK",4);g_wifi_rx_last=3; assert(!find_str_loop(g_wifi_rx_buf,256,&g_wifi_rx_head,3,"OK")); puts("PASS: DecodeNew, splits/wrap, 1000 frames, AT/IPD ordering, timeouts, TCP/UDP, SoftAP, valid-range search"); return 0; }