diff options
Diffstat (limited to 'keyboards/helix/rev2/matrix.c')
-rw-r--r-- | keyboards/helix/rev2/matrix.c | 58 |
1 files changed, 34 insertions, 24 deletions
diff --git a/keyboards/helix/rev2/matrix.c b/keyboards/helix/rev2/matrix.c index 8a1ce3af1..322959dbb 100644 --- a/keyboards/helix/rev2/matrix.c +++ b/keyboards/helix/rev2/matrix.c | |||
@@ -20,6 +20,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
20 | */ | 20 | */ |
21 | #include <stdint.h> | 21 | #include <stdint.h> |
22 | #include <stdbool.h> | 22 | #include <stdbool.h> |
23 | #include <string.h> | ||
23 | #include <avr/io.h> | 24 | #include <avr/io.h> |
24 | #include <avr/wdt.h> | 25 | #include <avr/wdt.h> |
25 | #include <avr/interrupt.h> | 26 | #include <avr/interrupt.h> |
@@ -34,7 +35,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
34 | #ifdef USE_MATRIX_I2C | 35 | #ifdef USE_MATRIX_I2C |
35 | # include "i2c.h" | 36 | # include "i2c.h" |
36 | #else // USE_SERIAL | 37 | #else // USE_SERIAL |
37 | # include "serial.h" | 38 | # include "split_scomm.h" |
38 | #endif | 39 | #endif |
39 | 40 | ||
40 | #ifndef DEBOUNCE | 41 | #ifndef DEBOUNCE |
@@ -102,6 +103,8 @@ void matrix_init(void) | |||
102 | init_cols(); | 103 | init_cols(); |
103 | 104 | ||
104 | TX_RX_LED_INIT; | 105 | TX_RX_LED_INIT; |
106 | TXLED0; | ||
107 | RXLED0; | ||
105 | 108 | ||
106 | // initialize matrix state: all keys off | 109 | // initialize matrix state: all keys off |
107 | for (uint8_t i=0; i < MATRIX_ROWS; i++) { | 110 | for (uint8_t i=0; i < MATRIX_ROWS; i++) { |
@@ -178,17 +181,20 @@ i2c_error: // the cable is disconnceted, or something else went wrong | |||
178 | 181 | ||
179 | #else // USE_SERIAL | 182 | #else // USE_SERIAL |
180 | 183 | ||
181 | int serial_transaction(void) { | 184 | int serial_transaction(int master_changed) { |
182 | int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; | 185 | int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0; |
186 | #ifdef SERIAL_USE_MULTI_TRANSACTION | ||
187 | int ret=serial_update_buffers(master_changed); | ||
188 | #else | ||
183 | int ret=serial_update_buffers(); | 189 | int ret=serial_update_buffers(); |
190 | #endif | ||
184 | if (ret ) { | 191 | if (ret ) { |
185 | if(ret==2)RXLED1; | 192 | if(ret==2) RXLED1; |
186 | return 1; | 193 | return 1; |
187 | } | 194 | } |
188 | RXLED0; | 195 | RXLED0; |
189 | for (int i = 0; i < ROWS_PER_HAND; ++i) { | 196 | memcpy(&matrix[slaveOffset], |
190 | matrix[slaveOffset+i] = serial_slave_buffer[i]; | 197 | (void *)serial_slave_buffer, sizeof(serial_slave_buffer)); |
191 | } | ||
192 | return 0; | 198 | return 0; |
193 | } | 199 | } |
194 | #endif | 200 | #endif |
@@ -199,19 +205,9 @@ uint8_t matrix_scan(void) | |||
199 | matrix_master_scan(); | 205 | matrix_master_scan(); |
200 | }else{ | 206 | }else{ |
201 | matrix_slave_scan(); | 207 | matrix_slave_scan(); |
202 | 208 | int offset = (isLeftHand) ? ROWS_PER_HAND : 0; | |
203 | // if(serial_slave_DATA_CORRUPT()){ | 209 | memcpy(&matrix[offset], |
204 | // TXLED0; | 210 | (void *)serial_master_buffer, sizeof(serial_master_buffer)); |
205 | int offset = (isLeftHand) ? ROWS_PER_HAND : 0; | ||
206 | |||
207 | for (int i = 0; i < ROWS_PER_HAND; ++i) { | ||
208 | matrix[offset+i] = serial_master_buffer[i]; | ||
209 | } | ||
210 | |||
211 | // }else{ | ||
212 | // TXLED1; | ||
213 | // } | ||
214 | |||
215 | matrix_scan_quantum(); | 211 | matrix_scan_quantum(); |
216 | } | 212 | } |
217 | return 1; | 213 | return 1; |
@@ -221,6 +217,7 @@ uint8_t matrix_scan(void) | |||
221 | uint8_t matrix_master_scan(void) { | 217 | uint8_t matrix_master_scan(void) { |
222 | 218 | ||
223 | int ret = _matrix_scan(); | 219 | int ret = _matrix_scan(); |
220 | int mchanged = 1; | ||
224 | 221 | ||
225 | #ifndef KEYBOARD_helix_rev1 | 222 | #ifndef KEYBOARD_helix_rev1 |
226 | int offset = (isLeftHand) ? 0 : ROWS_PER_HAND; | 223 | int offset = (isLeftHand) ? 0 : ROWS_PER_HAND; |
@@ -231,16 +228,19 @@ uint8_t matrix_master_scan(void) { | |||
231 | // i2c_slave_buffer[i] = matrix[offset+i]; | 228 | // i2c_slave_buffer[i] = matrix[offset+i]; |
232 | // } | 229 | // } |
233 | #else // USE_SERIAL | 230 | #else // USE_SERIAL |
234 | for (int i = 0; i < ROWS_PER_HAND; ++i) { | 231 | #ifdef SERIAL_USE_MULTI_TRANSACTION |
235 | serial_master_buffer[i] = matrix[offset+i]; | 232 | mchanged = memcmp((void *)serial_master_buffer, |
236 | } | 233 | &matrix[offset], sizeof(serial_master_buffer)); |
234 | #endif | ||
235 | memcpy((void *)serial_master_buffer, | ||
236 | &matrix[offset], sizeof(serial_master_buffer)); | ||
237 | #endif | 237 | #endif |
238 | #endif | 238 | #endif |
239 | 239 | ||
240 | #ifdef USE_MATRIX_I2C | 240 | #ifdef USE_MATRIX_I2C |
241 | if( i2c_transaction() ) { | 241 | if( i2c_transaction() ) { |
242 | #else // USE_SERIAL | 242 | #else // USE_SERIAL |
243 | if( serial_transaction() ) { | 243 | if( serial_transaction(mchanged) ) { |
244 | #endif | 244 | #endif |
245 | // turn on the indicator led when halves are disconnected | 245 | // turn on the indicator led when halves are disconnected |
246 | TXLED1; | 246 | TXLED1; |
@@ -274,9 +274,19 @@ void matrix_slave_scan(void) { | |||
274 | i2c_slave_buffer[i] = matrix[offset+i]; | 274 | i2c_slave_buffer[i] = matrix[offset+i]; |
275 | } | 275 | } |
276 | #else // USE_SERIAL | 276 | #else // USE_SERIAL |
277 | #ifdef SERIAL_USE_MULTI_TRANSACTION | ||
278 | int change = 0; | ||
279 | #endif | ||
277 | for (int i = 0; i < ROWS_PER_HAND; ++i) { | 280 | for (int i = 0; i < ROWS_PER_HAND; ++i) { |
281 | #ifdef SERIAL_USE_MULTI_TRANSACTION | ||
282 | if( serial_slave_buffer[i] != matrix[offset+i] ) | ||
283 | change = 1; | ||
284 | #endif | ||
278 | serial_slave_buffer[i] = matrix[offset+i]; | 285 | serial_slave_buffer[i] = matrix[offset+i]; |
279 | } | 286 | } |
287 | #ifdef SERIAL_USE_MULTI_TRANSACTION | ||
288 | slave_buffer_change_count += change; | ||
289 | #endif | ||
280 | #endif | 290 | #endif |
281 | } | 291 | } |
282 | 292 | ||