// ============================== 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; } }
// ================================ Tasks ====================================== void LED_Task(void) { if ((Battery.ADCState == ADCNoMeasure) && BATTERY_IS_DISCHARGED()) { LED_ON(); return; } if (TimerDelayElapsed(&LEDTimer, LED_ON_PERIOD)) LED_OFF(); }
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; } }
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 }
// ============================= 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