From fa09dc8c7155e0618c647723d700b02f0891453b Mon Sep 17 00:00:00 2001 From: Carsten Schmiemann Date: Tue, 1 Nov 2022 14:21:27 +0100 Subject: [PATCH] Original project changes: fix negative integer DBC numbers having wrong values --- OVMS.V3/components/dbc/src/dbc.cpp | 6 ++++-- OVMS.V3/main/ovms_utils.h | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/OVMS.V3/components/dbc/src/dbc.cpp b/OVMS.V3/components/dbc/src/dbc.cpp index a0a8644..503e041 100644 --- a/OVMS.V3/components/dbc/src/dbc.cpp +++ b/OVMS.V3/components/dbc/src/dbc.cpp @@ -830,8 +830,10 @@ dbcNumber dbcSignal::Decode(CAN_frame_t* msg) if (m_value_type == DBC_VALUETYPE_UNSIGNED) result.Cast((uint32_t)val, DBC_NUMBER_INTEGER_UNSIGNED); - else - result.Cast((uint32_t)val, DBC_NUMBER_INTEGER_SIGNED); + else { + int32_t signed_val = sign_extend((uint32_t)val, m_signal_size-1); + result.Cast(static_cast(signed_val), DBC_NUMBER_INTEGER_SIGNED); + } // Apply factor and offset if (!(m_factor == 1)) diff --git a/OVMS.V3/main/ovms_utils.h b/OVMS.V3/main/ovms_utils.h index 55be399..cae50ed 100644 --- a/OVMS.V3/main/ovms_utils.h +++ b/OVMS.V3/main/ovms_utils.h @@ -338,4 +338,18 @@ double float2double(float f); std::string idtag(const char* tag, void* instance); #define IDTAG idtag(TAG,this) +/** + * sign_extend: Sign extend an unsigned to a signed integer of the same size. + */ +template +INT sign_extend(UINT uvalue, uint8_t signbit) + { + typedef typename std::make_unsigned::type uint_t; + uint_t newuvalue = uvalue; + if (newuvalue & (UINT(1U) << signbit)) { + newuvalue |= ~((uint_t(1U) << signbit) - 1); + } + return reinterpret_cast(newuvalue); + } + #endif // __OVMS_UTILS_H__