diff options
-rw-r--r-- | shared/protocol.h | 2 | ||||
-rw-r--r-- | shared/util.h | 2 | ||||
-rw-r--r-- | stm32f091/server.h | 65 | ||||
-rw-r--r-- | stm32f091/setup.h | 8 | ||||
-rw-r--r-- | stm32f091/util.h | 3 |
5 files changed, 55 insertions, 25 deletions
diff --git a/shared/protocol.h b/shared/protocol.h index 96c039a..e5ddf05 100644 --- a/shared/protocol.h +++ b/shared/protocol.h @@ -148,4 +148,6 @@ static ws_protocol_res_handler_t* g_ws_protocol_res_handlers[WS_PROTOCOL_CMD_AMO [WS_PROTOCOL_CMD_LAST_RECORDS] = &ws_protocol_res_last_records, }; +/** @brief return length of custom protocol header */ unsigned short ws_protocol_get_header_size(ws_s_protocol_res* response); + diff --git a/shared/util.h b/shared/util.h index 94a3dfe..690a999 100644 --- a/shared/util.h +++ b/shared/util.h @@ -3,4 +3,6 @@ #define WS_MIN(a, b) (((a) < (b)) ? (a) : (b)) #define WS_MAX(a, b) (((a) > (b)) ? (a) : (b)) +/** @brief take the log base 16 of `x` */ unsigned int ws_log16(unsigned int x); + 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(); diff --git a/stm32f091/setup.h b/stm32f091/setup.h index d459635..2d34952 100644 --- a/stm32f091/setup.h +++ b/stm32f091/setup.h @@ -6,17 +6,25 @@ #include "consts.h" +/** @brief glbal HAL i2c-1 state */ extern I2C_HandleTypeDef hi2c1; +/** @brief glbal HAL uart-1 state */ extern UART_HandleTypeDef huart1; +/** @brief glbal HAL uart-1 state */ extern UART_HandleTypeDef huart2; +/** @brief glbal HAL DMA state for uart-1's RX channel */ extern DMA_HandleTypeDef hdma_usart1_rx; +/** @brief glbal HAL DMA state for uart-1's TX channel */ extern DMA_HandleTypeDef hdma_usart1_tx; +/** @brief "main" setup function */ void ws_io_setup(); +// required HAL setup functions void NMI_Handler(); void HardFault_Handler(); void SysTick_Handler(); void HAL_MspInit(); void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c); void HAL_UART_MspInit(UART_HandleTypeDef *huart); + diff --git a/stm32f091/util.h b/stm32f091/util.h index 9c15f8b..100b877 100644 --- a/stm32f091/util.h +++ b/stm32f091/util.h @@ -34,6 +34,7 @@ #define WS_DBG_TTY_COLOR_TX WS_DBG_TTY_COLOR_GRN #define WS_DBG_TTY_COLOR_RX WS_DBG_TTY_COLOR_RED +// allow `debugger;` statement like in JS #define debugger asm("nop") // unused @@ -43,12 +44,14 @@ // #define WS_DBG_TTY_COLOR_IPD_LISTENING WS_DBG_TTY_COLOR_GRN // #define WS_DBG_TTY_COLOR_CIPSEND_LISTENING WS_DBG_TTY_COLOR_RED +/** @brief `printf()` over uart2 (usb) */ #define ws_usb_printf(fmt, ...) { \ char temp[255]; \ snprintf(temp, 255, fmt, ##__VA_ARGS__); \ HAL_UART_Transmit(&huart2, (uint8_t*) temp, sizeof(char) * strlen(temp), HAL_MAX_DELAY); \ } +/** @brief print VT100 escape code over uart2 to set tty color */ #define ws_dbg_set_usart2_tty_color(color) { \ uint8_t sgr[] = { 0x1b, 0x5b, 0x33 + (color > 7 ? 6 : 0), 0x30 + (color & 0b111), 0x6d }; \ HAL_UART_Transmit(&huart2, sgr, sizeof(sgr), 100); \ |