⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c_ui.c

📁 乐高机器人的源码,开发平台是IAR_for_AVR.
💻 C
📖 第 1 页 / 共 4 页
字号:
        {
          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 + -