Italian B4A barcode reader in emulazione tastiera

Discussion in 'Italian Forum' started by LuigiTasca, Nov 6, 2018.

  1. LuigiTasca

    LuigiTasca Member Licensed 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
     
  2. LucaMs

    LucaMs Expert Licensed User

    Non ho capito moltissimo :D ma se vuoi far perdere il focus ad una EditText puoi semplicemente passarlo ad un'altra, magari invisibile:

    etInvisibile.RequestFocus
     
  3. Star-Dust

    Star-Dust Expert Licensed 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?
     
  4. LucaMs

    LucaMs Expert Licensed User

    Potresti mettere quell'instruzione nella Activity_Resume
     
  5. LuigiTasca

    LuigiTasca Member Licensed 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.
     
  6. Star-Dust

    Star-Dust Expert Licensed 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?
     
  7. LuigiTasca

    LuigiTasca Member Licensed User

    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.
     
  8. Star-Dust

    Star-Dust Expert Licensed 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?
     
  9. LuigiTasca

    LuigiTasca Member Licensed 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.
     
  10. Star-Dust

    Star-Dust Expert Licensed User

    Prova a mettere Activity.RequestFocus, all'avvio e nel resume
     
  11. LuigiTasca

    LuigiTasca Member Licensed User

    Già provato su entrambi, niente ad fare...
    Ho provato anche con questo
    Code:
    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.
     
  12. Star-Dust

    Star-Dust Expert Licensed 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.
     
  13. LuigiTasca

    LuigiTasca Member Licensed 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.
     
  14. Star-Dust

    Star-Dust Expert Licensed User

    Se mi viene in mente qualche idea te la dico
     
  15. udg

    udg Expert Licensed 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.
     
  16. LucaMs

    LucaMs Expert Licensed User

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

    Code:
    Sub Activity_Resume
        SomeEditText.RequestFocust
        
    Activity.RequestFocust
    End Sub
     
  17. LuigiTasca

    LuigiTasca Member Licensed User

    Code:
    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
     
  18. LuigiTasca

    LuigiTasca Member Licensed User

    Ho appena provato, niente da fare
     
  19. udg

    udg Expert Licensed 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.
     
    sirjo66 likes this.
Loading...
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice