diff options
author | Andreas Eversberg <jolly@eversberg.eu> | 2016-05-22 14:52:57 +0200 |
---|---|---|
committer | Andreas Eversberg <jolly@eversberg.eu> | 2016-05-29 17:17:49 +0200 |
commit | 997f8eda4389094027a25b0317b67051cd90b675 (patch) | |
tree | 96aa76b3ca2d87fa0f8881f52cd2839cf1b832b9 | |
parent | 1ceb3026ddff811dc440da4139eda5f502f8bf27 (diff) |
B-Netz: Add timer for switching back from calling channel
The timer ensures that the paging sequence is sent out by sound card before
switching back to traffic channel
-rw-r--r-- | src/bnetz/bnetz.c | 24 | ||||
-rw-r--r-- | src/bnetz/bnetz.h | 3 |
2 files changed, 18 insertions, 9 deletions
diff --git a/src/bnetz/bnetz.c b/src/bnetz/bnetz.c index 03e30a2..16f4ac8 100644 --- a/src/bnetz/bnetz.c +++ b/src/bnetz/bnetz.c @@ -46,6 +46,7 @@ static int new_callref = 0x40000000; #define PAGING_TO 4 /* timeout 4 seconds after "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) */ /* Convert channel number to frequency number of base station. Set 'unterband' to 1 to get frequency of mobile station. */ @@ -372,7 +373,7 @@ static void bnetz_release(bnetz_t *bnetz) static void bnetz_page(bnetz_t *bnetz, const char *dial_string, int try) { PDEBUG(DBNETZ, DEBUG_INFO, "Entering paging state (try %d), sending 'Selektivruf' to '%s'.\n", try, dial_string); - bnetz->state = BNETZ_SELEKTIVRUF; + bnetz->state = BNETZ_SELEKTIVRUF_EIN; bnetz_set_dsp_mode(bnetz, DSP_MODE_0); bnetz->page_mode = PAGE_MODE_NUMBER; bnetz->page_try = try; @@ -405,13 +406,12 @@ const char *bnetz_get_telegramm(bnetz_t *bnetz) } it = bnetz_telegramm(bnetz->station_id[bnetz->station_id_pos++]); break; - case BNETZ_SELEKTIVRUF: + case BNETZ_SELEKTIVRUF_EIN: if (bnetz->page_mode == PAGE_MODE_KANALBEFEHL) { PDEBUG(DBNETZ, DEBUG_INFO, "Paging mobile station %s complete, waiting for answer.\n", bnetz->station_id); - bnetz->state = BNETZ_RUFBESTAETIGUNG; + bnetz->state = BNETZ_SELEKTIVRUF_AUS; bnetz_set_dsp_mode(bnetz, DSP_MODE_SILENCE); - switch_channel_19(bnetz, 0); - timer_start(&bnetz->timer, PAGING_TO); + timer_start(&bnetz->timer, SWITCHBACK_TIME); return NULL; } if (bnetz->station_id_pos == 5) { @@ -686,10 +686,16 @@ static void bnetz_timeout(struct timer *timer) PDEBUG(DBNETZ, DEBUG_NOTICE, "Timeout while receiving call setup from mobile station, aborting.\n"); bnetz_go_idle(bnetz); break; - case BNETZ_SELEKTIVRUF: + case BNETZ_SELEKTIVRUF_EIN: PDEBUG(DBNETZ, DEBUG_DEBUG, "Transmitter switched to channel 19, starting paging telegramms.\n"); bnetz_set_dsp_mode(bnetz, DSP_MODE_TELEGRAMM); break; + case BNETZ_SELEKTIVRUF_AUS: + PDEBUG(DBNETZ, DEBUG_DEBUG, "Transmitter switched back to channel %d, waiting for paging response.\n", bnetz->sender.kanal); + bnetz->state = BNETZ_RUFBESTAETIGUNG; + switch_channel_19(bnetz, 0); + timer_start(&bnetz->timer, PAGING_TO); + break; 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"); @@ -789,7 +795,8 @@ void call_out_disconnect(int callref, int cause) if (bnetz->state == BNETZ_GESPRAECH) return; switch (bnetz->state) { - case BNETZ_SELEKTIVRUF: + case BNETZ_SELEKTIVRUF_EIN: + case BNETZ_SELEKTIVRUF_AUS: case BNETZ_RUFBESTAETIGUNG: PDEBUG(DBNETZ, DEBUG_NOTICE, "Outgoing disconnect, during paging, releasing!\n"); bnetz_release(bnetz); @@ -833,7 +840,8 @@ void call_out_release(int callref, int cause) PDEBUG(DBNETZ, DEBUG_NOTICE, "Outgoing release, during call, releasing!\n"); bnetz_release(bnetz); break; - case BNETZ_SELEKTIVRUF: + case BNETZ_SELEKTIVRUF_EIN: + case BNETZ_SELEKTIVRUF_AUS: case BNETZ_RUFBESTAETIGUNG: PDEBUG(DBNETZ, DEBUG_NOTICE, "Outgoing release, during paging, releasing!\n"); bnetz_release(bnetz); diff --git a/src/bnetz/bnetz.h b/src/bnetz/bnetz.h index 48c1683..0ecfec6 100644 --- a/src/bnetz/bnetz.h +++ b/src/bnetz/bnetz.h @@ -13,7 +13,8 @@ enum dsp_mode { enum bnetz_state { BNETZ_FREI, /* sending 'Gruppenfreisignal' */ BNETZ_WAHLABRUF, /* sending 'Wahlabruf', receiving call setup */ - BNETZ_SELEKTIVRUF, /* paging phone */ + BNETZ_SELEKTIVRUF_EIN, /* paging phone (switch to calling channel) */ + BNETZ_SELEKTIVRUF_AUS, /* paging phone (wait before switching back) */ BNETZ_RUFBESTAETIGUNG, /* waitig for acknowledge from phone */ BNETZ_RUFHALTUNG, /* phone is ringing */ BNETZ_GESPRAECH, /* during conversation */ |