aboutsummaryrefslogtreecommitdiffstats
path: root/src/test
diff options
context:
space:
mode:
Diffstat (limited to 'src/test')
-rw-r--r--src/test/Makefile.am48
-rw-r--r--src/test/dummy.c9
-rw-r--r--src/test/test_compandor.c3
-rw-r--r--src/test/test_dms.c23
-rw-r--r--src/test/test_dtmf.c9
-rw-r--r--src/test/test_emphasis.c2
-rw-r--r--src/test/test_filter.c63
-rw-r--r--src/test/test_goertzel.c51
-rw-r--r--src/test/test_performance.c2
-rw-r--r--src/test/test_sms.c29
-rw-r--r--src/test/test_v27scrambler.c133
11 files changed, 329 insertions, 43 deletions
diff --git a/src/test/Makefile.am b/src/test/Makefile.am
index dd65ec6..e37d9bf 100644
--- a/src/test/Makefile.am
+++ b/src/test/Makefile.am
@@ -1,22 +1,27 @@
-AM_CPPFLAGS = -Wall -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
noinst_PROGRAMS = \
test_filter \
test_sendevolumenregler \
test_compandor \
test_emphasis \
+ test_goertzel \
test_dtmf \
test_dms \
test_sms \
test_performance \
- test_hagelbarger
+ test_hagelbarger \
+ test_v27scrambler
test_filter_SOURCES = test_filter.c dummy.c
test_filter_LDADD = \
$(COMMON_LA) \
- $(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libfilter/libfilter.a \
+ $(top_builddir)/src/liboptions/liboptions.a \
+ $(top_builddir)/src/liblogging/liblogging.a \
+ $(LIBOSMOCC_LIBS) \
+ $(LIBOSMOCORE_LIBS) \
-lm
test_sendevolumenregler_SOURCES = test_sendevolumenregler.c
@@ -37,9 +42,12 @@ test_emphasis_SOURCES = test_emphasis.c dummy.c
test_emphasis_LDADD = \
$(COMMON_LA) \
- $(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libemphasis/libemphasis.a \
$(top_builddir)/src/libfilter/libfilter.a \
+ $(top_builddir)/src/liboptions/liboptions.a \
+ $(top_builddir)/src/liblogging/liblogging.a \
+ $(LIBOSMOCC_LIBS) \
+ $(LIBOSMOCORE_LIBS) \
-lm
test_dtmf_SOURCES = dummy.x test_dtmf.c
@@ -55,19 +63,20 @@ test_dms_SOURCES = test_dms.c dummy.c
test_dms_LDADD = \
$(COMMON_LA) \
- $(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libmobile/libmobile.a \
$(top_builddir)/src/liboptions/liboptions.a \
$(top_builddir)/src/libdisplay/libdisplay.a \
$(top_builddir)/src/nmt/libdmssms.a \
$(top_builddir)/src/libjitter/libjitter.a \
- $(top_builddir)/src/libtimer/libtimer.a \
$(top_builddir)/src/libsamplerate/libsamplerate.a \
$(top_builddir)/src/libemphasis/libemphasis.a \
$(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/libwave/libwave.a \
- $(top_builddir)/src/libmncc/libmncc.a \
$(top_builddir)/src/libsample/libsample.a \
+ $(top_builddir)/src/libaaimage/libaaimage.a \
+ $(top_builddir)/src/liblogging/liblogging.a \
+ $(LIBOSMOCORE_LIBS) \
+ $(LIBOSMOCC_LIBS) \
-lm
if HAVE_ALSA
@@ -90,19 +99,20 @@ test_sms_SOURCES = dummy.c test_sms.c
test_sms_LDADD = \
$(COMMON_LA) \
- $(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libmobile/libmobile.a \
$(top_builddir)/src/liboptions/liboptions.a \
$(top_builddir)/src/libdisplay/libdisplay.a \
$(top_builddir)/src/nmt/libdmssms.a \
$(top_builddir)/src/libjitter/libjitter.a \
- $(top_builddir)/src/libtimer/libtimer.a \
$(top_builddir)/src/libsamplerate/libsamplerate.a \
$(top_builddir)/src/libemphasis/libemphasis.a \
$(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/libwave/libwave.a \
- $(top_builddir)/src/libmncc/libmncc.a \
$(top_builddir)/src/libsample/libsample.a \
+ $(top_builddir)/src/libaaimage/libaaimage.a \
+ $(top_builddir)/src/liblogging/liblogging.a \
+ $(LIBOSMOCORE_LIBS) \
+ $(LIBOSMOCC_LIBS) \
-lm
if HAVE_ALSA
@@ -136,3 +146,21 @@ test_hagelbarger_LDADD = \
$(top_builddir)/src/libhagelbarger/libhagelbarger.a \
-lm
+test_v27scrambler_SOURCES = dummy.c test_v27scrambler.c
+
+test_v27scrambler_LDADD = \
+ $(COMMON_LA) \
+ $(top_builddir)/src/libv27/libv27.a \
+ -lm
+
+test_goertzel_SOURCES = test_goertzel.c dummy.c
+
+test_goertzel_LDADD = \
+ $(COMMON_LA) \
+ $(top_builddir)/src/libgoertzel/libgoertzel.a \
+ $(top_builddir)/src/liboptions/liboptions.a \
+ $(top_builddir)/src/liblogging/liblogging.a \
+ $(LIBOSMOCC_LIBS) \
+ $(LIBOSMOCORE_LIBS) \
+ -lm
+
diff --git a/src/test/dummy.c b/src/test/dummy.c
index 5d08d6b..ef9c8c0 100644
--- a/src/test/dummy.c
+++ b/src/test/dummy.c
@@ -1,9 +1,18 @@
+void call_down_audio(void);
void call_down_audio() { }
+void call_down_setup(void);
void call_down_setup() { }
+void call_down_release(void);
void call_down_release() { }
+void call_down_disconnect(void);
void call_down_disconnect() { }
+void call_down_answer(void);
void call_down_answer() { }
+void print_help(void);
void print_help() { }
+void sender_send(void);
void sender_send() { }
+void sender_receive(void);
void sender_receive() { }
+void dump_info(void);
void dump_info() {}
diff --git a/src/test/test_compandor.c b/src/test/test_compandor.c
index b1cd51e..f91e0b4 100644
--- a/src/test/test_compandor.c
+++ b/src/test/test_compandor.c
@@ -72,7 +72,8 @@ int main(void)
sample_t samples[SAMPLERATE * 2];
int f;
- init_compandor(&cstate, SAMPLERATE, ATTACK_MS, RECOVERY_MS);
+ compandor_init();
+ setup_compandor(&cstate, SAMPLERATE, ATTACK_MS, RECOVERY_MS);
for (f = 0; f < 3; f++) {
/* -16 and -4 dB */
diff --git a/src/test/test_dms.c b/src/test/test_dms.c
index a64bf43..e571fd9 100644
--- a/src/test/test_dms.c
+++ b/src/test/test_dms.c
@@ -5,7 +5,7 @@
#include <string.h>
#include <unistd.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../nmt/nmt.h"
extern int dms_allow_loopback;
@@ -20,7 +20,7 @@ static void assert(int condition, char *why)
}
}
-void ok(void)
+static void ok(void)
{
printf("\n OK ;->\n\n");
sleep(1);
@@ -39,7 +39,7 @@ static const uint8_t test_null[][8] = {
static char ack_bits[77];
-void dms_receive(nmt_t *nmt, const uint8_t *data, int length, int eight_bits)
+void dms_receive(nmt_t __attribute__((unused)) *nmt, const uint8_t *data, int length, int __attribute__((unused)) eight_bits)
{
printf("(getting %d digits from DMS layer)\n", length);
@@ -49,11 +49,11 @@ void dms_receive(nmt_t *nmt, const uint8_t *data, int length, int eight_bits)
check_length = length;
}
-void dms_all_sent(nmt_t *nmt)
+void dms_all_sent(nmt_t __attribute__((unused)) *nmt)
{
}
-nmt_t *alloc_nmt(void)
+static nmt_t *alloc_nmt(void)
{
nmt_t *nmt;
@@ -65,13 +65,13 @@ nmt_t *alloc_nmt(void)
return nmt;
}
-void free_nmt(nmt_t *nmt)
+static void free_nmt(nmt_t *nmt)
{
dms_cleanup_sender(nmt);
free(nmt);
}
-extern void main_mobile();
+extern void main_mobile_loop();
int main(void)
{
@@ -80,9 +80,10 @@ int main(void)
int i, j;
/* this is never called, it forces the linker to add mobile functions */
- if (debuglevel == -1000) main_mobile();
+ if (loglevel == -1000) main_mobile_loop();
- debuglevel = DEBUG_DEBUG;
+ loglevel = LOGL_DEBUG;
+ logging_init();
dms_allow_loopback = 1;
nmt = alloc_nmt();
@@ -199,7 +200,7 @@ int main(void)
ok();
- debuglevel = DEBUG_INFO;
+ loglevel = LOGL_INFO;
/* test again with pseudo random packet dropps */
srandom(0);
@@ -255,5 +256,5 @@ int main(void)
void call_down_clock(void) {}
-void print_image(void) {}
+const char *aaimage[] = { NULL };
diff --git a/src/test/test_dtmf.c b/src/test/test_dtmf.c
index 6640c59..e35ec8e 100644
--- a/src/test/test_dtmf.c
+++ b/src/test/test_dtmf.c
@@ -2,7 +2,7 @@
#include <stdint.h>
#include <math.h>
#include <string.h>
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../libsample/sample.h"
#include "../libdtmf/dtmf_decode.h"
#include "../libdtmf/dtmf_encode.h"
@@ -49,7 +49,7 @@ static void check_level(sample_t *samples, const char *desc, double target, int
static char got_digit;
-static void recv_digit(void *inst, char digit, dtmf_meas_t *meas)
+static void recv_digit(void __attribute__((unused)) *inst, char digit, dtmf_meas_t *meas)
{
printf("decoded digit '%c' frequency %.1f %.1f amplitude %.1f %.1f dB\n", digit, meas->frequency_low, meas->frequency_high, level2db(meas->amplitude_low), level2db(meas->amplitude_high));
got_digit = digit;
@@ -65,7 +65,8 @@ int main(void)
fm_init(0);
- dtmf_decode_init(&dtmf_dec, NULL, recv_digit, SAMPLERATE, db2level(0), db2level(-30.0));
+ /* decoder uses a strict frequency offset of 0.1 percent. */
+ dtmf_decode_init(&dtmf_dec, NULL, recv_digit, SAMPLERATE, db2level(0), db2level(-30.0), 0.1);
for (f = 0; f < 8; f++) {
printf("Testing filter with frequency %.0f Hz:\n", test_frequency[f]);
@@ -96,7 +97,7 @@ int main(void)
for (i = 0; i < 16; i++) {
printf("Testing digit '%c' encoding and decoding:\n", test_digits[i]);
memset(samples, 0, sizeof(samples[0]) * SAMPLERATE);
- dtmf_encode_set_tone(&dtmf_enc, test_digits[i]);
+ dtmf_encode_set_tone(&dtmf_enc, test_digits[i], 1.0, 0.0);
dtmf_encode(&dtmf_enc, samples + SAMPLERATE / 10, SAMPLERATE / 20);
got_digit = 0;
dtmf_decode(&dtmf_dec, samples, SAMPLERATE);
diff --git a/src/test/test_emphasis.c b/src/test/test_emphasis.c
index aea6356..ab78ee9 100644
--- a/src/test/test_emphasis.c
+++ b/src/test/test_emphasis.c
@@ -5,7 +5,7 @@
#include "../libsample/sample.h"
#include "../libfilter/iir_filter.h"
#include "../libemphasis/emphasis.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#define level2db(level) (20 * log10(level))
#define db2level(db) pow(10, (double)db / 20.0)
diff --git a/src/test/test_filter.c b/src/test/test_filter.c
index 7b7b676..f1fe5cc 100644
--- a/src/test/test_filter.c
+++ b/src/test/test_filter.c
@@ -4,7 +4,8 @@
#include <string.h>
#include "../libsample/sample.h"
#include "../libfilter/iir_filter.h"
-#include "../libdebug/debug.h"
+#include "../libfilter/fir_filter.h"
+#include "../liblogging/logging.h"
#define level2db(level) (20 * log10(level))
#define db2level(db) pow(10, (double)db / 20.0)
@@ -40,6 +41,7 @@ int main(void)
{
iir_filter_t filter_low;
iir_filter_t filter_high;
+ fir_filter_t *fir_low/*, *fir_high*/;
sample_t samples[SAMPLERATE];
double level;
int iter = 2;
@@ -83,6 +85,25 @@ int main(void)
printf("\n");
}
+ printf("testing notch filter with %d iterations, Q = 4\n", 1);
+
+ iir_notch_init(&filter_high, 2605.0, SAMPLERATE, 1, 4);
+
+ for (i = 0; i < 4001; i += 100) {
+ gen_samples(samples, (double)i);
+ iir_process(&filter_high, samples, SAMPLERATE);
+ level = get_level(samples);
+ printf("%s%4d Hz: %.1f dB", debug_db(level), i, level2db(level));
+ if (i == 2600)
+ printf(" filter frequency (2605 Hz)\n");
+ else if (i == 2800)
+ printf(" about 200 Hz above\n");
+ else if (i == 2400)
+ printf(" about 200 Hz below\n");
+ else
+ printf("\n");
+ }
+
printf("testing band-pass filter with %d iterations\n", iter);
iir_lowpass_init(&filter_low, 2000.0, SAMPLERATE, iter);
@@ -102,6 +123,46 @@ int main(void)
printf("\n");
}
+ double freq = 2000.0;
+ double tb = 400.0;
+ printf("testing low-pass FIR filter with %.0fHz transition bandwidth\n", tb);
+
+ fir_low = fir_lowpass_init(SAMPLERATE, freq, tb);
+ printf("Using %d taps\n", fir_low->ntaps);
+
+ for (i = 0; i < 4001; i += 100) {
+ gen_samples(samples, (double)i);
+ fir_process(fir_low, samples, SAMPLERATE);
+ level = get_level(samples);
+ printf("%s%s%4d Hz: %.1f dB", debug_amplitude(level), debug_db(level), i, level2db(level));
+ if (i == freq)
+ printf(" cutoff\n");
+ else
+ printf("\n");
+ }
+ fir_exit(fir_low);
+
+#if 0
+ double freq1 = 1000.0, freq2 = 2000.0;
+ tb = 100.0;
+ printf("testing two-pass FIR filter\n");
+
+ fir_high = fir_twopass_init(SAMPLERATE, freq1, freq2, tb);
+ printf("Using %d taps\n", fir_high->ntaps);
+
+ for (i = 0; i < 4001; i += 100) {
+ gen_samples(samples, (double)i);
+ fir_process(fir_high, samples, SAMPLERATE);
+ level = get_level(samples);
+ printf("%s%s%4d Hz: %.1f dB", debug_amplitude(level), debug_db(level), i, level2db(level));
+ if (i == freq1 || i == freq2)
+ printf(" cutoff\n");
+ else
+ printf("\n");
+ }
+ fir_exit(fir_high);
+#endif
+
return 0;
}
diff --git a/src/test/test_goertzel.c b/src/test/test_goertzel.c
new file mode 100644
index 0000000..656f31e
--- /dev/null
+++ b/src/test/test_goertzel.c
@@ -0,0 +1,51 @@
+#include <stdio.h>
+#include <stdint.h>
+#include <math.h>
+#include <string.h>
+#include "../libsample/sample.h"
+#include "../libgoertzel/goertzel.h"
+#include "../liblogging/logging.h"
+
+#define level2db(level) (20 * log10(level))
+#define db2level(db) pow(10, (double)db / 20.0)
+
+#define SAMPLERATE 48000
+
+static void gen_samples(sample_t *samples, double freq)
+{
+ int i;
+ double value;
+
+ for (i = 0; i < SAMPLERATE; i++) {
+ value = cos(2.0 * M_PI * freq / (double)SAMPLERATE * (double)i);
+ samples[i] = value;
+ }
+}
+
+int num_kanal;
+
+int main(void)
+{
+ goertzel_t goertzel;
+ sample_t samples[SAMPLERATE];
+ double frequency = 1000;
+ double duration = 1.0/100.0;
+ double level;
+ double i;
+
+ printf("testing goertzel with frequency %.1f and duration 1 / %.0f\n", frequency, 1.0 / duration);
+
+ for (i = 700; i < 1301; i = i + 10) {
+ gen_samples(samples, (double)i);
+ audio_goertzel_init(&goertzel, frequency, SAMPLERATE);
+ audio_goertzel(&goertzel, samples, SAMPLERATE * duration, 0, &level, 1);
+ printf("%s%.0f Hz: %.1f dB", debug_db(level), i, level2db(level));
+ if ((int)round(i) == (int)round(frequency))
+ printf(" level=%.6f\n", level);
+ else
+ printf("\n");
+ }
+
+ return 0;
+}
+
diff --git a/src/test/test_performance.c b/src/test/test_performance.c
index a045eee..ae10930 100644
--- a/src/test/test_performance.c
+++ b/src/test/test_performance.c
@@ -6,7 +6,7 @@
#include "../libsample/sample.h"
#include "../libfilter/iir_filter.h"
#include "../libfm/fm.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
struct timeval start_tv, tv;
double duration;
diff --git a/src/test/test_sms.c b/src/test/test_sms.c
index f9f2cd2..cb3dd6a 100644
--- a/src/test/test_sms.c
+++ b/src/test/test_sms.c
@@ -5,7 +5,7 @@
#include <string.h>
#include <unistd.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../nmt/nmt.h"
static const uint8_t test_mo_sms_data1[] = {
@@ -53,7 +53,7 @@ static void assert(int condition, char *why)
}
}
-void ok(void)
+static void ok(void)
{
printf("\n OK ;->\n\n");
sleep(1);
@@ -61,7 +61,7 @@ void ok(void)
static uint8_t dms_buffer[256];
static int dms_buffer_count;
-void dms_send(nmt_t *nmt, const uint8_t *data, int length, int eight_bits)
+void dms_send(nmt_t __attribute__((unused)) *nmt, const uint8_t *data, int length, int __attribute__((unused)) eight_bits)
{
int i;
@@ -80,12 +80,12 @@ void dms_send(nmt_t *nmt, const uint8_t *data, int length, int eight_bits)
assert(!memcmp(data, test_mt_sms_data, length), "Expecting SMS binary data to match");
}
-void sms_release(nmt_t *nmt)
+void sms_release(nmt_t __attribute__((unused)) *nmt)
{
printf("(got release from SMS layer)\n");
}
-int sms_submit(nmt_t *nmt, uint8_t ref, const char *orig_address, uint8_t orig_type, uint8_t orig_plan, int msg_ref, const char *dest_address, uint8_t dest_type, uint8_t dest_plan, const char *message)
+int sms_submit(nmt_t __attribute__((unused)) *nmt, uint8_t __attribute__((unused)) ref, const char __attribute__((unused)) *orig_address, uint8_t __attribute__((unused)) orig_type, uint8_t __attribute__((unused)) orig_plan, int __attribute__((unused)) msg_ref, const char __attribute__((unused)) *dest_address, uint8_t __attribute__((unused)) dest_type, uint8_t __attribute__((unused)) dest_plan, const char *message)
{
strcpy((char *)dms_buffer, message);
dms_buffer_count = strlen(message);
@@ -93,12 +93,12 @@ int sms_submit(nmt_t *nmt, uint8_t ref, const char *orig_address, uint8_t orig_t
return 0;
}
-void sms_deliver_report(nmt_t *nmt, uint8_t ref, int error, uint8_t cause)
+void sms_deliver_report(nmt_t __attribute__((unused)) *nmt, uint8_t __attribute__((unused)) ref, int __attribute__((unused)) error, uint8_t __attribute__((unused)) cause)
{
printf("(got deliver report from SMS layer)\n");
}
-extern void main_mobile();
+extern void main_mobile_loop();
int main(void)
{
@@ -107,9 +107,10 @@ int main(void)
int rc;
/* this is never called, it forces the linker to add mobile functions */
- if (debuglevel == -1000) main_mobile();
+ if (loglevel == -1000) main_mobile_loop();
- debuglevel = DEBUG_DEBUG;
+ loglevel = LOGL_DEBUG;
+ logging_init();
nmt = calloc(sizeof(*nmt), 1);
sms_init_sender(nmt);
@@ -131,10 +132,10 @@ int main(void)
printf("(submitting SMS 7-bit encoded)\n");
dms_buffer_count = 0;
- for (i = 0; i < sizeof(test_mo_sms_data1); i++)
+ for (i = 0; i < (int)sizeof(test_mo_sms_data1); i++)
dms_receive(nmt, test_mo_sms_data1 + i, 1, 1);
- assert(dms_buffer_count == strlen(test_mo_sms_text1), "Expecting SMS text length to match");
+ assert(dms_buffer_count == (int)strlen(test_mo_sms_text1), "Expecting SMS text length to match");
assert(!memcmp(dms_buffer, test_mo_sms_text1, dms_buffer_count), "Expecting SMS text to match");
sms_cleanup_sender(nmt);
@@ -148,10 +149,10 @@ int main(void)
printf("(submitting SMS 8-bit encoded)\n");
dms_buffer_count = 0;
- for (i = 0; i < sizeof(test_mo_sms_data2); i++)
+ for (i = 0; i < (int)sizeof(test_mo_sms_data2); i++)
dms_receive(nmt, test_mo_sms_data2 + i, 1, 1);
- assert(dms_buffer_count == strlen(test_mo_sms_text2), "Expecting SMS text length to match");
+ assert(dms_buffer_count == (int)strlen(test_mo_sms_text2), "Expecting SMS text length to match");
assert(!memcmp(dms_buffer, test_mo_sms_text2, dms_buffer_count), "Expecting SMS text to match");
sms_cleanup_sender(nmt);
@@ -164,5 +165,5 @@ int main(void)
void call_down_clock(void) {}
-void print_image(void) {}
+const char *aaimage[] = { NULL };
diff --git a/src/test/test_v27scrambler.c b/src/test/test_v27scrambler.c
new file mode 100644
index 0000000..7ce9fc7
--- /dev/null
+++ b/src/test/test_v27scrambler.c
@@ -0,0 +1,133 @@
+#include "stdio.h"
+#include "stdint.h"
+#include "string.h"
+#include "../libv27/scrambler.h"
+
+static int show_bin(uint8_t *data1, uint8_t *data2, int len)
+{
+ int i, j, error = 0;;
+ uint8_t bit1, bit2;
+
+ for (i = 0; i < len; i++) {
+ printf(".");
+ for (j = 0; j < 8; j++) {
+ bit1 = (data1[i] >> j) & 1;
+ bit2 = (data2[i] >> j) & 1;
+ if (bit1 == bit2)
+ printf("%d", bit1);
+ else {
+ printf("X");
+ error++;
+ }
+ }
+ }
+
+ printf("\n");
+
+ return error;
+}
+
+static int check_repetition(uint8_t *data, int len, int repeat, int start)
+{
+ int i;
+ uint8_t b1, b2;
+
+ for (i = start; i < (len * 8 - repeat); i++) {
+ b1 = (data[i >> 3] >> (i & 7)) & 1;
+ b2 = (data[(i+repeat) >> 3] >> ((i+repeat) & 7)) & 1;
+ if (b1 != b2)
+ return i - start + repeat;
+ }
+
+ return 0;
+}
+
+int main(void)
+{
+ v27scrambler_t scram, descram;
+
+ char message[] = "Jolly Roger~~~~";
+ int len = strlen(message);
+ uint8_t data[len];
+ int ret;
+
+ printf("Message: %s\n", message);
+
+ memcpy(data, message, len);
+ show_bin(data, (uint8_t *)message, len);
+
+ v27_scrambler_init(&scram, 1, 0);
+ v27_scrambler_block(&scram, data, len);
+
+ printf("Scrambled:\n");
+ show_bin(data, data, len);
+
+ v27_scrambler_init(&descram, 1, 1);
+ v27_scrambler_block(&descram, data, len);
+
+ printf("Descramble without corruption?\n");
+
+ ret = show_bin(data, (uint8_t *)message, len);
+ if (ret) {
+ printf("Descrambling failed!\n");
+ return 1;
+ }
+ printf("Yes!\n");
+
+ printf("\n");
+
+ v27_scrambler_init(&scram, 1, 0);
+ v27_scrambler_block(&scram, data, len);
+
+ data[0] = 'B';
+ data[1] = 'U';
+ data[2] = 'G';
+
+ v27_scrambler_init(&descram, 1, 1);
+ v27_scrambler_block(&descram, data, len);
+
+ printf("Descramble with 3 bytes corruption: (should fix itself after 4 bytes)\n");
+
+ show_bin(data, (uint8_t *)message, len);
+
+ printf("\n");
+
+ printf("Descramble a scrambled sequence of 8 bit repetitions with V.27: 01111110\n");
+
+ memset(data, 0x7e, len);
+
+ v27_scrambler_init(&descram, 0, 1);
+ v27_scrambler_block(&descram, data, len);
+
+ show_bin(data, (uint8_t *)data, len);
+
+ /* note at position 6 we have no more change towards 8 bit offset */
+ ret = check_repetition(data, len, 8, 6);
+ if (ret) {
+ printf("There's is a change of repetition after %d bits after start %d, please fix!\n", ret, 6);
+ return 1;
+ }
+ printf("Repetition not detected, good!\n");
+
+ printf("\n");
+
+ printf("Descramble a scrambled sequence of 8 bit repetitions with V.27bis/ter: 01111110\n");
+
+ memset(data, 0x7e, len);
+
+ v27_scrambler_init(&descram, 1, 1);
+ v27_scrambler_block(&descram, data, len);
+
+ show_bin(data, (uint8_t *)data, len);
+
+ /* note at position 6 we have no more change towards 8 bit offset */
+ ret = check_repetition(data, len, 8, 6);
+ if (ret != 34) {
+ printf("There's is NO change of repetition after 34 bits, but after %d bits, which should not happen!\n", ret);
+ return 1;
+ }
+ printf("Repetition detected after %d bits from start %d, good!\n", ret, 6);
+
+ return 0;
+}
+