From 8ef966aa21f58c867a9dd8b60108e489c1dc2f8f Mon Sep 17 00:00:00 2001 From: Andreas Eversberg Date: Fri, 7 Oct 2016 08:00:34 +0200 Subject: [PATCH] C-Netz: Reset FSK decoder when switching channel mode This prevents corrupt frames, as well as clear pending frames that were received during the old mode, but may not be received during the new mode. --- src/cnetz/dsp.c | 2 ++ src/cnetz/fsk_fm_demod.c | 5 +++++ src/cnetz/fsk_fm_demod.h | 1 + 3 files changed, 8 insertions(+) diff --git a/src/cnetz/dsp.c b/src/cnetz/dsp.c index d9c92ca..5cea636 100644 --- a/src/cnetz/dsp.c +++ b/src/cnetz/dsp.c @@ -855,6 +855,8 @@ void cnetz_set_dsp_mode(cnetz_t *cnetz, enum dsp_mode mode) { PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "DSP mode %d -> %d\n", cnetz->dsp_mode, mode); cnetz->dsp_mode = mode; + /* we must get rid of partly received frame */ + fsk_demod_reset(&cnetz->fsk_demod); } void cnetz_set_sched_dsp_mode(cnetz_t *cnetz, enum dsp_mode mode, int frames_ahead) diff --git a/src/cnetz/fsk_fm_demod.c b/src/cnetz/fsk_fm_demod.c index 50d5fcd..92896e3 100644 --- a/src/cnetz/fsk_fm_demod.c +++ b/src/cnetz/fsk_fm_demod.c @@ -501,3 +501,8 @@ void fsk_correct_sync(cnetz_t *cnetz, double offset) bit_time = fmod(bit_time - offset + BITS_PER_SUPERFRAME, BITS_PER_SUPERFRAME); } +void fsk_demod_reset(fsk_fm_demod_t *fsk) +{ + fsk->sync = FSK_SYNC_NONE; +} + diff --git a/src/cnetz/fsk_fm_demod.h b/src/cnetz/fsk_fm_demod.h index abc8663..50d5579 100644 --- a/src/cnetz/fsk_fm_demod.h +++ b/src/cnetz/fsk_fm_demod.h @@ -53,4 +53,5 @@ typedef struct fsk_fm_demod { int fsk_fm_init(fsk_fm_demod_t *fsk, cnetz_t *cnetz, int samplerate, double bitrate); void fsk_fm_demod(fsk_fm_demod_t *fsk, int16_t *samples, int length); void fsk_correct_sync(cnetz_t *cnetz, double offset); +void fsk_demod_reset(fsk_fm_demod_t *fsk);