www.pudn.com > DalsaNetlink.rar > CyInterPacketDelayDialog.cpp
// CyInterPacketDelayDialog.cpp : implementation file // #include "stdafx.h" #include "resource.h" #include "CyInterPacketDelayDialog.h" #include#ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CyInterPacketDelayDialog dialog CyInterPacketDelayDialog::CyInterPacketDelayDialog( const CyImageBuffer& aBuffer, unsigned long aPacketSize, const CyConfig::AccessMode& aAccessMode, CWnd* aParent /*=NULL*/) : CDialog(CyInterPacketDelayDialog::IDD, aParent) , mBuffer( aBuffer ) { //{{AFX_DATA_INIT(CyInterPacketDelayDialog) mFrameRate = 0.0; mPacketSize = 0; mPacketTransmitTime = 0.0; mPacketsPerSecond = 0.0; mTimePerPacket = 0.0; mLinkSpeedValue = -1; //}}AFX_DATA_INIT mLinkSpeedValue = 1; if ( aAccessMode == CyConfig::MODE_DRV ) mLinkSpeedValue = 2; mPacketSize = aPacketSize; } void CyInterPacketDelayDialog::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CyInterPacketDelayDialog) DDX_Control(pDX, IDC_INTER_PACKET_DELAY, mIPDControl); DDX_Control(pDX, IDC_LINK_SPEED, mLinkSpeed); DDX_Control(pDX, IDC_DATA_RATE, mDataRate); DDX_Text(pDX, IDC_FRAME_RATE, mFrameRate); DDX_Text(pDX, IDC_PACKET_SIZE, mPacketSize); DDV_MinMaxUInt(pDX, mPacketSize, 32, 16384); DDX_Text(pDX, IDC_PACKET_TRANSMIT_TIME, mPacketTransmitTime); DDX_Text(pDX, IDC_PACKETS_PER_SECOND, mPacketsPerSecond); DDX_Text(pDX, IDC_TIME_PER_PACKET, mTimePerPacket); DDX_CBIndex(pDX, IDC_LINK_SPEED, mLinkSpeedValue); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CyInterPacketDelayDialog, CDialog) //{{AFX_MSG_MAP(CyInterPacketDelayDialog) ON_EN_CHANGE(IDC_DATA_RATE, OnModified) ON_CBN_SELCHANGE(IDC_LINK_SPEED, OnModified) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CyInterPacketDelayDialog message handlers void CyInterPacketDelayDialog::OnModified() { CString lTemp; unsigned long lDataRate; double lByteSpeed; double lPacketSize; long lInterPacketDelay; // stop if the dialog is not yet created if ( !IsWindow( GetSafeHwnd() ) ) return; // get the data rate, stop if it is 0 mDataRate.GetWindowText( lTemp ); lDataRate = atol( (LPCTSTR) lTemp ); if ( lDataRate == 0 ) return; // compute the number of frames per seconds mFrameRate = static_cast ( lDataRate ) / static_cast ( mBuffer.GetCapacity() ); // Get the time to transmit one byte // Use 10 bits per byte to compute mLinkSpeedValue = mLinkSpeed.GetCurSel(); switch( mLinkSpeedValue ) { default: return; case 0: lByteSpeed = 10.0 / 10000000.0 * 1000000000.0; break; case 1: lByteSpeed = 10.0 / 100000000.0 * 1000000000.0; break; case 2: lByteSpeed = 10.0 / 1000000000.0 * 1000000000.0; break; case 3: lByteSpeed = 10.0 / 11000000.0 * 1000000000.0; break; case 4: lByteSpeed = 10.0 / 22000000.0 * 1000000000.0; break; case 5: lByteSpeed = 10.0 / 54000000.0 * 1000000000.0; break; } // Compute the time for a packet lPacketSize = static_cast ( mPacketSize ); mPacketTransmitTime = lPacketSize * lByteSpeed; // Compute the number of packets per second mPacketsPerSecond = static_cast ( lDataRate ) / static_cast ( mPacketSize ); // Compute the time required per packet to achieve the expected data rate. mTimePerPacket = 1000000000.0 / mPacketsPerSecond; // Compute the inter-packet delay lInterPacketDelay = static_cast ( ceil( ( mTimePerPacket - mPacketTransmitTime ) / 30.0 ) ); if ( lInterPacketDelay < 0 ) { mInterPacketDelay = 0; mIPDControl.SetWindowText( "0, Data rate > link speed!" ); } else if ( lInterPacketDelay > 65535 ) { mInterPacketDelay = 65535; mIPDControl.SetWindowText( "65535, but computed higher!" ); } else { mInterPacketDelay = static_cast ( lInterPacketDelay ); lTemp.Format( "%lu", mInterPacketDelay ); mIPDControl.SetWindowText( lTemp ); } // update the dialog with this new information UpdateData( FALSE ); } BOOL CyInterPacketDelayDialog::OnInitDialog() { CDialog::OnInitDialog(); CString lTemp; lTemp.Format( "%lu", mInterPacketDelay ); mIPDControl.SetWindowText( lTemp ); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }