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;
if(active_accessory && off_timeout)
{
+ bool success = (monitor.get_peak()>0.35f && monitor.get_current()<monitor.get_peak()-0.2f);
Time::TimeStamp t = Time::now();
- if(t>off_timeout)
+ if(t>off_timeout || success)
{
Accessory &acc = *active_accessory;
// 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)))
state(0),
uncertain((1<<bits)-1),
target(0),
- active_time(500*Time::msec)
+ active_time((bits*700)*Time::msec)
{ }
unsigned ArduControl::Accessory::create_state_command(unsigned b, bool c, char *buffer) const