diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 84b5811..82fcbc6 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -11,7 +11,7 @@ jobs: name: Check runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: actions-rs/toolchain@v1 with: profile: minimal @@ -20,12 +20,13 @@ jobs: - uses: actions-rs/cargo@v1 with: command: check + args: --all-features test: name: Test Suite runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: actions-rs/toolchain@v1 with: profile: minimal @@ -34,12 +35,13 @@ jobs: - uses: actions-rs/cargo@v1 with: command: test + args: --all-features fmt: name: Rustfmt runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: actions-rs/toolchain@v1 with: profile: minimal @@ -55,7 +57,7 @@ jobs: name: Clippy runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: actions-rs/toolchain@v1 with: profile: minimal diff --git a/CHANGELOG.md b/CHANGELOG.md index 283a603..367b67c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- Add `defmt` features for enabling `defmt::Format` to most structs and errors by [@elpiel](https://github.com/elpiel) ([#39](https://github.com/kellerkindt/w5500/issues/39)) ## [0.4.1] - January 2nd, 2023 @@ -14,7 +17,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fix indexing for phy configuration register by [@Wassasin](https://github.com/Wassasin) ([#32](https://github.com/kellerkindt/w5500/issues/32)) - Add support for MACRAW operation mode by [@ryan-summers](https://github.com/ryan-summers) ([#33](https://github.com/kellerkindt/w5500/issues/33)) - ## [0.4.0] - January 22nd, 2022 ### Added diff --git a/Cargo.toml b/Cargo.toml index 9054bc2..840572f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,6 +17,7 @@ embedded-nal = "0.6.0" bit_field = "0.10.1" derive-try-from-primitive = "1" nb = "1.0.0" +defmt = { version = "0.3", optional = true } [features] no-chip-version-assertion = [] diff --git a/src/bus/four_wire.rs b/src/bus/four_wire.rs index a55c55f..f33f5d5 100644 --- a/src/bus/four_wire.rs +++ b/src/bus/four_wire.rs @@ -9,6 +9,8 @@ use crate::bus::Bus; const WRITE_MODE_MASK: u8 = 0b00000_1_00; // TODO This name is not ideal, should be renamed to VDM +#[derive(Debug)] +#[cfg_attr(feature = "defmt", derive(defmt::Format))] pub struct FourWire + Write, ChipSelect: OutputPin> { cs: ChipSelect, spi: Spi, diff --git a/src/bus/four_wire_ref.rs b/src/bus/four_wire_ref.rs index af3265b..0a653a5 100644 --- a/src/bus/four_wire_ref.rs +++ b/src/bus/four_wire_ref.rs @@ -9,6 +9,8 @@ use crate::bus::{Bus, FourWire, FourWireError}; // TODO This name is not ideal, should be renamed to VDM /// This is just like [crate::bus::FourWire] but takes references instead of ownership /// for the SPI bus and the ChipSelect pin +#[derive(Debug)] +#[cfg_attr(feature = "defmt", derive(defmt::Format))] pub struct FourWireRef<'a, Spi: Transfer + Write, ChipSelect: OutputPin>( FourWire, OutputPinRef<'a, ChipSelect>>, ); @@ -43,6 +45,7 @@ impl + Write, ChipSelect: OutputPin> Bus } #[derive(Debug)] +#[cfg_attr(feature = "defmt", derive(defmt::Format))] pub struct SpiRef<'a, Spi: Transfer + Write>(pub &'a mut Spi); impl<'a, Spi: Transfer + Write> Transfer for SpiRef<'a, Spi> { @@ -64,6 +67,7 @@ impl<'a, Spi: Transfer + Write> Write for SpiRef<'a, Spi> { } #[derive(Debug)] +#[cfg_attr(feature = "defmt", derive(defmt::Format))] pub struct OutputPinRef<'a, P: OutputPin>(pub &'a mut P); impl<'a, P: OutputPin> OutputPin for OutputPinRef<'a, P> { diff --git a/src/bus/three_wire.rs b/src/bus/three_wire.rs index fe55615..1a21f82 100644 --- a/src/bus/three_wire.rs +++ b/src/bus/three_wire.rs @@ -12,6 +12,8 @@ const FIXED_DATA_LENGTH_MODE_2: u8 = 0b000000_10; const FIXED_DATA_LENGTH_MODE_4: u8 = 0b000000_11; // TODO This name is not ideal, should be renamed to FDM +#[derive(Debug)] +#[cfg_attr(feature = "defmt", derive(defmt::Format))] pub struct ThreeWire + Write> { spi: Spi, } diff --git a/src/device.rs b/src/device.rs index 107a600..bf41a7c 100644 --- a/src/device.rs +++ b/src/device.rs @@ -19,6 +19,8 @@ impl From for ResetError { } } +#[derive(Debug)] +#[cfg_attr(feature = "defmt", derive(defmt::Format))] pub(crate) struct DeviceState { host: HostImpl, sockets: [u8; 1], @@ -104,6 +106,8 @@ impl Device { } } +#[derive(Debug)] +#[cfg_attr(feature = "defmt", derive(defmt::Format))] pub struct InactiveDevice(DeviceState); impl InactiveDevice { diff --git a/src/host/dhcp.rs b/src/host/dhcp.rs index f792736..b8a933b 100644 --- a/src/host/dhcp.rs +++ b/src/host/dhcp.rs @@ -2,9 +2,11 @@ use crate::bus::Bus; use crate::host::Host; use crate::MacAddress; +#[derive(Debug)] +#[cfg_attr(feature = "defmt", derive(defmt::Format))] pub struct Dhcp { // settings: HostConfig, -// current: HostConfig, + // current: HostConfig, } impl Dhcp { diff --git a/src/host/manual.rs b/src/host/manual.rs index 0f61022..5b0b32c 100644 --- a/src/host/manual.rs +++ b/src/host/manual.rs @@ -3,6 +3,8 @@ use crate::host::{Host, HostConfig}; use crate::MacAddress; use embedded_nal::Ipv4Addr; +#[derive(Debug)] +#[cfg_attr(feature = "defmt", derive(defmt::Format))] pub struct Manual { is_setup: bool, settings: HostConfig, diff --git a/src/host/mod.rs b/src/host/mod.rs index 206ec91..8aa1b79 100644 --- a/src/host/mod.rs +++ b/src/host/mod.rs @@ -8,10 +8,15 @@ use crate::register; use crate::MacAddress; use embedded_nal::Ipv4Addr; +#[derive(Debug)] +#[cfg_attr(feature = "defmt", derive(defmt::Format))] pub struct HostConfig { mac: MacAddress, + #[cfg_attr(feature = "defmt", defmt(Display2Format))] ip: Ipv4Addr, + #[cfg_attr(feature = "defmt", defmt(Display2Format))] gateway: Ipv4Addr, + #[cfg_attr(feature = "defmt", defmt(Display2Format))] subnet: Ipv4Addr, } diff --git a/src/lib.rs b/src/lib.rs index a81bf7e..d3f9ff7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -14,15 +14,16 @@ pub mod udp; mod uninitialized_device; pub use device::{Device, DeviceRefMut, InactiveDevice}; -pub use host::{Dhcp, HostConfig, Manual}; +pub use host::{Dhcp, Host, HostConfig, Manual}; pub use net::MacAddress; -pub use uninitialized_device::UninitializedDevice; +pub use uninitialized_device::{InitializeError, UninitializedDevice}; // TODO add better docs to all public items, add unit tests. /// Settings for wake on LAN. Allows the W5500 to optionally emit an interrupt upon receiving a packet #[repr(u8)] -#[derive(Copy, Clone, PartialOrd, PartialEq)] +#[derive(Copy, Clone, Debug, PartialOrd, PartialEq)] +#[cfg_attr(feature = "defmt", derive(defmt::Format))] pub enum OnWakeOnLan { InvokeInterrupt = 0b00100000, Ignore = 0b00000000, @@ -30,7 +31,8 @@ pub enum OnWakeOnLan { /// Settings for ping. Allows the W5500 to respond to or ignore network ping requests #[repr(u8)] -#[derive(Copy, Clone, PartialOrd, PartialEq)] +#[derive(Copy, Clone, Debug, PartialOrd, PartialEq)] +#[cfg_attr(feature = "defmt", derive(defmt::Format))] pub enum OnPingRequest { Respond = 0b00000000, Ignore = 0b00010000, @@ -39,20 +41,23 @@ pub enum OnPingRequest { /// Use [ConnectionType::PPoE] when talking /// to an ADSL modem. Otherwise use [ConnectionType::Ethernet] #[repr(u8)] -#[derive(Copy, Clone, PartialOrd, PartialEq)] +#[derive(Copy, Clone, Debug, PartialOrd, PartialEq)] +#[cfg_attr(feature = "defmt", derive(defmt::Format))] pub enum ConnectionType { PPoE = 0b00001000, Ethernet = 0b00000000, } -#[derive(Copy, Clone, PartialOrd, PartialEq)] +#[derive(Copy, Clone, Debug, PartialOrd, PartialEq)] +#[cfg_attr(feature = "defmt", derive(defmt::Format))] #[repr(u8)] pub enum ArpResponses { Cache = 0b00000000, DropAfterUse = 0b00000010, } -#[derive(Copy, Clone, PartialEq)] +#[derive(Copy, Clone, Debug, PartialEq)] +#[cfg_attr(feature = "defmt", derive(defmt::Format))] pub struct Mode { pub on_wake_on_lan: OnWakeOnLan, pub on_ping_request: OnPingRequest, diff --git a/src/net.rs b/src/net.rs index c77cef2..b504bdd 100644 --- a/src/net.rs +++ b/src/net.rs @@ -18,6 +18,7 @@ pub use embedded_nal::Ipv4Addr; /// /// This is an EUI-48 MAC address (previously called MAC-48). #[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Debug, Hash, Default)] +#[cfg_attr(feature = "defmt", derive(defmt::Format))] pub struct MacAddress { /// Octets of the MAC address. pub octets: [u8; 6], diff --git a/src/raw_device.rs b/src/raw_device.rs index fe80a6d..25413fc 100644 --- a/src/raw_device.rs +++ b/src/raw_device.rs @@ -1,6 +1,8 @@ use crate::{bus::Bus, register, socket::Socket, uninitialized_device::InitializeError}; /// The W5500 operating in MACRAW mode to send and receive ethernet frames. +#[derive(Debug)] +#[cfg_attr(feature = "defmt", derive(defmt::Format))] pub struct RawDevice { bus: SpiBus, raw_socket: Socket, diff --git a/src/socket.rs b/src/socket.rs index 2da445c..2a9d794 100644 --- a/src/socket.rs +++ b/src/socket.rs @@ -2,6 +2,8 @@ use crate::bus::Bus; use crate::register::socketn; use embedded_nal::Ipv4Addr; +#[derive(Debug)] +#[cfg_attr(feature = "defmt", derive(defmt::Format))] pub struct Socket { pub index: u8, register: u8, diff --git a/src/tcp.rs b/src/tcp.rs index 99ecc11..14e7c57 100644 --- a/src/tcp.rs +++ b/src/tcp.rs @@ -11,11 +11,12 @@ use embedded_nal::{nb, IpAddr, Ipv4Addr, SocketAddr, SocketAddrV4, TcpClientStac use core::convert::TryFrom; #[derive(Debug)] +#[cfg_attr(feature = "defmt", derive(defmt::Format))] pub enum TcpSocketError { NoMoreSockets, NotReady, UnsupportedAddress, - Other(E), + Other(#[cfg_attr(feature = "defmt", defmt(Debug2Format))] E), UnsupportedMode, } @@ -25,6 +26,8 @@ impl From for TcpSocketError { } } +#[derive(Debug)] +#[cfg_attr(feature = "defmt", derive(defmt::Format))] pub struct TcpSocket { socket: Socket, } diff --git a/src/udp.rs b/src/udp.rs index cc5ee6b..7566f16 100644 --- a/src/udp.rs +++ b/src/udp.rs @@ -6,6 +6,8 @@ use crate::socket::Socket; use core::fmt::Debug; use embedded_nal::{nb, IpAddr, Ipv4Addr, SocketAddr, SocketAddrV4, UdpClientStack, UdpFullStack}; +#[derive(Debug)] +#[cfg_attr(feature = "defmt", derive(defmt::Format))] pub struct UdpSocket { socket: Socket, } @@ -76,6 +78,7 @@ impl UdpSocket { } } + /// Sets a new destination before performing the send operation. fn send_to( &mut self, bus: &mut SpiBus, @@ -86,6 +89,9 @@ impl UdpSocket { self.send(bus, send_buffer) } + /// Receive data and mutate the `receive_buffer`. + /// + /// If [`Interrupt::Receive`] is not set, it will always return [`NbError::WouldBlock`]. fn receive( &mut self, bus: &mut SpiBus, @@ -137,13 +143,20 @@ impl UdpSocket { self.socket.command(bus, socketn::Command::Close)?; Ok(()) } + + /// returns the index of the socket + #[inline] + pub fn index(&self) -> u8 { + self.socket.index + } } #[derive(Debug)] +#[cfg_attr(feature = "defmt", derive(defmt::Format))] pub enum UdpSocketError { NoMoreSockets, UnsupportedAddress, - Other(E), + Other(#[cfg_attr(feature = "defmt", defmt(Debug2Format))] E), WriteTimeout, } diff --git a/src/uninitialized_device.rs b/src/uninitialized_device.rs index 30c7975..ae230a3 100644 --- a/src/uninitialized_device.rs +++ b/src/uninitialized_device.rs @@ -9,6 +9,8 @@ use crate::raw_device::RawDevice; use crate::register; use crate::{MacAddress, Mode}; +#[derive(Debug)] +#[cfg_attr(feature = "defmt", derive(defmt::Format))] pub struct UninitializedDevice { bus: SpiBus, }