Adds simul directory

- Also fixes a possible bug in test.ino where a variable could be used
  without being set.
This commit is contained in:
Sébastien Millet 2022-11-01 09:54:31 +01:00
parent 68f0d89732
commit 373c377b35
11 changed files with 511 additions and 1 deletions

View File

@ -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/ $@

View File

@ -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

View File

@ -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

1
extras/testplan/simul/am2 Symbolic link
View File

@ -0,0 +1 @@
../../../am2

View File

@ -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,

View File

@ -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-----

View File

@ -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

View File

@ -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

View File

@ -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
<https://www.gnu.org/licenses>.
*/
//
// Schematic: see RF433any library
//
#define PIN_RFINPUT 2
#include "RF433any.h"
#include "RF433Serial.h"
#include <Arduino.h>
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
"<unmanaged encoding>" // 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

42
extras/testplan/simul/simul.sh Executable file
View File

@ -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

View File

@ -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