Merge remote-tracking branch 'origin/master' into develop
This commit is contained in:
		
						commit
						7a10c3370f
					
				
					 11 changed files with 1205 additions and 0 deletions
				
			
		
							
								
								
									
										51
									
								
								keyboards/custommk/evo70/config.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								keyboards/custommk/evo70/config.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,51 @@ | |||
| /* Copyright 2021 customMK
 | ||||
|  * | ||||
|  * 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/>.
 | ||||
|  */ | ||||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include "config_common.h" | ||||
| 
 | ||||
| #define OLED_UPDATE_INTERVAL 33 | ||||
| 
 | ||||
| #define BACKLIGHT_PIN B5 | ||||
| #define BACKLIGHT_LIMIT_VAL 255 | ||||
| #define BACKLIGHT_ON_STATE 0 | ||||
| #define BACKLIGHT_LEVELS 17 | ||||
| #define BACKLIGHT_BREATHING | ||||
| #define BREATHING_PERIOD 6 | ||||
| 
 | ||||
| #define OLED_DISABLE_TIMEOUT | ||||
| 
 | ||||
| #define ENCODERS_PAD_A { C7 } | ||||
| #define ENCODERS_PAD_B { D5 } | ||||
| #define ENCODER_RESOLUTION 2 | ||||
| #define TAP_CODE_DELAY 10 | ||||
| 
 | ||||
| #define RGBLIGHT_EFFECT_BREATHING | ||||
| #define RGBLIGHT_EFFECT_RAINBOW_MOOD | ||||
| #define RGBLIGHT_EFFECT_RAINBOW_SWIRL | ||||
| #define RGBLIGHT_EFFECT_SNAKE | ||||
| #define RGBLIGHT_EFFECT_KNIGHT | ||||
| #define RGBLIGHT_EFFECT_CHRISTMAS | ||||
| #define RGBLIGHT_EFFECT_STATIC_GRADIENT | ||||
| #define RGBLIGHT_EFFECT_RGB_TEST | ||||
| #define RGBLIGHT_EFFECT_ALTERNATING | ||||
| #define RGBLIGHT_EFFECT_TWINKLE | ||||
| #define RGBLIGHT_LAYERS | ||||
| #define RGBLIGHT_LIMIT_VAL 128 | ||||
| #define RGBLIGHT_DEFAULT_MODE RGBLIGHT_MODE_RAINBOW_SWIRL + 4 | ||||
| 
 | ||||
| #define RGBLIGHT_SLEEP | ||||
							
								
								
									
										811
									
								
								keyboards/custommk/evo70/evo70.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										811
									
								
								keyboards/custommk/evo70/evo70.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,811 @@ | |||
| /* Copyright 2021 customMK
 | ||||
|  * | ||||
|  * 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 "evo70.h" | ||||
| #include <stdbool.h> | ||||
| #include "matrix.h" | ||||
| #include OLED_FONT_H | ||||
| 
 | ||||
| //If Bongo cat not undefined, Scroll wheel will be enabled,
 | ||||
| //but for scroll wheel to work, you must also set MOUSEKEY_ENABLE = yes
 | ||||
| //in rules.mk 
 | ||||
| #define BONGOCAT | ||||
| 
 | ||||
| /* Placement information for display elements */ | ||||
| #define ENC_DISPLAY_X 0 | ||||
| #define ENC_DISPLAY_Y 0 | ||||
| 
 | ||||
| #define LAYER_DISPLAY_X 5 | ||||
| #define LAYER_DISPLAY_Y 19 | ||||
| 
 | ||||
| #define CAPSLOCK_DISPLAY_X 80 | ||||
| #define CAPSLOCK_DISPLAY_Y 19 | ||||
| 
 | ||||
| #define NUMLOCK_DISPLAY_X 105 | ||||
| #define NUMLOCK_DISPLAY_Y 19 | ||||
| 
 | ||||
| /* Encoder Parameters */ | ||||
| static bool OLED_awakened = false; | ||||
| static bool OLED_redraw = false; | ||||
| static bool startup_complete = false; | ||||
| static bool startup_delay = false; | ||||
| static bool starting_up = false; | ||||
| 
 | ||||
| #define ENCODER_MATRIX_ROW 5 | ||||
| #define ENCODER_MATRIX_COL 6 | ||||
| 
 | ||||
| #define ENC_SPLASH 0 | ||||
| #define ENC_VOLUME 1 | ||||
| #define ENC_MEDIA 2 | ||||
| #define ENC_CUSTOM 3 | ||||
| #define ENC_BL_BRIGHT 4 | ||||
| #define ENC_BL_BREATH 5 | ||||
| #define ENC_RGB_BRIGHT 6 | ||||
| #define ENC_RGB_MODE 7 | ||||
| #define ENC_RGB_COLOR 8 | ||||
| #define ENC_SCROLL 9 | ||||
| #ifdef BONGOCAT | ||||
| #define ENC_BONGO 9 | ||||
| #endif //bongocat
 | ||||
| 
 | ||||
| 
 | ||||
| extern matrix_row_t matrix[MATRIX_ROWS]; | ||||
| 
 | ||||
| char* enc_mode_str[] = { | ||||
| #ifdef BONGOCAT | ||||
|     /* Splash */ "", \ | ||||
|     "Volume", \ | ||||
|     "Media Control", \ | ||||
|     "Custom", \ | ||||
|     "Backlight Brightness", \ | ||||
|     "Backlight Breathing", \ | ||||
|     "Underglow Brightness", \ | ||||
|     "Underglow Mode", \ | ||||
|     "Underglow Color", \ | ||||
|     "" // Bongo Cat
 | ||||
| }; | ||||
| 
 | ||||
| uint16_t enc_cw[] =  { KC_VOLU, KC_VOLU, KC_MEDIA_NEXT_TRACK, KC_VOLU, 0, 0, 0, 0, 0, KC_VOLU }; | ||||
| uint16_t enc_ccw[] = { KC_VOLD, KC_VOLD, KC_MEDIA_PREV_TRACK, KC_VOLD, 0, 0, 0, 0, 0, KC_VOLD }; | ||||
| #else | ||||
|     /* Splash */ "", \ | ||||
|     "Volume", \ | ||||
|     "Media Control", \ | ||||
|     "Custom", \ | ||||
|     "Backlight Brightness", \ | ||||
|     "Backlight Breathing", \ | ||||
|     "Underglow Brightness", \ | ||||
|     "Underglow Mode", \ | ||||
|     "Underglow Color", \ | ||||
|     "Scroll Wheel" | ||||
| }; | ||||
| 
 | ||||
| uint16_t enc_cw[] =  { KC_VOLU, KC_VOLU, KC_MEDIA_NEXT_TRACK, KC_VOLU, 0, 0, 0, 0, 0, KC_WH_U }; | ||||
| uint16_t enc_ccw[] = { KC_VOLD, KC_VOLD, KC_MEDIA_PREV_TRACK, KC_VOLD, 0, 0, 0, 0, 0, KC_WH_D }; | ||||
| #endif //bongocat
 | ||||
| 
 | ||||
| uint8_t num_enc_modes = 10; | ||||
| 
 | ||||
| uint8_t enc_mode_str_startpos[] = {0, 49, 28, 49, 7, 10, 7, 25, 22, 31}; | ||||
| 
 | ||||
| uint8_t prev_layer = 255; | ||||
| uint8_t prev_capslock = 255; | ||||
| uint8_t prev_numlock = 255; | ||||
| 
 | ||||
| typedef union { | ||||
|     uint32_t raw; | ||||
|     struct { | ||||
|         uint8_t enc_mode; | ||||
|         uint8_t breathingperiod; | ||||
|         bool oled_is_on : 1; | ||||
|     }; | ||||
| } user_config_t; | ||||
| 
 | ||||
| user_config_t user_config; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /* OLED Draw Functions */ | ||||
| /* TODO: Reimplement using Quantum Painter when available  */ | ||||
| 
 | ||||
