Hello.
I create code for grouping (clustering) modbus registers.
Register have address (offset) and reg. count (length).
I wrote this code.
What can I improve?
fn group_vec(input : &Vec<(u32,u32)>, cluster : &mut std::vec::Vec<(u32, u32)>, rest : &mut std::vec::Vec<(u32, u32)>) -> bool
{
rest.clear();
cluster.clear();
for e in input.iter()
{
let offset = e.0;
let count = e.1;
println!("start : {:?}, count : {:?}", offset, count);
//first element
if cluster.len() == 0
{
cluster.push((offset, count));
continue;
}
if let Some(last) = cluster.last_mut()
{
let last_start : u32 = last.0;
let last_end : u32 = last_start + last.1;
let cur_start : u32 = offset;
let dist_to_prev = cur_start - last_end;
println!("last_start : {:?}", last_start);
println!("last_end : {:?}", last_end);
println!("dist_to_prev : {:?}", dist_to_prev);
if dist_to_prev <= 2 //max distance
{
println!("push: {:?}", (offset, count));
cluster.push((offset, count));
}
else
{
rest.push((offset, count));
}
}
}
return rest.len() != 0;
}
fn main()
{ //Modbus registers
//registers - address offset, length
let mut registers_map = HashMap::new();
registers_map.insert(0, 2);
registers_map.insert(2, 4);
registers_map.insert(7, 1);
registers_map.insert(20, 2);
registers_map.insert(23, 1);
registers_map.insert(27, 1);
registers_map.insert(100, 1);
let mut input: Vec<_> = registers_map.iter().map(|(a, b)| (*a, *b)).collect();
input.sort_by(|a, b| a.partial_cmp(b).unwrap());
println!("input : {:?}", input);
let mut cluster : Vec<(u32,u32)> = Vec::new();
let mut rest : Vec<(u32,u32)> = Vec::new();
let mut all_clusters = Vec::new();
let res = group_vec(&input, &mut cluster, &mut rest);
all_clusters.push(cluster.clone());
println!("cluster : {:?}", cluster);
println!("rest : {:?}", rest);
if res
{
loop
{
let input = rest.clone();
let res = group_vec(&input, &mut cluster, &mut rest);
println!("cluster : {:?}", cluster);
println!("rest : {:?}", rest);
all_clusters.push(cluster.clone());
if !res
{
break;
}
}
}
println!("all_clusters : {:?}", all_clusters);
}