Overview
Data Format 1.0.0
At each trigger, the UDP Encoder sends one header structure followed by up to eight channel structures.
See the definitions of encoder_header_t and encoder_channel_t in github: UdpEncoder.hh
Zach writes:
...we’re currently taking the PLC’s internal encoder numerator, which is a floating point number less than zero, multiplying it by 10^6, and sending it as an integer. So, the “unit” of the output is baked into the protocol.
Data Format 2.0.0
Version 2.0.0 of encoder_channel_t adds a uint16_t field 'scaleDenom.' If nonzero, it is the denominator of a rational scale value.
'encoderValue' (shape: 1): 23563414
'timing' (shape: 1): 505870
'scale' (shape: 1): 1
'scaleDenom' (shape: 1): 150
'mode' (shape: 1): 0
'error' (shape: 1): 0
'majorVersion' (shape: 1): 2
'minorVersion' (shape: 1): 0
'microVersion' (shape: 1): 0
See the definitions of encoder_header_t and encoder_channel_t in github: UdpEncoder.hh
Zach writes:
...if the denominator is used, we do no pre or post multiplication of the values. If I need to express something like numerator = 1.16 and denominator = 5.0, I would send 116 and 500 which maintains the same ratio as the original.
In the specific case of this encoder, I send 1 and 150 exactly and your code on the other side simply doesn’t do the *1e-6 step because a denominator is present.
Along with the introduction of data format 2.0.0, encoder detector version was updated to 2.0.0 as well. Here is the first run to be recorded with version 2.0.0:
Code Block |
---|
language | cpptext |
---|
title | encoder header: 32 bytes | detnames -r |
---|
|
$ detnames -r /cds/data/psdm/rix/rixlx9720/xtc/rixlx9720-r0263-s000-c000.xtc2
----------------------------------------------
Name | Det Type | Data Type | Version
----------------------------------------------
chunkinfo | chunkinfo | chunkinfo | 0_0_1
runinfo | runinfo | runinfo | 0_0_1
mono_encoder | encoder | raw | 2_0_0
---------------------------------------------- |
Testing With Encoder Simulator (sim_udpencoder)
To test with the simulator, run sim_udpencoder on the same host as drp_udpencoder and use the matching "-p <partition>" setting. The simulator sends packets to drp_udpencoder via localhost (127.0.0.1).
Code Block |
---|
language | text |
---|
title | sim_udpencoder usage |
---|
|
$ sim_udpencoder -h
Usage: sim_udpencoder [options]
Options: -r <rate> (0:929kHz,1:71kHz,..)
-e <evcode>
-p <partition>
-d <data port> (default 5006)
-v (verbose)
Either -r or -e or -p is required |
Send SIGUSR1 to the sim_udpencoder process to simulate a dropped UDP packet.
$ kill -USR1 pid
Send SIGUSR2 to the sim_udpencoder process to simulate 4 consecutive dropped UDP packets.
$ kill -USR2 pid
Testing With Loopback Mode (drp_udpencoder -L <loopback_port>)
Configuring TPR On DAQ Partition
Code Block |
---|
|
You can get tprtrig to trigger the EVR on a DAQ partition, then sleep, like so:
$ tprtrig -t a -c 0 -o 1 -d 2 -w 10 -p 4 -z
programs EVR /dev/tpra (-t a) to generate a TTL trigger using logic channel 0 (-c 0) on output 0 (-o 1 [bit mask]) with delay of 2 119MHz clocks (-d 2) and width 10 119 MHz clocks (-w 10) for every L1Accept on partition 4 (-p 4). |
Configuring TPR Standalone
Code Block |
---|
|
Generate 1Hz triggers on output 0 with a width of 54 nanoseconds, then sleep.
$ tprtrig -t a -c 0 -o 1 -d 1 -w 10 -r 6 -z |
Loopback Mode
In loopback mode no encoder or PLC or added process is required, as drp_udpencoder sends and receives simulated data via localhost.
Run drp_udpencoder with the -L <loopback_port> flag to enable loopback mode. For example, "-L 5007" loops back on localhost port 5007.
Monitoring UDP packets with netcat
Code Block |
---|
|
-bash-4.2$ hostname
drp-neh-cmp015
-bash-4.2$ nc -lvu 192.168.0.8 5006
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Listening on 192.168.0.8:5006
Ncat: Connection from 192.168.0.3.
'plc-tst-proto6w? typedef struct {
uint16_t frameCount; // network byte order
char reserved1[2]; ?bdSimEncoder
(plc-tst-proto6Q?
char version[4];
?zdSimEncoder
)plc-tst-proto6+g
??dSimEncoder
*plc-tst-proto6
char hardwareID[16]; ??dSimEncoder
+plc-tst-proto6
char reserved2;
??dSimEncoder^C
-bash-4.2$ |
Updates to rix.cnf file
Code Block |
---|
|
$ diff rix.cnf rix.cnf.ENCODER
67a68,69
> { host: 'drp-neh-ctl002', id:'tprtrig', flags:'sp', char cmd:'tprtrig -t a -c 0 -o 1 -d 2 -w 10 -z'},
> { host: 'drp-neh-cmp015', id:'encoder_0', channelMask; // bit mask of which channels 0-7 are present
char errorMask; // bit mask of channel errors 0-7
char mode;
char reserved3[4];
} encoder_header_t; flags:'spu', rtprio:50, cmd:f'drp_udpencoder -l 0x8 -o {data_dir} -P {hutch} -d /dev/datadev_0 -C {collect_host}'}, |
Recording Experiment rixdaq18 Run 23
Code Block |
---|
language | text |
---|
title | encoder_0 log file |
---|
|
rix-drp_udpencoder[70415]: <I> UDP receiver thread started
rix-drp_udpencoder[70415]: <I> setting lane 0
rix-drp_udpencoder[70415]: <I> PGPReader saw Configure transition @ 985133577.575584342 (0004674c799500)
rix-drp_udpencoder[70415]: <I> EbReceiver saw Configure transition @ 985133577.575584342 (0004674c799500)
rix-drp_udpencoder[70415]: <I> received key = beginrun
Opening file /ffb01/data/rix/rixdaq18/xtc/rixdaq18-r0023-s002-c000.xtc2
rix-drp_udpencoder[70415]: <I> Opening file '/ffb01/data/rix/rixdaq18/xtc/rixdaq18-r0023-s002-c000.xtc2'
rix-drp_udpencoder[70415]: <I> Opening file '/ffb01/data/rix/rixdaq18/xtc/smalldata/rixdaq18-r0023-s002-c000.smd.xtc2'
rix-drp_udpencoder[70415]: <I> PGPReader saw BeginRun transition @ 985133590.653839154 (0004674d32e3bd)
rix-drp_udpencoder[70415]: <I> EbReceiver saw BeginRun transition @ 985133590.653839154 (0004674d32e3bd)
rix-drp_udpencoder[70415]: <I> received key = beginstep
rix-drp_udpencoder[70415]: <I> PGPReader saw BeginStep transition @ 985133595.531025432 (0004674d77fa30)
rix-drp_udpencoder[70415]: <I> EbReceiver saw BeginStep transition @ 985133595.531025432 (0004674d77fa30)
rix-drp_udpencoder[70415]: <I> received key = enable
rix-drp_udpencoder[70415]: <I> PGPReader saw Enable transition @ 985133600.224320451 (0004674dba80e8)
rix-drp_udpencoder[70415]: <I> EbReceiver saw Enable transition @ 985133600.224320451 (0004674dba80e8)
rix-drp_udpencoder[70415]: <I> received key = disable
rix-drp_udpencoder[70415]: <I> PGPReader saw Disable transition @ 985133613.263120215 (0004674e7336db)
rix-drp_udpencoder[70415]: <I> EbReceiver saw Disable transition @ 985133613.263120215 (0004674e7336db)
rix-drp_udpencoder[70415]: <I> received key = endstep
rix-drp_udpencoder[70415]: <I> PGPReader saw EndStep transition @ 985133613.268625231 (0004674e734afa)
rix-drp_udpencoder[70415]: <I> EbReceiver saw EndStep transition @ 985133613.268625231 (0004674e734afa)
rix-drp_udpencoder[70415]: <I> received key = endrun
rix-drp_udpencoder[70415]: <I> PGPReader saw EndRun transition @ 985133613.326952707 (0004674e742027)
rix-drp_udpencoder[70415]: <I> EbReceiver saw EndRun transition @ 985133613.326952707 (0004674e742027)
rix-drp_udpencoder[70415]: <I> received key = unconfigure
rix-drp_udpencoder[70415]: <I> PGPReader saw Unconfigure transition @ 985133630.918879608 (0004674f6d5f9b)
rix-drp_udpencoder[70415]: <I> EbReceiver saw Unconfigure transition @ 985133630.918879608 (0004674f6d5f9b) |
Recording Experiment rixdaq18 Run 27
This was the first recording of the encoder at 120Hz.
Code Block |
---|
language | text |
---|
title | xtcreader output |
---|
|
$ xtcreader -d -w 1 -f /cds/data/psdm/rix/rixdaq18/xtc/rixdaq18-r0027-s000-c000.xtc2 | grep shape | head -16
'encoderValue' (shape: 1): 23563414
'timing' (shape: 1): 505870
'scale' (shape: 1): 6667
'mode' (shape: 1): 0
'error' (shape: 1): 0
'majorVersion' (shape: 1): 1
'minorVersion' (shape: 1): 0
'microVersion' (shape: 1): 0
'encoderValue' (shape: 1): 23563404
'timing' (shape: 1): 838450
'scale' (shape: 1): 6667
'mode' (shape: 1): 0
'error' (shape: 1): 0
'majorVersion' (shape: 1): 1
'minorVersion' (shape: 1): 0
'microVersion' (shape: 1): 0 |
Recording Experiment rixlx9720 Run 262
This was the first recording of the encoder using interface version 2.0.0.
Code Block |
---|
language | text |
---|
title | xtcreader output |
---|
|
$ xtcreader -d -w 1 -f /cds/data/psdm/rix/rixlx9720/xtc/rixlx9720-r0262-s000-c000.xtc2 | grep shape | head -18
'encoderValue' (shape: 1): 23808197
'timing' (shape: 1): 772470
'scale' (shape: 1): 1
'scaleDenom' (shape: 1): 150
'mode' (shape: 1): 0
'error' (shape: 1): 0
'majorVersion' (shape: 1): 2
'minorVersion' (shape: 1): 0
'microVersion' (shape: 1): 0
'encoderValue' (shape: 1): 23808214
'timing' (shape: 1): 300
'scale' (shape: 1): 1
'scaleDenom' (shape: 1): 150
'mode' (shape: 1): 0
'error' (shape: 1): 0
'majorVersion' (shape: 1): 2
'minorVersion' (shape: 1): 0
'microVersion' (shape: 1): 0 |
Viewing Encoder Value in AMI
Image Added
Run Encoder Sim on Remote Host
Earlier (2022) the sim was limited to localhost.
Code Block |
---|
language | text |
---|
title | Listen on drp-tst-acc01 |
---|
|
-bash-4.2$ hostname
drp-tst-acc01
-bash-4.2$ nc -lvu 172.21.148.201 5006
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Listening on 172.21.148.201:5006
Ncat: Connection from 172.21.148.110.
sim_updencodersim_updencodersim_updencodersim_updencodersim_updencoder |
Code Block |
---|
language | text |
---|
title | Send from daq-tst-dev03 |
---|
|
(ps-4.5.26) -bash-4.2$ hostname
daq-tst-dev03.pcdsn
(ps-4.5.26) -bash-4.2$ sim_udpencoder -r 0 -a 172.21.148.201 | head -4
Version PulseID TimeStamp Markers BeamReq BsaInit BsaActiv BsaAvgD BsaDone
10000 374b0fc41f 3e4f023b73138 10040 0 0 0 0 0
10000 374b0fc420 3e4f023b7356d 10040 0 0 0 0 0
10000 374b0fc421 3e4f023b739a2 10040 0 0 0 0 0 |
Code Block |
---|
language | cpp |
---|
title | encoder channel: 32 bytes |
---|
|
typedef struct {
uint32_t encoderValue; // network byte order
char reserved1[4];
char hardwareID[16];
char reserved2;
char channel;
char error;
char mode;
char reserved3[4];
} encoder_channel_t; |