grove_esp8266
grove_esp8266.cpp@0:0ac7892e440f, 2015-06-09 (annotated)
- Committer:
- JackyZhangFromSeeed
- Date:
- Tue Jun 09 10:18:06 2015 +0000
- Revision:
- 0:0ac7892e440f
grove_esp8266
Who changed what in which revision?
User | Revision | Line number | New 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 |