| static void draw_line_h(uint8_t x, uint8_t y, uint8_t len, bool on) { | ||||
|      for (uint8_t i = 0; i < len; i++) { | ||||
|          oled_write_pixel(i + x, y, on); | ||||
|      } | ||||
|  } | ||||
| 
 | ||||
|  static void draw_line_v(uint8_t x, uint8_t y, uint8_t len, bool on) { | ||||
|      for (uint8_t i = 0; i < len; i++) { | ||||
|          oled_write_pixel(x, i + y, on); | ||||
|      } | ||||
|  } | ||||
| 
 | ||||
| void draw_rect_soft(uint8_t x, uint8_t y, uint8_t width, uint8_t height, bool on) { | ||||
|     uint8_t tempHeight; | ||||
| 
 | ||||
|     draw_line_h(x + 1, y, width - 2, on); | ||||
|     draw_line_h(x + 1, y + height - 1, width - 2, on); | ||||
| 
 | ||||
|     tempHeight = height - 2; | ||||
| 
 | ||||
|     if (tempHeight < 1) return; | ||||
| 
 | ||||
|     draw_line_v(x, y + 1, tempHeight, on); | ||||
|     draw_line_v(x + width - 1, y + 1, tempHeight, on); | ||||
| } | ||||
| 
 | ||||
