From 64a168c77568f8886662b535515ff25d056042e9 Mon Sep 17 00:00:00 2001 From: David Phillips Date: Sat, 27 Feb 2021 23:25:04 +1300 Subject: Re-add basic display-only logic This module will be extended later with input and UI/menu logic --- Makefile | 2 ++ altimeter.c | 18 ++++++++---------- ui.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ui.h | 10 ++++++++++ 4 files changed, 83 insertions(+), 10 deletions(-) create mode 100644 ui.c create mode 100644 ui.h diff --git a/Makefile b/Makefile index a2546df..c1f53b2 100644 --- a/Makefile +++ b/Makefile @@ -71,6 +71,7 @@ REAL_OBJ = \ $(REAL_DIR)/altimeter.o \ $(REAL_DIR)/util.o \ $(REAL_DIR)/timer.o \ + $(REAL_DIR)/ui.o \ $(REAL_DIR)/data_manager.o SIM_OBJ = \ @@ -79,6 +80,7 @@ SIM_OBJ = \ $(SIM_DIR)/altimeter.o \ $(SIM_DIR)/util.o \ $(SIM_DIR)/timer.o \ + $(SIM_DIR)/ui.o \ $(SIM_DIR)/data_manager.o ALL_OBJ = $(TEST_OBJ) $(REAL_OBJ) $(SIM_OBJ) diff --git a/altimeter.c b/altimeter.c index 76dabd9..df238da 100644 --- a/altimeter.c +++ b/altimeter.c @@ -11,6 +11,7 @@ #include "data_manager.h" #include "display.h" #include "timer.h" +#include "ui.h" #include "barometer.h" #ifdef WDT_DISABLE @@ -23,35 +24,32 @@ #endif static struct data_ctx dctx = {}; +static struct ui_ctx ui_ctx = {}; /* ISR for collecting and displaying pressure, altitude data etc */ ISR(TIMER1_COMPA_vect) { data_manager_tick(&dctx); - //ui_tick(); - + ui_update(&ui_ctx, &dctx); WDT_PAT_MAYBE(); } int main(void) { - struct display display; struct barometer barometer; + struct display display; struct timer timer; - /* Initialise display before enabling interrupts */ - get_system_display(&display); - display.init(); - display.clear(); - /* get descriptors for system default peripherals */ get_system_barometer(&barometer); + get_system_display(&display); get_system_timer(&timer); - timer.init(); + /* Initialise peripherals/modules before enabling interrupts below */ barometer.init(); - + timer.init(); data_manager_init(&dctx, &timer, &barometer); + ui_init(&ui_ctx, &display); #ifdef USBCON /* Disable USB controller if one is present - this spams (latches?) USB_GEN diff --git a/ui.c b/ui.c new file mode 100644 index 0000000..6b63a86 --- /dev/null +++ b/ui.c @@ -0,0 +1,63 @@ +#include +#include + +#include "data_manager.h" +#include "display.h" +#include "util.h" +#include "ui.h" + +void ui_init(struct ui_ctx *ui, struct display *display) +{ + ui->display = display; + ui->display->init(); + ui->display->clear(); +} + +void ui_update(struct ui_ctx *ui, struct data_ctx *dctx) +{ + char line[LCD_WIDTH+1]; + //if (rate_m_s < 0) { + // rate_sym = C_DESC; + //} else if (rate_m_s == 0) { + // rate_sym = C_IDLE; + //} else { + // rate_sym = C_ASC; + //} + //DEBUG_MARK_5_CLEAR; + + /* FIXME these are missing from the data context, dummy values to test */ + float rate_m_s = 1.2; + char rate_sym = '\0'; + if (rate_m_s < 0) { + rate_sym = C_DESC; + } else if (rate_m_s == 0) { + rate_sym = C_IDLE; + } else { + rate_sym = C_ASC; + } + + /* line 1 */ + snprintf(line, sizeof(line), "%.1f m %c%d m/s", dctx->altitude, rate_sym, abs(rate_m_s)); + blank_to_eol(line, sizeof(line)); + ui->display->set_cursor(0, 0); + ui->display->write(line); + + + /* line 2 */ + snprintf(line, sizeof(line), "%.2f hPa", dctx->pressure); + blank_to_eol(line, sizeof(line)); + ui->display->set_cursor(0, 1); + ui->display->write(line); + + /* line 3 */ + snprintf(line, sizeof(line), "SET %.2f hPa", dctx->setting); + blank_to_eol(line, sizeof(line)); + ui->display->set_cursor(0, 2); + ui->display->write(line); + + /* line 4 */ + snprintf(line, sizeof(line), "%.1f ""\xdf""C", 12.3f); + blank_to_eol(line, sizeof(line)); + ui->display->set_cursor(0, 3); + ui->display->write(line); +} diff --git a/ui.h b/ui.h new file mode 100644 index 0000000..c51c261 --- /dev/null +++ b/ui.h @@ -0,0 +1,10 @@ +#pragma once + +#include "data_manager.h" + +struct ui_ctx { + struct display *display; +}; + +void ui_init(struct ui_ctx*, struct display *); +void ui_update(struct ui_ctx*, struct data_ctx*); -- cgit v1.1