void light_configure_interrupt(uint16_t light_level, uint16_t hysteresis, void (*cb)(uint8_t level)) { light_reading_t lr; light_level_cb = cb; // read current light value light_wake(); _delay_ms(105); lr = light_read(); int_current_level = (lr.ch0 > light_level); }
void light_set_interrupt_params(uint16_t level, uint16_t hysteresis) { int_level_setting = level; int_hysteresis_setting = hysteresis; light_reading_t lr; // read current light value light_wake(); _delay_ms(105); lr = light_read(); int_current_level = (lr.ch0 > level); light_sleep(); }
void _light_interrupt_finish() { light_reading_t lr; lr = light_read(); //printf_P(PSTR("\tlr.ch0=%04X lvl=%04X hyst=%04X curlvl=%d\n"),lr.ch0,int_level_setting,int_hysteresis_setting,int_current_level); if (( int_current_level && (lr.ch0 < int_level_setting - int_hysteresis_setting)) || (!int_current_level && (lr.ch0 > int_level_setting + int_hysteresis_setting)) ) { int_current_level = (lr.ch0 > int_level_setting); report_current()->fields |= REPORT_TYPE_LIGHT_CHANGED; report_current()->light_level_state = int_current_level; } light_sleep(); }
void init_Interrupts(void){ // Setup Interrupt for Light Sensor light_setRange(LIGHT_RANGE_4000); // sensing up to 3892 lux light_setIrqInCycles(LIGHT_CYCLE_1); light_clearIrqStatus(); light_enable(); // Determine initial light conditions uint32_t initial_light_value = light_read(); if (initial_light_value > LIGHTNING_THRESHOLD) { // Initialize interrupt to trigger on falling below threshold aboveThreshold = 1; light_setLoThreshold(LIGHTNING_THRESHOLD); light_setHiThreshold(RANGE_K2-1); // disable high threshold } else { // Initialize interrupt to trigger on exceeding threshold aboveThreshold = 0; light_setHiThreshold(LIGHTNING_THRESHOLD); light_setLoThreshold(0); // disable low threshold } // clear interrupts before enabling LPC_GPIOINT->IO2IntClr = 1 << 5; LPC_GPIOINT->IO2IntClr = 1 << 10; LPC_GPIOINT->IO0IntClr = 1 << 24; LPC_GPIOINT->IO0IntClr = 1 << 25; LPC_GPIOINT->IO0IntClr = 1 << 17; LPC_GPIOINT->IO0IntClr = 1 << 15; LPC_GPIOINT->IO0IntClr = 1 << 16; LPC_GPIOINT->IO2IntClr = 1 << 3; LPC_GPIOINT->IO2IntClr = 1 << 4; LPC_GPIOINT->IO2IntEnF |= 1 << 5; // light sensor 3000 lux interrupt (P2.5) LPC_GPIOINT->IO2IntEnF |= 1 << 10; // SW3 (P2.10) LPC_GPIOINT->IO0IntEnF |= 1 << 24; // rotary switch right LPC_GPIOINT->IO0IntEnF |= 1 << 25; // rotary switch left // joystick LPC_GPIOINT->IO0IntEnF |= 1 << 17; // center LPC_GPIOINT->IO0IntEnF |= 1 << 15; // down LPC_GPIOINT->IO0IntEnF |= 1 << 16; // right LPC_GPIOINT->IO2IntEnF |= 1 << 3; // up LPC_GPIOINT->IO2IntEnF |= 1 << 4; // left enableTimer(RGB, 1000); // RGB will blink throughout operation at 1000ms interval enableTimer(SAMPLING, 2000); enableTimer(PCA9532, 250); }
void _light_reporting_finish(void) { report_current()->light = light_read(); report_current()->fields |= REPORT_TYPE_LIGHT; light_sleep(); }