From 6d47582eba4face3d5b084371286112cd80ee162 Mon Sep 17 00:00:00 2001 From: Hector van der Aa Date: Fri, 27 Mar 2026 16:08:24 +0100 Subject: [PATCH] Added basic primary driver display and display switch commands --- src/base/task.h | 1 + src/main.cpp | 2 +- src/modules/cmd/cmd.cpp | 75 +++++++++++++++++++++++++++++++++++ src/modules/cmd/cmd.h | 6 +++ src/modules/config/config.cpp | 2 +- src/modules/lcd/lcd.cpp | 29 ++++++++++++++ src/modules/lcd/lcd.h | 2 + 7 files changed, 115 insertions(+), 2 deletions(-) diff --git a/src/base/task.h b/src/base/task.h index 42e3abd..c420013 100644 --- a/src/base/task.h +++ b/src/base/task.h @@ -17,6 +17,7 @@ enum module_id : uint8_t { enum task_type : uint8_t { TASK_NULL, TASK_DISPLAY_GPS_DEBUG, + TASK_DISPLAY_DRIVER_PRIMARY, TASK_DISPLAY_MSG_GPS_FIX, TASK_DISPLAY_MSG_TRACK_DETECT_OK, TASK_DISPLAY_MSG_CONFIG_NO_TRACKS, diff --git a/src/main.cpp b/src/main.cpp index d3e562e..5fa8419 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -57,7 +57,7 @@ void setup() { delay(1000); driver_display->print_message("GPS Init Complete"); delay(1000); - router::send(MOD_LCD, TASK_DISPLAY_GPS_DEBUG); + router::send(MOD_LCD, TASK_DISPLAY_DRIVER_PRIMARY); } void loop() { diff --git a/src/modules/cmd/cmd.cpp b/src/modules/cmd/cmd.cpp index 14a614f..245e740 100644 --- a/src/modules/cmd/cmd.cpp +++ b/src/modules/cmd/cmd.cpp @@ -95,6 +95,18 @@ cmd::command_id cmd::parse_command_name(const char *input) { return CMD_CFG_RESET; } + if (strcmp(input, "TRACK_AUTODETECT") == 0) { + return CMD_TRACK_AUTODETECT; + } + + if (strcmp(input, "DISPLAY_GPS_DEBUG") == 0) { + return CMD_DISPLAY_GPS_DEBUG; + } + + if (strcmp(input, "DISPLAY_DRIVER_PRIMARY") == 0) { + return CMD_DISPLAY_DRIVER_PRIMARY; + } + return CMD_UNKNOWN; } @@ -296,6 +308,60 @@ int cmd::handle_cfg_reset_command(unsigned short argc) { return router::send(MOD_CFG, TASK_CONFIG_CFG_RESET); } +int cmd::handle_track_autodetect_command(unsigned short argc) { + if (argc != 1) { +#ifdef ERROR + if (_logger != nullptr) { + _logger->error("TRACK_AUTODETECT expects no arguments"); + } +#endif + return 1; + } + +#ifdef INFO + if (_logger != nullptr) { + _logger->info("Detecting track"); + } +#endif + return router::send(MOD_CFG, TASK_CONFIG_TRACK_DETECT, 1); +} + +int cmd::handle_display_gps_debug(unsigned short argc) { + if (argc != 1) { +#ifdef ERROR + if (_logger != nullptr) { + _logger->error("DISPLAY_GPS_DEBUG expects no arguments"); + } +#endif + return 1; + } + +#ifdef INFO + if (_logger != nullptr) { + _logger->info("Switching to GPS_DEBUG display"); + } +#endif + return router::send(MOD_LCD, TASK_DISPLAY_GPS_DEBUG); +} + +int cmd::handle_display_driver_primary(unsigned short argc) { + if (argc != 1) { +#ifdef ERROR + if (_logger != nullptr) { + _logger->error("DISPLAY_DRIVER_PRIMARY expects no arguments"); + } +#endif + return 1; + } + +#ifdef INFO + if (_logger != nullptr) { + _logger->info("Switching to DRIVER_PRIMARY display"); + } +#endif + return router::send(MOD_LCD, TASK_DISPLAY_DRIVER_PRIMARY); +} + int cmd::handle_unknown_command(unsigned short argc, char *argv[]) { #ifdef ERROR if (_logger != nullptr) { @@ -328,6 +394,15 @@ int cmd::dispatch_command(command_id command, unsigned short argc, char *argv[]) case CMD_CFG_RESET: return this->handle_cfg_reset_command(argc); + + case CMD_TRACK_AUTODETECT: + return this->handle_track_autodetect_command(argc); + + case CMD_DISPLAY_GPS_DEBUG: + return this->handle_display_gps_debug(argc); + + case CMD_DISPLAY_DRIVER_PRIMARY: + return this->handle_display_driver_primary(argc); case CMD_UNKNOWN: default: diff --git a/src/modules/cmd/cmd.h b/src/modules/cmd/cmd.h index c1eb957..b7b044a 100644 --- a/src/modules/cmd/cmd.h +++ b/src/modules/cmd/cmd.h @@ -22,6 +22,9 @@ private: CMD_DUMP_TRACK, CMD_CFG_RESET, CMD_CFG_DUMP, + CMD_TRACK_AUTODETECT, + CMD_DISPLAY_GPS_DEBUG, + CMD_DISPLAY_DRIVER_PRIMARY, }; HardwareSerial *_data_stream; @@ -47,6 +50,9 @@ private: int handle_track_delete_command(unsigned short argc, char *argv[]); int handle_track_dump_command(unsigned short argc, char *argv[]); int handle_cfg_reset_command(unsigned short argc); + int handle_track_autodetect_command(unsigned short argc); + int handle_display_gps_debug(unsigned short argc); + int handle_display_driver_primary(unsigned short argc); int handle_unknown_command(unsigned short argc, char *argv[]); public: diff --git a/src/modules/config/config.cpp b/src/modules/config/config.cpp index fa27efe..7f23083 100644 --- a/src/modules/config/config.cpp +++ b/src/modules/config/config.cpp @@ -210,7 +210,7 @@ int config::task_config_detect_track(unsigned long timeout_ms) { int config::handle_active_task(unsigned long timeout_ms) { switch (_active_task.type) { case TASK_CONFIG_TRACK_DETECT: { - if (!_is_track_loaded) { + if (!_is_track_loaded || _active_task.data == 1) { return task_config_detect_track(timeout_ms); } this->task_complete(); diff --git a/src/modules/lcd/lcd.cpp b/src/modules/lcd/lcd.cpp index 5ceb9cc..87e78c6 100644 --- a/src/modules/lcd/lcd.cpp +++ b/src/modules/lcd/lcd.cpp @@ -142,6 +142,23 @@ int lcd::render_gps_debug() { return 0; } +int lcd::render_driver_primary() { + this->clear(); + + gps_data gps; + gps_global_read(gps); + + _display->setCursor(0,0); + this->print("GPS:"); + if (gps.num_fix != 0) { + this->print("V"); + } else { + this->print("X"); + } + + return 0; +} + int lcd::render_msg_gps_fix() { this->clear(); _display->setCursor(6, 1); @@ -352,6 +369,14 @@ int lcd::loop(unsigned long timeout_ms) { } break; + case TASK_DISPLAY_DRIVER_PRIMARY: + _data_screen = screen::driver_primary; + if (!_msg_active) { + _screen = _data_screen; + _force_render = true; + } + break; + case TASK_DISPLAY_MSG_GPS_FIX: activate_message(screen::msg_gps_fix, next_task.data); break; @@ -397,6 +422,10 @@ int lcd::loop(unsigned long timeout_ms) { case screen::gps_debug: this->render_gps_debug(); break; + + case screen::driver_primary: + this->render_driver_primary(); + break; case screen::msg_gps_fix: this->render_msg_gps_fix(); diff --git a/src/modules/lcd/lcd.h b/src/modules/lcd/lcd.h index 22f1cdb..c62f07a 100644 --- a/src/modules/lcd/lcd.h +++ b/src/modules/lcd/lcd.h @@ -20,6 +20,7 @@ namespace screen { typedef enum lcd_screen { blank, gps_debug, + driver_primary, msg_gps_fix, msg_track_detect_ok, msg_config_no_tracks, @@ -60,6 +61,7 @@ private: screen::lcd_screen get_active_screen() const; int render_gps_debug(); + int render_driver_primary(); int render_msg_gps_fix(); int render_msg_track_detect_ok(); int render_msg_config_no_tracks();