aboutsummaryrefslogtreecommitdiff
path: root/stm32f091
diff options
context:
space:
mode:
Diffstat (limited to 'stm32f091')
-rw-r--r--stm32f091/backlog.c36
-rw-r--r--stm32f091/backlog.h4
-rw-r--r--stm32f091/consts.h21
-rw-r--r--stm32f091/esp8266.c40
-rw-r--r--stm32f091/main.c1
-rw-r--r--stm32f091/makefile8
-rw-r--r--stm32f091/protocol.c33
-rw-r--r--stm32f091/readme.md7
-rw-r--r--stm32f091/sensor.c6
-rw-r--r--stm32f091/server.c2
-rw-r--r--stm32f091/server.h29
-rw-r--r--stm32f091/setup.h15
-rw-r--r--stm32f091/util.h16
-rw-r--r--stm32f091/wifi.def.h5
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"
+