修正bug
This commit is contained in:
+33
-22
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user