Как распознать событие с помощью onSensorChanged, сравнив два значения с плавающей запятой - PullRequest
0 голосов
/ 01 апреля 2019

Я хочу прочитать данные с моего датчика акселерометра и сравнить их, если изменится первый номер поплавка.У меня есть некоторая проблема, чтобы отменить регистрацию слушателя или сделать паузу, чтобы сравнить и посмотреть, увеличилось ли среднее значение / Note на полный Int, например, «Примечание: 5.677» увеличилось до «Примечание: 6.234», после чего оно должно быть распознано как событие.,

Я преобразовал их в Ints, чтобы я мог проверить, равны они или нет.
Я уже пытался отложить его с помощью Thread.Sleep и приостановить, но не работает.Может быть из-за блокировки (_synlock)?

public void OnSensorChanged(SensorEvent e)
        {
            lock (_syncLock)
            {
                avg = e.Values.Average();
                _sensorTextView.Text = string.Format("x={0:f}, y={1:f}, z={2:f}", e.Values[0], e.Values[1], e.Values[2]);
                _sensorTextView2.Text = string.Format("Note: {0}", avg);
                note1 = e.Values.Average();

                //Thread.Sleep(500);
                //base.OnPause();
                //_sensorManager.UnregisterListener(this);
                //base.OnResume();
                //_sensorManager.RegisterListener(this, _sensorManager.GetDefaultSensor(SensorType.Accelerometer), SensorDelay.Ui);


                //_sensorTextView.Text = string.Format("x={0:f}, y={1:f}, z={2:f}", e.Values[0], e.Values[1], e.Values[2]);
                //avg = e.Values.Average();
                //_sensorTextView2.Text = string.Format("Note: {0}", avg);
                //note2 = e.Values.Average();
            }
            int noteInt1 = Convert.ToInt32(note1);
            int noteInt2 = Convert.ToInt32(note2);

            //Thread.Sleep(2000); "zeige alle 2 sekunden an" 
            List<double> eventnumbers = new List<double> { };
            if (noteInt1 != noteInt2)
                {
                avg = e.Values.Average();       
                //Console.WriteLine("bye");
                _sensorTextView2.Text = string.Format("Note: {0}", avg);
                //foreach(SensorEvent e){
                eventnumbers.Add(new double()); //Value of avg is the value of the eventnumber element
                eventnumbers.ForEach(Console.WriteLine);
                }

            }

ОБНОВЛЕНИЕ:

 public void OnSensorChanged(SensorEvent e)
        {
            lock (_syncLock)
            {
                _sensorTextView.Text = string.Format("x={0:f}, y={1:f}, y={2:f}", e.Values[0], e.Values[1], e.Values[2]);
                //_sensorTextView2.Text = string.Format("Note: {0}", e.Values.Average());
                avg = e.Values.Average();
            }
            eventCounter();
        }
        public void eventCounter()
        {

            eventnumbers.Add(avg);          //add number to our buffer
            Console.WriteLine(avg);

            eventnumbers.Add(avg+1);       //adding a number different of our first one to see if the method works    
            Console.WriteLine(avg+1);



            while (eventnumbers.Count >= 1)     //as long as two elements included
            {
                for (int puffer = 0; puffer <= 10; puffer++)    //buffer of 10 Elements
                {
                    for (int i = 0; i < eventnumbers.Count; i++)    //compare first number of our buffer
                    {
                        note1 = eventnumbers[i];    //remember value of first element
                        Console.WriteLine(note1);
                        Console.WriteLine("i ist:" + i);


                        for (int j = 1; j <= eventnumbers.Count; j++)   //with the second number of our buffer
                        {
                            Console.WriteLine("j ist:" + j);
                            note2 = eventnumbers[j];    //remember value of second element
                            Console.WriteLine(note2);
                        }
                    }
                        while (eventnumbers.Count >= 1) //as long as two elements included
                        {
                                try
                                {

                                    noteInt1 = Convert.ToInt32(note1);  //double to Int 
                                    noteInt2 = Convert.ToInt32(note2);

                                    if (noteInt1 != noteInt2) //we parse to int in order to compare if event has changed
                                    {
                                        _sensorTextView2.Text = string.Format("Note: {0}", avg); //if yes update our displaying mark/number
                                        eventcounters.Add(avg);                     //add element to elementcounter

                                    }
                                    break;              //
                                }

                                catch (System.ArgumentOutOfRangeException)      //for the case if there are less than 2 elements to compare
                                {
                                    eventcounters.ForEach(Console.WriteLine);   //return all marks(numbers) from our eventcounter

                                }
                                break;
                            } break;

                        }

                    //throw new NotImplementedException();
                }
                eventnumbers.Clear();
            }

Моя проблема в том, что я не получаю другое (другое) значение при вызове e.Value.Average ().Мне нужно сделать это вне метода и вызвать onSensorChanged в другой раз, но я не знаю, как это сделать, так как мне нужно создать другое событие, верно?вот почему я использовал e1 и e2, но я думаю, что я что-то упускаю с инициализацией, я думаю.

Вот как я пытался создать два события:

public class MainActivity : Activity, ISensorEventListener
    {
        static readonly object _syncLock = new Object();
        SensorManager _sensorManager;
        TextView _sensorTextView;
        TextView _sensorTextView2;
        double note1;
        double note2;
        double avg;
        SensorEvent e1;
        SensorEvent e2;

мой один создать():

protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            SetContentView(Resource.Layout.activity_main);
            _sensorManager = (SensorManager)GetSystemService(SensorService);
            _sensorTextView = FindViewById<TextView>(Resource.Id.accelerometer_text);
            _sensorTextView2 = FindViewById<TextView>(Resource.Id.accelerometer_note);
            e1 = (SensorEvent)GetSystemService(ISensorEventListener);
            e2 = (SensorEvent)GetSystemService(ISensorEventListener);
            displayMark();

ISensorEventListener помечен как неправильный между прочим

public void displayMark()
        {

            OnSensorChanged(e1);
            note1 = e1.Values.Average();

            OnSensorChanged(e2);
            note2 = e2.Values.Average();


            int noteInt1 = Convert.ToInt32(note1);
            int noteInt2 = Convert.ToInt32(note2);
            Console.WriteLine(noteInt1);
            Console.WriteLine(noteInt2);

            List<double> eventnumbers = new List<double> { };
            if (noteInt1 != noteInt2)
            {
                avg = e2.Values.Average();
                Console.WriteLine("bye");
                _sensorTextView2.Text = string.Format("Note: {0}", avg);
                //foreach(SensorEvent e){
                eventnumbers.Add(new double()); //Value of avg is the value of the eventnumber element
            }
            eventnumbers.ForEach(Console.WriteLine);

1 Ответ

1 голос
/ 01 апреля 2019

Я просто собираюсь разобраться с общим подходом здесь.Вместо того, чтобы ждать в событии каких-то новых данных, я использовал бы события, чтобы записать значение, а затем сравнить новое с последним.Таким образом, вне функции может быть переменная типаt полное решение, но должно стать лучшей отправной точкой для его разработки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...