rmk_config/
chip.rs

1use crate::{ChipConfig, KeyboardTomlConfig};
2
3#[derive(Clone, Debug, Default, PartialEq, Eq)]
4pub enum ChipSeries {
5    Stm32,
6    Nrf52,
7    #[default]
8    Rp2040,
9    Esp32,
10}
11
12#[derive(Clone, Debug, Default, PartialEq, Eq)]
13pub struct ChipModel {
14    pub series: ChipSeries,
15    pub chip: String,
16    pub board: Option<String>,
17}
18
19impl ChipModel {
20    pub fn get_default_config_str(&self) -> Result<&'static str, String> {
21        if let Some(board) = self.board.clone() {
22            match board.as_str() {
23                "nice!nano_v2" | "nice!nano v2" => Ok(include_str!("default_config/nice_nano_v2.toml")),
24                "nice!nano" | "nice!nano_v1" | "nicenano" => Ok(include_str!("default_config/nice_nano.toml")),
25                "XIAO BLE" | "nrfmicro" | "bluemicro840" | "puchi_ble" => {
26                    Ok(include_str!("default_config/nrf52840.toml"))
27                }
28                "Pi Pico W" | "Pico W" | "pi_pico_w" | "pico_w" => Ok(include_str!("default_config/pi_pico_w.toml")),
29                _ => {
30                    eprintln!("Fallback to use chip config for board: {}", board);
31                    self.get_default_config_str_from_chip(&self.chip)
32                }
33            }
34        } else {
35            self.get_default_config_str_from_chip(&self.chip)
36        }
37    }
38
39    fn get_default_config_str_from_chip(&self, chip: &str) -> Result<&'static str, String> {
40        match chip {
41            "nrf52840" => Ok(include_str!("default_config/nrf52840.toml")),
42            "nrf52833" => Ok(include_str!("default_config/nrf52833.toml")),
43            "nrf52832" => Ok(include_str!("default_config/nrf52832.toml")),
44            "nrf52810" | "nrf52811" => Ok(include_str!("default_config/nrf52810.toml")),
45            "rp2040" => Ok(include_str!("default_config/rp2040.toml")),
46            s if s.starts_with("stm32") => Ok(include_str!("default_config/stm32.toml")),
47            s if s.starts_with("esp32") => {
48                if s == "esp32s3" {
49                    Ok(include_str!("default_config/esp32s3.toml"))
50                } else {
51                    Ok(include_str!("default_config/esp32.toml"))
52                }
53            }
54            _ => Err(format!(
55                "No default chip config for {}, please report at https://github.com/HaoboGu/rmk/issues",
56                self.chip
57            )),
58        }
59    }
60}
61
62impl KeyboardTomlConfig {
63    pub fn get_chip_model(&self) -> Result<ChipModel, String> {
64        let keyboard = self.keyboard.as_ref().unwrap();
65        if keyboard.board.is_none() == keyboard.chip.is_none() {
66            return Err("Either \"board\" or \"chip\" should be set in keyboard.toml, but not both".to_string());
67        }
68
69        // Check board type
70        if let Some(board) = keyboard.board.clone() {
71            match board.as_str() {
72                "nice!nano" | "nice!nano_v1" | "nicenano" | "nice!nano_v2" | "nice!nano v2" | "XIAO BLE"
73                | "nrfmicro" | "bluemicro840" | "puchi_ble" => Ok(ChipModel {
74                    series: ChipSeries::Nrf52,
75                    chip: "nrf52840".to_string(),
76                    board: Some(board),
77                }),
78                "Pi Pico W" | "Pico W" | "pi_pico_w" | "pico_w" => Ok(ChipModel {
79                    series: ChipSeries::Rp2040,
80                    chip: "rp2040".to_string(),
81                    board: Some(board),
82                }),
83                _ => Err(format!("Unsupported board: {}", board)),
84            }
85        } else if let Some(chip) = keyboard.chip.clone() {
86            if chip.to_lowercase().starts_with("stm32") {
87                Ok(ChipModel {
88                    series: ChipSeries::Stm32,
89                    chip,
90                    board: None,
91                })
92            } else if chip.to_lowercase().starts_with("nrf52") {
93                Ok(ChipModel {
94                    series: ChipSeries::Nrf52,
95                    chip,
96                    board: None,
97                })
98            } else if chip.to_lowercase().starts_with("rp2040") {
99                Ok(ChipModel {
100                    series: ChipSeries::Rp2040,
101                    chip,
102                    board: None,
103                })
104            } else if chip.to_lowercase().starts_with("esp32") {
105                Ok(ChipModel {
106                    series: ChipSeries::Esp32,
107                    chip,
108                    board: None,
109                })
110            } else {
111                Err(format!("Unsupported chip: {}", chip))
112            }
113        } else {
114            Err("Neither board nor chip is specified".to_string())
115        }
116    }
117
118    pub fn get_chip_config(&self) -> ChipConfig {
119        let chip_name = &self.get_chip_model().unwrap().chip;
120        self.chip
121            .as_ref()
122            .and_then(|chip_configs| chip_configs.get(chip_name))
123            .cloned()
124            .unwrap_or_default()
125    }
126}