rusEFI
The most advanced open source ECU
Loading...
Searching...
No Matches
log_field.h
Go to the documentation of this file.
1#pragma once
2
4#include "rusefi_types.h"
5#include <cstdint>
6#include <cstddef>
7
8struct Writer;
9class LogField {
10public:
11 // Scaled channels, memcpys data directly and describes format in header
12 template <typename TValue, int TMult, int TDiv>
13 constexpr LogField(const scaled_channel<TValue, TMult, TDiv>& toRead,
14 const char* name, const char* units, int8_t digits, const char* category = "none")
15 : m_multiplier(float(TDiv) / TMult)
16 , m_addr(toRead.getFirstByteAddr())
17 , m_type(resolveType<TValue>())
18 , m_digits(digits)
19 , m_size(sizeForType(resolveType<TValue>()))
20 , m_name(name)
21 , m_units(units)
22 , m_category(category)
23 , m_isBitField(false)
25 , m_bitNumber(0)
26 {
27 }
28
29 // Non-scaled channel, works for plain arithmetic types (int, float, uint8_t, etc)
30 template <typename TValue, typename = typename std::enable_if<std::is_arithmetic_v<TValue>>::type>
31 constexpr LogField(TValue& toRead,
32 const char* name, const char* units, int8_t digits, const char* category = "none")
33 : m_multiplier(1)
34 , m_addr(&toRead)
35 , m_type(resolveType<TValue>())
36 , m_digits(digits)
37 , m_size(sizeForType(resolveType<TValue>()))
38 , m_name(name)
39 , m_units(units)
40 , m_category(category)
41 , m_isBitField(false)
43 , m_bitNumber(0)
44 {
45 }
46
47 // Bit channel
48 template <typename TValue>
49 constexpr LogField(
50 TValue& toRead,
51 const uint32_t bitsBlockOffset,
52 const uint8_t bitNumber,
53 const char* name,
54 const char* units,
55 const char* category = "none"
56 ): m_multiplier(1)
57 , m_addr(&toRead)
58 , m_type(Type::U08)
59 , m_digits(0)
60 , m_size(1)
61 , m_name(name)
62 , m_units(units)
63 , m_category(category)
64 , m_isBitField(true)
65 , m_bitsBlockOffset(bitsBlockOffset)
66 , m_bitNumber(bitNumber)
67 {}
68
69 enum class Type : uint8_t {
70 // NOTE THAT Ordinals are part of logging serialization as described in
71 // https://www.efianalytics.com/TunerStudio/docs/MLG_Binary_LogFormat_2.0.pdf
72 U08 = 0,
73 S08 = 1,
74 U16 = 2,
75 S16 = 3,
76 U32 = 4,
77 S32 = 5,
78 S64 = 6,
79 F32 = 7,
80 };
81
82 constexpr size_t getSize() const {
83 return m_size;
84 }
85
86 // Write the header data describing this field.
87 // Returns the number of bytes written.
88 size_t writeHeader(Writer& outBuffer) const;
89
90 // Write the field's data to the buffer.
91 // Returns the number of bytes written.
92 size_t writeData(char* buffer, void *offset) const;
93
94#if EFI_UNIT_TEST
95 bool needsEngineOffsetHack(size_t size) const {
96 // low addresses are offsets without engine reference
97 return (intptr_t)m_addr < size;
98 }
99#endif
100
101private:
102 template<typename T>
103 static constexpr Type resolveType();
104
105 static constexpr size_t sizeForType(Type t) {
106 switch (t) {
107 case Type::U08:
108 case Type::S08:
109 return 1;
110 case Type::U16:
111 case Type::S16:
112 return 2;
113 default:
114 // float, uint32, int32
115 return 4;
116 }
117 }
118
119 const float m_multiplier;
120 const void* const m_addr;
122 const int8_t m_digits;
123 const uint8_t m_size;
124
125 const char* const m_name;
126 const char* const m_units;
127 const char* const m_category;
128
129 const bool m_isBitField;
130 const uint32_t m_bitsBlockOffset; // only for bit log fields
131 const uint8_t m_bitNumber; // only for bit log fields
132};
133
134template<>
135constexpr LogField::Type LogField::resolveType<const uint8_t>() {
136 return Type::U08;
137}
138
139template<>
140constexpr LogField::Type LogField::resolveType<uint8_t>() {
141 return Type::U08;
142}
143
144template<>
145constexpr LogField::Type LogField::resolveType<int8_t>() {
146 return Type::S08;
147}
148
149template<>
150constexpr LogField::Type LogField::resolveType<const int8_t>() {
151 return Type::S08;
152}
153
154template<>
155constexpr LogField::Type LogField::resolveType<uint16_t>() {
156 return Type::U16;
157}
158
159
160template<>
161constexpr LogField::Type LogField::resolveType<const uint16_t>() {
162 return Type::U16;
163}
164
165template<>
166constexpr LogField::Type LogField::resolveType<int16_t>() {
167 return Type::S16;
168}
169
170template<>
171constexpr LogField::Type LogField::resolveType<uint32_t>() {
172 return Type::U32;
173}
174
175#if EFI_PROD_CODE
176// we allow both 'int' and 'int32_t' just to allow extra flexibility in headers
177// https://stackoverflow.com/questions/55782246/why-is-uint32-t-typedeffed-to-unsigned-long-on-arm-none-eabi-gcc-and-how-to
178template<>
179constexpr LogField::Type LogField::resolveType<int>() {
180 return Type::S32;
181}
182#endif
183
184template<>
185constexpr LogField::Type LogField::resolveType<int32_t>() {
186 return Type::S32;
187}
188
189template<>
190constexpr LogField::Type LogField::resolveType<float>() {
191 return Type::F32;
192}
193
194template<>
195constexpr LogField::Type LogField::resolveType<const float>() {
196 return Type::F32;
197}
const Type m_type
Definition log_field.h:121
const bool m_isBitField
Definition log_field.h:129
const int8_t m_digits
Definition log_field.h:122
bool needsEngineOffsetHack(size_t size) const
Definition log_field.h:95
size_t writeData(char *buffer, void *offset) const
Definition log_field.cpp:61
static constexpr size_t sizeForType(Type t)
Definition log_field.h:105
const uint8_t m_bitNumber
Definition log_field.h:131
constexpr size_t getSize() const
Definition log_field.h:82
constexpr LogField(TValue &toRead, const char *name, const char *units, int8_t digits, const char *category="none")
Definition log_field.h:31
const char *const m_category
Definition log_field.h:127
const char *const m_units
Definition log_field.h:126
const uint8_t m_size
Definition log_field.h:123
const char *const m_name
Definition log_field.h:125
const uint32_t m_bitsBlockOffset
Definition log_field.h:130
size_t writeHeader(Writer &outBuffer) const
Definition log_field.cpp:20
constexpr LogField(TValue &toRead, const uint32_t bitsBlockOffset, const uint8_t bitNumber, const char *name, const char *units, const char *category="none")
Definition log_field.h:49
constexpr LogField(const scaled_channel< TValue, TMult, TDiv > &toRead, const char *name, const char *units, int8_t digits, const char *category="none")
Definition log_field.h:13
static constexpr Type resolveType()
const float m_multiplier
Definition log_field.h:119
const void *const m_addr
Definition log_field.h:120
composite packet size
static BigBufferHandle buffer
uint16_t offset
Definition tunerstudio.h:0