use indexmap::IndexMap;
use serde::{Deserialize, Serialize};
use serde_with::rust::maps_duplicate_key_is_error;
use crate::serialize::{hex_keys_indexmap, hex_u_int};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub enum ChipDetectionMethod {
AtsamDsu(AtsamDsuDetection),
Espressif(EspressifDetection),
NordicConfigId(NordicConfigIdDetection),
NordicFicrInfo(NordicFicrDetection),
InfineonXmcScu(InfineonXmcScuDetection),
InfineonPsocSiid(InfineonPsocSiidDetection),
RenesasPnr(RenesasPnrDetection),
WchLink(WchLinkDetection),
}
impl ChipDetectionMethod {
pub fn as_atsam_dsu(&self) -> Option<&AtsamDsuDetection> {
if let Self::AtsamDsu(v) = self {
Some(v)
} else {
None
}
}
pub fn as_espressif(&self) -> Option<&EspressifDetection> {
if let Self::Espressif(v) = self {
Some(v)
} else {
None
}
}
pub fn as_nordic_configid(&self) -> Option<&NordicConfigIdDetection> {
if let Self::NordicConfigId(v) = self {
Some(v)
} else {
None
}
}
pub fn as_nordic_ficr(&self) -> Option<&NordicFicrDetection> {
if let Self::NordicFicrInfo(v) = self {
Some(v)
} else {
None
}
}
pub fn as_infineon_xmc_scu(&self) -> Option<&InfineonXmcScuDetection> {
if let Self::InfineonXmcScu(v) = self {
Some(v)
} else {
None
}
}
pub fn as_infineon_psoc_siid(&self) -> Option<&InfineonPsocSiidDetection> {
if let Self::InfineonPsocSiid(v) = self {
Some(v)
} else {
None
}
}
pub fn as_renesas_pnr(&self) -> Option<&RenesasPnrDetection> {
if let Self::RenesasPnr(v) = self {
Some(v)
} else {
None
}
}
pub fn as_wch_link(&self) -> Option<&WchLinkDetection> {
if let Self::WchLink(v) = self {
Some(v)
} else {
None
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct AtsamDsuDetection {
pub processor: u8,
pub family: u8,
pub series: u8,
#[serde(serialize_with = "hex_keys_indexmap")]
#[serde(deserialize_with = "maps_duplicate_key_is_error::deserialize")]
pub variants: IndexMap<u8, String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct EspressifDetection {
#[serde(serialize_with = "hex_u_int")]
pub idcode: u32,
#[serde(serialize_with = "hex_keys_indexmap")]
#[serde(deserialize_with = "maps_duplicate_key_is_error::deserialize")]
pub variants: IndexMap<u32, String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct NordicConfigIdDetection {
#[serde(serialize_with = "hex_u_int")]
pub configid_address: u32,
#[serde(serialize_with = "hex_keys_indexmap")]
#[serde(deserialize_with = "maps_duplicate_key_is_error::deserialize")]
pub hwid: IndexMap<u32, String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct NordicFicrDetection {
#[serde(serialize_with = "hex_u_int")]
pub part_address: u32,
#[serde(serialize_with = "hex_u_int")]
pub variant_address: u32,
#[serde(serialize_with = "hex_u_int")]
pub part: u32,
#[serde(serialize_with = "hex_keys_indexmap")]
#[serde(deserialize_with = "maps_duplicate_key_is_error::deserialize")]
pub variants: IndexMap<u32, String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct InfineonXmcScuDetection {
#[serde(serialize_with = "hex_u_int")]
pub part: u16,
#[serde(serialize_with = "hex_u_int")]
pub scu_id: u32,
#[serde(deserialize_with = "maps_duplicate_key_is_error::deserialize")]
pub variants: IndexMap<u32, String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct InfineonPsocSiidDetection {
#[serde(serialize_with = "hex_u_int")]
pub family_id: u16,
#[serde(serialize_with = "hex_keys_indexmap")]
#[serde(deserialize_with = "maps_duplicate_key_is_error::deserialize")]
pub silicon_ids: IndexMap<u16, String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct RenesasPnrDetection {
#[serde(serialize_with = "hex_u_int")]
pub target_id: u16,
#[serde(default)]
pub reverse_string: bool,
#[serde(serialize_with = "hex_u_int")]
pub mcu_pn_base: u32,
pub variants: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct WchLinkDetection {
#[serde(serialize_with = "hex_u_int")]
pub mask: u32,
#[serde(serialize_with = "hex_keys_indexmap")]
#[serde(deserialize_with = "maps_duplicate_key_is_error::deserialize")]
pub variants: IndexMap<u32, String>,
#[serde(default)]
#[serde(serialize_with = "hex_keys_indexmap")]
#[serde(deserialize_with = "maps_duplicate_key_is_error::deserialize")]
pub ob_code_ram_splits: IndexMap<u32, ObCodeRamSplit>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ObCodeRamSplit {
#[serde(serialize_with = "hex_u_int")]
pub address: u64,
#[serde(serialize_with = "hex_u_int")]
pub mask: u8,
#[serde(serialize_with = "hex_keys_indexmap")]
#[serde(deserialize_with = "maps_duplicate_key_is_error::deserialize")]
pub variants: IndexMap<u8, String>,
}