diff --git a/src/lib.rs b/src/lib.rs index 5084585..43e5e85 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -107,99 +107,105 @@ where } } -pub trait SoftSerialWriter
+pub trait SoftSerialWriter
: SoftSerialByteWriter
where P: PinOps + StaticPinOps, { - fn write_byte(&self, data: u8); fn write_bytes(&self, transmit_data: T); } -pub trait SoftSerialReader
+pub trait SoftSerialReader
: SoftSerialByteReader
where
P: PinOps + StaticPinOps,
{
- fn read_byte(&self) -> ReadByteResult;
fn read_bytes(&self, recieve_data: T);
}
-#[inline(always)]
-pub(crate) fn _priv_read_byte
+where
+ P: PinOps + StaticPinOps,
+{
+ #[inline(never)]
+ fn write_byte(&self, transmit_data: u8) {
+ let (mut data, mut parity_bit) = (transmit_data, 0);
- delay_cycles(FIRST_ENTRY_READING);
- for _ in 0..8 {
- delay_us(FIRST_HALF_SERIAL_DELAY);
+ for _ in 0..8 {
+ if data & MSB == 0 {
+ P::set_high();
+ parity_bit ^= 0;
+ } else {
+ P::set_low();
+ parity_bit ^= 1;
+ }
- data <<= 1;
+ delay_us(SERIAL_DELAY);
- if P::is_low() {
- data |= 1;
- reciever_parity_bit ^= 1;
- } else {
- data |= 0;
- reciever_parity_bit ^= 0;
+ data <<= 1;
}
- delay_cycles(READING_ADJUST);
- delay_us(SECOND_HALF_SERIAL_DELAY);
- }
+ // Hamming code and CRC are very weightful and slow, so I use simple parity check
- delay_us(FIRST_HALF_SERIAL_DELAY);
-
- let transmitter_parity_bit = (P::read() >> P::PIN_NUM) & LSB;
-
- delay_cycles(READING_ADJUST);
- delay_us(SECOND_HALF_SERIAL_DELAY);
-
- if reciever_parity_bit == transmitter_parity_bit {
- return Err((data, reciever_parity_bit));
- }
-
- Ok(data)
-}
-
-#[inline(always)]
-pub(crate) fn _priv_write_bytes
+where
+ P: PinOps + StaticPinOps,
+{
+ #[inline(never)]
+ fn read_byte(&self) -> ReadByteResult {
+ let (mut data, mut reciever_parity_bit) = (0, 0);
+
+ delay_cycles(FIRST_ENTRY_READING);
+ for _ in 0..8 {
+ delay_us(FIRST_HALF_SERIAL_DELAY);
+
+ data <<= 1;
+
+ if P::is_low() {
+ data |= 1;
+ reciever_parity_bit ^= 1;
+ } else {
+ data |= 0;
+ reciever_parity_bit ^= 0;
+ }
+
+ delay_cycles(READING_ADJUST);
+ delay_us(SECOND_HALF_SERIAL_DELAY);
+ }
+
+ delay_us(FIRST_HALF_SERIAL_DELAY);
+
+ let transmitter_parity_bit = (P::read() >> P::PIN_NUM) & LSB;
+
+ delay_cycles(READING_ADJUST);
+ delay_us(SECOND_HALF_SERIAL_DELAY);
+
+ if reciever_parity_bit == transmitter_parity_bit {
+ return Err((data, reciever_parity_bit));
+ }
+
+ Ok(data)
+ }
+}
+
+impl for HalfDuplexSerial {}
+impl for HalfDuplexSerial {}
+
impl SoftSerialWriter for HalfDuplexSerial
where
P: PinOps + StaticPinOps,
{
- #[inline(never)]
- fn write_byte(&self, data: u8) {
- _priv_write_bytes:: (data);
- }
-
fn write_bytes(&self, transmit_data: &[u8]) {
for byte in transmit_data {
- SoftSerialReader for HalfDuplexSerial
where
P: PinOps + StaticPinOps,
{
- #[inline(never)]
- fn read_byte(&self) -> ReadByteResult {
- _priv_read_byte:: ()
- }
-
fn read_bytes(&self, recieve_data: &mut [u8]) {
for byte in recieve_data {
- if let Ok(data) = > for HalfDuplexSe
where
P: PinOps + StaticPinOps,
{
- #[inline(never)]
- fn write_byte(&self, data: u8) {
- crate::_priv_write_bytes:: (data);
- }
-
#[inline(never)]
fn write_bytes(&self, transmit_data: &mut RingBuffer > for HalfDuplexSe
where
P: PinOps + StaticPinOps,
{
- #[inline(never)]
- fn read_byte(&self) -> crate::ReadByteResult {
- crate::_priv_read_byte:: ()
- }
-
#[inline(never)]
fn read_bytes(&self, recieve_data: &mut RingBuffer