rktk-keymanager 0.2.0

Keymap/state manager for self-made keyboard firmware
Documentation
use crate::{interface::state::input_event::EncoderDirection, keymap::Keymap};

use super::prelude::*;
use pretty_assertions::assert_eq;

const ENCODER_KEYMAP: Keymap<LAYER_COUNT, ROWS, COLS, ENC_COUNT, 2, 4, 2, 3> = const {
    let mut keymap = EMPTY_KEYMAP;
    keymap.layers[0].encoder_keys[0] = (Some(KeyCode::Key(Key::B)), Some(KeyCode::Key(Key::A)));
    keymap
};

#[test]
pub fn encoder_clockwise() {
    let mut state = new_state(ENCODER_KEYMAP);

    let _ = update!(state, time(0));

    let report = state.update(
        InputEvent::Encoder((0, EncoderDirection::Clockwise)),
        time(0),
    );

    assert_eq!(
        report,
        report_with_keycodes([0x04, 0, 0, 0, 0, 0]),
        "In first report, key `A` should be sent"
    );

    let report = update!(state, time(10));
    assert_eq!(
        report, KEYBOARD_ONLY_REPORT,
        "In second send, empty should not be sent"
    );
}

#[test]
pub fn encoder_counterclockwise() {
    let mut state = new_state(ENCODER_KEYMAP);

    let _ = update!(state, time(0));

    let report = state.update(
        InputEvent::Encoder((0, EncoderDirection::CounterClockwise)),
        time(0),
    );

    assert_eq!(
        report,
        report_with_keycodes([0x05, 0, 0, 0, 0, 0]),
        "In first report, key `B` should be sent"
    );

    let report = update!(state, time(0));
    assert_eq!(
        report, KEYBOARD_ONLY_REPORT,
        "In second send, empty report should be sent"
    );
}