Например TDA7294

Форум РадиоКот • Просмотр темы - Удержание кнопки пульта и повтор кода NEC
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Сб апр 19, 2025 14:45:16

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Удержание кнопки пульта и повтор кода NEC
СообщениеДобавлено: Ср мар 26, 2025 19:11:45 
Родился

Зарегистрирован: Ср мар 26, 2025 19:00:57
Сообщений: 1
Рейтинг сообщения: 0
Привет. Хочу отправить инфракрасный сигнал пульта ДУ на CD-плеер, с помощью java. Проблема в том, что функция удержания кнопки не работает. У этой кнопки двойная функция. При однократном нажатии она переключает трек CD-плеера LG, а при удержании кнопки она перематывает трек. Делаю это для протокола NEC. Вот мой код. Буду очень благодарен за помощь!

P.S. Информации которую нашел об этом
https://www.sbprojects.net/knowledge/ir/nec.php

Код:
public class MainActivity extends Activity {
    private ConsumerIrManager irManager;
    private Handler handler = new Handler();
    private boolean isHolding = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        irManager = (ConsumerIrManager) getSystemService(CONSUMER_IR_SERVICE);

        // Устанавливаем обработчики для всех кнопок
        setupButton(R.id.powerButton, 0x08087887, false);
        setupButton(R.id.sleepButton, 0x080843BC, false);
        setupButton(R.id.eqButton, 0x080802FD, false);
        setupButton(R.id.upButton, 0x080848B7, false);
        setupButton(R.id.downButton, 0x0808C837, false);
        setupButton(R.id.bandButton, 0x08089A65, false);
        setupButton(R.id.playPauseButton, 0x080820DF, false);
        setupButton(R.id.stopButton, 0x0808A05F, false);
        setupButton(R.id.progButton, 0x0808B24D, false);
        setupButton(R.id.prevButton, 0x0808609F, false);
        setupButton(R.id.nextButton, 0x0808E01F, true);
        setupButton(R.id.repeatButton, 0x0808728D, false);
        setupButton(R.id.volUpButton, 0x08086897, true);
        setupButton(R.id.volDownButton, 0x0808E817, true);
    }

    private void setupButton(int buttonId, final int necCode, boolean isHoldable) {
      Button button = findViewById(buttonId);
      if (button != null) {
         button.setOnClickListener(new View.OnClickListener() {
               @Override
               public void onClick(View v) {
                  sendIrSignal(necCode);
               }
            });

         if (isHoldable) {
            button.setOnTouchListener(new View.OnTouchListener() {
                  @Override
                  public boolean onTouch(View v, android.view.MotionEvent event) {
                     switch (event.getAction()) {
                        case android.view.MotionEvent.ACTION_DOWN:
                           isHolding = true;
                           sendIrSignal(necCode);  // Первая передача при нажатии
                           startHoldingSignal(necCode);  // Запуск повторных сигналов при удержании
                           return true;

                        case android.view.MotionEvent.ACTION_UP:
                           isHolding = false;
                           handler.removeCallbacksAndMessages(null);  // Остановка повторных сигналов
                           return true;
                     }
                     return false;
                  }
               });
         }
      }
   }

   private void startHoldingSignal(final int necCode) {
      handler.postDelayed(new Runnable() {
            @Override
            public void run() {
               if (isHolding) {
                  sendHoldingSignal();  // Отправка повторного сигнала
                  handler.postDelayed(this, 110);  // Повтор через 110 мс
               }
            }
         }, 110);  // Начало через 110 мс после первого сигнала
   }

   private void sendIrSignal(int necCode) {
      irManager.transmit(38000, encodeNEC(necCode));  // Первая передача сигнала
   }

   private void sendHoldingSignal() {
      // Передача повторного сигнала (9мс, 2.25мс, 0.5625мс)
      int[] signal = new int[] {9000, 2250, 562};  // Импульс 9 мс, пауза 2.25 мс, импульс 0.5625 мс
      irManager.transmit(38000, signal);  // Отправка повторного сигнала
   }

   private int[] encodeNEC(int necCode) {
      int[] encodedSignal = new int[68];
      int i = 0;

      // Начало сигнала (9 мс, 4.5 мс пауза)
      encodedSignal[i++] = 9000;  // 9 мс
      encodedSignal[i++] = 4500;  // 4.5 мс пауза

      // Адрес и инверсия (27 мс для каждого бита)
      for (int bit = 31; bit >= 0; bit--) {
         if ((necCode & (1 << bit)) != 0) {
            encodedSignal[i++] = 560;  // 27 мс для бита 1
            encodedSignal[i++] = 1690; // 27 мс для бита 1
         } else {
            encodedSignal[i++] = 560;  // 27 мс для бита 0
            encodedSignal[i++] = 560;  // 27 мс для бита 0
         }
      }

      // Конец сигнала (широкая пауза)
      encodedSignal[i++] = 560;
      encodedSignal[i++] = 39416;  // Пауза на завершение

      return encodedSignal;
   }
}


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y