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; | 	return pressure.mbar * 0.0145037738 + 0.5; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static inline double to_ATM(pressure_t pressure) | ||||||
|  | { | ||||||
|  | 	return pressure.mbar / 1013.25; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| struct sample { | struct sample { | ||||||
| 	duration_t time; | 	duration_t time; | ||||||
| 	depth_t depth; | 	depth_t depth; | ||||||
|  | @ -171,6 +176,7 @@ struct dive { | ||||||
| 	depth_t visibility; | 	depth_t visibility; | ||||||
| 	temperature_t airtemp, watertemp; | 	temperature_t airtemp, watertemp; | ||||||
| 	cylinder_t cylinder[MAX_CYLINDERS]; | 	cylinder_t cylinder[MAX_CYLINDERS]; | ||||||
|  | 	int otu; | ||||||
| 	struct event *events; | 	struct event *events; | ||||||
| 	int samples, alloc_samples; | 	int samples, alloc_samples; | ||||||
| 	struct sample sample[]; | 	struct sample sample[]; | ||||||
|  |  | ||||||
							
								
								
									
										66
									
								
								divelist.c
									
										
									
									
									
								
							
							
						
						
									
										66
									
								
								divelist.c
									
										
									
									
									
								
							|  | @ -14,6 +14,7 @@ | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| #include <string.h> | #include <string.h> | ||||||
| #include <time.h> | #include <time.h> | ||||||
|  | #include <math.h> | ||||||
| 
 | 
 | ||||||
| #include "divelist.h" | #include "divelist.h" | ||||||
| #include "dive.h" | #include "dive.h" | ||||||
|  | @ -44,6 +45,7 @@ enum { | ||||||
| 	DIVE_CYLINDER, | 	DIVE_CYLINDER, | ||||||
| 	DIVE_NITROX,		/* int: in permille */ | 	DIVE_NITROX,		/* int: in permille */ | ||||||
| 	DIVE_SAC,		/* int: in ml/min */ | 	DIVE_SAC,		/* int: in ml/min */ | ||||||
|  | 	DIVE_OTU,		/* int: in OTUs */ | ||||||
| 	DIVE_LOCATION,		/* "2nd Cathedral, Lanai" */ | 	DIVE_LOCATION,		/* "2nd Cathedral, Lanai" */ | ||||||
| 	DIVELIST_COLUMNS | 	DIVELIST_COLUMNS | ||||||
| }; | }; | ||||||
|  | @ -222,6 +224,47 @@ static void sac_data_func(GtkTreeViewColumn *col, | ||||||
| 	g_object_set(renderer, "text", buffer, NULL); | 	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). |  * Return air usage (in liters). | ||||||
|  */ |  */ | ||||||
|  | @ -310,6 +353,7 @@ static void fill_one_dive(struct dive *dive, | ||||||
| 		DIVE_LOCATION, location, | 		DIVE_LOCATION, location, | ||||||
| 		DIVE_CYLINDER, cylinder, | 		DIVE_CYLINDER, cylinder, | ||||||
| 		DIVE_SAC, sac, | 		DIVE_SAC, sac, | ||||||
|  | 		DIVE_OTU, dive->otu, | ||||||
| 		-1); | 		-1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -389,6 +433,7 @@ static void fill_dive_list(void) | ||||||
| 	for (i = 0; i < dive_table.nr; i++) { | 	for (i = 0; i < dive_table.nr; i++) { | ||||||
| 		struct dive *dive = dive_table.dives[i]; | 		struct dive *dive = dive_table.dives[i]; | ||||||
| 
 | 
 | ||||||
|  | 		dive->otu = calculate_otu(dive); | ||||||
| 		gtk_list_store_append(store, &iter); | 		gtk_list_store_append(store, &iter); | ||||||
| 		gtk_list_store_set(store, &iter, | 		gtk_list_store_set(store, &iter, | ||||||
| 			DIVE_INDEX, i, | 			DIVE_INDEX, i, | ||||||
|  | @ -424,7 +469,7 @@ typedef void (*data_func_t)(GtkTreeViewColumn *col, | ||||||
| 			    gpointer data); | 			    gpointer data); | ||||||
| 
 | 
 | ||||||
| static GtkTreeViewColumn *divelist_column(struct DiveList *dl, int index, const char *title, | 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; | 	GtkCellRenderer *renderer; | ||||||
| 	GtkTreeViewColumn *col; | 	GtkTreeViewColumn *col; | ||||||
|  | @ -454,6 +499,7 @@ static GtkTreeViewColumn *divelist_column(struct DiveList *dl, int index, const | ||||||
| 		break; | 		break; | ||||||
| 	} | 	} | ||||||
| 	gtk_cell_renderer_set_alignment(GTK_CELL_RENDERER(renderer), xalign, 0.5); | 	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); | 	gtk_tree_view_append_column(GTK_TREE_VIEW(dl->tree_view), col); | ||||||
| 	return col; | 	return col; | ||||||
| } | } | ||||||
|  | @ -480,6 +526,7 @@ GtkWidget *dive_list_create(void) | ||||||
| 				G_TYPE_STRING,			/* Cylinder */ | 				G_TYPE_STRING,			/* Cylinder */ | ||||||
| 				G_TYPE_INT,			/* Nitrox */ | 				G_TYPE_INT,			/* Nitrox */ | ||||||
| 				G_TYPE_INT,			/* SAC */ | 				G_TYPE_INT,			/* SAC */ | ||||||
|  | 				G_TYPE_INT,			/* OTU */ | ||||||
| 				G_TYPE_STRING			/* Location */ | 				G_TYPE_STRING			/* Location */ | ||||||
| 				); | 				); | ||||||
| 	dive_list.tree_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(dive_list.model)); | 	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_tree_selection_set_mode(GTK_TREE_SELECTION(selection), GTK_SELECTION_BROWSE); | ||||||
| 	gtk_widget_set_size_request(dive_list.tree_view, 200, 200); | 	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.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); | 	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); | 	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); | 	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); | 	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); | 	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); | 	dive_list.sac = divelist_column(&dive_list, DIVE_SAC, "SAC", sac_data_func, PANGO_ALIGN_CENTER, TRUE); | ||||||
| 	dive_list.location = divelist_column(&dive_list, DIVE_LOCATION, "Location", NULL, PANGO_ALIGN_LEFT); | 	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(); | 	fill_dive_list(); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1083,7 +1083,7 @@ static void match_standard_cylinder(cylinder_type_t *type) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	cuft = type->size.mliter / 28317.0; | 	cuft = type->size.mliter / 28317.0; | ||||||
| 	cuft *= type->workingpressure.mbar / 1013.25; | 	cuft *= to_ATM(type->workingpressure); | ||||||
| 	psi = type->workingpressure.mbar / 68.95; | 	psi = type->workingpressure.mbar / 68.95; | ||||||
| 
 | 
 | ||||||
| 	switch (psi) { | 	switch (psi) { | ||||||
|  | @ -1138,7 +1138,7 @@ static void sanitize_cylinder_type(cylinder_type_t *type) | ||||||
| 
 | 
 | ||||||
| 	if (input_units.volume == CUFT || import_source == SUUNTO) { | 	if (input_units.volume == CUFT || import_source == SUUNTO) { | ||||||
| 		volume_of_air = type->size.mliter * 28.317;	/* milli-cu ft to milliliter */ | 		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" */ | 		volume = volume_of_air / atm;			/* milliliters at 1 atm: "true size" */ | ||||||
| 		type->size.mliter = volume + 0.5; | 		type->size.mliter = volume + 0.5; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue