aboutsummaryrefslogtreecommitdiffstats
path: root/src/bnetz/bnetz.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bnetz/bnetz.c')
-rw-r--r--src/bnetz/bnetz.c288
1 files changed, 154 insertions, 134 deletions
diff --git a/src/bnetz/bnetz.c b/src/bnetz/bnetz.c
index caa7b2e..ca68508 100644
--- a/src/bnetz/bnetz.c
+++ b/src/bnetz/bnetz.c
@@ -25,32 +25,33 @@
#include <string.h>
#include <errno.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../libmobile/call.h"
#include "../libmobile/cause.h"
-#include "../libosmocc/message.h"
+#include "../libmobile/get_time.h"
+#include <osmocom/cc/message.h>
#include "bnetz.h"
#include "telegramm.h"
#include "dsp.h"
/* mobile originating call */
-#define CARRIER_TO 0.08 /* 80 ms search for carrier */
-#define DIALING_TO 3.8 /* timeout after channel allocation "Kanalbelegung" (according to FTZ 1727 Pfl 32 Clause 3.2.2.2.8) */
-#define DIALING_TO2 0.5 /* timeout while receiving digits */
+#define CARRIER_TO 0.080000 /* 80 ms search for carrier */
+#define DIALING_TO 3,800000 /* timeout after channel allocation "Kanalbelegung" (according to FTZ 1727 Pfl 32 Clause 3.2.2.2.8) */
+#define DIALING_TO2 0,500000 /* timeout while receiving digits */
/* mobile terminating call */
-#define ALERTING_TO 60 /* timeout after 60 seconds alerting the MS (according to FTZ 1727 Pfl 32 Clause 3.2.2.2.7) */
-#define PAGING_TO 2.1 /* 700..2100 ms timeout after paging "Selektivruf" (according to FTZ 1727 Pfl 32 Clause 3.2.2.2.4.3) */
-#define PAGE_TRIES 2 /* two tries (see Clause 3.2.2.2.4.3) */
-#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 ALERTING_TO 60,0 /* timeout after 60 seconds alerting the MS (according to FTZ 1727 Pfl 32 Clause 3.2.2.2.7) */
+#define PAGING_TO 2,100000 /* 700..2100 ms timeout after paging "Selektivruf" (according to FTZ 1727 Pfl 32 Clause 3.2.2.2.4.3) */
+#define PAGE_TRIES 2 /* two tries (see Clause 3.2.2.2.4.3) */
+#define SWITCH19_TIME 1,0 /* time to switch channel (radio should be tansmitting after that) */
+#define SWITCHBACK_TIME 0,100000 /* time to wait until switching back (latency of sound device shall be lower) */
-#define TRENN_COUNT 5 /* min. 720 ms release 'Trennsignal' (according to FTZ 1727 Pfl 32 Clause 3.2.2.2.6) */
+#define TRENN_COUNT 5 /* min. 720 ms release 'Trennsignal' (according to FTZ 1727 Pfl 32 Clause 3.2.2.2.6) */
-#define METERING_DURATION 0.140 /* duration of metering pulse (according to FTZ 1727 Pfl 32 Clause 3.2.6.6.1) */
-#define METERING_START 1.0 /* start metering 1 second after call start */
+#define METERING_DURATION_US 140000 /* duration of metering pulse (according to FTZ 1727 Pfl 32 Clause 3.2.6.6.1) */
+#define METERING_START 1,0 /* start metering 1 second after call start */
-const char *bnetz_state_name(enum bnetz_state state)
+static const char *bnetz_state_name(enum bnetz_state state)
{
static char invalid[16];
@@ -79,7 +80,7 @@ const char *bnetz_state_name(enum bnetz_state state)
return invalid;
}
-void bnetz_display_status(void)
+static void bnetz_display_status(void)
{
sender_t *sender;
bnetz_t *bnetz;
@@ -99,7 +100,7 @@ static void bnetz_new_state(bnetz_t *bnetz, enum bnetz_state new_state)
{
if (bnetz->state == new_state)
return;
- PDEBUG_CHAN(DBNETZ, DEBUG_DEBUG, "State change: %s -> %s\n", bnetz_state_name(bnetz->state), bnetz_state_name(new_state));
+ LOGP_CHAN(DBNETZ, LOGL_DEBUG, "State change: %s -> %s\n", bnetz_state_name(bnetz->state), bnetz_state_name(new_state));
bnetz->state = new_state;
bnetz_display_status();
}
@@ -133,7 +134,7 @@ static void switch_channel_19(bnetz_t *bnetz, int on)
fp = fopen(bnetz->paging_file, "w");
if (!fp) {
- PDEBUG(DBNETZ, DEBUG_ERROR, "Failed to open file '%s' to switch channel 19!\n", bnetz->paging_file);
+ LOGP(DBNETZ, LOGL_ERROR, "Failed to open file '%s' to switch channel 19!\n", bnetz->paging_file);
return;
}
fprintf(fp, "%s\n", (on) ? bnetz->paging_on : bnetz->paging_off);
@@ -150,7 +151,7 @@ int bnetz_init(void)
return 0;
}
-static void bnetz_timeout(struct timer *timer);
+static void bnetz_timeout(void *data);
static void bnetz_go_idle(bnetz_t *bnetz);
/* Create transceiver instance and link to a list. */
@@ -162,22 +163,22 @@ int bnetz_create(const char *kanal, const char *device, int use_sdr, int sampler
int rc;
if (!(atoi(kanal) >= 1 && atoi(kanal) <= 39) && !(atoi(kanal) >= 50 && atoi(kanal) <= 86)) {
- PDEBUG(DBNETZ, DEBUG_ERROR, "Channel ('Kanal') number %s invalid.\n", kanal);
+ LOGP(DBNETZ, LOGL_ERROR, "Channel ('Kanal') number %s invalid.\n", kanal);
return -EINVAL;
}
if (atoi(kanal) == 19) {
- PDEBUG(DBNETZ, DEBUG_ERROR, "Selected calling channel ('Rufkanal') number %s can't be used as traffic channel.\n", kanal);
+ LOGP(DBNETZ, LOGL_ERROR, "Selected calling channel ('Rufkanal') number %s can't be used as traffic channel.\n", kanal);
return -EINVAL;
}
if (atoi(kanal) >= 38 && atoi(kanal) <= 39)
- PDEBUG(DBNETZ, DEBUG_NOTICE, "Selected channel ('Kanal') number %s may not be supported by older B1-Network phones.\n", kanal);
+ LOGP(DBNETZ, LOGL_NOTICE, "Selected channel ('Kanal') number %s may not be supported by older B1-Network phones.\n", kanal);
if (atoi(kanal) >= 50)
- PDEBUG(DBNETZ, DEBUG_NOTICE, "Selected channel ('Kanal') number %s belongs to B2-Network and is not supported by B1 phones.\n", kanal);
+ LOGP(DBNETZ, LOGL_NOTICE, "Selected channel ('Kanal') number %s belongs to B2-Network and is not supported by B1 phones.\n", kanal);
if ((gfs < 1 || gfs > 19)) {
- PDEBUG(DBNETZ, DEBUG_ERROR, "Given 'Gruppenfreisignal' %d invalid.\n", gfs);
+ LOGP(DBNETZ, LOGL_ERROR, "Given 'Gruppenfreisignal' %d invalid.\n", gfs);
return -EINVAL;
}
@@ -199,7 +200,7 @@ int bnetz_create(const char *kanal, const char *device, int use_sdr, int sampler
p = strchr(paging_file, '=');
if (!p) {
error_paging:
- PDEBUG(DBNETZ, DEBUG_ERROR, "Given paging file (to switch to channel 19) is missing parameters. Use <file>=<on>:<off> format!\n");
+ LOGP(DBNETZ, LOGL_ERROR, "Given paging file (to switch to channel 19) is missing parameters. Use <file>=<on>:<off> format!\n");
return -EINVAL;
}
*p++ = '\0';
@@ -213,16 +214,16 @@ error_paging:
bnetz = calloc(1, sizeof(bnetz_t));
if (!bnetz) {
- PDEBUG(DBNETZ, DEBUG_ERROR, "No memory!\n");
+ LOGP(DBNETZ, LOGL_ERROR, "No memory!\n");
return -ENOMEM;
}
- PDEBUG(DBNETZ, DEBUG_DEBUG, "Creating 'B-Netz' instance for 'Kanal' = %s 'Gruppenfreisignal' = %d (sample rate %d).\n", kanal, gfs, samplerate);
+ LOGP(DBNETZ, LOGL_DEBUG, "Creating 'B-Netz' instance for 'Kanal' = %s 'Gruppenfreisignal' = %d (sample rate %d).\n", kanal, gfs, samplerate);
/* init general part of transceiver */
rc = sender_create(&bnetz->sender, kanal, bnetz_kanal2freq(atoi(kanal), 0), bnetz_kanal2freq(atoi(kanal), 1), device, use_sdr, samplerate, rx_gain, tx_gain, pre_emphasis, de_emphasis, write_rx_wave, write_tx_wave, read_rx_wave, read_tx_wave, loopback, paging_signal);
if (rc < 0) {
- PDEBUG(DBNETZ, DEBUG_ERROR, "Failed to init transceiver process!\n");
+ LOGP(DBNETZ, LOGL_ERROR, "Failed to init transceiver process!\n");
goto error;
}
bnetz->sender.ruffrequenz = bnetz_kanal2freq(19, 0);
@@ -230,7 +231,7 @@ error_paging:
/* init audio processing */
rc = dsp_init_sender(bnetz, squelch_db);
if (rc < 0) {
- PDEBUG(DBNETZ, DEBUG_ERROR, "Failed to init audio processing!\n");
+ LOGP(DBNETZ, LOGL_ERROR, "Failed to init audio processing!\n");
goto error;
}
@@ -239,13 +240,13 @@ error_paging:
strncpy(bnetz->paging_file, paging_file, sizeof(bnetz->paging_file) - 1);
strncpy(bnetz->paging_on, paging_on, sizeof(bnetz->paging_on) - 1);
strncpy(bnetz->paging_off, paging_off, sizeof(bnetz->paging_off) - 1);
- timer_init(&bnetz->timer, bnetz_timeout, bnetz);
+ osmo_timer_setup(&bnetz->timer, bnetz_timeout, bnetz);
/* go into idle state */
bnetz_go_idle(bnetz);
- PDEBUG(DBNETZ, DEBUG_NOTICE, "Created 'Kanal' #%s\n", kanal);
- PDEBUG(DBNETZ, DEBUG_NOTICE, " -> Using station ID (Gruppenfreisignal) %d\n", gfs);
+ LOGP(DBNETZ, LOGL_NOTICE, "Created 'Kanal' #%s\n", kanal);
+ LOGP(DBNETZ, LOGL_NOTICE, " -> Using station ID (Gruppenfreisignal) %d\n", gfs);
return 0;
@@ -260,10 +261,10 @@ void bnetz_destroy(sender_t *sender)
{
bnetz_t *bnetz = (bnetz_t *) sender;
- PDEBUG(DBNETZ, DEBUG_DEBUG, "Destroying 'B-Netz' instance for 'Kanal' = %s.\n", sender->kanal);
+ LOGP(DBNETZ, LOGL_DEBUG, "Destroying 'B-Netz' instance for 'Kanal' = %s.\n", sender->kanal);
switch_channel_19(bnetz, 0);
dsp_cleanup_sender(bnetz);
- timer_exit(&bnetz->timer);
+ osmo_timer_del(&bnetz->timer);
sender_destroy(&bnetz->sender);
free(bnetz);
}
@@ -271,9 +272,9 @@ void bnetz_destroy(sender_t *sender)
/* releaseing connection towards mobile station by sending idle digits. */
static void bnetz_go_idle(bnetz_t *bnetz)
{
- timer_stop(&bnetz->timer);
+ osmo_timer_del(&bnetz->timer);
- PDEBUG(DBNETZ, DEBUG_INFO, "Entering IDLE state on channel %s, sending 'Gruppenfreisignal' %d.\n", bnetz->sender.kanal, bnetz->gfs);
+ LOGP(DBNETZ, LOGL_INFO, "Entering IDLE state on channel %s, sending 'Gruppenfreisignal' %d.\n", bnetz->sender.kanal, bnetz->gfs);
bnetz->station_id[0] = '\0'; /* remove station ID before state change, so status is shown correctly */
bnetz_new_state(bnetz, BNETZ_FREI);
bnetz_set_dsp_mode(bnetz, DSP_MODE_TELEGRAMM);
@@ -283,9 +284,9 @@ static void bnetz_go_idle(bnetz_t *bnetz)
/* Release connection towards mobile station by sending release digits. */
static void bnetz_release(bnetz_t *bnetz, int trenn_count)
{
- timer_stop(&bnetz->timer);
+ osmo_timer_del(&bnetz->timer);
- PDEBUG_CHAN(DBNETZ, DEBUG_INFO, "Entering release state, sending 'Trennsignal' (%d times).\n", trenn_count);
+ LOGP_CHAN(DBNETZ, LOGL_INFO, "Entering release state, sending 'Trennsignal' (%d times).\n", trenn_count);
bnetz->station_id[0] = '\0'; /* remove station ID before state change, so status is shown correctly */
bnetz_new_state(bnetz, BNETZ_TRENNEN);
bnetz_set_dsp_mode(bnetz, DSP_MODE_TELEGRAMM);
@@ -296,14 +297,14 @@ static void bnetz_release(bnetz_t *bnetz, int trenn_count)
/* Enter paging state and transmit station ID. */
static void bnetz_page(bnetz_t *bnetz, const char *dial_string, int try)
{
- PDEBUG_CHAN(DBNETZ, DEBUG_INFO, "Entering paging state (try %d), sending 'Selektivruf' to '%s'.\n", try, dial_string);
- strcpy(bnetz->station_id, dial_string); /* set station ID before state change, so status is shown correctly */
+ LOGP_CHAN(DBNETZ, LOGL_INFO, "Entering paging state (try %d), sending 'Selektivruf' to '%s'.\n", try, dial_string);
+ memmove(bnetz->station_id, dial_string, strlen(dial_string) + 1); /* set station ID before state change, so status is shown correctly */
bnetz->station_id_pos = 0;
bnetz_new_state(bnetz, BNETZ_SELEKTIVRUF_EIN);
bnetz_set_dsp_mode(bnetz, DSP_MODE_0);
bnetz->page_mode = PAGE_MODE_NUMBER;
bnetz->page_try = try;
- timer_start(&bnetz->timer, SWITCH19_TIME);
+ osmo_timer_schedule(&bnetz->timer, SWITCH19_TIME);
switch_channel_19(bnetz, 1);
}
@@ -332,10 +333,10 @@ const char *bnetz_get_telegramm(bnetz_t *bnetz)
break;
case BNETZ_SELEKTIVRUF_EIN:
if (bnetz->page_mode == PAGE_MODE_KANALBEFEHL) {
- PDEBUG_CHAN(DBNETZ, DEBUG_INFO, "Paging mobile station %s complete, waiting for answer.\n", bnetz->station_id);
+ LOGP_CHAN(DBNETZ, LOGL_INFO, "Paging mobile station %s complete, waiting for answer.\n", bnetz->station_id);
bnetz_new_state(bnetz, BNETZ_SELEKTIVRUF_AUS);
bnetz_set_dsp_mode(bnetz, DSP_MODE_SILENCE);
- timer_start(&bnetz->timer, SWITCHBACK_TIME);
+ osmo_timer_schedule(&bnetz->timer, SWITCHBACK_TIME);
return NULL;
}
if (bnetz->station_id_pos == 5) {
@@ -347,7 +348,7 @@ const char *bnetz_get_telegramm(bnetz_t *bnetz)
break;
case BNETZ_TRENNEN:
if (bnetz->trenn_count-- == 0) {
- PDEBUG_CHAN(DBNETZ, DEBUG_DEBUG, "Maximum number of release digits sent, going idle.\n");
+ LOGP_CHAN(DBNETZ, LOGL_DEBUG, "Maximum number of release digits sent, going idle.\n");
bnetz_go_idle(bnetz);
return NULL;
}
@@ -360,7 +361,7 @@ const char *bnetz_get_telegramm(bnetz_t *bnetz)
if (!it)
abort();
- PDEBUG_CHAN(DBNETZ, DEBUG_DEBUG, "Sending telegramm '%s'.\n", it->description);
+ LOGP_CHAN(DBNETZ, LOGL_DEBUG, "Sending telegramm '%s'.\n", it->description);
return it->sequence;
}
@@ -369,7 +370,7 @@ void bnetz_loss_indication(bnetz_t *bnetz, double loss_time)
{
if (bnetz->state == BNETZ_GESPRAECH
|| bnetz->state == BNETZ_RUFHALTUNG) {
- PDEBUG_CHAN(DBNETZ, DEBUG_NOTICE, "Detected loss of signal after %.1f seconds, releasing.\n", loss_time);
+ LOGP_CHAN(DBNETZ, LOGL_NOTICE, "Detected loss of signal after %.1f seconds, releasing.\n", loss_time);
bnetz_release(bnetz, TRENN_COUNT);
call_up_release(bnetz->callref, CAUSE_TEMPFAIL);
bnetz->callref = 0;
@@ -380,9 +381,9 @@ void bnetz_loss_indication(bnetz_t *bnetz, double loss_time)
void bnetz_receive_tone(bnetz_t *bnetz, int bit)
{
if (bit >= 0)
- PDEBUG_CHAN(DBNETZ, DEBUG_DEBUG, "Received continuous %d Hz tone.\n", (bit)?1950:2070);
+ LOGP_CHAN(DBNETZ, LOGL_DEBUG, "Received continuous %d Hz tone.\n", (bit)?1950:2070);
else
- PDEBUG_CHAN(DBNETZ, DEBUG_DEBUG, "Continuous tone is gone.\n");
+ LOGP_CHAN(DBNETZ, LOGL_DEBUG, "Continuous tone is gone.\n");
if (bnetz->sender.loopback) {
return;
@@ -391,11 +392,11 @@ void bnetz_receive_tone(bnetz_t *bnetz, int bit)
switch (bnetz->state) {
case BNETZ_FREI:
if (bit == 0) {
- PDEBUG_CHAN(DBNETZ, DEBUG_INFO, "Received signal 'Kanalbelegung' from mobile station, sending signal 'Wahlabruf'.\n");
+ LOGP_CHAN(DBNETZ, LOGL_INFO, "Received signal 'Kanalbelegung' from mobile station, sending signal 'Wahlabruf'.\n");
bnetz_new_state(bnetz, BNETZ_WAHLABRUF);
bnetz->dial_mode = DIAL_MODE_START;
bnetz_set_dsp_mode(bnetz, DSP_MODE_1);
- timer_start(&bnetz->timer, DIALING_TO);
+ osmo_timer_schedule(&bnetz->timer, DIALING_TO);
/* must reset, so we will not get corrupt first digit */
bnetz->rx_telegramm = bnetz->tone_detected * 0xffff;
break;
@@ -403,24 +404,27 @@ void bnetz_receive_tone(bnetz_t *bnetz, int bit)
break;
case BNETZ_RUFBESTAETIGUNG:
if (bit == 1) {
- PDEBUG_CHAN(DBNETZ, DEBUG_INFO, "Received signal 'Rufbestaetigung' from mobile station, sending signal 'Rufhaltung'. (call is ringing)\n");
- timer_stop(&bnetz->timer);
+ LOGP_CHAN(DBNETZ, LOGL_INFO, "Received signal 'Rufbestaetigung' from mobile station, sending signal 'Rufhaltung'. (call is ringing)\n");
+ osmo_timer_del(&bnetz->timer);
bnetz_new_state(bnetz, BNETZ_RUFHALTUNG);
bnetz_set_dsp_mode(bnetz, DSP_MODE_1);
call_up_alerting(bnetz->callref);
- timer_start(&bnetz->timer, ALERTING_TO);
+ osmo_timer_schedule(&bnetz->timer, ALERTING_TO);
break;
}
break;
case BNETZ_RUFHALTUNG:
if (bit == 0) {
- PDEBUG_CHAN(DBNETZ, DEBUG_INFO, "Received signal 'Beginnsignal' from mobile station, call establised.\n");
- timer_stop(&bnetz->timer);
+ LOGP_CHAN(DBNETZ, LOGL_INFO, "Received signal 'Beginnsignal' from mobile station, call establised.\n");
+ osmo_timer_del(&bnetz->timer);
bnetz_new_state(bnetz, BNETZ_GESPRAECH);
bnetz_set_dsp_mode(bnetz, DSP_MODE_AUDIO);
- /* start metering pulses if forced */
- if (bnetz->metering < 0)
- timer_start(&bnetz->timer, METERING_START);
+ /* start metering pulses, if forced (mobile terminating call) */
+ if (bnetz->metering < 0) {
+ bnetz->metering_tv.tv_sec = abs(bnetz->metering);
+ bnetz->metering_tv.tv_usec = 0;
+ osmo_timer_schedule(&bnetz->timer, METERING_START);
+ }
call_up_answer(bnetz->callref, bnetz->station_id);
break;
}
@@ -438,22 +442,22 @@ void bnetz_receive_telegramm(bnetz_t *bnetz, uint16_t telegramm)
it = bnetz_telegramm2digit(telegramm);
if (it) {
digit = it->digit;
- PDEBUG(DBNETZ, (bnetz->sender.loopback) ? DEBUG_NOTICE : DEBUG_INFO, "Received telegramm '%s'\n", it->description);
+ LOGP(DBNETZ, (bnetz->sender.loopback) ? LOGL_NOTICE : LOGL_INFO, "Received telegramm '%s'\n", it->description);
} else {
- PDEBUG(DBNETZ, DEBUG_DEBUG, "Received unknown telegramm digit '0x%04x' (might be radio noise)\n", telegramm);
+ LOGP(DBNETZ, LOGL_DEBUG, "Received unknown telegramm digit '0x%04x' (might be radio noise)\n", telegramm);
return;
}
if (bnetz->sender.loopback) {
if (digit >= '0' && digit <= '9') {
- PDEBUG(DBNETZ, DEBUG_NOTICE, "Round trip delay is %.3f seconds\n", get_time() - bnetz->loopback_time[digit - '0'] - 0.160);
+ LOGP(DBNETZ, LOGL_NOTICE, "Round trip delay is %.3f seconds\n", get_time() - bnetz->loopback_time[digit - '0'] - 0.160);
}
return;
}
switch (bnetz->state) {
case BNETZ_WAHLABRUF:
- timer_start(&bnetz->timer, DIALING_TO2);
+ osmo_timer_schedule(&bnetz->timer, DIALING_TO2);
switch (bnetz->dial_mode) {
case DIAL_MODE_START:
switch (digit) {
@@ -467,7 +471,7 @@ void bnetz_receive_telegramm(bnetz_t *bnetz, uint16_t telegramm)
bnetz->dial_type = DIAL_TYPE_METER_MUENZ;
break;
default:
- PDEBUG(DBNETZ, DEBUG_NOTICE, "Received digit that is not a start digit ('Funkwahl'), releaseing.\n");
+ LOGP(DBNETZ, LOGL_NOTICE, "Received digit that is not a start digit ('Funkwahl'), releaseing.\n");
bnetz_release(bnetz, TRENN_COUNT);
return;
}
@@ -477,7 +481,7 @@ void bnetz_receive_telegramm(bnetz_t *bnetz, uint16_t telegramm)
break;
case DIAL_MODE_STATIONID:
if (digit < '0' || digit > '9') {
- PDEBUG(DBNETZ, DEBUG_NOTICE, "Received message that is not a valid station id digit, releaseing.\n");
+ LOGP(DBNETZ, LOGL_NOTICE, "Received message that is not a valid station id digit, releaseing.\n");
bnetz_release(bnetz, TRENN_COUNT);
return;
}
@@ -485,29 +489,29 @@ void bnetz_receive_telegramm(bnetz_t *bnetz, uint16_t telegramm)
/* update status while receiving station ID */
bnetz_display_status();
if (bnetz->dial_pos == 5) {
- PDEBUG(DBNETZ, DEBUG_INFO, "Received station id from mobile phone: %s\n", bnetz->station_id);
+ LOGP(DBNETZ, LOGL_INFO, "Received station id from mobile phone: %s\n", bnetz->station_id);
bnetz->dial_mode = DIAL_MODE_NUMBER;
memset(bnetz->dial_number, 0, sizeof(bnetz->dial_number));
bnetz->dial_pos = 0;
/* reply station ID */
- PDEBUG(DBNETZ, DEBUG_INFO, "Sending station id back to phone: %s.\n", bnetz->station_id);
+ LOGP(DBNETZ, LOGL_INFO, "Sending station id back to phone: %s.\n", bnetz->station_id);
bnetz_set_dsp_mode(bnetz, DSP_MODE_TELEGRAMM);
bnetz->station_id_pos = 0;
}
break;
case DIAL_MODE_NUMBER:
if (digit == 'e') {
- PDEBUG(DBNETZ, DEBUG_INFO, "Received number from mobile phone: %s\n", bnetz->dial_number);
+ LOGP(DBNETZ, LOGL_INFO, "Received number from mobile phone: %s\n", bnetz->dial_number);
bnetz->dial_mode = DIAL_MODE_START2;
break;
}
if (digit < '0' || digit > '9') {
- PDEBUG(DBNETZ, DEBUG_NOTICE, "Received message that is not a valid number digit, releaseing.\n");
+ LOGP(DBNETZ, LOGL_NOTICE, "Received message that is not a valid number digit, releaseing.\n");
bnetz_release(bnetz, TRENN_COUNT);
return;
}
if (bnetz->dial_pos == sizeof(bnetz->dial_number) - 1) {
- PDEBUG(DBNETZ, DEBUG_NOTICE, "Received too many number digits, releaseing.\n");
+ LOGP(DBNETZ, LOGL_NOTICE, "Received too many number digits, releaseing.\n");
bnetz_release(bnetz, TRENN_COUNT);
return;
}
@@ -517,27 +521,27 @@ void bnetz_receive_telegramm(bnetz_t *bnetz, uint16_t telegramm)
switch (digit) {
case 's':
if (bnetz->dial_type != DIAL_TYPE_NOMETER) {
- PDEBUG(DBNETZ, DEBUG_NOTICE, "Repeated start message ('Funkwahl') does not match first one (no metering support), releaseing.\n");
+ LOGP(DBNETZ, LOGL_NOTICE, "Repeated start message ('Funkwahl') does not match first one (no metering support), releaseing.\n");
bnetz_release(bnetz, TRENN_COUNT);
return;
}
break;
case 'S':
if (bnetz->dial_type != DIAL_TYPE_METER) {
- PDEBUG(DBNETZ, DEBUG_NOTICE, "Repeated start message ('Funkwahl') does not match first one (metering support), releaseing.\n");
+ LOGP(DBNETZ, LOGL_NOTICE, "Repeated start message ('Funkwahl') does not match first one (metering support), releaseing.\n");
bnetz_release(bnetz, TRENN_COUNT);
return;
}
break;
case 'M':
if (bnetz->dial_type != DIAL_TYPE_METER_MUENZ) {
- PDEBUG(DBNETZ, DEBUG_NOTICE, "Repeated start message ('Funkwahl') does not match first one (metering support, payphone), releaseing.\n");
+ LOGP(DBNETZ, LOGL_NOTICE, "Repeated start message ('Funkwahl') does not match first one (metering support, payphone), releaseing.\n");
bnetz_release(bnetz, TRENN_COUNT);
return;
}
break;
default:
- PDEBUG(DBNETZ, DEBUG_NOTICE, "Repeated digit is not a start digit ('Funkwahl'), releaseing.\n");
+ LOGP(DBNETZ, LOGL_NOTICE, "Repeated digit is not a start digit ('Funkwahl'), releaseing.\n");
bnetz_release(bnetz, TRENN_COUNT);
return;
}
@@ -546,12 +550,12 @@ void bnetz_receive_telegramm(bnetz_t *bnetz, uint16_t telegramm)
break;
case DIAL_MODE_STATIONID2:
if (digit < '0' || digit > '9') {
- PDEBUG(DBNETZ, DEBUG_NOTICE, "Received message that is not a valid station id digit, releaseing.\n");
+ LOGP(DBNETZ, LOGL_NOTICE, "Received message that is not a valid station id digit, releaseing.\n");
bnetz_release(bnetz, TRENN_COUNT);
return;
}
if (bnetz->station_id[bnetz->dial_pos++] != digit) {
- PDEBUG(DBNETZ, DEBUG_NOTICE, "Repeated station id does not match the first one, releaseing.\n");
+ LOGP(DBNETZ, LOGL_NOTICE, "Repeated station id does not match the first one, releaseing.\n");
bnetz_release(bnetz, TRENN_COUNT);
return;
}
@@ -567,43 +571,40 @@ void bnetz_receive_telegramm(bnetz_t *bnetz, uint16_t telegramm)
strcpy(dialing + 1, bnetz->dial_number);
if (bnetz->dial_pos != (int)strlen(bnetz->dial_number)) {
- PDEBUG(DBNETZ, DEBUG_NOTICE, "Received too few repeated number digits, releaseing.\n");
+ LOGP(DBNETZ, LOGL_NOTICE, "Received too few repeated number digits, releaseing.\n");
bnetz_release(bnetz, TRENN_COUNT);
return;
}
if (!strncmp(dialing, "0110", 4)) {
- PDEBUG(DBNETZ, DEBUG_INFO, "Translating emergency number to '110'.\n");
+ LOGP(DBNETZ, LOGL_INFO, "Translating emergency number to '110'.\n");
strcpy(dialing, "110");
}
if (!strncmp(dialing, "0112", 4)) {
- PDEBUG(DBNETZ, DEBUG_INFO, "Translating emergency number to '112'.\n");
+ LOGP(DBNETZ, LOGL_INFO, "Translating emergency number to '112'.\n");
strcpy(dialing, "112");
}
- PDEBUG(DBNETZ, DEBUG_INFO, "Dialing complete %s->%s, call established.\n", bnetz->station_id, dialing);
- timer_stop(&bnetz->timer);
+ LOGP(DBNETZ, LOGL_INFO, "Dialing complete %s->%s, call established.\n", bnetz->station_id, dialing);
+ osmo_timer_del(&bnetz->timer);
bnetz_set_dsp_mode(bnetz, DSP_MODE_AUDIO);
bnetz_new_state(bnetz, BNETZ_GESPRAECH);
- /* start metering pulses if enabled and supported by phone or if forced */
- if (bnetz->metering < 0 || (bnetz->metering > 0 && (bnetz->dial_type == DIAL_TYPE_METER || bnetz->dial_type == DIAL_TYPE_METER_MUENZ)))
- timer_start(&bnetz->timer, METERING_START);
/* setup call */
- PDEBUG(DBNETZ, DEBUG_INFO, "Setup call to network.\n");
+ LOGP(DBNETZ, LOGL_INFO, "Setup call to network.\n");
bnetz->callref = call_up_setup(bnetz->station_id, dialing, OSMO_CC_NETWORK_BNETZ_MUENZ, (bnetz->dial_type == DIAL_TYPE_METER_MUENZ) ? "MUENZ" : "");
break;
}
if (digit < '0' || digit > '9') {
- PDEBUG(DBNETZ, DEBUG_NOTICE, "Received message that is not a valid number digit, releaseing.\n");
+ LOGP(DBNETZ, LOGL_NOTICE, "Received message that is not a valid number digit, releaseing.\n");
bnetz_release(bnetz, TRENN_COUNT);
return;
}
if (bnetz->dial_pos == (int)strlen(bnetz->dial_number)) {
- PDEBUG(DBNETZ, DEBUG_NOTICE, "Received too many number digits, releaseing.\n");
+ LOGP(DBNETZ, LOGL_NOTICE, "Received too many number digits, releaseing.\n");
bnetz_release(bnetz, TRENN_COUNT);
return;
}
if (bnetz->dial_number[bnetz->dial_pos++] != digit) {
- PDEBUG(DBNETZ, DEBUG_NOTICE, "Repeated number does not match the first one, releaseing.\n");
+ LOGP(DBNETZ, LOGL_NOTICE, "Repeated number does not match the first one, releaseing.\n");
bnetz_release(bnetz, TRENN_COUNT);
return;
}
@@ -618,7 +619,7 @@ lets see, if noise will not generate a release signal....
return;
#endif
if (digit == 't') {
- PDEBUG(DBNETZ, DEBUG_NOTICE, "Received 'Schlusssignal' from mobile station\n");
+ LOGP(DBNETZ, LOGL_NOTICE, "Received 'Schlusssignal' from mobile station\n");
bnetz_release(bnetz, TRENN_COUNT);
call_up_release(bnetz->callref, CAUSE_NORMAL);
bnetz->callref = 0;
@@ -631,38 +632,39 @@ lets see, if noise will not generate a release signal....
}
/* Timeout handling */
-static void bnetz_timeout(struct timer *timer)
+static void bnetz_timeout(void *data)
{
- bnetz_t *bnetz = (bnetz_t *)timer->priv;
+ bnetz_t *bnetz = data;
+ int to_sec, to_usec;
switch (bnetz->state) {
case BNETZ_WAHLABRUF:
- PDEBUG_CHAN(DBNETZ, DEBUG_NOTICE, "Timeout while receiving call setup from mobile station, releasing.\n");
+ LOGP_CHAN(DBNETZ, LOGL_NOTICE, "Timeout while receiving call setup from mobile station, releasing.\n");
bnetz_release(bnetz, TRENN_COUNT);
break;
case BNETZ_SELEKTIVRUF_EIN:
- PDEBUG_CHAN(DBNETZ, DEBUG_DEBUG, "Transmitter switched to channel 19, starting paging telegramms.\n");
+ LOGP_CHAN(DBNETZ, LOGL_DEBUG, "Transmitter switched to channel 19, starting paging telegramms.\n");
bnetz_set_dsp_mode(bnetz, DSP_MODE_TELEGRAMM);
break;
case BNETZ_SELEKTIVRUF_AUS:
- PDEBUG_CHAN(DBNETZ, DEBUG_DEBUG, "Transmitter switched back to channel %s, waiting for paging response.\n", bnetz->sender.kanal);
+ LOGP_CHAN(DBNETZ, LOGL_DEBUG, "Transmitter switched back to channel %s, waiting for paging response.\n", bnetz->sender.kanal);
bnetz_new_state(bnetz, BNETZ_RUFBESTAETIGUNG);
switch_channel_19(bnetz, 0);
- timer_start(&bnetz->timer, PAGING_TO);
+ osmo_timer_schedule(&bnetz->timer, PAGING_TO);
break;
case BNETZ_RUFBESTAETIGUNG:
if (bnetz->page_try == PAGE_TRIES) {
- PDEBUG_CHAN(DBNETZ, DEBUG_NOTICE, "Timeout while waiting for call acknowledge from mobile station, releasing.\n");
+ LOGP_CHAN(DBNETZ, LOGL_NOTICE, "Timeout while waiting for call acknowledge from mobile station, releasing.\n");
bnetz_release(bnetz, TRENN_COUNT);
call_up_release(bnetz->callref, CAUSE_OUTOFORDER);
bnetz->callref = 0;
break;
}
- PDEBUG_CHAN(DBNETZ, DEBUG_NOTICE, "Timeout while waiting for call acknowledge from mobile station, trying again.\n");
+ LOGP_CHAN(DBNETZ, LOGL_NOTICE, "Timeout while waiting for call acknowledge from mobile station, trying again.\n");
bnetz_page(bnetz, bnetz->station_id, bnetz->page_try + 1);
break;
case BNETZ_RUFHALTUNG:
- PDEBUG_CHAN(DBNETZ, DEBUG_NOTICE, "Timeout while waiting for answer of mobile station, releasing.\n");
+ LOGP_CHAN(DBNETZ, LOGL_NOTICE, "Timeout while waiting for answer of mobile station, releasing.\n");
bnetz_release(bnetz, TRENN_COUNT);
call_up_release(bnetz->callref, CAUSE_NOANSWER);
bnetz->callref = 0;
@@ -672,12 +674,21 @@ static void bnetz_timeout(struct timer *timer)
case DSP_MODE_AUDIO:
/* turn on merting pulse */
bnetz_set_dsp_mode(bnetz, DSP_MODE_AUDIO_METER);
- timer_start(&bnetz->timer, METERING_DURATION);
+ osmo_timer_schedule(&bnetz->timer, 0, METERING_DURATION_US);
break;
case DSP_MODE_AUDIO_METER:
/* turn off and wait given seconds for next metering cycle */
bnetz_set_dsp_mode(bnetz, DSP_MODE_AUDIO);
- timer_start(&bnetz->timer, (double)abs(bnetz->metering) - METERING_DURATION);
+ /* if metering has been disabled due to disconnect (must be at least 1s) */
+ if (!bnetz->metering_tv.tv_sec)
+ break;
+ to_sec = bnetz->metering_tv.tv_sec;
+ to_usec = bnetz->metering_tv.tv_usec - METERING_DURATION_US;
+ if (to_usec < 0) {
+ to_usec += 1000000;
+ to_sec--;
+ }
+ osmo_timer_schedule(&bnetz->timer, to_sec, to_usec);
break;
default:
break;
@@ -701,7 +712,7 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
break;
}
if (sender) {
- PDEBUG(DBNETZ, DEBUG_NOTICE, "Outgoing call to busy number, rejecting!\n");
+ LOGP(DBNETZ, LOGL_NOTICE, "Outgoing call to busy number, rejecting!\n");
return -CAUSE_BUSY;
}
@@ -712,11 +723,11 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
break;
}
if (!sender) {
- PDEBUG(DBNETZ, DEBUG_NOTICE, "Outgoing call, but no free channel, rejecting!\n");
+ LOGP(DBNETZ, LOGL_NOTICE, "Outgoing call, but no free channel, rejecting!\n");
return -CAUSE_NOCHANNEL;
}
- PDEBUG_CHAN(DBNETZ, DEBUG_INFO, "Call to mobile station, paging station id '%s'\n", dialing);
+ LOGP_CHAN(DBNETZ, LOGL_INFO, "Call to mobile station, paging station id '%s'\n", dialing);
/* 3. trying to page mobile station */
bnetz->callref = callref;
@@ -725,8 +736,35 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
return 0;
}
-void call_down_answer(int __attribute__((unused)) callref)
+void call_down_answer(int callref, struct timeval *tv_meter)
{
+ sender_t *sender;
+ bnetz_t *bnetz;
+
+ LOGP(DBNETZ, LOGL_INFO, "Call has been answered by network.\n");
+
+ for (sender = sender_head; sender; sender = sender->next) {
+ bnetz = (bnetz_t *) sender;
+ if (bnetz->callref == callref)
+ break;
+ }
+ if (!sender) {
+ LOGP(DBNETZ, LOGL_NOTICE, "Incoming answer, but no callref!\n");
+ return;
+ }
+
+ /* At least tone second! */
+ if (tv_meter->tv_sec) {
+ LOGP(DBNETZ, LOGL_INFO, "Network starts metering pulses every %lu.%03lu seconds.\n", tv_meter->tv_sec, tv_meter->tv_usec / 1000);
+ memcpy(&bnetz->metering_tv, tv_meter, sizeof(bnetz->metering_tv));
+ osmo_timer_schedule(&bnetz->timer, METERING_START);
+ } else if (bnetz->metering < 0 || (bnetz->metering > 0 && (bnetz->dial_type == DIAL_TYPE_METER || bnetz->dial_type == DIAL_TYPE_METER_MUENZ))) {
+ /* start metering pulses if enabled and supported by phone or if forced (mobile origninating call) */
+ LOGP(DBNETZ, LOGL_INFO, "Command line options starts metering pulses every %d seconds.\n", abs(bnetz->metering));
+ bnetz->metering_tv.tv_sec = abs(bnetz->metering);
+ bnetz->metering_tv.tv_usec = 0;
+ osmo_timer_schedule(&bnetz->timer, METERING_START);
+ }
}
/* Call control sends disconnect (with tones).
@@ -738,7 +776,7 @@ void call_down_disconnect(int callref, int cause)
sender_t *sender;
bnetz_t *bnetz;
- PDEBUG(DBNETZ, DEBUG_INFO, "Call has been disconnected by network.\n");
+ LOGP(DBNETZ, LOGL_INFO, "Call has been disconnected by network.\n");
for (sender = sender_head; sender; sender = sender->next) {
bnetz = (bnetz_t *) sender;
@@ -746,23 +784,27 @@ void call_down_disconnect(int callref, int cause)
break;
}
if (!sender) {
- PDEBUG(DBNETZ, DEBUG_NOTICE, "Outgoing disconnect, but no callref!\n");
+ LOGP(DBNETZ, LOGL_NOTICE, "Outgoing disconnect, but no callref!\n");
call_up_release(callref, CAUSE_INVALCALLREF);
return;
}
/* Release when not active */
- if (bnetz->state == BNETZ_GESPRAECH)
+ if (bnetz->state == BNETZ_GESPRAECH) {
+ /* stop metering */
+ bnetz->metering_tv.tv_sec = 0;
+ bnetz->metering_tv.tv_usec = 0;
return;
+ }
switch (bnetz->state) {
case BNETZ_SELEKTIVRUF_EIN:
case BNETZ_SELEKTIVRUF_AUS:
case BNETZ_RUFBESTAETIGUNG:
- PDEBUG_CHAN(DBNETZ, DEBUG_NOTICE, "Outgoing disconnect, during paging, releasing!\n");
+ LOGP_CHAN(DBNETZ, LOGL_NOTICE, "Outgoing disconnect, during paging, releasing!\n");
bnetz_release(bnetz, TRENN_COUNT);
break;
case BNETZ_RUFHALTUNG:
- PDEBUG_CHAN(DBNETZ, DEBUG_NOTICE, "Outgoing disconnect, during alerting, releasing!\n");
+ LOGP_CHAN(DBNETZ, LOGL_NOTICE, "Outgoing disconnect, during alerting, releasing!\n");
bnetz_release(bnetz, TRENN_COUNT);
break;
default:
@@ -780,7 +822,7 @@ void call_down_release(int callref, int __attribute__((unused)) cause)
sender_t *sender;
bnetz_t *bnetz;
- PDEBUG(DBNETZ, DEBUG_INFO, "Call has been released by network, releasing call.\n");
+ LOGP(DBNETZ, LOGL_INFO, "Call has been released by network, releasing call.\n");
for (sender = sender_head; sender; sender = sender->next) {
bnetz = (bnetz_t *) sender;
@@ -788,7 +830,7 @@ void call_down_release(int callref, int __attribute__((unused)) cause)
break;
}
if (!sender) {
- PDEBUG(DBNETZ, DEBUG_NOTICE, "Outgoing release, but no callref!\n");
+ LOGP(DBNETZ, LOGL_NOTICE, "Outgoing release, but no callref!\n");
/* don't send release, because caller already released */
return;
}
@@ -797,17 +839,17 @@ void call_down_release(int callref, int __attribute__((unused)) cause)
switch (bnetz->state) {
case BNETZ_GESPRAECH:
- PDEBUG_CHAN(DBNETZ, DEBUG_NOTICE, "Outgoing release, during call, releasing!\n");
+ LOGP_CHAN(DBNETZ, LOGL_NOTICE, "Outgoing release, during call, releasing!\n");
bnetz_release(bnetz, TRENN_COUNT);
break;
case BNETZ_SELEKTIVRUF_EIN:
case BNETZ_SELEKTIVRUF_AUS:
case BNETZ_RUFBESTAETIGUNG:
- PDEBUG_CHAN(DBNETZ, DEBUG_NOTICE, "Outgoing release, during paging, releasing!\n");
+ LOGP_CHAN(DBNETZ, LOGL_NOTICE, "Outgoing release, during paging, releasing!\n");
bnetz_release(bnetz, TRENN_COUNT);
break;
case BNETZ_RUFHALTUNG:
- PDEBUG_CHAN(DBNETZ, DEBUG_NOTICE, "Outgoing release, during alerting, releasing!\n");
+ LOGP_CHAN(DBNETZ, LOGL_NOTICE, "Outgoing release, during alerting, releasing!\n");
bnetz_release(bnetz, TRENN_COUNT);
break;
default:
@@ -815,27 +857,5 @@ void call_down_release(int callref, int __attribute__((unused)) cause)
}
}
-/* Receive audio from call instance. */
-void call_down_audio(int callref, uint16_t sequence, uint32_t timestamp, uint32_t ssrc, sample_t *samples, int count)
-{
- sender_t *sender;
- bnetz_t *bnetz;
-
- for (sender = sender_head; sender; sender = sender->next) {
- bnetz = (bnetz_t *) sender;
- if (bnetz->callref == callref)
- break;
- }
- if (!sender)
- return;
-
- if (bnetz->dsp_mode == DSP_MODE_AUDIO
- || bnetz->dsp_mode == DSP_MODE_AUDIO_METER) {
- jitter_save(&bnetz->sender.dejitter, samples, count, 1, sequence, timestamp, ssrc);
- }
-}
-
-void call_down_clock(void) {}
-
void dump_info(void) {}