tof_dataclasses/events/
data_type.rs

1use std::fmt;
2
3cfg_if::cfg_if! {
4  if #[cfg(feature = "random")]  {
5    use crate::FromRandom;
6    extern crate rand;
7    use rand::Rng;
8  }
9}
10
11/// A generic data type
12///
13/// Describe the purpose of the data. This
14/// is the semantics behind it.
15#[derive(Debug, Copy, Clone, PartialEq, serde::Deserialize, serde::Serialize)]
16#[repr(u8)]
17pub enum DataType {
18  Unknown            = 0u8,
19  VoltageCalibration = 10u8,
20  TimingCalibration  = 20u8,
21  Noi                = 30u8,
22  Physics            = 40u8,
23  RBTriggerPeriodic  = 50u8,
24  RBTriggerPoisson   = 60u8,
25  MTBTriggerPoisson  = 70u8,
26  // future extension for different trigger settings!
27}
28
29impl fmt::Display for DataType {
30  fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
31    let r = serde_json::to_string(self).unwrap_or(
32      String::from("Error: cannot unwrap this DataType"));
33    write!(f, "<DataType: {}>", r)
34  }
35}
36
37impl From<u8> for DataType {
38  fn from(value: u8) -> Self {
39    match value {
40      0u8  => DataType::Unknown,
41      10u8 => DataType::VoltageCalibration,
42      20u8 => DataType::TimingCalibration,
43      30u8 => DataType::Noi,
44      40u8 => DataType::Physics,
45      50u8 => DataType::RBTriggerPeriodic,
46      60u8 => DataType::RBTriggerPoisson,
47      70u8 => DataType::MTBTriggerPoisson,
48      _    => DataType::Unknown
49    }
50  }
51}
52
53#[cfg(feature = "random")]
54impl FromRandom for DataType {
55  
56  fn from_random() -> Self {
57    let choices = [
58      DataType::Unknown,
59      DataType::VoltageCalibration,
60      DataType::TimingCalibration,
61      DataType::Noi,
62      DataType::Physics,
63      DataType::RBTriggerPeriodic,
64      DataType::RBTriggerPoisson,
65      DataType::MTBTriggerPoisson
66    ];
67    let mut rng  = rand::thread_rng();
68    let idx = rng.gen_range(0..choices.len());
69    choices[idx]
70  }
71}
72
73#[test]
74fn test_data_type() {
75  let mut type_codes = Vec::<u8>::new();
76  type_codes.push(DataType::Unknown as u8); 
77  type_codes.push(DataType::VoltageCalibration as u8); 
78  type_codes.push(DataType::TimingCalibration as u8); 
79  type_codes.push(DataType::Noi as u8); 
80  type_codes.push(DataType::Physics as u8); 
81  type_codes.push(DataType::MTBTriggerPoisson as u8); 
82  type_codes.push(DataType::RBTriggerPeriodic as u8); 
83  type_codes.push(DataType::RBTriggerPoisson as u8); 
84  for tc in type_codes.iter() {
85    assert_eq!(*tc,DataType::try_from(*tc).unwrap() as u8);
86  }
87}
88