📄 monitor.c
字号:
while( (UTL_GetSysTimer()-_dwMONTemp2) < COUNT_50_MSEC ) { //COMDEC_Command query later HAL_ReadInfo(HAL_INFO_DECCMD_ACK, &_dwMONTemp1); if (_dwMONTemp1 == MODE_STOPPED) break; //release CPU resource to other threads cyg_thread_yield(); } _dwMONTemp1 = REG_MCU_DCR01; HAL_DISABLE_INTERRUPTS(_dwMONTemp2); // Chuan0.66, Use PLAT_RESET_VDEC instead of REG_VLD_INFO MACRO_PLAT_KEY_LOCK( ); REG_PLAT_RESET_CONTROL &= ~(PLAT_RESET_VDEC); // disable the VDEC MACRO_PLAT_KEY_UNLOCK( ); //MACRO_PLAT_RESET_WAITSTABLE( ); //REG_VLD_INFO = 0; MACRO_MCU_RESET_VIDEO_FIFO; // Clear video Fifo HAL_RESTORE_INTERRUPTS(_dwMONTemp2); REG_MCU_DCR00 = _dwMONTemp1; COMDEC_Command(MODE_FORCE_IP, 0); COMDEC_Command(MODE_PLAY, 0);*/ /*HAL_PlayCommand(COMMAND_STOP,0); HAL_Reset(HAL_RESET_VIDEO); HAL_PlayCommand(COMMAND_PLAY,0);*/ _dwMONRecoverCnt--; if (_dwMONRecoverCnt == 0) { _dwMONRecoverCnt = MONITOR_RETRY_COUNT; // When read / write sector is same and not reach end sector, mean SERVO don't read data any more and just issue JUMP sector to read another position data. if (1)//(__SF_SourceGBL[0].dwWriteSector == __SF_SourceGBL[0].dwReadSector) && (__SF_SourceGBL[0].dwWriteSector <= __SF_SourceGBL[0].dwEndSector)) _dwMONNextStage = RECOVER_STAGE_JUMP_SECTOR; else _dwMONNextStage = RECOVER_STAGE_HW_RESET; } else _dwMONNextStage = RECOVER_STAGE_SW_RESET; __dwMONRecoverStage = RECOVER_STAGE_IDLE; break; case RECOVER_STAGE_JUMP_SECTOR: DBG_Printf(DBG_THREAD_MONITOR, DBG_INFO_ASSERTION,"\nR_S Jump Sectors!");#ifndef NO_DISC_MODE //CoCo2.37p if (__wDiscType & BOOK_DVD) { if (__dwMONJumpTime == 0) { _dwMONTemp1 = CELL_QueryTime(); __dwMONJumpTime = __wTimeChapterBegin + (WORD)_dwMONTemp1 + 20; if (((__dwMONJumpTime > __dwMONPreJumpTime) && ((__dwMONJumpTime - __dwMONPreJumpTime) < 100)) || ((__dwMONPreJumpTime > __dwMONJumpTime) && ((__dwMONPreJumpTime - __dwMONJumpTime) < 100))) { // when this time jump position and last time is same, mean CELL return wrong position or F/W enter infinite // loop, so monitor will break it here to avoid infinite loop. _dwMONRecoverCnt = 1; DBG_Printf(DBG_THREAD_MONITOR, DBG_INFO_ASSERTION,"\nJump Same Position!"); } __dwMONPreJumpTime = __dwMONJumpTime; } else { __dwMONJumpTime += (50*(MONITOR_RETRY_COUNT - _dwMONRecoverCnt + 1)); } if (__dwMONJumpTime >= __wTimeTitle ) __dwMONJumpTime = __wTimeTitle; if (__dwMONJumpTime <= _dwMONJumpChkTime) { _dwMONRecoverCnt = MONITOR_RETRY_COUNT; _dwMONNextStage = RECOVER_STAGE_NEXT_ITEM; __dwMONRecoverStage = RECOVER_STAGE_IDLE; break; } else { _dwMONPreARemain = (__dwMONJumpTime / 3600); _dwMONPreAFrmCnt = ((__dwMONJumpTime % 3600) / 60); _dwMONPreVRemain = ((__dwMONJumpTime % 3600) % 60); _dwMONTemp1=MAKE_TMSF(_dwMONPreARemain, (BYTE)_dwMONPreAFrmCnt, (BYTE)_dwMONPreVRemain, 0x0); DBG_Printf(DBG_THREAD_MONITOR, DBG_INFO_ASSERTION,"\nDVD Jump Time: %lx!",_dwMONTemp1); // wyc1.08, CSC suggested to issue source stop and parser stop before gototime, otherwise parser easily show // parser stop failed and abnormal. SrcFilter_Stop(__dwSFStreamID); HAL_ControlParser(HAL_PARSER_STOP, 0); NV_TimePlay(__bTitle, _dwMONTemp1); HAL_Reset(HAL_RESET_VIDEO); //CoCo.050 // DVD_103Micky, fix GoToTime will hang issue // need restore the pla command UTL_TransferCommandID(__bModeCmd); // Micky1.07_909 // wyc1.07-909 _bJumpTime = TRUE; } _dwMONJumpChkTime = __dwMONJumpTime; } else#endif //#ifndef NO_DVD //CoCo2.37p { SrcFilter_Stop(__dwSFStreamID); HAL_ControlParser(HAL_PARSER_STOP, 0); CHIPS_SoftMute(); HAL_Reset(HAL_RESET_AUDIO); HAL_WriteAM(HAL_AM_PLAY_COMMAND, 1); HAL_Reset(HAL_RESET_VIDEO); HAL_PlayCommand(COMMAND_PLAY,0); CHIPS_OpenAudio(TRUE); // LLY2.35, give start and end time for UTL_PlayFromTime() since the API is updated UTL_PlayFromTime(__dwTimeNow+(75*5*(MONITOR_RETRY_COUNT - _dwMONRecoverCnt + 1)), __dwTimeEnd); } _dwMONRecoverCnt--; if (_dwMONRecoverCnt == 0) { _dwMONRecoverCnt = MONITOR_RETRY_COUNT; _dwMONNextStage = RECOVER_STAGE_HW_RESET; } else _dwMONNextStage = RECOVER_STAGE_JUMP_SECTOR; __dwMONRecoverStage = RECOVER_STAGE_IDLE; break; case RECOVER_STAGE_HW_RESET: DBG_Printf(DBG_THREAD_MONITOR, DBG_INFO_ASSERTION,"\nR_S H/W Reset!"); _dwMONNextStage = RECOVER_STAGE_RESET_SERVO; __dwMONRecoverStage = RECOVER_STAGE_IDLE; break; case RECOVER_STAGE_RESET_SERVO: DBG_Printf(DBG_THREAD_MONITOR, DBG_INFO_ASSERTION,"\nR_S Reset Servo!"); SrcFilter_Reset(TRUE); HAL_ControlParser(HAL_PARSER_STOP, 0); PARSER_Command(0, PARSER_CMD_START, 0); _dwMONNextStage = RECOVER_STAGE_NEXT_ITEM; __dwMONRecoverStage = RECOVER_STAGE_IDLE; break; case RECOVER_STAGE_NEXT_ITEM: DBG_Printf(DBG_THREAD_MONITOR, DBG_INFO_ASSERTION,"\nR_S Next Item!");#ifndef NO_DISC_MODE //CoCo2.37p if (__wDiscType & BOOK_DVD) { if ( !NV_Action ( ACTION_NEXT, (WORD)NULL) ) // don't allow next { // ** 2.76-TCHM; begin... // DVD-Title, 1/16(PBC) KEY_NEXT inhibit. Just go MENU_ROOT. If can't, do STOP. if ( __bNVPlayMode ) { if ( ! NV_MenuCall ( MENU_ROOT ) ) { // LLY2.37p, assign KEY_STOP from F/W // To avoid IR and F/W key conflict issue //__bISRKey= KEY_STOP; __bFWKey=KEY_STOP; } } else { // Non-NV mode, just jump to TT/CC= 1/1 NV_TitlePlay ( 1, 1 ); } // ** 2.76-TCHM; end... } else { _bMaxNextTimes++; if (_bMaxNextTimes >= MONITOR_NEXT_TIMES) { _bMaxNextTimes = 0;#if (ERROR_RECOVER_MODE == GO_LONGEST_TITLE) if ( __bSmartPB_ABLE ) { if ( NV_TitlePlay(__bMaxPBT_TT, 1)) { SMAN_PushStateInfo ( STATE_PG, STATUS_READY ); } else { __bFWKey = KEY_STOP; } } #elif (ERROR_RECOVER_MODE == GO_TT_CC_1_1) if ( NV_TitlePlay(1, 1)) { SMAN_PushStateInfo ( STATE_PG, STATUS_READY ); } else { __bFWKey = KEY_STOP; }#endif // } } } else#endif// #ifndef NO_DVD //CoCo2.37p { // ** TCH1.61-1; begin... If VCD 2.0 and PBC mode. Check the valid of LIST_NEXT // If invalid, let's to LINEAR mode#ifndef NO_DISC_MODE //++CoCo2.37p if ( __wDiscType & VCD_2_0 ) { if ( __btPBC ) { if ( ! VCD20_IsValid_Command ( LIST_NEXT ) ) { __bFWKey=KEY_PBC; break; } } }#endif //#ifndef NO_VCD20 //++CoCo2.37p // wyc2.36-909S, power doen servo when next to end of fuss scratched VCD to avoid SERVO abnormal. if ((__bRepeat == REPEAT_NONE) && ( __wPlayItem == __wTrackEnd )) { SrcFilter_PowerMode (SERVO_POWER_STOP); __bFWKey=KEY_STOP; } else { __bFWKey=KEY_NEXT; // elmer2.36, for parser stop fail issue if ( !HAL_ControlParser(HAL_PARSER_STOP, 0)) { OS_SuspendThread(ThreadPARSER.handle); OS_KillThread(ThreadPARSER.handle); INITIAL_ThreadInit(THREAD_PARSER); printf("===========delete parser thread============"); } } // wyc2.36-909S, power doen servo when next to end of fuss scratched VCD to avoid SERVO abnormal. __dwMONRecoverStage = RECOVER_STAGE_PREPARE; break; } }#if 0//def ERROR_CONCEAL // Don't allow entering error concealment mode when still picture. HAL_ReadInfo(HAL_INFO_STILL,&_dwMONTemp1); if (__bStillTime || __bVOBUStill || _dwMONTemp1 == TRUE || __bModeCmd == KEY_SCF || __bModeCmd == KEY_SCB) return; switch (__dwMONRecoverStage) { case RECOVER_STAGE_PREPARE: PRINTF("\nR_S Prepare!"); _dwMONNextStage = RECOVER_STAGE_CHECK; __dwMONRecoverStage = _dwMONNextStage; _dwMONCheckTime = UTL_GetSysTimer(); _dwMONFailCounter = 0; _dwMONCheckVCounter = 0; _dwMONRecoverCnt = 0; _dwMONJumpCnt = 0; __dwMONJumpTime = 0; _MONITOR_ReadAudioRem(&_dwMONPreARemain); // _dwMONPreVRemain = ( (REG_MCU_VREM+1) &0xffffff )*2; _dwMONPreVRemain = MCU_VIDEO_BS_BUF_REMAINDER / 4; break; case RECOVER_STAGE_CHECK: if (_dwMONNextStage == RECOVER_STAGE_CHECK) { if ((__SF_SourceGBL[0].dwWriteSector == __SF_SourceGBL[0].dwReadSector) && (__SF_SourceGBL[0].dwWriteSector <= __SF_SourceGBL[0].dwEndSector)) _dwMONNextStage = RECOVER_STAGE_JUMP_SECTOR; else _dwMONNextStage = RECOVER_STAGE_SW_RESET; } if ((UTL_GetSysTimer() - _dwMONCheckTime) >= COUNT_300_MSEC) { _MONITOR_ReadAudioRem(&_dwMONTemp1); if (_dwMONPreARemain == _dwMONTemp1) { _dwMONFailCounter++; PRINTF("\nR_S A_Rem Don't Update, Check Cnt: %lx!",_dwMONFailCounter); } else { _dwMONFailCounter = 0; _dwMONCheckVCounter = 0; _dwMONPreARemain = _dwMONTemp1; } // _dwMONTemp1 = ( (REG_MCU_VREM+1) &0xffffff )*2; _dwMONTemp1 = MCU_VIDEO_BS_BUF_REMAINDER / 4; if (_dwMONPreVRemain == _dwMONTemp1) { _dwMONCheckVCounter++; PRINTF("\nR_S V_Rem Don't Update, Check Cnt: %lx!",_dwMONCheckVCounter); } else { _dwMONFailCounter = 0; _dwMONCheckVCounter = 0; _dwMONPreVRemain = _dwMONTemp1; } _dwMONCheckTime = UTL_GetSysTimer(); } if ((_dwMONFailCounter + _dwMONCheckVCounter) >= MONITOR_FAIL_CHECT_TIMES) { __dwMONRecoverStage = _dwMONNextStage; } break; case RECOVER_STAGE_SW_RESET: PRINTF("\nR_S S/W Reset A/V!"); HAL_Reset(HAL_RESET_AUDIO); HAL_WriteAM(HAL_AM_PLAY_COMMAND, 1); HAL_Reset(HAL_RESET_VIDEO); HAL_PlayCommand(COMMAND_PLAY,0); _MONITOR_CheckStageInitVars(6); _dwMONRecoverCnt++; if (_dwMONRecoverCnt > 3) _dwMONNextStage = RECOVER_STAGE_JUMP_SECTOR; else _dwMONNextStage = RECOVER_STAGE_SW_RESET; break; case RECOVER_STAGE_JUMP_SECTOR: PRINTF("\nR_S Jump Sectors!");#ifndef NO_DISC_MODE //CoCo2.37p if (__wDiscType & BOOK_DVD) { if (__dwMONJumpTime == 0) { _dwMONTemp1 = CELL_QueryTime(); __dwMONJumpTime = __wTimeChapterBegin + (WORD)_dwMONTemp1 + 10; if (((__dwMONJumpTime > __dwMONPreJumpTime) && ((__dwMONJumpTime - __dwMONPreJumpTime) > 100)) || ((__dwMONPreJumpTime > __dwMONJumpTime) && ((__dwMONPreJumpTime - __dwMONJumpTime) > 100))) { // when this time jump position and last time is same, mean CELL return wrong position or F/W enter infinite // loop, so monitor will break it here to avoid infinite loop. _dwMONJumpCnt = 6; PRINTF("\nJump Same Position!"); } __dwMONPreJumpTime = __dwMONJumpTime; } else { __dwMONJumpTime += (10*(_dwMONJumpCnt+1)); } if (__dwMONJumpTime >= __wTimeTitle ) __dwMONJumpTime = __wTimeTitle; _dwMONPreARemain = (__dwMONJumpTime / 3600); _dwMONPreAFrmCnt = ((__dwMONJumpTime % 3600) / 60); _dwMONPreVRemain = ((__dwMONJumpTime % 3600) % 60); _dwMONTemp1=MAKE_TMSF(_dwMONPreARemain, (BYTE)_dwMONPreAFrmCnt, (BYTE)_dwMONPreVRemain, 0x0); NV_TimePlay(__bTitle, _dwMONTemp1); HAL_Reset(HAL_RESET_VIDEO); //CoCo.050 // DVD_103Micky, fix GoToTime will hang issue // need restore the pla command UTL_TransferCommandID(__bModeCmd); } else#endif //#ifndef NO_DVD //CoCo2.37p { SrcFilter_Stop(); HAL_ControlParser(HAL_PARSER_STOP, 0); CHIPS_SoftMute();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -