Как синхронизировать начало объекта Counter с началом потока данных - PullRequest
0 голосов
/ 06 июля 2019

Что я пытаюсь сделать:

Я установил Thread в приложении для Android, которое постоянно считывает импульсы, полученные от Arduino. Каждый раз, когда импульс считывается, он добавляет 1 к переменной счетчика. Я хочу посчитать, сколько импульсов я получил за 1 секунду. На самом деле это измеритель скорости.

В чем проблема:

Если, например, частота импульсов, которые я посылаю, составляет 6 импульсов в секунду, мой счетчик не всегда считает 6, но и 5, даже если частота импульсов постоянна (пока я не настраиваю потензиометр) , Я полагаю, что единственная причина, по которой это происходит, когда у вас есть два устойчивых показателя, состоит в том, что они не в фазе. Если да, как мне синхронизировать эти два процесса?

Что я пробовал:

  1. Я попытался синхронизировать их, поместив .start () объекта Counter внутри оператора if, который срабатывает при получении первого импульса. Это не сработало.

    val t = Thread (Runnable {

    )
                    while (true) {
                        if (t_control == 1) { 
                            startbutton.setOnClickListener {
                                t_control = 2
                                startbutton.isEnabled = false
                                stopbutton.isEnabled = true
                            }
                            if (arduinoSocket!!.inputStream.read() >= 72) {
                                if (!isRunning) {
                                    timer.start()
                                    isRunning = true
                                }
                                sunolo_counter += 1
                                fores += 1
    
  2. Я принял тот факт, что синхронизировать процессы я не могу, поэтому я попытался изменить счетчик. Я бы добавил значение переменной Pulses (только если следующее значение> последнего, потому что мне нужно только максимальное значение) в список каждую секунду (onTick). На 5-й секунде я напечатал бы максимальное значение этого списка, потому что максимальное значение является самым точным (потому что это значение, которое мы имеем, когда два процесса находятся в фазе). На 5-й секунде (onFinish) я бы сбросил переменную списка и импульсов. Опять это не сработало. Я все еще получаю два значения, 6 и 5. Почему это? Это потому, что каждые 5 секунд мне приходится сбрасывать список. Это означает, что в следующем списке 6 может не достигаться счетчиком, поэтому он дает мне 5.

    val timer = object: CountDownTimer (5000, 1000) { переопределить веселье на галочке (millisUntilFinished: Long) { if (fores> fores_last) { max_list.add (Fores) fores_last = fores fores = 0 } еще { fores = 0 }

            }
            override fun onFinish() {
                taxutita_tv.text = max_list.max().toString()
                //taxutita_tv.text = fores.toString()
                max_list = mutableListOf(0)
                fores = 0
                fores_last = 0
                start()
            }
        }
    

Есть идеи? Спасибо.

...