Krotos Modules 3
Loading...
Searching...
No Matches
Serialiser.cpp
Go to the documentation of this file.
1namespace krotos
2{
3
4 const Identifier Serialiser::PSTags::Version{"serialiser_version"};
5 const Identifier Serialiser::PSTags::Actions{"actions"};
6 const Identifier Serialiser::PSTags::Action{"action"};
7 const Identifier Serialiser::PSTags::Priority{"priority"};
8 const Identifier Serialiser::PSTags::Done{"done"};
9 const Identifier Serialiser::PSTags::ExecutedAt{"executedAt"};
10 const Identifier Serialiser::PSTags::Output{"output"};
11
12 const String Serialiser::DEFAULT_FORMAT{"{"
13 "\"serialiser_version\": \"1\","
14 "\"actions\" : []}"};
15
16 Serialiser::Serialiser(File serialiserFile) : JsonFile(serialiserFile, PSTags::Version, DEFAULT_FORMAT) {}
17
18 void Serialiser::addAction(std::unique_ptr<Action> action)
19 {
20 m_actionMap.insert({action->name, std::move(action)});
21 }
22
24 {
25 m_executedActions.clear();
26
28
29 for (auto& action : m_actionQueue)
30 {
31 // Execute the action
32 action->done = action->execute();
33
34 m_executedActions.push_back(action);
35 }
36
37 // clear the queue now it's been executed
38 m_actionQueue.clear();
39
41 }
42
43 bool Serialiser::isActionDone(String name)
44 {
45 if (m_actionMap.find(name) != m_actionMap.end())
46 {
47 return m_actionMap[name]->done;
48 }
49 else
50 {
51 return false;
52 }
53 }
54
56 {
57 var actionArray = m_data.getProperty(PSTags::Actions, var());
58 jassert(!actionArray.isVoid());
59
60 m_actionQueue.clear();
61
62 // Check if the action has been done already
63 for (int i = 0; i < actionArray.size(); ++i)
64 {
65 auto name = actionArray[i][PSTags::Action].toString();
66
67 if (actionArray[i][PSTags::Done].equals(true))
68 {
69 if (m_actionMap.find(name) != m_actionMap.end())
70 {
71 // Update the action object with it's status from file.
72 m_actionMap[name]->done = true;
73 }
74 }
75 }
76
77 // Add the action to the queue if it hasn't been done.
78 for (auto& action : m_actionMap)
79 {
80 if (!action.second->done)
81 {
82 m_actionQueue.push_back(action.second.get());
83 }
84 }
85
86 // Sort the queue by priority
87 std::sort(m_actionQueue.begin(), m_actionQueue.end(),
88 [](Action* a, Action* b) { return a->priority < b->priority; });
89 }
90
92 {
93 for (int i = 0; i < m_executedActions.size(); ++i)
94 {
95 // Create a new action object with the updated data
96 // DynamicObject is reference counted, var takes ownership of it
97 auto actionObject = new DynamicObject();
98 var actionData(actionObject);
99
100 // Re-create the action object with the new data
101 actionObject->setProperty(PSTags::Priority, m_executedActions[i]->priority);
102 actionObject->setProperty(PSTags::Action, m_executedActions[i]->name);
103 actionObject->setProperty(PSTags::Done, m_executedActions[i]->done);
104 actionObject->setProperty(PSTags::ExecutedAt, Time::getCurrentTime().toString(true, true, true, true));
105 actionObject->setProperty(PSTags::Output, m_executedActions[i]->output);
106
107 // Update the data
108 var actionArray = m_data.getProperty(PSTags::Actions, var());
109 jassert(!actionArray.isVoid());
110
111 // find existing and update
112 bool updatedExisting(false);
113 for (int j = 0; j < actionArray.size(); j++)
114 {
115 if (actionArray[j][PSTags::Action] == m_executedActions[i]->name)
116 {
117 actionArray[j].swapWith(actionData);
118 updatedExisting = true;
119 }
120 }
121
122 // action didn't exist in the file, write it in
123 if (!updatedExisting)
124 {
125 actionArray.append(actionData);
126 }
127 }
128
129 int executedActionCount = m_executedActions.size();
130 m_executedActions.clear();
131
132 // Write to json file
133 if (executedActionCount > 0)
134 {
135 save();
136 }
137 }
138} // namespace krotos
Definition JsonFile.h:6
void save()
Call save internal.
Definition JsonFile.cpp:134
var m_data
The parsed json data.
Definition JsonFile.h:55
void writeActionData()
Definition Serialiser.cpp:91
void addAction(std::unique_ptr< Action > action)
Add an action object to the serialiser which will be executed. Create your own subclass of Action ove...
Definition Serialiser.cpp:18
void createActionQueue()
Definition Serialiser.cpp:55
std::vector< Action * > m_executedActions
Definition Serialiser.h:73
static const String DEFAULT_FORMAT
Definition Serialiser.h:79
std::vector< Action * > m_actionQueue
Definition Serialiser.h:72
Serialiser(File serialiserFile)
Definition Serialiser.cpp:16
bool isActionDone(String actionName)
Returns true if the action has been executed.
Definition Serialiser.cpp:43
void executeActions()
Execute the serialiser. This will parse actions from the serialiser file, executing all added actions...
Definition Serialiser.cpp:23
std::map< String, std::unique_ptr< Action > > m_actionMap
Definition Serialiser.h:77
Definition AirAbsorptionFilter.cpp:2
Definition Serialiser.h:8
Definition Serialiser.h:34
static const Identifier Done
Definition Serialiser.h:40
static const Identifier Output
Definition Serialiser.h:42
static const Identifier Action
Definition Serialiser.h:38
static const Identifier ExecutedAt
Definition Serialiser.h:41
static const Identifier Priority
Definition Serialiser.h:39
static const Identifier Actions
Definition Serialiser.h:36
static const Identifier Version
Definition Serialiser.h:35