feat: add AS status feedback for both HMI sizes with verified v2.7 release
This commit is contained in:
@@ -5,12 +5,16 @@ import os
|
||||
import time
|
||||
|
||||
|
||||
def build_payload(task, locked, ebs_normal, valid=7, sequence=0):
|
||||
def build_payload(task, locked, ebs_normal, valid=7, sequence=0, as_state=0, version=2):
|
||||
if task not in range(7) or locked not in (0, 1) or ebs_normal not in (0, 1):
|
||||
raise ValueError('task must be 0..6; locked and ebs-normal must be 0 or 1')
|
||||
if valid not in range(8) or sequence not in range(256):
|
||||
raise ValueError('valid must be 0..7 and sequence must be 0..255')
|
||||
return bytes([task, locked, ebs_normal, valid, sequence, 0, 0, 1])
|
||||
if version not in (1, 2) or as_state not in range(6):
|
||||
raise ValueError('version must be 1 or 2; as-state must be 0..5')
|
||||
if valid not in range(8 if version == 1 else 16) or sequence not in range(256):
|
||||
raise ValueError('valid must be 0..7 (v1) or 0..15 (v2); sequence must be 0..255')
|
||||
if version == 1 and as_state != 0:
|
||||
raise ValueError('v1 has no AS state; byte 5 must be zero')
|
||||
return bytes([task, locked, ebs_normal, valid, sequence, as_state, 0, version])
|
||||
|
||||
|
||||
def main():
|
||||
@@ -18,7 +22,10 @@ def main():
|
||||
parser.add_argument('--task', type=int, required=True, choices=range(7))
|
||||
parser.add_argument('--locked', type=int, required=True, choices=(0, 1))
|
||||
parser.add_argument('--ebs-normal', type=int, required=True, choices=(0, 1))
|
||||
parser.add_argument('--valid', type=int, default=7)
|
||||
parser.add_argument('--valid', type=int, help='default 15 with --as-state, otherwise 7')
|
||||
parser.add_argument('--as-state', type=int, choices=range(6),
|
||||
help='0 OFF, 1 Ready, 2 Driving, 3 Finished, 4 Emergency, 5 Manual')
|
||||
parser.add_argument('--version', type=int, choices=(1, 2), default=2)
|
||||
parser.add_argument('--sequence', type=int, default=0)
|
||||
parser.add_argument('--interface', default='pcan')
|
||||
parser.add_argument('--channel', default='PCAN_USBBUS1')
|
||||
@@ -29,7 +36,12 @@ def main():
|
||||
parser.add_argument('--dry-run', action='store_true')
|
||||
args = parser.parse_args()
|
||||
try:
|
||||
payload = build_payload(args.task, args.locked, args.ebs_normal, args.valid, args.sequence)
|
||||
if args.version == 1 and args.as_state is not None:
|
||||
raise ValueError('--as-state requires --version 2')
|
||||
valid = args.valid if args.valid is not None else (15 if args.as_state is not None else 7)
|
||||
as_state = args.as_state if args.as_state is not None else 0
|
||||
payload = build_payload(args.task, args.locked, args.ebs_normal, valid, args.sequence,
|
||||
as_state, args.version)
|
||||
except ValueError as exc:
|
||||
parser.error(str(exc))
|
||||
if not (0 < args.period <= .5 and 0 < args.duration and math.isfinite(args.duration)):
|
||||
@@ -50,7 +62,7 @@ def main():
|
||||
deadline = started
|
||||
while time.monotonic() < started + args.duration:
|
||||
payload = build_payload(args.task, args.locked, args.ebs_normal,
|
||||
args.valid, (args.sequence + count) & 255)
|
||||
valid, (args.sequence + count) & 255, as_state, args.version)
|
||||
bus.send(can.Message(arbitration_id=0x183, is_extended_id=False, data=payload), timeout=.2)
|
||||
count += 1
|
||||
deadline += args.period
|
||||
|
||||
Reference in New Issue
Block a user