Akkus erkennen & SYSTEM_POWER_STATUS vs.SYSTEM_BATTERY_S

Für allgemeine Fragen zur Programmierung mit PureBasic.
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Akkus erkennen & SYSTEM_POWER_STATUS vs.SYSTEM_BATTERY_S

Beitrag von Toshy »

Hallo.

Ich bin über den Beitrag
http://www.purebasic.fr/german/viewtopi ... light=akku
auf die "Powerstatusfunktionen" aufmerksam geworden. Was aber ist der gro be Unterschied zwischen GetSystemPowerStatus_() vs. SYSTEM_BATTERY_STATE_()? Besondern gibt es bei dort AcOnLine bzw. AcOnLineStauts, was soll der Unterschied sein bzw. was sollte man besser benutzen?
http://msdn2.microsoft.com/en-us/library/aa373212.aspx

Meine Frage hat mit folgender Frage und dem Anliegen dazu zu tun:

1. Wie erkennt man die Anzahl der vorhandenen Akkus und wie fragt man diese einzeln ab?
2. Sind die Powerfunktionen nur für Laptopakkus zu nutzen, oder allgemein (z.B. diese USV-Versorgung)

Bei meinem alten gebrauchten Notebook (3-4 Jahre alt) sind zwei Akkus drinn (einer ist schon total schlapp) und beide werden in der Energieanzeige von WindowsXP angezeigt. Dort steht der "Batteriestand" in prozenten angegeben und dann geweils neben jeder Batterie. Neben den Batterien steht natürlich der Status der Batterie und der "oben im Dialog" zeigt wohl irgendeine Art von Durchschnittswert. Was mir dabei aufgefallen ist, das auch wenn nur ein Akku eingeschoben ist, hier öfter mal eine Differenz von einem Prozent herscht.
Wer kann mir zu alle dem etwas mehr sagen?

Ach ja, bei der Vorlage unter dem oben genannten Link ist hinter den Werten immer ein "& 255" vermerkt, das hat wohl was mit den signed Variablen in PB zu tun. Muß ich das bei allen Variablen machen die durch APIs zurück gegeben werden?

Gruß Toshy
Zuletzt geändert von Toshy am 08.02.2007 04:48, insgesamt 1-mal geändert.
1. Win10
PB6.1
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag von Toshy »

Guten Morgen,

Ich habe unter
http://msdn2.microsoft.com/en-us/library/bb204769.aspx
etwas gefunden, womit man wohl die Anzahl und die Infos von Batterien auslesen kann. Leider komme ich auf Grund meiner Englischkenntnisse, aber vor allem aus Unkenntnis über die Codesyntax auf der Seite (wohl C) nicht damit klar. Vor allem, was
&GUID_DEVICE_BATTERY und &did sein soll, besser gesagt woher es kommt, weiß ich nicht.
Als erstes wird da wohl die Anzahl der Batterien ausgelesen, dann die Infos in einer Schleife. Zum auslesen der Anzahl braucht man aber wohl den Typ der Laufwerke(Device) und dann wird da noch irgendwie unterschieden zwischen USV und normaler Batterie bzw. Netzstrom. Falls jemand weiß, wie ich anfangen soll wäre das echt klasse.

Gruß Toshy
l
1. Win10
PB6.1
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Mit & wird die Adresse angegeben , in PB geht das mit @.
GUID_DEVICE_BATTERY ist eine ID.

Code: Alles auswählen

structure SP_DEVICE_INTERFACE_DATA 
  cbSize.l
  InterfaceClassGuid.GUID
  Flags.l
  Reserved.l
EndStructure

did.SP_DEVICE_INTERFACE_DATA

hdev = SetupDiGetClassDevs_(?GUID_DEVICE_BATTERY,0,0,0)

SetupDiEnumDeviceInterfaces_(hdev,0,?GUID_DEVICE_BATTERY,0,@did)

DataSection
  GUID_DEVICE_BATTERY:
  data.l $72631e54
  data.w $78A4
  data.w $11d0
  data.b $bc, $f7, $00, $aa, $00, $b7, $b3, $2a
EndDataSection
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag von Toshy »

Ahh, danke dir dafür. Gut das zu wissen. Kein wunder das mir das komisch vor kam. Ich dachte es wären nur "normale Variablen" die man vorher belegen muß und da habe ich natürlich nichts von gesehen.

