1class EchoI2CPeripheral: 2 def __init__(self, dummy): 3 self.passed = True 4 self.dummy = dummy 5 self.last_written = '""' 6 7 self.commands = { 8 1: self.echo_write, 9 2: self.echo_read, 10 3: self.record_test_result, 11 4: self.finalize_tests 12 } 13 14 def write(self, data): 15 if len(data) < 1: 16 self.dummy.Log(LogLevel.Warning, "No data received") 17 18 cmd, payload = data[0], data[1:] 19 if cmd in self.commands: 20 self.commands[cmd](payload) 21 else: 22 self.unknown_command(cmd) 23 24 def unknown_command(self, command): 25 self.dummy.Log(LogLevel.Warning, "Unknown command: {0}", command) 26 27 def echo_write(self, data): 28 self.dummy.EnqueueResponseBytes(data) 29 self.last_written = '"{}"'.format(''.join(map(chr, data))) 30 31 def echo_read(self, data): 32 pass 33 34 def record_test_result(self, data): 35 if len(data) != 1: 36 self.dummy.Log(LogLevel.Warning, "Expected 1 byte of data for command 3") 37 return 38 39 passed = data[0] == 0 40 self.passed = self.passed and passed 41 42 self.dummy.Log(LogLevel.Info, "Test {0} with message {1}", self.get_result_string(), self.last_written) 43 44 def finalize_tests(self, data): 45 self.dummy.Log(LogLevel.Info, "Test suite {0}", self.get_result_string()) 46 self.dummy.EnqueueResponseByte(int(self.passed)) 47 self.passed = True 48 49 def get_result_string(self): 50 return "passed" if self.passed else "failed" 51 52def mc_setup_echo_i2c_peripheral(path): 53 dummy = monitor.Machine[path] 54 dummy.DataReceived += EchoI2CPeripheral(dummy).write 55