📄 option.cpp
字号:
// Option.cpp : implementation file
//
#include "stdafx.h"
#include "tcCMMB.h"
#include "Option.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#pragma comment(lib,"../tcCommon/telechipsskin.lib");
/////////////////////////////////////////////////////////////////////////////
// COption dialog
static CTL_INFO main_uiscan[]={
{IDC_BTN_OK, 395,226,474,266, TRUE},
{IDC_BTN_START,18,227,97,267,TRUE},
{0}, // end of array
};
#define FONT_COLOR RGB(72, 143, 165)
#define OSD_COLOR RGB(0x6e, 0x9a, 0xb8)
#define CHANNEL_X 252
#define CHANNEL_Y 240
#define SIGNAL_X 295
#define SIGNAL_Y 240
#define SCAN_PROGRESS_X 107
#define SCAN_PROGRESS_Y 235
#define SCAN_PROGRESS_W 2
#define SCAN_PROGRESS_H 27
#define PROGRESS_LENGTH 135
#define COUNTRY_LEFT 17
#define COUNTRY_TOP 42
#define COUNTRY_RIGHT 209
#define COUNTRY_BOTTOM 219
#define CHANNELS_LEFT 242
#define CHANNELS_TOP 42
#define CHANNELS_RIGHT 472
#define CHANNELS_BOTTOM 219
RECT CHANNELINFO={107,235,392,263};
#define FREQSUM 69
int ChinaCMMBfreqPoint[FREQSUM] = {
0,53,60,68,80,88,
171,179,187,195,203,211,219,
474,482,491,498,506,
514,522,530,538,546,
554,562,610,618,626,
634,642,650,658,666,
674,682,690,698,706,
714,722,730,738,746,
754,762,770,778,786,794,
802,810,818,826,834,
842,850,858,866,874,
0,882,890,898,906,914,
922,930,938,946
};
DWORD ScanThread(void *para);
HANDLE ScanThreadHandle=NULL;
extern HANDLE mhTsif;
extern int dataend;
DWORD mMaxChannel=FREQSUM;
DWORD mCurrChannel=0;
UINT mTimerID=NULL;
PROGRAMINFOITEM ServerInfo[30];
int ServerSum=0;
BYTE scanFrameBuffer[0xffff] = "";
static CCMMBSCANDemuxer scanDemuxer;
int tpTvScanGetSync(unsigned char * sync)
{
BOOL result;
DWORD len=0;
if(mhTsif==NULL)
{
return -1;
}
result=DeviceIoControl(mhTsif,IOCTL_GET_SYNC_STATUS,NULL,0, sync,sizeof(unsigned char), &len,NULL);
if(result==FALSE)
return -1;
return 0;
}
int tpTvScanFrequency(unsigned char start,unsigned char end)
{
unsigned char freq[2]={start,end};
unsigned char vaildfreq=0;
DWORD len=0;
BOOL result;
SYS_STATUS status;
if(mhTsif==NULL)
{
return -1;
}
result=DeviceIoControl(mhTsif,IOCTL_SCAN_FREQUENCY,&freq,
sizeof(unsigned char)*2, NULL,0, &len,NULL);
if(result==FALSE)
return -1;
do{
memset(&status,0,sizeof(status));
result=DeviceIoControl(mhTsif,IOCTL_GET_SYS_STATUS,NULL,0, &status,sizeof(status), &len,NULL);
if(result==FALSE)
return -1;
}while(status.scan_process==1);
if(status.scan_result==1)
{
vaildfreq=status.current_frequency;
printf("Find a valid frequency %d\n", vaildfreq);
return vaildfreq;
}else{
printf("There is not valid frequency between %d to %d\n", start, end);
return -12;
}
}
void CCMMBSCANDemuxer::OnVideoNalData(DWORD dwRelativeTime,BYTE* data, WORD len, NAL_FRAGMENT_POS_IND StartEnd)
{
}
void CCMMBSCANDemuxer::OnAudioAacFrame(DWORD dwRelativeTime, BYTE* data, WORD len)
{
}
void CCMMBSCANDemuxer::OnContinusServiceInfo(CService& rService)
{
//here, read continual service table from CsctConf
printf("\nOnScan::CmctConf: ");
bool flag=TRUE;
if((rService.serviceid>=0x200)&&(rService.serviceid<=0x3FFF))
{
for(int i=0;i<ServerSum;i++)
{
if((ServerInfo[i].freqPoint==rService.freq)
&&(ServerInfo[i].ServerID==rService.serviceid))
{
flag=FALSE;
break;
}
}
if(flag)
{
ServerInfo[ServerSum].freqPoint=rService.freq;
ServerInfo[ServerSum].ServerID=rService.serviceid;
ServerInfo[ServerSum].startTs=rService.startTs;
ServerInfo[ServerSum].nts=rService.nts;
ServerInfo[ServerSum].demod=rService.demod;
ServerSum++;
}
}
printf("%d,%d,%d,%d,%d #\n",
ChinaCMMBfreqPoint[mCurrChannel],rService.serviceid,
rService.startTs,rService.nts,rService.demod);
}
void CCMMBSCANDemuxer::OnShortServiceInfo(CService& rService, int left)
{
//here, read continual service table from CsctConf
// printf("\nCsct: ");
// ChannelArray[ChannelSum].freqPoint=rService.freq;
// ChannelArray[ChannelSum].ServerID=rService.serviceid;
// ChannelArray[ChannelSum].startTs=rService.startTs;
// ChannelArray[ChannelSum].nts=rService.nts;
// ChannelSum++;
// printf("%d,%d,%d,%d #",rService.freq,rService.serviceid,rService.startTs,rService.nts);
// printf("\n");
}
DWORD ScanThread(void *para)
{
unsigned char buf[512]={0};
printf("Scan starting...........\n");
while(dataend)
{
DWORD bytes;
ReadFile(mhTsif, scanFrameBuffer, 0xfc00, &bytes, 0);
scanDemuxer.Demultiplex(scanFrameBuffer, bytes);
Sleep(1);
}
printf("Scan SUCCESS!!!!!\n");
return 1;
}
COption::COption(CWnd* pParent /*=NULL*/)
: CSkinDialog(COption::IDD, pParent)
{
//{{AFX_DATA_INIT(COption)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
mbAvailableChannelSet = FALSE;
}
void COption::DoDataExchange(CDataExchange* pDX)
{
CSkinDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(COption)
DDX_Control(pDX, IDC_BTN_START, m_btn_start);
DDX_Control(pDX, IDC_BTN_OK, m_btn_ok);
DDX_Control(pDX, IDC_CHANNEL_LIST, m_ChannelList);
DDX_Control(pDX, IDC_COUNTRY_LIST, m_CountryList);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(COption, CSkinDialog)
//{{AFX_MSG_MAP(COption)
ON_BN_CLICKED(IDC_BTN_OK, OnBtnOk)
ON_BN_CLICKED(IDC_BTN_START, OnBtnStart)
ON_WM_PAINT()
ON_LBN_SELCHANGE(IDC_COUNTRY_LIST, OnSelchangeCountryList)
ON_WM_TIMER()
ON_WM_ERASEBKGND()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// COption message handlers
void COption::OnBtnOk()
{
// TODO: Add your control notification handler code here
if(ScanProgramSum>0)
{
mpScanData = fopen(SCAN_DATA_PATH, "w");
for(int i=0;i<ScanProgramSum;i++)
{
fwprintf(mpScanData, L"%d ", pInfo[i].freqPoint);
fwprintf(mpScanData, L"%d ", pInfo[i].ServerID);
fwprintf(mpScanData, L"%d ", pInfo[i].startTs);
fwprintf(mpScanData, L"%d ", pInfo[i].nts);
fwprintf(mpScanData, L"%d\n", pInfo[i].demod);
}
}
if (mpScanData) {
fclose(mpScanData);
mpScanData = NULL;
}
CSkinDialog::OnOK();
}
void COption::OnBtnStart()
{
// TODO: Add your control notification handler code here
if(mScanStatus==FALSE){
ServerSum=0;
ScanProgramSum=0;
memset(pInfo,0,sizeof(PROGRAMINFOITEM)*30);
mCurrChannel=13;
m_ChannelList.ResetContent();
mhTsif=NULL;
ScanInitPlayer();
mTimerID = (UINT)SetTimer(0xBAD, 1000, NULL); // Scan timer
InvalidateRect(&CHANNELINFO,TRUE);
UpdateWindow();
AttachBitmapToButton(IDB_BTN_SCANSTOP_OFF, IDB_BTN_SCANSTOP_ON, &m_btn_start);
}else{
ScanReleasePlayer();
KillTimer(mTimerID);
mCurrChannel=0;
InvalidateRect(&CHANNELINFO,TRUE);
UpdateWindow();
AttachBitmapToButton(IDB_BTN_SCANSTART_OFF, IDB_BTN_SCANSTART_ON, &m_btn_start);
}
mScanStatus=!mScanStatus;
}
BOOL COption::OnInitDialog()
{
// load background bitmap
SetBKBitmapID(IDB_SCANMAIN);
SetCTLInfo(main_uiscan);
CSkinDialog::OnInitDialog();
// TODO: Add extra initialization here
InitButtons();
GetScannedInfo();
mScanStatus = FALSE;
ScanProgramSum=0;
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void COption::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CBrush brush;
brush.CreateSolidBrush(RGB(0x86,0xB4,0xcf));
RECT scanprogress={SCAN_PROGRESS_X,SCAN_PROGRESS_Y,SCAN_PROGRESS_X + (mCurrChannel*PROGRESS_LENGTH/mMaxChannel),
SCAN_PROGRESS_Y+SCAN_PROGRESS_H};
dc.FillRect(&scanprogress,&brush);
brush.DeleteObject();
CFont font;
font.CreateFont(16, 0, 0, 0, FW_BOLD, FALSE, FALSE, 0, ANSI_CHARSET,
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH | FF_SWISS, _T("Arial"));
dc.SelectObject(&font);
dc.SetBkMode(TRANSPARENT);
dc.SetTextColor(FONT_COLOR);
char str[32];
sprintf(str, "Freq %d", ChinaCMMBfreqPoint[mCurrChannel]);
dc.ExtTextOut(CHANNEL_X, CHANNEL_Y, ETO_OPAQUE, NULL, str, NULL);
font.DeleteObject();
// Do not call CDialog::OnPaint() for painting messages
}
BOOL COption::DestroyWindow()
{
// TODO: Add your specialized code here and/or call the base class
ScanReleasePlayer();
KillTimer(mTimerID);
return CSkinDialog::DestroyWindow();
}
void COption::InitButtons()
{
m_CountryList.MoveWindow(COUNTRY_LEFT, COUNTRY_TOP, COUNTRY_RIGHT-COUNTRY_LEFT, COUNTRY_BOTTOM-COUNTRY_TOP);
m_ChannelList.MoveWindow(CHANNELS_LEFT, CHANNELS_TOP, CHANNELS_RIGHT-CHANNELS_LEFT, CHANNELS_BOTTOM-CHANNELS_TOP);
AttachBitmapToButton(IDB_BTN_SCANOK_OFF, IDB_BTN_SCANOK_ON, &m_btn_ok);
AttachBitmapToButton(IDB_BTN_SCANSTART_OFF, IDB_BTN_SCANSTART_ON, &m_btn_start);
}
BOOL COption::GetScannedInfo()
{
m_CountryList.AddString(_T("China"));
mpScanData = fopen(SCAN_DATA_PATH, "rb");
if (!mpScanData)
return FALSE;
DWORD dummy,freq=0,serverid=0,startTs=0,nts=0,demod=0;
CString buff;
while(fscanf(mpScanData, "%d", &freq) != EOF )
{
// fscanf(mpScanData, "%d", &freq);
fscanf(mpScanData, "%1c", &dummy);
fscanf(mpScanData, "%d", &serverid);
fscanf(mpScanData, "%1c", &dummy);
fscanf(mpScanData, "%d", &startTs);
fscanf(mpScanData, "%1c", &dummy);
fscanf(mpScanData, "%d", &nts);
fscanf(mpScanData, "%1c", &dummy);
fscanf(mpScanData, "%d", &demod);
// printf("%d %d\n",freq,serverid);
if(freq>=69)
freq=0;
buff.Format(_T("%d %d %d %d %d"),ChinaCMMBfreqPoint[freq],serverid,startTs,nts,demod);
m_ChannelList.AddString(buff);
}
return TRUE;
}
void COption::OnSelchangeCountryList()
{
// TODO: Add your control notification handler code here
}
void COption::ScanInitPlayer()
{
mhTsif = CreateFile(L"INN1:", GENERIC_READ | GENERIC_WRITE, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(mhTsif == INVALID_HANDLE_VALUE) {
MessageBox(L"TSIF Open Fail");
return ;
}
dataend=1;
ScanThreadHandle=CreateThread(NULL, 0, ScanThread,0,0,NULL);
SetThreadPriority(ScanThreadHandle,THREAD_PRIORITY_LOWEST);
}
void COption::ScanReleasePlayer()
{
dataend=0;
Sleep(1000);
if (ScanThreadHandle) {
CloseHandle(ScanThreadHandle);
ScanThreadHandle= NULL;
}
if(mhTsif != NULL)
{
CloseHandle(mhTsif);
mhTsif = NULL;
}
}
void COption::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
int result;
if( (mTimerID && nIDEvent != mTimerID) )
goto Jump;
if( mbAvailableChannelSet )
{
for(int j=0;j<20;j++)
{
result=tpTvGetServiceInfo();
printf("++++tpTvGetServiceInfo=%d\n",result);
if(result==0)
{
UpdateProgramInfo();
break;
}
else{
if(j==19)
break;
Sleep(500);
}
}
}
mCurrChannel++;
if (mCurrChannel > mMaxChannel) {
mCurrChannel=0;
mScanStatus = FALSE;
KillTimer(mTimerID);
ScanReleasePlayer();
AttachBitmapToButton(IDB_BTN_SCANSTART_OFF, IDB_BTN_SCANSTART_ON, &m_btn_start);
InvalidateRect(&CHANNELINFO,TRUE);
UpdateWindow();
CSkinDialog::OnTimer(nIDEvent);
return;
}
InvalidateRect(&CHANNELINFO,TRUE);
UpdateWindow();
mbAvailableChannelSet=ChannelSelect(mCurrChannel);
KillTimer(nIDEvent);
if( mbAvailableChannelSet )
mTimerID=(UINT)SetTimer(0xBAD, 1000, NULL); // Scan timer
else
mTimerID=(UINT)SetTimer(0xBAD, 10, NULL); // Scan timer
Jump:
CSkinDialog::OnTimer(nIDEvent);
}
void COption::UpdateProgramInfo()
{
CString buffer;
Sleep(1000);
m_ChannelList.ResetContent();
for(int i=0;i<ServerSum;i++)
{
pInfo[i].freqPoint = ServerInfo[i].freqPoint;
pInfo[i].ServerID = ServerInfo[i].ServerID;
pInfo[i].startTs = ServerInfo[i].startTs;
pInfo[i].nts = ServerInfo[i].nts;
pInfo[i].demod=ServerInfo[i].demod;
printf("UpdateProgramInfo::%d,%d,%d,%d,%d #\n",
pInfo[i].freqPoint,pInfo[i].ServerID,
pInfo[i].startTs,pInfo[i].nts,pInfo[i].demod);
buffer.Format(_T("%d %d %d %d %d"),ChinaCMMBfreqPoint[pInfo[i].freqPoint],
pInfo[i].ServerID,pInfo[i].startTs,pInfo[i].nts,pInfo[i].demod);
m_ChannelList.AddString(buffer);
}
ScanProgramSum = ServerSum;
UpdateData(FALSE);
}
BOOL COption::ChannelSelect(int channel)
{
int result=0;
BYTE Syncflag;
for(int i=0;i<3;i++)
{
result=tpTvSetFreq(channel);
printf("++++tpTvSetFreq %d =%d\n",ChinaCMMBfreqPoint[channel],result);
if(result==0)
break;
}
if(result!=0)
return FALSE;
Sleep(1500);
result=tpTvScanGetSync(&Syncflag);
if(result==0)
{
printf("ChannelSelect::SyncStatue=%d\n",Syncflag);
if(Syncflag == 0x08){
return TRUE;
}
}
return FALSE;
}
BOOL COption::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
return CSkinDialog::OnEraseBkgnd(pDC);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -