1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
|
/*
RailControl - Model Railway Control Software
Copyright (c) 2017-2025 by Teddy / Dominik Mahrer - www.railcontrol.org
RailControl is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 3, or (at your option) any
later version.
RailControl is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with RailControl; see the file LICENCE. If not see
<http://www.gnu.org/licenses/>.
*/
#pragma once
#include <map>
#include <string>
#include "DataModel/Accessory.h"
#include "DataModel/LockableItem.h"
#include "DataModel/ObjectIdentifier.h"
#include "DataModel/Serializable.h"
#include "DataTypes.h"
#include "Logger/Logger.h"
class Manager;
namespace DataModel
{
class Relation : protected Serializable, public LockableItem
{
public:
enum RelationType : unsigned char
{
RelationTypeCalculate = 0,
RelationTypeLocoSlave = (ObjectTypeLoco << 3), // FIXME: 2024-03-17: not used anymore, TypeMultipeUnitSlave instead
RelationTypeTrackSignal = (ObjectTypeTrack << 3),
RelationTypeTrackFeedback = (ObjectTypeTrack << 3) + 1,
RelationTypeFeedbackAtSet = (ObjectTypeFeedback << 3),
RelationTypeFeedbackAtUnset = (ObjectTypeFeedback << 3) + 1,
RelationTypeRouteAtLock = (ObjectTypeRoute << 3),
RelationTypeRouteAtUnlock = (ObjectTypeRoute << 3) + 1,
RelationTypeClusterTrack = (ObjectTypeCluster << 3),
RelationTypeMultipleUnitLoco = (ObjectTypeMultipleUnit << 3),
};
typedef unsigned short Data;
static const Data DefaultData = 0;
inline Relation(Manager* manager,
const ObjectIdentifier& object1,
const ObjectIdentifier& object2,
const RelationType type,
const Priority priority = 0,
const Data data = 0)
: manager(manager),
object1(object1),
object2(object2),
type(type),
priority(priority),
data(data)
{
}
inline Relation(Manager* manager,
const std::string& serialized)
: manager(manager),
data(0)
{
Deserialize(serialized);
}
virtual ~Relation()
{
}
virtual std::string Serialize() const override;
virtual void Deserialize(const std::string& serialized) override;
inline ObjectID ObjectID1() const
{
return object1.GetObjectID();
}
inline void ObjectID1(ObjectID objectID1)
{
object1.SetObjectID(objectID1);
}
inline ObjectType ObjectType2() const
{
return object2.GetObjectType();
}
inline ObjectID ObjectID2() const
{
return object2.GetObjectID();
}
inline ObjectIdentifier ObjectIdentifier2() const
{
return object2;
}
Object* GetObject2();
inline RelationType GetType() const
{
return type;
}
inline Priority GetPriority() const
{
return priority;
}
inline Data GetData() const
{
return data;
}
inline bool CompareObject2(const ObjectIdentifier& identifier) const
{
return object2 == identifier;
}
bool Reserve(Logger::Logger* logger, const ObjectIdentifier& locoBaseIdentifier) override;
bool Lock(Logger::Logger* logger, const ObjectIdentifier& locoBaseIdentifier) override;
bool Release(Logger::Logger* logger, const ObjectIdentifier& locoBaseIdentifier) override;
bool Execute(Logger::Logger* logger, const ObjectIdentifier& locoBaseIdentifier, const Delay delay);
private:
inline ObjectType ObjectType1() const
{
return object1.GetObjectType();
}
Manager* manager;
ObjectIdentifier object1;
ObjectIdentifier object2;
RelationType type;
Priority priority;
Data data;
};
} // namespace DataModel
|