diff options
Diffstat (limited to 'keyboards/dichotemy/dichotemy.c')
| -rw-r--r-- | keyboards/dichotemy/dichotemy.c | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/keyboards/dichotemy/dichotemy.c b/keyboards/dichotemy/dichotemy.c new file mode 100644 index 000000000..080c2654c --- /dev/null +++ b/keyboards/dichotemy/dichotemy.c | |||
| @@ -0,0 +1,86 @@ | |||
| 1 | #include "dichotemy.h" | ||
| 2 | #include "pointing_device.h" | ||
| 3 | #include "report.h" | ||
| 4 | |||
| 5 | void uart_init(void) { | ||
| 6 | SERIAL_UART_INIT(); | ||
| 7 | } | ||
| 8 | |||
| 9 | void pointing_device_task(void){ | ||
| 10 | report_mouse_t currentReport = {}; | ||
| 11 | SERIAL_UART_INIT(); | ||
| 12 | uint32_t timeout = 0; | ||
| 13 | |||
| 14 | //the m character requests the RF slave to send the mouse report | ||
| 15 | SERIAL_UART_DATA = 'm'; | ||
| 16 | |||
| 17 | //trust the external inputs completely, erase old data | ||
| 18 | uint8_t uart_data[5] = {0}; | ||
| 19 | |||
| 20 | //there are 10 bytes corresponding to 10 columns, and an end byte | ||
| 21 | for (uint8_t i = 0; i < 5; i++) { | ||
| 22 | //wait for the serial data, timeout if it's been too long | ||
| 23 | //this only happened in testing with a loose wire, but does no | ||
| 24 | //harm to leave it in here | ||
| 25 | while(!SERIAL_UART_RXD_PRESENT){ | ||
| 26 | timeout++; | ||
| 27 | if (timeout > 10000){ | ||
| 28 | break; | ||
| 29 | } | ||
| 30 | } | ||
| 31 | uart_data[i] = SERIAL_UART_DATA; | ||
| 32 | } | ||
| 33 | |||
| 34 | //check for the end packet, bits 1-4 are movement and scroll | ||
| 35 | //but bit 5 has bits 0-3 for the scroll button state | ||
| 36 | //(1000 if pressed, 0000 if not) and bits 4-7 are always 1 | ||
| 37 | //We can use this to verify the report sent properly. | ||
| 38 | if (uart_data[4] == 0x0F || uart_data[4] == 0x8F) | ||
| 39 | { | ||
| 40 | currentReport = pointing_device_get_report(); | ||
| 41 | //shifting and transferring the info to the mouse report varaible | ||
| 42 | //mouseReport.x = 127 max -127 min | ||
| 43 | currentReport.x = uart_data[0]; | ||
| 44 | //mouseReport.y = 127 max -127 min | ||
| 45 | currentReport.y = uart_data[1]; | ||
| 46 | //mouseReport.v = 127 max -127 min (scroll vertical) | ||
| 47 | currentReport.v = uart_data[2]; | ||
| 48 | //mouseReport.h = 127 max -127 min (scroll horizontal) | ||
| 49 | currentReport.h = uart_data[3]; | ||
| 50 | //mouseReport.buttons = 0x31 max (bitmask for mouse buttons 1-5) 0x00 min | ||
| 51 | //mouse buttons 1 and 2 are handled by the keymap, but not 3 | ||
| 52 | if (uart_data[4] == 0x0F) { //then 3 is not pressed | ||
| 53 | currentReport.buttons &= ~MOUSE_BTN3; //MOUSE_BTN3 is def in report.h | ||
| 54 | } else { //3 must be pressed | ||
| 55 | currentReport.buttons |= MOUSE_BTN3; | ||
| 56 | } | ||
| 57 | pointing_device_set_report(currentReport); | ||
| 58 | } | ||
| 59 | pointing_device_send(); | ||
| 60 | } | ||
| 61 | |||
| 62 | void led_init(void) { | ||
| 63 | DDRD |= (1<<1); | ||
| 64 | PORTD |= (1<<1); | ||
| 65 | DDRF |= (1<<4) | (1<<5); | ||
| 66 | PORTF |= (1<<4) | (1<<5); | ||
| 67 | } | ||
| 68 | |||
| 69 | |||
| 70 | void matrix_init_kb(void) { | ||
| 71 | // put your keyboard start-up code here | ||
| 72 | // runs once when the firmware starts up | ||
| 73 | matrix_init_user(); | ||
| 74 | uart_init(); | ||
| 75 | led_init(); | ||
| 76 | } | ||
| 77 | |||
| 78 | void matrix_scan_kb(void) { | ||
| 79 | // put your looping keyboard code here | ||
| 80 | // runs every cycle (a lot) | ||
| 81 | matrix_scan_user(); | ||
| 82 | } | ||
| 83 | |||
| 84 | void led_set_kb(uint8_t usb_led) { | ||
| 85 | |||
| 86 | } | ||
