HOME
  Security
   Software
    Hardware
  
FPGA
  CPU
   Android
    Raspberry Pi
  
nLite
  Xcode
   etc.
    ALL
  
LINK
BACK
 

[NEW] 2022/10/20

QMKでホスト OSの種類を判別する方法、Windowsや macOS、Linuxを検出する方法 QMKでホスト OSの種類を判別する方法、Windowsや macOS、Linuxを検出する方法

(How to detect host OS in QMK firmware)

Tags: [電子工作], [QMK]




● QMK firmwareの関連記事


2021/08/23
QMK firmwareの開発環境を ラズパイや Windows WSLにセットアップする方法
QMK firmwareの開発環境を ラズパイや Windows WSLにセットアップする方法

  ラズパイや Windows WSL環境でカスタマイズ キーボードのファームウェア QMK firmwareの開発環境を構築

2022/01/09
BUFFALOの USB テンキーを Pro Microと QMKを使って VIAカスタマイズ キーボードに改造する方法
BUFFALOの USB テンキーを Pro Microと QMKを使って VIAカスタマイズ キーボードに改造する方法

  BUFFALO USB 10-Key keyboard BSTK100 modification by Pro Micro and QMK firmware VIA

2022/03/13
市販のキーボードを無改造で QMK化する QMK USB Converterを作ってみる
市販のキーボードを無改造で QMK化する QMK USB Converterを作ってみる

  QMK firmware QMK USB to USB keyboard protocol converter Pro Micro 3.3V + USB Host MAX3421E

● QMKでホスト OSの種類を判別する方法、Windowsや macOS、Linuxを検出する方法

 下記のプルリク(機能改善パッチ)が本家に取り込まれるのを待ちましょう。

Detect host OS based on USB fingerprint #18463

 Feature to detect host OS using wLength field from getDescriptor USB packets.

Way to detect host OS in QMK

keyboardio / FingerprintUSBHost


How to detect host OS in QMK firmware



● 2022/12更新 QMKでホスト OSの種類を判別する方法、developに取り込まれました!

 2022/12/09 #18463が developに取り込まれました!

QMK OS Detection

● QMKでホスト OSの種類を判別する方法の使い方

rules.mkに下記を追加
OS_DETECTION_ENABLE = yes

keymap.cに下記を追加
#include QMK_KEYBOARD_H

#ifdef OS_DETECTION_ENABLE
  #include "os_detection.h"
#endif

os_variant_t detected_host_os(void);
 で下記の値を返します。
enum {
    OS_UNSURE,  不明
    OS_LINUX,   Linux
    OS_WINDOWS, Windows
    OS_MACOS,   macOS
    OS_IOS,     iOS
} os_variant_t;

 実装例
bool oled_task_user(void) {

    ...

#ifdef OS_DETECTION_ENABLE
    switch (detected_host_os()) {
        case OS_UNSURE:
            oled_write_P(PSTR("OS_UNSURE"), false);
            break;
        case OS_LINUX:
            oled_write_P(PSTR("OS_LINUX"), false);
            break;
        case OS_WINDOWS:
            oled_write_P(PSTR("OS_WINDOWS"), false);
            break;
        case OS_MACOS:
            oled_write_P(PSTR("OS_MACOS"), false);
            break;
        case OS_IOS:
            oled_write_P(PSTR("OS_IOS"), false);
            break;
        default:
            oled_write_P(PSTR("Unknown"), false);
    }
#endif

    ...

    return false;
}

● QMKでホスト OSの種類を判別する方法の動作例

 正しく HOST OSを検出しました。
Windows 10に接続OS_WINDOWS
MacBook Proに接続OS_MACOS
ラズパイ(Debian)に接続OS_LINUX
※ MacBook Proが Sleepや起動途中の場合 OS_IOSや OS_LINUXで検出する状態が存在します

・QMKでホスト OSの種類を判別する方法の動作例 Windows 10に接続 OS_WINDOWS
QMKでホスト OSの種類を判別する方法の動作例 Windows 10に接続 OS_WINDOWS


・QMKでホスト OSの種類を判別する方法の動作例 MacBook Proに接続 OS_MACOS
QMKでホスト OSの種類を判別する方法の動作例 MacBook Proに接続 OS_MACOS


・QMKでホスト OSの種類を判別する方法の動作例 ラズパイ(Debian)に接続 OS_LINUX
QMKでホスト OSの種類を判別する方法の動作例 ラズパイ(Debian)に接続 OS_LINUX



●気になるプログラムサイズの増加

 上記の実装追加で
* The firmware size is fine - 25956/28672 (90%, 2716 bytes free)
 が
* The firmware size is fine - 26298/28672 (91%, 2374 bytes free)
 に成りました。

 26298 - 25956 = 342 bytes
 342 bytesの増加です。

