Italian Controllare arduino con App via bluetooth.

Luciano Veneziano

Active Member
Licensed User
Longtime User
Lo scenario: Controllare Arduino, via bluetooth, con un'App android che sostituisce, appunto, il display e la tastiera di Arduino.
Ecco la rogna: quando mando ad arduino un comando, esso mi manda un "WAIT". Ho la necessità di impedire ulteriori input
fino a che arduino non mi mandi un "OK" o un "ERR". Questo perchè comando due motori stepper e quindi devo aspettare che
arrivino a destinazione. Non ho idea di come fare, forse una finestra modale che apro quando arriva WAIT e si chiude con OK.
Funziona tutto tranne la "rogna"

App Android-Arduino
 

Star-Dust

Expert
Licensed User
Longtime User
Non puoi mettere in disable il BUTTON invio finche non si riceve OK?

B4X:
Sub ButtonInvio_Click
   ButtonInvio.Enabled= False
   '' tuo codice
End If

Sub AStream_NewData (Buffer() As Byte)
     Dim TextBt As String = BytesToString(Buffer, 0, Buffer.Length, "UTF8")
     if TextBt="ok" or TextBt="err" then    ButtonInvio.Enabled= True
End Sub

oppure tutto gestito da ASyncStream
B4X:
Sub AStream_NewData (Buffer() As Byte)
     Dim TextBt As String = BytesToString(Buffer, 0, Buffer.Length, "UTF8")

     if TextBt="ok" or TextBt="err" then    ButtonInvio.Enabled= True
     if TextBt="wait" then    ButtonInvio.Enabled= False
End Sub
 

Luciano Veneziano

Active Member
Licensed User
Longtime User
Si, i comandi vengono inviati anche dai menù. Avrei preferito uno splash modale che impedisse il focus su tutti i controlli.
 

Star-Dust

Expert
Licensed User
Longtime User
Una finestra modale che dovrebbe fare?
 

Luciano Veneziano

Active Member
Licensed User
Longtime User
Non puoi mettere in disable il BUTTON invio finche non si riceve OK?

B4X:
Sub ButtonInvio_Click
   ButtonInvio.Enabled= False
   '' tuo codice
End If

Sub AStream_NewData (Buffer() As Byte)
     Dim TextBt As String = BytesToString(Buffer, 0, Buffer.Length, "UTF8")
     if TextBt="ok" or TextBt="err" then    ButtonInvio.Enabled= True
End Sub

oppure tutto gestito da ASyncStream
B4X:
Sub AStream_NewData (Buffer() As Byte)
     Dim TextBt As String = BytesToString(Buffer, 0, Buffer.Length, "UTF8")

     if TextBt="ok" or TextBt="err" then    ButtonInvio.Enabled= True
     if TextBt="wait" then    ButtonInvio.Enabled= False
End Sub
Grazie, si, l'idea è quella , ho però il problema di dover disabilitare il menu e tutti i bottoni, potrebbe sembrare un malfunzionamento. sarebbe più interessante fare il giro dei controlli, identificati con qualcosa e disabilitarli quando "wait", ovviamente abilitarli con "ok".
 

Star-Dust

Expert
Licensed User
Longtime User
Metti un LoadingIndicator che da l'idea che sia in pausa
 

JGiunta

Member
si, un pannello semi trasparente andrebbe bene... bell'idea. solo... non so come si possa fare. :)
Non sai come fare a livello programmatico? (Es. non sai quando metterlo?)
Se non sai come fare a livello di "Design" basta che crei nel designer un pannello di dimensioni 100%x in width e 100%y in height e lo metti in visible = false, quando lanci il comando fai un Pannello.visible = true e Pannello.BringToFront.
Quando poi vuoi far tornare tutto normale sempre un Visible = false.

Code:
'Nel Globals (Non necessario se lo fai a designer)
Dim Pannello as Panel

'Nel Create (Non necessario se lo fai a designer)
Pannello.initialize("Pannello") 'Questo ti serve per richiamare eventuali eventi
Pannello.left = 0
Pannello.top = 0
Pannello.width  = 100%x
Pannello.height = 100%y
Panello.Visible = false

'Quando mandi il comando
Panello.Visible = True
Pannello.BringToFront

'Quando l'utente può operare
Pannello.visible = false


Grazie, si, l'idea è quella , ho però il problema di dover disabilitare il menu e tutti i bottoni, potrebbe sembrare un malfunzionamento. sarebbe più interessante fare il giro dei controlli, identificati con qualcosa e disabilitarli quando "wait", ovviamente abilitarli con "ok".
Potresti usare il tag: nel create inserisci nel tag degli elementi da disabilitare un "DisableOnCommand" (Tag totalmente fittizio, puoi anche metterci "pippo") e poi al momento di disabilitarli, nell'activity fai l'iterazione con GetAllViewsRecursive e controlli il tag di ogni elemento, e se è uguale a "DisableOnCommand" allora lo disabiliti

Code:
'Nel create
BottoneUno.tag = "Disabilita"
BottoneDue.tag = "Disabilita"
EditUno.tag = "Disabilita"
EditDue.tag = "Disabilita"

'Quando devi bloccare
For Each Elemento As View In Activity.GetAllViewsRecursive
    if Elemento is Button and Elemento.tag = "Disabilita" then
        Elemento.enabled = false
    end if
Next

'Quando devi sbloccare
For Each Elemento As View In Activity.GetAllViewsRecursive
    if Elemento is Button and Elemento.tag = "Disabilita" then
        Elemento.enabled = true
    end if
Next

Sicuramente è migliorabile, e l'idea del LoadingIndicato sicuramente è più user friendly di un pannello in semi trasparenza. Magari anche una barra di progresso o una gif di caricamento sono strade che t possono interessare
 
Top