grove_esp8266

Committer:
JackyZhangFromSeeed
Date:
Tue Jun 09 10:18:06 2015 +0000
Revision:
0:0ac7892e440f
grove_esp8266

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JackyZhangFromSeeed 0:0ac7892e440f 1
JackyZhangFromSeeed 0:0ac7892e440f 2
JackyZhangFromSeeed 0:0ac7892e440f 3 #include "suli2.h"
JackyZhangFromSeeed 0:0ac7892e440f 4 #include "grove_esp8266.h"
JackyZhangFromSeeed 0:0ac7892e440f 5
JackyZhangFromSeeed 0:0ac7892e440f 6
JackyZhangFromSeeed 0:0ac7892e440f 7
JackyZhangFromSeeed 0:0ac7892e440f 8 //local functions
JackyZhangFromSeeed 0:0ac7892e440f 9 static void _uart_rx_callback(void);
JackyZhangFromSeeed 0:0ac7892e440f 10 static bool esp8266_send_cmd(UART_T *uart, char *command, char *content, unsigned int timeout);
JackyZhangFromSeeed 0:0ac7892e440f 11 __weak static void esp8266_callback(char *msg, unsigned int len);
JackyZhangFromSeeed 0:0ac7892e440f 12
JackyZhangFromSeeed 0:0ac7892e440f 13
JackyZhangFromSeeed 0:0ac7892e440f 14 //local variables
JackyZhangFromSeeed 0:0ac7892e440f 15 static char content_buffer[CONTENT_BUF_LEN];
JackyZhangFromSeeed 0:0ac7892e440f 16 static char rx_buf[RX_BUF_LEN];
JackyZhangFromSeeed 0:0ac7892e440f 17 static unsigned int rx_buf_ptr = 0;//point to the next unused char of rx_buf
JackyZhangFromSeeed 0:0ac7892e440f 18 static char cmd[70];
JackyZhangFromSeeed 0:0ac7892e440f 19 static char cmd_buf[70];
JackyZhangFromSeeed 0:0ac7892e440f 20 static char *WaitForAnswer_cmd_Buffer;
JackyZhangFromSeeed 0:0ac7892e440f 21 static char *WaitForAnswer_ans_Buffer;
JackyZhangFromSeeed 0:0ac7892e440f 22 static char *WaitForAnswer_data_Buffer;
JackyZhangFromSeeed 0:0ac7892e440f 23 static ESP8266_RecvStateMachine recv_machine = RECV_DATA;
JackyZhangFromSeeed 0:0ac7892e440f 24 static bool flag_recved_cmd = false;
JackyZhangFromSeeed 0:0ac7892e440f 25 static bool flag_recved_end = false;
JackyZhangFromSeeed 0:0ac7892e440f 26 static bool flag_send_ok = false;
JackyZhangFromSeeed 0:0ac7892e440f 27
JackyZhangFromSeeed 0:0ac7892e440f 28 static UART_T *_uart;
JackyZhangFromSeeed 0:0ac7892e440f 29 static user_cb_fun_ptr user_cb_fun;
JackyZhangFromSeeed 0:0ac7892e440f 30 EVENT_T event_esp8266;
JackyZhangFromSeeed 0:0ac7892e440f 31
JackyZhangFromSeeed 0:0ac7892e440f 32 void grove_esp8266_init(UART_T *uart, int pintx, int pinrx)
JackyZhangFromSeeed 0:0ac7892e440f 33 {
JackyZhangFromSeeed 0:0ac7892e440f 34 suli_uart_init(uart, pintx, pinrx, 115200);
JackyZhangFromSeeed 0:0ac7892e440f 35 }
JackyZhangFromSeeed 0:0ac7892e440f 36
JackyZhangFromSeeed 0:0ac7892e440f 37 bool grove_esp8266_write_setup(UART_T *uart)
JackyZhangFromSeeed 0:0ac7892e440f 38 {
JackyZhangFromSeeed 0:0ac7892e440f 39 memset((void *)rx_buf, 0, RX_BUF_LEN);
JackyZhangFromSeeed 0:0ac7892e440f 40 memset((void *)content_buffer, 0, CONTENT_BUF_LEN);
JackyZhangFromSeeed 0:0ac7892e440f 41 _uart = uart;
JackyZhangFromSeeed 0:0ac7892e440f 42 suli_uart_rx_event_attach(uart, (cb_fun_ptr)&_uart_rx_callback);
JackyZhangFromSeeed 0:0ac7892e440f 43 grove_esp8266_write_setcbfun(esp8266_callback);
JackyZhangFromSeeed 0:0ac7892e440f 44
JackyZhangFromSeeed 0:0ac7892e440f 45 return true;
JackyZhangFromSeeed 0:0ac7892e440f 46 }
JackyZhangFromSeeed 0:0ac7892e440f 47
JackyZhangFromSeeed 0:0ac7892e440f 48 void grove_esp8266_write_setcbfun(user_cb_fun_ptr fun)
JackyZhangFromSeeed 0:0ac7892e440f 49 {
JackyZhangFromSeeed 0:0ac7892e440f 50 user_cb_fun = fun;
JackyZhangFromSeeed 0:0ac7892e440f 51 }
JackyZhangFromSeeed 0:0ac7892e440f 52
JackyZhangFromSeeed 0:0ac7892e440f 53 bool grove_esp8266_attach_event_handler(CALLBACK_T handler)
JackyZhangFromSeeed 0:0ac7892e440f 54 {
JackyZhangFromSeeed 0:0ac7892e440f 55 suli_event_init(&event_esp8266, handler);
JackyZhangFromSeeed 0:0ac7892e440f 56 // pinMode(13, INPUT_PULLUP);
JackyZhangFromSeeed 0:0ac7892e440f 57 // attachInterrupt(13, _trigger, FALLING);
JackyZhangFromSeeed 0:0ac7892e440f 58 return true;
JackyZhangFromSeeed 0:0ac7892e440f 59 }
JackyZhangFromSeeed 0:0ac7892e440f 60
JackyZhangFromSeeed 0:0ac7892e440f 61 ////////////////////////////////////////////////////////////////////////////////////////////////////////////
JackyZhangFromSeeed 0:0ac7892e440f 62 bool grove_esp8266_read_getversion(UART_T *uart)
JackyZhangFromSeeed 0:0ac7892e440f 63 {
JackyZhangFromSeeed 0:0ac7892e440f 64 //read version information
JackyZhangFromSeeed 0:0ac7892e440f 65 while(esp8266_send_cmd(uart, (char*)"AT+GMR", content_buffer, 200) != true)
JackyZhangFromSeeed 0:0ac7892e440f 66 {
JackyZhangFromSeeed 0:0ac7892e440f 67 printf("try again\r\n");
JackyZhangFromSeeed 0:0ac7892e440f 68 wait(0.5);
JackyZhangFromSeeed 0:0ac7892e440f 69 }
JackyZhangFromSeeed 0:0ac7892e440f 70 printf("Version: %s\r\n", content_buffer);
JackyZhangFromSeeed 0:0ac7892e440f 71
JackyZhangFromSeeed 0:0ac7892e440f 72 return true;
JackyZhangFromSeeed 0:0ac7892e440f 73 }
JackyZhangFromSeeed 0:0ac7892e440f 74
JackyZhangFromSeeed 0:0ac7892e440f 75 bool grove_esp8266_write_joinwifi(UART_T *uart, char *ssid, char *pwd)
JackyZhangFromSeeed 0:0ac7892e440f 76 {
JackyZhangFromSeeed 0:0ac7892e440f 77 //set to station mode
JackyZhangFromSeeed 0:0ac7892e440f 78 printf("set mode to STATION\r\n");
JackyZhangFromSeeed 0:0ac7892e440f 79 wait(0.1);
JackyZhangFromSeeed 0:0ac7892e440f 80 while(esp8266_send_cmd(uart, (char*)"AT+CWMODE=1", content_buffer, 200) != true)
JackyZhangFromSeeed 0:0ac7892e440f 81 {
JackyZhangFromSeeed 0:0ac7892e440f 82 printf("try again\r\n");
JackyZhangFromSeeed 0:0ac7892e440f 83 wait(0.5);
JackyZhangFromSeeed 0:0ac7892e440f 84 }
JackyZhangFromSeeed 0:0ac7892e440f 85 printf("OK\r\n\r\n");
JackyZhangFromSeeed 0:0ac7892e440f 86
JackyZhangFromSeeed 0:0ac7892e440f 87 //join router
JackyZhangFromSeeed 0:0ac7892e440f 88 printf("joining specified router\r\n");
JackyZhangFromSeeed 0:0ac7892e440f 89 wait(0.1);
JackyZhangFromSeeed 0:0ac7892e440f 90 while(esp8266_send_cmd(uart, (char*)"AT+CWJAP=\"stu.se.private\",\"depot0510se\"", content_buffer, 5000) != true)
JackyZhangFromSeeed 0:0ac7892e440f 91 {
JackyZhangFromSeeed 0:0ac7892e440f 92 printf("try again\r\n");
JackyZhangFromSeeed 0:0ac7892e440f 93 wait(0.5);
JackyZhangFromSeeed 0:0ac7892e440f 94 }
JackyZhangFromSeeed 0:0ac7892e440f 95 printf("joined\r\n");
JackyZhangFromSeeed 0:0ac7892e440f 96 wait(0.1);
JackyZhangFromSeeed 0:0ac7892e440f 97 while(esp8266_send_cmd(uart, (char*)"AT+CWJAP?", content_buffer, 1000) != true)
JackyZhangFromSeeed 0:0ac7892e440f 98 {
JackyZhangFromSeeed 0:0ac7892e440f 99 printf("try again\r\n");
JackyZhangFromSeeed 0:0ac7892e440f 100 wait(0.5);
JackyZhangFromSeeed 0:0ac7892e440f 101 }
JackyZhangFromSeeed 0:0ac7892e440f 102 printf("joined indeed\r\n\r\n");
JackyZhangFromSeeed 0:0ac7892e440f 103
JackyZhangFromSeeed 0:0ac7892e440f 104 return true;
JackyZhangFromSeeed 0:0ac7892e440f 105 }
JackyZhangFromSeeed 0:0ac7892e440f 106
JackyZhangFromSeeed 0:0ac7892e440f 107 bool grove_esp8266_write_socketasclient(UART_T *uart, char *ip, unsigned int port)
JackyZhangFromSeeed 0:0ac7892e440f 108 {
JackyZhangFromSeeed 0:0ac7892e440f 109 //enable mux connection
JackyZhangFromSeeed 0:0ac7892e440f 110 printf("enable mux connection\r\n");
JackyZhangFromSeeed 0:0ac7892e440f 111 wait(0.1);
JackyZhangFromSeeed 0:0ac7892e440f 112 while(esp8266_send_cmd(uart, (char*)"AT+CIPMUX=1", content_buffer, 200) != true)
JackyZhangFromSeeed 0:0ac7892e440f 113 {
JackyZhangFromSeeed 0:0ac7892e440f 114 printf("try again\r\n");
JackyZhangFromSeeed 0:0ac7892e440f 115 wait(0.5);
JackyZhangFromSeeed 0:0ac7892e440f 116 }
JackyZhangFromSeeed 0:0ac7892e440f 117 printf("OK\r\n\r\n");
JackyZhangFromSeeed 0:0ac7892e440f 118
JackyZhangFromSeeed 0:0ac7892e440f 119 //connect to tcp server
JackyZhangFromSeeed 0:0ac7892e440f 120 printf("connect to tcp server\r\n");
JackyZhangFromSeeed 0:0ac7892e440f 121 wait(0.1);
JackyZhangFromSeeed 0:0ac7892e440f 122 while(esp8266_send_cmd(uart, (char*)"AT+CIPSTART=4,\"TCP\",\"192.168.21.159\",6320", content_buffer, 2000) != true)
JackyZhangFromSeeed 0:0ac7892e440f 123 {
JackyZhangFromSeeed 0:0ac7892e440f 124 printf("try again\r\n");
JackyZhangFromSeeed 0:0ac7892e440f 125 wait(0.5);
JackyZhangFromSeeed 0:0ac7892e440f 126 }
JackyZhangFromSeeed 0:0ac7892e440f 127 printf("OK\r\n\r\n");
JackyZhangFromSeeed 0:0ac7892e440f 128
JackyZhangFromSeeed 0:0ac7892e440f 129 return true;
JackyZhangFromSeeed 0:0ac7892e440f 130 }
JackyZhangFromSeeed 0:0ac7892e440f 131
JackyZhangFromSeeed 0:0ac7892e440f 132 bool grove_esp8266_read_aplist(UART_T *uart)
JackyZhangFromSeeed 0:0ac7892e440f 133 {
JackyZhangFromSeeed 0:0ac7892e440f 134 //list all AP
JackyZhangFromSeeed 0:0ac7892e440f 135 printf("list all AP around\r\n");
JackyZhangFromSeeed 0:0ac7892e440f 136 wait(0.1);
JackyZhangFromSeeed 0:0ac7892e440f 137 while(esp8266_send_cmd(uart, (char*)"AT+CWLAP", content_buffer, 10000) != true)
JackyZhangFromSeeed 0:0ac7892e440f 138 {
JackyZhangFromSeeed 0:0ac7892e440f 139 printf("try again\r\n");
JackyZhangFromSeeed 0:0ac7892e440f 140 wait(0.5);
JackyZhangFromSeeed 0:0ac7892e440f 141 }
JackyZhangFromSeeed 0:0ac7892e440f 142 printf("%s\r\n", content_buffer);
JackyZhangFromSeeed 0:0ac7892e440f 143
JackyZhangFromSeeed 0:0ac7892e440f 144 return true;
JackyZhangFromSeeed 0:0ac7892e440f 145 }
JackyZhangFromSeeed 0:0ac7892e440f 146
JackyZhangFromSeeed 0:0ac7892e440f 147 /*
JackyZhangFromSeeed 0:0ac7892e440f 148 function: internal function, uart callback
JackyZhangFromSeeed 0:0ac7892e440f 149 */
JackyZhangFromSeeed 0:0ac7892e440f 150 static void _uart_rx_callback(void)
JackyZhangFromSeeed 0:0ac7892e440f 151 {
JackyZhangFromSeeed 0:0ac7892e440f 152 unsigned int payload_len, header_len;
JackyZhangFromSeeed 0:0ac7892e440f 153 unsigned int port;
JackyZhangFromSeeed 0:0ac7892e440f 154 int res;
JackyZhangFromSeeed 0:0ac7892e440f 155 char *payload_str;
JackyZhangFromSeeed 0:0ac7892e440f 156
JackyZhangFromSeeed 0:0ac7892e440f 157 while(suli_uart_readable(_uart))
JackyZhangFromSeeed 0:0ac7892e440f 158 {
JackyZhangFromSeeed 0:0ac7892e440f 159 if(rx_buf_ptr < RX_BUF_LEN - 2)
JackyZhangFromSeeed 0:0ac7892e440f 160 {
JackyZhangFromSeeed 0:0ac7892e440f 161 rx_buf[rx_buf_ptr++] = suli_uart_read(_uart);
JackyZhangFromSeeed 0:0ac7892e440f 162 }
JackyZhangFromSeeed 0:0ac7892e440f 163 }
JackyZhangFromSeeed 0:0ac7892e440f 164 //receiving state machine after recved all data for now
JackyZhangFromSeeed 0:0ac7892e440f 165 switch(recv_machine)
JackyZhangFromSeeed 0:0ac7892e440f 166 {
JackyZhangFromSeeed 0:0ac7892e440f 167 case RECV_DATA:
JackyZhangFromSeeed 0:0ac7892e440f 168 WaitForAnswer_data_Buffer = strstr(rx_buf, "\r\n+IPD");//check the "+IPD" response
JackyZhangFromSeeed 0:0ac7892e440f 169 if(WaitForAnswer_data_Buffer != NULL)//user data recved
JackyZhangFromSeeed 0:0ac7892e440f 170 {
JackyZhangFromSeeed 0:0ac7892e440f 171 res = sscanf(rx_buf,"\r\n+IPD,%d,%d:", &port, &payload_len);
JackyZhangFromSeeed 0:0ac7892e440f 172 payload_str = strtok(rx_buf, ":");
JackyZhangFromSeeed 0:0ac7892e440f 173 header_len = strlen(payload_str) + 1;
JackyZhangFromSeeed 0:0ac7892e440f 174 if((res == 2) && (payload_len == rx_buf_ptr - header_len))
JackyZhangFromSeeed 0:0ac7892e440f 175 {
JackyZhangFromSeeed 0:0ac7892e440f 176 memcpy(content_buffer, rx_buf + header_len, payload_len);
JackyZhangFromSeeed 0:0ac7892e440f 177 user_cb_fun(content_buffer, payload_len);
JackyZhangFromSeeed 0:0ac7892e440f 178 memset(rx_buf, 0, rx_buf_ptr);//clear the buffer for next recv
JackyZhangFromSeeed 0:0ac7892e440f 179 rx_buf_ptr = 0;
JackyZhangFromSeeed 0:0ac7892e440f 180 }
JackyZhangFromSeeed 0:0ac7892e440f 181 }
JackyZhangFromSeeed 0:0ac7892e440f 182 break;
JackyZhangFromSeeed 0:0ac7892e440f 183 case RECV_CMD:
JackyZhangFromSeeed 0:0ac7892e440f 184 WaitForAnswer_cmd_Buffer = strstr(rx_buf, cmd_buf);//check the cmd
JackyZhangFromSeeed 0:0ac7892e440f 185 if(WaitForAnswer_cmd_Buffer != NULL)//right cmd
JackyZhangFromSeeed 0:0ac7892e440f 186 {
JackyZhangFromSeeed 0:0ac7892e440f 187 flag_recved_cmd = true;
JackyZhangFromSeeed 0:0ac7892e440f 188 recv_machine = RECV_END;
JackyZhangFromSeeed 0:0ac7892e440f 189 }
JackyZhangFromSeeed 0:0ac7892e440f 190 break;
JackyZhangFromSeeed 0:0ac7892e440f 191 case RECV_END:
JackyZhangFromSeeed 0:0ac7892e440f 192 //check the "OK" response
JackyZhangFromSeeed 0:0ac7892e440f 193 WaitForAnswer_ans_Buffer = strstr(WaitForAnswer_cmd_Buffer, "\r\nOK\r\n");
JackyZhangFromSeeed 0:0ac7892e440f 194 if(WaitForAnswer_ans_Buffer != NULL)//"OK"recved
JackyZhangFromSeeed 0:0ac7892e440f 195 {
JackyZhangFromSeeed 0:0ac7892e440f 196 //recv cmd response
JackyZhangFromSeeed 0:0ac7892e440f 197 flag_recved_end = true;
JackyZhangFromSeeed 0:0ac7892e440f 198 }
JackyZhangFromSeeed 0:0ac7892e440f 199 //check the "ERROR" response
JackyZhangFromSeeed 0:0ac7892e440f 200 WaitForAnswer_ans_Buffer = strstr(WaitForAnswer_cmd_Buffer, "\r\nERROR\r\n");
JackyZhangFromSeeed 0:0ac7892e440f 201 if(WaitForAnswer_ans_Buffer != NULL)//"ERROR"recved
JackyZhangFromSeeed 0:0ac7892e440f 202 {
JackyZhangFromSeeed 0:0ac7892e440f 203 flag_recved_end = true;
JackyZhangFromSeeed 0:0ac7892e440f 204 }
JackyZhangFromSeeed 0:0ac7892e440f 205 //check the "SEND OK" response
JackyZhangFromSeeed 0:0ac7892e440f 206 WaitForAnswer_ans_Buffer = strstr(WaitForAnswer_cmd_Buffer, "\r\nSEND OK\r\n");
JackyZhangFromSeeed 0:0ac7892e440f 207 if(WaitForAnswer_ans_Buffer != NULL)//"SEND OK"recved
JackyZhangFromSeeed 0:0ac7892e440f 208 {
JackyZhangFromSeeed 0:0ac7892e440f 209 flag_send_ok = true;
JackyZhangFromSeeed 0:0ac7892e440f 210 }
JackyZhangFromSeeed 0:0ac7892e440f 211 break;
JackyZhangFromSeeed 0:0ac7892e440f 212 default:
JackyZhangFromSeeed 0:0ac7892e440f 213 break;
JackyZhangFromSeeed 0:0ac7892e440f 214 }
JackyZhangFromSeeed 0:0ac7892e440f 215 }
JackyZhangFromSeeed 0:0ac7892e440f 216
JackyZhangFromSeeed 0:0ac7892e440f 217 /*
JackyZhangFromSeeed 0:0ac7892e440f 218 function: send data through ESP8266
JackyZhangFromSeeed 0:0ac7892e440f 219 const char *command: AT command to be send
JackyZhangFromSeeed 0:0ac7892e440f 220 char *content: returned data from ESP8266
JackyZhangFromSeeed 0:0ac7892e440f 221 unsigned int timeout: timeout
JackyZhangFromSeeed 0:0ac7892e440f 222 */
JackyZhangFromSeeed 0:0ac7892e440f 223 static bool esp8266_send_cmd(UART_T *uart, char *command, char *content, unsigned int timeout)
JackyZhangFromSeeed 0:0ac7892e440f 224 {
JackyZhangFromSeeed 0:0ac7892e440f 225 volatile uint32_t TxWaitForResponse_TimeStmp;
JackyZhangFromSeeed 0:0ac7892e440f 226 unsigned int len;
JackyZhangFromSeeed 0:0ac7892e440f 227
JackyZhangFromSeeed 0:0ac7892e440f 228 //reset flags and state machine
JackyZhangFromSeeed 0:0ac7892e440f 229 recv_machine = RECV_CMD;
JackyZhangFromSeeed 0:0ac7892e440f 230 flag_recved_cmd = false;
JackyZhangFromSeeed 0:0ac7892e440f 231 flag_recved_end = false;
JackyZhangFromSeeed 0:0ac7892e440f 232 //clear the buffer
JackyZhangFromSeeed 0:0ac7892e440f 233 memset(rx_buf, 0, rx_buf_ptr);//clear the buffer for next recv
JackyZhangFromSeeed 0:0ac7892e440f 234 rx_buf_ptr = 0;
JackyZhangFromSeeed 0:0ac7892e440f 235 //save the cmd just sent
JackyZhangFromSeeed 0:0ac7892e440f 236 strcpy(cmd_buf, command);
JackyZhangFromSeeed 0:0ac7892e440f 237 sprintf(cmd, "%s\r\n", command);
JackyZhangFromSeeed 0:0ac7892e440f 238 //send cmd
JackyZhangFromSeeed 0:0ac7892e440f 239 suli_uart_write_bytes(_uart, (uint8_t*)cmd, strlen(cmd));
JackyZhangFromSeeed 0:0ac7892e440f 240
JackyZhangFromSeeed 0:0ac7892e440f 241 //wait for response
JackyZhangFromSeeed 0:0ac7892e440f 242 TxWaitForResponse_TimeStmp = millis();
JackyZhangFromSeeed 0:0ac7892e440f 243 while(millis() - TxWaitForResponse_TimeStmp < timeout)//timeout control
JackyZhangFromSeeed 0:0ac7892e440f 244 {
JackyZhangFromSeeed 0:0ac7892e440f 245 if(flag_recved_cmd == true)
JackyZhangFromSeeed 0:0ac7892e440f 246 {
JackyZhangFromSeeed 0:0ac7892e440f 247 if(flag_recved_end == true)
JackyZhangFromSeeed 0:0ac7892e440f 248 {
JackyZhangFromSeeed 0:0ac7892e440f 249 WaitForAnswer_ans_Buffer = strstr(WaitForAnswer_cmd_Buffer, "\r\nOK\r\n");//check the "OK" response
JackyZhangFromSeeed 0:0ac7892e440f 250 if(WaitForAnswer_ans_Buffer != NULL)
JackyZhangFromSeeed 0:0ac7892e440f 251 {
JackyZhangFromSeeed 0:0ac7892e440f 252 len = WaitForAnswer_ans_Buffer - WaitForAnswer_cmd_Buffer - strlen(cmd_buf) - 3;
JackyZhangFromSeeed 0:0ac7892e440f 253 memset(content, 0, CONTENT_BUF_LEN);
JackyZhangFromSeeed 0:0ac7892e440f 254 memcpy(content, WaitForAnswer_ans_Buffer - len, len);
JackyZhangFromSeeed 0:0ac7892e440f 255 memset(rx_buf, 0, rx_buf_ptr);//clear the buffer for next recv
JackyZhangFromSeeed 0:0ac7892e440f 256 rx_buf_ptr = 0;
JackyZhangFromSeeed 0:0ac7892e440f 257 recv_machine = RECV_DATA;
JackyZhangFromSeeed 0:0ac7892e440f 258 return true;
JackyZhangFromSeeed 0:0ac7892e440f 259 }
JackyZhangFromSeeed 0:0ac7892e440f 260 }
JackyZhangFromSeeed 0:0ac7892e440f 261 }
JackyZhangFromSeeed 0:0ac7892e440f 262 wait(0.1);
JackyZhangFromSeeed 0:0ac7892e440f 263 }
JackyZhangFromSeeed 0:0ac7892e440f 264 memset(rx_buf, 0, rx_buf_ptr);//clear the buffer for next recv
JackyZhangFromSeeed 0:0ac7892e440f 265 rx_buf_ptr = 0;
JackyZhangFromSeeed 0:0ac7892e440f 266 recv_machine = RECV_DATA;
JackyZhangFromSeeed 0:0ac7892e440f 267 return false;
JackyZhangFromSeeed 0:0ac7892e440f 268 }
JackyZhangFromSeeed 0:0ac7892e440f 269
JackyZhangFromSeeed 0:0ac7892e440f 270 /*
JackyZhangFromSeeed 0:0ac7892e440f 271 function: send data through ESP8266
JackyZhangFromSeeed 0:0ac7892e440f 272 char *data: data will be send
JackyZhangFromSeeed 0:0ac7892e440f 273 unsigned int len: data length in byte
JackyZhangFromSeeed 0:0ac7892e440f 274 */
JackyZhangFromSeeed 0:0ac7892e440f 275 bool grove_esp8266_write_msg(UART_T *uart, char *msg, unsigned int len)
JackyZhangFromSeeed 0:0ac7892e440f 276 {
JackyZhangFromSeeed 0:0ac7892e440f 277 volatile uint32_t TxWaitForResponse_TimeStmp;
JackyZhangFromSeeed 0:0ac7892e440f 278 unsigned ptr = 0;
JackyZhangFromSeeed 0:0ac7892e440f 279
JackyZhangFromSeeed 0:0ac7892e440f 280 if(len > 2048)
JackyZhangFromSeeed 0:0ac7892e440f 281 return false;
JackyZhangFromSeeed 0:0ac7892e440f 282
JackyZhangFromSeeed 0:0ac7892e440f 283 //send cmd
JackyZhangFromSeeed 0:0ac7892e440f 284 sprintf(cmd, "AT+CIPSEND=4,%d", len);
JackyZhangFromSeeed 0:0ac7892e440f 285 if(esp8266_send_cmd(uart, cmd, content_buffer, 200) != true)
JackyZhangFromSeeed 0:0ac7892e440f 286 {
JackyZhangFromSeeed 0:0ac7892e440f 287 return false;
JackyZhangFromSeeed 0:0ac7892e440f 288 }
JackyZhangFromSeeed 0:0ac7892e440f 289 //send user data
JackyZhangFromSeeed 0:0ac7892e440f 290 while(len--)
JackyZhangFromSeeed 0:0ac7892e440f 291 {
JackyZhangFromSeeed 0:0ac7892e440f 292 suli_uart_write(uart, msg[ptr++]);
JackyZhangFromSeeed 0:0ac7892e440f 293 }
JackyZhangFromSeeed 0:0ac7892e440f 294
JackyZhangFromSeeed 0:0ac7892e440f 295 //reset flags and state machine
JackyZhangFromSeeed 0:0ac7892e440f 296 recv_machine = RECV_END;
JackyZhangFromSeeed 0:0ac7892e440f 297 flag_recved_cmd = false;
JackyZhangFromSeeed 0:0ac7892e440f 298 flag_recved_end = false;
JackyZhangFromSeeed 0:0ac7892e440f 299 flag_send_ok = false;
JackyZhangFromSeeed 0:0ac7892e440f 300
JackyZhangFromSeeed 0:0ac7892e440f 301 //wait for response
JackyZhangFromSeeed 0:0ac7892e440f 302 TxWaitForResponse_TimeStmp = millis();
JackyZhangFromSeeed 0:0ac7892e440f 303 while(millis() - TxWaitForResponse_TimeStmp < 500)//timeout control
JackyZhangFromSeeed 0:0ac7892e440f 304 {
JackyZhangFromSeeed 0:0ac7892e440f 305 if(flag_send_ok == true)
JackyZhangFromSeeed 0:0ac7892e440f 306 {
JackyZhangFromSeeed 0:0ac7892e440f 307 memset(rx_buf, 0, rx_buf_ptr);//clear the buffer for next recv
JackyZhangFromSeeed 0:0ac7892e440f 308 rx_buf_ptr = 0;
JackyZhangFromSeeed 0:0ac7892e440f 309 recv_machine = RECV_DATA;
JackyZhangFromSeeed 0:0ac7892e440f 310 return true;
JackyZhangFromSeeed 0:0ac7892e440f 311 }
JackyZhangFromSeeed 0:0ac7892e440f 312 wait(0.01);
JackyZhangFromSeeed 0:0ac7892e440f 313 }
JackyZhangFromSeeed 0:0ac7892e440f 314 memset(rx_buf, 0, rx_buf_ptr);//clear the buffer for next recv
JackyZhangFromSeeed 0:0ac7892e440f 315 rx_buf_ptr = 0;
JackyZhangFromSeeed 0:0ac7892e440f 316 recv_machine = RECV_DATA;
JackyZhangFromSeeed 0:0ac7892e440f 317 return false;
JackyZhangFromSeeed 0:0ac7892e440f 318 }
JackyZhangFromSeeed 0:0ac7892e440f 319
JackyZhangFromSeeed 0:0ac7892e440f 320 /*
JackyZhangFromSeeed 0:0ac7892e440f 321 callback function when a piece of message arrived
JackyZhangFromSeeed 0:0ac7892e440f 322 this is a WEAK declaration
JackyZhangFromSeeed 0:0ac7892e440f 323 */
JackyZhangFromSeeed 0:0ac7892e440f 324 __weak static void esp8266_callback(char *msg, unsigned int len)
JackyZhangFromSeeed 0:0ac7892e440f 325 {
JackyZhangFromSeeed 0:0ac7892e440f 326 msg[len] = '\0';
JackyZhangFromSeeed 0:0ac7892e440f 327 printf("esp8266 driver recv%3d bytes: %s\r\n", len, msg);
JackyZhangFromSeeed 0:0ac7892e440f 328 printf("user can add his own callback function instead\r\n");
JackyZhangFromSeeed 0:0ac7892e440f 329 }
JackyZhangFromSeeed 0:0ac7892e440f 330
JackyZhangFromSeeed 0:0ac7892e440f 331
JackyZhangFromSeeed 0:0ac7892e440f 332
JackyZhangFromSeeed 0:0ac7892e440f 333
JackyZhangFromSeeed 0:0ac7892e440f 334
JackyZhangFromSeeed 0:0ac7892e440f 335
JackyZhangFromSeeed 0:0ac7892e440f 336
JackyZhangFromSeeed 0:0ac7892e440f 337
JackyZhangFromSeeed 0:0ac7892e440f 338
JackyZhangFromSeeed 0:0ac7892e440f 339
JackyZhangFromSeeed 0:0ac7892e440f 340
JackyZhangFromSeeed 0:0ac7892e440f 341
JackyZhangFromSeeed 0:0ac7892e440f 342
JackyZhangFromSeeed 0:0ac7892e440f 343
JackyZhangFromSeeed 0:0ac7892e440f 344
JackyZhangFromSeeed 0:0ac7892e440f 345
JackyZhangFromSeeed 0:0ac7892e440f 346