Ich kompeliere gerade, aber der Kompiler meckert das SetupDiEnumDeviceInterfaces_(hdev,0,?GUID_DEVICE_BATTERY,0,@did) keine Funktion, Macro oder so ist. Wieso kennt er das nicht? Ich denke die API-AUfrufe mit dem Unterstrich werden einfach nur weitergereicht und bei MS steht, das man WindowsXP benötigt, das ist hier ja drauf.

Woran könnte das liegen?

woher hast du die werte aus der DataSection? ist es wichtig zu wissen was sie bedeuten?
1. Win10
PB6.1
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

PB kennt nicht alle API Befehle . Oeffne die DLL selber.

Beispiel :

Code: Alles auswählen

Prototype SDEDI(a,b,c,d,e)

if OpenLibrary(0,"Setupapi.dll")
  SetupDiEnumDeviceInterfaces.SDEDI = GetFunction(0,"SetupDiEnumDeviceInterfaces") 
EndIf
Die ID ist, oh wunder, aus dem Internet :mrgreen:

Ich benutze Google / Code Search http://www.google.com/codesearch
um fehlende Strukturen oder sonst Etwas zu finden.
Ob es nun wichtig ist zu wissen was sie bedeutet kann ich dir nicht
sagen, das musst du selber wissen.

Grossgeschriebene Woerter sind meistens Konstanten, falls du nicht
weisst was DIGCF_DEVICEINTERFACE usw. bedeutet ;-)

http://www.google.com/codesearch?q=DIGC ... ode+suchen
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag von Toshy »

Danke erstmal.
DIe Googleseite kannte ich nicht, auch wenn sie mir bisher nicht so weiterhilft.

Leider habe ich bisher noch nicht hinbekommen, die Daten die ich haben will rauszulesen bzw. weiß noch nicht mal genau was man damit rauslesen kann, aber ich hoffe ich finde es noch raus. Was auf Grund der MS-Vorlage scheint ist, das man eine bestimmte Anzahl an Daten auslesen muß um zu sehen, das drinn steht, aber man nicht erkennen kann, wie viele Akkus nun wirklich vorhanden sind.

Was ich gerne dazu noch wüßte ist, wie das nun genau ist mit den Akkus, denn wenn ich die Vorlage richtig verstehe, gibt sie nur normale Akkus aus, nicht aber USV (ups). Aber was gibt die Engerieanzeige von Windows aus (SYSTEM_POWER_STATUS), nur normale Akkus oder den Gesamtstatus? Ich habe kein USV und kann daher nicht testen.

So, dann werde ich mal schauen, ob ich da was zusammencoden kann.
Bis denne.
1. Win10
PB6.1
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag von Toshy »

Also ich teste und bastele und lese mich so durch.

Code: Alles auswählen

Prototype SDEDI(a,b,c,d,e)

If OpenLibrary(0,"Setupapi.dll")
  SetupDiEnumDeviceInterfaces.SDEDI = GetFunction(0,"SetupDiEnumDeviceInterfaces")
EndIf 

Structure SP_DEVICE_INTERFACE_DATA
  cbSize.l
  InterfaceClassGuid.GUID
  flags.l
  reserved.l
EndStructure

 did.SP_DEVICE_INTERFACE_DATA
;did\cbSize = SizeOf(did)


hdev = SetupDiGetClassDevs_(?GUID_DEVICE_BATTERY,0,0,0)
Debug "hdev: " +Str (hdev)
  Debug "GetLastError: " + Str(GetLastError_()) ;#ERROR_NO_MORE_ITEMS
For idev = 0 To 10 Step 1
 ; SetupDiEnumDeviceInterfaces(hdev,0,?GUID_DEVICE_BATTERY,0,@did)
  did\cbSize = SizeOf(did)
  ;did\InterfaceClassGuid = 0
  ;PokeQ(did\InterfaceClassGuid,0)
  ;PokeQ(did\InterfaceClassGuid+8,0)
  Debug "SetupDiEnumDeviceInterfaces: " + Str( SetupDiEnumDeviceInterfaces(hdev,0,?GUID_DEVICE_BATTERY,idev,@did) )
  Debug "cbSize: " + Str(did\cbSize)

  Debug "InterfaceClassGuid: " + Str(did\InterfaceClassGuid) + " : " + Str(PeekQ(did\InterfaceClassGuid)) + " : " + Str(PeekQ(8+did\InterfaceClassGuid))
  Debug "flags: " + Str(did\flags)
  Debug "GetLastError: " + Str(GetLastError_()) ;#ERROR_NO_MORE_ITEMS
