blob: 9d6cd522abe49042469047540429045f6c1400c0 [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"
6
7using ::aos::control_loops::SerializableControlLoop;
8
9namespace aos {
10namespace crio {
11
12bool CRIOControlLoopRunner::started_ = false;
13std::vector<SerializableControlLoop *> CRIOControlLoopRunner::loops_;
14Mutex CRIOControlLoopRunner::loops_lock;
15
16void CRIOControlLoopRunner::Start() {
17 if (started_) {
18 LOG(WARNING, "not going to Start twice!!\n");
19 return;
20 }
21 started_ = true;
22
23 // TODO(aschuh): Hold on to a handle to this...
24 (new WDInterruptNotifier<void>(Notify))->StartPeriodic(0.01);
25}
26
27void CRIOControlLoopRunner::AddControlLoop(SerializableControlLoop *loop) {
28 MutexLocker control_loop_goals_locker(&loops_lock);
29 loops_.push_back(loop);
30 MotorServer::RegisterControlLoopGoal(loop);
31}
32
33void CRIOControlLoopRunner::Notify(void *) {
34 // TODO(aschuh): Too many singletons/static classes!
35 SensorOutputs::UpdateAll();
36 // sensors get read first so it doesn't really matter if this takes a little bit
37 {
38 MutexLocker control_loop_goals_locker(
39 &MotorServer::control_loop_goals_lock);
40 for (auto it = loops_.begin(); it != loops_.end(); ++it) {
41 (*it)->Iterate();
42 }
43 }
44 MotorOutput::RunIterationAll();
45 MotorServer::WriteOutputs();
46}
47
48} // namespace crio
49} // namespace aos