rsiot/components/cmp_livecounter/tasks/
check_partner_counter.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
use std::{
    sync::{
        atomic::{AtomicU8, Ordering},
        Arc,
    },
    time::Duration,
};

use tokio::{sync::mpsc, time::sleep};

use crate::message::Message;

use super::super::config::FnCheckPartnerCounter;

pub struct CheckPartnerPeriod<TMsg> {
    pub output: mpsc::Sender<Message<TMsg>>,
    pub fn_check_partner_counter: FnCheckPartnerCounter<TMsg>,
    pub check_partner_period: Duration,
    pub live_counter: Arc<AtomicU8>,
}

impl<TMsg> CheckPartnerPeriod<TMsg> {
    pub async fn spawn(self) -> super::Result<()> {
        let mut prev_live_counter = 0;

        loop {
            sleep(self.check_partner_period).await;

            let live_counter = self.live_counter.load(Ordering::Acquire);

            let msg = (self.fn_check_partner_counter)(live_counter != prev_live_counter);
            prev_live_counter = live_counter;

            self.output.send(msg).await.unwrap();
        }
    }
}