diff --git a/src/base/task.h b/src/base/task.h index 8944e05..f38c1c7 100644 --- a/src/base/task.h +++ b/src/base/task.h @@ -21,6 +21,7 @@ enum task_type : uint8_t { TASK_DISPLAY_MSG_TRACK_DETECT_OK, TASK_DISPLAY_MSG_CONFIG_NO_TRACKS, TASK_CONFIG_TRACK_DETECT, + TASK_CONFIG_WRITE_TEMP_TRACK, }; struct Task { diff --git a/src/custom_types.h b/src/custom_types.h index 61c41c1..282eb8c 100644 --- a/src/custom_types.h +++ b/src/custom_types.h @@ -20,8 +20,8 @@ struct lat_lng { struct track_data { uint16_t magic = CONFIG_MAGIC; - int id; - char name[20]; + unsigned short id; + char name[21]; lat_lng pt_a; lat_lng pt_b; }; diff --git a/src/modules/cmd/cmd.cpp b/src/modules/cmd/cmd.cpp index 37952b8..beed63c 100644 --- a/src/modules/cmd/cmd.cpp +++ b/src/modules/cmd/cmd.cpp @@ -5,6 +5,8 @@ #include "cmd.h" #include +#include "data/track_store.h" +#include "base/router.h" char *cmd::trim_arg(char *input) { if (input == nullptr) { @@ -76,6 +78,10 @@ cmd::command_id cmd::parse_command_name(const char *input) { return CMD_DUMPCFG; } + if (strcmp(input, "TRACK_LOAD") == 0) { + return CMD_LOAD_TRACK; + } + return CMD_UNKNOWN; } @@ -99,6 +105,58 @@ int cmd::dispatch_command(command_id command, unsigned short argc, char *argv[]) } #endif return 0; + + case CMD_LOAD_TRACK: + if (argc != 7) { + #ifdef ERROR + if (_logger != nullptr) { + _logger->error("TRACK_LOAD expects 6 arguments"); + } + #endif + return 1; + } + track_data new_track; + + new_track.id = strtoul(argv[1], nullptr, 10); + + strncpy(new_track.name, argv[2], sizeof(new_track.name) - 1); + new_track.name[sizeof(new_track.name) - 1] = '\0'; + + lat_lng pt_a; + pt_a.lat = strtod(argv[3], nullptr); + pt_a.lng = strtod(argv[4], nullptr); + new_track.pt_a = pt_a; + + lat_lng pt_b; + pt_b.lat = strtod(argv[5], nullptr); + pt_b.lng = strtod(argv[6], nullptr); + new_track.pt_b = pt_b; + + if (new_track.id < 1 || new_track.id > 8) { + #ifdef ERROR + if (_logger != nullptr) { + _logger->error(String("ID out of range: ") + String(new_track.id)); + } + #endif + return 1; + } + + #ifdef INFO + if (_logger != nullptr) { + _logger->info("Loading new track"); + _logger->info(String("ID: ") + String(new_track.id)); + _logger->info(String("Name: ") + new_track.name); + _logger->info(String("Point A lat: ") + String(new_track.pt_a.lat)); + _logger->info(String("Point A lng: ") + String(new_track.pt_a.lat)); + _logger->info(String("Point B lat: ") + String(new_track.pt_b.lat)); + _logger->info(String("Point B lng: ") + String(new_track.pt_b.lat)); + } + #endif + + track_temp_global_write(new_track); + router::send(MOD_CFG, TASK_CONFIG_WRITE_TEMP_TRACK); + + return 0; case CMD_UNKNOWN: default: diff --git a/src/modules/cmd/cmd.h b/src/modules/cmd/cmd.h index c67c753..c5c015d 100644 --- a/src/modules/cmd/cmd.h +++ b/src/modules/cmd/cmd.h @@ -17,7 +17,8 @@ private: enum command_id { CMD_UNKNOWN = 0, CMD_REBOOT, - CMD_DUMPCFG + CMD_DUMPCFG, + CMD_LOAD_TRACK, }; HardwareSerial *_data_stream; diff --git a/src/modules/config/config.cpp b/src/modules/config/config.cpp index 315c165..a94947a 100644 --- a/src/modules/config/config.cpp +++ b/src/modules/config/config.cpp @@ -3,6 +3,7 @@ // SPDX-License-Identifier: GPL-3.0-or-later #include "config.h" +#include "data/track_store.h" #include #include @@ -17,6 +18,34 @@ int config::task_complete() { return 0; } +int config::write_track(const track_data& in) { + track_data copy = in; + copy.magic = CONFIG_MAGIC; + if (copy.id < 1 || copy.id > 8) { + #ifdef ERROR + if (_logger != nullptr) { + _logger->error("Cannot write track data with out of range id, aborting"); + } + #endif + return 1; + } + EEPROM.put(copy.id, copy); + _config.track_slot_occupied[copy.id - 1] = true; + this->write_cfg(); + #ifdef INFO + if (_logger !=nullptr) { + _logger->info("Succesfully wrote new track into slot " + String(copy.id)); + } + #endif + return 0; +} + +int config::write_track_from_temp() { + track_data new_track; + track_temp_global_read(new_track); + return this->write_track(new_track); +} + config::config() : _logger(nullptr), _valid_config(true) {} config::config(system_logger *logger) : _logger(logger), _valid_config(true) {} @@ -123,7 +152,10 @@ int config::handle_active_task(unsigned long timeout_ms) { if (!_is_track_loaded) { return task_config_detect_track(timeout_ms); } - break; + return 0; + + case TASK_CONFIG_WRITE_TEMP_TRACK: + return this->write_track_from_temp(); default: break; diff --git a/src/modules/config/config.h b/src/modules/config/config.h index 1e0aff7..74c12af 100644 --- a/src/modules/config/config.h +++ b/src/modules/config/config.h @@ -42,6 +42,8 @@ private: int handle_active_task(unsigned long timeout_ms); int task_config_detect_track(unsigned long timeout_ms); int task_complete(); + int write_track(const track_data& in); + int write_track_from_temp(); public: int push(const Task &task) override;