Example #1
0
    def test_spi_decode(self):
        self.test_name = 'SPI message'
        self.trial_count = 20
        for i in xrange(self.trial_count):
            self.update_progress(i+1)
            
            cpol = random.choice((0, 1))
            cpha = random.choice((0, 1))
            lsb_first = random.choice((True, False))
            
            word_size = random.randint(8, 32)
            clock_freq = random.uniform(1.0e3, 1.0e7)
            
            msg = []
            for _ in xrange(random.randint(4, 20)):
                msg.append(random.randint(0, 2**word_size-1))
                
            use_edges = random.choice((True, False))                
                
            # msg = [3, 4, 5, 240]
            # word_size = 8
            # clock_freq = 30.0
            # lsb_first = True
            # cpol = 0
            # cpha = 1
            # use_edges = False
            
            clk, mosi, cs = spi.spi_synth(msg, word_size, clock_freq, cpol, cpha, lsb_first, 4.0 / clock_freq, 0.0)

            if use_edges:
                records_it = spi.spi_decode(clk, mosi, cs, cpol=cpol, cpha=cpha, lsb_first=lsb_first, stream_type=streaming.StreamType.Edges)
                
            else: # samples
                #sr = 1.0e-2
                sample_period = 1.0 / (20.0 * clock_freq)
                #sample_period = 10.0e-2
                clk_s = sigp.edges_to_sample_stream(clk, sample_period)
                mosi_s = sigp.noisify(sigp.edges_to_sample_stream(mosi, sample_period))
                cs_s = sigp.noisify(sigp.edges_to_sample_stream(cs, sample_period))

                records_it = spi.spi_decode(clk_s, mosi_s, cs_s, cpol=cpol, cpha=cpha, lsb_first=lsb_first)
                            
            records = list(records_it)
            #print('\nDecoded:', [str(r) for r in records])
            #print(records[-1].start_time, records[-1].end_time)
            
            msg_ix = 0
            match = True
            frame_cnt = 0
            for r in records:
                if r.kind == 'SPI frame':
                    frame_cnt += 1
                    #print('Data:', r.data, msg[msg_ix])
                    if r.data != msg[msg_ix]:
                        match = False
                        break
                    msg_ix += 1
                    
            self.assertTrue(match, msg='Message not decoded successfully')
            self.assertEqual(frame_cnt, len(msg), 'Missing or extra decoded messages')
Example #2
0
    def test_i2c_decode(self):
        self.test_name = 'I2C transfer'
        self.trial_count = 20
        for i in xrange(self.trial_count):
            self.update_progress(i+1)

            clock_freq = 100.0e3

            transfers = []
            transfers.append(i2c.I2CTransfer(i2c.I2C.Write, 0x23, [1,2,3, 4]))
            transfers.append(i2c.I2CTransfer(i2c.I2C.Write, 0x183, [5, 6, 240]))
            
            transfers = []
            for _ in xrange(random.randint(1, 6)):
                addr = random.randint(1, 2**10-1)
                data = []
                for __ in xrange(random.randint(1, 10)):
                    data.append(random.randint(0, 255))
                    
                r_wn = random.choice((i2c.I2C.Write, i2c.I2C.Read))
                
                # reads with 10-bit addressing are special
                if r_wn == i2c.I2C.Read and addr > 0x77:
                    transfers.append(i2c.I2CTransfer(i2c.I2C.Write, addr, data))
                    transfers.append(i2c.I2CTransfer(r_wn, addr, data))
                else:
                    transfers.append(i2c.I2CTransfer(r_wn, addr, data))
            
            use_edges = random.choice((True, False))                
            
            scl, sda = i2c.i2c_synth(transfers, clock_freq, idle_start=3.0e-5, idle_end=3.0e-5)

            if use_edges:
                records_it = i2c.i2c_decode(scl, sda, stream_type=streaming.StreamType.Edges)
            else:
                sample_period = 1.0 / (20.0 * clock_freq)
                scl_s = sigp.edges_to_sample_stream(scl, sample_period)
                sda_s = sigp.edges_to_sample_stream(sda, sample_period)
                
                records_it = i2c.i2c_decode(scl_s, sda_s, stream_type=streaming.StreamType.Samples)
                
            records = list(records_it)
            
            
            d_txfers = list(i2c.reconstruct_i2c_transfers(iter(records)))
            
            # validate the decoded transfers
            match = True
            for i, t in enumerate(d_txfers):
                if t != transfers[i]:
                    print('\nMismatch:')
                    print('  ', t)
                    print('  ', transfers[i])
                    
                    match = False
                    break
                    
            self.assertTrue(match, msg='Transfers not decoded successfully')
            self.assertEqual(len(d_txfers), len(transfers), 'Missing or extra decoded transfers')
