diff options
author | Berthold Stoeger <bstoeger@mail.tuwien.ac.at> | 2019-07-06 17:18:43 +0200 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2019-11-09 19:19:04 +0100 |
commit | 00289cd2224bbf3bbb8568f52a73e52596bd8e6e (patch) | |
tree | f30bb4ee001773e885f14fbec340824ed05cd409 | |
parent | bef1eac7fa4baabc0f970b50acac1f4bee7d7f7c (diff) | |
download | subsurface-00289cd2224bbf3bbb8568f52a73e52596bd8e6e.tar.gz |
Profile: dynamically allocate plot pressure data
All accesses to the pressure data were converted to use functions.
Therefore it is now rather trivial to dynamically allocate the
pressure array and just change the functions.
The only thing to take care of is the idiosyncratic memory
management. Make sure to free and copy the buffer in the
appropriate places.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
-rw-r--r-- | core/display.h | 1 | ||||
-rw-r--r-- | core/profile.c | 3 | ||||
-rw-r--r-- | core/profile.h | 13 | ||||
-rw-r--r-- | qt-models/diveplotdatamodel.cpp | 9 |
4 files changed, 19 insertions, 7 deletions
diff --git a/core/display.h b/core/display.h index 6b773a496..3e3a9531e 100644 --- a/core/display.h +++ b/core/display.h @@ -21,6 +21,7 @@ struct plot_info { double endtempcoord; double maxpp; struct plot_data *entry; + struct plot_pressure_data *pressures; /* MAX_CYLINDERS blocks of nr entries. */ }; extern struct divecomputer *select_dc(struct dive *); diff --git a/core/profile.c b/core/profile.c index 9fb2566bf..e27bcfd36 100644 --- a/core/profile.c +++ b/core/profile.c @@ -501,7 +501,6 @@ static void insert_entry(struct plot_info *pi, int idx, int time, int depth, int entry->sec = time; entry->depth = depth; entry->running_sum = prev->running_sum + (time - prev->sec) * (depth + prev->depth) / 2; - memset(entry->pressure, 0, sizeof(entry->pressure)); entry->sac = sac; entry->ndl = -1; entry->bearing = -1; @@ -510,6 +509,7 @@ static void insert_entry(struct plot_info *pi, int idx, int time, int depth, int void free_plot_info_data(struct plot_info *pi) { free(pi->entry); + free(pi->pressures); pi->entry = NULL; } @@ -534,6 +534,7 @@ static void populate_plot_entries(struct dive *dive, struct divecomputer *dc, st nr = dc->samples + 6 + maxtime / 10 + count_events(dc); plot_data = calloc(nr, sizeof(struct plot_data)); pi->entry = plot_data; + pi->pressures = calloc(nr * MAX_CYLINDERS, sizeof(struct plot_pressure_data)); if (!plot_data) return; pi->nr = nr; diff --git a/core/profile.h b/core/profile.h index 0153ccf94..953cfdcc8 100644 --- a/core/profile.h +++ b/core/profile.h @@ -28,11 +28,16 @@ struct deco_state; struct divecomputer; struct plot_info; +/* + * sensor data for a given cylinder + */ +struct plot_pressure_data { + int data[NUM_PLOT_PRESSURES]; +}; + struct plot_data { unsigned int in_deco : 1; int sec; - /* One pressure item per cylinder and pressure type */ - int pressure[MAX_CYLINDERS][NUM_PLOT_PRESSURES]; int temperature; /* Depth info */ int depth; @@ -104,12 +109,12 @@ extern int get_maxdepth(struct plot_info *pi); static inline int get_plot_pressure_data(const struct plot_info *pi, int idx, enum plot_pressure sensor, int cylinder) { - return pi->entry[idx].pressure[cylinder][sensor]; + return pi->pressures[cylinder * pi->nr + idx].data[sensor]; } static inline void set_plot_pressure_data(struct plot_info *pi, int idx, enum plot_pressure sensor, int cylinder, int value) { - pi->entry[idx].pressure[cylinder][sensor] = value; + pi->pressures[cylinder * pi->nr + idx].data[sensor] = value; } static inline int get_plot_sensor_pressure(const struct plot_info *pi, int idx, int cylinder) diff --git a/qt-models/diveplotdatamodel.cpp b/qt-models/diveplotdatamodel.cpp index c8f086867..d89ab6f31 100644 --- a/qt-models/diveplotdatamodel.cpp +++ b/qt-models/diveplotdatamodel.cpp @@ -167,7 +167,9 @@ void DivePlotDataModel::clear() beginResetModel(); pInfo.nr = 0; free(pInfo.entry); - pInfo.entry = 0; + free(pInfo.pressures); + pInfo.entry = nullptr; + pInfo.pressures = nullptr; diveId = -1; dcNr = -1; endResetModel(); @@ -179,9 +181,12 @@ void DivePlotDataModel::setDive(dive *d, const plot_info &info) diveId = d->id; dcNr = dc_number; free(pInfo.entry); + free(pInfo.pressures); pInfo = info; - pInfo.entry = (struct plot_data *)malloc(sizeof(struct plot_data) * pInfo.nr); + pInfo.entry = (plot_data *)malloc(sizeof(plot_data) * pInfo.nr); memcpy(pInfo.entry, info.entry, sizeof(plot_data) * pInfo.nr); + pInfo.pressures = (plot_pressure_data *)malloc(sizeof(plot_pressure_data) * MAX_CYLINDERS * pInfo.nr); + memcpy(pInfo.pressures, info.pressures, sizeof(plot_pressure_data) * MAX_CYLINDERS * pInfo.nr); endResetModel(); } |