Меню на сенсорном tft экране

Тема в разделе "Arduino & Shields", создана пользователем arduin, 17 фев 2017.

  1. arduin

    arduin Нерд

    Всем добрый вечер.

    Проблема такая. Необходимо реализовать меню на сенсорном экране.

    Принцип работы следующий.
    1 Выводим блок кнопок меню.
    2 Нажимаем на кнопку и попадаем в Нужный блок.


    Сделал примерно так

    if( p.x > 300 && p.x < 320 && p.y > 85 && p.y < 155 && buttonEnabled)
    {
    buttonEnabled = false; //Disable button


    // Тут блок выбранного меню если при нажатии координаты совпали то зашли в блок
    }


    Теперь в этом блоке, либо не зависимо от блока выводить кнопкудля возврата на главный экран.

    Как мне вернуться назад?


    Пример кода,
    Код (C++):

    #include <Adafruit_TFTLCD.h>
    #include <Adafruit_GFX.h>  
    #include <TouchScreen.h>


    void setup() {
      Serial.begin(9600);
      tft.reset();
      tft.begin(0x7575);
      tft.setRotation(1);
      tft.fillScreen(BLACK);

    ///Кнопка  меню на  главной странице
      tft.setCursor(273,217);
      tft.setTextColor(WHITE);
      tft.setTextSize(3);
      tft.print("Страница меню 1");

    void loop()
    {
       TSPoint p = ts.getPoint();  //Get touch point
    if (p.z > ts.pressureThreshhold) {
     
      p.x = map(p.x, TS_MAXX, TS_MINX, 0, 320);
      p.y = map(p.y, TS_MAXY, TS_MINY, 0, 240);

      if(  p.x > 300 && p.x < 320    &&   p.y > 85 && p.y < 155  &&  buttonEnabled)
       {
       buttonEnabled = false; //Disable button
       pinMode(XM, OUTPUT);
       pinMode(YP, OUTPUT);
        tft.fillScreen(BLACK);
         tft.setCursor(50,50);
        tft.setTextColor(WHITE);
            tft.print("MENU 1 OK");
    // Теперь необходимо сделать возврат на предыдущую страницу, как это сделать?
    //Тоесть надо чтоб снова появился блок Страница меню 1


    }






    Все перепробовал, нужно сделать что то типа
    Код (C++):
    void softReset() {
      asm volatile ("jmp 0");
    }
     

    Спасибо всем за помощь.
     
  2. sslobodyan

    sslobodyan Гик

    Для красивой организации многоуровневых меню используют структуры, элементами которых выступают название пункта и указатель на процедуру, которая выполняется в момент активации данного пункта меню. Для не сложных менюшек прокатывает конечный автомат. Решение "в лоб", как у вас, чревато простыней кода и запутыванием логики. Погуглите вначале теорию конечных автоматов.
     
    arduin нравится это.
  3. arduin

    arduin Нерд

    Простое меню сделать я могу через swich либо if. Но это не очень красиво, вы правы. Хотя для одного двух уровней меню прокатит.

    Конечные автоматы почитаю, спасибо за совет.

    Только если можете подскажите как выйти из блока if обратно
    Может есть какая книга почитать по теме.

    Просто я с ардуиной начал в этом году.

    Раньше писал простые программки на PHP.
     
  4. sslobodyan

    sslobodyan Гик

    Из блока if можно выйти только по goto, но это очень не красивый метод. Обдумайте сначала весь алгоритм, я никогда не использую goto. Читать любые книги по С и алгоритмам, но практика - на первом месте.
     
    arduin нравится это.
  5. arduin

    arduin Нерд

    Про GOTO я уже понял, и еще про глобальные переменные и.тд.

    Про конечные автоматы я слышу впервые, хотя возможно я их использовал в PHP раньше, просто для меня они были обычным кодом или функциями.



    То есть получается что конечный автомат это процедура, или функция выбора необходимых задач в зависимости от того или иного условия.

    Для меня важно понять принцип работы того или иного кода, и только тогда я могу правильно действовать.

    Код можно сократить используя массивы данных, но с другой стороны множественные массивы будут еще больше путать начинающего.



    Для меня проще так.
    Код A Выводит меню на главный экран.

    На пример кнопки A,B,C,D
    Код B Выполняет Действие которое должно произойти при нажатии на любую из кнопок A,B,C,D



    По сути для меню можно использовать SWICH.
     
  6. sslobodyan

    sslobodyan Гик

    одна процедура отрисовывает кнопки в зависимости от их состояния. вторая сканирует тач и меняет это состояние кнопок. третья запускает нужный код в зависимости от состояния кнопок. все процедуры в лупе исполняются постоянно. это самый примитивный метод.
     
    arkadyf нравится это.