Skip to main content

gondola_core/packets/
tracker_templeak.rs

1// This file is part of gaps-online-software and published 
2// under the GPLv3 license
3
4use crate::prelude::*;
5
6//---------------------------------------------------
7
8#[cfg_attr(feature="pybindings",pyclass)]
9pub struct TrackerTempLeakPacket {
10  pub telemetry_header : TelemetryPacketHeader,
11  pub tracker_header   : TrackerHeader,
12  pub row_offset       : u8,
13  pub templeak         : [[u32;6];6],
14  pub seu              : [[u32;6];6]
15}
16
17impl fmt::Display for TrackerTempLeakPacket {
18  fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
19    let mut repr = String::from("<TrackerTempLeakPacket");
20    repr    += &(format!("\n {}", self.telemetry_header));
21    repr    += &(format!("\n {}", self.tracker_header));
22    repr    += &(format!("\n ROW OFFSET {}", self.row_offset));
23    repr    += "\n*** TEMPLEAK ***";
24    for k in 0..6 {
25      repr  += &(format!("\n {:?}", self.templeak[k]));
26    }
27    repr    += "\n*** SEU ***";
28    for k in 0..6 {
29      repr  += &(format!("\n {:?}", self.seu[k]));
30    }
31    repr    += ">";
32    write!(f, "{}", repr)
33  }
34}
35
36impl TrackerTempLeakPacket {
37  pub fn new() -> Self {
38    Self {
39      telemetry_header : TelemetryPacketHeader::new(),
40      tracker_header   : TrackerHeader::new(),
41      row_offset       : 0,
42      templeak         : [[0;6];6],
43      seu              : [[0;6];6]
44    }
45  }
46}
47
48impl Serialization for TrackerTempLeakPacket { 
49  fn from_bytestream(stream: &Vec<u8>,
50                     pos: &mut usize)
51    -> Result<Self, SerializationError> {
52    let mut tp          = TrackerTempLeakPacket::new();
53    tp.tracker_header   = TrackerHeader::from_bytestream(stream, pos)?;
54    if stream.len() == *pos as usize {
55      error!("Packet contains only header!");
56      return Ok(tp);
57    }
58    if stream.len() - *pos < (36*3 + 1) {
59      return Err(SerializationError::StreamTooShort);
60    }
61    let row_info = parse_u8(stream, pos);
62    tp.row_offset = row_info & 0x7;
63    for row in 0..6 {
64      for module in 0..6 {
65        let b0 = parse_u8(stream, pos) as u32;
66        let b1 = parse_u8(stream, pos) as u32;
67        let b2 = parse_u8(stream, pos) as u32;
68        let seu_ : u32 = b2 >> 1;
69        let mut templeak_ : u32 = (b2 << 10) | (b1 << 2)  | (b0 >> 6);
70        templeak_ &= 0x7ff;
71        tp.templeak[row][module] = templeak_;
72        tp.seu[row][module] = seu_;
73      }
74    }
75    Ok(tp)
76  }
77}
78
79#[cfg(feature="pybindings")]
80#[pymethods]
81impl TrackerTempLeakPacket {
82
83  #[getter]
84  fn get_row_offset(&self) -> u8 {
85    self.row_offset
86  }
87  
88  #[getter]
89  fn temp_leak(&self) -> [[u32;6];6] {
90    self.templeak
91  }
92  
93  #[getter]
94  fn get_seu(&self) -> [[u32;6];6] {
95    self.seu
96  }
97}
98
99#[cfg(feature="pybindings")]
100pythonize_telemetry!(TrackerTempLeakPacket);
101