[Ovmsdev] DBC : proposal fix for negative integer numbers having wrong values

Ludovic LANGE ll-ovmsdev at lange.nom.fr
Sat Oct 22 21:08:05 HKT 2022


Hi Michael,

Thank you a lot for your message... however I must admit my complete 
ignorance (and lack of practice) of the whole C++ / templating world. I 
mean that I cannot understand (yet) your template version - such a shame 
; nor adapt it to this fix.

Just if you have a few minutes to enlighten me : if we were to look at 
the proposed patch here 
https://github.com/openvehicles/Open-Vehicle-Monitoring-System-3/pull/736/files 
; and if we would introduce your template implementation, how should we 
rewrite the "patched" version to make use of this implementation ?

    result.Cast((uint32_t)SIGNEX(val, m_signal_size-1),
    DBC_NUMBER_INTEGER_SIGNED);

(my naïve attempts all failed compilation with all sorts of "error: use 
of 'this' in a constant expression" and "error: no matching function for 
call to 'sign_extend(uint64_t&)'" so a little help would be appreciated)

Additionally, could you please expand a little on the benefits it adds - 
you're talking about type-safety, if you could just illustrate it in 
this context ?

Sorry for being ignorant on this subject.

Regards,

Ludovic


Le 14/10/2022 à 10:40, Michael Geddes a écrit :
> OOH.. nice one. I had missed that in my template implementation.  I'm 
> a big fan of using C++ templating to do type-safe versions of this 
> kind of stuff...   This is my template version:
> /** Sign extend an unsigned to a signed integer of the same size.
>  */
> template<typename UINT, typename INT, uint8_t SIGNBIT>
> INT sign_extend( UINT uvalue)
> {
>   typedef typename std::make_unsigned<INT>::type uint_t;
>   uint_t newuvalue = uvalue;
>   if ( newuvalue & ( UINT(1U) << SIGNBIT) ) {
>     newuvalue |= ~((uint_t(1U) << SIGNBIT) - 1);
>   }
>   return reinterpret_cast<INT &>(uvalue);
> }
> It could probably be converted into a version that would infer some of 
> the types.. but this should work pretty well and should compile down 
> to close to the same code.
> Usage from my code: Where BYTES is a templated integer value parameter.
>  res = sign_extend < uint32_t, int32_t, BYTES * 8 - 1 > (ures);
>
> I also have a templated buffer extractor that allows for checking 
> available space!
> For example this code (which extracts 2 bytes as a signed integer), 
> which should now work with sign extension thanks to your bugfix and 
> the above templated version of sign extension:
>
>          int32_t signedValue;
>          if (!can_buff_int<2>(data, 10, signedValue )) {
>            ESP_LOGE(TAG, "IoniqISOTP.BMC: BMS Current: Bad Buffer");
>          } else {
>  StdMetrics.ms_v_bat_current->SetValue((float)signedValue / 10.0, Amps);
>          }
>
> //.ichael
>
>
>
>
> On Fri, 14 Oct 2022 at 05:35, Ludovic LANGE <ll-ovmsdev at lange.nom.fr> 
> wrote:
>
>     Dear list,
>
>     I've come across an issue with the DBC parser where a non-32-bit
>     negative number was incorrectly decoded.
>
>     I've traced this to an issue with sign-extension ; and I've
>     proposed a fix here
>     https://github.com/openvehicles/Open-Vehicle-Monitoring-System-3/pull/736
>
>     Before having it merged, I'd like to gather some feedback from
>     users of the DBC module.
>
>     Please have a look, and comment directly on the GitHub PR.
>
>     Thanks in advance !
>
>     Regards,
>
>     Ludovic
>
>     _______________________________________________
>     OvmsDev mailing list
>     OvmsDev at lists.openvehicles.com
>     http://lists.openvehicles.com/mailman/listinfo/ovmsdev
>
>
> _______________________________________________
> OvmsDev mailing list
> OvmsDev at lists.openvehicles.com
> http://lists.openvehicles.com/mailman/listinfo/ovmsdev

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openvehicles.com/pipermail/ovmsdev/attachments/20221022/75ca8169/attachment-0001.htm>


More information about the OvmsDev mailing list