MEMS-owa poziomica z sensorem LIS35 na STM32
Dosyć skomplikowana wydawać się może poniższa funkcja, która ma za zadanie w miejsce wcześniej narysowanego bąbelka powietrza przerysować wycinek z tła poziomicy, aby wyczyścić ekran.
void TFTN_WriteBall(const unsigned short *buffer, const unsigned short *bufferball, int xPos, int yPos, int xSize, int ySize)
Można by przerysowywać całą bitmapę tła ale strasznie długo to trwa, dlatego odświeżana jest tylko używana część ekranu. Funkcja przyjmuje następujące parametry:
*buffer – wskaźnik do tablicy z tłem poziomicy
*bufferball – wskaźnik do tablicy z rysunkiem stalowej kulki
xPos oraz yPos – to pozycja wspomnianej kuleczki na tle
xSize oraz ySize – określa wymiar bitmapy kulki do wyświetlenia.
Sama funkcja wygląda następująco:
void TFTN_WriteBall(const unsigned short *buffer, const unsigned short *bufferball, int xPos, int yPos, int xSize, int ySize) { //Draw bitmap unsigned short Word0,Word1; unsigned short x=0,y=0; // Set column address range TFTN_SendCmd(CASET); TFTN_SendData(xPoss); TFTN_SendData(xPoss+xSize-1); // Set row address range TFTN_SendCmd(PASET); TFTN_SendData(yPoss); TFTN_SendData(yPoss+ySize-1); // Write memory TFTN_SendCmd(RAMWR); //Przerysowanie w miejscu starej kulki tla poziomicy for(y=0;y> 4) & 0xFF); //pixel 1 B, pixel 2 R TFTN_SendData(((Word0 & 0x0F) << 4) | ((Word1 >> 8) & 0xF)); TFTN_SendData( Word1 & 0xFF); } } TFTN_SendCmd(NOP); // Set column address range TFTN_SendCmd(CASET); TFTN_SendData(xPos); TFTN_SendData(xPos+xSize-1); // Set row address range TFTN_SendCmd(PASET); TFTN_SendData(yPos); TFTN_SendData(yPos+ySize-1); // Write memory TFTN_SendCmd(RAMWR); //Rysowanie kulki for(y=0;y > 4) & 0xFF); //pixel 1 B, pixel 2 R TFTN_SendData(((Word0 & 0x0F) << 4) | ((Word1 >> 8) & 0xF)); TFTN_SendData( Word1 & 0xFF); } } //Zapamietaj stara pozycje kulki xPoss=xPos; yPoss=yPos; TFTN_SendCmd(NOP); }
W miejscu wyznaczonym przez akcelerometr rysowana zostaje bitmapa kulki z tym, że kolor czarny nie jest renderowany, a na jego miejsce jest przerysowywana piksel po pikselu bitmapa tła, aby kulka wyglądała profesjonalnie a nie jako kwadrat z rysunkiem kuli.
W momencie gdy uzyskamy poziom w osi x oraz y, kulka znajdzie się w środku najmniejszego okręgu narysowanego na tle, a buzzer wyda dźwięk informując nas dodatkowo o tym fakcie. Jako że bitmapa kulki jest na przemian usuwana oraz przerysowywana na nowo uzyskujemy efekt przeźroczystości, i zwykła bitmapa uzyskuje efekt bąbelka powietrza w wodzie.