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