rusEFI
The most advanced open source ECU
Loading...
Searching...
No Matches
log_field.cpp
Go to the documentation of this file.
1#include "pch.h"
2#include "log_field.h"
3#include "buffered_writer.h"
4
5#include <cstring>
6
7static void memcpy_swapend(void* dest, const void* src, size_t num, void *offset) {
8 const char* src2 = reinterpret_cast<const char*>(src);
9 char* dest2 = reinterpret_cast<char*>(dest);
10 for (size_t i = 0; i < num; i++) {
11 // Endian swap - copy the end to the beginning
12 dest2[i] = src2[num - 1 - i + (uint64_t)offset];
13 }
14}
15
16static void copyFloat(char* buffer, float value) {
17 memcpy_swapend(buffer, reinterpret_cast<char*>(&value), sizeof(float), nullptr);
18}
19
20size_t LogField::writeHeader(Writer& outBuffer) const {
21 char buffer[MLQ_FIELD_HEADER_SIZE];
22
23 // Offset 0, length 1 = type
24 buffer[0] = static_cast<char>(m_type);
25
26 // Offset 1, length 34 = name
27 strncpy(&buffer[1], m_name, 34);
28
29 // Offset 35, length 10 = units
30 strncpy(&buffer[35], m_units, 10);
31
32 // Offset 45, length 1 = Display style
33 // value 0 -> floating point number
34 buffer[45] = 0;
35
36 // Offset 46, length 4 = Scale
38
39 // Offset 50, length 4 = shift before scaling (always 0)
40 copyFloat(buffer + 50, 0);
41
42 // Offset 54, size 1 = digits to display (signed int)
43 buffer[54] = m_digits;
44
45 // Offset 55, (optional) category string
46 if (m_category) {
47 size_t categoryLength = strlen(m_category);
48 size_t lengthAfterCategory = 34 - categoryLength;
49 memcpy(&buffer[55], m_category, categoryLength);
50 memset(&buffer[55] + categoryLength, 0, lengthAfterCategory);
51 } else {
52 memset(&buffer[55], 0, 34);
53 }
54
55 // Total size = 89
56 outBuffer.write(buffer, MLQ_FIELD_HEADER_SIZE);
57
58 return MLQ_FIELD_HEADER_SIZE;
59}
60
61size_t LogField::writeData(char* buffer, void *offset) const {
62 if (m_isBitField) {
63 const char* const bitsBlockAddr = static_cast<const char*>(m_addr) + m_bitsBlockOffset;
64 const char* const byteWithBitAddr = bitsBlockAddr + m_bitNumber / 8;
65 unsigned char byteWithBit = 0;
66 memcpy_swapend(&byteWithBit, byteWithBitAddr, 1, offset);
67 const uint8_t bitNumberInByte = m_bitNumber % 8;
68 buffer[0] = static_cast<char>(static_cast<bool>(byteWithBit & (1 << bitNumberInByte)));
69 } else {
71 }
72
73 return m_size;
74}
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
size_t writeData(char *buffer, void *offset) const
Definition log_field.cpp:61
const uint8_t m_bitNumber
Definition log_field.h:131
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
const float m_multiplier
Definition log_field.h:119
const void *const m_addr
Definition log_field.h:120
static void memcpy_swapend(void *dest, const void *src, size_t num, void *offset)
Definition log_field.cpp:7
static void copyFloat(char *buffer, float value)
Definition log_field.cpp:16
virtual size_t write(const char *buffer, size_t count)=0
static BigBufferHandle buffer
uint16_t offset
Definition tunerstudio.h:0