|
|
|
@ -15,90 +15,18 @@ 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 <http://www.gnu.org/licenses/>.
|
|
|
|
|
*/ |
|
|
|
|
#include <stdint.h> |
|
|
|
|
#include <stdbool.h> |
|
|
|
|
#if defined(__AVR__) |
|
|
|
|
#include <avr/io.h> |
|
|
|
|
#endif |
|
|
|
|
#include "wait.h" |
|
|
|
|
#include "print.h" |
|
|
|
|
#include "debug.h" |
|
|
|
|
#include "util.h" |
|
|
|
|
|
|
|
|
|
#include "quantum.h" |
|
|
|
|
#include "matrix.h" |
|
|
|
|
#include "timer.h" |
|
|
|
|
#include "uart.h" |
|
|
|
|
|
|
|
|
|
#if (MATRIX_COLS <= 8) |
|
|
|
|
# define print_matrix_header() print("\nr/c 01234567\n") |
|
|
|
|
# define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row)) |
|
|
|
|
# define matrix_bitpop(i) bitpop(matrix[i]) |
|
|
|
|
# define ROW_SHIFTER ((uint8_t)1) |
|
|
|
|
#elif (MATRIX_COLS <= 16) |
|
|
|
|
# define print_matrix_header() print("\nr/c 0123456789ABCDEF\n") |
|
|
|
|
# define print_matrix_row(row) print_bin_reverse16(matrix_get_row(row)) |
|
|
|
|
# define matrix_bitpop(i) bitpop16(matrix[i]) |
|
|
|
|
# define ROW_SHIFTER ((uint16_t)1) |
|
|
|
|
#elif (MATRIX_COLS <= 32) |
|
|
|
|
# define print_matrix_header() print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n") |
|
|
|
|
# define print_matrix_row(row) print_bin_reverse32(matrix_get_row(row)) |
|
|
|
|
# define matrix_bitpop(i) bitpop32(matrix[i]) |
|
|
|
|
# define ROW_SHIFTER ((uint32_t)1) |
|
|
|
|
#elif (MATRIX_COLS <= 64) |
|
|
|
|
# define print_matrix_header() print("\nr/c 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF\n") |
|
|
|
|
# define print_matrix_row(row) print_bin_reverse64(matrix_get_row(row)) |
|
|
|
|
# define matrix_bitpop(i) bitpop64(matrix[i]) |
|
|
|
|
# define ROW_SHIFTER ((uint64_t)1) |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
/* matrix state(1:on, 0:off) */ |
|
|
|
|
static matrix_row_t matrix[MATRIX_ROWS]; |
|
|
|
|
|
|
|
|
|
__attribute__ ((weak)) |
|
|
|
|
void matrix_init_quantum(void) { |
|
|
|
|
matrix_init_kb(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
__attribute__ ((weak)) |
|
|
|
|
void matrix_scan_quantum(void) { |
|
|
|
|
matrix_scan_kb(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
__attribute__ ((weak)) |
|
|
|
|
void matrix_init_kb(void) { |
|
|
|
|
matrix_init_user(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
__attribute__ ((weak)) |
|
|
|
|
void matrix_scan_kb(void) { |
|
|
|
|
matrix_scan_user(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
__attribute__ ((weak)) |
|
|
|
|
void matrix_init_user(void) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
__attribute__ ((weak)) |
|
|
|
|
void matrix_scan_user(void) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline |
|
|
|
|
uint8_t matrix_rows(void) { |
|
|
|
|
return MATRIX_ROWS; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline |
|
|
|
|
uint8_t matrix_cols(void) { |
|
|
|
|
return MATRIX_COLS; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void matrix_init(void) { |
|
|
|
|
matrix_init_quantum(); |
|
|
|
|
void matrix_init_custom(void) { |
|
|
|
|
uart_init(1000000); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
uint8_t matrix_scan(void) |
|
|
|
|
{ |
|
|
|
|
bool matrix_scan_custom(matrix_row_t current_matrix[]) { |
|
|
|
|
uint32_t timeout = 0; |
|
|
|
|
bool changed = false; |
|
|
|
|
|
|
|
|
|
//the s character requests the RF slave to send the matrix
|
|
|
|
|
uart_write('s'); |
|
|
|
@ -111,9 +39,9 @@ uint8_t matrix_scan(void) |
|
|
|
|
//wait for the serial data, timeout if it's been too long
|
|
|
|
|
//this only happened in testing with a loose wire, but does no
|
|
|
|
|
//harm to leave it in here
|
|
|
|
|
while(!uart_available()){ |
|
|
|
|
while (!uart_available()) { |
|
|
|
|
timeout++; |
|
|
|
|
if (timeout > 10000){ |
|
|
|
|
if (timeout > 10000) { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -122,47 +50,16 @@ uint8_t matrix_scan(void) |
|
|
|
|
|
|
|
|
|
//check for the end packet, the key state bytes use the LSBs, so 0xE0
|
|
|
|
|
//will only show up here if the correct bytes were recieved
|
|
|
|
|
if (uart_data[10] == 0xE0) |
|
|
|
|
{ |
|
|
|
|
if (uart_data[10] == 0xE0) { |
|
|
|
|
//shifting and transferring the keystates to the QMK matrix variable
|
|
|
|
|
for (uint8_t i = 0; i < MATRIX_ROWS; i++) { |
|
|
|
|
matrix[i] = (uint16_t) uart_data[i*2] | (uint16_t) uart_data[i*2+1] << 5; |
|
|
|
|
matrix_row_t current_row = (uint16_t) uart_data[i * 2] | (uint16_t) uart_data[i * 2 + 1] << 5; |
|
|
|
|
if (current_matrix[i] != current_row) { |
|
|
|
|
changed = true; |
|
|
|
|
} |
|
|
|
|
current_matrix[i] = current_row; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
matrix_scan_quantum(); |
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline |
|
|
|
|
bool matrix_is_on(uint8_t row, uint8_t col) |
|
|
|
|
{ |
|
|
|
|
return (matrix[row] & ((matrix_row_t)1<<col)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline |
|
|
|
|
matrix_row_t matrix_get_row(uint8_t row) |
|
|
|
|
{ |
|
|
|
|
return matrix[row]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void matrix_print(void) |
|
|
|
|
{ |
|
|
|
|
print_matrix_header(); |
|
|
|
|
|
|
|
|
|
for (uint8_t row = 0; row < MATRIX_ROWS; row++) { |
|
|
|
|
print_hex8(row); print(": "); |
|
|
|
|
print_matrix_row(row); |
|
|
|
|
print("\n"); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
uint8_t matrix_key_count(void) |
|
|
|
|
{ |
|
|
|
|
uint8_t count = 0; |
|
|
|
|
for (uint8_t i = 0; i < MATRIX_ROWS; i++) { |
|
|
|
|
count += matrix_bitpop(i); |
|
|
|
|
} |
|
|
|
|
return count; |
|
|
|
|
return changed; |
|
|
|
|
} |
|
|
|
|