std::vector<wxString> SettingsAudioOutput::GetRemainingAudioDevices() { std::vector<wxString> result; for(unsigned i = 0; i < m_DeviceList.size(); i++) { if (!GetDeviceNode(m_DeviceList[i].name).IsOk()) result.push_back(m_DeviceList[i].name); } return result; }
wxTreeItemId SettingsAudioOutput::AddDeviceNode(wxString name, unsigned desired_latency) { wxTreeItemId current; if (name == wxEmptyString) name = m_Sound.GetDefaultAudioDevice(); current = GetDeviceNode(name); if (current.IsOk()) return current; current = m_AudioOutput->AppendItem(m_AudioOutput->GetRootItem(), wxEmptyString, -1, -1, new AudioItemData(name, desired_latency)); UpdateDevice(current); m_AudioOutput->Expand(current); return current; }
bool CDeviceView::RecurseChildDevices( _In_ DEVINST ParentDevice, _In_ HTREEITEM hParentTreeItem ) { HTREEITEM hDevItem = NULL; DEVINST Device; bool HasProblem = false; bool bSuccess; // Check if the parent has any child devices if (GetChildDevice(ParentDevice, &Device) == FALSE) return true; // Get the cached device node CDeviceNode *DeviceNode; DeviceNode = dynamic_cast<CDeviceNode *>(GetDeviceNode(Device)); if (DeviceNode == nullptr) { ATLASSERT(FALSE); return false; } // Don't show hidden devices if not requested if ((m_ShowHidden == TRUE) || (!(DeviceNode->IsHidden()))) { // Add this device to the tree under its parent hDevItem = InsertIntoTreeView(hParentTreeItem, DeviceNode); if (hDevItem) { // Check if this child has any children itself if (!RecurseChildDevices(Device, hDevItem)) HasProblem = true; } if (DeviceNode->HasProblem()) { HasProblem = true; } } // Check for siblings for (;;) { // Check if the parent device has anything at the same level bSuccess = GetSiblingDevice(Device, &Device); if (bSuccess == FALSE) break; DeviceNode = dynamic_cast<CDeviceNode *>(GetDeviceNode(Device)); if (DeviceNode == nullptr) { ATLASSERT(FALSE); } // Don't show hidden devices if not requested if ((m_ShowHidden == TRUE) || (!(DeviceNode->IsHidden()))) { if (DeviceNode->HasProblem()) { HasProblem = true; } // Add this device to the tree under its parent hDevItem = InsertIntoTreeView(hParentTreeItem, DeviceNode); if (hDevItem) { // Check if this child has any children itself if (!RecurseChildDevices(Device, hDevItem)) HasProblem = true; } } } (void)TreeView_SortChildren(m_hTreeView, hParentTreeItem, 0); // Expand the class if it has a problem device if (HasProblem == true) { (void)TreeView_Expand(m_hTreeView, hParentTreeItem, TVE_EXPAND); } // If there was a problem, expand the ancestors if (HasProblem) return false; return true; }
bool CDeviceView::ListDevicesByType() { CClassNode *ClassNode; CDeviceNode *DeviceNode; HDEVINFO hDevInfo; HTREEITEM hTreeItem = NULL; GUID ClassGuid; INT ClassIndex; BOOL bClassSuccess, bSuccess; ClassIndex = 0; do { // Loop through all the device classes bClassSuccess = GetNextClass(ClassIndex, &ClassGuid, &hDevInfo); if (bClassSuccess) { bool bClassUnknown = false; bool AddedParent = false; INT DeviceIndex = 0; bool MoreItems = false; // Get the cached class node ClassNode = GetClassNode(&ClassGuid); if (ClassNode == nullptr) { ATLASSERT(FALSE); ClassIndex++; continue; } // Set a flag is this is the (special case) unknown class if (IsEqualGUID(ClassGuid, GUID_DEVCLASS_UNKNOWN)) bClassUnknown = true; // Check if this is a hidden class if (IsEqualGUID(ClassGuid, GUID_DEVCLASS_LEGACYDRIVER) || IsEqualGUID(ClassGuid, GUID_DEVCLASS_VOLUME)) { // Ignore this device if we aren't displaying hidden devices if (m_ShowHidden == FALSE) { ClassIndex++; continue; } } do { // Get a handle to all the devices in this class SP_DEVINFO_DATA DeviceInfoData; ZeroMemory(&DeviceInfoData, sizeof(SP_DEVINFO_DATA)); DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); bSuccess = SetupDiEnumDeviceInfo(hDevInfo, DeviceIndex, &DeviceInfoData); if (bSuccess == FALSE && GetLastError() == ERROR_NO_MORE_ITEMS) MoreItems = false; if (bSuccess) { MoreItems = true; // The unknown class handle contains all devices on the system, // and we're just looking for the ones with a null GUID if (bClassUnknown) { if (IsEqualGUID(DeviceInfoData.ClassGuid, GUID_NULL) == FALSE) { // This is a known device, we aren't interested in it DeviceIndex++; continue; } } // Get the cached device node DeviceNode = GetDeviceNode(DeviceInfoData.DevInst); if (DeviceNode == nullptr) { ATLASSERT(bClassUnknown == true); DeviceIndex++; continue; } // Check if this is a hidden device if (DeviceNode->IsHidden()) { // Ignore this device if we aren't displaying hidden devices if (m_ShowHidden == FALSE) { DeviceIndex++; continue; } } // We have a device, we need to add the parent if it hasn't yet been added if (AddedParent == false) { // Insert the new class under the root item hTreeItem = InsertIntoTreeView(m_hTreeRoot, ClassNode); AddedParent = true; } // Add the device under the class item node (void)InsertIntoTreeView(hTreeItem, DeviceNode); // Expand the class if it has a problem device if (DeviceNode->HasProblem()) { (void)TreeView_Expand(m_hTreeView, hTreeItem, TVE_EXPAND); } } DeviceIndex++; } while (MoreItems); // If this class has devices, sort them alphabetically if (AddedParent == true) { (void)TreeView_SortChildren(m_hTreeView, hTreeItem, 0); } } ClassIndex++; } while (bClassSuccess); // Sort the classes alphabetically (void)TreeView_SortChildren(m_hTreeView, m_hTreeRoot, 0); // Expand the root item (void)TreeView_Expand(m_hTreeView, m_hTreeRoot, TVE_EXPAND); // Pre-select the root item (VOID)TreeView_SelectItem(m_hTreeView, m_hTreeRoot); return 0; }
int uORB::DeviceMaster::ioctl(device::file_t *filp, int cmd, unsigned long arg) { int ret; switch (cmd) { case ORBIOCADVERTISE: { const struct orb_advertdata *adv = (const struct orb_advertdata *)arg; const struct orb_metadata *meta = adv->meta; const char *objname; const char *devpath; char nodepath[orb_maxpath]; uORB::DeviceNode *node; /* construct a path to the node - this also checks the node name */ ret = uORB::Utils::node_mkpath(nodepath, _flavor, meta, adv->instance); if (ret != PX4_OK) { return ret; } ret = ERROR; /* try for topic groups */ const unsigned max_group_tries = (adv->instance != nullptr) ? ORB_MULTI_MAX_INSTANCES : 1; unsigned group_tries = 0; if (adv->instance) { /* for an advertiser, this will be 0, but a for subscriber that requests a certain instance, * we do not want to start with 0, but with the instance the subscriber actually requests. */ group_tries = *adv->instance; if (group_tries >= max_group_tries) { return -ENOMEM; } } SmartLock smart_lock(_lock); do { /* if path is modifyable change try index */ if (adv->instance != nullptr) { /* replace the number at the end of the string */ nodepath[strlen(nodepath) - 1] = '0' + group_tries; *(adv->instance) = group_tries; } objname = meta->o_name; //no need for a copy, meta->o_name will never be freed or changed /* driver wants a permanent copy of the path, so make one here */ devpath = strdup(nodepath); if (devpath == nullptr) { return -ENOMEM; } /* construct the new node */ node = new uORB::DeviceNode(meta, objname, devpath, adv->priority); /* if we didn't get a device, that's bad */ if (node == nullptr) { free((void *)devpath); return -ENOMEM; } /* initialise the node - this may fail if e.g. a node with this name already exists */ ret = node->init(); /* if init failed, discard the node and its name */ if (ret != PX4_OK) { delete node; if (ret == -EEXIST) { /* if the node exists already, get the existing one and check if * something has been published yet. */ uORB::DeviceNode *existing_node = GetDeviceNode(devpath); if ((existing_node != nullptr) && !(existing_node->is_published())) { /* nothing has been published yet, lets claim it */ ret = PX4_OK; } else { /* otherwise: data has already been published, keep looking */ } } /* also discard the name now */ free((void *)devpath); } else { // add to the node map;. _node_map[std::string(nodepath)] = node; } group_tries++; } while (ret != PX4_OK && (group_tries < max_group_tries)); if (ret != PX4_OK && group_tries >= max_group_tries) { ret = -ENOMEM; } return ret; } default: /* give it to the superclass */ return VDev::ioctl(filp, cmd, arg); } }
int uORB::DeviceMaster::ioctl(device::file_t *filp, int cmd, unsigned long arg) { int ret; switch (cmd) { case ORBIOCADVERTISE: { const struct orb_advertdata *adv = (const struct orb_advertdata *)arg; const struct orb_metadata *meta = adv->meta; const char *objname; const char *devpath; char nodepath[orb_maxpath]; uORB::DeviceNode *node; /* set instance to zero - we could allow selective multi-pubs later based on value */ if (adv->instance != nullptr) { *(adv->instance) = 0; } /* construct a path to the node - this also checks the node name */ ret = uORB::Utils::node_mkpath(nodepath, _flavor, meta, adv->instance); if (ret != PX4_OK) { return ret; } /* ensure that only one advertiser runs through this critical section */ lock(); ret = ERROR; /* try for topic groups */ const unsigned max_group_tries = (adv->instance != nullptr) ? ORB_MULTI_MAX_INSTANCES : 1; unsigned group_tries = 0; do { /* if path is modifyable change try index */ if (adv->instance != nullptr) { /* replace the number at the end of the string */ nodepath[strlen(nodepath) - 1] = '0' + group_tries; *(adv->instance) = group_tries; } /* driver wants a permanent copy of the node name, so make one here */ objname = strdup(meta->o_name); if (objname == nullptr) { return -ENOMEM; } /* driver wants a permanent copy of the path, so make one here */ devpath = strdup(nodepath); if (devpath == nullptr) { // FIXME - looks like we leaked memory here for objname return -ENOMEM; } /* construct the new node */ node = new uORB::DeviceNode(meta, objname, devpath, adv->priority); /* if we didn't get a device, that's bad */ if (node == nullptr) { unlock(); // FIXME - looks like we leaked memory here for devpath and objname return -ENOMEM; } /* initialise the node - this may fail if e.g. a node with this name already exists */ ret = node->init(); /* if init failed, discard the node and its name */ if (ret != PX4_OK) { delete node; if (ret == -EEXIST) { /* if the node exists already, get the existing one and check if * something has been published yet. */ uORB::DeviceNode *existing_node = GetDeviceNode(devpath); if ((existing_node != nullptr) && !(existing_node->is_published())) { /* nothing has been published yet, lets claim it */ ret = PX4_OK; } else { /* otherwise: data has already been published, keep looking */ } } /* also discard the name now */ free((void *)objname); free((void *)devpath); } else { // add to the node map;. _node_map[std::string(nodepath)] = node; } group_tries++; } while (ret != PX4_OK && (group_tries < max_group_tries)); if (group_tries > max_group_tries) { ret = -ENOMEM; } /* the file handle for the driver has been created, unlock */ unlock(); return ret; } default: /* give it to the superclass */ return VDev::ioctl(filp, cmd, arg); } }