fwt_software/include/fgc/DiagParser.h

52 lines
1.6 KiB
C++

#pragma once
#include <string>
#include <vector>
namespace fgc {
// Structured decode of the firmware DIAG output stream. The firmware emits
// (interleaved with periodic ST lines), per axis:
// DG BEGIN <Y|P>
// DG <Y|P> S<speed> <FWD|REV> ERR_PEAK n ERR_RMS n ERR_STILL n
// CS_MIN n CS_MAX n SG_MIN n PWM_AVG n FLAGS 0x.. <PASS|FAIL> (x6)
// DG <Y|P> RESULT <PASS|FAIL>
// ... and finally: DG DONE
// Pure (no I/O); mirrors DumpParser so it can be unit-tested in fgc_core.
struct DiagTest {
int speed = 0; // S<speed>
bool fwd = true; // FWD vs REV
long err_peak = 0; // encoder following error (counts); -1 = no encoder
long err_rms = 0;
long err_still = 0;
int cs_min = 0, cs_max = 0;
int sg_min = 0;
int pwm_avg = 0;
unsigned flags = 0; // fault bitmask
bool pass = false;
};
struct DiagAxis {
char axis = '?'; // 'Y' / 'P'
bool has_result = false;
bool pass = false; // axis RESULT
std::vector<DiagTest> tests;
};
struct DiagResult {
bool valid = false; // at least one well-formed DG line
bool done = false; // saw "DG DONE"
std::vector<DiagAxis> axes;
bool allPass() const; // every axis with a result passed (and >=1 axis)
};
// Parse a captured DG block (only "DG ..." lines matter; other lines are ignored).
DiagResult parseDiag(const std::string& block);
// Human-readable summary lines for a decoded diag.
std::vector<std::string> formatDiag(const DiagResult& d);
} // namespace fgc