реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Вопрос по uC/GUI + TouchScreen, Работа с виджетом BUTTON
Harvester
сообщение Jan 27 2011, 13:40
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846



Создаю экранную форму ввода данных (набор кнопок + поле EDIT) и столкнулся со следующими граблями:
1. Не возникает события WM_NOTIFY_PARENT с кодом WM_NOTIFICATION_RELEASED (в примерах обработка нажатий производится именно по этому коду). Ладно, пробую использовать код WM_NOTIFICATION_CLICKED - появляется другая проблема:
2. При повторных нажатиях на кнопку, имеющую фокус, событие WM_NOTIFICATION_CLICKED не формируется! Приглядевшись, обратил внимание,
что после нажатия на кнопку она остается в нажатом состоянии wacko.gif

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

Код драйвера TouchScreen (4-выводной резистивный экран + SPI-АЦП):
CODE
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);
}



--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Jan 27 2011, 18:06
Сообщение #2


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Вам нужны телепаты однако.
Все сигналы идут в GUI_X где юзер своими процедурами должен сам их разруливать под своей операционкой.
Go to the top of the page
 
+Quote Post
Harvester
сообщение Jan 28 2011, 06:13
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846



Цитата(AlexandrY @ Jan 27 2011, 21:06) *
Все сигналы идут в GUI_X где юзер своими процедурами должен сам их разруливать под своей операционкой.

Причем здесь операционка? У меня вообще ее нет - WM_Exec() выполняется в бесконечном цикле.
Согласно документации для использования TouchScreen необходимо написать свою функцию GUI_TOUCH_Exec(), которая будет передавать состояние экрана, вызывая GUI_PID_StoreState(). Эта функция написана (см. пред. пост) и вызывается в прерывании с периодом 10 мс.
Проблема в том, что стандартный обработчик кнопок почему-то не отрабатывает отжатие.
Может надо еще что-то сделать? Буду признателен за любые предложения

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

Сообщение отредактировал Harvester - Jan 28 2011, 06:28


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Jan 28 2011, 13:20
Сообщение #4


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(Harvester @ Jan 28 2011, 08:13) *
Причем здесь операционка? У меня вообще ее нет - WM_Exec() выполняется в бесконечном цикле.
Согласно документации для использования TouchScreen необходимо написать свою функцию GUI_TOUCH_Exec(), ...


Ну так бы и сказали что работает с какой-то древней версией GUI.
В нынешней GUI функция GUI_TOUCH_Exec уже написана.


Go to the top of the page
 
+Quote Post
Harvester
сообщение Jan 31 2011, 06:16
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846



Цитата(AlexandrY @ Jan 28 2011, 16:20) *
Ну так бы и сказали что работает с какой-то древней версией GUI.

Ну, не знаю насколько древней - 3.98. Последняя, исходники которой смог найти. Если подскажете, где найти более свежие исходники - буду весьма признателен.
Цитата(AlexandrY @ Jan 28 2011, 16:20) *
В нынешней GUI функция GUI_TOUCH_Exec уже написана.

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


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 16:43
Рейтинг@Mail.ru


Страница сгенерированна за 0.01391 секунд с 7
ELECTRONIX ©2004-2016