STM Урок 72. Touch panel FT5336. Часть 4



 

Урок 72

 

Часть 4

 

Touch panel FT5336

 

В предыдущей части занятия мы добавили две интересные функции сбора координат и другой информации действий с TS и воспользовались ими в функции определения статуса.

 

Займёмся теперь жестами. Хотя мне и не удалось их идентифицировать, но тем не менее код мы напишем, так сказать, для использования в будущем в программировании других устройств.

Добавим функцию считывания идентификатора жеста после функции TS_GetXY

 

//----------------------------------------

uint8_t TS_Get_GestureId(TS_StateTypeDef *TS_State)

{

  uint32_t gestureId = 0;

  uint8_t ts_status = TS_OK;

}

//----------------------------------------

 

Теперь добавим ещё одну функцию считывания идентификатора жеста — более низкоуровневую, привязанную именно к нашей микросхеме после функции TS_IO_Write

 

//----------------------------------------

void ft5336_TS_GetGestureID(uint16_t DeviceAddr, uint32_t * pGestureId)

{

  volatile uint8_t ucReadData = 0;

  ucReadData = TS_IO_Read(DeviceAddr, FT5336_GEST_ID_REG);

  *pGestureId = ucReadData;

}

//----------------------------------------

 

Вернёмся в фунцию TS_Get_GestureId и вызовем функцию ft5336_TS_GetGestureID

 

  uint8_t ts_status = TS_OK;

  ft5336_TS_GetGestureID(TS_I2C_ADDRESS, &gestureId);

}

 

Перейдём в файл ft5336.h и добавим перечисление идентификаторов жестов TS

 

} TS_TouchEventTypeDef;

//------------------------------------------

typedef enum

{

  GEST_ID_NO_GESTURE = 0x00, /*!< Gesture not defined / recognized */

  GEST_ID_MOVE_UP = 0x01, /*!< Gesture Move Up */

  GEST_ID_MOVE_RIGHT = 0x02, /*!< Gesture Move Right */

  GEST_ID_MOVE_DOWN = 0x03, /*!< Gesture Move Down */

  GEST_ID_MOVE_LEFT = 0x04, /*!< Gesture Move Left */

  GEST_ID_ZOOM_IN = 0x05, /*!< Gesture Zoom In */

  GEST_ID_ZOOM_OUT = 0x06, /*!< Gesture Zoom Out */

  GEST_ID_NB_MAX = 0x07 /*!< max number of gesture id */

} TS_GestureIdTypeDef;

//------------------------------------------

 

Вернёмся в файл ft5336.c в функцию ft5336_TS_GetGestureID и запишем идентификатор в соответствующее поле статуса, а затем возвратим его из функции

 

  ft5336_TS_GetGestureID(TS_I2C_ADDRESS, &gestureId);

  switch(gestureId)

  {

    case FT5336_GEST_ID_NO_GESTURE :

      TS_State->gestureId = GEST_ID_NO_GESTURE;

      break;

    case FT5336_GEST_ID_MOVE_UP :

      TS_State->gestureId = GEST_ID_MOVE_UP;

      break;

    case FT5336_GEST_ID_MOVE_RIGHT :

      TS_State->gestureId = GEST_ID_MOVE_RIGHT;

      break;

    case FT5336_GEST_ID_MOVE_DOWN :

      TS_State->gestureId = GEST_ID_MOVE_DOWN;

      break;

    case FT5336_GEST_ID_MOVE_LEFT :

      TS_State->gestureId = GEST_ID_MOVE_LEFT;

      break;

    case FT5336_GEST_ID_ZOOM_IN :

      TS_State->gestureId = GEST_ID_ZOOM_IN;

      break;

    case FT5336_GEST_ID_ZOOM_OUT :

      TS_State->gestureId = GEST_ID_ZOOM_OUT;

      break;

    default :

      ts_status = TS_ERROR;

      break;

  } /* of switch(gestureId) */

  return(ts_status);

}

 

