Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
B
Beam Positoning Monitor - Software
Manage
Activity
Members
Labels
Plan
Issues
0
Issue boards
Milestones
Wiki
Code
Merge requests
0
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Deploy
Releases
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Projects
Beam Positoning Monitor - Software
Commits
9253fef3
Commit
9253fef3
authored
8 years ago
by
Lucas Russo
Browse files
Options
Downloads
Patches
Plain Diff
examples/trigger.c: add simple example for trigger functions
parent
f40dbda7
Branches
Branches containing commit
Tags
Tags containing commit
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
examples/trigger.c
+295
-0
295 additions, 0 deletions
examples/trigger.c
with
295 additions
and
0 deletions
examples/trigger.c
0 → 100644
+
295
−
0
View file @
9253fef3
/*
* Simple example demonstrating the communication between
* a client and the FPGA device
*
* */
#include
<getopt.h>
#include
<czmq.h>
#include
<inttypes.h>
#include
<stdio.h>
#include
<string.h>
#include
<bpm_client.h>
#define DFLT_BIND_FOLDER "/tmp/bpm"
#define DFLT_BPM_NUMBER 0
#define MAX_BPM_NUMBER 1
#define DFLT_BOARD_NUMBER 0
#define DFLT_CHAN_NUM 0
static
struct
option
long_options
[]
=
{
{
"help"
,
no_argument
,
NULL
,
'h'
},
{
"brokerendp"
,
required_argument
,
NULL
,
'b'
},
{
"verbose"
,
no_argument
,
NULL
,
'v'
},
{
"bpmnumber"
,
required_argument
,
NULL
,
's'
},
{
"boardslot"
,
required_argument
,
NULL
,
'o'
},
{
"channumber"
,
required_argument
,
NULL
,
'c'
},
{
"rcvsrc"
,
required_argument
,
NULL
,
'r'
},
{
"rcvsel"
,
required_argument
,
NULL
,
'p'
},
{
"transmsrc"
,
required_argument
,
NULL
,
't'
},
{
"transsel"
,
required_argument
,
NULL
,
'u'
},
{
"dir"
,
required_argument
,
NULL
,
'd'
},
{
NULL
,
0
,
NULL
,
0
}
};
static
const
char
*
shortopt
=
"hb:vo:s:c:r:p:t:u:d:"
;
void
print_help
(
char
*
program_name
)
{
fprintf
(
stdout
,
"EBPM Trigger Utility
\n
"
"Usage: %s [options]
\n
"
"
\n
"
" -h --help Display this usage information
\n
"
" -b --brokerendp <Broker endpoint> Broker endpoint
\n
"
" -v --verbose Verbose output
\n
"
" -o --boardslot <Board slot number = [1-12]>
\n
"
" -s --bpmnumber <BPM number = [0|1]> BPM number
\n
"
" Board slot number
\n
"
" -c --channumber <Channel> Trigger Channel number
\n
"
" <Channel> must be one of the following:
\n
"
" 0 -> ADC; 1 -> ADC_SWAP; 2 -> Mixer IQ120; 3 -> Mixer IQ340;
\n
"
" 4 -> TBT Decim IQ120; 5 -> TBT Decim IQ340; 6 -> TBT Amp;
\n
"
" 7 -> TBT Phase; 8 -> TBT Pos; 9 -> FOFB Decim IQ120;
\n
"
" 10 -> FOFB Decim IQ340; 11 -> FOFB Amp; 12 -> FOFB Pha;
\n
"
" 13 -> FOFB Pos; 14 -> Monit Amp; 15 -> Monit Pha; 16 -> Monit Pos]
\n
"
" 17 -> Swithcing Clock]
\n
"
" -r --rcvsrc <Receive source for the selected channel = [0 = trigger backplane, 1 = FPGA internal]>
\n
"
" -p --rcvsel <Receive selection source for the selected channel = [TBD]>
\n
"
" -t --transmsrc <Transmit source for the selected channel = [0 = trigger backplane, 1 = FPGA internal]>
\n
"
" -u --transmsel <Transmit selection source for the selected channel = [TBD]>
\n
"
" -d --dir <Trigger direction = [0 = FPGA Output, 1 = FPGA Input]>
\n
"
,
program_name
);
}
int
main
(
int
argc
,
char
*
argv
[])
{
int
verbose
=
0
;
char
*
broker_endp
=
NULL
;
char
*
num_samples_str
=
NULL
;
char
*
board_number_str
=
NULL
;
char
*
bpm_number_str
=
NULL
;
char
*
chan_str
=
NULL
;
int
chan_sel
=
0
;
char
*
rcvsrc_str
=
NULL
;
int
rcvsrc_sel
=
0
;
char
*
rcvsel_str
=
NULL
;
int
rcvsel_sel
=
0
;
char
*
transmsrc_str
=
NULL
;
int
transmsrc_sel
=
0
;
char
*
transmsel_str
=
NULL
;
int
transmsel_sel
=
0
;
char
*
dir_str
=
NULL
;
int
dir_sel
=
0
;
int
opt
;
while
((
opt
=
getopt_long
(
argc
,
argv
,
shortopt
,
long_options
,
NULL
))
!=
-
1
)
{
/* Get the user selected options */
switch
(
opt
)
{
/* Display Help */
case
'h'
:
print_help
(
argv
[
0
]);
exit
(
1
);
break
;
case
'b'
:
broker_endp
=
strdup
(
optarg
);
break
;
case
'v'
:
verbose
=
1
;
break
;
case
'o'
:
board_number_str
=
strdup
(
optarg
);
break
;
case
's'
:
bpm_number_str
=
strdup
(
optarg
);
break
;
case
'c'
:
chan_str
=
strdup
(
optarg
);
chan_sel
=
1
;
break
;
case
'r'
:
rcvsrc_str
=
strdup
(
optarg
);
rcvsrc_sel
=
1
;
break
;
case
'p'
:
rcvsel_str
=
strdup
(
optarg
);
rcvsel_sel
=
1
;
break
;
case
't'
:
transmsrc_str
=
strdup
(
optarg
);
transmsrc_sel
=
1
;
break
;
case
'u'
:
transmsel_str
=
strdup
(
optarg
);
transmsel_sel
=
1
;
break
;
case
'd'
:
dir_str
=
strdup
(
optarg
);
dir_sel
=
1
;
break
;
case
'?'
:
fprintf
(
stderr
,
"[client:trigger] Option not recognized or missing argument
\n
"
);
print_help
(
argv
[
0
]);
exit
(
1
);
break
;
default:
fprintf
(
stderr
,
"[client:trigger] Could not parse options
\n
"
);
print_help
(
argv
[
0
]);
exit
(
1
);
}
}
/* If we want to change a channel property, we must select a channel first */
if
((
rcvsrc_sel
==
1
||
rcvsel_sel
==
1
||
transmsrc_sel
==
1
||
transmsel_sel
==
1
||
dir_sel
==
1
)
&&
chan_sel
==
0
)
{
fprintf
(
stderr
,
"[client:trigger]: Channel number not selected (use -c or --channumber option)
\n
"
);
exit
(
1
);
}
/* Set default broker address */
if
(
broker_endp
==
NULL
)
{
fprintf
(
stderr
,
"[client:trigger]: Setting default broker endpoint: %s
\n
"
,
"ipc://"
DFLT_BIND_FOLDER
);
broker_endp
=
strdup
(
"ipc://"
DFLT_BIND_FOLDER
);
}
/* Set default channel */
uint32_t
chan
;
if
(
chan_str
==
NULL
)
{
fprintf
(
stderr
,
"[client:trigger]: Setting default value to 'chan'
\n
"
);
chan
=
DFLT_CHAN_NUM
;
}
else
{
chan
=
strtoul
(
chan_str
,
NULL
,
10
);
}
/* Set default board number */
uint32_t
board_number
;
if
(
board_number_str
==
NULL
)
{
fprintf
(
stderr
,
"[client:trigger]: Setting default value to BOARD number: %u
\n
"
,
DFLT_BOARD_NUMBER
);
board_number
=
DFLT_BOARD_NUMBER
;
}
else
{
board_number
=
strtoul
(
board_number_str
,
NULL
,
10
);
}
/* Set default bpm number */
uint32_t
bpm_number
;
if
(
bpm_number_str
==
NULL
)
{
fprintf
(
stderr
,
"[client:trigger]: Setting default value to BPM number: %u
\n
"
,
DFLT_BPM_NUMBER
);
bpm_number
=
DFLT_BPM_NUMBER
;
}
else
{
bpm_number
=
strtoul
(
bpm_number_str
,
NULL
,
10
);
if
(
bpm_number
>
MAX_BPM_NUMBER
)
{
fprintf
(
stderr
,
"[client:trigger]: BPM number too big! Defaulting to: %u
\n
"
,
MAX_BPM_NUMBER
);
bpm_number
=
MAX_BPM_NUMBER
;
}
}
char
service_iface
[
50
];
snprintf
(
service_iface
,
sizeof
(
service_iface
),
"BPM%u:DEVIO:TRIGGER_IFACE"
,
board_number
);
char
service_mux
[
50
];
snprintf
(
service_mux
,
sizeof
(
service_mux
),
"BPM%u:DEVIO:TRIGGER_MUX%u"
,
board_number
,
bpm_number
);
bpm_client_t
*
bpm_client
=
bpm_client_new
(
broker_endp
,
verbose
,
NULL
);
if
(
bpm_client
==
NULL
)
{
fprintf
(
stderr
,
"[client:trigger]: bpm_client could be created
\n
"
);
goto
err_bpm_client_new
;
}
uint32_t
rcvsrc
=
0
;
if
(
rcvsrc_sel
==
1
)
{
rcvsrc
=
strtoul
(
rcvsrc_str
,
NULL
,
10
);
bpm_client_err_e
err
=
bpm_set_trigger_rcv_src
(
bpm_client
,
service_mux
,
chan
,
rcvsrc
);
if
(
err
!=
BPM_CLIENT_SUCCESS
){
fprintf
(
stderr
,
"[client:trigger]: bpm_set_trigger_rcv_src failed
\n
"
);
goto
err_bpm_set
;
}
}
uint32_t
rcvsel
=
0
;
if
(
rcvsel_sel
==
1
)
{
rcvsel
=
strtoul
(
rcvsel_str
,
NULL
,
10
);
bpm_client_err_e
err
=
bpm_set_trigger_rcv_in_sel
(
bpm_client
,
service_mux
,
chan
,
rcvsel
);
if
(
err
!=
BPM_CLIENT_SUCCESS
){
fprintf
(
stderr
,
"[client:trigger]: bpm_set_trigger_rcv_sel failed
\n
"
);
goto
err_bpm_set
;
}
}
uint32_t
transmsrc
=
0
;
if
(
transmsrc_sel
==
1
)
{
transmsrc
=
strtoul
(
transmsrc_str
,
NULL
,
10
);
bpm_client_err_e
err
=
bpm_set_trigger_transm_src
(
bpm_client
,
service_mux
,
chan
,
transmsrc
);
if
(
err
!=
BPM_CLIENT_SUCCESS
){
fprintf
(
stderr
,
"[client:trigger]: bpm_set_trigger_transm_sel failed
\n
"
);
goto
err_bpm_set
;
}
}
uint32_t
transmsel
=
0
;
if
(
transmsel_sel
==
1
)
{
transmsel
=
strtoul
(
transmsel_str
,
NULL
,
10
);
bpm_client_err_e
err
=
bpm_set_trigger_transm_out_sel
(
bpm_client
,
service_mux
,
chan
,
transmsel
);
if
(
err
!=
BPM_CLIENT_SUCCESS
){
fprintf
(
stderr
,
"[client:trigger]: bpm_set_trigger_transm_sel failed
\n
"
);
goto
err_bpm_set
;
}
}
uint32_t
dir
=
0
;
if
(
dir_sel
==
1
)
{
dir
=
strtoul
(
dir_str
,
NULL
,
10
);
bpm_client_err_e
err
=
bpm_set_trigger_dir
(
bpm_client
,
service_iface
,
chan
,
dir
);
if
(
err
!=
BPM_CLIENT_SUCCESS
){
fprintf
(
stderr
,
"[client:trigger]: bpm_set_trigger_rcv_sel failed
\n
"
);
goto
err_bpm_set
;
}
}
err_bpm_set:
err_bpm_client_new:
free
(
dir_str
);
dir_str
=
NULL
;
free
(
transmsel_str
);
transmsel_str
=
NULL
;
free
(
transmsrc_str
);
transmsrc_str
=
NULL
;
free
(
rcvsel_str
);
rcvsel_str
=
NULL
;
free
(
rcvsrc_str
);
rcvsrc_str
=
NULL
;
free
(
chan_str
);
chan_str
=
NULL
;
free
(
board_number_str
);
board_number_str
=
NULL
;
free
(
bpm_number_str
);
bpm_number_str
=
NULL
;
free
(
num_samples_str
);
num_samples_str
=
NULL
;
free
(
broker_endp
);
broker_endp
=
NULL
;
bpm_client_destroy
(
&
bpm_client
);
return
0
;
}
This diff is collapsed.
Click to expand it.
Preview
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment