Harvester 0 27 января, 2011 Опубликовано 27 января, 2011 · Жалоба Создаю экранную форму ввода данных (набор кнопок + поле EDIT) и столкнулся со следующими граблями: 1. Не возникает события WM_NOTIFY_PARENT с кодом WM_NOTIFICATION_RELEASED (в примерах обработка нажатий производится именно по этому коду). Ладно, пробую использовать код WM_NOTIFICATION_CLICKED - появляется другая проблема: 2. При повторных нажатиях на кнопку, имеющую фокус, событие WM_NOTIFICATION_CLICKED не формируется! Приглядевшись, обратил внимание, что после нажатия на кнопку она остается в нажатом состоянии Прошу знатоков подсказать, что я не так делаю. В чем проблема - неправильное использование 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); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 3 27 января, 2011 Опубликовано 27 января, 2011 · Жалоба Вам нужны телепаты однако. Все сигналы идут в GUI_X где юзер своими процедурами должен сам их разруливать под своей операционкой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Harvester 0 28 января, 2011 Опубликовано 28 января, 2011 (изменено) · Жалоба Все сигналы идут в GUI_X где юзер своими процедурами должен сам их разруливать под своей операционкой. Причем здесь операционка? У меня вообще ее нет - WM_Exec() выполняется в бесконечном цикле. Согласно документации для использования TouchScreen необходимо написать свою функцию GUI_TOUCH_Exec(), которая будет передавать состояние экрана, вызывая GUI_PID_StoreState(). Эта функция написана (см. пред. пост) и вызывается в прерывании с периодом 10 мс. Проблема в том, что стандартный обработчик кнопок почему-то не отрабатывает отжатие. Может надо еще что-то сделать? Буду признателен за любые предложения Update: Попробовал в своем драйвере не напрямую вызывать GUI_TOUCH_StoreStateEx, а через функцию _StoreUnstable() от стандартного драйвера аналогового экрана. Теперь кнопки работают нормально. Так что дело было в драйвере - буду изучать Изменено 28 января, 2011 пользователем Harvester Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 3 28 января, 2011 Опубликовано 28 января, 2011 · Жалоба Причем здесь операционка? У меня вообще ее нет - WM_Exec() выполняется в бесконечном цикле. Согласно документации для использования TouchScreen необходимо написать свою функцию GUI_TOUCH_Exec(), ... Ну так бы и сказали что работает с какой-то древней версией GUI. В нынешней GUI функция GUI_TOUCH_Exec уже написана. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Harvester 0 31 января, 2011 Опубликовано 31 января, 2011 · Жалоба Ну так бы и сказали что работает с какой-то древней версией GUI. Ну, не знаю насколько древней - 3.98. Последняя, исходники которой смог найти. Если подскажете, где найти более свежие исходники - буду весьма признателен. В нынешней GUI функция GUI_TOUCH_Exec уже написана. В моей версии она тоже имеется, просто ее надо было доработать для использования драйвера тачскрина tsc2046 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться