Procházet zdrojové kódy

rust-protocol: Implement encoding report packets.

Mathias Gottschlag před 5 roky
rodič
revize
c1ffd88f6b
1 změnil soubory, kde provedl 63 přidání a 6 odebrání
  1. 63
    6
      common/rust-protocol/src/lib.rs

+ 63
- 6
common/rust-protocol/src/lib.rs Zobrazit soubor

@@ -68,16 +68,16 @@ impl Packet {
68 68
                 true
69 69
             }
70 70
             Self::Report(report) => {
71
-                // TODO
72
-                false
71
+                data[0] = (report.count << 5) | 2;
72
+                report.encode(&mut data[1..])
73 73
             }
74 74
             Self::GetValues(get_values) => {
75
-                // TODO
76
-                false
75
+                data[0] = (get_values.count << 5) | 2;
76
+                get_values.encode(&mut data[1..])
77 77
             }
78 78
             Self::Values(values) => {
79
-                // TODO
80
-                false
79
+                data[0] = (values.count << 5) | 2;
80
+                values.encode(&mut data[1..])
81 81
             }
82 82
         }
83 83
     }
@@ -100,6 +100,20 @@ impl Report {
100 100
         }
101 101
         Some(report)
102 102
     }
103
+
104
+    fn encode(&self, mut data: &mut [u8]) -> bool {
105
+        for i in 0..self.count {
106
+            let value_len = self.values[i as usize].encoded_length();
107
+            if data.len() < value_len {
108
+                return false;
109
+            }
110
+            if !self.values[i as usize].encode(data) {
111
+                return false;
112
+            }
113
+            data = &mut data[value_len..];
114
+        }
115
+        false
116
+    }
103 117
 }
104 118
 
105 119
 #[derive(Debug, Clone)]
@@ -114,6 +128,11 @@ impl GetValues {
114 128
         // TODO
115 129
         None
116 130
     }
131
+
132
+    fn encode(&self, mut _data: &[u8]) -> bool {
133
+        // TODO
134
+        false
135
+    }
117 136
 }
118 137
 
119 138
 #[derive(Debug, Clone)]
@@ -128,6 +147,11 @@ impl Values {
128 147
         // TODO
129 148
         None
130 149
     }
150
+
151
+    fn encode(&self, mut _data: &[u8]) -> bool {
152
+        // TODO
153
+        false
154
+    }
131 155
 }
132 156
 
133 157
 #[derive(Debug, Clone, Copy)]
@@ -171,6 +195,39 @@ impl Value {
171 195
         *data = &data[length..];
172 196
         Some(result)
173 197
     }
198
+
199
+    fn encode(&self, data: &mut [u8]) -> bool {
200
+        match self {
201
+            Self::Invalid => {}
202
+            Self::Time(time) => {
203
+                data[0] = 0;
204
+                data[1..9].copy_from_slice(&time.to_le_bytes());
205
+            }
206
+            Self::Temperature(temperature) => {
207
+                data[0] = 1;
208
+                data[1..3].copy_from_slice(&temperature.to_le_bytes());
209
+            }
210
+            Self::Pressure(pressure) => {
211
+                data[0] = 2;
212
+                data[1..5].copy_from_slice(&pressure.to_le_bytes());
213
+            }
214
+            Self::Humidity(humidity) => {
215
+                data[0] = 3;
216
+                data[1..3].copy_from_slice(&humidity.to_le_bytes());
217
+            }
218
+        };
219
+        true
220
+    }
221
+
222
+    fn encoded_length(&self) -> usize {
223
+        match self {
224
+            Self::Invalid => 0,
225
+            Self::Time(_) => 9,
226
+            Self::Temperature(_) => 3,
227
+            Self::Pressure(_) => 5,
228
+            Self::Humidity(_) => 3,
229
+        }
230
+    }
174 231
 }
175 232
 
176 233
 #[derive(Debug, Clone, Copy)]

Loading…
Zrušit
Uložit