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')
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')
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')
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')
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]))
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]))
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')