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

📄 monitor.c

📁 ct952 source code use for Digital Frame Photo
💻 C
📖 第 1 页 / 共 5 页
字号:
                if (_dwMONProc2PCWrongCnt >= MONITOR_RESET_PROC2_CNT)                {                    printf("\nGo H/W Reset Audio Stage by PC Worng %lx times",_dwMONTemp2,MONITOR_RESET_PROC2_CNT);                    _dwMONFailCounter = MONITOR_FAIL_CHECT_TIMES+3;                    _dwMONOKCounter = 0;                    _dwMONProc2PCWrongCnt = 0;                }            }            >>>*/        }        if (_dwMONFailCounter >= MONITOR_FAIL_CHECT_TIMES)        {            // wyc1.10-909, when video remainder is not empty and REG_VLD_MBINT_CTL keep in 0x00001c08 more than 10 times.            // Then it mean MPEG dec can't exit the infinite loop and monitor need to force mpegdec break the loop.            // _dwMONTempRem = ( (REG_MCU_VREM+1) &0xffffff )*2;            _dwMONTempRem = MCU_VIDEO_BS_BUF_REMAINDER / 4;                        // wyc1.20-909, found one case video buffer will keep in video remainder 0x10, so check with KC and he said when video            // buffer remainder is more than 6, then decoder will cont decode until less or equal 5. So choose 6 mean video buffer is not            // empty and is safe for this mechanism to force decoder entering STOP mode.            if ((_dwMONTempRem >= 6) && (_dwMONMDecHangCnt >= 10) && (__bModePlay == MODE_PLAYMOTION))            {                _dwMONMDecHangCnt = 0;                // __dwPlayMode = MODE_STOP;                REG_SRAM_PLAYMODE = MODE_STOP;                DBG_Printf(DBG_THREAD_MONITOR, DBG_INFO_MM_INFOFTR,"\nForce MPEGDEC Enter STOP!");            }            // wyc2.17-909S, make recover checking always on when debug mode for fixing video hang in state mechine problem.            // the action stage only do in ERROR_CONCEAL defined to avoid un-expected action in #ifdef ERROR_CONCEAL            _MONITOR_ReadAudioRem(&_dwMONTempRem1);            // video buffer empty and parser just read bits about 1.8s, mean it maybe still picture and don't do error concealment.            // wyc1.10-909, when tiem of chapter is less in title domain, mean it maybe still and don't need to do error concealment.#ifndef NO_DISC_MODE //CoCo2.37p            if ((_dwMONTempRem < 0x20) && (_dwMONTempRem1<=0) && (__wTimeChapter <= 5)&& (__wTimeTitle <= 10) && (__dwSeqEndCode == TRUE) && (__bModePlay != MODE_PLAYAUDIO) && (__wDiscType & BOOK_DVD))             {                // wyc1.10-909, when video almost empty and chapter time is less than 3s. It almost same as still picture and suggest don't need to do error concealment.                {                    DBG_Printf(DBG_THREAD_MONITOR, DBG_INFO_MM_INFOFTR,"\nCancel Recover Action!");                    _dwMONFailCounter = 0;                }            }            else#endif //#ifndef NO_DVD //CoCo2.37p            {                _dwMONFailCounter = 0;                _dwMONGoNextStage = TRUE;                // elmer2.36, CVD issues                if ((__wDiscType & BOOK_2X) && (_dwMONSPCounter >= MONITOR_FAIL_CHECT_TIMES))                {                    DBG_Printf(DBG_THREAD_MONITOR, DBG_INFO_MM_INFOFTR, "\nCVD in only SP mode!");                    _dwMONNextStage = RECOVER_STAGE_NEXT_ITEM;                    _dwMONSPCounter = 0;                }            }#endif //        }#ifdef ERROR_CONCEAL        if (_dwMONOKCounter >=MONITOR_OK_CHECT_TIMES)        {            _dwMONOKCounter = 0;            __dwMONRecoverStage = RECOVER_STAGE_IDLE;            _dwMONNextStage = RECOVER_STAGE_SW_RESET;            _dwMONRecoverCnt = MONITOR_RETRY_COUNT;            _bMaxNextTimes = 0;        }#endif //    }}#ifdef CT950_STYLEDWORD   _dwTimer;extern  BYTE     __bUSBSRCReadError[MAX_STREAM_COUNT];extern  DWORD    __dwMMJPGCount, __dwMMPreJPGCount;extern  BYTE     __bMMJPEGAudioMode;extern  DWORD    __dwFMJPGShowTime;DWORD   __dwAudioFailCnt, __dwVideoFailCnt;BYTE    _bAudioReset = FALSE, _bVideoReset = FALSE, _bAllReset = FALSE;BYTE    _bAudioResetOK = TRUE, _bVideoResetOK = TRUE, _bAllResetOK = TRUE;DWORD   _dwMONPrePCMRem, _dwMONPCMRem;void MONITOR_CheckDMPHang(void){    BYTE bTemp;    if (!__btPlaying)        return;    for (bTemp = 0; bTemp < MAX_STREAM_COUNT; bTemp++)    {        if (__bUSBSRCReadError[bTemp] == TRUE)        {            __bUSBSRCReadError[bTemp] = FALSE;            // JPEG + MUSIC mode            if (__bMMJPEGAudioMode == TRUE)            {                if (bTemp == 1)                // MUSIC                    __dwAudioFailCnt++;                else                // JPEG                    __dwVideoFailCnt++;                PRINTF("MONITOR: Data Read Error on Stream %d\n", bTemp);            }        }        else        {            if (__bAttrPlay & TYPE_CDROM_AUDIO)                _bAudioReset = TRUE, _bAudioResetOK = FALSE, __dwAudioFailCnt++;            if (__bAttrPlay & TYPE_CDROM_VIDEO)                _bVideoReset = TRUE, _bVideoResetOK = FALSE, __dwVideoFailCnt++;            PRINTF("MONITOR: Data Read Error\n");        }    }    if (_bAllResetOK && _bAudioResetOK && (__bAttrPlay & TYPE_CDROM_AUDIO || __bMMJPEGAudioMode == TRUE))    {        _MONITOR_ReadAudioRem(&_dwMONTempRem);        _dwMONPCMRem = MCU_PCM_BUF_REMAINDER;        if (_dwMONPreARemain == _dwMONTempRem || _dwMONPrePCMRem == _dwMONPCMRem)        {            if (!(_dwMONFailCounter++ % 10))                PRINTF("MONITOR: Audio Rem Hold %lx\n", _dwMONFailCounter);            if (_dwMONFailCounter == 30)            {                PRINTF("MONITOR: Recover Audio Hold ...\n");                _dwMONFailCounter = 0;                __dwAudioFailCnt++;                _bAudioReset = TRUE;                _bAudioResetOK = FALSE;            }        }        else        {            _bAudioReset = FALSE;            _bAudioResetOK = TRUE;            _dwMONPreARemain = _dwMONTempRem;            _dwMONPrePCMRem = _dwMONPCMRem;            _dwMONFailCounter = 0;            __dwAudioFailCnt = 0;        }    }    if (_bAllResetOK && _bVideoResetOK && (__bAttrPlay & TYPE_CDROM_VIDEO))    {        if ((OS_GetSysTimer() - _dwTimer) > __dwFMJPGShowTime * COUNT_1_SEC)        {            if (__dwMMJPGCount == __dwMMPreJPGCount)            {                if (!(_dwMONFailCounter2++ % 2))                    PRINTF("MONITOR: Video Rem Hold %lx\n", _dwMONFailCounter2);                if (_dwMONFailCounter2 > 10)                {                    PRINTF("MONITOR: Recover Video Hold ...\n");                    _dwMONFailCounter2 = 0;                    _bVideoReset = TRUE;                    _bVideoResetOK = FALSE;                }            }            else            {                _bVideoReset = FALSE;                _bVideoResetOK = TRUE;                __dwMMPreJPGCount = __dwMMJPGCount;                _dwMONFailCounter2 = 0;                __dwVideoFailCnt = 0;            }            _dwTimer = OS_GetSysTimer();        }    }    if (_bAllResetOK && (((__dwAudioFailCnt + __dwVideoFailCnt) > 20 || __dwAudioFailCnt > 10 || __dwVideoFailCnt > 10)))    {        _bAudioResetOK = FALSE;        __dwAudioFailCnt = __dwVideoFailCnt = 0;        _bVideoReset = _bAudioReset = FALSE;        _bVideoResetOK = _bAudioResetOK = TRUE;        _bAllReset = TRUE;    }}#endif  // CT950_STYLE#endif  // ERROR_CONCEAL#ifdef ERROR_CONCEAL#ifdef SUPPORT_STBvoid MONITOR_CheckDVBHang(void){    if(DVB_GetAudioVideoPause() == FALSE && __btPlaying == TRUE && b8InstantReplayStatus == FALSE)    {                if( DVB_AudioGetPID() != 0)        {            _MONITOR_ReadAudioRem(&_dwMONTempRem);            if (_dwMONPreARemain == _dwMONTempRem)            {                _dwMONOKCounter = 0;                if (ap_ch_get_current_srv_type() == EN_SERVICE_TYPE_RADIO)                {                    _dwInterFailCnt++;                    _dwMONFailCounter+=2;                    if ((_dwMONFailCounter % 6) == 2)                    {                        DBG_Printf(DBG_THREAD_MONITOR, DBG_INFO_MM_INFOFTR,"\nTV R_S A_Rem Hold, Cnt: %lx!",_dwMONFailCounter);                    }                }                else                {                    _dwInterFailCnt++;                                        _dwMONFailCounter++;                    if ((_dwMONFailCounter % 3) == 1)                    {                        DBG_Printf(DBG_THREAD_MONITOR, DBG_INFO_MM_INFOFTR,"\nTV R_S A_Rem Hold, Cnt: %lx!",_dwMONFailCounter);                    }                }            }            else            {                __bHangCnt = 0;                __bNoService = FALSE;                _dwMONOKCounter++;                _dwMONFailCounter = 0;                _dwMONPreARemain = _dwMONTempRem;            }        }        if (ap_ch_get_current_srv_type() != EN_SERVICE_TYPE_RADIO && DVB_VideoGetPID() != 0)        {            _dwMONTempRem = REG_VLD_MBINT_CTL;            if ((_dwMONMDecChkHang == _dwMONTempRem) && (((_dwMONTempRem & 0x00004000)==0x00004000) || ((_dwMONTempRem & 0x00001800)==0x00001800) || ((_dwMONTempRem & 0x00007800)==0x00007800) ))                _dwMONMDecHangCnt++;            else                _dwMONMDecHangCnt=0;            _dwMONMDecChkHang = REG_VLD_MBINT_CTL;            // wyc2.03-909S                            // _dwMONTempRem = ( (REG_MCU_VREM+1) &0xffffff )*2;            _dwMONTempRem = MCU_VIDEO_BS_BUF_REMAINDER / 4;                        if ( _dwMONTempRem == 0)            {                _dwInterFailCnt++;                _dwMONFailCounter += 5;                                if ((_dwMONFailCounter % 3) == 1)                {                    DBG_Printf(DBG_THREAD_MONITOR, DBG_INFO_MM_INFOFTR,"\nTV R_S V_Rem Hold, Cnt: %lx!",_dwMONFailCounter);                }                            }                          else if (_dwMONPreVRemain == _dwMONTempRem)            {                _dwMONOKCounter = 0;                _dwInterFailCnt++;                                                    _dwMONFailCounter++;                if ((_dwMONFailCounter % 3) == 1)                {                    DBG_Printf(DBG_THREAD_MONITOR, DBG_INFO_MM_INFOFTR,"\nTV R_S V_Rem Hold, Cnt: %lx!",_dwMONFailCounter);                }            }            else            {                __bHangCnt = 0;                __bNoService = FALSE;                _dwMONOKCounter++;                _dwMONFailCounter = 0;                _dwMONPreVRemain = _dwMONTempRem;            }           }    }            if (_dwMONFailCounter >= MONITOR_DVB_FAIL_CHECT_TIMES)    {        __bHangCnt++;        // wyc1.10-909, when video remainder is not empty and REG_VLD_MBINT_CTL keep in 0x00001c08 more than 10 times.        // Then it mean MPEG dec can't exit the infinite loop and monitor need to force mpegdec break the loop.        // _dwMONTempRem = ( (REG_MCU_VREM+1) &0xffffff )*2;        _dwMONTempRem = MCU_VIDEO_BS_BUF_REMAINDER / 4;                // wyc1.20-909, found one case video buffer will keep in video remainder 0x10, so check with KC and he said when video        // buffer remainder is more than 6, then decoder will cont decode until less or equal 5. So choose 6 mean video buffer is not        // empty and is safe for this mechanism to force decoder entering STOP mode.        if(ap_ch_get_current_srv_type() == EN_SERVICE_TYPE_TV)        {            if ((_dwMONTempRem >= 6) && (_dwMONMDecHangCnt >= 10))            {                _dwMONMDecHangCnt = 0;                DBG_Printf(DBG_THREAD_MONITOR, DBG_INFO_MM_INFOFTR,"\nForce MPEGDEC Enter STOP!");            }            __bTVHang = TRUE;                    }        else if( ap_ch_get_current_srv_type() == EN_SERVICE_TYPE_RADIO)        {            __bRadioHang = TRUE;        }                if(__bHangCnt > MAXHANGCNT)        {             __bNoService = TRUE;        }        // wyc2.17-909S, make recover checking always on when debug mode for fixing video hang in state mechine problem.        // the action stage only do in ERROR_CONCEAL defined to avoid un-expected action in #ifdef ERROR_CONCEAL        _dwMONFailCounter = 0;#endif //    }    }#endif#endifvoid MONITOR_CheckWatchDog(void){#ifdef ERROR_CONCEAL#ifdef SUPPORT_WATCH_DOG    REG_SRAM_WATCHDOG++;    #ifndef NO_DISC_MODE#ifdef SUPPORT_WATCHDOG_BURNIN    {        //DWORD dwSaveInt;        // elmer2.78, support burn-in testing        HAL_ReadStorage(SETUP_ADDR_WATCHDOG, &_bWatchdogData, EPROM_WATCHDOG_BYTE);        //printf("_bWatchdogData = %lx\n", _bWatchdogData);        if (_bWatchdogData == 0x78 && __dwWatchdogTime != 0 && OS_GetSysTimer() - __dwWatchdogTime > COUNT_2_SEC * 30)        {            _bWatchdogData = 0xFF;            printf("Watchdog bites ...\n");            HAL_ReadStorage(SETUP_ADDR_NVPLAYMODE, &__bNVPlayMode, EPROM_NVPLAYMODE_BYTE);            HAL_ReadStorage(SETUP_ADDR_REPEATMODE, &__bRepeat, EPROM_REPEATMODE_BYTE);            HAL_WriteStorage(SETUP_ADDR_WATCHDOG, &_bWatchdogData, EPROM_WATCHDOG_BYTE);            HAL_WriteStorage(SETUP_ADDR_NVPLAYMODE, &_bWatchdogData, EPROM_NVPLAYMODE_BYTE);            HAL_WriteStorage(SETUP_ADDR_REPEATMODE, &_bWatchdogData, EPROM_REPEATMODE_BYTE);            if (__wDiscType & BOOK_DVD && NV_TitlePlay(1, 1))

⌨️ 快捷键说明

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