lunedì 4 maggio 2015

Microsoft Band SDK–Accesso ai sensori

In questo post cominciamo a vedere quali cambiamenti e novità sono state introdotte nella nuova versione (la 1.3.10417) dell’SDK per il Band rilasciata il 30 aprile scorso.
In particolare, in questo post, prenderemo in esame la parte di accesso ai sensori e partiremo dal mio precedente post "Accesso ai sensori".
Per cominciare, la nuova versione dell’SDK espone un nuovo sensore, quello per il consumo calorico, il quale ci permette di conoscere il consumo di calorie a partire dall’ultimo reset del device.
Il suo funzionamento è analogo a quello degli altri (ad esempio quello di misurazione della temperatura corporea).
Come già mostrato nel precedente post, l’accesso ai sensori avviene tramite l’istanza dell’interfaccia ISensorManager esposta dall’istanza corrente di IBandClient.
In questa versione dell’SDK, oltre al già citato sensore per il consumo calorico, è stata rinominata la proprietà di ISensorManager che espone il sensore di esposizione agli UV.
Come possiamo vedere dalla successiva immagine, la proprietà che ci da accesso a tale sensore si chiama ora UV, anziché Ultraviolet come nella precedente versione.

image

Il sensore per l’esposizione UV, inoltre, prevede un cambiamento nell’interfaccia IBandUVReading restituita dall’evento ReadingChanged.

image

La proprietà IndexLevel è un’enumerazione che indica il livello di esposizione ai raggi UV (a differenza della versione precedente che restituiva un numero poco comprensibile).

image

Altra cosa che è stata cambiata riguarda la gestione della privacy nell’utilizzo dei dati provenienti dai sensori.
Come possiamo osservare dalla seguente immagine:

image

l’interfaccia IBandSensor espone due metodi per gestire il consenso dell’utente all’utilizzo dei dati del sensore.
Il metodo GetCurrentUserConsent ci fornisce la selezione dell’utente corrente in fatto di consenso all’utilizzo di quel determinato sensore ed è il metodo che dobbiamo utilizzare per verificare se l’utente ha dato il consenso o meno.
Il metodo RequestUserConsentAsync permette, invece, di richiedere l’autorizzazione all’utente. Nella realtà dei fatti, solo alcuni sensori hanno la richiesta esplicita all’utente, cioè, nel momento in cui si invoca tale metodo, si ha effettivamente la visualizzazione della finestra di richiesta del consenso.
Per capire quali sensori effettivamente mostrano il consenso all’utente, è sufficiente andare a decompilare la Microsoft.Band.dll (ad esempio con Reflector) e vedere che tutti i sensori derivano da una classe internal (Friend) chiamata BandSensorBase(Of T), la cui struttura è la seguente:

image

e, in particolare, il metodo RequestUserConsentAsync ha la seguente implementazione

image

che restituisce sempre true.
Il metodo è Overridable e, infatti, in alcuni sensori, come ad esempio l’HeartRate, viene ridefinito con la seguente implementazione:

image

cioè viene effettivamente richiesto il consenso all’utente.
In questa versione dell’SDK, l’unico sensore che richiede effettivamente il consenso all’utente è proprio l’heartrate.
In ogni caso è buona norma prevedere sempre l’utilizzo del metodo RequestUserConsentAsync a prescindere dal tipo di sensore in modo da non avere sorprese se in futuro cambiasse la situazione.

' Recupero il consenso precedentemente espresso dall'utente
Dim userConsent As UserConsent = bandClient.SensorManager.HeartRate.GetCurrentUserConsent()
If userConsent <> UserConsent.Granted Then
    ' se il consenso non e' concesso richiedo il consenso all'utente
    If Await bandClient.SensorManager.HeartRate.RequestUserConsentAsync() Then
        userConsent = UserConsent.Granted
    End If
End If
If userConsent = UserConsent.Granted Then
    AddHandler bandClient.SensorManager.HeartRate.ReadingChanged, AddressOf HeartRate_ReadingChanged
    Await bandClient.SensorManager.HeartRate.StartReadingsAsync()
Else
    ' Utente non ha concesso il consenso e la lettura non viene avviata
