Skip to content

Commit 917d63c

Browse files
Disasmdbrgn
authored andcommitted
Move the trait definition below
1 parent 19fb4c8 commit 917d63c

File tree

1 file changed

+69
-69
lines changed

1 file changed

+69
-69
lines changed

src/serial.rs

Lines changed: 69 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -115,75 +115,6 @@ impl Pins<USART3> for (PD8<Alternate<PushPull>>, PD9<Input<Floating>>) {
115115
const REMAP: u8 = 0b11;
116116
}
117117

118-
/// Internal trait for the serial read / write logic.
119-
trait UsartReadWrite: Deref<Target=crate::stm32::usart1::RegisterBlock> {
120-
fn read(&self) -> nb::Result<u8, Error> {
121-
let sr = self.sr.read();
122-
123-
// Check for any errors
124-
let err = if sr.pe().bit_is_set() {
125-
Some(Error::Parity)
126-
} else if sr.fe().bit_is_set() {
127-
Some(Error::Framing)
128-
} else if sr.ne().bit_is_set() {
129-
Some(Error::Noise)
130-
} else if sr.ore().bit_is_set() {
131-
Some(Error::Overrun)
132-
} else {
133-
None
134-
};
135-
136-
if let Some(err) = err {
137-
// Some error occured. In order to clear that error flag, you have to
138-
// do a read from the sr register followed by a read from the dr
139-
// register
140-
// NOTE(read_volatile) see `write_volatile` below
141-
unsafe {
142-
ptr::read_volatile(&self.sr as *const _ as *const _);
143-
ptr::read_volatile(&self.dr as *const _ as *const _);
144-
}
145-
Err(nb::Error::Other(err))
146-
} else {
147-
// Check if a byte is available
148-
if sr.rxne().bit_is_set() {
149-
// Read the received byte
150-
// NOTE(read_volatile) see `write_volatile` below
151-
Ok(unsafe {
152-
ptr::read_volatile(&self.dr as *const _ as *const _)
153-
})
154-
} else {
155-
Err(nb::Error::WouldBlock)
156-
}
157-
}
158-
}
159-
160-
fn write(&self, byte: u8) -> nb::Result<(), Infallible> {
161-
let sr = self.sr.read();
162-
163-
if sr.txe().bit_is_set() {
164-
// NOTE(unsafe) atomic write to stateless register
165-
// NOTE(write_volatile) 8-bit write that's not possible through the svd2rust API
166-
unsafe {
167-
ptr::write_volatile(&self.dr as *const _ as *mut _, byte)
168-
}
169-
Ok(())
170-
} else {
171-
Err(nb::Error::WouldBlock)
172-
}
173-
}
174-
175-
fn flush(&self) -> nb::Result<(), Infallible> {
176-
let sr = self.sr.read();
177-
178-
if sr.tc().bit_is_set() {
179-
Ok(())
180-
} else {
181-
Err(nb::Error::WouldBlock)
182-
}
183-
}
184-
}
185-
impl UsartReadWrite for &crate::stm32::usart1::RegisterBlock {}
186-
187118
pub enum Parity {
188119
ParityNone,
189120
ParityEven,
@@ -261,6 +192,75 @@ pub struct Tx<USART> {
261192
_usart: PhantomData<USART>,
262193
}
263194

195+
/// Internal trait for the serial read / write logic.
196+
trait UsartReadWrite: Deref<Target=crate::stm32::usart1::RegisterBlock> {
197+
fn read(&self) -> nb::Result<u8, Error> {
198+
let sr = self.sr.read();
199+
200+
// Check for any errors
201+
let err = if sr.pe().bit_is_set() {
202+
Some(Error::Parity)
203+
} else if sr.fe().bit_is_set() {
204+
Some(Error::Framing)
205+
} else if sr.ne().bit_is_set() {
206+
Some(Error::Noise)
207+
} else if sr.ore().bit_is_set() {
208+
Some(Error::Overrun)
209+
} else {
210+
None
211+
};
212+
213+
if let Some(err) = err {
214+
// Some error occured. In order to clear that error flag, you have to
215+
// do a read from the sr register followed by a read from the dr
216+
// register
217+
// NOTE(read_volatile) see `write_volatile` below
218+
unsafe {
219+
ptr::read_volatile(&self.sr as *const _ as *const _);
220+
ptr::read_volatile(&self.dr as *const _ as *const _);
221+
}
222+
Err(nb::Error::Other(err))
223+
} else {
224+
// Check if a byte is available
225+
if sr.rxne().bit_is_set() {
226+
// Read the received byte
227+
// NOTE(read_volatile) see `write_volatile` below
228+
Ok(unsafe {
229+
ptr::read_volatile(&self.dr as *const _ as *const _)
230+
})
231+
} else {
232+
Err(nb::Error::WouldBlock)
233+
}
234+
}
235+
}
236+
237+
fn write(&self, byte: u8) -> nb::Result<(), Infallible> {
238+
let sr = self.sr.read();
239+
240+
if sr.txe().bit_is_set() {
241+
// NOTE(unsafe) atomic write to stateless register
242+
// NOTE(write_volatile) 8-bit write that's not possible through the svd2rust API
243+
unsafe {
244+
ptr::write_volatile(&self.dr as *const _ as *mut _, byte)
245+
}
246+
Ok(())
247+
} else {
248+
Err(nb::Error::WouldBlock)
249+
}
250+
}
251+
252+
fn flush(&self) -> nb::Result<(), Infallible> {
253+
let sr = self.sr.read();
254+
255+
if sr.tc().bit_is_set() {
256+
Ok(())
257+
} else {
258+
Err(nb::Error::WouldBlock)
259+
}
260+
}
261+
}
262+
impl UsartReadWrite for &crate::stm32::usart1::RegisterBlock {}
263+
264264
macro_rules! hal {
265265
($(
266266
$(#[$meta:meta])*

0 commit comments

Comments
 (0)