protected async override void OnResume()
        {
            Log.Info(TAG, "OnResume");

            base.OnResume();

            var portInfo   = Intent.GetParcelableExtra(EXTRA_TAG) as UsbSerialPortInfo;
            int vendorId   = portInfo.VendorId;
            int deviceId   = portInfo.DeviceId;
            int portNumber = portInfo.PortNumber;

            Log.Info(TAG, string.Format("VendorId: {0} DeviceId: {1} PortNumber: {2}", vendorId, deviceId, portNumber));

            var drivers = await DeviceListActivity.FindAllDriversAsync(usbManager);

            var driver = drivers.Where((d) => d.Device.VendorId == vendorId && d.Device.DeviceId == deviceId).FirstOrDefault();

            if (driver == null)
            {
                throw new Exception("Driver specified in extra tag not found.");
            }

            port = driver.Ports [portNumber];
            if (port == null)
            {
                titleTextView.Text = "No serial device.";
                return;
            }
            Log.Info(TAG, "port=" + port);

            titleTextView.Text = "Serial device: " + port.GetType().Name;

            serialIoManager = new SerialInputOutputManager(port)
            {
                BaudRate = 115200,
                DataBits = 8,
                StopBits = StopBits.One,
                Parity   = Parity.None,
            };
            serialIoManager.DataReceived += (sender, e) => {
                RunOnUiThread(() => {
                    UpdateReceivedData(e.Data);
                });
            };
            serialIoManager.ErrorReceived += (sender, e) => {
                RunOnUiThread(() => {
                    var intent = new Intent(this, typeof(DeviceListActivity));
                    StartActivity(intent);
                });
            };

            Log.Info(TAG, "Starting IO manager ..");
            try {
                serialIoManager.Open(usbManager);
            }
            catch (Java.IO.IOException e) {
                titleTextView.Text = "Error opening device: " + e.Message;
                return;
            }
        }
        async Task OnItemClick(object sender)
        {
            for (int i = 0; i < adapter.Count; i++)
            {
                selectedPortTest = adapter.GetItem(i);

                // Поиск устройства

                if (selectedPortTest.Driver.Device.VendorId == 6790 && selectedPortTest.Driver.Device.DeviceId == 1003)
                {
                    ItemPort = i;
                }

                //
            }


            selectedPort = adapter.GetItem(ItemPort);
            var permissionGranted = await usbManager.RequestPermissionAsync(selectedPort.Driver.Device, this);

            if (permissionGranted)
            {
                //MessageBox("Доступ к USB получен!");

                int vendorId   = selectedPort.Driver.Device.VendorId;
                int deviceId   = selectedPort.Driver.Device.DeviceId;
                int portNumber = 0;


                var drivers = await FindAllDriversAsync(usbManager);

                var driver = drivers.Where((d) => d.Device.VendorId == vendorId && d.Device.DeviceId == deviceId).FirstOrDefault();
                if (driver == null)
                {
                    throw new Exception("Driver specified in extra tag not found.");
                }

                port = driver.Ports[portNumber];
                if (port == null)
                {
                    MessageBox("No serial device.");
                    return;
                }

                serialIoManager = new SerialInputOutputManager(port)
                {
                    BaudRate = 115200,
                    DataBits = 8,
                    StopBits = StopBits.One,
                    Parity   = Parity.None,
                };
                serialIoManager.DataReceived += (sender, e) =>
                {
                    RunOnUiThread(() =>
                    {
                        UpdateReceivedData(e.Data);
                    });
                };
                serialIoManager.ErrorReceived += (sender, e) =>
                {
                    RunOnUiThread(() =>
                    {
                        var intent = new Intent(this, typeof(MainActivity));
                        StartActivity(intent);
                    });
                };

                try
                {
                    serialIoManager.Open(usbManager);
                }
                catch (Java.IO.IOException e)
                {
                    MessageBox("Error opening device: " + e.Message);
                    return;
                }
            }
        }
        private async void StartReceiving()
        {
            if (App.UsbManager == null || App.PortInfo == null)
            {
                ToastService.ToastShortMessage(AppResources.No_Device);
                return;
            }

            var driver =
                await FindDriversService.GetSpecificDriverAsync(App.UsbManager,
                                                                App.PortInfo);

            if (driver != null)
            {
                _port = driver.Ports[App.PortInfo.PortNumber];
            }
            else
            {
                ToastService.ToastShortMessage(AppResources.No_Driver);
                return;
            }

            CurrentDeviceName = _port.GetType().Name;
            NotifyPropertyChanged(nameof(CurrentDeviceName));

            _serialIoManager = new SerialInputOutputManager(_port)
            {
                BaudRate = CurrentSettings.BaudRate,
                DataBits = CurrentSettings.DataBits,
                StopBits = CurrentSettings.StopBits,
                Parity   = CurrentSettings.Parity
            };
            _serialIoManager.DataReceived += (sender, e) =>
            {
                Device.BeginInvokeOnMainThread(() => { UpdateReceivedData(e.Data); });
            };
            _serialIoManager.ErrorReceived += (sender, e) =>
            {
                Device.BeginInvokeOnMainThread(() =>
                {
                    ToastService.ToastShortMessage(AppResources
                                                   .Received_Error);
                });
            };
            ToastService.ToastShortMessage(AppResources.Port_Listening);

            try
            {
                _serialIoManager.Open(App.UsbManager);
            }
            catch (Exception)
            {
                ToastService.ToastShortMessage(
                    $"{AppResources.Open_Failed}: {CurrentDeviceName}");
            }
            finally
            {
                NotifyPropertyChanged(nameof(PortCommand));
                NotifyPropertyChanged(nameof(PortStatus));
            }
        }
