mirror of
				https://github.com/subsurface/subsurface.git
				synced 2025-02-19 22:16:15 +00:00 
			
		
		
		
	Merge branch 'otu-tracking-v2' of git://github.com/dirkhh/subsurface
* 'otu-tracking-v2' of git://github.com/dirkhh/subsurface: Make OTU column invisible by default Add OTU to divelist Calculate OTUs for every dive Fix up trivial conflicts in dive.h (due to dive event handling also adding a field to the dive structure)
This commit is contained in:
		
						commit
						2a8f7ab78f
					
				
					 3 changed files with 65 additions and 11 deletions
				
			
		
							
								
								
									
										6
									
								
								dive.h
									
										
									
									
									
								
							
							
						
						
									
										6
									
								
								dive.h
									
										
									
									
									
								
							|  | @ -134,6 +134,11 @@ static inline int to_PSI(pressure_t pressure) | |||
| 	return pressure.mbar * 0.0145037738 + 0.5; | ||||
| } | ||||
| 
 | ||||
| static inline double to_ATM(pressure_t pressure) | ||||
| { | ||||
| 	return pressure.mbar / 1013.25; | ||||
| } | ||||
| 
 | ||||
| struct sample { | ||||
| 	duration_t time; | ||||
| 	depth_t depth; | ||||
|  | @ -171,6 +176,7 @@ struct dive { | |||
| 	depth_t visibility; | ||||
| 	temperature_t airtemp, watertemp; | ||||
| 	cylinder_t cylinder[MAX_CYLINDERS]; | ||||
| 	int otu; | ||||
| 	struct event *events; | ||||
| 	int samples, alloc_samples; | ||||
| 	struct sample sample[]; | ||||
|  |  | |||
							
								
								
									
										66
									
								
								divelist.c
									
										
									
									
									
								
							
							
						
						
									
										66
									
								
								divelist.c
									
										
									
									
									
								
							|  | @ -14,6 +14,7 @@ | |||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include <time.h> | ||||
| #include <math.h> | ||||
| 
 | ||||
| #include "divelist.h" | ||||
| #include "dive.h" | ||||
|  | @ -44,6 +45,7 @@ enum { | |||
| 	DIVE_CYLINDER, | ||||
| 	DIVE_NITROX,		/* int: in permille */ | ||||
| 	DIVE_SAC,		/* int: in ml/min */ | ||||
| 	DIVE_OTU,		/* int: in OTUs */ | ||||
| 	DIVE_LOCATION,		/* "2nd Cathedral, Lanai" */ | ||||
| 	DIVELIST_COLUMNS | ||||
| }; | ||||
|  | @ -222,6 +224,47 @@ static void sac_data_func(GtkTreeViewColumn *col, | |||
| 	g_object_set(renderer, "text", buffer, NULL); | ||||
| } | ||||
| 
 | ||||
| /* Render the OTU data (integer value of "OTU") */ | ||||
| static void otu_data_func(GtkTreeViewColumn *col, | ||||
| 			  GtkCellRenderer *renderer, | ||||
| 			  GtkTreeModel *model, | ||||
| 			  GtkTreeIter *iter, | ||||
| 			  gpointer data) | ||||
| { | ||||
| 	int value; | ||||
| 	char buffer[16]; | ||||
| 
 | ||||
| 	gtk_tree_model_get(model, iter, DIVE_OTU, &value, -1); | ||||
| 
 | ||||
| 	if (!value) { | ||||
| 		g_object_set(renderer, "text", "", NULL); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	snprintf(buffer, sizeof(buffer), "%d", value); | ||||
| 
 | ||||
| 	g_object_set(renderer, "text", buffer, NULL); | ||||
| } | ||||
| 
 | ||||
| /* calculate OTU for a dive */ | ||||
| static int calculate_otu(struct dive *dive) | ||||
| { | ||||
| 	int i; | ||||
| 	double otu = 0.0; | ||||
| 
 | ||||
| 	for (i = 1; i < dive->samples; i++) { | ||||
| 		int t; | ||||
| 		double po2; | ||||
| 		struct sample *sample = dive->sample + i; | ||||
| 		struct sample *psample = sample - 1; | ||||
| 		t = sample->time.seconds - psample->time.seconds; | ||||
| 		po2 = dive->cylinder[sample->cylinderindex].gasmix.o2.permille / 1000.0 * | ||||
| 			(sample->depth.mm + 10000) / 10000.0; | ||||
| 		if (po2 >= 0.5) | ||||
| 			otu += pow(po2 - 0.5, 0.83) * t / 30.0; | ||||
| 	} | ||||
| 	return otu + 0.5; | ||||
| } | ||||
| /*
 | ||||
|  * Return air usage (in liters). | ||||
|  */ | ||||
|  | @ -310,6 +353,7 @@ static void fill_one_dive(struct dive *dive, | |||
| 		DIVE_LOCATION, location, | ||||
| 		DIVE_CYLINDER, cylinder, | ||||
| 		DIVE_SAC, sac, | ||||
| 		DIVE_OTU, dive->otu, | ||||
| 		-1); | ||||
| } | ||||
| 
 | ||||
|  | @ -389,6 +433,7 @@ static void fill_dive_list(void) | |||
| 	for (i = 0; i < dive_table.nr; i++) { | ||||
| 		struct dive *dive = dive_table.dives[i]; | ||||
| 
 | ||||
| 		dive->otu = calculate_otu(dive); | ||||
| 		gtk_list_store_append(store, &iter); | ||||
| 		gtk_list_store_set(store, &iter, | ||||
| 			DIVE_INDEX, i, | ||||
|  | @ -424,7 +469,7 @@ typedef void (*data_func_t)(GtkTreeViewColumn *col, | |||
| 			    gpointer data); | ||||
| 
 | ||||
| static GtkTreeViewColumn *divelist_column(struct DiveList *dl, int index, const char *title, | ||||
| 					data_func_t data_func, PangoAlignment align) | ||||
| 					data_func_t data_func, PangoAlignment align, gboolean visible) | ||||
| { | ||||
| 	GtkCellRenderer *renderer; | ||||
| 	GtkTreeViewColumn *col; | ||||
|  | @ -454,6 +499,7 @@ static GtkTreeViewColumn *divelist_column(struct DiveList *dl, int index, const | |||
| 		break; | ||||
| 	} | ||||
| 	gtk_cell_renderer_set_alignment(GTK_CELL_RENDERER(renderer), xalign, 0.5); | ||||
| 	gtk_tree_view_column_set_visible(col, visible); | ||||
| 	gtk_tree_view_append_column(GTK_TREE_VIEW(dl->tree_view), col); | ||||
| 	return col; | ||||
| } | ||||
|  | @ -480,6 +526,7 @@ GtkWidget *dive_list_create(void) | |||
| 				G_TYPE_STRING,			/* Cylinder */ | ||||
| 				G_TYPE_INT,			/* Nitrox */ | ||||
| 				G_TYPE_INT,			/* SAC */ | ||||
| 				G_TYPE_INT,			/* OTU */ | ||||
| 				G_TYPE_STRING			/* Location */ | ||||
| 				); | ||||
| 	dive_list.tree_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(dive_list.model)); | ||||
|  | @ -490,14 +537,15 @@ GtkWidget *dive_list_create(void) | |||
| 	gtk_tree_selection_set_mode(GTK_TREE_SELECTION(selection), GTK_SELECTION_BROWSE); | ||||
| 	gtk_widget_set_size_request(dive_list.tree_view, 200, 200); | ||||
| 
 | ||||
| 	dive_list.date = divelist_column(&dive_list, DIVE_DATE, "Date", date_data_func, PANGO_ALIGN_LEFT); | ||||
| 	dive_list.depth = divelist_column(&dive_list, DIVE_DEPTH, "ft", depth_data_func, PANGO_ALIGN_RIGHT); | ||||
| 	dive_list.duration = divelist_column(&dive_list, DIVE_DURATION, "min", duration_data_func, PANGO_ALIGN_RIGHT); | ||||
| 	dive_list.temperature = divelist_column(&dive_list, DIVE_TEMPERATURE, UTF8_DEGREE "F", temperature_data_func, PANGO_ALIGN_RIGHT); | ||||
| 	dive_list.cylinder = divelist_column(&dive_list, DIVE_CYLINDER, "Cyl", NULL, PANGO_ALIGN_CENTER); | ||||
| 	dive_list.nitrox = divelist_column(&dive_list, DIVE_NITROX, "O" UTF8_SUBSCRIPT_2 "%", nitrox_data_func, PANGO_ALIGN_CENTER); | ||||
| 	dive_list.sac = divelist_column(&dive_list, DIVE_SAC, "SAC", sac_data_func, PANGO_ALIGN_CENTER); | ||||
| 	dive_list.location = divelist_column(&dive_list, DIVE_LOCATION, "Location", NULL, PANGO_ALIGN_LEFT); | ||||
| 	dive_list.date = divelist_column(&dive_list, DIVE_DATE, "Date", date_data_func, PANGO_ALIGN_LEFT, TRUE); | ||||
| 	dive_list.depth = divelist_column(&dive_list, DIVE_DEPTH, "ft", depth_data_func, PANGO_ALIGN_RIGHT, TRUE); | ||||
| 	dive_list.duration = divelist_column(&dive_list, DIVE_DURATION, "min", duration_data_func, PANGO_ALIGN_RIGHT, TRUE); | ||||
| 	dive_list.temperature = divelist_column(&dive_list, DIVE_TEMPERATURE, UTF8_DEGREE "F", temperature_data_func, PANGO_ALIGN_RIGHT, TRUE); | ||||
| 	dive_list.cylinder = divelist_column(&dive_list, DIVE_CYLINDER, "Cyl", NULL, PANGO_ALIGN_CENTER, TRUE); | ||||
| 	dive_list.nitrox = divelist_column(&dive_list, DIVE_NITROX, "O" UTF8_SUBSCRIPT_2 "%", nitrox_data_func, PANGO_ALIGN_CENTER, TRUE); | ||||
| 	dive_list.sac = divelist_column(&dive_list, DIVE_SAC, "SAC", sac_data_func, PANGO_ALIGN_CENTER, TRUE); | ||||
| 	dive_list.sac = divelist_column(&dive_list, DIVE_OTU, "OTU", otu_data_func, PANGO_ALIGN_CENTER, FALSE); | ||||
| 	dive_list.location = divelist_column(&dive_list, DIVE_LOCATION, "Location", NULL, PANGO_ALIGN_LEFT, TRUE); | ||||
| 
 | ||||
| 	fill_dive_list(); | ||||
| 
 | ||||
|  |  | |||
|  | @ -1083,7 +1083,7 @@ static void match_standard_cylinder(cylinder_type_t *type) | |||
| 		return; | ||||
| 
 | ||||
| 	cuft = type->size.mliter / 28317.0; | ||||
| 	cuft *= type->workingpressure.mbar / 1013.25; | ||||
| 	cuft *= to_ATM(type->workingpressure); | ||||
| 	psi = type->workingpressure.mbar / 68.95; | ||||
| 
 | ||||
| 	switch (psi) { | ||||
|  | @ -1138,7 +1138,7 @@ static void sanitize_cylinder_type(cylinder_type_t *type) | |||
| 
 | ||||
| 	if (input_units.volume == CUFT || import_source == SUUNTO) { | ||||
| 		volume_of_air = type->size.mliter * 28.317;	/* milli-cu ft to milliliter */ | ||||
| 		atm = type->workingpressure.mbar / 1013.25;	/* working pressure in atm */ | ||||
| 		atm = to_ATM(type->workingpressure);		/* working pressure in atm */ | ||||
| 		volume = volume_of_air / atm;			/* milliliters at 1 atm: "true size" */ | ||||
| 		type->size.mliter = volume + 0.5; | ||||
| 	} | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue