⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainform.cpp

📁 16 relay output channels and 16 isolated digital input channels LED indicators to show activated
💻 CPP
📖 第 1 页 / 共 2 页
字号:
         "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 + -