Exemplo n.º 1
0
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;
        }
    }
}
Exemplo n.º 2
0
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
}