diff options
| author | XScorpion2 <rcalt2vt@gmail.com> | 2021-02-15 18:30:33 -0600 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-02-16 11:30:33 +1100 |
| commit | d1806a26e4ad75fa0e0405283803eba22c1a49ba (patch) | |
| tree | 25bf2750e9770781cff373114bd44736463a91f1 /quantum/split_common | |
| parent | 1bc8a6e5d49861b268f9274a8686a2640e36e0b5 (diff) | |
| download | qmk_firmware-d1806a26e4ad75fa0e0405283803eba22c1a49ba.tar.gz qmk_firmware-d1806a26e4ad75fa0e0405283803eba22c1a49ba.zip | |
Split transport mirror (#11046)
* Split transport mirror support
* Updated RGB Matrix to respond to electrical events instead of key events
* split matrix slave fix
Diffstat (limited to 'quantum/split_common')
| -rw-r--r-- | quantum/split_common/matrix.c | 4 | ||||
| -rw-r--r-- | quantum/split_common/transport.c | 37 | ||||
| -rw-r--r-- | quantum/split_common/transport.h | 4 |
3 files changed, 32 insertions, 13 deletions
diff --git a/quantum/split_common/matrix.c b/quantum/split_common/matrix.c index bad762b49..d6636b886 100644 --- a/quantum/split_common/matrix.c +++ b/quantum/split_common/matrix.c | |||
| @@ -257,7 +257,7 @@ bool matrix_post_scan(void) { | |||
| 257 | static uint8_t error_count; | 257 | static uint8_t error_count; |
| 258 | 258 | ||
| 259 | matrix_row_t slave_matrix[ROWS_PER_HAND] = {0}; | 259 | matrix_row_t slave_matrix[ROWS_PER_HAND] = {0}; |
| 260 | if (!transport_master(slave_matrix)) { | 260 | if (!transport_master(matrix + thisHand, slave_matrix)) { |
| 261 | error_count++; | 261 | error_count++; |
| 262 | 262 | ||
| 263 | if (error_count > ERROR_DISCONNECT_COUNT) { | 263 | if (error_count > ERROR_DISCONNECT_COUNT) { |
| @@ -282,7 +282,7 @@ bool matrix_post_scan(void) { | |||
| 282 | 282 | ||
| 283 | matrix_scan_quantum(); | 283 | matrix_scan_quantum(); |
| 284 | } else { | 284 | } else { |
| 285 | transport_slave(matrix + thisHand); | 285 | transport_slave(matrix + thatHand, matrix + thisHand); |
| 286 | 286 | ||
| 287 | matrix_slave_scan_user(); | 287 | matrix_slave_scan_user(); |
| 288 | } | 288 | } |
diff --git a/quantum/split_common/transport.c b/quantum/split_common/transport.c index b45ba92c3..977b5dc33 100644 --- a/quantum/split_common/transport.c +++ b/quantum/split_common/transport.c | |||
| @@ -31,6 +31,9 @@ typedef struct _I2C_slave_buffer_t { | |||
| 31 | # ifndef DISABLE_SYNC_TIMER | 31 | # ifndef DISABLE_SYNC_TIMER |
| 32 | uint32_t sync_timer; | 32 | uint32_t sync_timer; |
| 33 | # endif | 33 | # endif |
| 34 | # ifdef SPLIT_TRANSPORT_MIRROR | ||
| 35 | matrix_row_t mmatrix[ROWS_PER_HAND]; | ||
| 36 | # endif | ||
| 34 | matrix_row_t smatrix[ROWS_PER_HAND]; | 37 | matrix_row_t smatrix[ROWS_PER_HAND]; |
| 35 | # ifdef SPLIT_MODS_ENABLE | 38 | # ifdef SPLIT_MODS_ENABLE |
| 36 | uint8_t real_mods; | 39 | uint8_t real_mods; |
| @@ -56,7 +59,8 @@ typedef struct _I2C_slave_buffer_t { | |||
| 56 | static I2C_slave_buffer_t *const i2c_buffer = (I2C_slave_buffer_t *)i2c_slave_reg; | 59 | static I2C_slave_buffer_t *const i2c_buffer = (I2C_slave_buffer_t *)i2c_slave_reg; |
| 57 | 60 | ||
| 58 | # define I2C_SYNC_TIME_START offsetof(I2C_slave_buffer_t, sync_timer) | 61 | # define I2C_SYNC_TIME_START offsetof(I2C_slave_buffer_t, sync_timer) |
| 59 | # define I2C_KEYMAP_START offsetof(I2C_slave_buffer_t, smatrix) | 62 | # define I2C_KEYMAP_MASTER_START offsetof(I2C_slave_buffer_t, mmatrix) |
| 63 | # define I2C_KEYMAP_SLAVE_START offsetof(I2C_slave_buffer_t, smatrix) | ||
| 60 | # define I2C_REAL_MODS_START offsetof(I2C_slave_buffer_t, real_mods) | 64 | # define I2C_REAL_MODS_START offsetof(I2C_slave_buffer_t, real_mods) |
| 61 | # define I2C_WEAK_MODS_START offsetof(I2C_slave_buffer_t, weak_mods) | 65 | # define I2C_WEAK_MODS_START offsetof(I2C_slave_buffer_t, weak_mods) |
| 62 | # define I2C_ONESHOT_MODS_START offsetof(I2C_slave_buffer_t, oneshot_mods) | 66 | # define I2C_ONESHOT_MODS_START offsetof(I2C_slave_buffer_t, oneshot_mods) |
| @@ -72,8 +76,11 @@ static I2C_slave_buffer_t *const i2c_buffer = (I2C_slave_buffer_t *)i2c_slave_re | |||
| 72 | # endif | 76 | # endif |
| 73 | 77 | ||
| 74 | // Get rows from other half over i2c | 78 | // Get rows from other half over i2c |
| 75 | bool transport_master(matrix_row_t matrix[]) { | 79 | bool transport_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { |
| 76 | i2c_readReg(SLAVE_I2C_ADDRESS, I2C_KEYMAP_START, (void *)matrix, sizeof(i2c_buffer->smatrix), TIMEOUT); | 80 | i2c_readReg(SLAVE_I2C_ADDRESS, I2C_KEYMAP_SLAVE_START, (void *)slave_matrix, sizeof(i2c_buffer->smatrix), TIMEOUT); |
| 81 | #ifdef SPLIT_TRANSPORT_MIRROR | ||
| 82 | i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_KEYMAP_MASTER_START, (void *)master_matrix, sizeof(i2c_buffer->mmatrix), TIMEOUT); | ||
| 83 | #endif | ||
| 77 | 84 | ||
| 78 | // write backlight info | 85 | // write backlight info |
| 79 | # ifdef BACKLIGHT_ENABLE | 86 | # ifdef BACKLIGHT_ENABLE |
| @@ -141,12 +148,15 @@ bool transport_master(matrix_row_t matrix[]) { | |||
| 141 | return true; | 148 | return true; |
| 142 | } | 149 | } |
| 143 | 150 | ||
| 144 | void transport_slave(matrix_row_t matrix[]) { | 151 | void transport_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { |
| 145 | # ifndef DISABLE_SYNC_TIMER | 152 | # ifndef DISABLE_SYNC_TIMER |
| 146 | sync_timer_update(i2c_buffer->sync_timer); | 153 | sync_timer_update(i2c_buffer->sync_timer); |
| 147 | # endif | 154 | # endif |
| 148 | // Copy matrix to I2C buffer | 155 | // Copy matrix to I2C buffer |
| 149 | memcpy((void *)i2c_buffer->smatrix, (void *)matrix, sizeof(i2c_buffer->smatrix)); | 156 | memcpy((void*)i2c_buffer->smatrix, (void *)slave_matrix, sizeof(i2c_buffer->smatrix)); |
| 157 | #ifdef SPLIT_TRANSPORT_MIRROR | ||
| 158 | memcpy((void*)master_matrix, (void *)i2c_buffer->mmatrix, sizeof(i2c_buffer->mmatrix)); | ||
| 159 | #endif | ||
| 150 | 160 | ||
| 151 | // Read Backlight Info | 161 | // Read Backlight Info |
| 152 | # ifdef BACKLIGHT_ENABLE | 162 | # ifdef BACKLIGHT_ENABLE |
| @@ -207,6 +217,9 @@ typedef struct _Serial_m2s_buffer_t { | |||
| 207 | # ifndef DISABLE_SYNC_TIMER | 217 | # ifndef DISABLE_SYNC_TIMER |
| 208 | uint32_t sync_timer; | 218 | uint32_t sync_timer; |
| 209 | # endif | 219 | # endif |
| 220 | # ifdef SPLIT_TRANSPORT_MIRROR | ||
| 221 | matrix_row_t mmatrix[ROWS_PER_HAND]; | ||
| 222 | # endif | ||
| 210 | # ifdef BACKLIGHT_ENABLE | 223 | # ifdef BACKLIGHT_ENABLE |
| 211 | uint8_t backlight_level; | 224 | uint8_t backlight_level; |
| 212 | # endif | 225 | # endif |
| @@ -289,7 +302,7 @@ void transport_rgblight_slave(void) { | |||
| 289 | # define transport_rgblight_slave() | 302 | # define transport_rgblight_slave() |
| 290 | # endif | 303 | # endif |
| 291 | 304 | ||
| 292 | bool transport_master(matrix_row_t matrix[]) { | 305 | bool transport_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { |
| 293 | # ifndef SERIAL_USE_MULTI_TRANSACTION | 306 | # ifndef SERIAL_USE_MULTI_TRANSACTION |
| 294 | if (soft_serial_transaction() != TRANSACTION_END) { | 307 | if (soft_serial_transaction() != TRANSACTION_END) { |
| 295 | return false; | 308 | return false; |
| @@ -303,7 +316,10 @@ bool transport_master(matrix_row_t matrix[]) { | |||
| 303 | 316 | ||
| 304 | // TODO: if MATRIX_COLS > 8 change to unpack() | 317 | // TODO: if MATRIX_COLS > 8 change to unpack() |
| 305 | for (int i = 0; i < ROWS_PER_HAND; ++i) { | 318 | for (int i = 0; i < ROWS_PER_HAND; ++i) { |
| 306 | matrix[i] = serial_s2m_buffer.smatrix[i]; | 319 | slave_matrix[i] = serial_s2m_buffer.smatrix[i]; |
| 320 | #ifdef SPLIT_TRANSPORT_MIRROR | ||
| 321 | serial_m2s_buffer.mmatrix[i] = master_matrix[i]; | ||
| 322 | #endif | ||
| 307 | } | 323 | } |
| 308 | 324 | ||
| 309 | # ifdef BACKLIGHT_ENABLE | 325 | # ifdef BACKLIGHT_ENABLE |
| @@ -333,7 +349,7 @@ bool transport_master(matrix_row_t matrix[]) { | |||
| 333 | return true; | 349 | return true; |
| 334 | } | 350 | } |
| 335 | 351 | ||
| 336 | void transport_slave(matrix_row_t matrix[]) { | 352 | void transport_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) { |
| 337 | transport_rgblight_slave(); | 353 | transport_rgblight_slave(); |
| 338 | # ifndef DISABLE_SYNC_TIMER | 354 | # ifndef DISABLE_SYNC_TIMER |
| 339 | sync_timer_update(serial_m2s_buffer.sync_timer); | 355 | sync_timer_update(serial_m2s_buffer.sync_timer); |
| @@ -341,7 +357,10 @@ void transport_slave(matrix_row_t matrix[]) { | |||
| 341 | 357 | ||
| 342 | // TODO: if MATRIX_COLS > 8 change to pack() | 358 | // TODO: if MATRIX_COLS > 8 change to pack() |
| 343 | for (int i = 0; i < ROWS_PER_HAND; ++i) { | 359 | for (int i = 0; i < ROWS_PER_HAND; ++i) { |
| 344 | serial_s2m_buffer.smatrix[i] = matrix[i]; | 360 | serial_s2m_buffer.smatrix[i] = slave_matrix[i]; |
| 361 | #ifdef SPLIT_TRANSPORT_MIRROR | ||
| 362 | master_matrix[i] = serial_m2s_buffer.mmatrix[i]; | ||
| 363 | #endif | ||
| 345 | } | 364 | } |
| 346 | # ifdef BACKLIGHT_ENABLE | 365 | # ifdef BACKLIGHT_ENABLE |
| 347 | backlight_set(serial_m2s_buffer.backlight_level); | 366 | backlight_set(serial_m2s_buffer.backlight_level); |
diff --git a/quantum/split_common/transport.h b/quantum/split_common/transport.h index c667bfab8..a9f66301b 100644 --- a/quantum/split_common/transport.h +++ b/quantum/split_common/transport.h | |||
| @@ -6,5 +6,5 @@ void transport_master_init(void); | |||
| 6 | void transport_slave_init(void); | 6 | void transport_slave_init(void); |
| 7 | 7 | ||
| 8 | // returns false if valid data not received from slave | 8 | // returns false if valid data not received from slave |
| 9 | bool transport_master(matrix_row_t matrix[]); | 9 | bool transport_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]); |
| 10 | void transport_slave(matrix_row_t matrix[]); | 10 | void transport_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]); |