End If

Nell’esempio precedente di codice viene preso in esame il sensore del battito cardiaco, ma il meccanismo è lo stesso per qualsiasi altro sensore.


venerdì 1 maggio 2015

Nuova versione del Band SDK

E’ di ieri l’annuncio del rilascio della nuova versione dell’SDK per il Microsoft Band.
Si tratta della versione 1.3.10417 (la precedente e, prima della serie, era la 1.3.10219 preview).
Maggiori informazioni, download dell’SDK per le tre piattaforme Windows Phone, iOS e Android all’indirizzo http://developer.microsoftband.com/.
Allo stesso indirizzo potrete trovare anche la documentazione.
Nei mesi scorsi mi sono gia’ occupato della precedente versione e questi sono i post che ne parlano:

Gli argomenti trattati e il codice proposto dovrebbe, ad una prima lettura delle nuove funzionalita’ inserite, essere ancora valido e funzionante ma nei prossimi giorni prendero’ in esame tutti gli argomenti dei precedenti post e vedremo cosa cambia e cosa e’ stato aggiunto.
Nel frattempo, se siete interessati a sviluppare per Band, vi segnalo la seguente sessione di Build 2015:




Tag di Technorati: ,

martedì 17 marzo 2015

Microsoft Band SDK Preview - Personalizzazione

In questo post prenderemo in esame l’ultima serie di API attualmente disponibile per sviluppare con Microsoft Band ed in particolare le API relative alla personalizzazione del device.
Come già visto nei precedenti post della serie, tutte le API sono esposte dall’interfaccia IBandClient e, in particolare, da 4 proprietà esposte dalla stessa.
Nel caso della personalizzazione, la proprietà che funge da gateway per le API è la PersonalizationManager, di tipo IBandPersonalizationManager.

image

Possiamo suddividere le funzionalità di gestione della personalizzazione in due macro aree: gestione dell’immagine della “Me Tile” e gestione del tema.

Me Tile

La “Me Tile” è la finestra principale del Band, quella che mostra l'orario e uno a scelta (dell’utente) tra battito cardiaco, passi fatti, calorie bruciate o distanza percorsa.

image

E’ possibile personalizzare, al momento, lo sfondo della “Me Tile” utilizzando un’immagine 310x102 pixel.
L’interfaccia IBandPersonalizationManager mette a disposizione due metodi per la gestione di tale immagine:
  • GetMeTileImageAsync: permette di recuperare l’immagine corrente della “Me Tile”. Il valore restituito, se il Band è correttamente connesso, è un’istanza della classe BandImage;
  • SetMeTileImageAsync: consente di impostare l’immagine della “Me Tile”.

Entrambi i metodi lavorano su istanze della BandImage e l’SDK mette a disposizione dei metodi di estensione per convertire WriteableBitmap in BandImage e viceversa.

image

Nel seguente pezzo di codice possiamo vedere come recuperare l’immagine della “Me Tile”

Try
     Await App.CurrentBandClient.PersonalizationManager.SetMeTileImageAsync(wBitmap.ToBandImage())
 Catch ex As BandException

 End Try

Nel precedente esempio, App.CurrentBandClient è un’istanza valida di BandClient (come visto nei precedenti post) e wBitmap è la bitmap che vogliamo utilizzare.
In maniera analoga, per recuperare l’immagine corrente della “Me Tile” possiamo scrivere:

Try
     Dim bandImage = Await App.CurrentBandClient.PersonalizationManager.GetMeTileImageAsync()
Catch ex As BandException

End Try

Theme

L’altra macro area a cui possiamo accedere è quella della personalizzazione dei colori utilizzati dal Band: il tema.
Il tema del Band è composto da sei colori, il cui significato e nome è illustrato nella seguente immagine:

image

L’interfaccia IBandPersonalizationManager ci mette a disposizione due metodi (con relativi overload) per poter gestire il tema:
  • GetThemeAsync: consente di recuperare il tema corrente del Band. Il risultato è un’istanza della classe BandTheme;
  • SetThemeAsync: consente di impostare il tema del Band.

