From c2d1f75af798f6d3ae3e97c42354629c294b7fbe Mon Sep 17 00:00:00 2001 From: TheBakedPotato <11617336+TheBakedPotato@users.noreply.github.com> Date: Thu, 13 Nov 2025 21:22:21 -0500 Subject: [PATCH 1/4] Feature: #206 - Added `Command` enum - Added a char enum which maps the chars used to indicate the commands to actual enum variants - The main switch statement in GPAD_HAL.cpp now switches over the Command enum instead of the hardcoded chars --- Firmware/GPAD_API/GPAD_API/GPAD_HAL.cpp | 16 ++++++++-------- Firmware/GPAD_API/GPAD_API/GPAD_HAL.h | 9 +++++++++ 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/Firmware/GPAD_API/GPAD_API/GPAD_HAL.cpp b/Firmware/GPAD_API/GPAD_API/GPAD_HAL.cpp index 0de718a..9501e3b 100644 --- a/Firmware/GPAD_API/GPAD_API/GPAD_HAL.cpp +++ b/Firmware/GPAD_API/GPAD_API/GPAD_HAL.cpp @@ -424,24 +424,24 @@ void interpretBuffer(char *buf, int rlen, Stream *serialport, PubSubClient *clie printError(serialport); return; } - char C = buf[0]; + Command command = static_cast(buf[0]); serialport->print(F("Command: ")); - serialport->println(C); - switch (C) + serialport->println(F(command)); + switch (command) { - case 's': + case Command::MUTE: serialport->println(F("Muting Case!")); currentlyMuted = true; break; - case 'u': + case Command::UNMUTE: serialport->println(F("UnMuting Case!")); currentlyMuted = false; break; - case 'h': // help + case Command::HELP: // help printInstructions(serialport); break; - case 'a': + case Command::ALARM: { // In the case of an alarm state, the rest of the buffer is a message. // we will read up to 60 characters from this buffer for display on our @@ -462,7 +462,7 @@ void interpretBuffer(char *buf, int rlen, Stream *serialport, PubSubClient *clie break; } - case 'i': // Information. Firmware Version, Mute Status, + case Command::INFO: // Information. Firmware Version, Mute Status, { // Firmware Version // 81+23 = Maximum string length diff --git a/Firmware/GPAD_API/GPAD_API/GPAD_HAL.h b/Firmware/GPAD_API/GPAD_API/GPAD_HAL.h index d8baef2..0c8c162 100644 --- a/Firmware/GPAD_API/GPAD_API/GPAD_HAL.h +++ b/Firmware/GPAD_API/GPAD_API/GPAD_HAL.h @@ -122,6 +122,15 @@ extern HardwareSerial uartSerial1; #define UART2_BAUD_RATE 9600 extern HardwareSerial uartSerial1; +enum class Command : char +{ + MUTE = 's', + UNMUTE = 'u', + HELP = 'h', + ALARM = 'a', + INFO = 'i', +}; + // SPI Functions.... void setup_spi(); void receive_byte(byte c); From fa4d809f5a7bbf229e3e458ce734fabb16c293a2 Mon Sep 17 00:00:00 2001 From: TheBakedPotato <11617336+TheBakedPotato@users.noreply.github.com> Date: Thu, 13 Nov 2025 22:09:45 -0500 Subject: [PATCH 2/4] Feature: #206 - Defined GPAD_API_VERSION value and publish value - GPAD_API_VERSION is now defined as a preprocessor directive, like FIRMWARE_VERSION - The value is published via MQTT just like the FIRMWARE_VERSION --- Firmware/GPAD_API/GPAD_API/gpad_utility.h | 3 +++ Firmware/GPAD_API/pre_extra_script.py | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Firmware/GPAD_API/GPAD_API/gpad_utility.h b/Firmware/GPAD_API/GPAD_API/gpad_utility.h index 8cd6fce..29f0882 100644 --- a/Firmware/GPAD_API/GPAD_API/gpad_utility.h +++ b/Firmware/GPAD_API/GPAD_API/gpad_utility.h @@ -30,6 +30,9 @@ #ifndef FIRMWARE_VERSION #define FIRMWARE_VERSION "" #endif +#ifndef GPAD_API_VERSION +#define GPAD_API_VERSION "" +#endif // #define HARDWARE_VERSION "V0.0.1 " #ifndef MODEL_NAME #define MODEL_NAME "" diff --git a/Firmware/GPAD_API/pre_extra_script.py b/Firmware/GPAD_API/pre_extra_script.py index e83baff..7307eef 100644 --- a/Firmware/GPAD_API/pre_extra_script.py +++ b/Firmware/GPAD_API/pre_extra_script.py @@ -3,7 +3,8 @@ cpp_defines = [ ("COMPANY_NAME", "PubInv "), # For the Broker ID for MQTT ("PROG_NAME", "GPAD_API "), # This program - ("FIRMWARE_VERSION", "0.46 "), # Initial Menu implementation + ("FIRMWARE_VERSION", "0.45 "), # Initial Menu implementation + ("GPAD_API_VERSION", "1.0.0"), ("MODEL_NAME", "KRAKE_"), ("LICENSE", "GNU Affero General Public License, version 3 "), ("ORIGIN", "US"), From 3acf4d6cc0030c5c33dbf5fe36e2596fab9e330d Mon Sep 17 00:00:00 2001 From: TheBakedPotato <11617336+TheBakedPotato@users.noreply.github.com> Date: Sat, 6 Dec 2025 14:56:42 -0500 Subject: [PATCH 3/4] (#206): API Version is stored in class, no longer a compile time argument - The GPAD API version is now hardcoded as an actual value - It is not something that should be able to be changed by a compilation flag --- Firmware/GPAD_API/GPAD_API/GPAD_HAL.cpp | 37 ++++++++++++++++++ Firmware/GPAD_API/GPAD_API/GPAD_HAL.h | 46 ++++++++++++++++++----- Firmware/GPAD_API/GPAD_API/gpad_utility.h | 3 -- Firmware/GPAD_API/pre_extra_script.py | 1 - 4 files changed, 74 insertions(+), 13 deletions(-) diff --git a/Firmware/GPAD_API/GPAD_API/GPAD_HAL.cpp b/Firmware/GPAD_API/GPAD_API/GPAD_HAL.cpp index 9501e3b..9d9f835 100644 --- a/Firmware/GPAD_API/GPAD_API/GPAD_HAL.cpp +++ b/Firmware/GPAD_API/GPAD_API/GPAD_HAL.cpp @@ -26,6 +26,10 @@ #include "WiFiManagerOTA.h" #include "GPAD_menu.h" +using namespace gpad_hal; + +GPAD_HAL gpadHal(SemanticVersion(0, 1, 0)); + extern IPAddress myIP; // Use Serial1 for UART communication @@ -474,6 +478,13 @@ void interpretBuffer(char *buf, int rlen, Stream *serialport, PubSubClient *clie strcat(onInfoMsg, FIRMWARE_VERSION); client->publish(publish_Ack_Topic, onInfoMsg); serialport->println(onInfoMsg); + onInfoMsg[0] = '\0'; + + // Report API version + strcat(onInfoMsg, gpadHal.getVersion().toString().c_str()); + client->publish(publish_Ack_Topic, onInfoMsg); + serialport->println(onInfoMsg); + onInfoMsg[0] = '\0'; // Up time onInfoMsg[0] = '\0'; @@ -748,3 +759,29 @@ void annunciateAlarmLevel(Stream *serialport) playNotBusyLevel(currentLevel); } } + +GPAD_HAL::GPAD_HAL(SemanticVersion version) + : version(version) +{ +} + +SemanticVersion &GPAD_HAL::getVersion() +{ + return this->version; +} + +SemanticVersion::SemanticVersion(uint8_t major, uint8_t minor, uint8_t patch) + : major(major), + minor(minor), + patch(patch) +{ +} + +std::string SemanticVersion::toString() +{ + std::string versionString; + + versionString.append("0.0.0"); + + return versionString; +} \ No newline at end of file diff --git a/Firmware/GPAD_API/GPAD_API/GPAD_HAL.h b/Firmware/GPAD_API/GPAD_API/GPAD_HAL.h index 0c8c162..899cb82 100644 --- a/Firmware/GPAD_API/GPAD_API/GPAD_HAL.h +++ b/Firmware/GPAD_API/GPAD_API/GPAD_HAL.h @@ -18,8 +18,8 @@ */ -#ifndef GPAD_HAL -#define GPAD_HAL 1 +#ifndef GPAD_HAL_H +#define GPAD_HAL_H #include // #include #include @@ -122,14 +122,42 @@ extern HardwareSerial uartSerial1; #define UART2_BAUD_RATE 9600 extern HardwareSerial uartSerial1; -enum class Command : char +namespace gpad_hal { - MUTE = 's', - UNMUTE = 'u', - HELP = 'h', - ALARM = 'a', - INFO = 'i', -}; + enum class Command : char + { + MUTE = 's', + UNMUTE = 'u', + HELP = 'h', + ALARM = 'a', + INFO = 'i', + }; + + class SemanticVersion + { + public: + SemanticVersion(uint8_t major, uint8_t minor, uint8_t patch); + + std::string toString(); + + private: + uint8_t major; + uint8_t minor; + uint8_t patch; + }; + + class GPAD_HAL + { + public: + GPAD_HAL(SemanticVersion version); + + SemanticVersion &getVersion(); + + private: + SemanticVersion version; + }; + +} // SPI Functions.... void setup_spi(); diff --git a/Firmware/GPAD_API/GPAD_API/gpad_utility.h b/Firmware/GPAD_API/GPAD_API/gpad_utility.h index 29f0882..8cd6fce 100644 --- a/Firmware/GPAD_API/GPAD_API/gpad_utility.h +++ b/Firmware/GPAD_API/GPAD_API/gpad_utility.h @@ -30,9 +30,6 @@ #ifndef FIRMWARE_VERSION #define FIRMWARE_VERSION "" #endif -#ifndef GPAD_API_VERSION -#define GPAD_API_VERSION "" -#endif // #define HARDWARE_VERSION "V0.0.1 " #ifndef MODEL_NAME #define MODEL_NAME "" diff --git a/Firmware/GPAD_API/pre_extra_script.py b/Firmware/GPAD_API/pre_extra_script.py index 7307eef..023a37e 100644 --- a/Firmware/GPAD_API/pre_extra_script.py +++ b/Firmware/GPAD_API/pre_extra_script.py @@ -4,7 +4,6 @@ ("COMPANY_NAME", "PubInv "), # For the Broker ID for MQTT ("PROG_NAME", "GPAD_API "), # This program ("FIRMWARE_VERSION", "0.45 "), # Initial Menu implementation - ("GPAD_API_VERSION", "1.0.0"), ("MODEL_NAME", "KRAKE_"), ("LICENSE", "GNU Affero General Public License, version 3 "), ("ORIGIN", "US"), From caa18c0c46092b980d7ef0036b756afce5276b89 Mon Sep 17 00:00:00 2001 From: TheBakedPotato <11617336+TheBakedPotato@users.noreply.github.com> Date: Sun, 7 Dec 2025 18:50:05 -0500 Subject: [PATCH 4/4] (#206): API version is now printed out, leveraged const for methods --- Firmware/GPAD_API/GPAD_API/GPAD_HAL.cpp | 19 ++++++++--------- Firmware/GPAD_API/GPAD_API/GPAD_HAL.h | 27 ++++++++++++++++++++----- 2 files changed, 32 insertions(+), 14 deletions(-) diff --git a/Firmware/GPAD_API/GPAD_API/GPAD_HAL.cpp b/Firmware/GPAD_API/GPAD_API/GPAD_HAL.cpp index 9d9f835..b82ebfb 100644 --- a/Firmware/GPAD_API/GPAD_API/GPAD_HAL.cpp +++ b/Firmware/GPAD_API/GPAD_API/GPAD_HAL.cpp @@ -28,8 +28,6 @@ using namespace gpad_hal; -GPAD_HAL gpadHal(SemanticVersion(0, 1, 0)); - extern IPAddress myIP; // Use Serial1 for UART communication @@ -481,7 +479,8 @@ void interpretBuffer(char *buf, int rlen, Stream *serialport, PubSubClient *clie onInfoMsg[0] = '\0'; // Report API version - strcat(onInfoMsg, gpadHal.getVersion().toString().c_str()); + strcat(onInfoMsg, "GPAD API Version: "); + strcat(onInfoMsg, gpadApi.getVersion().toString().c_str()); client->publish(publish_Ack_Topic, onInfoMsg); serialport->println(onInfoMsg); onInfoMsg[0] = '\0'; @@ -760,12 +759,12 @@ void annunciateAlarmLevel(Stream *serialport) } } -GPAD_HAL::GPAD_HAL(SemanticVersion version) +GPAD_API::GPAD_API(SemanticVersion version) : version(version) { } -SemanticVersion &GPAD_HAL::getVersion() +const SemanticVersion &GPAD_API::getVersion() const { return this->version; } @@ -777,11 +776,13 @@ SemanticVersion::SemanticVersion(uint8_t major, uint8_t minor, uint8_t patch) { } -std::string SemanticVersion::toString() +std::string SemanticVersion::toString() const { - std::string versionString; - - versionString.append("0.0.0"); + std::string versionString = std::to_string(this->major); + versionString.push_back('.'); + versionString.append(std::to_string(this->minor)); + versionString.push_back('.'); + versionString.append(std::to_string(this->patch)); return versionString; } \ No newline at end of file diff --git a/Firmware/GPAD_API/GPAD_API/GPAD_HAL.h b/Firmware/GPAD_API/GPAD_API/GPAD_HAL.h index 899cb82..aba0f8e 100644 --- a/Firmware/GPAD_API/GPAD_API/GPAD_HAL.h +++ b/Firmware/GPAD_API/GPAD_API/GPAD_HAL.h @@ -124,6 +124,11 @@ extern HardwareSerial uartSerial1; namespace gpad_hal { + + static const uint8_t API_MAJOR_VERSION = 0; + static const uint8_t API_MINOR_VERSION = 1; + static const uint8_t API_PATCH_VERSION = 0; + enum class Command : char { MUTE = 's', @@ -133,12 +138,23 @@ namespace gpad_hal INFO = 'i', }; + /** + * SemanticVersion stores a version following the "semantic versioning" convention + * defined here: https://semver.org/ + * + * In summary: + * - Major version defines breaking an incompatible changes with different versions + * - Minor version adds new functionality in a backwards capability + * ie v2.4.1 and v2.5.1 are still compatible but v2.5.1 may have additional functionality + * - Patch version simply addresses bugs with no new features again in a backwards + * compatible way + */ class SemanticVersion { public: SemanticVersion(uint8_t major, uint8_t minor, uint8_t patch); - std::string toString(); + std::string toString() const; private: uint8_t major; @@ -146,17 +162,18 @@ namespace gpad_hal uint8_t patch; }; - class GPAD_HAL + class GPAD_API { public: - GPAD_HAL(SemanticVersion version); + GPAD_API(SemanticVersion version); - SemanticVersion &getVersion(); + const SemanticVersion &getVersion() const; private: - SemanticVersion version; + const SemanticVersion version; }; + const GPAD_API gpadApi = GPAD_API(SemanticVersion(API_MAJOR_VERSION, API_MINOR_VERSION, API_PATCH_VERSION)); } // SPI Functions....