--- examples/dctool_download.c | 2 +- src/cochran_commander.c | 23 ++++++++------------- src/cochran_commander_parser.c | 47 +++++++++++++++++++++--------------------- 3 files changed, 33 insertions(+), 39 deletions(-)
diff --git a/examples/dctool_download.c b/examples/dctool_download.c index 02f2be6..ffcdc41 100644 --- a/examples/dctool_download.c +++ b/examples/dctool_download.c @@ -126,7 +126,7 @@ sample_cb (dc_sample_type_t type, dc_sample_value_t value, void *userdata) fprintf (sampledata->ostream, " <gasmix>%u</gasmix>\n", value.gasmix); break; case DC_SAMPLE_ASCENT_RATE: - fprintf (sampledata->fp, " <ascent_rate>%.2f</ascent_rate>\n", + fprintf (sampledata->ostream, " <ascent_rate>%.2f</ascent_rate>\n", value.ascent_rate); break; default: diff --git a/src/cochran_commander.c b/src/cochran_commander.c index 036ca6c..3ba3786 100644 --- a/src/cochran_commander.c +++ b/src/cochran_commander.c @@ -138,6 +138,7 @@ static cochran_layout_t cochran_layout_emc14 = { };
static const dc_device_vtable_t cochran_commander_device_vtable = { + sizeof(cochran_device_t), DC_FAMILY_COCHRAN_COMMANDER, cochran_commander_device_set_fingerprint, /* set_fingerprint */ cochran_commander_device_read, /* read */ @@ -187,7 +188,6 @@ cochran_packet (cochran_device_t *device, dc_event_progress_t *progress, SERIAL_PARITY_NONE, 2, SERIAL_FLOWCONTROL_NONE); if (rc == -1) { ERROR (abstract->context, "Failed to set the high baud rate."); - free (device); return DC_STATUS_IO; } } @@ -230,7 +230,6 @@ cochran_commander_serial_setup (cochran_device_t *device, dc_context_t *context) if (rc == -1) { ERROR (context, "Failed to set the terminal attributes."); serial_close (device->port); - free (device); return DC_STATUS_IO; }
@@ -249,7 +248,6 @@ cochran_commander_serial_setup (cochran_device_t *device, dc_context_t *context) if (serial_set_timeout (device->port, 5000) == -1) { ERROR (context, "Failed to set the timeout."); serial_close (device->port); - free (device); return DC_STATUS_IO; }
@@ -272,7 +270,6 @@ cochran_commander_serial_open(cochran_device_t *device, dc_context_t *context) int rc = serial_open (&device->port, context, device->name); if (rc == -1) { ERROR (context, "Failed to open the serial port."); - free (device); return DC_STATUS_IO; }
@@ -284,6 +281,7 @@ dc_status_t cochran_commander_device_open (dc_device_t **out, dc_context_t *context, const char *name) { + cochran_device_t *device = NULL; dc_status_t rc; cochran_layout_t *layout;
@@ -291,16 +289,13 @@ cochran_commander_device_open (dc_device_t **out, dc_context_t *context, return DC_STATUS_INVALIDARGS;
// Allocate memory. - cochran_device_t *device = (cochran_device_t *) malloc ( - sizeof (cochran_device_t)); + device = (cochran_device_t *) + dc_device_allocate(context, &cochran_commander_device_vtable); if (device == NULL) { ERROR (context, "Failed to allocate memory."); return DC_STATUS_NOMEMORY; }
- // Initialize the base class. - device_init (&device->base, context, &cochran_commander_device_vtable); - // Set the default values. device->port = NULL; device->name = name; @@ -310,8 +305,10 @@ cochran_commander_device_open (dc_device_t **out, dc_context_t *context, NULL, 0);
rc = cochran_commander_serial_open(device, context); - if (rc != DC_STATUS_SUCCESS) + if (rc != DC_STATUS_SUCCESS) { + dc_device_deallocate((dc_device_t *) device); return rc; + }
// Read ID from the device rc = cochran_read_id((dc_device_t *) device); @@ -319,7 +316,7 @@ cochran_commander_device_open (dc_device_t **out, dc_context_t *context, if (rc != DC_STATUS_SUCCESS) { ERROR (context, "Device not responding."); serial_close (device->port); - free (device); + dc_device_deallocate((dc_device_t *) device); return rc; }
@@ -336,7 +333,7 @@ cochran_commander_device_open (dc_device_t **out, dc_context_t *context, device->model_string[4], device->model_string[5], device->model_string[6], device->model_string[7]); serial_close (device->port); - free (device); + dc_device_deallocate((dc_device_t *) device); return DC_STATUS_UNSUPPORTED; }
@@ -353,14 +350,12 @@ cochran_commander_device_close (dc_device_t *abstract)
// Close the device. if (serial_close (device->port) == -1) { - free (device); return DC_STATUS_IO; }
// Free memory. free (device->data.logbook); free (device->data.sample); - free (device);
return DC_STATUS_SUCCESS; } diff --git a/src/cochran_commander_parser.c b/src/cochran_commander_parser.c index 434d332..bce3cad 100644 --- a/src/cochran_commander_parser.c +++ b/src/cochran_commander_parser.c @@ -40,7 +40,6 @@ dc_status_t cochran_commander_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime); static dc_status_t cochran_commander_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value); -dc_status_t cochran_commander_parser_destroy (dc_parser_t *abstract); static dc_status_t cochran_commander_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t callback, void *userdata); @@ -48,14 +47,21 @@ int cochran_commander_handle_event (dc_parser_t *abstract, dc_sample_callback_t callback, void *userdata, unsigned char code, unsigned int offset, unsigned int time);
+typedef struct cochran_commander_parser_t cochran_commander_parser_t; + +struct cochran_commander_parser_t { + dc_parser_t base; + cochran_layout_t *layout; +};
static dc_parser_vtable_t cochran_commander_parser_vtable = { + sizeof(cochran_commander_parser_t), DC_FAMILY_COCHRAN_COMMANDER, cochran_commander_parser_set_data, /* set_data */ cochran_commander_parser_get_datetime, /* datetime */ cochran_commander_parser_get_field, /* fields */ cochran_commander_parser_samples_foreach, /* samples_foreach */ - cochran_commander_parser_destroy /* destroy */ + NULL /* destroy */ };
@@ -63,29 +69,18 @@ static dc_parser_vtable_t cochran_commander_parser_vtable = { dc_status_t cochran_commander_parser_create (dc_parser_t **out, dc_context_t *context) { + cochran_commander_parser_t *parser = NULL; if (out == NULL) return DC_STATUS_INVALIDARGS;
// Allocate memory. - dc_parser_t *parser = (dc_parser_t *) malloc (sizeof (dc_parser_t)); + parser = (cochran_commander_parser_t *) dc_parser_allocate(context, &cochran_commander_parser_vtable); if (parser == NULL) { ERROR (context, "Failed to allocate memory."); return DC_STATUS_NOMEMORY; }
- parser_init (parser, context, &cochran_commander_parser_vtable); - - *out = parser; - - return DC_STATUS_SUCCESS; -} - - -dc_status_t -cochran_commander_parser_destroy (dc_parser_t *abstract) -{ - // Free memory. - free (abstract); + *out = (dc_parser_t *) parser;
return DC_STATUS_SUCCESS; } @@ -95,11 +90,16 @@ dc_status_t cochran_commander_parser_set_data (dc_parser_t *abstract, const unsigned char *data, unsigned int size) { + cochran_commander_parser_t *parser = (cochran_commander_parser_t *) abstract; abstract->data = data; abstract->size = size;
+ // Determine cochran data format + // abstract->data is prefixed by the model string + parser->layout = cochran_commander_get_layout(data); + return DC_STATUS_SUCCESS; -} +}
// There are two date formats used by Cochran @@ -107,12 +107,11 @@ dc_status_t cochran_commander_parser_get_datetime (dc_parser_t *abstract, dc_datetime_t *datetime) { + cochran_commander_parser_t *parser = (cochran_commander_parser_t *) abstract; const unsigned char *data = abstract->data; const unsigned char *log = data + COCHRAN_MODEL_SIZE; - // abstract->data is prefixed by the model string - cochran_layout_t *layout = cochran_commander_get_layout(data);
- if (layout->date_format == DATE_SMHDMY) { + if (parser->layout->date_format == DATE_SMHDMY) { datetime->second = log[0]; datetime->minute = log[1]; datetime->hour = log[2]; @@ -135,9 +134,9 @@ static dc_status_t cochran_commander_parser_get_field (dc_parser_t *abstract, dc_field_type_t type, unsigned int flags, void *value) { - cochran_layout_t *layout = cochran_commander_get_layout(abstract->data); + cochran_commander_parser_t *parser = (cochran_commander_parser_t *) abstract;
- switch (layout->model & 0xFF0000) + switch (parser->layout->model & 0xFF0000) { case COCHRAN_MODEL_COMMANDER_FAMILY: return cochran_cmdr_parser_get_field(abstract, type, flags, value); @@ -154,9 +153,9 @@ static dc_status_t cochran_commander_parser_samples_foreach (dc_parser_t *abstract, dc_sample_callback_t callback, void *userdata) { - cochran_layout_t *layout = cochran_commander_get_layout(abstract->data); + cochran_commander_parser_t *parser = (cochran_commander_parser_t *) abstract;
- switch (layout->model & 0xFF0000) + switch (parser->layout->model & 0xFF0000) { case COCHRAN_MODEL_COMMANDER_FAMILY: return cochran_cmdr_parser_samples_foreach(abstract, callback,