lunedì 19 novembre 2012

Introducing .NETCF 3.9–Windows Embedded Compact 2013

Come anticipato nei post precedenti inizia a prendere forma e a delinearsi i contorni della nuova versione del .NETCF in uscita con la prossima release di Windows Embedded Compact. Questa versione deriva direttamente da quella attualmente distribuita su Windows Phone 7.5. I punti saliente di questa nuova versione sono:

  • Incremento generali delle prestazioni.
  • Nuovo Garbage collector: incremento significativo delle performance del GC.
  • Runtime multicore: supporto per dispositivi multicore con supporto completo per istruzioni ARM VFP.
  • Sharing Server, condivisione del codice runtime tra varie applicazioni con conseguente incremento di prestazione dello statup delle stesse applicazioni.
  • Miglioramento della gestione della memoria.
  • Supporto completo in VS2012.
  • Supporto completo per C++.
  • Debugging di applicazioni con Hyper-V
  • Piena compatibilità con .NETCF 3.5 a livello sorgente, non compilato!

La nuova release sarà disponibile con l’uscita di Windows Embedded Compact 2013 con il relativo SDK integrato in VS2012.

L’articolo originale lo potete trovare in questo link.

giovedì 15 novembre 2012

Windows Embedded Compact v.Next uncovered

Finalmente iniziano ad arrivare notizie ufficiali sul prossimo rilascio! Prima di tutto il nome ufficiale sarà Windows Embedded Compact 2013. Il supporto per VS2012 sarà completo, dall’ambiente di sviluppo, con i relativi tools, sino al Platform Builder. Questo comporta di non avere più versioni diverse di VS installate sulla PC per lo sviluppo embedded e non.

Assieme a questo arriverà una nuova versione del CRT con il pieno supporto per l’auto-parallelizzazione del codice e l’auto-vettorizzazione, sempre se il processore dispone di registri FP. Altro punto saliente è l’introduzione di molte delle funzionalità disponibili con il nuovo standard C++11.

Per quanto riguarda il .NET CF sarà aggiornato alla versione 3.9. Punti salienti di questa versione sono il notevole miglioramento  delle prestazioni generali, nonché l'allocazione di memoria e la sua gestione con la rivisitazione completa del GC. L'occupazione di memoria del runtime è stata ridotta tramite la nuova funzione di “sharing server” che permette di riutilizzare il codice caricato del runtime tra applicazioni diverse. Altra novità rilevante del runtime è il supporto del multi-core con il conseguente incremento di velocità.  

L’articolo originale è disponibile in questo link.

Se volete avere un’idea anche della road map dei prossimi rilasci questo è il link

Che dire, dopo anni di attesa forse hanno capito che il segmento embedded e soprattutto la parte compact merita una considerazione diversa!

lunedì 12 novembre 2012

Diplay CP7–WPF Touch Screen Manager

In queste ultime settimane ho iniziato il porting di un applicativo sviluppato su .NETMF verso .NET Gadgeteer. Oltre al cambi del HW con le inevitabili modifiche, al cambio delle librerie utilizzate, ecc. mi sono imbattuto in alcune problematiche relative all’utilizzo del display CP7. In dettaglio il driver del display, fornito con il relativo modulo Gadgeteer, non si integra minimamente con gli eventi WPF ma fornisce, in modo abbastanza raw, le varie funzionalità di touch. Il codice che sto convertendo ha una parte di interfaccia U,I scritta utilizzando il FW WPF del .NETMF, abbastanza corposa e ovviamente utilizza gli eventi di touch dei singoli controlli. A questo punto le possibilità sono due, riscrivere la parte di UI, magari utilizzando la libreria Glide, o scrivere un manager che catturi gli eventi del touch del display convertendoli in eventi gestibili da WPF e dai relativi controlli. Ovviamente ho scelto la seconda strada. Dopo alcune ore, spese a decompilare con dotpeek sial il driver del display ma soprattutto la parte di tinycore del .NETMF ho trovato la soluzione. Tutto ruota attorno alla classe TouchEventArgs. Di seguito riporto lo spezzone del codice saliente del manager che ho implementato.

