mirror of
				https://github.com/subsurface/subsurface.git
				synced 2025-02-19 22:16:15 +00:00 
			
		
		
		
	Parse 'Diving Log' cylinder working pressure
Oh Gods. Why are all other scuba programs so f*&% messed up? The Diving Log cylinder working pressure is in bar - which is all good. But their pressure *samples* are in PSI. Why the h*ll do people mix up units in the same damn file like that? I despair at the pure incompetence sometimes. I suspect the pressure samples aren't "really" in PSI: they are probably in some user-specified units. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
		
							parent
							
								
									1cc62d5811
								
							
						
					
					
						commit
						61d0aa10e1
					
				
					 1 changed files with 43 additions and 15 deletions
				
			
		
							
								
								
									
										58
									
								
								parse-xml.c
									
										
									
									
									
								
							
							
						
						
									
										58
									
								
								parse-xml.c
									
										
									
									
									
								
							|  | @ -410,11 +410,11 @@ static void utf8_string(char *buffer, void *_res) | ||||||
| static void water_pressure(char *buffer, void *_depth) | static void water_pressure(char *buffer, void *_depth) | ||||||
| { | { | ||||||
| 	depth_t *depth = _depth; | 	depth_t *depth = _depth; | ||||||
|         union int_or_float val; | 	union int_or_float val; | ||||||
| 	double atm, cm; | 	double atm, cm; | ||||||
| 
 | 
 | ||||||
|         switch (integer_or_float(buffer, &val)) { | 	switch (integer_or_float(buffer, &val)) { | ||||||
|         case FLOAT: | 	case FLOAT: | ||||||
| 		if (!val.fp) | 		if (!val.fp) | ||||||
| 			break; | 			break; | ||||||
| 		/* cbar to atm */ | 		/* cbar to atm */ | ||||||
|  | @ -462,10 +462,10 @@ static void centibar(char *buffer, void *_pressure) | ||||||
| static void decicelsius(char *buffer, void *_temp) | static void decicelsius(char *buffer, void *_temp) | ||||||
| { | { | ||||||
| 	temperature_t *temp = _temp; | 	temperature_t *temp = _temp; | ||||||
|         union int_or_float val; | 	union int_or_float val; | ||||||
| 
 | 
 | ||||||
|         switch (integer_or_float(buffer, &val)) { | 	switch (integer_or_float(buffer, &val)) { | ||||||
|         case FLOAT: | 	case FLOAT: | ||||||
| 		temp->mkelvin = (val.fp/10 + 273.15) * 1000 + 0.5; | 		temp->mkelvin = (val.fp/10 + 273.15) * 1000 + 0.5; | ||||||
| 		break; | 		break; | ||||||
| 	default: | 	default: | ||||||
|  | @ -504,12 +504,37 @@ static void fahrenheit(char *buffer, void *_temperature) | ||||||
| 	free(buffer); | 	free(buffer); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /*
 | ||||||
|  |  * Did I mention how bat-shit crazy divinglog is? The sample | ||||||
|  |  * pressures are in PSI. But the tank working pressure is in | ||||||
|  |  * bar. WTF^2? | ||||||
|  |  * | ||||||
|  |  * Crazy stuff like this is why diveclog has everything in | ||||||
|  |  * these inconvenient typed structures, and you have to say | ||||||
|  |  * "pressure->mbar" to get the actual value. Exactly so that | ||||||
|  |  * you can never have unit confusion. | ||||||
|  |  */ | ||||||
|  | static void psi(char *buffer, void *_pressure) | ||||||
|  | { | ||||||
|  | 	pressure_t *pressure = _pressure; | ||||||
|  | 	union int_or_float val; | ||||||
|  | 
 | ||||||
|  | 	switch (integer_or_float(buffer, &val)) { | ||||||
|  | 	case FLOAT: | ||||||
|  | 		pressure->mbar = val.fp * 68.95 + 0.5; | ||||||
|  | 		break; | ||||||
|  | 	default: | ||||||
|  | 		fprintf(stderr, "Crazy Diving Log PSI reading %s\n", buffer); | ||||||
|  | 	} | ||||||
|  | 	free(buffer); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static int divinglog_fill_sample(struct sample *sample, const char *name, int len, char *buf) | static int divinglog_fill_sample(struct sample *sample, const char *name, int len, char *buf) | ||||||
| { | { | ||||||
| 	return	MATCH(".p.time", sampletime, &sample->time) || | 	return	MATCH(".p.time", sampletime, &sample->time) || | ||||||
| 		MATCH(".p.depth", depth, &sample->depth) || | 		MATCH(".p.depth", depth, &sample->depth) || | ||||||
| 		MATCH(".p.temp", fahrenheit, &sample->temperature) || | 		MATCH(".p.temp", fahrenheit, &sample->temperature) || | ||||||
| 		MATCH(".p.press1", pressure, &sample->cylinderpressure) || | 		MATCH(".p.press1", psi, &sample->cylinderpressure) || | ||||||
| 		0; | 		0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -613,6 +638,7 @@ static int divinglog_dive_match(struct dive *dive, const char *name, int len, ch | ||||||
| 		MATCH(".entrytime", divetime, &dive->when) || | 		MATCH(".entrytime", divetime, &dive->when) || | ||||||
| 		MATCH(".depth", depth, &dive->maxdepth) || | 		MATCH(".depth", depth, &dive->maxdepth) || | ||||||
| 		MATCH(".tanksize", cylindersize, &dive->cylinder[0].type.size) || | 		MATCH(".tanksize", cylindersize, &dive->cylinder[0].type.size) || | ||||||
|  | 		MATCH(".presw", pressure, &dive->cylinder[0].type.workingpressure) || | ||||||
| 		MATCH(".tanktype", utf8_string, &dive->cylinder[0].type.description) || | 		MATCH(".tanktype", utf8_string, &dive->cylinder[0].type.description) || | ||||||
| 		MATCH(".comments", utf8_string, &dive->notes) || | 		MATCH(".comments", utf8_string, &dive->notes) || | ||||||
| 		MATCH(".country.name", utf8_string, &country) || | 		MATCH(".country.name", utf8_string, &country) || | ||||||
|  | @ -667,10 +693,10 @@ static void uemis_date_unit(char *buffer, void *_unused) | ||||||
| static void uemis_date_time(char *buffer, void *_when) | static void uemis_date_time(char *buffer, void *_when) | ||||||
| { | { | ||||||
| 	time_t *when = _when; | 	time_t *when = _when; | ||||||
|         union int_or_float val; | 	union int_or_float val; | ||||||
| 
 | 
 | ||||||
|         switch (integer_or_float(buffer, &val)) { | 	switch (integer_or_float(buffer, &val)) { | ||||||
|         case FLOAT: | 	case FLOAT: | ||||||
| 		*when = (val.fp - 40587) * 86400; | 		*when = (val.fp - 40587) * 86400; | ||||||
| 		break; | 		break; | ||||||
| 	default: | 	default: | ||||||
|  | @ -1248,10 +1274,12 @@ static void DivingLog_importer(void) | ||||||
| 	 * | 	 * | ||||||
| 	 * Temperatures are in C, except in samples, | 	 * Temperatures are in C, except in samples, | ||||||
| 	 * when they are in Fahrenheit. Depths are in | 	 * when they are in Fahrenheit. Depths are in | ||||||
| 	 * meters, but pressure is in PSI. | 	 * meters, an dpressure is in PSI in the samples, | ||||||
|  | 	 * but in bar when it comes to working pressure. | ||||||
|  | 	 * | ||||||
|  | 	 * Crazy f*%^ morons. | ||||||
| 	 */ | 	 */ | ||||||
| 	input_units = SI_units; | 	input_units = SI_units; | ||||||
| 	input_units.pressure = PSI; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void uddf_importer(void) | static void uddf_importer(void) | ||||||
|  | @ -1335,9 +1363,9 @@ void parse_xml_file(const char *filename, GError **error) | ||||||
| 		if (error != NULL) | 		if (error != NULL) | ||||||
| 		{ | 		{ | ||||||
| 			*error = g_error_new(g_quark_from_string("divelog"), | 			*error = g_error_new(g_quark_from_string("divelog"), | ||||||
| 			                     DIVE_ERROR_PARSE, | 					     DIVE_ERROR_PARSE, | ||||||
| 			                     "Failed to parse '%s'", | 					     "Failed to parse '%s'", | ||||||
| 			                     filename); | 					     filename); | ||||||
| 		} | 		} | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue