Do not use the added classes yet, as the API and ABI are still under heavy construction!pull/16/head
parent
2b5fed5f0e
commit
22f8381c08
@ -0,0 +1,171 @@
|
||||
/* This file is part of the TDE libraries
|
||||
Copyright (C) 2012 Timothy Pearson <kb9vqf@pearsoncomputing.net>
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public
|
||||
License version 2 as published by the Free Software Foundation.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public License
|
||||
along with this library; see the file COPYING.LIB. If not, write to
|
||||
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||
Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#include <tdehardwaredevices.h>
|
||||
|
||||
#include <libudev.h>
|
||||
|
||||
TDEGenericDevice::TDEGenericDevice(TDEGenericDeviceType::TDEGenericDeviceType dt, TQString dn) {
|
||||
m_deviceType = dt;
|
||||
m_deviceName = dn;
|
||||
}
|
||||
|
||||
TDEGenericDevice::~TDEGenericDevice() {
|
||||
}
|
||||
|
||||
TDEGenericDeviceType::TDEGenericDeviceType TDEGenericDevice::type() {
|
||||
return m_deviceType;
|
||||
}
|
||||
|
||||
TQString &TDEGenericDevice::name() {
|
||||
return m_deviceName;
|
||||
}
|
||||
|
||||
void TDEGenericDevice::setName(TQString dn) {
|
||||
m_deviceName = dn;
|
||||
}
|
||||
|
||||
TQString &TDEGenericDevice::systemPath() {
|
||||
return m_systemPath;
|
||||
}
|
||||
|
||||
void TDEGenericDevice::setSystemPath(TQString sp) {
|
||||
m_systemPath = sp;
|
||||
}
|
||||
|
||||
TQString &TDEGenericDevice::deviceNode() {
|
||||
return m_deviceNode;
|
||||
}
|
||||
|
||||
void TDEGenericDevice::setDeviceNode(TQString sn) {
|
||||
m_deviceNode = sn;
|
||||
}
|
||||
|
||||
TDEHardwareDevices::TDEHardwareDevices() {
|
||||
// Set up device list
|
||||
m_deviceList.setAutoDelete( TRUE ); // the list owns the objects
|
||||
|
||||
// Initialize udev interface
|
||||
m_udevStruct = udev_new();
|
||||
if (!m_udevStruct) {
|
||||
printf("Unable to create udev interface\n\r");
|
||||
}
|
||||
|
||||
// Update internal device information
|
||||
queryHardwareInformation();
|
||||
}
|
||||
|
||||
TDEHardwareDevices::~TDEHardwareDevices() {
|
||||
// Tear down udev interface
|
||||
udev_unref(m_udevStruct);
|
||||
}
|
||||
|
||||
bool TDEHardwareDevices::queryHardwareInformation() {
|
||||
if (!m_udevStruct) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Prepare the device list for repopulation
|
||||
m_deviceList.clear();
|
||||
|
||||
struct udev_enumerate *enumerate;
|
||||
struct udev_list_entry *devices, *dev_list_entry;
|
||||
struct udev_device *dev;
|
||||
|
||||
// Create a list of all devices
|
||||
enumerate = udev_enumerate_new(m_udevStruct);
|
||||
udev_enumerate_add_match_subsystem(enumerate, NULL);
|
||||
udev_enumerate_scan_devices(enumerate);
|
||||
devices = udev_enumerate_get_list_entry(enumerate);
|
||||
// Get detailed information on each detected device
|
||||
udev_list_entry_foreach(dev_list_entry, devices) {
|
||||
const char *path;
|
||||
|
||||
// Get the filename of the /sys entry for the device and create a udev_device object (dev) representing it
|
||||
path = udev_list_entry_get_name(dev_list_entry);
|
||||
dev = udev_device_new_from_syspath(m_udevStruct, path);
|
||||
|
||||
// Classify device and create TDEW device object
|
||||
TQString devicename(udev_device_get_sysname(dev));
|
||||
TQString devicetype(udev_device_get_devtype(dev));
|
||||
TQString devicedriver(udev_device_get_driver(dev));
|
||||
TQString devicesubsystem(udev_device_get_subsystem(dev));
|
||||
TQString devicenode(udev_device_get_devnode(dev));
|
||||
TQString systempath(udev_device_get_syspath(dev));
|
||||
bool removable = false;
|
||||
TDEGenericDevice* device = 0;
|
||||
|
||||
if (devicetype == "disk") {
|
||||
// Determine if disk is removable
|
||||
TQString removablenodename = udev_device_get_syspath(dev);
|
||||
removablenodename.append("/removable");
|
||||
FILE *fp = fopen(removablenodename.ascii(),"r");
|
||||
if (fp) {
|
||||
if (fgetc(fp) == '1') {
|
||||
removable = true;
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
if (removable) {
|
||||
device = new TDEGenericDevice(TDEGenericDeviceType::RemovableDisk);
|
||||
}
|
||||
else {
|
||||
device = new TDEGenericDevice(TDEGenericDeviceType::FixedDisk);
|
||||
}
|
||||
}
|
||||
else if (devicetype.isNull()) {
|
||||
if (devicesubsystem == "acpi") {
|
||||
device = new TDEGenericDevice(TDEGenericDeviceType::OtherACPI);
|
||||
}
|
||||
else if (devicesubsystem == "input") {
|
||||
device = new TDEGenericDevice(TDEGenericDeviceType::HID);
|
||||
}
|
||||
else if (devicesubsystem == "tty") {
|
||||
device = new TDEGenericDevice(TDEGenericDeviceType::TextIO);
|
||||
}
|
||||
else if (devicesubsystem == "thermal") {
|
||||
// FIXME
|
||||
// Figure out a way to differentiate between ThermalControl (fans and coolers) and ThermalSensor types
|
||||
device = new TDEGenericDevice(TDEGenericDeviceType::ThermalControl);
|
||||
}
|
||||
else if (devicesubsystem == "hwmon") {
|
||||
// FIXME
|
||||
// This might pick up thermal sensors
|
||||
device = new TDEGenericDevice(TDEGenericDeviceType::OtherSensor);
|
||||
}
|
||||
}
|
||||
if (device == 0) {
|
||||
// Unhandled
|
||||
device = new TDEGenericDevice(TDEGenericDeviceType::Other);
|
||||
printf("[FIXME] UNCLASSIFIED DEVICE name: %s type: %s subsystem: %s driver: %s [Node Path: %s] [Syspath: %s]\n\r", devicename.ascii(), devicetype.ascii(), devicesubsystem.ascii(), devicedriver.ascii(), devicenode.ascii(), udev_device_get_syspath(dev)); fflush(stdout);
|
||||
}
|
||||
device->setName(devicename);
|
||||
device->setDeviceNode(devicenode);
|
||||
device->setSystemPath(systempath);
|
||||
m_deviceList.append(device);
|
||||
}
|
||||
|
||||
// Free the enumerator object
|
||||
udev_enumerate_unref(enumerate);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
TDEGenericHardwareList &TDEHardwareDevices::listAllPhysicalDevices() {
|
||||
return m_deviceList;
|
||||
}
|
@ -0,0 +1,168 @@
|
||||
/* This file is part of the TDE libraries
|
||||
Copyright (C) 2012 Timothy Pearson <kb9vqf@pearsoncomputing.net>
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public
|
||||
License version 2 as published by the Free Software Foundation.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public License
|
||||
along with this library; see the file COPYING.LIB. If not, write to
|
||||
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||
Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
#ifndef _TDEHARDWAREDEVICES_H
|
||||
#define _TDEHARDWAREDEVICES_H
|
||||
|
||||
// TDE includes
|
||||
#include <tqstring.h>
|
||||
#include <tqptrlist.h>
|
||||
#include "tdelibs_export.h"
|
||||
|
||||
// udev includes
|
||||
#include <libudev.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <locale.h>
|
||||
#include <unistd.h>
|
||||
|
||||
/**
|
||||
* Hardware Device Access and Monitoring Library
|
||||
*
|
||||
* @author Timothy Pearson
|
||||
*/
|
||||
|
||||
namespace TDEGenericDeviceType {
|
||||
enum TDEGenericDeviceType {
|
||||
CPU,
|
||||
GPU,
|
||||
RAM,
|
||||
Mainboard,
|
||||
FixedDisk,
|
||||
RemovableDisk,
|
||||
StorageController,
|
||||
HID,
|
||||
Network,
|
||||
Printer,
|
||||
Scanner,
|
||||
TextIO,
|
||||
Peripheral,
|
||||
Battery,
|
||||
Power,
|
||||
ThermalSensor,
|
||||
ThermalControl,
|
||||
OtherACPI,
|
||||
OtherUSB,
|
||||
OtherPeripheral,
|
||||
OtherSensor,
|
||||
Other
|
||||
};
|
||||
};
|
||||
|
||||
class TDECORE_EXPORT TDEGenericDevice
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Constructor.
|
||||
* @param Device type
|
||||
*/
|
||||
TDEGenericDevice(TDEGenericDeviceType::TDEGenericDeviceType dt, TQString dn=TQString::null);
|
||||
|
||||
/**
|
||||
* Destructor.
|
||||
*/
|
||||
~TDEGenericDevice();
|
||||
|
||||
/**
|
||||
* @return a TDEGenericDeviceType::TDEGenericDeviceType specifying the device type
|
||||
*/
|
||||
TDEGenericDeviceType::TDEGenericDeviceType type();
|
||||
|
||||
/**
|
||||
* @return a TQString with the device name, if any
|
||||
*/
|
||||
TQString &name();
|
||||
|
||||
/**
|
||||
* @param a TQString with the device name, if any
|
||||
*/
|
||||
void setName(TQString dn);
|
||||
|
||||
/**
|
||||
* @return a TQString with the system path, if any
|
||||
*
|
||||
* This method is non-portable, so be careful!
|
||||
*/
|
||||
TQString &systemPath();
|
||||
|
||||
/**
|
||||
* @param a TQString with the system path, if any
|
||||
*
|
||||
* This method is non-portable, so be careful!
|
||||
*/
|
||||
void setSystemPath(TQString sp);
|
||||
|
||||
/**
|
||||
* @return a TQString with the system device node, if any
|
||||
*
|
||||
* This method is non-portable, so be careful!
|
||||
*/
|
||||
TQString &deviceNode();
|
||||
|
||||
/**
|
||||
* @param a TQString with the system device node, if any
|
||||
*
|
||||
* This method is non-portable, so be careful!
|
||||
*/
|
||||
void setDeviceNode(TQString sn);
|
||||
|
||||
private:
|
||||
TDEGenericDeviceType::TDEGenericDeviceType m_deviceType;
|
||||
TQString m_deviceName;
|
||||
TQString m_systemPath;
|
||||
TQString m_deviceNode;
|
||||
};
|
||||
|
||||
typedef TQPtrList<TDEGenericDevice> TDEGenericHardwareList;
|
||||
|
||||
class TDECORE_EXPORT TDEHardwareDevices
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Constructor.
|
||||
*/
|
||||
TDEHardwareDevices();
|
||||
|
||||
/**
|
||||
* Destructor.
|
||||
*/
|
||||
~TDEHardwareDevices();
|
||||
|
||||
/**
|
||||
* Query all hardware capabilities on all devices
|
||||
* This does not normally need to be called by an application, as
|
||||
* device detection is handled internally and automatically
|
||||
*
|
||||
* A call to this method immediately invalidates any TDEGenericHardwareList
|
||||
* structures returned by listAllPhysicalDevices()
|
||||
*
|
||||
* @return TRUE if successful
|
||||
*/
|
||||
bool queryHardwareInformation();
|
||||
|
||||
/**
|
||||
* List all hardware capabilities on all devices
|
||||
* @return TQPtrList<TDEGenericDevice> containing all known hardware devices
|
||||
*/
|
||||
TQPtrList<TDEGenericDevice> &listAllPhysicalDevices();
|
||||
|
||||
private:
|
||||
struct udev *m_udevStruct;
|
||||
TDEGenericHardwareList m_deviceList;
|
||||
};
|
||||
|
||||
#endif
|
Loading…
Reference in new issue