X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Farducontrol.cpp;h=4acfc60e0e761a0c5aaa7d4c260a0023988a8034;hb=aa48746158b19ad795a3cc656c4dfe17044baf54;hp=0065c4dd5c5f534ce170d50ace90b851fce5e612;hpb=26fbc0321526ccc41a81a332f0d60b7cc42b6567;p=r2c2.git diff --git a/source/libr2c2/arducontrol.cpp b/source/libr2c2/arducontrol.cpp index 0065c4d..4acfc60 100644 --- a/source/libr2c2/arducontrol.cpp +++ b/source/libr2c2/arducontrol.cpp @@ -296,6 +296,8 @@ void ArduControl::activate_accessory_by_mask(Accessory &acc, unsigned mask) unsigned bit = mask&~(mask-1); for(active_index=0; (bit>>active_index)>1; ++active_index) ; acc.state.set((acc.state&~bit)|(acc.target&bit)); + if(debug>=1) + IO::print("Setting accessory %d bit %d, state=%d\n", acc.address, active_index, acc.state.pending); PendingCommand cmd(acc, Accessory::ACTIVATE, active_index); command_queue.push(cmd); active_accessory = &acc; @@ -457,8 +459,9 @@ void ArduControl::tick() if(active_accessory && off_timeout) { + bool success = (monitor.get_peak()>0.35f && monitor.get_current()off_timeout) + if(t>off_timeout || success) { Accessory &acc = *active_accessory; @@ -467,8 +470,10 @@ void ArduControl::tick() // Assume success if we were uncertain of the physical setting if(acc.uncertain&bit) acc.uncertain &= ~bit; - else if(acc.kind==Accessory::TURNOUT && monitor.get_peak()<0.5f) + else if(acc.kind==Accessory::TURNOUT && !success) { + if(debug>=1) + IO::print("Peak current only %.2f A\n", monitor.get_peak()); signal_turnout_failed.emit(acc.address); acc.state.rollback(); if(acc.valid_states&(1<<(acc.target^bit))) @@ -593,7 +598,7 @@ ArduControl::Accessory::Accessory(Kind k, unsigned a, unsigned b, unsigned s): state(0), uncertain((1<::empty() const } +bool ArduControl::CommandQueueTask::get_work(PendingCommand &cmd) +{ + return queue.pop(cmd); +} + +void ArduControl::CommandQueueTask::push(const PendingCommand &cmd) +{ + queue.push(cmd); +} + + ArduControl::RefreshTask::RefreshTask(): next(cycle.end()), round(0), @@ -1030,6 +1046,7 @@ ArduControl::ControlThread::ControlThread(ArduControl &c): control(c), done(false) { + tasks.push_back(&control.command_queue); tasks.push_back(&control.monitor); tasks.push_back(&control.mfx_announce); tasks.push_back(&control.mfx_search); @@ -1151,9 +1168,6 @@ void ArduControl::ControlThread::init_baud_rate() bool ArduControl::ControlThread::get_work(PendingCommand &cmd) { - if(control.command_queue.pop(cmd)) - return true; - for(vector::iterator i=tasks.begin(); i!=tasks.end(); ++i) if((*i)->get_work(cmd)) return true;