-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathControlLoop.h
More file actions
116 lines (86 loc) · 3.67 KB
/
ControlLoop.h
File metadata and controls
116 lines (86 loc) · 3.67 KB
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
//
// Created by romanov on 6/1/17.
//
#ifndef EVESTANDALONE_ROOTLOOP_H
#define EVESTANDALONE_ROOTLOOP_H
#include "ApplicationContext.h"
#include "KeyboardControl.h"
#include "JEventProcessor_EventReader.h"
#include "HttpController.h"
#include <mutex>
namespace hdvis
{
class ControlLoop {
public:
ControlLoop():
_isMultithreaded(false)
{
_httpControl.AddApiGetRoute("/api/v1/status", [this](const httplib::Request &req) {
std::cout<<"/api/v1/status"<<endl;
std::ostringstream buffer;
buffer << "{\"janaState\":\""<< _context.JanaStateStr() << "\""
<< ",\"eventNumber\": " << _context.CurrentEventNumber()
<< ",\"isAutoPlay\": " << (int)_context.JanaWaitingLogic().IsAutoPlay()
<<"}";
return buffer.str();
});
_httpControl.AddApiGetRoute("/api/v1/next", [this](const httplib::Request &req) {
std::cout<<"/api/v1/next"<<endl;
_context.JanaWaitingLogic().ProceedToNextEvent();
std::cout<<"COMMAND ProceedToNextEvent: "<<std::endl;
return "[1]";
});
_httpControl.AddApiGetRoute("/api/v1/autoplay-on", [this](const httplib::Request &req) {
std::cout<<"/api/v1/autoplay-on"<<endl;
_context.JanaWaitingLogic().SetAutoPlay(true);
std::cout<<"COMMAND autoplay: "<<(_context.JanaWaitingLogic().IsAutoPlay()? "on": "off")<<std::endl;
return "[1]";
});
_httpControl.AddApiGetRoute("/api/v1/autoplay-off", [this](const httplib::Request &req) {
std::cout<<"/api1/autoplay-off"<<endl;
_context.JanaWaitingLogic().SetAutoPlay(false);
std::cout<<"COMMAND autoplay: "<<(_context.JanaWaitingLogic().IsAutoPlay()? "on": "off")<<std::endl;
return "[1]";
});
}
void RunRootAppMultithreaded()
{
_isMultithreaded = true;
_runThread = std::thread([this](){this->RunRootAppThisThread();});
}
void RunRootAppThisThread()
{
_keyboardControl.PrintMenu();
_keyboardControl.StartListening();
_httpControl.StartListening();
while (!_keyboardControl.IsQuitCommand()) {
auto lock = std::unique_lock<std::mutex>(ApplicationContext::InnerLoopMutex);
try {
//LOOP?
if(_keyboardControl.IsNextCommand()) {
_keyboardControl.ClearNextCommand();
_context.JanaWaitingLogic().ProceedToNextEvent();
std::cout<<"COMMAND ProceedToNextEvent: "<<std::endl;
}
if(_keyboardControl.IsAutoplayCommand()) {
_keyboardControl.ClearAutoplayCommand();
_context.JanaWaitingLogic().SetAutoPlay(!_context.JanaWaitingLogic().IsAutoPlay());
std::cout<<"COMMAND autoplay: "<<(_context.JanaWaitingLogic().IsAutoPlay()? "on": "off")<<std::endl;
}
}
catch(...)
{
std::cerr<<"InnerLoop exception is thrown"<<std::endl;
}
}
}
ApplicationContext& Context() { return _context; }
private:
ApplicationContext _context;
std::thread _runThread;
std::atomic<bool> _isMultithreaded;
KeyboardControl _keyboardControl;
HttpController _httpControl;
};
}
#endif //EVESTANDALONE_ROOTLOOP_H