<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body text="#000000" bgcolor="#FFFFFF">
Part one (TX queue) done & pushed.<br>
<br>
<tt>OVMS > can can1 status </tt><tt><br>
</tt><tt>CAN: can1</tt><tt><br>
</tt><tt>Mode: Active</tt><tt><br>
</tt><tt>Speed: 500000</tt><tt><br>
</tt><tt>Rx pkt: 236657</tt><tt><br>
</tt><tt>Rx err: 1</tt><tt><br>
</tt><tt>Rx ovrflw: 0</tt><tt><br>
</tt><tt>Tx pkt: 106378</tt><tt><br>
</tt><tt>Tx delays: 4</tt><tt><br>
</tt><tt>Tx err: 0</tt><tt><br>
</tt><tt>Tx ovrflw: 0</tt><tt><br>
</tt><tt>Err flags: 0x800caa</tt><tt><br>
</tt><br>
TX performance is rock steady on can1 -- the delays occurred when
sending the stop charge request (as expected). I can't test can2/3,
Greg & Geir, could you…?<br>
<br>
The TxCallback can't be used on the mcp2515. The ISR can't query the
IRQ register, so the TX IRQs are now also handled by the
RxCallback(). As the TX IRQs need to be cleared before loading the
next frame, this needs another SPI call. I hope that doesn't
introduce new problems.<br>
<br>
<br>
No changes are necessary to the application code (well, except you
can remove any hard coded delays now). The TX queue has a length of
20 frames and will automatically be used by the drivers when no TX
buffers are free.<br>
<br>
If an application wants to know whether a frame was sent immediately
or gets delayed it can check the return code of the Write() method.
Write() now also can take a second parameter for the maximum wait
time for space in the TX queue to become available if it's full
(default 0 = fail immediately if queue is full).<br>
<br>
<br>
I also added logging of CAN errors. It's currently activated by "can
… trace on", I don't think this needs to be active by default, just
for CAN issue debugging.<br>
<br>
<tt>E (45718) can: Error can1 rxpkt=3 txpkt=0 errflags=0x800caa
rxerr=1 txerr=0 rxovr=0 txovr=0 txdelay=0</tt><tt><br>
</tt><tt>E (83528) can: Error can1 rxpkt=7483 txpkt=226
errflags=0x800caa rxerr=1 txerr=0 rxovr=0 txovr=0 txdelay=0</tt><br>
<br>
…that's also a first part of the logging extension (part two).<br>
<br>
Regards,<br>
Michael<br>
<br>
<br>
<div class="moz-cite-prefix">Am 12.01.2018 um 19:01 schrieb Michael
Balzer:<br>
</div>
<blockquote type="cite"
cite="mid:357384bc-b854-bf66-3cc5-55344c2b7c38@expeedo.de">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
Yes, I had something like that in mind. On TX IRQ, the drivers
send CAN_txcallbacks to the CAN_rxtask. The CAN_rxtask then
fetches frames from the TX queue and calls the TxCallback until
all TX buffers of the driver are full. From the already existing
TxCallback() stubs I suppose you had planned a scheme like that
already? ;)<br>
<br>
Greg, can you create a pull request for your MCP2515 change? I'd
like to merge that before beginning on the drivers.<br>
<br>
Thanks,<br>
Michael<br>
<br>
<br>
<div class="moz-cite-prefix">Am 12.01.2018 um 01:19 schrieb Mark
Webb-Johnson:<br>
</div>
<blockquote type="cite"
cite="mid:EB2639C4-0BF3-40C7-ACED-4364F2BDD606@webb-johnson.net">
<meta http-equiv="Content-Type" content="text/html;
charset=utf-8">
Option B sounds like a good approach.
<div class=""><br class="">
</div>
<div class="">Presumably we are just polling the tx queue in the
existing CAN_rxtask based on TxCallback?</div>
<div class=""><br class="">
</div>
<div class="">Regards, Mark.<br class="">
<div><br class="">
<blockquote type="cite" class="">
<div class="">On 11 Jan 2018, at 8:42 PM, Michael Balzer
<<a href="mailto:dexter@expeedo.de" class=""
moz-do-not-send="true">dexter@expeedo.de</a>>
wrote:</div>
<br class="Apple-interchange-newline">
<div class="">
<meta http-equiv="Content-Type" content="text/html;
charset=utf-8" class="">
<div text="#000000" bgcolor="#FFFFFF" class="">
<div class="moz-cite-prefix">Greg, Mark,<br class="">
<br class="">
I can check your new code after work.<br class="">
<br class="">
For the TX performance/overflow issue, there are
basically two options:<br class="">
<ul class="">
<li class="">A: make all application TX be aware
of overflows, i.e. check the return value of the
CAN Write() call as necessary and/or introduce
sufficient delays (very ugly)<br class="">
</li>
<li class="">B: add a TX queue to the CAN
framework, so the application can just push some
frames as fast as it likes, with an option to
wait/block/fail if the queue is full</li>
<ul class="">
<li class="">→ the framework checks for TX
buffers becoming available <b>(i.e. driver
issuing a TxCallback request)</b> and
delivers queued frames only as fast as the
driver can handle them<br class="">
</li>
</ul>
</ul>
Option B has been on my todo list since removing the
delay from the MCP driver and introducing the TX
buffer check in the esp32can driver, as I don't
think applications should need to handle TX
overflows.<br class="">
<br class="">
I can try to implement that this weekend if it's
urgent now.<br class="">
<br class="">
Regards,<br class="">
Michael<br class="">
<br class="">
<br class="">
Am 11.01.2018 um 05:55 schrieb Greg D.:<br class="">
</div>
<blockquote type="cite"
cite="mid:b229b09f-ef72-c564-7839-fa8a815157cd@gmail.com"
class="">
<meta http-equiv="Content-Type" content="text/html;
charset=utf-8" class="">
Hi Mark, Micheal,<br class="">
<br class="">
Ok, good news and bad news.<br class="">
<br class="">
Good news: Rx problem I believe is fixed. Return
is true only if we received something, else false.
And the other interrupt conditions are handled at
the same time, so no hangs are seen when restarting
wifi. Rx overflow counter does increment properly.
Yea! Code has been pushed to my clone on Github.<br
class="">
<br class="">
Bad news: I am still able to hang the bus, but I
think it's on the transmit side. The obd2ecu
process can send up to 3 frames back to back to
report the ECU Name, followed soon after by several
more with to grab the VIN. Without any flow control
on the transmit side, and with a half-duplex CAN
bus, that's just too much. Turning off the VIN
reporting (config set obd2ecu private yes) seems to
let everything run because I don't respond to the
VIN request (which lets everything drain as OBDWiz
times out). Also verified by putting temporary
delays in the obd2ecu code to let things drain a bit
between frames. So, the transmit side is still a
bit fragile, depending on timing. Not sure quite
what to do here, as there is no easy place to queue
things... Do we need to go back to the old way with
a delay in the obd2ecu code (perhaps better than in
the driver, no?). Architecturally it's ugly, but
this only occurs at startup, and I don't mind the
kludge. Do any other uses of the MCP busses do a
burst of transmitting? If not, I'll put the delays
in the obd2ecu code and call it close enough. Lemme
know.<br class="">
<br class="">
For receive, I'd go with what I have for now, if
Michael would be so kind as to review what I have
done first. <a class="moz-txt-link-freetext"
href="https://github.com/bitsofgreg/Open-Vehicle-Monitoring-System-3/blob/master/vehicle/OVMS.V3/components/mcp2515/mcp2515.cpp"
moz-do-not-send="true">https://github.com/bitsofgreg/Open-Vehicle-Monitoring-System-3/blob/master/vehicle/OVMS.V3/components/mcp2515/mcp2515.cpp</a>
Hopefully he'll be back on line before I get up in
the morning. Wonderful how the Earth's spin helps
with the teamwork.<br class="">
<br class="">
I'll keep poking at things tonight, and take it out
for a spin in the car tomorrow, just to see
everything working together. But as it is now, it's
much better than it was before. Really, this time.
:)<br class="">
<br class="">
Greg<br class="">
<br class="">
<br class="">
<div class="moz-cite-prefix">Greg D. wrote:<br
class="">
</div>
<blockquote type="cite"
cite="mid:e1ebf1b2-15e2-fa7b-92e1-6ed2a4972b63@gmail.com"
class="">
<meta http-equiv="Content-Type"
content="text/html; charset=utf-8" class="">
Hi Mark,<br class="">
<br class="">
I believe you are right about the multiple flags,
and the code only processing Rx and "error"
separately. Fundamentally, a roll-over from
buffer 0 to buffer 1 isn't really an error, just a
statement of fact on what happened. So, we should
have buffer 1 and the rollover flag at the same
time, which in fact is what I saw. I need to
handle the Rx overflow at the same time as the
buffer 1 receive, I think...<br class="">
<br class="">
I need to grab some dinner, but have a fix in the
works. Will report back in a few hours, hopefully
with good news...<br class="">
<br class="">
Greg<br class="">
<br class="">
<br class="">
<div class="moz-cite-prefix">Mark Webb-Johnson
wrote:<br class="">
</div>
<blockquote type="cite"
cite="mid:E10D22FC-01E4-4976-8A90-EA916B9CE7F1@webb-johnson.net"
class="">
<meta http-equiv="Content-Type"
content="text/html; charset=utf-8" class="">
<div class=""><br class="">
</div>
The design of the system is as follows:
<div class=""><br class="">
</div>
<div class="">
<ul class="MailOutline">
<li class="">The can object CAN_rxtask
listens on the rx queue to receive
instructional messages from canbus
drivers. These can be:</li>
<ul class="">
<li class="">CAN_frame: simply passes an
entire incoming can frame to the
IncomingFrame handler.</li>
<li class="">CAN_rxcallback: an
instruction for the CAN_rxtask to call
the RxCallback task repeatedly.</li>
<li class="">CAN_txcallback: an
instruction for the CAN_rxtask to call
the TxCallback once.</li>
</ul>
<li class="">In the case of CAN_rxcallback,
the canbus object RxCallback function is
expected to return FALSE to indicate
nothing should be done and RxCallback
should not be called again, or TRUE to
indicate an incoming frame has been
received and should be passed
to IncomingFrame.</li>
<li class="">The system is arranged so that
individual bus driver interrupt
implementations can be fast and efficient.</li>
<ul class="">
<li class="">The driver can choose to
receive the frame in the interrupt
handler itself, and pass it with
CAN_frame to CAN_rxtask. The esp32 can
driver uses this option.</li>
<li class="">Or the driver can choose to
delay the reception of the frame to the
RxCallback stage, and merely pass an
indication with CAN_rxcallback. The
mcp2515 driver uses this option.</li>
</ul>
<li class="">The true/false response from
RxCallback is designed to allow the
callback to signal it received a frame or
not. If it received a frame, then it is
called again.</li>
<li class="">This approach is used in order
to be able to centralise the reception of
CAN frames to one single task (avoiding
having to run individual tasks for each
canbus, hence saving stack RAM).</li>
</ul>
<div class=""><br class="">
</div>
<div class="">The RxCallback should definitely
ONLY return true if an actual can message
has been received, and is being passed back
in the frame pointer parameter.</div>
<div class=""><br class="">
</div>
<div class="">I suspect the issue is that the
mcp2515 RxCallback is being faced with
multiple error flags. Changing that to a
return true (as Greg has done) has the
undesired side-effect of issuing a spurious
IncomingFrame (with garbage/blank frame),
but also causes the RxCallback to be called
again (clearing the error flag). Perhaps the
solution is to put a loop in RxCallback so
that if an error condition is found, it
should be cleared, but then loop again and
keep clearing errors until no more are
found, then return false? I think that in
the mcp2515 case, this error clearing loop
can be simply handled in the RxCallback
itself.</div>
<div class=""><br class="">
</div>
<div class="">The alternative is to change the
RxCallback logic so that the return bool
value means simply ‘loop’ (call me again,
please), and have the RxCallback itself
call IncomingFrame(), rather than passing a
frame as a parameter. If Michael/Greg think
this is a better approach, I am happy to
make that change - it is pretty trivial.</div>
<div class=""><br class="">
</div>
<div class="">Regards, Mark.</div>
<br class="">
</div>
</blockquote>
</blockquote>
</blockquote>
<br class="">
<pre class="moz-signature" cols="144">--
Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal
Fon 02333 / 833 5735 * Handy 0176 / 206 989 26
</pre>
</div>
_______________________________________________<br
class="">
OvmsDev mailing list<br class="">
<a href="mailto:OvmsDev@lists.teslaclub.hk" class=""
moz-do-not-send="true">OvmsDev@lists.teslaclub.hk</a><br
class="">
<a class="moz-txt-link-freetext"
href="http://lists.teslaclub.hk/mailman/listinfo/ovmsdev"
moz-do-not-send="true">http://lists.teslaclub.hk/mailman/listinfo/ovmsdev</a><br
class="">
</div>
</blockquote>
</div>
<br class="">
</div>
<br>
<fieldset class="mimeAttachmentHeader"></fieldset>
<br>
<pre wrap="">_______________________________________________
OvmsDev mailing list
<a class="moz-txt-link-abbreviated" href="mailto:OvmsDev@lists.teslaclub.hk" moz-do-not-send="true">OvmsDev@lists.teslaclub.hk</a>
<a class="moz-txt-link-freetext" href="http://lists.teslaclub.hk/mailman/listinfo/ovmsdev" moz-do-not-send="true">http://lists.teslaclub.hk/mailman/listinfo/ovmsdev</a>
</pre>
</blockquote>
<br>
<pre class="moz-signature" cols="160">--
Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal
Fon 02333 / 833 5735 * Handy 0176 / 206 989 26
</pre>
<br>
<fieldset class="mimeAttachmentHeader"></fieldset>
<br>
<pre wrap="">_______________________________________________
OvmsDev mailing list
<a class="moz-txt-link-abbreviated" href="mailto:OvmsDev@lists.teslaclub.hk">OvmsDev@lists.teslaclub.hk</a>
<a class="moz-txt-link-freetext" href="http://lists.teslaclub.hk/mailman/listinfo/ovmsdev">http://lists.teslaclub.hk/mailman/listinfo/ovmsdev</a>
</pre>
</blockquote>
<br>
<pre class="moz-signature" cols="160">--
Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal
Fon 02333 / 833 5735 * Handy 0176 / 206 989 26
</pre>
</body>
</html>