diff options
| author | tmk <nobody@nowhere> | 2013-01-09 22:33:33 +0900 |
|---|---|---|
| committer | tmk <nobody@nowhere> | 2013-01-09 22:33:33 +0900 |
| commit | 411de9cc22e927313a5a768f3bf41f2f99bca126 (patch) | |
| tree | cff699c11ec293df8375566e7a3d186712e72e74 | |
| parent | 4324e163360db4c6ebd25cab74d09d42b3021278 (diff) | |
| download | qmk_firmware-411de9cc22e927313a5a768f3bf41f2f99bca126.tar.gz qmk_firmware-411de9cc22e927313a5a768f3bf41f2f99bca126.zip | |
Add new layer actions.
| -rw-r--r-- | common/action.c | 394 | ||||
| -rw-r--r-- | common/action.h | 152 | ||||
| -rw-r--r-- | common/keyboard.c | 5 | ||||
| -rw-r--r-- | common/keyboard.h | 8 | ||||
| -rw-r--r-- | common/keymap.h | 1 | ||||
| -rw-r--r-- | keyboard/hhkb/keymap.c | 78 |
6 files changed, 323 insertions, 315 deletions
diff --git a/common/action.c b/common/action.c index 45e2276e7..425a2b00f 100644 --- a/common/action.c +++ b/common/action.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | #include "host.h" | 1 | #include "host.h" |
| 2 | #include "timer.h" | 2 | #include "timer.h" |
| 3 | //#include "keymap.h" | 3 | #include "keymap.h" |
| 4 | #include "keycode.h" | 4 | #include "keycode.h" |
| 5 | #include "keyboard.h" | 5 | #include "keyboard.h" |
| 6 | #include "mousekey.h" | 6 | #include "mousekey.h" |
| @@ -78,8 +78,6 @@ typedef enum { IDLE, DELAYING, WAITING, PRESSING } kbdstate_t; | |||
| 78 | 78 | ||
| 79 | static kbdstate_t kbdstate = IDLE; | 79 | static kbdstate_t kbdstate = IDLE; |
| 80 | static uint8_t fn_state_bits = 0; | 80 | static uint8_t fn_state_bits = 0; |
| 81 | static keyrecord_t delayed_fn = {}; | ||
| 82 | static keyrecord_t waiting_key = {}; | ||
| 83 | 81 | ||
| 84 | static const char *state_str(kbdstate_t state) | 82 | static const char *state_str(kbdstate_t state) |
| 85 | { | 83 | { |
| @@ -96,17 +94,6 @@ static bool anykey_sent_to_host(void) | |||
| 96 | } | 94 | } |
| 97 | 95 | ||
| 98 | 96 | ||
| 99 | |||
| 100 | /* | ||
| 101 | static void layer_switch_on(uint8_t code); | ||
| 102 | static void layer_switch_off(uint8_t code); | ||
| 103 | static void key_action(uint8_t code, keyevent_t event); | ||
| 104 | static void key_pressed(uint8_t code, keyevent_t event); | ||
| 105 | static void key_released(uint8_t code, keyevent_t event); | ||
| 106 | static void mod_pressed(uint8_t code, keyevent_t event); | ||
| 107 | static void mod_released(uint8_t code, keyevent_t event); | ||
| 108 | */ | ||
| 109 | |||
| 110 | static void register_code(uint8_t code); | 97 | static void register_code(uint8_t code); |
| 111 | static void unregister_code(uint8_t code); | 98 | static void unregister_code(uint8_t code); |
| 112 | static void register_mods(uint8_t mods); | 99 | static void register_mods(uint8_t mods); |
| @@ -118,6 +105,7 @@ static void layer_switch(uint8_t new_layer); | |||
| 118 | 105 | ||
| 119 | /* tap */ | 106 | /* tap */ |
| 120 | #define TAP_TIME 200 | 107 | #define TAP_TIME 200 |
| 108 | #define LAYER_DELAY 200 | ||
| 121 | static keyevent_t last_event = {}; | 109 | static keyevent_t last_event = {}; |
| 122 | static uint16_t last_event_time = 0; | 110 | static uint16_t last_event_time = 0; |
| 123 | static uint8_t tap_count = 0; | 111 | static uint8_t tap_count = 0; |
| @@ -125,10 +113,10 @@ static uint8_t tap_count = 0; | |||
| 125 | /* layer */ | 113 | /* layer */ |
| 126 | uint8_t default_layer = 0; | 114 | uint8_t default_layer = 0; |
| 127 | uint8_t current_layer = 0; | 115 | uint8_t current_layer = 0; |
| 128 | uint8_t waiting_layer = 0; | 116 | keyrecord_t delaying_layer = {}; |
| 129 | 117 | ||
| 130 | 118 | ||
| 131 | void action_exec(action_t action, keyevent_t event) | 119 | void action_exec(keyevent_t event) |
| 132 | { | 120 | { |
| 133 | /* count tap when key is up */ | 121 | /* count tap when key is up */ |
| 134 | if (KEYEQ(event.key, last_event.key) && timer_elapsed(last_event_time) < TAP_TIME) { | 122 | if (KEYEQ(event.key, last_event.key) && timer_elapsed(last_event_time) < TAP_TIME) { |
| @@ -137,6 +125,20 @@ void action_exec(action_t action, keyevent_t event) | |||
| 137 | tap_count = 0; | 125 | tap_count = 0; |
| 138 | } | 126 | } |
| 139 | 127 | ||
| 128 | /* layer switch after LAYER_DELAY */ | ||
| 129 | if (delaying_layer.action.code && timer_elapsed(delaying_layer.event.time) > LAYER_DELAY) { | ||
| 130 | switch (delaying_layer.action.kind.id) { | ||
| 131 | case ACT_LAYER_PRESSED: | ||
| 132 | layer_switch(delaying_layer.action.layer.opt); | ||
| 133 | break; | ||
| 134 | case ACT_LAYER_BIT: | ||
| 135 | layer_switch(current_layer | delaying_layer.action.layer.opt); | ||
| 136 | break; | ||
| 137 | } | ||
| 138 | delaying_layer = (keyrecord_t){}; | ||
| 139 | } | ||
| 140 | action_t action = keymap_get_action(current_layer, event.key.row, event.key.col); | ||
| 141 | |||
| 140 | debug("action: "); debug_hex16(action.code); debug("\n"); | 142 | debug("action: "); debug_hex16(action.code); debug("\n"); |
| 141 | debug("kind.id: "); debug_hex(action.kind.id); debug("\n"); | 143 | debug("kind.id: "); debug_hex(action.kind.id); debug("\n"); |
| 142 | debug("kind.param: "); debug_hex16(action.kind.param); debug("\n"); | 144 | debug("kind.param: "); debug_hex16(action.kind.param); debug("\n"); |
| @@ -145,6 +147,7 @@ void action_exec(action_t action, keyevent_t event) | |||
| 145 | 147 | ||
| 146 | switch (action.kind.id) { | 148 | switch (action.kind.id) { |
| 147 | case ACT_LMODS: | 149 | case ACT_LMODS: |
| 150 | // normal key or key plus mods | ||
| 148 | if (event.pressed) { | 151 | if (event.pressed) { |
| 149 | register_mods(action.key.mods); | 152 | register_mods(action.key.mods); |
| 150 | register_code(action.key.code); | 153 | register_code(action.key.code); |
| @@ -162,94 +165,207 @@ void action_exec(action_t action, keyevent_t event) | |||
| 162 | unregister_mods(action.key.mods<<4); | 165 | unregister_mods(action.key.mods<<4); |
| 163 | } | 166 | } |
| 164 | break; | 167 | break; |
| 165 | case ACT_LAYER: | 168 | case ACT_LMOD_TAP: |
| 166 | switch (action.layer_key.code) { | 169 | break; |
| 167 | case 0x00: // Momentary switch | 170 | case ACT_RMOD_TAP: |
| 168 | // TODO: history of layer switch | 171 | break; |
| 172 | case ACT_USAGE: | ||
| 173 | #ifdef EXTRAKEY_ENABLE | ||
| 174 | switch (action.usage.page) { | ||
| 175 | case ACTION_USAGE_PAGE_SYSTEM: | ||
| 169 | if (event.pressed) { | 176 | if (event.pressed) { |
| 170 | layer_switch(action.layer_key.layer); | 177 | host_system_send(action.usage.code); |
| 171 | } else { | 178 | } else { |
| 172 | layer_switch(default_layer); | 179 | host_system_send(0); |
| 173 | } | 180 | } |
| 174 | break; | 181 | break; |
| 175 | case 0x01: // Oneshot switch | 182 | case ACTION_USAGE_PAGE_CONSUMER: |
| 176 | // TODO: | 183 | if (event.pressed) { |
| 184 | host_consumer_send(action.usage.code); | ||
| 185 | } else { | ||
| 186 | host_consumer_send(0); | ||
| 187 | } | ||
| 177 | break; | 188 | break; |
| 178 | case 0x02: // reserved | 189 | } |
| 179 | case 0x03: // reserved | 190 | #endif |
| 191 | break; | ||
| 192 | case ACT_MOUSEKEY: | ||
| 193 | #ifdef MOUSEKEY_ENABLE | ||
| 194 | if (event.pressed) { | ||
| 195 | mousekey_on(action.key.code); | ||
| 196 | mousekey_send(); | ||
| 197 | } else { | ||
| 198 | mousekey_off(action.key.code); | ||
| 199 | mousekey_send(); | ||
| 200 | } | ||
| 201 | #endif | ||
| 202 | break; | ||
| 203 | case ACT_LAYER_PRESSED: | ||
| 204 | // layer action when pressed | ||
| 205 | switch (action.layer.code) { | ||
| 206 | case 0x00: | ||
| 207 | if (event.pressed) { | ||
| 208 | layer_switch(action.layer.opt); | ||
| 209 | } | ||
| 180 | break; | 210 | break; |
| 181 | case 0xF0 ... 0xF7: // Tap to enable/disable | 211 | case 0xF0: |
| 182 | case 0xF8 ... 0xFF: // Tap to toggle layer | 212 | // TODO: tap toggle |
| 183 | // TODO: | ||
| 184 | break; | 213 | break; |
| 185 | default: // with keycode for tap | 214 | case 0xFF: |
| 215 | if (event.pressed) { | ||
| 216 | default_layer = action.layer.opt; | ||
| 217 | layer_switch(default_layer); | ||
| 218 | } | ||
| 219 | break; | ||
| 220 | default: | ||
| 221 | // with tap key | ||
| 186 | debug("tap: "); debug_hex(tap_count); debug("\n"); | 222 | debug("tap: "); debug_hex(tap_count); debug("\n"); |
| 187 | // TODO: layer switch | ||
| 188 | // TODO: in case tap is interrupted by other key | ||
| 189 | |||
| 190 | |||
| 191 | if (event.pressed) { | 223 | if (event.pressed) { |
| 192 | // when any key down | ||
| 193 | if (host_has_anykey()) { | ||
| 194 | if (tap_count == 0) | ||
| 195 | register_code(action.layer_key.code); | ||
| 196 | } else { | ||
| 197 | } | ||
| 198 | |||
| 199 | if (tap_count == 0) { | 224 | if (tap_count == 0) { |
| 200 | if (host_has_anykey()) { | 225 | if (host_has_anykey()) { |
| 201 | register_code(action.layer_key.code); | 226 | register_code(action.layer.code); |
| 202 | } else { | 227 | } else { |
| 203 | waiting_layer = action.layer_key.layer; | 228 | delaying_layer = (keyrecord_t){ |
| 229 | .event = event, | ||
| 230 | .action = action, | ||
| 231 | .mods = keyboard_report->mods | ||
| 232 | }; | ||
| 204 | } | 233 | } |
| 205 | } | 234 | } else if (tap_count > 0) { |
| 206 | // register key when press after a tap | 235 | register_code(action.layer.code); |
| 207 | if (tap_count > 0) { | ||
| 208 | register_code(action.layer_key.code); | ||
| 209 | } | 236 | } |
| 210 | } else { | 237 | } else { |
| 211 | // type key after tap | 238 | // type key after tap |
| 212 | if (tap_count == 1) { | 239 | if (tap_count == 1) { |
| 213 | register_code(action.layer_key.code); | 240 | delaying_layer = (keyrecord_t){}; |
| 241 | register_code(action.layer.code); | ||
| 214 | } | 242 | } |
| 215 | unregister_code(action.layer_key.code); | 243 | unregister_code(action.layer.code); |
| 216 | } | 244 | } |
| 217 | break; | 245 | break; |
| 218 | } | 246 | } |
| 219 | break; | 247 | break; |
| 220 | case ACT_USAGE: | 248 | case ACT_LAYER_RELEASED: |
| 221 | #ifdef EXTRAKEY_ENABLE | 249 | switch (action.layer.code) { |
| 222 | switch (action.usage.page) { | 250 | case 0x00: |
| 223 | case ACTION_USAGE_PAGE_SYSTEM: | ||
| 224 | if (event.pressed) { | 251 | if (event.pressed) { |
| 225 | host_system_send(action.usage.code); | 252 | layer_switch(action.layer.opt); |
| 253 | } | ||
| 254 | break; | ||
| 255 | case 0xF0: | ||
| 256 | // Ignored. LAYER_RELEASED with tap toggle is invalid action. | ||
| 257 | break; | ||
| 258 | case 0xFF: | ||
| 259 | if (!event.pressed) { | ||
| 260 | default_layer = action.layer.opt; | ||
| 261 | layer_switch(default_layer); | ||
| 262 | } | ||
| 263 | break; | ||
| 264 | default: | ||
| 265 | // Ignored. LAYER_RELEASED with tap key is invalid action. | ||
| 266 | break; | ||
| 267 | } | ||
| 268 | break; | ||
| 269 | case ACT_LAYER_BIT: | ||
| 270 | switch (action.layer.code) { | ||
| 271 | case 0x00: | ||
| 272 | if (event.pressed) { | ||
| 273 | layer_switch(current_layer | action.layer.opt); | ||
| 226 | } else { | 274 | } else { |
| 227 | host_system_send(0); | 275 | layer_switch(current_layer & ~action.layer.opt); |
| 228 | } | 276 | } |
| 229 | break; | 277 | break; |
| 230 | case ACTION_USAGE_PAGE_CONSUMER: | 278 | case 0xF0: |
| 279 | // TODO: tap toggle | ||
| 280 | break; | ||
| 281 | case 0xFF: | ||
| 282 | // change default layer | ||
| 231 | if (event.pressed) { | 283 | if (event.pressed) { |
| 232 | host_consumer_send(action.usage.code); | 284 | default_layer = current_layer | action.layer.opt; |
| 285 | layer_switch(default_layer); | ||
| 233 | } else { | 286 | } else { |
| 234 | host_consumer_send(0); | 287 | default_layer = current_layer & ~action.layer.opt; |
| 288 | layer_switch(default_layer); | ||
| 289 | } | ||
| 290 | break; | ||
| 291 | default: | ||
| 292 | // with tap key | ||
| 293 | debug("tap: "); debug_hex(tap_count); debug("\n"); | ||
| 294 | if (event.pressed) { | ||
| 295 | if (tap_count == 0) { | ||
| 296 | if (host_has_anykey()) { | ||
| 297 | register_code(action.layer.code); | ||
| 298 | } else { | ||
| 299 | delaying_layer = (keyrecord_t){ | ||
| 300 | .event = event, | ||
| 301 | .action = action, | ||
| 302 | .mods = keyboard_report->mods | ||
| 303 | }; | ||
| 304 | } | ||
| 305 | } else if (tap_count > 0) { | ||
| 306 | register_code(action.layer.code); | ||
| 307 | } | ||
| 308 | } else { | ||
| 309 | if (tap_count == 0) { | ||
| 310 | // no tap | ||
| 311 | layer_switch(current_layer & ~action.layer.opt); | ||
| 312 | } else if (tap_count == 1) { | ||
| 313 | // tap | ||
| 314 | register_code(action.layer.code); | ||
| 315 | } | ||
| 316 | unregister_code(action.layer.code); | ||
| 235 | } | 317 | } |
| 236 | break; | 318 | break; |
| 237 | } | 319 | } |
| 238 | #endif | 320 | case ACT_LAYER_EXT: |
| 239 | break; | 321 | switch (action.layer.opt) { |
| 240 | case ACT_MOUSEKEY: | 322 | case 0x00: |
| 241 | #ifdef MOUSEKEY_ENABLE | 323 | // set default layer when pressed |
| 242 | if (event.pressed) { | 324 | switch (action.layer.code) { |
| 243 | mousekey_on(action.key.code); | 325 | case 0x00: |
| 244 | mousekey_send(); | 326 | if (event.pressed) { |
| 245 | } else { | 327 | layer_switch(default_layer); |
| 246 | mousekey_off(action.key.code); | 328 | } |
| 247 | mousekey_send(); | 329 | break; |
| 330 | case 0xF0: | ||
| 331 | // TODO: tap toggle | ||
| 332 | break; | ||
| 333 | case 0xFF: | ||
| 334 | if (event.pressed) { | ||
| 335 | default_layer = current_layer; | ||
| 336 | layer_switch(default_layer); | ||
| 337 | } | ||
| 338 | break; | ||
| 339 | default: | ||
| 340 | // TODO: tap key | ||
| 341 | break; | ||
| 342 | } | ||
| 343 | break; | ||
| 344 | case 0x01: | ||
| 345 | // set default layer when released | ||
| 346 | switch (action.layer.code) { | ||
| 347 | case 0x00: | ||
| 348 | if (!event.pressed) { | ||
| 349 | layer_switch(default_layer); | ||
| 350 | } | ||
| 351 | break; | ||
| 352 | case 0xFF: | ||
| 353 | if (!event.pressed) { | ||
| 354 | default_layer = current_layer; | ||
| 355 | layer_switch(default_layer); | ||
| 356 | } | ||
| 357 | break; | ||
| 358 | case 0xF0: | ||
| 359 | default: | ||
| 360 | // Ignore tap. | ||
| 361 | if (!event.pressed) { | ||
| 362 | layer_switch(default_layer); | ||
| 363 | } | ||
| 364 | break; | ||
| 365 | } | ||
| 366 | break; | ||
| 248 | } | 367 | } |
| 249 | #endif | ||
| 250 | break; | 368 | break; |
| 251 | case ACT_LMOD_TAP: | ||
| 252 | case ACT_RMOD_TAP: | ||
| 253 | case ACT_MACRO: | 369 | case ACT_MACRO: |
| 254 | case ACT_COMMAND: | 370 | case ACT_COMMAND: |
| 255 | case ACT_FUNCTION: | 371 | case ACT_FUNCTION: |
| @@ -263,142 +379,6 @@ void action_exec(action_t action, keyevent_t event) | |||
| 263 | } | 379 | } |
| 264 | 380 | ||
| 265 | 381 | ||
| 266 | #if 0 | ||
| 267 | /* Key Action */ | ||
| 268 | inline | ||
| 269 | static void key_action(uint8_t code, keyevent_t event) | ||
| 270 | { | ||
| 271 | if (event.pressed) | ||
| 272 | key_pressed(code, event); | ||
| 273 | else | ||
| 274 | key_released(code, event); | ||
| 275 | } | ||
| 276 | |||
| 277 | void fn_action(uint8_t code, keyevent_t event) | ||
| 278 | { | ||
| 279 | } | ||
| 280 | |||
| 281 | /* Key */ | ||
| 282 | inline static void key_pressed(uint8_t code, keyevent_t event) | ||
| 283 | { | ||
| 284 | uint8_t tmp_mods; | ||
| 285 | switch (kbdstate) { | ||
| 286 | case IDLE: | ||
| 287 | register_code(code); | ||
| 288 | NEXT(PRESSING); | ||
| 289 | break; | ||
| 290 | case PRESSING: | ||
| 291 | register_code(code); | ||
| 292 | break; | ||
| 293 | case DELAYING: | ||
| 294 | waiting_key = (keyrecord_t) { | ||
| 295 | .event = event, | ||
| 296 | .code = code, | ||
| 297 | .mods = keyboard_report->mods, | ||
| 298 | .time = timer_read() | ||
| 299 | }; | ||
| 300 | NEXT(WAITING); | ||
| 301 | break; | ||
| 302 | case WAITING: | ||
| 303 | // play back key stroke | ||
| 304 | tmp_mods = keyboard_report->mods; | ||
| 305 | host_set_mods(delayed_fn.mods); | ||
| 306 | register_code(delayed_fn.code); | ||
| 307 | host_set_mods(waiting_key.mods); | ||
| 308 | register_code(waiting_key.code); | ||
| 309 | host_set_mods(tmp_mods); | ||
| 310 | register_code(code); | ||
| 311 | NEXT(IDLE); | ||
| 312 | break; | ||
| 313 | } | ||
| 314 | } | ||
| 315 | inline static void key_released(uint8_t code, keyevent_t event) | ||
| 316 | { | ||
| 317 | uint8_t tmp_mods; | ||
| 318 | switch (kbdstate) { | ||
| 319 | case IDLE: | ||
| 320 | unregister_code(code); | ||
| 321 | break; | ||
| 322 | case PRESSING: | ||
| 323 | unregister_code(code); | ||
| 324 | if (!anykey_sent_to_host()) | ||
| 325 | NEXT(IDLE); | ||
| 326 | break; | ||
| 327 | case DELAYING: | ||
| 328 | unregister_code(code); | ||
| 329 | break; | ||
| 330 | case WAITING: | ||
| 331 | if (code == waiting_key.code) { | ||
| 332 | layer_switch_on(delayed_fn.code); | ||
| 333 | NEXT(IDLE); | ||
| 334 | // process waiting_key | ||
| 335 | tmp_mods = keyboard_report->mods; | ||
| 336 | host_set_mods(waiting_key.mods); | ||
| 337 | keymap_process_event(waiting_key.event); | ||
| 338 | host_set_mods(tmp_mods); | ||
| 339 | keymap_process_event(event); | ||
| 340 | } else { | ||
| 341 | unregister_code(code); | ||
| 342 | } | ||
| 343 | break; | ||
| 344 | } | ||
| 345 | } | ||
| 346 | |||
| 347 | /* layer switch momentary */ | ||
| 348 | inline static void layerkey_pressed(uint8_t code, keyevent_t event) | ||
| 349 | { | ||
| 350 | uint8_t tmp_mods; | ||
| 351 | switch (kbdstate) { | ||
| 352 | case IDLE: | ||
| 353 | layer_switch_on(code); | ||
| 354 | break; | ||
| 355 | case PRESSING: | ||
| 356 | // ignore | ||
| 357 | break; | ||
| 358 | case DELAYING: | ||
| 359 | waiting_key = (keyrecord_t) { | ||
| 360 | .event = event, | ||
| 361 | .code = code, | ||
| 362 | .mods = keyboard_report->mods, | ||
| 363 | .time = timer_read() | ||
| 364 | }; | ||
| 365 | NEXT(WAITING); | ||
| 366 | break; | ||
| 367 | case WAITING: | ||
| 368 | tmp_mods = keyboard_report->mods; | ||
| 369 | host_set_mods(delayed_fn.mods); | ||
| 370 | register_code(delayed_fn.code); | ||
| 371 | host_set_mods(waiting_key.mods); | ||
| 372 | register_code(waiting_key.code); | ||
| 373 | host_set_mods(tmp_mods); | ||
| 374 | if (kind == FN_DOWN) { | ||
| 375 | // ignore Fn | ||
| 376 | } else if (kind == FNK_DOWN) { | ||
| 377 | register_code(code); | ||
| 378 | } else if (kind == KEY_DOWN) { | ||
| 379 | register_code(code); | ||
| 380 | } | ||
| 381 | NEXT(IDLE); | ||
| 382 | break; | ||
| 383 | } | ||
| 384 | } | ||
| 385 | inline static void layerkey_released(uint8_t code, keyevent_t event) | ||
| 386 | { | ||
| 387 | switch (kbdstate) { | ||
| 388 | case IDLE: | ||
| 389 | layer_switch_off(code); | ||
| 390 | break; | ||
| 391 | case PRESSING: | ||
| 392 | case DELAYING: | ||
| 393 | case WAITING: | ||
| 394 | if (layer_switch_off(code)) | ||
| 395 | NEXT(IDLE); | ||
| 396 | break; | ||
| 397 | } | ||
| 398 | } | ||
| 399 | #endif | ||
| 400 | |||
| 401 | |||
| 402 | static void register_code(uint8_t code) | 382 | static void register_code(uint8_t code) |
| 403 | { | 383 | { |
| 404 | if (code == KC_NO) { | 384 | if (code == KC_NO) { |
diff --git a/common/action.h b/common/action.h index 08f8c5608..942ce191a 100644 --- a/common/action.h +++ b/common/action.h | |||
| @@ -15,10 +15,6 @@ ACT_LMODS(0000) | |||
| 15 | 0 0 0 0| mods(4) | 0 0 0 0 0 0| 1 0 (reserved) | 15 | 0 0 0 0| mods(4) | 0 0 0 0 0 0| 1 0 (reserved) |
| 16 | 0 0 0 0| mods(4) | 0 0 0 0 0 0| 1 1 (reserved) | 16 | 0 0 0 0| mods(4) | 0 0 0 0 0 0| 1 1 (reserved) |
| 17 | 0 0 0 0| mods(4) | keycode(8) Key+Lmods | 17 | 0 0 0 0| mods(4) | keycode(8) Key+Lmods |
| 18 | ??? | ||
| 19 | 0 0 0 0| mods(4) | 1 1 1 1 0| tap(3) Lmods+tap Switch(enable/disable) | ||
| 20 | 0 0 0 0| mods(4) | 1 1 1 1 1| tap(3) Lmods+tap Toggle(on/off) | ||
| 21 | ??? | ||
| 22 | 18 | ||
| 23 | ACT_RMODS(0001) | 19 | ACT_RMODS(0001) |
| 24 | 0 0 0 1| 0 0 0 0| 0 0 0 0 0 0 0 0 No action(not used) | 20 | 0 0 0 1| 0 0 0 0| 0 0 0 0 0 0 0 0 No action(not used) |
| @@ -28,10 +24,6 @@ ACT_RMODS(0001) | |||
| 28 | 0 0 0 1| mods(4) | 0 0 0 0 0 0| 1 0 (reserved) | 24 | 0 0 0 1| mods(4) | 0 0 0 0 0 0| 1 0 (reserved) |
| 29 | 0 0 0 1| mods(4) | 0 0 0 0 0 0| 1 1 (reserved) | 25 | 0 0 0 1| mods(4) | 0 0 0 0 0 0| 1 1 (reserved) |
| 30 | 0 0 0 1| mods(4) | keycode(8) Key+Rmod | 26 | 0 0 0 1| mods(4) | keycode(8) Key+Rmod |
| 31 | ??? | ||
| 32 | 0 0 0 1| mods(4) | 1 1 1 1 0| tap(3) Rmods+tap Switch(enable/disable) | ||
| 33 | 0 0 0 1| mods(4) | 1 1 1 1 1| tap(3) Rmods+tap Toggle(on/off) | ||
| 34 | ??? | ||
| 35 | 27 | ||
| 36 | ACT_LMODS_TAP(0010) | 28 | ACT_LMODS_TAP(0010) |
| 37 | 0 0 1 0| 0 0 0 0| X X X X X X X X (reserved)[00-FF] | 29 | 0 0 1 0| 0 0 0 0| X X X X X X X X (reserved)[00-FF] |
| @@ -45,36 +37,47 @@ ACT_RMODS_TAP(0011) | |||
| 45 | 0 0 1 1| mods(4) | keycode(8) Rmods+tap Key | 37 | 0 0 1 1| mods(4) | keycode(8) Rmods+tap Key |
| 46 | 0 0 1 1| mods(4) | 1 1 1 1| X X X X (reserved)[F0-FF] | 38 | 0 0 1 1| mods(4) | 1 1 1 1| X X X X (reserved)[F0-FF] |
| 47 | 39 | ||
| 48 | ACT_LAYER(0100) | 40 | ACT_USAGE - other HID usage than keyboard |
| 49 | 0 1 0 0| layer(4) | 0 0 0 0 0 0| 0 0 Momentary | 41 | 0 1 0 0| 0 0| usage(10) System usage |
| 50 | 0 1 0 0| layer(4) | 0 0 0 0 0 0| 0 1 Oneshot | 42 | 0 1 0 0| 0 1| usage(10) Consumer usage |
| 51 | 0 1 0 0| layer(4) | 0 0 0 0 0 0| 1 0 (reserved) | 43 | 0 1 0 0| 1 0| usage(10) (reserved) |
| 52 | 0 1 0 0| layer(4) | 0 0 0 0 0 0| 1 1 (reserved) | 44 | 0 1 0 0| 1 1| usage(10) (reserved) |
| 53 | 0 1 0 0| layer(4) | keycode(8) Fn momentary + tap Key | ||
| 54 | 0 1 0 0| layer(4) | 1 1 1 1 0| tap(3) Fn+tap Switch(enable/disable) | ||
| 55 | 0 1 0 0| layer(4) | 1 1 1 1 1| tap(3) Fn+tap Toggle(on/off) | ||
| 56 | |||
| 57 | ACT_USAGE(0101) | ||
| 58 | 0 1 0 1| 0 0| usage(10) System usage | ||
| 59 | 0 1 0 1| 0 1| usage(10) Consumer usage | ||
| 60 | 0 1 0 1| 1 0| usage(10) (reserved) | ||
| 61 | 0 1 0 1| 1 1| usage(10) (reserved) | ||
| 62 | 45 | ||
| 63 | ACT_MOUSEKEY(0110) | 46 | ACT_MOUSEKEY(0110) |
| 64 | 0 1 1 0| X X X X| keycode(8) Mouse key | 47 | 0 1 0 1| X X X X| keycode(8) Mouse key |
| 65 | ??? TODO: refactor | 48 | ??? TODO: refactor |
| 66 | 0 1 1 0| 0 0 X X| accel(5) |cursor(3) Mouse key | 49 | 0 1 0 1| 0 0 X X| accel(5) |cursor(3) Mouse key |
| 67 | 0 1 1 0| 0 1 X X| accel(5) |wheel(3) Mouse key | 50 | 0 1 0 1| 0 1 X X| accel(5) |wheel(3) Mouse key |
| 68 | 0 1 1 0| 1 0 X X| button(8) Mouse key | 51 | 0 1 0 1| 1 0 X X| button(8) Mouse key |
| 69 | 0 1 1 0| 1 1 X X| button(8) Mouse key | 52 | 0 1 0 1| 1 1 X X| button(8) Mouse key |
| 70 | ??? | 53 | ??? |
| 71 | 54 | ||
| 72 | 0 1 1 1| (reserved) | 55 | Layer Action |
| 73 | 1 0 0 0| (reserved) | 56 | ------------ |
| 74 | 1 0 0 1| (reserved) | 57 | 1000|LLLL|0000 0000 set layer L when pressed |
| 75 | 1 0 1 0| (reserved) | 58 | 1001|LLLL|0000 0000 set layer L when released |
| 76 | 1 0 1 1| (reserved) | 59 | 1010|BBBB|0000 0000 on/off bit B when pressed/released |
| 77 | 1 1 0 0| (reserved) | 60 | 1011|0000|0000 0000 set default layer when pressed |
| 61 | 1011|0001|0000 0000 set default layer when released | ||
| 62 | |||
| 63 | 1000|LLLL|1111 0000 set layer L when pressed + tap toggle | ||
| 64 | 1001|LLLL|1111 0000 set layer L when released[tap is ignored/not used] | ||
| 65 | 1010|BBBB|1111 0000 on/off bit B when pressed/released + tap toggle | ||
| 66 | 1011|0000|1111 0000 set default layer when pressed + tap toggle | ||
| 67 | 1011|0001|1111 0000 set default layer when released[tap is ignored/not used] | ||
| 68 | |||
| 69 | 1000|LLLL|1111 1111 set L to default layer when pressed | ||
| 70 | 1001|LLLL|1111 1111 set L to default layer when released | ||
| 71 | 1010|BBBB|1111 1111 on/off bit B of default layer when pressed/released | ||
| 72 | 1011|0000|1111 1111 set current to default layer when pressed | ||
| 73 | 1011|0001|1111 1111 set current to default layer when released | ||
| 74 | |||
| 75 | 1000|LLLL| keycode set layer L when pressed + tap key | ||
| 76 | 1001|LLLL| keyocde set layer L when released[tap is ignored/not used] | ||
| 77 | 1010|BBBB| keyocde on/off bit B when pressed/released + tap key | ||
| 78 | 1011|0000| keyocde set default layer when pressed + tap key | ||
| 79 | 1011|0001| keyocde set default layer when released[tap is ignored/not used] | ||
| 80 | |||
| 78 | 81 | ||
| 79 | ACT_MACRO(1100) | 82 | ACT_MACRO(1100) |
| 80 | 1 1 0 0| option(4) | macro-table id(8) Macro play(Flash) | 83 | 1 1 0 0| option(4) | macro-table id(8) Macro play(Flash) |
| @@ -88,25 +91,32 @@ ACT_FUNCTION(1111) | |||
| 88 | 1 1 1 1| function address(4K range) Function | 91 | 1 1 1 1| function address(4K range) Function |
| 89 | Macro record(dynamicly) | 92 | Macro record(dynamicly) |
| 90 | Macro play(dynamicly) | 93 | Macro play(dynamicly) |
| 94 | TODO: modifier + [tap key /w mod] | ||
| 95 | : layerkey + [tap key /w mod] | ||
| 96 | for example: LShift + '('[Shift+9] and RShift + ')'[Shift+0] | ||
| 97 | http://deskthority.net/workshop-f7/tmk-keyboard-firmware-collection-t4478.html#p90052 | ||
| 91 | */ | 98 | */ |
| 92 | 99 | ||
| 93 | enum action_id { | 100 | enum action_id { |
| 94 | ACT_LMODS = 0, | 101 | ACT_LMODS = 0b0000, |
| 95 | ACT_RMODS, | 102 | ACT_RMODS = 0b0001, |
| 96 | ACT_LMOD_TAP, | 103 | ACT_LMOD_TAP = 0b0010, |
| 97 | ACT_RMOD_TAP, | 104 | ACT_RMOD_TAP = 0b0011, |
| 98 | ACT_LAYER, | 105 | ACT_USAGE = 0b0100, |
| 99 | ACT_USAGE, | 106 | ACT_MOUSEKEY = 0b0101, |
| 100 | ACT_MOUSEKEY, | 107 | ACT_LAYER_PRESSED = 0b1000, |
| 101 | ACT_MACRO = 14, | 108 | ACT_LAYER_RELEASED = 0b1001, |
| 102 | ACT_COMMAND = 15, | 109 | ACT_LAYER_BIT = 0b1010, |
| 103 | ACT_FUNCTION = 16 | 110 | ACT_LAYER_EXT = 0b1011, |
| 111 | ACT_MACRO = 0b1100, | ||
| 112 | ACT_COMMAND = 0b1110, | ||
| 113 | ACT_FUNCTION = 0b1111 | ||
| 104 | }; | 114 | }; |
| 105 | 115 | ||
| 106 | // TODO: not portable across compiler/endianness? | 116 | // TODO: not portable across compiler/endianness? |
| 107 | /* | 117 | /* |
| 108 | In avr-gcc bit fields seems to be assigned from LSB(bit0) to MSB(bit15). | 118 | In avr-gcc bit fields seems to be assigned from LSB(bit0) to MSB(bit15). |
| 109 | AVR seems like little endian in avr-gcc. | 119 | AVR looks like a little endian in avr-gcc. |
| 110 | 120 | ||
| 111 | Byte order and bit order of 0x1234: | 121 | Byte order and bit order of 0x1234: |
| 112 | Big endian: 15 ... 8 7 ... 210 | 122 | Big endian: 15 ... 8 7 ... 210 |
| @@ -127,17 +137,11 @@ typedef union { | |||
| 127 | uint16_t mods :4; | 137 | uint16_t mods :4; |
| 128 | uint16_t kind :4; | 138 | uint16_t kind :4; |
| 129 | } key; | 139 | } key; |
| 130 | struct action_layer_key { | 140 | struct action_layer { |
| 131 | uint16_t code :8; | 141 | uint16_t code :8; |
| 132 | uint16_t layer :4; | 142 | uint16_t opt :4; |
| 133 | uint16_t kind :4; | ||
| 134 | } layer_key; | ||
| 135 | struct action_layer_tap { | ||
| 136 | uint16_t count :3; | ||
| 137 | uint16_t rest :5; | ||
| 138 | uint16_t layer :4; | ||
| 139 | uint16_t kind :4; | 143 | uint16_t kind :4; |
| 140 | } layer_tap; | 144 | } layer; |
| 141 | struct action_usage { | 145 | struct action_usage { |
| 142 | uint16_t code :10; | 146 | uint16_t code :10; |
| 143 | uint16_t page :2; | 147 | uint16_t page :2; |
| @@ -157,7 +161,14 @@ enum stroke_cmd { | |||
| 157 | STROKE_ALLUP, /* release all keys in reverse order */ | 161 | STROKE_ALLUP, /* release all keys in reverse order */ |
| 158 | }; | 162 | }; |
| 159 | 163 | ||
| 160 | void action_exec(action_t act, keyevent_t event); | 164 | typedef struct { |
| 165 | keyevent_t event; | ||
| 166 | action_t action; | ||
| 167 | uint8_t mods; | ||
| 168 | } keyrecord_t; | ||
| 169 | |||
| 170 | |||
| 171 | void action_exec(keyevent_t event); | ||
| 161 | /* | 172 | /* |
| 162 | void key_action(uint8_t code, keyevent_t event); | 173 | void key_action(uint8_t code, keyevent_t event); |
| 163 | void mod_action(uint8_t code, keyevent_t event); | 174 | void mod_action(uint8_t code, keyevent_t event); |
| @@ -166,9 +177,12 @@ void fn_action(uint8_t code, keyevent_t event); | |||
| 166 | 177 | ||
| 167 | 178 | ||
| 168 | /* action_t utility */ | 179 | /* action_t utility */ |
| 180 | /* | ||
| 181 | #define ACTION_NO { .code = 0 } | ||
| 169 | #define ACTION(kind, param) { .code = ((kind)<<12 | (param)) } | 182 | #define ACTION(kind, param) { .code = ((kind)<<12 | (param)) } |
| 170 | #define NO_ACTION ACTION(0, 0) | 183 | */ |
| 171 | #define LAYER_PARAM(layer, key) ((layer)<<8|(key)) | 184 | #define ACTION_NO 0 |
| 185 | #define ACTION(kind, param) ((kind)<<12 | (param)) | ||
| 172 | 186 | ||
| 173 | /* Key & Mods */ | 187 | /* Key & Mods */ |
| 174 | #define ACTION_KEY(key) ACTION(ACT_LMODS, key) | 188 | #define ACTION_KEY(key) ACTION(ACT_LMODS, key) |
| @@ -185,12 +199,28 @@ void fn_action(uint8_t code, keyevent_t event); | |||
| 185 | /* Mods + Tap key */ | 199 | /* Mods + Tap key */ |
| 186 | #define ACTION_LMODS_TAP(mods, key) ACTION(ACT_LMODS_TAP,(mods)<<8 | (key)) | 200 | #define ACTION_LMODS_TAP(mods, key) ACTION(ACT_LMODS_TAP,(mods)<<8 | (key)) |
| 187 | #define ACTION_RMODS_TAP(mods, key) ACTION(ACT_RMODS_TAP,(mods)<<8 | (key)) | 201 | #define ACTION_RMODS_TAP(mods, key) ACTION(ACT_RMODS_TAP,(mods)<<8 | (key)) |
| 202 | |||
| 188 | /* Layer Switch */ | 203 | /* Layer Switch */ |
| 189 | #define ACTION_LAYER(layer) ACTION(ACT_LAYER, (layer)<<8 | 0x00) | 204 | #define ACTION_LAYER_SET_ON_PRESSED(layer) ACTION(ACT_LAYER_PRESSED, (layer)<<8 | 0x00) |
| 190 | #define ACTION_LAYER_ONESHOT(layer) ACTION(ACT_LAYER, (layer)<<8 | 0x01) | 205 | #define ACTION_LAYER_SET_ON_RELEASED(layer) ACTION(ACT_LAYER_RELEASED, (layer)<<8 | 0x00) |
| 191 | #define ACTION_LAYER_KEY(layer, key) ACTION(ACT_LAYER, (layer)<<8 | (key)) | 206 | #define ACTION_LAYER_BIT(bits) ACTION(ACT_LAYER_BIT, (layer)<<8 | 0x00) |
| 192 | #define ACTION_LAYER_SWITCH(layer, tap) ACTION(ACT_LAYER, (layer)<<8 | 0xF0 | (tap)) | 207 | #define ACTION_LAYER_TO_DEFAULT_ON_PRESSED ACTION(ACT_LAYER_EXT, 0x0<<8 | 0x00) |
| 193 | #define ACTION_LAYER_TOGGLE(layer, tap) ACTION(ACT_LAYER, (layer)<<8 | 0xF1 | (tap)) | 208 | #define ACTION_LAYER_TO_DEFAULT_ON_RELEASED ACTION(ACT_LAYER_EXT, 0x1<<8 | 0x00) |
| 209 | |||
| 210 | #define ACTION_LAYER_TAP_TOGGLE(layer) ACTION(ACT_LAYER_PRESSED, (layer)<<8 | 0xF0) | ||
| 211 | #define ACTION_LAYER_BIT_TAP_TOGGLE(layer) ACTION(ACT_LAYER_BIT, (layer)<<8 | 0xF0) | ||
| 212 | #define ACTION_LAYER_DEFAULT_TAP_TOGGLE ACTION(ACT_LAYER_EXT, 0x0<<8 | 0xF0) | ||
| 213 | |||
| 214 | #define ACTION_LAYER_DEFAULT_SET_ON_PRESSED(layer) ACTION(ACT_LAYER_PRESSED, (layer)<<8 | 0xFF) | ||
| 215 | #define ACTION_LAYER_DEFAULT_SET_ON_RELEASED(layer) ACTION(ACT_LAYER_RELEASED, (layer)<<8 | 0xFF) | ||
| 216 | #define ACTION_LAYER_DEFAULT_BIT(bits) ACTION(ACT_LAYER_BIT, (bits)<<8 | 0xFF) | ||
| 217 | #define ACTION_LAYER_DEFAULT_SET_CURRENT_ON_PRESSED ACTION(ACT_LAYER_EXT, 0x0<<8 | 0xFF) | ||
| 218 | #define ACTION_LAYER_DEFAULT_SET_CURRENT_ON_RELEASED ACTION(ACT_LAYER_EXT, 0x1<<8 | 0xFF) | ||
| 219 | |||
| 220 | #define ACTION_LAYER_SET_TAP_KEY(layer, key) ACTION(ACT_LAYER_PRESSED, (layer)<<8 | (key)) | ||
| 221 | #define ACTION_LAYER_BIT_TAP_KEY(bits, key) ACTION(ACT_LAYER_BIT, (layer)<<8 | (key)) | ||
| 222 | #define ACTION_LAYER_DEFAULT_SET_TAP_KEY(key) ACTION(ACT_LAYER_EXT, 0x0<<8 | (key)) | ||
| 223 | |||
| 194 | /* HID Usage */ | 224 | /* HID Usage */ |
| 195 | #define ACTION_USAGE_PAGE_SYSTEM 0 | 225 | #define ACTION_USAGE_PAGE_SYSTEM 0 |
| 196 | #define ACTION_USAGE_PAGE_CONSUMER 1 | 226 | #define ACTION_USAGE_PAGE_CONSUMER 1 |
diff --git a/common/keyboard.c b/common/keyboard.c index 5e95fb984..1e0b8c3ed 100644 --- a/common/keyboard.c +++ b/common/keyboard.c | |||
| @@ -65,9 +65,10 @@ void keyboard_task(void) | |||
| 65 | 65 | ||
| 66 | for (int c = 0; c < MATRIX_COLS; c++) { | 66 | for (int c = 0; c < MATRIX_COLS; c++) { |
| 67 | if (matrix_change & (1<<c)) { | 67 | if (matrix_change & (1<<c)) { |
| 68 | keymap_process_event((keyevent_t){ | 68 | action_exec((keyevent_t){ |
| 69 | .key = (keypos_t){ .row = r, .col = c }, | 69 | .key = (keypos_t){ .row = r, .col = c }, |
| 70 | .pressed = (matrix_row & (1<<c)) | 70 | .pressed = (matrix_row & (1<<c)), |
| 71 | .time = timer_read() | ||
| 71 | }); | 72 | }); |
| 72 | // record a processed key | 73 | // record a processed key |
| 73 | matrix_prev[r] ^= (1<<c); | 74 | matrix_prev[r] ^= (1<<c); |
diff --git a/common/keyboard.h b/common/keyboard.h index 37df6a4de..116653661 100644 --- a/common/keyboard.h +++ b/common/keyboard.h | |||
| @@ -34,15 +34,9 @@ typedef struct { | |||
| 34 | typedef struct { | 34 | typedef struct { |
| 35 | keypos_t key; | 35 | keypos_t key; |
| 36 | bool pressed; | 36 | bool pressed; |
| 37 | uint16_t time; | ||
| 37 | } keyevent_t; | 38 | } keyevent_t; |
| 38 | 39 | ||
| 39 | typedef struct { | ||
| 40 | keyevent_t event; | ||
| 41 | uint8_t code; | ||
| 42 | uint8_t mods; | ||
| 43 | uint16_t time; | ||
| 44 | } keyrecord_t; | ||
| 45 | |||
| 46 | #define KEYEQ(keya, keyb) (keya.row == keyb.row && keya.col == keyb.col) | 40 | #define KEYEQ(keya, keyb) (keya.row == keyb.row && keya.col == keyb.col) |
| 47 | 41 | ||
| 48 | extern uint8_t current_layer; | 42 | extern uint8_t current_layer; |
diff --git a/common/keymap.h b/common/keymap.h index 935d886d7..f992be18e 100644 --- a/common/keymap.h +++ b/common/keymap.h | |||
| @@ -35,6 +35,5 @@ uint8_t keymap_fn_keycode(uint8_t fn_bits); | |||
| 35 | * new keymap interface: action | 35 | * new keymap interface: action |
| 36 | */ | 36 | */ |
| 37 | action_t keymap_get_action(uint8_t layer, uint8_t row, uint8_t col); | 37 | action_t keymap_get_action(uint8_t layer, uint8_t row, uint8_t col); |
| 38 | uint8_t keymap_process_event(keyevent_t event); | ||
| 39 | 38 | ||
| 40 | #endif | 39 | #endif |
diff --git a/keyboard/hhkb/keymap.c b/keyboard/hhkb/keymap.c index 477ef6c33..3ea75f5bb 100644 --- a/keyboard/hhkb/keymap.c +++ b/keyboard/hhkb/keymap.c | |||
| @@ -51,15 +51,27 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
| 51 | } | 51 | } |
| 52 | 52 | ||
| 53 | 53 | ||
| 54 | /* | ||
| 54 | static const action_t PROGMEM fn_actions[] = { | 55 | static const action_t PROGMEM fn_actions[] = { |
| 55 | ACTION_LAYER(0), // Fn0 | 56 | ACTION_LAYER_TO_DEFAULT_ON_RELEASED, // Fn0 |
| 56 | ACTION_LAYER(1), // Fn1 | 57 | ACTION_LAYER_SET_ON_PRESSED(1), // Fn1 |
| 57 | ACTION_LAYER_KEY(2, KC_SLASH), // Fn2 | 58 | ACTION_LAYER_SET_TAP_KEY(2, KC_SLASH), // Fn2 |
| 58 | ACTION_LAYER_KEY(3, KC_SCLN), // Fn3 | 59 | ACTION_LAYER_SET_TAP_KEY(3, KC_SCLN), // Fn3 |
| 59 | ACTION_LAYER(3), // Fn3 | 60 | ACTION_LAYER_SET_ON_PRESSED(3), // Fn4 |
| 60 | ACTION_LAYER_KEY(5, KC_SPC), // Fn5 | 61 | ACTION_LAYER_SET_TAP_KEY(5, KC_SPC), // Fn5 |
| 61 | NO_ACTION, // Fn6 | 62 | ACTION_NO, // Fn6 |
| 62 | NO_ACTION, // Fn7 | 63 | ACTION_NO, // Fn7 |
| 64 | }; | ||
| 65 | */ | ||
| 66 | static const uint16_t PROGMEM fn_actions[] = { | ||
| 67 | ACTION_LAYER_TO_DEFAULT_ON_RELEASED, // Fn0 | ||
| 68 | ACTION_LAYER_SET_ON_PRESSED(1), // Fn1 | ||
| 69 | ACTION_LAYER_SET_TAP_KEY(2, KC_SLASH), // Fn2 | ||
| 70 | ACTION_LAYER_SET_TAP_KEY(3, KC_SCLN), // Fn3 | ||
| 71 | ACTION_LAYER_SET_ON_PRESSED(3), // Fn4 | ||
| 72 | ACTION_LAYER_SET_TAP_KEY(5, KC_SPC), // Fn5 | ||
| 73 | ACTION_NO, // Fn6 | ||
| 74 | ACTION_NO, // Fn7 | ||
| 63 | }; | 75 | }; |
| 64 | 76 | ||
| 65 | 77 | ||
| @@ -91,7 +103,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
| 91 | * |-----------------------------------------------------------| | 103 | * |-----------------------------------------------------------| |
| 92 | * |Contro|VoD|VoU|Mut| | | *| /|Hom|PgU|Lef|Rig|Enter | | 104 | * |Contro|VoD|VoU|Mut| | | *| /|Hom|PgU|Lef|Rig|Enter | |
| 93 | * |-----------------------------------------------------------| | 105 | * |-----------------------------------------------------------| |
| 94 | * |Shift | | | | | | +| -|End|PgD|Dow|Shift |xxx| | 106 | * |Shift | | | | | | +| -|End|PgD|Dow|Shift |Fn0| |
| 95 | * `-----------------------------------------------------------' | 107 | * `-----------------------------------------------------------' |
| 96 | * |Gui |Alt |Space |Alt |xxx| | 108 | * |Gui |Alt |Space |Alt |xxx| |
| 97 | * `--------------------------------------------' | 109 | * `--------------------------------------------' |
| @@ -99,8 +111,8 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
| 99 | KEYMAP(PWR, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ | 111 | KEYMAP(PWR, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ |
| 100 | CAPS,NO, NO, NO, NO, NO, NO, NO, PSCR,SLCK,BRK, UP, NO, BSPC, \ | 112 | CAPS,NO, NO, NO, NO, NO, NO, NO, PSCR,SLCK,BRK, UP, NO, BSPC, \ |
| 101 | LCTL,VOLD,VOLU,MUTE,NO, NO, PAST,PSLS,HOME,PGUP,LEFT,RGHT,ENT, \ | 113 | LCTL,VOLD,VOLU,MUTE,NO, NO, PAST,PSLS,HOME,PGUP,LEFT,RGHT,ENT, \ |
| 102 | LSFT,NO, NO, NO, NO, NO, PPLS,PMNS,END, PGDN,DOWN,RSFT,FN1, \ | 114 | LSFT,NO, NO, NO, NO, NO, PPLS,PMNS,END, PGDN,DOWN,RSFT,FN0, \ |
| 103 | LGUI,LALT, SPC, RALT,FN7), | 115 | LGUI,LALT, SPC, RALT,RGUI), |
| 104 | 116 | ||
| 105 | /* Layer 2: Vi mode (Slash) | 117 | /* Layer 2: Vi mode (Slash) |
| 106 | * ,-----------------------------------------------------------. | 118 | * ,-----------------------------------------------------------. |
| @@ -110,7 +122,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
| 110 | * |-----------------------------------------------------------| | 122 | * |-----------------------------------------------------------| |
| 111 | * |Contro| |Lef|Dow|Rig| |Lef|Dow|Up |Rig| | |Return | | 123 | * |Contro| |Lef|Dow|Rig| |Lef|Dow|Up |Rig| | |Return | |
| 112 | * |-----------------------------------------------------------| | 124 | * |-----------------------------------------------------------| |
| 113 | * |Shift | | | | | |Hom|PgD|PgUlEnd|xxx|Shift | | | 125 | * |Shift | | | | | |Hom|PgD|PgUlEnd|Fn0|Shift | | |
| 114 | * `-----------------------------------------------------------' | 126 | * `-----------------------------------------------------------' |
| 115 | * |Gui|Alt |Space |Alt |Gui| | 127 | * |Gui|Alt |Space |Alt |Gui| |
| 116 | * `-------------------------------------------' | 128 | * `-------------------------------------------' |
| @@ -118,7 +130,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
| 118 | KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ | 130 | KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ |
| 119 | TAB, HOME,PGDN,UP, PGUP,END, HOME,PGDN,PGUP,END, NO, NO, NO, BSPC, \ | 131 | TAB, HOME,PGDN,UP, PGUP,END, HOME,PGDN,PGUP,END, NO, NO, NO, BSPC, \ |
| 120 | LCTL,NO, LEFT,DOWN,RGHT,NO, LEFT,DOWN,UP, RGHT,NO, NO, ENT, \ | 132 | LCTL,NO, LEFT,DOWN,RGHT,NO, LEFT,DOWN,UP, RGHT,NO, NO, ENT, \ |
| 121 | LSFT,NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, FN2, RSFT,NO, \ | 133 | LSFT,NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, FN0, RSFT,NO, \ |
| 122 | LGUI,LALT, SPC, RALT,RGUI), | 134 | LGUI,LALT, SPC, RALT,RGUI), |
| 123 | 135 | ||
| 124 | /* Layer 3: Mouse mode (Semicolon) | 136 | /* Layer 3: Mouse mode (Semicolon) |
| @@ -127,19 +139,19 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
| 127 | * |-----------------------------------------------------------| | 139 | * |-----------------------------------------------------------| |
| 128 | * |Tab |MwL|MwU|McU|MwD|MwR|MwL|MwD|MwU|MwR| | | |Backs| | 140 | * |Tab |MwL|MwU|McU|MwD|MwR|MwL|MwD|MwU|MwR| | | |Backs| |
| 129 | * |-----------------------------------------------------------| | 141 | * |-----------------------------------------------------------| |
| 130 | * |Contro| |McL|McD|McR| |McL|McD|McU|McR|xxx| |Return | | 142 | * |Contro| |McL|McD|McR| |McL|McD|McU|McR|Fn0| |Return | |
| 131 | * |-----------------------------------------------------------| | 143 | * |-----------------------------------------------------------| |
| 132 | * |Shift |Mb4|Mb5|Mb1|Mb2|Mb3|Mb2|Mb1|Mb4|Mb5| |Shift | | | 144 | * |Shift |Mb4|Mb5|Mb1|Mb2|Mb3|Mb2|Mb1|Mb4|Mb5| |Shift | | |
| 133 | * `-----------------------------------------------------------' | 145 | * `-----------------------------------------------------------' |
| 134 | * |Gui |Alt |Mb1 |Alt |Gui| | 146 | * |Gui |Alt |Mb1 |Alt |Fn0| |
| 135 | * `--------------------------------------------' | 147 | * `--------------------------------------------' |
| 136 | * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel | 148 | * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel |
| 137 | */ | 149 | */ |
| 138 | KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ | 150 | KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ |
| 139 | TAB, NO, NO, NO, NO, NO, WH_L,WH_D,WH_U,WH_R,NO, NO, NO, BSPC, \ | 151 | TAB, NO, NO, NO, NO, NO, WH_L,WH_D,WH_U,WH_R,NO, NO, NO, BSPC, \ |
| 140 | LCTL,NO, ACL0,ACL1,ACL2,NO, MS_L,MS_D,MS_U,MS_R,FN3, NO, ENT, \ | 152 | LCTL,NO, ACL0,ACL1,ACL2,NO, MS_L,MS_D,MS_U,MS_R,FN0, NO, ENT, \ |
| 141 | LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,BTN4,BTN5,NO, RSFT,NO, \ | 153 | LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,BTN4,BTN5,NO, RSFT,NO, \ |
| 142 | LGUI,LALT, BTN1, RALT,FN4), | 154 | LGUI,LALT, BTN1, RALT,FN0), |
| 143 | 155 | ||
| 144 | /* Layer 4: Matias half keyboard style (Space) | 156 | /* Layer 4: Matias half keyboard style (Space) |
| 145 | * ,-----------------------------------------------------------. | 157 | * ,-----------------------------------------------------------. |
| @@ -151,21 +163,21 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
| 151 | * |-----------------------------------------------------------| | 163 | * |-----------------------------------------------------------| |
| 152 | * |Shift | /| .| ,| M| N| B| V| C| X| Z|Shift | | | 164 | * |Shift | /| .| ,| M| N| B| V| C| X| Z|Shift | | |
| 153 | * `-----------------------------------------------------------' | 165 | * `-----------------------------------------------------------' |
| 154 | * |Gui |Alt |xxxxxxxxxxxxxxxxxxxxxxx|Alt |Gui| | 166 | * |Gui |Alt | Fn0 |Alt |Gui| |
| 155 | * `--------------------------------------------' | 167 | * `--------------------------------------------' |
| 156 | */ | 168 | */ |
| 157 | KEYMAP(MINS,0, 9, 8, 7, 6, 5, 4, 3, 2, 1, NO, NO, NO, ESC, \ | 169 | KEYMAP(MINS,0, 9, 8, 7, 6, 5, 4, 3, 2, 1, NO, NO, NO, ESC, \ |
| 158 | BSPC,P, O, I, U, Y, T, R, E, W, Q, NO, NO, TAB, \ | 170 | BSPC,P, O, I, U, Y, T, R, E, W, Q, NO, NO, TAB, \ |
| 159 | LCTL,SCLN,L, K, J, H, G, F, D, S, A, RCTL,RCTL, \ | 171 | LCTL,SCLN,L, K, J, H, G, F, D, S, A, RCTL,RCTL, \ |
| 160 | LSFT,SLSH,DOT, COMM,M, N, B, V, C, X, Z, RSFT,NO, \ | 172 | LSFT,SLSH,DOT, COMM,M, N, B, V, C, X, Z, RSFT,NO, \ |
| 161 | LGUI,LALT, FN5, RALT,RGUI), | 173 | LGUI,LALT, FN0, RALT,RGUI), |
| 162 | 174 | ||
| 163 | /* Layer5: another Mouse mode (Space) */ | 175 | /* Layer5: another Mouse mode (Space) */ |
| 164 | KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ | 176 | KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \ |
| 165 | TAB, NO, NO, NO, NO, NO, WH_L,WH_D,WH_U,WH_R,NO, NO, NO, BSPC, \ | 177 | TAB, NO, NO, NO, NO, NO, WH_L,WH_D,WH_U,WH_R,NO, NO, NO, BSPC, \ |
| 166 | LCTL,NO, ACL0,ACL1,ACL2,NO, MS_L,MS_D,MS_U,MS_R,FN3, NO, ENT, \ | 178 | LCTL,NO, ACL0,ACL1,ACL2,NO, MS_L,MS_D,MS_U,MS_R,FN0, NO, ENT, \ |
| 167 | LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,BTN4,BTN5,NO, RSFT,NO, \ | 179 | LSFT,NO, NO, NO, NO, BTN3,BTN2,BTN1,BTN4,BTN5,NO, RSFT,NO, \ |
| 168 | LGUI,LALT, FN5, RALT,RGUI), | 180 | LGUI,LALT, FN0, RALT,RGUI), |
| 169 | }; | 181 | }; |
| 170 | 182 | ||
| 171 | #define KEYCODE(layer, row, col) (pgm_read_byte(&keymaps[(layer)][(row)][(col)])) | 183 | #define KEYCODE(layer, row, col) (pgm_read_byte(&keymaps[(layer)][(row)][(col)])) |
| @@ -183,39 +195,31 @@ action_t keymap_get_action(uint8_t layer, uint8_t row, uint8_t col) { | |||
| 183 | action_t action; | 195 | action_t action; |
| 184 | switch (key) { | 196 | switch (key) { |
| 185 | case KC_A ... KC_EXSEL: | 197 | case KC_A ... KC_EXSEL: |
| 186 | action = (action_t)ACTION_KEY(key); | 198 | action.code = ACTION_KEY(key); |
| 187 | break; | 199 | break; |
| 188 | case KC_SYSTEM_POWER ... KC_SYSTEM_WAKE: | 200 | case KC_SYSTEM_POWER ... KC_SYSTEM_WAKE: |
| 189 | action = (action_t)ACTION_USAGE_SYSTEM(KEYCODE2SYSTEM(key)); | 201 | action.code = ACTION_USAGE_SYSTEM(KEYCODE2SYSTEM(key)); |
| 190 | break; | 202 | break; |
| 191 | case KC_AUDIO_MUTE ... KC_WWW_FAVORITES: | 203 | case KC_AUDIO_MUTE ... KC_WWW_FAVORITES: |
| 192 | action = (action_t)ACTION_USAGE_CONSUMER(KEYCODE2CONSUMER(key)); | 204 | action.code = ACTION_USAGE_CONSUMER(KEYCODE2CONSUMER(key)); |
| 193 | break; | 205 | break; |
| 194 | case KC_MS_UP ... KC_MS_ACCEL2: | 206 | case KC_MS_UP ... KC_MS_ACCEL2: |
| 195 | action = (action_t)ACTION_MOUSEKEY(key); | 207 | action.code = ACTION_MOUSEKEY(key); |
| 196 | break; | 208 | break; |
| 197 | case KC_LCTRL ... KC_LGUI: | 209 | case KC_LCTRL ... KC_LGUI: |
| 198 | action = (action_t)ACTION_LMODS(MOD_BIT(key)); | 210 | action.code = ACTION_LMODS(MOD_BIT(key)); |
| 199 | break; | 211 | break; |
| 200 | case KC_RCTRL ... KC_RGUI: | 212 | case KC_RCTRL ... KC_RGUI: |
| 201 | action = (action_t)ACTION_RMODS(MOD_BIT(key)>>4); | 213 | action.code = ACTION_RMODS(MOD_BIT(key)>>4); |
| 202 | break; | 214 | break; |
| 203 | case KC_FN0 ... KC_FN7: | 215 | case KC_FN0 ... KC_FN7: |
| 204 | action = (action_t)pgm_read_word(&fn_actions[FN_INDEX(key)]); | 216 | action.code = pgm_read_word(&fn_actions[FN_INDEX(key)]); |
| 205 | break; | 217 | break; |
| 206 | case KC_NO ... KC_UNDEFINED: | 218 | case KC_NO ... KC_UNDEFINED: |
| 207 | default: | 219 | default: |
| 208 | action = (action_t)NO_ACTION; | 220 | action.code = ACTION_NO; |
| 209 | break; | 221 | break; |
| 210 | } | 222 | } |
| 211 | debug("action: "); debug_hex16(action.code); debug("\n"); | 223 | debug("action: "); debug_hex16(action.code); debug("\n"); |
| 212 | return action; | 224 | return action; |
| 213 | } | 225 | } |
| 214 | |||
| 215 | |||
| 216 | uint8_t keymap_process_event(keyevent_t event) | ||
| 217 | { | ||
| 218 | action_t action = keymap_get_action(current_layer, event.key.row, event.key.col); | ||
| 219 | action_exec(action, event); | ||
| 220 | return 0; | ||
| 221 | } | ||
