X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Farducontrol.cpp;h=7f95b631aa119bd77e7698d48c52b94fedd7bb23;hb=b4beace6f1d3e018dbe1495430d32f828d406229;hp=9edc1e2244d41beb448921617186dfe635c4d192;hpb=83778cdecccaa02c943cb9b49fb20f1c546b15bd;p=r2c2.git diff --git a/source/libr2c2/arducontrol.cpp b/source/libr2c2/arducontrol.cpp index 9edc1e2..7f95b63 100644 --- a/source/libr2c2/arducontrol.cpp +++ b/source/libr2c2/arducontrol.cpp @@ -25,6 +25,7 @@ ArduControl::ArduControl(const Options &opts): power(false), halted(false), active_accessory(0), + command_timeout(200*Time::msec), s88(*this), mfx_search(*this), thread(*this) @@ -456,6 +457,8 @@ void ArduControl::tick() void ArduControl::flush() { + while(!command_queue.empty() || !accessory_queue.empty()) + tick(); } void ArduControl::save_state() const @@ -657,6 +660,12 @@ bool ArduControl::Queue::pop(T &item) return true; } +template +bool ArduControl::Queue::empty() const +{ + return items.empty(); +} + ArduControl::RefreshTask::RefreshTask(): next(cycle.end()), @@ -1066,11 +1075,11 @@ void ArduControl::ControlThread::init_baud_rate() cmd.command[1] = rates[0]>>8; cmd.command[2] = rates[0]; cmd.length = 3; - if(do_command(cmd)==COMMAND_OK) + if(do_command(cmd, Time::sec)==COMMAND_OK) { control.serial.set_baud_rate(rates[0]); Time::sleep(Time::sec); - if(do_command(cmd)==COMMAND_OK) + if(do_command(cmd, Time::sec)==COMMAND_OK) { if(control.debug>=1) IO::print("Rate changed to %d bits/s\n", rates[0]); @@ -1098,7 +1107,7 @@ bool ArduControl::ControlThread::get_work(PendingCommand &cmd) return true; } -unsigned ArduControl::ControlThread::do_command(const PendingCommand &cmd) +unsigned ArduControl::ControlThread::do_command(const PendingCommand &cmd, const Time::TimeDelta &timeout) { if(control.debug>=2) { @@ -1118,7 +1127,7 @@ unsigned ArduControl::ControlThread::do_command(const PendingCommand &cmd) if(result) got_data = IO::poll(control.serial, IO::P_INPUT, Time::zero); else - got_data = IO::poll(control.serial, IO::P_INPUT); + got_data = IO::poll(control.serial, IO::P_INPUT, timeout); if(!got_data) break; @@ -1133,7 +1142,11 @@ unsigned ArduControl::ControlThread::do_command(const PendingCommand &cmd) char reply[15]; unsigned pos = 0; while(pos=2) {