-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathStateSnap.cpp
71 lines (61 loc) · 2.03 KB
/
StateSnap.cpp
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
/*
* StateSnap - A module or Orbiter to periodically make scenario snapshots.
* Copyright (C) 2022 Thymo van Beers
*
* This program 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 2 of the License, or
* (at your option) any later version.
*
* This program 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 this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#define ORBITER_MODULE
#include "StateSnap.h"
#include "Orbitersdk.h"
StateSnap::StateSnap(HINSTANCE hDLL) : Module(hDLL) {
// TODO: Read cfg file
filename = (char *)"StateSnap";
interval = 10;
}
void StateSnap::clbkSimulationStart(oapi::Module::RenderMode mode) {
threadExit = false;
saveThread = std::thread([this] { Runnable(); });
saveThread.detach();
}
void StateSnap::clbkSimulationEnd() {
threadExit = true;
cv.notify_all();
}
void StateSnap::Runnable() {
while (true) {
std::unique_lock<std::mutex> lk(mutex);
if (cv.wait_for(lk, std::chrono::minutes(interval), [this] { return threadExit.load(); })) {
break; // Woke up by exit
}
saveNeeded = true; // Signal to main thread.
}
}
void StateSnap::clbkPostStep(double simt, double simdt, double mjd) {
if (saveNeeded) {
oapiSaveScenario(filename, "");
saveNeeded = false;
}
}
// DLL entry/exit points
StateSnap *module;
DLLCLBK void InitModule(HINSTANCE hDLL)
{
module = new StateSnap(hDLL);
oapiRegisterModule(module);
}
DLLCLBK void ExitModule(HINSTANCE hModule)
{
// Module is deleted by Orbiter
}