keyboard input, serial com test

Dependencies:   mbed DISCO_L475VG_IOT01A_wifi TextLCD USBHost

Committer:
duchonic
Date:
Thu Aug 15 19:33:04 2019 +0000
Revision:
6:9d975a9d2728
first

Who changed what in which revision?

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