<div dir="ltr">I'm trying to get the Cochran computers working with the FTDI library and serial_ftdi so I can read them on an Android biuld. I'm having two issues that I have to ask for advice about.<div><br></div><div>1. In serial_ftdi_read() a failed read exponentially backs off when there's a short read. This is causing Cochran reads to timeout about 95% of the time. It's as if reading too late causes lost data. Having a fixed backoff of 10ms works. Are there any issues if I alter this backoff tactic? It could be shortened to 1ms if 10ms is too long.<br><br><div>diff --git a/core/serial_ftdi.c b/core/serial_ftdi.c</div><div>index f8cba95..bc20ce1 100644</div><div>--- a/core/serial_ftdi.c</div><div>+++ b/core/serial_ftdi.c</div><div>@@ -384,7 +384,7 @@ static dc_status_t serial_ftdi_read (dc_custom_io_t *io, void *data, size_t size</div><div>        if (timeout == -1)</div><div>                timeout = 10000;</div><div> </div><div>-       int backoff = 1;</div><div>+       int backoff = 10;</div><div>        int slept = 0;</div><div>        unsigned int nbytes = 0;</div><div>        while (nbytes < size) {</div><div>@@ -402,12 +402,11 @@ static dc_status_t serial_ftdi_read (dc_custom_io_t *io, void *data, size_t size</div><div>                        }</div><div>                        serial_ftdi_sleep (device, backoff);</div><div>                        slept += backoff;</div><div>-                       backoff *= 2;</div><div>                        if (backoff + slept > timeout)</div><div>                                backoff = timeout - slept;</div><div>                } else {</div><div>                        // Reset backoff to 1 on success.</div><div>-                       backoff = 1;</div><div>+                       backoff = 10;</div><div>                }</div><div> </div><div>                nbytes += n;</div><div><br></div><div>2. It doesn't make any sense to me but setting serial break on then off is the trigger to the Cochran to wake up, so I need the ability to set breaks. Currently the code doesn't support setting breaks and is explained with the comment "// Not implemented in libftdi yet. Research it further."</div><div><br></div><div>So I looked at it and it's supported with the following libftdi-1.3 function:<br><br><div>      int ftdi_set_line_property2(struct ftdi_context *ftdi, enum ftdi_bits_type bits,</div><div>                                enum ftdi_stopbits_type sbit, enum ftdi_parity_type parity,</div><div>                                enum ftdi_break_type break_type);</div></div><div><br></div><div>To make this work seamlessly with libdivecomputer's serial function I need to emulate the dc_serial_set_break function. A prototype serial_ftdi_set_break function is there and I can change it to use ftdi_set_line_property2, which means I have to get the parameters bits, sbit, and parity from somewhere.<br><br>There isn't a function that will read this from the device.<br><br>I could create some global vars in serial_ftdi.c, initialize them with 8,1,N values, update them as needed. To support multiple devices concurrently it would have to be an array indexed by device but it's not clear what index would work best.</div><div><br></div><div>I was thinking of a global variable like:</div><div><br></div><div>   struct serial_parm {</div><div>      struct ftdi_context *ftdi_ctx;</div><div>      enum ftdi_bits_type bits;</div><div>      enum ftdi_stopbits_type sbit;</div><div>      enum ftdi_parity_type parity;</div><div>   } *serial_parms = NULL;</div><div><br></div><div>Then realloc() to add (on serial_ftdi_open) or remove (on serial_ftdi_close). When serial_ftdi_configure is called I can search the array and update the values so I can use them in serial_ftdi_set_break.</div><div><br></div><div>Does this work or is there a better idea?</div><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr"><div>John Van Ostrand<br></div><div>At large on sabbatical<br></div><br></div></div>
</div></div>