From 21b4f371239a701575a1f46f739b6a33ccbea702 Mon Sep 17 00:00:00 2001 From: Andreas Eversberg Date: Sun, 13 Dec 2009 14:06:01 +0100 Subject: [PATCH] Added protection against false tone detection. modified: ss5.cpp modified: ss5.h --- ss5.cpp | 19 ++++++++++++++++++- ss5.h | 5 ++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/ss5.cpp b/ss5.cpp index 164ef0c..5f4d706 100644 --- a/ss5.cpp +++ b/ss5.cpp @@ -346,6 +346,7 @@ Pss5::Pss5(int type, struct mISDNport *mISDNport, char *portname, struct port_se p_m_s_digit_i = 0; p_m_s_pulsecount = 0; p_m_s_last_digit = ' '; + p_m_s_last_digit_used = ' '; p_m_s_signal_loss = 0; p_m_s_decoder_count = 0; //p_m_s_decoder_buffer; @@ -428,7 +429,7 @@ void Pss5::inband_receive(unsigned char *buffer, int len) PDEBUG(DEBUG_SS5, "%s: detecting signal '%c' start (state=%s signal=%s)\n", p_name, digit, ss5_state_name[p_m_s_state], ss5_signal_name[p_m_s_signal]); #endif - /* ignore short loss of signal */ + /* ignore short loss of signal, or change within one decode window */ if (p_m_s_signal_loss) { if (digit == ' ') { /* still lost */ @@ -460,11 +461,19 @@ void Pss5::inband_receive(unsigned char *buffer, int len) p_m_s_last_digit = digit; /* starting to loose signal */ p_m_s_signal_loss = SS5_DECODER_NPOINTS; + } else if (digit != p_m_s_last_digit) { + /* digit changes, but we keep old digit until it is detected twice */ +#ifdef DEBUG_DETECT + PDEBUG(DEBUG_SS5, "%s: signal '%c' changes to '%c'\n", p_name, p_m_s_last_digit, digit); +#endif + p_m_s_last_digit = digit; + digit = p_m_s_last_digit_used; } else { /* storing last signal, in case it is lost */ p_m_s_last_digit = digit; } } + p_m_s_last_digit_used = digit; /* update mute */ if ((p_m_mISDNport->ss5 & SS5_FEATURE_SUPPRESS)) { @@ -1597,6 +1606,8 @@ void Pss5::do_release(int cause, int location) { struct lcr_msg *message; + p_m_s_timer = 0.0; + /* sending release to endpoint */ while(p_epointlist) { message = message_create(p_serial, p_epointlist->epoint_id, PORT_TO_EPOINT, MESSAGE_RELEASE); @@ -1926,6 +1937,8 @@ if (0 || p_type==PORT_TYPE_SS5_OUT) { /* outgoing exchange */ start_signal(SS5_STATE_CLEAR_BACK); new_state(PORT_STATE_OUT_DISCONNECT); +// p_m_s_timer_fn = &Pss5::register_timeout; +// p_m_s_timer = now + 30.0; } /* MESSAGE_RELEASE */ @@ -1934,6 +1947,10 @@ void Pss5::message_release(unsigned int epoint_id, int message_id, union paramet do_release(param->disconnectinfo.cause, param->disconnectinfo.location); } +void Pss5::register_timeout(void) +{ + do_release(CAUSE_NORMAL, LOCATION_BEYOND); +} /* * endpoint sends messages to the port diff --git a/ss5.h b/ss5.h index 238501f..b1cc215 100644 --- a/ss5.h +++ b/ss5.h @@ -34,7 +34,8 @@ class Pss5 : public PmISDN char p_m_s_dial[64]; /* current dialing register */ int p_m_s_digit_i; /* current digit of register counter */ int p_m_s_pulsecount; /* counts pule dialing half cycles */ - char p_m_s_last_digit; /* stores last digit to fill short signal losses */ + char p_m_s_last_digit; /* stores last digit that was detected, to fill short signal losses */ + char p_m_s_last_digit_used; /* stores last digit that was used, to ignore short changes of signal due to noise */ int p_m_s_signal_loss; /* sample counter for loss of signal check */ int p_m_s_decoder_count; /* samples currently decoded */ unsigned char p_m_s_decoder_buffer[SS5_DECODER_NPOINTS]; /* buffer for storing one goertzel window */ @@ -76,6 +77,8 @@ class Pss5 : public PmISDN void message_disconnect(unsigned int epoint_id, int message_id, union parameter *param); void message_release(unsigned int epoint_id, int message_id, union parameter *param); + void register_timeout(void); + }; #define new_ss5_state(a) _new_ss5_state(a, __FUNCTION__, __LINE__)