OS_DETECTION_ENABLE = yes
 で
#ifdef OS_DETECTION_ENABLE
  #include "os_detection.h"
#endif
 だけの状態は、
 (つまり QMKファームウェア側の OS_DETECTION_ENABLEの実装のサイズ)
* The firmware size is fine - 26168/28672 (91%, 2504 bytes free)
 26168 - 25956 = 212 bytes
 212 bytesです。

● QMKのプログラムサイズを小さくする方法

 下記の実装に変更するとプログラムサイズを小さくできます。

* The firmware size is fine - 26266/28672 (91%, 2406 bytes free)
 26266 - 25956 = 310 bytes
 310 bytesの増加で、上記よりも 32バイト プログラムサイズを削減できました!

    // osの charポインタに文字列を代入してそれを表示する
    char* os;
    switch (detected_host_os()) {
        case OS_UNSURE:
            os = (char*)PSTR("OS_UNSURE");
            break;
        case OS_LINUX:
             os = (char*)PSTR("OS_LINUX");
            break;
        case OS_WINDOWS:
             os = (char*)PSTR("OS_WINDOWS");
            break;
        case OS_MACOS:
             os = (char*)PSTR("OS_MACOS");
            break;
        case OS_IOS:
             os = (char*)PSTR("OS_IOS");
            break;
        default:
            os = (char*)PSTR("Unknown");
            break;
    }
    oled_write_P(os, false);



● QMKで 2x2のロゴ(マーク)を表示する方法

 QMKのフォントファイル(glcdfont.c)には起動時の QMKロゴの他にキャラクタを 2x2の配置で使う 12x16 dotの OSのロゴが定義されています。

 但し、大人の事情?なのか Windowsと Appleのロゴマークは Windowsが Windowの窓、Appleが Bananaのバナナに変わっています。(商標トラブル避け?)

・QMKのフォント定義(昔)
QMKのフォント定義(昔)


・QMKのフォント定義(現在)
QMKのフォント定義(現在)



Online QMK Logo Editor
 で
https://raw.githubusercontent.com/qmk/qmk_firmware/develop/drivers/oled/glcdfont.c
 のファイルを開くと確認できます。

・QMK Font
QMK Font



 キャラクタ番号(文字コード)は「Large」で拡大すると簡単に確認できます。

・QMK Font OS Logo define
QMK Font OS Logo define



 各 OSのキャラクタ番号(文字コード)
AppleBanana0x95、0x96、0xB5、0xB6
WindowsWindow0x97、0x98、0xB7、0xB8
LinuxPenguin0x99、0x9A、0xB9、0xBA
AndroidRobot0x9B、0x9C、0xBB、0xBC

 プログラムにすると下記になり、OLEDの右上に表示します。
 ※ iOS iPhoneのロゴを Robotにしています。
bool oled_task_user(void) {

    ...

#ifdef OS_DETECTION_ENABLE
    char data;
    switch (detected_host_os()) {
        case OS_UNSURE:
            data = 0x01; // Face mark
            break;
        case OS_LINUX:
            data = 0x99; // Penguin
            break;
        case OS_WINDOWS:
            data = 0x97; // Window
            break;
        case OS_MACOS:
            data = 0x95; // Banana
            break;
        case OS_IOS:
            data = 0x9B; // But Robot Android !
            break;
        default:
            data = 0x4F; // ?
            break;
    }

    // 2x2 print (x, y)-(x+1, y+1)
    uint8_t x = 19;
    uint8_t y = 0;
    oled_set_cursor(x, y++);
    oled_write_char(data++, false);
    oled_write_char(data, false);
    data += 31;
    oled_set_cursor(x, y);
    oled_write_char(data++, false);
    oled_write_char(data, false);
#endif

    ...

    return false;
}

・QMKでホスト OSの種類を判別する方法の動作例で 2x2の OSロゴを表示 OS_WINDOWS 斜めの窓
QMKでホスト OSの種類を判別する方法の動作例で 2x2の OSロゴを表示 OS_WINDOWS 斜めの窓


・QMKでホスト OSの種類を判別する方法の動作例で 2x2の OSロゴを表示 OS_MACOS リンゴ
QMKでホスト OSの種類を判別する方法の動作例で 2x2の OSロゴを表示 OS_MACOS リンゴ


・QMKでホスト OSの種類を判別する方法の動作例で 2x2の OSロゴを表示 OS_LINUX ペンギン
QMKでホスト OSの種類を判別する方法の動作例で 2x2の OSロゴを表示 OS_LINUX ペンギン


・QMKでホスト OSの種類を判別する方法の動作例で 2x2の OSロゴを表示 OS_WINDOWS 窓
QMKでホスト OSの種類を判別する方法の動作例で 2x2の OSロゴを表示 OS_WINDOWS 窓


・QMKでホスト OSの種類を判別する方法の動作例で 2x2の OSロゴを表示 OS_MACOS バナナ
QMKでホスト OSの種類を判別する方法の動作例で 2x2の OSロゴを表示 OS_MACOS バナナ



● 2x2 ロゴ表示の場合のプログラムサイズの増加

* The firmware size is fine - 26250/28672 (91%, 2422 bytes free)
 26250 - 25956 = 294 bytes
 294 bytesの増加です。



Tags: [電子工作], [QMK]

●関連するコンテンツ(この記事を読んだ人は、次の記事も読んでいます)

【自由工作】市販のキーボードを無改造で VIA QMK化する Keyboard Quantizerを自作する【夏休み】
【自由工作】市販のキーボードを無改造で VIA QMK化する Keyboard Quantizerを自作する【夏休み】

  夏休みが明けたら 僕のキーボードが最強になって クラスのみんなから MMK 大作戦

BUFFALOの USB テンキーを Pro Microと QMKを使って VIAカスタマイズ キーボードに改造する方法
BUFFALOの USB テンキーを Pro Microと QMKを使って VIAカスタマイズ キーボードに改造する方法

  BUFFALO USB 10-Key keyboard BSTK100 modification by Pro Micro and QMK firmware VIA

QMK firmwareの開発環境を ラズパイや Windows WSLにセットアップする方法
QMK firmwareの開発環境を ラズパイや Windows WSLにセットアップする方法

  ラズパイや Windows WSL環境でカスタマイズ キーボードのファームウェア QMK firmwareの開発環境を構築

QMK firmwareでプログラムのサイズを小さくするテクニック、ケチケチ プログラミングの方法
QMK firmwareでプログラムのサイズを小さくするテクニック、ケチケチ プログラミングの方法

  QMK firmware How to Reduce Program Size、Reducing QMK firmware size

QMK firmwareで I/Oピンが足りない場合にデコーダ、デマルチプレクサを使用して IOを拡張する解決方法
QMK firmwareで I/Oピンが足りない場合にデコーダ、デマルチプレクサを使用して IOを拡張する解決方法

  QMK firmware expand I/O for many matrix keyboard、How to use IO Expander Multiplexer / Demultiplexer / Decoder

QMK firmwareで I/Oピンが足りない場合に I2Cの GPIOエキスパンダを使用して IOを拡張する解決方法
QMK firmwareで I/Oピンが足りない場合に I2Cの GPIOエキスパンダを使用して IOを拡張する解決方法

  QMK firmware expand I/O for many matrix keyboard、How to use I2C GPIO Expander PCF8574 and PCF8575

QMK firmwareで Audio機能を試してみる
QMK firmwareで Audio機能を試してみる

  QMK firmware test Audio function with Piezo buzzer

QMK firmwareで OLED機能で SSD1306を試してみる
QMK firmwareで OLED機能で SSD1306を試してみる

  QMK firmware test OLED Driver with SSD1306

QMK firmwareで Analog Stick機能で PSP2000用アナログ ジョイスティックを試してみる
QMK firmwareで Analog Stick機能で PSP2000用アナログ ジョイスティックを試してみる

  QMK firmware test Analog Joystick function with PSP2000 Analog Stick

最新の QMK firmwareで new_keyboard.shのコマンドが動かなくなったのを修正する方法
最新の QMK firmwareで new_keyboard.shのコマンドが動かなくなったのを修正する方法

  QMK Bugfix Create New Keyboard new_keyboard.sh command No such file or directory Error

QMK firmwareの Githubを forkした自分のリモートに pushすると怒られて pushできない場合の対応方法
QMK firmwareの Githubを forkした自分のリモートに pushすると怒られて pushできない場合の対応方法

  refusing to allow an OAuth App to create or update workflow `.github/workflows/api.yml` without `workflow` scope

中華製の格安なプログラマブル USBキーボードを買ってみた QMK VIAとは別物
中華製の格安なプログラマブル USBキーボードを買ってみた QMK VIAとは別物

  中華製のプログラマブル USBキーボード KeyboardSetter.exe

社畜のキーボード「新入社員の同期」を購入してみた!! VIA、QMK、Remapでのカスタマイズに対応
社畜のキーボード「新入社員の同期」を購入してみた!! VIA、QMK、Remapでのカスタマイズに対応

  キー内容が Remap等でカスタマイズ可能な社畜のキーボード「新入社員の同期」を 3500円で購入




[HOME] | [BACK]
リンクフリー(連絡不要、ただしトップページ以外は Web構成の変更で移動する場合があります)
Copyright (c) 2022 FREE WING,Y.Sakamoto
Powered by 猫屋敷工房 & HTML Generator

http://www.neko.ne.jp/~freewing/hardware/qmk_detect_host_os/