aboutsummaryrefslogtreecommitdiff
path: root/keyboards/dichotomy/matrix.c
diff options
context:
space:
mode:
Diffstat (limited to 'keyboards/dichotomy/matrix.c')
-rwxr-xr-xkeyboards/dichotomy/matrix.c226
1 files changed, 226 insertions, 0 deletions
diff --git a/keyboards/dichotomy/matrix.c b/keyboards/dichotomy/matrix.c
new file mode 100755
index 000000000..ed83bd452
--- /dev/null
+++ b/keyboards/dichotomy/matrix.c
@@ -0,0 +1,226 @@
1/*
2Copyright 2012 Jun Wako
3Copyright 2014 Jack Humbert
4
5This program is free software: you can redistribute it and/or modify
6it under the terms of the GNU General Public License as published by
7the Free Software Foundation, either version 2 of the License, or
8(at your option) any later version.
9
10This program is distributed in the hope that it will be useful,
11but WITHOUT ANY WARRANTY; without even the implied warranty of
12MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13GNU General Public License for more details.
14
15You should have received a copy of the GNU General Public License
16along with this program. If not, see <http://www.gnu.org/licenses/>.
17*/
18#include <stdint.h>
19#include <stdbool.h>
20#if defined(__AVR__)
21#include <avr/io.h>
22#endif
23#include "wait.h"
24#include "print.h"
25#include "debug.h"
26#include "util.h"
27#include "matrix.h"
28#include "timer.h"
29#include "dichotomy.h"
30#include "pointing_device.h"
31#include "report.h"
32#include "protocol/serial.h"
33
34#if (MATRIX_COLS <= 8)
35# define print_matrix_header() print("\nr/c 01234567\n")
36# define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row))
37# define matrix_bitpop(i) bitpop(matrix[i])
38# define ROW_SHIFTER ((uint8_t)1)
39#elif (MATRIX_COLS <= 16)
40# define print_matrix_header() print("\nr/c 0123456789ABCDEF\n")
41# define print_matrix_row(row) print_bin_reverse16(matrix_get_row(row))
42# define matrix_bitpop(i) bitpop16(matrix[i])
43# define ROW_SHIFTER ((uint16_t)1)
44#elif (MATRIX_COLS <= 32)
45# define print_matrix_header() print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n")
46# define print_matrix_row(row) print_bin_reverse32(matrix_get_row(row))
47# define matrix_bitpop(i) bitpop32(matrix[i])
48# define ROW_SHIFTER ((uint32_t)1)
49#endif
50
51#define MAIN_ROWMASK 0xFFF0;
52#define LOWER_ROWMASK 0x3FC0;
53
54/* matrix state(1:on, 0:off) */
55static matrix_row_t matrix[MATRIX_ROWS];
56
57__attribute__ ((weak))
58void matrix_init_quantum(void) {
59 matrix_init_kb();
60}
61
62__attribute__ ((weak))
63void matrix_scan_quantum(void) {
64 matrix_scan_kb();
65}
66
67__attribute__ ((weak))
68void matrix_init_kb(void) {
69 matrix_init_user();
70}
71
72__attribute__ ((weak))
73void matrix_scan_kb(void) {
74 matrix_scan_user();
75}
76
77__attribute__ ((weak))
78void matrix_init_user(void) {
79}
80
81__attribute__ ((weak))
82void matrix_scan_user(void) {
83}
84
85inline
86uint8_t matrix_rows(void) {
87 return MATRIX_ROWS;
88}
89
90inline
91uint8_t matrix_cols(void) {
92 return MATRIX_COLS;
93}
94
95void matrix_init(void) {
96 matrix_init_quantum();
97 serial_init();
98}
99
100uint8_t matrix_scan(void)
101{
102 //xprintf("\r\nTRYING TO SCAN");
103
104 uint32_t timeout = 0;
105
106 //the s character requests the RF slave to send the matrix
107 SERIAL_UART_DATA = 's';
108
109 //trust the external keystates entirely, erase the last data
110 uint8_t uart_data[11] = {0};
111
112 //there are 10 bytes corresponding to 10 columns, and an end byte
113 for (uint8_t i = 0; i < 11; i++) {
114 //wait for the serial data, timeout if it's been too long
115 //this only happened in testing with a loose wire, but does no
116 //harm to leave it in here
117 while(!SERIAL_UART_RXD_PRESENT){
118 timeout++;
119 if (timeout > 10000){
120 xprintf("\r\nTime out in keyboard.");
121 break;
122 }
123 }
124 uart_data[i] = SERIAL_UART_DATA;
125 }
126
127 //check for the end packet, the key state bytes use the LSBs, so 0xE0
128 //will only show up here if the correct bytes were recieved
129 uint8_t checksum = 0x00;
130 for (uint8_t z=0; z<10; z++){
131 checksum = checksum^uart_data[z];
132 }
133 checksum = checksum ^ (uart_data[10] & 0xF0);
134 // Smash the checksum from 1 byte into 4 bits
135 checksum = (checksum ^ ((checksum & 0xF0)>>4)) & 0x0F;
136//xprintf("\r\nGOT RAW PACKET: \r\n%d\r\n%d\r\n%d\r\n%d\r\n%d\r\n%d\r\n%d\r\n%d\r\n%d\r\n%d\r\n%d\r\n%d",uart_data[0],uart_data[1],uart_data[2],uart_data[3],uart_data[4],uart_data[5],uart_data[6],uart_data[7],uart_data[8],uart_data[9],uart_data[10],checksum);
137 if ((uart_data[10] & 0x0F) == checksum) { //this is an arbitrary binary checksum (1001) (that would be 0x9.)
138 //xprintf("\r\nGOT PACKET: \r\n%d\r\n%d\r\n%d\r\n%d\r\n%d\r\n%d",uart_data[0],uart_data[1],uart_data[2],uart_data[3],uart_data[4],uart_data[5]);
139 //shifting and transferring the keystates to the QMK matrix variable
140 //bits 1-12 are row 1, 13-24 are row 2, 25-36 are row 3,
141 //bits 37-42 are row 4 (only 6 wide, 1-3 are 0, and 10-12 are 0)
142 //bits 43-48 are row 5 (same as row 4)
143 /* ASSUMING MSB FIRST */
144 matrix[0] = (((uint16_t) uart_data[0] << 8) | ((uint16_t) uart_data[1])) & MAIN_ROWMASK;
145 matrix[1] = ((uint16_t) uart_data[1] << 12) | ((uint16_t) uart_data[2] << 4);
146 matrix[2] = (((uint16_t) uart_data[3] << 8) | ((uint16_t) uart_data[4])) & MAIN_ROWMASK;
147 matrix[3] = (((uint16_t) uart_data[4] << 9) | ((uint16_t) uart_data[5] << 1)) & LOWER_ROWMASK;
148 matrix[4] = (((uint16_t) uart_data[5] << 7) | ((uart_data[10] & 1<<7) ? 1:0) << 13 | ((uart_data[10] & 1<<6) ? 1:0) << 6) & LOWER_ROWMASK;
149 /* OK, TURNS OUT THAT WAS A BAD ASSUMPTION */
150 for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
151 //I've unpacked these into the mirror image of what QMK expects them to be, so...
152 /*uint8_t halfOne = (matrix[i]>>8);
153 uint8_t halfTwo = (matrix[i] & 0xFF);
154 halfOne = ((halfOne * 0x0802LU & 0x22110LU) | (halfOne * 0x8020LU & 0x88440LU)) * 0x10101LU >> 16;
155 halfTwo = ((halfTwo * 0x0802LU & 0x22110LU) | (halfTwo * 0x8020LU & 0x88440LU)) * 0x10101LU >> 16;
156 matrix[i] = ((halfTwo<<8) & halfOne);*/
157 //matrix[i] = ((matrix[i] * 0x0802LU & 0x22110LU) | (matrix[i] * 0x8020LU & 0x88440LU)) * 0x10101LU >> 16;
158 matrix[i] = bitrev16(matrix[i]);
159 //bithack mirror! Doesn't make any sense, but works - and efficiently.
160 }
161 //if (uart_data[6]!=0 || uart_data[7]!=0){
162 //if (maxCount<101){
163 // xprintf("\r\nMouse data: x=%d, y=%d",(int8_t)uart_data[6],(int8_t)uart_data[7]);
164 //}
165 report_mouse_t currentReport = {};
166 //check for the end packet, bytes 1-4 are movement and scroll
167 //but byte 5 has bits 0-3 for the scroll button state
168 //(1000 if pressed, 0000 if not) and bits 4-7 are always 1
169 //We can use this to verify the report sent properly.
170
171 currentReport = pointing_device_get_report();
172 //shifting and transferring the info to the mouse report varaible
173 //mouseReport.x = 127 max -127 min
174 currentReport.x = (int8_t) uart_data[6];
175 //mouseReport.y = 127 max -127 min
176 currentReport.y = (int8_t) uart_data[7];
177 //mouseReport.v = 127 max -127 min (scroll vertical)
178 currentReport.v = (int8_t) uart_data[8];
179 //mouseReport.h = 127 max -127 min (scroll horizontal)
180 currentReport.h = (int8_t) uart_data[9];
181 /*
182 currentReport.x = 0;
183 currentReport.y = 0;
184 currentReport.v = 0;
185 currentReport.h = 0;*/
186 pointing_device_set_report(currentReport);
187 } else {
188 //xprintf("\r\nRequested packet, data 10 was %d but checksum was %d",(uart_data[10] & 0x0F), (checksum & 0x0F));
189 }
190 //matrix_print();
191
192 matrix_scan_quantum();
193 return 1;
194}
195
196inline
197bool matrix_is_on(uint8_t row, uint8_t col)
198{
199 return (matrix[row] & ((matrix_row_t)1<<col));
200}
201
202inline
203matrix_row_t matrix_get_row(uint8_t row)
204{
205 return matrix[row];
206}
207
208void matrix_print(void)
209{
210 print_matrix_header();
211
212 for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
213 print_hex8(row); print(": ");
214 print_matrix_row(row);
215 print("\n");
216 }
217}
218
219uint8_t matrix_key_count(void)
220{
221 uint8_t count = 0;
222 for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
223 count += matrix_bitpop(i);
224 }
225 return count;
226}