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