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 
}