aboutsummaryrefslogtreecommitdiffstats
path: root/src/etianalyse.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/etianalyse.cpp')
-rw-r--r--src/etianalyse.cpp90
1 files changed, 89 insertions, 1 deletions
diff --git a/src/etianalyse.cpp b/src/etianalyse.cpp
index efb614a..4a99e5e 100644
--- a/src/etianalyse.cpp
+++ b/src/etianalyse.cpp
@@ -91,6 +91,15 @@ static void print_fig_result(const fig_result_t& fig_result, const display_setti
}
}
+void ETI_Analyser::analyse()
+{
+ if (config.etifd != nullptr) {
+ return eti_analyse();
+ }
+ else if (config.ficfd != nullptr) {
+ return fic_analyse();
+ }
+}
void ETI_Analyser::eti_analyse()
{
@@ -427,6 +436,7 @@ void ETI_Analyser::eti_analyse()
printvalue("FIG Length", 1, "FIC length in bytes", to_string(ficl*4));
printvalue("FIC", 1);
fib = p + 12 + 4*nst;
+
for (int i = 0; i < ficl*4/32; i++) {
printsequencestart(2);
printvalue("FIB", 3, "", to_string(i));
@@ -444,7 +454,8 @@ void ETI_Analyser::eti_analyse()
if (crccorrect)
printvalue("CRC", 3, "", "OK");
else {
- printvalue("CRC", 3, "", strprintf("Mismatch: %02x", i, crc));
+ printvalue("CRC", 3, "",
+ strprintf("Mismatch: %04x %04x", crc, figcrc));
}
printvalue("FIGs", 3);
@@ -640,6 +651,83 @@ void ETI_Analyser::eti_analyse()
figs_cleardb();
}
+void ETI_Analyser::fic_analyse()
+{
+ if (config.analyse_fig_rates) {
+ rate_display_header(config.analyse_fig_rates_per_second);
+ }
+
+ FILE *stat_fd = nullptr;
+ if (not config.statistics_filename.empty()) {
+ stat_fd = fopen(config.statistics_filename.c_str(), "w");
+ if (stat_fd == nullptr) {
+ fprintf(stderr, "Could not open statistics file: %s\n",
+ strerror(errno));
+ return;
+ }
+ }
+
+ bool running = true;
+ int i = 0;
+ while (running) {
+ FIGalyser figs;
+ uint8_t fib[32];
+ if (fread(fib, 32, 1, config.ficfd) == 0) {
+ break;
+ }
+
+ printsequencestart(2);
+ printvalue("FIB", 3, "", to_string(i));
+ figs.set_fib(i);
+ rate_new_fib(i);
+
+ const uint16_t figcrc = fib[30]*256 + fib[31];
+ uint16_t crc = 0xffff;
+ for (int j = 0; j < 30; j++) {
+ crc = update_crc_ccitt(crc, fib[j]);
+ }
+ crc =~ crc;
+ const bool crccorrect = (crc == figcrc);
+ if (crccorrect)
+ printvalue("CRC", 3, "", "OK");
+ else {
+ printvalue("CRC", 3, "",
+ strprintf("Mismatch: %04x %04x", crc, figcrc));
+ }
+
+ printvalue("FIGs", 3);
+
+ uint8_t *fig = fib;
+ bool endmarker = false;
+ int figcount = 0;
+ while (!endmarker) {
+ uint8_t figtype, figlen;
+ figtype = (fig[0] & 0xE0) >> 5;
+ if (figtype != 7) {
+ figlen = fig[0] & 0x1F;
+
+ printsequencestart(4);
+ decodeFIG(config, figs, fig+1, figlen, figtype, 5, crccorrect);
+ fig += figlen + 1;
+ figcount += figlen + 1;
+ if (figcount >= 29)
+ endmarker = true;
+ }
+ else {
+ endmarker = true;
+ }
+ }
+
+ if (quit.load()) running = false;
+
+ if (config.analyse_fic_carousel) {
+ figs.analyse(1);
+ }
+
+ i = (i+1) % 3;
+ }
+}
+
void ETI_Analyser::decodeFIG(
const eti_analyse_config_t &config,
FIGalyser &figs,