Files
Leo-ElixirLights/components/spit/src/spit_object.cpp
T

203 lines
6.2 KiB
C++

#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;
}
}