From 7edc57784c767ac3acf34f741fc54b2e441909e7 Mon Sep 17 00:00:00 2001 From: Gustice Date: Sat, 15 Nov 2025 13:50:18 +0100 Subject: [PATCH] temp1 --- components/spit/include/spit_client.hpp | 58 +- components/spit/include/spit_processor.hpp | 124 ++- components/spit/src/spit_client.cpp | 512 ++---------- components/spit/src/spit_processor.cpp | 764 ++++++++---------- components/spit/uTest/spitProcessorTest.cpp | 8 +- .../spit/uTest/spitProcessor_complexTest.cpp | 8 +- 6 files changed, 470 insertions(+), 1004 deletions(-) diff --git a/components/spit/include/spit_client.hpp b/components/spit/include/spit_client.hpp index 3c4a22c..f5413fb 100644 --- a/components/spit/include/spit_client.hpp +++ b/components/spit/include/spit_client.hpp @@ -11,7 +11,6 @@ #include #include #include -#include "syslog.hpp" using namespace std; @@ -80,11 +79,6 @@ class SClient : ISadClient { string mServerComputerName{}; int mServerStepTime{-1}; - //--- Server Project --- - string mServerProjectID; - string mServerProjectName; - int mServerFramesPerSecond; - public: /** The ID of the client.
Every client instance should set an unique id*/ string getID() { return mID; } @@ -129,7 +123,7 @@ class SClient : ISadClient { // 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: - int sendSPITMessage(Message::OPPart & spitMessageOPPart); + int sendMessage(Message::OPPart & spitMessageOPPart); //--------------- ServerAutoDetection SAD --------------- public: @@ -179,11 +173,7 @@ class SClient : ISadClient { /** Used internally. When the connection to the SPITServer is lost an eventConnectionStatus will occur*/ void eventWatchdogLost(); //--------------- SPIT Project --------------- - private: - void parseReportProject(Message::ReportProject &message); - void parseCloseProject(Message::CloseProject &message); - public: /** Returns the SPITServer's project ID - may be the same as the project's name*/ string getServerProjectID(); /** Returns the SPITServer's project name*/ @@ -191,11 +181,6 @@ class SClient : ISadClient { /** Returns frame rate per second. This is the time resolution in which the server transmits time data. The unit of time data is always frames.*/ int getServerFramesPerSecond(); - private: - void parseRequestProjectTransfer(Message::RequestProjectTransfer &message); - void parseStartProjectTransfer(Message::StartProjectTransfer &message); - void parseEndProjectTransfer(Message::EndProjectTransfer &message); - public: static void sendProject(SClient *p_PtrSClient); @@ -231,31 +216,16 @@ class SClient : ISadClient { private: // receive SPIT-Types void parseReportType(Message::ReportType &message); - void parseRemoveSPITType(Message::RemoveType &message); - int sendSPITTypeInternal(SType &spitType); + int sendTypeInternal(SType &spitType); public: - /** - * If a client wants to change a SPITType, he should send it to the server.
- * If the SPITTye is a fixed one and not created by the client himself, then an eventSPITType can be sent from the server, which cancels the change.
- * @param spitypeID the id of the SPITType to remove. - * @return 0 = is sended, -1 = is not sended - */ - bool changeSPITType(SType *spitType); - /** - * If a client wants to remove a SPITType, he should send it to the server.
- * If the SPITTye is a fixed one and not created by the client himself, then an eventSPITType can be sent from the server, which cancels the deletion.
- * @param spitypeID the id of the SPITType to remove. - * @return 0 = is sended, -1 = is not sended - */ - int removeSPITType(string spitypeID); + bool changeType(SType *spitType) { return mProcessor.changeType(spitType); } + int removeType(string spitypeID) { return mProcessor.removeType(spitypeID); } public: //--------------- SPIT Objects --------------- private: - void parseReportSPITObject(Message::ReportObject &message); - void parseRemoveSPITObject(Message::RemoveObject &message); - int sendSPITObjectInternal(SObject *ptrObject); + int sendObjectInternal(SObject *sObject); public: /** @@ -265,21 +235,6 @@ class SClient : ISadClient { * @return 0 = sended, -1 = not sended */ bool changeSPITObject(SObject *spitObject); - /** - * When the client removes a SPITObject (normally the client should not do this), then he should send it to the SPITServer.
- * The SPITServer may discard the deletion and an eventSPITObject occurs.
- * @param objectID the id of the SPITObject to remove. - * @return 0 = sended, -1 = not sended - */ - int removeSPITObject(string objectID); - - public: - //--------------- Play SPIT Objects --------------- - private: - void parsePlaySPITStart(Message::PlayStart &message); - void parsePlaySPITObject(Message::PlayObject &message); - void parsePlaySPITEnd(Message::PlayEnd &message); - void parseReportPlayStatus(Message::ReportPlayStatus &message); public: //--------- Remote ---------- @@ -295,9 +250,6 @@ class SClient : ISadClient { void answerWatchdog() { sAnswered = true; } - - SpitRepo mSpitObjects; - SpitRepo mRemoteSpitObjects; }; } \ No newline at end of file diff --git a/components/spit/include/spit_processor.hpp b/components/spit/include/spit_processor.hpp index b168e7c..deae792 100644 --- a/components/spit/include/spit_processor.hpp +++ b/components/spit/include/spit_processor.hpp @@ -57,7 +57,10 @@ class SProcessor { }; struct InternalCallbacks { - function sendSpitTypeInternal; + function delay; + function sendMessage; + function sendTypeInternal; + function sendObjectInternal; }; // //------ PlayerType ------ @@ -99,20 +102,20 @@ class SProcessor { // string mClientProjectName; - // uint8_t mMessageNumberSend{1}; - // int mMessageNumberReceived{-1}; // set to -1 because the first received message will set the number (1..255) - // vector> mOvertakingMessages; + uint8_t mMessageNumberSend{1}; + int mMessageNumberReceived{-1}; // set to -1 because the first received message will set the number (1..255) + vector> mOvertakingMessages; // // Server's info filled by parseConnectAnswer - // string mServerID{}; + string mServerID{}; // string mServerName{}; // string mServerComputerName{}; // int mServerStepTime{-1}; // //--- Server Project --- - // string mServerProjectID; - // string mServerProjectName; - // int mServerFramesPerSecond; + string mServerProjectID; + string mServerProjectName; + int mServerFramesPerSecond; // public: // /** The ID of the client.
Every client instance should set an unique id*/ @@ -153,9 +156,9 @@ class SProcessor { // private: // // 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: - // std::vector createMessage(Message::OPPart & spitMessageOPPart); - // void checkParseMessageData(vector data); + public: + std::vector createMessage(Message::OPPart & spitMessageOPPart); + void checkParseMessageData(vector data); // //--------------- ServerAutoDetection SAD --------------- // public: @@ -191,7 +194,7 @@ class SProcessor { // private: // void disconnectInternal(Connection cause); // void resetMessageNumberReceived(); - // void parseMessage(Message& message); + void parseMessage(Message& message); // void addOvertakingMessage(unique_ptr message); // void parseConnectAnswer(Message::ConnectAnswer &message); // void parseDisconnect(Message::Disconnect &message); @@ -205,24 +208,23 @@ class SProcessor { // void eventWatchdogLost(); // //--------------- SPIT Project --------------- // private: - // void parseReportProject(Message::ReportProject &message); - // void parseCloseProject(Message::CloseProject &message); + public: // tood remove + void parseReportProject(Message::ReportProject &message); + void parseCloseProject(Message::CloseProject &message); - // public: - // /** Returns the SPITServer's project ID - may be the same as the project's name*/ - // string getServerProjectID(); - // /** Returns the SPITServer's project name*/ - // string getServerProjectName(); - // /** Returns frame rate per second. This is the time resolution in which the server transmits time data. The unit of time data is always frames.*/ - // int getServerFramesPerSecond(); + public: + /** Returns the SPITServer's project ID - may be the same as the project's name*/ + string getServerProjectID(); + /** Returns the SPITServer's project name*/ + string getServerProjectName(); + /** Returns frame rate per second. This is the time resolution in which the server transmits time data. The unit of time data is always frames.*/ + int getServerFramesPerSecond(); // private: - // void parseRequestProjectTransfer(Message::RequestProjectTransfer &message); - // void parseStartProjectTransfer(Message::StartProjectTransfer &message); - // void parseEndProjectTransfer(Message::EndProjectTransfer &message); - - // public: - // // static void sendProject(SClient *p_PtrSProcessor); + public: // todo remove + void parseRequestProjectTransfer(Message::RequestProjectTransfer &message); + void parseStartProjectTransfer(Message::StartProjectTransfer &message); + void parseEndProjectTransfer(Message::EndProjectTransfer &message); // // --------------- SPIT Types --------------- // public: @@ -255,55 +257,43 @@ class SProcessor { private: public: // @todo delete void parseReportType(Message::ReportType &message); - // void parseRemoveSPITType(Message::RemoveType &message); - // int sendSPITTypeInternal(SType &sType); + void parseRemoveType(Message::RemoveType &message); - // public: - // /** - // * If a client wants to change a SPITType, he should send it to the server.
- // * If the SPITTye is a fixed one and not created by the client himself, then an eventSPITType can be sent from the server, which cancels the change.
- // * @param spitypeID the id of the SPITType to remove. - // * @return 0 = is sended, -1 = is not sended - // */ - // bool changeSPITType(SType *spitType); - // /** - // * If a client wants to remove a SPITType, he should send it to the server.
- // * If the SPITTye is a fixed one and not created by the client himself, then an eventSPITType can be sent from the server, which cancels the deletion.
- // * @param spitypeID the id of the SPITType to remove. - // * @return 0 = is sended, -1 = is not sended - // */ - // int removeSPITType(string spitypeID); + public: + /** + * If a client wants to change a SPITType, he should send it to the server.
+ * If the SPITTye is a fixed one and not created by the client himself, then an eventSPITType can be sent from the server, which cancels the change.
+ * @param spitypeID the id of the SPITType to remove. + * @return 0 = is sended, -1 = is not sended + */ + bool changeType(SType *spitType); + /** + * If a client wants to remove a SPITType, he should send it to the server.
+ * If the SPITTye is a fixed one and not created by the client himself, then an eventSPITType can be sent from the server, which cancels the deletion.
+ * @param spitypeID the id of the SPITType to remove. + * @return 0 = is sended, -1 = is not sended + */ + int removeType(string spitypeID); // public: // //--------------- SPIT Objects --------------- // private: - // void parseReportSPITObject(Message::ReportObject &message); - // void parseRemoveSPITObject(Message::RemoveObject &message); +public: + void parseReportObject(Message::ReportObject &message); + void parseRemoveObject(Message::RemoveObject &message); // int sendSPITObjectInternal(SObject *ptrObject); // public: - // /** - // * When the client changes a SPITObject (normally the client should not do this), then it should send the changes to the SPITServer.
- // * The SPITServer may discard the changes and an eventSPITObject occurs.
- // * @param spitObject the pointer to the changed SPITObject. - // * @return 0 = sended, -1 = not sended - // */ - // bool changeSPITObject(SObject *spitObject); - // /** - // * When the client removes a SPITObject (normally the client should not do this), then he should send it to the SPITServer.
- // * The SPITServer may discard the deletion and an eventSPITObject occurs.
- // * @param objectID the id of the SPITObject to remove. - // * @return 0 = sended, -1 = not sended - // */ - // int removeSPITObject(string objectID); + int removeObject(string objectID); // public: // //--------------- Play SPIT Objects --------------- // private: - // void parsePlaySPITStart(Message::PlayStart &message); - // void parsePlaySPITObject(Message::PlayObject &message); - // void parsePlaySPITEnd(Message::PlayEnd &message); - // void parseReportPlayStatus(Message::ReportPlayStatus &message); + public: + void parsePlayStart(Message::PlayStart &message); + void parsePlayObject(Message::PlayObject &message); + void parsePlayEnd(Message::PlayEnd &message); + void parseReportPlayStatus(Message::ReportPlayStatus &message); // public: // //--------- Remote ---------- @@ -316,9 +306,9 @@ public: // @todo delete // sAnswered = true; // } - // SpitRepo mSpitObjects; - // SpitRepo mRemoteSpitObjects; - public: // @todo remove + public: // @todo remove + SpitRepo mSpitObjects; + SpitRepo mRemoteSpitObjects; SpitRepo mSpitTypes; SpitRepo mRemoteSpitTypes; }; diff --git a/components/spit/src/spit_client.cpp b/components/spit/src/spit_client.cpp index 4f11a89..74b36d8 100644 --- a/components/spit/src/spit_client.cpp +++ b/components/spit/src/spit_client.cpp @@ -20,7 +20,10 @@ SClient::SClient(string name, string projName, ISocket &socket, Callbacks calls) mProjName(projName), mProcessor(name, projName, getClientHostName(), createGUID(), calls, { - .sendSpitTypeInternal = [&](SType &sType) { return sendSPITTypeInternal(sType);} + .delay = [&](int ms){ return fos::Task::delayMs(ms); }, + .sendMessage = [&](Message::OPPart &msg){ return sendMessage(msg); }, + .sendTypeInternal = [&](SType &sType) { return sendTypeInternal(sType);}, + .sendObjectInternal = [&](SObject *sObject) { return sendObjectInternal(sObject);} } ), mSocket(socket) { @@ -37,7 +40,7 @@ void SClient::clientProjectClose() { if (mConnectionStatus == Connection::Ok) { ESP_LOGI(TAG, " ... tidy up ressources"); Message::CloseProject closeSPITProject(mProjName); - if (sendSPITMessage(closeSPITProject) < 0) { + if (sendMessage(closeSPITProject) < 0) { ESP_LOGD(TAG, "Client could not send Client's ReportProject"); } } @@ -46,19 +49,19 @@ void SClient::clientProjectClose() { void SClient::clientProjectLoaded() { // set confirmed = false for all SPITTypes and SPITObjects SType::setConfirmedFalse(mProcessor.mSpitTypes); - SObject::setConfirmedFalse(mSpitObjects); + SObject::setConfirmedFalse(mProcessor.mSpitObjects); if (mConnectionStatus == Connection::Ok) { // send ReportProject to the server Message::ReportProject reportSPITProject(mProjName, mProjName); reportSPITProject.setFramesPerSecond(0); - if (sendSPITMessage(reportSPITProject) < 0) { + if (sendMessage(reportSPITProject) < 0) { ESP_LOGD(TAG, "SPIT_CLient::clientProjectLoaded could not send Client's ReportProject"); } // send RequestProjectTransfer Message::RequestProjectTransfer sMRequestProjectTransfer; - if (sendSPITMessage(sMRequestProjectTransfer) < 0) { + if (sendMessage(sMRequestProjectTransfer) < 0) { ESP_LOGD(TAG, "SPIT_CLient::clientProjectLoaded could not send RequestProjectTransfer"); } } @@ -77,11 +80,11 @@ void SClient::setActionSPITType(string typeId, bool actionAssigned) { if (spitType == nullptr) return; if (spitType->ActionAssigned.set(actionAssigned)) { - sendSPITTypeInternal(*spitType); - for (auto& [key, value] : mSpitObjects.getRepo()) { + sendTypeInternal(*spitType); + for (auto& [key, value] : mProcessor.mSpitObjects.getRepo()) { if (value->SPITTypeID.get() == spitType->getID()) { if (value->setActionAssignedType(actionAssigned) == true) { - sendSPITObjectInternal(value.get()); + sendObjectInternal(value.get()); } } } @@ -90,11 +93,11 @@ void SClient::setActionSPITType(string typeId, bool actionAssigned) { /** This should be called if the user wants to associate/remove an action with a SPITObject. */ void SClient::setActionSPITObject(string spitObjId, bool actionAssigned) { - SObject *spitObject = mSpitObjects.getEntry(spitObjId); + SObject *spitObject = mProcessor.mSpitObjects.getEntry(spitObjId); if (spitObject == nullptr) return; if (spitObject->setActionAssigned(actionAssigned) == true) { - sendSPITObjectInternal(spitObject); + sendObjectInternal(spitObject); } } //---------- ServerAutoDetection SAD ----------- @@ -205,7 +208,7 @@ void SClient::eventServerChanged(SadDetectedServer &server) { // // } //Excample // } -int SClient::sendSPITMessage(Message::OPPart &opPart) { +int SClient::sendMessage(Message::OPPart &opPart) { if (mMessageNumberSend == 255) mMessageNumberSend = 1; else @@ -365,7 +368,7 @@ void SClient::parseMessage(unique_ptr message) { parseDisconnect(message->getAs()); break; case Message::ReportProject::OPFLAG: - parseReportProject(message->getAs()); + mProcessor.parseReportProject(message->getAs()); break; case Message::Watchdog::OPFLAG: parseWatchdog(message->getAs()); @@ -375,43 +378,43 @@ void SClient::parseMessage(unique_ptr message) { break; //----- SPIT Project ----- case Message::StartProjectTransfer::OPFLAG: - parseStartProjectTransfer(message->getAs()); + mProcessor.parseStartProjectTransfer(message->getAs()); break; case Message::CloseProject::OPFLAG: - parseCloseProject(message->getAs()); + mProcessor.parseCloseProject(message->getAs()); break; case Message::RequestProjectTransfer::OPFLAG: - parseRequestProjectTransfer(message->getAs()); + mProcessor.parseRequestProjectTransfer(message->getAs()); break; case Message::EndProjectTransfer::OPFLAG: - parseEndProjectTransfer(message->getAs()); + mProcessor.parseEndProjectTransfer(message->getAs()); break; //----- SPIT Types ------ case Message::ReportType::OPFLAG: mProcessor.parseReportType(message->getAs()); break; case Message::RemoveType::OPFLAG: - parseRemoveSPITType(message->getAs()); + mProcessor. parseRemoveType(message->getAs()); //----- SPIT Objects ------ break; case Message::ReportObject::OPFLAG: - parseReportSPITObject(message->getAs()); + mProcessor.parseReportObject(message->getAs()); break; case Message::RemoveObject::OPFLAG: - parseRemoveSPITObject(message->getAs()); + mProcessor.parseRemoveObject(message->getAs()); break; //----- Play SPIT Objects ------ case Message::PlayStart::OPFLAG: - parsePlaySPITStart(message->getAs()); + mProcessor.parsePlayStart(message->getAs()); break; case Message::PlayObject::OPFLAG: - parsePlaySPITObject(message->getAs()); + mProcessor.parsePlayObject(message->getAs()); break; case Message::PlayEnd::OPFLAG: - parsePlaySPITEnd(message->getAs()); + mProcessor.parsePlayEnd(message->getAs()); break; case Message::ReportPlayStatus::OPFLAG: - parseReportPlayStatus(message->getAs()); + mProcessor.parseReportPlayStatus(message->getAs()); break; default: ESP_LOGD(TAG, "Client::parseMessage: Unknown Message"); @@ -459,7 +462,7 @@ bool SClient::connect(string serverIP, string serverPort, string clientIP, strin // sleep a little to make sure that the reception of the messages is started fos::Task::delayMs(500); - if (sendSPITMessage(sMConnect) < 0) { + if (sendMessage(sMConnect) < 0) { mConnectionStatus = Connection::None; mStopReceiveMessages = true; return false; @@ -483,7 +486,7 @@ void SClient::disconnectInternal(Connection cause) { break; case Connection::None: { Message::Disconnect sMDisconnect; - sendSPITMessage(sMDisconnect); + sendMessage(sMDisconnect); } break; case Connection::NoneServer: break; @@ -505,7 +508,7 @@ void SClient::disconnectInternal(Connection cause) { ESP_LOGD(TAG, "connection terminated by server"); // call eventProjectClosed because this may not be sended by the server, // when the connection is closed - mCallbacks.onProjectUpdate(ProjUpdate::ServerClosed, mServerProjectID); + mCallbacks.onProjectUpdate(ProjUpdate::ServerClosed, mProcessor.getServerProjectID()); // Server has terminated the connection -> start a new game // _doReconnect = false; @@ -574,7 +577,7 @@ void SClient::parseDisconnect(Message::Disconnect &message) { void SClient::parseWatchdog(Message::Watchdog &message) { // ESP_LOGD(TAG, "parse Watchdog "); Message::WatchdogAnswer o_WatchdogAnswer; - sendSPITMessage(o_WatchdogAnswer); + sendMessage(o_WatchdogAnswer); } /** * The SPIT server sends a watchdog message at regular intervals. The client responds immediately with WatchdogAnswer @@ -588,7 +591,7 @@ void SClient::parseWatchdogAnswer(Message::WatchdogAnswer &message) { void SClient::sendWatchdog() { int intResult; Message::Watchdog message; - intResult = sendSPITMessage(message); + intResult = sendMessage(message); if (intResult < 0) { ESP_LOGW("WDT", "Failed to send Watchdog msg"); } @@ -601,130 +604,9 @@ void SClient::eventWatchdogLost() { } } -//----- SPIT Project ------ -void SClient::parseReportProject(Message::ReportProject &message) { - ESP_LOGD(TAG, "parse ReportProject"); - mServerProjectID = message.getProjectID(); - mServerProjectName = message.getProjectName(); - mServerFramesPerSecond = message.getFramesPerSecond(); - mCallbacks.onProjectUpdate(ProjUpdate::ServerLoaded, mServerProjectID); - - // Set all SPITTypes and SPITObjects confirmed = false - SType::setConfirmedFalse(mProcessor.mSpitTypes); - SObject::setConfirmedFalse(mSpitObjects); - - // Send RequestProjectTransfer - Message::RequestProjectTransfer sMRequestProjectTransfer; - if (sendSPITMessage(sMRequestProjectTransfer) < 0) { - ESP_LOGD(TAG, "Client::parseReportProject could not send RequestProjectTransfer"); - } - - // todo Don't send the ReportProject here it should be sended after parseEndProjectTransfer - // Send client's ReportProject - Message::ReportProject reportProject(mProjName, mProjName); - reportProject.setFramesPerSecond(0); - if (sendSPITMessage(reportProject) < 0) { - ESP_LOGD(TAG, "Client::parseReportProject could not send Client's ReportProject"); - } -} -void SClient::parseCloseProject(Message::CloseProject &p_CloseSPITProject) { - ESP_LOGD(TAG, "parse CloseProject"); - string stringProjectID; - mCallbacks.onProjectUpdate(ProjUpdate::ServerClosed, p_CloseSPITProject.getProjectID()); - SPlayer::clearPlayers(); -} - -string SClient::getServerProjectID() { return mServerProjectID; } -string SClient::getServerProjectName() { return mServerProjectName; } -int SClient::getServerFramesPerSecond() { return mServerFramesPerSecond; } - -void SClient::parseRequestProjectTransfer(Message::RequestProjectTransfer &message) { - ESP_LOGD(TAG, "parse RequestProjectTransfer"); - // StartProjectTransfer - Message::StartProjectTransfer sMStartProjectTransfer; - if (sendSPITMessage(sMStartProjectTransfer) < 0) { - return; - } - - // send all listes SPITTypes - for (const auto& [key, value] : mProcessor.mSpitTypes.getRepo()) { - sendSPITTypeInternal(*value); - fos::Task::delayMs(10); - } - for (auto& [key, value] : mSpitObjects.getRepo()) { - sendSPITObjectInternal(value.get()); - fos::Task::delayMs(10); - } - - // EndProjectTransfer - Message::EndProjectTransfer sMEndProjectTransfer; - sendSPITMessage(sMEndProjectTransfer); -} - -/* NEW IMPLEMENTATION - -void SClient::parseRequestProjectTransfer(Message::RequestProjectTransfer* message) { -// ESP_LOGD(TAG, "parse RequestProjectTransfer"); - thread* o_ThreadSend; - o_ThreadSend = new thread(&this->sendProject, this); - // int intResult; - // Message::StartProjectTransfer* ptrSMStartProjectTransfer; - // Message::EndProjectTransfer* ptrSMEndProjectTransfer; - // int intCount; - // SPITType* ptrSPITType; - // SObject* ptrSPITObject; - - - // //StartProjectTransfer - // NotifyStartProjectTransfer_Client* o_RunnableStart = new NotifyStartProjectTransfer_Client(mSPITClientInterface); - // SPIT_Handler::addRunnable(o_RunnableStart); - - // ptrSMStartProjectTransfer = new Message::StartProjectTransfer(); - // intResult = sendSPITMessage(ptrSMStartProjectTransfer); - // if (intResult < 0) { - // return; - // } - // mWatchdog->answerWatchdog(); - // { - // //send all listes SPITTypes - // unique_lock o_LockType(*SPITType::getMutex()); - // intCount = SPITType::getSPITTypeCount(); - // for (int i = 0; i < intCount; i++) { - // ptrSPITType = mSpitTypes.getEntry(i); - // if (ptrSPITType == nullptr) continue; - // intResult = sendSPITTypeInternal(ptrSPITType); - // if (intResult < 0) return; - // mWatchdog->answerWatchdog(); - // this_thread::sleep_for(chrono::milliseconds(7)); - // } - // } - - // { - // unique_lock o_LockObject(*SObject::getMutex()); - // intCount = mSpitObjects.getEntryCount(); - // for (int i = 0; i < intCount; i++) { - // ptrSPITObject = mSpitObjects.getEntry(i); - // if (ptrSPITObject == nullptr) continue; - // intResult = sendSPITObjectInternal(ptrSPITObject); - // if (intResult < 0) return; - // mWatchdog->answerWatchdog(); - // this_thread::sleep_for(chrono::milliseconds(7)); - // } - // } - - // //EndProjectTransfer - // ptrSMEndProjectTransfer = new Message::EndProjectTransfer(); - // intResult = sendSPITMessage(ptrSMEndProjectTransfer); - // if (intResult < 0) { - // return; - // } - // mWatchdog->answerWatchdog(); - // NotifyEndProjectTransfer_Client* o_RunnableEnd = new NotifyEndProjectTransfer_Client(mSPITClientInterface); - // SPIT_Handler::addRunnable(o_RunnableEnd); - - // //Send act -} -*/ +string SClient::getServerProjectID() { return mProcessor.getServerProjectID(); } +string SClient::getServerProjectName() { return mProcessor.getServerProjectName(); } +int SClient::getServerFramesPerSecond() { return mProcessor.getServerFramesPerSecond(); } void SClient::sendProject(SClient *p_PtrSPIT_Client) { // int intResult; @@ -739,7 +621,7 @@ void SClient::sendProject(SClient *p_PtrSPIT_Client) { // SPIT_Handler::addRunnable(o_RunnableStart); // ptrSMStartProjectTransfer = new Message::StartProjectTransfer(); - // intResult = p_PtrSPIT_Client->sendSPITMessage(ptrSMStartProjectTransfer); + // intResult = p_PtrSPIT_Client->sendMessage(ptrSMStartProjectTransfer); // if (intResult < 0) { // return; // } @@ -753,7 +635,7 @@ void SClient::sendProject(SClient *p_PtrSPIT_Client) { // ptrSPITType = mSpitTypes.getEntry(i); // if (ptrSPITType == nullptr) continue; // if (ptrSPITType->getCreatedByClient() == false) continue; - // intResult = p_PtrSPIT_Client->sendSPITTypeInternal(ptrSPITType); + // intResult = p_PtrSPIT_Client->sendTypeInternal(ptrSPITType); // if (intResult < 0) return; // // mWatchdog->answerWatchdog(); // this_thread::sleep_for(chrono::milliseconds(7)); @@ -767,7 +649,7 @@ void SClient::sendProject(SClient *p_PtrSPIT_Client) { // ptrSPITObject = mSpitObjects.getEntry(i); // if (ptrSPITObject == nullptr) continue; // if (ptrSPITObject->getCreatedByClient() == false) continue; - // intResult = p_PtrSPIT_Client->sendSPITObjectInternal(ptrSPITObject); + // intResult = p_PtrSPIT_Client->sendObjectInternal(ptrSPITObject); // if (intResult < 0) return; // // mWatchdog->answerWatchdog(); // this_thread::sleep_for(chrono::milliseconds(7)); @@ -776,7 +658,7 @@ void SClient::sendProject(SClient *p_PtrSPIT_Client) { // //EndProjectTransfer // ptrSMEndProjectTransfer = new Message::EndProjectTransfer(); - // intResult = p_PtrSPIT_Client->sendSPITMessage(ptrSMEndProjectTransfer); + // intResult = p_PtrSPIT_Client->sendMessage(ptrSMEndProjectTransfer); // if (intResult < 0) { // return; // } @@ -787,115 +669,16 @@ void SClient::sendProject(SClient *p_PtrSPIT_Client) { // //Send act } -void SClient::parseStartProjectTransfer(Message::StartProjectTransfer &message) { - mCallbacks.onProjectUpdate(ProjUpdate::StartTransfer, mServerProjectID); -} -void SClient::parseEndProjectTransfer(Message::EndProjectTransfer &message) { - SObject::clearUnconfirmedObjects(mSpitObjects); - mCallbacks.onProjectUpdate(ProjUpdate::EndTransfer, mServerProjectID); - - // Send Message::ReportProject after the mSPITClientInterface is notfied of EndProjectTransfer - Message::ReportProject reportSPITProject(mProjName, mProjName); - reportSPITProject.setFramesPerSecond(0); - if (sendSPITMessage(reportSPITProject) < 0) { - ESP_LOGD(TAG, "Client::parseReportProject could not send Client's ReportProject"); - } -} - -void SClient::parseRemoveSPITType(Message::RemoveType &message) { - ESP_LOGD(TAG, "parse RemoveType %s", message.getID().c_str()); - bool boolRemote = false; - string stringSPITTypeID = message.getID(); - - SType *ptrSPITType = mProcessor.mRemoteSpitTypes.getEntry(stringSPITTypeID); - if (!ptrSPITType) { - boolRemote = true; - } else { - ptrSPITType = mProcessor.mSpitTypes.getEntry(stringSPITTypeID); - if (!ptrSPITType) { - boolRemote = false; - } else { - // No SPITType with stringSPITTypeID is listet - return; - } - } - - if (ptrSPITType->getCreatedByClient() && ptrSPITType->Fixed.get()) { - // the SPITyte is created by client himself and it is fixed -> don't remove the SPITType!! - // Send the SPITTyp back to the server - sendSPITTypeInternal(*ptrSPITType); - return; - } - - mCallbacks.onSpitType(ObjectEvent::Deleted, boolRemote, *ptrSPITType); - if (boolRemote == false) { - mProcessor.mSpitTypes.removeEntry(*ptrSPITType); - } else { - mProcessor.mRemoteSpitTypes.removeEntry(*ptrSPITType); - } -} - /** * If a client has changed a SPITType, it should send it to the server to transmit the changes. * If the SPITType is a fixed one and not created by the client himself, then an eventSPITType can be sent from the server, which cancels the changes. * @param p_SPITType the pointer to the changed SPITType * @return 0 = is sended, -1 = is not sended */ -int SClient::sendSPITTypeInternal(SType &p_SPITType) { +int SClient::sendTypeInternal(SType &p_SPITType) { Message::ReportType sMReportSPITType; p_SPITType.fillMessageOP(sMReportSPITType); - return sendSPITMessage(sMReportSPITType); -} - -/** - * Change an existing SPIT_Type. - * @param p_SPITType the SPITType vont - * @return true = changed, false = not changed maybe p_SPITType is NULL or the SPITType doesn't exists - */ -bool SClient::changeSPITType(SType *p_SPITType) { - if (p_SPITType == nullptr) - return false; - SType *ptrSPITType = mProcessor.mSpitTypes.getEntry(p_SPITType->getID()); - if (ptrSPITType == nullptr) - return false; - - ptrSPITType->DefaultDelay.set(p_SPITType->DefaultDelay.get()); - ptrSPITType->DefaultDuration.set(p_SPITType->DefaultDuration.get()); - ptrSPITType->Fixed.set(p_SPITType->Fixed.get()); - ptrSPITType->GroupName.set(p_SPITType->GroupName.get()); - ptrSPITType->Name.set(p_SPITType->Name.get()); - ptrSPITType->ProjectIndepended.set(p_SPITType->ProjectIndepended.get()); - - mCallbacks.onSpitType(ObjectEvent::Changed, false, *ptrSPITType); - sendSPITTypeInternal(*ptrSPITType); - - return true; -} - -/** - * If a client has removed a SPITType where id == p_SPITTypeID, it should send it to the server. - * The corresponding SPITType if listet in SPITType will be deleted. - * An eventRemoveSPITType will occur. - * If a connection to a SPITServer is established, the SPITServer may dicard the deletion an an eventSPITType will occur - * -> the SPITType will be listet again. - * @param p_SPITType the id of the SPITType ro remove - * @return 0 = is sended, -1 = is not sended - */ -int SClient::removeSPITType(string p_SPITTypeID) { - if (p_SPITTypeID.length() <= 0) - return -1; - SType *ptrSPITType; - { - ptrSPITType = mProcessor.mSpitTypes.getEntry(p_SPITTypeID); - if (ptrSPITType == nullptr) - return -1; - Message::RemoveType sMRemoveSPITType; - ptrSPITType->fillMessageOP(sMRemoveSPITType); - mCallbacks.onSpitType(ObjectEvent::Deleted, false, *ptrSPITType); - mProcessor.mSpitTypes.removeEntry(*ptrSPITType); - return sendSPITMessage(sMRemoveSPITType); - } - return -1; + return sendMessage(sMReportSPITType); } SType *SClient::createTypeFixed(string iD, string p_GroupName, string p_Name, uint64_t p_DefaultDelay, uint64_t p_DefaultDuration) { @@ -923,113 +706,17 @@ SType *SClient::createType(string p_ID, string p_GroupName, string p_Name, uint6 auto eventType = boolNew ? ObjectEvent::Created : ObjectEvent::Changed; mCallbacks.onSpitType(eventType, false, *ptrSPITType); - sendSPITTypeInternal(*ptrSPITType); + sendTypeInternal(*ptrSPITType); return ptrSPITType; } -//----- SPIT Objects ------ -void SClient::parseReportSPITObject(Message::ReportObject &message) { - ESP_LOGD(TAG, "parse ReportObject %s", message.getID().c_str()); - SObject *ptrSPITObject; - SType *ptrSPITType; - bool boolNew = false; - bool boolRemote = false; - bool boolChanged = false; - { - ESP_LOGD(TAG, "parse ReportObject %s / %s", message.getID().c_str(), message.getName().c_str()); - if (message.getServerRemote() == false) { - boolRemote = false; - ptrSPITObject = mSpitObjects.getEntry(message.getID()); - ptrSPITType = mProcessor.mSpitTypes.getEntry(message.getSPITTypeID()); - - if (ptrSPITType == nullptr) { - // No associated SPITType found - if (ptrSPITObject != nullptr) { - // SpitObject exists but has no corresponding SPITType -> remove the SPITObject without sending a message - // Maybe the SPITObject has changed the SPITTypeID to a SPITTypeID of another board - mSpitObjects.removeEntry(*ptrSPITObject); - } - return; - } - bool isKnownType = ptrSPITType != nullptr; - if (ptrSPITObject == nullptr) { - // The user's app my veto the SPITType - if (mCallbacks.onCheckSpitObjectVeto(isKnownType) == false) { - ESP_LOGW(TAG, "ObjectVeto %s / %s", message.getID().c_str(), message.getName().c_str()); - return; - } - auto spitObj = make_unique(message.getID()); - ptrSPITObject = spitObj.get(); - mSpitObjects.addEntry(move(spitObj)); - boolNew = true; - } else { - // The user's app my veto the SPITType - if (mCallbacks.onCheckSpitObjectVeto(isKnownType) == false) { - // SpitObject exists and User APp denied the SPITObject -> remove the SPITObject without sending a message - mSpitObjects.removeEntry(*ptrSPITObject); - ESP_LOGW(TAG, "TypeVeto %s / %s", message.getID().c_str(), message.getName().c_str()); - return; - } - } - } else { - boolRemote = true; - ptrSPITObject = mRemoteSpitObjects.getEntry(message.getID()); - ptrSPITType = mProcessor.mRemoteSpitTypes.getEntry(message.getSPITTypeID()); - if (ptrSPITType == nullptr) { - // No associated SPITType found - return; - } - if (ptrSPITObject == nullptr) { - auto spitObj = make_unique(message.getID()); - ptrSPITObject = spitObj.get(); - mRemoteSpitObjects.addEntry(move(spitObj)); - boolNew = true; - } - } - - if (!ptrSPITObject->setMessageOP(&message)) { - ESP_LOGE(TAG, "Change not allowed"); - // setMessageOP error - the SPITObject can't be changed, it may be fixed and crated by this client - sendSPITObjectInternal(ptrSPITObject); - return; - } - - if (boolRemote == false) { - // set the virtual action assignment - ptrSPITObject->setActionAssignedType(ptrSPITType->ActionAssigned.get()); - } - - auto eventType = boolNew ? ObjectEvent::Created : ObjectEvent::Changed; - mCallbacks.onSpitObject(eventType, boolRemote, *ptrSPITType, *ptrSPITObject); - - if (ptrSPITObject->setConfirmed(true) == true || boolChanged == true) { - // Confirmation has changed - sendSPITObjectInternal(ptrSPITObject); - } - } -} -void SClient::parseRemoveSPITObject(Message::RemoveObject &message) { - ESP_LOGD(TAG, "parse RemoveObject %s", message.getID().c_str()); - SObject *ptrSPITObject = mRemoteSpitObjects.getEntry(message.getID()); - if (ptrSPITObject != nullptr) { - SType *ptrSPITType = mProcessor.mRemoteSpitTypes.getEntry(ptrSPITObject->SPITTypeID.get()); - if (ptrSPITType != nullptr) { - mCallbacks.onSpitObject(ObjectEvent::Deleted, true, *ptrSPITType, *ptrSPITObject); - } - mRemoteSpitObjects.removeEntry(*ptrSPITObject); - } else { - // call removeSPITObject, this will notify the server that the object is removed - removeSPITObject(message.getID()); - } -} - -int SClient::sendSPITObjectInternal(SObject *ptrSPITObject) { +int SClient::sendObjectInternal(SObject *ptrSPITObject) { if (ptrSPITObject == nullptr) return -1; Message::ReportObject sMReportSPITObject; ptrSPITObject->fillMessageOP(sMReportSPITObject); - return sendSPITMessage(sMReportSPITObject); + return sendMessage(sMReportSPITObject); } /** * When the client changes an existing SPITObject (normally the client should not do this), then he should send the changes to the SPITServer. @@ -1045,7 +732,7 @@ bool SClient::changeSPITObject(SObject *obj) { SObject *ptrSPITObject; SType *ptrSPITType; { - ptrSPITObject = mSpitObjects.getEntry(obj->getID()); + ptrSPITObject = mProcessor.mSpitObjects.getEntry(obj->getID()); if (ptrSPITObject == nullptr) return false; ptrSPITType = mProcessor.mSpitTypes.getEntry(obj->getID()); @@ -1070,112 +757,11 @@ bool SClient::changeSPITObject(SObject *obj) { ptrSPITObject->ValueUse.set(obj->ValueUse.get()); mCallbacks.onSpitObject(ObjectEvent::Changed, false, *ptrSPITType, *ptrSPITObject); - sendSPITObjectInternal(ptrSPITObject); + sendObjectInternal(ptrSPITObject); } return true; } -/** - * When the client wants to remove a SPITObject with id == p_SPITObjectID (normally the client should not do this), then he should send it to the SPITServer. - * The corresponding SPITObject if listet in SPITObject will be deleted. - * An eventRemoveSPITType will occur. - * If an connection to a SPITServer is established, the SPITServer may discard the deletion and an eventSPITObject occurs - * -> the SPITObject is listet again. - * @param objId the id of the SPITObject to remove. - * @return 0 = sended to the SPITServer, -1 = not sended to the SPITServer or nos SPITObject with id == objId exists. - */ -int SClient::removeSPITObject(string objId) { - if (objId.length() <= 0) - return -1; - SType *ptrSPITType; - SObject *ptrSPITObject; - { - Message::RemoveObject sMRemoveSPITObject; - - ptrSPITObject = mSpitObjects.getEntry(objId); - if (ptrSPITObject == nullptr) - return -1; - ptrSPITType = mProcessor.mSpitTypes.getEntry(ptrSPITObject->SPITTypeID.get()); - if (ptrSPITType == nullptr) - return -1; - ptrSPITObject->fillMessageOP(sMRemoveSPITObject); - mCallbacks.onSpitObject(ObjectEvent::Deleted, false, *ptrSPITType, *ptrSPITObject); - mSpitObjects.removeEntry(*ptrSPITObject); - return sendSPITMessage(sMRemoveSPITObject); - } - return -1; -} - -//----- Play SPIT Objects ------ - -void SClient::parsePlaySPITStart(Message::PlayStart &message) { - ESP_LOGD(TAG, "parse PlayStart ID: %s Name: %s Running: %d", message.getPlayerID().c_str(), message.getPlayerName().c_str(), (int)message.getPlayerIsRunning()); - SPlayer &spitPlayer = SPlayer::getSPITPlayer(message.getPlayerID()); - spitPlayer.setIsRunning(message.getPlayerIsRunning()); - spitPlayer.setName(message.getPlayerName()); - spitPlayer.setType(message.getPlayerType()); - spitPlayer.setTime(message.getTime()); - spitPlayer.startPlaySequence(); - - mCallbacks.onPlay(spitPlayer.getID(), spitPlayer.getName(), spitPlayer.getType(), spitPlayer.getIsRunning(), spitPlayer.getTime()); -} -void SClient::parsePlaySPITObject(Message::PlayObject &message) { - - SPlayer &ptrSPITPlayer = SPlayer::getSPITPlayer(message.getPlayerID()); - SObject *ptrSPITObject = mSpitObjects.getEntry(message.getSPITObjectID()); - - if (ptrSPITObject == nullptr) { - return; - } - SPlayer::PlayType *ptrPlaySPITType = ptrSPITPlayer.addTypePlaying(ptrSPITObject->SPITTypeID.get()); - if (ptrPlaySPITType == nullptr) { - return; - } - ptrPlaySPITType->setPlayerIsRunning(ptrSPITPlayer.getIsRunning()); - ptrPlaySPITType->addValue(((double)message.getValue() / 1000000), ((double)ptrSPITObject->ValueFactor.get() / 1000000)); -} - -void SClient::parsePlaySPITEnd(Message::PlayEnd &message) { - SPlayer &ptrSPITPlayer = SPlayer::getSPITPlayer(message.getPlayerID()); - - auto &ptrPlaySPITTypes = ptrSPITPlayer.getPlaySPITTypes(); - for (auto i = ptrPlaySPITTypes.begin(); i != ptrPlaySPITTypes.end(); i++) { - SPlayer::PlayType *ptrPlaySPITType = i->second.get(); - bool boolStarted = ptrPlaySPITType->getIsNew(); - bool boolStopped = (ptrPlaySPITType->getIsPlayed() == false); - SType *ptrSPITType = mProcessor.mSpitTypes.getEntry(ptrPlaySPITType->getSPITTypeID()); - if (ptrSPITType == nullptr) { - // set isplayed to false, the ptrPlayObject will be removed by ptrSPITPlayer.endPlaySequence() - ptrPlaySPITType->setIsPlayed(false); - continue; - } - mCallbacks.onPlaySpitType(ptrPlaySPITType->getPlayerID(), ptrPlaySPITType->getSPITTypeID(), ptrPlaySPITType->getPlayerIsRunning(), boolStarted, boolStopped, ptrPlaySPITType->getValue()); - } - ptrSPITPlayer.endPlaySequence(); -} - -void SClient::parseReportPlayStatus(Message::ReportPlayStatus &message) { - SType *ptrSPITType = NULL; - - SObject *ptrSPITObject = mRemoteSpitObjects.getEntry(message.getID()); - if (ptrSPITObject == nullptr) { - ptrSPITObject = mSpitObjects.getEntry(message.getID()); - if (ptrSPITObject == nullptr) { - return; - } - } - if (ptrSPITObject->ServerRemote.get() == false) { - ptrSPITType = mProcessor.mSpitTypes.getEntry(ptrSPITObject->SPITTypeID.get()); - } else { - ptrSPITType = mProcessor.mRemoteSpitTypes.getEntry(ptrSPITObject->SPITTypeID.get()); - } - - if (ptrSPITType == nullptr) { - return; - } - mCallbacks.onPlayRemoteObjectStatus(*ptrSPITType, *ptrSPITObject, message.getFrameInsideObject(), message.getValue()); -} - //--------- Remote ---------- /** @@ -1193,14 +779,14 @@ void SClient::parseReportPlayStatus(Message::ReportPlayStatus &message) { * VALUEFLAG_DECREASE (0x01) The server decreases his existing value by valuePpm */ void SClient::sendRemoteObject(string p_SPITObjectID, int valuePpm, char valueFlag) { - SObject *ptrRemoteSPITObject = mRemoteSpitObjects.getEntry(p_SPITObjectID); + SObject *ptrRemoteSPITObject = mProcessor.mRemoteSpitObjects.getEntry(p_SPITObjectID); if (ptrRemoteSPITObject == nullptr) return; Message::PlayStart playSPITStart(mID, mProjName, PLAYERTYPE_DISCRETE); playSPITStart.setPlayerIsRunning(false); playSPITStart.setTime(0); - sendSPITMessage(playSPITStart); + sendMessage(playSPITStart); Message::PlayObject playSPITObject; playSPITObject.setID(ptrRemoteSPITObject->getID()); @@ -1208,10 +794,10 @@ void SClient::sendRemoteObject(string p_SPITObjectID, int valuePpm, char valueFl playSPITObject.setPlayerID(mID); playSPITObject.setValue(valuePpm); playSPITObject.setValueFlag(valueFlag); - sendSPITMessage(playSPITObject); + sendMessage(playSPITObject); Message::PlayEnd playSPITEnd(mID); - sendSPITMessage(playSPITEnd); + sendMessage(playSPITEnd); } fos::Semaphore SClient::sStartSad; diff --git a/components/spit/src/spit_processor.cpp b/components/spit/src/spit_processor.cpp index 080d234..312b561 100644 --- a/components/spit/src/spit_processor.cpp +++ b/components/spit/src/spit_processor.cpp @@ -27,7 +27,7 @@ SProcessor::~SProcessor() { // if (mConnectionStatus == Connection::Ok) { // ESP_LOGI(TAG, " ... tidy up ressources"); // Message::CloseProject closeSPITProject(mProjName); -// // if (sendSPITMessage(closeSPITProject) < 0) { +// // if (mInternCallbacks.sendMessage(closeSPITProject) < 0) { // // ESP_LOGD(TAG, "Client could not send Client's ReportProject"); // // } // } @@ -42,13 +42,13 @@ SProcessor::~SProcessor() { // // send ReportProject to the server // Message::ReportProject reportSPITProject(mProjName, mProjName); // reportSPITProject.setFramesPerSecond(0); -// // if (sendSPITMessage(reportSPITProject) < 0) { +// // if (mInternCallbacks.sendMessage(reportSPITProject) < 0) { // // ESP_LOGD(TAG, "SPIT_CLient::clientProjectLoaded could not send Client's ReportProject"); // // } // // send RequestProjectTransfer // Message::RequestProjectTransfer sMRequestProjectTransfer; -// // if (sendSPITMessage(sMRequestProjectTransfer) < 0) { +// // if (mInternCallbacks.sendMessage(sMRequestProjectTransfer) < 0) { // // ESP_LOGD(TAG, "SPIT_CLient::clientProjectLoaded could not send RequestProjectTransfer"); // // } // } @@ -67,7 +67,7 @@ SProcessor::~SProcessor() { // if (spitType == nullptr) // return; // if (spitType->ActionAssigned.set(actionAssigned)) { -// sendSPITTypeInternal(*spitType); +// sendTypeInternal(*spitType); // for (auto& [key, value] : mSpitObjects.getRepo()) { // if (value->SPITTypeID.get() == spitType->getID()) { // if (value->setActionAssignedType(actionAssigned) == true) { @@ -211,7 +211,7 @@ SProcessor::~SProcessor() { // } // return {}; // } -// // todo Delete SProcessor::sendSPITMessage(Message::OPPart &opPart +// // todo Delete SProcessor::mInternCallbacks.sendMessage(Message::OPPart &opPart // // void SProcessor::receiveSPITMessage(SClient &rM) { // // char buffer[MAXSPITMESSAGEBYTECOUNT + 1]; @@ -357,7 +357,7 @@ SProcessor::~SProcessor() { // //----- SPIT Objects ------ // break; // case Message::ReportObject::OPFLAG: -// parseReportSPITObject(message.getAs()); +// parseReportObject(message.getAs()); // break; // case Message::RemoveObject::OPFLAG: // parseRemoveSPITObject(message.getAs()); @@ -421,7 +421,7 @@ SProcessor::~SProcessor() { // // sleep a little to make sure that the reception of the messages is started // // fos::Task::delayMs(500); -// // if (sendSPITMessage(sMConnect) < 0) { +// // if (mInternCallbacks.sendMessage(sMConnect) < 0) { // // mConnectionStatus = Connection::None; // // mStopReceiveMessages = true; // // return false; @@ -445,7 +445,7 @@ SProcessor::~SProcessor() { // break; // case Connection::None: { // Message::Disconnect sMDisconnect; -// // sendSPITMessage(sMDisconnect); +// // mInternCallbacks.sendMessage(sMDisconnect); // } break; // case Connection::NoneServer: // break; @@ -536,7 +536,7 @@ SProcessor::~SProcessor() { // void SProcessor::parseWatchdog(Message::Watchdog &message) { // // ESP_LOGD(TAG, "parse Watchdog "); // Message::WatchdogAnswer o_WatchdogAnswer; -// // sendSPITMessage(o_WatchdogAnswer); +// // mInternCallbacks.sendMessage(o_WatchdogAnswer); // } // /** // * The SPIT server sends a watchdog message at regular intervals. The client responds immediately with WatchdogAnswer @@ -550,7 +550,7 @@ SProcessor::~SProcessor() { // void SProcessor::sendWatchdog() { // int intResult{}; // Message::Watchdog message; -// // intResult = sendSPITMessage(message); +// // intResult = mInternCallbacks.sendMessage(message); // if (intResult < 0) { // ESP_LOGW("WDT", "Failed to send Watchdog msg"); // } @@ -563,65 +563,66 @@ SProcessor::~SProcessor() { // } // } -// //----- SPIT Project ------ -// void SProcessor::parseReportProject(Message::ReportProject &message) { -// ESP_LOGD(TAG, "parse ReportProject"); -// mServerProjectID = message.getProjectID(); -// mServerProjectName = message.getProjectName(); -// mServerFramesPerSecond = message.getFramesPerSecond(); -// mCallbacks.onProjectUpdate(ProjUpdate::ServerLoaded, mServerProjectID); +//----- SPIT Project ------ +void SProcessor::parseReportProject(Message::ReportProject &message) { + ESP_LOGD(TAG, "parse ReportProject"); + mServerProjectID = message.getProjectID(); + mServerProjectName = message.getProjectName(); + mServerFramesPerSecond = message.getFramesPerSecond(); + mCallbacks.onProjectUpdate(ProjUpdate::ServerLoaded, mServerProjectID); -// // Set all SPITTypes and SPITObjects confirmed = false -// SType::setConfirmedFalse(mSpitTypes); -// SObject::setConfirmedFalse(mSpitObjects); + // Set all SPITTypes and SPITObjects confirmed = false + SType::setConfirmedFalse(mSpitTypes); + SObject::setConfirmedFalse(mSpitObjects); -// // Send RequestProjectTransfer -// Message::RequestProjectTransfer sMRequestProjectTransfer; -// // if (sendSPITMessage(sMRequestProjectTransfer) < 0) { -// // ESP_LOGD(TAG, "Client::parseReportProject could not send RequestProjectTransfer"); -// // } + // Send RequestProjectTransfer + Message::RequestProjectTransfer sMRequestProjectTransfer; + if (mInternCallbacks.sendMessage(sMRequestProjectTransfer) < 0) { + ESP_LOGD(TAG, "Client::parseReportProject could not send RequestProjectTransfer"); + } -// // todo Don't send the ReportProject here it should be sended after parseEndProjectTransfer -// // Send client's ReportProject -// Message::ReportProject reportProject(mProjName, mProjName); -// reportProject.setFramesPerSecond(0); -// // if (sendSPITMessage(reportProject) < 0) { -// // ESP_LOGD(TAG, "Client::parseReportProject could not send Client's ReportProject"); -// // } -// } -// void SProcessor::parseCloseProject(Message::CloseProject &p_CloseSPITProject) { -// ESP_LOGD(TAG, "parse CloseProject"); -// string stringProjectID; -// mCallbacks.onProjectUpdate(ProjUpdate::ServerClosed, p_CloseSPITProject.getProjectID()); -// SPlayer::clearPlayers(); -// } + // todo Don't send the ReportProject here it should be sended after parseEndProjectTransfer + // Send client's ReportProject + Message::ReportProject reportProject(mProjName, mProjName); + reportProject.setFramesPerSecond(0); + if (mInternCallbacks.sendMessage(reportProject) < 0) { + ESP_LOGD(TAG, "Client::parseReportProject could not send Client's ReportProject"); + } +} -// string SProcessor::getServerProjectID() { return mServerProjectID; } -// string SProcessor::getServerProjectName() { return mServerProjectName; } -// int SProcessor::getServerFramesPerSecond() { return mServerFramesPerSecond; } +void SProcessor::parseCloseProject(Message::CloseProject &p_CloseSPITProject) { + ESP_LOGD(TAG, "parse CloseProject"); + string stringProjectID; + mCallbacks.onProjectUpdate(ProjUpdate::ServerClosed, p_CloseSPITProject.getProjectID()); + SPlayer::clearPlayers(); +} -// void SProcessor::parseRequestProjectTransfer(Message::RequestProjectTransfer &message) { -// ESP_LOGD(TAG, "parse RequestProjectTransfer"); -// // StartProjectTransfer -// Message::StartProjectTransfer sMStartProjectTransfer; -// // if (sendSPITMessage(sMStartProjectTransfer) < 0) { -// // return; -// // } +string SProcessor::getServerProjectID() { return mServerProjectID; } +string SProcessor::getServerProjectName() { return mServerProjectName; } +int SProcessor::getServerFramesPerSecond() { return mServerFramesPerSecond; } -// // send all listes SPITTypes -// for (const auto& [key, value] : mSpitTypes.getRepo()) { -// sendSPITTypeInternal(*value); -// // fos::Task::delayMs(10); -// } -// for (auto& [key, value] : mSpitObjects.getRepo()) { -// sendSPITObjectInternal(value.get()); -// // fos::Task::delayMs(10); -// } +void SProcessor::parseRequestProjectTransfer(Message::RequestProjectTransfer &message) { + ESP_LOGD(TAG, "parse RequestProjectTransfer"); + // StartProjectTransfer + Message::StartProjectTransfer sMStartProjectTransfer; + if (mInternCallbacks.sendMessage(sMStartProjectTransfer) < 0) { + return; + } -// // EndProjectTransfer -// Message::EndProjectTransfer sMEndProjectTransfer; -// // sendSPITMessage(sMEndProjectTransfer); -// } + // send all listes SPITTypes + for (const auto& [key, value] : mSpitTypes.getRepo()) { + mInternCallbacks.sendTypeInternal(*value); + mInternCallbacks.delay(10); + } + for (auto& [key, value] : mSpitObjects.getRepo()) { + mInternCallbacks.sendObjectInternal(value.get()); + mInternCallbacks.delay(10); + } + + // EndProjectTransfer + Message::EndProjectTransfer sMEndProjectTransfer; + // mInternCallbacks.sendMessage(sMEndProjectTransfer); +} // /* NEW IMPLEMENTATION @@ -641,7 +642,7 @@ SProcessor::~SProcessor() { // // SPIT_Handler::addRunnable(o_RunnableStart); // // ptrSMStartProjectTransfer = new Message::StartProjectTransfer(); -// // intResult = sendSPITMessage(ptrSMStartProjectTransfer); +// // intResult = mInternCallbacks.sendMessage(ptrSMStartProjectTransfer); // // if (intResult < 0) { // // return; // // } @@ -653,7 +654,7 @@ SProcessor::~SProcessor() { // // for (int i = 0; i < intCount; i++) { // // ptrSPITType = mSpitTypes.getEntry(i); // // if (ptrSPITType == nullptr) continue; -// // intResult = sendSPITTypeInternal(ptrSPITType); +// // intResult = mInternCallbacks.sendTypeInternal(ptrSPITType); // // if (intResult < 0) return; // // mWatchdog->answerWatchdog(); // // this_thread::sleep_for(chrono::milliseconds(7)); @@ -675,7 +676,7 @@ SProcessor::~SProcessor() { // // //EndProjectTransfer // // ptrSMEndProjectTransfer = new Message::EndProjectTransfer(); -// // intResult = sendSPITMessage(ptrSMEndProjectTransfer); +// // intResult = mInternCallbacks.sendMessage(ptrSMEndProjectTransfer); // // if (intResult < 0) { // // return; // // } @@ -687,87 +688,27 @@ SProcessor::~SProcessor() { // } // */ -// // void SProcessor::sendProject(SClient *p_PtrSPIT_Client) { -// // int intResult; -// // Message::StartProjectTransfer* ptrSMStartProjectTransfer; -// // Message::EndProjectTransfer* ptrSMEndProjectTransfer; -// // int intCount; -// // SPITType* ptrSPITType; -// // SObject* ptrSPITObject; +void SProcessor::parseStartProjectTransfer(Message::StartProjectTransfer &message) { + mCallbacks.onProjectUpdate(ProjUpdate::StartTransfer, mServerProjectID); +} -// // //StartProjectTransfer -// // NotifyStartProjectTransfer_Client* o_RunnableStart = new NotifyStartProjectTransfer_Client(p_PtrSPIT_Client->getSPITClientInterface()); -// // SPIT_Handler::addRunnable(o_RunnableStart); +void SProcessor::parseEndProjectTransfer(Message::EndProjectTransfer &message) { + SObject::clearUnconfirmedObjects(mSpitObjects); + mCallbacks.onProjectUpdate(ProjUpdate::EndTransfer, mServerProjectID); -// // ptrSMStartProjectTransfer = new Message::StartProjectTransfer(); -// // intResult = p_PtrSPIT_Client->sendSPITMessage(ptrSMStartProjectTransfer); -// // if (intResult < 0) { -// // return; -// // } - -// // // mWatchdog->answerWatchdog(); -// // // { -// // //send all listes SPITTypes -// // // unique_lock o_LockType(*SPITType::getMutex()); -// // intCount = SPITType::getSPITTypeCount(); -// // for (int i = 0; i < intCount; i++) { -// // ptrSPITType = mSpitTypes.getEntry(i); -// // if (ptrSPITType == nullptr) continue; -// // if (ptrSPITType->getCreatedByClient() == false) continue; -// // intResult = p_PtrSPIT_Client->sendSPITTypeInternal(ptrSPITType); -// // if (intResult < 0) return; -// // // mWatchdog->answerWatchdog(); -// // this_thread::sleep_for(chrono::milliseconds(7)); -// // } -// // // } - -// // // { -// // // unique_lock o_LockObject(*SObject::getMutex()); -// // intCount = mSpitObjects.getEntryCount(); -// // for (int i = 0; i < intCount; i++) { -// // ptrSPITObject = mSpitObjects.getEntry(i); -// // if (ptrSPITObject == nullptr) continue; -// // if (ptrSPITObject->getCreatedByClient() == false) continue; -// // intResult = p_PtrSPIT_Client->sendSPITObjectInternal(ptrSPITObject); -// // if (intResult < 0) return; -// // // mWatchdog->answerWatchdog(); -// // this_thread::sleep_for(chrono::milliseconds(7)); -// // } -// // // } - -// // //EndProjectTransfer -// // ptrSMEndProjectTransfer = new Message::EndProjectTransfer(); -// // intResult = p_PtrSPIT_Client->sendSPITMessage(ptrSMEndProjectTransfer); -// // if (intResult < 0) { -// // return; -// // } -// // // mWatchdog->answerWatchdog(); -// // NotifyEndProjectTransfer_Client* o_RunnableEnd = new NotifyEndProjectTransfer_Client(p_PtrSPIT_Client->getSPITClientInterface()); -// // SPIT_Handler::addRunnable(o_RunnableEnd); - -// // //Send act -// // } - -// void SProcessor::parseStartProjectTransfer(Message::StartProjectTransfer &message) { -// mCallbacks.onProjectUpdate(ProjUpdate::StartTransfer, mServerProjectID); -// } -// void SProcessor::parseEndProjectTransfer(Message::EndProjectTransfer &message) { -// SObject::clearUnconfirmedObjects(mSpitObjects); -// mCallbacks.onProjectUpdate(ProjUpdate::EndTransfer, mServerProjectID); - -// // Send Message::ReportProject after the mSPITClientInterface is notfied of EndProjectTransfer -// Message::ReportProject reportSPITProject(mProjName, mProjName); -// reportSPITProject.setFramesPerSecond(0); -// // if (sendSPITMessage(reportSPITProject) < 0) { -// // ESP_LOGD(TAG, "Client::parseReportProject could not send Client's ReportProject"); -// // } -// } + // Send Message::ReportProject after the mSPITClientInterface is notfied of EndProjectTransfer + Message::ReportProject reportSPITProject(mProjName, mProjName); + reportSPITProject.setFramesPerSecond(0); + if (mInternCallbacks.sendMessage(reportSPITProject) < 0) { + ESP_LOGD(TAG, "Client::parseReportProject could not send Client's ReportProject"); + } +} void SProcessor::parseReportType(Message::ReportType &message) { ESP_LOGD(TAG, "parse ReportType ID %s Name %s", message.getID().c_str(), message.getName().c_str()); SType *sType; - bool boolNew = false; - bool boolChanged = false; + bool isNew = false; + bool isChanged = false; { if (message.getServerRemote() == false) { sType = mSpitTypes.getEntry(message.getID()); @@ -785,7 +726,7 @@ void SProcessor::parseReportType(Message::ReportType &message) { auto spitType = make_unique(message.getID()); sType = spitType.get(); mSpitTypes.addEntry(move(spitType)); - boolNew = true; + isNew = true; } } else { sType = mRemoteSpitTypes.getEntry(message.getID()); @@ -793,123 +734,109 @@ void SProcessor::parseReportType(Message::ReportType &message) { auto spitType = make_unique(message.getID()); sType = spitType.get(); mRemoteSpitTypes.addEntry(move(spitType)); - boolNew = true; + isNew = true; } } if (!sType->setMessageOP(message)) { // SPITType is not changable -> send back to the server - mInternCallbacks.sendSpitTypeInternal(*sType); + mInternCallbacks.sendTypeInternal(*sType); return; } - auto eventType = boolNew ? ObjectEvent::Created : ObjectEvent::Changed; + auto eventType = isNew ? ObjectEvent::Created : ObjectEvent::Changed; // add or change SPITType mCallbacks.onSpitType(eventType, sType->ServerRemote.get(), *sType); if (sType != nullptr) { - if (sType->setConfirmed(true) == true || boolChanged == true) { - mInternCallbacks.sendSpitTypeInternal(*sType); + if (sType->setConfirmed(true) == true || isChanged == true) { + mInternCallbacks.sendTypeInternal(*sType); } } } } -// void SProcessor::parseRemoveSPITType(Message::RemoveType &message) { -// ESP_LOGD(TAG, "parse RemoveType %s", message.getID().c_str()); -// bool boolRemote = false; -// string stringSPITTypeID = message.getID(); +void SProcessor::parseRemoveType(Message::RemoveType &message) { + ESP_LOGD(TAG, "parse RemoveType %s", message.getID().c_str()); + bool isRemote = false; + string sTypeID = message.getID(); -// SType *ptrSPITType = mRemoteSpitTypes.getEntry(stringSPITTypeID); -// if (!ptrSPITType) { -// boolRemote = true; -// } else { -// ptrSPITType = mSpitTypes.getEntry(stringSPITTypeID); -// if (!ptrSPITType) { -// boolRemote = false; -// } else { -// // No SPITType with stringSPITTypeID is listet -// return; -// } -// } + SType *sType = mRemoteSpitTypes.getEntry(sTypeID); + if (!sType) { + isRemote = true; + } else { + sType = mSpitTypes.getEntry(sTypeID); + if (!sType) { + isRemote = false; + } else { + // No SType with sTypeID is listet + return; + } + } -// if (ptrSPITType->getCreatedByClient() && ptrSPITType->Fixed.get()) { -// // the SPITyte is created by client himself and it is fixed -> don't remove the SPITType!! -// // Send the SPITTyp back to the server -// sendSPITTypeInternal(*ptrSPITType); -// return; -// } + if (sType->getCreatedByClient() && sType->Fixed.get()) { + // the SPITyte is created by client himself and it is fixed -> don't remove the SType!! + // Send the SPITTyp back to the server + mInternCallbacks.sendTypeInternal(*sType); + return; + } -// mCallbacks.onSpitType(ObjectEvent::Deleted, boolRemote, *ptrSPITType); -// if (boolRemote == false) { -// mSpitTypes.removeEntry(*ptrSPITType); -// } else { -// mRemoteSpitTypes.removeEntry(*ptrSPITType); -// } -// } + mCallbacks.onSpitType(ObjectEvent::Deleted, isRemote, *sType); + if (isRemote == false) { + mSpitTypes.removeEntry(*sType); + } else { + mRemoteSpitTypes.removeEntry(*sType); + } +} -// /** -// * If a client has changed a SPITType, it should send it to the server to transmit the changes. -// * If the SPITType is a fixed one and not created by the client himself, then an eventSPITType can be sent from the server, which cancels the changes. -// * @param p_SPITType the pointer to the changed SPITType -// * @return 0 = is sended, -1 = is not sended -// */ -// int SProcessor::sendSPITTypeInternal(SType &p_SPITType) { -// Message::ReportType sMReportSPITType; -// p_SPITType.fillMessageOP(sMReportSPITType); -// // return sendSPITMessage(sMReportSPITType); -// return 1; -// } +/** + * Change an existing SPIT_Type. + * @param p_SPITType the SPITType vont + * @return true = changed, false = not changed maybe p_SPITType is NULL or the SPITType doesn't exists + */ +bool SProcessor::changeType(SType *p_SPITType) { + if (p_SPITType == nullptr) + return false; + SType *ptrSPITType = mSpitTypes.getEntry(p_SPITType->getID()); + if (ptrSPITType == nullptr) + return false; -// /** -// * Change an existing SPIT_Type. -// * @param p_SPITType the SPITType vont -// * @return true = changed, false = not changed maybe p_SPITType is NULL or the SPITType doesn't exists -// */ -// bool SProcessor::changeSPITType(SType *p_SPITType) { -// if (p_SPITType == nullptr) -// return false; -// SType *ptrSPITType = mSpitTypes.getEntry(p_SPITType->getID()); -// if (ptrSPITType == nullptr) -// return false; + ptrSPITType->DefaultDelay.set(p_SPITType->DefaultDelay.get()); + ptrSPITType->DefaultDuration.set(p_SPITType->DefaultDuration.get()); + ptrSPITType->Fixed.set(p_SPITType->Fixed.get()); + ptrSPITType->GroupName.set(p_SPITType->GroupName.get()); + ptrSPITType->Name.set(p_SPITType->Name.get()); + ptrSPITType->ProjectIndepended.set(p_SPITType->ProjectIndepended.get()); -// ptrSPITType->DefaultDelay.set(p_SPITType->DefaultDelay.get()); -// ptrSPITType->DefaultDuration.set(p_SPITType->DefaultDuration.get()); -// ptrSPITType->Fixed.set(p_SPITType->Fixed.get()); -// ptrSPITType->GroupName.set(p_SPITType->GroupName.get()); -// ptrSPITType->Name.set(p_SPITType->Name.get()); -// ptrSPITType->ProjectIndepended.set(p_SPITType->ProjectIndepended.get()); + mCallbacks.onSpitType(ObjectEvent::Changed, false, *ptrSPITType); + mInternCallbacks.sendTypeInternal(*ptrSPITType); -// mCallbacks.onSpitType(ObjectEvent::Changed, false, *ptrSPITType); -// sendSPITTypeInternal(*ptrSPITType); + return true; +} -// return true; -// } - -// /** -// * If a client has removed a SPITType where id == p_SPITTypeID, it should send it to the server. -// * The corresponding SPITType if listet in SPITType will be deleted. -// * An eventRemoveSPITType will occur. -// * If a connection to a SPITServer is established, the SPITServer may dicard the deletion an an eventSPITType will occur -// * -> the SPITType will be listet again. -// * @param p_SPITType the id of the SPITType ro remove -// * @return 0 = is sended, -1 = is not sended -// */ -// int SProcessor::removeSPITType(string p_SPITTypeID) { -// if (p_SPITTypeID.length() <= 0) -// return -1; -// SType *ptrSPITType; -// { -// ptrSPITType = mSpitTypes.getEntry(p_SPITTypeID); -// if (ptrSPITType == nullptr) -// return -1; -// Message::RemoveType sMRemoveSPITType; -// ptrSPITType->fillMessageOP(sMRemoveSPITType); -// mCallbacks.onSpitType(ObjectEvent::Deleted, false, *ptrSPITType); -// mSpitTypes.removeEntry(*ptrSPITType); -// // return sendSPITMessage(sMRemoveSPITType); -// return 1; -// } -// return -1; -// } +/** + * If a client has removed a SPITType where id == p_SPITTypeID, it should send it to the server. + * The corresponding SPITType if listet in SPITType will be deleted. + * An eventRemoveSPITType will occur. + * If a connection to a SPITServer is established, the SPITServer may dicard the deletion an an eventSPITType will occur + * -> the SPITType will be listet again. + * @param p_SPITType the id of the SPITType ro remove + * @return 0 = is sended, -1 = is not sended + */ +int SProcessor::removeType(string p_SPITTypeID) { + if (p_SPITTypeID.length() <= 0) + return -1; + SType *ptrSPITType; + { + ptrSPITType = mSpitTypes.getEntry(p_SPITTypeID); + if (ptrSPITType == nullptr) + return -1; + Message::RemoveType sMRemoveSPITType; + ptrSPITType->fillMessageOP(sMRemoveSPITType); + mCallbacks.onSpitType(ObjectEvent::Deleted, false, *ptrSPITType); + mSpitTypes.removeEntry(*ptrSPITType); + return mInternCallbacks.sendMessage(sMRemoveSPITType); + } + return -1; +} // SType *SProcessor::createTypeFixed(string iD, string p_GroupName, string p_Name, uint64_t p_DefaultDelay, uint64_t p_DefaultDuration) { // return createType(iD, p_GroupName, p_Name, p_DefaultDelay, p_DefaultDuration, true, true); @@ -936,105 +863,105 @@ void SProcessor::parseReportType(Message::ReportType &message) { // auto eventType = boolNew ? ObjectEvent::Created : ObjectEvent::Changed; // mCallbacks.onSpitType(eventType, false, *ptrSPITType); -// sendSPITTypeInternal(*ptrSPITType); +// sendTypeInternal(*ptrSPITType); // return ptrSPITType; // } -// //----- SPIT Objects ------ -// void SProcessor::parseReportSPITObject(Message::ReportObject &message) { -// ESP_LOGD(TAG, "parse ReportObject %s", message.getID().c_str()); -// SObject *ptrSPITObject; -// SType *ptrSPITType; -// bool boolNew = false; -// bool boolRemote = false; -// bool boolChanged = false; -// { -// ESP_LOGD(TAG, "parse ReportObject %s / %s", message.getID().c_str(), message.getName().c_str()); -// if (message.getServerRemote() == false) { -// boolRemote = false; -// ptrSPITObject = mSpitObjects.getEntry(message.getID()); -// ptrSPITType = mSpitTypes.getEntry(message.getSPITTypeID()); +//----- SPIT Objects ------ +void SProcessor::parseReportObject(Message::ReportObject &message) { + ESP_LOGD(TAG, "parse ReportObject %s", message.getID().c_str()); + SObject *sObject; + SType *SType; + bool isNew = false; + bool isRemote = false; + bool isChanged = false; + { + ESP_LOGD(TAG, "parse ReportObject %s / %s", message.getID().c_str(), message.getName().c_str()); + if (message.getServerRemote() == false) { + isRemote = false; + sObject = mSpitObjects.getEntry(message.getID()); + SType = mSpitTypes.getEntry(message.getSPITTypeID()); -// if (ptrSPITType == nullptr) { -// // No associated SPITType found -// if (ptrSPITObject != nullptr) { -// // SpitObject exists but has no corresponding SPITType -> remove the SPITObject without sending a message -// // Maybe the SPITObject has changed the SPITTypeID to a SPITTypeID of another board -// mSpitObjects.removeEntry(*ptrSPITObject); -// } -// return; -// } -// bool isKnownType = ptrSPITType != nullptr; -// if (ptrSPITObject == nullptr) { -// // The user's app my veto the SPITType -// if (mCallbacks.onCheckSpitObjectVeto(isKnownType) == false) { -// ESP_LOGW(TAG, "ObjectVeto %s / %s", message.getID().c_str(), message.getName().c_str()); -// return; -// } -// auto spitObj = make_unique(message.getID()); -// ptrSPITObject = spitObj.get(); -// mSpitObjects.addEntry(move(spitObj)); -// boolNew = true; -// } else { -// // The user's app my veto the SPITType -// if (mCallbacks.onCheckSpitObjectVeto(isKnownType) == false) { -// // SpitObject exists and User APp denied the SPITObject -> remove the SPITObject without sending a message -// mSpitObjects.removeEntry(*ptrSPITObject); -// ESP_LOGW(TAG, "TypeVeto %s / %s", message.getID().c_str(), message.getName().c_str()); -// return; -// } -// } -// } else { -// boolRemote = true; -// ptrSPITObject = mRemoteSpitObjects.getEntry(message.getID()); -// ptrSPITType = mRemoteSpitTypes.getEntry(message.getSPITTypeID()); -// if (ptrSPITType == nullptr) { -// // No associated SPITType found -// return; -// } -// if (ptrSPITObject == nullptr) { -// auto spitObj = make_unique(message.getID()); -// ptrSPITObject = spitObj.get(); -// mRemoteSpitObjects.addEntry(move(spitObj)); -// boolNew = true; -// } -// } + if (SType == nullptr) { + // No associated SPITType found + if (sObject != nullptr) { + // SpitObject exists but has no corresponding SPITType -> remove the SPITObject without sending a message + // Maybe the SPITObject has changed the SPITTypeID to a SPITTypeID of another board + mSpitObjects.removeEntry(*sObject); + } + return; + } + bool isKnownType = SType != nullptr; + if (sObject == nullptr) { + // The user's app my veto the SPITType + if (mCallbacks.onCheckSpitObjectVeto(isKnownType) == false) { + ESP_LOGW(TAG, "ObjectVeto %s / %s", message.getID().c_str(), message.getName().c_str()); + return; + } + auto spitObj = make_unique(message.getID()); + sObject = spitObj.get(); + mSpitObjects.addEntry(move(spitObj)); + isNew = true; + } else { + // The user's app my veto the SPITType + if (mCallbacks.onCheckSpitObjectVeto(isKnownType) == false) { + // SpitObject exists and User APp denied the SPITObject -> remove the SPITObject without sending a message + mSpitObjects.removeEntry(*sObject); + ESP_LOGW(TAG, "TypeVeto %s / %s", message.getID().c_str(), message.getName().c_str()); + return; + } + } + } else { + isRemote = true; + sObject = mRemoteSpitObjects.getEntry(message.getID()); + SType = mRemoteSpitTypes.getEntry(message.getSPITTypeID()); + if (SType == nullptr) { + // No associated SPITType found + return; + } + if (sObject == nullptr) { + auto spitObj = make_unique(message.getID()); + sObject = spitObj.get(); + mRemoteSpitObjects.addEntry(move(spitObj)); + isNew = true; + } + } -// if (!ptrSPITObject->setMessageOP(&message)) { -// ESP_LOGE(TAG, "Change not allowed"); -// // setMessageOP error - the SPITObject can't be changed, it may be fixed and crated by this client -// sendSPITObjectInternal(ptrSPITObject); -// return; -// } + if (!sObject->setMessageOP(&message)) { + ESP_LOGE(TAG, "Change not allowed"); + // setMessageOP error - the SPITObject can't be changed, it may be fixed and crated by this client + mInternCallbacks.sendObjectInternal(sObject); + return; + } -// if (boolRemote == false) { -// // set the virtual action assignment -// ptrSPITObject->setActionAssignedType(ptrSPITType->ActionAssigned.get()); -// } + if (isRemote == false) { + // set the virtual action assignment + sObject->setActionAssignedType(SType->ActionAssigned.get()); + } -// auto eventType = boolNew ? ObjectEvent::Created : ObjectEvent::Changed; -// mCallbacks.onSpitObject(eventType, boolRemote, *ptrSPITType, *ptrSPITObject); + auto eventType = isNew ? ObjectEvent::Created : ObjectEvent::Changed; + mCallbacks.onSpitObject(eventType, isRemote, *SType, *sObject); -// if (ptrSPITObject->setConfirmed(true) == true || boolChanged == true) { -// // Confirmation has changed -// sendSPITObjectInternal(ptrSPITObject); -// } -// } -// } -// void SProcessor::parseRemoveSPITObject(Message::RemoveObject &message) { -// ESP_LOGD(TAG, "parse RemoveObject %s", message.getID().c_str()); -// SObject *ptrSPITObject = mRemoteSpitObjects.getEntry(message.getID()); -// if (ptrSPITObject != nullptr) { -// SType *ptrSPITType = mRemoteSpitTypes.getEntry(ptrSPITObject->SPITTypeID.get()); -// if (ptrSPITType != nullptr) { -// mCallbacks.onSpitObject(ObjectEvent::Deleted, true, *ptrSPITType, *ptrSPITObject); -// } -// mRemoteSpitObjects.removeEntry(*ptrSPITObject); -// } else { -// // call removeSPITObject, this will notify the server that the object is removed -// removeSPITObject(message.getID()); -// } -// } + if (sObject->setConfirmed(true) == true || isChanged == true) { + // Confirmation has changed + mInternCallbacks.sendObjectInternal(sObject); + } + } +} +void SProcessor::parseRemoveObject(Message::RemoveObject &message) { + ESP_LOGD(TAG, "parse RemoveObject %s", message.getID().c_str()); + SObject *sObject = mRemoteSpitObjects.getEntry(message.getID()); + if (sObject != nullptr) { + SType *sType = mRemoteSpitTypes.getEntry(sObject->SPITTypeID.get()); + if (sType != nullptr) { + mCallbacks.onSpitObject(ObjectEvent::Deleted, true, *sType, *sObject); + } + mRemoteSpitObjects.removeEntry(*sObject); + } else { + // call removeObject, this will notify the server that the object is removed + removeObject(message.getID()); + } +} // int SProcessor::sendSPITObjectInternal(SObject *ptrSPITObject) { // if (ptrSPITObject == nullptr) @@ -1042,7 +969,7 @@ void SProcessor::parseReportType(Message::ReportType &message) { // Message::ReportObject sMReportSPITObject; // ptrSPITObject->fillMessageOP(sMReportSPITObject); -// // return sendSPITMessage(sMReportSPITObject); +// // return mInternCallbacks.sendMessage(sMReportSPITObject); // return 1; // } // /** @@ -1089,107 +1016,106 @@ void SProcessor::parseReportType(Message::ReportType &message) { // return true; // } -// /** -// * When the client wants to remove a SPITObject with id == p_SPITObjectID (normally the client should not do this), then he should send it to the SPITServer. -// * The corresponding SPITObject if listet in SPITObject will be deleted. -// * An eventRemoveSPITType will occur. -// * If an connection to a SPITServer is established, the SPITServer may discard the deletion and an eventSPITObject occurs -// * -> the SPITObject is listet again. -// * @param objId the id of the SPITObject to remove. -// * @return 0 = sended to the SPITServer, -1 = not sended to the SPITServer or nos SPITObject with id == objId exists. -// */ -// int SProcessor::removeSPITObject(string objId) { -// if (objId.length() <= 0) -// return -1; -// SType *ptrSPITType; -// SObject *ptrSPITObject; -// { -// Message::RemoveObject sMRemoveSPITObject; +/** + * When the client wants to remove a SPITObject with id == p_SPITObjectID (normally the client should not do this), then he should send it to the SPITServer. + * The corresponding SPITObject if listet in SPITObject will be deleted. + * An eventRemoveSPITType will occur. + * If an connection to a SPITServer is established, the SPITServer may discard the deletion and an eventSPITObject occurs + * -> the SPITObject is listet again. + * @param objId the id of the SPITObject to remove. + * @return 0 = sended to the SPITServer, -1 = not sended to the SPITServer or nos SPITObject with id == objId exists. + */ +int SProcessor::removeObject(string objId) { + if (objId.length() <= 0) + return -1; + SType *sType; + SObject *sObject; + { + Message::RemoveObject remObj; -// ptrSPITObject = mSpitObjects.getEntry(objId); -// if (ptrSPITObject == nullptr) -// return -1; -// ptrSPITType = mSpitTypes.getEntry(ptrSPITObject->SPITTypeID.get()); -// if (ptrSPITType == nullptr) -// return -1; -// ptrSPITObject->fillMessageOP(sMRemoveSPITObject); -// mCallbacks.onSpitObject(ObjectEvent::Deleted, false, *ptrSPITType, *ptrSPITObject); -// mSpitObjects.removeEntry(*ptrSPITObject); -// // return sendSPITMessage(sMRemoveSPITObject); -// return 1; -// } -// return -1; -// } + sObject = mSpitObjects.getEntry(objId); + if (sObject == nullptr) + return -1; + sType = mSpitTypes.getEntry(sObject->SPITTypeID.get()); + if (sType == nullptr) + return -1; + sObject->fillMessageOP(remObj); + mCallbacks.onSpitObject(ObjectEvent::Deleted, false, *sType, *sObject); + mSpitObjects.removeEntry(*sObject); + mInternCallbacks.sendMessage(remObj); + } + return -1; +} // //----- Play SPIT Objects ------ -// void SProcessor::parsePlaySPITStart(Message::PlayStart &message) { -// ESP_LOGD(TAG, "parse PlayStart ID: %s Name: %s Running: %d", message.getPlayerID().c_str(), message.getPlayerName().c_str(), (int)message.getPlayerIsRunning()); -// SPlayer &spitPlayer = SPlayer::getSPITPlayer(message.getPlayerID()); -// spitPlayer.setIsRunning(message.getPlayerIsRunning()); -// spitPlayer.setName(message.getPlayerName()); -// spitPlayer.setType(message.getPlayerType()); -// spitPlayer.setTime(message.getTime()); -// spitPlayer.startPlaySequence(); +void SProcessor::parsePlayStart(Message::PlayStart &message) { + ESP_LOGD(TAG, "parse PlayStart ID: %s Name: %s Running: %d", message.getPlayerID().c_str(), message.getPlayerName().c_str(), (int)message.getPlayerIsRunning()); + SPlayer &player = SPlayer::getSPITPlayer(message.getPlayerID()); + player.setIsRunning(message.getPlayerIsRunning()); + player.setName(message.getPlayerName()); + player.setType(message.getPlayerType()); + player.setTime(message.getTime()); + player.startPlaySequence(); -// mCallbacks.onPlay(spitPlayer.getID(), spitPlayer.getName(), spitPlayer.getType(), spitPlayer.getIsRunning(), spitPlayer.getTime()); -// } -// void SProcessor::parsePlaySPITObject(Message::PlayObject &message) { + mCallbacks.onPlay(player.getID(), player.getName(), player.getType(), player.getIsRunning(), player.getTime()); +} +void SProcessor::parsePlayObject(Message::PlayObject &message) { -// SPlayer &ptrSPITPlayer = SPlayer::getSPITPlayer(message.getPlayerID()); -// SObject *ptrSPITObject = mSpitObjects.getEntry(message.getSPITObjectID()); + SPlayer &player = SPlayer::getSPITPlayer(message.getPlayerID()); + SObject *sObject = mSpitObjects.getEntry(message.getSPITObjectID()); -// if (ptrSPITObject == nullptr) { -// return; -// } -// SPlayer::PlayType *ptrPlaySPITType = ptrSPITPlayer.addTypePlaying(ptrSPITObject->SPITTypeID.get()); -// if (ptrPlaySPITType == nullptr) { -// return; -// } -// ptrPlaySPITType->setPlayerIsRunning(ptrSPITPlayer.getIsRunning()); -// ptrPlaySPITType->addValue(((double)message.getValue() / 1000000), ((double)ptrSPITObject->ValueFactor.get() / 1000000)); -// } + if (sObject == nullptr) { + return; + } + SPlayer::PlayType *playType = player.addTypePlaying(sObject->SPITTypeID.get()); + if (playType == nullptr) { + return; + } + playType->setPlayerIsRunning(player.getIsRunning()); + playType->addValue(((double)message.getValue() / 1000000), ((double)sObject->ValueFactor.get() / 1000000)); +} -// void SProcessor::parsePlaySPITEnd(Message::PlayEnd &message) { -// SPlayer &ptrSPITPlayer = SPlayer::getSPITPlayer(message.getPlayerID()); +void SProcessor::parsePlayEnd(Message::PlayEnd &message) { + SPlayer &ptrSPITPlayer = SPlayer::getSPITPlayer(message.getPlayerID()); -// auto &ptrPlaySPITTypes = ptrSPITPlayer.getPlaySPITTypes(); -// for (auto i = ptrPlaySPITTypes.begin(); i != ptrPlaySPITTypes.end(); i++) { -// SPlayer::PlayType *ptrPlaySPITType = i->second.get(); -// bool boolStarted = ptrPlaySPITType->getIsNew(); -// bool boolStopped = (ptrPlaySPITType->getIsPlayed() == false); -// SType *ptrSPITType = mSpitTypes.getEntry(ptrPlaySPITType->getSPITTypeID()); -// if (ptrSPITType == nullptr) { -// // set isplayed to false, the ptrPlayObject will be removed by ptrSPITPlayer.endPlaySequence() -// ptrPlaySPITType->setIsPlayed(false); -// continue; -// } -// mCallbacks.onPlaySpitType(ptrPlaySPITType->getPlayerID(), ptrPlaySPITType->getSPITTypeID(), ptrPlaySPITType->getPlayerIsRunning(), boolStarted, boolStopped, ptrPlaySPITType->getValue()); -// } -// ptrSPITPlayer.endPlaySequence(); -// } + auto &playTypes = ptrSPITPlayer.getPlaySPITTypes(); + for (auto i = playTypes.begin(); i != playTypes.end(); i++) { + SPlayer::PlayType *playType = i->second.get(); + bool isStarted = playType->getIsNew(); + bool iStopped = (playType->getIsPlayed() == false); + SType *ptrSPITType = mSpitTypes.getEntry(playType->getSPITTypeID()); + if (ptrSPITType == nullptr) { + // set isplayed to false, the ptrPlayObject will be removed by ptrSPITPlayer.endPlaySequence() + playType->setIsPlayed(false); + continue; + } + mCallbacks.onPlaySpitType(playType->getPlayerID(), playType->getSPITTypeID(), playType->getPlayerIsRunning(), isStarted, iStopped, playType->getValue()); + } + ptrSPITPlayer.endPlaySequence(); +} -// void SProcessor::parseReportPlayStatus(Message::ReportPlayStatus &message) { -// SType *ptrSPITType = NULL; +void SProcessor::parseReportPlayStatus(Message::ReportPlayStatus &message) { + SType *sType = NULL; -// SObject *ptrSPITObject = mRemoteSpitObjects.getEntry(message.getID()); -// if (ptrSPITObject == nullptr) { -// ptrSPITObject = mSpitObjects.getEntry(message.getID()); -// if (ptrSPITObject == nullptr) { -// return; -// } -// } -// if (ptrSPITObject->ServerRemote.get() == false) { -// ptrSPITType = mSpitTypes.getEntry(ptrSPITObject->SPITTypeID.get()); -// } else { -// ptrSPITType = mRemoteSpitTypes.getEntry(ptrSPITObject->SPITTypeID.get()); -// } + SObject *sObject = mRemoteSpitObjects.getEntry(message.getID()); + if (sObject == nullptr) { + sObject = mSpitObjects.getEntry(message.getID()); + if (sObject == nullptr) { + return; + } + } + if (sObject->ServerRemote.get() == false) { + sType = mSpitTypes.getEntry(sObject->SPITTypeID.get()); + } else { + sType = mRemoteSpitTypes.getEntry(sObject->SPITTypeID.get()); + } -// if (ptrSPITType == nullptr) { -// return; -// } -// mCallbacks.onPlayRemoteObjectStatus(*ptrSPITType, *ptrSPITObject, message.getFrameInsideObject(), message.getValue()); -// } + if (sType == nullptr) { + return; + } + mCallbacks.onPlayRemoteObjectStatus(*sType, *sObject, message.getFrameInsideObject(), message.getValue()); +} // //--------- Remote ---------- @@ -1215,7 +1141,7 @@ void SProcessor::parseReportType(Message::ReportType &message) { // Message::PlayStart playSPITStart(mGuid, mProjName, PLAYERTYPE_DISCRETE); // playSPITStart.setPlayerIsRunning(false); // playSPITStart.setTime(0); -// // sendSPITMessage(playSPITStart); +// // mInternCallbacks.sendMessage(playSPITStart); // Message::PlayObject playSPITObject; // playSPITObject.setID(ptrRemoteSPITObject->getID()); @@ -1223,10 +1149,10 @@ void SProcessor::parseReportType(Message::ReportType &message) { // playSPITObject.setPlayerID(mGuid); // playSPITObject.setValue(valuePpm); // playSPITObject.setValueFlag(valueFlag); -// // sendSPITMessage(playSPITObject); +// // mInternCallbacks.sendMessage(playSPITObject); // Message::PlayEnd playSPITEnd(mGuid); -// // sendSPITMessage(playSPITEnd); +// // mInternCallbacks.sendMessage(playSPITEnd); // } } // namespace spit \ No newline at end of file diff --git a/components/spit/uTest/spitProcessorTest.cpp b/components/spit/uTest/spitProcessorTest.cpp index 0195019..3c5dbdb 100644 --- a/components/spit/uTest/spitProcessorTest.cpp +++ b/components/spit/uTest/spitProcessorTest.cpp @@ -58,7 +58,13 @@ class SpitClientFix { .onPlayRemoteObjectStatus = [&](const SType &t, const SObject &o, uint64_t p_FrameInsideObject, int value) { client.onPlayRemoteObjectStatus(t, o, p_FrameInsideObject, value); }, .onCheckSpitTypeVeto = [&](bool knownType, bool createdByClient) { return client.onCheckSpitTypeVeto(knownType, createdByClient); }, .onCheckSpitObjectVeto = [&](bool knownType) { return client.onCheckSpitObjectVeto(knownType); }}; - SProcessor sut{"sut", "sutProj", "dev", "##GUID##", callbacks}; + SProcessor::InternalCallbacks intCallbacks { + .delay = [&](int ms){ return ; }, + .sendMessage = [&](Message::OPPart &msg){ return 0; }, + .sendTypeInternal = [&](SType &sType) { return 0; }, + .sendObjectInternal = [&](SObject *sObject) { return 0; } + }; + SProcessor sut{"sut", "sutProj", "dev", "##GUID##", callbacks, intCallbacks}; }; TEST_CASE_FIXTURE(SpitClientFix, "Spit types") { diff --git a/components/spit/uTest/spitProcessor_complexTest.cpp b/components/spit/uTest/spitProcessor_complexTest.cpp index 2b09b6a..9c0ef85 100644 --- a/components/spit/uTest/spitProcessor_complexTest.cpp +++ b/components/spit/uTest/spitProcessor_complexTest.cpp @@ -58,7 +58,13 @@ class SpitClientCmplsFix { .onPlayRemoteObjectStatus = [&](const SType &t, const SObject &o, uint64_t p_FrameInsideObject, int value) { client.onPlayRemoteObjectStatus(t, o, p_FrameInsideObject, value); }, .onCheckSpitTypeVeto = [&](bool knownType, bool createdByClient) { return client.onCheckSpitTypeVeto(knownType, createdByClient); }, .onCheckSpitObjectVeto = [&](bool knownType) { return client.onCheckSpitObjectVeto(knownType); }}; - SProcessor sut{"sut", "sutProj", "dev", "##GUID##", callbacks}; + SProcessor::InternalCallbacks intCallbacks { + .delay = [&](int ms){ return ; }, + .sendMessage = [&](Message::OPPart &msg){ return 0; }, + .sendTypeInternal = [&](SType &sType) { return 0; }, + .sendObjectInternal = [&](SObject *sObject) { return 0; } + }; + SProcessor sut{"sut", "sutProj", "dev", "##GUID##", callbacks, intCallbacks}; }; static void spoofMsgCounter(std::vector &msg, uint8_t cnt) {