iowfehu;gdbjwHJAOPIHO?L

Fork of X_NUCLEO_IDW01M1 by ST

Spwf/wifi_module.c

Committer:
mridup
Date:
2016-04-14
Revision:
1:bd9db471d47d
Parent:
spwf/wifi_module.c@ 0:dc55f40eb04f
Child:
5:c83ffd44f40a

File content as of revision 1:bd9db471d47d:

/**
 ******************************************************************************
 * @file    wifi_module.c
 * @author  Central LAB
 * @version V2.0.0
 * @date    10-February-2016
 * @brief   Enable Wi-Fi functionality using AT cmd set
 ******************************************************************************
 * @attention
 *
 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
 *
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 *   1. Redistributions of source code must retain the above copyright notice,
 *      this list of conditions and the following disclaimer.
 *   2. Redistributions in binary form must reproduce the above copyright notice,
 *      this list of conditions and the following disclaimer in the documentation
 *      and/or other materials provided with the distribution.
 *   3. Neither the name of STMicroelectronics nor the names of its contributors
 *      may be used to endorse or promote products derived from this software
 *      without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 ******************************************************************************
 */
/* Includes ------------------------------------------------------------------*/
#include "wifi_module.h"
//#include "stm32_spwf_wifi.h"
#include "ring_buffer.h"
#include "stdio.h"
#include "string.h"
#include "event_buffer.h"
#include "device.h"
#include "wait_api.h"
#include <stddef.h>

   
/** @addtogroup MIDDLEWARES
* @{
*/ 


/** @defgroup  NUCLEO_WIFI_MODULE
  * @brief Wi-Fi driver modules
  * @{
  */


/** @defgroup NUCLEO_WIFI_MODULE_Private_Defines
  * @{
  */


/**
  * @}
  */


/** @addtogroup NUCLEO_WIFI_MODULE_Private_Variables
  * @{
  */
/* Private variables ---------------------------------------------------------*/

/*All Buffers*/
//uint8_t WiFi_AT_Cmd_Buff[1024];
uint8_t process_buffer[MAX_BUFFER_GLOBAL];
char UserDataBuff[MAX_BUFFER_GLOBAL];
uint8_t USART_RxBuffer[64];//This buffer is only used in the Init phase (to receive "\r\nOK\r\n")
char print_msg_buff[MAX_BUFFER_GLOBAL];
volatile uint8_t ring_buffer[RINGBUF_SIZE];/* Default size for ring buffer */

#ifdef USE_STM32L0XX_NUCLEO
event_s_TypeDef event_buffer[10];
#else
event_s_TypeDef event_buffer[50];
#endif

volatile uint8_t pop_buffer[MAX_BUFFER_GLOBAL];
volatile uint8_t prefetch_buffer[20];
uint8_t uart_byte[1];
buffer_td big_buff;
buffer_e event_buff;
event_s_TypeDef element;
uint8_t HTTP_Runway_Buff[6];//Used to store the last 6 bytes in between User Callbacks during HTTP tx
wifi_scan *wifi_scanned_list; //[MAX_WIFI_SCAN_NETWORK];

volatile Wifi_Status_Var status_flag;

uint32_t wind64_DQ_wait = 0;
uint32_t UserDataBuff_index;
volatile uint32_t tickcount;
uint8_t SocketId;
uint32_t SockON_Data_Len;
uint32_t Socket_Data_Length =0;
uint8_t Socket_Open_ID, sockon_query_id,sockon_id_user;
uint32_t SockON_Data_Length;
uint8_t enable_pending_data =0;

volatile WiFi_WIND_State_TypeDef WiFi_WIND_State;//describes the current WIND number in processing

uint8_t WiFi_Resp_OK = 0;
uint32_t number_of_bytes=0;
uint32_t interim_number_of_bytes=0;
uint32_t Interim_SockON_Data_Len=0;
uint32_t bytes_to_be_read = 0;
uint32_t sock_total_count=0;
uint32_t sockD_total_count=0;
uint32_t ip_fragment_count=0;
uint32_t chunk_size;
uint32_t message_size;
uint32_t WIND55_count=0;
volatile uint32_t WIND64_count=0;
uint8_t user_scan_number;
uint32_t pop_queue_length;
uint32_t pop_buffer_size=0;
uint32_t process_buffer_index = 5;
uint32_t epoch_time = 0;

volatile WiFi_AT_CMD_Response_t WiFi_Module_State;

uint8_t *WiFi_Scan_Buffer;
uint8_t * curr_hostname;
uint8_t * curr_path;
uint8_t * curr_pURL;
uint8_t * curr_protocol;
uint32_t  curr_port_number;
char * curr_data;
uint8_t curr_sockID;
uint8_t * curr_filename;
uint16_t curr_DataLength;
uint16_t sock_server_write_datalength;
char *sock_server_write_pdata;

uint8_t socket_closed_id_callback;
uint8_t remote_socket_closed_id;
uint8_t client_socket_close_id;
volatile uint8_t wifi_ready = WIFI_FALSE;//Set once if wifi is ready for first time
volatile uint8_t wifi_connected = WIFI_FALSE;//Set once if wifi is connected for first time
volatile uint8_t wifi_client_connected = 0;//Set once if client is connected
volatile uint8_t wifi_client_disconnected = 0;//Set once if client is dis-connected
uint8_t gpio_value, gpio_direc, get_cfg_value[64];
WiFi_Status_t user_error_code = WiFi_MODULE_SUCCESS;

uint8_t no_of_open_client_sockets = 0;
wifi_bool open_sockets[8];              //Max open sockets allowed is 8. Each array element depicts one socket (true=open, false=closed)
uint8_t client_MAC_address[17];//current client MAC address store

uint8_t enable_uart_byte_data_receive=1;
uint8_t uart_data_receive_ready=1;

WiFi_Status_t AT_RESPONSE = WiFi_AT_CMD_RESP_ERROR;
uint32_t sleep_count = 0;
uint32_t standby_time = 0;
uint8_t scanned_ssids = 0;
char * prefetch_str;

#if defined (USE_STM32F4XX_NUCLEO) || (USE_STM32L4XX_NUCLEO)
uint8_t WiFi_AT_Cmd_Buff[2048];
#else
uint8_t WiFi_AT_Cmd_Buff[1024];
#endif

#ifdef USART_PRINT_MSG
#define printf(arg)    {sprintf((char*)print_msg_buff,arg);   \
HAL_UART_Transmit(&UartMsgHandle, (uint8_t*)print_msg_buff, strlen(print_msg_buff), 1000);}
#endif  

void * spwf_dev_;

extern void callSpwfSADevice_debug(void* object, const char * string);
extern void callSpwfSADevice_attach(wifi_bool attach); 
 
#if defined (__CC_ARM)
size_t strnlen (const char* s, size_t maxlen);

size_t strnlen (const char* s, size_t maxlen)
    {
    size_t len = 0;

    while ((len <= maxlen) && (*s))
        {
            s++;
            len++;
        }

    return len;
    }
#endif

event_s_TypeDef event_s;
event_s_TypeDef * event_pop_s;

// [DLI]
#ifdef WIFI_USE_VCOM

uint8_t console_listen_char[1];
uint8_t console_input_char[1];
uint8_t console_send_char[1];
uint8_t console_echo_char[1];
uint8_t console_send_ready = 0;
uint8_t console_echo_ready = 1;
uint8_t console_push_ready = 0;

// Virtual-COM UART
void console_input() {
  //HAL_UART_Receive_IT(&UartMsgHandle, (uint8_t *)console_input_char, 1);
}

void wifi_vcom() {
  
  uint8_t * temp;
  
  if (console_push_ready == 1) {
     push_buffer(&big_buff, uart_byte);
     console_push_ready = 0;
     //HAL_UART_Receive_IT(&UartWiFiHandle, (uint8_t *)uart_byte, 1);
  }
 if(console_echo_ready == 0) {
    temp = pop_buffer_queue(&big_buff);
    if(temp != NULL) {
      console_echo_ready = 1;
      //HAL_UART_Transmit_IT(&UartMsgHandle, temp, 1);
    }
 }
}

#endif

/**
  * @}
  */
  
/** @defgroup NUCLEO_WIFI_MODULE_Private_Functions
  * @{
  */

/**
    *Changed/introduced functions for MBED implementation:

- void Wifi_TIM_Handler(void); - new fn 
- void Rx_irq_handler(void); - new fn - in place of HAL_UART_RxCpltCallback
- Receive_Data(); - modified fn
- void wifi_reset(void) - modified fn
- void PowerUp_WiFi_Module(void) - modified fn
- void RX_EXTI_Isr(uint16_t GPIO_Pin) - removed fn
- void HAL_UART_TxCpltCallback(UART_HandleTypeDef *UartHandleArg) - removed fn
- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandleArg) - removed fn
- void HAL_UART_ErrorCallback(UART_HandleTypeDef *UartHandle) - removed fn
- WiFi_Status_t USART_Transmit_AT_Cmd(uint16_t size)- modified fn
*/



/**
  * @brief  WiFi_Module_Init
  *         Initialize wifi module
  * @param  None
  * @retval None
  */
void WiFi_Module_Init(void)
{
#ifdef WIFI_USE_VCOM
  console_input();
#else
  WiFi_Module_State = Process_Event;
#endif  
  
  initialize_status_flags();
  init(&big_buff, RINGBUF_SIZE);//Init the ring buffer  
  wifi_ready = 0; //reset to get user callback on HW started
  wifi_connected = 0; //reset to get user callback on WiFi UP
  Receive_Data();
  
#ifdef USE_STM32L0XX_NUCLEO
  event_init(&event_buff, 10); //max 15 events can be Q'ed (Event Buffer is of size 15)
#else
  event_init(&event_buff, 50); //max 50 events can be Q'ed (Event Buffer is of size 50)
#endif
  
#ifndef WIFI_USE_VCOM
  Start_Timer();  
  memset(open_sockets,0x00, 8); //init the open socket array
        
#endif
}

/**
* @brief  initialize_status_flags
*         Default Wifi status values
* @param  None
* @retval None
*/
void initialize_status_flags()
{
    status_flag.Single_Digit_Indication = WIFI_FALSE;
    status_flag.WiFi_Enabled = WIFI_FALSE;
    status_flag.http_req_pending = WIFI_FALSE;
    status_flag.WiFi_Configuration_Done = WIFI_FALSE;
    status_flag.Timer_Running = WIFI_FALSE;
    status_flag.resume_receive_data = WIFI_FALSE;
    status_flag.enable_dequeue = WIFI_TRUE;
    status_flag.stop_event_dequeue = WIFI_FALSE;
    status_flag.Standby_Timer_Running = WIFI_FALSE;
    status_flag.trigger_wakeup_callback = WIFI_FALSE;
    status_flag.Deep_Sleep_Enabled = WIFI_FALSE;
    status_flag.Standby_Enabled = WIFI_FALSE;
    status_flag.Low_Power_Enabled = WIFI_FALSE;
    status_flag.command_mode=WIFI_TRUE;
    status_flag.data_mode=WIFI_FALSE;
    status_flag.Scan_Ongoing = WIFI_FALSE;
    status_flag.AT_Cmd_Ongoing = WIFI_FALSE;
    status_flag.AT_Cmd_Processing = WIFI_FALSE;
    status_flag.Uartx_Rx_Processing = WIFI_FALSE;
    status_flag.Client_Connected = WIFI_FALSE;
    status_flag.Client_Disconnected = WIFI_FALSE;
    status_flag.switch_by_default_to_command_mode = WIFI_TRUE;
    status_flag.start_sock_read = WIFI_FALSE;
    status_flag.enable_receive_data_chunk = WIFI_FALSE;
    status_flag.data_pending_sockD=WIFI_FALSE;
    status_flag.enable_sock_read = WIFI_FALSE;
    status_flag.enable_query = WIFI_FALSE;
    status_flag.Set_AT_Cmd_Response_False = WIFI_FALSE;
    status_flag.enable_fw_update_read = WIFI_FALSE;
    status_flag.Q_Contains_Message = WIFI_FALSE;
    status_flag.Q_Contains_Data = WIFI_FALSE;
    status_flag.enable_receive_http_response = WIFI_FALSE;
    status_flag.enable_receive_file_response = WIFI_FALSE;
    status_flag.enable_receive_wifi_scan_response = WIFI_FALSE;
    status_flag.prevent_push_OK_event = WIFI_FALSE;
    status_flag.client_socket_close_ongoing = WIFI_FALSE;
    status_flag.prevent_push_WIFI_event = WIFI_FALSE;
    status_flag.sock_read_ongoing = WIFI_FALSE;
    status_flag.enable_client_socket_write = WIFI_FALSE;
    status_flag.event_deQ_x_wind64 = WIFI_FALSE;
    status_flag.do_not_reset_push_WIFI_event = WIFI_FALSE;
    status_flag.message_pending = WIFI_FALSE;
    status_flag.Pending_SockON_Callback = WIFI_FALSE;
    status_flag.Pending_SockD_Callback = WIFI_FALSE;
    status_flag.SockON_Server_Closed_Callback = WIFI_FALSE;
    status_flag.Client_Socket_Close_Cmd = WIFI_FALSE;
    status_flag.standby_resume_callback = WIFI_FALSE;
    status_flag.HTTP_Data_available = WIFI_FALSE;
    status_flag.FILE_Data_available = WIFI_FALSE;
    status_flag.AT_Response_Received = WIFI_FALSE;
    status_flag.Deep_Sleep_Timer = WIFI_FALSE;
    status_flag.Deep_Sleep_Callback = WIFI_FALSE;
}


/**
* @brief  Period elapsed callback in non blocking mode
*         This timer is used for calling back User registered functions with information
* @param  htim : TIM handle
* @retval None
*/

