Add matrix command
This commit is contained in:
parent
c931eb4eef
commit
2ef4cd7bbd
@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#include <board/keymap.h>
|
||||||
#include <ec/kbscan.h>
|
#include <ec/kbscan.h>
|
||||||
|
|
||||||
// EC config reset key combo: Fn+Esc
|
// EC config reset key combo: Fn+Esc
|
||||||
@ -18,6 +19,9 @@ extern uint16_t kbscan_repeat_period;
|
|||||||
// ms between pressing key and repeating
|
// ms between pressing key and repeating
|
||||||
extern uint16_t kbscan_repeat_delay;
|
extern uint16_t kbscan_repeat_delay;
|
||||||
|
|
||||||
|
// Debounced kbscan matrix
|
||||||
|
extern uint8_t kbscan_matrix[KM_OUT];
|
||||||
|
|
||||||
void kbscan_init(void);
|
void kbscan_init(void);
|
||||||
void kbscan_event(void);
|
void kbscan_event(void);
|
||||||
|
|
||||||
|
@ -8,7 +8,6 @@
|
|||||||
#include <board/kbc.h>
|
#include <board/kbc.h>
|
||||||
#include <board/kbled.h>
|
#include <board/kbled.h>
|
||||||
#include <board/kbscan.h>
|
#include <board/kbscan.h>
|
||||||
#include <board/keymap.h>
|
|
||||||
#include <board/lid.h>
|
#include <board/lid.h>
|
||||||
#include <board/pmc.h>
|
#include <board/pmc.h>
|
||||||
#include <board/power.h>
|
#include <board/power.h>
|
||||||
@ -26,6 +25,8 @@ bool kbscan_enabled = false;
|
|||||||
uint16_t kbscan_repeat_period = 91;
|
uint16_t kbscan_repeat_period = 91;
|
||||||
uint16_t kbscan_repeat_delay = 500;
|
uint16_t kbscan_repeat_delay = 500;
|
||||||
|
|
||||||
|
uint8_t kbscan_matrix[KM_OUT] = { 0 };
|
||||||
|
|
||||||
uint8_t sci_extra = 0;
|
uint8_t sci_extra = 0;
|
||||||
|
|
||||||
static inline bool matrix_position_is_esc(int row, int col) {
|
static inline bool matrix_position_is_esc(int row, int col) {
|
||||||
@ -289,7 +290,6 @@ static inline bool key_should_repeat(uint16_t key) {
|
|||||||
void kbscan_event(void) {
|
void kbscan_event(void) {
|
||||||
static uint8_t kbscan_layer = 0;
|
static uint8_t kbscan_layer = 0;
|
||||||
uint8_t layer = kbscan_layer;
|
uint8_t layer = kbscan_layer;
|
||||||
static uint8_t kbscan_last[KM_OUT] = { 0 };
|
|
||||||
static uint8_t kbscan_last_layer[KM_OUT][KM_IN] = { { 0 } };
|
static uint8_t kbscan_last_layer[KM_OUT][KM_IN] = { { 0 } };
|
||||||
static bool kbscan_ghost[KM_OUT] = { false };
|
static bool kbscan_ghost[KM_OUT] = { false };
|
||||||
|
|
||||||
@ -312,7 +312,7 @@ void kbscan_event(void) {
|
|||||||
int i;
|
int i;
|
||||||
for (i = 0; i < KM_OUT; i++) {
|
for (i = 0; i < KM_OUT; i++) {
|
||||||
uint8_t new = kbscan_get_row(i);
|
uint8_t new = kbscan_get_row(i);
|
||||||
uint8_t last = kbscan_last[i];
|
uint8_t last = kbscan_matrix[i];
|
||||||
if (new != last) {
|
if (new != last) {
|
||||||
if (kbscan_has_ghost_in_row(i, new)) {
|
if (kbscan_has_ghost_in_row(i, new)) {
|
||||||
kbscan_ghost[i] = true;
|
kbscan_ghost[i] = true;
|
||||||
@ -388,7 +388,7 @@ void kbscan_event(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
kbscan_last[i] = new;
|
kbscan_matrix[i] = new;
|
||||||
} else if (new && repeat_key != 0 && key_should_repeat(repeat_key)) {
|
} else if (new && repeat_key != 0 && key_should_repeat(repeat_key)) {
|
||||||
// A key is being pressed
|
// A key is being pressed
|
||||||
uint32_t time = time_get();
|
uint32_t time = time_get();
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
#ifndef __SCRATCH__
|
#ifndef __SCRATCH__
|
||||||
#include <board/scratch.h>
|
#include <board/scratch.h>
|
||||||
#include <board/kbled.h>
|
#include <board/kbled.h>
|
||||||
#include <board/keymap.h>
|
#include <board/kbscan.h>
|
||||||
#endif
|
#endif
|
||||||
#include <board/smfi.h>
|
#include <board/smfi.h>
|
||||||
#include <common/command.h>
|
#include <common/command.h>
|
||||||
@ -232,6 +232,17 @@ static enum Result cmd_led_set_color(void) {
|
|||||||
return RES_ERR;
|
return RES_ERR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static enum Result cmd_matrix_get(void) {
|
||||||
|
smfi_cmd[SMFI_CMD_DATA] = KM_OUT;
|
||||||
|
smfi_cmd[SMFI_CMD_DATA + 1] = KM_IN;
|
||||||
|
for (uint8_t row = 0; row < KM_OUT; row++) {
|
||||||
|
if ((SMFI_CMD_DATA + 2 + row) < ARRAY_SIZE(smfi_cmd)) {
|
||||||
|
smfi_cmd[SMFI_CMD_DATA + 2 + row] = kbscan_matrix[row];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return RES_OK;
|
||||||
|
}
|
||||||
#endif // !defined(__SCRATCH__)
|
#endif // !defined(__SCRATCH__)
|
||||||
|
|
||||||
#if defined(__SCRATCH__)
|
#if defined(__SCRATCH__)
|
||||||
@ -357,6 +368,9 @@ void smfi_event(void) {
|
|||||||
case CMD_LED_SET_COLOR:
|
case CMD_LED_SET_COLOR:
|
||||||
smfi_cmd[SMFI_CMD_RES] = cmd_led_set_color();
|
smfi_cmd[SMFI_CMD_RES] = cmd_led_set_color();
|
||||||
break;
|
break;
|
||||||
|
case CMD_MATRIX_GET:
|
||||||
|
smfi_cmd[SMFI_CMD_RES] = cmd_matrix_get();
|
||||||
|
break;
|
||||||
#endif // !defined(__SCRATCH__)
|
#endif // !defined(__SCRATCH__)
|
||||||
case CMD_SPI:
|
case CMD_SPI:
|
||||||
smfi_cmd[SMFI_CMD_RES] = cmd_spi();
|
smfi_cmd[SMFI_CMD_RES] = cmd_spi();
|
||||||
|
@ -38,6 +38,8 @@ enum Command {
|
|||||||
CMD_LED_GET_MODE = 15,
|
CMD_LED_GET_MODE = 15,
|
||||||
// Set LED matrix mode and speed
|
// Set LED matrix mode and speed
|
||||||
CMD_LED_SET_MODE = 16,
|
CMD_LED_SET_MODE = 16,
|
||||||
|
// Get key matrix state
|
||||||
|
CMD_MATRIX_GET = 17,
|
||||||
//TODO
|
//TODO
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -33,6 +33,7 @@ enum Cmd {
|
|||||||
LedSetColor = 14,
|
LedSetColor = 14,
|
||||||
LedGetMode = 15,
|
LedGetMode = 15,
|
||||||
LedSetMode = 16,
|
LedSetMode = 16,
|
||||||
|
MatrixGet = 17,
|
||||||
}
|
}
|
||||||
|
|
||||||
const CMD_SPI_FLAG_READ: u8 = 1 << 0;
|
const CMD_SPI_FLAG_READ: u8 = 1 << 0;
|
||||||
@ -269,6 +270,10 @@ impl<A: Access> Ec<A> {
|
|||||||
self.command(Cmd::LedSetMode, &mut data)
|
self.command(Cmd::LedSetMode, &mut data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub unsafe fn matrix_get(&mut self, matrix: &mut [u8]) -> Result<(), Error> {
|
||||||
|
self.command(Cmd::MatrixGet, matrix)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn into_dyn(self) -> Ec<Box<dyn Access>>
|
pub fn into_dyn(self) -> Ec<Box<dyn Access>>
|
||||||
where A: 'static {
|
where A: 'static {
|
||||||
Ec {
|
Ec {
|
||||||
|
@ -222,6 +222,35 @@ unsafe fn info(ec: &mut Ec<Box<dyn Access>>) -> Result<(), Error> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsafe fn matrix(ec: &mut Ec<Box<dyn Access>>) -> Result<(), Error> {
|
||||||
|
let data_size = ec.access().data_size();
|
||||||
|
|
||||||
|
let mut data = vec![0; data_size];
|
||||||
|
ec.matrix_get(&mut data)?;
|
||||||
|
let rows = *data.get(0).unwrap_or(&0);
|
||||||
|
let cols = *data.get(1).unwrap_or(&0);
|
||||||
|
let mut byte = 2;
|
||||||
|
let mut bit = 0;
|
||||||
|
for row in 0..rows {
|
||||||
|
for col in 0..cols {
|
||||||
|
if (data.get(byte).unwrap_or(&0) & (1 << bit)) != 0 {
|
||||||
|
print!("#");
|
||||||
|
} else {
|
||||||
|
print!("-");
|
||||||
|
}
|
||||||
|
|
||||||
|
bit += 1;
|
||||||
|
if bit >= 8 {
|
||||||
|
byte += 1;
|
||||||
|
bit = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
println!();
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
unsafe fn print(ec: &mut Ec<Box<dyn Access>>, message: &[u8]) -> Result<(), Error> {
|
unsafe fn print(ec: &mut Ec<Box<dyn Access>>, message: &[u8]) -> Result<(), Error> {
|
||||||
ec.print(message)?;
|
ec.print(message)?;
|
||||||
|
|
||||||
@ -338,6 +367,7 @@ fn main() {
|
|||||||
.validator(validate_from_str::<u8>)
|
.validator(validate_from_str::<u8>)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
.subcommand(SubCommand::with_name("matrix"))
|
||||||
.subcommand(SubCommand::with_name("print")
|
.subcommand(SubCommand::with_name("print")
|
||||||
.arg(Arg::with_name("message")
|
.arg(Arg::with_name("message")
|
||||||
.required(true)
|
.required(true)
|
||||||
@ -536,6 +566,13 @@ fn main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
("matrix", Some(_sub_m)) => match unsafe { matrix(&mut ec) } {
|
||||||
|
Ok(()) => (),
|
||||||
|
Err(err) => {
|
||||||
|
eprintln!("failed to read matrix: {:X?}", err);
|
||||||
|
process::exit(1);
|
||||||
|
},
|
||||||
|
},
|
||||||
("print", Some(sub_m)) => for arg in sub_m.values_of("message").unwrap() {
|
("print", Some(sub_m)) => for arg in sub_m.values_of("message").unwrap() {
|
||||||
let mut arg = arg.to_owned();
|
let mut arg = arg.to_owned();
|
||||||
arg.push('\n');
|
arg.push('\n');
|
||||||
|
Loading…
x
Reference in New Issue
Block a user