La classe BandTheme espone i sei colori illustrati nella precedente immagine come proprietà di tipo BandColor.
image

Come già visto in un precedente post della serie, abbiamo a disposizione degli extension method per poter convertire un oggetto di tipo Windows.UI.Color in BandColor e viceversa.
Il seguente pezzo di codice mostra come impostare un tema per il band:

Try
    Dim tema = New BandTheme()
    tema.Base = Colors.LightBlue.ToBandColor()
    tema.HighContrast = Colors.Blue.ToBandColor()
    tema.Highlight = Colors.BlueViolet.ToBandColor()
    tema.Lowlight = Colors.LightCyan.ToBandColor()
    tema.Muted = Colors.DarkBlue.ToBandColor()
    tema.SecondaryText = Colors.White.ToBandColor()

    Await App.CurrentBandClient.PersonalizationManager.SetThemeAsync(tema)
Catch ex As BandException

End Try

Con questo post termina la prima mini serie dedicata all’SDK del Band.

L’esempio completo utilizzato in questo post è scaricabile al seguente link.


giovedì 12 marzo 2015

Microsoft Band SDK Preview - Notifiche

In questo post della serie dedicata all’SDK del Microsoft Band ci occuperemo delle funzioni messe a disposizione dello sviluppatore per l’invio di notifiche al device.
Nell’attuale versione dell’SDK (che ricordiamo essere la 1.3.10219), abbiamo a disposizione le seguenti tipologie di notifiche:
  • Messagge: il message è una notifica, inviata ad una tile particolare, composta da un titolo e da un testo che rimane memorizzata nel device. Il message può generare un avvertimento all’utente o meno;
  • Dialog: il dialog e’ una notifica, inviata ad una tile particolare, anch’essa composta da un titolo e da un testo ma non rimane memorizzata tra i messaggi della tile e genera sempre un avvertimento per l’utente (è un vero e proprio dialog).
Oltre alle notifiche che trasportano testo, è possibile anche far "vibrare" il device.
Tutte e funzionalità di notifiche sono esposte dall’interfaccia IBandNotificationManager. Possiamo recuperare un’istanza valida di questa interfaccia dalla proprietà NotificationManager dell’interfaccia IBandClient.

image

L’interfaccia IBandNotificationManager espone tre metodi (con opportuni overload) per gestire le notifiche.

SendMessageAsync

Il metodo SendMessageAsync permette di inviare una notifica di tipo Message ad una specifica Tile.

Try
    Await App.CurrentBandClient.NotificationManager.SendMessageAsync(TileFactory.AppTileId,
                                                                    NotificationTitleText.Text,
                                                                    NotificationBodyText.Text,
                                                                    DateTimeOffset.Now,
                                                                    Notifications.MessageFlags.ShowDialog )
Catch ex As BandException

End Try

Nell’esempio precedente App.CurrentBandClient è un’istanza valida di IBandClient e TileFactory.TileId è il Guid della tile a cui inviare la notifica.
Da notare la possibilità di definire anche un DateTimeOffset che apparirà all’utente sul Band e l’enumerazione MessageFlags indicare se deve essere visualizzato il messaggio all’utente o semplicemente accodato il messaggio a quelli presenti nella tile.
Questo tipo di notifica viene memorizzato sul Band e, in caso di messaggi non letti, viene visualizzato il badge numerico e la small tile per segnalare il numero di messaggi in attesa di lettura.

SendDialogAsync

Il metodo SendDialogAsync permette di inviare una notifica di tipo Dialog al Band.

Try
    Await App.CurrentBandClient.NotificationManager.ShowDialogAsync(TileFactory.AppTileId,
                                                                    NotificationTitleText.Text,
                                                                    NotificationBodyText.Text)
Catch ex As BandException

End Try

La notifica di tipo Dialog non viene memorizzata sul Band e viene sempre visualizzata la notifica all’utente.

SNAGHTMLa5b08cb

Sia per i Message che per i Dialog, se il guid della Tile non corrisponde ad una tile dell’app, si ottiene una eccezione di tipo BandException.

VibrateAsync

