📄 c_ui.c
字号:
{
for (Pointer = 0;Pointer < STATUSTEXT_SIZE;Pointer++)
{
VarsUi.StatusText[Pointer] = pMapComm->BrickData.Name[Pointer];
}
VarsUi.StatusText[Pointer] = 0;
}
pMapDisplay->EraseMask |= SPECIAL_BIT(STATUSTEXT);
pMapDisplay->UpdateMask |= SPECIAL_BIT(STATUSTEXT);
pMapDisplay->UpdateMask |= (SPECIAL_BIT(TOPLINE) | STATUSICON_BITS);
}
// Clear update flag
IOMapUi.Flags &= ~UI_REDRAW_STATUS;
IOMapUi.Flags &= ~UI_UPDATE;
}
}
else
{
pMapDisplay->UpdateMask &= ~(STATUSICON_BITS | SPECIAL_BIT(TOPLINE) | SPECIAL_BIT(STATUSTEXT));
}
}
void cUiMenuCallFunction(UBYTE Function,UBYTE Parameter)
{
if (Function)
{
VarsUi.Function = Function;
VarsUi.Parameter = Parameter;
}
}
void cUiMenuNextFile(void)
{
MENU *pTmpMenu;
pTmpMenu = (MENU*)cUiGetMenuPointer(VarsUi.pMenuLevel->NextFileNo);
if (pTmpMenu != NULL)
{
if (VarsUi.MenuFileLevel < (MENUFILELEVELS - 1))
{
VarsUi.MenuFileLevel++;
VarsUi.MenuFiles[VarsUi.MenuFileLevel].FileId = VarsUi.pMenuLevel->NextFileNo;
VarsUi.MenuFiles[VarsUi.MenuFileLevel].MenuLevel = 0;
VarsUi.MenuFiles[VarsUi.MenuFileLevel].MenuLevels[VarsUi.MenuFiles[VarsUi.MenuFileLevel].MenuLevel].ItemIndex = VarsUi.pMenuLevel->NextMenuNo;
IOMapUi.pMenu = pTmpMenu;
}
}
}
void cUiMenuPrevFile(void)
{
if (VarsUi.MenuFileLevel)
{
VarsUi.MenuFileLevel--;
IOMapUi.pMenu = (MENU*)cUiGetMenuPointer(VarsUi.MenuFiles[VarsUi.MenuFileLevel].FileId);
}
}
void cUiMenuNext(void)
{
if (VarsUi.pMenuFile->MenuLevel < (MENULEVELS - 1))
{
VarsUi.pMenuFile->MenuLevel++;
VarsUi.pMenuFile->MenuLevels[VarsUi.pMenuFile->MenuLevel].ItemIndex = VarsUi.pMenuLevel->NextMenuNo;
}
}
void cUiMenuPrev(void)
{
if (VarsUi.pMenuFile->MenuLevel)
{
VarsUi.pMenuFile->MenuLevel--;
}
}
void cUiMenuEnter(void)
{
// Call function with parameter (if pressent)
if (!(VarsUi.pMenuLevel->SpecialFlags & MENU_INIT_CALLS))
{
cUiMenuCallFunction(VarsUi.pMenuLevel->FunctionNo,VarsUi.pMenuLevel->Parameter);
}
if (VarsUi.EnterOnlyCalls != TRUE)
{
if ((VarsUi.pMenuLevel->SpecialFlags & MENU_ENTER_LEAVES_MENUFILE))
{
cUiMenuPrevFile();
}
else
{
// Load new menu file (if pressent)
if (VarsUi.pMenuLevel->NextFileNo)
{
cUiMenuNextFile();
}
else
{
// Activate next menu level (if pressent)
if (VarsUi.pMenuLevel->NextMenuNo)
{
cUiMenuNext();
}
}
}
IOMapUi.State = NEXT_MENU;
}
else
{
VarsUi.EnterOnlyCalls = FALSE;
IOMapUi.State = DRAW_MENU;
}
}
void cUiMenuExit(void)
{
if ((VarsUi.pMenuLevel->SpecialFlags & MENU_EXIT_CALLS))
{
// Call function with parameter (if pressent)
if (!(VarsUi.pMenuLevel->SpecialFlags & MENU_INIT_CALLS))
{
cUiMenuCallFunction(VarsUi.pMenuLevel->FunctionNo,VarsUi.pMenuLevel->Parameter);
}
}
// Call function with 0xFF (if ordered)
if ((VarsUi.pMenuLevel->SpecialFlags & MENU_EXIT_CALLS_WITH_FF))
{
cUiMenuCallFunction(VarsUi.pMenuLevel->FunctionNo,MENU_EXIT);
}
if (VarsUi.ExitOnlyCalls != TRUE)
{
if ((VarsUi.pMenuFile->MenuLevel) && (!(VarsUi.pMenuLevel->SpecialFlags & MENU_EXIT_LEAVES_MENUFILE)))
{
if (!(VarsUi.pMenuLevel->SpecialFlags & MENU_EXIT_LOAD_MENU))
{
cUiMenuPrev();
if ((VarsUi.pMenuLevel->SpecialFlags & MENU_BACK_TWICE))
{
if (VarsUi.pMenuFile->MenuLevel)
{
cUiMenuPrev();
}
VarsUi.SecondTime = FALSE;
}
if ((VarsUi.pMenuLevel->SpecialFlags & MENU_BACK_THREE_TIMES))
{
if (VarsUi.pMenuFile->MenuLevel)
{
cUiMenuPrev();
}
if (VarsUi.pMenuFile->MenuLevel)
{
cUiMenuPrev();
}
VarsUi.SecondTime = FALSE;
}
}
else
{
VarsUi.EnterOnlyCalls = FALSE;
VarsUi.ExitOnlyCalls = FALSE;
if (VarsUi.pMenuLevel->NextFileNo)
{
cUiMenuNextFile();
}
else
{
// Activate next menu level (if pressent)
if (VarsUi.pMenuLevel->NextMenuNo)
{
cUiMenuNext();
}
}
}
if ((VarsUi.pMenuLevel->SpecialFlags & MENU_EXIT_LOAD_POINTER))
{
VarsUi.pMenuFile->MenuLevels[VarsUi.pMenuFile->MenuLevel].ItemIndex = (UBYTE)((VarsUi.pMenuLevel->SpecialFlags) >> 24) & 0x0F;
}
}
else
{
if (!(VarsUi.pMenuLevel->SpecialFlags & MENU_EXIT_LOAD_MENU))
{
cUiMenuPrevFile();
}
else
{
VarsUi.EnterOnlyCalls = FALSE;
VarsUi.ExitOnlyCalls = FALSE;
if (VarsUi.pMenuLevel->NextFileNo)
{
cUiMenuNextFile();
}
else
{
// Activate next menu level (if pressent)
if (VarsUi.pMenuLevel->NextMenuNo)
{
cUiMenuNext();
}
}
}
}
IOMapUi.State = NEXT_MENU;
}
else
{
VarsUi.ExitOnlyCalls = FALSE;
IOMapUi.State = DRAW_MENU;
}
}
void cUiLoadLevel(UBYTE FileLevel,UBYTE MenuLevel,UBYTE MenuIndex)
{
UBYTE Tmp;
VarsUi.MenuFileLevel = FileLevel;
VarsUi.MenuFiles[FileLevel].MenuLevel = MenuLevel;
VarsUi.MenuFiles[FileLevel].MenuLevels[MenuLevel].ItemIndex = MenuIndex;
IOMapUi.pMenu = (MENU*)cUiGetMenuPointer(VarsUi.MenuFiles[VarsUi.MenuFileLevel].FileId);
VarsUi.pMenuFile = &VarsUi.MenuFiles[VarsUi.MenuFileLevel];
VarsUi.pMenuLevel = &VarsUi.pMenuFile->MenuLevels[VarsUi.pMenuFile->MenuLevel];
// Count no of menues on current level
VarsUi.pMenuLevel->Items = cUiMenuGetNoOfMenus(IOMapUi.pMenu,VarsUi.pMenuFile);
if (VarsUi.pMenuLevel->Items)
{
// if items > 0 -> prepare allways center icon
Tmp = cUiGetMenuItemIndex(IOMapUi.pMenu,VarsUi.pMenuFile,VarsUi.pMenuLevel->ItemIndex);
if (VarsUi.pMenuItem != &IOMapUi.pMenu->Data[Tmp - 1])
{
VarsUi.pMenuItem = &IOMapUi.pMenu->Data[Tmp - 1];
VarsUi.SecondTime = FALSE;
}
// Save center menu item parameters
VarsUi.pMenuLevel->Id = cUiMenuGetId(VarsUi.pMenuItem);
VarsUi.pMenuLevel->IconImageNo = VarsUi.pMenuItem->IconImageNo;
VarsUi.pMenuLevel->IconText = VarsUi.pMenuItem->IconText;
VarsUi.pMenuLevel->SpecialFlags = cUiMenuGetSpecialMask(VarsUi.pMenuItem);
VarsUi.pMenuLevel->FunctionNo = VarsUi.pMenuItem->FunctionIndex;
VarsUi.pMenuLevel->Parameter = VarsUi.pMenuItem->FunctionParameter;
VarsUi.pMenuLevel->NextFileNo = VarsUi.pMenuItem->FileLoadNo;
VarsUi.pMenuLevel->NextMenuNo = VarsUi.pMenuItem->NextMenu;
}
}
#include "Functions.inl"
void cUiInit(void* pHeader)
{
pHeaders = pHeader;
VarsUi.Initialized = FALSE;
IOMapUi.BluetoothState = BT_STATE_OFF;
IOMapUi.UsbState = 0;
IOMapUi.State = INIT_DISPLAY;
}
void cUiCtrl(void)
{
UBYTE Tmp;
// Testcode for low battery voltage
/*
if ((pMapInput->Inputs[0].InvalidData != INVALID_DATA) && (pMapInput->Inputs[0].ADRaw < 500))
{
if (VarsUi.LowBatt < 255)
{
VarsUi.LowBatt++;
}
}
else
{
VarsUi.LowBatt = 0;
}
*/
//
// Testcode for BT connect request
/*
if ((pMapInput->Inputs[0].InvalidData != INVALID_DATA) && (pMapInput->Inputs[0].ADRaw < 500))
{
IOMapUi.BluetoothState |= BT_CONNECT_REQUEST | BT_PIN_REQUEST;
}
*/
//
// Testcode for BT error attention
/*
if ((pMapInput->Inputs[0].InvalidData != INVALID_DATA) && (pMapInput->Inputs[0].ADRaw < 500))
{
IOMapUi.Error = LR_UNKOWN_ADDR;
IOMapUi.BluetoothState |= BT_ERROR_ATTENTION;
}
*/
//
// Testcode for execute program
/*
if ((pMapInput->Inputs[0].InvalidData != INVALID_DATA) && (pMapInput->Inputs[0].ADRaw < 500))
{
if ((!(IOMapUi.Flags & UI_EXECUTE_LMS_FILE)) && (IOMapUi.State > INIT_MENU))
{
strcpy((char*)IOMapUi.LMSfilename,"Untitled-1.rxe");
IOMapUi.Flags |= UI_EXECUTE_LMS_FILE;
}
}
*/
//
// Testcode for force off
/*
if ((pMapInput->Inputs[0].InvalidData != INVALID_DATA) && (pMapInput->Inputs[0].ADRaw < 500) && (VarsUi.Initialized == TRUE))
{
IOMapUi.ForceOff = TRUE;
}
*/
//
VarsUi.CRPasskey++;
VarsUi.ButtonTimer++;
VarsUi.OBPTimer++;
switch (IOMapUi.State)
{
case INIT_DISPLAY : // Load font and icons
{
VarsUi.Initialized = FALSE;
IOMapUi.Flags = UI_BUSY;
IOMapUi.RunState = 1;
IOMapUi.BatteryState = 0;
IOMapUi.Error = 0;
IOMapUi.ForceOff = FALSE;
VarsUi.LowBatt = 0;
VarsUi.LowBattHasOccured = 0;
pMapDisplay->pFont = (FONT*)Font;
pMapDisplay->pStatusIcons = (ICON*)Status;
pMapDisplay->pStatusText = (UBYTE*)VarsUi.StatusText;
pMapDisplay->pStepIcons = (ICON*)Step;
VarsUi.State = 0;
VarsUi.Pointer = 0;
VarsUi.Timer = -INTRO_START_TIME;
VarsUi.FNOFState = 0;
VarsUi.FBState = 0;
VarsUi.UpdateCounter = 0;
VarsUi.Running = 0;
VarsUi.BatteryToggle = 0;
VarsUi.GUSState = 0;
IOMapUi.pMenu = (MENU*)cUiGetMenuPointer(0);
IOMapUi.State = INIT_INTRO;
pMapDisplay->EraseMask = SCREEN_BIT(SCREEN_BACKGROUND);
pMapDisplay->pBitmaps[BITMAP_1] = (BMPMAP*)Intro[VarsUi.Pointer];
pMapDisplay->UpdateMask = BITMAP_BIT(BITMAP_1);
pMapDisplay->Flags |= DISPLAY_ON;
cUiNVReadByte();
IOMapUi.Volume = cUiNVReadVolumeCount();
IOMapUi.SleepTimeout = PowerOffTimeSteps[cUiNVReadPowerOnTimeCount()];
}
break;
case INIT_LOW_BATTERY :
{
if (++VarsUi.Timer >= (INTRO_LOWBATT_TIME))
{
VarsUi.LowBattHasOccured = 2;
pMapDisplay->EraseMask = SCREEN_BIT(SCREEN_BACKGROUND);
pMapDisplay->pBitmaps[BITMAP_1] = (BMPMAP*)Intro[VarsUi.Pointer];
pMapDisplay->UpdateMask = BITMAP_BIT(BITMAP_1);
IOMapUi.Flags &= ~UI_ENABLE_STATUS_UPDATE;
VarsUi.State = 0;
VarsUi.Pointer = 0;
VarsUi.Timer = -INTRO_START_TIME;
IOMapUi.State = INIT_INTRO;
}
}
break;
case INIT_INTRO :
{
if (VarsUi.LowBattHasOccured == 1)
{
IOMapUi.Flags |= UI_ENABLE_STATUS_UPDATE;
IOMapUi.Flags |= UI_UPDATE;
IOMapUi.Flags |= UI_REDRAW_STATUS;
VarsUi.Timer = 0;
IOMapUi.State = INIT_LOW_BATTERY;
}
else
{
if (VarsUi.LowBattHasOccured == 0)
{
if (VarsUi.LowBatt)
{
pMapDisplay->pBitmaps[BITMAP_1] = (BMPMAP*)LowBattery;
pMapDisplay->UpdateMask = BITMAP_BIT(BITMAP_1);
VarsUi.LowBattHasOccured = 1;
}
}
if (++VarsUi.Timer >= (INTRO_SHIFT_TIME))
{
switch (VarsUi.State)
{
case 0 :
{
pMapDisplay->Flags &= ~DISPLAY_REFRESH;
VarsUi.State++;
}
break;
case 1 :
{
if ((pMapDisplay->Flags & DISPLAY_REFRESH_DISABLED))
{
if (VarsUi.Pointer < NO_OF_INTROBITMAPS)
{
pMapDisplay->EraseMask |= BITMAP_BIT(BITMAP_1);
pMapDisplay->pBitmaps[BITMAP_1] = (BMPMAP*)Intro[VarsUi.Pointer];
pMapDisplay->UpdateMask = BITMAP_BIT(BITMAP_1);
if (VarsUi.Pointer == 11)
{
sprintf((char*)pMapSound->SoundFilename,"%s.%s",(char*)UI_STARTUP_SOUND,(char*)TXT_SOUND_EXT);
pMapSound->Volume = IOMapUi.Volume;
pMapSound->Mode = SOUND_ONCE;
pMapSound->Flags |= SOUND_UPDATE;
}
VarsUi.Pointer++;
}
else
{
pMapDisplay->Flags |= DISPLAY_REFRESH;
IOMapUi.State = INIT_WAIT;
}
VarsUi.State++;
}
}
break;
default :
{
if (!(pMapDisplay->UpdateMask & BITMAP_BIT(BITMAP_1)))
{
pMapDisplay->Flags |= DISPLAY_REFRESH;
VarsUi.Timer = 0;
VarsUi.State = 0;
}
}
break;
}
}
}
}
break;
case INIT_WAIT :
{
if (++VarsUi.Timer >= INTRO_STOP_TIME)
{
pMapDisplay->EraseMask |= SCREEN_BIT(SCREEN_BACKGROUND);
IOMapUi.State = INIT_MENU;
}
}
break;
case INIT_MENU :
{
// Restart menu system
VarsUi.Function = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -