domenica 17 ottobre 2010

System Meter Chart – .Net Micro Framework

Finalmente in questi giorni di “festa” sono riuscito a trovare qualche ora di calma da famiglia, figlie, clienti, rogne, ecc. per effettuare il porting del controllo System Meter Chart da .NET Compact Framework (CF) a .NET Micro Framework (MF). Questa è stata una buona occasione per “toccare con mano” le diversità tra i due ambienti per quello che riguarda la progettazione di user control. Il .NET MF supporta una versione ridotta (molto) di WPF e la gestione / progettazione dei controlli ovviamente è diversa tra i due ambienti. Nel caso specifico (.NET MF) ho implementato un Control (UIElement) che si espone come oggetto WPF. 

 

Nelle applicazioni MF con presentation esistono due thread, il primo creato del programma per la gestione degli I/O, periferiche, ecc. mentre il secondo è creato ed utilizzato internamente dal CLR per le varie operazioni di UI (ridisegno degli elementi di UI come i controlli, le finestre, ecc.). Questo secondo thread è chiamato anche Dispatcher e il suo scopo è quello di accedere in modo “sicuro” ai vari elementi della UI. Per maggiori informazioni vi consiglio di leggere 'Using the Dispatcher’.

L’esempio di utilizzo del controllo usa un timer per l’assegnazione di valori random da 0 a 100. Essendo il timer asincrono rispetto all’interfaccia utente, per le operazioni di invalidate interne del controllo, è necessario chiamare BeginInvoke  per far si che il controllo grafico sia acceduto dal thread principale. La scelta di BeginInvoke è preferibile rispetto a Invoke così da poter liberare il thread del timer al più presto senza attendere il termine dell’esecuzione del gestore dell’evento.

L’esempio utilizza i 5 tasti presenti nell’emulatore del .NET MF, in dettaglio:

  • Tasto Up abilita la visualizzazione in “Stick Mode”
  • Tasto Down abilita la visualizzazione in “Line Mode”
  • Tasto Left abilita la visualizzazione in “NoGrid”
  • Tasto Right abilita la visualizzazione in “Grid”
  • Tasto Select abilita / disablita la visualizzazione del Gradient

Di seguito riporto alcune immagini delle modalità supportate dal controllo

 

Non nego che sono sempre più entusiasta del MF, penso solo a quanto codice avrei dovuto scrivere per realizzare lo stesso controllo su un’altra tipo di scheda non MF magari con un compilatore C++ proprietario. Seconda osservazione, la portabilità del codice da una piattaforma MF all’altra, infatti nell’esempio non ho utilizzato nulla di proprietario della mia scheda GHI ma solo chimate “standard” del MF 3.0. Come ultimo punto vorrei rimarcare l’integrazione del MF con Visual Studio,  si riesce a sviluppare ed eseguire il debugging dell’applicazione sia con l’emulatore che direttamente sulla scheda collegata via USB. Questo permette l’analisi sotto debugger di scenari che difficilmente sarebbero ripetibili tramite un emulatore e con una serie di comodità come solo i progammatori di Visual Studio sono abituati.  Ovviamente le schede che supportano MF non sono schede su cui la battaglia si gioca sui centesimi ma quello che da a disposizione MF ripaga anche il relativo costo.

In questo link potete scaricare lo zip dei sorgenti del programma di esempio.