<div dir="auto"><div>Sure.</div><div dir="auto">That could work. I'll give it a go.</div><div dir="auto"><br></div><div dir="auto">//.<br><br><div class="gmail_quote" dir="auto"><div dir="ltr" class="gmail_attr">On Mon, 8 July 2024, 00:30 Michael Balzer via OvmsDev, <<a href="mailto:ovmsdev@lists.openvehicles.com">ovmsdev@lists.openvehicles.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><u></u>
<div>
Think of the tracing control in terms of a UI context: you would
normally represent the bits by checkboxes, which could either react
immediately on change or combined by a "Configure" button. In either
case, you'd curse an API for needing different commands to be called
depending on which checkbox combination has been set.<br>
<br>
Exposing bits directly (sort of) though is new to our API, not sure
if I would do that. I'd rather introduce a call with an object
argument for readability, resulting in an API call like …<br>
<br>
<font face="monospace"> OvmsPoller.Trace({ poller: true, txrx:
false });</font><br>
<br>
… with defaults false for both members, so both are optional.
Accordingly, `OvmsPoller.GetTraceStatus()` would return that very
same object.<br>
<br>
Regards,<br>
Michael<br>
<br>
<br>
<div>Am 07.07.24 um 02:43 schrieb Michael
Geddes:<br>
</div>
<blockquote type="cite">
<div dir="ltr">Soo.. for the start stop of the Poller itself we
still have
<blockquote style="margin:0 0 0 40px;border:none;padding:0px">
<div><font face="monospace">OvmsPoller.Pause</font></div>
<div><font face="monospace">OvmsPoller.Resume</font></div>
</blockquote>
<blockquote style="margin:0 0 0 40px;border:none;padding:0px">
<div><font face="monospace">print(OvmsPoller.GetUserPaused())</font></div>
</blockquote>
<div>then for the timer we now have</div>
<blockquote style="margin:0 0 0 40px;border:none;padding:0px">
<div><font face="monospace">OvmsPoller.Times.Start</font></div>
<span style="font-family:monospace">OvmsPoller.Times.Stop</span>
<div><font face="monospace">print(</font>
<span style="font-family:monospace">OvmsPoller.Times.GetStarted())</span> </div>
</blockquote>
<div>
<div><br>
</div>
<div>For the tracing (which is simply setting 2 bits) I'm torn
between having the following mirroring the commands:</div>
</div>
<blockquote style="margin:0 0 0 40px;border:none;padding:0px">
<div>
<div><font face="monospace">OvmsPoller.Trace.On(), </font></div>
</div>
<div>
<div><font face="monospace">OvmsPoller.Trace.TxRx()</font></div>
</div>
<div>
<div><font face="monospace">OvmsPoller.Trace.AllOn()</font></div>
</div>
<div>
<div><font face="monospace">OvmsPoller.Trace.Off()</font></div>
</div>
</blockquote>
<blockquote style="margin:0 0 0 40px;border:none;padding:0px">
<div><font face="monospace">print(OvmsPoller.Trace.GetStatus())</font></div>
</blockquote>
<div>
<div>Or to have 2 properties 'Trace.Poller' and 'Trace.TxRx'
with "C" getter/setter (which I have implemented
successfully)</div>
</div>
<blockquote style="margin:0 0 0 40px;border:none;padding:0px">
<div>
<div><font face="monospace">OvmsPoller.Trace.Poller = true</font></div>
</div>
<div>
<div><font face="monospace">OvmsPoller.Trace.TxRx = false</font></div>
</div>
<div><font face="monospace">print(OvmsPoller.Trace.Poller)</font></div>
</blockquote>
<div><br>
</div>
<div>I don't know about the existing GetTrace() and
SetTrace("on") - it does work but it's a bit clunky</div>
<div><br>
</div>
The registering of the getter/setters was a bit of work - but in
the end looks like this in code!<br>
<blockquote style="margin:0 0 0 40px;border:none;padding:0px">
<div> Dukta<font face="monospace">peObjectRegistration*
dto_trace =</font></div>
<div><font face="monospace"> new
DuktapeObjectRegistration("OvmsPollerTrace");</font></div>
<div><font face="monospace">
dto_trace->RegisterDuktapeProperty(DukOvmsPollerTracePollerGet,DukOvmsPollerTracePollerSet,
0, "Poller");</font></div>
<div><font face="monospace">
dto_trace->RegisterDuktapeProperty(DukOvmsPollerTraceTxRxGet,DukOvmsPollerTraceTxRxSet,
0, "TxRx");</font></div>
<div><font face="monospace">
dto->RegisterDuktapeObject(dto_trace, "Trace");</font></div>
</blockquote>
<div><br>
</div>
<div>I do like the splitting of functionality using 'Trace' and
'Times' to mirror sub-commands.</div>
<div><br>
</div>
<div>Thoughts?</div>
<div><br>
</div>
<div>//.ichael</div>
</div>
<br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On Sat, 6 Jul 2024 at 16:07,
Michael Geddes <<a href="mailto:frog@bunyip.wheelycreek.net" target="_blank" rel="noreferrer">frog@bunyip.wheelycreek.net</a>>
wrote:<br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div dir="auto">
<div dir="auto">I'll change SetUserPaused. I flip flopped a
bit on that so happy to go with your suggestion which
makes sense.</div>
<div dir="auto"><br>
</div>
<div>The order doesn't matter on the dictionary. A lot of
JSON serialised like to alphabetise so aware of that.</div>
<div dir="auto">Anyway internally it's a map which doesn't
guarantee order afaik. Could be in hash order anyway!</div>
<div dir="auto"><br>
</div>
<div dir="auto">Also That's partly why I had separate total
properties on the base object.</div>
<div dir="auto"><br>
</div>
<div dir="auto">Michael. <br>
<br>
<div class="gmail_quote" dir="auto">
<div dir="ltr" class="gmail_attr">On Sat, 6 July 2024,
14:54 Michael Balzer via OvmsDev, <<a href="mailto:ovmsdev@lists.openvehicles.com" target="_blank" rel="noreferrer">ovmsdev@lists.openvehicles.com</a>>
wrote:<br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div> Michael,<br>
<br>
looks good to me.<br>
<br>
IMO API calls representing direct shell commands
should not be represented as getters/setters in the
JS API, so ".Pause()" & ".Resume()" are better.
They are also more readable (e.g. "Resume()" vs
"SetUserPaused(false)") and leave room for future
command specific arguments.<br>
<br>
Using an object structure is OK for the times,
unless you want/need to make sure the same order as
with the other outputs (shell/data) will be kept
stable on any object transformation or transfer.
Object properties (if they are strings) are normally
kept in insertion order, but only within Javascript.
When deserializing JS objects into other
environments, the order isn't guaranteed.<br>
<br>
Regards,<br>
Michael<br>
<br>
<br>
<div>Am 06.07.24 um 03:12 schrieb Michael Geddes via
OvmsDev:<br>
</div>
<blockquote type="cite">
<div dir="ltr">
<div>please have a good look at the function
names.. when I have Get and Set prefixes..
should I have them.. etc to be consistent.</div>
<div><br>
</div>
<div>But Just FYI (a couple of silly bugs
later) - This is the full output from a test
proving that both the 'Times' property works
and that at least as a concept- having the
"Poll:PRI" as a key works.</div>
<div>//.</div>
<div>----8<-------------------</div>
<div dir="ltr"><br>
<div><font style="background-color:rgb(207,226,243)" face="monospace">JSON.print(OvmsPoller.Times.GetStatus())</font><br>
<font style="background-color:rgb(238,238,238)" face="monospace"><br>
{<br>
"items": {<br>
"Poll:PRI": {<br>
"count_hz": 1.00600004196167,<br>
"avg_util_pm": 0.5598000288009644,<br>
"peak_util_pm": 0.6503999829292297,<br>
"avg_time_ms": 0.05350000038743019,<br>
"peak_time_ms": 0.9779999852180481<br>
},<br>
"Poll:SRX": {<br>
"count_hz": 1.1330000162124634,<br>
"avg_util_pm": 0.18970000743865967,<br>
"peak_util_pm": 0.23240000009536743,<br>
"avg_time_ms": 0.015799999237060547,<br>
"peak_time_ms": 0.3319999873638153<br>
},<br>
"RxCan1[778]": {<br>
"count_hz": 1.8489999771118164,<br>
"avg_util_pm": 1.2870999574661255,<br>
"peak_util_pm": 1.8909000158309937,<br>
"avg_time_ms": 0.06909999996423721,<br>
"peak_time_ms": 2.7119998931884766<br>
},<br>
"RxCan1[7bb]": {<br>
"count_hz": 0.2240000069141388,<br>
"avg_util_pm": 0.10409999638795853,<br>
"peak_util_pm": 0.25859999656677246,<br>
"avg_time_ms": 0.043800000101327896,<br>
"peak_time_ms": 1.50600004196167<br>
},<br>
"RxCan1[7ea]": {<br>
"count_hz": 1.0670000314712524,<br>
"avg_util_pm": 0.4699000120162964,<br>
"peak_util_pm": 0.7283999919891357,<br>
"avg_time_ms": 0.04830000177025795,<br>
"peak_time_ms": 1.5379999876022339<br>
},<br>
"RxCan1[7ec]": {<br>
"count_hz": 1.8669999837875366,<br>
"avg_util_pm": 0.8090000152587891,<br>
"peak_util_pm": 0.9458000063896179,<br>
"avg_time_ms": 0.04639999940991402,<br>
"peak_time_ms": 2.2769999504089355<br>
},<br>
"TxCan1[770]": {<br>
"count_hz": 0.9240000247955322,<br>
"avg_util_pm": 0.039400000125169754,<br>
"peak_util_pm":
0.054499998688697815,<br>
"avg_time_ms":
0.0038999998942017555,<br>
"peak_time_ms": 0.08699999749660492<br>
},<br>
"TxCan1[7b3]": {<br>
"count_hz": 0.041999999433755875,<br>
"avg_util_pm":
0.0035000001080334187,<br>
"peak_util_pm":
0.008299999870359898,<br>
"avg_time_ms": 0.008500000461935997,<br>
"peak_time_ms": 0.09200000017881393<br>
},<br>
"TxCan1[7e2]": {<br>
"count_hz": 0.21199999749660492,<br>
"avg_util_pm": 0.01600000075995922,<br>
"peak_util_pm":
0.020500000566244125,<br>
"avg_time_ms": 0.006800000090152025,<br>
"peak_time_ms": 0.08500000089406967<br>
},<br>
"TxCan1[7e4]": {<br>
"count_hz": 0.21199999749660492,<br>
"avg_util_pm": 0.006899999920278788,<br>
"peak_util_pm":
0.009800000116229057,<br>
"avg_time_ms": 0.002899999963119626,<br>
"peak_time_ms": 0.05299999937415123<br>
},<br>
"Cmd:Thrtl": {<br>
"count_hz": 0.014999999664723873,<br>
"avg_util_pm":
0.0006000000284984708,<br>
"peak_util_pm": 0,<br>
"avg_time_ms": 0.004699999932199717,<br>
"peak_time_ms": 0.04699999839067459<br>
},<br>
"Cmd:State": {<br>
"count_hz": 0.039000000804662704,<br>
"avg_util_pm": 0.002300000051036477,<br>
"peak_util_pm":
0.007000000216066837,<br>
"avg_time_ms": 0.006500000134110451,<br>
"peak_time_ms": 0.09000000357627869<br>
}<br>
},<br>
"tot_count_hz": 8.59000015258789,<br>
"tot_util_pm": 3.488300085067749,<br>
"tot_time_ms": 3.1019999980926514<br>
}</font></div>
</div>
<br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On Wed, 3
Jul 2024 at 14:31, Michael Geddes <<a href="mailto:frog@bunyip.wheelycreek.net" rel="noreferrer noreferrer" target="_blank">frog@bunyip.wheelycreek.net</a>>
wrote:<br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div dir="ltr">OH, and also,
<div><br>
</div>
<div>What do you think of treating the O<span style="font-family:monospace">vmsPoller.Times.GetStatus()
</span><font face="arial, sans-serif">items
as an associative array - or should I
treat it as a normal array?</font></div>
<div><font face="arial, sans-serif"><br>
</font></div>
<div><font face="arial, sans-serif">//.ichael</font></div>
</div>
<br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">On Wed,
3 Jul 2024 at 14:24, Michael Geddes <<a href="mailto:frog@bunyip.wheelycreek.net" rel="noreferrer noreferrer" target="_blank">frog@bunyip.wheelycreek.net</a>>
wrote:<br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div dir="ltr">I figured I may as well
add an OvmsPoller object to DukTape
for Ovms. I'm waiting to get back to
my OVMS so that I can test it.. but
this is the documentation I have for
the stuff I have coded. Thoughts on
this?
<div><br>
</div>
<div>What do people think of
OvmsPoller.Times sub-object? I've
added a general mechanism for
this. </div>
<div><br>
</div>
<div>Also should I have
OvmsPoller.Pause() or
OvmsPoller.SetUserPaused(true) ?</div>
<div>//.</div>
<div><br>
</div>
<div><br>
</div>
<div><font face="monospace">OvmsPoller<br>
^^^^^^^^^^<br>
The Ovms Poller object represents
the poller sub-system. It contains
the following methods:<br>
<br>
- ``ispaused =
OvmsPoller.GetPaused()``: Return
true if the poller is paused by
the system/user.<br>
- ``ispaused =
OvmsPoller.GetUserPaused()``:
Return true if the poller is
paused by the user.<br>
- ``OvmsPoller.Pause()``: Pause
the poller (adds User poller
pause)<br>
- ``OvmsPoller.Resume()``: Remove
the User poller pause.<br>
<br>
- ``tracemode =
OvmsPoller.GetTrace()``: Return
the current trace mode.<br>
-
``OvmsPoller.SetTrace(tracemode)``:
Set the current trace mode.<br>
<br>
The Traces still require that
'Verbose' and 'Debug' levels
(depending) for the 'vehicle-poll'<br>
debug tag are set.<br>
Trace modes for verbose
logging can be one of:<br>
- ``on``: On for poller loop<br>
- ``txrx``: On for txrx queue
(this can be hazardous for some
cars)<br>
- ``all``: On for both poller
loop and txrx queuing<br>
- ``off``: Logging Off<br>
Note that only ``on`` and
``off`` are recommended.<br>
<br>
The poller object also contains a
``Times`` property for the OBD
Poll-Time tracing<br>
which contains the following
methods:<br>
- ``isrunning =
OvmsPoller.Times.GetEnabled()``:
Returns true if the time-tracing
is enabled<br>
-
``OvmsPoller.Times.SetEnabled(isrunning)``:
Sets the enabled status of the
timer-tracing<br>
- ``OvmsPoller.Times.Reset()``:
Reset the timers (doesn't affect
their current state).<br>
-
``OvmsPoller.Times.GetStatus()``:
Gets the status of the various
times. This returns an object<br>
of this format:<br>
.. code-block:: javascript<br>
return_value = {<br>
"items": {<br>
"Poll:PRI" : {<br>
"count_hz": 1,<br>
"avg_util_pm": 0.529,<br>
"peak_util_pm":0.652,<br>
"avg_time_ms": 0.052,<br>
"peak_time_ms":1.516<br>
},<br>
"Poll:SRX": {<br>
"count_hz": 1.47,<br>
"avg_util_pm": 0.302,<br>
"peak_util_pm":0.44,<br>
"avg_time_ms": 0.02,<br>
"peak_time_ms":0.573<br>
},<br>
"RxCan1[778]": {<br>
"count_hz": 0.74,<br>
"avg_util_pm": 0.427,<br>
"peak_util_pm":0.826,<br>
"avg_time_ms": 0.063,<br>
"peak_time_ms":1.872<br>
},<br>
"RxCan1[7a8]": {<br>
"count_hz": 0.35,<br>
"avg_util_pm": 0.183,<br>
"peak_util_pm":0.355,<br>
"avg_time_ms": 0.052,<br>
"peak_time_ms":1.382<br>
},<br>
"TxCan1[7b3]": {<br>
"count_hz": 0.07,<br>
"avg_util_pm": 0.005,<br>
"peak_util_pm":0.01,<br>
"avg_time_ms": 0.007,<br>
"peak_time_ms":0.099<br>
},<br>
"TxCan1[7c6]": {<br>
"count_hz": 0,<br>
"avg_util_pm": 0,<br>
"peak_util_pm":0.009,<br>
"avg_time_ms": 0.004,<br>
"peak_time_ms":0.098<br>
},<br>
"Cmd:State": {<br>
"count_hz": 0,<br>
"avg_util_pm": 0,<br>
"peak_util_pm":0,<br>
"avg_time_ms": 0.011,<br>
"peak_time_ms":0.109<br>
}<br>
},<br>
<br>
"tot_count_hz": 11.76,<br>
"tot_util_pm": 6.247,<br>
"tot_time_ms": 4.628<br>
};</font><br>
</div>
</div>
</blockquote>
</div>
</blockquote>
</div>
</div>
<br>
<fieldset></fieldset>
<pre>_______________________________________________
OvmsDev mailing list
<a href="mailto:OvmsDev@lists.openvehicles.com" rel="noreferrer noreferrer" target="_blank">OvmsDev@lists.openvehicles.com</a>
<a href="http://lists.openvehicles.com/mailman/listinfo/ovmsdev" rel="noreferrer noreferrer" target="_blank">http://lists.openvehicles.com/mailman/listinfo/ovmsdev</a>
</pre>
</blockquote>
<br>
<pre cols="72">--
Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal
Fon 02333 / 833 5735 * Handy 0176 / 206 989 26</pre>
</div>
_______________________________________________<br>
OvmsDev mailing list<br>
<a href="mailto:OvmsDev@lists.openvehicles.com" rel="noreferrer noreferrer" target="_blank">OvmsDev@lists.openvehicles.com</a><br>
<a href="http://lists.openvehicles.com/mailman/listinfo/ovmsdev" rel="noreferrer noreferrer noreferrer" target="_blank">http://lists.openvehicles.com/mailman/listinfo/ovmsdev</a><br>
</blockquote>
</div>
</div>
</div>
</blockquote>
</div>
</blockquote>
<br>
<pre cols="72">--
Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal
Fon 02333 / 833 5735 * Handy 0176 / 206 989 26</pre>
</div>
_______________________________________________<br>
OvmsDev mailing list<br>
<a href="mailto:OvmsDev@lists.openvehicles.com" target="_blank" rel="noreferrer">OvmsDev@lists.openvehicles.com</a><br>
<a href="http://lists.openvehicles.com/mailman/listinfo/ovmsdev" rel="noreferrer noreferrer" target="_blank">http://lists.openvehicles.com/mailman/listinfo/ovmsdev</a><br>
</blockquote></div></div></div>