A-Netz: Reset tone detector when going idle

A pending tone must be detected as soon as the cell is idle. This happens
if the phone picks up during release guard time.
This commit is contained in:
Andreas Eversberg 2017-01-02 10:13:43 +01:00
parent 2e7a05f8d9
commit e724823c5b
3 changed files with 12 additions and 8 deletions

View File

@ -233,7 +233,8 @@ static void anetz_go_idle(anetz_t *anetz)
PDEBUG(DANETZ, DEBUG_INFO, "Entering IDLE state on channel %d, sending 2280 Hz tone.\n", anetz->sender.kanal);
anetz_new_state(anetz, ANETZ_FREI);
anetz_set_dsp_mode(anetz, DSP_MODE_TONE);
/* also reset detector, so if there is a new call it is answered */
anetz_set_dsp_mode(anetz, DSP_MODE_TONE, 1);
anetz->station_id[0] = '\0';
}
@ -244,7 +245,7 @@ static void anetz_release(anetz_t *anetz)
PDEBUG_CHAN(DANETZ, DEBUG_INFO, "Sending 2280 Hz release tone.\n");
anetz_new_state(anetz, ANETZ_AUSLOESEN);
anetz_set_dsp_mode(anetz, DSP_MODE_TONE);
anetz_set_dsp_mode(anetz, DSP_MODE_TONE, 0);
anetz->station_id[0] = '\0';
timer_start(&anetz->timer, RELEASE_TO);
}
@ -254,7 +255,7 @@ static void anetz_page(anetz_t *anetz, const char *dial_string, double *freq)
{
PDEBUG_CHAN(DANETZ, DEBUG_INFO, "Entering paging state, sending 'Selektivruf' to '%s'.\n", dial_string);
anetz_new_state(anetz, ANETZ_ANRUF);
anetz_set_dsp_mode(anetz, DSP_MODE_PAGING);
anetz_set_dsp_mode(anetz, DSP_MODE_PAGING, 0);
dsp_set_paging(anetz, freq);
strcpy(anetz->station_id, dial_string);
timer_start(&anetz->timer, PAGING_TO);
@ -293,7 +294,7 @@ void anetz_receive_tone(anetz_t *anetz, int tone)
if (tone == 1) {
PDEBUG_CHAN(DANETZ, DEBUG_INFO, "Received 1750 Hz calling signal from mobile station, removing idle signal.\n");
anetz_new_state(anetz, ANETZ_GESPRAECH);
anetz_set_dsp_mode(anetz, DSP_MODE_SILENCE);
anetz_set_dsp_mode(anetz, DSP_MODE_SILENCE, 0);
break;
}
break;
@ -316,7 +317,7 @@ void anetz_receive_tone(anetz_t *anetz, int tone)
PDEBUG_CHAN(DANETZ, DEBUG_INFO, "1750 Hz signal from mobile station is gone, answer call.\n");
call_in_answer(anetz->callref, anetz->station_id);
}
anetz_set_dsp_mode(anetz, DSP_MODE_AUDIO);
anetz_set_dsp_mode(anetz, DSP_MODE_AUDIO, 0);
}
/* release call */
if (tone == 1) {
@ -333,7 +334,7 @@ void anetz_receive_tone(anetz_t *anetz, int tone)
PDEBUG_CHAN(DANETZ, DEBUG_INFO, "Received 1750 Hz answer signal from mobile station, removing paging tones.\n");
timer_stop(&anetz->timer);
anetz_new_state(anetz, ANETZ_GESPRAECH);
anetz_set_dsp_mode(anetz, DSP_MODE_SILENCE);
anetz_set_dsp_mode(anetz, DSP_MODE_SILENCE, 0);
break;
}
default:

View File

@ -404,7 +404,7 @@ const char *anetz_dsp_mode_name(enum dsp_mode mode)
return invalid;
}
void anetz_set_dsp_mode(anetz_t *anetz, enum dsp_mode mode)
void anetz_set_dsp_mode(anetz_t *anetz, enum dsp_mode mode, int detect_reset)
{
PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "DSP mode %s -> %s\n", anetz_dsp_mode_name(anetz->dsp_mode), anetz_dsp_mode_name(mode));
anetz->dsp_mode = mode;
@ -412,5 +412,8 @@ void anetz_set_dsp_mode(anetz_t *anetz, enum dsp_mode mode)
anetz->paging_tone = 0;
anetz->paging_count = 0;
anetz->paging_transition = 0;
/* reset tone detector */
if (detect_reset)
anetz->tone_detected = -1;
}

View File

@ -3,5 +3,5 @@ void dsp_init(void);
int dsp_init_sender(anetz_t *anetz, int page_seqeuence);
void dsp_cleanup_sender(anetz_t *anetz);
void dsp_set_paging(anetz_t *anetz, double *freq);
void anetz_set_dsp_mode(anetz_t *anetz, enum dsp_mode mode);
void anetz_set_dsp_mode(anetz_t *anetz, enum dsp_mode mode, int detect_reset);