Extending the X_NUCLEO_IDW01M1 to allow configuration of the board as an access point

Dependents:   X_NUCLEO_IDW01M1_AP_Test

Fork of X_NUCLEO_IDW01M1 by ST

Revision:
1:bd9db471d47d
Parent:
0:dc55f40eb04f
Child:
5:c83ffd44f40a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Spwf/wifi_interface.c	Thu Apr 14 06:14:14 2016 +0000
@@ -0,0 +1,1437 @@
+/**
+ ******************************************************************************
+ * @file    wifi_interface.c
+ * @author  Central LAB
+ * @version V2.0.0
+ * @date    10-February-2016
+ * @brief   User APIs implementation for X-CUBE-WIFI1
+ ******************************************************************************
+ * @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 "gpio_irq_api.h"
+#include "gpio_api.h"
+#include "wait_api.h"
+#include "serial_api.h"
+
+/** @addtogroup MIDDLEWARES
+* @{
+*/ 
+
+
+/** @defgroup  NUCLEO_WIFI_INTERFACE
+  * @brief Wi-Fi User API modules
+  * @{
+  */
+
+
+/** @defgroup NUCLEO_WIFI_INTERFACE_Private_Defines
+  * @{
+  */
+
+
+/**
+  * @}
+  */
+
+/** @addtogroup NUCLEO_WIFI_INTERFACE_Private_Variables
+  * @{
+  */
+/* Private variables ---------------------------------------------------------*/
+
+#if defined (USE_STM32F4XX_NUCLEO) || (USE_STM32L4XX_NUCLEO)
+extern uint8_t WiFi_AT_Cmd_Buff[2048];
+#else
+extern uint8_t WiFi_AT_Cmd_Buff[1024];
+#endif
+
+extern volatile Wifi_Status_Var status_flag;
+
+extern char UserDataBuff[MAX_BUFFER_GLOBAL];
+extern wifi_scan *wifi_scanned_list;//[15];
+extern char print_msg_buff[MAX_BUFFER_GLOBAL];
+extern uint8_t user_scan_number;
+extern uint8_t no_of_open_client_sockets;
+extern wifi_bool open_sockets[8];//Max open sockets allowed is 8. Each array element depicts one socket (true=open, false=closed)
+extern WiFi_AT_CMD_Response_t WiFi_Module_State;
+extern volatile uint8_t wifi_client_connected;
+extern uint8_t gpio_value, gpio_direc;
+extern volatile uint8_t wifi_connected;
+extern uint32_t SockON_Data_Length;
+extern uint8_t Socket_Open_ID, sockon_query_id;
+extern volatile uint32_t WIND64_count;
+extern uint32_t process_buffer_index;
+extern uint32_t epoch_time;
+
+/*SPWFSADevice Class functions and variables*/
+void * spwf_device_class;
+extern void callSpwfSADevice_wakeup(void* object, int wake);
+extern  void callSpwfSADevice_debug(void* object, const char * string);
+/**
+  * @}
+  */
+  
+/** @defgroup NUCLEO_WIFI_INTERFACE_Private_Functions
+  * @{
+  */
+#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   
+
+/**
+    *Changed/introduced functions for MBED implementation:
+
+- WiFi_Status_t wifi_init(wifi_config* config)
+- WiFi_Status_t wifi_wakeup(wifi_bool wakeup)
+- WiFi_Status_t wifi_socket_server_write(uint16_t DataLength,char * pData) 
+- void wifi_reset(void);
+- WiFi_Status_t wifi_enable(wifi_bool enable)
+
+*/
+
+
+/**
+  * @brief  wifi_init
+  *         User API for wifi init
+  * @param  None
+  * @retval None
+  */
+WiFi_Status_t wifi_init(wifi_config* config)
+{
+#ifndef WIFI_USE_VCOM
+  uint8_t tx_level;
+#endif
+
+  WiFi_Status_t status = WiFi_MODULE_SUCCESS;
+
+#if DEBUG_PRINT
+  printf("\r\n[SPWF]Initializing SPWF01SA1 Interface\r\n");
+#endif  
+  //callSpwfSADevice_debug(spwf_device_class, "\r\n[SPWF] Initializing mbed SPWF01SA1 Interface\r\n");
+    
+  WiFi_Module_Init();
+  
+  //callSpwfSADevice_debug(spwf_device_class, "\r\n[SPWF] Module Init done\r\n");
+  
+#ifndef WIFI_USE_VCOM
+  
+  wifi_wakeup(WIFI_TRUE);//Prevent from going to sleep during configuration    
+
+  /* Soft reset the module */
+  wifi_reset();
+
+  //callSpwfSADevice_debug(spwf_device_class, "\r\n[SPWF] Hardware started\r\n");
+  
+  /* Set localecho1 to 0*/  
+  status = SET_Configuration_Value(LOCALECHO1, 0);
+  if(status != WiFi_MODULE_SUCCESS) return status;
+
+  /* Restore default setting*/    
+  Reset_AT_CMD_Buffer();  
+  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);
+    if(status != WiFi_MODULE_SUCCESS) return status;
+  }
+
+  /* Switch on HW Flow Control*/  
+  status = SET_Configuration_Value(CONSOLE1_HWFC, 1);
+  if(status != WiFi_MODULE_SUCCESS) return status; 
+  
+  if(config->wifi_baud_rate)
+  {
+    /* Set USART Speed*/  
+    status = SET_Configuration_Value(CONSOLE1_SPEED, config->wifi_baud_rate);
+    if(status != WiFi_MODULE_SUCCESS) return status; 
+  }
+
+  /* Set wifi_mode to idle*/  
+  status = SET_Configuration_Value(WIFI_MODE, WiFi_IDLE_MODE);
+  if(status != WiFi_MODULE_SUCCESS) return status;   
+
+  switch(config->ht_mode)
+  {
+  case WIFI_FALSE:
+    status = SET_Configuration_Value(WIFI_HT_MODE, 0);
+    if(status != WiFi_MODULE_SUCCESS) return status;
+    status = SET_Configuration_Addr(WIFI_OPR_RATE_MASK, "0x00003FCF");
+    if(status != WiFi_MODULE_SUCCESS) return status;
+    break;
+  case WIFI_TRUE:
+    status = SET_Configuration_Value(WIFI_HT_MODE, 1);
+    if(status != WiFi_MODULE_SUCCESS) return status;
+    status = SET_Configuration_Addr(WIFI_OPR_RATE_MASK, "0x003FFFCF");
+    if(status != WiFi_MODULE_SUCCESS) return status;
+    break;
+  default:
+    break;
+  }
+
+  switch(config->power)
+  {
+  case wifi_active:
+    status = SET_Configuration_Value(WIFI_POWERSAVE, 0);
+    if(status != WiFi_MODULE_SUCCESS) return status;
+    status = SET_Configuration_Value(WIFI_SLEEP_ENABLED, 0);  
+    if(status != WiFi_MODULE_SUCCESS) return status;
+    break;
+  case wifi_reactive:
+    status = SET_Configuration_Value(WIFI_POWERSAVE, 1);
+    if(status != WiFi_MODULE_SUCCESS) return status;
+    status = SET_Configuration_Value(WIFI_OPERATIONAL_MODE, 11);  
+    if(status != WiFi_MODULE_SUCCESS) return status;
+    status = SET_Configuration_Value(WIFI_BEACON_WAKEUP, 0);
+    if(status != WiFi_MODULE_SUCCESS) return status;
+    status = SET_Configuration_Value(WIFI_LISTEN_INTERVAL, 0);
+    if(status != WiFi_MODULE_SUCCESS) return status;
+    status = SET_Configuration_Value(WIFI_SLEEP_ENABLED, 0);  
+    if(status != WiFi_MODULE_SUCCESS) return status;
+    break;
+  case wifi_sleep:
+    status = SET_Configuration_Value(WIFI_POWERSAVE, 1);
+    if(status != WiFi_MODULE_SUCCESS) return status;
+    status = SET_Configuration_Value(WIFI_OPERATIONAL_MODE, 12);  
+    if(status != WiFi_MODULE_SUCCESS) return status;
+    status = SET_Configuration_Value(WIFI_BEACON_WAKEUP, 10);
+    if(status != WiFi_MODULE_SUCCESS) return status;
+    status = SET_Configuration_Value(WIFI_LISTEN_INTERVAL, 1);
+    if(status != WiFi_MODULE_SUCCESS) return status;
+    status = SET_Configuration_Value(WIFI_SLEEP_ENABLED, 1);  
+    if(status != WiFi_MODULE_SUCCESS) return status;
+    break;
+  default:
+    break;
+  }
+
+  switch(config->power_level)
+  {
+  case low:
+  case medium:
+  case high:
+  case max:
+    tx_level=config->power_level*6;
+    status = SET_Configuration_Value(WIFI_TX_POWER, tx_level);
+    if(status != WiFi_MODULE_SUCCESS) return status;
+    break;
+  default:
+    break;
+  }
+
+  switch(config->dhcp)
+  {
+  case off:
+  case on:
+  case custom:
+    status = SET_Configuration_Value(IP_USE_DHCP_SERVER, config->dhcp);
+    if(status != WiFi_MODULE_SUCCESS) return status;
+    break;
+  default:
+    break;
+  }
+
+  /* Set IP address */
+  if(config->ip_addr)
+  {
+    status = SET_Configuration_Addr(WIFI_IP_ADDRESS, config->ip_addr);
+    if(status != WiFi_MODULE_SUCCESS) return status;
+  }
+  /* Set netmask address */
+  if(config->netmask_addr)
+  {
+    status = SET_Configuration_Addr(WIFI_IP_NETMASK, config->netmask_addr);
+    if(status != WiFi_MODULE_SUCCESS) return status;
+  }
+  /* Set default gateway address */
+  if(config->gateway_addr)
+  {
+    status = SET_Configuration_Addr(WIFI_IP_DEFAULT_GATEWAY, config->gateway_addr);
+    if(status != WiFi_MODULE_SUCCESS) return status;
+  }
+  /* Set dns address */
+  if(config->dns_addr)
+  {
+    status = SET_Configuration_Addr(WIFI_IP_DNS, config->dns_addr);
+    if(status != WiFi_MODULE_SUCCESS) return status;
+  }
+  /* Set hostname */
+  if(config->host_name)
+  {
+    status = SET_Configuration_Addr(WIFI_IP_HOSTNAME, config->host_name);  
+    if(status != WiFi_MODULE_SUCCESS) return status;
+  }
+
+  if(config->ap_domain_name)
+  {
+    status = SET_Configuration_Addr(WIFI_IP_APDOMAINNAME, config->ap_domain_name);
+    if(status != WiFi_MODULE_SUCCESS) return status;
+  }
+
+  if(config->ap_config_page_name)
+  {
+    status = SET_Configuration_Addr(WIFI_IP_APREDIRECT, config->ap_config_page_name);
+    if(status != WiFi_MODULE_SUCCESS) return status;
+  }
+
+  if(config->http_timeout)
+  {
+    status = SET_Configuration_Value(WIFI_IP_HTTP_TIMEOUT, config->http_timeout*1000);
+    if(status != WiFi_MODULE_SUCCESS) return status;
+  }
+  if(config->dhcp_timeout)
+  {
+    status = SET_Configuration_Value(WIFI_IP_DHCP_TIMEOUT, config->dhcp_timeout);
+    if(status != WiFi_MODULE_SUCCESS) return status;
+  }   
+
+#ifdef MODULE_VERSION_SPWF01Sx_1y
+  Reset_AT_CMD_Buffer();  
+  sprintf((char*)WiFi_AT_Cmd_Buff,AT_HTTPD, config->web_server);  
+  status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));
+  if(status == WiFi_MODULE_SUCCESS)
+  {
+    status = USART_Receive_AT_Resp(Process_Event);
+    if(status != WiFi_MODULE_SUCCESS) return status;
+  }  
+#endif  
+  
+  /*AT+S.TLSCERT2=clean,all */
+  Reset_AT_CMD_Buffer();  
+  sprintf((char*)WiFi_AT_Cmd_Buff,"AT+S.TLSCERT2=clean,all\r");        
+  status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));
+  if(status == WiFi_MODULE_SUCCESS)
+  {
+    status = USART_Receive_AT_Resp(Process_Event);
+    if(status != WiFi_MODULE_SUCCESS) return status;
+  }  
+
+  /* save current setting in flash */
+  Reset_AT_CMD_Buffer();  
+  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);
+    if(status != WiFi_MODULE_SUCCESS) return status;
+  }   
+
+  if(config->wifi_baud_rate)
+  {
+    UART_Configuration(config->wifi_baud_rate); 
+    Receive_Data();//Restart data reception
+  }
+
+  /* Soft reset the module, Do the second reset after setting all parameters and saving in flash */
+  wifi_reset();
+
+  wifi_wakeup(WIFI_FALSE);//De-assert wakeup signal (PC8) to allow sleep if enabled
+#endif  //WIFI_USE_VCOM
+  
+#if DEBUG_PRINT
+  printf("\r\nEnd of Initialization..\r\n");
+#endif
+  //callSpwfSADevice_debug(spwf_device_class, "\r\n[SPWF] End of mbed Initialization\r\n");
+   
+  return status;
+}
+
+
+/**
+* @brief  wifi_socket_client_security
+*         Set the security certificates and key for secure socket (TLS)
+* @param  None
+* @retval WiFi_Status_t : return status
+*/
+WiFi_Status_t wifi_socket_client_security(uint8_t* tls_mode, uint8_t* root_ca_server, uint8_t* client_cert, uint8_t* client_key, uint8_t* client_domain, uint32_t tls_epoch_time) 
+{
+  WiFi_Status_t status = WiFi_MODULE_SUCCESS;
+
+  /*AT+S.TLSCERT2=clean,all */
+  Reset_AT_CMD_Buffer();  
+  sprintf((char*)WiFi_AT_Cmd_Buff,"AT+S.TLSCERT2=clean,all\r");        
+  status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));
+  if(status == WiFi_MODULE_SUCCESS)
+  {
+    status = USART_Receive_AT_Resp(Process_Event);
+    if(status != WiFi_MODULE_SUCCESS) return status;
+  }
+
+  /* AT+S.SETTIME=<seconds> */  
+  Reset_AT_CMD_Buffer();
+  if(tls_epoch_time==0) 
+    epoch_time = EPOCH_TIME;
+  else
+    epoch_time = tls_epoch_time;
+  
+  sprintf((char*)WiFi_AT_Cmd_Buff,"AT+S.SETTIME=%lu\r",(unsigned long)epoch_time);        
+  status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));
+  if(status == WiFi_MODULE_SUCCESS)
+  {
+    status = USART_Receive_AT_Resp(Process_Event);
+    if(status != WiFi_MODULE_SUCCESS) return status;
+  }
+
+  /*AT+S.TLSCERT=f_ca,<size><CR><data>*/
+  Reset_AT_CMD_Buffer();
+  sprintf((char*)WiFi_AT_Cmd_Buff,"AT+S.TLSCERT=f_ca,%d\r%s",strlen((const char *)root_ca_server) - 1, root_ca_server);        
+
+  status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));
+  if(status == WiFi_MODULE_SUCCESS)
+  {
+    status = USART_Receive_AT_Resp(Process_Event);
+    if(status != WiFi_MODULE_SUCCESS) return status;
+  }
+
+  /*AT+S.TLSCERT=f_cert,<size><CR><data>*/
+  if(tls_mode[0]=='m')
+  {
+    Reset_AT_CMD_Buffer();
+    sprintf((char*)WiFi_AT_Cmd_Buff,"AT+S.TLSCERT=f_cert,%d\r%s",strlen((const char *)client_cert) - 1, client_cert);
+
+    status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));
+    if(status == WiFi_MODULE_SUCCESS)
+        {
+            status = USART_Receive_AT_Resp(Process_Event);
+            if(status != WiFi_MODULE_SUCCESS) return status;
+        }
+
+    /*AT+S.TLSCERT=f_key,<size><CR><data>*/
+    Reset_AT_CMD_Buffer();
+    sprintf((char*)WiFi_AT_Cmd_Buff,"AT+S.TLSCERT=f_key,%d\r%s",strlen((const char *)client_key) - 1, client_key);        
+
+    status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));
+    if(status == WiFi_MODULE_SUCCESS)
+        {
+            status = USART_Receive_AT_Resp(Process_Event);
+            if(status != WiFi_MODULE_SUCCESS) return status;
+        }
+  }
+
+  /*AT+S.TLSDOMAIN=f_domain,<server domain>*/
+  Reset_AT_CMD_Buffer();
+  sprintf((char*)WiFi_AT_Cmd_Buff,"AT+S.TLSDOMAIN=f_domain,%s\r", client_domain);        
+  status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));
+  if(status == WiFi_MODULE_SUCCESS)
+  {
+    status = USART_Receive_AT_Resp(Process_Event);
+    if(status != WiFi_MODULE_SUCCESS) return status;
+  }  
+ 
+  return status; 
+}
+
+/**
+* @brief  wifi_socket_client_open
+*         Open a network socket
+* @param  Hostname hostname to connect to
+*         portnumber portnumber of the Host to connect to
+*         protocol tcp or udp protocol
+*         sock_id socket id of the opened socket returned to the user
+* @retval WiFi_Status_t : return status of socket open request
+*/
+WiFi_Status_t wifi_socket_client_open(uint8_t * hostname, uint32_t port_number, uint8_t * protocol, uint8_t * sock_id) 
+{
+  WiFi_Status_t status = WiFi_MODULE_SUCCESS;
+
+  Queue_Client_Open_Event(hostname,port_number,protocol);
+  status = USART_Receive_AT_Resp(Process_Event);
+
+  *sock_id = Socket_Open_ID; //return the socket id to the user
+
+  return status; 
+}
+
+/**
+* @brief  Open_Serial_Port
+*         Open a network socket
+* @param  None
+* @retval WiFi_Status_t : Wifi status
+*/
+WiFi_Status_t Open_Serial_Port()
+{
+  WiFi_Status_t status = WiFi_MODULE_SUCCESS;
+  /* AT+S.SOCKOS=2<cr> */
+  Reset_AT_CMD_Buffer();
+  //sprintf((char*)WiFi_AT_Cmd_Buff,"\rAT+S.SOCKOS=%d\r",SerialPortNo);        
+  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_socket_client_write
+*         Write len bytes of data to socket
+* @param  sock_id socket ID of the socket to write to
+*         DataLength: data length to send
+*         pData : pointer of data buffer to be written
+* @retval WiFi_Status_t : return status of socket write request
+*/
+WiFi_Status_t wifi_socket_client_write(uint8_t sock_id, uint16_t DataLength, char * pData)
+{
+  /* AT+S.SOCKW=00,11<cr> */
+  WiFi_Status_t status = WiFi_MODULE_SUCCESS;
+
+  //Check if sock_id is open
+  if(!open_sockets[sock_id])
+    return WiFi_NOT_READY;
+
+  if(DataLength>=1021 || DataLength<=0)
+    return WiFi_NOT_SUPPORTED;
+
+  Queue_Client_Write_Event(sock_id,DataLength,pData);
+  status = USART_Receive_AT_Resp(Process_Event);
+  return status;
+}
+
+/**
+* @brief  Socket_Read
+*         Return len bytes of data from socket
+* @param  DataLength: data length to read
+* @retval WiFi_Status_t : return status of socket read request
+*/
+WiFi_Status_t Socket_Read(uint16_t DataLength)
+{
+  /* AT+S.SOCKR=01,12<cr> */
+  WiFi_Status_t status = WiFi_MODULE_SUCCESS;
+  wait_for_command_mode();
+
+  /* AT+S.SOCKON=myserver,1234,t<cr> */
+  sprintf((char*)WiFi_AT_Cmd_Buff,AT_SOCKET_READ,sockon_query_id,DataLength);
+  status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));
+  if(status == WiFi_MODULE_SUCCESS)
+  {
+    if(status_flag.stop_event_dequeue == WIFI_FALSE)
+        status_flag.stop_event_dequeue = WIFI_TRUE;
+    SockON_Data_Length = DataLength;
+    status_flag.enable_sock_read = WIFI_TRUE;
+    process_buffer_index =5;
+    status_flag.enable_receive_data_chunk = WIFI_TRUE;
+    WiFi_Module_State = Process_Event;
+    status_flag.Set_AT_Cmd_Response_False = WIFI_TRUE;
+    memset(UserDataBuff, 0x00, MAX_BUFFER_GLOBAL);
+  }
+  return status;
+}
+
+/**
+* @brief  wifi_socket_client_close
+*         The SOCKC command allows to close socket
+* @param  sock_close_id the socket ID of the socket which needs to be closed.
+* @retval WiFi_Status_t : return status of socket close request
+*/
+WiFi_Status_t wifi_socket_client_close(uint8_t sock_close_id)
+{
+  WiFi_Status_t status = WiFi_MODULE_SUCCESS;
+  
+  if(open_sockets[sock_close_id])
+  {
+    Queue_Client_Close_Event(sock_close_id);
+    return status; 
+  }
+  else
+    return WiFi_MODULE_ERROR;
+  
+}
+
+/**
+* @brief  Socket_Pending_Data
+*         Query pending data.It will returns the number of bytes of data waiting on socket
+* @param None
+* @retval uint8_t :number of bytes of data waiting on socket
+*/
+void Socket_Pending_Data()
+{
+  WiFi_Status_t status = WiFi_MODULE_SUCCESS;
+ 
+  /* AT+S.SOCKQ=01<cr> */
+  Reset_AT_CMD_Buffer();
+
+  wait_for_command_mode();
+
+  if(open_sockets[sockon_query_id])
+  {
+      if(status_flag.stop_event_dequeue == WIFI_FALSE)
+    status_flag.stop_event_dequeue = WIFI_TRUE;
+  
+  sprintf((char*)WiFi_AT_Cmd_Buff,AT_QUERY_PENDING_DATA,sockon_query_id);        
+  status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));
+  if(status==WiFi_MODULE_SUCCESS)
+  {
+    /* EQ. Set state to Process_Event */
+    WiFi_Module_State = Process_Event;
+    status_flag.Set_AT_Cmd_Response_False = WIFI_TRUE;
+  }  
+}
+}
+
+/**
+* @brief  wifi_socket_server_open
+*         Open a Server socket
+* @param  None
+* @retval WiFi_Status_t : return status of server socket request
+*/
+WiFi_Status_t wifi_socket_server_open(uint32_t port_number, uint8_t * protocol) 
+{
+WiFi_Status_t status = WiFi_MODULE_SUCCESS;
+Reset_AT_CMD_Buffer();
+
+/* AT+S.SOCKD=portNo,t<cr> */  
+sprintf((char*)WiFi_AT_Cmd_Buff,AT_SERVER_SOCKET_OPEN,(int)port_number,protocol);        
+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_socket_server_write
+*         Write to a Server socket
+* @param  None
+* @retval WiFi_Status_t : return status of server socket request
+*/
+WiFi_Status_t wifi_socket_server_write(uint16_t DataLength,char * pData) 
+{
+WiFi_Status_t status = WiFi_MODULE_SUCCESS;
+/*Can only write if there is a client connected*/
+if(!wifi_client_connected)
+{
+return WiFi_NOT_READY;
+}
+ __disable_irq();
+
+status_flag.do_not_reset_push_WIFI_event = WIFI_TRUE;
+status_flag.prevent_push_WIFI_event = WIFI_TRUE;
+__enable_irq();
+
+while(status_flag.sock_read_ongoing || WIND64_count!= 0)//wait till any pending data is read
+{
+    asm("NOP");
+}
+
+wait_for_command_mode();
+
+/*to make sure that by default the mode is not switched to command mode from data mode*/
+status_flag.switch_by_default_to_command_mode = WIFI_FALSE;
+
+/*Switch to Data Mode first*/
+if(!status_flag.data_mode)
+{
+WiFi_switch_to_data_mode();//switch by default
+while(!status_flag.data_mode)
+{
+  //Wait till data_mode is active
+    asm("NOP");
+}
+}  
+
+/*Write the data on the uart*/
+/*if(HAL_UART_Transmit(&UartWiFiHandle, (uint8_t *)pData, DataLength,1000)!= HAL_OK)
+{
+Error_Handler();
+return WiFi_HAL_UART_ERROR;
+}*/
+//HAL_Delay(100);//Wait for tx before switching back to command mode
+
+/*Switch back to Command Mode*/
+if(!status_flag.command_mode)
+{
+WiFi_switch_to_command_mode();//switch by default
+while(!status_flag.command_mode)
+{
+  //Wait till command_mode is active
+    asm("NOP");
+}
+}
+
+status_flag.switch_by_default_to_command_mode = WIFI_TRUE;  /*back to default behaviour*/
+
+__disable_irq();
+status_flag.prevent_push_WIFI_event = WIFI_FALSE;
+status_flag.do_not_reset_push_WIFI_event = WIFI_FALSE;
+__enable_irq();
+
+return status;
+}
+
+/**
+* @brief  Server Socket Close
+*         Close a Server socket
+* @param  None
+* @retval WiFi_Status_t : return status of server socket request
+*/
+WiFi_Status_t wifi_socket_server_close() 
+{
+WiFi_Status_t status = WiFi_MODULE_SUCCESS;
+Reset_AT_CMD_Buffer();
+
+/* AT+S.SOCKD=portNo,t<cr> */  
+sprintf((char*)WiFi_AT_Cmd_Buff,AT_SERVER_SOCKET_CLOSE);        
+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  wait_for_command_mode
+*         Waits till we are in command mode
+* @param  None
+* @retval None
+*/
+void wait_for_command_mode(void)
+{
+while(!status_flag.command_mode)
+    {
+      //Make sure we are in command mode, ideally we should do this in every User API?
+        asm("NOP");
+    }
+}
+
+
+/**
+* @brief  wifi_file_delete
+*         Delete a file
+* @param  pFileName : File Name to be deleted
+* @retval WiFi_Status_t : return status of delete file request
+*/
+WiFi_Status_t wifi_file_delete(char * pFileName)
+{
+/* AT+S.FSD: delete an existing file */  
+WiFi_Status_t status = WiFi_MODULE_SUCCESS;  
+Reset_AT_CMD_Buffer(); 
+/* AT+S.FSL */
+sprintf((char*)WiFi_AT_Cmd_Buff,AT_DELETE_FILE,pFileName);  
+
+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_file_list
+*         List existing filename
+* @param  None
+* @retval WiFi_Status_t : return status of AT cmd request
+*/
+
+WiFi_Status_t wifi_file_list()
+{
+WiFi_Status_t status = WiFi_MODULE_SUCCESS;  
+Queue_Wifi_File_Event(NULL,NULL,0);
+status = USART_Receive_AT_Resp(Process_Event);
+return status;
+}
+
+/**
+* @brief  wifi_file_show
+*         Print the contents of an existing file
+* @param  pFileName : pinter of file name
+* @retval WiFi_Status_t : return status of AT cmd request
+*/
+
+WiFi_Status_t wifi_file_show(uint8_t * pFileName)
+{
+if(pFileName==NULL)
+    return WiFi_MODULE_ERROR;
+
+WiFi_Status_t status = WiFi_MODULE_SUCCESS;  
+Queue_Wifi_File_Event(NULL,pFileName,0);
+status = USART_Receive_AT_Resp(Process_Event);
+return status; 
+}
+
+/**
+* @brief  wifi_file_create
+*         Create file for HTTP server
+* @param  pFileName : pointer of file name to be created
+*         alength   : length of file
+* @retval WiFi_Status_t : return status of AT cmd request
+*/
+
+WiFi_Status_t wifi_file_create(char *pFileName, uint16_t alength, char * pUserFileBuff)
+{
+WiFi_Status_t status = WiFi_MODULE_SUCCESS;
+
+if(alength >1024)
+return WiFi_AT_FILE_LENGTH_ERROR;
+
+Reset_AT_CMD_Buffer();
+
+/* AT+S.FSC=/index.html  */
+sprintf((char*)WiFi_AT_Cmd_Buff, AT_CREATE_NEW_HTML_FILE, pFileName, alength);
+
+status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));
+if(status == WiFi_MODULE_SUCCESS)
+{
+status = USART_Receive_AT_Resp(Process_Event);
+int len = strlen(pUserFileBuff);
+
+if(len >= 1024)
+   return WiFi_AT_FILE_LENGTH_ERROR;
+
+/* AT+S.FSA=/index.html  */
+sprintf((char*)WiFi_AT_Cmd_Buff,AT_APPEND_FILE,pFileName,len);
+
+status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));
+if(status == WiFi_MODULE_SUCCESS)
+{
+  memset(WiFi_AT_Cmd_Buff, 0x00, sizeof WiFi_AT_Cmd_Buff);
+  memcpy((char*)(char*)WiFi_AT_Cmd_Buff, (char*) pUserFileBuff,len);
+  WiFi_AT_Cmd_Buff[len+1]='\r';
+  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_http_get
+*         Issue an HTTP GET of the given path to the specified host
+* @param  None
+* @retval WiFi_Status_t : return status of AT cmd response
+*/
+
+WiFi_Status_t wifi_http_get(uint8_t * hostname, uint8_t * path, uint32_t port_number)
+{
+if(hostname == NULL || path == NULL)
+return WiFi_MODULE_ERROR;
+
+WiFi_Status_t status = WiFi_MODULE_SUCCESS;
+
+while(status_flag.sock_read_ongoing || WIND64_count!= 0); //wait till any pending data is read
+{
+    asm("NOP");
+}
+
+// AT+S.HTTPGET=host.example.com,/index.html, port_number<cr>
+//Queue the http-get command
+Queue_Http_Event(hostname, path, port_number,NULL);
+
+//Make the user wait anyway
+status = USART_Receive_AT_Resp(Process_Event);
+
+return status; 
+
+}
+
+/**
+* @brief  wifi_http_post
+*         Issue an HTTP GET of the given path to the specified host
+* @param  None
+* @retval WiFi_Status_t : status of Http Post Request
+*/
+
+WiFi_Status_t wifi_http_post(uint8_t * pURL_path)
+{
+if(pURL_path == NULL)
+return WiFi_MODULE_ERROR;
+
+WiFi_Status_t status = WiFi_MODULE_SUCCESS;
+
+while(status_flag.sock_read_ongoing || WIND64_count!= 0);//wait till any pending data is read
+{
+    asm("NOP");
+}
+
+// AT+S.HTTPPOST = posttestserver.com,/post.php,name=demo&email=mymail&subject=subj&body=message<cr>
+Queue_Http_Event(NULL,NULL,0,pURL_path);
+
+//Make the user wait anyway
+status = USART_Receive_AT_Resp(Process_Event);
+return status;
+}
+
+/**
+* @brief  wifi_file_image_create
+*         Downloads an updated file system via a single HTTP GET request to the
+*         named host and path.
+* @param  None
+* @retval WiFi_Status_t
+*/
+WiFi_Status_t wifi_file_image_create(uint8_t * pHostName, uint8_t * pFileName, uint32_t port_number)
+{
+if(pHostName == NULL || pFileName == NULL ||  port_number ==0)
+return WiFi_MODULE_ERROR;
+
+WiFi_Status_t status = WiFi_MODULE_SUCCESS;
+Queue_Wifi_File_Event(pHostName,pFileName,port_number);
+status = USART_Receive_AT_Resp(Process_Event);
+
+/* Soft reset the module */
+SET_Power_State(PowerSave_State);
+return status;
+}
+
+/**
+* @brief  wifi_file_erase_external_flash
+*         This API allows to erase the content of the external flash
+* @param  None
+* @retval WiFi_Status_t
+*/
+WiFi_Status_t wifi_file_erase_external_flash()
+{
+WiFi_Status_t status = WiFi_MODULE_SUCCESS;  
+
+Reset_AT_CMD_Buffer();
+ResetBuffer();
+
+/* AT+S.HTTPDFSERASE */
+sprintf((char*)WiFi_AT_Cmd_Buff,AT_ERASE_FLASH_MEMORY);  
+status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));
+
+/* Soft reset the module */
+SET_Power_State(PowerSave_State);
+
+return status;
+}
+
+/**
+* @brief  wifi_fw_update
+*         Issue an HTTP GET of the given path to the specified host and get the firmware updated
+* @param  None
+* @retval None
+*/
+WiFi_Status_t wifi_fw_update(uint8_t * hostname, uint8_t * filename_path, uint32_t port_number)
+{
+WiFi_Status_t status = WiFi_MODULE_SUCCESS;
+Queue_Wifi_FW_Update_Event(hostname,filename_path,port_number);
+status = USART_Receive_AT_Resp(Process_Event);
+/* Soft reset the module */
+SET_Power_State(PowerSave_State);
+return status;
+}
+
+/**
+* @brief  wifi_network_scan
+*         Performs an immediate scan for available network
+* @param  None
+* @retval WiFi_Status_t : WiFi status error
+*/
+WiFi_Status_t wifi_network_scan(wifi_scan *scan_result, uint16_t max_scan_number)
+{
+WiFi_Status_t status = WiFi_MODULE_SUCCESS;
+wifi_scanned_list = scan_result;
+if(max_scan_number>MAX_WIFI_SCAN_NETWORK)
+return WiFi_NOT_SUPPORTED;
+user_scan_number = max_scan_number;
+
+if(status_flag.Scan_Ongoing)
+{
+return WiFi_AT_CMD_BUSY;
+}
+
+status_flag.Scan_Ongoing = WIFI_TRUE;
+
+#if 0   //TBD
+if(WiFi_Param.WiFi_Module_State == WiFi_MiniAP_MODE)
+return WiFi_NOT_SUPPORTED;
+#endif  
+
+/* AT+S.SCAN: performs an immediate scan for available networks */
+Reset_AT_CMD_Buffer();
+sprintf((char*)WiFi_AT_Cmd_Buff,AT_WiFi_SCAN);  
+status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));
+if(status == WiFi_MODULE_SUCCESS)
+{
+status = USART_Receive_AT_Resp(Process_Event);
+}
+
+/*At this point we have WiFi_Scan_Buffer filled with RSSI and SSID values*/
+return status;
+}
+
+/**
+* @brief  Set_MiniAP_Mode
+*         Configure Wi-Fi module in AP mode.
+      MiniAP is always configured in open mode (WEP not supported)
+* @param  None
+* @retval WiFi_Status_t : status of AT cmd 
+*/
+WiFi_Status_t wifi_ap_start(uint8_t * ssid, uint8_t channel_num)
+{
+WiFi_Status_t status = WiFi_MODULE_SUCCESS;  
+
+/* Set the SSID : AT+S.SSIDTXT=<SSID>*/    
+//if(ssid)
+  status = SET_SSID((char*)ssid);
+
+
+if(status != WiFi_MODULE_SUCCESS)
+return WiFi_SSID_ERROR;
+
+/* Set the network privacy mode : AT+S.SCFG=wifi_priv_mode,0*/ 
+status = SET_Configuration_Value(WIFI_PRIV_MODE, None);
+if(status != WiFi_MODULE_SUCCESS)
+return WiFi_CONFIG_ERROR;
+
+/* Set the network mode (1 = STA, 2 = IBSS, 3 = MiniAP) :: AT+S.SCFG=wifi_mode,3*/  
+status = SET_Configuration_Value(WIFI_MODE, WiFi_MiniAP_MODE);
+if(status != WiFi_MODULE_SUCCESS)
+return WiFi_CONFIG_ERROR;
+
+/* Set the channel number */  
+status = SET_Configuration_Value(WIFI_CHANNEL_NUMBER, channel_num);
+if(status != WiFi_MODULE_SUCCESS)
+return WiFi_CONFIG_ERROR; 
+
+/* Save the settings on the flash memory : AT&W*/ 
+Save_Current_Setting();
+
+status_flag.WiFi_Configuration_Done = WIFI_TRUE;
+WiFi_Module_State = Process_Event;
+
+/* Soft reset the module */
+SET_Power_State(PowerSave_State);
+
+return status; 
+}
+
+
+/**
+* @brief  SET_WiFi_STA_Mode
+*         Configure Wi-Fi module in STA mode
+* @param  SSID     : SSID name
+* @param  sec_key  : security key
+* @param  priv_mode : network privecy mode
+* @retval WiFi_Status_t : status of AT cmd 
+*/
+WiFi_Status_t wifi_connect(char * ssid, char * sec_key, WiFi_Priv_Mode priv_mode)
+{
+WiFi_Status_t status = WiFi_MODULE_SUCCESS;
+if(status_flag.AT_Cmd_Ongoing == WIFI_FALSE)
+status_flag.AT_Cmd_Ongoing = WIFI_TRUE;
+else 
+{
+return WiFi_AT_CMD_BUSY;
+}
+
+if(sec_key) {
+status = SET_WiFi_SecKey((char*)sec_key);
+if(status != WiFi_MODULE_SUCCESS)
+    return WiFi_SecKey_ERROR;
+}
+
+/* Set the SSID : AT+S.SSIDTXT=<SSID>*/    
+
+  status = SET_SSID((char*)ssid);
+
+if(status != WiFi_MODULE_SUCCESS)
+return WiFi_SSID_ERROR;
+
+/* Set the network privacy mode : AT+S.SCFG=wifi_priv_mode,2*/ 
+status = SET_Configuration_Value(WIFI_PRIV_MODE, priv_mode);
+if(status != WiFi_MODULE_SUCCESS)
+return WiFi_CONFIG_ERROR;
+
+/* Set the network mode (1 = STA, 2 = IBSS, 3 = MiniAP) :: AT+S.SCFG=wifi_mode,1*/  
+status = SET_Configuration_Value(WIFI_MODE, WiFi_STA_MODE);
+if(status != WiFi_MODULE_SUCCESS)
+return WiFi_CONFIG_ERROR;
+
+/* Save the settings on the flash memory : AT&W*/ 
+Save_Current_Setting();
+
+status_flag.WiFi_Configuration_Done = WIFI_TRUE;
+//WiFi_Module_State = WiFi_Process_Event;
+
+/* Soft reset the module */
+SET_Power_State(PowerSave_State);
+
+status_flag.AT_Cmd_Ongoing = WIFI_FALSE;
+
+return status; 
+}
+
+/**
+* @brief  SET_WiFi_IBSS_Mode
+*         Configure Wi-Fi module in IBSS mode
+* @param  SSID     : SSID name
+* @param  priv_mode : network privecy mode
+* @retval WiFi_Status_t : status of AT cmd
+*/
+WiFi_Status_t wifi_adhoc_create(uint8_t * ssid, WiFi_Priv_Mode priv_mode)
+{
+WiFi_Status_t status = WiFi_MODULE_SUCCESS;
+
+Attention_Cmd();
+/* Set the SSID : AT+S.SSIDTXT=<SSID>*/    
+status = SET_SSID((char*)ssid);  
+if(status != WiFi_MODULE_SUCCESS)
+return WiFi_SSID_ERROR;
+
+/* Set the network privacy mode : AT+S.SCFG=wifi_priv_mode,0*/ 
+status = SET_Configuration_Value(WIFI_PRIV_MODE, priv_mode);
+if(status != WiFi_MODULE_SUCCESS)
+  return WiFi_CONFIG_ERROR;
+
+
+/* Set the network mode (1 = STA, 2 = IBSS, 3 = MiniAP) :: AT+S.SCFG=wifi_mode,2*/  
+status = SET_Configuration_Value(WIFI_MODE, WiFi_IBSS_MODE);
+if(status != WiFi_MODULE_SUCCESS)
+  return WiFi_CONFIG_ERROR;
+
+/* Set IP address */
+status = SET_Configuration_Addr(WIFI_IP_ADDRESS, WIFI_IBSS_IP_ADDR);
+if(status != WiFi_MODULE_SUCCESS)
+  return WiFi_CONFIG_ERROR;
+
+/* Set IP default gateway */
+status = SET_Configuration_Addr(WIFI_IP_DEFAULT_GATEWAY, WIFI_IBSS_DEFAULT_GATEWAY);
+if(status != WiFi_MODULE_SUCCESS)
+  return WiFi_CONFIG_ERROR;
+
+
+/* Set IP DNS */
+status = SET_Configuration_Addr(WIFI_IP_DNS, WIFI_IBSS_IP_DNS_ADDR);
+if(status != WiFi_MODULE_SUCCESS)
+  return WiFi_CONFIG_ERROR;
+
+/* Set IP netmask */
+status = SET_Configuration_Addr(WIFI_IP_NETMASK, WIFI_IBSS_IP_MASK);
+if(status != WiFi_MODULE_SUCCESS)
+  return WiFi_CONFIG_ERROR;
+
+/* Turn OFF the DHCP */
+SET_Configuration_Value(IP_USE_DHCP_SERVER, WIFI_IP_USE_DHCP);   
+if(status != WiFi_MODULE_SUCCESS)
+  return WiFi_CONFIG_ERROR;
+
+/* Save the settings on the flash memory : AT&W*/ 
+Save_Current_Setting();
+
+/* Soft reset the module */
+SET_Power_State(PowerSave_State); 
+return status;
+}
+
+
+/**
+* @brief  wifi_standby
+*         Configured WiFi module to enter standby
+* @param  arg_standby_time: standby time
+* @retval WiFi_Status_t : status of AT cmd
+*/
+WiFi_Status_t wifi_standby(uint8_t arg_standby_time)
+{
+/*
+For Standby, the presence of Jumpers on JP4 and JP3 has the following behaviour:
+JP3 (middle and bottom): prevents standby and immediately wakes-up module
+JP3 (middle and top): no effect on standby
+JP4 (middle and right): prevents wakeup and standby runs forever
+JP4 (middle and left): no effect on standby
+*/
+
+WiFi_Status_t status = WiFi_MODULE_SUCCESS;
+
+/*if(arg_standby_time<2)
+return WiFi_NOT_SUPPORTED;*/
+  
+SET_Configuration_Value(WIFI_SLEEP_ENABLED, 0);  
+SET_Configuration_Value(WIFI_STANDBY_ENABLED, 1);  
+status = SET_Configuration_Value(WIFI_STANDBY_TIME, arg_standby_time);  
+
+/* save current setting in flash */
+Save_Current_Setting();
+
+/* AT : send AT command */
+sprintf((char*)WiFi_AT_Cmd_Buff,AT_SET_POWER_STATE,1);  //cfun=4
+WiFi_Module_State = Process_Event; //make sure the WiFi module is in this state to receive WINDS after wakeup
+status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));
+
+if(status == WiFi_MODULE_SUCCESS)//if transmit is success, prepare for resume
+{
+/*
+status_flag.AT_Cmd_Processing = WIFI_TRUE;//We do not want the next UART data_byte fetch to be done
+HAL_NVIC_DisableIRQ(USARTx_IRQn);//Disable UART IRQ  
+status_flag.Standby_Timer_Running=WIFI_TRUE;  
+printf("\r\nGoing into Standby Mode...\r\n");*/
+}
+
+return status;
+
+}
+
+/**
+* @brief  wifi_wakeup
+*         wakeup the module from sleep by setting the GPIO6 through PC13
+*         or allow it to go to sleep
+*         Jumper needed on JP4
+* @param  wakeup wakeup (WIFI_TRUE) or allow sleep(WIFI_FALSE)
+* @retval WiFi_Status_t : status of function call
+*/
+WiFi_Status_t wifi_wakeup(wifi_bool wakeup)
+{
+    WiFi_Status_t status = WiFi_MODULE_SUCCESS;    
+    
+    if(wakeup)
+        callSpwfSADevice_wakeup(spwf_device_class, 0);
+    else
+        callSpwfSADevice_wakeup(spwf_device_class, 0);
+    wait_ms(100);
+    return status;
+}
+
+
+/**
+* @brief  wifi_disconnect
+*         disconnect the module from any AP
+* @param  None
+* @retval WiFi_Status_t : status of AT cmd
+*/
+WiFi_Status_t wifi_disconnect(void)
+{
+WiFi_Status_t status = WiFi_MODULE_SUCCESS;
+
+/* Set wifi_mode to idle*/
+status = SET_Configuration_Value(WIFI_MODE, WiFi_IDLE_MODE);
+
+/*If module was connected, reset the status*/
+if(wifi_connected == 1)
+  {
+    wifi_connected = 0;//this will allow the TIM handler to make the callback on connection(WiFiUp)
+  }  
+
+/* save current setting in flash */
+Save_Current_Setting();
+
+/* Soft reset the module */
+status = SET_Power_State(PowerSave_State);//CFUN=1
+   
+return status;
+}
+
+/**
+* @brief  wifi_enable
+*         Enable/Disable the Wi-Fi interface
+* @param  enable enable Wi-Fi (WIFI_TRUE) disable Wi-Fi (WIFI_FALSE)
+* @retval WiFi_Status_t : status of AT cmd
+*/
+WiFi_Status_t wifi_enable(wifi_bool enable)
+{
+WiFi_Status_t status = WiFi_MODULE_SUCCESS;
+
+/* Enable or Disable wifi interface*/  
+Reset_AT_CMD_Buffer();  
+sprintf((char*)WiFi_AT_Cmd_Buff,AT_WIFI_ENABLE, enable);  
+
+/*if(HAL_UART_Transmit(&UartWiFiHandle, (uint8_t *)WiFi_AT_Cmd_Buff, strlen((char*)WiFi_AT_Cmd_Buff),1000)!= HAL_OK)
+{
+Error_Handler();
+#if DEBUG_PRINT
+printf("HAL_UART_Transmit Error");
+#endif
+return WiFi_HAL_UART_ERROR;
+} */ 
+
+status = USART_Receive_AT_Resp(Process_Event);  
+
+//wait for power down/hw started
+if(enable)
+while(status_flag.WiFi_Enabled != WIFI_TRUE) 
+{
+    asm("NOP");
+}
+else
+while(status_flag.WiFi_Enabled != WIFI_FALSE) 
+{
+    asm("NOP");
+}
+
+return status;
+    
+}
+
+
+
+/**
+* @brief  wifi_restore
+*         Restore the Wi-Fi with default values.
+* @param  None
+* @retval WiFi_Status_t : status of AT cmd
+*/
+WiFi_Status_t wifi_restore()
+{
+WiFi_Status_t status = WiFi_MODULE_SUCCESS;
+
+/* Restore default setting*/
+Restore_Default_Setting();  
+
+/* Set wifi_mode to idle*/
+SET_Configuration_Value(WIFI_MODE, WiFi_IDLE_MODE);
+
+/* set the local echo */
+SET_Configuration_Value(LOCALECHO1, 0);
+
+/* save current setting in flash */
+Save_Current_Setting();
+
+/* Soft reset the module */
+status = SET_Power_State(PowerSave_State);//CFUN=1
+   
+return status;
+}
+
+/*GPIO Configuration Functions*/
+
+/**
+* @brief  wifi_gpio_init
+*         Configure a GPIO pin as in or out with IRQ setting
+* @param  pin GPIO pin number
+* @param  irq configuration of the pin
+* @retval WiFi_Status_t : status of AT cmd
+*/
+uint8_t wifi_gpio_init(GpioPin pin, char* dir, char irq)
+{
+WiFi_Status_t status = WiFi_MODULE_SUCCESS;
+
+/* AT+S.GPIOC=pin,dir,irq */
+Reset_AT_CMD_Buffer();
+
+memset(WiFi_AT_Cmd_Buff, 0x00, sizeof WiFi_AT_Cmd_Buff);
+
+if(irq!=GPIO_Off)
+  sprintf((char*)WiFi_AT_Cmd_Buff,"AT+S.GPIOC=%d,%s,%c\r", pin, dir, irq);
+else
+  sprintf((char*)WiFi_AT_Cmd_Buff,"AT+S.GPIOC=%d,%s\r", pin, dir);
+
+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_gpio_read
+*         Read the configuration of a GPIO pin
+* @param  pin GPIO pin number
+* @param  val value returned
+* @param  dir configuration direction returned
+* @retval WiFi_Status_t : status of AT cmd
+*/
+uint8_t wifi_gpio_read(GpioPin pin, uint8_t *val, uint8_t *dir)
+{
+WiFi_Status_t status = WiFi_MODULE_SUCCESS;    
+
+/* AT+S.GPIOR=pin */
+Reset_AT_CMD_Buffer();  
+
+sprintf((char*)WiFi_AT_Cmd_Buff,"AT+S.GPIOR=%d\r", pin);
+
+status = USART_Transmit_AT_Cmd(strlen((char*)WiFi_AT_Cmd_Buff));
+if(status == WiFi_MODULE_SUCCESS)
+  {
+    status = USART_Receive_AT_Resp(Process_Event);
+  }
+*val = gpio_value;
+*dir = gpio_direc;
+
+return status;
+}
+
+/**
+* @brief  wifi_gpio_write
+*         Read the value of a GPIO pin
+* @param  pin GPIO pin number
+* @param  val value to be configured
+* @retval WiFi_Status_t : status of AT cmd
+*/
+uint8_t wifi_gpio_write(GpioPin pin, GpioWriteValue value)
+{
+WiFi_Status_t status = WiFi_MODULE_SUCCESS;
+
+/* AT+S.GPIOW=pin,value */
+Reset_AT_CMD_Buffer(); 
+
+sprintf((char*)WiFi_AT_Cmd_Buff,"AT+S.GPIOW=%d,%d\r", pin, value);
+
+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;
+}
+
+void UART_Configuration(uint32_t baud_rate)
+{
+}
+
+#ifdef USART_PRINT_MSG
+void USART_PRINT_MSG_Configuration(uint32_t baud_rate)
+{
+}
+#endif
+
+/**
+  * @}
+  */ 
+
+/**
+  * @}
+  */ 
+
+
+/**
+  * @}
+  */ 
+
+/******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/
+
+