aboutsummaryrefslogtreecommitdiff
path: root/stm32f091/server.c
diff options
context:
space:
mode:
Diffstat (limited to 'stm32f091/server.c')
-rw-r--r--stm32f091/server.c54
1 files changed, 48 insertions, 6 deletions
diff --git a/stm32f091/server.c b/stm32f091/server.c
index 7e44774..d4f7e20 100644
--- a/stm32f091/server.c
+++ b/stm32f091/server.c
@@ -9,7 +9,7 @@
#include "setup.h"
#include "consts.h"
-static ws_s_server_parser g_ws_server_parser = {
+ws_s_server_parser g_ws_server_parser = {
.last_response = WS_SERVER_RC_NONE,
.mode = WS_SERVER_LM_IDLE,
@@ -20,7 +20,7 @@ static ws_s_server_parser g_ws_server_parser = {
};
static ws_s_protocol_req_parser_state* g_ws_protocol_parsers[WS_SERVER_MAX_CHANNELS] = {0};
-
+static unsigned int g_ws_esp8266_dma_tx_buffer_index = 0;
void ws_server_req_parse_byte(unsigned int channel, uint8_t byte, bool ignore) {
if (ignore) return;
@@ -80,6 +80,9 @@ void ws_server_req_incoming(uint8_t* data, size_t size) {
if (next_few_bytes_are("+IPD,")) {
i += 4; // skip I, P, D, and comma
g_ws_server_parser.mode = WS_SERVER_LM_IPD_LISTENING;
+ } else if (byte == '>') {
+ g_ws_server_parser.mode = WS_SERVER_LM_CIPSEND_LISTENING;
+ ws_server_buffer_send_finish();
}
break;
}
@@ -114,6 +117,7 @@ void ws_server_req_incoming(uint8_t* data, size_t size) {
g_ws_server_parser.channel_data_length = 0;
g_ws_server_parser.channel_listen_mode = WS_SERVER_CL_CHANNEL_ID;
ws_server_req_finish(g_ws_server_parser.current_channel, g_ws_server_parser.channel_data_ignore);
+ g_ws_server_parser.mode = WS_SERVER_LM_IDLE;
}
break;
}
@@ -121,6 +125,14 @@ void ws_server_req_incoming(uint8_t* data, size_t size) {
}
break;
}
+ case WS_SERVER_LM_CIPSEND_LISTENING: {
+ if (next_few_bytes_are("SEND OK")) {
+ i += 6;
+ // g_ws_server_parser.mode = WS_SERVER_LM_IDLE;
+ ws_server_req_respond_end(0);
+ }
+ break;
+ }
default: {}
}
}
@@ -132,9 +144,39 @@ void ws_server_send(uint8_t* data, size_t size) {
while (g_ws_server_parser.mode != WS_SERVER_LM_IDLE) {};
}
-void ws_server_req_respond(unsigned int channel, uint8_t* data, size_t size) {
- uint8_t Tx_send[]="AT+CIPSEND=0,LEN:";
- uint8_t Tx_close[]="AT+CIPCLOSE=0\r\n";
- return;
+void ws_server_buffer_send_append(uint8_t* data, size_t size) {
+ // TODO: buffer overrun protection
+ // while (!__HAL_DMA_GET_FLAG(&hdma_usart1_tx, DMA_FLAG_TC2)); // make sure buffer isn't used
+ strncpy((char*) &g_ws_esp8266_dma_tx_buffer[g_ws_esp8266_dma_tx_buffer_index], (char*) data, size); // append string
+ g_ws_esp8266_dma_tx_buffer_index += size; // shift head
+}
+
+void ws_server_buffer_send_finish() {
+#ifdef WS_DBG_PRINT_ESP_OVER_USART2
+ uint8_t green[] = { 0x1b, 0x5b, 0x33, 0x32, 0x6d };
+ HAL_UART_Transmit(&huart2, green, sizeof(green), 100);
+ HAL_UART_Transmit(&huart2, g_ws_esp8266_dma_tx_buffer, strlen((char*) g_ws_esp8266_dma_tx_buffer), 100);
+#endif
+
+ HAL_UART_Transmit_DMA(&huart1, g_ws_esp8266_dma_tx_buffer, strlen((char*) g_ws_esp8266_dma_tx_buffer));
+ __HAL_UART_ENABLE_IT(&huart1, UART_IT_TXE);
+ g_ws_esp8266_dma_tx_buffer_index = 0;
+ while (!__HAL_DMA_GET_FLAG(&hdma_usart1_tx, DMA_FLAG_TC2));
+}
+
+void ws_server_req_respond_start(unsigned int channel, size_t size) {
+ char* cmd = NULL;
+ size_t len = asiprintf(&cmd, "AT+CIPSEND=%d,%d\r\n", channel, size);
+ g_ws_server_parser.mode = WS_SERVER_LM_CMD_ECHO;
+ ws_esp8266_send((uint8_t*) cmd, len);
+ while (!__HAL_DMA_GET_FLAG(&hdma_usart1_tx, DMA_FLAG_TC2));
+}
+
+void ws_server_req_respond_end(unsigned int channel) {
+ char* cmd = NULL;
+ size_t len = asiprintf(&cmd, "AT+CIPCLOSE=%d\r\n", channel);
+ g_ws_server_parser.mode = WS_SERVER_LM_CMD_ECHO;
+ ws_esp8266_send((uint8_t*) cmd, len);
+ while (!__HAL_DMA_GET_FLAG(&hdma_usart1_tx, DMA_FLAG_TC2));
}