This is a part of the Kinetiszer project.

Dependencies:   inc

Dependents:   kinetisizer

Committer:
Clemo
Date:
Tue Oct 28 20:09:12 2014 +0000
Revision:
1:8ae4ab73ca6a
Parent:
0:cb80470434eb
First publication (untested)

Who changed what in which revision?

UserRevisionLine numberNew 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