|
@@ -9,9 +9,9 @@ pub struct CsvData {
|
|
|
pub address: Option<u16>,
|
|
|
pub code: Option<u8>,
|
|
|
pub name: Option<String>,
|
|
|
- pub rw: Option<u8>,
|
|
|
#[serde(rename = "type")]
|
|
|
pub t: Option<String>,
|
|
|
+ pub rw: Option<String>,
|
|
|
pub factor: Option<f32>,
|
|
|
pub unit: Option<String>,
|
|
|
pub note: Option<String>,
|
|
@@ -26,26 +26,20 @@ pub fn read_csv_to_code(path: &str) -> anyhow::Result<Vec<ModbusCode>> {
|
|
|
let mut vec = Vec::new();
|
|
|
for result in rdr.deserialize() {
|
|
|
let csv_data: CsvData = result?;
|
|
|
- let code: ModbusCode = csv_data.try_into()?;
|
|
|
- vec.push(code);
|
|
|
+ if let Ok(code) = csv_data.try_into() {
|
|
|
+ vec.push(code);
|
|
|
+ }
|
|
|
}
|
|
|
Ok(vec)
|
|
|
}
|
|
|
|
|
|
/// 描述了基础ModbusCode
|
|
|
pub trait BaseModbusCode {
|
|
|
- fn addr(&self) -> Option<u16>;
|
|
|
+ fn addr(&self) -> u16;
|
|
|
}
|
|
|
|
|
|
const MAX_REGISTER_COUNT: usize = 120;
|
|
|
|
|
|
-#[derive(Debug)]
|
|
|
-pub enum ModbusDataType {
|
|
|
- BOOL,
|
|
|
- U16,
|
|
|
- S16,
|
|
|
-}
|
|
|
-
|
|
|
/// 将序列按照连续子序列分组
|
|
|
/// 如: [1,3,2,7,8,11,10] 分割为 [[1,2,3],[7,8],[10,11]]
|
|
|
pub fn slice_sequential<T>(codes: &mut [T]) -> Vec<&mut [T]>
|
|
@@ -58,14 +52,12 @@ where
|
|
|
while !remaining.is_empty() {
|
|
|
let mut len = 1;
|
|
|
while len < remaining.len() {
|
|
|
- if let (Some(prev_addr), Some(curr_addr)) =
|
|
|
- (remaining[len - 1].addr(), remaining[len].addr())
|
|
|
- {
|
|
|
- if prev_addr + 1 == curr_addr && len < MAX_REGISTER_COUNT {
|
|
|
- len += 1;
|
|
|
- } else {
|
|
|
- break;
|
|
|
- }
|
|
|
+ let prev_addr = remaining[len - 1].addr();
|
|
|
+ let curr_addr = remaining[len].addr();
|
|
|
+ if prev_addr + 1 == curr_addr && len < MAX_REGISTER_COUNT {
|
|
|
+ len += 1;
|
|
|
+ } else {
|
|
|
+ break;
|
|
|
}
|
|
|
}
|
|
|
let (group, rest) = remaining.split_at_mut(len);
|
|
@@ -90,20 +82,18 @@ pub fn sequential<T: BaseModbusCode>(mut codes: Vec<T>) -> Vec<Vec<T>> {
|
|
|
current_group.push(prev);
|
|
|
for current in iter {
|
|
|
if let Some(prev) = current_group.last() {
|
|
|
- if let Some(prev_addr) = prev.addr() {
|
|
|
- if let Some(curr_addr) = current.addr() {
|
|
|
- if prev_addr + 1 == curr_addr {
|
|
|
- if current_group.len() >= MAX_REGISTER_COUNT {
|
|
|
- vec.push(current_group);
|
|
|
- current_group = Vec::new();
|
|
|
- }
|
|
|
- current_group.push(current);
|
|
|
- } else {
|
|
|
- vec.push(current_group);
|
|
|
- current_group = Vec::new();
|
|
|
- current_group.push(current)
|
|
|
- }
|
|
|
+ let prev_addr = prev.addr();
|
|
|
+ let curr_addr = current.addr();
|
|
|
+ if prev_addr + 1 == curr_addr {
|
|
|
+ if current_group.len() >= MAX_REGISTER_COUNT {
|
|
|
+ vec.push(current_group);
|
|
|
+ current_group = Vec::new();
|
|
|
}
|
|
|
+ current_group.push(current);
|
|
|
+ } else {
|
|
|
+ vec.push(current_group);
|
|
|
+ current_group = Vec::new();
|
|
|
+ current_group.push(current)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -116,30 +106,30 @@ pub fn sequential<T: BaseModbusCode>(mut codes: Vec<T>) -> Vec<Vec<T>> {
|
|
|
mod test {
|
|
|
use super::*;
|
|
|
|
|
|
- struct TestModbusCode(Option<u16>);
|
|
|
+ struct TestModbusCode(u16);
|
|
|
|
|
|
impl BaseModbusCode for TestModbusCode {
|
|
|
- fn addr(&self) -> Option<u16> {
|
|
|
+ fn addr(&self) -> u16 {
|
|
|
self.0
|
|
|
}
|
|
|
}
|
|
|
|
|
|
#[test]
|
|
|
fn test_sequential() {
|
|
|
- let base = TestModbusCode { 0: Some(1u16) };
|
|
|
+ let base = TestModbusCode { 0: 1u16 };
|
|
|
let mut codes = vec![
|
|
|
base,
|
|
|
- TestModbusCode { 0: Some(3u16) },
|
|
|
- TestModbusCode { 0: Some(2u16) },
|
|
|
- TestModbusCode { 0: Some(7u16) },
|
|
|
- TestModbusCode { 0: Some(8u16) },
|
|
|
- TestModbusCode { 0: Some(11u16) },
|
|
|
- TestModbusCode { 0: Some(10u16) },
|
|
|
+ TestModbusCode { 0: 3u16 },
|
|
|
+ TestModbusCode { 0: 2u16 },
|
|
|
+ TestModbusCode { 0: 7u16 },
|
|
|
+ TestModbusCode { 0: 8u16 },
|
|
|
+ TestModbusCode { 0: 11u16 },
|
|
|
+ TestModbusCode { 0: 10u16 },
|
|
|
];
|
|
|
let vec = slice_sequential(codes.as_mut_slice());
|
|
|
let vec = vec
|
|
|
.into_iter()
|
|
|
- .map(|it| it.into_iter().map(|i| i.0.unwrap()).collect::<Vec<u16>>())
|
|
|
+ .map(|it| it.into_iter().map(|i| i.0).collect::<Vec<u16>>())
|
|
|
.collect::<Vec<Vec<u16>>>();
|
|
|
assert_eq!(vec, vec![vec![1, 2, 3], vec![7, 8], vec![10, 11],]);
|
|
|
}
|