Пример #1
0
Файл: olwen.c Проект: Kreyl/nute
// ============================== Tasks ========================================
void SENS_Task (void) {
    if (!TimerDelayElapsed (&ESens.Timer, ESens.PollTime)) return;
    // Reset to default wait time
    ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
        ESens.PollTime = SENS_POLL_TIME;
    }
    switch (ESens.Step)
    {
        case SENS_STATE_START:
            if (SENS_UP_IS_ON()) ESens.Step=SENS_STATE_UP;             // Touch occured
            if (SENS_DOWN_IS_ON()) ESens.Step=SENS_STATE_DOWN;          // Touch occured
            if (SENS_UF_SWITCH_IS_ON()) ESens.Step=SENS_STATE_UF_SWITCH; // Touch occured
            if (ESens.Step!=SENS_STATE_START) TimerResetDelay(&ESens.HoldTimer);  // Reset hold timer
            break;
        case SENS_STATE_UP:
            if (SENS_DOWN_IS_ON()) ESens.Step=SENS_STATE_BOTH; // Touch occured
            if (!(SENS_UP_IS_ON())) ESens.Step=SENS_STATE_START; // Detouch occured
            if (TimerDelayElapsed(&ESens.HoldTimer, SENS_HOLD_TICK_TIMEOUT)) EVENT_UpHoldTick();
            break;
        case SENS_STATE_DOWN:
            if (SENS_UP_IS_ON()) ESens.Step=SENS_STATE_BOTH;    // Touch occured
            if (!(SENS_DOWN_IS_ON())) ESens.Step=SENS_STATE_START; // Detouch occured            
            if (TimerDelayElapsed(&ESens.HoldTimer, SENS_HOLD_TICK_TIMEOUT)) EVENT_DownHoldTick();
            break;
        case SENS_STATE_UF_SWITCH:
            if (!(SENS_UF_SWITCH_IS_ON())) ESens.Step=SENS_STATE_START; // Detouch occured
            if (TimerDelayElapsed(&ESens.HoldTimer, SENS_HOLD_TICK_TIMEOUT)) EVENT_UfSwitchTouched();
            break;  
        case SENS_STATE_BOTH:
            if (!(SENS_UP_IS_ON())) ESens.Step=SENS_STATE_START; // Detouch occured
            if (!(SENS_DOWN_IS_ON())) ESens.Step=SENS_STATE_START; // Detouch occured 
            if (ESens.Step==SENS_STATE_BOTH) EVENT_BothTouched();
            break;              
    }
}
Пример #2
0
Файл: ring.c Проект: Kreyl/nute
// ================================ Tasks ======================================
void LED_Task(void) {
    if ((Battery.ADCState == ADCNoMeasure) && BATTERY_IS_DISCHARGED()) {
        LED_ON();
        return;
    }
    if (TimerDelayElapsed(&LEDTimer, LED_ON_PERIOD)) LED_OFF();
}
Пример #3
0
Файл: olwen.c Проект: Kreyl/nute
void Light_Task(void) {
    if (!TimerDelayElapsed(&ELight.Timer, LED_STEP_DELAY)) return;
    // Red channel
    if (ELight.CurrentColor.Red != ELight.DesiredColor.Red) {
        if (ELight.DesiredColor.Red < ELight.CurrentColor.Red) {
            ELight.CurrentColor.Red--;
            if (ELight.CurrentColor.Red == 0) LED_RED_DISABLE();
        }
        else {
            if (ELight.CurrentColor.Red == 0) LED_RED_ENABLE();
            ELight.CurrentColor.Red++;
        }
        OCR0A = ELight.CurrentColor.Red;
    }
    // Green channel
    if (ELight.CurrentColor.Green != ELight.DesiredColor.Green) {
        if (ELight.DesiredColor.Green < ELight.CurrentColor.Green) {
            ELight.CurrentColor.Green--;
            if (ELight.CurrentColor.Green == 0) LED_GREEN_DISABLE();
        }
        else {
            if (ELight.CurrentColor.Green == 0) LED_GREEN_ENABLE();
            ELight.CurrentColor.Green++;
        }
        OCR0B = ELight.CurrentColor.Green;
    }
    // Blue channel
    if (ELight.CurrentColor.Blue != ELight.DesiredColor.Blue) {
        if (ELight.DesiredColor.Blue < ELight.CurrentColor.Blue) {
            ELight.CurrentColor.Blue--;
            if (ELight.CurrentColor.Blue == 0) LED_BLUE_DISABLE();
        }
        else {
            if (ELight.CurrentColor.Blue == 0) LED_BLUE_ENABLE();
            ELight.CurrentColor.Blue++;
        }
        OCR2B = ELight.CurrentColor.Blue;
    }
    
    if (ELight.CurrentColor.Uf != ELight.DesiredColor.Uf) {
        if (ELight.DesiredColor.Uf < ELight.CurrentColor.Uf) {
            ELight.CurrentColor.Uf--;
            if (ELight.CurrentColor.Uf == 0) LED_UF_DISABLE();
        }
        else {
            if (ELight.CurrentColor.Uf == 0) LED_UF_ENABLE();
            ELight.CurrentColor.Uf++;
        }
        OCR2A = ELight.CurrentColor.Uf;
    }
}
Пример #4
0
Файл: ring.c Проект: Kreyl/nute
void CC_Task (void){
    // Do with CC what needed
    CC_GET_STATE();
    switch (CC.State){
        case CC_STB_RX_OVF:
            CC_FLUSH_RX_FIFO();
            break;
        case CC_STB_TX_UNDF:
            CC_FLUSH_TX_FIFO();
            break;

        case CC_STB_IDLE:
            PORTA &= ~(1<< PA0);
            if (CCSrv.Pwr == HiPwr) {
                if (TimerDelayElapsed(&CCSrv.Timer, 999)) {
                    PORTA |= (1<< PA0);
                    CC_SetPwr(CC_PWR_10DBM);// Set Hi TX power
                    // LED on
                    TimerResetDelay(&LEDTimer);
                    LED_ON();
                    // Prepare CALL packet
                    CC_WriteTX (&CC.TX_PktArray[0], CC_PKT_LEN); // Write bytes to FIFO
                    CC_ENTER_TX();
                    CCSrv.Pwr = LoPwr;      // Next time transmit at lo pwr
                } // if delay elapsed
            } // if Hi Pwr
            else { // Lo Power
                // Transmit at lo pwr immediately after Hi Pwr transmission ended
                CC_SetPwr(CC_PWR_M6DBM);    // Set Lo TX power
                // Prepare CALL packet
                CC_WriteTX (&CC.TX_PktArray[0], CC_PKT_LEN); // Write bytes to FIFO
                CC_ENTER_TX();
                CCSrv.Pwr = HiPwr;          // Next time transmit at hi pwr
                ATOMIC_BLOCK(ATOMIC_FORCEON) {
                    CC.TX_Pkt.PacketID++;   // Next time transmit other ID
                }
            }
            break;

        default: // Just get out in case of RX, TX, FSTXON, CALIBRATE, SETTLING
            break;
    }//Switch
}
Пример #5
0
// ============================= Implementation ================================
FORCE_INLINE void Battery_Task (void) {
    #ifdef BAT_CHARGER
    if (TimerDelayElapsed(&Battery.ChargeTimer, BAT_CHRG_POLL_PERIOD)) {
        // Check if charging just has begun
        if (BAT_IS_CHARGING()) {
            if (!Battery.IsCharging) {
                Battery.IsCharging = true;
                EVENT_ChargeStarted();
            }
        }
        else {
            if (Battery.IsCharging) {
                Battery.IsCharging = false;
                EVENT_ChargeEnded();
            }
        } // if charging
    } // Timer
    #endif
    #ifdef BAT_ADC
    switch (Battery.ADCState) {
        case ADCNoMeasure:
            if (TimerDelayElapsed(&Battery.ADCTimer, BAT_MEASURE_PERIOD)) { // Check if timeout has passed
                // Start meter
                BATTERY_METER_ON();
                ADC_REF_ENABLE();           // Start ADC
                ADC_START_MEASUREMENT();    // Start new measure - dummy one for the first time
                Battery.ADCState = ADCInit;
            }
            break;

        case ADCInit:
            // Check if dummy measurement completed & timeout passed
            if (ADC_MEASUREMENT_COMPLETED() && TimerDelayElapsed (&Battery.ADCTimer, ADC_PREPARE_TIMEOUT)) {
                ADC_START_MEASUREMENT();    // Start new measure
                Battery.ADCValue = 0;
                Battery.MeasuresCounter = 0;
                Battery.ADCState = ADCMeasuring;
            }
            break;

        case ADCMeasuring:
            if (ADC_MEASUREMENT_COMPLETED()) {  // Check if current measurement completed
                Battery.MeasuresCounter++;
                ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
                    Battery.ADCValue += ADC;    // Add ADC result
                } // atomic
                // Check if series of measurements is completed
                if (Battery.MeasuresCounter >= BAT_NUMBER_OF_MEASURES) {
                    // Disable ADC to save energy
                    ADC_DISABLE();
                    ADC_REF_DISABLE();
                    BATTERY_METER_OFF();
                    // Prepare result
                    Battery.ADCValue >>= BAT_POWER_OF_MEASURES;
                    Battery.ADCState = ADCNoMeasure;
                    TimerResetDelay(&Battery.ADCTimer);
                    EVENT_ADCMeasureCompleted();
                }
                // if not, start measurement again
                else ADC_START_MEASUREMENT();
            } // if current measurement completed