mirror of
				https://github.com/mfulz/qmk_firmware.git
				synced 2025-10-31 21:32:31 +01:00 
			
		
		
		
	Update Helix 'led_test' keymap (#3292)
* now helix led_test local rgblight.[ch] not use. remove. * greatly simplify keyboards/helix/rev2/keymaps/led_test/keymap.c Helix keymap 'led_test' use modified default/keymap.c
This commit is contained in:
		
							parent
							
								
									df73b74b55
								
							
						
					
					
						commit
						c197d080c4
					
				| @ -510,7 +510,14 @@ void music_scale_user(void) | ||||
| //SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h
 | ||||
| #ifdef SSD1306OLED | ||||
| 
 | ||||
| // hook point for 'led_test' keymap
 | ||||
| //   'default' keymap's led_test_init() is empty function, do nothing
 | ||||
| //   'led_test' keymap's led_test_init() force rgblight_mode_noeeprom(35);
 | ||||
| __attribute__ ((weak)) | ||||
| void led_test_init(void) {} | ||||
| 
 | ||||
| void matrix_scan_user(void) { | ||||
|      led_test_init(); | ||||
|      iota_gfx_task();  // this is what updates the display continuously
 | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -1,618 +1 @@ | ||||
| #include QMK_KEYBOARD_H | ||||
| #include "bootloader.h" | ||||
| #ifdef PROTOCOL_LUFA | ||||
| #include "lufa.h" | ||||
| #include "split_util.h" | ||||
| #endif | ||||
| #ifdef AUDIO_ENABLE | ||||
|   #include "audio.h" | ||||
| #endif | ||||
| #ifdef SSD1306OLED | ||||
|   #include "ssd1306.h" | ||||
| #endif | ||||
| 
 | ||||
| extern keymap_config_t keymap_config; | ||||
| 
 | ||||
| #ifdef RGBLIGHT_ENABLE | ||||
| //Following line allows macro to read current RGB settings
 | ||||
| extern rgblight_config_t rgblight_config; | ||||
| #endif | ||||
| 
 | ||||
| extern uint8_t is_master; | ||||
| 
 | ||||
| // Each layer gets a name for readability, which is then used in the keymap matrix below.
 | ||||
| // The underscores don't mean anything - you can have a layer called STUFF or any other name.
 | ||||
| // Layer names don't all need to be of the same length, obviously, and you can also skip them
 | ||||
| // entirely and just use numbers.
 | ||||
| #define _QWERTY 0 | ||||
| #define _COLEMAK 1 | ||||
| #define _DVORAK 2 | ||||
| #define _LOWER 3 | ||||
| #define _RAISE 4 | ||||
| #define _ADJUST 6 | ||||
| 
 | ||||
| enum custom_keycodes { | ||||
|   QWERTY = SAFE_RANGE, | ||||
|   COLEMAK, | ||||
|   DVORAK, | ||||
|   LOWER, | ||||
|   RAISE, | ||||
|   ADJUST, | ||||
|   BACKLIT, | ||||
|   EISU, | ||||
|   KANA, | ||||
|   RGBRST | ||||
| }; | ||||
| 
 | ||||
| enum macro_keycodes { | ||||
|   KC_SAMPLEMACRO, | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| // Fillers to make layering more clear
 | ||||
| #define _______ KC_TRNS | ||||
| #define XXXXXXX KC_NO | ||||
| //Macros
 | ||||
| #define M_SAMPLE M(KC_SAMPLEMACRO) | ||||
| 
 | ||||
| #if HELIX_ROWS == 5 | ||||
| const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||
| 
 | ||||
|   /* Qwerty
 | ||||
|    * ,-----------------------------------------.             ,-----------------------------------------. | ||||
|    * |   `  |   1  |   2  |   3  |   4  |   5  |             |   6  |   7  |   8  |   9  |   0  | Del  | | ||||
|    * |------+------+------+------+------+------|             |------+------+------+------+------+------| | ||||
|    * | Tab  |   Q  |   W  |   E  |   R  |   T  |             |   Y  |   U  |   I  |   O  |   P  | Bksp | | ||||
|    * |------+------+------+------+------+------|             |------+------+------+------+------+------| | ||||
|    * | Ctrl |   A  |   S  |   D  |   F  |   G  |             |   H  |   J  |   K  |   L  |   ;  |  '   | | ||||
|    * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| | ||||
|    * | Shift|   Z  |   X  |   C  |   V  |   B  |   [  |   ]  |   N  |   M  |   ,  |   .  |   /  |Enter | | ||||
|    * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| | ||||
|    * |Adjust| Esc  | Alt  | GUI  | EISU |Lower |Space |Space |Raise | KANA | Left | Down |  Up  |Right | | ||||
|    * `-------------------------------------------------------------------------------------------------' | ||||
|    */ | ||||
|   [_QWERTY] = LAYOUT( \ | ||||
|       KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,                      KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_DEL, \ | ||||
|       KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,                      KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC, \ | ||||
|       KC_LCTL, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,                      KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT, \ | ||||
|       KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_LBRC, KC_RBRC, KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT , \ | ||||
|       ADJUST,  KC_ESC,  KC_LALT, KC_LGUI, EISU,    LOWER,   KC_SPC,  KC_SPC,  RAISE,   KANA,    KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT \ | ||||
|       ), | ||||
| 
 | ||||
|   /* Colemak
 | ||||
|    * ,-----------------------------------------.             ,-----------------------------------------. | ||||
|    * |   `  |   1  |   2  |   3  |   4  |   5  |             |   6  |   7  |   8  |   9  |   0  | Del  | | ||||
|    * |------+------+------+------+------+------|             |------+------+------+------+------+------| | ||||
|    * | Tab  |   Q  |   W  |   F  |   P  |   G  |             |   J  |   L  |   U  |   Y  |   ;  | Bksp | | ||||
|    * |------+------+------+------+------+------|             |------+------+------+------+------+------| | ||||
|    * | Ctrl |   A  |   R  |   S  |   T  |   D  |             |   H  |   N  |   E  |   I  |   O  |  '   | | ||||
|    * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| | ||||
|    * | Shift|   Z  |   X  |   C  |   V  |   B  |   [  |   ]  |   K  |   M  |   ,  |   .  |   /  |Enter | | ||||
|    * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| | ||||
|    * |Adjust| Esc  | Alt  | GUI  | EISU |Lower |Space |Space |Raise | KANA | Left | Down |  Up  |Right | | ||||
|    * `-------------------------------------------------------------------------------------------------' | ||||
|    */ | ||||
|   [_COLEMAK] = LAYOUT( \ | ||||
|       KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,                      KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_DEL, \ | ||||
|       KC_TAB,  KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,                      KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN, KC_BSPC, \ | ||||
|       KC_LCTL, KC_A,    KC_R,    KC_S,    KC_T,    KC_D,                      KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    KC_QUOT, \ | ||||
|       KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_LBRC, KC_RBRC, KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT , \ | ||||
|       ADJUST,  KC_ESC,  KC_LALT, KC_LGUI, EISU,    LOWER,   KC_SPC,  KC_SPC,  RAISE,   KANA,    KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT \ | ||||
|       ), | ||||
| 
 | ||||
|   /* Dvorak
 | ||||
|    * ,-----------------------------------------.             ,-----------------------------------------. | ||||
|    * |   `  |   1  |   2  |   3  |   4  |   5  |             |   6  |   7  |   8  |   9  |   0  | Bksp | | ||||
|    * |------+------+------+------+------+------|             |------+------+------+------+------+------| | ||||
|    * | Tab  |   '  |   ,  |   .  |   P  |   Y  |             |   F  |   G  |   C  |   R  |   L  | Del  | | ||||
|    * |------+------+------+------+------+------|             |------+------+------+------+------+------| | ||||
|    * | Ctrl |   A  |   O  |   E  |   U  |   I  |             |   D  |   H  |   T  |   N  |   S  |  /   | | ||||
|    * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| | ||||
|    * | Shift|   ;  |   Q  |   J  |   K  |   X  |   [  |   ]  |   B  |   M  |   W  |   V  |   Z  |Enter | | ||||
|    * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| | ||||
|    * |Adjust| Esc  | Alt  | GUI  | EISU |Lower |Space |Space |Raise | KANA | Left | Down |  Up  |Right | | ||||
|    * `-------------------------------------------------------------------------------------------------' | ||||
|    */ | ||||
|   [_DVORAK] = LAYOUT( \ | ||||
|       KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,                      KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC, \ | ||||
|       KC_TAB,  KC_QUOT, KC_COMM, KC_DOT,  KC_P,    KC_Y,                      KC_F,    KC_G,    KC_C,    KC_R,    KC_L,    KC_DEL, \ | ||||
|       KC_LCTL, KC_A,    KC_O,    KC_E,    KC_U,    KC_I,                      KC_D,    KC_H,    KC_T,    KC_N,    KC_S,    KC_SLSH, \ | ||||
|       KC_LSFT, KC_SCLN, KC_Q,    KC_J,    KC_K,    KC_X,    KC_LBRC, KC_RBRC, KC_B,    KC_M,    KC_W,    KC_V,    KC_Z,    KC_ENT , \ | ||||
|       ADJUST,  KC_ESC,  KC_LALT, KC_LGUI, EISU,    LOWER,   KC_SPC,  KC_SPC,  RAISE,   KANA,    KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT \ | ||||
|       ), | ||||
| 
 | ||||
|   /* Lower
 | ||||
|    * ,-----------------------------------------.             ,-----------------------------------------. | ||||
|    * |   ~  |   !  |   @  |   #  |   $  |   %  |             |   ^  |   &  |   *  |   (  |   )  |      | | ||||
|    * |------+------+------+------+------+------|             |------+------+------+------+------+------| | ||||
|    * |   ~  |   !  |   @  |   #  |   $  |   %  |             |   ^  |   &  |   *  |   (  |   )  |      | | ||||
|    * |------+------+------+------+------+------|             |------+------+------+------+------+------| | ||||
|    * |      |  F1  |  F2  |  F3  |  F4  |  F5  |             |  F6  |   _  |   +  |   {  |   }  |  |   | | ||||
|    * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| | ||||
|    * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  (   |   )  |  F12 |      |      | Home | End  |      | | ||||
|    * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| | ||||
|    * |      |      |      |      |      |      |      |      |      |      | Next | Vol- | Vol+ | Play | | ||||
|    * `-------------------------------------------------------------------------------------------------' | ||||
|    */ | ||||
|   [_LOWER] = LAYOUT( \ | ||||
|       KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC,                   KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, \ | ||||
|       KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC,                   KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, \ | ||||
|       _______, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,                     KC_F6,   KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ | ||||
|       _______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_LPRN, KC_RPRN, KC_F12,  _______, _______, KC_HOME, KC_END,  _______, \ | ||||
|       _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ | ||||
|       ), | ||||
| 
 | ||||
|   /* Raise
 | ||||
|    * ,-----------------------------------------.             ,-----------------------------------------. | ||||
|    * |   `  |   1  |   2  |   3  |   4  |   5  |             |   6  |   7  |   8  |   9  |   0  | Bksp | | ||||
|    * |------+------+------+------+------+------|             |------+------+------+------+------+------| | ||||
|    * |   `  |   1  |   2  |   3  |   4  |   5  |             |   6  |   7  |   8  |   9  |   0  | Del  | | ||||
|    * |------+------+------+------+------+------|             |------+------+------+------+------+------| | ||||
|    * |      |  F1  |  F2  |  F3  |  F4  |  F5  |             |  F6  |   -  |   =  |   [  |   ]  |  \   | | ||||
|    * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| | ||||
|    * |      |  F7  |  F8  |  F9  |  F10 |  F11 |      |      |  F12 |      |      |PageDn|PageUp|      | | ||||
|    * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| | ||||
|    * |      |      |      |      |      |      |      |      |      |      | Next | Vol- | Vol+ | Play | | ||||
|    * `-------------------------------------------------------------------------------------------------' | ||||
|    */ | ||||
|   [_RAISE] = LAYOUT( \ | ||||
|       KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,                      KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC, \ | ||||
|       KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,                      KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_DEL, \ | ||||
|       _______, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,                     KC_F6,   KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS, \ | ||||
|       _______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  _______, _______, KC_F12,  _______, _______, KC_PGDN, KC_PGUP, _______, \ | ||||
|       _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ | ||||
|       ), | ||||
| 
 | ||||
|   /* Adjust (Lower + Raise)
 | ||||
|    * ,-----------------------------------------.             ,-----------------------------------------. | ||||
|    * |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |             |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 | | ||||
|    * |------+------+------+------+------+------|             |------+------+------+------+------+------| | ||||
|    * |      | Reset|RGBRST|      |      |      |             |      |      |      |      |      |  Del | | ||||
|    * |------+------+------+------+------+------|             |------+------+------+------+------+------| | ||||
|    * |      |      |      |Aud on|Audoff| Mac  |             | Win  |Qwerty|Colemk|Dvorak|      |      | | ||||
|    * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| | ||||
|    * |      |      |      |      |      |      |      |      |      |      |RGB ON| HUE+ | SAT+ | VAL+ | | ||||
|    * |------+------+------+------+------+------+------+------+------+------+------+------+------+------| | ||||
|    * |      |      |      |      |      |      |      |      |      |      | MODE | HUE- | SAT- | VAL- | | ||||
|    * `-------------------------------------------------------------------------------------------------' | ||||
|    */ | ||||
|   [_ADJUST] =  LAYOUT( \ | ||||
|       KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,                     KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12, \ | ||||
|       _______, RESET,   RGBRST,  _______, _______, _______,                   _______, _______, _______, _______, _______, KC_DEL, \ | ||||
|       _______, _______, _______, AU_ON,   AU_OFF,  AG_NORM,                   AG_SWAP, QWERTY,  COLEMAK, DVORAK,  _______, _______, \ | ||||
|       _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, \ | ||||
|       _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SMOD,RGB_HUD, RGB_SAD, RGB_VAD \ | ||||
|       ) | ||||
| }; | ||||
| 
 | ||||
| #elif HELIX_ROWS == 4 | ||||
| 
 | ||||
| const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||
| 
 | ||||
|   /* Qwerty
 | ||||
|    * ,-----------------------------------------.             ,-----------------------------------------. | ||||
|    * | Tab  |   Q  |   W  |   E  |   R  |   T  |             |   Y  |   U  |   I  |   O  |   P  | Bksp | | ||||
|    * |------+------+------+------+------+------|             |------+------+------+------+------+------| | ||||
|    * | Ctrl |   A  |   S  |   D  |   F  |   G  |             |   H  |   J  |   K  |   L  |   ;  |  '   | | ||||
|    * |------+------+------+------+------+------|             |------+------+------+------+------+------| | ||||
|    * | Shift|   Z  |   X  |   C  |   V  |   B  |             |   N  |   M  |   ,  |   .  |   /  |Enter | | ||||
|    * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| | ||||
|    * |Adjust| Esc  | Alt  | GUI  | EISU |Lower |Space |Space |Raise | KANA | Left | Down |  Up  |Right | | ||||
|    * `-------------------------------------------------------------------------------------------------' | ||||
|    */ | ||||
|   [_QWERTY] = LAYOUT( \ | ||||
|       KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,                      KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC, \ | ||||
|       KC_LCTL, KC_A,    KC_S,    KC_D,    KC_F,    KC_G,                      KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT, \ | ||||
|       KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,                      KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT , \ | ||||
|       ADJUST,  KC_ESC,  KC_LALT, KC_LGUI, EISU,    LOWER,   KC_SPC,  KC_SPC,  RAISE,   KANA,    KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT \ | ||||
|       ), | ||||
| 
 | ||||
|   /* Colemak
 | ||||
|    * ,-----------------------------------------.             ,-----------------------------------------. | ||||
|    * | Tab  |   Q  |   W  |   F  |   P  |   G  |             |   J  |   L  |   U  |   Y  |   ;  | Bksp | | ||||
|    * |------+------+------+------+------+------|             |------+------+------+------+------+------| | ||||
|    * | Ctrl |   A  |   R  |   S  |   T  |   D  |             |   H  |   N  |   E  |   I  |   O  |  '   | | ||||
|    * |------+------+------+------+------+------|             |------+------+------+------+------+------| | ||||
|    * | Shift|   Z  |   X  |   C  |   V  |   B  |             |   K  |   M  |   ,  |   .  |   /  |Enter | | ||||
|    * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| | ||||
|    * |Adjust| Esc  | Alt  | GUI  | EISU |Lower |Space |Space |Raise | KANA | Left | Down |  Up  |Right | | ||||
|    * `-------------------------------------------------------------------------------------------------' | ||||
|    */ | ||||
|   [_COLEMAK] = LAYOUT( \ | ||||
|       KC_TAB,  KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,                      KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN, KC_BSPC, \ | ||||
|       KC_LCTL, KC_A,    KC_R,    KC_S,    KC_T,    KC_D,                      KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    KC_QUOT, \ | ||||
|       KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,                      KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT , \ | ||||
|       ADJUST,  KC_ESC,  KC_LALT, KC_LGUI, EISU,    LOWER,   KC_SPC,  KC_SPC,  RAISE,   KANA,    KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT \ | ||||
|       ), | ||||
| 
 | ||||
|   /* Dvorak
 | ||||
|    * ,-----------------------------------------.             ,-----------------------------------------. | ||||
|    * | Tab  |   '  |   ,  |   .  |   P  |   Y  |             |   F  |   G  |   C  |   R  |   L  | Del  | | ||||
|    * |------+------+------+------+------+------|             |------+------+------+------+------+------| | ||||
|    * | Ctrl |   A  |   O  |   E  |   U  |   I  |             |   D  |   H  |   T  |   N  |   S  |  /   | | ||||
|    * |------+------+------+------+------+------|             |------+------+------+------+------+------| | ||||
|    * | Shift|   ;  |   Q  |   J  |   K  |   X  |             |   B  |   M  |   W  |   V  |   Z  |Enter | | ||||
|    * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| | ||||
|    * |Adjust| Esc  | Alt  | GUI  | EISU |Lower |Space |Space |Raise | KANA | Left | Down |  Up  |Right | | ||||
|    * `-------------------------------------------------------------------------------------------------' | ||||
|    */ | ||||
|   [_DVORAK] = LAYOUT( \ | ||||
|       KC_TAB,  KC_QUOT, KC_COMM, KC_DOT,  KC_P,    KC_Y,                      KC_F,    KC_G,    KC_C,    KC_R,    KC_L,    KC_DEL, \ | ||||
|       KC_LCTL, KC_A,    KC_O,    KC_E,    KC_U,    KC_I,                      KC_D,    KC_H,    KC_T,    KC_N,    KC_S,    KC_SLSH, \ | ||||
|       KC_LSFT, KC_SCLN, KC_Q,    KC_J,    KC_K,    KC_X,                      KC_B,    KC_M,    KC_W,    KC_V,    KC_Z,    KC_ENT , \ | ||||
|       ADJUST,  KC_ESC,  KC_LALT, KC_LGUI, EISU,    LOWER,   KC_SPC,  KC_SPC,  RAISE,   KANA,    KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT \ | ||||
|       ), | ||||
| 
 | ||||
|   /* Lower
 | ||||
|    * ,-----------------------------------------.             ,-----------------------------------------. | ||||
|    * |   ~  |   !  |   @  |   #  |   $  |   %  |             |   ^  |   &  |   *  |   (  |   )  |      | | ||||
|    * |------+------+------+------+------+------|             |------+------+------+------+------+------| | ||||
|    * |      |  F1  |  F2  |  F3  |  F4  |  F5  |             |  F6  |   _  |   +  |   {  |   }  |  |   | | ||||
|    * |------+------+------+------+------+------|             |------+------+------+------+------+------| | ||||
|    * |      |  F7  |  F8  |  F9  |  F10 |  F11 |             |  F12 |      |      | Home | End  |      | | ||||
|    * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| | ||||
|    * |      |      |      |      |      |      |      |      |      |      | Next | Vol- | Vol+ | Play | | ||||
|    * `-------------------------------------------------------------------------------------------------' | ||||
|    */ | ||||
|   [_LOWER] = LAYOUT( \ | ||||
|       KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC,                   KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, \ | ||||
|       _______, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,                     KC_F6,   KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \ | ||||
|       _______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,                    KC_F12,  _______, _______, KC_HOME, KC_END,  _______, \ | ||||
|       _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ | ||||
|       ), | ||||
| 
 | ||||
|   /* Raise
 | ||||
|    * ,-----------------------------------------.             ,-----------------------------------------. | ||||
|    * |   `  |   1  |   2  |   3  |   4  |   5  |             |   6  |   7  |   8  |   9  |   0  | Del  | | ||||
|    * |------+------+------+------+------+------|             |------+------+------+------+------+------| | ||||
|    * |      |  F1  |  F2  |  F3  |  F4  |  F5  |             |  F6  |   -  |   =  |   [  |   ]  |  \   | | ||||
|    * |------+------+------+------+------+------|             |------+------+------+------+------+------| | ||||
|    * |      |  F7  |  F8  |  F9  |  F10 |  F11 |             |  F12 |      |      |PageDn|PageUp|      | | ||||
|    * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| | ||||
|    * |      |      |      |      |      |      |      |      |      |      | Next | Vol- | Vol+ | Play | | ||||
|    * `-------------------------------------------------------------------------------------------------' | ||||
|    */ | ||||
|   [_RAISE] = LAYOUT( \ | ||||
|       KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,                      KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_DEL, \ | ||||
|       _______, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,                     KC_F6,   KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS, \ | ||||
|       _______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,                    KC_F12,  _______, _______, KC_PGDN, KC_PGUP, _______, \ | ||||
|       _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \ | ||||
|       ), | ||||
| 
 | ||||
|   /* Adjust (Lower + Raise)
 | ||||
|    * ,-----------------------------------------.             ,-----------------------------------------. | ||||
|    * |      | Reset|      |      |      |      |             |      |      |      |      |      |  Del | | ||||
|    * |------+------+------+------+------+------|             |------+------+------+------+------+------| | ||||
|    * |      |      |      |Aud on|Audoff| Mac  |             | Win  |Qwerty|Colemk|Dvorak|      |      | | ||||
|    * |------+------+------+------+------+------|             |------+------+------+------+------+------| | ||||
|    * |      |      |      |      |      |      |             |      |      |RGB ON| HUE+ | SAT+ | VAL+ | | ||||
|    * |------+------+------+------+------+------+-------------+------+------+------+------+------+------| | ||||
|    * |      |      |      |      |      |      |      |      |      |      | MODE | HUE- | SAT- | VAL- | | ||||
|    * `-------------------------------------------------------------------------------------------------' | ||||
|    */ | ||||
|   [_ADJUST] =  LAYOUT( \ | ||||
|       _______, RESET,   _______, _______, _______, _______,                   _______, _______, _______, _______, _______, KC_DEL, \ | ||||
|       _______, _______, _______, AU_ON,   AU_OFF,  AG_NORM,                   AG_SWAP, QWERTY,  COLEMAK, DVORAK,  _______, _______, \ | ||||
|       _______, _______, _______, _______, _______, _______,                   _______, _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, \ | ||||
|       _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SMOD,RGB_HUD, RGB_SAD, RGB_VAD \ | ||||
|       ) | ||||
| }; | ||||
| 
 | ||||
| #else | ||||
| #error "undefined keymaps" | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| #ifdef AUDIO_ENABLE | ||||
| 
 | ||||
| float tone_qwerty[][2]     = SONG(QWERTY_SOUND); | ||||
| float tone_dvorak[][2]     = SONG(DVORAK_SOUND); | ||||
| float tone_colemak[][2]    = SONG(COLEMAK_SOUND); | ||||
| float tone_plover[][2]     = SONG(PLOVER_SOUND); | ||||
| float tone_plover_gb[][2]  = SONG(PLOVER_GOODBYE_SOUND); | ||||
| float music_scale[][2]     = SONG(MUSIC_SCALE_SOUND); | ||||
| #endif | ||||
| 
 | ||||
| // define variables for reactive RGB
 | ||||
| bool TOG_STATUS = false; | ||||
| int RGB_current_mode; | ||||
| 
 | ||||
| void persistent_default_layer_set(uint16_t default_layer) { | ||||
|   eeconfig_update_default_layer(default_layer); | ||||
|   default_layer_set(default_layer); | ||||
| } | ||||
| 
 | ||||
| // Setting ADJUST layer RGB back to default
 | ||||
| void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) { | ||||
|   if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) { | ||||
|     #ifdef RGBLIGHT_ENABLE | ||||
|       //rgblight_mode(RGB_current_mode);
 | ||||
|     #endif | ||||
|     layer_on(layer3); | ||||
|   } else { | ||||
|     layer_off(layer3); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| bool process_record_user(uint16_t keycode, keyrecord_t *record) { | ||||
|   switch (keycode) { | ||||
|     case QWERTY: | ||||
|       if (record->event.pressed) { | ||||
|         #ifdef AUDIO_ENABLE | ||||
|           PLAY_SONG(tone_qwerty); | ||||
|         #endif | ||||
|         persistent_default_layer_set(1UL<<_QWERTY); | ||||
|       } | ||||
|       return false; | ||||
|       break; | ||||
|     case COLEMAK: | ||||
|       if (record->event.pressed) { | ||||
|         #ifdef AUDIO_ENABLE | ||||
|           PLAY_SONG(tone_colemak); | ||||
|         #endif | ||||
|         persistent_default_layer_set(1UL<<_COLEMAK); | ||||
|       } | ||||
|       return false; | ||||
|       break; | ||||
|     case DVORAK: | ||||
|       if (record->event.pressed) { | ||||
|         #ifdef AUDIO_ENABLE | ||||
|           PLAY_SONG(tone_dvorak); | ||||
|         #endif | ||||
|         persistent_default_layer_set(1UL<<_DVORAK); | ||||
|       } | ||||
|       return false; | ||||
|       break; | ||||
|     case LOWER: | ||||
|       if (record->event.pressed) { | ||||
|           //not sure how to have keyboard check mode and set it to a variable, so my work around
 | ||||
|           //uses another variable that would be set to true after the first time a reactive key is pressed.
 | ||||
|         if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false
 | ||||
|         } else { | ||||
|           TOG_STATUS = !TOG_STATUS; | ||||
|           #ifdef RGBLIGHT_ENABLE | ||||
|             //rgblight_mode(16);
 | ||||
|           #endif | ||||
|         } | ||||
|         layer_on(_LOWER); | ||||
|         update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); | ||||
|       } else { | ||||
|         #ifdef RGBLIGHT_ENABLE | ||||
|           //rgblight_mode(RGB_current_mode);   // revert RGB to initial mode prior to RGB mode change
 | ||||
|         #endif | ||||
|         TOG_STATUS = false; | ||||
|         layer_off(_LOWER); | ||||
|         update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); | ||||
|       } | ||||
|       return false; | ||||
|       break; | ||||
|     case RAISE: | ||||
|       if (record->event.pressed) { | ||||
|         //not sure how to have keyboard check mode and set it to a variable, so my work around
 | ||||
|         //uses another variable that would be set to true after the first time a reactive key is pressed.
 | ||||
|         if (TOG_STATUS) { //TOG_STATUS checks is another reactive key currently pressed, only changes RGB mode if returns false
 | ||||
|         } else { | ||||
|           TOG_STATUS = !TOG_STATUS; | ||||
|           #ifdef RGBLIGHT_ENABLE | ||||
|             //rgblight_mode(15);
 | ||||
|           #endif | ||||
|         } | ||||
|         layer_on(_RAISE); | ||||
|         update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); | ||||
|       } else { | ||||
|         #ifdef RGBLIGHT_ENABLE | ||||
|           //rgblight_mode(RGB_current_mode);  // revert RGB to initial mode prior to RGB mode change
 | ||||
|         #endif | ||||
|         layer_off(_RAISE); | ||||
|         TOG_STATUS = false; | ||||
|         update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST); | ||||
|       } | ||||
|       return false; | ||||
|       break; | ||||
|     case ADJUST: | ||||
|         if (record->event.pressed) { | ||||
|           layer_on(_ADJUST); | ||||
|         } else { | ||||
|           layer_off(_ADJUST); | ||||
|         } | ||||
|         return false; | ||||
|         break; | ||||
|       //led operations - RGB mode change now updates the RGB_current_mode to allow the right RGB mode to be set after reactive keys are released
 | ||||
