X-Git-Url: http://git.kpe.io/?p=avr_bc100.git;a=blobdiff_plain;f=BaseMegaFirmware%2FGCC%2Fkey_io.c;fp=BaseMegaFirmware%2FGCC%2Fkey_io.c;h=3c8eaa7209b531aa8c39b161f135d08d07ab2796;hp=0000000000000000000000000000000000000000;hb=89173ec9cd6f33843bf27c45be0f2f9be3f5f0ce;hpb=7997f136b12114035265bd082c854bff95fd73dc diff --git a/BaseMegaFirmware/GCC/key_io.c b/BaseMegaFirmware/GCC/key_io.c new file mode 100644 index 0000000..3c8eaa7 --- /dev/null +++ b/BaseMegaFirmware/GCC/key_io.c @@ -0,0 +1,76 @@ +// M. Thomas 11/2007 + +#include +#include +#include "key_io.h" + +/* define externs */ +// debounced and inverted key state, bit = 1: key pressed +volatile uint8_t key_io_state; +// key press detect +volatile uint8_t key_io_press; +// key long press and repeat +volatile uint8_t key_io_rpt; + +void key_io_init(void) +{ + KEY_IO_KEYSA_DDR &= ~( + (1< no init here + key_io_state = key_io_state_hardware(); +} + +uint8_t key_io_get_press( uint8_t key_mask ) +{ + uint8_t sreg; + + sreg = SREG; + cli(); + + key_mask &= key_io_press; // read key(s) + key_io_press ^= key_mask; // clear key(s) + + SREG = sreg; + + return key_mask; +} + +uint8_t key_io_get_rpt( uint8_t key_mask ) +{ + uint8_t sreg; + + sreg = SREG; + cli(); + + key_mask &= key_io_rpt; // read key(s) + key_io_rpt ^= key_mask; // clear key(s) + + SREG = sreg; + + return key_mask; +} + +uint8_t key_io_get_was_short( uint8_t key_mask ) +{ + uint8_t sreg, ret; + + sreg=SREG; + // read key state and key press atomic ! + cli(); + + ret = key_io_get_press( ~key_io_state & key_mask ); + + SREG = sreg; + + return ret; + +} + +uint8_t key_io_get_longpress( uint8_t key_mask ) +{ + return key_io_get_press( key_io_get_rpt( key_mask )); +} + +