initial commit
This commit is contained in:
71
include/bus_monitor.hpp
Normal file
71
include/bus_monitor.hpp
Normal 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_;
|
||||
};
|
||||
Reference in New Issue
Block a user