4008-04-07 Release
[avr_bc100.git] / BaseMegaFirmware / GCC / key_io.c
1 // M. Thomas 11/2007\r
2 \r
3 #include <avr/io.h>\r
4 #include <avr/interrupt.h>\r
5 #include "key_io.h"\r
6 \r
7 /* define externs */\r
8 // debounced and inverted key state, bit = 1: key pressed\r
9 volatile uint8_t key_io_state;          \r
10 // key press detect\r
11 volatile uint8_t key_io_press;\r
12 // key long press and repeat\r
13 volatile uint8_t key_io_rpt;\r
14 \r
15 void key_io_init(void)\r
16 {\r
17         KEY_IO_KEYSA_DDR &= ~( \r
18                 (1<<KEY_IO_KEYA1_BIT) | (1<<KEY_IO_KEYA2_BIT) |\r
19                 (1<<KEY_IO_KEYA3_BIT) | (1<<KEY_IO_KEYA4_BIT) );\r
20         KEY_IO_KEYSB_DDR &= ~(1<<KEY_IO_KEYB1_BIT);\r
21         // external pull-ups avail. for all keys -> no init here\r
22         key_io_state = key_io_state_hardware();\r
23 }\r
24 \r
25 uint8_t key_io_get_press( uint8_t key_mask )\r
26 {\r
27         uint8_t sreg;\r
28 \r
29         sreg = SREG;\r
30         cli();\r
31 \r
32         key_mask &= key_io_press; // read key(s)\r
33         key_io_press ^= key_mask; // clear key(s)\r
34 \r
35         SREG = sreg;\r
36 \r
37         return key_mask;\r
38 }\r
39 \r
40 uint8_t key_io_get_rpt( uint8_t key_mask )\r
41 {\r
42         uint8_t sreg;\r
43 \r
44         sreg = SREG;\r
45         cli();\r
46 \r
47         key_mask &= key_io_rpt;  // read key(s)\r
48         key_io_rpt ^= key_mask;  // clear key(s)\r
49         \r
50         SREG = sreg;\r
51 \r
52         return key_mask;\r
53 }\r
54 \r
55 uint8_t key_io_get_was_short( uint8_t key_mask )\r
56 {\r
57         uint8_t sreg, ret;\r
58 \r
59         sreg=SREG;\r
60         // read key state and key press atomic !\r
61         cli();\r
62 \r
63         ret =  key_io_get_press( ~key_io_state & key_mask );\r
64 \r
65         SREG = sreg;\r
66 \r
67         return ret;\r
68 \r
69 }\r
70 \r
71 uint8_t key_io_get_longpress( uint8_t key_mask )\r
72 {\r
73         return key_io_get_press( key_io_get_rpt( key_mask ));\r
74 }\r
75 \r
76 \r