use crate::error::Result;
use crate::Packet;
use async_trait::async_trait;
#[derive(Clone, Debug)]
pub enum ConnectionStatus {
Connecting,
Connected,
Disconnected(String),
}
#[derive(Clone, Debug, Default)]
pub struct RadioLinkStatistics {
pub link_quality: f32,
pub uplink_rate: f32,
pub downlink_rate: f32,
pub radio_send_rate: f32,
pub avg_retries: f32,
pub power_detector_rate: f32,
pub rssi: Option<f32>,
}
#[derive(Clone, Debug)]
pub struct PlatformAck {
pub received: bool,
pub data: Vec<u8>,
pub rssi_dbm: Option<i16>,
pub power_detector: bool,
pub retry: usize,
}
#[async_trait]
pub trait ConnectionTrait {
async fn wait_close(&self) -> String;
async fn close(&self);
async fn status(&self) -> ConnectionStatus;
async fn wait_disconnect(&self);
async fn send_packet(&self, packet: Packet) -> Result<()>;
async fn recv_packet(&self) -> Result<Packet>;
async fn link_statistics(&self) -> Option<RadioLinkStatistics>;
}
pub struct Connection {
internal_connection: Box<dyn ConnectionTrait + Send + Sync>,
}
impl Connection {
pub fn new(internal_connection: Box<dyn ConnectionTrait + Send + Sync>) -> Self {
Self {
internal_connection,
}
}
pub async fn wait_close(&self) -> String {
self.internal_connection.wait_close().await
}
pub async fn close(&self) {
self.internal_connection.close().await
}
pub async fn status(&self) -> ConnectionStatus {
self.internal_connection.status().await
}
pub async fn wait_disconnect(&self) {
self.internal_connection.wait_disconnect().await
}
pub async fn send_packet(&self, packet: Packet) -> Result<()> {
self.internal_connection.send_packet(packet).await
}
pub async fn recv_packet(&self) -> Result<Packet> {
self.internal_connection.recv_packet().await
}
pub async fn link_statistics(&self) -> Option<RadioLinkStatistics> {
self.internal_connection.link_statistics().await
}
}