/* Sensor routine */ #include "contiki.h" #include "lib/sensors.h" #include "dev/pir-sensor.h" #include <avr/interrupt.h> #include "led.h" // debug const struct sensors_sensor pir_sensor; static struct timer debouncetimer; static int status(int type); static int enabled = 0; struct sensors_sensor *sensors[1]; unsigned char sensors_flags[1]; #define PIR_BIT INTF6 #define PIR_CHECK_IRQ() (EIFR & PIR_BIT) ? 0 : 1 #define PRINTF(...) printf(__VA_ARGS__) /*---------------------------------------------------------------------------*/ ISR(INT6_vect) { // leds_toggle(LEDS_YELLOW); if(PIR_CHECK_IRQ()) { if(timer_expired(&debouncetimer)) { // led1_on(); timer_set(&debouncetimer, CLOCK_SECOND / 4); sensors_changed(&pir_sensor); // led1_off(); } } } /*---------------------------------------------------------------------------*/ static int value(int type) { return (PORTE & _BV(PE6) ? 0 : 1) || !timer_expired(&debouncetimer); //return 0; } static int configure(int type, int c) { switch (type) { case SENSORS_ACTIVE: if (c) { if(!status(SENSORS_ACTIVE)) { // led1_on(); timer_set(&debouncetimer, 0); DDRE |= (0<<DDE6); // Set pin as input PORTE |= (1<<PORTE6); // Set port PORTE bint 6 with pullup resistor EICRB |= (3<<ISC60); // For rising edge EIMSK |= (1<<INT6); // Set int enabled = 1; sei(); // led1_off(); } } else { enabled = 0; EIMSK &= ~(1<<INT6); // clear int } return 1; } return 0; } static int status(int type) { switch (type) { case SENSORS_ACTIVE: case SENSORS_READY: return enabled;//(EIMSK & (1<<INT6) ? 0 : 1);//PIR_IRQ_ENABLED(); } return 0; } SENSORS_SENSOR(pir_sensor, PIR_SENSOR, value, configure, status);