Skip to content

Commit

Permalink
Merge pull request qmk#16 from mtei/helix-serial-improvement2
Browse files Browse the repository at this point in the history
Helix serial improvement
  • Loading branch information
MakotoKurauchi authored Aug 10, 2018
2 parents 224b27f + 8142a3c commit fea8037
Show file tree
Hide file tree
Showing 19 changed files with 514 additions and 173 deletions.
2 changes: 1 addition & 1 deletion keyboards/helix/rev1/keymaps/OLED_sample/serial_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
#define SERIAL_PIN_INTERRUPT INT2_vect

#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2
#define SERIAL_MASTER_BUFFER_LENGTH 1
#define SERIAL_MASTER_BUFFER_LENGTH 0

//// #error rev1/keymaps/OLED_sample serial config

Expand Down
4 changes: 2 additions & 2 deletions keyboards/helix/rev1/rules.mk
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
SRC += rev1/matrix.c \
rev1/split_util.c
SRC += rev1/matrix.c
SRC += rev1/split_util.c

BACKLIGHT_ENABLE = no
2 changes: 1 addition & 1 deletion keyboards/helix/rev1/serial_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
#define SERIAL_PIN_INTERRUPT INT0_vect

#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2
#define SERIAL_MASTER_BUFFER_LENGTH 1
#define SERIAL_MASTER_BUFFER_LENGTH 0

/// #error rev1 serial config

Expand Down
3 changes: 3 additions & 0 deletions keyboards/helix/rev2/keymaps/default/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef CONFIG_USER_H
#define CONFIG_USER_H

// if you need more program area, try uncomment follow line
//#include "serial_config_simpleapi.h"

// place overrides here

#endif /* CONFIG_USER_H */
3 changes: 3 additions & 0 deletions keyboards/helix/rev2/keymaps/edvorakjp/config.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
#ifndef CONFIG_USER_H
#define CONFIG_USER_H

// if you need more program area, try uncomment follow line
//#include "serial_config_simpleapi.h"

#undef TAPPING_FORCE_HOLD
#undef TAPPING_TERM
#define TAPPING_TERM 120
Expand Down
6 changes: 6 additions & 0 deletions keyboards/helix/rev2/keymaps/five_rows/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef CONFIG_USER_H
#define CONFIG_USER_H

// if you need more program area, try uncomment follow line
//#include "serial_config_simpleapi.h"

#undef TAPPING_TERM
#define TAPPING_TERM 140

// place overrides here

#endif /* CONFIG_USER_H */
3 changes: 3 additions & 0 deletions keyboards/helix/rev2/keymaps/five_rows_jis/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.

// place overrides here

// if you need more program area, try uncomment follow line
//#include "serial_config_simpleapi.h"

#ifdef MOUSEKEY_ENABLE
#undef MOUSEKEY_INTERVAL
#define MOUSEKEY_INTERVAL 0
Expand Down
3 changes: 3 additions & 0 deletions keyboards/helix/rev2/keymaps/froggy/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef CONFIG_USER_H
#define CONFIG_USER_H

// if you need more program area, try uncomment follow line
//#include "serial_config_simpleapi.h"

#undef TAPPING_TERM
#define TAPPING_TERM 200
#define ONESHOT_TAP_TOGGLE 5 /* Tapping this number of times holds the key until tapped this number of times again. */
Expand Down
3 changes: 3 additions & 0 deletions keyboards/helix/rev2/keymaps/led_test/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef CONFIG_USER_H
#define CONFIG_USER_H

// if you need more program area, try uncomment follow line
#include "serial_config_simpleapi.h"

// place overrides here

#endif /* CONFIG_USER_H */
58 changes: 34 additions & 24 deletions keyboards/helix/rev2/matrix.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include <avr/io.h>
#include <avr/wdt.h>
#include <avr/interrupt.h>
Expand All @@ -34,7 +35,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifdef USE_MATRIX_I2C
# include "i2c.h"
#else // USE_SERIAL
# include "serial.h"
# include "split_scomm.h"
#endif

#ifndef DEBOUNCE
Expand Down Expand Up @@ -102,6 +103,8 @@ void matrix_init(void)
init_cols();

TX_RX_LED_INIT;
TXLED0;
RXLED0;

