bms.rs 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. use crate::ems::{Consumer, Producer, Service};
  2. use crate::internal::utils;
  3. use log::info;
  4. use std::sync::Arc;
  5. use tokio::join;
  6. use tokio::sync::Mutex;
  7. pub struct Bms {
  8. pub id: String,
  9. pub producer: Producer,
  10. pub consumer: Arc<Mutex<Consumer>>,
  11. }
  12. impl Bms {
  13. /// 初始化BMS
  14. pub async fn new(producer: Producer, consumer: Consumer) -> Self {
  15. let id = utils::generate_random_str(12);
  16. utils::log::init_log("inpower_iot_mgc_rs::ems::bms::*", "logs/bms.log").await;
  17. info!("BMS [{}] 初始化成功", id);
  18. Bms {
  19. id,
  20. producer,
  21. consumer: Arc::new(Mutex::new(consumer)),
  22. }
  23. }
  24. }
  25. async fn read_task(producer: Producer) {
  26. loop {
  27. producer.send("PCS 你好".to_string()).await.unwrap();
  28. tokio::time::sleep(tokio::time::Duration::from_secs(5)).await;
  29. }
  30. }
  31. async fn write_task(consumer: Arc<Mutex<Consumer>>) {
  32. loop {
  33. let string = consumer.lock().await.recv().await.unwrap();
  34. info!("[BMS] {}", string);
  35. }
  36. }
  37. #[async_trait::async_trait]
  38. impl Service for Bms {
  39. async fn serve(&self) {
  40. let read_handle = tokio::spawn(read_task(self.producer.clone()));
  41. let write_handle = tokio::spawn(write_task(self.consumer.clone()));
  42. let _ = join!(read_handle, write_handle);
  43. }
  44. }