From c8222043fc6d803cc1029205af1b78c7da1f782c Mon Sep 17 00:00:00 2001 From: Balz Guenat Date: Sat, 12 Aug 2017 19:07:35 +0200 Subject: wow, it builds! added empty matrix.c and moved custom matrix code to custom_matrix.cpp still untested because of hardware availability :( --- keyboards/converter/usb_usb/custom_matrix.cpp | 238 ++++++++++++++++++++++++++ keyboards/converter/usb_usb/matrix.c | 1 + keyboards/converter/usb_usb/matrix.cpp | 238 -------------------------- keyboards/converter/usb_usb/rules.mk | 2 +- 4 files changed, 240 insertions(+), 239 deletions(-) create mode 100644 keyboards/converter/usb_usb/custom_matrix.cpp create mode 100644 keyboards/converter/usb_usb/matrix.c delete mode 100644 keyboards/converter/usb_usb/matrix.cpp (limited to 'keyboards') diff --git a/keyboards/converter/usb_usb/custom_matrix.cpp b/keyboards/converter/usb_usb/custom_matrix.cpp new file mode 100644 index 0000000000..93d13edf0b --- /dev/null +++ b/keyboards/converter/usb_usb/custom_matrix.cpp @@ -0,0 +1,238 @@ +/* +Copyright 2016 Jun Wako + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +#include +#include + +// USB HID host +#include "Usb.h" +#include "usbhub.h" +#include "hid.h" +#include "hidboot.h" +#include "parser.h" + +#include "keycode.h" +#include "util.h" +#include "print.h" +#include "debug.h" +#include "timer.h" +#include "matrix.h" +#include "led.h" +#include "host.h" +#include "keyboard.h" + + +/* KEY CODE to Matrix + * + * HID keycode(1 byte): + * Higher 5 bits indicates ROW and lower 3 bits COL. + * + * 7 6 5 4 3 2 1 0 + * +---------------+ + * | ROW | COL | + * +---------------+ + * + * Matrix space(16 * 16): + * r\c0123456789ABCDEF + * 0 +----------------+ + * : | | + * : | | + * 16 +----------------+ + */ +#define ROW_MASK 0xF0 +#define COL_MASK 0x0F +#define CODE(row, col) (((row) << 4) | (col)) +#define ROW(code) (((code) & ROW_MASK) >> 4) +#define COL(code) ((code) & COL_MASK) +#define ROW_BITS(code) (1 << COL(code)) + + +// Integrated key state of all keyboards +static report_keyboard_t keyboard_report; + +static bool matrix_is_mod = false; + +/* + * USB Host Shield HID keyboards + * This supports two cascaded hubs and four keyboards + */ +USB usb_host; +USBHub hub1(&usb_host); +USBHub hub2(&usb_host); +HIDBoot kbd1(&usb_host); +HIDBoot kbd2(&usb_host); +HIDBoot kbd3(&usb_host); +HIDBoot kbd4(&usb_host); +KBDReportParser kbd_parser1; +KBDReportParser kbd_parser2; +KBDReportParser kbd_parser3; +KBDReportParser kbd_parser4; + + +extern "C" +{ + uint8_t matrix_rows(void) { return MATRIX_ROWS; } + uint8_t matrix_cols(void) { return MATRIX_COLS; } + bool matrix_has_ghost(void) { return false; } + void matrix_init(void) { + // USB Host Shield setup + usb_host.Init(); + kbd1.SetReportParser(0, (HIDReportParser*)&kbd_parser1); + kbd2.SetReportParser(0, (HIDReportParser*)&kbd_parser2); + kbd3.SetReportParser(0, (HIDReportParser*)&kbd_parser3); + kbd4.SetReportParser(0, (HIDReportParser*)&kbd_parser4); + } + + static void or_report(report_keyboard_t report) { + // integrate reports into keyboard_report + keyboard_report.mods |= report.mods; + for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) { + if (IS_ANY(report.keys[i])) { + for (uint8_t j = 0; j < KEYBOARD_REPORT_KEYS; j++) { + if (! keyboard_report.keys[j]) { + keyboard_report.keys[j] = report.keys[i]; + break; + } + } + } + } + } + + uint8_t matrix_scan(void) { + static uint16_t last_time_stamp1 = 0; + static uint16_t last_time_stamp2 = 0; + static uint16_t last_time_stamp3 = 0; + static uint16_t last_time_stamp4 = 0; + + // check report came from keyboards + if (kbd_parser1.time_stamp != last_time_stamp1 || + kbd_parser2.time_stamp != last_time_stamp2 || + kbd_parser3.time_stamp != last_time_stamp3 || + kbd_parser4.time_stamp != last_time_stamp4) { + + last_time_stamp1 = kbd_parser1.time_stamp; + last_time_stamp2 = kbd_parser2.time_stamp; + last_time_stamp3 = kbd_parser3.time_stamp; + last_time_stamp4 = kbd_parser4.time_stamp; + + // clear and integrate all reports + keyboard_report = {}; + or_report(kbd_parser1.report); + or_report(kbd_parser2.report); + or_report(kbd_parser3.report); + or_report(kbd_parser4.report); + + matrix_is_mod = true; + + dprintf("state: %02X %02X", keyboard_report.mods, keyboard_report.reserved); + for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) { + dprintf(" %02X", keyboard_report.keys[i]); + } + dprint("\r\n"); + } else { + matrix_is_mod = false; + } + + uint16_t timer; + timer = timer_read(); + usb_host.Task(); + timer = timer_elapsed(timer); + if (timer > 100) { + dprintf("host.Task: %d\n", timer); + } + + static uint8_t usb_state = 0; + if (usb_state != usb_host.getUsbTaskState()) { + usb_state = usb_host.getUsbTaskState(); + dprintf("usb_state: %02X\n", usb_state); + + // restore LED state when keyboard comes up + if (usb_state == USB_STATE_RUNNING) { + dprintf("speed: %s\n", usb_host.getVbusState()==FSHOST ? "full" : "low"); + keyboard_set_leds(host_keyboard_leds()); + } + } + return 1; + } + + bool matrix_is_modified(void) { + return matrix_is_mod; + } + + bool matrix_is_on(uint8_t row, uint8_t col) { + uint8_t code = CODE(row, col); + + if (IS_MOD(code)) { + if (keyboard_report.mods & ROW_BITS(code)) { + return true; + } + } + for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) { + if (keyboard_report.keys[i] == code) { + return true; + } + } + return false; + } + + matrix_row_t matrix_get_row(uint8_t row) { + uint16_t row_bits = 0; + + if (IS_MOD(CODE(row, 0)) && keyboard_report.mods) { + row_bits |= keyboard_report.mods; + } + + for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) { + if (IS_ANY(keyboard_report.keys[i])) { + if (row == ROW(keyboard_report.keys[i])) { + row_bits |= ROW_BITS(keyboard_report.keys[i]); + } + } + } + return row_bits; + } + + uint8_t matrix_key_count(void) { + uint8_t count = 0; + + count += bitpop(keyboard_report.mods); + for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) { + if (IS_ANY(keyboard_report.keys[i])) { + count++; + } + } + return count; + } + + void matrix_print(void) { + print("\nr/c 0123456789ABCDEF\n"); + for (uint8_t row = 0; row < matrix_rows(); row++) { + xprintf("%02d: ", row); + print_bin_reverse16(matrix_get_row(row)); + print("\n"); + } + } + + void led_set(uint8_t usb_led) + { + kbd1.SetReport(0, 0, 2, 0, 1, &usb_led); + kbd2.SetReport(0, 0, 2, 0, 1, &usb_led); + kbd3.SetReport(0, 0, 2, 0, 1, &usb_led); + kbd4.SetReport(0, 0, 2, 0, 1, &usb_led); + } + +}; diff --git a/keyboards/converter/usb_usb/matrix.c b/keyboards/converter/usb_usb/matrix.c new file mode 100644 index 0000000000..b077febd74 --- /dev/null +++ b/keyboards/converter/usb_usb/matrix.c @@ -0,0 +1 @@ +// Intentionally left empty. This file must exist for this board to build. diff --git a/keyboards/converter/usb_usb/matrix.cpp b/keyboards/converter/usb_usb/matrix.cpp deleted file mode 100644 index 93d13edf0b..0000000000 --- a/keyboards/converter/usb_usb/matrix.cpp +++ /dev/null @@ -1,238 +0,0 @@ -/* -Copyright 2016 Jun Wako - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ - -#include -#include - -// USB HID host -#include "Usb.h" -#include "usbhub.h" -#include "hid.h" -#include "hidboot.h" -#include "parser.h" - -#include "keycode.h" -#include "util.h" -#include "print.h" -#include "debug.h" -#include "timer.h" -#include "matrix.h" -#include "led.h" -#include "host.h" -#include "keyboard.h" - - -/* KEY CODE to Matrix - * - * HID keycode(1 byte): - * Higher 5 bits indicates ROW and lower 3 bits COL. - * - * 7 6 5 4 3 2 1 0 - * +---------------+ - * | ROW | COL | - * +---------------+ - * - * Matrix space(16 * 16): - * r\c0123456789ABCDEF - * 0 +----------------+ - * : | | - * : | | - * 16 +----------------+ - */ -#define ROW_MASK 0xF0 -#define COL_MASK 0x0F -#define CODE(row, col) (((row) << 4) | (col)) -#define ROW(code) (((code) & ROW_MASK) >> 4) -#define COL(code) ((code) & COL_MASK) -#define ROW_BITS(code) (1 << COL(code)) - - -// Integrated key state of all keyboards -static report_keyboard_t keyboard_report; - -static bool matrix_is_mod = false; - -/* - * USB Host Shield HID keyboards - * This supports two cascaded hubs and four keyboards - */ -USB usb_host; -USBHub hub1(&usb_host); -USBHub hub2(&usb_host); -HIDBoot kbd1(&usb_host); -HIDBoot kbd2(&usb_host); -HIDBoot kbd3(&usb_host); -HIDBoot kbd4(&usb_host); -KBDReportParser kbd_parser1; -KBDReportParser kbd_parser2; -KBDReportParser kbd_parser3; -KBDReportParser kbd_parser4; - - -extern "C" -{ - uint8_t matrix_rows(void) { return MATRIX_ROWS; } - uint8_t matrix_cols(void) { return MATRIX_COLS; } - bool matrix_has_ghost(void) { return false; } - void matrix_init(void) { - // USB Host Shield setup - usb_host.Init(); - kbd1.SetReportParser(0, (HIDReportParser*)&kbd_parser1); - kbd2.SetReportParser(0, (HIDReportParser*)&kbd_parser2); - kbd3.SetReportParser(0, (HIDReportParser*)&kbd_parser3); - kbd4.SetReportParser(0, (HIDReportParser*)&kbd_parser4); - } - - static void or_report(report_keyboard_t report) { - // integrate reports into keyboard_report - keyboard_report.mods |= report.mods; - for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) { - if (IS_ANY(report.keys[i])) { - for (uint8_t j = 0; j < KEYBOARD_REPORT_KEYS; j++) { - if (! keyboard_report.keys[j]) { - keyboard_report.keys[j] = report.keys[i]; - break; - } - } - } - } - } - - uint8_t matrix_scan(void) { - static uint16_t last_time_stamp1 = 0; - static uint16_t last_time_stamp2 = 0; - static uint16_t last_time_stamp3 = 0; - static uint16_t last_time_stamp4 = 0; - - // check report came from keyboards - if (kbd_parser1.time_stamp != last_time_stamp1 || - kbd_parser2.time_stamp != last_time_stamp2 || - kbd_parser3.time_stamp != last_time_stamp3 || - kbd_parser4.time_stamp != last_time_stamp4) { - - last_time_stamp1 = kbd_parser1.time_stamp; - last_time_stamp2 = kbd_parser2.time_stamp; - last_time_stamp3 = kbd_parser3.time_stamp; - last_time_stamp4 = kbd_parser4.time_stamp; - - // clear and integrate all reports - keyboard_report = {}; - or_report(kbd_parser1.report); - or_report(kbd_parser2.report); - or_report(kbd_parser3.report); - or_report(kbd_parser4.report); - - matrix_is_mod = true; - - dprintf("state: %02X %02X", keyboard_report.mods, keyboard_report.reserved); - for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) { - dprintf(" %02X", keyboard_report.keys[i]); - } - dprint("\r\n"); - } else { - matrix_is_mod = false; - } - - uint16_t timer; - timer = timer_read(); - usb_host.Task(); - timer = timer_elapsed(timer); - if (timer > 100) { - dprintf("host.Task: %d\n", timer); - } - - static uint8_t usb_state = 0; - if (usb_state != usb_host.getUsbTaskState()) { - usb_state = usb_host.getUsbTaskState(); - dprintf("usb_state: %02X\n", usb_state); - - // restore LED state when keyboard comes up - if (usb_state == USB_STATE_RUNNING) { - dprintf("speed: %s\n", usb_host.getVbusState()==FSHOST ? "full" : "low"); - keyboard_set_leds(host_keyboard_leds()); - } - } - return 1; - } - - bool matrix_is_modified(void) { - return matrix_is_mod; - } - - bool matrix_is_on(uint8_t row, uint8_t col) { - uint8_t code = CODE(row, col); - - if (IS_MOD(code)) { - if (keyboard_report.mods & ROW_BITS(code)) { - return true; - } - } - for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) { - if (keyboard_report.keys[i] == code) { - return true; - } - } - return false; - } - - matrix_row_t matrix_get_row(uint8_t row) { - uint16_t row_bits = 0; - - if (IS_MOD(CODE(row, 0)) && keyboard_report.mods) { - row_bits |= keyboard_report.mods; - } - - for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) { - if (IS_ANY(keyboard_report.keys[i])) { - if (row == ROW(keyboard_report.keys[i])) { - row_bits |= ROW_BITS(keyboard_report.keys[i]); - } - } - } - return row_bits; - } - - uint8_t matrix_key_count(void) { - uint8_t count = 0; - - count += bitpop(keyboard_report.mods); - for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) { - if (IS_ANY(keyboard_report.keys[i])) { - count++; - } - } - return count; - } - - void matrix_print(void) { - print("\nr/c 0123456789ABCDEF\n"); - for (uint8_t row = 0; row < matrix_rows(); row++) { - xprintf("%02d: ", row); - print_bin_reverse16(matrix_get_row(row)); - print("\n"); - } - } - - void led_set(uint8_t usb_led) - { - kbd1.SetReport(0, 0, 2, 0, 1, &usb_led); - kbd2.SetReport(0, 0, 2, 0, 1, &usb_led); - kbd3.SetReport(0, 0, 2, 0, 1, &usb_led); - kbd4.SetReport(0, 0, 2, 0, 1, &usb_led); - } - -}; diff --git a/keyboards/converter/usb_usb/rules.mk b/keyboards/converter/usb_usb/rules.mk index f6b816966c..298bc5c404 100644 --- a/keyboards/converter/usb_usb/rules.mk +++ b/keyboards/converter/usb_usb/rules.mk @@ -111,7 +111,7 @@ OPT_DEFS += -DBOOTLOADER_SIZE=4096 CUSTOM_MATRIX = yes -SRC = matrix.cpp +SRC = custom_matrix.cpp # # Keymap file -- cgit v1.2.3