void Wifi_TIM_Handler(void)
{ 
  /**********************************************************************
  *                                                                     *
  *       Be careful not to make a blocking                             *
  *       call from this function, see                                  *
  *       example Socket_Read() and Socket_Close()                      *
  *                                                                     *
  **********************************************************************/
    WiFi_Status_t status = WiFi_MODULE_SUCCESS;

    if(status_flag.stop_event_dequeue == WIFI_FALSE /*&& !status_flag.enable_receive_data_chunk*/)
    {
        __disable_irq();
        event_pop_s = pop_eventbuffer_queue(&event_buff);
        __enable_irq();

        if(event_pop_s!=NULL && event_pop_s->event_pop == WIFI_TRUE)
          {
            switch(event_pop_s->event)
              {
                case WIFI_WIND_EVENT:
                        Process_WiFi_Indication_Cmd(event_pop_s);
                        break;

                case WIFI_OK_EVENT:
                        status_flag.AT_Response_Received = WIFI_TRUE;
                        AT_RESPONSE = WiFi_MODULE_SUCCESS;
                        if(status_flag.Set_AT_Cmd_Response_False == WIFI_TRUE)
                        {
                          status_flag.Set_AT_Cmd_Response_False = WIFI_FALSE;
                          status_flag.AT_Response_Received = WIFI_FALSE;
                        }
                        if(status_flag.enable_client_socket_write)  //allows the OK received after socket client write to be processed
                        {
                          status_flag.AT_Response_Received = WIFI_TRUE;
                          status_flag.enable_client_socket_write = WIFI_FALSE;
                        }
                        break;

                case WIFI_SOCK_ID_EVENT:
                        /*check ID and update SocketID array*/
                        no_of_open_client_sockets++;

                        if(no_of_open_client_sockets > 8)  //Max number of clients is 8
                          {
                              status_flag.AT_Response_Received = WIFI_TRUE;
                              AT_RESPONSE = WiFi_NOT_SUPPORTED;     
                              break;
                          }

                        open_sockets[event_pop_s->socket_id] = WIFI_TRUE;
                        Socket_Open_ID = event_pop_s->socket_id;
                        status_flag.AT_Response_Received = WIFI_TRUE;
                        AT_RESPONSE = WiFi_MODULE_SUCCESS;
                        break;

                case WIFI_HTTP_EVENT:
                        Reset_AT_CMD_Buffer();  
                        memset(UserDataBuff, 0x00, MAX_BUFFER_GLOBAL);//Flush the buffer

                        if(curr_pURL) {
                            sprintf((char*)WiFi_AT_Cmd_Buff,AT_HTTPPOST_REQUEST,curr_pURL);
                        }
                        else {
                          if(curr_port_number!=0)
                            sprintf((char*)WiFi_AT_Cmd_Buff,"AT+S.HTTPGET=%s,%s,%d\r",curr_hostname, curr_path, (int)curr_port_number);
                          else 
                            sprintf((char*)WiFi_AT_Cmd_Buff,"AT+S.HTTPGET=%s,%s\r",curr_hostname, curr_path);
                        }

                        status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));
                        if(status == WiFi_MODULE_SUCCESS) {
                          WiFi_Module_State = Process_Event;
                          status_flag.stop_event_dequeue = WIFI_TRUE;
                          status_flag.http_req_pending = WIFI_TRUE;                            
                        }
                        else {
                          #if DEBUG_PRINT
                            printf("\r\n ERROR IN HTTP \r\n");
                          #endif
                          AT_RESPONSE = WiFi_AT_CMD_RESP_ERROR;
                          status_flag.AT_Response_Received = WIFI_TRUE;
                        }
                        break;

                case WIFI_CLIENT_SOCKET_WRITE_EVENT:
                        Reset_AT_CMD_Buffer();
                        /* AT+S.SOCKW=00,11<cr> */
                        sprintf((char*)WiFi_AT_Cmd_Buff,AT_SOCKET_WRITE,curr_sockID,curr_DataLength);
                        status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));

                        if(status == WiFi_MODULE_SUCCESS) {
                          Reset_AT_CMD_Buffer();
                          memcpy((char*)(char*)WiFi_AT_Cmd_Buff, (char*)curr_data,curr_DataLength);
                          WiFi_AT_Cmd_Buff[curr_DataLength]='\r';

                          status = USART_Transmit_AT_Cmd(curr_DataLength+2);
                          if(status == WiFi_MODULE_SUCCESS) {
                            WiFi_Module_State = Process_Event;
                          }
                          else {
                            #if DEBUG_PRINT
                              printf("\r\n ERROR IN SOCKET\r\n");
                            #endif
                            status_flag.AT_Response_Received = WIFI_TRUE;
                            AT_RESPONSE = WiFi_AT_CMD_RESP_ERROR;
                          }
                        }
                        else {
                          #if DEBUG_PRINT
                            printf("\r\n ERROR In Socket\r\n");
                          #endif
                          status_flag.AT_Response_Received = WIFI_TRUE;
                          AT_RESPONSE = WiFi_AT_CMD_RESP_ERROR;
                        }
                        break;
                 
                case WIFI_CLIENT_SOCKET_OPEN_EVENT:
                        Reset_AT_CMD_Buffer();

                        /* AT+S.SOCKON = myserver,1234,t <cr> */  
                        sprintf((char*)WiFi_AT_Cmd_Buff,AT_SOCKET_OPEN,curr_hostname,(int)curr_port_number,curr_protocol);        
                        status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));
                        if(status != WiFi_MODULE_SUCCESS)
                        {
                          #if DEBUG_PRINT
                            printf("\r\n ERROR During Socket Open \r\n");
                          #endif
                          status_flag.AT_Response_Received = WIFI_TRUE;
                          AT_RESPONSE = WiFi_AT_CMD_RESP_ERROR;
                        }
                        break;
                        
                case WIFI_CLIENT_SOCKET_CLOSE_EVENT:
                        Reset_AT_CMD_Buffer();

                         /* AT+S.SOCKC=00<cr> */
                        sprintf((char*)WiFi_AT_Cmd_Buff,AT_SOCKET_CLOSE,event_pop_s->socket_id);
                        status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));
                        if(status == WiFi_MODULE_SUCCESS)
                        {
                          AT_RESPONSE = WiFi_MODULE_SUCCESS;
                          status_flag.prevent_push_OK_event = WIFI_TRUE;  //prevent the OK received after socket close command to be Q'ed
                          status_flag.stop_event_dequeue = WIFI_TRUE;
                          remote_socket_closed_id = event_pop_s->socket_id;
                          status_flag.client_socket_close_ongoing = WIFI_TRUE; //used for making changes in the value of open_sockets[sock_id] if no error is returned
//                          status_flag.SockON_Server_Closed_Callback = WIFI_TRUE;
                        }
                        else
                        {
                          #if DEBUG_PRINT
                            printf("\r\n ERROR During Socket Close \r\n");
                          #endif
                        }
                        break; 


                case WIFI_FILE_EVENT:
                        Reset_AT_CMD_Buffer();

                        if(curr_filename == NULL)
                        {
                            /* AT+S.FSL */
                            sprintf((char*)WiFi_AT_Cmd_Buff,AT_DISPLAY_FILE_NAME);
                        }
                        else if(curr_hostname == NULL)
                        {
                            /* AT+S.FSP=/index.html  */
                            sprintf((char*)WiFi_AT_Cmd_Buff,AT_DISPLAY_FILE_CONTENT,curr_filename);
                        }
                        else
                        {
                            /* AT+S.HTTPDFSUPDATE=%s,/outfile.img  */
                            sprintf((char*)WiFi_AT_Cmd_Buff,AT_DOWNLOAD_IMAGE_FILE,curr_hostname,curr_filename,(int)curr_port_number);
                        }
                        status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));
                        if(status == WiFi_MODULE_SUCCESS)
                        {
                            WiFi_Module_State = Process_Event;
                            status_flag.enable_receive_http_response = WIFI_TRUE;
                            status_flag.enable_receive_data_chunk = WIFI_TRUE;
                            status_flag.enable_receive_file_response = WIFI_TRUE;
                        }
                        else {
                          #if DEBUG_PRINT
                            printf("\r\n ERROR in FILE \r\n");
                          #endif
                          status_flag.AT_Response_Received = WIFI_TRUE;
                          AT_RESPONSE = WiFi_AT_CMD_RESP_ERROR;
                        }
                        break;

              case WIFI_FW_UPDATE_EVENT:
                        Reset_AT_CMD_Buffer();
                        sprintf((char*)WiFi_AT_Cmd_Buff,"AT+S.FWUPDATE=%s,/%s,%d\r",curr_hostname,curr_filename,(int)curr_port_number);
                        status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));
                        if(status == WiFi_MODULE_SUCCESS)
                        {
                          WiFi_Module_State = Process_Event;
                          status_flag.enable_fw_update_read = WIFI_TRUE;
                          status_flag.enable_receive_data_chunk = WIFI_TRUE;
                        }
                        else 
                        {
                          #if DEBUG_PRINT
                            printf("\r\n ERROR in Firmware \r\n");
                          #endif
                          status_flag.AT_Response_Received = WIFI_TRUE;
                          AT_RESPONSE = WiFi_AT_CMD_RESP_ERROR;
                        }
                        break;

                case WIFI_ERROR_EVENT:
                        #if DEBUG_PRINT
                          printf("\r\n ERROR!\r\n");
                        #endif
                        status_flag.AT_Response_Received = WIFI_TRUE;
                        AT_RESPONSE = WiFi_AT_CMD_RESP_ERROR;
                        break;

                case WIFI_GCFG_EVENT:
                case WIFI_GPIO_EVENT:
                        status_flag.AT_Response_Received = WIFI_TRUE;
                        AT_RESPONSE = WiFi_MODULE_SUCCESS; 
                        break;

                case WIFI_STANDBY_CONFIG_EVENT:
                        #if DEBUG_PRINT
                            printf("\r\nGoing into standby..\r\n");  
                        #endif
                        WiFi_Module_State = Process_Event;
                        break;

                case WIFI_RESUME_CONFIG_EVENT:
                        #if DEBUG_PRINT
                            printf("\r\nResuming from standby..\r\n");
                        #endif
                        status_flag.AT_Response_Received = WIFI_TRUE;//let main run-on
                        break;
                        
                 case WIFI_NO_EVENT:
                    break;
             }
          }
    }            
            /* If data is pending on client socket SOCKON, make read requests*/
            if(status_flag.start_sock_read == WIFI_TRUE)
                    {
                        //flush_buffer_queue(&big_buff);
                        Socket_Read(Socket_Data_Length);
                        status_flag.start_sock_read = WIFI_FALSE;
                    }

            /* Call Query, after notification for TLS is received */
            else if(status_flag.enable_query == WIFI_TRUE && status_flag.enable_dequeue == WIFI_TRUE)
                    {
                        //@TBD: Flushing the buffer may be detrimental if we have genuine follow on WIND55?
                        //flush_buffer_queue(&big_buff);  //Flush the buffer to remove WIND:55 in pipeline (This maybe a problem)
                        Socket_Pending_Data();
                        status_flag.enable_query = WIFI_FALSE;
                    }

            else if(status_flag.Pending_SockON_Callback==WIFI_TRUE)//for client socket
                    {
                        //Now callback to user with user_data pointer <UserDataBuff>              
                        ind_wifi_socket_data_received(sockon_id_user, (uint8_t *)UserDataBuff, message_size, chunk_size);
                        memset(UserDataBuff, 0x00, MAX_BUFFER_GLOBAL);//Flush the buffer
                        Resume_Dequeue();
                        status_flag.Pending_SockON_Callback=WIFI_FALSE;
                    }

            else if(status_flag.Pending_SockD_Callback == WIFI_TRUE)//for server socket
                    {
                        //if(status_flag.command_mode)//if command_mode is achieved then callback else loop in this state
                        {
                        //Now callback to user with user_data pointer <UserDataBuff>
                        ind_wifi_socket_data_received(9, (uint8_t *)UserDataBuff, message_size, chunk_size);
                        memset(UserDataBuff, 0x00, MAX_BUFFER_GLOBAL);//Flush the buffer
                        Resume_Dequeue();
                        status_flag.Pending_SockD_Callback=WIFI_FALSE;      
                        }
                    }

            else if(status_flag.Client_Socket_Close_Cmd==WIFI_TRUE)//for client socket
                    {
                        //Close the socket
                        //Change State to AT_Cmd_Response before calling socket_close()
                        WiFi_Module_State = Process_Event;
                        wifi_socket_client_close(client_socket_close_id);
                        status_flag.Client_Socket_Close_Cmd = WIFI_FALSE;
//                        status_flag.SockON_Server_Closed_Callback = WIFI_TRUE;
                    }

            else if(status_flag.SockON_Server_Closed_Callback==WIFI_TRUE)//for client socket
                    {
                        //callback the user
                        ind_wifi_socket_client_remote_server_closed(&socket_closed_id_callback);
                        status_flag.SockON_Server_Closed_Callback = WIFI_FALSE;
                    }

            else if(status_flag.HTTP_Data_available == WIFI_TRUE)
                    {
                        ind_wifi_http_data_available((uint8_t *)UserDataBuff,UserDataBuff_index);
                        memset(UserDataBuff, 0x00, MAX_BUFFER_GLOBAL);//Flush the buffer
//                        memcpy(&UserDataBuff, &HTTP_Runway_Buff, 6);
//                        memset(HTTP_Runway_Buff, 0x00, 6);
                        Resume_Dequeue();
                        status_flag.HTTP_Data_available=WIFI_FALSE;
                    }

            else if (status_flag.FILE_Data_available == WIFI_TRUE)
                    {
                        ind_wifi_file_data_available((uint8_t *) UserDataBuff);
                        memset(UserDataBuff, 0x00, MAX_BUFFER_GLOBAL);//Flush the buffer
                        Resume_Dequeue();
                        status_flag.FILE_Data_available = WIFI_FALSE;
                    }
            else if(status_flag.Client_Connected == WIFI_TRUE)
                    {
                            ind_socket_server_client_joined();
                            status_flag.Client_Connected = WIFI_FALSE;
                    }

            else if(status_flag.Client_Disconnected == WIFI_TRUE)
                    {
                        ind_socket_server_client_left();
                        status_flag.Client_Disconnected = WIFI_FALSE;
                    }

            //Make callbacks from here to user for pending events
            
            if(WiFi_WIND_State.WiFiHWStarted==WIFI_TRUE)
                {
                    if(wifi_ready == 2)//Twice reset for User Callback
                        {
                            wifi_ready++;
                            ind_wifi_on();//Call this once only...This if for wifi_on (instead of console active
                        }
                }

            if(WiFi_WIND_State.WiFiUp == WIFI_TRUE)
                {
                    if(wifi_connected == 0)
                        {
                            wifi_connected = 1;
                            ind_wifi_connected();//wifi connected
                        }    
                    WiFi_WIND_State.WiFiUp = WIFI_FALSE;
                }

            else if(WiFi_WIND_State.WiFiStarted_MiniAPMode == WIFI_TRUE)
                {
                    ind_wifi_ap_ready();
                    WiFi_WIND_State.WiFiStarted_MiniAPMode = WIFI_FALSE;
                }

            else if(WiFi_WIND_State.WiFiAPClientJoined == WIFI_TRUE)
                {
                      ind_wifi_ap_client_joined(client_MAC_address);
                      WiFi_WIND_State.WiFiAPClientJoined = WIFI_FALSE;
                }

            else if(WiFi_WIND_State.WiFiAPClientLeft == WIFI_TRUE)
                {
                      ind_wifi_ap_client_left(client_MAC_address);
                      WiFi_WIND_State.WiFiAPClientLeft = WIFI_FALSE;
                }

            else if(status_flag.Deep_Sleep_Callback == WIFI_TRUE)
                {
                      ind_wifi_resuming();
                      status_flag.Deep_Sleep_Callback = WIFI_FALSE;
                }

            else if(status_flag.standby_resume_callback == WIFI_TRUE)
                {
                      ind_wifi_resuming();
                      status_flag.standby_resume_callback = WIFI_FALSE;
                }

            else if(WiFi_WIND_State.WiFiHWFailure==WIFI_TRUE)
                {      
                      WiFi_WIND_State.WiFiHWFailure=WIFI_FALSE;
                      ind_wifi_error(WiFi_HW_FAILURE_ERROR);//call with error number      
                }

            else if(WiFi_WIND_State.HardFault==WIFI_TRUE)
                {      
                      WiFi_WIND_State.HardFault=WIFI_FALSE;
                      ind_wifi_error(WiFi_HARD_FAULT_ERROR);//call with error number      
                }

            else if(WiFi_WIND_State.StackOverflow==WIFI_TRUE)
                {      
                      WiFi_WIND_State.StackOverflow=WIFI_FALSE;
                      ind_wifi_error(WiFi_STACK_OVERFLOW_ERROR);//call with error number      
                }

            else if(WiFi_WIND_State.MallocFailed==WIFI_TRUE)
                {      
                      WiFi_WIND_State.MallocFailed=WIFI_FALSE;
                      ind_wifi_error(WiFi_MALLOC_FAILED_ERROR);//call with error number      
                }

            else if(WiFi_WIND_State.InitFailure==WIFI_TRUE)
                {      
                      WiFi_WIND_State.InitFailure=WIFI_FALSE;
                      ind_wifi_error(WiFi_INIT_ERROR);//call with error number      
                }

            else if(WiFi_WIND_State.StartFailed==WIFI_TRUE)
                {      
                      WiFi_WIND_State.StartFailed=WIFI_FALSE;
                      ind_wifi_error(WiFi_START_FAILED_ERROR);//call with error number      
                }
            
            else if(WiFi_WIND_State.WiFiException==WIFI_TRUE)
                {      
                      WiFi_WIND_State.WiFiException=WIFI_FALSE;
                      ind_wifi_error(WiFi_EXCEPTION_ERROR);//call with error number      
                }

            else if(WiFi_WIND_State.PS_Mode_Failure==WIFI_TRUE)
                {      
                      WiFi_WIND_State.PS_Mode_Failure=WIFI_FALSE;
                      ind_wifi_warning(WiFi_POWER_SAVE_WARNING);//call with error number      
                }

            else if(WiFi_WIND_State.HeapTooSmall==WIFI_TRUE)
                {      
                      WiFi_WIND_State.HeapTooSmall=WIFI_FALSE;
                      ind_wifi_warning(WiFi_HEAP_TOO_SMALL_WARNING);//call with error number      
                }
            
            else if(WiFi_WIND_State.WiFiSignalLOW==WIFI_TRUE)
                {      
                      WiFi_WIND_State.WiFiSignalLOW=WIFI_FALSE;
                      ind_wifi_warning(WiFi_SIGNAL_LOW_WARNING);//call with error number      
                }    
            
            else if(WiFi_WIND_State.WiFiDeauthentication == WIFI_TRUE)
                {
                      WiFi_WIND_State.WiFiDeauthentication = WIFI_FALSE;
                      ind_wifi_connection_error(WiFi_DE_AUTH);
                }
            
            else if(WiFi_WIND_State.WiFiDisAssociation == WIFI_TRUE)
                {
                      WiFi_WIND_State.WiFiDisAssociation = WIFI_FALSE;
                      ind_wifi_connection_error(WiFi_DISASSOCIATION);
                }
            
            else if(WiFi_WIND_State.WiFiJoinFailed == WIFI_TRUE)
                {
                      WiFi_WIND_State.WiFiJoinFailed = WIFI_FALSE;
                      ind_wifi_connection_error(WiFi_JOIN_FAILED);
                }
            
            else if(WiFi_WIND_State.WiFiScanBlewUp == WIFI_TRUE)
                {
                      WiFi_WIND_State.WiFiScanBlewUp = WIFI_FALSE;
                      ind_wifi_connection_error(WiFi_SCAN_BLEWUP);  //@TBD to check if user made call, so not call callback if true
                }
            
            else if(WiFi_WIND_State.WiFiScanFailed == WIFI_TRUE)
                {
                      WiFi_WIND_State.WiFiScanFailed = WIFI_FALSE;
                      ind_wifi_connection_error(WiFi_SCAN_FAILED);  //@TBD to check if user made call, so not call callback if true
                }
            
            else if(WiFi_WIND_State.WiFiUnHandledInd == WIFI_TRUE)
                {
                      WiFi_WIND_State.WiFiUnHandledInd = WIFI_FALSE;
                      ind_wifi_packet_lost(WiFi_UNHANDLED_IND_ERROR);  //@TBD to check if user made call, so not call callback if true
                }
            
            else if(WiFi_WIND_State.WiFiRXMgmt == WIFI_TRUE)
                {
                      WiFi_WIND_State.WiFiRXMgmt = WIFI_FALSE;
                      ind_wifi_packet_lost(WiFi_RX_MGMT);  //@TBD to check if user made call, so not call callback if true
                }
            
            else if(WiFi_WIND_State.WiFiRXData == WIFI_TRUE)
                {
                      WiFi_WIND_State.WiFiRXData = WIFI_FALSE;
                      ind_wifi_packet_lost(WiFi_RX_DATA);  //@TBD to check if user made call, so not call callback if true
                }  
            
            else if(WiFi_WIND_State.WiFiRxUnk == WIFI_TRUE)
                {
                      WiFi_WIND_State.WiFiRxUnk = WIFI_FALSE;
                      ind_wifi_packet_lost(WiFi_RX_UNK);  //@TBD to check if user made call, so not call callback if true
                }  
            
            else if(WiFi_WIND_State.WiFiSockdDataLost == WIFI_TRUE)
                {
                      WiFi_WIND_State.WiFiSockdDataLost = WIFI_FALSE;
                      ind_wifi_socket_server_data_lost();  //@TBD to check if user made call, so not call callback if true
                }
      
}


