refactor: Heavy refactoring of SPIT
This commit is contained in:
@@ -1,364 +0,0 @@
|
||||
/*
|
||||
* To change this license header, choose License Headers in Project Properties.
|
||||
* To change this template file, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
|
||||
/*
|
||||
* SPITObject describes a SPIT Object
|
||||
* File: SPITObject.cpp
|
||||
* Author: Hagi
|
||||
*
|
||||
* Created on 9. April 2019, 12:11
|
||||
*/
|
||||
|
||||
#include "SPITObject.h"
|
||||
#include "SPITSocket.h"
|
||||
#include "esp_log.h"
|
||||
|
||||
/**
|
||||
* clears all unconfirmed SPITObjects not created by this SPIT_Client.
|
||||
*/
|
||||
void SPITObject::clearUnconfirmedSPITObjects(SpitRepo<SPITObject> &repo) {
|
||||
auto &entries = repo.getRepo();
|
||||
for (auto i = entries.begin(); i != entries.end();) {
|
||||
SPITObject *ptrSPITObject = i->second.get();
|
||||
if (ptrSPITObject->getCreatedByClient() == false && ptrSPITObject->getConfirmed() == false) {
|
||||
i = entries.erase(i);
|
||||
} else {
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SPITObject::eventProjectClosed(SpitRepo<SPITObject> &repo, SpitRepo<SPITObject> &remoteRepo) {
|
||||
auto &entries = repo.getRepo();
|
||||
for (auto i = entries.begin(); i != entries.end(); ) {
|
||||
SPITObject *ptrSPITObject = i->second.get();
|
||||
if (ptrSPITObject->getCreatedByClient() == true) {
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
i = entries.erase(i);
|
||||
}
|
||||
// Remote
|
||||
remoteRepo.clearEntries();
|
||||
}
|
||||
/**
|
||||
* sets confirmed = false for all SPITObjects.
|
||||
* This should be called when the client has loaded a project.
|
||||
*/
|
||||
void SPITObject::setConfirmedFalse(SpitRepo<SPITObject> &repo) {
|
||||
auto &entries = repo.getRepo();
|
||||
for (auto i = entries.begin(); i != entries.end(); i++) {
|
||||
i->second->setConfirmed(false);
|
||||
}
|
||||
}
|
||||
|
||||
SPITObject::SPITObject(string p_ID) {
|
||||
m_ID = p_ID;
|
||||
}
|
||||
|
||||
bool SPITObject::setMessageOP(Message::ReportObject *p_ReportSPITObject) {
|
||||
bool boolChangeAllowed;
|
||||
bool boolChanged = false;
|
||||
|
||||
if (m_CreatedByClient == true && m_Fixed == true) {
|
||||
boolChangeAllowed = false;
|
||||
} else {
|
||||
boolChangeAllowed = true;
|
||||
}
|
||||
|
||||
// Confirmation should be changable
|
||||
if (m_CreatedByClient) {
|
||||
// Server reports a client created SPITType -> the type is confirmed
|
||||
m_Confirmed = true;
|
||||
} else {
|
||||
// type is NOT client created -> the client has to confirm the SPITtype
|
||||
m_Confirmed = p_ReportSPITObject->getConfirmed();
|
||||
}
|
||||
|
||||
if (m_Delay != p_ReportSPITObject->getDelay()) {
|
||||
if (boolChangeAllowed == false) {
|
||||
return false;
|
||||
}
|
||||
m_Delay = p_ReportSPITObject->getDelay();
|
||||
boolChanged = true;
|
||||
}
|
||||
if (m_Duration != p_ReportSPITObject->getDuration()) {
|
||||
if (boolChangeAllowed == false) {
|
||||
return false;
|
||||
}
|
||||
m_Duration = p_ReportSPITObject->getDuration();
|
||||
boolChanged = true;
|
||||
}
|
||||
if (m_Fixed != p_ReportSPITObject->getFixed()) {
|
||||
if (boolChangeAllowed == false) {
|
||||
return false;
|
||||
}
|
||||
m_Fixed = p_ReportSPITObject->getFixed();
|
||||
boolChanged = true;
|
||||
}
|
||||
if (m_FrameFadeInLength != p_ReportSPITObject->getFrameFadeInLength()) {
|
||||
if (boolChangeAllowed == false) {
|
||||
return false;
|
||||
}
|
||||
m_FrameFadeInLength = p_ReportSPITObject->getFrameFadeInLength();
|
||||
boolChanged = true;
|
||||
}
|
||||
if (m_FrameFadeOutLength != p_ReportSPITObject->getFrameFadeOutLength()) {
|
||||
if (boolChangeAllowed == false) {
|
||||
return false;
|
||||
}
|
||||
m_FrameFadeOutLength = p_ReportSPITObject->getFrameFadeOutLength();
|
||||
boolChanged = true;
|
||||
}
|
||||
if (m_FrameLength != p_ReportSPITObject->getFrameLength()) {
|
||||
if (boolChangeAllowed == false) {
|
||||
return false;
|
||||
}
|
||||
m_FrameLength = p_ReportSPITObject->getFrameLength();
|
||||
boolChanged = true;
|
||||
}
|
||||
if (m_FrameStart != p_ReportSPITObject->getFrameStart()) {
|
||||
if (boolChangeAllowed == false) {
|
||||
return false;
|
||||
}
|
||||
m_FrameStart = p_ReportSPITObject->getFrameStart();
|
||||
boolChanged = true;
|
||||
}
|
||||
if (m_Remark != p_ReportSPITObject->getRemark()) {
|
||||
if (boolChangeAllowed == false) {
|
||||
return false;
|
||||
}
|
||||
m_Remark = p_ReportSPITObject->getRemark();
|
||||
boolChanged = true;
|
||||
}
|
||||
if (m_ID != p_ReportSPITObject->getID()) {
|
||||
if (boolChangeAllowed == false) {
|
||||
return false;
|
||||
}
|
||||
m_ID = p_ReportSPITObject->getID();
|
||||
boolChanged = true;
|
||||
}
|
||||
if (m_Name != p_ReportSPITObject->getName()) {
|
||||
if (boolChangeAllowed == false) {
|
||||
return false;
|
||||
}
|
||||
m_Name = p_ReportSPITObject->getName();
|
||||
boolChanged = true;
|
||||
}
|
||||
if (m_SPITTypeID != p_ReportSPITObject->getSPITTypeID()) {
|
||||
if (boolChangeAllowed == false) {
|
||||
return false;
|
||||
}
|
||||
m_SPITTypeID = p_ReportSPITObject->getSPITTypeID();
|
||||
boolChanged = true;
|
||||
}
|
||||
if (m_ServerParams != p_ReportSPITObject->getServerParams()) {
|
||||
if (boolChangeAllowed == false) {
|
||||
return false;
|
||||
}
|
||||
m_ServerParams = p_ReportSPITObject->getServerParams();
|
||||
boolChanged = true;
|
||||
}
|
||||
if (m_ServerRemote != p_ReportSPITObject->getServerRemote()) {
|
||||
if (boolChangeAllowed == false) {
|
||||
return false;
|
||||
}
|
||||
m_ServerRemote = p_ReportSPITObject->getServerRemote();
|
||||
boolChanged = true;
|
||||
}
|
||||
if (m_Track != p_ReportSPITObject->getTrack()) {
|
||||
if (boolChangeAllowed == false) {
|
||||
return false;
|
||||
}
|
||||
m_Track = p_ReportSPITObject->getTrack();
|
||||
boolChanged = true;
|
||||
}
|
||||
if (m_ValueFactor != p_ReportSPITObject->getValueFactor()) {
|
||||
if (boolChangeAllowed == false) {
|
||||
return false;
|
||||
}
|
||||
m_ValueFactor = p_ReportSPITObject->getValueFactor();
|
||||
boolChanged = true;
|
||||
}
|
||||
if (m_ValueUse != p_ReportSPITObject->getValueUse()) {
|
||||
if (boolChangeAllowed == false) {
|
||||
return false;
|
||||
}
|
||||
m_ValueUse = p_ReportSPITObject->getValueUse();
|
||||
boolChanged = true;
|
||||
}
|
||||
return boolChanged;
|
||||
}
|
||||
|
||||
void SPITObject::fillMessageOP(Message::ReportObject &p_ReportSPITObject) {
|
||||
p_ReportSPITObject.setActionAssigned(getActionAssigned()); // Action can be assigned to type or to this object
|
||||
p_ReportSPITObject.setConfirmed(m_Confirmed);
|
||||
p_ReportSPITObject.setDelay(m_Delay);
|
||||
p_ReportSPITObject.setDuration(m_Duration);
|
||||
p_ReportSPITObject.setFixed(m_Fixed);
|
||||
p_ReportSPITObject.setFrameFadeInLength(m_FrameFadeInLength);
|
||||
p_ReportSPITObject.setFrameFadeOutLength(m_FrameFadeOutLength);
|
||||
p_ReportSPITObject.setFrameLength(m_FrameLength);
|
||||
p_ReportSPITObject.setFrameStart(m_FrameStart);
|
||||
p_ReportSPITObject.setID(m_ID);
|
||||
p_ReportSPITObject.setName(m_Name);
|
||||
p_ReportSPITObject.setRemark(m_Remark);
|
||||
p_ReportSPITObject.setSPITTypeID(m_SPITTypeID);
|
||||
p_ReportSPITObject.setServerParams(m_ServerParams);
|
||||
p_ReportSPITObject.setServerRemote(m_ServerRemote);
|
||||
p_ReportSPITObject.setTrack(m_Track);
|
||||
p_ReportSPITObject.setValueFactor(m_ValueFactor);
|
||||
p_ReportSPITObject.setValueUse(m_ValueUse);
|
||||
}
|
||||
void SPITObject::fillMessageOP(Message::RemoveObject &p_RemoveSPITObject) {
|
||||
p_RemoveSPITObject.setID(m_ID);
|
||||
}
|
||||
|
||||
/**
|
||||
* This is used by the server and client to tell if the other side has registered the changes.
|
||||
* @param p_Confirmed
|
||||
* @return if m_Confirmed has changed
|
||||
*/
|
||||
bool SPITObject::setConfirmed(bool p_Confirmed) {
|
||||
if (m_Confirmed == p_Confirmed)
|
||||
return false;
|
||||
m_Confirmed = p_Confirmed;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool SPITObject::setName(string p_Name) {
|
||||
if (m_Name == p_Name)
|
||||
return false;
|
||||
m_Name = p_Name;
|
||||
m_Confirmed = false;
|
||||
return true;
|
||||
}
|
||||
bool SPITObject::setRemark(string p_Remark) {
|
||||
if (m_Remark == p_Remark)
|
||||
return false;
|
||||
m_Remark = p_Remark;
|
||||
m_Confirmed = false;
|
||||
return true;
|
||||
}
|
||||
bool SPITObject::setServerParams(string p_ServerParams) {
|
||||
if (m_ServerParams == p_ServerParams)
|
||||
return false;
|
||||
m_ServerParams = p_ServerParams;
|
||||
m_Confirmed = false;
|
||||
return true;
|
||||
}
|
||||
bool SPITObject::setSPITTypeID(string p_SPITTypeID) {
|
||||
if (m_SPITTypeID == p_SPITTypeID)
|
||||
return false;
|
||||
m_SPITTypeID = p_SPITTypeID;
|
||||
m_Confirmed = false;
|
||||
return true;
|
||||
}
|
||||
bool SPITObject::setServerRemote(bool p_BelongstoServer) {
|
||||
if (m_ServerRemote == p_BelongstoServer)
|
||||
return false;
|
||||
m_ServerRemote = p_BelongstoServer;
|
||||
m_Confirmed = false;
|
||||
return true;
|
||||
}
|
||||
/**
|
||||
* This is a virtual construct - ActionAssignedType is not implemented in the SPITProtocol.
|
||||
* This is used when an action is associated with a SPITType.
|
||||
* Then this action is done for every SPITObject with the SPITType.
|
||||
* @return true = an action is assigned for the SPITType.
|
||||
*/
|
||||
bool SPITObject::setActionAssignedType(bool p_ActionAssigned) {
|
||||
if (m_ActionAssignedType == p_ActionAssigned)
|
||||
return false;
|
||||
bool boolOldActionAssigend;
|
||||
boolOldActionAssigend = getActionAssigned();
|
||||
m_ActionAssignedType = p_ActionAssigned;
|
||||
if (getActionAssigned() == boolOldActionAssigend)
|
||||
return false;
|
||||
m_Confirmed = false;
|
||||
return true;
|
||||
}
|
||||
bool SPITObject::setActionAssigned(bool p_ActionAssigned) {
|
||||
if (m_ActionAssigned == p_ActionAssigned)
|
||||
return false;
|
||||
bool boolOldActionAssigend;
|
||||
boolOldActionAssigend = getActionAssigned();
|
||||
m_ActionAssigned = p_ActionAssigned;
|
||||
if (getActionAssigned() == boolOldActionAssigend)
|
||||
return false;
|
||||
m_Confirmed = false;
|
||||
return true;
|
||||
}
|
||||
bool SPITObject::setFixed(bool p_Fixed) {
|
||||
if (m_Fixed == p_Fixed)
|
||||
return false;
|
||||
m_Fixed = p_Fixed;
|
||||
m_Confirmed = false;
|
||||
return true;
|
||||
}
|
||||
bool SPITObject::setFrameStart(long long p_FrameStart) {
|
||||
if (m_FrameStart == p_FrameStart)
|
||||
return false;
|
||||
m_FrameStart = p_FrameStart;
|
||||
m_Confirmed = false;
|
||||
return true;
|
||||
}
|
||||
bool SPITObject::setFrameLength(long long p_FrameLength) {
|
||||
if (m_FrameLength == p_FrameLength)
|
||||
return false;
|
||||
m_FrameLength = p_FrameLength;
|
||||
m_Confirmed = false;
|
||||
return true;
|
||||
}
|
||||
bool SPITObject::setFrameFadeInLength(long long p_FrameFadeInLength) {
|
||||
if (m_FrameFadeInLength == p_FrameFadeInLength)
|
||||
return false;
|
||||
m_FrameFadeInLength = p_FrameFadeInLength;
|
||||
m_Confirmed = false;
|
||||
return true;
|
||||
}
|
||||
bool SPITObject::setFrameFadeOutLength(long long p_FrameFadeOutLength) {
|
||||
if (m_FrameFadeOutLength == p_FrameFadeOutLength)
|
||||
return false;
|
||||
m_FrameFadeOutLength = p_FrameFadeOutLength;
|
||||
m_Confirmed = false;
|
||||
return true;
|
||||
}
|
||||
bool SPITObject::setValueUse(char p_ValueUse) {
|
||||
if (m_ValueUse == p_ValueUse)
|
||||
return false;
|
||||
m_ValueUse = p_ValueUse;
|
||||
m_Confirmed = false;
|
||||
return true;
|
||||
}
|
||||
bool SPITObject::setValueFactor(int p_ValueFactor) {
|
||||
if (m_ValueFactor == p_ValueFactor)
|
||||
return false;
|
||||
m_ValueFactor = p_ValueFactor;
|
||||
m_Confirmed = false;
|
||||
return true;
|
||||
}
|
||||
bool SPITObject::setTrack(int p_Track) {
|
||||
if (m_Track == p_Track)
|
||||
return false;
|
||||
m_Track = p_Track;
|
||||
m_Confirmed = false;
|
||||
return true;
|
||||
}
|
||||
bool SPITObject::setDelay(long long p_Delay) {
|
||||
if (m_Delay == p_Delay)
|
||||
return false;
|
||||
m_Delay = p_Delay;
|
||||
m_Confirmed = false;
|
||||
return true;
|
||||
}
|
||||
bool SPITObject::setDuration(long long p_Duration) {
|
||||
if (m_Duration == p_Duration)
|
||||
return false;
|
||||
m_Duration = p_Duration;
|
||||
m_Confirmed = false;
|
||||
return true;
|
||||
}
|
||||
@@ -1,102 +0,0 @@
|
||||
/*
|
||||
* To change this license header, choose License Headers in Project Properties.
|
||||
* To change this template file, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
|
||||
/*
|
||||
* SPITPlayer describes a virtual SPIT Player.
|
||||
* File: SPITPLayer.cpp
|
||||
* Author: Hagi
|
||||
*
|
||||
* Created on 30. April 2019, 11:44
|
||||
*/
|
||||
|
||||
#include "SPITPlayer.h"
|
||||
#include "esp_log.h"
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
using namespace std;
|
||||
|
||||
unordered_map<string, unique_ptr<SPITPlayer>> SPITPlayer::s_SPITPlayers;
|
||||
|
||||
SPITPlayer &SPITPlayer::getSPITPlayer(string p_PlayerID) {
|
||||
auto i = s_SPITPlayers.find(p_PlayerID);
|
||||
if (i == s_SPITPlayers.end()) {
|
||||
s_SPITPlayers[p_PlayerID] = make_unique<SPITPlayer>(p_PlayerID);
|
||||
}
|
||||
return *s_SPITPlayers.at(p_PlayerID);
|
||||
}
|
||||
|
||||
SPITPlayer::SPITPlayer(string p_PlayerID) {
|
||||
m_ID = p_PlayerID;
|
||||
}
|
||||
|
||||
SPITPlayer::~SPITPlayer() {
|
||||
m_PlaySPITTypes.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param p_SPITObjectID
|
||||
* @return true = new PlayObject added<br>
|
||||
* false = PlayObject exists
|
||||
*/
|
||||
SPITPlayer::PlaySPITType *SPITPlayer::addSPITType_Playing(string p_SPITTypeID) {
|
||||
PlaySPITType *ptrPlaySPITType;
|
||||
auto i = m_PlaySPITTypes.find(p_SPITTypeID);
|
||||
if (i == m_PlaySPITTypes.end()) {
|
||||
auto playSpitType = make_unique<PlaySPITType>(this, p_SPITTypeID);
|
||||
ptrPlaySPITType = playSpitType.get();
|
||||
m_PlaySPITTypes[p_SPITTypeID] = move(playSpitType);
|
||||
} else {
|
||||
ptrPlaySPITType = i->second.get();
|
||||
}
|
||||
ptrPlaySPITType->setIsPlayed(true);
|
||||
return ptrPlaySPITType;
|
||||
}
|
||||
|
||||
void SPITPlayer::startPlaySequence() {
|
||||
for (auto i = m_PlaySPITTypes.begin(); i != m_PlaySPITTypes.end(); i++) {
|
||||
PlaySPITType *ptrPlaySPITType = i->second.get();
|
||||
ptrPlaySPITType->startPlaySequence();
|
||||
}
|
||||
}
|
||||
|
||||
void SPITPlayer::endPlaySequence() {
|
||||
for (auto i = m_PlaySPITTypes.begin(); i != m_PlaySPITTypes.end();) {
|
||||
if (i->second.get()->getIsPlayed() == false) {
|
||||
i = m_PlaySPITTypes.erase(i);
|
||||
} else {
|
||||
++i;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SPITPlayer::PlaySPITType::PlaySPITType(SPITPlayer *p_SPITPlayer, string p_SPITTypeID) {
|
||||
m_IsNew = true;
|
||||
|
||||
m_SPITTypeID = p_SPITTypeID;
|
||||
m_PlayerID = p_SPITPlayer->getID();
|
||||
m_PlayerName = p_SPITPlayer->getName();
|
||||
startPlaySequence();
|
||||
m_IsNew = true;
|
||||
}
|
||||
SPITPlayer::PlaySPITType::PlaySPITType(const PlaySPITType &orig) {
|
||||
m_SPITTypeID = orig.getSPITTypeID();
|
||||
m_IsPlayed = orig.getIsPlayed();
|
||||
m_IsNew = orig.getIsNew();
|
||||
|
||||
m_PlayerID = orig.getPlayerID();
|
||||
m_PlayerName = orig.getPlayerName();
|
||||
m_PlayerRuns = orig.getPlayerIsRunning();
|
||||
|
||||
m_Value = orig.getValue();
|
||||
}
|
||||
void SPITPlayer::PlaySPITType::startPlaySequence() {
|
||||
m_IsPlayed = false;
|
||||
m_IsNew = false;
|
||||
|
||||
m_Value = 0;
|
||||
}
|
||||
@@ -1,239 +0,0 @@
|
||||
/*
|
||||
* To change this license header, choose License Headers in Project Properties.
|
||||
* To change this template file, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
|
||||
/*
|
||||
* SPITType describes a SPIT Type
|
||||
* File: SPITType.cpp
|
||||
* Author: Hagi
|
||||
*
|
||||
* Created on 8. April 2019, 08:40
|
||||
*/
|
||||
|
||||
#include "SPITType.h"
|
||||
#include "esp_log.h"
|
||||
|
||||
using namespace spit;
|
||||
|
||||
static const char *TAG = "SPIT";
|
||||
|
||||
void SPITType::eventProjectClosed(SpitRepo<SPITType> &repo, SpitRepo<SPITType> &remoteRepo) {
|
||||
auto &entries = repo.getRepo();
|
||||
for (auto i = entries.begin(); i != entries.end();) {
|
||||
SPITType *ptrSPITType = i->second.get();
|
||||
if (ptrSPITType->getCreatedByClient() == true) {
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
i = entries.erase(i);
|
||||
}
|
||||
// Remote
|
||||
remoteRepo.clearEntries();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets confirmed = false for all SPITTypes.
|
||||
* This should be called when the client has loaded a project.
|
||||
*/
|
||||
void SPITType::setConfirmedFalse(SpitRepo<SPITType> &repo) {
|
||||
auto &entries = repo.getRepo();
|
||||
for (auto i = entries.begin(); i != entries.end(); i++) {
|
||||
i->second->setConfirmed(false);
|
||||
}
|
||||
}
|
||||
|
||||
SPITType::SPITType(string p_ID) {
|
||||
m_ID = p_ID;
|
||||
}
|
||||
|
||||
SPITType::SPITType(string id, string grpName, string name, bool fixed, bool projectIndependent, long long defaultDelay, long long defaultDuration) {
|
||||
m_ActionAssigned = false;
|
||||
m_Confirmed = false;
|
||||
m_ID = id;
|
||||
m_GroupName = grpName;
|
||||
m_Name = name;
|
||||
m_Fixed = fixed;
|
||||
m_ServerProjectIndepended = projectIndependent;
|
||||
m_DefaultDelay = defaultDelay;
|
||||
m_DefaultDuration = defaultDuration;
|
||||
}
|
||||
|
||||
void SPITType::setCreatedByClient(bool p_CreatedByClient) {
|
||||
m_CreatedByClient = p_CreatedByClient;
|
||||
}
|
||||
|
||||
/**
|
||||
* This is used by the server and client to tell if the other side has registered the changes.
|
||||
* @param p_Confirmed
|
||||
* @return if m_Confirmed has changed
|
||||
*/
|
||||
bool SPITType::setConfirmed(bool p_Confirmed) {
|
||||
if (m_Confirmed == p_Confirmed)
|
||||
return false;
|
||||
m_Confirmed = p_Confirmed;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool SPITType::setGroupName(const string &p_GroupName) {
|
||||
if (m_GroupName == p_GroupName)
|
||||
return false;
|
||||
m_GroupName = p_GroupName;
|
||||
m_Confirmed = false;
|
||||
return true;
|
||||
}
|
||||
bool SPITType::setName(const string &p_Name) {
|
||||
if (m_Name == p_Name)
|
||||
return false;
|
||||
m_Name = p_Name;
|
||||
m_Confirmed = false;
|
||||
return true;
|
||||
}
|
||||
bool SPITType::setServerRemote(bool p_BelongstoServer) {
|
||||
if (m_ServerRemote == p_BelongstoServer)
|
||||
return false;
|
||||
m_ServerRemote = p_BelongstoServer;
|
||||
m_Confirmed = false;
|
||||
return true;
|
||||
}
|
||||
bool SPITType::setProjectIndepended(bool p_ProjectIndepended) {
|
||||
if (m_ServerProjectIndepended == p_ProjectIndepended)
|
||||
return false;
|
||||
m_ServerProjectIndepended = p_ProjectIndepended;
|
||||
m_Confirmed = false;
|
||||
return true;
|
||||
}
|
||||
bool SPITType::setFixed(bool p_Fixed) {
|
||||
if (m_Fixed == p_Fixed)
|
||||
return false;
|
||||
m_Fixed = p_Fixed;
|
||||
m_Confirmed = false;
|
||||
return true;
|
||||
}
|
||||
bool SPITType::setDefaultDelay(long long p_Delay) {
|
||||
if (m_DefaultDelay == p_Delay)
|
||||
return false;
|
||||
m_DefaultDelay = p_Delay;
|
||||
m_Confirmed = false;
|
||||
return true;
|
||||
}
|
||||
bool SPITType::setDefaultDuration(long long p_Duration) {
|
||||
if (m_DefaultDuration == p_Duration)
|
||||
return false;
|
||||
m_DefaultDuration = p_Duration;
|
||||
m_Confirmed = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Virtual construct - means ActionAssigned for SPITTypes is is not implemented in SPITProtocol.
|
||||
* This can used to setActionAssigned to all SPITObjects with this SPITType.
|
||||
* This may be used in the case when the same action should be done for every SPITObject with this SPITType associated.
|
||||
* @return true = the m_ActionAssigned has changed.
|
||||
*/
|
||||
bool SPITType::setActionAssigned(bool p_ActionAssigned) {
|
||||
if (m_ActionAssigned == p_ActionAssigned)
|
||||
return false;
|
||||
m_ActionAssigned = p_ActionAssigned;
|
||||
m_Confirmed = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the content of the SPITType as received from the server
|
||||
* @param p_ReportSPITType
|
||||
* @return true = the SPITType is changed
|
||||
* false = the SPITType is NOT changed, because it is not allowed to change.
|
||||
*/
|
||||
bool SPITType::setMessageOP(Message::ReportType &reportSpitType) {
|
||||
bool boolChangeAllowed;
|
||||
bool boolChanged = false;
|
||||
|
||||
if (m_CreatedByClient == true && m_Fixed == true) {
|
||||
boolChangeAllowed = false;
|
||||
} else {
|
||||
boolChangeAllowed = true;
|
||||
}
|
||||
|
||||
// Confirmation should be changeable
|
||||
if (m_CreatedByClient) {
|
||||
// Server reports a client created SPITType -> the type is confirmed
|
||||
m_Confirmed = true;
|
||||
} else {
|
||||
// type is NOT client created -> the client has to confirm the SPITtype
|
||||
m_Confirmed = reportSpitType.getConfirmed();
|
||||
}
|
||||
if (m_DefaultDelay != reportSpitType.getDelay()) {
|
||||
if (boolChangeAllowed == false) {
|
||||
return false;
|
||||
}
|
||||
m_DefaultDelay = reportSpitType.getDelay();
|
||||
boolChanged = true;
|
||||
}
|
||||
if (m_DefaultDuration != reportSpitType.getDuration()) {
|
||||
if (boolChangeAllowed == false) {
|
||||
return false;
|
||||
}
|
||||
m_DefaultDuration = reportSpitType.getDuration();
|
||||
boolChanged = true;
|
||||
}
|
||||
if (m_Fixed != reportSpitType.getFixed()) {
|
||||
if (boolChangeAllowed == false) {
|
||||
return false;
|
||||
}
|
||||
m_Fixed = reportSpitType.getFixed();
|
||||
boolChanged = true;
|
||||
}
|
||||
if (m_GroupName != reportSpitType.getGroupName()) {
|
||||
if (boolChangeAllowed == false) {
|
||||
return false;
|
||||
}
|
||||
m_GroupName = reportSpitType.getGroupName();
|
||||
boolChanged = true;
|
||||
}
|
||||
if (m_ID != reportSpitType.getID()) {
|
||||
if (boolChangeAllowed == false) {
|
||||
return false;
|
||||
}
|
||||
m_ID = reportSpitType.getID();
|
||||
boolChanged = true;
|
||||
}
|
||||
if (m_Name != reportSpitType.getName()) {
|
||||
if (boolChangeAllowed == false) {
|
||||
return false;
|
||||
}
|
||||
m_Name = reportSpitType.getName();
|
||||
boolChanged = true;
|
||||
}
|
||||
if (m_ServerProjectIndepended != reportSpitType.getServerProjectIndepended()) {
|
||||
if (boolChangeAllowed == false) {
|
||||
return false;
|
||||
}
|
||||
m_ServerProjectIndepended = reportSpitType.getServerProjectIndepended();
|
||||
boolChanged = true;
|
||||
}
|
||||
if (m_ServerRemote != reportSpitType.getServerRemote()) {
|
||||
if (boolChangeAllowed == false) {
|
||||
return false;
|
||||
}
|
||||
m_ServerRemote = reportSpitType.getServerRemote();
|
||||
boolChanged = true;
|
||||
}
|
||||
return boolChanged;
|
||||
}
|
||||
|
||||
void SPITType::fillMessageOP(Message::ReportType &smReportSpitType) const {
|
||||
smReportSpitType.setConfirmed(m_Confirmed);
|
||||
smReportSpitType.setDelay(m_DefaultDelay);
|
||||
smReportSpitType.setDuration(m_DefaultDuration);
|
||||
smReportSpitType.setFixed(m_Fixed);
|
||||
smReportSpitType.setGroupName(m_GroupName);
|
||||
smReportSpitType.setID(m_ID);
|
||||
smReportSpitType.setName(m_Name);
|
||||
smReportSpitType.setServerProjectIndepended(m_ServerProjectIndepended);
|
||||
smReportSpitType.setServerRemote(m_ServerRemote);
|
||||
}
|
||||
void SPITType::fillMessageOP(Message::RemoveType &smRemoveSpitType) const {
|
||||
smRemoveSpitType.setID(m_ID);
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,18 +1,3 @@
|
||||
/*
|
||||
* To change this license header, choose License Headers in Project Properties.
|
||||
* To change this template file, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Message contains all SPIT messages.
|
||||
* A Message contains a Header and an OPPart.
|
||||
*
|
||||
* File: Message.cpp
|
||||
* Author: Hagi
|
||||
*
|
||||
* Created on 3. April 2019, 08:51
|
||||
*/
|
||||
|
||||
#include "spit_message.hpp"
|
||||
|
||||
@@ -47,76 +32,76 @@ bool Message::parse(std::vector<char> message) {
|
||||
// parse OP
|
||||
switch (header->getType()) {
|
||||
case Message::Connect::OPFLAG: { // Connection
|
||||
m_OPPart = make_unique<Connect>(move(header));
|
||||
oPPart = make_unique<Connect>(move(header));
|
||||
} break;
|
||||
case Message::ConnectAnswer::OPFLAG: {
|
||||
m_OPPart = make_unique<ConnectAnswer>(move(header));
|
||||
oPPart = make_unique<ConnectAnswer>(move(header));
|
||||
} break;
|
||||
case Disconnect::OPFLAG: {
|
||||
m_OPPart = make_unique<Disconnect>(move(header));
|
||||
oPPart = make_unique<Disconnect>(move(header));
|
||||
} break;
|
||||
case Watchdog::OPFLAG: {
|
||||
m_OPPart = make_unique<Watchdog>(move(header));
|
||||
oPPart = make_unique<Watchdog>(move(header));
|
||||
} break;
|
||||
case WatchdogAnswer::OPFLAG: {
|
||||
m_OPPart = make_unique<WatchdogAnswer>(move(header));
|
||||
oPPart = make_unique<WatchdogAnswer>(move(header));
|
||||
} break;
|
||||
case ReportProject::OPFLAG: { // SpitProject
|
||||
m_OPPart = make_unique<ReportProject>(move(header));
|
||||
oPPart = make_unique<ReportProject>(move(header));
|
||||
} break;
|
||||
case CloseProject::OPFLAG: {
|
||||
m_OPPart = make_unique<CloseProject>(move(header));
|
||||
oPPart = make_unique<CloseProject>(move(header));
|
||||
} break;
|
||||
case RequestProjectTransfer::OPFLAG: {
|
||||
m_OPPart = make_unique<RequestProjectTransfer>(move(header));
|
||||
oPPart = make_unique<RequestProjectTransfer>(move(header));
|
||||
} break;
|
||||
case StartProjectTransfer::OPFLAG: {
|
||||
m_OPPart = make_unique<StartProjectTransfer>(move(header));
|
||||
oPPart = make_unique<StartProjectTransfer>(move(header));
|
||||
} break;
|
||||
case EndProjectTransfer::OPFLAG: {
|
||||
m_OPPart = make_unique<EndProjectTransfer>(move(header));
|
||||
oPPart = make_unique<EndProjectTransfer>(move(header));
|
||||
} break;
|
||||
case ReportType::OPFLAG: { // SpitType
|
||||
m_OPPart = make_unique<ReportType>(move(header));
|
||||
oPPart = make_unique<ReportType>(move(header));
|
||||
} break;
|
||||
case RemoveType::OPFLAG: {
|
||||
m_OPPart = make_unique<RemoveType>(move(header));
|
||||
oPPart = make_unique<RemoveType>(move(header));
|
||||
} break;
|
||||
case ReportObject::OPFLAG: { // SpitObject
|
||||
m_OPPart = make_unique<ReportObject>(move(header));
|
||||
oPPart = make_unique<ReportObject>(move(header));
|
||||
} break;
|
||||
case RemoveObject::OPFLAG: {
|
||||
m_OPPart = make_unique<RemoveObject>(move(header));
|
||||
oPPart = make_unique<RemoveObject>(move(header));
|
||||
} break;
|
||||
case PlayStart::OPFLAG: { // PlaySpitObjects
|
||||
m_OPPart = make_unique<PlayStart>(move(header));
|
||||
oPPart = make_unique<PlayStart>(move(header));
|
||||
} break;
|
||||
case PlayObject::OPFLAG: {
|
||||
m_OPPart = make_unique<PlayObject>(move(header));
|
||||
oPPart = make_unique<PlayObject>(move(header));
|
||||
} break;
|
||||
case PlayEnd::OPFLAG: {
|
||||
m_OPPart = make_unique<PlayEnd>(move(header));
|
||||
oPPart = make_unique<PlayEnd>(move(header));
|
||||
} break;
|
||||
case ReportPlayStatus::OPFLAG: {
|
||||
m_OPPart = make_unique<ReportPlayStatus>(move(header));
|
||||
oPPart = make_unique<ReportPlayStatus>(move(header));
|
||||
} break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
return m_OPPart->parse(message);
|
||||
return oPPart->parse(message);
|
||||
}
|
||||
|
||||
//---------- Send ----------
|
||||
std::vector<char> Message::createMessage(OPPart &p_OPPart) {
|
||||
if (!p_OPPart.getHeader()) {
|
||||
std::vector<char> Message::createMessage(OPPart &oPPart) {
|
||||
if (!oPPart.getHeader()) {
|
||||
return {};
|
||||
}
|
||||
|
||||
try {
|
||||
int totalSize = Header::BYTESLENGTH + p_OPPart.getBytesCount();
|
||||
int totalSize = Header::BYTESLENGTH + oPPart.getBytesCount();
|
||||
std::vector<char> msgByts(totalSize);
|
||||
p_OPPart.fillBytes(msgByts);
|
||||
oPPart.fillBytes(msgByts);
|
||||
return msgByts;
|
||||
} catch (...) {
|
||||
ESP_LOGE(TAG, "Failed to allocate memory");
|
||||
@@ -128,8 +113,8 @@ std::vector<char> Message::createMessage(OPPart &p_OPPart) {
|
||||
Message::Header::Header(const Header &orig) {
|
||||
mID = &SPITID[0];
|
||||
mMessageNumber = orig.getMessageNumber();
|
||||
mServerID = orig.getServerID();
|
||||
mClientID = orig.getClientID();
|
||||
mServerId = orig.getServerID();
|
||||
mClientId = orig.getClientID();
|
||||
}
|
||||
|
||||
Message::Header::Header() {
|
||||
@@ -152,8 +137,8 @@ bool Message::Header::parse(const std::vector<char> &message) {
|
||||
if (mBytesCount < 0) {
|
||||
return false;
|
||||
}
|
||||
mServerID = getString(message, mParseOffset, 41).value();
|
||||
mClientID = getString(message, mParseOffset, 41).value();
|
||||
mServerId = getString(message, mParseOffset, 41).value();
|
||||
mClientId = getString(message, mParseOffset, 41).value();
|
||||
mOpFlag = message[mParseOffset++] & 0xFF;
|
||||
} catch (...) {
|
||||
ESP_LOGE(TAG, "failed to parse Header");
|
||||
@@ -176,8 +161,8 @@ bool Message::Header::fillBytes(std::vector<char> &message) {
|
||||
mParseOffset += setInt(SPITVERSION, message, mParseOffset);
|
||||
mParseOffset += setByte(mMessageNumber, message, mParseOffset);
|
||||
mParseOffset += setInt(mBytesCount, message, mParseOffset);
|
||||
mParseOffset += setString(mServerID, message, mParseOffset, 41);
|
||||
mParseOffset += setString(mClientID, message, mParseOffset, 41);
|
||||
mParseOffset += setString(mServerId, message, mParseOffset, 41);
|
||||
mParseOffset += setString(mClientId, message, mParseOffset, 41);
|
||||
mParseOffset += setByte(mOpFlag, message, mParseOffset);
|
||||
} catch (...) {
|
||||
ESP_LOGE(TAG, "failed to create Header");
|
||||
@@ -226,12 +211,12 @@ bool Message::Connect::parse(const std::vector<char> &message) {
|
||||
try {
|
||||
mParseOffset = Header::BYTESLENGTH;
|
||||
mBytesCount = getInt(message, mParseOffset).value();
|
||||
m_ClientComputerName = getString(message, mParseOffset, 64).value();
|
||||
m_ClientName = getString(message, mParseOffset, 64).value();
|
||||
m_LoginName = getString(message, mParseOffset, 64).value();
|
||||
m_LoginPassword = getString(message, mParseOffset, 64).value();
|
||||
m_ServerIP = getString(message, mParseOffset, 40).value();
|
||||
m_ServerPort = getInt(message, mParseOffset).value();
|
||||
mClientComputerName = getString(message, mParseOffset, 64).value();
|
||||
mClientName = getString(message, mParseOffset, 64).value();
|
||||
mLoginName = getString(message, mParseOffset, 64).value();
|
||||
mLoginPassword = getString(message, mParseOffset, 64).value();
|
||||
mServerIp = getString(message, mParseOffset, 40).value();
|
||||
mServerPort = getInt(message, mParseOffset).value();
|
||||
} catch (...) {
|
||||
ESP_LOGE(TAG, "failed to parse Connect message");
|
||||
return false;
|
||||
@@ -240,17 +225,17 @@ bool Message::Connect::parse(const std::vector<char> &message) {
|
||||
}
|
||||
|
||||
// Send
|
||||
Message::Connect::Connect(string p_ComputerName, string p_ClientName)
|
||||
Message::Connect::Connect(string pComputerName, string pClientName)
|
||||
: OPPart(BYTESLENGTH),
|
||||
m_ClientComputerName(p_ComputerName),
|
||||
m_ClientName(p_ClientName) {
|
||||
mClientComputerName(pComputerName),
|
||||
mClientName(pClientName) {
|
||||
setHeader(OPFLAG);
|
||||
mParseOffset = Header::BYTESLENGTH;
|
||||
}
|
||||
void Message::Connect::setServerPort(int p_ServerPort) {
|
||||
if (p_ServerPort < 0 || p_ServerPort > 65535)
|
||||
p_ServerPort = 0;
|
||||
m_ServerPort = p_ServerPort;
|
||||
mServerPort = p_ServerPort;
|
||||
}
|
||||
bool Message::Connect::fillBytes(std::vector<char> &message) {
|
||||
if (!mHeader) {
|
||||
@@ -261,12 +246,12 @@ bool Message::Connect::fillBytes(std::vector<char> &message) {
|
||||
try {
|
||||
mParseOffset = Header::BYTESLENGTH;
|
||||
mParseOffset += setInt(mBytesCount, message, mParseOffset);
|
||||
mParseOffset += setString(m_ClientComputerName, message, mParseOffset, 64);
|
||||
mParseOffset += setString(m_ClientName, message, mParseOffset, 64);
|
||||
mParseOffset += setString(m_LoginName, message, mParseOffset, 64);
|
||||
mParseOffset += setString(m_LoginPassword, message, mParseOffset, 64);
|
||||
mParseOffset += setString(m_ServerIP, message, mParseOffset, 40);
|
||||
mParseOffset += setInt(m_ServerPort, message, mParseOffset);
|
||||
mParseOffset += setString(mClientComputerName, message, mParseOffset, 64);
|
||||
mParseOffset += setString(mClientName, message, mParseOffset, 64);
|
||||
mParseOffset += setString(mLoginName, message, mParseOffset, 64);
|
||||
mParseOffset += setString(mLoginPassword, message, mParseOffset, 64);
|
||||
mParseOffset += setString(mServerIp, message, mParseOffset, 40);
|
||||
mParseOffset += setInt(mServerPort, message, mParseOffset);
|
||||
} catch (...) {
|
||||
ESP_LOGE(TAG, "failed to create Connect message");
|
||||
return false;
|
||||
@@ -289,10 +274,10 @@ bool Message::ConnectAnswer::parse(const std::vector<char> &message) {
|
||||
try {
|
||||
mParseOffset = Header::BYTESLENGTH;
|
||||
mBytesCount = getInt(message, mParseOffset).value();
|
||||
m_ServerComputerName = getString(message, mParseOffset, 64).value();
|
||||
m_ServerName = getString(message, mParseOffset, 64).value();
|
||||
m_StepTime = getInt(message, mParseOffset).value();
|
||||
m_Connected = getBoolean(message, mParseOffset).value();
|
||||
mServerComputerName = getString(message, mParseOffset, 64).value();
|
||||
mServerName = getString(message, mParseOffset, 64).value();
|
||||
mStepTime = getInt(message, mParseOffset).value();
|
||||
mConnected = getBoolean(message, mParseOffset).value();
|
||||
} catch (...) {
|
||||
ESP_LOGE(TAG, "failed to parse ConnectAnswer message");
|
||||
return false;
|
||||
@@ -309,7 +294,7 @@ Message::ConnectAnswer::ConnectAnswer()
|
||||
void Message::ConnectAnswer::setStepTime(int p_StepTime_ms) {
|
||||
if (p_StepTime_ms < 0)
|
||||
p_StepTime_ms = 1;
|
||||
m_StepTime = p_StepTime_ms;
|
||||
mStepTime = p_StepTime_ms;
|
||||
}
|
||||
bool Message::ConnectAnswer::fillBytes(std::vector<char> &message) {
|
||||
if (!mHeader) {
|
||||
@@ -320,10 +305,10 @@ bool Message::ConnectAnswer::fillBytes(std::vector<char> &message) {
|
||||
try {
|
||||
mParseOffset = Header::BYTESLENGTH;
|
||||
mParseOffset += setInt(mBytesCount, message, mParseOffset);
|
||||
mParseOffset += setString(m_ServerComputerName, message, mParseOffset, 64);
|
||||
mParseOffset += setString(m_ServerName, message, mParseOffset, 64);
|
||||
mParseOffset += setInt(m_StepTime, message, mParseOffset);
|
||||
mParseOffset += setBoolean(m_Connected, message, mParseOffset);
|
||||
mParseOffset += setString(mServerComputerName, message, mParseOffset, 64);
|
||||
mParseOffset += setString(mServerName, message, mParseOffset, 64);
|
||||
mParseOffset += setInt(mStepTime, message, mParseOffset);
|
||||
mParseOffset += setBoolean(mConnected, message, mParseOffset);
|
||||
} catch (...) {
|
||||
ESP_LOGE(TAG, "failed to create ConnectAnswer message");
|
||||
return false;
|
||||
@@ -478,9 +463,9 @@ bool Message::ReportProject::parse(const std::vector<char> &message) {
|
||||
try {
|
||||
mParseOffset = Header::BYTESLENGTH;
|
||||
mBytesCount = getInt(message, mParseOffset).value();
|
||||
m_ProjectID = getString(message, mParseOffset, 41).value();
|
||||
m_ProjectName = getString(message, mParseOffset, 64).value();
|
||||
m_FramesPerSecond = getInt(message, mParseOffset).value();
|
||||
mProjectID = getString(message, mParseOffset, 41).value();
|
||||
mProjectName = getString(message, mParseOffset, 64).value();
|
||||
mFramesPerSecond = getInt(message, mParseOffset).value();
|
||||
} catch (...) {
|
||||
ESP_LOGE(TAG, "failed to parse ReportProject message");
|
||||
return false;
|
||||
@@ -490,8 +475,8 @@ bool Message::ReportProject::parse(const std::vector<char> &message) {
|
||||
// Send
|
||||
Message::ReportProject::ReportProject(string p_ProjectID, string p_ProjectName)
|
||||
: OPPart(BYTESLENGTH),
|
||||
m_ProjectID(p_ProjectID),
|
||||
m_ProjectName(p_ProjectName) {
|
||||
mProjectID(p_ProjectID),
|
||||
mProjectName(p_ProjectName) {
|
||||
setHeader(OPFLAG);
|
||||
mParseOffset = Header::BYTESLENGTH;
|
||||
}
|
||||
@@ -505,9 +490,9 @@ bool Message::ReportProject::fillBytes(std::vector<char> &message) {
|
||||
try {
|
||||
mParseOffset = Header::BYTESLENGTH;
|
||||
mParseOffset += setInt(mBytesCount, message, mParseOffset);
|
||||
mParseOffset += setString(m_ProjectID, message, mParseOffset, 41);
|
||||
mParseOffset += setString(m_ProjectName, message, mParseOffset, 64);
|
||||
mParseOffset += setInt(m_FramesPerSecond, message, mParseOffset);
|
||||
mParseOffset += setString(mProjectID, message, mParseOffset, 41);
|
||||
mParseOffset += setString(mProjectName, message, mParseOffset, 64);
|
||||
mParseOffset += setInt(mFramesPerSecond, message, mParseOffset);
|
||||
} catch (...) {
|
||||
ESP_LOGE(TAG, "failed to create ReportProject message");
|
||||
return false;
|
||||
@@ -531,7 +516,7 @@ bool Message::CloseProject::parse(const std::vector<char> &message) {
|
||||
try {
|
||||
mParseOffset = Header::BYTESLENGTH;
|
||||
mBytesCount = getInt(message, mParseOffset).value();
|
||||
m_ProjectID = getString(message, mParseOffset, 41).value();
|
||||
mProjectID = getString(message, mParseOffset, 41).value();
|
||||
} catch (...) {
|
||||
ESP_LOGE(TAG, "failed to parse CloseProject message");
|
||||
return false;
|
||||
@@ -541,7 +526,7 @@ bool Message::CloseProject::parse(const std::vector<char> &message) {
|
||||
// Send
|
||||
Message::CloseProject::CloseProject(string projectID)
|
||||
: OPPart(BYTESLENGTH),
|
||||
m_ProjectID(projectID) {
|
||||
mProjectID(projectID) {
|
||||
setHeader(OPFLAG);
|
||||
mParseOffset = Header::BYTESLENGTH;
|
||||
}
|
||||
@@ -555,7 +540,7 @@ bool Message::CloseProject::fillBytes(std::vector<char> &message) {
|
||||
try {
|
||||
mParseOffset = Header::BYTESLENGTH;
|
||||
mParseOffset += setInt(mBytesCount, message, mParseOffset);
|
||||
mParseOffset += setString(m_ProjectID, message, mParseOffset, 41);
|
||||
mParseOffset += setString(mProjectID, message, mParseOffset, 41);
|
||||
} catch (...) {
|
||||
ESP_LOGE(TAG, "failed to create CloseProject message");
|
||||
return false;
|
||||
@@ -714,15 +699,15 @@ bool Message::ReportType::parse(const std::vector<char> &message) {
|
||||
try {
|
||||
mParseOffset = Header::BYTESLENGTH;
|
||||
mBytesCount = getInt(message, mParseOffset).value();
|
||||
m_Confirmed = getBoolean(message, mParseOffset).value();
|
||||
m_SPITTypeID = getString(message, mParseOffset, 41).value();
|
||||
m_Fixed = getBoolean(message, mParseOffset).value();
|
||||
m_ServerRemote = getBoolean(message, mParseOffset).value();
|
||||
m_ServerProjectIndepended = getBoolean(message, mParseOffset).value();
|
||||
m_SPITTypeGroupName = getString(message, mParseOffset, 39).value();
|
||||
m_SPITTypeName = getString(message, mParseOffset, 64).value();
|
||||
m_Delay = getLong(message, mParseOffset).value();
|
||||
m_Duration = getLong(message, mParseOffset).value();
|
||||
mConfirmed = getBoolean(message, mParseOffset).value();
|
||||
mSPITTypeID = getString(message, mParseOffset, 41).value();
|
||||
mFixed = getBoolean(message, mParseOffset).value();
|
||||
mServerRemote = getBoolean(message, mParseOffset).value();
|
||||
mServerProjectIndepended = getBoolean(message, mParseOffset).value();
|
||||
mTypeGroupName = getString(message, mParseOffset, 39).value();
|
||||
mSPITTypeName = getString(message, mParseOffset, 64).value();
|
||||
mDelay = getLong(message, mParseOffset).value();
|
||||
mDuration = getLong(message, mParseOffset).value();
|
||||
} catch (...) {
|
||||
ESP_LOGE(TAG, "failed to parse ReportType message");
|
||||
return false;
|
||||
@@ -745,15 +730,15 @@ bool Message::ReportType::fillBytes(std::vector<char> &message) {
|
||||
try {
|
||||
mParseOffset = mHeader->BYTESLENGTH;
|
||||
mParseOffset += setInt(mBytesCount, message, mParseOffset);
|
||||
mParseOffset += setBoolean(m_Confirmed, message, mParseOffset);
|
||||
mParseOffset += setString(m_SPITTypeID, message, mParseOffset, 41);
|
||||
mParseOffset += setBoolean(m_Fixed, message, mParseOffset);
|
||||
mParseOffset += setBoolean(m_ServerRemote, message, mParseOffset);
|
||||
mParseOffset += setBoolean(m_ServerProjectIndepended, message, mParseOffset);
|
||||
mParseOffset += setString(m_SPITTypeGroupName, message, mParseOffset, 39);
|
||||
mParseOffset += setString(m_SPITTypeName, message, mParseOffset, 64);
|
||||
mParseOffset += setLong(m_Delay, message, mParseOffset);
|
||||
mParseOffset += setLong(m_Duration, message, mParseOffset);
|
||||
mParseOffset += setBoolean(mConfirmed, message, mParseOffset);
|
||||
mParseOffset += setString(mSPITTypeID, message, mParseOffset, 41);
|
||||
mParseOffset += setBoolean(mFixed, message, mParseOffset);
|
||||
mParseOffset += setBoolean(mServerRemote, message, mParseOffset);
|
||||
mParseOffset += setBoolean(mServerProjectIndepended, message, mParseOffset);
|
||||
mParseOffset += setString(mTypeGroupName, message, mParseOffset, 39);
|
||||
mParseOffset += setString(mSPITTypeName, message, mParseOffset, 64);
|
||||
mParseOffset += setLong(mDelay, message, mParseOffset);
|
||||
mParseOffset += setLong(mDuration, message, mParseOffset);
|
||||
} catch (...) {
|
||||
ESP_LOGE(TAG, "failed to create ReportType message");
|
||||
return false;
|
||||
@@ -777,7 +762,7 @@ bool Message::RemoveType::parse(const std::vector<char> &message) {
|
||||
try {
|
||||
mParseOffset = Header::BYTESLENGTH;
|
||||
mBytesCount = getInt(message, mParseOffset).value();
|
||||
m_SPITTypeID = getString(message, mParseOffset, 41).value();
|
||||
mSPITTypeID = getString(message, mParseOffset, 41).value();
|
||||
} catch (...) {
|
||||
ESP_LOGE(TAG, "failed to parse RemoveType message");
|
||||
return false;
|
||||
@@ -800,7 +785,7 @@ bool Message::RemoveType::fillBytes(std::vector<char> &message) {
|
||||
try {
|
||||
mParseOffset = Header::BYTESLENGTH;
|
||||
mParseOffset += setInt(mBytesCount, message, mParseOffset);
|
||||
mParseOffset += setString(m_SPITTypeID, message, mParseOffset, 41);
|
||||
mParseOffset += setString(mSPITTypeID, message, mParseOffset, 41);
|
||||
} catch (...) {
|
||||
ESP_LOGE(TAG, "failed to create RemoveType message");
|
||||
return false;
|
||||
@@ -825,24 +810,24 @@ bool Message::ReportObject::parse(const std::vector<char> &message) {
|
||||
try {
|
||||
mParseOffset = Header::BYTESLENGTH;
|
||||
mBytesCount = getInt(message, mParseOffset).value();
|
||||
m_Confirmed = getBoolean(message, mParseOffset).value();
|
||||
m_SPITObjectID = getString(message, mParseOffset, 41).value();
|
||||
m_Fixed = getBoolean(message, mParseOffset).value();
|
||||
m_ServerRemote = getBoolean(message, mParseOffset).value();
|
||||
m_SPITObjectName = getString(message, mParseOffset, 64).value();
|
||||
m_SPITTypeID = getString(message, mParseOffset, 41).value();
|
||||
m_ServerParams = getString(message, mParseOffset, 64).value();
|
||||
m_FrameStart = getLong(message, mParseOffset).value();
|
||||
m_FrameLength = getLong(message, mParseOffset).value();
|
||||
m_FrameFadeInLength = getLong(message, mParseOffset).value();
|
||||
m_FrameFadeOutLength = getLong(message, mParseOffset).value();
|
||||
m_ValueFactor = getInt(message, mParseOffset).value();
|
||||
m_ValueUse = getByte(message, mParseOffset).value();
|
||||
m_Track = getInt(message, mParseOffset).value();
|
||||
m_Remark = getString(message, mParseOffset, 64).value();
|
||||
m_Delay = getLong(message, mParseOffset).value();
|
||||
m_Duration = getLong(message, mParseOffset).value();
|
||||
m_ActionAssigned = getBoolean(message, mParseOffset).value();
|
||||
mConfirmed = getBoolean(message, mParseOffset).value();
|
||||
mSPITObjectID = getString(message, mParseOffset, 41).value();
|
||||
mFixed = getBoolean(message, mParseOffset).value();
|
||||
mServerRemote = getBoolean(message, mParseOffset).value();
|
||||
mSPITObjectName = getString(message, mParseOffset, 64).value();
|
||||
mSPITTypeID = getString(message, mParseOffset, 41).value();
|
||||
mServerParams = getString(message, mParseOffset, 64).value();
|
||||
mFrameStart = getLong(message, mParseOffset).value();
|
||||
mFrameLength = getLong(message, mParseOffset).value();
|
||||
mFrameFadeInLength = getLong(message, mParseOffset).value();
|
||||
mFrameFadeOutLength = getLong(message, mParseOffset).value();
|
||||
mValueFactor = getInt(message, mParseOffset).value();
|
||||
mValueUse = getByte(message, mParseOffset).value();
|
||||
mTrack = getInt(message, mParseOffset).value();
|
||||
mRemark = getString(message, mParseOffset, 64).value();
|
||||
mDelay = getLong(message, mParseOffset).value();
|
||||
mDuration = getLong(message, mParseOffset).value();
|
||||
mActionAssigned = getBoolean(message, mParseOffset).value();
|
||||
} catch (...) {
|
||||
ESP_LOGE(TAG, "failed to parse ReportObject message");
|
||||
return false;
|
||||
@@ -858,12 +843,12 @@ Message::ReportObject::ReportObject() : OPPart(BYTESLENGTH) {
|
||||
void Message::ReportObject::setDelay(uint64_t p_Delay) {
|
||||
if (p_Delay < 0)
|
||||
p_Delay = 0;
|
||||
m_Delay = p_Delay;
|
||||
mDelay = p_Delay;
|
||||
}
|
||||
void Message::ReportObject::setDuration(uint64_t p_Duration) {
|
||||
if (p_Duration < 0)
|
||||
p_Duration = 0;
|
||||
m_Duration = p_Duration;
|
||||
mDuration = p_Duration;
|
||||
}
|
||||
|
||||
bool Message::ReportObject::fillBytes(std::vector<char> &message) {
|
||||
@@ -875,24 +860,24 @@ bool Message::ReportObject::fillBytes(std::vector<char> &message) {
|
||||
try {
|
||||
mParseOffset = Header::BYTESLENGTH;
|
||||
mParseOffset += setInt(mBytesCount, message, mParseOffset);
|
||||
mParseOffset += setBoolean(m_Confirmed, message, mParseOffset);
|
||||
mParseOffset += setString(m_SPITObjectID, message, mParseOffset, 41);
|
||||
mParseOffset += setBoolean(m_Fixed, message, mParseOffset);
|
||||
mParseOffset += setBoolean(m_ServerRemote, message, mParseOffset);
|
||||
mParseOffset += setString(m_SPITObjectName, message, mParseOffset, 64);
|
||||
mParseOffset += setString(m_SPITTypeID, message, mParseOffset, 41);
|
||||
mParseOffset += setString(m_ServerParams, message, mParseOffset, 64);
|
||||
mParseOffset += setLong(m_FrameStart, message, mParseOffset);
|
||||
mParseOffset += setLong(m_FrameLength, message, mParseOffset);
|
||||
mParseOffset += setLong(m_FrameFadeInLength, message, mParseOffset);
|
||||
mParseOffset += setLong(m_FrameFadeOutLength, message, mParseOffset);
|
||||
mParseOffset += setInt(m_ValueFactor, message, mParseOffset);
|
||||
mParseOffset += setByte(m_ValueUse, message, mParseOffset);
|
||||
mParseOffset += setInt(m_Track, message, mParseOffset);
|
||||
mParseOffset += setString(m_Remark, message, mParseOffset, 64);
|
||||
mParseOffset += setLong(m_Delay, message, mParseOffset);
|
||||
mParseOffset += setLong(m_Duration, message, mParseOffset);
|
||||
mParseOffset += setBoolean(m_ActionAssigned, message, mParseOffset);
|
||||
mParseOffset += setBoolean(mConfirmed, message, mParseOffset);
|
||||
mParseOffset += setString(mSPITObjectID, message, mParseOffset, 41);
|
||||
mParseOffset += setBoolean(mFixed, message, mParseOffset);
|
||||
mParseOffset += setBoolean(mServerRemote, message, mParseOffset);
|
||||
mParseOffset += setString(mSPITObjectName, message, mParseOffset, 64);
|
||||
mParseOffset += setString(mSPITTypeID, message, mParseOffset, 41);
|
||||
mParseOffset += setString(mServerParams, message, mParseOffset, 64);
|
||||
mParseOffset += setLong(mFrameStart, message, mParseOffset);
|
||||
mParseOffset += setLong(mFrameLength, message, mParseOffset);
|
||||
mParseOffset += setLong(mFrameFadeInLength, message, mParseOffset);
|
||||
mParseOffset += setLong(mFrameFadeOutLength, message, mParseOffset);
|
||||
mParseOffset += setInt(mValueFactor, message, mParseOffset);
|
||||
mParseOffset += setByte(mValueUse, message, mParseOffset);
|
||||
mParseOffset += setInt(mTrack, message, mParseOffset);
|
||||
mParseOffset += setString(mRemark, message, mParseOffset, 64);
|
||||
mParseOffset += setLong(mDelay, message, mParseOffset);
|
||||
mParseOffset += setLong(mDuration, message, mParseOffset);
|
||||
mParseOffset += setBoolean(mActionAssigned, message, mParseOffset);
|
||||
} catch (...) {
|
||||
ESP_LOGE(TAG, "failed to create ReportObject message");
|
||||
return false;
|
||||
@@ -915,7 +900,7 @@ bool Message::RemoveObject::parse(const std::vector<char> &message) {
|
||||
try {
|
||||
mParseOffset = Header::BYTESLENGTH;
|
||||
mBytesCount = getInt(message, mParseOffset).value();
|
||||
m_SPITObjectID = getString(message, mParseOffset, 41).value();
|
||||
mSPITObjectID = getString(message, mParseOffset, 41).value();
|
||||
} catch (...) {
|
||||
ESP_LOGE(TAG, "failed to parse RemoveObject message");
|
||||
return false;
|
||||
@@ -938,7 +923,7 @@ bool Message::RemoveObject::fillBytes(std::vector<char> &message) {
|
||||
try {
|
||||
mParseOffset = Header::BYTESLENGTH;
|
||||
mParseOffset += setInt(mBytesCount, message, mParseOffset);
|
||||
mParseOffset += setString(m_SPITObjectID, message, mParseOffset, 41);
|
||||
mParseOffset += setString(mSPITObjectID, message, mParseOffset, 41);
|
||||
} catch (...) {
|
||||
ESP_LOGE(TAG, "failed to create RemoveObject message");
|
||||
return false;
|
||||
@@ -963,11 +948,11 @@ bool Message::PlayStart::parse(const std::vector<char> &message) {
|
||||
try {
|
||||
mParseOffset = Header::BYTESLENGTH;
|
||||
mBytesCount = getInt(message, mParseOffset).value();
|
||||
m_PlayerID = getString(message, mParseOffset, 41).value();
|
||||
m_PlayerName = getString(message, mParseOffset, 64).value();
|
||||
m_PlayerType = getByte(message, mParseOffset).value();
|
||||
m_PlayerIsRunning = getBoolean(message, mParseOffset).value();
|
||||
m_Time = getLong(message, mParseOffset).value();
|
||||
mPlayerID = getString(message, mParseOffset, 41).value();
|
||||
mPlayerName = getString(message, mParseOffset, 64).value();
|
||||
mPlayerType = getByte(message, mParseOffset).value();
|
||||
mPlayerIsRunning = getBoolean(message, mParseOffset).value();
|
||||
mTime = getLong(message, mParseOffset).value();
|
||||
} catch (...) {
|
||||
ESP_LOGE(TAG, "failed to parse PlayStart message");
|
||||
return false;
|
||||
@@ -978,9 +963,9 @@ bool Message::PlayStart::parse(const std::vector<char> &message) {
|
||||
// Send
|
||||
Message::PlayStart::PlayStart(string p_PlayerID, string p_PlayerName, char p_PlayerType)
|
||||
: OPPart(BYTESLENGTH),
|
||||
m_PlayerID(p_PlayerID),
|
||||
m_PlayerName(p_PlayerName),
|
||||
m_PlayerType(p_PlayerType) {
|
||||
mPlayerID(p_PlayerID),
|
||||
mPlayerName(p_PlayerName),
|
||||
mPlayerType(p_PlayerType) {
|
||||
setHeader(OPFLAG);
|
||||
mParseOffset = Header::BYTESLENGTH;
|
||||
}
|
||||
@@ -994,11 +979,11 @@ bool Message::PlayStart::fillBytes(std::vector<char> &message) {
|
||||
try {
|
||||
mParseOffset = Header::BYTESLENGTH;
|
||||
mParseOffset += setInt(mBytesCount, message, mParseOffset);
|
||||
mParseOffset += setString(m_PlayerID, message, mParseOffset, 41);
|
||||
mParseOffset += setString(m_PlayerName, message, mParseOffset, 64);
|
||||
mParseOffset += setByte(m_PlayerType, message, mParseOffset);
|
||||
mParseOffset += setBoolean(m_PlayerIsRunning, message, mParseOffset);
|
||||
mParseOffset += setLong(m_Time, message, mParseOffset);
|
||||
mParseOffset += setString(mPlayerID, message, mParseOffset, 41);
|
||||
mParseOffset += setString(mPlayerName, message, mParseOffset, 64);
|
||||
mParseOffset += setByte(mPlayerType, message, mParseOffset);
|
||||
mParseOffset += setBoolean(mPlayerIsRunning, message, mParseOffset);
|
||||
mParseOffset += setLong(mTime, message, mParseOffset);
|
||||
} catch (...) {
|
||||
ESP_LOGE(TAG, "failed to create PlayStart message");
|
||||
return false;
|
||||
@@ -1022,12 +1007,12 @@ bool Message::PlayObject::parse(const std::vector<char> &message) {
|
||||
try {
|
||||
mParseOffset = Header::BYTESLENGTH;
|
||||
mBytesCount = getInt(message, mParseOffset).value();
|
||||
m_PlayerID = getString(message, mParseOffset, 41).value();
|
||||
m_SPITObjectID = getString(message, mParseOffset, 41).value();
|
||||
m_FrameInsideObject = getLong(message, mParseOffset).value();
|
||||
m_PlayPrePosition = getBoolean(message, mParseOffset).value();
|
||||
m_Value = getInt(message, mParseOffset).value();
|
||||
m_ValueFlag = getByte(message, mParseOffset).value();
|
||||
mPlayerID = getString(message, mParseOffset, 41).value();
|
||||
mSPITObjectID = getString(message, mParseOffset, 41).value();
|
||||
mFrameInsideObject = getLong(message, mParseOffset).value();
|
||||
mPlayPrePosition = getBoolean(message, mParseOffset).value();
|
||||
mValue = getInt(message, mParseOffset).value();
|
||||
mValueFlag = getByte(message, mParseOffset).value();
|
||||
} catch (...) {
|
||||
ESP_LOGE(TAG, "failed to parse PlayObject message");
|
||||
return false;
|
||||
@@ -1049,12 +1034,12 @@ bool Message::PlayObject::fillBytes(std::vector<char> &message) {
|
||||
try {
|
||||
mParseOffset = Header::BYTESLENGTH;
|
||||
mParseOffset += setInt(mBytesCount, message, mParseOffset);
|
||||
mParseOffset += setString(m_PlayerID, message, mParseOffset, 41);
|
||||
mParseOffset += setString(m_SPITObjectID, message, mParseOffset, 41);
|
||||
mParseOffset += setLong(m_FrameInsideObject, message, mParseOffset);
|
||||
mParseOffset += setBoolean(m_PlayPrePosition, message, mParseOffset);
|
||||
mParseOffset += setInt(m_Value, message, mParseOffset);
|
||||
mParseOffset += setByte(m_ValueFlag, message, mParseOffset);
|
||||
mParseOffset += setString(mPlayerID, message, mParseOffset, 41);
|
||||
mParseOffset += setString(mSPITObjectID, message, mParseOffset, 41);
|
||||
mParseOffset += setLong(mFrameInsideObject, message, mParseOffset);
|
||||
mParseOffset += setBoolean(mPlayPrePosition, message, mParseOffset);
|
||||
mParseOffset += setInt(mValue, message, mParseOffset);
|
||||
mParseOffset += setByte(mValueFlag, message, mParseOffset);
|
||||
} catch (...) {
|
||||
ESP_LOGE(TAG, "failed to create PlayObject message");
|
||||
return false;
|
||||
@@ -1078,7 +1063,7 @@ bool Message::PlayEnd::parse(const std::vector<char> &message) {
|
||||
try {
|
||||
mParseOffset = Header::BYTESLENGTH;
|
||||
mBytesCount = getInt(message, mParseOffset).value();
|
||||
m_PlayerID = getString(message, mParseOffset, 41).value();
|
||||
mPlayerID = getString(message, mParseOffset, 41).value();
|
||||
} catch (...) {
|
||||
ESP_LOGE(TAG, "failed to parse PlayEnd message");
|
||||
return false;
|
||||
@@ -1088,7 +1073,7 @@ bool Message::PlayEnd::parse(const std::vector<char> &message) {
|
||||
// Send
|
||||
Message::PlayEnd::PlayEnd(string p_PlayerID)
|
||||
: OPPart(BYTESLENGTH),
|
||||
m_PlayerID(p_PlayerID) {
|
||||
mPlayerID(p_PlayerID) {
|
||||
setHeader(OPFLAG);
|
||||
mParseOffset = Header::BYTESLENGTH;
|
||||
}
|
||||
@@ -1102,7 +1087,7 @@ bool Message::PlayEnd::fillBytes(std::vector<char> &message) {
|
||||
try {
|
||||
mParseOffset = Header::BYTESLENGTH;
|
||||
mParseOffset += setInt(mBytesCount, message, mParseOffset);
|
||||
mParseOffset += setString(m_PlayerID, message, mParseOffset, 41);
|
||||
mParseOffset += setString(mPlayerID, message, mParseOffset, 41);
|
||||
} catch (...) {
|
||||
ESP_LOGE(TAG, "failed to create PlayEnd message");
|
||||
return false;
|
||||
@@ -1126,9 +1111,9 @@ bool Message::ReportPlayStatus::parse(const std::vector<char> &message) {
|
||||
try {
|
||||
mParseOffset = Header::BYTESLENGTH;
|
||||
mBytesCount = getInt(message, mParseOffset).value();
|
||||
m_SPITObjectID = getString(message, mParseOffset, 41).value();
|
||||
m_FrameInsideObject = getLong(message, mParseOffset).value();
|
||||
m_Value = getInt(message, mParseOffset).value();
|
||||
mSPITObjectID = getString(message, mParseOffset, 41).value();
|
||||
mFrameInsideObject = getLong(message, mParseOffset).value();
|
||||
mValue = getInt(message, mParseOffset).value();
|
||||
} catch (...) {
|
||||
ESP_LOGE(TAG, "failed to parse ReportPlayStatus message");
|
||||
return false;
|
||||
@@ -1142,13 +1127,13 @@ Message::ReportPlayStatus::ReportPlayStatus() : OPPart(BYTESLENGTH) {
|
||||
}
|
||||
|
||||
void Message::ReportPlayStatus::setID(string p_ID) {
|
||||
m_SPITObjectID = p_ID;
|
||||
mSPITObjectID = p_ID;
|
||||
}
|
||||
void Message::ReportPlayStatus::setFrameInsideObject(uint64_t p_TimeInside) {
|
||||
m_FrameInsideObject = p_TimeInside;
|
||||
mFrameInsideObject = p_TimeInside;
|
||||
}
|
||||
void Message::ReportPlayStatus::setValue(int p_Value) {
|
||||
m_Value = p_Value;
|
||||
mValue = p_Value;
|
||||
}
|
||||
bool Message::ReportPlayStatus::fillBytes(std::vector<char> &message) {
|
||||
if (!mHeader) {
|
||||
@@ -1159,9 +1144,9 @@ bool Message::ReportPlayStatus::fillBytes(std::vector<char> &message) {
|
||||
try {
|
||||
mParseOffset = Header::BYTESLENGTH;
|
||||
mParseOffset += setInt(mBytesCount, message, mParseOffset);
|
||||
mParseOffset += setString(m_SPITObjectID, message, mParseOffset, 41);
|
||||
mParseOffset += setLong(m_FrameInsideObject, message, mParseOffset);
|
||||
mParseOffset += setInt(m_Value, message, mParseOffset);
|
||||
mParseOffset += setString(mSPITObjectID, message, mParseOffset, 41);
|
||||
mParseOffset += setLong(mFrameInsideObject, message, mParseOffset);
|
||||
mParseOffset += setInt(mValue, message, mParseOffset);
|
||||
} catch (...) {
|
||||
ESP_LOGE(TAG, "failed to create ReportPlayStatus message");
|
||||
return false;
|
||||
|
||||
@@ -0,0 +1,202 @@
|
||||
|
||||
#include "spit_object.hpp"
|
||||
#include "spit_socket.hpp"
|
||||
#include "esp_log.h"
|
||||
|
||||
namespace spit {
|
||||
|
||||
/**
|
||||
* clears all unconfirmed SObjects not created by this SPIT_Client.
|
||||
*/
|
||||
void SObject::clearUnconfirmedObjects(SpitRepo<SObject> &repo) {
|
||||
auto &entries = repo.getRepo();
|
||||
for (auto i = entries.begin(); i != entries.end();) {
|
||||
SObject *ptrSObject = i->second.get();
|
||||
if (ptrSObject->getCreatedByClient() == false && ptrSObject->getConfirmed() == false) {
|
||||
i = entries.erase(i);
|
||||
} else {
|
||||
i++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SObject::eventProjectClosed(SpitRepo<SObject> &repo, SpitRepo<SObject> &remoteRepo) {
|
||||
auto &entries = repo.getRepo();
|
||||
for (auto i = entries.begin(); i != entries.end(); ) {
|
||||
SObject *ptrSObject = i->second.get();
|
||||
if (ptrSObject->getCreatedByClient() == true) {
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
i = entries.erase(i);
|
||||
}
|
||||
// Remote
|
||||
remoteRepo.clearEntries();
|
||||
}
|
||||
|
||||
/**
|
||||
* sets confirmed = false for all SObjects.
|
||||
* This should be called when the client has loaded a project.
|
||||
*/
|
||||
void SObject::setConfirmedFalse(SpitRepo<SObject> &repo) {
|
||||
auto &entries = repo.getRepo();
|
||||
for (auto i = entries.begin(); i != entries.end(); i++) {
|
||||
i->second->setConfirmed(false);
|
||||
}
|
||||
}
|
||||
|
||||
bool SObject::setMessageOP(Message::ReportObject *message) {
|
||||
bool changeAllowed;
|
||||
|
||||
if ((mCreatedByClient == true) && (Fixed.mValue == true)) {
|
||||
changeAllowed = false;
|
||||
} else {
|
||||
changeAllowed = true;
|
||||
}
|
||||
|
||||
// Confirmation should be changable
|
||||
if (mCreatedByClient) {
|
||||
// Server reports a client created SPITType -> the type is confirmed
|
||||
mConfirmed = true;
|
||||
} else {
|
||||
// type is NOT client created -> the client has to confirm the SPITtype
|
||||
mConfirmed = message->getConfirmed();
|
||||
}
|
||||
|
||||
if (changeAllowed == false) {
|
||||
return false;
|
||||
}
|
||||
bool changed = false;
|
||||
if (Delay.mValue != message->getDelay()) {
|
||||
Delay.mValue = message->getDelay();
|
||||
changed = true;
|
||||
}
|
||||
if (Duration.mValue != message->getDuration()) {
|
||||
Duration.mValue = message->getDuration();
|
||||
changed = true;
|
||||
}
|
||||
if (Fixed.mValue != message->getFixed()) {
|
||||
Fixed.mValue = message->getFixed();
|
||||
changed = true;
|
||||
}
|
||||
if (FrameFadeInLength.mValue != message->getFrameFadeInLength()) {
|
||||
FrameFadeInLength.mValue = message->getFrameFadeInLength();
|
||||
changed = true;
|
||||
}
|
||||
if (FrameFadeOutLength.mValue != message->getFrameFadeOutLength()) {
|
||||
FrameFadeOutLength.mValue = message->getFrameFadeOutLength();
|
||||
changed = true;
|
||||
}
|
||||
if (FrameLength.mValue != message->getFrameLength()) {
|
||||
FrameLength.mValue = message->getFrameLength();
|
||||
changed = true;
|
||||
}
|
||||
if (FrameStart.mValue != message->getFrameStart()) {
|
||||
FrameStart.mValue = message->getFrameStart();
|
||||
changed = true;
|
||||
}
|
||||
if (Remark.mValue != message->getRemark()) {
|
||||
Remark.mValue = message->getRemark();
|
||||
changed = true;
|
||||
}
|
||||
if (mID != message->getID()) {
|
||||
mID = message->getID();
|
||||
changed = true;
|
||||
}
|
||||
if (Name.mValue != message->getName()) {
|
||||
Name.mValue = message->getName();
|
||||
changed = true;
|
||||
}
|
||||
if (SPITTypeID.mValue != message->getSPITTypeID()) {
|
||||
SPITTypeID.mValue = message->getSPITTypeID();
|
||||
changed = true;
|
||||
}
|
||||
if (ServerParams.mValue != message->getServerParams()) {
|
||||
ServerParams.mValue = message->getServerParams();
|
||||
changed = true;
|
||||
}
|
||||
if (ServerRemote.mValue != message->getServerRemote()) {
|
||||
ServerRemote.mValue = message->getServerRemote();
|
||||
changed = true;
|
||||
}
|
||||
if (Track.mValue != message->getTrack()) {
|
||||
Track.mValue = message->getTrack();
|
||||
changed = true;
|
||||
}
|
||||
if (mValueFactor != message->getValueFactor()) {
|
||||
mValueFactor = message->getValueFactor();
|
||||
changed = true;
|
||||
}
|
||||
if (mValueUse != message->getValueUse()) {
|
||||
mValueUse = message->getValueUse();
|
||||
changed = true;
|
||||
}
|
||||
return changed;
|
||||
}
|
||||
|
||||
void SObject::fillMessageOP(Message::ReportObject &message) {
|
||||
message.setActionAssigned(getActionAssigned()); // Action can be assigned to type or to this object
|
||||
message.setConfirmed(mConfirmed);
|
||||
message.setDelay(Delay.mValue);
|
||||
message.setDuration(Duration.mValue);
|
||||
message.setFixed(Fixed.mValue);
|
||||
message.setFrameFadeInLength(FrameFadeInLength.mValue);
|
||||
message.setFrameFadeOutLength(FrameFadeOutLength.mValue);
|
||||
message.setFrameLength(FrameLength.mValue);
|
||||
message.setFrameStart(FrameStart.mValue);
|
||||
message.setID(mID);
|
||||
message.setName(Name.mValue);
|
||||
message.setRemark(Remark.mValue);
|
||||
message.setSPITTypeID(SPITTypeID.mValue);
|
||||
message.setServerParams(ServerParams.mValue);
|
||||
message.setServerRemote(ServerRemote.mValue);
|
||||
message.setTrack(Track.mValue);
|
||||
message.setValueFactor(mValueFactor);
|
||||
message.setValueUse(mValueUse);
|
||||
}
|
||||
|
||||
void SObject::fillMessageOP(Message::RemoveObject &message) {
|
||||
message.setID(mID);
|
||||
}
|
||||
|
||||
/**
|
||||
* This is used by the server and client to tell if the other side has registered the changes.
|
||||
* @param p_Confirmed
|
||||
* @return if mConfirmed has changed
|
||||
*/
|
||||
bool SObject::setConfirmed(bool p_Confirmed) {
|
||||
if (mConfirmed == p_Confirmed)
|
||||
return false;
|
||||
mConfirmed = p_Confirmed;
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* This is a virtual construct - ActionAssignedType is not implemented in the SPITProtocol.
|
||||
* This is used when an action is associated with a SPITType.
|
||||
* Then this action is done for every SObject with the SPITType.
|
||||
* @return true = an action is assigned for the SPITType.
|
||||
*/
|
||||
bool SObject::setActionAssignedType(bool p_ActionAssigned) {
|
||||
if (mActionAssignedType == p_ActionAssigned)
|
||||
return false;
|
||||
bool oldActionAssigend = getActionAssigned();
|
||||
mActionAssignedType = p_ActionAssigned;
|
||||
if (getActionAssigned() == oldActionAssigend)
|
||||
return false;
|
||||
mConfirmed = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool SObject::setActionAssigned(bool p_ActionAssigned) {
|
||||
if (mActionAssigned == p_ActionAssigned)
|
||||
return false;
|
||||
bool oldActionAssigend = getActionAssigned();
|
||||
mActionAssigned = p_ActionAssigned;
|
||||
if (getActionAssigned() == oldActionAssigend)
|
||||
return false;
|
||||
mConfirmed = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
|
||||
#include "spit_player.hpp"
|
||||
#include "esp_log.h"
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
using namespace std;
|
||||
|
||||
namespace spit {
|
||||
|
||||
unordered_map<string, unique_ptr<SPlayer>> SPlayer::sSpitPlayers;
|
||||
|
||||
SPlayer &SPlayer::getSPITPlayer(string playerID) {
|
||||
auto i = sSpitPlayers.find(playerID);
|
||||
if (i == sSpitPlayers.end()) {
|
||||
sSpitPlayers[playerID] = make_unique<SPlayer>(playerID);
|
||||
}
|
||||
return *sSpitPlayers.at(playerID);
|
||||
}
|
||||
|
||||
SPlayer::SPlayer(string playerID) {
|
||||
mId = playerID;
|
||||
}
|
||||
|
||||
SPlayer::~SPlayer() {
|
||||
mPlaySPITTypes.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param p_SPITObjectID
|
||||
* @return true = new PlayObject added<br>
|
||||
* false = PlayObject exists
|
||||
*/
|
||||
SPlayer::PlayType *SPlayer::addTypePlaying(string spitTypeID) {
|
||||
PlayType *ptrPlaySPITType;
|
||||
auto i = mPlaySPITTypes.find(spitTypeID);
|
||||
if (i == mPlaySPITTypes.end()) {
|
||||
auto playSpitType = make_unique<PlayType>(this, spitTypeID);
|
||||
ptrPlaySPITType = playSpitType.get();
|
||||
mPlaySPITTypes[spitTypeID] = move(playSpitType);
|
||||
} else {
|
||||
ptrPlaySPITType = i->second.get();
|
||||
}
|
||||
ptrPlaySPITType->setIsPlayed(true);
|
||||
return ptrPlaySPITType;
|
||||
}
|
||||
|
||||
void SPlayer::startPlaySequence() {
|
||||
for (auto i = mPlaySPITTypes.begin(); i != mPlaySPITTypes.end(); i++) {
|
||||
PlayType *ptrPlaySPITType = i->second.get();
|
||||
ptrPlaySPITType->startPlaySequence();
|
||||
}
|
||||
}
|
||||
|
||||
void SPlayer::endPlaySequence() {
|
||||
for (auto i = mPlaySPITTypes.begin(); i != mPlaySPITTypes.end();) {
|
||||
if (i->second.get()->getIsPlayed() == false) {
|
||||
i = mPlaySPITTypes.erase(i);
|
||||
} else {
|
||||
++i;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SPlayer::PlayType::PlayType(SPlayer *p_SPITPlayer, string spitTypeID) {
|
||||
mIsNew = true;
|
||||
|
||||
mSpitTypeID = spitTypeID;
|
||||
mPlayerID = p_SPITPlayer->getID();
|
||||
mPlayerName = p_SPITPlayer->getName();
|
||||
startPlaySequence();
|
||||
mIsNew = true;
|
||||
}
|
||||
SPlayer::PlayType::PlayType(const PlayType &orig) {
|
||||
mSpitTypeID = orig.getSPITTypeID();
|
||||
mIsPlayed = orig.getIsPlayed();
|
||||
mIsNew = orig.getIsNew();
|
||||
|
||||
mPlayerID = orig.getPlayerID();
|
||||
mPlayerName = orig.getPlayerName();
|
||||
mPlayerRuns = orig.getPlayerIsRunning();
|
||||
|
||||
mValue = orig.getValue();
|
||||
}
|
||||
void SPlayer::PlayType::startPlaySequence() {
|
||||
mIsPlayed = false;
|
||||
mIsNew = false;
|
||||
|
||||
mValue = 0;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,45 +1,33 @@
|
||||
/*
|
||||
* To change this license header, choose License Headers in Project Properties.
|
||||
* To change this template file, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Unix implementation of a SPITSocket.
|
||||
*
|
||||
* File: UnixSocket.cpp
|
||||
* Author: Hagi
|
||||
*
|
||||
* Created on 12. April 2019, 15:58
|
||||
*/
|
||||
|
||||
#include "SPITSocket.h"
|
||||
#include "spit_socket.hpp"
|
||||
#include "Task.hpp"
|
||||
#include "esp/uuid.h"
|
||||
#include "esp_log.h"
|
||||
#include "esp_netif.h"
|
||||
#include <string>
|
||||
#include <unistd.h>
|
||||
|
||||
using namespace std;
|
||||
|
||||
namespace spit {
|
||||
|
||||
/**
|
||||
* Creates socket. If there exist some, they will be closed.
|
||||
* @return
|
||||
*/
|
||||
bool SPITSocket::createSocket_UDP() {
|
||||
if (m_UDPSocketIP4 != INVALID_SOCKET) {
|
||||
close(m_UDPSocketIP4);
|
||||
m_UDPSocketIP4 = INVALID_SOCKET;
|
||||
bool Socket::createSocketUdp() {
|
||||
if (mUdpSocketIp4 != INVALID_SOCKET) {
|
||||
close(mUdpSocketIp4);
|
||||
mUdpSocketIp4 = INVALID_SOCKET;
|
||||
}
|
||||
|
||||
m_UDPSocketIP4 = socket(AF_INET, SOCK_DGRAM, 0);
|
||||
mUdpSocketIp4 = socket(AF_INET, SOCK_DGRAM, 0);
|
||||
int intResult = -1;
|
||||
bool success = true;
|
||||
if (m_UDPSocketIP4 == INVALID_SOCKET) {
|
||||
if (mUdpSocketIp4 == INVALID_SOCKET) {
|
||||
success = false;
|
||||
} else {
|
||||
int intOptionValue4 = 1;
|
||||
intResult = setsockopt(m_UDPSocketIP4, SOL_SOCKET, SO_REUSEADDR, (void *)&intOptionValue4, sizeof(intOptionValue4));
|
||||
intResult = setsockopt(mUdpSocketIp4, SOL_SOCKET, SO_REUSEADDR, (void *)&intOptionValue4, sizeof(intOptionValue4));
|
||||
}
|
||||
if (intResult < 0) {
|
||||
success = false;
|
||||
@@ -50,17 +38,17 @@ bool SPITSocket::createSocket_UDP() {
|
||||
tv.tv_sec = 1; // seconds
|
||||
tv.tv_usec = 0; // microseconds (0.0 sec)
|
||||
// This sets the receive timeout
|
||||
setsockopt(m_UDPSocketIP4, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
|
||||
setsockopt(mUdpSocketIp4, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
|
||||
|
||||
// set the m_UDPSocketIP4 in NON BLOCKING mode because
|
||||
// set the mUdpSocketIp4 in NON BLOCKING mode because
|
||||
// if the UDPSockets are in blocking mode the receiveMessage does not return in every constellation
|
||||
// int intFlags;
|
||||
// intFlags = fcntl(m_UDPSocketIP4, F_GETFL);
|
||||
// fcntl(m_UDPSocketIP4, F_SETFL, intFlags | O_NONBLOCK);
|
||||
// intFlags = fcntl(mUdpSocketIp4, F_GETFL);
|
||||
// fcntl(mUdpSocketIp4, F_SETFL, intFlags | O_NONBLOCK);
|
||||
|
||||
// int intBufferSize = 2046 * 512;
|
||||
// intResult = setsockopt(m_UDPSocketIP4, SOL_SOCKET, SO_RCVBUF, (void*)&intBufferSize, sizeof(intBufferSize));
|
||||
// intResult = setsockopt(m_UDPSocketIP4, SOL_SOCKET, SO_SNDBUF, (void*)&intBufferSize, sizeof(intBufferSize));
|
||||
// intResult = setsockopt(mUdpSocketIp4, SOL_SOCKET, SO_RCVBUF, (void*)&intBufferSize, sizeof(intBufferSize));
|
||||
// intResult = setsockopt(mUdpSocketIp4, SOL_SOCKET, SO_SNDBUF, (void*)&intBufferSize, sizeof(intBufferSize));
|
||||
}
|
||||
return success;
|
||||
}
|
||||
@@ -73,7 +61,7 @@ bool SPITSocket::createSocket_UDP() {
|
||||
* @return -1 id bind fails, o if bind is ok
|
||||
*
|
||||
*/
|
||||
int SPITSocket::bindSocket(string clientIp, string clientPort) {
|
||||
int Socket::bindSocket(string clientIp, string clientPort) {
|
||||
string stringClientPort;
|
||||
if (clientPort.length() <= 0)
|
||||
stringClientPort = "0";
|
||||
@@ -83,7 +71,7 @@ int SPITSocket::bindSocket(string clientIp, string clientPort) {
|
||||
if (getaddrinfo(clientIp.data(), clientPort.data(), nullptr, &clientAI) != 0) {
|
||||
return -1;
|
||||
}
|
||||
if (m_UDPSocketIP4 == INVALID_SOCKET) {
|
||||
if (mUdpSocketIp4 == INVALID_SOCKET) {
|
||||
return -1;
|
||||
}
|
||||
auto *socketAdr = (sockaddr_in *)(clientAI->ai_addr);
|
||||
@@ -94,12 +82,12 @@ int SPITSocket::bindSocket(string clientIp, string clientPort) {
|
||||
o_IP4SocketAddress.sin_addr = socketAdr->sin_addr;
|
||||
o_IP4SocketAddress.sin_family = socketAdr->sin_family;
|
||||
o_IP4SocketAddress.sin_port = socketAdr->sin_port;
|
||||
int intResult = bind(m_UDPSocketIP4, (const sockaddr *)(socketAdr), (socklen_t)intSocklen);
|
||||
int intResult = bind(mUdpSocketIp4, (const sockaddr *)(socketAdr), (socklen_t)intSocklen);
|
||||
if (intResult < 0) {
|
||||
return intResult;
|
||||
}
|
||||
if ((intResult == 0) &&
|
||||
(getsockname(m_UDPSocketIP4, (sockaddr *)socketAdr, (socklen_t *)&intSocklen) != -1)) {
|
||||
(getsockname(mUdpSocketIp4, (sockaddr *)socketAdr, (socklen_t *)&intSocklen) != -1)) {
|
||||
setBoundClientPort(to_string((int)socketAdr->sin_port));
|
||||
}
|
||||
freeaddrinfo(clientAI);
|
||||
@@ -114,9 +102,9 @@ int SPITSocket::bindSocket(string clientIp, string clientPort) {
|
||||
* false = SO_BROADCAST is not set
|
||||
* @return 0 = ok, -1 = error
|
||||
*/
|
||||
int SPITSocket::setBroadcast(bool broadcast) const {
|
||||
int Socket::setBroadcast(bool broadcast) const {
|
||||
int intOptionValue = broadcast ? 1 : 0;
|
||||
int intResult = setsockopt(m_UDPSocketIP4, SOL_SOCKET, SO_BROADCAST, &intOptionValue, sizeof(int));
|
||||
int intResult = setsockopt(mUdpSocketIp4, SOL_SOCKET, SO_BROADCAST, &intOptionValue, sizeof(int));
|
||||
return intResult;
|
||||
}
|
||||
/**
|
||||
@@ -127,8 +115,8 @@ int SPITSocket::setBroadcast(bool broadcast) const {
|
||||
* @return -1 send fails
|
||||
* 0 send is done
|
||||
*/
|
||||
int SPITSocket::sendMessageTo(const string &ip, const string &port, const char *message, int msgLength) {
|
||||
if (m_UDPSocketIP4 == INVALID_SOCKET) {
|
||||
int Socket::sendMessageTo(const string &ip, const string &port, const char *message, int msgLength) {
|
||||
if (mUdpSocketIp4 == INVALID_SOCKET) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -141,14 +129,14 @@ int SPITSocket::sendMessageTo(const string &ip, const string &port, const char *
|
||||
|
||||
auto *ptrIP4SocketAddress = (sockaddr_in *)(ptrAddressInfo->ai_addr);
|
||||
int intSocklen = sizeof(*ptrIP4SocketAddress);
|
||||
if (m_UDPSocketIP4 != INVALID_SOCKET) {
|
||||
if (mUdpSocketIp4 != INVALID_SOCKET) {
|
||||
// copy the ptrIP4SocketAddress, may be not filled correct by getaddrinfo
|
||||
sockaddr_in o_IP4SocketAddress;
|
||||
memset(&o_IP4SocketAddress, 0, intSocklen);
|
||||
o_IP4SocketAddress.sin_addr = ptrIP4SocketAddress->sin_addr;
|
||||
o_IP4SocketAddress.sin_family = ptrIP4SocketAddress->sin_family;
|
||||
o_IP4SocketAddress.sin_port = ptrIP4SocketAddress->sin_port;
|
||||
intResult = sendto(m_UDPSocketIP4, message, msgLength, 0, (const sockaddr *)&o_IP4SocketAddress, (socklen_t)intSocklen);
|
||||
intResult = sendto(mUdpSocketIp4, message, msgLength, 0, (const sockaddr *)&o_IP4SocketAddress, (socklen_t)intSocklen);
|
||||
if (intResult < 0) {
|
||||
ESP_LOGE("SPIT", "sendMessageTo IP4 sendto %s FAILED %s\n", ip.data(), strerror(errno));
|
||||
ESP_LOGE("SPIT", "sendMessageTo ret=%d %s / %s / %d\n", intResult, port.data(), message, msgLength);
|
||||
@@ -169,15 +157,15 @@ int SPITSocket::sendMessageTo(const string &ip, const string &port, const char *
|
||||
* if p_ServerIP is NULL - no detection of the server will be done.
|
||||
* @return
|
||||
*/
|
||||
int SPITSocket::receiveMessage(char *p_Buffer, int p_BufferLength, string *serverIp) const {
|
||||
int Socket::receiveMessage(char *p_Buffer, int p_BufferLength, string *serverIp) const {
|
||||
int intResult = -1;
|
||||
if (m_UDPSocketIP4 == INVALID_SOCKET) {
|
||||
if (mUdpSocketIp4 == INVALID_SOCKET) {
|
||||
return intResult;
|
||||
}
|
||||
sockaddr_in o_IP4SocketAddress;
|
||||
int intSocklen = sizeof(o_IP4SocketAddress);
|
||||
memset(&o_IP4SocketAddress, 0, intSocklen);
|
||||
intResult = recvfrom(m_UDPSocketIP4, (void *)p_Buffer, p_BufferLength, 0, (sockaddr *)&o_IP4SocketAddress, (socklen_t *)&intSocklen);
|
||||
intResult = recvfrom(mUdpSocketIp4, (void *)p_Buffer, p_BufferLength, 0, (sockaddr *)&o_IP4SocketAddress, (socklen_t *)&intSocklen);
|
||||
if (intResult >= 0 && serverIp != nullptr) {
|
||||
char bufferIP4[INET_ADDRSTRLEN];
|
||||
inet_ntop(AF_INET, &(o_IP4SocketAddress.sin_addr), bufferIP4, intSocklen);
|
||||
@@ -186,7 +174,7 @@ int SPITSocket::receiveMessage(char *p_Buffer, int p_BufferLength, string *serve
|
||||
return intResult;
|
||||
}
|
||||
|
||||
SPITSocket::IPAddress SPITSocket::getAdaptersInfo() {
|
||||
ISocket::IpAddress Socket::getAdaptersInfo() {
|
||||
// iterate over active interfaces, and print out IPs
|
||||
esp_netif_t *netif = nullptr;
|
||||
if ((netif = esp_netif_next_unsafe(netif)) != nullptr) {
|
||||
@@ -221,3 +209,5 @@ string getClientHostName() {
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user