FORCE_INLINE void GeneralInit(void) { wdt_enable(WDTO_2S); ACSR = 1<<ACD; // Disable analog comparator // Shutdown all unneeded PRR = (1<<PRTWI)|(1<<PRSPI)|(1<<PRADC); MustSleep = false; // Setup timer TimerInit(); // Light LED_DDR |= (1<<RED_P)|(1<<GREEN_P)|(1<<BLUE_P); LED_PORT &= ~((1<<RED_P)|(1<<GREEN_P)|(1<<BLUE_P)); LED_UF_DDR |=(1<<UF_P); LED_UF_PORT &=~(1<<UF_P); // Led power // LED_PWR_PORT &= ~(1<<LED_PWR_P); // Low if output, Hi-Z if input // LED_PWR_OFF(); TCCR0A = (1<<WGM01)|(1<<WGM00); TCCR0B = (0<<WGM02)|(0<<CS02)|(0<<CS01)|(1<<CS00); TCCR2A = (1<<WGM21)|(1<<WGM20); TCCR2B = (0<<WGM22)|(0<<CS22)|(0<<CS21)|(1<<CS20); TimerResetDelay(&ELight.Timer); ELight.Indx = 0; SetTableColor(); ELight.SavedColor = ELight.DesiredColor; SetDesiredColor(0, 0, 0,0); // Initial fade ELight.UfIsOn = false; // Sensors SENS_DDR &= ~((1<<SENS_DOWN)|(1<<SENS_UP)|(1<<SENS_UF_SWITCH)); SENS_DDR |= 1<<SENS_PWR; SENS_PORT &= ~((1<<SENS_DOWN)|(1<<SENS_UP)|(1<<SENS_UF_SWITCH)); // No pull-ups // SENS_PWR_OFF(); /* ESens.DownIsOn = false; ESens.UpIsOn = false; ESens.UfIsOn = false; ESens.BothIsOn = false; */ ESens.PollTime = SENS_POLL_TIME; ESens.Step=SENS_STATE_START; TimerResetDelay (&ESens.Timer); // CC init CC_Init(); CC_SetAddress(4); // Never changes in CC itself }
// ============================== 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; } }
FORCE_INLINE void GeneralInit(void){ wdt_enable(WDTO_2S); ACSR = 1<<ACD; // Disable analog comparator TimerInit(); // LED init LED_DDR |= (1<<LED_P); // CC init TimerResetDelay(&CCSrv.Timer); CC.TX_Pkt.PacketID = 1; CC_Init(); CCSrv.Pwr = HiPwr; CC_SetChannel(45); // Set needed channel // Battery BatteryInit(); sei(); }
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