sts3215-controller 0.1.4

A Rust library for controlling ST3215 servos
Documentation
use crate::protocol_packet_handler::ProtocolPacketHandler;
use crate::values::*;
use std::collections::HashMap;

pub struct GroupSyncWrite {
    start_address: u8,
    data_length: usize,
    is_param_changed: bool,
    param: Vec<u8>,
    data_dict: HashMap<u8, Vec<u8>>,
}

impl GroupSyncWrite {
    pub fn new(start_address: u8, data_length: usize) -> Self {
        Self {
            start_address,
            data_length,
            is_param_changed: false,
            param: Vec::new(),
            data_dict: HashMap::new(),
        }
    }

    fn make_param(&mut self) {
        if self.data_dict.is_empty() {
            return;
        }

        self.param.clear();

        for (sts_id, data) in &self.data_dict {
            if data.is_empty() {
                return;
            }
            self.param.push(*sts_id);
            self.param.extend(data);
        }
    }

    pub fn add_param(&mut self, sts_id: u8, data: Vec<u8>) -> bool {
        if self.data_dict.contains_key(&sts_id) {
            return false;
        }

        if data.len() > self.data_length {
            return false;
        }

        self.data_dict.insert(sts_id, data);
        self.is_param_changed = true;
        true
    }

    pub fn remove_param(&mut self, sts_id: u8) {
        if self.data_dict.remove(&sts_id).is_some() {
            self.is_param_changed = true;
        }
    }

    pub fn change_param(&mut self, sts_id: u8, data: Vec<u8>) -> bool {
        if !self.data_dict.contains_key(&sts_id) {
            return false;
        }

        if data.len() > self.data_length {
            return false;
        }

        self.data_dict.insert(sts_id, data);
        self.is_param_changed = true;
        true
    }

    pub fn clear_param(&mut self) {
        self.data_dict.clear();
    }

    pub fn tx_packet(&mut self, ph: &mut ProtocolPacketHandler) -> CommResult {
        if self.data_dict.is_empty() {
            return CommResult::NotAvailable;
        }

        if self.is_param_changed || self.param.is_empty() {
            self.make_param();
        }

        ph.sync_write_tx_only(self.start_address, self.data_length as u8, &self.param)
    }
}