aboutsummaryrefslogtreecommitdiffstats
path: root/src/bnetz
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 /src/bnetz
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
Diffstat (limited to 'src/bnetz')
-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 */