4008-04-07 Release
[avr_bc100.git] / BaseMegaFirmware / GCC / key_io.c
diff --git a/BaseMegaFirmware/GCC/key_io.c b/BaseMegaFirmware/GCC/key_io.c
new file mode 100644 (file)
index 0000000..3c8eaa7
--- /dev/null
@@ -0,0 +1,76 @@
+// M. Thomas 11/2007\r
+\r
+#include <avr/io.h>\r
+#include <avr/interrupt.h>\r
+#include "key_io.h"\r
+\r
+/* define externs */\r
+// debounced and inverted key state, bit = 1: key pressed\r
+volatile uint8_t key_io_state;         \r
+// key press detect\r
+volatile uint8_t key_io_press;\r
+// key long press and repeat\r
+volatile uint8_t key_io_rpt;\r
+\r
+void key_io_init(void)\r
+{\r
+       KEY_IO_KEYSA_DDR &= ~( \r
+               (1<<KEY_IO_KEYA1_BIT) | (1<<KEY_IO_KEYA2_BIT) |\r
+               (1<<KEY_IO_KEYA3_BIT) | (1<<KEY_IO_KEYA4_BIT) );\r
+       KEY_IO_KEYSB_DDR &= ~(1<<KEY_IO_KEYB1_BIT);\r
+       // external pull-ups avail. for all keys -> no init here\r
+       key_io_state = key_io_state_hardware();\r
+}\r
+\r
+uint8_t key_io_get_press( uint8_t key_mask )\r
+{\r
+       uint8_t sreg;\r
+\r
+       sreg = SREG;\r
+       cli();\r
+\r
+       key_mask &= key_io_press; // read key(s)\r
+       key_io_press ^= key_mask; // clear key(s)\r
+\r
+       SREG = sreg;\r
+\r
+       return key_mask;\r
+}\r
+\r
+uint8_t key_io_get_rpt( uint8_t key_mask )\r
+{\r
+       uint8_t sreg;\r
+\r
+       sreg = SREG;\r
+       cli();\r
+\r
+       key_mask &= key_io_rpt;  // read key(s)\r
+       key_io_rpt ^= key_mask;  // clear key(s)\r
+       \r
+       SREG = sreg;\r
+\r
+       return key_mask;\r
+}\r
+\r
+uint8_t key_io_get_was_short( uint8_t key_mask )\r
+{\r
+       uint8_t sreg, ret;\r
+\r
+       sreg=SREG;\r
+       // read key state and key press atomic !\r
+       cli();\r
+\r
+       ret =  key_io_get_press( ~key_io_state & key_mask );\r
+\r
+       SREG = sreg;\r
+\r
+       return ret;\r
+\r
+}\r
+\r
+uint8_t key_io_get_longpress( uint8_t key_mask )\r
+{\r
+       return key_io_get_press( key_io_get_rpt( key_mask ));\r
+}\r
+\r
+\r