手段
既にssd1306.c
によって、1行21文字×4行の文字が書き込めるようになっているので、それを使う。
keymap.c
のvoid matrix_render_user()
の中で、matrix_write
を使って書き込んでいけばよい。
また、一行ごとに書きこみ、matrix->cursor
をいい感じに動かしてくれるmatrix_write_ln
もある。
keymap.c
void write_hello(struct CharacterMatrix *matrix) {
matrix->cursor = &matrix->display[0][0];
matrix_write(matrix, "Hello World!");
}
void matrix_render_user(struct CharacterMatrix *matrix) {
write_hello(matrix);
}
ssd1306.c
のバグで、84文字フルで書き込むと(85文字目を書き込む前に)スクロールしてしまうので、以下のように修正すると4行フルで使える
ssd1306.c
void matrix_write_char_inner(struct CharacterMatrix *matrix, uint8_t c) {
if (matrix->cursor - &matrix->display[0][0] == sizeof(matrix->display)) {
// We went off the end; scroll the display upwards by one line
memmove(&matrix->display[0], &matrix->display[1],
MatrixCols * (MatrixRows - 1));
matrix->cursor = &matrix->display[MatrixRows - 1][0];
memset(matrix->cursor, ' ', MatrixCols);
}
*matrix->cursor = c;
++matrix->cursor;
}
lib
下のkeylogger.c
、layer_state_reader.c
が参考になる。
それ以外の例
Default Layer情報を取得する
persistent_default_layer_set()
を使って、デフォルトレイヤーを書き換えてる場合
keymap.c
void write_os(struct CharacterMatrix *matrix) {
matrix->cursor = &matrix->display[0][0];
switch (eeconfig_read_default_layer()) {
case 1 << _WIN:
matrix_write(matrix, "WIN");
break;
case 1 << _MAC:
matrix_write(matrix, "MAC");
break;
}
}
glcdfont.c
にWindowsとMacとLinuxとAndroidのアイコンは用意されている。
WindowsとMacのアイコンを書く例
keymap.c
char windows_logo[2][3] = {{0x97, 0x98, 0}, {0xb7, 0xb8, 0}};
char mac_logo[2][3] = {{0x95, 0x96, 0}, {0xb5, 0xb6, 0}};
void write_os(struct CharacterMatrix *matrix) {
matrix->cursor = &matrix->display[0][0];
switch (eeconfig_read_default_layer()) {
case 1 << _QWERTY:
matrix_write(matrix, windows_logo[0]);
matrix->cursor = &matrix->display[1][0];
matrix_write(matrix, windows_logo[1]);
break;
case 1 << _MAC:
matrix_write(matrix, mac_logo[0]);
matrix->cursor = &matrix->display[1][0];
matrix_write(matrix, mac_logo[1]);
break;
}
}
画像を書き込む
fontファイルglcdfont.c
のビットマップをすり替えてしまえばよい。
デフォルトでは、Corneのロゴがセットされている。
また、上記のようにssd1306.c
を直しておくと、一行分表示できるサイズが増える