Il metodo VibrateAsync permette di inviare quello che viene chiamato “Haptics” (una vibrazione) al Band. L’invio di notifiche di tipo Message e Dialog genera automaticamente l’haptics del Band.

Try
    Await App.CurrentBandClient.NotificationManager.VibrateAsync(vibrationTypeSelected)
Catch ex As bandException

End Try

In questo caso non serve il tileid (la vibrazione viene inviata al band e non ad una tile specifica).
Il progetto completo riguardante le notifiche è scaricabile al seguente link.


lunedì 9 marzo 2015

Microsoft Band SDK Preview–Tile

In questo post dedicato alla Preview dell’SDK DI Microsoft Band ci occuperemo delle funzionalità relative alla gestione delle tile sullo smartwatch.

L’interfaccia IBandClient, tra le proprietà che espone e che ci consentono di accedere alle funzionalità del Band, espone anche la TileManager il cui nome è, evidentemente, tutto un programma.

image

La proprietà TileManager è un’ istanza dell’interfaccia IBandTileManager che, a sua volta espone, 4 operazioni:
  • AddTileAsync : permette di aggiungere (ove ce ne fosse spazio) una tile all’interno della stripe delle tile del Band;
  • GetRemainingTileCapacityAsync: restituisce il numero di posizioni disponibili all’interno della stripe delle tile del Band. Se non c’è più posto otterremo il valore 0;
  • GetTilesAsync: restituisce l’elenco delle tile aggiunte alla stripe del Band da parte della nostra applicazione;
  • RemoveTileAsync: rimuove una tile dalla stripe delle tile del Band.
Prima di entrare nel merito delle operazioni offerte dall’interfaccia IBandTileManager, diamo un’occhiata all’oggetto Tile del Band.

image

Come possiamo vedere dalla precedente figura una tile è composta da:
  • TileId: un guid che identifica univocamente la tile e che ci consentirà di gestire le notifiche alla tile stessa;
  • Name: una stringa che definisce il nome della tile;
  • IsBadgingEnabled: indica se la tile può visualizzare il numero di notifiche ricevute o meno;
  • SmallIcon e TileIcon: rappresentano rispettivamente l’immagine della tile quando appare il numero delle notifiche e l’immagine della tile in visualizzazione normale. La TileIcon è obbligatoria, la SmallIcon no;
  • Theme: permette di impostare un tema particolare per la tile.
Le immagini che possiamo utilizzare nelle tile debbono essere monocolore (bianche) con trasparenza e debbono avere dimensioni 46x46 pixel per la TileIcon e 24x24 pixels per la SmallIcon.

image

Inoltre le due immagini debbono essere istanze della classe BandIcon. Questa classe non ha costruttore ma fortunatamente l’SDK del Band ci mette a disposizione un paio di metodi di estensione per poter convertire una WriteableBitmap in una BandIcon e viceversa:

Dim bitmap As WriteableBitmap=New WriteableBitmap(46,46)
' WriteableBitmap --> BandIcon
Dim bandIcon as BandIcon = bitmap.ToBandIcon()
' BandIcon --> WriteableBitmap
Dim newBitmap=bandIcon.ToWriteableBitmap()

Nel pezzo di codice seguente viene mostrato come creare una Tile con delle immagini memorizzate nell’asset dell’applicazione:

Public Shared Async Function CreateStandardTileAsync(tileName As String, isBadgingEnabled As Boolean) As Task(Of BandTile)
    Dim tile = New BandTile(Guid.NewGuid())
    
    tile.Name = tileName
    tile.IsBadgingEnabled = isBadgingEnabled
    Dim icon = Await BitmapFactory.[New](1, 1).FromContent(New Uri("ms-appx:///Assets/IconLarge.png"))
    Dim smallIcon = Await BitmapFactory.[New](1, 1).FromContent(New Uri("ms-appx:///Assets/IconSmall.png"))
    tile.TileIcon =  icon.ToBandIcon()
    tile.SmallIcon = smallIcon.ToBandIcon()

    Return tile
End Function

In questo caso si e’ utilizzato il package WriteableBitmapEx, disponibile su NuGet, per poter avere a disposizione la classe BitmapFactory.

GetRemainingTileCapacityAsync

L’operazione GetRemainingTileCapacityAsync, dell’interfaccia IBandTileManager, ci permette di sapere quanti “posti” sono disponibili per le nostre tile.

Try
    Dim tileCapacity = Await App.CurrentBandClient.TileManager.GetRemainingTileCapacityAsync()
    RemainingTileCapacityText.Text = tileCapacity.ToString()
Catch ex As BandException

End Try

Nell’esempio precedente App.CurrentBandClient è un’istanza valida di IBandClient che possiamo ottenere, come visto nei precedenti post della serie, connettendoci ad un Band.
Se non ci sono slot disponibili per le tile, il risultato della chiamata al metodo è il valore 0.
La nostra app dovrebbe sempre controllare, prima di aggiungere una tile, che ci sia posto in modo da evitare di generare eccezione nel momento in cui si tenta di aggiungere una nuova tile.

GetTilesAsync

Il metodo GetTilesAsync permette di recuperare l’elenco delle BandTile che la nostra app ha aggiunto al Band.

Try
    Dim tiles = Await App.CurrentBandClient.TileManager.GetTilesAsync()
    TileList.ItemsSource = tiles
Catch ex As BandException

End Try

La collezione non conterrà alcun elemento se non abbiamo mai aggiunto tile.

AddTileAsync

Il metodo AddTileAsync permette di aggiungere una tile alla stripe delle tile del Band (se ci sono posti liberi).

Try
    If Await App.CurrentBandClient.TileManager.AddTileAsync(tile) Then
        Dim msgDlg = New MessageDialog("Tile added!!")
        Await msgDlg.ShowAsync()
        NavigationHelper.GoBack()
    End If
Catch ex As Exception

End Try

Se non ci sono posti liberi e tentiamo di aggiungere una tile, otteniamo un’eccezione di tipo InvalidOperationException.
Se, invece, abbiamo spazio per inserire la tile, il sistema mostrerà all’utente la finestra di conferma (attualmente non bypassabile) mostrata nella seguente figura:

SNAGHTML53355a7


RemoveTileAsync

Il metodo RemoveTileAsync permette la rimozione di una tile dalla stripe delle tile del Band. Il metodo accetta sia una tile (magari recuperata utilizzando il metodo GetTilesAsync esposto in precedenza), sia il guid di una tile.

Try
     If Await App.CurrentBandClient.TileManager.RemoveTileAsync(tile) Then
         Dim msgDlg = New MessageDialog("Tile removed!!")
         Await msgDlg.ShowAsync()
     End If
 Catch ex As Exception

 End Try

Se la tile (o il guid della tile) non esiste, il metodo restituisce false. Se la rimozione avviene con successo, il metodo restituisce true.

Cambiare il tema della tile

E’ possibile impostare un tema differente rispetto a quello del Band nel momento in cui si aggiunge una tile, semplicemente valorizzando la proprieta’ Theme dell’istanza di BandTile.

Public Shared Async Function CreateStandardTileAsync(tileName As String, isBadgingEnabled As Boolean) As Task(Of BandTile)
    Dim tile = New BandTile(Guid.NewGuid())
    
    tile.Name = tileName
    tile.IsBadgingEnabled = isBadgingEnabled
    Dim icon = Await BitmapFactory.[New](1, 1).FromContent(New Uri("ms-appx:///Assets/IconLarge.png"))
    Dim smallIcon = Await BitmapFactory.[New](1, 1).FromContent(New Uri("ms-appx:///Assets/IconSmall.png"))
    tile.TileIcon =  icon.ToBandIcon()
    tile.SmallIcon = smallIcon.ToBandIcon()

    Return tile
End Function

Public Shared Async Function CreateRedTileAsync(tileName As String, isBadgingEnabled As Boolean) As Task(Of BandTile)
    Dim tile = Await CreateStandardTileAsync(tileName, isBadgingEnabled)
    tile.Theme=New Personalization.BandTheme()
    With tile.Theme
        .Base=Colors.Red.ToBandColor()
        .HighContrast=Colors.blueviolet.ToBandColor()
        .Highlight=Colors.blueviolet.ToBandColor()
        .SecondaryText=Colors.LightGray.ToBandColor()
        .Muted=Colors.DarkRed.ToBandColor()
        .Lowlight=Colors.DarkRed.ToBandColor()
    End With

    Return tile
End Function

Nell’esempio precedente viene impostato il tema della tile valorizzando opportunamente i colori. Il significato dei colori è riportato nella seguente figura.

image

La classe BandTheme (che vedremo dettagliatamente in un successivo post) una proprieta’ per ogni colore del tema. Queste proprietà sono di tipo BandColor, una struttura proprietaria dell’SDK del Band. Anche in questo caso abbiamo un metodo di estensione (il metodo ToBandColor) che ci consente di convertire un colore espresso con la classe Windows.UI.Color nella struttura BandColor corrispondente.

Nell’attuale versione dell’SDK sembrerebbe che il colore Base (cioè quello dello sfondo dell’icona non venga preso in considerazione).

Vedremo in un post apposito i dettagli sulla personalizzazione del Band e su come usare l’SDK per impostare il tema del device.

Il codice sorgente dell’esempio usato in questo post è disponibile al seguente link.

Rimanete connessi!!!


venerdì 6 marzo 2015

Microsoft Band SDK Preview - Accesso ai sensori

In questo post parleremo di quali sensori, presenti nel Microsoft Band, possiamo utilizzare sfruttando le API messe a disposizione dall’SDK.
I sensori utilizzabili grazie all’SDK sono i seguenti:
  • Accelerometro: fornisce l’accelerazione subita dal Band (in metri al secondo quadrato) lungo i tre assi (vedere figura per comprendere come sono disposti tali assi);
  • Giroscopio: fornisce la velocità angolare (gradi al secondo) attorno ai tre assi cartesiani;
  • Sensore di distanza: fornisce informazioni riguardanti la velocità corrente (in centimetri al secondo), la distanza percorsa (in centimetri), il passo (in millisecondi per metro) e il tipo di attività (camminata o corsa);
  • Cardio: fornisce le informazioni relative alla frequenza cardiaca (in battiti al minuto);
  • Pedometro: fornisce il numero di passi;
  • Sensore di temperatura della pelle: fornisce informazioni sulla temperatura della pelle (in gradi Celsius);
  • Sensore UV: fornisce informazioni sull’intensità dell’irraggiamento solare (in termini di radiazioni UV);
  • Sensore di contatto: fornisce informazioni sul fatto che il Band sia indossato o meno.
La seguente figura mostra la disposizione degli assi X, Y e Z per quel che riguarda giroscopio e accelerometro.
image

Ricevere i dati dal sensore

Nel precedente post della serie abbiamo visto come connettersi ad un Band (in pairing e collegato al nostro Windows Phone).

Dim bands = Await BandClientManager.Instance.GetBandsAsync()
If bands.Any() Then
    App.CurrentBandInfo = bands.First()
    BandInfoCtrl.BandInfo = App.CurrentBandInfo
    Try
        App.CurrentBandClient = Await BandClientManager.Instance.ConnectAsync(App.CurrentBandInfo)
        DisplayProgressIndicator(True, "Band connesso....")
    Catch ex As BandException

    End Try
Else
    Dim msgDlg = New MessageDialog("Nessun Band trovato")
    Await msgDlg.ShowAsync()
End If

Quello che otteniamo è un’istanza dell’interfaccia IBandClient la cui struttura è mostrata nella seguente figura
image

Come possiamo vedere, l’interfaccia espone 4 proprietà il cui scopo è quello di permetterci di accedere alle 4 aree funzionali che il Band ci consente di utilizzare in questa versione dell’SDK.
In particolare, quella che ci interessa è la SensorManager, di tipo IBandSensorManager, che ci permette di avere accesso ai sensori.

 image

