@ -1,5 +1,5 @@
/*
/*
Copyright 2017 Danny Nguyen < danny @ hexwire. com >
Copyright 2017 Danny Nguyen < danny @ keeb. io >
This program is free software : you can redistribute it and / or modify
This program is free software : you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
it under the terms of the GNU General Public License as published by
@ -31,6 +31,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
# include "config.h"
# include "config.h"
# include "timer.h"
# include "timer.h"
# ifdef BACKLIGHT_ENABLE
# include "backlight.h"
extern backlight_config_t backlight_config ;
# endif
# ifdef USE_I2C
# ifdef USE_I2C
# include "i2c.h"
# include "i2c.h"
# else // USE_SERIAL
# else // USE_SERIAL
@ -58,6 +63,8 @@ static matrix_row_t matrix_debouncing[MATRIX_ROWS];
# define ERROR_DISCONNECT_COUNT 5
# define ERROR_DISCONNECT_COUNT 5
# define SERIAL_LED_ADDR 0x00
# define ROWS_PER_HAND (MATRIX_ROWS / 2)
# define ROWS_PER_HAND (MATRIX_ROWS / 2)
static uint8_t error_count = 0 ;
static uint8_t error_count = 0 ;
@ -115,12 +122,23 @@ uint8_t matrix_cols(void)
void matrix_init ( void )
void matrix_init ( void )
{
{
# ifdef DISABLE_JTAG
// JTAG disable for PORT F. write JTD bit twice within four cycles.
MCUCR | = ( 1 < < JTD ) ;
MCUCR | = ( 1 < < JTD ) ;
# endif
debug_enable = true ;
debug_enable = true ;
debug_matrix = true ;
debug_matrix = true ;
debug_mouse = true ;
debug_mouse = true ;
// initialize row and col
// initialize row and col
# if (DIODE_DIRECTION == COL2ROW)
unselect_rows ( ) ;
unselect_rows ( ) ;
init_cols ( ) ;
init_cols ( ) ;
# elif (DIODE_DIRECTION == ROW2COL)
unselect_cols ( ) ;
init_rows ( ) ;
# endif
TX_RX_LED_INIT ;
TX_RX_LED_INIT ;
@ -146,7 +164,6 @@ uint8_t _matrix_scan(void)
if ( matrix_changed ) {
if ( matrix_changed ) {
debouncing = true ;
debouncing = true ;
debouncing_time = timer_read ( ) ;
debouncing_time = timer_read ( ) ;
PORTD ^ = ( 1 < < 2 ) ;
}
}
# else
# else
@ -196,6 +213,15 @@ int i2c_transaction(void) {
err = i2c_master_write ( 0x00 ) ;
err = i2c_master_write ( 0x00 ) ;
if ( err ) goto i2c_error ;
if ( err ) goto i2c_error ;
# ifdef BACKLIGHT_ENABLE
// Write backlight level for slave to read
err = i2c_master_write ( backlight_config . enable ? backlight_config . level : 0 ) ;
# else
// Write zero, so our byte index is the same
err = i2c_master_write ( 0x00 ) ;
# endif
if ( err ) goto i2c_error ;
// Start read
// Start read
err = i2c_master_start ( SLAVE_I2C_ADDRESS + I2C_READ ) ;
err = i2c_master_start ( SLAVE_I2C_ADDRESS + I2C_READ ) ;
if ( err ) goto i2c_error ;
if ( err ) goto i2c_error ;
@ -228,6 +254,11 @@ int serial_transaction(void) {
for ( int i = 0 ; i < ROWS_PER_HAND ; + + i ) {
for ( int i = 0 ; i < ROWS_PER_HAND ; + + i ) {
matrix [ slaveOffset + i ] = serial_slave_buffer [ i ] ;
matrix [ slaveOffset + i ] = serial_slave_buffer [ i ] ;
}
}
# ifdef BACKLIGHT_ENABLE
// Write backlight level for slave to read
serial_master_buffer [ SERIAL_LED_ADDR ] = backlight_config . enable ? backlight_config . level : 0 ;
# endif
return 0 ;
return 0 ;
}
}
# endif
# endif
@ -268,19 +299,30 @@ void matrix_slave_scan(void) {
int offset = ( isLeftHand ) ? 0 : ROWS_PER_HAND ;
int offset = ( isLeftHand ) ? 0 : ROWS_PER_HAND ;
# ifdef USE_I2C
# ifdef USE_I2C
# ifdef BACKLIGHT_ENABLE
// Read backlight level sent from master and update level on slave
backlight_set ( i2c_slave_buffer [ 0 ] ) ;
# endif
for ( int i = 0 ; i < ROWS_PER_HAND ; + + i ) {
for ( int i = 0 ; i < ROWS_PER_HAND ; + + i ) {
i2c_slave_buffer [ i ] = matrix [ offset + i ] ;
i2c_slave_buffer [ i + 1 ] = matrix [ offset + i ] ;
}
}
# else // USE_SERIAL
# else // USE_SERIAL
for ( int i = 0 ; i < ROWS_PER_HAND ; + + i ) {
for ( int i = 0 ; i < ROWS_PER_HAND ; + + i ) {
serial_slave_buffer [ i ] = matrix [ offset + i ] ;
serial_slave_buffer [ i ] = matrix [ offset + i ] ;
}
}
# ifdef BACKLIGHT_ENABLE
// Read backlight level sent from master and update level on slave
backlight_set ( serial_master_buffer [ SERIAL_LED_ADDR ] ) ;
# endif
# endif
# endif
}
}
bool matrix_is_modified ( void )
bool matrix_is_modified ( void )
{
{
# if (DEBOUNCING_DELAY > 0)
if ( debouncing ) return false ;
if ( debouncing ) return false ;
# endif
return true ;
return true ;
}
}