[PATCH v2 12/15] Firmware upgrade for OSTC3

Anton Lundin glance at acc.umu.se
Sat Dec 20 03:13:44 PST 2014


On 20 December, 2014 - Anton Lundin wrote:

> On 19 December, 2014 - Jef Driesen wrote:
> 
> > 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.
> > 
> 
> Yea, i think this one looks better. Go with this one.
> 
> 
> > >+	// 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.
> > 
> 
> Of course, failing on the goal line.
> 
> > 
> > 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).
> > 
> 
> I still like my way of parsing the firmware files better than yours, but
> if you want it that way, fine.
> 
> 

I did do a round of cleanup, and to test how things looked with the
hw_ostc3_device_init-code and they are all how cleaned and fixed on
github.

If you would like to see them, i can send them out, or you can look at:
https://github.com/glance-/libdivecomputer/tree/ostc3_fw


//Anton


-- 
Anton Lundin	+46702-161604


More information about the devel mailing list