Пример #1
0
    def test_channel_playback(self):

        class config: pass

        cfg = config()
        
        cfg.chs = [1]
        cfg.nullAlgoLatency = 4
        cfg.playStart = orb.Point(0)
        cfg.playStop = orb.Point(2)
        cfg.playPayload = 'generate://pattern'
        cfg.capStart = orb.Point(0, cfg.nullAlgoLatency)
        cfg.capStop = orb.Point(2, cfg.nullAlgoLatency)
        cfg.capPath = None
        
        m = self.board.getMetric()

        d = m.distance(cfg.playStop, cfg.playStart)

        # RX buffer in pattern mode
        datapath.XBuffers.run(self.board, 'rx', 'PlayOnce', cfg.chs, cfg.playPayload, (cfg.playStart,cfg.playStop))

        # Tx buffers in capture mode
        datapath.XBuffers.run(self.board, 'tx', 'Capture', cfg.chs, None, (cfg.capStart, cfg.capStop))

        # Capture!
        rx,tx = datapath.Capture.run(self.board, cfg.chs, cfg.chs,  cfg.capPath)

        # Compare captures in the relevant range
        errors = compareBufferData(rx,tx, (0,d) )
        tools.assert_equal(len(errors),0)
Пример #2
0
    def test_pattern_packet(self):

        cfg = mp7nose.TestConfig()
        
        cfg.chs = [1,2]
        cfg.pattStart = orb.Point(2)
        cfg.pattStop = orb.Point(5)
        cfg.capStart = orb.Point(1)
        cfg.capStop = None
        cfg.capPath = None
        cfg.nullAlgoLatency = 4

        rx,tx = self.pattern_and_capture(cfg)

        # Break down the daptured data in packets
        packets = data.findAllPackets(tx)

        # When channels are aligned, there is only one train of packets
        tools.assert_equal(len(packets),1,'Expected 1 packet train in capture, found %d' % len(packets))

        # first and only packet, unpack
        pkts, chans =  packets[0]

        tools.assert_equal(chans, cfg.chs)

        # extract the first packet
        firstPkt = pkts[0]

        m = self.board.getMetric()

        errors = checkCapturedPattern(tx, firstPkt, chans, cfg.capStart, cfg.nullAlgoLatency, m)

        tools.assert_equal(len(errors),0, 'Capture errors detected\n'+'\n'.join(errors))
Пример #3
0
    def test_pattern_full(self):

        cfg = mp7nose.TestConfig()
        
        cfg.chs = [1,2]
        cfg.nullAlgoLatency = 4
        cfg.pattStart = orb.Point(0)
        cfg.pattStop = None
        cfg.capStart = orb.Point(1,cfg.nullAlgoLatency)
        cfg.capStop = None
        cfg.capPath = 'nosecap'

        rx,tx = self.pattern_and_capture(cfg)
Пример #4
0
    def test_pattern_latency(self):
        '''
        Checks the rx to rx buffers latency.

        A short packer is sent from rx buffers to tx buffers.
        The latency is measured by capturing the packet at tx buffers and 
        comparing the rising edge of data-valid with the time of transmission.

        * Rx buffers configured to produce the hardcoded pattern.
        * TX buffers in capture mode.

        '''
        
        cfg = mp7nose.TestConfig()
        
        cfg.chs = [1,2]
        cfg.pattStart = orb.Point(2)
        cfg.pattStop = orb.Point(5)
        cfg.capStart = orb.Point(1)
        cfg.capStop = None
        cfg.capPath = None
        cfg.nullAlgoLatency = 4

        rx,tx = self.pattern_and_capture(cfg)

        # Analyze capture

        # Break down the daptured data in packets
        packets = data.findAllPackets(tx)

        # When channels are aligned, there is only one train of packets
        tools.assert_equal(len(packets),1,'Expected 1 packet train in capture, found %d' % len(packets))

        # first and only packet, unpack
        pkts, chans =  packets[0]

        # extract the first packet
        firstPkt = pkts[0]

        m = self.board.getMetric()
        
        # Measure the latency based on data valid
        algoLatency = measureDatavalidLatency( firstPkt[0], cfg.capStart, cfg.pattStart, m )
        
        tools.assert_equal(algoLatency, cfg.nullAlgoLatency)
