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