| void write_char_at_pixel_xy(uint8_t x, uint8_t y, const char data, bool invert) { | ||||
|     uint8_t i, j, temp; | ||||
|     uint8_t cast_data = (uint8_t)data; | ||||
|      | ||||
|     const uint8_t *glyph = &font[((uint8_t)cast_data - OLED_FONT_START) * OLED_FONT_WIDTH]; | ||||
|     temp = pgm_read_byte(glyph); | ||||
|     for (i = 0; i < OLED_FONT_WIDTH ; i++) { | ||||
|         for (j = 0; j < OLED_FONT_HEIGHT; j++) { | ||||
|             if (temp & 0x01) { | ||||
|                 oled_write_pixel(x + i, y + j, !invert); | ||||
|             } else { | ||||
|                 oled_write_pixel(x + i, y + j, invert); | ||||
|             } | ||||
|             temp >>= 1; | ||||
|         } | ||||
|         temp = pgm_read_byte(++glyph); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void write_chars_at_pixel_xy(uint8_t x, uint8_t y, const char *data, bool invert) { | ||||
|     uint8_t c = data[0]; | ||||
|     uint8_t offset = 0; | ||||
|     while (c != 0) { | ||||
|         write_char_at_pixel_xy(x + offset, y, c, invert); | ||||
|         data++; | ||||
|         c = data[0]; | ||||
|         offset += 6; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| void draw_rect_filled_soft(uint8_t x, uint8_t y, uint8_t width, uint8_t height, bool on) { | ||||
|     for (int i = x; i < x + width; i++) { | ||||
|         if (i == x || i == (x + width - 1)) | ||||
|             draw_line_v(i, y + 1, height - 2, on); | ||||
|         else | ||||
|             draw_line_v(i, y, height, on); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void draw_text_rectangle(uint8_t x, uint8_t y, uint8_t width, char* str, bool filled) { | ||||
|     if (filled) { | ||||
|         draw_rect_filled_soft(x, y, width, 11, true); | ||||
|         write_chars_at_pixel_xy(x+3, y+2, str, true); | ||||
|     } else { | ||||
|         draw_rect_soft(x, y, width, 11, true); | ||||
|         write_chars_at_pixel_xy(x+3, y+2, str, false); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void draw_keyboard_layer(void){ | ||||
|     uint8_t highest_layer; | ||||
|     highest_layer = get_highest_layer(layer_state); | ||||
|     draw_rect_filled_soft(LAYER_DISPLAY_X + highest_layer*12, LAYER_DISPLAY_Y, 11, 11, true); | ||||
| 
 | ||||
|     write_char_at_pixel_xy(LAYER_DISPLAY_X+3,  LAYER_DISPLAY_Y+2, '0', highest_layer == 0); | ||||
|     write_char_at_pixel_xy(LAYER_DISPLAY_X+3+12, LAYER_DISPLAY_Y+2, '1', highest_layer == 1); | ||||
|     write_char_at_pixel_xy(LAYER_DISPLAY_X+3+24, LAYER_DISPLAY_Y+2, '2', highest_layer == 2); | ||||
|     write_char_at_pixel_xy(LAYER_DISPLAY_X+3+36, LAYER_DISPLAY_Y+2, '3', highest_layer == 3); | ||||
| 
 | ||||
|     draw_line_h(0, 14, 128, true); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| static const uint8_t splash[] PROGMEM = { \ | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, \ | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x1c, 0x06, 0x02, 0x02, \ | ||||
|     0x03, 0x03, 0x83, 0x83, 0x83, 0x83, 0x03, 0x03, 0x03, 0x03, 0x83, 0x83, 0x83, 0x83, 0x83, 0x03, \ | ||||
|     0x03, 0x03, 0x83, 0x83, 0x83, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x83, 0x83, 0x83, 0x83, 0x03, \ | ||||
|     0x02, 0x02, 0x06, 0x0c, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ | ||||
|     0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, \ | ||||
|     0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0xf8, 0xfe, 0x87, 0xe1, 0xbf, 0x9f, 0x00, 0x00, \ | ||||
|     0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, \ | ||||
|     0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, \ | ||||
|     0x00, 0x00, 0xff, 0xff, 0xff, 0x3f, 0xfc, 0xe0, 0xc0, 0xf8, 0x7f, 0x0f, 0xff, 0xff, 0x00, 0x00, \ | ||||
|     0x00, 0x00, 0xff, 0xff, 0xff, 0x80, 0xc0, 0xf0, 0xf8, 0x3c, 0x1f, 0x0f, 0x03, 0x01, 0x00, 0x00, \ | ||||
|     0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfe, 0xc7, 0x83, \ | ||||
|     0x83, 0x8f, 0xc6, 0xc0, 0xfe, 0xff, 0xc7, 0xc0, 0xf0, 0xff, 0xff, 0x81, 0xc0, 0xe0, 0x70, 0x9e, \ | ||||
|     0x8f, 0xbf, 0xf8, 0xf0, 0x80, 0xc1, 0xe3, 0x7f, 0xff, 0xff, 0x83, 0x83, 0x83, 0xc1, 0xfc, 0xfe, \ | ||||
|     0xff, 0x83, 0x83, 0xdf, 0xff, 0x7e, 0x18, 0x18, 0xfe, 0xff, 0xfb, 0x1c, 0x06, 0xff, 0xff, 0xff, \ | ||||
|     0x3c, 0x0e, 0xe7, 0xff, 0xff, 0x80, 0xc0, 0xe0, 0x60, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, \ | ||||
|     0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x01, 0x0f, 0x0f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, \ | ||||
|     0x00, 0x00, 0xff, 0xff, 0xff, 0x07, 0x03, 0x03, 0x0f, 0x3f, 0x7c, 0xf8, 0xe0, 0x80, 0x00, 0x00, \ | ||||
|     0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, \ | ||||
|     0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, \ | ||||
|     0x03, 0x03, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, \ | ||||
|     0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, \ | ||||
|     0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x38, 0x20, 0x40, 0x40, \ | ||||
|     0x40, 0x40, 0x43, 0x43, 0x43, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x43, 0x43, 0x40, 0x40, \ | ||||
|     0x40, 0x40, 0x43, 0x43, 0x43, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41, 0x43, 0x43, 0x43, 0x40, \ | ||||
|     0x40, 0x40, 0x60, 0x30, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; | ||||
| 
 | ||||
| uint16_t startup_timer = 0; | ||||
| bool redrawn_splash = false; | ||||
| 
 | ||||
| 
 | ||||
| #ifdef BONGOCAT | ||||
| 
 | ||||
| 
 | ||||
| #define ANIM_FRAME_DURATION 75 | ||||
| #define IDLE_FRAMES 5 | ||||
| #define IDLE_TIMEOUT 750 | ||||
| #define SLEEP_TIMEOUT 15000 | ||||
| 
 | ||||
| 
 | ||||
| static const uint8_t bongofont[] PROGMEM = { \ | ||||
|     0xC1, 0xC1, 0xC2, 0x04, 0x08, 0x10, \ | ||||
|     0xC0, 0x38, 0x04, 0x03, 0x00, 0x00, \ | ||||
|     0xA0, 0x22, 0x24, 0x14, 0x12, 0x12, \ | ||||
|     0xA0, 0x21, 0x22, 0x12, 0x11, 0x11, \ | ||||
|     0x83, 0x7C, 0x41, 0x41, 0x40, 0x40, \ | ||||
|     0x82, 0x82, 0x84, 0x08, 0x10, 0x20, \ | ||||
|     0x80, 0x80, 0x00, 0x00, 0x00, 0x00, \ | ||||
|     0x80, 0x70, 0x19, 0x06, 0x00, 0x00, \ | ||||
|     0x80, 0x70, 0x0C, 0x03, 0x00, 0x00, \ | ||||
|     0x80, 0x00, 0x30, 0x30, 0x00, 0xC0, \ | ||||
|     0x80, 0x00, 0x30, 0x30, 0x00, 0x00, \ | ||||
|     0x49, 0x88, 0x08, 0x08, 0x08, 0x00, \ | ||||
|     0x44, 0x84, 0x04, 0x04, 0x00, 0x00, \ | ||||
|     0x40, 0x80, 0x00, 0x00, 0x00, 0x00, \ | ||||
|     0x40, 0x40, 0x20, 0x20, 0x20, 0x20, \ | ||||
|     0x3C, 0xC2, 0x01, 0x01, 0x02, 0x02, \ | ||||
|     0x35, 0x01, 0x8A, 0x7C, 0x00, 0x00, \ | ||||
|     0x20, 0x40, 0x80, 0x00, 0x00, 0x00, \ | ||||
|     0x20, 0x21, 0x22, 0x12, 0x11, 0x11, \ | ||||
|     0x20, 0x20, 0x10, 0x10, 0x10, 0x10, \ | ||||
|     0x1E, 0xE1, 0x00, 0x00, 0x01, 0x01, \ | ||||
|     0x1C, 0xE2, 0x01, 0x01, 0x02, 0x02, \ | ||||
|     0x18, 0x64, 0x82, 0x02, 0x02, 0x02, \ | ||||
|     0x18, 0x60, 0x80, 0x00, 0x00, 0x00, \ | ||||
|     0x18, 0x18, 0x1B, 0x03, 0x00, 0x40, \ | ||||
|     0x18, 0x06, 0x05, 0x98, 0x99, 0x84, \ | ||||
|     0x12, 0x0B, 0x08, 0x08, 0x08, 0x08, \ | ||||
|     0x11, 0x09, 0x08, 0x08, 0x08, 0x08, \ | ||||
|     0x10, 0x10, 0xD0, 0x11, 0x0F, 0x21, \ | ||||
|     0x10, 0x10, 0x10, 0x11, 0x0F, 0x01, \ | ||||
|     0x10, 0x08, 0x08, 0x04, 0x04, 0x04, \ | ||||
|     0x10, 0x08, 0x04, 0x02, 0x02, 0x04, \ | ||||
|     0x0C, 0x30, 0x40, 0x80, 0x00, 0x00, \ | ||||
|     0x0C, 0x0C, 0x0D, 0x01, 0x00, 0x40, \ | ||||
|     0x08, 0xE8, 0x08, 0x07, 0x10, 0x24, \ | ||||
|     0x08, 0x30, 0x40, 0x80, 0x00, 0x00, \ | ||||
|     0x08, 0x08, 0x08, 0x07, 0x00, 0x00, \ | ||||
|     0x08, 0x08, 0x04, 0x02, 0x02, 0x02, \ | ||||
|     0x08, 0x04, 0x02, 0x01, 0x01, 0x02, \ | ||||
|     0x05, 0x05, 0x09, 0x09, 0x10, 0x10, \ | ||||
|     0x04, 0x38, 0x40, 0x80, 0x00, 0x00, \ | ||||
|     0x04, 0x04, 0x08, 0x08, 0x10, 0x10, \ | ||||
|     0x04, 0x04, 0x04, 0x04, 0x04, 0x04, \ | ||||
|     0x04, 0x04, 0x02, 0x01, 0x00, 0x00, \ | ||||
|     0x02, 0x02, 0x81, 0x80, 0x80, 0x00, \ | ||||
|     0x02, 0x02, 0x04, 0x04, 0x08, 0x08, \ | ||||
|     0x02, 0x02, 0x02, 0x01, 0x01, 0x01, \ | ||||
|     0x02, 0x02, 0x01, 0x00, 0x00, 0x00, \ | ||||
|     0x01, 0xE1, 0x1A, 0x06, 0x09, 0x31, \ | ||||
|     0x01, 0x01, 0x02, 0x04, 0x08, 0x10, \ | ||||
|     0x01, 0x00, 0x00, 0x00, 0x00, 0x00, \ | ||||
|     0x00, 0x80, 0x80, 0x00, 0x00, 0x00, \ | ||||
|     0x00, 0x80, 0x40, 0x40, 0x20, 0x20, \ | ||||
|     0x00, 0x00, 0x80, 0x80, 0x40, 0x40, \ | ||||
|     0x00, 0x00, 0x60, 0x60, 0x00, 0x81, \ | ||||
|     0x00, 0x00, 0x01, 0x01, 0x00, 0x40, \ | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x18, \ | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, \ | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x03, \ | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x01, \ | ||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00};  | ||||
| 
 | ||||
| 
 | ||||
| static const uint8_t bongo_line_x[] = {51, 49, 48, 57}; | ||||
| static const uint8_t bongo_line_y[] = {0, 8, 16, 24}; | ||||
| static const uint8_t bongo_line_len[] = {5, 7, 8, 6}; | ||||
| 
 | ||||
| const uint8_t bongo_line_data[8][26] PROGMEM = { | ||||
|     { //idle1
 | ||||
|     60, 52, 19, 30, 35, \ | ||||
|     22, 47, 51, 60, 9, 0, 17, \ | ||||
|     1, 57, 33, 3, 27, 41, 29, 50, \ | ||||
|     45, 36, 60, 60, 60, 60}, \ | ||||
|     { //idle2
 | ||||
|     60, 52, 19, 30, 35, \ | ||||
|     22, 47, 51, 60, 9, 0, 17, \ | ||||
|     1, 57, 33, 3, 27, 41, 29, 50, \ | ||||
|     45, 36, 60, 60, 60, 60}, \ | ||||
|     { //idle3
 | ||||
|     60, 53, 14, 31, 23, \ | ||||
|     15, 43, 60, 60, 54, 5, 13, \ | ||||
|     7, 56, 24, 2, 26, 39, 29, 50, \ | ||||
|     45, 36, 60, 60, 60, 60}, \ | ||||
|     { //idle4
 | ||||
|     6, 52, 19, 38, 32, \ | ||||
|     20, 47, 51, 60, 9, 0, 17, \ | ||||
|     8, 57, 33, 3, 27, 41, 29, 50, \ | ||||
|     45, 36, 60, 60, 60, 60}, \ | ||||
|     { //idle5
 | ||||
|     60, 52, 19, 37, 40, \ | ||||
|     21, 47, 51, 60, 9, 0, 17, \ | ||||
|     8, 57, 33, 3, 27, 41, 29, 50, \ | ||||
|     45, 36, 60, 60, 60, 60}, \ | ||||
|     { //prep
 | ||||
|     6, 52, 19, 38, 32, \ | ||||
|     20, 44, 51, 60, 10, 48, 16, \ | ||||
|     8, 25, 4, 18, 27, 42, 46, 50, \ | ||||
|     60, 60, 60, 60, 60, 60}, \ | ||||
|     { //tap1
 | ||||
|     6, 52, 19, 38, 32, \ | ||||
|     20, 44, 51, 60, 10, 49, 17, \ | ||||
|     8, 25, 4, 18, 27, 41, 28, 11, \ | ||||
|     60, 60, 60, 60, 58, 59}, \ | ||||
|     { //tap2
 | ||||
|     6, 52, 19, 38, 32, \ | ||||
|     20, 47, 51, 60, 10, 48, 16, \ | ||||
|     8, 60, 55, 3, 27, 42, 46, 50, \ | ||||
|     45, 34, 12, 60, 60, 60} | ||||
| }; | ||||
| 
 | ||||
| enum anin_states { sleep, idle, prep, tap }; | ||||
| uint8_t anim_state = idle; | ||||
| uint32_t idle_timeout_timer = 0; | ||||
| uint32_t anim_timer = 0; | ||||
| uint8_t current_idle_frame = 0; | ||||
| uint8_t current_tap_frame = 6; | ||||
| uint8_t last_bongo_frame = 12; | ||||
| 
 | ||||
| void write_bongochar_at_pixel_xy(uint8_t x, uint8_t y, uint8_t data, bool invert) { | ||||
|     uint8_t i, j, temp; | ||||
|     for (i = 0; i < 6 ; i++) { // 6 = font width
 | ||||
|         temp = pgm_read_byte(&bongofont[data * 6]+i); | ||||
|         for (j = 0; j < 8; j++) {  // 8 = font height
 | ||||
|             if (temp & 0x01) { | ||||
|                 oled_write_pixel(x + i, y + j, !invert); | ||||
|             } else { | ||||
|                 oled_write_pixel(x + i, y + j, invert); | ||||
|             } | ||||
|             temp >>= 1; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| bool is_key_down(void) { | ||||
|     for (uint8_t i = 0; i < MATRIX_ROWS; i++) { | ||||
|         if (matrix[i] > 0) { | ||||
|             return true; | ||||
|         } | ||||
|     } | ||||
|     return false; | ||||
| } | ||||
| 
 | ||||
| void eval_anim_state(void) { | ||||
|     bool key_down; | ||||
|     key_down = is_key_down(); | ||||
| 
 | ||||
|     switch (anim_state) { | ||||
|         case sleep: | ||||
|             if(key_down) { anim_state = tap; } | ||||
|             break;  | ||||
|         case idle: | ||||
|             if(key_down) { anim_state = tap; } | ||||
|             else if (timer_elapsed32(idle_timeout_timer) >= SLEEP_TIMEOUT) //prep to idle
 | ||||
|                 { | ||||
|                     anim_state = sleep; | ||||
|                     current_idle_frame = 0; | ||||
|                 } | ||||
|             break; | ||||
|         case prep: | ||||
|             if(key_down) { anim_state = tap; } | ||||
|             else if (timer_elapsed32(idle_timeout_timer) >= IDLE_TIMEOUT) //prep to idle
 | ||||
|                 { | ||||
|                     anim_state = idle; | ||||
|                     current_idle_frame = 0; | ||||
|                 } | ||||
|             break; | ||||
|         case tap: | ||||
|             if (!key_down) | ||||
|             { | ||||
|                 anim_state = prep; | ||||
|                 idle_timeout_timer = timer_read32(); | ||||
|             } | ||||
|             break; | ||||
|         default: | ||||
|             break; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void draw_bongo_table(void) { | ||||
|     //draws the table edge for bongocat, this edge doesn't change during the animation
 | ||||
|     uint8_t i; | ||||
|     uint8_t y = 31; | ||||
|     uint8_t j = 0; | ||||
|     for (i = 17; i < 57; i++) { | ||||
|         oled_write_pixel(i, y, true); //every five horizontal pixels, move up one pixel to make a diagonal line
 | ||||
|         if (j == 4) { | ||||
|             --y; | ||||
|             j=0; | ||||
|         } else { | ||||
|             j++; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     y=15; | ||||
|     j=0; | ||||
|     for (i = 91; i < 128; i++) { | ||||
| 
 | ||||
|         oled_write_pixel(i, y, true); //every four horizontal pixels, move up one pixel to make a diagonal line
 | ||||
|         if (j == 3) { | ||||
|             --y; | ||||
|             j=0; | ||||
|         } else { | ||||
|             j++; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| void draw_bongocat_frame(int framenumber) { | ||||
|     //only redraw if the animation frame has changed
 | ||||
|     if (framenumber != last_bongo_frame) { | ||||
|         last_bongo_frame = framenumber; | ||||
|         uint8_t i, j, current_bongochar = 0; | ||||
|         for (i = 0; i < 4; i++) { | ||||
|             for (j = 0; j < bongo_line_len[i]; j++) { | ||||
|                 write_bongochar_at_pixel_xy(bongo_line_x[i] + j*6, bongo_line_y[i], pgm_read_byte(&bongo_line_data[framenumber][current_bongochar]), false); | ||||
|                 current_bongochar++; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|      | ||||
| } | ||||
| 
 | ||||
| bool is_new_tap(void) { | ||||
|     static matrix_row_t old_matrix[] = { 0, 0, 0, 0, 0, 0 }; | ||||
|     bool new_tap = false; | ||||
|     for (uint8_t i = 0; i < MATRIX_ROWS; i++) { | ||||
|         if (matrix[i] > old_matrix[i]) { // more 1's detected, there was a new tap
 | ||||
|             new_tap = true; | ||||
|         } | ||||
|         old_matrix[i] = matrix[i]; | ||||
|     } | ||||
|     return new_tap; | ||||
| } | ||||
| 
 | ||||
| void draw_bongocat(void) { | ||||
|     static bool already_tapped = false; | ||||
|     if (is_new_tap()) { | ||||
|         already_tapped = false; | ||||
|     }; | ||||
|     eval_anim_state(); | ||||
|     switch (anim_state) { | ||||
|         case sleep: | ||||
|             draw_bongocat_frame(4); | ||||
|             break; | ||||
|         case idle:        | ||||
|             draw_bongocat_frame(4 - current_idle_frame); | ||||
|             if (timer_elapsed32(anim_timer) > ANIM_FRAME_DURATION) { | ||||
|                 current_idle_frame = (current_idle_frame + 1) % 5; | ||||
|                 anim_timer = timer_read32(); | ||||
|             } | ||||
|             break; | ||||
|         case prep: | ||||
|             draw_bongocat_frame(5); | ||||
|             already_tapped = false; | ||||
|             break; | ||||
|         case tap: | ||||
|             draw_bongocat_frame(current_tap_frame); | ||||
|             if (already_tapped == false) { | ||||
|                 if (current_tap_frame == 6) { | ||||
|                     current_tap_frame = 7; | ||||
|                 } | ||||
|                 else { | ||||
|                     current_tap_frame = 6; | ||||
|                 } | ||||
|             } | ||||
|             already_tapped = true; | ||||
|             break; | ||||
|         default: | ||||
|             draw_bongocat_frame(4); | ||||
|             already_tapped = false; | ||||
|             break; | ||||
| 
 | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| #endif //BONGOCAT
 | ||||
| 
 | ||||
| void draw_splash(void) { | ||||
|     uint8_t i, j, k, temp; | ||||
|     uint16_t count; | ||||
|     count = 0; | ||||
|     temp = pgm_read_byte(&splash[count]); | ||||
|     for (i = 0; i < 4 ; i++) { | ||||
|         for (j = 0; j < 128; j++) { | ||||
|             for (k = 0; k < 8; k++) { | ||||
|                 if (temp & 0x01) { | ||||
|                     oled_write_pixel(j, (i * 8) + k, true); | ||||
|                 } else { | ||||
|                     oled_write_pixel(j, (i * 8) + k, false); | ||||
|                 } | ||||
|                 temp >>= 1; | ||||
|                  | ||||
|             } | ||||
|             temp = pgm_read_byte(&splash[++count]); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void draw_media_arrow(uint8_t x, uint8_t y, bool fwd) { | ||||
|     draw_line_v(x, y, 7, true); | ||||
|     draw_line_v(x+4, y, 7, true); | ||||
|     draw_line_v(x+2, y+2, 3, true); | ||||
|     if (fwd) { | ||||
|         draw_line_v(x+1, y+1, 5, true); | ||||
|         oled_write_pixel(x+3, y+3, true); | ||||
|     } else { | ||||
|         draw_line_v(x+3, y+1, 5, true); | ||||
|         oled_write_pixel(x+1, y+3, true); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void draw_enc_mode(void){ | ||||
|     write_chars_at_pixel_xy(enc_mode_str_startpos[user_config.enc_mode], ENC_DISPLAY_Y + 2, enc_mode_str[user_config.enc_mode], false); | ||||
|     if (user_config.enc_mode == ENC_MEDIA) { | ||||
|         draw_media_arrow(enc_mode_str_startpos[user_config.enc_mode] - 16, ENC_DISPLAY_Y + 2, false); | ||||
|         draw_media_arrow(enc_mode_str_startpos[user_config.enc_mode] + 88, ENC_DISPLAY_Y + 2, true); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void draw_keyboard_locks(void) { | ||||
|     led_t led_state = host_keyboard_led_state(); | ||||
|     draw_text_rectangle(CAPSLOCK_DISPLAY_X, CAPSLOCK_DISPLAY_Y, 5 + (3 * 6), "CAP", led_state.caps_lock); | ||||
|     draw_text_rectangle(NUMLOCK_DISPLAY_X, NUMLOCK_DISPLAY_Y, 5 + (3 * 6), "NUM", led_state.num_lock); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| /* Encoder handling functions */ | ||||
| 
 | ||||
| __attribute__((weak)) void set_custom_encoder_mode_user(bool custom_encoder_mode) {} | ||||
| 
 | ||||
| void update_custom_encoder_mode_user(void) { | ||||
| #ifdef BONGOCAT | ||||
|     set_custom_encoder_mode_user((user_config.enc_mode == ENC_CUSTOM) || (user_config.enc_mode == ENC_SPLASH) || (user_config.enc_mode == ENC_BONGO)); | ||||
| #else | ||||
|     set_custom_encoder_mode_user((user_config.enc_mode == ENC_CUSTOM) || (user_config.enc_mode == ENC_SPLASH)); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| void update_kb_eeprom(void) { | ||||
|     eeconfig_update_kb(user_config.raw); | ||||
| } | ||||
| 
 | ||||
| void update_breathing(void); | ||||
| void matrix_init_kb(void) { | ||||
| 
 | ||||
|     user_config.raw = eeconfig_read_kb(); | ||||
|     if (user_config.enc_mode == 0xFF) { //EEPROM was cleared
 | ||||
|         user_config.enc_mode = 0; | ||||
|         user_config.oled_is_on = true; | ||||
|         user_config.breathingperiod = 1; | ||||
|         update_kb_eeprom(); | ||||
| 
 | ||||
|     } | ||||
|     startup_delay = true; | ||||
|     update_custom_encoder_mode_user(); | ||||
|     matrix_init_user(); | ||||
| } | ||||
| 
 | ||||
| void handle_encoder_switch_process_record(keyrecord_t *record) { | ||||
| 
 | ||||
|     static uint32_t encoder_press_timer = 0; | ||||
|     if (record->event.pressed) { | ||||
|         if (!user_config.oled_is_on) { | ||||
|             oled_on(); | ||||
|             user_config.oled_is_on = true; | ||||
|             OLED_awakened = true; | ||||
|             OLED_redraw = true; | ||||
|             update_kb_eeprom(); | ||||
|         } | ||||
|         encoder_press_timer = timer_read32(); | ||||
|     } else { | ||||
|         if (OLED_awakened == true) { | ||||
|             OLED_awakened = false; | ||||
|         } else { | ||||
|             if (timer_elapsed32(encoder_press_timer) < 300) { | ||||
| 
 | ||||
|                 if (get_mods() & MOD_MASK_SHIFT) { | ||||
|                     user_config.enc_mode = (user_config.enc_mode + (num_enc_modes- 1)) % num_enc_modes; | ||||
|                 } else { | ||||
|                     user_config.enc_mode = (user_config.enc_mode + 1) % num_enc_modes; | ||||
|                 } | ||||
|                 OLED_redraw = true; | ||||
|                 update_custom_encoder_mode_user(); | ||||
|                 update_kb_eeprom(); | ||||
|             } else { | ||||
|                 OLED_redraw = false; | ||||
|                 oled_clear(); | ||||
|                 user_config.oled_is_on = false; | ||||
|                 update_kb_eeprom(); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| bool process_record_kb(uint16_t keycode, keyrecord_t *record) { | ||||
|     if (record->event.key.row == ENCODER_MATRIX_ROW && record->event.key.col == ENCODER_MATRIX_COL){ | ||||
|         handle_encoder_switch_process_record(record); | ||||
|     } | ||||
|     return process_record_user(keycode, record); | ||||
| } | ||||
| 
 | ||||
| void update_breathing(void) { | ||||
|     if (user_config.breathingperiod == 1) { | ||||
|         breathing_disable(); | ||||
|     } | ||||
|     else { | ||||
|         breathing_period_set(user_config.breathingperiod); | ||||
|         breathing_enable(); | ||||
|     } | ||||
|     update_kb_eeprom(); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| void backlight_breath_change(bool increase) { //increase period or decrease period
 | ||||
|     if ((increase) && (user_config.breathingperiod < 15)) { | ||||
|         user_config.breathingperiod++; | ||||
|         update_breathing(); | ||||
|     } | ||||
|     if (!increase) { | ||||
|         if (user_config.breathingperiod > 2) { | ||||
|             user_config.breathingperiod--; | ||||
|             update_breathing(); | ||||
|         }  | ||||
|         else { | ||||
|             user_config.breathingperiod = 1; | ||||
|             update_breathing(); | ||||
| 
 | ||||
|              | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| bool encoder_update_kb(uint8_t index, bool clockwise) { | ||||
|     if (!encoder_update_user(index, clockwise)) return false; | ||||
|     switch (user_config.enc_mode) { | ||||
|         case ENC_RGB_MODE : | ||||
|             if (clockwise) { | ||||
|                 rgblight_step(); | ||||
|             } else { | ||||
|                 rgblight_step_reverse(); | ||||
|             } | ||||
|             break; | ||||
|         case ENC_RGB_BRIGHT : | ||||
|             if (clockwise) { | ||||
|                 rgblight_increase_val(); | ||||
|             } else { | ||||
|                 rgblight_decrease_val(); | ||||
|             } | ||||
|             break; | ||||
|         case ENC_BL_BRIGHT : | ||||
|             if (clockwise) { | ||||
|                 backlight_increase(); | ||||
|             } else { | ||||
|                 backlight_decrease(); | ||||
|             } | ||||
|             break; | ||||
|         case ENC_BL_BREATH : | ||||
|             backlight_breath_change(clockwise); | ||||
|             break; | ||||
|         case ENC_RGB_COLOR : | ||||
|             if (clockwise) { | ||||
|                 rgblight_increase_hue(); | ||||
|             } else { | ||||
|                 rgblight_decrease_hue(); | ||||
|             } | ||||
|             break; | ||||
|         default: | ||||
|             if (clockwise) { | ||||
|                 tap_code(enc_cw[user_config.enc_mode]); | ||||
|             } else { | ||||
|                 tap_code(enc_ccw[user_config.enc_mode]); | ||||
|             } | ||||
|     } | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| void matrix_scan_kb(void) { | ||||
|     matrix_scan_user(); | ||||
|     led_t current_led_state = host_keyboard_led_state(); | ||||
|     uint8_t current_layer = get_highest_layer(layer_state); | ||||
|     if (startup_delay) { | ||||
|         startup_timer = timer_read(); | ||||
|         startup_delay = false; | ||||
|         startup_complete = false; | ||||
|         starting_up = true; | ||||
|         OLED_redraw = false; | ||||
|     } | ||||
|     else if (starting_up) { | ||||
|         if (timer_elapsed(startup_timer) >= 200) { | ||||
|             update_breathing(); | ||||
|             startup_complete = true; | ||||
|             starting_up = false; | ||||
|             if (user_config.oled_is_on) { | ||||
|                 oled_on(); | ||||
|                 OLED_redraw = true; | ||||
|             } else | ||||
|             { | ||||
|                 oled_clear(); | ||||
|                 user_config.oled_is_on = false; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     if (startup_complete) { | ||||
|         if (user_config.enc_mode == ENC_SPLASH) { | ||||
|             if (user_config.oled_is_on && OLED_redraw) { | ||||
|                 draw_splash(); | ||||
|             } | ||||
|         } | ||||
|     #ifdef BONGOCAT | ||||
|         else if (user_config.enc_mode == ENC_BONGO) { | ||||
|             if (user_config.oled_is_on) { | ||||
|                 if (OLED_redraw) { | ||||
|                     oled_clear(); | ||||
|                     last_bongo_frame = 12; //force a redraw
 | ||||
|                     draw_bongo_table(); | ||||
|                     OLED_redraw = false; | ||||
|                 } | ||||
|                 draw_bongocat(); | ||||
| 
 | ||||
|             } | ||||
| 
 | ||||
|         } | ||||
|     #endif //BONGOCAT
 | ||||
|         else  {         | ||||
|             if (user_config.oled_is_on && ( | ||||
|                     OLED_redraw | ||||
|                     || (prev_layer != current_layer) | ||||
|                     || (prev_capslock != current_led_state.caps_lock) | ||||
|                     || (prev_numlock != current_led_state.num_lock))) { | ||||
| 
 | ||||
|                 prev_layer = current_layer; | ||||
|                 prev_capslock = current_led_state.caps_lock; | ||||
|                 prev_numlock = current_led_state.num_lock; | ||||
| 
 | ||||
|                 oled_clear(); | ||||
|                 draw_keyboard_layer(); | ||||
|                 draw_keyboard_locks(); | ||||
|                 draw_enc_mode(); | ||||
|             } | ||||
|         } | ||||
|         OLED_redraw = false; | ||||
|     } | ||||
|      | ||||
| } | ||||
| 
 | ||||
							
								
								
									
										34
									
								
								keyboards/custommk/evo70/evo70.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								keyboards/custommk/evo70/evo70.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,34 @@ | |||
| /* Copyright 2021 customMK
 | ||||
|  * | ||||
|  * 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/>.
 | ||||
|  */ | ||||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include "quantum.h" | ||||
| 
 | ||||
| #define LAYOUT( \ | ||||
|                   K11,   K61,   K12,   K13, K14, K15, K16, K17, K18,  K19, K1A, K1B,  K1C, K1D, K1E, \ | ||||
|                   K62,   K21,   K22,   K23, K24, K25, K26, K27, K28,  K29, K2A, K2B,  K2C, K2D, K2E, \ | ||||
|     K66,   K31,   K63,          K32,   K33, K34, K35, K36, K37, K38,  K39, K3A, K3B,  K3C, K3D, K3E, \ | ||||
|     K57,   K55,          K41,   K42,   K43, K44, K45, K46, K47, K48,  K49, K4A, K4B,  K4C, K4D, K4E, \ | ||||
|     K52,   K54,   K65,   K51,          K53,           K56, K67, E00A, K59, K5A, E00B, K5C, K5D, K5E \ | ||||
| ) { \ | ||||
|     { K11, K12, K13, K14,   K15,  K16, K17,   K18,   K19,   K1A,   K1B,   K1C,   K1D,   K1E }, \ | ||||
|     { K21, K22, K23, K24,   K25,  K26, K27,   K28,   K29,   K2A,   K2B,   K2C,   K2D,   K2E }, \ | ||||
|     { K31, K32, K33, K34,   K35,  K36, K37,   K38,   K39,   K3A,   K3B,   K3C,   K3D,   K3E }, \ | ||||
|     { K41, K42, K43, K44,   K45,  K46, K47,   K48,   K49,   K4A,   K4B,   K4C,   K4D,   K4E },  \ | ||||
|     { K51, K52, K53, K54,   K55,  K56, K57,   E00A,  K59,   K5A,   E00B,  K5C,   K5D,   K5E },  \ | ||||
|     { K61, K62, K63, KC_NO, K65,  K66, K67,   KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO } \ | ||||
| } | ||||
							
								
								
									
										111
									
								
								keyboards/custommk/evo70/info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										111
									
								
								keyboards/custommk/evo70/info.json
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,111 @@ | |||
| { | ||||
|     "keyboard_name": "EVO70",  | ||||
|     "url": "https://www.customMK.com",  | ||||
|     "maintainer": "customMK",  | ||||
|     "manufacturer": "customMK", | ||||
|     "tags": ["70%", "encoder", "underglow", "backlight"], | ||||
|     "usb": { | ||||
|         "vid": "0xF35B", | ||||
|         "pid": "0xFAB5", | ||||
|         "device_version": "0.0.1" | ||||
|     }, | ||||
|     "diode_direction": "COL2ROW", | ||||
|     "matrix_pins": { | ||||
|         "cols": ["F1", "F4", "E6", "B1", "B7", "B0", "E2", "D4", "D6", "D7", "B4", "B3", "B6", "C6"], | ||||
|         "rows": ["D3", "D2", "F7", "F6", "F5", "F0"] | ||||
| 
 | ||||
|     }, | ||||
|     "debounce": 5, | ||||
|     "processor": "atmega32u4", | ||||
|     "rgblight": { | ||||
|         "led_count": 48, | ||||
|         "pin": "B2", | ||||
|         "hue_steps": 4, | ||||
|         "saturation_steps": 8, | ||||
|         "brightness_steps": 4, | ||||
|         "animations": { | ||||
|             "all": true | ||||
|         } | ||||
|     }, | ||||
|     "layouts": { | ||||
|         "LAYOUT": { | ||||
|             "layout": [ | ||||
|                 {"label":"KC_ESC", "x":2.5, "y":1.1}, | ||||
|                 {"label":"KC_1", "x":3.5, "y":1.1}, | ||||
|                 {"label":"KC_2", "x":4.5, "y":1.1}, | ||||
|                 {"label":"KC_3", "x":5.5, "y":1.1}, | ||||
|                 {"label":"KC_4", "x":6.5, "y":1.1}, | ||||
|                 {"label":"KC_5", "x":7.5, "y":1.1}, | ||||
|                 {"label":"KC_6", "x":8.5, "y":1.1}, | ||||
|                 {"label":"KC_7", "x":9.5, "y":1.1}, | ||||
|                 {"label":"KC_8", "x":10.5, "y":1.1}, | ||||
|                 {"label":"KC_9", "x":11.5, "y":1.1}, | ||||
|                 {"label":"KC_0", "x":12.5, "y":1.1}, | ||||
|                 {"label":"KC_MINS", "x":13.5, "y":1.1}, | ||||
|                 {"label":"KC_EQL", "x":14.5, "y":1.1}, | ||||
|                 {"label":"KC_BSPC", "x":15.5, "y":1.1, "w":2}, | ||||
|                 {"label":"KC_DEL", "x":17.5, "y":1.1}, | ||||
|                 {"label":"KC_TAB", "x":2.5, "y":2.1, "w":1.5}, | ||||
|                 {"label":"KC_Q", "x":4, "y":2.1}, | ||||
|                 {"label":"KC_W", "x":5, "y":2.1}, | ||||
|                 {"label":"KC_E", "x":6, "y":2.1}, | ||||
|                 {"label":"KC_R", "x":7, "y":2.1}, | ||||
|                 {"label":"KC_T", "x":8, "y":2.1}, | ||||
|                 {"label":"KC_Y", "x":9, "y":2.1}, | ||||
|                 {"label":"KC_U", "x":10, "y":2.1}, | ||||
|                 {"label":"KC_I", "x":11, "y":2.1}, | ||||
|                 {"label":"KC_O", "x":12, "y":2.1}, | ||||
|                 {"label":"KC_P", "x":13, "y":2.1}, | ||||
|                 {"label":"KC_LBRC", "x":14, "y":2.1}, | ||||
|                 {"label":"KC_RBRC", "x":15, "y":2.1}, | ||||
|                 {"label":"KC_BSLS", "x":16, "y":2.1, "w":1.5}, | ||||
|                 {"label":"KC_PGUP", "x":17.5, "y":2.1}, | ||||
|                 {"label":"KC_F1", "x":0, "y":3.1}, | ||||
|                 {"label":"KC_F2", "x":1, "y":3.1}, | ||||
|                 {"label":"KC_CAPS", "x":2.5, "y":3.1, "w":1.75}, | ||||
|                 {"label":"KC_A", "x":4.25, "y":3.1}, | ||||
|                 {"label":"KC_S", "x":5.25, "y":3.1}, | ||||
|                 {"label":"KC_D", "x":6.25, "y":3.1}, | ||||
|                 {"label":"KC_F", "x":7.25, "y":3.1}, | ||||
|                 {"label":"KC_G", "x":8.25, "y":3.1}, | ||||
|                 {"label":"KC_H", "x":9.25, "y":3.1}, | ||||
|                 {"label":"KC_J", "x":10.25, "y":3.1}, | ||||
|                 {"label":"KC_K", "x":11.25, "y":3.1}, | ||||
|                 {"label":"KC_L", "x":12.25, "y":3.1}, | ||||
|                 {"label":"KC_SCLN", "x":13.25, "y":3.1}, | ||||
|                 {"label":"KC_QUOT", "x":14.25, "y":3.1}, | ||||
|                 {"label":"KC_ENT", "x":15.25, "y":3.1, "w":2.25}, | ||||
|                 {"label":"KC_PGDN", "x":17.5, "y":3.1}, | ||||
|                 {"label":"KC_F3", "x":0, "y":4.1}, | ||||
|                 {"label":"KC_F4", "x":1, "y":4.1}, | ||||
|                 {"label":"KC_LSFT", "x":2.5, "y":4.1, "w":2.25}, | ||||
|                 {"label":"KC_Z", "x":4.75, "y":4.1}, | ||||
|                 {"label":"KC_X", "x":5.75, "y":4.1}, | ||||
|                 {"label":"KC_C", "x":6.75, "y":4.1}, | ||||
|                 {"label":"KC_V", "x":7.75, "y":4.1}, | ||||
|                 {"label":"KC_B", "x":8.75, "y":4.1}, | ||||
|                 {"label":"KC_N", "x":9.75, "y":4.1}, | ||||
|                 {"label":"KC_M", "x":10.75, "y":4.1}, | ||||
|                 {"label":"KC_COMM", "x":11.75, "y":4.1}, | ||||
|                 {"label":"KC_DOT", "x":12.75, "y":4.1}, | ||||
|                 {"label":"KC_SLSH", "x":13.75, "y":4.1}, | ||||
|                 {"label":"KC_RSFT", "x":14.75, "y":4.1, "w":1.75}, | ||||
|                 {"label":"KC_UP", "x":16.5, "y":4.1}, | ||||
|                 {"label":"KC_END", "x":17.5, "y":4.1}, | ||||
|                 {"label":"KC_F5", "x":0, "y":5.1}, | ||||
|                 {"label":"KC_F6", "x":1, "y":5.1}, | ||||
|                 {"label":"KC_LCTL", "x":2.5, "y":5.1, "w":1.25}, | ||||
|                 {"label":"KC_LGUI", "x":3.75, "y":5.1, "w":1.25}, | ||||
|                 {"label":"KC_LALT", "x":5, "y":5.1, "w":1.25}, | ||||
|                 {"label":"KC_SPC", "x":6.25, "y":5.1, "w":6.25}, | ||||
|                 {"label":"KC_TRNS", "x":0.5, "y":1.1}, | ||||
|                 {"label":"KC_VOLD", "x":0, "y":0}, | ||||
|                 {"label":"KC_RALT", "x":12.5, "y":5.1, "w":1.25}, | ||||
|                 {"label":"KC_RCTL", "x":13.75, "y":5.1, "w":1.25}, | ||||
|                 {"label":"KC_VOLU", "x":1, "y":0}, | ||||
|                 {"label":"KC_LEFT", "x":15.5, "y":5.1}, | ||||
|                 {"label":"KC_DOWN", "x":16.5, "y":5.1}, | ||||
|                 {"label":"KC_RGHT", "x":17.5, "y":5.1}] | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										49
									
								
								keyboards/custommk/evo70/keymaps/default/keymap.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								keyboards/custommk/evo70/keymaps/default/keymap.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,49 @@ | |||
| /* Copyright 2021 customMK
 | ||||
|  * | ||||
|  * 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 QMK_KEYBOARD_H | ||||
| 
 | ||||
| const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||
| 
 | ||||
| 	[0] = LAYOUT( | ||||
| 						  KC_GESC, KC_1,    KC_2,    KC_3,    KC_4,     KC_5,    KC_6,     KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_BSPC, 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_LBRC, KC_RBRC, KC_BSLS, KC_PGUP,  | ||||
| 		KC_F1,   KC_F2,   KC_CAPS, 			KC_A,    KC_S,    KC_D,     KC_F,    KC_G,     KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT, KC_ENT,  KC_PGDN,  | ||||
| 	    KC_F3,   KC_F4,	           KC_LSFT, KC_Z,    KC_X,    KC_C,     KC_V,    KC_B,     KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT, KC_UP,   KC_END,  | ||||
| 		KC_F5,   KC_F6,   KC_LCTL, KC_LWIN,          KC_LALT,                    KC_SPACE, KC_NO,   KC_VOLD, KC_RALT, KC_RCTL, KC_VOLU, KC_LEFT, KC_DOWN, KC_RGHT), | ||||
| 	 | ||||
| 	[1] = LAYOUT( | ||||
| 						  RESET,   KC_F1,   KC_F2,   KC_F3,   KC_F4,    KC_F5,   KC_F6,    KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_TRNS, KC_TRNS,  | ||||
| 						  KC_TRNS, KC_TRNS, KC_BSLS, KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  | ||||
| 		KC_F7,   KC_F8,   KC_TRNS,          BL_TOGG, BL_STEP, BL_BRTG,  KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  | ||||
| 	    KC_F9,   KC_F10,           KC_TRNS, RGB_TOG, RGB_MOD, RGB_RMOD, RGB_VAI, RGB_VAD,  RGB_HUI, RGB_HUD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  | ||||
| 		KC_F11,  KC_F12,  KC_TRNS, KC_TRNS,          KC_TRNS,                    KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), | ||||
| 
 | ||||
| 	[2] = LAYOUT( | ||||
| 						  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  | ||||
| 						  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  | ||||
| 		KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS, KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  | ||||
| 	    KC_TRNS, KC_TRNS, 		   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  | ||||
| 		KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS,                    KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), | ||||
| 
 | ||||
| 	[3] = LAYOUT( | ||||
| 						  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  | ||||
| 						  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  | ||||
| 		KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS, KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  | ||||
| 	    KC_TRNS, KC_TRNS, 		   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  | ||||
| 		KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS,                    KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), | ||||
| 
 | ||||
| }; | ||||
							
								
								
									
										3
									
								
								keyboards/custommk/evo70/keymaps/default/readme.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								keyboards/custommk/evo70/keymaps/default/readme.md
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,3 @@ | |||
| # Default EVO70 Layout | ||||
| 
 | ||||
| This is the default layout for EVO70. | ||||
							
								
								
									
										98
									
								
								keyboards/custommk/evo70/keymaps/via/keymap.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								keyboards/custommk/evo70/keymaps/via/keymap.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,98 @@ | |||
| /* Copyright 2021 customMK
 | ||||
|  * | ||||
|  * 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 QMK_KEYBOARD_H | ||||
| 
 | ||||
| const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | ||||
| 
 | ||||
| 	[0] = LAYOUT( | ||||
| 						  KC_GESC, KC_1,    KC_2,    KC_3,    KC_4,     KC_5,    KC_6,     KC_7,    KC_8,    KC_9,    KC_0,    KC_MINS, KC_EQL,  KC_BSPC, 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_LBRC, KC_RBRC, KC_BSLS, KC_PGUP,  | ||||
| 		KC_F1,   KC_F2,   KC_CAPS, 			KC_A,    KC_S,    KC_D,     KC_F,    KC_G,     KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT, KC_ENT,  KC_PGDN,  | ||||
| 	    KC_F3,   KC_F4,            KC_LSFT, KC_Z,    KC_X,    KC_C,     KC_V,    KC_B,     KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_RSFT, KC_UP,   KC_END,  | ||||
| 		KC_F5,   KC_F6,   KC_LCTL, KC_LWIN,          KC_LALT,                    KC_SPACE, KC_NO,   KC_VOLD, KC_RALT, KC_RCTL, KC_VOLU, KC_LEFT, KC_DOWN, KC_RGHT), | ||||
| 
 | ||||
| 	[1] = LAYOUT( | ||||
| 						  RESET,   KC_F1,   KC_F2,   KC_F3,   KC_F4,    KC_F5,   KC_F6,    KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  KC_TRNS, KC_TRNS,  | ||||
| 						  KC_TRNS, KC_TRNS, KC_BSLS, KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  | ||||
| 		KC_F7,   KC_F8,   KC_TRNS,          BL_TOGG, BL_STEP, BL_BRTG,  KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  | ||||
| 	    KC_F9,   KC_F10,           KC_TRNS, RGB_TOG, RGB_MOD, RGB_RMOD, RGB_VAI, RGB_VAD,  RGB_HUI, RGB_HUD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,   | ||||
| 		KC_F11,  KC_F12,  KC_TRNS, KC_TRNS,          KC_TRNS,                    KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), | ||||
| 
 | ||||
| 	[2] = LAYOUT( | ||||
| 						  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  | ||||
| 						  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  | ||||
| 		KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS, KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  | ||||
| 	    KC_TRNS, KC_TRNS, 		   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  | ||||
| 		KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS,                    KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), | ||||
| 
 | ||||
| 	[3] = LAYOUT( | ||||
| 						  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  | ||||
| 						  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  | ||||
| 		KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS, KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  | ||||
| 	    KC_TRNS, KC_TRNS, 		   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,  | ||||
| 		KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,          KC_TRNS,                    KC_TRNS,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), | ||||
| 
 | ||||
| }; | ||||
| 
 | ||||
| static bool custom_encoder_mode = false; | ||||
| 
 | ||||
| void set_custom_encoder_mode_user(bool custom_mode) { | ||||
| 	custom_encoder_mode = custom_mode; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| keyevent_t encoder_ccw = { | ||||
|     .key = (keypos_t){.row = 4, .col = 7}, | ||||
|     .pressed = false | ||||
| }; | ||||
| 
 | ||||
| keyevent_t encoder_cw = { | ||||
|     .key = (keypos_t){.row = 4, .col = 10}, | ||||
|     .pressed = false | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| bool encoder_update_user(uint8_t index, bool clockwise) { | ||||
| 	if (custom_encoder_mode) { | ||||
| 	    if (clockwise) { | ||||
| 	        encoder_cw.pressed = true; | ||||
| 		    encoder_cw.time = (timer_read() | 1); | ||||
| 		    action_exec(encoder_cw); | ||||
| 	    } | ||||
| 	    else { | ||||
| 		    encoder_ccw.pressed = true; | ||||
| 		    encoder_ccw.time = (timer_read() | 1); | ||||
| 		    action_exec(encoder_ccw); | ||||
| 	    } | ||||
| 		return false; | ||||
| 	} | ||||
| 	return true; | ||||
| } | ||||
| 
 | ||||
| void matrix_scan_user(void) { | ||||
| 	if (IS_PRESSED(encoder_ccw)) { | ||||
| 		encoder_ccw.pressed = false; | ||||
| 		encoder_ccw.time = (timer_read() | 1); | ||||
| 		action_exec(encoder_ccw); | ||||
| 	} | ||||
| 
 | ||||
| 	if (IS_PRESSED(encoder_cw)) { | ||||
| 		encoder_cw.pressed = false; | ||||
| 		encoder_cw.time = (timer_read() | 1); | ||||
| 		action_exec(encoder_cw); | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										3
									
								
								keyboards/custommk/evo70/keymaps/via/readme.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								keyboards/custommk/evo70/keymaps/via/readme.md
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,3 @@ | |||
| # EVO70 Layout for VIA | ||||
| 
 | ||||
| This is the via layout for the EVO70. It is identical to the default layout except VIA is enabled. | ||||
							
								
								
									
										2
									
								
								keyboards/custommk/evo70/keymaps/via/rules.mk
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								keyboards/custommk/evo70/keymaps/via/rules.mk
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,2 @@ | |||
| VIA_ENABLE = yes | ||||
| LTO_ENABLE = yes | ||||
							
								
								
									
										21
									
								
								keyboards/custommk/evo70/readme.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								keyboards/custommk/evo70/readme.md
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,21 @@ | |||
| # EVO70 | ||||
| 
 | ||||
| EVO70 is a 70% keyboard (65% w/left side function cluster) designed and produced by customMK.  | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| * Keyboard Maintainer: [customMK](https://github.com/customMK) | ||||
| * Hardware Supported: EVO70 | ||||
| * Hardware Availability: [customMK](https://shop.custommk.com/collections/evo70/products/evo70) | ||||
| 
 | ||||
| Make example for this keyboard (after setting up your build environment): | ||||
| 
 | ||||
|     make custommk/evo70:default | ||||
| 
 | ||||
| Flashing example for this keyboard: | ||||
| 
 | ||||
|     make custommk/evo70:default:flash | ||||
| 
 | ||||
| EVO70 has qmk-dfu bootloader preinstalled. To enter the bootloader, run the flashing command above, and then either plug in the USB connection while holding the top-left key, or alternatively, plug in the USB connection and then press the reset button on the PCB | ||||
| 
 | ||||
| See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). | ||||
							
								
								
									
										22
									
								
								keyboards/custommk/evo70/rules.mk
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								keyboards/custommk/evo70/rules.mk
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,22 @@ | |||
| # MCU name
 | ||||
| MCU = atmega32u4 | ||||
| 
 | ||||
| # Bootloader selection
 | ||||
| BOOTLOADER = qmk-dfu | ||||
| 
 | ||||
| # Build Options
 | ||||
| #   change yes to no to disable
 | ||||
| #
 | ||||
| BOOTMAGIC_ENABLE = yes      # Enable Bootmagic Lite | ||||
| MOUSEKEY_ENABLE = no        # Mouse keys | ||||
| EXTRAKEY_ENABLE = yes       # Audio control and System control | ||||
| CONSOLE_ENABLE = no         # Console for debug | ||||
| COMMAND_ENABLE = no         # Commands for debug and configuration | ||||
| NKRO_ENABLE = yes           # Enable N-Key Rollover | ||||
| BACKLIGHT_ENABLE = yes      # Enable keyboard backlight functionality | ||||
| RGBLIGHT_ENABLE = yes       # Enable keyboard RGB underglow | ||||
| AUDIO_ENABLE = no           # Audio output | ||||
| ENCODER_ENABLE = yes | ||||
| OLED_ENABLE = yes | ||||
| OLED_DRIVER = SSD1306 | ||||
| LTO_ENABLE = yes | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 QMK Bot
						QMK Bot