Italian B4A barcode reader in emulazione tastiera

LuigiTasca

Member
Licensed User
Longtime User
Ciao a tutti,
Ho un'applicazione che legge i barcode tramite uno scanner "fisico" collegato in USB e in emulazione tastiera.
Leggo normalmente i codici usando come carattere terminatore il tab.

Non riesco ad intercettare la prima lettura del barcode all'avvio del programma.
Dopo la prima lettura le successive le leggo normalmente (intercettando l'evento activity_keypress)

Ho lo stesso problema anche quando ho il focus su un edittext. Finché non leggo il carattere tab e la view perde il focus l'evento activity_keypress non si scatena. Questo ovviamente perché l'evento viene intercettato dall'edittext. Questo non è un problema ma a parer mio è lo stesso motivo per cui non intercetto quello all'avvio.

Non so come far perdere automaticamente il focus all'eventuale view che mi intercetta l'evento e che non ho ancora identificato.

Grazie
 

Star-Dust

Expert
Licensed User
Longtime User
Vediamo se ho capito bene, dopo aver avviato la pistola scanner ed effettuato la prima lettura si apre edittext Ma vuoto. La rifai la seconda o la terza volta e su EditText ti appare l la stringa Letta.

E se tu aprissi edittext manualmente Comunque la prima lettura non te la effettua.

E cosi?
 

LuigiTasca

Member
Licensed User
Longtime User
No, scusatemi se mi sono espresso male. Io non leggo da un edittext ma devo intercettare la lettura sempre.
Intercetto quindi i caratteri letti dallo scanner tramite activity_keypress (mentre nessuna view ha il focus ), un po' come quando si intercetta il keycode_back. Non devo leggere tramite edittext_textchanged. Io non devo usare le view ed in più queste mi "mangiano" l'evento con textchanged che altrimenti passerebbe su activity_keypress.

La prima volta è come se qualche view consumi l'evento perché ha il focus.
 

Star-Dust

Expert
Licensed User
Longtime User
Riscrivo:

Vediamo se ho capito bene, dopo aver avviato la pistola scanner ed effettuato la prima lettura non appare nulla. La rifai la seconda o la terza volta e su Activity_KeyPress ricevi la stringa Letta.

Il Tab si trova a nel codice a barre come ultino carattere?
 

LuigiTasca

Member
Licensed User
Longtime User
Riscrivo:

Vediamo se ho capito bene, dopo aver avviato la pistola scanner ed effettuato la prima lettura non appare nulla. La rifai la seconda o la terza volta e su Activity_KeyPress ricevi la stringa Letta.

Il Tab si trova a nel codice a barre come ultino carattere?

Esattamente, e si, il tab lo simula lo scanner come ultimo carattere.

C'è modo di simulare la pressione del tab da tastiera? In modo che si imposti il focus come ho bisogno. (ovviamente non richiamando la funzione activity_keypress(tab)). Penso che potrebbe funzionare.
 

Star-Dust

Expert
Licensed User
Longtime User
in realtà credo che il problema non è simulare il tab della tastiera perché e lo scanner che non invia nulla se non riceve il tab. Andrebbe simulato il tab nello scanner così che invii i dati alla tastiera.

Hai provato a far scannerizzare un codice che contiene solo il Tab come avvio dello scanner?
 

LuigiTasca

Member
Licensed User
Longtime User
No, non sono i codici a contenere il tab (sono solo alfanumerici). È il lettore che, a fine lettura, ci accoda il tab come carattere terminatore (impostato così da noi). Non deve essere una cosa di cui l'utente si accorge.
 

Star-Dust

Expert
Licensed User
Longtime User
Prova a mettere Activity.RequestFocus, all'avvio e nel resume
 

LuigiTasca

Member
Licensed User
Longtime User
Già provato su entrambi, niente ad fare...
Ho provato anche con questo
B4X:
Dim rc As RootCmd
rc.execRootCmd("input keyevent KEYCODE_TAB")
con la libreria "RootCmd". Ma il dispositivo deve avere i permessi di root... Cosa non possibile nei dispositivi dove andrà installata.
 

Star-Dust

Expert
Licensed User
Longtime User
Io credo che ti stai concentrando sul problema sbagliato.
La questione non è il Tab che va simulato.
Piuttosto o lo scanner non invia oppure il dispositivo non è pronto a ricevere.
 

LuigiTasca

Member
Licensed User
Longtime User
È il dispositivo che non è "pronto" a leggere, lo è dopo il primo tab, da scanner, che inizia a intercettare correttamente da activity_keypress.

Grazie lo stesso.
 

Star-Dust

Expert
Licensed User
Longtime User
Se mi viene in mente qualche idea te la dico
 

udg

Expert
Licensed User
Longtime User
Da quello che ho letto, sembra che qualcosa venga "inizializzato" nella keypress a seguito della ricezione del primo TAB. Fino a quel momento i caratteri ricevuti sembrano essere scartati. Prova a controllare il codice della keypress o postarlo qui se concordi con l'idea che possa nascondere la radice del problema.
 

LuigiTasca

Member
Licensed User
Longtime User
B4X:
Sub Activity_KeyPress (KeyCode As Int) As Boolean 'return true if you want to consume the event
   
If BarCode_Timer.Enabled = False Then
        Dim lastR As String
        Dim mChar As String=ConvertBarCode(KeyCode)    'mi converto il keycode in stringa, se è il tab allora mi metto il tag di fine "<FINE>"
        If mChar= "<FINE>" Then   'se ho letto il tab allora lancio un timer che, al tick, inserisce l'articolo col barcode associato. Il timer serve ad evitare crash.
           
            If StringaBarCode = "" Then Return False
   
            If PanelOrdine.IsInitialized Then
                If PanelOrdine.Visible Then
           
                    BarCode_Timer.Enabled = True
           
                End If
            End If
   
           
        Else     ' se non è il carattere di fine allora concateno ad una stringa globale dove mi "assemblo" il barcode
               
            lastR=lastR & mChar
            StringaBarCode = StringaBarCode  & lastR
   
           
        End If

        Return True
       
       
    End If
End Sub

Sub BarCode_Timer_Tick
    BarCode_Timer.Enabled = False
   
    'inserisco a sistema l'articolo con il codice a barre inserito
    InserisciDaBarcode(StringaBarCode)

    StringaBarCode = ""
End Sub
 

LuigiTasca

Member
Licensed User
Longtime User
Fai una prova "assurda": imposta prima il focus su una EditText e poi sull'Activity (nella Activity_Resume).

B4X:
Sub Activity_Resume
    SomeEditText.RequestFocust
    Activity.RequestFocust
End Sub
Ho appena provato, niente da fare
 

udg

Expert
Licensed User
Longtime User
Scusa ma c'è qualcosa che non va.
A cosa server LastR se la inizializzi ad ogni carattere ricevuto? Alla fine lastR=lastR+mChar sarà sempre uguale ad mChar, no?
Anche "If StringaBarCode = "" Then Return False" potrebbe essere causa dell'errore perché in pratica dici che se ricevi un TAB mentre il barcode è ancora nullo, allora non gestisci il TAB e lo passi alla normale catena di eventi (che potrebbe spostare il focus da qualche parte).

Io eliminerei del tutto la questione timer. Usa un boolean che ti dice se il codice è completo e valido o meno. In pratica sarà come avere un buffer che si riempie un carattere alla volta e all'arrivo di un TAB invia la stringa allo storage, annulla la stringa e si riporta in condizione iniziale.
Se la presenza del timer è strettamente necessaria ad evitare un crash generato dal lettore, allora usa lo stesso sistema del flag boolean per istruire il tick se passare o meno il codice alla fase di elaborazione. In pratica il time scatta sempre ma solo quando il flag è vero "tratta" il codice.
 
Top