1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#![doc = include_str!("../README.md")]
#![feature(type_alias_impl_trait)]
#![allow(dead_code)]
// Make rust analyzer happy with num-enum crate
#![allow(non_snake_case, non_upper_case_globals)]
// Enable std in test
#![cfg_attr(not(test), no_std)]

use core::{cell::RefCell, convert::Infallible};
use embassy_usb::driver::Driver;
use embedded_hal::digital::{InputPin, OutputPin};
use embedded_storage::nor_flash::NorFlash;
use keyboard::Keyboard;
use keymap::KeyMap;
use usb::KeyboardUsbDevice;

pub use embassy_sync;
pub use embassy_usb;
pub use usbd_hid;
use via::process::VialService;

pub mod action;
pub mod debounce;
pub mod eeprom;
pub mod flash;
pub mod keyboard;
pub mod keycode;
pub mod keymap;
pub mod layout_macro;
pub mod matrix;
pub mod usb;
pub mod via;

/// Initialize keyboard core and keyboard usb device
pub fn initialize_keyboard_and_usb_device<
    D: Driver<'static>,
    In: InputPin<Error = Infallible>,
    Out: OutputPin<Error = Infallible>,
    F: NorFlash,
    const EEPROM_SIZE: usize,
    const ROW: usize,
    const COL: usize,
    const NUM_LAYER: usize,
>(
    driver: D,
    input_pins: [In; ROW],
    output_pins: [Out; COL],
    keymap: &'static RefCell<KeyMap<F, EEPROM_SIZE, ROW, COL, NUM_LAYER>>,
    vial_keyboard_Id: &'static [u8],
    vial_keyboard_def: &'static [u8],
) -> (
    Keyboard<'static, In, Out, F, EEPROM_SIZE, ROW, COL, NUM_LAYER>,
    KeyboardUsbDevice<'static, D>,
    VialService<'static, F, EEPROM_SIZE, ROW, COL, NUM_LAYER>,
) {
    (
        Keyboard::new(input_pins, output_pins, keymap),
        KeyboardUsbDevice::new(driver),
        VialService::new(keymap, vial_keyboard_Id, vial_keyboard_def),
    )
}