onboardsdk
Loading...
Searching...
No Matches
message_types.hpp
1#pragma once
2
3#include <iomanip>
4#include <iostream>
5#include <sstream>
6#include <string>
7
8namespace blunux::pmu {
9
10constexpr unsigned int NUMBER_OF_CELLS = 4;
11constexpr unsigned int MANUFACTURE_NAME_LENGTH = 21;
12constexpr unsigned int DEVICE_NAME_LENGTH = 21;
13constexpr unsigned int DEVICE_CHEMISTRY = 5;
14
15constexpr unsigned int ESC_SERIAL_LENGTH = 20;
16constexpr unsigned int ESC_UID_LENGTH = 16;
17constexpr unsigned int COMMIT_ID_LENGTH = 7;
18
19enum class EscHwVersion : uint8_t { ipeaka = 0, speedy_bee = 1 };
20
21namespace {
22typedef struct __attribute__((__packed__)) {
23 // Max reported cell voltage, [0, 32767], mV
24 int16_t cell_max_voltages[NUMBER_OF_CELLS];
25 // Min reported cell voltage, [0, 32767], mV
26 int16_t cell_min_voltages[NUMBER_OF_CELLS];
27 // Max delta between cells, [0, 32767], mV
28 int16_t max_delta_cell_voltage;
29 // Max reported current in the charge direction, [0, 32767], mA
30 int16_t max_charge_current;
31 // Max reported current in the discharge direction, [-32768, 0], mA
32 int16_t max_discharge_current;
33 // Max reported average current in the discharge direction, [-32768, 0], mA
34 int16_t max_avg_discharge_current;
35 // Max reported power in discharge direction, [-32768, 0], cW
36 int16_t max_avg_discharge_power;
37 // Max reported cell temperature, [-128, 127], °C
38 int8_t max_cell_temperature;
39 // Min reported cell temperature, [-128, 127], °C
40 int8_t min_cell_temperature;
41 // Max reported temperature delta for TSx inputs configured as cell
42 // temperature, [-128, 127], °C
43 int8_t max_delta_cell_temperature;
44 // Max reported internal temperature sensor temperature, [-128, 127], °C
45 int8_t max_temperature_internal_sensor;
46 // Min reported internal temperature sensor temperature, [-128, 127], °C
47 int8_t min_temperature_internal_sensor;
48 // Max reported FET temperature, [-128, 127], °C
49 int8_t max_temperature_fet;
50} TBatteryLifetimesRaw;
51
52typedef struct __attribute__((__packed__)) {
53 // Number of cell overvoltage (COV) events, [0, 32767], events
54 uint16_t cov_events_count;
55 // Last COV event in cycle count cycles, [0, 32767], cycles
56 uint16_t cov_last_event;
57 // Number of cell undervoltage (CUV) events, [0, 32767], events
58 uint16_t cuv_events_count;
59 // Last CUV event in cycle count cycles, [0, 32767], cycles
60 uint16_t cuv_last_event;
61 // Number of Overcurrent in Discharge 1 (OCD1) events, [0, 32767], events
62 uint16_t ocd1_events_count;
63 // Last OCD1 event in cycle count cycles, [0, 32767], cycles
64 uint16_t ocd1_last_event;
65 // Number of Overcurrent in Discharge 2 (OCD2) events, [0, 32767], events
66 uint16_t ocd2_events_count;
67 // Last OCD2 event in cycle count cycles, [0, 32767], cycles
68 uint16_t ocd2_last_event;
69 // Number of Overcurrent in Charge 1 (OCC1) events, [0, 32767], events
70 uint16_t occ1_events_count;
71 // Last OCC1 event in cycle count cycles, [0, 32767], cycles
72 uint16_t occ1_last_event;
73 // Number of Overcurrent in Charge 2 (OCC2) events, [0, 32767], events
74 uint16_t occ2_events_count;
75 // Last OCC2 event in cycle count cycles, [0, 32767], cycles
76 uint16_t occ2_last_event;
77 // Number of Overload in discharge (AOLD) events, [0, 32767], events
78 uint16_t aold_events_count;
79 // Last AOLD event in cycle count cycles, [0, 32767], cycles
80 uint16_t aold_last_event;
81 // Number of Short Circuit in Discharge (ASCD) events, [0, 32767], events
82 uint16_t ascd_events_count;
83 // Last ASCD event in cycle count cycles, [0, 32767], cycles
84 uint16_t ascd_last_event;
85 // Number of Short Circuit in Charge (ASCC) events, [0, 32767], events
86 uint16_t ascc_events_count;
87 // Last ASCC event in cycle count cycles, [0, 32767], cycles
88 uint16_t ascc_last_event;
89 // Number of Overtemperature in Charge (OTC) events, [0, 32767], events
90 uint16_t otc_events_count;
91 // Last OTC event in cycle count cycles, [0, 32767], cycles
92 uint16_t otc_last_event;
93 // Number of Overtemperature in Discharge (OTD) events, [0, 32767], events
94 uint16_t otd_events_count;
95 // Last OTD event in cycle count cycles, [0, 32767], cycles
96 uint16_t otd_last_event;
97 // Number of Overtemperature in FET (OTF) events, [0, 32767], events
98 uint16_t otf_events_count;
99 // Last OTF event in cycle count cycles, [0, 32767], cycles
100 uint16_t otf_last_event;
101} TBatterySafetyEventsRaw;
102
103typedef struct __attribute__((__packed__)) {
104 // Total number of valid charge termination events, [0, 32767], events
105 uint16_t charge_termination_events_count;
106 // Last valid charge termination in cycle count cycles, [0, 32767], cycles
107 uint16_t charge_termination_last_event;
108} TBatteryChargingEventsRaw;
109
110typedef struct __attribute__((__packed__)) {
111 uint16_t temperature;
112 uint16_t voltage;
113 int32_t current;
114 int32_t average_current;
115
116 uint8_t state_of_charge_rel;
117 uint16_t remaining_capacity;
118 uint16_t full_charge_capacity;
119 uint16_t run_time_to_empty;
120 uint16_t avg_time_to_empty;
121 uint16_t avg_time_to_full;
122 uint16_t at_rate_time_to_full;
123 uint16_t at_rate_time_to_empty;
124
125 uint16_t charging_current;
126 uint16_t charging_voltage;
127
128 uint16_t battery_status;
129
130 uint16_t cell_voltage[NUMBER_OF_CELLS];
131 int16_t cell_temperature[NUMBER_OF_CELLS];
132} TBatteryStatusRaw;
133
134typedef struct __attribute__((__packed__)) {
135 uint8_t max_error;
136 uint8_t abs_soc;
137 uint16_t cycle_count;
138 uint16_t design_capacity;
139 uint16_t manufacture_date;
140 uint16_t serial_number;
141 char manufacture_name[MANUFACTURE_NAME_LENGTH];
142 char device_name[DEVICE_NAME_LENGTH];
143 char device_chemistry[DEVICE_CHEMISTRY];
144 TBatteryLifetimesRaw lifetimes;
145 TBatterySafetyEventsRaw safety_events;
146 TBatteryChargingEventsRaw charging_events;
147} TBatteryInfoRaw;
148
149typedef struct __attribute__((__packed__)) {
150 EscHwVersion hw_version;
151 char serial_number[ESC_SERIAL_LENGTH];
152 char uid[ESC_UID_LENGTH];
153 uint8_t serial_number_read_status;
154 uint8_t uid_read_status;
155 uint8_t hw_version_read_status;
156} TEscInfoRaw;
157
158typedef struct __attribute__((__packed__)) {
159 uint8_t transfer_status;
160} TEscSetSerialReplyRaw;
161
162typedef struct __attribute__((__packed__)) {
163 uint8_t ver_major;
164 uint8_t ver_minor;
165 uint16_t ver_patch;
166 char commit_id[COMMIT_ID_LENGTH];
167} TVersionInfoRaw;
168
169typedef struct __attribute__((__packed__)) {
170 uint8_t humidity_low_byte;
171 uint8_t humidity_high_byte;
172 uint8_t temperature_low_byte;
173 uint8_t temperature_high_byte;
174} TTempHumidityRaw;
175} // namespace
176
178 // Max reported cell voltage, V
179 float cell_max_voltages[NUMBER_OF_CELLS];
180 // Min reported cell voltage, V
181 float cell_min_voltages[NUMBER_OF_CELLS];
182 // Max delta between cells, V
183 float max_delta_cell_voltage;
184 // Max reported current in the charge direction, A
185 float max_charge_current;
186 // Max reported current in the discharge direction, A
187 float max_discharge_current;
188 // Max reported average current in the discharge direction, A
189 float max_avg_discharge_current;
190 // Max reported power in discharge direction, W
191 float max_avg_discharge_power;
192 // Max reported cell temperature, °C
193 float max_cell_temperature;
194 // Min reported cell temperature, °C
195 float min_cell_temperature;
196 // Max reported temperature delta for TSx inputs configured as cell
197 // temperature, °C
198 float max_delta_cell_temperature;
199 // Max reported internal temperature sensor temperature, °C
200 float max_temperature_internal_sensor;
201 // Min reported internal temperature sensor temperature, °C
202 float min_temperature_internal_sensor;
203 // Max reported FET temperature, °C
204 float max_temperature_fet;
205};
206
208 // Number of cell overvoltage (COV) events, [0, 32767], events
209 uint16_t cov_events_count;
210 // Last COV event in cycle count cycles, [0, 32767], cycles
211 uint16_t cov_last_event;
212 // Number of cell undervoltage (CUV) events, [0, 32767], events
213 uint16_t cuv_events_count;
214 // Last CUV event in cycle count cycles, [0, 32767], cycles
215 uint16_t cuv_last_event;
216 // Number of Overcurrent in Discharge 1 (OCD1) events, [0, 32767], events
217 uint16_t ocd1_events_count;
218 // Last OCD1 event in cycle count cycles, [0, 32767], cycles
219 uint16_t ocd1_last_event;
220 // Number of Overcurrent in Discharge 2 (OCD2) events, [0, 32767], events
221 uint16_t ocd2_events_count;
222 // Last OCD2 event in cycle count cycles, [0, 32767], cycles
223 uint16_t ocd2_last_event;
224 // Number of Overcurrent in Charge 1 (OCC1) events, [0, 32767], events
225 uint16_t occ1_events_count;
226 // Last OCC1 event in cycle count cycles, [0, 32767], cycles
227 uint16_t occ1_last_event;
228 // Number of Overcurrent in Charge 2 (OCC2) events, [0, 32767], events
229 uint16_t occ2_events_count;
230 // Last OCC2 event in cycle count cycles, [0, 32767], cycles
231 uint16_t occ2_last_event;
232 // Number of Overload in discharge (AOLD) events, [0, 32767], events
233 uint16_t aold_events_count;
234 // Last AOLD event in cycle count cycles, [0, 32767], cycles
235 uint16_t aold_last_event;
236 // Number of Short Circuit in Discharge (ASCD) events, [0, 32767], events
237 uint16_t ascd_events_count;
238 // Last ASCD event in cycle count cycles, [0, 32767], cycles
239 uint16_t ascd_last_event;
240 // Number of Short Circuit in Charge (ASCC) events, [0, 32767], events
241 uint16_t ascc_events_count;
242 // Last ASCC event in cycle count cycles, [0, 32767], cycles
243 uint16_t ascc_last_event;
244 // Number of Overtemperature in Charge (OTC) events, [0, 32767], events
245 uint16_t otc_events_count;
246 // Last OTC event in cycle count cycles, [0, 32767], cycles
247 uint16_t otc_last_event;
248 // Number of Overtemperature in Discharge (OTD) events, [0, 32767], events
249 uint16_t otd_events_count;
250 // Last OTD event in cycle count cycles, [0, 32767], cycles
251 uint16_t otd_last_event;
252 // Number of Overtemperature in FET (OTF) events, [0, 32767], events
253 uint16_t otf_events_count;
254 // Last OTF event in cycle count cycles, [0, 32767], cycles
255 uint16_t otf_last_event;
256};
257
259 // Total number of valid charge termination events, [0, 32767], events
260 uint16_t charge_termination_events_count;
261 // Last valid charge termination in cycle count cycles, [0, 32767], cycles
262 uint16_t charge_termination_last_event;
263};
264
266 float temperature; // (°C)
267 float voltage; // (V)
268 float current; // (A)
269 float average_current; // (A)
270
271 float state_of_charge_rel; // (0..1)
272 float state_of_charge_calculated; // (0..1)
273 float remaining_capacity; // (Ah)
274 float full_charge_capacity; // (Ah)
275 uint32_t run_time_to_empty; // (s)
276 uint32_t avg_time_to_empty; // (s)
277 uint32_t avg_time_to_full; // (s)
278
279 float charging_current; // (A)
280 float charging_voltage; // (V)
281
282 uint16_t battery_status;
283
284 float cell_voltage[NUMBER_OF_CELLS]; // (V)
285 float cell_temperature[NUMBER_OF_CELLS]; // (°C)
286};
287
289 uint8_t max_error;
290 float abs_soc;
291 uint16_t cycle_count;
292 float design_capacity;
293 tm manufacture_date;
294 uint16_t serial_number;
295 std::string manufacture_name;
296 std::string device_name;
297 std::string device_chemistry;
298 TBatteryLifetimes lifetimes;
299 TBatterySafetyEvents safety_events;
300 TBatteryChargingEvents charging_events;
301};
302
303struct EscUid {
304 char uid[ESC_UID_LENGTH];
305};
306
307enum class PMUI2CStatusCode {
308 Ok, // Transfer completed successfully
309 Busy, // I2C is busy with other transfer
310 Idle, // Bus is idle
311 Nak, // NAK received during transfer
312 ArbitrationLost, // Arbitration lost during transfer
313 Timeout, // Transfer timed out
314 AddressNak, // NAK received during address probe
315 UnknownError, // Unknown error
316};
317
318struct TEscInfo {
319 EscHwVersion hw_version;
320 std::string serial_number;
321 EscUid uid;
322 PMUI2CStatusCode serial_number_read_status;
323 PMUI2CStatusCode uid_read_status;
324 PMUI2CStatusCode hw_version_read_status;
325};
326
328 PMUI2CStatusCode transfer_status;
329};
330
332 uint8_t ver_major = 0;
333 uint8_t ver_minor = 0;
334 uint16_t ver_patch = 0;
335 std::string commit_id = "Unknown";
336};
337
339 double humidity;
340 double temperature;
341};
342
343enum class PMUErrorCode {
344 NoMagicByte,
345 WrongProtocolVersion,
346 UnknownPacketType,
347 CRCError,
348 NoAck,
349 NoVersion,
350 NoEscInfo,
351 NoEscSetSerialReply,
352 NoBatteryInfo,
353};
354
355struct TPMUError {
356 PMUErrorCode errorcode;
357};
358
359} // namespace blunux::pmu
360
361inline std::ostream& operator<<(std::ostream& os,
362 blunux::pmu::EscHwVersion version) {
363 switch (version) {
364 case blunux::pmu::EscHwVersion::ipeaka:
365 return os << "iPeaka";
366 case blunux::pmu::EscHwVersion::speedy_bee:
367 return os << "SpeedyBee";
368 default:
369 return os << static_cast<int>(version);
370 }
371}
372template <>
373struct fmt::formatter<blunux::pmu::EscHwVersion> : formatter<string_view> {
374 // parse is inherited from formatter<string_view>.
375 template <typename FormatContext>
376 // NOLINTNEXTLINE(runtime/references)
377 auto format(blunux::pmu::EscHwVersion version, FormatContext& ctx) const {
378 std::stringstream ss;
379 ss << version;
380 return formatter<string_view>::format(ss.str(), ctx);
381 }
382};
383
384template <>
385struct fmt::formatter<blunux::pmu::EscUid> : formatter<string_view> {
386 // parse is inherited from formatter<string_view>.
387 template <typename FormatContext>
388 // NOLINTNEXTLINE(runtime/references)
389 auto format(blunux::pmu::EscUid uid, FormatContext& ctx) const {
390 std::stringstream ss;
391 ss << std::hex << std::setfill('0');
392 for (unsigned int i = 0; i < blunux::pmu::ESC_UID_LENGTH; i++) {
393 ss << std::setw(2) << std::hex << static_cast<int>(uid.uid[i]);
394 if (i == 3 || i == 5 || i == 7 || i == 9) {
395 ss << "-";
396 }
397 }
398 return formatter<string_view>::format(ss.str(), ctx);
399 }
400};
401
402inline std::ostream& operator<<(std::ostream& os, blunux::pmu::EscUid data) {
403 return os << fmt::format("{}", data);
404}
405
406inline std::ostream& operator<<(std::ostream& os,
408 return os << fmt::format("{}.{}.{} {}", version.ver_major, version.ver_minor,
409 version.ver_patch, version.commit_id);
410}
411
412template <>
413struct fmt::formatter<blunux::pmu::TVersionInfo> : formatter<string_view> {
414 // parse is inherited from formatter<string_view>.
415 template <typename FormatContext>
416 // NOLINTNEXTLINE(runtime/references)
417 auto format(blunux::pmu::TVersionInfo version, FormatContext& ctx) const {
418 std::stringstream ss;
419 ss << version;
420 return formatter<string_view>::format(ss.str(), ctx);
421 }
422};
423
424template <>
425struct fmt::formatter<blunux::pmu::PMUErrorCode> {
426 template <typename ParseContext>
427 // NOLINTNEXTLINE(runtime/references)
428 constexpr auto parse(ParseContext& ctx) {
429 return ctx.begin();
430 }
431 template <typename FormatContext>
432 auto format(blunux::pmu::PMUErrorCode const& error,
433 FormatContext& ctx) const { // NOLINT(runtime/references)
434 switch (error) {
435 case blunux::pmu::PMUErrorCode::NoMagicByte:
436 return fmt::format_to(ctx.out(), "NoMagicByte");
437 case blunux::pmu::PMUErrorCode::WrongProtocolVersion:
438 return fmt::format_to(ctx.out(), "WrongProtocolVersion");
439 case blunux::pmu::PMUErrorCode::UnknownPacketType:
440 return fmt::format_to(ctx.out(), "UnknownPacketType");
441 case blunux::pmu::PMUErrorCode::CRCError:
442 return fmt::format_to(ctx.out(), "CRCError");
443 case blunux::pmu::PMUErrorCode::NoAck:
444 return fmt::format_to(ctx.out(), "NoAck");
445 case blunux::pmu::PMUErrorCode::NoVersion:
446 return fmt::format_to(ctx.out(), "NoVersion");
447 case blunux::pmu::PMUErrorCode::NoEscInfo:
448 return fmt::format_to(ctx.out(), "NoEscInfo");
449 case blunux::pmu::PMUErrorCode::NoEscSetSerialReply:
450 return fmt::format_to(ctx.out(), "NoEscSetSerialReply");
451 case blunux::pmu::PMUErrorCode::NoBatteryInfo:
452 return fmt::format_to(ctx.out(), "NoBatteryInfo");
453 }
454 return fmt::format_to(ctx.out(), "");
455 }
456};
457
458inline std::ostream& operator<<(std::ostream& os,
459 blunux::pmu::PMUErrorCode data) {
460 return os << fmt::format("{}", data);
461}
462
463template <>
464struct fmt::formatter<blunux::pmu::PMUI2CStatusCode> {
465 template <typename ParseContext>
466 // NOLINTNEXTLINE(runtime/references)
467 constexpr auto parse(ParseContext& ctx) {
468 return ctx.begin();
469 }
470 template <typename FormatContext>
471 auto format(blunux::pmu::PMUI2CStatusCode const& status,
472 FormatContext& ctx) const { // NOLINT(runtime/references)
473 switch (status) {
474 case blunux::pmu::PMUI2CStatusCode::Ok:
475 return fmt::format_to(ctx.out(), "Ok");
476 case blunux::pmu::PMUI2CStatusCode::Busy:
477 return fmt::format_to(ctx.out(), "Busy");
478 case blunux::pmu::PMUI2CStatusCode::Idle:
479 return fmt::format_to(ctx.out(), "Idle");
480 case blunux::pmu::PMUI2CStatusCode::Nak:
481 return fmt::format_to(ctx.out(), "Nak");
482 case blunux::pmu::PMUI2CStatusCode::ArbitrationLost:
483 return fmt::format_to(ctx.out(), "ArbitrationLost");
484 case blunux::pmu::PMUI2CStatusCode::Timeout:
485 return fmt::format_to(ctx.out(), "Timeout");
486 case blunux::pmu::PMUI2CStatusCode::AddressNak:
487 return fmt::format_to(ctx.out(), "AddressNak");
488 case blunux::pmu::PMUI2CStatusCode::UnknownError:
489 return fmt::format_to(ctx.out(), "UnknownError");
490 }
491 return fmt::format_to(ctx.out(), "");
492 }
493};
494
495inline std::ostream& operator<<(std::ostream& os,
496 blunux::pmu::PMUI2CStatusCode data) {
497 return os << fmt::format("{}", data);
498}
499
500template <>
501struct fmt::formatter<blunux::pmu::TPMUError> {
502 template <typename ParseContext>
503 // NOLINTNEXTLINE(runtime/references)
504 constexpr auto parse(ParseContext& ctx) {
505 return ctx.begin();
506 }
507
508 template <typename FormatContext>
509 // NOLINTNEXTLINE(runtime/references)
510 auto format(blunux::pmu::TPMUError const& error, FormatContext& ctx) const {
511 return fmt::format_to(ctx.out(), "{}", error.errorcode);
512 }
513};
514
515inline std::ostream& operator<<(std::ostream& os, blunux::pmu::TPMUError data) {
516 return os << fmt::format("{}", data);
517}
518
519inline std::ostream& operator<<(std::ostream& os,
520 blunux::pmu::TEscInfo esc_info) {
521 return os << fmt::format(
522 "HW version: {}\nHW version transfer status: {}\nSerial: "
523 "{}\nSerial transfer status: {}\nUID: {}\nUID transfer status: {}",
524 esc_info.hw_version, esc_info.hw_version_read_status,
525 esc_info.serial_number, esc_info.serial_number_read_status,
526 esc_info.uid, esc_info.uid_read_status);
527}
528
529template <>
530struct fmt::formatter<blunux::pmu::TEscInfo> : formatter<string_view> {
531 // parse is inherited from formatter<string_view>.
532 template <typename FormatContext>
533 // NOLINTNEXTLINE(runtime/references)
534 auto format(blunux::pmu::TEscInfo esc_info, FormatContext& ctx) const {
535 std::stringstream ss;
536 ss << esc_info;
537 return formatter<string_view>::format(ss.str(), ctx);
538 }
539};
540
541template <>
542struct fmt::formatter<blunux::pmu::TBatteryInfo> : formatter<string_view> {
543 // parse is inherited from formatter<string_view>.
544 template <typename FormatContext>
545 auto format(blunux::pmu::TBatteryInfo battery_info,
546 // NOLINTNEXTLINE(runtime/references)
547 FormatContext& ctx) const {
548 std::stringstream ss;
549 ss << "Max Error: " << static_cast<int>(battery_info.max_error) << " %\n"
550 << "Absolute SOC: " << static_cast<int>(battery_info.abs_soc * 100)
551 << " %\n"
552 << "Cycle Count: " << battery_info.cycle_count << "\n"
553 << "Design Capacity: " << battery_info.design_capacity << " Ah\n"
554 << "Manufacture Date: " << battery_info.manufacture_date.tm_year << "-"
555 << battery_info.manufacture_date.tm_mon << "-"
556 << battery_info.manufacture_date.tm_mday << "\n"
557 << "Serial Number: " << battery_info.serial_number << "\n"
558 << "Manufacture Name: " << battery_info.manufacture_name << "\n"
559 << "Device Name: " << battery_info.device_name << "\n"
560 << "Device Chemistry: " << battery_info.device_chemistry << "\n"
561
562 << "Max Cell Voltage: [";
563 for (uint8_t i = 0; i < blunux::pmu::NUMBER_OF_CELLS; i++) {
564 ss << battery_info.lifetimes.cell_max_voltages[i];
565 if (i < blunux::pmu::NUMBER_OF_CELLS - 1) {
566 ss << ", ";
567 }
568 }
569 ss << "] (mV)\nMin Cell Voltage: [";
570 for (uint8_t i = 0; i < blunux::pmu::NUMBER_OF_CELLS; i++) {
571 ss << battery_info.lifetimes.cell_min_voltages[i];
572 if (i < blunux::pmu::NUMBER_OF_CELLS - 1) {
573 ss << ", ";
574 }
575 }
576
577 ss << "] (mV)\n";
578
579 ss << "Max Delta Cell Voltage: "
580 << battery_info.lifetimes.max_delta_cell_voltage << " mV\n"
581 << "Max Charge Current: " << battery_info.lifetimes.max_charge_current
582 << "mA\n"
583 << "Max Discharge Current: "
584 << battery_info.lifetimes.max_discharge_current << " mA\n"
585 << "Max Avg Discharge Current: "
586 << battery_info.lifetimes.max_avg_discharge_current << " mA\n"
587 << "Max Avg Discharge Power: "
588 << battery_info.lifetimes.max_avg_discharge_power << " cW\n"
589 << "Max Cell Temperature: "
590 << static_cast<int>(battery_info.lifetimes.max_cell_temperature)
591 << " °C\n"
592 << "Min Cell Temperature: "
593 << static_cast<int>(battery_info.lifetimes.min_cell_temperature)
594 << " °C\n"
595 << "Max Delta Cell Temperature: "
596 << static_cast<int>(battery_info.lifetimes.max_delta_cell_temperature)
597 << " °C\n"
598 << "Max Temperature Internal Sensor: "
599 << static_cast<int>(
600 battery_info.lifetimes.max_temperature_internal_sensor)
601 << " °C\n"
602 << "Min Temperature Internal Sensor: "
603 << static_cast<int>(
604 battery_info.lifetimes.min_temperature_internal_sensor)
605 << " °C\n"
606 << "Max Temperature FET: "
607 << static_cast<int>(battery_info.lifetimes.max_temperature_fet)
608 << " °C\n"
609 << "Number of COV events: "
610 << battery_info.safety_events.cov_events_count
611 << ", last occurred cycle " << battery_info.safety_events.cov_last_event
612 << "\n"
613 << "Number of CUV events: "
614 << battery_info.safety_events.cuv_events_count
615 << ", last occurred cycle " << battery_info.safety_events.cuv_last_event
616 << "\n"
617 << "Number of OCD1 events: "
618 << battery_info.safety_events.ocd1_events_count
619 << ", last occurred cycle " << battery_info.safety_events.ocd1_last_event
620 << "\n"
621 << "Number of OCD2 events: "
622 << battery_info.safety_events.ocd2_events_count
623 << ", last occurred cycle " << battery_info.safety_events.ocd2_last_event
624 << "\n"
625 << "Number of OCC1 events: "
626 << battery_info.safety_events.occ1_events_count
627 << ", last occurred cycle " << battery_info.safety_events.occ1_last_event
628 << "\n"
629 << "Number of OCC2 events: "
630 << battery_info.safety_events.occ2_events_count
631 << ", last occurred cycle " << battery_info.safety_events.occ2_last_event
632 << "\n"
633 << "Number of AOLD events: "
634 << battery_info.safety_events.aold_events_count
635 << ", last occurred cycle " << battery_info.safety_events.aold_last_event
636 << "\n"
637 << "Number of ASCD events: "
638 << battery_info.safety_events.ascd_events_count
639 << ", last occurred cycle " << battery_info.safety_events.ascd_last_event
640 << "\n"
641 << "Number of ASCC events: "
642 << battery_info.safety_events.ascc_events_count
643 << ", last occurred cycle " << battery_info.safety_events.ascc_last_event
644 << "\n"
645 << "Number of OTC events: "
646 << battery_info.safety_events.otc_events_count
647 << ", last occurred cycle " << battery_info.safety_events.otc_last_event
648 << "\n"
649 << "Number of OTD events: "
650 << battery_info.safety_events.otd_events_count
651 << ", last occurred cycle " << battery_info.safety_events.otd_last_event
652 << "\n"
653 << "Number of OTF events: "
654 << battery_info.safety_events.otf_events_count
655 << ", last occurred cycle " << battery_info.safety_events.otf_last_event
656 << "\n"
657 << "Number of Charge Termination events: "
658 << battery_info.charging_events.charge_termination_events_count
659 << ", last occurred cycle "
660 << battery_info.charging_events.charge_termination_last_event;
661
662 return formatter<string_view>::format(ss.str(), ctx);
663 }
664};
665
666inline std::ostream& operator<<(std::ostream& os,
667 blunux::pmu::TBatteryInfo battery_info) {
668 return os << fmt::format("{}", battery_info);
669}
Definition message_types.hpp:303
Definition message_types.hpp:258
Definition message_types.hpp:288
Definition message_types.hpp:177
Definition message_types.hpp:207
Definition message_types.hpp:265
Definition message_types.hpp:318
Definition message_types.hpp:327
Definition message_types.hpp:355
Definition message_types.hpp:338
Definition message_types.hpp:331