Example #1
0
File: olwen.c Project: Kreyl/nute
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
}
Example #2
0
File: olwen.c Project: 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;              
    }
}
Example #3
0
File: ring.c Project: Kreyl/nute
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();
}
Example #4
0
File: ring.c Project: 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
}
Example #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