Example #3
0
    def test_ps2_decode(self):
        self.test_name = 'PS/2 message'
        self.trial_count = 20
        for i in xrange(self.trial_count):
            self.update_progress(i + 1)

            clock_freq = random.uniform(10.0e3, 13.0e3)

            frames = []
            for _ in xrange(random.randint(4, 20)):
                frames.append(ps2.PS2Frame(random.randint(0, 2**8-1), \
                    random.choice((ps2.PS2Dir.DeviceToHost, ps2.PS2Dir.HostToDevice))) \
                )

            use_edges = random.choice((True, False))

            clk, data = ps2.ps2_synth(frames, clock_freq, 4.0 / clock_freq,
                                      5.0 / clock_freq)

            if use_edges:
                records_it = ps2.ps2_decode(
                    clk, data, stream_type=streaming.StreamType.Edges)

            else:  # samples
                #sr = 1.0e-2
                sample_period = 1.0 / (20.0 * clock_freq)
                #sample_period = 10.0e-2
                clk_s = sigp.edges_to_sample_stream(clk, sample_period)
                data_s = sigp.noisify(
                    sigp.edges_to_sample_stream(data, sample_period))

                records_it = ps2.ps2_decode(clk_s, data_s)

            records = list(records_it)
            #print('\nDecoded:', [str(r) for r in records])
            #print(records[-1].start_time, records[-1].end_time)

            msg_ix = 0
            match = True
            frame_cnt = 0
            for r in records:
                if r.kind == 'PS/2 frame':
                    frame_cnt += 1
                    #print('Data:', r.data, msg[msg_ix])
                    if r.data != frames[msg_ix]:
                        match = False
                        break
                    msg_ix += 1

            self.assertTrue(match, msg='Message not decoded successfully')
            self.assertEqual(frame_cnt, len(frames),
                             'Missing or extra decoded messages')
Example #4
0
    def test_ps2_decode(self):
        self.test_name = 'PS/2 message'
        self.trial_count = 20
        for i in xrange(self.trial_count):
            self.update_progress(i+1)
            
            clock_freq = random.uniform(10.0e3, 13.0e3)
            
            frames = []
            for _ in xrange(random.randint(4, 20)):
                frames.append(ps2.PS2Frame(random.randint(0, 2**8-1), \
                    random.choice((ps2.PS2Dir.DeviceToHost, ps2.PS2Dir.HostToDevice))) \
                )
                
            use_edges = random.choice((True, False))
                            
            clk, data = ps2.ps2_synth(frames, clock_freq, 4.0 / clock_freq, 5.0 / clock_freq)

            if use_edges:
                records_it = ps2.ps2_decode(clk, data, stream_type=streaming.StreamType.Edges)
                
            else: # samples
                #sr = 1.0e-2
                sample_period = 1.0 / (20.0 * clock_freq)
                #sample_period = 10.0e-2
                clk_s = sigp.edges_to_sample_stream(clk, sample_period)
                data_s = sigp.noisify(sigp.edges_to_sample_stream(data, sample_period))

                records_it = ps2.ps2_decode(clk_s, data_s)
                            
            records = list(records_it)
            #print('\nDecoded:', [str(r) for r in records])
            #print(records[-1].start_time, records[-1].end_time)
            
            msg_ix = 0
            match = True
            frame_cnt = 0
            for r in records:
                if r.kind == 'PS/2 frame':
                    frame_cnt += 1
                    #print('Data:', r.data, msg[msg_ix])
                    if r.data != frames[msg_ix]:
                        match = False
                        break
                    msg_ix += 1
                    
            self.assertTrue(match, msg='Message not decoded successfully')
            self.assertEqual(frame_cnt, len(frames), 'Missing or extra decoded messages')
