ENTS-tock
Environmental NeTworked Sensor firmware on Tock OS
Loading...
Searching...
No Matches
transcoder.c
Go to the documentation of this file.
1
10#include "transcoder.h"
11
12#include <nanopb/pb_decode.h>
13#include <nanopb/pb_encode.h>
14
26size_t EncodeMeasurement(Measurement* meas, uint8_t* buffer);
27
40size_t EncodeEsp32Command(const Esp32Command* cmd, uint8_t* buffer,
41 size_t size);
42
43size_t EncodePowerMeasurement(uint32_t ts, uint32_t logger_id, uint32_t cell_id,
44 double voltage, double current, uint8_t* buffer) {
45 Measurement meas = Measurement_init_zero;
46
47 meas.has_meta = true;
48
49 meas.meta.ts = ts;
50 meas.meta.logger_id = logger_id;
51 meas.meta.cell_id = cell_id;
52
53 meas.which_measurement = Measurement_power_tag;
54 meas.measurement.power.voltage = voltage;
55 meas.measurement.power.current = current;
56
57 return EncodeMeasurement(&meas, buffer);
58}
59
60size_t EncodeTeros12Measurement(uint32_t ts, uint32_t logger_id,
61 uint32_t cell_id, double vwc_raw,
62 double vwc_adj, double temp, uint32_t ec,
63 uint8_t* buffer) {
64 Measurement meas = Measurement_init_zero;
65
66 meas.has_meta = true;
67
68 meas.meta.ts = ts;
69 meas.meta.logger_id = logger_id;
70 meas.meta.cell_id = cell_id;
71
72 meas.which_measurement = Measurement_teros12_tag;
73 meas.measurement.teros12.vwc_raw = vwc_raw;
74 meas.measurement.teros12.vwc_adj = vwc_adj;
75 meas.measurement.teros12.temp = temp;
76 meas.measurement.teros12.ec = ec;
77
78 return EncodeMeasurement(&meas, buffer);
79}
80
81size_t EncodePhytos31Measurement(uint32_t ts, uint32_t logger_id,
82 uint32_t cell_id, double voltage,
83 double leaf_wetness, uint8_t* buffer) {
84 Measurement meas = Measurement_init_zero;
85
86 meas.has_meta = true;
87
88 meas.meta.ts = ts;
89 meas.meta.logger_id = logger_id;
90 meas.meta.cell_id = cell_id;
91
92 meas.which_measurement = Measurement_phytos31_tag;
93 meas.measurement.phytos31.voltage = voltage;
94 meas.measurement.phytos31.leaf_wetness = leaf_wetness;
95
96 return EncodeMeasurement(&meas, buffer);
97}
98
99size_t EncodeBME280Measurement(uint32_t ts, uint32_t logger_id,
100 uint32_t cell_id, uint32_t pressure,
101 int32_t temperature, uint32_t humidity,
102 uint8_t* buffer) {
103 Measurement meas = Measurement_init_zero;
104
105 meas.has_meta = true;
106
107 meas.meta.ts = ts;
108 meas.meta.logger_id = logger_id;
109 meas.meta.cell_id = cell_id;
110
111 meas.which_measurement = Measurement_bme280_tag;
112 meas.measurement.bme280.pressure = pressure;
113 meas.measurement.bme280.temperature = temperature;
114 meas.measurement.bme280.humidity = humidity;
115
116 return EncodeMeasurement(&meas, buffer);
117}
118
119size_t EncodeTeros21Measurement(uint32_t ts, uint32_t logger_id,
120 uint32_t cell_id, double matric_pot,
121 double temp, uint8_t* buffer) {
122 Measurement meas = Measurement_init_zero;
123
124 meas.has_meta = true;
125
126 meas.meta.ts = ts;
127 meas.meta.logger_id = logger_id;
128 meas.meta.cell_id = cell_id;
129
130 meas.which_measurement = Measurement_teros21_tag;
131 meas.measurement.teros21.matric_pot = matric_pot;
132 meas.measurement.teros21.temp = temp;
133
134 return EncodeMeasurement(&meas, buffer);
135}
136
137size_t EncodeSEN0308Measurement(uint32_t ts, uint32_t logger_id,
138 uint32_t cell_id, double voltage,
139 double humidity, uint8_t* buffer) {
140 Measurement meas = Measurement_init_zero;
141
142 meas.has_meta = true;
143
144 meas.meta.ts = ts;
145 meas.meta.logger_id = logger_id;
146 meas.meta.cell_id = cell_id;
147
148 meas.which_measurement = Measurement_sen0308_tag;
149 meas.measurement.sen0308.voltage = voltage;
150 meas.measurement.sen0308.humidity = humidity;
151
152 return EncodeMeasurement(&meas, buffer);
153}
154
155size_t EncodeWaterPressMeasurement(uint32_t ts, uint32_t logger_id,
156 uint32_t cell_id, double voltage,
157 double water_pressure, uint8_t* buffer) {
158 Measurement meas = Measurement_init_zero;
159
160 meas.has_meta = true;
161
162 meas.meta.ts = ts;
163 meas.meta.logger_id = logger_id;
164 meas.meta.cell_id = cell_id;
165
166 meas.which_measurement = Measurement_sen0257_tag;
167 meas.measurement.sen0257.voltage = voltage;
168 meas.measurement.sen0257.pressure = water_pressure;
169
170 return EncodeMeasurement(&meas, buffer);
171}
172
173size_t EncodeWaterFlowMeasurement(uint32_t ts, uint32_t logger_id,
174 uint32_t cell_id, double water_flow,
175 uint8_t* buffer) {
176 Measurement meas = Measurement_init_zero;
177
178 meas.has_meta = true;
179
180 meas.meta.ts = ts;
181 meas.meta.logger_id = logger_id;
182 meas.meta.cell_id = cell_id;
183
184 meas.which_measurement = Measurement_yfs210c_tag;
185 meas.measurement.yfs210c.flow = water_flow;
186
187 return EncodeMeasurement(&meas, buffer);
188}
189
190size_t EncodePCAP02Measurement(uint32_t ts, uint32_t logger_id,
191 uint32_t cell_id, double capacitance,
192 uint8_t* buffer) {
193 Measurement meas = Measurement_init_zero;
194
195 meas.has_meta = true;
196
197 meas.meta.ts = ts;
198 meas.meta.logger_id = logger_id;
199 meas.meta.cell_id = cell_id;
200
201 meas.which_measurement = Measurement_pcap02_tag;
202 meas.measurement.pcap02.capacitance = capacitance;
203
204 return EncodeMeasurement(&meas, buffer);
205}
206
207Response_ResponseType DecodeResponse(const uint8_t* data, const size_t len) {
208 Response resp;
209
210 // create input buffer
211 pb_istream_t istream = pb_istream_from_buffer(data, len);
212 // decode data and check status
213 bool status = pb_decode(&istream, Response_fields, &resp);
214 if (!status) {
215 return -1;
216 }
217
218 // return response type
219 return resp.resp;
220}
221
222size_t EncodeMeasurement(Measurement* meas, uint8_t* buffer) {
223 // create output stream
224 pb_ostream_t ostream = pb_ostream_from_buffer(buffer, 256);
225 // encode message and check rc
226 bool status = pb_encode(&ostream, Measurement_fields, meas);
227 if (!status) {
228 return -1;
229 }
230
231 // return number of bytes written
232 return ostream.bytes_written;
233}
234
235int DecodeMeasurement(Measurement* meas, const uint8_t* buffer,
236 const size_t len) {
237 pb_istream_t istream = pb_istream_from_buffer(buffer, len);
238 bool status = pb_decode(&istream, Measurement_fields, meas);
239 if (!status) {
240 return -1;
241 }
242
243 return 0;
244}
245
246Esp32Command DecodeEsp32Command(const uint8_t* data, const size_t len) {
247 Esp32Command cmd;
248
249 pb_istream_t istream = pb_istream_from_buffer(data, len);
250 pb_decode(&istream, Esp32Command_fields, &cmd);
251
252 return cmd;
253}
254
255size_t EncodePageCommand(PageCommand_RequestType req, int fd, size_t bs,
256 size_t n, uint8_t* buffer, size_t size) {
257 // create command object
258 Esp32Command cmd = Esp32Command_init_default;
259 cmd.which_command = Esp32Command_page_command_tag;
260 cmd.command.page_command.file_request = req;
261 cmd.command.page_command.file_descriptor = fd;
262 cmd.command.page_command.block_size = bs;
263 cmd.command.page_command.num_bytes = n;
264
265 return EncodeEsp32Command(&cmd, buffer, size);
266}
267
268size_t EncodeTestCommand(TestCommand_ChangeState state, int32_t data,
269 uint8_t* buffer, size_t size) {
270 Esp32Command cmd = Esp32Command_init_default;
271 cmd.which_command = Esp32Command_test_command_tag;
272 cmd.command.test_command.state = state;
273 cmd.command.test_command.data = data;
274
275 return EncodeEsp32Command(&cmd, buffer, size);
276}
277
278size_t EncodeMicroSDCommand(const MicroSDCommand* microsd_cmd, uint8_t* buffer,
279 size_t size) {
280 Esp32Command cmd = Esp32Command_init_default;
281
282 cmd.which_command = Esp32Command_microsd_command_tag;
283
284 // copy data from microsd_cmd to cmd
285 memcpy(&cmd.command.microsd_command, microsd_cmd, sizeof(MicroSDCommand));
286
287 return EncodeEsp32Command(&cmd, buffer, size);
288}
289
290size_t EncodeWiFiCommand(const WiFiCommand* wifi_cmd, uint8_t* buffer,
291 size_t size) {
292 Esp32Command cmd = Esp32Command_init_default;
293
294 cmd.which_command = Esp32Command_wifi_command_tag;
295
296 // copy data from wifi_cmd to cmd
297 memcpy(&cmd.command.wifi_command, wifi_cmd, sizeof(WiFiCommand));
298
299 return EncodeEsp32Command(&cmd, buffer, size);
300}
301
302size_t EncodeUserConfigCommand(UserConfigCommand_RequestType type,
303 const UserConfiguration* config_data,
304 uint8_t* buffer, size_t size) {
305 // Create command object
306 Esp32Command cmd = Esp32Command_init_default;
307 cmd.which_command = Esp32Command_user_config_command_tag;
308 cmd.command.user_config_command.type = type;
309
310 // Only copy config_data if it's provided (for RESPONSE_CONFIG)
311 if (config_data != NULL) {
312 cmd.command.user_config_command.has_config_data = true;
313 memcpy(&cmd.command.user_config_command.config_data, config_data,
314 sizeof(UserConfiguration));
315 } else {
316 cmd.command.user_config_command.has_config_data = false;
317 }
318
319 return EncodeEsp32Command(&cmd, buffer, size);
320}
321
322size_t EncodeIrrigationCommand(const IrrigationCommand* irrigation_cmd,
323 uint8_t* buffer, size_t size) {
324 Esp32Command cmd = Esp32Command_init_default;
325
326 cmd.which_command = Esp32Command_irrigation_command_tag;
327
328 // copy data from irrigation_cmd to cmd
329 memcpy(&cmd.command.irrigation_command, irrigation_cmd,
330 sizeof(IrrigationCommand));
331
332 return EncodeEsp32Command(&cmd, buffer, size);
333}
334
335size_t EncodePowerCommand(const PowerCommand* power_cmd, uint8_t* buffer,
336 size_t size) {
337 Esp32Command cmd = Esp32Command_init_default;
338
339 cmd.which_command = Esp32Command_power_command_tag;
340
341 // copy data from power_cmd to cmd
342 memcpy(&cmd.command.power_command, power_cmd, sizeof(PowerCommand));
343
344 return EncodeEsp32Command(&cmd, buffer, size);
345}
346
347size_t EncodeEsp32Command(const Esp32Command* cmd, uint8_t* buffer,
348 size_t size) {
349 // create output stream
350 pb_ostream_t ostream = pb_ostream_from_buffer(buffer, size);
351 // encode message and check rc
352 bool status = pb_encode(&ostream, Esp32Command_fields, cmd);
353 if (!status) {
354 return -1;
355 }
356
357 // return number of bytes written
358 return ostream.bytes_written;
359}
360
361size_t EncodeUserConfiguration(const UserConfiguration* config,
362 uint8_t* buffer) {
363 // create output stream
364 pb_ostream_t ostream = pb_ostream_from_buffer(buffer, UserConfiguration_size);
365
366 // Encode the UserConfiguration message and check if successful
367 bool status = pb_encode(&ostream, UserConfiguration_fields, config);
368 if (!status) {
369 return 0;
370 }
371
372 // Return the number of bytes written
373 return ostream.bytes_written;
374}
375
376int DecodeUserConfiguration(const uint8_t* data, const size_t len,
377 UserConfiguration* config) {
378 // Create a protobuf input stream from the data buffer
379 pb_istream_t istream = pb_istream_from_buffer(data, len);
380
381 // Decode the UserConfiguration message and check if successful
382 bool status = pb_decode(&istream, UserConfiguration_fields, config);
383 if (!status) {
384 return -1; // Return -1 if there was a decoding error
385 }
386
387 return 0; // Return 0 on success
388}
const char data[]
uint8_t buffer[32]
size_t EncodeTeros21Measurement(uint32_t ts, uint32_t logger_id, uint32_t cell_id, double matric_pot, double temp, uint8_t *buffer)
Encodes a Teros21 measurement.
Definition transcoder.c:119
size_t EncodeWiFiCommand(const WiFiCommand *wifi_cmd, uint8_t *buffer, size_t size)
Encodes a WiFiCommand.
Definition transcoder.c:290
size_t EncodeWaterFlowMeasurement(uint32_t ts, uint32_t logger_id, uint32_t cell_id, double water_flow, uint8_t *buffer)
Encodes a Water Flow measurement.
Definition transcoder.c:173
int DecodeUserConfiguration(const uint8_t *data, const size_t len, UserConfiguration *config)
Decodes user configuration data.
Definition transcoder.c:376
size_t EncodePhytos31Measurement(uint32_t ts, uint32_t logger_id, uint32_t cell_id, double voltage, double leaf_wetness, uint8_t *buffer)
Encodes a Phytos31 measurement.
Definition transcoder.c:81
size_t EncodePageCommand(PageCommand_RequestType req, int fd, size_t bs, size_t n, uint8_t *buffer, size_t size)
Encodes a page command.
Definition transcoder.c:255
Response_ResponseType DecodeResponse(const uint8_t *data, const size_t len)
Decodes a response message.
Definition transcoder.c:207
size_t EncodePCAP02Measurement(uint32_t ts, uint32_t logger_id, uint32_t cell_id, double capacitance, uint8_t *buffer)
Encodes a PCAP02 measurement.
Definition transcoder.c:190
size_t EncodeTestCommand(TestCommand_ChangeState state, int32_t data, uint8_t *buffer, size_t size)
Encodes a test command.
Definition transcoder.c:268
size_t EncodePowerCommand(const PowerCommand *power_cmd, uint8_t *buffer, size_t size)
Encodes a PowerCommand.
Definition transcoder.c:335
size_t EncodeSEN0308Measurement(uint32_t ts, uint32_t logger_id, uint32_t cell_id, double voltage, double humidity, uint8_t *buffer)
Encodes a Capacitive Soil Moisture measurement.
Definition transcoder.c:137
size_t EncodeIrrigationCommand(const IrrigationCommand *irrigation_cmd, uint8_t *buffer, size_t size)
Encodes an IrrigationCommand.
Definition transcoder.c:322
Esp32Command DecodeEsp32Command(const uint8_t *data, const size_t len)
Decodes an Esp32Command message.
Definition transcoder.c:246
size_t EncodePowerMeasurement(uint32_t ts, uint32_t logger_id, uint32_t cell_id, double voltage, double current, uint8_t *buffer)
Encodes a power measurement.
Definition transcoder.c:43
size_t EncodeUserConfigCommand(UserConfigCommand_RequestType type, const UserConfiguration *config_data, uint8_t *buffer, size_t size)
Encodes a UserConfigCommand into a protobuf message.
Definition transcoder.c:302
size_t EncodeBME280Measurement(uint32_t ts, uint32_t logger_id, uint32_t cell_id, uint32_t pressure, int32_t temperature, uint32_t humidity, uint8_t *buffer)
Encodes a BME280 measurement.
Definition transcoder.c:99
size_t EncodeUserConfiguration(const UserConfiguration *config, uint8_t *buffer)
Encodes user configuration data.
Definition transcoder.c:361
size_t EncodeTeros12Measurement(uint32_t ts, uint32_t logger_id, uint32_t cell_id, double vwc_raw, double vwc_adj, double temp, uint32_t ec, uint8_t *buffer)
Encodes a Teros12 measurement.
Definition transcoder.c:60
size_t EncodeWaterPressMeasurement(uint32_t ts, uint32_t logger_id, uint32_t cell_id, double voltage, double water_pressure, uint8_t *buffer)
Encodes a Water Pressure measurement.
Definition transcoder.c:155
size_t EncodeMicroSDCommand(const MicroSDCommand *microsd_cmd, uint8_t *buffer, size_t size)
Encodes a MicroSDCommand.
Definition transcoder.c:278
int DecodeMeasurement(Measurement *meas, const uint8_t *buffer, const size_t len)
Decodes a measurement.
Definition transcoder.c:235
size_t EncodeEsp32Command(const Esp32Command *cmd, uint8_t *buffer, size_t size)
Encodes a esp32command.
Definition transcoder.c:347
size_t EncodeMeasurement(Measurement *meas, uint8_t *buffer)
Encodes a measurement.
Definition transcoder.c:222
Library for encoding/decoding protobuf messages.
UserConfigState state