[PATCH 03/11] Lift the OSTC3 INIT out of open
Anton Lundin
glance at acc.umu.se
Mon Dec 15 14:43:51 PST 2014
On 15 December, 2014 - Jef Driesen wrote:
> On 21-11-14 21:28, Anton Lundin wrote:
> >--- a/src/hw_ostc3.c
> >+++ b/src/hw_ostc3.c
> >@@ -67,6 +67,11 @@ typedef struct hw_ostc3_device_t {
> > dc_device_t base;
> > serial_t *port;
> > unsigned char fingerprint[5];
> >+ enum hw_ostc3_state {
> >+ NONE,
> >+ OPEN,
> >+ DOWNLOAD,
> >+ } state;
> > } hw_ostc3_device_t;
>
> Move the enum outside of the struct and give it a proper typedef. (This is
> mainly for the msvc C++ compiler. When defined inside the struct you need to
> prefix the values with the C++ hw_ostc3_device_t:: syntax. And that doesn't
> work in C mode.)
>
Zomg, but i hear you. Fixing.
> > static dc_status_t hw_ostc3_device_set_fingerprint (dc_device_t *abstract, const unsigned char data[], unsigned int size);
> >@@ -220,6 +225,7 @@ hw_ostc3_device_open (dc_device_t **out, dc_context_t *context, const char *name
> > // Set the default values.
> > device->port = NULL;
> > memset (device->fingerprint, 0, sizeof (device->fingerprint));
> >+ device->state = NONE;
> >
> > // Open the device.
> > int rc = serial_open (&device->port, context, name);
> >@@ -249,18 +255,48 @@ hw_ostc3_device_open (dc_device_t **out, dc_context_t *context, const char *name
> > // Make sure everything is in a sane state.
> > serial_sleep (device->port, 300);
> > serial_flush (device->port, SERIAL_QUEUE_BOTH);
> >+ device->state = OPEN;
> >+
> >+ *out = (dc_device_t *) device;
> >+
> >+ return DC_STATUS_SUCCESS;
> >+}
>
> Why do we need both NONE and OPEN? I don't see any difference between the
> two. The api prevents you from returning an handle in the NONE state. So I
> see no reason to keep the OPEN state.
>
I just thought it would be sane to actually represent all the states we
can have, if we where to change something in the future in how we do
things.
> >+static dc_status_t
> >+hw_ostc3_device_init (dc_device_t *abstract)
> >+{
> >+ hw_ostc3_device_t *device = (hw_ostc3_device_t*) abstract;
> >+ dc_context_t *context = (abstract ? abstract->context : NULL);
> >+
> >+ if (device->state != OPEN)
> >+ return DC_STATUS_INVALIDARGS;
>
> This condition can never happen. (see previous comment)
>
This might be a bit over cautious, Fixed.
> >@@ -269,14 +305,20 @@ static dc_status_t
> > hw_ostc3_device_close (dc_device_t *abstract)
> > {
> > hw_ostc3_device_t *device = (hw_ostc3_device_t*) abstract;
> >+ dc_status_t status;
> >
> >- // Send the exit command.
> >- dc_status_t status = hw_ostc3_transfer (device, NULL, EXIT, NULL, 0, NULL, 0);
> >- if (status != DC_STATUS_SUCCESS) {
> >- ERROR (abstract->context, "Failed to send the command.");
> >- serial_close (device->port);
> >- free (device);
> >- return status;
> >+ if (device->state == NONE)
> >+ return DC_STATUS_INVALIDARGS;
>
> Same here. If it where possible, you even have a memory leak here. The close
> function should always clean up all resources. If the close fails, how are
> you supposed to clean up? The return value is purely informational.
Makes sense. Fixed.
> >
> > // Close the device.
> >@@ -313,6 +355,7 @@ dc_status_t
> > hw_ostc3_device_version (dc_device_t *abstract, unsigned char data[], unsigned int size)
> > {
> > hw_ostc3_device_t *device = (hw_ostc3_device_t *) abstract;
> >+ dc_status_t rc;
>
> Initialize variables as much as possible.
>
Fixed.
> > if (!ISINSTANCE (abstract))
> > return DC_STATUS_INVALIDARGS;
> >@@ -320,8 +363,11 @@ hw_ostc3_device_version (dc_device_t *abstract, unsigned char data[], unsigned i
> > if (size != SZ_VERSION)
> > return DC_STATUS_INVALIDARGS;
> >
> >+ if ((rc = hw_ostc3_check_state_or_init(abstract)) != DC_STATUS_SUCCESS)
> >+ return rc;
>
> Move the assignment out of the if condition. That makes the code more readable.
Fixed.
//Anton
--
Anton Lundin +46702-161604
More information about the devel
mailing list