mirror of
https://github.com/google/mozc-devices.git
synced 2025-11-08 16:53:28 +03:00
Add mozc-bar for Gboard bar version.
Change-Id: Id1124e6cc8d1a5d806549c4dfa471b5324481c6b
This commit is contained in:
224
mozc-bar/firmware/mozc-bar-promicro/mozc-bar-promicro.ino
Normal file
224
mozc-bar/firmware/mozc-bar-promicro/mozc-bar-promicro.ino
Normal file
@@ -0,0 +1,224 @@
|
||||
#include "Keyboard.h"
|
||||
|
||||
const auto DATA = 4; // poci
|
||||
const auto CLK = 5; // clk
|
||||
const auto LOAD = 6; // pico
|
||||
|
||||
const auto MODULES = 17;
|
||||
const auto KEYBOARD_REPORT_ID = 2;
|
||||
|
||||
#define PCB_WITH_1_KEY(k7) 0, 0, 0, 0, k7, 0, 0, 0
|
||||
#define PCB_WITH_2_KEYS(k6, k7) 0, 0, 0, 0, k7, k6, 0, 0
|
||||
#define PCB_WITH_3_KEYS(k5, k6, k7) 0, 0, 0, 0, k7, k6, k5, 0
|
||||
#define PCB_WITH_4_KEYS(k4, k5, k6, k7) 0, 0, 0, 0, k7, k6, k5, k4
|
||||
#define PCB_WITH_5_KEYS(k3, k4, k5, k6, k7) k3, 0, 0, 0, k7, k6, k5, k4
|
||||
#define PCB_WITH_6_KEYS(k2, k3, k4, k5, k6, k7) k3, k2, 0, 0, k7, k6, k5, k4
|
||||
#define PCB_WITH_7_KEYS(k1, k2, k3, k4, k5, k6, k7) \
|
||||
k3, k2, k1, 0, k7, k6, k5, k4
|
||||
#define PCB_WITH_8_KEYS(k0, k1, k2, k3, k4, k5, k6, k7) \
|
||||
k3, k2, k1, k0, k7, k6, k5, k4
|
||||
|
||||
#define PCB_TYPE_A PCB_WITH_8_KEYS
|
||||
#define PCB_TYPE_B PCB_WITH_4_KEYS
|
||||
#define PCB_TYPE_C PCB_WITH_7_KEYS
|
||||
#define PCB_TYPE_D PCB_WITH_1_KEY
|
||||
#define PCB_TYPE_E PCB_WITH_7_KEYS
|
||||
#define PCB_TYPE_F PCB_WITH_4_KEYS
|
||||
#define PCB_TYPE_G PCB_WITH_6_KEYS
|
||||
|
||||
// 0 means no key.
|
||||
// PCB-order: right to left.
|
||||
// Key-order in PCB: right to left.
|
||||
const uint8_t keymap[MODULES * 8] PROGMEM = {
|
||||
PCB_TYPE_G( // Board 16
|
||||
0x58, // Enter
|
||||
0x57, // +
|
||||
0x63, // .
|
||||
0x62, // 0
|
||||
0x61, // 9
|
||||
0x60 // 8
|
||||
),
|
||||
PCB_TYPE_A( // Board 15
|
||||
0x5F, // 7
|
||||
0x5E, // 6
|
||||
0x5D, // 5
|
||||
0x5C, // 4
|
||||
0x5B, // 3
|
||||
0x5A, // 2
|
||||
0x59, // 1
|
||||
0x56 // -
|
||||
),
|
||||
PCB_TYPE_A( // Board 14
|
||||
0x55, // *
|
||||
0x54, // /
|
||||
0x53, // Num Lock
|
||||
0x4F, // →
|
||||
0x52, // ↑
|
||||
0x4F, // ↓
|
||||
0x4F, // ←
|
||||
0x4E // PgDn
|
||||
),
|
||||
PCB_TYPE_A( // Board 13
|
||||
0x4D, // End
|
||||
0x4C, // Delete
|
||||
0x4B, // PgUp
|
||||
0x4A, // Home
|
||||
0x49, // Insert
|
||||
0x48, // Pause
|
||||
0x47, // Scroll Lock
|
||||
0x46 // PrtSc
|
||||
),
|
||||
PCB_TYPE_F( // Board 12
|
||||
0x2A, // Backspace
|
||||
0x31, // '\'
|
||||
0x28, // Enter
|
||||
0xE5 // Right Shift
|
||||
),
|
||||
PCB_TYPE_E( // Board 11
|
||||
0xE4, // Right Ctrl
|
||||
0xE6, // Right Alt
|
||||
0x38, // ?
|
||||
0x37, // >
|
||||
0x36, // <
|
||||
0x10, // M
|
||||
0x11 // N
|
||||
),
|
||||
PCB_TYPE_B( // Board 10
|
||||
0x34, // "
|
||||
0x33, // ;
|
||||
0x0F, // L
|
||||
0x0E // K
|
||||
),
|
||||
PCB_TYPE_A( // Board 9
|
||||
0x0D, // J
|
||||
0x0B, // H
|
||||
0x30, // ]
|
||||
0x2F, // [
|
||||
0x13, // P
|
||||
0x12, // O
|
||||
0x0C, // I
|
||||
0x18 // U
|
||||
),
|
||||
PCB_TYPE_A( // Board 8
|
||||
0x1C, // Y
|
||||
0x2E, // =
|
||||
0x2D, // -
|
||||
0x27, // 0
|
||||
0x26, // 9
|
||||
0x25, // 8
|
||||
0x24, // 7
|
||||
0x23 // 6
|
||||
),
|
||||
PCB_TYPE_D( // Board 7
|
||||
0x2C // Space
|
||||
),
|
||||
PCB_TYPE_B( // Board 6
|
||||
0x05, // B
|
||||
0x19, // V
|
||||
0x06, // C
|
||||
0x1B // X
|
||||
),
|
||||
PCB_TYPE_A( // Board 5
|
||||
0x1D, // Z
|
||||
0x0A, // G
|
||||
0x09, // F
|
||||
0x07, // D
|
||||
0x16, // S
|
||||
0x04, // A
|
||||
0x17, // T
|
||||
0x15 // R
|
||||
),
|
||||
PCB_TYPE_A( // Board 4
|
||||
0x08, // E
|
||||
0x1A, // W
|
||||
0x14, // Q
|
||||
0x22, // 5
|
||||
0x21, // 4
|
||||
0x20, // 3
|
||||
0x1F, // 2
|
||||
0x1E // 1
|
||||
),
|
||||
PCB_TYPE_C( // Board 3
|
||||
0xE2, // Left Alt
|
||||
0xE0, // Left Ctrl
|
||||
0xE1, // Left shift
|
||||
0x39, // CapsLock
|
||||
0x2B, // Tab
|
||||
0x35, // ~
|
||||
0x45 // F12
|
||||
),
|
||||
PCB_TYPE_B( // Board 2
|
||||
0x44, // F11
|
||||
0x43, // F10
|
||||
0x42, // F9
|
||||
0x41 // F8
|
||||
),
|
||||
PCB_TYPE_A( // Board 1
|
||||
0x40, // F7
|
||||
0x3F, // F6
|
||||
0x3E, // F5
|
||||
0x3D, // F4
|
||||
0x3C, // F3
|
||||
0x3B, // F2
|
||||
0x3A, // F1
|
||||
0x29 // Esc
|
||||
),
|
||||
};
|
||||
|
||||
|
||||
void setup() {
|
||||
Keyboard.begin();
|
||||
pinMode(DATA, INPUT_PULLUP);
|
||||
pinMode(CLK, OUTPUT);
|
||||
digitalWrite(CLK, LOW);
|
||||
pinMode(LOAD, OUTPUT);
|
||||
digitalWrite(LOAD, HIGH);
|
||||
}
|
||||
|
||||
void read_keys(uint8_t* buf) {
|
||||
digitalWrite(LOAD, LOW);
|
||||
delay(10);
|
||||
digitalWrite(LOAD, HIGH);
|
||||
delay(10);
|
||||
|
||||
for (int i = 0; i < MODULES; i++) {
|
||||
uint8_t data = 0;
|
||||
for (int j = 0; j < 8; j++) {
|
||||
bool state = digitalRead(DATA) == LOW;
|
||||
data = data | (state ? 1 << j : 0);
|
||||
digitalWrite(CLK, HIGH);
|
||||
digitalWrite(CLK, LOW);
|
||||
}
|
||||
buf[i] = data;
|
||||
}
|
||||
}
|
||||
|
||||
void send_report(uint8_t* buf) {
|
||||
KeyReport key_report = {0};
|
||||
int pushed_keys = 0;
|
||||
for (int i = 0; i < MODULES * 8; i++) {
|
||||
int module_id = i / 8;
|
||||
int keymask = 1 << (i % 8);
|
||||
if ((buf[module_id] & keymask) != 0) {
|
||||
uint8_t keycode = pgm_read_byte(keymap + i);
|
||||
if (0xE0 <= keycode && keycode <= 0xE7) {
|
||||
key_report.modifiers |= (1 << (keycode - 0xE0));
|
||||
} else {
|
||||
key_report.keys[pushed_keys] = keycode;
|
||||
pushed_keys++;
|
||||
if (pushed_keys == 6) break;
|
||||
}
|
||||
}
|
||||
}
|
||||
HID().SendReport(KEYBOARD_REPORT_ID, &key_report, sizeof(KeyReport));
|
||||
}
|
||||
|
||||
uint8_t keybuf[2][MODULES];
|
||||
uint8_t current_buffer = 0;
|
||||
void loop() {
|
||||
read_keys(keybuf[current_buffer]);
|
||||
if (memcmp(keybuf[0], keybuf[1], MODULES) != 0) {
|
||||
send_report(keybuf[current_buffer]);
|
||||
current_buffer = 1 - current_buffer;
|
||||
}
|
||||
}
|
||||
245
mozc-bar/firmware/mozc-bar-stickc/mozc-bar-stickc.ino
Normal file
245
mozc-bar/firmware/mozc-bar-stickc/mozc-bar-stickc.ino
Normal file
@@ -0,0 +1,245 @@
|
||||
#include <BleKeyboard.h>
|
||||
|
||||
#ifdef ARDUINO_M5Stick_C
|
||||
#include <M5StickC.h>
|
||||
#elif ARDUINO_M5Stick_C_PLUS
|
||||
#include <M5StickCPlus.h>
|
||||
#endif
|
||||
|
||||
BleKeyboard bleKeyboard("Mozc bar-ver");
|
||||
|
||||
const auto MODULES = 17;
|
||||
|
||||
const int DATA = 36;
|
||||
const int CLK = 0;
|
||||
const int LOAD = 26;
|
||||
const int LED = 10;
|
||||
|
||||
#define PCB_WITH_1_KEY(k7) 0, 0, 0, 0, k7, 0, 0, 0
|
||||
#define PCB_WITH_2_KEYS(k6, k7) 0, 0, 0, 0, k7, k6, 0, 0
|
||||
#define PCB_WITH_3_KEYS(k5, k6, k7) 0, 0, 0, 0, k7, k6, k5, 0
|
||||
#define PCB_WITH_4_KEYS(k4, k5, k6, k7) 0, 0, 0, 0, k7, k6, k5, k4
|
||||
#define PCB_WITH_5_KEYS(k3, k4, k5, k6, k7) k3, 0, 0, 0, k7, k6, k5, k4
|
||||
#define PCB_WITH_6_KEYS(k2, k3, k4, k5, k6, k7) k3, k2, 0, 0, k7, k6, k5, k4
|
||||
#define PCB_WITH_7_KEYS(k1, k2, k3, k4, k5, k6, k7) \
|
||||
k3, k2, k1, 0, k7, k6, k5, k4
|
||||
#define PCB_WITH_8_KEYS(k0, k1, k2, k3, k4, k5, k6, k7) \
|
||||
k3, k2, k1, k0, k7, k6, k5, k4
|
||||
|
||||
#define PCB_TYPE_A PCB_WITH_8_KEYS
|
||||
#define PCB_TYPE_B PCB_WITH_4_KEYS
|
||||
#define PCB_TYPE_C PCB_WITH_7_KEYS
|
||||
#define PCB_TYPE_D PCB_WITH_1_KEY
|
||||
#define PCB_TYPE_E PCB_WITH_7_KEYS
|
||||
#define PCB_TYPE_F PCB_WITH_4_KEYS
|
||||
#define PCB_TYPE_G PCB_WITH_6_KEYS
|
||||
|
||||
// 0 means no key.
|
||||
// PCB-order: right to left.
|
||||
// Key-order in PCB: right to left.
|
||||
const uint8_t keymap[MODULES * 8] PROGMEM = {
|
||||
PCB_TYPE_G( // Board 16
|
||||
0x58, // Enter
|
||||
0x57, // +
|
||||
0x63, // .
|
||||
0x62, // 0
|
||||
0x61, // 9
|
||||
0x60 // 8
|
||||
),
|
||||
PCB_TYPE_A( // Board 15
|
||||
0x5F, // 7
|
||||
0x5E, // 6
|
||||
0x5D, // 5
|
||||
0x5C, // 4
|
||||
0x5B, // 3
|
||||
0x5A, // 2
|
||||
0x59, // 1
|
||||
0x56 // -
|
||||
),
|
||||
PCB_TYPE_A( // Board 14
|
||||
0x55, // *
|
||||
0x54, // /
|
||||
0x53, // Num Lock
|
||||
0x4F, // →
|
||||
0x52, // ↑
|
||||
0x4F, // ↓
|
||||
0x4F, // ←
|
||||
0x4E // PgDn
|
||||
),
|
||||
PCB_TYPE_A( // Board 13
|
||||
0x4D, // End
|
||||
0x4C, // Delete
|
||||
0x4B, // PgUp
|
||||
0x4A, // Home
|
||||
0x49, // Insert
|
||||
0x48, // Pause
|
||||
0x47, // Scroll Lock
|
||||
0x46 // PrtSc
|
||||
),
|
||||
PCB_TYPE_F( // Board 12
|
||||
0x2A, // Backspace
|
||||
0x31, // '\'
|
||||
0x28, // Enter
|
||||
0xE5 // Right Shift
|
||||
),
|
||||
PCB_TYPE_E( // Board 11
|
||||
0xE4, // Right Ctrl
|
||||
0xE6, // Right Alt
|
||||
0x38, // ?
|
||||
0x37, // >
|
||||
0x36, // <
|
||||
0x10, // M
|
||||
0x11 // N
|
||||
),
|
||||
PCB_TYPE_B( // Board 10
|
||||
0x34, // "
|
||||
0x33, // ;
|
||||
0x0F, // L
|
||||
0x0E // K
|
||||
),
|
||||
PCB_TYPE_A( // Board 9
|
||||
0x0D, // J
|
||||
0x0B, // H
|
||||
0x30, // ]
|
||||
0x2F, // [
|
||||
0x13, // P
|
||||
0x12, // O
|
||||
0x0C, // I
|
||||
0x18 // U
|
||||
),
|
||||
PCB_TYPE_A( // Board 8
|
||||
0x1C, // Y
|
||||
0x2E, // =
|
||||
0x2D, // -
|
||||
0x27, // 0
|
||||
0x26, // 9
|
||||
0x25, // 8
|
||||
0x24, // 7
|
||||
0x23 // 6
|
||||
),
|
||||
PCB_TYPE_D( // Board 7
|
||||
0x2C // Space
|
||||
),
|
||||
PCB_TYPE_B( // Board 6
|
||||
0x05, // B
|
||||
0x19, // V
|
||||
0x06, // C
|
||||
0x1B // X
|
||||
),
|
||||
PCB_TYPE_A( // Board 5
|
||||
0x1D, // Z
|
||||
0x0A, // G
|
||||
0x09, // F
|
||||
0x07, // D
|
||||
0x16, // S
|
||||
0x04, // A
|
||||
0x17, // T
|
||||
0x15 // R
|
||||
),
|
||||
PCB_TYPE_A( // Board 4
|
||||
0x08, // E
|
||||
0x1A, // W
|
||||
0x14, // Q
|
||||
0x22, // 5
|
||||
0x21, // 4
|
||||
0x20, // 3
|
||||
0x1F, // 2
|
||||
0x1E // 1
|
||||
),
|
||||
PCB_TYPE_C( // Board 3
|
||||
0xE2, // Left Alt
|
||||
0xE0, // Left Ctrl
|
||||
0xE1, // Left shift
|
||||
0x39, // CapsLock
|
||||
0x2B, // Tab
|
||||
0x35, // ~
|
||||
0x45 // F12
|
||||
),
|
||||
PCB_TYPE_B( // Board 2
|
||||
0x44, // F11
|
||||
0x43, // F10
|
||||
0x42, // F9
|
||||
0x41 // F8
|
||||
),
|
||||
PCB_TYPE_A( // Board 1
|
||||
0x40, // F7
|
||||
0x3F, // F6
|
||||
0x3E, // F5
|
||||
0x3D, // F4
|
||||
0x3C, // F3
|
||||
0x3B, // F2
|
||||
0x3A, // F1
|
||||
0x29 // Esc
|
||||
),
|
||||
};
|
||||
|
||||
void setup() {
|
||||
M5.begin();
|
||||
bleKeyboard.begin();
|
||||
|
||||
pinMode(DATA, INPUT_PULLUP);
|
||||
pinMode(CLK, OUTPUT);
|
||||
pinMode(LOAD, OUTPUT);
|
||||
pinMode(LED, OUTPUT);
|
||||
digitalWrite(CLK, LOW);
|
||||
digitalWrite(LOAD, HIGH);
|
||||
}
|
||||
|
||||
void read_keys(uint8_t* buf) {
|
||||
digitalWrite(LOAD, LOW);
|
||||
delay(10);
|
||||
digitalWrite(LOAD, HIGH);
|
||||
delay(10);
|
||||
|
||||
for (int i = 0; i < MODULES; i++) {
|
||||
uint8_t data = 0;
|
||||
for (int j = 0; j < 8; j++) {
|
||||
bool state = digitalRead(DATA) == LOW;
|
||||
data = data | (state ? 1 << j : 0);
|
||||
digitalWrite(CLK, HIGH);
|
||||
digitalWrite(CLK, LOW);
|
||||
}
|
||||
buf[i] = data;
|
||||
}
|
||||
}
|
||||
|
||||
void send_report(uint8_t* buf) {
|
||||
KeyReport key_report = {0};
|
||||
int pushed_keys = 0;
|
||||
for (int i = 0; i < MODULES * 8; i++) {
|
||||
int module_id = i / 8;
|
||||
int keymask = 1 << (i % 8);
|
||||
if ((buf[module_id] & keymask) != 0) {
|
||||
uint8_t keycode = pgm_read_byte(keymap + i);
|
||||
if (0xE0 <= keycode && keycode <= 0xE7) {
|
||||
key_report.modifiers |= (1 << (keycode - 0xE0));
|
||||
} else {
|
||||
key_report.keys[pushed_keys] = keycode;
|
||||
pushed_keys++;
|
||||
if (pushed_keys == 6) break;
|
||||
}
|
||||
}
|
||||
}
|
||||
bleKeyboard.sendReport(&key_report);
|
||||
}
|
||||
|
||||
uint8_t keybuf[2][MODULES];
|
||||
uint8_t current_buffer = 0;
|
||||
|
||||
void loop() {
|
||||
if(bleKeyboard.isConnected()) {
|
||||
digitalWrite(LED, LOW);
|
||||
} else {
|
||||
if ((millis()/1000)%2 == 0) {
|
||||
digitalWrite(LED, HIGH);
|
||||
} else {
|
||||
digitalWrite(LED, LOW);
|
||||
}
|
||||
}
|
||||
|
||||
read_keys(keybuf[current_buffer]);
|
||||
if (memcmp(keybuf[0], keybuf[1], MODULES) != 0) {
|
||||
send_report(keybuf[current_buffer]);
|
||||
current_buffer = 1 - current_buffer;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user