How to use WhiteRabbit based Timing @GSI

(from FESA 2.0.1 on)

Please note: the current implementation is just a hack to make things work at all! A more solid implementation can be done as soon as a libSAFT (detailed info in 7. ) is available that provides a solid interface to the etherbone library.

  1. In the instantiation document: Select "FAIR" as timingDomain and choose a WhiteRabbit based timing driven accelerator for your device:
    <device-instance name="myDeviceNomenklatur">
       <configuration>
          <description value="This is a WhiteRabbitDevice" />
          <accelerator value="CRYRING-YRS1#200" />
          <timingDomain value="FAIR" />
          <mainMuxCriterion value="USER" />
       </configuration>
       ...
  2. Choose one (or more) of the events related to WhiteRabbit based timing in the events-mapping. The events for WhiteRabbit based timing start with EVT_
          <events-mapping>
            <myLogicalEvent>
              <event-configuration name="MyEventConfig">
                 <Timing>
                    <hardware-event name="EVT_BP_START#256" />
                            <hardware-event name="EVT_BEAM_ON#6" />
                 </Timing>
              </event-configuration>
              <event-configuration name="MyEventConfig2">
                 <Timing>
                    <hardware-event name="EVT_BEAM_ON#6" />
                 </Timing>
              </event-configuration>
              ...
  3. Work with the payload of the WhiteRabbit-event in the RT-Action
    void MyRTAction::execute(fesa::RTEvent* pEvt)
    {
        std::cout << "MyRTAction::execute start" << std::endl;
        fesaGSI::TimingContextWR* scuContext = dynamic_cast<fesaGSI::TimingContextWR*>(pEvt->getMultiplexingContext());
        fesaGSI::TimingContextWRPayload payload = scuContext->getPayload();
        std::cout << "param: " << std::hex << payload.param_ << std::endl;
        std::cout << "timeStamp: " << payload.timeStamp_ << std::endl;
        std::cout << "usedEventFilter_: " << std::hex << payload.usedEventFilter_ << std::endl;
        std::cout << "MyRTAction::execute stop" << std::endl;
    }
       
  4. (optional) Add a trigger to the ECA to directly trigger hardware on an incoming event:
    void RTDeviceClass::specificInit()
    {
        GSI_ECA::Event eventFilter = 256;   // filter to specify for which event(s) to listen
        GSI_ECA::Time offset = 0;           // offset for the event, max 8ns
        GSI_ECA::Channel channel = 0;       // PCI_EXPRESS = 1 (software-interrupts are reserved for FESA) .. ask the !WhiteRabbit-Team for possible other channels
        uint8_t relevantFilterBits = 12;    // Bits which will be used for filtering in "eventFilter" (fesa uses first 32bits for eventID) maschineID-filtering is not used yet.
        fesaGSI::TimingEventSourceWR::registerHardwareTrigger( eventFilter, offset, channel, relevantFilterBits );
    }
  5. Start FESA-class with application-argument "-WR" to use the TimingEventSourceWR
    from FESA3 2.0.1 on: start_<deply-unit name>_<X>.sh -f "-usrArgs -WR"
  6. Trigger local-event on the ECA for testing purposes:
    [root@scul022]$ eca-ctl dev/wbm0 send 0x0000002c00000042 0x12343456 0xabd +1
    This would configure the ECA to launch event 44(2c) with the payload 0x12343456 0xabd in 1sec ( you can as well put absolute timestamps here! Refer to WesleyTerpstra for details)
    "42" could e.g. be a BeamProcessID. !FESA3 assumes to find the EventNo in the first 32bits.
  7. Trigger local event on the ECA for testing purposes:
    [root@scul022]$ eca-ctl dev/wbm0 send 0x1ec0b0400000002 0x12343456 0xabd +0.1
    
    0x1ec0b04000000002 translates to: trigger event Timing::WhiteRabbit-CycleStart#44 with sequence ID 1024, beam process ID 0, group ID 492, format  ID 0, sequence counter 2  
  8. What does not work currently:
    • multiple FESA binaries on the same front-end. FESA3 has to be the one and only user of the ECA ! It will stay like that, until there is a timing daemon and a "SAFT" library, provided by the timing group.

Based on https://www-acc.gsi.de/wiki/FESA/ECA

-- SolveighMatthies - 01 Sep 2014
Topic revision: r2 - 19 Jan 2015, SolveighMatthies
This site is powered by FoswikiCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding Foswiki? Send feedback