修正bug

This commit is contained in:
2026-04-23 22:52:08 +08:00
parent 1f140e9b0b
commit 7ff53f177d
+33 -22
View File
@@ -20,7 +20,7 @@
import sigrokdecode as srd import sigrokdecode as srd
ann_bit,ann_bit2, ann_stat_bit, ann_type, ann_command, ann_parameter, ann_parity, ann_type2, ann_command2, ann_parameter2, ann_parity2, ann_pos,ann_pos2, ann_status, ann_warning = range(15) ann_bit,ann_bit2, ann_stat_bit, ann_type, ann_command, ann_parameter, ann_parity, ann_type2, ann_command2, ann_parameter2, ann_parity2, ann_pos,ann_pos2, ann_status, ann_warning, ann_warning2 = range(16)
frame_type_none, frame_type_command, frame_type_16bit_pos, frame_type_18bit_pos = range(4) frame_type_none, frame_type_command, frame_type_16bit_pos, frame_type_18bit_pos = range(4)
class Decoder(srd.Decoder): class Decoder(srd.Decoder):
@@ -46,15 +46,22 @@ class Decoder(srd.Decoder):
) )
annotations = ( annotations = (
('bit', 'Data Bit'),
('bit', 'Data Bit'), ('bit', 'Data Bit'),
('stat_bit', 'Status Bit'), ('stat_bit', 'Status Bit'),
('type', 'Frame Type'), ('type', 'Frame Type'),
('command', 'Command'), ('command', 'Command'),
('parameter', 'Parameter'), ('parameter', 'Parameter'),
('parity', 'Parity'), ('parity', 'Parity'),
('type', 'Frame Type'),
('command', 'Command'),
('parameter', 'Parameter'),
('parity', 'Parity'),
('position', 'Position'),
('position', 'Position'), ('position', 'Position'),
('status', 'Status'), ('status', 'Status'),
('warning', 'Human-readable warnings'), ('warning', 'Human-readable warnings'),
('warning', 'Human-readable warnings'),
) )
annotation_rows = ( annotation_rows = (
('bits', 'Data Bits', (ann_bit,)), ('bits', 'Data Bits', (ann_bit,)),
@@ -66,16 +73,20 @@ class Decoder(srd.Decoder):
('positions2', 'Positions2', (ann_pos2,)), ('positions2', 'Positions2', (ann_pos2,)),
('statuses', 'Statuses', (ann_status,)), ('statuses', 'Statuses', (ann_status,)),
('warnings', 'Warnings', (ann_warning,)), ('warnings', 'Warnings', (ann_warning,)),
('warnings', 'Warnings', (ann_warning2,)),
) )
def __init__(self): def __init__(self):
self.samplerate = None self.samplerate = None
self.reset() self.reset()
self.reset2()
def reset(self): def reset(self):
self.bits = [] self.bits = []
self.stat_bits = [] self.stat_bits = []
self.stat_skip_bit = True self.stat_skip_bit = True
def reset2(self):
self.bits2 = []
def metadata(self, key, value): def metadata(self, key, value):
if key == srd.SRD_CONF_SAMPLERATE: if key == srd.SRD_CONF_SAMPLERATE:
@@ -199,12 +210,12 @@ class Decoder(srd.Decoder):
def process_bit2(self, sync, bit_ss, bit_es, bit2_value): def process_bit2(self, sync, bit_ss, bit_es, bit2_value):
self.put_ann(bit_ss, bit_es, ann_bit2, ['%d' % bit2_value]) self.put_ann(bit_ss, bit_es, ann_bit2, ['%d' % bit2_value])
self.bits.append((bit_ss, bit_es, bit2_value)) self.bits2.append((bit_ss, bit_es, bit2_value))
if sync == 0: if sync == 0:
if len(self.bits) < 20: if len(self.bits2) < 20:
self.put_ann(self.bits[0][0], bit_es, ann_warning, ['Not enough data bits']) self.put_ann(self.bits2[0][0], bit_es, ann_warning2, ['Not enough data bits 0x%X' % len(self.bits2)])
self.reset() self.reset2()
return return
# Bit structure: # Bit structure:
@@ -215,10 +226,10 @@ class Decoder(srd.Decoder):
# Calculate parity, excluding the parity bit itself # Calculate parity, excluding the parity bit itself
parity = 0 parity = 0
for ss, es, value in self.bits[:-1]: for ss, es, value in self.bits2[:-1]:
parity ^= value parity ^= value
par_ss, par_es, par_value = self.bits[19] par_ss, par_es, par_value = self.bits2[19]
parity_even = 0 parity_even = 0
parity_odd = 0 parity_odd = 0
if (par_value == parity): if (par_value == parity):
@@ -226,20 +237,20 @@ class Decoder(srd.Decoder):
else: else:
parity_odd = 1 parity_odd = 1
type_1_value = self.bits[0][2] type_1_value = self.bits2[0][2]
type_3_value = (self.bits[0][2] << 2) | (self.bits[1][2] << 1) | self.bits[2][2] type_3_value = (self.bits2[0][2] << 2) | (self.bits2[1][2] << 1) | self.bits2[2][2]
# Determine frame type # Determine frame type
type = frame_type_none type = frame_type_none
parity_status = ['X', 'Unknown'] parity_status = ['X', 'Unknown']
type_ss = self.bits[0][0] type_ss = self.bits2[0][0]
type_es = self.bits[2][1] type_es = self.bits2[2][1]
### 18-bit position ### 18-bit position
if (type_1_value == 1) and (parity_odd == 1): if (type_1_value == 1) and (parity_odd == 1):
type = frame_type_18bit_pos type = frame_type_18bit_pos
type_es = self.bits[0][1] type_es = self.bits2[0][1]
self.put_ann(self.bits[0][0], bit_es, ann_warning, ['Careful: 18-bit position frames with wrong parity and command frames with wrong parity cannot be identified']) self.put_ann(self.bits2[0][0], bit_es, ann_warning2, ['Careful: 18-bit position frames with wrong parity and command frames with wrong parity cannot be identified'])
### 16-bit position ### 16-bit position
elif (type_3_value == 1): elif (type_3_value == 1):
type = frame_type_16bit_pos type = frame_type_16bit_pos
@@ -247,15 +258,15 @@ class Decoder(srd.Decoder):
parity_status = ['OK'] parity_status = ['OK']
else: else:
parity_status = ['NOK'] parity_status = ['NOK']
self.put_ann(self.bits[0][0], bit_es, ann_warning, ['Parity error', 'PE']) self.put_ann(self.bits2[0][0], bit_es, ann_warning2, ['Parity error', 'PE'])
### Command ### Command
elif (type_3_value == 7) and (parity_even == 1): elif (type_3_value == 7) and (parity_even == 1):
type = frame_type_command type = frame_type_command
self.put_ann(self.bits[0][0], bit_es, ann_warning, ['Careful: 18-bit position frames with wrong parity and command frames with wrong parity cannot be identified']) self.put_ann(self.bits2[0][0], bit_es, ann_warning2, ['Careful: 18-bit position frames with wrong parity and command frames with wrong parity cannot be identified'])
### Other ### Other
else: else:
self.put_ann(self.bits[0][0], bit_es, ann_warning, ['Error', 'Unknown command or parity error']) self.put_ann(self.bits2[0][0], bit_es, ann_warning2, ['Error', 'Unknown command or parity error'])
self.reset() self.reset2()
return return
# Output command and parity annotations # Output command and parity annotations
@@ -274,13 +285,13 @@ class Decoder(srd.Decoder):
if (type == frame_type_16bit_pos): if (type == frame_type_16bit_pos):
count = 15 count = 15
for ss, es, value in self.bits[3:19]: for ss, es, value in self.bits2[3:19]:
pos |= value << count pos |= value << count
count -= 1 count -= 1
# pos = pos if pos < 32768 else pos - 65536 # pos = pos if pos < 32768 else pos - 65536
else: else:
count = 17 count = 17
for ss, es, value in self.bits[3:19]: for ss, es, value in self.bits2[3:19]:
pos |= value << count pos |= value << count
count -= 1 count -= 1
pos = pos if pos < 131072 else pos - 262144 pos = pos if pos < 131072 else pos - 262144
@@ -291,7 +302,7 @@ class Decoder(srd.Decoder):
count = 7 count = 7
cmd = 0 cmd = 0
cmd_es = 0 cmd_es = 0
for ss, es, value in self.bits[3:11]: for ss, es, value in self.bits2[3:11]:
cmd |= value << count cmd |= value << count
count -= 1 count -= 1
cmd_es = es cmd_es = es
@@ -299,12 +310,12 @@ class Decoder(srd.Decoder):
count = 7 count = 7
param = 0 param = 0
for ss, es, value in self.bits[11:19]: for ss, es, value in self.bits2[11:19]:
param |= value << count param |= value << count
count -= 1 count -= 1
self.put_ann(cmd_es, par_ss, ann_parameter2, ['Parameter 0x%X / %d' % (param, param), '0x%X / %d' % (param, param),'0x%X' % param]) self.put_ann(cmd_es, par_ss, ann_parameter2, ['Parameter 0x%X / %d' % (param, param), '0x%X / %d' % (param, param),'0x%X' % param])
self.reset() self.reset2()
def process_stat_bit(self, sync, bit_ss, bit_es, bit_value): def process_stat_bit(self, sync, bit_ss, bit_es, bit_value):
if self.stat_skip_bit: if self.stat_skip_bit: