Add initial tdehardwaredevices skeleton to tdecore
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