Пример #5
0
    def setup_class(cls):
        '''Configure class for tests. Configure the board and capture.
        Store the event and the configuration locally 
        '''
        # Take a snapshot of this module's config

        #config = copy.deepcopy(defaults)
        config = defaults

        print "%s - loading menu '%s' from %s" % (cls.__name__, cls.menuName,
                                                  cls.menuFile)

        # Preparing test
        cls.board = cls.context().mp7

        print 'Resetting board'
        infra.Reset.run(cls.board, **config['reset'])
        print 'Configure Tx to send patterns'
        datapath.XBuffers.run(cls.board, 'rx', 'Zeroes', None, None,
                              (orbit.Point(0), None))
        datapath.XBuffers.run(cls.board, 'tx', 'Zeroes', None, None,
                              (orbit.Point(0), None))
        datapath.XBuffers.run(cls.board, 'rx', 'Pattern', cls.patternchans,
                              None, (orbit.Point(0), None))
        print 'Configuing latency buffers'
        readout.EasyLatency.run(cls.board, **config['easylatency'])
        print 'Setting up readout'
        readout.Setup.run(cls.board, **config['setup'])
        print 'Configuring out menu'
        readout.LoadMenu.run(cls.board, cls.menuFile, cls.menuName)
        # Additionally, set board id
        ctrl = cls.board.getCtrl()
        ctrl.getNode('board_id').write(0x1234)
        ctrl.getClient().dispatch()

        result = readout.CaptureEvents.run(cls.board, **config['capture'])

        # Stop if the capture was bugged
        tools.assert_not_equal(
            result, None,
            "There's no event in here. Is the FIFO empty? Maybe you didn't set up correctly."
        )

        # Append result to the class
        cls.result = result
Пример #6
0
    def test_cap_greater_than_pattern(self):
        
        class config(): pass

        cfg = config()
        
        # Use one channel only
        cfg.chs = [3]
        
        # 1 BX long data valid
        cfg.pattStart = orb.Point(1,0)       
        cfg.pattStop = orb.Point(2,0)
        
        # Capture for 3 Bxs, starting at 1
        cfg.capStart = orb.Point(1,0)
        cfg.capStop = orb.Point(4,0)     
        
        # TX in pattern mode
        datapath.XBuffers.run(self.board, 'rx', 'Pattern', cfg.chs, None, (cfg.pattStart,cfg.pattStop))
        # RX in capture mode
        datapath.XBuffers.run(self.board, 'tx', 'Capture', cfg.chs, None, (cfg.capStart, cfg.capStop))
        # Capture
        rx, tx = datapath.Capture.run(self.board, cfg.chs, cfg.chs)


        # Break down the daptured data in packets
        pktTrains = data.findAllPackets(tx)
        tools.assert_equal(len(pktTrains),1,'Expected 1 packet train in capture, found %d' % len(pktTrains))

        pktTrain, chans = pktTrains[0]
        tools.assert_equal(len(pktTrain),1,'Expected 1 packet, found %d - %s' % (len(pktTrain),pktTrain))

        first,last = pktTrain[0]
        pktLen = last-first+1


        # cnt = self.countValidFrames(tx)
        print 'Packet length: ',pktLen

        m = self.board.getMetric()
        
        # Compare measured datavalid with expectations
        # Pattern range is shorter than capture's. The packet length is expected to match the pattern range.
        tools.assert_equal(pktLen, m.distance(cfg.pattStop, cfg.pattStart) )
Пример #7
0
def measureDatavalidLatency( vStart, capStart, pattStart, metric ):
    '''Measures latency between playback/pattern and capture based on data valid position'''

    vP = orb.Point(
        vStart/metric.clockRatio(),
        vStart%metric.clockRatio()
        )
    p0Tx = metric.add(vP,capStart)

    algoLatency = metric.distance(p0Tx,pattStart)

    return algoLatency
Пример #8
0
ncap = info['mask_ram_depth'] / 6

print 'Supported capture modes: 0', ncap - 1

zs.enable()

menuFile = "${MP7_TESTS}/python/daq/simple.py"
menuName = "menuA"
zsMenuName = "zsMenuA"

# print 'Resetting board'
# infra.Reset.run(board, **config['reset'])
print 'Configure Rx to send patterns'
# datapath.XBuffers.run(board, 'rx', 'PlayOnce', [0,1,2,3], 'generate://pattern',(orbit.Point(0),None))
datapath.XBuffers.run(board, 'rx', 'Pattern', [0, 1, 2, 3], None,
                      (orbit.Point(0), None))
print 'Configuing latency buffers'
readout.EasyLatency.run(board, **config['easylatency'])
print 'Setting up readout'
readout.Setup.run(board, **config['setup'])
print 'Configuring readout menu'
readout.LoadMenu.run(board, menuFile, menuName)
print 'Configuring zs menu'
readout.LoadZSMenu.run(board, menuFile, zsMenuName)
# Additionally, set board id
ctrl = board.getCtrl()
ctrl.getNode('board_id').write(0x1234)
ctrl.getClient().dispatch()

result = readout.CaptureEvents.run(board, **config['capture'])