/********************************************************************* Callback from client listening to server in its own thread Only used for data transfers *********************************************************************/ static int async_data_recv(void * p_pData) { context_t * l_pContext = (context_t *) p_pData; while (true) { uint32_t l_FrameSize = 0U; if (network_read_bytes(l_pContext->socket_data, (char *) &l_FrameSize, sizeof(uint32_t)) == RET_NOK) { break; } { l_FrameSize = ntohl(l_FrameSize); wlog(LOGDEVELOPER, "received on data %u bytes long frame on socket %u", l_FrameSize, l_pContext->socket_data); NetworkFrame l_Frame(l_FrameSize); if (network_read_bytes(l_pContext->socket_data, (char *) l_Frame.getFrame(), l_FrameSize) == RET_NOK) { break; } if (parse_incoming_data(l_pContext, l_Frame) == RET_NOK) { break; } } } werr(LOGUSER, "Socket closed on server side."); context_set_connected(l_pContext, false); SDLNet_TCP_Close(l_pContext->socket); SDLNet_TCP_Close(l_pContext->socket_data); context_set_socket(l_pContext, 0); context_set_socket_data(l_pContext, 0); screen_quit(); return 0; }
/*---------------------------------------------------------------------------------------------------------*/ static void ESP8266_Task( void *pvParameters ) { xMessage_t xRxedMessage; // ESP8266_Instance_t *pInstance=(ESP8266_Instance_t*)pvParameters; size_t data_left_in_buffer,isMessageRecieved; currentState = ESP8266_State_StartReset; // data_used_in_buffer_info.BytesWasTested=0; for( ;; ) { isMessageRecieved = xQueueReceive( xQueue, &( xRxedMessage ), ( TickType_t )1000/* portMAX_DELAY*/ ) ; data_left_in_buffer=1; while (data_left_in_buffer) { data_left_in_buffer = 0; if( isMessageRecieved ) { // PRINTF_DBG("---ESP msg type= %d , currState=%d\r\n" , xRxedMessage.type,currentState); if(DATA_FROM_UART == xRxedMessage.type) { if(ESP8266_State_Receiving_Data == currentState) { data_left_in_buffer = receiving_data(); } else { data_left_in_buffer = parse_incoming_data(); } // PRINTF_DBG("---ESP dataLeft =%d, currState=%d\r\n" , data_left_in_buffer ,currentState); DEV_IOCTL(server_device, IOCTL_SET_UNLOCK_DATA_BUFFER , (void*)0); } else { // PRINTF_DBG("---ESP msg pend= %d \r\n" , xRxedMessage.type); memcpy(&pendingMessage,&xRxedMessage,sizeof(xMessage_t)); isMessagePending=1; } } else { if(ESP8266_State_Idle != currentState) { if(SystemTick_API_IsTimeoutTimerExpired(timeoutTimer)) { PRINTF_DBG( "--esp timeout crSt=%d\r\n",currentState); switch(currentState) { case ESP8266_State_StartReset : DEV_IOCTL(server_device,IOCTL_SET_ISR_CALLBACK_DEV, NULL);//skip garbage on uart vTaskDelay( 1 ); send_to_chip((uint8_t*) ESP8266_RESET_STR , sizeof(ESP8266_RESET_STR)-1); DEV_IOCTL(server_device,IOCTL_SET_ISR_CALLBACK_DEV, this_dev); SystemTick_API_StartTimeoutTimer(timeoutTimer,10000); currentState = ESP8266_State_Resetting; break; case ESP8266_State_Resetting : currentState = ESP8266_State_Setting_Mode ; send_to_chip( (uint8_t*)ESP8266_ECHO_OFF , sizeof(ESP8266_ECHO_OFF)-1); vTaskDelay( 1 ); send_to_chip( (uint8_t*)ESP8266_SET_MODE_STR , sizeof(ESP8266_SET_MODE_STR)-1); SystemTick_API_StartTimeoutTimer(timeoutTimer,2); break; case ESP8266_State_Setting_AP: send_str_to_chip( (uint8_t*)ESP8266_CONNECT_TO_AP_STR ); send_str_to_chip( ssid_name_redandency ); send_str_to_chip( (uint8_t*)"\",\"" ); send_str_to_chip( ssid_pswrd_redandency ); send_str_to_chip( (uint8_t*)"\"\r\n" ); currentState = ESP8266_State_Setting_Redundent_Ap ; SystemTick_API_StartTimeoutTimer(timeoutTimer,AP_CONNECT_TIMEOUT); break; case ESP8266_State_Setting_Mode: case ESP8266_State_Setting_Redundent_Ap : send_str_to_chip( (uint8_t*)ESP8266_CONNECT_TO_AP_STR ); send_str_to_chip( ssid_name ); send_str_to_chip( (uint8_t*)"\",\"" ); send_str_to_chip( ssid_pswrd ); send_str_to_chip( (uint8_t*)"\"\r\n" ); currentState = ESP8266_State_Setting_AP ; SystemTick_API_StartTimeoutTimer(timeoutTimer,AP_CONNECT_TIMEOUT); break; case ESP8266_State_Receiving_Data: currentState = returnFromDataReceiveState ; SystemTick_API_StartTimeoutTimer(timeoutTimer,ESP8266_TIMEOUT); break; case ESP8266_State_Wait_For_Send_Ready : case ESP8266_State_Wait_Send_Complete : case ESP8266_State_Wait_For_IP : case ESP8266_State_Openning_Socket : case ESP8266_State_Closing_Socket : lCurrError = 1; lRequest_done=1; currentState = ESP8266_State_Idle; break ; default: break ; } } } } if(isMessagePending && (ESP8266_State_Idle == currentState)) { process_message(); isMessagePending=0; } }// end of while(data_left_in_buffer) #if (1==INCLUDE_uxTaskGetStackHighWaterMark ) { static size_t stackLeft,minStackLeft=0xffffffff; stackLeft = uxTaskGetStackHighWaterMark( NULL ); if(minStackLeft > stackLeft) { minStackLeft = stackLeft; PRINTF_DBG("%s stack left = %d\r\n" , __FUNCTION__ ,minStackLeft); } } #endif } }