Перейти к содержанию
    

Вопрос по uC/GUI + TouchScreen

Создаю экранную форму ввода данных (набор кнопок + поле EDIT) и столкнулся со следующими граблями:

1. Не возникает события WM_NOTIFY_PARENT с кодом WM_NOTIFICATION_RELEASED (в примерах обработка нажатий производится именно по этому коду). Ладно, пробую использовать код WM_NOTIFICATION_CLICKED - появляется другая проблема:

2. При повторных нажатиях на кнопку, имеющую фокус, событие WM_NOTIFICATION_CLICKED не формируется! Приглядевшись, обратил внимание,

что после нажатия на кнопку она остается в нажатом состоянии :wacko:

 

Прошу знатоков подсказать, что я не так делаю. В чем проблема - неправильное использование GUI или неправильный драйвер TouchScreen?

 

Код драйвера TouchScreen (4-выводной резистивный экран + SPI-АЦП):

void GUI_TOUCH_Exec(void)
{
   int_fast8_t     i;
   tRawDataArray   raw_data_x, raw_data_y;
   GUI_PID_STATE   state;
   uint16_t        x, y;
   int16_t         xMin, xMax;
   int16_t         yMin, yMax;


   xMin = xyMinMax[GUI_COORD_X].Min;
   xMax = xyMinMax[GUI_COORD_X].Max;
   yMin = xyMinMax[GUI_COORD_Y].Min;
   yMax = xyMinMax[GUI_COORD_Y].Max;

   GUI_TOUCH_GetState(&state);

   if (BSP_IS_TS_PRESSED() == true)
   {
       for (i = 0; i < 7; i++) // Take 7 readings of y-coord
       {
           raw_data_y[i] = Ssi_SerializeTsc(TSC_CHAN_YPOS | TSC_MODE_12BIT | TSC_REF_DF | TSC_INTREF_ON | TSC_PENIRQ_DISABLED) >> 8;
       }
       for (i = 0; i < 7; i++) // Take 7 readings of x-coord
       {
           raw_data_x[i] = Ssi_SerializeTsc(TSC_CHAN_XPOS | TSC_MODE_12BIT | TSC_REF_DF | TSC_INTREF_ON | TSC_PENIRQ_DISABLED) >> 8;
       }
       Ssi_SerializeTsc(TSC_CHAN_XPOS | TSC_MODE_8BIT | TSC_REF_DF | TSC_INTREF_OFF | TSC_PENIRQ_ENABLED); // Enable PEN IRQ


       yPhys = _MAVF(raw_data_y);    // Averaging (simplified median filter)
       xPhys = _MAVF(raw_data_x);    // Averaging (simplified median filter)


       // Convert adc values into logical values 
       #if !GUI_TOUCH_SWAP_XY   // Is X/Y swapped ? 
           x = xPhys;
           y = yPhys;
       #else
           x = yPhys;
           y = xPhys;
       #endif
       if ((x >= xMin) && (x <= xMax) && (y >= yMin) && (y <= yMax))
       {
           // Correct coordinates, storing them and set Pressed flag
           state.x = _AD2X(x);
           state.y = _AD2Y(y);
           state.Pressed = 1;
       }
   }
   else {
       state.Pressed = 0;
   }

   GUI_TOUCH_StoreStateEx(&state);
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вам нужны телепаты однако.

Все сигналы идут в GUI_X где юзер своими процедурами должен сам их разруливать под своей операционкой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все сигналы идут в GUI_X где юзер своими процедурами должен сам их разруливать под своей операционкой.

Причем здесь операционка? У меня вообще ее нет - WM_Exec() выполняется в бесконечном цикле.

Согласно документации для использования TouchScreen необходимо написать свою функцию GUI_TOUCH_Exec(), которая будет передавать состояние экрана, вызывая GUI_PID_StoreState(). Эта функция написана (см. пред. пост) и вызывается в прерывании с периодом 10 мс.

Проблема в том, что стандартный обработчик кнопок почему-то не отрабатывает отжатие.

Может надо еще что-то сделать? Буду признателен за любые предложения

 

Update:

Попробовал в своем драйвере не напрямую вызывать GUI_TOUCH_StoreStateEx, а через функцию _StoreUnstable() от стандартного драйвера аналогового экрана. Теперь кнопки работают нормально. Так что дело было в драйвере - буду изучать

Изменено пользователем Harvester

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Причем здесь операционка? У меня вообще ее нет - WM_Exec() выполняется в бесконечном цикле.

Согласно документации для использования TouchScreen необходимо написать свою функцию GUI_TOUCH_Exec(), ...

 

Ну так бы и сказали что работает с какой-то древней версией GUI.

В нынешней GUI функция GUI_TOUCH_Exec уже написана.

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну так бы и сказали что работает с какой-то древней версией GUI.

Ну, не знаю насколько древней - 3.98. Последняя, исходники которой смог найти. Если подскажете, где найти более свежие исходники - буду весьма признателен.

В нынешней GUI функция GUI_TOUCH_Exec уже написана.

В моей версии она тоже имеется, просто ее надо было доработать для использования драйвера тачскрина tsc2046

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...