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

📄 functions.inl

📁 乐高机器人的源码,开发平台是IAR_for_AVR.
💻 INL
📖 第 1 页 / 共 5 页
字号:
                while (VarsUi.GUSCursor)
                {
                  VarsUi.UserString[VarsUi.GUSCursor] = 0;
                  VarsUi.GUSCursor--;
                }
              }
              else
              {
                VarsUi.GUSCursor--;
              }
              VarsUi.UserString[VarsUi.GUSCursor] = 0;
              VarsUi.GUSState -= 2;
            }
            else
            {
              VarsUi.UserString[0] = 0;
              VarsUi.GUSState = 100;
            }
          }
          break;

        }
      }
      break;

      default : // Clean up screen
      {
        pMapDisplay->EraseMask |= SCREEN_BIT(SCREEN_BACKGROUND);
        pMapDisplay->UpdateMask = 0;
        IOMapUi.Flags          |= UI_REDRAW_STATUS;
        VarsUi.GUSState         = 0;
      }
      break;
    }
  }

  return (VarsUi.GUSState);
}



//******* cUiDataLogging *****************************************************

void      cUiDrawPortNo(UBYTE *Bitmap,UBYTE MenuIconNo,UBYTE PortNo)
{
  UBYTE   Tmp;

  Bitmap[0] = (UBYTE)(FILEFORMAT_BITMAP >> 8);
  Bitmap[1] = (UBYTE)(FILEFORMAT_BITMAP);
  Bitmap[2] = (UBYTE)(SIZE_OF_PORTBITMAP >> 8);
  Bitmap[3] = (UBYTE)(SIZE_OF_PORTBITMAP);
  Bitmap[4] = DISPLAY_MENUICONS_X_OFFS + DISPLAY_MENUICONS_X_DIFF * MenuIconNo + 2;
  Bitmap[5] = DISPLAY_MENUICONS_Y;
  Bitmap[6] = Port[0].ItemPixelsX;
  Bitmap[7] = Port[0].ItemPixelsY;

  Tmp = 0;
  while (Tmp < Bitmap[6])
  {
    Bitmap[Tmp + FILEHEADER_LENGTH] = Port[0].Data[Tmp + PortNo * Bitmap[6]];
    Tmp++;
  }

}

//******* cUiRunning **********************************************************

void      cUiRunning(UBYTE Action)
{
  switch (Action)
  {
    case MENU_INIT :
    {
      VarsUi.RunIconSave                       = pMapDisplay->pMenuIcons[MENUICON_CENTER];
      VarsUi.RunBitmapPointer                  = 0;
      VarsUi.RunTimer                          = 0;
      pMapDisplay->EraseMask                  |= SCREEN_BIT(SCREEN_LARGE);
      pMapDisplay->UpdateMask                 |= SPECIAL_BIT(TOPLINE);
    }
    break;

    case MENU_RUN :
    {
      if ((IOMapUi.Flags & UI_ENABLE_STATUS_UPDATE))
      {
        if (++VarsUi.RunTimer >= RUN_BITMAP_CHANGE_TIME)
        {
          VarsUi.RunTimer    = 0;
          if (++VarsUi.RunBitmapPointer >= Running->ItemsY )
          {
            VarsUi.RunBitmapPointer      = 0;
          }
          pMapDisplay->pMenuIcons[MENUICON_CENTER]  = (UBYTE*)&Running->Data[VarsUi.RunBitmapPointer * Running->ItemPixelsX * (Running->ItemPixelsY / 8)];
          pMapDisplay->EraseMask                   |= MENUICON_BIT(MENUICON_CENTER);
          pMapDisplay->UpdateMask                  |= MENUICON_BIT(MENUICON_CENTER);
        }
      }
    }
    break;

    case MENU_UPDATE :
    {
      pMapDisplay->pMenuIcons[MENUICON_CENTER]  = (UBYTE*)&Running->Data[VarsUi.RunBitmapPointer * Running->ItemPixelsX * (Running->ItemPixelsY / 8)];
      pMapDisplay->UpdateMask                  |= MENUICON_BIT(MENUICON_CENTER);
    }
    break;

    case MENU_EXIT :
    {
      pMapDisplay->pMenuIcons[MENUICON_CENTER] = VarsUi.RunIconSave;
      pMapDisplay->UpdateMask                  = MENUICON_BITS | SPECIAL_BIT(MENUTEXT);
    }
    break;

  }
}

