From 373c377b3593084bc9d56e4da9ef22bb3d184f19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Millet?= Date: Tue, 1 Nov 2022 09:54:31 +0100 Subject: [PATCH] Adds simul directory - Also fixes a possible bug in test.ino where a variable could be used without being set. --- Makefile | 2 + extras/testplan/simul/2codes-1.txt | 68 ++++++++ extras/testplan/simul/Makefile | 22 +++ extras/testplan/simul/am2 | 1 + extras/testplan/simul/esp32-1.txt | 52 +++++++ extras/testplan/simul/fichier | 19 +++ extras/testplan/simul/parktronic-1.txt | 54 +++++++ extras/testplan/simul/parktronic-2.txt | 42 +++++ extras/testplan/simul/simul.ino | 208 +++++++++++++++++++++++++ extras/testplan/simul/simul.sh | 42 +++++ extras/testplan/test/test.ino | 2 +- 11 files changed, 511 insertions(+), 1 deletion(-) create mode 100644 extras/testplan/simul/2codes-1.txt create mode 100644 extras/testplan/simul/Makefile create mode 120000 extras/testplan/simul/am2 create mode 100644 extras/testplan/simul/esp32-1.txt create mode 100644 extras/testplan/simul/fichier create mode 100644 extras/testplan/simul/parktronic-1.txt create mode 100644 extras/testplan/simul/parktronic-2.txt create mode 100644 extras/testplan/simul/simul.ino create mode 100755 extras/testplan/simul/simul.sh diff --git a/Makefile b/Makefile index 5780663..6113879 100644 --- a/Makefile +++ b/Makefile @@ -7,6 +7,7 @@ clean: make -C examples/04_react_on_code/ $@ make -C examples/05_callback/ $@ make -C extras/testplan/test/ $@ + make -C extras/testplan/simul/ $@ mrproper: make -C examples/01_main/ $@ @@ -15,4 +16,5 @@ mrproper: make -C examples/04_react_on_code/ $@ make -C examples/05_callback/ $@ make -C extras/testplan/test/ $@ + make -C extras/testplan/simul/ $@ diff --git a/extras/testplan/simul/2codes-1.txt b/extras/testplan/simul/2codes-1.txt new file mode 100644 index 0000000..706abdc --- /dev/null +++ b/extras/testplan/simul/2codes-1.txt @@ -0,0 +1,68 @@ +0, 30937 +4244, 1488 +360, 720 +360, 720 +724, 360 +360, 720 +360, 720 +360, 720 +720, 360 +360, 724 +720, 360 +720, 360 +720, 360 +720, 364 +360, 724 +720, 364 +360, 724 +720, 364 +356, 724 +720, 360 +356, 724 +360, 724 +720, 364 +356, 724 +356, 724 +360, 728 +356, 724 +360, 724 +356, 724 +356, 724 +356, 724 +720, 364 +356, 724 +720, 364 +356, 724 +716, 364 +356, 724 +716, 364 +356, 724 +720, 364 +356, 728 +716, 7844 +4840, 1500 +356, 728 +356, 728 +716, 364 +356, 720 +356, 728 +356, 728 +716, 368 +356, 728 +716, 364 +716, 368 +712, 368 +716, 368 +352, 728 +716, 368 +352, 728 +716, 368 +352, 728 +716, 368 +352, 728 +352, 728 +716, 368 +352, 728 +352, 728 +352, 728 +352, 728 diff --git a/extras/testplan/simul/Makefile b/extras/testplan/simul/Makefile new file mode 100644 index 0000000..6c30693 --- /dev/null +++ b/extras/testplan/simul/Makefile @@ -0,0 +1,22 @@ +# This Makefile is to be symbolic-linked inside subfolders. +# It is generic enough that, to the asumption the subfolder contains one .ino +# file and only one, it'll work as expected. + +source = $(wildcard *.ino) +target = build/$(source).with_bootloader.hex +opt = -t 3 + +ALL: $(target) + +$(target): $(source) +ifdef color + ./am2 $(opt) $< +else + GCC_COLORS="" ./am2 --no-color $(opt) $< +endif + +clean: + rm -rf build + +mrproper: + rm -rf build out diff --git a/extras/testplan/simul/am2 b/extras/testplan/simul/am2 new file mode 120000 index 0000000..3149a53 --- /dev/null +++ b/extras/testplan/simul/am2 @@ -0,0 +1 @@ +../../../am2 \ No newline at end of file diff --git a/extras/testplan/simul/esp32-1.txt b/extras/testplan/simul/esp32-1.txt new file mode 100644 index 0000000..87b28cb --- /dev/null +++ b/extras/testplan/simul/esp32-1.txt @@ -0,0 +1,52 @@ +0, 14100, +480, 1344, +1340, 484, +480, 1348, +1388, 484, +484, 1348, +504, 1344, +1344, 480, +1364, 508, +1348, 480, +484, 1348, +1388, 480, +1372, 476, +1364, 480, +1324, 484, +476, 1352, +1332, 508, +456, 1348, +456, 1348, +456, 1344, +504, 1348, +1340, 484, +1360, 484, +1368, 480, +484, 1348, +460, 14048, +480, 1344, +1388, 480, +484, 1348, +1348, 480, +476, 1348, +460, 1340, +1340, 480, +1364, 508, +1344, 480, +484, 1348, +1388, 480, +1372, 484, +1360, 480, +1328, 480, +480, 1344, +1340, 508, +456, 1348, +456, 1344, +460, 1340, +504, 1348, +1340, 484, +1360, 484, +1316, 480, +444, 1340, +468, 14096, +476, 1348, diff --git a/extras/testplan/simul/fichier b/extras/testplan/simul/fichier new file mode 100644 index 0000000..fb54d96 --- /dev/null +++ b/extras/testplan/simul/fichier @@ -0,0 +1,19 @@ + +-----CODE START----- +// [WRITE THE DEVICE NAME HERE] +rf.register_Receiver( + RFMOD_TRIBIT, // mod + 29696, // initseq + 4224, // lo_prefix + 1488, // hi_prefix + 0, // first_lo_ign + 352, // lo_short + 720, // lo_long + 0, // hi_short (0 => take lo_short) + 0, // hi_long (0 => take lo_long) + 704, // lo_last + 7808, // sep + 39 // nb_bits +); +-----CODE END----- + diff --git a/extras/testplan/simul/parktronic-1.txt b/extras/testplan/simul/parktronic-1.txt new file mode 100644 index 0000000..aa3751f --- /dev/null +++ b/extras/testplan/simul/parktronic-1.txt @@ -0,0 +1,54 @@ +0, 30000 +356, 360 +356, 360 +356, 360 +356, 360 +352, 360 +352, 360 +352, 360 +356, 360 +352, 360 +356, 3236 +0, 3236 +356, 356 +356, 716 +364, 352 +360, 352 +716, 360 +352, 712 +364, 352 +716, 360 +352, 376 +340, 360 +352, 716 +716, 712 +364, 352 +364, 352 +360, 352 +364, 352 +364, 352 +712, 364 +352, 716 +360, 352 +364, 352 +716, 712 +716, 716 +712, 720 +360, 352 +364, 352 +364, 352 +360, 352 +716, 716 +360, 352 +716, 716 +712, 716 +716, 712 +716, 716 +712, 716 +716, 360 +352, 372 +344, 712 +716, 716 +712, 716 +1076,30000 + diff --git a/extras/testplan/simul/parktronic-2.txt b/extras/testplan/simul/parktronic-2.txt new file mode 100644 index 0000000..afb031f --- /dev/null +++ b/extras/testplan/simul/parktronic-2.txt @@ -0,0 +1,42 @@ +0, 3236 +356, 356 +356, 716 +364, 352 +360, 352 +716, 360 +352, 712 +364, 352 +716, 360 +352, 376 +340, 360 +352, 716 +716, 712 +364, 352 +364, 352 +360, 352 +364, 352 +364, 352 +712, 364 +352, 716 +360, 352 +364, 352 +716, 712 +716, 716 +712, 720 +360, 352 +364, 352 +364, 352 +360, 352 +716, 716 +360, 352 +716, 716 +712, 716 +716, 712 +716, 716 +712, 716 +716, 360 +352, 372 +344, 712 +716, 716 +712, 716 +1076, 30000 diff --git a/extras/testplan/simul/simul.ino b/extras/testplan/simul/simul.ino new file mode 100644 index 0000000..fa00c74 --- /dev/null +++ b/extras/testplan/simul/simul.ino @@ -0,0 +1,208 @@ +// simul.ino + +// Perform RF433any library test plan + +/* + Copyright 2021 Sébastien Millet + + `RF433any' is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + `RF433any' is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this program. If not, see + . +*/ + +// +// Schematic: see RF433any library +// + +#define PIN_RFINPUT 2 + +#include "RF433any.h" +#include "RF433Serial.h" +#include + +extern uint16_t sim_timings_count; +extern unsigned int counter; +extern unsigned int sim_int_count; +extern char buffer[RF433SERIAL_LINE_BUF_LEN]; +extern RF433SerialLine sl; +extern duration_t sim_timings[SIM_TIMINGS_LEN]; + +#define ASSERT_OUTPUT_TO_SERIAL + +#define assert(cond) { \ + if (!(cond)) { \ + assert_failed(__LINE__); \ + } \ +} + +static void assert_failed(int line) { +#ifdef ASSERT_OUTPUT_TO_SERIAL + Serial.print("\ntest.ino:"); + Serial.print(line); + Serial.println(": assertion failed, aborted."); +#endif + while (1) + ; +} + +char serial_printf_buffer[100]; +void serial_printf(const char* msg, ...) + __attribute__((format(printf, 1, 2))); + + // NOTE + // Assume Serial has been initialized (Serial.begin(...)) +void serial_printf(const char* msg, ...) { + va_list args; + + va_start(args, msg); + + vsnprintf(serial_printf_buffer, sizeof(serial_printf_buffer), msg, args); + va_end(args); + Serial.print(serial_printf_buffer); +} + +void setup() { + pinMode(PIN_RFINPUT, INPUT); + Serial.begin(115200); +} + +Track track(PIN_RFINPUT); + +void read_simulated_timings_from_usb() { + sim_timings_count = 0; + sim_int_count = 0; + counter = 0; + buffer[0] = '\0'; + for ( ; + strcmp(buffer, "."); + sl.get_line_blocking(buffer, sizeof(buffer)) + ) { + + if (!strlen(buffer)) + continue; + + char *p = buffer; + while (*p != ',' && *p != '\0') + ++p; + if (*p != ',') { + dbg("FATAL: each line must have a ',' character!"); + assert(false); + } + + *p = '\0'; + unsigned int l = atoi(buffer); + unsigned int h = atoi(p + 1); + + if (sim_timings_count >= + sizeof(sim_timings) / sizeof(*sim_timings) - 1) { + dbg("FATAL: timings buffer full!"); + assert(false); + } + + sim_timings[sim_timings_count++] = compact(l); + sim_timings[sim_timings_count++] = compact(h); + } +} + +#if RF433ANY_TESTPLAN == 5 +void output_decoder(Decoder *pdec) { + while (pdec) { + dbgf("Decoded: %s, err: %d, code: %c, " + "rep: %d, bits: %2d", + (pdec->data_got_decoded() ? "yes" : "no "), + pdec->get_nb_errors(), pdec->get_id_letter(), + pdec->get_repeats() + 1, pdec->get_nb_bits()); + + if (pdec->data_got_decoded()) { + Serial.print(" Data: "); + if (pdec->get_pdata()) { + char *buf = pdec->get_pdata()->to_str(); + if (buf) { + Serial.print(buf); + free(buf); + } + } + Serial.print("\n"); + } + pdec = pdec->get_next(); + } +} +#endif + +const char *encoding_names[] = { + "RFMOD_TRIBIT", // T + "RFMOD_TRIBIT_INVERTED", // N + "RFMOD_MANCHESTER", // M + "" // Anything else +}; + +const char *id_letter_to_encoding_name(char c) { + if (c == 'T') + return encoding_names[0]; + else if (c == 'N') + return encoding_names[1]; + else if (c == 'M') + return encoding_names[2]; + + return encoding_names[3]; +} + +void output_timings(Decoder *pdec, byte nb_bits) { + TimingsExt tsext; + if (!pdec) + return; + pdec->get_tsext(&tsext); + + const char *enc_name = id_letter_to_encoding_name(pdec->get_id_letter()); + + dbg("\n-----CODE START-----"); + dbg("// [WRITE THE DEVICE NAME HERE]\n" + "rf.register_Receiver("); + dbgf("\t%s, // mod", enc_name); + dbgf("\t%u, // initseq", tsext.initseq); + dbgf("\t%u, // lo_prefix", tsext.first_low); + dbgf("\t%u, // hi_prefix", tsext.first_high); + dbgf("\t%u, // first_lo_ign", tsext.first_low_ignored); + dbgf("\t%u, // lo_short", tsext.low_short); + dbgf("\t%u, // lo_long", tsext.low_long); + dbgf("\t%u, // hi_short (0 => take lo_short)", tsext.high_short); + dbgf("\t%u, // hi_long (0 => take lo_long)", tsext.high_long); + dbgf("\t%u, // lo_last", tsext.last_low); + dbgf("\t%u, // sep", tsext.sep); + dbgf("\t%u // nb_bits", nb_bits); + dbg(");"); + dbg("-----CODE END-----\n"); +} + +void loop() { + if (sim_int_count >= sim_timings_count) + read_simulated_timings_from_usb(); + + ++counter; + + track.treset(); + while (track.get_trk() != TRK_DATA && sim_int_count <= sim_timings_count) { + Track::ih_handle_interrupt(); + track.do_events(); + } + track.force_stop_recv(); + + Decoder *pdec = track.get_data(0); + if (pdec) { + int nb_bits = pdec->get_nb_bits(); + output_timings(pdec, nb_bits); + delete pdec; + } +} + +// vim: ts=4:sw=4:tw=80:et diff --git a/extras/testplan/simul/simul.sh b/extras/testplan/simul/simul.sh new file mode 100755 index 0000000..2ff04f8 --- /dev/null +++ b/extras/testplan/simul/simul.sh @@ -0,0 +1,42 @@ +#!/usr/bin/bash + +set -euo pipefail + +PORT=/dev/ttyUSB0 +INP_FILE=${1:-} + +if [ "${INP_FILE}" == "" ]; then + echo "Usage:" + echo " ./simul.sh code_file" + echo + echo "You have to update the variable PORT defined at the" + echo "beginning of this script. At the moment it is:" + echo "${PORT}" + echo + echo "code_file contains lines of timings in the form" + echo "low_duration,high_duration" + echo "For example:" + echo "0,10000" + echo "300,500" + echo "300,500" + echo "500,300" + echo "300,5000" + exit 1 +fi + +./am2 -t 3 simul.ino -u +stty -F "${PORT}" -hupcl -echo 115200 +cat "${PORT}" & + +sleep 1 + +cat "${INP_FILE}" > "${PORT}" +echo "." > "${PORT}" + +sleep 1 + +# From +# https://unix.stackexchange.com/questions/43527/kill-all-background-jobs +kill $(jobs -p) + +exit 0 diff --git a/extras/testplan/test/test.ino b/extras/testplan/test/test.ino index ae90ea5..1d3b1fa 100644 --- a/extras/testplan/test/test.ino +++ b/extras/testplan/test/test.ino @@ -39,7 +39,7 @@ extern duration_t sim_timings[SIM_TIMINGS_LEN]; extern unsigned int sim_int_count_svg; bool filter_mask_set; -uint16_t filter_mask; +uint16_t filter_mask = 0; #define ASSERT_OUTPUT_TO_SERIAL