<div dir="ltr">It occurred to me that we need to restrict the names of commands we can register.  The minimum would be:<div>* No whitespace</div><div>* Cannot start with a '-' as this means an option</div><div>* Probably not starting with a number (which could be an option)</div><div>It also occurs to me that we have some issues, at the moment, with utf-8 characters so I think we should probably stick to ascii.</div><div><br></div><div>The rules I have now are very English-centric:</div><div> * Must start with an alpha character (a-z or A-Z)</div><div> * Can contain only  a-z, A-Z, 0-9, -, _</div><div> * Must end with a-z, A-Z, 0-9</div><div>Thoughts?  Is this ok for the moment?</div><div><br></div><div>I'm also not going to mention being able to miss out the 'usr' and have it get placed there.. thinking of that as a hidden </div><div>'do what I meant' situation. If the parent parameter is '' it will register it under 'usr'</div><div><br></div><div>//.ichael</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, 6 Aug 2024 at 18:15, <<a href="mailto:frog@bunyip.wheelycreek.net">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 class="msg-4429254848517582998"><div lang="EN-AU" style="overflow-wrap: break-word;"><div class="m_-4429254848517582998WordSection1"><p class="MsoNormal"><span style="font-size:11pt">That seems sensible - I’ve implemented something close to your suggestion with a small ‘improvement’:<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11pt"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11pt">I’ve made it so the ‘usr’ commands are not there by default.  But will be auto-created as necessary.<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11pt"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11pt">To do this, rather than a Boolean allow_user_commands I added an enum as follows:<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11pt">enum class OvmsCommandType  {<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11pt">  System, // << Normal system command – can’t have usr subcommand.<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11pt">  SystemAllowUserCmd, //< System command that Allows user commands to be added to it<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11pt">  SystemAllowUsrDir, //< System command that allow ‘usr’ sub-command to be auto-added.<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11pt">  SystemUsrDir, //< an auto-added usr cub-command<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11pt">  User //< A user command.<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11pt">};<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11pt">By default I have the root command as SystemAllowUsrDir  as well as I’ve done it for Ioniq 5 as well (to test that bit).<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11pt"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11pt">The calls<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11pt">OvmsCommand.Register(mycommand, "", "me", "My Script", "[string]", 0, 4)<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11pt"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11pt">OvmsCommand.Register(mycommand, "xhiq", "extra", "My Script", "[string]", 0, 4)<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11pt"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11pt">Would mean the commands ‘usr me’  and ‘xhiq usr extra’  would be created.  Exactly the same as<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11pt"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11pt">OvmsCommand.Register(mycommand, "usr", "me", "My Script", "[string]", 0, 4)<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11pt"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11pt">OvmsCommand.Register(mycommand, "xhiq usr", "extra", "My Script", "[string]", 0, 4)<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11pt"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11pt">Thoughts?<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11pt"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11pt">Btw to add a sub-command to xhiq usr extra  you would need to specify it as  “xhiq usr extra” as the parent.<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11pt">//.ichael<u></u><u></u></span></p><div><div style="border-right:none;border-bottom:none;border-left:none;border-top:1pt solid rgb(225,225,225);padding:3pt 0cm 0cm"><p class="MsoNormal"><b><span lang="EN-US" style="font-size:11pt;font-family:Calibri,sans-serif">From:</span></b><span lang="EN-US" style="font-size:11pt;font-family:Calibri,sans-serif"> OvmsDev <<a href="mailto:ovmsdev-bounces@lists.openvehicles.com" target="_blank">ovmsdev-bounces@lists.openvehicles.com</a>> <b>On Behalf Of </b>Michael Balzer via OvmsDev<br><b>Sent:</b> Saturday, August 3, 2024 3:09 PM<br><b>To:</b> <a href="mailto:ovmsdev@lists.openvehicles.com" target="_blank">ovmsdev@lists.openvehicles.com</a><br><b>Cc:</b> Michael Balzer <<a href="mailto:dexter@expeedo.de" target="_blank">dexter@expeedo.de</a>><br><b>Subject:</b> Re: [Ovmsdev] Warning in Duktape<u></u><u></u></span></p></div></div><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal" style="margin-bottom:12pt">I've just merged your PR.<br><br>`OvmsCommand.Register()` is well designed.<br><br>On security: I don't think we actually need to allow adding user commands to system command groups at all.<br><br>I'd opt for allowing only command root "usr", and optionally "x…" (vehicle specific namespaces), for user commands. Allowing "x…" should be a choice/config of the vehicle module.<br><br>We could add a flag to the command definition and extend the registration accordingly to…<br><br><span style="font-family:"Courier New"">    OvmsCommand* RegisterCommand(const char* name, const char* title,<br>                                 OvmsCommandExecuteCallback_t execute = NULL,<br>                                 const char *usage = "", int min = 0, int max = 0, bool secure = true,<br>                                 OvmsCommandValidateCallback_t validate = NULL,<br>                                 <b>bool allow_user_commands = false</b>);</span><br><br>Similar to the config param "usr" init, we then generally create an empty command root "usr" on system init with allow_user_commands = true.<br><br>Vehicles can decide to create their full "x…" root, or some "x… usr" placeholder with that grant.<br><br>What do you think?<br><br>Regards,<br>Michael<br><br><u></u><u></u></p><div><p class="MsoNormal">Am 22.07.24 um 02:36 schrieb Michael Geddes via OvmsDev:<u></u><u></u></p></div><blockquote style="margin-top:5pt;margin-bottom:5pt"><div><div><p class="MsoNormal">I have tidied up the implementation significantly and I've fixed up all the life-time issues, as well as disallowing overriding existing commands.<u></u><u></u></p></div><div><p class="MsoNormal">(Though you could still add a sub-command to a system command).  It now persists quite happily, doesn't crash on GC and functions as expected :). I've also implemented shut-down registering so it cleans up before getting to the destructor.<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">It's now down to security and the question of whether we differentiate user plugin commands from system ones.<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">//.ichael<u></u><u></u></p></div><p class="MsoNormal"><u></u> <u></u></p><div><div><p class="MsoNormal">On Sun, 21 Jul 2024 at 08:34, Michael Geddes <<a href="mailto:frog@bunyip.wheelycreek.net" target="_blank">frog@bunyip.wheelycreek.net</a>> wrote:<u></u><u></u></p></div><blockquote style="border-top:none;border-right:none;border-bottom:none;border-left:1pt solid rgb(204,204,204);padding:0cm 0cm 0cm 6pt;margin-left:4.8pt;margin-right:0cm"><div><p class="MsoNormal">Well since I've been doing some Duktape stuff lately, I recalled this loose end and have come up with a solution. <u></u><u></u></p><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">There were a few issues - please let me know if you have a problem with any of them.<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">Firstly the Command registration map is using const char *  and we can't guarantee the lifetime of the duktape strings so I've moved them over to std::string.<u></u><u></u></p></div><div><p class="MsoNormal">This applies to OvmsCommandMap itself as well as OvmsCommand - m_name, m_title and m_usage_template.<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">I think the intention was to have something like this for the register command.. it was missing a parameter. It now looks like this:<u></u><u></u></p></div><div><p class="MsoNormal">OvmsCommand.Register( function, parent, command, description, parameter_desc, minargs, maxargs).<u></u><u></u></p></div><div><p class="MsoNormal">Missing maxargs will mean maxargs = minargs.<u></u><u></u></p></div><div><p class="MsoNormal">Missing minargs will mean no parameters.<u></u><u></u></p></div><div><p class="MsoNormal">The calling function will be passed 2 parameters:  the name of the command and an array of strings (the argv).<u></u><u></u></p></div><div><p class="MsoNormal">For sub-commands, these will be separated by '/'.   So  something like "me/too".<u></u><u></u></p></div><div><p class="MsoNormal">I think this way is simple but effective.<u></u><u></u></p></div><div><p class="MsoNormal">It would be good to add completion, but that can be added later.<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">One of the things I wanted to talk about is what security protections we need to add to prevent a script from taking over an existing function! (or future function).<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">When vim initially added user commands and functions it was a free-for-all but somebody soon realised there needed to be some restrictions to avoid issues..<u></u><u></u></p></div><div><p class="MsoNormal">so what they did was force user function and commands to start with a capital letter.  I would like people's thoughts on whether we need to do something similar.<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">It might be that we would be satisfied with failing if system commands were attempted to be overridden. Should we allow adding sub-commands to system commands?<u></u><u></u></p></div><div><p class="MsoNormal">I can see that might be useful..   <u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">I have added a sample below of a working function:<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">--8<----<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal"><span style="font-family:"Courier New"">mycommand = function(c, argv){<br>  print("Hello There: "+c+"\n");<br>  if (argv.length == 0)<br>    print("Simple\n");<br>  else<br>    print("Script: "+argv[0]+"\n")<br>  }<br>OvmsCommand.Register(mycommand, "", "me", "My Script", "[string]", 0, 3)</span><u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal"><i><span style="font-family:"Courier New"">OVMS#</span></i><span style="font-family:"Courier New""> <b>me xx</b><br>Hello There: me</span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-family:"Courier New"">Script: xx<br><i>OVMS# </i><b>me xx yy</b><br>Hello There: me</span><u></u><u></u></p></div><div><p class="MsoNormal"><span style="font-family:"Courier New"">Script: xx<br><i>OVMS#</i> <b>me xx yy</b><br>Hello There: me<br>Script: xx<br><i>OVMS#</i></span><u></u><u></u></p></div><div><p class="MsoNormal"> <u></u><u></u></p></div></div><p class="MsoNormal"><u></u> <u></u></p><div><div><p class="MsoNormal">On Sun, 23 Oct 2022 at 22:15, Michael Balzer <<a href="mailto:dexter@expeedo.de" target="_blank">dexter@expeedo.de</a>> wrote:<u></u><u></u></p></div><blockquote style="border-top:none;border-right:none;border-bottom:none;border-left:1pt solid rgb(204,204,204);padding:0cm 0cm 0cm 6pt;margin-left:4.8pt;margin-right:0cm"><div><p class="MsoNormal" style="margin-bottom:12pt">That's an open end, implementing command registration for Duktape.<br><br>There's a thread on this… found it:<br><a href="http://lists.openvehicles.com/pipermail/ovmsdev/2020-July/006952.html" target="_blank">http://lists.openvehicles.com/pipermail/ovmsdev/2020-July/006952.html</a><br><br>Regards,<br>Michael<br><br><u></u><u></u></p><div><p class="MsoNormal">Am 23.10.22 um 15:38 schrieb Michael Geddes:<u></u><u></u></p></div><blockquote style="margin-top:5pt;margin-bottom:5pt"><div><div><p class="MsoNormal">There's an unused variable 'dcc' warning in the below code.<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">It seems that the 'Perform the callback' is not being 'performed!<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">Is this deliberate?<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal">//.ichael<u></u><u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><p class="MsoNormal"><u></u> <u></u></p></div><div><div><div><p class="MsoNormal" style="line-height:14.25pt;background:rgb(30,30,30)"><span style="font-size:10.5pt;font-family:Consolas;color:rgb(86,156,214)">void</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)"> </span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(220,220,170)">DukOvmsCommandRegisterRun</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)">(</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(86,156,214)">int</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)"> </span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(156,220,254)">verbosity</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)">, </span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(78,201,176)">OvmsWriter</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(86,156,214)">*</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)"> </span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(156,220,254)">writer</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)">, </span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(78,201,176)">OvmsCommand</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(86,156,214)">*</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)"> </span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(156,220,254)">cmd</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)">, </span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(86,156,214)">int</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)"> </span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(156,220,254)">argc</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)">, </span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(86,156,214)">const</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)"> </span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(86,156,214)">char*</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)"> </span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(86,156,214)">const*</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)"> </span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(156,220,254)">argv</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)">)<u></u><u></u></span></p></div><div><p class="MsoNormal" style="line-height:14.25pt;background:rgb(30,30,30)"><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)">  {<u></u><u></u></span></p></div><div><p class="MsoNormal" style="line-height:14.25pt;background:rgb(30,30,30)"><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)">  </span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(86,156,214)">ESP_LOGD</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)">(</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(156,220,254)">TAG</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)">, </span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(206,145,120)">"DukOvmsCommandRegisterRun(</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(156,220,254)">%s</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(206,145,120)">)"</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)">,</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(156,220,254)">cmd</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)">-></span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(220,220,170)">GetName</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)">());<u></u><u></u></span></p></div><div><p class="MsoNormal" style="line-height:14.25pt;background:rgb(30,30,30)"><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)">  </span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(86,156,214)">auto</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)"> </span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(156,220,254)">it</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)"> = </span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(156,220,254)">MyDuktape</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)">.</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(156,220,254)">m_cmdmap</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)">.</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(220,220,170)">find</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)">(</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(156,220,254)">cmd</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)">);<u></u><u></u></span></p></div><div><p class="MsoNormal" style="line-height:14.25pt;background:rgb(30,30,30)"><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)">  </span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(197,134,192)">if</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)"> (</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(156,220,254)">it</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)"> </span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(220,220,170)">==</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)"> </span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(156,220,254)">MyDuktape</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)">.</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(156,220,254)">m_cmdmap</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)">.</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(220,220,170)">end</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)">())<u></u><u></u></span></p></div><div><p class="MsoNormal" style="line-height:14.25pt;background:rgb(30,30,30)"><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)">    {<u></u><u></u></span></p></div><div><p class="MsoNormal" style="line-height:14.25pt;background:rgb(30,30,30)"><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)">    </span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(86,156,214)">ESP_LOGE</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)">(</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(156,220,254)">TAG</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)">, </span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(206,145,120)">"Command '</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(156,220,254)">%s</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(206,145,120)">' cannot be found in registry"</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)">,</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(156,220,254)">cmd</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)">-></span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(220,220,170)">GetName</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)">());<u></u><u></u></span></p></div><div><p class="MsoNormal" style="line-height:14.25pt;background:rgb(30,30,30)"><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)">    </span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(197,134,192)">return</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)">;<u></u><u></u></span></p></div><div><p class="MsoNormal" style="line-height:14.25pt;background:rgb(30,30,30)"><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)">    }<u></u><u></u></span></p></div><div><p class="MsoNormal" style="line-height:14.25pt;background:rgb(30,30,30)"><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)">  </span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(197,134,192)">else</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)"><u></u><u></u></span></p></div><div><p class="MsoNormal" style="line-height:14.25pt;background:rgb(30,30,30)"><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)">    {<u></u><u></u></span></p></div><div><p class="MsoNormal" style="line-height:14.25pt;background:rgb(30,30,30)"><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)">    </span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(78,201,176)">DuktapeConsoleCommand</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)">* </span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(156,220,254)">dcc</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)"> = </span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(156,220,254)">it</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(220,220,170)">-></span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(156,220,254)">second</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)">;<u></u><u></u></span></p></div><div><p class="MsoNormal" style="line-height:14.25pt;background:rgb(30,30,30)"><span style="font-size:10.5pt;font-family:Consolas;color:rgb(106,153,85)">    // Perform the callback</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)"><u></u><u></u></span></p></div><div><p class="MsoNormal" style="line-height:14.25pt;background:rgb(30,30,30)"><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)">    }<u></u><u></u></span></p></div><div><p class="MsoNormal" style="line-height:14.25pt;background:rgb(30,30,30)"><span style="font-size:10.5pt;font-family:Consolas;color:rgb(212,212,212)">  }<u></u><u></u></span></p></div></div></div></div><p class="MsoNormal"><br><br><u></u><u></u></p><pre>_______________________________________________<u></u><u></u></pre><pre>OvmsDev mailing list<u></u><u></u></pre><pre><a href="mailto:OvmsDev@lists.openvehicles.com" target="_blank">OvmsDev@lists.openvehicles.com</a><u></u><u></u></pre><pre><a href="http://lists.openvehicles.com/mailman/listinfo/ovmsdev" target="_blank">http://lists.openvehicles.com/mailman/listinfo/ovmsdev</a><u></u><u></u></pre></blockquote><p class="MsoNormal"><br><br><u></u><u></u></p><pre>-- <u></u><u></u></pre><pre>Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal<u></u><u></u></pre><pre>Fon 02333 / 833 5735 * Handy 0176 / 206 989 26<u></u><u></u></pre></div><p class="MsoNormal">_______________________________________________<br>OvmsDev mailing list<br><a href="mailto:OvmsDev@lists.openvehicles.com" target="_blank">OvmsDev@lists.openvehicles.com</a><br><a href="http://lists.openvehicles.com/mailman/listinfo/ovmsdev" target="_blank">http://lists.openvehicles.com/mailman/listinfo/ovmsdev</a><u></u><u></u></p></blockquote></div></blockquote></div></div><p class="MsoNormal"><br><br><u></u><u></u></p><pre>_______________________________________________<u></u><u></u></pre><pre>OvmsDev mailing list<u></u><u></u></pre><pre><a href="mailto:OvmsDev@lists.openvehicles.com" target="_blank">OvmsDev@lists.openvehicles.com</a><u></u><u></u></pre><pre><a href="http://lists.openvehicles.com/mailman/listinfo/ovmsdev" target="_blank">http://lists.openvehicles.com/mailman/listinfo/ovmsdev</a><u></u><u></u></pre></blockquote><p class="MsoNormal"><br><br><u></u><u></u></p><pre>-- <u></u><u></u></pre><pre>Michael Balzer * Helkenberger Weg 9 * D-58256 Ennepetal<u></u><u></u></pre><pre>Fon 02333 / 833 5735 * Handy 0176 / 206 989 26<u></u><u></u></pre></div></div></div></blockquote></div>