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)); } }
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"; }); } } }