📄 c_ui.c
字号:
VarsUi.MenuFileLevel = 0;
cUiLoadLevel(0,0,1);
cUiLoadLevel(0,1,1);
VarsUi.EnterOnlyCalls = FALSE;
VarsUi.ExitOnlyCalls = FALSE;
IOMapUi.State = NEXT_MENU;
}
break;
case NEXT_MENU : // prepare icons
{
// Init various variables
VarsUi.State = 0;
// Init icon pointers
pMapDisplay->pMenuIcons[MENUICON_LEFT] = NULL;
pMapDisplay->pMenuIcons[MENUICON_CENTER] = NULL;
pMapDisplay->pMenuIcons[MENUICON_RIGHT] = NULL;
cUiLoadLevel(VarsUi.MenuFileLevel,VarsUi.MenuFiles[VarsUi.MenuFileLevel].MenuLevel,VarsUi.MenuFiles[VarsUi.MenuFileLevel].MenuLevels[VarsUi.MenuFiles[VarsUi.MenuFileLevel].MenuLevel].ItemIndex);
// Find menu icons
if (VarsUi.pMenuLevel->Items)
{
// Prepare center icon
pMapDisplay->pMenuIcons[MENUICON_CENTER] = cUiMenuGetIconImage(VarsUi.pMenuLevel->IconImageNo);
pMapDisplay->pMenuText = VarsUi.pMenuLevel->IconText;
if (VarsUi.pMenuLevel->Items == 2)
{
// if 2 menues -> prepare left or right icon
if (VarsUi.pMenuLevel->ItemIndex == 1)
{
Tmp = cUiGetMenuItemIndex(IOMapUi.pMenu,VarsUi.pMenuFile,2);
if (Tmp)
{
Tmp--;
pMapDisplay->pMenuIcons[MENUICON_RIGHT] = cUiMenuGetIconImage(IOMapUi.pMenu->Data[Tmp].IconImageNo);
}
}
else
{
Tmp = cUiGetMenuItemIndex(IOMapUi.pMenu,VarsUi.pMenuFile,1);
if (Tmp)
{
Tmp--;
pMapDisplay->pMenuIcons[MENUICON_LEFT] = cUiMenuGetIconImage(IOMapUi.pMenu->Data[Tmp].IconImageNo);
}
}
}
if (VarsUi.pMenuLevel->Items > 2)
{
// if more menues -> prepare left and right icon
if (VarsUi.pMenuLevel->ItemIndex > 1)
{
Tmp = VarsUi.pMenuLevel->ItemIndex -1;
}
else
{
Tmp = VarsUi.pMenuLevel->Items;
}
Tmp = cUiGetMenuItemIndex(IOMapUi.pMenu,VarsUi.pMenuFile,Tmp);
if (Tmp)
{
Tmp--;
pMapDisplay->pMenuIcons[MENUICON_LEFT] = cUiMenuGetIconImage(IOMapUi.pMenu->Data[Tmp].IconImageNo);
}
if (VarsUi.pMenuLevel->ItemIndex < VarsUi.pMenuLevel->Items)
{
Tmp = VarsUi.pMenuLevel->ItemIndex + 1;
}
else
{
Tmp = 1;
}
Tmp = cUiGetMenuItemIndex(IOMapUi.pMenu,VarsUi.pMenuFile,Tmp);
if (Tmp)
{
Tmp--;
pMapDisplay->pMenuIcons[MENUICON_RIGHT] = cUiMenuGetIconImage(IOMapUi.pMenu->Data[Tmp].IconImageNo);
}
}
}
if ((VarsUi.pMenuLevel->SpecialFlags & MENU_ENTER_ONLY_CALLS))
{
VarsUi.EnterOnlyCalls = TRUE;
}
if ((VarsUi.pMenuLevel->SpecialFlags & MENU_EXIT_ONLY_CALLS))
{
VarsUi.ExitOnlyCalls = TRUE;
}
IOMapUi.State = DRAW_MENU;
}
break;
case DRAW_MENU : // If no function active -> erase screen, draw statusline and menu icons
{
if (VarsUi.Function)
{
// Function active
if (VarsUi.Function < FUNC_NO_MAX)
{
if (Functions[VarsUi.Function](VarsUi.Parameter) == 0)
{
VarsUi.Function = 0;
}
}
else
{
VarsUi.Function = 0;
}
}
else
{
// function inactive - erase screen
if (!(VarsUi.pMenuLevel->SpecialFlags & MENU_LEAVE_BACKGROUND))
{
pMapDisplay->EraseMask |= SCREEN_BIT(SCREEN_LARGE);
// Draw only icons, frame and icon text
pMapDisplay->UpdateMask = (MENUICON_BITS | SPECIAL_BIT(FRAME_SELECT) | SPECIAL_BIT(MENUTEXT));
pMapDisplay->TextLinesCenterFlags = 0;
}
else
{
pMapDisplay->EraseMask |= (SPECIAL_BIT(MENUTEXT) | MENUICON_BITS);
// Draw icons, frame and icon text
pMapDisplay->UpdateMask |= (MENUICON_BITS | SPECIAL_BIT(FRAME_SELECT) | SPECIAL_BIT(MENUTEXT));
}
// Draw status
IOMapUi.Flags |= (UI_ENABLE_STATUS_UPDATE | UI_UPDATE | UI_REDRAW_STATUS);
if ((VarsUi.pMenuLevel->SpecialFlags & MENU_INIT_CALLS_WITH_0) && (VarsUi.SecondTime == FALSE))
{
VarsUi.SecondTime = TRUE;
cUiMenuCallFunction(VarsUi.pMenuLevel->FunctionNo,MENU_INIT);
}
else
{
if ((VarsUi.pMenuLevel->SpecialFlags & MENU_INIT_CALLS_WITH_1) && (VarsUi.SecondTime == FALSE))
{
VarsUi.SecondTime = TRUE;
cUiMenuCallFunction(VarsUi.pMenuLevel->FunctionNo,MENU_INIT_ALTERNATIVE);
}
else
{
if ((VarsUi.pMenuLevel->SpecialFlags & MENU_INIT_CALLS) && (VarsUi.SecondTime == FALSE))
{
VarsUi.SecondTime = TRUE;
cUiMenuCallFunction(VarsUi.pMenuLevel->FunctionNo,VarsUi.pMenuLevel->Parameter);
}
else
{
if ((VarsUi.pMenuLevel->SpecialFlags & MENU_AUTO_PRESS_ENTER))
{
IOMapUi.State = ENTER_PRESSED;
}
else
{
IOMapUi.State = TEST_BUTTONS;
}
}
}
}
}
}
break;
case TEST_BUTTONS : // Test buttons to execute new functions and new menus
{
if (VarsUi.Initialized == FALSE)
{
VarsUi.Initialized = TRUE;
IOMapUi.Flags &= ~UI_BUSY;
}
switch (cUiReadButtons())
{
case BUTTON_LEFT :
{
IOMapUi.State = LEFT_PRESSED;
}
break;
case BUTTON_RIGHT :
{
IOMapUi.State = RIGHT_PRESSED;
}
break;
case BUTTON_ENTER :
{
IOMapUi.State = ENTER_PRESSED;
}
break;
case BUTTON_EXIT :
{
if (!(VarsUi.pMenuLevel->SpecialFlags & MENU_EXIT_DISABLE))
{
IOMapUi.State = EXIT_PRESSED;
}
}
break;
}
}
break;
case LEFT_PRESSED :
{
if ((VarsUi.pMenuLevel->SpecialFlags & MENU_LEFT_RIGHT_AS_CALL))
{
cUiMenuCallFunction(VarsUi.pMenuLevel->FunctionNo,MENU_LEFT);
}
else
{
VarsUi.SecondTime = FALSE;
VarsUi.EnterOnlyCalls = FALSE;
VarsUi.ExitOnlyCalls = FALSE;
if (VarsUi.pMenuLevel->ItemIndex > 1)
{
VarsUi.pMenuLevel->ItemIndex--;
}
else
{
if (VarsUi.pMenuLevel->Items > 2)
{
VarsUi.pMenuLevel->ItemIndex = VarsUi.pMenuLevel->Items;
}
}
}
IOMapUi.State = NEXT_MENU;
}
break;
case RIGHT_PRESSED :
{
if ((VarsUi.pMenuLevel->SpecialFlags & MENU_LEFT_RIGHT_AS_CALL))
{
cUiMenuCallFunction(VarsUi.pMenuLevel->FunctionNo,MENU_RIGHT);
}
else
{
VarsUi.SecondTime = FALSE;
VarsUi.EnterOnlyCalls = FALSE;
VarsUi.ExitOnlyCalls = FALSE;
if (VarsUi.pMenuLevel->ItemIndex < VarsUi.pMenuLevel->Items)
{
VarsUi.pMenuLevel->ItemIndex++;
}
else
{
if (VarsUi.pMenuLevel->Items > 2)
{
VarsUi.pMenuLevel->ItemIndex = 1;
}
}
}
IOMapUi.State = NEXT_MENU;
}
break;
case ENTER_PRESSED :
{
if ((VarsUi.pMenuLevel->SpecialFlags & MENU_ENTER_ACT_AS_EXIT))
{
cUiMenuExit();
}
else
{
cUiMenuEnter();
}
}
break;
case EXIT_PRESSED :
{
if ((VarsUi.pMenuLevel->SpecialFlags & MENU_EXIT_ACT_AS_ENTER))
{
cUiMenuEnter();
}
else
{
cUiMenuExit();
}
}
break;
case CONNECT_REQUEST :
{
if (cUiBTConnectRequest(MENU_INIT) == 0)
{
IOMapUi.BluetoothState &= ~BT_CONNECT_REQUEST;
cUiLoadLevel(0,1,1);
IOMapUi.State = NEXT_MENU;
IOMapUi.Flags &= ~UI_BUSY;
}
}
break;
case EXECUTE_FILE :
{
cUiLoadLevel(0,1,1);
cUiMenuEnter();
cUiLoadLevel(VarsUi.MenuFileLevel,VarsUi.MenuFiles[VarsUi.MenuFileLevel].MenuLevel,VarsUi.MenuFiles[VarsUi.MenuFileLevel].MenuLevels[VarsUi.MenuFiles[VarsUi.MenuFileLevel].MenuLevel].ItemIndex);
cUiMenuEnter();
cUiLoadLevel(VarsUi.MenuFileLevel,VarsUi.MenuFiles[VarsUi.MenuFileLevel].MenuLevel,VarsUi.MenuFiles[VarsUi.MenuFileLevel].MenuLevels[VarsUi.MenuFiles[VarsUi.MenuFileLevel].MenuLevel].ItemIndex);
cUiMenuEnter();
cUiLoadLevel(VarsUi.MenuFileLevel,VarsUi.MenuFiles[VarsUi.MenuFileLevel].MenuLevel,VarsUi.MenuFiles[VarsUi.MenuFileLevel].MenuLevels[VarsUi.MenuFiles[VarsUi.MenuFileLevel].MenuLevel].ItemIndex);
VarsUi.Function = 0;
VarsUi.State = 0;
VarsUi.Pointer = 0;
VarsUi.FNOFState = 0;
VarsUi.FBState = 0;
VarsUi.GUSState = 0;
strcpy((char*)VarsUi.SelectedFilename,(char*)IOMapUi.LMSfilename);
IOMapUi.State = EXECUTING_FILE;
VarsUi.FileType = FILETYPE_LMS;
cUiFileRun(MENU_INIT);
}
break;
case EXECUTING_FILE :
{
if (cUiFileRun(MENU_RUN) == 0)
{
IOMapUi.Flags &= ~UI_EXECUTE_LMS_FILE;
IOMapUi.State = NEXT_MENU;
}
}
break;
case LOW_BATTERY :
{
if (DISPLAY_IDLE)
{
if (cUiReadButtons() != BUTTON_NONE)
{
pMapDisplay->Flags &= ~DISPLAY_POPUP;
pMapDisplay->pBitmaps[BITMAP_1] = (BMPMAP*)VarsUi.LowBattSavedBitmap;
IOMapUi.State = VarsUi.LowBattSavedState;
IOMapUi.Flags &= ~UI_BUSY;
}
}
}
break;
case BT_ERROR :
{
switch (IOMapUi.Error)
{
case LR_COULD_NOT_SAVE :
{
Tmp = TXT_FB_BT_ERROR_LR_COULD_NOT_SAVE_1;
}
break;
case LR_STORE_IS_FULL :
{
Tmp = TXT_FB_BT_ERROR_LR_STORE_IS_FULL_1;
}
break;
default :
{
Tmp = TXT_FB_BT_ERROR_LR_UNKOWN_ADDR_1;
}
break;
}
if (!cUiFeedback((BMPMAP*)Fail,Tmp,Tmp + 1,DISPLAY_SHOW_ERROR_TIME))
{
IOMapUi.BluetoothState &= ~BT_ERROR_ATTENTION;
cUiLoadLevel(0,1,1);
IOMapUi.State = NEXT_MENU;
IOMapUi.Flags &= ~UI_BUSY;
}
}
break;
}
// Check for low battery voltage
if (VarsUi.LowBatt >= LOW_BATT_THRESHOLD)
{
if (!VarsUi.LowBattHasOccured)
{
if (DISPLAY_IDLE)
{
if (!(IOMapUi.Flags & UI_BUSY))
{
pMapDisplay->Flags |= DISPLAY_POPUP;
VarsUi.LowBattHasOccured = 1;
VarsUi.LowBattSavedState = IOMapUi.State;
VarsUi.LowBattSavedBitmap = (UBYTE*)pMapDisplay->pBitmaps[BITMAP_1];
pMapDisplay->pBitmaps[BITMAP_1] = (BMPMAP*)LowBattery;
pMapDisplay->UpdateMask = BITMAP_BIT(BITMAP_1);
IOMapUi.Flags |= UI_REDRAW_STATUS;
IOMapUi.Flags |= UI_BUSY;
IOMapUi.State = LOW_BATTERY;
}
}
}
}
// Check for incomming BT connection requests
if ((IOMapUi.BluetoothState & BT_CONNECT_REQUEST) && (!(IOMapUi.Flags & UI_BUSY)))
{
IOMapUi.Flags |= UI_BUSY;
IOMapUi.State = CONNECT_REQUEST;
}
// Check for BT errors
if ((IOMapUi.BluetoothState & BT_ERROR_ATTENTION) && (!(IOMapUi.Flags & UI_BUSY)))
{
IOMapUi.Flags |= UI_BUSY;
IOMapUi.State = BT_ERROR;
}
// Check for incomming execute program
if ((IOMapUi.Flags & UI_EXECUTE_LMS_FILE) && (!(IOMapUi.Flags & UI_BUSY)))
{
// Reset power down timer
IOMapUi.Flags |= UI_RESET_SLEEP_TIMER;
// Set state and busy
IOMapUi.Flags |= UI_BUSY;
IOMapUi.State = EXECUTE_FILE;
}
// Check for power timeout
if ((IOMapUi.Flags & UI_RESET_SLEEP_TIMER))
{
IOMapUi.Flags &= ~UI_RESET_SLEEP_TIMER;
IOMapUi.SleepTimer = 0;
VarsUi.SleepTimer = 0;
}
if (IOMapUi.SleepTimeout)
{
if (++VarsUi.SleepTimer >= 60000)
{
VarsUi.SleepTimer = 0;
if (++IOMapUi.SleepTimer >= IOMapUi.SleepTimeout)
{
IOMapUi.ForceOff = TRUE;
}
}
}
else
{
IOMapUi.Flags |= UI_RESET_SLEEP_TIMER;
}
// Check for "long prees on exit" power off
if ((pMapButton->State[BTN1] & LONG_PRESSED_EV) && (pMapCmd->ProgStatus != PROG_RUNNING) && (VarsUi.Initialized == TRUE) && (VarsUi.State == 0))
{
IOMapUi.ForceOff = TRUE;
}
// Check for "force" off
if (IOMapUi.ForceOff != FALSE)
{
IOMapUi.ForceOff = FALSE;
VarsUi.Function = FUNC_NO_OFF;
VarsUi.Parameter = MENU_INIT;
VarsUi.State = 0;
IOMapUi.State = DRAW_MENU;
}
// Update status line
cUiUpdateStatus();
}
void cUiExit(void)
{
VarsUi.Initialized = FALSE;
IOMapUi.State = INIT_DISPLAY;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -