from pathlib import Path
import struct,json,sys,math
FORMAT='<15I5f'
KEYS=['magic','abi','epoch','status','core_hz','cpacr','dwt_ctrl','steps','locked_steps','observer_max_cycles','foc_max_cycles','combined_max_cycles','calculation_budget_exceeded','synthetic_source','motor_run_permission','last_rpm','last_angle_error','last_duty_a','last_duty_b','last_duty_c']
def decode(data):
 if len(data)!=80:raise ValueError('expected exactly 80 bytes')
 r=dict(zip(KEYS,struct.unpack(FORMAT,data)))
 if r['magic']!=0x41313030 or r['abi']!=1:raise ValueError('unknown ABI')
 if r['epoch']&1 or r['status']!=2:raise ValueError('incomplete or failed capture')
 if r['core_hz']!=128000000 or r['cpacr']&0x00f00000!=0x00f00000 or not r['dwt_ctrl']&1:raise ValueError('clock/FPU/counter mismatch')
 if r['steps']!=80000 or not 0<r['locked_steps']<=r['steps']:raise ValueError('synthetic workload incomplete')
 if r['synthetic_source']!=1 or r['motor_run_permission']!=0:raise ValueError('diagnostic source/permission mismatch')
 if not 0<r['observer_max_cycles']<=r['combined_max_cycles'] or not 0<r['foc_max_cycles']<=r['combined_max_cycles']:raise ValueError('invalid cycle data')
 if r['calculation_budget_exceeded']!=int(r['combined_max_cycles']>6400):raise ValueError('budget flag mismatch')
 if not all(math.isfinite(r[k]) for k in KEYS[15:]):raise ValueError('nonfinite result')
 if not all(0<=r[k]<=1 for k in KEYS[17:]):raise ValueError('invalid mathematical duties')
 r.update(status_scope='RECORD_CONSISTENT_SOURCE_NOT_AUTHENTICATED',calculation_max_us=r['combined_max_cycles']/128.0,isolated_calculation_within_50us=r['combined_max_cycles']<=6400,physical_execution_verified=False,full_control_path_budget_verified=False,physical_motor_calibration_verified=False,product_effect_verified=False,motor_run_permission=False)
 return r
if __name__=='__main__':print(json.dumps(decode(Path(sys.argv[1]).read_bytes()),indent=2))