Debug "-----"

Next idev

DataSection
GUID_DEVICE_BATTERY:
Data.l $72631E54
Data.w $78A4
Data.w $11D0
Data.b $BC, $F7, $00, $AA, $00, $B7, $B3, $2A
EndDataSection 
aber ich bekomme einfach nichts hin. ich erhalte nach dem ersten Aufruf, das keine weiteren Einträge vorhanden sind, dabei habe ich aber 2 Akkus im Notebook, auch beim ersten Eintrag schaffe ich es nicht irgendwelche Daten zu erkennen. Das einzige was ich erhalte, ist der Pointer auf die Strukture im Format GUID. Weil ich nicht genau weiß, wie man dies am besten anzeigt, lese ich die mit 2 Pokes aus. Aber der WErt ist NULL.

ich schaue mir bei MS gerade SetupDiEnumDeviceInterfaces etwas genauer an, aber noch immer weiß ich nicht, warum ich keine Daten zurück erhalte (die ich erkennen kann) und warum keine Weiteren Einträge vorhanden sind, obwohl 2 Akkus vorhanden sind.
Ach ja, wenn ich die Akkus rausnehme, kommt es zu gleichem Ergebnis. Da kann also was nicht stimmen. Für Tips bin ich weiterhin dankbar und sei es wo bzw. wie ich weitersuchen soll.



[17:44:34] hdev: 1335680
[17:44:34] GetLastError: 0
[17:44:34] SetupDiEnumDeviceInterfaces: 0
[17:44:34] cbSize: 28
[17:44:34] InterfaceClassGuid: 4303156 : 0 : 0
[17:44:34] flags: 0
[17:44:34] GetLastError: 259
[17:44:34] -----
[17:44:34] SetupDiEnumDeviceInterfaces: 0
[17:44:34] cbSize: 28
[17:44:34] InterfaceClassGuid: 4303156 : 0 : 0
[17:44:34] flags: 0
[17:44:34] GetLastError: 259
[17:44:34] -----
[17:44:34] SetupDiEnumDeviceInterfaces: 0
[17:44:34] cbSize: 28
[17:44:34] InterfaceClassGuid: 4303156 : 0 : 0
[17:44:34] flags: 0
[17:44:34] GetLastError: 259
[17:44:34] -----
[17:44:34] SetupDiEnumDeviceInterfaces: 0
[17:44:34] cbSize: 28
[17:44:34] InterfaceClassGuid: 4303156 : 0 : 0
[17:44:34] flags: 0
[17:44:34] GetLastError: 259
[17:44:34] -----
[17:44:34] SetupDiEnumDeviceInterfaces: 0
[17:44:34] cbSize: 28
[17:44:34] InterfaceClassGuid: 4303156 : 0 : 0
[17:44:34] flags: 0
[17:44:34] GetLastError: 259
[17:44:34] -----
[17:44:34] SetupDiEnumDeviceInterfaces: 0
[17:44:34] cbSize: 28
[17:44:34] InterfaceClassGuid: 4303156 : 0 : 0
[17:44:34] flags: 0
[17:44:34] GetLastError: 259
[17:44:34] -----
[17:44:34] SetupDiEnumDeviceInterfaces: 0
[17:44:34] cbSize: 28
[17:44:34] InterfaceClassGuid: 4303156 : 0 : 0
[17:44:34] flags: 0
[17:44:34] GetLastError: 259
[17:44:34] -----
[17:44:34] SetupDiEnumDeviceInterfaces: 0
[17:44:34] cbSize: 28
[17:44:34] InterfaceClassGuid: 4303156 : 0 : 0
[17:44:34] flags: 0
[17:44:34] GetLastError: 259
[17:44:34] -----
[17:44:34] SetupDiEnumDeviceInterfaces: 0
[17:44:34] cbSize: 28
[17:44:34] InterfaceClassGuid: 4303156 : 0 : 0
[17:44:34] flags: 0
[17:44:34] GetLastError: 259
[17:44:34] -----
[17:44:34] SetupDiEnumDeviceInterfaces: 0
[17:44:34] cbSize: 28
[17:44:34] InterfaceClassGuid: 4303156 : 0 : 0
[17:44:34] flags: 0
[17:44:34] GetLastError: 259
[17:44:34] -----
[17:44:34] SetupDiEnumDeviceInterfaces: 0
[17:44:34] cbSize: 28
[17:44:34] InterfaceClassGuid: 4303156 : 0 : 0
[17:44:34] flags: 0
[17:44:34] GetLastError: 259
[17:44:34] -----
[edit]Ich habe festgestellt über google, das oft oder immer der Hexwert 0x72631e54L mit L am Ende geschrieben wird. Was bedeutet das, das ist doch kein Hexwert. Liegt hier der Fehler? Edel hat das L ja "aus meiner sich korrekter Weise" weggelassen.[/edit]
1. Win10
PB6.1
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag von Toshy »

