10.06.2013
Aplikacje biblioteki STM32 Embedded GUI: miniPaint na STM32F4DISCOVERY
Budowa interfejsu
W pliku GxFreeGUI_Paint.c zdefiniowano przykładowy układ aplikacji rysującej:
void ButtonBLACK_Click(void){ SetCurrentColor(Drawbox,GL_Black); } void ButtonBLUE_Click(void){ SetCurrentColor(Drawbox,GL_Blue); } void ButtonCLEAR_Click(void){ // Czyszczenie obszaru roboczego ClearDrawbox(Drawbox); } // Pozostałe funkcje . . . void Create_Paint(void) { GL_PageControls_TypeDef* ButtonCLEAR = NewButton(ID_Paint_ButtonCLEAR,"Clear",ButtonCLEAR_Click); GL_PageControls_TypeDef* ButtonBLACK = NewButtonColor(ID_Paint_ButtonBLACK,GL_Black,ButtonBLACK_Click); GL_PageControls_TypeDef* ButtonBLUE = NewButtonColor(ID_Paint_ButtonBLUE, GL_Blue, ButtonBLUE_Click); GL_PageControls_TypeDef* ButtonCYAN = NewButtonColor(ID_Paint_ButtonCYAN, GL_Cyan, ButtonCYAN_Click); GL_PageControls_TypeDef* ButtonGREEN = NewButtonColor(ID_Paint_ButtonGREEN,GL_Green,ButtonGREEN_Click); GL_PageControls_TypeDef* ButtonMAGENTA = NewButtonColor(ID_Paint_ButtonMAGENTA,GL_Magenta,ButtonMAGENTA_Click); GL_PageControls_TypeDef* ButtonRED = NewButtonColor(ID_Paint_ButtonRED, GL_Red, ButtonRED_Click); GL_PageControls_TypeDef* ButtonWHITE = NewButtonColor(ID_Paint_ButtonWHITE,GL_White,ButtonWHITE_Click); GL_PageControls_TypeDef* ButtonYELLOW = NewButtonColor(ID_Paint_ButtonYELLOW,GL_Yellow,ButtonYELLOW_Click); Drawbox = NewDrawbox(ID_Paint_Drawbox,318,200,NULL); Create_PageObj( &Page_Paint ); AddPageControlObj(318, 1,ButtonBLACK, &Page_Paint); AddPageControlObj(288, 1,ButtonWHITE, &Page_Paint); AddPageControlObj(258, 1,ButtonRED, &Page_Paint); AddPageControlObj(228, 1,ButtonGREEN, &Page_Paint); AddPageControlObj(198, 1,ButtonBLUE, &Page_Paint); AddPageControlObj(168, 1,ButtonMAGENTA,&Page_Paint); AddPageControlObj(138, 1,ButtonCYAN, &Page_Paint); AddPageControlObj(108, 1,ButtonYELLOW, &Page_Paint); AddPageControlObj( 78, 2,ButtonCLEAR, &Page_Paint); AddPageControlObj(318, 35,Drawbox, &Page_Paint); } void Show_Paint(void) { if(CurrentScreen!=GL_NULL) { CurrentScreen->ShowPage(CurrentScreen,GL_FALSE); } GL_Clear(GL_White); GL_SetTextColor(GL_Black); Page_Paint.ShowPage(&Page_Paint, GL_TRUE); CurrentScreen=&Page_Paint; }
Ostatnia funkcja jest wywoływana z poniższej funkcji (plik uiframework.c):
void Show_HomeScreen() { Create_Paint(); CurrentScreen = &Page_Paint; Show_Paint(); }
Główna pętla programu
Na koniec pozostaje jeszcze przedstawić strukturę funkcji main():
int main(void) { RCC_ClocksTypeDef RCC_Clocks; /* Set the Vector Table base location at 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0000); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); /* Setup SysTick Timer for 10 msec interrupts */ RCC_GetClocksFreq(&RCC_Clocks); if (SysTick_Config(RCC_Clocks.SYSCLK_Frequency / 100)) { /* Capture error */ while (1); } /* configure Systick priority */ NVIC_SetPriority(SysTick_IRQn, 0x0B); /* Set HW structure parameters */ HWConfig_SetHardwareParams(); GL_LCD_Init(); // Inicjalizacja LCD GL_Clear(GL_White); // Czyszczenie ekranu GL_SetFont(GL_FONT_SMALL); GL_SetTextColor(GL_Black); GL_DrawString(300, 100, (uint8_t*)"Press User button to continue...", GL_TRUE); STM_EVAL_PBInit(BUTTON_USER, BUTTON_MODE_GPIO); while(STM_EVAL_PBGetState(BUTTON_USER) == 0); InputInterface_Init(); // Inicjalizacja parametrów związanych z panelem dotykowym Show_HomeScreen(); // Utworzenie elementów GUI i wyświetlenie pierwszego okna /* Infinite main loop ------------------------------------------------------*/ while (1) { ProcessInputData(); // Obsługa dotknięcia panelu } }