if (reuse_device_addresses_) { // Find the first unused address. for (uint16_t b0 = 0; b0 <= 0xffff; b0++) {
address.address[0] = b0;
address.address[1] = b0 >> 8; bool used = std::any_of(phy_devices_.begin(), phy_devices_.end(), [address](auto& device) { return device.second->GetAddress() == address;
}); if (!used) { break;
}
}
}
return address;
}
// Add a device to the test model.
PhyDevice::Identifier TestModel::AddDevice(std::shared_ptr<Device> device) {
std::string device_type = device->GetTypeString();
std::shared_ptr<PhyDevice> phy_device = CreatePhyDevice(device_type, std::move(device));
phy_devices_[phy_device->id] = phy_device; return phy_device->id;
}
// Remove a device from the test model. void TestModel::RemoveDevice(PhyDevice::Identifier device_id) { for (auto& [_, phy_layer] : phy_layers_) {
phy_layer->Unregister(device_id);
}
phy_devices_.erase(device_id);
}
// Add a phy to the test model.
PhyLayer::Identifier TestModel::AddPhy(Phy::Type type) { static PhyLayer::Identifier next_id = 0;
std::shared_ptr<PhyLayer> phy_layer = CreatePhyLayer(next_id++, type);
phy_layers_[phy_layer->id] = phy_layer; return phy_layer->id;
}
// Remove a phy from the test model. void TestModel::RemovePhy(PhyLayer::Identifier phy_id) { if (phy_layers_.find(phy_id) != phy_layers_.end()) {
phy_layers_[phy_id]->UnregisterAll();
phy_layers_.erase(phy_id);
}
}
// Add the selected device to the selected phy. void TestModel::AddDeviceToPhy(PhyDevice::Identifier device_id, PhyLayer::Identifier phy_id) { if (phy_layers_.find(phy_id) != phy_layers_.end() &&
phy_devices_.find(device_id) != phy_devices_.end()) {
phy_layers_[phy_id]->Register(phy_devices_[device_id]);
}
}
// Remove the selected device from the selected phy. void TestModel::RemoveDeviceFromPhy(PhyDevice::Identifier device_id, PhyLayer::Identifier phy_id) { if (phy_layers_.find(phy_id) != phy_layers_.end()) {
phy_layers_[phy_id]->Unregister(device_id);
}
}
void TestModel::AddLinkLayerConnection(std::shared_ptr<Device> device, Phy::Type type) {
INFO(device->id_, "Adding a new link layer connection of type: {}",
type == Phy::Type::BR_EDR ? "BR_EDR" : "LOW_ENERGY");
void TestModel::AddRemote(const std::string& server, int port, Phy::Type type) { auto device = connect_to_remote_(server, port, type); if (device == nullptr) { return;
}
AddLinkLayerConnection(device, type);
}
PhyDevice::Identifier TestModel::AddHciConnection(std::shared_ptr<HciDevice> device,
std::optional<Address> address) { // clients can specify BD_ADDR or have it set based on device_id.
device->SetAddress(address.value_or(GenerateBluetoothAddress(device->id_)));
AddDevice(std::static_pointer_cast<Device>(device));
INFO(device->id_, "Initialized device with address {}", device->GetAddress());
for (auto& [_, phy_layer] : phy_layers_) {
phy_layer->Register(phy_devices_[device->id_]);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.