aboutsummaryrefslogtreecommitdiff
path: root/stm32f091/server.h
diff options
context:
space:
mode:
Diffstat (limited to 'stm32f091/server.h')
-rw-r--r--stm32f091/server.h65
1 files changed, 40 insertions, 25 deletions
diff --git a/stm32f091/server.h b/stm32f091/server.h
index 07c49d9..ba92b78 100644
--- a/stm32f091/server.h
+++ b/stm32f091/server.h
@@ -4,6 +4,7 @@
#include <stdint.h>
#include <stdbool.h>
+/** @brief store kind of AT command response the server is expecting */
typedef enum {
WS_SERVER_LM_CMD_ECHO, /** @brief listen for echo of sent command */
WS_SERVER_LM_STATUS_CODE, /** @brief listen for busy, ERROR or OK */
@@ -12,39 +13,43 @@ typedef enum {
WS_SERVER_LM_CIPSEND_LISTENING, /** @brief AT+CIPSEND sent, now reading data */
} ws_e_server_listen_mode;
+/** @brief state machine for parsing +IPD command fields */
typedef enum {
WS_SERVER_CL_CHANNEL_ID, /** @brief listen channel id */
WS_SERVER_CL_DATA_LENGTH, /** @brief listen for data byte length */
WS_SERVER_CL_DATA_READ, /** @brief listen for data and pipe to ws_protocol_parse_req_byte */
} ws_e_channel_listen_mode;
+/** @brief AT command status codes */
typedef enum {
- WS_SERVER_RC_NONE = -1,
- WS_SERVER_RC_BUSY,
- WS_SERVER_RC_ERR,
- WS_SERVER_RC_OK,
+ WS_SERVER_RC_NONE = -1, /** @brief initial value */
+ WS_SERVER_RC_BUSY, /** @brief status code busy p... */
+ WS_SERVER_RC_ERR, /** @brief status code ERROR */
+ WS_SERVER_RC_OK, /** @brief status code OK */
} ws_e_server_response_code;
+/** @brief counters for byte-by-byte string comparison of AT response codes */
typedef struct {
- uint8_t s_ok; /** @brief status code OK */
- uint8_t s_error; /** @brief status code OK */
- uint8_t s_fail; /** @brief status code OK */
- uint8_t s_busy; /** @brief status code OK */
- uint8_t i_ipd; /** @brief idle +IPD, */
- uint8_t i_prompt; /** @brief idle > */
- uint8_t l_send_ok; /** @brief ipd listen SEND OK */
- uint8_t l_error; /** @brief ipd listen ERROR */
+ uint8_t s_ok; /** @brief counter for status code OK */
+ uint8_t s_error; /** @brief counter for status code OK */
+ uint8_t s_fail; /** @brief counter for status code OK */
+ uint8_t s_busy; /** @brief counter for status code OK */
+ uint8_t i_ipd; /** @brief counter for idle +IPD, */
+ uint8_t i_prompt; /** @brief counter for idle > */
+ uint8_t l_send_ok; /** @brief counter for ipd listen SEND OK */
+ uint8_t l_error; /** @brief counter for ipd listen ERROR */
} ws_s_server_parser_response_counter;
+/** @brief server parser statue struct */
typedef struct {
- ws_e_server_listen_mode mode;
- ws_e_server_response_code last_response;
- unsigned int current_channel;
- unsigned int channel_data_length;
- unsigned int channel_data_counter;
- ws_e_channel_listen_mode channel_listen_mode;
- bool channel_data_ignore;
- ws_s_server_parser_response_counter rc;
+ ws_e_server_listen_mode mode; /** @brief expected AT response kind */
+ ws_e_server_response_code last_response; /** @brief response code for last AT command */
+ unsigned int current_channel; /** @brief TCP channel for last +IPD command */
+ unsigned int channel_data_length; /** @brief data length for last +IPD command */
+ unsigned int channel_data_counter; /** @brief amount of parsed data bytes for last +IPD command */
+ ws_e_channel_listen_mode channel_listen_mode; /** @brief +IPD command parse state */
+ bool channel_data_ignore; /** @brief whether last TCP request should be ignored because it's too long */
+ ws_s_server_parser_response_counter rc; /** @brief response counters for byte-by-byte string comparison */
} ws_s_server_parser;
/** @brief global server parser struct */
@@ -62,11 +67,6 @@ extern ws_s_server_parser g_ws_server_parser;
*/
void ws_server_req_incoming(uint8_t* data, size_t size);
-// /** @brief send AT response header for incoming request on specific channel */
-// void ws_server_req_respond_start(unsigned int channel);
-// /** @brief send AT tcp close on specific channel */
-// void ws_server_req_respond_end(unsigned int channel);
-
/** @brief send data to esp, waiting until server returns to idle mode */
void ws_server_send(uint8_t* data, size_t size);
@@ -93,7 +93,22 @@ void ws_server_req_parse_byte(unsigned int channel, uint8_t byte, bool ignore);
*/
void ws_server_req_finish(unsigned int channel, bool ignore);
+/**
+ * @brief append data to the tx buffer for sending response in chunks
+ *
+ * the esp8266 becomes unreliable when sending large tcp responses, so this
+ * function buffers the complete response, and sends it in chunks broken up by
+ * a newline ('\n') character
+ *
+ * to send data buffered using this function, refer to
+ * `ws_server_buffer_request_chunk_send` and `ws_server_buffer_send_chunk`.
+ *
+ * @param data pointer to data array
+ * @param size size of data array
+ */
void ws_server_buffer_send_append(uint8_t* data, size_t size);
+/** @brief send AT+CIPSEND with size of next chunk to the esp8266 */
void ws_server_buffer_request_chunk_send();
+/** @brief send data chunk for last AT+CIPSEND command */
void ws_server_buffer_send_chunk();