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

232 lines
11 KiB

/*
* Dan's Magicforce 68 (MF68) QMK Keyboard
* Copyright (C) Dan <https://github.com/delivrance>
*
* This file is part of Dan's MF68 QMK Keyboard.
*
* Dan's MF68 QMK Keyboard 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 3 of the License, or
* (at your option) any later version.
*
* Dan's MF68 QMK Keyboard 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 Dan's MF68 QMK Keyboard. If not, see <https://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
#define KC_ KC_TRNS
#define KC_FN1 MO(_FN)
#define KC_FN2 LT(_FN, KC_CAPS)
#define KC_BLUP BL_INC // Backlight increase
#define KC_BLDN BL_DEC // Backlight decrease
#define KC_BLTOG BL_TOGG // Backlight toggle
#define KC_TERM TERM_ON // Terminal mode on
#define KC_REC1 DM_REC1 // Record macro 1
#define KC_PLY1 DM_PLY1 // Play macro 1
#define KC_REC2 DM_REC2 // Record macro 2
#define KC_PLY2 DM_PLY2 // Play macro 1
#define KC_RSTP DM_RSTP // Stop macro recording
enum {
_QWERTY,
_FN
};
/* โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”“ โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”“
โ”ƒEsc โ”ƒ 1! โ”ƒ 2@ โ”ƒ 3# โ”ƒ 4$ โ”ƒ 5% โ”ƒ 6^ โ”ƒ 7& โ”ƒ 8* โ”ƒ 9( โ”ƒ 0) โ”ƒ -_ โ”ƒ =+ โ”ƒ โ†โ”€ โ”ƒ โ”ƒIns โ”ƒPgUpโ”ƒ
โ”ฃโ”โ”โ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”โ”โ”โ”โ”ซ โ”ฃโ”โ”โ”โ”โ•‹โ”โ”โ”โ”โ”ซ
โ”ƒ Tab โ”ƒ Q โ”ƒ W โ”ƒ E โ”ƒ R โ”ƒ T โ”ƒ Y โ”ƒ U โ”ƒ I โ”ƒ O โ”ƒ P โ”ƒ [{ โ”ƒ ]} โ”ƒ \| โ”ƒ โ”ƒDel โ”ƒPgDnโ”ƒ
โ”ฃโ”โ”โ”โ”โ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”โ”โ”โ”โ”โ”ซ โ”—โ”โ”โ”โ”โ”ปโ”โ”โ”โ”โ”›
โ”ƒ Caps โ”ƒ A โ”ƒ S โ”ƒ D โ”ƒ F โ”ƒ G โ”ƒ H โ”ƒ J โ”ƒ K โ”ƒ L โ”ƒ ;: โ”ƒ '" โ”ƒ Enter โ”ƒ Magicforce
โ”ฃโ”โ”โ”โ”โ”โ”โ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ซ โ”โ”โ”โ”โ”โ”“
โ”ƒ Shift โ”ƒ Z โ”ƒ X โ”ƒ C โ”ƒ V โ”ƒ B โ”ƒ N โ”ƒ M โ”ƒ ,< โ”ƒ .> โ”ƒ /? โ”ƒ Shift โ”ƒ โ”ƒ โ†‘ โ”ƒ Dan
โ”ฃโ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”ปโ”ณโ”โ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”โ”โ”โ”ปโ”โ”โ”โ”โ”ปโ”โ”โ”โ”โ”ปโ”โ”โ”โ”โ”ปโ”โ”โ”โ”โ”ปโ”โ”โ”โ”ณโ”ปโ”โ”โ”โ”โ•‹โ”โ”โ”โ”โ”ปโ”ณโ”โ”โ”โ”โ”โ”ณโ”โ”โ”ณโ”โ”โ”ปโ”โ•‹โ”โ”โ”โ”โ•‹โ”โ”โ”โ”โ”“
โ”ƒCtrl โ”ƒ GUI โ”ƒ Alt โ”ƒ โ”โ”โ”โ”โ” โ”ƒ Alt โ”ƒ Fn โ”ƒCtrl โ”ƒ โ”ƒ โ† โ”ƒ โ†“ โ”ƒ โ†’ โ”ƒ
โ”—โ”โ”โ”โ”โ”โ”ปโ”โ”โ”โ”โ”โ”ปโ”โ”โ”โ”โ”โ”ปโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ปโ”โ”โ”โ”โ”โ”ปโ”โ”โ”โ”โ”โ”ปโ”โ”โ”โ”โ”โ”› โ”—โ”โ”โ”โ”โ”ปโ”โ”โ”โ”โ”ปโ”โ”โ”โ”โ”› */
// clang-format off
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_QWERTY] = LAYOUT_kc( /* Default layer
โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”“ โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”“ */
GESC, 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,MINS,EQL , BSPC , INS ,PGUP, /*
โ”ฃโ”โ”โ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”โ”โ”โ”โ”ซ โ”ฃโ”โ”โ”โ”โ•‹โ”โ”โ”โ”โ”ซ */
TAB , Q , W , E , R , T , Y , U , I , O , P ,LBRC,RBRC, BSLS , DEL ,PGDN, /*
โ”ฃโ”โ”โ”โ”โ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”โ”โ”โ”โ”โ”ซ โ”—โ”โ”โ”โ”โ”ปโ”โ”โ”โ”โ”› */
FN2 , A , S , D , F , G , H , J , K , L ,SCLN,QUOT, ENTER , /*
โ”ฃโ”โ”โ”โ”โ”โ”โ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ซ โ”โ”โ”โ”โ”โ”“ */
LSFT , Z , X , C , V , B , N , M ,COMM,DOT ,SLSH, RSFT , UP , /*
โ”ฃโ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”ปโ”ณโ”โ”โ”โ”ปโ”โ”ณโ”โ”โ”ปโ”โ”โ”โ”โ”ปโ”โ”โ”โ”โ”ปโ”โ”โ”โ”โ”ปโ”โ”โ”โ”โ”ปโ”โ”โ”โ”โ”ปโ”โ”โ”โ”ณโ”ปโ”โ”โ”โ”โ•‹โ”โ”โ”โ”โ”ปโ”ณโ”โ”โ”โ”โ”โ”ณโ”โ”โ”ณโ”โ”โ”ปโ”โ•‹โ”โ”โ”โ”โ•‹โ”โ”โ”โ”โ”“ */
LCTL ,LGUI ,LALT , SPACE ,RALT , FN1 ,RCTL , LEFT,DOWN,RGHT /*
โ”—โ”โ”โ”โ”โ”โ”ปโ”โ”โ”โ”โ”โ”ปโ”โ”โ”โ”โ”โ”ปโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ปโ”โ”โ”โ”โ”โ”ปโ”โ”โ”โ”โ”โ”ปโ”โ”โ”โ”โ”โ”› โ”—โ”โ”โ”โ”โ”ปโ”โ”โ”โ”โ”ปโ”โ”โ”โ”โ”› */),
[_FN] = LAYOUT_kc( /* FN & CAPS layer
โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”“ โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”“ */
GRV , F1 , F2 , F3 , F4 , F5 , F6 , F7 , F8 , F9 , F10, F11, F12, RSTP , PSCR,HOME, /*
โ”ฃEsc โ”ป 1! โ”ป 2@ โ”ป 3# โ”ป 4$ โ”ป 5% โ”ป 6^ โ”ป 7& โ”ป 8* โ”ป 9( โ”ป 0) โ”ป -_ โ”ป =+ โ”ปโ”โ”ณโ” โ†โ”€ โ”โ”ซ โ”ฃIns โ•‹PgUpโ”ซ */
,PLY1,PLY2, , , , , , 7 , 8 , 9 ,BLDN,BLUP,BLTOG , ,END , /*
โ”ฃ Tab โ”โ”ป Q โ”โ”ป W โ”โ”ป E โ”โ”ป R โ”โ”ป T โ”โ”ป Y โ”โ”ป U โ”โ”ป I โ”โ”ป O โ”โ”ป P โ”โ”ป [{ โ”ป ]} โ”ปโ” \| โ”โ”ซ โ”—Del โ”ปPgDnโ”› */
, , , , , , , , 4 , 5 , 6 , , TERM , /*
โ”ฃโ” Caps โ”โ”ป A โ”โ”ป S โ”โ”ป D โ”โ”ป F โ”โ”ป G โ”โ”ป H โ”โ”ป J โ”โ”ป K โ”โ”ป L โ”โ”ป ;: โ”ป '" โ”ปโ” Enter โ”โ”ซ โ”โ”โ”โ”โ”โ”“ */
,REC1,REC2, , ,MSTP, ,MUTE, 1 , 2 , 3 , , VOLU, /*
โ”ฃโ”โ” Shift โ”โ”ป Z โ”โ”ป X โ”โ”ป C โ”โ”ป V โ”โ”ป B โ”โ”ป N โ”โ”ป M โ”โ”ป ,< โ”ป .> โ•‹ /? โ”ปโ”ณโ”โ” Shift โ”โ”โ”ปโ”โ•‹ โ†‘ โ”โ•‹โ”โ”โ”โ”โ”“ */
, , , MPLY , 0 , , , MPRV,VOLD,MNXT /*
โ”—Ctrl โ”ป GUI โ”ป Alt โ”ปโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ” Space โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ป Alt โ”ป Fn โ”โ”ปCtrl โ”› โ”— โ† โ”โ”ป โ†“ โ”โ”ป โ†’ โ”โ”› */)
};
// clang-format on
// Initialization code
// -------------------
void keyboard_post_init_user(void) {
backlight_level(2);
}
// Custom backlight driver
// -----------------------
// http://jared.geek.nz/2013/feb/linear-led-pwm
float cie1931(float x) {
x *= 100.0 / BACKLIGHT_LEVELS;
float y;
if (x < 8) {
y = x / 902.3;
} else {
y = (x + 16.0) / 116.0;
y = y * y * y;
}
return round(y * 255);
}
void backlight_init_ports(void) {
setPinOutput(BACKLIGHT_PIN);
writePinLow(BACKLIGHT_PIN);
TCCR1A = _BV(COM1A1) | _BV(WGM11);
TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10);
ICR1 = 0xFFU; // Set PWM levels to 255 (enables high-frequency PWM)
}
void backlight_set(uint8_t level) {
if (level > BACKLIGHT_LEVELS) {
level = BACKLIGHT_LEVELS;
}
if (level == 0) {
TCCR1A &= ~(_BV(COM1A1)); // Disable PWM
} else {
TCCR1A |= _BV(COM1A1); // Enable PWM
}
OCR1A = cie1931(level);
}
// Custom macro hooks
// ------------------
// Redefine with lower delay
void led_blink(void) {
backlight_toggle();
wait_ms(25);
backlight_toggle();
}
void dynamic_macro_record_start_user(void) {
led_blink();
}
void dynamic_macro_play_user(int8_t direction) {
led_blink();
}
void dynamic_macro_record_key_user(int8_t direction, keyrecord_t *record) {
led_blink();
}
void dynamic_macro_record_end_user(int8_t direction) {
led_blink();
}
// Custom Caps Lock backlight behaviour
// ------------------------------------
void led_set_user(uint8_t usb_led) {
// This exists because I don't like the backlight to turn OFF when the Caps Lock is ON.
// That is, this will turn the backlight ON (at half the brightness) when the Caps Lock is ON as well.
static bool prev_is_caps_on;
bool is_caps_on = IS_LED_ON(usb_led, USB_LED_CAPS_LOCK);
if (prev_is_caps_on != is_caps_on) {
prev_is_caps_on = is_caps_on;
if (is_caps_on) {
backlight_set(BACKLIGHT_LEVELS / 2);
} else {
if (is_backlight_enabled()) {
backlight_set(get_backlight_level());
} else {
backlight_set(0);
}
}
}
// Turn on the Pro Micro's on-board LEDs for Caps Lock
if (IS_LED_ON(usb_led, USB_LED_CAPS_LOCK)) {
// Set to low
setPinOutput(B0);
writePinLow(B0);
setPinOutput(D5);
writePinLow(D5);
} else {
// Set to Hi-Z
setPinInput(B0);
setPinInput(D5);
}
}
// Backlight idle timeout feature
// ------------------------------
static uint32_t timer;
static bool is_idle;
void matrix_scan_user() {
// Check the timer only if the keyboard is not idle
if (!is_idle) {
if (timer_elapsed32(timer) >= (uint32_t) BACKLIGHT_IDLE_TIMEOUT * 1000) {
is_idle = true;
// Both backlight_level and backlight_level_noeeprom modify the global backlight config (not useful)
// Instead, use backlight_set in order to restore the current backlight level later on
backlight_set(0);
}
}
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
// Reset timer on each keypress
timer = timer_read32();
// Enable backlight back only when keyboard is idling (which implies the backlight was turned off previously)
if (is_idle) {
is_idle = false;
// Set back the original backlight level only if it is actually enabled globally
if (is_backlight_enabled()) {
// The current backlight level can be obtained with get_backlight_level
backlight_set(get_backlight_level());
}
}
return true;
}