aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Eversberg <jolly@eversberg.eu>2016-05-22 14:52:57 +0200
committerAndreas Eversberg <jolly@eversberg.eu>2016-05-29 17:17:49 +0200
commit997f8eda4389094027a25b0317b67051cd90b675 (patch)
tree96aa76b3ca2d87fa0f8881f52cd2839cf1b832b9
parent1ceb3026ddff811dc440da4139eda5f502f8bf27 (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.c24
-rw-r--r--src/bnetz/bnetz.h3
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 */