📄 mainform.cpp
字号:
"Start port is too big, please input again!",
"Information",
MB_OK | MB_ICONINFORMATION );
return;
}
Temp = DIPort_Count->Text;
if ( Temp.IsEmpty() )
{
Application->MessageBoxA(
"Please input a appropriate number !",
"Prompt",
MB_OK | MB_ICONINFORMATION);
return;
}
DWORD lPortCount = (DWORD)atoi( Temp.c_str() );
if ( ( lPortCount + lPortStart ) > m_lDIPort || 0 == lPortCount )
{
Application->MessageBoxA(
"Port is not avaliable, please input again!",
"Information",
MB_OK | MB_ICONINFORMATION );
return;
}
//Secondly, allocate memory for DI data
BYTE * pDIData = new BYTE[ lPortCount ];
if ( NULL == pDIData )
{
Application->MessageBoxA(
"Allocate memory for DI data failed!",
"System Error",
MB_OK | MB_ICONERROR );
return;
}
memset( pDIData, 0, sizeof(BYTE) * lPortCount );
//Thirdly, read data
LONG lErrCde = AdxDioReadDiPorts(
m_lDeviceHandle,
lPortStart,
lPortCount,
pDIData );
char szMsgBuf[MAX_ERRMSG_LEN] = {0};
if ( lErrCde != SUCCESS )
{
DRV_GetErrorMessage( lErrCde, szMsgBuf );
Application->MessageBoxA(
szMsgBuf,
"Driver Error",
MB_OK | MB_ICONERROR );
}
else
{
AnsiString strData;
//Finally, show the data in the edit
for ( int i = 0; i < lPortCount; i++ )
{
if ( pDIData[i] <= 0xF )
{
strData.cat_sprintf("0%X ", pDIData[i]);
}
else
{
strData.cat_sprintf("%X ", pDIData[i]);
}
}
DIData->Text = strData;
}
if ( pDIData != NULL )
{
delete[] pDIData;
pDIData = NULL;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BtnWriteClick(TObject *Sender)
{
if ( (LONG)NULL == m_lDeviceHandle )
{
Application->MessageBoxA(
"The device has not been opened!",
"Error",
MB_OK | MB_ICONERROR );
return;
}
//Firstly, get start port and port count
//--Start port
AnsiString Temp = DOPort_Start->Text;
if ( Temp.IsEmpty() )
{
Application->MessageBoxA(
"Please input a appropriate number !",
"Prompt",
MB_OK | MB_ICONINFORMATION);
return;
}
DWORD lPortStart = (DWORD)atoi( Temp.c_str() );
if ( lPortStart >= m_lDOPort )
{
Application->MessageBoxA(
"Start port number is too big, please input again!",
"Information",
MB_OK | MB_ICONINFORMATION );
return;
}
//--Port count
Temp = DOPort_Count->Text;
if ( Temp.IsEmpty() )
{
Application->MessageBoxA(
"Please input a appropriate number !",
"Prompt",
MB_OK | MB_ICONINFORMATION);
return;
}
DWORD lPortCount = (DWORD)atoi( Temp.c_str() );
if ( ( lPortCount + lPortStart ) > m_lDOPort || 0 == lPortCount )
{
Application->MessageBoxA(
"Port is not avaliable, please input again!",
"Information",
MB_OK | MB_ICONINFORMATION );
return;
}
//Secondly, allocate buffer for every port
//--Text buffer, two characters for one data
char * pTextBuf = new char[ lPortCount * 2 + 1 ];
if ( NULL == pTextBuf )
{
Application->MessageBoxA(
"Allocate memory for text buffer failed!",
"System Error",
MB_OK | MB_ICONERROR );
return;
}
memset( pTextBuf, 0, sizeof(char) * (lPortCount * 2 + 1) );
//--Data buffer
BYTE * pDataBuf = new BYTE[ lPortCount ];
if ( NULL == pDataBuf )
{
Application->MessageBoxA(
"Allocate memory for data buffer failed!",
"System Error",
MB_OK | MB_ICONERROR );
delete[] pTextBuf;
pTextBuf = NULL;
return;
}
memset( pDataBuf, 0, sizeof(BYTE) * lPortCount );
//Thirdly, get data user input from edit
if ( DOData->Text.IsEmpty() )
{
Application->MessageBoxA(
"Please input data for output firstly!",
"Prompt",
MB_OK | MB_ICONINFORMATION );
delete[] pTextBuf;
pTextBuf = NULL;
delete[] pDataBuf;
pDataBuf = NULL;
return;
}
strcpy( pTextBuf, DOData->Text.c_str() );
//Fourthly, covert the text to numbers
int i = 0;
int j = 0;
for( ; j < lPortCount; i += 2, ++j )
{
pDataBuf[ j ] = ( CharToHex( pTextBuf[ i ] ) << 4 )
| ( CharToHex( pTextBuf[ i + 1 ] ) & 0x0f );
}
//Fifthly, output the data
LONG lErrCde = AdxDioWriteDoPorts(
m_lDeviceHandle,
lPortStart,
lPortCount,
pDataBuf );
if ( lErrCde != SUCCESS )
{
char szErrMsg[MAX_ERRMSG_LEN];
DRV_GetErrorMessage( lErrCde, szErrMsg );
Application->MessageBoxA(
szErrMsg,
"Driver Error",
MB_OK | MB_ICONERROR );
}
//Finally, release memories
if ( pTextBuf != NULL )
{
delete[] pTextBuf;
pTextBuf = NULL;
}
if ( pDataBuf != NULL )
{
delete[] pDataBuf;
pDataBuf = NULL;
}
}
//----------------------------------------------------------------------------
void __fastcall TForm1::BtnGetDOStateClick(TObject *Sender)
{
if ( (LONG)NULL == m_lDeviceHandle )
{
Application->MessageBoxA(
"The device has not been opened!",
"Error",
MB_OK | MB_ICONERROR );
return;
}
//Firstly, get start port and port count
//--Start port
AnsiString Temp = DOSPort_Start->Text;
if ( Temp.IsEmpty() )
{
Application->MessageBoxA(
"Please input a appropriate number !",
"Prompt",
MB_OK | MB_ICONINFORMATION);
return;
}
DWORD lPortStart = (DWORD)atoi( Temp.c_str() );
if ( lPortStart >= m_lDOPort )
{
Application->MessageBoxA(
"Start port number is too big, please input again!",
"Information",
MB_OK | MB_ICONINFORMATION );
return;
}
//--Port count
Temp = DOSPort_Count->Text;
if ( Temp.IsEmpty() )
{
Application->MessageBoxA(
"Please input a appropriate number !",
"Prompt",
MB_OK | MB_ICONINFORMATION);
return;
}
DWORD lPortCount = (DWORD)atoi( DOSPort_Count->Text.c_str() );
if ( ( lPortCount + lPortStart ) > m_lDOPort || 0 == lPortCount )
{
Application->MessageBoxA(
"Port is not avaliable, please input again!",
"Information",
MB_OK | MB_ICONINFORMATION );
return;
}
//Secondly, allocate memory for DO data
BYTE * pDOData = new BYTE[ lPortCount ];
if ( NULL == pDOData )
{
Application->MessageBoxA(
"Allocate memory for state data failed!",
"System Error",
MB_OK | MB_ICONERROR );
return;
}
memset( pDOData, 0, sizeof(BYTE) * lPortCount );
//Thirdly, get DO ports state
LONG lErrCde = AdxDioGetCurrentDoPortsState(
m_lDeviceHandle,
lPortStart,
lPortCount,
pDOData );
if ( lErrCde != SUCCESS )
{
char szErrMsg[MAX_ERRMSG_LEN];
DRV_GetErrorMessage( lErrCde, szErrMsg );
Application->MessageBoxA(
szErrMsg,
"Driver Error",
MB_OK | MB_ICONERROR );
}
else
{
AnsiString strText;
//Finally, show the data in the edit
for ( int i = 0; i < lPortCount; i++ )
{
if ( pDOData[i] <= 0xF )
{
strText.cat_sprintf( "0%X ", pDOData[i] );
}
else
{
strText.cat_sprintf( "%X ", pDOData[i] );
}
}
DOSData->Text = strText;
}
//Finally, release memory
if ( pDOData != NULL )
{
delete[] pDOData;
pDOData = NULL;
}
}
//---------------------------------------------------------------------------
BYTE __fastcall TForm1::CharToHex( char c )
{
if ( c >= '0' && c <= '9' )
{
return ( c - '0' );
}
c = (char)tolower( c );
if ( c >= 'a' && c <= 'f' )
{
return ( c - 'a' + 0xa );
}
return 0;
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -