Initial commit

Dependencies:   DISCO_L475VG_IOT01A_wifi

Committer:
ggaleote
Date:
Tue Mar 03 13:51:13 2020 +0000
Revision:
0:bee4cc0bb747
Initialize repository

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ggaleote 0:bee4cc0bb747 1 #include "mbed.h"
ggaleote 0:bee4cc0bb747 2 #include "wifi.h"
ggaleote 0:bee4cc0bb747 3 /*------------------------------------------------------------------------------
ggaleote 0:bee4cc0bb747 4 Hyperterminal settings: 115200 bauds, 8-bit data, no parity
ggaleote 0:bee4cc0bb747 5
ggaleote 0:bee4cc0bb747 6 This example
ggaleote 0:bee4cc0bb747 7 - connects to a wifi network (SSID & PWD to set in mbed_app.json)
ggaleote 0:bee4cc0bb747 8 - displays the IP address and creates a web page
ggaleote 0:bee4cc0bb747 9 - then connect on its IP address on the same wifi network with another device
ggaleote 0:bee4cc0bb747 10 - Now able to change the led status and read the temperature
ggaleote 0:bee4cc0bb747 11
ggaleote 0:bee4cc0bb747 12 This example uses SPI3 ( PE_0 PC_10 PC_12 PC_11), wifi_wakeup pin (PB_13),
ggaleote 0:bee4cc0bb747 13 wifi_dataready pin (PE_1), wifi reset pin (PE_8)
ggaleote 0:bee4cc0bb747 14 ------------------------------------------------------------------------------*/
ggaleote 0:bee4cc0bb747 15
ggaleote 0:bee4cc0bb747 16 /* Private defines -----------------------------------------------------------*/
ggaleote 0:bee4cc0bb747 17 #define WIFI_WRITE_TIMEOUT 10000
ggaleote 0:bee4cc0bb747 18 #define WIFI_READ_TIMEOUT 10000
ggaleote 0:bee4cc0bb747 19 #define PORT 80
ggaleote 0:bee4cc0bb747 20
ggaleote 0:bee4cc0bb747 21 /* Private typedef------------------------------------------------------------*/
ggaleote 0:bee4cc0bb747 22 typedef enum
ggaleote 0:bee4cc0bb747 23 {
ggaleote 0:bee4cc0bb747 24 WS_IDLE = 0,
ggaleote 0:bee4cc0bb747 25 WS_CONNECTED,
ggaleote 0:bee4cc0bb747 26 WS_DISCONNECTED,
ggaleote 0:bee4cc0bb747 27 WS_ERROR,
ggaleote 0:bee4cc0bb747 28 } WebServerState_t;
ggaleote 0:bee4cc0bb747 29
ggaleote 0:bee4cc0bb747 30 /* Private macro -------------------------------------------------------------*/
ggaleote 0:bee4cc0bb747 31 static int wifi_sample_run(void);
ggaleote 0:bee4cc0bb747 32 static void WebServerProcess(void);
ggaleote 0:bee4cc0bb747 33 static WIFI_Status_t SendWebPage(uint8_t ledIsOn, float temperature);
ggaleote 0:bee4cc0bb747 34 /* Private variables ---------------------------------------------------------*/
ggaleote 0:bee4cc0bb747 35 Serial pc(SERIAL_TX, SERIAL_RX);
ggaleote 0:bee4cc0bb747 36 static uint8_t http[1024];
ggaleote 0:bee4cc0bb747 37 static uint8_t resp[1024];
ggaleote 0:bee4cc0bb747 38 uint16_t respLen;
ggaleote 0:bee4cc0bb747 39 uint8_t IP_Addr[4];
ggaleote 0:bee4cc0bb747 40 uint8_t MAC_Addr[6];
ggaleote 0:bee4cc0bb747 41 int32_t Socket = -1;
ggaleote 0:bee4cc0bb747 42 static WebServerState_t State = WS_ERROR;
ggaleote 0:bee4cc0bb747 43 char ModuleName[32];
ggaleote 0:bee4cc0bb747 44 DigitalOut led(LED2);
ggaleote 0:bee4cc0bb747 45 AnalogIn adc_temp(ADC_TEMP);
ggaleote 0:bee4cc0bb747 46
ggaleote 0:bee4cc0bb747 47 int main()
ggaleote 0:bee4cc0bb747 48 {
ggaleote 0:bee4cc0bb747 49 int ret = 0;
ggaleote 0:bee4cc0bb747 50 led = 0;
ggaleote 0:bee4cc0bb747 51 pc.baud(115200);
ggaleote 0:bee4cc0bb747 52 printf("\n");
ggaleote 0:bee4cc0bb747 53 printf("************************************************************\n");
ggaleote 0:bee4cc0bb747 54 printf("*** STM32 IoT Discovery kit for STM32L475 MCU ***\n");
ggaleote 0:bee4cc0bb747 55 printf("*** WIFI Web Server demonstration ***\n\n");
ggaleote 0:bee4cc0bb747 56 printf("*** Copy the IP address on another device connected ***\n");
ggaleote 0:bee4cc0bb747 57 printf("*** to the wifi network ***\n");
ggaleote 0:bee4cc0bb747 58 printf("*** Read the temperature and update the LED status ***\n");
ggaleote 0:bee4cc0bb747 59 printf("************************************************************\n");
ggaleote 0:bee4cc0bb747 60
ggaleote 0:bee4cc0bb747 61 /* Working application */
ggaleote 0:bee4cc0bb747 62 ret = wifi_sample_run();
ggaleote 0:bee4cc0bb747 63
ggaleote 0:bee4cc0bb747 64 if (ret != 0) {
ggaleote 0:bee4cc0bb747 65 return -1;
ggaleote 0:bee4cc0bb747 66 }
ggaleote 0:bee4cc0bb747 67
ggaleote 0:bee4cc0bb747 68
ggaleote 0:bee4cc0bb747 69 while(1) {
ggaleote 0:bee4cc0bb747 70 WebServerProcess ();
ggaleote 0:bee4cc0bb747 71 }
ggaleote 0:bee4cc0bb747 72
ggaleote 0:bee4cc0bb747 73 }
ggaleote 0:bee4cc0bb747 74
ggaleote 0:bee4cc0bb747 75
ggaleote 0:bee4cc0bb747 76 int wifi_sample_run(void)
ggaleote 0:bee4cc0bb747 77 {
ggaleote 0:bee4cc0bb747 78
ggaleote 0:bee4cc0bb747 79 /*Initialize and use WIFI module */
ggaleote 0:bee4cc0bb747 80 if(WIFI_Init() == WIFI_STATUS_OK) {
ggaleote 0:bee4cc0bb747 81 printf("ES-WIFI Initialized.\n");
ggaleote 0:bee4cc0bb747 82
ggaleote 0:bee4cc0bb747 83 if(WIFI_GetMAC_Address(MAC_Addr) == WIFI_STATUS_OK) {
ggaleote 0:bee4cc0bb747 84 printf("> es-wifi module MAC Address : %X:%X:%X:%X:%X:%X\n",
ggaleote 0:bee4cc0bb747 85 MAC_Addr[0],
ggaleote 0:bee4cc0bb747 86 MAC_Addr[1],
ggaleote 0:bee4cc0bb747 87 MAC_Addr[2],
ggaleote 0:bee4cc0bb747 88 MAC_Addr[3],
ggaleote 0:bee4cc0bb747 89 MAC_Addr[4],
ggaleote 0:bee4cc0bb747 90 MAC_Addr[5]);
ggaleote 0:bee4cc0bb747 91 } else {
ggaleote 0:bee4cc0bb747 92 printf("> ERROR : CANNOT get MAC address\n");
ggaleote 0:bee4cc0bb747 93 }
ggaleote 0:bee4cc0bb747 94
ggaleote 0:bee4cc0bb747 95 if( WIFI_Connect(MBED_CONF_APP_WIFI_SSID, MBED_CONF_APP_WIFI_PASSWORD, WIFI_ECN_WPA2_PSK) == WIFI_STATUS_OK) {
ggaleote 0:bee4cc0bb747 96 printf("> es-wifi module connected \n");
ggaleote 0:bee4cc0bb747 97
ggaleote 0:bee4cc0bb747 98 if(WIFI_GetIP_Address(IP_Addr) == WIFI_STATUS_OK) {
ggaleote 0:bee4cc0bb747 99 printf("> es-wifi module got IP Address : %d.%d.%d.%d\n",
ggaleote 0:bee4cc0bb747 100 IP_Addr[0],
ggaleote 0:bee4cc0bb747 101 IP_Addr[1],
ggaleote 0:bee4cc0bb747 102 IP_Addr[2],
ggaleote 0:bee4cc0bb747 103 IP_Addr[3]);
ggaleote 0:bee4cc0bb747 104
ggaleote 0:bee4cc0bb747 105 printf(">Start HTTP Server... \n");
ggaleote 0:bee4cc0bb747 106 printf(">Wait for connection... \n");
ggaleote 0:bee4cc0bb747 107 State = WS_IDLE;
ggaleote 0:bee4cc0bb747 108 } else {
ggaleote 0:bee4cc0bb747 109 printf("> ERROR : es-wifi module CANNOT get IP address\n");
ggaleote 0:bee4cc0bb747 110 return -1;
ggaleote 0:bee4cc0bb747 111 }
ggaleote 0:bee4cc0bb747 112 } else {
ggaleote 0:bee4cc0bb747 113 printf("> ERROR : es-wifi module NOT connected\n");
ggaleote 0:bee4cc0bb747 114 return -1;
ggaleote 0:bee4cc0bb747 115 }
ggaleote 0:bee4cc0bb747 116 } else {
ggaleote 0:bee4cc0bb747 117 printf("> ERROR : WIFI Module cannot be initialized.\n");
ggaleote 0:bee4cc0bb747 118 return -1;
ggaleote 0:bee4cc0bb747 119 }
ggaleote 0:bee4cc0bb747 120 return 0;
ggaleote 0:bee4cc0bb747 121 }
ggaleote 0:bee4cc0bb747 122
ggaleote 0:bee4cc0bb747 123 /**
ggaleote 0:bee4cc0bb747 124 * @brief Send HTML page
ggaleote 0:bee4cc0bb747 125 * @param None
ggaleote 0:bee4cc0bb747 126 * @retval None
ggaleote 0:bee4cc0bb747 127 */
ggaleote 0:bee4cc0bb747 128 static void WebServerProcess(void)
ggaleote 0:bee4cc0bb747 129 {
ggaleote 0:bee4cc0bb747 130 uint8_t LedState = 0;
ggaleote 0:bee4cc0bb747 131 float temp;
ggaleote 0:bee4cc0bb747 132 switch(State)
ggaleote 0:bee4cc0bb747 133 {
ggaleote 0:bee4cc0bb747 134 case WS_IDLE:
ggaleote 0:bee4cc0bb747 135 Socket = 0;
ggaleote 0:bee4cc0bb747 136 WIFI_StartServer(Socket, WIFI_TCP_PROTOCOL, "", PORT);
ggaleote 0:bee4cc0bb747 137
ggaleote 0:bee4cc0bb747 138 if(Socket != -1)
ggaleote 0:bee4cc0bb747 139 {
ggaleote 0:bee4cc0bb747 140 printf("> HTTP Server Started \n");
ggaleote 0:bee4cc0bb747 141 State = WS_CONNECTED;
ggaleote 0:bee4cc0bb747 142 }
ggaleote 0:bee4cc0bb747 143 else
ggaleote 0:bee4cc0bb747 144 {
ggaleote 0:bee4cc0bb747 145 printf("> ERROR : Connection cannot be established.\n");
ggaleote 0:bee4cc0bb747 146 State = WS_ERROR;
ggaleote 0:bee4cc0bb747 147 }
ggaleote 0:bee4cc0bb747 148 break;
ggaleote 0:bee4cc0bb747 149
ggaleote 0:bee4cc0bb747 150 case WS_CONNECTED:
ggaleote 0:bee4cc0bb747 151
ggaleote 0:bee4cc0bb747 152 WIFI_ReceiveData(Socket, resp, 1200, &respLen, WIFI_READ_TIMEOUT);
ggaleote 0:bee4cc0bb747 153
ggaleote 0:bee4cc0bb747 154 if( respLen > 0)
ggaleote 0:bee4cc0bb747 155 {
ggaleote 0:bee4cc0bb747 156 if(strstr((char *)resp, "GET")) /* GET: put web page */
ggaleote 0:bee4cc0bb747 157 {
ggaleote 0:bee4cc0bb747 158 temp = (adc_temp.read()*100);
ggaleote 0:bee4cc0bb747 159 if(SendWebPage(LedState, temp) != WIFI_STATUS_OK)
ggaleote 0:bee4cc0bb747 160 {
ggaleote 0:bee4cc0bb747 161 printf("> ERROR : Cannot send web page\n");
ggaleote 0:bee4cc0bb747 162 State = WS_ERROR;
ggaleote 0:bee4cc0bb747 163 }
ggaleote 0:bee4cc0bb747 164 }
ggaleote 0:bee4cc0bb747 165 else if(strstr((char *)resp, "POST"))/* POST: received info */
ggaleote 0:bee4cc0bb747 166 {
ggaleote 0:bee4cc0bb747 167 if(strstr((char *)resp, "radio"))
ggaleote 0:bee4cc0bb747 168 {
ggaleote 0:bee4cc0bb747 169 if(strstr((char *)resp, "radio=0"))
ggaleote 0:bee4cc0bb747 170 {
ggaleote 0:bee4cc0bb747 171 LedState = 0;
ggaleote 0:bee4cc0bb747 172 led = 0;
ggaleote 0:bee4cc0bb747 173 }
ggaleote 0:bee4cc0bb747 174 else if(strstr((char *)resp, "radio=1"))
ggaleote 0:bee4cc0bb747 175 {
ggaleote 0:bee4cc0bb747 176 LedState = 1;
ggaleote 0:bee4cc0bb747 177 led = 1;
ggaleote 0:bee4cc0bb747 178 }
ggaleote 0:bee4cc0bb747 179
ggaleote 0:bee4cc0bb747 180 temp = (adc_temp.read()*100);
ggaleote 0:bee4cc0bb747 181 if(SendWebPage(LedState, temp) != WIFI_STATUS_OK)
ggaleote 0:bee4cc0bb747 182 {
ggaleote 0:bee4cc0bb747 183 printf("> ERROR : Cannot send web page\n");
ggaleote 0:bee4cc0bb747 184 State = WS_ERROR;
ggaleote 0:bee4cc0bb747 185 }
ggaleote 0:bee4cc0bb747 186 }
ggaleote 0:bee4cc0bb747 187 }
ggaleote 0:bee4cc0bb747 188 }
ggaleote 0:bee4cc0bb747 189 if(WIFI_StopServer(Socket) == WIFI_STATUS_OK)
ggaleote 0:bee4cc0bb747 190 {
ggaleote 0:bee4cc0bb747 191 WIFI_StartServer(Socket, WIFI_TCP_PROTOCOL, "", PORT);
ggaleote 0:bee4cc0bb747 192 }
ggaleote 0:bee4cc0bb747 193 else
ggaleote 0:bee4cc0bb747 194 {
ggaleote 0:bee4cc0bb747 195 State = WS_ERROR;
ggaleote 0:bee4cc0bb747 196 }
ggaleote 0:bee4cc0bb747 197 break;
ggaleote 0:bee4cc0bb747 198 case WS_ERROR:
ggaleote 0:bee4cc0bb747 199 default:
ggaleote 0:bee4cc0bb747 200 break;
ggaleote 0:bee4cc0bb747 201 }
ggaleote 0:bee4cc0bb747 202 }
ggaleote 0:bee4cc0bb747 203
ggaleote 0:bee4cc0bb747 204
ggaleote 0:bee4cc0bb747 205 /**
ggaleote 0:bee4cc0bb747 206 * @brief Send HTML page
ggaleote 0:bee4cc0bb747 207 * @param None
ggaleote 0:bee4cc0bb747 208 * @retval None
ggaleote 0:bee4cc0bb747 209 */
ggaleote 0:bee4cc0bb747 210 static WIFI_Status_t SendWebPage(uint8_t ledIsOn, float temperature)
ggaleote 0:bee4cc0bb747 211 {
ggaleote 0:bee4cc0bb747 212 uint8_t temp[50];
ggaleote 0:bee4cc0bb747 213 uint16_t SentDataLength;
ggaleote 0:bee4cc0bb747 214 WIFI_Status_t ret;
ggaleote 0:bee4cc0bb747 215
ggaleote 0:bee4cc0bb747 216 /* construct web page content */
ggaleote 0:bee4cc0bb747 217 strcpy((char *)http, (char *)"HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nPragma: no-cache\r\n\r\n");
ggaleote 0:bee4cc0bb747 218 strcat((char *)http, (char *)"<html>\r\n<body>\r\n");
ggaleote 0:bee4cc0bb747 219 strcat((char *)http, (char *)"<title>STM32 Web Server</title>\r\n");
ggaleote 0:bee4cc0bb747 220 strcat((char *)http, (char *)"<h2>InventekSys : Web Server using Es-Wifi with STM32</h2>\r\n");
ggaleote 0:bee4cc0bb747 221 strcat((char *)http, (char *)"<br /><hr>\r\n");
ggaleote 0:bee4cc0bb747 222 strcat((char *)http, (char *)"<p><form method=\"POST\"><strong>Temp: <input type=\"text\" size=2 value=\"");
ggaleote 0:bee4cc0bb747 223 sprintf((char *)temp, "%f", temperature);
ggaleote 0:bee4cc0bb747 224 strcat((char *)http, (char *)temp);
ggaleote 0:bee4cc0bb747 225 strcat((char *)http, (char *)"\"> <sup>O</sup>C");
ggaleote 0:bee4cc0bb747 226
ggaleote 0:bee4cc0bb747 227 if (ledIsOn)
ggaleote 0:bee4cc0bb747 228 {
ggaleote 0:bee4cc0bb747 229 strcat((char *)http, (char *)"<p><input type=\"radio\" name=\"radio\" value=\"0\" >LED off");
ggaleote 0:bee4cc0bb747 230 strcat((char *)http, (char *)"<br><input type=\"radio\" name=\"radio\" value=\"1\" checked>LED on");
ggaleote 0:bee4cc0bb747 231 }
ggaleote 0:bee4cc0bb747 232 else
ggaleote 0:bee4cc0bb747 233 {
ggaleote 0:bee4cc0bb747 234 strcat((char *)http, (char *)"<p><input type=\"radio\" name=\"radio\" value=\"0\" checked>LED off");
ggaleote 0:bee4cc0bb747 235 strcat((char *)http, (char *)"<br><input type=\"radio\" name=\"radio\" value=\"1\" >LED on");
ggaleote 0:bee4cc0bb747 236 }
ggaleote 0:bee4cc0bb747 237
ggaleote 0:bee4cc0bb747 238 strcat((char *)http, (char *)"</strong><p><input type=\"submit\"></form></span>");
ggaleote 0:bee4cc0bb747 239 strcat((char *)http, (char *)"</body>\r\n</html>\r\n");
ggaleote 0:bee4cc0bb747 240
ggaleote 0:bee4cc0bb747 241 ret = WIFI_SendData(0, (uint8_t *)http, strlen((char *)http), &SentDataLength, WIFI_WRITE_TIMEOUT);
ggaleote 0:bee4cc0bb747 242
ggaleote 0:bee4cc0bb747 243 if((ret == WIFI_STATUS_OK) && (SentDataLength != strlen((char *)http)))
ggaleote 0:bee4cc0bb747 244 {
ggaleote 0:bee4cc0bb747 245 ret = WIFI_STATUS_ERROR;
ggaleote 0:bee4cc0bb747 246 }
ggaleote 0:bee4cc0bb747 247
ggaleote 0:bee4cc0bb747 248 return ret;
ggaleote 0:bee4cc0bb747 249 }