void door_tick(void) { door_update_inputs(); if( door_desiredState == DOOR_LOCK_LOCKED && !locking && !locked ){ door_startLock(); }else if( door_desiredState == DOOR_LOCK_UNLOCKED && !unlocking && !unlocked){ door_startUnlock(); } if(adc_getChannel(7) > 1000) { door_stop(); if(locking) { locking = false; locked = true; unlocked = false; } if(unlocking) { unlocking = false; unlocked = true; locked = false; } } }
void door_tick(void) { static uint16_t timeout = 0; static bool previousbarsensor = false; bool barsensor = door_barSensor(); door_update_inputs(); switch(door_state) { case DOOR_IDLE: if( door_desiredState == DOOR_LOCK_LOCKED && door_barState != BAR_LOCKED ){ door_state = DOOR_LOCK; }else if( door_desiredState == DOOR_LOCK_UNLOCKED && door_barState != BAR_UNLOCKED ){ door_state = DOOR_UNLOCK; }else if( door_barState == BAR_UNKNOWN ){ door_state = DOOR_LOCKING; } break; case DOOR_LOCK: if( door_closed() && !door_handlePressed()){ previousbarsensor = barsensor; door_startLock(); door_state = DOOR_LOCKING; // Timeout in which the action must be // completed by the motor. timeout = 6000; } break; case DOOR_LOCKING: //if( door_locked() ){ if( previousbarsensor == true && barsensor == false ){ door_stopLock(); door_state = DOOR_IDLE; timeout = 0; door_barState = BAR_LOCKED; }else if( --timeout == 0 ) { door_stopLock(); // TODO: handle the error or retry. door_state = DOOR_IDLE; } break; case DOOR_UNLOCK: if( door_closed() && !door_handlePressed()){ door_startLock(); door_state = DOOR_UNLOCKING; // Timeout in which the action must be // completed by the motor. timeout = 6000; } break; case DOOR_UNLOCKING: //if( door_unlocked() ){ if( previousbarsensor == false && barsensor == true ){ door_stopLock(); door_state = DOOR_IDLE; timeout = 0; door_barState = BAR_UNLOCKED; }else if( --timeout == 0 ) { door_stopLock(); // TODO: handle the error or retry. door_state = DOOR_IDLE; } break; } previousbarsensor = barsensor; // TODO: put overcurrent detection here }