[Ovmsdev] Ioniq 5 - Pushing up some prerequisite changes to components/vehicles

Michael Geddes frog at bunyip.wheelycreek.net
Sat Oct 22 07:56:20 HKT 2022

Thanks Michael,

I had already created my commits under the assumption that you would prefer
the general changes separate from the vehicle-specific commits.

I have created 3 pull requests so far.
  1) the bug - that's a no-brainer.
  2) 'finalisation' of temperatures and voltages. (Draft, see below)
  3) vector poll. This is more a point of discussion (see below)

A couple of the next bugs are kind of dependent on the second, so I'll wait
until I get that sorted out.

More comments below.

On Fri, 21 Oct 2022 at 23:31, Michael Balzer <dexter at expeedo.de> wrote:

> Michael,
> Am 19.10.22 um 07:26 schrieb Michael Geddes:
> > Hi all,
> >
> > I have 6 commits that I would _like_ to get pushed up that are changes
> > to components/vehicles required for my Ioniq 5 changes to work.
> >
> > I can push them all up in a single merge request for review, or
> > separate them out into bits.  Some of them I am expecting there to be
> > opinions on. I'm prepared to simplify some, and one in particular has
> > grounds for nixing. I think it's a good change, but I could manage
> > without it.
> Please keep PRs as small as possible, focusing on one specific
> modification / addition at a time. That way, every merge commit can
> easily be reverted if necessary, and changes can be followed and
> referred to easily. Especially keep framework changes separate from
> vehicle specific ones.
> It's also OK to open the PRs tagged as drafts / work in progress, that
> helps in commenting on certain parts and tracing refinements. Create one
> branch for each PR, pushing new commits into the branch will
> automatically update any open PR created from it.

Ooh. That's useful. It's been a while since I've used github for collab.
Switched the battery sensor P/R over to a draft.

> > One is a simple bugfix - a literal one-character change:
> > void OvmsVehicle::BmsRestartCellTemperatures()
> >    {
> >    m_bms_bitset_t.clear();
> > -  m_bms_bitset_v.resize(m_bms_readings_t);
> > +  m_bms_bitset_t.resize(m_bms_readings_t);
> >    m_bms_bitset_ct = 0;
> >    }
> Obviously a copy & paste bug, nice find. I wonder how that could slip
> through without causing crashes, as there are more voltages than
> temperatures in most packs.
> Please don't hesitate with opening PRs even for single fixes like this,
> the sooner we include them, the better.

Yep. Done and understood.

> >
> > On is a simple code readability change. Using an enum instead of magic
> > status values for m_bms_talerts.  Simple enough, but I'm prepared to
> > simplify that to a standard enum or get rid of it.
> The magic values are simply alert levels, but go ahead, readability is a
> good goal.
> I'll include it once the Battery Cell code is finalised.

> >
> > There's some battery related ones where I want to be able to not quite
> > know the number of cells from the start and let the OBD responses
> specify.
> Dynamic pack layout reconfiguration is no issue, I've done that on the
> Twizy (look for comments "update pack layout" or calls to
> BmsSetCellArrangement*).
> BmsSetCellArrangement does clear all the values... which is probably the
main thing I was trying to avoid.  Ie- I get to the end and go 'ooh.. only
this number of cells were filled in'.  More comments in the P/R about what
I want to achieve and fall-back positions.

> > There's also a battery one where the info for the cells have different
> > timings (because one has other info), so I want to be able to clear a
> > range of cells rather than just reset and start filling the info again.
> That may be a bad idea, maybe better to implement some synchronization /
> drop readings out of sync.
> Reaching a consistent state, the BMS will calculate deviations etc..
> Crucial on that part is an analysis of the consistency of the cell
> readings to determine the reliability of deviations exceeding thresholds.
> See my comments in BmsSetCellVoltage() and list thread:
> http://lists.openvehicles.com/pipermail/ovmsdev/2021-February/015079.html
> I've skimmed the comments but will read properly and digest.   Yeah it
might be best if I just clear the values at the start of the more often
running one and then once the other ones come in it will finalise once it
gets to the end of those.. so they aren't too far apart.

> >
> > I've modified slightly the dump for the battery cell
> > voltage/temperature, allowing for either or both columns to be visible
> > if available. It also copes with the above 'not set' scenario.
> Sounds good.
I'll push this once the FinaliseCellVoltage pull-request is finalised and

> >
> > Finally, the controversial one:  I am using std::vector<uint8_t> as a
> > buffer in my ioniq5 code.. and I wanted to be able to use it for the
> > polling instead of std::string. I've not replaced the std::string but
> > added the ability to have either.
> >
> > If my aversion to using std::string for binary data is misplaced, then
> > I'm ok with the currently small modification to my code that would use
> > the std::string version.
> The general use case of ISO-TP data is actually dynamic binary strings.
> They are meant to and need to be easily aggregated, cut, merged,
> partially extracted etc., so they really are strings, not vectors (type
> wise).

Hmm.. I'm not sure I entirely agree about needing to aggregate/cut/merge;
we know the size of the buffer after the first packet comes in so we can
pre-set the buffer internal size and append data as it comes in without
casting from uint8_t* to char *.  Even if the size is wrong, we can still
very easily append to a vector.

ON the extraction, I have efficient templated functions that extract the
data from the std::vector<uint8_t> buffer.. including to a std::string if
required, or to big-endian/little-endian signed/unsigned integers of 1..4
bytes with sign-extension now.  These also check bounds so are quite safe -
possibly safer than the macros.  The bounds check has already proved itself

I have pushed up a draft  request 'single poll to buffer' as it is the
easiest way to describe what I want to do.  The first commit is the meat of
the change ... but the second is adding all the utility functions.  They
probably don't belong in vehicle.h/cpp, but that's easy enough to change.
I had them in my ioniq 5 specific code - but have shoved them in there just
for a point of discussion.

The great thing about the template functions here is that they should
expand inline at compile time to quite efficient code.

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

More information about the OvmsDev mailing list