Format code according to conventions (#15193)
This commit is contained in:
parent
b06740c933
commit
2c5d66987d
35 changed files with 578 additions and 518 deletions
|
|
@ -149,7 +149,7 @@ void micro_oled_init(void) {
|
|||
#endif
|
||||
|
||||
send_command(MEMORYMODE);
|
||||
send_command(0x02); // 0x02 = 10b, Page addressing mode
|
||||
send_command(0x02); // 0x02 = 10b, Page addressing mode
|
||||
|
||||
send_command(SETCOMPINS); // 0xDA
|
||||
if (LCDHEIGHT > 32) {
|
||||
|
|
|
|||
|
|
@ -17,7 +17,6 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
#include "adns5050.h"
|
||||
#include "wait.h"
|
||||
#include "debug.h"
|
||||
|
|
@ -61,13 +60,9 @@ void adns_sync(void) {
|
|||
writePinHigh(ADNS_CS_PIN);
|
||||
}
|
||||
|
||||
void adns_cs_select(void) {
|
||||
writePinLow(ADNS_CS_PIN);
|
||||
}
|
||||
void adns_cs_select(void) { writePinLow(ADNS_CS_PIN); }
|
||||
|
||||
void adns_cs_deselect(void) {
|
||||
writePinHigh(ADNS_CS_PIN);
|
||||
}
|
||||
void adns_cs_deselect(void) { writePinHigh(ADNS_CS_PIN); }
|
||||
|
||||
uint8_t adns_serial_read(void) {
|
||||
setPinInput(ADNS_SDIO_PIN);
|
||||
|
|
@ -121,7 +116,7 @@ uint8_t adns_read_reg(uint8_t reg_addr) {
|
|||
// We don't need a minimum tSRAD here. That's because a 4ms wait time is
|
||||
// already included in adns_serial_write(), so we're good.
|
||||
// See page 10 and 15 of the ADNS spec sheet.
|
||||
//wait_us(4);
|
||||
// wait_us(4);
|
||||
|
||||
uint8_t byte = adns_serial_read();
|
||||
|
||||
|
|
@ -138,7 +133,7 @@ uint8_t adns_read_reg(uint8_t reg_addr) {
|
|||
|
||||
void adns_write_reg(uint8_t reg_addr, uint8_t data) {
|
||||
adns_cs_select();
|
||||
adns_serial_write( 0b10000000 | reg_addr );
|
||||
adns_serial_write(0b10000000 | reg_addr);
|
||||
adns_serial_write(data);
|
||||
adns_cs_deselect();
|
||||
}
|
||||
|
|
@ -155,7 +150,7 @@ report_adns_t adns_read_burst(void) {
|
|||
// We don't need a minimum tSRAD here. That's because a 4ms wait time is
|
||||
// already included in adns_serial_write(), so we're good.
|
||||
// See page 10 and 15 of the ADNS spec sheet.
|
||||
//wait_us(4);
|
||||
// wait_us(4);
|
||||
|
||||
uint8_t x = adns_serial_read();
|
||||
uint8_t y = adns_serial_read();
|
||||
|
|
@ -180,13 +175,11 @@ int8_t convert_twoscomp(uint8_t data) {
|
|||
}
|
||||
|
||||
// Don't forget to use the definitions for CPI in the header file.
|
||||
void adns_set_cpi(uint8_t cpi) {
|
||||
adns_write_reg(REG_MOUSE_CONTROL2, cpi);
|
||||
}
|
||||
void adns_set_cpi(uint8_t cpi) { adns_write_reg(REG_MOUSE_CONTROL2, cpi); }
|
||||
|
||||
bool adns_check_signature(void) {
|
||||
uint8_t pid = adns_read_reg(REG_PRODUCT_ID);
|
||||
uint8_t rid = adns_read_reg(REG_REVISION_ID);
|
||||
uint8_t pid = adns_read_reg(REG_PRODUCT_ID);
|
||||
uint8_t rid = adns_read_reg(REG_REVISION_ID);
|
||||
uint8_t pid2 = adns_read_reg(REG_PRODUCT_ID2);
|
||||
|
||||
return (pid == 0x12 && rid == 0x01 && pid2 == 0x26);
|
||||
|
|
|
|||
|
|
@ -67,13 +67,13 @@ typedef struct {
|
|||
// A bunch of functions to implement the ADNS5050-specific serial protocol.
|
||||
// Note that the "serial.h" driver is insufficient, because it does not
|
||||
// manually manipulate a serial clock signal.
|
||||
void adns_init(void);
|
||||
void adns_sync(void);
|
||||
uint8_t adns_serial_read(void);
|
||||
void adns_serial_write(uint8_t data);
|
||||
uint8_t adns_read_reg(uint8_t reg_addr);
|
||||
void adns_write_reg(uint8_t reg_addr, uint8_t data);
|
||||
void adns_init(void);
|
||||
void adns_sync(void);
|
||||
uint8_t adns_serial_read(void);
|
||||
void adns_serial_write(uint8_t data);
|
||||
uint8_t adns_read_reg(uint8_t reg_addr);
|
||||
void adns_write_reg(uint8_t reg_addr, uint8_t data);
|
||||
report_adns_t adns_read_burst(void);
|
||||
int8_t convert_twoscomp(uint8_t data);
|
||||
void adns_set_cpi(uint8_t cpi);
|
||||
bool adns_check_signature(void);
|
||||
int8_t convert_twoscomp(uint8_t data);
|
||||
void adns_set_cpi(uint8_t cpi);
|
||||
bool adns_check_signature(void);
|
||||
|
|
|
|||
|
|
@ -20,57 +20,57 @@
|
|||
#include "adns9800.h"
|
||||
|
||||
// registers
|
||||
#define REG_Product_ID 0x00
|
||||
#define REG_Revision_ID 0x01
|
||||
#define REG_Motion 0x02
|
||||
#define REG_Delta_X_L 0x03
|
||||
#define REG_Delta_X_H 0x04
|
||||
#define REG_Delta_Y_L 0x05
|
||||
#define REG_Delta_Y_H 0x06
|
||||
#define REG_SQUAL 0x07
|
||||
#define REG_Pixel_Sum 0x08
|
||||
#define REG_Maximum_Pixel 0x09
|
||||
#define REG_Minimum_Pixel 0x0a
|
||||
#define REG_Shutter_Lower 0x0b
|
||||
#define REG_Shutter_Upper 0x0c
|
||||
#define REG_Frame_Period_Lower 0x0d
|
||||
#define REG_Frame_Period_Upper 0x0e
|
||||
#define REG_Configuration_I 0x0f
|
||||
#define REG_Configuration_II 0x10
|
||||
#define REG_Frame_Capture 0x12
|
||||
#define REG_SROM_Enable 0x13
|
||||
#define REG_Run_Downshift 0x14
|
||||
#define REG_Rest1_Rate 0x15
|
||||
#define REG_Rest1_Downshift 0x16
|
||||
#define REG_Rest2_Rate 0x17
|
||||
#define REG_Rest2_Downshift 0x18
|
||||
#define REG_Rest3_Rate 0x19
|
||||
#define REG_Frame_Period_Max_Bound_Lower 0x1a
|
||||
#define REG_Frame_Period_Max_Bound_Upper 0x1b
|
||||
#define REG_Frame_Period_Min_Bound_Lower 0x1c
|
||||
#define REG_Frame_Period_Min_Bound_Upper 0x1d
|
||||
#define REG_Shutter_Max_Bound_Lower 0x1e
|
||||
#define REG_Shutter_Max_Bound_Upper 0x1f
|
||||
#define REG_LASER_CTRL0 0x20
|
||||
#define REG_Observation 0x24
|
||||
#define REG_Data_Out_Lower 0x25
|
||||
#define REG_Data_Out_Upper 0x26
|
||||
#define REG_SROM_ID 0x2a
|
||||
#define REG_Lift_Detection_Thr 0x2e
|
||||
#define REG_Configuration_V 0x2f
|
||||
#define REG_Configuration_IV 0x39
|
||||
#define REG_Power_Up_Reset 0x3a
|
||||
#define REG_Shutdown 0x3b
|
||||
#define REG_Inverse_Product_ID 0x3f
|
||||
#define REG_Motion_Burst 0x50
|
||||
#define REG_SROM_Load_Burst 0x62
|
||||
#define REG_Pixel_Burst 0x64
|
||||
#define REG_Product_ID 0x00
|
||||
#define REG_Revision_ID 0x01
|
||||
#define REG_Motion 0x02
|
||||
#define REG_Delta_X_L 0x03
|
||||
#define REG_Delta_X_H 0x04
|
||||
#define REG_Delta_Y_L 0x05
|
||||
#define REG_Delta_Y_H 0x06
|
||||
#define REG_SQUAL 0x07
|
||||
#define REG_Pixel_Sum 0x08
|
||||
#define REG_Maximum_Pixel 0x09
|
||||
#define REG_Minimum_Pixel 0x0a
|
||||
#define REG_Shutter_Lower 0x0b
|
||||
#define REG_Shutter_Upper 0x0c
|
||||
#define REG_Frame_Period_Lower 0x0d
|
||||
#define REG_Frame_Period_Upper 0x0e
|
||||
#define REG_Configuration_I 0x0f
|
||||
#define REG_Configuration_II 0x10
|
||||
#define REG_Frame_Capture 0x12
|
||||
#define REG_SROM_Enable 0x13
|
||||
#define REG_Run_Downshift 0x14
|
||||
#define REG_Rest1_Rate 0x15
|
||||
#define REG_Rest1_Downshift 0x16
|
||||
#define REG_Rest2_Rate 0x17
|
||||
#define REG_Rest2_Downshift 0x18
|
||||
#define REG_Rest3_Rate 0x19
|
||||
#define REG_Frame_Period_Max_Bound_Lower 0x1a
|
||||
#define REG_Frame_Period_Max_Bound_Upper 0x1b
|
||||
#define REG_Frame_Period_Min_Bound_Lower 0x1c
|
||||
#define REG_Frame_Period_Min_Bound_Upper 0x1d
|
||||
#define REG_Shutter_Max_Bound_Lower 0x1e
|
||||
#define REG_Shutter_Max_Bound_Upper 0x1f
|
||||
#define REG_LASER_CTRL0 0x20
|
||||
#define REG_Observation 0x24
|
||||
#define REG_Data_Out_Lower 0x25
|
||||
#define REG_Data_Out_Upper 0x26
|
||||
#define REG_SROM_ID 0x2a
|
||||
#define REG_Lift_Detection_Thr 0x2e
|
||||
#define REG_Configuration_V 0x2f
|
||||
#define REG_Configuration_IV 0x39
|
||||
#define REG_Power_Up_Reset 0x3a
|
||||
#define REG_Shutdown 0x3b
|
||||
#define REG_Inverse_Product_ID 0x3f
|
||||
#define REG_Motion_Burst 0x50
|
||||
#define REG_SROM_Load_Burst 0x62
|
||||
#define REG_Pixel_Burst 0x64
|
||||
|
||||
#define ADNS_CLOCK_SPEED 2000000
|
||||
#define MIN_CPI 200
|
||||
#define MAX_CPI 8200
|
||||
#define CPI_STEP 200
|
||||
#define CLAMP_CPI(value) value < MIN_CPI ? MIN_CPI : value > MAX_CPI ? MAX_CPI : value
|
||||
#define CLAMP_CPI(value) value<MIN_CPI ? MIN_CPI : value> MAX_CPI ? MAX_CPI : value
|
||||
#define SPI_MODE 3
|
||||
#define SPI_DIVISOR (F_CPU / ADNS_CLOCK_SPEED)
|
||||
#define US_BETWEEN_WRITES 120
|
||||
|
|
@ -80,12 +80,9 @@
|
|||
|
||||
extern const uint8_t firmware_data[];
|
||||
|
||||
void adns_spi_start(void){
|
||||
spi_start(SPI_SS_PIN, false, SPI_MODE, SPI_DIVISOR);
|
||||
}
|
||||
|
||||
void adns_write(uint8_t reg_addr, uint8_t data){
|
||||
void adns_spi_start(void) { spi_start(SPI_SS_PIN, false, SPI_MODE, SPI_DIVISOR); }
|
||||
|
||||
void adns_write(uint8_t reg_addr, uint8_t data) {
|
||||
adns_spi_start();
|
||||
spi_write(reg_addr | MSB1);
|
||||
spi_write(data);
|
||||
|
|
@ -93,10 +90,9 @@ void adns_write(uint8_t reg_addr, uint8_t data){
|
|||
wait_us(US_BETWEEN_WRITES);
|
||||
}
|
||||
|
||||
uint8_t adns_read(uint8_t reg_addr){
|
||||
|
||||
uint8_t adns_read(uint8_t reg_addr) {
|
||||
adns_spi_start();
|
||||
spi_write(reg_addr & 0x7f );
|
||||
spi_write(reg_addr & 0x7f);
|
||||
uint8_t data = spi_read();
|
||||
spi_stop();
|
||||
wait_us(US_BETWEEN_READS);
|
||||
|
|
@ -105,7 +101,6 @@ uint8_t adns_read(uint8_t reg_addr){
|
|||
}
|
||||
|
||||
void adns_init() {
|
||||
|
||||
setPinOutput(SPI_SS_PIN);
|
||||
|
||||
spi_init();
|
||||
|
|
@ -144,7 +139,7 @@ void adns_init() {
|
|||
|
||||
// send all bytes of the firmware
|
||||
unsigned char c;
|
||||
for(int i = 0; i < FIRMWARE_LENGTH; i++){
|
||||
for (int i = 0; i < FIRMWARE_LENGTH; i++) {
|
||||
c = (unsigned char)pgm_read_byte(firmware_data + i);
|
||||
spi_write(c);
|
||||
wait_us(15);
|
||||
|
|
@ -161,7 +156,7 @@ void adns_init() {
|
|||
|
||||
config_adns_t adns_get_config(void) {
|
||||
uint8_t config_1 = adns_read(REG_Configuration_I);
|
||||
return (config_adns_t){ (config_1 & 0xFF) * CPI_STEP };
|
||||
return (config_adns_t){(config_1 & 0xFF) * CPI_STEP};
|
||||
}
|
||||
|
||||
void adns_set_config(config_adns_t config) {
|
||||
|
|
@ -169,20 +164,17 @@ void adns_set_config(config_adns_t config) {
|
|||
adns_write(REG_Configuration_I, config_1);
|
||||
}
|
||||
|
||||
static int16_t convertDeltaToInt(uint8_t high, uint8_t low){
|
||||
|
||||
static int16_t convertDeltaToInt(uint8_t high, uint8_t low) {
|
||||
// join bytes into twos compliment
|
||||
uint16_t twos_comp = (high << 8) | low;
|
||||
|
||||
// convert twos comp to int
|
||||
if (twos_comp & 0x8000)
|
||||
return -1 * (~twos_comp + 1);
|
||||
if (twos_comp & 0x8000) return -1 * (~twos_comp + 1);
|
||||
|
||||
return twos_comp;
|
||||
}
|
||||
|
||||
report_adns_t adns_get_report(void) {
|
||||
|
||||
report_adns_t report = {0, 0};
|
||||
|
||||
adns_spi_start();
|
||||
|
|
@ -194,8 +186,7 @@ report_adns_t adns_get_report(void) {
|
|||
|
||||
uint8_t motion = spi_read();
|
||||
|
||||
if(motion & 0x80) {
|
||||
|
||||
if (motion & 0x80) {
|
||||
// clear observation register
|
||||
spi_read();
|
||||
|
||||
|
|
|
|||
|
|
@ -28,8 +28,8 @@ typedef struct {
|
|||
int16_t y;
|
||||
} report_adns_t;
|
||||
|
||||
void adns_init(void);
|
||||
void adns_init(void);
|
||||
config_adns_t adns_get_config(void);
|
||||
void adns_set_config(config_adns_t);
|
||||
void adns_set_config(config_adns_t);
|
||||
/* Reads and clears the current delta values on the ADNS sensor */
|
||||
report_adns_t adns_get_report(void);
|
||||
|
|
|
|||
|
|
@ -23,55 +23,55 @@
|
|||
#include "pmw3360_firmware.h"
|
||||
|
||||
// Registers
|
||||
#define REG_Product_ID 0x00
|
||||
#define REG_Revision_ID 0x01
|
||||
#define REG_Motion 0x02
|
||||
#define REG_Delta_X_L 0x03
|
||||
#define REG_Delta_X_H 0x04
|
||||
#define REG_Delta_Y_L 0x05
|
||||
#define REG_Delta_Y_H 0x06
|
||||
#define REG_SQUAL 0x07
|
||||
#define REG_Raw_Data_Sum 0x08
|
||||
#define REG_Maximum_Raw_data 0x09
|
||||
#define REG_Minimum_Raw_data 0x0A
|
||||
#define REG_Shutter_Lower 0x0B
|
||||
#define REG_Shutter_Upper 0x0C
|
||||
#define REG_Control 0x0D
|
||||
#define REG_Config1 0x0F
|
||||
#define REG_Config2 0x10
|
||||
#define REG_Angle_Tune 0x11
|
||||
#define REG_Frame_Capture 0x12
|
||||
#define REG_SROM_Enable 0x13
|
||||
#define REG_Run_Downshift 0x14
|
||||
#define REG_Rest1_Rate_Lower 0x15
|
||||
#define REG_Rest1_Rate_Upper 0x16
|
||||
#define REG_Rest1_Downshift 0x17
|
||||
#define REG_Rest2_Rate_Lower 0x18
|
||||
#define REG_Rest2_Rate_Upper 0x19
|
||||
#define REG_Rest2_Downshift 0x1A
|
||||
#define REG_Rest3_Rate_Lower 0x1B
|
||||
#define REG_Rest3_Rate_Upper 0x1C
|
||||
#define REG_Observation 0x24
|
||||
#define REG_Data_Out_Lower 0x25
|
||||
#define REG_Data_Out_Upper 0x26
|
||||
#define REG_Raw_Data_Dump 0x29
|
||||
#define REG_SROM_ID 0x2A
|
||||
#define REG_Min_SQ_Run 0x2B
|
||||
#define REG_Raw_Data_Threshold 0x2C
|
||||
#define REG_Config5 0x2F
|
||||
#define REG_Power_Up_Reset 0x3A
|
||||
#define REG_Shutdown 0x3B
|
||||
#define REG_Inverse_Product_ID 0x3F
|
||||
#define REG_LiftCutoff_Tune3 0x41
|
||||
#define REG_Angle_Snap 0x42
|
||||
#define REG_LiftCutoff_Tune1 0x4A
|
||||
#define REG_Motion_Burst 0x50
|
||||
#define REG_LiftCutoff_Tune_Timeout 0x58
|
||||
#define REG_Product_ID 0x00
|
||||
#define REG_Revision_ID 0x01
|
||||
#define REG_Motion 0x02
|
||||
#define REG_Delta_X_L 0x03
|
||||
#define REG_Delta_X_H 0x04
|
||||
#define REG_Delta_Y_L 0x05
|
||||
#define REG_Delta_Y_H 0x06
|
||||
#define REG_SQUAL 0x07
|
||||
#define REG_Raw_Data_Sum 0x08
|
||||
#define REG_Maximum_Raw_data 0x09
|
||||
#define REG_Minimum_Raw_data 0x0A
|
||||
#define REG_Shutter_Lower 0x0B
|
||||
#define REG_Shutter_Upper 0x0C
|
||||
#define REG_Control 0x0D
|
||||
#define REG_Config1 0x0F
|
||||
#define REG_Config2 0x10
|
||||
#define REG_Angle_Tune 0x11
|
||||
#define REG_Frame_Capture 0x12
|
||||
#define REG_SROM_Enable 0x13
|
||||
#define REG_Run_Downshift 0x14
|
||||
#define REG_Rest1_Rate_Lower 0x15
|
||||
#define REG_Rest1_Rate_Upper 0x16
|
||||
#define REG_Rest1_Downshift 0x17
|
||||
#define REG_Rest2_Rate_Lower 0x18
|
||||
#define REG_Rest2_Rate_Upper 0x19
|
||||
#define REG_Rest2_Downshift 0x1A
|
||||
#define REG_Rest3_Rate_Lower 0x1B
|
||||
#define REG_Rest3_Rate_Upper 0x1C
|
||||
#define REG_Observation 0x24
|
||||
#define REG_Data_Out_Lower 0x25
|
||||
#define REG_Data_Out_Upper 0x26
|
||||
#define REG_Raw_Data_Dump 0x29
|
||||
#define REG_SROM_ID 0x2A
|
||||
#define REG_Min_SQ_Run 0x2B
|
||||
#define REG_Raw_Data_Threshold 0x2C
|
||||
#define REG_Config5 0x2F
|
||||
#define REG_Power_Up_Reset 0x3A
|
||||
#define REG_Shutdown 0x3B
|
||||
#define REG_Inverse_Product_ID 0x3F
|
||||
#define REG_LiftCutoff_Tune3 0x41
|
||||
#define REG_Angle_Snap 0x42
|
||||
#define REG_LiftCutoff_Tune1 0x4A
|
||||
#define REG_Motion_Burst 0x50
|
||||
#define REG_LiftCutoff_Tune_Timeout 0x58
|
||||
#define REG_LiftCutoff_Tune_Min_Length 0x5A
|
||||
#define REG_SROM_Load_Burst 0x62
|
||||
#define REG_Lift_Config 0x63
|
||||
#define REG_Raw_Data_Burst 0x64
|
||||
#define REG_LiftCutoff_Tune2 0x65
|
||||
#define REG_SROM_Load_Burst 0x62
|
||||
#define REG_Lift_Config 0x63
|
||||
#define REG_Raw_Data_Burst 0x64
|
||||
#define REG_LiftCutoff_Tune2 0x65
|
||||
|
||||
bool _inBurst = false;
|
||||
|
||||
|
|
|
|||
|
|
@ -66,20 +66,17 @@ typedef struct {
|
|||
int8_t mdy;
|
||||
} report_pmw_t;
|
||||
|
||||
|
||||
|
||||
bool spi_start_adv(void);
|
||||
void spi_stop_adv(void);
|
||||
bool spi_start_adv(void);
|
||||
void spi_stop_adv(void);
|
||||
spi_status_t spi_write_adv(uint8_t reg_addr, uint8_t data);
|
||||
uint8_t spi_read_adv(uint8_t reg_addr);
|
||||
bool pmw_spi_init(void);
|
||||
void pmw_set_cpi(uint16_t cpi);
|
||||
uint16_t pmw_get_cpi(void);
|
||||
void pmw_upload_firmware(void);
|
||||
bool pmw_check_signature(void);
|
||||
uint8_t spi_read_adv(uint8_t reg_addr);
|
||||
bool pmw_spi_init(void);
|
||||
void pmw_set_cpi(uint16_t cpi);
|
||||
uint16_t pmw_get_cpi(void);
|
||||
void pmw_upload_firmware(void);
|
||||
bool pmw_check_signature(void);
|
||||
report_pmw_t pmw_read_burst(void);
|
||||
|
||||
|
||||
#define degToRad(angleInDegrees) ((angleInDegrees)*M_PI / 180.0)
|
||||
#define radToDeg(angleInRadians) ((angleInRadians)*180.0 / M_PI)
|
||||
#define constrain(amt, low, high) ((amt) < (low) ? (low) : ((amt) > (high) ? (high) : (amt)))
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
VIA_ENABLE = yes
|
||||
VIA_ENABLE = yes
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
{
|
||||
{
|
||||
"keyboard_name": "AVA",
|
||||
"url": "https://sneakbox.com",
|
||||
"maintainer": "mujimanic",
|
||||
|
|
|
|||
|
|
@ -123,7 +123,7 @@ static ADCConversionGroup adcConversionGroup = {
|
|||
.smpr = ADC_SAMPLING_RATE,
|
||||
#elif defined(USE_ADCV2)
|
||||
# if !defined(STM32F1XX)
|
||||
.cr2 = ADC_CR2_SWSTART, // F103 seem very unhappy with, F401 seems very unhappy without...
|
||||
.cr2 = ADC_CR2_SWSTART, // F103 seem very unhappy with, F401 seems very unhappy without...
|
||||
# endif
|
||||
.smpr2 = ADC_SMPR2_SMP_AN0(ADC_SAMPLING_RATE) | ADC_SMPR2_SMP_AN1(ADC_SAMPLING_RATE) | ADC_SMPR2_SMP_AN2(ADC_SAMPLING_RATE) | ADC_SMPR2_SMP_AN3(ADC_SAMPLING_RATE) | ADC_SMPR2_SMP_AN4(ADC_SAMPLING_RATE) | ADC_SMPR2_SMP_AN5(ADC_SAMPLING_RATE) | ADC_SMPR2_SMP_AN6(ADC_SAMPLING_RATE) | ADC_SMPR2_SMP_AN7(ADC_SAMPLING_RATE) | ADC_SMPR2_SMP_AN8(ADC_SAMPLING_RATE) | ADC_SMPR2_SMP_AN9(ADC_SAMPLING_RATE),
|
||||
.smpr1 = ADC_SMPR1_SMP_AN10(ADC_SAMPLING_RATE) | ADC_SMPR1_SMP_AN11(ADC_SAMPLING_RATE) | ADC_SMPR1_SMP_AN12(ADC_SAMPLING_RATE) | ADC_SMPR1_SMP_AN13(ADC_SAMPLING_RATE) | ADC_SMPR1_SMP_AN14(ADC_SAMPLING_RATE) | ADC_SMPR1_SMP_AN15(ADC_SAMPLING_RATE),
|
||||
|
|
|
|||
|
|
@ -782,9 +782,10 @@ void register_code(uint8_t code) {
|
|||
}
|
||||
#endif
|
||||
|
||||
else if IS_KEY (code) {
|
||||
// TODO: should push command_proc out of this block?
|
||||
if (command_proc(code)) return;
|
||||
else if
|
||||
IS_KEY(code) {
|
||||
// TODO: should push command_proc out of this block?
|
||||
if (command_proc(code)) return;
|
||||
|
||||
#ifndef NO_ACTION_ONESHOT
|
||||
/* TODO: remove
|
||||
|
|
@ -801,33 +802,35 @@ void register_code(uint8_t code) {
|
|||
} else
|
||||
*/
|
||||
#endif
|
||||
{
|
||||
// Force a new key press if the key is already pressed
|
||||
// without this, keys with the same keycode, but different
|
||||
// modifiers will be reported incorrectly, see issue #1708
|
||||
if (is_key_pressed(keyboard_report, code)) {
|
||||
del_key(code);
|
||||
{
|
||||
// Force a new key press if the key is already pressed
|
||||
// without this, keys with the same keycode, but different
|
||||
// modifiers will be reported incorrectly, see issue #1708
|
||||
if (is_key_pressed(keyboard_report, code)) {
|
||||
del_key(code);
|
||||
send_keyboard_report();
|
||||
}
|
||||
add_key(code);
|
||||
send_keyboard_report();
|
||||
}
|
||||
add_key(code);
|
||||
}
|
||||
else if
|
||||
IS_MOD(code) {
|
||||
add_mods(MOD_BIT(code));
|
||||
send_keyboard_report();
|
||||
}
|
||||
} else if IS_MOD (code) {
|
||||
add_mods(MOD_BIT(code));
|
||||
send_keyboard_report();
|
||||
}
|
||||
#ifdef EXTRAKEY_ENABLE
|
||||
else if IS_SYSTEM (code) {
|
||||
host_system_send(KEYCODE2SYSTEM(code));
|
||||
} else if IS_CONSUMER (code) {
|
||||
host_consumer_send(KEYCODE2CONSUMER(code));
|
||||
}
|
||||
else if
|
||||
IS_SYSTEM(code) { host_system_send(KEYCODE2SYSTEM(code)); }
|
||||
else if
|
||||
IS_CONSUMER(code) { host_consumer_send(KEYCODE2CONSUMER(code)); }
|
||||
#endif
|
||||
#ifdef MOUSEKEY_ENABLE
|
||||
else if IS_MOUSEKEY (code) {
|
||||
mousekey_on(code);
|
||||
mousekey_send();
|
||||
}
|
||||
else if
|
||||
IS_MOUSEKEY(code) {
|
||||
mousekey_on(code);
|
||||
mousekey_send();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
@ -872,22 +875,26 @@ void unregister_code(uint8_t code) {
|
|||
}
|
||||
#endif
|
||||
|
||||
else if IS_KEY (code) {
|
||||
del_key(code);
|
||||
send_keyboard_report();
|
||||
} else if IS_MOD (code) {
|
||||
del_mods(MOD_BIT(code));
|
||||
send_keyboard_report();
|
||||
} else if IS_SYSTEM (code) {
|
||||
host_system_send(0);
|
||||
} else if IS_CONSUMER (code) {
|
||||
host_consumer_send(0);
|
||||
}
|
||||
else if
|
||||
IS_KEY(code) {
|
||||
del_key(code);
|
||||
send_keyboard_report();
|
||||
}
|
||||
else if
|
||||
IS_MOD(code) {
|
||||
del_mods(MOD_BIT(code));
|
||||
send_keyboard_report();
|
||||
}
|
||||
else if
|
||||
IS_SYSTEM(code) { host_system_send(0); }
|
||||
else if
|
||||
IS_CONSUMER(code) { host_consumer_send(0); }
|
||||
#ifdef MOUSEKEY_ENABLE
|
||||
else if IS_MOUSEKEY (code) {
|
||||
mousekey_off(code);
|
||||
mousekey_send();
|
||||
}
|
||||
else if
|
||||
IS_MOUSEKEY(code) {
|
||||
mousekey_off(code);
|
||||
mousekey_send();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -88,7 +88,7 @@ extern bool disable_action_cache;
|
|||
|
||||
/* Code for handling one-handed key modifiers. */
|
||||
#ifdef SWAP_HANDS_ENABLE
|
||||
extern bool swap_hands;
|
||||
extern bool swap_hands;
|
||||
extern const keypos_t PROGMEM hand_swap_config[MATRIX_ROWS][MATRIX_COLS];
|
||||
# if (MATRIX_COLS <= 8)
|
||||
typedef uint8_t swap_state_row_t;
|
||||
|
|
|
|||
|
|
@ -18,11 +18,11 @@
|
|||
# define IS_TAPPING_PRESSED() (IS_TAPPING() && tapping_key.event.pressed)
|
||||
# define IS_TAPPING_RELEASED() (IS_TAPPING() && !tapping_key.event.pressed)
|
||||
# define IS_TAPPING_KEY(k) (IS_TAPPING() && KEYEQ(tapping_key.event.key, (k)))
|
||||
#ifndef COMBO_ENABLE
|
||||
# define IS_TAPPING_RECORD(r) (IS_TAPPING() && KEYEQ(tapping_key.event.key, (r->event.key)))
|
||||
#else
|
||||
# define IS_TAPPING_RECORD(r) (IS_TAPPING() && KEYEQ(tapping_key.event.key, (r->event.key)) && tapping_key.keycode == r->keycode)
|
||||
#endif
|
||||
# ifndef COMBO_ENABLE
|
||||
# define IS_TAPPING_RECORD(r) (IS_TAPPING() && KEYEQ(tapping_key.event.key, (r->event.key)))
|
||||
# else
|
||||
# define IS_TAPPING_RECORD(r) (IS_TAPPING() && KEYEQ(tapping_key.event.key, (r->event.key)) && tapping_key.keycode == r->keycode)
|
||||
# endif
|
||||
|
||||
__attribute__((weak)) uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) { return TAPPING_TERM; }
|
||||
|
||||
|
|
@ -212,11 +212,15 @@ bool process_tapping(keyrecord_t *keyp) {
|
|||
if (tapping_key.tap.count > 1) {
|
||||
debug("Tapping: Start new tap with releasing last tap(>1).\n");
|
||||
// unregister key
|
||||
process_record(&(keyrecord_t){.tap = tapping_key.tap, .event.key = tapping_key.event.key, .event.time = event.time, .event.pressed = false,
|
||||
#ifdef COMBO_ENABLE
|
||||
.keycode = tapping_key.keycode,
|
||||
#endif
|
||||
});
|
||||
process_record(&(keyrecord_t){
|
||||
.tap = tapping_key.tap,
|
||||
.event.key = tapping_key.event.key,
|
||||
.event.time = event.time,
|
||||
.event.pressed = false,
|
||||
# ifdef COMBO_ENABLE
|
||||
.keycode = tapping_key.keycode,
|
||||
# endif
|
||||
});
|
||||
} else {
|
||||
debug("Tapping: Start while last tap(1).\n");
|
||||
}
|
||||
|
|
@ -254,11 +258,15 @@ bool process_tapping(keyrecord_t *keyp) {
|
|||
if (tapping_key.tap.count > 1) {
|
||||
debug("Tapping: Start new tap with releasing last timeout tap(>1).\n");
|
||||
// unregister key
|
||||
process_record(&(keyrecord_t){.tap = tapping_key.tap, .event.key = tapping_key.event.key, .event.time = event.time, .event.pressed = false,
|
||||
#ifdef COMBO_ENABLE
|
||||
.keycode = tapping_key.keycode,
|
||||
#endif
|
||||
});
|
||||
process_record(&(keyrecord_t){
|
||||
.tap = tapping_key.tap,
|
||||
.event.key = tapping_key.event.key,
|
||||
.event.time = event.time,
|
||||
.event.pressed = false,
|
||||
# ifdef COMBO_ENABLE
|
||||
.keycode = tapping_key.keycode,
|
||||
# endif
|
||||
});
|
||||
} else {
|
||||
debug("Tapping: Start while last timeout tap(1).\n");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -46,17 +46,17 @@ When no state changes have occured for DEBOUNCE milliseconds, we push the state.
|
|||
#define ROW_SHIFTER ((matrix_row_t)1)
|
||||
|
||||
typedef struct {
|
||||
bool pressed : 1;
|
||||
bool pressed : 1;
|
||||
uint8_t time : 7;
|
||||
} debounce_counter_t;
|
||||
|
||||
#if DEBOUNCE > 0
|
||||
static debounce_counter_t *debounce_counters;
|
||||
static fast_timer_t last_time;
|
||||
static bool counters_need_update;
|
||||
static bool matrix_need_update;
|
||||
static fast_timer_t last_time;
|
||||
static bool counters_need_update;
|
||||
static bool matrix_need_update;
|
||||
|
||||
#define DEBOUNCE_ELAPSED 0
|
||||
# define DEBOUNCE_ELAPSED 0
|
||||
|
||||
static void update_debounce_counters_and_transfer_if_expired(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, uint8_t elapsed_time);
|
||||
static void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows);
|
||||
|
|
@ -64,7 +64,7 @@ static void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], ui
|
|||
// we use num_rows rather than MATRIX_ROWS to support split keyboards
|
||||
void debounce_init(uint8_t num_rows) {
|
||||
debounce_counters = malloc(num_rows * MATRIX_COLS * sizeof(debounce_counter_t));
|
||||
int i = 0;
|
||||
int i = 0;
|
||||
for (uint8_t r = 0; r < num_rows; r++) {
|
||||
for (uint8_t c = 0; c < MATRIX_COLS; c++) {
|
||||
debounce_counters[i++].time = DEBOUNCE_ELAPSED;
|
||||
|
|
@ -81,10 +81,10 @@ void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool
|
|||
bool updated_last = false;
|
||||
|
||||
if (counters_need_update) {
|
||||
fast_timer_t now = timer_read_fast();
|
||||
fast_timer_t now = timer_read_fast();
|
||||
fast_timer_t elapsed_time = TIMER_DIFF_FAST(now, last_time);
|
||||
|
||||
last_time = now;
|
||||
last_time = now;
|
||||
updated_last = true;
|
||||
if (elapsed_time > UINT8_MAX) {
|
||||
elapsed_time = UINT8_MAX;
|
||||
|
|
@ -108,7 +108,7 @@ static void update_debounce_counters_and_transfer_if_expired(matrix_row_t raw[],
|
|||
debounce_counter_t *debounce_pointer = debounce_counters;
|
||||
|
||||
counters_need_update = false;
|
||||
matrix_need_update = false;
|
||||
matrix_need_update = false;
|
||||
|
||||
for (uint8_t row = 0; row < num_rows; row++) {
|
||||
for (uint8_t col = 0; col < MATRIX_COLS; col++) {
|
||||
|
|
@ -146,8 +146,8 @@ static void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], ui
|
|||
if (delta & col_mask) {
|
||||
if (debounce_pointer->time == DEBOUNCE_ELAPSED) {
|
||||
debounce_pointer->pressed = (raw[row] & col_mask);
|
||||
debounce_pointer->time = DEBOUNCE;
|
||||
counters_need_update = true;
|
||||
debounce_pointer->time = DEBOUNCE;
|
||||
counters_need_update = true;
|
||||
|
||||
if (debounce_pointer->pressed) {
|
||||
// key-down: eager
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ When no state changes have occured for DEBOUNCE milliseconds, we push the state.
|
|||
#endif
|
||||
|
||||
#if DEBOUNCE > 0
|
||||
static bool debouncing = false;
|
||||
static bool debouncing = false;
|
||||
static fast_timer_t debouncing_time;
|
||||
|
||||
void debounce_init(uint8_t num_rows) {}
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ static debounce_counter_t *debounce_counters;
|
|||
static fast_timer_t last_time;
|
||||
static bool counters_need_update;
|
||||
|
||||
#define DEBOUNCE_ELAPSED 0
|
||||
# define DEBOUNCE_ELAPSED 0
|
||||
|
||||
static void update_debounce_counters_and_transfer_if_expired(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, uint8_t elapsed_time);
|
||||
static void start_debounce_counters(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows);
|
||||
|
|
@ -74,10 +74,10 @@ void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool
|
|||
bool updated_last = false;
|
||||
|
||||
if (counters_need_update) {
|
||||
fast_timer_t now = timer_read_fast();
|
||||
fast_timer_t now = timer_read_fast();
|
||||
fast_timer_t elapsed_time = TIMER_DIFF_FAST(now, last_time);
|
||||
|
||||
last_time = now;
|
||||
last_time = now;
|
||||
updated_last = true;
|
||||
if (elapsed_time > UINT8_MAX) {
|
||||
elapsed_time = UINT8_MAX;
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@ static fast_timer_t last_time;
|
|||
static bool counters_need_update;
|
||||
static bool matrix_need_update;
|
||||
|
||||
#define DEBOUNCE_ELAPSED 0
|
||||
# define DEBOUNCE_ELAPSED 0
|
||||
|
||||
static void update_debounce_counters(uint8_t num_rows, uint8_t elapsed_time);
|
||||
static void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows);
|
||||
|
|
@ -75,10 +75,10 @@ void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool
|
|||
bool updated_last = false;
|
||||
|
||||
if (counters_need_update) {
|
||||
fast_timer_t now = timer_read_fast();
|
||||
fast_timer_t now = timer_read_fast();
|
||||
fast_timer_t elapsed_time = TIMER_DIFF_FAST(now, last_time);
|
||||
|
||||
last_time = now;
|
||||
last_time = now;
|
||||
updated_last = true;
|
||||
if (elapsed_time > UINT8_MAX) {
|
||||
elapsed_time = UINT8_MAX;
|
||||
|
|
@ -107,7 +107,7 @@ static void update_debounce_counters(uint8_t num_rows, uint8_t elapsed_time) {
|
|||
for (uint8_t col = 0; col < MATRIX_COLS; col++) {
|
||||
if (*debounce_pointer != DEBOUNCE_ELAPSED) {
|
||||
if (*debounce_pointer <= elapsed_time) {
|
||||
*debounce_pointer = DEBOUNCE_ELAPSED;
|
||||
*debounce_pointer = DEBOUNCE_ELAPSED;
|
||||
matrix_need_update = true;
|
||||
} else {
|
||||
*debounce_pointer -= elapsed_time;
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ static debounce_counter_t *debounce_counters;
|
|||
static fast_timer_t last_time;
|
||||
static bool counters_need_update;
|
||||
|
||||
#define DEBOUNCE_ELAPSED 0
|
||||
# define DEBOUNCE_ELAPSED 0
|
||||
|
||||
static void update_debounce_counters(uint8_t num_rows, uint8_t elapsed_time);
|
||||
static void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows);
|
||||
|
|
@ -71,10 +71,10 @@ void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool
|
|||
bool updated_last = false;
|
||||
|
||||
if (counters_need_update) {
|
||||
fast_timer_t now = timer_read_fast();
|
||||
fast_timer_t now = timer_read_fast();
|
||||
fast_timer_t elapsed_time = TIMER_DIFF_FAST(now, last_time);
|
||||
|
||||
last_time = now;
|
||||
last_time = now;
|
||||
updated_last = true;
|
||||
if (elapsed_time > UINT8_MAX) {
|
||||
elapsed_time = UINT8_MAX;
|
||||
|
|
@ -102,7 +102,7 @@ static void update_debounce_counters(uint8_t num_rows, uint8_t elapsed_time) {
|
|||
for (uint8_t row = 0; row < num_rows; row++) {
|
||||
if (*debounce_pointer != DEBOUNCE_ELAPSED) {
|
||||
if (*debounce_pointer <= elapsed_time) {
|
||||
*debounce_pointer = DEBOUNCE_ELAPSED;
|
||||
*debounce_pointer = DEBOUNCE_ELAPSED;
|
||||
matrix_need_update = true;
|
||||
} else {
|
||||
*debounce_pointer -= elapsed_time;
|
||||
|
|
|
|||
|
|
@ -19,7 +19,8 @@
|
|||
#include "debounce_test_common.h"
|
||||
|
||||
TEST_F(DebounceTest, OneKeyShort1) {
|
||||
addEvents({ /* Time, Inputs, Outputs */
|
||||
addEvents({
|
||||
/* Time, Inputs, Outputs */
|
||||
{0, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
|
||||
/* Release key after 1ms delay */
|
||||
{1, {{0, 1, UP}}, {}},
|
||||
|
|
@ -43,7 +44,8 @@ TEST_F(DebounceTest, OneKeyShort1) {
|
|||
}
|
||||
|
||||
TEST_F(DebounceTest, OneKeyShort2) {
|
||||
addEvents({ /* Time, Inputs, Outputs */
|
||||
addEvents({
|
||||
/* Time, Inputs, Outputs */
|
||||
{0, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
|
||||
/* Release key after 2ms delay */
|
||||
{2, {{0, 1, UP}}, {}},
|
||||
|
|
@ -58,7 +60,8 @@ TEST_F(DebounceTest, OneKeyShort2) {
|
|||
}
|
||||
|
||||
TEST_F(DebounceTest, OneKeyShort3) {
|
||||
addEvents({ /* Time, Inputs, Outputs */
|
||||
addEvents({
|
||||
/* Time, Inputs, Outputs */
|
||||
{0, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
|
||||
/* Release key after 3ms delay */
|
||||
{3, {{0, 1, UP}}, {}},
|
||||
|
|
@ -73,7 +76,8 @@ TEST_F(DebounceTest, OneKeyShort3) {
|
|||
}
|
||||
|
||||
TEST_F(DebounceTest, OneKeyShort4) {
|
||||
addEvents({ /* Time, Inputs, Outputs */
|
||||
addEvents({
|
||||
/* Time, Inputs, Outputs */
|
||||
{0, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
|
||||
/* Release key after 4ms delay */
|
||||
{4, {{0, 1, UP}}, {}},
|
||||
|
|
@ -88,7 +92,8 @@ TEST_F(DebounceTest, OneKeyShort4) {
|
|||
}
|
||||
|
||||
TEST_F(DebounceTest, OneKeyShort5) {
|
||||
addEvents({ /* Time, Inputs, Outputs */
|
||||
addEvents({
|
||||
/* Time, Inputs, Outputs */
|
||||
{0, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
|
||||
|
||||
/* Release key after 5ms delay */
|
||||
|
|
@ -102,7 +107,8 @@ TEST_F(DebounceTest, OneKeyShort5) {
|
|||
}
|
||||
|
||||
TEST_F(DebounceTest, OneKeyShort6) {
|
||||
addEvents({ /* Time, Inputs, Outputs */
|
||||
addEvents({
|
||||
/* Time, Inputs, Outputs */
|
||||
{0, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
|
||||
|
||||
/* Release key after 6ms delay */
|
||||
|
|
@ -116,7 +122,8 @@ TEST_F(DebounceTest, OneKeyShort6) {
|
|||
}
|
||||
|
||||
TEST_F(DebounceTest, OneKeyShort7) {
|
||||
addEvents({ /* Time, Inputs, Outputs */
|
||||
addEvents({
|
||||
/* Time, Inputs, Outputs */
|
||||
{0, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
|
||||
|
||||
/* Release key after 7ms delay */
|
||||
|
|
@ -130,7 +137,8 @@ TEST_F(DebounceTest, OneKeyShort7) {
|
|||
}
|
||||
|
||||
TEST_F(DebounceTest, OneKeyShort8) {
|
||||
addEvents({ /* Time, Inputs, Outputs */
|
||||
addEvents({
|
||||
/* Time, Inputs, Outputs */
|
||||
{0, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
|
||||
/* Release key after 1ms delay */
|
||||
{1, {{0, 1, UP}}, {}},
|
||||
|
|
@ -145,7 +153,8 @@ TEST_F(DebounceTest, OneKeyShort8) {
|
|||
}
|
||||
|
||||
TEST_F(DebounceTest, OneKeyShort9) {
|
||||
addEvents({ /* Time, Inputs, Outputs */
|
||||
addEvents({
|
||||
/* Time, Inputs, Outputs */
|
||||
{0, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
|
||||
/* Release key after 1ms delay */
|
||||
{1, {{0, 1, UP}}, {}},
|
||||
|
|
@ -159,7 +168,8 @@ TEST_F(DebounceTest, OneKeyShort9) {
|
|||
}
|
||||
|
||||
TEST_F(DebounceTest, OneKeyBouncing1) {
|
||||
addEvents({ /* Time, Inputs, Outputs */
|
||||
addEvents({
|
||||
/* Time, Inputs, Outputs */
|
||||
{0, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
|
||||
{1, {{0, 1, UP}}, {}},
|
||||
{2, {{0, 1, DOWN}}, {}},
|
||||
|
|
@ -185,7 +195,8 @@ TEST_F(DebounceTest, OneKeyBouncing1) {
|
|||
}
|
||||
|
||||
TEST_F(DebounceTest, OneKeyBouncing2) {
|
||||
addEvents({ /* Time, Inputs, Outputs */
|
||||
addEvents({
|
||||
/* Time, Inputs, Outputs */
|
||||
{0, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
|
||||
/* Change twice in the same time period */
|
||||
{1, {{0, 1, UP}}, {}},
|
||||
|
|
@ -217,7 +228,8 @@ TEST_F(DebounceTest, OneKeyBouncing2) {
|
|||
}
|
||||
|
||||
TEST_F(DebounceTest, OneKeyLong) {
|
||||
addEvents({ /* Time, Inputs, Outputs */
|
||||
addEvents({
|
||||
/* Time, Inputs, Outputs */
|
||||
{0, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
|
||||
|
||||
{25, {{0, 1, UP}}, {}},
|
||||
|
|
@ -236,7 +248,8 @@ TEST_F(DebounceTest, OneKeyLong) {
|
|||
}
|
||||
|
||||
TEST_F(DebounceTest, TwoKeysShort) {
|
||||
addEvents({ /* Time, Inputs, Outputs */
|
||||
addEvents({
|
||||
/* Time, Inputs, Outputs */
|
||||
{0, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
|
||||
{1, {{0, 2, DOWN}}, {{0, 2, DOWN}}},
|
||||
/* Release key after 2ms delay */
|
||||
|
|
@ -249,14 +262,14 @@ TEST_F(DebounceTest, TwoKeysShort) {
|
|||
{10, {}, {{0, 1, UP}}}, /* 5ms+5ms after DOWN at time 0 */
|
||||
/* Press key again after 1ms delay */
|
||||
{11, {{0, 1, DOWN}}, {{0, 1, DOWN}, {0, 2, UP}}}, /* 5ms+5ms after DOWN at time 0 */
|
||||
{12, {{0, 2, DOWN}}, {{0, 2, DOWN}}}, /* 5ms+5ms after DOWN at time 0 */
|
||||
{12, {{0, 2, DOWN}}, {{0, 2, DOWN}}}, /* 5ms+5ms after DOWN at time 0 */
|
||||
});
|
||||
runEvents();
|
||||
}
|
||||
|
||||
|
||||
TEST_F(DebounceTest, OneKeyDelayedScan1) {
|
||||
addEvents({ /* Time, Inputs, Outputs */
|
||||
addEvents({
|
||||
/* Time, Inputs, Outputs */
|
||||
{0, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
|
||||
|
||||
/* Processing is very late, immediately release key */
|
||||
|
|
@ -269,7 +282,8 @@ TEST_F(DebounceTest, OneKeyDelayedScan1) {
|
|||
}
|
||||
|
||||
TEST_F(DebounceTest, OneKeyDelayedScan2) {
|
||||
addEvents({ /* Time, Inputs, Outputs */
|
||||
addEvents({
|
||||
/* Time, Inputs, Outputs */
|
||||
{0, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
|
||||
|
||||
/* Processing is very late, immediately release key */
|
||||
|
|
@ -283,7 +297,8 @@ TEST_F(DebounceTest, OneKeyDelayedScan2) {
|
|||
}
|
||||
|
||||
TEST_F(DebounceTest, OneKeyDelayedScan3) {
|
||||
addEvents({ /* Time, Inputs, Outputs */
|
||||
addEvents({
|
||||
/* Time, Inputs, Outputs */
|
||||
{0, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
|
||||
|
||||
/* Processing is very late */
|
||||
|
|
@ -298,7 +313,8 @@ TEST_F(DebounceTest, OneKeyDelayedScan3) {
|
|||
}
|
||||
|
||||
TEST_F(DebounceTest, OneKeyDelayedScan4) {
|
||||
addEvents({ /* Time, Inputs, Outputs */
|
||||
addEvents({
|
||||
/* Time, Inputs, Outputs */
|
||||
{0, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
|
||||
|
||||
/* Processing is very late */
|
||||
|
|
@ -314,7 +330,8 @@ TEST_F(DebounceTest, OneKeyDelayedScan4) {
|
|||
}
|
||||
|
||||
TEST_F(DebounceTest, OneKeyDelayedScan5) {
|
||||
addEvents({ /* Time, Inputs, Outputs */
|
||||
addEvents({
|
||||
/* Time, Inputs, Outputs */
|
||||
{0, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
|
||||
|
||||
{5, {{0, 1, UP}}, {}},
|
||||
|
|
@ -329,7 +346,8 @@ TEST_F(DebounceTest, OneKeyDelayedScan5) {
|
|||
}
|
||||
|
||||
TEST_F(DebounceTest, OneKeyDelayedScan6) {
|
||||
addEvents({ /* Time, Inputs, Outputs */
|
||||
addEvents({
|
||||
/* Time, Inputs, Outputs */
|
||||
{0, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
|
||||
|
||||
{5, {{0, 1, UP}}, {}},
|
||||
|
|
@ -345,7 +363,8 @@ TEST_F(DebounceTest, OneKeyDelayedScan6) {
|
|||
}
|
||||
|
||||
TEST_F(DebounceTest, OneKeyDelayedScan7) {
|
||||
addEvents({ /* Time, Inputs, Outputs */
|
||||
addEvents({
|
||||
/* Time, Inputs, Outputs */
|
||||
{0, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
|
||||
|
||||
{5, {{0, 1, UP}}, {}},
|
||||
|
|
@ -358,7 +377,8 @@ TEST_F(DebounceTest, OneKeyDelayedScan7) {
|
|||
}
|
||||
|
||||
TEST_F(DebounceTest, OneKeyDelayedScan8) {
|
||||
addEvents({ /* Time, Inputs, Outputs */
|
||||
addEvents({
|
||||
/* Time, Inputs, Outputs */
|
||||
{0, {{0, 1, DOWN}}, {{0, 1, DOWN}}},
|
||||
|
||||
/* Processing is a bit late */
|
||||
|
|
|
|||
|
|
@ -31,9 +31,7 @@ void set_time(uint32_t t);
|
|||
void advance_time(uint32_t ms);
|
||||
}
|
||||
|
||||
void DebounceTest::addEvents(std::initializer_list<DebounceTestEvent> events) {
|
||||
events_.insert(events_.end(), events.begin(), events.end());
|
||||
}
|
||||
void DebounceTest::addEvents(std::initializer_list<DebounceTestEvent> events) { events_.insert(events_.end(), events.begin(), events.end()); }
|
||||
|
||||
void DebounceTest::runEvents() {
|
||||
/* Run the test multiple times, from 1kHz to 10kHz scan rate */
|
||||
|
|
@ -54,7 +52,7 @@ void DebounceTest::runEvents() {
|
|||
|
||||
void DebounceTest::runEventsInternal() {
|
||||
fast_timer_t previous = 0;
|
||||
bool first = true;
|
||||
bool first = true;
|
||||
|
||||
/* Initialise keyboard with start time (offset to avoid testing at 0) and all keys UP */
|
||||
debounce_init(MATRIX_ROWS);
|
||||
|
|
@ -80,7 +78,7 @@ void DebounceTest::runEventsInternal() {
|
|||
}
|
||||
}
|
||||
|
||||
first = false;
|
||||
first = false;
|
||||
previous = event.time_;
|
||||
|
||||
/* Prepare input matrix */
|
||||
|
|
@ -98,12 +96,7 @@ void DebounceTest::runEventsInternal() {
|
|||
|
||||
/* Check output matrix has expected change events */
|
||||
for (auto &output : event.outputs_) {
|
||||
EXPECT_EQ(!!(cooked_matrix_[output.row_] & (1U << output.col_)), directionValue(output.direction_))
|
||||
<< "Missing event at " << strTime()
|
||||
<< " expected key " << output.row_ << "," << output.col_ << " " << directionLabel(output.direction_)
|
||||
<< "\ninput_matrix: changed=" << !event.inputs_.empty() << "\n" << strMatrix(input_matrix_)
|
||||
<< "\nexpected_matrix:\n" << strMatrix(output_matrix_)
|
||||
<< "\nactual_matrix:\n" << strMatrix(cooked_matrix_);
|
||||
EXPECT_EQ(!!(cooked_matrix_[output.row_] & (1U << output.col_)), directionValue(output.direction_)) << "Missing event at " << strTime() << " expected key " << output.row_ << "," << output.col_ << " " << directionLabel(output.direction_) << "\ninput_matrix: changed=" << !event.inputs_.empty() << "\n" << strMatrix(input_matrix_) << "\nexpected_matrix:\n" << strMatrix(output_matrix_) << "\nactual_matrix:\n" << strMatrix(cooked_matrix_);
|
||||
}
|
||||
|
||||
/* Check output matrix has no other changes */
|
||||
|
|
@ -133,27 +126,20 @@ void DebounceTest::runDebounce(bool changed) {
|
|||
debounce(raw_matrix_, cooked_matrix_, MATRIX_ROWS, changed);
|
||||
|
||||
if (!std::equal(std::begin(input_matrix_), std::end(input_matrix_), std::begin(raw_matrix_))) {
|
||||
FAIL() << "Fatal error: debounce() modified raw matrix at " << strTime()
|
||||
<< "\ninput_matrix: changed=" << changed << "\n" << strMatrix(input_matrix_)
|
||||
<< "\nraw_matrix:\n" << strMatrix(raw_matrix_);
|
||||
FAIL() << "Fatal error: debounce() modified raw matrix at " << strTime() << "\ninput_matrix: changed=" << changed << "\n" << strMatrix(input_matrix_) << "\nraw_matrix:\n" << strMatrix(raw_matrix_);
|
||||
}
|
||||
}
|
||||
|
||||
void DebounceTest::checkCookedMatrix(bool changed, const std::string &error_message) {
|
||||
if (!std::equal(std::begin(output_matrix_), std::end(output_matrix_), std::begin(cooked_matrix_))) {
|
||||
FAIL() << "Unexpected event: " << error_message << " at " << strTime()
|
||||
<< "\ninput_matrix: changed=" << changed << "\n" << strMatrix(input_matrix_)
|
||||
<< "\nexpected_matrix:\n" << strMatrix(output_matrix_)
|
||||
<< "\nactual_matrix:\n" << strMatrix(cooked_matrix_);
|
||||
FAIL() << "Unexpected event: " << error_message << " at " << strTime() << "\ninput_matrix: changed=" << changed << "\n" << strMatrix(input_matrix_) << "\nexpected_matrix:\n" << strMatrix(output_matrix_) << "\nactual_matrix:\n" << strMatrix(cooked_matrix_);
|
||||
}
|
||||
}
|
||||
|
||||
std::string DebounceTest::strTime() {
|
||||
std::stringstream text;
|
||||
|
||||
text << "time " << (timer_read_fast() - time_offset_)
|
||||
<< " (extra_iterations=" << extra_iterations_
|
||||
<< ", auto_advance_time=" << auto_advance_time_ << ")";
|
||||
text << "time " << (timer_read_fast() - time_offset_) << " (extra_iterations=" << extra_iterations_ << ", auto_advance_time=" << auto_advance_time_ << ")";
|
||||
|
||||
return text.str();
|
||||
}
|
||||
|
|
@ -181,49 +167,39 @@ std::string DebounceTest::strMatrix(matrix_row_t matrix[]) {
|
|||
|
||||
bool DebounceTest::directionValue(Direction direction) {
|
||||
switch (direction) {
|
||||
case DOWN:
|
||||
return true;
|
||||
case DOWN:
|
||||
return true;
|
||||
|
||||
case UP:
|
||||
return false;
|
||||
case UP:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
std::string DebounceTest::directionLabel(Direction direction) {
|
||||
switch (direction) {
|
||||
case DOWN:
|
||||
return "DOWN";
|
||||
case DOWN:
|
||||
return "DOWN";
|
||||
|
||||
case UP:
|
||||
return "UP";
|
||||
case UP:
|
||||
return "UP";
|
||||
}
|
||||
}
|
||||
|
||||
/* Modify a matrix and verify that events always specify a change */
|
||||
void DebounceTest::matrixUpdate(matrix_row_t matrix[], const std::string &name, const MatrixTestEvent &event) {
|
||||
ASSERT_NE(!!(matrix[event.row_] & (1U << event.col_)), directionValue(event.direction_))
|
||||
<< "Test " << name << " at " << strTime()
|
||||
<< " sets key " << event.row_ << "," << event.col_ << " " << directionLabel(event.direction_)
|
||||
<< " but it is already " << directionLabel(event.direction_)
|
||||
<< "\n" << name << "_matrix:\n" << strMatrix(matrix);
|
||||
ASSERT_NE(!!(matrix[event.row_] & (1U << event.col_)), directionValue(event.direction_)) << "Test " << name << " at " << strTime() << " sets key " << event.row_ << "," << event.col_ << " " << directionLabel(event.direction_) << " but it is already " << directionLabel(event.direction_) << "\n" << name << "_matrix:\n" << strMatrix(matrix);
|
||||
|
||||
switch (event.direction_) {
|
||||
case DOWN:
|
||||
matrix[event.row_] |= (1U << event.col_);
|
||||
break;
|
||||
case DOWN:
|
||||
matrix[event.row_] |= (1U << event.col_);
|
||||
break;
|
||||
|
||||
case UP:
|
||||
matrix[event.row_] &= ~(1U << event.col_);
|
||||
break;
|
||||
case UP:
|
||||
matrix[event.row_] &= ~(1U << event.col_);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DebounceTestEvent::DebounceTestEvent(fast_timer_t time,
|
||||
std::initializer_list<MatrixTestEvent> inputs,
|
||||
std::initializer_list<MatrixTestEvent> outputs)
|
||||
: time_(time), inputs_(inputs), outputs_(outputs) {
|
||||
}
|
||||
DebounceTestEvent::DebounceTestEvent(fast_timer_t time, std::initializer_list<MatrixTestEvent> inputs, std::initializer_list<MatrixTestEvent> outputs) : time_(time), inputs_(inputs), outputs_(outputs) {}
|
||||
|
||||
MatrixTestEvent::MatrixTestEvent(int row, int col, Direction direction)
|
||||
: row_(row), col_(col), direction_(direction) {
|
||||
}
|
||||
MatrixTestEvent::MatrixTestEvent(int row, int col, Direction direction) : row_(row), col_(col), direction_(direction) {}
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue