LinkedIn YouTube Facebook
Szukaj

Newsletter

Proszę czekać.

Dziękujemy za zgłoszenie!

Wstecz
Artykuły

[2] Bezpłatna biblioteka graficzna Microchip Graphics Library dla mikrokontrolerów PIC24 i PIC32: przykłady

List. 9. Struktura GOL_MSG

	typedef struct {
        BYTE         type;
        BYTE         uiEvent;
        int          param1;
        int          param2;
    } GOL_MSG;

Type – definiuje typ urządzenia w którym wygenerowane wiadomość (message). Możliwe typy urządzeń, to: TYPE_UNKNOW, TYPE_KEYBOARD, TYPE_TOUCHSCREEN i TYPE_MOUSE

uiEvent- rodzaj zdarzenia generowanego przez obiekt: EVENT_INVALID (zdarzenie błędne), EVENT_MOVE(przesunięcie), EVENT_PRESS(naciśnięcie), EVENT_STILLPRESS(ciągłe naciskanie), EVENT_RELEASE(zwolnienie), EVENT_KEYSCAN(skanowanie stanów klawiszy), EVENT_CHARCODE.

Definicja składowych param1 i param2 jest zależna od typu urządzenia. Na przykład dla ekranów dotykowych TYPE_TOUCHSCREEN zawierają współrzędne x,y , a dla typu TYPE_KEYBOARD param1 zawiera ID obiektu, a param2 znak kodu klawisza.

  • Wewnątrz funkcji GOLMsg z wskaźnikiem do struktury GOL_MSG jako argumentem  (listing 10) jest wykonywana pętla wykrywająca obiekt generujący wiadomość.
  • Wykryty obiekt zwraca przekonwertowaną wiadomość w oparciu o parametry GOL Messager.
  • Użytkownik może zmienić domyślną akcję zdefiniowaną przez bibliotekę w  funkcji GOLMsgCallBack.
  • Po wykonaniu akcji obiekt powinien być narysowany ponownie w zależności od swojego nowego stanu.

 

List. 10. Funkcja GOLMsg

void GOLMsg(GOL_MSG *pMsg)

void GOLMsg(GOL_MSG *pMsg)
{
    OBJ_HEADER  *pCurrentObj;
    WORD        translatedMsg;

    if(pMsg->uiEvent == EVENT_INVALID)
        return;

    pCurrentObj = _pGolObjects;

    while(pCurrentObj != NULL)
    {
        if(pCurrentObj->MsgObj)
        {
            translatedMsg = pCurrentObj->MsgObj(pCurrentObj, pMsg);

            if(translatedMsg != OBJ_MSG_INVALID)
            {
                if(GOLMsgCallback(translatedMsg, pCurrentObj, pMsg))
                    if(pCurrentObj->MsgDefaultObj)
                        pCurrentObj->MsgDefaultObj(translatedMsg, pCurrentObj, pMsg);
            }
        }

        pCurrentObj = (OBJ_HEADER *)pCurrentObj->pNxtObj;
    }
}

Na listingu 11 pokazano pętlę, w której jest wywoływana funkcja GOLDraw, w której są  sprawdzane stany obiektów i ewentualnie wykonywane jest rysowanie, sprawdzane jest czy z drivera ekranu dotykowego nie jest przesłana informacja (message) o nie wykonanej akcji (funkcja TouchGetMsg) i na końcu na podstawie  tej informacji funkcja GOLMsg interpretuje ta wiadomość i przekazuje sterowanie do funkcji GOLMsgCallback (listing 12).

 

List. 11. Funkcja GOLMsgCallback

while(1)
    {
        if(GOLDraw())               // Rysuje obiekt z warstwy Obejct layer (GOL)
        {
            TouchGetMsg(&msg);      // odbierz  informacje (message) z panelu dodtykowego			
            GOLMsg(&msg);           
}
    }//end while

List. 12. Pętla obsługi graficznego interfejsu użytkownika

Przed wywołaniem tej pętli wszystkie używane  obiekty graficzne muszą być utworzone.

Przed wywołaniem tej pętli wszystkie używane  obiekty graficzne muszą być utworzone. 

WORD GOLMsgCallback(WORD objMsg, OBJ_HEADER *pObj, GOL_MSG *pMsg)
{
    WORD    objectID;

    objectID = GetObjID(pObj);

    GDDDemoGOLMsgCallback(objMsg, pObj, pMsg);  //funkcja obsługi zdarzeń z obiektów 
    
    // Tutaj można dodać dodatkowy kod użytkownika ...

    return (1);
}

Pobranie informacji o wykonanej akcji przez użytkownika z wykorzystaniem ekranu dotykowego wykonuje funkcja TouchGetMsg (listing 13). Zależnie od odczytanych współrzędnych x i y oraz poprzednio odczytanych współrzędnych prevX i prevY jest modyfikowana składowa uiEvent struktury GOL_MSG.

 

List. 13. Funkcja odczytu wiadomości (message) z interfejsu ekranu dotykowego

void TouchGetMsg(GOL_MSG *pMsg)
{
    static SHORT    prevX = -1;
    static SHORT    prevY = -1;

    SHORT           x, y;

    x = TouchGetX();
    y = TouchGetY();
    pMsg->type = TYPE_TOUCHSCREEN;
    pMsg->uiEvent = EVENT_INVALID;

    if((x == -1) || (y == -1))
    {
        y = -1;
        x = -1;
    }

    if((prevX == x) && (prevY == y) && (x != -1) && (y != -1))
    {
        pMsg->uiEvent = EVENT_STILLPRESS;
        pMsg->param1 = x;
        pMsg->param2 = y;
        return;
    }

    if((prevX != -1) || (prevY != -1))
    {
        if((x != -1) && (y != -1))
        {

            // Move
            pMsg->uiEvent = EVENT_MOVE;
        }
        else
        {

            // Released
            pMsg->uiEvent = EVENT_RELEASE;
            pMsg->param1 = prevX;
            pMsg->param2 = prevY;
            prevX = x;
            prevY = y;
            return;
        }
    }
    else
    {
        if((x != -1) && (y != -1))
        {

            // Pressed
            pMsg->uiEvent = EVENT_PRESS;
        }
        else
        {

            // No message
            pMsg->uiEvent = EVENT_INVALID;
        }
    }

    pMsg->param1 = x;
    pMsg->param2 = y;
    prevX = x;
    prevY = y;
}
Absolwent Wydziału Elektroniki Politechniki Wrocławskiej, współpracownik miesięcznika Elektronika Praktyczna, autor książek o mikrokontrolerach Microchip i wyświetlaczach graficznych, wydanych nakładem Wydawnictwa BTC. Zawodowo zajmuje się projektowaniem zaawansowanych systemów mikroprocesorowych.