[PATCH v2 12/15] Firmware upgrade for OSTC3

Jef Driesen jef at libdivecomputer.org
Fri Dec 19 08:05:00 PST 2014


On 2014-12-17 23:11, Anton Lundin wrote:
> +dc_status_t
> +hw_ostc3_device_fwupdate (dc_device_t *abstract, const char *filename)
> +{
> +	[...]
> +
> +	// Make sure the device is in service mode
> +	if (device->state == OPEN) {
> +		rc = hw_ostc3_device_init_service(abstract);
> +		if (rc != DC_STATUS_SUCCESS) {
> +			free (firmware);
> +			return rc;
> +		}
> +	} else if (device->state != SERVICE) {
> +		free (firmware);
> +		return DC_STATUS_INVALIDARGS;
> +	}

I've been playing with the idea of merging this functionality into the 
hw_ostc3_check_state_or_init() function. This is what I came up with:

static dc_status_t
hw_ostc3_device_init (hw_ostc3_device_t *device, hw_ostc3_state_t state)
{
     dc_status_t rc = DC_STATUS_SUCCESS;

     if (device->state == state) {
         // No change.
         rc = DC_STATUS_SUCCESS;
     } else if (device->state == OPEN) {
         // Change to download/or service mode.
         if (state == DOWNLOAD) {
             rc = hw_ostc3_device_init_download(device);
         } else if (state == SERVICE) {
             rc = hw_ostc3_device_init_service(device);
         } else {
             rc = DC_STATUS_INVALIDARGS;
         }
     } else if (device->state == SERVICE && state == DOWNLOAD) {
         // Switching between service and download mode is not possible.
         // But in service mode, all download commands are supported too,
         // so there is no need to change the state.
         rc = DC_STATUS_SUCCESS;
     } else {
         // Not supported.
         rc = DC_STATUS_INVALIDARGS;
     }

     return rc;
}

What do you think? From my point of view, the main advantage is that all 
state changes are now done in a single function, where it's easy to see 
what kind of state transitions are allowed or not.

> +	// Programing done!
> +	progress.current++;
> +	device_event_emit (abstract, DC_EVENT_PROGRESS, &progress);
> +
> +	// Finished!
> +	return DC_STATUS_SUCCESS;
> +}

There is a memory leak here. You forgot to free the firmware structure.


PS: I have already implemented most of the improvements and bugfixes I 
mentioned in this and the 3 other emails. So there is no need to spend 
any time on them. If you're fine with those changes, just tell me, and 
I'll just squash them onto your commits.

I fixed a few style issues too (e.g. whitespace, signed vs unsigned int, 
and dc_device_t vs hw_ostc3_device_t in function parameters).

Jef


More information about the devel mailing list