rainmaker-components 0.1.0

Component abstractions for rainmaker
Documentation
use crate::{
    protocomm::{ProtocommHttpd, ProtocommSecurity},
    utils::WrappedInArcMutex,
    wifi::{WifiApConfig, WifiMgr},
};

use super::WiFiProvTransportTrait;

#[derive(Debug, Default, Clone)]
pub struct WiFiProvSoftApConfig {
    pub service_name: String,
    pub service_key: Option<String>,
}

pub struct WiFiProvTransportSoftAp {
    pc: ProtocommHttpd,
    wifi: WrappedInArcMutex<WifiMgr<'static>>,
    service_name: String,
    service_key: Option<String>,
}

impl WiFiProvTransportSoftAp {
    pub fn new(
        config: WiFiProvSoftApConfig,
        sec: ProtocommSecurity,
        wifi: WrappedInArcMutex<WifiMgr<'static>>,
    ) -> Self {
        let pc = ProtocommHttpd::new(
            crate::http::HttpConfiguration {
                port: 80,
                ..Default::default()
            },
            sec,
        );
        Self {
            pc,
            service_name: config.service_name,
            service_key: config.service_key,
            wifi,
        }
    }
}

impl WiFiProvTransportTrait for WiFiProvTransportSoftAp {
    fn start(&mut self) -> Result<(), crate::error::Error> {
        let mut wifi_ap_config = WifiApConfig {
            ssid: self.service_name.clone(),
            ..Default::default()
        };

        let key = &self.service_key;
        if key.is_some() {
            wifi_ap_config.password = key.as_ref().unwrap().clone();
        }

        let mut wifi = self.wifi.lock().unwrap();
        wifi.set_ap_config(wifi_ap_config).unwrap();
        Ok(())
    }

    fn add_endpoint(&mut self, ep_name: &str, cb: crate::protocomm::ProtocommCallbackType) {
        self.pc.register_endpoint(ep_name, cb);
    }

    fn set_version_info(&mut self, ep_name: &str, version_info: String) {
        self.pc.set_version_info(ep_name, version_info);
    }

    fn set_security_ep(&mut self, ep_name: &str) {
        self.pc.set_security_endpoint(ep_name);
    }
}