diff options
author | Andreas Eversberg <jolly@eversberg.eu> | 2016-11-27 07:17:26 +0100 |
---|---|---|
committer | Andreas Eversberg <jolly@eversberg.eu> | 2016-11-27 22:06:47 +0100 |
commit | 938fb74baef7a53b0092271ad6ac61a376cc2d8f (patch) | |
tree | 7af1902b802526bd9cca7f528652dfb7a0021d79 /src/bnetz/bnetz.c | |
parent | b1c452cf1218241ce4464c3b280cbe8f72f33eb7 (diff) |
B-Netz: Fixes call procedure according to the standard FTZ 171 R 4
Diffstat (limited to 'src/bnetz/bnetz.c')
-rw-r--r-- | src/bnetz/bnetz.c | 73 |
1 files changed, 38 insertions, 35 deletions
diff --git a/src/bnetz/bnetz.c b/src/bnetz/bnetz.c index 62a68a8..406e6b0 100644 --- a/src/bnetz/bnetz.c +++ b/src/bnetz/bnetz.c @@ -39,19 +39,22 @@ static int new_callref = 0x40000000; /* mobile originating call */ #define CARRIER_TO 0.08 /* 80 ms search for carrier */ -#define GRUPPE_TO 0.4 /* 400 ms search for "Gruppensignal" */ -#define DIALING_TO 1.00 /* FIXME: get real value */ +#define DIALING_TO 3.8 /* timeout after channel allocation "Kanalbelegung" */ +#define DIALING_TO2 0.5 /* timeout while receiving digits */ /* radio loss condition */ -#define LOSS_OF_SIGNAL 9.6 /* duration of carrier loss until release: 9.6 s */ +#define LOSS_OF_SIGNAL 12.5 /* duration of carrier loss until release */ /* mobile terminating call */ #define ALERTING_TO 60 /* timeout after 60 seconds alerting the MS */ -#define PAGING_TO 4 /* timeout 4 seconds after "Selektivruf" */ +#define PAGING_TO 2.1 /* 700..2100 ms timeout after paging "Selektivruf" */ #define PAGE_TRIES 2 /* two tries */ #define SWITCH19_TIME 1.0 /* time to switch channel (radio should be tansmitting after that) */ #define SWITCHBACK_TIME 0.1 /* time to wait until switching back (latency of sound device shall be lower) */ +#define TRENN_COUNT 4 /* min. 350 ms disconnect "Trennsignal" */ +#define TRENN_COUNT_NA 96 /* 12 s disconnect "Trennsignal" if no answer */ + /* Convert channel number to frequency number of base station. Set 'unterband' to 1 to get frequency of mobile station. */ double bnetz_kanal2freq(int kanal, int unterband) @@ -222,15 +225,15 @@ static void bnetz_go_idle(bnetz_t *bnetz) } /* Release connection towards mobile station by sending release digits. */ -static void bnetz_release(bnetz_t *bnetz) +static void bnetz_release(bnetz_t *bnetz, int trenn_count) { timer_stop(&bnetz->timer); - PDEBUG(DBNETZ, DEBUG_INFO, "Entering release state, sending 'Trennsignal'.\n"); + PDEBUG(DBNETZ, DEBUG_INFO, "Entering release state, sending 'Trennsignal' (%d times).\n", trenn_count); bnetz->state = BNETZ_TRENNEN; bnetz_set_dsp_mode(bnetz, DSP_MODE_TELEGRAMM); switch_channel_19(bnetz, 0); - bnetz->trenn_count = 0; + bnetz->trenn_count = trenn_count; bnetz->station_id[0] = '\0'; } @@ -298,7 +301,7 @@ const char *bnetz_get_telegramm(bnetz_t *bnetz) it = bnetz_digit2telegramm(bnetz->station_id[bnetz->station_id_pos++]); break; case BNETZ_TRENNEN: - if (bnetz->trenn_count++ == 75) { + if (bnetz->trenn_count-- == 0) { PDEBUG(DBNETZ, DEBUG_DEBUG, "Maximum number of release digits sent, going idle.\n"); bnetz_go_idle(bnetz); return NULL; @@ -322,7 +325,7 @@ void bnetz_loss_indication(bnetz_t *bnetz) if (bnetz->state == BNETZ_GESPRAECH || bnetz->state == BNETZ_RUFHALTUNG) { PDEBUG(DBNETZ, DEBUG_NOTICE, "Detected loss of signal, releasing.\n"); - bnetz_release(bnetz); + bnetz_release(bnetz, TRENN_COUNT); call_in_release(bnetz->callref, CAUSE_TEMPFAIL); bnetz->callref = 0; } @@ -404,7 +407,7 @@ void bnetz_receive_telegramm(bnetz_t *bnetz, uint16_t telegramm, double level, d switch (bnetz->state) { case BNETZ_WAHLABRUF: - timer_start(&bnetz->timer, DIALING_TO); + timer_start(&bnetz->timer, DIALING_TO2); switch (bnetz->dial_mode) { case DIAL_MODE_START: switch (digit) { @@ -419,7 +422,7 @@ void bnetz_receive_telegramm(bnetz_t *bnetz, uint16_t telegramm, double level, d break; default: PDEBUG(DBNETZ, DEBUG_NOTICE, "Received digit that is not a start digit ('Funkwahl'), aborting.\n"); - bnetz_go_idle(bnetz); + bnetz_release(bnetz, TRENN_COUNT); return; } bnetz->dial_mode = DIAL_MODE_STATIONID; @@ -429,7 +432,7 @@ void bnetz_receive_telegramm(bnetz_t *bnetz, uint16_t telegramm, double level, d case DIAL_MODE_STATIONID: if (digit < '0' || digit > '9') { PDEBUG(DBNETZ, DEBUG_NOTICE, "Received message that is not a valid station id digit, aborting.\n"); - bnetz_go_idle(bnetz); + bnetz_release(bnetz, TRENN_COUNT); return; } bnetz->station_id[bnetz->dial_pos++] = digit; @@ -452,12 +455,12 @@ void bnetz_receive_telegramm(bnetz_t *bnetz, uint16_t telegramm, double level, d } if (digit < '0' || digit > '9') { PDEBUG(DBNETZ, DEBUG_NOTICE, "Received message that is not a valid number digit, aborting.\n"); - bnetz_go_idle(bnetz); + bnetz_release(bnetz, TRENN_COUNT); return; } if (bnetz->dial_pos == sizeof(bnetz->dial_number) - 1) { PDEBUG(DBNETZ, DEBUG_NOTICE, "Received too many number digits, aborting.\n"); - bnetz_go_idle(bnetz); + bnetz_release(bnetz, TRENN_COUNT); return; } bnetz->dial_number[bnetz->dial_pos++] = digit; @@ -467,27 +470,27 @@ void bnetz_receive_telegramm(bnetz_t *bnetz, uint16_t telegramm, double level, d case 's': if (bnetz->dial_type != DIAL_TYPE_NOMETER) { PDEBUG(DBNETZ, DEBUG_NOTICE, "Second received start message('Funkwahl') does not match first one (no metering support), aborting.\n"); - bnetz_go_idle(bnetz); + bnetz_release(bnetz, TRENN_COUNT); return; } break; case 'S': if (bnetz->dial_type != DIAL_TYPE_METER) { PDEBUG(DBNETZ, DEBUG_NOTICE, "Second received start message('Funkwahl') does not match first one (metering support), aborting.\n"); - bnetz_go_idle(bnetz); + bnetz_release(bnetz, TRENN_COUNT); return; } break; case 'U': if (bnetz->dial_type != DIAL_TYPE_METER_MUENZ) { PDEBUG(DBNETZ, DEBUG_NOTICE, "Second received start message('Funkwahl') does not match first one (metering support, payphone), aborting.\n"); - bnetz_go_idle(bnetz); + bnetz_release(bnetz, TRENN_COUNT); return; } break; default: PDEBUG(DBNETZ, DEBUG_NOTICE, "Received digit that is not a start digit ('Funkwahl'), aborting.\n"); - bnetz_go_idle(bnetz); + bnetz_release(bnetz, TRENN_COUNT); return; } bnetz->dial_mode = DIAL_MODE_STATIONID2; @@ -496,12 +499,12 @@ void bnetz_receive_telegramm(bnetz_t *bnetz, uint16_t telegramm, double level, d case DIAL_MODE_STATIONID2: if (digit < '0' || digit > '9') { PDEBUG(DBNETZ, DEBUG_NOTICE, "Received message that is not a valid station id digit, aborting.\n"); - bnetz_go_idle(bnetz); + bnetz_release(bnetz, TRENN_COUNT); return; } if (bnetz->station_id[bnetz->dial_pos++] != digit) { PDEBUG(DBNETZ, DEBUG_NOTICE, "Second received station id does not match first one, aborting.\n"); - bnetz_go_idle(bnetz); + bnetz_release(bnetz, TRENN_COUNT); return; } if (bnetz->dial_pos == 5) { @@ -519,7 +522,7 @@ void bnetz_receive_telegramm(bnetz_t *bnetz, uint16_t telegramm, double level, d if (bnetz->dial_pos != (int)strlen(bnetz->dial_number)) { PDEBUG(DBNETZ, DEBUG_NOTICE, "Received too few number digits the second time, aborting.\n"); - bnetz_go_idle(bnetz); + bnetz_release(bnetz, TRENN_COUNT); return; } PDEBUG(DBNETZ, DEBUG_INFO, "Dialing complete %s->%s, call established.\n", bnetz->station_id, dialing); @@ -532,7 +535,7 @@ void bnetz_receive_telegramm(bnetz_t *bnetz, uint16_t telegramm, double level, d rc = call_in_setup(callref, bnetz->station_id, dialing); if (rc < 0) { PDEBUG(DBNETZ, DEBUG_NOTICE, "Call rejected (cause %d), releasing.\n", -rc); - bnetz_release(bnetz); + bnetz_release(bnetz, TRENN_COUNT); return; } bnetz->callref = callref; @@ -540,17 +543,17 @@ void bnetz_receive_telegramm(bnetz_t *bnetz, uint16_t telegramm, double level, d } if (digit < '0' || digit > '9') { PDEBUG(DBNETZ, DEBUG_NOTICE, "Received message that is not a valid number digit, aborting.\n"); - bnetz_go_idle(bnetz); + bnetz_release(bnetz, TRENN_COUNT); return; } if (bnetz->dial_pos == (int)strlen(bnetz->dial_number)) { PDEBUG(DBNETZ, DEBUG_NOTICE, "Received too many number digits, aborting.\n"); - bnetz_go_idle(bnetz); + bnetz_release(bnetz, TRENN_COUNT); return; } if (bnetz->dial_number[bnetz->dial_pos++] != digit) { PDEBUG(DBNETZ, DEBUG_NOTICE, "Second received number does not match first one, aborting.\n"); - bnetz_go_idle(bnetz); + bnetz_release(bnetz, TRENN_COUNT); return; } } @@ -561,7 +564,7 @@ void bnetz_receive_telegramm(bnetz_t *bnetz, uint16_t telegramm, double level, d return; if (digit == 't') { PDEBUG(DBNETZ, DEBUG_NOTICE, "Received 'Schlusssignal' from mobile station\n"); - bnetz_go_idle(bnetz); + bnetz_release(bnetz, TRENN_COUNT); call_in_release(bnetz->callref, CAUSE_NORMAL); bnetz->callref = 0; break; @@ -585,7 +588,7 @@ static void bnetz_timeout(struct timer *timer) #endif case BNETZ_WAHLABRUF: PDEBUG(DBNETZ, DEBUG_NOTICE, "Timeout while receiving call setup from mobile station, aborting.\n"); - bnetz_go_idle(bnetz); + bnetz_release(bnetz, TRENN_COUNT); break; case BNETZ_SELEKTIVRUF_EIN: PDEBUG(DBNETZ, DEBUG_DEBUG, "Transmitter switched to channel 19, starting paging telegramms.\n"); @@ -600,7 +603,7 @@ static void bnetz_timeout(struct timer *timer) case BNETZ_RUFBESTAETIGUNG: if (bnetz->page_try == PAGE_TRIES) { PDEBUG(DBNETZ, DEBUG_NOTICE, "Timeout while waiting for call acknowledge from mobile station, going idle.\n"); - bnetz_go_idle(bnetz); + bnetz_release(bnetz, TRENN_COUNT); call_in_release(bnetz->callref, CAUSE_OUTOFORDER); bnetz->callref = 0; break; @@ -610,7 +613,7 @@ static void bnetz_timeout(struct timer *timer) break; case BNETZ_RUFHALTUNG: PDEBUG(DBNETZ, DEBUG_NOTICE, "Timeout while waiting for answer of mobile station, releasing.\n"); - bnetz_release(bnetz); + bnetz_release(bnetz, TRENN_COUNT_NA); call_in_release(bnetz->callref, CAUSE_NOANSWER); bnetz->callref = 0; break; @@ -629,7 +632,7 @@ int call_out_setup(int callref, const char __attribute__((unused)) *caller_id, e /* 1. check if number is invalid, return INVALNUMBER */ if (strlen(dialing) == 7 && dialing[0] == '0' && dialing[1] == '5') dialing += 2; - if (strlen(dialing) != 5) { + else if (strlen(dialing) != 5) { inval: PDEBUG(DBNETZ, DEBUG_NOTICE, "Outgoing call to invalid number '%s', rejecting!\n", dialing); return -CAUSE_INVALNUMBER; @@ -700,11 +703,11 @@ void call_out_disconnect(int callref, int cause) case BNETZ_SELEKTIVRUF_AUS: case BNETZ_RUFBESTAETIGUNG: PDEBUG(DBNETZ, DEBUG_NOTICE, "Outgoing disconnect, during paging, releasing!\n"); - bnetz_release(bnetz); + bnetz_release(bnetz, TRENN_COUNT); break; case BNETZ_RUFHALTUNG: PDEBUG(DBNETZ, DEBUG_NOTICE, "Outgoing disconnect, during alerting, releasing!\n"); - bnetz_release(bnetz); + bnetz_release(bnetz, TRENN_COUNT); break; default: break; @@ -739,17 +742,17 @@ void call_out_release(int callref, int __attribute__((unused)) cause) switch (bnetz->state) { case BNETZ_GESPRAECH: PDEBUG(DBNETZ, DEBUG_NOTICE, "Outgoing release, during call, releasing!\n"); - bnetz_release(bnetz); + bnetz_release(bnetz, TRENN_COUNT); break; case BNETZ_SELEKTIVRUF_EIN: case BNETZ_SELEKTIVRUF_AUS: case BNETZ_RUFBESTAETIGUNG: PDEBUG(DBNETZ, DEBUG_NOTICE, "Outgoing release, during paging, releasing!\n"); - bnetz_release(bnetz); + bnetz_release(bnetz, TRENN_COUNT); break; case BNETZ_RUFHALTUNG: PDEBUG(DBNETZ, DEBUG_NOTICE, "Outgoing release, during alerting, releasing!\n"); - bnetz_release(bnetz); + bnetz_release(bnetz, TRENN_COUNT); break; default: break; |