IMG_0620.JPG

안녕하세요.

한때 만화가를 지망 하기도 했었던.. 개발자입니다.  

만화창작전공해놓고  코딩 하고 있어요.  어째서 일까요. 


연휴에 회사에서 사용하던 PLANCK키보드를 집에 가져와서 또 키보드의 매핑 을  이리저리 바꿔보고 있는데...

(코딩으로 밥벌어먹고 있는데. 취미도 코딩...)

찬찬히 살펴보니 역시 여러가지가 가능 하더군요. 이야. 이거 재미있습니다. 시간가는줄 모르겠어요. 


종전의 왼쪽 펀션과 오른쪽 펀션을 사용해서 

왼쪽 펀션 누르고 있을때  0번레이어 -> 1번 레이어

오른쪽 펀션 누르고 있을때 0번레이어 -> 2번레이어 


이렇게 사용하고 있었는데..

거기에


왼쪽 펀션 누른다음 오른쪽 펀션 누르고 있을때 -> 3번레이어

오른쪽 펀션 누른다음 왼쪽 펀션 누르고 있을때 -> 4번레이어 


이렇게 전환이 가능하게 하고 레이어 2개를 추가. 

무려 5개의 레이어를 전환하면서 사용하는 키보드를 만들었습니다.


레이어가 충분히 많아지니까...  한정된 키보드 공간에 어떻게든 쑤셔넣다보니... 어떻게 해야하나 고민하고 고민하면서 여러모로 현실과  타협 했던 이전 배열의 여러가지 문제점이 해결 될수 있겠다 싶은... 그런 기분이 듭니다.


일단 4번레이어에 탠키도 만들어보고. (직업 특성상 잘 쓸것 같지는 않습니다만...)

메크로 도 10가지정도 정의해보고. 


뭐 그러고 있네요.


혹시 AVR프로세서 사용하는 커스텀 키보드의 리매핑에 관심 있으신 분이 참고가 될까 싶어서...

제가 꾸며본 키맵의 소스코드 올려봅니다.


#include "extended_keymap_common.h"

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    [0] = {
        {KC_ESC,    KC_Q,   KC_W,   KC_E,   KC_R,   KC_T,   KC_Y,   KC_U,   KC_I,   KC_O,   KC_P,    KC_BSPC},
        {KC_TAB,    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_LSFT},
        {FUNC(3),   KC_LCTL,KC_LALT,KC_LGUI,FUNC(2),KC_SPC, KC_SPC, FUNC(1),KC_LEFT,KC_DOWN,KC_UP,   KC_RGHT}
    },//통상 모드
    [1] = {
        {KC_GRV,    KC_1,   KC_2,   KC_3,   KC_4,   KC_5,   KC_6,   KC_7,   KC_8,   KC_9,   KC_0,    S(KC_BSLS)},
        {KC_TAB,    KC_4,   KC_5,   KC_6,   KC_TRNS,KC_TRNS,KC_BSPC,KC_TRNS,KC_MINS,KC_EQL, KC_LBRC, KC_RBRC},
        {KC_LSFT,   KC_7,   KC_8,   KC_9,   KC_TRNS,KC_TRNS,KC_ENT, KC_TRNS,KC_COMM,KC_DOT, KC_SLSH, KC_LSFT},
        {BL_TOGG,   KC_0,   M(20),  KC_TRNS,FUNC(3),KC_ENT, KC_ENT, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS}
    },//숫자키 입력
    [2] = {
        {S(KC_GRV), S(KC_1),S(KC_2),S(KC_3),S(KC_4),S(KC_5),S(KC_6),S(KC_7),S(KC_8),    S(KC_9),    S(KC_0),    KC_BSLS},
        {KC_TAB,    S(KC_4),S(KC_5),S(KC_6),KC_TRNS,KC_TRNS,KC_BSPC,KC_TRNS,S(KC_MINS), S(KC_EQL),  S(KC_LBRC), S(KC_RBRC)},
        {KC_LSFT,   S(KC_7),S(KC_8),S(KC_9),KC_TRNS,KC_TRNS,KC_ENT, KC_TRNS,S(KC_COMM), S(KC_DOT),  S(KC_SLSH), KC_ENT},
        {BL_DEC,    BL_INC, KC_TRNS,KC_TRNS,KC_TRNS,KC_BSPC,KC_BSPC,FUNC(4), KC_MPLY,    KC_MNXT,    KC_VOLD,    KC_VOLU}
    },//특수문자 입력
    [3] = {
        {KC_PWR,  KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS},
        {KC_TRNS, KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_TRNS},
        {KC_TRNS, M(0), M(1), M(2), M(3), M(4), M(5), M(6), M(7), M(8), M(9), KC_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}
    },//F키입력 메크로 입력
    [4] = {
        {KC_PWR,  KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_7, KC_8, KC_9},
        {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_4, KC_5, KC_6},
        {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_1, KC_2, KC_3},
        {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_0, M(20),KC_DOT}
    }//만들어보긴 했는데 딱히 쓸대가 생각안나서 텐키 추가해봄.
    
};

//ACTION_LAYER_MOMENTARY  누르고 있는동안 레이어 변경. 때면 돌아옴.
//ACTION_DEFAULT_LAYER_SET 기본 레이어 변경. 토글방식. 

const uint16_t PROGMEM fn_actions[] = {
    [1] = ACTION_LAYER_MOMENTARY(1),  
    [2] = ACTION_LAYER_MOMENTARY(2), 
    [3] = ACTION_LAYER_MOMENTARY(3), 
    [4] = ACTION_LAYER_MOMENTARY(4) 
};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
  // MACRODOWN only works in this function
    switch(id) {
        case 0:
            return MACRODOWN(TYPE(KC_C),TYPE(KC_L),TYPE(KC_A),TYPE(KC_S),TYPE(KC_S),TYPE(KC_SPC), END); // class
        case 1:
            return MACRODOWN(TYPE(KC_S),TYPE(KC_T),TYPE(KC_R),TYPE(KC_U),TYPE(KC_C),TYPE(KC_T), TYPE(KC_SPC), END); //struct
        case 2:
            return MACRODOWN(TYPE(KC_S),TYPE(KC_W),TYPE(KC_I),TYPE(KC_T),TYPE(KC_C),TYPE(KC_H), TYPE(KC_SPC), END); //switch
        case 3:
            return MACRODOWN(TYPE(KC_C),TYPE(KC_A),TYPE(KC_S),TYPE(KC_E),TYPE(KC_SPC),END); //case
        case 4:
            return MACRODOWN(TYPE(KC_D),TYPE(KC_E),TYPE(KC_F),TYPE(KC_A),TYPE(KC_U),TYPE(KC_L),TYPE(KC_T),END);//default
        case 5:
            return MACRODOWN(TYPE(KC_R),TYPE(KC_E),TYPE(KC_T),TYPE(KC_U),TYPE(KC_R),TYPE(KC_N),END); //return
        case 6:
            return MACRODOWN(TYPE(KC_B),TYPE(KC_R),TYPE(KC_E),TYPE(KC_A),TYPE(KC_K),END); //break
        case 7:
            return MACRODOWN(TYPE(KC_P),TYPE(KC_R),TYPE(KC_I),TYPE(KC_V),TYPE(KC_A),TYPE(KC_T),TYPE(KC_E),END); //private             
        case 8:
            return MACRODOWN(TYPE(KC_L),TYPE(KC_E),TYPE(KC_T),TYPE(KC_SPC),END); //let 
        case 9:
            return MACRODOWN(TYPE(KC_V),TYPE(KC_A),TYPE(KC_R),TYPE(KC_SPC),END); //var
        case 20:
            return MACRODOWN(TYPE(KC_0),TYPE(KC_0),END);
    }
    return MACRO_NONE;
};

profile