Skip to content

ogatatsu/Helix-Wireless

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

23 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Helix-Wireless

HelixBL652-breakout を載せてワイヤレスに改造した物。

仕組み

以下の図のようにマスター、スレーブ、PC間で通信する。 1

スイッチ1つ1つに一意なIDが振られていて、スレーブマスター間では押されたスイッチのIDを通信でやり取りする、 マスター側では受け取ったスレーブ側で押されたIDと自分側で押されたIDをキーマップからキーコードに変換してPCに送る。 キーマップはマスター側で持っているのでキー配列を変更する時はマスター側のプログラムを変更が必要となる。

3

ビルド方法

キーカスタマイズ

キーのカスタマイズはマスター側のソースのkeymap.cppファイルを書き換えることでできる。

通常の入力時のカスタマイズはkeymap[]配列を変更する。

static Key keymap[] = {
    {1, L(NK(_GRAVE), CK(_SHIFT, _GRAVE), NK(_GRAVE))},
    {2, L(NK(_1), CK(_SHIFT, _1), NK(_1))},
    {3, L(NK(_2), CK(_SHIFT, _2), NK(_2))},
    {4, L(NK(_3), CK(_SHIFT, _3), NK(_3))},
    {5, L(NK(_4), CK(_SHIFT, _4), NK(_4))},
    ...

左側の数字は仕組みで説明した一意なID、右側の関数呼び出しはファームウェア内でコマンドと呼ばれる物でこれの組み合わせを変更することでIDを割り当てられたスイッチを押したときの挙動を変更できる。

どのスイッチが何番のIDに割り当てられているかは以下となる。

/* ID
   * ,-----------------------------------------.             ,-----------------------------------------.
   * |   1  |   2  |   3  |   4  |   5  |   6  |             |   7  |   8  |   9  |  10  |  11  |  12  |
   * |------+------+------+------+------+------|             |------+------+------+------+------+------|
   * |  13  |  14  |  15  |  16  |  17  |  18  |             |  19  |  20  |  21  |  22  |  23  |  24  |
   * |------+------+------+------+------+------|             |------+------+------+------+------+------|
   * |  25  |  26  |  27  |  28  |  29  |  30  |             |  31  |  32  |  33  |  34  |  35  |  36  |
   * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
   * |  37  |  38  |  39  |  40  |  41  |  42  |  43  |  44  |  45  |  46  |  47  |  48  |  49  |  50  |
   * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
   * |  51  |  52  |  53  |  54  |  55  |  56  |  57  |  58  |  59  |  60  |  61  |  62  |  63  |  64  |
   * `-------------------------------------------------------------------------------------------------'
   */

コマンド一覧

NOPコマンド

Command *NOP

何もしないコマンド、以下の例ではSW1を押しても何も起こらない。

static Key keymap[] = {
    {1, NOP},
};

NKコマンド

Command *NK(uint8_t keycode)

通常キー用のコマンド、以下の例ではSW1A,SW2B,SW3Cのキーコードを送出する。 (keycode.hファイルにキーコードに対して_Aなどの名前が割り当てられているのでそちらも参照のこと。)

static Key keymap[] = {
    {1, NK(_A)},
    {2, NK(_B)},
    {3, NK(_C)},
};

MOコマンド

Command *MO(Modifier modifier)

修飾キー用のコマンド、以下の例ではSW1SHIFTのキーコードを、SW2CTRLSHIFTのキーコードを同時に送出する。 修飾キーは|演算子で同時押しの組み合わせを表現できる。

static Key keymap[] = {
    {1, MO(_SHIFT)},
    {2, MO(_CTRL | _SHIFT)},
};

CKコマンド

Command *CK(Modifier modifier, uint8_t keycode)

コンビネーションキー用のコマンド、修飾キーと通常キーの同時押しを表現できる。以下の例はSW1CTRL+CSW2CTRL+ALT+DELETEのキーコードを送出する。

static Key keymap[] = {
    {1, CK(_CTRL, _C)},
    {2, CK(_CTRL | _ALT, _DELETE)},
};

MTコマンド

Command *MT(Modifier modifier, uint8_t keycode)

スイッチを押した後リリースせずにに別のスイッチを押したときは第1引数の修飾キー、スイッチ単体でタップすると第2引数の通常キーとして機能するコマンド、以下の例でSW1を押した後離さずにSW2を押すとSHIFTキー(結果としてSHIFT+A)、SW1を押して何もせずにそのまま離すとSPACEキーのキーコードが送出される。

static Key keymap[] = {
    {1, MT(_SHIFT, _SPACE)},
    {2, NK(_A)},
};

OSMコマンド

Command *OSM(Modifier modifier)

スイッチを押して離すと次にスイッチを押した時に送出されるキーコードと同時に引数の修飾キーも送出される、スイッチを押して離さずに別のスイッチを押した場合は通常の修飾キーコマンドの様に動作する。下の例ではSW1を押して離した後にSW2を押すとSHIFT+Aのキーコードが送出される。

static Key keymap[] = {
    {1, OSM(_SHIFT)},
    {2, NK(_A)},
};

Lコマンド

Command *L(Command *first, Commands... rest)

レイヤー分けをするコマンド、現在のレイヤーの状態によって動作させるコマンドを変更する。以下の例ではSW1を押すとレイヤー2がONの時はC、2がOFFで1がONの時はB、2と1がOFFの時はAのキーコードを送出する、0レイヤーはデフォルトでONとなる。

static Key keymap[] = {
    //    0     , 1     , 2
    {1, L(NK(_A), NK(_B), NK(_C))},
};

SLコマンド

Command *SL(uint8_t layerNumber)

スイッチを押してる間だけ引数の番号のレイヤーをONにする。以下の例ではSW1単体で押すとASW2を押しながらSW1を押すとBSW3を押しながらSW1を押すとCのキーコードを送出する。レイヤー番号の数字が高いほうのコマンドが優先されるのでSW2SW3を同時に押しながらSW1を押すとSW3のレイヤー番号の2が優先されCのキーコードが送出される。

static Key keymap[] = {
    {1, L(NK(_A), NK(_B), NK(_C))},
    {2, SL(1)},
    {3, SL(2)},
};

TLコマンド

Command *TL(uint8_t layerNumber)

スイッチを押したら引数の番号のレイヤーをトグルする、SLコマンドと違いスイッチを離したあとでもレイヤーをONにし続ける事ができる。以下の例だと1回SW2を押すとレイヤー1がONになりその状態でSW1を押すとBのキーコードを送出する。もう1回SW2を押すとレイヤー1がONからOFFに変わりその状態でSW1を押すとAのキーコードを送出する。

static Key keymap[] = {
    {1, L(NK(_A), NK(_B))},
    {2, TL(1)},
};

LTコマンド

Command *LT(uint8_t layerNumber, uint8_t keycode)

MTコマンドのレイヤー版。

OSLコマンド

Command *OSL(uint8_t layerNumber)

OSMコマンドのレイヤー版。

続く

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages