2015-04-10 01:32:04 +09:00
/*
Copyright 2011 , 2012 , 2013 Jun Wako < wakojun @ gmail . com >
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
the Free Software Foundation , either version 2 of the License , or
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
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/>.
*/
2020-12-26 15:56:11 +11:00
# pragma once
2015-04-10 01:32:04 +09:00
# include <stdbool.h>
# include <stdint.h>
# ifdef __cplusplus
extern " C " {
# endif
/* key matrix position */
typedef struct {
uint8_t col ;
uint8_t row ;
} keypos_t ;
/* key event */
typedef struct {
keypos_t key ;
bool pressed ;
uint16_t time ;
} keyevent_t ;
/* equivalent test of keypos_t */
2019-08-30 11:19:03 -07:00
# define KEYEQ(keya, keyb) ((keya).row == (keyb).row && (keya).col == (keyb).col)
2015-04-10 01:32:04 +09:00
2022-03-09 19:29:00 +11:00
/* special keypos_t entries */
# define KEYLOC_TICK 255
# define KEYLOC_COMBO 254
# define KEYLOC_ENCODER_CW 253
# define KEYLOC_ENCODER_CCW 252
2015-04-10 01:32:04 +09:00
/* Rules for No Event:
* 1 ) ( time = = 0 ) to handle ( keyevent_t ) { } as empty event
* 2 ) Matrix ( 255 , 255 ) to make TICK event available
*/
2022-02-12 10:29:31 -08:00
static inline bool IS_NOEVENT ( keyevent_t event ) {
2022-03-09 19:29:00 +11:00
return event . time = = 0 | | ( event . key . row = = KEYLOC_TICK & & event . key . col = = KEYLOC_TICK ) ;
}
2022-12-17 15:06:27 +01:00
static inline bool IS_EVENT ( keyevent_t event ) {
return ! IS_NOEVENT ( event ) ;
}
2022-03-09 19:29:00 +11:00
static inline bool IS_KEYEVENT ( keyevent_t event ) {
return event . key . row < MATRIX_ROWS & & event . key . col < MATRIX_COLS ;
}
static inline bool IS_COMBOEVENT ( keyevent_t event ) {
return event . key . row = = KEYLOC_COMBO ;
}
static inline bool IS_ENCODEREVENT ( keyevent_t event ) {
return event . key . row = = KEYLOC_ENCODER_CW | | event . key . row = = KEYLOC_ENCODER_CCW ;
2022-02-12 10:29:31 -08:00
}
static inline bool IS_PRESSED ( keyevent_t event ) {
2022-12-17 15:06:27 +01:00
return IS_EVENT ( event ) & & event . pressed ;
2022-02-12 10:29:31 -08:00
}
static inline bool IS_RELEASED ( keyevent_t event ) {
2022-12-17 15:06:27 +01:00
return IS_EVENT ( event ) & & ! event . pressed ;
2022-02-12 10:29:31 -08:00
}
2015-04-10 01:32:04 +09:00
2022-03-09 19:29:00 +11:00
/* Common keyevent object factory */
# define MAKE_KEYPOS(row_num, col_num) ((keypos_t){.row = (row_num), .col = (col_num)})
2022-08-06 12:51:13 +02:00
/**
* @ brief Constructs a key event for a pressed or released key .
*/
2022-03-09 19:29:00 +11:00
# define MAKE_KEYEVENT(row_num, col_num, press) ((keyevent_t){.key = MAKE_KEYPOS((row_num), (col_num)), .pressed = (press), .time = (timer_read() | 1)})
2022-08-06 12:51:13 +02:00
/**
* @ brief Constructs a internal tick event that is used to drive the internal QMK state machine .
*/
2022-03-14 21:06:21 +01:00
# define TICK_EVENT MAKE_KEYEVENT(KEYLOC_TICK, KEYLOC_TICK, false)
2022-03-09 19:29:00 +11:00
# ifdef ENCODER_MAP_ENABLE
/* Encoder events */
# define ENCODER_CW_EVENT(enc_id, press) MAKE_KEYEVENT(KEYLOC_ENCODER_CW, (enc_id), (press))
# define ENCODER_CCW_EVENT(enc_id, press) MAKE_KEYEVENT(KEYLOC_ENCODER_CCW, (enc_id), (press))
# endif // ENCODER_MAP_ENABLE
2015-04-10 01:32:04 +09:00
2015-05-17 19:34:34 +09:00
/* it runs once at early stage of startup before keyboard_init. */
void keyboard_setup ( void ) ;
/* it runs once after initializing host side protocol, debug and MCU peripherals. */
2015-04-10 01:32:04 +09:00
void keyboard_init ( void ) ;
2015-05-17 19:34:34 +09:00
/* it runs repeatedly in main loop */
2015-04-10 01:32:04 +09:00
void keyboard_task ( void ) ;
2019-01-18 04:08:14 +10:00
/* it runs whenever code has to behave differently on a slave */
bool is_keyboard_master ( void ) ;
2020-11-18 16:50:32 -08:00
/* it runs whenever code has to behave differently on left vs right split */
bool is_keyboard_left ( void ) ;
2015-04-10 01:32:04 +09:00
2019-02-14 20:18:54 -08:00
void keyboard_pre_init_kb ( void ) ;
void keyboard_pre_init_user ( void ) ;
void keyboard_post_init_kb ( void ) ;
void keyboard_post_init_user ( void ) ;
2022-02-12 10:29:31 -08:00
void housekeeping_task ( void ) ; // To be executed by the main loop in each backend TMK protocol
void housekeeping_task_kb ( void ) ; // To be overridden by keyboard-level code
void housekeeping_task_user ( void ) ; // To be overridden by user/keymap-level code
2020-11-28 12:02:18 -08:00
2023-03-30 18:27:39 -07:00
uint32_t last_input_activity_time ( void ) ; // Timestamp of the last matrix or encoder or pointing device activity
uint32_t last_input_activity_elapsed ( void ) ; // Number of milliseconds since the last matrix or encoder or pointing device activity
2021-01-21 22:24:07 +11:00
2022-02-12 10:29:31 -08:00
uint32_t last_matrix_activity_time ( void ) ; // Timestamp of the last matrix activity
uint32_t last_matrix_activity_elapsed ( void ) ; // Number of milliseconds since the last matrix activity
2021-01-18 05:01:38 +11:00
2022-02-12 10:29:31 -08:00
uint32_t last_encoder_activity_time ( void ) ; // Timestamp of the last encoder activity
uint32_t last_encoder_activity_elapsed ( void ) ; // Number of milliseconds since the last encoder activity
2021-01-21 22:24:07 +11:00
2023-03-30 18:27:39 -07:00
uint32_t last_pointing_device_activity_time ( void ) ; // Timestamp of the last pointing device activity
uint32_t last_pointing_device_activity_elapsed ( void ) ; // Number of milliseconds since the last pointing device activity
void set_activity_timestamps ( uint32_t matrix_timestamp , uint32_t encoder_timestamp , uint32_t pointing_device_timestamp ) ; // Set the timestamps of the last matrix and encoder activity
2023-03-21 20:16:11 +11:00
2021-01-28 02:34:50 +09:00
uint32_t get_matrix_scan_rate ( void ) ;
2015-04-10 01:32:04 +09:00
# ifdef __cplusplus
}
# endif