private async Task PauseReceiving()
        {
            if (_serialIoManager == null || !_serialIoManager.IsOpen)
            {
                return;
            }
            try
            {
                _serialIoManager.Close();
                await Task.Run(async() =>
                {
                    while (_serialIoManager != null && _serialIoManager.IsOpen)
                    {
                        await Task.Delay(200);
                    }
                });

                ToastService.ToastShortMessage(AppResources.Port_Closed);
            }
            catch (Exception)
            {
                ToastService.ToastShortMessage(AppResources.Port_Closed_Error);
            }
            finally
            {
                NotifyPropertyChanged(nameof(PortCommand));
                NotifyPropertyChanged(nameof(PortStatus));
            }
        }
Example #2
0
        protected override void OnPause()
        {
            base.OnPause();

            if (serialIoManager != null && serialIoManager.IsOpen)
            {
                try
                {
                    serialIoManager.Close();
                }
                catch (Java.IO.IOException)
                {
                    // ignore
                }
            }
        }
        protected override void OnPause()
        {
            Log.Info(TAG, "OnPause");

            base.OnPause();

            if (serialIoManager != null && serialIoManager.IsOpen)
            {
                Log.Info(TAG, "Stopping IO manager ..");
                try {
                    serialIoManager.Close();
                }
                catch (Java.IO.IOException) {
                    // ignore
                }
            }
        }
        // Méthode d'accès au parking
        private async void Access()
        {
            bool IsReserved = false;

            if (ClientReservationStatus == ReservationStatus.Validate)                            // Si réservation validée
            {
                if (BeginDatePicker.Date.Add(BeginTimePicker.Time) > DateTime.Now.AddMinutes(30)) // Si en avance sur réservation
                {
                    AppActivity.RunOnUiThread(() => { DisplayAlert("Attention", "Vous avez plus de 30 minutes d'avance sur votre réservation, veuillez modifier votre réservation.", "OK"); AccessButton.IsEnabled = false; });
                    return;
                }
                else
                {
                    IsReserved = true;
                }
            }

            await OpenLiFiReceiverPort(); // Check si Recepteur présent

            if (SerialIOManager != null && SerialIOManager.IsOpen)
            //if (true)
            {
                // Envoie reference réservation ou code invite
                AppActivity.RunOnUiThread(() => { ReceiverStatus.Text = "Veillez a bien orienter le flash vers la borne."; });
                Thread.Sleep(1000);
                if (IsReserved)
                {
                    await SendFlashLiFiData(Reference.Text);
                }
                else
                {
                    await SendFlashLiFiData("1000");  // + durée 1001 1002 etc
                }
                // Reception: Reference|Etage|Allee|Place
                AppActivity.RunOnUiThread(() => { ReceiverStatus.Text = "Veillez a bien placer le récepteur en dessous de la lumière."; });

                int Tries = 100;
                while (Tries != 0)
                {
                    // ReceivedSerialData = "6698|1|B|1"; // Test
                    string[] SplittedData = ReceivedSerialData.Split('|');
                    if (SplittedData.Length == 4) // Si bonne réception
                    {
                        AppActivity.RunOnUiThread(() => {
                            ReferenceLabel.Text = SplittedData[0];
                            FloorLabel.Text     = SplittedData[1];
                            LaneLabel.Text      = SplittedData[2];
                            PlaceLabel.Text     = SplittedData[3];
                            ReceiverStatus.Text = "Garez votre voiture à la place indiquée.";
                        });
                        Tries = 0; // Stop loop

                        if (ClientReservationStatus == ReservationStatus.Guest)
                        {
                            await Data.Settings.Write("null", "null", SplittedData[0]); // Reference à sauvegardé dans config
                        }
                    }
                    else // Si mauvaise réception -> loop
                    {
                        Thread.Sleep(150);
                        AppActivity.RunOnUiThread(() => { ReceiverStatus.Text = "Veillez a bien placer le récepteur en dessous de la lumière."; });
                        Tries--;
                        if (Tries == 0)
                        {
                            AppActivity.RunOnUiThread(() => { ReceiverStatus.Text = "Données Li-Fi non reçu, veuillez réessayez."; });
                        }
                    }
                }
                SerialIOManager.Close();
            }
            ReceivedSerialData = "";
            TimerEnabled       = true;
        }
        // Réception de données Li-Fi avec port série micro USB
        private async Task OpenLiFiReceiverPort()
        {
            UsbManager UsbSerialManager = AppActivity.ApplicationContext.GetSystemService(Context.UsbService) as UsbManager;

            var Table = UsbSerialProber.DefaultProbeTable;

            Table.AddProduct(0x1b4f, 0x0008, Java.Lang.Class.FromType(typeof(CdcAcmSerialDriver))); // IOIO OTG
            var Prober  = new UsbSerialProber(Table);
            var Drivers = await Prober.FindAllDriversAsync(UsbSerialManager);

            LiFiReceiverPort = null;
            foreach (var Driver in Drivers) // On cherche notre driver (le récepteur Li-Fi)
            {
                foreach (var Port in Driver.Ports)
                {
                    if (HexDump.ToHexString((short)Port.Driver.Device.VendorId) == "0403" && HexDump.ToHexString((short)Port.Driver.Device.ProductId) == "6015")
                    {
                        LiFiReceiverPort = Port;
                    }
                }
            }

            if (LiFiReceiverPort == null) // Si il n'est pas branché on affiche un message
            {
                AppActivity.RunOnUiThread(() => { ReceiverStatus.Text = "Récepteur Li-Fi absent"; });
            }
            else
            {
                var IsPermissionGranted = await UsbSerialManager.RequestPermissionAsync(LiFiReceiverPort.Driver.Device, AppActivity.ApplicationContext);

                if (IsPermissionGranted)                                             // On demande la permission à l'utilisateur d'utiliser le récepteur (Android)
                {
                    SerialIOManager = new SerialInputOutputManager(LiFiReceiverPort) // Configuration du port série
                    {
                        BaudRate = 115200,
                        DataBits = 8,
                        StopBits = StopBits.One,
                        Parity   = Parity.None
                    };

                    SerialIOManager.DataReceived += (source, args) =>            // Thread de réception de données
                    {
                        ReceivedSerialData = Encoding.UTF8.GetString(args.Data); // Données recu
                    };

                    SerialIOManager.ErrorReceived += (source, args) => // Thread si il y a une erreur
                    {
                        AppActivity.RunOnUiThread(() =>
                        {
                            ReceiverStatus.Text = "Récepteur Li-Fi absent"; // On affiche un message de débranchement
                            SerialIOManager.Close();
                        });
                    };

                    try
                    {
                        SerialIOManager.Open(UsbSerialManager); // On ouvre le port
                        AppActivity.RunOnUiThread(() => { ReceiverStatus.Text = "Récepteur Li-Fi opérationnel"; });
                    }
                    catch (Java.IO.IOException Exception)
                    {
                        AppActivity.RunOnUiThread(() => { ReceiverStatus.Text = "Erreur récepteur Li-Fi: " + Exception.Message; });
                    }
                }
                else
                {
                    AppActivity.RunOnUiThread(() => { ReceiverStatus.Text = "Permission requise"; });
                }
            }
        }