Conexión al servicio

El punto de entrada es el HalBridge. Es un singleton que se auto-conecta y reintenta el enlace cada pocos segundos si se cae. La aplicación solo debe obtener la instancia y consultar su estado.

Obtener el puente y conectar

import cl.bci.bcipagos.modules.service.hal.HalBridge
import cl.bci.bcipagos.modules.service.hal.HalComponent
 
val bridge = HalBridge.getInstance(applicationContext)
// getInstance ya inicia la conexión automáticamente.
 
val conectado: Boolean = bridge.isConnected
 
// Al terminar (por ejemplo en onDestroy):
bridge.disconnect()

Observar la conexión de forma continua

Como el enlace puede tardar, la interfaz debe reaccionar al cambio de estado en lugar de esperar un tiempo fijo. Ejemplo con corrutinas:

LaunchedEffect(Unit) {
    var anterior = false
    while (true) {
        val ahora = bridge.isConnected
        if (ahora != anterior) {
            if (ahora) onConectado() else onDesconectado()
            anterior = ahora
        }
        delay(500)
    }
}
📘

Antipatrón a evitar. No decida "sin conexión" tras un timeout corto (por ejemplo, 5 segundos). En hardware lento el primer enlace puede superar los 13 segundos; un timeout fijo deja la app marcada como desconectada aunque el servicio conecte después.

Obtener el binder de un componente

Una vez conectado, se solicita el binder crudo de cada componente al HalBridge y se convierte a su interfaz con el método Stub.asInterface correspondiente:

import cl.bci.bcipagos.modules.service.hal.driver.IPrinter
 
val binder = bridge.getRawBinder(HalComponent.PRINTER)
val printer: IPrinter? = binder?.let { IPrinter.Stub.asInterface(it) }

Los valores de enumerado HalComponent disponibles son:

HalComponentInterfazEstado
PRINTERIPrinterOperativo
CAMERAICameraOperativo
SCANNERIScannerOperativo
MAGSTRIPEIMagneticStripeOperativo
DEVICEINFOIDeviceInfoOperativo
BEEPIBeepOperativo
NFCINfcSolo lectura
DIAGNOSTICIDiagnosticMétricas