32 CHECK(
id == fake->expected_id);
33 CHECK(budget_ms == 7);
34 for (uint8_t i = 0; i <
count; ++i) {
35 for (uint8_t j = 0; j < 4; ++j)
36 CHECK(frames[i].rx[j] == 0);
39 CHECK(mode == 3 && max_hz == 20000000U &&
count == 8);
40 for (uint8_t i = 0; i <
count; ++i) {
41 CHECK(frames[i].length == 3);
42 CHECK(frames[i].tx[0] == 0xA0 + 2 * i);
43 CHECK(frames[i].tx[1] == 0 && frames[i].tx[2] == 0);
44 frames[i].
rx[1] = (uint8_t)(fake->prom[i] >> 8);
45 frames[i].
rx[2] = (uint8_t)fake->prom[i];
48 CHECK(mode == 0 && max_hz == 16000000U &&
count == 2);
49 const uint8_t status_cmd[4] = {0xC0, 0, 0, 0};
50 const uint8_t errors_cmd[4] = {0x17, 0, 0, 0};
51 CHECK(frames[0].length == 2 && frames[1].length == 4);
52 CHECK(!memcmp(frames[0].tx, status_cmd, 4));
53 CHECK(!memcmp(frames[1].tx, errors_cmd, 4));
54 frames[0].
rx[1] = fake->status[0];
55 frames[1].
rx[1] = fake->status[1];
56 frames[1].
rx[2] = (uint8_t)(fake->errors >> 8);
57 frames[1].
rx[3] = (uint8_t)fake->errors;
59 const uint8_t command[4] = {0, 0x39, 0, 0};
60 CHECK(mode == 0 && max_hz == 80000000U &&
count == 1);
61 CHECK(frames[0].length == 4 && !memcmp(frames[0].tx, command, 4));
62 frames[0].
rx[3] = fake->identity;
64 const uint8_t command[4] = {0x8F, 0, 0, 0};
65 CHECK(mode == 3 && max_hz == 10000000U &&
count == 1);
66 CHECK(frames[0].length == 2 && !memcmp(frames[0].tx, command, 4));
67 frames[0].
rx[1] = fake->identity;
98 CHECK(fake.calls == 0);
103 const uint8_t identities[] = {0x6B, 0x32, 0x04};
104 for (
unsigned i = 0; i < 3; ++i) {
105 fake.identity = identities[i];
113 fake.identity = 0xFF;
118 const uint16_t reference[8] = {0x3132, 0x3334, 0x3536, 0x3738,
119 0x3940, 0x4142, 0x4344, 0x450B};
120 memcpy(fake.prom, reference,
sizeof(reference));
123 fake.prom[7] = 0x45FB;
126 for (
unsigned word = 0; word < 7; ++word) {
127 for (
unsigned bit = 0; bit < 16; ++bit) {
128 memcpy(fake.prom, reference,
sizeof(reference));
129 fake.prom[word] ^= (uint16_t)(1U << bit);
134 memcpy(fake.prom, reference,
sizeof(reference));
138 memset(fake.prom, 0,
sizeof(fake.prom));
141 memset(fake.prom, 0xFF,
sizeof(fake.prom));
145 for (
unsigned mode = 2; mode <= 6; ++mode) {
146 fake.status[0] = fake.status[1] = (uint8_t)((mode << 4) | 4);
151 const uint8_t bad_status[] = {0, 0xFF, 0x10, 0x70, 0x26, 0x28, 0x2A};
152 for (
unsigned i = 0; i <
sizeof(bad_status); ++i) {
153 fake.status[0] = fake.status[1] = 0x24;
154 fake.status[
frame] = bad_status[i];
159 fake.status[0] = fake.status[1] = 0x24;
160 for (
unsigned bit = 0; bit < 16; ++bit) {
161 fake.errors = (uint16_t)(1U << bit);
178 fake.identity = 0x6B;
183 .probe_timeout_ms = 100,
184 .retry_interval_ms = 10,
185 .heartbeat_interval_ms = 1000,
186 .battery_interval_ms = 1000,
187 .battery_max_age_ms = 2000,
188 .callback_budget_ms = 7,
189 .tick_budget_ms = 21,
190 .probe_max_attempts = 2,
191 .publication_max_attempts = 2};
201 puts(
"Device protocol checks passed");
bool self_test_init(self_test_t *t, const self_test_config_t *config, const self_test_port_t *port, void *context, uint32_t now_ms)
static std::vector< uint8_t > frame(uint8_t hi, uint8_t lo, size_t payload_len, uint8_t fill)
One wire packet: len(4, LE) then len bytes of body, where the first 4 body bytes are ty/packet_id(2)/...
static self_test_reply_t exchange(void *context, uint16_t id, uint8_t mode, uint32_t max_hz, self_test_spi_frame_t *frames, uint8_t count, uint32_t budget_ms)