private void OnDisplayScreenPressed(Display_CP7 sender, Display_CP7.TouchStatus touchStatus)
{
    try
    {
        if (_isTouchValid || SkipAllEvent)
            return;
 
        if (touchStatus.numTouches > 0)
        {
            _isTouchValid = true;
 
            int len = 0;
            for (int i = 0; i < touchStatus.touchPos.Length; i++)
                len += touchStatus.touchPos[i].bActive ? 1 : 0;
 
            _touchInputs = new TouchInput[len];
 
            for (int i = 0, idx = 0; i < touchStatus.touchPos.Length; i++)
            {
                if (!touchStatus.touchPos[i].bActive)
                    continue;
 
                _touchInputs[idx++] = new TouchInput()
                                            {
                                                X = touchStatus.touchPos[i].xPos,
                                                Y = touchStatus.touchPos[i].yPos
                                            };
 
                if (touchStatus.touchPos[i].bActive)
                {
                    _touchX = touchStatus.touchPos[i].xPos;
                    _touchY = touchStatus.touchPos[i].yPos;
                }
            }
 
            var control = _display.WPFWindow.ChildElementFromPoint((int)_touchX, (int)_touchY);
 
            if (control != null && control.IsVisible && control.IsEnabled)
            {
                var arg = new Microsoft.SPOT.Input.TouchEventArgs(null, DateTime.Now, _touchInputs);
 
                arg.RoutedEvent = TouchEvents.TouchDownEvent;
                control.RaiseEvent(arg);
            }
        }
        else
        {
            _isTouchValid = false;
        }
    }
    catch (Exception ex)
    {
        Debug.Print(ex.ToString());
    }
}

Il metodo riporta la gestione dell'evento di pressed del display. Nel metodo sono verificati i punti di touch, viene ricercato il controllo su cui è stato toccato il display e viene così costruito l’oggetto TouchEventArgs. Il tutto poi viene sparato come evento al controllo precedentemente ricercato tramite la RaiseEvent.




private void OnDisplayScreenReleased(Display_CP7 sender)
{
    try
    {
        if (!_isTouchValid || SkipAllEvent)
            return;
 
        _isTouchValid = false;
 
        var control = _display.WPFWindow.ChildElementFromPoint((int)_touchX, (int)_touchY);
 
        if (control != null && control.IsVisible && control.IsEnabled)
        {
            var arg = new Microsoft.SPOT.Input.TouchEventArgs(null, DateTime.Now, _touchInputs);
            arg.RoutedEvent = TouchEvents.TouchUpEvent;
            control.RaiseEvent(arg);
        }
    }
    catch (Exception ex)
    {
        Debug.Print(ex.ToString());
    }
}


La stessa cosa viene fatto anche nell’evento di release del display, ovviamente sempre ricercado il controllo su cui si rilascia il tocco dal display.


In questo link potete trovare l’intero esempio basato su una FEZ Hydra e relativo display CP7. Alla fine, con qualche ora di lavoro, sono riuscito a convertire l’intero progetto salvando interamente la parte UI WPF.


Nota: per l’utilizzo del codice si deve aver installato l’ultima versione del SDK di GHI (Release condidate 4.2 Oct. 26, 2012) , questo per problemi di risoluzione a runtime della classe TouchEventArgs !

lunedì 5 novembre 2012

FEZ Cobra II Preview

GHI ha pubblicato una preview sulla sua nuova scheda FEZ Cobra II nelle due versioni, con o senza WiFi a bordo. La disponibilità della scheda è all’incirca gennaio 2013. Da notare il cambio del core su cui si basa la scheda stessa passando dal collaudato modulo EMX al nuovo modulo G120. La scheda oltre ad offrire SD, USB Host, USB Client e power connect è dotata di 6 socket Gadgeteer.e di una griglia di I/O sul lato posteriore.