-
Notifications
You must be signed in to change notification settings - Fork 185
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add enums for LPC55 pin codegen #1732
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -9,7 +9,7 @@ use serde::Deserialize; | |||||||||||||||||||||||||
use std::io::{BufWriter, Write}; | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
#[derive(Clone, Debug, Deserialize)] | ||||||||||||||||||||||||||
#[serde(rename_all = "kebab-case", deny_unknown_fields)] | ||||||||||||||||||||||||||
#[serde(rename_all = "lowercase", deny_unknown_fields)] | ||||||||||||||||||||||||||
struct Pin { | ||||||||||||||||||||||||||
port: usize, | ||||||||||||||||||||||||||
pin: usize, | ||||||||||||||||||||||||||
|
@@ -36,53 +36,82 @@ impl ToTokens for Pin { | |||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
#[derive(Clone, Debug, Deserialize)] | ||||||||||||||||||||||||||
#[serde(rename_all = "kebab-case", deny_unknown_fields)] | ||||||||||||||||||||||||||
#[serde(rename_all = "lowercase", deny_unknown_fields)] | ||||||||||||||||||||||||||
pub struct PinConfig { | ||||||||||||||||||||||||||
pin: Pin, | ||||||||||||||||||||||||||
alt: usize, | ||||||||||||||||||||||||||
mode: Option<String>, | ||||||||||||||||||||||||||
slew: Option<String>, | ||||||||||||||||||||||||||
invert: Option<String>, | ||||||||||||||||||||||||||
digimode: Option<String>, | ||||||||||||||||||||||||||
opendrain: Option<String>, | ||||||||||||||||||||||||||
direction: Option<String>, | ||||||||||||||||||||||||||
mode: Option<Mode>, | ||||||||||||||||||||||||||
slew: Option<Slew>, | ||||||||||||||||||||||||||
invert: Option<Invert>, | ||||||||||||||||||||||||||
digimode: Option<Digimode>, | ||||||||||||||||||||||||||
opendrain: Option<Opendrain>, | ||||||||||||||||||||||||||
direction: Option<Direction>, | ||||||||||||||||||||||||||
name: Option<String>, | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
#[derive(Copy, Clone, Debug, Deserialize)] | ||||||||||||||||||||||||||
#[serde(rename_all = "lowercase")] | ||||||||||||||||||||||||||
enum Mode { | ||||||||||||||||||||||||||
NoPull, | ||||||||||||||||||||||||||
PullDown, | ||||||||||||||||||||||||||
PullUp, | ||||||||||||||||||||||||||
Repeater, | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
#[derive(Copy, Clone, Debug, Deserialize)] | ||||||||||||||||||||||||||
#[serde(rename_all = "lowercase")] | ||||||||||||||||||||||||||
enum Slew { | ||||||||||||||||||||||||||
Standard, | ||||||||||||||||||||||||||
Fast, | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
#[derive(Copy, Clone, Debug, Deserialize)] | ||||||||||||||||||||||||||
#[serde(rename_all = "lowercase")] | ||||||||||||||||||||||||||
pub enum Invert { | ||||||||||||||||||||||||||
Disable, | ||||||||||||||||||||||||||
Enabled, | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
#[derive(Copy, Clone, Debug, Deserialize)] | ||||||||||||||||||||||||||
#[serde(rename_all = "lowercase")] | ||||||||||||||||||||||||||
pub enum Opendrain { | ||||||||||||||||||||||||||
Normal, | ||||||||||||||||||||||||||
Opendrain, | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
#[derive(Copy, Clone, Debug, Deserialize)] | ||||||||||||||||||||||||||
#[serde(rename_all = "lowercase")] | ||||||||||||||||||||||||||
pub enum Digimode { | ||||||||||||||||||||||||||
Analog, | ||||||||||||||||||||||||||
Digital, | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
#[derive(Copy, Clone, Debug, Deserialize)] | ||||||||||||||||||||||||||
#[serde(rename_all = "lowercase")] | ||||||||||||||||||||||||||
pub enum Direction { | ||||||||||||||||||||||||||
Input, | ||||||||||||||||||||||||||
Output, | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
impl PinConfig { | ||||||||||||||||||||||||||
fn get_mode(&self) -> String { | ||||||||||||||||||||||||||
match &self.mode { | ||||||||||||||||||||||||||
None => "NoPull".to_string(), | ||||||||||||||||||||||||||
Some(s) => s.to_string(), | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
fn get_mode(&self) -> Mode { | ||||||||||||||||||||||||||
self.mode.unwrap_or(Mode::NoPull) | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
fn get_slew(&self) -> String { | ||||||||||||||||||||||||||
match &self.slew { | ||||||||||||||||||||||||||
None => "Standard".to_string(), | ||||||||||||||||||||||||||
Some(s) => s.to_string(), | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
fn get_slew(&self) -> Slew { | ||||||||||||||||||||||||||
self.slew.unwrap_or(Slew::Standard) | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
fn get_invert(&self) -> String { | ||||||||||||||||||||||||||
match &self.invert { | ||||||||||||||||||||||||||
None => "Disable".to_string(), | ||||||||||||||||||||||||||
Some(s) => s.to_string(), | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
fn get_invert(&self) -> Invert { | ||||||||||||||||||||||||||
self.invert.unwrap_or(Invert::Disable) | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
fn get_digimode(&self) -> String { | ||||||||||||||||||||||||||
match &self.digimode { | ||||||||||||||||||||||||||
None => "Digital".to_string(), | ||||||||||||||||||||||||||
Some(s) => s.to_string(), | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
fn get_digimode(&self) -> Digimode { | ||||||||||||||||||||||||||
self.digimode.unwrap_or(Digimode::Digital) | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
fn get_opendrain(&self) -> String { | ||||||||||||||||||||||||||
match &self.opendrain { | ||||||||||||||||||||||||||
None => "Normal".to_string(), | ||||||||||||||||||||||||||
Some(s) => s.to_string(), | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
fn get_opendrain(&self) -> Opendrain { | ||||||||||||||||||||||||||
self.opendrain.unwrap_or(Opendrain::Normal) | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
fn get_alt(&self) -> usize { | ||||||||||||||||||||||||||
|
@@ -98,12 +127,13 @@ impl ToTokens for PinConfig { | |||||||||||||||||||||||||
fn to_tokens(&self, tokens: &mut TokenStream) { | ||||||||||||||||||||||||||
let final_pin = self.pin.to_token_stream(); | ||||||||||||||||||||||||||
let alt_num = format_ident!("Alt{}", self.get_alt()); | ||||||||||||||||||||||||||
let mode = format_ident!("{}", self.get_mode()); | ||||||||||||||||||||||||||
let slew = format_ident!("{}", self.get_slew()); | ||||||||||||||||||||||||||
let invert = format_ident!("{}", self.get_invert()); | ||||||||||||||||||||||||||
let digimode = format_ident!("{}", self.get_digimode()); | ||||||||||||||||||||||||||
let od = format_ident!("{}", self.get_opendrain()); | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
let mode = format_ident!("{}", format!("{:?}", self.get_mode())); | ||||||||||||||||||||||||||
let slew = format_ident!("{}", format!("{:?}", self.get_slew())); | ||||||||||||||||||||||||||
let invert = format_ident!("{}", format!("{:?}", self.get_invert())); | ||||||||||||||||||||||||||
let digimode = | ||||||||||||||||||||||||||
format_ident!("{}", format!("{:?}", self.get_digimode())); | ||||||||||||||||||||||||||
let od = format_ident!("{}", format!("{:?}", self.get_opendrain())); | ||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. can't these just be
Suggested change
AFAICT, we shouldn't need the second string allocation? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. also, it occurs to me an alternative to using the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Unfortunately, the former suggestion doesn't work, spitting out an impressive 4 errors per line:
(an easy way to test is running I experimented with implementing some of the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Oh, huh, I was apparently wrong about how I suppose another option would just be to write syn::Ident::new(format!("{:?}", self.get_mode()), proc_macro2::Span::call_site()) to avoid the second allocation, although this is, admittedly, uglier... There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yeah, I'm on the fence here; if all solutions are equally ugly, then might as well pick the shorter one. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yeah...the impact on build time is probably not meaningful. Carry on. |
||||||||||||||||||||||||||
tokens.append_all(final_pin); | ||||||||||||||||||||||||||
tokens.append_all(quote::quote! { | ||||||||||||||||||||||||||
AltFn::#alt_num, | ||||||||||||||||||||||||||
|
@@ -135,16 +165,13 @@ pub fn codegen(pins: Vec<PinConfig>) -> Result<()> { | |||||||||||||||||||||||||
writeln!(&mut file, "iocon.iocon_configure(")?; | ||||||||||||||||||||||||||
writeln!(&mut file, "{}", p.to_token_stream())?; | ||||||||||||||||||||||||||
writeln!(&mut file, ");")?; | ||||||||||||||||||||||||||
|
||||||||||||||||||||||||||
match p.direction { | ||||||||||||||||||||||||||
None => (), | ||||||||||||||||||||||||||
Some(d) => { | ||||||||||||||||||||||||||
writeln!(&mut file, "iocon.set_dir(")?; | ||||||||||||||||||||||||||
writeln!(&mut file, "{}", p.pin.to_token_stream())?; | ||||||||||||||||||||||||||
if d == "output" { | ||||||||||||||||||||||||||
writeln!(&mut file, "Direction::Output")?; | ||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||
writeln!(&mut file, "Direction::Input")?; | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
writeln!(&mut file, "Direction::{d:?}")?; | ||||||||||||||||||||||||||
writeln!(&mut file, ");")?; | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
On all of these, I recommend
derive(Default)
on the enum with a#[default]
tag on the variant you want. These becomeunwrap_or_default
. Or, at that point, you might leave the defaulting to the caller, depending on how it's used.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice, that comes out slightly shorter