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 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}