Example #1
0
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);
}
Example #2
0
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();
}
Example #3
0
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();	
}
Example #4
0
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);
}
Example #5
0
void _light_reporting_finish(void) {
	report_current()->light = light_read();
	report_current()->fields |= REPORT_TYPE_LIGHT;
	light_sleep();
}