/**
* @brief  Start_Timer
*         Start Timer 
* @param  None
* @retval None
*/
void Start_Timer()
{
  //tickcount = WIFI_FALSE;
  status_flag.Timer_Running = WIFI_TRUE;
}

/**
* @brief  Stop_Timer
*         Stop Timer request
* @param  None
* @retval None
*/
void Stop_Timer()
{  
  //tickcount = WIFI_FALSE;  
  status_flag.Timer_Running = WIFI_FALSE;    
  //UartReady = SET;
}

/**
* @brief  Stop_Dequeue
*         Stop dequeuing data from the ring buffer
* @param  None
* @retval None
*/
void Stop_Dequeue()
{
  status_flag.enable_dequeue = WIFI_FALSE;
}

/**
* @brief  Resume_Dequeue
*         Resume dequeuing data from the ring buffer
* @param  None
* @retval None
*/
void Resume_Dequeue()
{
  status_flag.enable_dequeue = WIFI_TRUE;
}

/**
* @brief  Wifi_SysTick_Isr
*         Function called every SysTick to process buffer
* @param  None
* @retval None
*/
void Wifi_SysTick_Isr()
{
    //Check if Data is Paused
    if((status_flag.Timer_Running) && (status_flag.enable_dequeue==WIFI_TRUE))
        {    
            Process_WiFi();
        }
    
    if(status_flag.Timeout_Timer) tickcount++;
    
    /*if(status_flag.resume_receive_data == WIFI_TRUE)
        {
            if(is_half_empty(&big_buff))
                {
                    status_flag.resume_receive_data = WIFI_FALSE;
                    //callSpwfSADevice_attach(1);
                    Receive_Data();
                    
                }
        }*/
    
 
    if(status_flag.Standby_Timer_Running) // module is in sleep and after expiry RX will be conf as EXTI
    {
        if((standby_time++) >= EXTI_CONF_TIMER)
            {
                status_flag.Standby_Timer_Running=WIFI_FALSE;
                standby_time = 0;
                //configure_to_exti();
            }
    }

    /*A Resume WIND:70 has come and triggered this
    So checking here if after that resume we fall back to sleep (another WIND69) within SLEEP_RESUME_PREVENT time.
    If yes, we assume it is a false resume and hence do nothing and go back to sleep
    If no WIND69 (going into sleep) has come, we can assume the resume was genuine and then enable the callback
    */
    if((status_flag.Deep_Sleep_Timer) && ( sleep_count++) >= SLEEP_RESUME_PREVENT)
        {
            if(status_flag.Deep_Sleep_Enabled == WIFI_TRUE)//which means we have received another WIND69 in the 2 seconds
                {
                    //do nothing, go back to sleep
                    status_flag.Deep_Sleep_Enabled = WIFI_TRUE;
                    status_flag.Deep_Sleep_Callback = WIFI_FALSE;
                }
    else if (status_flag.Deep_Sleep_Enabled == WIFI_FALSE) //which means we have not received any WIND69 during the last 2 seconds
        {
            //enable the user callback as it is a genuine WIND70
            status_flag.Deep_Sleep_Callback = WIFI_TRUE;
        }
    Stop_DeepSleep_Timer();
    }
}


/**
* @brief  USART_Receive_AT_Resp
*         Receive and check AT cmd response
* @param  WiFi_AT_CMD_Response_t : WIFi module next state 
* @retval WiFi_Status_t : Response of AT cmd  
*/

WiFi_Status_t USART_Receive_AT_Resp(WiFi_AT_CMD_Response_t state)
{
  WiFi_Module_State = state;
  tickcount=0;//reset timer
  status_flag.Timeout_Timer = WIFI_TRUE;
  while(status_flag.AT_Response_Received != WIFI_TRUE) {
        if(tickcount >=20000)//20 sec wait
        {
            AT_RESPONSE = WiFi_AT_CMD_RESP_ERROR;
            break;
        }
        __NOP();
    }
  status_flag.Timeout_Timer = WIFI_FALSE;
  status_flag.AT_Response_Received = WIFI_FALSE;
  return AT_RESPONSE;
}


/**
* @brief  Process_WiFi
*         Pop a byte from the circular buffer and send the byte for processing
*         This function should be called from main or should be run with a periodic timer
* @param  None
* @retval None
*/
void Process_WiFi(void)
{
    uint8_t * temp;//pop buffer temporary
    
    __disable_irq();
    temp=pop_buffer_queue(&big_buff);   //contents of temp(pop_buffer) will not change till another de-queue is made
    __enable_irq();

    if(temp!=NULL) 
    {
      Process_Buffer(temp);
    }
    
   if(status_flag.event_deQ_x_wind64)//if de-Q is stopped due to WIND64 wait
   {
     wind64_DQ_wait++;//1ms for each count
     if(wind64_DQ_wait>200)//wait for 50ms for example
     {
       wind64_DQ_wait=0;
       status_flag.event_deQ_x_wind64 = WIFI_FALSE;
       //re-enable event Q after 200ms
       status_flag.stop_event_dequeue = WIFI_FALSE;
     }
   }
}

/**
* @brief  Process_Buffer
*         Process and construct a Wind Line buffer
* @param  ptr: pointer to one single byte
* @retval None
*/

