in

UgiMobile.org

Il primo User Group Italiano dedicato a Windows Mobile

Mirco Vanini

Embedded life tips
  • .NET MF moves to Developer Division

    Dopo aver letto alcuni articoli che paventavano la dismissione del .NET MF o quanto meno il suo disinpegno su questo fronte (Microsoft to turn .Net Micro Framework code, support over to the community) è uscita la risposta sul blog del team di .NET MF (.NET MF moves to Developer Division  - .NET Micro Framework evolution). Vale la pena dargli una letta per chiarirsi le idee :)

  • Virtual Meeting: .NET Micro Framework – Materiale

    Volevo ringraziare tutti i partecipanti che hanno seguito il virtual meeting. Un ringraziamento speciale va ad XeDotNet, Andrea Boschin e Andrea Dottor per l’opportunità e per il supporto che mi hanno dato per la realizzazione dell’evento.

    Di seguito riporto i links del materiale (slide, demo, replay evento, ecc.) dell’evento:

    Slide

    Demo

    AdvanceEmulator

    Replay Evento

  • Virtual Meeting: .NET Micro Framework – Cambio data

    A causa di problemi organizzativi siamo costretti a spostare di alcuni giorni l'evento

    La nuova data sarà: Lunedì 04/05/2009 alle 21:30 (stessa ora)

    Scusandoci per l'inconveniente vi invitiamo a cancellare la vostra iscrizione sulla pagina dell'evento

    qualora non siate più in grado di partecipare nella nuova data.

     

    04 Maggio 2009 - Ore 21:30 - Virtual Meeting: .NET Micro Framework
    Speaker: Mirco Vanini
    Luogo: Live Meeting Online

  • Virtual Meeting: .NET Micro Framework

    Quasi ci siamo! Sto finendo di preparare il materiale per la prima sessione virtuale che terrò con Xe.Net che avrà come argomento “.NET Micro Framework”. Personalmente credo molto in questo nuovo modo di approcciare la programmazione sui microcontrollori. Di certo non è la panacea che risolve tutti i problemi ma sicuramente apre scenari difficilmente pensabili sino a qualche tempo fà. Comunque chi fosse interessato sono aperte le iscrizioni, queste sono le coordinate:

    30 Aprile 2009 - Ore 21:30 - Virtual Meeting: .NET Micro Framework
    Speaker: Mirco Vanini
    Luogo: Live Meeting Online

  • GDI – Leak – WinCE – C#

    Suona strano avere dei memory leak in codice gestito ma sono molto più frequenti di quello che si possa pensare. Alcune settimane fà ho tenuto una sessione di code review presso un mio cliente e ho speso alcuni giorni a sistemare diversi memory leak su una programma scritto in C# per Windows CE.

    Quello che bisogna tenere a mente che tutti gli oggetti GDI (Bitmap, Font, Brush, Pen, ecc.) di C# in realtà sono dei wrapper sopra oggetti Win32. Tali oggetti sono referenziati tramite Handle e devono essere rilasciati. Il GC non lo fà per voi in modo automatico perchè semplicemente non li può gestire. Sopratutto nelle applicazioni mobile, in cui le risorse sono limitate, bisogna porre particolare attenzione a questo.

    Durante la sessione di debug ho utilizzato questo tool (GDIView) che mi ha aiutato a verificare quali handle non venivano rilasciati.

    Alcuni consigli pratici:

    • Richiamare sempre il Dispose di tutti gli oggetti grafici utilizzati, meglio ancora usare sempre la keword “using” per richiamare sempre in modo implicito il Dispose, esempio:
       1: SolidBrush fillBrush = new SolidBrush(Color.White);
       2: graphImage.FillRectangle(fillBrush, 0, 0, UI_CLIENT_WIDTH, UI_HEIGHT);
       3: fillBrush.Dispose();
       4:  
       5: // or
       6:  
       7: using(SolidBrush fillBrush = new SolidBrush(Color.White))
       8: {
       9:     graphImage.FillRectangle(fillBrush, 0, 0, UI_CLIENT_WIDTH, UI_HEIGHT);
      10: }
      11:  

     

    • Quando si riassegna una Bitmap assicurarsi che l’oggetto precedente sia deallocato, esempio:
       1: // wrong
       2: picCapture.Image = new Bitmap(32, 32);
       3:  
       4: // good
       5: if(picCapture.Image != null)
       6:     picCapture.Image.Dispose();
       7: picCapture.Image = new Bitmap(32, 32);

     

    • Quando si utilizza una Image contenuta in una ImageList è bene ricordare quanto esposto su MSDN: “The returned bitmap is a copy of the original image and should be disposed of using the Image.Dispose method.”. In altre parole tutte le get da una ImageList clonano una nuova immagine che deve essere rilasciata tramite un Dispose!
    • Quando si utilizzano direttamente le funzioni native Win32 porre attenzione se queste ritornano una nuova istanza di una risorsa in memoria. Leggere attentamente la loro documentazione!
    • Ogni volta che si alloca memoria tramite funzioni native Win32 è vostra responsabilità deallocarla.
    • Quando si crea un nuovo oggetto non gestito, salvare il riferimento (handle) in una variabile non accessibile dall’esterno. Se per qualsiasi motivo il riferimento viene sovrascritto non sarà più possibile deallocare correttamente la risorsa non gestita.
  • System Meter Chart – .Net Micro Framework

    Finalmente in questi giorni di “festa” sono riuscito a trovare qualche ora di calma da famiglia, figli, 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.

  • Community Meeting - .NET Compact Framework - Slide e Demo

    Anche se in ritardo ho messo in linea il materiale del community meeting del 04.12.2008. Qui potete scaricare sia le slide che le demo

  • DLL - Import

    Se dovete collegare codice nativo e/o Win32 API a C# / VB.NET consiglio vivamente questo sito.

  • ActiveSync - GuestOnly

    Chi collega e scollega device tutto il giorno al proprio PC, si sarà chiesto se vi è la possibilità di disattivare la richiesta di creazione relazione da parte di ActiveSync. Sicuramente l'impostazione di relazione va bene per sincronizzare mail, appuntamenti, ecc. ma non sicuramente per le sessioni di debug.

    Ecco allora la chiave del registry da modificare:

    [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows CE Services]
    "GuestOnly"=dword:1

    Ovviamente per ripristinare la richiesta di relazione basta impostare "GuestOnly a 0 (zero)

  • Community Meeting - .NET Compact Framework

    Volevo ringraziare tutti i partecipanti, Xe.Net ed 1nn0va per l'opportunità che mi hanno concesso. A breve metterò in linea il materiale del meeting.

    Come sempre un ringraziamento "speciale" ad Andrea Boschin per il supporto materiale e morale.

  • XE.NET: Community Meeting - .NET Compact Framework

    Giovedì 4 dicembre, presso l'università di Pordenone, in Via Prasecco 3/A, si terrà il community meeting su .NET Compact Framework. Durante l'incontro, dopo un'introduzione al .NET Compact Framework (filosofia del framework, limiti e vantaggi), verranno esplorati i nuovi tools di VS 2008 messi a disposizione. La presenzatazione poi continuerà con esempi reali, toccando i vari temi legati alle applicazioni mobile/embedded: accesso ottimizzato ai dati, integrazione con API di sistema, notifiche di sistema, accesso a web, ecc.

    Se siete interessati  potete visitare la pagina dedicata all'evento nel sito di XE.NET: informazioni; iscrizioni

  • System Meter Chart PDA

    Durante lo sviluppo di un progetto mi sono imbattuto nella necessità di realizzare un controllo per PDA che rapresentasse l'andamento di un valore nel tempo. Come "fonte di ispirazione" ho utilizzato la visualizzazione della "cronologia utilizzo CPU" del task manager.

    Dopo un pò di lavoro sono riuscito a "confezionare" un controllo che ne mima il comportamento. Ho esteso un pò il grafico prodotto permettendo la gestione dello stesso sia tramite line che stick.

    Il controllo utilizza un sistema di  "Double Buffering" con una bitmap offline in cui viene effettivamente disegnato il grafico. Questo ovviamente per evitare il flickering che inevitabilmente sarebbe comparso.

    Tutto questo perchè su .Net CF i controls non supportano il double buffer nativamente, per esempio in .Net è possibile attivarlo tramite il seguente codice:

       1: public void EnableDoubleBuffering()
       2: {
       3:    // Set the value of the double-buffering style bits to true.
       4:    this.SetStyle(ControlStyles.DoubleBuffer | 
       5:                  ControlStyles.UserPaint | 
       6:                  ControlStyles.AllPaintingInWmPaint,
       7:                  true);
       8:    this.UpdateStyles();
       9: }

    Di seguito riporto un print screen del programma demo e il link in cui trovare il medesimo.

     

    Sorgenti Progetto di esempio

    Buone "misurazioni" a tutti :)

  • .NET Micro Framework V3.0 RC0 !

    Il team di .Net Micro Framework ha annunciato la disponibilità della RC0 del nuovo SDK 3.0 scaricabile da Connect, di seguito riporto le novità saliente presenti nella RC0:

     

    • Supporto per VS 2008 SP1
    • Supporto per Visual C# Express edition!!!
    • File System (anche su emulatore!)
    • Miglioramenti significativi per quanto riguarda DPWS
    • Supporto per il WiFi (hw permettendo)
    • Ottimizzazione delle performance
    • Nuovi esempi e documentazione aggiornata

    Forse è la volta buona che butto via la mia Virtual Machine con VS2005 :)

  • AddHeader - ISAPI

    Durante lo sviluppo di una ISAPI filter mi è capitata la necessità di creare una variabile server IIS durante la gestione della notifica SF_NOTIFY_AUTHENTICATION.

    Peccato che in questa notifica il parametro pvNotification passato da IIS sia di tipo PHTTP_FILTER_AUTHENT e non vi sia il modo di recuperare la struttura di tipo PHTTP_FILTER_PREPROC_HEADERS che contiene il metodo AddHeader.

    Dopo un po' di tentativi ho percorso questa strada:

     

    1. Definisco i seguenti typedef e define

       1: #define MYISAPI_HEADER       "MYISAPI-HEADER:"
       2: #define HTTP_MYISAPI_HEADER    "HTTP_MYISAPI_HEADER"
       3:  
       4: typedef BOOL (WINAPI * PAddHeader) 
       5:               (
       6:                 struct _HTTP_FILTER_CONTEXT * pfc,
       7:                 LPSTR                         lpszName,
       8:                 LPSTR                         lpszValue
       9:               );

    2. Nella notifica SF_NOTIFY_PREPROC_HEADERS creo una variabile server che contiene l'indirizzo del metodo AddHeader come nel codice seguente

       1: TCHAR szTmp[256];
       2: sprintf_s(szTmp, sizeof(szTmp), "%08lx", ((PHTTP_FILTER_PREPROC_HEADERS)pvNotification)->AddHeader);
       3: if(((PHTTP_FILTER_PREPROC_HEADERS)pvNotification)->HttpStatus == 0)
       4: {
       5:     TCHAR szValue[256];
       6:     DWORD dwValue = sizeof(szValue);
       7:  
       8:     *szValue = 0;
       9:     ((PHTTP_FILTER_PREPROC_HEADERS)pvNotification)->GetHeader(pfc, MYISAPI_HEADER, szValue, &dwValue);
      10:  
      11:     if(*szValue == 0)
      12:         ((PHTTP_FILTER_PREPROC_HEADERS)pvNotification)->AddHeader(pfc, MYISAPI_HEADER, szTmp);
      13: }
      14: return(SF_STATUS_REQ_NEXT_NOTIFICATION);

    3. Nella notifica SF_NOTIFY_AUTHENTICATION utilizzo la variabile server creata precedentemente nella notifica SF_NOTIFY_PREPROC_HEADERS, eseguo il cast su il pointer a funzione definito nel typedef e la richiamo per impostare una nuova variabile server

       1: TCHAR szValue[256];
       2: DWORD dwValue = sizeof(szValue);
       3:  
       4: *szValue = 0;
       5: pfc->GetServerVariable(pfc, HTTP_MYISAPI_HEADER, szValue, &dwValue);
       6: if(*szValue != 0)
       7: {
       8:     try
       9:     {
      10:         PAddHeader pHeader = (PAddHeader)strtoul(szTmp, NULL, 16);
      11:         if(pHeader)
      12:            (pHeader)(pfc, MYISAPI_USER_ID_LDAP, W2A(pszUidLdap));    
      13:     }
      14:     catch(CException *e)
      15:     {
      16:         DumpException(e)
      17:         e->Delete();
      18:     }
      19: }

     

    Funziona :)

  • Expert .Net Micro Framework

    Dopo aver acquistato il kit di sviluppo GHI Electronics - Embedded Master Development System ho pensato bene di acquistare un libro dedicato al .NET Micro Framework. Devo dire che sul mercato non c'è tantissimo e alla fine ho deciso di acquistare il libro di Jens Kühner - Expert .Net Micro Framework. Devo dire la verità, sin dall'inizio mi è piaciuto.

    Essendo un amante dei libri cartacei ricevere un libro con copertina rigida, rilegato in modo che non si sfaldi dopo le seconda lettura e stampato su della carta di qualità discreta fa solo che piacere. Oltre all'impressione "estetica" e "fisica" devo dire che è un buon libro, strutturato bene, che prende per mano il lettore e lo porta ad esaminare le varie parti del .Net Micro FW.

    Si parte dalla genesi del Micro FW, ne descrive le varie parti costituenti e fà una rapida carellata sui kit di sviluppo attualmente disponibili. Questa è solo l'introduzione del libro, poi si passa alla "sostanza". Descrive in modo accurato la gestione delle varie porte hardware, il threading disponibile, la crittografia, la comunicazione via socket, per poi arrivare al DPWS (Device Profile for Web Service). Devo dire che forse è il capitolo che mi ha entusiasmato di più, anche se per poterlo utilizzare si deve scrivere un bel pò di codice.

    Si arriva poi alla gestione della localizzazione e sopratutto alla parte di gestione grafica e di user interface. Anche questo capito è degno di nota sopratutto per i semplici ma efficaci esempi riportati.

    Ultima parte ma non per questo meno importante è la gestione dell'emulazione hardware e dei relativi componenti. Ben scritta e documentata sopratutto negli esempi di implementazione di componenti per l'emulazione hardware.

    Che dire ? Sicuramente è un libro ben fatto ed indispensabile per chi vuole partire ed approffondire lo sviluppo con .Net Micro FW.

    Buona lettura a tutti

     

    Technorati Tag: ,
More Posts Next page »
Powered by Community Server (Commercial Edition), by Telligent Systems