// #############################################################################
// *****************************************************************************
// Copyright (c) 2007, Advantech Automation Corp.
// INFORMATION WHICH IS THE PROPERTY OF ADVANTECH AUTOMATION CORP.
//
// *****************************************************************************
// #############################################################################
//
// File: CanTestDlg.cpp
// Created: 8/27/2007
// Description: Main window of CanTest
// -----------------------------------------------------------------------------
#include "stdafx.h"
#include "CanTest.h"
#include "CanTestDlg.h"
#include <setupapi.h>
#include <winioctl.h>
#include <tchar.h>
#include <regstr.h>
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "../../Include/AdvCan.h"
#include "../../Include/AdvCANIO.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern CCanTestApp theApp;
/*****************************************************************************
DESCRIPTION: Send msg info
*****************************************************************************/
int g_SendFlag;
DWORD g_dwCobId;
int g_nLength;
BYTE g_byData[8];
/*****************************************************************************
DESCRIPTION: Send and rceive status
*****************************************************************************/
int g_nSendNum;
int g_nSendTimeOut;
int g_nRcvNum;
int g_nRcvTimeOut;
int g_nBusOff;
int g_nPassive;
int g_nOverRun;
int g_nBOverRun;
/*****************************************************************************
DESCRIPTION: Parameter of data transfer
*****************************************************************************/
int g_nInterval;
int g_nBaud;
int g_nFilterMode;
DWORD g_dwAcceptCode;
DWORD g_dwAcceptMask;
HANDLE g_hDevice;
/*****************************************************************************
DESCRIPTION: Error status
*****************************************************************************/
#define STATUS_OK 0
#define STATUS_BUS_ERROR 1
#define STATUS_BUS_OFF 2
/*****************************************************************************
DESCRIPTION: Run flag of Thread
*****************************************************************************/
BOOL g_bExitReadThreadFlag;
BOOL g_bExitWriteThreadFlag;
/*****************************************************************************
DESCRIPTION: 16 base string to int
*****************************************************************************/
ULONG XStrToInt(char XStr[50])
{
ULONG ret = 0;
char *endptr;
ret = strtoul( XStr, &endptr, 16 );
return ret;
}
BOOL TestData( long nData )
{
if ( nData<0 || nData>255 )
{
return FALSE;
}
else return TRUE;
}
BOOL CheckXStr(char *StrTemp)
{
for(unsigned int i=0; i<_tcslen(StrTemp); i+=sizeof(TCHAR))
{
if(
(StrTemp[i]>=0x30 && StrTemp[i]<=0x39)
|| (StrTemp[i]>=0x41 && StrTemp[i]<=0x46)
|| (StrTemp[i]>=0x61 && StrTemp[i]<=0x66)
)
{
}
else{
return FALSE;
}
}
return TRUE;
}
/*****************************************************************************
DESCRIPTION: Write thread
*****************************************************************************/
UINT ThreadWrite(LPVOID param)
{
int count = 0;
CString strTemp;
OVERLAPPED ov;
DWORD dwWritten;
char DataBuf[10];
while( g_bExitWriteThreadFlag )
{
if(((CCanTestDlg *)(theApp.m_pMainWnd))->m_bAuto )
{
ZeroMemory(DataBuf, 10);
itoa(g_nSendNum, (char*)DataBuf, 10);
char TempBuf[10];
for(int i=0;i<8;i++)
{
ZeroMemory(TempBuf, 10);
memcpy(TempBuf, DataBuf, 8);
TempBuf[i+1] = '\0';
g_byData[i] = atoi(&TempBuf[i]);
//m_editData[i] = TempBuf;
}
//char temstr[10];
CString tmpstr;
//itoa(g_byData[0],temstr,10);
tmpstr.Format("%02X",g_byData[0]);
((CCanTestDlg *)(theApp.m_pMainWnd))->m_editData1.SetWindowText(tmpstr);
tmpstr.Format("%02X",g_byData[1]);
((CCanTestDlg *)(theApp.m_pMainWnd))->m_editData2.SetWindowText(tmpstr);
tmpstr.Format("%02X",g_byData[2]);
((CCanTestDlg *)(theApp.m_pMainWnd))->m_editData3.SetWindowText(tmpstr);
tmpstr.Format("%02X",g_byData[3]);
((CCanTestDlg *)(theApp.m_pMainWnd))->m_editData4.SetWindowText(tmpstr);
tmpstr.Format("%02X",g_byData[4]);
((CCanTestDlg *)(theApp.m_pMainWnd))->m_editData5.SetWindowText(tmpstr);
tmpstr.Format("%02X",g_byData[5]);
((CCanTestDlg *)(theApp.m_pMainWnd))->m_editData6.SetWindowText(tmpstr);
tmpstr.Format("%02X",g_byData[6]);
((CCanTestDlg *)(theApp.m_pMainWnd))->m_editData7.SetWindowText(tmpstr);
tmpstr.Format("%02X",g_byData[7]);
((CCanTestDlg *)(theApp.m_pMainWnd))->m_editData8.SetWindowText(tmpstr);
g_nLength = 8;
}
if(g_nInterval > 0)
Sleep(g_nInterval);
canmsg_t tx[1];
{
ZeroMemory(tx[0].data, 8);
memcpy(tx[0].data, g_byData, 8);
tx[0].flags = g_SendFlag;
tx[0].id = g_dwCobId;
tx[0].length = g_nLength;
}
if (((CCanTestDlg *)(theApp.m_pMainWnd))->m_bRtr)
{
ZeroMemory(tx[0].data, 8);
tx[0].length = 0;
}
memset(&ov, 0, sizeof(OVERLAPPED));
ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
int ret = acCanWrite(g_hDevice, &tx[0], 1, &dwWritten, &ov);
if(ret == SUCCESS)
{
g_nSendNum += dwWritten;
}
else if(ret == TIME_OUT)
{
g_nSendTimeOut ++;
}
CloseHandle(ov.hEvent);
}
return 0;
}
/*****************************************************************************
DESCRIPTION: Read thread
*****************************************************************************/
UINT ThreadRead(void *param)
{
DWORD ReceiveFlag = 0;
DWORD CobId = 0;
DWORD Length = 0;
BYTE Data[8];
DWORD dwRead=0;
CString strTemp, str;
int ret;
BYTE byBuf[100];
OVERLAPPED ov;
while( g_bExitReadThreadFlag )
{
ZeroMemory(byBuf, 100);
canmsg_t *pBuf = (canmsg_t *)byBuf;
memset(&ov, 0, sizeof(OVERLAPPED));
ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
ret = acCanRead(g_hDevice, pBuf, 1, &dwRead, &ov);
CloseHandle(ov.hEvent);
if(ret == SUCCESS || ret==TIME_OUT)
{
if(ret == TIME_OUT)
{
if(g_bExitReadThreadFlag)
g_nRcvTimeOut ++;
}
if(pBuf->id != ERRORID)
g_nRcvNum += dwRead;
}
else{
continue;
}
if(dwRead > 0 )
{
ReceiveFlag = pBuf->flags;
CobId = pBuf->id;
Length = pBuf->length;
memcpy(Data, pBuf->data, 8);
strTemp.Format("No.%-5d ID:%-3x Len%d: %02X %02X %02X %02X %02X %02X %02X %02X",g_nRcvNum, CobId, Length, Data[0], Data[1]\
,Data[2], Data[3],Data[4], Data[5],Data[6], Data[7] );
if (((CCanTestDlg *)(theApp.m_pMainWnd))->m_listView.GetCount() > 10000)
((CCanTestDlg *)(theApp.m_pMainWnd))->m_listView.DeleteString(((CCanTestDlg *)(theApp.m_pMainWnd))->m_listView.GetCount()-1);
if(ReceiveFlag & MSG_EXT)
strTemp += " EFF";
else
strTemp += " SFF";
if(ReceiveFlag & MSG_RTR)
strTemp += "|RTR";
if(ReceiveFlag & MSG_SELF)
strTemp += "|SELF";
if(ReceiveFlag & MSG_BOVR)
{
g_nBOverRun ++;
strTemp += "Buffer overrun error";
}
if(ReceiveFlag & MSG_OVR)
{
g_nOverRun ++;
strTemp += "Fifo overrun error";
}
if(ReceiveFlag & MSG_BUSOFF)
{
g_nBusOff ++;
strTemp += "Bus off error";
}
if(ReceiveFlag & MSG_PASSIVE)
{
strTemp += "Passive error";
g_nPassive ++;
}
if(((CCanTestDlg *)(theApp.m_pMainWnd))->m_cbAssic.GetCheck())
{
strTemp += " ";
for