Ondřej Linhart

Vývojářský blog Ondřeje Linharta



Podle kategorie

Nástroj pro sledování stavu nabití baterie

Ondřej Linhart       11.01.2012       VB.NET       10973 zobrazení

Opět jsem měl trochu volného času a tak jsem se rozhodl napsat aplikaci, která by sledovala stav nabití baterie u notebooků nebo tabletů a zapisovala jej do protokolu. Bylo to hlavně z důvodu, že jsem chtěl znát přesnou výdrž baterie při běžném provozu v různých profilech napájení (Rovnováha, Úsporný režim) u mého tabletu Acer ICONIA TAB W500. Aplikace samozřejmě funguje i na jakémkoliv jiném tabletu nebo notebooku se systémem Windows.

Původně jsem jako cílové úložiště událostí zvažoval soubor CSV uložený ve složce s přístupem pro zápis pro všechny uživatele, ale nakonec jsem zvolil mnohem lepší protokol událostí systému Windows, který umožňuje události filtrovat, exportovat do běžných formátů a prohlížet na vzdáleném počítači. Už od začátku bylo jasné, že aplikace musí být řešena jako služba z důvodu běhu i bez přihlášeného uživatele.

Během vývoje jsem narazil na mnoho nečekaných problémů, kromě nepohodlného ladění, které jsem vyřešil takto to byly hlavně potíže s účtem pro přihlášení služby. Většině služeb by měl stačit účet LocalService s omezeným oprávněním, ale během ladění služby docházelo k tolika bezpečnostním vyjímkám, jejichž původ se mi nechtělo řešit, že jsem nakonec zvolil bezproblémový LocalSystem. Další problém, se kterým jsem strávil dost času byl fakt, že pro příjem událostí ohledně napájení a řízení spotřeby je nutné, aby v aplikaci běžela smyčka zpráv, kterou služby standardně nemají. Podle MSDN se to dá řešit výběrem účtu LocalSystem (Místní systémový účet) a zaškrtnutím možnosti Povolit službě používání plochy, jenže v takovém případě se při vzniku události vždy zobrazí systémově modální dialogové okno s potvrzením interakce služby, což samozřejmě nepřipadá v úvahu. Zkusil jsem tedy spustit smyčku zpráv ručně pomocí Application.Run bez parametru s oknem, což opět nevedlo k žádnému výsledku (události prostě nenastávaly, přičemž stejný kód ve Windows Forms aplikaci fungoval bez problémů). Nakonec bylo nutné podle příkladu na MSDN vytvořit “dummy” prázdné okno, do kterého jsem umístil samotný kód pro sledování a zápis do protokolu událostí a také se přímo v něm napojují obslužné metody na systémové události. Samotný Framework má v sobě třídy a události týkající se napájení (Microsoft.Win32.SystemEvents.PowerModeChanged), ale použil jsem raději Windows API Code Pack, který má v tomto směru daleko větší možnosti (např. vyvolání události při změně schématu napájení).

Služba je velmi jednoduchá a funguje tak, že se do protokolu zapíše událost vždy když: Napájení ze sítě je odpojeno nebo připojeno, dojde ke změně schématu napájení, baterie je plně nabita, baterie dosáhla kritické hodnoty nabití (kritická hodnota nabití baterie v procentech je nastavitelná v konfiguračním souboru), nebo byl počítač převeden/probuzen z/do režimu spánku. Z výsledných záznamů v protokolu událostí se pak dá velmi snadno vypočítat přesná výdrž baterie v různých režimech.

Aplikaci včetně zdrojového kódu můžete stahovat zde, instalace a odinstalace služby se provádí dávkovými soubory Install.cmd (který zároveň spustí službu) a Uninstall.cmd (který v případě potřeby zastaví službu) ve složce Release. V projektu pochopitelně nedistribuji svůj podepisovací klíč Ondřej Linhart.snk, takže proveďte příslušné změny, pokud budete chtít zkompilovat sami.

BatteryLifeMonitor

 

hodnocení článku

0       Hodnotit mohou jen registrované uživatelé.

 

Nový příspěvek

 

                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback