QMK firmwareでタップ数をカウントアップして表示する

OLEDで何かできないか

まずはファームの勉強を兼ねてOLEDで何かできないか考えたところ
タップ数をカウントアップして表示するのが難易度低そうで良さそうかな
と思い実行してみました(c経験ほぼ0)

グローバル変数にタップ数保持して、ぷりんとえふ?とかいうの使えばいいんでしょ!
それくらい解っちゃうんだから!

printfが使えない!

だめでした
printfを使うためにstdio.hをincludeしたらhexファイルのサイズが大きくなりすぎてエラーになってしまいました…

できました

ちょっと考えてprintfやitoa無しでできました
パズルみたいでたのしいですね
itoaの実装方法はググればいくらでも出てきますが、
表示するだけなら最初から文字列で持つ方が単純でよさそうでした
(WPMを自力で算出するとかなら話は別ですが…)

まず、keymap.cの適当なところに以下を追加します

char tap_count[] = "00000";
void countup_taps(void) {
    for (int i = 4; i >= 0; i --) {
        if (tap_count[i] >= '9') {
            tap_count[i] = '0';
        } else {
            tap_count[i] = tap_count[i] + 1;
            break;
        }
    }
}

あとはキーが押されたときにカウントアップするようにして
OLEDの表示にtap_countを追加してあげれば完成です

bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    if (record->event.pressed) {
        countup_taps();
    }
}

static void print_status_narrow(void) {
     ︙
    省略
     ︙
    // Print tap count
    oled_write_ln_P(PSTR(""), false);
    oled_write(tap_count, false);
}


わーい⊏'ꣲ'|

countup_taps.ccountup_taps.hつくってファイル分割したほうがいいのかな?
C言語ワカラナイ

,

Related posts

このブログの今後について

⊏'ꣲ'|
キーボードについてあらかた書いてしまったので、
今後はキーボードとは関係ない記事が増えていくと思います
ホールドでレイヤー1、タップしてから再度ホールドでレイヤー2とか、
普段はホールドでレイヤ切り替えだけど、そのままタブ押したときだけAltになるとか
ちまちま変なことやっているけれど、汎用的ではないしGitHubにあるソースを見てください

SWAP HANDSのススメ

スワップハンドすごい
スワップハンドすごい
分割キーボードなのに片手で全キー入力できる
マイクラでマウス構えながら/spawnできるし
頬杖付きながら簡単な文字入力なら行える
みんなスワップハンド導入すべき
自分はお行儀よくキーボードの正面に座って両手で操作している割合は多くないです
ゲームしながら絵を描きながらお菓子を食べながら…そんなときは大抵片手操作です
分割じゃないキーボードを使っていたときは、よく片手でプログラミングしてました
(もちろん両手を使ったほうが速い)
分割では距離がね…うn…
そんなわけで片手で入力できないのは自分的にはありえないので早速Re42にスワップハンドを導入しました
普通のキーボードの片手タイピングに比べ、速度はかなり落ちますがホームポジションから動かないで済むようになったのは悪くなかったです
配置検討
画像
色々試した結果、上図のようになりました
スワップハンド中は最上段が
左:DEL Y U I O P 右: Q W E R T ESC
になります
スワップハンド中のタブとクォートについては別レイヤーにトグルSH_TGを配置して誤魔化します(この記事では割愛)
実装
公式に書いてある通り
rules.mkにSWAP_HANDS_ENABLEを定義し、
keymap.cにマッピングを定義します
マッピングの配列にセットする順序についてはキーボード名のヘッダファイルRe42.hに定義されているLAYOUTマクロを確認します
Re42は前半が左手、後半が右手となっているようなので、スワップハンドではコレを逆にします

rules.mk
SWAP_HANDS_ENABLE =...

モドタップの挙動を修正する

デフォルトのモドタップの問題
デフォルトのモドタップには以下の問題があります

レイヤーの切り替え(LT(kc))にIGNORE_MOD_TAP_INTERRUPTが効かない
素早く入力したときに想定通り入力できないというあれです
別レイヤーにMT(kc)を配置した場合、レイヤーを切り替えるとホールドも解除されてしまう
例えばデフォルトレイヤーのみにA~Z、LOWERレイヤーにGUI_T(kc)を配置してWin+Rをタップしようとして
LOWERホールド→GUI_T(kc)ホールド→LOWER解除→R
と入力した場合、Winは就職されずに単にRになってしまいます
タップダンスで細かく色々できそうだけどなんか書きにくそう(個人の感想)

先人
こちらの方も同じ問題にぶちあたって解決したようです
http://akakyouryuu.com/blog/qmk-firmware%E3%81%AEtap-hold%E3%81%AE%E5%8B%95%E4%BD%9C%E3%82%92%E6%94%B9%E5%96%84%E3%81%99%E3%82%8B/
それはそれとして
上記記事を見つける前に自前で実装してしまったので、メモっておきます
ソースコード
config.h
#define TAPPING_TERM 200
keymap.c(もしくはヘッダファイルも作って別ファイルへ)
#include QMK_KEYBOARD_H
#include "fix_tap_hold.h"

