12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- use crate::ems::{Consumer, Producer, Service};
- use crate::internal::utils;
- use log::info;
- use std::sync::Arc;
- use tokio::join;
- use tokio::sync::Mutex;
- pub struct Bms {
- pub id: String,
- pub producer: Producer,
- pub consumer: Arc<Mutex<Consumer>>,
- }
- impl Bms {
- /// 初始化BMS
- pub async fn new(producer: Producer, consumer: Consumer) -> Self {
- let id = utils::generate_random_str(12);
- utils::log::init_log("inpower_iot_mgc_rs::ems::bms::*", "logs/bms.log").await;
- info!("BMS [{}] 初始化成功", id);
- Bms {
- id,
- producer,
- consumer: Arc::new(Mutex::new(consumer)),
- }
- }
- }
- async fn read_task(producer: Producer) {
- loop {
- producer.send("PCS 你好".to_string()).await.unwrap();
- tokio::time::sleep(tokio::time::Duration::from_secs(5)).await;
- }
- }
- async fn write_task(consumer: Arc<Mutex<Consumer>>) {
- loop {
- let string = consumer.lock().await.recv().await.unwrap();
- info!("[BMS] {}", string);
- }
- }
- #[async_trait::async_trait]
- impl Service for Bms {
- async fn serve(&self) {
- let read_handle = tokio::spawn(read_task(self.producer.clone()));
- let write_handle = tokio::spawn(write_task(self.consumer.clone()));
- let _ = join!(read_handle, write_handle);
- }
- }
|