1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
// This is part of async-resol-vbus.rs.
// Copyright (c) 2020, Daniel Wippermann.
// See README.md and LICENSE.txt for details.

//! # async-resol-vbus.rs
//!
//! A Rust library for processing RESOL VBus data asynchronously.
//!
//!
//! ## Features
//!
//! - Allows discovery of VBus-over-TCP devices in a local network
//! - Connect to or provide VBus-over-TCP services
//!
//!
//! ## Planned, but not yet implemented features
//!
//! - none (yet)
//!
//!
//! ## Examples
//!
//! ```no_run
//! use std::fs::File;
//!
//! use async_std::{
//!     net::{SocketAddr, TcpStream},
//!     prelude::*,
//! };
//!
//! use resol_vbus::{DataSet, RecordingWriter};
//!
//! use async_resol_vbus::{Result, LiveDataStream, TcpClientHandshake};
//!
//! fn main() -> Result<()> {
//!     async_std::task::block_on(async {
//!         // Create an recording file and hand it to a `RecordingWriter`
//!         let file = File::create("test.vbus")?;
//!         let mut rw = RecordingWriter::new(file);
//!     
//!         // Parse the address of the DL2 to connect to
//!         let addr = "192.168.13.45:7053".parse::<SocketAddr>()?;
//!
//!         let stream = TcpStream::connect(addr).await?;
//!
//!         let mut hs = TcpClientHandshake::start(stream).await?;
//!         hs.send_pass_command("vbus").await?;
//!         let stream = hs.send_data_command().await?;
//!
//!         let (reader, writer) = (&stream, &stream);
//!
//!         let mut stream = LiveDataStream::new(reader, writer, 0, 0x0020);
//!
//!         while let Some(data) = stream.receive_any_data(60000).await? {
//!             println!("{}", data.id_string());
//!
//!             // Add `Data` value into `DataSet` to be stored
//!             let mut data_set = DataSet::new();
//!             data_set.timestamp = data.as_ref().timestamp;
//!             data_set.add_data(data);
//!
//!             // Write the `DataSet` into the `RecordingWriter` for permanent storage
//!             rw.write_data_set(&data_set)
//!                 .expect("Unable to write data set");
//!         }
//!
//!         Ok(())
//!     })
//! }
//! ```

#![warn(missing_docs)]
#![deny(missing_debug_implementations)]
#![deny(warnings)]
#![deny(future_incompatible)]
#![deny(nonstandard_style)]
#![deny(rust_2018_compatibility)]
#![deny(rust_2018_idioms)]
#![allow(clippy::if_same_then_else)]
#![allow(clippy::large_enum_variant)]
#![allow(clippy::needless_bool)]
#![allow(clippy::needless_pass_by_value)]
#![allow(clippy::trivially_copy_pass_by_ref)]
#![allow(clippy::write_with_newline)]

pub use resol_vbus::*;

mod error;
pub use error::Result;

mod device_information;
pub use device_information::DeviceInformation;

mod device_discovery;
pub use device_discovery::DeviceDiscovery;

mod tcp_client_handshake;
pub use tcp_client_handshake::TcpClientHandshake;

mod tcp_server_handshake;
pub use tcp_server_handshake::TcpServerHandshake;

mod live_data_stream;
pub use live_data_stream::LiveDataStream;