tap_state_t tap_state;

static struct {
uint16_t keycode;
...

SHIFT+JP_XXXをUS配列に対応させる

JP_XXXとShfitキーとの組み合わせがおかしい
keymap.cでkeymap_jp.hをincludeしてKC_XXXの代わりにJP_XXXを使えば、
日本語キーボードと認識された状態でも目的の記号を入力するようにできるみたいです
ですが、例えばSHIFT+JP_2を押しても@じゃなくて"になってしまう
SHIFT+JP_QUOTにいたっては"じゃなくて'のままです
どうしたものか
(さらに…)

Re42で遊ぶ

Re42 !
九嶋さん(@kushima8)にRe42(とRe40)のテスト版を提供いただいたので、ファームをあれこれいじって遊んでいます
ありがてぇありがてぇ
遊んでいるうちにQMK Firmwareについて色々知見が溜まってきたので、
時間ができたときにこのブログに書いていこうかなと思います
(さらに…)

Latest posts

このブログの今後について

⊏'ꣲ'|
キーボードについてあらかた書いてしまったので、
今後はキーボードとは関係ない記事が増えていくと思います
ホールドでレイヤー1、タップしてから再度ホールドでレイヤー2とか、
普段はホールドでレイヤ切り替えだけど、そのままタブ押したときだけAltになるとか
ちまちま変なことやっているけれど、汎用的ではないしGitHubにあるソースを見てください

SWAP HANDSのススメ

スワップハンドすごい
スワップハンドすごい
分割キーボードなのに片手で全キー入力できる
マイクラでマウス構えながら/spawnできるし
頬杖付きながら簡単な文字入力なら行える
みんなスワップハンド導入すべき
自分はお行儀よくキーボードの正面に座って両手で操作している割合は多くないです
ゲームしながら絵を描きながらお菓子を食べながら…そんなときは大抵片手操作です
分割じゃないキーボードを使っていたときは、よく片手でプログラミングしてました
(もちろん両手を使ったほうが速い)
分割では距離がね…うn…
そんなわけで片手で入力できないのは自分的にはありえないので早速Re42にスワップハンドを導入しました
普通のキーボードの片手タイピングに比べ、速度はかなり落ちますがホームポジションから動かないで済むようになったのは悪くなかったです
配置検討
画像
色々試した結果、上図のようになりました
スワップハンド中は最上段が
左:DEL Y U I O P 右: Q W E R T ESC
になります
スワップハンド中のタブとクォートについては別レイヤーにトグルSH_TGを配置して誤魔化します(この記事では割愛)
実装
公式に書いてある通り
rules.mkにSWAP_HANDS_ENABLEを定義し、
keymap.cにマッピングを定義します
マッピングの配列にセットする順序についてはキーボード名のヘッダファイルRe42.hに定義されているLAYOUTマクロを確認します
Re42は前半が左手、後半が右手となっているようなので、スワップハンドではコレを逆にします

rules.mk
SWAP_HANDS_ENABLE =...

モドタップの挙動を修正する

デフォルトのモドタップの問題
デフォルトのモドタップには以下の問題があります

レイヤーの切り替え(LT(kc))にIGNORE_MOD_TAP_INTERRUPTが効かない
素早く入力したときに想定通り入力できないというあれです
別レイヤーにMT(kc)を配置した場合、レイヤーを切り替えるとホールドも解除されてしまう
例えばデフォルトレイヤーのみにA~Z、LOWERレイヤーにGUI_T(kc)を配置してWin+Rをタップしようとして
LOWERホールド→GUI_T(kc)ホールド→LOWER解除→R
と入力した場合、Winは就職されずに単にRになってしまいます
タップダンスで細かく色々できそうだけどなんか書きにくそう(個人の感想)

先人
こちらの方も同じ問題にぶちあたって解決したようです
http://akakyouryuu.com/blog/qmk-firmware%E3%81%AEtap-hold%E3%81%AE%E5%8B%95%E4%BD%9C%E3%82%92%E6%94%B9%E5%96%84%E3%81%99%E3%82%8B/
それはそれとして
上記記事を見つける前に自前で実装してしまったので、メモっておきます
ソースコード
config.h
#define TAPPING_TERM 200
keymap.c(もしくはヘッダファイルも作って別ファイルへ)
#include QMK_KEYBOARD_H
#include "fix_tap_hold.h"

tap_state_t tap_state;

static struct {
uint16_t keycode;
...

SHIFT+JP_XXXをUS配列に対応させる

JP_XXXとShfitキーとの組み合わせがおかしい
keymap.cでkeymap_jp.hをincludeしてKC_XXXの代わりにJP_XXXを使えば、
日本語キーボードと認識された状態でも目的の記号を入力するようにできるみたいです
ですが、例えばSHIFT+JP_2を押しても@じゃなくて"になってしまう
SHIFT+JP_QUOTにいたっては"じゃなくて'のままです
どうしたものか
(さらに…)

Leave a Comment

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です