📄 write.cpp
字号:
/************************************************************************
* THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
* KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
* PURPOSE.
************************************************************************/
/************************************************************************
*
* Module: write.cpp
* Long name: VHPD1394 asynchronous write example
* Description: This sample demonstrates how to use the VHPD1394
* device driver to write data to a peer device
* in asynchronous mode.
* This sample is based on the VHPDLib C++ class library.
*
* Runtime Env.: implemented as Win32 console application
* Used link libraries:
* vhpdlib.lib, setupapi.lib, user32.lib
* Author(s): Frank Senf
* Company: Thesycon GmbH, Ilmenau
************************************************************************/
// standard includes
#include <stdio.h>
#include <conio.h>
// definitions of used classes
#include "CVhpd.h"
// print prefixes
#define PFX "WRITE: "
#define PFXERR "WRITE Error: "
// standard help message
static const char g_UseHelp[] = "For help, use WRITE -h.";
// GLOBAL VARIABLES
// zero-based index of the peer device within the Windows-internal
// device list
// not related to the device's node ID, see the "SCAN" example for
// further details
// (default 0)
int g_DevNumber =0;
// IEEE 1394 start address of memory at peer device that will be written
// (no default, always has to be specified)
__int64 g_StartAddress;
// number of bytes to write to peer device (size of data block)
// (default 4)
unsigned long g_BytesToWrite =4;
// number of bytes to write with a single request on bus
// if this value is smaller than g_BytesToWrite the data block will be written
// using several asynchronous requests
// 0 for maximum request packet size
// (default 0)
unsigned long g_BytesPerRequest =0;
// buffer that will hold the bytes to write
// will be allocated before initiating the write
unsigned char* g_InputBuffer;
// name of the input file (optional)
const char* g_InFileName =NULL;
/*******************************************************************/
// support functions
/*******************************************************************/
//
// display usage information
//
void
PrintHelp(void)
{
fprintf(stdout,
"\n"
"usage: WRITE Address <Options>\n"
"\n"
" Address (hexadecimal, required)\n"
" IEEE 1394 address of memory at peer device that will be written\n"
"\n"
" Options:\n"
" -dDevNumber: zero-based index of the peer device (optional, default %d)\n"
" (use the SCAN example to display a list of available devices)\n"
" -nNmbOfBytes: number of bytes to write to peer device (optional, default %d)\n"
" -bRequestSize: number of bytes to write with a single asynchronous request,\n"
" 0 for maximum allowed (optional, default %d)\n"
" -fInputFile: file that contains the data to be written (optional)\n"
" random data will be transmitted if this parameter is omitted\n"
,g_DevNumber, g_BytesToWrite, g_BytesPerRequest);
fprintf(stdout,"\nPress any key to continue\n");
getch();
} // PrintHelp
/*******************************************************************/
// main function
/*******************************************************************/
int __cdecl main(int argc, char *argv[])
{
/*******************************************************************/
// fixed command line argument
// check for required arguments
if ( argc < 2 ) {
// at least Address has to be specified
PrintHelp();
return 1;
}
// store values for required arguments
__int64 val64;
if ( 1==sscanf(argv[1]," %I64x ",&val64) ) {
// store value
g_StartAddress = val64;
} else {
// invalid Address parameter, we cannot continue
fprintf(stderr, PFXERR"Invalid Address argument '%s'\n",argv[1]);
return 4;
}
/*******************************************************************/
// optional command line options
int i;
int val;
char* p;
for ( i=1; i<argc; i++ ) {
p = argv[i];
if ( (*p) == '-' ) {
p++;
switch ( *p ) {
case 'h':
case 'H':
case '?':
// help
PrintHelp();
return 0;
// device number
case 'd':
// read number
if ( 1==sscanf(p+1," %i ",&val) ) {
if ( val>=0 && val<=62 ) {
// store value
g_DevNumber = val;
} else {
// invalid device number, ignore it
fprintf(stderr, PFXERR"Invalid device number %d ignored\n",val);
}
} else {
// invalid option format, ignore it
fprintf(stderr, PFXERR"Invalid argument '%s' ignored\n",argv[i]);
}
break;
// number of bytes to read
case 'n':
// read number
if ( 1==sscanf(p+1," %i ",&val) ) {
// store value
g_BytesToWrite = val;
} else {
// invalid option format, ignore it
fprintf(stderr, PFXERR"Invalid argument '%s' ignored\n",argv[i]);
}
break;
// bytes per request packet
case 'b':
// read number
if ( 1==sscanf(p+1," %i ",&val) ) {
// store value
g_BytesPerRequest = val;
} else {
// invalid option format, ignore it
fprintf(stderr, PFXERR"Invalid argument '%s' ignored\n",argv[i]);
}
break;
// input file name
case 'f':
if ( *(p+1) != 0 ) {
// save string pointer
g_InFileName = p+1;
} else {
// invalid filename
fprintf(stderr, PFXERR"Invalid argument '%s' ignored\n",argv[i]);
}
break;
// unknown options
default:
fprintf(stderr, PFXERR"Unrecognized option '%s' ignored. %s\n",argv[i],g_UseHelp);
break;
} // switch
}
} // for
/*******************************************************************/
// open a device handle
// prepare an OS-internal device list used for the open call
HDEVINFO DevList; DevList = NULL;
// device list will contain devices that provide the VHPD_IID interface
// please refer to to the documentation (chapter 7.4) for details on how
// to define your private interface (strongly recommended)
const GUID VhpdDefaultIID = VHPD_IID;
DevList = CVhpd::CreateDeviceList(&VhpdDefaultIID);
if ( DevList == NULL ) {
// ERROR !!!
fprintf(stderr, PFXERR"CreateDeviceList failed\n");
return 10;
}
// open a handle to the device
CVhpd Device;
unsigned long Status;
Status = Device.Open(g_DevNumber,DevList,&VhpdDefaultIID);
if ( Status != VHPD_STATUS_SUCCESS ) {
// ERROR !!!
fprintf(stderr, PFXERR"Failed to open device %d (0x%08X)\n",g_DevNumber,Status);
goto Exit;
}
// device opened, destroy the device list, we don't need it anymore
CVhpd::DestroyDeviceList(DevList);
DevList = NULL;
/*******************************************************************/
// issue the asynchronous write request(s)
// init input structure
VHPD_ASYNC_WRITE AsyncWrite;
memset(&AsyncWrite,0,sizeof(AsyncWrite));
AsyncWrite.DestinationAddress.QuadPart = g_StartAddress;
AsyncWrite.BlockSize = g_BytesPerRequest;
// input data buffer
g_InputBuffer = new unsigned char[g_BytesToWrite];
if ( g_InFileName == NULL ) {
// send test pattern
memset(g_InputBuffer,0x5A,g_BytesToWrite);
} else {
// load data from the input file if a file name was given
FILE* file;
// open the file for reading
file = fopen(g_InFileName, "r");
if ( file != NULL ) {
// file opened, read data to buffer
int BytesRead;
BytesRead = fread(g_InputBuffer, 1, g_BytesToWrite, file);
fclose(file);
if ( (unsigned long)BytesRead != g_BytesToWrite ) {
// ERROR !!!
fprintf(stderr, PFXERR"fread returned invalid byte count (Exp %d Got %d)\n",
g_BytesToWrite, BytesRead);
goto Exit;
}
} else {
// ERROR !!!
fprintf(stderr, PFXERR"Open input file '%s' failed\n",g_InFileName);
goto Exit;
}
}
unsigned long BytesTransferred;
BytesTransferred = 0;
fprintf(stdout, PFX"Writing %d bytes to address 0x%012I64X\n",g_BytesToWrite,g_StartAddress);
// initiate the asynchronous read request
Status = Device.AsyncWriteSync(
&AsyncWrite, // VHPD_ASYNC_WRITE structure describing the write operation
g_InputBuffer, // buffer that contains the data bytes to write
g_BytesToWrite, // number of bytes to write
&BytesTransferred, // on return: number of bytes written
INFINITE // timeout while waiting for the operation to complete
);
if ( Status != VHPD_STATUS_SUCCESS ) {
// ERROR !!!
fprintf(stderr, PFXERR"AsyncWriteSync failed (0x%08X)\n",Status);
goto Exit;
}
if ( BytesTransferred != g_BytesToWrite ) {
// ERROR !!!
fprintf(stderr, PFXERR"AsyncWriteSync transferred invalid number of bytes (Exp %d, Got %d)\n",
g_BytesToWrite,BytesTransferred);
goto Exit;
}
fprintf(stdout, PFX"Write succeeded (%d bytes transferred)\n",BytesTransferred);
/*******************************************************************/
// ERROR!!! or normal exit
// release claimed resources
Exit:
delete[] g_InputBuffer;
Device.Close();
return 0;
} // main
/*************************** EOF **************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -