Jump to content

    

Вопрос по 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);
}

 

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
Все сигналы идут в GUI_X где юзер своими процедурами должен сам их разруливать под своей операционкой.

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

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

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

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

 

Update:

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

Edited by Harvester

Share this post


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

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

 

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

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

 

 

 

Share this post


Link to post
Share on other sites
Ну так бы и сказали что работает с какой-то древней версией GUI.

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

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this