Guest User

Untitled

a guest
Nov 20th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.40 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>>(&mut self, addr: A) -> Result<u16>;
  9. fn gets<A: Into<u16>, D: From<u16>>(&mut self, start_addr: A, buff: &mut [D]) -> Result<()>;
  10. fn set<A: Into<u16>, D: Into<u16>>(&mut self, addr: A, data: D) -> Result<()>;
  11. fn sets<A: Into<u16>, D: Into<u16> + Copy>(&mut 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. fn get<A: Into<u16>>(&mut self, addr: A) -> Result<u16> {
  22. let raw = self.pop(addr, 1);
  23. raw.query()?;
  24. Ok(BigEndian::read_u16(raw.as_slice()))
  25. }
  26.  
  27. fn gets<A: Into<u16>, D: From<u16>>(&mut self, start_addr: A, buff: &mut [D]) -> Result<()> {
  28. Ok(())
  29. }
  30.  
  31. fn set<A: Into<u16>, D: Into<u16>>(&mut self, addr: A, data: D) -> Result<()> {
  32. Ok(())
  33. }
  34.  
  35. fn sets<A: Into<u16>, D: Into<u16> + Copy>(&mut self, start_addr: A, buff: &[D]) -> Result<()> {
  36. Ok(())
  37. }
  38. }
  39.  
  40. pub trait RawData {
  41. fn query(&mut self) -> Result<()>;
  42. fn as_slice(&self) -> &[u8];
  43. fn as_mut_slice(&mut self) -> &mut [u8];
  44. }
Add Comment
Please, Sign In to add comment