tof_dataclasses/
status.rsuse std::fmt;
use std::collections::HashMap;
cfg_if::cfg_if! {
if #[cfg(feature = "random")] {
use crate::FromRandom;
use rand::Rng;
}
}
use crate::serialization::{
Serialization,
SerializationError,
Packable,
parse_u32
};
use crate::packets::PacketType;
#[derive(Debug, Copy, Clone, PartialEq)]
pub struct TofDetectorStatus {
pub channels000_031 : u32,
pub channels032_063 : u32,
pub channels064_095 : u32,
pub channels096_127 : u32,
pub channels128_159 : u32,
pub channels160_191 : u32,
pub channels192_223 : u32,
pub channels224_255 : u32,
pub channels256_297 : u32,
pub channels298_319 : u32,
}
impl TofDetectorStatus {
pub fn new() -> Self {
Self {
channels000_031 : 0xFFFFFFFF,
channels032_063 : 0xFFFFFFFF,
channels064_095 : 0xFFFFFFFF,
channels096_127 : 0xFFFFFFFF,
channels128_159 : 0xFFFFFFFF,
channels160_191 : 0xFFFFFFFF,
channels192_223 : 0xFFFFFFFF,
channels224_255 : 0xFFFFFFFF,
channels256_297 : 0xFFFFFFFF,
channels298_319 : 0xFFFFFFFF,
}
}
pub fn update_from_map(&mut self, paddles : HashMap<u16,bool>) {
for k in 0..320 {
if let Some(val) = paddles.get(&(&k + 1)) {
if k < 32 && *val {
self.channels000_031 = self.channels000_031 | (k as u32) ;
} else if k < 64 && *val {
self.channels032_063 = self.channels032_063 | (k as u32) - 32;
} else if k < 96 && *val {
self.channels064_095 = self.channels064_095 | (k as u32) - 64;
} else if k < 128 && *val {
self.channels096_127 = self.channels096_127 | (k as u32) - 96;
} else if k < 160 && *val {
self.channels128_159 = self.channels128_159 | (k as u32) - 125;
} else if k < 192 && *val {
self.channels160_191 = self.channels160_191 | (k as u32) - 160;
} else if k < 224 && *val {
self.channels192_223 = self.channels192_223 | (k as u32) - 192;
} else if k < 256 && *val {
self.channels224_255 = self.channels224_255 | (k as u32) - 224;
} else if k < 298 && *val {
self.channels256_297 = self.channels256_297 | (k as u32) - 256;
} else if k < 320 && *val {
self.channels298_319 = self.channels298_319 | (k as u32) - 298;
}
} else {
error!("No entry in paddle status map for channel {}", k);
continue;
}
}
}
pub fn get_dead_paddles_a(&self) -> Vec<u8> {
let mut dead_a = Vec::<u8>::new();
let inactive = self.get_inactive_channels_idx();
for k in inactive.iter() {
if *k < 160 {
dead_a.push(*k as u8);
}
}
dead_a
}
pub fn get_dead_paddles_b(&self) -> Vec<u8> {
let mut dead_b = Vec::<u8>::new();
let inactive = self.get_inactive_channels_idx();
for k in inactive.iter() {
if *k >= 160 {
dead_b.push((*k-159) as u8);
}
}
dead_b
}
fn get_inactive_channels_idx(&self) -> Vec<u16> {
let mut channels = Vec::<u16>::new();
for k in 0..10 {
if (self.channels000_031 >> k & 0x1) == 1 {
channels.push(k);
}
}
for k in 0..10 {
if (self.channels032_063 >> k & 0x1) == 1 {
channels.push(k + 32);
}
}
for k in 0..10 {
if (self.channels064_095 >> k & 0x1) == 1 {
channels.push(k + 64);
}
}
for k in 0..10 {
if (self.channels096_127 >> k & 0x1) == 1 {
channels.push(k + 96);
}
}
for k in 0..10 {
if (self.channels128_159 >> k & 0x1) == 1 {
channels.push(k + 128);
}
}
for k in 0..10 {
if (self.channels160_191 >> k & 0x1) == 1 {
channels.push(k + 160);
}
}
for k in 0..10 {
if (self.channels192_223 >> k & 0x1) == 1 {
channels.push(k + 192);
}
}
for k in 0..10 {
if (self.channels224_255 >> k & 0x1) == 1 {
channels.push(k + 224);
}
}
for k in 0..10 {
if (self.channels256_297 >> k & 0x1) == 1 {
channels.push(k + 256);
}
}
for k in 0..10 {
if (self.channels298_319 >> k & 0x1) == 1 {
channels.push(k + 298);
}
}
channels
}
}
impl Default for TofDetectorStatus {
fn default() -> Self {
Self::new()
}
}
impl Serialization for TofDetectorStatus {
const HEAD : u16 = 0xAAAA;
const TAIL : u16 = 0x5555;
const SIZE : usize = 44;
fn from_bytestream(stream : &Vec<u8>,
pos : &mut usize)
-> Result<Self, SerializationError>{
Self::verify_fixed(stream, pos)?;
let mut status = TofDetectorStatus::new();
status.channels000_031 = parse_u32(stream, pos);
status.channels032_063 = parse_u32(stream, pos);
status.channels064_095 = parse_u32(stream, pos);
status.channels096_127 = parse_u32(stream, pos);
status.channels128_159 = parse_u32(stream, pos);
status.channels160_191 = parse_u32(stream, pos);
status.channels192_223 = parse_u32(stream, pos);
status.channels224_255 = parse_u32(stream, pos);
status.channels256_297 = parse_u32(stream, pos);
status.channels298_319 = parse_u32(stream, pos);
*pos += 2;
Ok(status)
}
fn to_bytestream(&self) -> Vec<u8> {
let mut bs = Vec::<u8>::with_capacity(Self::SIZE);
bs.extend_from_slice(&Self::HEAD.to_le_bytes());
bs.extend_from_slice(&self.channels000_031.to_le_bytes());
bs.extend_from_slice(&self.channels032_063.to_le_bytes());
bs.extend_from_slice(&self.channels064_095.to_le_bytes());
bs.extend_from_slice(&self.channels096_127.to_le_bytes());
bs.extend_from_slice(&self.channels128_159.to_le_bytes());
bs.extend_from_slice(&self.channels160_191.to_le_bytes());
bs.extend_from_slice(&self.channels192_223.to_le_bytes());
bs.extend_from_slice(&self.channels224_255.to_le_bytes());
bs.extend_from_slice(&self.channels256_297.to_le_bytes());
bs.extend_from_slice(&self.channels298_319.to_le_bytes());
bs.extend_from_slice(&Self::TAIL.to_le_bytes());
bs
}
}
impl Packable for TofDetectorStatus {
const PACKET_TYPE : PacketType = PacketType::TofDetectorStatus;
}
impl fmt::Display for TofDetectorStatus {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let mut repr : String = String::from("<TofDetectorStatus");
repr += &(format!("\n Ch 000 - 031 {:x}", &self.channels000_031));
repr += &(format!("\n Ch 032 - 063 {:x}", &self.channels032_063));
repr += &(format!("\n Ch 064 - 095 {:x}", &self.channels064_095));
repr += &(format!("\n Ch 096 - 127 {:x}", &self.channels096_127));
repr += &(format!("\n Ch 128 - 159 {:x}", &self.channels128_159));
repr += &(format!("\n Ch 160 - 191 {:x}", &self.channels160_191));
repr += &(format!("\n Ch 192 - 223 {:x}", &self.channels192_223));
repr += &(format!("\n Ch 224 - 255 {:x}", &self.channels224_255));
repr += &(format!("\n Ch 256 - 297 {:x}", &self.channels256_297));
repr += &(format!("\n Ch 298 - 319 {:x}>", &self.channels298_319));
write!(f, "{}", repr)
}
}
#[cfg(feature = "random")]
impl FromRandom for TofDetectorStatus {
fn from_random() -> Self {
let mut status = TofDetectorStatus::new();
let mut rng = rand::thread_rng();
status.channels000_031 = rng.gen::<u32>();
status.channels032_063 = rng.gen::<u32>();
status.channels064_095 = rng.gen::<u32>();
status.channels096_127 = rng.gen::<u32>();
status.channels128_159 = rng.gen::<u32>();
status.channels160_191 = rng.gen::<u32>();
status.channels192_223 = rng.gen::<u32>();
status.channels224_255 = rng.gen::<u32>();
status.channels256_297 = rng.gen::<u32>();
status.channels298_319 = rng.gen::<u32>();
status
}
}
#[cfg(feature = "random")]
#[test]
fn pack_tofdetectorstatus() {
for _ in 0..100 {
let status = TofDetectorStatus::from_random();
let test : TofDetectorStatus = status.pack().unpack().unwrap();
assert_eq!(status, test);
}
}