Функция готова. Перейдём в функцию TS_GetState и после выхода из цикла for (не из условия) вызовем её

 

        break;

      }

    }

  ts_status = TS_Get_GestureId(TS_State);

  }

}

 

Теперь выйдем из условия и возвратим статус выполнения функции

 

    ts_status = TS_Get_GestureId(TS_State);

  }

  return (ts_status);

}

 

В функции main() и добавим локальные переменные для координат

 

uint16_t i,j;

uint16_t x=0, y=0;

 

Продолжим в бесконечном цикле писать наш тест.

 

 

Запишем в только что созданные переменные координаты в первом теле условия

 

if(TS_State.touchDetected)

{

  x = TS_State.touchX[0];

  y = TS_State.touchY[0];

}

 

Как раз вот в этом месте можно вносить поправки для калибровки в случае неточной установки TS на экран.

Настроим шрифт и его цвета в этом же теле

 

y = TS_State.touchY[0];

TFT_SetFont(&Font20);

TFT_SetTextColor(LCD_COLOR_CYAN);

TFT_SetBackColor(LCD_COLOR_BLACK);

 

Добавим три локальных массива в main()

 

uint16_t x=0, y=0;

static uint32_t tscnt[5]={0};

static uint16_t xstart[5]={0}, ystart[5]={0};

 

Они потребуются нам для рисования линий с помощью TS.

 

 

Вернёмся в бесконечный цикл в тело условия и нарисуем точку в случае первого прикосновения первым пальцем к экрану, а если это будет уже не первое прикосновение (то есть перед следующим прикосновением палец с экрана не снимался), то нарисуем линию

 

TFT_SetBackColor(LCD_COLOR_BLACK);

if(tscnt[0]>0)

{

  TFT_DrawLine(xstart[0],ystart[0],x,y,LCD_COLOR_RED);

}

else

{

  TFT_DrawPixel(x,y,LCD_COLOR_RED);

}

 

В принципе, можно собрать код и запустить его. Мы пока можем проверить только точки. Линии у нас не будут рисоваться, так как счёчик ещё не инкрементировали и его значение всегда 0. Поиграв с экраном, мы должны получить вот такую картину

 

image06

 

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

 

    TFT_DrawPixel(x,y,LCD_COLOR_RED);

  }

  xstart[0]=x; ystart[0]=y;

  tscnt[0]++;

  sprintf(str1,"1: x=%03d; y=%03d",x,y);

  TFT_DisplayString(14, 50, (uint8_t *)str1, LEFT_MODE);

}

 

Ещё раз соберём код и запустим на выполнение, чтобы посмотреть, как обновляются значения координат

 

image07

 

Теперь наши координаты динамически обновляются на экране. Также и линия тоже рисуется, только после убирания пальца и дальнейшем его прикосновении к экрану рисуется не новая точка, а прямая линия от предыдущей координаты. Можно оставить и так, но мы лучше в соответствующем месте всё-таки обнулим наш счётчик. Сделаем мы это во втором теле (в противном) нашего условия обнаружения действия. Причём обнулим мы все 5 счётчиков

 

  TFT_DisplayString(14, 50, (uint8_t *)str1, LEFT_MODE);

}

else

{

  tscnt[0]=0; tscnt[1]=0; tscnt[2]=0; tscnt[3]=0; tscnt[4]=0;

}

HAL_Delay(10);

 

Ещё раз соберём и выполним код, посмотрев затем результат нашей добавленной операции обнуления

 

image08

 

Теперь другое дело.

Вернёмся в первое (истинное) тело нашего цикла обнаружения и продолжим там писать код. Нам также нужно проделать всё это для остальных четырёх пальцев.

Исследуя соответствующее поле структуры, мы это и проделаем, также если нет прикосновения другими пальцами к экрану (за исключением первого), мы будем затирать их координаты чёрным прямоугольником

 

