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.
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 accepted.
>
> 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 useful.
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
//.ichael