mirror of
				https://github.com/subsurface/subsurface.git
				synced 2025-02-19 22:16:15 +00:00 
			
		
		
		
	Do not count gas used in planned dives for statistics
This is important if in one dive we have the real dive and
a planned version of the dive as different computers using
different sets of cylinders.
[Dirk Hohndel: an early version of this was mistakenly pushed out
               by me; I reverted that and added this commit since
               fixing things up as I had done for the other two
               patches made things nearly unreadable]
Signed-off-by: Robert C. Helling <helling@atdotde.de>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
			
			
This commit is contained in:
		
							parent
							
								
									67de8f3a49
								
							
						
					
					
						commit
						5aa9c6fa1b
					
				
					 1 changed files with 29 additions and 14 deletions
				
			
		|  | @ -326,41 +326,56 @@ void get_selected_dives_text(char *buffer, size_t size) | |||
| 
 | ||||
| #define SOME_GAS 5000 // 5bar drop in cylinder pressure makes cylinder used
 | ||||
| 
 | ||||
| bool has_gaschange_event(struct dive *dive, struct divecomputer *dc, int idx) { | ||||
| 	bool first_gas_explicit = false; | ||||
| 	struct event *event = get_next_event(dc->events, "gaschange"); | ||||
| 	while (event) { | ||||
| 		if (dc->sample && (event->time.seconds == 0 || | ||||
| 				   (dc->samples && dc->sample[0].time.seconds == event->time.seconds))) | ||||
| 			first_gas_explicit = true; | ||||
| 		if (get_cylinder_index(dive, event) == idx) | ||||
| 			return true; | ||||
| 		event = get_next_event(event->next, "gaschange"); | ||||
| 	} | ||||
| 	if (dc->divemode == CCR && (idx == dive->diluent_cylinder_index || idx == dive->oxygen_cylinder_index)) | ||||
| 		return true; | ||||
| 	return !first_gas_explicit && idx == 0; | ||||
| } | ||||
| 
 | ||||
| bool is_cylinder_used(struct dive *dive, int idx) | ||||
| { | ||||
| 	struct divecomputer *dc; | ||||
| 	bool firstGasExplicit = false; | ||||
| 	if (cylinder_none(&dive->cylinder[idx])) | ||||
| 		return false; | ||||
| 
 | ||||
| 	if ((dive->cylinder[idx].start.mbar - dive->cylinder[idx].end.mbar) > SOME_GAS) | ||||
| 		return true; | ||||
| 	for_each_dc(dive, dc) { | ||||
| 		struct event *event = get_next_event(dc->events, "gaschange"); | ||||
| 		while (event) { | ||||
| 			if (dc->sample && (event->time.seconds == 0 || | ||||
| 					   (dc->samples && dc->sample[0].time.seconds == event->time.seconds))) | ||||
| 				firstGasExplicit = true; | ||||
| 			if (get_cylinder_index(dive, event) == idx) | ||||
| 				return true; | ||||
| 			event = get_next_event(event->next, "gaschange"); | ||||
| 		} | ||||
| 		if (dc->divemode == CCR && (idx == dive->diluent_cylinder_index || idx == dive->oxygen_cylinder_index)) | ||||
| 		if (has_gaschange_event(dive, dc, idx)) | ||||
| 			return true; | ||||
| 	} | ||||
| 	if (idx == 0 && !firstGasExplicit) | ||||
| 		return true; | ||||
| 	return false; | ||||
| } | ||||
| 
 | ||||
| void get_gas_used(struct dive *dive, volume_t gases[MAX_CYLINDERS]) | ||||
| { | ||||
| 	int idx; | ||||
| 	struct divecomputer *dc; | ||||
| 	bool used; | ||||
| 
 | ||||
| 	for (idx = 0; idx < MAX_CYLINDERS; idx++) { | ||||
| 		used = false; | ||||
| 		cylinder_t *cyl = &dive->cylinder[idx]; | ||||
| 		pressure_t start, end; | ||||
| 
 | ||||
| 		if (!is_cylinder_used(dive, idx)) | ||||
| 		for_each_dc(dive, dc) { | ||||
| 			if (!strcmp(dc->model, "planned dive")) | ||||
| 				continue; | ||||
| 			if (has_gaschange_event(dive, dc, idx)) | ||||
| 				used = true; | ||||
| 		} | ||||
| 
 | ||||
| 		if (!used) | ||||
| 			continue; | ||||
| 
 | ||||
| 		start = cyl->start.mbar ? cyl->start : cyl->sample_start; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue