왜 만들어야 하는가

이유는 말 그대로 테스트를 하기 위해서이다. 여기서 말하는 테스트라는 것은 어떤 특정 상황을 가정하고 있다. 예를 들어, 아주 극단적인 환경에서 STB 가 놓였을 때 얼마만큼 잘 실행되는지를 알아보는 것이다.
여기서 내가 테스트 해볼 것은 아래와 같다.

  1. 채널 스캔
  2. 채널 변경
  3. EPG 처리

들이다. 각각의 테스트 항목에 대해서는 각각에 상황에 따라서 테스트 프로그램이 필요하다. 여기서는 어떤 식으로 테스트 프로그램을 만드는지 예제를 통해 살펴보겠다.

채널 스캔

가장 먼저 채널 스캔에 테스트 프로그램부터 만들어보자!

목적 채널 스캔을 무한 루프를 돌려서 도중에 죽은 경우가 있는 지 확인한다
숙지해야 할 것 어디까지를 채널 스캔이 성공되었다고 볼 것인가?, 어디서부터 루프를 돌릴 것인가?

아래는 계속해서 채널 스캔 루프를 도는 테스트 프로그램이다. src/cm/cmchange.c 파일의 일부분이다.

extern void		Key_test(void);            <<<<<<<-------- 반드시 추가해주어야 한다!!!
...
...
...
/* =========================================================================
	Required Functions Description
========================================================================= */
ARENA_RTN_t digitalChannelChange (void)
	{
	clock_t			qTimeOut;
	MSG_TYPE		*pMsgCm, msgCm;
	ARENA_RTN_t		errVal, nimRetrun, errValAv;
 
 
	while (1)
		{
		pMsgCm = message_receive_timeout (pChgDigitalQid, TIMEOUT_IMMEDIATE);//TIMEOUT_INFINITY
		if (pMsgCm == NULL)
			break;
		else
			{
			message_release (pChgDigitalQid, pMsgCm);
//			printf("release\n");
			}
		}
 
	// Channel Change 시 Stream Decode 정지 - KHK
//	avStopDecode();	
 
//	printf("===vch 비우기 전 ====\n");
	cmVchListInitial (&tsVchList);
//	printf("===vch 비움 ====\n");
 
//pys_test
//requestVch.NumInfo.modFormat = CM_QAM256;
//requestVch.NumInfo.carrierFreq = 663000000;
//pys_test
 
	nimRetrun = cmTunePhysical (CM_FREQUENCY, &requestVch.NumInfo);
//	printf("===cmTunePhysical END ====\n");
	currentVch = requestVch;
 
	if (nimRetrun == RTN_OK)
 	  	{
		cmTsParsingStart (PARSING_CHANGE, ARENA_ON);
 
	// channel change
        qTimeOut = time_plus( time_now(), (8 * TICKS_SECOND));
		pMsgCm = message_receive_timeout (pChgDigitalQid, &qTimeOut);	//TIMEOUT_INFINITY,200tick=2sec,1tick=10ms
//	printf("===cmTsParsingStart END ====\n");		
//	task_delay(qTimeOut);
 
//		pMsgCm=NULL;
// printf("===pChgDigitalQid rcv ====\n");
		if (pMsgCm == NULL)
			msgCm.msgId = NULL;
		else
			msgCm = *pMsgCm;
		message_release (pChgDigitalQid, pMsgCm);
 
//printf("===message_release pChgDigitalQid ====\n");
 
		if (msgCm.msgId == NULL)
			{
			sendMsgToUI(TUNING_FAIL);			
			ARENA_Print (("\nCM ERROR:TP parsing timeout CHG\n"));
			return RTN_ERR;
			}
		else if (msgCm.msgId == CM_PARSING_ABORT)
			{		
			return RTN_ABORT;
			}
		else if (msgCm.msgId == CM_PARSING_COMPLETE)
			{
 
			epgParsingEndNotifyToUi();    // scrambled stream인지 알 수 있는 시점,  모든 channel의 change 시마다 호출
 
		//		printf("===epgParsingEndNotifyToUi END ====\n");
 
		//		printf("===epgParsingEndNotifyToUi END ====\n");
			errVal = currentVchGet ();
 
		//		printf("===currentVchGet END ====\n");
		//			printf("===currentVchGet END ====\n");
 
			if (errVal == RTN_OK)
				{
				errValAv = digitalAvOn (currentVch.TpInfo.pcrPID, currentVch.TpInfo.videoPID,
					currentVch.TpInfo.audioPIDkor, currentVch.TpInfo.audioPIDeng, currentVch.TpInfo.audioFormat);
//					printf("===digitalAvOn END ====\n");
 
				#ifdef DEBUG_CM_CHCH
					ARENA_Print (("\n=============== fat81 Current VCH inform ================\n"));
					ARENA_Print (("[Carrier Frequency(Hz)]       %d\n", currentVch.NumInfo.carrierFreq));
					ARENA_Print (("[Major number]                %d\n", currentVch.NumInfo.majorNum));
					ARENA_Print (("[Minor number]                %d\n", currentVch.NumInfo.minorNum));
					ARENA_Print (("[VirtualChannel]              %d\n", currentVch.NumInfo.virtualChannel));
					ARENA_Print (("[programNumber]               0x%x\n", currentVch.TpInfo.programNumber));
					ARENA_Print (("[pcrPid]                      0x%x\n", currentVch.TpInfo.pcrPID));		
					ARENA_Print (("[videoPid]                    0x%x\n", currentVch.TpInfo.videoPID));		
					ARENA_Print (("[audioPIDkor]                    0x%x\n", currentVch.TpInfo.audioPIDkor));
					ARENA_Print (("[audioPIDeng]                    0x%x\n", currentVch.TpInfo.audioPIDeng));
					ARENA_Print (("[audioFormat]                 0x%x\n", currentVch.TpInfo.audioFormat));
					ARENA_Print (("===================================================\n"));       
				#endif
 
				//task_create((void (*)(void *))keyTask, NULL, 8192, 7, "tKEY", 0);
 
				Key_test();     <<<<<<<<---------- 바로 요 부분에 추가!!!
 
				if (errValAv == RTN_OK)
					{
					lastVch = currentVch;	//if only AV, can be enrolled 
//test_nvm					
					nvmLastVchWrite ();
					sendMsgToUI(TUNING_SUCCESS);
					return RTN_OK;					
					}
				else
					{
					sendMsgToUI(TUNING_FAIL);
					return RTN_ERR;
					}
				}
			else
				{
				sendMsgToUI(TUNING_FAIL);						
				ARENA_Print (("\nCM ERROR : digitalChanelChange(), CH DB is different from tsVchList\n"));
				return RTN_ERR;
				}
			}
		else
			{
			sendMsgToUI(TUNING_FAIL);
			ARENA_Print (("\nCM ERROR:TP parsing error\n"));
			return RTN_ERR;
			}		
		}
	else if (nimRetrun == RTN_ABORT)
		{		
		return RTN_ABORT;
		}
	else
		{
		sendMsgToUI(TUNING_FAIL);		
		ARENA_Print (("Tunner Error(Digital) : nimRetrun = 0x%x\n", nimRetrun));
		return RTN_ERR;
		}
	}

함수가 너무 길어서 어디에 추가했는지 못 볼 수가 있는 데, 잘 보면 Key_test() 함수가 보일 것이다. 이번에는 Key_test 라는 함수가 대체 어떤 녀석(?)인지 알아보자!! 위치는 src/common/key/keyboard.c 에 있다.

extern void		Key_test(void);          <<<<<<<-------- 반드시 함수를 정의해주어야 한다
...
...
...
 
 
void Key_test (void)
{
U8 test_key;
 
task_delay(15600);
//pMsgKey = message_receive_timeout (pKeyQid, TIMEOUT_INFINITY);   // 어짜피 키 입력이 들어올 수 없으므로, keyMicom 은 필요없음
test_key=0x20;                   // Menu 키가 입력됨
sendkeyToUI(test_key);           // UI 로 보냄
task_delay(5560);
test_key=0x48;                   // 취소 키가 입력됨
sendkeyToUI(test_key);           // UI 로 보냄
task_delay(5560);
test_key=0x20;
sendkeyToUI(test_key);
task_delay(5560);
 
test_key=0xb8;                   // Down 키가 입력됨
sendkeyToUI(test_key);
task_delay(5560);
 
test_key=0x38;                   // OK 키가 입력됨
sendkeyToUI(test_key);
task_delay(5560);
test_key=0x38;
sendkeyToUI(test_key);
task_delay(5560);
test_key=0x38;
sendkeyToUI(test_key);
task_delay(5560);
}
  • computer/digitalarena/테스트_프로그램만들기.txt
  • Last modified: 3 years ago
  • by likewind