mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
core: convert uemis.c to C++
The uemis code is wild. It simply doesn't deallocate memory and uses global variables. To get this under control, create a "struct uemis" and make the functions exported by "uemis.h" members of "struct uemis". Thus, we don't have to carry around a parameter for the state of the importing process. Turn a linked list of "helper" structures (one per imported dive) into a std::unordered_map, to fix leaking of the helper structures. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
parent
cdc87618da
commit
b28d6cf0fc
6 changed files with 122 additions and 147 deletions
66
core/uemis.h
66
core/uemis.h
|
@ -6,50 +6,38 @@
|
|||
#ifndef UEMIS_H
|
||||
#define UEMIS_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include "dive.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
void uemis_parse_divelog_binary(char *base64, struct dive *dive);
|
||||
int uemis_get_weight_unit(uint32_t diveid);
|
||||
void uemis_mark_divelocation(int diveid, int divespot, struct dive_site *ds);
|
||||
void uemis_set_divelocation(int divespot, char *text, double longitude, double latitude);
|
||||
int uemis_get_divespot_id_by_diveid(uint32_t diveid);
|
||||
#include <unordered_map>
|
||||
#include <cstdint>
|
||||
|
||||
struct dive;
|
||||
struct uemis_sample;
|
||||
struct dive_site;
|
||||
|
||||
struct uemis {
|
||||
void parse_divelog_binary(char *base64, struct dive *dive);
|
||||
int get_weight_unit(uint32_t diveid) const;
|
||||
void mark_divelocation(int diveid, int divespot, struct dive_site *ds);
|
||||
void set_divelocation(int divespot, char *text, double longitude, double latitude);
|
||||
int get_divespot_id_by_diveid(uint32_t diveid) const;
|
||||
private:
|
||||
struct helper {
|
||||
int lbs = 9;
|
||||
int divespot = 9;
|
||||
struct dive_site *dive_site = nullptr;
|
||||
};
|
||||
// Use a hash-table (std::unordered_map) to access dive information.
|
||||
// Might also use a balanced binary tree (std::map) or a sorted array (std::vector).
|
||||
std::unordered_map<uint32_t, helper> helper_table;
|
||||
|
||||
static void event(struct dive *dive, struct divecomputer *dc, struct sample *sample, const uemis_sample *u_sample);
|
||||
struct helper &get_helper(uint32_t diveid);
|
||||
void weight_unit(int diveid, int lbs);
|
||||
};
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint16_t dive_time;
|
||||
uint16_t water_pressure; // (in cbar)
|
||||
uint16_t dive_temperature; // (in dC)
|
||||
uint8_t ascent_speed; // (units unclear)
|
||||
uint8_t work_fact;
|
||||
uint8_t cold_fact;
|
||||
uint8_t bubble_fact;
|
||||
uint16_t ascent_time;
|
||||
uint16_t ascent_time_opt;
|
||||
uint16_t p_amb_tol;
|
||||
uint16_t satt;
|
||||
uint16_t hold_depth;
|
||||
uint16_t hold_time;
|
||||
uint8_t active_tank;
|
||||
// bloody glib, when compiled for Windows, forces the whole program to use
|
||||
// the Windows packing rules. So to avoid problems on Windows (and since
|
||||
// only tank_pressure is currently used and that exactly once) I give in and
|
||||
// make this silly low byte / high byte 8bit entries
|
||||
uint8_t tank_pressure_low; // (in cbar)
|
||||
uint8_t tank_pressure_high;
|
||||
uint8_t consumption_low; // (units unclear)
|
||||
uint8_t consumption_high;
|
||||
uint8_t rgt; // (remaining gas time in minutes)
|
||||
uint8_t cns;
|
||||
uint8_t flags[8];
|
||||
} __attribute((packed)) uemis_sample_t;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // UEMIS_H
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue