use serde_derive::Deserialize;
#[derive(Clone, Debug, Deserialize)]
pub struct KeyboardTomlConfig {
pub keyboard: KeyboardInfo,
pub matrix: Option<MatrixConfig>,
pub layout: LayoutConfig,
pub light: Option<LightConfig>,
pub storage: Option<StorageConfig>,
pub ble: Option<BleConfig>,
pub dependency: Option<DependencyConfig>,
pub split: Option<SplitConfig>,
}
#[derive(Clone, Debug, Deserialize)]
pub struct KeyboardInfo {
pub name: String,
pub vendor_id: u16,
pub product_id: u16,
pub manufacturer: Option<String>,
pub product_name: Option<String>,
pub serial_number: Option<String>,
pub board: Option<String>,
pub chip: Option<String>,
pub usb_enable: Option<bool>,
}
#[derive(Clone, Debug, Default, Deserialize)]
#[allow(non_camel_case_types)]
pub enum MatrixType {
#[default]
normal,
direct_pin,
}
#[derive(Clone, Debug, Default, Deserialize)]
pub struct MatrixConfig {
#[serde(default)]
pub matrix_type: MatrixType,
pub input_pins: Option<Vec<String>>,
pub output_pins: Option<Vec<String>>,
pub direct_pins: Option<Vec<Vec<String>>>,
#[serde(default = "default_true")]
pub direct_pin_low_active: bool,
}
#[derive(Clone, Copy, Debug, Default, Deserialize)]
pub struct StorageConfig {
pub start_addr: Option<usize>,
pub num_sectors: Option<u8>,
#[serde(default = "default_true")]
pub enabled: bool,
}
#[derive(Clone, Default, Debug, Deserialize)]
pub struct BleConfig {
pub enabled: bool,
pub battery_adc_pin: Option<String>,
pub charge_state: Option<PinConfig>,
pub charge_led: Option<PinConfig>,
pub adc_divider_measured: Option<u32>,
pub adc_divider_total: Option<u32>,
}
#[derive(Clone, Default, Debug, Deserialize)]
pub struct LightConfig {
pub capslock: Option<PinConfig>,
pub scrolllock: Option<PinConfig>,
pub numslock: Option<PinConfig>,
}
#[derive(Clone, Default, Debug, Deserialize)]
pub struct PinConfig {
pub pin: String,
pub low_active: bool,
}
#[derive(Clone, Debug, Deserialize)]
pub struct DependencyConfig {
#[serde(default = "default_true")]
pub defmt_log: bool,
}
impl Default for DependencyConfig {
fn default() -> Self {
Self { defmt_log: true }
}
}
#[derive(Clone, Debug, Default, Deserialize)]
pub struct LayoutConfig {
pub rows: u8,
pub cols: u8,
pub layers: u8,
pub keymap: Vec<Vec<Vec<String>>>,
}
#[derive(Clone, Debug, Default, Deserialize)]
pub struct SplitConfig {
pub connection: String,
pub central: SplitBoardConfig,
pub peripheral: Vec<SplitBoardConfig>,
}
#[derive(Clone, Debug, Default, Deserialize)]
pub struct SplitBoardConfig {
pub rows: usize,
pub cols: usize,
pub row_offset: usize,
pub col_offset: usize,
pub ble_addr: Option<[u8; 6]>,
pub serial: Option<Vec<SerialConfig>>,
pub input_pins: Vec<String>,
pub output_pins: Vec<String>,
}
#[derive(Clone, Debug, Default, Deserialize)]
pub struct SerialConfig {
pub instance: String,
pub tx_pin: String,
pub rx_pin: String,
}
fn default_true() -> bool {
true
}