From 3815d2ed5f9c7c772f018e6f4723235089d2e654 Mon Sep 17 00:00:00 2001 From: Jens Christian True Date: Wed, 4 Sep 2019 15:28:38 +0200 Subject: [PATCH] OO redesign --- .vscode/settings.json | 5 ++ lib/CommandHandler/CommandHandler.cpp | 61 ++++++++++++++++++++++++ lib/CommandHandler/CommandHandler.h | 16 +++++++ lib/DisplayProxy/DisplayProxy.h | 10 ++++ lib/DisplayProxy/DisplayProxyMAX7456.cpp | 24 ++++++++++ lib/DisplayProxy/DisplayProxyMAX7456.h | 19 ++++++++ src/main.cpp | 47 ++---------------- 7 files changed, 140 insertions(+), 42 deletions(-) create mode 100644 lib/CommandHandler/CommandHandler.cpp create mode 100644 lib/CommandHandler/CommandHandler.h create mode 100644 lib/DisplayProxy/DisplayProxy.h create mode 100644 lib/DisplayProxy/DisplayProxyMAX7456.cpp create mode 100644 lib/DisplayProxy/DisplayProxyMAX7456.h diff --git a/.vscode/settings.json b/.vscode/settings.json index c6d8849..26e8220 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,5 +2,10 @@ "terminal.integrated.env.windows": { "PATH": "C:\\Program Files (x86)\\STMicroelectronics\\st_toolset\\asm;C:\\Program Files (x86)\\Common Files\\Oracle\\Java\\javapath;C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;C:\\Windows\\System32\\OpenSSH\\;C:\\Program Files (x86)\\STMicroelectronics\\STM32 ST-LINK Utility\\ST-LINK Utility;C:\\Program Files\\doxygen\\bin;C:\\Users\\furyf\\scoop\\apps\\latex\\current\\texmfs\\install\\miktex\\bin;C:\\Users\\furyf\\scoop\\apps\\ruby\\current\\gems\\bin;C:\\Users\\furyf\\scoop\\apps\\ruby\\current\\bin;C:\\Users\\furyf\\scoop\\apps\\nodejs\\current\\bin;C:\\Users\\furyf\\scoop\\apps\\nodejs\\current;C:\\Users\\furyf\\go\\bin;C:\\Users\\furyf\\scoop\\apps\\gcc\\current\\bin;C:\\Users\\furyf\\scoop\\apps\\composer\\current\\home\\vendor\\bin;C:\\Users\\furyf\\scoop\\apps\\nmap\\current\\bin;C:\\Users\\furyf\\scoop\\apps\\python27\\current\\scripts;C:\\Users\\furyf\\AppData\\Local\\Programs\\Python\\Launcher\\;C:\\Users\\furyf\\scoop\\shims;C:\\Users\\furyf\\AppData\\Local\\Microsoft\\WindowsApps;C:\\Users\\furyf\\scoop\\apps\\msys\\current\\bin;C:\\Users\\furyf\\scoop\\apps\\hyper\\2.0.0\\resources\\bin;C:\\Users\\furyf\\AppData\\Local\\Programs\\Microsoft VS Code\\bin;C:\\Program Files (x86)\\STMicroelectronics\\st_toolset\\asm;C:\\Program Files (x86)\\Common Files\\Oracle\\Java\\javapath;C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;C:\\Windows\\System32\\OpenSSH\\;C:\\Program Files (x86)\\STMicroelectronics\\STM32 ST-LINK Utility\\ST-LINK Utility;C:\\Program Files\\doxygen\\bin;C:\\Users\\furyf\\scoop\\apps\\latex\\current\\texmfs\\install\\miktex\\bin;C:\\Users\\furyf\\scoop\\apps\\ruby\\current\\gems\\bin;C:\\Users\\furyf\\scoop\\apps\\ruby\\current\\bin;C:\\Users\\furyf\\scoop\\apps\\nodejs\\current\\bin;C:\\Users\\furyf\\scoop\\apps\\nodejs\\current;C:\\Users\\furyf\\go\\bin;C:\\Users\\furyf\\scoop\\apps\\gcc\\current\\bin;C:\\Users\\furyf\\scoop\\apps\\composer\\current\\home\\vendor\\bin;C:\\Users\\furyf\\scoop\\apps\\nmap\\current\\bin;C:\\Users\\furyf\\scoop\\apps\\python27\\current\\scripts;C:\\Users\\furyf\\AppData\\Local\\Programs\\Python\\Launcher\\;C:\\Users\\furyf\\scoop\\shims;C:\\Users\\furyf\\AppData\\Local\\Microsoft\\WindowsApps;C:\\Users\\furyf\\scoop\\apps\\msys\\current\\bin;C:\\Users\\furyf\\scoop\\apps\\hyper\\2.0.0\\resources\\bin;C:\\Users\\furyf\\AppData\\Local\\Programs\\Microsoft VS Code\\bin", "PLATFORMIO_CALLER": "vscode" + }, + "files.associations": { + "ios": "cpp", + "system_error": "cpp", + "xstring": "cpp" } } \ No newline at end of file diff --git a/lib/CommandHandler/CommandHandler.cpp b/lib/CommandHandler/CommandHandler.cpp new file mode 100644 index 0000000..ff4b08f --- /dev/null +++ b/lib/CommandHandler/CommandHandler.cpp @@ -0,0 +1,61 @@ +#include "CommandHandler.h" + +#include "Arduino.h" +#include "ArduinoJson.h" + +CommandHandler::CommandHandler(DisplayProxy *display) +{ + this->display = display; +} + +bool CommandHandler::parse(char *cmd) +{ + Serial.print("Handling: "); + Serial.println(cmd); + StaticJsonDocument<32> doc; + DeserializationError error = deserializeJson(doc, cmd); + + // Test if parsing succeeds. + if (error) + { + Serial.print(F("deserializeJson() failed: ")); + Serial.println(error.c_str()); + return false; + } + + const char *command = doc["command"]; + if (strcmp("write", command) == 0 && doc["text"].is() && doc["x"].is() && doc["y"].is()) + { + const char *text = doc["text"]; + int x = doc["x"]; + int y = doc["y"]; + + this->debugWrite(x, y, text); + this->display->write(x, y, text); + return true; + } + + if (strcmp("clear", command) == 0) + { + this->display->clear(); + } + + if (strcmp("offset", command) == 0) + { + int x = doc["x"]; + int y = doc["y"]; + this->display->setOffset(x, y); + } + + return true; +} + +void CommandHandler::debugWrite(int x, int y, const char *text) +{ + Serial.print(F("Writing (")); + Serial.print(x); + Serial.print(","); + Serial.print(y); + Serial.print("): "); + Serial.println(text); +} \ No newline at end of file diff --git a/lib/CommandHandler/CommandHandler.h b/lib/CommandHandler/CommandHandler.h new file mode 100644 index 0000000..6a80813 --- /dev/null +++ b/lib/CommandHandler/CommandHandler.h @@ -0,0 +1,16 @@ +#ifndef COMMANDHANDLER_H +#define COMMANDHANDLER_H +#include "DisplayProxy.h" + +class CommandHandler +{ +public: + CommandHandler(DisplayProxy *display); + bool parse(char *cmd); +private: + void debugWrite(int x, int y, const char *text); + DisplayProxy *display; + +}; + +#endif \ No newline at end of file diff --git a/lib/DisplayProxy/DisplayProxy.h b/lib/DisplayProxy/DisplayProxy.h new file mode 100644 index 0000000..36c24f1 --- /dev/null +++ b/lib/DisplayProxy/DisplayProxy.h @@ -0,0 +1,10 @@ +#ifndef DISPLAYPROXY_H +#define DISPLAYPROXY_H +class DisplayProxy +{ +public: + virtual bool write(int x, int y, const char *text) = 0; + virtual bool clear() = 0; + virtual bool setOffset(int x, int y) = 0; +}; +#endif \ No newline at end of file diff --git a/lib/DisplayProxy/DisplayProxyMAX7456.cpp b/lib/DisplayProxy/DisplayProxyMAX7456.cpp new file mode 100644 index 0000000..a7ee5fd --- /dev/null +++ b/lib/DisplayProxy/DisplayProxyMAX7456.cpp @@ -0,0 +1,24 @@ +#include "DisplayProxyMAX7456.h" + +DisplayProxyMAX7456::DisplayProxyMAX7456(Max7456 *osd) +{ + this->osd = osd; +} + +bool DisplayProxyMAX7456::write(int x, int y, const char *text) +{ + this->osd->print(text, x, y); + return true; +} + +bool DisplayProxyMAX7456::clear() +{ + this->osd->clearScreen(); + return true; +} + +bool DisplayProxyMAX7456::setOffset(int x, int y) +{ + this->osd->setDisplayOffsets(x, y); + return true; +} \ No newline at end of file diff --git a/lib/DisplayProxy/DisplayProxyMAX7456.h b/lib/DisplayProxy/DisplayProxyMAX7456.h new file mode 100644 index 0000000..e56abf8 --- /dev/null +++ b/lib/DisplayProxy/DisplayProxyMAX7456.h @@ -0,0 +1,19 @@ +#ifndef DISPLAYPROXYMAX7456_H +#define DISPLAYPROXYMAX7456_H + +#include "DisplayProxy.h" +#include "max7456.h" + +class DisplayProxyMAX7456 : public DisplayProxy +{ +public: + DisplayProxyMAX7456(Max7456 *osd); + + bool write(int x, int y, const char *text); + bool clear() ; + bool setOffset(int x, int y); +private: + Max7456 *osd; +}; + +#endif \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index ac83450..b4cef01 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2,49 +2,12 @@ #include #include "config.h" -#include "ArduinoJson.h" +#include "CommandHandler.h" +#include "DisplayProxyMAX7456.h" #include "max7456.h" Max7456 osd; - -void handleRPC(char *cmd) -{ - Serial.print("Handling: "); - Serial.println(cmd); - StaticJsonDocument<200> doc; - DeserializationError error = deserializeJson(doc, cmd); - - // Test if parsing succeeds. - if (error) - { - Serial.print(F("deserializeJson() failed: ")); - Serial.println(error.c_str()); - return; - } - - const char *command = doc["command"]; // "write" - if (strcmp("write", command) == 0) - { - const char *text = doc["text"]; // "1351824120" - int x = doc["x"]; // 13 - int y = doc["y"]; // 10 - osd.print(text, x, y); - return; - } - - if (strcmp("clear", command) == 0) - { - osd.clearScreen(); - return; - } - - if (strcmp("offset", command) == 0) - { - int x = doc["x"]; // 13 - int y = doc["y"]; // 10 - osd.setDisplayOffsets(x, y); - return; - } -} +DisplayProxyMAX7456 proxy(&osd); +CommandHandler cmd_handler(&proxy); void processSerial() { @@ -72,7 +35,7 @@ void processSerial() { receivedChars[ndx] = '\0'; // terminate the string ndx = 0; - handleRPC(receivedChars); + cmd_handler.parse(receivedChars); } } }