core: factor out device_is_used_by_selected_dive() function

We have a callback for all devices with a twist: it can loop
over those devices that are used by a selected dive. This is
used for exporting a subset of the dive log.

Factor out the "is device used by selected dive" part of the
function and make it available to C. The goal is to make
the whole callback thing unnecessary and let C code loop
directly over the device list.

Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
Berthold Stoeger 2020-10-06 21:36:51 +02:00 committed by Dirk Hohndel
parent e8d3f75541
commit d93b261e89
2 changed files with 17 additions and 18 deletions

View file

@ -285,27 +285,24 @@ extern "C" void clear_device_nodes()
device_table.devices.clear();
}
extern "C" void call_for_each_dc (void *f, void (*callback)(void *, const char *, uint32_t, const char *, const char *, const char *),
bool select_only)
/* Returns whether the given device is used by a selected dive. */
extern "C" bool device_used_by_selected_dive(const struct device *dev)
{
for (const device &node : device_table.devices) {
bool found = false;
if (select_only) {
for (dive *d: getDiveSelection()) {
struct divecomputer *dc;
for_each_dc (d, dc) {
if (dc->deviceid == node.deviceId) {
found = true;
break;
if (dc->deviceid == dev->deviceId)
return true;
}
}
if (found)
break;
}
} else {
found = true;
}
if (found)
return false;
}
extern "C" void call_for_each_dc (void *f, void (*callback)(void *, const char *, uint32_t, const char *, const char *, const char *),
bool select_only)
{
for (const device &node: device_table.devices) {
if (!select_only || device_used_by_selected_dive(&node))
callback(f, node.model.c_str(), node.deviceId, node.nickName.c_str(),
node.serialNumber.c_str(), node.firmware.c_str());
}

View file

@ -11,6 +11,7 @@ extern "C" {
struct divecomputer;
struct device;
struct device_table;
struct dive_table;
// global device table
extern struct device_table device_table;
@ -25,6 +26,7 @@ extern void call_for_each_dc(void *f, void (*callback)(void *, const char *, uin
const char *, const char *, const char *), bool select_only);
extern void clear_device_nodes();
const char *get_dc_nickname(const struct divecomputer *dc);
extern bool device_used_by_selected_dive(const struct device *dev);
extern const struct device *get_device_for_dc(const struct device_table *table, const struct divecomputer *dc);