From b6d700077af8b4a4c5b9ea7eb5ee98e003ff4ebd Mon Sep 17 00:00:00 2001 From: Deomid Ryabkov Date: Wed, 23 Mar 2016 19:17:11 +0000 Subject: [PATCH] Add websocket data feed, send temperature data PUBLISHED_FROM=e56601f99ccf80d8420b4b54b0ef7c272ec4a656 --- examples/CC3200/Makefile.build | 7 +- examples/CC3200/main.c | 120 +++++++++++++++++++++++-- examples/CC3200/slfs/favicon.ico | Bin 0 -> 16958 bytes examples/CC3200/tmp006.c | 38 ++++++++ examples/CC3200/tmp006.h | 21 +++++ examples/ESP8266_RTOS/user/user_main.c | 1 - 6 files changed, 176 insertions(+), 11 deletions(-) create mode 100644 examples/CC3200/slfs/favicon.ico create mode 100644 examples/CC3200/tmp006.c create mode 100644 examples/CC3200/tmp006.h diff --git a/examples/CC3200/Makefile.build b/examples/CC3200/Makefile.build index f94f326c..06f45fb4 100644 --- a/examples/CC3200/Makefile.build +++ b/examples/CC3200/Makefile.build @@ -92,10 +92,11 @@ CC3200_PLATFORM_SRCS = cc3200_fs.c cc3200_fs_slfs.c cc3200_libc.c cc3200_socket. VPATH += $(COMMON_PATH)/platforms/cc3200 FREERTOS_SRCS = timers.c list.c queue.c tasks.c port.c heap_3.c osi_freertos.c -DRIVER_SRCS = cpu.c i2c.c interrupt.c pin.c prcm.c spi.c uart.c udma.c utils.c +DRIVER_SRCS = cpu.c i2c.c i2c_if.c interrupt.c pin.c prcm.c spi.c uart.c udma.c utils.c SL_SRCS = socket.c wlan.c driver.c device.c netapp.c netcfg.c cc_pal.c fs.c SDK_SRCS = startup_gcc.c $(FREERTOS_SRCS) $(DRIVER_SRCS) $(SL_SRCS) -IPATH += $(SDK_PATH) $(SDK_PATH)/inc $(SDK_PATH)/driverlib $(SDK_PATH)/oslib \ +IPATH += $(SDK_PATH) $(SDK_PATH)/inc $(SDK_PATH)/driverlib \ + $(SDK_PATH)/example/common $(SDK_PATH)/oslib \ $(SDK_PATH)/simplelink $(SDK_PATH)/simplelink/include \ $(SDK_PATH)/third_party/FreeRTOS/source \ $(SDK_PATH)/third_party/FreeRTOS/source/include \ @@ -106,7 +107,7 @@ VPATH += $(SDK_PATH)/driverlib $(SDK_PATH)/example/common $(SDK_PATH)/oslib \ $(SDK_PATH)/third_party/FreeRTOS/source/portable/GCC/ARM_CM4 \ $(SDK_PATH)/third_party/FreeRTOS/source/portable/MemMang \ -APP_SRCS = main.c mongoose.c $(CC3200_PLATFORM_SRCS) $(SDK_SRCS) +APP_SRCS = main.c tmp006.c mongoose.c $(CC3200_PLATFORM_SRCS) $(SDK_SRCS) APP_OBJS = $(addprefix $(OBJDIR)/,$(patsubst %.c,%.o,$(APP_SRCS))) $(FW_ELF): $(APP_OBJS) diff --git a/examples/CC3200/main.c b/examples/CC3200/main.c index 7432315d..6efa8280 100644 --- a/examples/CC3200/main.c +++ b/examples/CC3200/main.c @@ -21,20 +21,27 @@ #include "uart.h" #include "utils.h" +#include +#include "i2c_if.h" + #include "simplelink.h" #include "device.h" #include "oslib/osi.h" -#include +#include "mongoose.h" +#include "tmp006.h" #define CONSOLE_BAUD_RATE 115200 #define CONSOLE_UART UARTA0_BASE #define CONSOLE_UART_PERIPH PRCM_UARTA0 +#define SYS_CLK 80000000 #define WIFI_SSID "YourWiFi" #define WIFI_PASS "YourPassword" +#define TMP006_ADDR 0x41 + struct sj_event { int type; void *data; @@ -60,14 +67,105 @@ void SimpleLinkNetAppEventHandler(SlNetAppEvent_t *e) { } } +static void data_ev_handler(struct mg_connection *nc, int ev, void *p); + +struct temp_data { + double ts; + double volt; + double temp; +}; + +static struct temp_data s_temp_data; static void ev_handler(struct mg_connection *nc, int ev, void *p) { LOG(LL_DEBUG, ("Ev: %d", ev)); - if (ev == MG_EV_HTTP_REQUEST) { - struct mg_serve_http_opts opts; - memset(&opts, 0, sizeof(opts)); - opts.document_root = "."; - mg_serve_http(nc, (struct http_message *) p, opts); + switch (ev) { + case MG_EV_ACCEPT: { + char addr[32]; + mg_sock_addr_to_str(&nc->sa, addr, sizeof(addr), + MG_SOCK_STRINGIFY_IP | MG_SOCK_STRINGIFY_PORT); + LOG(LL_INFO, ("%p conn from %s", nc, addr)); + break; + } + case MG_EV_HTTP_REQUEST: { + char addr[32]; + struct http_message *hm = (struct http_message *) p; + mg_sock_addr_to_str(&nc->sa, addr, sizeof(addr), + MG_SOCK_STRINGIFY_IP | MG_SOCK_STRINGIFY_PORT); + LOG(LL_INFO, + ("HTTP request from %s: %.*s %.*s", addr, (int) hm->method.len, + hm->method.p, (int) hm->uri.len, hm->uri.p)); + struct mg_serve_http_opts opts; + memset(&opts, 0, sizeof(opts)); + opts.document_root = "."; + mg_serve_http(nc, (struct http_message *) p, opts); + break; + } + case MG_EV_CLOSE: { + LOG(LL_INFO, ("%p closed", nc)); + break; + } + case MG_EV_WEBSOCKET_HANDSHAKE_DONE: { + LOG(LL_INFO, ("%p switching to data mode", nc)); + nc->handler = data_ev_handler; + nc->ev_timer_time = mg_time(); /* Immediately */ + break; + } + case MG_EV_TIMER: { + double volt = tmp006_read_sensor_voltage(TMP006_ADDR); + double temp = tmp006_read_die_temp(TMP006_ADDR); + if (volt != TMP006_INVALID_READING && temp != TMP006_INVALID_READING) { + s_temp_data.temp = temp; + s_temp_data.volt = volt; + s_temp_data.ts = mg_time(); + LOG(LL_DEBUG, ("V = %lf mV, T = %lf C", volt, temp)); + } + nc->ev_timer_time = mg_time() + 0.05; + } + } +} + +struct conn_data { + double last_ts; + double last_temp; + double last_volt; +}; + +static void send_temp(struct mg_connection *nc) { + LOG(LL_DEBUG, ("%p sending temp data", nc)); + mg_printf_websocket_frame( + nc, WEBSOCKET_OP_TEXT, + "{\"type\": \"temp\", \"ts\": %lf, \"v\": %lf, \"t\": %lf}", + s_temp_data.ts, s_temp_data.volt, s_temp_data.temp); +} + +static void data_ev_handler(struct mg_connection *nc, int ev, void *p) { + struct conn_data *cd = (struct conn_data *) nc->user_data; + if (cd == NULL) { + cd = (struct conn_data *) calloc(1, sizeof(*cd)); + nc->user_data = cd; + } + switch (ev) { + case MG_EV_POLL: + case MG_EV_TIMER: { + const double now = mg_time(); + /* Send if there was a change or repeat last data every second. */ + if (s_temp_data.volt != cd->last_volt || + s_temp_data.temp != cd->last_temp || + now > cd->last_ts + 1.0) { + send_temp(nc); + cd->last_ts = now; + cd->last_volt = s_temp_data.volt; + cd->last_temp = s_temp_data.temp; + } + nc->ev_timer_time = now + 0.05; + break; + } + case MG_EV_CLOSE: { + LOG(LL_INFO, ("%p closed", nc)); + free(cd); + break; + } } } @@ -77,6 +175,9 @@ static void mg_task(void *arg) { osi_MsgQCreate(&s_v7_q, "V7", sizeof(struct sj_event), 32 /* len */); sl_Start(NULL, NULL, NULL); + if (!tmp006_set_config(TMP006_ADDR, TMP006_CONV_2, false)) { + LOG(LL_ERROR, ("Failed to init temperature sensor")); + } if (strlen(WIFI_SSID) > 0) { int ret; @@ -111,6 +212,7 @@ static void mg_task(void *arg) { struct mg_connection *nc = mg_bind(&mg_mgr, "80", ev_handler); if (nc != NULL) { mg_set_protocol_http_websocket(nc); + nc->ev_timer_time = mg_time(); /* Start data collection */ } else { LOG(LL_ERROR, ("Failed to create listener: %s", err)); } @@ -118,7 +220,7 @@ static void mg_task(void *arg) { while (1) { struct sj_event e; mg_mgr_poll(&mg_mgr, 0); - if (osi_MsgQRead(&s_v7_q, &e, 1000) != OSI_OK) continue; + if (osi_MsgQRead(&s_v7_q, &e, 1) != OSI_OK) continue; } } @@ -146,6 +248,10 @@ int main() { setvbuf(stderr, NULL, _IONBF, 0); cs_log_set_level(LL_INFO); + MAP_PinTypeI2C(PIN_01, PIN_MODE_1); /* SDA */ + MAP_PinTypeI2C(PIN_02, PIN_MODE_1); /* SCL */ + I2C_IF_Open(I2C_MASTER_MODE_FST); + VStartSimpleLinkSpawnTask(8); osi_TaskCreate(mg_task, (const signed char *) "mg", 8192, NULL, 3, NULL); osi_start(); diff --git a/examples/CC3200/slfs/favicon.ico b/examples/CC3200/slfs/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..f8331f7cd0b69f429567455c20ff2b938325f0cf GIT binary patch literal 16958 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 2); + if (val[0] & 0x80) temp = -((1 << 14) - temp); + return temp / 32.0; +} diff --git a/examples/CC3200/tmp006.h b/examples/CC3200/tmp006.h new file mode 100644 index 00000000..39f1d3b8 --- /dev/null +++ b/examples/CC3200/tmp006.h @@ -0,0 +1,21 @@ +#ifndef CS_MONGOOSE_EXAMPLES_CC3200_TMP006_H_ +#define CS_MONGOOSE_EXAMPLES_CC3200_TMP006_H_ + +#include +#include + +enum tmp006_conversion_rate { + TMP006_CONV_4 = 0, + TMP006_CONV_2, + TMP006_CONV_1, + TMP006_CONV_1_2, + TMP006_CONV_1_4, +}; + +bool tmp006_set_config(uint8_t addr, enum tmp006_conversion_rate conv_rate, bool drdy_en); +double tmp006_read_sensor_voltage(uint8_t addr); +double tmp006_read_die_temp(uint8_t addr); + +#define TMP006_INVALID_READING (-1000.0) + +#endif /* CS_MONGOOSE_EXAMPLES_CC3200_TMP006_H_ */ diff --git a/examples/ESP8266_RTOS/user/user_main.c b/examples/ESP8266_RTOS/user/user_main.c index a5d5188e..c6587ff3 100644 --- a/examples/ESP8266_RTOS/user/user_main.c +++ b/examples/ESP8266_RTOS/user/user_main.c @@ -37,7 +37,6 @@ void ev_handler(struct mg_connection *nc, int ev, void *p) { case MG_EV_HTTP_REQUEST: { char addr[32]; struct http_message *hm = (struct http_message *) p; - (void) hm; mg_sock_addr_to_str(&nc->sa, addr, sizeof(addr), MG_SOCK_STRINGIFY_IP | MG_SOCK_STRINGIFY_PORT); LOG(LL_INFO,