initial commit

This commit is contained in:
Tony
2026-03-26 12:04:08 +08:00
commit 7e8ac7f566
31 changed files with 4304 additions and 0 deletions

71
include/bus_monitor.hpp Normal file
View File

@@ -0,0 +1,71 @@
#pragma once
#include "decode.hpp"
#include <cstdint>
#include <functional>
#include <vector>
enum class BusDir { front, back };
struct BusFrame {
BusDir dir = BusDir::front;
int proto = 0x10;
int b1 = 0;
int b2 = 0;
};
class BusMonitor {
public:
static BusMonitor& I() {
static BusMonitor inst;
return inst;
}
void setResponseWindowMs(int ms) { decoder.responseWindowMs = ms; }
void setRawSink(std::function<void(const BusFrame&)> sink) { rawSink_ = std::move(sink); }
void setDecodedSink(std::function<void(const DecodedRecord&)> sink) { decodedSink_ = std::move(sink); }
void emitFront(int proto, int addr, int cmd) {
BusFrame f{BusDir::front, proto, addr & 0xFF, cmd & 0xFF};
rawFrames.push_back(f);
if (rawSink_) rawSink_(f);
auto rec = decoder.decode(addr & 0xFF, cmd & 0xFF, proto);
records.push_back(rec);
if (decodedSink_) decodedSink_(rec);
}
void emitBack(int value, int prefix = 0xFF) {
BusFrame f{BusDir::back, 0xFF, prefix & 0xFF, value & 0xFF};
rawFrames.push_back(f);
if (rawSink_) rawSink_(f);
auto rec = decoder.decodeCmdResponse(value & 0xFF, prefix & 0xFF);
records.push_back(rec);
if (decodedSink_) decodedSink_(rec);
}
void clear() {
rawFrames.clear();
records.clear();
}
void dispose() {
rawFrames.clear();
records.clear();
rawSink_ = nullptr;
decodedSink_ = nullptr;
}
DaliDecode decoder;
std::vector<BusFrame> rawFrames;
std::vector<DecodedRecord> records;
private:
BusMonitor() = default;
std::function<void(const BusFrame&)> rawSink_;
std::function<void(const DecodedRecord&)> decodedSink_;
};