gcc_pure static bool DeviceConfigOverlaps(const DeviceConfig &config, const DeviceDescriptor *const*begin, const DeviceDescriptor *const*const end) { return ExistsIf(begin, end, [&config](const DeviceDescriptor *d) { return DeviceConfigOverlaps(config, d->GetConfig()); }); }
void devStartup() { LogStartUp(_T("Register serial devices")); const SystemSettings &settings = CommonInterface::GetSystemSettings(); bool none_available = true; for (unsigned i = 0; i < NUMDEV; ++i) { DeviceDescriptor &device = *device_list[i]; const DeviceConfig &config = settings.devices[i]; if (!config.IsAvailable()) { device.ClearConfig(); continue; } none_available = false; bool overlap = false; for (unsigned j = 0; j < i; ++j) if (DeviceConfigOverlaps(config, device_list[j]->GetConfig())) overlap = true; if (overlap) { device.ClearConfig(); continue; } device.SetConfig(config); devInitOne(*device_list[i]); } if (none_available) { #ifdef ANDROID /* fall back to built-in GPS when no configured device is available on this platform */ LogStartUp(_T("Falling back to built-in GPS")); DeviceConfig config; config.Clear(); config.port_type = DeviceConfig::PortType::INTERNAL; DeviceDescriptor &device = *device_list[0]; device.SetConfig(config); devInitOne(device); #endif } }
void devStartup() { LogStartUp(_T("Register serial devices")); DeviceDescriptor *pDevNmeaOut = NULL; Profile::Get(szProfileIgnoreNMEAChecksum, NMEAParser::ignore_checksum); DeviceConfig config[NUMDEV]; bool none_available = true; for (unsigned i = 0; i < NUMDEV; ++i) { DeviceList[i].SetIndex(i); Profile::GetDeviceConfig(i, config[i]); if (!DeviceConfigAvailable(config[i])) continue; none_available = false; bool overlap = false; for (unsigned j = 0; j < i; ++j) if (DeviceConfigOverlaps(config[i], config[j])) overlap = true; if (!overlap) devInitOne(DeviceList[i], config[i], pDevNmeaOut); } if (none_available) { #ifdef ANDROID /* fall back to built-in GPS when no configured device is available on this platform */ LogStartUp(_T("Falling back to built-in GPS")); config[0].port_type = DeviceConfig::INTERNAL; devInitOne(DeviceList[0], config[0], pDevNmeaOut); #endif } if (pDevNmeaOut != NULL) SetPipeTo(*pDevNmeaOut); }