//******* cUiOnBrickProgramming **********************************************

UBYTE     cUiOnBrickProgramming(UBYTE Action) // On brick programming
{
  switch (Action)
  {
    case MENU_INIT :                    // Show motor / sensor text
    {
      pMapDisplay->pTextLines[TEXTLINE_3] = cUiGetString(TXT_ONBRICKPROGRAMMING_PLEASE_USE_PORT);
      pMapDisplay->pTextLines[TEXTLINE_4] = cUiGetString(TXT_ONBRICKPROGRAMMING_1_TOUCH_SENSOR);
      pMapDisplay->pTextLines[TEXTLINE_5] = cUiGetString(TXT_ONBRICKPROGRAMMING_2_SOUND_SENSOR);
      pMapDisplay->pTextLines[TEXTLINE_6] = cUiGetString(TXT_ONBRICKPROGRAMMING_3_LIGHT_SENSOR);
      pMapDisplay->pTextLines[TEXTLINE_7] = cUiGetString(TXT_ONBRICKPROGRAMMING_4_ULTRA_SONIC);
      pMapDisplay->pTextLines[TEXTLINE_8] = cUiGetString(TXT_ONBRICKPROGRAMMING_BC_LR_MOTORS);
      pMapDisplay->EraseMask             |= (TEXTLINE_BIT(TEXTLINE_3) | TEXTLINE_BIT(TEXTLINE_4) | TEXTLINE_BIT(TEXTLINE_5) | TEXTLINE_BIT(TEXTLINE_6) | TEXTLINE_BIT(TEXTLINE_7) | TEXTLINE_BIT(TEXTLINE_8));
      pMapDisplay->UpdateMask            &= ~SPECIAL_BIT(FRAME_SELECT);
      pMapDisplay->UpdateMask            |= (TEXTLINE_BIT(TEXTLINE_3) | TEXTLINE_BIT(TEXTLINE_4) | TEXTLINE_BIT(TEXTLINE_5) | TEXTLINE_BIT(TEXTLINE_6) | TEXTLINE_BIT(TEXTLINE_7) | TEXTLINE_BIT(TEXTLINE_8) | SPECIAL_BIT(TOPLINE));
      pMapDisplay->TextLinesCenterFlags  |= (TEXTLINE_BIT(TEXTLINE_3) | TEXTLINE_BIT(TEXTLINE_4) | TEXTLINE_BIT(TEXTLINE_5) | TEXTLINE_BIT(TEXTLINE_6) | TEXTLINE_BIT(TEXTLINE_7) | TEXTLINE_BIT(TEXTLINE_8));
      IOMapUi.State = TEST_BUTTONS;
    }
    break;

    case MENU_TEXT :                    // Show empty program steps
    {
      pMapDisplay->EraseMask             |=  SCREEN_BIT(SCREEN_LARGE);

      VarsUi.pTmp = (UBYTE*)Cursor;
      for (VarsUi.Tmp = 0;(VarsUi.Tmp < SIZE_OF_CURSOR) && (VarsUi.Tmp < (UBYTE)sizeof(Cursor));VarsUi.Tmp++)
      {
        VarsUi.CursorTmp[VarsUi.Tmp] = *VarsUi.pTmp;
        VarsUi.pTmp++;
      }

      for (VarsUi.ProgramStepPointer = 0;VarsUi.ProgramStepPointer < ON_BRICK_PROGRAMSTEPS;VarsUi.ProgramStepPointer++)
      {
        VarsUi.ProgramSteps[VarsUi.ProgramStepPointer] = MENU_ACTION_EMPTY;
      }
      VarsUi.ProgramStepPointer = 0;
      Action = MENU_DRAW;
    }
    break;

    case MENU_EXIT :                    // Delete one steps and exit at the end
    {
      if (VarsUi.ProgramStepPointer)
      {
        if (VarsUi.ProgramStepPointer < ON_BRICK_PROGRAMSTEPS)
        {
          VarsUi.ProgramSteps[VarsUi.ProgramStepPointer] = MENU_ACTION_EMPTY;
        }
        VarsUi.ProgramStepPointer--;
      }
      else
      {
        IOMapUi.State  = NEXT_MENU;
      }
      Action = MENU_DRAW;
    }
    break;

    case MENU_RUN :                     // Run program steps until end or user press exit button
    {
      switch (VarsUi.State)
      {
        case 0 :
        {
          VarsUi.pTmp = (UBYTE*)Cursor;
          for (VarsUi.Tmp = 0;(VarsUi.Tmp < SIZE_OF_CURSOR) && (VarsUi.Tmp < (UBYTE)sizeof(Cursor));VarsUi.Tmp++)
          {
            VarsUi.CursorTmp[VarsUi.Tmp] = *VarsUi.pTmp;
            VarsUi.pTmp++;
          }
          pMapDisplay->pBitmaps[BITMAP_1]     = (BMPMAP*)VarsUi.CursorTmp;
          cUiRunning(MENU_INIT);
          Action = MENU_DRAW;
          VarsUi.State++;
        }
        break;

        case 1 :                        // If sound finished -> Init text and program pointer
        {
          if (SOUND_IDLE == pMapSound->State)
          {
            VarsUi.ProgramStepPointer  = ON_BRICK_PROGRAMSTEPS;
            VarsUi.MenuIconTextSave    = pMapDisplay->pMenuText;
            pMapDisplay->EraseMask    |= SPECIAL_BIT(MENUTEXT);
            VarsUi.State++;
          }
        }
        break;

        case 2 :                        // load file to run
        {
          if (PROG_IDLE == pMapCmd->ProgStatus)
          {
            sprintf((char*)pMapCmd->FileName,"%s.%s",(char*)VM_PROGRAM_READER,(char*)TXT_SYS_EXT);
            pMapCmd->ActivateFlag = TRUE;
            VarsUi.State++;
          }
        }
        break;

        case 3 :                        // Wait for end of file
        {
          if (PROG_RUNNING != pMapCmd->ProgStatus)
          {
            pMapCmd->ProgStatus = PROG_RESET;
            VarsUi.State = 99;
            VarsUi.ProgramStepPointer = ON_BRICK_PROGRAMSTEPS;
          }
          else
          {
            if (VarsUi.OBPTimer >= MIN_DISPLAY_UPDATE_TIME)
            {
              if (IOMapUi.OBPPointer != VarsUi.ProgramStepPointer)
              {
                VarsUi.ProgramStepPointer = IOMapUi.OBPPointer;
                Action = MENU_DRAW;
              }
            }
          }
        }
        break;

        default :                       // Program stopped
        {
          pMapDisplay->pMenuText      = VarsUi.MenuIconTextSave;
          pMapDisplay->UpdateMask    |= SPECIAL_BIT(MENUTEXT);
          Action                      = MENU_DRAW;
          VarsUi.State                = 0;
        }
        break;

      }
      if (VarsUi.State)
      {
        cUiRunning(MENU_RUN);
      }
      else
      {
        cUiRunning(MENU_EXIT);
      }
    }
    break;

    case MENU_LEFT :                    // NA
    {
      IOMapUi.State = TEST_BUTTONS;
    }
    break;

    case MENU_RIGHT :                   // NA
    {
      IOMapUi.State = TEST_BUTTONS;
    }
    break;

    case MENU_UPDATE :                  // NA
    {
      Action = MENU_DRAW;
    }
    break;

    case MENU_SAVE :                    // Save NXT program
    {
      switch (VarsUi.State)
      {
        case 0 :
        {
          // Suggest default filename to user
          strcpy((char*)VarsUi.UserString,(char*)DEFAULT_PROGRAM_NAME);
          VarsUi.State++;
        }
        break;

        case 1 :
        {
          if (!cUiGetUserString(1))
          {
            if (VarsUi.UserString[0])
            {
              sprintf((char*)VarsUi.SelectedFilename,"%s.%s",VarsUi.UserString,TXT_FILE_EXT[FILETYPE_NXT]);

              // If tmp file exist -> ask for overwrite
              VarsUi.TmpHandle = pMapLoader->pFunc(FINDFIRST,(UBYTE*)VarsUi.SelectedFilename,VarsUi.FilenameBuffer,&VarsUi.TmpLength);
              if (!(VarsUi.TmpHandle & 0x8000))
              {
                pMapLoader->pFunc(CLOSE,(UBYTE*)&VarsUi.TmpHandle,NULL,NULL);
                VarsUi.State++;
              }
              else
              {
                VarsUi.State += 2;
              }
            }
            else
            {
              VarsUi.State = 99;
            }
          }
        }
        break;

        case 2 :
        {
          if (!cUiFeedback((BMPMAP*)Fail,TXT_FB_OBP_FILE_EXIST_FAIL,TXT_FB_OBP_OVERWRITE_FAIL,0))
          {
            VarsUi.State          = 0;
          }
        }
        break;

        case 3 :
        {
          // Rename TEMP_PROGRAM_FILENAME to VarsUi.SelectedFilename(user filename)
          sprintf((char*)VarsUi.FilenameBuffer,"%s.%s",(char*)TEMP_PROGRAM_FILENAME,(char*)TXT_TMP_EXT);
          VarsUi.TmpHandle = pMapLoader->pFunc(RENAMEFILE,VarsUi.FilenameBuffer,VarsUi.SelectedFilename,&VarsUi.TmpLength);
          pMapLoader->pFunc(CLOSE,(UBYTE*)&VarsUi.TmpHandle,NULL,NULL);
          VarsUi.State++;
        }
        break;

        case 4 : // Display saved text
        {
          if (!cUiFeedback((BMPMAP*)Info,TXT_FB_OBP_FILE_SAVED_INFO,0,DISPLAY_SHOW_TIME))
          {
            VarsUi.State++;
          }
        }
        break;

        default :
        {
          cUiMenuPrevFile();
          IOMapUi.State = NEXT_MENU;
          VarsUi.State  = 0;
        }
        break;

      }
    }
    break;

    case MENU_OVERWRITE :               // Over write existing file
    {
      switch (VarsUi.State)
      {
        case 0 :
        {
          // Delete VarsUi.SelectedFilename(user filename)
          VarsUi.TmpHandle = pMapLoader->pFunc(FINDFIRST,(UBYTE*)VarsUi.SelectedFilename,VarsUi.FilenameBuffer,&VarsUi.TmpLength);
          if (!(VarsUi.TmpHandle & 0x8000))
          {
            pMapLoader->pFunc(CLOSE,(UBYTE*)&VarsUi.TmpHandle,NULL,NULL);
            pMapLoader->pFunc(DELETE,VarsUi.SelectedFilename,NULL,NULL);
          }

          // Rename TEMP_PROGRAM_FILENAME to VarsUi.SelectedFilename(user filename)
          sprintf((char*)VarsUi.FilenameBuffer,"%s.%s",(char*)TEMP_PROGRAM_FILENAME,(char*)TXT_TMP_EXT);
          VarsUi.TmpHandle = pMapLoader->pFunc(RENAMEFILE,VarsUi.FilenameBuffer,VarsUi.SelectedFilename,&VarsUi.TmpLength);
          pMapLoader->pFunc(CLOSE,(UBYTE*)&VarsUi.TmpHandle,NULL,NULL);
          VarsUi.State++;
        }
        break;

        default : // Display saved text
        {
          if (!cUiFeedback((BMPMAP*)Info,TXT_FB_OBP_FILE_SAVED_INFO,0,DISPLAY_SHOW_TIME))
          {
            VarsUi.State  = 0;
          }
        }
        break;

      }

    }
    break;

    default :                           // Insert selected action/waitfor in program and save if finished
    {
      switch (VarsUi.State)
      {
        case 0 :
        {
          VarsUi.ProgramSteps[VarsUi.ProgramStepPointer] = Action;
          if (VarsUi.ProgramStepPointer < ON_BRICK_PROGRAMSTEPS)
          {
            VarsUi.ProgramStepPointer++;
          }
          if (VarsUi.ProgramStepPointer == ON_BRICK_PROGRAMSTEPS)
          {
            // If tmp file exist -> delete it
            sprintf((char*)VarsUi.FilenameBuffer,"%s.%s",(char*)TEMP_PROGRAM_FILENAME,(char*)TXT_TMP_EXT);
            VarsUi.TmpHandle = pMapLoader->pFunc(FINDFIRST,VarsUi.FilenameBuffer,VarsUi.SearchFilenameBuffer,&VarsUi.TmpLength);
            if (!(VarsUi.TmpHandle & 0x8000))
            {
              pMapLoader->pFunc(CLOSE,(UBYTE*)&VarsUi.TmpHandle,NULL,NULL);
              pMapLoader->pFunc(DELETE,VarsUi.FilenameBuffer,NULL,NULL);
            }

            // Save program as tmp file
            VarsUi.TmpLength = FILEHEADER_LENGTH + ON_BRICK_PROGRAMSTEPS;
            VarsUi.TmpHandle = pMapLoader->pFunc(OPENWRITE,VarsUi.FilenameBuffer,NULL,&VarsUi.TmpLength);
            if (!(VarsUi.TmpHandle & 0x8000))
            {
              VarsUi.FileHeader[0] = (UBYTE)(FILEFORMAT_PROGRAM >> 8);
              VarsUi.FileHeader[1] = (UBYTE)(FILEFORMAT_PROGRAM);
              VarsUi.FileHeader[2] = (UBYTE)(ON_BRICK_PROGRAMSTEPS >> 8);
              VarsUi.FileHeader[3] = (UBYTE)(ON_BRICK_PROGRAMSTEPS);
              VarsUi.FileHeader[4] = (UBYTE)(ON_BRICK_PROGRAMSTEPS);
              VarsUi.FileHeader[5] = (UBYTE)0;
              VarsUi.FileHeader[6] = (UBYTE)0;
              VarsUi.FileHeader[7] = (UBYTE)0;
              VarsUi.TmpLength = FILEHEADER_LENGTH;
              pMapLoader->pFunc(WRITE,(UBYTE*)&VarsUi.TmpHandle,(UBYTE*)VarsUi.FileHeader,&VarsUi.TmpLength);
              VarsUi.TmpLength = ON_BRICK_PROGRAMSTEPS;
              pMapLoader->pFunc(WRITE,(UBYTE*)&VarsUi.TmpHandle,(UBYTE*)VarsUi.ProgramSteps,&VarsUi.TmpLength);
              pMapLoader->pFunc(CLOSE,(UBYTE*)&VarsUi.TmpHandle,NULL,NULL);
            }
            else
            {
              VarsUi.State++;
            }
          }
          Action = MENU_DRAW;
        }
        break;

        default : // Display memory error text

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -