diff options
author | Andreas Eversberg <jolly@eversberg.eu> | 2020-06-01 21:07:49 +0200 |
---|---|---|
committer | Andreas Eversberg <jolly@eversberg.eu> | 2020-10-29 07:35:50 +0100 |
commit | 7189984bbbe0f44888d3cdbc2b68199b1d3714c7 (patch) | |
tree | 78da76ba347c98acbf2e65aea38f0c3d8a917eeb /src/cnetz/dsp.c | |
parent | a98b05beb02ddf3184b513bf1fda91ad1a70945c (diff) |
C-Netz: At correct timeslot switch channel mode
Without this, the first BQ(K) message came to early, so that BSA 51
released when receiving ZFZ(K) one frame too early.
Diffstat (limited to 'src/cnetz/dsp.c')
-rw-r--r-- | src/cnetz/dsp.c | 67 |
1 files changed, 37 insertions, 30 deletions
diff --git a/src/cnetz/dsp.c b/src/cnetz/dsp.c index 91f967c..ecf26a4 100644 --- a/src/cnetz/dsp.c +++ b/src/cnetz/dsp.c @@ -54,6 +54,27 @@ scrambler_t scrambler_test_scrambler1; scrambler_t scrambler_test_scrambler2; #endif +const char *cnetz_dsp_mode_name(enum dsp_mode mode) +{ + static char invalid[16]; + + switch (mode) { + case DSP_SCHED_NONE: + return "SCHED_NONE"; + case DSP_MODE_OFF: + return "OFF"; + case DSP_MODE_OGK: + return "OGK"; + case DSP_MODE_SPK_K: + return "SPK_K"; + case DSP_MODE_SPK_V: + return "SPK_V"; + } + + sprintf(invalid, "invalid(%d)", mode); + return invalid; +} + static sample_t ramp_up[256], ramp_down[256]; void dsp_init(void) @@ -166,6 +187,8 @@ int dsp_init_sender(cnetz_t *cnetz, int measure_speed, double clock_speed[2], en scrambler_setup(&scrambler_test_scrambler2, cnetz->sender.samplerate); #endif + cnetz->sched_dsp_mode_ts = -1; + return 0; error: @@ -636,10 +659,11 @@ again: } /* switch to speech channel */ - if (cnetz->sched_switch_mode && cnetz->sched_r_m == 0) { - if (--cnetz->sched_switch_mode == 0) { + if (cnetz->sched_dsp_mode_ts >= 0 && cnetz->sched_r_m == 0) { + if (cnetz->sched_dsp_mode_ts == cnetz->sched_ts) { /* OgK / SpK(K) / SpK(V) */ - PDEBUG_CHAN(DDSP, DEBUG_INFO, "Switching channel (mode)\n"); + PDEBUG_CHAN(DDSP, DEBUG_INFO, "Now switchting channel mode to %s at timeslot %d\n", cnetz_dsp_mode_name(cnetz->sched_dsp_mode), cnetz->sched_dsp_mode_ts); + cnetz->sched_dsp_mode_ts = -1; cnetz_set_dsp_mode(cnetz, cnetz->sched_dsp_mode); } } @@ -843,39 +867,22 @@ void unshrink_speech(cnetz_t *cnetz, sample_t *speech_buffer, int count) cnetz->sender.rxbuf_pos = pos; } -const char *cnetz_dsp_mode_name(enum dsp_mode mode) -{ - static char invalid[16]; - - switch (mode) { - case DSP_SCHED_NONE: - return "SCHED_NONE"; - case DSP_MODE_OFF: - return "OFF"; - case DSP_MODE_OGK: - return "OGK"; - case DSP_MODE_SPK_K: - return "SPK_K"; - case DSP_MODE_SPK_V: - return "SPK_V"; - } - - sprintf(invalid, "invalid(%d)", mode); - return invalid; -} - void cnetz_set_dsp_mode(cnetz_t *cnetz, enum dsp_mode mode) { - PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "DSP mode %s -> %s\n", cnetz_dsp_mode_name(cnetz->dsp_mode), cnetz_dsp_mode_name(mode)); - cnetz->dsp_mode = mode; + if (mode != cnetz->dsp_mode) { + PDEBUG_CHAN(DDSP, DEBUG_INFO, "DSP mode %s -> %s\n", cnetz_dsp_mode_name(cnetz->dsp_mode), cnetz_dsp_mode_name(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) +void cnetz_set_sched_dsp_mode(cnetz_t *cnetz, enum dsp_mode mode, int timeslot) { - PDEBUG_CHAN(DDSP, DEBUG_DEBUG, " Schedule DSP mode %s -> %s in %d frames\n", cnetz_dsp_mode_name(cnetz->dsp_mode), cnetz_dsp_mode_name(mode), frames_ahead); - cnetz->sched_dsp_mode = mode; - cnetz->sched_switch_mode = frames_ahead; + if (mode != cnetz->dsp_mode) { + PDEBUG_CHAN(DDSP, DEBUG_INFO, "Schedule DSP mode %s -> %s at timeslot %d\n", cnetz_dsp_mode_name(cnetz->dsp_mode), cnetz_dsp_mode_name(mode), timeslot); + cnetz->sched_dsp_mode = mode; + cnetz->sched_dsp_mode_ts = timeslot; + } } |