/*********************************************************************
 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;
}
Beispiel #2
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

	}


}