Example #5
0
    def test_find_logic_levels(self):
        # test with clean samples
        # with noise
        # with bandwidth limited (slow and fast)
        # with noise and bandwidth limit

        # with first edge before 200th sample, just before 200th, just after 200th, after 200th

        sample_rate = 1000.0
        sample_period = 1.0 / sample_rate
        rise_time = sigp.min_rise_time(sample_rate) * 50.0

        edge_vectors = {
            'flat_line': (((0.0,0), (3.0,0)), False),
            'rising_edge_100': (((0.0,0), (0.10,1), (3.0,1)), False),
            'rising_edge_190': (((0.0,0), (0.19,1), (3.0,1)), True),
            'rising_edge_200': (((0.0,0), (0.2,1),  (3.0,1)), True),
            'rising_edge_400': (((0.0,0), (0.40,1), (3.0,1)), True),
            'pulse_100': (((0.0,0), (0.10,1), (0.5,0), (3.0,0)), True),
            'multi_pulse': (((0.0,0), (0.7, 1), (0.8, 0), (0.9, 1), (1.0, 0), \
                (1.1,1), (1.2,0), (1.3,1), (1.4,0), \
                (1.5,1), (1.6,0), (3.0,1)), True),
        }

        no_noise_vectors = ('rising_edge_190', 'rising_edge_200')

        sample_vectors = {}
        for name, vector in edge_vectors.iteritems():
            samples = list(
                sigp.edges_to_sample_stream(iter(vector[0]), sample_period))
            sample_vectors[name] = (samples, vector[1])

        base_names = sample_vectors.keys()
        for name in base_names:
            if name in no_noise_vectors:
                continue
            noisy = list(
                sigp.noisify(iter(sample_vectors[name][0]), snr_db=20.0))
            sample_vectors['noisy_' + name] = (noisy, sample_vectors[name][1])

        for name in base_names:
            bwlim = list(
                sigp.filter_waveform(iter(sample_vectors[name][0]),
                                     sample_rate, rise_time))
            sample_vectors['bwlim_' + name] = (bwlim, sample_vectors[name][1])

        for name in base_names:
            if name in no_noise_vectors:
                continue
            bwlim_noisy = list(sigp.noisify(sigp.filter_waveform(iter(sample_vectors[name][0]), \
                sample_rate, rise_time), snr_db=20.0))
            sample_vectors['bwlim_noisy_' + name] = (bwlim_noisy,
                                                     sample_vectors[name][1])

        #sample_vectors.pop('rising_edge_400', None)

        for name, vector in sample_vectors.iteritems():
            samples = vector[0]
            expect_success = vector[1]

            logic_levels = decode.find_logic_levels(samples)
            if not expect_success:
                continue  # We expected find_logic_levels() to fail

            if logic_levels is None:
                #print('### Fail:', name)
                self.fail('No logic levels found')

            #print('####', name, logic_levels)
            self.assertRelativelyEqual(logic_levels[0],
                                       0.0,
                                       epsilon=0.16,
                                       msg='Bad logic 0: {}'.format(
                                           logic_levels[0]))
            self.assertRelativelyEqual(logic_levels[1],
                                       1.0,
                                       epsilon=0.1,
                                       msg='Bad logic 1: {}'.format(
                                           logic_levels[1]))
Example #6
0
    def test_find_logic_levels(self):
        # test with clean samples
        # with noise
        # with bandwidth limited (slow and fast)
        # with noise and bandwidth limit

        # with first edge before 200th sample, just before 200th, just after 200th, after 200th


        sample_rate = 1000.0
        sample_period = 1.0 / sample_rate
        rise_time = sigp.min_rise_time(sample_rate) * 50.0

        edge_vectors = {
            'flat_line': (((0.0,0), (3.0,0)), False),
            'rising_edge_100': (((0.0,0), (0.10,1), (3.0,1)), False),
            'rising_edge_190': (((0.0,0), (0.19,1), (3.0,1)), True),
            'rising_edge_200': (((0.0,0), (0.2,1),  (3.0,1)), True),
            'rising_edge_400': (((0.0,0), (0.40,1), (3.0,1)), True),
            'pulse_100': (((0.0,0), (0.10,1), (0.5,0), (3.0,0)), True),
            'multi_pulse': (((0.0,0), (0.7, 1), (0.8, 0), (0.9, 1), (1.0, 0), \
                (1.1,1), (1.2,0), (1.3,1), (1.4,0), \
                (1.5,1), (1.6,0), (3.0,1)), True),
        }

        no_noise_vectors = ('rising_edge_190', 'rising_edge_200')

        sample_vectors = {}
        for name, vector in edge_vectors.iteritems():
            samples = list(sigp.edges_to_sample_stream(iter(vector[0]), sample_period))
            sample_vectors[name] = (samples, vector[1])

        base_names = sample_vectors.keys()
        for name in base_names:
            if name in no_noise_vectors:
                continue
            noisy = list(sigp.noisify(iter(sample_vectors[name][0]), snr_db=20.0))
            sample_vectors['noisy_' + name] = (noisy, sample_vectors[name][1])

        for name in base_names:
            bwlim = list(sigp.filter_waveform(iter(sample_vectors[name][0]), sample_rate, rise_time))
            sample_vectors['bwlim_' + name] = (bwlim, sample_vectors[name][1])

        for name in base_names:
            if name in no_noise_vectors:
                continue
            bwlim_noisy = list(sigp.noisify(sigp.filter_waveform(iter(sample_vectors[name][0]), \
                sample_rate, rise_time), snr_db=20.0))
            sample_vectors['bwlim_noisy_' + name] = (bwlim_noisy, sample_vectors[name][1])


        #sample_vectors.pop('rising_edge_400', None)

        for name, vector in sample_vectors.iteritems():
            samples = vector[0]
            expect_success = vector[1]

            logic_levels = decode.find_logic_levels(samples)
            if not expect_success:
                continue # We expected find_logic_levels() to fail

            if logic_levels is None:
                #print('### Fail:', name)
                self.fail('No logic levels found')


            #print('####', name, logic_levels)
            self.assertRelativelyEqual(logic_levels[0], 0.0, epsilon=0.16, msg='Bad logic 0: {}'.format(logic_levels[0]))
            self.assertRelativelyEqual(logic_levels[1], 1.0, epsilon=0.1, msg='Bad logic 1: {}'.format(logic_levels[1]))
Example #7
0
    def test_spi_decode(self):
        self.test_name = 'SPI message'
        self.trial_count = 20
        for i in xrange(self.trial_count):
            self.update_progress(i + 1)

            cpol = random.choice((0, 1))
            cpha = random.choice((0, 1))
            lsb_first = random.choice((True, False))

            word_size = random.randint(8, 32)
            clock_freq = random.uniform(1.0e3, 1.0e7)

            msg = []
            for _ in xrange(random.randint(4, 20)):
                msg.append(random.randint(0, 2**word_size - 1))

            use_edges = random.choice((True, False))

            # msg = [3, 4, 5, 240]
            # word_size = 8
            # clock_freq = 30.0
            # lsb_first = True
            # cpol = 0
            # cpha = 1
            # use_edges = False

            clk, mosi, cs = spi.spi_synth(msg, word_size, clock_freq, cpol,
                                          cpha, lsb_first, 4.0 / clock_freq,
                                          0.0)

            if use_edges:
                records_it = spi.spi_decode(
                    clk,
                    mosi,
                    cs,
                    cpol=cpol,
                    cpha=cpha,
                    lsb_first=lsb_first,
                    stream_type=streaming.StreamType.Edges)

            else:  # samples
                #sr = 1.0e-2
                sample_period = 1.0 / (20.0 * clock_freq)
                #sample_period = 10.0e-2
                clk_s = sigp.edges_to_sample_stream(clk, sample_period)
                mosi_s = sigp.noisify(
                    sigp.edges_to_sample_stream(mosi, sample_period))
                cs_s = sigp.noisify(
                    sigp.edges_to_sample_stream(cs, sample_period))

                records_it = spi.spi_decode(clk_s,
                                            mosi_s,
                                            cs_s,
                                            cpol=cpol,
                                            cpha=cpha,
                                            lsb_first=lsb_first)

            records = list(records_it)
            #print('\nDecoded:', [str(r) for r in records])
            #print(records[-1].start_time, records[-1].end_time)

            msg_ix = 0
            match = True
            frame_cnt = 0
            for r in records:
                if r.kind == 'SPI frame':
                    frame_cnt += 1
                    #print('Data:', r.data, msg[msg_ix])
                    if r.data != msg[msg_ix]:
                        match = False
                        break
                    msg_ix += 1

            self.assertTrue(match, msg='Message not decoded successfully')
            self.assertEqual(frame_cnt, len(msg),
                             'Missing or extra decoded messages')