mirror of
https://github.com/subsurface/subsurface.git
synced 2024-11-30 22:20:21 +00:00
8c3efd2a22
While the existing code worked with a couple of hand crafted examples it turns out it did a poor job with most of my files. Oops. Depending on whether we find name or coordinates first, we need to identify existing sites in either case and do the right thing. The challeng here are multiple dives at the same site with slightly different GPS coordinates. If the name is read first, these all get merged into one (and we warn about the different GPS data). But if GPS gets read first, we create separate dive sites with the same name. We need a sane UI to consolidate these - but we can't completely automate this... it's possible that these ARE the same site and the GPS data is just imprecise (for example, multiple dives at the same time with GPS locations from the Subsurface companion app). The user should be able to either pick one of the GPS locations, or keep multiple (for example, different buoyes for the same site and you want to keep the different markers). Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
86 lines
1.8 KiB
C
86 lines
1.8 KiB
C
#ifndef DIVESITE_H
|
|
#define DIVESITE_H
|
|
|
|
#include "units.h"
|
|
#include <stdlib.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
struct dive_site
|
|
{
|
|
uint32_t uuid;
|
|
char *name;
|
|
degrees_t latitude, longitude;
|
|
char *description;
|
|
char *notes;
|
|
};
|
|
|
|
struct dive_site_table {
|
|
int nr, allocated;
|
|
struct dive_site **dive_sites;
|
|
};
|
|
|
|
extern struct dive_site_table dive_site_table;
|
|
|
|
static inline struct dive_site *get_dive_site(int nr)
|
|
{
|
|
if (nr >= dive_site_table.nr || nr < 0)
|
|
return NULL;
|
|
return dive_site_table.dive_sites[nr];
|
|
}
|
|
|
|
/* iterate over each dive site */
|
|
#define for_each_dive_site(_i, _x) \
|
|
for ((_i) = 0; ((_x) = get_dive_site(_i)) != NULL; (_i)++)
|
|
|
|
static inline struct dive_site *get_dive_site_by_uuid(uint32_t uuid)
|
|
{
|
|
int i;
|
|
struct dive_site *ds;
|
|
for_each_dive_site (i, ds)
|
|
if (ds->uuid == uuid)
|
|
return get_dive_site(i);
|
|
return NULL;
|
|
}
|
|
|
|
/* there could be multiple sites of the same name - return the first one */
|
|
static inline uint32_t get_dive_site_uuid_by_name(const char *name, struct dive_site **dsp)
|
|
{
|
|
int i;
|
|
struct dive_site *ds;
|
|
for_each_dive_site (i, ds) {
|
|
if (ds->name == name) {
|
|
if (dsp)
|
|
*dsp = ds;
|
|
return ds->uuid;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/* there could be multiple sites at the same GPS fix - return the first one */
|
|
static inline uint32_t get_dive_site_uuid_by_gps(degrees_t latitude, degrees_t longitude, struct dive_site **dsp)
|
|
{
|
|
int i;
|
|
struct dive_site *ds;
|
|
for_each_dive_site (i, ds) {
|
|
if (ds->latitude.udeg == latitude.udeg && ds->longitude.udeg == longitude.udeg) {
|
|
if (dsp)
|
|
*dsp = ds;
|
|
return ds->uuid;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
struct dive_site *alloc_dive_site();
|
|
uint32_t create_dive_site(const char *name);
|
|
uint32_t create_dive_site_with_gps(const char *name, degrees_t latitude, degrees_t longitude);
|
|
struct dive_site *get_or_create_dive_site_by_uuid(uint32_t uuid);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#endif // DIVESITE_H
|