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

📄 write.cpp

📁 VHPD1394 V1.15驅動程序源碼
💻 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 + -