blob: 1971dc12a909114d08f735c00f21e79802a14321 [file] [log] [blame]
brians343bc112013-02-10 01:53:46 +00001#include "CRIOControlLoopRunner.h"
2
3#include "aos/aos_core.h"
4#include "aos/crio/shared_libs/interrupt_bridge.h"
5#include "aos/crio/motor_server/MotorOutput.h"
brians56032682013-03-02 21:00:17 +00006#include "aos/crio/motor_server/MotorServer.h"
brians343bc112013-02-10 01:53:46 +00007
8using ::aos::control_loops::SerializableControlLoop;
9
10namespace aos {
11namespace crio {
12
13bool CRIOControlLoopRunner::started_ = false;
14std::vector<SerializableControlLoop *> CRIOControlLoopRunner::loops_;
15Mutex CRIOControlLoopRunner::loops_lock;
16
17void CRIOControlLoopRunner::Start() {
18 if (started_) {
19 LOG(WARNING, "not going to Start twice!!\n");
20 return;
21 }
22 started_ = true;
23
24 // TODO(aschuh): Hold on to a handle to this...
25 (new WDInterruptNotifier<void>(Notify))->StartPeriodic(0.01);
26}
27
28void CRIOControlLoopRunner::AddControlLoop(SerializableControlLoop *loop) {
29 MutexLocker control_loop_goals_locker(&loops_lock);
30 loops_.push_back(loop);
31 MotorServer::RegisterControlLoopGoal(loop);
32}
33
34void CRIOControlLoopRunner::Notify(void *) {
35 // TODO(aschuh): Too many singletons/static classes!
36 SensorOutputs::UpdateAll();
37 // sensors get read first so it doesn't really matter if this takes a little bit
38 {
39 MutexLocker control_loop_goals_locker(
40 &MotorServer::control_loop_goals_lock);
41 for (auto it = loops_.begin(); it != loops_.end(); ++it) {
42 (*it)->Iterate();
43 }
44 }
45 MotorOutput::RunIterationAll();
46 MotorServer::WriteOutputs();
47}
48
49} // namespace crio
50} // namespace aos