static void save_cylinder_info(struct membuffer *b, struct dive *dive) { int i, nr; nr = nr_cylinders(dive); for (i = 0; i < nr; i++) { cylinder_t *cylinder = dive->cylinder + i; int volume = cylinder->type.size.mliter; const char *description = cylinder->type.description; int o2 = cylinder->gasmix.o2.permille; int he = cylinder->gasmix.he.permille; put_string(b, "cylinder"); if (volume) put_milli(b, " vol=", volume, "l"); put_pressure(b, cylinder->type.workingpressure, " workpressure=", "bar"); show_utf8(b, " description=", description, ""); strip_mb(b); if (o2) { put_format(b, " o2=%u.%u%%", FRACTION(o2, 10)); if (he) put_format(b, " he=%u.%u%%", FRACTION(he, 10)); } put_pressure(b, cylinder->start, " start=", "bar"); put_pressure(b, cylinder->end, " end=", "bar"); put_string(b, "\n"); } }
static void save_one_device(void *_f, const char *model, uint32_t deviceid, const char *nickname, const char *serial_nr, const char *firmware) { struct membuffer *b = _f; /* Nicknames that are empty or the same as the device model are not interesting */ if (nickname) { if (!*nickname || !strcmp(model, nickname)) nickname = NULL; } /* Serial numbers that are empty are not interesting */ if (serial_nr && !*serial_nr) serial_nr = NULL; /* Firmware strings that are empty are not interesting */ if (firmware && !*firmware) firmware = NULL; /* Do we have anything interesting about this dive computer to save? */ if (!serial_nr && !nickname && !firmware) return; put_format(b, "<divecomputerid"); show_utf8(b, model, " model='", "'", 1); put_format(b, " deviceid='%08x'", deviceid); show_utf8(b, serial_nr, " serial='", "'", 1); show_utf8(b, firmware, " firmware='", "'", 1); show_utf8(b, nickname, " nickname='", "'", 1); put_format(b, "/>\n"); }
static void show_utf8(struct membuffer *b, const char *prefix, const char *value, const char *postfix) { if (value) { put_format(b, "%s\"", prefix); quote(b, value); put_format(b, "\"%s", postfix); } }
static void save_one_event(struct membuffer *b, struct event *ev) { put_format(b, " <event time='%d:%02d min'", FRACTION(ev->time.seconds, 60)); show_index(b, ev->type, "type='", "'"); show_index(b, ev->flags, "flags='", "'"); show_index(b, ev->value, "value='", "'"); show_utf8(b, ev->name, " name='", "'", 1); put_format(b, " />\n"); }
static void put_gasmix(struct membuffer *b, struct gasmix *mix) { int o2 = mix->o2.permille; int he = mix->he.permille; if (o2) { put_format(b, " o2='%u.%u%%'", FRACTION(o2, 10)); if (he) put_format(b, " he='%u.%u%%'", FRACTION(he, 10)); } }
static void show_date(struct membuffer *b, timestamp_t when) { struct tm tm; utc_mkdate(when, &tm); put_format(b, "date %04u-%02u-%02u\n", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday); put_format(b, "time %02u:%02u:%02u\n", tm.tm_hour, tm.tm_min, tm.tm_sec); }
/* * The name of a dive is the date and the dive number (and possibly * the uniqueness suffix). * * Note that the time of the dive may not be the same as the * time of the directory structure it is created in: the dive * might be part of a trip that straddles a month (or even a * year). * * We do *not* want to use localized weekdays and cause peoples save * formats to depend on their locale. */ static void create_dive_name(struct dive *dive, struct membuffer *name, struct tm *dirtm) { struct tm tm; static const char weekday[7][4] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; utc_mkdate(dive->when, &tm); if (tm.tm_year != dirtm->tm_year) put_format(name, "%04u-", tm.tm_year + 1900); if (tm.tm_mon != dirtm->tm_mon) put_format(name, "%02u-", tm.tm_mon+1); put_format(name, "%02u-%s-%02u:%02u:%02u", tm.tm_mday, weekday[tm.tm_wday], tm.tm_hour, tm.tm_min, tm.tm_sec); }
void save_dives_buffer(struct membuffer *b, const bool select_only) { int i; struct dive *dive; dive_trip_t *trip; put_format(b, "<divelog program='subsurface' version='%d'>\n<settings>\n", VERSION); if (prefs.save_userid_local) put_format(b, " <userid>%s</userid>\n", prefs.userid); /* save the dive computer nicknames, if any */ call_for_each_dc(b, save_one_device); if (autogroup) put_format(b, " <autogroup state='1' />\n"); put_format(b, "</settings>\n<dives>\n"); for (trip = dive_trip_list; trip != NULL; trip = trip->next) trip->index = 0; /* save the dives */ for_each_dive(i, dive) { if (select_only) { if (!dive->selected) continue; save_one_dive(b, dive); } else { trip = dive->divetrip; /* Bare dive without a trip? */ if (!trip) { save_one_dive(b, dive); continue; } /* Have we already seen this trip (and thus saved this dive?) */ if (trip->index) continue; /* We haven't seen this trip before - save it and all dives */ trip->index = 1; save_trip(b, trip); } } put_format(b, "</dives>\n</divelog>\n"); }
void put_milli(struct membuffer *b, const char *pre, int value, const char *post) { int i; char buf[4]; const char *sign = ""; unsigned v; v = value; if (value < 0) { sign = "-"; v = -value; } for (i = 2; i >= 0; i--) { buf[i] = (v % 10) + '0'; v /= 10; } buf[3] = 0; if (buf[2] == '0') { buf[2] = 0; if (buf[1] == '0') buf[1] = 0; } put_format(b, "%s%s%u.%s%s", pre, sign, v, buf, post); }
static void create_trip_name(dive_trip_t *trip, struct membuffer *name, struct tm *tm) { put_format(name, "%02u-", tm->tm_mday); if (trip->location) { char ascii_loc[MAXTRIPNAME+1], *p = trip->location; int i; for (i = 0; i < MAXTRIPNAME; ) { char c = *p++; switch (c) { case 0: case ',': case '.': break; case 'a' ... 'z': case 'A' ... 'Z': ascii_loc[i++] = c; continue; default: continue; } break; } if (i > 1) { put_bytes(name, ascii_loc, i); return; } }
static void save_one_event(struct membuffer *b, struct event *ev) { put_format(b, " <event time='%d:%02d min'", FRACTION(ev->time.seconds, 60)); show_index(b, ev->type, "type='", "'"); show_index(b, ev->flags, "flags='", "'"); show_index(b, ev->value, "value='", "'"); show_utf8(b, ev->name, " name='", "'", 1); if (event_is_gaschange(ev)) { if (ev->gas.index >= 0) { show_index(b, ev->gas.index, "cylinder='", "'"); put_gasmix(b, &ev->gas.mix); } else if (!event_gasmix_redundant(ev)) put_gasmix(b, &ev->gas.mix); } put_format(b, " />\n"); }
static void save_weightsystem_info(struct membuffer *b, struct dive *dive) { int i, nr; nr = nr_weightsystems(dive); for (i = 0; i < nr; i++) { weightsystem_t *ws = dive->weightsystem + i; int grams = ws->weight.grams; const char *description = ws->description; put_format(b, " <weightsystem"); put_milli(b, " weight='", grams, " kg'"); show_utf8(b, description, " description='", "'", 1); put_format(b, " />\n"); } }
int put_duration(struct membuffer *b, duration_t duration, const char *pre, const char *post) { if (!duration.seconds) return 0; put_format(b, "%s%u:%02u%s", pre, FRACTION(duration.seconds, 60), post); return 1; }
int put_salinity(struct membuffer *b, int salinity, const char *pre, const char *post) { if (!salinity) return 0; put_format(b, "%s%d%s", pre, salinity / 10, post); return 1; }
void writeMarkers(struct membuffer *b, const bool selected_only) { int i, dive_no = 0; struct dive *dive; char pre[1000], post[1000]; for_each_dive (i, dive) { if (selected_only) { if (!dive->selected) continue; } struct dive_site *ds = get_dive_site_for_dive(dive); if (!ds || !dive_site_has_gps_location(ds)) continue; put_degrees(b, ds->latitude, "temp = new google.maps.Marker({position: new google.maps.LatLng(", ""); put_degrees(b, ds->longitude, ",", ")});\n"); put_string(b, "markers.push(temp);\ntempinfowindow = new google.maps.InfoWindow({content: '<div id=\"content\">'+'<div id=\"siteNotice\">'+'</div>'+'<div id=\"bodyContent\">"); snprintf(pre, sizeof(pre), "<p>%s ", translate("gettextFromC", "Date:")); put_HTML_date(b, dive, pre, "</p>"); snprintf(pre, sizeof(pre), "<p>%s ", translate("gettextFromC", "Time:")); put_HTML_time(b, dive, pre, "</p>"); snprintf(pre, sizeof(pre), "<p>%s ", translate("gettextFromC", "Duration:")); snprintf(post, sizeof(post), " %s</p>", translate("gettextFromC", "min")); put_duration(b, dive->duration, pre, post); put_string(b, "<p> "); put_HTML_quoted(b, translate("gettextFromC", "Max. depth:")); put_HTML_depth(b, dive, " ", "</p>"); put_string(b, "<p> "); put_HTML_quoted(b, translate("gettextFromC", "Air temp.:")); put_HTML_airtemp(b, dive, " ", "</p>"); put_string(b, "<p> "); put_HTML_quoted(b, translate("gettextFromC", "Water temp.:")); put_HTML_watertemp(b, dive, " ", "</p>"); snprintf(pre, sizeof(pre), "<p>%s <b>", translate("gettextFromC", "Location:")); put_string(b, pre); put_HTML_quoted(b, get_dive_location(dive)); put_string(b, "</b></p>"); snprintf(pre, sizeof(pre), "<p> %s ", translate("gettextFromC", "Notes:")); put_HTML_notes(b, dive, pre, " </p>"); put_string(b, "</p>'+'</div>'+'</div>'});\ninfowindows.push(tempinfowindow);\n"); put_format(b, "google.maps.event.addListener(markers[%d], 'mouseover', function() {\ninfowindows[%d].open(map,markers[%d]);}", dive_no, dive_no, dive_no); put_format(b, ");google.maps.event.addListener(markers[%d], 'mouseout', function() {\ninfowindows[%d].close();});\n", dive_no, dive_no); dive_no++; } }
void save_one_dive_to_mb(struct membuffer *b, struct dive *dive) { struct divecomputer *dc; put_string(b, "<dive"); if (dive->number) put_format(b, " number='%d'", dive->number); if (dive->tripflag == NO_TRIP) put_format(b, " tripflag='NOTRIP'"); if (dive->rating) put_format(b, " rating='%d'", dive->rating); if (dive->visibility) put_format(b, " visibility='%d'", dive->visibility); save_tags(b, dive->tag_list); if (dive->dive_site_uuid) put_format(b, " divesiteid='%8x'", dive->dive_site_uuid); show_date(b, dive->when); put_format(b, " duration='%u:%02u min'>\n", FRACTION(dive->dc.duration.seconds, 60)); save_overview(b, dive); save_cylinder_info(b, dive); save_weightsystem_info(b, dive); save_dive_temperature(b, dive); /* Save the dive computer data */ for_each_dc(dive, dc) save_dc(b, dive, dc); FOR_EACH_PICTURE(dive) save_picture(b, picture); put_format(b, "</dive>\n"); }
static void save_one_event(struct membuffer *b, struct event *ev) { put_format(b, "event %d:%02d", FRACTION(ev->time.seconds, 60)); show_index(b, ev->type, "type=", ""); show_index(b, ev->flags, "flags=", ""); show_index(b, ev->value, "value=", ""); show_utf8(b, " name=", ev->name, ""); put_string(b, "\n"); }
void put_degrees(struct membuffer *b, degrees_t value, const char *pre, const char *post) { int udeg = value.udeg; const char *sign = ""; if (udeg < 0) { udeg = -udeg; sign = "-"; } put_format(b,"%s%s%u.%06u%s", pre, sign, FRACTION(udeg, 1000000), post); }
static void save_dc(struct membuffer *b, struct dive *dive, struct divecomputer *dc) { show_utf8(b, "model ", dc->model, "\n"); if (dc->deviceid) put_format(b, "deviceid %08x\n", dc->deviceid); if (dc->diveid) put_format(b, "diveid %08x\n", dc->diveid); if (dc->when && dc->when != dive->when) show_date(b, dc->when); if (dc->duration.seconds && dc->duration.seconds != dive->dc.duration.seconds) put_duration(b, dc->duration, "duration ", "min\n"); save_depths(b, dc); save_temperatures(b, dc); save_airpressure(b, dc); save_salinity(b, dc); put_duration(b, dc->surfacetime, "surfacetime ", "min\n"); save_events(b, dc->events); save_samples(b, dc->samples, dc->sample); }
static void save_dc(struct membuffer *b, struct dive *dive, struct divecomputer *dc) { put_format(b, " <divecomputer"); show_utf8(b, dc->model, " model='", "'", 1); if (dc->deviceid) put_format(b, " deviceid='%08x'", dc->deviceid); if (dc->diveid) put_format(b, " diveid='%08x'", dc->diveid); if (dc->when && dc->when != dive->when) show_date(b, dc->when); if (dc->duration.seconds && dc->duration.seconds != dive->dc.duration.seconds) put_duration(b, dc->duration, " duration='", " min'"); if (dc->divemode != OC) { for (enum dive_comp_type i = 0; i < NUM_DC_TYPE; i++) if (dc->divemode == i) show_utf8(b, divemode_text[i], " dctype='", "'", 1); if (dc->no_o2sensors) put_format(b," no_o2sensors='%d'", dc->no_o2sensors); } put_format(b, ">\n"); save_depths(b, dc); save_temperatures(b, dc); save_airpressure(b, dc); save_salinity(b, dc); put_duration(b, dc->surfacetime, " <surfacetime>", " min</surfacetime>\n"); save_extra_data(b, dc->extra_data); save_events(b, dc->events); save_samples(b, dc->samples, dc->sample); put_format(b, " </divecomputer>\n"); }
/* * Note that we don't save the date and time or dive * number: they are encoded in the filename. */ static void create_dive_buffer(struct dive *dive, struct membuffer *b) { put_format(b, "duration %u:%02u min\n", FRACTION(dive->dc.duration.seconds, 60)); SAVE("rating", rating); SAVE("visibility", visibility); cond_put_format(dive->tripflag == NO_TRIP, b, "notrip\n"); save_tags(b, dive->tag_list); save_overview(b, dive); save_cylinder_info(b, dive); save_weightsystem_info(b, dive); save_dive_temperature(b, dive); }
void insert_javascript(struct membuffer *b, const bool selected_only) { put_string(b, "<script type=\"text/javascript\" src=\""); put_string(b, getGoogleApi()); put_string(b, "&sensor=false\">\n</script>\n<script type=\"text/javascript\">\nvar map;\n"); put_format(b, "function initialize() {\nvar mapOptions = {\n\t%s,", map_options); put_string(b, "rotateControl: false,\n\tstreetViewControl: false,\n\tmapTypeControl: false\n};\n"); put_string(b, "map = new google.maps.Map(document.getElementById(\"map-canvas\"),mapOptions);\nvar markers = new Array();"); put_string(b, "\nvar infowindows = new Array();\nvar temp;\nvar tempinfowindow;\n"); writeMarkers(b, selected_only); put_string(b, "\nfor(var i=0;i<markers.length;i++)\n\tmarkers[i].setMap(map);\n}\n"); put_string(b, "google.maps.event.addDomListener(window, 'load', initialize);</script>\n"); }
static void save_picture(struct membuffer *b, struct picture *pic) { put_string(b, " <picture filename='"); put_quoted(b, pic->filename, true, false); put_string(b, "'"); if (pic->offset.seconds) { int offset = pic->offset.seconds; char sign = '+'; if (offset < 0) { sign = '-'; offset = -offset; } put_format(b, " offset='%c%u:%02u min'", sign, FRACTION(offset, 60)); } if (pic->latitude.udeg || pic->longitude.udeg) { put_degrees(b, pic->latitude, " gps='", " "); put_degrees(b, pic->longitude, "", "'"); } if (hashstring(pic->filename)) put_format(b, " hash='%s'", hashstring(pic->filename)); put_string(b, "/>\n"); }
void DiveLogExportDialog::export_depths(const char *filename, const bool selected_only) { FILE *f; struct dive *dive; depth_t depth; int i; const char *unit = NULL; struct membuffer buf = {}; for_each_dive (i, dive) { if (selected_only && !dive->selected) continue; FOR_EACH_PICTURE (dive) { int n = dive->dc.samples; struct sample *s = dive->dc.sample; depth.mm = 0; while (--n >= 0 && (int32_t)s->time.seconds <= picture->offset.seconds) { depth.mm = s->depth.mm; s++; } put_format(&buf, "%s\t%.1f", picture->filename, get_depth_units(depth.mm, NULL, &unit)); put_format(&buf, "%s\n", unit); } } f = subsurface_fopen(filename, "w+"); if (!f) { report_error(tr("Can't open file %s").toUtf8().data(), filename); } else { flush_buffer(&buf, f); /*check for writing errors? */ fclose(f); } free_buffer(&buf); }
static void save_trip(struct membuffer *b, dive_trip_t *trip) { int i; struct dive *dive; put_format(b, "<trip"); show_date(b, trip->when); show_utf8(b, trip->location, " location=\'", "\'", 1); put_format(b, ">\n"); show_utf8(b, trip->notes, "<notes>", "</notes>\n", 0); /* * Incredibly cheesy: we want to save the dives sorted, and they * are sorted in the dive array.. So instead of using the dive * list in the trip, we just traverse the global dive array and * check the divetrip pointer.. */ for_each_dive(i, dive) { if (dive->divetrip == trip) save_one_dive_to_mb(b, dive); } put_format(b, "</trip>\n"); }
static void save_cylinder_info(struct membuffer *b, struct dive *dive) { int i, nr; nr = nr_cylinders(dive); for (i = 0; i < nr; i++) { cylinder_t *cylinder = dive->cylinder + i; int volume = cylinder->type.size.mliter; const char *description = cylinder->type.description; put_format(b, " <cylinder"); if (volume) put_milli(b, " size='", volume, " l'"); put_pressure(b, cylinder->type.workingpressure, " workpressure='", " bar'"); show_utf8(b, description, " description='", "'", 1); put_gasmix(b, &cylinder->gasmix); put_pressure(b, cylinder->start, " start='", " bar'"); put_pressure(b, cylinder->end, " end='", " bar'"); if (cylinder->cylinder_use != OC_GAS) show_utf8(b, cylinderuse_text[cylinder->cylinder_use], " use='", "'", 1); put_format(b, " />\n"); } }
static void save_dc(struct membuffer *b, struct dive *dive, struct divecomputer *dc) { put_format(b, " <divecomputer"); show_utf8(b, dc->model, " model='", "'", 1); if (dc->deviceid) put_format(b, " deviceid='%08x'", dc->deviceid); if (dc->diveid) put_format(b, " diveid='%08x'", dc->diveid); if (dc->when && dc->when != dive->when) show_date(b, dc->when); if (dc->duration.seconds && dc->duration.seconds != dive->dc.duration.seconds) put_duration(b, dc->duration, " duration='", " min'"); put_format(b, ">\n"); save_depths(b, dc); save_temperatures(b, dc); save_airpressure(b, dc); save_salinity(b, dc); put_duration(b, dc->surfacetime, " <surfacetime>", " min</surfacetime>\n"); save_events(b, dc->events); save_samples(b, dc->samples, dc->sample); put_format(b, " </divecomputer>\n"); }
static int tree_insert(git_treebuilder *dir, const char *name, int mkunique, git_oid *id, unsigned mode) { int ret; struct membuffer uniquename = { 0 }; if (mkunique && git_treebuilder_get(dir, name)) { char hex[8]; git_oid_nfmt(hex, 7, id); hex[7] = 0; put_format(&uniquename, "%s~%s", name, hex); name = mb_cstring(&uniquename); } ret = git_treebuilder_insert(NULL, dir, name, id, mode); free_buffer(&uniquename); return ret; }
static void save_sample(struct membuffer *b, struct sample *sample, struct sample *old) { put_format(b, " <sample time='%u:%02u min'", FRACTION(sample->time.seconds, 60)); put_milli(b, " depth='", sample->depth.mm, " m'"); put_temperature(b, sample->temperature, " temp='", " C'"); put_pressure(b, sample->cylinderpressure, " pressure='", " bar'"); /* * We only show sensor information for samples with pressure, and only if it * changed from the previous sensor we showed. */ if (sample->cylinderpressure.mbar && sample->sensor != old->sensor) { put_format(b, " sensor='%d'", sample->sensor); old->sensor = sample->sensor; } /* the deco/ndl values are stored whenever they change */ if (sample->ndl.seconds != old->ndl.seconds) { put_format(b, " ndl='%u:%02u min'", FRACTION(sample->ndl.seconds, 60)); old->ndl = sample->ndl; } if (sample->in_deco != old->in_deco) { put_format(b, " in_deco='%d'", sample->in_deco ? 1 : 0); old->in_deco = sample->in_deco; } if (sample->stoptime.seconds != old->stoptime.seconds) { put_format(b, " stoptime='%u:%02u min'", FRACTION(sample->stoptime.seconds, 60)); old->stoptime = sample->stoptime; } if (sample->stopdepth.mm != old->stopdepth.mm) { put_milli(b, " stopdepth='", sample->stopdepth.mm, " m'"); old->stopdepth = sample->stopdepth; } if (sample->cns != old->cns) { put_format(b, " cns='%u%%'", sample->cns); old->cns = sample->cns; } if (sample->po2 != old->po2) { put_milli(b, " po2='", sample->po2, " bar'"); old->po2 = sample->po2; } show_index(b, sample->heartbeat, "heartbeat='", "'"); show_index(b, sample->bearing, "bearing='", "'"); put_format(b, " />\n"); }
/* * Samples are saved as densely as possible while still being readable, * since they are the bulk of the data. * * For parsing, look at the units to figure out what the numbers are. */ static void save_sample(struct membuffer *b, struct sample *sample, struct sample *old) { put_format(b, "%3u:%02u", FRACTION(sample->time.seconds, 60)); put_milli(b, " ", sample->depth.mm, "m"); put_temperature(b, sample->temperature, " ", "°C"); put_pressure(b, sample->cylinderpressure, " ", "bar"); /* * We only show sensor information for samples with pressure, and only if it * changed from the previous sensor we showed. */ if (sample->cylinderpressure.mbar && sample->sensor != old->sensor) { put_format(b, " sensor=%d", sample->sensor); old->sensor = sample->sensor; } /* the deco/ndl values are stored whenever they change */ if (sample->ndl.seconds != old->ndl.seconds) { put_format(b, " ndl=%u:%02u", FRACTION(sample->ndl.seconds, 60)); old->ndl = sample->ndl; } if (sample->in_deco != old->in_deco) { put_format(b, " in_deco=%d", sample->in_deco ? 1 : 0); old->in_deco = sample->in_deco; } if (sample->stoptime.seconds != old->stoptime.seconds) { put_format(b, " stoptime=%u:%02u", FRACTION(sample->stoptime.seconds, 60)); old->stoptime = sample->stoptime; } if (sample->stopdepth.mm != old->stopdepth.mm) { put_milli(b, " stopdepth=", sample->stopdepth.mm, "m"); old->stopdepth = sample->stopdepth; } if (sample->cns != old->cns) { put_format(b, " cns=%u%%", sample->cns); old->cns = sample->cns; } if (sample->po2.mbar != old->po2.mbar) { put_milli(b, " po2=", sample->po2.mbar, "bar"); old->po2 = sample->po2; } show_index(b, sample->heartbeat, "heartbeat=", ""); show_index(b, sample->bearing.degrees, "bearing=", "°"); put_format(b, "\n"); }