Windowsでqmk_firmwareを使用したキーマップ設定環境構築。Ergo42のキーマップ設定。

#手順概要
１．MSYS2インストール
２．MSYS2にGitインストール
３．ビルド環境構築
４．ビルド&反映
５．キーマップ設定変更
６．キーマップ設定の例

#１．MSYS2インストール
[MSYS2 homepage](http://www.msys2.org/)
上記URLを開きMSYS2 のインストーラを取得。
実行してインストール。

(64bit版：msys2-x86_64-20180531.exe)

※注意：
　CygwinやGitbashなどがインストールされている場合、環境設定(.bashrc等)が競合するため別途確認が必要。
　自分はCygwinがインストール済みだったため、アンインストールしてから環境構築しました。

#２．MSYS2にGitインストール
インストール完了後、起動されるMSYS2のコンソールで以下のコマンドを実行。

```bash
$ pacman -S git
```

#３．ビルド環境構築
qmk_firmwareのgit cloneする。

```bash
$ git clone https://github.com/qmk/qmk_firmware.git
$ cd qmk_firmware
```

以下のコマンドを実行。

```bash
$ sh util/msys2_install.sh
```

インストール時の質問にはそれぞれ以下を応答。

```bash
選択して下さい (デフォルト=all):
　→デフォルトのままEnter
```

```bash
インストールを行いますか？ [Y/n]
　→Yを入力しEnter
```

```bash
Which USB drivers do you want to install?
(A)all - All supported drivers will be installed
(C)onnected - Only drivers for connected keyboards (in bootloader/flashing mode)
              will be installed
(F)force - Like all, but will also override existing drivers for connected
           keyboards
(N)one - No drivers will be installed,
         flashing your keyboard will most likely not work
(A/C/F/N)?
　→Aを入力しEnter
```

```bash
Do you want to install it? (Y/N)
　→Yを入力しEnter
```

```bash
Do you want to add 'source ~/qmk_utils/activate_msys2.sh' to the end of your
.bashrc file? Without this make won't find the needed utils, so if you don't
want to do it automatically, then you have to do it manually later.
(Y/N)?
　→Yを入力しEnter
```

```bash
質問のウィンドウが表示された場合は
　→「はい」を選択。
```

インストール完了後、以下が表示される。

```bash
******************************************************************************
Installation completed!
Please close this Window and restart MSYS2 MinGW
******************************************************************************
```

MSYS2のコンソールを閉じる。

#４．ビルド&反映
MSYS2MinGW 64-bitを起動してqmk_firmwareフォルダ内に移動。
Ergo42をPCに接続する。

以下のコマンドを実行してビルドを開始する。

```bash
$ make ergo42:default:avrdude    # make <対象キーボード名>:<キーマップのフォルダ名>:<ターゲット>
```

以下のメッセージが表示されたらリセットボタンを押す。

```bash
Detecting USB port, reset your controller now......
```

※設定が片手にのみ反映される場合は、
　それぞれ一度書き込みを行うと反映されるようになるようです。

#５．キーマップ設定変更
qmk_firmware/keyboards/ergo42/keymaps/defaultをコピーして変更用の設定を作成。
(ここではmyergo42としています。)

以下の設定を好きなエディタでキーマップを編集する。

```bash
qmk_firmware/keyboards/ergo42/keymaps/myergo42/keymap.c
```

マウス設定などは以下のファイルを編集する。(キー設定のみの場合は変更不要)

```bash
qmk_firmware/keyboards/ergo42/keymaps/myergo42/config.h
```

変更後、再度ビルドして変更を反映。

```bash
$ make ergo42:myergo42:avrdude
```

#６．キーマップ設定の例
自分はdefaultとhdbxをもとに以下のように設定しました。
まだまだ使い心地がいまいちなので、使っては修正の繰り返し中です。

```c:keymap.c
#include QMK_KEYBOARD_H

extern keymap_config_t keymap_config;

#define BASE 0
#define _LR1 1
#define _LR2 2

// Fillers to make layering more clear
#define _______ KC_TRNS
#define XXXXXXX KC_NO

#define JP_AT   KC_LBRC         // @ `
#define JP_HAT  KC_EQL          // ^ ~
#define JP_LBRC KC_RBRC         // [ {
#define JP_RBRC KC_NUHS         // ] }
#define JP_COLN KC_QUOT         // : *
#define JP_BSLS KC_INT1         // \ _
#define JP_YEN  KC_INT3         // yen |

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    [BASE] = LAYOUT(
        KC_ESC,  KC_Q,       KC_W,   KC_E,     KC_R,    KC_T,   KC_PSCR,           KC_RWIN, KC_Y,     KC_U,            KC_I,             KC_O,   KC_P,            KC_BSPC,
        KC_TAB,  KC_A,       KC_S,   KC_D,     KC_F,    KC_G,   LCTL(KC_TAB),      JP_LBRC, KC_H,     KC_J,            KC_K,             KC_L,   RSFT_T(KC_SCLN), JP_COLN,
        KC_LSFT, KC_Z,       KC_X,   KC_C,     KC_V,    KC_B,   KC_ZKHK,           JP_RBRC, KC_N,     KC_M,            KC_COMM,          KC_DOT, RCTL_T(KC_SLSH), KC_MINS,
        KC_LCTL, S(KC_CAPS), KC_INS, MO(_LR2), KC_MHEN, KC_SPC, LALT_T(KC_ENT),    KC_ENT,  MO(_LR1), RSFT_T(KC_DELT), LT(_LR2, JP_HAT), JP_AT,  JP_BSLS,         JP_YEN
    ),
    [_LR1] = LAYOUT(
        _______, KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    _______,    _______,   KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC,
        _______, _______, _______, _______, _______, _______, _______,    KC_PGUP,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT, KC_RSFT, KC_DELT,
        _______, _______, _______, _______, _______, _______, _______,    KC_PGDOWN, KC_HOME, KC_END,  _______, _______, KC_RCTL, KC_RALT,
        _______, _______, _______, _______, _______, _______, _______,    _______, _______, _______,   _______, _______, _______, _______
    ),
    [_LR2] = 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,
        _______, _______, _______, _______, _______, _______, _______,    XXXXXXX, KC_WH_U, KC_MS_L, KC_MS_U, KC_MS_R, KC_BTN2, KC_BTN3,
        _______, _______, _______, _______, _______, _______, _______,    XXXXXXX, KC_WH_D, KC_WH_L, KC_MS_D, KC_WH_R, KC_BTN1, XXXXXXX,
        _______, _______, _______, _______, _______, _______, _______,    _______, _______, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX
    )
};

```

config.hにはマウス設定(Mouse setting)を追加しました。その他はデフォルトです。

```c:config.h
/*
This is the c configuration file for the keymap

Copyright 2012 Jun Wako <wakojun@gmail.com>
Copyright 2015 Jack Humbert

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

/* Use I2C or Serial, not both */

#define USE_SERIAL
// #define USE_I2C

/* Select hand configuration */

#define MASTER_LEFT
// #define MASTER_RIGHT
// #define EE_HANDS

// Mouse setting
#define MOUSEKEY_DELAY             50
#define MOUSEKEY_INTERVAL          20
#define MOUSEKEY_MAX_SPEED         3
#define MOUSEKEY_TIME_TO_MAX       4
#define MOUSEKEY_WHEEL_MAX_SPEED   2
#define MOUSEKEY_WHEEL_TIME_TO_MAX 4
```

ちょこちょこ変更してて落ち着かないのでGitHubで管理中。
https://github.com/shiro01/myergo42

# 組み立てたErgo42
![IMG_20180920_234419.jpg](https://qiita-image-store.s3.amazonaws.com/0/200585/0e5d6a21-f4ac-ed06-c10c-20e0493c541b.jpeg)


#参考
[自作キーボード (Ergo42) を組み立てた](https://qiita.com/zk_phi/items/3180902a37fa73223020)
[カスタムキーマップで自作キーボードを自分の分身とする](http://ascii.jp/elem/000/001/645/1645504/)
[MSYS2 homepage](http://www.msys2.org/)
[Getting Started](https://docs.qmk.fm/#/newbs_getting_started)
[Quantum Mechanical Keyboard Firmware](https://github.com/qmk/qmk_firmware)
[Keymap Overview](https://docs.qmk.fm/#/keymap)
[Keycodes Overview](https://docs.qmk.fm/#/keycodes)
[What Are the Default Keycodes?](https://docs.qmk.fm/#/faq_keymap?id=what-are-the-default-keycodes)
[Mousekeys](https://docs.qmk.fm/#/feature_mouse_keys)
[qmk_firmware/quantum/keymap_extras/keymap_jp.h](https://github.com/qmk/qmk_firmware/blob/master/quantum/keymap_extras/keymap_jp.h)
[Flashing Instructions and Bootloader Information](https://docs.qmk.fm/#/flashing)