Ich muß jetzt gleich erstmal weg ohne dann Internet zu haben, obwohl ich gerade richtig auf hochtouren bin.
Ich glaube ich weiß jetzt woran es liegen könnte.

hdev = SetupDiGetClassDevs_(?GUID_DEVICE_BATTERY,0,0,#DIGCF_PRESENT | #DIGCF_DEVICEINTERFACE)

Man muß wohl einfach diese beiden Konstanten angeben. Das was ich dazu noch unbedingt wissen muß, wie muß ich die verbinden? mit "&" oder gibt oder mit dem obigen reinkopierten Zeichen (müßte OR sein).
1. Win10
PB6.1
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag von Toshy »

ich bin nun etwas weiter gekommen, aber jetzt stecke ich doch fest.
von der Seite
http://msdn2.microsoft.com/en-us/library/bb204769.aspx
bekomme ich vor allem den Teil
PSP_DEVICE_INTERFACE_DETAIL_DATA pdidd =
(PSP_DEVICE_INTERFACE_DETAIL_DATA)LocalAlloc(LPTR,
cbRequired);
if (pdidd)
{
pdidd->cbSize = sizeof(*pdidd);
if (SetupDiGetDeviceInterfaceDetail(hdev,
&did,
pdidd,
cbRequired,
&cbRequired,
0))
nicht umgesetzt.
U.a. die Struktur SP_DEVICE_INTERFACE_DETAIL_DATA macht mir Schwierigkeiten. Ich muß pdidd erstellen, eine Struktur mit "cbSize" und "devicePath", aber wie muß ich "devicePath" einbauen, als String oder Char(array)? Unter
http://msdn2.microsoft.com/en-us/library/aa363463.aspx
steht, das DevicePath ein Null-terminierter String ist, schaut man unter
http://msdn2.microsoft.com/en-us/library/aa363455.aspx
dann sieht man, das unter "DeviceInterfaceDetailData" das es da einmal den fixen Teil und einen variablen gibt und unter "DeviceInterfaceDetailDataSize" das diese Längenangaben übergeben werden sollen. Irgendwie habe ich jetzt stundenlang gelesen, gebastelt, aber es klappt nicht richtig. ich bekommen im besten falle nur die Meldung "#error_invalid_user_buffer".
Auf Grund von deiner Hilfe -edel- habe ich mich mal etwas die Prototypes angeschaut und etliches auf der MS-Seite durchgearbeitet (und bei meinem fast nicht vorhanden Englisch ist das echte Schwerstarbeit). Bin daher auch weiter gekommen, nur hier weiß ich entweder nicht wie das gemeint ist oder kann einfach PB hier noch nicht gut genug.

Code: Alles auswählen

snip
 Structure SP_DEVICE_INTERFACE_DETAIL_DATA
    cbSize.l
    DevicePath.s[1] ;oder.c , auch in größeren längen (anysize bei MS angegeben)
  EndStructure

snip
in der Art von:

    *pdidd.SP_DEVICE_INTERFACE_DETAIL_DATA = AllocateMemory(8+cbRequired)
        *pdidd\cbSize = SizeOf(*pdidd\cbSize) +  SizeOf(*pdidd\DevicePath)
;sizeof(*pdidd) geht ja leider nicht

snip
   ReturnSetupDiGetDeviceInterfaceDetail =  SetupDiGetDeviceInterfaceDetail(hdev,@ll_did(),@*pdidd,cbRequired,@cbRequired,0)
          ReturnGetLastErrorSetupDiGetDeviceInterfaceDetail = GetLastError_()
1. Win10
PB6.1
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

>>

Code: Alles auswählen

DevicePath.s[1] ;oder.c , auch in größeren längen (anysize bei MS angegeben) 
Wohl eher:

Code: Alles auswählen

DevicePath.s{1}
anysize wohl eher:

Code: Alles auswählen

DevicePath.c[0]
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten