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

📄 c_ui.c

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