void Process_Buffer(uint8_t * ptr)
{
  static uint32_t Fillptr=0;//count=0;
  static uint8_t index, chan_value;
  unsigned char rxdata = 0;
  int rssi_value = 0;
  char SocketId_No[2];
  char databytes_No[4];
  char * pStr;

  rxdata =  *(ptr+0);  
  //printf(&rxdata);//check prints for debug...to be removed or kept in DEBUG statement
  if(status_flag.enable_receive_data_chunk == WIFI_FALSE)
    process_buffer[Fillptr++] = rxdata;
   reset_event(&event_s);
    switch (WiFi_Module_State)
    {
    case Process_Event:

          if((process_buffer[Fillptr-2]==0xD) && (process_buffer[Fillptr-1]==0xA) && !status_flag.enable_receive_http_response && !status_flag.sock_read_ongoing)
            {
                if((strstr((const char *)process_buffer,"WIND:")) != NULL)
                {
                    if((strstr((const char *)process_buffer,"+WIND:67:")) !=NULL)
                        event_s.event = WIFI_STANDBY_CONFIG_EVENT;

                    else if ((strstr((const char *)process_buffer,"+WIND:68:"))!= NULL)
                        event_s.event = WIFI_RESUME_CONFIG_EVENT;

                    else
                        {
                            //end of msg received. Will not receive any other msg till we process this.
                            //Stop_Timer();
                            //#if defined (USE_STM32L0XX_NUCLEO) || (USE_STM32F4XX_NUCLEO) || (USE_STM32L4XX_NUCLEO)
                            //__disable_irq();
                            //#endif
                            Process_Wind_Indication(&process_buffer[0]);
                            //#if defined (USE_STM32L0XX_NUCLEO) || (USE_STM32F4XX_NUCLEO) || (USE_STM32L4XX_NUCLEO)
                            //__enable_irq();
                            //#endif
                            //Start_Timer();
                            sock_total_count=0;
                        }

                    if(!status_flag.prevent_push_WIFI_event)
                        {
                            __disable_irq();
                            push_eventbuffer(&event_buff, event_s);
                             __enable_irq();
                            reset_event(&event_s);
                        }

                    if (!status_flag.do_not_reset_push_WIFI_event) status_flag.prevent_push_WIFI_event = WIFI_FALSE;
                    if(status_flag.enable_sock_read)
                        {
                            status_flag.sock_read_ongoing = WIFI_FALSE;//we finished processing a message and now sock read will commence
                            status_flag.Q_Contains_Message = WIFI_FALSE;
                        }
                    Fillptr=0;
                    memset(process_buffer, 0x00, strlen((const char*)process_buffer));
                }

                else if((strstr((const char *)process_buffer,"\r\nOK\r\n")) != NULL)
                {
                    /*Now Check to which AT Cmd response this OK belongs to so that correct parsing can be done*/

                    // SOCKON ID (Open a client socket)
                    if(((pStr=(strstr((const char *)process_buffer,"ID: "))) != NULL))      
                    {
                            SocketId_No[0]    = *(pStr + 4) ;
                            SocketId_No[1]    = *(pStr + 5) ;
                            SocketId          = (((SocketId_No[0] - '0') * 10 ) + (SocketId_No[1] - '0'));
                            event_s.socket_id = SocketId;
                            event_s.event     =  WIFI_SOCK_ID_EVENT;
                            __disable_irq();
                            push_eventbuffer(&event_buff, event_s);
                             __enable_irq();
                            reset_event(&event_s);
                            if(status_flag.enable_sock_read)
                            {
                                status_flag.sock_read_ongoing = WIFI_FALSE;  //we finished processing a message and now sock read will commence
                                status_flag.Q_Contains_Message = WIFI_FALSE;
                            }
                            Fillptr=0;
                            sock_total_count=0;
                            memset(process_buffer, 0x00, MAX_BUFFER_GLOBAL);
                     }

                      // DATALEN from SOCKQ
                     else if((pStr=(strstr((const char *)process_buffer,"DATALEN: "))) != NULL)
                     {
                            //Find the DataLength and do a socket read
                            databytes_No[0] = *(pStr + 9);
                            databytes_No[1] = *(pStr + 10);
                            databytes_No[2] = *(pStr + 11);
                            databytes_No[3] = *(pStr + 12);

                            if( databytes_No[1] == '\r')
                            {
                                SockON_Data_Len = databytes_No[0] - '0'; 
                            }
                            else if( databytes_No[2] == '\r')
                            {
                                SockON_Data_Len = (((databytes_No[0] - '0') * 10 ) + (databytes_No[1] - '0'));
                            }
                            else if( databytes_No[3] == '\r')
                            {
                                SockON_Data_Len = (((databytes_No[0] - '0') * 100 ) + ((databytes_No[1] - '0') * 10 ) + (databytes_No[2] - '0'));
                            }
                            else //it's a 4-digit number
                            {
                               SockON_Data_Len  = ((databytes_No[0] - '0') * 1000 ) + ((databytes_No[1] - '0') * 100 ) + ((databytes_No[2] - '0') * 10) + (databytes_No[3] - '0');
                            }
                            Socket_Data_Length = SockON_Data_Len;
                            if(Socket_Data_Length != 0)
                            {
                                  status_flag.start_sock_read = WIFI_TRUE;
                            }
                            else if(Socket_Data_Length == 0)
                            {
                                status_flag.stop_event_dequeue = WIFI_FALSE;      //continue popping events if nothing to read
                                status_flag.Set_AT_Cmd_Response_False = WIFI_FALSE;
                            }
                            Fillptr = 0;
                            sock_total_count = 0;
                            if(status_flag.enable_sock_read)
                            {
                                status_flag.sock_read_ongoing = WIFI_FALSE;  //we finished processing a message and now sock read will commence
                                status_flag.Q_Contains_Message = WIFI_FALSE;
                                pop_buffer_size = 0;
                                pop_buffer[0]='\0';     // required as this byte is already used in process_buffer
                            }
                            memset(process_buffer, 0x00, MAX_BUFFER_GLOBAL);
                     }

                      else if((((strstr((const char *)process_buffer," = "))) != NULL))
                      {
                            // AT command GCFG
                            pStr = (char *) strstr((const char *)process_buffer," = ");
                            event_s.event = WIFI_GCFG_EVENT;
                            memcpy(get_cfg_value, pStr+2, (strlen(pStr)-2));
                            __disable_irq();
                            push_eventbuffer(&event_buff, event_s);
                             __enable_irq();
                            reset_event(&event_s);
                            if(status_flag.enable_sock_read)
                              {
                                  status_flag.sock_read_ongoing = WIFI_FALSE;    //we finished processing a message and now sock read will commence
                                  status_flag.Q_Contains_Message = WIFI_FALSE;
                              }
                            Fillptr=0;
                            memset(process_buffer, 0x00, MAX_BUFFER_GLOBAL);
                      }

                      else
                      {
                            //This is a standalone OK
                            /*Cases possible
                            - TLSCERT,TLSCERT2, TLSDOMAIN, SETTIME
                            - S.SOCKW, SOCKR, S.SOCKC, S.SOCKD (open a server socket)
                            - File Operations
                            - S.GPIOC and S.GPIOW
                            */
                            //Push a simple OK Event, if this is an OK event required to be pushed to Q 
                            if(status_flag.prevent_push_OK_event)
                                {
                                    //This OK is not to be handled, hence the pop action on OK completion to be done here
                                    //since pop will not happen
//                                  stop_event_dequeue=WIFI_FALSE;
                                    
                                    if(status_flag.client_socket_close_ongoing)
                                      {
                                          if(no_of_open_client_sockets > 0)
                                            no_of_open_client_sockets--;
                                          status_flag.prevent_push_OK_event = WIFI_FALSE;
                                          open_sockets[remote_socket_closed_id] = WIFI_FALSE;
                                          socket_closed_id_callback = remote_socket_closed_id;
                                          status_flag.Set_AT_Cmd_Response_False = WIFI_FALSE;
                                          status_flag.client_socket_close_ongoing = WIFI_FALSE;
                                          status_flag.SockON_Server_Closed_Callback = WIFI_TRUE;
                                          status_flag.stop_event_dequeue=WIFI_FALSE;
                                      }
                                    
                                }

                            else
                                {
                                        event_s.ok_eval = WIFI_TRUE;
                                        event_s.event = WIFI_OK_EVENT;
                                        __disable_irq();
                                        push_eventbuffer(&event_buff, event_s);
                                         __enable_irq();
                                        reset_event(&event_s);
                                }
                            status_flag.prevent_push_OK_event = WIFI_FALSE;
                            memset(process_buffer, 0x00, Fillptr);
                            Fillptr=0;
                            sock_total_count=0;
                            if(status_flag.enable_sock_read)
                                {
                                    status_flag.sock_read_ongoing = WIFI_FALSE;//we finished processing a message and now sock read will commence
                                    status_flag.Q_Contains_Message = WIFI_FALSE;
                                }
                            break;
                        }
                }

               else if((((strstr((const char *)process_buffer,"ERROR"))) != NULL))
                {
                    //This is an ERROR
                    //There can be only ONE outstanding AT command and hence this ERROR belongs to that
                    //HTTP -> ERROR: host not found
                    //@TBD: Check all Errors Possible here???
                    if((strstr((const char *)process_buffer,"\r\nERROR: Pending data\r\n")) != NULL)    //if Error after sock close command and not 'OK'
                    {
                        printf("\r\nERROR: Socket could not be closed..PENDING DATA\r\n");
                        status_flag.prevent_push_OK_event = WIFI_FALSE;     //prevent the OK received after socket close command to be Q'ed
                        status_flag.client_socket_close_ongoing = WIFI_FALSE;
                        status_flag.stop_event_dequeue = WIFI_FALSE;
                    }
                    else
                    {
                        event_s.event = WIFI_ERROR_EVENT;
                        __disable_irq();
                        push_eventbuffer(&event_buff, event_s);
                         __enable_irq();
                        reset_event(&event_s);
                        if(status_flag.stop_event_dequeue)
                          /*ERROR:Illegal Socket ID*/
                        status_flag.stop_event_dequeue= WIFI_FALSE;//continue popping events if nothing to read
                    }
                    Fillptr=0;
                    sock_total_count=0;
                    if(status_flag.enable_sock_read)
                    {
                        status_flag.sock_read_ongoing = WIFI_FALSE;//we finished processing a message and now sock read will commence
                        status_flag.Q_Contains_Message = WIFI_FALSE;
                    }
                    memset(process_buffer, 0x00, MAX_BUFFER_GLOBAL);
                }

               else if((((strstr((const char *)process_buffer,"GPIO "))) != NULL)) 
                {
                      // Receive GPIO Read
                      pStr = (char *) strstr((const char *)process_buffer,"= 0,");                                  
                      if(pStr != NULL)
                          {
                              gpio_value = 0;
                          } 
                      else 
                          gpio_value = 1;   
                      
                      pStr = (char *) strstr((const char *)process_buffer,"out");                                  
                      if(pStr != NULL)
                        {
                            gpio_direc= 0;    //out
                        }
                      else
                        {
                            gpio_direc= 1;    //in
                        }
                      //Push GPIO Read Event on Event_Queue
                      event_s.event = WIFI_GPIO_EVENT;
                      __disable_irq();
                      push_eventbuffer(&event_buff, event_s);
                       __enable_irq();
                      reset_event(&event_s);
                      if(status_flag.enable_sock_read)
                        {
                            status_flag.sock_read_ongoing = WIFI_FALSE;     //we finished processing a message and now sock read will commence
                            status_flag.Q_Contains_Message = WIFI_FALSE;
                        }
                      Fillptr = 0;
                      memset(process_buffer, 0x00, strlen((const char*)process_buffer));
                      break;
                }

               else
               {
                  if(status_flag.enable_sock_read && status_flag.Q_Contains_Message && !status_flag.message_pending)
                  {
                      printf((const char*)&process_buffer[0]);
                      status_flag.Q_Contains_Message = WIFI_FALSE;
                      status_flag.Q_Contains_Data = WIFI_TRUE;
                      //status_flag.enable_sock_read = WIFI_FALSE;
                      //status_flag.stop_event_dequeue= WIFI_FALSE;
                  }

                  //if in data mode, reset on \r\n
                  if(!status_flag.sock_read_ongoing && status_flag.data_mode)
                  {
                    Fillptr = 0;
                    memset(process_buffer, 0x00, strlen((const char*)process_buffer));
                  }
               }
            }

            else if (status_flag.http_req_pending)   //HTTP Response Check
            {
                 if((strstr((const char *)&process_buffer[0],"200 OK\r")) != NULL || (strstr((const char *)&process_buffer[0],"400 Bad Request\r")) != NULL 
                        || (strstr((const char *)&process_buffer[0],"401 Unauthorized\r")) != NULL || (strstr((const char *)&process_buffer[0],"403 Forbidden\r")) != NULL 
                        || (strstr((const char *)&process_buffer[0],"404 Not Found\r")) != NULL || (strstr((const char *)&process_buffer[0],"408 Request Timeout\r")) != NULL 
                        || (strstr((const char *)&process_buffer[0],"500 Internal Server Error\r")) != NULL  || (strstr((const char *)&process_buffer[0],"502 Bad Gateway\r")) != NULL 
                        || (strstr((const char *)&process_buffer[0],"504 Gateway Timeout\r")) != NULL)
                {
                    status_flag.enable_receive_http_response = WIFI_TRUE;
                    status_flag.enable_receive_data_chunk = WIFI_TRUE;
                    status_flag.http_req_pending = WIFI_FALSE;
                    pop_buffer[0]='\0';
                    pop_buffer_size=0;
                    process_buffer_index =6;
                }
            }

          else if ((process_buffer[Fillptr-1]==0x09) && (process_buffer[Fillptr-2]==':') && (process_buffer[Fillptr-3]=='1'))//<ht> Horizontal Tab for Scan Result?
            {
                status_flag.enable_receive_wifi_scan_response = WIFI_TRUE;
            }

          if(!status_flag.Pending_SockON_Callback && !status_flag.HTTP_Data_available && !status_flag.FILE_Data_available)
          {
              //Check Process Buffer for any pending message
              if(status_flag.enable_receive_data_chunk)
                {
                    if(!status_flag.Q_Contains_Data && pop_buffer_size)
                    {
                      pop_queue_length = pop_buffer_size;
                      if(Fillptr + pop_queue_length > 511)
                      {
                         uint32_t length = (Fillptr + pop_queue_length) - 511;
                        __disable_irq();
                         rewind_buffer_queue(&big_buff,length);
                         __enable_irq();
                         memset(ptr+(511 - Fillptr), 0x00, length);
                         pop_queue_length = 511 - Fillptr;
                      }
                      memcpy(process_buffer+Fillptr,(char const *)pop_buffer, pop_queue_length);
                      Fillptr = Fillptr + pop_queue_length;

                      if(Fillptr > 512)
                      {
                          printf("\r\nFillptr corrupted!!\r\n");
                      }

                      if((strstr((const char *)process_buffer,"ERROR: ")) != NULL)
                      {
                           status_flag.Q_Contains_Message = WIFI_FALSE;
                           status_flag.message_pending = WIFI_FALSE;
                      }
                      else if(!status_flag.sock_read_ongoing && !status_flag.enable_receive_http_response) 
                      {
                          if(process_buffer[0]!='\0') 
                          {
                            if(((process_buffer[0]==0xD) && (process_buffer[1]==0xA)) && process_buffer[2] != 0xD) 
                            {
                              status_flag.message_pending = WIFI_TRUE;
                              if((pStr = (strstr((const char *)process_buffer+2,"\r\n"))) != NULL) 
                              {                    // process buffer has complete message
                                    int wind_length = ((uint8_t *)pStr - (uint8_t *)process_buffer)+2;  

                                    if(strstr((const char *)process_buffer+2,"DATALEN:")) 
                                    {
                                          pStr = strstr((const char *)process_buffer + wind_length,"\r\nOK\r\n"); //find OK, as DATALEN has to be terminated by OK
                                          if(pStr!=NULL)
                                          {
                                              wind_length = ((uint8_t *)pStr-(uint8_t *)process_buffer)+6;
                                          }
                                    }

                                    if(Fillptr-wind_length)
                                    {
                                          __disable_irq();
                                        rewind_buffer_queue(&big_buff, Fillptr - wind_length);             
                                        __enable_irq();
                                        memset(process_buffer + wind_length,0x00,Fillptr - wind_length);
                                        Fillptr = wind_length;
                                    }
                                    status_flag.message_pending = WIFI_FALSE;
                                }
                                status_flag.Q_Contains_Message = WIFI_TRUE;
                              }
                          }
                      }
                   }
                }

              if(!status_flag.Q_Contains_Message && status_flag.enable_sock_read && pop_buffer_size)     /*read is enabled*/
              {
                  status_flag.sock_read_ongoing = WIFI_TRUE;
                  sock_total_count = sock_total_count + pop_queue_length;

                  /* Check for "ERROR: Not enough data in buffer " */
                  pStr = (char *) strstr((const char *)&process_buffer,"ERROR: ");

                  if (pStr != NULL)
                  {
                      if((process_buffer[Fillptr-2]==0xD) && (process_buffer[Fillptr-1]==0xA))
                      {
                        if((pStr = (char *)strstr((const char *)&process_buffer,"\r\nERROR: Too many sockets\r\n")) !=NULL)
                        {
                           #if DEBUG_PRINT
                             printf("\r\nERROR: TOO MANY SOCKETS \r\n");
                           #endif
                          
                            if(*(pStr+27)!='\0')
                            {
                                int len = (uint8_t *)pStr - (uint8_t *)process_buffer;
                                int extra_bytes = Fillptr - (len+27);
                                __disable_irq();
                                rewind_buffer_queue(&big_buff, extra_bytes);
                                __enable_irq();
                            }
                            Fillptr=0;
                            sock_total_count =0;
                            memset(process_buffer, 0x00, MAX_BUFFER_GLOBAL);
                            status_flag.AT_Response_Received = WIFI_TRUE;
                            AT_RESPONSE = WiFi_AT_CMD_RESP_ERROR;
                            break;
                        }
                        else if((pStr = (char *)strstr((const char *)&process_buffer,"\r\nERROR: Pending data\r\n")) !=NULL)
                        {
                           #if DEBUG_PRINT
                             printf("\r\nERROR: PENDING DATA \r\n");
                           #endif
                          
                            if(*(pStr+23)!='\0')
                            {
                                int len = (uint8_t *)pStr - (uint8_t *)process_buffer;
                                int extra_bytes = Fillptr - (len+23);
                                __disable_irq();
                                rewind_buffer_queue(&big_buff, extra_bytes);
                                __enable_irq();
                            }
                            Fillptr=0;
                            sock_total_count =0;
                            memset(process_buffer, 0x00, MAX_BUFFER_GLOBAL);
                            status_flag.AT_Response_Received = WIFI_TRUE;
                            AT_RESPONSE = WiFi_AT_CMD_RESP_ERROR;
                            break;
                        }

                        printf("\rERROR DURING SOCK READ\r\n");
                        sock_total_count=0;
                        SockON_Data_Len=0;
                        SockON_Data_Length=0;
                        status_flag.enable_sock_read = WIFI_FALSE;
                        status_flag.stop_event_dequeue = WIFI_FALSE;
                        status_flag.Q_Contains_Message = WIFI_FALSE;
                        status_flag.Q_Contains_Data = WIFI_FALSE;
                        enable_pending_data = 0;
                        status_flag.enable_receive_data_chunk = WIFI_FALSE;
                        WIND64_count=0;
                        process_buffer_index =5;
                        //status_flag.enable_query = TRUE;  //do we have more data?
                        Fillptr=0;
                        status_flag.sock_read_ongoing = WIFI_FALSE;
                        if(status_flag.data_pending_sockD)
                        {
                            status_flag.data_pending_sockD=WIFI_FALSE;
                            number_of_bytes=0;
                            status_flag.switch_by_default_to_command_mode=WIFI_TRUE;
                            WiFi_switch_to_command_mode(); //switch by default
                        }

                        memset(process_buffer, 0x00, MAX_BUFFER_GLOBAL);
                        break;
                     }
                  }
                  
                  /*now check if end of msg received*/
                  if(sock_total_count >= SockON_Data_Length)
                  {
                    #if DEBUG_PRINT
                     printf("\nReached SockON_Data_Len \r\n");
                    #endif

                    if(sock_total_count > SockON_Data_Length)
                    {
                        int databytes = sock_total_count - SockON_Data_Length;
                        __disable_irq();
                        rewind_buffer_queue(&big_buff, databytes);
                        __enable_irq();
                        memset(process_buffer+(Fillptr - databytes), 0x00, databytes);
                        Fillptr = Fillptr - databytes;
                    }
                    chunk_size = Fillptr;
                    message_size = SockON_Data_Length;
                    memcpy(UserDataBuff, process_buffer, Fillptr);
                    Fillptr = 0;
                    sock_total_count = 0;
                    SockON_Data_Len = 0;
                    status_flag.Q_Contains_Data = WIFI_FALSE;
                    status_flag.Q_Contains_Message = WIFI_FALSE;
                    status_flag.enable_receive_data_chunk = WIFI_FALSE;
                    enable_pending_data = 0;

                    if(status_flag.data_pending_sockD)
                    {
//                        status_flag.data_pending_sockD=WIFI_FALSE;
                        number_of_bytes=0;
                        sockon_id_user = 0;
                        if(WIND64_count>0)
                            WIND64_count--;                         //decrease the number of pending WIND:64 Events
                        if(WIND64_count==0) {
                        status_flag.switch_by_default_to_command_mode=WIFI_TRUE;
                        WiFi_switch_to_command_mode();              //switch by default
                        }
                        status_flag.enable_query = WIFI_FALSE;
                    }
                    else
                    {
                        status_flag.enable_query = WIFI_TRUE;
                        sockon_id_user = sockon_query_id;
                        /*@TODO: Do not need to prevent OK push in case of server socket*/
                        status_flag.prevent_push_OK_event = WIFI_TRUE;    //prevent the qeueuing of the OK after this read operation
                    }

                    status_flag.enable_sock_read = WIFI_FALSE;
                    status_flag.sock_read_ongoing = WIFI_FALSE;
                    Stop_Dequeue();                           //Stop dequeue till user callback returns
                    status_flag.Pending_SockON_Callback = WIFI_TRUE;      //set this to callback to user with User Buffer pointer
                                  //do we have more data?
                    if(status_flag.data_pending_sockD)
                    {
                      status_flag.stop_event_dequeue = WIFI_FALSE;
                      status_flag.data_pending_sockD = WIFI_FALSE;
                    }
                    memset(process_buffer, 0x00, MAX_BUFFER_GLOBAL);
                    break;
                  }

                  if(Fillptr >= MAX_BUFFER_GLOBAL-1)
                  {
                    message_size = SockON_Data_Length;
                    chunk_size = 511;
                    memcpy(UserDataBuff, process_buffer, Fillptr);
                    Fillptr = 0;
                    process_buffer_index = 5;
                    Stop_Dequeue();
                    memset(process_buffer, 0x00, MAX_BUFFER_GLOBAL); 
                    status_flag.Pending_SockON_Callback = WIFI_TRUE;      //set this to callback to user with User Buffer pointer
                  }
                  break;
              }

              if (status_flag.enable_receive_http_response && pop_buffer_size) // http response enabled
              {
                  status_flag.sock_read_ongoing = WIFI_TRUE;
                  if((pStr = (strstr((const char *)process_buffer + process_buffer_index - 6,"\r\nOK\r\n"))) != NULL)  
                    {
                        #if DEBUG_PRINT
                          printf("\r\nOK\r\n");         //http response completed
                        #endif

                        if(*(pStr+7) != '\0')
                        {
                            int len = (uint8_t *)pStr - (uint8_t *)process_buffer;
                            int extra_bytes = Fillptr - (len+6);
                            __disable_irq();
                            rewind_buffer_queue(&big_buff, extra_bytes);
                            __enable_irq();
                            
                            memset(process_buffer+len+7, 0x00, extra_bytes);
                            Fillptr = Fillptr - extra_bytes;
                        }

                        memcpy(UserDataBuff, process_buffer, Fillptr);
                        UserDataBuff_index = Fillptr;
                        status_flag.AT_Response_Received = WIFI_TRUE;
                        status_flag.enable_receive_data_chunk = WIFI_FALSE;
                        status_flag.enable_receive_http_response = WIFI_FALSE;
                        Stop_Dequeue();
                        AT_RESPONSE = WiFi_MODULE_SUCCESS;
                        status_flag.sock_read_ongoing = WIFI_FALSE;
                        status_flag.Q_Contains_Data = WIFI_FALSE;
                        status_flag.Q_Contains_Message = WIFI_FALSE;
                        status_flag.stop_event_dequeue = WIFI_FALSE;
                        process_buffer_index = 6;
                        memset(process_buffer, 0x00, Fillptr);
                        Fillptr=0;

                        if(status_flag.enable_receive_file_response)
                          status_flag.FILE_Data_available = WIFI_TRUE;
                        else
                          status_flag.HTTP_Data_available=WIFI_TRUE;
                    }

                    else if(((strstr((const char *)process_buffer + process_buffer_index-6,"ERROR"))) != NULL)
                    {
                        #if DEBUG_PRINT
                        printf("\r\nERROR\r\n");
                        #endif
                        status_flag.AT_Response_Received = WIFI_TRUE;
                        AT_RESPONSE = WiFi_AT_CMD_RESP_ERROR;
                        status_flag.sock_read_ongoing = WIFI_FALSE;
                        status_flag.enable_receive_data_chunk = WIFI_FALSE;
                        status_flag.Q_Contains_Data = WIFI_FALSE;
                        status_flag.Q_Contains_Message = WIFI_FALSE;
                        Fillptr=0;
                        process_buffer_index=6;
                        status_flag.enable_receive_http_response = WIFI_FALSE;
                        memset(process_buffer, 0x00, MAX_BUFFER_GLOBAL);

                        if(status_flag.enable_receive_file_response)
                          status_flag.FILE_Data_available = WIFI_FALSE;
                        else
                          status_flag.HTTP_Data_available=WIFI_FALSE;
                    }

                    process_buffer_index = Fillptr;
                    if(Fillptr == MAX_BUFFER_GLOBAL-1 )
                    {
                          memcpy(UserDataBuff, process_buffer, Fillptr);
                          memcpy(&HTTP_Runway_Buff, &UserDataBuff[505], 6);
                          memset(&UserDataBuff[505], 0x00, 6);
                          memset(process_buffer, 0x00, MAX_BUFFER_GLOBAL);
                          memcpy(&process_buffer, &HTTP_Runway_Buff, 6);
                          memset(HTTP_Runway_Buff, 0x00, 6);
                          Fillptr = 6;
                          process_buffer_index = 6;
                          UserDataBuff_index = 505;
                          Stop_Dequeue();
                          
                          if(status_flag.enable_receive_file_response)
                            status_flag.FILE_Data_available = WIFI_TRUE;
                          else
                            status_flag.HTTP_Data_available=WIFI_TRUE;
                    }
                    break;
              }
          }
          if((!status_flag.Q_Contains_Message) && status_flag.enable_receive_wifi_scan_response)
          {
                /*now check if end of msg received*/
                if((process_buffer[Fillptr-2]==0xD) && (process_buffer[Fillptr-1]==0xA))
                {       
                  if(scanned_ssids < user_scan_number)
                    {
                        pStr = (char *) strstr((const char *)&process_buffer,"CHAN:");            
                        if(pStr != NULL)
                            {
                                databytes_No[0] = *(pStr + 6) ;
                                databytes_No[1] = *(pStr + 7) ;
                      
                                chan_value = (((databytes_No[0] - '0') * 10 ) + (databytes_No[1] - '0'));
                            }

                        wifi_scanned_list[scanned_ssids].channel_num = chan_value;

                        pStr = (char *) strstr((const char *)&process_buffer,"RSSI:");            
                        if(pStr != NULL)
                            {
                                databytes_No[0] = *(pStr + 7) ;
                                databytes_No[1] = *(pStr + 8) ;
                      
                                rssi_value = (((databytes_No[0] - '0') * 10 ) + (databytes_No[1] - '0'));
                            }

                        wifi_scanned_list[scanned_ssids].rssi = -(rssi_value);

                        pStr = (char *) strstr((const char *)&process_buffer,"SSID:");
                        if(pStr != NULL)
                            {
                                index = 7;
                                while(*(pStr + index) != 0x27)
                                    {
                                        wifi_scanned_list[scanned_ssids].ssid[index-7] = *(pStr + index);
                                        index++;
                                        if(index==35) break; //max ssid lenght is 30 characters
                                    }                                
                            }

                        pStr = (char *) strstr((const char *)&process_buffer,"WPA ");            
                        if(pStr != NULL)
                            {
                                wifi_scanned_list[scanned_ssids].sec_type.wpa = WIFI_TRUE;
                            } else
                                wifi_scanned_list[scanned_ssids].sec_type.wpa = WIFI_FALSE;
                        
                        pStr = (char *) strstr((const char *)&process_buffer,"WPA2 ");            
                        if(pStr != NULL)
                            {
                                wifi_scanned_list[scanned_ssids].sec_type.wpa2 = WIFI_TRUE;
                            } else
                                wifi_scanned_list[scanned_ssids].sec_type.wpa2 = WIFI_FALSE;
                        
                        pStr = (char *) strstr((const char *)&process_buffer,"WPS ");            
                        if(pStr != NULL)
                            {
                                wifi_scanned_list[scanned_ssids].sec_type.wps = WIFI_TRUE;
                            } else
                                wifi_scanned_list[scanned_ssids].sec_type.wps = WIFI_FALSE;

                        scanned_ssids++;//increment total_networks
                        //callSpwfSADevice_debug(spwf_dev_,(const char*)scanned_ssids);
                    }

                  //end of one line from SCAN result       
                  pStr = (char *) strstr((const char *)&process_buffer,"ERROR");
                  if(pStr != NULL)
                  {
                   #if DEBUG_PRINT
                   printf("ERROR Scan Failed"); 
                   #endif
                   memset(process_buffer, 0x00, MAX_BUFFER_GLOBAL);
                   Fillptr=0;
                   status_flag.AT_Response_Received = WIFI_TRUE;
                   status_flag.enable_receive_wifi_scan_response = WIFI_FALSE;
                   status_flag.Scan_Ongoing = WIFI_FALSE; //Enable next scan
                   AT_RESPONSE = WiFi_AT_CMD_RESP_ERROR;     
                   break;
                  }

                  #if DEBUG_PRINT
                  printf((const char*)process_buffer);
                  #endif
                    
                  callSpwfSADevice_debug(spwf_dev_,(const char*)process_buffer);
                  
                  if(((strstr((const char *)process_buffer,"OK\r\n"))) != NULL /*|| scanned_ssids==10*/)/*Max 10 networks supported*/
                  {
                    //print and go for next line
                    //If Any part of scan line contains "OK" this will exit!!
                    #if DEBUG_PRINT
                      printf("\nOK\r\n");   
                    #endif
                    status_flag.Scan_Ongoing = WIFI_FALSE; //Enable next scan             
                    scanned_ssids=0;                       
                    Fillptr=0;
                    status_flag.AT_Response_Received = WIFI_TRUE;
                    status_flag.enable_receive_wifi_scan_response = WIFI_FALSE;
                    AT_RESPONSE = WiFi_MODULE_SUCCESS;
                    memset(process_buffer, 0x00, MAX_BUFFER_GLOBAL);    
                    break;
                  }

                  Fillptr=0;
                  memset(process_buffer, 0x00, MAX_BUFFER_GLOBAL);          
                }

                if(Fillptr>=MAX_BUFFER_GLOBAL-1)
                {
                  #if DEBUG_PRINT
                  printf("\rHTTP: process_buffer Max Buffer Size reached\r\n");
                  #endif          
                  Fillptr=0;          
                  memset(process_buffer, 0x00, MAX_BUFFER_GLOBAL); 
                }
          }

          if((!status_flag.Q_Contains_Message) && status_flag.enable_fw_update_read)
          {
                  #ifdef DEBUG_PRINT
                  printf("*");     //print * till finish    
                  #endif

                  pStr = (char *) strstr((const char *)process_buffer,"Complete!");

                  if(pStr != NULL)
                  {
                        #ifdef DEBUG_PRINT
                        printf("\r\nUpdate complete\r\n");
                        #endif
                        status_flag.AT_Response_Received = WIFI_TRUE;
                        AT_RESPONSE = WiFi_MODULE_SUCCESS;
                        status_flag.enable_fw_update_read = WIFI_FALSE;
                        Fillptr=0;
                        memset(process_buffer, 0x00, strlen((char const *)process_buffer));
                  } 
                  if(Fillptr>=MAX_BUFFER_GLOBAL)
                  {
                      Fillptr=0;
                      memset(process_buffer, 0x00, strlen((char const *)process_buffer));
                  }

                  //No change of state till we get "+WIND:17:F/W update complete!"
          }

          /*else no other case is satisfied at least do the following*/
          {
                if(Fillptr>=MAX_BUFFER_GLOBAL-1)
                  {
                      Fillptr=0;
                      memset(process_buffer, 0x00,MAX_BUFFER_GLOBAL-1);
                  }
          }
  }
}

