OSTCTools import support

Jef Driesen jef at libdivecomputer.org
Fri Apr 3 00:13:03 PDT 2015


On 2015-04-02 18:29, Dirk Hohndel wrote:
> On Sun, Mar 29, 2015 at 08:46:29PM +0200, Salvador Cuñat wrote:
>> +
>> +/*
>> + * Parse data buffers instead of dc devices downloaded data.
>> + * Intended to be used to parse profile data from binary files during 
>> import tasks.
>> + * Actually included Uwatec families because of smartrak import and 
>> H&W families
>> + * for future use in "OSTC TOOLS" .dive files import.
>> + * For others, simply include them in the switch  (check parameters).
>> + * Note that dc_descriptor_t in data  *must* have been filled using 
>> dc_descriptor_iterator()
>> + * calls.
>> + */
>> +dc_status_t libdc_buffer_parser(struct dive *dive, device_data_t 
>> *data, unsigned char *buffer, int size)
>> +{
>> +	dc_status_t rc;
>> +	dc_parser_t *parser = NULL;
>> +
>> +	switch (data->descriptor->type) {
>> +	case DC_FAMILY_UWATEC_ALADIN:
>> +	case DC_FAMILY_UWATEC_MEMOMOUSE:
>> +		rc = uwatec_memomouse_parser_create(&parser, data->context, 0, 0);
>> +		break;
>> +	case DC_FAMILY_UWATEC_SMART:
>> +	case DC_FAMILY_UWATEC_MERIDIAN:
>> +		rc = uwatec_smart_parser_create (&parser, data->context, 
>> data->descriptor->model, 0, 0);
>> +		break;
>> +	case DC_FAMILY_HW_OSTC:
>> +		rc = hw_ostc_parser_create (&parser, data->context, data->deviceid, 
>> 0);
>> +		break;
>> +	case DC_FAMILY_HW_FROG:
>> +	case DC_FAMILY_HW_OSTC3:
>> +		rc = hw_ostc_parser_create (&parser, data->context, data->deviceid, 
>> 1);
>> +		break;
>> +	}
>> +	if  (rc != DC_STATUS_SUCCESS) {
>> +		fprintf(stderr, "Error creating parser.\n");
>> +		dc_parser_destroy (parser);
>> +		return rc;
>> +	}
>> +	rc = dc_parser_set_data(parser, buffer, size);
>> +	if (rc != DC_STATUS_SUCCESS) {
>> +		fprintf(stderr, "Error registering the data.\n");
>> +		dc_parser_destroy (parser);
>> +		return rc;
>> +	}
>> +	// Do not parse Aladin/Memomouse headers as they are fakes
>> +	// Do not return on error, we can still parse the samples
>> +	if (data->descriptor->type != DC_FAMILY_UWATEC_ALADIN && 
>> data->descriptor->type != DC_FAMILY_UWATEC_MEMOMOUSE) {
>> +		rc = libdc_header_parser (parser, data, dive);
>> +		if (rc != DC_STATUS_SUCCESS) {
>> +			fprintf(stderr, "Error parsing the dive header data. Dive # %d\n", 
>> dive->number);
>> +		}
>> +	}
>> +	rc = dc_parser_samples_foreach (parser, sample_cb, &dive->dc);
>> +	if (rc != DC_STATUS_SUCCESS) {
>> +		fprintf(stderr, "Error parsing the sample data. Dive # %d\nStatus = 
>> %s\n", dive->number, errmsg(rc));
>> +		dc_parser_destroy (parser);
>> +		return rc;
>> +	}
>> +	dc_parser_destroy(parser);
>> +	return(DC_STATUS_SUCCESS);
>> +}
> 
> So the caller assembles a device_data_t buffer and then hands this to 
> this
> function... but that functionality already exists inside 
> libdivecomputer.
> I'm sure I'm missing something obvious, but why are we replicating this
> here? Is it because of the "fake headers" in the Aladin/Memomouse case?
> Why wouldn't you just call dc_parser_new() to get the correct parser?

The dc_parser_new() function requires a valid device handle. In this 
offline parsing scenario, you don't have that. That's a shortcoming 
which is already on my todo list:

The dive callback of the dc_device_foreach() function will be changed to 
no longer return the binary data, but immediately return a parser 
object. The consequence is that you'll no longer need the 
dc_parser_new() function, except for the offline parsing scenario. For 
this purpose, it will be changed to take a device descriptor instead of 
a device handle. The raw data will also need to be passed directly to 
this new dc_parser_new, such that we can get rid of the silly 
dc_parser_set_data() function.

Jef


More information about the subsurface mailing list