Guest User

Untitled

a guest
Nov 21st, 2018
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.44 KB | None | 0 0
  1. use std::io::Result;
  2.  
  3. extern crate byteorder;
  4. use byteorder::{BigEndian, ByteOrder};
  5.  
  6.  
  7. pub trait HoldingRegisters {
  8. fn get<A: Into<u16>>(self, addr: A) -> Result<u16>;
  9. fn gets<A: Into<u16>, D: From<u16>>(self, start_addr: A, buff: &mut [D]) -> Result<()>;
  10. fn set<A: Into<u16>, D: Into<u16>>(self, addr: A, data: D) -> Result<()>;
  11. fn sets<A: Into<u16>, D: Into<u16> + Copy>(self, start_addr: A, buff: &[D]) -> Result<()>;
  12. }
  13.  
  14. pub trait RawHoldingRegisters<'a> {
  15. type Data: RawData + 'a;
  16. fn put<A: Into<u16>>(&'a mut self, start_addr: A, registers: u16, bytes: u8) -> Self::Data;
  17. fn pop<A: Into<u16>>(&'a mut self, start_addr: A, registers: u16) -> Self::Data;
  18. }
  19.  
  20. // impl<'a, T: RawHoldingRegisters<'a>> HoldingRegisters for T {
  21. impl<'a, T: RawHoldingRegisters<'a> + 'a> HoldingRegisters for &'a mut T {
  22. fn get<A: Into<u16>>(self, addr: A) -> Result<u16> {
  23. let mut raw = self.pop(addr, 1);
  24. raw.query()?;
  25. Ok(BigEndian::read_u16(raw.as_slice()))
  26. }
  27.  
  28. fn gets<A: Into<u16>, D: From<u16>>(self, start_addr: A, buff: &mut [D]) -> Result<()> {
  29. Ok(())
  30. }
  31.  
  32. fn set<A: Into<u16>, D: Into<u16>>(self, addr: A, data: D) -> Result<()> {
  33. Ok(())
  34. }
  35.  
  36. fn sets<A: Into<u16>, D: Into<u16> + Copy>(self, start_addr: A, buff: &[D]) -> Result<()> {
  37. Ok(())
  38. }
  39. }
  40.  
  41. pub trait RawData {
  42. fn query(&mut self) -> Result<()>;
  43. fn as_slice(&self) -> &[u8];
  44. fn as_mut_slice(&mut self) -> &mut [u8];
  45. }
Add Comment
Please, Sign In to add comment