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

📄 functions.inl

📁 乐高机器人的源码,开发平台是IAR_for_AVR.
💻 INL
📖 第 1 页 / 共 5 页
字号:
        {
          if (!cUiFeedback((BMPMAP*)Fail,TXT_FB_OBP_MEMORY_FULL_FAIL,0,DISPLAY_SHOW_ERROR_TIME))
          {
            cUiMenuPrevFile();
            IOMapUi.State = NEXT_MENU;
            VarsUi.State  = 0;
          }
        }
        break;

      }
    }
    break;

  }

  // Update display screen
  if (Action == MENU_DRAW)
  {
    VarsUi.OBPTimer = 0;

    for (VarsUi.Pointer = 0;VarsUi.Pointer < ON_BRICK_PROGRAMSTEPS;VarsUi.Pointer++)
    {
      VarsUi.Tmp = VarsUi.ProgramSteps[VarsUi.Pointer];
      if ((VarsUi.Tmp >= MENU_ACTION_EMPTY) && (VarsUi.Tmp < MENU_ACTION_INVALID))
      {
        VarsUi.Tmp -= MENU_ACTION_EMPTY;
        pMapDisplay->StepIcons[VarsUi.Pointer] = VarsUi.Tmp + 1;
      }
      if ((VarsUi.Tmp >= MENU_WAIT_EMPTY) && (VarsUi.Tmp < MENU_WAIT_INVALID))
      {
        VarsUi.Tmp -= MENU_WAIT_EMPTY;
        pMapDisplay->StepIcons[VarsUi.Pointer] = VarsUi.Tmp + 1 + 16;
      }
      if (VarsUi.Tmp == MENU_LOOP)
      {
        pMapDisplay->StepIcons[VarsUi.Pointer] = 31;
      }
      if (VarsUi.Tmp == MENU_STOP)
      {
        pMapDisplay->StepIcons[VarsUi.Pointer] = 32;
      }
      pMapDisplay->UpdateMask          |= STEPICON_BIT(STEPICON_1 + VarsUi.Pointer);
    }

    // and cursor
    pMapDisplay->pBitmaps[BITMAP_1]     = (BMPMAP*)VarsUi.CursorTmp;
    if (VarsUi.ProgramStepPointer < ON_BRICK_PROGRAMSTEPS)
    {
      VarsUi.CursorTmp[4] = 13 + (VarsUi.ProgramStepPointer * 17);
      VarsUi.CursorTmp[5] = 24;
      pMapDisplay->UpdateMask          |= BITMAP_BIT(BITMAP_1);
    }
    if (PROG_RUNNING != pMapCmd->ProgStatus)
    {
      pMapDisplay->EraseMask           |= (TEXTLINE_BIT(TEXTLINE_3) | TEXTLINE_BIT(TEXTLINE_2));
    }
    pMapDisplay->EraseMask             |= TEXTLINE_BIT(TEXTLINE_4);
    pMapDisplay->UpdateMask            |= (SPECIAL_BIT(STEPLINE) | SPECIAL_BIT(TOPLINE));
  }

  return (VarsUi.State);
}



//******* cUiFileRun **********************************************************

UBYTE     cUiFindFileType(UBYTE *Filename) // Find file type number
{
  UBYTE   Ext[FILENAME_LENGTH + 1];
  UBYTE   Result;
  UBYTE   Tmp1;
  UBYTE   Tmp2;

  Result = FILETYPE_ALL;

  Tmp1   = 0;
  while ((Filename[Tmp1]) && (Tmp1 < FILENAME_LENGTH))    // Search forward for termination
  {
    Tmp1++;
  }

  while ((Tmp1) && (Filename[Tmp1] != '.'))               // Search backward for "."
  {
    Tmp1--;
  }

  if (Filename[Tmp1] == '.')                              // If "."
  {
    Tmp1++;
    Tmp2 = 0;

    while ((Filename[Tmp1]) && (Tmp1 < FILENAME_LENGTH))  // Convert to upper to Ext
    {
      Ext[Tmp2] = tolower(Filename[Tmp1]);
      Tmp1++;
      Tmp2++;
    }
    Ext[Tmp2] = 0;                                        // Inser termination

    // Calculate type
    for (Tmp1 = FILETYPE_ALL;(Tmp1 < FILETYPES) && (Result == FILETYPE_ALL);Tmp1++)
    {
      if (strcmp((char*)TXT_FILE_EXT[Tmp1],(char*)Ext) == 0)
      {
        Result = Tmp1;
      }
    }
  }

  return (Result);
}