Example #4
0
        protected async override void OnResume()
        {
            base.OnResume();

            var portInfo   = Intent.GetParcelableExtra(EXTRA_TAG) as UsbSerialPortInfo;
            int vendorId   = portInfo.VendorId;
            int deviceId   = portInfo.DeviceId;
            int portNumber = portInfo.PortNumber;

            var drivers = await FindAllDriversAsync(usbManager);

            var driver = drivers.Where((d) => d.Device.VendorId == vendorId && d.Device.DeviceId == deviceId).FirstOrDefault();

            if (driver == null)
            {
                throw new Exception("Driver specified in extra tag not found.");
            }
            port = driver.Ports[portNumber];
            if (port == null)
            {
                bluetoothData1.Text = "No serial device.";
                return;
            }
            serialIoManager = new SerialInputOutputManager(port)
            {
                //BaudRate = 115200,
                BaudRate = 9600,
                DataBits = 8,
                StopBits = StopBits.One,
                Parity   = Parity.None,
            };

            serialIoManager.DataReceived += (sender, e) =>
            {
                RunOnUiThread(() =>
                {
                    UpdateReceivedData(e.Data);

                    if (received_data == 0)
                    {
                        received_data = 1;
                    }
                    if (buffer[0] >= 0)
                    {
                        receive_buffer[receive_buffer_counter] = buffer[0];                // (byte)nextByte;                 //Load them in the received_buffer array.
                    }
                    //Search for the start signature in the received data stream.
                    if (receive_byte_previous == 'J' && receive_buffer[receive_buffer_counter] == 'B')
                    {
                        receive_buffer_counter = 0;                                          //Reset the receive_buffer_counter counter if the start signature if found.
                        receive_start_detect++;                                              //Increment the receive_start_detect to check for a full data stream reception.
                        if (receive_start_detect >= 2)
                        {
                            Set_data();
                            latLongJMCdrone = new LatLng(-l_lat_gps / 1000000.0, -l_lon_gps / 1000000.0);
                            if (start == 0)
                            {
                                wayPointArray[0] = latLongJMCdrone;
                            }
                            if (home_gps_set == 0 && number_used_sats > minSats && start == 2)
                            {
                                home_gps_set     = 1;
                                home_lat_gps     = l_lat_gps;
                                home_lon_gps     = l_lon_gps;
                                homeLatLong      = new LatLng(-home_lat_gps / 1000000.0, -home_lon_gps / 1000000.0);
                                wayPointArray[0] = homeLatLong;
                            }
                            if (home_gps_set == 1 && start == 0)
                            {
                                home_gps_set = 0;
                            }
                            if (fixCameraHomePoint / fixCameraHomePointDivisor != 1 || boolDragEnd || floatingButton2_clicked || floatingButton3_clicked || floatingButton4_clicked || number_used_sats == 0 || flight_mode >= 5)
                            {
                                mapFragment.GetMapAsync(this);//update Map
                            }
                            if (number_used_sats == 0)
                            {
                                Toast.MakeText(this, "No GPS signal", ToastLength.Long).Show();
                                progressBar1.SetProgress(1 + myRandowInt.Next(2, 5), false);
                                fixCameraHomePointDivisor = 1;
                                fixCameraHomePoint        = 2;
                            }
                            if (number_used_sats > 0 && number_used_sats <= minSats)
                            {
                                progressBar1.SetProgress(number_used_sats * 7 + myRandowInt.Next(0, 5), false);
                                fixCameraHomePoint = 6;
                            }
                            if (number_used_sats > minSats)
                            {
                                fixCameraHomePoint = 7;

                                progressBar1.SetProgress(80 + myRandowInt.Next(5, 20), false);
                            }

                            if (flight_mode == 1)
                            {
                                bluetoothData1.Text = "1-Auto level";
                            }
                            if (flight_mode == 2)
                            {
                                bluetoothData1.Text = "2-Altitude hold";
                            }
                            if (flight_mode == 3)
                            {
                                bluetoothData1.Text = "3-GPS hold";
                            }
                            if (flight_mode == 4)
                            {
                                bluetoothData1.Text = "4-RTH active";
                            }
                            if (flight_mode == 5)
                            {
                                bluetoothData1.Text = "5-RTH I";                     //5-RTH Increase altitude
                            }
                            if (flight_mode == 6)
                            {
                                bluetoothData1.Text = "6-RTH R";                     //6-RTH Returning to home position
                            }
                            if (flight_mode == 7)
                            {
                                bluetoothData1.Text = "7-RTH L";                     //7-RTH Landing
                            }
                            if (flight_mode == 8)
                            {
                                bluetoothData1.Text = "8-RTH F";                     //8-RTH finished
                            }
                            if (flight_mode == 9)
                            {
                                bluetoothData1.Text = "9-Fly waypoint";
                            }

                            bluetoothData2.Text = (latLongJMCdrone.Latitude).ToString();
                            bluetoothData3.Text = (latLongJMCdrone.Longitude).ToString();
                            bluetoothData4.Text = number_used_sats.ToString();

                            bluetoothData5.Text       = start.ToString();
                            bluetoothData6.Text       = actual_compass_heading.ToString();
                            bluetoothData7.Text       = battery_voltage.ToString();
                            bluetoothData8.Text       = los_distance.ToString("0.") + " m";
                            fixCameraHomePointDivisor = fixCameraHomePoint;
                        }
                    }
                    else
                    {                                                                   //If there is no start signature detected.
                        receive_byte_previous = receive_buffer[receive_buffer_counter]; //Safe the current received byte for the next loop.
                        receive_buffer_counter++;                                       //Increment the receive_buffer_counter variable.
                        if (receive_buffer_counter > 48)
                        {
                            receive_buffer_counter = 0;                                         //Reset the receive_buffer_counter variable when it becomes larger than 38.
                        }
                    }

                    if (flight_mode == 9)
                    {
                        fixWayPoint = true;
                    }
                    if (flight_mode == 3 && fixWayPoint == false)
                    {
                        WriteData(send_buffer);
                    }
                    if (start == 2 && flight_mode == 3 && flyWayPointCounter <= addWayPointCounter + 1 && floatingButton3_clicked && fixWayPoint)
                    {
                        int latitude;
                        int longitude;
                        fixWayPoint = false;
                        flyWayPointCounter++;
                        floatingButton1.Hide();
                        floatingButton2.Hide();
                        floatingButton3.Hide();
                        floatingButton4.Hide();
                        if (flyWayPointCounter == addWayPointCounter + 1)
                        {  // +1 para retornar a origem !!!!
                            floatingButton3_clicked = false;
                            flyWayPointCounter      = 0;

                            floatingButton1.Show();
                            floatingButton2.Show();
                            floatingButton3.Show();
                            floatingButton4.Show();
                            latitude = (int)(homeLatLong.Latitude * 1000000.0);
                            if (latitude < 0)
                            {
                                latitude *= -1;               // deve ser um valor positivo// nao sei porque //deve ser por causa do sketch translatebyte do codigo arduino!!!!
                            }
                            longitude = (int)(homeLatLong.Longitude * 1000000.0);
                            if (longitude > 0)
                            {
                                longitude *= -1;                // deve ser um valor negativo// nao sei porque //deve ser por causa do sketch translatebyte do codigo arduino!!!!
                            }
                        }
                        else
                        {
                            latitude = (int)(wayPointArray[flyWayPointCounter].Latitude * 1000000.0);
                            if (latitude < 0)
                            {
                                latitude *= -1;               // deve ser um valor positivo// nao sei porque //deve ser por causa do sketch translatebyte do codigo arduino!!!!
                            }
                            longitude = (int)(wayPointArray[flyWayPointCounter].Longitude * 1000000.0);
                            if (longitude > 0)
                            {
                                longitude *= -1;                // deve ser um valor negativo// nao sei porque //deve ser por causa do sketch translatebyte do codigo arduino!!!!
                            }
                        }

                        send_buffer[0] = (byte)'W';
                        send_buffer[1] = (byte)'P';

                        send_buffer[5] = (byte)(latitude >> 24);
                        send_buffer[4] = (byte)(latitude >> 16);
                        send_buffer[3] = (byte)(latitude >> 8);
                        send_buffer[2] = (byte)latitude;

                        send_buffer[9] = (byte)(longitude >> 24);
                        send_buffer[8] = (byte)(longitude >> 16);
                        send_buffer[7] = (byte)(longitude >> 8);
                        send_buffer[6] = (byte)longitude;

                        send_buffer[10] = (byte)'-';
                        check_byte      = 0;
                        for (temp_byte = 2; temp_byte <= 10; temp_byte++)
                        {
                            check_byte ^= send_buffer[temp_byte];
                        }
                        send_buffer[11] = check_byte;
                        WriteData(send_buffer);
                    }
                });
            };
            serialIoManager.ErrorReceived += (sender, e) =>
            {
                RunOnUiThread(() =>
                {
                    var intent = new Intent(this, typeof(MainActivity));
                    StartActivity(intent);
                });
            };

            try
            {
                serialIoManager.Open(usbManager);
            }
            catch (Java.IO.IOException e)
            {
                bluetoothData1.Text = "Error opening device: " + e.Message;
                return;
            }
        }
        // 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"; });
                }
            }
        }