code

  TFT_DisplayString(14, 50, (uint8_t *)str1, LEFT_MODE);

  if (TS_State.touchDetected >= 2)

  {

    x = TS_State.touchX[1];

    y = TS_State.touchY[1];

    if(tscnt[1]>0)

    {

      TFT_DrawLine(xstart[1],ystart[1],x,y,LCD_COLOR_GREEN);

    }

    else

    {

      TFT_DrawPixel(x,y,LCD_COLOR_GREEN);

    }

    xstart[1]=x; ystart[1]=y;

    tscnt[1]++;

    sprintf(str1, "2: x=%03d; y=%03d", x, y);

    TFT_DisplayString(14, 80, (uint8_t *)str1, LEFT_MODE);

  }

  else

  {

    TFT_FillRectangle(14,80,250,109,LCD_COLOR_BLACK);

  }

  if (TS_State.touchDetected >= 3)

  {

    x = TS_State.touchX[2];

    y = TS_State.touchY[2];

    if(tscnt[2]>0)

    {

      TFT_DrawLine(xstart[2],ystart[2],x,y,LCD_COLOR_YELLOW);

    }

    else

    {

      TFT_DrawPixel(x,y,LCD_COLOR_YELLOW);

    }

    xstart[2]=x; ystart[2]=y;

    tscnt[2]++;

    sprintf(str1, "3: x=%03d; y=%03d", x, y);

    TFT_DisplayString(14, 110, (uint8_t *)str1, LEFT_MODE);

  }

  else

  {

    TFT_FillRectangle(14,110,250,139,LCD_COLOR_BLACK);

  }

  if (TS_State.touchDetected >= 4)

  {

    x = TS_State.touchX[3];

    y = TS_State.touchY[3];

    if(tscnt[3]>0)

    {

      TFT_DrawLine(xstart[3],ystart[3],x,y,LCD_COLOR_ORANGE);

    }

    else

    {

      TFT_DrawPixel(x,y,LCD_COLOR_ORANGE);

    }

    xstart[3]=x; ystart[3]=y;

    tscnt[3]++;

    sprintf(str1, "4: x=%03d; y=%03d", x, y);

    TFT_DisplayString(14, 140, (uint8_t *)str1, LEFT_MODE);

  }

  else

  {

    TFT_FillRectangle(14,140,250,169,LCD_COLOR_BLACK);

  }

  if (TS_State.touchDetected >= 5)

  {

    x = TS_State.touchX[4];

    y = TS_State.touchY[4];

    if(tscnt[4]>0)

    {

      TFT_DrawLine(xstart[4],ystart[4],x,y,LCD_COLOR_BLUE);

    }

    else

    {

      TFT_DrawPixel(x,y,LCD_COLOR_BLUE);

    }

    xstart[4]=x; ystart[4]=y;

    tscnt[4]++;

    sprintf(str1, "5: x=%03d; y=%03d", x, y);

    TFT_DisplayString(14, 170, (uint8_t *)str1, LEFT_MODE);

  }

  else

  {

    TFT_FillRectangle(14,170,250,199,LCD_COLOR_BLACK);

  }

}

 

Ну вот и весь наш тест. Проверим его, собрав код и запустив его

 

image09

 

В данном уроке мы справились со считыванием показаний с панели TouchScreen отладочной платы STM32F746G-DISCO и теперь, используя это, а также накопленные знания из уроков по игтерфейсу LTDC, писать уже какой-то осознанный код по визуализации и управлению какими-то процессами.

Всем спасибо за внимание!

В дальнейших уроках нас ждёт ещё много интересного!

 

 

Предыдущая часть Программирование МК STM32 Следующий урок

 

 

Исходный код

 

 

Техническая документация на драйвер TS FT5336

 

 

Отладочную плату можно приобрести здесь 32F746G-DISCOVERY

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

STM Touch panel FT5336

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*