📄 filemakerdlg.cpp
字号:
cl = ( (data ) << 16 ) + ( (data) << 8 ) + ( ( data ) & 0xff );
pDC->SetPixel( 80 + i, 270 + j, cl );
pbuf++;
}
}
/*412 -
i=0;
j=0;
do
{
if ( *pbuf > 127 )
{
data = ( *(pbuf+1) << 2 );
cl = ( data << 16 ) + ( data << 8 ) + data;
for ( k=0;k<=(*pbuf & 0x7f);k++ )
{
pDC->SetPixel( 100 + i, 250 + j, cl );
i++;
if ( i >= 412 )
{
i=0;
j++;
if ( j >= 288 )
break;
}
}
if ( j >= 288 )
break;
pbuf++;
}
else
{
data = ( *pbuf << 2 );
cl = ( data << 16 ) + ( data << 8 ) + data;
pDC->SetPixel( 100 + i, 250 + j, cl );
i++;
if ( i >= 412 )
{ i=0;
j++;
if ( j >= 288 )
break;
}
}
pbuf++;
}
while( (pbuf - TheViewDataBuffer) < 128*1024 );
*/
ReleaseDC(pDC);
m_USBtransferring = FALSE;
UpdateData(FALSE);
//TheDeviceSampleState = TRUE;
break;
case 3:
m_USBtransferring = TRUE;
UpdateData(FALSE);
break;
case 10:
m_MessageList.AddString(MsgStr);
MsgStr=_T(" ");
i=0;
// for ( i=0;i<DataBuffer[0]+1;i++ )
{// tmp.Format("0x%02x,",DataBuffer[i+1]);
MsgStr += tmp;
if ( ( (i+1) % 8 ) == 0 )
{ m_MessageList.AddString(MsgStr);
MsgStr=_T(" ");
}
}
m_MessageList.AddString(MsgStr);
break;
case 20:
m_MessageList.AddString(MsgStr);
// m_HandUp1 = TheChannelState.HangUpFlag;
UpdateData(FALSE);
break;
case 21:
m_MessageList.AddString(MsgStr);
break;
case 22:
MsgStr.Format("控制寄存器1值 0x%02x", lParam);
m_MessageList.AddString(MsgStr);
break;
case 25:
m_CommondDataCtrl.EnableWindow(TRUE);
break;
};
}
void CFileMakerDlg::OnCancel()
{
// TODO: Add extra cleanup here
if ( USBconnectstate || USB_Video_transfer || USB_Video_Playing )
{ if ( MessageBox("确认中断运行过程?","进度提示", MB_ICONEXCLAMATION | MB_OKCANCEL ) == IDCANCEL )
return;
}
AllthreadQuit = TRUE;
if(hThread_USB_Video!=NULL)
WaitForSingleObject(hThread_USB_Video,INFINITE);
if(hThread_USB_ISO_READ!=NULL)
WaitForSingleObject(hThread_USB_ISO_READ,INFINITE);
if(hThread_USB_ISO_WRITE!=NULL)
WaitForSingleObject(hThread_USB_ISO_WRITE,INFINITE);
if( TheWriteDataBuffer != NULL)
free(TheWriteDataBuffer);
if( TheViewDataBuffer != NULL)
free(TheViewDataBuffer);
CDialog::OnCancel();
}
unsigned WINAPI USB_ISO_READ_Thread(LPVOID pParam) //数据读取处理线程
{
ULONG i;
HANDLE hTheThread=GetCurrentThread();
SetThreadPriority(hTheThread,THREAD_PRIORITY_NORMAL);
HANDLE hDevice = NULL;
BOOL bResult = FALSE;
ULONG nBytes = 0;
int nItems = 0;
ISO_TRANSFER_CONTROL IsoControl;
ULONG bytesToRead;
PUCHAR buffer = NULL;
ULONG packetsRead;
PUSBD_ISO_PACKET_DESCRIPTOR isoDesc;
PUCHAR ptr;
ULONG pass = 0;
UCHAR count = 0;
ULONG framesRead = 0;
ULONG framesMissed = 0;
if (bOpenDriver (&hDevice, "Ezusb-0") == FALSE)
{
MessageBox(NULL,_T(" 初始化错误\n驱动程序未安装或通信线路未联接"),_T("安装错误"),MB_OK|MB_ICONHAND);
hDevice = NULL;
return 0;
}
IsoControl.PacketSize = 9;
IsoControl.PacketCount = 32; //max 250 ms
IsoControl.PipeNum = 4;
IsoControl.BufferCount = 2;
IsoControl.FramesPerBuffer = 10;
bytesToRead = IsoControl.PacketCount * (IsoControl.PacketSize + sizeof(USBD_ISO_PACKET_DESCRIPTOR));
buffer = (PUCHAR) malloc(bytesToRead);
if (!buffer)
{
MessageBox(NULL,_T("alloc Failed"),_T("安装错误"),MB_OK|MB_ICONHAND);
CloseHandle(hDevice);
return 0;
}
char TempChar[8];
int c,j,k,l;
while (!Stop_ISO_READ && !AllthreadQuit)
{
bResult = DeviceIoControl (hDevice,
IOCTL_Myusb_READ_ISO_BUFFER,
&IsoControl,
sizeof(ISO_TRANSFER_CONTROL),
buffer,
bytesToRead,
&nBytes,
NULL);
if (bResult != TRUE)
{
MessageBox(NULL,_T("Read ISO Buffer Failed"),_T("安装错误"),MB_OK|MB_ICONHAND);
break;
}
packetsRead = nBytes / (IsoControl.PacketSize + sizeof(USBD_ISO_PACKET_DESCRIPTOR));
ptr = buffer;
isoDesc = (PUSBD_ISO_PACKET_DESCRIPTOR) (buffer + (packetsRead * IsoControl.PacketSize));
//char tmp[80];
//sprintf(tmp,"packetsRead = %d",packetsRead);
//m_Journal.AddJournalLog(tmp);
for (i=0;i<packetsRead;i++)
{
framesRead++;
if (!(framesRead % 1000))
{
//SetDlgItemInt(hDlg,IDC_FRAMES_READ,framesRead/1000,FALSE);
TheTimeCounter = framesRead/1000*1000 + TheTimeCounter % 1000;
PostMessage(TheHandleFileMakerDlg,MW_SOMEONEMSG, 0,0);
}
if (isoDesc[i].Length < 8 )
{
framesMissed++;
TheTimeCounter = TheTimeCounter / 1000*1000 + framesMissed % 1000;
PostMessage(TheHandleFileMakerDlg,MW_SOMEONEMSG, 0,0);
if ( TheChannelEnable )
{
//for(k=0;k<8;k++)
// TempChar[k] = 0;
m_mydata.AddBufferData(TempChar,8);
}
}
else
if ( TheChannelEnable )
{
for(k=0;k<8;k++) //每mS内的采样次数=8
{ l = *(ptr+k);
c=0;
for (j=0;j<8;j++)
{ c <<= 1;
if ( ( l & ( 0x01 << j ) ) > 0 )
c |= 0x01;
}
TempChar[k] = l;
}
m_mydata.AddBufferData(TempChar,8);
}
ptr += IsoControl.PacketSize;
}
Sleep(10); //max 250 ms
}
CloseHandle (hDevice);
free(buffer);
return 0;
}
void CFileMakerDlg::OnButtonUpdate()
{
// TODO: Add your control notification handler code here
if ( !TheUpdateDataReady )
{
UpdateData(TRUE);
int filehandle,DataLength;
CString Warning;
char str[20];
sprintf(str,"./%s.BIN",m_PlayFileName);
if( ( filehandle = _open(str, _O_RDONLY | _O_BINARY ) ) != -1 )
{
DataLength = (int) _filelength( filehandle );
if ( ( TheUpdateStartAddress & 0x00ff) == 0
&& ( DataLength + TheUpdateStartAddress ) <= 1048576 ) //1M bytes
{
if ( TheUpdateDataBuffer != NULL )
free(TheUpdateDataBuffer);
TheUpdateDataBuffer = (unsigned char *)malloc( DataLength + 256 );
if( TheUpdateDataBuffer == NULL )
{ AfxMessageBox("不能分配足够的数据缓冲空间!");
return;
}
if ( _read( filehandle, TheUpdateDataBuffer, DataLength ) == DataLength )
{
TheUpdateDataLength = DataLength / 256 + 1;
TheUpdateDataAddress = ( TheUpdateStartAddress & 0x0fff00 ) >> 8;
m_ButtonUpdate.SetWindowText(_T("停止更新"));
m_FileNameCtrl.EnableWindow(FALSE);
m_FlashUpdateAddrCtrl.EnableWindow(FALSE);
TheUpdateDataReady = TRUE;
_close( filehandle );
return;
}
Warning.Format("数据文件%s读取失败!",str);
AfxMessageBox(Warning);
_close( filehandle );
return;
}
Warning.Format("数据文件%s大小与起始地址不匹配!",str);
AfxMessageBox(Warning);
_close( filehandle );
return;
}
Warning.Format("数据文件%s打开错误!",str);
AfxMessageBox(Warning);
return;
}
else
{
m_ButtonUpdate.SetWindowText(_T("开始更新"));
m_FileNameCtrl.EnableWindow(TRUE);
m_FlashUpdateAddrCtrl.EnableWindow(TRUE);
TheUpdateDataReady = FALSE;
}
}
typedef struct _THREAD_CONTROL
{
HANDLE hDevice;
PISO_TRANSFER_CONTROL isoControl;
PVOID buffer;
ULONG buffSize;
HANDLE completionEvent;
} THREAD_CONTROL, *PTHREAD_CONTROL;
void IsoTransferThread(
LPVOID pp
)
{
BOOLEAN bResult = FALSE;
ULONG nBytes;
PTHREAD_CONTROL threadControl = ( PTHREAD_CONTROL )pp;
// reset the pipe
bResult = DeviceIoControl (threadControl->hDevice,
IOCTL_Myusb_RESETPIPE,
&(threadControl->isoControl->PipeNum),
sizeof(ULONG),
NULL,
0,
&nBytes,
NULL);
if (!bResult)
{
goto IsoTransferDone;
}
// perform the ISO transfer
bResult = DeviceIoControl (threadControl->hDevice,
IOCTL_Myusb_ISO_WRITE,
threadControl->isoControl,
sizeof(ISO_TRANSFER_CONTROL),
threadControl->buffer,
threadControl->buffSize,
&nBytes,
NULL);
IsoTransferDone:
// if an event exists, set it
if (threadControl->completionEvent)
SetEvent(threadControl->completionEvent);
return ;
}
typedef struct _READ_WRITE_FILE_THREAD_CONTROL
{
CFile * pFile;
BOOL Direction;
PVOID Buffer;
ULONG inLength;
ULONG outLength;
BOOL Result;
} READ_WRITE_FILE_THREAD_CONTROL, *P_READ_WRITE_FILE_THREAD_CONTROL;
unsigned WINAPI ReadWriteBufferFromFile(
LPVOID lpParameter
)
{
unsigned int c,l,j,k;
P_READ_WRITE_FILE_THREAD_CONTROL pRWctrl = ( P_READ_WRITE_FILE_THREAD_CONTROL ) lpParameter;
pRWctrl->Result = FALSE;
if ( pRWctrl->Direction )
pRWctrl->pFile->Write(pRWctrl->Buffer, pRWctrl->inLength);
else
{ pRWctrl->outLength = pRWctrl->pFile->Read(pRWctrl->Buffer, pRWctrl->inLength);
for(k=0;k<pRWctrl->outLength;k++) //每mS内的采样次数=8
{ l = * ( (unsigned char *)pRWctrl->Buffer + k ) ;
c=0;
for (j=0;j<8;j++)
{ c <<= 1;
if ( ( l & ( 0x01 << j ) ) > 0 )
c |= 0x01;
}
*((unsigned char *)pRWctrl->Buffer+k) = l;
}
}
pRWctrl->Result = TRUE;
return 0;
}
unsigned WINAPI USB_ISO_WRITE_Thread(
LPVOID lpParameter
)
{
return 0;
}
unsigned WINAPI USB_Video_Thread(
LPVOID lpParameter
)
{
BOOL result;
BOOL ClearDataFlag= FALSE;
BOOL TheWholeReadEnable=FALSE,TheWholeReadIsReady=FALSE,TheDataWriteDone=FALSE;
unsigned char *pSendBuffer,*pReadBuffer,*pBuffer;
int TheDataReadLength,TheViewStartPoint;
int temp,total;
BYTE TheCounterError;
BOOL TheDataDownloading=FALSE;
int UpdateStartAddress,UpdateDataPackageNum;
HANDLE hTheThread=GetCurrentThread();
SetThreadPriority(hTheThread,THREAD_PRIORITY_TIME_CRITICAL);
pSendBuffer=(BYTE*)malloc(64*1024); //格口数据发送指针
pReadBuffer=(BYTE*)malloc(64*1024); //格口数据读取指针
if(pSendBuffer==NULL || pReadBuffer==NULL)
{
::MessageBox(NULL,"内存不足","严重错误",MB_OK|MB_ICONHAND);
return 0;
}
while (!Stop_Video_Connect && !AllthreadQuit)
{
result=session.TransferSetupPacket( TEST_CMD, 0, 0, 0, session.hDataBuffer);
/* if ( session.HaveDataToSendBack )
{ pBuffer = pReadBuffer;
if ( session.TransferSetupPacket(0x53, 0, 0, session.SendBackPackageNum, buffer) )
{ Sleep(50);
if ( session.DoRead (session.SendBackPackageNum, pBuffer ) )
{ Sleep(50);
memcpy( DataBuffer , pBuffer , session.SendBackPackageNum*256 );
PostMessage(TheHandleFileMakerDlg,MW_SOMEONEMSG, 10, 0 );
ClearDataFlag = !session.TransferSetupPacket(0xc3, 0x02, 0x5a, 0, pBuffer);
if ( !ClearDataFlag )
Sleep(50);
}
}
}
if ( ClearDataFlag )
{ if ( session.TransferSetupPacket(0xc3, 0x02, 0x5a, 0, buffer) )
{ Sleep(50);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -