use core::{convert::From, default::Default, fmt::Debug};
#[derive(Debug)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum CntCount {
Cnt1Bit24(i32),
Cnt2Bit24(i32, i32),
Cnt1Bit48(i64),
Cnt1Bit16(i16),
Cnt1Bit32(i32),
Cnt2Bit32Bit16(i16, i32),
Cnt2Bit16(i16, i16),
Cnt3Bit16(i16, i16, i16),
}
impl CntCount {
pub fn get_cnt0(&self) -> Option<i64> {
match self {
CntCount::Cnt1Bit24(val) => Some(*val as i64),
CntCount::Cnt2Bit24(val, _) => Some(*val as i64),
CntCount::Cnt1Bit48(val) => Some(*val),
CntCount::Cnt1Bit16(val) => Some(*val as i64),
CntCount::Cnt1Bit32(val) => Some(*val as i64),
CntCount::Cnt2Bit32Bit16(val, _) => Some(*val as i64),
CntCount::Cnt2Bit16(val, _) => Some(*val as i64),
CntCount::Cnt3Bit16(val, _, _) => Some(*val as i64),
}
}
pub fn get_cnt1(&self) -> Option<i64> {
match self {
CntCount::Cnt2Bit24(_, val) => Some(*val as i64),
CntCount::Cnt2Bit32Bit16(_, val) => Some(*val as i64),
CntCount::Cnt2Bit16(_, val) => Some(*val as i64),
CntCount::Cnt3Bit16(_, val, _) => Some(*val as i64),
_ => None,
}
}
pub fn get_cnt2(&self) -> Option<i64> {
match self {
CntCount::Cnt3Bit16(_, _, val) => Some(*val as i64),
_ => None,
}
}
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum CntDirection {
#[default]
CW,
CCW,
}
impl From<CntDirection> for u8 {
fn from(val: CntDirection) -> Self {
match val {
CntDirection::CW => 0,
CntDirection::CCW => 1,
}
}
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum CntZSignal {
#[default]
Normal,
Inverted,
}
impl From<CntZSignal> for u8 {
fn from(val: CntZSignal) -> Self {
match val {
CntZSignal::Normal => 0,
CntZSignal::Inverted => 1,
}
}
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub struct CntSetup {
count_direction: CntDirection,
z_signal: CntZSignal,
}
impl CntSetup {
pub fn new(count_direction: CntDirection, z_signal: CntZSignal) -> Self {
Self {
count_direction,
z_signal,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum CntCfg {
Cnt1Bit24(CntSetup),
Cnt2Bit24(CntSetup, CntSetup),
Cnt1Bit48(CntSetup),
Cnt1Bit16(CntSetup),
Cnt1Bit32(CntSetup),
Cnt2Bit32Bit16(CntSetup, CntSetup),
Cnt2Bit16(CntSetup, CntSetup),
Cnt3Bit16(CntSetup, CntSetup, CntSetup),
}
impl From<CntCfg> for u8 {
fn from(val: CntCfg) -> Self {
match val {
CntCfg::Cnt1Bit24(i) => {
(u8::from(i.count_direction) << 3) | (u8::from(i.z_signal) << 6)
}
CntCfg::Cnt2Bit24(i, j) => {
0b001
| (u8::from(i.count_direction) << 3)
| (u8::from(i.z_signal) << 6)
| (u8::from(j.count_direction) << 4)
| (u8::from(j.z_signal) << 7)
}
CntCfg::Cnt1Bit48(i) => {
0b010 | (u8::from(i.count_direction) << 3) | (u8::from(i.z_signal) << 6)
}
CntCfg::Cnt1Bit16(i) => {
0b011 | (u8::from(i.count_direction) << 3) | (u8::from(i.z_signal) << 6)
}
CntCfg::Cnt1Bit32(i) => {
0b100 | (u8::from(i.count_direction) << 3) | (u8::from(i.z_signal) << 6)
}
CntCfg::Cnt2Bit32Bit16(i, j) => {
0b101
| (u8::from(i.count_direction) << 3)
| (u8::from(i.z_signal) << 6)
| (u8::from(j.count_direction) << 4)
| (u8::from(j.z_signal) << 7)
}
CntCfg::Cnt2Bit16(i, j) => {
0b110
| (u8::from(i.count_direction) << 3)
| (u8::from(i.z_signal) << 6)
| (u8::from(j.count_direction) << 4)
| (u8::from(j.z_signal) << 7)
}
CntCfg::Cnt3Bit16(i, j, k) => {
0b111
| (u8::from(i.count_direction) << 3)
| (u8::from(j.count_direction) << 4)
| (u8::from(k.count_direction) << 5)
}
}
}
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub struct DeviceStatus {
pub(crate) warning: WarningStatus,
pub(crate) error: ErrorStatus,
}
impl DeviceStatus {
pub fn is_ok(&self) -> bool {
self.warning == WarningStatus::Ok && self.error == ErrorStatus::Ok
}
pub fn get_warning(&self) -> WarningStatus {
self.warning
}
pub fn get_error(&self) -> ErrorStatus {
self.error
}
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub struct FullDeviceStatus {
pub cnt0_overflow: OverflowStatus,
pub cnt0_aberr: DecodificationStatus,
pub cnt0_zero: ZeroStatus,
pub cnt1_overflow: OverflowStatus,
pub cnt1_aberr: DecodificationStatus,
pub cnt1_zero: ZeroStatus,
pub cnt2_overflow: OverflowStatus,
pub cnt2_aberr: DecodificationStatus,
pub cnt2_zero: ZeroStatus,
pub power_status: UndervoltageStatus,
pub ref_reg_status: RegisterStatus,
pub upd_reg_status: RegisterStatus,
pub ref_cnt_status: OverflowStatus,
pub ext_err_status: ErrorStatus,
pub ext_warn_status: WarningStatus,
pub comm_status: CommunicationStatus,
pub tp_status: TouchProbeStatus,
pub tpi_status: PinStatus,
pub ssi_enabled: InterfaceStatus,
}
#[derive(Debug, Default, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub struct ActuatorStatus {
pub act0: PinStatus,
pub act1: PinStatus,
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum WarningStatus {
#[default]
Ok,
Warning,
}
impl From<bool> for WarningStatus {
fn from(val: bool) -> Self {
match val {
false => WarningStatus::Ok, true => WarningStatus::Warning,
}
}
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum ErrorStatus {
#[default]
Ok,
Error,
}
impl From<bool> for ErrorStatus {
fn from(val: bool) -> Self {
match val {
false => ErrorStatus::Ok, true => ErrorStatus::Error,
}
}
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum DecodificationStatus {
#[default]
Ok,
DecodificationError,
}
impl From<bool> for DecodificationStatus {
fn from(val: bool) -> Self {
match val {
false => DecodificationStatus::Ok,
true => DecodificationStatus::DecodificationError,
}
}
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum OverflowStatus {
#[default]
Ok,
Overflow,
}
impl From<bool> for OverflowStatus {
fn from(val: bool) -> Self {
match val {
false => OverflowStatus::Ok,
true => OverflowStatus::Overflow,
}
}
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum ZeroStatus {
#[default]
NotZero,
Zero,
}
impl From<bool> for ZeroStatus {
fn from(val: bool) -> Self {
match val {
false => ZeroStatus::NotZero,
true => ZeroStatus::Zero,
}
}
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum UndervoltageStatus {
#[default]
Ok,
Undervoltage,
}
impl From<bool> for UndervoltageStatus {
fn from(val: bool) -> Self {
match val {
false => UndervoltageStatus::Ok,
true => UndervoltageStatus::Undervoltage,
}
}
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum RegisterStatus {
#[default]
Ok,
Invalid,
}
impl From<bool> for RegisterStatus {
fn from(val: bool) -> Self {
match val {
true => RegisterStatus::Ok,
false => RegisterStatus::Invalid,
}
}
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum TouchProbeStatus {
#[default]
NotUpdated,
Updated,
}
impl From<bool> for TouchProbeStatus {
fn from(val: bool) -> Self {
match val {
false => TouchProbeStatus::NotUpdated,
true => TouchProbeStatus::Updated,
}
}
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum CommunicationStatus {
#[default]
Ok,
Collision,
}
impl From<bool> for CommunicationStatus {
fn from(val: bool) -> Self {
match val {
false => CommunicationStatus::Ok,
true => CommunicationStatus::Collision,
}
}
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum InterfaceStatus {
#[default]
Disabled,
Enabled,
}
impl From<bool> for InterfaceStatus {
fn from(val: bool) -> Self {
match val {
false => InterfaceStatus::Disabled,
true => InterfaceStatus::Enabled,
}
}
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum PinStatus {
#[default]
Low,
High,
}
impl From<&PinStatus> for bool {
fn from(val: &PinStatus) -> Self {
match val {
PinStatus::High => true,
PinStatus::Low => false,
}
}
}
impl From<bool> for PinStatus {
fn from(val: bool) -> Self {
match val {
true => PinStatus::High,
false => PinStatus::Low,
}
}
}