brians | 343bc11 | 2013-02-10 01:53:46 +0000 | [diff] [blame^] | 1 | #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 | |
| 7 | using ::aos::control_loops::SerializableControlLoop; |
| 8 | |
| 9 | namespace aos { |
| 10 | namespace crio { |
| 11 | |
| 12 | bool CRIOControlLoopRunner::started_ = false; |
| 13 | std::vector<SerializableControlLoop *> CRIOControlLoopRunner::loops_; |
| 14 | Mutex CRIOControlLoopRunner::loops_lock; |
| 15 | |
| 16 | void 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 | |
| 27 | void CRIOControlLoopRunner::AddControlLoop(SerializableControlLoop *loop) { |
| 28 | MutexLocker control_loop_goals_locker(&loops_lock); |
| 29 | loops_.push_back(loop); |
| 30 | MotorServer::RegisterControlLoopGoal(loop); |
| 31 | } |
| 32 | |
| 33 | void 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 |