button-sensor.c
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 #include "dev/button-sensor.h"
00044 #include "hal/micro/micro-common.h"
00045 #include "hal/micro/cortexm3/micro-common.h"
00046
00047 #include BOARD_HEADER
00048
00049 #define DEBOUNCE 1
00050
00051
00052
00053
00054 #undef BUTTON_S1
00055 #define BUTTON_S1 PORTA_PIN(7)
00056 #define BUTTON_S1_INPUT_GPIO BUTTON_INPUT_GPIO(PORTA)
00057 #define BUTTON_S1_GPIO_PIN 7
00058 #define BUTTON_S1_OUTPUT_GPIO GPIO_PAOUT
00059
00060
00061
00062
00063 #define BUTTON_S1_SEL() do { GPIO_IRQCSEL = BUTTON_S1; } while(0)
00064
00065
00066
00067 #define BUTTON_S1_ISR halIrqCIsr
00068
00069
00070
00071 #define BUTTON_S1_INTCFG GPIO_INTCFGC
00072
00073
00074
00075 #define BUTTON_S1_INT_EN_BIT INT_IRQC
00076
00077
00078
00079 #define BUTTON_S1_FLAG_BIT INT_IRQCFLAG
00080
00081
00082
00083 #define BUTTON_S1_MISS_BIT INT_MISSIRQC
00084
00085 #if DEBOUNCE
00086 static struct timer debouncetimer;
00087 #endif
00088
00089 #define FALSE 0
00090 #define TRUE 1
00091
00092
00093 static void
00094 init(void)
00095 {
00096 #if DEBOUNCE
00097 timer_set(&debouncetimer, 0);
00098 #endif
00099
00100
00101
00102
00103 halGpioConfig(BUTTON_S1,GPIOCFG_IN_PUD);
00104 BUTTON_S1_OUTPUT_GPIO |= GPIOOUT_PULLUP << BUTTON_S1_GPIO_PIN;
00105
00106
00107 BUTTON_S1_SEL();
00108 BUTTON_S1_INTCFG = 0x40;
00109
00110 }
00111
00112 static void
00113 activate(void)
00114 {
00115 INT_CFGSET = BUTTON_S1_INT_EN_BIT;
00116 }
00117
00118 static void
00119 deactivate(void)
00120 {
00121 INT_CFGCLR = BUTTON_S1_INT_EN_BIT;
00122 }
00123
00124 static int
00125 active(void)
00126 {
00127 return (INT_CFGSET & BUTTON_S1_INT_EN_BIT) ? TRUE : FALSE ;
00128 }
00129
00130 static int
00131 value(int type)
00132 {
00133 #if DEBOUNCE
00134 return (BUTTON_S1_INPUT_GPIO & (1<<BUTTON_S1_GPIO_PIN)) || !timer_expired(&debouncetimer);
00135 #else
00136 return BUTTON_S1_INPUT_GPIO & (1<<BUTTON_S1_GPIO_PIN);
00137 #endif
00138 }
00139
00140 static int
00141 configure(int type, int value)
00142 {
00143 switch(type){
00144 case SENSORS_HW_INIT:
00145 init();
00146 return 1;
00147 case SENSORS_ACTIVE:
00148 if(value)
00149 activate();
00150 else
00151 deactivate();
00152 return 1;
00153 }
00154
00155 return 0;
00156 }
00157
00158 static int
00159 status(int type)
00160 {
00161 switch(type) {
00162
00163 case SENSORS_READY:
00164 return active();
00165 }
00166
00167 return 0;
00168 }
00169
00170 void BUTTON_S1_ISR(void)
00171 {
00172
00173 ENERGEST_ON(ENERGEST_TYPE_IRQ);
00174
00175
00176
00177 if(INT_GPIOFLAG & BUTTON_S1_FLAG_BIT) {
00178
00179 #if DEBOUNCE
00180 if(timer_expired(&debouncetimer)) {
00181 timer_set(&debouncetimer, CLOCK_SECOND / 5);
00182 sensors_changed(&button_sensor);
00183 }
00184 #else
00185 sensors_changed(&button_sensor);
00186 #endif
00187
00188 }
00189
00190 INT_GPIOFLAG = BUTTON_S1_FLAG_BIT;
00191
00192 ENERGEST_OFF(ENERGEST_TYPE_IRQ);
00193 }
00194
00195 SENSORS_SENSOR(button_sensor, BUTTON_SENSOR,
00196 value, configure, status);
00197