You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

421 lines
15 KiB

  1. #include "iris.h"
  2. #include "action_layer.h"
  3. #include "eeconfig.h"
  4. extern keymap_config_t keymap_config;
  5. #define _QWERTY 0
  6. #define _COLEMAK 1
  7. #define _RLAYER 2
  8. #define _LLAYER 3
  9. #define _DUAL 4
  10. #define _CONFIG 5
  11. enum custom_keycodes {
  12. QWERTY = SAFE_RANGE, // qwerty base layer
  13. COLEMAK, // colemak base layer
  14. RLAYER, // right layer
  15. LLAYER, // left layer
  16. RLOCK, // right layer LOCK
  17. LLOCK, // left layer LOCK
  18. DUAL, // right and left combo layer
  19. CONFIG, // config layer
  20. LEDUP, // custom LED brightness increase keycode
  21. LEDDOWN, // custom LED brightness decrease keycode
  22. };
  23. /* Tap Dance */
  24. enum {
  25. TD_LGUIAPP, // LGUI x1, app/menu x2
  26. TD_SHIFTCAPS, // LSHIFT x1, CAPS x3
  27. TD_CTRLALTDL, // CTRL+ALT+DEL x3
  28. TD_SHIFTCLAT, // LSHIFT x1, LCRTL x2, LALT x3, CTRL+ALT x4
  29. };
  30. /* NOOP Key and Transparent */
  31. #define KC_ KC_TRNS
  32. #define KC_XXXX KC_NO
  33. /* LAYERS / CUSTOM KEYS */
  34. #define KC_LLAY LLAYER
  35. #define KC_RLAY RLAYER
  36. #define KC_RLOK RLOCK
  37. #define KC_LLOK LLOCK
  38. #define KC_QWER QWERTY
  39. #define KC_COLE COLEMAK
  40. #define KC_DUAL DUAL
  41. #define KC_CONF CONFIG
  42. #define KC_BLUP LEDUP
  43. #define KC_BLDN LEDDOWN
  44. /* Custom Shortened Keys (4 digits so they fit in my grid) */
  45. #define KC_MCTB LCTL(KC_TAB)
  46. #define KC_MCST LCTL(LSFT(KC_TAB))
  47. #define KC_CTEC CTL_T(KC_ESC)
  48. #define KC_SINS LSFT(KC_INS)
  49. #define KC_LGU1 LGUI(KC_1)
  50. #define KC_LGU2 LGUI(KC_2)
  51. #define KC_LGU3 LGUI(KC_3)
  52. #define KC_LGU4 LGUI(KC_4)
  53. #define KC_LGU5 LGUI(KC_5)
  54. #define KC_LGU6 LGUI(KC_6)
  55. #define KC_LGU7 LGUI(KC_7)
  56. #define KC_LGU8 LGUI(KC_8)
  57. #define KC_LGU9 LGUI(KC_9)
  58. #define KC_LGU0 LGUI(KC_0)
  59. #define KC_SYSR KC_SYSREQ
  60. #define KC_REST RESET
  61. /* Tap Dance */
  62. #define KC_LGUA TD(TD_LGUIAPP)
  63. #define KC_SHCP TD(TD_SHIFTCAPS)
  64. #define KC_CADL TD(TD_CTRLALTDL)
  65. #define KC_SHCA TD(TD_SHIFTCLAT)
  66. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  67. [_QWERTY] = LAYOUT_kc(
  68. //,----+----+----+----+----+----. ,----+----+----+----+----+----.
  69. CADL, 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,BSPC,
  70. //|----+----+----+----+----+----| |----+----+----+----+----+----|
  71. TAB , Q , W , E , R , T , Y , U , I , O , P ,DEL ,
  72. //|----+----+----+----+----+----| |----+----+----+----+----+----|
  73. CTEC, A , S , D , F , G , H , J , K , L ,SCLN,ENT ,
  74. //|----+----+----+----+----+----+----. ,----|----+----+----+----+----+----|
  75. SHCP, Z , X , C , V , B ,LLOK, RLOK, N , M ,COMM,DOT ,SLSH,SHCA,
  76. //`----+----+----+--+-+----+----+----/ \----+----+----+----+----+----+----'
  77. LALT,LLAY,TAB , SPC ,RLAY,LGUA
  78. // `----+----+----' `----+----+----'
  79. ),
  80. [_COLEMAK] = LAYOUT_kc(
  81. //,----+----+----+----+----+----. ,----+----+----+----+----+----.
  82. CADL, 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,BSPC,
  83. //|----+----+----+----+----+----| |----+----+----+----+----+----|
  84. TAB , Q , W , F , P , G , J , L , U , Y ,SCLN,DEL ,
  85. //|----+----+----+----+----+----| |----+----+----+----+----+----|
  86. CTEC, A , R , S , T , D , H , N , E , I , O ,ENT ,
  87. //|----+----+----+----+----+----+----. ,----|----+----+----+----+----+----|
  88. SHCP, Z , X , C , V , B ,LLOK, RLOK, K , M ,COMM,DOT ,SLSH,SHCA,
  89. //`----+----+----+--+-+----+----+----/ \----+----+----+----+----+----+----'
  90. LALT,LLAY,TAB , SPC ,RLAY,LGUA
  91. // `----+----+----' `----+----+----'
  92. ),
  93. [_RLAYER] = LAYOUT_kc(
  94. //,----+----+----+----+----+----. ,----+----+----+----+----+----.
  95. ,SLCK,SYSR,PSCR,INS ,PAUS, MUTE,VOLD,VOLU,BLDN,BLUP, ,
  96. //|----+----+----+----+----+----| |----+----+----+----+----+----|
  97. ,TILD,GRV ,EQL ,LBRC,RBRC, ASTR,HOME, UP ,PGUP,PLUS, ,
  98. //|----+----+----+----+----+----| |----+----+----+----+----+----|
  99. ,EXLM,PIPE,DLR ,LPRN,RPRN, AMPR,LEFT,DOWN,RGHT,MINS,QUOT,
  100. //|----+----+----+----+----+----+----. ,----|----+----+----+----+----+----|
  101. , AT ,HASH,PERC,LCBR,RCBR, , ,CIRC,END ,UNDS,PGDN,BSLS, ,
  102. //`----+----+----+--+-+----+----+----/ \----+----+----+----+----+----+----'
  103. , , , , ,
  104. // `----+----+----' `----+----+----'
  105. ),
  106. [_LLAYER] = LAYOUT_kc(
  107. //,----+----+----+----+----+----. ,----+----+----+----+----+----.
  108. , F1 , F2 , F3 , F4 , F5 , F6 , F7 , F8 , F9 ,F10 , ,
  109. //|----+----+----+----+----+----| |----+----+----+----+----+----|
  110. ,XXXX,XXXX, UP , F5 ,XXXX, ASTR, 7 , 8 , 9 ,PLUS, ,
  111. //|----+----+----+----+----+----| |----+----+----+----+----+----|
  112. ,XXXX,MCST,DOWN,MCTB,ENT , SLSH, 4 , 5 , 6 ,MINS, ,
  113. //|----+----+----+----+----+----+----. ,----|----+----+----+----+----+----|
  114. ,XXXX,XXXX,BSPC,SINS,SPC ,F11 , F12 ,EQL , 1 , 2 , 3 ,DOT , ,
  115. //`----+----+----+--+-+----+----+----/ \----+----+----+----+----+----+----'
  116. , , , 0 , ,
  117. // `----+----+----' `----+----+----'
  118. ),
  119. [_DUAL] = LAYOUT_kc(
  120. //,----+----+----+----+----+----. ,----+----+----+----+----+----.
  121. ,XXXX,XXXX,XXXX,XXXX,XXXX, XXXX,XXXX,XXXX,XXXX,XXXX,XXXX,
  122. //|----+----+----+----+----+----| |----+----+----+----+----+----|
  123. ,XXXX,XXXX,XXXX,XXXX,XXXX, XXXX,XXXX,MS_U,XXXX,XXXX,XXXX,
  124. //|----+----+----+----+----+----| |----+----+----+----+----+----|
  125. ,XXXX,XXXX,XXXX,XXXX,XXXX, BTN2,MS_L,MS_D,MS_R,BTN1,XXXX,
  126. //|----+----+----+----+----+----+----. ,----|----+----+----+----+----+----|
  127. ,LGU1,LGU2,LGU3,LGU4,LGU5,CONF, XXXX,LGU6,LGU7,LGU8,LGU9,LGU0, ,
  128. //`----+----+----+--+-+----+----+----/ \----+----+----+----+----+----+----'
  129. , , , , ,
  130. // `----+----+----' `----+----+----'
  131. ),
  132. [_CONFIG] = LAYOUT_kc(
  133. //,----+----+----+----+----+----. ,----+----+----+----+----+----.
  134. REST,XXXX,XXXX,XXXX,XXXX,XXXX, XXXX,XXXX,XXXX,XXXX,XXXX,XXXX,
  135. //|----+----+----+----+----+----| |----+----+----+----+----+----|
  136. XXXX,QWER,XXXX,XXXX,XXXX,XXXX, XXXX,XXXX,XXXX,XXXX,XXXX,XXXX,
  137. //|----+----+----+----+----+----| |----+----+----+----+----+----|
  138. XXXX,XXXX,XXXX,XXXX,XXXX,XXXX, XXXX,XXXX,XXXX,XXXX,XXXX,XXXX,
  139. //|----+----+----+----+----+----+----. ,----|----+----+----+----+----+----|
  140. XXXX,XXXX,XXXX,COLE,XXXX,XXXX, , ,XXXX,XXXX,XXXX,XXXX,XXXX,XXXX,
  141. //`----+----+----+--+-+----+----+----/ \----+----+----+----+----+----+----'
  142. XXXX, ,XXXX, XXXX, ,XXXX
  143. // `----+----+----' `----+----+----'
  144. ),
  145. };
  146. /* VARIABLES */
  147. // Configurable Variables for layer toggled light
  148. int layerBLStep = 20; // change how much the brightness changes when holding layer key
  149. int breathPulse = 5; // timing of the breathing
  150. int breathPulseStall = 3; // time to pause at top and bottom of breath cycle
  151. int blSteps = 6; // blSteps + 1 is the amount of brightness settings when manually adjusting
  152. // Variables needed for layer locked breathing and layer toggling lighting to work
  153. int counter = 0;
  154. bool breathUp = true;
  155. bool resetBL = false;
  156. bool rlocked = false;
  157. bool llocked = false;
  158. bool configOn = false;
  159. int lockedBLLevel;
  160. int momentaryLBLLevel;
  161. int momentaryRBLLevel;
  162. int currentBL;
  163. /* END VARIABLES */
  164. /* TAP DANCE */
  165. void shift_caps_down (qk_tap_dance_state_t *state, void *user_data) {
  166. if (state->count >= 3) {
  167. register_code (KC_CAPS);
  168. } else {
  169. register_code (KC_LSFT);
  170. }
  171. }
  172. void shift_caps_up (qk_tap_dance_state_t *state, void *user_data) {
  173. if (state->count >= 3) {
  174. unregister_code (KC_CAPS);
  175. } else {
  176. unregister_code (KC_LSFT);
  177. }
  178. }
  179. void shift_ctrlalt_down (qk_tap_dance_state_t *state, void *user_data) {
  180. if (state->count >= 4) {
  181. register_code (KC_LCTL);
  182. register_code (KC_LALT);
  183. } else if (state->count == 3) {
  184. register_code (KC_LALT);
  185. } else if (state->count == 2) {
  186. register_code (KC_LCTL);
  187. } else {
  188. register_code (KC_RSFT);
  189. }
  190. }
  191. void shift_ctlalt_up (qk_tap_dance_state_t *state, void *user_data) {
  192. if (state->count >= 4) {
  193. unregister_code (KC_LALT);
  194. unregister_code (KC_LCTL);
  195. } else if (state->count == 3) {
  196. unregister_code (KC_LALT);
  197. } else if (state->count == 2) {
  198. unregister_code (KC_LCTL);
  199. } else {
  200. unregister_code (KC_RSFT);
  201. }
  202. }
  203. void ctrlaltdel_up (qk_tap_dance_state_t *state, void *user_data) {
  204. if (state->count >= 3) {
  205. unregister_code (KC_DEL);
  206. unregister_code (KC_LALT);
  207. unregister_code (KC_LCTL);
  208. } else {
  209. }
  210. }
  211. void ctrlaltdel_down (qk_tap_dance_state_t *state, void *user_data) {
  212. if (state->count >= 3) {
  213. register_code (KC_LCTL);
  214. register_code (KC_LALT);
  215. register_code (KC_DEL);
  216. } else {
  217. }
  218. }
  219. qk_tap_dance_action_t tap_dance_actions[] = {
  220. [TD_LGUIAPP] = ACTION_TAP_DANCE_DOUBLE(KC_LGUI, KC_APP),
  221. [TD_SHIFTCAPS] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, shift_caps_down, shift_caps_up),
  222. [TD_SHIFTCLAT] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, shift_ctrlalt_down, shift_ctlalt_up),
  223. [TD_CTRLALTDL] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, ctrlaltdel_down, ctrlaltdel_up)
  224. };
  225. /* END TAP DANCE */
  226. void persistent_default_layer_set(uint16_t default_layer) {
  227. eeconfig_update_default_layer(default_layer);
  228. default_layer_set(default_layer);
  229. }
  230. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  231. switch (keycode) {
  232. case QWERTY:
  233. if (record->event.pressed) {
  234. set_single_persistent_default_layer(_QWERTY);
  235. configOn = false;
  236. if (momentaryRBLLevel != 0 || momentaryLBLLevel != 0){
  237. backlight_toggle();
  238. }
  239. }
  240. return false;
  241. break;
  242. case COLEMAK:
  243. if (record->event.pressed) {
  244. set_single_persistent_default_layer(_COLEMAK);
  245. configOn = false;
  246. if (momentaryRBLLevel != 0 || momentaryLBLLevel != 0){
  247. backlight_toggle();
  248. }
  249. }
  250. return false;
  251. break;
  252. case CONFIG:
  253. if (record->event.pressed) {
  254. set_single_persistent_default_layer(_CONFIG);
  255. configOn = true;
  256. if (momentaryRBLLevel != 0 || momentaryLBLLevel != 0){
  257. backlight_toggle();
  258. }
  259. }
  260. return false;
  261. break;
  262. case RLAYER:
  263. if (record->event.pressed) {
  264. layer_on(_RLAYER);
  265. update_tri_layer(_RLAYER, _LLAYER, _DUAL);
  266. momentaryRBLLevel = get_backlight_level();
  267. if (momentaryRBLLevel != 0 || momentaryLBLLevel != 0){
  268. for (int i = 0; i < layerBLStep ; i++){
  269. backlight_increase();
  270. }
  271. }
  272. } else {
  273. unregister_code(KC_LGUI);
  274. layer_off(_RLAYER);
  275. update_tri_layer(_RLAYER, _LLAYER, _DUAL);
  276. if ( llocked == false && configOn == false ) {
  277. for (int i = 0; i < layerBLStep ; i++){
  278. backlight_decrease();
  279. }
  280. } else {
  281. }
  282. rlocked = false;
  283. }
  284. return false;
  285. break;
  286. case LLAYER:
  287. if (record->event.pressed) {
  288. layer_on(_LLAYER);
  289. update_tri_layer(_RLAYER, _LLAYER, _DUAL);
  290. momentaryLBLLevel = get_backlight_level();
  291. if (momentaryRBLLevel != 0 || momentaryLBLLevel != 0){
  292. for (int i = 0; i < layerBLStep ; i++){
  293. backlight_increase();
  294. }
  295. }
  296. } else {
  297. layer_off(_LLAYER);
  298. update_tri_layer(_RLAYER, _LLAYER, _DUAL);
  299. if ( rlocked == false && configOn == false ) {
  300. for (int i = 0; i < layerBLStep ; i++){
  301. backlight_decrease();
  302. }
  303. } else {
  304. }
  305. llocked = false;
  306. }
  307. return false;
  308. break;
  309. case RLOCK:
  310. if (record->event.pressed) {
  311. layer_on(_RLAYER);
  312. /* add logic to toggle backlight change when on a layer */
  313. if (rlocked == false && llocked == false){
  314. lockedBLLevel = get_backlight_level();
  315. }
  316. rlocked = true;
  317. } else {
  318. }
  319. return false;
  320. break;
  321. case LLOCK:
  322. if (record->event.pressed) {
  323. layer_on(_LLAYER);
  324. /* add logic to toggle backlight change when on a layer */
  325. if (rlocked == false && llocked == false){
  326. lockedBLLevel = get_backlight_level();
  327. }
  328. llocked = true;
  329. } else {
  330. }
  331. return false;
  332. break;
  333. case LEDUP:
  334. if (record->event.pressed) {
  335. for (int i = 0; i < (BACKLIGHT_LEVELS / blSteps ) ; i++ ){
  336. backlight_increase();
  337. }
  338. } else {
  339. }
  340. return false;
  341. break;
  342. case LEDDOWN:
  343. if (record->event.pressed) {
  344. for (int i = 0; i < (BACKLIGHT_LEVELS / blSteps ) ; i++ ){
  345. backlight_decrease();
  346. }
  347. } else {
  348. }
  349. return false;
  350. break;
  351. }
  352. return true;
  353. }
  354. // LED breathing when a layer is locked
  355. void matrix_scan_user(void) {
  356. // Only breath if layer is locked
  357. if (lockedBLLevel != 0 && (rlocked || llocked)){
  358. // counter to slow down the breathing
  359. if (counter >= breathPulse) {
  360. counter = 0;
  361. // iterate brightness up or down
  362. if (breathUp){
  363. backlight_increase();
  364. } else {
  365. backlight_decrease();
  366. }
  367. // figure out if we need to change directions
  368. currentBL = get_backlight_level();
  369. if (currentBL >= BACKLIGHT_LEVELS){
  370. breathUp = false;
  371. // make counter a big negative number to add some stall time
  372. counter = ((BACKLIGHT_LEVELS * breathPulseStall) * (-1));
  373. } else if (currentBL == 0){
  374. breathUp = true;
  375. // make counter a big negative number to add some stall time
  376. counter = ((BACKLIGHT_LEVELS * breathPulseStall) * (-1));
  377. }
  378. // make not that we need to change the brightness back to when we started the breathing
  379. resetBL = true;
  380. } else {
  381. counter++;
  382. }
  383. } else {
  384. // get the brightness back to the level it started at
  385. if (resetBL){
  386. int i = 0;
  387. // i is just there to make sure i don't get stuck in a loop if for some reason get_backlight_level isn't working as expected
  388. while (get_backlight_level() != lockedBLLevel && i <= BACKLIGHT_LEVELS ){
  389. backlight_step();
  390. i++;
  391. }
  392. resetBL = false;
  393. }
  394. }
  395. }