/**
* @brief  Process_Wind_Indication_Cmd
*         Process Wind indication command
* @param  process_buff_ptr: pointer of WiFi indication buffer
* @retval None
*/

void Process_Wind_Indication(uint8_t *process_buff_ptr)
{
  char * pStr = (char*)process_buff_ptr;
  char Indication_No[2]; 
  char databytes_No[4]; 
  #if DEBUG_PRINT
  printf((const char*)process_buff_ptr);
  #endif
  //callSpwfSADevice_debug(spwf_dev_,(const char*)process_buff_ptr);
  
  char * ptr_offset;
  int i;

  uint32_t wind55_data_len=0;
  WiFi_Indication_t Wind_No = Undefine_Indication;
  
  if(pStr != NULL)
  {
      pStr = (char *) strstr((const char *)(pStr),"WIND:");///////
      
      if(pStr != NULL)
      {
          Indication_No[0] = *(pStr + 5) ;
          Indication_No[1] = *(pStr + 6) ;
          
          if( Indication_No[1] == ':')
          {
            status_flag.Single_Digit_Indication = WIFI_TRUE;
            /*  Convert char to integer */
            Wind_No = (WiFi_Indication_t)(Indication_No[0] - '0'); 
          }
          else
          {
            status_flag.Single_Digit_Indication = WIFI_FALSE;
            /* Convert char to integer */   
            Wind_No = (WiFi_Indication_t)(((Indication_No[0] - '0') * 10 ) + (Indication_No[1] - '0'));
          }
          
          event_s.wind = Wind_No;
          event_s.event = WIFI_WIND_EVENT;
          
          switch (Wind_No)
          {
          case SockON_Data_Pending: /*WIND:55*/
              
                  /*+WIND:55:Pending Data:%d:%d*/   
                  ptr_offset = (char *) strstr((const char *)&process_buffer,"Data:");
            
                  /*Need to find out which socket ID has data pending*/
                  databytes_No[0] = *(ptr_offset + 5);
                  
                  SocketId = (databytes_No[0] - '0');//Max number of sockets is 8 (so single digit)
                  event_s.socket_id = SocketId; 
                  enable_pending_data = 1;
            
                  /* EQ. Check for ENC string to identify TLS case. Set enable_query */ 
                  if ( (*(ptr_offset + 7) == 'E') && (*(ptr_offset + 8) == 'N') && (*(ptr_offset + 9) == 'C') )
                  {
                        event_s.enc = WIFI_TRUE;
                  }
                  else
                  {                
                        //And find the length of the data
                        databytes_No[0] = *(ptr_offset + 7);
                        databytes_No[1] = *(ptr_offset + 8);
                        databytes_No[2] = *(ptr_offset + 9);
                        databytes_No[3] = *(ptr_offset + 10);
            
                         if( databytes_No[1] == '\r')
                         {      
                                        wind55_data_len = databytes_No[0] - '0'; 
                         }
                         else if( databytes_No[2] == '\r')
                         {
                                        wind55_data_len = (((databytes_No[0] - '0') * 10 ) + (databytes_No[1] - '0'));
                         }
                         else if( databytes_No[3] == '\r') //it's a 3-digit number
                         {
                                        wind55_data_len = (((databytes_No[0] - '0') * 100 ) + ((databytes_No[1] - '0') * 10 ) + (databytes_No[2] - '0'));
                         }
                         else   //it's a 4-digit number
                         {
                                        wind55_data_len = ((databytes_No[0] - '0') * 1000 ) + ((databytes_No[1] - '0') * 100 ) + ((databytes_No[2] - '0') * 10) + (databytes_No[3] - '0');            
                         }                
                         
                           event_s.data_length = wind55_data_len;
                           wind55_data_len = 0;
                   }
                   break;

              case SockON_Server_Socket_Closed:
                    //Find the id of the socket closed
                    //ptr_offset = (char *) strstr((const char *)pStr,"+WIND:58");
                    databytes_No[0] = *(pStr + 22) ;
                    databytes_No[1] = *(pStr + 23) ;
                    if( databytes_No[1] == '\r')
                    {
                          remote_socket_closed_id = databytes_No[0] - '0'; 
                    }
                    else
                    {
                          remote_socket_closed_id = (((databytes_No[0] - '0') * 10 ) + (databytes_No[1] - '0'));
                    }
                    event_s.socket_id = remote_socket_closed_id;
                    break;      
                    
              case SockD_Pending_Data:
                    if(status_flag.prevent_push_WIFI_event) 
                    {
                      #ifdef DEBUG_PRINT
                      printf(">>IG\r\n");
                      #endif
                      return; ///exit if push is prevented
                    }

                  /* @TODO: Do something to delay the de-Q of pending packets so that any further
                            pending WIND64 packets are allowed to arrive and get Q-ed */

                    if(status_flag.event_deQ_x_wind64)      //which means there is already a previous WIND64
                    {
                      wind64_DQ_wait=0;         //reset the timer
                    }
                    else
                    {
                      status_flag.stop_event_dequeue = WIFI_TRUE;//Stop the event de-Q
                      status_flag.event_deQ_x_wind64 = WIFI_TRUE;//Set the flag
                    }
                    //Start Reading data from Client Here.    
                    // +WIND:64:Sockd Pending Data:1:130:130
                    ptr_offset = (char *) strstr((const char *)&process_buffer,"Data:");

                    //Store the packet number
                    databytes_No[0] = *(ptr_offset + 5) ;
                    event_s.wind64_pending_packet_no = databytes_No[0] - '0';

                    //And now find the data length
                    databytes_No[0] = *(ptr_offset + 8) ;//points to number just after 2nd colon
                    databytes_No[1] = *(ptr_offset + 9) ;
                    databytes_No[2] = *(ptr_offset + 10) ;
                    databytes_No[3] = *(ptr_offset + 11) ;
          
                    if( databytes_No[0] == ':')//then it is a 1 digit number
                    {
                      databytes_No[0] = *(ptr_offset + 7) ;
                      databytes_No[1] = *(ptr_offset + 8) ;
                    }
                    else if(databytes_No[1] == ':')//two digit number
                    {
                      databytes_No[0] = *(ptr_offset + 7) ;
                      databytes_No[1] = *(ptr_offset + 8) ;
                      databytes_No[2] = *(ptr_offset + 9) ;
                      //databytes_No[3] = *(ptr_offset + 13) ;
                    }
                    else if(databytes_No[2] == ':')//three digit number
                    {
                      databytes_No[0] = *(ptr_offset + 7) ;
                      databytes_No[1] = *(ptr_offset + 8) ;
                      databytes_No[2] = *(ptr_offset + 9) ;
                      databytes_No[3] = *(ptr_offset + 10) ;
                    }
                    else if(databytes_No[3] == ':')//four digit number
                    {
                      databytes_No[0] = *(ptr_offset + 7) ;
                      databytes_No[1] = *(ptr_offset + 8) ;
                      databytes_No[2] = *(ptr_offset + 9) ;
                      databytes_No[3] = *(ptr_offset + 10) ;
                    }

                    if( databytes_No[1] == ':')
                    {
                      interim_number_of_bytes = databytes_No[0] - '0'; 
                    }
                    else if( databytes_No[2] == ':')
                    {
                      interim_number_of_bytes = (((databytes_No[0] - '0') * 10 ) + (databytes_No[1] - '0'));
                    }
                    else if( databytes_No[3] == ':')
                    {
                      interim_number_of_bytes = (((databytes_No[0] - '0') * 100 ) + ((databytes_No[1] - '0') * 10 ) + (databytes_No[2] - '0'));
                    }
                    else //it's a 4-digit number
                    {
                      interim_number_of_bytes = (((databytes_No[0] - '0') * 1000 ) + ((databytes_No[1] - '0') * 100 ) + ((databytes_No[2] - '0') * 10 ) + (databytes_No[3] - '0'));
                    }            

                    if(WIND64_count >= 1) /*WIND:64 came after pop of previous event and switch to data mode was issued*/
                                       /*WIND:64 came before pop of previous event and switch to data mode was issued*/
                        {
                            event_s.data_length = interim_number_of_bytes;// - (730*WIND64_count);
                            WIND64_count++;           //Count of the number of queued WIND:64 Events
                            interim_number_of_bytes = 0;
                            break;
                        }
                    else
                        {
                            event_s.data_length = interim_number_of_bytes;
                            WIND64_count++; //Count of the number of queued WIND:64 Events
                            interim_number_of_bytes = 0;
                        }
                    break;

                case In_Command_Mode:
                    status_flag.command_mode= WIFI_TRUE;
                    status_flag.data_mode= WIFI_FALSE;
                    WIND64_count=0;     //reset the WIND64 count since the previous data mode would have consumed all data
                    break;

                case In_Data_Mode:
                    status_flag.command_mode = WIFI_FALSE;
                    status_flag.data_mode = WIFI_TRUE;

                    if(status_flag.switch_by_default_to_command_mode == WIFI_TRUE)
                    {
                      if(!status_flag.command_mode)
                      {
                        WiFi_switch_to_command_mode();//switch by default
                      }    
                    }
                    if(status_flag.data_pending_sockD == WIFI_TRUE)
                      {
                          
                         process_buffer_index =5;
                         status_flag.enable_sock_read = WIFI_TRUE;//now data will start coming
                        //Set the data-length to read
                        SockON_Data_Length = number_of_bytes;
                      }
                    break;
                    
                case WiFi__MiniAP_Associated:
                    //Find out which client joined by parsing the WIND //+WIND:28
                    ptr_offset = (char *) strstr((const char *)&process_buffer,"+WIND:28");
                    for(i=17;i<=33;i++)
                    client_MAC_address[i-17] = *(ptr_offset + i) ;    
                    WiFi_WIND_State.WiFiAPClientJoined = WIFI_TRUE;
                    break;
                    
                case WiFi_MiniAP_Disassociated:
                    //Find out which client left by parsing the WIND //+WIND:72
                    ptr_offset = (char *) strstr((const char *)&process_buffer,"+WIND:72");
                    for(i=17;i<=33;i++)
                    client_MAC_address[i-17] = *(ptr_offset + i) ;
                    WiFi_WIND_State.WiFiAPClientLeft = WIFI_TRUE;
                    break;

                case Console_Active:
                case Poweron :
                case WiFi_Reset:
                case Watchdog_Running:
                case Heap_Too_Small:
                case WiFi_Hardware_Dead:
                case Watchdog_Terminating:
                case SysTickConfigure:
                case Hard_Fault:
                case StackOverflow:
                case MallocFailed:
                case Error:
                case WiFi_PS_Mode_Failure:
                case CopyrightInfo:
                case WiFi_BSS_Regained:
                case WiFi_Signal_LOW:
                case WiFi_Signal_OK:
                case FW_update:
                case Encryption_key_Not_Recognized:
                case WiFi_Join:
                case JOINFAILED:
                case WiFi_Scanning:
                case SCANBLEWUP:
                case SCANFAILED:
                case WiFi_Up:
                case WiFi_Association_Successful:
                case WiFi_Started_MiniAP_Mode:
                case Start_Failed :
                case WiFi_EXCEPTION :
                case WiFi_Hardware_Started :
                case WiFi_BSS_LOST:
                case WiFi_Unhandled_Event:
                case Scan_Complete:
                case WiFi_UNHANDLED_IND:
                case WiFi_UNHANDLED:
                case WiFi_Powered_Down:
                case WiFi_MiniAP_Mode :
                case WiFi_Deauthentication:
                case WiFi_Disassociation:
                case RX_MGMT:
                case RX_DATA:
                case RX_UNK:
                case DOT11_AUTHILLEGAL:
                case Creating_PSK:
                case WPA_Terminated :
                case WPA_Supplicant_Failed:
                case WPA_Handshake_Complete:
                case GPIO_line:
                case Wakeup:
                case Factory_debug:
                case Remote_Configuration:
                     break;
                default:
                     break;
            }
         memset(process_buffer, 0x00, MAX_BUFFER_GLOBAL);
      }
   }
}

