diff --git a/.clangd b/.clangd new file mode 100644 index 0000000..437f255 --- /dev/null +++ b/.clangd @@ -0,0 +1,2 @@ +CompileFlags: + Remove: [-f*, -m*] diff --git a/.vscode/settings.json b/.vscode/settings.json index 2543558..47cdca6 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -37,7 +37,7 @@ "clangd.arguments": [ "--background-index", "--query-driver=/home/gustice/.espressif/tools/riscv32-esp-elf/esp-14.2.0_20241119/riscv32-esp-elf/bin/riscv32-esp-elf-gcc", - "--compile-commands-dir=/home/gustice/jobs/projects/Proj_Zwickau_waitingRoom/FW_X_WatchController/build_uTest" + "--compile-commands-dir=/home/gustice/jobs/projects/Proj_Zwickau_waitingRoom/FW_X_WatchController/build" ], "cmake.debugConfig": { "setupCommands": [ @@ -55,4 +55,4 @@ } ] } -} \ No newline at end of file +} diff --git a/components/spit/CMakeLists.txt b/components/spit/CMakeLists.txt index c840ae9..8c4e373 100644 --- a/components/spit/CMakeLists.txt +++ b/components/spit/CMakeLists.txt @@ -1,5 +1,5 @@ idf_component_register( SRC_DIRS "src" "src/esp" INCLUDE_DIRS "include" - REQUIRES esp_system esp_netif freeRtosApi + REQUIRES esp_system esp_netif freeRtosApi sockets ) diff --git a/components/spit/include/spit_client.hpp b/components/spit/include/spit_client.hpp index d107a01..8d9f24f 100644 --- a/components/spit/include/spit_client.hpp +++ b/components/spit/include/spit_client.hpp @@ -10,6 +10,7 @@ #include #include #include +#include "syslog.hpp" using namespace std; @@ -86,6 +87,7 @@ class SClient : ISadClient { Callbacks mCallbacks; fos::TaskT *mThreadReceive{}; + fos::TaskT *mThreadProcess{}; bool mStopReceiveMessages{}; Connection mConnectionStatus{Connection::None}; @@ -151,7 +153,8 @@ class SClient : ISadClient { private: bool startReceiveSPITMessages(); void stopReceiveSPITMessages(); - static void receiveSPITMessage(SClient &rM); + static void receiveSpitMessage(SClient &rM); + static void processSpitMessage(SClient &rM); // Reconnect to the server when connection is lost see eventConnectionStatus and eventServerDetected bool _doReconnect{}; // true = on eventServerDetected connect to the server identified by mServerID public: diff --git a/components/spit/src/spit_client.cpp b/components/spit/src/spit_client.cpp index 3a39a8b..3d8d60f 100644 --- a/components/spit/src/spit_client.cpp +++ b/components/spit/src/spit_client.cpp @@ -2,8 +2,12 @@ #include "spit_client.hpp" #include "esp_log.h" +#include "Queue.hpp" + namespace spit { static const char *TAG = "SPIT"; +static fos::Queue> incommingSpit(64); + /** * Create a new SPIT_client instance, should be done once by the user app. @@ -225,7 +229,8 @@ bool SClient::startReceiveSPITMessages() { if (!mSocket.getIsBound()) return false; mStopReceiveMessages = false; - mThreadReceive = new fos::TaskT(receiveSPITMessage, *this, "receiveTask", fos::Task::DefaultStackSize * 4); + mThreadReceive = new fos::TaskT(receiveSpitMessage, *this, "receiveTask", fos::Task::DefaultStackSize, fos::Task::MAX_PRIORITY-3); + mThreadProcess = new fos::TaskT(processSpitMessage, *this, "processTask", fos::Task::DefaultStackSize); return true; } @@ -233,7 +238,7 @@ void SClient::stopReceiveSPITMessages() { mStopReceiveMessages = true; } -void SClient::receiveSPITMessage(SClient &rM) { +void SClient::receiveSpitMessage(SClient &rM) { char buffer[MAXSPITMESSAGEBYTECOUNT + 1]; int rdLen; while (rM.mStopReceiveMessages == false) { @@ -244,13 +249,21 @@ void SClient::receiveSPITMessage(SClient &rM) { } continue; } - auto vec = vector(buffer, buffer + rdLen); - auto spitMsg = make_unique(vec); - rM.parseMessage(move(spitMsg)); - // rM.checkParseMessage(move(spitMsg)); + auto vec = make_unique>(buffer, buffer + rdLen); + + incommingSpit.enqueue(std::move(vec)); } } +void SClient::processSpitMessage(SClient &rM) { + while (true) { + auto data = *incommingSpit.dequeue(); + auto spitMsg = make_unique(data); + rM.parseMessage(move(spitMsg)); + } +} + + void SClient::resetMessageNumberReceived() { mMessageNumberReceived = -1; mOvertakingMessages.clear(); diff --git a/doc/LiveShowProject/CatasWatchProject.ldv b/doc/LiveShowProject/CatasWatchProject.ldv index 262022d..ecafe1c 100644 Binary files a/doc/LiveShowProject/CatasWatchProject.ldv and b/doc/LiveShowProject/CatasWatchProject.ldv differ diff --git a/doc/LiveShowProject/CatasWatchProject.lsc b/doc/LiveShowProject/CatasWatchProject.lsc index 06f4529..f22e3ae 100644 Binary files a/doc/LiveShowProject/CatasWatchProject.lsc and b/doc/LiveShowProject/CatasWatchProject.lsc differ diff --git a/doc/LiveShowProject/CatasWatchProject.lsd b/doc/LiveShowProject/CatasWatchProject.lsd index 070cb00..e714189 100644 Binary files a/doc/LiveShowProject/CatasWatchProject.lsd and b/doc/LiveShowProject/CatasWatchProject.lsd differ diff --git a/doc/LiveShowProject/CatasWatchProject.lsh b/doc/LiveShowProject/CatasWatchProject.lsh index 5ec3783..b40b76d 100644 Binary files a/doc/LiveShowProject/CatasWatchProject.lsh and b/doc/LiveShowProject/CatasWatchProject.lsh differ diff --git a/doc/LiveShowProject/CatasWatchProject.lsp b/doc/LiveShowProject/CatasWatchProject.lsp index 3be1e38..d1f4af9 100644 Binary files a/doc/LiveShowProject/CatasWatchProject.lsp and b/doc/LiveShowProject/CatasWatchProject.lsp differ diff --git a/doc/LiveShowProject/CatasWatchProject.spi b/doc/LiveShowProject/CatasWatchProject.spi index 7a51c8e..8580eb2 100644 Binary files a/doc/LiveShowProject/CatasWatchProject.spi and b/doc/LiveShowProject/CatasWatchProject.spi differ diff --git a/main/watchMain.cpp b/main/watchMain.cpp index faf2be1..80e4a53 100644 --- a/main/watchMain.cpp +++ b/main/watchMain.cpp @@ -666,10 +666,10 @@ void onProjectUpdate(SClient::ProjUpdate state, string projectId) { } bool onCheckSpitTypeVeto(bool knownType, bool createdByClient) { + return true; // Bypass veto if (!knownType || !createdByClient) { // Don't allow foreign SPITTypes return false; } - return true; } @@ -708,7 +708,7 @@ void onSpitType(SClient::ObjectEvent event, bool isRemote, const SType &sType) { // // onSpitObjectRemote(SClient::ObjectEvent::Changed, p_SPITType, *ptrSPITObject); // } // } - ESP_LOGI(TAG, "SPIT-REMOTE-Type CHANGED ID: %s GroupName: %s Name: %s confirmed: %d", sType.getID().data(), sType.GroupName.get().data(), sType.Name.get().data(), sType.getConfirmed()); + // ESP_LOGI(TAG, "SPIT-REMOTE-Type CHANGED ID: %s GroupName: %s Name: %s confirmed: %d", sType.getID().data(), sType.GroupName.get().data(), sType.Name.get().data(), sType.getConfirmed()); } else if (event == SClient::ObjectEvent::Deleted) { ESP_LOGD(TAG, "SPIT-REMOTE-Type Removed ID: %s GroupName: %s Name: %s\n", sType.getID().data(), sType.GroupName.get().data(), sType.Name.get().data()); } @@ -716,11 +716,11 @@ void onSpitType(SClient::ObjectEvent event, bool isRemote, const SType &sType) { if (event == SClient::ObjectEvent::Created) { // Whenever you provide an action for this SPITType take this over in your code. // call _SpitClient.setActionSPITType(sType.getID(), true); - ESP_LOGI(TAG, "NEW SPIT-Type ID: %s GroupName: %s Name: %s confirmed: %d", sType.getID().data(), sType.GroupName.get().data(), sType.Name.get().data(), sType.getConfirmed()); + // ESP_LOGI(TAG, "NEW SPIT-Type ID: %s GroupName: %s Name: %s confirmed: %d", sType.getID().data(), sType.GroupName.get().data(), sType.Name.get().data(), sType.getConfirmed()); } else if (event == SClient::ObjectEvent::Changed) { - ESP_LOGI(TAG, "SPIT-Type CHANGED ID: %s GroupName: %s Name: %s confirmed: %d", sType.getID().data(), sType.GroupName.get().data(), sType.Name.get().data(), sType.getConfirmed()); + // ESP_LOGI(TAG, "SPIT-Type CHANGED ID: %s GroupName: %s Name: %s confirmed: %d", sType.getID().data(), sType.GroupName.get().data(), sType.Name.get().data(), sType.getConfirmed()); } else if (event == SClient::ObjectEvent::Deleted) { - ESP_LOGI(TAG, "SPIT-Type Removed ID: %s GroupName: %s Name: %s\n", sType.getID().data(), sType.GroupName.get().data(), sType.Name.get().data()); + // ESP_LOGI(TAG, "SPIT-Type Removed ID: %s GroupName: %s Name: %s\n", sType.getID().data(), sType.GroupName.get().data(), sType.Name.get().data()); } } } @@ -734,11 +734,11 @@ void onSpitType(SClient::ObjectEvent event, bool isRemote, const SType &sType) { void onSpitObject(SClient::ObjectEvent event, bool isRemote, const SType &sType, const SObject &sObject) { if (isRemote) { if (event == SClient::ObjectEvent::Created) { - ESP_LOGI(TAG, "NEW SPIT-REMOTE-Object ID: %s Name: %s -> SPITType: %s", sObject.getID().data(), sObject.Name.get().data(), sType.Name.get().data()); + // ESP_LOGI(TAG, "NEW SPIT-REMOTE-Object ID: %s Name: %s -> SPITType: %s", sObject.getID().data(), sObject.Name.get().data(), sType.Name.get().data()); // This is a remote SPITObject which can be used to remote control the server. // If you want you can list this for later use } else if (event == SClient::ObjectEvent::Changed) { - ESP_LOGI(TAG, "SPIT-REMOTE-Object CHANGED ID: %s Name: %s -> SPITType: %s", sObject.getID().data(), sObject.Name.get().data(), sType.Name.get().data()); + // ESP_LOGI(TAG, "SPIT-REMOTE-Object CHANGED ID: %s Name: %s -> SPITType: %s", sObject.getID().data(), sObject.Name.get().data(), sType.Name.get().data()); } else if (event == SClient::ObjectEvent::Deleted) { ESP_LOGD(TAG, "SPIT-REMOTE-Object Removed ID: %s Name: %s\n", sObject.getID().data(), sObject.Name.get().data()); // This is a remote SPITObject @@ -746,7 +746,7 @@ void onSpitObject(SClient::ObjectEvent event, bool isRemote, const SType &sType, } } else { if (event == SClient::ObjectEvent::Created) { - ESP_LOGI(TAG, "NEW SPIT-Object ID: %s Name: %s -> SPITType: %s", sObject.getID().data(), sObject.Name.get().data(), sType.Name.get().data()); + // ESP_LOGI(TAG, "NEW SPIT-Object ID: %s Name: %s -> SPITType: %s", sObject.getID().data(), sObject.Name.get().data(), sType.Name.get().data()); // check your actions // Whenever you provide an action for this SPITObject take this over in your code. // call _SpitClient.setActionSPITObject(sObject.getID(), true); @@ -757,7 +757,7 @@ void onSpitObject(SClient::ObjectEvent event, bool isRemote, const SType &sType, // SPITObjects with other SPITTypes asscciated will trigger no actions } else if (event == SClient::ObjectEvent::Changed) { - ESP_LOGI(TAG, "SPIT-Object CHANGED ID: %s Name: %s -> SPITType: %s", sObject.getID().data(), sObject.Name.get().data(), sType.Name.get().data()); + // ESP_LOGI(TAG, "SPIT-Object CHANGED ID: %s Name: %s -> SPITType: %s", sObject.getID().data(), sObject.Name.get().data(), sType.Name.get().data()); } else if (event == SClient::ObjectEvent::Deleted) { ESP_LOGD(TAG, "SPIT-Object Removed ID: %s Name: %s\n", sObject.getID().data(), sObject.Name.get().data()); // Check your actions @@ -805,7 +805,7 @@ void onPlaySpitType(string p_PlayerID, string spitTypeId, bool p_PlayerIsRunning } if (p_Started == true) { auto command = ProvidedSpitActions[spitTypeId]; - ESP_LOGI(TAG, "Player: %s is running: %s Object", p_PlayerID.data(), spitTypeId.c_str()); + // ESP_LOGI(TAG, "Player: %s is running: %s Object", p_PlayerID.data(), spitTypeId.c_str()); commandQueue.enqueue(std::make_unique(command)); Syslog::logv(Syslog::Severity::Informational, "Got SPIT command for move ot : r%d", command.pos); } @@ -923,8 +923,8 @@ void app_main(void) { static int ipVersion = AF_INET; static fos::TaskT telnetSocket(telnetSocketTask, ipVersion, "tcpServer", 4096); static fos::TaskT dmxNode(dmxSocketTask, ipVersion, "dmxNode", 4096); - // static fos::Task spit(SpitClientApp, "SpitClient"); - static fos::Task mqtt(MqttThread, "MqttEndpoint"); + static fos::Task spit(SpitClientApp, "SpitClient"); + // static fos::Task mqtt(MqttThread, "MqttEndpoint"); // static Task otaUpdate(SystemFunctions::OtaTaskEntry, "otaTask", 8192); auto &store = NvsApi::getInstance();