如何通过比较两个浮点值来识别onSensorChanged事件

问题描述 投票:0回答:1

我想从我的加速计传感器读取数据,并在第一个浮子数改变时进行比较。我有一些问题要取消注册监听器或暂停以便比较并查看平均值/ Note是否增加了一个完整的Int,例如“注意:5.677”增加到“注意:6.234”然后它应该被识别为事件。

我把它们变成了Ints,所以我可以检查它们是否相等。 我已经尝试使用Thread.Sleep延迟它并暂停但不起作用。也许是因为Lock(_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;

我的一个create():

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);
c# xamarin sensor
1个回答
1
投票

我将在这里处理一般方法。我会使用事件记录一个值,然后将新的值与最后一个值进行比较,而不是试图在事件中等待一些新数据。因此,函数外部将是一个变量,如:

private int previousValue;

然后,当调用该函数时,它将'new'值与前一个值进行比较:

public void OnSensorChanged(SensorEvent e)
{
    // Can't tell if this is required with information available
    lock (_syncLock)
    {
        // Capture the 'new' data to a local variable
        var newValue = e.Values.Average();

        if (newValue != previousValue)
        {
            // Value has changed by required amount so do something here
        }

        // Update the previous so next we we use this as our reference value
        previousValue = newValue;
}

这不是一个完整的解决方案,但应该是开发一个解决方案的更好的起点。

© www.soinside.com 2019 - 2024. All rights reserved.