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:
$ 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).
$ 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
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
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
-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? ?bdSimEncoder (plc-tst-proto6Q? ?zdSimEncoder )plc-tst-proto6+g ??dSimEncoder *plc-tst-proto6 ??dSimEncoder +plc-tst-proto6 ??dSimEncoder^C -bash-4.2$
Updates to rix.cnf file
$ diff rix.cnf rix.cnf.ENCODER 67a68,69 > { host: 'drp-neh-ctl002', id:'tprtrig', flags:'sp', cmd:'tprtrig -t a -c 0 -o 1 -d 2 -w 10 -z'}, > { host: 'drp-neh-cmp015', id:'encoder_0', 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
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.
$ 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.
$ 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
Run Encoder Sim on Remote Host
Earlier (2022) the sim was limited to localhost.
-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
(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