STAR
Cal STAR — firmware, DAQ server, and engine design
Loading...
Searching...
No Matches
fake_chip.h
Go to the documentation of this file.
1#ifndef FAKE_CHIP_H
2#define FAKE_CHIP_H
3
4#include <string.h>
5
6#include "sx1262.h"
7
8namespace radio_link {
9
10// A pretend SX1262 for tests. It keeps the chip's 256-byte buffer and IRQ
11// register in memory, answers the four commands the receive path uses, and
12// writes down every command it is given.
13class FakeChip : public SpiBus {
14public:
15 static constexpr unsigned kLogSize = 16;
16 // Status byte it replies with: chip mode RX (5), command status "data
17 // available" (2). Datasheet Rev 1.2, Table 13-76, page 95.
18 static constexpr uint8_t kStatus = 0x54;
19
21 reset();
22 }
23
24 void reset() {
25 memset(buffer_, 0, sizeof buffer_);
26 irq_ = 0;
27 packet_len_ = 0;
28 packet_start_ = 0;
29 never_ready_ = false;
31 stuck_ = false;
32 stuck_level_ = 0;
33 waits_ = 0;
34 transfers_ = 0;
35 log_len_ = 0;
36 last_len_ = 0;
37 rssi_pkt_ = 0;
38 snr_pkt_ = 0;
40 }
41
42 // Raw GetPacketStatus bytes the chip will report (datasheet units).
43 void set_packet_status(uint8_t rssi_pkt, uint8_t snr_pkt,
44 uint8_t signal_rssi_pkt) {
45 rssi_pkt_ = rssi_pkt;
46 snr_pkt_ = snr_pkt;
47 signal_rssi_pkt_ = signal_rssi_pkt;
48 }
49
50 // Pretend a packet arrived and was stored at `start`.
51 void packet_arrives(const uint8_t* bytes, uint8_t n, uint8_t start,
52 uint16_t extra_flags = 0) {
53 for (unsigned i = 0; i < n; i++) {
54 buffer_[(start + i) & 0xFF] = bytes[i];
55 }
56 packet_len_ = n;
58 irq_ = static_cast<uint16_t>(kIrqRxDone | extra_flags);
59 }
60
61 // Pretend the chip raised only these flags (no packet stored).
62 void set_irq(uint16_t flags) {
63 irq_ = flags;
64 }
65
66 // Pretend the BUSY pin never goes low.
68 never_ready_ = true;
69 }
70
71 // Reply with this status byte instead of kStatus.
72 void set_status(uint8_t status) {
73 status_ = status;
74 }
75
76 // Pretend there is no chip: MISO reads `level` on every byte.
77 void set_stuck(uint8_t level) {
78 stuck_ = true;
79 stuck_level_ = level;
80 }
81
82 uint16_t irq() const {
83 return irq_;
84 }
85 unsigned waits() const {
86 return waits_;
87 }
88 unsigned transfers() const {
89 return transfers_;
90 }
91 unsigned commands_logged() const {
92 return log_len_;
93 }
94 uint8_t command_at(unsigned i) const {
95 return log_[i];
96 }
97 // Bytes of the most recent command (up to kLastSize of them).
98 static constexpr unsigned kLastSize = 8;
99 unsigned last_len() const {
100 return last_len_;
101 }
102 uint8_t last_byte(unsigned i) const {
103 return last_[i];
104 }
105
106 bool wait_busy() override {
107 waits_++;
108 return !never_ready_;
109 }
110
111 void transfer(const uint8_t* tx, uint8_t* rx, uint16_t len) override {
112 transfers_++;
113 last_len_ = len < kLastSize ? len : kLastSize;
114 memcpy(last_, tx, last_len_);
115 if (log_len_ < kLogSize) {
116 log_[log_len_++] = tx[0];
117 }
118 if (stuck_) {
119 memset(rx, stuck_level_, len);
120 return;
121 }
122 memset(rx, 0xEE, len); // junk, so tests catch reads of the wrong byte
123 switch (tx[0]) {
124 case kOpGetIrqStatus:
125 rx[1] = status_;
126 rx[2] = static_cast<uint8_t>(irq_ >> 8);
127 rx[3] = static_cast<uint8_t>(irq_ & 0xFF);
128 break;
130 rx[1] = status_;
131 rx[2] = packet_len_;
132 rx[3] = packet_start_;
133 break;
134 case kOpReadBuffer:
135 rx[1] = status_;
136 rx[2] = status_;
137 for (unsigned i = 3; i < len; i++) {
138 rx[i] = buffer_[(tx[1] + (i - 3)) & 0xFF];
139 }
140 break;
142 rx[1] = status_;
143 rx[2] = rssi_pkt_;
144 rx[3] = snr_pkt_;
145 rx[4] = signal_rssi_pkt_;
146 break;
148 irq_ = static_cast<uint16_t>(
149 irq_ & ~static_cast<uint16_t>((tx[1] << 8) | tx[2]));
150 break;
151 default:
152 break;
153 }
154 }
155
156private:
157 uint8_t buffer_[256];
158 uint16_t irq_;
159 uint8_t packet_len_;
162 uint8_t status_;
163 bool stuck_;
165 unsigned waits_;
166 unsigned transfers_;
167 uint8_t log_[kLogSize];
168 unsigned log_len_;
169 uint8_t last_[kLastSize];
170 unsigned last_len_;
171 uint8_t rssi_pkt_;
172 uint8_t snr_pkt_;
174};
175
176} // namespace radio_link
177
178#endif // FAKE_CHIP_H
static void start(gnss_frame_parser_t *p, uint8_t byte)
Definition gnss_frame.c:45
*brief user defined string literal for JSON values *sa std::size_t n
Definition json.hpp:24474