//............................................................................ QState Table::ready(Table *me, QEvt const *e) { switch (e->sig) { case Q_ENTRY_SIG: { l_cb_WM_HBKWIN = WM_SetCallback(WM_HBKWIN, &onMainWndGUI); // create the diaglog box and return right away... l_hDlg = GUI_CreateDialogBox(l_dialog, GUI_COUNTOF(l_dialog), &onDialogGUI, 0, 0, 0); return Q_HANDLED(); } case Q_EXIT_SIG: { GUI_EndDialog(l_hDlg, 0); WM_SetCallback(WM_HBKWIN, l_cb_WM_HBKWIN); return Q_HANDLED(); } case Q_INIT_SIG: { return Q_TRAN(&Table::serving); } case MOUSE_CHANGE_SIG: { // mouse change (move or click) event GUI_PID_STATE mouse; mouse.x = ((MouseEvt const *)e)->xPos; mouse.y = ((MouseEvt const *)e)->yPos; mouse.Pressed = ((MouseEvt const *)e)->buttonStates; GUI_PID_StoreState(&mouse); // update the state of the Mouse PID WM_Exec(); // update the screen and invoke WM callbacks return Q_HANDLED(); } // ... hardkey events ... case KEY_LEFT_REL_SIG: { // hardkey LEFT released WM_MoveWindow(l_hDlg, -5, 0); WM_Exec(); // update the screen and invoke WM callbacks return Q_HANDLED(); } case KEY_RIGHT_REL_SIG: { // hardkey RIGHT released WM_MoveWindow(l_hDlg, 5, 0); WM_Exec(); // update the screen and invoke WM callbacks return Q_HANDLED(); } case KEY_DOWN_REL_SIG: { // hardkey DOWN released WM_MoveWindow(l_hDlg, 0, 5); WM_Exec(); // update the screen and invoke WM callbacks return Q_HANDLED(); } case KEY_UP_REL_SIG: { // hardkey UP released WM_MoveWindow(l_hDlg, 0, -5); WM_Exec(); // update the screen and invoke WM callbacks return Q_HANDLED(); } } return Q_SUPER(&QHsm::top); }
/** * @brief callback for video window * @param pMsg: pointer to a data structure of type WM_MESSAGE * @retval None */ static void _cbTouch(WM_MESSAGE * pMsg) { const GUI_PID_STATE * pState; static uint8_t toggle = 0; switch (pMsg->MsgId) { case WM_TOUCH: pState = (const GUI_PID_STATE *)pMsg->Data.p; if (pState) { if (pState->Pressed == 1) { if(!toggle) { GUI_SetLayerVisEx (1, 0); } else { GUI_SetLayerVisEx (1, 1); } toggle ^= 1; WM_Exec(); } } break; default: WM_DefaultProc(pMsg); break; } }
////////////////////////////////////////////////////////////////////////////// // Product: DPP example with emWin/uC/GUI, WITH Window Manager // Last updated for version 6.2.0 // Last updated on 2018-03-16 // // Q u a n t u m L e a P s // --------------------------- // innovating embedded systems // // Copyright (C) Quantum Leaps, LLC. All rights reserved. // // This program is open source software: you can redistribute it and/or // modify it under the terms of the GNU General Public License as published // by the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Alternatively, this program may be distributed and modified under the // terms of Quantum Leaps commercial licenses, which expressly supersede // the GNU General Public License and are specifically designed for // licensees interested in retaining the proprietary status of their code. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. // // Contact information: // https://www.state-machine.com // mailto:[email protected] ////////////////////////////////////////////////////////////////////////////// #include "qpcpp.h" #include "dpp.h" #include "bsp.h" extern "C" { #include "GUI.h" #include "WM.h" // emWin Windows Manager #include "DIALOG.h" #include "SIM.h" } Q_DEFINE_THIS_FILE // Active object class ------------------------------------------------------- class Table : public QActive { private: uint8_t m_fork[N_PHILO]; uint8_t m_isHungry[N_PHILO]; public: Table(); private: static QState initial(Table *me, QEvt const *e); static QState ready (Table *me, QEvt const *e); static QState serving(Table *me, QEvt const *e); static QState paused (Table *me, QEvt const *e); }; #define RIGHT(n_) ((uint8_t)(((n_) + (N_PHILO - 1)) % N_PHILO)) #define LEFT(n_) ((uint8_t)(((n_) + 1) % N_PHILO)) enum m_forkState { FREE, USED }; // Local objects ------------------------------------------------------------- static Table l_table; // local Table object #ifdef Q_SPY enum QSUserRecords { PHILO_STAT = QS_USER, TABLE_STAT }; static uint8_t const l_onDialogGUI = 0U; #endif // Public-scope objects ------------------------------------------------------ QActive * const AO_Table = &l_table; // "opaque" AO pointer // GUI definition ============================================================ static WM_HWIN l_hDlg; static WM_CALLBACK *l_cb_WM_HBKWIN; static const GUI_WIDGET_CREATE_INFO l_dialog[] = { { &FRAMEWIN_CreateIndirect, "Dining Philosopher Problem", 0, 30, 30, 260, 180, FRAMEWIN_CF_MOVEABLE }, { &TEXT_CreateIndirect, "Philosopher 0", GUI_ID_TEXT9, 50, 10, 0, 0, TEXT_CF_LEFT }, { &TEXT_CreateIndirect, "Philosopher 1", GUI_ID_TEXT9, 50, 30, 0, 0, TEXT_CF_LEFT }, { &TEXT_CreateIndirect, "Philosopher 2", GUI_ID_TEXT9, 50, 50, 0, 0, TEXT_CF_LEFT }, { &TEXT_CreateIndirect, "Philosopher 3", GUI_ID_TEXT9, 50, 70, 0, 0, TEXT_CF_LEFT }, { &TEXT_CreateIndirect, "Philosopher 4", GUI_ID_TEXT9, 50, 90, 0, 0, TEXT_CF_LEFT }, { &TEXT_CreateIndirect, "Table", GUI_ID_TEXT9, 50, 110, 0, 0, TEXT_CF_LEFT }, { &TEXT_CreateIndirect, "thinking", GUI_ID_TEXT0, 130, 10, 0, 0, TEXT_CF_LEFT }, { &TEXT_CreateIndirect, "thinking", GUI_ID_TEXT1, 130, 30, 0, 0, TEXT_CF_LEFT }, { &TEXT_CreateIndirect, "thinking", GUI_ID_TEXT2, 130, 50, 0, 0, TEXT_CF_LEFT }, { &TEXT_CreateIndirect, "thinking", GUI_ID_TEXT3, 130, 70, 0, 0, TEXT_CF_LEFT }, { &TEXT_CreateIndirect, "thinking", GUI_ID_TEXT4, 130, 90, 0, 0, TEXT_CF_LEFT }, { &TEXT_CreateIndirect, "serving", GUI_ID_TEXT5, 130, 110, 0, 0, TEXT_CF_LEFT }, { &BUTTON_CreateIndirect,"PAUSE", GUI_ID_BUTTON0, 160, 130, 80, 30 } }; //..........................................................................*/ static void onMainWndGUI(WM_MESSAGE* pMsg) { switch (pMsg->MsgId) { case WM_PAINT: { GUI_SetBkColor(GUI_GRAY); GUI_Clear(); GUI_SetColor(GUI_BLACK); GUI_SetFont(&GUI_Font24_ASCII); GUI_DispStringHCenterAt("Dining Philosophers - Demo", 160, 5); break; } default: { WM_DefaultProc(pMsg); break; } } } //..........................................................................*/ static void onDialogGUI(WM_MESSAGE * pMsg) { switch (pMsg->MsgId) { case WM_INIT_DIALOG: { break; } case WM_NOTIFY_PARENT: { switch (pMsg->Data.v) { case WM_NOTIFICATION_RELEASED: { // react only if released */ switch (WM_GetId(pMsg->hWinSrc)) { case GUI_ID_BUTTON0: { // static PAUSE event for the Table AO */ static QEvent const pauseEvt = { PAUSE_SIG, 0 }; AO_Table->POST(&pauseEvt, &l_onDialogGUI); break; } } break; } } break; } default: { WM_DefaultProc(pMsg); break; } } } //..........................................................................*/ static void displyPhilStat(uint8_t n, char const *stat) { TEXT_SetText(WM_GetDialogItem(l_hDlg, GUI_ID_TEXT0 + n), stat); WM_Exec(); // update the screen and invoke WM callbacks */ QS_BEGIN(PHILO_STAT, AO_Philo[n]) // application-specific record begin */ QS_U8(1, n); // Philosopher number */ QS_STR(stat); // Philosopher status */ QS_END() } //..........................................................................*/ static void displyTableStat(char const *stat) { TEXT_SetText(WM_GetDialogItem(l_hDlg, GUI_ID_TEXT5), stat); WM_Exec(); // update the screen and invoke WM callbacks */ QS_BEGIN(TABLE_STAT, AO_Table) // application-specific record begin */ QS_STR(stat); // Philosopher status */ QS_END() }
////////////////////////////////////////////////////////////////////////////// // Product: DPP example with emWin/uC/GUI, WITH Window Manager // Last updated for version 6.2.0 // Last updated on 2018-03-16 // // Q u a n t u m L e a P s // --------------------------- // innovating embedded systems // // Copyright (C) Quantum Leaps, LLC. All rights reserved. // // This program is open source software: you can redistribute it and/or // modify it under the terms of the GNU General Public License as published // by the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Alternatively, this program may be distributed and modified under the // terms of Quantum Leaps commercial licenses, which expressly supersede // the GNU General Public License and are specifically designed for // licensees interested in retaining the proprietary status of their code. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. // // Contact information: // https://www.state-machine.com // mailto:[email protected] ////////////////////////////////////////////////////////////////////////////// #include "qpcpp.h" #include "dpp.h" #include "bsp.h" extern "C" { #include "GUI.h" #include "WM.h" // emWin Windows Manager #include "DIALOG.h" #include "SIM.h" } Q_DEFINE_THIS_FILE // Active object class ------------------------------------------------------- class Table : public QActive { private: uint8_t m_fork[N_PHILO]; uint8_t m_isHungry[N_PHILO]; public: Table(); private: static QState initial(Table *me, QEvt const *e); static QState ready (Table *me, QEvt const *e); static QState serving(Table *me, QEvt const *e); static QState paused (Table *me, QEvt const *e); }; #define RIGHT(n_) ((uint8_t)(((n_) + (N_PHILO - 1)) % N_PHILO)) #define LEFT(n_) ((uint8_t)(((n_) + 1) % N_PHILO)) enum m_forkState { FREE, USED }; // Local objects ------------------------------------------------------------- static Table l_table; // local Table object #ifdef Q_SPY enum QSUserRecords { PHILO_STAT = QS_USER, TABLE_STAT }; static uint8_t const l_onDialogGUI = 0U; #endif // Public-scope objects ------------------------------------------------------ QActive * const AO_Table = &l_table; // "opaque" AO pointer // GUI definition ============================================================ static WM_HWIN l_hDlg; static WM_CALLBACK *l_cb_WM_HBKWIN; static const GUI_WIDGET_CREATE_INFO l_dialog[] = { { &FRAMEWIN_CreateIndirect, "Dining Philosopher Problem", 0, 30, 30, 260, 180, FRAMEWIN_CF_MOVEABLE }, { &TEXT_CreateIndirect, "Philosopher 0", GUI_ID_TEXT9, 50, 10, 0, 0, TEXT_CF_LEFT }, { &TEXT_CreateIndirect, "Philosopher 1", GUI_ID_TEXT9, 50, 30, 0, 0, TEXT_CF_LEFT }, { &TEXT_CreateIndirect, "Philosopher 2", GUI_ID_TEXT9, 50, 50, 0, 0, TEXT_CF_LEFT }, { &TEXT_CreateIndirect, "Philosopher 3", GUI_ID_TEXT9, 50, 70, 0, 0, TEXT_CF_LEFT }, { &TEXT_CreateIndirect, "Philosopher 4", GUI_ID_TEXT9, 50, 90, 0, 0, TEXT_CF_LEFT }, { &TEXT_CreateIndirect, "Table", GUI_ID_TEXT9, 50, 110, 0, 0, TEXT_CF_LEFT }, { &TEXT_CreateIndirect, "thinking", GUI_ID_TEXT0, 130, 10, 0, 0, TEXT_CF_LEFT }, { &TEXT_CreateIndirect, "thinking", GUI_ID_TEXT1, 130, 30, 0, 0, TEXT_CF_LEFT }, { &TEXT_CreateIndirect, "thinking", GUI_ID_TEXT2, 130, 50, 0, 0, TEXT_CF_LEFT }, { &TEXT_CreateIndirect, "thinking", GUI_ID_TEXT3, 130, 70, 0, 0, TEXT_CF_LEFT }, { &TEXT_CreateIndirect, "thinking", GUI_ID_TEXT4, 130, 90, 0, 0, TEXT_CF_LEFT }, { &TEXT_CreateIndirect, "serving", GUI_ID_TEXT5, 130, 110, 0, 0, TEXT_CF_LEFT }, { &BUTTON_CreateIndirect,"PAUSE", GUI_ID_BUTTON0, 160, 130, 80, 30 } }; //..........................................................................*/ static void onMainWndGUI(WM_MESSAGE* pMsg) { switch (pMsg->MsgId) { case WM_PAINT: { GUI_SetBkColor(GUI_GRAY); GUI_Clear(); GUI_SetColor(GUI_BLACK); GUI_SetFont(&GUI_Font24_ASCII); GUI_DispStringHCenterAt("Dining Philosophers - Demo", 160, 5); break; } default: { WM_DefaultProc(pMsg); break; } } } //..........................................................................*/ static void onDialogGUI(WM_MESSAGE * pMsg) { switch (pMsg->MsgId) { case WM_INIT_DIALOG: { break; } case WM_NOTIFY_PARENT: { switch (pMsg->Data.v) { case WM_NOTIFICATION_RELEASED: { // react only if released */ switch (WM_GetId(pMsg->hWinSrc)) { case GUI_ID_BUTTON0: { // static PAUSE event for the Table AO */ static QEvent const pauseEvt = { PAUSE_SIG, 0 }; AO_Table->POST(&pauseEvt, &l_onDialogGUI); break; } } break; } } break; } default: { WM_DefaultProc(pMsg); break; } } } //..........................................................................*/ static void displyPhilStat(uint8_t n, char const *stat) { TEXT_SetText(WM_GetDialogItem(l_hDlg, GUI_ID_TEXT0 + n), stat); WM_Exec(); // update the screen and invoke WM callbacks */ QS_BEGIN(PHILO_STAT, AO_Philo[n]) // application-specific record begin */ QS_U8(1, n); // Philosopher number */ QS_STR(stat); // Philosopher status */ QS_END() }
/******************************************************************* * * _LiftUp */ static void _LiftUp(int dy) { int i, tm; for (i = 0; i < (dy/4); i++) { tm = GUI_GetTime(); WM_MoveWindow(_hWindow1, 0, -4); WM_MoveWindow(_hWindow2, 0, -4); while ((GUI_GetTime() - tm) < 20) { WM_Exec(); } } }
void GUITask() { curId = GUI_ID_USER; GUIConfig(); GUICreate(); while (1) { WM_Exec(); GUI_Delay(100); } /*GUI_BMP_Draw(&bmpfile, 0, 0);*/ }
/** * @brief Callback function of the media connection status * @param pMsg: pointer to data structure of type WM_MESSAGE * @retval None */ static void _cbMediaConnection(WM_MESSAGE * pMsg) { static WM_HTIMER hStatusTimer; static uint8_t prev_usb_status = 0; switch (pMsg->MsgId) { case WM_CREATE: prev_usb_status = k_StorageGetStatus(USB_DISK_UNIT); hStatusTimer = WM_CreateTimer(pMsg->hWin, 0, 500, 0); break; case WM_TIMER: if(prev_usb_status != k_StorageGetStatus(USB_DISK_UNIT)) { prev_usb_status = k_StorageGetStatus(USB_DISK_UNIT); if(VideoList.file[file_pos].name[0] == '0') { if(VideoPlayer_State != VIDEO_IDLE) { _StopPlay(&hvideo, &Video_File); } VideoList.ptr = 0; GUI_EndDialog(playbackwin, 0); SelLayer = 0; GUI_SetLayerVisEx (1, 0); GUI_SelectLayer(0); WM_HideWindow(hFrame); WM_Exec(); WM_DeleteWindow(hFrame); WM_InvalidateWindow(VideoWin); break; } } WM_RestartTimer(pMsg->Data.v, 500); break; case WM_DELETE: if(hStatusTimer != 0) { WM_DeleteTimer(hStatusTimer); hStatusTimer = 0; } break; default: WM_DefaultProc(pMsg); } }
/********************************************************************* * * GUI_Exec1 */ int GUI_Exec1(void) { int r = 0; /* Execute background jobs */ if (GUI_pfTimerExec) { if ((*GUI_pfTimerExec)()) { r = 1; /* We have done something */ } } #if GUI_WINSUPPORT /* If 0, WM will not generate any code */ if (WM_Exec()) r = 1; #endif return r; }
/******************************************************************* * * _DemoEdit * Edit a string until ESC or ENTER is pressed */ static void _DemoEdit(void) { EDIT_Handle hEdit; char aBuffer[28]; int Key; GUI_SetBkColor(GUI_BLACK); GUI_Clear(); GUI_SetColor(GUI_WHITE); GUI_SetFont(&GUI_Font24_ASCII); GUI_DispStringHCenterAt("WIDGET_Edit - Sample", 160, 5); GUI_SetFont(&GUI_Font8x16); GUI_DispStringHCenterAt("Use keyboard to modify string...", 160, 90); /* Create edit widget */ hEdit = EDIT_Create( 50, 110, 220, 25, ' ', sizeof(aBuffer), WM_CF_SHOW); /* Modify edit widget */ EDIT_SetText(hEdit, "Press <ENTER> when done..."); EDIT_SetFont(hEdit, &GUI_Font8x16); EDIT_SetTextColor(hEdit, 0, GUI_RED); /* Set keyboard focus to edit widget */ WM_SetFocus(hEdit); /* Handle keyboard until ESC or ENTER is pressed */ do { WM_Exec(); Key = GUI_GetKey(); } while ((Key != GUI_KEY_ENTER) && (Key != GUI_KEY_ESCAPE)); /* Fetch result from edit widget */ if (Key == GUI_KEY_ENTER) { EDIT_GetText(hEdit, aBuffer, sizeof(aBuffer)); } /* Delete the edit widget */ EDIT_Delete(hEdit); GUI_ClearRect(0, 50, 319, 239); /* Display the changed string */ if (Key == GUI_KEY_ENTER) { GUI_Delay(250); GUI_DispStringHCenterAt("The string you have modified is:", 160, 90); GUI_DispStringHCenterAt(aBuffer, 160, 110); GUI_Delay(3000); GUI_ClearRect(0, 50, 319, 239); } GUI_Delay(500); }
static void _cbDialog(WM_MESSAGE * pMsg) { WM_HWIN hItem; int Id, NCode; switch (pMsg->MsgId) { case WM_INIT_DIALOG: hItem = BUTTON_CreateEx(420, 0, 60, 60, pMsg->hWin, WM_CF_SHOW, 0, ID_BUTTON_EXIT); WM_SetCallback(hItem, _cbButton_exit); hItem = WM_GetDialogItem(pMsg->hWin, ID_VNC_CONNECTION); IMAGE_SetBitmap(hItem, &bmconnection_ko); hItem = BUTTON_CreateEx(315, 195, 40, 40, pMsg->hWin, WM_CF_SHOW, 0, START_VNC); WM_SetCallback(hItem, _cbButton_start); hItem = BUTTON_CreateEx(380, 195, 40, 40, pMsg->hWin, WM_CF_SHOW, 0, GO_BACKGROUND); WM_SetCallback(hItem, _cbButton_bg); hItem = BUTTON_CreateEx(245, 195, 40, 40, pMsg->hWin, WM_CF_SHOW, 0, ID_LOCK); WM_SetCallback(hItem, _cbButton_lock); hItem = WM_GetDialogItem(pMsg->hWin, GO_BACKGROUND); BUTTON_SetFont(hItem, &GUI_FontLubalGraph16B); break; case WM_PAINT: GUI_SetColor(GUI_STCOLOR_LIGHTBLUE); GUI_SetPenSize(5); GUI_DrawBitmap(&bmconnect, 7, 45); GUI_DrawCircle(332, 215, 40); GUI_AA_FillCircle(332, 215, 45); GUI_AA_FillRoundedRect(230, 182, 440, 250, 20); GUI_SetColor(GUI_WHITE); GUI_AA_FillCircle(332, 215, 42); GUI_SetBkColor(GUI_WHITE); GUI_AA_FillRoundedRect(233, 185, 437, 247, 20); GUI_SetColor(GUI_STCOLOR_LIGHTBLUE); GUI_AA_FillCircle(332, 215, 33); break; case WM_NOTIFY_PARENT: Id = WM_GetId(pMsg->hWinSrc); /* Id of widget */ NCode = pMsg->Data.v; /* Notification code */ switch(Id) { case START_VNC: /* Notifications sent by 'Start' */ switch(NCode) { case WM_NOTIFICATION_RELEASED: if((VNC_GetState() == VNC_IDLE)|| (VNC_GetState() == VNC_INIT)) { VNC_SERVER_LogMessage("Starting VNC connection..."); hItem = WM_GetDialogItem(pMsg->hWin, ID_VNC_CONNECTION); IMAGE_SetBitmap(hItem, &bmno_connection); VNC_SetState (VNC_INIT); WM_Exec(); VNC_SERVER_Start(); } else { VNC_SERVER_Stop(); } break; case WM_NOTIFICATION_CLICKED: hItem = WM_GetDialogItem(pMsg->hWin, START_VNC); WM_InvalidateWindow(hItem); WM_Update(hItem); break; } break; case GO_BACKGROUND: /* Notifications sent by 'Background' */ switch(NCode) { case WM_NOTIFICATION_RELEASED: WM_HideWindow(pMsg->hWin); module_prop[k_ModuleGetIndex(&vnc_server)].win_state = 1; ST_AnimatedIconView_SetItemText(hIcon,k_ModuleGetIndex(&vnc_server),"vnc server[B]"); ST_AnimatedIconView_SetDualTextColor(hIcon, ICONVIEW_CI_SEL, GUI_STCOLOR_LIGHTBLUE, GUI_STCOLOR_DARKBLUE ); break; } break; case ID_BUTTON_EXIT: switch(NCode) { case WM_NOTIFICATION_RELEASED: if(VNC_GetState() != VNC_IDLE) { VNC_SERVER_Stop(); } GUI_EndDialog(pMsg->hWin, 0); break; } break; case ID_LOCK: switch(NCode) { case WM_NOTIFICATION_RELEASED: if(VNC_GetState() == VNC_IDLE) { if(VNC_GetLockState()) { VNC_SetLockState(0); } else { VNC_SetLockState(1); } } break; } break; } break; default: WM_DefaultProc(pMsg); break; } }
/** * @brief callback for video window * @param pMsg: pointer to a data structure of type WM_MESSAGE * @retval None */ static void _cbplaybackwin(WM_MESSAGE * pMsg) { WM_HWIN hItem; int Id, NCode; char tmp[64]; switch (pMsg->MsgId) { case WM_CREATE: SelLayer = 1; hItem = BUTTON_CreateEx(398 - 160, 442, 40, 40, pMsg->hWin, WM_CF_SHOW, 0, ID_BUTTON_BACK); WM_SetCallback(hItem, _cbButton_back); hItem = BUTTON_CreateEx(449 - 160, 442, 40, 40, pMsg->hWin, WM_CF_SHOW, 0, ID_BUTTON_STOP); WM_SetCallback(hItem, _cbButton_stop); hItem = BUTTON_CreateEx(495 - 160, 441, 40, 40, pMsg->hWin, WM_CF_SHOW, 0, PLAY_VIDEO_ID); WM_SetCallback(hItem, _cbButton_play); hItem = BUTTON_CreateEx(540 - 160, 442, 40, 40, pMsg->hWin, WM_CF_SHOW, 0, ID_BUTTON_FORE); WM_SetCallback(hItem, _cbButton_fore); hItem = SLIDER_CreateEx(72, 420, 510, 13, pMsg->hWin, WM_CF_SHOW, 0, ID_SLIDER_DURATION); SLIDER_SetBkColor(hItem, GUI_TRANSPARENT); SLIDER_SetFocusColor (hItem, 0x00DCA939); SLIDER_SetValue(hItem, 0); SLIDER_SetWidth(hItem, 0); SLIDER_SetSTSkin(hItem); hItem = BUTTON_CreateEx(568, 0, 70, 70, pMsg->hWin, WM_CF_SHOW, 0, ID_BUTTON_MENU); WM_SetCallback(hItem, _cbButton_menu); hItem = BUTTON_CreateEx(0, 410, 70, 70, pMsg->hWin, WM_CF_SHOW, 0, ID_BUTTON_EXIT_FROM_VIDEO); WM_SetCallback(hItem, _cbButton_exit1); /* Title Initialization in play list */ hItem = TEXT_CreateEx(10, 20, 100, 40, pMsg->hWin, WM_CF_SHOW, 0, ID_ELAPSED_TIME, "00:00"); TEXT_SetFont(hItem, GUI_FONT_20B_1); TEXT_SetTextColor(hItem, GUI_WHITE); /* Title Initialization in play list */ hItem = TEXT_CreateEx(50, 40, 50, 30, pMsg->hWin, WM_CF_SHOW, 0, ID_TIME, "00:00"); TEXT_SetFont(hItem, GUI_FONT_16B_1); TEXT_SetTextColor(hItem, GUI_WHITE); hItem = TEXT_CreateEx(150, 20, 350, 30, pMsg->hWin, WM_CF_SHOW, TEXT_CF_HCENTER, ID_VIDEO_NAME, "File Name"); TEXT_SetFont(hItem, GUI_FONT_20B_1); TEXT_SetTextColor(hItem, GUI_WHITE); hItem = TEXT_CreateEx(150, 48, 350, 30, pMsg->hWin, WM_CF_SHOW, TEXT_CF_HCENTER, ID_VIDEO_FORMAT, "Format : MJPEG"); TEXT_SetFont(hItem, GUI_FONT_13B_1); TEXT_SetTextColor(hItem, GUI_WHITE); hItem = TEXT_CreateEx(548, 200, 260, 20, pMsg->hWin, WM_CF_SHOW, TEXT_CF_LEFT, ID_FPS, "Rate : 20 fps"); TEXT_SetFont(hItem, GUI_FONT_13B_1); TEXT_SetTextColor(hItem, GUI_WHITE); hItem = TEXT_CreateEx(548, 220, 260, 20, pMsg->hWin, WM_CF_SHOW, TEXT_CF_LEFT, ID_FEATURES_FPU, "FPU : ON"); TEXT_SetFont(hItem, GUI_FONT_13B_1); TEXT_SetTextColor(hItem, GUI_WHITE); hItem = TEXT_CreateEx(548, 240, 260, 20, pMsg->hWin, WM_CF_SHOW, TEXT_CF_LEFT, ID_FEATURES_IC, "I-Cache : ON"); TEXT_SetFont(hItem, GUI_FONT_13B_1); TEXT_SetTextColor(hItem, GUI_WHITE); hItem = TEXT_CreateEx(548, 260, 260, 20, pMsg->hWin, WM_CF_SHOW, TEXT_CF_LEFT, ID_FEATURES_DC, "D-Cache : ON"); TEXT_SetFont(hItem, GUI_FONT_13B_1); TEXT_SetTextColor(hItem, GUI_WHITE); hItem = TEXT_CreateEx(548, 280, 260, 20, pMsg->hWin, WM_CF_SHOW, TEXT_CF_LEFT, ID_FEATURES_CPU, "MCU Load : 0%"); TEXT_SetFont(hItem, GUI_FONT_13B_1); TEXT_SetTextColor(hItem, GUI_WHITE); break; case WM_TIMER: { WM_RestartTimer(pMsg->Data.v, 1000); /* show elapsed time */ hItem = WM_GetDialogItem(pMsg->hWin, ID_ELAPSED_TIME); elapsed_time++; sprintf((char *)tmp , "%02lu:%02lu", elapsed_time/60, elapsed_time%60 ); TEXT_SetText(hItem, tmp); sprintf((char *)tmp , "MCU Load : %d%%", ((osGetCPUUsage() > 90) ? (osGetCPUUsage() - 10) : osGetCPUUsage())); hItem = WM_GetDialogItem(pMsg->hWin, ID_FEATURES_CPU); TEXT_SetText(hItem, tmp); hItem = WM_GetDialogItem(pMsg->hWin, ID_SLIDER_DURATION); SLIDER_SetValue(hItem, (GUI_MOVIE_GetFrameIndex(hvideo)* 100)/ Video_Info.NumFrames); if(step == 0) { step = ((GUI_MOVIE_GetFrameIndex(hvideo)* 100)/ Video_Info.NumFrames); } if(((GUI_MOVIE_GetFrameIndex(hvideo)* 100)/ Video_Info.NumFrames) > (100 - 2*step - 1)) { SLIDER_SetValue(hItem, 100); GUI_Exec(); } } break; case WM_DELETE: if(hTimer != 0) { WM_DeleteTimer(hTimer); hTimer = 0; } case WM_PAINT: GUI_SetColor(0xFF000000 | GUI_BLACK); GUI_SetBkColor(GUI_TRANSPARENT); GUI_Clear(); GUI_SetColor(GUI_BLACK); GUI_DrawHLine(0, 0, 640); GUI_DrawHLine(479, 0, 640); GUI_DrawLine(639, 0, 639, 480); GUI_DrawLine(0, 0, 0, 480); /* Background for total time */ GUI_SetColor(0x00DCA939); GUI_AA_FillRoundedRect((-30), 5, 90, 65, 30); /*Video Information */ GUI_AA_FillRoundedRect(150, 5, 500, 65, 30); /*H/W Information */ GUI_AA_FillRoundedRect(538, 180, 780, 320, 30); break; case WM_NOTIFY_PARENT: Id = WM_GetId(pMsg->hWinSrc); /* Id of widget */ NCode = pMsg->Data.v; /* Notification code */ switch(Id) { case ID_BUTTON_EXIT_FROM_VIDEO: switch(NCode) { case WM_NOTIFICATION_RELEASED: if(VideoPlayer_State != VIDEO_IDLE) { _StopPlay(&hvideo, &Video_File); } GUI_EndDialog(pMsg->hWin, 0); SelLayer = 0; GUI_SetLayerVisEx (1, 0); GUI_SelectLayer(0); WM_HideWindow(hFrame); WM_Exec(); WM_DeleteWindow(hFrame); WM_InvalidateWindow(VideoWin); break; } break; case ID_BUTTON_MENU: switch(NCode) { case WM_NOTIFICATION_RELEASED: if(VideoPlayer_State != VIDEO_IDLE) { _StopPlay(&hvideo, &Video_File); } GUI_EndDialog(pMsg->hWin, 0); SelLayer = 0; GUI_SetLayerVisEx (1, 0); GUI_SelectLayer(0); WM_DeleteWindow(hFrame); WM_HideWindow(VideoWin); WM_Exec(); WM_DeleteWindow(VideoWin); break; } break; case ID_BUTTON_STOP: switch(NCode) { case WM_NOTIFICATION_RELEASED: if(VideoPlayer_State != VIDEO_IDLE) { VideoPlayer_State = VIDEO_STOP; _StopPlay(&hvideo, &Video_File); } WM_InvalidateWindow(pMsg->hWin); break; } break; case ID_BUTTON_FORE: switch(NCode) { case WM_NOTIFICATION_RELEASED: if(VideoPlayer_State == VIDEO_PLAY) { if(file_pos < (VideoList.ptr - 1)) { file_pos++; } else { file_pos = 0; } _StopPlay(&hvideo, &Video_File); _StartPlay(&hvideo, (char *)VideoList.file[file_pos].name, &Video_File, 0, 0); } break; } break; /* Notifications sent by 'progress' Slider */ case ID_SLIDER_DURATION: if(NCode == WM_NOTIFICATION_CLICKED) { hItem = WM_GetDialogItem(pMsg->hWin, ID_SLIDER_DURATION); int32_t newpos; if(VideoPlayer_State == VIDEO_PLAY) { GUI_MOVIE_Pause(hvideo); hItem = WM_GetDialogItem(pMsg->hWin, ID_SLIDER_DURATION); newpos = (SLIDER_GetValue(hItem) * Video_Info.NumFrames)/100; GUI_MOVIE_GotoFrame(hvideo, newpos); GUI_MOVIE_Play(hvideo); elapsed_time = (Video_Info.msPerFrame * newpos)/ 1000; hItem = WM_GetDialogItem(playbackwin, ID_ELAPSED_TIME); sprintf((char *)tmp , "%02lu:%02lu", elapsed_time/60, elapsed_time%60 ); TEXT_SetText(hItem, tmp); WM_InvalidateWindow(hItem); WM_Paint(hItem); } } break; case ID_BUTTON_BACK: switch(NCode) { case WM_NOTIFICATION_RELEASED: if(VideoPlayer_State == VIDEO_PLAY) { if(file_pos > 0) { file_pos--; } else { file_pos = VideoList.ptr - 1; } _StopPlay(&hvideo, &Video_File); _StartPlay(&hvideo, (char *)VideoList.file[file_pos].name, &Video_File, 0, 0); } break; } break; case PLAY_VIDEO_ID: switch(NCode) { case WM_NOTIFICATION_RELEASED: if((VideoPlayer_State == VIDEO_IDLE) || (VideoPlayer_State == VIDEO_PAUSE)) { hTimer = WM_CreateTimer(playbackwin, 0, 1000, 0); GUI_MOVIE_Play(hvideo); VideoPlayer_State = VIDEO_PLAY; } else if(VideoPlayer_State == VIDEO_STOP) { _StartPlay(&hvideo, (char *)VideoList.file[file_pos].name, &Video_File, 0, 0); VideoPlayer_State = VIDEO_PLAY; } else { GUI_MOVIE_Pause(hvideo); VideoPlayer_State = VIDEO_PAUSE; if(hTimer != 0) { WM_DeleteTimer(hTimer); hTimer = 0; } } break; } break; } break; default: WM_DefaultProc(pMsg); break; } }
/** * @brief Callback function of the media connection status * @param pMsg: pointer to data structure of type WM_MESSAGE * @retval None */ static void _cbMediaConnection(WM_MESSAGE * pMsg) { static WM_HTIMER hStatusTimer; static uint8_t prev_usb_status = 0; WM_HWIN hItem = 0; static char tmp[64]; uint32_t i = 0; switch (pMsg->MsgId) { case WM_CREATE: prev_usb_status = k_StorageGetStatus(USB_DISK_UNIT); hStatusTimer = WM_CreateTimer(pMsg->hWin, ID_TIMER_CONNECTION, 500, 0); break; case WM_TIMER: if(prev_usb_status != k_StorageGetStatus(USB_DISK_UNIT)) { prev_usb_status = k_StorageGetStatus(USB_DISK_UNIT); if(prev_usb_status == 0) { if(VideoPlayer_State != VIDEO_IDLE) { _StopPlay(&hvideo, &Video_File); } VideoList.ptr = 0; if(playbackwin) { GUI_EndDialog(playbackwin, 0); playbackwin = 0; SelLayer = 0; GUI_SetLayerVisEx (1, 0); GUI_SelectLayer(0); WM_InvalidateWindow(VideoWin); } if(hFrame) { WM_HideWindow(hFrame); WM_Exec(); WM_DeleteWindow(hFrame); hFrame = 0; } if(hPlaylistWin) { hItem = WM_GetDialogItem(hPlaylistWin, ID_VIDEO_LIST); i = LISTVIEW_GetNumRows(hItem); while(i--) { LISTVIEW_DeleteRow(hItem, i); } } } else { VideoList.ptr = 0; _AddEntireFolder("0:"); _AddEntireFolder("0:/Video"); if(hPlaylistWin) { if(VideoList.ptr > 0) { for(i=0; i<VideoList.ptr; i++) { strcpy(FileInfo.pRoot, (char *)VideoList.file[i].name); FILEMGR_GetFileOnly ((char *)tmp, (char *)FileInfo.pRoot); hItem = WM_GetDialogItem(hPlaylistWin, ID_VIDEO_LIST); LISTVIEW_AddRow(hItem, NULL); LISTVIEW_SetItemText(hItem, 0, i, (char *)tmp); } WM_InvalidateWindow(hItem); WM_Update(hItem); } } } } WM_RestartTimer(pMsg->Data.v, 500); break; case WM_DELETE: if(hStatusTimer != 0) { WM_DeleteTimer(hStatusTimer); hStatusTimer = 0; } break; default: WM_DefaultProc(pMsg); } }
void vWinMngTask(void * pvParameters){ while(1){ WM_Exec(); } }
/** * @brief Callback function of the Camera frame * @param pMsg: pointer to data structure of type WM_MESSAGE * @retval None */ static void _cbCameraWindow(WM_MESSAGE * pMsg) { int NCode; int Id; WM_HWIN hItem; switch (pMsg->MsgId) { case WM_CREATE: if(HomeSettings.b.camera == CAM_1) { /* Title Initialization in play list */ hItem = TEXT_CreateEx(20, 30, 65, 24, pMsg->hWin, WM_CF_SHOW, 0, ID_CAM, "CAM 1"); TEXT_SetFont(hItem, &GUI_FontLubalGraph24B); TEXT_SetTextColor(hItem, GUI_WHITE); } else if(HomeSettings.b.camera == CAM_2) { /* Title Initialization in play list */ hItem = TEXT_CreateEx(20, 30, 65, 24, pMsg->hWin, WM_CF_SHOW, 0, ID_CAM, "CAM 2"); TEXT_SetFont(hItem, &GUI_FontLubalGraph24B); TEXT_SetTextColor(hItem, GUI_WHITE); } else if(HomeSettings.b.camera == CAM_3) { /* Title Initialization in play list */ hItem = TEXT_CreateEx(20, 30, 65, 24, pMsg->hWin, WM_CF_SHOW, 0, ID_CAM, "CAM 3"); TEXT_SetFont(hItem, &GUI_FontLubalGraph24B); TEXT_SetTextColor(hItem, GUI_WHITE); } else if(HomeSettings.b.camera == CAM_4) { /* Title Initialization in play list */ hItem = TEXT_CreateEx(20, 30, 65, 24, pMsg->hWin, WM_CF_SHOW, 0, ID_CAM, "CAM 4"); TEXT_SetFont(hItem, &GUI_FontLubalGraph24B); TEXT_SetTextColor(hItem, GUI_WHITE); } else { /* Title Initialization in play list */ hItem = TEXT_CreateEx(20, 30, 65, 24, pMsg->hWin, WM_CF_SHOW, 0, ID_CAM, "CAM 5"); TEXT_SetFont(hItem, &GUI_FontLubalGraph24B); TEXT_SetTextColor(hItem, GUI_WHITE); } hItem = BUTTON_CreateEx(700, 0, 100, 100, pMsg->hWin, WM_CF_SHOW, 0, ID_BUTTON_MENU); WM_SetCallback(hItem, _cbButton_menu); hItem = BUTTON_CreateEx(0, 379, 100, 100, pMsg->hWin, WM_CF_SHOW, 0, ID_BUTTON_EXIT_FROM_CAM); WM_SetCallback(hItem, _cbButton_exit1); break; case WM_PAINT: if(HomeSettings.b.camera == CAM_1) { GUI_DrawBitmap(&bmcam1, 0, 0); } else if(HomeSettings.b.camera == CAM_2) { GUI_DrawBitmap(&bmcam2, 0, 0); } else if(HomeSettings.b.camera == CAM_3) { GUI_DrawBitmap(&bmcam3, 0, 0); } else if(HomeSettings.b.camera == CAM_4) { GUI_DrawBitmap(&bmcam4, 0, 0); } else { GUI_DrawBitmap(&bmcam5, 0, 0); } GUI_SetColor(GUI_STCOLOR_LIGHTBLUE); GUI_AA_FillRoundedRect((-30), 10, 100, 75, 30); break; case WM_NOTIFY_PARENT: Id = WM_GetId(pMsg->hWinSrc); /* Id of widget */ NCode = pMsg->Data.v; /* Notification code */ switch(Id) { case ID_BUTTON_EXIT_FROM_CAM: switch(NCode) { case WM_NOTIFICATION_RELEASED: /* re-initialize the NOR pin*/ GUI_EndDialog(pMsg->hWin, 0); WM_HideWindow(hCameraFrame); WM_Exec(); WM_DeleteWindow(hCameraFrame); WM_InvalidateWindow(HOME_hWin); break; } break; case ID_BUTTON_MENU: switch(NCode) { case WM_NOTIFICATION_RELEASED: GUI_EndDialog(pMsg->hWin, 0); WM_DeleteWindow(hCameraFrame); WM_DeleteWindow(HOME_hWin); break; } break; } break; case WM_DELETE: break; default: WM_DefaultProc(pMsg); } }