/**
* @brief  Process_Dequeued_Wind_Indication
*         Process Wind Indication after popping from Queue
* @param  event_pop_s1 popped event contents
* @retval None
*/

void Process_WiFi_Indication_Cmd(event_s_TypeDef * event_pop_s1)
{
  switch(event_pop_s1->wind)
  { 
    case Console_Active:
        WiFi_WIND_State.ConsoleActive = WIFI_TRUE;
      break;
    case Poweron :
        WiFi_WIND_State.WiFiPowerON = WIFI_TRUE;
      break;
    case WiFi_Reset:
        WiFi_WIND_State.WiFiReset = WIFI_TRUE;
      break;
    case Watchdog_Running:
      break;
    case Heap_Too_Small:
          WiFi_WIND_State.HeapTooSmall=WIFI_TRUE;
      break;
    case WiFi_Hardware_Dead:
        WiFi_WIND_State.WiFiHWFailure = WIFI_TRUE;
      break;
    case Watchdog_Terminating:
      break;
    case SysTickConfigure:
      break;
    case Hard_Fault:
        WiFi_WIND_State.HardFault = WIFI_TRUE;
      break;   
    case StackOverflow:
      WiFi_WIND_State.StackOverflow = WIFI_TRUE;
      break;
    case MallocFailed:
      WiFi_WIND_State.MallocFailed = WIFI_TRUE;
      break;
    case Error:
      WiFi_WIND_State.InitFailure = WIFI_TRUE;
      break;
    case WiFi_PS_Mode_Failure:
      WiFi_WIND_State.PS_Mode_Failure = WIFI_TRUE;
      break;
    case CopyrightInfo:
      break;
    case WiFi_BSS_Regained:
      break;
    case WiFi_Signal_LOW:
          WiFi_WIND_State.WiFiSignalLOW = WIFI_TRUE;
      break;
    case WiFi_Signal_OK :
      break;
    case FW_update:
      break;
    case Encryption_key_Not_Recognized:
      break;
    case WiFi_Join :
        WiFi_WIND_State.WiFiJoin = WIFI_TRUE;
      break;
    case JOINFAILED :
      WiFi_WIND_State.WiFiJoinFailed = WIFI_TRUE;
      break;
    case WiFi_Scanning :
        WiFi_WIND_State.WiFiScanning = WIFI_TRUE;
      break;
    case SCANBLEWUP:
      WiFi_WIND_State.WiFiScanBlewUp = WIFI_TRUE;
      break;
    case SCANFAILED:
      WiFi_WIND_State.WiFiScanFailed = WIFI_TRUE;
      break;
    case WiFi_Up:
        WiFi_WIND_State.WiFiUp = WIFI_TRUE;
      break;
    case WiFi_Association_Successful:
        WiFi_WIND_State.WiFiAssociation = WIFI_TRUE;
      break;
    case WiFi_Started_MiniAP_Mode:
        WiFi_WIND_State.WiFiStarted_MiniAPMode = WIFI_TRUE;
      break;
    case Start_Failed :
        WiFi_WIND_State.StartFailed = WIFI_TRUE;  
      break;
    case WiFi_EXCEPTION :
        WiFi_WIND_State.WiFiException = WIFI_TRUE;
      break;
    case WiFi_Hardware_Started :
        wifi_ready++;
        status_flag.WiFi_Enabled = WIFI_TRUE;
        WiFi_WIND_State.WiFiHWStarted = WIFI_TRUE;
        /*If this is a start-up after standby*/
        if(status_flag.trigger_wakeup_callback == WIFI_TRUE)
          {
            status_flag.trigger_wakeup_callback = WIFI_FALSE;
            status_flag.Standby_Enabled = WIFI_FALSE;
            status_flag.standby_resume_callback = WIFI_TRUE;
          }      
      break;
    case WiFi_BSS_LOST:
      break;
    case WiFi_Unhandled_Event:
      break;
    case Scan_Complete:
        WiFi_WIND_State.WiFiScanComplete = WIFI_TRUE;
        status_flag.Scan_Ongoing = WIFI_FALSE;
      break;
    case WiFi_UNHANDLED_IND:
      WiFi_WIND_State.WiFiUnHandledInd = WIFI_TRUE;
      break;
    case WiFi_UNHANDLED:
      break;
    case WiFi_Powered_Down:
        status_flag.WiFi_Enabled = WIFI_FALSE;      
        //wifi_ready = 0;
        WiFi_WIND_State.WiFiHWStarted = WIFI_FALSE;
        WiFi_WIND_State.WiFiPowerDown = WIFI_TRUE;
      break;
    case WiFi_MiniAP_Mode :
        WiFi_WIND_State.WiFiMiniAPMode = WIFI_TRUE;
      break;
    case WiFi_Deauthentication:
        WiFi_WIND_State.WiFiDeauthentication = WIFI_TRUE;
      break;    
    case WiFi_Disassociation:
      WiFi_WIND_State.WiFiDisAssociation = WIFI_TRUE;
      break;
    case RX_MGMT:
      WiFi_WIND_State.WiFiRXMgmt = WIFI_TRUE;
      break;
    case RX_DATA:
      WiFi_WIND_State.WiFiRXData = WIFI_TRUE;
      break;
    case RX_UNK:
      WiFi_WIND_State.WiFiRxUnk = WIFI_TRUE;
      break;
    case DOT11_AUTHILLEGAL:
      break;
    case Creating_PSK:
      break; 
    case WPA_Terminated :
      break;
    case WPA_Supplicant_Failed:
      break;
    case WPA_Handshake_Complete:
      break;
    case GPIO_line:
      break;
    case Wakeup:
      break;
    case Factory_debug:
      break;  

    case SockON_Data_Pending:

      /* +WIND:55:Pending Data:%d:%d */
      if (status_flag.enable_sock_read == WIFI_TRUE)
      {       
          #if DEBUG_PRINT
            printf ("\nAlert!\r\n");
          #endif
          status_flag.enable_sock_read = WIFI_FALSE;
          status_flag.enable_receive_data_chunk = WIFI_FALSE;
          //break;
      }
      sockon_query_id = event_pop_s1->socket_id;
      if(open_sockets[sockon_query_id])
      {
          status_flag.enable_query = WIFI_TRUE;
          status_flag.stop_event_dequeue = WIFI_TRUE;
      }

       break;

    case SockON_Server_Socket_Closed:
      client_socket_close_id = event_pop_s1->socket_id;
      status_flag.Client_Socket_Close_Cmd = WIFI_TRUE;
      break;

    case SockD_Pending_Data:
      number_of_bytes = event_pop_s1->data_length;
      status_flag.data_pending_sockD = WIFI_TRUE;
      status_flag.stop_event_dequeue = WIFI_TRUE;             //Stop any more event de-queue
      status_flag.enable_receive_data_chunk = WIFI_TRUE;       // read data in chunk now from ring buffer

      if(!status_flag.data_mode)
        {
          if(event_pop_s1->wind64_pending_packet_no == 1) { //If this is the first WIND64 pending event de-Q'ed
              status_flag.switch_by_default_to_command_mode = WIFI_FALSE; //we don't want to switch back to command mode after changing to data mode here
              WiFi_switch_to_data_mode();     //switch by default
          }
        }
      else //already data is coming from previous WIND:64
      {
          process_buffer_index =5;
          status_flag.enable_sock_read = WIFI_TRUE;//n
          SockON_Data_Length = number_of_bytes;
      }
      break;

    case Incoming_socket_client:
      status_flag.Client_Connected = WIFI_TRUE;
      wifi_client_connected=1;  //Set this so that the callback can be made to the user
      break;

    case Outgoing_socket_client:
      status_flag.Client_Disconnected = WIFI_TRUE;
      wifi_client_disconnected=0;//Set this so that the callback can be made to the user
      wifi_client_connected = 0;
      break;

    case SockD_Dropping_Data:
      WiFi_WIND_State.WiFiSockdDataLost = WIFI_TRUE;
      break;

    case Low_Power_Mode_Enabled:
      status_flag.Low_Power_Enabled = WIFI_TRUE;
      break;

    case Going_Into_Standby:
      status_flag.Standby_Enabled = WIFI_TRUE;
      break;

    case Resuming_From_Standby:
      status_flag.Standby_Enabled = WIFI_FALSE;
      status_flag.standby_resume_callback = WIFI_TRUE;
      break;    
    case Going_Into_DeepSleep:
      status_flag.Deep_Sleep_Enabled = WIFI_TRUE;    
      break;
    case Resuming_From_DeepSleep:
      status_flag.Deep_Sleep_Enabled = WIFI_FALSE;
      Start_DeepSleep_Timer();
      break;
    default:
      break;
  }
}

/**
* @brief  Queue_Http_Get_ Event
*         Queue an HTTP-Request Event (GET/POST)
* @param  hostname hostname for HTTP-GET/POST
* @param  path path for HTTP-GET
* @param  port_number port_number for HTTP-GET
* @param  pURL_path full URL for HTTP-POST
* @retval None
*/

void Queue_Http_Event(uint8_t * hostname, uint8_t * path, uint32_t port_number, uint8_t * pURL_path) 
{
   Wait_For_Sock_Read_To_Complete();
   if(pURL_path == NULL)
    {
      curr_hostname = hostname;
      curr_path = path;
      curr_port_number = port_number;
    }
    else
      curr_pURL = pURL_path;

    event_s.event = WIFI_HTTP_EVENT;
    __disable_irq();
    push_eventbuffer(&event_buff, event_s);
     __enable_irq();
    
    reset_event(&event_s);
}

/**
* @brief  Queue_Client_Write_Event
*         Queues a Client Socket write event.
* @param  sock_id socket ID to write to
* @param  DataLength length of the data to be written
* @param  pData pointer to data
* @retval None
*/
void Queue_Client_Write_Event(uint8_t sock_id, uint16_t DataLength, char * pData)
{
    Wait_For_Sock_Read_To_Complete();
    curr_DataLength = DataLength;
    curr_data = pData;
    curr_sockID = sock_id;
    status_flag.enable_client_socket_write = WIFI_TRUE;

    event_s.event = WIFI_CLIENT_SOCKET_WRITE_EVENT;
    __disable_irq();
    push_eventbuffer(&event_buff, event_s);
    __enable_irq();

    reset_event(&event_s);
}

/**
* @brief Queue_Wifi_File_Image_Create_Event
*        Queue a File Image Create Event
* @param pHostName hostname
* @param pFileName filename within host
* @param port_number port number to connect to
* @retval None
*/
void Queue_Wifi_File_Event(uint8_t * pHostName, uint8_t * pFileName, uint32_t port_number)
{
    Wait_For_Sock_Read_To_Complete();
    event_s.event = WIFI_FILE_EVENT;
    curr_filename = pFileName;
    curr_hostname = pHostName;
    curr_port_number = port_number;

    __disable_irq();
    push_eventbuffer(&event_buff, event_s);
    __enable_irq();

    reset_event(&event_s);
}

/**
* @brief Queue_Wifi_FW_Update_Event
*        Queue a Firmware update Event
* @param hostname hostname
* @param filename_path filename and path within host
* @param port_number port number to connect to
* @retval None
*/
void Queue_Wifi_FW_Update_Event(uint8_t * hostname, uint8_t * filename_path, uint32_t port_number)
{
    Wait_For_Sock_Read_To_Complete();
    event_s.event = WIFI_FW_UPDATE_EVENT;
    curr_filename = filename_path;
    curr_hostname = hostname;
    curr_port_number = port_number;

    __disable_irq();
    push_eventbuffer(&event_buff, event_s);
    __enable_irq();

    reset_event(&event_s);
}

void Queue_Client_Open_Event(uint8_t * hostname, uint32_t port_number, uint8_t * protocol)
{
    Wait_For_Sock_Read_To_Complete();
    curr_hostname = hostname;
    curr_port_number = port_number;
    curr_protocol = protocol;
    
    event_s.event = WIFI_CLIENT_SOCKET_OPEN_EVENT;
     __disable_irq();
    push_eventbuffer(&event_buff, event_s);
    __enable_irq();

    reset_event(&event_s);
}

void Queue_Client_Close_Event(uint8_t sock_id)
{
    Wait_For_Sock_Read_To_Complete();

    event_s.event = WIFI_CLIENT_SOCKET_CLOSE_EVENT;
    event_s.socket_id = sock_id;
     __disable_irq();
    push_eventbuffer(&event_buff, event_s);
    __enable_irq();

    reset_event(&event_s);
}

/**
* @brief Wait_For_Sock_Read_To_Complete
*        Wait till sock is over and the OK of read arrives
* @param None
* @retval None
*/
void Wait_For_Sock_Read_To_Complete(void)
{
  //wait if read is ongoing or read OK is yet to arrive
  while(status_flag.sock_read_ongoing==WIFI_TRUE || status_flag.prevent_push_OK_event==WIFI_TRUE)
  {
        asm("NOP");
  }
}

/**
* @brief  Reset_AT_CMD_Buffer
*         Clear USART2 Rx buffer and Wi-Fi AT cmd buffer
* @param  None
* @retval None
*/
void Reset_AT_CMD_Buffer()
{
  memset(WiFi_AT_Cmd_Buff, 0x00, sizeof WiFi_AT_Cmd_Buff); 
}

#ifdef  USE_FULL_ASSERT

/**
* @brief  Reports the name of the source file and the source line number
*         where the assert_param error has occurred.
* @param  file: pointer to the source file name
* @param  line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t* file, uint32_t line)
{
  /* User can add his own implementation to report the file name and line number,
  ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  
  /* Infinite loop */
  while (1)
  {
  }
}

#endif


/**
* @brief  search_buffer
*         search for substring in a buffer that contains null
* @param  pSourceBuff   : pointer of source buffer
*         sourceBuffLen : length of string buffer
*         pSearchStringBuff : pointer of search string buffer
*         seartchStringLen  : length of search string buffer
* @retval pointer of source buffer
*/
char *search_buffer(char *pSourceBuff, uint16_t sourceBuffLen, char *pSearchStringBuff, uint16_t seartchStringLen)
{   /* warning: O(n^2) */
    int searchlen = sourceBuffLen - seartchStringLen + 1;
    for ( ; searchlen-- > 0; pSourceBuff++)
        if (!memcmp(pSourceBuff, pSearchStringBuff, seartchStringLen))
            return pSourceBuff;
    return NULL;
}

/**
* @brief  Delete_Colon
*         delete colon from input buffer
* @param  input : pointer of input buffer
* @retval return pointer of updated buffer
*/
char* Delete_Colon(char* input)                                         
{
    int i,j;
    char *output=input;
    
    /* Delete Colon */
    for (i = 0, j = 0; i<strlen(input); i++,j++)          
    {
#if 0     
      if (input[i]!=':') && (input[i]!='\r')&& (input[i]!='\n')&& (input[i]!='O')&& (input[i]!='K'))
            output[j]=input[i];                     
        else
            j--;                                     
#else
      if ((input[i] ==':') || (input[i]=='\r')|| (input[i]=='\n')|| (input[i]=='O')|| (input[i]=='K'))
            j--;                                     
        else
          output[j]=input[i];                            
    }
    //output[j]=NULL;    
#endif  
    return output;
}

/**
* @brief  Read_WiFi_SSID
*         Read SSID of WiFi module store in flash 
* @param  string : pointer of SSID
* @retval return status of AT cmd request
*/
WiFi_Status_t Read_WiFi_SSID(char *string)
{
  WiFi_Status_t status = WiFi_MODULE_SUCCESS;
  char * ssid = "wifi_ssid";
  char * pStr;
  /* AT+S.GCFG=wifi_ssid read SSID */
  Reset_AT_CMD_Buffer();

  /* AT : send AT command */  
  sprintf((char*)WiFi_AT_Cmd_Buff,AT_GET_CONFIGURATION_VALUE,ssid);   

  /* 
    Response :
    # wifi_ssid = 41:6E:53:53:49:44:00:00:00:00:00:00:00:00:00:00:00:00:00:
    00:00:00:00:00:00:00:00:00:00:00:00:00<cr><lf>
    <cr><lf>OK<cr><lf>
    */

  status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));
  if(status == WiFi_MODULE_SUCCESS)
  {
    status = USART_Receive_AT_Resp(Process_Event);
  }

    /* find a substring (# wifi_ssid = )inside a USART2_RxBuffer that may contain nulls */
    uint16_t sourceBuffLen = sizeof(get_cfg_value)-1; /* exclude null terminator from length */
    char searchStringBuff[] = "#  wifi_ssid = ";
    uint16_t stringBuffLen = sizeof(searchStringBuff)-1; /* exclude null terminator from length */    
    char *res = search_buffer((char *)&get_cfg_value, sourceBuffLen, searchStringBuff, stringBuffLen);

    pStr = (char *) (strstr((const char *)res,"= "));
    if(pStr != NULL)
    {
      strcat( string, (pStr + 2));      
      /* Remove colon,\r,\n,OK strings */
      memcpy(string, Delete_Colon(string) , 32); 
    }
  return status;    
}

/**
* @brief  Read_WiFi_SecKey
*         Read Security key of WiFi module store in flash 
* @param  string : pointer of Security key
* @retval return status of AT cmd request
*/
WiFi_Status_t Read_WiFi_SecKey(char *string)
{
  WiFi_Status_t status = WiFi_MODULE_SUCCESS;
  char *seckey = "wifi_wpa_psk_text";
  char *pStr;
  
  /* AT+S.GCFG=wifi_ssid read SSID */
  Reset_AT_CMD_Buffer();
  
  /* AT : send AT command */  
  sprintf((char*)WiFi_AT_Cmd_Buff,AT_GET_CONFIGURATION_VALUE,seckey);  
  
  status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));
  if(status == WiFi_MODULE_SUCCESS)
  {
    status = USART_Receive_AT_Resp(Process_Event);
  }


    /* find a substring (wifi_wpa_psk_text = )inside a USART2_RxBuffer that may contain nulls */
    uint16_t sourceBuffLen = sizeof(get_cfg_value)-1; /* exclude null terminator from length */
    char searchStringBuff[] = "wifi_wpa_psk_text = ";
    uint16_t stringBuffLen = sizeof(searchStringBuff)-1; /* exclude null terminator from length */    
    char *res = search_buffer((char *)&get_cfg_value, sourceBuffLen, searchStringBuff, stringBuffLen);
    
    pStr = (char *) (strstr((const char *)res,"= "));
    if(pStr != NULL)
    {
      strcat( string, (pStr + 2));      
      /* Remove colon,\r,\n,OK strings */
      memcpy(string, Delete_Colon(string) , 32); 
    }
    
  return status;    
}

/**
* @brief  Read_WiFi_Mode
*         Read Wi-Fi mode 0: idle,1 =STA,2 =IBSS,3 =MiniAP
* @param  string : return wifi mode type
* @retval return status of AT cmd request
*/
WiFi_Status_t Read_WiFi_Mode(char *string)
{
  WiFi_Status_t status = WiFi_MODULE_SUCCESS;
  char *mode = "wifi_mode";
  char *pStr;
  
    /* AT+S.GCFG=wifi_mode */
  Reset_AT_CMD_Buffer();
  
  /* AT : send AT command */  
  sprintf((char*)WiFi_AT_Cmd_Buff,AT_GET_CONFIGURATION_VALUE,mode);  
  
  status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));
  if(status == WiFi_MODULE_SUCCESS)
  {
    status = USART_Receive_AT_Resp(Process_Event);
  }
  
  pStr = (char *) strstr((const char *)&get_cfg_value,"wifi_mode = ");
  if(pStr != NULL)
  {
    string[0] = *(pStr + 12) ;
  }

  return status ;
}

/**
* @brief  Write_WiFi_SSID
*         Store SSID in flash memory of WiFi module
* @param  string : pointer of SSID
* @retval return status of AT cmd request
*/
WiFi_Status_t Write_WiFi_SSID(char *string)
{
  WiFi_Status_t status = WiFi_MODULE_SUCCESS;  
  Reset_AT_CMD_Buffer(); 
  
  /* AT+S.SSIDTXT=abcd <ExampleSSID> //set SSID */
  sprintf((char*)WiFi_AT_Cmd_Buff,AT_SET_SSID,string);  
  
  status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));
  if(status == WiFi_MODULE_SUCCESS)
  {
    status = USART_Receive_AT_Resp(Process_Event);
  }
  
  /* AT&W :Save the settings on the flash memory */
  Reset_AT_CMD_Buffer();
  Save_Current_Setting();
  
  return status; 
  
}


/**
* @brief  Write_WiFi_SecKey
*         Store security key in flash memory of WiFi module
* @param  string : pointer of security key
* @retval return status of AT cmd request
*/
WiFi_Status_t Write_WiFi_SecKey(char *string)
{
  WiFi_Status_t status = WiFi_MODULE_SUCCESS;  
  Reset_AT_CMD_Buffer(); 
  
  /* AT+S.SCFG=wifi_wpa_psk_text,helloworld : set password */
  sprintf((char*)WiFi_AT_Cmd_Buff,"AT+S.SCFG=wifi_wpa_psk_text,%s\r",string);
  
  status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));
  if(status == WiFi_MODULE_SUCCESS)
  {
    status = USART_Receive_AT_Resp(Process_Event);
  }
  
  /* AT&W :Save the settings on the flash memory */
  Reset_AT_CMD_Buffer();
  Save_Current_Setting();
  
  return status;     
}



/**
* @brief  PrintErrorMsg
*         Print error message on UART terminal
* @param  None
* @retval None
*/
void PrintErrorMsg (void)
{
  Print_Msg("error in AT cmd",sizeof("error in AT cmd"));
}

/**
  * @brief  Print_Msg
  *         Print messages on UART terminal
  * @param  msgBuff : Contains data that need to be print
  * @param  length  : leghth of the data
  * @retval None
  */
void Print_Msg(char * msgBuff,uint8_t length)
{

}

/**
* @brief  Error_Handler
*         This function is executed in case of error occurrence.
* @param  None
* @retval None
*/
void Error_Handler(void)
{
  /* Turn LED2 on */
  //BSP_LED_On(LED2);
  //The following while(1) is commented as it prevents standby functionality
  /*while(1)
  {
    //Error if LED2 is slowly blinking (1 sec. period)
    BSP_LED_Toggle(LED2); 
    HAL_Delay(1000); 
  } */ 
  Receive_Data();
}


/**
* @brief  Start_DeepSleep_Timer
*         start the deep sleep timer.
* @param  None
* @retval void
*/
void Start_DeepSleep_Timer(void)
{
  status_flag.Deep_Sleep_Timer = WIFI_TRUE;
  sleep_count = 0;
}

/**
* @brief  Stop_DeepSleep_Timer
*         stop the deep sleep timer.
* @param  None
* @retval void
*/
void Stop_DeepSleep_Timer()
{
  status_flag.Deep_Sleep_Timer = WIFI_FALSE;
  sleep_count = 0;
}

#if 0
/**
* @brief  configure_to_exti
*         Configured the USART Rx pin to EXTI pin to capture standby wakeup interrupt
* @param  None
* @retval None
*/
void configure_to_exti()
{
  /*configure the pin*/
  
  HAL_NVIC_DisableIRQ(USARTx_IRQn);//Disable UART IRQ
  
  /* USART_RX Pin as EXTI IRQ*/
  GPIO_InitTypeDef  GPIO_InitStruct;
  GPIO_InitStruct.Pin = WiFi_USART_RX_PIN;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
#if defined (USE_STM32L0XX_NUCLEO) || (USE_STM32F4XX_NUCLEO) 
  GPIO_InitStruct.Alternate = 0;
#endif
  HAL_GPIO_Init(WiFi_USART_RX_GPIO_PORT, &GPIO_InitStruct);
  
  /* Configure the NVIC for EXTI */  
  HAL_NVIC_SetPriority(USARTx_EXTI_IRQn, 3, 0);    
  HAL_NVIC_EnableIRQ(USARTx_EXTI_IRQn);
}
#endif

