diff --git a/src/ix_stream/CMakeLists.txt b/src/ix_stream/CMakeLists.txt index 978d4298c71bc6e11993bdbbdeaead2077910ab0..1ab8f2178466d8fe0accfdfdbe14b4324d147b70 100644 --- a/src/ix_stream/CMakeLists.txt +++ b/src/ix_stream/CMakeLists.txt @@ -3,9 +3,16 @@ add_executable(ix_test ix_test.c) target_link_libraries(ix_test PUBLIC dolphin::sisci) add_executable(dix_xmit dix_xmit.c) -target_link_libraries(dix_xmit PUBLIC driver::shmem dolphin::sisci pv::simple_pv) +target_link_libraries(dix_xmit PUBLIC + args + driver::shmem + dolphin::sisci + pv::simple_pv) install(TARGETS dix_xmit DESTINATION bin) add_executable(dix_recv dix_recv.c) -target_link_libraries(dix_recv PUBLIC driver::shmem dolphin::sisci) +target_link_libraries(dix_recv PUBLIC + args + driver::shmem + dolphin::sisci) install(TARGETS dix_recv DESTINATION bin) diff --git a/src/ix_stream/dix_recv.c b/src/ix_stream/dix_recv.c index 35e20a61de7f46c5a5d42359b369191dcb80fb7e..4e5f7e9b80fac71a293e669f30717e9a18b1ca4d 100644 --- a/src/ix_stream/dix_recv.c +++ b/src/ix_stream/dix_recv.c @@ -14,6 +14,8 @@ #include "../drv/crc.c" #include "../include/daq_core.h" +#include "args.h" + #define __CDECL #define MY_DCU_OFFSET 0x00000 @@ -31,22 +33,6 @@ static volatile int keepRunning = 1; /* */ /*********************************************************************************/ -void -Usage( ) -{ - printf( "Usage of dix_recv:\n" ); - printf( "dix_recv -g <group>\n" ); - printf( " -b <name> : Destination buffer name (default local_dc)\n" ); - printf( " -m <value> : Size in MB of the destination buffer [20-100] " - "(default=100)\n" ); - printf( " -a <value> : Local adapter number (default %d)\n", - localAdapterNo ); - printf( " -g <value> : Reflective group identifier (0..5))\n" ); - printf( " -v <value> : Diagnostics level (0..1) \n" ); - printf( " -h : This help screen\n" ); - printf( "\n" ); -} - void intHandler( int dummy ) { @@ -101,46 +87,49 @@ int __CDECL int do_verbose = 0; int max_data_size_mb = 100; int max_data_size = 0; - char* dest_mbuf_name = "local_dc"; + const char* default_dest_mbuf_name = "local_dc"; + const char* dest_mbuf_name = 0; + args_handle arg_parser = 0; printf( "\n %s compiled %s : %s\n\n", argv[ 0 ], __DATE__, __TIME__ ); - if ( argc < 2 ) + arg_parser = args_create_parser( "IX Dolphin based receiver." ); + args_add_string_ptr( arg_parser, + 'b', + ARGS_NO_LONG, + "mbuf name", + "Output buffer name", + &dest_mbuf_name, + default_dest_mbuf_name ); + args_add_int( arg_parser, + 'm', + ARGS_NO_LONG, + "[20-100]", + "Output buffer size in mb", + &max_data_size_mb, + 100 ); + args_add_int( arg_parser, + 'g', + ARGS_NO_LONG, + "[0-3]", + "The IX memory group to read from", + &segmentId, + 0 ); + args_add_int( arg_parser, + 'a', + ARGS_NO_LONG, + "number", + "Local adapter number", + &localAdapterNo, + localAdapterNo ); + args_add_flag( + arg_parser, 'v', ARGS_NO_LONG, "Verbose output", &do_verbose ); + if ( args_parse( arg_parser, argc, argv ) <= 0 ) { - printf( "Exiting here \n" ); - Usage( ); - return ( -1 ); + exit( 1 ); } + args_destroy( &arg_parser ); - /* Get the parameters */ - while ( ( counter = getopt( argc, argv, "m:g:a:v:b:" ) ) != EOF ) - switch ( counter ) - { - case 'b': - dest_mbuf_name = optarg; - break; - - case 'm': - max_data_size_mb = atoi( optarg ); - break; - - case 'g': - segmentId = atoi( optarg ); - break; - - case 'a': - localAdapterNo = atoi( optarg ); - break; - - case 'v': - do_verbose = atoi( optarg ); - break; - - case 'h': - printf( "Exiting here 2 \n" ); - Usage( ); - return ( 0 ); - } if ( max_data_size_mb < 20 || max_data_size_mb > 100 ) { fprintf( stderr, "The data size parameter must be between 20 & 100\n" ); @@ -149,7 +138,8 @@ int __CDECL max_data_size = max_data_size_mb * 1024 * 1024; // Attach to local shared memory - char* ifo = (char*)findSharedMemorySize( dest_mbuf_name, max_data_size_mb ); + char* ifo = + (char*)findSharedMemorySize( (char*)dest_mbuf_name, max_data_size_mb ); daq_multi_cycle_data_t* ifo_shm = (daq_multi_cycle_data_t*)ifo; // char *ifo_data = (char *)ifo + sizeof(daq_multi_cycle_header_t); char* ifo_data = (char*)&( ifo_shm->dataBlock[ 0 ] ); diff --git a/src/ix_stream/dix_xmit.c b/src/ix_stream/dix_xmit.c index 43ea95cdd239d162e04aaf0d30bd4adee54ce34c..ff57e9f804f184c2476fb65fa8ed5894c743888d 100644 --- a/src/ix_stream/dix_xmit.c +++ b/src/ix_stream/dix_xmit.c @@ -32,6 +32,8 @@ #include "simple_pv.h" +#include "args.h" + #define __CDECL #include "./dolphin_common.c" @@ -45,22 +47,6 @@ int do_verbose = 0; static volatile int keepRunning = 1; -void -usage( ) -{ - fprintf( stderr, - "Usage: dix_ix_xmit [args] -m shared memory size -g IX " - "channel \n" ); - fprintf( stderr, "-l filename - log file name\n" ); - fprintf( stderr, "-b buffer name - Input buffer [local_dc]\n" ); - fprintf( stderr, - "-m buffer size - Sizer of the input buffer in MB [20-100]\n" ); - fprintf( stderr, "-v - verbose prints diag test data\n" ); - fprintf( stderr, "-g - Dolphin IX channel to xmit on (0-3)\n" ); - fprintf( stderr, "-p - Debug pv prefix\n" ); - fprintf( stderr, "-h - help\n" ); -} - // ************************************************************************* // Timing Diagnostic Routine // ************************************************************************* @@ -91,7 +77,7 @@ void print_diags( int nsys, int lastCycle, int sendLength, - daq_multi_dcu_data_t* ixDataBlock) + daq_multi_dcu_data_t* ixDataBlock ) { // ********************************************************************************************** int ii = 0; @@ -163,14 +149,16 @@ wait_for_cycle( volatile daq_multi_cycle_header_t* header, int main( int argc, char** argv ) { - char* buffer_name = "local_dc"; - int c; - int ii; // Loop counter + const char* default_buffer_name = "local_dc"; + const char* buffer_name = default_buffer_name; + const char* logfile_name = 0; + int c; + int ii; // Loop counter extern char* optarg; // Needed to get arguments to program // PV/debug information - char* pv_prefix = 0; + const char* pv_prefix = 0; simple_pv_handle pcas_server = NULL; // Declare shared memory data variables @@ -184,54 +172,72 @@ main( int argc, char** argv ) int max_data_size = 0; char* mywriteaddr; int xmitBlockNum = 0; + args_handle arg_parser = 0; /* set up defaults */ - int xmitData = 0; - - // Get arguments sent to process - while ( ( c = getopt( argc, argv, "b:hm:g:vp:l:" ) ) != EOF ) - switch ( c ) + arg_parser = args_create_parser( "IX Dolphin based transmitter" ); + args_add_string_ptr( arg_parser, + 'b', + ARGS_NO_LONG, + "mbuf name", + "Input buffer name", + &buffer_name, + default_buffer_name ); + args_add_int( arg_parser, + 'm', + ARGS_NO_LONG, + "[20-100]", + "Input buffer size in mb", + &max_data_size_mb, + 100 ); + args_add_int( arg_parser, + 'g', + ARGS_NO_LONG, + "[0-3]", + "The IX memory group to output to", + &segmentId, + 0 ); + args_add_string_ptr( arg_parser, + 'p', + ARGS_NO_LONG, + "epics prefix", + "The prefix for epics PVs that report status", + &pv_prefix, + 0 ); + args_add_string_ptr( arg_parser, + 'l', + ARGS_NO_LONG, + "filename", + "Log file name", + &logfile_name, + 0 ); + args_add_flag( + arg_parser, 'v', ARGS_NO_LONG, "Verbose output", &do_verbose ); + if ( args_parse( arg_parser, argc, argv ) <= 0 ) + { + exit( 1 ); + } + args_destroy( &arg_parser ); + if ( max_data_size_mb < 20 ) + { + fprintf( stderr, "Min data block size is 20 MB\n" ); + return -1; + } + if ( max_data_size_mb > 100 ) + { + fprintf( stderr, "Max data block size is 100 MB\n" ); + return -1; + } + if ( logfile_name ) + { + if ( 0 == freopen( logfile_name, "w", stdout ) ) { - case 'v': - do_verbose = 1; - break; - case 'm': - max_data_size_mb = atoi( optarg ); - if ( max_data_size_mb < 20 ) - { - fprintf( stderr, "Min data block size is 20 MB\n" ); - return -1; - } - if ( max_data_size_mb > 100 ) - { - fprintf( stderr, "Max data block size is 100 MB\n" ); - return -1; - } - break; - case 'g': - segmentId = atoi( optarg ); - xmitData = 1; - break; - case 'b': - buffer_name = optarg; - break; - case 'p': - pv_prefix = optarg; - break; - case 'l': - if ( 0 == freopen( optarg, "w", stdout ) ) - { - perror( "freopen" ); - exit( 1 ); - } - setvbuf( stdout, NULL, _IOLBF, 0 ); - stderr = stdout; - break; - case 'h': - default: - usage( ); + perror( "freopen" ); exit( 1 ); } + setvbuf( stdout, NULL, _IOLBF, 0 ); + stderr = stdout; + } max_data_size = max_data_size_mb * 1024 * 1024; // set up to catch Control C @@ -555,58 +561,55 @@ main( int argc, char** argv ) missed_flag <<= 1; } - if ( xmitData ) + if ( sendLength > IX_BLOCK_SIZE ) { - if ( sendLength > IX_BLOCK_SIZE ) - { - fprintf( stderr, - "Buffer overflow. Sending %d bytes into a " - "dolphin block that holds %d\n", - (int)sendLength, - (int)IX_BLOCK_SIZE ); - abort( ); - } - // WRITEDATA to Dolphin Network - SCIMemCpy( sequence, - nextData, - remoteMap, - xmitDataOffset[ xmitBlockNum ], - sendLength, - memcpyFlag, - &error ); - error = SCI_ERR_OK; - if ( error != SCI_ERR_OK ) - { - fprintf( - stderr, "SCIMemCpy failed - Error code 0x%x\n", error ); - fprintf( stderr, - "For reference the expected error codes are:\n" ); - fprintf( stderr, - "SCI_ERR_OUT_OF_RANGE = 0x%x\n", - SCI_ERR_OUT_OF_RANGE ); - fprintf( stderr, - "SCI_ERR_SIZE_ALIGNMENT = 0x%x\n", - SCI_ERR_SIZE_ALIGNMENT ); - fprintf( stderr, - "SCI_ERR_OFFSET_ALIGNMENT = 0x%x\n", - SCI_ERR_OFFSET_ALIGNMENT ); - fprintf( stderr, - "SCI_ERR_TRANSFER_FAILED = 0x%x\n", - SCI_ERR_TRANSFER_FAILED ); - return error; - } - // Set data header information - unsigned int maxCycle = ifo_header->maxCycle; - unsigned int curCycle = ifo_header->curCycle; - xmitHeader[ xmitBlockNum ]->maxCycle = maxCycle; - xmitHeader[ xmitBlockNum ]->cycleDataSize = sendLength; - ; - // Send cycle last as indication of data ready for receivers - xmitHeader[ xmitBlockNum ]->curCycle = curCycle; - // Have to flush the buffers to make data go onto Dolphin - // network - SCIFlush( sequence, SCI_FLAG_FLUSH_CPU_BUFFERS_ONLY ); + fprintf( stderr, + "Buffer overflow. Sending %d bytes into a " + "dolphin block that holds %d\n", + (int)sendLength, + (int)IX_BLOCK_SIZE ); + abort( ); } + // WRITEDATA to Dolphin Network + SCIMemCpy( sequence, + nextData, + remoteMap, + xmitDataOffset[ xmitBlockNum ], + sendLength, + memcpyFlag, + &error ); + error = SCI_ERR_OK; + if ( error != SCI_ERR_OK ) + { + fprintf( + stderr, "SCIMemCpy failed - Error code 0x%x\n", error ); + fprintf( stderr, + "For reference the expected error codes are:\n" ); + fprintf( stderr, + "SCI_ERR_OUT_OF_RANGE = 0x%x\n", + SCI_ERR_OUT_OF_RANGE ); + fprintf( stderr, + "SCI_ERR_SIZE_ALIGNMENT = 0x%x\n", + SCI_ERR_SIZE_ALIGNMENT ); + fprintf( stderr, + "SCI_ERR_OFFSET_ALIGNMENT = 0x%x\n", + SCI_ERR_OFFSET_ALIGNMENT ); + fprintf( stderr, + "SCI_ERR_TRANSFER_FAILED = 0x%x\n", + SCI_ERR_TRANSFER_FAILED ); + return error; + } + // Set data header information + unsigned int maxCycle = ifo_header->maxCycle; + unsigned int curCycle = ifo_header->curCycle; + xmitHeader[ xmitBlockNum ]->maxCycle = maxCycle; + xmitHeader[ xmitBlockNum ]->cycleDataSize = sendLength; + ; + // Send cycle last as indication of data ready for receivers + xmitHeader[ xmitBlockNum ]->curCycle = curCycle; + // Have to flush the buffers to make data go onto Dolphin + // network + SCIFlush( sequence, SCI_FLAG_FLUSH_CPU_BUFFERS_ONLY ); } // Increment cycle count @@ -614,12 +617,9 @@ main( int argc, char** argv ) nextCycle %= 16; } while ( keepRunning ); // End of infinite loop - if ( xmitData ) - { - fprintf( stderr, "closing out ix\n" ); - // Cleanup the Dolphin connections - error = dolphin_closeout( ); - } + fprintf( stderr, "closing out ix\n" ); + // Cleanup the Dolphin connections + error = dolphin_closeout( ); simple_pv_server_destroy( &pcas_server );