1mod behavior;
2mod bind_interrupt;
3mod ble;
4mod chip_init;
5mod comm;
6mod config;
7mod default_config;
8mod entry;
9mod feature;
10mod flash;
11mod gpio_config;
12mod import;
13mod input_device;
14mod keyboard;
15mod keyboard_config;
16mod keycode_alias;
17mod layout;
18mod light;
19mod matrix;
20mod split;
21#[rustfmt::skip]
22mod usb_interrupt_map;
23
24use crate::keyboard::parse_keyboard_mod;
25use darling::{ast::NestedMeta, FromMeta};
26use proc_macro::TokenStream;
27use split::peripheral::parse_split_peripheral_mod;
28use syn::parse_macro_input;
29use usb_interrupt_map::get_usb_info;
30
31#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
32pub(crate) enum ChipSeries {
33 Stm32,
34 Nrf52,
35 #[default]
36 Rp2040,
37 Esp32,
38}
39
40#[derive(Clone, Debug, Default, PartialEq, Eq)]
41pub(crate) struct ChipModel {
42 pub(crate) series: ChipSeries,
43 pub(crate) chip: String,
44 pub(crate) board: Option<String>,
45}
46
47impl ChipModel {
48 pub(crate) fn has_usb(&self) -> bool {
49 match self.series {
50 ChipSeries::Stm32 => get_usb_info(&self.chip).is_some(),
51 ChipSeries::Nrf52 => {
52 if self.chip == "nrf52833" || self.chip == "nrf52840" || self.chip == "nrf52820" {
53 true
54 } else {
55 false
56 }
57 }
58 ChipSeries::Rp2040 => true,
59 ChipSeries::Esp32 => {
60 if self.chip == "esp32s3" || self.chip == "esp32s2" {
61 true
62 } else {
63 false
64 }
65 }
66 }
67 }
68}
69
70#[proc_macro_attribute]
71pub fn rmk_keyboard(_attr: TokenStream, item: TokenStream) -> TokenStream {
72 let item_mod = parse_macro_input!(item as syn::ItemMod);
73 parse_keyboard_mod(item_mod).into()
74}
75
76#[proc_macro_attribute]
77pub fn rmk_central(_attr: TokenStream, item: TokenStream) -> TokenStream {
78 let item_mod = parse_macro_input!(item as syn::ItemMod);
79 parse_keyboard_mod(item_mod).into()
80}
81
82#[derive(Debug, FromMeta)]
84struct PeripheralAttr {
85 #[darling(default)]
86 id: usize,
87}
88
89#[proc_macro_attribute]
90pub fn rmk_peripheral(attr: TokenStream, item: TokenStream) -> TokenStream {
91 let item_mod = parse_macro_input!(item as syn::ItemMod);
92 let attr_args = match NestedMeta::parse_meta_list(attr.clone().into()) {
93 Ok(v) => v,
94 Err(e) => {
95 return TokenStream::from(darling::Error::from(e).write_errors());
96 }
97 };
98
99 let peripheral_id = match PeripheralAttr::from_list(&attr_args) {
100 Ok(v) => v.id,
101 Err(e) => {
102 return TokenStream::from(e.write_errors());
103 }
104 };
105
106 parse_split_peripheral_mod(peripheral_id, attr, item_mod).into()
107}