/**
* @brief  WiFi_switch_to_command_mode
*         switch to command mode from data mode
* @param  None
* @retval None
*/
void WiFi_switch_to_command_mode(void)
{
  WiFi_Status_t status = WiFi_MODULE_SUCCESS;

  /* AT+S.*/  
  Reset_AT_CMD_Buffer();  

  sprintf((char*)WiFi_AT_Cmd_Buff,AT_DATA_TO_CMD_MODE);   //Notice the lower case

  status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));
  if(status == WiFi_MODULE_SUCCESS)
  {
    //nothing to do
  }
}


/**
* @brief  WiFi_switch_to_data_mode
*         switch to data mode from command mode
* @param  None
* @retval None
*/
void WiFi_switch_to_data_mode(void)
{
  WiFi_Status_t status = WiFi_MODULE_SUCCESS;
  
  /* AT+S.*/  
  Reset_AT_CMD_Buffer();    
  
  sprintf((char*)WiFi_AT_Cmd_Buff,AT_CMD_TO_DATA_MODE);   //Notice the upper case
  
  status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));
  
  if(status == WiFi_MODULE_SUCCESS)
  {
    //nothing to do
  }
   
}


/**
* @brief  Attention_Cmd
*         Attention command
* @param  None
* @retval WiFi_Status_t : status of AT cmd Request
*/
WiFi_Status_t Attention_Cmd()
{
  WiFi_Status_t status = WiFi_MODULE_SUCCESS;
  
  Reset_AT_CMD_Buffer(); 
  
  /* AT : send AT command */
  sprintf((char*)WiFi_AT_Cmd_Buff,AT_ATTENTION);  

  status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));
  if(status == WiFi_MODULE_SUCCESS)
  {
    status = USART_Receive_AT_Resp(Process_Event);
  }
  return status; 
}


/**
* @brief  SET_Power_State
*         SET power mode of wifi module
* @param  state : power mode of wi-fi module i.e active,sleep,standby,powersave
* @retval WiFi_Status_t : status of AT cmd Request
*/
WiFi_Status_t SET_Power_State(WiFi_Power_State_t state)
{
  WiFi_Status_t status = WiFi_MODULE_SUCCESS;
  
#if DEBUG_PRINT  
  printf("\r\n >>Soft Reset Wi-Fi module\r\n");
#endif
  
  Reset_AT_CMD_Buffer();
  
  /* AT : send AT command */
  sprintf((char*)WiFi_AT_Cmd_Buff,AT_SET_POWER_STATE,state);  
//  WiFi_Module_State = Process_Event; 
//  WiFi_WIND_State.WiFiReset = WIFI_FALSE;
  WiFi_WIND_State.WiFiHWStarted = WIFI_FALSE;
  status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));
  if(status != WiFi_MODULE_SUCCESS) 
    return status;
  memset((void*)&WiFi_WIND_State,0x00,sizeof(WiFi_WIND_State)); /*reset the WIND State?*/
  /* AT+CFUN=1 //Soft reset */
  while(WiFi_WIND_State.WiFiHWStarted != WIFI_TRUE)
  {
        asm("NOP");
  }
  return status;
}
  

/**
* @brief  Display_Help_Text
*         this function will print a list of all commands supported with a brief help text for each cmd
* @param  None
* @retval WiFi_Status_t : status of AT cmd Request
*/
WiFi_Status_t Display_Help_Text()
{
  WiFi_Status_t status = WiFi_MODULE_SUCCESS;
  Reset_AT_CMD_Buffer();

  /* AT : send AT command */
  sprintf((char*)WiFi_AT_Cmd_Buff,AT_HELP_TEXT);  

  status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));
  if(status == WiFi_MODULE_SUCCESS)
  {
    status = USART_Receive_AT_Resp(Process_Event);
  }
  return status; 
}

/**
* @brief  WiFi_Get_IP_address
*         Get the ip address
* @param  ip_addr : pointer to ip address
* @retval status  : status of AT cmd request
*/

WiFi_Status_t WiFi_Get_IP_Address(uint8_t *ip_addr)
{
  WiFi_Status_t status = WiFi_MODULE_SUCCESS;
  int cfg_value_length, i;

   /* AT : send AT command */
  sprintf((char*)WiFi_AT_Cmd_Buff,AT_GET_STATUS_VALUE,"ip_ipaddr");
  status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));
  if(status == WiFi_MODULE_SUCCESS)
  {
    status = USART_Receive_AT_Resp(Process_Event);
    cfg_value_length = strlen((const char*)get_cfg_value);
    
    //Optimise the following loop??
    for(i=7; i<=16; i++)//0th index is always ' ' which we ignore
      if(get_cfg_value[i] == '\r')//find the first '\r'
        {
            get_cfg_value[i] = '\0'; //Terminate the string by NULL
            break;
        }
        
    /* copy user pointer to get_cfg_value */
    memcpy(ip_addr,&get_cfg_value[1],i);//IP address will have max lenght fixed at 16 bytes (null terminated included).   
    memset(get_cfg_value, 0x00,cfg_value_length);
  }
  return status;
}

/**
* @brief  WiFi_Get_MAC_address
*         Get the MAC address
* @param  ip_addr : pointer to MAC address
* @retval status  : status of AT cmd request
*/

WiFi_Status_t WiFi_Get_MAC_Address(uint8_t *mac_addr)
{
  WiFi_Status_t status = WiFi_MODULE_SUCCESS;
  int cfg_value_length;

   /* AT : send AT command */
  sprintf((char*)WiFi_AT_Cmd_Buff,AT_GET_CONFIGURATION_VALUE,"nv_wifi_macaddr");
  status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));
  if(status == WiFi_MODULE_SUCCESS)
  {
    status = USART_Receive_AT_Resp(Process_Event);
    cfg_value_length = strlen((const char*)get_cfg_value);
    get_cfg_value[18] = '\0';//Terminate by NULL
    /* copy user pointer to get_cfg_value */
    memcpy(mac_addr,&get_cfg_value[1],18);//IP address will have max lenght fixed at 18 bytes.   
    memset(get_cfg_value, 0x00,cfg_value_length);
  }
  return status;
}

/**
* @brief  GET_Configuration_Value
*         Get a wifi configuration value from the module
* @param  sVar_name : Name of the config variable
*         aValue    : value of config variable to be returned to user
* @retval WiFi_Status_t : status of AT cmd Request
*/
WiFi_Status_t GET_Configuration_Value(char* sVar_name,uint32_t *aValue)
{
  int cfg_value_length;
  WiFi_Status_t status = WiFi_MODULE_SUCCESS;

  Reset_AT_CMD_Buffer(); 

  /* AT : send AT command */  
  sprintf((char*)WiFi_AT_Cmd_Buff,AT_GET_CONFIGURATION_VALUE,sVar_name);   

  status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));
  if(status == WiFi_MODULE_SUCCESS)
  {
    status = USART_Receive_AT_Resp(Process_Event);
    cfg_value_length = strlen((const char*)get_cfg_value);
    memcpy(aValue,get_cfg_value,cfg_value_length);   //copy user pointer to get_cfg_value
    memset(get_cfg_value, 0x00,cfg_value_length);
  }
  return status; 
}

/**
* @brief  SET_Configuration_Addr
*         Get a wifi configuration address from the module
* @param  sVar_name : Name of the config variable
*         addr    : value of config address to be returned to user
* @retval WiFi_Status_t : status of AT cmd Request
*/
WiFi_Status_t SET_Configuration_Addr(char* sVar_name,char* addr)
{
  WiFi_Status_t status = WiFi_MODULE_SUCCESS;

  Reset_AT_CMD_Buffer(); 

  /* AT : send AT command */
  sprintf((char*)WiFi_AT_Cmd_Buff,AT_SET_CONFIGURATION_ADDRESS,sVar_name,addr);  

  status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));
  if(status == WiFi_MODULE_SUCCESS)
  {
    status = USART_Receive_AT_Resp(Process_Event);
  }
  return status;
}

/**
* @brief  SET_Configuration_Value
*         SET the value of configuration variable
* @param  sVar_name : Name of the config variable
*         aValue    : value of config variable
* @retval WiFi_Status_t : status of AT cmd Request
*/
WiFi_Status_t SET_Configuration_Value(char* sVar_name,uint32_t aValue)
{
  WiFi_Status_t status = WiFi_MODULE_SUCCESS;

  Reset_AT_CMD_Buffer(); 

  /* AT : send AT command */
  sprintf((char*)WiFi_AT_Cmd_Buff,AT_SET_CONFIGURATION_VALUE,sVar_name,(int)aValue);  

  status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));
  if(status == WiFi_MODULE_SUCCESS)
  {
    status = USART_Receive_AT_Resp(Process_Event);
  }
  return status; 
}

/**
* @brief  SET_SSID
*         SET SSID in flash memory of Wi-Fi module
* @param  ssid : pointer of SSID
* @retval WiFi_Status_t : status of AT cmd Request
*/
WiFi_Status_t SET_SSID(char* ssid)
{
  WiFi_Status_t status = WiFi_MODULE_SUCCESS;
  
  Reset_AT_CMD_Buffer(); 
  
  /* AT+S.SSIDTXT=abcd <ExampleSSID>  */
  sprintf((char*)WiFi_AT_Cmd_Buff,AT_SET_SSID,ssid);  

  status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));
  if(status == WiFi_MODULE_SUCCESS)
  {
    status = USART_Receive_AT_Resp(Process_Event);
  }
  return status; 
}


/**
* @brief  SET_WiFi_SecKey
*         SET wifi security key
* @param  seckey : pointer of security key
* @retval WiFi_Status_t : status of AT cmd Request
*/
WiFi_Status_t SET_WiFi_SecKey(char* seckey)
{
  WiFi_Status_t status = WiFi_MODULE_SUCCESS;
  
  Reset_AT_CMD_Buffer(); 
  
  /* AT+S.SCFG=wifi_wpa_psk_text,helloworld : set password */
  sprintf((char*)WiFi_AT_Cmd_Buff,AT_SET_SEC_KEY,seckey);  

  status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));
  if(status == WiFi_MODULE_SUCCESS)
  {
    status = USART_Receive_AT_Resp(Process_Event);
  }
  return status;    
}


/**
* @brief  Restore_Default_Setting
*         Restore the factory default values of the configuration variables 
*         and writes them to non volatile storage
* @param  None
* @retval WiFi_Status_t : status of AT cmd Request
*/
WiFi_Status_t Restore_Default_Setting()
{
  WiFi_Status_t status = WiFi_MODULE_SUCCESS;
  
  //Reset_AT_CMD_Buffer(); 
  
  /* AT&F: restore default setting */
  sprintf((char*)WiFi_AT_Cmd_Buff,AT_RESTORE_DEFAULT_SETTING);  

  status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));
  
  if(status == WiFi_MODULE_SUCCESS)
  {
    status = USART_Receive_AT_Resp(Process_Event);
  }
  return status; 
  
}

/**
* @brief  Save_Current_Setting
*         Store the current RAM-based setting to non-volatile storage
* @param  None
* @retval WiFi_Status_t : status of AT cmd Request
*/
WiFi_Status_t Save_Current_Setting()
{
  WiFi_Status_t status = WiFi_MODULE_SUCCESS;
  
  Reset_AT_CMD_Buffer(); 
  
  /* AT&W :Save the settings on the flash memory */
  sprintf((char*)WiFi_AT_Cmd_Buff,AT_SAVE_CURRENT_SETTING);  

  status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));
  if(status == WiFi_MODULE_SUCCESS)
  {
    status = USART_Receive_AT_Resp(Process_Event);
  }
  return status; 
}


/**
* @brief  ResetBuffer
*         Reset receive data/indication msg buffer
* @param  None
* @retval None
*/
void ResetBuffer()
{  
  
}


/**
* @brief  config_init_value
*         initalize config values before reset
* @param  sVar_name : Name of the config variable
*         aValue    : value of config variable
* @retval None
*/
WiFi_Status_t config_init_value(char* sVar_name,uint8_t aValue)
{
  WiFi_Status_t status = WiFi_MODULE_SUCCESS;
  Reset_AT_CMD_Buffer();   
  sprintf((char*)WiFi_AT_Cmd_Buff,AT_SET_CONFIGURATION_VALUE,sVar_name,aValue);
  /*if(HAL_UART_Transmit(&UartWiFiHandle, (uint8_t *)WiFi_AT_Cmd_Buff, strlen((char*)WiFi_AT_Cmd_Buff),1000)!= HAL_OK)
  {
    Error_Handler();    
    return WiFi_HAL_UART_ERROR;
  }*/
  
  status = WaitForResponse(AT_RESP_LEN_OK);
  return status;
}

/**
* @brief  config_init_addr
*         initalize config strings/addresses before reset
* @param  sVar_name : Name of the config variable
*         addr    : value of config address to be returned to user
* @retval None
*/
WiFi_Status_t config_init_addr(char* sVar_name,char* addr)
{
  WiFi_Status_t status = WiFi_MODULE_SUCCESS;
  Reset_AT_CMD_Buffer();   
  sprintf((char*)WiFi_AT_Cmd_Buff,AT_SET_CONFIGURATION_ADDRESS,sVar_name,addr);
  /*if(HAL_UART_Transmit(&UartWiFiHandle, (uint8_t *)WiFi_AT_Cmd_Buff, strlen((char*)WiFi_AT_Cmd_Buff),1000)!= HAL_OK)
  {
    Error_Handler();    
    return WiFi_HAL_UART_ERROR;
  }*/
  
  status = WaitForResponse(AT_RESP_LEN_OK);
  return status;

}


/**
* @brief  WaitForResponse
*         Wait for OK response
* @param  alength length of the data to be received
* @retval None
*/
WiFi_Status_t WaitForResponse(uint16_t alength)
{
  WiFi_Status_t status = WiFi_MODULE_SUCCESS;
  
  if(alength <= RxBufferSize)
  {
    /*if(HAL_UART_Receive(&UartWiFiHandle, (uint8_t *)USART_RxBuffer, alength,5000)!= HAL_OK)
    {
      Error_Handler();
      return WiFi_HAL_UART_ERROR;
    }*/
    
    if(((strstr((const char *)&USART_RxBuffer,"OK"))) == NULL)
    {
      return WiFi_AT_CMD_RESP_ERROR;
    }
    
  }
  
  return status;  
}
/**** Wi-Fi indication call back *************/
__weak void ind_wifi_warning(WiFi_Status_t warning_code)
{
}
    
__weak void ind_wifi_error(WiFi_Status_t error_code)
{
}

__weak void ind_wifi_connection_error(WiFi_Status_t status_code)
{
}

__weak void ind_wifi_connected(void)
{
}
    
__weak void ind_wifi_ap_ready(void)
{
}

__weak void ind_wifi_ap_client_joined(uint8_t * client_mac_address)
{
}

__weak void ind_wifi_ap_client_left(uint8_t * client_mac_address)
{
}

__weak void ind_wifi_on(void)
{
}

__weak void ind_wifi_packet_lost(WiFi_Status_t status_code)
{
}

__weak void ind_wifi_gpio_changed(void)
{
}

__weak void ind_wifi_socket_data_received(uint8_t socket_id, uint8_t * data_ptr, uint32_t message_size, uint32_t chunk_size)
{
}

__weak void ind_wifi_socket_client_remote_server_closed(uint8_t * socketID)
{
}

__weak void ind_wifi_socket_server_data_lost(void)
{
}

__weak void ind_socket_server_client_joined(void)
{
}

__weak void ind_socket_server_client_left(void)
{
}

__weak void ind_wifi_http_data_available(uint8_t * data_ptr,uint32_t message_size)
{
}

__weak void ind_wifi_file_data_available(uint8_t * data_ptr)
{
}
__weak void ind_wifi_resuming(void)
{
}



/**
  * @}
  */ 

/**
  * @}
  */ 


/**
  * @}
  */ 

/******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/