Come si osserva dal class diagram, la IBandSensorManager espone 8 proprietà (una per sensore), tutte di tipo IBandSensor(Of T) dove T definisce la tipologia del sensore stesso.
La IBandSensor espone un evento che viene sollevato ogni qual volta il valore sotto esame cambia e due metodi per avviare e fermare il rilevamento dei cambiamenti (ogniuno con un overload che cosente di passare come argomento un CancelletionToken per gestire la cancellazione della richiesta asincrona in maniera corretta).
Unica differenza la fa il sensore di contatto (quello che ci permette di sapere se il Band è indossato o meno) che implementa una propria interfaccia (sempre derivata dalla IBandSensor) che ci fornisce, in più, un metodo per recuperare, in polling, il valore letto dal sensore.

image

Tutti i tipi che definiscono i sensori derivano dall’interfaccia IBandSensorReading. Il tipo su cui vengono chiuse le interfacce dei sensori contiene effettivamente i dati forniti dallo stesso. Ad esempio la IBandHeartRateSensorReading (che è il tipo caratteristico del sensore cardio) conterrà il valore dei battiti letti e la qualità con cui tale dato è letto (nel caso specifico Acquiring o Locked per segnalare se il sensore del battito cardiaco è effettivamente agganciato al nostro polso o se i dati sono soggetti ad errore perchè in fase di acquisizione).
SNAGHTML8afd5c
Quindi, una volta capito come funziona il meccanismo degli eventi, possiamo agganciare un gestore in modo da essere informati dall’SDK quando ci sono dei dati da utilizzare.
Nel seguente pezzo di codice andiamo a gestire i dati provenienti dall’accelerometro:

AddHandler App.CurrentBandClient.SensorManager.Accelerometer.ReadingChanged,
    Async Sub(sender As Object, data As IBandAccelerometerReading)
        Await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,
                                  Sub(data)
                                      AccelerometerXText.Text = data.AccelerationX.ToString("###0.0")
                                      AccelerometerYText.Text = data.AccelerationY.ToString("###0.0")
                                      AccelerometerZText.Text = data.AccelerationZ.ToString("###0.0")
                                      AccelerometerTimestampText.Text = data.Timestamp.ToString()
                                  End Sub)
    End Sub

oppure, per chi ama la sintassi classica di VB.NET:

AddHandler App.CurrentBandClient.SensorManager.Accelerometer.ReadingChanged, AddressOf Accelerometer_ReadingChanged

Private Async Sub Accelerometer_ReadingChanged(sender As Object, e As BandSensorReadingEventArgs(Of IBandAccelerometerReading))
    Await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, Sub(data)
                                                                                 AccelerometerXText.Text = data.AccelerationX.ToString("###0.0")
                                                                                 AccelerometerYText.Text = data.AccelerationY.ToString("###0.0")
                                                                                 AccelerometerZText.Text = data.AccelerationZ.ToString("###0.0")
                                                                                 AccelerometerTimestampText.Text = data.Timestamp.ToString()
                                                                             End Sub)
End Sub

App.CurrentBandClient è un’istanza valida di IBandClient ottenuta dalla connessione.
Osserviamo che dobbiamo utilizzare il dispatcher per aggiornare la UI in quanto non è garantito che l’evento venga sollevato nello stesso thread dell’interfaccia.
I dati del sensore non arriveranno fino a che non diremo al sensore di cominciare a leggere:

Await App.CurrentBandClient.SensorManager.Accelerometer.StartReadingsAsync()

In maniera analoga possiamo arrestare il processo di recupero dei dati utilizzando il metodo StopReadingAsync:

Await App.CurrentBandClient.SensorManager.Accelerometer.StopReadingsAsync()


ReportingInterval

Prima di concludere osserviamo che l’interfaccia IBandSensor espone anche delle proprietà che ci permettono di capire se il sensore è supportato (IsSupported), di sapere quali sono gli intervalli di campionamento che il sensore è in grado di supportare (SupportedReportingIntervals) e quale è l’intervallo di campionamento scelto (ReportingInterval).
image
SupportedReportingIntervals è una collezione di TimeStamp i cui valori possono essere utilizzati per impostare la proprietà ReportingInterval e decidere, in questo modo, la frequenza di campionamento che ci fa più comodo.
L’esempio completo è disponibile al seguente link.

Nel prossimo post ci occuperemo della gestione delle tile nel Band e vedremo come possiamo creare la nostra tile e gestirla da codice.

Rimanete connessi!!!