72 lines
No EOL
2.1 KiB
Rust
72 lines
No EOL
2.1 KiB
Rust
use std::collections::HashMap;
|
|
use std::io;
|
|
use std::net::SocketAddr;
|
|
use log::{info, trace};
|
|
use domo_proto::data_types::DataType;
|
|
use domo_proto::identifier::Identifier;
|
|
|
|
pub struct Device {
|
|
/// Device identifier
|
|
pub device_id: Identifier,
|
|
/// Device socket address
|
|
pub socket_addr: SocketAddr,
|
|
/// List of properties and last state.
|
|
pub properties: HashMap<String, DataType>
|
|
}
|
|
|
|
pub struct Devices {
|
|
devices: HashMap<Identifier, Device>
|
|
}
|
|
|
|
impl Devices {
|
|
pub fn new() -> Self {
|
|
Self {
|
|
devices: HashMap::new()
|
|
}
|
|
}
|
|
|
|
pub fn add_device_random(&mut self, socket_addr: SocketAddr) -> Identifier {
|
|
let random_id = loop {
|
|
// TODO: random should avoid 0xFFFF----
|
|
let id = Identifier::random();
|
|
trace!("checking if id is taken: {}", id);
|
|
if !self.devices.contains_key(&id) { break id; }
|
|
};
|
|
self.devices.insert(random_id, Device {
|
|
device_id: random_id,
|
|
socket_addr,
|
|
properties: HashMap::new()
|
|
});
|
|
info!("Registered new device: {}", random_id);
|
|
random_id
|
|
}
|
|
|
|
pub fn add_device(&mut self, socket_addr: SocketAddr, identifier: Identifier) -> Identifier {
|
|
self.devices.insert(identifier, Device {
|
|
device_id: identifier,
|
|
socket_addr,
|
|
properties: HashMap::new()
|
|
});
|
|
identifier
|
|
}
|
|
|
|
pub fn add_device_auto(&mut self, socket_addr: SocketAddr, identifier: Option<Identifier>) -> Identifier {
|
|
let identifier = if identifier == Some(Identifier::default()) {
|
|
None
|
|
} else {
|
|
identifier
|
|
};
|
|
if let Some(identifier) = identifier {
|
|
match (identifier, self.devices.contains_key(&identifier)) {
|
|
(identifier, false) => self.add_device(socket_addr, identifier),
|
|
_ => self.add_device_random(socket_addr)
|
|
}
|
|
} else {
|
|
self.add_device_random(socket_addr)
|
|
}
|
|
}
|
|
|
|
pub fn get_device(&self, identifier: Identifier) -> Option<&Device> {
|
|
self.devices.get(&identifier)
|
|
}
|
|
} |