diff options
Diffstat (limited to 'stm32f091')
-rw-r--r-- | stm32f091/backlog.c | 36 | ||||
-rw-r--r-- | stm32f091/backlog.h | 4 | ||||
-rw-r--r-- | stm32f091/consts.h | 21 | ||||
-rw-r--r-- | stm32f091/esp8266.c | 40 | ||||
-rw-r--r-- | stm32f091/main.c | 1 | ||||
-rw-r--r-- | stm32f091/makefile | 8 | ||||
-rw-r--r-- | stm32f091/protocol.c | 33 | ||||
-rw-r--r-- | stm32f091/readme.md | 7 | ||||
-rw-r--r-- | stm32f091/sensor.c | 6 | ||||
-rw-r--r-- | stm32f091/server.c | 2 | ||||
-rw-r--r-- | stm32f091/server.h | 29 | ||||
-rw-r--r-- | stm32f091/setup.h | 15 | ||||
-rw-r--r-- | stm32f091/util.h | 16 | ||||
-rw-r--r-- | stm32f091/wifi.def.h | 5 |
14 files changed, 170 insertions, 53 deletions
diff --git a/stm32f091/backlog.c b/stm32f091/backlog.c index 3f21924..662fc75 100644 --- a/stm32f091/backlog.c +++ b/stm32f091/backlog.c @@ -2,33 +2,41 @@ #include "backlog.h" -ws_s_backlog_database* WS_G_BACKLOG_DATABASE = NULL; +ws_s_backlog_database* g_ws_backlog_database = NULL; void ws_backlog_alloc(uint16_t record_amt) { - WS_G_BACKLOG_DATABASE = malloc(sizeof(ws_s_backlog_database) + sizeof(ws_s_backlog_record) * record_amt); - WS_G_BACKLOG_DATABASE->buffer_size = record_amt; - WS_G_BACKLOG_DATABASE->buffer_start = 0; - WS_G_BACKLOG_DATABASE->buffer_end = 0; + g_ws_backlog_database = malloc(sizeof(ws_s_backlog_database) + sizeof(ws_s_backlog_record) * record_amt); + g_ws_backlog_database->buffer_size = record_amt; + g_ws_backlog_database->buffer_start = 0; + g_ws_backlog_database->buffer_end = 0; } void ws_backlog_add_record(ws_s_backlog_record record) { static uint16_t id = 0; - WS_G_BACKLOG_DATABASE->records[WS_G_BACKLOG_DATABASE->buffer_end].id = id++; - WS_G_BACKLOG_DATABASE->records[WS_G_BACKLOG_DATABASE->buffer_end].sens_atm_pressure = record.sens_atm_pressure; - WS_G_BACKLOG_DATABASE->records[WS_G_BACKLOG_DATABASE->buffer_end].sens_humidity = record.sens_humidity; - WS_G_BACKLOG_DATABASE->records[WS_G_BACKLOG_DATABASE->buffer_end].sens_temperature = record.sens_temperature; + g_ws_backlog_database->records[g_ws_backlog_database->buffer_end].id = id++; + g_ws_backlog_database->records[g_ws_backlog_database->buffer_end].sens_atm_pressure = record.sens_atm_pressure; + g_ws_backlog_database->records[g_ws_backlog_database->buffer_end].sens_humidity = record.sens_humidity; + g_ws_backlog_database->records[g_ws_backlog_database->buffer_end].sens_temperature = record.sens_temperature; // shift buffer start/end - WS_G_BACKLOG_DATABASE->buffer_end = (WS_G_BACKLOG_DATABASE->buffer_end + 1) % WS_G_BACKLOG_DATABASE->buffer_size; - if (WS_G_BACKLOG_DATABASE->buffer_end == WS_G_BACKLOG_DATABASE->buffer_start) - WS_G_BACKLOG_DATABASE->buffer_start = (WS_G_BACKLOG_DATABASE->buffer_start + 1) % WS_G_BACKLOG_DATABASE->buffer_size; + g_ws_backlog_database->buffer_end = (g_ws_backlog_database->buffer_end + 1) % g_ws_backlog_database->buffer_size; + if (g_ws_backlog_database->buffer_end == g_ws_backlog_database->buffer_start) + g_ws_backlog_database->buffer_start = (g_ws_backlog_database->buffer_start + 1) % g_ws_backlog_database->buffer_size; } ws_s_backlog_record* ws_backlog_get_record(uint16_t record_index) { - return &WS_G_BACKLOG_DATABASE->records[record_index]; + return &g_ws_backlog_database->records[record_index]; } ws_s_backlog_record* ws_backlog_get_last_record(uint16_t record_offset) { - return ws_backlog_get_record((WS_G_BACKLOG_DATABASE->buffer_end - record_offset - 1) % WS_G_BACKLOG_DATABASE->buffer_size); + return ws_backlog_get_record((g_ws_backlog_database->buffer_end - record_offset - 1) % g_ws_backlog_database->buffer_size); +} + +uint16_t ws_backlog_get_record_count() { + // add buffer_size to the result of the modulo operation if it's result is negative + // (only works when buffer_size is less than 2^15) + // this is a consequence of the way in which c handles negative numbers in modulo operations + int16_t mod = (g_ws_backlog_database->buffer_end - g_ws_backlog_database->buffer_start) % g_ws_backlog_database->buffer_size; + return mod < 0 ? mod + g_ws_backlog_database->buffer_size : mod; } diff --git a/stm32f091/backlog.h b/stm32f091/backlog.h index 465b3c0..c8ea019 100644 --- a/stm32f091/backlog.h +++ b/stm32f091/backlog.h @@ -30,7 +30,7 @@ typedef struct { #pragma pack(pop) /** @brief global record backlog database pointer */ -extern ws_s_backlog_database* WS_G_BACKLOG_DATABASE; +extern ws_s_backlog_database* g_ws_backlog_database; /** * @brief add record to database @@ -55,3 +55,5 @@ ws_s_backlog_record* ws_backlog_get_record(uint16_t record_index); /** @brief get pointer to last record with offset `record_offset` from the database */ ws_s_backlog_record* ws_backlog_get_last_record(uint16_t record_offset); +/** @brief return amount of valid records in database */ +uint16_t ws_backlog_get_record_count(); diff --git a/stm32f091/consts.h b/stm32f091/consts.h new file mode 100644 index 0000000..349ff21 --- /dev/null +++ b/stm32f091/consts.h @@ -0,0 +1,21 @@ +#pragma once + +#include "wifi.h" + +#define WS_SERVER_PORT "80" + +#define WS_PINOUT_I2C_SDA_PIN GPIO_PIN_9 +#define WS_PINOUT_I2C_SDA_PORT GPIOB +#define WS_PINOUT_I2C_SCL_PIN GPIO_PIN_8 +#define WS_PINOUT_I2C_SCL_PORT GPIOB + +#define WS_PINOUT_USART1_RX_PIN GPIO_PIN_10 +#define WS_PINOUT_USART1_RX_PORT GPIOA +#define WS_PINOUT_USART1_TX_PIN GPIO_PIN_9 +#define WS_PINOUT_USART1_TX_PORT GPIOA + +#define WS_PINOUT_USART2_RX_PIN GPIO_PIN_3 +#define WS_PINOUT_USART2_RX_PORT GPIOA +#define WS_PINOUT_USART2_TX_PIN GPIO_PIN_2 +#define WS_PINOUT_USART2_TX_PORT GPIOA + diff --git a/stm32f091/esp8266.c b/stm32f091/esp8266.c index 6f12191..4fdf7e6 100644 --- a/stm32f091/esp8266.c +++ b/stm32f091/esp8266.c @@ -5,6 +5,7 @@ #include "esp8266.h" #include "setup.h" +#include "consts.h" void ws_esp8266_ATsendCommand(uint8_t* data){ char dataChar[20]; @@ -22,7 +23,7 @@ void ws_esp8266_ATsendCommand(uint8_t* data){ } int ws_esp8266_checkOK(uint8_t *receiveData,int length){ char *ret=""; - char *ret1=""; + // char *ret1=""; HAL_UART_Transmit(&huart2, receiveData,length,1000); ret = strstr((char*)receiveData,"OK"); // ret = strstr((char*)receiveData,"change"); @@ -47,6 +48,7 @@ int ws_esp8266_receivingMsg(uint8_t *receiveData,int length){ HAL_UART_Transmit(&huart2, receiveData,length,1000); ret = strstr((char*)receiveData,"+IPD"); // memset(receiveData,0,30); + if((ret[0]='+') && (ret[1]=='I')){ //HAL_UART_Transmit(&huart2, (uint8_t*)ret, sizeof(ret), 100); return 1; @@ -74,13 +76,12 @@ int ws_esp8266_unlink(uint8_t *receiveData,int length){ } void ws_esp8266_StartEsp(){ - uint8_t Tx_AT[]="AT\r\n"; uint8_t Rx_buffer[10]={0}; for(int i=0;i<3;i++){ // HAL_UART_Transmit(&huart2, hier,sizeof(hier),100); - HAL_UART_Transmit_IT(&huart1, Tx_AT,strlen((char*)Tx_AT)); - HAL_UART_Receive_IT(&huart1, Rx_buffer, 10); + HAL_UART_Transmit(&huart1, Tx_AT,strlen((char*)Tx_AT), 100); + HAL_UART_Receive(&huart1, Rx_buffer, 10, 100); HAL_UART_Transmit(&huart2, Rx_buffer,10,100); @@ -94,8 +95,8 @@ void ws_esp8266_disconnect(){ uint8_t Tx_disconnect[]="AT+CWQAP\r\n";uint8_t buffer[17]={0}; while(ret!=1){ - HAL_UART_Transmit_IT(&huart1, Tx_disconnect,strlen((char*)Tx_disconnect)); - HAL_UART_Receive_IT(&huart1, buffer, 17); + HAL_UART_Transmit(&huart1, Tx_disconnect,strlen((char*)Tx_disconnect), 100); + HAL_UART_Receive(&huart1, buffer, 17, 100); HAL_Delay(2000); if(ws_esp8266_checkOK(buffer,17)==1){ @@ -112,8 +113,8 @@ void ws_esp8266_mode(){ while(ret!=1){ - HAL_UART_Transmit_IT(&huart1, Tx_mode,strlen((char*)Tx_mode)); - HAL_UART_Receive_IT(&huart1, buffer1, 20); + HAL_UART_Transmit(&huart1, Tx_mode,strlen((char*)Tx_mode), 100); + HAL_UART_Receive(&huart1, buffer1, 20, 100); HAL_Delay(1000); if(ws_esp8266_checkOK(buffer1,20)==1){ @@ -126,7 +127,7 @@ void ws_esp8266_mode(){ HAL_Delay(1000); } void ws_esp8266_connect(){ - uint8_t Tx_network[]="AT+CWJAP=\"Test\",\"12345678\"\r\n"; + uint8_t Tx_network[]="AT+CWJAP=\"" WS_ESP8266_WLAN_SSID "\",\"" WS_ESP8266_WLAN_PASSWD "\"\r\n"; HAL_UART_Transmit(&huart1, Tx_network,strlen((char*)Tx_network),1000); @@ -141,12 +142,12 @@ void ws_esp8266_connect(){ } void ws_esp8266_serveraan(){ int ret; - uint8_t buffer1[30]={0}; uint8_t Tx_server[]="AT+CIPSERVER=1,80\r\n"; + uint8_t buffer1[30]={0}; uint8_t Tx_server[]="AT+CIPSERVER=1," WS_SERVER_PORT "\r\n"; while(ret!=1){ - HAL_UART_Transmit_IT(&huart1, Tx_server,strlen((char*)Tx_server)); - HAL_UART_Receive_IT(&huart1, buffer1, 30); + HAL_UART_Transmit(&huart1, Tx_server,strlen((char*)Tx_server), 100); + HAL_UART_Receive(&huart1, buffer1, 30, 100); HAL_Delay(2000); if(ws_esp8266_checkOK(buffer1,30)==1){ @@ -159,13 +160,14 @@ void ws_esp8266_serveraan(){ HAL_Delay(1000); } void ws_esp8266_serveruit(){ - int ret; - uint8_t buffer1[27]={0}; uint8_t Tx_server[]="AT+CIPSERVER=0\r\n"; + //int ret; + //uint8_t buffer1[27]={0}; + uint8_t Tx_server[]="AT+CIPSERVER=0\r\n"; // // while(ret!=1){ - HAL_UART_Transmit_IT(&huart1, Tx_server,strlen((char*)Tx_server)); -// HAL_UART_Receive_IT(&huart1, buffer1, 27); + HAL_UART_Transmit(&huart1, Tx_server,strlen((char*)Tx_server), 100); +// HAL_UART_Receive(&huart1, buffer1, 27, 100); HAL_Delay(3000); // if(unlink(buffer1,27)==1){ @@ -183,8 +185,8 @@ void ws_esp8266_mux(){ while(ret!=1){ - HAL_UART_Transmit_IT(&huart1, Tx_mux,strlen((char*)Tx_mux)); - HAL_UART_Receive_IT(&huart1, buffer2, 20); + HAL_UART_Transmit(&huart1, Tx_mux,strlen((char*)Tx_mux), 100); + HAL_UART_Receive(&huart1, buffer2, 20, 100); HAL_Delay(2000); if(ws_esp8266_checkOK(buffer2,20)==1){ @@ -201,7 +203,7 @@ void ws_esp8266_close(){ uint8_t Tx_close[]="AT+CIPCLOSE=0\r\n"; - HAL_UART_Transmit_IT(&huart1, Tx_close,strlen((char*)Tx_close)); + HAL_UART_Transmit(&huart1, Tx_close,strlen((char*)Tx_close), 100); HAL_Delay(3000); diff --git a/stm32f091/main.c b/stm32f091/main.c index 9235f1b..7cb0718 100644 --- a/stm32f091/main.c +++ b/stm32f091/main.c @@ -16,7 +16,6 @@ int main() { }); ws_backlog_alloc(24 * 60); - ws_sensor_read(); xTaskCreate(ws_sensor_read_task, "sensor", 128, NULL, 1, NULL); vTaskStartScheduler(); diff --git a/stm32f091/makefile b/stm32f091/makefile index 5a185de..20424c3 100644 --- a/stm32f091/makefile +++ b/stm32f091/makefile @@ -5,6 +5,8 @@ RM = rm -f TARGET = main +include ../shared/shared.mk + SHARED_FLAGS += -g SHARED_FLAGS += -DSTM32F091xC SHARED_FLAGS += -Wall @@ -74,9 +76,15 @@ $(TARGET).bin: $(TARGET).elf %.o: %.s $(CC) -c $(AFLAGS) $< -o $@ +lib/%.o: lib/%.c + $(CC) -c $(CFLAGS) -w $< -o $@ + %.o: %.c $(CC) -c $(CFLAGS) $< -o $@ +%-stm.o: %.c + $(CC) -c $(CFLAGS) $< -o $@ + $(TARGET).elf: $(OBJS) $(LD) $(LFLAGS) $^ -o $@ diff --git a/stm32f091/protocol.c b/stm32f091/protocol.c new file mode 100644 index 0000000..589ee5d --- /dev/null +++ b/stm32f091/protocol.c @@ -0,0 +1,33 @@ +#include <stdio.h> + +#include "../shared/protocol.h" +#include "backlog.h" +#include "util.h" + +void ws_protocol_res_last_records(ws_s_protocol_parsed_req_cmd* parsed_cmd, ws_s_protocol_res* response, bool send) { + static unsigned int record_amount = 0; + const char* response_header = "id,temperature,humidity,atmospheric_pressure\n"; + const size_t response_line_size = sizeof("xxxx,xx,xx,xx\n"); + + if (!send) { + response->success = WS_PROTOCOL_CMD_RETURN_OK; + if (sscanf(parsed_cmd->argv[1], "%u", &record_amount) < 1) response->success = WS_PROTOCOL_CMD_RETURN_ERROR; + record_amount = WS_MIN(record_amount, ws_backlog_get_record_count()); + response->csh = true; + response->msg = ws_bin_s_alloc(0); + response->msg->bytes = strlen(response_header) + response_line_size * record_amount; + } else { + ws_protocol_send_data(response_header, strlen(response_header)); + char line[response_line_size + 1]; // +1 for null terminator -> sprintf + for (unsigned int i = 0; i < record_amount; i++) { + ws_s_backlog_record* record = ws_backlog_get_last_record(i); + sprintf(line, "%04x,%02x,%02x,%02x\n", record->id, record->sens_temperature, record->sens_humidity, record->sens_atm_pressure); + ws_protocol_send_data(line, response_line_size); + } + } +} + +void ws_protocol_send_data(const char* data, unsigned int length) { + //TODO: implement on esp data channels + HAL_UART_Transmit(&huart2, (uint8_t*) data, length, HAL_MAX_DELAY); +} diff --git a/stm32f091/readme.md b/stm32f091/readme.md new file mode 100644 index 0000000..97492d5 --- /dev/null +++ b/stm32f091/readme.md @@ -0,0 +1,7 @@ +# stm32 firmware subdirectory + +- uses make +- make sure to initialize the git submodules +- all warnings from source files in the lib/ subfolder are hidden +- copy wifi.def.h to wifi.h and edit the network credentials + diff --git a/stm32f091/sensor.c b/stm32f091/sensor.c index bc3cfd3..1c94e2a 100644 --- a/stm32f091/sensor.c +++ b/stm32f091/sensor.c @@ -58,6 +58,12 @@ void ws_sensor_read() { .sens_humidity = ws_sensor_humidity() }; ws_backlog_add_record(record); + + // < DEBUG PROTOCOL PARSING CODE > + // ws_s_protocol_req_parser_state* parser = ws_protocol_req_parser_alloc(); + // const char* request = "last-records 5\n"; + // ws_protocol_parse_req_bytes(parser, (char*) request, strlen(request)); + // ws_protocol_req_parser_free(parser); } void ws_sensor_read_task() { diff --git a/stm32f091/server.c b/stm32f091/server.c index e289245..4840527 100644 --- a/stm32f091/server.c +++ b/stm32f091/server.c @@ -28,7 +28,7 @@ void ws_server_demo() { uint8_t receive[24]={0}; uint8_t sendToQTData[]="gelukt"; uint8_t test[]="test"; - int ret; + //int ret; //ATsendCommand(sendToQTData); while (1) { diff --git a/stm32f091/server.h b/stm32f091/server.h index 6a3501d..e134079 100644 --- a/stm32f091/server.h +++ b/stm32f091/server.h @@ -1,6 +1,29 @@ #pragma once -void ws_server_demo(); +#include <stdlib.h> +#include <stdint.h> + +// void ws_server_demo(); +// +// /** FreeRTOS task that listens for incoming requests from the esp */ +// void ws_server_listen_task(); + +/** + * @brief +IPD incoming request handler + * + * this function takes chunks of data from the esp8266 and parses +IPD + * commands. when a valid +IPD command is detected, it gets forwarded to + * ws_protocol_parse_req_byte. + * + * @param data pointer to data array + * @param size amount of bytes allowed to be read from `data` + */ +void ws_server_req_incoming(uint8_t* data, size_t size); + +// TODO: server req incoming implementation +// +// example +IPD command: +// +IPD,0,15:last-records 5\n +// +// TODO: protocol req response parser -/** FreeRTOS task that listens for incoming requests from the esp */ -void ws_server_listen_task(); diff --git a/stm32f091/setup.h b/stm32f091/setup.h index 8ca3720..04fa177 100644 --- a/stm32f091/setup.h +++ b/stm32f091/setup.h @@ -4,20 +4,7 @@ #include <stm32f0xx_hal_i2c.h> #include <stm32f0xx_hal_uart.h> -#define WS_PINOUT_I2C_SDA_PIN GPIO_PIN_9 -#define WS_PINOUT_I2C_SDA_PORT GPIOB -#define WS_PINOUT_I2C_SCL_PIN GPIO_PIN_8 -#define WS_PINOUT_I2C_SCL_PORT GPIOB - -#define WS_PINOUT_USART1_RX_PIN GPIO_PIN_10 -#define WS_PINOUT_USART1_RX_PORT GPIOA -#define WS_PINOUT_USART1_TX_PIN GPIO_PIN_9 -#define WS_PINOUT_USART1_TX_PORT GPIOA - -#define WS_PINOUT_USART2_RX_PIN GPIO_PIN_3 -#define WS_PINOUT_USART2_RX_PORT GPIOA -#define WS_PINOUT_USART2_TX_PIN GPIO_PIN_2 -#define WS_PINOUT_USART2_TX_PORT GPIOA +#include "consts.h" extern I2C_HandleTypeDef hi2c1; extern UART_HandleTypeDef huart1; diff --git a/stm32f091/util.h b/stm32f091/util.h new file mode 100644 index 0000000..92f093f --- /dev/null +++ b/stm32f091/util.h @@ -0,0 +1,16 @@ +#pragma once + +#include <stdlib.h> +#include <stdio.h> +#include <stm32f0xx_hal.h> +#include <string.h> + +#include "setup.h" +#include "../shared/util.h" + +#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); \ +} + diff --git a/stm32f091/wifi.def.h b/stm32f091/wifi.def.h new file mode 100644 index 0000000..f0748d2 --- /dev/null +++ b/stm32f091/wifi.def.h @@ -0,0 +1,5 @@ +#pragma once + +#define WS_ESP8266_WLAN_SSID "Test" +#define WS_ESP8266_WLAN_PASSWD "12345678" + |