Aplikacje biblioteki STM32 Embedded GUI: miniPaint na STM32F4DISCOVERY
Tworzenie i wyświetlanie komponentów
Tworzenie komponentu ButtonColor wygląda podobnie jak tworzenie komponentu Button z jedną tylko różnicą: zamiast przypisania tekstu jest przypisywany kolor. Za jego wyświetlanie odpowiada funkcja (plik graphicObject.c):
static GL_ErrStatus SetButtonColorVisible (GL_PageControls_TypeDef* pObj,
GL_Coordinates_TypeDef objCoordinates)
{
GL_ButtonColor_TypeDef* pGUIObj = (GL_ButtonColor_TypeDef*)(pObj->objPTR);
uint16_t maxX = objCoordinates.MaxX;
uint16_t minY = objCoordinates.MinY;
uint16_t color = 0;
// Check if pGUIObj == NULL
if(!pGUIObj)
{
return GL_ERROR;
}
color = pGUIObj->Color;
pGUIObj -> Control_Visible = GL_TRUE;
GL_SetForegroundColor(Black);
GL_DrawRectangle( maxX, minY, 28, 28);
GL_DrawFilledRectangle( maxX-1, minY+1, 26, 26, color);
return GL_OK;
}
W oddzielnym pliku Drawbox.c zdefiniowano następujące funkcje:
- ClearDrawbox() – czyszczenie obszaru w którym odbywa się rysowanie,
- NewDrawbox() – tworzenie komponentu o zadanych wymiarach,
- SetCurrentColor() – ustawienie bieżącego koloru,
- SetDrawboxVisible() – wyświetlanie komponentu.
Oprócz powyższych zdefiniowano również funkcję rysującą „punkty” tworzące linię rysowania:
void Draw_Point (GL_PageControls_TypeDef* pControl,
uint16_t x,
uint16_t y)
{
#if 0
// Rysowanie pojedynczego piksela
LCD_PutPixel(x, y, CurrentColor, SinglePixel);
#else
// Rysowanie małego koła
if( ((pControl->objCoordinates.MaxX)-2 > x) &&
((pControl->objCoordinates.MinX)+2 < x) &&
((pControl->objCoordinates.MaxY)-2 > y) &&
((pControl->objCoordinates.MinY)+2 < y)){
GL_SetForegroundColor(CurrentColor);
GL_DrawLine(x+2, y, 1, Vertical);
GL_DrawLine(x+1, y-1, 3, Vertical);
GL_DrawLine(x+0, y-2, 5, Vertical);
GL_DrawLine(x-1, y-1, 3, Vertical);
GL_DrawLine(x-2, y, 1, Vertical);
}
#endif
}
Integracja komponentu
Aby skorzystać z nowych komponentów należy uzupełnić warstwę Library o kilka elementów. Pierwsza modyfikacja to poszerzenie funkcji AddPageControlObj() o dwa dodatkowe warunki:
else if (objPTR -> objType == GL_BUTTON_COLOR){
// Pobierz wskaźnik na obiekt graficzny
GL_ButtonColor_TypeDef* pTmp = ((GL_ButtonColor_TypeDef*)(objPTR -> objPTR));
// Przypisz funkcje rysująca dany obiekt graficzny
objPTR -> SetObjVisible = SetButtonColorVisible;
// Skopiuj ID do struktury nadrzędnej
objPTR -> ID = pTmp -> ID;
// Przypisz wstępne wymiary obiektu
objCoordinates.MinX = PosX - 28;
objCoordinates.MaxY = PosY + 28;
}
else if (objPTR -> objType == GL_DRAWBOX){
GL_Drawbox_TypeDef* pTmp = ((GL_Drawbox_TypeDef*)(objPTR -> objPTR));
objPTR -> SetObjVisible = SetDrawboxVisible;
objPTR -> ID = pTmp->ID;
objCoordinates.MinX = PosX - pTmp -> Width + 1;
objCoordinates.MaxY = PosY + pTmp -> Height - 1;
}
oraz funkcji GetObjSize():
else if (pPageControl->objType == GL_BUTTON_COLOR){
dimensions.Length = 28;
dimensions.Height = 28;
}
else if (pPageControl->objType == GL_DRAWBOX){
GL_Drawbox_TypeDef* pTmp;
pTmp = (GL_Drawbox_TypeDef*)(pPageControl->objPTR);
dimensions.Length = pTmp->Width;
dimensions.Height = pTmp->Height;
}
Dodanie nowej opcji w bloku switch funkcji CallPreEvents():
case GL_DRAWBOX: Draw_Point(pControl, u32_TSXCoordinate, u32_TSYCoordinate); break;
oraz w bloku switch funkcji CallEvent():
case GL_BUTTON_COLOR: pTmp = (GL_ButtonColor_TypeDef*)(pControl->objPTR); ((GL_ButtonColor_TypeDef*)pTmp)->EventHandler(); break;

Technologie End of Life i bezpieczeństwo sieci – wyzwania Europy związane z tzw. długiem technologicznym
Najczęstsze błędy firm przy wyborze dostawcy energii i jak ich uniknąć
Fotorezystor, czyli czujnik światła dwojakiego działania. Przykład innowacji w automatyce i elektronice możliwej dzięki technologii fotooporników 



