use crate::DepMode;
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub struct Iso14443a {
pub atqa: [u8; 2],
pub sak: u8,
pub uid: [u8; 10],
pub uid_len: usize,
pub ats: [u8; 254],
pub ats_len: usize,
}
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub struct Felica {
pub len: usize,
pub res_code: u8,
pub id: [u8; 8],
pub pad: [u8; 8],
pub sys_code: [u8; 2],
}
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub struct Iso14443b {
pub pupi: [u8; 4],
pub application_data: [u8; 4],
pub protocol_info: [u8; 3],
pub card_identifier: u8,
}
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub struct Iso14443bi {
pub div: [u8; 4],
pub ver_log: u8,
pub config: u8,
pub atr: [u8; 33],
pub atr_len: usize,
}
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub struct Iso14443b2sr {
pub uid: [u8; 8],
}
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub struct Iso14443b2ct {
pub uid: [u8; 4],
pub prod_code: u8,
pub fab_code: u8,
}
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub struct Jewel {
pub sens_res: [u8; 2],
pub id: [u8; 4],
}
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub struct Dep {
pub nfcid3: [u8; 10],
pub did: u8,
pub bs: u8,
pub br: u8,
pub to: u8,
pub pp: u8,
pub gb: [u8; 48],
pub gb_len: usize,
pub dep_mode: DepMode,
}
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub struct Barcode {
pub data: [u8; 32],
pub data_len: usize,
}
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub struct Iso14443biClass {
pub uid: [u8; 8],
}
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub enum TargetInfo {
Iso14443a(Iso14443a),
Felica(Felica),
Iso14443b(Iso14443b),
Iso14443bi(Iso14443bi),
Iso14443b2sr(Iso14443b2sr),
Iso14443b2ct(Iso14443b2ct),
Jewel(Jewel),
Dep(Dep),
Barcode(Barcode),
Iso14443biClass(Iso14443biClass),
}
impl From<&Iso14443a> for nfc1_sys::nfc_iso14443a_info {
fn from(info: &Iso14443a) -> Self {
Self {
abtAtqa: info.atqa,
btSak: info.sak,
szUidLen: info.uid_len,
abtUid: info.uid,
szAtsLen: info.ats_len,
abtAts: info.ats,
}
}
}
impl From<&Felica> for nfc1_sys::nfc_felica_info {
fn from(info: &Felica) -> Self {
Self {
szLen: info.len,
btResCode: info.res_code,
abtId: info.id,
abtPad: info.pad,
abtSysCode: info.sys_code,
}
}
}
impl From<&Iso14443b> for nfc1_sys::nfc_iso14443b_info {
fn from(info: &Iso14443b) -> Self {
Self {
abtPupi: info.pupi,
abtApplicationData: info.application_data,
abtProtocolInfo: info.protocol_info,
ui8CardIdentifier: info.card_identifier,
}
}
}
impl From<&Iso14443bi> for nfc1_sys::nfc_iso14443bi_info {
fn from(info: &Iso14443bi) -> Self {
Self {
abtDIV: info.div,
btVerLog: info.ver_log,
btConfig: info.config,
szAtrLen: info.atr_len,
abtAtr: info.atr,
}
}
}
impl From<&Iso14443b2sr> for nfc1_sys::nfc_iso14443b2sr_info {
fn from(info: &Iso14443b2sr) -> Self {
Self { abtUID: info.uid }
}
}
impl From<&Iso14443b2ct> for nfc1_sys::nfc_iso14443b2ct_info {
fn from(info: &Iso14443b2ct) -> Self {
Self {
abtUID: info.uid,
btProdCode: info.prod_code,
btFabCode: info.fab_code,
}
}
}
impl From<&Jewel> for nfc1_sys::nfc_jewel_info {
fn from(info: &Jewel) -> Self {
Self {
btSensRes: info.sens_res,
btId: info.id,
}
}
}
impl From<&Dep> for nfc1_sys::nfc_dep_info {
fn from(info: &Dep) -> Self {
Self {
abtNFCID3: info.nfcid3,
btDID: info.did,
btBS: info.bs,
btBR: info.br,
btTO: info.to,
btPP: info.pp,
abtGB: info.gb,
szGB: if info.gb_len > 48 {
48
} else {
info.gb_len
},
ndm: info.dep_mode.into(),
}
}
}
impl From<&Barcode> for nfc1_sys::nfc_barcode_info {
fn from(info: &Barcode) -> Self {
Self {
szDataLen: info.data_len,
abtData: info.data,
}
}
}
impl From<&Iso14443biClass> for nfc1_sys::nfc_iso14443biclass_info {
fn from(info: &Iso14443biClass) -> Self {
Self { abtUID: info.uid }
}
}
impl From<&TargetInfo> for nfc1_sys::nfc_target_info {
fn from(input: &TargetInfo) -> nfc1_sys::nfc_target_info {
match input {
TargetInfo::Iso14443a(info) => nfc1_sys::nfc_target_info { nai: info.into() },
TargetInfo::Felica(info) => nfc1_sys::nfc_target_info { nfi: info.into() },
TargetInfo::Iso14443b(info) => nfc1_sys::nfc_target_info { nbi: info.into() },
TargetInfo::Iso14443bi(info) => nfc1_sys::nfc_target_info { nii: info.into() },
TargetInfo::Iso14443b2sr(info) => nfc1_sys::nfc_target_info { nsi: info.into() },
TargetInfo::Iso14443b2ct(info) => nfc1_sys::nfc_target_info { nci: info.into() },
TargetInfo::Jewel(info) => nfc1_sys::nfc_target_info { nji: info.into() },
TargetInfo::Dep(info) => nfc1_sys::nfc_target_info { ndi: info.into() },
TargetInfo::Barcode(info) => nfc1_sys::nfc_target_info { nti: info.into() },
TargetInfo::Iso14443biClass(info) => nfc1_sys::nfc_target_info { nhi: info.into() },
}
}
}
impl TargetInfo {
pub fn from_iso14443a(input: nfc1_sys::nfc_target_info) -> Self {
unsafe {
Self::Iso14443a(Iso14443a {
atqa: input.nai.abtAtqa,
sak: input.nai.btSak,
uid_len: input.nai.szUidLen as usize,
uid: input.nai.abtUid,
ats_len: input.nai.szAtsLen as usize,
ats: input.nai.abtAts,
})
}
}
pub fn from_felica(input: nfc1_sys::nfc_target_info) -> Self {
unsafe {
Self::Felica(Felica {
len: input.nfi.szLen as usize,
res_code: input.nfi.btResCode,
id: input.nfi.abtId,
pad: input.nfi.abtPad,
sys_code: input.nfi.abtSysCode,
})
}
}
pub fn from_iso14443b(input: nfc1_sys::nfc_target_info) -> Self {
unsafe {
Self::Iso14443b(Iso14443b {
pupi: input.nbi.abtPupi,
application_data: input.nbi.abtApplicationData,
protocol_info: input.nbi.abtProtocolInfo,
card_identifier: input.nbi.ui8CardIdentifier,
})
}
}
pub fn from_iso14443bi(input: nfc1_sys::nfc_target_info) -> Self {
unsafe {
Self::Iso14443bi(Iso14443bi {
div: input.nii.abtDIV,
ver_log: input.nii.btVerLog,
config: input.nii.btConfig,
atr_len: input.nii.szAtrLen as usize,
atr: input.nii.abtAtr,
})
}
}
pub fn from_iso14443b2sr(input: nfc1_sys::nfc_target_info) -> Self {
unsafe {
Self::Iso14443b2sr(Iso14443b2sr {
uid: input.nsi.abtUID,
})
}
}
pub fn from_iso14443b2ct(input: nfc1_sys::nfc_target_info) -> Self {
unsafe {
Self::Iso14443b2ct(Iso14443b2ct {
uid: input.nci.abtUID,
prod_code: input.nci.btProdCode,
fab_code: input.nci.btFabCode,
})
}
}
pub fn from_jewel(input: nfc1_sys::nfc_target_info) -> Self {
unsafe {
Self::Jewel(Jewel {
sens_res: input.nji.btSensRes,
id: input.nji.btId,
})
}
}
pub fn from_dep(input: nfc1_sys::nfc_target_info) -> Self {
unsafe {
Self::Dep(Dep {
nfcid3: input.ndi.abtNFCID3,
did: input.ndi.btDID,
bs: input.ndi.btBS,
br: input.ndi.btBR,
to: input.ndi.btTO,
pp: input.ndi.btPP,
gb: input.ndi.abtGB,
gb_len: input.ndi.szGB as usize,
dep_mode: input.ndi.ndm.into(),
})
}
}
pub fn from_barcode(input: nfc1_sys::nfc_target_info) -> Self {
unsafe {
Self::Barcode(Barcode {
data: input.nti.abtData,
data_len: input.nti.szDataLen as usize,
})
}
}
pub fn from_iso14443biclass(input: nfc1_sys::nfc_target_info) -> Self {
unsafe {
Self::Iso14443biClass(Iso14443biClass {
uid: input.nhi.abtUID,
})
}
}
pub fn new_iso14443a() -> Self {
Self::Iso14443a(Iso14443a {
atqa: [0u8; 2],
sak: 0,
uid: [0u8; 10],
uid_len: 0,
ats: [0u8; 254],
ats_len: 0,
})
}
pub fn new_felica() -> Self {
Self::Felica(Felica {
len: 0,
res_code: 0,
id: [0u8; 8],
pad: [0u8; 8],
sys_code: [0u8; 2],
})
}
pub fn new_iso14443b() -> Self {
Self::Iso14443b(Iso14443b {
pupi: [0u8; 4],
application_data: [0u8; 4],
protocol_info: [0u8; 3],
card_identifier: 0,
})
}
pub fn new_iso14443bi() -> Self {
Self::Iso14443bi(Iso14443bi {
div: [0u8; 4],
ver_log: 0,
config: 0,
atr: [0u8; 33],
atr_len: 0,
})
}
pub fn new_iso14443b2sr() -> Self {
Self::Iso14443b2sr(Iso14443b2sr { uid: [0u8; 8] })
}
pub fn new_iso14443b2ct() -> Self {
Self::Iso14443b2ct(Iso14443b2ct {
uid: [0u8; 4],
prod_code: 0,
fab_code: 0,
})
}
pub fn new_jewel() -> Self {
Self::Jewel(Jewel {
sens_res: [0u8; 2],
id: [0u8; 4],
})
}
pub fn new_dep() -> Self {
Self::Dep(Dep {
nfcid3: [0u8; 10],
did: 0,
bs: 0,
br: 0,
to: 0,
pp: 0,
gb: [0u8; 48],
gb_len: 0,
dep_mode: DepMode::Undefined,
})
}
pub fn new_barcode() -> Self {
Self::Barcode(Barcode {
data: [0u8; 32],
data_len: 0,
})
}
pub fn new_iso14443biclass() -> Self {
Self::Iso14443biClass(Iso14443biClass { uid: [0u8; 8] })
}
}