This forum has been archived. All content is frozen. Please use KDE Discuss instead.

Batterie in Peripheriegerät wird nicht angezeigt

Tags: None
(comma "," separated)
flood
Registered Member
Posts
2
Karma
0
Hallo zusammen :)
Folgendes Problem habe ich zur Zeit und leider komme ich nicht weiter:

Die Batterie in meinem Gamepad wird mir in der Taskleiste nicht angezeigt.
Und daher fehlt mir auch die Option in den Energieeinstellungen bezüglich des "low level" für Peripheriegeräte.

Soweit ich es in Erfahrung bringen konnte benutzt KDE das Programm PowerDevil.
PowerDevil selbst nutzt dann wiederrum Solid.

Ich konnte folgenden Code in Powerdevil dingfest machen:

Code: Select all
Q_FOREACH (const Solid::Device &device, Solid::Device::listFromType(Solid::DeviceInterface::Battery, QString())) {

    const Solid::Battery *b = qobject_cast<const Solid::Battery*> (device.asDeviceInterface(Solid::DeviceInterface::Battery));

    if (b->isPowerSupply()) {
        hasPowerSupplyBattery = true;
    } else {
        hasPeripheralBattery = true;
    }

}


Wenn ich diesen Code selbst ausführe, so stellt sich raus dass nur eine Batterie in dieser Liste ist, die Hauptbatterie.
Die andere Batterie aus dem Gamepad fehlt leider, vermutlich liegt das daran dass die Batterie nicht als Batterie erkannt,
da folgendes die Batterie zwar aufführt, aber eben nicht als Batterie:

Code: Select all
foreach( Solid::Device device, Solid::Device::allDevices() )
{
    qDebug() << "Batt: " << device.isDeviceInterface(Solid::DeviceInterface::Battery) << " - " << device.udi() << " : " << device.description();
}


Ergibt:
Batt: false - "/org/freedesktop/UPower/devices/gaming_input_...


Ich frage mich also wieso Solid meine Batterie nicht als Batterie erkennt - leider komme ich im Code-Dschungel nicht wirklich weiter.
Könnt ihr mir bitte helfen? ;D

Das komische ist, dass es ja wohl offensichtlich eine Batterie ist, auch im System :)
Code: Select all
$ solid-hardware nonportableinfo /org/freedesktop/UPower/devices/gaming_input_xpadneo_batt_3ao32o30o3ao34o33
Object::connect: No such signal org::freedesktop::UPower::Device::Changed()
udi = '/org/freedesktop/UPower/devices/gaming_input_xpadneo_batt_3ao32o30o3ao34o33'
  BatteryLevel = 7  (0x7)  (uint)
  Capacity = '0'  (string)
  Energy = '0'  (string)
  EnergyEmpty = '0'  (string)
  EnergyFull = '0'  (string)
  EnergyFullDesign = '0'  (string)
  EnergyRate = '0'  (string)
  HasHistory = true  (bool)
  HasStatistics = true  (bool)
  IconName = 'battery-full-symbolic'  (string)
  IsPresent = true  (bool)
  IsRechargeable = true  (bool)
  Luminosity = '0'  (string)
  Model = 'Xbox Wireless Controller'  (string)
  NativePath = 'xpadneo_batt_3a:32:30:3a:34:33'  (string)
  Online = false  (bool)
  Percentage = '70'  (string)
  PowerSupply = false  (bool)
  Serial = ''  (string)
  State = 2  (0x2)  (uint)
  Technology = 0  (0x0)  (uint)
  Temperature = '0'  (string)
  TimeToEmpty = 0  (0x0)  (qlonglong)
  TimeToFull = 0  (0x0)  (qlonglong)
  Type = 12  (0xc)  (uint)
  UpdateTime = 1520792249  (0x5aa572b9)  (qulonglong)
  Vendor = ''  (string)
  Voltage = '0'  (string)
  WarningLevel = 1  (0x1)  (uint)


Update

Bei der Ausgabe oben sieht man folgende Zeile
Type = 12 (0xc) (uint)


In device.cpp / upowerdevice.cpp wird folgendermaßen entschieden ob es eine Battery ist oder nicht:
Code: Select all
bool Solid::Device::isDeviceInterface(const DeviceInterface::Type &type) const
{
    return_SOLID_CALL(Ifaces::Device *, d->backendObject(), false, queryDeviceInterface(type));
}
Code: Select all
bool UPowerDevice::queryDeviceInterface(const Solid::DeviceInterface::Type &type) const
{
    const uint uptype = prop("Type").toUInt();
    switch (type) {
    case Solid::DeviceInterface::GenericInterface:
        return true;
    case Solid::DeviceInterface::Battery:
        return (uptype == 2 || uptype == 3 || uptype == 5 || uptype == 6 || uptype == 7 || uptype == 8);
    default:
        return false;
    }
}


Hier ist Type 12 nicht als Batterietyp aufgeführt, dementsprechend wird es auch nicht als Batterie angezeigt.
flood
Registered Member
Posts
2
Karma
0
Gelöst, in upowerdevice.cpp muss diese Funktion angepasst werden:

Code: Select all
bool UPowerDevice::queryDeviceInterface(const Solid::DeviceInterface::Type &type) const
{
    const uint uptype = prop("Type").toUInt();
    switch (type) {
    case Solid::DeviceInterface::GenericInterface:
        return true;
    case Solid::DeviceInterface::Battery:
        /* Every Device which is handled by Upower and which is not
         * UP_DEVICE_KIND_UNKNOWN (0), UP_DEVICE_KIND_LINE_POWER (1)
         * or UP_DEVICE_KIND_MONITOR (4) is a battery.
         */
        return (uptype != 0 && uptype != 1 && uptype != 4);
    default:
        return false;
    }
}


Jemand was zu bemängeln? Sonst stelle ich irgendwann mal einen Merge Request


Bookmarks



Who is online

Registered users: Bing [Bot], Evergrowing, Google [Bot]