Profile: switch pressure-accessing functions to indexes

Continue with replacing pointers to struct plot_data entries
by indexes. Thus the pressure data can be kept in its own
array and can by dynamically sized.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
Berthold Stoeger 2019-07-06 12:35:33 +02:00 committed by Dirk Hohndel
parent 459f9acc67
commit fe6d3c8c38
4 changed files with 33 additions and 37 deletions

View file

@ -350,10 +350,8 @@ static inline int calc_pressure_time(struct dive *dive, struct plot_data *a, str
static void debug_print_pressures(struct plot_info *pi) static void debug_print_pressures(struct plot_info *pi)
{ {
int i; int i;
for (i = 0; i < pi->nr; i++) { for (i = 0; i < pi->nr; i++)
struct plot_data *entry = pi->entry + i; printf("%5d |%9d | %9d |\n", i, get_plot_sensor_pressure(pi, i), get_plot_interpolated_pressure(pi, i));
printf("%5d |%9d | %9d |\n", i, get_plot_sensor_pressure(entry), get_plot_interpolated_pressure(entry));
}
} }
#endif #endif
@ -386,8 +384,7 @@ void populate_pressure_information(struct dive *dive, struct divecomputer *dc, s
/* Get a rough range of where we have any pressures at all */ /* Get a rough range of where we have any pressures at all */
first = last = -1; first = last = -1;
for (int i = 0; i < pi->nr; i++) { for (int i = 0; i < pi->nr; i++) {
struct plot_data *entry = pi->entry + i; int pressure = get_plot_sensor_pressure(pi, i, sensor);
int pressure = get_plot_sensor_pressure(entry, sensor);
if (!pressure) if (!pressure)
continue; continue;
@ -416,7 +413,7 @@ void populate_pressure_information(struct dive *dive, struct divecomputer *dc, s
for (int i = first; i <= last; i++) { for (int i = first; i <= last; i++) {
struct plot_data *entry = pi->entry + i; struct plot_data *entry = pi->entry + i;
int pressure = get_plot_sensor_pressure(entry, sensor); int pressure = get_plot_sensor_pressure(pi, i, sensor);
int time = entry->sec; int time = entry->sec;
while (ev && ev->time.seconds <= time) { // Find 1st gaschange event after while (ev && ev->time.seconds <= time) { // Find 1st gaschange event after

View file

@ -1322,8 +1322,8 @@ static void debug_print_profiledata(struct plot_info *pi)
fprintf(f1, "id t1 gas gasint t2 t3 dil dilint t4 t5 setpoint sensor1 sensor2 sensor3 t6 po2 fo2\n"); fprintf(f1, "id t1 gas gasint t2 t3 dil dilint t4 t5 setpoint sensor1 sensor2 sensor3 t6 po2 fo2\n");
for (i = 0; i < pi->nr; i++) { for (i = 0; i < pi->nr; i++) {
entry = pi->entry + i; entry = pi->entry + i;
fprintf(f1, "%d gas=%8d %8d ; dil=%8d %8d ; o2_sp= %d %d %d %d PO2= %f\n", i, get_plot_sensor_pressure(entry), fprintf(f1, "%d gas=%8d %8d ; dil=%8d %8d ; o2_sp= %d %d %d %d PO2= %f\n", i, get_plot_sensor_pressure(pi, i),
get_plot_interpolated_pressure(entry), O2CYLINDER_PRESSURE(entry), INTERPOLATED_O2CYLINDER_PRESSURE(entry), get_plot_interpolated_pressure(pi, i), O2CYLINDER_PRESSURE(entry), INTERPOLATED_O2CYLINDER_PRESSURE(entry),
entry->o2pressure.mbar, entry->o2sensor[0].mbar, entry->o2sensor[1].mbar, entry->o2sensor[2].mbar, entry->pressures.o2); entry->o2pressure.mbar, entry->o2sensor[0].mbar, entry->o2sensor[1].mbar, entry->o2sensor[2].mbar, entry->pressures.o2);
} }
fclose(f1); fclose(f1);

View file

@ -102,9 +102,9 @@ extern int get_maxtime(struct plot_info *pi);
* partial pressure graphs */ * partial pressure graphs */
extern int get_maxdepth(struct plot_info *pi); extern int get_maxdepth(struct plot_info *pi);
static inline int get_plot_pressure_data(const struct plot_data *entry, enum plot_pressure sensor, int idx) static inline int get_plot_pressure_data(const struct plot_info *pi, int idx, enum plot_pressure sensor, int cylinder)
{ {
return entry->pressure[idx][sensor]; return pi->entry[idx].pressure[cylinder][sensor];
} }
static inline void set_plot_pressure_data(struct plot_data *entry, enum plot_pressure sensor, int idx, int value) static inline void set_plot_pressure_data(struct plot_data *entry, enum plot_pressure sensor, int idx, int value)
@ -112,21 +112,20 @@ static inline void set_plot_pressure_data(struct plot_data *entry, enum plot_pre
entry->pressure[idx][sensor] = value; entry->pressure[idx][sensor] = value;
} }
static inline int get_plot_sensor_pressure(const struct plot_data *entry, int idx) static inline int get_plot_sensor_pressure(const struct plot_info *pi, int idx, int cylinder)
{ {
return get_plot_pressure_data(entry, SENSOR_PR, idx); return get_plot_pressure_data(pi, idx, SENSOR_PR, cylinder);
} }
static inline int get_plot_interpolated_pressure(const struct plot_data *entry, int idx) static inline int get_plot_interpolated_pressure(const struct plot_info *pi, int idx, int cylinder)
{ {
return get_plot_pressure_data(entry, INTERPOLATED_PR, idx); return get_plot_pressure_data(pi, idx, INTERPOLATED_PR, cylinder);
} }
static inline int get_plot_pressure(const struct plot_info *pi, int idx, int cylinder) static inline int get_plot_pressure(const struct plot_info *pi, int idx, int cylinder)
{ {
const struct plot_data *entry = pi->entry + idx; int res = get_plot_sensor_pressure(pi, idx, cylinder);
int res = get_plot_sensor_pressure(entry, cylinder); return res ? res : get_plot_interpolated_pressure(pi, idx, cylinder);
return res ? res : get_plot_interpolated_pressure(entry, cylinder);
} }
#ifdef __cplusplus #ifdef __cplusplus

View file

@ -1379,18 +1379,16 @@ bool ProfileWidget2::isPlanner()
} }
#if 0 // TODO::: FINISH OR DISABLE #if 0 // TODO::: FINISH OR DISABLE
struct plot_data *ProfileWidget2::getEntryFromPos(QPointF pos) struct int ProfileWidget2::getEntryFromPos(QPointF pos)
{ {
// find the time stamp corresponding to the mouse position // find the time stamp corresponding to the mouse position
int seconds = lrint(timeAxis->valueAt(pos)); int seconds = lrint(timeAxis->valueAt(pos));
struct plot_data *entry = NULL;
for (int i = 0; i < plotInfo.nr; i++) { for (int i = 0; i < plotInfo.nr; i++) {
entry = plotInfo.entry + i; if (plotInfo.entry[i].sec >= seconds)
if ((int)entry->sec >= seconds) return i;
break;
} }
return entry; return plotInfo.nr - 1;
} }
#endif #endif
@ -1513,37 +1511,39 @@ void ProfileWidget2::contextMenuEvent(QContextMenuEvent *event)
} }
#if 0 // TODO::: FINISH OR DISABLE #if 0 // TODO::: FINISH OR DISABLE
QPointF scenePos = mapToScene(event->pos()); QPointF scenePos = mapToScene(event->pos());
struct plot_data *entry = getEntryFromPos(scenePos); int idx = getEntryFromPos(scenePos);
// this shows how to figure out if we should ask the user if they want adjust interpolated pressures // this shows how to figure out if we should ask the user if they want adjust interpolated pressures
// at either side of a gas change // at either side of a gas change
if (dcEvent->type == SAMPLE_EVENT_GASCHANGE || dcEvent->type == SAMPLE_EVENT_GASCHANGE2) { if (dcEvent->type == SAMPLE_EVENT_GASCHANGE || dcEvent->type == SAMPLE_EVENT_GASCHANGE2) {
qDebug() << "figure out if there are interpolated pressures"; qDebug() << "figure out if there are interpolated pressures";
struct plot_data *gasChangeEntry = entry; int gasChangeIdx = idx;
struct plot_data *newGasEntry; while (gasChangeIdx > 0) {
while (gasChangeEntry > plotInfo.entry) { --gasChangeIdx;
--gasChangeEntry; if (plotInfo.entry[gasChangeIdx].sec <= dcEvent->time.seconds)
if (gasChangeEntry->sec <= dcEvent->time.seconds)
break; break;
} }
qDebug() << "at gas change at" << gasChangeEntry->sec << ": sensor pressure" << gasChangeEntry->pressure[0] << "interpolated" << gasChangeEntry->pressure[1]; const struct plot_data &gasChangeEntry = plotInfo.entry[newGasIdx];
qDebug() << "at gas change at" << gasChangeEntry->sec << ": sensor pressure" << get_plot_sensor_pressure(&plotInfo, newGasIdx)
<< "interpolated" << ;get_plot_sensor_pressure(&plotInfo, newGasIdx);
// now gasChangeEntry points at the gas change, that entry has the final pressure of // now gasChangeEntry points at the gas change, that entry has the final pressure of
// the old tank, the next entry has the starting pressure of the next tank // the old tank, the next entry has the starting pressure of the next tank
if (gasChangeEntry + 1 <= plotInfo.entry + plotInfo.nr) { if (gasChangeIdx < plotInfo.nr - 1) {
newGasEntry = gasChangeEntry + 1; int newGasIdx = gasChangeIdx + 1;
const struct plot_data &newGasEntry = plotInfo.entry[newGasIdx];
qDebug() << "after gas change at " << newGasEntry->sec << ": sensor pressure" << newGasEntry->pressure[0] << "interpolated" << newGasEntry->pressure[1]; qDebug() << "after gas change at " << newGasEntry->sec << ": sensor pressure" << newGasEntry->pressure[0] << "interpolated" << newGasEntry->pressure[1];
if (get_plot_sensor_pressure(gasChangeEntry) == 0 || displayed_dive.cylinder[gasChangeEntry->sensor[0]].sample_start.mbar == 0) { if (get_plot_sensor_pressure(&plotInfo, gasChangeIdx) == 0 || displayed_dive.cylinder[gasChangeEntry->sensor[0]].sample_start.mbar == 0) {
// if we have no sensorpressure or if we have no pressure from samples we can assume that // if we have no sensorpressure or if we have no pressure from samples we can assume that
// we only have interpolated pressure (the pressure in the entry may be stored in the sensor // we only have interpolated pressure (the pressure in the entry may be stored in the sensor
// pressure field if this is the first or last entry for this tank... see details in gaspressures.c // pressure field if this is the first or last entry for this tank... see details in gaspressures.c
pressure_t pressure; pressure_t pressure;
pressure.mbar = get_plot_interpolated_pressure(gasChangeEntry) ? : get_plot_sensor_pressure(gasChangeEntry); pressure.mbar = get_plot_interpolated_pressure(&plotInfo, gasChangeIdx) ? : get_plot_sensor_pressure(&plotInfo, gasChangeIdx);
QAction *adjustOldPressure = m.addAction(tr("Adjust pressure of cyl. %1 (currently interpolated as %2)") QAction *adjustOldPressure = m.addAction(tr("Adjust pressure of cyl. %1 (currently interpolated as %2)")
.arg(gasChangeEntry->sensor[0] + 1).arg(get_pressure_string(pressure))); .arg(gasChangeEntry->sensor[0] + 1).arg(get_pressure_string(pressure)));
} }
if (get_plot_sensor_pressure(newGasEntry) == 0 || displayed_dive.cylinder[newGasEntry->sensor[0]].sample_start.mbar == 0) { if (get_plot_sensor_pressure(&plotInfo, newGasIdx) == 0 || displayed_dive.cylinder[newGasEntry->sensor[0]].sample_start.mbar == 0) {
// we only have interpolated press -- see commend above // we only have interpolated press -- see commend above
pressure_t pressure; pressure_t pressure;
pressure.mbar = get_plot_interpolated_pressure(newGasEntry) ? : get_plot_sensor_pressure(newGasEntry); pressure.mbar = get_plot_interpolated_pressure(&plotInfo, newGasIdx) ? : get_plot_sensor_pressure(&plotInfo, newGasIdx);
QAction *adjustOldPressure = m.addAction(tr("Adjust pressure of cyl. %1 (currently interpolated as %2)") QAction *adjustOldPressure = m.addAction(tr("Adjust pressure of cyl. %1 (currently interpolated as %2)")
.arg(newGasEntry->sensor[0] + 1).arg(get_pressure_string(pressure))); .arg(newGasEntry->sensor[0] + 1).arg(get_pressure_string(pressure)));
} }