diff -Naur old/kthinkbat-0.1.5/src/batinfo.cpp new/kthinkbat-0.1.5/src/batinfo.cpp --- old/kthinkbat-0.1.5/src/batinfo.cpp 2006-01-29 12:51:51.000000000 -0500 +++ new/kthinkbat-0.1.5/src/batinfo.cpp 2006-04-26 14:50:38.000000000 -0400 @@ -30,6 +30,7 @@ BatInfo::BatInfo( int number ) : batNr( number - 1 ) { + initBatName(); resetValues(); } @@ -51,23 +52,26 @@ QString line = ""; QString mWHstring = ""; // normale Angaben: Kapzität, Max Kap., aktuelle Kap. - QString cap = "", designCap = "", cur = ""; + QString cap = "", designCapWarn = "", designCap = "", cur = ""; // dieselben Angaben, aber in mAh statt in mWh - QString capA = "", designCapA = ""; + QString capA = "", designCapWarnA = "", designCapA = ""; // Pattern für /proc/acpi/battery/BATx/info // ThinkPad (mWh) QRegExp rxInstalled( "^present:\\s*(yes)" ); QRegExp rxCap("^last full capacity:\\s*(\\d{1,5})\\s*mWh"); + QRegExp rxDesignCapWarn("^design capacity warning:\\s*(\\d{1,5})\\s*mWh"); QRegExp rxDesignCap("^design capacity low:\\s*(\\d{1,5})\\s*mWh"); // Asus/Acer (mAh) QRegExp rxCapA("^last full capacity:\\s*(\\d{1,5})\\s*mAh"); + QRegExp rxDesignCapWarnA("^design capacity warning:\\s*(\\d{1,5})\\s*mAh"); QRegExp rxDesignCapA("^design capacity low:\\s*(\\d{1,5})\\s*mAh"); - QString filename = "/proc/acpi/battery/BAT" + QString::number(batNr) + "/info"; + QString filename = "/proc/acpi/battery/" + batName + "/info"; QFile file( filename ); + if( ! file.exists() || ! file.open(IO_ReadOnly) ) { - qDebug( "could not open %s", file.name().latin1() ); + qDebug( "could not open %s", file.name().latin1()); resetValues(); return false; } @@ -79,22 +83,31 @@ line = stream.readLine(); if( -1 != rxInstalled.search( line ) ) { batInstalled = rxInstalled.cap(1) == "yes"; - //KMessageBox::information(0, "fount cap: "+cap); } if( -1 != rxCap.search( line ) ) { cap = rxCap.cap(1); - //KMessageBox::information(0, "fount cap: "+cap); + //qDebug("found cap: %s", cap.ascii()); } + if(rxDesignCapWarn.search(line) != -1) { + designCapWarn = rxDesignCapWarn.cap(1); + //qDebug("found designCapWarn: %s", designCapWarn.ascii()); + } if( -1 != rxDesignCap.search( line ) ) { designCap = rxDesignCap.cap(1); + //qDebug("found designCap: %s", designCap.ascii()); } if( -1 != rxCapA.search( line ) ) { capA = rxCapA.cap(1); - //KMessageBox::information(0, "fount cap: "+cap); + //qDebug("found capA: %s", capA.ascii()); } + if(rxDesignCapWarnA.search(line) != -1) { + designCapWarnA = rxDesignCapWarnA.cap(1); + //qDebug("found designCapWarnA: %s", designCapWarnA.ascii()); + } if( -1 != rxDesignCapA.search( line ) ) { designCapA = rxDesignCapA.cap(1); - } + //qDebug("found capA: %s", designCapA.ascii()); + } } file.close(); @@ -102,8 +115,18 @@ resetValues(); batInstalled = false; return false; - } - + } + + // estimate capacity from "design capacity warning" + if (cap.isEmpty() && capA.isEmpty()) { + if (!designCapWarn.isEmpty()) { + cap = QString("%1").arg(designCapWarn.toInt() * 4); + } + else if (!designCapWarnA.isEmpty()) { + capA = QString("%1").arg(designCapWarnA.toInt() * 4); + } + } + // Falls keine Angaben in mWh, dafür aber welche in mAh, // dann verwenden wir A als Einheit if( cap.isEmpty() && ! capA.isEmpty() ) { @@ -116,10 +139,10 @@ powerUnit = "W"; } - filename = "/proc/acpi/battery/BAT" + QString::number(batNr) + "/state"; + filename = "/proc/acpi/battery/" + batName + "/state"; file.setName( filename ); if( ! file.exists() || ! file.open(IO_ReadOnly) ) { - qDebug("could not open %s", file.name().latin1() ); + qDebug("could not open %s", file.name().latin1()); resetValues(); return false; } @@ -150,7 +173,7 @@ if( ! ok ) { curFuel = 0; } ok = true; - lastFuel = cap.toInt(&ok); + lastFuel = (curFuel > cap.toInt(&ok)) ? curFuel : cap.toInt(&ok); if( ! ok ) { lastFuel = 0; } // current cosumption @@ -173,10 +196,10 @@ QRegExp rxWarnCap("^alarm:\\s*(\\d{1,5})\\s*m" + powerUnit + "h"); // Get Alarm Fuel - QString filename = "/proc/acpi/battery/BAT" + QString::number( batNr ) + "/alarm"; + QString filename = "/proc/acpi/battery/" + batName + "/alarm"; QFile file( filename ); if( ! file.exists() || ! file.open(IO_ReadOnly) ) { - qDebug("could not open %s", file.name().latin1() ); + qDebug("could not open %s", file.name().latin1()); criticalFuel = 0; return false; } @@ -315,6 +338,24 @@ return true; } +void BatInfo::initBatName() +{ + // assign battery name. batNr is zero-indexed. + QDir d("/proc/acpi/battery"); + int n = 0; + for (unsigned int i = 0; i < d.count(); ++i) { + if (d[i] == "." || d[i] == "..") { + continue; + } + if (n == batNr) { + batName = QString(d[i]); + break; + } + ++n; + } + qDebug("initBatName():\t<%d>\t<%s>", batNr, batName.ascii()); +} + void BatInfo::resetValues() { lastFuel = 0; diff -Naur old/kthinkbat-0.1.5/src/batinfo.h new/kthinkbat-0.1.5/src/batinfo.h --- old/kthinkbat-0.1.5/src/batinfo.h 2006-01-24 09:29:29.000000000 -0500 +++ new/kthinkbat-0.1.5/src/batinfo.h 2006-04-26 14:50:39.000000000 -0400 @@ -40,11 +40,12 @@ BatInfo( int number = 1 ); virtual ~BatInfo(); + QString getBatName() { return batName; } + /** Get the current charge level. - @return the carge level between 0 and 100, or a negative value, if there are errors + @return the charge level between 0 and 100, or a negative value, if there are errors */ float getChargeLevel(); - float getLastFuel() { return lastFuel; } float getDesignFuel() { return designFuel; } float getCriticalFuel() { return criticalFuel; } @@ -68,6 +69,7 @@ bool parseSysfsTP(); protected: + void initBatName(); void resetValues(); private: @@ -77,6 +79,7 @@ float curFuel; float curPower; + QString batName; int batNr; bool batInstalled;