void matrix_print(void) { #if (MATRIX_COLS <= 8) print("r/c 01234567\n"); #elif (MATRIX_COLS <= 16) print("r/c 0123456789ABCDEF\n"); #elif (MATRIX_COLS <= 32) print("r/c 0123456789ABCDEF0123456789ABCDEF\n"); #endif for (uint8_t row = 0; row < MATRIX_ROWS; row++) { #if (MATRIX_COLS <= 8) xprintf("%02X: %08b%s\n", row, bitrev(matrix_get_row(row)), #elif (MATRIX_COLS <= 16) xprintf("%02X: %016b%s\n", row, bitrev16(matrix_get_row(row)), #elif (MATRIX_COLS <= 32) xprintf("%02X: %032b%s\n", row, bitrev32(matrix_get_row(row)), #endif #ifdef MATRIX_HAS_GHOST matrix_has_ghost_in_row(row) ? " <ghost" : "" #else "" #endif ); } }
uint8_t matrix_scan(void) { SERIAL_UART_INIT(); uint32_t timeout = 0; // The 's' character requests the RF slave to send the matrix SERIAL_UART_DATA = 's'; // Trust the external keystates entirely, erase the last data uint8_t uart_data[4] = {0}; // There are 3 bytes corresponding to the data, and a checksum for (uint8_t i = 0; i < 4; i++) { // 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(!SERIAL_UART_RXD_PRESENT){ timeout++; if (timeout > 10000){ xprintf("\r\nTime out in keyboard."); break; } } uart_data[i] = SERIAL_UART_DATA; } // Check for the end packet, it's our checksum. // Will only be a match if the correct bytes were recieved if (uart_data[3] == (uart_data[0] ^ uart_data[1] ^ uart_data[2])) { // This is an arbitrary checksum calculated by XORing all the data. // Transferring the keystates to the QMK matrix variable /* ASSUMING MSB FIRST */ matrix[0] = ((uint16_t) uart_data[0] << 8) | ((uint16_t) uart_data[1]); encoderValue += (int8_t) uart_data[2]; if ((uart_data[0] | uart_data[1] | uart_data[2])!=0){ xprintf("\r\n0x%0X%02X%02X",uart_data[0],uart_data[1], uart_data[2]); } /* OK, TURNS OUT THAT WAS A BAD ASSUMPTION */ for (uint8_t i = 0; i < MATRIX_ROWS; i++) { // I've unpacked these into the mirror image of what QMK expects them to be, so... matrix[i] = bitrev16(matrix[i]); // So I'll reverse it, and this should be fine now. } // A mouse report for scrolling would go here, but I don't plan on doing scrolling with the encoder. So. report_mouse_t currentReport = {}; /* currentReport = pointing_device_get_report(); //mouseReport.x = 127 max -127 min currentReport.x = (int8_t) uart_data[6]; //mouseReport.y = 127 max -127 min currentReport.y = (int8_t) uart_data[7]; //mouseReport.v = 127 max -127 min (scroll vertical) currentReport.v = (int8_t) uart_data[8]; //mouseReport.h = 127 max -127 min (scroll horizontal) currentReport.h = (int8_t) uart_data[9]; */ /* currentReport.x = 0; currentReport.y = 0; currentReport.v = 0; currentReport.h = 0;*/ pointing_device_set_report(currentReport); } else { xprintf("\r\nRequested packet, data 3 was %d",uart_data[3]); } matrix_scan_quantum(); return 1; }