tof_dataclasses/events/
data_type.rs1use 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#[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 }
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