This is a part of the Kinetiszer project.
keyboard.c@0:cb80470434eb, 2014-10-28 (annotated)
- Committer:
- Clemo
- Date:
- Tue Oct 28 12:19:42 2014 +0000
- Revision:
- 0:cb80470434eb
Error & warning free.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Clemo | 0:cb80470434eb | 1 | #include "atmegatron.h" |
Clemo | 0:cb80470434eb | 2 | |
Clemo | 0:cb80470434eb | 3 | |
Clemo | 0:cb80470434eb | 4 | keyboard_key_t g_encoder[] = |
Clemo | 0:cb80470434eb | 5 | { |
Clemo | 0:cb80470434eb | 6 | // Function bit 7 is either reserved 1 (IOCON_RESERVED_BIT_7) or "Digital functional mode" (IOCON_DIGMODE_EN), |
Clemo | 0:cb80470434eb | 7 | // meaning that it has to be set in all cases. |
Clemo | 0:cb80470434eb | 8 | // No pull-ups or -downs on rotary encoder pins. All inputs are inverted to read as 1 on contact closed. |
Clemo | 0:cb80470434eb | 9 | // Rotary encoders are handled as two non-matrix keys. |
Clemo | 0:cb80470434eb | 10 | |
Clemo | 0:cb80470434eb | 11 | #if defined BOARD_KEYBOARD_RE0 /* S1 */ |
Clemo | 0:cb80470434eb | 12 | { BOARD_KEYBOARD_RE0_A_PORT, BOARD_KEYBOARD_RE0_A_PIN, IOCON_DIGMODE_EN|IOCON_INV_EN }, |
Clemo | 0:cb80470434eb | 13 | { BOARD_KEYBOARD_RE0_B_PORT, BOARD_KEYBOARD_RE0_B_PIN, IOCON_DIGMODE_EN|IOCON_INV_EN }, |
Clemo | 0:cb80470434eb | 14 | #endif |
Clemo | 0:cb80470434eb | 15 | |
Clemo | 0:cb80470434eb | 16 | #if defined BOARD_KEYBOARD_RE1 /* S2 */ |
Clemo | 0:cb80470434eb | 17 | { BOARD_KEYBOARD_RE1_A_PORT, BOARD_KEYBOARD_RE1_A_PIN, IOCON_DIGMODE_EN|IOCON_INV_EN }, |
Clemo | 0:cb80470434eb | 18 | { BOARD_KEYBOARD_RE1_B_PORT, BOARD_KEYBOARD_RE1_B_PIN, IOCON_DIGMODE_EN|IOCON_INV_EN }, |
Clemo | 0:cb80470434eb | 19 | #endif |
Clemo | 0:cb80470434eb | 20 | |
Clemo | 0:cb80470434eb | 21 | #if defined BOARD_KEYBOARD_RE2 /* S3 */ |
Clemo | 0:cb80470434eb | 22 | { BOARD_KEYBOARD_RE2_A_PORT, BOARD_KEYBOARD_RE2_A_PIN, IOCON_DIGMODE_EN|IOCON_INV_EN }, |
Clemo | 0:cb80470434eb | 23 | { BOARD_KEYBOARD_RE2_B_PORT, BOARD_KEYBOARD_RE2_B_PIN, IOCON_FUNC1|IOCON_DIGMODE_EN|IOCON_INV_EN }, |
Clemo | 0:cb80470434eb | 24 | #endif |
Clemo | 0:cb80470434eb | 25 | |
Clemo | 0:cb80470434eb | 26 | #if defined BOARD_KEYBOARD_RE3 /* S4 */ |
Clemo | 0:cb80470434eb | 27 | { BOARD_KEYBOARD_RE3_A_PORT, BOARD_KEYBOARD_RE3_A_PIN, IOCON_DIGMODE_EN|IOCON_INV_EN }, |
Clemo | 0:cb80470434eb | 28 | { BOARD_KEYBOARD_RE3_B_PORT, BOARD_KEYBOARD_RE3_B_PIN, IOCON_FUNC1|IOCON_DIGMODE_EN|IOCON_INV_EN }, |
Clemo | 0:cb80470434eb | 29 | #endif |
Clemo | 0:cb80470434eb | 30 | |
Clemo | 0:cb80470434eb | 31 | #if defined BOARD_KEYBOARD_RE4 /* S5 */ |
Clemo | 0:cb80470434eb | 32 | { BOARD_KEYBOARD_RE4_A_PORT, BOARD_KEYBOARD_RE4_A_PIN, IOCON_DIGMODE_EN|IOCON_INV_EN }, |
Clemo | 0:cb80470434eb | 33 | { BOARD_KEYBOARD_RE4_B_PORT, BOARD_KEYBOARD_RE4_B_PIN, IOCON_FUNC1|IOCON_DIGMODE_EN|IOCON_INV_EN }, |
Clemo | 0:cb80470434eb | 34 | #endif |
Clemo | 0:cb80470434eb | 35 | |
Clemo | 0:cb80470434eb | 36 | #if defined BOARD_KEYBOARD_RE5 /* S6 */ |
Clemo | 0:cb80470434eb | 37 | { BOARD_KEYBOARD_RE5_A_PORT, BOARD_KEYBOARD_RE5_A_PIN, IOCON_DIGMODE_EN|IOCON_INV_EN }, |
Clemo | 0:cb80470434eb | 38 | { BOARD_KEYBOARD_RE5_B_PORT, BOARD_KEYBOARD_RE5_B_PIN, IOCON_DIGMODE_EN|IOCON_INV_EN }, |
Clemo | 0:cb80470434eb | 39 | #endif |
Clemo | 0:cb80470434eb | 40 | |
Clemo | 0:cb80470434eb | 41 | #if defined BOARD_KEYBOARD_RE6 /* S7 */ |
Clemo | 0:cb80470434eb | 42 | { BOARD_KEYBOARD_RE6_A_PORT, BOARD_KEYBOARD_RE6_A_PIN, IOCON_DIGMODE_EN|IOCON_INV_EN }, |
Clemo | 0:cb80470434eb | 43 | { BOARD_KEYBOARD_RE6_B_PORT, BOARD_KEYBOARD_RE6_B_PIN, IOCON_DIGMODE_EN|IOCON_INV_EN }, |
Clemo | 0:cb80470434eb | 44 | #endif |
Clemo | 0:cb80470434eb | 45 | |
Clemo | 0:cb80470434eb | 46 | #if defined BOARD_KEYBOARD_RE7 /* S8 */ |
Clemo | 0:cb80470434eb | 47 | { BOARD_KEYBOARD_RE7_A_PORT, BOARD_KEYBOARD_RE7_A_PIN, IOCON_DIGMODE_EN|IOCON_INV_EN }, |
Clemo | 0:cb80470434eb | 48 | { BOARD_KEYBOARD_RE7_B_PORT, BOARD_KEYBOARD_RE7_B_PIN, IOCON_DIGMODE_EN|IOCON_INV_EN }, |
Clemo | 0:cb80470434eb | 49 | #endif |
Clemo | 0:cb80470434eb | 50 | }; |
Clemo | 0:cb80470434eb | 51 | |
Clemo | 0:cb80470434eb | 52 | |
Clemo | 0:cb80470434eb | 53 | keyboard_key_t g_key[] = |
Clemo | 0:cb80470434eb | 54 | { |
Clemo | 0:cb80470434eb | 55 | // Function bit 7 is either reserved 1 (IOCON_RESERVED_BIT_7) or "Digital functional mode" (IOCON_DIGMODE_EN), |
Clemo | 0:cb80470434eb | 56 | // meaning that it has to be set in all cases. |
Clemo | 0:cb80470434eb | 57 | // Pull-ups needed. All inputs are inverted to read as 1 on contact closed. |
Clemo | 0:cb80470434eb | 58 | |
Clemo | 0:cb80470434eb | 59 | // S9 (ISP) |
Clemo | 0:cb80470434eb | 60 | { BOARD_KEYBOARD_ISP_PORT, BOARD_KEYBOARD_ISP_PIN, IOCON_MODE_PULLUP|IOCON_DIGMODE_EN|IOCON_INV_EN }, |
Clemo | 0:cb80470434eb | 61 | |
Clemo | 0:cb80470434eb | 62 | #if defined RESET_IS_GPIO |
Clemo | 0:cb80470434eb | 63 | // S10 (reset) could go here... |
Clemo | 0:cb80470434eb | 64 | { BOARD_KEYBOARD_RESET_PORT, BOARD_KEYBOARD_RESET_PIN, IOCON_FUNC1|IOCON_MODE_PULLUP|IOCON_DIGMODE_EN|IOCON_INV_EN }, |
Clemo | 0:cb80470434eb | 65 | #endif |
Clemo | 0:cb80470434eb | 66 | }; |
Clemo | 0:cb80470434eb | 67 | |
Clemo | 0:cb80470434eb | 68 | |
Clemo | 0:cb80470434eb | 69 | keyboard_matrix_key_t g_matrix_key[] = |
Clemo | 0:cb80470434eb | 70 | { |
Clemo | 0:cb80470434eb | 71 | #ifdef BOARD_KEYBOARD_S00 /* S1 */ |
Clemo | 0:cb80470434eb | 72 | { BOARD_KEYBOARD_C0_PORT, BOARD_KEYBOARD_C0_PIN, BOARD_KEYBOARD_R0_PORT, BOARD_KEYBOARD_R0_PIN, { 0, key_released, false }}, |
Clemo | 0:cb80470434eb | 73 | #endif |
Clemo | 0:cb80470434eb | 74 | |
Clemo | 0:cb80470434eb | 75 | #ifdef BOARD_KEYBOARD_S01 /* S2 */ |
Clemo | 0:cb80470434eb | 76 | { BOARD_KEYBOARD_C1_PORT, BOARD_KEYBOARD_C1_PIN, BOARD_KEYBOARD_R0_PORT, BOARD_KEYBOARD_R0_PIN, { 0, key_released, false }}, |
Clemo | 0:cb80470434eb | 77 | #endif |
Clemo | 0:cb80470434eb | 78 | |
Clemo | 0:cb80470434eb | 79 | #ifdef BOARD_KEYBOARD_S02 /* S3 */ |
Clemo | 0:cb80470434eb | 80 | { BOARD_KEYBOARD_C2_PORT, BOARD_KEYBOARD_C2_PIN, BOARD_KEYBOARD_R0_PORT, BOARD_KEYBOARD_R0_PIN, { 0, key_released, false }}, |
Clemo | 0:cb80470434eb | 81 | #endif |
Clemo | 0:cb80470434eb | 82 | |
Clemo | 0:cb80470434eb | 83 | #ifdef BOARD_KEYBOARD_S10 /* S4 */ |
Clemo | 0:cb80470434eb | 84 | { BOARD_KEYBOARD_C0_PORT, BOARD_KEYBOARD_C0_PIN, BOARD_KEYBOARD_R1_PORT, BOARD_KEYBOARD_R1_PIN, { 0, key_released, false }}, |
Clemo | 0:cb80470434eb | 85 | #endif |
Clemo | 0:cb80470434eb | 86 | |
Clemo | 0:cb80470434eb | 87 | #ifdef BOARD_KEYBOARD_S11 /* S5 */ |
Clemo | 0:cb80470434eb | 88 | { BOARD_KEYBOARD_C1_PORT, BOARD_KEYBOARD_C1_PIN, BOARD_KEYBOARD_R1_PORT, BOARD_KEYBOARD_R1_PIN, { 0, key_released, false }}, |
Clemo | 0:cb80470434eb | 89 | #endif |
Clemo | 0:cb80470434eb | 90 | |
Clemo | 0:cb80470434eb | 91 | #ifdef BOARD_KEYBOARD_S12 /* S6 */ |
Clemo | 0:cb80470434eb | 92 | { BOARD_KEYBOARD_C2_PORT, BOARD_KEYBOARD_C2_PIN, BOARD_KEYBOARD_R1_PORT, BOARD_KEYBOARD_R1_PIN, { 0, key_released, false }}, |
Clemo | 0:cb80470434eb | 93 | #endif |
Clemo | 0:cb80470434eb | 94 | |
Clemo | 0:cb80470434eb | 95 | #ifdef BOARD_KEYBOARD_S20 /* S7 */ |
Clemo | 0:cb80470434eb | 96 | { BOARD_KEYBOARD_C0_PORT, BOARD_KEYBOARD_C0_PIN, BOARD_KEYBOARD_R2_PORT, BOARD_KEYBOARD_R2_PIN, { 0, key_released, false }}, |
Clemo | 0:cb80470434eb | 97 | #endif |
Clemo | 0:cb80470434eb | 98 | |
Clemo | 0:cb80470434eb | 99 | #ifdef BOARD_KEYBOARD_S21 /* S8 */ |
Clemo | 0:cb80470434eb | 100 | { BOARD_KEYBOARD_C1_PORT, BOARD_KEYBOARD_C1_PIN, BOARD_KEYBOARD_R2_PORT, BOARD_KEYBOARD_R2_PIN, { 0, key_released, false }}, |
Clemo | 0:cb80470434eb | 101 | #endif |
Clemo | 0:cb80470434eb | 102 | |
Clemo | 0:cb80470434eb | 103 | // FYI: S9 is ISP, S10 is reset button. |
Clemo | 0:cb80470434eb | 104 | |
Clemo | 0:cb80470434eb | 105 | #ifdef BOARD_KEYBOARD_S22 /* S11 */ |
Clemo | 0:cb80470434eb | 106 | { BOARD_KEYBOARD_C2_PORT, BOARD_KEYBOARD_C2_PIN, BOARD_KEYBOARD_R2_PORT, BOARD_KEYBOARD_R2_PIN, { 0, key_released, false }}, |
Clemo | 0:cb80470434eb | 107 | #endif |
Clemo | 0:cb80470434eb | 108 | }; |
Clemo | 0:cb80470434eb | 109 | |
Clemo | 0:cb80470434eb | 110 | |
Clemo | 0:cb80470434eb | 111 | // Since all data is zero, a memset would have been quicker to type. |
Clemo | 0:cb80470434eb | 112 | keyboard_rotary_encoder_data_t g_encoder_data[] = |
Clemo | 0:cb80470434eb | 113 | { |
Clemo | 0:cb80470434eb | 114 | #ifdef BOARD_KEYBOARD_RE0 /* S1 */ |
Clemo | 0:cb80470434eb | 115 | { |
Clemo | 0:cb80470434eb | 116 | 0, 0, 0, 0, 0 |
Clemo | 0:cb80470434eb | 117 | }, |
Clemo | 0:cb80470434eb | 118 | #endif |
Clemo | 0:cb80470434eb | 119 | |
Clemo | 0:cb80470434eb | 120 | #ifdef BOARD_KEYBOARD_RE1 /* S2 */ |
Clemo | 0:cb80470434eb | 121 | { |
Clemo | 0:cb80470434eb | 122 | 0, 0, 0, 0, 0 |
Clemo | 0:cb80470434eb | 123 | }, |
Clemo | 0:cb80470434eb | 124 | #endif |
Clemo | 0:cb80470434eb | 125 | |
Clemo | 0:cb80470434eb | 126 | #ifdef BOARD_KEYBOARD_RE2 /* S3 */ |
Clemo | 0:cb80470434eb | 127 | { |
Clemo | 0:cb80470434eb | 128 | 0, 0, 0, 0, 0 |
Clemo | 0:cb80470434eb | 129 | }, |
Clemo | 0:cb80470434eb | 130 | #endif |
Clemo | 0:cb80470434eb | 131 | |
Clemo | 0:cb80470434eb | 132 | #ifdef BOARD_KEYBOARD_RE3 /* S4 */ |
Clemo | 0:cb80470434eb | 133 | { |
Clemo | 0:cb80470434eb | 134 | 0, 0, 0, 0, 0 |
Clemo | 0:cb80470434eb | 135 | }, |
Clemo | 0:cb80470434eb | 136 | #endif |
Clemo | 0:cb80470434eb | 137 | |
Clemo | 0:cb80470434eb | 138 | #ifdef BOARD_KEYBOARD_RE4 /* S5 */ |
Clemo | 0:cb80470434eb | 139 | { |
Clemo | 0:cb80470434eb | 140 | 0, 0, 0, 0, 0 |
Clemo | 0:cb80470434eb | 141 | }, |
Clemo | 0:cb80470434eb | 142 | #endif |
Clemo | 0:cb80470434eb | 143 | |
Clemo | 0:cb80470434eb | 144 | #ifdef BOARD_KEYBOARD_RE5 /* S6 */ |
Clemo | 0:cb80470434eb | 145 | { |
Clemo | 0:cb80470434eb | 146 | 0, 0, 0, 0, 0 |
Clemo | 0:cb80470434eb | 147 | }, |
Clemo | 0:cb80470434eb | 148 | #endif |
Clemo | 0:cb80470434eb | 149 | |
Clemo | 0:cb80470434eb | 150 | #ifdef BOARD_KEYBOARD_RE6 /* S7 */ |
Clemo | 0:cb80470434eb | 151 | { |
Clemo | 0:cb80470434eb | 152 | 0, 0, 0, 0, 0 |
Clemo | 0:cb80470434eb | 153 | }, |
Clemo | 0:cb80470434eb | 154 | #endif |
Clemo | 0:cb80470434eb | 155 | |
Clemo | 0:cb80470434eb | 156 | #ifdef BOARD_KEYBOARD_RE7 /* S8 */ |
Clemo | 0:cb80470434eb | 157 | { |
Clemo | 0:cb80470434eb | 158 | 0, 0, 0, 0, 0 |
Clemo | 0:cb80470434eb | 159 | }, |
Clemo | 0:cb80470434eb | 160 | #endif |
Clemo | 0:cb80470434eb | 161 | }; |
Clemo | 0:cb80470434eb | 162 | |
Clemo | 0:cb80470434eb | 163 | |
Clemo | 0:cb80470434eb | 164 | #define MATRIX_KEY_COUNT (sizeof(g_matrix_key)/sizeof(g_matrix_key[0])) |
Clemo | 0:cb80470434eb | 165 | #define ENCODER_PIN_COUNT (sizeof(g_encoder)/sizeof(g_encoder[0])) |
Clemo | 0:cb80470434eb | 166 | #define ENCODER_COUNT (sizeof(g_encoder_data)/sizeof(g_encoder_data[0])) |
Clemo | 0:cb80470434eb | 167 | #define KEYS_OTHER_COUNT (sizeof(g_key)/sizeof(g_key[0])) |
Clemo | 0:cb80470434eb | 168 | |
Clemo | 0:cb80470434eb | 169 | /* |
Clemo | 0:cb80470434eb | 170 | DigitalIn encoder1_a(PTA0); // phase A |
Clemo | 0:cb80470434eb | 171 | DigitalIn encoder1_b(PTE27); // phase B |
Clemo | 0:cb80470434eb | 172 | DigitalIn encoder1_k(PTD2); // integrated pushbutton |
Clemo | 0:cb80470434eb | 173 | |
Clemo | 0:cb80470434eb | 174 | DigitalIn encoder2_a(PTC4); // phase A |
Clemo | 0:cb80470434eb | 175 | DigitalIn encoder2_b(PTE25); // phase B |
Clemo | 0:cb80470434eb | 176 | DigitalIn encoder2_k(PTD0); // integrated pushbutton |
Clemo | 0:cb80470434eb | 177 | |
Clemo | 0:cb80470434eb | 178 | AnalogIn pot2(A5); |
Clemo | 0:cb80470434eb | 179 | AnalogIn pot3(A4); |
Clemo | 0:cb80470434eb | 180 | AnalogIn pot4(A3); |
Clemo | 0:cb80470434eb | 181 | AnalogIn pot5(A2); |
Clemo | 0:cb80470434eb | 182 | AnalogIn pot6(A1); |
Clemo | 0:cb80470434eb | 183 | AnalogIn pot7(A0); |
Clemo | 0:cb80470434eb | 184 | */ |
Clemo | 0:cb80470434eb | 185 | void keyboard_init(void) |
Clemo | 0:cb80470434eb | 186 | { |
Clemo | 0:cb80470434eb | 187 | int i; |
Clemo | 0:cb80470434eb | 188 | |
Clemo | 0:cb80470434eb | 189 | //encoder1_a.mode(PullUp); |
Clemo | 0:cb80470434eb | 190 | //encoder1_b.mode(PullUp); |
Clemo | 0:cb80470434eb | 191 | //encoder1_k.mode(PullUp); |
Clemo | 0:cb80470434eb | 192 | //encoder2_a.mode(PullUp); |
Clemo | 0:cb80470434eb | 193 | //encoder2_b.mode(PullUp); |
Clemo | 0:cb80470434eb | 194 | //encoder2_k.mode(PullUp); |
Clemo | 0:cb80470434eb | 195 | |
Clemo | 0:cb80470434eb | 196 | keyboard_matrix_key_t *p_matrix_key; |
Clemo | 0:cb80470434eb | 197 | keyboard_key_t *p_encoder; |
Clemo | 0:cb80470434eb | 198 | keyboard_key_t *p_keys_other; |
Clemo | 0:cb80470434eb | 199 | |
Clemo | 0:cb80470434eb | 200 | // Initialize key matrix. |
Clemo | 0:cb80470434eb | 201 | p_matrix_key = g_matrix_key; |
Clemo | 0:cb80470434eb | 202 | for (i=0; i<MATRIX_KEY_COUNT; i++) |
Clemo | 0:cb80470434eb | 203 | { |
Clemo | 0:cb80470434eb | 204 | // Function bit 7 is either reserved 1 (IOCON_RESERVED_BIT_7) or "Digital functional mode" (IOCON_DIGMODE_EN), |
Clemo | 0:cb80470434eb | 205 | // meaning that it has to be set in all cases. |
Clemo | 0:cb80470434eb | 206 | // Pull-ups needed on row pins. All inputs are inverted to read as 1 on contact closed. |
Clemo | 0:cb80470434eb | 207 | //Chip_IOCON_PinMuxSet(LPC_IOCON,p_matrix_key->row_port,p_matrix_key->row_pin,IOCON_MODE_PULLUP|IOCON_DIGMODE_EN|IOCON_INV_EN); |
Clemo | 0:cb80470434eb | 208 | //Chip_GPIO_WriteDirBit(LPC_GPIO_PORT,p_matrix_key->col_port,p_matrix_key->col_pin,OUTPUT); |
Clemo | 0:cb80470434eb | 209 | //Chip_GPIO_WriteDirBit(LPC_GPIO_PORT,p_matrix_key->row_port,p_matrix_key->row_pin,INPUT); |
Clemo | 0:cb80470434eb | 210 | p_matrix_key->data.debounce = 0; |
Clemo | 0:cb80470434eb | 211 | p_matrix_key->data.value = key_released; |
Clemo | 0:cb80470434eb | 212 | p_matrix_key->data.changed = false; |
Clemo | 0:cb80470434eb | 213 | p_matrix_key++; |
Clemo | 0:cb80470434eb | 214 | } |
Clemo | 0:cb80470434eb | 215 | |
Clemo | 0:cb80470434eb | 216 | // Initialize rotary encoders. |
Clemo | 0:cb80470434eb | 217 | p_encoder = g_encoder; |
Clemo | 0:cb80470434eb | 218 | // A rotary encoder has two pins which is why we use ENCODER_PIN_COUNT. |
Clemo | 0:cb80470434eb | 219 | for (i=0; i<ENCODER_PIN_COUNT; i++) |
Clemo | 0:cb80470434eb | 220 | { |
Clemo | 0:cb80470434eb | 221 | //Chip_IOCON_PinMuxSet(LPC_IOCON,p_encoder->port,p_encoder->pin,p_encoder->function); |
Clemo | 0:cb80470434eb | 222 | //Chip_GPIO_WriteDirBit(LPC_GPIO_PORT,p_encoder->port,p_encoder->pin,INPUT); |
Clemo | 0:cb80470434eb | 223 | p_encoder->data.debounce = 0; |
Clemo | 0:cb80470434eb | 224 | p_encoder->data.value = key_released; |
Clemo | 0:cb80470434eb | 225 | p_encoder++; |
Clemo | 0:cb80470434eb | 226 | } |
Clemo | 0:cb80470434eb | 227 | |
Clemo | 0:cb80470434eb | 228 | // Initialize remaining keys like S9 & S10. |
Clemo | 0:cb80470434eb | 229 | p_keys_other = g_key; |
Clemo | 0:cb80470434eb | 230 | for (i=0; i<KEYS_OTHER_COUNT; i++) |
Clemo | 0:cb80470434eb | 231 | { |
Clemo | 0:cb80470434eb | 232 | //Chip_IOCON_PinMuxSet(LPC_IOCON,p_keys_other->port,p_keys_other->pin,p_keys_other->function); |
Clemo | 0:cb80470434eb | 233 | //Chip_GPIO_WriteDirBit(LPC_GPIO_PORT,p_keys_other->port,p_keys_other->pin,INPUT); |
Clemo | 0:cb80470434eb | 234 | p_keys_other->data.debounce = 0; |
Clemo | 0:cb80470434eb | 235 | p_keys_other->data.value = key_released; |
Clemo | 0:cb80470434eb | 236 | p_keys_other++; |
Clemo | 0:cb80470434eb | 237 | } |
Clemo | 0:cb80470434eb | 238 | } |
Clemo | 0:cb80470434eb | 239 | |
Clemo | 0:cb80470434eb | 240 | |
Clemo | 0:cb80470434eb | 241 | int8_t keyboard_key_is_debounced(int8_t debounce) |
Clemo | 0:cb80470434eb | 242 | { |
Clemo | 0:cb80470434eb | 243 | int8_t result = 0; |
Clemo | 0:cb80470434eb | 244 | if (debounce>=KEY_DEBOUNCE_MAX) |
Clemo | 0:cb80470434eb | 245 | { |
Clemo | 0:cb80470434eb | 246 | // Key debounced high. |
Clemo | 0:cb80470434eb | 247 | result = 1; |
Clemo | 0:cb80470434eb | 248 | } |
Clemo | 0:cb80470434eb | 249 | else if (debounce<=KEY_DEBOUNCE_MIN) |
Clemo | 0:cb80470434eb | 250 | { |
Clemo | 0:cb80470434eb | 251 | // Key debounced low. |
Clemo | 0:cb80470434eb | 252 | result = -1; |
Clemo | 0:cb80470434eb | 253 | } |
Clemo | 0:cb80470434eb | 254 | return result; |
Clemo | 0:cb80470434eb | 255 | } |
Clemo | 0:cb80470434eb | 256 | |
Clemo | 0:cb80470434eb | 257 | |
Clemo | 0:cb80470434eb | 258 | uint8_t keyboard_matrix_key_read(keyboard_matrix_key_t *p_key) |
Clemo | 0:cb80470434eb | 259 | { |
Clemo | 0:cb80470434eb | 260 | uint8_t value = 0; |
Clemo | 0:cb80470434eb | 261 | |
Clemo | 0:cb80470434eb | 262 | // Scan a key. Pressed keys read as high (inverted input). |
Clemo | 0:cb80470434eb | 263 | // Chip_GPIO_WritePortBit(LPC_GPIO_PORT,p_key->col_port,p_key->col_pin,0); |
Clemo | 0:cb80470434eb | 264 | // value = Chip_GPIO_ReadPortBit(LPC_GPIO_PORT,p_key->row_port,p_key->row_pin); |
Clemo | 0:cb80470434eb | 265 | // Chip_GPIO_WritePortBit(LPC_GPIO_PORT,p_key->col_port,p_key->col_pin,1); |
Clemo | 0:cb80470434eb | 266 | return value; |
Clemo | 0:cb80470434eb | 267 | } |
Clemo | 0:cb80470434eb | 268 | |
Clemo | 0:cb80470434eb | 269 | |
Clemo | 0:cb80470434eb | 270 | inline uint8_t keyboard_key_read(keyboard_key_t *p_key) |
Clemo | 0:cb80470434eb | 271 | { |
Clemo | 0:cb80470434eb | 272 | // Pressed keys read as high (inverted input). |
Clemo | 0:cb80470434eb | 273 | //return Chip_GPIO_ReadPortBit(LPC_GPIO_PORT,p_key->port,p_key->pin); |
Clemo | 0:cb80470434eb | 274 | return 0; |
Clemo | 0:cb80470434eb | 275 | } |
Clemo | 0:cb80470434eb | 276 | |
Clemo | 0:cb80470434eb | 277 | |
Clemo | 0:cb80470434eb | 278 | uint8_t keyboard_key_debounce(int8_t *p_debounce, uint8_t state) |
Clemo | 0:cb80470434eb | 279 | { |
Clemo | 0:cb80470434eb | 280 | uint8_t result = 0; |
Clemo | 0:cb80470434eb | 281 | |
Clemo | 0:cb80470434eb | 282 | // Debounce. |
Clemo | 0:cb80470434eb | 283 | if (state!=0) |
Clemo | 0:cb80470434eb | 284 | { |
Clemo | 0:cb80470434eb | 285 | if ((*p_debounce)<KEY_DEBOUNCE_MAX) (*p_debounce)++; |
Clemo | 0:cb80470434eb | 286 | if ((*p_debounce)>=KEY_DEBOUNCE_MAX) result = 1; |
Clemo | 0:cb80470434eb | 287 | } |
Clemo | 0:cb80470434eb | 288 | else |
Clemo | 0:cb80470434eb | 289 | { |
Clemo | 0:cb80470434eb | 290 | if ((*p_debounce)>KEY_DEBOUNCE_MIN) (*p_debounce)--; |
Clemo | 0:cb80470434eb | 291 | if ((*p_debounce)<=KEY_DEBOUNCE_MIN) result = 1; |
Clemo | 0:cb80470434eb | 292 | } |
Clemo | 0:cb80470434eb | 293 | |
Clemo | 0:cb80470434eb | 294 | return result; |
Clemo | 0:cb80470434eb | 295 | } |
Clemo | 0:cb80470434eb | 296 | |
Clemo | 0:cb80470434eb | 297 | |
Clemo | 0:cb80470434eb | 298 | uint32_t keyboard_scan_matrix(void) |
Clemo | 0:cb80470434eb | 299 | { |
Clemo | 0:cb80470434eb | 300 | int i; |
Clemo | 0:cb80470434eb | 301 | uint8_t state; |
Clemo | 0:cb80470434eb | 302 | |
Clemo | 0:cb80470434eb | 303 | // Scan key matrix. |
Clemo | 0:cb80470434eb | 304 | for (i=0; i<MATRIX_KEY_COUNT; i++) |
Clemo | 0:cb80470434eb | 305 | { |
Clemo | 0:cb80470434eb | 306 | state = keyboard_matrix_key_read(&g_matrix_key[i]); |
Clemo | 0:cb80470434eb | 307 | if (keyboard_key_debounce(&g_matrix_key[i].data.debounce,state)!=0) |
Clemo | 0:cb80470434eb | 308 | { |
Clemo | 0:cb80470434eb | 309 | // Update pushbutton value. |
Clemo | 0:cb80470434eb | 310 | if (g_matrix_key[i].data.debounce>=KEY_DEBOUNCE_MAX) |
Clemo | 0:cb80470434eb | 311 | { |
Clemo | 0:cb80470434eb | 312 | if (g_matrix_key[i].data.value!=key_pressed) |
Clemo | 0:cb80470434eb | 313 | { |
Clemo | 0:cb80470434eb | 314 | g_matrix_key[i].data.changed = true; |
Clemo | 0:cb80470434eb | 315 | } |
Clemo | 0:cb80470434eb | 316 | g_matrix_key[i].data.value = key_pressed; |
Clemo | 0:cb80470434eb | 317 | } |
Clemo | 0:cb80470434eb | 318 | else |
Clemo | 0:cb80470434eb | 319 | { |
Clemo | 0:cb80470434eb | 320 | if (g_matrix_key[i].data.value!=key_released) |
Clemo | 0:cb80470434eb | 321 | { |
Clemo | 0:cb80470434eb | 322 | g_matrix_key[i].data.changed = true; |
Clemo | 0:cb80470434eb | 323 | } |
Clemo | 0:cb80470434eb | 324 | g_matrix_key[i].data.value = key_released; |
Clemo | 0:cb80470434eb | 325 | } |
Clemo | 0:cb80470434eb | 326 | } |
Clemo | 0:cb80470434eb | 327 | } |
Clemo | 0:cb80470434eb | 328 | |
Clemo | 0:cb80470434eb | 329 | // Scan other keys (S9, S10) too. |
Clemo | 0:cb80470434eb | 330 | for (i=0; i<KEYS_OTHER_COUNT; i++) |
Clemo | 0:cb80470434eb | 331 | { |
Clemo | 0:cb80470434eb | 332 | state = keyboard_key_read(&g_key[i]); |
Clemo | 0:cb80470434eb | 333 | if (keyboard_key_debounce(&g_key[i].data.debounce,state)!=0) |
Clemo | 0:cb80470434eb | 334 | { |
Clemo | 0:cb80470434eb | 335 | // Update pushbutton value. |
Clemo | 0:cb80470434eb | 336 | if (g_key[i].data.debounce>=KEY_DEBOUNCE_MAX) |
Clemo | 0:cb80470434eb | 337 | { |
Clemo | 0:cb80470434eb | 338 | if (g_key[i].data.value!=key_pressed) |
Clemo | 0:cb80470434eb | 339 | { |
Clemo | 0:cb80470434eb | 340 | g_key[i].data.changed = true; |
Clemo | 0:cb80470434eb | 341 | } |
Clemo | 0:cb80470434eb | 342 | g_key[i].data.value = key_pressed; |
Clemo | 0:cb80470434eb | 343 | } |
Clemo | 0:cb80470434eb | 344 | else |
Clemo | 0:cb80470434eb | 345 | { |
Clemo | 0:cb80470434eb | 346 | if (g_key[i].data.value!=key_released) |
Clemo | 0:cb80470434eb | 347 | { |
Clemo | 0:cb80470434eb | 348 | g_key[i].data.changed = true; |
Clemo | 0:cb80470434eb | 349 | } |
Clemo | 0:cb80470434eb | 350 | g_key[i].data.value = key_released; |
Clemo | 0:cb80470434eb | 351 | } |
Clemo | 0:cb80470434eb | 352 | } |
Clemo | 0:cb80470434eb | 353 | } |
Clemo | 0:cb80470434eb | 354 | |
Clemo | 0:cb80470434eb | 355 | return 0; |
Clemo | 0:cb80470434eb | 356 | } |
Clemo | 0:cb80470434eb | 357 | |
Clemo | 0:cb80470434eb | 358 | |
Clemo | 0:cb80470434eb | 359 | uint32_t keyboard_scan_encoders(void) |
Clemo | 0:cb80470434eb | 360 | { |
Clemo | 0:cb80470434eb | 361 | int i, j, inc; |
Clemo | 0:cb80470434eb | 362 | int8_t state_new; |
Clemo | 0:cb80470434eb | 363 | uint8_t a, b; |
Clemo | 0:cb80470434eb | 364 | |
Clemo | 0:cb80470434eb | 365 | j = 0; |
Clemo | 0:cb80470434eb | 366 | for (i=0; i<ENCODER_COUNT; i++) |
Clemo | 0:cb80470434eb | 367 | { |
Clemo | 0:cb80470434eb | 368 | a = keyboard_key_read(&g_encoder[j]); |
Clemo | 0:cb80470434eb | 369 | j += 1; |
Clemo | 0:cb80470434eb | 370 | b = keyboard_key_read(&g_encoder[j]); |
Clemo | 0:cb80470434eb | 371 | j += 1; |
Clemo | 0:cb80470434eb | 372 | state_new = (a<<1) | b; |
Clemo | 0:cb80470434eb | 373 | if (state_new!=g_encoder_data[i].state) |
Clemo | 0:cb80470434eb | 374 | { |
Clemo | 0:cb80470434eb | 375 | inc = a ^ (g_encoder_data[i].state&0x01); |
Clemo | 0:cb80470434eb | 376 | if (inc==0) inc = -1; |
Clemo | 0:cb80470434eb | 377 | g_encoder_data[i].state = state_new; |
Clemo | 0:cb80470434eb | 378 | |
Clemo | 0:cb80470434eb | 379 | g_encoder_data[i].state_sub += inc; |
Clemo | 0:cb80470434eb | 380 | if ((g_encoder_data[i].state_sub<=-4) || (g_encoder_data[i].state_sub>=4)) |
Clemo | 0:cb80470434eb | 381 | { |
Clemo | 0:cb80470434eb | 382 | g_encoder_data[i].state_sub = 0; |
Clemo | 0:cb80470434eb | 383 | g_encoder_data[i].value -= inc; |
Clemo | 0:cb80470434eb | 384 | keyboard_encoder_speed(&g_encoder_data[i]); |
Clemo | 0:cb80470434eb | 385 | } |
Clemo | 0:cb80470434eb | 386 | } |
Clemo | 0:cb80470434eb | 387 | } |
Clemo | 0:cb80470434eb | 388 | |
Clemo | 0:cb80470434eb | 389 | return 0; |
Clemo | 0:cb80470434eb | 390 | } |
Clemo | 0:cb80470434eb | 391 | |
Clemo | 0:cb80470434eb | 392 | |
Clemo | 0:cb80470434eb | 393 | void keyboard_encoder_speed(keyboard_rotary_encoder_data_t *p_encoder_data) |
Clemo | 0:cb80470434eb | 394 | { |
Clemo | 0:cb80470434eb | 395 | uint32_t timestamp = systick_counter; |
Clemo | 0:cb80470434eb | 396 | uint32_t delta = timestamp - p_encoder_data->timestamp; |
Clemo | 0:cb80470434eb | 397 | //delta = 0x1ffff >> delta; |
Clemo | 0:cb80470434eb | 398 | if (delta<KEY_PERIOD_MIN) delta = KEY_PERIOD_MIN; |
Clemo | 0:cb80470434eb | 399 | else if (delta>KEY_PERIOD_MAX) delta = KEY_PERIOD_MAX; |
Clemo | 0:cb80470434eb | 400 | p_encoder_data->accelerator = (uint8_t)(KEY_PERIOD_MAX/delta); |
Clemo | 0:cb80470434eb | 401 | if (p_encoder_data->accelerator==0) p_encoder_data->accelerator = 1; |
Clemo | 0:cb80470434eb | 402 | p_encoder_data->timestamp = timestamp; |
Clemo | 0:cb80470434eb | 403 | } |
Clemo | 0:cb80470434eb | 404 | |
Clemo | 0:cb80470434eb | 405 | |
Clemo | 0:cb80470434eb | 406 | bool keyboard_get_pushbutton_changed(uint8_t key_nr) |
Clemo | 0:cb80470434eb | 407 | { |
Clemo | 0:cb80470434eb | 408 | if (key_nr>=BOARD_KEYBOARD_ISP) |
Clemo | 0:cb80470434eb | 409 | { |
Clemo | 0:cb80470434eb | 410 | // "Other" pushbuttons start at S9. |
Clemo | 0:cb80470434eb | 411 | return g_key[key_nr-BOARD_KEYBOARD_ISP].data.changed; |
Clemo | 0:cb80470434eb | 412 | } |
Clemo | 0:cb80470434eb | 413 | else |
Clemo | 0:cb80470434eb | 414 | { |
Clemo | 0:cb80470434eb | 415 | return g_matrix_key[key_nr].data.changed; |
Clemo | 0:cb80470434eb | 416 | } |
Clemo | 0:cb80470434eb | 417 | } |
Clemo | 0:cb80470434eb | 418 | |
Clemo | 0:cb80470434eb | 419 | |
Clemo | 0:cb80470434eb | 420 | keyboard_key_press_t keyboard_get_pushbutton(uint8_t key_nr, bool use) |
Clemo | 0:cb80470434eb | 421 | { |
Clemo | 0:cb80470434eb | 422 | if (key_nr>=BOARD_KEYBOARD_ISP) |
Clemo | 0:cb80470434eb | 423 | { |
Clemo | 0:cb80470434eb | 424 | // "Other" pushbuttons start at S9. |
Clemo | 0:cb80470434eb | 425 | if (use==true) g_key[key_nr-BOARD_KEYBOARD_ISP].data.changed = false; |
Clemo | 0:cb80470434eb | 426 | return g_key[key_nr-BOARD_KEYBOARD_ISP].data.value; |
Clemo | 0:cb80470434eb | 427 | } |
Clemo | 0:cb80470434eb | 428 | else |
Clemo | 0:cb80470434eb | 429 | { |
Clemo | 0:cb80470434eb | 430 | if (use==true) g_matrix_key[key_nr].data.changed = false; |
Clemo | 0:cb80470434eb | 431 | return g_matrix_key[key_nr].data.value; |
Clemo | 0:cb80470434eb | 432 | } |
Clemo | 0:cb80470434eb | 433 | } |
Clemo | 0:cb80470434eb | 434 | |
Clemo | 0:cb80470434eb | 435 | |
Clemo | 0:cb80470434eb | 436 | void keyboard_set_pushbutton(uint8_t key_nr, keyboard_key_press_t value) |
Clemo | 0:cb80470434eb | 437 | { |
Clemo | 0:cb80470434eb | 438 | if (key_nr>=BOARD_KEYBOARD_ISP) |
Clemo | 0:cb80470434eb | 439 | { |
Clemo | 0:cb80470434eb | 440 | // "Other" pushbuttons start at S9. |
Clemo | 0:cb80470434eb | 441 | g_key[key_nr-BOARD_KEYBOARD_ISP].data.value = value; |
Clemo | 0:cb80470434eb | 442 | g_key[key_nr-BOARD_KEYBOARD_ISP].data.changed = false; |
Clemo | 0:cb80470434eb | 443 | } |
Clemo | 0:cb80470434eb | 444 | else |
Clemo | 0:cb80470434eb | 445 | { |
Clemo | 0:cb80470434eb | 446 | g_matrix_key[key_nr].data.value = value; |
Clemo | 0:cb80470434eb | 447 | g_matrix_key[key_nr].data.changed = false; |
Clemo | 0:cb80470434eb | 448 | } |
Clemo | 0:cb80470434eb | 449 | } |
Clemo | 0:cb80470434eb | 450 | |
Clemo | 0:cb80470434eb | 451 | |
Clemo | 0:cb80470434eb | 452 | int8_t keyboard_get_rotary_encoder_value(uint8_t encoder_nr) |
Clemo | 0:cb80470434eb | 453 | { |
Clemo | 0:cb80470434eb | 454 | return g_encoder_data[encoder_nr].value; |
Clemo | 0:cb80470434eb | 455 | } |
Clemo | 0:cb80470434eb | 456 | |
Clemo | 0:cb80470434eb | 457 | |
Clemo | 0:cb80470434eb | 458 | void keyboard_set_rotary_encoder_value(uint8_t encoder_nr, int8_t value) |
Clemo | 0:cb80470434eb | 459 | { |
Clemo | 0:cb80470434eb | 460 | g_encoder_data[encoder_nr].value = value; |
Clemo | 0:cb80470434eb | 461 | } |
Clemo | 0:cb80470434eb | 462 | |
Clemo | 0:cb80470434eb | 463 | |
Clemo | 0:cb80470434eb | 464 | uint8_t keyboard_get_rotary_encoder_accelerator(uint8_t encoder_nr) |
Clemo | 0:cb80470434eb | 465 | { |
Clemo | 0:cb80470434eb | 466 | return g_encoder_data[encoder_nr].accelerator; |
Clemo | 0:cb80470434eb | 467 | } |
Clemo | 0:cb80470434eb | 468 |