[PATCH] Add EON Steel gas change event parsing

Dirk Hohndel dirk at hohndel.org
Sat Jan 3 15:51:23 PST 2015


All three patches in this series are now in the Subsurface-testing
branch...

I know that Jef is working on cylinder based switching - I also know that
he is quite busy with his real life right now, so no idea how long it will
take to get this implemented.

I'd be ok with passing this as a flag to Subsurface. one-based is kind of
awkward but seems to make the most sense as 0 really should mean "unknown"
in this context.

Feel free to send patches that implement that on both sides :-)

/D

On Fri, Jan 02, 2015 at 10:39:21PM -0800, Linus Torvalds wrote:
> 
> From: Linus Torvalds <torvalds at linux-foundation.org>
> Date: Fri, 2 Jan 2015 22:23:40 -0800
> Subject: [PATCH] Add EON Steel gas change event parsing
> 
> The really sad part is that the EON Steel handles gas change events
> correctly, by actually saying which cylinder it switches to.  But the
> libdivecomputer interfaces are broken, and only contain the gas *mix*
> you switch to, which is ambiguous since you could have the same mix in
> multiple cylinders.
> 
> Maybe we could put the one-based cylinder index into the "flags" field?
> With zero meaning "unknown". That would be a straightforward extension.
> 
> Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>
> ---
> 
> It's really sad how this loses the cylinder number information, but other 
> than that it seems to work for me.
> 
> There's a lot of other events that I don't parse, and that I now have that 
> Don took the EON Steel down to 200 ft with trimix and sharks, but this is 
> the primary missing one.
> 
>  src/suunto_eonsteel_parser.c | 22 ++++++++++++++++++++++
>  1 file changed, 22 insertions(+)
> 
> diff --git a/src/suunto_eonsteel_parser.c b/src/suunto_eonsteel_parser.c
> index 6c4f4aba3d39..d5bfb0e74942 100644
> --- a/src/suunto_eonsteel_parser.c
> +++ b/src/suunto_eonsteel_parser.c
> @@ -291,6 +291,25 @@ static void sample_cylinder_pressure(struct sample_data *info, unsigned char idx
>  	if (info->callback) info->callback(DC_SAMPLE_PRESSURE, sample, info->userdata);
>  }
>  
> +static void sample_gas_switch_event(struct sample_data *info, unsigned short idx)
> +{
> +	suunto_eonsteel_parser_t *eon = info->eon;
> +	dc_sample_value_t sample = {0};
> +	int o2, he;
> +
> +	if (idx < 1 || idx > eon->cache.ngases)
> +		return;
> +
> +	// Horrible, broken, gas change events
> +	o2 = 100 * eon->cache.gasmix[idx-1].oxygen;
> +	he = 100 * eon->cache.gasmix[idx-1].helium;
> +
> +	sample.event.type = SAMPLE_EVENT_GASCHANGE2;
> +	sample.event.value = o2 | (he << 16);
> +
> +	if (info->callback) info->callback(DC_SAMPLE_EVENT, sample, info->userdata);
> +}
> +
>  static int traverse_samples(unsigned short type, const struct type_desc *desc, const unsigned char *data, int len, void *user)
>  {
>  	struct sample_data *info = (struct sample_data *) user;
> @@ -311,6 +330,9 @@ static int traverse_samples(unsigned short type, const struct type_desc *desc, c
>  	case 0x000a: // cylinder idx in first byte, pressure in next word
>  		sample_cylinder_pressure(info, data[0], array_uint16_le(data+1));
>  		break;
> +	case 0x001d:
> +		sample_gas_switch_event(info, array_uint16_le(data));
> +		break;
>  	}
>  	return 0;
>  }
> -- 
> 2.2.1.212.gc5b9256
> 


More information about the devel mailing list