keymap.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. // Copyright 2022 Christopher Courtney, aka Drashna Jael're (@drashna) <drashna@live.com>
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include QMK_KEYBOARD_H
  4. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  5. [0] = LAYOUT(
  6. KC_MPLY, XXXXXXX, XXXXXXX, XXXXXXX,
  7. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  8. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  9. RGB_TOG, XXXXXXX, XXXXXXX, TO(1)
  10. ),
  11. [1] = LAYOUT(
  12. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  13. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  14. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  15. XXXXXXX, XXXXXXX, XXXXXXX, TO(2)
  16. ),
  17. [2] = LAYOUT(
  18. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  19. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  20. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  21. XXXXXXX, XXXXXXX, XXXXXXX, TO(3)
  22. ),
  23. [3] = LAYOUT(
  24. XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
  25. QK_KB_0, QK_KB_1, QK_KB_3, QK_KB_5,
  26. XXXXXXX, QK_KB_2, QK_KB_4, QK_KB_6,
  27. XXXXXXX, XXXXXXX, XXXXXXX, TO(0)
  28. )
  29. };
  30. #if defined(ENCODER_MAP_ENABLE)
  31. const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
  32. { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(C(KC_Z), C(KC_Y)) },
  33. { ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______) },
  34. { ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______) },
  35. { ENCODER_CCW_CW(_______, _______), ENCODER_CCW_CW(_______, _______) }
  36. };
  37. #endif
  38. typedef union {
  39. uint32_t raw;
  40. struct {
  41. uint8_t led_level : 3;
  42. };
  43. } work_louder_config_t;
  44. work_louder_config_t work_louder_config;
  45. #define WL_LED_MAX_BRIGHT 75
  46. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  47. switch (keycode) {
  48. case QK_KB_9:
  49. if (record->event.pressed) {
  50. work_louder_config.led_level++;
  51. if (work_louder_config.led_level > 4) {
  52. work_louder_config.led_level = 1;
  53. }
  54. work_louder_micro_led_all_set((uint8_t)(work_louder_config.led_level * WL_LED_MAX_BRIGHT / 4));
  55. eeconfig_update_user(work_louder_config.raw);
  56. layer_state_set_kb(layer_state);
  57. }
  58. break;
  59. }
  60. return true;
  61. }
  62. layer_state_t layer_state_set_user(layer_state_t state) {
  63. layer_state_cmp(state, 1) ? work_louder_micro_led_1_on(): work_louder_micro_led_1_off();
  64. layer_state_cmp(state, 2) ? work_louder_micro_led_2_on(): work_louder_micro_led_2_off();
  65. layer_state_cmp(state, 3) ? work_louder_micro_led_3_on(): work_louder_micro_led_3_off();
  66. return state;
  67. }
  68. void eeconfig_init_user(void) {
  69. work_louder_config.raw = 0;
  70. work_louder_config.led_level = 1;
  71. work_louder_micro_led_all_set((uint8_t)(work_louder_config.led_level * WL_LED_MAX_BRIGHT / 4));
  72. eeconfig_update_user(work_louder_config.raw);
  73. }
  74. void keyboard_post_init_user(void) {
  75. work_louder_config.raw = eeconfig_read_user();
  76. work_louder_micro_led_all_set((uint8_t)(work_louder_config.led_level * WL_LED_MAX_BRIGHT / 4));
  77. }
  78. void suspend_wakeup_init_user(void) {
  79. layer_state_set_user(layer_state);
  80. }
  81. enum via_indicator_value {
  82. id_wl_brightness = 1,
  83. id_wl_layer, // placeholder
  84. };
  85. void wl_config_set_value(uint8_t *data) {
  86. // data = [ value_id, value_data ]
  87. uint8_t *value_id = &(data[0]);
  88. uint8_t *value_data = &(data[1]);
  89. switch (*value_id) {
  90. case id_wl_brightness:
  91. work_louder_config.led_level = (uint8_t)*value_data;
  92. work_louder_micro_led_all_set((uint8_t)(work_louder_config.led_level * WL_LED_MAX_BRIGHT / 4));
  93. layer_state_set_kb(layer_state);
  94. break;
  95. // case id_wl_layer:
  96. // layer_move(*value_data);
  97. // break;
  98. }
  99. }
  100. void wl_config_get_value(uint8_t *data) {
  101. // data = [ value_id, value_data ]
  102. uint8_t *value_id = &(data[0]);
  103. uint8_t *value_data = &(data[1]);
  104. switch (*value_id) {
  105. case id_wl_brightness:
  106. *value_data = work_louder_config.led_level;
  107. break;
  108. // case id_wl_layer:
  109. // *value_data = get_highest_layer(layer_state);
  110. // break;
  111. }
  112. }
  113. void wl_config_save(void) {
  114. eeconfig_update_user(work_louder_config.raw);
  115. }
  116. void via_custom_value_command_kb(uint8_t *data, uint8_t length) {
  117. uint8_t *command_id = &(data[0]);
  118. uint8_t *channel_id = &(data[1]);
  119. uint8_t *value_id_and_data = &(data[2]);
  120. if (*channel_id == id_custom_channel) {
  121. switch (*command_id) {
  122. case id_custom_set_value: {
  123. wl_config_set_value(value_id_and_data);
  124. break;
  125. }
  126. case id_custom_get_value: {
  127. wl_config_get_value(value_id_and_data);
  128. break;
  129. }
  130. case id_custom_save: {
  131. wl_config_save();
  132. break;
  133. }
  134. default: {
  135. // Unhandled message.
  136. *command_id = id_unhandled;
  137. break;
  138. }
  139. }
  140. return;
  141. }
  142. *command_id = id_unhandled;
  143. }