<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>der Ende des Internets &#187; Timer</title>
	<atom:link href="http://endedesinter.net/tag/timer/feed/" rel="self" type="application/rss+xml" />
	<link>http://endedesinter.net</link>
	<description></description>
	<lastBuildDate>Sun, 11 Jul 2010 11:05:46 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>3&#8230;2&#8230;1&#8230;</title>
		<link>http://endedesinter.net/2009/321-90/</link>
		<comments>http://endedesinter.net/2009/321-90/#comments</comments>
		<pubDate>Sun, 01 Mar 2009 12:06:48 +0000</pubDate>
		<dc:creator>Maddin</dc:creator>
				<category><![CDATA[Technik]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[HTC Touch Diamond]]></category>
		<category><![CDATA[Ideen]]></category>
		<category><![CDATA[Pocket PC]]></category>
		<category><![CDATA[Smart Phone]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[System Power States]]></category>
		<category><![CDATA[Timer]]></category>
		<category><![CDATA[Windows Mobile]]></category>

		<guid isPermaLink="false">http://endedesinter.net/?p=90</guid>
		<description><![CDATA[Hallo zusammen!
Nein, ich habe keineswegs die Absicht den Werbeslogan eines gewissen Online-
Auktionshauses zu kopieren. Der Titel hat rein praktische Bedeutung und bezieht sich auf meine neueste Spielerei mit dem Windows Mobile 6 Professional SDK.
Es handelt sich dabei um einen kleinen Timer. Bevor jetzt einige vor Erstaunen gleich vom Bürostuhl fallen, möchte ich doch kurz die [...]]]></description>
			<content:encoded><![CDATA[<p>Hallo zusammen!</p>
<p>Nein, ich habe keineswegs die Absicht den Werbeslogan eines gewissen Online-</p>
<div id="attachment_55" class="wp-caption alignright" style="width: 160px"><img class="size-thumbnail wp-image-55" title="Windows Mobile Logo" src="http://endedesinter.net/wp-content/uploads/2009/02/wm6_logo-150x150.png" alt="Windows Mobile Logo" width="150" height="150" /><p class="wp-caption-text">Windows Mobile Logo</p></div>
<p>Auktionshauses zu kopieren. Der Titel hat rein praktische Bedeutung und bezieht sich auf meine neueste Spielerei mit dem Windows Mobile 6 Professional SDK.</p>
<p>Es handelt sich dabei um einen kleinen Timer. Bevor jetzt einige vor Erstaunen gleich vom Bürostuhl fallen, möchte ich doch kurz die Hintergründe erläutern.</p>
<p>Mein HTC Touch Diamond besitzt alle möglichen Spielereien und Tools, die das mobile Leben leichter machen sollen. Jedoch ein simpler Timer, z.B. um mich zu erinnern, wann der Tee fertig gezogen ist oder ein Teig genügend geruht hat, den gibt es nicht. <span id="more-90"></span>Natürlich brauch man nur die entsprechenden Schlagworte bei Google eintippen und findet entsprechende Timer kostenlos zum Download. Aber zum Einen dachte ich mir: &#8220;Hey, so schwer kann das net sein!&#8221; und zum Anderen stellte es genau die richtige Schwierigkeitsstufe für einen weiteren Schritt beim Erkunden der Windows Mobile Programmierung dar. Ein dritter Grund ist der, dass der einfache Timer nur die Grundlage für ein recht nützliches Tool sein soll, das schonmal alle wichtigen Schlüsseltechniken besitzt.</p>
<p>So, was hab ich nun getan? Zunächst einmal galt es eine einfache und übersichtliche GUI zu erstellen. Mit Microsoft Visual Studio 2008 war auch gar kein Problem. Die grundlegenden Eventhandlings für die einzelnen Menüpunkte stellte auch keine große Schwierigkeit dar. Der Timer bietet die Möglichkeit eine Zeit einzustellen, auszuwählen, ob man nach deren Ablauf per Vibration oder Klingeln erinnert werden möchte, sowie eine Resetfunktion.</p>
<p>Doch betrachten wir mal die Kernfunktion. Die eingestellte Zeit soll sekundenweise herunterzählen, bis man bei 00:00:00 angelangt ist. Demnach benötigt man ein Ereignis, das im Intervall von einer Sekunde auftritt. Das .NET-Framework bietet dazu die Klasse System.Windows.Forms.Timer, deren Instanzen mit einer Intervalllänge konfiguriert werden können. Sobald eine Timer-Instanz in den Zustand &#8220;Enabled&#8221; gesetzt wurde, wird immer im konfigurierten Intervall ein entsprechendes Event gefeuert. Den Eventhandler, der dieses Ereignis behandeln soll, kann man bei der Konfiguration angeben.</p>
<div id="attachment_105" class="wp-caption aligncenter" style="width: 203px"><img class="size-medium wp-image-105" title="Zeiteinstellung beim Timer" src="http://endedesinter.net/wp-content/uploads/2009/02/timeset-193x300.png" alt="Zeiteinstellung beim Timer" width="193" height="300" /><p class="wp-caption-text">Zeiteinstellung beim Timer</p></div>
<p>Damit ist schonmal das erste Grundproblem gelöst, denn nun kann man den eingegebenen Wert in eine Menge von Sekunden umrechnen und diesen im Eventhandler der Timer-Instanz dekrementieren. Wenn er den Wert 0 erreicht, soll dann eine Vibration oder ein Sound ausgelöst werden. Doch da ergibt sich das nächste Problem: Wie?</p>
<p>Das Thema Sound hatte sich relativ schnell erübrigt, da es passende Beispiele im Internet gibt. Ich habe eine separate Sound-Klasse nach <a title="Ein Beispiel zum Abspielen von Sounds auf Windows Mobile Geräten" href="http://globetech.wordpress.com/2007/12/09/playing-sounds-in-windows-mobile/" target="_blank">diesem Beispiel</a> erstellt. Diese greift direkt über DLL-Import auf die CoreDLL zu. Nach außen (zu meinem SimpleTimer) bietet sie eine einfache Schnittstelle, der man den Dateinamen übergeben kann. Schwieriger war die Handhabung der Vibration. Hierbei kam ich nach einem Studium entsprechender Blogeinträge zu dem Schluss, dass ich mich eines zusätzlichen SDKs bedienen sollte.</p>
<p>Das <a title="OpenNETCF-Homepage" href="http://www.opennetcf.com/" target="_blank">OpenNETCF SDK</a> bietet für derartige Bedürfnisse eine weitere umfangreiche Klassenbibliothek. Die entsprechende Bibliothek muss in Visual Studio verständlicherweise in die References hinzugefügt werden, damit die entsprechenden dll-Dateien beim Release mit in den Ordner gepackt werden. Allerdings hatte ich nun das Problem, dass ich verschiedene Beispiele fand. Zum Einen benutzte man die Vibrate-Klasse unter OpenNETCF.WindowsMobile. Dies probierte ich auch zunächst aus. Der Erfolg blieb aus. Ein <a title="Hilfreiches Beispiel zur Ansteuerung der Vibration" href="http://weimenglee.blogspot.com/2007_01_01_archive.html" target="_blank">anderes Beispiel</a> nutze eine virtuelle Notification-LED. In Klassen ausgedrückt heißt das: OpenNETCF.WindowsCE.Notification.Led</p>
<p>Mit einer Instanz dieser Klasse konnte ich über vier simple Zeilen meine Vibration auslösen und stoppen.</p>
<blockquote><p>OpenNETCF.WindowsCE.Notification.Led vibra = new OpenNETCF.WindowsCE.Notification.Led();<br />
vibra.SetLedStatus(1, OpenNETCF.WindowsCE.Notification.Led.LedState.Blink);<br />
System.Threading.Thread.Sleep(1000);<br />
vibra.SetLedStatus(1, OpenNETCF.WindowsCE.Notification.Led.LedState.Off);</p></blockquote>
<p>Hierbei sei angemerkt, dass die 1 die ID der LED darstellt. Gegebenenfalls muss man etwas probieren, bis man die richtige LED ermittelt hat.</p>
<div id="attachment_106" class="wp-caption aligncenter" style="width: 204px"><img class="size-medium wp-image-106" title="Menüstruktur des Timers" src="http://endedesinter.net/wp-content/uploads/2009/03/menstruk-194x300.png" alt="Menüstruktur des Timers" width="194" height="300" /><p class="wp-caption-text">Menüstruktur des Timers</p></div>
<p>Mit diesem  scheinbar fertigen Timer machte ich nun einen Praxistest. Ich habe Nudeln gekocht und die angegebene Kochzeit eingestellt. Als mein Handy noch ca. 5 verbleibende Minuten (von ursprünglich 10) anzeigte, war meine Pasta aber schon Al-Dente. Das machte mich etwas stutzig. Eingehende Tests (natürlich nach dem Essen) brachten die Erkenntnis: sobald sich das Handydisplay ausschaltet, wechselt das Handy in eine Art Ruhezustand, die Berechnung des Timers stoppt.</p>
<p>Am Abend des selben Tages habe ich mich nun eingehend mit den System Power States unter Windows Mobile 6 Professional beschäftigt. Dank der <a title="MSDN Library" href="http://msdn.microsoft.com/en-us/library/default.aspx" target="_blank">MSDN Library</a> fand ich auch die passenden Informationen. Der Übeltäter nannte sich &#8220;Suspended State&#8221;. Ein Systemzustand, in dem keine Threads laufen. Dank der übersichtlichen Zustandstabelle fand ich dann auch den Zustand, den ich brauchte: &#8220;Unattended State&#8221;. Dieser ist für Threads die Berechnungen durchführen, die keine direkte Userinteraktion erfordern. Ähnlich der Sound-Klasse hab ich mir eine PowerManager Klasse geschrieben, die mir die nötige Schnittstelle in die CoreDLL bietet. Dies funktionierte auch ganz gut, wenn nicht dann trotzdem irgendwann das Handy im Suspended State gelandet wäre. Ich schaute nun nochmal in die <a title="Übersicht über Power States und Transitions" href="http://msdn.microsoft.com/en-us/library/aa929251.aspx" target="_blank">&#8220;State Transition&#8221;</a>-Tabelle. Der SystemIdle Timeout war schuld, dass mein Timer dennoch stoppte. Doch eine Zeile darunter war die Lösung auf dem Silbertablett: Mittels SystemIdleTimerReset kann man diesen Timeout verhindern.</p>
<p>Somit habe ich in meinen PowerManager eine weitere Funktion eingefügt, die diesen Reset ausführt. Diese Funktion wird von meinem EventHandler der Timer-Instanz alle 30 Sekunden aufgerufen. Nun läuft der Timer problemlos auf 0 herunter. Das Display schaltet sich dabei aber auch nicht mehr vollständig ab, sondern reduziert nur das Backlight auf ein Minimum.</p>
<p><object width="425" height="344" data="http://www.youtube.com/v/8MWJCyM1FQA&amp;hl=de&amp;fs=1" type="application/x-shockwave-flash"><param name="src" value="http://www.youtube.com/v/8MWJCyM1FQA&amp;hl=de&amp;fs=1" /><param name="allowfullscreen" value="true" /></object></p>
<p>Nun gibt&#8217;s hier im Blog eine Software-Sektion ähnlich <a title="Sourcewalker.Net Software-Bereich" href="http://sourcewalker.net/software/" target="_blank">dieser</a> einfüge, wo ihr euch dann auch direkt den Timer als Quellcode herunterladen könnt. Oben am rechten Rand findet ihr den Link &#8220;<a title="Software Sektion von endedesinter.net" href="http://endedesinter.net/software/" target="_self">Software</a>&#8220;.</p>
]]></content:encoded>
			<wfw:commentRss>http://endedesinter.net/2009/321-90/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