|     case RGB_MOD: | ||||
|       #ifdef RGBLIGHT_ENABLE | ||||
|         if (record->event.pressed) { | ||||
|           rgblight_mode(RGB_current_mode); | ||||
|           rgblight_step(); | ||||
|           RGB_current_mode = rgblight_config.mode; | ||||
|         } | ||||
|       #endif | ||||
|       return false; | ||||
|       break; | ||||
|     case EISU: | ||||
|       if (record->event.pressed) { | ||||
|         if(keymap_config.swap_lalt_lgui==false){ | ||||
|           register_code(KC_LANG2); | ||||
|         }else{ | ||||
|           SEND_STRING(SS_LALT("`")); | ||||
|         } | ||||
|       } else { | ||||
|         unregister_code(KC_LANG2); | ||||
|       } | ||||
|       return false; | ||||
|       break; | ||||
|     case KANA: | ||||
|       if (record->event.pressed) { | ||||
|         if(keymap_config.swap_lalt_lgui==false){ | ||||
|           register_code(KC_LANG1); | ||||
|         }else{ | ||||
|           SEND_STRING(SS_LALT("`")); | ||||
|         } | ||||
|       } else { | ||||
|         unregister_code(KC_LANG1); | ||||
|       } | ||||
|       return false; | ||||
|       break; | ||||
|     case RGBRST: | ||||
|       #ifdef RGBLIGHT_ENABLE | ||||
|         if (record->event.pressed) { | ||||
|           eeconfig_update_rgblight_default(); | ||||
|           rgblight_enable(); | ||||
|           RGB_current_mode = rgblight_config.mode; | ||||
|         } | ||||
|       #endif | ||||
|       break; | ||||
|   } | ||||
|   return true; | ||||
| } | ||||
| 
 | ||||
| void matrix_init_user(void) { | ||||
|     #ifdef AUDIO_ENABLE | ||||
|         startup_user(); | ||||
|     #endif | ||||
|     #ifdef RGBLIGHT_ENABLE | ||||
|       RGB_current_mode = rgblight_config.mode; | ||||
|     #endif | ||||
|     //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h
 | ||||
|     #ifdef SSD1306OLED | ||||
|         iota_gfx_init(!has_usb());   // turns on the display
 | ||||
|     #endif | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| #ifdef AUDIO_ENABLE | ||||
| 
 | ||||
| void startup_user() | ||||
| { | ||||
|     _delay_ms(20); // gets rid of tick
 | ||||
| } | ||||
| 
 | ||||
| void shutdown_user() | ||||
| { | ||||
|     _delay_ms(150); | ||||
|     stop_all_notes(); | ||||
| } | ||||
| 
 | ||||
| void music_on_user(void) | ||||
| { | ||||
|     music_scale_user(); | ||||
| } | ||||
| 
 | ||||
| void music_scale_user(void) | ||||
| { | ||||
|     PLAY_SONG(music_scale); | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| //SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h
 | ||||
| #ifdef SSD1306OLED | ||||
| 
 | ||||
| void matrix_scan_user(void) { | ||||
|     static int scan_count = 0; | ||||
|     if( scan_count == 2 ) { | ||||
|       rgblight_enable(); | ||||
|       rgblight_mode(35); | ||||
|     } | ||||
|     if( scan_count < 3 ) scan_count ++; | ||||
|      iota_gfx_task();  // this is what updates the display continuously
 | ||||
| } | ||||
| 
 | ||||
| void matrix_update(struct CharacterMatrix *dest, | ||||
|                           const struct CharacterMatrix *source) { | ||||
|   if (memcmp(dest->display, source->display, sizeof(dest->display))) { | ||||
|     memcpy(dest->display, source->display, sizeof(dest->display)); | ||||
|     dest->dirty = true; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| //assign the right code to your layers for OLED display
 | ||||
| #define L_BASE 0 | ||||
| #define L_LOWER 8 | ||||
| #define L_RAISE 16 | ||||
| #define L_FNLAYER 64 | ||||
| #define L_NUMLAY 128 | ||||
| #define L_NLOWER 136 | ||||
| #define L_NFNLAYER 192 | ||||
| #define L_MOUSECURSOR 256 | ||||
| #define L_ADJUST 65536 | ||||
| #define L_ADJUST_TRI 65560 | ||||
| 
 | ||||
| static void render_logo(struct CharacterMatrix *matrix) { | ||||
| 
 | ||||
|   static char logo[]={ | ||||
|     0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94, | ||||
|     0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4, | ||||
|     0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4, | ||||
|     0}; | ||||
|   matrix_write(matrix, logo); | ||||
|   //matrix_write_P(&matrix, PSTR(" Split keyboard kit"));
 | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| void render_status(struct CharacterMatrix *matrix) { | ||||
| 
 | ||||
|   // Render to mode icon
 | ||||
|   static char logo[][2][3]={{{0x95,0x96,0},{0xb5,0xb6,0}},{{0x97,0x98,0},{0xb7,0xb8,0}}}; | ||||
|   if(keymap_config.swap_lalt_lgui==false){ | ||||
|     matrix_write(matrix, logo[0][0]); | ||||
|     matrix_write_P(matrix, PSTR("\n")); | ||||
|     matrix_write(matrix, logo[0][1]); | ||||
|   }else{ | ||||
|     matrix_write(matrix, logo[1][0]); | ||||
|     matrix_write_P(matrix, PSTR("\n")); | ||||
|     matrix_write(matrix, logo[1][1]); | ||||
|   } | ||||
| 
 | ||||
|   // Define layers here, Have not worked out how to have text displayed for each layer. Copy down the number you see and add a case for it below
 | ||||
|   char buf[40]; | ||||
|   snprintf(buf,sizeof(buf), "Undef-%ld", layer_state); | ||||
|   matrix_write_P(matrix, PSTR("\nLayer: ")); | ||||
|     switch (layer_state) { | ||||
|         case L_BASE: | ||||
|            matrix_write_P(matrix, PSTR("Default")); | ||||
|            break; | ||||
|         case L_RAISE: | ||||
|            matrix_write_P(matrix, PSTR("Raise")); | ||||
|            break; | ||||
|         case L_LOWER: | ||||
|            matrix_write_P(matrix, PSTR("Lower")); | ||||
|            break; | ||||
|         case L_ADJUST: | ||||
|         case L_ADJUST_TRI: | ||||
|            matrix_write_P(matrix, PSTR("Adjust")); | ||||
|            break; | ||||
|         default: | ||||
|            matrix_write(matrix, buf); | ||||
|     } | ||||
| 
 | ||||
|   // Host Keyboard LED Status
 | ||||
|   char led[40]; | ||||
|     snprintf(led, sizeof(led), "\n%s  %s  %s", | ||||
|             (host_keyboard_leds() & (1<<USB_LED_NUM_LOCK)) ? "NUMLOCK" : "       ", | ||||
|             (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) ? "CAPS" : "    ", | ||||
|             (host_keyboard_leds() & (1<<USB_LED_SCROLL_LOCK)) ? "SCLK" : "    "); | ||||
|   matrix_write(matrix, led); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| void iota_gfx_task_user(void) { | ||||
|   struct CharacterMatrix matrix; | ||||
| 
 | ||||
| #if DEBUG_TO_SCREEN | ||||
|   if (debug_enable) { | ||||
|     return; | ||||
|   } | ||||
| #endif | ||||
| 
 | ||||
|   matrix_clear(&matrix); | ||||
|   if(is_master){ | ||||
|     render_status(&matrix); | ||||
|   }else{ | ||||
|     render_logo(&matrix); | ||||
|   } | ||||
|   matrix_update(&display, &matrix); | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
| #include "../default/keymap.c" | ||||
|  | ||||
							
								
								
									
										20
									
								
								keyboards/helix/rev2/keymaps/led_test/led_test_init.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								keyboards/helix/rev2/keymaps/led_test/led_test_init.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,20 @@ | ||||
| #include QMK_KEYBOARD_H | ||||
| 
 | ||||
| #if 1 | ||||
| void led_test_init(void) { | ||||
|     static int scan_count = 0; | ||||
|     if( scan_count == 2 ) { | ||||
| 	rgblight_enable_noeeprom(); | ||||
| 	rgblight_mode_noeeprom(35); | ||||
|     } | ||||
|     if( scan_count < 3 ) scan_count ++; | ||||
| } | ||||
| 
 | ||||
| #else | ||||
| // when qmk/qmk_firmware PullRequest #3113 available.
 | ||||
| // can use this?
 | ||||
| void startup_user(void) { | ||||
|     rgblight_enable_noeeprom(); | ||||
|     rgblight_mode_noeeprom(35); | ||||
| } | ||||
| #endif | ||||
| @ -1,763 +0,0 @@ | ||||
| /* Copyright 2016-2017 Yang Liu
 | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 2 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
|  */ | ||||
| #include <math.h> | ||||
| #include <avr/eeprom.h> | ||||
| #include <avr/interrupt.h> | ||||
| #include <util/delay.h> | ||||
| #include "progmem.h" | ||||
| #include "timer.h" | ||||
| #include "rgblight.h" | ||||
| #include "debug.h" | ||||
| #include "led_tables.h" | ||||
| 
 | ||||
| #ifndef RGBLIGHT_LIMIT_VAL | ||||
| #define RGBLIGHT_LIMIT_VAL 255 | ||||
| #endif | ||||
| 
 | ||||
| #define MIN(a,b) (((a)<(b))?(a):(b)) | ||||
| #define MAX(a,b) (((a)>(b))?(a):(b)) | ||||
| 
 | ||||
| __attribute__ ((weak)) | ||||
| const uint8_t RGBLED_BREATHING_INTERVALS[] PROGMEM = {30, 20, 10, 5}; | ||||
| __attribute__ ((weak)) | ||||
| const uint8_t RGBLED_RAINBOW_MOOD_INTERVALS[] PROGMEM = {120, 60, 30}; | ||||
| __attribute__ ((weak)) | ||||
| const uint8_t RGBLED_RAINBOW_SWIRL_INTERVALS[] PROGMEM = {100, 50, 20}; | ||||
| __attribute__ ((weak)) | ||||
| const uint8_t RGBLED_SNAKE_INTERVALS[] PROGMEM = {100, 50, 20}; | ||||
| __attribute__ ((weak)) | ||||
| const uint8_t RGBLED_KNIGHT_INTERVALS[] PROGMEM = {127, 63, 31}; | ||||
| __attribute__ ((weak)) | ||||
| const uint16_t RGBLED_GRADIENT_RANGES[] PROGMEM = {360, 240, 180, 120, 90}; | ||||
| __attribute__ ((weak)) | ||||
| const uint16_t RGBLED_RGBCYCLIC_INTERVALS[] PROGMEM = {1024}; | ||||
| 
 | ||||
| rgblight_config_t rgblight_config; | ||||
| 
 | ||||
| LED_TYPE led[RGBLED_NUM]; | ||||
| uint8_t rgblight_inited = 0; | ||||
| bool rgblight_timer_enabled = false; | ||||
| 
 | ||||
| void sethsv(uint16_t hue, uint8_t sat, uint8_t val, LED_TYPE *led1) { | ||||
|   uint8_t r = 0, g = 0, b = 0, base, color; | ||||
| 
 | ||||
|   if (val > RGBLIGHT_LIMIT_VAL) { | ||||
|       val=RGBLIGHT_LIMIT_VAL; // limit the val
 | ||||
|   } | ||||
| 
 | ||||
|   if (sat == 0) { // Acromatic color (gray). Hue doesn't mind.
 | ||||
|     r = val; | ||||
|     g = val; | ||||
|     b = val; | ||||
|   } else { | ||||
|     base = ((255 - sat) * val) >> 8; | ||||
|     color = (val - base) * (hue % 60) / 60; | ||||
| 
 | ||||
|     switch (hue / 60) { | ||||
|       case 0: | ||||
|         r = val; | ||||
|         g = base + color; | ||||
|         b = base; | ||||
|         break; | ||||
|       case 1: | ||||
|         r = val - color; | ||||
|         g = val; | ||||
|         b = base; | ||||
|         break; | ||||
|       case 2: | ||||
|         r = base; | ||||
|         g = val; | ||||
|         b = base + color; | ||||
|         break; | ||||
|       case 3: | ||||
|         r = base; | ||||
|         g = val - color; | ||||
|         b = val; | ||||
|         break; | ||||
|       case 4: | ||||
|         r = base + color; | ||||
|         g = base; | ||||
|         b = val; | ||||
|         break; | ||||
|       case 5: | ||||
|         r = val; | ||||
|         g = base; | ||||
|         b = val - color; | ||||
|         break; | ||||
|     } | ||||
|   } | ||||
|   r = pgm_read_byte(&CIE1931_CURVE[r]); | ||||
|   g = pgm_read_byte(&CIE1931_CURVE[g]); | ||||
|   b = pgm_read_byte(&CIE1931_CURVE[b]); | ||||
| 
 | ||||
|   setrgb(r, g, b, led1); | ||||
| } | ||||
| 
 | ||||
| void setrgb(uint8_t r, uint8_t g, uint8_t b, LED_TYPE *led1) { | ||||
|   (*led1).r = r; | ||||
|   (*led1).g = g; | ||||
|   (*led1).b = b; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| uint32_t eeconfig_read_rgblight(void) { | ||||
|   return eeprom_read_dword(EECONFIG_RGBLIGHT); | ||||
| } | ||||
| void eeconfig_update_rgblight(uint32_t val) { | ||||
|   eeprom_update_dword(EECONFIG_RGBLIGHT, val); | ||||
| } | ||||
| void eeconfig_update_rgblight_default(void) { | ||||
|   dprintf("eeconfig_update_rgblight_default\n"); | ||||
|   rgblight_config.enable = 1; | ||||
|   rgblight_config.mode = 1; | ||||
|   rgblight_config.hue = 0; | ||||
|   rgblight_config.sat = 255; | ||||
|   rgblight_config.val = RGBLIGHT_LIMIT_VAL; | ||||
|   rgblight_config.speed = 0; | ||||
|   eeconfig_update_rgblight(rgblight_config.raw); | ||||
| } | ||||
| void eeconfig_debug_rgblight(void) { | ||||
|   dprintf("rgblight_config eprom\n"); | ||||
|   dprintf("rgblight_config.enable = %d\n", rgblight_config.enable); | ||||
|   dprintf("rghlight_config.mode = %d\n", rgblight_config.mode); | ||||
|   dprintf("rgblight_config.hue = %d\n", rgblight_config.hue); | ||||
|   dprintf("rgblight_config.sat = %d\n", rgblight_config.sat); | ||||
|   dprintf("rgblight_config.val = %d\n", rgblight_config.val); | ||||
|   dprintf("rgblight_config.speed = %d\n", rgblight_config.speed); | ||||
| } | ||||
| 
 | ||||
| void rgblight_init(void) { | ||||
|   debug_enable = 1; // Debug ON!
 | ||||
|   dprintf("rgblight_init called.\n"); | ||||
|   rgblight_inited = 1; | ||||
|   dprintf("rgblight_init start!\n"); | ||||
|   if (!eeconfig_is_enabled()) { | ||||
|     dprintf("rgblight_init eeconfig is not enabled.\n"); | ||||
|     eeconfig_init(); | ||||
|     eeconfig_update_rgblight_default(); | ||||
|   } | ||||
|   rgblight_config.raw = eeconfig_read_rgblight(); | ||||
|   if (!rgblight_config.mode) { | ||||
|     dprintf("rgblight_init rgblight_config.mode = 0. Write default values to EEPROM.\n"); | ||||
|     eeconfig_update_rgblight_default(); | ||||
|     rgblight_config.raw = eeconfig_read_rgblight(); | ||||
|   } | ||||
|   eeconfig_debug_rgblight(); // display current eeprom values
 | ||||
| 
 | ||||
|   #ifdef RGBLIGHT_ANIMATIONS | ||||
|     rgblight_timer_init(); // setup the timer
 | ||||
|   #endif | ||||
| 
 | ||||
|   if (rgblight_config.enable) { | ||||
|     rgblight_mode_noeeprom(rgblight_config.mode); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| void rgblight_update_dword(uint32_t dword) { | ||||
|   rgblight_config.raw = dword; | ||||
|   eeconfig_update_rgblight(rgblight_config.raw); | ||||
|   if (rgblight_config.enable) | ||||
|     rgblight_mode(rgblight_config.mode); | ||||
|   else { | ||||
|     #ifdef RGBLIGHT_ANIMATIONS | ||||
|       rgblight_timer_disable(); | ||||
|     #endif | ||||
|       rgblight_set(); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| void rgblight_increase(void) { | ||||
|   uint8_t mode = 0; | ||||
|   if (rgblight_config.mode < RGBLIGHT_MODES) { | ||||
|     mode = rgblight_config.mode + 1; | ||||
|   } | ||||
|   rgblight_mode(mode); | ||||
| } | ||||
| void rgblight_decrease(void) { | ||||
|   uint8_t mode = 0; | ||||
|   // Mode will never be < 1. If it ever is, eeprom needs to be initialized.
 | ||||
|   if (rgblight_config.mode > 1) { | ||||
|     mode = rgblight_config.mode - 1; | ||||
|   } | ||||
|   rgblight_mode(mode); | ||||
| } | ||||
| void rgblight_step(void) { | ||||
|   uint8_t mode = 0; | ||||
|   mode = rgblight_config.mode + 1; | ||||
|   if (mode > RGBLIGHT_MODES) { | ||||
|     mode = 1; | ||||
|   } | ||||
|   rgblight_mode(mode); | ||||
| } | ||||
| void rgblight_step_reverse(void) { | ||||
|   uint8_t mode = 0; | ||||
|   mode = rgblight_config.mode - 1; | ||||
|   if (mode < 1) { | ||||
|     mode = RGBLIGHT_MODES; | ||||
|   } | ||||
|   rgblight_mode(mode); | ||||
| } | ||||
| 
 | ||||
| uint32_t rgblight_get_mode(void) { | ||||
|   if (!rgblight_config.enable) { | ||||
|     return false; | ||||
|   } | ||||
| 
 | ||||
|   return rgblight_config.mode; | ||||
| } | ||||
| 
 | ||||
| void rgblight_mode_eeprom_helper(uint8_t mode, bool write_to_eeprom) { | ||||
|   if (!rgblight_config.enable) { | ||||
|     return; | ||||
|   } | ||||
|   if (mode < 1) { | ||||
|     rgblight_config.mode = 1; | ||||
|   } else if (mode > RGBLIGHT_MODES) { | ||||
|     rgblight_config.mode = RGBLIGHT_MODES; | ||||
|   } else { | ||||
|     rgblight_config.mode = mode; | ||||
|   } | ||||
|   if (write_to_eeprom) { | ||||
|     eeconfig_update_rgblight(rgblight_config.raw); | ||||
|     xprintf("rgblight mode [EEPROM]: %u\n", rgblight_config.mode); | ||||
|   } else { | ||||
|     xprintf("rgblight mode [NOEEPROM]: %u\n", rgblight_config.mode); | ||||
|   } | ||||
|   if (rgblight_config.mode == 1) { | ||||
|     #ifdef RGBLIGHT_ANIMATIONS | ||||
|       rgblight_timer_disable(); | ||||
|     #endif | ||||
|   } else if ((rgblight_config.mode >= 2 && rgblight_config.mode <= 24) || | ||||
| 	     rgblight_config.mode == 35 ) { | ||||
|     // MODE 2-5, breathing
 | ||||
|     // MODE 6-8, rainbow mood
 | ||||
|     // MODE 9-14, rainbow swirl
 | ||||
|     // MODE 15-20, snake
 | ||||
|     // MODE 21-23, knight
 | ||||
|     // MODE 24, xmas
 | ||||
|     // MODE 25-34, static rainbow
 | ||||
|     // MODE 35  RGB cyclic
 | ||||
| 
 | ||||
|     #ifdef RGBLIGHT_ANIMATIONS | ||||
|       rgblight_timer_enable(); | ||||
|     #endif | ||||
|   } else if (rgblight_config.mode >= 25 && rgblight_config.mode <= 34) { | ||||
|     // MODE 25-34, static gradient
 | ||||
| 
 | ||||
|     #ifdef RGBLIGHT_ANIMATIONS | ||||
|       rgblight_timer_disable(); | ||||
|     #endif | ||||
|   } | ||||
|   rgblight_sethsv_noeeprom(rgblight_config.hue, rgblight_config.sat, rgblight_config.val); | ||||
| } | ||||
| 
 | ||||
| void rgblight_mode(uint8_t mode) { | ||||
|   rgblight_mode_eeprom_helper(mode, true); | ||||
| } | ||||
| 
 | ||||
| void rgblight_mode_noeeprom(uint8_t mode) { | ||||
|   rgblight_mode_eeprom_helper(mode, false); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| void rgblight_toggle(void) { | ||||
|   xprintf("rgblight toggle [EEPROM]: rgblight_config.enable = %u\n", !rgblight_config.enable); | ||||
|   if (rgblight_config.enable) { | ||||
|     rgblight_disable(); | ||||
|   } | ||||
|   else { | ||||
|     rgblight_enable(); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| void rgblight_toggle_noeeprom(void) { | ||||
|   xprintf("rgblight toggle [NOEEPROM]: rgblight_config.enable = %u\n", !rgblight_config.enable); | ||||
|   if (rgblight_config.enable) { | ||||
|     rgblight_disable_noeeprom(); | ||||
|   } | ||||
|   else { | ||||
|     rgblight_enable_noeeprom(); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| void rgblight_enable(void) { | ||||
|   rgblight_config.enable = 1; | ||||
|   // No need to update EEPROM here. rgblight_mode() will do that, actually
 | ||||
|   //eeconfig_update_rgblight(rgblight_config.raw);
 | ||||
|   xprintf("rgblight enable [EEPROM]: rgblight_config.enable = %u\n", rgblight_config.enable); | ||||
|   rgblight_mode(rgblight_config.mode); | ||||
| } | ||||
| 
 | ||||
| void rgblight_enable_noeeprom(void) { | ||||
|   rgblight_config.enable = 1; | ||||
|   xprintf("rgblight enable [NOEEPROM]: rgblight_config.enable = %u\n", rgblight_config.enable); | ||||
|   rgblight_mode_noeeprom(rgblight_config.mode); | ||||
| } | ||||
| 
 | ||||
| void rgblight_disable(void) { | ||||
|   rgblight_config.enable = 0; | ||||
|   eeconfig_update_rgblight(rgblight_config.raw); | ||||
|   xprintf("rgblight disable [EEPROM]: rgblight_config.enable = %u\n", rgblight_config.enable); | ||||
|   #ifdef RGBLIGHT_ANIMATIONS | ||||
|     rgblight_timer_disable(); | ||||
|   #endif | ||||
|   _delay_ms(50); | ||||
|   rgblight_set(); | ||||
| } | ||||
| 
 | ||||
| void rgblight_disable_noeeprom(void) { | ||||
|   rgblight_config.enable = 0; | ||||
|   xprintf("rgblight disable [noEEPROM]: rgblight_config.enable = %u\n", rgblight_config.enable); | ||||
|   #ifdef RGBLIGHT_ANIMATIONS | ||||
|     rgblight_timer_disable(); | ||||
|   #endif | ||||
|   _delay_ms(50); | ||||
|   rgblight_set(); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| // Deals with the messy details of incrementing an integer
 | ||||
| uint8_t increment( uint8_t value, uint8_t step, uint8_t min, uint8_t max ) { | ||||
|     int16_t new_value = value; | ||||
|     new_value += step; | ||||
|     return MIN( MAX( new_value, min ), max ); | ||||
| } | ||||
| 
 | ||||
| uint8_t decrement( uint8_t value, uint8_t step, uint8_t min, uint8_t max ) { | ||||
|     int16_t new_value = value; | ||||
|     new_value -= step; | ||||
|     return MIN( MAX( new_value, min ), max ); | ||||
| } | ||||
| 
 | ||||
| void rgblight_increase_hue(void) { | ||||
|   uint16_t hue; | ||||
|   hue = (rgblight_config.hue+RGBLIGHT_HUE_STEP) % 360; | ||||
|   rgblight_sethsv(hue, rgblight_config.sat, rgblight_config.val); | ||||
| } | ||||
| void rgblight_decrease_hue(void) { | ||||
|   uint16_t hue; | ||||
|   if (rgblight_config.hue-RGBLIGHT_HUE_STEP < 0) { | ||||
|     hue = (rgblight_config.hue + 360 - RGBLIGHT_HUE_STEP) % 360; | ||||
|   } else { | ||||
|     hue = (rgblight_config.hue - RGBLIGHT_HUE_STEP) % 360; | ||||
|   } | ||||
|   rgblight_sethsv(hue, rgblight_config.sat, rgblight_config.val); | ||||
| } | ||||
| void rgblight_increase_sat(void) { | ||||
|   uint8_t sat; | ||||
|   if (rgblight_config.sat + RGBLIGHT_SAT_STEP > 255) { | ||||
|     sat = 255; | ||||
|   } else { | ||||
|     sat = rgblight_config.sat + RGBLIGHT_SAT_STEP; | ||||
|   } | ||||
|   rgblight_sethsv(rgblight_config.hue, sat, rgblight_config.val); | ||||
| } | ||||
| void rgblight_decrease_sat(void) { | ||||
|   uint8_t sat; | ||||
|   if (rgblight_config.sat - RGBLIGHT_SAT_STEP < 0) { | ||||
|     sat = 0; | ||||
|   } else { | ||||
|     sat = rgblight_config.sat - RGBLIGHT_SAT_STEP; | ||||
|   } | ||||
|   rgblight_sethsv(rgblight_config.hue, sat, rgblight_config.val); | ||||
| } | ||||
| void rgblight_increase_val(void) { | ||||
|   uint8_t val; | ||||
|   if (rgblight_config.val + RGBLIGHT_VAL_STEP > RGBLIGHT_LIMIT_VAL) { | ||||
|     val = RGBLIGHT_LIMIT_VAL; | ||||
|   } else { | ||||
|     val = rgblight_config.val + RGBLIGHT_VAL_STEP; | ||||
|   } | ||||
|   rgblight_sethsv(rgblight_config.hue, rgblight_config.sat, val); | ||||
| } | ||||
| void rgblight_decrease_val(void) { | ||||
|   uint8_t val; | ||||
|   if (rgblight_config.val - RGBLIGHT_VAL_STEP < 0) { | ||||
|     val = 0; | ||||
|   } else { | ||||
|     val = rgblight_config.val - RGBLIGHT_VAL_STEP; | ||||
|   } | ||||
|   rgblight_sethsv(rgblight_config.hue, rgblight_config.sat, val); | ||||
| } | ||||
| void rgblight_increase_speed(void) { | ||||
|     rgblight_config.speed = increment( rgblight_config.speed, 1, 0, 3 ); | ||||
|     eeconfig_update_rgblight(rgblight_config.raw);//EECONFIG needs to be increased to support this
 | ||||
| } | ||||
| 
 | ||||
| void rgblight_decrease_speed(void) { | ||||
|     rgblight_config.speed = decrement( rgblight_config.speed, 1, 0, 3 ); | ||||
|     eeconfig_update_rgblight(rgblight_config.raw);//EECONFIG needs to be increased to support this
 | ||||
| } | ||||
| 
 | ||||
| void rgblight_sethsv_noeeprom_old(uint16_t hue, uint8_t sat, uint8_t val) { | ||||
|   if (rgblight_config.enable) { | ||||
|     LED_TYPE tmp_led; | ||||
|     sethsv(hue, sat, val, &tmp_led); | ||||
|     // dprintf("rgblight set hue [MEMORY]: %u,%u,%u\n", inmem_config.hue, inmem_config.sat, inmem_config.val);
 | ||||
|     rgblight_setrgb(tmp_led.r, tmp_led.g, tmp_led.b); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| void rgblight_sethsv_eeprom_helper(uint16_t hue, uint8_t sat, uint8_t val, bool write_to_eeprom) { | ||||
|   if (rgblight_config.enable) { | ||||
|     if (rgblight_config.mode == 1) { | ||||
|       // same static color
 | ||||
|       LED_TYPE tmp_led; | ||||
|       sethsv(hue, sat, val, &tmp_led); | ||||
|       rgblight_setrgb(tmp_led.r, tmp_led.g, tmp_led.b); | ||||
|     } else { | ||||
|       // all LEDs in same color
 | ||||
|       if (rgblight_config.mode >= 2 && rgblight_config.mode <= 5) { | ||||
|         // breathing mode, ignore the change of val, use in memory value instead
 | ||||
|         val = rgblight_config.val; | ||||
|       } else if (rgblight_config.mode >= 6 && rgblight_config.mode <= 14) { | ||||
|         // rainbow mood and rainbow swirl, ignore the change of hue
 | ||||
|         hue = rgblight_config.hue; | ||||
|       } else if (rgblight_config.mode >= 25 && rgblight_config.mode <= 34) { | ||||
|         // static gradient
 | ||||
|         uint16_t _hue; | ||||
|         int8_t direction = ((rgblight_config.mode - 25) % 2) ? -1 : 1; | ||||
|         uint16_t range = pgm_read_word(&RGBLED_GRADIENT_RANGES[(rgblight_config.mode - 25) / 2]); | ||||
|         for (uint8_t i = 0; i < RGBLED_NUM; i++) { | ||||
|           _hue = (range / RGBLED_NUM * i * direction + hue + 360) % 360; | ||||
|           dprintf("rgblight rainbow set hsv: %u,%u,%d,%u\n", i, _hue, direction, range); | ||||
|           sethsv(_hue, sat, val, (LED_TYPE *)&led[i]); | ||||
|         } | ||||
|         rgblight_set(); | ||||
|       } | ||||
|     } | ||||
|     rgblight_config.hue = hue; | ||||
|     rgblight_config.sat = sat; | ||||
|     rgblight_config.val = val; | ||||
|     if (write_to_eeprom) { | ||||
|       eeconfig_update_rgblight(rgblight_config.raw); | ||||
|       xprintf("rgblight set hsv [EEPROM]: %u,%u,%u\n", rgblight_config.hue, rgblight_config.sat, rgblight_config.val); | ||||
|     } else { | ||||
|       xprintf("rgblight set hsv [NOEEPROM]: %u,%u,%u\n", rgblight_config.hue, rgblight_config.sat, rgblight_config.val); | ||||
|     } | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| void rgblight_sethsv(uint16_t hue, uint8_t sat, uint8_t val) { | ||||
|   rgblight_sethsv_eeprom_helper(hue, sat, val, true); | ||||
| } | ||||
| 
 | ||||
| void rgblight_sethsv_noeeprom(uint16_t hue, uint8_t sat, uint8_t val) { | ||||
|   rgblight_sethsv_eeprom_helper(hue, sat, val, false); | ||||
| } | ||||
| 
 | ||||
| uint16_t rgblight_get_hue(void) { | ||||
|   return rgblight_config.hue; | ||||
| } | ||||
| 
 | ||||
| uint8_t rgblight_get_sat(void) { | ||||
|   return rgblight_config.sat; | ||||
| } | ||||
| 
 | ||||
| uint8_t rgblight_get_val(void) { | ||||
|   return rgblight_config.val; | ||||
| } | ||||
| 
 | ||||
| void rgblight_setrgb(uint8_t r, uint8_t g, uint8_t b) { | ||||
|   if (!rgblight_config.enable) { return; } | ||||
| 
 | ||||
|   for (uint8_t i = 0; i < RGBLED_NUM; i++) { | ||||
|     led[i].r = r; | ||||
|     led[i].g = g; | ||||
|     led[i].b = b; | ||||
|   } | ||||
|   rgblight_set(); | ||||
| } | ||||
| 
 | ||||
| void rgblight_setrgb_at(uint8_t r, uint8_t g, uint8_t b, uint8_t index) { | ||||
|   if (!rgblight_config.enable || index >= RGBLED_NUM) { return; } | ||||
| 
 | ||||
|   led[index].r = r; | ||||
|   led[index].g = g; | ||||
|   led[index].b = b; | ||||
|   rgblight_set(); | ||||
| } | ||||
| 
 | ||||
| void rgblight_sethsv_at(uint16_t hue, uint8_t sat, uint8_t val, uint8_t index) { | ||||
|   if (!rgblight_config.enable) { return; } | ||||
| 
 | ||||
|   LED_TYPE tmp_led; | ||||
|   sethsv(hue, sat, val, &tmp_led); | ||||
|   rgblight_setrgb_at(tmp_led.r, tmp_led.g, tmp_led.b, index); | ||||
| } | ||||
| 
 | ||||
| #ifndef RGBLIGHT_CUSTOM_DRIVER | ||||
| void rgblight_set(void) { | ||||
|   if (rgblight_config.enable) { | ||||
|     #ifdef RGBW | ||||
|       ws2812_setleds_rgbw(led, RGBLED_NUM); | ||||
|     #else | ||||
|       ws2812_setleds(led, RGBLED_NUM); | ||||
|     #endif | ||||
|   } else { | ||||
|     for (uint8_t i = 0; i < RGBLED_NUM; i++) { | ||||
|       led[i].r = 0; | ||||
|       led[i].g = 0; | ||||
|       led[i].b = 0; | ||||
|     } | ||||
|     #ifdef RGBW | ||||
|       ws2812_setleds_rgbw(led, RGBLED_NUM); | ||||
|     #else | ||||
|       ws2812_setleds(led, RGBLED_NUM); | ||||
|     #endif | ||||
|   } | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| #ifdef RGBLIGHT_ANIMATIONS | ||||
| 
 | ||||
| // Animation timer -- AVR Timer3
 | ||||
| void rgblight_timer_init(void) { | ||||
|   // static uint8_t rgblight_timer_is_init = 0;
 | ||||
|   // if (rgblight_timer_is_init) {
 | ||||
|   //   return;
 | ||||
|   // }
 | ||||
|   // rgblight_timer_is_init = 1;
 | ||||
|   // /* Timer 3 setup */
 | ||||
|   // TCCR3B = _BV(WGM32) // CTC mode OCR3A as TOP
 | ||||
|   //       | _BV(CS30); // Clock selelct: clk/1
 | ||||
|   // /* Set TOP value */
 | ||||
|   // uint8_t sreg = SREG;
 | ||||
|   // cli();
 | ||||
|   // OCR3AH = (RGBLED_TIMER_TOP >> 8) & 0xff;
 | ||||
|   // OCR3AL = RGBLED_TIMER_TOP & 0xff;
 | ||||
|   // SREG = sreg;
 | ||||
| 
 | ||||
|   rgblight_timer_enabled = true; | ||||
| } | ||||
| void rgblight_timer_enable(void) { | ||||
|   rgblight_timer_enabled = true; | ||||
|   dprintf("TIMER3 enabled.\n"); | ||||
| } | ||||
| void rgblight_timer_disable(void) { | ||||
|   rgblight_timer_enabled = false; | ||||
|   dprintf("TIMER3 disabled.\n"); | ||||
| } | ||||
| void rgblight_timer_toggle(void) { | ||||
|   rgblight_timer_enabled ^= rgblight_timer_enabled; | ||||
|   dprintf("TIMER3 toggled.\n"); | ||||
| } | ||||
| 
 | ||||
| void rgblight_show_solid_color(uint8_t r, uint8_t g, uint8_t b) { | ||||
|   rgblight_enable(); | ||||
|   rgblight_mode(1); | ||||
|   rgblight_setrgb(r, g, b); | ||||
| } | ||||
| 
 | ||||
| void rgblight_task(void) { | ||||
|   if (rgblight_timer_enabled) { | ||||
|     // mode = 1, static light, do nothing here
 | ||||
|     if (rgblight_config.mode >= 2 && rgblight_config.mode <= 5) { | ||||
|       // mode = 2 to 5, breathing mode
 | ||||
|       rgblight_effect_breathing(rgblight_config.mode - 2); | ||||
|     } else if (rgblight_config.mode >= 6 && rgblight_config.mode <= 8) { | ||||
|       // mode = 6 to 8, rainbow mood mod
 | ||||
|       rgblight_effect_rainbow_mood(rgblight_config.mode - 6); | ||||
|     } else if (rgblight_config.mode >= 9 && rgblight_config.mode <= 14) { | ||||
|       // mode = 9 to 14, rainbow swirl mode
 | ||||
|       rgblight_effect_rainbow_swirl(rgblight_config.mode - 9); | ||||
|     } else if (rgblight_config.mode >= 15 && rgblight_config.mode <= 20) { | ||||
|       // mode = 15 to 20, snake mode
 | ||||
|       rgblight_effect_snake(rgblight_config.mode - 15); | ||||
|     } else if (rgblight_config.mode >= 21 && rgblight_config.mode <= 23) { | ||||
|       // mode = 21 to 23, knight mode
 | ||||
|       rgblight_effect_knight(rgblight_config.mode - 21); | ||||
|     } else if (rgblight_config.mode == 24) { | ||||
|       // mode = 24, christmas mode
 | ||||
|       rgblight_effect_christmas(); | ||||
|     } else if (rgblight_config.mode == 35) { | ||||
|       // mode = 35, RGB cyclic
 | ||||
|       rgblight_effect_rgbcyclic(); | ||||
|     } | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| // Effects
 | ||||
| void rgblight_effect_breathing(uint8_t interval) { | ||||
|   static uint8_t pos = 0; | ||||
|   static uint16_t last_timer = 0; | ||||
|   float val; | ||||
| 
 | ||||
|   if (timer_elapsed(last_timer) < pgm_read_byte(&RGBLED_BREATHING_INTERVALS[interval])) { | ||||
|     return; | ||||
|   } | ||||
|   last_timer = timer_read(); | ||||
| 
 | ||||
| 
 | ||||
|   // http://sean.voisen.org/blog/2011/10/breathing-led-with-arduino/
 | ||||
|   val = (exp(sin((pos/255.0)*M_PI)) - RGBLIGHT_EFFECT_BREATHE_CENTER/M_E)*(RGBLIGHT_EFFECT_BREATHE_MAX/(M_E-1/M_E)); | ||||
|   rgblight_sethsv_noeeprom_old(rgblight_config.hue, rgblight_config.sat, val); | ||||
|   pos = (pos + 1) % 256; | ||||
| } | ||||
| void rgblight_effect_rainbow_mood(uint8_t interval) { | ||||
|   static uint16_t current_hue = 0; | ||||
|   static uint16_t last_timer = 0; | ||||
| 
 | ||||
|   if (timer_elapsed(last_timer) < pgm_read_byte(&RGBLED_RAINBOW_MOOD_INTERVALS[interval])) { | ||||
|     return; | ||||
|   } | ||||
|   last_timer = timer_read(); | ||||
|   rgblight_sethsv_noeeprom_old(current_hue, rgblight_config.sat, rgblight_config.val); | ||||
|   current_hue = (current_hue + 1) % 360; | ||||
| } | ||||
| void rgblight_effect_rainbow_swirl(uint8_t interval) { | ||||
|   static uint16_t current_hue = 0; | ||||
|   static uint16_t last_timer = 0; | ||||
|   uint16_t hue; | ||||
|   uint8_t i; | ||||
|   if (timer_elapsed(last_timer) < pgm_read_byte(&RGBLED_RAINBOW_SWIRL_INTERVALS[interval / 2])) { | ||||
|     return; | ||||
|   } | ||||
|   last_timer = timer_read(); | ||||
|   for (i = 0; i < RGBLED_NUM; i++) { | ||||
|     hue = (360 / RGBLED_NUM * i + current_hue) % 360; | ||||
|     sethsv(hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[i]); | ||||
|   } | ||||
|   rgblight_set(); | ||||
| 
 | ||||
|   if (interval % 2) { | ||||
|     current_hue = (current_hue + 1) % 360; | ||||
|   } else { | ||||
|     if (current_hue - 1 < 0) { | ||||
|       current_hue = 359; | ||||
|     } else { | ||||
|       current_hue = current_hue - 1; | ||||
|     } | ||||
|   } | ||||
| } | ||||
| void rgblight_effect_snake(uint8_t interval) { | ||||
|   static uint8_t pos = 0; | ||||
|   static uint16_t last_timer = 0; | ||||
|   uint8_t i, j; | ||||
|   int8_t k; | ||||
|   int8_t increment = 1; | ||||
|   if (interval % 2) { | ||||
|     increment = -1; | ||||
|   } | ||||
|   if (timer_elapsed(last_timer) < pgm_read_byte(&RGBLED_SNAKE_INTERVALS[interval / 2])) { | ||||
|     return; | ||||
|   } | ||||
|   last_timer = timer_read(); | ||||
|   for (i = 0; i < RGBLED_NUM; i++) { | ||||
|     led[i].r = 0; | ||||
|     led[i].g = 0; | ||||
|     led[i].b = 0; | ||||
|     for (j = 0; j < RGBLIGHT_EFFECT_SNAKE_LENGTH; j++) { | ||||
|       k = pos + j * increment; | ||||
|       if (k < 0) { | ||||
|         k = k + RGBLED_NUM; | ||||
|       } | ||||
|       if (i == k) { | ||||
|         sethsv(rgblight_config.hue, rgblight_config.sat, (uint8_t)(rgblight_config.val*(RGBLIGHT_EFFECT_SNAKE_LENGTH-j)/RGBLIGHT_EFFECT_SNAKE_LENGTH), (LED_TYPE *)&led[i]); | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   rgblight_set(); | ||||
|   if (increment == 1) { | ||||
|     if (pos - 1 < 0) { | ||||
|       pos = RGBLED_NUM - 1; | ||||
|     } else { | ||||
|       pos -= 1; | ||||
|     } | ||||
|   } else { | ||||
|     pos = (pos + 1) % RGBLED_NUM; | ||||
|   } | ||||
| } | ||||
| void rgblight_effect_knight(uint8_t interval) { | ||||
|   static uint16_t last_timer = 0; | ||||
|   if (timer_elapsed(last_timer) < pgm_read_byte(&RGBLED_KNIGHT_INTERVALS[interval])) { | ||||
|     return; | ||||
|   } | ||||
|   last_timer = timer_read(); | ||||
| 
 | ||||
|   static int8_t low_bound = 0; | ||||
|   static int8_t high_bound = RGBLIGHT_EFFECT_KNIGHT_LENGTH - 1; | ||||
|   static int8_t increment = 1; | ||||
|   uint8_t i, cur; | ||||
| 
 | ||||
|   // Set all the LEDs to 0
 | ||||
|   for (i = 0; i < RGBLED_NUM; i++) { | ||||
|     led[i].r = 0; | ||||
|     led[i].g = 0; | ||||
|     led[i].b = 0; | ||||
|   } | ||||
|   // Determine which LEDs should be lit up
 | ||||
|   for (i = 0; i < RGBLIGHT_EFFECT_KNIGHT_LED_NUM; i++) { | ||||
|     cur = (i + RGBLIGHT_EFFECT_KNIGHT_OFFSET) % RGBLED_NUM; | ||||
| 
 | ||||
|     if (i >= low_bound && i <= high_bound) { | ||||
|       sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[cur]); | ||||
|     } else { | ||||
|       led[cur].r = 0; | ||||
|       led[cur].g = 0; | ||||
|       led[cur].b = 0; | ||||
|     } | ||||
|   } | ||||
|   rgblight_set(); | ||||
| 
 | ||||
|   // Move from low_bound to high_bound changing the direction we increment each
 | ||||
|   // time a boundary is hit.
 | ||||
|   low_bound += increment; | ||||
|   high_bound += increment; | ||||
| 
 | ||||
|   if (high_bound <= 0 || low_bound >= RGBLIGHT_EFFECT_KNIGHT_LED_NUM - 1) { | ||||
|     increment = -increment; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| void rgblight_effect_christmas(void) { | ||||
|   static uint16_t current_offset = 0; | ||||
|   static uint16_t last_timer = 0; | ||||
|   uint16_t hue; | ||||
|   uint8_t i; | ||||
|   if (timer_elapsed(last_timer) < RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL) { | ||||
|     return; | ||||
|   } | ||||
|   last_timer = timer_read(); | ||||
|   current_offset = (current_offset + 1) % 2; | ||||
|   for (i = 0; i < RGBLED_NUM; i++) { | ||||
|     hue = 0 + ((i/RGBLIGHT_EFFECT_CHRISTMAS_STEP + current_offset) % 2) * 120; | ||||
|     sethsv(hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[i]); | ||||
|   } | ||||
|   rgblight_set(); | ||||
| } | ||||
| 
 | ||||
| void rgblight_effect_rgbcyclic(void) { | ||||
|   static uint8_t pos = 0; | ||||
|   static uint16_t last_timer = 0; | ||||
|   uint8_t g; uint8_t r; uint8_t b; | ||||
| 
 | ||||
|   if (timer_elapsed(last_timer) < pgm_read_word(&RGBLED_RGBCYCLIC_INTERVALS[0])) { | ||||
|     return; | ||||
|   } | ||||
|   last_timer = timer_read(); | ||||
|   g = r = b = 0; | ||||
|   switch( pos ) { | ||||
|     case 0: r = RGBLIGHT_LIMIT_VAL; break; | ||||
|     case 1: g = RGBLIGHT_LIMIT_VAL; break; | ||||
|     case 2: b = RGBLIGHT_LIMIT_VAL; break; | ||||
|   } | ||||
|   rgblight_setrgb(r, g, b); | ||||
|   pos = (pos + 1) % 3; | ||||
| } | ||||
| 
 | ||||
| #endif /* RGBLIGHT_ANIMATIONS */ | ||||
| @ -1,166 +0,0 @@ | ||||
| /* Copyright 2017 Yang Liu
 | ||||
|  * | ||||
|  * This program is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 2 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
|  */ | ||||
| #ifndef RGBLIGHT_H | ||||
| #define RGBLIGHT_H | ||||
| 
 | ||||
| #ifdef RGBLIGHT_ANIMATIONS | ||||
| 	#define RGBLIGHT_MODES 35 | ||||
| #else | ||||
| 	#define RGBLIGHT_MODES 1 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef RGBLIGHT_EFFECT_BREATHE_CENTER | ||||
| #define RGBLIGHT_EFFECT_BREATHE_CENTER 1.85  // 1-2.7
 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef RGBLIGHT_EFFECT_BREATHE_MAX | ||||
| #define RGBLIGHT_EFFECT_BREATHE_MAX 255   // 0-255
 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef RGBLIGHT_EFFECT_SNAKE_LENGTH | ||||
| #define RGBLIGHT_EFFECT_SNAKE_LENGTH 4 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef RGBLIGHT_EFFECT_KNIGHT_LENGTH | ||||
| #define RGBLIGHT_EFFECT_KNIGHT_LENGTH 3 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef RGBLIGHT_EFFECT_KNIGHT_OFFSET | ||||
| #define RGBLIGHT_EFFECT_KNIGHT_OFFSET 0 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef RGBLIGHT_EFFECT_KNIGHT_LED_NUM | ||||
| #define RGBLIGHT_EFFECT_KNIGHT_LED_NUM RGBLED_NUM | ||||
| #endif | ||||
| 
 | ||||
| #ifndef RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL | ||||
| #define RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL 1000 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef RGBLIGHT_EFFECT_CHRISTMAS_STEP | ||||
| #define RGBLIGHT_EFFECT_CHRISTMAS_STEP 2 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef RGBLIGHT_HUE_STEP | ||||
| #define RGBLIGHT_HUE_STEP 10 | ||||
| #endif | ||||
| #ifndef RGBLIGHT_SAT_STEP | ||||
| #define RGBLIGHT_SAT_STEP 17 | ||||
| #endif | ||||
| #ifndef RGBLIGHT_VAL_STEP | ||||
| #define RGBLIGHT_VAL_STEP 17 | ||||
| #endif | ||||
| 
 | ||||
| #define RGBLED_TIMER_TOP F_CPU/(256*64) | ||||
| // #define RGBLED_TIMER_TOP 0xFF10
 | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| #include <stdbool.h> | ||||
| #include "eeconfig.h" | ||||
| #ifndef RGBLIGHT_CUSTOM_DRIVER | ||||
| #include "ws2812.h" | ||||
| #endif | ||||
| #include "rgblight_types.h" | ||||
| #include "rgblight_list.h" | ||||
| 
 | ||||
| extern LED_TYPE led[RGBLED_NUM]; | ||||
| 
 | ||||
| extern const uint8_t RGBLED_BREATHING_INTERVALS[4] PROGMEM; | ||||
| extern const uint8_t RGBLED_RAINBOW_MOOD_INTERVALS[3] PROGMEM; | ||||
| extern const uint8_t RGBLED_RAINBOW_SWIRL_INTERVALS[3] PROGMEM; | ||||
| extern const uint8_t RGBLED_SNAKE_INTERVALS[3] PROGMEM; | ||||
| extern const uint8_t RGBLED_KNIGHT_INTERVALS[3] PROGMEM; | ||||
| extern const uint16_t RGBLED_RGBCYCLIC_INTERVALS[1] PROGMEM; | ||||
| 
 | ||||
| typedef union { | ||||
|   uint32_t raw; | ||||
|   struct { | ||||
|     bool     enable  :1; | ||||
|     uint8_t  mode    :6; | ||||
|     uint16_t hue     :9; | ||||
|     uint8_t  sat     :8; | ||||
|     uint8_t  val     :8; | ||||
|     uint8_t  speed   :8;//EECONFIG needs to be increased to support this
 | ||||
|   }; | ||||
| } rgblight_config_t; | ||||
| 
 | ||||
| void rgblight_init(void); | ||||
| void rgblight_increase(void); | ||||
| void rgblight_decrease(void); | ||||
| void rgblight_toggle(void); | ||||
| void rgblight_enable(void); | ||||
| void rgblight_disable(void); | ||||
| void rgblight_step(void); | ||||
| void rgblight_step_reverse(void); | ||||
| uint32_t rgblight_get_mode(void); | ||||
| void rgblight_mode(uint8_t mode); | ||||
| void rgblight_set(void); | ||||
| void rgblight_update_dword(uint32_t dword); | ||||
| void rgblight_increase_hue(void); | ||||
| void rgblight_decrease_hue(void); | ||||
| void rgblight_increase_sat(void); | ||||
| void rgblight_decrease_sat(void); | ||||
| void rgblight_increase_val(void); | ||||
| void rgblight_decrease_val(void); | ||||
| void rgblight_increase_speed(void); | ||||
| void rgblight_decrease_speed(void); | ||||
| void rgblight_sethsv(uint16_t hue, uint8_t sat, uint8_t val); | ||||
| uint16_t rgblight_get_hue(void); | ||||
| uint8_t rgblight_get_sat(void); | ||||
| uint8_t rgblight_get_val(void); | ||||
| void rgblight_setrgb(uint8_t r, uint8_t g, uint8_t b); | ||||
| void rgblight_setrgb_at(uint8_t r, uint8_t g, uint8_t b, uint8_t index); | ||||
| void rgblight_sethsv_at(uint16_t hue, uint8_t sat, uint8_t val, uint8_t index); | ||||
| 
 | ||||
| uint32_t eeconfig_read_rgblight(void); | ||||
| void eeconfig_update_rgblight(uint32_t val); | ||||
| void eeconfig_update_rgblight_default(void); | ||||
| void eeconfig_debug_rgblight(void); | ||||
| 
 | ||||
| void rgb_matrix_increase(void); | ||||
| void rgb_matrix_decrease(void); | ||||
| 
 | ||||
| void sethsv(uint16_t hue, uint8_t sat, uint8_t val, LED_TYPE *led1); | ||||
| void setrgb(uint8_t r, uint8_t g, uint8_t b, LED_TYPE *led1); | ||||
| 
 | ||||
| void rgblight_sethsv_noeeprom(uint16_t hue, uint8_t sat, uint8_t val); | ||||
| void rgblight_mode_noeeprom(uint8_t mode); | ||||
| void rgblight_toggle_noeeprom(void); | ||||
| void rgblight_enable_noeeprom(void); | ||||
| void rgblight_disable_noeeprom(void); | ||||
| 
 | ||||
| void rgblight_sethsv_eeprom_helper(uint16_t hue, uint8_t sat, uint8_t val, bool write_to_eeprom); | ||||
| void rgblight_mode_eeprom_helper(uint8_t mode, bool write_to_eeprom); | ||||
| 
 | ||||
| 
 | ||||
| #define EZ_RGB(val) rgblight_show_solid_color((val >> 16) & 0xFF, (val >> 8) & 0xFF, val & 0xFF) | ||||
| void rgblight_show_solid_color(uint8_t r, uint8_t g, uint8_t b); | ||||
| 
 | ||||
| void rgblight_task(void); | ||||
| 
 | ||||
| void rgblight_timer_init(void); | ||||
| void rgblight_timer_enable(void); | ||||
| void rgblight_timer_disable(void); | ||||
| void rgblight_timer_toggle(void); | ||||
| void rgblight_effect_breathing(uint8_t interval); | ||||
| void rgblight_effect_rainbow_mood(uint8_t interval); | ||||
| void rgblight_effect_rainbow_swirl(uint8_t interval); | ||||
| void rgblight_effect_snake(uint8_t interval); | ||||
| void rgblight_effect_knight(uint8_t interval); | ||||
| void rgblight_effect_christmas(void); | ||||
| void rgblight_effect_rgbcyclic(void); | ||||
| 
 | ||||
| #endif | ||||
| @ -110,6 +110,8 @@ ifeq ($(strip $(LOCAL_GLCDFONT)), yes) | ||||
|     OPT_DEFS += -DLOCAL_GLCDFONT | ||||
| endif | ||||
| 
 | ||||
| SRC += led_test_init.c | ||||
| 
 | ||||
| # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
 | ||||
| SLEEP_LED_ENABLE = no    # Breathing sleep LED during USB suspend | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Takeshi ISHII
						Takeshi ISHII