#define   FILERUN_FILENAMELINE   TEXTLINE_4
#define   FILERUN_TEXTLINE       TEXTLINE_5

UBYTE     cUiFileRun(UBYTE Action)      // Run selected file
{
  switch (Action)
  {

    case MENU_INIT :
    {
      VarsUi.Tmp   = 0;
      while ((VarsUi.SelectedFilename[VarsUi.Tmp]) && (VarsUi.Tmp < FILENAME_LENGTH))    // Search forward for termination
      {
        VarsUi.Tmp++;
      }

      while ((VarsUi.Tmp) && (VarsUi.SelectedFilename[VarsUi.Tmp] != '.'))               // Search backward for "."
      {
        VarsUi.Tmp--;
      }

      if (VarsUi.Tmp > DISPLAYLINE_LENGTH)
      {
        VarsUi.Tmp = DISPLAYLINE_LENGTH;
      }

      VarsUi.DisplayBuffer[VarsUi.Tmp] = 0;

      while (VarsUi.Tmp)                                                           // Copy only name not ext
      {
        VarsUi.Tmp--;
        VarsUi.DisplayBuffer[VarsUi.Tmp] = VarsUi.SelectedFilename[VarsUi.Tmp];
      }

      pMapDisplay->pTextLines[FILERUN_FILENAMELINE] = (UBYTE*)VarsUi.DisplayBuffer;
      pMapDisplay->TextLinesCenterFlags             = TEXTLINE_BIT(FILERUN_FILENAMELINE);
      pMapDisplay->UpdateMask                       = TEXTLINE_BIT(FILERUN_FILENAMELINE);
    }
    break;

    case MENU_RUN :
    {
      if (VarsUi.Timer < DISPLAY_SHOW_TIME)
      {
        VarsUi.Timer++;
      }

      switch (VarsUi.State)
      {
        case 0 :
        {
          IOMapUi.Flags |= UI_BUSY;
          VarsUi.State++;
        }
        break;

        case 1 :                          // Set state from extention when sound is ready
        {
          if (SOUND_IDLE == pMapSound->State)
          {
            pMapDisplay->pTextLines[FILERUN_TEXTLINE]  = cUiGetString(TXT_FILERUN_RUNNING);
            pMapDisplay->UpdateMask                    = (TEXTLINE_BIT(FILERUN_TEXTLINE) | TEXTLINE_BIT(FILERUN_FILENAMELINE));
            pMapDisplay->TextLinesCenterFlags          = (TEXTLINE_BIT(FILERUN_TEXTLINE) | TEXTLINE_BIT(FILERUN_FILENAMELINE));
            cUiRunning(MENU_INIT);
            VarsUi.State++;
          }
        }
        break;

        case 2 :
        {
          if ((!pMapDisplay->EraseMask) && (!pMapDisplay->UpdateMask))
          {
            VarsUi.State = 10 * cUiFindFileType(VarsUi.SelectedFilename);
            if (VarsUi.State == (FILETYPE_TRYME * 10))
            {
              VarsUi.State = FILETYPE_LMS * 10;
            }
          }
        }
        break;

        case (FILETYPE_SOUND * 10 + 0) :  // Start sound file (*.snd, *.rso)  Wait for sound idle
        {
          strcpy((char*)pMapSound->SoundFilename,(char*)VarsUi.SelectedFilename);
          pMapSound->Volume =  IOMapUi.Volume;
          pMapSound->Mode   =  SOUND_ONCE;
          pMapSound->Flags |=  SOUND_UPDATE;
          VarsUi.State++;
        }
        break;

        case (FILETYPE_SOUND * 10 + 1) :  // Wait for stop or user break
        {
          cUiRunning(MENU_RUN);

          if (SOUND_IDLE == pMapSound->State)
          {
            pMapDisplay->pTextLines[FILERUN_TEXTLINE]  = cUiGetString(TXT_FILERUN_ENDED);
            VarsUi.State = 99;
          }
          if (BUTTON_EXIT == cUiReadButtons())
          {
            pMapSound->Flags &= ~SOUND_UPDATE;
            pMapSound->State  =  SOUND_STOP;
            pMapDisplay->pTextLines[FILERUN_TEXTLINE]  = cUiGetString(TXT_FILERUN_ABORTED);
            VarsUi.State = 99;
          }
        }
        break;

        case (FILETYPE_LMS * 10 + 0) : // Start LMS file (*.rxe)
        {
          if ((!pMapDisplay->EraseMask) && (pMapCmd->ProgStatus == PROG_IDLE) && (!pMapButton->State[BTN4]))
          {
            strcpy((char*)pMapCmd->FileName,(char*)VarsUi.SelectedFilename);
            pMapCmd->ActivateFlag = TRUE;
            VarsUi.State++;
          }
        }
        break;

        case (FILETYPE_LMS * 10 + 1) : // Wait for program stop or user break
        {
          cUiRunning(MENU_RUN);

          if ((IOMapUi.Flags & UI_REDRAW_STATUS) && (IOMapUi.Flags & UI_ENABLE_STATUS_UPDATE))
          {
            pMapDisplay->pTextLines[FILERUN_FILENAMELINE] = (UBYTE*)VarsUi.DisplayBuffer;
            pMapDisplay->TextLinesCenterFlags             = TEXTLINE_BIT(FILERUN_FILENAMELINE);
            pMapDisplay->UpdateMask                       = TEXTLINE_BIT(FILERUN_FILENAMELINE);
            pMapDisplay->pTextLines[FILERUN_TEXTLINE]     = cUiGetString(TXT_FILERUN_RUNNING);
            pMapDisplay->UpdateMask                       = (TEXTLINE_BIT(FILERUN_TEXTLINE) | TEXTLINE_BIT(FILERUN_FILENAMELINE));
            pMapDisplay->TextLinesCenterFlags             = (TEXTLINE_BIT(FILERUN_TEXTLINE) | TEXTLINE_BIT(FILERUN_FILENAMELINE));
          }

          switch (pMapCmd->ProgStatus)
          {
            case PROG_RUNNING :
            {
            }
            break;

            case PROG_OK :
            {
              pMapDisplay->pTextLines[FILERUN_TEXTLINE]  = cUiGetString(TXT_FILERUN_ENDED);
              VarsUi.State = 99;
            }
            break;

            case PROG_ABORT :
            {
              pMapDisplay->pTextLines[FILERUN_TEXTLINE]  = cUiGetString(TXT_FILERUN_ABORTED);
              VarsUi.State = 99;
            }
            break;

            default :
            {
              pMapDisplay->pTextLines[FILERUN_TEXTLINE]  = cUiGetString(TXT_FILERUN_FILE_ERROR);
              VarsUi.State = 99;
            }
            break;

          }
        }
        break;

        case (FILETYPE_NXT * 10 + 0) :// Start Program file (*.prg)
        {
          VarsUi.TmpHandle = pMapLoader->pFunc(OPENREAD,VarsUi.SelectedFilename,NULL,&VarsUi.TmpLength);
          if (!(VarsUi.TmpHandle & 0x8000))
          {
            VarsUi.TmpLength = FILEHEADER_LENGTH;
            pMapLoader->pFunc(READ,(UBYTE*)&VarsUi.TmpHandle,VarsUi.FileHeader,&VarsUi.TmpLength);
            VarsUi.TmpLength = ON_BRICK_PROGRAMSTEPS;
            pMapLoader->pFunc(READ,(UBYTE*)&VarsUi.TmpHandle,VarsUi.ProgramSteps,&VarsUi.TmpLength);
            pMapLoader->pFunc(CLOSE,(UBYTE*)&VarsUi.TmpHandle,NULL,NULL);
          }
          if ((ON_BRICK_PROGRAMSTEPS == VarsUi.TmpLength) && (VarsUi.FileHeader[0] == (UBYTE)(FILEFORMAT_PROGRAM >> 8)) && (VarsUi.FileHeader[1] == (UBYTE)(FILEFORMAT_PROGRAM)))
          {
            // 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.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);
            }

            pMapDisplay->UpdateMask &= ~TEXTLINE_BIT(FILERUN_FILENAMELINE);
            pMapDisplay->EraseMask  |=  TEXTLINE_BIT(FILERUN_FILENAMELINE);
            VarsUi.State++;
          }
          else
          {
            pMapDisplay->pTextLines[FILERUN_TEXTLINE]  = cUiGetString(TXT_FILERUN_FILE_ERROR);
            VarsUi.State = 99;
          }
          VarsUi.GUSState = 0;
        }
        break;

        case (FILETYPE_NXT * 10 + 1) : // Wait for program stop or user break
        {
          VarsUi.State = VarsUi.GUSState;
          cUiOnBrickProgramming(MENU_RUN);
          VarsUi.GUSState = VarsUi.State;
          if (VarsUi.State)
          {
            VarsUi.State = (FILETYPE_NXT * 10 + 1);
          }
          else
          {
            pMapDisplay->pTextLines[FILERUN_TEXTLINE]  = cUiGetString(TXT_FILERUN_ENDED);
            VarsUi.State = 99;
          }
        }
        break;

        case 99 :                         // Wait for display show time or user action
        {
          pMapDisplay->EraseMask                     = SCREEN_BIT(SCREEN_LARGE);
          pMapDisplay->UpdateMask                    = (TEXTLINE_BIT(FILERUN_TEXTLINE) | TEXTLINE_BIT(FILERUN_FILENAMELINE));
          pMapDisplay->TextLinesCenterFlags          = (TEXTLINE_BIT(FILERUN_TEXTLINE) | TEXTLINE_BIT(FILERUN_FILENAMELINE));
          IOMapUi.Flags                             |= UI_REDRAW_STATUS | UI_ENABLE_STATUS_UPDATE;
          cUiRunning(MENU_UPDATE);
          VarsUi.Timer = 0;
          VarsUi.State++;
        }
        break;

        default :
        {
          if ((++VarsUi.Timer >= DISPLAY_SHOW_TIME) || (BUTTON_NONE != cUiReadButtons()))
          {
            if (pMapCmd->ProgStatus != PROG_IDLE)
              pMapCmd->ProgStatus              = PROG_RESET;
            pMapDisplay->UpdateMask            = 0;
            pMapDisplay->TextLinesCenterFlags  = 0;
            cUiRunning(MENU_EXIT);
            pMapDisplay->EraseMask             = TEXTLINE_BIT(FILERUN_TEXTLINE);
            pMapDisplay->TextLinesCenterFlags |= TEXTLINE_BIT(FILERUN_FILENAMELINE);
            pMapDisplay->UpdateMask           |= TEXTLINE_BIT(FILERUN_FILENAMELINE);
            IOMapUi.Flags                     &= ~UI_BUSY;
            VarsUi.State                       = 0;
          }
        }
        break;

      }
    }
    break;

  }

  return (VarsUi.State);
}



//******* cUiFileDelete *******************************************************

UBYTE     cUiFileDelete(UBYTE Action)
{
  if (MENU_INIT == Action)
  {
    switch (VarsUi.State)
    {
      case 0 :
      {
        VarsUi.State++;
      }
      break;

      case 1 :
      {
        if (SOUND_IDLE == pMapSound->State)
        {
          VarsUi.State++;
        }
      }
      break;

      case 2 :
      {
        pMapLoader->pFunc(DELETE,VarsUi.SelectedFilename,NULL,NULL);
        VarsUi.State++;
      }
      break;

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

    }
  }

  return (VarsUi.State);
}



//******* cUiView ************************************************************

UBYTE     cUiView(UBYTE Action) // MENU_INIT
{
  switch (VarsUi.State)
  {
    case 0 :
    {

⌨️ 快捷键说明

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