diff --git a/src/httpserver/http_tcp_server.c b/src/httpserver/http_tcp_server.c index 9a300e60d..8cc83d4a0 100644 --- a/src/httpserver/http_tcp_server.c +++ b/src/httpserver/http_tcp_server.c @@ -27,11 +27,19 @@ void start_tcp_http() } } + +int sendfn(int fd, char * data, int len){ + if (fd){ + return send( fd, data, len, 0 ); + } + return -1; +} + static void tcp_client_thread( beken_thread_arg_t arg ) { OSStatus err = kNoErr; int fd = (int) arg; - int len = 0; + int lenrx = 0; //fd_set readfds, errfds, readfds2; char *buf = NULL; char *reply = NULL; @@ -47,9 +55,9 @@ static void tcp_client_thread( beken_thread_arg_t arg ) while ( 1 ) { - len = recv( fd, buf, 1024, 0 ); + lenrx = recv( fd, buf, 1024, 0 ); - if ( len <= 0 ) + if ( lenrx <= 0 ) { os_printf( "TCP Client is disconnected, fd: %d", fd ); goto exit; @@ -57,9 +65,16 @@ static void tcp_client_thread( beken_thread_arg_t arg ) //addLog( "TCP received string %s\n",buf ); // returns length to be sent if any - len = HTTP_ProcessPacket(buf, reply, replyBufferSize); - addLog( "TCP sending reply len %i\n",len ); - len = send( fd, reply, len, 0 ); + buf[lenrx] = 0; + int lenret = HTTP_ProcessPacket(buf, reply, replyBufferSize, sendfn, fd); + addLog( "TCP sending reply len %i\n",lenret ); + while(lenret){ + int len = lenret; + if (len > 1024) len = 1024; + send( fd, reply, len, 0 ); + reply += len; + lenret -= len; + } rtos_delay_milliseconds(10); close(fd); diff --git a/src/httpserver/new_http.c b/src/httpserver/new_http.c index f7fbd77a0..c1c378141 100644 --- a/src/httpserver/new_http.c +++ b/src/httpserver/new_http.c @@ -218,7 +218,8 @@ const char *htmlPinRoleNames[] = { "LED", "LED_n", "PWM", - "e", + "Wifi LED", + "Wifi LED_n", "e", "e", }; @@ -270,7 +271,7 @@ void HTTP_AddBuildFooter(char *outbuf, int outBufSize) { strcat_safe(outbuf,"
",outBufSize); strcat_safe(outbuf,g_build_str,outBufSize); } -int HTTP_ProcessPacket(const char *recvbuf, char *outbuf, int outBufSize) { +int HTTP_ProcessPacket(const char *recvbuf, char *outbuf, int outBufSize, http_send_fn sendpart, int socket) { int i, j; char tmpA[128]; char tmpB[64]; @@ -696,6 +697,10 @@ int HTTP_ProcessPacket(const char *recvbuf, char *outbuf, int outBufSize) { } } } + if (sendpart){ + sendpart(socket, outbuf, strlen(outbuf)); + outbuf[0] = 0; + } if(iChangedRequested>0) { PIN_SaveToFlash(); sprintf(tmpA, "Pins update - %i reqs, %i changed!

",iChangedRequested,iChanged); @@ -711,6 +716,10 @@ int HTTP_ProcessPacket(const char *recvbuf, char *outbuf, int outBufSize) { strcat(outbuf,tmpA); sprintf(tmpA, ""); if(ch == 0) { @@ -728,6 +741,10 @@ int HTTP_ProcessPacket(const char *recvbuf, char *outbuf, int outBufSize) { sprintf(tmpA, "",i,tmpB); strcat(outbuf,tmpA); strcat(outbuf,"
"); + if (sendpart){ + sendpart(socket, outbuf, strlen(outbuf)); + outbuf[0] = 0; + } } strcat(outbuf,""); @@ -876,5 +893,6 @@ int HTTP_ProcessPacket(const char *recvbuf, char *outbuf, int outBufSize) { HTTP_AddBuildFooter(outbuf,outBufSize); strcat(outbuf,htmlEnd); } + i = strlen(outbuf); return i; } \ No newline at end of file diff --git a/src/httpserver/new_http.h b/src/httpserver/new_http.h index 0b6b8a31c..4806fc90b 100644 --- a/src/httpserver/new_http.h +++ b/src/httpserver/new_http.h @@ -7,7 +7,9 @@ extern const char htmlHeader[]; extern const char htmlEnd[]; extern const char htmlReturnToMenu[]; -int HTTP_ProcessPacket(const char *recvbuf, char *outbuf, int outBufSize); +typedef int (*http_send_fn)(int fd, const char *payload, int len); + +int HTTP_ProcessPacket(const char *recvbuf, char *outbuf, int outBufSize, http_send_fn send, int socket); void http_setup(char *o, const char *type); diff --git a/src/new_pins.c b/src/new_pins.c index 1de74b206..20b5da957 100644 --- a/src/new_pins.c +++ b/src/new_pins.c @@ -493,4 +493,20 @@ void PIN_Init(void) ASSERT(kNoErr == result); } +void PIN_set_wifi_led(int value){ + int res = -1; + for (int i = 0; i < 32; i++){ + if ((g_pins.roles[i] == IOR_LED_WIFI) || (g_pins.roles[i] == IOR_LED_WIFI_n)){ + res = i; + break; + } + } + if (res >= 0){ + if (g_pins.roles[res] == IOR_LED_WIFI_n){ + value = !value; + } + RAW_SetPinValue(res, value & 1); + } +} + #endif \ No newline at end of file diff --git a/src/new_pins.h b/src/new_pins.h index bc8f76f9c..5670298b4 100644 --- a/src/new_pins.h +++ b/src/new_pins.h @@ -15,6 +15,8 @@ enum IORole { IOR_LED, IOR_LED_n, IOR_PWM, + IOR_LED_WIFI, + IOR_LED_WIFI_n, IOR_Total_Options, }; @@ -35,6 +37,7 @@ void CHANNEL_Set(int ch, int iVal, int bForce); int CHANNEL_Get(int ch); void PIN_SaveToFlash(); void PIN_LoadFromFlash(); +void PIN_set_wifi_led(int value); // from new_builtin.c void Setup_Device_Empty(); diff --git a/src/tuya_device.c b/src/tuya_device.c index 8943b3178..0b3d052db 100644 --- a/src/tuya_device.c +++ b/src/tuya_device.c @@ -500,6 +500,7 @@ void wl_status( void *ctxt ){ case RW_EVT_STA_SCANNING: case RW_EVT_STA_SCAN_OVER: case RW_EVT_STA_CONNECTING: + PIN_set_wifi_led(0); break; case RW_EVT_STA_BEACON_LOSE: case RW_EVT_STA_PASSWORD_WRONG: @@ -508,15 +509,24 @@ void wl_status( void *ctxt ){ case RW_EVT_STA_DISCONNECTED: /* disconnect with server */ // try to connect again in 5 seconds //reconnect = 5; + PIN_set_wifi_led(0); break; case RW_EVT_STA_CONNECT_FAILED: /* authentication failed */ + PIN_set_wifi_led(0); + break; case RW_EVT_STA_CONNECTED: /* authentication success */ case RW_EVT_STA_GOT_IP: + PIN_set_wifi_led(1); + break; /* for softap mode */ case RW_EVT_AP_CONNECTED: /* a client association success */ + PIN_set_wifi_led(1); + break; case RW_EVT_AP_DISCONNECTED: /* a client disconnect */ case RW_EVT_AP_CONNECT_FAILED: /* a client association failed */ + PIN_set_wifi_led(0); + break; default: break; }