Process script for TCS
[matches/honours.git] / research / TCS / apparatus / source_code / button.c
1 //***************************************************************************\r
2 //\r
3 //  File........: button.c\r
4 //\r
5 //  Author(s)...: ATMEL Norway\r
6 //\r
7 //  Target(s)...: ATmega169\r
8 //\r
9 //  Compiler....: AVR-GCC 4.1.1; avr-libc 1.4.5\r
10 //\r
11 //  Description.: AVR Butterfly button handling routines\r
12 //\r
13 //  Revisions...: 1.0\r
14 //\r
15 //  YYYYMMDD - VER. - COMMENT                                       - SIGN.\r
16 //\r
17 //  20030116 - 1.0  - Created                                       - KS\r
18 //  20031009          port to avr-gcc/avr-libc                      - M.Thomas\r
19 //  20070129          SIGNAL->ISR                                   - mt\r
20 //\r
21 //***************************************************************************\r
22 \r
23 //mtA\r
24 //#include <inavr.h>\r
25 //#include "iom169.h"\r
26 #include <stdint.h>\r
27 #include <avr/io.h>\r
28 #include <avr/interrupt.h>\r
29 //mtE\r
30 #include "main.h"\r
31 \r
32 #include "timer0.h"\r
33 // mt/v6 - keyclick (see main.c)\r
34 extern volatile BOOL gKeyClickStatus;\r
35 \r
36 // mt  unsigned char gButtonTimeout = FALSE;\r
37 volatile unsigned char gButtonTimeout = FALSE;\r
38 \r
39 //mtA\r
40 //char KEY = NULL;\r
41 //char KEY_VALID = FALSE;\r
42 //volatile char KEY = NULL;\r
43 volatile char KEY = 0;\r
44 volatile char KEY_VALID = FALSE;\r
45 //mtE\r
46 \r
47 char CountdownTimerHandle;\r
48 \r
49 /*****************************************************************************\r
50 *\r
51 *   Function name : Button_Init\r
52 *\r
53 *   Returns :       None\r
54 *\r
55 *   Parameters :    None\r
56 *\r
57 *   Purpose :       Initializes the five button pin\r
58 *\r
59 *****************************************************************************/\r
60 void Button_Init(void)\r
61 {\r
62     // Init port pins\r
63     cbiBF(DDRB,7);\r
64     cbiBF(DDRB,6);\r
65     cbiBF(DDRB,4);\r
66     PORTB |= PINB_MASK;\r
67     DDRE = 0x00;\r
68     PORTE |= PINE_MASK;\r
69 \r
70     // Enable pin change interrupt on PORTB and PORTE\r
71     PCMSK0 = PINE_MASK;\r
72     PCMSK1 = PINB_MASK;\r
73     EIFR = (1<<PCIF0)|(1<<PCIF1);\r
74     EIMSK = (1<<PCIE0)|(1<<PCIE1);\r
75 \r
76     CountdownTimerHandle = Timer0_AllocateCountdownTimer();\r
77 }\r
78 \r
79 // #pragma vector = PCINT0_vect\r
80 // __interrupt void PCINT0_interrupt(void)\r
81 ISR(PCINT0_vect)\r
82 // mtE\r
83 {\r
84     PinChangeInterrupt();\r
85 }\r
86 \r
87 // mtA\r
88 // #pragma vector = PCINT1_vect\r
89 // __interrupt void PCINT1_interrupt(void)\r
90 // mtE\r
91 ISR(PCINT1_vect)\r
92 {\r
93     PinChangeInterrupt();\r
94 }\r
95 \r
96 \r
97 /*****************************************************************************\r
98 *\r
99 *   Function name : PinChangeInterrupt\r
100 *\r
101 *   Returns :       None\r
102 *\r
103 *   Parameters :    None\r
104 *\r
105 *   Purpose :       Check status on the joystick\r
106 *\r
107 *****************************************************************************/\r
108 void PinChangeInterrupt(void)\r
109 {\r
110     char buttons;\r
111 \r
112     char key;\r
113 \r
114 /*\r
115     Read the buttons:\r
116 \r
117     Bit             7   6   5   4   3   2   1   0\r
118     ---------------------------------------------\r
119     PORTB           B   A       O\r
120     PORTE                           D   C\r
121     ---------------------------------------------\r
122     PORTB | PORTE   B   A       O   D   C\r
123     =============================================\r
124 */\r
125 \r
126 \r
127     buttons = (~PINB) & PINB_MASK;\r
128     buttons |= (~PINE) & PINE_MASK;\r
129 \r
130     // Output virtual keys\r
131     if (buttons & (1<<BUTTON_A))\r
132         key = KEY_PLUS;\r
133     else if (buttons & (1<<BUTTON_B))\r
134         key = KEY_MINUS;\r
135     else if (buttons & (1<<BUTTON_C))\r
136         key = KEY_PREV;\r
137     else if (buttons & (1<<BUTTON_D))\r
138         key = KEY_NEXT;\r
139     else if (buttons & (1<<BUTTON_O))\r
140         key = KEY_ENTER;\r
141     else\r
142         key = KEY_NULL;\r
143 \r
144     \r
145     if(key != KEY_NULL)\r
146     {\r
147         if(gButtonTimeout)  // gButtonTimeout is set in the LCD_SOF_interrupt in LCD_driver.c\r
148         {\r
149             if (!KEY_VALID)\r
150             {\r
151                 KEY = key;          // Store key in global key buffer\r
152                 KEY_VALID = TRUE;\r
153             }\r
154 \r
155                         gButtonTimeout = FALSE;\r
156     \r
157         }\r
158     }\r
159     \r
160     EIFR = (1<<PCIF1) | (1<<PCIF0);     // Delete pin change interrupt flags    \r
161 }\r
162 \r
163 \r
164 /*****************************************************************************\r
165 *\r
166 *   Function name : getkey\r
167 *\r
168 *   Returns :       The valid key\r
169 *\r
170 *   Parameters :    None\r
171 *\r
172 *   Purpose :       Get the valid key \r
173 *\r
174 *****************************************************************************/\r
175 char getkey(void)\r
176 {\r
177     char k;\r
178 \r
179     cli(); // mt: __disable_interrupt();\r
180 \r
181     if (KEY_VALID)              // Check for unread key in buffer\r
182     {\r
183         k = KEY;\r
184         KEY_VALID = FALSE;\r
185     }\r
186     else\r
187         k = KEY_NULL;           // No key stroke available\r
188 \r
189     sei(); // mt: __enable_interrupt();\r
190 \r
191     return k;\r
192 }\r

UCC git Repository :: git.ucc.asn.au