/**
         * Attenzione ::
         * Questo metodo funziona anche se lo scanner è stato scollegato fisicamente dal PC.
         * Probabilmente è il driver che risponde e non interroga veramente il dispositivo attraverso la porta usb
         */
        private void LeggiParametriScanner()
        {
            if (deviceHandle == IntPtr.Zero)
            {
                throw new InvalidOperationException("Il device handle dello scanner non è inizializzato");
            }

            byte[] paramValue = new byte[4];

            int size = 4;

            zkfp2.GetParameters(deviceHandle, 1, paramValue, ref size);
            zkfp2.ByteArray2Int(paramValue, ref imgWidth);

            size = 4;
            zkfp2.GetParameters(deviceHandle, 2, paramValue, ref size);
            zkfp2.ByteArray2Int(paramValue, ref imgHeight);

            // Ora che so le dimensioni dell'area di scanning, alloco il buffer per contenere i byte
            imgBuffer = new byte[imgWidth * imgHeight];

            // ricavo qualche info aggiuntiva che può essere utile da stampare
            byte[] buffer = new byte [1024];
            infoScanner = new InfoScanner();

            size = 1024;
            zkfp2.GetParameters(deviceHandle, 1101, buffer, ref size);
            infoScanner.vendor = Encoding.UTF8.GetString(buffer, 0, size);

            size = 1024;
            zkfp2.GetParameters(deviceHandle, 1102, buffer, ref size);
            infoScanner.productName = Encoding.UTF8.GetString(buffer, 0, size);

            size = 1024;
            zkfp2.GetParameters(deviceHandle, 1103, buffer, ref size);
            infoScanner.serialNumber = Encoding.UTF8.GetString(buffer, 0, size);
        }
        public override void start()
        {
            bool tuttoBene = true;

            statoRun    = StatoRun.Stopped;
            infoScanner = null;

            try {
                int ret = zkfp2.Init();

                if (ret == zkfperrdef.ZKFP_ERR_OK)
                {
                    _giornale.Info("Inizializzato scanner ok");
                }
                else
                {
                    tuttoBene = false;
                    _giornale.Error("err=" + ret + " : " + ZKErrors.getDescrizione(ret));
                }
            } catch (Exception) {
                tuttoBene = false;
                String msg = "I driver dello scanner di imporonte digitali ZK Teco 4500 non sono installati.";
                if (Lumen.Config.Configurazione.UserConfigLumen.scannerImpronteGestito)
                {
                    _giornale.Error(msg + "  Impossibile avviare il servizio");
                }
                else
                {
                    _giornale.Debug(msg + " Poco male tanto non lo uso");
                }
                return;
            }

            // Apro il device
            int idx = 0;

            if (tuttoBene)
            {
                if (IntPtr.Zero == (deviceHandle = zkfp2.OpenDevice(idx)))
                {
                    tuttoBene = false;
                    _giornale.Error("Open device " + idx + " fallita");
                }
                else
                {
                    _giornale.Info("Open device connessione ok");
                }
            }

            // Inizializzo la cache
            if (tuttoBene)
            {
                if (IntPtr.Zero == (dbHandle = zkfp2.DBInit()))
                {
                    _giornale.Error("Inizializzazione cache fallita");
                    tuttoBene = false;
                }
                else
                {
                    _giornale.Info("Inizializzazione cache ok");
                }
            }

            if (tuttoBene)
            {
                try {
                    LeggiParametriScanner();
                } catch (Exception ee) {
                    tuttoBene = false;
                    _giornale.Fatal("Lettura parametri scanner", ee);
                }
            }


            if (tuttoBene)
            {
                base.start();
            }
            else
            {
                zkfp2.Terminate();
            }
        }