use super::Register;
use crate::bits::{read_bool_from_bit, read_from_bit, write_bool_to_bit, write_from_bit};
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct GConf {
pub single_diver: bool,
pub stepdir1_enable: bool,
pub stepdir2_enable: bool,
pub poscmp_enable: bool,
pub enc1_refsel: bool,
pub enc2_enable: bool,
pub enc2_refsel: bool,
pub test_mode: bool,
pub shaft1: bool,
pub shaft2: bool,
pub lock_gconf: bool,
pub dc_sync: bool,
}
impl Default for GConf {
fn default() -> Self {
Self::from(0u32)
}
}
impl From<u32> for GConf {
fn from(data: u32) -> Self {
Self {
single_diver: read_bool_from_bit(data, 0),
stepdir1_enable: read_bool_from_bit(data, 1),
stepdir2_enable: read_bool_from_bit(data, 2),
poscmp_enable: read_bool_from_bit(data, 3),
enc1_refsel: read_bool_from_bit(data, 4),
enc2_enable: read_bool_from_bit(data, 5),
enc2_refsel: read_bool_from_bit(data, 6),
test_mode: read_bool_from_bit(data, 7),
shaft1: read_bool_from_bit(data, 8),
shaft2: read_bool_from_bit(data, 9),
lock_gconf: read_bool_from_bit(data, 10),
dc_sync: read_bool_from_bit(data, 11),
}
}
}
impl From<GConf> for u32 {
fn from(data: GConf) -> u32 {
let mut value = 0;
write_bool_to_bit(&mut value, 0, data.single_diver);
write_bool_to_bit(&mut value, 1, data.stepdir1_enable);
write_bool_to_bit(&mut value, 2, data.stepdir2_enable);
write_bool_to_bit(&mut value, 3, data.poscmp_enable);
write_bool_to_bit(&mut value, 4, data.enc1_refsel);
write_bool_to_bit(&mut value, 5, data.enc2_enable);
write_bool_to_bit(&mut value, 6, data.enc2_refsel);
write_bool_to_bit(&mut value, 7, data.test_mode);
write_bool_to_bit(&mut value, 8, data.shaft1);
write_bool_to_bit(&mut value, 9, data.shaft2);
write_bool_to_bit(&mut value, 10, data.lock_gconf);
write_bool_to_bit(&mut value, 11, data.dc_sync);
value
}
}
impl Register for GConf {
fn addr() -> u8 {
0x00
}
}
#[cfg(test)]
mod g_conf {
use super::*;
#[test]
fn to_u32() {
assert_eq!(
u32::from(GConf {
poscmp_enable: true,
..Default::default()
}),
0x00000008
)
}
#[test]
fn from_u32() {
assert_eq!(
GConf::from(0x00000008),
GConf {
poscmp_enable: true,
..Default::default()
},
)
}
}
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct GStat {
pub reset: bool,
pub drv_err1: bool,
pub drv_err2: bool,
pub uv_cp: bool,
}
impl Default for GStat {
fn default() -> Self {
Self::from(0u32)
}
}
impl From<u32> for GStat {
fn from(data: u32) -> Self {
Self {
reset: read_bool_from_bit(data, 0),
drv_err1: read_bool_from_bit(data, 1),
drv_err2: read_bool_from_bit(data, 2),
uv_cp: read_bool_from_bit(data, 3),
}
}
}
impl From<GStat> for u32 {
fn from(data: GStat) -> u32 {
let mut value = 0;
write_bool_to_bit(&mut value, 0, data.reset);
write_bool_to_bit(&mut value, 1, data.drv_err1);
write_bool_to_bit(&mut value, 2, data.drv_err2);
write_bool_to_bit(&mut value, 3, data.uv_cp);
value
}
}
impl Register for GStat {
fn addr() -> u8 {
0x01
}
}
#[cfg(test)]
mod g_stat {
use super::*;
#[test]
fn to_u32() {
assert_eq!(
u32::from(GStat {
drv_err1: true,
drv_err2: true,
..Default::default()
}),
0x00000006
)
}
#[test]
fn from_u32() {
assert_eq!(
GStat::from(0x00000006),
GStat {
drv_err1: true,
drv_err2: true,
..Default::default()
},
)
}
}
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct IfCnt {
pub if_cnt: u8,
}
impl Default for IfCnt {
fn default() -> Self {
Self::from(0u32)
}
}
impl From<u32> for IfCnt {
fn from(data: u32) -> Self {
Self {
if_cnt: read_from_bit(data, 0, 0xff) as u8,
}
}
}
impl From<IfCnt> for u32 {
fn from(data: IfCnt) -> u32 {
let mut value = 0;
write_from_bit(&mut value, 0, 0xff, data.if_cnt as u32);
value
}
}
impl Register for IfCnt {
fn addr() -> u8 {
0x02
}
}
#[cfg(test)]
mod if_cnt {
use super::*;
#[test]
fn to_u32() {
assert_eq!(
u32::from(IfCnt {
if_cnt: 0x66,
..Default::default()
}),
0x00000066
)
}
#[test]
fn from_u32() {
assert_eq!(
IfCnt::from(0x00000066),
IfCnt {
if_cnt: 0x66,
..Default::default()
},
)
}
}
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct SlaveConf {
pub slave_addr: u8,
pub send_delay: u8,
}
impl Default for SlaveConf {
fn default() -> Self {
Self::from(0u32)
}
}
impl From<u32> for SlaveConf {
fn from(data: u32) -> Self {
Self {
slave_addr: read_from_bit(data, 0, 0xff) as u8,
send_delay: read_from_bit(data, 8, 0x0f) as u8,
}
}
}
impl From<SlaveConf> for u32 {
fn from(data: SlaveConf) -> u32 {
let mut value = 0;
write_from_bit(&mut value, 0, 0xff, data.slave_addr as u32);
write_from_bit(&mut value, 8, 0x0f, data.send_delay as u32);
value
}
}
impl Register for SlaveConf {
fn addr() -> u8 {
0x03
}
}
#[cfg(test)]
mod slave_conf {
use super::*;
#[test]
fn to_u32() {
assert_eq!(
u32::from(SlaveConf {
slave_addr: 0x55,
send_delay: 8,
..Default::default()
}),
0x00000855
)
}
#[test]
fn from_u32() {
assert_eq!(
SlaveConf::from(0x00000855),
SlaveConf {
slave_addr: 0x55,
send_delay: 8,
..Default::default()
},
)
}
}
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Input {
pub io0: bool,
pub io1: bool,
pub io2: bool,
pub io3: bool,
pub iop: bool,
pub ion: bool,
pub next_addr: bool,
pub drv_enn: bool,
pub sw_comp: bool,
pub version: u8,
}
impl Default for Input {
fn default() -> Self {
Self::from(0u32)
}
}
impl From<u32> for Input {
fn from(data: u32) -> Self {
Self {
io0: read_bool_from_bit(data, 0),
io1: read_bool_from_bit(data, 1),
io2: read_bool_from_bit(data, 2),
io3: read_bool_from_bit(data, 3),
iop: read_bool_from_bit(data, 4),
ion: read_bool_from_bit(data, 5),
next_addr: read_bool_from_bit(data, 6),
drv_enn: read_bool_from_bit(data, 7),
sw_comp: read_bool_from_bit(data, 8),
version: read_from_bit(data, 24, 0xff) as u8,
}
}
}
impl From<Input> for u32 {
fn from(data: Input) -> u32 {
let mut value = 0;
write_bool_to_bit(&mut value, 0, data.io0);
write_bool_to_bit(&mut value, 1, data.io1);
write_bool_to_bit(&mut value, 2, data.io2);
write_bool_to_bit(&mut value, 3, data.io3);
write_bool_to_bit(&mut value, 4, data.iop);
write_bool_to_bit(&mut value, 5, data.ion);
write_bool_to_bit(&mut value, 6, data.next_addr);
write_bool_to_bit(&mut value, 7, data.drv_enn);
write_bool_to_bit(&mut value, 8, data.sw_comp);
write_from_bit(&mut value, 24, 0xff, data.version as u32);
value
}
}
impl Register for Input {
fn addr() -> u8 {
0x04
}
}
#[cfg(test)]
mod input {
use super::*;
#[test]
fn to_u32() {
assert_eq!(
u32::from(Input {
version: 0x10,
..Default::default()
}),
0x10000000
)
}
#[test]
fn from_u32() {
assert_eq!(
Input::from(0x10000000),
Input {
version: 0x10,
..Default::default()
},
)
}
}
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Output {
pub io0: bool,
pub io1: bool,
pub io2: bool,
pub io_ddr0: bool,
pub io_ddr1: bool,
pub io_ddr2: bool,
}
impl Default for Output {
fn default() -> Self {
Self::from(0u32)
}
}
impl From<u32> for Output {
fn from(data: u32) -> Self {
Self {
io0: read_bool_from_bit(data, 0),
io1: read_bool_from_bit(data, 1),
io2: read_bool_from_bit(data, 2),
io_ddr0: read_bool_from_bit(data, 8),
io_ddr1: read_bool_from_bit(data, 9),
io_ddr2: read_bool_from_bit(data, 10),
}
}
}
impl From<Output> for u32 {
fn from(data: Output) -> u32 {
let mut value = 0;
write_bool_to_bit(&mut value, 0, data.io0);
write_bool_to_bit(&mut value, 1, data.io1);
write_bool_to_bit(&mut value, 2, data.io2);
write_bool_to_bit(&mut value, 8, data.io_ddr0);
write_bool_to_bit(&mut value, 9, data.io_ddr1);
write_bool_to_bit(&mut value, 10, data.io_ddr2);
value
}
}
impl Register for Output {
fn addr() -> u8 {
0x04
}
}
#[cfg(test)]
mod output {
use super::*;
#[test]
fn to_u32() {
assert_eq!(
u32::from(Output {
io_ddr0: true,
io_ddr1: false,
io_ddr2: true,
..Default::default()
}),
0x00000500
)
}
#[test]
fn from_u32() {
assert_eq!(
Output::from(0x00000500),
Output {
io_ddr0: true,
io_ddr1: false,
io_ddr2: true,
..Default::default()
},
)
}
}
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct XCompare {
pub x_compare: u32,
}
impl Default for XCompare {
fn default() -> Self {
Self::from(0u32)
}
}
impl From<u32> for XCompare {
fn from(data: u32) -> Self {
Self {
x_compare: read_from_bit(data, 0, 0xffffffff),
}
}
}
impl From<XCompare> for u32 {
fn from(data: XCompare) -> u32 {
let mut value = 0;
write_from_bit(&mut value, 0, 0xffffffff, data.x_compare);
value
}
}
impl Register for XCompare {
fn addr() -> u8 {
0x05
}
}
#[cfg(test)]
mod x_compare {
use super::*;
#[test]
fn to_u32() {
assert_eq!(
u32::from(XCompare {
x_compare: 0x5566,
..Default::default()
}),
0x00005566
)
}
#[test]
fn from_u32() {
assert_eq!(
XCompare::from(0x00005566),
XCompare {
x_compare: 0x5566,
..Default::default()
},
)
}
}