// initialize matrix state: all keys off
for (uint8_t i=0; i < MATRIX_ROWS; i++) {
Expand Down Expand Up @@ -178,17 +181,20 @@ int i2c_transaction(void) {

#else // USE_SERIAL

int serial_transaction(void) {
int serial_transaction(int master_changed) {
int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0;
#ifdef SERIAL_USE_MULTI_TRANSACTION
int ret=serial_update_buffers(master_changed);
#else
int ret=serial_update_buffers();
#endif
if (ret ) {
if(ret==2)RXLED1;
if(ret==2) RXLED1;
return 1;
}
RXLED0;
for (int i = 0; i < ROWS_PER_HAND; ++i) {
matrix[slaveOffset+i] = serial_slave_buffer[i];
}
RXLED0;
memcpy(&matrix[slaveOffset],
(void *)serial_slave_buffer, sizeof(serial_slave_buffer));
return 0;
}
#endif
Expand All @@ -199,19 +205,9 @@ uint8_t matrix_scan(void)
matrix_master_scan();
}else{
matrix_slave_scan();

// if(serial_slave_DATA_CORRUPT()){
// TXLED0;
int offset = (isLeftHand) ? ROWS_PER_HAND : 0;

for (int i = 0; i < ROWS_PER_HAND; ++i) {
matrix[offset+i] = serial_master_buffer[i];
}

// }else{
// TXLED1;
// }

int offset = (isLeftHand) ? ROWS_PER_HAND : 0;
memcpy(&matrix[offset],
(void *)serial_master_buffer, sizeof(serial_master_buffer));
matrix_scan_quantum();
}
return 1;
Expand All @@ -221,6 +217,7 @@ uint8_t matrix_scan(void)
uint8_t matrix_master_scan(void) {

int ret = _matrix_scan();
int mchanged = 1;

#ifndef KEYBOARD_helix_rev1
int offset = (isLeftHand) ? 0 : ROWS_PER_HAND;
Expand All @@ -231,16 +228,19 @@ uint8_t matrix_master_scan(void) {
// i2c_slave_buffer[i] = matrix[offset+i];
// }
#else // USE_SERIAL
for (int i = 0; i < ROWS_PER_HAND; ++i) {
serial_master_buffer[i] = matrix[offset+i];
}
#ifdef SERIAL_USE_MULTI_TRANSACTION
mchanged = memcmp((void *)serial_master_buffer,
&matrix[offset], sizeof(serial_master_buffer));
#endif
memcpy((void *)serial_master_buffer,
&matrix[offset], sizeof(serial_master_buffer));
#endif
#endif

#ifdef USE_MATRIX_I2C
if( i2c_transaction() ) {
#else // USE_SERIAL
if( serial_transaction() ) {
if( serial_transaction(mchanged) ) {
#endif
// turn on the indicator led when halves are disconnected
TXLED1;
Expand Down Expand Up @@ -274,9 +274,19 @@ void matrix_slave_scan(void) {
i2c_slave_buffer[i] = matrix[offset+i];
}
#else // USE_SERIAL
#ifdef SERIAL_USE_MULTI_TRANSACTION
int change = 0;
#endif
for (int i = 0; i < ROWS_PER_HAND; ++i) {
#ifdef SERIAL_USE_MULTI_TRANSACTION
if( serial_slave_buffer[i] != matrix[offset+i] )
change = 1;
#endif
serial_slave_buffer[i] = matrix[offset+i];
}
#ifdef SERIAL_USE_MULTI_TRANSACTION
slave_buffer_change_count += change;
#endif
#endif
}

Expand Down
7 changes: 4 additions & 3 deletions keyboards/helix/rev2/rules.mk
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
SRC += rev2/matrix.c \
rev2/split_util.c \
ws2812.c
SRC += rev2/matrix.c
SRC += rev2/split_util.c
SRC += rev2/split_scomm.c
SRC += ws2812.c
3 changes: 1 addition & 2 deletions keyboards/helix/rev2/serial_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,7 @@
#define SERIAL_PIN_MASK _BV(PD2)
#define SERIAL_PIN_INTERRUPT INT2_vect

#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2
#define SERIAL_MASTER_BUFFER_LENGTH MATRIX_ROWS/2
#define SERIAL_USE_MULTI_TRANSACTION

//// #error rev2 serial config

Expand Down
8 changes: 8 additions & 0 deletions keyboards/helix/rev2/serial_config_simpleapi.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#ifndef SERIAL_CONFIG_SIMPLEAPI_H
#define SERIAL_CONFIG_SIMPLEAPI_H

#undef SERIAL_USE_MULTI_TRANSACTION
#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2
#define SERIAL_MASTER_BUFFER_LENGTH MATRIX_ROWS/2

#endif // SERIAL_CONFIG_SIMPLEAPI_H
73 changes: 73 additions & 0 deletions keyboards/helix/rev2/split_scomm.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
#ifdef USE_SERIAL
#ifdef SERIAL_USE_MULTI_TRANSACTION
/* --- USE flexible API (using multi-type transaction function) --- */

#include <stdbool.h>
#include <stdint.h>
#include <stddef.h>
#include <split_scomm.h>
#include "serial.h"
#ifdef SERIAL_DEBUG_MODE
#include <avr/io.h>
#endif

uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0};
uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0};
uint8_t volatile status_com = 0;
uint8_t volatile status1 = 0;
uint8_t slave_buffer_change_count = 0;
uint8_t s_change_old = 0xff;

SSTD_t transactions[] = {
#define GET_SLAVE_STATUS 0
/* master buffer not changed, only recive slave_buffer_change_count */
{ (uint8_t *)&status_com,
0, NULL,
sizeof(slave_buffer_change_count), &slave_buffer_change_count,
},
#define PUT_MASTER_GET_SLAVE_STATUS 1
/* master buffer changed need send, and recive slave_buffer_change_count */
{ (uint8_t *)&status_com,
sizeof(serial_master_buffer), (uint8_t *)serial_master_buffer,
sizeof(slave_buffer_change_count), &slave_buffer_change_count,
},
#define GET_SLAVE_BUFFER 2
/* recive serial_slave_buffer */
{ (uint8_t *)&status1,
0, NULL,
sizeof(serial_slave_buffer), (uint8_t *)serial_slave_buffer
}
};

void serial_master_init(void)
{
soft_serial_initiator_init(transactions);
}

void serial_slave_init(void)
{
soft_serial_target_init(transactions);
}

// 0 => no error
// 1 => slave did not respond
// 2 => checksum error
int serial_update_buffers(int master_update)
{
int status;
static int need_retry = 0;
if( s_change_old != slave_buffer_change_count ) {
status = soft_serial_transaction(GET_SLAVE_BUFFER);
if( status == TRANSACTION_END )
s_change_old = slave_buffer_change_count;
}
if( !master_update && !need_retry)
status = soft_serial_transaction(GET_SLAVE_STATUS);
else
status = soft_serial_transaction(PUT_MASTER_GET_SLAVE_STATUS);
need_retry = ( status == TRANSACTION_END ) ? 0 : 1;
return status;
}

#endif // SERIAL_USE_MULTI_TRANSACTION
#endif /* USE_SERIAL */
24 changes: 24 additions & 0 deletions keyboards/helix/rev2/split_scomm.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#ifndef SPLIT_COMM_H
#define SPLIT_COMM_H

#ifndef SERIAL_USE_MULTI_TRANSACTION
/* --- USE Simple API (OLD API, compatible with let's split serial.c) --- */
#include "serial.h"

#else
/* --- USE flexible API (using multi-type transaction function) --- */
// Buffers for master - slave communication
#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2
#define SERIAL_MASTER_BUFFER_LENGTH MATRIX_ROWS/2

extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH];
extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH];
extern uint8_t slave_buffer_change_count;

void serial_master_init(void);
void serial_slave_init(void);
int serial_update_buffers(int master_changed);

#endif

#endif /* SPLIT_COMM_H */
2 changes: 1 addition & 1 deletion keyboards/helix/rev2/split_util.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
#ifdef USE_MATRIX_I2C
# include "i2c.h"
#else
# include "serial.h"
# include "split_scomm.h"
#endif

volatile bool isLeftHand = true;
Expand Down
9 changes: 6 additions & 3 deletions keyboards/helix/rules.mk
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
SRC += i2c.c \
serial.c \
ssd1306.c
SRC += i2c.c
SRC += serial.c
SRC += ssd1306.c

# if firmware size over limit, try this option
# CFLAGS += -flto

# MCU name
#MCU = at90usb1287
Expand Down
Loading

0 comments on commit fea8037

Please sign in to comment.