aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am8
-rw-r--r--src/amps/Makefile.am26
-rw-r--r--src/amps/amps.c272
-rw-r--r--src/amps/amps.h5
-rw-r--r--src/amps/dsp.c92
-rw-r--r--src/amps/esn.c153
-rw-r--r--src/amps/esn.h3
-rw-r--r--src/amps/frame.c79
-rw-r--r--src/amps/jtacs_tones.c1
-rw-r--r--src/amps/main_common.c16
-rw-r--r--src/amps/sysinfo.c1
-rw-r--r--src/amps/tacs_outoforder.c1
-rw-r--r--src/amps/tacs_tones.c1
-rw-r--r--src/amps/transaction.c30
-rw-r--r--src/amps/transaction.h4
-rw-r--r--src/amps/usa_congestion.c1
-rw-r--r--src/amps/usa_invalidnumber.c1
-rw-r--r--src/amps/usa_noanswer.c1
-rw-r--r--src/amps/usa_outoforder.c1
-rw-r--r--src/amps/usa_tones.c1
-rw-r--r--src/anetz/Makefile.am9
-rw-r--r--src/anetz/anetz.c126
-rw-r--r--src/anetz/anetz.h2
-rw-r--r--src/anetz/besetztton.c1
-rw-r--r--src/anetz/dsp.c57
-rw-r--r--src/anetz/freiton.c1
-rw-r--r--src/anetz/main.c5
-rw-r--r--src/anetz/stations.c45
-rw-r--r--src/bnetz/Makefile.am13
-rw-r--r--src/bnetz/bnetz.c288
-rw-r--r--src/bnetz/bnetz.h5
-rw-r--r--src/bnetz/dialer.c37
-rw-r--r--src/bnetz/dsp.c63
-rw-r--r--src/bnetz/main.c5
-rw-r--r--src/bnetz/stations.c5
-rw-r--r--src/cnetz/Makefile.am9
-rw-r--r--src/cnetz/cnetz.c401
-rw-r--r--src/cnetz/cnetz.h10
-rw-r--r--src/cnetz/database.c51
-rw-r--r--src/cnetz/dsp.c87
-rw-r--r--src/cnetz/fsk_demod.c14
-rw-r--r--src/cnetz/main.c7
-rw-r--r--src/cnetz/telegramm.c74
-rw-r--r--src/cnetz/transaction.c40
-rw-r--r--src/cnetz/transaction.h8
-rw-r--r--src/datenklo/Makefile.am7
-rw-r--r--src/datenklo/am791x.c228
-rw-r--r--src/datenklo/am791x.h4
-rw-r--r--src/datenklo/datenklo.c249
-rw-r--r--src/datenklo/datenklo.h3
-rw-r--r--src/datenklo/device.c34
-rw-r--r--src/datenklo/main.c23
-rw-r--r--src/datenklo/uart.c6
-rw-r--r--src/dcf77/Makefile.am5
-rw-r--r--src/dcf77/dcf77.c110
-rwxr-xr-xsrc/dcf77/main.c118
-rw-r--r--src/dcf77/weather.c14
-rw-r--r--src/eurosignal/Makefile.am9
-rw-r--r--src/eurosignal/dsp.c30
-rw-r--r--src/eurosignal/es_ges.c1
-rw-r--r--src/eurosignal/es_kaudn.c1
-rw-r--r--src/eurosignal/es_mitte.c1
-rw-r--r--src/eurosignal/es_teilges.c1
-rw-r--r--src/eurosignal/eurosignal.c124
-rw-r--r--src/eurosignal/eurosignal.h4
-rw-r--r--src/eurosignal/main.c11
-rw-r--r--src/fuenf/Makefile.am9
-rw-r--r--src/fuenf/dsp.c89
-rw-r--r--src/fuenf/fuenf.c68
-rw-r--r--src/fuenf/main.c15
-rw-r--r--src/fuvst/Makefile.am16
-rwxr-xr-xsrc/fuvst/fuvst.c213
-rwxr-xr-xsrc/fuvst/main.c5
-rwxr-xr-xsrc/fuvst/mup.c157
-rw-r--r--src/fuvst/sniffer.c32
-rw-r--r--src/fuvst/systemmeldungen.c6
-rw-r--r--src/golay/Makefile.am9
-rw-r--r--src/golay/dsp.c68
-rw-r--r--src/golay/golay.c282
-rw-r--r--src/golay/golay.h23
-rw-r--r--src/golay/main.c6
-rw-r--r--src/imts/Makefile.am12
-rw-r--r--src/imts/dialer.c24
-rw-r--r--src/imts/dsp.c66
-rw-r--r--src/imts/image.c7
-rw-r--r--src/imts/imts.c472
-rw-r--r--src/imts/imts.h4
-rw-r--r--src/imts/main.c15
-rw-r--r--src/jolly/Makefile.am9
-rw-r--r--src/jolly/dsp.c74
-rw-r--r--src/jolly/jolly.c178
-rw-r--r--src/jolly/jolly.h6
-rw-r--r--src/jolly/main.c7
-rw-r--r--src/jolly/voice.c38
-rw-r--r--src/libaaimage/Makefile.am2
-rw-r--r--src/libam/Makefile.am2
-rw-r--r--src/libam/am.c2
-rw-r--r--src/libclipper/Makefile.am2
-rw-r--r--src/libcompandor/Makefile.am2
-rw-r--r--src/libcompandor/compandor.c22
-rw-r--r--src/libcompandor/compandor.h3
-rw-r--r--src/libdebug/Makefile.am7
-rwxr-xr-xsrc/libdebug/debug.c330
-rw-r--r--src/libdebug/debug.h86
-rw-r--r--src/libdisplay/Makefile.am2
-rw-r--r--src/libdisplay/display_iq.c20
-rw-r--r--src/libdisplay/display_measurements.c19
-rw-r--r--src/libdisplay/display_spectrum.c21
-rw-r--r--src/libdisplay/display_status.c14
-rw-r--r--src/libdisplay/display_wave.c20
-rw-r--r--src/libdtmf/Makefile.am2
-rw-r--r--src/libdtmf/dtmf_decode.c18
-rw-r--r--src/libdtmf/dtmf_decode.h6
-rw-r--r--src/libemphasis/Makefile.am2
-rw-r--r--src/libfft/Makefile.am2
-rw-r--r--src/libfilter/Makefile.am2
-rw-r--r--src/libfilter/iir_filter.c5
-rw-r--r--src/libfilter/iir_filter.h2
-rw-r--r--src/libfm/Makefile.am2
-rw-r--r--src/libfm/fm.c2
-rw-r--r--src/libfsk/Makefile.am2
-rw-r--r--src/libfsk/fsk.c44
-rw-r--r--src/libg711/Makefile.am7
-rw-r--r--src/libg711/g711.c537
-rw-r--r--src/libg711/g711.h17
-rw-r--r--src/libgoertzel/Makefile.am2
-rw-r--r--src/libgoertzel/goertzel.c2
-rw-r--r--src/libhagelbarger/Makefile.am2
-rw-r--r--src/libhagelbarger/hagelbarger.c3
-rw-r--r--src/libimage/Makefile.am3
-rw-r--r--src/libjitter/Makefile.am2
-rw-r--r--src/libjitter/jitter.c580
-rw-r--r--src/libjitter/jitter.h67
-rw-r--r--src/liblogging/Makefile.am8
-rw-r--r--src/liblogging/categories.c227
-rw-r--r--src/liblogging/categories.h50
-rw-r--r--src/liblogging/logging.c264
-rw-r--r--src/liblogging/logging.h21
-rw-r--r--src/libmobile/Makefile.am3
-rw-r--r--src/libmobile/call.c210
-rw-r--r--src/libmobile/call.h12
-rwxr-xr-xsrc/libmobile/console.c196
-rw-r--r--src/libmobile/console.h6
-rw-r--r--src/libmobile/get_time.c13
-rw-r--r--src/libmobile/get_time.h3
-rw-r--r--src/libmobile/main_mobile.c101
-rw-r--r--src/libmobile/main_mobile.h5
-rw-r--r--src/libmobile/sender.c88
-rw-r--r--src/libmobile/sender.h11
-rw-r--r--src/libmobile/testton.c1
-rw-r--r--src/libmtp/Makefile.am2
-rwxr-xr-xsrc/libmtp/layer2.c248
-rw-r--r--src/libmtp/layer3.c17
-rw-r--r--src/libmtp/mtp.c36
-rw-r--r--src/libmtp/mtp.h8
-rw-r--r--src/liboptions/Makefile.am2
-rw-r--r--src/liboptions/options.c68
-rw-r--r--src/liboptions/options.h1
-rw-r--r--src/libosmocc/Makefile.am15
-rw-r--r--src/libosmocc/cause.c251
-rw-r--r--src/libosmocc/cause.h5
-rw-r--r--src/libosmocc/endpoint.c1584
-rw-r--r--src/libosmocc/endpoint.h131
-rw-r--r--src/libosmocc/helper.c193
-rw-r--r--src/libosmocc/helper.h13
-rw-r--r--src/libosmocc/message.c1291
-rw-r--r--src/libosmocc/message.h512
-rw-r--r--src/libosmocc/rtp.c404
-rw-r--r--src/libosmocc/rtp.h8
-rw-r--r--src/libosmocc/screen.c693
-rw-r--r--src/libosmocc/screen.h7
-rw-r--r--src/libosmocc/sdp.c544
-rw-r--r--src/libosmocc/sdp.h6
-rw-r--r--src/libosmocc/session.c640
-rw-r--r--src/libosmocc/session.h130
-rw-r--r--src/libosmocc/socket.c583
-rw-r--r--src/libosmocc/socket.h44
-rw-r--r--src/libsample/Makefile.am2
-rw-r--r--src/libsamplerate/Makefile.am2
-rw-r--r--src/libscrambler/Makefile.am2
-rw-r--r--src/libsdr/Makefile.am3
-rw-r--r--src/libsdr/sdr.c145
-rw-r--r--src/libsdr/sdr.h2
-rw-r--r--src/libsdr/soapy.c114
-rw-r--r--src/libsdr/uhd.c136
-rw-r--r--src/libsendevolumenregler/Makefile.am2
-rw-r--r--src/libserial/Makefile.am2
-rwxr-xr-xsrc/libserial/serial.c6
-rw-r--r--src/libsound/Makefile.am2
-rw-r--r--src/libsound/sound.h10
-rw-r--r--src/libsound/sound_alsa.c153
-rw-r--r--src/libsquelch/Makefile.am2
-rw-r--r--src/libsquelch/squelch.c14
-rw-r--r--src/libtimer/Makefile.am6
-rw-r--r--src/libtimer/timer.c119
-rw-r--r--src/libtimer/timer.h18
-rw-r--r--src/libv27/Makefile.am2
-rw-r--r--src/libv27/modem.c2
-rw-r--r--src/libv27/psk.c22
-rw-r--r--src/libwave/Makefile.am2
-rw-r--r--src/libwave/wave.c60
-rw-r--r--src/magnetic/Makefile.am5
-rwxr-xr-xsrc/magnetic/magnetic.ino9
-rw-r--r--src/magnetic/main.c40
-rw-r--r--src/mate/Makefile.am29
-rw-r--r--src/mate/matesimulator.c322
-rw-r--r--src/mpt1327/Makefile.am9
-rw-r--r--src/mpt1327/dsp.c68
-rw-r--r--src/mpt1327/main.c5
-rw-r--r--src/mpt1327/message.c14
-rwxr-xr-xsrc/mpt1327/mpt1327.c324
-rwxr-xr-xsrc/mpt1327/mpt1327.h7
-rw-r--r--src/nmt/Makefile.am9
-rw-r--r--src/nmt/countries.c2
-rw-r--r--src/nmt/dms.c97
-rw-r--r--src/nmt/dsp.c70
-rw-r--r--src/nmt/frame.c36
-rw-r--r--src/nmt/main.c3
-rw-r--r--src/nmt/nmt.c439
-rw-r--r--src/nmt/nmt.h6
-rw-r--r--src/nmt/sms.c113
-rw-r--r--src/nmt/tones.c1
-rw-r--r--src/nmt/transaction.c24
-rw-r--r--src/nmt/transaction.h2
-rw-r--r--src/pocsag/Makefile.am9
-rw-r--r--src/pocsag/dsp.c14
-rw-r--r--src/pocsag/frame.c129
-rw-r--r--src/pocsag/frame.h1
-rw-r--r--src/pocsag/main.c33
-rw-r--r--src/pocsag/pocsag.c160
-rw-r--r--src/pocsag/pocsag.h7
-rw-r--r--src/r2000/Makefile.am9
-rw-r--r--src/r2000/dsp.c61
-rw-r--r--src/r2000/frame.c38
-rw-r--r--src/r2000/main.c3
-rw-r--r--src/r2000/r2000.c302
-rw-r--r--src/r2000/r2000.h4
-rw-r--r--src/r2000/tones.c1
-rw-r--r--src/radio/Makefile.am6
-rw-r--r--src/radio/main.c21
-rw-r--r--src/radio/radio.c130
-rw-r--r--src/radio/radio.h4
-rw-r--r--src/sim/Makefile.am5
-rw-r--r--src/sim/main.c38
-rw-r--r--src/sim/sim.c221
-rw-r--r--src/sim/sim.h9
-rw-r--r--src/sim/sim.ino6
-rw-r--r--src/sim/sniffer.c298
-rw-r--r--src/test/Makefile.am28
-rw-r--r--src/test/dummy.c9
-rw-r--r--src/test/test_compandor.c3
-rw-r--r--src/test/test_dms.c19
-rw-r--r--src/test/test_dtmf.c7
-rw-r--r--src/test/test_emphasis.c2
-rw-r--r--src/test/test_filter.c21
-rw-r--r--src/test/test_goertzel.c2
-rw-r--r--src/test/test_performance.c2
-rw-r--r--src/test/test_sms.c25
-rw-r--r--src/tv/Makefile.am9
-rw-r--r--src/tv/channels.c1
-rw-r--r--src/tv/main.c21
-rw-r--r--src/zeitansage/Makefile.am9
-rw-r--r--src/zeitansage/main.c2
-rw-r--r--src/zeitansage/samples.c1
-rw-r--r--src/zeitansage/zeitansage.c39
-rw-r--r--src/zeitansage/zeitansage.h4
266 files changed, 6776 insertions, 12872 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index d81dbd7..71f3191 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,8 +1,8 @@
AUTOMAKE_OPTIONS = foreign
SUBDIRS = \
+ liblogging \
liboptions \
- libdebug \
libmobile \
libdisplay \
libsample \
@@ -14,7 +14,6 @@ SUBDIRS = \
libsquelch \
libhagelbarger \
libdtmf \
- libtimer \
libsamplerate \
libscrambler \
libemphasis \
@@ -28,8 +27,6 @@ SUBDIRS = \
libserial \
libv27 \
libmtp \
- libosmocc \
- libg711 \
libaaimage
if HAVE_ALSA
@@ -62,7 +59,8 @@ SUBDIRS += \
sim \
magnetic \
fuvst \
- dcf77
+ dcf77 \
+ mate
if HAVE_ALSA
if HAVE_FUSE
diff --git a/src/amps/Makefile.am b/src/amps/Makefile.am
index 2887466..a3686b0 100644
--- a/src/amps/Makefile.am
+++ b/src/amps/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
bin_PROGRAMS = \
amps tacs jtacs
@@ -11,7 +11,8 @@ libamps_a_SOURCES = \
transaction.c \
frame.c \
dsp.c \
- sysinfo.c
+ sysinfo.c \
+ esn.c
libusatone_a_SOURCES = \
usa_tones.c \
@@ -30,22 +31,21 @@ amps_LDADD = \
libamps.a \
libusatone.a \
$(top_builddir)/src/liboptions/liboptions.a \
- $(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libmobile/libmobile.a \
- $(top_builddir)/src/libosmocc/libosmocc.a \
$(top_builddir)/src/libdisplay/libdisplay.a \
$(top_builddir)/src/libcompandor/libcompandor.a \
$(top_builddir)/src/libgoertzel/libgoertzel.a \
$(top_builddir)/src/libjitter/libjitter.a \
- $(top_builddir)/src/libtimer/libtimer.a \
$(top_builddir)/src/libsamplerate/libsamplerate.a \
$(top_builddir)/src/libemphasis/libemphasis.a \
$(top_builddir)/src/libfm/libfm.a \
$(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \
- $(top_builddir)/src/libg711/libg711.a \
$(top_builddir)/src/libaaimage/libaaimage.a \
+ $(top_builddir)/src/liblogging/liblogging.a \
+ $(LIBOSMOCORE_LIBS) \
+ $(LIBOSMOCC_LIBS) \
-lm
if HAVE_ALSA
@@ -74,22 +74,21 @@ tacs_LDADD = \
$(COMMON_LA) \
libamps.a \
$(top_builddir)/src/liboptions/liboptions.a \
- $(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libmobile/libmobile.a \
- $(top_builddir)/src/libosmocc/libosmocc.a \
$(top_builddir)/src/libdisplay/libdisplay.a \
$(top_builddir)/src/libcompandor/libcompandor.a \
$(top_builddir)/src/libgoertzel/libgoertzel.a \
$(top_builddir)/src/libjitter/libjitter.a \
- $(top_builddir)/src/libtimer/libtimer.a \
$(top_builddir)/src/libsamplerate/libsamplerate.a \
$(top_builddir)/src/libemphasis/libemphasis.a \
$(top_builddir)/src/libfm/libfm.a \
$(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \
- $(top_builddir)/src/libg711/libg711.a \
$(top_builddir)/src/libaaimage/libaaimage.a \
+ $(top_builddir)/src/liblogging/liblogging.a \
+ $(LIBOSMOCORE_LIBS) \
+ $(LIBOSMOCC_LIBS) \
-lm
if HAVE_ALSA
@@ -117,22 +116,21 @@ jtacs_LDADD = \
$(COMMON_LA) \
libamps.a \
$(top_builddir)/src/liboptions/liboptions.a \
- $(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libmobile/libmobile.a \
- $(top_builddir)/src/libosmocc/libosmocc.a \
$(top_builddir)/src/libdisplay/libdisplay.a \
$(top_builddir)/src/libcompandor/libcompandor.a \
$(top_builddir)/src/libgoertzel/libgoertzel.a \
$(top_builddir)/src/libjitter/libjitter.a \
- $(top_builddir)/src/libtimer/libtimer.a \
$(top_builddir)/src/libsamplerate/libsamplerate.a \
$(top_builddir)/src/libemphasis/libemphasis.a \
$(top_builddir)/src/libfm/libfm.a \
$(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \
- $(top_builddir)/src/libg711/libg711.a \
$(top_builddir)/src/libaaimage/libaaimage.a \
+ $(top_builddir)/src/liblogging/liblogging.a \
+ $(LIBOSMOCORE_LIBS) \
+ $(LIBOSMOCC_LIBS) \
-lm
if HAVE_ALSA
diff --git a/src/amps/amps.c b/src/amps/amps.c
index 747b470..ad2881d 100644
--- a/src/amps/amps.c
+++ b/src/amps/amps.c
@@ -43,28 +43,30 @@
#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/console.h"
+#include <osmocom/cc/message.h>
#include "amps.h"
#include "dsp.h"
#include "frame.h"
#include "stations.h"
+#include "esn.h"
#include "main.h"
/* Uncomment this to test SAT via loopback */
//#define DEBUG_VC
-#define SAT_TO1 5.0 /* 5 sec to detect after setup */
-#define SAT_TO2 5.0 /* 5 sec lost until abort (specs say 5) */
-#define PAGE_TRIES 2 /* how many times to page the phone */
-#define PAGE_TO1 8.0 /* max time to wait for paging reply */
-#define PAGE_TO2 4.0 /* max time to wait for last paging reply */
-#define ALERT_TRIES 3 /* how many times to alert the phone */
-#define ALERT_TO 0.6 /* max time to wait for alert confirm */
-#define ANSWER_TO 60.0 /* max time to wait for answer */
-#define RELEASE_TIMER 5.0 /* max time to send release messages */
+#define SAT_TO1 5,0 /* 5 sec to detect after setup */
+#define SAT_TO2 5,0 /* 5 sec lost until abort (specs say 5) */
+#define PAGE_TRIES 2 /* how many times to page the phone */
+#define PAGE_TO1 8,0 /* max time to wait for paging reply */
+#define PAGE_TO2 4,0 /* max time to wait for last paging reply */
+#define ALERT_TRIES 3 /* how many times to alert the phone */
+#define ALERT_TO 0,600000 /* max time to wait for alert confirm */
+#define ANSWER_TO 60,0 /* max time to wait for answer */
+#define RELEASE_TIMER 5,0 /* max time to send release messages */
/* Convert channel number to frequency number of base station.
Set 'uplink' to 1 to get frequency of mobile station. */
@@ -340,7 +342,7 @@ const char *amps_scm(uint8_t scm)
return text;
}
-const char *amps_mpci(uint8_t mpci)
+static const char *amps_mpci(uint8_t mpci)
{
switch (mpci) {
case 0:
@@ -357,7 +359,7 @@ const char *amps_mpci(uint8_t mpci)
}
-const char *amps_state_name(enum amps_state state)
+static const char *amps_state_name(enum amps_state state)
{
static char invalid[16];
@@ -394,7 +396,7 @@ static void amps_new_state(amps_t *amps, enum amps_state new_state)
{
if (amps->state == new_state)
return;
- PDEBUG_CHAN(DAMPS, DEBUG_DEBUG, "State change: %s -> %s\n", amps_state_name(amps->state), amps_state_name(new_state));
+ LOGP_CHAN(DAMPS, LOGL_DEBUG, "State change: %s -> %s\n", amps_state_name(amps->state), amps_state_name(new_state));
amps->state = new_state;
amps_display_status();
}
@@ -428,7 +430,7 @@ int amps_channel_by_short_name(const char *short_name)
for (i = 0; amps_channels[i].short_name; i++) {
if (!strcasecmp(amps_channels[i].short_name, short_name)) {
- PDEBUG(DAMPS, DEBUG_INFO, "Selecting channel '%s' = %s\n", amps_channels[i].short_name, amps_channels[i].long_name);
+ LOGP(DAMPS, LOGL_INFO, "Selecting channel '%s' = %s\n", amps_channels[i].short_name, amps_channels[i].long_name);
return amps_channels[i].chan_type;
}
}
@@ -527,15 +529,15 @@ int amps_create(const char *kanal, enum amps_chan_type chan_type, const char *de
/* check for channel number */
if (amps_channel2freq(atoi(kanal), 0) == 0) {
- PDEBUG(DAMPS, DEBUG_ERROR, "Channel number %s invalid.\n", kanal);
+ LOGP(DAMPS, LOGL_ERROR, "Channel number %s invalid.\n", kanal);
if (jtacs)
- PDEBUG(DAMPS, DEBUG_ERROR, "Try an even channel number, like 440.\n");
+ LOGP(DAMPS, LOGL_ERROR, "Try an even channel number, like 440.\n");
return -EINVAL;
}
/* no paging channel (without control channel) support */
if (chan_type == CHAN_TYPE_PC) {
- PDEBUG(DAMPS, DEBUG_ERROR, "Dedicated paging channel currently not supported. Please select CC/PC or CC/PC/VC instead.\n");
+ LOGP(DAMPS, LOGL_ERROR, "Dedicated paging channel currently not supported. Please select CC/PC or CC/PC/VC instead.\n");
return -EINVAL;
}
@@ -544,7 +546,7 @@ int amps_create(const char *kanal, enum amps_chan_type chan_type, const char *de
for (sender = sender_head; sender; sender = sender->next) {
amps = (amps_t *)sender;
if (amps->chan_type == CHAN_TYPE_PC || amps->chan_type == CHAN_TYPE_CC_PC || amps->chan_type == CHAN_TYPE_CC_PC_VC) {
- PDEBUG(DAMPS, DEBUG_ERROR, "Only one paging channel is currently supported. Please check your channel types.\n");
+ LOGP(DAMPS, LOGL_ERROR, "Only one paging channel is currently supported. Please check your channel types.\n");
return -EINVAL;
}
}
@@ -553,51 +555,51 @@ int amps_create(const char *kanal, enum amps_chan_type chan_type, const char *de
/* check if channel type matches channel number */
ct = amps_channel2type(atoi(kanal));
if (ct == CHAN_TYPE_CC && chan_type != CHAN_TYPE_PC && chan_type != CHAN_TYPE_CC_PC && chan_type != CHAN_TYPE_CC_PC_VC) {
- PDEBUG(DAMPS, DEBUG_NOTICE, "Channel number %s belongs to a control channel, but your channel type '%s' requires to be on a voice channel number. Some phone may reject this, but all my phones don't.\n", kanal, chan_type_long_name(chan_type));
+ LOGP(DAMPS, LOGL_NOTICE, "Channel number %s belongs to a control channel, but your channel type '%s' requires to be on a voice channel number. Some phone may reject this, but all my phones don't.\n", kanal, chan_type_long_name(chan_type));
}
if (ct == CHAN_TYPE_VC && chan_type != CHAN_TYPE_VC) {
- PDEBUG(DAMPS, DEBUG_ERROR, "Channel number %s belongs to a voice channel, but your channel type '%s' requires to be on a control channel number. Please use correct channel.\n", kanal, chan_type_long_name(chan_type));
+ LOGP(DAMPS, LOGL_ERROR, "Channel number %s belongs to a voice channel, but your channel type '%s' requires to be on a control channel number. Please use correct channel.\n", kanal, chan_type_long_name(chan_type));
return -EINVAL;
}
/* only even channels */
if (jtacs && chan_type != CHAN_TYPE_VC && (atoi(kanal) & 1)) {
- PDEBUG(DAMPS, DEBUG_ERROR, "Control channel on JTACS system seem not to work with odd channel numbers. Please use even channel number.\n");
+ LOGP(DAMPS, LOGL_ERROR, "Control channel on JTACS system seem not to work with odd channel numbers. Please use even channel number.\n");
return -EINVAL;
}
/* check if sid machtes channel band */
band = amps_channel2band(atoi(kanal));
if (band[0] == 'A' && (sid & 1) == 0 && chan_type != CHAN_TYPE_VC) {
- PDEBUG(DAMPS, DEBUG_ERROR, "Channel number %s belongs to system A, but your %s %d is even and belongs to system B. Please give odd %s.\n", kanal, (!tacs) ? "SID" : "AID", sid, (!tacs) ? "SID" : "AID");
+ LOGP(DAMPS, LOGL_ERROR, "Channel number %s belongs to system A, but your %s %d is even and belongs to system B. Please give odd %s.\n", kanal, (!tacs) ? "SID" : "AID", sid, (!tacs) ? "SID" : "AID");
return -EINVAL;
}
if (band[0] == 'B' && (sid & 1) == 1 && chan_type != CHAN_TYPE_VC) {
- PDEBUG(DAMPS, DEBUG_ERROR, "Channel number %s belongs to system B, but your %s %d is odd and belongs to system A. Please give even %s.\n", kanal, (!tacs) ? "SID" : "AID", sid, (!tacs) ? "SID" : "AID");
+ LOGP(DAMPS, LOGL_ERROR, "Channel number %s belongs to system B, but your %s %d is odd and belongs to system A. Please give even %s.\n", kanal, (!tacs) ? "SID" : "AID", sid, (!tacs) ? "SID" : "AID");
return -EINVAL;
}
/* check if we use combined voice channel hack */
if (chan_type == CHAN_TYPE_CC_PC_VC) {
- PDEBUG(DAMPS, DEBUG_NOTICE, "You selected '%s'. This is a hack, but the only way to use control channel and voice channel on one transceiver. Some phones may reject this, but all my phones don't.\n", chan_type_long_name(chan_type));
+ LOGP(DAMPS, LOGL_NOTICE, "You selected '%s'. This is a hack, but the only way to use control channel and voice channel on one transceiver. Some phones may reject this, but all my phones don't.\n", chan_type_long_name(chan_type));
}
/* check if we selected a voice channel that i outside 20 MHz band */
if (chan_type == CHAN_TYPE_VC && atoi(kanal) > 666) {
- PDEBUG(DAMPS, DEBUG_NOTICE, "You selected '%s' on channel #%s. Older phones do not support channels above #666.\n", chan_type_long_name(chan_type), kanal);
+ LOGP(DAMPS, LOGL_NOTICE, "You selected '%s' on channel #%s. Older phones do not support channels above #666.\n", chan_type_long_name(chan_type), kanal);
}
amps = calloc(1, sizeof(amps_t));
if (!amps) {
- PDEBUG(DAMPS, DEBUG_ERROR, "No memory!\n");
+ LOGP(DAMPS, LOGL_ERROR, "No memory!\n");
return -ENOMEM;
}
- PDEBUG(DAMPS, DEBUG_DEBUG, "Creating 'AMPS' instance for channel = %s of band %s (sample rate %d).\n", kanal, band, samplerate);
+ LOGP(DAMPS, LOGL_DEBUG, "Creating 'AMPS' instance for channel = %s of band %s (sample rate %d).\n", kanal, band, samplerate);
/* init general part of transceiver */
rc = sender_create(&amps->sender, kanal, amps_channel2freq(atoi(kanal), 0), amps_channel2freq(atoi(kanal), 1), device, use_sdr, samplerate, rx_gain, tx_gain, 0, 0, write_rx_wave, write_tx_wave, read_rx_wave, read_tx_wave, loopback, PAGING_SIGNAL_NONE);
if (rc < 0) {
- PDEBUG(DAMPS, DEBUG_ERROR, "Failed to init transceiver process!\n");
+ LOGP(DAMPS, LOGL_ERROR, "Failed to init transceiver process!\n");
goto error;
}
@@ -618,7 +620,7 @@ int amps_create(const char *kanal, enum amps_chan_type chan_type, const char *de
/* init audio processing */
rc = dsp_init_sender(amps, tolerant);
if (rc < 0) {
- PDEBUG(DAMPS, DEBUG_ERROR, "Failed to init audio processing!\n");
+ LOGP(DAMPS, LOGL_ERROR, "Failed to init audio processing!\n");
goto error;
}
@@ -633,7 +635,7 @@ int amps_create(const char *kanal, enum amps_chan_type chan_type, const char *de
// amps_new_state(amps, STATE_BUSY);
#endif
- PDEBUG(DAMPS, DEBUG_NOTICE, "Created channel #%s (System %s) of type '%s' = %s\n", kanal, band, chan_type_short_name(chan_type), chan_type_long_name(chan_type));
+ LOGP(DAMPS, LOGL_NOTICE, "Created channel #%s (System %s) of type '%s' = %s\n", kanal, band, chan_type_short_name(chan_type), chan_type_long_name(chan_type));
return 0;
@@ -649,11 +651,11 @@ void amps_destroy(sender_t *sender)
amps_t *amps = (amps_t *) sender;
transaction_t *trans;
- PDEBUG(DAMPS, DEBUG_DEBUG, "Destroying 'AMPS' instance for channel = %s.\n", sender->kanal);
+ LOGP(DAMPS, LOGL_DEBUG, "Destroying 'AMPS' instance for channel = %s.\n", sender->kanal);
while ((trans = amps->trans_list)) {
const char *number = amps_min2number(trans->min1, trans->min2);
- PDEBUG(DAMPS, DEBUG_NOTICE, "Removing pending transaction for subscriber '%s'\n", number);
+ LOGP(DAMPS, LOGL_NOTICE, "Removing pending transaction for subscriber '%s'\n", number);
destroy_transaction(trans);
}
@@ -671,7 +673,7 @@ void amps_go_idle(amps_t *amps)
return;
if (amps->trans_list) {
- PDEBUG(DAMPS, DEBUG_ERROR, "Releasing but still having transaction, please fix!\n");
+ LOGP(DAMPS, LOGL_ERROR, "Releasing but still having transaction, please fix!\n");
if (amps->trans_list->callref)
call_up_release(amps->trans_list->callref, CAUSE_NORMAL);
destroy_transaction(amps->trans_list);
@@ -680,14 +682,14 @@ void amps_go_idle(amps_t *amps)
amps_new_state(amps, STATE_IDLE);
if (amps->chan_type != CHAN_TYPE_VC) {
- PDEBUG_CHAN(DAMPS, DEBUG_INFO, "Entering IDLE state, sending Overhead/Filler frames on %s.\n", chan_type_long_name(amps->chan_type));
+ LOGP_CHAN(DAMPS, LOGL_INFO, "Entering IDLE state, sending Overhead/Filler frames on %s.\n", chan_type_long_name(amps->chan_type));
if (amps->sender.loopback)
frame_length = 441; /* bits after sync (FOCC) */
else
frame_length = 247; /* bits after sync (RECC) */
amps_set_dsp_mode(amps, DSP_MODE_FRAME_RX_FRAME_TX, frame_length);
} else {
- PDEBUG_CHAN(DAMPS, DEBUG_INFO, "Entering IDLE state (sending silence / no RF) on %s.\n", chan_type_long_name(amps->chan_type));
+ LOGP_CHAN(DAMPS, LOGL_INFO, "Entering IDLE state (sending silence / no RF) on %s.\n", chan_type_long_name(amps->chan_type));
amps_set_dsp_mode(amps, DSP_MODE_OFF, 0);
}
}
@@ -697,8 +699,8 @@ static void amps_release(transaction_t *trans, uint8_t cause)
{
amps_t *amps = trans->amps;
- timer_stop(&trans->timer);
- timer_start(&trans->timer, RELEASE_TIMER);
+ osmo_timer_del(&trans->timer);
+ osmo_timer_schedule(&trans->timer, RELEASE_TIMER);
trans_new_state(trans, TRANS_CALL_RELEASE);
trans->chan = 0;
trans->msg_type = 0;
@@ -721,14 +723,14 @@ void amps_rx_signaling_tone(amps_t *amps, int tone, double quality)
{
transaction_t *trans = amps->trans_list;
if (trans == NULL) {
- PDEBUG_CHAN(DAMPS, DEBUG_ERROR, "Signaling Tone without transaction, please fix!\n");
+ LOGP_CHAN(DAMPS, LOGL_ERROR, "Signaling Tone without transaction, please fix!\n");
return;
}
if (tone)
- PDEBUG_CHAN(DAMPS, DEBUG_INFO, "Detected Signaling Tone with quality=%.0f.\n", quality * 100.0);
+ LOGP_CHAN(DAMPS, LOGL_INFO, "Detected Signaling Tone with quality=%.0f.\n", quality * 100.0);
else
- PDEBUG_CHAN(DAMPS, DEBUG_INFO, "Lost Signaling Tone signal\n");
+ LOGP_CHAN(DAMPS, LOGL_INFO, "Lost Signaling Tone signal\n");
switch (trans->state) {
case TRANS_CALL_MO_ASSIGN_CONFIRM: // should not happen
@@ -739,7 +741,7 @@ void amps_rx_signaling_tone(amps_t *amps, int tone, double quality)
case TRANS_CALL_RELEASE:
case TRANS_CALL_RELEASE_SEND:
/* also loosing singaling tone indicates release confirm (after alerting) */
- timer_stop(&trans->timer);
+ osmo_timer_del(&trans->timer);
if (trans->callref)
call_up_release(trans->callref, CAUSE_NORMAL);
destroy_transaction(trans);
@@ -750,24 +752,24 @@ void amps_rx_signaling_tone(amps_t *amps, int tone, double quality)
case TRANS_CALL_MT_ALERT_SEND: // should not happen
case TRANS_CALL_MT_ALERT_CONFIRM:
if (tone) {
- timer_stop(&trans->timer);
+ osmo_timer_del(&trans->timer);
call_up_alerting(trans->callref);
amps_set_dsp_mode(amps, DSP_MODE_AUDIO_RX_AUDIO_TX, 0);
trans_new_state(trans, TRANS_CALL_MT_ANSWER_WAIT);
- timer_start(&trans->timer, ANSWER_TO);
+ osmo_timer_schedule(&trans->timer, ANSWER_TO);
}
break;
case TRANS_CALL_MT_ANSWER_WAIT:
if (!tone) {
- timer_stop(&trans->timer);
+ osmo_timer_del(&trans->timer);
if (!trans->sat_detected)
- timer_start(&trans->timer, SAT_TO1);
+ osmo_timer_schedule(&trans->timer, SAT_TO1);
call_up_answer(trans->callref, amps_min2number(trans->min1, trans->min2));
trans_new_state(trans, TRANS_CALL);
}
break;
default:
- PDEBUG_CHAN(DAMPS, DEBUG_ERROR, "Signaling Tone without active call, please fix!\n");
+ LOGP_CHAN(DAMPS, LOGL_ERROR, "Signaling Tone without active call, please fix!\n");
}
}
@@ -775,7 +777,7 @@ void amps_rx_sat(amps_t *amps, int tone, double quality)
{
transaction_t *trans = amps->trans_list;
if (trans == NULL) {
- PDEBUG_CHAN(DAMPS, DEBUG_ERROR, "SAT signal without transaction, please fix!\n");
+ LOGP_CHAN(DAMPS, LOGL_ERROR, "SAT signal without transaction, please fix!\n");
return;
}
@@ -792,40 +794,40 @@ void amps_rx_sat(amps_t *amps, int tone, double quality)
&& trans->state != TRANS_CALL_MT_ALERT_CONFIRM
&& trans->state != TRANS_CALL_MT_ANSWER_WAIT
&& trans->state != TRANS_CALL) {
- PDEBUG_CHAN(DAMPS, DEBUG_ERROR, "SAT signal without active call, please fix!\n");
+ LOGP_CHAN(DAMPS, LOGL_ERROR, "SAT signal without active call, please fix!\n");
return;
}
if (tone) {
- PDEBUG(DAMPS, DEBUG_INFO, "Detected SAT signal with quality=%.0f.\n", quality * 100.0);
+ LOGP(DAMPS, LOGL_INFO, "Detected SAT signal with quality=%.0f.\n", quality * 100.0);
trans->sat_detected = 1;
} else {
- PDEBUG(DAMPS, DEBUG_INFO, "Lost SAT signal\n");
+ LOGP(DAMPS, LOGL_INFO, "Lost SAT signal\n");
trans->sat_detected = 0;
}
/* initial SAT received */
if (tone && trans->state == TRANS_CALL_MO_ASSIGN_CONFIRM) {
- PDEBUG_CHAN(DAMPS, DEBUG_INFO, "Confirm from mobile (SAT) received\n");
- timer_stop(&trans->timer);
+ LOGP_CHAN(DAMPS, LOGL_INFO, "Confirm from mobile (SAT) received\n");
+ osmo_timer_del(&trans->timer);
trans_new_state(trans, TRANS_CALL);
amps_set_dsp_mode(amps, DSP_MODE_AUDIO_RX_AUDIO_TX, 0);
}
if (tone && trans->state == TRANS_CALL_MT_ASSIGN_CONFIRM) {
- PDEBUG_CHAN(DAMPS, DEBUG_INFO, "Confirm from mobile (SAT) received\n");
- timer_stop(&trans->timer);
+ LOGP_CHAN(DAMPS, LOGL_INFO, "Confirm from mobile (SAT) received\n");
+ osmo_timer_del(&trans->timer);
trans->alert_retry = 1;
trans_new_state(trans, TRANS_CALL_MT_ALERT);
amps_set_dsp_mode(amps, DSP_MODE_AUDIO_RX_FRAME_TX, 0);
}
if (tone) {
- timer_stop(&trans->timer);
+ osmo_timer_del(&trans->timer);
} else {
if (!trans->dtx)
- timer_start(&trans->timer, SAT_TO2);
+ osmo_timer_schedule(&trans->timer, SAT_TO2);
else
- timer_stop(&trans->timer);
+ osmo_timer_del(&trans->timer);
}
if (amps->sender.loopback)
@@ -842,50 +844,51 @@ void amps_rx_recc(amps_t *amps, uint8_t scm, uint8_t mpci, uint32_t esn, uint32_
/* check if we are busy, so we ignore all signaling */
if (amps->state == STATE_BUSY) {
- PDEBUG_CHAN(DAMPS, DEBUG_NOTICE, "Ignoring RECC messages from phone while using this channel for voice.\n");
+ LOGP_CHAN(DAMPS, LOGL_NOTICE, "Ignoring RECC messages from phone while using this channel for voice.\n");
return;
}
if (order == 13 && (ordq == 0 || ordq == 1 || ordq == 2 || ordq == 3) && msg_type == 0) {
- PDEBUG_CHAN(DAMPS, DEBUG_INFO, "Registration %s (ESN = %08x, %s, %s)\n", callerid, esn, amps_scm(scm), amps_mpci(mpci));
+ LOGP_CHAN(DAMPS, LOGL_INFO, "Registration %s (ESN = %s, %s, %s)\n", callerid, esn_to_string(esn), amps_scm(scm), amps_mpci(mpci));
_register:
numbering(callerid, &carrier, &country, &national_number);
if (carrier)
- PDEBUG_CHAN(DAMPS, DEBUG_INFO, " -> Home carrier: %s\n", carrier);
+ LOGP_CHAN(DAMPS, LOGL_INFO, " -> Home carrier: %s\n", carrier);
if (country)
- PDEBUG_CHAN(DAMPS, DEBUG_INFO, " -> Home country: %s\n", country);
+ LOGP_CHAN(DAMPS, LOGL_INFO, " -> Home country: %s\n", country);
if (national_number)
- PDEBUG_CHAN(DAMPS, DEBUG_INFO, " -> Home number: %s\n", national_number);
+ LOGP_CHAN(DAMPS, LOGL_INFO, " -> Home number: %s\n", national_number);
trans = create_transaction(amps, TRANS_REGISTER_ACK, min1, min2, esn, msg_type, ordq, order, 0);
if (!trans) {
- PDEBUG(DAMPS, DEBUG_ERROR, "Failed to create transaction\n");
+ LOGP(DAMPS, LOGL_ERROR, "Failed to create transaction\n");
return;
}
+ console_inscription(callerid);
} else
if (order == 13 && ordq == 3 && msg_type == 1) {
- PDEBUG_CHAN(DAMPS, DEBUG_INFO, "Registration - Power Down %s (ESN = %08x, %s, %s)\n", callerid, esn, amps_scm(scm), amps_mpci(mpci));
+ LOGP_CHAN(DAMPS, LOGL_INFO, "Registration - Power Down %s (ESN = %s, %s, %s)\n", callerid, esn_to_string(esn), amps_scm(scm), amps_mpci(mpci));
goto _register;
} else
if (order == 0 && ordq == 0 && msg_type == 0) {
if (!dialing)
- PDEBUG_CHAN(DAMPS, DEBUG_INFO, "Paging reply %s (ESN = %08x, %s, %s)\n", callerid, esn, amps_scm(scm), amps_mpci(mpci));
+ LOGP_CHAN(DAMPS, LOGL_INFO, "Paging reply %s (ESN = %s, %s, %s)\n", callerid, esn_to_string(esn), amps_scm(scm), amps_mpci(mpci));
else
- PDEBUG_CHAN(DAMPS, DEBUG_INFO, "Call %s -> %s (ESN = %08x, %s, %s)\n", callerid, dialing, esn, amps_scm(scm), amps_mpci(mpci));
+ LOGP_CHAN(DAMPS, LOGL_INFO, "Call %s -> %s (ESN = %s, %s, %s)\n", callerid, dialing, esn_to_string(esn), amps_scm(scm), amps_mpci(mpci));
trans = search_transaction_number(amps, min1, min2);
if (!trans && !dialing) {
- PDEBUG(DAMPS, DEBUG_NOTICE, "Paging reply, but call is already gone, rejecting call\n");
+ LOGP(DAMPS, LOGL_NOTICE, "Paging reply, but call is already gone, rejecting call\n");
goto reject;
}
if (trans && dialing)
- PDEBUG(DAMPS, DEBUG_NOTICE, "There is already a transaction for this phone. Cloning?\n");
+ LOGP(DAMPS, LOGL_NOTICE, "There is already a transaction for this phone. Cloning?\n");
vc = search_free_vc();
if (!vc) {
- PDEBUG(DAMPS, DEBUG_NOTICE, "No free channel, rejecting call\n");
+ LOGP(DAMPS, LOGL_NOTICE, "No free channel, rejecting call\n");
reject:
if (!trans) {
trans = create_transaction(amps, TRANS_CALL_REJECT, min1, min2, esn, 0, 0, 3, 0);
if (!trans) {
- PDEBUG(DAMPS, DEBUG_ERROR, "Failed to create transaction\n");
+ LOGP(DAMPS, LOGL_ERROR, "Failed to create transaction\n");
return;
}
} else {
@@ -901,7 +904,7 @@ reject:
trans = create_transaction(amps, TRANS_CALL_MO_ASSIGN, min1, min2, esn, 0, 0, 0, atoi(vc->sender.kanal));
strncpy(trans->dialing, dialing, sizeof(trans->dialing) - 1);
if (!trans) {
- PDEBUG(DAMPS, DEBUG_ERROR, "Failed to create transaction\n");
+ LOGP(DAMPS, LOGL_ERROR, "Failed to create transaction\n");
return;
}
} else {
@@ -911,13 +914,13 @@ reject:
/* if we support DTX and also the phone does, we set DTX state of transaction */
if (amps->si.word2.dtx) {
if ((scm & 4)) {
- PDEBUG(DAMPS, DEBUG_INFO, " -> Use DTX for this call\n");
+ LOGP(DAMPS, LOGL_INFO, " -> Use DTX for this call\n");
trans->dtx = 1;
} else
- PDEBUG(DAMPS, DEBUG_INFO, " -> Requested DTX, but not supported by phone\n");
+ LOGP(DAMPS, LOGL_INFO, " -> Requested DTX, but not supported by phone\n");
}
} else
- PDEBUG_CHAN(DAMPS, DEBUG_NOTICE, "Unsupported RECC messages: ORDER: %d ORDQ: %d MSG TYPE: %d (See Table 4 of specs.)\n", order, ordq, msg_type);
+ LOGP_CHAN(DAMPS, LOGL_NOTICE, "Unsupported RECC messages: ORDER: %d ORDQ: %d MSG TYPE: %d (See Table 4 of specs.)\n", order, ordq, msg_type);
}
/*
@@ -938,7 +941,7 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
/* 2. check if the subscriber is attached */
// if (!find_db(min1, min2)) {
-// PDEBUG(DAMPS, DEBUG_NOTICE, "Outgoing call to not attached subscriber, rejecting!\n");
+// LOGP(DAMPS, LOGL_NOTICE, "Outgoing call to not attached subscriber, rejecting!\n");
// return -CAUSE_OUTOFORDER;
// }
@@ -951,29 +954,29 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
break;
}
if (sender) {
- PDEBUG(DAMPS, DEBUG_NOTICE, "Outgoing call to busy number, rejecting!\n");
+ LOGP(DAMPS, LOGL_NOTICE, "Outgoing call to busy number, rejecting!\n");
return -CAUSE_BUSY;
}
/* 4. check if all senders are busy, return NOCHANNEL */
if (!search_free_vc()) {
- PDEBUG(DAMPS, DEBUG_NOTICE, "Outgoing call, but no free channel, rejecting!\n");
+ LOGP(DAMPS, LOGL_NOTICE, "Outgoing call, but no free channel, rejecting!\n");
return -CAUSE_NOCHANNEL;
}
/* 5. check if we have (currently) no paging channel, return NOCHANNEL */
amps = search_pc();
if (!amps) {
- PDEBUG(DAMPS, DEBUG_NOTICE, "Outgoing call, but paging channel (control channel) is currently busy, rejecting!\n");
+ LOGP(DAMPS, LOGL_NOTICE, "Outgoing call, but paging channel (control channel) is currently busy, rejecting!\n");
return -CAUSE_NOCHANNEL;
}
- PDEBUG_CHAN(DAMPS, DEBUG_INFO, "Call to mobile station, paging station id '%s'\n", dialing);
+ LOGP_CHAN(DAMPS, LOGL_INFO, "Call to mobile station, paging station id '%s'\n", dialing);
/* 6. trying to page mobile station */
trans = create_transaction(amps, TRANS_PAGE, min1, min2, 0, 0, 0, 0, 0);
if (!trans) {
- PDEBUG(DAMPS, DEBUG_ERROR, "Failed to create transaction\n");
+ LOGP(DAMPS, LOGL_ERROR, "Failed to create transaction\n");
return -CAUSE_TEMPFAIL;
}
trans->callref = callref;
@@ -987,7 +990,7 @@ 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 __attribute__((unused)) callref, struct timeval __attribute__((unused)) *tv_meter)
{
}
@@ -1001,7 +1004,7 @@ void call_down_disconnect(int callref, int cause)
amps_t *amps;
transaction_t *trans;
- PDEBUG(DAMPS, DEBUG_INFO, "Call has been disconnected by network.\n");
+ LOGP(DAMPS, LOGL_INFO, "Call has been disconnected by network.\n");
for (sender = sender_head; sender; sender = sender->next) {
amps = (amps_t *) sender;
@@ -1011,7 +1014,7 @@ void call_down_disconnect(int callref, int cause)
break;
}
if (!sender) {
- PDEBUG(DAMPS, DEBUG_NOTICE, "Outgoing disconnect, but no callref!\n");
+ LOGP(DAMPS, LOGL_NOTICE, "Outgoing disconnect, but no callref!\n");
call_up_release(callref, CAUSE_INVALCALLREF);
return;
}
@@ -1026,12 +1029,12 @@ void call_down_disconnect(int callref, int cause)
|| trans->state == TRANS_CALL_MT_ALERT_SEND
|| trans->state == TRANS_CALL_MT_ALERT_CONFIRM
|| trans->state == TRANS_CALL_MT_ANSWER_WAIT) {
- PDEBUG_CHAN(DAMPS, DEBUG_INFO, "Call control disconnect on voice channel while alerting, releasing towards mobile station.\n");
+ LOGP_CHAN(DAMPS, LOGL_INFO, "Call control disconnect on voice channel while alerting, releasing towards mobile station.\n");
amps_release(trans, cause);
}
return;
default:
- PDEBUG_CHAN(DAMPS, DEBUG_INFO, "Call control disconnects on control channel, removing transaction.\n");
+ LOGP_CHAN(DAMPS, LOGL_INFO, "Call control disconnects on control channel, removing transaction.\n");
call_up_release(callref, cause);
trans->callref = 0;
destroy_transaction(trans);
@@ -1046,7 +1049,7 @@ void call_down_release(int callref, int cause)
amps_t *amps;
transaction_t *trans;
- PDEBUG(DAMPS, DEBUG_INFO, "Call has been released by network, releasing call.\n");
+ LOGP(DAMPS, LOGL_INFO, "Call has been released by network, releasing call.\n");
for (sender = sender_head; sender; sender = sender->next) {
amps = (amps_t *) sender;
@@ -1056,7 +1059,7 @@ void call_down_release(int callref, int cause)
break;
}
if (!sender) {
- PDEBUG(DAMPS, DEBUG_NOTICE, "Outgoing release, but no callref!\n");
+ LOGP(DAMPS, LOGL_NOTICE, "Outgoing release, but no callref!\n");
/* don't send release, because caller already released */
return;
}
@@ -1067,88 +1070,66 @@ void call_down_release(int callref, int cause)
case DSP_MODE_AUDIO_RX_SILENCE_TX:
case DSP_MODE_AUDIO_RX_AUDIO_TX:
case DSP_MODE_AUDIO_RX_FRAME_TX:
- PDEBUG_CHAN(DAMPS, DEBUG_INFO, "Call control releases on voice channel, releasing towards mobile station.\n");
+ LOGP_CHAN(DAMPS, LOGL_INFO, "Call control releases on voice channel, releasing towards mobile station.\n");
amps_release(trans, cause);
break;
default:
- PDEBUG_CHAN(DAMPS, DEBUG_INFO, "Call control releases on control channel, removing transaction.\n");
+ LOGP_CHAN(DAMPS, LOGL_INFO, "Call control releases on control channel, removing transaction.\n");
destroy_transaction(trans);
amps_go_idle(amps);
}
}
-/* 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;
- amps_t *amps;
-
- for (sender = sender_head; sender; sender = sender->next) {
- amps = (amps_t *) sender;
- if (amps->trans_list && amps->trans_list->callref == callref)
- break;
- }
- if (!sender)
- return;
-
- if (amps->dsp_mode == DSP_MODE_AUDIO_RX_AUDIO_TX) {
- compress_audio(&amps->cstate, samples, count);
- jitter_save(&amps->sender.dejitter, samples, count, 1, sequence, timestamp, ssrc);
- }
-}
-
-void call_down_clock(void) {}
-
/* Timeout handling */
-void transaction_timeout(struct timer *timer)
+void transaction_timeout(void *data)
{
- transaction_t *trans = (transaction_t *)timer->priv;
+ transaction_t *trans = data;
amps_t *amps = trans->amps;
switch (trans->state) {
case TRANS_CALL_MO_ASSIGN_CONFIRM:
case TRANS_CALL_MT_ASSIGN_CONFIRM:
- PDEBUG_CHAN(DAMPS, DEBUG_NOTICE, "Timeout after %.0f seconds not receiving initial SAT signal.\n", timer->duration);
- PDEBUG_CHAN(DAMPS, DEBUG_INFO, "Release call towards network.\n");
+ LOGP_CHAN(DAMPS, LOGL_NOTICE, "Timeout after %ld seconds not receiving initial SAT signal.\n", trans->timer.timeout.tv_sec);
+ LOGP_CHAN(DAMPS, LOGL_INFO, "Release call towards network.\n");
amps_release(amps->trans_list, CAUSE_TEMPFAIL);
break;
case TRANS_CALL:
- PDEBUG_CHAN(DAMPS, DEBUG_NOTICE, "Timeout after %.0f seconds loosing SAT signal.\n", timer->duration);
- PDEBUG_CHAN(DAMPS, DEBUG_INFO, "Release call towards network.\n");
+ LOGP_CHAN(DAMPS, LOGL_NOTICE, "Timeout after %ld seconds loosing SAT signal.\n", trans->timer.timeout.tv_sec);
+ LOGP_CHAN(DAMPS, LOGL_INFO, "Release call towards network.\n");
amps_release(amps->trans_list, CAUSE_TEMPFAIL);
break;
case TRANS_CALL_RELEASE:
case TRANS_CALL_RELEASE_SEND:
- PDEBUG_CHAN(DAMPS, DEBUG_NOTICE, "Release timeout, destroying transaction\n");
+ LOGP_CHAN(DAMPS, LOGL_NOTICE, "Release timeout, destroying transaction\n");
destroy_transaction(trans);
amps_go_idle(amps);
break;
case TRANS_CALL_MT_ALERT_SEND:
case TRANS_CALL_MT_ALERT_CONFIRM:
if (trans->alert_retry++ == ALERT_TRIES) {
- PDEBUG_CHAN(DAMPS, DEBUG_NOTICE, "Phone does not respond to alert order, destroying transaction\n");
+ LOGP_CHAN(DAMPS, LOGL_NOTICE, "Phone does not respond to alert order, destroying transaction\n");
amps_release(trans, CAUSE_TEMPFAIL);
} else {
- PDEBUG_CHAN(DAMPS, DEBUG_NOTICE, "Phone does not respond to alert order, retrying\n");
+ LOGP_CHAN(DAMPS, LOGL_NOTICE, "Phone does not respond to alert order, retrying\n");
trans_new_state(trans, TRANS_CALL_MT_ALERT);
amps_set_dsp_mode(amps, DSP_MODE_AUDIO_RX_FRAME_TX, 0);
}
break;
case TRANS_CALL_MT_ANSWER_WAIT:
- PDEBUG_CHAN(DAMPS, DEBUG_NOTICE, "Alerting timeout, destroying transaction\n");
+ LOGP_CHAN(DAMPS, LOGL_NOTICE, "Alerting timeout, destroying transaction\n");
amps_release(trans, CAUSE_NOANSWER);
break;
case TRANS_PAGE_REPLY:
if (trans->page_retry++ == PAGE_TRIES) {
- PDEBUG_CHAN(DAMPS, DEBUG_NOTICE, "Paging timeout, destroying transaction\n");
+ LOGP_CHAN(DAMPS, LOGL_NOTICE, "Paging timeout, destroying transaction\n");
amps_release(trans, CAUSE_OUTOFORDER);
} else {
- PDEBUG_CHAN(DAMPS, DEBUG_NOTICE, "Paging timeout, retrying\n");
+ LOGP_CHAN(DAMPS, LOGL_NOTICE, "Paging timeout, retrying\n");
trans_new_state(trans, TRANS_PAGE);
}
break;
default:
- PDEBUG_CHAN(DAMPS, DEBUG_ERROR, "Timeout unhandled in state %d\n", trans->state);
+ LOGP_CHAN(DAMPS, LOGL_ERROR, "Timeout unhandled in state %d\n", trans->state);
}
}
@@ -1160,18 +1141,18 @@ static amps_t *assign_voice_channel(transaction_t *trans)
vc = search_channel(trans->chan);
if (!vc) {
- PDEBUG(DAMPS, DEBUG_NOTICE, "Channel %d is not free anymore, rejecting call\n", trans->chan);
+ LOGP(DAMPS, LOGL_NOTICE, "Channel %d is not free anymore, rejecting call\n", trans->chan);
amps_release(trans, CAUSE_NOCHANNEL);
return NULL;
}
if (vc == amps)
- PDEBUG(DAMPS, DEBUG_INFO, "Staying on combined control + voice channel %s\n", vc->sender.kanal);
+ LOGP(DAMPS, LOGL_INFO, "Staying on combined control + voice channel %s\n", vc->sender.kanal);
else
- PDEBUG(DAMPS, DEBUG_INFO, "Moving to voice channel %s\n", vc->sender.kanal);
+ LOGP(DAMPS, LOGL_INFO, "Moving to voice channel %s\n", vc->sender.kanal);
/* switch channel... */
- timer_start(&trans->timer, SAT_TO1);
+ osmo_timer_schedule(&trans->timer, SAT_TO1);
/* make channel busy */
amps_new_state(vc, STATE_BUSY);
/* relink */
@@ -1184,7 +1165,7 @@ static amps_t *assign_voice_channel(transaction_t *trans)
char esn_text[16];
sprintf(esn_text, "%u", trans->esn);
/* setup call */
- PDEBUG(DAMPS, DEBUG_INFO, "Setup call to network.\n");
+ LOGP(DAMPS, LOGL_INFO, "Setup call to network.\n");
trans->callref = call_up_setup(callerid, trans->dialing, OSMO_CC_NETWORK_AMPS_ESN, esn_text);
}
@@ -1203,52 +1184,55 @@ again:
switch (trans->state) {
case TRANS_REGISTER_ACK:
- PDEBUG_CHAN(DAMPS, DEBUG_INFO, "Sending Register acknowledge\n");
+ LOGP_CHAN(DAMPS, LOGL_INFO, "Sending Register acknowledge\n");
trans_new_state(trans, TRANS_REGISTER_ACK_SEND);
return trans;
case TRANS_REGISTER_ACK_SEND:
destroy_transaction(trans);
goto again;
case TRANS_CALL_REJECT:
- PDEBUG_CHAN(DAMPS, DEBUG_INFO, "Rejecting call from mobile station\n");
+ LOGP_CHAN(DAMPS, LOGL_INFO, "Rejecting call from mobile station\n");
trans_new_state(trans, TRANS_CALL_REJECT_SEND);
return trans;
case TRANS_CALL_REJECT_SEND:
destroy_transaction(trans);
goto again;
case TRANS_CALL_MO_ASSIGN:
- PDEBUG_CHAN(DAMPS, DEBUG_INFO, "Assigning channel to call from mobile station\n");
+ LOGP_CHAN(DAMPS, LOGL_INFO, "Assigning channel to call from mobile station\n");
trans_new_state(trans, TRANS_CALL_MO_ASSIGN_SEND);
return trans;
case TRANS_CALL_MO_ASSIGN_SEND:
vc = assign_voice_channel(trans);
if (vc) {
- PDEBUG_CHAN(DAMPS, DEBUG_INFO, "Assignment complete, voice connected\n");
+ LOGP_CHAN(DAMPS, LOGL_INFO, "Assignment complete, voice connected\n");
/* timer and other things are processed at assign_voice_channel() */
trans_new_state(trans, TRANS_CALL_MO_ASSIGN_CONFIRM);
amps_set_dsp_mode(vc, DSP_MODE_AUDIO_RX_SILENCE_TX, 0);
}
return NULL;
case TRANS_CALL_MT_ASSIGN:
- PDEBUG_CHAN(DAMPS, DEBUG_INFO, "Assigning channel to call to mobile station\n");
+ LOGP_CHAN(DAMPS, LOGL_INFO, "Assigning channel to call to mobile station\n");
trans_new_state(trans, TRANS_CALL_MT_ASSIGN_SEND);
return trans;
case TRANS_CALL_MT_ASSIGN_SEND:
vc = assign_voice_channel(trans);
if (vc) {
- PDEBUG_CHAN(DAMPS, DEBUG_INFO, "Assignment complete, waiting for SAT on VC\n");
+ LOGP_CHAN(DAMPS, LOGL_INFO, "Assignment complete, waiting for SAT on VC\n");
/* timer and other things are processed at assign_voice_channel() */
trans_new_state(trans, TRANS_CALL_MT_ASSIGN_CONFIRM);
amps_set_dsp_mode(vc, DSP_MODE_AUDIO_RX_SILENCE_TX, 0);
}
return NULL;
case TRANS_PAGE:
- PDEBUG_CHAN(DAMPS, DEBUG_INFO, "Paging the phone\n");
+ LOGP_CHAN(DAMPS, LOGL_INFO, "Paging the phone\n");
trans_new_state(trans, TRANS_PAGE_SEND);
return trans;
case TRANS_PAGE_SEND:
trans_new_state(trans, TRANS_PAGE_REPLY);
- timer_start(&trans->timer, (trans->page_retry == PAGE_TRIES) ? PAGE_TO2 : PAGE_TO1);
+ if (trans->page_retry == PAGE_TRIES)
+ osmo_timer_schedule(&trans->timer, PAGE_TO2);
+ else
+ osmo_timer_schedule(&trans->timer, PAGE_TO1);
return NULL;
default:
return NULL;
@@ -1265,11 +1249,11 @@ transaction_t *amps_tx_frame_fvc(amps_t *amps)
switch (trans->state) {
case TRANS_CALL_RELEASE:
- PDEBUG_CHAN(DAMPS, DEBUG_INFO, "Releasing call towards mobile station\n");
+ LOGP_CHAN(DAMPS, LOGL_INFO, "Releasing call towards mobile station\n");
trans_new_state(trans, TRANS_CALL_RELEASE_SEND);
return trans;
case TRANS_CALL_RELEASE_SEND:
- PDEBUG_CHAN(DAMPS, DEBUG_INFO, "Release call was sent, continue sending release\n");
+ LOGP_CHAN(DAMPS, LOGL_INFO, "Release call was sent, continue sending release\n");
return trans;
case TRANS_CALL_MT_ALERT:
trans->chan = 0;
@@ -1277,17 +1261,17 @@ transaction_t *amps_tx_frame_fvc(amps_t *amps)
trans->ordq = 0;
// "Alert with caller ID" causes older phones to interrupt the connection for some reason, therefore we don't use order 17 when no caller ID is set
if (amps->send_callerid && trans->alert_retry == 1 && trans->caller_id[0]) {
- PDEBUG_CHAN(DAMPS, DEBUG_INFO, "Sending alerting with caller ID\n");
+ LOGP_CHAN(DAMPS, LOGL_INFO, "Sending alerting with caller ID\n");
trans->order = 17;
} else {
- PDEBUG_CHAN(DAMPS, DEBUG_INFO, "Sending alerting\n");
+ LOGP_CHAN(DAMPS, LOGL_INFO, "Sending alerting\n");
trans->order = 1;
}
trans_new_state(trans, TRANS_CALL_MT_ALERT_SEND);
return trans;
case TRANS_CALL_MT_ALERT_SEND:
- PDEBUG_CHAN(DAMPS, DEBUG_INFO, "Alerting was sent, continue waiting for ST or timeout\n");
- timer_start(&trans->timer, ALERT_TO);
+ LOGP_CHAN(DAMPS, LOGL_INFO, "Alerting was sent, continue waiting for ST or timeout\n");
+ osmo_timer_schedule(&trans->timer, ALERT_TO);
amps_set_dsp_mode(amps, DSP_MODE_AUDIO_RX_SILENCE_TX, 0);
trans_new_state(trans, TRANS_CALL_MT_ALERT_CONFIRM);
return NULL;
diff --git a/src/amps/amps.h b/src/amps/amps.h
index 0a85df2..da0e660 100644
--- a/src/amps/amps.h
+++ b/src/amps/amps.h
@@ -1,6 +1,6 @@
#include "../libgoertzel/goertzel.h"
#include "../libmobile/sender.h"
-#include "../libtimer/timer.h"
+#include <osmocom/core/timer.h>
#include "../libcompandor/compandor.h"
typedef struct amps amps_t;
#include "sysinfo.h"
@@ -171,6 +171,7 @@ struct amps {
int when_count; /* counter of the filler frame */
};
+void amps_display_status(void);
void amps_channel_list(void);
int amps_channel_by_short_name(const char *short_name);
const char *chan_type_short_name(enum amps_chan_type chan_type);
@@ -182,6 +183,8 @@ const char *amps_min22number(uint16_t min2);
const char *amps_min12number(uint32_t min1);
void amps_number2min(const char *number, uint32_t *min1, uint16_t *min2);
const char *amps_min2number(uint32_t min1, uint16_t min2);
+void amps_encode_esn(uint32_t *esn, uint8_t mfr, uint32_t serial);
+void amps_decode_esn(uint32_t esn, uint8_t *mfr, uint32_t *serial);
const char *amps_scm(uint8_t scm);
int amps_create(const char *kanal, enum amps_chan_type chan_type, const char *device, int use_sdr, int samplerate, double rx_gain, double tx_gain, int pre_emphasis, int de_emphasis, const char *write_rx_wave, const char *write_tx_wave, const char *read_rx_wave, const char *read_tx_wave, amps_si *si, uint16_t sid, uint8_t sat, int polarity, int send_callerid, int tolerant, int loopback);
void amps_destroy(sender_t *sender);
diff --git a/src/amps/dsp.c b/src/amps/dsp.c
index a18abee..f0c5da2 100644
--- a/src/amps/dsp.c
+++ b/src/amps/dsp.c
@@ -82,8 +82,9 @@
#include <errno.h>
#include <math.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../libmobile/call.h"
+#include "../libmobile/get_time.h"
#include "amps.h"
#include "frame.h"
#include "dsp.h"
@@ -146,7 +147,7 @@ void dsp_init(void)
int i;
double s;
- PDEBUG(DDSP, DEBUG_DEBUG, "Generating sine table for SAT signal.\n");
+ LOGP(DDSP, LOGL_DEBUG, "Generating sine table for SAT signal.\n");
for (i = 0; i < 65536; i++) {
s = sin((double)i / 65536.0 * 2.0 * PI);
dsp_sine_sat[i] = s * ((!tacs) ? AMPS_SAT_DEVIATION : TACS_SAT_DEVIATION);
@@ -162,6 +163,8 @@ void dsp_init(void)
}
dsp_sync_check[0x712] = 0x00; /* no bit error */
dsp_sync_check[0x0ed] = 0x80; /* no bit error */
+
+ compandor_init();
}
static void dsp_init_ramp(amps_t *amps)
@@ -169,7 +172,7 @@ static void dsp_init_ramp(amps_t *amps)
double c;
int i;
- PDEBUG(DDSP, DEBUG_DEBUG, "Generating smooth ramp table.\n");
+ LOGP(DDSP, LOGL_DEBUG, "Generating smooth ramp table.\n");
for (i = 0; i < 256; i++) {
c = cos((double)i / 256.0 * PI);
#if 0
@@ -194,9 +197,9 @@ int dsp_init_sender(amps_t *amps, int tolerant)
int half;
/* attack (3ms) and recovery time (13.5ms) according to amps specs */
- init_compandor(&amps->cstate, 8000, 3.0, 13.5);
+ setup_compandor(&amps->cstate, 8000, 3.0, 13.5);
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Init DSP for transceiver.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Init DSP for transceiver.\n");
/* set modulation parameters */
sender_set_fm(&amps->sender,
@@ -206,18 +209,18 @@ int dsp_init_sender(amps_t *amps, int tolerant)
(!tacs) ? AMPS_MAX_DISPLAY : TACS_MAX_DISPLAY);
if (amps->sender.samplerate < 96000) {
- PDEBUG(DDSP, DEBUG_ERROR, "Sample rate must be at least 96000 Hz to process FSK and SAT signals.\n");
+ LOGP(DDSP, LOGL_ERROR, "Sample rate must be at least 96000 Hz to process FSK and SAT signals.\n");
return -EINVAL;
}
amps->fsk_bitduration = (double)amps->sender.samplerate / (double)((!tacs) ? AMPS_BITRATE : TACS_BITRATE);
amps->fsk_bitstep = 1.0 / amps->fsk_bitduration;
- PDEBUG(DDSP, DEBUG_DEBUG, "Use %.4f samples for full bit duration @ %d.\n", amps->fsk_bitduration, amps->sender.samplerate);
+ LOGP(DDSP, LOGL_DEBUG, "Use %.4f samples for full bit duration @ %d.\n", amps->fsk_bitduration, amps->sender.samplerate);
amps->fsk_tx_buffer_size = amps->fsk_bitduration + 10; /* 10 extra to avoid overflow due to rounding */
spl = calloc(sizeof(*spl), amps->fsk_tx_buffer_size);
if (!spl) {
- PDEBUG(DDSP, DEBUG_ERROR, "No memory!\n");
+ LOGP(DDSP, LOGL_ERROR, "No memory!\n");
rc = -ENOMEM;
goto error;
}
@@ -228,12 +231,12 @@ int dsp_init_sender(amps_t *amps, int tolerant)
amps->fsk_rx_window_begin = half >> 1;
amps->fsk_rx_window_half = half;
amps->fsk_rx_window_end = amps->fsk_rx_window_length - (half >> 1);
- PDEBUG(DDSP, DEBUG_DEBUG, "Bit window length: %d\n", amps->fsk_rx_window_length);
- PDEBUG(DDSP, DEBUG_DEBUG, " -> Samples in window to analyse level left of edge: %d..%d\n", amps->fsk_rx_window_begin, amps->fsk_rx_window_half - 1);
- PDEBUG(DDSP, DEBUG_DEBUG, " -> Samples in window to analyse level right of edge: %d..%d\n", amps->fsk_rx_window_half, amps->fsk_rx_window_end - 1);
+ LOGP(DDSP, LOGL_DEBUG, "Bit window length: %d\n", amps->fsk_rx_window_length);
+ LOGP(DDSP, LOGL_DEBUG, " -> Samples in window to analyse level left of edge: %d..%d\n", amps->fsk_rx_window_begin, amps->fsk_rx_window_half - 1);
+ LOGP(DDSP, LOGL_DEBUG, " -> Samples in window to analyse level right of edge: %d..%d\n", amps->fsk_rx_window_half, amps->fsk_rx_window_end - 1);
spl = calloc(sizeof(*amps->fsk_rx_window), amps->fsk_rx_window_length);
if (!spl) {
- PDEBUG(DDSP, DEBUG_ERROR, "No memory!\n");
+ LOGP(DDSP, LOGL_ERROR, "No memory!\n");
rc = -ENOMEM;
goto error;
}
@@ -250,10 +253,10 @@ int dsp_init_sender(amps_t *amps, int tolerant)
amps->sat_samples = (int)((double)amps->sender.samplerate * (1.0 / (SAT_BANDWIDTH / 2.0)) + 0.5);
spl = calloc(sizeof(*spl), amps->sat_samples);
if (!spl) {
- PDEBUG(DDSP, DEBUG_ERROR, "No memory!\n");
+ LOGP(DDSP, LOGL_ERROR, "No memory!\n");
return -ENOMEM;
}
- PDEBUG(DDSP, DEBUG_DEBUG, "Sat detection interval is %d ms.\n", amps->sat_samples * 1000 / amps->sender.samplerate);
+ LOGP(DDSP, LOGL_DEBUG, "Sat detection interval is %d ms.\n", amps->sat_samples * 1000 / amps->sender.samplerate);
amps->sat_filter_spl = spl;
/* count SAT tones */
@@ -287,7 +290,7 @@ error:
/* Cleanup transceiver instance. */
void dsp_cleanup_sender(amps_t *amps)
{
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Cleanup DSP for treansceiver.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Cleanup DSP for treansceiver.\n");
if (amps->fsk_tx_buffer)
free(amps->fsk_tx_buffer);
@@ -485,7 +488,12 @@ again:
case DSP_MODE_AUDIO_RX_AUDIO_TX:
memset(power, 1, length);
input_num = samplerate_upsample_input_num(&sender->srstate, length);
- jitter_load(&sender->dejitter, samples, input_num);
+ {
+ int16_t spl[input_num];
+ jitter_load_samples(&sender->dejitter, (uint8_t *)spl, input_num, sizeof(*spl), jitter_conceal_s16, NULL);
+ int16_to_samples_speech(samples, spl, input_num);
+ }
+ compress_audio(&amps->cstate, samples, input_num);
samplerate_upsample(&sender->srstate, samples, input_num, samples, length);
/* pre-emphasis */
if (amps->pre_emphasis)
@@ -768,7 +776,7 @@ static void sat_decode(amps_t *amps, sample_t *samples, int length)
/* debug SAT */
if (++amps->sat_print == SAT_PRINT) {
- PDEBUG_CHAN(DDSP, DEBUG_NOTICE, "SAT level %.2f%% quality %.0f%%\n", sat_level * 100.0, sat_quality * 100.0);
+ LOGP_CHAN(DDSP, LOGL_NOTICE, "SAT level %.2f%% quality %.0f%%\n", sat_level * 100.0, sat_quality * 100.0);
amps->sat_print = 0;
}
@@ -777,8 +785,8 @@ static void sat_decode(amps_t *amps, sample_t *samples, int length)
display_measurements_update(amps->dmp_sat_quality, sat_quality * 100.0, 0.0);
/* debug signaling tone */
- if (amps->sender.loopback || debuglevel == DEBUG_DEBUG) {
- PDEBUG_CHAN(DDSP, debuglevel, "Signaling Tone level %.2f%% quality %.0f%%\n", sig_level * 100.0, sig_quality * 100.0);
+ if (amps->sender.loopback || loglevel == LOGL_DEBUG) {
+ LOGP_CHAN(DDSP, loglevel, "Signaling Tone level %.2f%% quality %.0f%%\n", sig_level * 100.0, sig_quality * 100.0);
}
/* mute if SAT quality or level is below threshold */
@@ -794,7 +802,7 @@ static void sat_decode(amps_t *amps, sample_t *samples, int length)
if (amps->sat_detect_count == SAT_DETECT_COUNT) {
amps->sat_detected = 1;
amps->sat_detect_count = 0;
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "SAT signal detected with level=%.0f%%, quality=%.0f%%.\n", sat_level * 100.0, sat_quality * 100.0);
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "SAT signal detected with level=%.0f%%, quality=%.0f%%.\n", sat_level * 100.0, sat_quality * 100.0);
amps_rx_sat(amps, 1, sat_quality);
}
} else
@@ -805,7 +813,7 @@ static void sat_decode(amps_t *amps, sample_t *samples, int length)
if (amps->sat_detect_count == SAT_LOST_COUNT) {
amps->sat_detected = 0;
amps->sat_detect_count = 0;
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "SAT signal lost.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "SAT signal lost.\n");
amps_rx_sat(amps, 0, 0.0);
}
} else
@@ -819,7 +827,7 @@ static void sat_decode(amps_t *amps, sample_t *samples, int length)
if (amps->sig_detect_count == SIG_DETECT_COUNT) {
amps->sig_detected = 1;
amps->sig_detect_count = 0;
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Signaling Tone detected with level=%.0f%%, quality=%.0f%%.\n", sig_level * 100.0, sig_quality * 100.0);
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Signaling Tone detected with level=%.0f%%, quality=%.0f%%.\n", sig_level * 100.0, sig_quality * 100.0);
amps_rx_signaling_tone(amps, 1, sig_quality);
}
} else
@@ -830,7 +838,7 @@ static void sat_decode(amps_t *amps, sample_t *samples, int length)
if (amps->sig_detect_count == SIG_LOST_COUNT) {
amps->sig_detected = 0;
amps->sig_detect_count = 0;
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Signaling Tone lost.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Signaling Tone lost.\n");
amps_rx_signaling_tone(amps, 0, 0.0);
}
} else
@@ -916,7 +924,7 @@ void sender_receive(sender_t *sender, sample_t *samples, int length, double __at
/* Reset SAT detection states, so ongoing tone will be detected again. */
static void sat_reset(amps_t *amps, const char *reason)
{
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "SAT detector reset: %s.\n", reason);
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "SAT detector reset: %s.\n", reason);
amps->sat_detected = 0;
amps->sat_detect_count = 0;
amps->sig_detected = 0;
@@ -933,28 +941,30 @@ void amps_set_dsp_mode(amps_t *amps, enum dsp_mode mode, int frame_length)
if (mode == DSP_MODE_FRAME_RX_FRAME_TX) {
/* reset SAT detection */
sat_reset(amps, "Change to FOCC");
- PDEBUG_CHAN(DDSP, DEBUG_INFO, "Change mode to FOCC\n");
+ LOGP_CHAN(DDSP, LOGL_INFO, "Change mode to FOCC\n");
amps->tx_focc_debugged = 0;
}
if (amps->dsp_mode == DSP_MODE_FRAME_RX_FRAME_TX
&& (mode == DSP_MODE_AUDIO_RX_AUDIO_TX || mode == DSP_MODE_AUDIO_RX_FRAME_TX || mode == DSP_MODE_AUDIO_RX_SILENCE_TX)) {
/* reset SAT detection */
sat_reset(amps, "Change from FOCC to FVC");
- PDEBUG_CHAN(DDSP, DEBUG_INFO, "Change mode from FOCC to FVC\n");
+ LOGP_CHAN(DDSP, LOGL_INFO, "Change mode from FOCC to FVC\n");
}
if (amps->dsp_mode == DSP_MODE_OFF
&& (mode == DSP_MODE_AUDIO_RX_AUDIO_TX || mode == DSP_MODE_AUDIO_RX_FRAME_TX || mode == DSP_MODE_AUDIO_RX_SILENCE_TX)) {
/* reset SAT detection */
sat_reset(amps, "Enable FVC");
- PDEBUG_CHAN(DDSP, DEBUG_INFO, "Change mode from OFF to FVC\n");
+ LOGP_CHAN(DDSP, LOGL_INFO, "Change mode from OFF to FVC\n");
}
if (mode == DSP_MODE_OFF) {
/* reset SAT detection */
sat_reset(amps, "Disable FVC");
- PDEBUG_CHAN(DDSP, DEBUG_INFO, "Change mode from FVC to OFF\n");
+ LOGP_CHAN(DDSP, LOGL_INFO, "Change mode from FVC to OFF\n");
}
+ if (mode == DSP_MODE_AUDIO_RX_AUDIO_TX && amps->dsp_mode != mode)
+ jitter_reset(&amps->sender.dejitter);
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Reset FSK frame transmitter, due to setting dsp mode.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Reset FSK frame transmitter, due to setting dsp mode.\n");
amps->dsp_mode = mode;
if (frame_length)
@@ -971,3 +981,27 @@ void amps_set_dsp_mode(amps_t *amps, enum dsp_mode mode, int frame_length)
amps->fsk_tx_frame_pos = 0;
}
+/* Receive audio from call instance. */
+void call_down_audio(void *decoder, void *decoder_priv, int callref, uint16_t sequence, uint8_t marker, uint32_t timestamp, uint32_t ssrc, uint8_t *payload, int payload_len)
+{
+ sender_t *sender;
+ amps_t *amps;
+
+ for (sender = sender_head; sender; sender = sender->next) {
+ amps = (amps_t *) sender;
+ if (amps->trans_list && amps->trans_list->callref == callref)
+ break;
+ }
+ if (!sender)
+ return;
+
+ if (amps->dsp_mode == DSP_MODE_AUDIO_RX_AUDIO_TX) {
+ jitter_frame_t *jf;
+ jf = jitter_frame_alloc(decoder, decoder_priv, payload, payload_len, marker, sequence, timestamp, ssrc);
+ if (jf)
+ jitter_save(&amps->sender.dejitter, jf);
+ }
+}
+
+void call_down_clock(void) {}
+
diff --git a/src/amps/esn.c b/src/amps/esn.c
new file mode 100644
index 0000000..93bcb70
--- /dev/null
+++ b/src/amps/esn.c
@@ -0,0 +1,153 @@
+/* AMPS ESN specification
+ *
+ * (C) 2023 by Andreas Eversberg <jolly@eversberg.eu>
+ * All Rights Reserved
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+#include <pthread.h>
+#include <sys/time.h>
+#include "../libsample/sample.h"
+#include "../liblogging/logging.h"
+#include "../libmobile/call.h"
+#include "../libmobile/cause.h"
+#include <osmocom/cc/message.h>
+#include "amps.h"
+#include "esn.h"
+
+const char *amps_manufacturer[256] = {
+ [129] = "Oki",
+ [130] = "Motorola, Inc.",
+ [131] = "E.F. Johnson",
+ [132] = "Hitachi",
+ [133] = "Fujitsu",
+ [134] = "Mitsubishi",
+ [135] = "NEC America, Inc.",
+ [136] = "Matsushita (Panasonic)",
+ [137] = "Harris",
+ [138] = "Toshiba",
+ [139] = "Kokusai",
+ [140] = "Clarion Company, Ltd.",
+ [141] = "GoldStar Products Co.,Ltd.",
+ [142] = "International Systcom (Novatel)",
+ [143] = "Ericsson, Inc.",
+ [144] = "Murata Machinery, Ltd.",
+ [145] = "DI-BAR Electronics, Inc.",
+ [146] = "Ericsson Inc. (formerly assigned to General Electric)",
+ [147] = "Gateway Telephone, Inc.",
+ [148] = "Robert Bosch Corporation (Blaupunkt)",
+ [149] = "Universal Cellular, Inc.",
+ [150] = "Alpine Electronics of America, Inc.",
+ [151] = "Verma Laboratories",
+ [152] = "Japan Radio Co.,Ltd.",
+ [153] = "CM Communications Incorporated",
+ [154] = "Sony Corporation (Japan)",
+ [155] = "Tama Denki Company, Ltd.",
+ [156] = "Mobira (Nokia-Kinex)",
+ [157] = "Ericsson GE Mobile Communications, Inc.",
+ [158] = "AT&T Technologies, Inc.",
+ [159] = "QUALCOMM, Incorporated",
+ [160] = "Hyundai",
+ [161] = "Satellite Technology Services, Inc.",
+ [162] = "Technophone Limited",
+ [163] = "Yupiteru Industries Company Ltd.",
+ [164] = "Hughes Network Systems",
+ [165] = "TMC Company Limited (Nokia)",
+ [166] = "Clarion Manufacturing Corporation of America",
+ [167] = "Mansoor Electronics Limited",
+ [168] = "Motorola International",
+ [169] = "Otron Corporation",
+ [170] = "Philips Telecom Equipment Corporation",
+ [171] = "Philips Circuit Assemblies",
+ [172] = "Uniden Corporation of America",
+ [173] = "Uniden Corporation - Japan",
+ [174] = "Shintom West Corporation of America",
+ [175] = "Tottori Sanyo Electric Co. Ltd.",
+ [176] = "Samsung Communications",
+ [177] = "INFA Telecom Canada, Inc.",
+ [178] = "Emptel Electronics Company Ltd.",
+ [179] = "**Unassigned**",
+ [180] = "ASCNet",
+ [181] = "Yaesu USA",
+ [182] = "Tecom Co. Ltd.",
+ [183] = "Omni Telecommunications, Inc. (formerly assigned to Valor Electronics, Inc.)",
+ [184] = "Royal Information Electronics Co. Ltd.",
+ [185] = "Tele Digital Development, Inc. (formerly assigned to Cumulus Corporation.)",
+ [186] = "DNC",
+ [187] = "**Unassigned**",
+ [188] = "Myday Technology, Ltd.",
+ [189] = "NEC America, Inc.",
+ [190] = "Kyocera Corporation",
+ [191] = "Digital Security Controls",
+ [192] = "CTCELL Digital, Inc.",
+ [193] = "Matsushita Communication Industrial Corporation of America",
+ [194] = "HS Electronics Corporation",
+ [195] = "Motorola, Inc.",
+ [196] = "Pacific Communication Sciences, Inc.",
+ [197] = "Maxon Systems, Inc., (London) Ltd.",
+ [198] = "Hongsheng Electronics Co., Ltd.",
+ [199] = "M/ACOM",
+ [200] = "CHANNLE LINK Incorporation",
+ [201] = "L.G. Information & Communications (formerly assigned to Goldstar Information & Communications, Ltd.)",
+ [202] = "Intel Corporation",
+ [203] = "Air Communications, Inc.",
+ [204] = "Ericsson GE Mobile Communications Inc.",
+ [205] = "Goldtron RF PTE Ltd.",
+ [206] = "Sierra Wireless Inc.",
+ [207] = "Mitsubishi International Corp.",
+ [208] = "JRC International, Inc.",
+ [209] = "Sapura Holdings SDN. BHD.",
+ [210] = "Inex Technologies, Inc.",
+ [211] = "Sony Electronics (U.S.A.)",
+ [212] = "Motorola, Inc.",
+ [213] = "Motorola, Inc.",
+ [214] = "Philips Semiconductors",
+ [215] = "Carillon Corp.",
+ [216] = "Nippondenso America, Inc.",
+ [217] = "International Business Machines Corporation",
+ [218] = "Nokia (Hong Kong)",
+ [219] = "Nokia (TMC Co. Ltd.)",
+ [220] = "TEMIC",
+ [221] = "Northern Telecom",
+ [222] = "Telrad Telecommunications Ltd.",
+ [223] = "Motorola, Inc.",
+ [224] = "Motorola, Inc.",
+ [225] = "Telital s.r.l.",
+ [226] = "Nokia (Manau, Brazil)",
+ [227] = "Stanilite Pacific",
+ [228] = "Philips Consumer Communications",
+ [229] = "NEC America, Inc.",
+ [230] = "TELLULAR Corporation",
+ [231] = "Ericsson Inc.",
+};
+
+const char *esn_to_string(uint32_t esn)
+{
+ uint8_t mfr;
+ uint32_t serial;
+ static char esn_string[256];
+
+ amps_decode_esn(esn, &mfr, &serial);
+
+ if (amps_manufacturer[mfr])
+ snprintf(esn_string, sizeof(esn_string), "0x%08x or %d-%06d (%s)", esn, mfr, serial, amps_manufacturer[mfr]);
+ else
+ snprintf(esn_string, sizeof(esn_string), "0x%08x or %d-%06d", esn, mfr, serial);
+
+ return esn_string;
+}
diff --git a/src/amps/esn.h b/src/amps/esn.h
new file mode 100644
index 0000000..713ff12
--- /dev/null
+++ b/src/amps/esn.h
@@ -0,0 +1,3 @@
+
+const char *esn_to_string(uint32_t esn);
+
diff --git a/src/amps/frame.c b/src/amps/frame.c
index e89f3d5..14bd856 100644
--- a/src/amps/frame.c
+++ b/src/amps/frame.c
@@ -27,7 +27,8 @@
#include <math.h>
#include <inttypes.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
+#include "../libmobile/get_time.h"
#include "amps.h"
#include "dsp.h"
#include "frame.h"
@@ -2719,7 +2720,7 @@ static uint64_t amps_encode_word(frame_t *frame, struct def_word *w, int debug)
sum_bits += w->ie[i].bits;
if (debug)
- PDEBUG(DFRAME, DEBUG_INFO, "Transmit: %s\n", w->name);
+ LOGP(DFRAME, LOGL_INFO, "Transmit: %s\n", w->name);
word = 0;
for (i = 0; w->ie[i].name; i++) {
bits = w->ie[i].bits;
@@ -2730,9 +2731,9 @@ static uint64_t amps_encode_word(frame_t *frame, struct def_word *w, int debug)
word = (word << bits) | (value & cut_bits[bits]);
if (debug) {
if (amps_ie_desc[w->ie[i].ie].decoder)
- PDEBUG(DFRAME, DEBUG_DEBUG, " %s%s: %" PRIu64 " = %s (%s)\n", spaces + strlen(w->ie[i].name), w->ie[i].name, value, amps_ie_desc[w->ie[i].ie].decoder(value), amps_ie_desc[w->ie[i].ie].desc);
+ LOGP(DFRAME, LOGL_DEBUG, " %s%s: %" PRIu64 " = %s (%s)\n", spaces + strlen(w->ie[i].name), w->ie[i].name, value, amps_ie_desc[w->ie[i].ie].decoder(value), amps_ie_desc[w->ie[i].ie].desc);
else
- PDEBUG(DFRAME, DEBUG_DEBUG, " %s%s: %" PRIu64 " (%s)\n", spaces + strlen(w->ie[i].name), w->ie[i].name, value, amps_ie_desc[w->ie[i].ie].desc);
+ LOGP(DFRAME, LOGL_DEBUG, " %s%s: %" PRIu64 " (%s)\n", spaces + strlen(w->ie[i].name), w->ie[i].name, value, amps_ie_desc[w->ie[i].ie].desc);
}
/* show result for 3 IEs of table 4 */
if (w->ie[i].ie == AMPS_IE_LOCAL_MSG_TYPE || w->ie[i].ie == AMPS_IE_ORDQ || w->ie[i].ie == AMPS_IE_ORDER)
@@ -2740,7 +2741,7 @@ static uint64_t amps_encode_word(frame_t *frame, struct def_word *w, int debug)
if (t4 == 3) {
t4 = 0;
if (debug)
- PDEBUG(DFRAME, DEBUG_DEBUG, " %s--> %s\n", spaces, amps_table4_name(frame->ie[AMPS_IE_LOCAL_MSG_TYPE], frame->ie[AMPS_IE_ORDQ], frame->ie[AMPS_IE_ORDER]));
+ LOGP(DFRAME, LOGL_DEBUG, " %s--> %s\n", spaces, amps_table4_name(frame->ie[AMPS_IE_LOCAL_MSG_TYPE], frame->ie[AMPS_IE_ORDQ], frame->ie[AMPS_IE_ORDER]));
}
}
@@ -3070,22 +3071,22 @@ static frame_t *amps_decode_word(uint64_t word, struct def_word *w)
for (i = 0; w->ie[i].name; i++)
bits_left += w->ie[i].bits;
- PDEBUG(DFRAME, DEBUG_INFO, "Received: %s\n", w->name);
+ LOGP(DFRAME, LOGL_INFO, "Received: %s\n", w->name);
for (i = 0; w->ie[i].name; i++) {
bits = w->ie[i].bits;
bits_left -= bits;
value = (word >> bits_left) & cut_bits[bits];
frame.ie[w->ie[i].ie] = value;
if (amps_ie_desc[w->ie[i].ie].decoder)
- PDEBUG(DFRAME, DEBUG_DEBUG, " %s%s: %" PRIu64 " = %s (%s)\n", spaces + strlen(w->ie[i].name), w->ie[i].name, value, amps_ie_desc[w->ie[i].ie].decoder(value), amps_ie_desc[w->ie[i].ie].desc);
+ LOGP(DFRAME, LOGL_DEBUG, " %s%s: %" PRIu64 " = %s (%s)\n", spaces + strlen(w->ie[i].name), w->ie[i].name, value, amps_ie_desc[w->ie[i].ie].decoder(value), amps_ie_desc[w->ie[i].ie].desc);
else
- PDEBUG(DFRAME, DEBUG_DEBUG, " %s%s: %" PRIu64 " (%s)\n", spaces + strlen(w->ie[i].name), w->ie[i].name, value, amps_ie_desc[w->ie[i].ie].desc);
+ LOGP(DFRAME, LOGL_DEBUG, " %s%s: %" PRIu64 " (%s)\n", spaces + strlen(w->ie[i].name), w->ie[i].name, value, amps_ie_desc[w->ie[i].ie].desc);
/* show result for 3 IEs of table 4 */
if (w->ie[i].ie == AMPS_IE_LOCAL_MSG_TYPE || w->ie[i].ie == AMPS_IE_ORDQ || w->ie[i].ie == AMPS_IE_ORDER)
t4++;
if (t4 == 3) {
t4 = 0;
- PDEBUG(DFRAME, DEBUG_DEBUG, " %s--> %s\n", spaces, amps_table4_name(frame.ie[AMPS_IE_LOCAL_MSG_TYPE], frame.ie[AMPS_IE_ORDQ], frame.ie[AMPS_IE_ORDER]));
+ LOGP(DFRAME, LOGL_DEBUG, " %s--> %s\n", spaces, amps_table4_name(frame.ie[AMPS_IE_LOCAL_MSG_TYPE], frame.ie[AMPS_IE_ORDQ], frame.ie[AMPS_IE_ORDER]));
}
}
@@ -3103,7 +3104,7 @@ static void amps_decode_word_focc(amps_t *amps, uint64_t word)
/* control message */
if (t1t2 != 3) {
- PDEBUG_CHAN(DFRAME, DEBUG_INFO, "Received Mobile Station Control Message (T1T2 = %d)\n", t1t2);
+ LOGP_CHAN(DFRAME, LOGL_INFO, "Received Mobile Station Control Message (T1T2 = %d)\n", t1t2);
if (t1t2 == 1)
amps->rx_focc_word_count = 1;
if (t1t2 == 0 || t1t2 == 1) {
@@ -3120,7 +3121,7 @@ static void amps_decode_word_focc(amps_t *amps, uint64_t word)
w = &word2_extended_address_word_b;
goto decode;
}
- PDEBUG_CHAN(DFRAME, DEBUG_INFO, "Decoding of more than 2 Control messages not supported\n");
+ LOGP_CHAN(DFRAME, LOGL_INFO, "Decoding of more than 2 Control messages not supported\n");
}
return;
}
@@ -3188,14 +3189,14 @@ static void amps_decode_word_focc(amps_t *amps, uint64_t word)
decode:
if (!w) {
- PDEBUG_CHAN(DFRAME, DEBUG_INFO, "Received Illegal Overhead Message\n");
+ LOGP_CHAN(DFRAME, LOGL_INFO, "Received Illegal Overhead Message\n");
return;
}
frame = amps_decode_word(word, w);
/* show control filler delay */
if (amps->sender.loopback && ohd == 1)
- PDEBUG_CHAN(DDSP, DEBUG_NOTICE, "Round trip delay is %.3f seconds\n", amps->when_received - amps->when_transmitted[frame->ie[AMPS_IE_1111]]);
+ LOGP_CHAN(DDSP, LOGL_NOTICE, "Round trip delay is %.3f seconds\n", amps->when_received - amps->when_transmitted[frame->ie[AMPS_IE_1111]]);
}
/* get word from data bits and call decoder function
@@ -3214,24 +3215,24 @@ static int amps_decode_word_recc(amps_t *amps, uint64_t word, int first)
amps->rx_recc_word_count = 0;
amps->rx_recc_nawc = nawc;
if (f == 0) {
- PDEBUG_CHAN(DFRAME, DEBUG_NOTICE, "Received first word, but F bit is not set.\n");
+ LOGP_CHAN(DFRAME, LOGL_NOTICE, "Received first word, but F bit is not set.\n");
return 0;
}
} else {
if (f == 1) {
- PDEBUG_CHAN(DFRAME, DEBUG_NOTICE, "Received additional word, but F bit is set.\n");
+ LOGP_CHAN(DFRAME, LOGL_NOTICE, "Received additional word, but F bit is set.\n");
return 0;
}
amps->rx_recc_nawc--;
if (amps->rx_recc_nawc != nawc) {
- PDEBUG_CHAN(DFRAME, DEBUG_NOTICE, "Received additional word with NAWC mismatch!\n");
+ LOGP_CHAN(DFRAME, LOGL_NOTICE, "Received additional word with NAWC mismatch!\n");
}
}
msg_count = amps->rx_recc_word_count;
if (msg_count == 8) {
- PDEBUG_CHAN(DFRAME, DEBUG_NOTICE, "Received too many words.\n");
+ LOGP_CHAN(DFRAME, LOGL_NOTICE, "Received too many words.\n");
return 0;
}
@@ -3268,7 +3269,7 @@ static int amps_decode_word_recc(amps_t *amps, uint64_t word, int first)
if (!w) {
- PDEBUG_CHAN(DFRAME, DEBUG_INFO, "Received Illegal RECC Message\n");
+ LOGP_CHAN(DFRAME, LOGL_INFO, "Received Illegal RECC Message\n");
goto done;
}
@@ -3333,7 +3334,7 @@ static int amps_decode_word_recc(amps_t *amps, uint64_t word, int first)
amps->rx_recc_dialing[31] = digit2number[frame->ie[AMPS_IE_DIGIT_32]];
}
- PDEBUG_CHAN(DFRAME, DEBUG_INFO, "expecting %d more word(s) to come\n", amps->rx_recc_nawc);
+ LOGP_CHAN(DFRAME, LOGL_INFO, "expecting %d more word(s) to come\n", amps->rx_recc_nawc);
if (msg_count >= 3 && amps->rx_recc_nawc == 0) {
/* if no digit messages are present, send NULL as dial string (paging reply) */
@@ -3400,16 +3401,16 @@ static void amps_encode_focc_bits(uint64_t word_a, uint64_t word_b, char *bits)
bits[k] = '\0';
#ifdef BIT_DEBUGGING
- if (debuglevel == DEBUG_DEBUG) {
+ if (loglevel == LOGL_DEBUG) {
char text[64];
strncpy(text, bits, 23);
text[23] = '\0';
- PDEBUG(DFRAME, DEBUG_INFO, "TX FOCC: %s\n", text);
+ LOGP(DFRAME, LOGL_INFO, "TX FOCC: %s\n", text);
for (i = 0; i < 10; i++) {
strncpy(text, bits + 23 + i * 44, 44);
text[44] = '\0';
- PDEBUG(DFRAME, DEBUG_DEBUG, " word %c - %s\n", (i & 1) ? 'b' : 'a', text);
+ LOGP(DFRAME, LOGL_DEBUG, " word %c - %s\n", (i & 1) ? 'b' : 'a', text);
}
}
#endif
@@ -3440,8 +3441,8 @@ static void amps_encode_fvc_bits(uint64_t word_a, char *bits)
bits[k] = '\0';
#ifdef BIT_DEBUGGING
- if (debuglevel == DEBUG_DEBUG) {
- PDEBUG(DFRAME, DEBUG_INFO, "TX FVC: %s\n", bits);
+ if (loglevel == LOGL_DEBUG) {
+ LOGP(DFRAME, LOGL_INFO, "TX FVC: %s\n", bits);
}
#endif
}
@@ -3511,7 +3512,7 @@ int amps_encode_frame_focc(amps_t *amps, char *bits)
if (++amps->tx_focc_frame_count >= amps->si.overhead_repeat)
amps->tx_focc_frame_count = 0;
if (debug)
- PDEBUG_CHAN(DFRAME, DEBUG_INFO, "Subsequent system/filler frames are not show, to prevent flooding the output.\n");
+ LOGP_CHAN(DFRAME, LOGL_INFO, "Subsequent system/filler frames are not show, to prevent flooding the output.\n");
amps->tx_focc_debugged = 1;
send:
@@ -3626,17 +3627,17 @@ static void amps_decode_bits_focc(amps_t *amps, const char *bits)
else
idle = 0;
- PDEBUG_CHAN(DFRAME, DEBUG_INFO, "RX FOCC: B/I = %s\n", (idle) ? "idle" : "busy");
- if (debuglevel == DEBUG_DEBUG) {
+ LOGP_CHAN(DFRAME, LOGL_INFO, "RX FOCC: B/I = %s\n", (idle) ? "idle" : "busy");
+ if (loglevel == LOGL_DEBUG) {
char text[64];
for (i = 0; i < 10; i++) {
strncpy(text, bits + i * 44, 44);
text[44] = '\0';
if ((i & 1) == 0)
- PDEBUG_CHAN(DFRAME, DEBUG_DEBUG, " word a - %s%s\n", text, (crc_a_ok[i >> 1]) ? " ok" : " BAD CRC!");
+ LOGP_CHAN(DFRAME, LOGL_DEBUG, " word a - %s%s\n", text, (crc_a_ok[i >> 1]) ? " ok" : " BAD CRC!");
else
- PDEBUG_CHAN(DFRAME, DEBUG_DEBUG, " word b - %s%s\n", text, (crc_b_ok[i >> 1]) ? " ok" : " BAD CRC!");
+ LOGP_CHAN(DFRAME, LOGL_DEBUG, " word b - %s%s\n", text, (crc_b_ok[i >> 1]) ? " ok" : " BAD CRC!");
}
}
@@ -3712,7 +3713,7 @@ static int amps_decode_bits_recc(amps_t *amps, const char *bits, int first)
crc_ok++;
}
if (crc_ok) {
- PDEBUG_CHAN(DFRAME, DEBUG_NOTICE, "Seems we RX FOCC frame due to loopback, ignoring!\n");
+ LOGP_CHAN(DFRAME, LOGL_NOTICE, "Seems we RX FOCC frame due to loopback, ignoring!\n");
return 0;
}
bits_ -= 221;
@@ -3724,24 +3725,24 @@ static int amps_decode_bits_recc(amps_t *amps, const char *bits, int first)
}
if (first) {
- if (debuglevel == DEBUG_DEBUG || crc_ok_count > 0) {
- PDEBUG_CHAN(DFRAME, DEBUG_INFO, "RX RECC: DCC=%d (%d of 5 CRCs are ok)\n", dcc, crc_ok_count);
+ if (loglevel == LOGL_DEBUG || crc_ok_count > 0) {
+ LOGP_CHAN(DFRAME, LOGL_INFO, "RX RECC: DCC=%d (%d of 5 CRCs are ok)\n", dcc, crc_ok_count);
if (dcc != amps->si.dcc) {
- PDEBUG(DFRAME, DEBUG_INFO, "received DCC=%d mismatches the base station's DCC=%d\n", dcc, amps->si.dcc);
+ LOGP(DFRAME, LOGL_INFO, "received DCC=%d mismatches the base station's DCC=%d\n", dcc, amps->si.dcc);
return 0;
}
}
} else {
- if (debuglevel == DEBUG_DEBUG || crc_ok_count > 0)
- PDEBUG_CHAN(DFRAME, DEBUG_INFO, "RX RECC: (%d of 5 CRCs are ok)\n", crc_ok_count);
+ if (loglevel == LOGL_DEBUG || crc_ok_count > 0)
+ LOGP_CHAN(DFRAME, LOGL_INFO, "RX RECC: (%d of 5 CRCs are ok)\n", crc_ok_count);
}
- if (debuglevel == DEBUG_DEBUG) {
+ if (loglevel == LOGL_DEBUG) {
char text[64];
for (i = 0; i < 5; i++) {
strncpy(text, bits + i * 48, 48);
text[48] = '\0';
- PDEBUG_CHAN(DFRAME, DEBUG_DEBUG, " word - %s%s\n", text, (crc_a_ok[i]) ? " ok" : " BAD CRC!");
+ LOGP_CHAN(DFRAME, LOGL_DEBUG, " word - %s%s\n", text, (crc_a_ok[i]) ? " ok" : " BAD CRC!");
}
}
@@ -3756,7 +3757,7 @@ int amps_decode_frame(amps_t *amps, const char *bits, int count, double level, d
/* not if additional words are received without sync */
if (count != 240) {
- PDEBUG_CHAN(DDSP, DEBUG_INFO, "RX Level: %.0f%% Quality: %.0f%% Polarity: %s\n", level * 100.0, quality * 100.0, (negative) ? "NEGATIVE" : "POSITIVE");
+ LOGP_CHAN(DDSP, LOGL_INFO, "RX Level: %.0f%% Quality: %.0f%% Polarity: %s\n", level * 100.0, quality * 100.0, (negative) ? "NEGATIVE" : "POSITIVE");
}
if (count == 441) {
amps_decode_bits_focc(amps, bits);
@@ -3765,7 +3766,7 @@ int amps_decode_frame(amps_t *amps, const char *bits, int count, double level, d
} else if (count == 240) {
more = amps_decode_bits_recc(amps, bits, 0);
} else {
- PDEBUG_CHAN(DFRAME, DEBUG_ERROR, "Frame with unknown length = %d, please fix!\n", count);
+ LOGP_CHAN(DFRAME, LOGL_ERROR, "Frame with unknown length = %d, please fix!\n", count);
}
return more;
diff --git a/src/amps/jtacs_tones.c b/src/amps/jtacs_tones.c
index 1530b57..e54918a 100644
--- a/src/amps/jtacs_tones.c
+++ b/src/amps/jtacs_tones.c
@@ -1,4 +1,5 @@
#include <stdint.h>
+#include "tones.h"
static int16_t pattern_ringback[1000] = {
0x00e5, 0x0070, 0x001c, 0x0001, 0x001c, 0x0070, 0x00e5, 0x0168,
diff --git a/src/amps/main_common.c b/src/amps/main_common.c
index d7a5ed5..9acaa61 100644
--- a/src/amps/main_common.c
+++ b/src/amps/main_common.c
@@ -24,7 +24,7 @@
#include <errno.h>
#include "../libsample/sample.h"
#include "../libmobile/main_mobile.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../libmobile/call.h"
#include "../liboptions/options.h"
#include "../libfm/fm.h"
@@ -44,6 +44,13 @@ int send_callerid = 0;
int dcc = 0, scc = 0, sid = 0, regh = 1, regr = 1, pureg = 0, pdreg = 0, locaid = -1, regincr = 300, bis = 0;
int tolerant = 0;
+static void print_location_area_note(void)
+{
+ /* - - */
+ printf(" Warning: Older phones may not like this and show 'No Service'!\n");
+ printf(" Note: This feature was added 1995 to the standard, it might not work.\n");
+}
+
void print_help(const char *arg0)
{
if (!tacs)
@@ -97,14 +104,14 @@ void print_help(const char *arg0)
printf(" many second the phone waits before it re-registers.\n");
printf(" -S --sysinfo pureg=0 | pureg=1\n");
printf(" If 1, phone registers on every power on (default = '%d')\n", pureg);
- printf(" Warning: Older phones may not like this and show 'No Service'!\n");
+ print_location_area_note();
printf(" -S --sysinfo pdreg=0 | pdreg=1\n");
printf(" If 1, phone de-registers on every power down (default = '%d')\n", pureg);
- printf(" Warning: Older phones may not like this and show 'No Service'!\n");
+ print_location_area_note();
printf(" -S --sysinfo locaid=<location area ID > | locaid=-1 to disable\n");
printf(" (default = '%d')\n", locaid);
printf(" If it changes, phone re-registers.\n");
- printf(" Warning: Older phones may not like this and show 'No Service'!\n");
+ print_location_area_note();
printf(" -S --sysinfo regh=0 | regh=1\n");
printf(" If 1, phone registers only if System ID matches (default = '%d')\n", regh);
printf(" -S --sysinfo regr=0 | regr=1\n");
@@ -423,6 +430,7 @@ fail:
amps_destroy(sender_head);
/* exits */
+ main_mobile_exit();
fm_exit();
options_free();
diff --git a/src/amps/sysinfo.c b/src/amps/sysinfo.c
index ce060b2..bfd31b8 100644
--- a/src/amps/sysinfo.c
+++ b/src/amps/sysinfo.c
@@ -2,6 +2,7 @@
#include <stdint.h>
#include <string.h>
#include <stdlib.h>
+#include <stdbool.h>
#include <time.h>
#include "../libsample/sample.h"
#include "amps.h"
diff --git a/src/amps/tacs_outoforder.c b/src/amps/tacs_outoforder.c
index ab2009a..e217b24 100644
--- a/src/amps/tacs_outoforder.c
+++ b/src/amps/tacs_outoforder.c
@@ -1,4 +1,5 @@
#include <stdint.h>
+#include "outoforder.h"
static int16_t pattern[] = {
0x0000, 0x0000, 0xffff, 0x0002, 0xfffe, 0x0003, 0xfffd, 0x0001,
diff --git a/src/amps/tacs_tones.c b/src/amps/tacs_tones.c
index 577dad7..8c1815f 100644
--- a/src/amps/tacs_tones.c
+++ b/src/amps/tacs_tones.c
@@ -1,4 +1,5 @@
#include <stdint.h>
+#include "tones.h"
static int16_t pattern_ringback[] = {
0x000b, 0x0008, 0x000d, 0x000e, 0x000d, 0x0012, 0x0011, 0xffcd,
diff --git a/src/amps/transaction.c b/src/amps/transaction.c
index f8a4aee..1abd403 100644
--- a/src/amps/transaction.c
+++ b/src/amps/transaction.c
@@ -21,7 +21,7 @@
#include <stdint.h>
#include <stdlib.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../libmobile/call.h"
#include "../libmobile/cause.h"
#include "amps.h"
@@ -133,7 +133,7 @@ transaction_t *create_transaction(amps_t *amps, enum amps_trans_state state, uin
const char *number = amps_min2number(trans->min1, trans->min2);
int old_callref = trans->callref;
amps_t *old_amps = trans->amps;
- PDEBUG(DTRANS, DEBUG_NOTICE, "Found already pending transaction for subscriber '%s', deleting!\n", number);
+ LOGP(DTRANS, LOGL_NOTICE, "Found already pending transaction for subscriber '%s', deleting!\n", number);
destroy_transaction(trans);
if (old_amps) /* should be... */
amps_go_idle(old_amps);
@@ -143,11 +143,11 @@ transaction_t *create_transaction(amps_t *amps, enum amps_trans_state state, uin
trans = calloc(1, sizeof(*trans));
if (!trans) {
- PDEBUG(DTRANS, DEBUG_ERROR, "No memory!\n");
+ LOGP(DTRANS, LOGL_ERROR, "No memory!\n");
return NULL;
}
- timer_init(&trans->timer, transaction_timeout, trans);
+ osmo_timer_setup(&trans->timer, transaction_timeout, trans);
trans_new_state(trans, state);
trans->min1 = min1;
@@ -159,7 +159,7 @@ transaction_t *create_transaction(amps_t *amps, enum amps_trans_state state, uin
trans->chan = chan;
const char *number = amps_min2number(trans->min1, trans->min2);
- PDEBUG(DTRANS, DEBUG_INFO, "Created transaction for subscriber '%s'\n", number);
+ LOGP(DTRANS, LOGL_INFO, "Created transaction for subscriber '%s'\n", number);
link_transaction(trans, amps);
@@ -172,9 +172,9 @@ void destroy_transaction(transaction_t *trans)
unlink_transaction(trans);
const char *number = amps_min2number(trans->min1, trans->min2);
- PDEBUG(DTRANS, DEBUG_INFO, "Destroying transaction for subscriber '%s'\n", number);
+ LOGP(DTRANS, LOGL_INFO, "Destroying transaction for subscriber '%s'\n", number);
- timer_exit(&trans->timer);
+ osmo_timer_del(&trans->timer);
trans_new_state(trans, 0);
@@ -187,7 +187,7 @@ void link_transaction(transaction_t *trans, amps_t *amps)
transaction_t **transp;
/* attach to end of list, so first transaction is served first */
- PDEBUG(DTRANS, DEBUG_DEBUG, "Linking transaction %p to amps %p\n", trans, amps);
+ LOGP(DTRANS, LOGL_DEBUG, "Linking transaction %p to amps %p\n", trans, amps);
trans->amps = amps;
trans->next = NULL;
transp = &amps->trans_list;
@@ -203,12 +203,12 @@ void unlink_transaction(transaction_t *trans)
transaction_t **transp;
/* unlink */
- PDEBUG(DTRANS, DEBUG_DEBUG, "Unlinking transaction %p from amps %p\n", trans, trans->amps);
+ LOGP(DTRANS, LOGL_DEBUG, "Unlinking transaction %p from amps %p\n", trans, trans->amps);
transp = &trans->amps->trans_list;
while (*transp && *transp != trans)
transp = &((*transp)->next);
if (!(*transp)) {
- PDEBUG(DTRANS, DEBUG_ERROR, "Transaction not in list, please fix!!\n");
+ LOGP(DTRANS, LOGL_ERROR, "Transaction not in list, please fix!!\n");
abort();
}
*transp = trans->next;
@@ -224,7 +224,7 @@ transaction_t *search_transaction_number(amps_t *amps, uint32_t min1, uint16_t m
if (trans->min1 == min1
&& trans->min2 == min2) {
const char *number = amps_min2number(trans->min1, trans->min2);
- PDEBUG(DTRANS, DEBUG_DEBUG, "Found transaction for subscriber '%s'\n", number);
+ LOGP(DTRANS, LOGL_DEBUG, "Found transaction for subscriber '%s'\n", number);
return trans;
}
trans = trans->next;
@@ -243,7 +243,7 @@ transaction_t *search_transaction_callref(amps_t *amps, int callref)
while (trans) {
if (trans->callref == callref) {
const char *number = amps_min2number(trans->min1, trans->min2);
- PDEBUG(DTRANS, DEBUG_DEBUG, "Found transaction for subscriber '%s'\n", number);
+ LOGP(DTRANS, LOGL_DEBUG, "Found transaction for subscriber '%s'\n", number);
return trans;
}
trans = trans->next;
@@ -254,7 +254,7 @@ transaction_t *search_transaction_callref(amps_t *amps, int callref)
void trans_new_state(transaction_t *trans, int state)
{
- PDEBUG(DTRANS, DEBUG_INFO, "Transaction state %s -> %s\n", trans_state_name(trans->state), trans_state_name(state));
+ LOGP(DTRANS, LOGL_INFO, "Transaction state %s -> %s\n", trans_state_name(trans->state), trans_state_name(state));
trans->state = state;
amps_display_status();
}
@@ -263,12 +263,12 @@ void amps_flush_other_transactions(amps_t *amps, transaction_t *trans)
{
/* flush after this very trans */
while (trans->next) {
- PDEBUG(DTRANS, DEBUG_NOTICE, "Kicking other pending transaction\n");
+ LOGP(DTRANS, LOGL_NOTICE, "Kicking other pending transaction\n");
destroy_transaction(trans->next);
}
/* flush before this very trans */
while (amps->trans_list != trans) {
- PDEBUG(DTRANS, DEBUG_NOTICE, "Kicking other pending transaction\n");
+ LOGP(DTRANS, LOGL_NOTICE, "Kicking other pending transaction\n");
destroy_transaction(amps->trans_list);
}
}
diff --git a/src/amps/transaction.h b/src/amps/transaction.h
index 6cd6441..29da337 100644
--- a/src/amps/transaction.h
+++ b/src/amps/transaction.h
@@ -39,7 +39,7 @@ typedef struct transaction {
char caller_id[33]; /* id of calling phone */
char dialing[33]; /* number dialed by the phone */
enum amps_trans_state state; /* state of transaction */
- struct timer timer; /* for varous timeouts */
+ struct osmo_timer_list timer; /* for varous timeouts */
int sat_detected; /* state if we detected SAT */
int dtx; /* if set, DTX is used with this call */
} transaction_t;
@@ -53,6 +53,6 @@ transaction_t *search_transaction_number(amps_t *amps, uint32_t min1, uint16_t m
transaction_t *search_transaction_callref(amps_t *amps, int callref);
void trans_new_state(transaction_t *trans, int state);
void amps_flush_other_transactions(amps_t *amps, transaction_t *trans);
-void transaction_timeout(struct timer *timer);
+void transaction_timeout(void *data);
const char *trans_short_state_name(int state);
diff --git a/src/amps/usa_congestion.c b/src/amps/usa_congestion.c
index ed1b87b..cc9e5fa 100644
--- a/src/amps/usa_congestion.c
+++ b/src/amps/usa_congestion.c
@@ -1,4 +1,5 @@
#include <stdint.h>
+#include "congestion.h"
static int16_t pattern[] = {
0xfffd, 0x0004, 0xfffb, 0x0004, 0xfffe, 0x0001, 0x0001, 0xfffe,
diff --git a/src/amps/usa_invalidnumber.c b/src/amps/usa_invalidnumber.c
index a272f7c..e470a90 100644
--- a/src/amps/usa_invalidnumber.c
+++ b/src/amps/usa_invalidnumber.c
@@ -1,4 +1,5 @@
#include <stdint.h>
+#include "invalidnumber.h"
static int16_t pattern[] = {
0xfffe, 0x0001, 0xffff, 0x0001, 0xffff, 0x0002, 0xfffe, 0x0002,
diff --git a/src/amps/usa_noanswer.c b/src/amps/usa_noanswer.c
index 5bddcb6..06ef7ba 100644
--- a/src/amps/usa_noanswer.c
+++ b/src/amps/usa_noanswer.c
@@ -1,4 +1,5 @@
#include <stdint.h>
+#include "noanswer.h"
static int16_t pattern[] = {
0xfe24, 0xfd20, 0xfd2c, 0xfdb5, 0xfeba, 0xfe20, 0xfd41, 0xfe32,
diff --git a/src/amps/usa_outoforder.c b/src/amps/usa_outoforder.c
index de5947c..ec15a29 100644
--- a/src/amps/usa_outoforder.c
+++ b/src/amps/usa_outoforder.c
@@ -1,4 +1,5 @@
#include <stdint.h>
+#include "outoforder.h"
static int16_t pattern[] = {
0xfeae, 0xfde4, 0xfe26, 0xfea7, 0xfe94, 0xfe8a, 0xfeb4, 0xfe3b,
diff --git a/src/amps/usa_tones.c b/src/amps/usa_tones.c
index b919775..3b60226 100644
--- a/src/amps/usa_tones.c
+++ b/src/amps/usa_tones.c
@@ -1,4 +1,5 @@
#include <stdint.h>
+#include "tones.h"
static int16_t pattern_ringback[] = {
0x0070, 0x00dd, 0x013b, 0x0192, 0x0191, 0x0153, 0x0099, 0xffb2,
diff --git a/src/anetz/Makefile.am b/src/anetz/Makefile.am
index 66de260..2f3972e 100644
--- a/src/anetz/Makefile.am
+++ b/src/anetz/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
bin_PROGRAMS = \
anetz
@@ -19,22 +19,21 @@ anetz_LDADD = \
$(COMMON_LA) \
libgermanton.a \
$(top_builddir)/src/liboptions/liboptions.a \
- $(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libmobile/libmobile.a \
- $(top_builddir)/src/libosmocc/libosmocc.a \
$(top_builddir)/src/libdisplay/libdisplay.a \
$(top_builddir)/src/libgoertzel/libgoertzel.a \
$(top_builddir)/src/libjitter/libjitter.a \
$(top_builddir)/src/libsquelch/libsquelch.a \
- $(top_builddir)/src/libtimer/libtimer.a \
$(top_builddir)/src/libsamplerate/libsamplerate.a \
$(top_builddir)/src/libemphasis/libemphasis.a \
$(top_builddir)/src/libfm/libfm.a \
$(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \
- $(top_builddir)/src/libg711/libg711.a \
$(top_builddir)/src/libaaimage/libaaimage.a \
+ $(top_builddir)/src/liblogging/liblogging.a \
+ $(LIBOSMOCORE_LIBS) \
+ $(LIBOSMOCC_LIBS) \
-lm
if HAVE_ALSA
diff --git a/src/anetz/anetz.c b/src/anetz/anetz.c
index 3af185b..af3a741 100644
--- a/src/anetz/anetz.c
+++ b/src/anetz/anetz.c
@@ -25,19 +25,19 @@
#include <string.h>
#include <errno.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
-#include "../libtimer/timer.h"
+#include "../liblogging/logging.h"
+#include <osmocom/core/timer.h>
#include "../libmobile/call.h"
#include "../libmobile/cause.h"
-#include "../libosmocc/message.h"
+#include <osmocom/cc/message.h>
#include "anetz.h"
#include "dsp.h"
/* Timers */
-#define PAGING_TO 30 /* Nach dieser Zeit ist der Operator genervt... */
-#define RELEASE_TO 3 /* Release time, so station keeps blocked for a while */
+#define PAGING_TO 30,0 /* Nach dieser Zeit ist der Operator genervt... */
+#define RELEASE_TO 3,0 /* Release time, so station keeps blocked for a while */
-const char *anetz_state_name(enum anetz_state state)
+static const char *anetz_state_name(enum anetz_state state)
{
static char invalid[16];
@@ -58,7 +58,7 @@ const char *anetz_state_name(enum anetz_state state)
return invalid;
}
-void anetz_display_status(void)
+static void anetz_display_status(void)
{
sender_t *sender;
anetz_t *anetz;
@@ -77,7 +77,7 @@ static void anetz_new_state(anetz_t *anetz, enum anetz_state new_state)
{
if (anetz->state == new_state)
return;
- PDEBUG_CHAN(DANETZ, DEBUG_DEBUG, "State change: %s -> %s\n", anetz_state_name(anetz->state), anetz_state_name(new_state));
+ LOGP_CHAN(DANETZ, LOGL_DEBUG, "State change: %s -> %s\n", anetz_state_name(anetz->state), anetz_state_name(new_state));
anetz->state = new_state;
anetz_display_status();
}
@@ -141,7 +141,7 @@ static double *anetz_nummer2freq(const char *nummer)
/* get decade */
dekade = anetz_gruppenkennziffer[*nummer - '0'].dekade;
- PDEBUG(DANETZ, DEBUG_DEBUG, "Dekaden: %d %d %d %d\n", dekade[0], dekade[1], dekade[2], dekade[3]);
+ LOGP(DANETZ, LOGL_DEBUG, "Dekaden: %d %d %d %d\n", dekade[0], dekade[1], dekade[2], dekade[3]);
nummer++;
/* get 4 frequencies out of decades */
@@ -161,7 +161,7 @@ static double *anetz_nummer2freq(const char *nummer)
}
}
- PDEBUG(DANETZ, DEBUG_DEBUG, "Frequencies: F%d=%.1f F%d=%.1f F%d=%.1f F%d=%.1f\n", f[0], freq[0], f[1], freq[1], f[2], freq[2], f[3], freq[3]);
+ LOGP(DANETZ, LOGL_DEBUG, "Frequencies: F%d=%.1f F%d=%.1f F%d=%.1f F%d=%.1f\n", f[0], freq[0], f[1], freq[1], f[2], freq[2], f[3], freq[3]);
return freq;
}
@@ -186,7 +186,7 @@ int anetz_init(void)
return 0;
}
-static void anetz_timeout(struct timer *timer);
+static void anetz_timeout(void *data);
static void anetz_go_idle(anetz_t *anetz);
/* Create transceiver instance and link to a list. */
@@ -196,40 +196,40 @@ int anetz_create(const char *kanal, const char *device, int use_sdr, int sampler
int rc;
if (atoi(kanal) < 30 || atoi(kanal) > 63) {
- PDEBUG(DANETZ, DEBUG_ERROR, "Channel ('Kanal') number %s invalid.\n", kanal);
+ LOGP(DANETZ, LOGL_ERROR, "Channel ('Kanal') number %s invalid.\n", kanal);
return -EINVAL;
}
anetz = calloc(1, sizeof(anetz_t));
if (!anetz) {
- PDEBUG(DANETZ, DEBUG_ERROR, "No memory!\n");
+ LOGP(DANETZ, LOGL_ERROR, "No memory!\n");
return -EIO;
}
anetz->operator = operator;
- PDEBUG(DANETZ, DEBUG_DEBUG, "Creating 'A-Netz' instance for 'Kanal' = %s (sample rate %d).\n", kanal, samplerate);
+ LOGP(DANETZ, LOGL_DEBUG, "Creating 'A-Netz' instance for 'Kanal' = %s (sample rate %d).\n", kanal, samplerate);
/* init general part of transceiver */
rc = sender_create(&anetz->sender, kanal, anetz_kanal2freq(atoi(kanal), 0), anetz_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_NONE);
if (rc < 0) {
- PDEBUG(DANETZ, DEBUG_ERROR, "Failed to init 'Sender' processing!\n");
+ LOGP(DANETZ, LOGL_ERROR, "Failed to init 'Sender' processing!\n");
goto error;
}
/* init audio processing */
rc = dsp_init_sender(anetz, page_gain, page_sequence, squelch_db);
if (rc < 0) {
- PDEBUG(DANETZ, DEBUG_ERROR, "Failed to init signal processing!\n");
+ LOGP(DANETZ, LOGL_ERROR, "Failed to init signal processing!\n");
goto error;
}
- timer_init(&anetz->timer, anetz_timeout, anetz);
+ osmo_timer_setup(&anetz->timer, anetz_timeout, anetz);
/* go into idle state */
anetz_go_idle(anetz);
- PDEBUG(DANETZ, DEBUG_NOTICE, "Created 'Kanal' #%s\n", kanal);
+ LOGP(DANETZ, LOGL_NOTICE, "Created 'Kanal' #%s\n", kanal);
return 0;
@@ -244,9 +244,9 @@ void anetz_destroy(sender_t *sender)
{
anetz_t *anetz = (anetz_t *) sender;
- PDEBUG(DANETZ, DEBUG_DEBUG, "Destroying 'A-Netz' instance for 'Kanal' = %s.\n", sender->kanal);
+ LOGP(DANETZ, LOGL_DEBUG, "Destroying 'A-Netz' instance for 'Kanal' = %s.\n", sender->kanal);
- timer_exit(&anetz->timer);
+ osmo_timer_del(&anetz->timer);
dsp_cleanup_sender(anetz);
sender_destroy(&anetz->sender);
free(sender);
@@ -255,9 +255,9 @@ void anetz_destroy(sender_t *sender)
/* Abort connection towards mobile station by sending idle tone. */
static void anetz_go_idle(anetz_t *anetz)
{
- timer_stop(&anetz->timer);
+ osmo_timer_del(&anetz->timer);
- PDEBUG(DANETZ, DEBUG_INFO, "Entering IDLE state on channel %s, sending 2280 Hz tone.\n", anetz->sender.kanal);
+ LOGP(DANETZ, LOGL_INFO, "Entering IDLE state on channel %s, sending 2280 Hz tone.\n", anetz->sender.kanal);
anetz->station_id[0] = '\0'; /* remove station ID before state change, so status is shown correctly */
anetz_new_state(anetz, ANETZ_FREI);
/* also reset detector, so if there is a new call it is answered */
@@ -267,31 +267,31 @@ static void anetz_go_idle(anetz_t *anetz)
/* Release connection towards mobile station by sending idle tone for a while. */
static void anetz_release(anetz_t *anetz)
{
- timer_stop(&anetz->timer);
+ osmo_timer_del(&anetz->timer);
- PDEBUG_CHAN(DANETZ, DEBUG_INFO, "Sending 2280 Hz release tone.\n");
+ LOGP_CHAN(DANETZ, LOGL_INFO, "Sending 2280 Hz release tone.\n");
anetz->station_id[0] = '\0'; /* remove station ID before state change, so status is shown correctly */
anetz_new_state(anetz, ANETZ_AUSLOESEN);
anetz_set_dsp_mode(anetz, DSP_MODE_TONE, 0);
- timer_start(&anetz->timer, RELEASE_TO);
+ osmo_timer_schedule(&anetz->timer, RELEASE_TO);
}
/* Enter paging state and transmit 4 paging tones. */
static void anetz_page(anetz_t *anetz, const char *dial_string, double *freq)
{
- PDEBUG_CHAN(DANETZ, DEBUG_INFO, "Entering paging state, sending 'Selektivruf' to '%s'.\n", dial_string);
+ LOGP_CHAN(DANETZ, LOGL_INFO, "Entering paging state, sending 'Selektivruf' to '%s'.\n", dial_string);
strcpy(anetz->station_id, dial_string); /* set station ID before state change, so status is shown correctly */
anetz_new_state(anetz, ANETZ_ANRUF);
anetz_set_dsp_mode(anetz, DSP_MODE_PAGING, 0);
dsp_set_paging(anetz, freq);
- timer_start(&anetz->timer, PAGING_TO);
+ osmo_timer_schedule(&anetz->timer, PAGING_TO);
}
/* Loss of signal was detected, release active call. */
void anetz_loss_indication(anetz_t *anetz, double loss_time)
{
if (anetz->state == ANETZ_GESPRAECH) {
- PDEBUG_CHAN(DANETZ, DEBUG_NOTICE, "Detected loss of signal after %.1f seconds, releasing.\n", loss_time);
+ LOGP_CHAN(DANETZ, LOGL_NOTICE, "Detected loss of signal after %.1f seconds, releasing.\n", loss_time);
anetz_release(anetz);
call_up_release(anetz->callref, CAUSE_TEMPFAIL);
anetz->callref = 0;
@@ -302,9 +302,9 @@ void anetz_loss_indication(anetz_t *anetz, double loss_time)
void anetz_receive_tone(anetz_t *anetz, int tone)
{
if (tone >= 0)
- PDEBUG_CHAN(DANETZ, DEBUG_DEBUG, "Received contiuous %d Hz tone.\n", (tone) ? 1750 : 2280);
+ LOGP_CHAN(DANETZ, LOGL_DEBUG, "Received contiuous %d Hz tone.\n", (tone) ? 1750 : 2280);
else
- PDEBUG_CHAN(DANETZ, DEBUG_DEBUG, "Continuous tone is gone.\n");
+ LOGP_CHAN(DANETZ, LOGL_DEBUG, "Continuous tone is gone.\n");
/* skip any handling in loopback mode */
if (anetz->sender.loopback)
@@ -318,7 +318,7 @@ void anetz_receive_tone(anetz_t *anetz, int tone)
case ANETZ_FREI:
/* initiate call on calling tone */
if (tone == 1) {
- PDEBUG_CHAN(DANETZ, DEBUG_INFO, "Received 1750 Hz calling signal from mobile station, removing idle signal.\n");
+ LOGP_CHAN(DANETZ, LOGL_INFO, "Received 1750 Hz calling signal from mobile station, removing idle signal.\n");
strcpy(anetz->station_id, "unknown"); /* set station ID before state change, so status is shown correctly */
anetz_new_state(anetz, ANETZ_GESPRAECH);
@@ -330,17 +330,17 @@ void anetz_receive_tone(anetz_t *anetz, int tone)
/* throughconnect speech when calling/answer tone is gone */
if (tone != 1) {
if (!anetz->callref) {
- PDEBUG_CHAN(DANETZ, DEBUG_INFO, "1750 Hz signal from mobile station is gone, setup call.\n");
+ LOGP_CHAN(DANETZ, LOGL_INFO, "1750 Hz signal from mobile station is gone, setup call.\n");
anetz->callref = call_up_setup(NULL, anetz->operator, OSMO_CC_NETWORK_ANETZ_NONE, "");
} else {
- PDEBUG_CHAN(DANETZ, DEBUG_INFO, "1750 Hz signal from mobile station is gone, answer call.\n");
+ LOGP_CHAN(DANETZ, LOGL_INFO, "1750 Hz signal from mobile station is gone, answer call.\n");
call_up_answer(anetz->callref, anetz->station_id);
}
anetz_set_dsp_mode(anetz, DSP_MODE_AUDIO, 0);
}
/* release call */
if (tone == 1) {
- PDEBUG_CHAN(DANETZ, DEBUG_INFO, "Received 1750 Hz release signal from mobile station, sending release tone.\n");
+ LOGP_CHAN(DANETZ, LOGL_INFO, "Received 1750 Hz release signal from mobile station, sending release tone.\n");
anetz_release(anetz);
call_up_release(anetz->callref, CAUSE_NORMAL);
anetz->callref = 0;
@@ -350,8 +350,8 @@ void anetz_receive_tone(anetz_t *anetz, int tone)
case ANETZ_ANRUF:
/* answer call on answer tone */
if (tone == 1) {
- PDEBUG_CHAN(DANETZ, DEBUG_INFO, "Received 1750 Hz answer signal from mobile station, removing paging tones.\n");
- timer_stop(&anetz->timer);
+ LOGP_CHAN(DANETZ, LOGL_INFO, "Received 1750 Hz answer signal from mobile station, removing paging tones.\n");
+ osmo_timer_del(&anetz->timer);
anetz_new_state(anetz, ANETZ_GESPRAECH);
anetz_set_dsp_mode(anetz, DSP_MODE_SILENCE, 0);
break;
@@ -362,13 +362,13 @@ void anetz_receive_tone(anetz_t *anetz, int tone)
}
/* Timeout handling */
-static void anetz_timeout(struct timer *timer)
+static void anetz_timeout(void *data)
{
- anetz_t *anetz = (anetz_t *)timer->priv;
+ anetz_t *anetz = data;
switch (anetz->state) {
case ANETZ_ANRUF:
- PDEBUG_CHAN(DANETZ, DEBUG_NOTICE, "Timeout while waiting for answer, releasing.\n");
+ LOGP_CHAN(DANETZ, LOGL_NOTICE, "Timeout while waiting for answer, releasing.\n");
anetz_go_idle(anetz);
call_up_release(anetz->callref, CAUSE_NOANSWER);
anetz->callref = 0;
@@ -391,8 +391,8 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
/* 1. determine paging frequencies */
freq = anetz_nummer2freq(dialing);
if (!freq) {
- PDEBUG(DANETZ, DEBUG_NOTICE, "Number invalid: %s\n", anetz_nummer2freq_error);
- PDEBUG(DANETZ, DEBUG_NOTICE, "Outgoing call to invalid number '%s', rejecting!\n", dialing);
+ LOGP(DANETZ, LOGL_NOTICE, "Number invalid: %s\n", anetz_nummer2freq_error);
+ LOGP(DANETZ, LOGL_NOTICE, "Outgoing call to invalid number '%s', rejecting!\n", dialing);
return -CAUSE_INVALNUMBER;
}
@@ -405,7 +405,7 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
break;
}
if (sender) {
- PDEBUG(DANETZ, DEBUG_NOTICE, "Outgoing call to busy number, rejecting!\n");
+ LOGP(DANETZ, LOGL_NOTICE, "Outgoing call to busy number, rejecting!\n");
return -CAUSE_BUSY;
}
@@ -416,13 +416,13 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
break;
}
if (!sender) {
- PDEBUG(DANETZ, DEBUG_NOTICE, "Outgoing call, but no free channel, rejecting!\n");
+ LOGP(DANETZ, LOGL_NOTICE, "Outgoing call, but no free channel, rejecting!\n");
return -CAUSE_NOCHANNEL;
}
- PDEBUG_CHAN(DANETZ, DEBUG_INFO, "Call to mobile station, paging with tones: %.1f %.1f %.1f %.1f\n", freq[0], freq[1], freq[2], freq[3]);
+ LOGP_CHAN(DANETZ, LOGL_INFO, "Call to mobile station, paging with tones: %.1f %.1f %.1f %.1f\n", freq[0], freq[1], freq[2], freq[3]);
if (anetz->page_sequence)
- PDEBUG(DANETZ, DEBUG_NOTICE, "Sending paging tones in sequence.\n");
+ LOGP(DANETZ, LOGL_NOTICE, "Sending paging tones in sequence.\n");
/* 4. trying to page mobile station */
anetz->callref = callref;
@@ -433,7 +433,7 @@ 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 __attribute__((unused)) callref, struct timeval __attribute__((unused)) *tv_meter)
{
}
@@ -446,7 +446,7 @@ void call_down_disconnect(int callref, int cause)
sender_t *sender;
anetz_t *anetz;
- PDEBUG(DANETZ, DEBUG_INFO, "Call has been disconnected by network.\n");
+ LOGP(DANETZ, LOGL_INFO, "Call has been disconnected by network.\n");
for (sender = sender_head; sender; sender = sender->next) {
anetz = (anetz_t *) sender;
@@ -454,7 +454,7 @@ void call_down_disconnect(int callref, int cause)
break;
}
if (!sender) {
- PDEBUG(DANETZ, DEBUG_NOTICE, "Outgoing disconnect, but no callref!\n");
+ LOGP(DANETZ, LOGL_NOTICE, "Outgoing disconnect, but no callref!\n");
call_up_release(callref, CAUSE_INVALCALLREF);
return;
}
@@ -464,7 +464,7 @@ void call_down_disconnect(int callref, int cause)
return;
switch (anetz->state) {
case ANETZ_ANRUF:
- PDEBUG_CHAN(DANETZ, DEBUG_NOTICE, "Outgoing disconnect, during alerting, going idle!\n");
+ LOGP_CHAN(DANETZ, LOGL_NOTICE, "Outgoing disconnect, during alerting, going idle!\n");
anetz_go_idle(anetz);
break;
default:
@@ -483,7 +483,7 @@ void call_down_release(int callref, __attribute__((unused)) int cause)
sender_t *sender;
anetz_t *anetz;
- PDEBUG(DANETZ, DEBUG_INFO, "Call has been released by network, releasing call.\n");
+ LOGP(DANETZ, LOGL_INFO, "Call has been released by network, releasing call.\n");
for (sender = sender_head; sender; sender = sender->next) {
anetz = (anetz_t *) sender;
@@ -491,7 +491,7 @@ void call_down_release(int callref, __attribute__((unused)) int cause)
break;
}
if (!sender) {
- PDEBUG(DANETZ, DEBUG_NOTICE, "Outgoing release, but no callref!\n");
+ LOGP(DANETZ, LOGL_NOTICE, "Outgoing release, but no callref!\n");
/* don't send release, because caller already released */
return;
}
@@ -500,11 +500,11 @@ void call_down_release(int callref, __attribute__((unused)) int cause)
switch (anetz->state) {
case ANETZ_GESPRAECH:
- PDEBUG_CHAN(DANETZ, DEBUG_NOTICE, "Outgoing release, during call, sending release tone!\n");
+ LOGP_CHAN(DANETZ, LOGL_NOTICE, "Outgoing release, during call, sending release tone!\n");
anetz_release(anetz);
break;
case ANETZ_ANRUF:
- PDEBUG_CHAN(DANETZ, DEBUG_NOTICE, "Outgoing release, during alerting, going idle!\n");
+ LOGP_CHAN(DANETZ, LOGL_NOTICE, "Outgoing release, during alerting, going idle!\n");
anetz_go_idle(anetz);
break;
default:
@@ -512,25 +512,5 @@ void call_down_release(int callref, __attribute__((unused)) int 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;
- anetz_t *anetz;
-
- for (sender = sender_head; sender; sender = sender->next) {
- anetz = (anetz_t *) sender;
- if (anetz->callref == callref)
- break;
- }
- if (!sender)
- return;
-
- if (anetz->dsp_mode == DSP_MODE_AUDIO)
- jitter_save(&anetz->sender.dejitter, samples, count, 1, sequence, timestamp, ssrc);
-}
-
-void call_down_clock(void) {}
-
void dump_info(void) {}
diff --git a/src/anetz/anetz.h b/src/anetz/anetz.h
index fc04d95..fcb7a61 100644
--- a/src/anetz/anetz.h
+++ b/src/anetz/anetz.h
@@ -24,7 +24,7 @@ typedef struct anetz {
enum anetz_state state; /* current sender's state */
int callref; /* call reference */
char station_id[8]; /* current station ID */
- struct timer timer;
+ struct osmo_timer_list timer;
/* display measurements */
dispmeasparam_t *dmp_tone_level;
diff --git a/src/anetz/besetztton.c b/src/anetz/besetztton.c
index 701e62a..4c5df68 100644
--- a/src/anetz/besetztton.c
+++ b/src/anetz/besetztton.c
@@ -1,4 +1,5 @@
#include <stdint.h>
+#include "besetztton.h"
static int16_t pattern[] = {
0x0004, 0xffe9, 0xffc9, 0xffac, 0xff92, 0xff83, 0xff75, 0xff56,
diff --git a/src/anetz/dsp.c b/src/anetz/dsp.c
index e9a4dbb..06c5ac7 100644
--- a/src/anetz/dsp.c
+++ b/src/anetz/dsp.c
@@ -26,8 +26,8 @@
#include <errno.h>
#include <math.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
-#include "../libtimer/timer.h"
+#include "../liblogging/logging.h"
+#include <osmocom/core/timer.h>
#include "../libmobile/call.h"
#include "anetz.h"
#include "dsp.h"
@@ -68,7 +68,7 @@ void dsp_init(void)
int i;
double s;
- PDEBUG(DDSP, DEBUG_DEBUG, "Generating sine tables.\n");
+ LOGP(DDSP, LOGL_DEBUG, "Generating sine tables.\n");
for (i = 0; i < 65536; i++) {
s = sin((double)i / 65536.0 * 2.0 * PI);
dsp_sine_tone[i] = s * TX_PEAK_TONE;
@@ -83,7 +83,7 @@ int dsp_init_sender(anetz_t *anetz, double page_gain, int page_sequence, double
int i;
double tone;
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Init DSP for 'Sender'.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Init DSP for 'Sender'.\n");
/* init squelch */
squelch_init(&anetz->squelch, anetz->sender.kanal, squelch_db, MUTE_TIME, LOSS_TIME);
@@ -95,10 +95,10 @@ int dsp_init_sender(anetz_t *anetz, double page_gain, int page_sequence, double
anetz->page_sequence = page_sequence;
anetz->samples_per_chunk = anetz->sender.samplerate * CHUNK_DURATION;
- PDEBUG(DDSP, DEBUG_DEBUG, "Using %d samples per filter chunk duration.\n", anetz->samples_per_chunk);
+ LOGP(DDSP, LOGL_DEBUG, "Using %d samples per filter chunk duration.\n", anetz->samples_per_chunk);
spl = calloc(anetz->samples_per_chunk, sizeof(sample_t));
if (!spl) {
- PDEBUG(DDSP, DEBUG_ERROR, "No memory!\n");
+ LOGP(DDSP, LOGL_ERROR, "No memory!\n");
return -ENOMEM;
}
anetz->fsk_filter_spl = spl;
@@ -119,7 +119,7 @@ int dsp_init_sender(anetz_t *anetz, double page_gain, int page_sequence, double
/* Cleanup transceiver instance. */
void dsp_cleanup_sender(anetz_t *anetz)
{
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Cleanup DSP for 'Sender'.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Cleanup DSP for 'Sender'.\n");
if (anetz->fsk_filter_spl) {
free(anetz->fsk_filter_spl);
@@ -133,7 +133,7 @@ static void fsk_receive_tone(anetz_t *anetz, int tone, int goodtone, double leve
/* lost tone because it is not good anymore or has changed */
if (!goodtone || tone != anetz->tone_detected) {
if (anetz->tone_count >= TONE_DETECT_TH) {
- PDEBUG_CHAN(DDSP, DEBUG_INFO, "Lost %.0f Hz tone after %.0f ms.\n", fsk_tones[anetz->tone_detected], 1000.0 * CHUNK_DURATION * anetz->tone_count);
+ LOGP_CHAN(DDSP, LOGL_INFO, "Lost %.0f Hz tone after %.0f ms.\n", fsk_tones[anetz->tone_detected], 1000.0 * CHUNK_DURATION * anetz->tone_count);
anetz_receive_tone(anetz, -1);
}
if (goodtone)
@@ -148,7 +148,7 @@ static void fsk_receive_tone(anetz_t *anetz, int tone, int goodtone, double leve
anetz->tone_count++;
if (anetz->tone_count == TONE_DETECT_TH) {
- PDEBUG_CHAN(DDSP, DEBUG_INFO, "Detecting continuous %.0f Hz tone. (level = %.0f%%, quality =%.0f%%)\n", fsk_tones[anetz->tone_detected], level * 100.0, quality * 100.0);
+ LOGP_CHAN(DDSP, LOGL_INFO, "Detecting continuous %.0f Hz tone. (level = %.0f%%, quality =%.0f%%)\n", fsk_tones[anetz->tone_detected], level * 100.0, quality * 100.0);
anetz_receive_tone(anetz, anetz->tone_detected);
}
}
@@ -171,7 +171,7 @@ static void fsk_decode_chunk(anetz_t *anetz, sample_t *spl, int max)
display_measurements_update(anetz->dmp_tone_level, level * 100.0, 0.0);
display_measurements_update(anetz->dmp_tone_quality, quality[1] * 100.0, 0.0);
if ((level > TONE_THRESHOLD && quality[1] > QUAL_THRESHOLD) || anetz->sender.loopback)
- PDEBUG_CHAN(DDSP, DEBUG_INFO, "Tone %.0f: Level=%3.0f%% Quality=%3.0f%%\n", fsk_tones[1], level * 100.0, quality[1] * 100.0);
+ LOGP_CHAN(DDSP, LOGL_INFO, "Tone %.0f: Level=%3.0f%% Quality=%3.0f%%\n", fsk_tones[1], level * 100.0, quality[1] * 100.0);
/* adjust level, so we get peak of sine curve */
/* indicate detected tone */
@@ -367,7 +367,11 @@ void sender_send(sender_t *sender, sample_t *samples, uint8_t *power, int length
break;
case DSP_MODE_AUDIO:
input_num = samplerate_upsample_input_num(&sender->srstate, length);
- jitter_load(&sender->dejitter, samples, input_num);
+ {
+ int16_t spl[input_num];
+ jitter_load_samples(&sender->dejitter, (uint8_t *)spl, input_num, sizeof(*spl), jitter_conceal_s16, NULL);
+ int16_to_samples_speech(samples, spl, input_num);
+ }
samplerate_upsample(&sender->srstate, samples, input_num, samples, length);
break;
case DSP_MODE_TONE:
@@ -382,7 +386,7 @@ void sender_send(sender_t *sender, sample_t *samples, uint8_t *power, int length
}
}
-const char *anetz_dsp_mode_name(enum dsp_mode mode)
+static const char *anetz_dsp_mode_name(enum dsp_mode mode)
{
static char invalid[16];
@@ -403,7 +407,10 @@ const char *anetz_dsp_mode_name(enum dsp_mode mode)
void anetz_set_dsp_mode(anetz_t *anetz, enum dsp_mode mode, int detect_reset)
{
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "DSP mode %s -> %s\n", anetz_dsp_mode_name(anetz->dsp_mode), anetz_dsp_mode_name(mode));
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "DSP mode %s -> %s\n", anetz_dsp_mode_name(anetz->dsp_mode), anetz_dsp_mode_name(mode));
+ if (mode == DSP_MODE_AUDIO && anetz->dsp_mode != mode)
+ jitter_reset(&anetz->sender.dejitter);
+
anetz->dsp_mode = mode;
/* reset sequence paging */
anetz->paging_tone = 0;
@@ -414,3 +421,27 @@ void anetz_set_dsp_mode(anetz_t *anetz, enum dsp_mode mode, int detect_reset)
anetz->tone_detected = -1;
}
+/* Receive audio from call instance. */
+void call_down_audio(void *decoder, void *decoder_priv, int callref, uint16_t sequence, uint8_t marker, uint32_t timestamp, uint32_t ssrc, uint8_t *payload, int payload_len)
+{
+ sender_t *sender;
+ anetz_t *anetz;
+
+ for (sender = sender_head; sender; sender = sender->next) {
+ anetz = (anetz_t *) sender;
+ if (anetz->callref == callref)
+ break;
+ }
+ if (!sender)
+ return;
+
+ if (anetz->dsp_mode == DSP_MODE_AUDIO) {
+ jitter_frame_t *jf;
+ jf = jitter_frame_alloc(decoder, decoder_priv, payload, payload_len, marker, sequence, timestamp, ssrc);
+ if (jf)
+ jitter_save(&anetz->sender.dejitter, jf);
+ }
+}
+
+void call_down_clock(void) {}
+
diff --git a/src/anetz/freiton.c b/src/anetz/freiton.c
index 7964c3f..ec2e94d 100644
--- a/src/anetz/freiton.c
+++ b/src/anetz/freiton.c
@@ -1,4 +1,5 @@
#include <stdint.h>
+#include "freiton.h"
static int16_t pattern[] = {
0x0056, 0x0068, 0x0065, 0x005d, 0x0040, 0x0031, 0x001a, 0x000d,
diff --git a/src/anetz/main.c b/src/anetz/main.c
index cd6f015..8286f71 100644
--- a/src/anetz/main.c
+++ b/src/anetz/main.c
@@ -25,8 +25,8 @@
#include <math.h>
#include "../libsample/sample.h"
#include "../libmobile/main_mobile.h"
-#include "../libdebug/debug.h"
-#include "../libtimer/timer.h"
+#include "../liblogging/logging.h"
+#include <osmocom/core/timer.h>
#include "../libmobile/call.h"
#include "../liboptions/options.h"
#include "../libfm/fm.h"
@@ -198,6 +198,7 @@ fail:
anetz_destroy(sender_head);
/* exits */
+ main_mobile_exit();
fm_exit();
options_free();
diff --git a/src/anetz/stations.c b/src/anetz/stations.c
index 9908755..a7878bb 100644
--- a/src/anetz/stations.c
+++ b/src/anetz/stations.c
@@ -2,6 +2,7 @@
#include <stdlib.h>
#include <string.h>
#include <math.h>
+#include "stations.h"
static struct anetz_stations {
const char *standort;
@@ -147,7 +148,7 @@ static struct anetz_stations {
{ NULL, 0, 0, 0, 0, 0, NULL }
};
-double lat_from_coordinates(const char *string)
+static double lat_from_coordinates(const char *string)
{
if (strlen(string) != 11)
abort();
@@ -168,7 +169,7 @@ double lat_from_coordinates(const char *string)
(double)(string[4] - '0') / 60.0;
}
-double lon_from_coordinates(const char *string)
+static double lon_from_coordinates(const char *string)
{
if (strlen(string) != 11)
abort();
@@ -200,7 +201,45 @@ void station_list(void)
printf("List of all base stations:\n");
for (i = 0; anetz_stations[i].standort; i++) {
- printf("%s (%.2f° N %.2f° E)\n", anetz_stations[i].standort, lat_from_coordinates(anetz_stations[i].coordinates), lon_from_coordinates(anetz_stations[i].coordinates));
+ printf("%s (%.2f deg N %.2f deg E)\n", anetz_stations[i].standort, lat_from_coordinates(anetz_stations[i].coordinates), lon_from_coordinates(anetz_stations[i].coordinates));
+ if (anetz_stations[i].kanal21) {
+ if (anetz_stations[i].kanal22)
+ printf("\tPrefix 21: Channel %d\n", anetz_stations[i].kanal21);
+ else if (anetz_stations[i].kanal23)
+ printf("\tPrefix 21-22: Channel %d\n", anetz_stations[i].kanal21);
+ else if (anetz_stations[i].kanal24)
+ printf("\tPrefix 21-23: Channel %d\n", anetz_stations[i].kanal21);
+ else if (anetz_stations[i].kanal25)
+ printf("\tPrefix 21-24: Channel %d\n", anetz_stations[i].kanal21);
+ else
+ printf("\tPrefix 21-25: Channel %d\n", anetz_stations[i].kanal21);
+ }
+ if (anetz_stations[i].kanal22) {
+ if (anetz_stations[i].kanal23)
+ printf("\tPrefix 22: Channel %d\n", anetz_stations[i].kanal22);
+ else if (anetz_stations[i].kanal24)
+ printf("\tPrefix 22-23: Channel %d\n", anetz_stations[i].kanal22);
+ else if (anetz_stations[i].kanal25)
+ printf("\tPrefix 22-24: Channel %d\n", anetz_stations[i].kanal22);
+ else
+ printf("\tPrefix 22-25: Channel %d\n", anetz_stations[i].kanal22);
+ }
+ if (anetz_stations[i].kanal23) {
+ if (anetz_stations[i].kanal24)
+ printf("\tPrefix 23: Channel %d\n", anetz_stations[i].kanal23);
+ else if (anetz_stations[i].kanal25)
+ printf("\tPrefix 23-24: Channel %d\n", anetz_stations[i].kanal23);
+ else
+ printf("\tPrefix 23-25: Channel %d\n", anetz_stations[i].kanal23);
+ }
+ if (anetz_stations[i].kanal24) {
+ if (anetz_stations[i].kanal25)
+ printf("\tPrefix 24: Channel %d\n", anetz_stations[i].kanal24);
+ else
+ printf("\tPrefix 24-25: Channel %d\n", anetz_stations[i].kanal24);
+ }
+ if (anetz_stations[i].kanal25)
+ printf("\tPrefix 25: Channel %d\n", anetz_stations[i].kanal25);
}
}
diff --git a/src/bnetz/Makefile.am b/src/bnetz/Makefile.am
index a799256..23e3083 100644
--- a/src/bnetz/Makefile.am
+++ b/src/bnetz/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
bin_PROGRAMS = \
bnetz \
@@ -16,13 +16,10 @@ bnetz_LDADD = \
$(COMMON_LA) \
../anetz/libgermanton.a \
$(top_builddir)/src/liboptions/liboptions.a \
- $(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libmobile/libmobile.a \
- $(top_builddir)/src/libosmocc/libosmocc.a \
$(top_builddir)/src/libdisplay/libdisplay.a \
$(top_builddir)/src/libjitter/libjitter.a \
$(top_builddir)/src/libsquelch/libsquelch.a \
- $(top_builddir)/src/libtimer/libtimer.a \
$(top_builddir)/src/libsamplerate/libsamplerate.a \
$(top_builddir)/src/libemphasis/libemphasis.a \
$(top_builddir)/src/libfsk/libfsk.a \
@@ -30,8 +27,10 @@ bnetz_LDADD = \
$(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \
- $(top_builddir)/src/libg711/libg711.a \
$(top_builddir)/src/libaaimage/libaaimage.a \
+ $(top_builddir)/src/liblogging/liblogging.a \
+ $(LIBOSMOCORE_LIBS) \
+ $(LIBOSMOCC_LIBS) \
-lm
bnetz_dialer_SOURCES = \
@@ -40,12 +39,14 @@ bnetz_dialer_SOURCES = \
bnetz_dialer_LDADD = \
$(COMMON_LA) \
$(top_builddir)/src/liboptions/liboptions.a \
- $(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libfsk/libfsk.a \
$(top_builddir)/src/libfm/libfm.a \
$(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \
+ $(top_builddir)/src/liblogging/liblogging.a \
+ $(LIBOSMOCORE_LIBS) \
+ $(LIBOSMOCC_LIBS) \
$(ALSA_LIBS)
-lm
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) {}
diff --git a/src/bnetz/bnetz.h b/src/bnetz/bnetz.h
index fa19cd0..b0220f3 100644
--- a/src/bnetz/bnetz.h
+++ b/src/bnetz/bnetz.h
@@ -1,7 +1,7 @@
#include "../libsquelch/squelch.h"
#include "../libfsk/fsk.h"
#include "../libmobile/sender.h"
-#include "../libtimer/timer.h"
+#include <osmocom/core/timer.h>
/* fsk modes of transmission */
enum dsp_mode {
@@ -56,6 +56,7 @@ typedef struct bnetz {
/* system info */
int gfs; /* 'Gruppenfreisignal' */
int metering; /* use metering pulses in seconds 0 = off, < 0 = force */
+ struct timeval metering_tv; /* time to repeat metering pulse (current call) */
/* switch sender to channel 19 */
char paging_file[256]; /* if set, write to given file to switch to channel 19 or back */
@@ -74,7 +75,7 @@ typedef struct bnetz {
int station_id_pos; /* position while transmitting */
enum page_mode page_mode; /* sub state while paging */
int page_try; /* try number (1 or 2) */
- struct timer timer;
+ struct osmo_timer_list timer;
int trenn_count; /* count number of release messages */
/* display measurements */
diff --git a/src/bnetz/dialer.c b/src/bnetz/dialer.c
index ab625b6..0e12e6b 100644
--- a/src/bnetz/dialer.c
+++ b/src/bnetz/dialer.c
@@ -26,7 +26,7 @@
#include "../libsample/sample.h"
#include "../libfsk/fsk.h"
#include "../libwave/wave.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#ifdef HAVE_ALSA
#include "../libsound/sound.h"
#endif
@@ -68,8 +68,11 @@ wave_rec_t wave_tx_rec;
/* dummy functions */
int num_kanal = 1; /* only one channel used for debugging */
+void *get_sender_by_empfangsfrequenz(void);
void *get_sender_by_empfangsfrequenz() { return NULL; }
+void display_measurements_add(void);
void display_measurements_add() {}
+void display_measurements_update(void);
void display_measurements_update() {}
#define OPT_METERING 1000
@@ -161,13 +164,13 @@ static int fsk_send_bit(void __attribute__((unused)) *inst)
if (!tx_telegramm || tx_telegramm_pos == 16) {
switch (funkwahl[digit_pos]) {
case '\0':
- PDEBUG(DBNETZ, DEBUG_INFO, "Done sending dialing sequence\n");
+ LOGP(DBNETZ, LOGL_INFO, "Done sending dialing sequence\n");
tx_mode = TX_MODE_SILENCE;
tx_silence_count = 0;
return -1;
case 'w':
if (!tx_telegramm)
- PDEBUG(DBNETZ, DEBUG_INFO, "Sending channel allocation tone ('Kanalbelegung')\n");
+ LOGP(DBNETZ, LOGL_INFO, "Sending channel allocation tone ('Kanalbelegung')\n");
tx_telegramm = "0000000000000000";
tx_telegramm_pos = 0;
digit_pos++;
@@ -175,23 +178,23 @@ static int fsk_send_bit(void __attribute__((unused)) *inst)
default:
switch (funkwahl[digit_pos]) {
case 's':
- PDEBUG(DBNETZ, DEBUG_INFO, "Sending start digit (no charging meater on board)\n");
+ LOGP(DBNETZ, LOGL_INFO, "Sending start digit (no charging meater on board)\n");
break;
case 'S':
- PDEBUG(DBNETZ, DEBUG_INFO, "Sending start digit (with charging meater on board)\n");
+ LOGP(DBNETZ, LOGL_INFO, "Sending start digit (with charging meater on board)\n");
break;
case 'M':
- PDEBUG(DBNETZ, DEBUG_INFO, "Sending start digit (Phone is a coin box.)\n");
+ LOGP(DBNETZ, LOGL_INFO, "Sending start digit (Phone is a coin box.)\n");
break;
case 'e':
- PDEBUG(DBNETZ, DEBUG_INFO, "Sending stop digit\n");
+ LOGP(DBNETZ, LOGL_INFO, "Sending stop digit\n");
break;
default:
- PDEBUG(DBNETZ, DEBUG_INFO, "Sending digit '%c'\n", funkwahl[digit_pos]);
+ LOGP(DBNETZ, LOGL_INFO, "Sending digit '%c'\n", funkwahl[digit_pos]);
}
impulstelegramm = bnetz_digit2telegramm(funkwahl[digit_pos]);
if (!impulstelegramm) {
- PDEBUG(DBNETZ, DEBUG_ERROR, "Illegal digit '%c', please fix!\n", funkwahl[digit_pos]);
+ LOGP(DBNETZ, LOGL_ERROR, "Illegal digit '%c', please fix!\n", funkwahl[digit_pos]);
abort();
}
tx_telegramm = impulstelegramm->sequence;
@@ -252,7 +255,7 @@ static void process_signal(int buffer_size)
count = dsp_samplerate / 1000;
#endif
if (count < 0) {
- PDEBUG(DDSP, DEBUG_ERROR, "Failed to get number of samples in buffer (rc = %d)!\n", count);
+ LOGP(DDSP, LOGL_ERROR, "Failed to get number of samples in buffer (rc = %d)!\n", count);
break;
}
@@ -267,7 +270,7 @@ static void process_signal(int buffer_size)
/* write audio */
rc = sound_write(audio, samples, power, count, NULL, NULL, 1);
if (rc < 0) {
- PDEBUG(DDSP, DEBUG_ERROR, "Failed to write TX data to audio device (rc = %d)\n", rc);
+ LOGP(DDSP, LOGL_ERROR, "Failed to write TX data to audio device (rc = %d)\n", rc);
break;
}
#endif
@@ -340,15 +343,15 @@ int main(int argc, char *argv[])
/* init fsk */
if (fsk_mod_init(&fsk_mod, NULL, fsk_send_bit, dsp_samplerate, BIT_RATE, F0, F1, 1.0, 0, 0) < 0) {
- PDEBUG(DDSP, DEBUG_ERROR, "FSK init failed!\n");
+ LOGP(DDSP, LOGL_ERROR, "FSK init failed!\n");
goto exit;
}
#ifdef HAVE_ALSA
/* init sound */
- audio = sound_open(dsp_audiodev, NULL, NULL, NULL, 1, 0.0, dsp_samplerate, buffer_size, 1.0, 1.0, 4000.0, 2.0);
+ audio = sound_open(SOUND_DIR_PLAY, dsp_audiodev, NULL, NULL, NULL, 1, 0.0, dsp_samplerate, buffer_size, 1.0, 1.0, 4000.0, 2.0);
if (!audio) {
- PDEBUG(DBNETZ, DEBUG_ERROR, "No sound device!\n");
+ LOGP(DBNETZ, LOGL_ERROR, "No sound device!\n");
goto exit;
}
#endif
@@ -357,13 +360,13 @@ int main(int argc, char *argv[])
if (write_tx_wave) {
rc = wave_create_record(&wave_tx_rec, write_tx_wave, dsp_samplerate, 1, 1.0);
if (rc < 0) {
- PDEBUG(DBNETZ, DEBUG_ERROR, "Failed to create WAVE recoding instance!\n");
+ LOGP(DBNETZ, LOGL_ERROR, "Failed to create WAVE recoding instance!\n");
goto exit;
}
}
#ifndef HAVE_ALSA
else {
- PDEBUG(DBNETZ, DEBUG_ERROR, "No sound support compiled in, so you need to write to a wave file. See help!\n");
+ LOGP(DBNETZ, LOGL_ERROR, "No sound support compiled in, so you need to write to a wave file. See help!\n");
goto exit;
}
#endif
@@ -373,7 +376,7 @@ int main(int argc, char *argv[])
sound_start(audio);
#endif
- PDEBUG(DBNETZ, DEBUG_ERROR, "Start audio after pause...\n");
+ LOGP(DBNETZ, LOGL_ERROR, "Start audio after pause...\n");
process_signal(buffer_size);
diff --git a/src/bnetz/dsp.c b/src/bnetz/dsp.c
index 5305183..9e0e3fe 100644
--- a/src/bnetz/dsp.c
+++ b/src/bnetz/dsp.c
@@ -26,7 +26,7 @@
#include <errno.h>
#include <math.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../libmobile/call.h"
#include "bnetz.h"
#include "dsp.h"
@@ -70,7 +70,7 @@ void dsp_init(void)
{
int i;
- PDEBUG(DDSP, DEBUG_DEBUG, "Generating sine table for metering tone.\n");
+ LOGP(DDSP, LOGL_DEBUG, "Generating sine table for metering tone.\n");
for (i = 0; i < 65536; i++)
dsp_metering[i] = sin((double)i / 65536.0 * 2.0 * PI) * TX_PEAK_METER;
}
@@ -81,10 +81,10 @@ static void fsk_receive_bit(void *inst, int bit, double quality, double level);
/* Init transceiver instance. */
int dsp_init_sender(bnetz_t *bnetz, double squelch_db)
{
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Init DSP for 'Sender'.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Init DSP for 'Sender'.\n");
if (TONE_DETECT_CNT > sizeof(bnetz->rx_tone_quality) / sizeof(bnetz->rx_tone_quality[0])) {
- PDEBUG_CHAN(DDSP, DEBUG_ERROR, "buffer for tone quality is too small, please fix!\n");
+ LOGP_CHAN(DDSP, LOGL_ERROR, "buffer for tone quality is too small, please fix!\n");
return -EINVAL;
}
@@ -94,15 +94,15 @@ int dsp_init_sender(bnetz_t *bnetz, double squelch_db)
/* set modulation parameters */
sender_set_fm(&bnetz->sender, MAX_DEVIATION, MAX_MODULATION, SPEECH_DEVIATION, MAX_DISPLAY);
- PDEBUG(DDSP, DEBUG_DEBUG, "Using FSK level of %.3f (%.3f KHz deviation @ 2000 Hz)\n", TX_PEAK_FSK, 4.0);
+ LOGP(DDSP, LOGL_DEBUG, "Using FSK level of %.3f (%.3f KHz deviation @ 2000 Hz)\n", TX_PEAK_FSK, 4.0);
/* init fsk */
if (fsk_mod_init(&bnetz->fsk_mod, bnetz, fsk_send_bit, bnetz->sender.samplerate, BIT_RATE, F0, F1, TX_PEAK_FSK, 0, 0) < 0) {
- PDEBUG_CHAN(DDSP, DEBUG_ERROR, "FSK init failed!\n");
+ LOGP_CHAN(DDSP, LOGL_ERROR, "FSK init failed!\n");
return -EINVAL;
}
if (fsk_demod_init(&bnetz->fsk_demod, bnetz, fsk_receive_bit, bnetz->sender.samplerate, BIT_RATE, F0, F1, BIT_ADJUST) < 0) {
- PDEBUG_CHAN(DDSP, DEBUG_ERROR, "FSK init failed!\n");
+ LOGP_CHAN(DDSP, LOGL_ERROR, "FSK init failed!\n");
return -EINVAL;
}
@@ -124,7 +124,7 @@ int dsp_init_sender(bnetz_t *bnetz, double squelch_db)
/* Cleanup transceiver instance. */
void dsp_cleanup_sender(bnetz_t *bnetz)
{
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Cleanup DSP for 'Sender'.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Cleanup DSP for 'Sender'.\n");
fsk_mod_cleanup(&bnetz->fsk_mod);
fsk_demod_cleanup(&bnetz->fsk_demod);
@@ -148,7 +148,7 @@ static void fsk_receive_tone(bnetz_t *bnetz, int tone, int goodtone, double leve
/* set duration to TONE_DETECT_CNT, because it took that long to detect the tone */
bnetz->tone_duration = TONE_DETECT_CNT;
bnetz->tone_detected = tone;
- PDEBUG_CHAN(DDSP, DEBUG_INFO, "Detecting continuous tone: F%d Level=%3.0f%% (threshold %3.0f%%) standard deviation=%.0f%% (threshold=%.0f%%) Quality=%3.0f%%\n", bnetz->tone_detected, level_avg * 100.0, TONE_LEVEL_TH * 100.0, level_stddev / level_avg * 100.0, TONE_STDDEV_TH * 100.0, quality_avg * 100.0);
+ LOGP_CHAN(DDSP, LOGL_INFO, "Detecting continuous tone: F%d Level=%3.0f%% (threshold %3.0f%%) standard deviation=%.0f%% (threshold=%.0f%%) Quality=%3.0f%%\n", bnetz->tone_detected, level_avg * 100.0, TONE_LEVEL_TH * 100.0, level_stddev / level_avg * 100.0, TONE_STDDEV_TH * 100.0, quality_avg * 100.0);
bnetz_receive_tone(bnetz, bnetz->tone_detected);
}
}
@@ -158,7 +158,7 @@ static void fsk_receive_tone(bnetz_t *bnetz, int tone, int goodtone, double leve
bnetz->tone_count++;
if (bnetz->tone_count == TONE_LOST_CNT) {
/* subtract TONE_LOST_CNT from duration, because it took that long to detect loss of tone */
- PDEBUG_CHAN(DDSP, DEBUG_INFO, "Lost F%d tone after %.2f seconds.\n", bnetz->tone_detected, (double)(bnetz->tone_duration - TONE_LOST_CNT) / 100.0);
+ LOGP_CHAN(DDSP, LOGL_INFO, "Lost F%d tone after %.2f seconds.\n", bnetz->tone_detected, (double)(bnetz->tone_duration - TONE_LOST_CNT) / 100.0);
bnetz->tone_detected = -1;
bnetz_receive_tone(bnetz, -1);
}
@@ -250,7 +250,7 @@ static void fsk_receive_bit(void *inst, int bit, double quality, double level)
j++;
}
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "FSK Valid bits: %d/%d Level: %.0f%% (threshold %.0f%%) Stddev: %.0f%% (threshold %.0f%%)\n", j, 16, level_avg * 100.0, TONE_LEVEL_TH * 100.0, level_stddev / level_avg * 100.0, TONE_STDDEV_TH * 100.0);
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "FSK Valid bits: %d/%d Level: %.0f%% (threshold %.0f%%) Stddev: %.0f%% (threshold %.0f%%)\n", j, 16, level_avg * 100.0, TONE_LEVEL_TH * 100.0, level_stddev / level_avg * 100.0, TONE_STDDEV_TH * 100.0);
/* drop any telegramm that is too bad */
if (level_stddev / level_avg > TONE_STDDEV_TH || j < 16)
@@ -261,7 +261,7 @@ static void fsk_receive_bit(void *inst, int bit, double quality, double level)
display_measurements_update(bnetz->dmp_frame_stddev, level_stddev / level_avg * 100.0, 0.0);
display_measurements_update(bnetz->dmp_frame_quality, quality_avg * 100.0, 0.0);
- PDEBUG_CHAN(DDSP, DEBUG_INFO, "Telegramm RX Level: average=%.0f%% (threshold %.0f%%) standard deviation=%.0f%% (threshold %.0f%%) Quality: %.0f%%\n", level_avg * 100.0, TONE_LEVEL_TH * 100.0, level_stddev / level_avg * 100.0, TONE_STDDEV_TH * 100.0, quality_avg * 100.0);
+ LOGP_CHAN(DDSP, LOGL_INFO, "Telegramm RX Level: average=%.0f%% (threshold %.0f%%) standard deviation=%.0f%% (threshold %.0f%%) Quality: %.0f%%\n", level_avg * 100.0, TONE_LEVEL_TH * 100.0, level_stddev / level_avg * 100.0, TONE_STDDEV_TH * 100.0, quality_avg * 100.0);
/* receive telegramm */
bnetz_receive_telegramm(bnetz, bnetz->rx_telegramm);
@@ -320,7 +320,7 @@ static int fsk_send_bit(void *inst)
/* request frame */
bnetz->tx_telegramm = bnetz_get_telegramm(bnetz);
if (!bnetz->tx_telegramm) {
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Stop sending 'Telegramm'.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Stop sending 'Telegramm'.\n");
return -1;
}
bnetz->tx_telegramm_pos = 0;
@@ -373,7 +373,11 @@ again:
case DSP_MODE_AUDIO:
case DSP_MODE_AUDIO_METER:
input_num = samplerate_upsample_input_num(&sender->srstate, length);
- jitter_load(&sender->dejitter, samples, input_num);
+ {
+ int16_t spl[input_num];
+ jitter_load_samples(&sender->dejitter, (uint8_t *)spl, input_num, sizeof(*spl), jitter_conceal_s16, NULL);
+ int16_to_samples_speech(samples, spl, input_num);
+ }
samplerate_upsample(&sender->srstate, samples, input_num, samples, length);
if (bnetz->dsp_mode == DSP_MODE_AUDIO_METER)
metering_tone(bnetz, samples, length);
@@ -392,7 +396,7 @@ again:
}
}
-const char *bnetz_dsp_mode_name(enum dsp_mode mode)
+static const char *bnetz_dsp_mode_name(enum dsp_mode mode)
{
static char invalid[16];
@@ -422,8 +426,35 @@ void bnetz_set_dsp_mode(bnetz_t *bnetz, enum dsp_mode mode)
bnetz->tx_telegramm = 0;
fsk_mod_reset(&bnetz->fsk_mod);
}
+ if ((mode == DSP_MODE_AUDIO || mode == DSP_MODE_AUDIO_METER) && (bnetz->dsp_mode != DSP_MODE_AUDIO && bnetz->dsp_mode != DSP_MODE_AUDIO_METER))
+ jitter_reset(&bnetz->sender.dejitter);
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "DSP mode %s -> %s\n", bnetz_dsp_mode_name(bnetz->dsp_mode), bnetz_dsp_mode_name(mode));
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "DSP mode %s -> %s\n", bnetz_dsp_mode_name(bnetz->dsp_mode), bnetz_dsp_mode_name(mode));
bnetz->dsp_mode = mode;
}
+/* Receive audio from call instance. */
+void call_down_audio(void *decoder, void *decoder_priv, int callref, uint16_t sequence, uint8_t marker, uint32_t timestamp, uint32_t ssrc, uint8_t *payload, int payload_len)
+{
+ 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_frame_t *jf;
+ jf = jitter_frame_alloc(decoder, decoder_priv, payload, payload_len, marker, sequence, timestamp, ssrc);
+ if (jf)
+ jitter_save(&bnetz->sender.dejitter, jf);
+ }
+}
+
+void call_down_clock(void) {}
+
diff --git a/src/bnetz/main.c b/src/bnetz/main.c
index a82e412..e78fdf3 100644
--- a/src/bnetz/main.c
+++ b/src/bnetz/main.c
@@ -24,7 +24,7 @@
#include <errno.h>
#include <math.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../libmobile/call.h"
#include "../libmobile/main_mobile.h"
#include "../anetz/freiton.h"
@@ -58,6 +58,8 @@ void print_help(const char *arg0)
printf(" Pulses will be sent on outgoing calls only and only if mobile station\n");
printf(" requests it. Use negative value to force metering pulses for all calls.\n");
printf(" (default = %d)\n", metering);
+ printf(" If metering pulses are sent via Osmo-CC interface, pulses are always\n");
+ printf(" sent, if mobile station requests it. This overrides this option.\n");
printf(" -P --paging tone | notone | positive | negative | <file>=<on>:<off>\n");
printf(" Send a tone, give a signal or write to a file when switching to\n");
printf(" channel 19. (paging the phone).\n");
@@ -218,6 +220,7 @@ fail:
bnetz_destroy(sender_head);
/* exits */
+ main_mobile_exit();
fm_exit();
options_free();
diff --git a/src/bnetz/stations.c b/src/bnetz/stations.c
index 96265e8..0d87c1e 100644
--- a/src/bnetz/stations.c
+++ b/src/bnetz/stations.c
@@ -2,6 +2,7 @@
#include <stdlib.h>
#include <string.h>
#include <math.h>
+#include "stations.h"
static struct bnetz_stations {
const char *standort;
@@ -221,7 +222,7 @@ static struct bnetz_stations {
{ NULL, 0, NULL }
};
-double lat_from_coordinates(const char *string)
+static double lat_from_coordinates(const char *string)
{
if (strlen(string) != 11)
abort();
@@ -242,7 +243,7 @@ double lat_from_coordinates(const char *string)
(double)(string[4] - '0') / 60.0;
}
-double lon_from_coordinates(const char *string)
+static double lon_from_coordinates(const char *string)
{
if (strlen(string) != 11)
abort();
diff --git a/src/cnetz/Makefile.am b/src/cnetz/Makefile.am
index 3c521bd..fcf96da 100644
--- a/src/cnetz/Makefile.am
+++ b/src/cnetz/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
bin_PROGRAMS = \
cnetz
@@ -24,13 +24,10 @@ cnetz_LDADD = \
../anetz/libgermanton.a \
libcnetztones.a \
$(top_builddir)/src/liboptions/liboptions.a \
- $(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libmobile/libmobile.a \
- $(top_builddir)/src/libosmocc/libosmocc.a \
$(top_builddir)/src/libdisplay/libdisplay.a \
$(top_builddir)/src/libcompandor/libcompandor.a \
$(top_builddir)/src/libjitter/libjitter.a \
- $(top_builddir)/src/libtimer/libtimer.a \
$(top_builddir)/src/libsamplerate/libsamplerate.a \
$(top_builddir)/src/libscrambler/libscrambler.a \
$(top_builddir)/src/libemphasis/libemphasis.a \
@@ -38,8 +35,10 @@ cnetz_LDADD = \
$(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \
- $(top_builddir)/src/libg711/libg711.a \
$(top_builddir)/src/libaaimage/libaaimage.a \
+ $(top_builddir)/src/liblogging/liblogging.a \
+ $(LIBOSMOCORE_LIBS) \
+ $(LIBOSMOCC_LIBS) \
-lm
if HAVE_ALSA
diff --git a/src/cnetz/cnetz.c b/src/cnetz/cnetz.c
index 734a3e7..b3771d7 100644
--- a/src/cnetz/cnetz.c
+++ b/src/cnetz/cnetz.c
@@ -143,10 +143,12 @@
#include <math.h>
#include <inttypes.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 "../libmobile/console.h"
+#include <osmocom/cc/message.h>
#include "cnetz.h"
#include "database.h"
#include "sysinfo.h"
@@ -157,6 +159,8 @@
/* uncomment this to do echo debugging (-l) on Speech Channel */
//#define DEBUG_SPK
+#define FLOAT_TO_TIMEOUT(f) floor(f), ((f) - floor(f)) * 1000000
+
#define CUT_OFF_EMPHASIS_CNETZ 796.0 /* 200 uS time constant */
/* OgK list of alternative channels, NOT including 131 */
@@ -226,7 +230,7 @@ static uint8_t cnetz_power2bits(int power)
}
}
-const char *cnetz_state_name(enum cnetz_state state)
+static const char *cnetz_state_name(enum cnetz_state state)
{
static char invalid[16];
@@ -263,13 +267,13 @@ static void cnetz_new_state(cnetz_t *cnetz, enum cnetz_state new_state)
{
if (cnetz->state == new_state)
return;
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "State change: %s -> %s\n", cnetz_state_name(cnetz->state), cnetz_state_name(new_state));
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "State change: %s -> %s\n", cnetz_state_name(cnetz->state), cnetz_state_name(new_state));
cnetz->state = new_state;
cnetz_display_status();
}
/* Convert ISDN cause to 'Ausloesegrund' of C-Netz mobile station */
-uint8_t cnetz_cause_isdn2cnetz(int cause)
+static uint8_t cnetz_cause_isdn2cnetz(int cause)
{
switch (cause) {
case CAUSE_NORMAL:
@@ -301,51 +305,51 @@ int cnetz_create(const char *kanal_name, enum cnetz_chan_type chan_type, const c
kanal = atoi(kanal_name);
if ((kanal & 1) && (kanal < 3 || kanal > 1147)) {
- PDEBUG(DCNETZ, DEBUG_ERROR, "Channel ('Kanal') number %d invalid. For odd channel numbers, use channel 3 ... 1147.\n", kanal);
+ LOGP(DCNETZ, LOGL_ERROR, "Channel ('Kanal') number %d invalid. For odd channel numbers, use channel 3 ... 1147.\n", kanal);
return -EINVAL;
}
if ((kanal & 1) && kanal > 947) {
- PDEBUG(DCNETZ, DEBUG_NOTICE, "You defined an extended frequency channel %d, only newer phones support this!\n", kanal);
+ LOGP(DCNETZ, LOGL_NOTICE, "You defined an extended frequency channel %d, only newer phones support this!\n", kanal);
}
if (!(kanal & 1) && (kanal < 4 || kanal > 918)) {
- PDEBUG(DCNETZ, DEBUG_ERROR, "Channel ('Kanal') number %d invalid. For even channel numbers, use channel 4 ... 918.\n", kanal);
+ LOGP(DCNETZ, LOGL_ERROR, "Channel ('Kanal') number %d invalid. For even channel numbers, use channel 4 ... 918.\n", kanal);
return -EINVAL;
}
if (!(kanal & 1) && kanal > 758) {
- PDEBUG(DCNETZ, DEBUG_NOTICE, "You defined an extended frequency channel %d, only newer phones support this!\n", kanal);
+ LOGP(DCNETZ, LOGL_NOTICE, "You defined an extended frequency channel %d, only newer phones support this!\n", kanal);
}
/* SpK must be on channel other than 131 */
if (chan_type == CHAN_TYPE_SPK && kanal == CNETZ_STD_OGK_KANAL) {
- PDEBUG(DCNETZ, DEBUG_NOTICE, "You must not use channel %d for traffic channel!\n", CNETZ_STD_OGK_KANAL);
+ LOGP(DCNETZ, LOGL_NOTICE, "You must not use channel %d for traffic channel!\n", CNETZ_STD_OGK_KANAL);
return -EINVAL;
}
/* warn if we combine SpK and OgK, this is not supported by standard */
if (chan_type == CHAN_TYPE_OGK_SPK) {
- PDEBUG(DCNETZ, DEBUG_NOTICE, "You selected channel %d ('Orga-Kanal') for combined control + traffic channel. Some phones will reject this.\n", kanal);
+ LOGP(DCNETZ, LOGL_NOTICE, "You selected channel %d ('Orga-Kanal') for combined control + traffic channel. Some phones will reject this.\n", kanal);
}
for (sender = sender_head; sender; sender = sender->next) {
cnetz = (cnetz_t *)sender;
if (!!strcmp(sender->device, device)) {
- PDEBUG(DCNETZ, DEBUG_NOTICE, "To be able to sync multiple channels, all channels must be on the same sound device!\n");
+ LOGP(DCNETZ, LOGL_NOTICE, "To be able to sync multiple channels, all channels must be on the same sound device!\n");
return -EINVAL;
}
}
cnetz = calloc(1, sizeof(cnetz_t));
if (!cnetz) {
- PDEBUG(DCNETZ, DEBUG_ERROR, "No memory!\n");
+ LOGP(DCNETZ, LOGL_ERROR, "No memory!\n");
return -ENOMEM;
}
- PDEBUG(DCNETZ, DEBUG_DEBUG, "Creating 'C-Netz' instance for 'Kanal' = %d (sample rate %d).\n", kanal, samplerate);
+ LOGP(DCNETZ, LOGL_DEBUG, "Creating 'C-Netz' instance for 'Kanal' = %d (sample rate %d).\n", kanal, samplerate);
cnetz->kanal = kanal;
if ((chan_type == CHAN_TYPE_OGK || chan_type == CHAN_TYPE_OGK_SPK) && kanal != CNETZ_STD_OGK_KANAL) {
if (ogk_list_count == 16) {
- PDEBUG(DCNETZ, DEBUG_ERROR, "No more than 16 non-standard OGK are allowed!\n");
+ LOGP(DCNETZ, LOGL_ERROR, "No more than 16 non-standard OGK are allowed!\n");
rc = -EINVAL;
goto error;
}
@@ -356,7 +360,7 @@ int cnetz_create(const char *kanal_name, enum cnetz_chan_type chan_type, const c
/* do not enable emphasis, since it is done by cnetz code, not by common sender code */
rc = sender_create(&cnetz->sender, kanal_name, cnetz_kanal2freq(kanal, 0), cnetz_kanal2freq(kanal, 1), device, use_sdr, samplerate, rx_gain, tx_gain, 0, 0, write_rx_wave, write_tx_wave, read_rx_wave, read_tx_wave, loopback, PAGING_SIGNAL_NONE);
if (rc < 0) {
- PDEBUG(DCNETZ, DEBUG_ERROR, "Failed to init transceiver process!\n");
+ LOGP(DCNETZ, LOGL_ERROR, "Failed to init transceiver process!\n");
goto error;
}
@@ -371,7 +375,7 @@ int cnetz_create(const char *kanal_name, enum cnetz_chan_type chan_type, const c
/* init audio processing */
rc = dsp_init_sender(cnetz, measure_speed, clock_speed, demod, speech_deviation);
if (rc < 0) {
- PDEBUG(DCNETZ, DEBUG_ERROR, "Failed to init signal processing!\n");
+ LOGP(DCNETZ, LOGL_ERROR, "Failed to init signal processing!\n");
goto error;
}
@@ -444,10 +448,10 @@ int cnetz_create(const char *kanal_name, enum cnetz_chan_type chan_type, const c
cnetz_flush_other_transactions(cnetz, trans2);
#endif
- PDEBUG(DCNETZ, DEBUG_NOTICE, "Created 'Kanal' #%d of type '%s' = %s\n", kanal, chan_type_short_name(chan_type), chan_type_long_name(chan_type));
+ LOGP(DCNETZ, LOGL_NOTICE, "Created 'Kanal' #%d of type '%s' = %s\n", kanal, chan_type_short_name(chan_type), chan_type_long_name(chan_type));
const char *name, *long_name;
name = get_station_name(si.fuz_nat, si.fuz_fuvst, si.fuz_rest, &long_name);
- PDEBUG(DCNETZ, DEBUG_NOTICE, " -> Using cell ID: Nat=%d FuVst=%d Rest=%d Name='%s' Long Name='%s'\n", si.fuz_nat, si.fuz_fuvst, si.fuz_rest, name, long_name);
+ LOGP(DCNETZ, LOGL_NOTICE, " -> Using cell ID: Nat=%d FuVst=%d Rest=%d Name='%s' Long Name='%s'\n", si.fuz_nat, si.fuz_fuvst, si.fuz_rest, name, long_name);
return 0;
@@ -463,11 +467,11 @@ void cnetz_destroy(sender_t *sender)
cnetz_t *cnetz = (cnetz_t *) sender;
transaction_t *trans;
- PDEBUG(DCNETZ, DEBUG_DEBUG, "Destroying 'C-Netz' instance for 'Kanal' = %s.\n", sender->kanal);
+ LOGP(DCNETZ, LOGL_DEBUG, "Destroying 'C-Netz' instance for 'Kanal' = %s.\n", sender->kanal);
while ((trans = search_transaction(cnetz, ~0))) {
const char *rufnummer = transaction2rufnummer(trans);
- PDEBUG(DCNETZ, DEBUG_NOTICE, "Removing pending transaction for subscriber '%s'\n", rufnummer);
+ LOGP(DCNETZ, LOGL_NOTICE, "Removing pending transaction for subscriber '%s'\n", rufnummer);
destroy_transaction(trans);
}
@@ -534,13 +538,13 @@ void cnetz_go_idle(cnetz_t *cnetz)
return;
if (cnetz->trans_list) {
- PDEBUG(DCNETZ, DEBUG_ERROR, "Releasing but still having transaction, please fix!\n");
+ LOGP(DCNETZ, LOGL_ERROR, "Releasing but still having transaction, please fix!\n");
if (cnetz->trans_list->callref)
call_up_release(cnetz->trans_list->callref, CAUSE_NORMAL);
destroy_transaction(cnetz->trans_list);
}
- PDEBUG(DCNETZ, DEBUG_INFO, "Entering IDLE state on channel %s.\n", cnetz->sender.kanal);
+ LOGP(DCNETZ, LOGL_INFO, "Entering IDLE state on channel %s.\n", cnetz->sender.kanal);
cnetz_new_state(cnetz, CNETZ_IDLE);
cnetz->sched_lr_debugged = 0;
cnetz->sched_mlr_debugged = 0;
@@ -558,10 +562,10 @@ void cnetz_go_idle(cnetz_t *cnetz)
/* check for first phone in queue and trigger completion of call (becoming idle means that SpK is now available) */
trans = search_transaction_queue();
if (trans) {
- PDEBUG(DCNETZ, DEBUG_NOTICE, "Now channel is available for queued subscriber '%s'.\n", transaction2rufnummer(trans));
+ LOGP(DCNETZ, LOGL_NOTICE, "Now channel is available for queued subscriber '%s'.\n", transaction2rufnummer(trans));
trans_new_state(trans, (trans->state == TRANS_MT_QUEUE) ? TRANS_MT_DELAY : TRANS_MO_DELAY);
- timer_stop(&trans->timer);
- timer_start(&trans->timer, 3.0); /* Wait at least one frame cycles until timeout */
+ osmo_timer_del(&trans->timer);
+ osmo_timer_schedule(&trans->timer, 3,0); /* Wait at least one frame cycles (2.4s) until timeout */
}
}
@@ -572,31 +576,9 @@ static void cnetz_release(transaction_t *trans, uint8_t cause)
trans->repeat = 0;
trans->release_cause = cause;
trans->cnetz->sched_dsp_mode_ts = -1;
- timer_stop(&trans->timer);
-}
-
-/* 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;
- cnetz_t *cnetz;
-
- for (sender = sender_head; sender; sender = sender->next) {
- cnetz = (cnetz_t *) sender;
- if (cnetz->trans_list && cnetz->trans_list->callref == callref)
- break;
- }
- if (!sender)
- return;
-
- if (cnetz->dsp_mode == DSP_MODE_SPK_V) {
- /* store as is, since we convert rate when processing FSK frames */
- jitter_save(&cnetz->sender.dejitter, samples, count, 1, sequence, timestamp, ssrc);
- }
+ osmo_timer_del(&trans->timer);
}
-void call_down_clock(void) {}
-
int call_down_setup(int callref, const char __attribute__((unused)) *caller_id, enum number_type __attribute__((unused)) caller_type, const char *dialing)
{
cnetz_t *ogk, *spk;
@@ -621,21 +603,21 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
/* 2. check if the subscriber is attached */
rc = find_db(futln_nat, futln_fuvst, futln_rest, &ogk_kanal, NULL, &extended);
if (rc < 0) {
- PDEBUG(DCNETZ, DEBUG_NOTICE, "Outgoing call to not attached subscriber, rejecting!\n");
+ LOGP(DCNETZ, LOGL_NOTICE, "Outgoing call to not attached subscriber, rejecting!\n");
return -CAUSE_OUTOFORDER;
}
/* 3. check if given number is already in a call, return BUSY */
trans = search_transaction_number_global(futln_nat, futln_fuvst, futln_rest);
if (trans) {
- PDEBUG(DCNETZ, DEBUG_NOTICE, "Outgoing call to busy number, rejecting!\n");
+ LOGP(DCNETZ, LOGL_NOTICE, "Outgoing call to busy number, rejecting!\n");
return -CAUSE_BUSY;
}
/* 4. check if we have no OgK, return NOCHANNEL */
ogk = search_ogk(ogk_kanal);
if (!ogk) {
- PDEBUG(DCNETZ, DEBUG_NOTICE, "Outgoing call, but OgK is currently busy, rejecting!\n");
+ LOGP(DCNETZ, LOGL_NOTICE, "Outgoing call, but OgK is currently busy, rejecting!\n");
return -CAUSE_NOCHANNEL;
}
@@ -643,18 +625,18 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
spk = search_free_spk(extended);
if (!spk) {
if (!ogk->warteschlange) {
- PDEBUG(DCNETZ, DEBUG_NOTICE, "Outgoing call, but no free channel, rejecting!\n");
+ LOGP(DCNETZ, LOGL_NOTICE, "Outgoing call, but no free channel, rejecting!\n");
return -CAUSE_NOCHANNEL;
} else
- PDEBUG(DCNETZ, DEBUG_NOTICE, "Outgoing call, but no free channel, queuing call!\n");
+ LOGP(DCNETZ, LOGL_NOTICE, "Outgoing call, but no free channel, queuing call!\n");
}
- PDEBUG(DCNETZ, DEBUG_INFO, "Call to mobile station, paging station id '%s'\n", dialing);
+ LOGP(DCNETZ, LOGL_INFO, "Call to mobile station, paging station id '%s'\n", dialing);
/* 6. trying to page mobile station */
trans = create_transaction(ogk, (spk) ? TRANS_VAK : TRANS_WSK, futln_nat, futln_fuvst, futln_rest, -1, -1, NAN);
if (!trans) {
- PDEBUG(DCNETZ, DEBUG_ERROR, "Failed to create transaction\n");
+ LOGP(DCNETZ, LOGL_ERROR, "Failed to create transaction\n");
return -CAUSE_TEMPFAIL;
}
trans->callref = callref;
@@ -663,8 +645,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;
+ cnetz_t *cnetz;
+ transaction_t *trans;
+
+ LOGP(DCNETZ, LOGL_INFO, "Call has been answered by network.\n");
+
+ for (sender = sender_head; sender; sender = sender->next) {
+ cnetz = (cnetz_t *) sender;
+ trans = search_transaction_callref(cnetz, callref);
+ if (trans)
+ break;
+ }
+ if (!sender) {
+ LOGP(DCNETZ, LOGL_NOTICE, "Incoming answer, but no callref!\n");
+ return;
+ }
+
+ /* At least tone second! */
+ if (tv_meter->tv_sec) {
+ LOGP(DCNETZ, LOGL_INFO, "Network starts metering pulses every %lu.%03lu seconds.\n", tv_meter->tv_sec, tv_meter->tv_usec / 1000);
+ trans->meter_start = get_time();
+ trans->metering_time = (double)tv_meter->tv_sec + (double)tv_meter->tv_usec / 1000000.0;
+ } else if (cnetz->metering) {
+ LOGP(DCNETZ, LOGL_INFO, "Command line options starts metering pulses every %d seconds.\n", cnetz->metering);
+ trans->meter_start = get_time();
+ trans->metering_time = (double)cnetz->metering;
+ }
}
/* Call control sends disconnect (with tones).
@@ -677,7 +686,7 @@ void call_down_disconnect(int callref, int cause)
cnetz_t *cnetz;
transaction_t *trans;
- PDEBUG(DCNETZ, DEBUG_INFO, "Call has been disconnected by network.\n");
+ LOGP(DCNETZ, LOGL_INFO, "Call has been disconnected by network.\n");
for (sender = sender_head; sender; sender = sender->next) {
cnetz = (cnetz_t *) sender;
@@ -687,7 +696,7 @@ void call_down_disconnect(int callref, int cause)
break;
}
if (!sender) {
- PDEBUG(DCNETZ, DEBUG_NOTICE, "Outgoing disconnect, but no callref!\n");
+ LOGP(DCNETZ, LOGL_NOTICE, "Outgoing disconnect, but no callref!\n");
call_up_release(callref, CAUSE_INVALCALLREF);
return;
}
@@ -696,15 +705,17 @@ void call_down_disconnect(int callref, int cause)
switch (cnetz->dsp_mode) {
case DSP_MODE_SPK_V:
+ /* stop metering */
+ trans->meter_end = get_time();
return;
case DSP_MODE_SPK_K:
- PDEBUG(DCNETZ, DEBUG_INFO, "Call control disconnects on speech channel, releasing towards mobile station.\n");
+ LOGP(DCNETZ, LOGL_INFO, "Call control disconnects on speech channel, releasing towards mobile station.\n");
cnetz_release(trans, cnetz_cause_isdn2cnetz(cause));
call_up_release(callref, cause);
trans->callref = 0;
break;
default:
- PDEBUG(DCNETZ, DEBUG_INFO, "Call control disconnects on organisation channel, removing transaction.\n");
+ LOGP(DCNETZ, LOGL_INFO, "Call control disconnects on organisation channel, removing transaction.\n");
call_up_release(callref, cause);
trans->callref = 0;
if (trans->state == TRANS_MT_QUEUE || trans->state == TRANS_MT_DELAY) {
@@ -724,7 +735,7 @@ void call_down_release(int callref, int cause)
cnetz_t *cnetz;
transaction_t *trans;
- PDEBUG(DCNETZ, DEBUG_INFO, "Call has been released by network, releasing call.\n");
+ LOGP(DCNETZ, LOGL_INFO, "Call has been released by network, releasing call.\n");
for (sender = sender_head; sender; sender = sender->next) {
cnetz = (cnetz_t *) sender;
@@ -734,7 +745,7 @@ void call_down_release(int callref, int cause)
break;
}
if (!sender) {
- PDEBUG(DCNETZ, DEBUG_NOTICE, "Outgoing release, but no callref!\n");
+ LOGP(DCNETZ, LOGL_NOTICE, "Outgoing release, but no callref!\n");
/* don't send release, because caller already released */
return;
}
@@ -744,11 +755,11 @@ void call_down_release(int callref, int cause)
switch (cnetz->dsp_mode) {
case DSP_MODE_SPK_K:
case DSP_MODE_SPK_V:
- PDEBUG(DCNETZ, DEBUG_INFO, "Call control releases on speech channel, releasing towards mobile station.\n");
+ LOGP(DCNETZ, LOGL_INFO, "Call control releases on speech channel, releasing towards mobile station.\n");
cnetz_release(trans, cnetz_cause_isdn2cnetz(cause));
break;
default:
- PDEBUG(DCNETZ, DEBUG_INFO, "Call control releases on organisation channel, removing transaction.\n");
+ LOGP(DCNETZ, LOGL_INFO, "Call control releases on organisation channel, removing transaction.\n");
if (trans->state == TRANS_MT_QUEUE) {
cnetz_release(trans, cnetz_cause_isdn2cnetz(cause));
} else {
@@ -765,12 +776,12 @@ int cnetz_meldeaufruf(uint8_t futln_nat, uint8_t futln_fuvst, uint16_t futln_res
cnetz = search_ogk(ogk_kanal);
if (!cnetz) {
- PDEBUG(DCNETZ, DEBUG_NOTICE, "'Meldeaufruf', but OgK is currently busy!\n");
+ LOGP(DCNETZ, LOGL_NOTICE, "'Meldeaufruf', but OgK is currently busy!\n");
return -CAUSE_NOCHANNEL;
}
trans = create_transaction(cnetz, TRANS_MA, futln_nat, futln_fuvst, futln_rest, -1, -1, NAN);
if (!trans) {
- PDEBUG(DCNETZ, DEBUG_ERROR, "Failed to create transaction\n");
+ LOGP(DCNETZ, LOGL_ERROR, "Failed to create transaction\n");
return -CAUSE_TEMPFAIL;
}
@@ -835,20 +846,20 @@ const char *chan_type_long_name(enum cnetz_chan_type chan_type)
}
/* Timeout handling */
-void transaction_timeout(struct timer *timer)
+void transaction_timeout(void *data)
{
- transaction_t *trans = (transaction_t *)timer->priv;
+ transaction_t *trans = data;
cnetz_t *cnetz = trans->cnetz;
switch (trans->state) {
case TRANS_MT_QUEUE:
- PDEBUG_CHAN(DCNETZ, DEBUG_NOTICE, "Phone in queue, but still no channel available, releasing call!\n");
+ LOGP_CHAN(DCNETZ, LOGL_NOTICE, "Phone in queue, but still no channel available, releasing call!\n");
call_up_release(trans->callref, CAUSE_NOCHANNEL);
trans->callref = 0;
cnetz_release(trans, CNETZ_CAUSE_GASSENBESETZT);
break;
case TRANS_MO_QUEUE:
- PDEBUG_CHAN(DCNETZ, DEBUG_NOTICE, "Phone in queue, but still no channel available, releasing!\n");
+ LOGP_CHAN(DCNETZ, LOGL_NOTICE, "Phone in queue, but still no channel available, releasing!\n");
cnetz_release(trans, CNETZ_CAUSE_GASSENBESETZT);
break;
case TRANS_MT_DELAY:
@@ -858,12 +869,12 @@ void transaction_timeout(struct timer *timer)
trans_new_state(trans, TRANS_VAG);
break;
case TRANS_BQ:
- PDEBUG_CHAN(DCNETZ, DEBUG_NOTICE, "No response after channel allocation 'Belegung Quittung'\n");
+ LOGP_CHAN(DCNETZ, LOGL_NOTICE, "No response after channel allocation 'Belegung Quittung'\n");
trans_new_state(trans, TRANS_AF);
trans->repeat = 0;
break;
case TRANS_ZFZ:
- PDEBUG_CHAN(DCNETZ, DEBUG_NOTICE, "No response after sending random number 'Zufallszahl'\n");
+ LOGP_CHAN(DCNETZ, LOGL_NOTICE, "No response after sending random number 'Zufallszahl'\n");
if (trans->callref) {
call_up_release(trans->callref, CAUSE_TEMPFAIL);
trans->callref = 0;
@@ -871,7 +882,7 @@ void transaction_timeout(struct timer *timer)
cnetz_release(trans, CNETZ_CAUSE_FUNKTECHNISCH);
break;
case TRANS_AP:
- PDEBUG_CHAN(DCNETZ, DEBUG_NOTICE, "No response after waiting for challenge response 'Autorisierungsparameter'\n");
+ LOGP_CHAN(DCNETZ, LOGL_NOTICE, "No response after waiting for challenge response 'Autorisierungsparameter'\n");
if (trans->callref) {
call_up_release(trans->callref, CAUSE_TEMPFAIL);
trans->callref = 0;
@@ -881,9 +892,9 @@ void transaction_timeout(struct timer *timer)
case TRANS_VHQ_K:
case TRANS_VHQ_V:
if (cnetz->dsp_mode != DSP_MODE_SPK_V)
- PDEBUG_CHAN(DCNETZ, DEBUG_NOTICE, "No response while holding call 'Quittung Verbindung halten'\n");
+ LOGP_CHAN(DCNETZ, LOGL_NOTICE, "No response while holding call 'Quittung Verbindung halten'\n");
else
- PDEBUG_CHAN(DCNETZ, DEBUG_NOTICE, "Lost signal from 'FuTln' (mobile station)\n");
+ LOGP_CHAN(DCNETZ, LOGL_NOTICE, "Lost signal from 'FuTln' (mobile station)\n");
if (trans->callref) {
call_up_release(trans->callref, CAUSE_TEMPFAIL);
trans->callref = 0;
@@ -891,25 +902,25 @@ void transaction_timeout(struct timer *timer)
cnetz_release(trans, CNETZ_CAUSE_FUNKTECHNISCH);
break;
case TRANS_DS:
- PDEBUG_CHAN(DCNETZ, DEBUG_NOTICE, "No response after connect 'Durchschalten'\n");
+ LOGP_CHAN(DCNETZ, LOGL_NOTICE, "No response after connect 'Durchschalten'\n");
call_up_release(trans->callref, CAUSE_TEMPFAIL);
trans->callref = 0;
cnetz_release(trans, CNETZ_CAUSE_FUNKTECHNISCH);
break;
case TRANS_RTA:
- PDEBUG_CHAN(DCNETZ, DEBUG_NOTICE, "No response after ringing order 'Rufton anschalten'\n");
+ LOGP_CHAN(DCNETZ, LOGL_NOTICE, "No response after ringing order 'Rufton anschalten'\n");
call_up_release(trans->callref, CAUSE_TEMPFAIL);
trans->callref = 0;
cnetz_release(trans, CNETZ_CAUSE_FUNKTECHNISCH);
break;
case TRANS_AHQ:
- PDEBUG_CHAN(DCNETZ, DEBUG_NOTICE, "No response after answer 'Abhebequittung'\n");
+ LOGP_CHAN(DCNETZ, LOGL_NOTICE, "No response after answer 'Abhebequittung'\n");
call_up_release(trans->callref, CAUSE_TEMPFAIL);
trans->callref = 0;
cnetz_release(trans, CNETZ_CAUSE_FUNKTECHNISCH);
break;
default:
- PDEBUG_CHAN(DCNETZ, DEBUG_ERROR, "Timeout unhandled in state %" PRIu64 "\n", trans->state);
+ LOGP_CHAN(DCNETZ, LOGL_ERROR, "Timeout unhandled in state %" PRIu64 "\n", trans->state);
}
}
@@ -941,13 +952,13 @@ void cnetz_sync_frame(cnetz_t *cnetz, double sync, int block)
}
/* if more than +- one bit out of sync */
if (offset < -0.5 || offset > 0.5) {
- PDEBUG_CHAN(DCNETZ, DEBUG_NOTICE, "Frame sync offset = %.2f, correcting!\n", offset);
+ LOGP_CHAN(DCNETZ, LOGL_NOTICE, "Frame sync offset = %.2f, correcting!\n", offset);
fsk_correct_sync(&cnetz->fsk_demod, offset);
return;
}
/* resync by some fraction of received sync error */
- PDEBUG_CHAN(DCNETZ, DEBUG_DEBUG, "Frame sync offset = %.2f, correcting.\n", offset);
+ LOGP_CHAN(DCNETZ, LOGL_DEBUG, "Frame sync offset = %.2f, correcting.\n", offset);
fsk_correct_sync(&cnetz->fsk_demod, offset / 2.0);
}
@@ -994,18 +1005,18 @@ const telegramm_t *cnetz_transmit_telegramm_rufblock(cnetz_t *cnetz)
telegramm.ausloesegrund = trans->release_cause;
switch (trans->state) {
case TRANS_EM:
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Sending acknowledgment 'Einbuchquittung' to Attachment request.\n");
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Sending acknowledgment 'Einbuchquittung' to Attachment request.\n");
telegramm.opcode = OPCODE_EBQ_R;
destroy_transaction(trans);
break;
case TRANS_UM:
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Sending acknowledgment 'Umbuchquittung' to Roaming requuest.\n");
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Sending acknowledgment 'Umbuchquittung' to Roaming requuest.\n");
telegramm.opcode = OPCODE_UBQ_R;
destroy_transaction(trans);
break;
case TRANS_WBN:
wbn:
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Sending call reject 'Wahlbestaetigung negativ'.\n");
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Sending call reject 'Wahlbestaetigung negativ'.\n");
telegramm.opcode = OPCODE_WBN_R;
destroy_transaction(trans);
cnetz_go_idle(cnetz);
@@ -1014,17 +1025,17 @@ wbn:
spk = search_free_spk(trans->extended);
/* Accept call if channel available, otherwise reject or queue call */
if (spk) {
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Sending call accept 'Wahlbestaetigung positiv'.\n");
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Sending call accept 'Wahlbestaetigung positiv'.\n");
telegramm.opcode = OPCODE_WBP_R;
trans_new_state(trans, TRANS_VAG);
} else if (cnetz->warteschlange) {
/* queue call if no channel is available, but queue allowed */
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "No free channel, sending call accept in queue 'Wahlbestaetigung positiv in Warteschlage'.\n");
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "No free channel, sending call accept in queue 'Wahlbestaetigung positiv in Warteschlage'.\n");
telegramm.opcode = OPCODE_WWBP_R;
trans_new_state(trans, TRANS_MO_QUEUE);
- timer_start(&trans->timer, T_VAG2); /* Maximum time to hold queue */
+ osmo_timer_schedule(&trans->timer, T_VAG2); /* Maximum time to hold queue */
} else {
- PDEBUG(DCNETZ, DEBUG_NOTICE, "No free channel anymore, rejecting call!\n");
+ LOGP(DCNETZ, LOGL_NOTICE, "No free channel anymore, rejecting call!\n");
trans_new_state(trans, TRANS_WBN);
goto wbn;
}
@@ -1033,27 +1044,27 @@ wbn:
case TRANS_VAK:
vak:
if (trans->state == TRANS_VAG) {
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Sending channel assignment 'Verbindungsaufbau gehend'.\n");
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Sending channel assignment 'Verbindungsaufbau gehend'.\n");
telegramm.opcode = OPCODE_VAG_R;
} else {
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Sending channel assignment 'Verbindungsaufbau kommend'.\n");
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Sending channel assignment 'Verbindungsaufbau kommend'.\n");
telegramm.opcode = OPCODE_VAK_R;
}
trans_new_state(trans, TRANS_BQ);
trans->repeat = 0;
- timer_start(&trans->timer, 0.150 + 0.0375 * F_BQ); /* two slots + F_BQ frames */
+ osmo_timer_schedule(&trans->timer, FLOAT_TO_TIMEOUT(0.150 + 0.0375 * F_BQ)); /* two slots + F_BQ frames */
/* select channel */
spk = search_free_spk(trans->extended);
if (!spk) {
- PDEBUG(DCNETZ, DEBUG_NOTICE, "No free channel anymore, rejecting call!\n");
+ LOGP(DCNETZ, LOGL_NOTICE, "No free channel anymore, rejecting call!\n");
destroy_transaction(trans);
cnetz_go_idle(cnetz);
break;
}
if (spk == cnetz) {
- PDEBUG(DCNETZ, DEBUG_INFO, "Staying on combined control + traffic channel %s\n", spk->sender.kanal);
+ LOGP(DCNETZ, LOGL_INFO, "Staying on combined control + traffic channel %s\n", spk->sender.kanal);
} else {
- PDEBUG(DCNETZ, DEBUG_INFO, "Assigning phone to traffic channel %s\n", spk->sender.kanal);
+ LOGP(DCNETZ, LOGL_INFO, "Assigning phone to traffic channel %s\n", spk->sender.kanal);
/* sync RX time to current OgK time */
fsk_copy_sync(&spk->fsk_demod, &cnetz->fsk_demod);
}
@@ -1071,12 +1082,12 @@ vak:
break;
case TRANS_ATQ:
case TRANS_ATQ_IDLE:
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Sending acknowledgment 'Quittung fuer Ausloesen des FuTelG im OgK-Betrieb' to release request.\n");
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Sending acknowledgment 'Quittung fuer Ausloesen des FuTelG im OgK-Betrieb' to release request.\n");
telegramm.opcode = OPCODE_ATQ_R;
destroy_transaction(trans);
break;
case TRANS_VA:
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Sending 'Vorzeitiges Ausloesen' to queued mobile station\n");
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Sending 'Vorzeitiges Ausloesen' to queued mobile station\n");
telegramm.opcode = OPCODE_VA_R;
destroy_transaction(trans);
break;
@@ -1087,10 +1098,10 @@ vak:
trans_new_state(trans, TRANS_VAK);
goto vak;
}
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "No free channel, sending incoming call in queue 'Warteschglange kommend'.\n");
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "No free channel, sending incoming call in queue 'Warteschglange kommend'.\n");
telegramm.opcode = OPCODE_WSK_R;
trans_new_state(trans, TRANS_MT_QUEUE);
- timer_start(&trans->timer, T_VAK); /* Maximum time to hold queue */
+ osmo_timer_schedule(&trans->timer, T_VAK); /* Maximum time to hold queue */
call_up_alerting(trans->callref);
default:
; /* LR */
@@ -1127,7 +1138,7 @@ next_candidate:
switch (trans->state) {
case TRANS_WAF:
/* no response to dial request (try again or drop connection) */
- PDEBUG_CHAN(DCNETZ, DEBUG_NOTICE, "No response after dialing request 'Wahlaufforderung'\n");
+ LOGP_CHAN(DCNETZ, LOGL_NOTICE, "No response after dialing request 'Wahlaufforderung'\n");
if (trans->try == N) {
trans_new_state(trans, TRANS_WBN);
goto next_candidate;
@@ -1136,7 +1147,7 @@ next_candidate:
trans_new_state(trans, TRANS_VWG);
/* FALLTHRU */
case TRANS_VWG:
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Sending acknowledgment 'Wahlaufforderung' to outging call\n");
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Sending acknowledgment 'Wahlaufforderung' to outging call\n");
telegramm.opcode = OPCODE_WAF_M;
telegramm.futln_nationalitaet = trans->futln_nat;
telegramm.futln_heimat_fuvst_nr = trans->futln_fuvst;
@@ -1144,7 +1155,7 @@ next_candidate:
trans_new_state(trans, TRANS_WAF);
break;
case TRANS_MA:
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Sending keepalive request 'Meldeaufruf'\n");
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Sending keepalive request 'Meldeaufruf'\n");
telegramm.opcode = OPCODE_MA_M;
telegramm.futln_nationalitaet = trans->futln_nat;
telegramm.futln_heimat_fuvst_nr = trans->futln_fuvst;
@@ -1153,7 +1164,7 @@ next_candidate:
break;
case TRANS_MFT:
/* no response to availability check */
- PDEBUG_CHAN(DCNETZ, DEBUG_NOTICE, "No response after keepalive order 'Meldeaufruf'\n");
+ LOGP_CHAN(DCNETZ, LOGL_NOTICE, "No response after keepalive order 'Meldeaufruf'\n");
trans->page_failed = 1;
destroy_transaction(trans);
goto next_candidate;
@@ -1178,18 +1189,19 @@ void cnetz_receive_telegramm_ogk(cnetz_t *cnetz, telegramm_t *telegramm, int blo
break;
rufnummer = telegramm2rufnummer(telegramm);
if (si.authentifikationsbit && telegramm->chipkarten_futelg_bit)
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Received Attachment 'Einbuchen' message from Subscriber '%s' with chip card's ID %d (vendor id %d, hardware version %d, software version %d)\n", rufnummer, telegramm->kartenkennung, telegramm->herstellerkennung, telegramm->hardware_des_futelg, telegramm->software_des_futelg);
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Received Attachment 'Einbuchen' message from Subscriber '%s' with chip card's ID %d (vendor id %d, hardware version %d, software version %d)\n", rufnummer, telegramm->kartenkennung, telegramm->herstellerkennung, telegramm->hardware_des_futelg, telegramm->software_des_futelg);
else
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Received Attachment 'Einbuchen' message from Subscriber '%s' with %s card's security code %d\n", rufnummer, (telegramm->chipkarten_futelg_bit) ? "chip":"magnet", telegramm->sicherungs_code);
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Received Attachment 'Einbuchen' message from Subscriber '%s' with %s card's security code %d\n", rufnummer, (telegramm->chipkarten_futelg_bit) ? "chip":"magnet", telegramm->sicherungs_code);
if (telegramm->erweitertes_frequenzbandbit)
- PDEBUG(DCNETZ, DEBUG_INFO, " -> Phone supports extended frequency band\n");
+ LOGP(DCNETZ, LOGL_INFO, " -> Phone supports extended frequency band\n");
if (cnetz->state != CNETZ_IDLE) {
- PDEBUG(DCNETZ, DEBUG_NOTICE, "Ignoring Attachment from subscriber '%s', because we are busy becoming SpK.\n", rufnummer);
+ LOGP(DCNETZ, LOGL_NOTICE, "Ignoring Attachment from subscriber '%s', because we are busy becoming SpK.\n", rufnummer);
break;
}
+ console_inscription(rufnummer);
trans = create_transaction(cnetz, TRANS_EM, telegramm->futln_nationalitaet, telegramm->futln_heimat_fuvst_nr, telegramm->futln_rest_nr, telegramm->chipkarten_futelg_bit, telegramm->erweitertes_frequenzbandbit, cnetz->rf_level_db);
if (!trans) {
- PDEBUG(DCNETZ, DEBUG_ERROR, "Failed to create transaction\n");
+ LOGP(DCNETZ, LOGL_ERROR, "Failed to create transaction\n");
break;
}
cnetz = trans->cnetz; /* cnetz may change, due to stronger reception on different OgK */
@@ -1200,18 +1212,19 @@ void cnetz_receive_telegramm_ogk(cnetz_t *cnetz, telegramm_t *telegramm, int blo
break;
rufnummer = telegramm2rufnummer(telegramm);
if (si.authentifikationsbit && telegramm->chipkarten_futelg_bit)
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Received Roaming 'Umbuchen' message from Subscriber '%s' with chip card's ID %d (vendor id %d, hardware version %d, software version %d)\n", rufnummer, telegramm->kartenkennung, telegramm->herstellerkennung, telegramm->hardware_des_futelg, telegramm->software_des_futelg);
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Received Roaming 'Umbuchen' message from Subscriber '%s' with chip card's ID %d (vendor id %d, hardware version %d, software version %d)\n", rufnummer, telegramm->kartenkennung, telegramm->herstellerkennung, telegramm->hardware_des_futelg, telegramm->software_des_futelg);
else
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Received Roaming 'Umbuchen' message from Subscriber '%s' with %s card's security code %d\n", rufnummer, (telegramm->chipkarten_futelg_bit) ? "chip":"magnet", telegramm->sicherungs_code);
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Received Roaming 'Umbuchen' message from Subscriber '%s' with %s card's security code %d\n", rufnummer, (telegramm->chipkarten_futelg_bit) ? "chip":"magnet", telegramm->sicherungs_code);
if (telegramm->erweitertes_frequenzbandbit)
- PDEBUG(DCNETZ, DEBUG_INFO, " -> Phone supports extended frequency band\n");
+ LOGP(DCNETZ, LOGL_INFO, " -> Phone supports extended frequency band\n");
if (cnetz->state != CNETZ_IDLE) {
- PDEBUG(DCNETZ, DEBUG_NOTICE, "Ignoring Roaming from subscriber '%s', because we are busy becoming SpK.\n", rufnummer);
+ LOGP(DCNETZ, LOGL_NOTICE, "Ignoring Roaming from subscriber '%s', because we are busy becoming SpK.\n", rufnummer);
break;
}
+ console_inscription(rufnummer);
trans = create_transaction(cnetz, TRANS_UM, telegramm->futln_nationalitaet, telegramm->futln_heimat_fuvst_nr, telegramm->futln_rest_nr, telegramm->chipkarten_futelg_bit, telegramm->erweitertes_frequenzbandbit, cnetz->rf_level_db);
if (!trans) {
- PDEBUG(DCNETZ, DEBUG_ERROR, "Failed to create transaction\n");
+ LOGP(DCNETZ, LOGL_ERROR, "Failed to create transaction\n");
break;
}
cnetz = trans->cnetz; /* cnetz may change, due to stronger reception on different OgK */
@@ -1222,7 +1235,7 @@ void cnetz_receive_telegramm_ogk(cnetz_t *cnetz, telegramm_t *telegramm, int blo
if (!match_fuz(telegramm))
break;
rufnummer = telegramm2rufnummer(telegramm);
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Received Roaming request 'Umbuchantrag' message from Subscriber '%s' on queue\n", rufnummer);
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Received Roaming request 'Umbuchantrag' message from Subscriber '%s' on queue\n", rufnummer);
break;
case OPCODE_VWG_R:
case OPCODE_SRG_R:
@@ -1231,18 +1244,18 @@ void cnetz_receive_telegramm_ogk(cnetz_t *cnetz, telegramm_t *telegramm, int blo
break;
rufnummer = telegramm2rufnummer(telegramm);
if (opcode == OPCODE_VWG_R)
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Received outgoing Call 'Verbindungswunsch gehend' message from Subscriber '%s'\n", rufnummer);
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Received outgoing Call 'Verbindungswunsch gehend' message from Subscriber '%s'\n", rufnummer);
else if (opcode == OPCODE_SRG_R)
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Received outgoing emergency Call 'Sonderruf gehend' message from Subscriber '%s'\n", rufnummer);
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Received outgoing emergency Call 'Sonderruf gehend' message from Subscriber '%s'\n", rufnummer);
else
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Received outgoing Call 'Verbindungswunsch gehend bei Nachbarschaftsunterstuetzung' message from Subscriber '%s'\n", rufnummer);
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Received outgoing Call 'Verbindungswunsch gehend bei Nachbarschaftsunterstuetzung' message from Subscriber '%s'\n", rufnummer);
if (cnetz->state != CNETZ_IDLE) {
- PDEBUG(DCNETZ, DEBUG_NOTICE, "Ignoring Call from subscriber '%s', because we are busy becoming SpK.\n", rufnummer);
+ LOGP(DCNETZ, LOGL_NOTICE, "Ignoring Call from subscriber '%s', because we are busy becoming SpK.\n", rufnummer);
break;
}
trans = create_transaction(cnetz, TRANS_VWG, telegramm->futln_nationalitaet, telegramm->futln_heimat_fuvst_nr, telegramm->futln_rest_nr, -1, telegramm->erweitertes_frequenzbandbit, cnetz->rf_level_db);
if (!trans) {
- PDEBUG(DCNETZ, DEBUG_ERROR, "Failed to create transaction\n");
+ LOGP(DCNETZ, LOGL_ERROR, "Failed to create transaction\n");
break;
}
cnetz = trans->cnetz; /* cnetz may change, due to stronger reception on different OgK */
@@ -1252,13 +1265,13 @@ void cnetz_receive_telegramm_ogk(cnetz_t *cnetz, telegramm_t *telegramm, int blo
case OPCODE_WUE_M:
trans = search_transaction(cnetz, TRANS_WAF | TRANS_WBP | TRANS_VAG | TRANS_MO_QUEUE);
if (!trans) {
- PDEBUG_CHAN(DCNETZ, DEBUG_NOTICE, "Received dialing digits 'Wahluebertragung' message without transaction (on this OgK), ignoring!\n");
+ LOGP_CHAN(DCNETZ, LOGL_NOTICE, "Received dialing digits 'Wahluebertragung' message without transaction (on this OgK), ignoring!\n");
break;
}
rufnummer = transaction2rufnummer(trans);
strncpy(trans->dialing, telegramm->wahlziffern, sizeof(trans->dialing) - 1);
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Received dialing digits 'Wahluebertragung' message from Subscriber '%s' to Number '%s'\n", rufnummer, trans->dialing);
- timer_stop(&trans->timer);
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Received dialing digits 'Wahluebertragung' message from Subscriber '%s' to Number '%s'\n", rufnummer, trans->dialing);
+ osmo_timer_del(&trans->timer);
trans_new_state(trans, TRANS_WBP);
trans->try = 1; /* try */
valid_frame = 1;
@@ -1267,31 +1280,31 @@ void cnetz_receive_telegramm_ogk(cnetz_t *cnetz, telegramm_t *telegramm, int blo
if (!match_fuz(telegramm))
break;
rufnummer = telegramm2rufnummer(telegramm);
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Received release 'Ausloesen des FuTelG im OgK-Betrieb bei WS' message from Subscriber '%s'\n", rufnummer);
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Received release 'Ausloesen des FuTelG im OgK-Betrieb bei WS' message from Subscriber '%s'\n", rufnummer);
trans = search_transaction_number_global(telegramm->futln_nationalitaet, telegramm->futln_heimat_fuvst_nr, telegramm->futln_rest_nr);
if (!trans) {
- PDEBUG_CHAN(DCNETZ, DEBUG_NOTICE, "There is no transaction, so we assume that the phone did not receive previous release.\n");
+ LOGP_CHAN(DCNETZ, LOGL_NOTICE, "There is no transaction, so we assume that the phone did not receive previous release.\n");
/* create transaction, in case the phone repeats the release after we have acked it */
trans = create_transaction(cnetz, TRANS_ATQ_IDLE, telegramm->futln_nationalitaet, telegramm->futln_heimat_fuvst_nr, telegramm->futln_rest_nr, -1, -1, cnetz->rf_level_db);
if (!trans) {
- PDEBUG(DCNETZ, DEBUG_ERROR, "Failed to create transaction\n");
+ LOGP(DCNETZ, LOGL_ERROR, "Failed to create transaction\n");
break;
}
cnetz = trans->cnetz; /* cnetz may change, due to stronger reception on different OgK */
} else {
if (cnetz == trans->cnetz) {
- timer_stop(&trans->timer);
+ osmo_timer_del(&trans->timer);
trans_new_state(trans, TRANS_ATQ);
} else
if (trans->state == TRANS_ATQ_IDLE) {
trans = create_transaction(cnetz, TRANS_ATQ_IDLE, telegramm->futln_nationalitaet, telegramm->futln_heimat_fuvst_nr, telegramm->futln_rest_nr, -1, -1, cnetz->rf_level_db);
if (!trans) {
- PDEBUG(DCNETZ, DEBUG_ERROR, "Failed to create transaction\n");
+ LOGP(DCNETZ, LOGL_ERROR, "Failed to create transaction\n");
break;
}
cnetz = trans->cnetz; /* cnetz may change, due to stronger reception on different OgK */
} else
- PDEBUG_CHAN(DCNETZ, DEBUG_NOTICE, "Received release 'Ausloesen des FuTelG im OgK-Betrieb bei WS' message without transaction (on this OgK), ignoring!\n");
+ LOGP_CHAN(DCNETZ, LOGL_NOTICE, "Received release 'Ausloesen des FuTelG im OgK-Betrieb bei WS' message without transaction (on this OgK), ignoring!\n");
}
valid_frame = 1;
break;
@@ -1300,16 +1313,16 @@ void cnetz_receive_telegramm_ogk(cnetz_t *cnetz, telegramm_t *telegramm, int blo
break;
trans = search_transaction_number(cnetz, telegramm->futln_nationalitaet, telegramm->futln_heimat_fuvst_nr, telegramm->futln_rest_nr);
if (!trans) {
- PDEBUG_CHAN(DCNETZ, DEBUG_NOTICE, "Received acknowledge 'Meldung Funktelefonteilnehmer' message without transaction (on this OgK), ignoring!\n");
+ LOGP_CHAN(DCNETZ, LOGL_NOTICE, "Received acknowledge 'Meldung Funktelefonteilnehmer' message without transaction (on this OgK), ignoring!\n");
break;
}
rufnummer = transaction2rufnummer(trans);
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Received acknowledge 'Meldung Funktelefonteilnehmer' message from Subscriber '%s'\n", rufnummer);
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Received acknowledge 'Meldung Funktelefonteilnehmer' message from Subscriber '%s'\n", rufnummer);
destroy_transaction(trans);
valid_frame = 1;
break;
default:
- PDEBUG_CHAN(DCNETZ, DEBUG_NOTICE, "Received unexpected Telegramm (opcode %d = %s)\n", opcode, telegramm_name(opcode));
+ LOGP_CHAN(DCNETZ, LOGL_NOTICE, "Received unexpected Telegramm (opcode %d = %s)\n", opcode, telegramm_name(opcode));
}
if (cnetz->sender.loopback) {
@@ -1355,89 +1368,89 @@ const telegramm_t *cnetz_transmit_telegramm_spk_k(cnetz_t *cnetz)
switch (trans->state) {
case TRANS_BQ:
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Sending 'Belegungsquittung' on traffic channel\n");
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Sending 'Belegungsquittung' on traffic channel\n");
telegramm.opcode = OPCODE_BQ_K;
- if (++trans->repeat >= 8 && !timer_running(&trans->timer)) {
+ if (++trans->repeat >= 8 && !osmo_timer_pending(&trans->timer)) {
if (cnetz->challenge_valid) {
if (si.authentifikationsbit == 0) {
- PDEBUG_CHAN(DCNETZ, DEBUG_NOTICE, "Cannot authenticate, because base station does not support it. (Authentication disabled in sysinfo.)\n");
+ LOGP_CHAN(DCNETZ, LOGL_NOTICE, "Cannot authenticate, because base station does not support it. (Authentication disabled in sysinfo.)\n");
goto no_auth;
}
if (trans->futelg_bit == 0) {
- PDEBUG_CHAN(DCNETZ, DEBUG_NOTICE, "Cannot authenticate, because mobile station does not support it. (Mobile station has magnetic card.)\n");
+ LOGP_CHAN(DCNETZ, LOGL_NOTICE, "Cannot authenticate, because mobile station does not support it. (Mobile station has magnetic card.)\n");
goto no_auth;
}
- PDEBUG_CHAN(DCNETZ, DEBUG_NOTICE, "Perform authentication with subscriber's card, use challenge: 0x%016" PRIx64 "\n", telegramm.zufallszahl);
+ LOGP_CHAN(DCNETZ, LOGL_NOTICE, "Perform authentication with subscriber's card, use challenge: 0x%016" PRIx64 "\n", telegramm.zufallszahl);
trans_new_state(trans, TRANS_ZFZ);
- timer_start(&trans->timer, 0.0375 * F_ZFZ); /* F_ZFZ frames */
+ osmo_timer_schedule(&trans->timer, FLOAT_TO_TIMEOUT(0.0375 * F_ZFZ)); /* F_ZFZ frames */
} else {
no_auth:
trans_new_state(trans, TRANS_VHQ_K);
- timer_start(&trans->timer, 0.0375 * F_VHQK); /* F_VHQK frames */
+ osmo_timer_schedule(&trans->timer, FLOAT_TO_TIMEOUT(0.0375 * F_VHQK)); /* F_VHQK frames */
}
trans->repeat = 0;
}
break;
case TRANS_ZFZ:
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Sending 'Zufallszahl' on traffic channel (0x%016" PRIx64 ").\n", telegramm.zufallszahl);
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Sending 'Zufallszahl' on traffic channel (0x%016" PRIx64 ").\n", telegramm.zufallszahl);
telegramm.opcode = OPCODE_ZFZ_K;
break;
case TRANS_AP:
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Sending 'Quittung Verbindung halten' on traffic channel\n");
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Sending 'Quittung Verbindung halten' on traffic channel\n");
telegramm.opcode = OPCODE_VHQ_K;
break;
case TRANS_VHQ_K:
if (!cnetz->sender.loopback)
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Sending 'Quittung Verbindung halten' on traffic channel\n");
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Sending 'Quittung Verbindung halten' on traffic channel\n");
telegramm.opcode = OPCODE_VHQ_K;
/* continue until next sub frame, so we send DS from first block of next sub frame. */
- if (!cnetz->sender.loopback && (cnetz->sched_ts & 7) == 7 && cnetz->sched_r_m && !timer_running(&trans->timer)) {
+ if (!cnetz->sender.loopback && (cnetz->sched_ts & 7) == 7 && cnetz->sched_r_m && !osmo_timer_pending(&trans->timer)) {
/* next sub frame */
if (trans->mo_call) {
trans->callref = call_up_setup(transaction2rufnummer(trans), trans->dialing, OSMO_CC_NETWORK_CNETZ_NONE, "");
trans_new_state(trans, TRANS_DS);
trans->repeat = 0;
- timer_start(&trans->timer, 0.0375 * F_DS); /* F_DS frames */
+ osmo_timer_schedule(&trans->timer, FLOAT_TO_TIMEOUT(0.0375 * F_DS)); /* F_DS frames */
}
if (trans->mt_call) {
trans_new_state(trans, TRANS_RTA);
- timer_start(&trans->timer, 0.0375 * F_RTA); /* F_RTA frames */
+ osmo_timer_schedule(&trans->timer, FLOAT_TO_TIMEOUT(0.0375 * F_RTA)); /* F_RTA frames */
trans->repeat = 0;
call_up_alerting(trans->callref);
}
}
break;
case TRANS_DS:
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Sending 'Durchschalten' on traffic channel\n");
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Sending 'Durchschalten' on traffic channel\n");
telegramm.opcode = OPCODE_DSB_K;
/* send exactly a sub frame (8 time slots) */
- if ((cnetz->sched_ts & 7) == 7 && cnetz->sched_r_m && !timer_running(&trans->timer)) {
+ if ((cnetz->sched_ts & 7) == 7 && cnetz->sched_r_m && !osmo_timer_pending(&trans->timer)) {
/* next sub frame */
trans_new_state(trans, TRANS_VHQ_V);
trans->repeat = 0;
cnetz_set_sched_dsp_mode(cnetz, DSP_MODE_SPK_V, (cnetz->sched_ts + 1) & 31);
#ifndef DEBUG_SPK
- timer_start(&trans->timer, 0.075 + 0.6 * F_VHQ); /* one slot + F_VHQ frames */
+ osmo_timer_schedule(&trans->timer, FLOAT_TO_TIMEOUT(0.075 + 0.6 * F_VHQ)); /* one slot + F_VHQ frames */
#endif
}
break;
case TRANS_RTA:
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Sending 'Rufton anschalten' on traffic channel\n");
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Sending 'Rufton anschalten' on traffic channel\n");
telegramm.opcode = OPCODE_RTA_K;
break;
case TRANS_AHQ:
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Sending 'Abhebe Quittung' on traffic channel\n");
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Sending 'Abhebe Quittung' on traffic channel\n");
telegramm.opcode = OPCODE_AHQ_K;
if ((cnetz->sched_ts & 7) == 7 && cnetz->sched_r_m) {
/* next sub frame */
trans_new_state(trans, TRANS_VHQ_V);
trans->repeat = 0;
cnetz_set_sched_dsp_mode(cnetz, DSP_MODE_SPK_V, (cnetz->sched_ts + 1) & 31);
- timer_start(&trans->timer, 0.075 + 0.6 * F_VHQ); /* one slot + F_VHQ frames */
+ osmo_timer_schedule(&trans->timer, FLOAT_TO_TIMEOUT(0.075 + 0.6 * F_VHQ)); /* one slot + F_VHQ frames */
}
break;
case TRANS_AF:
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Sending 'Ausloesen durch FuFSt' on traffic channel\n");
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Sending 'Ausloesen durch FuFSt' on traffic channel\n");
telegramm.opcode = OPCODE_AF_K;
if (++trans->repeat < N_AFKT)
break;
@@ -1448,7 +1461,7 @@ no_auth:
break;
}
if (trans->try == N) {
- PDEBUG(DCNETZ, DEBUG_INFO, "Maximum retries, removing transaction\n");
+ LOGP(DCNETZ, LOGL_INFO, "Maximum retries, removing transaction\n");
/* no response to incomming call */
trans->page_failed = 1;
cnetz_release(trans, CNETZ_CAUSE_FUNKTECHNISCH);
@@ -1466,12 +1479,12 @@ no_auth:
/* alloc ogk again */
rc = find_db(trans->futln_nat, trans->futln_fuvst, trans->futln_rest, &ogk_kanal, NULL, NULL);
if (rc < 0) {
- PDEBUG(DCNETZ, DEBUG_NOTICE, "Cannot find subscriber in database anymore, releasing!\n");
+ LOGP(DCNETZ, LOGL_NOTICE, "Cannot find subscriber in database anymore, releasing!\n");
goto no_ogk;
}
ogk = search_ogk(ogk_kanal);
if (!ogk) {
- PDEBUG(DCNETZ, DEBUG_NOTICE, "Cannot retry, because currently no OgK available (busy)\n");
+ LOGP(DCNETZ, LOGL_NOTICE, "Cannot retry, because currently no OgK available (busy)\n");
no_ogk:
cnetz_release(trans, CNETZ_CAUSE_FUNKTECHNISCH);
if (trans->callref)
@@ -1480,7 +1493,7 @@ no_ogk:
destroy_transaction(trans);
break;
}
- PDEBUG(DCNETZ, DEBUG_INFO, "Retry to assign channel.\n");
+ LOGP(DCNETZ, LOGL_INFO, "Retry to assign channel.\n");
/* attach call to OgK */
link_transaction(trans, ogk);
/* change state */
@@ -1491,7 +1504,7 @@ no_ogk:
trans->try++;
break;
case TRANS_AT:
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Sending 'Auslosen durch FuFst' on traffic channel\n");
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Sending 'Auslosen durch FuFst' on traffic channel\n");
telegramm.opcode = OPCODE_AF_K;
if (++trans->repeat == 1) {
destroy_transaction(trans);
@@ -1521,11 +1534,11 @@ void cnetz_receive_telegramm_spk_k(cnetz_t *cnetz, telegramm_t *telegramm)
if (!match_futln(telegramm, trans->futln_nat, trans->futln_fuvst, trans->futln_rest)) {
break;
}
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Received allocation 'Belegung' message.\n");
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Received allocation 'Belegung' message.\n");
valid_frame = 1;
if (trans->state != TRANS_BQ)
break;
- timer_stop(&trans->timer);
+ osmo_timer_del(&trans->timer);
trans->try = 0;
break;
case OPCODE_DSQ_K:
@@ -1535,35 +1548,35 @@ void cnetz_receive_telegramm_spk_k(cnetz_t *cnetz, telegramm_t *telegramm)
if (!match_futln(telegramm, trans->futln_nat, trans->futln_fuvst, trans->futln_rest)) {
break;
}
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Received assignment confirm 'Durchschaltung Quittung' message.\n");
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Received assignment confirm 'Durchschaltung Quittung' message.\n");
valid_frame = 1;
if (trans->state != TRANS_DS)
break;
cnetz->scrambler = telegramm->betriebs_art;
cnetz->scrambler_switch = 0;
- timer_stop(&trans->timer);
+ osmo_timer_del(&trans->timer);
break;
case OPCODE_ZFZQ_K:
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Received random number acknowledge 'Zufallszahlquittung' message.\n");
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Received random number acknowledge 'Zufallszahlquittung' message.\n");
valid_frame = 1;
if (trans->state != TRANS_ZFZ)
break;
if (cnetz->challenge != telegramm->zufallszahl) {
- PDEBUG_CHAN(DCNETZ, DEBUG_NOTICE, "Received random number acknowledge (0x%016" PRIx64 ") does not match the transmitted one (0x%016" PRIx64 "), ignoring!\n", telegramm->zufallszahl, cnetz->challenge);
+ LOGP_CHAN(DCNETZ, LOGL_NOTICE, "Received random number acknowledge (0x%016" PRIx64 ") does not match the transmitted one (0x%016" PRIx64 "), ignoring!\n", telegramm->zufallszahl, cnetz->challenge);
break;
}
- timer_stop(&trans->timer);
+ osmo_timer_del(&trans->timer);
trans_new_state(trans, TRANS_AP);
- timer_start(&trans->timer, T_AP); /* 750 milliseconds */
+ osmo_timer_schedule(&trans->timer, T_AP); /* 750 milliseconds */
break;
case OPCODE_AP_K:
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Received challenge response 'Autorisierungsparameter' message (0x%016" PRIx64 ").\n", telegramm->authorisierungsparameter);
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Received challenge response 'Autorisierungsparameter' message (0x%016" PRIx64 ").\n", telegramm->authorisierungsparameter);
valid_frame = 1;
if (trans->state != TRANS_AP)
break;
/* if authentication response from card does not match */
if (cnetz->response_valid && telegramm->authorisierungsparameter != cnetz->response) {
- PDEBUG_CHAN(DCNETZ, DEBUG_NOTICE, "Received challenge response (0x%016" PRIx64 ") does not match the expected one (0x%016" PRIx64 "), releasing!\n", telegramm->authorisierungsparameter, cnetz->response);
+ LOGP_CHAN(DCNETZ, LOGL_NOTICE, "Received challenge response (0x%016" PRIx64 ") does not match the expected one (0x%016" PRIx64 "), releasing!\n", telegramm->authorisierungsparameter, cnetz->response);
if (trans->callref) {
call_up_release(trans->callref, CAUSE_TEMPFAIL); /* jolly guesses that */
trans->callref = 0;
@@ -1571,10 +1584,10 @@ void cnetz_receive_telegramm_spk_k(cnetz_t *cnetz, telegramm_t *telegramm)
cnetz_release(trans, CNETZ_CAUSE_GASSENBESETZT); /* when authentication is not valid */
break;
}
- PDEBUG_CHAN(DCNETZ, DEBUG_NOTICE, "Completed authentication with subscriber's card, challenge response: 0x%016" PRIx64 "\n", telegramm->authorisierungsparameter);
- timer_stop(&trans->timer);
+ LOGP_CHAN(DCNETZ, LOGL_NOTICE, "Completed authentication with subscriber's card, challenge response: 0x%016" PRIx64 "\n", telegramm->authorisierungsparameter);
+ osmo_timer_del(&trans->timer);
trans_new_state(trans, TRANS_VHQ_K);
- timer_start(&trans->timer, 0.0375 * F_VHQK); /* F_VHQK frames */
+ osmo_timer_schedule(&trans->timer, FLOAT_TO_TIMEOUT(0.0375 * F_VHQK)); /* F_VHQK frames */
break;
case OPCODE_VH_K:
if (!match_fuz(telegramm)) {
@@ -1583,11 +1596,11 @@ void cnetz_receive_telegramm_spk_k(cnetz_t *cnetz, telegramm_t *telegramm)
if (!match_futln(telegramm, trans->futln_nat, trans->futln_fuvst, trans->futln_rest)) {
break;
}
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Received connection hold 'Verbindung halten' message.\n");
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Received connection hold 'Verbindung halten' message.\n");
valid_frame = 1;
if (trans->state != TRANS_VHQ_K)
break;
- timer_stop(&trans->timer);
+ osmo_timer_del(&trans->timer);
break;
case OPCODE_RTAQ_K:
if (!match_fuz(telegramm)) {
@@ -1597,10 +1610,10 @@ void cnetz_receive_telegramm_spk_k(cnetz_t *cnetz, telegramm_t *telegramm)
break;
}
valid_frame = 1;
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Received ringback 'Rufton anschalten Quittung' message.\n");
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Received ringback 'Rufton anschalten Quittung' message.\n");
if (trans->state != TRANS_RTA)
break;
- timer_start(&trans->timer, 0.0375 * F_RTA); /* F_RTA frames */
+ osmo_timer_schedule(&trans->timer, FLOAT_TO_TIMEOUT(0.0375 * F_RTA)); /* F_RTA frames */
break;
case OPCODE_AH_K:
if (!match_fuz(telegramm)) {
@@ -1609,7 +1622,7 @@ void cnetz_receive_telegramm_spk_k(cnetz_t *cnetz, telegramm_t *telegramm)
if (!match_futln(telegramm, trans->futln_nat, trans->futln_fuvst, trans->futln_rest)) {
break;
}
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Received answer frame 'Abheben' message.\n");
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Received answer frame 'Abheben' message.\n");
valid_frame = 1;
/* if already received this frame, or if we are already on VHQ or if we are releasing */
if (trans->state == TRANS_AHQ || trans->state == TRANS_VHQ_K || trans->state == TRANS_VHQ_V || trans->state == TRANS_AF)
@@ -1618,7 +1631,7 @@ void cnetz_receive_telegramm_spk_k(cnetz_t *cnetz, telegramm_t *telegramm)
cnetz->scrambler_switch = 0;
trans_new_state(trans, TRANS_AHQ);
trans->repeat = 0;
- timer_stop(&trans->timer);
+ osmo_timer_del(&trans->timer);
call_up_answer(trans->callref, transaction2rufnummer(trans));
break;
case OPCODE_AT_K:
@@ -1628,21 +1641,21 @@ void cnetz_receive_telegramm_spk_k(cnetz_t *cnetz, telegramm_t *telegramm)
if (!match_futln(telegramm, trans->futln_nat, trans->futln_fuvst, trans->futln_rest)) {
break;
}
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Received release frame 'Ausloesen durch FuTln' message.\n");
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Received release frame 'Ausloesen durch FuTln' message.\n");
valid_frame = 1;
/* if already received this frame, if we are releasing */
if (trans->state == TRANS_AT || trans->state == TRANS_AF)
break;
trans_new_state(trans, TRANS_AT);
trans->repeat = 0;
- timer_stop(&trans->timer);
+ osmo_timer_del(&trans->timer);
if (trans->callref) {
call_up_release(trans->callref, CAUSE_NORMAL);
trans->callref = 0;
}
break;
default:
- PDEBUG_CHAN(DCNETZ, DEBUG_NOTICE, "Received unexpected Telegramm (opcode %d = %s)\n", opcode, telegramm_name(opcode));
+ LOGP_CHAN(DCNETZ, LOGL_NOTICE, "Received unexpected Telegramm (opcode %d = %s)\n", opcode, telegramm_name(opcode));
}
if (valid_frame)
@@ -1661,11 +1674,11 @@ const telegramm_t *cnetz_transmit_telegramm_spk_v(cnetz_t *cnetz)
memset(&telegramm, 0, sizeof(telegramm));
- if (cnetz->metering) {
- double now = get_time();
- if (!trans->call_start)
- trans->call_start = now;
- meter = (now - trans->call_start) / (double)cnetz->metering + 1;
+ if (trans->metering_time) {
+ /* get end time. if not set, use current time. (still running) */
+ double end = (trans->meter_end) ? : get_time();
+ /* add one unit, because when metering is started, the first unit is counted. */
+ meter = (end - trans->meter_start) / (double)trans->metering_time + 1.0;
}
telegramm.max_sendeleistung = cnetz_power2bits(cnetz->ms_power);
@@ -1687,15 +1700,15 @@ const telegramm_t *cnetz_transmit_telegramm_spk_v(cnetz_t *cnetz)
switch (trans->state) {
case TRANS_VHQ_V:
if ((cnetz->sched_ts & 8) == 0) { /* sub frame 1 and 3 */
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Sending 'Quittung Verbindung halten 1' on traffic channel\n");
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Sending 'Quittung Verbindung halten 1' on traffic channel\n");
telegramm.opcode = OPCODE_VHQ1_V;
} else { /* sub frame 2 and 4 */
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Sending 'Quittung Verbindung halten 2' on traffic channel\n");
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Sending 'Quittung Verbindung halten 2' on traffic channel\n");
telegramm.opcode = OPCODE_VHQ2_V;
}
break;
case TRANS_AF:
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Sending 'Ausloesen durch FuFSt' on traffic channel\n");
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Sending 'Ausloesen durch FuFSt' on traffic channel\n");
telegramm.opcode = OPCODE_AF_V;
if (++trans->repeat == N_AFV) {
destroy_transaction(trans);
@@ -1703,7 +1716,7 @@ const telegramm_t *cnetz_transmit_telegramm_spk_v(cnetz_t *cnetz)
}
break;
case TRANS_AT:
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Sending acknowledge to 'Ausloesen durch FuTln' on traffic channel\n");
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Sending acknowledge to 'Ausloesen durch FuTln' on traffic channel\n");
telegramm.opcode = OPCODE_AF_V;
if (++trans->repeat == 1) {
destroy_transaction(trans);
@@ -1737,16 +1750,16 @@ void cnetz_receive_telegramm_spk_v(cnetz_t *cnetz, telegramm_t *telegramm)
}
if (trans->state != TRANS_VHQ_V)
break;
- timer_start(&trans->timer, 0.6 * F_VHQ); /* F_VHQ frames */
+ osmo_timer_schedule(&trans->timer, FLOAT_TO_TIMEOUT(0.6 * F_VHQ)); /* F_VHQ frames */
switch (opcode) {
case OPCODE_VH_V:
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Received supervisory frame 'Verbindung halten' message%s.\n", (telegramm->test_telefonteilnehmer_geraet) ? ", phone is a test-phone" : "");
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Received supervisory frame 'Verbindung halten' message%s.\n", (telegramm->test_telefonteilnehmer_geraet) ? ", phone is a test-phone" : "");
break;
case OPCODE_USAI_V:
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Received internal handover request frame 'Umschaltantrag intern' message%s.\n", (telegramm->test_telefonteilnehmer_geraet) ? ", phone is a test-phone" : "");
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Received internal handover request frame 'Umschaltantrag intern' message%s.\n", (telegramm->test_telefonteilnehmer_geraet) ? ", phone is a test-phone" : "");
break;
case OPCODE_USAE_V:
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Received external handover request frame 'Umschaltantrag extern' message%s.\n", (telegramm->test_telefonteilnehmer_geraet) ? ", phone is a test-phone" : "");
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Received external handover request frame 'Umschaltantrag extern' message%s.\n", (telegramm->test_telefonteilnehmer_geraet) ? ", phone is a test-phone" : "");
break;
}
valid_frame = 1;
@@ -1767,21 +1780,21 @@ void cnetz_receive_telegramm_spk_v(cnetz_t *cnetz, telegramm_t *telegramm)
if (!match_futln(telegramm, trans->futln_nat, trans->futln_fuvst, trans->futln_rest)) {
break;
}
- PDEBUG_CHAN(DCNETZ, DEBUG_INFO, "Received release frame 'Ausloesen durch FuTln' message.\n");
+ LOGP_CHAN(DCNETZ, LOGL_INFO, "Received release frame 'Ausloesen durch FuTln' message.\n");
valid_frame = 1;
/* if already received this frame, if we are releasing */
if (trans->state == TRANS_AT || trans->state == TRANS_AF)
break;
trans_new_state(trans, TRANS_AT);
trans->repeat = 0;
- timer_stop(&trans->timer);
+ osmo_timer_del(&trans->timer);
if (trans->callref) {
call_up_release(trans->callref, CAUSE_NORMAL);
trans->callref = 0;
}
break;
default:
- PDEBUG_CHAN(DCNETZ, DEBUG_NOTICE, "Received unexpected Telegramm (opcode %d = %s)\n", opcode, telegramm_name(opcode));
+ LOGP_CHAN(DCNETZ, LOGL_NOTICE, "Received unexpected Telegramm (opcode %d = %s)\n", opcode, telegramm_name(opcode));
}
if (valid_frame)
diff --git a/src/cnetz/cnetz.h b/src/cnetz/cnetz.h
index 2033907..b9bbafe 100644
--- a/src/cnetz/cnetz.h
+++ b/src/cnetz/cnetz.h
@@ -1,5 +1,5 @@
#include "../libcompandor/compandor.h"
-#include "../libtimer/timer.h"
+#include <osmocom/core/timer.h>
#include "../libmobile/sender.h"
#include "../libscrambler/scrambler.h"
typedef struct cnetz cnetz_t;
@@ -40,9 +40,9 @@ enum cnetz_state {
#define N_AFKT 6 /* number of release frames to send during concentrated signaling */
#define N_AFV 4 /* number of release frames to send during distributed signaling */
#define N 3 /* now many times we repeat a message on OgK */
-#define T_VAG2 180 /* time on outgoing queue */
-#define T_VAK 60 /* time on incoming queue */
-#define T_AP 750 /* Time to wait for SIM card's authentication reply */
+#define T_VAG2 180,0 /* time on outgoing queue */
+#define T_VAK 60,0 /* time on incoming queue */
+#define T_AP 0,750000 /* Time to wait for SIM card's authentication reply */
/* clear causes */
#define CNETZ_CAUSE_GASSENBESETZT 0 /* network congested */
@@ -82,7 +82,7 @@ struct cnetz {
int response_valid; /* expect authorizaton response */
uint64_t response; /* authorization response */
int warteschlange; /* use queue */
- int metering; /* use metering pulses in seconds 0 = off */
+ int metering; /* send metering units in seconds 0 = off */
/* all cnetz states */
enum cnetz_state state; /* main state of sender */
diff --git a/src/cnetz/database.c b/src/cnetz/database.c
index d52c6da..4bdfb2c 100644
--- a/src/cnetz/database.c
+++ b/src/cnetz/database.c
@@ -22,7 +22,8 @@
#include <stdlib.h>
#include <string.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
+#include "../libmobile/get_time.h"
#include "cnetz.h"
#include "database.h"
#include "sysinfo.h"
@@ -45,7 +46,7 @@ typedef struct cnetz_database {
int eingebucht; /* set if still available */
double last_seen;
int busy; /* set if currently in a call */
- struct timer timer; /* timer for next availability check */
+ struct osmo_timer_list timer; /* timer for next availability check */
int retry; /* counts number of retries */
} cnetz_db_t;
@@ -72,33 +73,33 @@ static void remove_db(cnetz_db_t *db)
while (*dbp && *dbp != db)
dbp = &((*dbp)->next);
if (!(*dbp)) {
- PDEBUG(DDB, DEBUG_ERROR, "Subscriber not in list, please fix!!\n");
+ LOGP(DDB, LOGL_ERROR, "Subscriber not in list, please fix!!\n");
abort();
}
*dbp = db->next;
- PDEBUG(DDB, DEBUG_INFO, "Removing subscriber '%d,%d,%05d' from database.\n", db->futln_nat, db->futln_fuvst, db->futln_rest);
+ LOGP(DDB, LOGL_INFO, "Removing subscriber '%d,%d,%05d' from database.\n", db->futln_nat, db->futln_fuvst, db->futln_rest);
- timer_exit(&db->timer);
+ osmo_timer_del(&db->timer);
free(db);
}
/* Timeout handling */
-static void db_timeout(struct timer *timer)
+static void db_timeout(void *data)
{
- cnetz_db_t *db = (cnetz_db_t *)timer->priv;
+ cnetz_db_t *db = data;
int rc;
- PDEBUG(DDB, DEBUG_INFO, "Check, if subscriber '%d,%d,%05d' is still available.\n", db->futln_nat, db->futln_fuvst, db->futln_rest);
+ LOGP(DDB, LOGL_INFO, "Check, if subscriber '%d,%d,%05d' is still available.\n", db->futln_nat, db->futln_fuvst, db->futln_rest);
rc = cnetz_meldeaufruf(db->futln_nat, db->futln_fuvst, db->futln_rest, db->ogk_kanal);
if (rc < 0) {
/* OgK is used for speech, but this never happens in a real
* network. We just assume that the phone has responded and
* assume we had a response. */
- PDEBUG(DDB, DEBUG_INFO, "OgK busy, so we assume a positive response.\n");
- timer_start(&db->timer, si.meldeinterval); /* when to check avaiability again */
+ LOGP(DDB, LOGL_INFO, "OgK busy, so we assume a positive response.\n");
+ osmo_timer_schedule(&db->timer, si.meldeinterval,0); /* when to check avaiability again */
db->retry = 0;
}
}
@@ -120,10 +121,10 @@ int update_db(uint8_t futln_nat, uint8_t futln_fuvst, uint16_t futln_rest, int o
if (!db) {
db = calloc(1, sizeof(*db));
if (!db) {
- PDEBUG(DDB, DEBUG_ERROR, "No memory!\n");
+ LOGP(DDB, LOGL_ERROR, "No memory!\n");
return 0;
}
- timer_init(&db->timer, db_timeout, db);
+ osmo_timer_setup(&db->timer, db_timeout, db);
db->eingebucht = 1;
db->futln_nat = futln_nat;
@@ -136,7 +137,7 @@ int update_db(uint8_t futln_nat, uint8_t futln_fuvst, uint16_t futln_rest, int o
dbp = &((*dbp)->next);
*dbp = db;
- PDEBUG(DDB, DEBUG_INFO, "Adding subscriber '%d,%d,%05d' to database.\n", db->futln_nat, db->futln_fuvst, db->futln_rest);
+ LOGP(DDB, LOGL_INFO, "Adding subscriber '%d,%d,%05d' to database.\n", db->futln_nat, db->futln_fuvst, db->futln_rest);
}
if (ogk_kanal)
@@ -150,23 +151,23 @@ int update_db(uint8_t futln_nat, uint8_t futln_fuvst, uint16_t futln_rest, int o
db->busy = busy;
if (busy) {
- PDEBUG(DDB, DEBUG_INFO, "Subscriber '%d,%d,%05d' on OGK channel #%d is busy now.\n", db->futln_nat, db->futln_fuvst, db->futln_rest, db->ogk_kanal);
- timer_stop(&db->timer);
+ LOGP(DDB, LOGL_INFO, "Subscriber '%d,%d,%05d' on OGK channel #%d is busy now.\n", db->futln_nat, db->futln_fuvst, db->futln_rest, db->ogk_kanal);
+ osmo_timer_del(&db->timer);
} else if (!failed) {
- PDEBUG(DDB, DEBUG_INFO, "Subscriber '%d,%d,%05d' on OGK channel #%d is idle now.\n", db->futln_nat, db->futln_fuvst, db->futln_rest, db->ogk_kanal);
- timer_start(&db->timer, si.meldeinterval); /* when to check avaiability (again) */
+ LOGP(DDB, LOGL_INFO, "Subscriber '%d,%d,%05d' on OGK channel #%d is idle now.\n", db->futln_nat, db->futln_fuvst, db->futln_rest, db->ogk_kanal);
+ osmo_timer_schedule(&db->timer, si.meldeinterval,0); /* when to check avaiability (again) */
db->retry = 0;
db->eingebucht = 1;
db->last_seen = get_time();
} else {
db->retry++;
- PDEBUG(DDB, DEBUG_NOTICE, "Paging subscriber '%d,%d,%05d' on OGK channel #%d failed (try %d of %s).\n", db->futln_nat, db->futln_fuvst, db->futln_rest, db->ogk_kanal, db->retry, print_meldeaufrufe(si.meldeaufrufe));
+ LOGP(DDB, LOGL_NOTICE, "Paging subscriber '%d,%d,%05d' on OGK channel #%d failed (try %d of %s).\n", db->futln_nat, db->futln_fuvst, db->futln_rest, db->ogk_kanal, db->retry, print_meldeaufrufe(si.meldeaufrufe));
if (si.meldeaufrufe && db->retry == si.meldeaufrufe) {
- PDEBUG(DDB, DEBUG_INFO, "Marking subscriber as gone.\n");
+ LOGP(DDB, LOGL_INFO, "Marking subscriber as gone.\n");
db->eingebucht = 0;
return db->extended;
}
- timer_start(&db->timer, (si.meldeinterval < MELDE_WIEDERHOLUNG) ? si.meldeinterval : MELDE_WIEDERHOLUNG); /* when to do retry */
+ osmo_timer_schedule(&db->timer, (si.meldeinterval < MELDE_WIEDERHOLUNG) ? si.meldeinterval : MELDE_WIEDERHOLUNG,0); /* when to do retry */
}
if (futelg_bit)
@@ -211,18 +212,18 @@ void dump_db(void)
int last;
char attached[16];
- PDEBUG(DDB, DEBUG_NOTICE, "Dump of subscriber database:\n");
+ LOGP(DDB, LOGL_NOTICE, "Dump of subscriber database:\n");
if (!db) {
- PDEBUG(DDB, DEBUG_NOTICE, " - No subscribers attached!\n");
+ LOGP(DDB, LOGL_NOTICE, " - No subscribers attached!\n");
return;
}
- PDEBUG(DDB, DEBUG_NOTICE, "Subscriber\tAttached\tBusy\t\tLast seen\tMeldeaufrufe\n");
- PDEBUG(DDB, DEBUG_NOTICE, "-------------------------------------------------------------------------------\n");
+ LOGP(DDB, LOGL_NOTICE, "Subscriber\tAttached\tBusy\t\tLast seen\tMeldeaufrufe\n");
+ LOGP(DDB, LOGL_NOTICE, "-------------------------------------------------------------------------------\n");
while (db) {
last = (db->busy) ? 0 : (uint32_t)(now - db->last_seen);
sprintf(attached, "YES (OGK %d)", db->ogk_kanal);
- PDEBUG(DDB, DEBUG_NOTICE, "%d,%d,%05d\t%s\t%s\t\t%02d:%02d:%02d \t%d/%s\n", db->futln_nat, db->futln_fuvst, db->futln_rest, (db->eingebucht) ? attached : "-no-\t", (db->busy) ? "YES" : "-no-", last / 3600, (last / 60) % 60, last % 60, db->retry, print_meldeaufrufe(si.meldeaufrufe));
+ LOGP(DDB, LOGL_NOTICE, "%d,%d,%05d\t%s\t%s\t\t%02d:%02d:%02d \t%d/%s\n", db->futln_nat, db->futln_fuvst, db->futln_rest, (db->eingebucht) ? attached : "-no-\t", (db->busy) ? "YES" : "-no-", last / 3600, (last / 60) % 60, last % 60, db->retry, print_meldeaufrufe(si.meldeaufrufe));
db = db->next;
}
}
diff --git a/src/cnetz/dsp.c b/src/cnetz/dsp.c
index c5658e5..af29c62 100644
--- a/src/cnetz/dsp.c
+++ b/src/cnetz/dsp.c
@@ -26,8 +26,9 @@
#include <math.h>
#include <errno.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../libmobile/call.h"
+#include "../libmobile/get_time.h"
#include "cnetz.h"
#include "sysinfo.h"
#include "telegramm.h"
@@ -48,12 +49,12 @@
#define BLOCK_BITS 198 /* duration of one time slot including pause at beginning and end */
#ifdef TEST_SCRAMBLE
-jitter_t scrambler_test_jb;
+test_echo_t scrambler_test_echo = {};
scrambler_t scrambler_test_scrambler1;
scrambler_t scrambler_test_scrambler2;
#endif
-const char *cnetz_dsp_mode_name(enum dsp_mode mode)
+static const char *cnetz_dsp_mode_name(enum dsp_mode mode)
{
static char invalid[16];
@@ -76,6 +77,7 @@ const char *cnetz_dsp_mode_name(enum dsp_mode mode)
void dsp_init(void)
{
+ compandor_init();
}
static void dsp_init_ramp(cnetz_t *cnetz)
@@ -83,7 +85,7 @@ static void dsp_init_ramp(cnetz_t *cnetz)
double c;
int i;
- PDEBUG(DDSP, DEBUG_DEBUG, "Generating smooth ramp table.\n");
+ LOGP(DDSP, LOGL_DEBUG, "Generating smooth ramp table.\n");
for (i = 0; i < 256; i++) {
/* use square-root of cosine ramp. tests showed that phones are more
* happy with that. (This is not correct pulse shaping!) */
@@ -103,7 +105,7 @@ int dsp_init_sender(cnetz_t *cnetz, int measure_speed, double clock_speed[2], en
int rc = 0;
double size;
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Init FSK for 'Sender'.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Init FSK for 'Sender'.\n");
/* set modulation parameters */
sender_set_fm(&cnetz->sender, MAX_DEVIATION, MAX_MODULATION, speech_deviation, MAX_DISPLAY);
@@ -114,20 +116,20 @@ int dsp_init_sender(cnetz_t *cnetz, int measure_speed, double clock_speed[2], en
}
if (clock_speed[0] > 1000 || clock_speed[0] < -1000 || clock_speed[1] > 1000 || clock_speed[1] < -1000) {
- PDEBUG_CHAN(DDSP, DEBUG_ERROR, "Clock speed %.1f,%.1f ppm out of range! Please use range between +-1000 ppm!\n", clock_speed[0], clock_speed[1]);
+ LOGP_CHAN(DDSP, LOGL_ERROR, "Clock speed %.1f,%.1f ppm out of range! Please use range between +-1000 ppm!\n", clock_speed[0], clock_speed[1]);
return -EINVAL;
}
- PDEBUG_CHAN(DDSP, DEBUG_INFO, "Using clock speed of %.1f ppm (RX) and %.1f ppm (TX) to correct sound card's clock.\n", clock_speed[0], clock_speed[1]);
+ LOGP_CHAN(DDSP, LOGL_INFO, "Using clock speed of %.1f ppm (RX) and %.1f ppm (TX) to correct sound card's clock.\n", clock_speed[0], clock_speed[1]);
cnetz->fsk_bitduration = (double)cnetz->sender.samplerate / ((double)BITRATE / (1.0 + clock_speed[1] / 1000000.0));
cnetz->fsk_tx_bitstep = 1.0 / cnetz->fsk_bitduration;
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Use %.4f samples for one bit duration @ %d.\n", cnetz->fsk_bitduration, cnetz->sender.samplerate);
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Use %.4f samples for one bit duration @ %d.\n", cnetz->fsk_bitduration, cnetz->sender.samplerate);
size = cnetz->fsk_bitduration * (double)BLOCK_BITS * 16.0; /* 16 blocks for distributed frames */
cnetz->fsk_tx_buffer_size = size * 1.1; /* more to compensate clock speed */
cnetz->fsk_tx_buffer = calloc(sizeof(sample_t), cnetz->fsk_tx_buffer_size);
if (!cnetz->fsk_tx_buffer) {
- PDEBUG_CHAN(DDSP, DEBUG_ERROR, "No memory!\n");
+ LOGP_CHAN(DDSP, LOGL_ERROR, "No memory!\n");
rc = -ENOMEM;
goto error;
}
@@ -142,7 +144,7 @@ int dsp_init_sender(cnetz_t *cnetz, int measure_speed, double clock_speed[2], en
/* create speech buffer */
cnetz->dsp_speech_buffer = calloc(sizeof(sample_t), (int)(cnetz->fsk_bitduration * 70.0)); /* more to compensate clock speed. we just need it to fill 62 bits (60 bits, including pause bits). */
if (!cnetz->dsp_speech_buffer) {
- PDEBUG_CHAN(DDSP, DEBUG_ERROR, "No memory!\n");
+ LOGP_CHAN(DDSP, LOGL_ERROR, "No memory!\n");
rc = -ENOMEM;
goto error;
}
@@ -160,15 +162,15 @@ int dsp_init_sender(cnetz_t *cnetz, int measure_speed, double clock_speed[2], en
/* init compandor, according to C-Netz specs, attack and recovery time
* shall not exceed according to ITU G.162 */
- init_compandor(&cnetz->cstate, 8000, 5.0, 22.5);
+ setup_compandor(&cnetz->cstate, 8000, 5.0, 22.5);
/* use duration of one bit to ramp level of last frame to current frame */
cnetz->offset_range = ceil(cnetz->fsk_bitduration);
#ifdef TEST_SCRAMBLE
- rc = jitter_create(&scrambler_test_jb, "scramble", cnetz->sender.samplerate, sizeof(sample_t), JITTER_AUDIO);
+ rc = test_echo_alloc(&scrambler_test_echo, cnetz->sender.samplerate / 20);
if (rc < 0) {
- PDEBUG_CHAN(DDSP, DEBUG_ERROR, "Failed to init jitter buffer for scrambler test!\n");
+ LOGP_CHAN(DDSP, LOGL_ERROR, "Failed to init echo buffer for scrambler test!\n");
exit(0);
}
scrambler_setup(&scrambler_test_scrambler1, cnetz->sender.samplerate);
@@ -187,7 +189,7 @@ error:
void dsp_cleanup_sender(cnetz_t *cnetz)
{
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Cleanup FSK for 'Sender'.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Cleanup FSK for 'Sender'.\n");
if (cnetz->fsk_tx_buffer) {
free(cnetz->fsk_tx_buffer);
@@ -255,7 +257,7 @@ void calc_clock_speed(cnetz_t *cnetz, double samples, int tx, int result)
speed_ppm_avg[index] += cs->speed_ppm[index][(cs->idx[index] - i - 1) & 0xff];
speed_ppm_avg[index] /= (double)cs->num[index];
}
- PDEBUG_CHAN(DDSP, DEBUG_NOTICE, "Clock: RX=%.3f TX=%.3f; Signal: RX=%.3f TX=%.3f ppm\n", speed_ppm_avg[0], speed_ppm_avg[1], speed_ppm_avg[2], speed_ppm_avg[3]);
+ LOGP_CHAN(DDSP, LOGL_NOTICE, "Clock: RX=%.3f TX=%.3f; Signal: RX=%.3f TX=%.3f ppm\n", speed_ppm_avg[0], speed_ppm_avg[1], speed_ppm_avg[2], speed_ppm_avg[3]);
}
static int fsk_nothing_encode(cnetz_t *cnetz)
@@ -571,7 +573,7 @@ void sender_receive(sender_t *sender, sample_t *samples, int length, double rf_l
#ifdef TEST_UNSCRAMBLE
scrambler(&scrambler_test_scrambler1, samples, length);
#endif
- jitter_save(&scrambler_test_jb, samples, length, 0, 0, 0, 0);
+ test_echo_store(&scrambler_test_echo, samples, length);
return;
#endif
@@ -587,8 +589,10 @@ void sender_receive(sender_t *sender, sample_t *samples, int length, double rf_l
static int shrink_speech(cnetz_t *cnetz, sample_t *speech_buffer)
{
int speech_length;
+ int16_t spl[100];
- jitter_load(&cnetz->sender.dejitter, speech_buffer, 100);
+ jitter_load_samples(&cnetz->sender.dejitter, (uint8_t *)spl, 100, sizeof(*spl), jitter_conceal_s16, NULL);
+ int16_to_samples_speech(speech_buffer, spl, 100);
/* 1. compress dynamics */
compress_audio(&cnetz->cstate, speech_buffer, 100);
/* 2. upsample */
@@ -641,10 +645,10 @@ again:
* because one has a phase wrap before and the other after a sample.
* then we do it next super frame cycle */
if (master->frame_last_scount == cnetz->fsk_tx_scount) {
- PDEBUG(DDSP, DEBUG_DEBUG, "Sync phase of slave to master: master=%.15f, slave=%.15f, diff=%.15f\n", master->frame_last_phase, cnetz->fsk_tx_phase, master->frame_last_phase - cnetz->fsk_tx_phase);
+ LOGP(DDSP, LOGL_DEBUG, "Sync phase of slave to master: master=%.15f, slave=%.15f, diff=%.15f\n", master->frame_last_phase, cnetz->fsk_tx_phase, master->frame_last_phase - cnetz->fsk_tx_phase);
cnetz->fsk_tx_phase = master->frame_last_phase;
} else {
- PDEBUG(DDSP, DEBUG_DEBUG, "Not sync phase of slave to master: Sample counts during frame change are different, ignoring this time!\n");
+ LOGP(DDSP, LOGL_DEBUG, "Not sync phase of slave to master: Sample counts during frame change are different, ignoring this time!\n");
}
}
}
@@ -653,7 +657,7 @@ again:
if (cnetz->sched_dsp_mode_ts >= 0 && cnetz->sched_r_m == 0) {
if (cnetz->sched_dsp_mode_ts == cnetz->sched_ts) {
/* OgK / SpK(K) / SpK(V) */
- PDEBUG_CHAN(DDSP, DEBUG_INFO, "Now switching channel mode to %s at timeslot %d\n", cnetz_dsp_mode_name(cnetz->sched_dsp_mode), cnetz->sched_dsp_mode_ts);
+ LOGP_CHAN(DDSP, LOGL_INFO, "Now switching channel mode to %s at timeslot %d\n", cnetz_dsp_mode_name(cnetz->sched_dsp_mode), cnetz->sched_dsp_mode_ts);
cnetz->sched_dsp_mode_ts = -1;
cnetz_set_dsp_mode(cnetz, cnetz->sched_dsp_mode);
}
@@ -670,14 +674,14 @@ again:
cnetz->sched_last_ts = cnetz->sched_ts;
bits = cnetz_encode_telegramm(cnetz);
if (bits) {
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Transmitting 'Rufblock' at timeslot %d\n", cnetz->sched_ts);
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Transmitting 'Rufblock' at timeslot %d\n", cnetz->sched_ts);
fsk_block_encode(cnetz, bits, 1);
} else
fsk_nothing_encode(cnetz);
} else {
bits = cnetz_encode_telegramm(cnetz);
if (bits) {
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Transmitting 'Meldeblock' at timeslot %d\n", cnetz->sched_ts);
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Transmitting 'Meldeblock' at timeslot %d\n", cnetz->sched_ts);
fsk_block_encode(cnetz, bits, 1);
} else
fsk_nothing_encode(cnetz);
@@ -689,7 +693,7 @@ again:
case DSP_MODE_SPK_K:
bits = cnetz_encode_telegramm(cnetz);
if (bits) {
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Transmitting 'Konzentrierte Signalisierung' at timeslot %d.%d\n", cnetz->sched_ts, cnetz->sched_r_m * 5);
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Transmitting 'Konzentrierte Signalisierung' at timeslot %d.%d\n", cnetz->sched_ts, cnetz->sched_r_m * 5);
fsk_block_encode(cnetz, bits, 0);
} else
fsk_nothing_encode(cnetz);
@@ -697,7 +701,7 @@ again:
case DSP_MODE_SPK_V:
bits = cnetz_encode_telegramm(cnetz);
if (bits) {
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Transmitting 'Verteilte Signalisierung' starting at timeslot %d\n", cnetz->sched_ts);
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Transmitting 'Verteilte Signalisierung' starting at timeslot %d\n", cnetz->sched_ts);
fsk_distributed_encode(cnetz, bits);
} else
fsk_nothing_encode(cnetz);
@@ -793,7 +797,7 @@ void sender_send(sender_t *sender, sample_t *samples, uint8_t *power, int length
calc_clock_speed(cnetz, length, 1, 0);
#ifdef TEST_SCRAMBLE
- jitter_load(&scrambler_test_jb, samples, length);
+ test_echo_load(&scrambler_test_echo, samples, length);
scrambler(&scrambler_test_scrambler2, samples, length);
return;
#endif
@@ -859,9 +863,12 @@ void unshrink_speech(cnetz_t *cnetz, sample_t *speech_buffer, int count)
void cnetz_set_dsp_mode(cnetz_t *cnetz, enum dsp_mode mode)
{
if (mode != cnetz->dsp_mode) {
- PDEBUG_CHAN(DDSP, DEBUG_INFO, "DSP mode %s -> %s\n", cnetz_dsp_mode_name(cnetz->dsp_mode), cnetz_dsp_mode_name(mode));
+ LOGP_CHAN(DDSP, LOGL_INFO, "DSP mode %s -> %s\n", cnetz_dsp_mode_name(cnetz->dsp_mode), cnetz_dsp_mode_name(mode));
cnetz->dsp_mode = mode;
}
+ if (mode == DSP_MODE_SPK_V && cnetz->dsp_mode != mode)
+ jitter_reset(&cnetz->sender.dejitter);
+
/* we must get rid of partly received frame */
fsk_demod_reset(&cnetz->fsk_demod);
}
@@ -869,11 +876,35 @@ void cnetz_set_dsp_mode(cnetz_t *cnetz, enum dsp_mode mode)
void cnetz_set_sched_dsp_mode(cnetz_t *cnetz, enum dsp_mode mode, int timeslot)
{
if (cnetz->sched_dsp_mode_ts < 0 && mode == cnetz->dsp_mode) {
- PDEBUG_CHAN(DDSP, DEBUG_INFO, "Schedule DSP mode %s not required, we are already in that mode\n", cnetz_dsp_mode_name(mode));
+ LOGP_CHAN(DDSP, LOGL_INFO, "Schedule DSP mode %s not required, we are already in that mode\n", cnetz_dsp_mode_name(mode));
return;
}
- PDEBUG_CHAN(DDSP, DEBUG_INFO, "Schedule DSP mode %s -> %s at timeslot %d\n", cnetz_dsp_mode_name(cnetz->dsp_mode), cnetz_dsp_mode_name(mode), timeslot);
+ LOGP_CHAN(DDSP, LOGL_INFO, "Schedule DSP mode %s -> %s at timeslot %d\n", cnetz_dsp_mode_name(cnetz->dsp_mode), cnetz_dsp_mode_name(mode), timeslot);
cnetz->sched_dsp_mode = mode;
cnetz->sched_dsp_mode_ts = timeslot;
}
+/* Receive audio from call instance. */
+void call_down_audio(void *decoder, void *decoder_priv, int callref, uint16_t sequence, uint8_t marker, uint32_t timestamp, uint32_t ssrc, uint8_t *payload, int payload_len)
+{
+ sender_t *sender;
+ cnetz_t *cnetz;
+
+ for (sender = sender_head; sender; sender = sender->next) {
+ cnetz = (cnetz_t *) sender;
+ if (cnetz->trans_list && cnetz->trans_list->callref == callref)
+ break;
+ }
+ if (!sender)
+ return;
+
+ if (cnetz->dsp_mode == DSP_MODE_SPK_V) {
+ jitter_frame_t *jf;
+ jf = jitter_frame_alloc(decoder, decoder_priv, payload, payload_len, marker, sequence, timestamp, ssrc);
+ if (jf)
+ jitter_save(&cnetz->sender.dejitter, jf);
+ }
+}
+
+void call_down_clock(void) {}
+
diff --git a/src/cnetz/fsk_demod.c b/src/cnetz/fsk_demod.c
index a1acd70..9386b60 100644
--- a/src/cnetz/fsk_demod.c
+++ b/src/cnetz/fsk_demod.c
@@ -132,7 +132,7 @@ static int debug = 0;
#include <string.h>
#include <math.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "cnetz.h"
#include "dsp.h"
#include "telegramm.h"
@@ -143,7 +143,7 @@ int fsk_fm_init(fsk_fm_demod_t *fsk, cnetz_t *cnetz, int samplerate, double bitr
memset(fsk, 0, sizeof(*fsk));
if (samplerate < 48000) {
- PDEBUG(DDSP, DEBUG_ERROR, "Sample rate must be at least 48000 Hz!\n");
+ LOGP(DDSP, LOGL_ERROR, "Sample rate must be at least 48000 Hz!\n");
return -1;
}
@@ -152,13 +152,13 @@ int fsk_fm_init(fsk_fm_demod_t *fsk, cnetz_t *cnetz, int samplerate, double bitr
switch (demod) {
case FSK_DEMOD_SLOPE:
- PDEBUG(DDSP, DEBUG_INFO, "Detecting level change by looking at slope (good for sound cards)\n");
+ LOGP(DDSP, LOGL_INFO, "Detecting level change by looking at slope (good for sound cards)\n");
break;
case FSK_DEMOD_LEVEL:
- PDEBUG(DDSP, DEBUG_INFO, "Detecting level change by looking zero crosssing (good for SDR)\n");
+ LOGP(DDSP, LOGL_INFO, "Detecting level change by looking zero crosssing (good for SDR)\n");
break;
default:
- PDEBUG(DDSP, DEBUG_ERROR, "Wrong demod type, please fix!\n");
+ LOGP(DDSP, LOGL_ERROR, "Wrong demod type, please fix!\n");
abort();
}
@@ -166,7 +166,7 @@ int fsk_fm_init(fsk_fm_demod_t *fsk, cnetz_t *cnetz, int samplerate, double bitr
half = (int)((double)samplerate / bitrate / 2.0 + 0.5);
fsk->bit_buffer_spl = calloc(sizeof(fsk->bit_buffer_spl[0]), len);
if (!fsk->bit_buffer_spl) {
- PDEBUG(DDSP, DEBUG_ERROR, "No mem!\n");
+ LOGP(DDSP, LOGL_ERROR, "No mem!\n");
goto error;
}
@@ -177,7 +177,7 @@ int fsk_fm_init(fsk_fm_demod_t *fsk, cnetz_t *cnetz, int samplerate, double bitr
fsk->speech_size = samplerate * 60 / bitrate + 10; /* 60 bits duration, add 10 to be safe */
fsk->speech_buffer = calloc(sizeof(fsk->speech_buffer[0]), fsk->speech_size);
if (!fsk->speech_buffer) {
- PDEBUG(DDSP, DEBUG_ERROR, "No mem!\n");
+ LOGP(DDSP, LOGL_ERROR, "No mem!\n");
goto error;
}
diff --git a/src/cnetz/main.c b/src/cnetz/main.c
index 27c2a02..f3b58c7 100644
--- a/src/cnetz/main.c
+++ b/src/cnetz/main.c
@@ -24,7 +24,7 @@
#include <errno.h>
#include "../libsample/sample.h"
#include "../libmobile/main_mobile.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../libmobile/call.h"
#include "../anetz/freiton.h"
#include "../anetz/besetztton.h"
@@ -122,8 +122,10 @@ void print_help(const char *arg0)
printf(" Enable queue support. If no channel is available, calls will be kept\n");
printf(" in a queue for maximum of 60 seconds. (default = %d)\n", warteschlange);
printf(" -G --gebuehren <seconds> | 0\n");
- printf(" Increment metering counter every given number of seconds.\n");
+ printf(" Increment metering counter every given number of seconds.\n");
printf(" To turn off, use 0. (default = %d)\n", metering);
+ printf(" If metering pulses are sent via Osmo-CC interface, pulses are always\n");
+ printf(" increment metering counter. This overrides this option.\n");
printf(" -V --voice-deviation <2400..4000 Hz>\n");
printf(" It is unclear what the actual voice deviation is. Please increase, if\n");
printf(" mobile's earpiece is too quiet and the microphone is too loud.\n");
@@ -700,6 +702,7 @@ fail:
cnetz_destroy(sender_head);
/* exits */
+ main_mobile_exit();
fm_exit();
options_free();
diff --git a/src/cnetz/telegramm.c b/src/cnetz/telegramm.c
index 82a6cd8..0525f8a 100644
--- a/src/cnetz/telegramm.c
+++ b/src/cnetz/telegramm.c
@@ -27,7 +27,7 @@
#include <errno.h>
#include <math.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "cnetz.h"
#include "dsp.h"
#include "sysinfo.h"
@@ -510,13 +510,13 @@ static int encode_dialstring(uint64_t *value, const char *number)
max = strlen(number);
if (max > 16) {
- PDEBUG(DFRAME, DEBUG_NOTICE, "Given number '%s' has more than 16 digits\n", number);
+ LOGP(DFRAME, LOGL_NOTICE, "Given number '%s' has more than 16 digits\n", number);
return -EINVAL;
}
if (max == 16) {
if (number[0] != '0') {
- PDEBUG(DFRAME, DEBUG_NOTICE, "Given 16 digit number '%s' does not start with '0'\n", number);
+ LOGP(DFRAME, LOGL_NOTICE, "Given 16 digit number '%s' does not start with '0'\n", number);
return -EINVAL;
}
*value = 0;
@@ -575,7 +575,7 @@ int match_fuz(telegramm_t *telegramm)
if (telegramm->fuz_nationalitaet != si.fuz_nat
|| telegramm->fuz_fuvst_nr != si.fuz_fuvst
|| telegramm->fuz_rest_nr != si.fuz_rest) {
- PDEBUG(DFRAME, DEBUG_NOTICE, "Ignoring message from mobile phone %d,%d,%d: Cell 'Funkzelle' does not match!\n", telegramm->futln_nationalitaet, telegramm->futln_heimat_fuvst_nr, telegramm->futln_rest_nr);
+ LOGP(DFRAME, LOGL_NOTICE, "Ignoring message from mobile phone %d,%d,%d: Cell 'Funkzelle' does not match!\n", telegramm->futln_nationalitaet, telegramm->futln_heimat_fuvst_nr, telegramm->futln_rest_nr);
return 0;
}
@@ -587,7 +587,7 @@ int match_futln(telegramm_t *telegramm, uint8_t futln_nat, uint8_t futln_fuvst,
if (telegramm->futln_nationalitaet != futln_nat
|| telegramm->futln_heimat_fuvst_nr != futln_fuvst
|| telegramm->futln_rest_nr != futln_rest) {
- PDEBUG(DFRAME, DEBUG_NOTICE, "Ignoring message from mobile phone %d,%d,%d: Mobile station 'Funktelefongeraet' does not match!\n", telegramm->futln_nationalitaet, telegramm->futln_heimat_fuvst_nr, telegramm->futln_rest_nr);
+ LOGP(DFRAME, LOGL_NOTICE, "Ignoring message from mobile phone %d,%d,%d: Mobile station 'Funktelefongeraet' does not match!\n", telegramm->futln_nationalitaet, telegramm->futln_heimat_fuvst_nr, telegramm->futln_rest_nr);
return 0;
}
@@ -600,19 +600,19 @@ static void debug_parameter(char digit, uint64_t value)
parameter = get_parameter(digit);
if (!parameter) {
- PDEBUG(DFRAME, DEBUG_ERROR, "Digit '%c' not found in definition_parameter list, please fix!\n", digit);
+ LOGP(DFRAME, LOGL_ERROR, "Digit '%c' not found in definition_parameter list, please fix!\n", digit);
abort();
}
if (parameter->value_names)
- PDEBUG(DFRAME, DEBUG_DEBUG, " (%c) %s : %s\n", digit, parameter->param_name, parameter->value_names[value]);
+ LOGP(DFRAME, LOGL_DEBUG, " (%c) %s : %s\n", digit, parameter->param_name, parameter->value_names[value]);
else if (parameter->bits == 64)
- PDEBUG(DFRAME, DEBUG_DEBUG, " (%c) %s : 0x%016" PRIx64 "\n", digit, parameter->param_name, value);
+ LOGP(DFRAME, LOGL_DEBUG, " (%c) %s : 0x%016" PRIx64 "\n", digit, parameter->param_name, value);
else if (digit == 'X') {
char wahlziffern[17];
decode_dialstring(wahlziffern, value);
- PDEBUG(DFRAME, DEBUG_DEBUG, " (%c) %s : '%s'\n", digit, parameter->param_name, wahlziffern);
+ LOGP(DFRAME, LOGL_DEBUG, " (%c) %s : '%s'\n", digit, parameter->param_name, wahlziffern);
} else
- PDEBUG(DFRAME, DEBUG_DEBUG, " (%c) %s : %" PRIu64 "\n", digit, parameter->param_name, value);
+ LOGP(DFRAME, LOGL_DEBUG, " (%c) %s : %" PRIu64 "\n", digit, parameter->param_name, value);
}
/* encode telegram to 70 bits
@@ -628,12 +628,12 @@ static char *assemble_telegramm(const telegramm_t *telegramm, int debug)
int rc;
if (telegramm->opcode >= 64) {
- PDEBUG(DFRAME, DEBUG_ERROR, "Opcode '0x%x' exceeds bit range, please fix!\n", telegramm->opcode);
+ LOGP(DFRAME, LOGL_ERROR, "Opcode '0x%x' exceeds bit range, please fix!\n", telegramm->opcode);
abort();
}
if (debug)
- PDEBUG(DFRAME, DEBUG_INFO, "Coding %s %s\n", definition_opcode[telegramm->opcode].message_name, definition_opcode[telegramm->opcode].message_text);
+ LOGP(DFRAME, LOGL_INFO, "Coding %s %s\n", definition_opcode[telegramm->opcode].message_name, definition_opcode[telegramm->opcode].message_text);
/* copy opcode */
for (i = 0; i < 6; i++)
@@ -717,7 +717,7 @@ static char *assemble_telegramm(const telegramm_t *telegramm, int debug)
case 'X':
rc = encode_dialstring(&value, telegramm->wahlziffern);
if (rc < 0) {
- PDEBUG(DFRAME, DEBUG_ERROR, "Illegal dial string '%s', please fix!\n", telegramm->wahlziffern);
+ LOGP(DFRAME, LOGL_ERROR, "Illegal dial string '%s', please fix!\n", telegramm->wahlziffern);
abort();
}
break;
@@ -806,10 +806,10 @@ static char *assemble_telegramm(const telegramm_t *telegramm, int debug)
value = telegramm->illegaler_opcode;
break;
default:
- PDEBUG(DFRAME, DEBUG_ERROR, "Parameter '%c' does not exist, please fix!\n", parameter);
+ LOGP(DFRAME, LOGL_ERROR, "Parameter '%c' does not exist, please fix!\n", parameter);
abort();
}
- if (debug && debuglevel <= DEBUG_DEBUG)
+ if (debug && loglevel <= LOGL_DEBUG)
debug_parameter(parameter, value);
val = value;
for (j = 0; string[63 - i - j] == parameter; j++) {
@@ -817,14 +817,14 @@ static char *assemble_telegramm(const telegramm_t *telegramm, int debug)
val >>= 1;
}
if (val)
- PDEBUG(DFRAME, DEBUG_ERROR, "Parameter '%c' value '0x%" PRIx64 "' exceeds bit range!\n", parameter, value);
+ LOGP(DFRAME, LOGL_ERROR, "Parameter '%c' value '0x%" PRIx64 "' exceeds bit range!\n", parameter, value);
i += j - 1;
}
bits[70] = '\0';
if (debug) {
- PDEBUG(DFRAME, DEBUG_DEBUG, "OOOOOO%s\n", string);
- PDEBUG(DFRAME, DEBUG_DEBUG, "%s\n", bits);
+ LOGP(DFRAME, LOGL_DEBUG, "OOOOOO%s\n", string);
+ LOGP(DFRAME, LOGL_DEBUG, "%s\n", bits);
}
return bits;
@@ -848,7 +848,7 @@ static void disassemble_telegramm(telegramm_t *telegramm, const char *bits, int
value = (value << 1) | (bits[i] == '1');
telegramm->opcode = value;
- PDEBUG(DFRAME, DEBUG_INFO, "Decoding %s %s\n", definition_opcode[telegramm->opcode].message_name, definition_opcode[telegramm->opcode].message_text);
+ LOGP(DFRAME, LOGL_INFO, "Decoding %s %s\n", definition_opcode[telegramm->opcode].message_name, definition_opcode[telegramm->opcode].message_text);
/* copy parameters */
if (auth && bits[1]) /* auth flag and chip card flag */
@@ -864,7 +864,7 @@ static void disassemble_telegramm(telegramm_t *telegramm, const char *bits, int
value = (value >> 1) | ((uint64_t)(bits[69 - i - j] == '1') << 63);
value >>= 64 - j;
i += j - 1;
- if (debuglevel <= DEBUG_DEBUG)
+ if (loglevel <= LOGL_DEBUG)
debug_parameter(parameter, value);
switch (parameter) {
case 'A':
@@ -1021,18 +1021,18 @@ static void disassemble_telegramm(telegramm_t *telegramm, const char *bits, int
telegramm->illegaler_opcode = value;
break;
default:
- PDEBUG(DFRAME, DEBUG_ERROR, "Parameter '%c' does not exist, please fix!\n", parameter);
+ LOGP(DFRAME, LOGL_ERROR, "Parameter '%c' does not exist, please fix!\n", parameter);
abort();
}
}
- if (debuglevel <= DEBUG_DEBUG) {
+ if (loglevel <= LOGL_DEBUG) {
char debug_bits[71];
memcpy(debug_bits, bits, 70);
debug_bits[70] = '\0';
- PDEBUG(DFRAME, DEBUG_DEBUG, "OOOOOO%s\n", string);
- PDEBUG(DFRAME, DEBUG_DEBUG, "%s\n", debug_bits);
+ LOGP(DFRAME, LOGL_DEBUG, "OOOOOO%s\n", string);
+ LOGP(DFRAME, LOGL_DEBUG, "%s\n", debug_bits);
}
}
@@ -1392,11 +1392,11 @@ static const char *decode(const char *input, int *_bit_errors)
fail_str[10] = '\0';
if (failed)
- PDEBUG(DFRAME, DEBUG_DEBUG, "Received Telegram with these block errors: '%s' (X = uncorrectable)\n", fail_str);
+ LOGP(DFRAME, LOGL_DEBUG, "Received Telegram with these block errors: '%s' (X = uncorrectable)\n", fail_str);
else if (warn)
- PDEBUG(DFRAME, DEBUG_DEBUG, "Received Telegram with these block errors: '%s' (1 / 2 = correctable)\n", fail_str);
+ LOGP(DFRAME, LOGL_DEBUG, "Received Telegram with these block errors: '%s' (1 / 2 = correctable)\n", fail_str);
else
- PDEBUG(DFRAME, DEBUG_DEBUG, "Received Telegram with no block errors.\n");
+ LOGP(DFRAME, LOGL_DEBUG, "Received Telegram with no block errors.\n");
if (failed)
return NULL;
@@ -1496,13 +1496,13 @@ void cnetz_decode_telegramm(cnetz_t *cnetz, const char *bits, double level, doub
break;
}
if (i == 70) {
- PDEBUG(DFRAME, DEBUG_INFO, "Ignoring mysterious unmodulated telegramm (noise from phone's transmitter)\n");
+ LOGP(DFRAME, LOGL_INFO, "Ignoring mysterious unmodulated telegramm (noise from phone's transmitter)\n");
return;
}
- PDEBUG_CHAN(DDSP, DEBUG_INFO, "RF level: %.1f dB RX Level: %.0f%% Standard deviation: %.0f%% Sync Time: %.2f (TS %.2f) %s\n", cnetz->rf_level_db, fabs(level) / cnetz->fsk_deviation * 100.0, stddev / fabs(level) * 100.0, sync_time, sync_time / 396.0, (level < 0) ? "NEGATIVE (phone's mode)" : "POSITIVE (base station's mode)");
+ LOGP_CHAN(DDSP, LOGL_INFO, "RF level: %.1f dB RX Level: %.0f%% Standard deviation: %.0f%% Sync Time: %.2f (TS %.2f) %s\n", cnetz->rf_level_db, fabs(level) / cnetz->fsk_deviation * 100.0, stddev / fabs(level) * 100.0, sync_time, sync_time / 396.0, (level < 0) ? "NEGATIVE (phone's mode)" : "POSITIVE (base station's mode)");
if (bit_errors)
- PDEBUG_CHAN(DDSP, DEBUG_INFO, " -> Frame has %d bit errors.\n", bit_errors);
+ LOGP_CHAN(DDSP, LOGL_INFO, " -> Frame has %d bit errors.\n", bit_errors);
disassemble_telegramm(&telegramm, bits, si.authentifikationsbit);
opcode = telegramm.opcode;
@@ -1510,18 +1510,18 @@ void cnetz_decode_telegramm(cnetz_t *cnetz, const char *bits, double level, doub
telegramm.sync_time = sync_time;
if (cnetz->sender.loopback) {
- PDEBUG(DFRAME, DEBUG_NOTICE, "Received Telegramm in loopback test mode (opcode %d = %s)\n", opcode, definition_opcode[opcode].message_name);
+ LOGP(DFRAME, LOGL_NOTICE, "Received Telegramm in loopback test mode (opcode %d = %s)\n", opcode, definition_opcode[opcode].message_name);
cnetz_sync_frame(cnetz, sync_time, -1);
return;
}
if (opcode >= 32) {
- PDEBUG(DFRAME, DEBUG_NOTICE, "Received Telegramm that is not used by mobile station, ignoring! (opcode %d = %s)\n", opcode, definition_opcode[opcode].message_name);
+ LOGP(DFRAME, LOGL_NOTICE, "Received Telegramm that is not used by mobile station, ignoring! (opcode %d = %s)\n", opcode, definition_opcode[opcode].message_name);
return;
}
if (definition_opcode[opcode].block == BLOCK_I) {
- PDEBUG(DFRAME, DEBUG_NOTICE, "Received Telegramm that is an illegal opcode, ignoring! (opcode %d = %s)\n", opcode, definition_opcode[opcode].message_name);
+ LOGP(DFRAME, LOGL_NOTICE, "Received Telegramm that is an illegal opcode, ignoring! (opcode %d = %s)\n", opcode, definition_opcode[opcode].message_name);
return;
}
@@ -1544,7 +1544,7 @@ void cnetz_decode_telegramm(cnetz_t *cnetz, const char *bits, double level, doub
switch (cnetz->dsp_mode) {
case DSP_MODE_OGK:
if (definition_opcode[opcode].block != BLOCK_R && definition_opcode[opcode].block != BLOCK_M) {
- PDEBUG(DFRAME, DEBUG_NOTICE, "Received Telegramm that is not used OgK channel signaling, ignoring! (opcode %d = %s)\n", opcode, definition_opcode[opcode].message_name);
+ LOGP(DFRAME, LOGL_NOTICE, "Received Telegramm that is not used OgK channel signaling, ignoring! (opcode %d = %s)\n", opcode, definition_opcode[opcode].message_name);
return;
}
/* determine block by last timeslot sent and by message type
@@ -1557,14 +1557,14 @@ void cnetz_decode_telegramm(cnetz_t *cnetz, const char *bits, double level, doub
break;
case DSP_MODE_SPK_K:
if (definition_opcode[opcode].block != BLOCK_K) {
- PDEBUG(DFRAME, DEBUG_NOTICE, "Received Telegramm that is not used for concentrated signaling, ignoring! (opcode %d = %s)\n", opcode, definition_opcode[opcode].message_name);
+ LOGP(DFRAME, LOGL_NOTICE, "Received Telegramm that is not used for concentrated signaling, ignoring! (opcode %d = %s)\n", opcode, definition_opcode[opcode].message_name);
return;
}
cnetz_receive_telegramm_spk_k(cnetz, &telegramm);
break;
case DSP_MODE_SPK_V:
if (definition_opcode[opcode].block != BLOCK_V) {
- PDEBUG(DFRAME, DEBUG_NOTICE, "Received Telegramm that is not used for distributed signaling, ignoring! (opcode %d = %s)\n", opcode, definition_opcode[opcode].message_name);
+ LOGP(DFRAME, LOGL_NOTICE, "Received Telegramm that is not used for distributed signaling, ignoring! (opcode %d = %s)\n", opcode, definition_opcode[opcode].message_name);
return;
}
cnetz_receive_telegramm_spk_v(cnetz, &telegramm);
@@ -1622,7 +1622,7 @@ const char *cnetz_encode_telegramm(cnetz_t *cnetz)
cnetz->sched_lr_debugged = 1;
if (opcode == OPCODE_MLR_M && !cnetz->sched_mlr_debugged) {
cnetz->sched_mlr_debugged = 1;
- PDEBUG(DFRAME, DEBUG_INFO, "Subsequent IDLE frames are not show, to prevent flooding the output.\n");
+ LOGP(DFRAME, LOGL_INFO, "Subsequent IDLE frames are not show, to prevent flooding the output.\n");
}
return bits;
diff --git a/src/cnetz/transaction.c b/src/cnetz/transaction.c
index b0a4989..f89718b 100644
--- a/src/cnetz/transaction.c
+++ b/src/cnetz/transaction.c
@@ -22,7 +22,7 @@
#include <stdlib.h>
#include <math.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../libmobile/call.h"
#include "../libmobile/cause.h"
#include "cnetz.h"
@@ -54,7 +54,7 @@ transaction_t *create_transaction(cnetz_t *cnetz, uint64_t state, uint8_t futln_
if ((trans->state & state & (TRANS_EM | TRANS_UM | TRANS_VWG | TRANS_ATQ_IDLE))) {
if (!isnan(trans->rf_level_db) && !isnan(rf_level_db) && trans->cnetz->kanal != cnetz->kanal) {
if (rf_level_db > trans->rf_level_db) {
- PDEBUG(DTRANS, DEBUG_NOTICE, "Found already pending transaction for subscriber '%s' on channel #%d, but this message on channel #%d is stronger, so we move to that channel!\n", rufnummer, trans->cnetz->kanal, cnetz->kanal);
+ LOGP(DTRANS, LOGL_NOTICE, "Found already pending transaction for subscriber '%s' on channel #%d, but this message on channel #%d is stronger, so we move to that channel!\n", rufnummer, trans->cnetz->kanal, cnetz->kanal);
trans->rf_level_db = rf_level_db;
unlink_transaction(trans);
link_transaction(trans, cnetz);
@@ -62,14 +62,14 @@ transaction_t *create_transaction(cnetz_t *cnetz, uint64_t state, uint8_t futln_
return trans;
}
if (rf_level_db < trans->rf_level_db) {
- PDEBUG(DTRANS, DEBUG_NOTICE, "Found already pending transaction for subscriber '%s' on channel #%d, but this message on channel #%d is weaker, so we ignore that channel!\n", rufnummer, trans->cnetz->kanal, cnetz->kanal);
+ LOGP(DTRANS, LOGL_NOTICE, "Found already pending transaction for subscriber '%s' on channel #%d, but this message on channel #%d is weaker, so we ignore that channel!\n", rufnummer, trans->cnetz->kanal, cnetz->kanal);
return trans;
}
}
- PDEBUG(DTRANS, DEBUG_NOTICE, "Found already pending transaction for subscriber '%s' on channel #%d, but this message on channel #%d is also received. Try to avoid multiple OgK channels!\n", rufnummer, trans->cnetz->kanal, cnetz->kanal);
+ LOGP(DTRANS, LOGL_NOTICE, "Found already pending transaction for subscriber '%s' on channel #%d, but this message on channel #%d is also received. Try to avoid multiple OgK channels!\n", rufnummer, trans->cnetz->kanal, cnetz->kanal);
return trans;
}
- PDEBUG(DTRANS, DEBUG_NOTICE, "Found already pending transaction for subscriber '%s', deleting!\n", rufnummer);
+ LOGP(DTRANS, LOGL_NOTICE, "Found already pending transaction for subscriber '%s', deleting!\n", rufnummer);
destroy_transaction(trans);
if (old_cnetz) /* should be... */
cnetz_go_idle(old_cnetz);
@@ -79,11 +79,11 @@ transaction_t *create_transaction(cnetz_t *cnetz, uint64_t state, uint8_t futln_
trans = calloc(1, sizeof(*trans));
if (!trans) {
- PDEBUG(DTRANS, DEBUG_ERROR, "No memory!\n");
+ LOGP(DTRANS, LOGL_ERROR, "No memory!\n");
return NULL;
}
- timer_init(&trans->timer, transaction_timeout, trans);
+ osmo_timer_setup(&trans->timer, transaction_timeout, trans);
trans_new_state(trans, state);
trans->futln_nat = futln_nat;
@@ -96,7 +96,7 @@ transaction_t *create_transaction(cnetz_t *cnetz, uint64_t state, uint8_t futln_
trans->mt_call = 1;
const char *rufnummer = transaction2rufnummer(trans);
- PDEBUG(DTRANS, DEBUG_INFO, "Created transaction for subscriber '%s'\n", rufnummer);
+ LOGP(DTRANS, LOGL_INFO, "Created transaction for subscriber '%s'\n", rufnummer);
link_transaction(trans, cnetz);
@@ -119,9 +119,9 @@ void destroy_transaction(transaction_t *trans)
unlink_transaction(trans);
const char *rufnummer = transaction2rufnummer(trans);
- PDEBUG(DTRANS, DEBUG_INFO, "Destroying transaction for subscriber '%s'\n", rufnummer);
+ LOGP(DTRANS, LOGL_INFO, "Destroying transaction for subscriber '%s'\n", rufnummer);
- timer_exit(&trans->timer);
+ osmo_timer_del(&trans->timer);
trans_new_state(trans, 0);
@@ -134,7 +134,7 @@ void link_transaction(transaction_t *trans, cnetz_t *cnetz)
transaction_t **transp;
/* attach to end of list, so first transaction is served first */
- PDEBUG(DTRANS, DEBUG_DEBUG, "Linking transaction %p to cnetz %p\n", trans, cnetz);
+ LOGP(DTRANS, LOGL_DEBUG, "Linking transaction %p to cnetz %p\n", trans, cnetz);
trans->cnetz = cnetz;
trans->next = NULL;
transp = &cnetz->trans_list;
@@ -150,12 +150,12 @@ void unlink_transaction(transaction_t *trans)
transaction_t **transp;
/* unlink */
- PDEBUG(DTRANS, DEBUG_DEBUG, "Unlinking transaction %p from cnetz %p\n", trans, trans->cnetz);
+ LOGP(DTRANS, LOGL_DEBUG, "Unlinking transaction %p from cnetz %p\n", trans, trans->cnetz);
transp = &trans->cnetz->trans_list;
while (*transp && *transp != trans)
transp = &((*transp)->next);
if (!(*transp)) {
- PDEBUG(DTRANS, DEBUG_ERROR, "Transaction not in list, please fix!!\n");
+ LOGP(DTRANS, LOGL_ERROR, "Transaction not in list, please fix!!\n");
abort();
}
*transp = trans->next;
@@ -170,7 +170,7 @@ transaction_t *search_transaction(cnetz_t *cnetz, uint64_t state_mask)
while (trans) {
if ((trans->state & state_mask)) {
const char *rufnummer = transaction2rufnummer(trans);
- PDEBUG(DTRANS, DEBUG_DEBUG, "Found transaction for subscriber '%s'\n", rufnummer);
+ LOGP(DTRANS, LOGL_DEBUG, "Found transaction for subscriber '%s'\n", rufnummer);
return trans;
}
trans = trans->next;
@@ -188,7 +188,7 @@ transaction_t *search_transaction_number(cnetz_t *cnetz, uint8_t futln_nat, uint
&& trans->futln_fuvst == futln_fuvst
&& trans->futln_rest == futln_rest) {
const char *rufnummer = transaction2rufnummer(trans);
- PDEBUG(DTRANS, DEBUG_DEBUG, "Found transaction for subscriber '%s'\n", rufnummer);
+ LOGP(DTRANS, LOGL_DEBUG, "Found transaction for subscriber '%s'\n", rufnummer);
return trans;
}
trans = trans->next;
@@ -224,7 +224,7 @@ transaction_t *search_transaction_callref(cnetz_t *cnetz, int callref)
while (trans) {
if (trans->callref == callref) {
const char *rufnummer = transaction2rufnummer(trans);
- PDEBUG(DTRANS, DEBUG_DEBUG, "Found transaction for subscriber '%s'\n", rufnummer);
+ LOGP(DTRANS, LOGL_DEBUG, "Found transaction for subscriber '%s'\n", rufnummer);
return trans;
}
trans = trans->next;
@@ -262,7 +262,7 @@ transaction_t *search_transaction_queue(void)
if (found) {
const char *rufnummer = transaction2rufnummer(found);
- PDEBUG(DTRANS, DEBUG_DEBUG, "Found oldest transaction in queue for subscriber '%s'\n", rufnummer);
+ LOGP(DTRANS, LOGL_DEBUG, "Found oldest transaction in queue for subscriber '%s'\n", rufnummer);
return found;
}
@@ -386,7 +386,7 @@ const char *trans_short_state_name(uint64_t state)
void trans_new_state(transaction_t *trans, uint64_t state)
{
- PDEBUG(DTRANS, DEBUG_INFO, "Transaction (%s) state %s -> %s\n", transaction2rufnummer(trans), trans_state_name(trans->state), trans_state_name(state));
+ LOGP(DTRANS, LOGL_INFO, "Transaction (%s) state %s -> %s\n", transaction2rufnummer(trans), trans_state_name(trans->state), trans_state_name(state));
trans->state = state;
/* in case of a queue, set new positon */
if (!trans->queue_position && (state == TRANS_MO_QUEUE || state == TRANS_MT_QUEUE))
@@ -398,12 +398,12 @@ void cnetz_flush_other_transactions(cnetz_t *cnetz, transaction_t *trans)
{
/* flush after this very trans */
while (trans->next) {
- PDEBUG(DTRANS, DEBUG_NOTICE, "Kicking other pending transaction\n");
+ LOGP(DTRANS, LOGL_NOTICE, "Kicking other pending transaction\n");
destroy_transaction(trans->next);
}
/* flush before this very trans */
while (cnetz->trans_list != trans) {
- PDEBUG(DTRANS, DEBUG_NOTICE, "Kicking other pending transaction\n");
+ LOGP(DTRANS, LOGL_NOTICE, "Kicking other pending transaction\n");
destroy_transaction(cnetz->trans_list);
}
}
diff --git a/src/cnetz/transaction.h b/src/cnetz/transaction.h
index 0c1e86c..4a5d70b 100644
--- a/src/cnetz/transaction.h
+++ b/src/cnetz/transaction.h
@@ -50,11 +50,13 @@ typedef struct transaction {
int8_t release_cause; /* reason for release, (c-netz coding) */
int try; /* counts resending messages */
int repeat; /* counts repeating messages */
- struct timer timer; /* for varous timeouts */
+ struct osmo_timer_list timer; /* for varous timeouts */
int mo_call; /* flags a moile originating call */
int mt_call; /* flags a moile terminating call */
int page_failed; /* failed to get a response from MS */
- double call_start; /* when did the call start? (used for metering) */
+ double metering_time; /* time between units (0.0 if no metering set) */
+ double meter_start; /* when did the metering start? (0.0 if not yet started) */
+ double meter_end; /* when did the metering end? (0.0 if not yet ended) */
int queue_position; /* to find next transaction in queue */
double rf_level_db; /* level of first contact, so we can detect correct channel at multiple receptions */
} transaction_t;
@@ -71,6 +73,6 @@ transaction_t *search_transaction_callref(cnetz_t *cnetz, int callref);
transaction_t *search_transaction_queue(void);
void trans_new_state(transaction_t *trans, uint64_t state);
void cnetz_flush_other_transactions(cnetz_t *cnetz, transaction_t *trans);
-void transaction_timeout(struct timer *timer);
+void transaction_timeout(void *data);
const char *trans_short_state_name(uint64_t state);
diff --git a/src/datenklo/Makefile.am b/src/datenklo/Makefile.am
index 0676d23..10dd617 100644
--- a/src/datenklo/Makefile.am
+++ b/src/datenklo/Makefile.am
@@ -1,4 +1,5 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes) $(FUSE_CFLAGS)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes) \
+ $(FUSE_CFLAGS)
bin_PROGRAMS = \
datenklo
@@ -12,15 +13,15 @@ datenklo_SOURCES = \
datenklo_LDADD = \
$(COMMON_LA) \
$(top_builddir)/src/liboptions/liboptions.a \
- $(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libfsk/libfsk.a \
- $(top_builddir)/src/libtimer/libtimer.a \
$(top_builddir)/src/libfm/libfm.a \
$(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/libsound/libsound.a \
$(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libdisplay/libdisplay.a \
$(top_builddir)/src/libsample/libsample.a \
+ $(top_builddir)/src/liblogging/liblogging.a \
+ $(LIBOSMOCORE_LIBS) \
$(ALSA_LIBS) \
$(FUSE_LIBS) \
-lm
diff --git a/src/datenklo/am791x.c b/src/datenklo/am791x.c
index b3164af..103db51 100644
--- a/src/datenklo/am791x.c
+++ b/src/datenklo/am791x.c
@@ -75,12 +75,14 @@
#include <string.h>
#include <errno.h>
#include <math.h>
-#include "../libdebug/debug.h"
-#include "../libtimer/timer.h"
+#include "../liblogging/logging.h"
+#include <osmocom/core/timer.h>
#include "../libsample/sample.h"
#include "../libfsk/fsk.h"
#include "am791x.h"
+#define FLOAT_TO_TIMEOUT(f) floor(f), ((f) - floor(f)) * 1000000
+
#define db2level(db) pow(10, (double)(db) / 20.0)
#define level2db(level) (20 * log10(level))
@@ -298,13 +300,13 @@ void am791x_list_mc(enum am791x_type type)
}
/* init STO signal */
-void init_sto(am791x_t *am791x)
+static void init_sto(am791x_t *am791x)
{
am791x->sto_phaseshift65536 = 900 / (double)am791x->samplerate * 65536.0;
}
/* transmit STO signal, use phase from FSK modulator, to avoid phase jumps */
-int send_sto(am791x_t *am791x, sample_t *sample, int length)
+static int send_sto(am791x_t *am791x, sample_t *sample, int length)
{
fsk_mod_t *fsk = &am791x->fsk_tx;
int count = 0;
@@ -373,19 +375,19 @@ static int fsk_send_bit(void *inst)
/* main channel returns TD */
if (!am791x->block_td) {
#ifdef HEAVY_DEBUG
- PDEBUG(DDSP, DEBUG_DEBUG, "Modulating bit '%d' for MAIN channel\n", bit);
+ LOGP(DDSP, LOGL_DEBUG, "Modulating bit '%d' for MAIN channel\n", bit);
#endif
return bit;
}
/* back channel returns BTD */
if (!am791x->block_btd) {
#ifdef HEAVY_DEBUG
- PDEBUG(DDSP, DEBUG_DEBUG, "Modulating bit '%d' for BACK channel\n", bbit);
+ LOGP(DDSP, LOGL_DEBUG, "Modulating bit '%d' for BACK channel\n", bbit);
#endif
return bbit;
}
#ifdef HEAVY_DEBUG
- PDEBUG(DDSP, DEBUG_DEBUG, "Modulating bit '1', because TD & BTD is ignored\n");
+ LOGP(DDSP, LOGL_DEBUG, "Modulating bit '1', because TD & BTD is ignored\n");
#endif
return 1;
}
@@ -399,7 +401,7 @@ static void fsk_receive_bit(void *inst, int bit, double quality, double level)
int *block, *cd;
#ifdef HEAVY_DEBUG
- PDEBUG(DDSP, DEBUG_DEBUG, "Demodulated bit '%d' (level = %.0f dBm, quality = %%%.0f)\n", bit, level2db(level), quality * 100.0);
+ LOGP(DDSP, LOGL_DEBUG, "Demodulated bit '%d' (level = %.0f dBm, quality = %%%.0f)\n", bit, level2db(level), quality * 100.0);
#endif
if (!am791x->rx_back_channel) {
@@ -416,12 +418,12 @@ static void fsk_receive_bit(void *inst, int bit, double quality, double level)
handle_rx_state(am791x);
} else
if (!(*block) && !(*cd) && level > am791x->cd_on && quality >= RX_QUALITY) {
- PDEBUG(DDSP, DEBUG_DEBUG, "Good quality (level = %.0f dBm, quality = %%%.0f)\n", level2db(level), quality * 100.0);
+ LOGP(DDSP, LOGL_DEBUG, "Good quality (level = %.0f dBm, quality = %%%.0f)\n", level2db(level), quality * 100.0);
*cd = 1;
handle_rx_state(am791x);
} else
if (*cd && (level < am791x->cd_off || quality < RX_QUALITY)) {
- PDEBUG(DDSP, DEBUG_DEBUG, "Bad quality (level = %.0f dBm, quality = %%%.0f)\n", level2db(level), quality * 100.0);
+ LOGP(DDSP, LOGL_DEBUG, "Bad quality (level = %.0f dBm, quality = %%%.0f)\n", level2db(level), quality * 100.0);
*cd = 0;
handle_rx_state(am791x);
}
@@ -437,24 +439,24 @@ static void fsk_receive_bit(void *inst, int bit, double quality, double level)
/* main channel forwards bit to RD */
if (!am791x->block_rd) {
#ifdef HEAVY_DEBUG
- PDEBUG(DDSP, DEBUG_DEBUG, " -> Forwarding bit '%d' to MAIN channel\n", bit);
+ LOGP(DDSP, LOGL_DEBUG, " -> Forwarding bit '%d' to MAIN channel\n", bit);
#endif
am791x->rd_cb(am791x->inst, bit, quality * 100.0, level2db(level));
} else {
#ifdef HEAVY_DEBUG
- PDEBUG(DDSP, DEBUG_DEBUG, " -> Forwarding bit '1' to MAIN channel, because RD is set to MARK\n");
+ LOGP(DDSP, LOGL_DEBUG, " -> Forwarding bit '1' to MAIN channel, because RD is set to MARK\n");
#endif
am791x->rd_cb(am791x->inst, 1, NAN, NAN);
}
/* main channel forwards bit to RD */
if (!am791x->block_brd) {
#ifdef HEAVY_DEBUG
- PDEBUG(DDSP, DEBUG_DEBUG, " -> Forwarding bit '%d' to BACK channel\n", bit);
+ LOGP(DDSP, LOGL_DEBUG, " -> Forwarding bit '%d' to BACK channel\n", bit);
#endif
am791x->brd_cb(am791x->inst, bit, quality * 100.0, level2db(level));
} else {
#ifdef HEAVY_DEBUG
- PDEBUG(DDSP, DEBUG_DEBUG, " -> Forwarding bit '1' to BACK channel, because BRD is set to MARK\n");
+ LOGP(DDSP, LOGL_DEBUG, " -> Forwarding bit '1' to BACK channel, because BRD is set to MARK\n");
#endif
am791x->brd_cb(am791x->inst, 1, NAN, NAN);
}
@@ -529,9 +531,9 @@ static void set_filters(am791x_t *am791x)
/* transmitter used */
if (f0_tx > 0 && am791x->f0_tx == 0) {
- PDEBUG(DDSP, DEBUG_DEBUG, "Setting modulator to %s channel's frequencies (F0 = %d, F1 = %d), baudrate %.0f\n", name_tx, f0_tx, f1_tx, am791x->tx_baud);
+ LOGP(DDSP, LOGL_DEBUG, "Setting modulator to %s channel's frequencies (F0 = %d, F1 = %d), baudrate %.0f\n", name_tx, f0_tx, f1_tx, am791x->tx_baud);
if (fsk_mod_init(&am791x->fsk_tx, am791x, fsk_send_bit, am791x->samplerate, am791x->tx_baud, (double)f0_tx, (double)f1_tx, am791x->tx_level, 0, 1) < 0)
- PDEBUG(DDSP, DEBUG_ERROR, "FSK RX init failed!\n");
+ LOGP(DDSP, LOGL_ERROR, "FSK RX init failed!\n");
else {
am791x->f0_tx = f0_tx;
am791x->f1_tx = f1_tx;
@@ -548,9 +550,9 @@ static void set_filters(am791x_t *am791x)
/* receiver used */
if (f0_rx > 0 && am791x->f0_rx == 0) {
- PDEBUG(DDSP, DEBUG_DEBUG, "Setting demodulator to %s channel's frequencies (F0 = %d, F1 = %d), baudrate %.0f\n", name_rx, f0_rx, f1_rx, am791x->rx_baud);
+ LOGP(DDSP, LOGL_DEBUG, "Setting demodulator to %s channel's frequencies (F0 = %d, F1 = %d), baudrate %.0f\n", name_rx, f0_rx, f1_rx, am791x->rx_baud);
if (fsk_demod_init(&am791x->fsk_rx, am791x, fsk_receive_bit, am791x->samplerate, am791x->rx_baud, (double)f0_rx, (double)f1_rx, BIT_ADJUST) < 0)
- PDEBUG(DDSP, DEBUG_ERROR, "FSK RX init failed!\n");
+ LOGP(DDSP, LOGL_ERROR, "FSK RX init failed!\n");
else {
am791x->f0_rx = f0_rx;
am791x->f1_rx = f1_rx;
@@ -562,14 +564,14 @@ static void set_filters(am791x_t *am791x)
static void new_tx_state(am791x_t *am791x, enum am791x_st state)
{
if (am791x->tx_state != state)
- PDEBUG(DAM791X, DEBUG_DEBUG, "Change TX state %s -> %s\n", am791x_state_names[am791x->tx_state], am791x_state_names[state]);
+ LOGP(DAM791X, LOGL_DEBUG, "Change TX state %s -> %s\n", am791x_state_names[am791x->tx_state], am791x_state_names[state]);
am791x->tx_state = state;
}
static void new_rx_state(am791x_t *am791x, enum am791x_st state)
{
if (am791x->rx_state != state)
- PDEBUG(DAM791X, DEBUG_DEBUG, "Change RX state %s -> %s\n", am791x_state_names[am791x->rx_state], am791x_state_names[state]);
+ LOGP(DAM791X, LOGL_DEBUG, "Change RX state %s -> %s\n", am791x_state_names[am791x->rx_state], am791x_state_names[state]);
am791x->rx_state = state;
}
@@ -577,7 +579,7 @@ static void new_rx_state(am791x_t *am791x, enum am791x_st state)
static void set_flag(int *flag_p, int value, const char *name)
{
if (*flag_p != value) {
- PDEBUG(DAM791X, DEBUG_DEBUG, " -> %s\n", name);
+ LOGP(DAM791X, LOGL_DEBUG, " -> %s\n", name);
*flag_p = value;
}
}
@@ -585,10 +587,9 @@ static void set_flag(int *flag_p, int value, const char *name)
/*
* state machine according to datasheet
*/
-
static void go_main_channel_tx(am791x_t *am791x)
{
- PDEBUG(DAM791X, DEBUG_DEBUG, "Enable transmitter on main channel\n");
+ LOGP(DAM791X, LOGL_DEBUG, "Enable transmitter on main channel\n");
/* only block RD, if not full duplex and not 4-wire (loopback mode) */
if (!am791x->fullduplex && !am791x->loopback_main) {
@@ -599,7 +600,8 @@ static void go_main_channel_tx(am791x_t *am791x)
/* activate TD now and set CTS timer (RCON) */
set_flag(&am791x->block_td, 0, "TD RELEASED");
set_flag(&am791x->tx_silence, 0, "RESET SILENCE");
- timer_start(&am791x->tx_timer, am791x->t_rcon);
+ /* Flag timer, because it must be added in main thread. */
+ am791x->tx_timer_f = am791x->t_rcon;
new_tx_state(am791x, AM791X_STATE_RCON);
set_filters(am791x);
/* check CD to be blocked */
@@ -613,7 +615,7 @@ static void go_main_channel_tx(am791x_t *am791x)
static void rcon_release_rts(am791x_t *am791x)
{
- PDEBUG(DAM791X, DEBUG_DEBUG, "RTS was released\n");
+ LOGP(DAM791X, LOGL_DEBUG, "RTS was released\n");
set_flag(&am791x->block_td, 1, "TD IGNORED");
set_flag(&am791x->tx_silence, 1, "SET SILENCE");
@@ -629,7 +631,7 @@ static void rcon_release_rts(am791x_t *am791x)
static void rcon_done(am791x_t *am791x)
{
- PDEBUG(DAM791X, DEBUG_DEBUG, "Transmission started\n");
+ LOGP(DAM791X, LOGL_DEBUG, "Transmission started\n");
new_tx_state(am791x, AM791X_STATE_DATA);
/* CTS on */
@@ -638,7 +640,7 @@ static void rcon_done(am791x_t *am791x)
static void tx_data_done(am791x_t *am791x)
{
- PDEBUG(DAM791X, DEBUG_DEBUG, "RTS was released\n");
+ LOGP(DAM791X, LOGL_DEBUG, "RTS was released\n");
new_tx_state(am791x, AM791X_STATE_RCOFF);
set_flag(&am791x->block_td, 1, "TD IGNORED");
@@ -650,12 +652,13 @@ static void tx_data_done(am791x_t *am791x)
if (!am791x->fullduplex) {
set_flag(&am791x->squelch, 1, "SET SQUELCH (ON)");
}
- timer_start(&am791x->tx_timer, am791x->t_rcoff);
+ /* Flag timer, because it must be added in main thread. */
+ am791x->tx_timer_f = am791x->t_rcoff;
}
static void rcoff_done(am791x_t *am791x)
{
- PDEBUG(DAM791X, DEBUG_DEBUG, "Transmission over\n");
+ LOGP(DAM791X, LOGL_DEBUG, "Transmission over\n");
/* CTS off */
am791x->cts_cb(am791x->inst, 0);
@@ -665,17 +668,19 @@ static void rcoff_done(am791x_t *am791x)
return;
}
if (!am791x->sto) {
- timer_start(&am791x->tx_timer, am791x->t_sq - am791x->t_rcoff);
+ /* Flag timer, because it must be added in main thread. */
+ am791x->tx_timer_f = am791x->t_sq - am791x->t_rcoff;
new_tx_state(am791x, AM791X_STATE_SQ_OFF);
return;
}
- timer_start(&am791x->tx_timer, am791x->t_sto - am791x->t_rcoff);
+ /* Flag timer, because it must be added in main thread. */
+ am791x->tx_timer_f = am791x->t_sto - am791x->t_rcoff;
new_tx_state(am791x, AM791X_STATE_STO_OFF);
}
static void sq_done(am791x_t *am791x)
{
- PDEBUG(DAM791X, DEBUG_DEBUG, "Squelch over\n");
+ LOGP(DAM791X, LOGL_DEBUG, "Squelch over\n");
set_flag(&am791x->block_cd, 0, "CD RELEASED");
new_tx_state(am791x, AM791X_STATE_INIT);
@@ -690,16 +695,17 @@ static void sq_done(am791x_t *am791x)
static void sto_done(am791x_t *am791x)
{
- PDEBUG(DAM791X, DEBUG_DEBUG, "STO over\n");
+ LOGP(DAM791X, LOGL_DEBUG, "STO over\n");
set_flag(&am791x->tx_sto, 0, "stop STO");
- timer_start(&am791x->tx_timer, am791x->t_sq - am791x->t_sto);
+ /* Flag timer, because it must be added in main thread. */
+ am791x->tx_timer_f = am791x->t_sq - am791x->t_sto;
new_tx_state(am791x, AM791X_STATE_SQ_OFF);
}
static void go_back_channel_tx(am791x_t *am791x)
{
- PDEBUG(DAM791X, DEBUG_DEBUG, "Enable transmitter on back channel\n");
+ LOGP(DAM791X, LOGL_DEBUG, "Enable transmitter on back channel\n");
if (!am791x->loopback_back) {
set_flag(&am791x->block_brd, 1, "BRD = MARK");
@@ -709,7 +715,8 @@ static void go_back_channel_tx(am791x_t *am791x)
/* activate BTD now and set BCTS timer (BRCON) */
set_flag(&am791x->block_btd, 0, "BTD RELEASED");
set_flag(&am791x->tx_silence, 0, "RESET SILENCE");
- timer_start(&am791x->tx_timer, am791x->t_brcon);
+ /* Flag timer, because it must be added in main thread. */
+ am791x->tx_timer_f = am791x->t_brcon;
new_tx_state(am791x, AM791X_STATE_BRCON);
set_filters(am791x);
/* check BCD to be blocked */
@@ -723,7 +730,7 @@ static void go_back_channel_tx(am791x_t *am791x)
static void brcon_release_brts(am791x_t *am791x)
{
- PDEBUG(DAM791X, DEBUG_DEBUG, "BRTS was released\n");
+ LOGP(DAM791X, LOGL_DEBUG, "BRTS was released\n");
set_flag(&am791x->tx_silence, 1, "SET SILENCE");
new_tx_state(am791x, AM791X_STATE_INIT);
@@ -732,7 +739,7 @@ static void brcon_release_brts(am791x_t *am791x)
static void brcon_done(am791x_t *am791x)
{
- PDEBUG(DAM791X, DEBUG_DEBUG, "Transmission started\n");
+ LOGP(DAM791X, LOGL_DEBUG, "Transmission started\n");
new_tx_state(am791x, AM791X_STATE_BDATA);
/* BCTS on */
@@ -741,16 +748,17 @@ static void brcon_done(am791x_t *am791x)
static void tx_bdata_done(am791x_t *am791x)
{
- PDEBUG(DAM791X, DEBUG_DEBUG, "BRTS was released\n");
+ LOGP(DAM791X, LOGL_DEBUG, "BRTS was released\n");
set_flag(&am791x->block_btd, 1, "BTD IGNORED");
set_flag(&am791x->tx_silence, 1, "SET SILENCE");
- timer_start(&am791x->tx_timer, am791x->t_brcoff);
+ /* Flag timer, because it must be added in main thread. */
+ am791x->tx_timer_f = am791x->t_brcoff;
}
static void brcoff_done(am791x_t *am791x)
{
- PDEBUG(DAM791X, DEBUG_DEBUG, "Transmission over\n");
+ LOGP(DAM791X, LOGL_DEBUG, "Transmission over\n");
/* BCTS off */
am791x->bcts_cb(am791x->inst, 0);
@@ -791,7 +799,8 @@ static void handle_tx_state(am791x_t *am791x)
rcon_release_rts(am791x);
break;
}
- if (!timer_running(&am791x->tx_timer)) {
+ /* If timer is about to be switched off, of if it already has been switched off. */
+ if (am791x->tx_timer_f < 0.0 || (!osmo_timer_pending(&am791x->tx_timer) && am791x->tx_timer_f == 0.0)) {
rcon_done(am791x);
break;
}
@@ -803,19 +812,22 @@ static void handle_tx_state(am791x_t *am791x)
}
break;
case AM791X_STATE_RCOFF:
- if (!timer_running(&am791x->tx_timer)) {
+ /* If timer is about to be switched off, of if it already has been switched off. */
+ if (am791x->tx_timer_f < 0.0 || (!osmo_timer_pending(&am791x->tx_timer) && am791x->tx_timer_f == 0.0)) {
rcoff_done(am791x);
break;
}
break;
case AM791X_STATE_STO_OFF:
- if (!timer_running(&am791x->tx_timer)) {
+ /* If timer is about to be switched off, of if it already has been switched off. */
+ if (am791x->tx_timer_f < 0.0 || (!osmo_timer_pending(&am791x->tx_timer) && am791x->tx_timer_f == 0.0)) {
sto_done(am791x);
break;
}
break;
case AM791X_STATE_SQ_OFF:
- if (!timer_running(&am791x->tx_timer)) {
+ /* If timer is about to be switched off, of if it already has been switched off. */
+ if (am791x->tx_timer_f < 0.0 || (!osmo_timer_pending(&am791x->tx_timer) && am791x->tx_timer_f == 0.0)) {
sq_done(am791x);
break;
}
@@ -826,7 +838,8 @@ static void handle_tx_state(am791x_t *am791x)
brcon_release_brts(am791x);
break;
}
- if (!timer_running(&am791x->tx_timer)) {
+ /* If timer is about to be switched off, of if it already has been switched off. */
+ if (am791x->tx_timer_f < 0.0 || (!osmo_timer_pending(&am791x->tx_timer) && am791x->tx_timer_f == 0.0)) {
brcon_done(am791x);
break;
}
@@ -838,27 +851,29 @@ static void handle_tx_state(am791x_t *am791x)
}
break;
case AM791X_STATE_BRCOFF:
- if (!timer_running(&am791x->tx_timer)) {
+ /* If timer is about to be switched off, of if it already has been switched off. */
+ if (am791x->tx_timer_f < 0.0 || (!osmo_timer_pending(&am791x->tx_timer) && am791x->tx_timer_f == 0.0)) {
brcoff_done(am791x);
break;
}
break;
default:
- PDEBUG(DAM791X, DEBUG_ERROR, "State %s not handled!\n", am791x_state_names[am791x->rx_state]);
+ LOGP(DAM791X, LOGL_ERROR, "State %s not handled!\n", am791x_state_names[am791x->rx_state]);
}
}
static void go_main_channel_rx(am791x_t *am791x)
{
- PDEBUG(DAM791X, DEBUG_DEBUG, "Enable receiver on main channel\n");
+ LOGP(DAM791X, LOGL_DEBUG, "Enable receiver on main channel\n");
- timer_start(&am791x->rx_timer, am791x->t_cdon);
+ /* Flag timer, because it must be added in main thread. */
+ am791x->rx_timer_f = am791x->t_cdon;
new_rx_state(am791x, AM791X_STATE_CDON);
}
static void cdon_done(am791x_t *am791x)
{
- PDEBUG(DAM791X, DEBUG_DEBUG, "Reception started\n");
+ LOGP(DAM791X, LOGL_DEBUG, "Reception started\n");
set_flag(&am791x->block_rd, 0, "RD RELEASED");
new_rx_state(am791x, AM791X_STATE_DATA);
@@ -872,23 +887,25 @@ static void cdon_done(am791x_t *am791x)
static void cdon_no_cd(am791x_t *am791x)
{
- PDEBUG(DAM791X, DEBUG_DEBUG, "Carrier is gone\n");
+ LOGP(DAM791X, LOGL_DEBUG, "Carrier is gone\n");
- timer_stop(&am791x->rx_timer);
+ /* Flag timer, because it must be deleted in main thread. */
+ am791x->rx_timer_f = -1;
new_rx_state(am791x, AM791X_STATE_INIT);
}
static void rx_data_done(am791x_t *am791x)
{
- PDEBUG(DAM791X, DEBUG_DEBUG, "Carrier lost\n");
+ LOGP(DAM791X, LOGL_DEBUG, "Carrier lost\n");
- timer_start(&am791x->rx_timer, am791x->t_cdoff);
+ /* Flag timer, because it must be added in main thread. */
+ am791x->rx_timer_f = am791x->t_cdoff;
new_rx_state(am791x, AM791X_STATE_CDOFF);
}
static void cdoff_done(am791x_t *am791x)
{
- PDEBUG(DAM791X, DEBUG_DEBUG, "Reception finished\n");
+ LOGP(DAM791X, LOGL_DEBUG, "Reception finished\n");
set_flag(&am791x->block_rd, 1, "RD = MARK");
new_rx_state(am791x, AM791X_STATE_INIT);
@@ -902,23 +919,25 @@ static void cdoff_done(am791x_t *am791x)
static void cdoff_cd(am791x_t *am791x)
{
- PDEBUG(DAM791X, DEBUG_DEBUG, "Carrier recovered\n");
+ LOGP(DAM791X, LOGL_DEBUG, "Carrier recovered\n");
- timer_stop(&am791x->rx_timer);
+ /* Flag timer, because it must be deleted in main thread. */
+ am791x->rx_timer_f = -1;
new_rx_state(am791x, AM791X_STATE_DATA);
}
static void go_back_channel_rx(am791x_t *am791x)
{
- PDEBUG(DAM791X, DEBUG_DEBUG, "Enable receiver on back channel\n");
+ LOGP(DAM791X, LOGL_DEBUG, "Enable receiver on back channel\n");
- timer_start(&am791x->rx_timer, am791x->t_bcdon);
+ /* Flag timer, because it must be added in main thread. */
+ am791x->rx_timer_f = am791x->t_bcdon;
new_rx_state(am791x, AM791X_STATE_BCDON);
}
static void bcdon_done(am791x_t *am791x)
{
- PDEBUG(DAM791X, DEBUG_DEBUG, "Carrier was detected\n");
+ LOGP(DAM791X, LOGL_DEBUG, "Carrier was detected\n");
set_flag(&am791x->block_brd, 0, "BRD RELEASED");
new_rx_state(am791x, AM791X_STATE_BDATA);
@@ -932,23 +951,25 @@ static void bcdon_done(am791x_t *am791x)
static void bcdon_no_cd(am791x_t *am791x)
{
- PDEBUG(DAM791X, DEBUG_DEBUG, "Carrier is gone\n");
+ LOGP(DAM791X, LOGL_DEBUG, "Carrier is gone\n");
- timer_stop(&am791x->rx_timer);
+ /* Flag timer, because it must be deleted in main thread. */
+ am791x->rx_timer_f = -1;
new_rx_state(am791x, AM791X_STATE_INIT);
}
static void rx_bdata_done(am791x_t *am791x)
{
- PDEBUG(DAM791X, DEBUG_DEBUG, "Carrier lost\n");
+ LOGP(DAM791X, LOGL_DEBUG, "Carrier lost\n");
- timer_start(&am791x->rx_timer, am791x->t_bcdoff);
+ /* Flag timer, because it must be added in main thread. */
+ am791x->rx_timer_f = am791x->t_bcdoff;
new_rx_state(am791x, AM791X_STATE_BCDOFF);
}
static void bcdoff_done(am791x_t *am791x)
{
- PDEBUG(DAM791X, DEBUG_DEBUG, "Reception finished\n");
+ LOGP(DAM791X, LOGL_DEBUG, "Reception finished\n");
if (!am791x->bell_202)
set_flag(&am791x->block_brd, 1, "BRD = MARK");
@@ -963,9 +984,10 @@ static void bcdoff_done(am791x_t *am791x)
static void bcdoff_cd(am791x_t *am791x)
{
- PDEBUG(DAM791X, DEBUG_DEBUG, "Carrier recovered\n");
+ LOGP(DAM791X, LOGL_DEBUG, "Carrier recovered\n");
- timer_stop(&am791x->rx_timer);
+ /* Flag timer, because it must be deleted in main thread. */
+ am791x->rx_timer_f = -1;
new_rx_state(am791x, AM791X_STATE_BDATA);
}
@@ -992,7 +1014,8 @@ static void handle_rx_state(am791x_t *am791x)
break;
/* all main channel states ... */
case AM791X_STATE_CDON:
- if (!timer_running(&am791x->rx_timer)) {
+ /* If timer is about to be switched off, of if it already has been switched off. */
+ if (am791x->rx_timer_f < 0.0 || (!osmo_timer_pending(&am791x->rx_timer) && am791x->rx_timer_f == 0.0)) {
cdon_done(am791x);
break;
}
@@ -1008,7 +1031,8 @@ static void handle_rx_state(am791x_t *am791x)
}
break;
case AM791X_STATE_CDOFF:
- if (!timer_running(&am791x->rx_timer)) {
+ /* If timer is about to be switched off, of if it already has been switched off. */
+ if (am791x->rx_timer_f < 0.0 || (!osmo_timer_pending(&am791x->rx_timer) && am791x->rx_timer_f == 0.0)) {
cdoff_done(am791x);
break;
}
@@ -1019,7 +1043,8 @@ static void handle_rx_state(am791x_t *am791x)
break;
/* all back channel states ... */
case AM791X_STATE_BCDON:
- if (!timer_running(&am791x->rx_timer)) {
+ /* If timer is about to be switched off, of if it already has been switched off. */
+ if (am791x->rx_timer_f < 0.0 || (!osmo_timer_pending(&am791x->rx_timer) && am791x->rx_timer_f == 0.0)) {
bcdon_done(am791x);
break;
}
@@ -1035,7 +1060,8 @@ static void handle_rx_state(am791x_t *am791x)
}
break;
case AM791X_STATE_BCDOFF:
- if (!timer_running(&am791x->rx_timer)) {
+ /* If timer is about to be switched off, of if it already has been switched off. */
+ if (am791x->rx_timer_f < 0.0 || (!osmo_timer_pending(&am791x->rx_timer) && am791x->rx_timer_f == 0.0)) {
bcdoff_done(am791x);
break;
}
@@ -1045,7 +1071,7 @@ static void handle_rx_state(am791x_t *am791x)
}
break;
default:
- PDEBUG(DAM791X, DEBUG_ERROR, "State %s not handled!\n", am791x_state_names[am791x->rx_state]);
+ LOGP(DAM791X, LOGL_ERROR, "State %s not handled!\n", am791x_state_names[am791x->rx_state]);
}
}
@@ -1066,16 +1092,16 @@ static void handle_state(am791x_t *am791x)
}
/* timeout events */
-static void tx_timeout(struct timer *timer)
+static void tx_timeout(void *data)
{
- am791x_t *am791x = (am791x_t *)timer->priv;
+ am791x_t *am791x = data;
handle_tx_state(am791x);
}
-static void rx_timeout(struct timer *timer)
+static void rx_timeout(void *data)
{
- am791x_t *am791x = (am791x_t *)timer->priv;
+ am791x_t *am791x = data;
handle_rx_state(am791x);
}
@@ -1086,10 +1112,10 @@ int am791x_init(am791x_t *am791x, void *inst, enum am791x_type type, uint8_t mc,
memset(am791x, 0, sizeof(*am791x));
/* init timers */
- timer_init(&am791x->tx_timer, tx_timeout, am791x);
- timer_init(&am791x->rx_timer, rx_timeout, am791x);
+ osmo_timer_setup(&am791x->tx_timer, tx_timeout, am791x);
+ osmo_timer_setup(&am791x->rx_timer, rx_timeout, am791x);
- PDEBUG(DAM791X, DEBUG_DEBUG, "Initializing instance of AM791%d:\n", type);
+ LOGP(DAM791X, LOGL_DEBUG, "Initializing instance of AM791%d:\n", type);
am791x->inst = inst;
am791x->type = type;
@@ -1119,13 +1145,13 @@ int am791x_init(am791x_t *am791x, void *inst, enum am791x_type type, uint8_t mc,
/* exit routine, must be called when exit */
void am791x_exit(am791x_t *am791x)
{
- PDEBUG(DAM791X, DEBUG_DEBUG, "Exit instance of AM791%d:\n", am791x->type);
+ LOGP(DAM791X, LOGL_DEBUG, "Exit instance of AM791%d:\n", am791x->type);
/* bring to reset state, be sure to clean FSK processes */
am791x_reset(am791x);
- timer_exit(&am791x->tx_timer);
- timer_exit(&am791x->rx_timer);
+ osmo_timer_del(&am791x->tx_timer);
+ osmo_timer_del(&am791x->rx_timer);
}
/* get some default baud rate for each mode, before IOCTL sets it (if it sets it) */
@@ -1149,8 +1175,8 @@ int am791x_mc(am791x_t *am791x, uint8_t mc, int samplerate, double tx_baud, doub
if (!((am791x->type) ? am791x_modes[mc].sup_7911 : am791x_modes[mc].sup_7910))
rc = -EINVAL;
- PDEBUG(DAM791X, DEBUG_INFO, "Setting mode %d: %s\n", mc, am791x_modes[mc].description);
- PDEBUG(DAM791X, DEBUG_DEBUG, " -> Baud rate: %.1f/%.1f\n", rx_baud, tx_baud);
+ LOGP(DAM791X, LOGL_INFO, "Setting mode %d: %s\n", mc, am791x_modes[mc].description);
+ LOGP(DAM791X, LOGL_DEBUG, " -> Baud rate: %.1f/%.1f\n", rx_baud, tx_baud);
am791x->mc = mc;
am791x->samplerate = samplerate;
@@ -1187,10 +1213,12 @@ int am791x_mc(am791x_t *am791x, uint8_t mc, int samplerate, double tx_baud, doub
/* reset at any time, may be called any time by upper layer */
void am791x_reset(am791x_t *am791x)
{
- PDEBUG(DAM791X, DEBUG_INFO, "Reset!\n");
+ LOGP(DAM791X, LOGL_INFO, "Reset!\n");
- timer_stop(&am791x->tx_timer);
- timer_stop(&am791x->rx_timer);
+ /* Flag timer, because it must be deleted in main thread. */
+ am791x->tx_timer_f = -1.0;
+ /* Flag timer, because it must be deleted in main thread. */
+ am791x->rx_timer_f = -1.0;
if (am791x->f0_tx) {
fsk_mod_cleanup(&am791x->fsk_tx);
@@ -1228,7 +1256,7 @@ void am791x_reset(am791x_t *am791x)
/* change input lines */
void am791x_dtr(am791x_t *am791x, int dtr)
{
- PDEBUG(DAM791X, DEBUG_DEBUG, "Terminal is%s ready!\n", (dtr) ? "" : " not");
+ LOGP(DAM791X, LOGL_DEBUG, "Terminal is%s ready!\n", (dtr) ? "" : " not");
/* set filters, if DTR becomes on */
if (!am791x->line_dtr && dtr) {
@@ -1242,7 +1270,7 @@ void am791x_dtr(am791x_t *am791x, int dtr)
void am791x_rts(am791x_t *am791x, int rts)
{
- PDEBUG(DAM791X, DEBUG_DEBUG, "Terminal %s RTS.\n", (rts) ? "sets" : "clears");
+ LOGP(DAM791X, LOGL_DEBUG, "Terminal %s RTS.\n", (rts) ? "sets" : "clears");
am791x->line_rts = rts;
handle_state(am791x);
@@ -1250,7 +1278,7 @@ void am791x_rts(am791x_t *am791x, int rts)
void am791x_brts(am791x_t *am791x, int rts)
{
- PDEBUG(DAM791X, DEBUG_DEBUG, "Terminal %s BRTS.\n", (rts) ? "sets" : "clears");
+ LOGP(DAM791X, LOGL_DEBUG, "Terminal %s BRTS.\n", (rts) ? "sets" : "clears");
am791x->line_brts = rts;
handle_state(am791x);
@@ -1258,9 +1286,25 @@ void am791x_brts(am791x_t *am791x, int rts)
void am791x_ring(am791x_t *am791x, int ring)
{
- PDEBUG(DAM791X, DEBUG_DEBUG, "Terminal %s RING.\n", (ring) ? "sets" : "clears");
+ LOGP(DAM791X, LOGL_DEBUG, "Terminal %s RING.\n", (ring) ? "sets" : "clears");
am791x->line_ring = ring;
handle_state(am791x);
}
+void am791x_add_del_timers(am791x_t *am791x)
+{
+ /* Timers may only be processed in main thread, because libosmocore has timer lists for individual threads. */
+ if (am791x->tx_timer_f < 0.0)
+ osmo_timer_del(&am791x->tx_timer);
+ if (am791x->tx_timer_f > 0.0)
+ osmo_timer_schedule(&am791x->tx_timer, FLOAT_TO_TIMEOUT(am791x->tx_timer_f));
+ am791x->tx_timer_f = 0.0;
+
+ if (am791x->rx_timer_f < 0.0)
+ osmo_timer_del(&am791x->rx_timer);
+ if (am791x->rx_timer_f > 0.0)
+ osmo_timer_schedule(&am791x->rx_timer, FLOAT_TO_TIMEOUT(am791x->rx_timer_f));
+ am791x->rx_timer_f = 0.0;
+}
+
diff --git a/src/datenklo/am791x.h b/src/datenklo/am791x.h
index a75f736..54f1016 100644
--- a/src/datenklo/am791x.h
+++ b/src/datenklo/am791x.h
@@ -67,7 +67,8 @@ typedef struct am791x {
int f0_rx, f1_rx;
/* timers */
- struct timer tx_timer, rx_timer;
+ struct osmo_timer_list tx_timer, rx_timer;
+ double tx_timer_f, rx_timer_f; /* time to stat / flag to stop */
double t_rcon;
double t_rcoff;
double t_brcon;
@@ -104,4 +105,5 @@ void am791x_dtr(am791x_t *am791x, int dtr);
void am791x_rts(am791x_t *am791x, int rts);
void am791x_brts(am791x_t *am791x, int brts);
void am791x_ring(am791x_t *am791x, int ring);
+void am791x_add_del_timers(am791x_t *am791x);
diff --git a/src/datenklo/datenklo.c b/src/datenklo/datenklo.c
index e62edbf..4576e67 100644
--- a/src/datenklo/datenklo.c
+++ b/src/datenklo/datenklo.c
@@ -32,12 +32,14 @@
#include <fcntl.h>
#include <math.h>
#include "../libsample/sample.h"
-#include "../libtimer/timer.h"
+#include <osmocom/core/select.h>
+#include <osmocom/core/timer.h>
#include "../libfsk/fsk.h"
#include "../libsound/sound.h"
#include "../libwave/wave.h"
#include "../libdisplay/display.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
+#include "../libmobile/get_time.c"
#include "device.h"
#include "am791x.h"
#include "uart.h"
@@ -217,7 +219,7 @@ static void cts(void *inst, int cts)
return;
if (datenklo->auto_rts) {
- PDEBUG(DDATENKLO, DEBUG_INFO, "Received CTS=%d in Automatic RTS Mode.\n", cts);
+ LOGP(DDATENKLO, LOGL_INFO, "Received CTS=%d in Automatic RTS Mode.\n", cts);
datenklo->auto_rts_cts = cts;
return;
}
@@ -226,7 +228,7 @@ static void cts(void *inst, int cts)
datenklo->lines |= TIOCM_CTS;
else
datenklo->lines &= ~TIOCM_CTS;
- PDEBUG(DDATENKLO, DEBUG_INFO, "Indicating to terminal that CTS is %s\n", (cts) ? "on" : "off");
+ LOGP(DDATENKLO, LOGL_INFO, "Indicating to terminal that CTS is %s\n", (cts) ? "on" : "off");
}
/* modem changes CTS state (back channel) */
@@ -238,7 +240,7 @@ static void bcts(void *inst, int cts)
return;
if (datenklo->auto_rts) {
- PDEBUG(DDATENKLO, DEBUG_INFO, "Received BCTS=%d in Automatic RTS Mode.\n", cts);
+ LOGP(DDATENKLO, LOGL_INFO, "Received BCTS=%d in Automatic RTS Mode.\n", cts);
datenklo->auto_rts_cts = cts;
return;
}
@@ -247,7 +249,7 @@ static void bcts(void *inst, int cts)
datenklo->lines |= TIOCM_CTS;
else
datenklo->lines &= ~TIOCM_CTS;
- PDEBUG(DDATENKLO, DEBUG_INFO, "Indicating to terminal that BCTS is %s\n", (cts) ? "on" : "off");
+ LOGP(DDATENKLO, LOGL_INFO, "Indicating to terminal that BCTS is %s\n", (cts) ? "on" : "off");
}
/* modem changes CD state */
@@ -259,7 +261,7 @@ static void cd(void *inst, int cd)
return;
if (datenklo->auto_rts) {
- PDEBUG(DDATENKLO, DEBUG_INFO, "Received CD=%d in Automatic RTS Mode.\n", cd);
+ LOGP(DDATENKLO, LOGL_INFO, "Received CD=%d in Automatic RTS Mode.\n", cd);
datenklo->auto_rts_cd = cd;
return;
}
@@ -268,7 +270,7 @@ static void cd(void *inst, int cd)
datenklo->lines |= TIOCM_CD;
else
datenklo->lines &= ~TIOCM_CD;
- PDEBUG(DDATENKLO, DEBUG_INFO, "Indicating to terminal that CD is %s\n", (cd) ? "on" : "off");
+ LOGP(DDATENKLO, LOGL_INFO, "Indicating to terminal that CD is %s\n", (cd) ? "on" : "off");
}
/* modem changes CD state (back channel) */
@@ -280,7 +282,7 @@ static void bcd(void *inst, int cd)
return;
if (datenklo->auto_rts) {
- PDEBUG(DDATENKLO, DEBUG_INFO, "Received BCD=%d in Automatic RTS Mode.\n", cd);
+ LOGP(DDATENKLO, LOGL_INFO, "Received BCD=%d in Automatic RTS Mode.\n", cd);
datenklo->auto_rts_cd = cd;
return;
}
@@ -289,7 +291,7 @@ static void bcd(void *inst, int cd)
datenklo->lines |= TIOCM_CD;
else
datenklo->lines &= ~TIOCM_CD;
- PDEBUG(DDATENKLO, DEBUG_INFO, "Indicating to terminal that BCD is %s\n", (cd) ? "on" : "off");
+ LOGP(DDATENKLO, LOGL_INFO, "Indicating to terminal that BCD is %s\n", (cd) ? "on" : "off");
}
/* modem request bit */
@@ -405,7 +407,7 @@ static int tx(void *inst)
if (datenklo->onlcr_char) {
datenklo->onlcr_char = 0;
data = '\n';
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "ONLCR: sending NL\n");
+ LOGP(DDATENKLO, LOGL_DEBUG, "ONLCR: sending NL\n");
goto out;
}
@@ -414,7 +416,7 @@ again:
if (fill == (size_t)datenklo->tx_fifo_full) {
/* tell cuse to write again */
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "Set POLLOUT!\n");
+ LOGP(DDATENKLO, LOGL_DEBUG, "Set POLLOUT!\n");
datenklo->revents |= POLLOUT;
device_set_poll_events(datenklo->device, datenklo->revents);
}
@@ -424,12 +426,12 @@ again:
datenklo->auto_rts_on = 0;
if (datenklo->tcsetsw) {
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "Transmission finished, applying termios now.\n");
+ LOGP(DDATENKLO, LOGL_DEBUG, "Transmission finished, applying termios now.\n");
memcpy(&datenklo->termios, &datenklo->tcsetsw_termios, sizeof(datenklo->termios));
if (datenklo->tcsetsw == 2) {
flush_rx(datenklo);
if ((datenklo->revents & POLLIN)) {
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "Reset POLLIN (flushed)\n");
+ LOGP(DDATENKLO, LOGL_DEBUG, "Reset POLLIN (flushed)\n");
datenklo->revents &= ~POLLIN;
device_set_poll_events(datenklo->device, datenklo->revents);
}
@@ -450,26 +452,26 @@ again:
/* process output features */
if (datenklo->opost) {
if (datenklo->olcuc) {
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "OLCUC: 0x%02x -> 0x%02x\n", data, toupper(data));
+ LOGP(DDATENKLO, LOGL_DEBUG, "OLCUC: 0x%02x -> 0x%02x\n", data, toupper(data));
data = toupper(data);
}
if (datenklo->onlret && data == '\r') {
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "ONLRET: ignore CR\n");
+ LOGP(DDATENKLO, LOGL_DEBUG, "ONLRET: ignore CR\n");
goto again;
}
if (datenklo->ocrnl && data == '\r') {
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "OCRNL: CR -> NL\n");
+ LOGP(DDATENKLO, LOGL_DEBUG, "OCRNL: CR -> NL\n");
data = '\n';
}
if (datenklo->onlcr && data == '\n') {
datenklo->onlcr_char = 1;
data = '\r';
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "ONLCR: sending CR\n");
+ LOGP(DDATENKLO, LOGL_DEBUG, "ONLCR: sending CR\n");
}
}
out:
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "Transmitting byte 0x%02x to UART.\n", data);
+ LOGP(DDATENKLO, LOGL_DEBUG, "Transmitting byte 0x%02x to UART.\n", data);
return data;
}
@@ -480,35 +482,35 @@ static void rx(void *inst, int data, uint32_t __attribute__((unused)) flags)
datenklo_t *datenklo = (datenklo_t *)inst;
size_t space;
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "Received byte 0x%02x ('%c') from UART.\n", data, (data >= 32 && data <= 126) ? data : '.');
+ LOGP(DDATENKLO, LOGL_DEBUG, "Received byte 0x%02x ('%c') from UART.\n", data, (data >= 32 && data <= 126) ? data : '.');
/* process input features */
if (datenklo->ignbrk && (flags & UART_BREAK)) {
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "IGNBRK: ignore BREAK\n");
+ LOGP(DDATENKLO, LOGL_DEBUG, "IGNBRK: ignore BREAK\n");
return;
}
if (datenklo->istrip && (data & 0x80)) {
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "ISTRIP: 0x%02x -> 0x%02x\n", data, data & 0x7f);
+ LOGP(DDATENKLO, LOGL_DEBUG, "ISTRIP: 0x%02x -> 0x%02x\n", data, data & 0x7f);
data &= 0x7f;
}
if (datenklo->inlcr && data == '\n') {
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "INLCR: NL -> CR\n");
+ LOGP(DDATENKLO, LOGL_DEBUG, "INLCR: NL -> CR\n");
data = '\r';
}
if (datenklo->igncr && data == '\r') {
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "IGNCR: ignore CR\n");
+ LOGP(DDATENKLO, LOGL_DEBUG, "IGNCR: ignore CR\n");
return;
}
if (datenklo->icrnl && data == '\r') {
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "ICRNL: CR -> NL\n");
+ LOGP(DDATENKLO, LOGL_DEBUG, "ICRNL: CR -> NL\n");
data = '\n';
}
if (datenklo->iuclc) {
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "IUCLC: 0x%02x -> 0x%02x\n", data, tolower(data));
+ LOGP(DDATENKLO, LOGL_DEBUG, "IUCLC: 0x%02x -> 0x%02x\n", data, tolower(data));
data = tolower(data);
}
if (datenklo->echo) {
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "ECHO: write to output\n");
+ LOGP(DDATENKLO, LOGL_DEBUG, "ECHO: write to output\n");
space = (datenklo->tx_fifo_out - datenklo->tx_fifo_in - 1 + datenklo->tx_fifo_size) % datenklo->tx_fifo_size;
if (space) {
datenklo->tx_fifo[datenklo->tx_fifo_in++] = data;
@@ -519,7 +521,7 @@ static void rx(void *inst, int data, uint32_t __attribute__((unused)) flags)
/* empty buffer gets data */
if (datenklo->rx_fifo_out == datenklo->rx_fifo_in) {
/* tell cuse to read again */
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "Set POLLIN!\n");
+ LOGP(DDATENKLO, LOGL_DEBUG, "Set POLLIN!\n");
datenklo->revents |= POLLIN;
device_set_poll_events(datenklo->device, datenklo->revents);
}
@@ -528,13 +530,13 @@ static void rx(void *inst, int data, uint32_t __attribute__((unused)) flags)
if (!space) {
err_overflow:
- PDEBUG(DDATENKLO, DEBUG_NOTICE, "RX buffer overflow, dropping!\n");
+ LOGP(DDATENKLO, LOGL_NOTICE, "RX buffer overflow, dropping!\n");
return;
}
if (datenklo->parmrk) {
if ((flags & (UART_BREAK | UART_PARITY_ERROR))) {
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "PARMRK: 0x%02x -> 0xff,0x00,0x%02x\n", data, data);
+ LOGP(DDATENKLO, LOGL_DEBUG, "PARMRK: 0x%02x -> 0xff,0x00,0x%02x\n", data, data);
if (space < 3)
goto err_overflow;
datenklo->rx_fifo[datenklo->rx_fifo_in++] = 0xff;
@@ -544,7 +546,7 @@ static void rx(void *inst, int data, uint32_t __attribute__((unused)) flags)
datenklo->rx_fifo_in %= datenklo->rx_fifo_size;
space--;
} else if (data == 0xff) {
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "PARMRK: 0xff -> 0xff,0xff\n");
+ LOGP(DDATENKLO, LOGL_DEBUG, "PARMRK: 0xff -> 0xff,0xff\n");
if (space < 2)
goto err_overflow;
datenklo->rx_fifo[datenklo->rx_fifo_in++] = 0xff;
@@ -567,18 +569,18 @@ static void set_lines(datenklo_t *datenklo, int new)
int old = datenklo->lines;
if (!(old & TIOCM_DTR) && (new & TIOCM_DTR)) {
- PDEBUG(DDATENKLO, DEBUG_INFO, "Terminal turns DTR on\n");
+ LOGP(DDATENKLO, LOGL_INFO, "Terminal turns DTR on\n");
flush_tx(datenklo);
flush_rx(datenklo);
am791x_dtr(&datenklo->am791x, 1);
}
if ((old & TIOCM_DTR) && !(new & TIOCM_DTR)) {
- PDEBUG(DDATENKLO, DEBUG_INFO, "Terminal turns DTR off\n");
+ LOGP(DDATENKLO, LOGL_INFO, "Terminal turns DTR off\n");
am791x_dtr(&datenklo->am791x, 0);
}
if (!(old & TIOCM_RTS) && (new & TIOCM_RTS)) {
- PDEBUG(DDATENKLO, DEBUG_INFO, "Terminal turns RTS on\n");
+ LOGP(DDATENKLO, LOGL_INFO, "Terminal turns RTS on\n");
if (datenklo->auto_rts)
new |= TIOCM_CTS | TIOCM_CD;
else {
@@ -589,7 +591,7 @@ static void set_lines(datenklo_t *datenklo, int new)
}
}
if ((old & TIOCM_RTS) && !(new & TIOCM_RTS)) {
- PDEBUG(DDATENKLO, DEBUG_INFO, "Terminal turns RTS off\n");
+ LOGP(DDATENKLO, LOGL_INFO, "Terminal turns RTS off\n");
if (datenklo->auto_rts)
new &= ~(TIOCM_CTS | TIOCM_CD);
else {
@@ -609,7 +611,7 @@ static void process_auto_rts(datenklo_t *datenklo)
if (!datenklo->auto_rts)
return;
if (datenklo->auto_rts_on && !datenklo->auto_rts_rts && !datenklo->auto_rts_cd) {
- PDEBUG(DDATENKLO, DEBUG_INFO, "Automatically raising RTS.\n");
+ LOGP(DDATENKLO, LOGL_INFO, "Automatically raising RTS.\n");
datenklo->auto_rts_rts = 1;
if (!datenklo->tx_back)
am791x_rts(&datenklo->am791x, 1);
@@ -617,7 +619,7 @@ static void process_auto_rts(datenklo_t *datenklo)
am791x_brts(&datenklo->am791x, 1);
}
if (!datenklo->auto_rts_on && datenklo->auto_rts_rts) {
- PDEBUG(DDATENKLO, DEBUG_INFO, "Automatically dropping RTS.\n");
+ LOGP(DDATENKLO, LOGL_INFO, "Automatically dropping RTS.\n");
datenklo->auto_rts_rts = 0;
if (!datenklo->tx_back)
am791x_rts(&datenklo->am791x, 0);
@@ -634,7 +636,7 @@ static ssize_t dk_ioctl_get(void *inst, int cmd, void *buf, size_t out_bufsz)
ssize_t rc = 0;
#ifdef HEAVY_DEBUG
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "Device has been read for ioctl (cmd = %d, size = %zu).\n", cmd, out_bufsz);
+ LOGP(DDATENKLO, LOGL_DEBUG, "Device has been read for ioctl (cmd = %d, size = %zu).\n", cmd, out_bufsz);
#endif
switch (cmd) {
@@ -643,7 +645,7 @@ static ssize_t dk_ioctl_get(void *inst, int cmd, void *buf, size_t out_bufsz)
if (!out_bufsz)
break;
#ifdef HEAVY_DEBUG
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "Terminal requests termios.\n");
+ LOGP(DDATENKLO, LOGL_DEBUG, "Terminal requests termios.\n");
#endif
memcpy(buf, &datenklo->termios, rc);
break;
@@ -652,7 +654,7 @@ static ssize_t dk_ioctl_get(void *inst, int cmd, void *buf, size_t out_bufsz)
if (!out_bufsz)
break;
#ifdef HEAVY_DEBUG
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "Terminal requests line states.\n");
+ LOGP(DDATENKLO, LOGL_DEBUG, "Terminal requests line states.\n");
#endif
status = datenklo->lines | TIOCM_LE | TIOCM_DSR;
memcpy(buf, &status, rc);
@@ -662,7 +664,7 @@ static ssize_t dk_ioctl_get(void *inst, int cmd, void *buf, size_t out_bufsz)
if (!out_bufsz)
break;
#ifdef HEAVY_DEBUG
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "Terminal requests window size.\n");
+ LOGP(DDATENKLO, LOGL_DEBUG, "Terminal requests window size.\n");
#endif
struct winsize *winsize = (struct winsize *)buf;
winsize->ws_row = 25;
@@ -677,7 +679,7 @@ static ssize_t dk_ioctl_get(void *inst, int cmd, void *buf, size_t out_bufsz)
status = (datenklo->rx_fifo_in - datenklo->rx_fifo_out + datenklo->rx_fifo_size) % datenklo->rx_fifo_size;
memcpy(buf, &status, rc);
#ifdef HEAVY_DEBUG
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "Terminal requests RX buffer fill states.\n");
+ LOGP(DDATENKLO, LOGL_DEBUG, "Terminal requests RX buffer fill states.\n");
#endif
break;
case TIOCOUTQ:
@@ -685,7 +687,7 @@ static ssize_t dk_ioctl_get(void *inst, int cmd, void *buf, size_t out_bufsz)
if (!out_bufsz)
break;
#ifdef HEAVY_DEBUG
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "Terminal requests TX buffer fill states.\n");
+ LOGP(DDATENKLO, LOGL_DEBUG, "Terminal requests TX buffer fill states.\n");
#endif
status = (datenklo->tx_fifo_in - datenklo->tx_fifo_out + datenklo->tx_fifo_size) % datenklo->tx_fifo_size;
memcpy(buf, &status, rc);
@@ -786,15 +788,15 @@ static void set_termios(datenklo_t *datenklo, const void *buf)
new_echo = !!(datenklo->termios.c_lflag & ECHO);
if (old_baud != new_baud && (!datenklo->force_tx_baud || !datenklo->force_rx_baud)) {
- PDEBUG(DDATENKLO, DEBUG_INFO, "Terminal changes baud rate to %.1f Baud.\n", new_baud);
+ LOGP(DDATENKLO, LOGL_INFO, "Terminal changes baud rate to %.1f Baud.\n", new_baud);
if ((datenklo->lines & TIOCM_DTR) && !new_baud) {
- PDEBUG(DDATENKLO, DEBUG_INFO, "Baudrate is set to 0, we drop DTR\n");
+ LOGP(DDATENKLO, LOGL_INFO, "Baudrate is set to 0, we drop DTR\n");
am791x_dtr(&datenklo->am791x, 0);
}
datenklo->baudrate = new_baud;
am791x_mc(&datenklo->am791x, datenklo->mc, datenklo->samplerate, tx_baud_rate(datenklo), rx_baud_rate(datenklo));
if ((datenklo->lines & TIOCM_DTR) && !old_baud) {
- PDEBUG(DDATENKLO, DEBUG_INFO, "Baudrate is set from 0, we raise DTR\n");
+ LOGP(DDATENKLO, LOGL_INFO, "Baudrate is set from 0, we raise DTR\n");
am791x_dtr(&datenklo->am791x, 1);
}
}
@@ -802,10 +804,10 @@ static void set_termios(datenklo_t *datenklo, const void *buf)
if (old_databits != new_databits
|| old_parity != new_parity
|| old_stopbits != new_stopbits) {
- PDEBUG(DDATENKLO, DEBUG_INFO, "Terminal changes serial mode to %d%c%d.\n", cflag2databits(datenklo->termios.c_cflag), parity2char(cflag2parity(datenklo->termios.c_cflag)), cflag2stopbits(datenklo->termios.c_cflag));
+ LOGP(DDATENKLO, LOGL_INFO, "Terminal changes serial mode to %d%c%d.\n", cflag2databits(datenklo->termios.c_cflag), parity2char(cflag2parity(datenklo->termios.c_cflag)), cflag2stopbits(datenklo->termios.c_cflag));
rc = uart_init(&datenklo->uart, datenklo, cflag2databits(datenklo->termios.c_cflag), cflag2parity(datenklo->termios.c_cflag), cflag2stopbits(datenklo->termios.c_cflag), tx, rx);
if (rc < 0)
- PDEBUG(DDATENKLO, DEBUG_ERROR, "Failed to initialize UART.\n");
+ LOGP(DDATENKLO, LOGL_ERROR, "Failed to initialize UART.\n");
}
if (old_stopbits != new_stopbits
@@ -835,8 +837,8 @@ static void set_termios(datenklo_t *datenklo, const void *buf)
datenklo->onlret = new_onlret;
datenklo->olcuc = new_olcuc;
datenklo->echo = new_echo;
- PDEBUG(DDATENKLO, DEBUG_INFO, "Terminal sets serial flags:\n");
- PDEBUG(DDATENKLO, DEBUG_INFO, "%cignbrk %cparmrk %cistrip %cinlcr %cigncr %cicrnl %ciuclc %copost %conlcr %cocrnl %conlret %colcuc %cecho\n",
+ LOGP(DDATENKLO, LOGL_INFO, "Terminal sets serial flags:\n");
+ LOGP(DDATENKLO, LOGL_INFO, "%cignbrk %cparmrk %cistrip %cinlcr %cigncr %cicrnl %ciuclc %copost %conlcr %cocrnl %conlret %colcuc %cecho\n",
(datenklo->ignbrk) ? '+' : '-',
(datenklo->parmrk) ? '+' : '-',
(datenklo->istrip) ? '+' : '-',
@@ -862,7 +864,7 @@ static ssize_t dk_ioctl_set(void *inst, int cmd, const void *buf, size_t in_bufs
size_t space;
#ifdef HEAVY_DEBUG
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "Device has been written for ioctl (cmd = %d, size = %zu).\n", cmd, in_bufsz);
+ LOGP(DDATENKLO, LOGL_DEBUG, "Device has been written for ioctl (cmd = %d, size = %zu).\n", cmd, in_bufsz);
#endif
switch (cmd) {
@@ -870,7 +872,7 @@ static ssize_t dk_ioctl_set(void *inst, int cmd, const void *buf, size_t in_bufs
rc = sizeof(datenklo->termios);
if (!in_bufsz)
break;
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "Terminal sets termios now.\n");
+ LOGP(DDATENKLO, LOGL_DEBUG, "Terminal sets termios now.\n");
set_termios(datenklo, buf);
break;
case TCSETSW:
@@ -878,9 +880,9 @@ static ssize_t dk_ioctl_set(void *inst, int cmd, const void *buf, size_t in_bufs
rc = sizeof(datenklo->termios);
if (!in_bufsz)
break;
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "Terminal sets termios after draining output buffer.\n");
+ LOGP(DDATENKLO, LOGL_DEBUG, "Terminal sets termios after draining output buffer.\n");
if (1 || datenklo->tx_fifo_out == datenklo->tx_fifo_in) {
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "Output buffer empty, applying termios now.\n");
+ LOGP(DDATENKLO, LOGL_DEBUG, "Output buffer empty, applying termios now.\n");
set_termios(datenklo, buf);
break;
}
@@ -895,12 +897,12 @@ static ssize_t dk_ioctl_set(void *inst, int cmd, const void *buf, size_t in_bufs
if (!in_bufsz)
break;
memcpy(&status, buf, rc);
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "Terminal flushes buffer (status = %d).\n", status);
+ LOGP(DDATENKLO, LOGL_DEBUG, "Terminal flushes buffer (status = %d).\n", status);
if (status == TCIOFLUSH || status == TCOFLUSH) {
flush_tx(datenklo);
if (!(datenklo->revents & POLLOUT)) {
/* tell cuse to write again */
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "Set POLLOUT (flushed)\n");
+ LOGP(DDATENKLO, LOGL_DEBUG, "Set POLLOUT (flushed)\n");
datenklo->revents |= POLLOUT;
device_set_poll_events(datenklo->device, datenklo->revents);
}
@@ -908,7 +910,7 @@ static ssize_t dk_ioctl_set(void *inst, int cmd, const void *buf, size_t in_bufs
if (status == TCIOFLUSH || status == TCIFLUSH) {
flush_rx(datenklo);
if ((datenklo->revents & POLLIN)) {
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "Reset POLLIN (flushed)\n");
+ LOGP(DDATENKLO, LOGL_DEBUG, "Reset POLLIN (flushed)\n");
datenklo->revents &= ~POLLIN;
device_set_poll_events(datenklo->device, datenklo->revents);
}
@@ -916,7 +918,7 @@ static ssize_t dk_ioctl_set(void *inst, int cmd, const void *buf, size_t in_bufs
break;
case TCSBRK:
rc = 0;
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "Terminal sends break\n");
+ LOGP(DDATENKLO, LOGL_DEBUG, "Terminal sends break\n");
datenklo->break_bits = tx_baud_rate(datenklo) * 3 / 10;
break;
case TCSBRKP:
@@ -924,7 +926,7 @@ static ssize_t dk_ioctl_set(void *inst, int cmd, const void *buf, size_t in_bufs
if (!in_bufsz)
break;
memcpy(&status, buf, rc);
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "Terminal sends break (duration = %d).\n", status);
+ LOGP(DDATENKLO, LOGL_DEBUG, "Terminal sends break (duration = %d).\n", status);
if (status == 0)
status = 3;
if (status > 30)
@@ -933,12 +935,12 @@ static ssize_t dk_ioctl_set(void *inst, int cmd, const void *buf, size_t in_bufs
break;
case TIOCSBRK:
rc = 0;
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "Terminal turns break on\n");
+ LOGP(DDATENKLO, LOGL_DEBUG, "Terminal turns break on\n");
datenklo->break_on = 1;
break;
case TIOCCBRK:
rc = 0;
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "Terminal turns break off\n");
+ LOGP(DDATENKLO, LOGL_DEBUG, "Terminal turns break off\n");
datenklo->break_on = 0;
break;
case TIOCMBIS:
@@ -946,7 +948,7 @@ static ssize_t dk_ioctl_set(void *inst, int cmd, const void *buf, size_t in_bufs
if (!in_bufsz)
break;
memcpy(&status, buf, rc);
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "Terminal sets line status (0x%x).\n", status);
+ LOGP(DDATENKLO, LOGL_DEBUG, "Terminal sets line status (0x%x).\n", status);
status = datenklo->lines | status;
set_lines(datenklo, status);
break;
@@ -955,7 +957,7 @@ static ssize_t dk_ioctl_set(void *inst, int cmd, const void *buf, size_t in_bufs
if (!in_bufsz)
break;
memcpy(&status, buf, rc);
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "Terminal clears line status (0x%x).\n", status);
+ LOGP(DDATENKLO, LOGL_DEBUG, "Terminal clears line status (0x%x).\n", status);
status = datenklo->lines & ~status;
set_lines(datenklo, status);
break;
@@ -964,30 +966,30 @@ static ssize_t dk_ioctl_set(void *inst, int cmd, const void *buf, size_t in_bufs
if (!in_bufsz)
break;
memcpy(&status, buf, rc);
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "Terminal specifies line status (0x%x).\n", status);
+ LOGP(DDATENKLO, LOGL_DEBUG, "Terminal specifies line status (0x%x).\n", status);
set_lines(datenklo, status);
break;
case TIOCGSID:
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "TIOGSID -> ENOTTY\n");
+ LOGP(DDATENKLO, LOGL_DEBUG, "TIOGSID -> ENOTTY\n");
rc = -ENOTTY;
break;
case TIOCGPGRP:
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "TIOCGPGRP -> ENOTTY\n");
+ LOGP(DDATENKLO, LOGL_DEBUG, "TIOCGPGRP -> ENOTTY\n");
rc = -ENOTTY;
break;
case TIOCSCTTY:
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "TIOCSCTTY -> ENOTTY\n");
+ LOGP(DDATENKLO, LOGL_DEBUG, "TIOCSCTTY -> ENOTTY\n");
rc = -ENOTTY;
break;
case TIOCSPGRP:
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "TIOCSPGRP -> ENOTTY\n");
+ LOGP(DDATENKLO, LOGL_DEBUG, "TIOCSPGRP -> ENOTTY\n");
rc = -ENOTTY;
break;
case TIOCSWINSZ:
rc = sizeof(struct winsize);
if (!in_bufsz)
break;
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "Terminal sets window size.\n");
+ LOGP(DDATENKLO, LOGL_DEBUG, "Terminal sets window size.\n");
break;
case TCXONC:
rc = sizeof(status);
@@ -996,15 +998,15 @@ static ssize_t dk_ioctl_set(void *inst, int cmd, const void *buf, size_t in_bufs
memcpy(&status, buf, rc);
switch (status) {
case TCOOFF:
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "Terminal turns off output.\n");
+ LOGP(DDATENKLO, LOGL_DEBUG, "Terminal turns off output.\n");
datenklo->output_off = 1;
break;
case TCOON:
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "Terminal turns on output.\n");
+ LOGP(DDATENKLO, LOGL_DEBUG, "Terminal turns on output.\n");
datenklo->output_off = 0;
break;
case TCIOFF:
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "Terminal turns off input.\n");
+ LOGP(DDATENKLO, LOGL_DEBUG, "Terminal turns off input.\n");
space = (datenklo->rx_fifo_out - datenklo->rx_fifo_in - 1 + datenklo->rx_fifo_size) % datenklo->rx_fifo_size;
if (space < 1)
break;
@@ -1012,7 +1014,7 @@ static ssize_t dk_ioctl_set(void *inst, int cmd, const void *buf, size_t in_bufs
datenklo->rx_fifo_in %= datenklo->rx_fifo_size;
break;
case TCION:
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "Terminal turns on input.\n");
+ LOGP(DDATENKLO, LOGL_DEBUG, "Terminal turns on input.\n");
space = (datenklo->rx_fifo_out - datenklo->rx_fifo_in - 1 + datenklo->rx_fifo_size) % datenklo->rx_fifo_size;
if (space < 1)
break;
@@ -1034,12 +1036,12 @@ static int dk_open(void *inst, int flags)
datenklo_t *datenklo = (datenklo_t *)inst;
if (datenklo->open_count) {
- PDEBUG(DDATENKLO, DEBUG_NOTICE, "Device is busy.\n");
+ LOGP(DDATENKLO, LOGL_NOTICE, "Device is busy.\n");
return -EBUSY;
}
datenklo->open_count++;
datenklo->flags = flags;
- PDEBUG(DDATENKLO, DEBUG_INFO, "Device has been opened.\n");
+ LOGP(DDATENKLO, LOGL_INFO, "Device has been opened.\n");
int status = datenklo->lines | TIOCM_DTR | TIOCM_RTS;
set_lines(datenklo, status);
@@ -1051,7 +1053,7 @@ static void dk_close(void *inst)
{
datenklo_t *datenklo = (datenklo_t *)inst;
- PDEBUG(DDATENKLO, DEBUG_INFO, "Device has been closed.\n");
+ LOGP(DDATENKLO, LOGL_INFO, "Device has been closed.\n");
datenklo->open_count--;
int status = datenklo->lines & ~(TIOCM_DTR | TIOCM_RTS);
set_lines(datenklo, status);
@@ -1071,7 +1073,7 @@ static void debug_data(const char *buf, int count)
count--;
}
text[i] = '\0';
- PDEBUG(DDATENKLO, DEBUG_DEBUG, " \"%s\"\n", text);
+ LOGP(DDATENKLO, LOGL_DEBUG, " \"%s\"\n", text);
}
}
@@ -1091,7 +1093,7 @@ static ssize_t dk_read(void *inst, char *buf, size_t size, int flags)
if (vmin && vtime) {
/* first: start timer */
if (!datenklo->vtimeout)
- timer_start(&datenklo->vtimer, (double)vtime * 0.1);
+ datenklo->vtimer_us = vtime * 100000; /* start timer in main loop */
/* no data: block (in blocking IO) */
if (fill == 0) {
/* special value to tell device there is no data right now, we have to block */
@@ -1104,7 +1106,7 @@ static ssize_t dk_read(void *inst, char *buf, size_t size, int flags)
}
/* enough data or timeout or nonblocking IO: stop timer and return what we have */
datenklo->vtimeout = 0;
- timer_stop(&datenklo->vtimer);
+ datenklo->vtimer_us = -1; /* stop timer in main loop */
}
/* both MIN and TIME are zero */
if (!vmin && !vtime) {
@@ -1117,7 +1119,7 @@ static ssize_t dk_read(void *inst, char *buf, size_t size, int flags)
if (!vmin && vtime) {
/* first: start timer */
if (!datenklo->vtimeout)
- timer_start(&datenklo->vtimer, (double)vtime * 0.1);
+ datenklo->vtimer_us = vtime * 100000; /* start timer in main loop */
if (fill == 0) {
/* no data and no timeout: block (in blocking IO) */
if (!datenklo->vtimeout) {
@@ -1130,7 +1132,7 @@ static ssize_t dk_read(void *inst, char *buf, size_t size, int flags)
}
/* data: stop timer and return what we have */
datenklo->vtimeout = 0;
- timer_stop(&datenklo->vtimer);
+ datenklo->vtimer_us = -1; /* stop timer in main loop */
}
/* MIN is nonzero, TIME is zero */
if (vmin && !vtime) {
@@ -1142,7 +1144,7 @@ static ssize_t dk_read(void *inst, char *buf, size_t size, int flags)
/* enough data in buffer: return what we have */
}
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "Device has been read from. (fill = %zu)\n", fill);
+ LOGP(DDATENKLO, LOGL_DEBUG, "Device has been read from. (fill = %zu)\n", fill);
/* get data from fifo */
count = 0;
@@ -1160,7 +1162,7 @@ static ssize_t dk_read(void *inst, char *buf, size_t size, int flags)
if (!fill) {
/* tell cuse not to read anymore */
if ((datenklo->revents & POLLIN)) {
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "Reset POLLIN (now empty)!\n");
+ LOGP(DDATENKLO, LOGL_DEBUG, "Reset POLLIN (now empty)!\n");
datenklo->revents &= ~POLLIN;
device_set_poll_events(datenklo->device, datenklo->revents);
}
@@ -1177,17 +1179,17 @@ static ssize_t dk_write(void *inst, const char *buf, size_t size, int __attribut
size_t i;
if (!(datenklo->lines & TIOCM_DTR)) {
- PDEBUG(DDATENKLO, DEBUG_INFO, "Dropping data, DTR is off!\n");
+ LOGP(DDATENKLO, LOGL_INFO, "Dropping data, DTR is off!\n");
return -EIO;
}
if (!(datenklo->lines & TIOCM_RTS)) {
- PDEBUG(DDATENKLO, DEBUG_INFO, "Dropping data, RTS is off!\n");
+ LOGP(DDATENKLO, LOGL_INFO, "Dropping data, RTS is off!\n");
return -EIO;
}
if (size > (size_t)datenklo->tx_fifo_size - 1) {
- PDEBUG(DDATENKLO, DEBUG_NOTICE, "Device sends us too many data. (size = %zu)\n", size);
+ LOGP(DDATENKLO, LOGL_NOTICE, "Device sends us too many data. (size = %zu)\n", size);
return -EIO;
}
@@ -1199,7 +1201,7 @@ static ssize_t dk_write(void *inst, const char *buf, size_t size, int __attribut
return -EAGAIN;
}
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "Device has been written to. (space = %zu)\n", space);
+ LOGP(DDATENKLO, LOGL_DEBUG, "Device has been written to. (space = %zu)\n", space);
debug_data(buf, size);
if (datenklo->auto_rts)
@@ -1215,7 +1217,7 @@ static ssize_t dk_write(void *inst, const char *buf, size_t size, int __attribut
if ((datenklo->revents & POLLOUT) && fill >= (size_t)datenklo->tx_fifo_full) {
/* tell cuse not to write */
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "Reset POLLOUT (buffer full)\n");
+ LOGP(DDATENKLO, LOGL_DEBUG, "Reset POLLOUT (buffer full)\n");
datenklo->revents &= ~POLLOUT;
device_set_poll_events(datenklo->device, datenklo->revents);
}
@@ -1227,7 +1229,7 @@ static void dk_flush_tx(void *inst)
{
datenklo_t *datenklo = (datenklo_t *)inst;
- PDEBUG(DDATENKLO, DEBUG_INFO, "Terminal sends interrupt while writing, flushing TX buffer\n");
+ LOGP(DDATENKLO, LOGL_INFO, "Terminal sends interrupt while writing, flushing TX buffer\n");
flush_tx(datenklo);
}
@@ -1244,7 +1246,7 @@ static void dk_unlock(void)
}
/* signal handler to exit */
-void sighandler(int sigset)
+static void sighandler(int sigset)
{
if (sigset == SIGHUP)
return;
@@ -1257,9 +1259,9 @@ void sighandler(int sigset)
}
/* vtimer */
-static void vtime_timeout(struct timer *timer)
+static void vtime_timeout(void *data)
{
- datenklo_t *datenklo = (datenklo_t *)timer->priv;
+ datenklo_t *datenklo = data;
/* check if there is enough data to read */
datenklo->vtimeout = 1;
@@ -1270,7 +1272,7 @@ static void vtime_timeout(struct timer *timer)
void datenklo_init_global(void)
{
if (pthread_mutex_init(&mutex, NULL)) {
- PDEBUG(DDATENKLO, DEBUG_ERROR, "Failed to init mutex.\n");
+ LOGP(DDATENKLO, LOGL_ERROR, "Failed to init mutex.\n");
exit(0);
}
}
@@ -1282,7 +1284,7 @@ int datenklo_init(datenklo_t *datenklo, const char *dev_name, enum am791x_type a
tcflag_t flag;
cc_t *cc;
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "Creating Datenklo instance.\n");
+ LOGP(DDATENKLO, LOGL_DEBUG, "Creating Datenklo instance.\n");
memset(datenklo, 0, sizeof(*datenklo));
@@ -1332,7 +1334,7 @@ int datenklo_init(datenklo_t *datenklo, const char *dev_name, enum am791x_type a
datenklo->device = device_init(datenklo, dev_name, dk_open, dk_close, dk_read, dk_write, dk_ioctl_get, dk_ioctl_set, dk_flush_tx, dk_lock, dk_unlock);
if (!datenklo->device) {
- PDEBUG(DDATENKLO, DEBUG_ERROR, "Failed to attach virtual device '%s' using cuse.\n", dev_name);
+ LOGP(DDATENKLO, LOGL_ERROR, "Failed to attach virtual device '%s' using cuse.\n", dev_name);
rc = -errno;
goto error;
}
@@ -1342,7 +1344,7 @@ int datenklo_init(datenklo_t *datenklo, const char *dev_name, enum am791x_type a
datenklo->baudrate = cflag2baud(datenklo->termios.c_cflag);
rc = am791x_init(&datenklo->am791x, datenklo, am791x_type, datenklo->mc, datenklo->samplerate, tx_baud_rate(datenklo), rx_baud_rate(datenklo), cts, bcts, cd, bcd, td, btd, rd, brd);
if (rc < 0) {
- PDEBUG(DDATENKLO, DEBUG_ERROR, "Failed to initialize AM791X modem chip.\n");
+ LOGP(DDATENKLO, LOGL_ERROR, "Failed to initialize AM791X modem chip.\n");
goto error;
}
@@ -1352,16 +1354,16 @@ int datenklo_init(datenklo_t *datenklo, const char *dev_name, enum am791x_type a
datenklo->tx_fifo = calloc(datenklo->tx_fifo_size, 1);
datenklo->rx_fifo = calloc(datenklo->rx_fifo_size, 1);
if (!datenklo->tx_fifo || !datenklo->rx_fifo) {
- PDEBUG(DDATENKLO, DEBUG_ERROR, "No mem!\n");
+ LOGP(DDATENKLO, LOGL_ERROR, "No mem!\n");
rc = -ENOMEM;
goto error;
}
- timer_init(&datenklo->vtimer, vtime_timeout, datenklo);
+ osmo_timer_setup(&datenklo->vtimer, vtime_timeout, datenklo);
rc = uart_init(&datenklo->uart, datenklo, cflag2databits(datenklo->termios.c_cflag), cflag2parity(datenklo->termios.c_cflag), cflag2stopbits(datenklo->termios.c_cflag), tx, rx);
if (rc < 0) {
- PDEBUG(DDATENKLO, DEBUG_ERROR, "Failed to initialize UART.\n");
+ LOGP(DDATENKLO, LOGL_ERROR, "Failed to initialize UART.\n");
goto error;
}
@@ -1395,9 +1397,9 @@ int datenklo_open_audio(datenklo_t *datenklo, const char *audiodev, int buffer,
#ifdef HAVE_ALSA
/* init sound */
- datenklo->audio = sound_open(audiodev, NULL, NULL, NULL, channels, 0.0, datenklo->samplerate, datenklo->buffer_size, 1.0, 1.0, 4000.0, 2.0);
+ datenklo->audio = sound_open(SOUND_DIR_DUPLEX, audiodev, NULL, NULL, NULL, channels, 0.0, datenklo->samplerate, datenklo->buffer_size, 1.0, 1.0, 4000.0, 2.0);
if (!datenklo->audio) {
- PDEBUG(DDATENKLO, DEBUG_ERROR, "No sound device!\n");
+ LOGP(DDATENKLO, LOGL_ERROR, "No sound device!\n");
return -EIO;
}
#endif
@@ -1405,28 +1407,28 @@ int datenklo_open_audio(datenklo_t *datenklo, const char *audiodev, int buffer,
if (write_rx_wave) {
rc = wave_create_record(&datenklo->wave_rx_rec, write_rx_wave, datenklo->samplerate, channels, 1.0);
if (rc < 0) {
- PDEBUG(DDATENKLO, DEBUG_ERROR, "Failed to create WAVE recoding instance!\n");
+ LOGP(DDATENKLO, LOGL_ERROR, "Failed to create WAVE recoding instance!\n");
return rc;
}
}
if (write_tx_wave) {
rc = wave_create_record(&datenklo->wave_tx_rec, write_tx_wave, datenklo->samplerate, channels, 1.0);
if (rc < 0) {
- PDEBUG(DDATENKLO, DEBUG_ERROR, "Failed to create WAVE recoding instance!\n");
+ LOGP(DDATENKLO, LOGL_ERROR, "Failed to create WAVE recoding instance!\n");
return rc;
}
}
if (read_rx_wave) {
rc = wave_create_playback(&datenklo->wave_rx_play, read_rx_wave, &datenklo->samplerate, &channels, 1.0);
if (rc < 0) {
- PDEBUG(DDATENKLO, DEBUG_ERROR, "Failed to create WAVE playback instance!\n");
+ LOGP(DDATENKLO, LOGL_ERROR, "Failed to create WAVE playback instance!\n");
return rc;
}
}
if (read_tx_wave) {
rc = wave_create_playback(&datenklo->wave_tx_play, read_tx_wave, &datenklo->samplerate, &channels, 1.0);
if (rc < 0) {
- PDEBUG(DDATENKLO, DEBUG_ERROR, "Failed to create WAVE playback instance!\n");
+ LOGP(DDATENKLO, LOGL_ERROR, "Failed to create WAVE playback instance!\n");
return rc;
}
}
@@ -1520,15 +1522,23 @@ void datenklo_main(datenklo_t *datenklo, int loopback)
if (num_chan > 1)
process_auto_rts(datenklo->slave);
- /* process timers */
- process_timer();
+ /* Timers may only be processed in main thread, because libosmocore has timer lists for individual threads. */
+ if (datenklo->vtimer_us < 0)
+ osmo_timer_del(&datenklo->vtimer);
+ if (datenklo->vtimer_us > 0)
+ osmo_timer_schedule(&datenklo->vtimer, datenklo->vtimer_us / 1000000,datenklo->vtimer_us % 1000000);
+ datenklo->vtimer_us = 0;
+
+ am791x_add_del_timers(&datenklo->am791x);
+
+ osmo_select_main(1);
#ifdef HAVE_ALSA
count = sound_read(datenklo->audio, samples, datenklo->buffer_size, num_chan, rf_level_db);
if (count < 0) {
- PDEBUG(DDSP, DEBUG_ERROR, "Failed to read RX data from audio device (rc = %d)\n", count);
+ LOGP(DDSP, LOGL_ERROR, "Failed to read RX data from audio device (rc = %d)\n", count);
if (count == -EPIPE) {
- PDEBUG(DDATENKLO, DEBUG_ERROR, "Trying to recover!\n");
+ LOGP(DDATENKLO, LOGL_ERROR, "Trying to recover!\n");
continue;
}
break;
@@ -1561,9 +1571,9 @@ void datenklo_main(datenklo_t *datenklo, int loopback)
count = samplerate / 1000;
#endif
if (count < 0) {
- PDEBUG(DDSP, DEBUG_ERROR, "Failed to get number of samples in buffer (rc = %d)!\n", count);
+ LOGP(DDSP, LOGL_ERROR, "Failed to get number of samples in buffer (rc = %d)!\n", count);
if (count == -EPIPE) {
- PDEBUG(DDATENKLO, DEBUG_ERROR, "Trying to recover!\n");
+ LOGP(DDATENKLO, LOGL_ERROR, "Trying to recover!\n");
continue;
}
break;
@@ -1611,9 +1621,9 @@ void datenklo_main(datenklo_t *datenklo, int loopback)
/* write audio */
rc = sound_write(datenklo->audio, samples, power, count, NULL, NULL, num_chan);
if (rc < 0) {
- PDEBUG(DDSP, DEBUG_ERROR, "Failed to write TX data to audio device (rc = %d)\n", rc);
+ LOGP(DDSP, LOGL_ERROR, "Failed to write TX data to audio device (rc = %d)\n", rc);
if (rc == -EPIPE) {
- PDEBUG(DDATENKLO, DEBUG_ERROR, "Trying to recover!\n");
+ LOGP(DDATENKLO, LOGL_ERROR, "Trying to recover!\n");
continue;
}
break;
@@ -1625,8 +1635,6 @@ next_char:
switch (c) {
case 3:
/* quit */
- if (clear_console_text)
- clear_console_text();
printf("CTRL+c received, quitting!\n");
quit = 1;
goto next_char;
@@ -1655,10 +1663,6 @@ next_char:
pthread_mutex_lock(&mutex);
}
- /* get rid of last entry */
- if (clear_console_text)
- clear_console_text();
-
/* reset terminal */
tcsetattr(0, TCSANOW, &term_orig);
@@ -1668,15 +1672,18 @@ next_char:
signal(SIGTERM, SIG_DFL);
signal(SIGPIPE, SIG_DFL);
+ display_measurements_on(0);
+ display_wave_on(0);
+
pthread_mutex_unlock(&mutex);
}
/* cleanup function */
void datenklo_exit(datenklo_t *datenklo)
{
- PDEBUG(DDATENKLO, DEBUG_DEBUG, "Destroying Datenklo instance.\n");
+ LOGP(DDATENKLO, LOGL_DEBUG, "Destroying Datenklo instance.\n");
- timer_exit(&datenklo->vtimer);
+ osmo_timer_del(&datenklo->vtimer);
/* exit device */
if (datenklo->device)
diff --git a/src/datenklo/datenklo.h b/src/datenklo/datenklo.h
index 31acf72..2ec3a6f 100644
--- a/src/datenklo/datenklo.h
+++ b/src/datenklo/datenklo.h
@@ -52,7 +52,8 @@ typedef struct datenklo {
int auto_rts_cts; /* CTS was indicated */
int auto_rts_cd; /* CD was indicated */
int output_off; /* output stopped by flow control */
- struct timer vtimer; /* VTIME timer */
+ struct osmo_timer_list vtimer; /* VTIME timer */
+ int vtimer_us; /* time to stat / flag to stop */
int vtimeout; /* when timeout has fired */
/* data fifos */
diff --git a/src/datenklo/device.c b/src/datenklo/device.c
index 462c08e..765e184 100644
--- a/src/datenklo/device.c
+++ b/src/datenklo/device.c
@@ -27,7 +27,7 @@
#include <string.h>
#include <unistd.h>
#include <errno.h>
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#define __USE_GNU
#include <pthread.h>
#include <signal.h>
@@ -122,7 +122,7 @@ static void cuse_read_interrupt(fuse_req_t req, void *data)
if (!device->read_locked)
device->lock_cb();
- PDEBUG(DDEVICE, DEBUG_DEBUG, "%s received interrupt from client!\n", device->name);
+ LOGP(DDEVICE, LOGL_DEBUG, "%s received interrupt from client!\n", device->name);
if (device->read_req) {
device->read_req = NULL;
@@ -167,7 +167,7 @@ static void cuse_device_read(fuse_req_t req, size_t size, off_t off, struct fuse
if (device->read_req) {
device->unlock_cb();
- PDEBUG(DDEVICE, DEBUG_ERROR, "%s: Got another read(), while first read() has not been replied, please fix.\n", device->name);
+ LOGP(DDEVICE, LOGL_ERROR, "%s: Got another read(), while first read() has not been replied, please fix.\n", device->name);
fuse_reply_err(req, EBUSY);
return;
}
@@ -182,7 +182,7 @@ static void cuse_device_read(fuse_req_t req, size_t size, off_t off, struct fuse
/* this means that we block until modem's read() returns 0 or positive value (in nonblocking io, we return -EAGAIN) */
if (!(fi->flags & O_NONBLOCK) && count == -EAGAIN) {
- PDEBUG(DDEVICE, DEBUG_DEBUG, "%s has no data available, waiting for data, timer or interrupt.\n", device->name);
+ LOGP(DDEVICE, LOGL_DEBUG, "%s has no data available, waiting for data, timer or interrupt.\n", device->name);
device->read_req = req;
device->read_size = size;
@@ -216,7 +216,7 @@ static void cuse_write_interrupt(fuse_req_t req, void *data)
if (!device->write_locked)
device->lock_cb();
- PDEBUG(DDEVICE, DEBUG_DEBUG, "%s received interrupt from client!\n", device->name);
+ LOGP(DDEVICE, LOGL_DEBUG, "%s received interrupt from client!\n", device->name);
if (device->write_req) {
device->write_req = NULL;
@@ -262,7 +262,7 @@ static void cuse_device_write(fuse_req_t req, const char *buf, size_t size, off_
if (device->write_req) {
device->unlock_cb();
- PDEBUG(DDEVICE, DEBUG_ERROR, "%s: Got another write(), while first write() has not been replied, please fix.\n", device->name);
+ LOGP(DDEVICE, LOGL_ERROR, "%s: Got another write(), while first write() has not been replied, please fix.\n", device->name);
fuse_reply_err(req, EBUSY);
return;
}
@@ -271,13 +271,13 @@ static void cuse_device_write(fuse_req_t req, const char *buf, size_t size, off_
/* this means that we block until modem's write() returns 0 or positive value (in nonblocking io, we return -EAGAIN) */
if (!(fi->flags & O_NONBLOCK) && count == -EAGAIN) {
- PDEBUG(DDEVICE, DEBUG_DEBUG, "%s has no buffer space available, waiting for space or interrupt.\n", device->name);
+ LOGP(DDEVICE, LOGL_DEBUG, "%s has no buffer space available, waiting for space or interrupt.\n", device->name);
device->write_req = req;
device->write_size = size;
device->write_buf = malloc(size);
if (!buf) {
- PDEBUG(DDEVICE, DEBUG_ERROR, "No memory!\n");
+ LOGP(DDEVICE, LOGL_ERROR, "No memory!\n");
exit(0);
}
memcpy(device->write_buf, buf, size);
@@ -376,7 +376,7 @@ static void cuse_device_ioctl(fuse_req_t req, int cmd, void *arg, struct fuse_fi
}
break;
default:
- PDEBUG(DDEVICE, DEBUG_NOTICE, "%s: receives unknown ioctl: 0x%x\n", device->name, cmd);
+ LOGP(DDEVICE, LOGL_NOTICE, "%s: receives unknown ioctl: 0x%x\n", device->name, cmd);
fuse_reply_err(req, EINVAL);
}
}
@@ -432,7 +432,7 @@ static void cuse_device_flush(fuse_req_t req, struct fuse_file_info *fi)
(void)req;
(void)fi;
device_t *device = get_device_by_thread();
- PDEBUG(DDEVICE, DEBUG_NOTICE, "%s: unhandled flush\n", device->name);
+ LOGP(DDEVICE, LOGL_NOTICE, "%s: unhandled flush\n", device->name);
}
static void cuse_device_fsync(fuse_req_t req, int datasync, struct fuse_file_info *fi)
@@ -441,7 +441,7 @@ static void cuse_device_fsync(fuse_req_t req, int datasync, struct fuse_file_inf
(void)datasync;
(void)fi;
device_t *device = get_device_by_thread();
- PDEBUG(DDEVICE, DEBUG_NOTICE, "%s: unhandled fsync\n", device->name);
+ LOGP(DDEVICE, LOGL_NOTICE, "%s: unhandled fsync\n", device->name);
}
@@ -467,7 +467,7 @@ static void *device_child(void *arg)
const char *dev_info_argv[] = { dev_name };
struct cuse_info ci;
- strncat(dev_name, device->name, sizeof(dev_name) - strlen(device->name) - 1);
+ strncat(dev_name, device->name, sizeof(dev_name) - strlen(dev_name) - 1);
memset(&ci, 0, sizeof(ci));
ci.dev_major = device->major;
@@ -478,9 +478,9 @@ static void *device_child(void *arg)
device->thread_started = 1;
- PDEBUG(DDEVICE, DEBUG_INFO, "Device '%s' started.\n", device->name);
+ LOGP(DDEVICE, LOGL_INFO, "Device '%s' started.\n", device->name);
cuse_lowlevel_main(argc, argv, &ci, &cuse_device_clop, NULL);
- PDEBUG(DDEVICE, DEBUG_INFO, "Device '%s' terminated.\n", device->name);
+ LOGP(DDEVICE, LOGL_INFO, "Device '%s' terminated.\n", device->name);
device->thread_stopped = 1;
@@ -496,7 +496,7 @@ void *device_init(void *inst, const char *name, int (*open)(void *inst, int flag
device = calloc(1, sizeof(*device));
if (!device) {
- PDEBUG(DDEVICE, DEBUG_ERROR, "No memory!\n");
+ LOGP(DDEVICE, LOGL_ERROR, "No memory!\n");
errno = ENOMEM;
goto error;
}
@@ -514,13 +514,13 @@ void *device_init(void *inst, const char *name, int (*open)(void *inst, int flag
rc = pthread_create(&device->thread, NULL, device_child, device);
if (rc < 0) {
- PDEBUG(DDEVICE, DEBUG_ERROR, "Failed to create device thread!\n");
+ LOGP(DDEVICE, LOGL_ERROR, "Failed to create device thread!\n");
errno = -rc;
goto error;
}
pthread_getname_np(device->thread, tname, sizeof(tname));
- strncat(tname, "-device", sizeof(tname) - 7 - 1);
+ strncat(tname, "-device", sizeof(tname) - strlen(tname) - 1);
tname[sizeof(tname) - 1] = '\0';
pthread_setname_np(device->thread, tname);
diff --git a/src/datenklo/main.c b/src/datenklo/main.c
index 43a0b74..92d322d 100644
--- a/src/datenklo/main.c
+++ b/src/datenklo/main.c
@@ -26,9 +26,10 @@
#include <errno.h>
#include <math.h>
#include "../libsample/sample.h"
-#include "../libtimer/timer.h"
+#include <osmocom/core/timer.h>
+#include <osmocom/cc/misc.h>
#include "../liboptions/options.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../libfsk/fsk.h"
#include "../libwave/wave.h"
#include "../libdisplay/display.h"
@@ -49,6 +50,7 @@
/* dummy functions */
int num_kanal = 1; /* only one channel used for debugging */
+void *get_sender_by_empfangsfrequenz(void);
void *get_sender_by_empfangsfrequenz() { return "void"; }
static datenklo_t datenklo[MAX_DEVICES];
@@ -71,7 +73,7 @@ const char *write_rx_wave = NULL;
const char *read_tx_wave = NULL;
const char *read_rx_wave = NULL;
-void print_help(const char *arg0)
+static void print_help(const char *arg0)
{
printf("Usage: %s [options] -M <mode>\n\n", arg0);
/* - - */
@@ -80,6 +82,7 @@ void print_help(const char *arg0)
printf(" --config [~/]<path to config file>\n");
printf(" Give a config file to use. If it starts with '~/', path is at home dir.\n");
printf(" Each line in config file is one option, '-' or '--' must not be given!\n");
+ logging_print_help();
printf(" -T --am791x-type 7910 | 7911\n");
printf(" Give modem chip type. (Default = 791%d)\n", am791x_type);
printf(" -M --mc <mode>\n");
@@ -158,13 +161,11 @@ static int handle_options(int short_option, int argi, char **argv)
print_help(argv[0]);
return 0;
case 'v':
- if (!strcasecmp(argv[argi], "list")) {
- debug_list_cat();
+ rc = parse_logging_opt(argv[argi]);
+ if (rc > 0)
return 0;
- }
- rc = parse_debug_opt(argv[argi]);
if (rc < 0) {
- fprintf(stderr, "Failed to parse debug option, please use -h for help.\n");
+ fprintf(stderr, "Failed to parse logging option, please use -h for help.\n");
return rc;
}
break;
@@ -236,7 +237,7 @@ static int handle_options(int short_option, int argi, char **argv)
return 1;
}
-const char *inc_dev_name(const char *dev_name)
+static const char *inc_dev_name(const char *dev_name)
{
char *new_name, *number;
int integer;
@@ -265,6 +266,8 @@ int main(int argc, char *argv[])
int rc, argi;
int i;
+ logging_init();
+
/* handle options / config file */
add_options();
rc = options_config_file(argc, argv, "~/.osmocom/analog/datenklo.conf", handle_options);
@@ -325,3 +328,5 @@ fail:
return 0;
}
+void osmo_cc_set_log_cat(int __attribute__((unused)) cc_log_cat) {}
+
diff --git a/src/datenklo/uart.c b/src/datenklo/uart.c
index 1521410..b45f44a 100644
--- a/src/datenklo/uart.c
+++ b/src/datenklo/uart.c
@@ -21,7 +21,7 @@
#include <stdint.h>
#include <string.h>
#include <stdlib.h>
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "uart.h"
static uint32_t calc_parity(uint32_t data, uint8_t data_bits, enum uart_parity parity)
@@ -56,13 +56,13 @@ int uart_init(uart_t *uart, void *inst, uint8_t data_bits, enum uart_parity pari
uart->rx_cb = rx_cb;
uart->data_bits = data_bits;
if (uart->data_bits > 9) {
- PDEBUG(DUART, DEBUG_ERROR, "Illegal number of data bits, please fix!\n");
+ LOGP(DUART, LOGL_ERROR, "Illegal number of data bits, please fix!\n");
abort();
}
uart->parity = parity;
uart->stop_bits = stop_bits;
if (uart->stop_bits < 1 || uart->stop_bits > 2) {
- PDEBUG(DUART, DEBUG_ERROR, "Illegal number of stop bits, please fix!\n");
+ LOGP(DUART, LOGL_ERROR, "Illegal number of stop bits, please fix!\n");
abort();
}
uart->tx_pos = -1;
diff --git a/src/dcf77/Makefile.am b/src/dcf77/Makefile.am
index ce23ac8..610b0de 100644
--- a/src/dcf77/Makefile.am
+++ b/src/dcf77/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
if HAVE_ALSA
bin_PROGRAMS = \
@@ -13,13 +13,14 @@ dcf77_SOURCES = \
dcf77_LDADD = \
$(COMMON_LA) \
$(top_builddir)/src/liboptions/liboptions.a \
- $(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libdisplay/libdisplay.a \
$(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \
$(top_builddir)/src/libsound/libsound.a \
$(top_builddir)/src/libaaimage/libaaimage.a \
+ $(top_builddir)/src/liblogging/liblogging.a \
+ $(LIBOSMOCORE_LIBS) \
$(ALSA_LIBS) \
-lm
endif
diff --git a/src/dcf77/dcf77.c b/src/dcf77/dcf77.c
index 5314803..52b5770 100644
--- a/src/dcf77/dcf77.c
+++ b/src/dcf77/dcf77.c
@@ -26,7 +26,7 @@
#include <inttypes.h>
#include <stdlib.h>
#include <math.h>
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "dcf77.h"
#include "weather.h"
@@ -380,7 +380,7 @@ dcf77_t *dcf77_create(int samplerate, int use_tx, int use_rx, int test_tone)
dcf77 = calloc(1, sizeof(*dcf77));
if (!dcf77) {
- PDEBUG(DDCF77, DEBUG_ERROR, "No mem!\n");
+ LOGP(DDCF77, LOGL_ERROR, "No mem!\n");
return NULL;
}
tx = &dcf77->tx;
@@ -429,7 +429,7 @@ dcf77_t *dcf77_create(int samplerate, int use_tx, int use_rx, int test_tone)
rx->delay_size = ceil((double)SAMPLE_CLOCK * 0.1);
rx->delay_buffer = calloc(rx->delay_size, sizeof(*rx->delay_buffer));
if (!rx->delay_buffer) {
- PDEBUG(DDCF77, DEBUG_ERROR, "No mem!\n");
+ LOGP(DDCF77, LOGL_ERROR, "No mem!\n");
return NULL;
}
@@ -444,9 +444,9 @@ dcf77_t *dcf77_create(int samplerate, int use_tx, int use_rx, int test_tone)
}
if (tx->enable)
- PDEBUG(DDCF77, DEBUG_INFO, "DCF77 transmitter has been created.\n");
+ LOGP(DDCF77, LOGL_INFO, "DCF77 transmitter has been created.\n");
if (rx->enable)
- PDEBUG(DDCF77, DEBUG_INFO, "DCF77 receiver has been created.\n");
+ LOGP(DDCF77, LOGL_INFO, "DCF77 receiver has been created.\n");
#if 0
void rx_frame_test(dcf77_t *dcf77, const char *string);
@@ -467,7 +467,7 @@ void dcf77_destroy(dcf77_t *dcf77)
free(dcf77);
}
- PDEBUG(DDCF77, DEBUG_INFO, "DCF77 has been destroyed.\n");
+ LOGP(DDCF77, LOGL_INFO, "DCF77 has been destroyed.\n");
}
static void display_weather_temperature(const char *desc, uint32_t weather)
@@ -512,7 +512,7 @@ time_t dcf77_start_weather(time_t timestamp, int region, int offset)
hour = (19 + (region - 60) / 20) % 24;
}
min = (region % 20) * 3;
- PDEBUG(DDCF77, DEBUG_INFO, "Setting UTC time for region %d to %02d:%02d minutes.\n", region, hour, min);
+ LOGP(DDCF77, LOGL_INFO, "Setting UTC time for region %d to %02d:%02d minutes.\n", region, hour, min);
/* reset to 0:00 UTC at same day */
timestamp -= (timestamp % 86400);
@@ -521,7 +521,7 @@ time_t dcf77_start_weather(time_t timestamp, int region, int offset)
timestamp += hour * 3600 + min * 60;
/* substract offset */
- PDEBUG(DDCF77, DEBUG_INFO, "Setting timestamp offset to %d minutes.\n", offset);
+ LOGP(DDCF77, LOGL_INFO, "Setting timestamp offset to %d minutes.\n", offset);
timestamp -= 60 * offset;
return timestamp;
@@ -576,7 +576,7 @@ static uint64_t generate_weather(time_t timestamp, int minute, int utc_hour, int
/* generate weather data */
timestamp -= 120;
weather = 0;
- PDEBUG(DFRAME, DEBUG_INFO, "Encoding weather for dataset %d/480\n", dataset);
+ LOGP(DFRAME, LOGL_INFO, "Encoding weather for dataset %d/480\n", dataset);
printf("Peparing Weather INFO\n");
printf("---------------------\n");
printf("Time (UTC): %02d:%02d\n", (int)(timestamp / 3600) % 24, (int)(timestamp / 60) % 60);
@@ -694,14 +694,14 @@ static uint16_t tx_weather(dcf77_tx_t *tx, time_t timestamp, int minute, int hou
utc_hour += 24;
/* in index 0 we transmit minute + 1 (next minute), so we substract 1 */
tx->weather_cipher = generate_weather(timestamp, (minute + 59) % 60, utc_hour, tx->weather_day, tx->weather_night, tx->extreme, tx->rain, tx->wind_dir, tx->wind_bft, tx->temperature_day, tx->temperature_night);
- PDEBUG(DFRAME, DEBUG_INFO, "Transmitting first chunk of weather info.\n");
+ LOGP(DFRAME, LOGL_INFO, "Transmitting first chunk of weather info.\n");
chunk = (tx->weather_cipher & 0x3f) << 1; /* bit 2-7 */
chunk |= (tx->weather_cipher & 0x0fc0) << 2; /* bit 9-14 */
tx->weather_cipher >>= 12;
return chunk;
}
- PDEBUG(DFRAME, DEBUG_INFO, "Transmitting %s chunk of weather info.\n", (index == 1) ? "second" : "third");
+ LOGP(DFRAME, LOGL_INFO, "Transmitting %s chunk of weather info.\n", (index == 1) ? "second" : "third");
chunk = tx->weather_cipher & 0x3fff;
tx->weather_cipher >>= 14;
return chunk;
@@ -759,7 +759,7 @@ static char tx_symbol(dcf77_t *dcf77, time_t timestamp, int second)
else
zone = 2;
- PDEBUG(DDCF77, DEBUG_NOTICE, "The time transmitting: %s %s %d %02d:%02d:%02d %s %02d\n", week_day[wday], month_name[tm->tm_mon + 1], tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, time_zone[zone], tm->tm_year + 1900);
+ LOGP(DDCF77, LOGL_NOTICE, "The time transmitting: %s %s %d %02d:%02d:%02d %s %02d\n", week_day[wday], month_name[tm->tm_mon + 1], tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, time_zone[zone], tm->tm_year + 1900);
if ((tm->tm_isdst > 0) != (isdst_next_hour > 0))
frame |= (uint64_t)1 << 16;
@@ -808,9 +808,9 @@ static char tx_symbol(dcf77_t *dcf77, time_t timestamp, int second)
tx->data_string[j++] = '0' + ((frame >> i) & 1);
}
tx->data_string[j] = '\0';
- PDEBUG(DDSP, DEBUG_INFO, "Start transmission of frame:\n");
- PDEBUG(DDSP, DEBUG_INFO, "0 Wetterdaten Info 1 Minute P StundeP Tag WoT Monat Jahr P\n");
- PDEBUG(DDSP, DEBUG_INFO, "%s\n", tx->data_string);
+ LOGP(DDSP, LOGL_INFO, "Start transmission of frame:\n");
+ LOGP(DDSP, LOGL_INFO, "0 Wetterdaten Info 1 Minute P StundeP Tag WoT Monat Jahr P\n");
+ LOGP(DDSP, LOGL_INFO, "%s\n", tx->data_string);
}
if (second == 59)
@@ -818,7 +818,7 @@ static char tx_symbol(dcf77_t *dcf77, time_t timestamp, int second)
else
symbol = ((tx->data_frame >> second) & 1) + '0';
- PDEBUG(DDSP, DEBUG_DEBUG, "Trasmitting symbol '%c' (Bit %d)\n", symbol, second);
+ LOGP(DDSP, LOGL_DEBUG, "Trasmitting symbol '%c' (Bit %d)\n", symbol, second);
return symbol;
}
@@ -910,7 +910,7 @@ static void display_weather(uint32_t weather, int minute, int utc_hour)
int dataset = ((utc_hour + 2) % 24) * 20 + (minute / 3); /* data sets since 22:00 UTC */
int value;
- PDEBUG(DFRAME, DEBUG_INFO, "Decoding weather for dataset %d/480\n", dataset);
+ LOGP(DFRAME, LOGL_INFO, "Decoding weather for dataset %d/480\n", dataset);
printf("Received Weather INFO\n");
printf("---------------------\n");
printf("Time (UTC): %02d:%02d\n", utc_hour, minute);
@@ -985,7 +985,7 @@ static void rx_weather(dcf77_rx_t *rx, int minute, int hour, int zone, uint64_t
int32_t weather;
if (rx->weather_index == 0 && index != 0) {
- PDEBUG(DFRAME, DEBUG_INFO, "Skipping weather info chunk, waiting for new start of weather info.\n");
+ LOGP(DFRAME, LOGL_INFO, "Skipping weather info chunk, waiting for new start of weather info.\n");
return;
}
@@ -995,15 +995,15 @@ static void rx_weather(dcf77_rx_t *rx, int minute, int hour, int zone, uint64_t
rx->weather_cipher |= (frame >> 3) & 0x0fc0; /* bit 9-14 */
rx->weather_index++;
if (((frame & 0x0002)) || ((frame & 0x0100)) || !rx->weather_cipher) {
- PDEBUG(DFRAME, DEBUG_INFO, "There is no weather info in this received minute.\n");
+ LOGP(DFRAME, LOGL_INFO, "There is no weather info in this received minute.\n");
rx_weather_reset(rx);
return;
}
- PDEBUG(DFRAME, DEBUG_INFO, "Got first chunk of weather info.\n");
+ LOGP(DFRAME, LOGL_INFO, "Got first chunk of weather info.\n");
return;
}
if (rx->weather_index == 1 && index == 1) {
- PDEBUG(DFRAME, DEBUG_INFO, "Got second chunk of weather info.\n");
+ LOGP(DFRAME, LOGL_INFO, "Got second chunk of weather info.\n");
rx->weather_cipher |= (frame << 11) & 0x3fff000; /* bit 1-14 */
rx->weather_key |= (frame >> 21) & 0x7f;
rx->weather_key |= ((frame >> 29) & 0x3f) << 8;
@@ -1015,11 +1015,11 @@ static void rx_weather(dcf77_rx_t *rx, int minute, int hour, int zone, uint64_t
return;
}
if (rx->weather_index == 2 && index == 2) {
- PDEBUG(DFRAME, DEBUG_INFO, "Got third chunk of weather info.\n");
+ LOGP(DFRAME, LOGL_INFO, "Got third chunk of weather info.\n");
rx->weather_cipher |= (frame << 25) & 0xfffc000000; /* bit 1-14 */
weather = weather_decode(rx->weather_cipher, rx->weather_key);
if (weather < 0)
- PDEBUG(DFRAME, DEBUG_NOTICE, "Failed to decrypt weather info, checksum error.\n");
+ LOGP(DFRAME, LOGL_NOTICE, "Failed to decrypt weather info, checksum error.\n");
else {
/* convert hour to UTC */
utc_hour = hour - 1;
@@ -1035,7 +1035,7 @@ static void rx_weather(dcf77_rx_t *rx, int minute, int hour, int zone, uint64_t
}
rx_weather_reset(rx);
- PDEBUG(DFRAME, DEBUG_INFO, "Got weather info chunk out of order, waiting for new start of weather info.\n");
+ LOGP(DFRAME, LOGL_INFO, "Got weather info chunk out of order, waiting for new start of weather info.\n");
}
/* decode time from received data */
@@ -1050,14 +1050,14 @@ static void rx_frame(dcf77_rx_t *rx, uint64_t frame)
int year_one, year_ten, year = -1;
uint64_t p;
- PDEBUG(DFRAME, DEBUG_INFO, "Bit 0 is '0'? : %s\n", ((frame >> 0) & 1) ? "no" : "yes");
- PDEBUG(DFRAME, DEBUG_INFO, "Bits 1..14 : 0x%04x\n", (int)(frame >> 1) & 0x3fff);
- PDEBUG(DFRAME, DEBUG_INFO, "Call Bit : %d\n", (int)(frame >> 15) & 1);
- PDEBUG(DFRAME, DEBUG_INFO, "Change Time Zone : %s\n", ((frame >> 16) & 1) ? "yes" : "no");
+ LOGP(DFRAME, LOGL_INFO, "Bit 0 is '0'? : %s\n", ((frame >> 0) & 1) ? "no" : "yes");
+ LOGP(DFRAME, LOGL_INFO, "Bits 1..14 : 0x%04x\n", (int)(frame >> 1) & 0x3fff);
+ LOGP(DFRAME, LOGL_INFO, "Call Bit : %d\n", (int)(frame >> 15) & 1);
+ LOGP(DFRAME, LOGL_INFO, "Change Time Zone : %s\n", ((frame >> 16) & 1) ? "yes" : "no");
zone = ((frame >> 17) & 3);
- PDEBUG(DFRAME, DEBUG_INFO, "Time Zone : %s\n", time_zone[zone]);
- PDEBUG(DFRAME, DEBUG_INFO, "Add Leap Second : %s\n", ((frame >> 19) & 1) ? "yes" : "no");
- PDEBUG(DFRAME, DEBUG_INFO, "Bit 20 is '1'? : %s\n", ((frame >> 20) & 1) ? "yes" : "no");
+ LOGP(DFRAME, LOGL_INFO, "Time Zone : %s\n", time_zone[zone]);
+ LOGP(DFRAME, LOGL_INFO, "Add Leap Second : %s\n", ((frame >> 19) & 1) ? "yes" : "no");
+ LOGP(DFRAME, LOGL_INFO, "Bit 20 is '1'? : %s\n", ((frame >> 20) & 1) ? "yes" : "no");
minute_one = (frame >> 21 & 0xf);
minute_ten = ((frame >> 25) & 0x7);
@@ -1066,10 +1066,10 @@ static void rx_frame(dcf77_rx_t *rx, uint64_t frame)
p = p ^ (p >> 2);
p = p ^ (p >> 1);
if (minute_one > 9 || minute_ten > 5 || (p & 1))
- PDEBUG(DFRAME, DEBUG_INFO, "Minute : ???\n");
+ LOGP(DFRAME, LOGL_INFO, "Minute : ???\n");
else {
minute = minute_ten * 10 + minute_one;
- PDEBUG(DFRAME, DEBUG_INFO, "Minute : %02d\n", minute);
+ LOGP(DFRAME, LOGL_INFO, "Minute : %02d\n", minute);
}
hour_one = (frame >> 29 & 0xf);
@@ -1079,10 +1079,10 @@ static void rx_frame(dcf77_rx_t *rx, uint64_t frame)
p = p ^ (p >> 2);
p = p ^ (p >> 1);
if (hour_one > 9 || hour_ten > 2 || (hour_ten == 2 && hour_one > 3) || (p & 1))
- PDEBUG(DFRAME, DEBUG_INFO, "Hour : ???\n");
+ LOGP(DFRAME, LOGL_INFO, "Hour : ???\n");
else {
hour = hour_ten * 10 + hour_one;
- PDEBUG(DFRAME, DEBUG_INFO, "Hour : %02d\n", hour);
+ LOGP(DFRAME, LOGL_INFO, "Hour : %02d\n", hour);
}
day_one = (frame >> 36 & 0xf);
@@ -1099,40 +1099,41 @@ static void rx_frame(dcf77_rx_t *rx, uint64_t frame)
p = p ^ (p >> 2);
p = p ^ (p >> 1);
if (day_one > 9 || day_ten > 3 || (day_ten == 3 && day_one > 1) || (day_ten == 0 && day_one == 0) || (p & 1))
- PDEBUG(DFRAME, DEBUG_INFO, "Day : ???\n");
+ LOGP(DFRAME, LOGL_INFO, "Day : ???\n");
else {
day = day_ten * 10 + day_one;
- PDEBUG(DFRAME, DEBUG_INFO, "Day : %d\n", day);
+ LOGP(DFRAME, LOGL_INFO, "Day : %d\n", day);
}
if (wday < 1 || wday > 7 || (p & 1)) {
- PDEBUG(DFRAME, DEBUG_INFO, "Week Day : ???\n");
+ LOGP(DFRAME, LOGL_INFO, "Week Day : ???\n");
wday = -1;
} else
- PDEBUG(DFRAME, DEBUG_INFO, "Week Day : %s\n", week_day[wday]);
+ LOGP(DFRAME, LOGL_INFO, "Week Day : %s\n", week_day[wday]);
if (month_one > 9 || month_ten > 1 || (month_ten == 1 && month_one > 2) || (month_ten == 0 && month_one == 0) || (p & 1))
- PDEBUG(DFRAME, DEBUG_INFO, "Month : ???\n");
+ LOGP(DFRAME, LOGL_INFO, "Month : ???\n");
else {
month = month_ten * 10 + month_one;
- PDEBUG(DFRAME, DEBUG_INFO, "Month : %d\n", month);
+ LOGP(DFRAME, LOGL_INFO, "Month : %d\n", month);
}
if (year_one > 9 || year_ten > 9 || (p & 1))
- PDEBUG(DFRAME, DEBUG_INFO, "Year : ???\n");
+ LOGP(DFRAME, LOGL_INFO, "Year : ???\n");
else {
year = year_ten * 10 + year_one;
- PDEBUG(DFRAME, DEBUG_INFO, "Year : %02d\n", year);
+ LOGP(DFRAME, LOGL_INFO, "Year : %02d\n", year);
}
if (minute >= 0 && hour >= 0 && day >= 0 && wday >= 0 && month >= 0 && year >= 0) {
- PDEBUG(DDCF77, DEBUG_NOTICE, "The received time is: %s %s %d %02d:%02d:00 %s 20%02d\n", week_day[wday], month_name[month], day, hour, minute, time_zone[zone], year);
+ LOGP(DDCF77, LOGL_NOTICE, "The received time is: %s %s %d %02d:%02d:00 %s 20%02d\n", week_day[wday], month_name[month], day, hour, minute, time_zone[zone], year);
rx_weather(rx, minute, hour, zone, frame);
} else {
- PDEBUG(DDCF77, DEBUG_NOTICE, "The received time is invalid!\n");
+ LOGP(DDCF77, LOGL_NOTICE, "The received time is invalid!\n");
rx_weather_reset(rx);
}
}
+#if 0
/* test routing for test data */
-void rx_frame_test(dcf77_t *dcf77, const char *string)
+static void rx_frame_test(dcf77_t *dcf77, const char *string)
{
uint64_t frame = 0;
int i;
@@ -1144,6 +1145,7 @@ void rx_frame_test(dcf77_t *dcf77, const char *string)
rx_frame(&dcf77->rx, frame);
}
+#endif
/* receive one symbol = one second */
static void rx_symbol(dcf77_t *dcf77, char symbol)
@@ -1151,11 +1153,11 @@ static void rx_symbol(dcf77_t *dcf77, char symbol)
dcf77_rx_t *rx = &dcf77->rx;
double second = -NAN;
- PDEBUG(DDSP, DEBUG_DEBUG, "Received symbol '%c'\n", symbol);
+ LOGP(DDSP, LOGL_DEBUG, "Received symbol '%c'\n", symbol);
if (!rx->data_receive) {
if (symbol == 'm') {
- PDEBUG(DDSP, DEBUG_INFO, "Reception of frame has started\n");
+ LOGP(DDSP, LOGL_INFO, "Reception of frame has started\n");
rx->data_receive = 1;
rx->data_index = 0;
rx->string_index = 0;
@@ -1167,20 +1169,20 @@ static void rx_symbol(dcf77_t *dcf77, char symbol)
rx->data_string[rx->string_index] = '\0';
rx->data_index = 0;
rx->string_index = 0;
- PDEBUG(DDSP, DEBUG_INFO, "Received complete frame:\n");
- PDEBUG(DDSP, DEBUG_INFO, "0 Wetterdaten Info 1 Minute P StundeP Tag WoT Monat Jahr P\n");
- PDEBUG(DDSP, DEBUG_INFO, "%s\n", rx->data_string);
+ LOGP(DDSP, LOGL_INFO, "Received complete frame:\n");
+ LOGP(DDSP, LOGL_INFO, "0 Wetterdaten Info 1 Minute P StundeP Tag WoT Monat Jahr P\n");
+ LOGP(DDSP, LOGL_INFO, "%s\n", rx->data_string);
rx_frame(rx, rx->data_frame);
second = 0;
} else {
- PDEBUG(DDSP, DEBUG_INFO, "Short read, frame too short\n");
+ LOGP(DDSP, LOGL_INFO, "Short read, frame too short\n");
rx->data_index = 0;
rx->string_index = 0;
rx_weather_reset(rx);
}
} else {
if (rx->data_index == 59) {
- PDEBUG(DDSP, DEBUG_INFO, "Long read, frame too long\n");
+ LOGP(DDSP, LOGL_INFO, "Long read, frame too long\n");
rx->data_receive = 0;
rx_weather_reset(rx);
} else {
@@ -1312,5 +1314,3 @@ void dcf77_decode(dcf77_t *dcf77, sample_t *samples, int length)
}
}
-
-
diff --git a/src/dcf77/main.c b/src/dcf77/main.c
index c9d4dcc..156cb20 100755
--- a/src/dcf77/main.c
+++ b/src/dcf77/main.c
@@ -28,11 +28,12 @@
#include <sched.h>
#include <time.h>
#include <math.h>
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../liboptions/options.h"
#include "../libsample/sample.h"
#include "../libsound/sound.h"
#include "../libaaimage/aaimage.h"
+#include <osmocom/cc/misc.h>
#include "dcf77.h"
#include "cities.h"
@@ -57,10 +58,11 @@ static int region = -1, region_advance;
static int double_amplitude = 0;
static int test_tone = 0;
static int dsp_interval = 1; /* ms */
-static int rt_prio = 1;
+static int rt_prio = 0;
static int fast_math = 0;
/* not static, in case we add libtimer some day, then compiler hits an error */
+double get_time(void);
double get_time(void)
{
static struct timespec tv;
@@ -138,7 +140,7 @@ static void print_usage(const char *app)
printf("Usage: %s [-a hw:0,0] [<options>]\n", app);
}
-void print_help(void)
+static void print_help(void)
{
/* - - */
printf(" -h --help\n");
@@ -146,7 +148,7 @@ void print_help(void)
printf(" --config [~/]<path to config file>\n");
printf(" Give a config file to use. If it starts with '~/', path is at home dir.\n");
printf(" Each line in config file is one option, '-' or '--' must not be given!\n");
- debug_print_help();
+ logging_print_help();
printf(" -a --audio-device hw:<card>,<device>\n");
printf(" Sound card and device number (default = '%s')\n", dsp_device);
printf(" -s --samplerate <rate>\n");
@@ -253,13 +255,11 @@ static int handle_options(int short_option, int argi, char **argv)
print_help();
return 0;
case 'v':
- if (!strcasecmp(argv[argi], "list")) {
- debug_list_cat();
+ rc = parse_logging_opt(argv[argi]);
+ if (rc > 0)
return 0;
- }
- rc = parse_debug_opt(argv[argi]);
if (rc < 0) {
- fprintf(stderr, "Failed to parse debug option, please use -h for help.\n");
+ fprintf(stderr, "Failed to parse logging option, please use -h for help.\n");
return rc;
}
break;
@@ -413,30 +413,36 @@ static int get_char()
return -1;
}
-int soundif_open(const char *audiodev, int samplerate, int buffer_size)
+static int soundif_open(const char *audiodev, int samplerate, int buffer_size)
{
+ enum sound_direction direction = SOUND_DIR_DUPLEX;
+
if (!audiodev || !audiodev[0]) {
- PDEBUG(DDSP, DEBUG_ERROR, "No audio device given!\n");
+ LOGP(DDSP, LOGL_ERROR, "No audio device given!\n");
return -EINVAL;
}
/* open audiodev */
- soundif = sound_open(audiodev, NULL, NULL, NULL, (double_amplitude) ? 2 : 1, 0.0, samplerate, buffer_size, 1.0, 1.0, 0.0, 2.0);
+ if (tx && !rx)
+ direction = SOUND_DIR_PLAY;
+ if (rx && !tx)
+ direction = SOUND_DIR_REC;
+ soundif = sound_open(direction, audiodev, NULL, NULL, NULL, (double_amplitude) ? 2 : 1, 0.0, samplerate, buffer_size, 1.0, 1.0, 0.0, 2.0);
if (!soundif) {
- PDEBUG(DDSP, DEBUG_ERROR, "Failed to open sound device!\n");
+ LOGP(DDSP, LOGL_ERROR, "Failed to open sound device!\n");
return -EIO;
}
return 0;
}
-void soundif_start(void)
+static void soundif_start(void)
{
sound_start(soundif);
- PDEBUG(DDSP, DEBUG_DEBUG, "Starting audio stream!\n");
+ LOGP(DDSP, LOGL_DEBUG, "Starting audio stream!\n");
}
-void soundif_close(void)
+static void soundif_close(void)
{
/* close audiodev */
if (soundif) {
@@ -445,7 +451,7 @@ void soundif_close(void)
}
}
-void soundif_work(int buffer_size)
+static void soundif_work(int buffer_size)
{
int count;
sample_t buff1[buffer_size], buff2[buffer_size], *samples[2] = { buff1, buff2 };
@@ -453,34 +459,38 @@ void soundif_work(int buffer_size)
int rc;
int i;
- /* encode and write */
- count = sound_get_tosend(soundif, buffer_size);
- if (count < 0) {
- PDEBUG(DDSP, DEBUG_ERROR, "Failed to get number of samples in buffer (rc = %d)!\n", count);
- return;
- }
- if (count) {
- dcf77_encode(dcf77, samples[0], count);
- if (double_amplitude) {
- for (i = 0; i < count; i++)
- samples[1][i] = -samples[0][i];
- }
- rc = sound_write(soundif, samples, NULL, count, NULL, NULL, (double_amplitude) ? 2 : 1);
- if (rc < 0) {
- PDEBUG(DDSP, DEBUG_ERROR, "Failed to write TX data to audio device (rc = %d)\n", rc);
+ if (tx) {
+ /* encode and write */
+ count = sound_get_tosend(soundif, buffer_size);
+ if (count < 0) {
+ LOGP(DDSP, LOGL_ERROR, "Failed to get number of samples in buffer (rc = %d)!\n", count);
return;
}
+ if (count) {
+ dcf77_encode(dcf77, samples[0], count);
+ if (double_amplitude) {
+ for (i = 0; i < count; i++)
+ samples[1][i] = -samples[0][i];
+ }
+ rc = sound_write(soundif, samples, NULL, count, NULL, NULL, (double_amplitude) ? 2 : 1);
+ if (rc < 0) {
+ LOGP(DDSP, LOGL_ERROR, "Failed to write TX data to audio device (rc = %d)\n", rc);
+ return;
+ }
+ }
}
- /* read */
- count = sound_read(soundif, samples, buffer_size, 1, rf_level_db);
- if (count < 0) {
- PDEBUG(DDSP, DEBUG_ERROR, "Failed to read from audio device (rc = %d)!\n", count);
- return;
- }
+ if (rx) {
+ /* read */
+ count = sound_read(soundif, samples, buffer_size, 1, rf_level_db);
+ if (count < 0) {
+ LOGP(DDSP, LOGL_ERROR, "Failed to read from audio device (rc = %d)!\n", count);
+ return;
+ }
- /* decode */
- dcf77_decode(dcf77, samples[0], count);
+ /* decode */
+ dcf77_decode(dcf77, samples[0], count);
+ }
}
int main(int argc, char *argv[])
@@ -491,6 +501,8 @@ int main(int argc, char *argv[])
double begin_time, now, sleep;
char c;
+ logging_init();
+
/* handle options / config file */
add_options();
rc = options_config_file(argc, argv, "~/.osmocom/dcf77/dcf77.conf", handle_options);
@@ -539,6 +551,19 @@ int main(int argc, char *argv[])
timestamp = dcf77_start_weather((time_t)timestamp, region, region_advance);
}
+ /* set real time prio */
+ if (rt_prio) {
+ struct sched_param schedp;
+
+ memset(&schedp, 0, sizeof(schedp));
+ schedp.sched_priority = rt_prio;
+ rc = sched_setscheduler(0, SCHED_RR, &schedp);
+ if (rc) {
+ fprintf(stderr, "Error setting SCHED_RR with prio %d\n", rt_prio);
+ goto error;
+ }
+ }
+
print_aaimage();
printf("DCF77 ready.\n");
@@ -550,17 +575,6 @@ int main(int argc, char *argv[])
term.c_cc[VTIME]=2;
tcsetattr(0, TCSANOW, &term);
- /* set real time prio */
- if (rt_prio) {
- struct sched_param schedp;
-
- memset(&schedp, 0, sizeof(schedp));
- schedp.sched_priority = rt_prio;
- rc = sched_setscheduler(0, SCHED_RR, &schedp);
- if (rc)
- fprintf(stderr, "Error setting SCHED_RR with prio %d\n", rt_prio);
- }
-
signal(SIGINT, sighandler);
signal(SIGHUP, sighandler);
signal(SIGTERM, sighandler);
@@ -642,3 +656,5 @@ error:
return 0;
}
+void osmo_cc_set_log_cat(int __attribute__((unused)) cc_log_cat) {}
+
diff --git a/src/dcf77/weather.c b/src/dcf77/weather.c
index 41b7824..e893ce3 100644
--- a/src/dcf77/weather.c
+++ b/src/dcf77/weather.c
@@ -7,7 +7,7 @@ https://github.com/tobozo/esp32-dcf77-weatherman/blob/master/dcf77.cpp
#include <stdio.h>
#include <stdint.h>
#include <endian.h>
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "weather.h"
/// Container zum Konvertieren zwischen 4 Bytes und Uint.
@@ -536,9 +536,9 @@ int32_t weather_decode(uint64_t cipher, uint64_t key)
weather = GetWeatherFromPlain(PlainBytes);
#ifdef DEBUG_CIPER
- printf("cipher=%s\n", debug_hex(CipherBytes, 5));
- printf("key =%s\n", debug_hex(KeyBytes, 5));
- printf("plain =%s\n", debug_hex(PlainBytes, 5));
+ printf("cipher=%s\n", osmo_hexdump(CipherBytes, 5));
+ printf("key =%s\n", osmo_hexdump(KeyBytes, 5));
+ printf("plain =%s\n", osmo_hexdump(PlainBytes, 5));
if (weather < 0)
printf("weather=error\n");
else
@@ -569,9 +569,9 @@ uint64_t weather_encode(uint32_t weather, uint64_t key)
CipherBytes = Encrypt(PlainBytes, KeyBytes);
#ifdef DEBUG_CIPER
- printf("plain =%s\n", debug_hex(PlainBytes, 5));
- printf("key =%s\n", debug_hex(KeyBytes, 5));
- printf("cipher=%s\n", debug_hex(CipherBytes, 5));
+ printf("plain =%s\n", osmo_hexdump(PlainBytes, 5));
+ printf("key =%s\n", osmo_hexdump(KeyBytes, 5));
+ printf("cipher=%s\n", osmo_hexdump(CipherBytes, 5));
#endif
for (i = 0; i < 5; i++)
diff --git a/src/eurosignal/Makefile.am b/src/eurosignal/Makefile.am
index 9ec8837..aeb5dbb 100644
--- a/src/eurosignal/Makefile.am
+++ b/src/eurosignal/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
bin_PROGRAMS = \
eurosignal
@@ -16,12 +16,9 @@ eurosignal_LDADD = \
$(COMMON_LA) \
../anetz/libgermanton.a \
$(top_builddir)/src/liboptions/liboptions.a \
- $(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libmobile/libmobile.a \
- $(top_builddir)/src/libosmocc/libosmocc.a \
$(top_builddir)/src/libdisplay/libdisplay.a \
$(top_builddir)/src/libjitter/libjitter.a \
- $(top_builddir)/src/libtimer/libtimer.a \
$(top_builddir)/src/libsamplerate/libsamplerate.a \
$(top_builddir)/src/libemphasis/libemphasis.a \
$(top_builddir)/src/libfsk/libfsk.a \
@@ -29,8 +26,10 @@ eurosignal_LDADD = \
$(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \
- $(top_builddir)/src/libg711/libg711.a \
$(top_builddir)/src/libaaimage/libaaimage.a \
+ $(top_builddir)/src/liblogging/liblogging.a \
+ $(LIBOSMOCORE_LIBS) \
+ $(LIBOSMOCC_LIBS) \
-lm
if HAVE_ALSA
diff --git a/src/eurosignal/dsp.c b/src/eurosignal/dsp.c
index dc8bf92..619bb90 100644
--- a/src/eurosignal/dsp.c
+++ b/src/eurosignal/dsp.c
@@ -26,7 +26,7 @@
#include <errno.h>
#include <math.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "eurosignal.h"
#include "dsp.h"
@@ -105,11 +105,11 @@ void dsp_init(int samplerate)
{
int i;
- PDEBUG(DDSP, DEBUG_DEBUG, "Generating phase shiftings for tones.\n");
+ LOGP(DDSP, LOGL_DEBUG, "Generating phase shiftings for tones.\n");
for (i = 0; dsp_digits[i].digit; i++)
dsp_digits[i].phaseshift65536 = 65536.0 / ((double)samplerate / dsp_digits[i].frequency);
- PDEBUG(DDSP, DEBUG_DEBUG, "Generating sine table for tones.\n");
+ LOGP(DDSP, LOGL_DEBUG, "Generating sine table for tones.\n");
for (i = 0; i < 65536; i++)
dsp_tone[i] = sin((double)i / 65536.0 * 2.0 * PI);
}
@@ -119,7 +119,7 @@ int dsp_init_sender(euro_t *euro, int samplerate, int fm)
{
int rc = 0;
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Init DSP for 'Sender'.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Init DSP for 'Sender'.\n");
/* set modulation parameters */
if (fm)
@@ -154,13 +154,13 @@ error:
/* Cleanup transceiver instance. */
void dsp_cleanup_sender(euro_t *euro)
{
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Cleanup DSP for 'Sender'.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Cleanup DSP for 'Sender'.\n");
/* cleanup demodulator */
fm_demod_exit(&euro->rx_demod);
}
-//#define DEBUG
+//#define DEBUG_DECODER
static void tone_decode(euro_t *euro, sample_t *samples, int length)
{
@@ -179,14 +179,14 @@ static void tone_decode(euro_t *euro, sample_t *samples, int length)
for (i = 0; i < length; i++) {
/* get frequency */
f = frequency[i] + (FREQUENCY_MIN + FREQUENCY_MAX) / 2.0;
-#ifdef DEBUG
+#ifdef DEBUG_DECODER
if (i == 0) printf("%s %.5f ", debug_amplitude(frequency[i] / (FREQUENCY_MAX - FREQUENCY_MIN) * 2.0), f);
#endif
for (d = 0; dsp_digits[d].digit; d++) {
if (f >= dsp_digits[d].frequency - FREQUENCY_TOL && f <= dsp_digits[d].frequency + FREQUENCY_TOL)
break;
}
-#ifdef DEBUG
+#ifdef DEBUG_DECODER
if (i == 0) printf("%c\n", dsp_digits[d].digit);
#endif
@@ -201,7 +201,7 @@ static void tone_decode(euro_t *euro, sample_t *samples, int length)
case 'I':
/* pause tone */
if (euro->rx_digit_count == DIGIT_DETECT) {
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Detected Idle tone, starting.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Detected Idle tone, starting.\n");
euro->rx_digit_receiving = 1;
euro->rx_digit_index = 0;
euro->rx_timeout_count = 0;
@@ -213,7 +213,7 @@ static void tone_decode(euro_t *euro, sample_t *samples, int length)
break;
if (euro->rx_digit_count == DIGIT_DETECT) {
/* out of range tone */
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Detected tone out of range, aborting.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Detected tone out of range, aborting.\n");
euro->rx_digit_receiving = 0;
}
break;
@@ -225,7 +225,7 @@ static void tone_decode(euro_t *euro, sample_t *samples, int length)
if (euro->rx_digit_count == DIGIT_DETECT) {
double level;
level = sqrt(I[i] * I[i] + Q[i] * Q[i]) * 2;
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Detected digit '%s' (level = %.0f%%)\n", digit_to_name(digit), level * 100.0);
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Detected digit '%s' (level = %.0f%%)\n", digit_to_name(digit), level * 100.0);
display_measurements_update(euro->dmp_tone_level, level * 100.0, 0.0);
euro->rx_digits[euro->rx_digit_index] = digit;
euro->rx_digit_index++;
@@ -243,7 +243,7 @@ static void tone_decode(euro_t *euro, sample_t *samples, int length)
if (euro->rx_digit_receiving && euro->rx_digit_index) {
euro->rx_timeout_count++;
if (euro->rx_timeout_count == TIMEOUT_DETECT) {
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Timeout receiving, aborting.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Timeout receiving, aborting.\n");
euro->rx_digit_receiving = 0;
}
}
@@ -280,18 +280,18 @@ static void tone_send(euro_t *euro, sample_t *samples, int length)
euro->tx_time -= PAUSE_DURATION;
euro_get_id(euro, euro->tx_digits);
euro->tx_digit_index = 0;
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Sending digit '%s'\n", digit_to_name(euro->tx_digits[0]));
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Sending digit '%s'\n", digit_to_name(euro->tx_digits[0]));
euro->tx_phaseshift65536 = digit_to_phaseshift65536(euro->tx_digits[0]);
}
} else {
if (euro->tx_time >= DIGIT_DURATION) {
euro->tx_time -= DIGIT_DURATION;
if (++euro->tx_digit_index == 6) {
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Sending Idle tone'\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Sending Idle tone'\n");
euro->tx_digits[0] = '\0';
euro->tx_phaseshift65536 = digit_to_phaseshift65536('I');
} else {
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Sending digit '%s'\n", digit_to_name(euro->tx_digits[euro->tx_digit_index]));
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Sending digit '%s'\n", digit_to_name(euro->tx_digits[euro->tx_digit_index]));
euro->tx_phaseshift65536 = digit_to_phaseshift65536(euro->tx_digits[euro->tx_digit_index]);
}
}
diff --git a/src/eurosignal/es_ges.c b/src/eurosignal/es_ges.c
index 7e3c58b..59ec760 100644
--- a/src/eurosignal/es_ges.c
+++ b/src/eurosignal/es_ges.c
@@ -1,4 +1,5 @@
#include <stdint.h>
+#include "es_ges.h"
static int16_t pattern[] = {
0x003f, 0xff8e, 0x0092, 0x0097, 0x001f, 0x0048, 0xffd9, 0xffdb,
diff --git a/src/eurosignal/es_kaudn.c b/src/eurosignal/es_kaudn.c
index e4cad88..6e376f5 100644
--- a/src/eurosignal/es_kaudn.c
+++ b/src/eurosignal/es_kaudn.c
@@ -1,4 +1,5 @@
#include <stdint.h>
+#include "es_kaudn.h"
static int16_t pattern[] = {
0x0022, 0x0014, 0xffde, 0xff85, 0xff24, 0xff00, 0xff2c, 0xff88,
diff --git a/src/eurosignal/es_mitte.c b/src/eurosignal/es_mitte.c
index d959002..0ea983a 100644
--- a/src/eurosignal/es_mitte.c
+++ b/src/eurosignal/es_mitte.c
@@ -1,4 +1,5 @@
#include <stdint.h>
+#include "es_mitte.h"
static int16_t pattern[] = {
0xff96, 0xffd4, 0x0020, 0x0073, 0x0084, 0x0061, 0x002f, 0xfffd,
diff --git a/src/eurosignal/es_teilges.c b/src/eurosignal/es_teilges.c
index eab20f1..a4e2296 100644
--- a/src/eurosignal/es_teilges.c
+++ b/src/eurosignal/es_teilges.c
@@ -1,4 +1,5 @@
#include <stdint.h>
+#include "es_teilges.h"
static int16_t pattern[] = {
0xffa4, 0xffae, 0xffc2, 0xff8a, 0xffb4, 0xfff0, 0xfffa, 0x0005,
diff --git a/src/eurosignal/eurosignal.c b/src/eurosignal/eurosignal.c
index 7ab3074..de22668 100644
--- a/src/eurosignal/eurosignal.c
+++ b/src/eurosignal/eurosignal.c
@@ -26,22 +26,22 @@
#include <errno.h>
#include <math.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 <osmocom/cc/message.h>
#include "eurosignal.h"
#include "dsp.h"
/* announcement timers */
-#define ANSWER_TIME 1.0 /* wait after answer */
-#define OOO_TIME 3.8 /* announcement 1.7 s, pause 2.1 s */
-#define UNASSIGNED_TIME1 2.2 /* announcement 2.2 s s */
-#define UNASSIGNED_TIME2 2.9 /* announcement 2.2 s, pause 0.7 s */
-#define DEGRADED_TIME 4.95 /* announcement 2.25 s, pause 2.7 s */
-#define ACKNOWLEDGE_TIME1 2.8 /* announcement 1.7 s, pause 1.1 s */
-#define ACKNOWLEDGE_TIME2 4.6 /* announcement 1.7 s, pause 2.9 s */
-#define BEEP_TIME 4.0 /* beep after answer */
+#define ANSWER_TIME 1,0 /* wait after answer */
+#define OOO_TIME 3,800000 /* announcement 1.7 s, pause 2.1 s */
+#define UNASSIGNED_TIME1 2,200000 /* announcement 2.2 s s */
+#define UNASSIGNED_TIME2 2,900000 /* announcement 2.2 s, pause 0.7 s */
+#define DEGRADED_TIME 4,950000 /* announcement 2.25 s, pause 2.7 s */
+#define ACKNOWLEDGE_TIME1 2,800000 /* announcement 1.7 s, pause 1.1 s */
+#define ACKNOWLEDGE_TIME2 4,600000 /* announcement 1.7 s, pause 2.9 s */
+#define BEEP_TIME 4,000000 /* beep after answer */
/* these calls are not associated with a transmitter */
euro_call_t *ooo_call_list = NULL;
@@ -149,7 +149,7 @@ static void call_new_state(euro_call_t *call, enum euro_call_state new_state)
{
if (call->state == new_state)
return;
- PDEBUG(DEURO, DEBUG_DEBUG, "State change: %s -> %s\n", call_state_name(call->state), call_state_name(new_state));
+ LOGP(DEURO, LOGL_DEBUG, "State change: %s -> %s\n", call_state_name(call->state), call_state_name(new_state));
call->state = new_state;
euro_display_status();
}
@@ -234,7 +234,7 @@ void euro_exit(void)
flush_id();
}
-static void call_timeout(struct timer *timer);
+static void call_timeout(void *data);
/* Create transceiver instance and link to a list. */
int euro_create(const char *kanal, const char *device, int use_sdr, int samplerate, double rx_gain, double tx_gain, int fm, int tx, int rx, int repeat, int degraded, int random, uint32_t scan_from, uint32_t scan_to, const char *write_rx_wave, const char *write_tx_wave, const char *read_rx_wave, const char *read_tx_wave, int loopback)
@@ -243,29 +243,29 @@ int euro_create(const char *kanal, const char *device, int use_sdr, int samplera
int rc;
if (euro_kanal2freq(kanal, 0) == 0.0) {
- PDEBUG(DEURO, DEBUG_ERROR, "Channel ('Kanal') number %s invalid, use 'list' to get a list.\n", kanal);
+ LOGP(DEURO, LOGL_ERROR, "Channel ('Kanal') number %s invalid, use 'list' to get a list.\n", kanal);
return -EINVAL;
}
euro = calloc(1, sizeof(*euro));
if (!euro) {
- PDEBUG(DEURO, DEBUG_ERROR, "No memory!\n");
+ LOGP(DEURO, LOGL_ERROR, "No memory!\n");
return -ENOMEM;
}
- PDEBUG(DEURO, DEBUG_DEBUG, "Creating 'Eurosignal' instance for 'Kanal' = %s (sample rate %d).\n", kanal, samplerate);
+ LOGP(DEURO, LOGL_DEBUG, "Creating 'Eurosignal' instance for 'Kanal' = %s (sample rate %d).\n", kanal, samplerate);
/* init general part of transceiver */
rc = sender_create(&euro->sender, kanal, euro_kanal2freq(kanal, fm), euro_kanal2freq(kanal, fm), device, use_sdr, samplerate, rx_gain, tx_gain, 0, 0, write_rx_wave, write_tx_wave, read_rx_wave, read_tx_wave, loopback, PAGING_SIGNAL_NONE);
if (rc < 0) {
- PDEBUG(DEURO, DEBUG_ERROR, "Failed to init transceiver process!\n");
+ LOGP(DEURO, LOGL_ERROR, "Failed to init transceiver process!\n");
goto error;
}
/* init audio processing */
rc = dsp_init_sender(euro, samplerate, fm);
if (rc < 0) {
- PDEBUG(DEURO, DEBUG_ERROR, "Failed to init audio processing!\n");
+ LOGP(DEURO, LOGL_ERROR, "Failed to init audio processing!\n");
goto error;
}
@@ -279,7 +279,7 @@ int euro_create(const char *kanal, const char *device, int use_sdr, int samplera
euro_display_status();
- PDEBUG(DEURO, DEBUG_NOTICE, "Created 'Kanal' %s\n", kanal);
+ LOGP(DEURO, LOGL_NOTICE, "Created 'Kanal' %s\n", kanal);
return 0;
@@ -294,7 +294,7 @@ void euro_destroy(sender_t *sender)
{
euro_t *euro = (euro_t *) sender;
- PDEBUG(DEURO, DEBUG_DEBUG, "Destroying 'Eurosignal' instance for 'Kanal' = %s.\n", sender->kanal);
+ LOGP(DEURO, LOGL_DEBUG, "Destroying 'Eurosignal' instance for 'Kanal' = %s.\n", sender->kanal);
while (euro->call_list)
euro_call_destroy(euro->call_list);
@@ -308,12 +308,12 @@ static euro_call_t *euro_call_create(euro_t *euro, uint32_t callref, const char
{
euro_call_t *call, **callp;
- PDEBUG(DEURO, DEBUG_INFO, "Creating call instance to page ID '%s'.\n", id);
+ LOGP(DEURO, LOGL_INFO, "Creating call instance to page ID '%s'.\n", id);
/* create */
call = calloc(1, sizeof(*call));
if (!call) {
- PDEBUG(DEURO, DEBUG_ERROR, "No mem!\n");
+ LOGP(DEURO, LOGL_ERROR, "No mem!\n");
abort();
}
@@ -322,8 +322,8 @@ static euro_call_t *euro_call_create(euro_t *euro, uint32_t callref, const char
strcpy(call->station_id, id);
if (euro)
call->page_count = euro->repeat;
- timer_init(&call->timer, call_timeout, call);
- timer_start(&call->timer, ANSWER_TIME);
+ osmo_timer_setup(&call->timer, call_timeout, call);
+ osmo_timer_schedule(&call->timer, ANSWER_TIME);
/* link */
call->euro = euro;
@@ -347,7 +347,7 @@ static void euro_call_destroy(euro_call_t *call)
(*callp) = call->next;
/* cleanup */
- timer_exit(&call->timer);
+ osmo_timer_del(&call->timer);
/* destroy */
free(call);
@@ -364,12 +364,12 @@ void euro_get_id(euro_t *euro, char *id)
if (euro->scan_from < euro->scan_to) {
sprintf(id, "%06d", euro->scan_from++);
- PDEBUG_CHAN(DEURO, DEBUG_NOTICE, "Transmitting ID '%s'.\n", id);
+ LOGP_CHAN(DEURO, LOGL_NOTICE, "Transmitting ID '%s'.\n", id);
goto encode;
}
if (euro->sender.loopback) {
- PDEBUG_CHAN(DEURO, DEBUG_NOTICE, "Transmitting test ID '123456'.\n");
+ LOGP_CHAN(DEURO, LOGL_NOTICE, "Transmitting test ID '123456'.\n");
memcpy(id, "123456", 6);
goto encode;
}
@@ -377,7 +377,7 @@ void euro_get_id(euro_t *euro, char *id)
for (call = euro->call_list; call; call = call->next) {
if ((call->state == EURO_CALL_ACKNOWLEDGE || call->state == EURO_CALL_RELEASED) && call->page_count) {
call->page_count--;
- PDEBUG_CHAN(DEURO, DEBUG_NOTICE, "Transmitting ID '%s'.\n", call->station_id);
+ LOGP_CHAN(DEURO, LOGL_NOTICE, "Transmitting ID '%s'.\n", call->station_id);
memcpy(id, call->station_id, 6);
if (call->page_count == 0 && call->state == EURO_CALL_RELEASED)
euro_call_destroy(call);
@@ -400,15 +400,15 @@ void euro_get_id(euro_t *euro, char *id)
memcpy(id, euro->random_id, 6);
euro->random_count--;
if (id[0] == 'R') {
- PDEBUG_CHAN(DEURO, DEBUG_NOTICE, "Randomly transmitting Idle sequence.\n");
+ LOGP_CHAN(DEURO, LOGL_NOTICE, "Randomly transmitting Idle sequence.\n");
return;
}
- PDEBUG_CHAN(DEURO, DEBUG_NOTICE, "Randomly transmitting ID '%s'.\n", euro->random_id);
+ LOGP_CHAN(DEURO, LOGL_NOTICE, "Randomly transmitting ID '%s'.\n", euro->random_id);
goto encode;
}
if (!call) {
- PDEBUG_CHAN(DEURO, DEBUG_DEBUG, "Transmitting Idle sequence.\n");
+ LOGP_CHAN(DEURO, LOGL_DEBUG, "Transmitting Idle sequence.\n");
memcpy(id, "RIIIII", 6);
return;
}
@@ -432,7 +432,7 @@ void euro_receive_id(euro_t *euro, char *id)
int count = 0;
if (id[0] == 'R') {
- PDEBUG_CHAN(DEURO, DEBUG_DEBUG, "Received Idle sequence'\n");
+ LOGP_CHAN(DEURO, LOGL_DEBUG, "Received Idle sequence'\n");
return;
}
@@ -444,7 +444,7 @@ void euro_receive_id(euro_t *euro, char *id)
/* loopback display */
if (euro->sender.loopback) {
- PDEBUG_CHAN(DEURO, DEBUG_NOTICE, "Received ID '%s'\n", id);
+ LOGP_CHAN(DEURO, LOGL_NOTICE, "Received ID '%s'\n", id);
return;
}
@@ -452,12 +452,12 @@ void euro_receive_id(euro_t *euro, char *id)
if (id_list) {
count = search_id(id);
if (!count) {
- PDEBUG_CHAN(DEURO, DEBUG_INFO, "Received ID '%s' is not for us.\n", id);
+ LOGP_CHAN(DEURO, LOGL_INFO, "Received ID '%s' is not for us.\n", id);
return;
}
}
- PDEBUG_CHAN(DEURO, DEBUG_NOTICE, "Received ID '%s'\n", id);
+ LOGP_CHAN(DEURO, LOGL_NOTICE, "Received ID '%s'\n", id);
/* we want to send beep via MNCC */
if (id_list) {
@@ -475,7 +475,7 @@ void euro_receive_id(euro_t *euro, char *id)
return;
/* create call and send setup */
- PDEBUG_CHAN(DEURO, DEBUG_INFO, "Sending setup towards network.'\n");
+ LOGP_CHAN(DEURO, LOGL_INFO, "Sending setup towards network.'\n");
sprintf(dialing, "%d", count);
callref = call_up_setup(call->station_id, dialing, OSMO_CC_NETWORK_EUROSIGNAL_NONE, "");
call = euro_call_create(NULL, callref, id);
@@ -549,51 +549,51 @@ void call_down_clock(void)
}
/* Timeout handling */
-static void call_timeout(struct timer *timer)
+static void call_timeout(void *data)
{
- euro_call_t *call = (euro_call_t *)timer->priv;
+ euro_call_t *call = data;
switch (call->state) {
case EURO_CALL_ANSWER:
/* if no station is linked to the call, we are out-of-order */
if (!call->euro) {
- PDEBUG(DEURO, DEBUG_INFO, "Station is unavailable, playing announcement.\n");
+ LOGP(DEURO, LOGL_INFO, "Station is unavailable, playing announcement.\n");
call->announcement_spl = es_ges_spl;
call->announcement_size = es_ges_size;
call->announcement_index = 0;
- timer_start(&call->timer, OOO_TIME);
+ osmo_timer_schedule(&call->timer, OOO_TIME);
call_new_state(call, EURO_CALL_OUTOFORDER);
break;
}
/* if subcriber list is available, but ID is not found, we are unassigned */
if (id_list && !search_id(call->station_id)) {
- PDEBUG(DEURO, DEBUG_INFO, "Subscriber unknown, playing announcement.\n");
+ LOGP(DEURO, LOGL_INFO, "Subscriber unknown, playing announcement.\n");
call->announcement_spl = es_kaudn_spl;
call->announcement_size = es_kaudn_size;
call->announcement_index = 0;
call->announcement_count = 1;
- timer_start(&call->timer, UNASSIGNED_TIME1);
+ osmo_timer_schedule(&call->timer, UNASSIGNED_TIME1);
call_new_state(call, EURO_CALL_UNASSIGNED);
break;
}
/* if station is degraded, play that announcement */
if (call->euro->degraded) {
- PDEBUG(DEURO, DEBUG_INFO, "Station is degraded, playing announcement.\n");
+ LOGP(DEURO, LOGL_INFO, "Station is degraded, playing announcement.\n");
call->announcement_spl = es_teilges_spl;
call->announcement_size = es_teilges_size;
call->announcement_index = 0;
- timer_start(&call->timer, DEGRADED_TIME);
+ osmo_timer_schedule(&call->timer, DEGRADED_TIME);
call_new_state(call, EURO_CALL_DEGRADED);
break;
}
/* fall through */
case EURO_CALL_DEGRADED:
- PDEBUG(DEURO, DEBUG_INFO, "Station acknowledges, playing announcement.\n");
+ LOGP(DEURO, LOGL_INFO, "Station acknowledges, playing announcement.\n");
call->announcement_spl = es_mitte_spl;
call->announcement_size = es_mitte_size;
call->announcement_index = 0;
call->announcement_count = 1;
- timer_start(&call->timer, ACKNOWLEDGE_TIME1);
+ osmo_timer_schedule(&call->timer, ACKNOWLEDGE_TIME1);
call_new_state(call, EURO_CALL_ACKNOWLEDGE);
break;
case EURO_CALL_ACKNOWLEDGE:
@@ -602,22 +602,22 @@ static void call_timeout(struct timer *timer)
call->announcement_size = es_mitte_size;
call->announcement_index = 0;
call->announcement_count = 2;
- timer_start(&call->timer, ACKNOWLEDGE_TIME2);
+ osmo_timer_schedule(&call->timer, ACKNOWLEDGE_TIME2);
break;
}
if (call->page_count) {
- PDEBUG(DEURO, DEBUG_INFO, "Announcement played, receiver has not been paged yet, releasing call.\n");
+ LOGP(DEURO, LOGL_INFO, "Announcement played, receiver has not been paged yet, releasing call.\n");
call_up_release(call->callref, CAUSE_NORMAL);
call->callref = 0;
call_new_state(call, EURO_CALL_RELEASED);
break;
}
- PDEBUG(DEURO, DEBUG_INFO, "Announcement played, receiver has been paged, releasing call.\n");
+ LOGP(DEURO, LOGL_INFO, "Announcement played, receiver has been paged, releasing call.\n");
call_up_release(call->callref, CAUSE_NORMAL);
euro_call_destroy(call);
break;
case EURO_CALL_OUTOFORDER:
- PDEBUG(DEURO, DEBUG_INFO, "Announcement played, releasing call.\n");
+ LOGP(DEURO, LOGL_INFO, "Announcement played, releasing call.\n");
call_up_release(call->callref, CAUSE_NORMAL);
euro_call_destroy(call);
break;
@@ -627,18 +627,18 @@ static void call_timeout(struct timer *timer)
call->announcement_size = es_kaudn_size;
call->announcement_index = 0;
call->announcement_count = 2;
- timer_start(&call->timer, UNASSIGNED_TIME2);
+ osmo_timer_schedule(&call->timer, UNASSIGNED_TIME2);
break;
}
- PDEBUG(DEURO, DEBUG_INFO, "Announcement played, playing again.\n");
+ LOGP(DEURO, LOGL_INFO, "Announcement played, playing again.\n");
call->announcement_spl = es_kaudn_spl;
call->announcement_size = es_kaudn_size;
call->announcement_index = 0;
call->announcement_count = 1;
- timer_start(&call->timer, UNASSIGNED_TIME1);
+ osmo_timer_schedule(&call->timer, UNASSIGNED_TIME1);
break;
case EURO_CALL_BEEPING:
- PDEBUG(DEURO, DEBUG_INFO, "Beep played, releasing.\n");
+ LOGP(DEURO, LOGL_INFO, "Beep played, releasing.\n");
call_up_release(call->callref, CAUSE_NORMAL);
call->callref = 0;
euro_call_destroy(call);
@@ -670,9 +670,9 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
/* just (ab)use busy signal when no station is available */
if (!sender) {
if (channel)
- PDEBUG(DEURO, DEBUG_NOTICE, "Cannot page receiver, because given station not available, rejecting!\n");
+ LOGP(DEURO, LOGL_NOTICE, "Cannot page receiver, because given station not available, rejecting!\n");
else
- PDEBUG(DEURO, DEBUG_NOTICE, "Cannot page receiver, no station not available, rejecting!\n");
+ LOGP(DEURO, LOGL_NOTICE, "Cannot page receiver, no station not available, rejecting!\n");
euro = NULL;
}
@@ -684,23 +684,23 @@ 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 __attribute__((unused)) callref, struct timeval __attribute__((unused)) *tv_meter)
{
euro_call_t *call;
- PDEBUG(DEURO, DEBUG_INFO, "Call has been answered by network.\n");
+ LOGP(DEURO, LOGL_INFO, "Call has been answered by network.\n");
for (call = ooo_call_list; call; call = call->next) {
if (call->callref == callref)
break;
}
if (!call) {
- PDEBUG(DEURO, DEBUG_NOTICE, "Answer from network, but no callref!\n");
+ LOGP(DEURO, LOGL_NOTICE, "Answer from network, but no callref!\n");
call_up_release(callref, CAUSE_INVALCALLREF);
return;
}
- timer_start(&call->timer, BEEP_TIME);
+ osmo_timer_schedule(&call->timer, BEEP_TIME);
}
static void _release(int callref, int __attribute__((unused)) cause)
@@ -709,7 +709,7 @@ static void _release(int callref, int __attribute__((unused)) cause)
euro_t *euro;
euro_call_t *call;
- PDEBUG(DEURO, DEBUG_INFO, "Call has been disconnected by network.\n");
+ LOGP(DEURO, LOGL_INFO, "Call has been disconnected by network.\n");
for (sender = sender_head; sender; sender = sender->next) {
euro = (euro_t *) sender;
@@ -727,7 +727,7 @@ static void _release(int callref, int __attribute__((unused)) cause)
}
}
if (!call) {
- PDEBUG(DEURO, DEBUG_NOTICE, "Outgoing disconnect, but no callref!\n");
+ LOGP(DEURO, LOGL_NOTICE, "Outgoing disconnect, but no callref!\n");
call_up_release(callref, CAUSE_INVALCALLREF);
return;
}
@@ -760,7 +760,7 @@ void call_down_release(int callref, int cause)
}
/* Receive audio from call instance. */
-void call_down_audio(int __attribute__((unused)) callref, uint16_t __attribute__((unused)) sequence, uint32_t __attribute__((unused)) timestamp, uint32_t __attribute__((unused)) ssrc, sample_t __attribute__((unused)) *samples, int __attribute__((unused)) count)
+void call_down_audio(void __attribute__((unused)) *decoder, void __attribute__((unused)) *decoder_priv, int __attribute__((unused)) callref, uint16_t __attribute__((unused)) sequence, uint8_t __attribute__((unused)) marker, uint32_t __attribute__((unused)) timestamp, uint32_t __attribute__((unused)) ssrc, uint8_t __attribute__((unused)) *payload, int __attribute__((unused)) payload_len)
{
}
diff --git a/src/eurosignal/eurosignal.h b/src/eurosignal/eurosignal.h
index bcb2bc1..92dbaba 100644
--- a/src/eurosignal/eurosignal.h
+++ b/src/eurosignal/eurosignal.h
@@ -1,6 +1,6 @@
#include "../libfm/fm.h"
#include "../libmobile/sender.h"
-#include "../libtimer/timer.h"
+#include <osmocom/core/timer.h>
/* current state of transmitter */
enum euro_health_state {
@@ -30,7 +30,7 @@ typedef struct euro_call {
int callref; /* call reference */
char station_id[7]; /* current station ID */
int page_count; /* number of transmissions left */
- struct timer timer;
+ struct osmo_timer_list timer;
enum euro_call_state state; /* current state */
int announcement_count; /* used to replay annoucements */
int16_t *announcement_spl; /* current sample */
diff --git a/src/eurosignal/main.c b/src/eurosignal/main.c
index 8d0b5bc..475b516 100644
--- a/src/eurosignal/main.c
+++ b/src/eurosignal/main.c
@@ -23,7 +23,7 @@
#include <string.h>
#include <errno.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../libmobile/call.h"
#include "../libmobile/main_mobile.h"
#include "../liboptions/options.h"
@@ -199,9 +199,11 @@ int main(int argc, char *argv[])
print_help(argv[0]);
return 0;
}
- if (!strcasecmp(kanal[0], "list")) {
- euro_list_channels();
- goto fail;
+ for (i = 0; i < num_kanal; i++) {
+ if (!strcasecmp(kanal[i], "list")) {
+ euro_list_channels();
+ goto fail;
+ }
}
if (use_sdr) {
/* set device */
@@ -247,6 +249,7 @@ fail:
euro_destroy(sender_head);
/* exits */
+ main_mobile_exit();
fm_exit();
euro_exit();
diff --git a/src/fuenf/Makefile.am b/src/fuenf/Makefile.am
index 4c90762..964db02 100644
--- a/src/fuenf/Makefile.am
+++ b/src/fuenf/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
bin_PROGRAMS = \
5-ton-folge
@@ -12,21 +12,20 @@ bin_PROGRAMS = \
$(COMMON_LA) \
../anetz/libgermanton.a \
$(top_builddir)/src/liboptions/liboptions.a \
- $(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libmobile/libmobile.a \
- $(top_builddir)/src/libosmocc/libosmocc.a \
$(top_builddir)/src/libdisplay/libdisplay.a \
$(top_builddir)/src/libgoertzel/libgoertzel.a \
$(top_builddir)/src/libjitter/libjitter.a \
- $(top_builddir)/src/libtimer/libtimer.a \
$(top_builddir)/src/libsamplerate/libsamplerate.a \
$(top_builddir)/src/libemphasis/libemphasis.a \
$(top_builddir)/src/libfm/libfm.a \
$(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \
- $(top_builddir)/src/libg711/libg711.a \
$(top_builddir)/src/libaaimage/libaaimage.a \
+ $(top_builddir)/src/liblogging/liblogging.a \
+ $(LIBOSMOCORE_LIBS) \
+ $(LIBOSMOCC_LIBS) \
-lm
if HAVE_ALSA
diff --git a/src/fuenf/dsp.c b/src/fuenf/dsp.c
index 7985fb9..9adf167 100644
--- a/src/fuenf/dsp.c
+++ b/src/fuenf/dsp.c
@@ -26,7 +26,7 @@
#include <errno.h>
#include <math.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../libmobile/call.h"
#include "fuenf.h"
#include "dsp.h"
@@ -106,7 +106,7 @@ int dsp_init_sender(fuenf_t *fuenf, int samplerate, double max_deviation, double
sample_t *spl;
int len;
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Init DSP for transceiver.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Init DSP for transceiver.\n");
/* set modulation parameters */
sender_set_fm(&fuenf->sender, max_deviation, MAX_MODULATION, signal_deviation, MAX_DISPLAY);
@@ -129,7 +129,7 @@ int dsp_init_sender(fuenf_t *fuenf, int samplerate, double max_deviation, double
len = (int)(8000.0 * (1.0 / RX_TOL_TONE_FREQ) + 0.5);
spl = calloc(1, len * sizeof(*spl));
if (!spl) {
- PDEBUG(DDSP, DEBUG_ERROR, "No memory!\n");
+ LOGP(DDSP, LOGL_ERROR, "No memory!\n");
goto error;
}
fuenf->rx_tone_filter_spl = spl;
@@ -154,14 +154,14 @@ error:
/* Cleanup transceiver instance. */
void dsp_cleanup_sender(fuenf_t *fuenf)
{
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Cleanup DSP for transceiver.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Cleanup DSP for transceiver.\n");
/* free tone buffers */
if (fuenf->rx_tone_filter_spl)
free(fuenf->rx_tone_filter_spl);
}
-//#define DEBUG
+//#define DEBUG_CODER
/* receive digits and decode */
static void digit_decode(fuenf_t *fuenf, sample_t *samples, int length)
@@ -185,7 +185,7 @@ static void digit_decode(fuenf_t *fuenf, sample_t *samples, int length)
/* get amplitude (a is a sqaure of the amplitude for faster math) */
a = (I[i] * I[i] + Q[i] * Q[i]) * 2.0 * 2.0 / TONE_LEVEL / TONE_LEVEL;
-#ifdef DEBUG
+#ifdef DEBUG_CODER
if (i == 0) printf("%s %.5f ", debug_amplitude(frequency[i] / (DIGIT_FREQ_MAX - DIGIT_FREQ_MIN) * 2.0), f);
if (i == 0) printf("%s %.5f ", debug_amplitude(sqrt(a)), sqrt(a));
#endif
@@ -197,12 +197,13 @@ static void digit_decode(fuenf_t *fuenf, sample_t *samples, int length)
/* digit lound enough ? */
if (a >= RX_MIN_LEVEL * RX_MIN_LEVEL && d < DSP_NUM_DIGITS) {
-#ifdef DEBUG
+#ifdef DEBUG_CODER
if (i == 0 && d < DSP_NUM_DIGITS) printf("digit=%d (%d == no digit detected)", d, DSP_NUM_DIGITS);
#endif
} else
d = -1;
-#ifdef DEBUG
+#ifdef DEBUG_CODER
+ sffd
if (i == 0) printf("\n");
#endif
@@ -228,7 +229,7 @@ static void digit_decode(fuenf_t *fuenf, sample_t *samples, int length)
break;
/* check if we have enought silence */
if (fuenf->rx_digit_count == RX_MIN_PREAMBLE) {
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Detected silence, waiting for digits.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Detected silence, waiting for digits.\n");
fuenf->rx_state = RX_STATE_IDLE;
break;
}
@@ -237,7 +238,7 @@ static void digit_decode(fuenf_t *fuenf, sample_t *samples, int length)
/* wait for digit */
if (d < 0)
break;
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "We have some tone, start receiving digits.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "We have some tone, start receiving digits.\n");
fuenf->rx_callsign_count = 0;
fuenf->rx_callsign[fuenf->rx_callsign_count] = d;
fuenf->rx_state = RX_STATE_DIGIT;
@@ -247,18 +248,18 @@ static void digit_decode(fuenf_t *fuenf, sample_t *samples, int length)
if (!change) {
if (fuenf->rx_digit_count == RX_LEN_DIGIT_TH) {
if (d < 0) {
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Not enough digits received, waiting for next transmission.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Not enough digits received, waiting for next transmission.\n");
fuenf->rx_function = 0;
fuenf->rx_function_count = 0;
fuenf->rx_state = RX_STATE_RESET;
break;
}
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Detected digit #%d (amplitude = %.0f%%)\n", d + 1, sqrt(a) * 100.0);
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Detected digit #%d (amplitude = %.0f%%)\n", d + 1, sqrt(a) * 100.0);
display_measurements_update(fuenf->dmp_digit_level, sqrt(a) * 100.0, 0.0);
break;
}
if (fuenf->rx_digit_count == RX_LEN_DIGIT_MAX) {
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Detected digit too long, waiting for next transmission.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Detected digit too long, waiting for next transmission.\n");
fuenf->rx_state = RX_STATE_RESET;
break;
}
@@ -272,7 +273,7 @@ static void digit_decode(fuenf_t *fuenf, sample_t *samples, int length)
}
/* if counter (when changed) was too low */
if (change_count < RX_LEN_DIGIT_MIN) {
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Detected digit too short, waiting for next transmission.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Detected digit too short, waiting for next transmission.\n");
fuenf->rx_state = RX_STATE_RESET;
break;
}
@@ -284,7 +285,7 @@ static void digit_decode(fuenf_t *fuenf, sample_t *samples, int length)
for (i = 0; i < 5; i++) {
if (fuenf->rx_callsign[i] == REPEAT_DIGIT) {
if (i == 0) {
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "First digit is a repeat digit, this is not allowed, waiting for next transmission.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "First digit is a repeat digit, this is not allowed, waiting for next transmission.\n");
fuenf->rx_state = RX_STATE_RESET;
break;
}
@@ -298,7 +299,7 @@ static void digit_decode(fuenf_t *fuenf, sample_t *samples, int length)
fuenf->rx_callsign[i] = '\0';
if (i < 5)
break;
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Complete call sign '%s' received, waiting for signal tone(s).\n", fuenf->rx_callsign);
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Complete call sign '%s' received, waiting for signal tone(s).\n", fuenf->rx_callsign);
fuenf_rx_callsign(fuenf, fuenf->rx_callsign);
fuenf->rx_function_count = 0; /* must reset, so we can detect timeout */
fuenf->rx_state = RX_STATE_WAIT_SIGNAL;
@@ -362,7 +363,7 @@ static void tone_decode(fuenf_t *fuenf, sample_t *samples, int length)
/* wait for signal */
if (!funktion) {
if (fuenf->rx_function_count >= RX_WAIT_TONE_MAX) {
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "There is no double tone, waiting for next transmission.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "There is no double tone, waiting for next transmission.\n");
fuenf->rx_state = RX_STATE_RESET;
break;
}
@@ -376,13 +377,13 @@ static void tone_decode(fuenf_t *fuenf, sample_t *samples, int length)
case RX_STATE_SIGNAL:
/* if signal ceases too early */
if (funktion != fuenf->rx_function) {
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Signal tones ceased to early, waiting for next transmission.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Signal tones ceased to early, waiting for next transmission.\n");
fuenf->rx_state = RX_STATE_RESET;
break;
}
if (fuenf->rx_function_count >= RX_LEN_TONE_MIN) {
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Detected tones %.0f+%.0f Hz (amplitude = %.0f%%+%.0f%%)\n", tone_freq[tone1], tone_freq[tone2], fuenf->rx_tone_levels[tone1] * 100.0, fuenf->rx_tone_levels[tone2] * 100.0);
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Signal tones detected, done, waiting for next transmission.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Detected tones %.0f+%.0f Hz (amplitude = %.0f%%+%.0f%%)\n", tone_freq[tone1], tone_freq[tone2], fuenf->rx_tone_levels[tone1] * 100.0, fuenf->rx_tone_levels[tone2] * 100.0);
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Signal tones detected, done, waiting for next transmission.\n");
fuenf_rx_function(fuenf, fuenf->rx_function);
fuenf->rx_state = RX_STATE_RESET;
break;
@@ -435,11 +436,11 @@ int dsp_setup(fuenf_t *fuenf, const char *rufzeichen, enum fuenf_funktion funkti
fuenf->tx_seq_length = 0;
if (strlen(rufzeichen) != 5) {
- PDEBUG_CHAN(DDSP, DEBUG_ERROR, "Given call sign has invalid length.\n");
+ LOGP_CHAN(DDSP, LOGL_ERROR, "Given call sign has invalid length.\n");
return -EINVAL;
}
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Generating sequence for call sign '%s' and function code '%d'.\n", rufzeichen, funktion);
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Generating sequence for call sign '%s' and function code '%d'.\n", rufzeichen, funktion);
/* add preamble */
seq[index].phasestep1 = 0;
@@ -451,7 +452,7 @@ int dsp_setup(fuenf_t *fuenf, const char *rufzeichen, enum fuenf_funktion funkti
tone_index = index;
for (i = 0; rufzeichen[i]; i++) {
if (rufzeichen[i] < '0' || rufzeichen[i] > '9') {
- PDEBUG_CHAN(DDSP, DEBUG_ERROR, "Given call sign has invalid digit '%c'.\n", rufzeichen[i]);
+ LOGP_CHAN(DDSP, LOGL_ERROR, "Given call sign has invalid digit '%c'.\n", rufzeichen[i]);
return -EINVAL;
}
if (rufzeichen[i] == '0')
@@ -461,9 +462,9 @@ int dsp_setup(fuenf_t *fuenf, const char *rufzeichen, enum fuenf_funktion funkti
/* use repeat digit, if two subsequent digits are the same */
if (i > 0 && seq[index - 1].phasestep1 == seq[index].phasestep1) {
seq[index].phasestep1 = 2.0 * M_PI * digit_freq[REPEAT_DIGIT] * fuenf->sample_duration;
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, " -> Adding digit '%c' as tone with %.0f Hz.\n", rufzeichen[i], digit_freq[REPEAT_DIGIT]);
+ LOGP_CHAN(DDSP, LOGL_DEBUG, " -> Adding digit '%c' as tone with %.0f Hz.\n", rufzeichen[i], digit_freq[REPEAT_DIGIT]);
} else
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, " -> Adding digit '%c' as tone with %.0f Hz.\n", rufzeichen[i], digit_freq[rufzeichen[i] - '0']);
+ LOGP_CHAN(DDSP, LOGL_DEBUG, " -> Adding digit '%c' as tone with %.0f Hz.\n", rufzeichen[i], digit_freq[rufzeichen[i] - '0']);
seq[index].phasestep2 = 0;
seq[index].duration = TX_LEN_DIGIT;
index++;
@@ -491,9 +492,9 @@ int dsp_setup(fuenf_t *fuenf, const char *rufzeichen, enum fuenf_funktion funkti
index++;
}
-#ifndef DEBUG
+#ifndef DEBUG_CODER
if (funktion == FUENF_FUNKTION_RUF) {
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, " -> Adding call signal of %.0f Hz.\n", digit_freq[REPEAT_DIGIT]);
+ LOGP_CHAN(DDSP, LOGL_DEBUG, " -> Adding call signal of %.0f Hz.\n", digit_freq[REPEAT_DIGIT]);
for (i = 0; i < TX_NUM_KANAL; i++) {
/* add tone (double volume) */
seq[index].phasestep1 = 2.0 * M_PI * digit_freq[REPEAT_DIGIT] * fuenf->sample_duration;
@@ -522,7 +523,7 @@ int dsp_setup(fuenf_t *fuenf, const char *rufzeichen, enum fuenf_funktion funkti
if (signals[i].funktion == funktion)
break;
}
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, " -> Adding call signal of %.0f Hz and %.0f Hz.\n", tone_freq[signals[i].tone1], tone_freq[signals[i].tone2]);
+ LOGP_CHAN(DDSP, LOGL_DEBUG, " -> Adding call signal of %.0f Hz and %.0f Hz.\n", tone_freq[signals[i].tone1], tone_freq[signals[i].tone2]);
seq[index].phasestep1 = 2.0 * M_PI * tone_freq[signals[i].tone1] * fuenf->sample_duration;
seq[index].phasestep2 = 2.0 * M_PI * tone_freq[signals[i].tone2] * fuenf->sample_duration;
seq[index].duration = TX_LEN_SIGNAL;
@@ -532,7 +533,7 @@ int dsp_setup(fuenf_t *fuenf, const char *rufzeichen, enum fuenf_funktion funkti
/* check array overflow, if it did not already crashed before */
if (index > (int)(sizeof(fuenf->tx_seq) / sizeof(fuenf->tx_seq[0]))) {
- PDEBUG_CHAN(DDSP, DEBUG_ERROR, "Array size of tx_seq too small, please fix!\n");
+ LOGP_CHAN(DDSP, LOGL_ERROR, "Array size of tx_seq too small, please fix!\n");
abort();
}
@@ -604,7 +605,11 @@ void sender_send(sender_t *sender, sample_t *samples, uint8_t *power, int length
if (fuenf->state == FUENF_STATE_DURCHSAGE && fuenf->callref) {
memset(power, 1, length);
input_num = samplerate_upsample_input_num(&sender->srstate, length);
- jitter_load(&sender->dejitter, samples, input_num);
+ {
+ int16_t spl[input_num];
+ jitter_load_samples(&sender->dejitter, (uint8_t *)spl, input_num, sizeof(*spl), jitter_conceal_s16, NULL);
+ int16_to_samples_speech(samples, spl, input_num);
+ }
samplerate_upsample(&sender->srstate, samples, input_num, samples, length);
} else {
/* send if something has to be sent. else turn transmitter off */
@@ -646,3 +651,27 @@ void sender_send(sender_t *sender, sample_t *samples, uint8_t *power, int length
}
+/* Receive audio from call instance. */
+void call_down_audio(void *decoder, void *decoder_priv, int callref, uint16_t sequence, uint8_t marker, uint32_t timestamp, uint32_t ssrc, uint8_t *payload, int payload_len)
+{
+ sender_t *sender;
+ fuenf_t *fuenf;
+
+ for (sender = sender_head; sender; sender = sender->next) {
+ fuenf = (fuenf_t *) sender;
+ if (fuenf->callref == callref)
+ break;
+ }
+ if (!sender)
+ return;
+
+ if (fuenf->state == FUENF_STATE_DURCHSAGE) {
+ jitter_frame_t *jf;
+ jf = jitter_frame_alloc(decoder, decoder_priv, payload, payload_len, marker, sequence, timestamp, ssrc);
+ if (jf)
+ jitter_save(&fuenf->sender.dejitter, jf);
+ }
+}
+
+void call_down_clock(void) {}
+
diff --git a/src/fuenf/fuenf.c b/src/fuenf/fuenf.c
index 4466094..4f8fa00 100644
--- a/src/fuenf/fuenf.c
+++ b/src/fuenf/fuenf.c
@@ -26,10 +26,10 @@
#include <errno.h>
#include <math.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 <osmocom/cc/message.h>
#include "../liboptions/options.h"
#include "fuenf.h"
#include "dsp.h"
@@ -145,11 +145,11 @@ static void fuenf_display_status(void)
display_status_end();
}
-void fuenf_new_state(fuenf_t *fuenf, enum fuenf_state new_state)
+static void fuenf_new_state(fuenf_t *fuenf, enum fuenf_state new_state)
{
if (fuenf->state == new_state)
return;
- PDEBUG_CHAN(DFUENF, DEBUG_DEBUG, "State change: %s -> %s\n", fuenf_state_name[fuenf->state], fuenf_state_name[new_state]);
+ LOGP_CHAN(DFUENF, LOGL_DEBUG, "State change: %s -> %s\n", fuenf_state_name[fuenf->state], fuenf_state_name[new_state]);
fuenf->state = new_state;
fuenf_display_status();
}
@@ -160,13 +160,13 @@ static int fuenf_scan_or_loopback(fuenf_t *fuenf)
if (fuenf->scan_from < fuenf->scan_to) {
sprintf(rufzeichen, "%05d", fuenf->scan_from++);
- PDEBUG_CHAN(DFUENF, DEBUG_NOTICE, "Transmitting ID '%s'.\n", rufzeichen);
+ LOGP_CHAN(DFUENF, LOGL_NOTICE, "Transmitting ID '%s'.\n", rufzeichen);
dsp_setup(fuenf, rufzeichen, fuenf->default_funktion);
return 1;
}
if (fuenf->sender.loopback) {
- PDEBUG(DFUENF, DEBUG_INFO, "Sending 5-Ton-Ruf for loopback test.\n");
+ LOGP(DFUENF, LOGL_INFO, "Sending 5-Ton-Ruf for loopback test.\n");
dsp_setup(fuenf, "10357", FUENF_FUNKTION_FEUER);
return 1;
}
@@ -182,23 +182,23 @@ int fuenf_create(const char *kanal, double frequency, const char *device, int us
fuenf = calloc(1, sizeof(*fuenf));
if (!fuenf) {
- PDEBUG(DFUENF, DEBUG_ERROR, "No memory!\n");
+ LOGP(DFUENF, LOGL_ERROR, "No memory!\n");
return -ENOMEM;
}
- PDEBUG(DFUENF, DEBUG_DEBUG, "Creating '5-Ton-Folge' instance for 'Kanal' = %s (sample rate %d).\n", kanal, samplerate);
+ LOGP(DFUENF, LOGL_DEBUG, "Creating '5-Ton-Folge' instance for 'Kanal' = %s (sample rate %d).\n", kanal, samplerate);
/* init general part of transceiver */
rc = sender_create(&fuenf->sender, kanal, frequency, frequency, device, use_sdr, samplerate, rx_gain, tx_gain, 0, 0, write_rx_wave, write_tx_wave, read_rx_wave, read_tx_wave, loopback, PAGING_SIGNAL_NONE);
if (rc < 0) {
- PDEBUG(DFUENF, DEBUG_ERROR, "Failed to init transceiver process!\n");
+ LOGP(DFUENF, LOGL_ERROR, "Failed to init transceiver process!\n");
goto error;
}
/* init audio processing */
rc = dsp_init_sender(fuenf, samplerate, max_deviation, signal_deviation);
if (rc < 0) {
- PDEBUG(DFUENF, DEBUG_ERROR, "Failed to init audio processing!\n");
+ LOGP(DFUENF, LOGL_ERROR, "Failed to init audio processing!\n");
goto error;
}
@@ -210,7 +210,7 @@ int fuenf_create(const char *kanal, double frequency, const char *device, int us
fuenf_display_status();
- PDEBUG(DFUENF, DEBUG_NOTICE, "Created 'Kanal' %s\n", kanal);
+ LOGP(DFUENF, LOGL_NOTICE, "Created 'Kanal' %s\n", kanal);
/* start scanning, if enabled, otherwise send loopback sequence, if enabled */
fuenf_scan_or_loopback(fuenf);
@@ -228,7 +228,7 @@ void fuenf_destroy(sender_t *sender)
{
fuenf_t *fuenf = (fuenf_t *) sender;
- PDEBUG(DFUENF, DEBUG_DEBUG, "Destroying '5-Ton-Folge' instance for 'Kanal' = %s.\n", sender->kanal);
+ LOGP(DFUENF, LOGL_DEBUG, "Destroying '5-Ton-Folge' instance for 'Kanal' = %s.\n", sender->kanal);
dsp_cleanup_sender(fuenf);
sender_destroy(&fuenf->sender);
@@ -238,7 +238,7 @@ void fuenf_destroy(sender_t *sender)
/* call sign was transmitted */
void fuenf_tx_done(fuenf_t *fuenf)
{
- PDEBUG_CHAN(DFUENF, DEBUG_INFO, "Done sending 5-Ton-Ruf.\n");
+ LOGP_CHAN(DFUENF, LOGL_INFO, "Done sending 5-Ton-Ruf.\n");
/* start scanning, if enabled, otherwise send loopback sequence, if enabled */
if (fuenf_scan_or_loopback(fuenf)) {
@@ -247,7 +247,7 @@ void fuenf_tx_done(fuenf_t *fuenf)
/* go talker state */
if (fuenf->callref && fuenf->tx_funktion == FUENF_FUNKTION_RUF) {
- PDEBUG_CHAN(DFUENF, DEBUG_INFO, "Caller may talk now.\n");
+ LOGP_CHAN(DFUENF, LOGL_INFO, "Caller may talk now.\n");
fuenf_new_state(fuenf, FUENF_STATE_DURCHSAGE);
return;
}
@@ -255,23 +255,19 @@ void fuenf_tx_done(fuenf_t *fuenf)
/* go idle */
fuenf_new_state(fuenf, FUENF_STATE_IDLE);
if (fuenf->callref) {
- PDEBUG_CHAN(DFUENF, DEBUG_INFO, "Releasing call toward network.\n");
+ LOGP_CHAN(DFUENF, LOGL_INFO, "Releasing call toward network.\n");
call_up_release(fuenf->callref, CAUSE_NORMAL);
}
}
void fuenf_rx_callsign(fuenf_t *fuenf, const char *callsign)
{
- PDEBUG_CHAN(DFUENF, DEBUG_INFO, "Received 5-Ton-Ruf with call sign '%s'.\n", callsign);
+ LOGP_CHAN(DFUENF, LOGL_INFO, "Received 5-Ton-Ruf with call sign '%s'.\n", callsign);
}
void fuenf_rx_function(fuenf_t *fuenf, enum fuenf_funktion funktion)
{
- PDEBUG_CHAN(DFUENF, DEBUG_INFO, "Received function '%s'.\n", fuenf_funktion_name[funktion]);
-}
-
-void call_down_clock(void)
-{
+ LOGP_CHAN(DFUENF, LOGL_INFO, "Received function '%s'.\n", fuenf_funktion_name[funktion]);
}
/* Call control starts call towards transmitter. */
@@ -298,9 +294,9 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
}
if (!sender) {
if (channel)
- PDEBUG(DFUENF, DEBUG_NOTICE, "Cannot page, because given station not available, rejecting!\n");
+ LOGP(DFUENF, LOGL_NOTICE, "Cannot page, because given station not available, rejecting!\n");
else
- PDEBUG(DFUENF, DEBUG_NOTICE, "Cannot page, no trasmitting station idle, rejecting!\n");
+ LOGP(DFUENF, LOGL_NOTICE, "Cannot page, no trasmitting station idle, rejecting!\n");
return -CAUSE_NOCHANNEL;
}
@@ -335,7 +331,7 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
return -CAUSE_INVALNUMBER;
}
- PDEBUG_CHAN(DFUENF, DEBUG_INFO, "Sending 5-Ton-Ruf with call sign '%s' and function '%s'.\n", rufzeichen, fuenf_funktion_name[funktion]);
+ LOGP_CHAN(DFUENF, LOGL_INFO, "Sending 5-Ton-Ruf with call sign '%s' and function '%s'.\n", rufzeichen, fuenf_funktion_name[funktion]);
dsp_setup(fuenf, rufzeichen, funktion);
@@ -347,7 +343,7 @@ 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 __attribute__((unused)) callref, struct timeval __attribute__((unused)) *tv_meter)
{
}
@@ -357,7 +353,7 @@ static void _release(int __attribute__((unused)) callref, int __attribute__((unu
sender_t *sender;
fuenf_t *fuenf;
- PDEBUG(DFUENF, DEBUG_INFO, "Call has been disconnected by network.\n");
+ LOGP(DFUENF, LOGL_INFO, "Call has been disconnected by network.\n");
for (sender = sender_head; sender; sender = sender->next) {
fuenf = (fuenf_t *) sender;
@@ -365,7 +361,7 @@ static void _release(int __attribute__((unused)) callref, int __attribute__((unu
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;
}
@@ -389,23 +385,5 @@ void call_down_release(int callref, int cause)
_release(callref, 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;
- fuenf_t *fuenf;
-
- for (sender = sender_head; sender; sender = sender->next) {
- fuenf = (fuenf_t *) sender;
- if (fuenf->callref == callref)
- break;
- }
- if (!sender)
- return;
-
- if (fuenf->state == FUENF_STATE_DURCHSAGE)
- jitter_save(&fuenf->sender.dejitter, samples, count, 1, sequence, timestamp, ssrc);
-}
-
void dump_info(void) {}
diff --git a/src/fuenf/main.c b/src/fuenf/main.c
index ab7fa1c..f86ed1a 100644
--- a/src/fuenf/main.c
+++ b/src/fuenf/main.c
@@ -27,7 +27,7 @@
#include <sys/stat.h>
#include <fcntl.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../libmobile/call.h"
#include "../libmobile/main_mobile.h"
#include "../liboptions/options.h"
@@ -48,9 +48,9 @@ void print_help(const char *arg0)
main_mobile_print_help(arg0, "-k <kanal> | -k list");
/* - - */
printf(" -T --tx\n");
- printf(" Transmit Eurosignal on given channel, to page a receiver. (default)\n");
+ printf(" Transmit 5-tones on given channel, to page a receiver. (default)\n");
printf(" -R --rx\n");
- printf(" Receive Eurosignal on given channel, so we are the receiver.\n");
+ printf(" Receive 5-tones on given channel, so we are the receiver.\n");
printf(" If none of the options -T nor -R is given, only transmitter is enabled.\n");
printf(" -D --deviation <KHz>\n");
printf(" Choose deviation of FM signal (default %.0f KHz).\n", signal_deviation / 1000.0);
@@ -206,9 +206,11 @@ int main(int argc, char *argv[])
print_help(argv[0]);
return 0;
}
- if (!strcasecmp(kanal[0], "list")) {
- bos_list_channels();
- goto fail;
+ for (i = 0; i < num_kanal; i++) {
+ if (!strcasecmp(kanal[i], "list")) {
+ bos_list_channels();
+ goto fail;
+ }
}
if (use_sdr) {
/* set device */
@@ -259,6 +261,7 @@ fail:
fuenf_destroy(sender_head);
/* exits */
+ main_mobile_exit();
fm_exit();
fuenf_exit();
diff --git a/src/fuvst/Makefile.am b/src/fuvst/Makefile.am
index 090a433..983ea4e 100644
--- a/src/fuvst/Makefile.am
+++ b/src/fuvst/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
if HAVE_ALSA
bin_PROGRAMS = \
@@ -15,13 +15,10 @@ fuvst_LDADD = \
../anetz/libgermanton.a \
../cnetz/libcnetztones.a \
$(top_builddir)/src/liboptions/liboptions.a \
- $(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libmobile/libmobile.a \
- $(top_builddir)/src/libosmocc/libosmocc.a \
$(top_builddir)/src/libdisplay/libdisplay.a \
$(top_builddir)/src/libcompandor/libcompandor.a \
$(top_builddir)/src/libjitter/libjitter.a \
- $(top_builddir)/src/libtimer/libtimer.a \
$(top_builddir)/src/libsamplerate/libsamplerate.a \
$(top_builddir)/src/libemphasis/libemphasis.a \
$(top_builddir)/src/libfm/libfm.a \
@@ -31,8 +28,10 @@ fuvst_LDADD = \
$(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \
$(top_builddir)/src/libsound/libsound.a \
- $(top_builddir)/src/libg711/libg711.a \
$(top_builddir)/src/libaaimage/libaaimage.a \
+ $(top_builddir)/src/liblogging/liblogging.a \
+ $(LIBOSMOCORE_LIBS) \
+ $(LIBOSMOCC_LIBS) \
$(ALSA_LIBS) \
-lm
@@ -41,13 +40,10 @@ fuvst_sniffer_SOURCES = \
fuvst_sniffer_LDADD = \
$(COMMON_LA) \
$(top_builddir)/src/liboptions/liboptions.a \
- $(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libmobile/libmobile.a \
- $(top_builddir)/src/libosmocc/libosmocc.a \
$(top_builddir)/src/libdisplay/libdisplay.a \
$(top_builddir)/src/libcompandor/libcompandor.a \
$(top_builddir)/src/libjitter/libjitter.a \
- $(top_builddir)/src/libtimer/libtimer.a \
$(top_builddir)/src/libsamplerate/libsamplerate.a \
$(top_builddir)/src/libemphasis/libemphasis.a \
$(top_builddir)/src/libfm/libfm.a \
@@ -57,8 +53,10 @@ fuvst_sniffer_LDADD = \
$(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \
$(top_builddir)/src/libsound/libsound.a \
- $(top_builddir)/src/libg711/libg711.a \
$(top_builddir)/src/libaaimage/libaaimage.a \
+ $(top_builddir)/src/liblogging/liblogging.a \
+ $(LIBOSMOCORE_LIBS) \
+ $(LIBOSMOCC_LIBS) \
$(ALSA_LIBS) \
-lm
diff --git a/src/fuvst/fuvst.c b/src/fuvst/fuvst.c
index f86b0a8..847876e 100755
--- a/src/fuvst/fuvst.c
+++ b/src/fuvst/fuvst.c
@@ -35,12 +35,15 @@
#include <time.h>
#include <inttypes.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../liboptions/options.h"
#include "../libmobile/call.h"
#include "../libmobile/cause.h"
-#include "../libtimer/timer.h"
-#include "../libosmocc/message.h"
+#include "../libmobile/get_time.h"
+#include "../libmobile/console.h"
+#include <osmocom/core/timer.h>
+#include <osmocom/core/utils.h>
+#include <osmocom/cc/message.h>
#include "fuvst.h"
/* digital loopback test */
@@ -120,21 +123,21 @@ int config_file(const char *filename)
uint8_t byte;
if (!fp) {
- PDEBUG(DTRANS, DEBUG_ERROR, "Failed to open data base file: '%s'\n", filename);
+ LOGP(DTRANS, LOGL_ERROR, "Failed to open data base file: '%s'\n", filename);
return -EIO;
}
rc = fread(conf.data, 1, sizeof(conf.data), fp);
if (rc < (int)sizeof(conf.data)) {
fclose(fp);
- PDEBUG(DTRANS, DEBUG_ERROR, "Data base file shorter than %d bytes. This seems not to be a valid config file.\n", (int)sizeof(conf.data));
+ LOGP(DTRANS, LOGL_ERROR, "Data base file shorter than %d bytes. This seems not to be a valid config file.\n", (int)sizeof(conf.data));
return -EIO;
}
rc = fread(&byte, 1, 1, fp);
if (rc == 1) {
fclose(fp);
- PDEBUG(DTRANS, DEBUG_ERROR, "Data base file larger than %d bytes. (Don't use the EEPROM config format, use the MSC config format.)\n", (int)sizeof(conf.data));
+ LOGP(DTRANS, LOGL_ERROR, "Data base file larger than %d bytes. (Don't use the EEPROM config format, use the MSC config format.)\n", (int)sizeof(conf.data));
return -EIO;
}
@@ -156,10 +159,10 @@ static void config_send(uint8_t ident, uint8_t job, uint16_t offset, uint16_t le
uint32_t checksum = 0;
uint8_t rc = 1; /* Auftrag angenommen */
- PDEBUG(DCNETZ, DEBUG_NOTICE, "MSC requests data base block. (offset=%d, length=%d)\n", offset, length);
+ LOGP(DCNETZ, LOGL_NOTICE, "MSC requests data base block. (offset=%d, length=%d)\n", offset, length);
if (!conf.loaded) {
- PDEBUG(DCNETZ, DEBUG_ERROR, "MSC requests data base, but no file name given. Please give file name!\n");
+ LOGP(DCNETZ, LOGL_ERROR, "MSC requests data base, but no file name given. Please give file name!\n");
error:
/* return error */
len = encode_xedbu_1(&opcode, &data, 16, job, 0);
@@ -168,7 +171,7 @@ error:
}
if (offset + length > sizeof(conf.data)) {
- PDEBUG(DCNETZ, DEBUG_ERROR, "Requested date out of range!\n");
+ LOGP(DCNETZ, LOGL_ERROR, "Requested date out of range!\n");
goto error;
}
@@ -262,7 +265,7 @@ void add_emergency(const char *number)
emerg = calloc(1, sizeof(*emerg));
if (!emerg) {
- PDEBUG(DTRANS, DEBUG_ERROR, "No memory!\n");
+ LOGP(DTRANS, LOGL_ERROR, "No memory!\n");
return;
}
@@ -288,7 +291,7 @@ static int check_emerg(const char *number)
if (!emerg)
return 0;
- PDEBUG(DCNETZ, DEBUG_NOTICE, "Emergency call, matching prefix '%s' in list of emergency numbers.\n", emerg->number);
+ LOGP(DCNETZ, LOGL_NOTICE, "Emergency call, matching prefix '%s' in list of emergency numbers.\n", emerg->number);
return 1;
}
@@ -303,6 +306,7 @@ typedef struct cnetz_database {
uint8_t futln_fuvst;
uint16_t futln_rest;
uint8_t chip;
+ int32_t sicherungscode;
} cnetz_db_t;
static cnetz_db_t *cnetz_db_head;
@@ -337,12 +341,12 @@ static void remove_db(uint8_t futln_nat, uint8_t futln_fuvst, uint16_t futln_res
while (*dbp && *dbp != db)
dbp = &((*dbp)->next);
if (!(*dbp)) {
- PDEBUG(DDB, DEBUG_ERROR, "Subscriber not in list, please fix!!\n");
+ LOGP(DDB, LOGL_ERROR, "Subscriber not in list, please fix!!\n");
abort();
}
*dbp = db->next;
- PDEBUG(DDB, DEBUG_INFO, "Removing subscriber '%d,%d,%d' from database.\n", db->futln_nat, db->futln_fuvst, db->futln_rest);
+ LOGP(DDB, LOGL_INFO, "Removing subscriber '%d,%d,%d' from database.\n", db->futln_nat, db->futln_fuvst, db->futln_rest);
/* remove */
free(db);
@@ -353,13 +357,13 @@ static void flush_db(void)
cnetz_db_t *db;
while ((db = cnetz_db_head)) {
- PDEBUG(DDB, DEBUG_INFO, "Removing subscriber '%d,%d,%d' from database.\n", db->futln_nat, db->futln_fuvst, db->futln_rest);
+ LOGP(DDB, LOGL_INFO, "Removing subscriber '%d,%d,%d' from database.\n", db->futln_nat, db->futln_fuvst, db->futln_rest);
cnetz_db_head = db->next;
free(db);
}
}
-static void add_db(uint8_t futln_nat, uint8_t futln_fuvst, uint16_t futln_rest, uint8_t chip)
+static void add_db(uint8_t futln_nat, uint8_t futln_fuvst, uint16_t futln_rest, uint8_t chip, int32_t sicherungscode)
{
cnetz_db_t *db, **dbp;
@@ -370,15 +374,16 @@ static void add_db(uint8_t futln_nat, uint8_t futln_fuvst, uint16_t futln_rest,
/* add */
db = calloc(1, sizeof(*db));
if (!db) {
- PDEBUG(DDB, DEBUG_ERROR, "No memory!\n");
+ LOGP(DDB, LOGL_ERROR, "No memory!\n");
return;
}
db->futln_nat = futln_nat;
db->futln_fuvst = futln_fuvst;
db->futln_rest = futln_rest;
db->chip = chip;
+ db->sicherungscode = sicherungscode;
- PDEBUG(DDB, DEBUG_INFO, "Adding subscriber '%d,%d,%d' to database.\n", db->futln_nat, db->futln_fuvst, db->futln_rest);
+ LOGP(DDB, LOGL_INFO, "Adding subscriber '%d,%d,%d' to database. (reader=%s, sicherungs-code=%d)\n", db->futln_nat, db->futln_fuvst, db->futln_rest, (db->chip) ? "chip" : "magent", db->sicherungscode);
/* attach to end of list */
dbp = &cnetz_db_head;
@@ -392,7 +397,7 @@ static void add_db(uint8_t futln_nat, uint8_t futln_fuvst, uint16_t futln_rest,
*/
/* Release timeout */
-#define RELEASE_TO 3.0
+#define RELEASE_TO 3,0
/* BSC originated Ident-Numbers */
#define IDENT_BSC_FROM 0x9f
@@ -425,21 +430,26 @@ typedef struct transaction {
fuvst_t *spk; /* assigned SPK */
char number[17]; /* dialed by mobile */
int sonderruf; /* an emergency call */
- struct timer timer; /* release timer */
+ struct osmo_timer_list timer; /* release timer */
} transaction_t;
transaction_t *trans_list = NULL;
-const char *transaction2rufnummer(transaction_t *trans)
+static const char *nut2rufnummer(uint8_t futln_nat, uint8_t futln_fuvst, uint16_t futln_rest)
{
static char rufnummer[32]; /* make GCC happy (overflow check) */
- sprintf(rufnummer, "%d%d%05d", trans->futln_nat, trans->futln_fuvst, trans->futln_rest);
+ sprintf(rufnummer, "%d%d%05d", futln_nat, futln_fuvst, futln_rest);
return rufnummer;
}
-const char *state_name(enum call_state state)
+static const char *transaction2rufnummer(transaction_t *trans)
+{
+ return nut2rufnummer(trans->futln_nat, trans->futln_fuvst, trans->futln_rest);
+}
+
+static const char *state_name(enum call_state state)
{
static char invalid[16];
@@ -468,7 +478,7 @@ const char *state_name(enum call_state state)
return invalid;
}
-void display_status(void)
+static void display_status(void)
{
sender_t *sender;
fuvst_t *fuvst;
@@ -500,12 +510,12 @@ static void new_call_state(transaction_t *trans, enum call_state new_state)
{
if (trans->state == new_state)
return;
- PDEBUG(DTRANS, DEBUG_INFO, "State change: %s -> %s\n", state_name(trans->state), state_name(new_state));
+ LOGP(DTRANS, LOGL_INFO, "State change: %s -> %s\n", state_name(trans->state), state_name(new_state));
trans->state = new_state;
display_status();
}
-transaction_t *search_transaction_number(uint8_t futln_nat, uint8_t futln_fuvst, uint16_t futln_rest)
+static transaction_t *search_transaction_number(uint8_t futln_nat, uint8_t futln_fuvst, uint16_t futln_rest)
{
transaction_t *trans = trans_list;
@@ -514,7 +524,7 @@ transaction_t *search_transaction_number(uint8_t futln_nat, uint8_t futln_fuvst,
&& trans->futln_fuvst == futln_fuvst
&& trans->futln_rest == futln_rest) {
const char *rufnummer = transaction2rufnummer(trans);
- PDEBUG(DTRANS, DEBUG_DEBUG, "Found transaction for subscriber '%s'\n", rufnummer);
+ LOGP(DTRANS, LOGL_DEBUG, "Found transaction for subscriber '%s'\n", rufnummer);
return trans;
}
trans = trans->next;
@@ -523,14 +533,14 @@ transaction_t *search_transaction_number(uint8_t futln_nat, uint8_t futln_fuvst,
return NULL;
}
-transaction_t *search_transaction_ident(uint8_t ident)
+static transaction_t *search_transaction_ident(uint8_t ident)
{
transaction_t *trans = trans_list;
while (trans) {
if (trans->ident == ident) {
const char *rufnummer = transaction2rufnummer(trans);
- PDEBUG(DTRANS, DEBUG_DEBUG, "Found transaction for subscriber '%s'\n", rufnummer);
+ LOGP(DTRANS, LOGL_DEBUG, "Found transaction for subscriber '%s'\n", rufnummer);
return trans;
}
trans = trans->next;
@@ -539,7 +549,7 @@ transaction_t *search_transaction_ident(uint8_t ident)
return NULL;
}
-transaction_t *search_transaction_callref(int callref)
+static transaction_t *search_transaction_callref(int callref)
{
transaction_t *trans = trans_list;
@@ -549,7 +559,7 @@ transaction_t *search_transaction_callref(int callref)
while (trans) {
if (trans->callref == callref) {
const char *rufnummer = transaction2rufnummer(trans);
- PDEBUG(DTRANS, DEBUG_DEBUG, "Found transaction for subscriber '%s'\n", rufnummer);
+ LOGP(DTRANS, LOGL_DEBUG, "Found transaction for subscriber '%s'\n", rufnummer);
return trans;
}
trans = trans->next;
@@ -564,9 +574,9 @@ static void destroy_transaction(transaction_t *trans)
transaction_t **transp;
const char *rufnummer = transaction2rufnummer(trans);
- PDEBUG(DTRANS, DEBUG_INFO, "Destroying transaction for subscriber '%s'\n", rufnummer);
+ LOGP(DTRANS, LOGL_INFO, "Destroying transaction for subscriber '%s'\n", rufnummer);
- timer_exit(&trans->timer);
+ osmo_timer_del(&trans->timer);
/* check for old callref (before removal) then detach SPK
* if SPK has been reused by BS, our old callref will not match,
@@ -580,7 +590,7 @@ static void destroy_transaction(transaction_t *trans)
while (*transp && *transp != trans)
transp = &((*transp)->next);
if (!(*transp)) {
- PDEBUG(DTRANS, DEBUG_ERROR, "Transaction not in list, please fix!!\n");
+ LOGP(DTRANS, LOGL_ERROR, "Transaction not in list, please fix!!\n");
abort();
}
*transp = trans->next;
@@ -591,11 +601,11 @@ static void destroy_transaction(transaction_t *trans)
}
/* Timeout handling */
-void trans_timeout(struct timer *timer)
+static void trans_timeout(void *data)
{
- transaction_t *trans = (transaction_t *)timer->priv;
+ transaction_t *trans = data;
- PDEBUG(DTRANS, DEBUG_NOTICE, "Releasing transaction due to timeout.\n");
+ LOGP(DTRANS, LOGL_NOTICE, "Releasing transaction due to timeout.\n");
if (trans->callref)
call_up_release(trans->callref, CAUSE_NORMAL);
trans->callref = 0;
@@ -611,7 +621,7 @@ static transaction_t *create_transaction(uint8_t ident, uint8_t futln_nat, uint8
trans = search_transaction_number(futln_nat, futln_fuvst, futln_rest);
if (trans && mo) {
const char *rufnummer = transaction2rufnummer(trans);
- PDEBUG(DTRANS, DEBUG_NOTICE, "Found already pending transaction for subscriber '%s', dropping that!\n", rufnummer);
+ LOGP(DTRANS, LOGL_NOTICE, "Found already pending transaction for subscriber '%s', dropping that!\n", rufnummer);
if (trans->callref)
call_up_release(trans->callref, CAUSE_NORMAL);
trans->callref = 0;
@@ -620,13 +630,13 @@ static transaction_t *create_transaction(uint8_t ident, uint8_t futln_nat, uint8
}
if (trans) {
const char *rufnummer = transaction2rufnummer(trans);
- PDEBUG(DTRANS, DEBUG_NOTICE, "Found already pending transaction for subscriber '%s', we are busy!\n", rufnummer);
+ LOGP(DTRANS, LOGL_NOTICE, "Found already pending transaction for subscriber '%s', we are busy!\n", rufnummer);
return NULL;
}
trans = calloc(1, sizeof(*trans));
if (!trans) {
- PDEBUG(DTRANS, DEBUG_ERROR, "No memory!\n");
+ LOGP(DTRANS, LOGL_ERROR, "No memory!\n");
return NULL;
}
@@ -636,10 +646,10 @@ static transaction_t *create_transaction(uint8_t ident, uint8_t futln_nat, uint8
trans->futln_fuvst = futln_fuvst;
trans->futln_rest = futln_rest;
- timer_init(&trans->timer, trans_timeout, trans);
+ osmo_timer_setup(&trans->timer, trans_timeout, trans);
const char *rufnummer = transaction2rufnummer(trans);
- PDEBUG(DTRANS, DEBUG_INFO, "Creating transaction for subscriber '%s'\n", rufnummer);
+ LOGP(DTRANS, LOGL_INFO, "Creating transaction for subscriber '%s'\n", rufnummer);
/* attach to end of list, so first transaction is served first */
transp = &trans_list;
@@ -712,7 +722,7 @@ static fuvst_t *get_spk(uint8_t Q)
}
/* Convert 'Ausloesegrund' of C-Netz base station to ISDN cause */
-int cnetz_fufst2cause(uint8_t X)
+static int cnetz_fufst2cause(uint8_t X)
{
switch (X) {
case 0: /* undefiniert */
@@ -735,7 +745,7 @@ int cnetz_fufst2cause(uint8_t X)
}
/* Convert ISDN cause to 'Ausloesegrund' of C-Netz mobile station */
-uint8_t cnetz_cause2futln(int cause)
+static uint8_t cnetz_cause2futln(int cause)
{
switch (cause) {
case CAUSE_NORMAL:
@@ -763,14 +773,14 @@ static int message_send(uint8_t ident, uint8_t opcode, uint8_t *data, int len)
if (!zzk)
zzk = get_zzk(0);
if (!zzk) {
- PDEBUG(DCNETZ, DEBUG_ERROR, "No ZZK or link down!\n");
+ LOGP(DCNETZ, LOGL_ERROR, "No ZZK or link down!\n");
return -EIO;
}
uint8_t buffer[len + 2];
- if (debuglevel == DEBUG_DEBUG || opcode != OPCODE_XEDBU)
- PDEBUG(DCNETZ, DEBUG_INFO, "TX Message to BS: link=%s ident=0x%02x OP=%02XH %s\n", zzk->sender.kanal, ident, opcode, debug_hex(data, len));
+ if (loglevel == LOGL_DEBUG || opcode != OPCODE_XEDBU)
+ LOGP(DCNETZ, LOGL_INFO, "TX Message to BS: link=%s ident=0x%02x OP=%02XH %s\n", zzk->sender.kanal, ident, opcode, osmo_hexdump(data, len));
/* assemble Ident, swap Opcode and add data */
slc = ident & 0xf;
@@ -808,25 +818,25 @@ static void release_for_emergency(void)
/* found idle channel */
if (sender) {
- PDEBUG(DCNETZ, DEBUG_NOTICE, "Emergency call received. We have a free channel available.\n");
+ LOGP(DCNETZ, LOGL_NOTICE, "Emergency call received. We have a free channel available.\n");
return;
}
/* found no normal call (no emergency) */
if (!last_trans) {
- PDEBUG(DCNETZ, DEBUG_NOTICE, "Emergency call received. We cannot free a channel, because there is no non-emergency call.\n");
+ LOGP(DCNETZ, LOGL_NOTICE, "Emergency call received. We cannot free a channel, because there is no non-emergency call.\n");
return;
}
/* releasing the last call in list */
- PDEBUG(DCNETZ, DEBUG_NOTICE, "Emergency call received. We free a channel.\n");
+ LOGP(DCNETZ, LOGL_NOTICE, "Emergency call received. We free a channel.\n");
len = encode_aau(&opcode, &data, trans->spk_nr, 0, cnetz_cause2futln(CAUSE_NORMAL));
message_send(trans->ident, opcode, data, len);
call_up_release(trans->callref, CAUSE_NORMAL);
trans->callref = 0;
new_call_state(trans, STATE_RELEASE);
- timer_start(&trans->timer, RELEASE_TO);
+ osmo_timer_schedule(&trans->timer, RELEASE_TO);
}
/* MTP data message from lower layer */
@@ -847,12 +857,12 @@ static void message_receive(fuvst_t *zzk, uint8_t ident, uint8_t opcode, uint8_t
uint16_t s = 0;
uint8_t u = 0, b = 0, l = 0;
uint16_t T_array[3];
- uint8_t U_array[3], N_array[3], l_array[3];
+ uint8_t U_array[3], N_array[3], b_array[3];
int i, num;
char number[17];
- if (debuglevel == DEBUG_DEBUG || opcode != OPCODE_YLSMF)
- PDEBUG(DCNETZ, DEBUG_INFO, "RX Message from BS: link=%s ident=0x%02x OP=%02XH %s\n", zzk->sender.kanal, ident, opcode, debug_hex(data, len));
+ if (loglevel == LOGL_DEBUG || opcode != OPCODE_YLSMF)
+ LOGP(DCNETZ, LOGL_INFO, "RX Message from BS: link=%s ident=0x%02x OP=%02XH %s\n", zzk->sender.kanal, ident, opcode, osmo_hexdump(data, len));
switch (opcode) {
case OPCODE_SWAF: /* BS restarts */
@@ -866,7 +876,7 @@ static void message_receive(fuvst_t *zzk, uint8_t ident, uint8_t opcode, uint8_t
message_send(5, opcode, NULL, 0);
#endif
if (warmstart) {
- PDEBUG(DCNETZ, DEBUG_NOTICE, "Forcing a warm start and load the config...\n");
+ LOGP(DCNETZ, LOGL_NOTICE, "Forcing a warm start and load the config...\n");
warmstart = 0;
len = encode_yaaau(&opcode, &data, 42);
message_send(0, opcode, data, len);
@@ -922,7 +932,8 @@ static void message_receive(fuvst_t *zzk, uint8_t ident, uint8_t opcode, uint8_t
break;
case OPCODE_EBAF: /* enter BS (inscription) */
decode_ebaf(data, len, &T, &U, &N, &s, &u, &b, &l);
- add_db(N, U, T, l);
+ add_db(N, U, T, b, (!l || !b) ? s : -1);
+ console_inscription(nut2rufnummer(N, U, T));
len = encode_ebpqu(&opcode, &data);
message_send(ident, opcode, data, len);
break;
@@ -932,11 +943,11 @@ static void message_receive(fuvst_t *zzk, uint8_t ident, uint8_t opcode, uint8_t
break;
case OPCODE_GVAF: /* MO call */
decode_gvaf(data, len, &T, &U, &N, number);
- PDEBUG(DCNETZ, DEBUG_INFO, "Call from mobile.\n");
+ LOGP(DCNETZ, LOGL_INFO, "Call from mobile.\n");
goto outgoing;
case OPCODE_GVWAF: /* MO call (queue) */
decode_gvaf(data, len, &T, &U, &N, number);
- PDEBUG(DCNETZ, DEBUG_INFO, "Call from mobile (queue).\n");
+ LOGP(DCNETZ, LOGL_INFO, "Call from mobile (queue).\n");
outgoing:
trans = create_transaction(ident, N, U, T, 1);
if (!trans) {
@@ -958,7 +969,7 @@ outgoing:
trans = search_transaction_ident(ident);
if (!trans)
break;
- PDEBUG(DCNETZ, DEBUG_INFO, "Call to mobile is alerting (queue).\n");
+ LOGP(DCNETZ, LOGL_INFO, "Call to mobile is alerting (queue).\n");
new_call_state(trans, STATE_MT_QUEUE);
if (trans->callref)
call_up_alerting(trans->callref);
@@ -968,7 +979,7 @@ outgoing:
trans = search_transaction_ident(ident);
if (!trans)
break;
- PDEBUG(DCNETZ, DEBUG_INFO, "Call to mobile has been answered.\n");
+ LOGP(DCNETZ, LOGL_INFO, "Call to mobile has been answered.\n");
new_call_state(trans, STATE_MT_CONNECT);
if (trans->callref)
call_up_answer(trans->callref, transaction2rufnummer(trans));
@@ -986,7 +997,7 @@ outgoing:
trans->spk_nr = Q;
/* SPK not exist, release */
if (!trans->spk) {
- PDEBUG(DCNETZ, DEBUG_ERROR, "SpK '%d' requested by BS not configured, please configure all SpK that base station has available!\n", Q);
+ LOGP(DCNETZ, LOGL_ERROR, "SpK '%d' requested by BS not configured, please configure all SpK that base station has available!\n", Q);
len = encode_stnqu(&opcode, &data, Q);
message_send(ident, opcode, data, len);
if (trans->callref)
@@ -1002,22 +1013,22 @@ outgoing:
message_send(ident, opcode, data, len);
/* no callref == outgoing call */
if (!trans->callref) {
- PDEBUG(DCNETZ, DEBUG_INFO, "Setup call to network. (Ident = %d, FuTln=%s, number=%s)\n", ident, transaction2rufnummer(trans), trans->number);
+ LOGP(DCNETZ, LOGL_INFO, "Setup call to network. (Ident = %d, FuTln=%s, number=%s)\n", ident, transaction2rufnummer(trans), trans->number);
trans->callref = trans->old_callref = call_up_setup(transaction2rufnummer(trans), trans->number, OSMO_CC_NETWORK_CNETZ_NONE, "");
} else {
- PDEBUG(DCNETZ, DEBUG_NOTICE, "Call to mobile is alerting.\n");
+ LOGP(DCNETZ, LOGL_NOTICE, "Call to mobile is alerting.\n");
new_call_state(trans, STATE_MT_ALERTING);
call_up_alerting(trans->callref);
}
trans->spk->callref = trans->callref;
- PDEBUG(DCNETZ, DEBUG_INFO, "Assigned SpK %d to call.\n", trans->spk_nr);
+ LOGP(DCNETZ, LOGL_INFO, "Assigned SpK %d to call.\n", trans->spk_nr);
break;
case OPCODE_APF: /* auth response */
decode_apf(data, len, &Q, &a);
break;
case OPCODE_FAF: /* MCID request */
decode_faf(data, len);
- PDEBUG(DCNETZ, DEBUG_NOTICE, "Fangen (MCID) was activated by BS.\n");
+ LOGP(DCNETZ, LOGL_NOTICE, "Fangen (MCID) was activated by BS.\n");
break;
case OPCODE_NAF: /* incoming release (before SPK assignment) */
decode_naf(data, len, &X);
@@ -1027,7 +1038,7 @@ outgoing:
trans = search_transaction_ident(ident);
if (!trans)
break;
- PDEBUG(DCNETZ, DEBUG_NOTICE, "Call released by BS.\n");
+ LOGP(DCNETZ, LOGL_NOTICE, "Call released by BS.\n");
new_call_state(trans, STATE_RELEASE);
if (trans->callref)
call_up_release(trans->callref, cnetz_fufst2cause(X));
@@ -1057,7 +1068,7 @@ outgoing:
message_send(ident, opcode, data, len);
if (trans->callref)
call_up_release(trans->callref, cnetz_fufst2cause(X));
- PDEBUG(DCNETZ, DEBUG_NOTICE, "Call released by BS.\n");
+ LOGP(DCNETZ, LOGL_NOTICE, "Call released by BS.\n");
new_call_state(trans, STATE_RELEASE);
trans->callref = 0;
destroy_transaction(trans);
@@ -1078,16 +1089,16 @@ outgoing:
config_send(ident, PJ, D, L);
break;
case OPCODE_SADQF: /* transfer of inscription list (aktivdatei) */
- num = decode_sadqf(data, len, &s, &e, l_array, T_array, U_array, N_array);
+ num = decode_sadqf(data, len, &s, &e, b_array, T_array, U_array, N_array);
if (s == 0)
flush_db();
for (i = 0; i < num; i++)
- add_db(N_array[i], U_array[i], T_array[i], l_array[i]);
+ add_db(N_array[i], U_array[i], T_array[i], b_array[i], -1);
len = encode_ebpqu(&opcode, &data);
message_send(ident, opcode, data, len);
break;
default:
- PDEBUG(DCNETZ, DEBUG_INFO, "RX Message from BS with unknown OPcode: %02XH\n", opcode);
+ LOGP(DCNETZ, LOGL_INFO, "RX Message from BS with unknown OPcode: %02XH\n", opcode);
}
}
@@ -1123,25 +1134,25 @@ static void mtp_receive(void *inst, enum mtp_prim prim, uint8_t slc, uint8_t *da
default:
cause_text = "MTP link '%s' failed! Trying again.\n";
}
- PDEBUG(DCNETZ, DEBUG_NOTICE, cause_text, zzk->sender.kanal);
+ LOGP(DCNETZ, LOGL_NOTICE, cause_text, zzk->sender.kanal);
mtp_send(&zzk->mtp, MTP_PRIM_START, 0, NULL, 0);
zzk->link = 0;
display_status();
break;
case MTP_PRIM_IN_SERVICE:
- PDEBUG(DCNETZ, DEBUG_NOTICE, "Link '%s' established.\n", zzk->sender.kanal);
+ LOGP(DCNETZ, LOGL_NOTICE, "Link '%s' established.\n", zzk->sender.kanal);
zzk->link = 1;
display_status();
break;
case MTP_PRIM_REMOTE_PROCESSOR_OUTAGE:
- PDEBUG(DCNETZ, DEBUG_NOTICE, "Link '%s' indicates remote processor outage.\n", zzk->sender.kanal);
+ LOGP(DCNETZ, LOGL_NOTICE, "Link '%s' indicates remote processor outage.\n", zzk->sender.kanal);
break;
case MTP_PRIM_REMOTE_PROCESSOR_RECOVERED:
- PDEBUG(DCNETZ, DEBUG_NOTICE, "Link '%s' indicates remote processor outage is recovered.\n", zzk->sender.kanal);
+ LOGP(DCNETZ, LOGL_NOTICE, "Link '%s' indicates remote processor outage is recovered.\n", zzk->sender.kanal);
break;
case MTP_PRIM_DATA:
if (len < 2) {
- PDEBUG(DCNETZ, DEBUG_NOTICE, "No Opcode, message too short!\n");
+ LOGP(DCNETZ, LOGL_NOTICE, "No Opcode, message too short!\n");
return;
}
@@ -1172,17 +1183,17 @@ int fuvst_create(const char *kanal, enum fuvst_chan_type chan_type, const char *
fuvst = calloc(1, sizeof(fuvst_t));
if (!fuvst) {
- PDEBUG(DCNETZ, DEBUG_ERROR, "No memory!\n");
+ LOGP(DCNETZ, LOGL_ERROR, "No memory!\n");
return -ENOMEM;
}
- PDEBUG(DCNETZ, DEBUG_DEBUG, "Creating 'C-Netz' instance for 'Kanal' = %s (sample rate %d).\n", chan_name, samplerate);
+ LOGP(DCNETZ, LOGL_DEBUG, "Creating 'C-Netz' instance for 'Kanal' = %s (sample rate %d).\n", chan_name, samplerate);
/* init general part of transceiver */
/* do not enable emphasis, since it is done by fuvst code, not by common sender code */
rc = sender_create(&fuvst->sender, options_strdup(chan_name), 0, 0, audiodev, 0, samplerate, rx_gain, tx_gain, 0, 0, write_rx_wave, write_tx_wave, read_rx_wave, read_tx_wave, loopback, PAGING_SIGNAL_NONE);
if (rc < 0) {
- PDEBUG(DCNETZ, DEBUG_ERROR, "Failed to init transceiver process!\n");
+ LOGP(DCNETZ, LOGL_ERROR, "Failed to init transceiver process!\n");
goto error;
}
fuvst->chan_num = atoi(kanal);
@@ -1208,7 +1219,7 @@ int fuvst_create(const char *kanal, enum fuvst_chan_type chan_type, const char *
goto error;
}
- PDEBUG(DCNETZ, DEBUG_NOTICE, "Created 'Kanal' %s\n", chan_name);
+ LOGP(DCNETZ, LOGL_NOTICE, "Created 'Kanal' %s\n", chan_name);
display_status();
@@ -1225,7 +1236,7 @@ void fuvst_destroy(sender_t *sender)
{
fuvst_t *fuvst = (fuvst_t *) sender;
- PDEBUG(DCNETZ, DEBUG_DEBUG, "Destroying 'C-Netz' instance for 'Kanal' = %s.\n", sender->kanal);
+ LOGP(DCNETZ, LOGL_DEBUG, "Destroying 'C-Netz' instance for 'Kanal' = %s.\n", sender->kanal);
if (fuvst->chan_type == CHAN_TYPE_ZZK) {
mtp_exit(&fuvst->mtp);
@@ -1248,7 +1259,11 @@ void sender_send(sender_t *sender, sample_t *samples, uint8_t *power, int length
v27_modem_send(&fuvst->modem, samples, length);
else {
input_num = samplerate_upsample_input_num(&sender->srstate, length);
- jitter_load(&sender->dejitter, samples, input_num);
+ {
+ int16_t spl[input_num];
+ jitter_load_samples(&sender->dejitter, (uint8_t *)spl, input_num, sizeof(*spl), jitter_conceal_s16, NULL);
+ int16_to_samples_speech(samples, spl, input_num);
+ }
samplerate_upsample(&sender->srstate, samples, input_num, samples, length);
}
}
@@ -1284,7 +1299,7 @@ void sender_receive(sender_t *sender, sample_t *samples, int length, double __at
}
/* 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)
+void call_down_audio(void *decoder, void *decoder_priv, int callref, uint16_t sequence, uint8_t marker, uint32_t timestamp, uint32_t ssrc, uint8_t *payload, int payload_len)
{
sender_t *sender;
fuvst_t *fuvst;
@@ -1297,8 +1312,12 @@ void call_down_audio(int callref, uint16_t sequence, uint32_t timestamp, uint32_
if (!sender)
return;
- if (fuvst->callref)
- jitter_save(&fuvst->sender.dejitter, samples, count, 1, sequence, timestamp, ssrc);
+ if (fuvst->callref) {
+ jitter_frame_t *jf;
+ jf = jitter_frame_alloc(decoder, decoder_priv, payload, payload_len, marker, sequence, timestamp, ssrc);
+ if (jf)
+ jitter_save(&fuvst->sender.dejitter, jf);
+ }
}
void call_down_clock(void) {}
@@ -1325,19 +1344,19 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
/* 2. base station ready? */
if (!base_station_ready) {
- PDEBUG(DCNETZ, DEBUG_NOTICE, "Outgoing call not possible, base station not ready, rejecting!\n");
+ LOGP(DCNETZ, LOGL_NOTICE, "Outgoing call not possible, base station not ready, rejecting!\n");
return -CAUSE_TEMPFAIL;
}
/* 3. create transaction */
ident = get_free_ident();
if (!ident) {
- PDEBUG(DCNETZ, DEBUG_NOTICE, "Outgoing call not possible, no free Ident code?? What the hack?\n");
+ LOGP(DCNETZ, LOGL_NOTICE, "Outgoing call not possible, no free Ident code?? What the hack?\n");
return -CAUSE_TEMPFAIL;
}
trans = create_transaction(ident, futln_nat, futln_fuvst, futln_rest, 0);
if (!trans) {
- PDEBUG(DCNETZ, DEBUG_NOTICE, "Outgoing call not possible, Transaction already exists: Subscriber busy!\n");
+ LOGP(DCNETZ, LOGL_NOTICE, "Outgoing call not possible, Transaction already exists: Subscriber busy!\n");
return -CAUSE_BUSY;
}
trans->callref = trans->old_callref = callref;
@@ -1345,13 +1364,13 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
/* 4. start call */
len = encode_kvau(&opcode, &data, futln_rest, futln_fuvst, futln_nat, 0, authentication);
message_send(trans->ident, opcode, data, len);
- PDEBUG(DCNETZ, DEBUG_INFO, "Send call for mobile towards BS. (Ident = %d, FuTln=%s)\n", ident, transaction2rufnummer(trans));
+ LOGP(DCNETZ, LOGL_INFO, "Send call for mobile towards BS. (Ident = %d, FuTln=%s)\n", ident, transaction2rufnummer(trans));
new_call_state(trans, STATE_MT);
return 0;
}
-void call_down_answer(int callref)
+void call_down_answer(int callref, struct timeval __attribute__((unused)) *tv_meter)
{
transaction_t *trans;
uint8_t opcode, *data;
@@ -1359,7 +1378,7 @@ void call_down_answer(int callref)
trans = search_transaction_callref(callref);
if (!trans) {
- PDEBUG(DCNETZ, DEBUG_NOTICE, "Answer to unknown callref.\n");
+ LOGP(DCNETZ, LOGL_NOTICE, "Answer to unknown callref.\n");
return;
}
@@ -1387,7 +1406,7 @@ static void _disconnect_release(transaction_t *trans, int callref, int cause)
call_up_release(callref, cause);
trans->callref = 0;
new_call_state(trans, STATE_RELEASE);
- timer_start(&trans->timer, RELEASE_TO);
+ osmo_timer_schedule(&trans->timer, RELEASE_TO);
}
/* Call control sends disconnect (with tones).
@@ -1398,11 +1417,11 @@ void call_down_disconnect(int callref, int cause)
{
transaction_t *trans;
- PDEBUG(DCNETZ, DEBUG_INFO, "Call has been disconnected by network.\n");
+ LOGP(DCNETZ, LOGL_INFO, "Call has been disconnected by network.\n");
trans = search_transaction_callref(callref);
if (!trans) {
- PDEBUG(DCNETZ, DEBUG_NOTICE, "Outgoing disconnect to unknown callref.\n");
+ LOGP(DCNETZ, LOGL_NOTICE, "Outgoing disconnect to unknown callref.\n");
call_up_release(callref, CAUSE_INVALCALLREF);
return;
}
@@ -1422,11 +1441,11 @@ void call_down_release(int callref, int cause)
{
transaction_t *trans;
- PDEBUG(DCNETZ, DEBUG_INFO, "Call has been released by network.\n");
+ LOGP(DCNETZ, LOGL_INFO, "Call has been released by network.\n");
trans = search_transaction_callref(callref);
if (!trans) {
- PDEBUG(DCNETZ, DEBUG_NOTICE, "Outgoing released to unknown callref.\n");
+ LOGP(DCNETZ, LOGL_NOTICE, "Outgoing released to unknown callref.\n");
call_up_release(callref, CAUSE_INVALCALLREF);
return;
}
@@ -1438,14 +1457,14 @@ void dump_info(void)
{
cnetz_db_t *db = cnetz_db_head;
- PDEBUG(DDB, DEBUG_NOTICE, "Dump of subscriber database:\n");
+ LOGP(DDB, LOGL_NOTICE, "Dump of subscriber database:\n");
if (!db) {
- PDEBUG(DDB, DEBUG_NOTICE, " - No subscribers attached!\n");
+ LOGP(DDB, LOGL_NOTICE, " - No subscribers attached!\n");
return;
}
while (db) {
- PDEBUG(DDB, DEBUG_NOTICE, " - Subscriber '%d,%d,%d' is attached.\n", db->futln_nat, db->futln_fuvst, db->futln_rest);
+ LOGP(DDB, LOGL_NOTICE, " - Subscriber '%d,%d,%d' (reader=%s, sicherungs-code=%d) is attached.\n", db->futln_nat, db->futln_fuvst, db->futln_rest, (db->chip) ? "chip" : "magent", db->sicherungscode);
db = db->next;
}
}
diff --git a/src/fuvst/main.c b/src/fuvst/main.c
index 7a18da0..0a8ab58 100755
--- a/src/fuvst/main.c
+++ b/src/fuvst/main.c
@@ -23,10 +23,10 @@
#include <string.h>
#include <errno.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../libmobile/call.h"
#include "../libmobile/main_mobile.h"
-#include "../libtimer/timer.h"
+#include <osmocom/core/timer.h>
#include "../liboptions/options.h"
#include "../libfm/fm.h"
#include "../anetz/freiton.h"
@@ -293,6 +293,7 @@ fail:
fuvst_destroy(sender_head);
/* exits */
+ main_mobile_exit();
// zeit_exit();
fm_exit();
diff --git a/src/fuvst/mup.c b/src/fuvst/mup.c
index 7224fb4..24f0c9f 100755
--- a/src/fuvst/mup.c
+++ b/src/fuvst/mup.c
@@ -23,7 +23,8 @@
#include <string.h>
#include <time.h>
#include <inttypes.h>
-#include "../libdebug/debug.h"
+#include <osmocom/core/utils.h>
+#include "../liblogging/logging.h"
#include "mup.h"
#include "systemmeldungen.h"
@@ -291,7 +292,7 @@ static const char *futln_cause(uint8_t Y)
void decode_swaf(uint8_t *data, int len, uint8_t *V, uint8_t *N, uint8_t *U, uint8_t *F, uint8_t *C, uint8_t *B)
{
if (len < 6) {
- PDEBUG(DMUP, DEBUG_NOTICE, "Message too short!\n");
+ LOGP(DMUP, LOGL_NOTICE, "Message too short!\n");
return;
}
@@ -302,7 +303,7 @@ void decode_swaf(uint8_t *data, int len, uint8_t *V, uint8_t *N, uint8_t *U, uin
*C = data[4];
*B = data[5];
- PDEBUG(DMUP, DEBUG_INFO, "(BS SWAF) Wiederanlauf der BS: version=%d (%s) FuFSt=%d,%d,%d chip=%d (%s) beacon=%d (%s)\n", *V, version_string(*V), *N, *U, *F, *C, chip_string(*C), *B, beacon_string(*B));
+ LOGP(DMUP, LOGL_INFO, "(BS SWAF) Wiederanlauf der BS: version=%d (%s) FuFSt=%d,%d,%d chip=%d (%s) beacon=%d (%s)\n", *V, version_string(*V), *N, *U, *F, *C, chip_string(*C), *B, beacon_string(*B));
}
/* ack to base station boot */
@@ -310,7 +311,7 @@ int encode_swqu(uint8_t *opcode, uint8_t **data, uint8_t A)
{
static uint8_t buffer[1];
- PDEBUG(DMUP, DEBUG_INFO, "(MSC SWQU) Wiederanlaufquittung des MSC: aktivdatei=%d (%s)\n", A, aktivdatei_string(A));
+ LOGP(DMUP, LOGL_INFO, "(MSC SWQU) Wiederanlaufquittung des MSC: aktivdatei=%d (%s)\n", A, aktivdatei_string(A));
*opcode = OPCODE_SWQU;
buffer[0] = A;
@@ -323,7 +324,7 @@ int encode_swqu(uint8_t *opcode, uint8_t **data, uint8_t A)
void decode_suaf(uint8_t *data, int len, uint8_t *V, uint8_t *N, uint8_t *U, uint8_t *F, uint8_t *C, uint8_t *B)
{
if (len < 6) {
- PDEBUG(DMUP, DEBUG_NOTICE, "Message too short!\n");
+ LOGP(DMUP, LOGL_NOTICE, "Message too short!\n");
return;
}
@@ -334,7 +335,7 @@ void decode_suaf(uint8_t *data, int len, uint8_t *V, uint8_t *N, uint8_t *U, uin
*C = data[4];
*B = data[5];
- PDEBUG(DMUP, DEBUG_INFO, "(BS SUAF) Datum-Uhrzeit-Anforderung der BS: version=%d (%s) FuFSt=%d,%d,%d chip=%d (%s) beacon=%d (%s)\n", *V, version_string(*V), *N, *U, *F, *C, chip_string(*C), *B, beacon_string(*B));
+ LOGP(DMUP, LOGL_INFO, "(BS SUAF) Datum-Uhrzeit-Anforderung der BS: version=%d (%s) FuFSt=%d,%d,%d chip=%d (%s) beacon=%d (%s)\n", *V, version_string(*V), *N, *U, *F, *C, chip_string(*C), *B, beacon_string(*B));
}
/* ack to time request */
@@ -355,7 +356,7 @@ int encode_suqu(uint8_t *opcode, uint8_t **data, uint8_t Q, uint8_t N, time_t no
m = tm->tm_min;
s = tm->tm_sec;
- PDEBUG(DMUP, DEBUG_INFO, "(MSC SUQU) Datum-Uhrzeit-Quittung des MSC: Q=%d (%s) Widerholung=%d (%s) Wochentag=%d (%s) Datum: %d.%d.%d %d:%02d:%02d\n", Q, qualitaet_string(Q), N, wiederholung_string(N), W, woche_string(W), D, M, J, h, m, s);
+ LOGP(DMUP, LOGL_INFO, "(MSC SUQU) Datum-Uhrzeit-Quittung des MSC: Q=%d (%s) Widerholung=%d (%s) Wochentag=%d (%s) Datum: %d.%d.%d %d:%02d:%02d\n", Q, qualitaet_string(Q), N, wiederholung_string(N), W, woche_string(W), D, M, J, h, m, s);
*opcode = OPCODE_SUQU;
buffer[0] = Q | (N << 1) | (R << 2);
@@ -380,7 +381,7 @@ void decode_sssaf(uint8_t *data, int len)
int i, start_i = 0, stop_i = 0;
if (len < 11) {
- PDEBUG(DMUP, DEBUG_NOTICE, "Message too short!\n");
+ LOGP(DMUP, LOGL_NOTICE, "Message too short!\n");
return;
}
@@ -388,9 +389,9 @@ void decode_sssaf(uint8_t *data, int len)
A = data[1] | (data[2] << 8);
E = data[3] | (data[4] << 8);
- PDEBUG(DMUP, DEBUG_INFO, "(BS SSSAF) Sprechkanal-Sammel-Sperrauftrag der BS: Liste-Ende=%d Anfang=%d Ende=%d\n", E_, A, E);
+ LOGP(DMUP, LOGL_INFO, "(BS SSSAF) Sprechkanal-Sammel-Sperrauftrag der BS: Liste-Ende=%d Anfang=%d Ende=%d\n", E_, A, E);
if (E - A + 1 > 6 * 8) {
- PDEBUG(DMUP, DEBUG_INFO, " -> Bereich zu gross für Nachricht!\n");
+ LOGP(DMUP, LOGL_INFO, " -> Bereich zu gross für Nachricht!\n");
return;
}
if ((int)E - (int)A < 0)
@@ -411,9 +412,9 @@ void decode_sssaf(uint8_t *data, int len)
if (i > 0 && S != last_S) {
end:
if (start_i == stop_i)
- PDEBUG(DMUP, DEBUG_INFO, " -> SpK #%d=%d (%s)\n", start_i + A, last_S, (last_S) ? "gesperrt" : "frei");
+ LOGP(DMUP, LOGL_INFO, " -> SpK #%d=%d (%s)\n", start_i + A, last_S, (last_S) ? "gesperrt" : "frei");
else
- PDEBUG(DMUP, DEBUG_INFO, " -> SpK #%d..%d=%d (%s)\n", start_i + A, stop_i + A, last_S, (last_S) ? "gesperrt" : "frei");
+ LOGP(DMUP, LOGL_INFO, " -> SpK #%d..%d=%d (%s)\n", start_i + A, stop_i + A, last_S, (last_S) ? "gesperrt" : "frei");
/* new start */
start_i = stop_i = i;
}
@@ -425,20 +426,20 @@ end:
void encode_sssqu(uint8_t *opcode)
{
*opcode = OPCODE_SSSQU;
- PDEBUG(DMUP, DEBUG_INFO, "(MSC SSSQU) Sprechkanal-Sammel-Sperrquittung des MSC\n");
+ LOGP(DMUP, LOGL_INFO, "(MSC SSSQU) Sprechkanal-Sammel-Sperrquittung des MSC\n");
}
/* base station locks a voice channel */
void decode_ssaf(uint8_t *data, int len, uint8_t *S)
{
if (len < 1) {
- PDEBUG(DMUP, DEBUG_NOTICE, "Message too short!\n");
+ LOGP(DMUP, LOGL_NOTICE, "Message too short!\n");
return;
}
*S = data[0];
- PDEBUG(DMUP, DEBUG_INFO, "(BS SSAF) Sprechkanal-Sperr-Auftrag der BS: SPK=%d\n", *S);
+ LOGP(DMUP, LOGL_INFO, "(BS SSAF) Sprechkanal-Sperr-Auftrag der BS: SPK=%d\n", *S);
}
/* ack to lockeed voice channel */
@@ -446,7 +447,7 @@ int encode_ssqu(uint8_t *opcode, uint8_t **data, uint8_t S)
{
static uint8_t buffer[1];
- PDEBUG(DMUP, DEBUG_INFO, "(MSC SSQU) Sprechkanal-Sperr-Quittung von der MSC: SPK=%d\n", S);
+ LOGP(DMUP, LOGL_INFO, "(MSC SSQU) Sprechkanal-Sperr-Quittung von der MSC: SPK=%d\n", S);
*opcode = OPCODE_SSQU;
buffer[0] = S;
@@ -459,13 +460,13 @@ int encode_ssqu(uint8_t *opcode, uint8_t **data, uint8_t S)
void decode_sfaf(uint8_t *data, int len, uint8_t *S)
{
if (len < 1) {
- PDEBUG(DMUP, DEBUG_NOTICE, "Message too short!\n");
+ LOGP(DMUP, LOGL_NOTICE, "Message too short!\n");
return;
}
*S = data[0];
- PDEBUG(DMUP, DEBUG_INFO, "(BS SFAF) Sprechkanal-Freigabe-Auftrag der BS: SPK=%d\n", *S);
+ LOGP(DMUP, LOGL_INFO, "(BS SFAF) Sprechkanal-Freigabe-Auftrag der BS: SPK=%d\n", *S);
}
/* ack to unlockeed voice channel */
@@ -473,7 +474,7 @@ int encode_sfqu(uint8_t *opcode, uint8_t **data, uint8_t S)
{
static uint8_t buffer[1];
- PDEBUG(DMUP, DEBUG_INFO, "(MSC SFQU) Sprechkanal-Freigabe-Quittung von der MSC: SPK=%d\n", S);
+ LOGP(DMUP, LOGL_INFO, "(MSC SFQU) Sprechkanal-Freigabe-Quittung von der MSC: SPK=%d\n", S);
*opcode = OPCODE_SFQU;
buffer[0] = S;
@@ -485,13 +486,13 @@ int encode_sfqu(uint8_t *opcode, uint8_t **data, uint8_t S)
/* base station ready */
void decode_svaf(uint8_t __attribute__((unused)) *data, int __attribute__((unused)) len)
{
- PDEBUG(DMUP, DEBUG_INFO, "(BS SVAF) Vermittlungsfaehig-Auftrag der BS\n");
+ LOGP(DMUP, LOGL_INFO, "(BS SVAF) Vermittlungsfaehig-Auftrag der BS\n");
}
/* ack to base station ready */
int encode_svqu(uint8_t *opcode, uint8_t **data)
{
- PDEBUG(DMUP, DEBUG_INFO, "(MSC SVQU) Vermittlungsfaehig-Quittung des MSC\n");
+ LOGP(DMUP, LOGL_INFO, "(MSC SVQU) Vermittlungsfaehig-Quittung des MSC\n");
*opcode = OPCODE_SVQU;
*data = NULL;
@@ -501,13 +502,13 @@ int encode_svqu(uint8_t *opcode, uint8_t **data)
/* base station requests alarm messages */
void decode_ylsaf(uint8_t __attribute__((unused)) *data, int __attribute__((unused)) len)
{
- PDEBUG(DMUP, DEBUG_INFO, "(BS YLSAF) Systemmeldungsanforderung an MSC\n");
+ LOGP(DMUP, LOGL_INFO, "(BS YLSAF) Systemmeldungsanforderung an MSC\n");
}
/* ack to base stations alarm request */
int encode_ylsmu(uint8_t *opcode, uint8_t **data)
{
- PDEBUG(DMUP, DEBUG_INFO, "(MSC YLSMU) Systemmeldungsbestaetigung vom MSC\n");
+ LOGP(DMUP, LOGL_INFO, "(MSC YLSMU) Systemmeldungsbestaetigung vom MSC\n");
*opcode = OPCODE_YLSMU;
*data = NULL;
@@ -518,7 +519,7 @@ int encode_ylsmu(uint8_t *opcode, uint8_t **data)
void decode_ylsmf(uint8_t *data, int len, uint8_t *N, uint8_t *C, struct SysMeld *SM)
{
if (len < 9) {
- PDEBUG(DMUP, DEBUG_NOTICE, "Message too short!\n");
+ LOGP(DMUP, LOGL_NOTICE, "Message too short!\n");
return;
}
@@ -578,7 +579,7 @@ void decode_ylsmf(uint8_t *data, int len, uint8_t *N, uint8_t *C, struct SysMeld
indizien[strlen(indizien)] = ' ';
}
- PDEBUG(DMUP, DEBUG_INFO, "SM: %03d %02d.%02d %02d:%02d %s%02d %c H\"%04X %02d H\"%sH\"%02X%02X%02X%02X\n", *C,
+ LOGP(DMUP, LOGL_INFO, "SM: %03d %02d.%02d %02d:%02d %s%02d %c H\"%04X %02d H\"%sH\"%02X%02X%02X%02X\n", *C,
SM->Monat, SM->Tag, SM->Stunde, SM->Minute,
einrichtrungstyp_string(SM->Einrichtungstyp), SM->Einrichtungsnr,
SM->ASCII_Typ ? : '0', SM->Systemmeldungsnr,
@@ -590,13 +591,13 @@ void decode_ylsmf(uint8_t *data, int len, uint8_t *N, uint8_t *C, struct SysMeld
/* base station ends list of alarm messages */
void decode_ylsef(uint8_t __attribute__((unused)) *data, int __attribute__((unused)) len)
{
- PDEBUG(DMUP, DEBUG_INFO, "(BS YLSEF) Systemmeldungsuebertragungsende an MSC\n");
+ LOGP(DMUP, LOGL_INFO, "(BS YLSEF) Systemmeldungsuebertragungsende an MSC\n");
}
/* base station requests billing info */
void decode_stdaf(uint8_t __attribute__((unused)) *data, int __attribute__((unused)) len)
{
- PDEBUG(DMUP, DEBUG_INFO, "(BS STDAF) Tarifdatenauftrag der BS\n");
+ LOGP(DMUP, LOGL_INFO, "(BS STDAF) Tarifdatenauftrag der BS\n");
}
/* reply to billing info */
@@ -606,7 +607,7 @@ int encode_xgtau(uint8_t *opcode, uint8_t **data, uint8_t Z, uint32_t T, uint8_t
// Example from UeLE-ROM = { 0xff, 0x00, 0x01, 0xec, 0x3f, 0x01, 0x31, 0x1c, 0x03 };
// { 0xff, 0x00, 0x01, 0xec, 0x3f, 0x01, 0x41, 0x1c, 0x03 };
- PDEBUG(DMUP, DEBUG_INFO, "(MSC XGTAU) Tarifdatensignalisierung vom MSC\n");
+ LOGP(DMUP, LOGL_INFO, "(MSC XGTAU) Tarifdatensignalisierung vom MSC\n");
*opcode = OPCODE_XGTAU;
buffer[0] = 0xff;
@@ -627,7 +628,7 @@ int encode_xgtau(uint8_t *opcode, uint8_t **data, uint8_t Z, uint32_t T, uint8_t
void decode_ebaf(uint8_t *data, int len, uint16_t *T, uint8_t *U, uint8_t *N, uint16_t *s, uint8_t *u, uint8_t *b, uint8_t *l)
{
if (len < 6) {
- PDEBUG(DMUP, DEBUG_NOTICE, "Message too short!\n");
+ LOGP(DMUP, LOGL_NOTICE, "Message too short!\n");
return;
}
@@ -639,13 +640,13 @@ void decode_ebaf(uint8_t *data, int len, uint16_t *T, uint8_t *U, uint8_t *N, ui
*b = (data[5] >> 6) & 0x1;
*l = data[5] >> 7;
- PDEBUG(DMUP, DEBUG_INFO, "(BS EBAF) Einbuchauftrag: FuTln=%d,%d,%d (0161-%d%d%05d)\n", *N, *U, *T, *N, *U, *T);
+ LOGP(DMUP, LOGL_INFO, "(BS EBAF) Einbuchauftrag: FuTln=%d,%d,%d (0161-%d%d%05d) reader=%s\n", *N, *U, *T, *N, *U, *T, (b) ? "chip" : "magent");
}
/* ack to inscription */
int encode_ebpqu(uint8_t *opcode, uint8_t **data)
{
- PDEBUG(DMUP, DEBUG_INFO, "(MSC EBPQU) Einbuchungs-Positiv-Quittiung vom MSC\n");
+ LOGP(DMUP, LOGL_INFO, "(MSC EBPQU) Einbuchungs-Positiv-Quittiung vom MSC\n");
*opcode = OPCODE_EBPQU;
*data = NULL;
@@ -656,7 +657,7 @@ int encode_ebpqu(uint8_t *opcode, uint8_t **data)
void decode_abaf(uint8_t *data, int len, uint16_t *T, uint8_t *U, uint8_t *N)
{
if (len < 3) {
- PDEBUG(DMUP, DEBUG_NOTICE, "Message too short!\n");
+ LOGP(DMUP, LOGL_NOTICE, "Message too short!\n");
return;
}
@@ -664,18 +665,18 @@ void decode_abaf(uint8_t *data, int len, uint16_t *T, uint8_t *U, uint8_t *N)
*U = data[2] & 0x1f;
*N = data[2] >> 5;
- PDEBUG(DMUP, DEBUG_INFO, "(BS ABAF) Ausbuchung-Auftrag der BS: FuTln=%d,%d,%d (0161-%d%d%05d)\n", *N, *U, *T, *N, *U, *T);
+ LOGP(DMUP, LOGL_INFO, "(BS ABAF) Ausbuchung-Auftrag der BS: FuTln=%d,%d,%d (0161-%d%d%05d)\n", *N, *U, *T, *N, *U, *T);
}
static char digit2char[16] = "0123456789a*#bcd";
/* MO call */
-void _decode_outgoing(uint8_t *data, int len, uint16_t *T, uint8_t *U, uint8_t *N, char *number)
+static void _decode_outgoing(uint8_t *data, int len, uint16_t *T, uint8_t *U, uint8_t *N, char *number)
{
int i;
if (len < 11) {
- PDEBUG(DMUP, DEBUG_NOTICE, "Message too short!\n");
+ LOGP(DMUP, LOGL_NOTICE, "Message too short!\n");
return;
}
@@ -709,14 +710,14 @@ void decode_gvaf(uint8_t *data, int len, uint16_t *T, uint8_t *U, uint8_t *N, ch
{
_decode_outgoing(data, len, T, U , N, number);
- PDEBUG(DMUP, DEBUG_INFO, "(BS GVAF) Gehender Verbindungs-Auftrag der BS: FuTln=%d,%d,%d (0161-%d%d%05d) number=%s\n", *N, *U, *T, *N, *U, *T, number);
+ LOGP(DMUP, LOGL_INFO, "(BS GVAF) Gehender Verbindungs-Auftrag der BS: FuTln=%d,%d,%d (0161-%d%d%05d) number=%s\n", *N, *U, *T, *N, *U, *T, number);
}
void decode_gvwaf(uint8_t *data, int len, uint16_t *T, uint8_t *U, uint8_t *N, char *number)
{
_decode_outgoing(data, len, T, U , N, number);
- PDEBUG(DMUP, DEBUG_INFO, "(BS GVWAF) Gehender Verbindungs-Warteschlange-Auftrag der BS: FuTln=%d,%d,%d (0161-%d%d%05d) number=%s\n", *N, *U, *T, *N, *U, *T, number);
+ LOGP(DMUP, LOGL_INFO, "(BS GVWAF) Gehender Verbindungs-Warteschlange-Auftrag der BS: FuTln=%d,%d,%d (0161-%d%d%05d) number=%s\n", *N, *U, *T, *N, *U, *T, number);
}
/* ack to MO call */
@@ -724,7 +725,7 @@ int encode_gvpqu(uint8_t *opcode, uint8_t **data, uint8_t P, uint8_t e)
{
static uint8_t buffer[2];
- PDEBUG(DMUP, DEBUG_INFO, "(MSC GVPQU) Verbindungs-Positiv-Quittiung vom MSC: Prio=%d (%s) AP-Pruefung=%d\n", P, prio_string(P), e);
+ LOGP(DMUP, LOGL_INFO, "(MSC GVPQU) Verbindungs-Positiv-Quittiung vom MSC: Prio=%d (%s) AP-Pruefung=%d\n", P, prio_string(P), e);
*opcode = OPCODE_GVNQU;
buffer[0] = P;
@@ -739,7 +740,7 @@ int encode_gvnqu(uint8_t *opcode, uint8_t **data, uint8_t X, uint8_t Y)
{
static uint8_t buffer[2];
- PDEBUG(DMUP, DEBUG_INFO, "(MSC GVNQU) Verbindungs-Negativ-Quittiung vom MSC: Grund=%d (%s) Grund(FuTlg)=%d (%s)\n", X, fufst_cause(X), Y, futln_cause(Y));
+ LOGP(DMUP, LOGL_INFO, "(MSC GVNQU) Verbindungs-Negativ-Quittiung vom MSC: Grund=%d (%s) Grund(FuTlg)=%d (%s)\n", X, fufst_cause(X), Y, futln_cause(Y));
*opcode = OPCODE_GVNQU;
buffer[0] = X;
@@ -754,7 +755,7 @@ int encode_kvau(uint8_t *opcode, uint8_t **data, uint16_t T, uint8_t U, uint8_t
{
static uint8_t buffer[5];
- PDEBUG(DMUP, DEBUG_INFO, "(MSC KVAU) Kommender Verbindungs-Auftrag vom MSC: FuTln=%d,%d,%d (0161-%d%d%05d) Rufzeitbegrenzung=%d (%s) AP-Pruefung=%d\n", N, U, T, N, U, T, F, rufzeit_string(F), e);
+ LOGP(DMUP, LOGL_INFO, "(MSC KVAU) Kommender Verbindungs-Auftrag vom MSC: FuTln=%d,%d,%d (0161-%d%d%05d) Rufzeitbegrenzung=%d (%s) AP-Pruefung=%d\n", N, U, T, N, U, T, F, rufzeit_string(F), e);
*opcode = OPCODE_KVAU;
buffer[0] = T;
@@ -770,20 +771,20 @@ int encode_kvau(uint8_t *opcode, uint8_t **data, uint16_t T, uint8_t U, uint8_t
/* ack to MT call on queue */
void decode_kvwqf(uint8_t __attribute__((unused)) *data, int __attribute__((unused)) len)
{
- PDEBUG(DMUP, DEBUG_INFO, "(BS KVWQF) Kommende Verbindungs-Warteschalngen-Quittung der BS\n");
+ LOGP(DMUP, LOGL_INFO, "(BS KVWQF) Kommende Verbindungs-Warteschalngen-Quittung der BS\n");
}
/* answer of MT call */
void decode_kvbaf(uint8_t __attribute__((unused)) *data, int __attribute__((unused)) len)
{
- PDEBUG(DMUP, DEBUG_INFO, "(BS KVBAF) Kommende Verbindungs-Beginn-Auftrag der BS\n");
+ LOGP(DMUP, LOGL_INFO, "(BS KVBAF) Kommende Verbindungs-Beginn-Auftrag der BS\n");
}
/* loop test request */
void decode_staf(uint8_t *data, int len, uint8_t *Q, uint8_t *V, uint8_t *e, uint64_t *n)
{
if (len < 10) {
- PDEBUG(DMUP, DEBUG_NOTICE, "Message too short!\n");
+ LOGP(DMUP, LOGL_NOTICE, "Message too short!\n");
return;
}
@@ -799,7 +800,7 @@ void decode_staf(uint8_t *data, int len, uint8_t *Q, uint8_t *V, uint8_t *e, uin
*n |= (uint64_t)data[8] << 48;
*n |= (uint64_t)data[9] << 56;
- PDEBUG(DMUP, DEBUG_INFO, "(BS STAF) Schleifentest-Auftrag der BS: SPK=%d Typ=%d (%s) AP-Pruefung=%d Random=0x%016" PRIx64 "\n", *Q, *V, typ_string(*V), *e, *n);
+ LOGP(DMUP, LOGL_INFO, "(BS STAF) Schleifentest-Auftrag der BS: SPK=%d Typ=%d (%s) AP-Pruefung=%d Random=0x%016" PRIx64 "\n", *Q, *V, typ_string(*V), *e, *n);
}
/* loop test positive */
@@ -807,7 +808,7 @@ int encode_stpqu(uint8_t *opcode, uint8_t **data, uint8_t Q, uint8_t A, uint8_t
{
static uint8_t buffer[7];
- PDEBUG(DMUP, DEBUG_INFO, "(MSC STPQU) Schleifentest-Positiv-Quittiung vom MSC: SPK=%d\n", Q);
+ LOGP(DMUP, LOGL_INFO, "(MSC STPQU) Schleifentest-Positiv-Quittiung vom MSC: SPK=%d\n", Q);
*opcode = OPCODE_STPQU;
buffer[0] = Q;
@@ -827,7 +828,7 @@ int encode_stnqu(uint8_t *opcode, uint8_t **data, uint8_t Q)
{
static uint8_t buffer[1];
- PDEBUG(DMUP, DEBUG_INFO, "(MSC STNQU) Schleifentest-Negativ-Quittiung vom MSC: SPK=%d\n", Q);
+ LOGP(DMUP, LOGL_INFO, "(MSC STNQU) Schleifentest-Negativ-Quittiung vom MSC: SPK=%d\n", Q);
*opcode = OPCODE_STNQU;
buffer[0] = Q;
@@ -840,7 +841,7 @@ int encode_stnqu(uint8_t *opcode, uint8_t **data, uint8_t Q)
void decode_apf(uint8_t *data, int len, uint8_t *Q, uint64_t *a)
{
if (len < 9) {
- PDEBUG(DMUP, DEBUG_NOTICE, "Message too short!\n");
+ LOGP(DMUP, LOGL_NOTICE, "Message too short!\n");
return;
}
@@ -854,7 +855,7 @@ void decode_apf(uint8_t *data, int len, uint8_t *Q, uint64_t *a)
*a |= (uint64_t)data[7] << 48;
*a |= (uint64_t)data[8] << 56;
- PDEBUG(DMUP, DEBUG_INFO, "(BS APF) Autorisierunsparameter FUKO: SPK=%d AP=0x%016" PRIx64 "\n", *Q, *a);
+ LOGP(DMUP, LOGL_INFO, "(BS APF) Autorisierunsparameter FUKO: SPK=%d AP=0x%016" PRIx64 "\n", *Q, *a);
}
/* start metering pulses (answer to call) */
@@ -862,7 +863,7 @@ int encode_gstau(uint8_t *opcode, uint8_t **data, uint8_t Q, uint16_t G, uint8_t
{
static uint8_t buffer[6];
- PDEBUG(DMUP, DEBUG_INFO, "(MSC GSTAU) Gebuehren-Start-Auftrag vom MSC: SPK=%d\n", Q);
+ LOGP(DMUP, LOGL_INFO, "(MSC GSTAU) Gebuehren-Start-Auftrag vom MSC: SPK=%d\n", Q);
*opcode = OPCODE_GSTAU;
buffer[0] = Q;
@@ -879,26 +880,26 @@ int encode_gstau(uint8_t *opcode, uint8_t **data, uint8_t Q, uint16_t G, uint8_t
/* MCID */
void decode_faf(uint8_t __attribute__((unused)) *data, int __attribute__((unused)) len)
{
- PDEBUG(DMUP, DEBUG_INFO, "(BS FAF) Fang-Auftrag der BS\n");
+ LOGP(DMUP, LOGL_INFO, "(BS FAF) Fang-Auftrag der BS\n");
}
/* release by base station (before SPK assignment) */
void decode_naf(uint8_t *data, int len, uint8_t *X)
{
if (len < 1) {
- PDEBUG(DMUP, DEBUG_NOTICE, "Message too short!\n");
+ LOGP(DMUP, LOGL_NOTICE, "Message too short!\n");
return;
}
*X = data[0];
- PDEBUG(DMUP, DEBUG_INFO, "(BS AAF) Negativ-Auftrag der BS: Grund=%d (%s)\n", *X, fufst_cause(*X));
+ LOGP(DMUP, LOGL_INFO, "(BS AAF) Negativ-Auftrag der BS: Grund=%d (%s)\n", *X, fufst_cause(*X));
}
/* release by base station ack (before SPK assignment) */
int encode_equ(uint8_t *opcode, uint8_t **data)
{
- PDEBUG(DMUP, DEBUG_INFO, "(MSC AQU) Ende-Quittung vom MSC\n");
+ LOGP(DMUP, LOGL_INFO, "(MSC AQU) Ende-Quittung vom MSC\n");
*opcode = OPCODE_EQU;
*data = NULL;
@@ -909,14 +910,14 @@ int encode_equ(uint8_t *opcode, uint8_t **data)
void decode_aaf(uint8_t *data, int len, uint8_t *Q, uint8_t *X)
{
if (len < 2) {
- PDEBUG(DMUP, DEBUG_NOTICE, "Message too short!\n");
+ LOGP(DMUP, LOGL_NOTICE, "Message too short!\n");
return;
}
*Q = data[0];
*X = data[1];
- PDEBUG(DMUP, DEBUG_INFO, "(BS AAF) Ausloese-Auftrag der BS: SPK=%d, Grund=%d (%s)\n", *Q, *X, fufst_cause(*X));
+ LOGP(DMUP, LOGL_INFO, "(BS AAF) Ausloese-Auftrag der BS: SPK=%d, Grund=%d (%s)\n", *Q, *X, fufst_cause(*X));
}
/* release by base station ack (after SPK assignment) */
@@ -924,7 +925,7 @@ int encode_aqu(uint8_t *opcode, uint8_t **data, uint8_t Q)
{
static uint8_t buffer[1];
- PDEBUG(DMUP, DEBUG_INFO, "(MSC AQU) Ausloese-Quittung vom MSC: SPK=%d\n", Q);
+ LOGP(DMUP, LOGL_INFO, "(MSC AQU) Ausloese-Quittung vom MSC: SPK=%d\n", Q);
*opcode = OPCODE_AQU;
buffer[0] = Q;
@@ -938,7 +939,7 @@ int encode_nau(uint8_t *opcode, uint8_t **data, uint8_t X, uint8_t Y)
{
static uint8_t buffer[2];
- PDEBUG(DMUP, DEBUG_INFO, "(MSC NAU) Negativ-Auftrag vom MSC: Grund=%d (%s) Grund(FuTlg)=%d (%s)\n", X, fufst_cause(X), Y, futln_cause(Y));
+ LOGP(DMUP, LOGL_INFO, "(MSC NAU) Negativ-Auftrag vom MSC: Grund=%d (%s) Grund(FuTlg)=%d (%s)\n", X, fufst_cause(X), Y, futln_cause(Y));
*opcode = OPCODE_NAU;
buffer[0] = X;
@@ -951,7 +952,7 @@ int encode_nau(uint8_t *opcode, uint8_t **data, uint8_t X, uint8_t Y)
/* release by network ack (before SPK assignment) */
void decode_eqf(uint8_t __attribute__((unused)) *data, int __attribute__((unused)) len)
{
- PDEBUG(DMUP, DEBUG_INFO, "(BS EQF) Ende-Quittung der BS\n");
+ LOGP(DMUP, LOGL_INFO, "(BS EQF) Ende-Quittung der BS\n");
}
/* release by network (after SPK assignment) */
@@ -959,7 +960,7 @@ int encode_aau(uint8_t *opcode, uint8_t **data, uint8_t Q, uint8_t X, uint8_t Y)
{
static uint8_t buffer[3];
- PDEBUG(DMUP, DEBUG_INFO, "(MSC AAU) Ausloese-Auftrag vom MSC: SPK=%d, Grund=%d (%s) Grund(FuTlg)=%d (%s)\n", Q, X, fufst_cause(X), Y, futln_cause(Y));
+ LOGP(DMUP, LOGL_INFO, "(MSC AAU) Ausloese-Auftrag vom MSC: SPK=%d, Grund=%d (%s) Grund(FuTlg)=%d (%s)\n", Q, X, fufst_cause(X), Y, futln_cause(Y));
*opcode = OPCODE_AAU;
buffer[0] = Q;
@@ -974,20 +975,20 @@ int encode_aau(uint8_t *opcode, uint8_t **data, uint8_t Q, uint8_t X, uint8_t Y)
void decode_aqf(uint8_t *data, int len, uint8_t *Q)
{
if (len < 1) {
- PDEBUG(DMUP, DEBUG_NOTICE, "Message too short!\n");
+ LOGP(DMUP, LOGL_NOTICE, "Message too short!\n");
return;
}
*Q = data[0];
- PDEBUG(DMUP, DEBUG_INFO, "(BS AQF) Ausloese-Quittung der BS: SPK=%d\n", *Q);
+ LOGP(DMUP, LOGL_INFO, "(BS AQF) Ausloese-Quittung der BS: SPK=%d\n", *Q);
}
/* request data base block */
void decode_xadbf(uint8_t *data, int len, uint8_t *PJ, uint16_t *D, uint16_t *L)
{
if (len < 6) {
- PDEBUG(DMUP, DEBUG_NOTICE, "Message too short!\n");
+ LOGP(DMUP, LOGL_NOTICE, "Message too short!\n");
return;
}
@@ -995,7 +996,7 @@ void decode_xadbf(uint8_t *data, int len, uint8_t *PJ, uint16_t *D, uint16_t *L)
*D = data[2] | (data[3] << 8);
*L = data[4] | (data[5] << 8);
- PDEBUG(DMUP, DEBUG_INFO, "(BS XADBF) Auftragssign. Anfordern BS-DB-Datenblock am MSC: job=%d, offset=0x%02x length=0x%02x\n", *PJ, *D, *L);
+ LOGP(DMUP, LOGL_INFO, "(BS XADBF) Auftragssign. Anfordern BS-DB-Datenblock am MSC: job=%d, offset=0x%02x length=0x%02x\n", *PJ, *D, *L);
}
/* transfer data base block */
@@ -1003,7 +1004,7 @@ int encode_xedbu_1(uint8_t *opcode, uint8_t **data, uint8_t R, uint8_t PJ, uint1
{
static uint8_t buffer[4];
- PDEBUG(DMUP, DEBUG_INFO, "(MSC XEDBU) Ergebnissignal. Transfer BS-DB-Datenblock (header): return=%d job=%d frames=%d\n", R, PJ, A);
+ LOGP(DMUP, LOGL_INFO, "(MSC XEDBU) Ergebnissignal. Transfer BS-DB-Datenblock (header): return=%d job=%d frames=%d\n", R, PJ, A);
*opcode = OPCODE_XEDBU;
buffer[0] = R;
@@ -1018,10 +1019,10 @@ int encode_xedbu_2(uint8_t *opcode, uint8_t **data, uint8_t S, uint8_t PJ, uint8
{
static uint8_t buffer[11];
- if (debuglevel == DEBUG_DEBUG)
- PDEBUG(DMUP, DEBUG_INFO, "(MSC XEDBU) Ergebnissignal. Transfer BS-DB-Datenblock (data): count=%d job=%d data=%s\n", S, PJ, debug_hex(P, 9));
+ if (loglevel == LOGL_DEBUG)
+ LOGP(DMUP, LOGL_INFO, "(MSC XEDBU) Ergebnissignal. Transfer BS-DB-Datenblock (data): count=%d job=%d data=%s\n", S, PJ, osmo_hexdump(P, 9));
else if (S == 1)
- PDEBUG(DMUP, DEBUG_INFO, "(MSC XEDBU) Ergebnissignal. Transfer BS-DB-Datenblock (data): Messages are not shown, due to heavy debug output!\n");
+ LOGP(DMUP, LOGL_INFO, "(MSC XEDBU) Ergebnissignal. Transfer BS-DB-Datenblock (data): Messages are not shown, due to heavy debug output!\n");
*opcode = OPCODE_XEDBU;
buffer[0] = S;
@@ -1035,7 +1036,7 @@ int encode_xedbu_3(uint8_t *opcode, uint8_t **data, uint8_t S, uint8_t PJ, uint1
{
static uint8_t buffer[9];
- PDEBUG(DMUP, DEBUG_INFO, "(MSC XEDBU) Ergebnissignal. Transfer BS-DB-Datenblock (footer): count=%d job=%d offset=0x%02x length=0x%02x checksum=0x%06x\n", S, PJ, D, L, CS);
+ LOGP(DMUP, LOGL_INFO, "(MSC XEDBU) Ergebnissignal. Transfer BS-DB-Datenblock (footer): count=%d job=%d offset=0x%02x length=0x%02x checksum=0x%06x\n", S, PJ, D, L, CS);
*opcode = OPCODE_XEDBU;
buffer[0] = S;
@@ -1057,7 +1058,7 @@ int encode_yaaau(uint8_t *opcode, uint8_t **data, uint8_t J)
{
static uint8_t buffer[2];
- PDEBUG(DMUP, DEBUG_INFO, "(MSC YAAAU) Auftrag Initialisieren BS des MSC: job=%d\n", J);
+ LOGP(DMUP, LOGL_INFO, "(MSC YAAAU) Auftrag Initialisieren BS des MSC: job=%d\n", J);
*opcode = OPCODE_YAAAU;
buffer[0] = 0xff;
@@ -1072,7 +1073,7 @@ int encode_swau(uint8_t *opcode, uint8_t **data, uint8_t V)
{
static uint8_t buffer[1];
- PDEBUG(DMUP, DEBUG_INFO, "(MSC SWAU) Wiederanlaufauftrag des MSC: version=%d (%s)\n", V, version_string(V));
+ LOGP(DMUP, LOGL_INFO, "(MSC SWAU) Wiederanlaufauftrag des MSC: version=%d (%s)\n", V, version_string(V));
*opcode = OPCODE_SWAU;
buffer[0] = V;
@@ -1085,7 +1086,7 @@ int encode_swau(uint8_t *opcode, uint8_t **data, uint8_t V)
void decode_swqf(uint8_t *data, int len, uint8_t *V, uint8_t *N, uint8_t *U, uint8_t *F, uint8_t *C, uint8_t *B)
{
if (len < 6) {
- PDEBUG(DMUP, DEBUG_NOTICE, "Message too short!\n");
+ LOGP(DMUP, LOGL_NOTICE, "Message too short!\n");
return;
}
@@ -1096,30 +1097,30 @@ void decode_swqf(uint8_t *data, int len, uint8_t *V, uint8_t *N, uint8_t *U, uin
*C = data[4];
*B = data[5];
- PDEBUG(DMUP, DEBUG_INFO, "(BS SWQF) Wiederanlauf-Quittung der BS: version=%d (%s) FuFSt=%d,%d,%d chip=%d (%s) beacon=%d (%s)\n", *V, version_string(*V), *N, *U, *F, *C, chip_string(*C), *B, beacon_string(*B));
+ LOGP(DMUP, LOGL_INFO, "(BS SWQF) Wiederanlauf-Quittung der BS: version=%d (%s) FuFSt=%d,%d,%d chip=%d (%s) beacon=%d (%s)\n", *V, version_string(*V), *N, *U, *F, *C, chip_string(*C), *B, beacon_string(*B));
}
/* request "Aktivdatei" (inscripted substribers) */
void encode_sadau(uint8_t *opcode)
{
*opcode = OPCODE_SADAU;
- PDEBUG(DMUP, DEBUG_INFO, "(MSC SADAU) Aktivdatei-Auftrag vom MSC\n");
+ LOGP(DMUP, LOGL_INFO, "(MSC SADAU) Aktivdatei-Auftrag vom MSC\n");
}
/* ack "Aktivdatei" */
-int decode_sadqf(uint8_t *data, int len, uint16_t *S, uint8_t *E, uint8_t *l, uint16_t *T, uint8_t *U, uint8_t *N)
+int decode_sadqf(uint8_t *data, int len, uint16_t *S, uint8_t *E, uint8_t *b, uint16_t *T, uint8_t *U, uint8_t *N)
{
int i, n = 0;
if (len < 11) {
- PDEBUG(DMUP, DEBUG_NOTICE, "Message too short!\n");
+ LOGP(DMUP, LOGL_NOTICE, "Message too short!\n");
return 0;
}
*S = ((data[1] & 0xf) << 4) | data[0];
*E = data[1] >> 7;
for (i = 0; i < 3; i++) {
- l[n] = (data[1] >> (6 - i)) & 0x1;
+ b[n] = (data[1] >> (6 - i)) & 0x1;
T[n] = (data[3 + (i * 3)] << 8) | data[2 + (i * 3)];
U[n] = data[4 + (i * 3)] & 0x1f;
N[n] = data[4 + (i * 3)] >> 5;
@@ -1127,9 +1128,9 @@ int decode_sadqf(uint8_t *data, int len, uint16_t *S, uint8_t *E, uint8_t *l, ui
n++;
}
- PDEBUG(DMUP, DEBUG_INFO, "(BS SADQF) Aktivdateiquittung der BS:\n");
+ LOGP(DMUP, LOGL_INFO, "(BS SADQF) Aktivdateiquittung der BS:\n");
for (i = 0; i < n; i++)
- PDEBUG(DMUP, DEBUG_INFO, " %d: FuTln=%d,%d,%d (0161-%d%d%05d)\n", i + 1, N[i], U[i], T[i], N[i], U[i], T[i]);
+ LOGP(DMUP, LOGL_INFO, " %d: FuTln=%d,%d,%d (0161-%d%d%05d) reader=%s\n", i + 1, N[i], U[i], T[i], N[i], U[i], T[i], (b[i]) ? "chip" : "magent");
return n;
}
diff --git a/src/fuvst/sniffer.c b/src/fuvst/sniffer.c
index f7fd656..dcac22d 100644
--- a/src/fuvst/sniffer.c
+++ b/src/fuvst/sniffer.c
@@ -23,8 +23,9 @@
#include <string.h>
#include <errno.h>
#include "../libsample/sample.h"
-#include "../libtimer/timer.h"
-#include "../libdebug/debug.h"
+#include <osmocom/core/timer.h>
+#include <osmocom/core/utils.h>
+#include "../liblogging/logging.h"
#include "../libmobile/call.h"
#include "../libmobile/main_mobile.h"
#include "../liboptions/options.h"
@@ -72,7 +73,7 @@ static void receive_fisu(mtp_t *mtp, uint8_t bsn, uint8_t bib, uint8_t fsn, uint
{
sniffer_t *sniffer = (sniffer_t *)mtp->inst;
- PDEBUG(DMTP3, (fsn == sniffer->last_fsn) ? DEBUG_INFO : DEBUG_NOTICE, "%s FISU Frame: FSN=%d FIB=%d BSN=%d BIB=%d\n", mtp->name, fsn, fib, bsn, bib);
+ LOGP(DMTP3, (fsn == sniffer->last_fsn) ? LOGL_INFO : LOGL_NOTICE, "%s FISU Frame: FSN=%d FIB=%d BSN=%d BIB=%d\n", mtp->name, fsn, fib, bsn, bib);
/* store current FSN */
sniffer->last_fsn = fsn;
@@ -83,7 +84,7 @@ static void receive_lssu(mtp_t *mtp, uint8_t fsn, uint8_t bib, uint8_t status)
{
sniffer_t *sniffer = (sniffer_t *)mtp->inst;
- PDEBUG(DMTP3, DEBUG_INFO, "%s LSSU Frame: FSN=%d BIB=%d status=%d\n", mtp->name, fsn, bib, status);
+ LOGP(DMTP3, LOGL_INFO, "%s LSSU Frame: FSN=%d BIB=%d status=%d\n", mtp->name, fsn, bib, status);
/* store initial FSN */
sniffer->last_fsn = fsn;
@@ -98,17 +99,17 @@ static void receive_msu(mtp_t *mtp, uint8_t bsn, uint8_t bib, uint8_t fsn, uint8
uint8_t ident, opcode;
if (len < 4) {
- PDEBUG(DMTP3, DEBUG_NOTICE, "Short frame from layer 2 (len=%d)\n", len);
+ LOGP(DMTP3, LOGL_NOTICE, "Short frame from layer 2 (len=%d)\n", len);
return;
}
if (fsn == sniffer->last_fsn) {
- PDEBUG(DMTP3, DEBUG_INFO, "%s MSU Frame: FSN=%d FIB=%d BSN=%d BIB=%d data: %02x %s\n", mtp->name, fsn, fib, bsn, bib, sio, debug_hex(data, len));
+ LOGP(DMTP3, LOGL_INFO, "%s MSU Frame: FSN=%d FIB=%d BSN=%d BIB=%d data: %02x %s\n", mtp->name, fsn, fib, bsn, bib, sio, osmo_hexdump(data, len));
return;
}
if (len < 6) {
- PDEBUG(DMTP3, DEBUG_NOTICE, "Frame from layer 2 too short to carry an Opcode (len=%d)\n", len);
+ LOGP(DMTP3, LOGL_NOTICE, "Frame from layer 2 too short to carry an Opcode (len=%d)\n", len);
return;
}
@@ -126,9 +127,9 @@ static void receive_msu(mtp_t *mtp, uint8_t bsn, uint8_t bib, uint8_t fsn, uint8
len -= 6;
if (sio == 0xcd)
- PDEBUG(DMTP3, DEBUG_NOTICE, "%s MuP Frame: FSN=%d FIB=%d BSN=%d BIB=%d SIO=0x%02x DCP=%d OCP=%d Ident=0x%02x OP=%02XH %s\n", mtp->name, fsn, fib, bsn, bib, sio, dcp, ocp, ident, opcode, debug_hex(data, len));
+ LOGP(DMTP3, LOGL_NOTICE, "%s MuP Frame: FSN=%d FIB=%d BSN=%d BIB=%d SIO=0x%02x DCP=%d OCP=%d Ident=0x%02x OP=%02XH %s\n", mtp->name, fsn, fib, bsn, bib, sio, dcp, ocp, ident, opcode, osmo_hexdump(data, len));
else
- PDEBUG(DMTP3, DEBUG_NOTICE, "%s MSU Frame: FSN=%d FIB=%d BSN=%d BIB=%d SIO=0x%02x DCP=%d OCP=%d SLC=%d H2/H1=0x%02x %02x %s\n", mtp->name, fsn, fib, bsn, bib, sio, dcp, ocp, slc, h2h1, data[-1], debug_hex(data, len));
+ LOGP(DMTP3, LOGL_NOTICE, "%s MSU Frame: FSN=%d FIB=%d BSN=%d BIB=%d SIO=0x%02x DCP=%d OCP=%d SLC=%d H2/H1=0x%02x %02x %s\n", mtp->name, fsn, fib, bsn, bib, sio, dcp, ocp, slc, h2h1, data[-1], osmo_hexdump(data, len));
/* store current FSN */
sniffer->last_fsn = fsn;
@@ -154,11 +155,11 @@ static void receive_bit(void *inst, int bit)
}
/* Destroy transceiver instance and unlink from list. */
-void sniffer_destroy(sender_t *sender)
+static void sniffer_destroy(sender_t *sender)
{
sniffer_t *sniffer = (sniffer_t *) sender;
- PDEBUG(DCNETZ, DEBUG_DEBUG, "Destroying 'Sniffer' instance for 'Kanal' = %s.\n", sender->kanal);
+ LOGP(DCNETZ, LOGL_DEBUG, "Destroying 'Sniffer' instance for 'Kanal' = %s.\n", sender->kanal);
mtp_exit(&sniffer->mtp);
@@ -202,11 +203,11 @@ int main(int argc, char *argv[])
if (num_device <= 1)
dsp_device[1] = dsp_device[0];
for (i = 0; i < num_kanal; i++) {
- PDEBUG(DCNETZ, DEBUG_DEBUG, "Creating 'Sniffer' instance for 'Kanal' = %s (sample rate %d).\n", kanal[i], dsp_samplerate);
+ LOGP(DCNETZ, LOGL_DEBUG, "Creating 'Sniffer' instance for 'Kanal' = %s (sample rate %d).\n", kanal[i], dsp_samplerate);
sniffer = calloc(1, sizeof(sniffer_t));
if (!sniffer) {
- PDEBUG(DCNETZ, DEBUG_ERROR, "No memory!\n");
+ LOGP(DCNETZ, LOGL_ERROR, "No memory!\n");
goto fail;
}
rc = sender_create(&sniffer->sender, kanal[i], 131, 131, dsp_device[i], 0, dsp_samplerate, rx_gain, tx_gain, 0, 0, write_rx_wave, write_tx_wave, read_rx_wave, read_tx_wave, loopback, PAGING_SIGNAL_NONE);
@@ -234,6 +235,7 @@ fail:
sniffer_destroy(sender_head);
/* exits */
+ main_mobile_exit();
fm_exit();
return 0;
@@ -255,13 +257,13 @@ void sender_receive(sender_t *sender, sample_t *samples, int length, double __at
v27_modem_receive(&sniffer->modem, samples, length);
}
-void call_down_audio(int __attribute__((unused)) callref, uint16_t __attribute__((unused)) sequence, uint32_t __attribute__((unused)) timestamp, uint32_t __attribute__((unused)) ssrc, sample_t __attribute__((unused)) *samples, int __attribute__((unused)) count) { }
+void call_down_audio(void __attribute__((unused)) *decoder, void __attribute__((unused)) *decoder_priv, int __attribute__((unused)) callref, uint16_t __attribute__((unused)) sequence, uint8_t __attribute__((unused)) marker, uint32_t __attribute__((unused)) timestamp, uint32_t __attribute__((unused)) ssrc, uint8_t __attribute__((unused)) *payload, int __attribute__((unused)) payload_len) { }
void call_down_clock(void) {}
int call_down_setup(int __attribute__((unused)) callref, const char __attribute__((unused)) *caller_id, enum number_type __attribute__((unused)) caller_type, const char __attribute__((unused)) *dialing) { return 0; }
-void call_down_answer(int __attribute__((unused)) callref) { }
+void call_down_answer(int __attribute__((unused)) callref, struct timeval __attribute__((unused)) *tv_meter) { }
void call_down_disconnect(int __attribute__((unused)) callref, int __attribute__((unused)) cause) { }
diff --git a/src/fuvst/systemmeldungen.c b/src/fuvst/systemmeldungen.c
index 1d801ee..504a4aa 100644
--- a/src/fuvst/systemmeldungen.c
+++ b/src/fuvst/systemmeldungen.c
@@ -1,6 +1,6 @@
#include <stdlib.h>
#include <inttypes.h>
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "systemmeldungen.h"
static struct systemmeldungen {
@@ -21894,8 +21894,8 @@ void print_systemmeldung(uint16_t code, int bytes, uint8_t *ind)
if (i == ii)
return;
- PDEBUG(DMUP, DEBUG_INFO, " -> %s\n", systemmeldungen[i].desc);
+ LOGP(DMUP, LOGL_INFO, " -> %s\n", systemmeldungen[i].desc);
for (j = 0; j < systemmeldungen[i].bytes; j++)
- PDEBUG(DMUP, DEBUG_INFO, " Byte %d = %02Xh: %s\n", j, ind[j], systemmeldungen[i].ind[j]);
+ LOGP(DMUP, LOGL_INFO, " Byte %d = %02Xh: %s\n", j, ind[j], systemmeldungen[i].ind[j]);
}
diff --git a/src/golay/Makefile.am b/src/golay/Makefile.am
index d7cc8fe..61121db 100644
--- a/src/golay/Makefile.am
+++ b/src/golay/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
bin_PROGRAMS = \
golay
@@ -12,20 +12,19 @@ golay_LDADD = \
$(COMMON_LA) \
../amps/libusatone.a \
$(top_builddir)/src/liboptions/liboptions.a \
- $(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libmobile/libmobile.a \
- $(top_builddir)/src/libosmocc/libosmocc.a \
$(top_builddir)/src/libdisplay/libdisplay.a \
$(top_builddir)/src/libjitter/libjitter.a \
- $(top_builddir)/src/libtimer/libtimer.a \
$(top_builddir)/src/libsamplerate/libsamplerate.a \
$(top_builddir)/src/libemphasis/libemphasis.a \
$(top_builddir)/src/libfm/libfm.a \
$(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \
- $(top_builddir)/src/libg711/libg711.a \
$(top_builddir)/src/libaaimage/libaaimage.a \
+ $(top_builddir)/src/liblogging/liblogging.a \
+ $(LIBOSMOCORE_LIBS) \
+ $(LIBOSMOCC_LIBS) \
-lm
if HAVE_ALSA
diff --git a/src/golay/dsp.c b/src/golay/dsp.c
index 24d9ac7..224ecbd 100644
--- a/src/golay/dsp.c
+++ b/src/golay/dsp.c
@@ -25,19 +25,21 @@
#include <string.h>
#include <errno.h>
#include <math.h>
+#include <sys/param.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "golay.h"
#include "dsp.h"
#define MAX_DISPLAY 1.4 /* something above speech level, no emphasis */
+#define VOICE_BANDWIDTH 3000 /* just guessing */
static void dsp_init_ramp(gsc_t *gsc)
{
double c;
int i;
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Generating cosine shaped ramp table.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Generating cosine shaped ramp table.\n");
for (i = 0; i < 256; i++) {
/* This is mathematically incorrect... */
if (i < 64)
@@ -56,7 +58,7 @@ int dsp_init_sender(gsc_t *gsc, int samplerate, double deviation, double polarit
{
int rc;
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Init DSP for transceiver.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Init DSP for transceiver.\n");
/* set modulation parameters */
// NOTE: baudrate equals modulation, because we have a raised cosine ramp of beta = 0.5
@@ -64,12 +66,12 @@ int dsp_init_sender(gsc_t *gsc, int samplerate, double deviation, double polarit
gsc->fsk_bitduration = (double)samplerate / 600.0;
gsc->fsk_bitstep = 1.0 / gsc->fsk_bitduration;
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Use %.4f samples for one bit duration @ %d.\n", gsc->fsk_bitduration, gsc->sender.samplerate);
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Use %.4f samples for one bit duration @ %d.\n", gsc->fsk_bitduration, gsc->sender.samplerate);
gsc->fsk_tx_buffer_size = gsc->fsk_bitduration + 10; /* 1 bit, add some extra to prevent short buffer due to rounding */
gsc->fsk_tx_buffer = calloc(sizeof(sample_t), gsc->fsk_tx_buffer_size);
if (!gsc->fsk_tx_buffer) {
- PDEBUG_CHAN(DDSP, DEBUG_ERROR, "No memory!\n");
+ LOGP_CHAN(DDSP, LOGL_ERROR, "No memory!\n");
rc = -ENOMEM;
goto error;
}
@@ -91,7 +93,7 @@ error:
/* Cleanup transceiver instance. */
void dsp_cleanup_sender(gsc_t *gsc)
{
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Cleanup DSP for transceiver.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Cleanup DSP for transceiver.\n");
if (gsc->fsk_tx_buffer) {
free(gsc->fsk_tx_buffer);
@@ -172,12 +174,63 @@ void sender_receive(sender_t __attribute__((unused)) *sender, sample_t __attribu
void sender_send(sender_t *sender, sample_t *samples, uint8_t *power, int length)
{
gsc_t *gsc = (gsc_t *) sender;
+ int rc;
again:
- /* get word */
+ /* play 2 seconds of pause */
+ if (gsc->wait_2_sec) {
+ int tosend = MIN(length, gsc->wait_2_sec);
+ memset(power, 1, tosend);
+ memset(samples, 0, sizeof(samples) * tosend);
+ power += tosend;
+ samples += tosend;
+ gsc->wait_2_sec -= tosend;
+ if (gsc->wait_2_sec)
+ return;
+ }
+
+ /* play wave file, if open */
+ if (gsc->wave_tx_play.left) {
+ int wave_num, s;
+ wave_num = samplerate_upsample_input_num(&gsc->wave_tx_upsample, length);
+ sample_t buffer[wave_num * 2], *wave_samples[2] = { buffer, buffer + wave_num };
+ wave_read(&gsc->wave_tx_play, wave_samples, wave_num);
+ if (gsc->wave_tx_channels == 2) {
+ for (s = 0; s < wave_num; s++) {
+ wave_samples[0][s] += wave_samples[1][s];
+ }
+ }
+ samplerate_upsample(&gsc->wave_tx_upsample, wave_samples[0], wave_num, samples, length);
+ if (!gsc->wave_tx_play.left) {
+ LOGP_CHAN(DDSP, LOGL_INFO, "Voice message sent.\n");
+ wave_destroy_playback(&gsc->wave_tx_play);
+ return;
+ }
+ return;
+ }
+
+
+ /* get FSK bits or start playing wave file */
if (!gsc->fsk_tx_buffer_length) {
int8_t bit = get_bit(gsc);
+ /* bit == 2 means voice transmission. */
+ if (bit == 2) {
+ if (gsc->wave_tx_filename[0]) {
+ gsc->wave_tx_samplerate = gsc->wave_tx_channels = 0;
+ rc = wave_create_playback(&gsc->wave_tx_play, gsc->wave_tx_filename, &gsc->wave_tx_samplerate, &gsc->wave_tx_channels, gsc->fsk_deviation);
+ if (rc < 0) {
+ gsc->wave_tx_play.left = 0;
+ LOGP_CHAN(DDSP, LOGL_ERROR, "Failed to open wave file '%s' for voice message.\n", gsc->wave_tx_filename);
+ } else {
+ LOGP_CHAN(DDSP, LOGL_INFO, "Sending wave file '%s' for voice message after 2 seconds.\n", gsc->wave_tx_filename);
+ init_samplerate(&gsc->wave_tx_upsample, gsc->wave_tx_samplerate, gsc->sender.samplerate, VOICE_BANDWIDTH);
+ }
+ }
+ gsc->wait_2_sec = gsc->sender.samplerate * 2.0;
+ goto again;
+ }
+
/* no message, power is off */
if (bit < 0) {
memset(samples, 0, sizeof(samples) * length);
@@ -206,4 +259,3 @@ again:
goto again;
}
-
diff --git a/src/golay/golay.c b/src/golay/golay.c
index 3f1d8e8..380ae14 100644
--- a/src/golay/golay.c
+++ b/src/golay/golay.c
@@ -32,8 +32,9 @@
#include <string.h>
#include <errno.h>
#include <sys/types.h>
+#include <sys/param.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../libmobile/call.h"
#include "../libmobile/main_mobile.h"
#include "../libmobile/cause.h"
@@ -48,30 +49,30 @@ int golay_create(const char *kanal, double frequency, const char *device, int us
gsc = calloc(1, sizeof(*gsc));
if (!gsc) {
- PDEBUG(DGOLAY, DEBUG_ERROR, "No memory!\n");
+ LOGP(DGOLAY, LOGL_ERROR, "No memory!\n");
return -ENOMEM;
}
- PDEBUG(DGOLAY, DEBUG_DEBUG, "Creating 'GOLAY' instance for frequency = %s (sample rate %d).\n", kanal, samplerate);
+ LOGP(DGOLAY, LOGL_DEBUG, "Creating 'GOLAY' instance for frequency = %s (sample rate %d).\n", kanal, samplerate);
/* init general part of transceiver */
rc = sender_create(&gsc->sender, kanal, frequency, frequency, device, use_sdr, samplerate, rx_gain, tx_gain, 0, 0, write_rx_wave, write_tx_wave, read_rx_wave, read_tx_wave, loopback, PAGING_SIGNAL_NONE);
if (rc < 0) {
- PDEBUG(DGOLAY, DEBUG_ERROR, "Failed to init transceiver process!\n");
+ LOGP(DGOLAY, LOGL_ERROR, "Failed to init transceiver process!\n");
goto error;
}
/* init audio processing */
rc = dsp_init_sender(gsc, samplerate, deviation, polarity);
if (rc < 0) {
- PDEBUG(DGOLAY, DEBUG_ERROR, "Failed to init audio processing!\n");
+ LOGP(DGOLAY, LOGL_ERROR, "Failed to init audio processing!\n");
goto error;
}
gsc->tx = 1;
gsc->default_message = message;
- PDEBUG(DGOLAY, DEBUG_NOTICE, "Created transmitter for frequency %s\n", kanal);
+ LOGP(DGOLAY, LOGL_NOTICE, "Created transmitter for frequency %s\n", kanal);
return 0;
@@ -88,7 +89,7 @@ void golay_destroy(sender_t *sender)
{
gsc_t *gsc = (gsc_t *) sender;
- PDEBUG(DGOLAY, DEBUG_DEBUG, "Destroying 'GOLAY' instance for frequency = %s.\n", sender->kanal);
+ LOGP(DGOLAY, LOGL_DEBUG, "Destroying 'GOLAY' instance for frequency = %s.\n", sender->kanal);
while (gsc->msg_list)
golay_msg_destroy(gsc, gsc->msg_list);
@@ -98,31 +99,52 @@ void golay_destroy(sender_t *sender)
}
/* Create message and add to queue */
-static gsc_msg_t *golay_msg_create(gsc_t *gsc, const char *address, const char *text, int force_type)
+static gsc_msg_t *golay_msg_create(gsc_t *gsc, const char *address, const char *text, enum gsc_msg_type type)
{
gsc_msg_t *msg, **msgp;
- PDEBUG(DGOLAY, DEBUG_INFO, "Creating msg instance to page address '%s'.\n", address);
-
- /* create */
- msg = calloc(1, sizeof(*msg));
- if (!msg) {
- PDEBUG(DGOLAY, DEBUG_ERROR, "No mem!\n");
- abort();
- }
if (strlen(address) != sizeof(msg->address) - 1) {
- PDEBUG(DGOLAY, DEBUG_NOTICE, "Address has incorrect length, cannot page!\n");
+ LOGP(DGOLAY, LOGL_NOTICE, "Address has incorrect length, cannot page!\n");
return NULL;
}
if (strlen(text) > sizeof(msg->data) - 1) {
- PDEBUG(DGOLAY, DEBUG_NOTICE, "Given test is too long, cannot page!\n");
+ LOGP(DGOLAY, LOGL_NOTICE, "Given test is too long, cannot page!\n");
return NULL;
}
+ /* get type from last digit, if automatic type is given */
+ if (type == TYPE_AUTO) {
+ switch (address[6]) {
+ case '1': type = TYPE_VOICE; break;
+ case '2': type = TYPE_VOICE; break;
+ case '3': type = TYPE_VOICE; break;
+ case '4': type = TYPE_VOICE; break;
+ case '5': type = TYPE_ALPHA; break;
+ case '6': type = TYPE_ALPHA; break;
+ case '7': type = TYPE_ALPHA; break;
+ case '8': type = TYPE_ALPHA; break;
+ case '9': type = TYPE_TONE; break;
+ case '0': type = TYPE_TONE; break;
+ default:
+ LOGP(DGOLAY, LOGL_NOTICE, "Illegal function suffix '%c' in last address digit.\n", address[6]);
+ return NULL;
+ }
+ } else
+ LOGP(DGOLAY, LOGL_INFO, "Overriding message type as defined by sender.\n");
+
+ LOGP(DGOLAY, LOGL_INFO, "Creating msg instance to page address '%s'.\n", address);
+
+ /* create */
+ msg = calloc(1, sizeof(*msg));
+ if (!msg) {
+ LOGP(DGOLAY, LOGL_ERROR, "No mem!\n");
+ abort();
+ }
+
/* init */
- strcpy(msg->address, address);
- msg->force_type = force_type;
- strcpy(msg->data, text);
+ memcpy(msg->address, address, MIN(sizeof(msg->address) - 1, strlen(address) + 1));
+ msg->type = type;
+ memcpy(msg->data, text, MIN(sizeof(msg->data) - 1, strlen(text) + 1));
/* link */
msgp = &gsc->msg_list;
@@ -240,6 +262,7 @@ static const uint16_t preamble_values[] = {
};
static const uint32_t start_code = 713;
+static const uint32_t activation_code = 2563;
/* Rep. 900-2 Table VI */
static const uint16_t word1s[50] = {
@@ -258,27 +281,27 @@ static char encode_alpha(char c)
switch (c) {
case 0x0a:
case 0x0d:
- PDEBUG(DGOLAY, DEBUG_DEBUG, " -> CR/LF character.\n");
+ LOGP(DGOLAY, LOGL_DEBUG, " -> CR/LF character.\n");
c = 0x3c;
break;
case '{':
- PDEBUG(DGOLAY, DEBUG_DEBUG, " -> '%c' character.\n", c);
+ LOGP(DGOLAY, LOGL_DEBUG, " -> '%c' character.\n", c);
c = 0x3b;
break;
case '}':
- PDEBUG(DGOLAY, DEBUG_DEBUG, " -> '%c' character.\n", c);
+ LOGP(DGOLAY, LOGL_DEBUG, " -> '%c' character.\n", c);
c = 0x3d;
break;
case '\\':
- PDEBUG(DGOLAY, DEBUG_DEBUG, " -> '%c' character.\n", c);
+ LOGP(DGOLAY, LOGL_DEBUG, " -> '%c' character.\n", c);
c = 0x20;
break;
default:
if (c < 0x20 || c > 0x5d) {
- PDEBUG(DGOLAY, DEBUG_DEBUG, " -> ' ' character.\n");
+ LOGP(DGOLAY, LOGL_DEBUG, " -> ' ' character.\n");
c = 0x20;
} else {
- PDEBUG(DGOLAY, DEBUG_DEBUG, " -> '%c' character.\n", c);
+ LOGP(DGOLAY, LOGL_DEBUG, " -> '%c' character.\n", c);
c = c - 0x20;
}
}
@@ -291,93 +314,93 @@ static char encode_numeric(char c)
switch (c) {
case 'u':
case 'U':
- PDEBUG(DGOLAY, DEBUG_DEBUG, " -> 'U' character.\n");
+ LOGP(DGOLAY, LOGL_DEBUG, " -> 'U' character.\n");
c = 0xb;
break;
case ' ':
- PDEBUG(DGOLAY, DEBUG_DEBUG, " -> '%c' character.\n", c);
+ LOGP(DGOLAY, LOGL_DEBUG, " -> '%c' character.\n", c);
c = 0xc;
break;
case '-':
- PDEBUG(DGOLAY, DEBUG_DEBUG, " -> '%c' character.\n", c);
+ LOGP(DGOLAY, LOGL_DEBUG, " -> '%c' character.\n", c);
c = 0xd;
break;
case '=':
case '*':
- PDEBUG(DGOLAY, DEBUG_DEBUG, " -> '*' character.\n");
+ LOGP(DGOLAY, LOGL_DEBUG, " -> '*' character.\n");
c = 0xe;
break;
case 'a':
case 'A':
- PDEBUG(DGOLAY, DEBUG_DEBUG, " -> 'A' character.\n");
+ LOGP(DGOLAY, LOGL_DEBUG, " -> 'A' character.\n");
c = 0xf0;
break;
case 'b':
case 'B':
- PDEBUG(DGOLAY, DEBUG_DEBUG, " -> 'B' character.\n");
+ LOGP(DGOLAY, LOGL_DEBUG, " -> 'B' character.\n");
c = 0xf1;
break;
case 'c':
case 'C':
- PDEBUG(DGOLAY, DEBUG_DEBUG, " -> 'C' character.\n");
+ LOGP(DGOLAY, LOGL_DEBUG, " -> 'C' character.\n");
c = 0xf2;
break;
case 'd':
case 'D':
- PDEBUG(DGOLAY, DEBUG_DEBUG, " -> 'D' character.\n");
+ LOGP(DGOLAY, LOGL_DEBUG, " -> 'D' character.\n");
c = 0xf3;
break;
case 'e':
case 'E':
- PDEBUG(DGOLAY, DEBUG_DEBUG, " -> 'E' character.\n");
+ LOGP(DGOLAY, LOGL_DEBUG, " -> 'E' character.\n");
c = 0xf4;
break;
case 'f':
case 'F':
- PDEBUG(DGOLAY, DEBUG_DEBUG, " -> 'F' character.\n");
+ LOGP(DGOLAY, LOGL_DEBUG, " -> 'F' character.\n");
c = 0xf6;
break;
case 'g':
case 'G':
- PDEBUG(DGOLAY, DEBUG_DEBUG, " -> 'G' character.\n");
+ LOGP(DGOLAY, LOGL_DEBUG, " -> 'G' character.\n");
c = 0xf7;
break;
case 'h':
case 'H':
- PDEBUG(DGOLAY, DEBUG_DEBUG, " -> 'H' character.\n");
+ LOGP(DGOLAY, LOGL_DEBUG, " -> 'H' character.\n");
c = 0xf8;
break;
case 'j':
case 'J':
- PDEBUG(DGOLAY, DEBUG_DEBUG, " -> 'J' character.\n");
+ LOGP(DGOLAY, LOGL_DEBUG, " -> 'J' character.\n");
c = 0xf9;
break;
case 'l':
case 'L':
- PDEBUG(DGOLAY, DEBUG_DEBUG, " -> 'L' character.\n");
+ LOGP(DGOLAY, LOGL_DEBUG, " -> 'L' character.\n");
c = 0xfb;
break;
case 'n':
case 'N':
- PDEBUG(DGOLAY, DEBUG_DEBUG, " -> 'N' character.\n");
+ LOGP(DGOLAY, LOGL_DEBUG, " -> 'N' character.\n");
c = 0xfc;
break;
case 'p':
case 'P':
- PDEBUG(DGOLAY, DEBUG_DEBUG, " -> 'P' character.\n");
+ LOGP(DGOLAY, LOGL_DEBUG, " -> 'P' character.\n");
c = 0xfd;
break;
case 'r':
case 'R':
- PDEBUG(DGOLAY, DEBUG_DEBUG, " -> 'r' character.\n");
+ LOGP(DGOLAY, LOGL_DEBUG, " -> 'r' character.\n");
c = 0xfe;
break;
default:
if (c >= '0' && c <= '9') {
- PDEBUG(DGOLAY, DEBUG_DEBUG, " -> '%c' character.\n", c);
+ LOGP(DGOLAY, LOGL_DEBUG, " -> '%c' character.\n", c);
c = c - '0';
} else {
- PDEBUG(DGOLAY, DEBUG_DEBUG, " -> ' ' character.\n");
+ LOGP(DGOLAY, LOGL_DEBUG, " -> ' ' character.\n");
c = 0xc;
}
}
@@ -396,7 +419,7 @@ static int encode_address(const char *code, int *preamble, uint16_t *word1, uint
break;
}
if (code[i]) {
- PDEBUG(DGOLAY, DEBUG_NOTICE, "Invalid functional address character. Only 0..9 are allowed.\n");
+ LOGP(DGOLAY, LOGL_NOTICE, "Invalid functional address character. Only 0..9 are allowed.\n");
return -EINVAL;
}
@@ -434,7 +457,7 @@ static int encode_address(const char *code, int *preamble, uint16_t *word1, uint
break;
}
if (i < 16) {
- PDEBUG(DGOLAY, DEBUG_NOTICE, "Functional address has invlid value '%03d' for last three characters.\n", a2a1a0);
+ LOGP(DGOLAY, LOGL_NOTICE, "Functional address has invlid value '%03d' for last three characters.\n", a2a1a0);
return -EINVAL;
}
} else {
@@ -443,7 +466,7 @@ static int encode_address(const char *code, int *preamble, uint16_t *word1, uint
break;
}
if (i < 7) {
- PDEBUG(DGOLAY, DEBUG_NOTICE, "Functional address has invlid value '%03d' for last three characters.\n", a2a1a0);
+ LOGP(DGOLAY, LOGL_NOTICE, "Functional address has invlid value '%03d' for last three characters.\n", a2a1a0);
return -EINVAL;
}
}
@@ -455,6 +478,7 @@ static inline void queue_reset(gsc_t *gsc)
{
gsc->bit_index = 0;
gsc->bit_num = 0;
+ gsc->bit_ac = 0;
gsc->bit_overflow = 0;
}
@@ -489,9 +513,8 @@ static inline void queue_comma(gsc_t *gsc, int bits, uint8_t polarity)
}
}
-static int queue_batch(gsc_t *gsc, const char *address, int force_type, const char *message)
+static int queue_batch(gsc_t *gsc, const char *address, enum gsc_msg_type type, const char *message)
{
- int type;
int preamble;
uint16_t word1, word2;
uint8_t function;
@@ -505,7 +528,7 @@ static int queue_batch(gsc_t *gsc, const char *address, int force_type, const ch
/* check address length */
if (!address || strlen(address) != 7) {
- PDEBUG(DGOLAY, DEBUG_NOTICE, "Invalid functional address '%s' size. Only 7 digits are allowed.\n", address);
+ LOGP(DGOLAY, LOGL_NOTICE, "Invalid functional address '%s' size. Only 7 digits are allowed.\n", address);
return -EINVAL;
}
@@ -514,36 +537,37 @@ static int queue_batch(gsc_t *gsc, const char *address, int force_type, const ch
if (rc < 0)
return rc;
- /* calculate function */
+ /* get function from last digit */
switch (address[6]) {
- case '1': type = TYPE_VOICE; function = 0; break;
- case '2': type = TYPE_VOICE; function = 1; break;
- case '3': type = TYPE_VOICE; function = 2; break;
- case '4': type = TYPE_VOICE; function = 3; break;
- case '5': type = TYPE_ALPHA; function = 0; break;
- case '6': type = TYPE_ALPHA; function = 1; break;
- case '7': type = TYPE_ALPHA; function = 2; break;
- case '8': type = TYPE_ALPHA; function = 3; break;
- case '9': type = TYPE_TONE; function = 0; break;
- case '0': type = TYPE_TONE; function = 1; break;
+ case '1': function = 0; break;
+ case '2': function = 1; break;
+ case '3': function = 2; break;
+ case '4': function = 3; break;
+ case '5': function = 0; break;
+ case '6': function = 1; break;
+ case '7': function = 2; break;
+ case '8': function = 3; break;
+ case '9': function = 0; break;
+ case '0': function = 1; break;
default:
- PDEBUG(DGOLAY, DEBUG_NOTICE, "Illegal function suffix '%c' in last address digit.\n", address[6]);
+ LOGP(DGOLAY, LOGL_NOTICE, "Illegal function suffix '%c' in last address digit.\n", address[6]);
return -EINVAL;
}
- /* override type */
- if (force_type >= 0) {
- type = force_type;
- PDEBUG(DGOLAY, DEBUG_INFO, "Overriding message type as defined by sender.\n");
+ switch (type) {
+ case TYPE_ALPHA:
+ case TYPE_NUMERIC:
+ LOGP(DGOLAY, LOGL_INFO, "Coding text message for functional address '%s' and message '%s'.\n", address, message);
+ break;
+ case TYPE_VOICE:
+ LOGP(DGOLAY, LOGL_INFO, "Coding voice message for functional address %s with wave file '%s'.\n", address, message);
+ break;
+ default:
+ LOGP(DGOLAY, LOGL_INFO, "Coding tone only message for functional address %s.\n", address);
}
- if (type == TYPE_ALPHA || type == TYPE_NUMERIC)
- PDEBUG(DGOLAY, DEBUG_INFO, "Coding text message for functional address '%s' and message '%s'.\n", address, message);
- else
- PDEBUG(DGOLAY, DEBUG_INFO, "Coding tone only message for functional address %s.\n", address);
-
/* encode preamble and store */
- PDEBUG(DGOLAY, DEBUG_DEBUG, "Encoding preamble '%d'.\n", preamble);
+ LOGP(DGOLAY, LOGL_DEBUG, "Encoding preamble '%d'.\n", preamble);
golay = calc_golay(preamble_values[preamble]);
queue_comma(gsc, 28, golay & 1);
for (i = 0; i < 18; i++) {
@@ -551,7 +575,7 @@ static int queue_batch(gsc_t *gsc, const char *address, int force_type, const ch
}
/* encode start code and store */
- PDEBUG(DGOLAY, DEBUG_DEBUG, "Encoding start code.\n");
+ LOGP(DGOLAY, LOGL_DEBUG, "Encoding start code.\n");
golay = calc_golay(start_code);
queue_comma(gsc, 28, golay & 1);
queue_dup(gsc, golay, 23);
@@ -560,7 +584,7 @@ static int queue_batch(gsc_t *gsc, const char *address, int force_type, const ch
queue_dup(gsc, golay, 23);
/* encode address and store */
- PDEBUG(DGOLAY, DEBUG_DEBUG, "Encoding address words '%d' and '%d'.\n", word1, word2);
+ LOGP(DGOLAY, LOGL_DEBUG, "Encoding address words '%d' and '%d'.\n", word1, word2);
golay = calc_golay(word1);
if (function & 0x2)
golay ^= 0x7fffff;
@@ -573,11 +597,12 @@ static int queue_batch(gsc_t *gsc, const char *address, int force_type, const ch
queue_dup(gsc, golay, 23);
/* encode message */
- if (type == TYPE_ALPHA) {
- PDEBUG(DGOLAY, DEBUG_DEBUG, "Encoding %d alphanumeric digits.\n", (int)strlen(message));
+ switch (type) {
+ case TYPE_ALPHA:
+ LOGP(DGOLAY, LOGL_DEBUG, "Encoding %d alphanumeric digits.\n", (int)strlen(message));
for (i = 0; *message; i++) {
if (i == MAX_ADB) {
- PDEBUG(DGOLAY, DEBUG_NOTICE, "Message overflows %d characters, cropping message.\n", MAX_ADB * 8);
+ LOGP(DGOLAY, LOGL_NOTICE, "Message overflows %d characters, cropping message.\n", MAX_ADB * 8);
}
for (j = 0; *message && j < 8; j++) {
msg[j] = encode_alpha(*message++);
@@ -608,13 +633,13 @@ static int queue_batch(gsc_t *gsc, const char *address, int force_type, const ch
queue_bit(gsc, (bch[k] >> j) & 1);
}
}
- }
- if (type == TYPE_NUMERIC) {
- PDEBUG(DGOLAY, DEBUG_DEBUG, "Encoding %d numeric digits.\n", (int)strlen(message));
+ break;
+ case TYPE_NUMERIC:
+ LOGP(DGOLAY, LOGL_DEBUG, "Encoding %d numeric digits.\n", (int)strlen(message));
shifted = 0;
for (i = 0; *message; i++) {
if (i == MAX_NDB) {
- PDEBUG(DGOLAY, DEBUG_NOTICE, "Message overflows %d characters, cropping message.\n", MAX_NDB * 12);
+ LOGP(DGOLAY, LOGL_NOTICE, "Message overflows %d characters, cropping message.\n", MAX_NDB * 12);
}
for (j = 0; *message && j < 12; j++) {
/* get next digit or shifted digit */
@@ -658,15 +683,30 @@ static int queue_batch(gsc_t *gsc, const char *address, int force_type, const ch
queue_bit(gsc, (bch[k] >> j) & 1);
}
}
+ break;
+ case TYPE_VOICE:
+ /* store wave file name */
+ memcpy(gsc->wave_tx_filename, message, MIN(sizeof(gsc->wave_tx_filename) - 1, strlen(message) + 1));
+ /* store bit number for activation code. this is used to play the AC again after voice message. */
+ gsc->bit_ac = gsc->bit_num;
+ /* encode activation code and store */
+ LOGP(DGOLAY, LOGL_DEBUG, "Encoding activation code.\n");
+ golay = calc_golay(activation_code);
+ queue_comma(gsc, 28, golay & 1);
+ queue_dup(gsc, golay, 23);
+ golay ^= 0x7fffff;
+ queue_bit(gsc, (golay & 1) ^ 1);
+ queue_dup(gsc, golay, 23);
+ break;
+ default:
+ /* encode comma after message and store */
+ LOGP(DGOLAY, LOGL_DEBUG, "Encoding 'comma' sequence after message.\n");
+ queue_comma(gsc, 121 * 8, 1);
}
- /* encode comma after message and store */
- PDEBUG(DGOLAY, DEBUG_DEBUG, "Encoding 'comma' sequence after message.\n");
- queue_comma(gsc, 121 * 8, 1);
-
/* check overflow */
if (gsc->bit_overflow) {
- PDEBUG(DGOLAY, DEBUG_ERROR, "Bit stream (%d bits) overflows bit buffer size (%d bits), please fix!\n", gsc->bit_num, (int)sizeof(gsc->bit));
+ LOGP(DGOLAY, LOGL_ERROR, "Bit stream (%d bits) overflows bit buffer size (%d bits), please fix!\n", gsc->bit_num, (int)sizeof(gsc->bit));
return -EOVERFLOW;
}
@@ -680,21 +720,31 @@ static int queue_batch(gsc_t *gsc, const char *address, int force_type, const ch
* if there is a message, return next bit to be transmitted.
*
* if there is a message in the queue, encode message and return its first bit.
+ *
+ * if there is a voice message, return 2 at the end, to tell the DSP to send voice.
*/
int8_t get_bit(gsc_t *gsc)
{
gsc_msg_t *msg;
- uint8_t bit;
int rc;
/* if currently transmiting message, send next bit */
if (gsc->bit_num) {
- bit = gsc->bit[gsc->bit_index++];
+ /* Transmission complete. */
if (gsc->bit_index == gsc->bit_num) {
+ /* on voice message... */
+ if (gsc->bit_ac) {
+ /* rewind to play the AC again after voice transmission */
+ gsc->bit_index = gsc->bit_ac;
+ gsc->bit_ac = 0;
+ /* indicate voice message to DSP */
+ return 2;
+ }
queue_reset(gsc);
- PDEBUG(DGOLAY, DEBUG_INFO, "Done transmitting message.\n");
+ LOGP(DGOLAY, LOGL_INFO, "Done transmitting message.\n");
+ goto next_msg;
}
- return bit;
+ return gsc->bit[gsc->bit_index++];
}
next_msg:
@@ -705,41 +755,45 @@ next_msg:
return -1;
/* encode first message in queue */
- rc = queue_batch(gsc, msg->address, msg->force_type, msg->data);
+ rc = queue_batch(gsc, msg->address, msg->type, msg->data);
if (rc >= 0)
- PDEBUG(DGOLAY, DEBUG_INFO, "Transmitting message to address '%s'.\n", msg->address);
+ LOGP(DGOLAY, LOGL_INFO, "Transmitting message to address '%s'.\n", msg->address);
golay_msg_destroy(gsc, msg);
if (rc < 0)
goto next_msg;
/* return first bit */
- bit = gsc->bit[gsc->bit_index++];
- return bit;
+ return gsc->bit[gsc->bit_index++];
}
void golay_msg_send(const char *text)
{
char buffer[strlen(text) + 1], *p = buffer, *address_string, *message;
gsc_t *gsc;
- int force_type = -1;
+ enum gsc_msg_type type = TYPE_AUTO;
strcpy(buffer, text);
address_string = strsep(&p, ",");
message = p;
- if (message) {
- if (message[0] == 'a' && message[1] == ',') {
- force_type = TYPE_ALPHA;
- message += 2;
- } else
- if (message[0] == 'n' && message[1] == ',') {
- force_type = TYPE_NUMERIC;
- message += 2;
- }
- } else
+ switch ((message[0] << 8) | message[1]) {
+ case ('a' << 8) | ',':
+ type = TYPE_ALPHA;
+ message += 2;
+ break;
+ case ('n' << 8) | ',':
+ type = TYPE_NUMERIC;
+ message += 2;
+ break;
+ case ('v' << 8) | ',':
+ type = TYPE_VOICE;
+ message += 2;
+ break;
+ default:
message = "";
+ }
gsc = (gsc_t *) sender_head;
- golay_msg_create(gsc, address_string, message, force_type);
+ golay_msg_create(gsc, address_string, message, type);
}
void call_down_clock(void)
@@ -769,9 +823,9 @@ int call_down_setup(int __attribute__((unused)) callref, const char *caller_id,
}
if (!sender) {
if (channel)
- PDEBUG(DGOLAY, DEBUG_NOTICE, "Cannot page, because given station not available, rejecting!\n");
+ LOGP(DGOLAY, LOGL_NOTICE, "Cannot page, because given station not available, rejecting!\n");
else
- PDEBUG(DGOLAY, DEBUG_NOTICE, "Cannot page, no trasmitting station available, rejecting!\n");
+ LOGP(DGOLAY, LOGL_NOTICE, "Cannot page, no trasmitting station available, rejecting!\n");
return -CAUSE_NOCHANNEL;
}
@@ -785,20 +839,20 @@ int call_down_setup(int __attribute__((unused)) callref, const char *caller_id,
message = gsc->default_message;
/* create call process to page station */
- msg = golay_msg_create(gsc, address, message, -1);
+ msg = golay_msg_create(gsc, address, message, TYPE_AUTO);
if (!msg)
return -CAUSE_INVALNUMBER;
return -CAUSE_NORMAL;
}
-void call_down_answer(int __attribute__((unused)) callref)
+void call_down_answer(int __attribute__((unused)) callref, struct timeval __attribute__((unused)) *tv_meter)
{
}
static void _release(int __attribute__((unused)) callref, int __attribute__((unused)) cause)
{
- PDEBUG(DGOLAY, DEBUG_INFO, "Call has been disconnected by network.\n");
+ LOGP(DGOLAY, LOGL_INFO, "Call has been disconnected by network.\n");
}
void call_down_disconnect(int callref, int cause)
@@ -815,7 +869,7 @@ void call_down_release(int callref, int cause)
}
/* Receive audio from call instance. */
-void call_down_audio(int __attribute__((unused)) callref, uint16_t __attribute__((unused)) sequence, uint32_t __attribute__((unused)) timestamp, uint32_t __attribute__((unused)) ssrc, sample_t __attribute__((unused)) *samples, int __attribute__((unused)) count)
+void call_down_audio(void __attribute__((unused)) *decoder, void __attribute__((unused)) *decoder_priv, int __attribute__((unused)) callref, uint16_t __attribute__((unused)) sequence, uint8_t __attribute__((unused)) marker, uint32_t __attribute__((unused)) timestamp, uint32_t __attribute__((unused)) ssrc, uint8_t __attribute__((unused)) *payload, int __attribute__((unused)) payload_len)
{
}
diff --git a/src/golay/golay.h b/src/golay/golay.h
index 24e201f..033decf 100644
--- a/src/golay/golay.h
+++ b/src/golay/golay.h
@@ -1,9 +1,13 @@
#include "../libmobile/sender.h"
-#define TYPE_TONE 0 /* TONE only */
-#define TYPE_VOICE 1 /* TONE + VOICE */
-#define TYPE_ALPHA 2 /* TONE + DATA */
-#define TYPE_NUMERIC 3 /* TONE + DATA */
+enum gsc_msg_type {
+ TYPE_AUTO = 0, /* Defined by 7th digit */
+ TYPE_TONE, /* TONE only */
+ TYPE_VOICE, /* TONE + VOICE */
+ TYPE_ALPHA, /* TONE + DATA */
+ TYPE_NUMERIC, /* TONE + DATA */
+};
+
#define MAX_ADB 10 /* 80 characters */
#define MAX_NDB 2 /* 24 digits */
@@ -11,7 +15,7 @@
typedef struct gsc_msg {
struct gsc_msg *next;
char address[8]; /* 7 digits + EOL */
- int force_type; /* override type from address digit 7 */
+ enum gsc_msg_type type; /* type of message */
char data[256]; /* message to be transmitted */
} gsc_msg_t;
@@ -25,6 +29,7 @@ typedef struct gsc {
/* current trasmitting message */
uint8_t bit[4096];
int bit_num;
+ int bit_ac; /* where activation code starts (voice only). */
int bit_index; /* when playing out */
int bit_overflow;
@@ -41,6 +46,14 @@ typedef struct gsc {
int fsk_tx_buffer_pos; /* current position sending buffer */
double fsk_tx_phase; /* current bit position */
uint8_t fsk_tx_lastbit; /* last bit of last message, to correctly ramp */
+
+ /* voice message */
+ int wait_2_sec; /* counter to wait 2 seconds before playback */
+ char wave_tx_filename[256];
+ int wave_tx_samplerate;
+ int wave_tx_channels;
+ wave_play_t wave_tx_play; /* wave playback */
+ samplerate_t wave_tx_upsample; /* wave upsampler */
} gsc_t;
int golay_create(const char *kanal, double frequency, const char *device, int use_sdr, int samplerate, double rx_gain, double tx_gain, double deviation, double polarity, const char *message, const char *write_rx_wave, const char *write_tx_wave, const char *read_rx_wave, const char *read_tx_wave, int loopback);
diff --git a/src/golay/main.c b/src/golay/main.c
index 09c8dad..1f16797 100644
--- a/src/golay/main.c
+++ b/src/golay/main.c
@@ -27,7 +27,7 @@
#include <sys/stat.h>
#include <fcntl.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../libmobile/call.h"
#include "../libmobile/main_mobile.h"
#include "../liboptions/options.h"
@@ -73,6 +73,7 @@ void print_help(const char *arg0)
printf(" Write \"<address>[,message]\" to it, to send a default message.\n");
printf(" Write \"<address>,n,message\" to it, to send a numeric message.\n");
printf(" Write \"<address>,a,message\" to it, to send an alphanumeric message.\n");
+ printf(" Write \"<address>,v,<wave file name>\" to it, to send a voice message.\n");
printf("\n");
printf("By default, an alphanumic message is sent, if last digit of the functional\n");
printf("address is 5..8. Otherwise a tone only message is sent.\n");
@@ -171,7 +172,7 @@ static void myhandler(void)
if (tx)
golay_msg_send(buffer);
else
- PDEBUG(DGOLAY, DEBUG_ERROR, "Failed to send message, transmitter is not enabled!\n");
+ LOGP(DGOLAY, LOGL_ERROR, "Failed to send message, transmitter is not enabled!\n");
}
}
}
@@ -293,6 +294,7 @@ fail:
golay_destroy(sender_head);
/* exits */
+ main_mobile_exit();
fm_exit();
options_free();
diff --git a/src/imts/Makefile.am b/src/imts/Makefile.am
index 9dd0cc1..7d62fb1 100644
--- a/src/imts/Makefile.am
+++ b/src/imts/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
bin_PROGRAMS = \
imts \
@@ -13,21 +13,20 @@ imts_LDADD = \
$(COMMON_LA) \
../amps/libusatone.a \
$(top_builddir)/src/liboptions/liboptions.a \
- $(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libmobile/libmobile.a \
- $(top_builddir)/src/libosmocc/libosmocc.a \
$(top_builddir)/src/libdisplay/libdisplay.a \
$(top_builddir)/src/libjitter/libjitter.a \
$(top_builddir)/src/libsquelch/libsquelch.a \
- $(top_builddir)/src/libtimer/libtimer.a \
$(top_builddir)/src/libsamplerate/libsamplerate.a \
$(top_builddir)/src/libemphasis/libemphasis.a \
$(top_builddir)/src/libfm/libfm.a \
$(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \
- $(top_builddir)/src/libg711/libg711.a \
$(top_builddir)/src/libaaimage/libaaimage.a \
+ $(top_builddir)/src/liblogging/liblogging.a \
+ $(LIBOSMOCORE_LIBS) \
+ $(LIBOSMOCC_LIBS) \
-lm
imts_dialer_SOURCES = \
@@ -36,9 +35,10 @@ imts_dialer_SOURCES = \
imts_dialer_LDADD = \
$(COMMON_LA) \
$(top_builddir)/src/liboptions/liboptions.a \
- $(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \
+ $(top_builddir)/src/liblogging/liblogging.a \
+ $(LIBOSMOCORE_LIBS) \
-lm
if HAVE_ALSA
diff --git a/src/imts/dialer.c b/src/imts/dialer.c
index f7f2edb..ea91fdf 100644
--- a/src/imts/dialer.c
+++ b/src/imts/dialer.c
@@ -26,7 +26,7 @@
#include <errno.h>
#include "../libsample/sample.h"
#include "../libwave/wave.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#ifdef HAVE_ALSA
#include "../libsound/sound.h"
#endif
@@ -62,8 +62,11 @@ wave_rec_t wave_tx_rec;
/* dummy functions */
int num_kanal = 1; /* only one channel used for debugging */
+void *get_sender_by_empfangsfrequenz(void);
void *get_sender_by_empfangsfrequenz() { return NULL; }
+void display_measurements_add(void);
void display_measurements_add() {}
+void display_measurements_update(void);
void display_measurements_update() {}
static void print_help(const char *arg0)
@@ -186,7 +189,7 @@ static void process_signal(int buffer_size)
count = dsp_samplerate / 1000;
#endif
if (count < 0) {
- PDEBUG(DDSP, DEBUG_ERROR, "Failed to get number of samples in buffer (rc = %d)!\n", count);
+ LOGP(DDSP, LOGL_ERROR, "Failed to get number of samples in buffer (rc = %d)!\n", count);
break;
}
@@ -201,7 +204,7 @@ static void process_signal(int buffer_size)
/* write audio */
rc = sound_write(audio, samples, power, count, NULL, NULL, 1);
if (rc < 0) {
- PDEBUG(DDSP, DEBUG_ERROR, "Failed to write TX data to audio device (rc = %d)\n", rc);
+ LOGP(DDSP, LOGL_ERROR, "Failed to write TX data to audio device (rc = %d)\n", rc);
break;
}
#endif
@@ -213,7 +216,7 @@ static void process_signal(int buffer_size)
int main(int argc, char *argv[])
{
- int i, d, p, pulses, tone = 0;
+ int i, d, p, parity, pulses, tone = 0;
int buffer_size;
int rc, argi;
@@ -267,13 +270,14 @@ int main(int argc, char *argv[])
dial_string[d].tone = TONE_CONNECT; dial_string[d++].length = 0.050 * (double)dsp_samplerate; /* seize */
dial_string[d].console = '-';
dial_string[d].tone = TONE_GUARD; dial_string[d++].length = 1.000 * (double)dsp_samplerate; /* pause */
+ parity = 0;
for (i = 0; station_id[i]; i++) {
pulses = station_id[i] - '0';
if (pulses == 0)
pulses = 10;
dial_string[d].console = station_id[i];
for (p = 1; p <= pulses; p++) {
- if ((p & 1) == 1)
+ if ((++parity & 1) == 1)
tone = TONE_SILENCE;
else
tone = TONE_GUARD;
@@ -307,9 +311,9 @@ int main(int argc, char *argv[])
#ifdef HAVE_ALSA
/* init sound */
- audio = sound_open(dsp_audiodev, NULL, NULL, NULL, 1, 0.0, dsp_samplerate, dsp_buffer, 1.0, 1.0, 4000.0, 2.0);
+ audio = sound_open(SOUND_DIR_PLAY, dsp_audiodev, NULL, NULL, NULL, 1, 0.0, dsp_samplerate, dsp_buffer, 1.0, 1.0, 4000.0, 2.0);
if (!audio) {
- PDEBUG(DBNETZ, DEBUG_ERROR, "No sound device!\n");
+ LOGP(DBNETZ, LOGL_ERROR, "No sound device!\n");
goto exit;
}
#endif
@@ -318,13 +322,13 @@ int main(int argc, char *argv[])
if (write_tx_wave) {
rc = wave_create_record(&wave_tx_rec, write_tx_wave, dsp_samplerate, 1, 1.0);
if (rc < 0) {
- PDEBUG(DBNETZ, DEBUG_ERROR, "Failed to create WAVE recoding instance!\n");
+ LOGP(DBNETZ, LOGL_ERROR, "Failed to create WAVE recoding instance!\n");
goto exit;
}
}
#ifndef HAVE_ALSA
else {
- PDEBUG(DBNETZ, DEBUG_ERROR, "No sound support compiled in, so you need to write to a wave file. See help!\n");
+ LOGP(DBNETZ, LOGL_ERROR, "No sound support compiled in, so you need to write to a wave file. See help!\n");
goto exit;
}
#endif
@@ -334,7 +338,7 @@ int main(int argc, char *argv[])
sound_start(audio);
#endif
- PDEBUG(DBNETZ, DEBUG_ERROR, "Start audio after pause...\n");
+ LOGP(DBNETZ, LOGL_ERROR, "Start audio after pause...\n");
process_signal(buffer_size);
diff --git a/src/imts/dsp.c b/src/imts/dsp.c
index 9e08da2..0137d20 100644
--- a/src/imts/dsp.c
+++ b/src/imts/dsp.c
@@ -26,8 +26,8 @@
#include <errno.h>
#include <math.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
-#include "../libtimer/timer.h"
+#include "../liblogging/logging.h"
+#include <osmocom/core/timer.h>
#include "../libmobile/call.h"
#include "imts.h"
#include "dsp.h"
@@ -111,7 +111,7 @@ void dsp_init(void)
int i;
double s;
- PDEBUG(DDSP, DEBUG_DEBUG, "Generating sine tables.\n");
+ LOGP(DDSP, LOGL_DEBUG, "Generating sine tables.\n");
for (i = 0; i < 65536; i++) {
s = sin((double)i / 65536.0 * 2.0 * PI);
dsp_sine_tone[i] = s * TX_PEAK_TONE;
@@ -123,7 +123,7 @@ int dsp_init_transceiver(imts_t *imts, double squelch_db, int ptt)
{
int rc = -1;
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Init DSP for Transceiver.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Init DSP for Transceiver.\n");
imts->sample_duration = 1.0 / (double)imts->sender.samplerate;
@@ -164,11 +164,11 @@ int dsp_init_transceiver(imts_t *imts, double squelch_db, int ptt)
/* delay buffer */
if (ptt) {
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Push to talk: Adding delay buffer to remove noise when signal gets lost.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Push to talk: Adding delay buffer to remove noise when signal gets lost.\n");
imts->delay_max = (int)((double)imts->sender.samplerate * DELAY_TIME);
imts->delay_spl = calloc(imts->delay_max, sizeof(*imts->delay_spl));
if (!imts->delay_spl) {
- PDEBUG(DDSP, DEBUG_ERROR, "No mem for delay buffer!\n");
+ LOGP(DDSP, LOGL_ERROR, "No mem for delay buffer!\n");
goto error;
}
}
@@ -186,7 +186,7 @@ error:
/* Cleanup transceiver instance. */
void dsp_cleanup_transceiver(imts_t *imts)
{
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Cleanup DSP for Transceiver.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Cleanup DSP for Transceiver.\n");
fm_demod_exit(&imts->demod);
if (imts->delay_spl) {
@@ -221,7 +221,7 @@ static int generate_tone(imts_t *imts, sample_t *samples, int length)
case TONE_SILENCE:
break;
default:
- PDEBUG_CHAN(DDSP, DEBUG_ERROR, "Software error, unsupported tone, please fix!\n");
+ LOGP_CHAN(DDSP, LOGL_ERROR, "Software error, unsupported tone, please fix!\n");
return length;
}
@@ -297,7 +297,11 @@ again:
case DSP_MODE_AUDIO:
memset(power, 1, length);
input_num = samplerate_upsample_input_num(&sender->srstate, length);
- jitter_load(&sender->dejitter, samples, input_num);
+ {
+ int16_t spl[input_num];
+ jitter_load_samples(&sender->dejitter, (uint8_t *)spl, input_num, sizeof(*spl), jitter_conceal_s16, NULL);
+ int16_to_samples_speech(samples, spl, input_num);
+ }
samplerate_upsample(&sender->srstate, samples, input_num, samples, length);
if (imts->pre_emphasis)
pre_emphasis(&imts->estate, samples, length);
@@ -386,7 +390,7 @@ static void tone_demod(imts_t *imts, sample_t *samples, int length)
printf("decoder debug: %s detected, waiting to sustain\n", tone_names[tone]);
#endif
if (imts->demod_sig_tone) {
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Lost %s (duration %.0f ms)\n", tone_names[imts->demod_current_tone], imts->demod_duration * 1000.0);
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Lost %s (duration %.0f ms)\n", tone_names[imts->demod_current_tone], imts->demod_duration * 1000.0);
imts_lost_tone(imts, imts->demod_current_tone, imts->demod_duration);
imts->demod_sig_tone = 0;
}
@@ -406,7 +410,7 @@ static void tone_demod(imts_t *imts, sample_t *samples, int length)
amp = amplitude[i];
imts->demod_sig_tone = 0;
}
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Detected %s (level %.0f%%)\n", tone_names[imts->demod_current_tone], amp * 100);
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Detected %s (level %.0f%%)\n", tone_names[imts->demod_current_tone], amp * 100);
imts_receive_tone(imts, imts->demod_current_tone, imts->demod_duration, amp);
imts->demod_last_tone = imts->demod_current_tone;
imts->demod_duration = imts->demod_sustain;
@@ -419,7 +423,7 @@ static void tone_demod(imts_t *imts, sample_t *samples, int length)
double quality = 1.0 - imts->demod_quality_value / (double)imts->demod_quality_count * 2.0;
if (quality < 0)
quality = 0;
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Quality: %.0f%%\n", quality * 100.0);
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Quality: %.0f%%\n", quality * 100.0);
display_measurements_update(imts->dmp_tone_quality, quality * 100.0, 0.0);
}
}
@@ -465,7 +469,7 @@ void sender_receive(sender_t *sender, sample_t *samples, int length, double rf_l
/* FALLTHRU */
case SQUELCH_MUTE:
if (imts->mode == MODE_MTS && !imts->is_mute) {
- PDEBUG_CHAN(DDSP, DEBUG_INFO, "Low RF level, muting.\n");
+ LOGP_CHAN(DDSP, LOGL_INFO, "Low RF level, muting.\n");
memset(imts->delay_spl, 0, sizeof(*samples) * imts->delay_max);
imts->is_mute = 1;
}
@@ -475,7 +479,7 @@ void sender_receive(sender_t *sender, sample_t *samples, int length, double rf_l
break;
default:
if (imts->is_mute) {
- PDEBUG_CHAN(DDSP, DEBUG_INFO, "High RF level, unmuting.\n");
+ LOGP_CHAN(DDSP, LOGL_INFO, "High RF level, unmuting.\n");
imts->is_mute = 0;
}
/* detect signal, if it is steady for a while */
@@ -522,7 +526,7 @@ void sender_receive(sender_t *sender, sample_t *samples, int length, double rf_l
}
-const char *imts_dsp_mode_name(enum dsp_mode mode)
+static const char *imts_dsp_mode_name(enum dsp_mode mode)
{
static char invalid[16];
@@ -549,18 +553,44 @@ void imts_set_dsp_mode(imts_t *imts, enum dsp_mode mode, int tone, double durati
imts->demod_duration = 0.0;
}
+ if (mode == DSP_MODE_AUDIO && imts->dsp_mode != mode)
+ jitter_reset(&imts->sender.dejitter);
if (imts->dsp_mode != mode) {
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "DSP mode %s -> %s\n", imts_dsp_mode_name(imts->dsp_mode), imts_dsp_mode_name(mode));
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "DSP mode %s -> %s\n", imts_dsp_mode_name(imts->dsp_mode), imts_dsp_mode_name(mode));
imts->dsp_mode = mode;
}
if (mode == DSP_MODE_TONE) {
if (duration)
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Start sending %s for %.3f seconds.\n", tone_names[tone], duration);
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Start sending %s for %.3f seconds.\n", tone_names[tone], duration);
else
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Start sending %s continuously.\n", tone_names[tone]);
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Start sending %s continuously.\n", tone_names[tone]);
imts->tone = tone;
imts->tone_duration = duration * (double)imts->sender.samplerate;
}
}
+/* Receive audio from call instance. */
+void call_down_audio(void *decoder, void *decoder_priv, int callref, uint16_t sequence, uint8_t marker, uint32_t timestamp, uint32_t ssrc, uint8_t *payload, int payload_len)
+{
+ sender_t *sender;
+ imts_t *imts;
+
+ for (sender = sender_head; sender; sender = sender->next) {
+ imts = (imts_t *) sender;
+ if (imts->callref == callref)
+ break;
+ }
+ if (!sender)
+ return;
+
+ if (imts->dsp_mode == DSP_MODE_AUDIO) {
+ jitter_frame_t *jf;
+ jf = jitter_frame_alloc(decoder, decoder_priv, payload, payload_len, marker, sequence, timestamp, ssrc);
+ if (jf)
+ jitter_save(&imts->sender.dejitter, jf);
+ }
+}
+
+void call_down_clock(void) {}
+
diff --git a/src/imts/image.c b/src/imts/image.c
index 1b60789..2ee63b2 100644
--- a/src/imts/image.c
+++ b/src/imts/image.c
@@ -1,8 +1,11 @@
#include <stdio.h>
const char *aaimage[] = {
- "@W",
- "IMTS / MTS is back!",
+ "",
+ "@WMTS - 'Mobile Telephone Service'",
+ "IMTS - 'Interim Mobile Telephone Service'",
+ "@w was soon changed to@W",
+ "IMTS - 'Improved Mobile Telephone Service'",
"",
NULL
};
diff --git a/src/imts/imts.c b/src/imts/imts.c
index 8395a78..31180df 100644
--- a/src/imts/imts.c
+++ b/src/imts/imts.c
@@ -39,11 +39,12 @@
#include <string.h>
#include <errno.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
-#include "../libtimer/timer.h"
+#include "../liblogging/logging.h"
+#include <osmocom/core/timer.h>
#include "../libmobile/call.h"
#include "../libmobile/cause.h"
-#include "../libosmocc/message.h"
+#include "../libmobile/get_time.h"
+#include <osmocom/cc/message.h>
#include "imts.h"
#include "dsp.h"
@@ -66,47 +67,61 @@ static const char *band_name[] = {
static struct channel_info {
int band; /* which band it belongs to */
- char *name; /* name of channel */
+ const char *name; /* name of channel */
+ const char *channel; /* number of channel */
double downlink_mhz; /* base station frequency */
double uplink_mhz; /* mobile station frequency */
int canada_only; /* channel used in canada only */
+ int channels_24; /* only available for 24 channel mobiles */
} channel_info[] = {
- { VHF_LOW, "ZO", 35.26, 43.26, 0 },
- { VHF_LOW, "ZF", 35.30, 43.30, 0 },
- { VHF_LOW, "ZM", 35.38, 43.38, 0 },
- { VHF_LOW, "ZH", 35.34, 43.34, 0 },
- { VHF_LOW, "ZA", 35.42, 43.32, 0 },
- { VHF_LOW, "ZY", 35.46, 43.46, 0 },
- { VHF_LOW, "ZR", 35.50, 43.50, 0 },
- { VHF_LOW, "ZB", 35.54, 43.54, 0 },
- { VHF_LOW, "ZW", 35.62, 43.62, 0 },
- { VHF_LOW, "ZL", 35.66, 43.66, 0 },
- { VHF_HIGH, "JJ", 152.48, 157.74, 1 },
- { VHF_HIGH, "JL", 152.51, 157.77, 0 },
- { VHF_HIGH, "YL", 152.54, 157.80, 0 },
- { VHF_HIGH, "JP", 152.57, 157.83, 0 },
- { VHF_HIGH, "YP", 152.60, 157.86, 0 },
- { VHF_HIGH, "YJ", 152.63, 157.89, 0 },
- { VHF_HIGH, "YK", 152.66, 157.92, 0 },
- { VHF_HIGH, "JS", 152.69, 157.95, 0 },
- { VHF_HIGH, "YS", 152.72, 157.98, 0 },
- { VHF_HIGH, "YR", 152.75, 158.01, 0 },
- { VHF_HIGH, "JK", 152.78, 158.04, 0 },
- { VHF_HIGH, "JR", 152.81, 158.07, 0 },
- { VHF_HIGH, "JW", 152.84, 158.10, 1 },
- { UHF, "QC", 454.375, 459.375, 0 },
- { UHF, "QJ", 454.40, 459.40, 0 },
- { UHF, "QD", 454.425, 459.425, 0 },
- { UHF, "QA", 454.45, 459.45, 0 },
- { UHF, "QE", 454.475, 459.475, 0 },
- { UHF, "QP", 454.50, 459.50, 0 },
- { UHF, "QK", 454.525, 459.525, 0 },
- { UHF, "QB", 454.55, 459.55, 0 },
- { UHF, "QO", 454.575, 459.575, 0 },
- { UHF, "QR", 454.60, 459.60, 0 },
- { UHF, "QY", 454.625, 459.625, 0 },
- { UHF, "QF", 454.65, 459.65, 0 },
- { 0, NULL, 0.0, 0.0, 0}
+ { VHF_LOW, "ZO", NULL, 35.26, 43.26, 0, 0 },
+ { VHF_LOW, "ZF", NULL, 35.30, 43.30, 0, 0 },
+ { VHF_LOW, "ZM", NULL, 35.38, 43.38, 0, 0 },
+ { VHF_LOW, "ZH", NULL, 35.34, 43.34, 0, 0 },
+ { VHF_LOW, "ZA", NULL, 35.42, 43.32, 0, 0 },
+ { VHF_LOW, "ZY", NULL, 35.46, 43.46, 0, 0 },
+ { VHF_LOW, "ZR", NULL, 35.50, 43.50, 0, 0 },
+ { VHF_LOW, "ZB", NULL, 35.54, 43.54, 0, 0 },
+ { VHF_LOW, "ZW", NULL, 35.62, 43.62, 0, 0 },
+ { VHF_LOW, "ZL", NULL, 35.66, 43.66, 0, 0 },
+ { VHF_HIGH, "JJ", "1", 152.48, 157.74, 1, 0 },
+ { VHF_HIGH, "JL", "3", 152.51, 157.77, 0, 0 },
+ { VHF_HIGH, "YL", "5", 152.54, 157.80, 0, 0 },
+ { VHF_HIGH, "JP", "7", 152.57, 157.83, 0, 0 },
+ { VHF_HIGH, "YP", "9", 152.60, 157.86, 0, 0 },
+ { VHF_HIGH, "YJ", "11", 152.63, 157.89, 0, 0 },
+ { VHF_HIGH, "YK", "13", 152.66, 157.92, 0, 0 },
+ { VHF_HIGH, "JS", "15", 152.69, 157.95, 0, 0 },
+ { VHF_HIGH, "YS", "17", 152.72, 157.98, 0, 0 },
+ { VHF_HIGH, "YR", "19", 152.75, 158.01, 0, 0 },
+ { VHF_HIGH, "JK", "21", 152.78, 158.04, 0, 0 },
+ { VHF_HIGH, "JR", "23", 152.81, 158.07, 0, 0 },
+ { VHF_HIGH, "JW", "25", 152.84, 158.10, 1, 0 },
+ { VHF_HIGH, "XJ", "2", 152.495, 157.755, 0, 1 },
+ { VHF_HIGH, "XK", "4", 152.525, 157.785, 0, 1 },
+ { VHF_HIGH, "XL", "6", 152.555, 157.815, 0, 1 },
+ { VHF_HIGH, "XP", "8", 152.585, 157.845, 0, 1 },
+ { VHF_HIGH, "XR", "10", 152.615, 157.875, 0, 1 },
+ { VHF_HIGH, "XS", "12", 152.645, 157.905, 0, 1 },
+ { VHF_HIGH, "XT", "14", 152.675, 157.935, 0, 1 },
+ { VHF_HIGH, "XU", "16", 152.705, 157.965, 0, 1 },
+ { VHF_HIGH, "XV", "18", 152.735, 157.995, 0, 1 },
+ { VHF_HIGH, "XW", "20", 152.765, 158.025, 0, 1 },
+ { VHF_HIGH, "XX", "22", 152.795, 158.055, 0, 1 },
+ { VHF_HIGH, "XY", "24", 152.825, 158.085, 0, 1 },
+ { UHF, "QC", "31", 454.375, 459.375, 0, 0 },
+ { UHF, "QJ", "32", 454.40, 459.40, 0, 0 },
+ { UHF, "QD", "33", 454.425, 459.425, 0, 0 },
+ { UHF, "QA", "34", 454.45, 459.45, 0, 0 },
+ { UHF, "QE", "35", 454.475, 459.475, 0, 0 },
+ { UHF, "QP", "36", 454.50, 459.50, 0, 0 },
+ { UHF, "QK", "37", 454.525, 459.525, 0, 0 },
+ { UHF, "QB", "38", 454.55, 459.55, 0, 0 },
+ { UHF, "QO", "39", 454.575, 459.575, 0, 0 },
+ { UHF, "QR", "40", 454.60, 459.60, 0, 0 },
+ { UHF, "QY", "41", 454.625, 459.625, 0, 0 },
+ { UHF, "QF", "42", 454.65, 459.65, 0, 0 },
+ { 0, NULL, NULL, 0.0, 0.0, 0, 0}
};
void imts_list_channels(void)
@@ -118,48 +133,51 @@ void imts_list_channels(void)
if (last_band != channel_info[i].band) {
last_band = channel_info[i].band;
printf("\n%s:\n\n", band_name[channel_info[i].band]);
- printf("Channel\t\tDownlink\tUplink\t\tCountry\n");
+ printf("Channel\t\tDownlink\tUplink\t\tComment\n");
printf("----------------------------------------------------------------\n");
}
- printf("%s\t\t%.3f MHz\t%.3f MHz\t%s\n", channel_info[i].name, channel_info[i].downlink_mhz, channel_info[i].uplink_mhz, (channel_info[i].canada_only) ? "USA + Canada" : "USA");
+ printf("%s", channel_info[i].name);
+ if (channel_info[i].channel)
+ printf(" (%s)", channel_info[i].channel);
+ printf("\t\t%.3f MHz\t%.3f MHz\t%s%s\n", channel_info[i].downlink_mhz, channel_info[i].uplink_mhz, (channel_info[i].canada_only) ? "Canada only" : "", (channel_info[i].channels_24) ? "24-Cannel only" : "");
}
printf("\n");
}
/* Timers */
-#define PAGING_TO 4.0 /* Time to wait for the phone to respond */
-#define RINGING_TO 45.0 /* Time to wait for the mobile user to answer */
-#define SEIZE_TO 1.0 /* Time to wait for the phone to seize (Connect tone) */
-#define ANI_TO 1.000 /* Time to wait for first / next digit */
-#define DIALTONE_TO 10.0 /* Time to wait until dialing must be performed */
-#define DIALING_TO 3.0 /* Time to wait until number is recognized as complete */
-#define RELEASE_TO 0.350 /* Time to turn off transmitter before going idle ".. for about 300 ms .." */
-#define ANI_PULSE_TO 0.100 /* Time to detect end of digit */
-#define DIAL_PULSE_TO 0.200 /* Time to detect end of digit */
-#define DISC_PULSE_TO 0.100 /* Time until aborting disconnect detection */
-#define PAGE_PULSE_TO 0.200 /* Time to detect end of digit */
+#define PAGING_TO 4,0 /* Time to wait for the phone to respond */
+#define RINGING_TO 45,0 /* Time to wait for the mobile user to answer */
+#define SEIZE_TO 1,0 /* Time to wait for the phone to seize (Connect tone) */
+#define ANI_TO 1,0 /* Time to wait for first / next digit */
+#define DIALTONE_TO 10,0 /* Time to wait until dialing must be performed */
+#define DIALING_TO 3,0 /* Time to wait until number is recognized as complete */
+#define RELEASE_TO 0,350000 /* Time to turn off transmitter before going idle ".. for about 300 ms .." */
+#define ANI_PULSE_TO 0,100000 /* Time to detect end of digit */
+#define DIAL_PULSE_TO 0,200000 /* Time to detect end of digit */
+#define DISC_PULSE_TO 0.1 /* Time until aborting disconnect detection */
+#define PAGE_PULSE_TO 0.2 /* Time to detect end of digit */
/* Counters */
-#define DISC_COUNT 2 /* Number of pulses to detect disconnect (100 ms) */
-#define RING_PULSES 40 /* 2 seconds ringer on */
+#define DISC_COUNT 2 /* Number of pulses to detect disconnect (100 ms) */
+#define RING_PULSES 40 /* 2 seconds ringer on */
/* Durations */
-#define IDLE_DETECT 0.500 /* Time to detect Idle signal (loopback) */
-#define PAGE_SEIZE 0.400 /* Time to seize channel until start paging pulses FIXME */
-#define PAGE_PAUSE 0.225 /* Time to pause after each digit */
-#define PAGE_MARK 0.050 /* Mark duration of page pulse */
-#define PAGE_SPACE 0.050 /* Space duration of page pulse */
-#define PAGE_PULSE 0.100 /* Duration of a complete pulse (MTS) */
-#define RING_MARK 0.025 /* Mark duration of ring pulse */
-#define RING_SPACE 0.025 /* Space duration of ring pulse */
-#define RING_OFF 4.0 /* 4 seconds ringer off */
-#define GUARD_TIME 0.200 /* Time until detecting Guard tone from mobile */
-#define SEIZE_TIME 0.300 /* Time until sending Seize tone >= 250 */
-#define SEIZE_LENGTH 0.250 /* Length of Seize */
-#define RECEIVE_TIME 0.200 /* Time until detecting receive signal (Guard tone) from mobile */
-#define ANSWER_TIME 0.200 /* Time until detecting answer signal (Connect tone) from mobile */
-
-const char *imts_state_name(enum imts_state state)
+#define IDLE_DETECT 0,500000 /* Time to detect Idle signal (loopback) */
+#define PAGE_SEIZE 0.400 /* Time to seize channel until start paging pulses FIXME */
+#define PAGE_PAUSE 0.225 /* Time to pause after each digit */
+#define PAGE_MARK 0.050 /* Mark duration of page pulse */
+#define PAGE_SPACE 0.050 /* Space duration of page pulse */
+#define PAGE_PULSE 0.100 /* Duration of a complete pulse (MTS) */
+#define RING_MARK 0.025 /* Mark duration of ring pulse */
+#define RING_SPACE 0.025 /* Space duration of ring pulse */
+#define RING_OFF 4.0 /* 4 seconds ringer off */
+#define GUARD_TIME 0.200 /* Time until detecting Guard tone from mobile */
+#define SEIZE_TIME 0,300000 /* Time until sending Seize tone >= 250 */
+#define SEIZE_LENGTH 0.250 /* Length of Seize */
+#define RECEIVE_TIME 0.200 /* Time until detecting receive signal (Guard tone) from mobile */
+#define ANSWER_TIME 0.200 /* Time until detecting answer signal (Connect tone) from mobile */
+
+static const char *imts_state_name(enum imts_state state)
{
static char invalid[16];
@@ -213,19 +231,26 @@ static void imts_new_state(imts_t *imts, enum imts_state new_state)
{
if (imts->state == new_state)
return;
- PDEBUG_CHAN(DIMTS, DEBUG_DEBUG, "State change: %s -> %s\n", imts_state_name(imts->state), imts_state_name(new_state));
+ LOGP_CHAN(DIMTS, LOGL_DEBUG, "State change: %s -> %s\n", imts_state_name(imts->state), imts_state_name(new_state));
imts->state = new_state;
imts_display_status();
}
/* Convert channel name to frequency number of base station.
Set 'uplink' to 1 to get frequency of mobile station. */
-double imts_channel2freq(const char *kanal, int uplink)
+double imts_channel2freq(const char *kanal, int uplink, int *band, int *canada_only, int *channels_24)
{
int i;
for (i = 0; channel_info[i].name; i++) {
- if (!strcasecmp(channel_info[i].name, kanal)) {
+ if (!strcasecmp(channel_info[i].name, kanal)
+ || (channel_info[i].channel && !strcmp(channel_info[i].channel, kanal))) {
+ if (band)
+ *band = channel_info[i].band;
+ if (canada_only)
+ *canada_only = channel_info[i].canada_only;
+ if (channels_24)
+ *channels_24 = channel_info[i].channels_24;
if (uplink == 2)
return (channel_info[i].downlink_mhz - channel_info[i].uplink_mhz) * 1e6;
else if (uplink)
@@ -238,30 +263,6 @@ double imts_channel2freq(const char *kanal, int uplink)
return 0.0;
}
-int imts_channel2band(const char *kanal)
-{
- int i;
-
- for (i = 0; channel_info[i].name; i++) {
- if (!strcasecmp(channel_info[i].name, kanal))
- return channel_info[i].band;
- }
-
- return 0.0;
-}
-
-double imts_is_canada_only(const char *kanal)
-{
- int i;
-
- for (i = 0; channel_info[i].name; i++) {
- if (!strcasecmp(channel_info[i].name, kanal))
- return channel_info[i].canada_only;
- }
-
- return 0;
-}
-
/* check if number is a valid station ID */
const char *mts_number_valid(const char *number)
{
@@ -283,7 +284,7 @@ int imts_init(void)
return 0;
}
-static void imts_timeout(struct timer *timer);
+static void imts_timeout(void *data);
static void imts_go_idle(imts_t *imts);
static void imts_paging(imts_t *imts, const char *dial_string, int loopback);
static void imts_detector_test(imts_t *imts, double length_1, double length_2, double length_3);
@@ -292,37 +293,43 @@ static void imts_detector_test(imts_t *imts, double length_1, double length_2, d
int imts_create(const char *kanal, const char *device, int use_sdr, int samplerate, double rx_gain, double tx_gain, int pre_emphasis, int de_emphasis, const char *write_rx_wave, const char *write_tx_wave, const char *read_rx_wave, const char *read_tx_wave, int loopback, double squelch_db, int ptt, double fast_seize, enum mode mode, const char *operator, double length_1, double length_2, double length_3)
{
imts_t *imts;
+ int band, canada_only, channels_24;
int rc;
- if (imts_channel2freq(kanal, 0) == 0.0) {
- PDEBUG(DIMTS, DEBUG_ERROR, "Channel number %s invalid.\n", kanal);
+ if (imts_channel2freq(kanal, 0, &band, &canada_only, &channels_24) == 0.0) {
+ LOGP(DIMTS, LOGL_ERROR, "Channel number %s invalid.\n", kanal);
return -EINVAL;
}
- if (imts_is_canada_only(kanal)) {
- PDEBUG(DIMTS, DEBUG_NOTICE, "*******************************************************************************\n");
- PDEBUG(DIMTS, DEBUG_NOTICE, "Given channel '%s' was only available in Canada with Canadian phones.\n", kanal);
- PDEBUG(DIMTS, DEBUG_NOTICE, "*******************************************************************************\n");
+ if (canada_only) {
+ LOGP(DIMTS, LOGL_NOTICE, "*******************************************************************************\n");
+ LOGP(DIMTS, LOGL_NOTICE, "Given channel '%s' was only available in Canada with Canadian phones.\n", kanal);
+ LOGP(DIMTS, LOGL_NOTICE, "*******************************************************************************\n");
+ }
+ if (channels_24) {
+ LOGP(DIMTS, LOGL_NOTICE, "*******************************************************************************\n");
+ LOGP(DIMTS, LOGL_NOTICE, "Given channel '%s' only works with phones that support 24 channels.\n", kanal);
+ LOGP(DIMTS, LOGL_NOTICE, "*******************************************************************************\n");
}
- if (mode == MODE_IMTS && imts_channel2band(kanal) == VHF_LOW) {
- PDEBUG(DIMTS, DEBUG_NOTICE, "*******************************************************************************\n");
- PDEBUG(DIMTS, DEBUG_NOTICE, "Given channel '%s' was only available at MTS network.\n", kanal);
- PDEBUG(DIMTS, DEBUG_NOTICE, "*******************************************************************************\n");
+ if (mode == MODE_IMTS && band == VHF_LOW) {
+ LOGP(DIMTS, LOGL_NOTICE, "*******************************************************************************\n");
+ LOGP(DIMTS, LOGL_NOTICE, "Given channel '%s' was only available at MTS network.\n", kanal);
+ LOGP(DIMTS, LOGL_NOTICE, "*******************************************************************************\n");
return -EINVAL;
}
- if (mode == MODE_MTS && imts_channel2band(kanal) == UHF) {
- PDEBUG(DIMTS, DEBUG_NOTICE, "*******************************************************************************\n");
- PDEBUG(DIMTS, DEBUG_NOTICE, "Given channel '%s' was only available at IMTS network.\n", kanal);
- PDEBUG(DIMTS, DEBUG_NOTICE, "*******************************************************************************\n");
+ if (mode == MODE_MTS && band == UHF) {
+ LOGP(DIMTS, LOGL_NOTICE, "*******************************************************************************\n");
+ LOGP(DIMTS, LOGL_NOTICE, "Given channel '%s' was only available at IMTS network.\n", kanal);
+ LOGP(DIMTS, LOGL_NOTICE, "*******************************************************************************\n");
return -EINVAL;
}
imts = calloc(1, sizeof(imts_t));
if (!imts) {
- PDEBUG(DIMTS, DEBUG_ERROR, "No memory!\n");
+ LOGP(DIMTS, LOGL_ERROR, "No memory!\n");
return -EIO;
}
- PDEBUG(DIMTS, DEBUG_DEBUG, "Creating 'IMTS' instance for channel = %s (sample rate %d).\n", kanal, samplerate);
+ LOGP(DIMTS, LOGL_DEBUG, "Creating 'IMTS' instance for channel = %s (sample rate %d).\n", kanal, samplerate);
imts->fast_seize = fast_seize;
imts->mode = mode;
@@ -331,20 +338,20 @@ int imts_create(const char *kanal, const char *device, int use_sdr, int samplera
/* init general part of transceiver */
/* do not enable emphasis, since it is done by imts code, not by common sender code */
- rc = sender_create(&imts->sender, kanal, imts_channel2freq(kanal, 0), imts_channel2freq(kanal, 1), device, use_sdr, samplerate, rx_gain, tx_gain, 0, 0, write_rx_wave, write_tx_wave, read_rx_wave, read_tx_wave, loopback, PAGING_SIGNAL_NONE);
+ rc = sender_create(&imts->sender, kanal, imts_channel2freq(kanal, 0, NULL, NULL, NULL), imts_channel2freq(kanal, 1, NULL, NULL, NULL), device, use_sdr, samplerate, rx_gain, tx_gain, 0, 0, write_rx_wave, write_tx_wave, read_rx_wave, read_tx_wave, loopback, PAGING_SIGNAL_NONE);
if (rc < 0) {
- PDEBUG(DIMTS, DEBUG_ERROR, "Failed to init 'Sender' processing!\n");
+ LOGP(DIMTS, LOGL_ERROR, "Failed to init 'Sender' processing!\n");
goto error;
}
/* init audio processing */
rc = dsp_init_transceiver(imts, squelch_db, ptt);
if (rc < 0) {
- PDEBUG(DIMTS, DEBUG_ERROR, "Failed to init signal processing!\n");
+ LOGP(DIMTS, LOGL_ERROR, "Failed to init signal processing!\n");
goto error;
}
- timer_init(&imts->timer, imts_timeout, imts);
+ osmo_timer_setup(&imts->timer, imts_timeout, imts);
imts->pre_emphasis = pre_emphasis;
imts->de_emphasis = de_emphasis;
@@ -363,7 +370,7 @@ int imts_create(const char *kanal, const char *device, int use_sdr, int samplera
imts_go_idle(imts);
}
- PDEBUG(DIMTS, DEBUG_NOTICE, "Created channel #%s\n", kanal);
+ LOGP(DIMTS, LOGL_NOTICE, "Created channel #%s\n", kanal);
return 0;
@@ -378,9 +385,9 @@ void imts_destroy(sender_t *sender)
{
imts_t *imts = (imts_t *) sender;
- PDEBUG(DIMTS, DEBUG_DEBUG, "Destroying 'IMTS' instance for channel = %s.\n", sender->kanal);
+ LOGP(DIMTS, LOGL_DEBUG, "Destroying 'IMTS' instance for channel = %s.\n", sender->kanal);
- timer_exit(&imts->timer);
+ osmo_timer_del(&imts->timer);
dsp_cleanup_transceiver(imts);
sender_destroy(&imts->sender);
free(sender);
@@ -392,7 +399,7 @@ static void imts_go_idle(imts_t *imts)
sender_t *sender;
imts_t *idle;
- timer_stop(&imts->timer);
+ osmo_timer_del(&imts->timer);
imts->station_id[0] = '\0'; /* remove station ID before state change, so status is shown correctly */
for (sender = sender_head; sender; sender = sender->next) {
@@ -403,17 +410,17 @@ static void imts_go_idle(imts_t *imts)
break;
}
if (sender) {
- PDEBUG(DIMTS, DEBUG_INFO, "Entering IDLE state on channel %s, turning transmitter off.\n", imts->sender.kanal);
+ LOGP(DIMTS, LOGL_INFO, "Entering IDLE state on channel %s, turning transmitter off.\n", imts->sender.kanal);
imts_new_state(imts, IMTS_OFF);
imts_set_dsp_mode(imts, DSP_MODE_OFF, 0, 0.0, 0);
} else {
if (imts->mode == MODE_IMTS) {
- PDEBUG(DIMTS, DEBUG_INFO, "Entering IDLE state on channel %s, sending 2000 Hz tone.\n", imts->sender.kanal);
+ LOGP(DIMTS, LOGL_INFO, "Entering IDLE state on channel %s, sending 2000 Hz tone.\n", imts->sender.kanal);
imts_new_state(imts, IMTS_IDLE);
/* also reset detector, so if there is a new call it is answered */
imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_IDLE, 0.0, 1);
} else {
- PDEBUG(DIMTS, DEBUG_INFO, "Entering IDLE state on channel %s, sending 600 Hz tone.\n", imts->sender.kanal);
+ LOGP(DIMTS, LOGL_INFO, "Entering IDLE state on channel %s, sending 600 Hz tone.\n", imts->sender.kanal);
imts_new_state(imts, IMTS_IDLE);
/* also reset detector, so if there is a new call it is answered */
imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_600, 0.0, 1);
@@ -435,13 +442,13 @@ static void imts_activate_idle(void)
if (sender)
imts_go_idle(idle);
else
- PDEBUG(DIMTS, DEBUG_INFO, "All channels are busy now, cannot activate any other channel.\n");
+ LOGP(DIMTS, LOGL_INFO, "All channels are busy now, cannot activate any other channel.\n");
}
/* Release connection towards mobile station by sending pause for a while. */
static void imts_release(imts_t *imts)
{
- timer_stop(&imts->timer);
+ osmo_timer_del(&imts->timer);
/* remove station ID before state change, so status is shown correctly */
imts->station_id[0] = '\0';
@@ -455,22 +462,22 @@ static void imts_release(imts_t *imts)
tone = TONE_600;
else
tone = TONE_1500;
- PDEBUG_CHAN(DIMTS, DEBUG_INFO, "Sending pulse to stop ringing of the phone.\n");
+ LOGP_CHAN(DIMTS, LOGL_INFO, "Sending pulse to stop ringing of the phone.\n");
imts_new_state(imts, IMTS_RELEASE);
imts_set_dsp_mode(imts, DSP_MODE_TONE, tone, PAGE_PAUSE, 0);
} else {
- PDEBUG_CHAN(DIMTS, DEBUG_INFO, "Turing transmitter off.\n");
+ LOGP_CHAN(DIMTS, LOGL_INFO, "Turing transmitter off.\n");
if (imts->state != IMTS_RELEASE)
imts_new_state(imts, IMTS_RELEASE);
imts_set_dsp_mode(imts, DSP_MODE_OFF, 0, 0.0, 0);
- timer_start(&imts->timer, RELEASE_TO);
+ osmo_timer_schedule(&imts->timer, RELEASE_TO);
}
}
/* Enter detector test state */
static void imts_detector_test(imts_t *imts, double length_1, double length_2, double length_3)
{
- PDEBUG_CHAN(DIMTS, DEBUG_INFO, "Entering detector test state, sending test sequence.\n");
+ LOGP_CHAN(DIMTS, LOGL_INFO, "Entering detector test state, sending test sequence.\n");
imts->detector_test_length_1 = length_1;
imts->detector_test_length_2 = length_2;
imts->detector_test_length_3 = length_3;
@@ -483,12 +490,12 @@ static void imts_detector_test(imts_t *imts, double length_1, double length_2, d
static void imts_paging(imts_t *imts, const char *dial_string, int loopback)
{
/* stop timer, since it may be running while measuring Guard tone at IDLE state */
- timer_stop(&imts->timer);
+ osmo_timer_del(&imts->timer);
if (loopback)
- PDEBUG_CHAN(DIMTS, DEBUG_INFO, "Entering paging test state, sending digits %s.\n", dial_string);
+ LOGP_CHAN(DIMTS, LOGL_INFO, "Entering paging test state, sending digits %s.\n", dial_string);
else
- PDEBUG_CHAN(DIMTS, DEBUG_INFO, "Entering paging state, sending phone's ID '%s'.\n", dial_string);
+ LOGP_CHAN(DIMTS, LOGL_INFO, "Entering paging state, sending phone's ID '%s'.\n", dial_string);
/* set station ID before state change, so status is shown correctly */
strncpy(imts->station_id, dial_string, sizeof(imts->station_id) - 1);
imts->tx_page_index = 0;
@@ -509,18 +516,18 @@ static void imts_paging(imts_t *imts, const char *dial_string, int loopback)
/* Enter ringing state */
static void imts_ringing(imts_t *imts)
{
- PDEBUG_CHAN(DIMTS, DEBUG_INFO, "Received response from mobile phone, ringing.\n");
+ LOGP_CHAN(DIMTS, LOGL_INFO, "Received response from mobile phone, ringing.\n");
imts->tx_ring_pulse = 0;
imts_new_state(imts, IMTS_RINGING);
imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_IDLE, RING_MARK, 0);
- timer_start(&imts->timer, RINGING_TO);
+ osmo_timer_schedule(&imts->timer, RINGING_TO);
}
/* Enter conversation state */
static void imts_answer(imts_t *imts)
{
- PDEBUG_CHAN(DIMTS, DEBUG_INFO, "Received answer from mobile phone, conversation started.\n");
- timer_stop(&imts->timer);
+ LOGP_CHAN(DIMTS, LOGL_INFO, "Received answer from mobile phone, conversation started.\n");
+ osmo_timer_del(&imts->timer);
imts_new_state(imts, IMTS_CONVERSATION);
imts_set_dsp_mode(imts, DSP_MODE_AUDIO, 0, 0.0, 0);
imts->rx_disc_pulse = 0;
@@ -531,10 +538,10 @@ void imts_loss_indication(imts_t *imts, double loss_time)
{
/* stop timer */
if (imts->mode == MODE_MTS && (imts->state == IMTS_IDLE || imts->state == IMTS_RINGING))
- timer_stop(&imts->timer);
+ osmo_timer_del(&imts->timer);
if (!imts->ptt && imts->state == IMTS_CONVERSATION) {
- PDEBUG_CHAN(DIMTS, DEBUG_NOTICE, "Detected loss of signal after %.1f seconds, releasing.\n", loss_time);
+ LOGP_CHAN(DIMTS, LOGL_NOTICE, "Detected loss of signal after %.1f seconds, releasing.\n", loss_time);
imts_release(imts);
call_up_release(imts->callref, CAUSE_TEMPFAIL);
imts->callref = 0;
@@ -546,7 +553,7 @@ void imts_signal_indication(imts_t *imts)
{
/* setup a call from mobile to base station */
if (imts->mode == MODE_MTS && imts->state == IMTS_IDLE) {
- PDEBUG_CHAN(DIMTS, DEBUG_INFO, "Detects RF signal in IDLE mode, calling the opterator at '%s'.\n", imts->operator);
+ LOGP_CHAN(DIMTS, LOGL_INFO, "Detects RF signal in IDLE mode, calling the opterator at '%s'.\n", imts->operator);
imts->callref = call_up_setup(NULL, imts->operator, OSMO_CC_NETWORK_MTS_NONE, "");
imts_new_state(imts, IMTS_CONVERSATION);
imts_set_dsp_mode(imts, DSP_MODE_AUDIO, 0, 0.0, 0);
@@ -554,7 +561,7 @@ void imts_signal_indication(imts_t *imts)
/* answer a call from base station to mobile */
if (imts->mode == MODE_MTS && imts->state == IMTS_RINGING) {
- PDEBUG_CHAN(DIMTS, DEBUG_INFO, "Detected RF signal, mobile is now transmitting.\n");
+ LOGP_CHAN(DIMTS, LOGL_INFO, "Detected RF signal, mobile is now transmitting.\n");
call_up_answer(imts->callref, imts->station_id);
imts_answer(imts);
}
@@ -564,26 +571,26 @@ void imts_signal_indication(imts_t *imts)
static void imts_receive_seize(imts_t *imts, int tone)
{
/* other tone stops IDLE / GUARD timer */
- timer_stop(&imts->timer);
+ osmo_timer_del(&imts->timer);
switch (tone) {
case TONE_IDLE:
case TONE_600:
- timer_start(&imts->timer, IDLE_DETECT);
+ osmo_timer_schedule(&imts->timer, IDLE_DETECT);
break;
case TONE_GUARD:
imts->rx_guard_timestamp = get_time();
if (imts->fast_seize)
- timer_start(&imts->timer, imts->fast_seize);
+ osmo_timer_schedule(&imts->timer, 0,imts->fast_seize * 1000000);
break;
case TONE_CONNECT:
if (imts->last_tone == TONE_GUARD && imts->rx_guard_duration >= GUARD_TIME) {
- PDEBUG_CHAN(DIMTS, DEBUG_INFO, "Received seize (Guard + Connect tone) from mobile phone.\n");
- PDEBUG_CHAN(DIMTS, DEBUG_INFO, " -> Guard tone duration: %.0f ms (level %.0f%%)\n", (get_time() - imts->rx_guard_timestamp) * 1000.0, imts->last_sigtone_amplitude * 100.0);
+ LOGP_CHAN(DIMTS, LOGL_INFO, "Received seize (Guard + Connect tone) from mobile phone.\n");
+ LOGP_CHAN(DIMTS, LOGL_INFO, " -> Guard tone duration: %.0f ms (level %.0f%%)\n", (get_time() - imts->rx_guard_timestamp) * 1000.0, imts->last_sigtone_amplitude * 100.0);
imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_SILENCE, 0.0, 0);
imts_new_state(imts, IMTS_SEIZE);
imts_activate_idle(); /* must activate another channel right after station is not idle anymore */
- timer_start(&imts->timer, SEIZE_TIME);
+ osmo_timer_schedule(&imts->timer, SEIZE_TIME);
}
break;
default:
@@ -604,34 +611,34 @@ static void imts_receive_ani(imts_t *imts, int tone)
imts->rx_ani_pulse++;
imts->rx_ani_totpulses++;
if (imts->rx_ani_pulse > 10) {
- PDEBUG_CHAN(DIMTS, DEBUG_NOTICE, "Received too many pulses, releasing!\n");
+ LOGP_CHAN(DIMTS, LOGL_NOTICE, "Received too many pulses, releasing!\n");
imts_release(imts);
break;
}
- PDEBUG_CHAN(DIMTS, DEBUG_DEBUG, "Detected ANI pulse #%d.\n", imts->rx_ani_pulse);
- timer_start(&imts->timer, ANI_PULSE_TO);
+ LOGP_CHAN(DIMTS, LOGL_DEBUG, "Detected ANI pulse #%d.\n", imts->rx_ani_pulse);
+ osmo_timer_schedule(&imts->timer, ANI_PULSE_TO);
break;
case TONE_GUARD:
/* even pulse completed */
if ((imts->rx_ani_totpulses & 1)) {
- PDEBUG_CHAN(DIMTS, DEBUG_NOTICE, "Parity error: Received Guard tone after %d (odd) pulses, releasing!\n", imts->rx_ani_totpulses);
+ LOGP_CHAN(DIMTS, LOGL_NOTICE, "Parity error: Received Guard tone after %d (odd) pulses, releasing!\n", imts->rx_ani_totpulses);
imts_release(imts);
break;
}
- timer_start(&imts->timer, ANI_PULSE_TO);
+ osmo_timer_schedule(&imts->timer, ANI_PULSE_TO);
break;
case TONE_SILENCE:
/* odd pulse completed */
if (!(imts->rx_ani_totpulses & 1)) {
- PDEBUG_CHAN(DIMTS, DEBUG_NOTICE, "Parity error: Received silence after %d (even) pulses, releasing!\n", imts->rx_ani_totpulses);
+ LOGP_CHAN(DIMTS, LOGL_NOTICE, "Parity error: Received silence after %d (even) pulses, releasing!\n", imts->rx_ani_totpulses);
imts_release(imts);
break;
}
- timer_start(&imts->timer, ANI_PULSE_TO);
+ osmo_timer_schedule(&imts->timer, ANI_PULSE_TO);
break;
default:
/* received noise */
- PDEBUG_CHAN(DIMTS, DEBUG_NOTICE, "Received noise while dialing, releasing!\n");
+ LOGP_CHAN(DIMTS, LOGL_NOTICE, "Received noise while dialing, releasing!\n");
imts_release(imts);
}
}
@@ -647,23 +654,23 @@ static void imts_receive_dialing(imts_t *imts, int tone)
/* pulse detected */
imts->rx_dial_pulse++;
if (imts->rx_dial_pulse > 10) {
- PDEBUG_CHAN(DIMTS, DEBUG_NOTICE, "Received too many pulses, releasing!\n");
+ LOGP_CHAN(DIMTS, LOGL_NOTICE, "Received too many pulses, releasing!\n");
imts_release(imts);
break;
}
- PDEBUG_CHAN(DIMTS, DEBUG_DEBUG, "Detected dialing pulse #%d.\n", imts->rx_dial_pulse);
- timer_start(&imts->timer, DIAL_PULSE_TO);
+ LOGP_CHAN(DIMTS, LOGL_DEBUG, "Detected dialing pulse #%d.\n", imts->rx_dial_pulse);
+ osmo_timer_schedule(&imts->timer, DIAL_PULSE_TO);
break;
case TONE_GUARD:
/* pulse completed */
if (imts->rx_dial_pulse)
- timer_start(&imts->timer, DIAL_PULSE_TO);
+ osmo_timer_schedule(&imts->timer, DIAL_PULSE_TO);
break;
default:
;
#if 0
/* received noise */
- PDEBUG_CHAN(DIMTS, DEBUG_NOTICE, "Received noise while dialing, releasing!\n");
+ LOGP_CHAN(DIMTS, LOGL_NOTICE, "Received noise while dialing, releasing!\n");
imts_release(imts);
#endif
}
@@ -675,7 +682,7 @@ static void imts_receive_disconnect(imts_t *imts, int tone, double elapsed, doub
/* reset disc counter on timeout */
if (elapsed > DISC_PULSE_TO) {
if (imts->rx_disc_pulse) {
- PDEBUG_CHAN(DIMTS, DEBUG_DEBUG, "Timeout Disconnect sequence\n");
+ LOGP_CHAN(DIMTS, LOGL_DEBUG, "Timeout Disconnect sequence\n");
imts->rx_disc_pulse = 0;
}
return;
@@ -684,11 +691,11 @@ static void imts_receive_disconnect(imts_t *imts, int tone, double elapsed, doub
switch (tone) {
case TONE_DISCONNECT:
imts->rx_disc_pulse++;
- PDEBUG_CHAN(DIMTS, DEBUG_DEBUG, "Detected Disconnect pulse #%d.\n", imts->rx_disc_pulse);
+ LOGP_CHAN(DIMTS, LOGL_DEBUG, "Detected Disconnect pulse #%d.\n", imts->rx_disc_pulse);
break;
case TONE_GUARD:
if (imts->rx_disc_pulse == DISC_COUNT) {
- PDEBUG_CHAN(DIMTS, DEBUG_INFO, "Received disconnect sequence from mobile phone (level %.0f%%).\n", amplitude * 100.0);
+ LOGP_CHAN(DIMTS, LOGL_INFO, "Received disconnect sequence from mobile phone (level %.0f%%).\n", amplitude * 100.0);
if (imts->state == IMTS_SEIZE
|| imts->state == IMTS_ANI
|| imts->state == IMTS_DIALING
@@ -704,7 +711,7 @@ static void imts_receive_disconnect(imts_t *imts, int tone, double elapsed, doub
break;
default:
if (imts->rx_disc_pulse) {
- PDEBUG_CHAN(DIMTS, DEBUG_DEBUG, "Disconnect sequence not detected anymore\n");
+ LOGP_CHAN(DIMTS, LOGL_DEBUG, "Disconnect sequence not detected anymore\n");
imts->rx_disc_pulse = 0;
}
}
@@ -717,15 +724,15 @@ static void receive_page_imts(imts_t *imts, int tone)
case TONE_IDLE:
/* pulse detected */
imts->rx_page_pulse++;
- PDEBUG_CHAN(DIMTS, DEBUG_DEBUG, "Detected page test pulse #%d.\n", imts->rx_page_pulse);
+ LOGP_CHAN(DIMTS, LOGL_DEBUG, "Detected page test pulse #%d.\n", imts->rx_page_pulse);
if (imts->rx_page_pulse > 10) {
- PDEBUG_CHAN(DIMTS, DEBUG_NOTICE, "Received too many pulses!\n");
+ LOGP_CHAN(DIMTS, LOGL_NOTICE, "Received too many pulses!\n");
}
- timer_start(&imts->timer, PAGE_PULSE_TO); // use for page test timeout
+ osmo_timer_schedule(&imts->timer, 0,PAGE_PULSE_TO * 1000000); // use for page test timeout
break;
case TONE_SEIZE:
/* pulse completed */
- timer_start(&imts->timer, PAGE_PULSE_TO); // use for page test timeout
+ osmo_timer_schedule(&imts->timer, 0,PAGE_PULSE_TO * 1000000); // use for page test timeout
break;
default:
;
@@ -738,11 +745,11 @@ static void receive_page_mts(imts_t *imts, int tone)
if (tone == TONE_600 || tone == TONE_1500) {
/* pulse detected */
imts->rx_page_pulse++;
- PDEBUG_CHAN(DIMTS, DEBUG_DEBUG, "Detected page test pulse #%d.\n", imts->rx_page_pulse);
+ LOGP_CHAN(DIMTS, LOGL_DEBUG, "Detected page test pulse #%d.\n", imts->rx_page_pulse);
if (imts->rx_page_pulse > 10) {
- PDEBUG_CHAN(DIMTS, DEBUG_NOTICE, "Received too many pulses!\n");
+ LOGP_CHAN(DIMTS, LOGL_NOTICE, "Received too many pulses!\n");
}
- timer_start(&imts->timer, PAGE_PULSE_TO); // use for page test timeout
+ osmo_timer_schedule(&imts->timer, 0,PAGE_PULSE_TO * 1000000); // use for page test timeout
}
}
@@ -784,12 +791,12 @@ void imts_lost_tone(imts_t *imts, int tone, double elapsed)
{
switch (imts->state) {
case IMTS_IDLE:
- timer_stop(&imts->timer);
+ osmo_timer_del(&imts->timer);
imts->rx_guard_duration = elapsed;
break;
case IMTS_PAGING:
- if (elapsed >= 0.300 && tone == TONE_GUARD && timer_running(&imts->timer)) {
- PDEBUG_CHAN(DIMTS, DEBUG_INFO, "Received acknowledge (Guard tone) from mobile phone (level %.0f%%).\n", imts->last_sigtone_amplitude * 100.0);
+ if (elapsed >= 0.300 && tone == TONE_GUARD && osmo_timer_pending(&imts->timer)) {
+ LOGP_CHAN(DIMTS, LOGL_INFO, "Received acknowledge (Guard tone) from mobile phone (level %.0f%%).\n", imts->last_sigtone_amplitude * 100.0);
call_up_alerting(imts->callref);
imts_ringing(imts);
break;
@@ -797,7 +804,7 @@ void imts_lost_tone(imts_t *imts, int tone, double elapsed)
break;
case IMTS_RINGING:
if (elapsed >= 0.190 && tone == TONE_CONNECT) {
- PDEBUG_CHAN(DIMTS, DEBUG_INFO, "Received answer (Connect tone) from mobile phone (level %.0f%%).\n", imts->last_sigtone_amplitude * 100.0);
+ LOGP_CHAN(DIMTS, LOGL_INFO, "Received answer (Connect tone) from mobile phone (level %.0f%%).\n", imts->last_sigtone_amplitude * 100.0);
call_up_answer(imts->callref, imts->station_id);
imts_answer(imts);
break;
@@ -818,30 +825,30 @@ static void ani_after_digit(imts_t *imts)
imts->rx_ani_pulse = 0;
imts->station_id[imts->rx_ani_index] = imts->rx_ani_pulse + '0';
imts->rx_ani_pulse = 0;
- PDEBUG_CHAN(DIMTS, DEBUG_INFO, "Received ANI digit '%c' from mobile phone (level %.0f%%).\n", imts->station_id[imts->rx_ani_index], imts->last_sigtone_amplitude * 100.0);
+ LOGP_CHAN(DIMTS, LOGL_INFO, "Received ANI digit '%c' from mobile phone (level %.0f%%).\n", imts->station_id[imts->rx_ani_index], imts->last_sigtone_amplitude * 100.0);
imts->station_id[++imts->rx_ani_index] = '\0';
/* update status while receiving station ID */
imts_display_status();
/* if all digits have been received */
if (imts->rx_ani_index == 7) {
- PDEBUG_CHAN(DIMTS, DEBUG_INFO, "ANI '%s' complete, sending dial tone.\n", imts->station_id);
+ LOGP_CHAN(DIMTS, LOGL_INFO, "ANI '%s' complete, sending dial tone.\n", imts->station_id);
dt:
imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_DIALTONE, 0.0, 0);
- timer_start(&imts->timer, DIALTONE_TO);
+ osmo_timer_schedule(&imts->timer, DIALTONE_TO);
imts->dial_number[0] = '\0';
imts->rx_dial_index = 0;
imts->rx_dial_pulse = 0;
imts_new_state(imts, IMTS_DIALING);
return;
}
- timer_start(&imts->timer, ANI_TO);
+ osmo_timer_schedule(&imts->timer, ANI_TO);
} else {
/* if only 5 digits have been received */
if (imts->rx_ani_index == 5) {
- PDEBUG_CHAN(DIMTS, DEBUG_INFO, "ANI '%s' (5 digits) complete, sending dial tone.\n", imts->station_id);
+ LOGP_CHAN(DIMTS, LOGL_INFO, "ANI '%s' (5 digits) complete, sending dial tone.\n", imts->station_id);
goto dt;
}
- PDEBUG_CHAN(DIMTS, DEBUG_NOTICE, "Timeout receiving ANI from mobile phone, releasing!\n");
+ LOGP_CHAN(DIMTS, LOGL_NOTICE, "Timeout receiving ANI from mobile phone, releasing!\n");
imts_release(imts);
}
}
@@ -850,7 +857,7 @@ static void dial_after_digit(imts_t *imts)
{
/* special case where nothing happens after dial tone */
if (!imts->rx_dial_pulse && !imts->rx_dial_index) {
- PDEBUG_CHAN(DANETZ, DEBUG_NOTICE, "Mobile phone does not start dialing, releasing!\n");
+ LOGP_CHAN(DANETZ, LOGL_NOTICE, "Mobile phone does not start dialing, releasing!\n");
imts_release(imts);
return;
}
@@ -860,7 +867,7 @@ static void dial_after_digit(imts_t *imts)
*/
if (imts->rx_dial_pulse) {
if (imts->rx_dial_index == sizeof(imts->dial_number) - 1) {
- PDEBUG_CHAN(DANETZ, DEBUG_NOTICE, "Mobile phone dials too many digits, releasing!\n");
+ LOGP_CHAN(DANETZ, LOGL_NOTICE, "Mobile phone dials too many digits, releasing!\n");
imts_release(imts);
return;
}
@@ -868,11 +875,11 @@ static void dial_after_digit(imts_t *imts)
imts->rx_dial_pulse = 0;
imts->dial_number[imts->rx_dial_index] = imts->rx_dial_pulse + '0';
imts->rx_dial_pulse = 0;
- PDEBUG_CHAN(DIMTS, DEBUG_INFO, "Received dial digit '%c' from mobile phone. (level %.0f%%)\n", imts->dial_number[imts->rx_dial_index], imts->last_sigtone_amplitude * 100.0);
+ LOGP_CHAN(DIMTS, LOGL_INFO, "Received dial digit '%c' from mobile phone. (level %.0f%%)\n", imts->dial_number[imts->rx_dial_index], imts->last_sigtone_amplitude * 100.0);
imts->dial_number[++imts->rx_dial_index] = '\0';
- timer_start(&imts->timer, DIALING_TO);
+ osmo_timer_schedule(&imts->timer, DIALING_TO);
} else {
- PDEBUG_CHAN(DIMTS, DEBUG_INFO, "Timeout receiving dialing from mobile phone, number complete.\n");
+ LOGP_CHAN(DIMTS, LOGL_INFO, "Timeout receiving dialing from mobile phone, number complete.\n");
imts->callref = call_up_setup(imts->station_id, imts->dial_number, OSMO_CC_NETWORK_IMTS_NONE, "");
imts_new_state(imts, IMTS_CONVERSATION);
imts_set_dsp_mode(imts, DSP_MODE_AUDIO, 0, 0.0, 0);
@@ -892,44 +899,44 @@ static void page_after_digit(imts_t *imts)
imts->rx_page_pulse = 0;
digit = imts->rx_page_pulse + '0';
delay = get_time() - imts->tx_page_timestamp - PAGE_PULSE_TO;
- PDEBUG_CHAN(DIMTS, DEBUG_INFO, "Received paging test digit '%c' (level %.0f%% delay %.0f ms).\n", digit, imts->last_sigtone_amplitude * 100.0, delay * 1000.0);
+ LOGP_CHAN(DIMTS, LOGL_INFO, "Received paging test digit '%c' (level %.0f%% delay %.0f ms).\n", digit, imts->last_sigtone_amplitude * 100.0, delay * 1000.0);
}
imts->rx_page_pulse = 0;
}
}
/* Timeout handling */
-static void imts_timeout(struct timer *timer)
+static void imts_timeout(void *data)
{
- imts_t *imts = (imts_t *)timer->priv;
+ imts_t *imts = data;
switch (imts->state) {
case IMTS_IDLE:
switch (imts->last_tone) {
case TONE_IDLE:
- PDEBUG_CHAN(DIMTS, DEBUG_NOTICE, "Received idle tone (level of %.0f%%), loopback?\n", imts->last_sigtone_amplitude * 100.0);
+ LOGP_CHAN(DIMTS, LOGL_NOTICE, "Received idle tone (level of %.0f%%), loopback?\n", imts->last_sigtone_amplitude * 100.0);
/* trigger reset of decoder to force detection again and again */
imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_IDLE, 0.0, 1);
break;
case TONE_600:
- PDEBUG_CHAN(DIMTS, DEBUG_NOTICE, "Received 600 Hz tone with level of %.0f%%, loopback?\n", imts->last_sigtone_amplitude * 100.0);
+ LOGP_CHAN(DIMTS, LOGL_NOTICE, "Received 600 Hz tone with level of %.0f%%, loopback?\n", imts->last_sigtone_amplitude * 100.0);
/* trigger reset of decoder to force detection again and again */
imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_600, 0.0, 1);
break;
case TONE_GUARD:
- PDEBUG_CHAN(DIMTS, DEBUG_NOTICE, "Received Guard tone, turning off IDLE tone\n");
+ LOGP_CHAN(DIMTS, LOGL_NOTICE, "Received Guard tone, turning off IDLE tone\n");
imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_SILENCE, 0.5, 0);
break;
}
break;
case IMTS_PAGING:
- PDEBUG_CHAN(DIMTS, DEBUG_NOTICE, "No response from mobile phone.\n");
+ LOGP_CHAN(DIMTS, LOGL_NOTICE, "No response from mobile phone.\n");
imts_go_idle(imts);
call_up_release(imts->callref, CAUSE_OUTOFORDER);
imts->callref = 0;
break;
case IMTS_RINGING:
- PDEBUG_CHAN(DIMTS, DEBUG_NOTICE, "No answer from mobile phone's user, releasing.\n");
+ LOGP_CHAN(DIMTS, LOGL_NOTICE, "No answer from mobile phone's user, releasing.\n");
imts_release(imts);
call_up_release(imts->callref, CAUSE_NOANSWER);
imts->callref = 0;
@@ -938,9 +945,9 @@ static void imts_timeout(struct timer *timer)
imts_go_idle(imts);
break;
case IMTS_SEIZE:
- PDEBUG_CHAN(DIMTS, DEBUG_NOTICE, "Sending Seize to mobile phone.\n");
+ LOGP_CHAN(DIMTS, LOGL_NOTICE, "Sending Seize to mobile phone.\n");
imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_SEIZE, SEIZE_LENGTH, 0);
- timer_start(&imts->timer, SEIZE_LENGTH + ANI_TO);
+ osmo_timer_schedule(&imts->timer, SEIZE_LENGTH + ANI_TO);
imts->station_id[0] = '\0';
imts->rx_ani_index = 0;
imts->rx_ani_pulse = 0;
@@ -973,7 +980,7 @@ static void paging_pulses_imts(imts_t *imts, int tone)
if (tone == TONE_SEIZE) {
if (imts->tx_page_pulse == 0)
- PDEBUG_CHAN(DIMTS, DEBUG_INFO, "Sending paging digit '%c' as pulses.\n", imts->station_id[imts->tx_page_index]);
+ LOGP_CHAN(DIMTS, LOGL_INFO, "Sending paging digit '%c' as pulses.\n", imts->station_id[imts->tx_page_index]);
/* send mark (pulse start) */
imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_IDLE, PAGE_MARK, 0);
imts->tx_page_pulse++;
@@ -993,7 +1000,7 @@ static void paging_pulses_imts(imts_t *imts, int tone)
duration = PAGE_PAUSE;
else {
duration = 0;
- timer_start(&imts->timer, PAGING_TO);
+ osmo_timer_schedule(&imts->timer, PAGING_TO);
}
}
imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_SEIZE, duration, 0);
@@ -1015,7 +1022,7 @@ static void paging_pulses_mts(imts_t *imts, int tone)
tone = TONE_1500;
if (imts->tx_page_pulse == 0) {
- PDEBUG_CHAN(DIMTS, DEBUG_INFO, "Sending paging digit '%c' as pulses.\n", imts->station_id[imts->tx_page_index]);
+ LOGP_CHAN(DIMTS, LOGL_INFO, "Sending paging digit '%c' as pulses.\n", imts->station_id[imts->tx_page_index]);
}
imts->tx_page_pulse++;
if (imts->tx_page_pulse < pulses)
@@ -1030,7 +1037,7 @@ static void paging_pulses_mts(imts_t *imts, int tone)
if (imts->station_id[imts->tx_page_index])
duration = PAGE_PAUSE;
else {
- PDEBUG_CHAN(DIMTS, DEBUG_INFO, "Digits complete, assuming the phone is ringing.\n");
+ LOGP_CHAN(DIMTS, LOGL_INFO, "Digits complete, assuming the phone is ringing.\n");
duration = 0;
imts_new_state(imts, IMTS_RINGING);
call_up_alerting(imts->callref);
@@ -1044,7 +1051,7 @@ static void ringing_pulses(imts_t *imts, int tone)
{
if (tone == TONE_IDLE) {
if (imts->tx_ring_pulse == 0)
- PDEBUG_CHAN(DIMTS, DEBUG_INFO, "Sending ringing signal as pulses.\n");
+ LOGP_CHAN(DIMTS, LOGL_INFO, "Sending ringing signal as pulses.\n");
/* send space (pulse end) */
imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_SEIZE, RING_SPACE, 0);
imts->tx_ring_pulse++;
@@ -1053,7 +1060,7 @@ static void ringing_pulses(imts_t *imts, int tone)
/* send mark (pulse start) */
imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_IDLE, RING_MARK, 0);
} else {
- PDEBUG_CHAN(DIMTS, DEBUG_INFO, "Sending pause after ringing.\n");
+ LOGP_CHAN(DIMTS, LOGL_INFO, "Sending pause after ringing.\n");
/* send long space after last pulse */
imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_SEIZE, RING_OFF, 0);
imts->tx_ring_pulse = 0;
@@ -1077,21 +1084,21 @@ static void detector_test_imts(imts_t *imts, int tone)
tone_idle:
if (imts->detector_test_length_1 <= 0)
goto tone_seize;
- PDEBUG_CHAN(DIMTS, DEBUG_NOTICE, "Sending %.3fs IDLE tone.\n", imts->detector_test_length_1);
+ LOGP_CHAN(DIMTS, LOGL_NOTICE, "Sending %.3fs IDLE tone.\n", imts->detector_test_length_1);
imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_IDLE, imts->detector_test_length_1, 0);
break;
case TONE_IDLE:
tone_seize:
if (imts->detector_test_length_2 <= 0)
goto tone_silence;
- PDEBUG_CHAN(DIMTS, DEBUG_NOTICE, "Sending %.3fs SEIZE tone.\n", imts->detector_test_length_2);
+ LOGP_CHAN(DIMTS, LOGL_NOTICE, "Sending %.3fs SEIZE tone.\n", imts->detector_test_length_2);
imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_SEIZE, imts->detector_test_length_2, 0);
break;
case TONE_SEIZE:
tone_silence:
if (imts->detector_test_length_3 <= 0)
goto tone_idle;
- PDEBUG_CHAN(DIMTS, DEBUG_NOTICE, "Sending %.3fs SILENCE.\n", imts->detector_test_length_3);
+ LOGP_CHAN(DIMTS, LOGL_NOTICE, "Sending %.3fs SILENCE.\n", imts->detector_test_length_3);
imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_SILENCE, imts->detector_test_length_3, 0);
break;
}
@@ -1103,21 +1110,21 @@ static void detector_test_mts(imts_t *imts, int tone)
tone_idle:
if (imts->detector_test_length_1 <= 0)
goto tone_seize;
- PDEBUG_CHAN(DIMTS, DEBUG_NOTICE, "Sending %.3fs 600 Hz tone.\n", imts->detector_test_length_1);
+ LOGP_CHAN(DIMTS, LOGL_NOTICE, "Sending %.3fs 600 Hz tone.\n", imts->detector_test_length_1);
imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_600, imts->detector_test_length_1, 0);
break;
case TONE_600:
tone_seize:
if (imts->detector_test_length_2 <= 0)
goto tone_silence;
- PDEBUG_CHAN(DIMTS, DEBUG_NOTICE, "Sending %.3fs 1500 Hz tone.\n", imts->detector_test_length_2);
+ LOGP_CHAN(DIMTS, LOGL_NOTICE, "Sending %.3fs 1500 Hz tone.\n", imts->detector_test_length_2);
imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_1500, imts->detector_test_length_2, 0);
break;
case TONE_1500:
tone_silence:
if (imts->detector_test_length_3 <= 0)
goto tone_idle;
- PDEBUG_CHAN(DIMTS, DEBUG_NOTICE, "Sending %.3fs SILENCE.\n", imts->detector_test_length_3);
+ LOGP_CHAN(DIMTS, LOGL_NOTICE, "Sending %.3fs SILENCE.\n", imts->detector_test_length_3);
imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_SILENCE, imts->detector_test_length_3, 0);
break;
}
@@ -1128,7 +1135,7 @@ void imts_tone_sent(imts_t *imts, int tone)
{
switch (imts->state) {
case IMTS_IDLE:
- PDEBUG_CHAN(DIMTS, DEBUG_NOTICE, "No Seize tone after Guard tone, turning on IDLE tone\n");
+ LOGP_CHAN(DIMTS, LOGL_NOTICE, "No Seize tone after Guard tone, turning on IDLE tone\n");
imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_IDLE, 0.0, 0);
break;
case IMTS_ANI:
@@ -1172,7 +1179,7 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
break;
}
if (sender) {
- PDEBUG(DIMTS, DEBUG_NOTICE, "Outgoing call to busy number, rejecting!\n");
+ LOGP(DIMTS, LOGL_NOTICE, "Outgoing call to busy number, rejecting!\n");
return -CAUSE_BUSY;
}
@@ -1183,7 +1190,7 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
break;
}
if (!sender) {
- PDEBUG(DIMTS, DEBUG_NOTICE, "Outgoing call, but no free channel, rejecting!\n");
+ LOGP(DIMTS, LOGL_NOTICE, "Outgoing call, but no free channel, rejecting!\n");
return -CAUSE_NOCHANNEL;
}
@@ -1195,14 +1202,14 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
}
/* 4. trying to page mobile station */
- PDEBUG_CHAN(DIMTS, DEBUG_INFO, "Call to mobile station, paging number: %s\n", dialing);
+ LOGP_CHAN(DIMTS, LOGL_INFO, "Call to mobile station, paging number: %s\n", dialing);
imts->callref = callref;
imts_paging(imts, dialing, 0);
return 0;
}
-void call_down_answer(int __attribute__((unused)) callref)
+void call_down_answer(int __attribute__((unused)) callref, struct timeval __attribute__((unused)) *tv_meter)
{
}
@@ -1215,7 +1222,7 @@ void call_down_disconnect(int callref, int cause)
sender_t *sender;
imts_t *imts;
- PDEBUG(DIMTS, DEBUG_INFO, "Call has been disconnected by network.\n");
+ LOGP(DIMTS, LOGL_INFO, "Call has been disconnected by network.\n");
for (sender = sender_head; sender; sender = sender->next) {
imts = (imts_t *) sender;
@@ -1223,7 +1230,7 @@ void call_down_disconnect(int callref, int cause)
break;
}
if (!sender) {
- PDEBUG(DIMTS, DEBUG_NOTICE, "Outgoing disconnect, but no callref!\n");
+ LOGP(DIMTS, LOGL_NOTICE, "Outgoing disconnect, but no callref!\n");
call_up_release(callref, CAUSE_INVALCALLREF);
return;
}
@@ -1234,7 +1241,7 @@ void call_down_disconnect(int callref, int cause)
switch (imts->state) {
case IMTS_PAGING:
case IMTS_RINGING:
- PDEBUG_CHAN(DIMTS, DEBUG_NOTICE, "Outgoing disconnect, during paging/alerting, releasing!\n");
+ LOGP_CHAN(DIMTS, LOGL_NOTICE, "Outgoing disconnect, during paging/alerting, releasing!\n");
imts_release(imts);
break;
default:
@@ -1253,7 +1260,7 @@ void call_down_release(int callref, __attribute__((unused)) int cause)
sender_t *sender;
imts_t *imts;
- PDEBUG(DIMTS, DEBUG_INFO, "Call has been released by network, releasing call.\n");
+ LOGP(DIMTS, LOGL_INFO, "Call has been released by network, releasing call.\n");
for (sender = sender_head; sender; sender = sender->next) {
imts = (imts_t *) sender;
@@ -1261,7 +1268,7 @@ void call_down_release(int callref, __attribute__((unused)) int cause)
break;
}
if (!sender) {
- PDEBUG(DIMTS, DEBUG_NOTICE, "Outgoing release, but no callref!\n");
+ LOGP(DIMTS, LOGL_NOTICE, "Outgoing release, but no callref!\n");
/* don't send release, because caller already released */
return;
}
@@ -1270,12 +1277,12 @@ void call_down_release(int callref, __attribute__((unused)) int cause)
switch (imts->state) {
case IMTS_CONVERSATION:
- PDEBUG_CHAN(DIMTS, DEBUG_NOTICE, "Outgoing release, during call, releasing!\n");
+ LOGP_CHAN(DIMTS, LOGL_NOTICE, "Outgoing release, during call, releasing!\n");
imts_release(imts);
break;
case IMTS_PAGING:
case IMTS_RINGING:
- PDEBUG_CHAN(DIMTS, DEBUG_NOTICE, "Outgoing release, during paging/alerting, releasing!\n");
+ LOGP_CHAN(DIMTS, LOGL_NOTICE, "Outgoing release, during paging/alerting, releasing!\n");
imts_release(imts);
break;
default:
@@ -1283,26 +1290,5 @@ void call_down_release(int callref, __attribute__((unused)) int 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;
- imts_t *imts;
-
- for (sender = sender_head; sender; sender = sender->next) {
- imts = (imts_t *) sender;
- if (imts->callref == callref)
- break;
- }
- if (!sender)
- return;
-
- if (imts->dsp_mode == DSP_MODE_AUDIO) {
- jitter_save(&imts->sender.dejitter, samples, count, 1, sequence, timestamp, ssrc);
- }
-}
-
-void call_down_clock(void) {}
-
void dump_info(void) {}
diff --git a/src/imts/imts.h b/src/imts/imts.h
index d754c90..278dc81 100644
--- a/src/imts/imts.h
+++ b/src/imts/imts.h
@@ -61,7 +61,7 @@ typedef struct imts {
int callref; /* call reference */
char station_id[11]; /* current station ID (also used for test pattern) */
char dial_number[33]; /* number dialing */
- struct timer timer;
+ struct osmo_timer_list timer;
int last_tone; /* last tone received */
double last_sigtone_amplitude; /* amplitude of last signaling tone received */
double fast_seize; /* fast seize: guard-length - roundtrip-delay */
@@ -127,7 +127,7 @@ typedef struct imts {
const char *mts_number_valid(const char *number);
void imts_list_channels(void);
-double imts_channel2freq(const char *kanal, int uplink);
+double imts_channel2freq(const char *kanal, int uplink, int *band, int *canada_only, int *channels_24);
int imts_init(void);
int imts_create(const char *channel, const char *device, int use_sdr, int samplerate, double rx_gain, double tx_gain, int pre_emphasis, int de_emphasis, const char *write_rx_wave, const char *write_tx_wave, const char *read_rx_wave, const char *read_tx_wave, int loopback, double squelch_db, int ptt, double fast_seize, enum mode mode, const char *operator, double length_1, double length_2, double length_3);
void imts_destroy(sender_t *sender);
diff --git a/src/imts/main.c b/src/imts/main.c
index dace347..43f66e7 100644
--- a/src/imts/main.c
+++ b/src/imts/main.c
@@ -25,8 +25,8 @@
#include <math.h>
#include "../libsample/sample.h"
#include "../libmobile/main_mobile.h"
-#include "../libdebug/debug.h"
-#include "../libtimer/timer.h"
+#include "../liblogging/logging.h"
+#include <osmocom/core/timer.h>
#include "../libmobile/call.h"
#include "../liboptions/options.h"
#include "../amps/tones.h"
@@ -191,9 +191,11 @@ int main(int argc, char *argv[])
print_help(argv[0]);
return 0;
}
- if (!strcasecmp(kanal[0], "list")) {
- imts_list_channels();
- goto fail;
+ for (i = 0; i < num_kanal; i++) {
+ if (!strcasecmp(kanal[i], "list")) {
+ imts_list_channels();
+ goto fail;
+ }
}
if (use_sdr) {
/* set device */
@@ -268,7 +270,7 @@ int main(int argc, char *argv[])
fprintf(stderr, "Failed to create \"Sender\" instance. Quitting!\n");
goto fail;
}
- printf("Base station on channel %s ready, please tune transmitter to %.3f MHz and receiver to %.3f MHz. (%.3f MHz offset)\n", kanal[i], imts_channel2freq(kanal[i], 0) / 1e6, imts_channel2freq(kanal[i], 1) / 1e6, imts_channel2freq(kanal[i], 2) / 1e6);
+ printf("Base station on channel %s ready, please tune transmitter to %.3f MHz and receiver to %.3f MHz. (%.3f MHz offset)\n", kanal[i], imts_channel2freq(kanal[i], 0, NULL, NULL, NULL) / 1e6, imts_channel2freq(kanal[i], 1, NULL, NULL, NULL) / 1e6, imts_channel2freq(kanal[i], 2, NULL, NULL, NULL) / 1e6);
}
main_mobile_loop((mode == MODE_IMTS) ? "imts" : "mts", &quit, NULL, station_id);
@@ -279,6 +281,7 @@ fail:
imts_destroy(sender_head);
/* exits */
+ main_mobile_exit();
fm_exit();
options_free();
diff --git a/src/jolly/Makefile.am b/src/jolly/Makefile.am
index a968f89..1c868b6 100644
--- a/src/jolly/Makefile.am
+++ b/src/jolly/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
bin_PROGRAMS = \
jollycom
@@ -12,22 +12,21 @@ jollycom_LDADD = \
$(COMMON_LA) \
../anetz/libgermanton.a \
$(top_builddir)/src/liboptions/liboptions.a \
- $(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libmobile/libmobile.a \
- $(top_builddir)/src/libosmocc/libosmocc.a \
$(top_builddir)/src/libdisplay/libdisplay.a \
$(top_builddir)/src/libjitter/libjitter.a \
$(top_builddir)/src/libsquelch/libsquelch.a \
$(top_builddir)/src/libdtmf/libdtmf.a \
- $(top_builddir)/src/libtimer/libtimer.a \
$(top_builddir)/src/libsamplerate/libsamplerate.a \
$(top_builddir)/src/libemphasis/libemphasis.a \
$(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \
$(top_builddir)/src/libfm/libfm.a \
- $(top_builddir)/src/libg711/libg711.a \
$(top_builddir)/src/libaaimage/libaaimage.a \
+ $(top_builddir)/src/liblogging/liblogging.a \
+ $(LIBOSMOCORE_LIBS) \
+ $(LIBOSMOCC_LIBS) \
-lm
if HAVE_ALSA
diff --git a/src/jolly/dsp.c b/src/jolly/dsp.c
index 9d2ab41..baa3862 100644
--- a/src/jolly/dsp.c
+++ b/src/jolly/dsp.c
@@ -27,8 +27,8 @@
#include <math.h>
#include "../libsample/sample.h"
-#include "../libtimer/timer.h"
-#include "../libdebug/debug.h"
+#include <osmocom/core/timer.h>
+#include "../liblogging/logging.h"
#include "../libmobile/call.h"
#include "jolly.h"
#include "dsp.h"
@@ -63,7 +63,7 @@ void dsp_init(void)
int i;
double s;
- PDEBUG(DDSP, DEBUG_DEBUG, "Generating sine tables.\n");
+ LOGP(DDSP, LOGL_DEBUG, "Generating sine tables.\n");
for (i = 0; i < 65536; i++) {
s = sin((double)i / 65536.0 * 2.0 * M_PI);
dsp_info_tone[i] = s * TX_INFO_TONE;
@@ -90,9 +90,9 @@ int dsp_init_sender(jolly_t *jolly, int nbfm, double squelch_db, int repeater)
/* init dtmf audio processing.
* each frequency may be +6 dB deviation, which means a total deviation of +12 dB is allowed for detection.
* also we allow a minimum of -30 dB for each tone. */
- rc = dtmf_decode_init(&jolly->dtmf, jolly, jolly_receive_dtmf, 8000, db2level(6.0), db2level(-30.0));
+ rc = dtmf_decode_init(&jolly->dtmf, jolly, jolly_receive_dtmf, 8000, db2level(6.0), db2level(-30.0), DTMF_FREQ_MARGIN_PERCENT_DEFAULT);
if (rc < 0) {
- PDEBUG(DDSP, DEBUG_ERROR, "Failed to init DTMF decoder!\n");
+ LOGP(DDSP, LOGL_ERROR, "Failed to init DTMF decoder!\n");
goto error;
}
@@ -106,16 +106,16 @@ int dsp_init_sender(jolly_t *jolly, int nbfm, double squelch_db, int repeater)
jolly->delay_max = (int)((double)jolly->sender.samplerate * DELAY_TIME);
jolly->delay_spl = calloc(jolly->delay_max, sizeof(*jolly->delay_spl));
if (!jolly->delay_spl) {
- PDEBUG(DDSP, DEBUG_ERROR, "No mem for delay buffer!\n");
+ LOGP(DDSP, LOGL_ERROR, "No mem for delay buffer!\n");
goto error;
}
/* repeater */
jolly->repeater = repeater;
jolly->repeater_max = (int)((double)jolly->sender.samplerate * REPEATER_TIME);
- rc = jitter_create(&jolly->repeater_dejitter, "repeater", jolly->sender.samplerate, sizeof(sample_t), 0.050, 0.500, JITTER_FLAG_NONE);
+ rc = jitter_create(&jolly->repeater_dejitter, "repeater", jolly->sender.samplerate, 0.050, 0.500, JITTER_FLAG_NONE);
if (rc < 0) {
- PDEBUG(DDSP, DEBUG_ERROR, "Failed to create and init repeater buffer!\n");
+ LOGP(DDSP, LOGL_ERROR, "Failed to create and init repeater buffer!\n");
goto error;
}
@@ -144,7 +144,7 @@ void set_speech_string(jolly_t *jolly, char announcement, const char *number)
{
jolly->speech_string[0] = announcement;
jolly->speech_string[1] = '\0';
- strncat(jolly->speech_string, number, sizeof(jolly->speech_string) - strlen(number) - 1);
+ strncat(jolly->speech_string, number, sizeof(jolly->speech_string) - strlen(jolly->speech_string) - 1);
jolly->speech_digit = 0;
jolly->speech_pos = 0;
}
@@ -174,25 +174,25 @@ again:
spl = jolly_voice.spl[10];
size = jolly_voice.size[10];
if (!jolly->speech_pos)
- PDEBUG(DDSP, DEBUG_DEBUG, "speaking 'incoming'.\n");
+ LOGP(DDSP, LOGL_DEBUG, "speaking 'incoming'.\n");
break;
case 'o':
spl = jolly_voice.spl[11];
size = jolly_voice.size[11];
if (!jolly->speech_pos)
- PDEBUG(DDSP, DEBUG_DEBUG, "speaking 'outgoing'.\n");
+ LOGP(DDSP, LOGL_DEBUG, "speaking 'outgoing'.\n");
break;
case 'r':
spl = jolly_voice.spl[12];
size = jolly_voice.size[12];
if (!jolly->speech_pos)
- PDEBUG(DDSP, DEBUG_DEBUG, "speaking 'released'.\n");
+ LOGP(DDSP, LOGL_DEBUG, "speaking 'released'.\n");
break;
case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
spl = jolly_voice.spl[jolly->speech_string[jolly->speech_digit] - '0'];
size = jolly_voice.size[jolly->speech_string[jolly->speech_digit] - '0'];
if (!jolly->speech_pos)
- PDEBUG(DDSP, DEBUG_DEBUG, "speaking digit '%c'.\n", jolly->speech_string[jolly->speech_digit]);
+ LOGP(DDSP, LOGL_DEBUG, "speaking digit '%c'.\n", jolly->speech_string[jolly->speech_digit]);
break;
default:
jolly->speech_digit++;
@@ -292,7 +292,7 @@ void sender_receive(sender_t *sender, sample_t *samples, int length, double rf_l
case SQUELCH_LOSS:
case SQUELCH_MUTE:
if (!jolly->is_mute) {
- PDEBUG_CHAN(DDSP, DEBUG_INFO, "Low RF level, muting.\n");
+ LOGP_CHAN(DDSP, LOGL_INFO, "Low RF level, muting.\n");
jolly->ack_count = jolly->ack_max;
jolly->repeater_count = jolly->repeater_max;
}
@@ -301,7 +301,7 @@ void sender_receive(sender_t *sender, sample_t *samples, int length, double rf_l
break;
default:
if (jolly->is_mute)
- PDEBUG_CHAN(DDSP, DEBUG_INFO, "High RF level, unmuting; turning transmitter on.\n");
+ LOGP_CHAN(DDSP, LOGL_INFO, "High RF level, unmuting; turning transmitter on.\n");
jolly->is_mute = 0;
break;
}
@@ -318,8 +318,14 @@ void sender_receive(sender_t *sender, sample_t *samples, int length, double rf_l
}
/* if repeater mode, store sample in jitter buffer */
- if (jolly->repeater)
- jitter_save(&jolly->repeater_dejitter, samples, length, 0, 0, 0, 0);
+ if (jolly->repeater) {
+ jitter_frame_t *jf;
+ jf = jitter_frame_alloc(NULL, NULL, (uint8_t *)samples, length * sizeof(*samples), 0, jolly->repeater_sequence, jolly->repeater_timestamp, 123);
+ if (jf)
+ jitter_save(&jolly->repeater_dejitter, jf);
+ jolly->repeater_sequence += 1;
+ jolly->repeater_timestamp += length;
+ }
/* downsample, decode DTMF */
count = samplerate_downsample(&jolly->sender.srstate, samples, length);
@@ -355,7 +361,7 @@ void sender_send(sender_t *sender, sample_t *samples, uint8_t *power, int length
if (jolly->repeater_count) {
jolly->repeater_count -= length;
if (jolly->repeater_count < 0) {
- PDEBUG_CHAN(DDSP, DEBUG_INFO, "turning transmitter off.\n");
+ LOGP_CHAN(DDSP, LOGL_INFO, "turning transmitter off.\n");
jolly->repeater_count = 0;
}
}
@@ -369,7 +375,11 @@ void sender_send(sender_t *sender, sample_t *samples, uint8_t *power, int length
case STATE_CALL_DIALING:
memset(power, 1, length);
input_num = samplerate_upsample_input_num(&sender->srstate, length);
- jitter_load(&sender->dejitter, samples, input_num);
+ {
+ int16_t spl[input_num];
+ jitter_load_samples(&sender->dejitter, (uint8_t *)spl, input_num, sizeof(*spl), jitter_conceal_s16, NULL);
+ int16_to_samples_speech(samples, spl, input_num);
+ }
samplerate_upsample(&sender->srstate, samples, input_num, samples, length);
break;
case STATE_OUT_VERIFY:
@@ -394,9 +404,33 @@ void sender_send(sender_t *sender, sample_t *samples, uint8_t *power, int length
if (jolly->repeater) {
sample_t uplink[length];
int i;
- jitter_load(&jolly->repeater_dejitter, uplink, length);
+ jitter_load_samples(&jolly->repeater_dejitter, (uint8_t *)uplink, length, sizeof(*uplink), NULL, NULL);
for (i = 0; i < length; i++)
samples[i] += uplink[i];
}
}
+/* Receive audio from call instance. */
+void call_down_audio(void *decoder, void *decoder_priv, int callref, uint16_t sequence, uint8_t marker, uint32_t timestamp, uint32_t ssrc, uint8_t *payload, int payload_len)
+{
+ sender_t *sender;
+ jolly_t *jolly;
+
+ for (sender = sender_head; sender; sender = sender->next) {
+ jolly = (jolly_t *) sender;
+ if (jolly->callref == callref)
+ break;
+ }
+ if (!sender)
+ return;
+
+ if (jolly->state == STATE_CALL || jolly->state == STATE_CALL_DIALING) {
+ jitter_frame_t *jf;
+ jf = jitter_frame_alloc(decoder, decoder_priv, payload, payload_len, marker, sequence, timestamp, ssrc);
+ if (jf)
+ jitter_save(&jolly->sender.dejitter, jf);
+ }
+}
+
+void call_down_clock(void) {}
+
diff --git a/src/jolly/jolly.c b/src/jolly/jolly.c
index 115d561..37aa922 100644
--- a/src/jolly/jolly.c
+++ b/src/jolly/jolly.c
@@ -134,11 +134,11 @@
#include <errno.h>
#include <math.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
-#include "../libtimer/timer.h"
+#include "../liblogging/logging.h"
+#include <osmocom/core/timer.h>
#include "../libmobile/call.h"
#include "../libmobile/cause.h"
-#include "../libosmocc/message.h"
+#include <osmocom/cc/message.h>
#include "jolly.h"
#include "dsp.h"
#include "voice.h"
@@ -146,14 +146,14 @@
#define db2level(db) pow(10, (double)db / 20.0)
/* Timers */
-#define T_DIAL 6 /* Time between digits */
-#define T_DIAL2 1.5 /* Time between digits during call*/
-#define T_PAGING 30 /* How long do we page the mobile party */
-#define SPEECH_DELAY_PAGING 1.0 /* time before speaking paging sequence */
-#define SPEECH_DELAY_VERIFY 2.0 /* time before speaking verifying sequence */
-#define SPEECH_DELAY_RELEASE 2.0/* time before speaking release sequence */
-
-const char *jolly_state_name(enum jolly_state state)
+#define T_DIAL 6,0 /* Time between digits */
+#define T_DIAL2 1,500000 /* Time between digits during call*/
+#define T_PAGING 30,0 /* How long do we page the mobile party */
+#define SPEECH_DELAY_PAGING 1,0 /* time before speaking paging sequence */
+#define SPEECH_DELAY_VERIFY 2,0 /* time before speaking verifying sequence */
+#define SPEECH_DELAY_RELEASE 2,0 /* time before speaking release sequence */
+
+static const char *jolly_state_name(enum jolly_state state)
{
static char invalid[16];
@@ -180,7 +180,7 @@ const char *jolly_state_name(enum jolly_state state)
return invalid;
}
-void jolly_display_status(void)
+static void jolly_display_status(void)
{
sender_t *sender;
jolly_t *jolly;
@@ -199,13 +199,13 @@ static void jolly_new_state(jolly_t *jolly, enum jolly_state new_state)
{
if (jolly->state == new_state)
return;
- PDEBUG_CHAN(DJOLLY, DEBUG_DEBUG, "State change: %s -> %s\n", jolly_state_name(jolly->state), jolly_state_name(new_state));
+ LOGP_CHAN(DJOLLY, LOGL_DEBUG, "State change: %s -> %s\n", jolly_state_name(jolly->state), jolly_state_name(new_state));
jolly->state = new_state;
jolly_display_status();
}
-static void jolly_timeout(struct timer *timer);
-static void jolly_speech_timeout(struct timer *timer);
+static void jolly_timeout(void *data);
+static void jolly_speech_timeout(void *data);
static void jolly_go_idle(jolly_t *jolly);
/* Create transceiver instance and link to a list. */
@@ -216,11 +216,11 @@ int jolly_create(const char *kanal, double dl_freq, double ul_freq, double step,
jolly = calloc(1, sizeof(jolly_t));
if (!jolly) {
- PDEBUG(DJOLLY, DEBUG_ERROR, "No memory!\n");
+ LOGP(DJOLLY, LOGL_ERROR, "No memory!\n");
return -EIO;
}
- PDEBUG(DJOLLY, DEBUG_DEBUG, "Creating 'JollyCom' instance for 'Kanal' = %s (sample rate %d).\n", kanal, samplerate);
+ LOGP(DJOLLY, LOGL_DEBUG, "Creating 'JollyCom' instance for 'Kanal' = %s (sample rate %d).\n", kanal, samplerate);
dl_freq = dl_freq * 1e6 + step * 1e3 * (double)atoi(kanal);
ul_freq = ul_freq * 1e6 + step * 1e3 * (double)atoi(kanal);
@@ -228,25 +228,25 @@ int jolly_create(const char *kanal, double dl_freq, double ul_freq, double step,
/* init general part of transceiver */
rc = sender_create(&jolly->sender, kanal, dl_freq, ul_freq, 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_NONE);
if (rc < 0) {
- PDEBUG(DJOLLY, DEBUG_ERROR, "Failed to init 'Sender' processing!\n");
+ LOGP(DJOLLY, LOGL_ERROR, "Failed to init 'Sender' processing!\n");
goto error;
}
/* init audio processing */
rc = dsp_init_sender(jolly, nbfm, squelch_db, repeater);
if (rc < 0) {
- PDEBUG(DANETZ, DEBUG_ERROR, "Failed to init signal processing!\n");
+ LOGP(DANETZ, LOGL_ERROR, "Failed to init signal processing!\n");
goto error;
}
/* timers */
- timer_init(&jolly->timer, jolly_timeout, jolly);
- timer_init(&jolly->speech_timer, jolly_speech_timeout, jolly);
+ osmo_timer_setup(&jolly->timer, jolly_timeout, jolly);
+ osmo_timer_setup(&jolly->speech_timer, jolly_speech_timeout, jolly);
/* go into idle state */
jolly_go_idle(jolly);
- PDEBUG(DJOLLY, DEBUG_NOTICE, "Created 'Kanal' #%s\n", kanal);
+ LOGP(DJOLLY, LOGL_NOTICE, "Created 'Kanal' #%s\n", kanal);
return 0;
@@ -261,11 +261,11 @@ void jolly_destroy(sender_t *sender)
{
jolly_t *jolly = (jolly_t *) sender;
- PDEBUG(DJOLLY, DEBUG_DEBUG, "Destroying 'JollyCom' instance for 'Kanal' = %s.\n", sender->kanal);
+ LOGP(DJOLLY, LOGL_DEBUG, "Destroying 'JollyCom' instance for 'Kanal' = %s.\n", sender->kanal);
dsp_cleanup_sender(jolly);
- timer_exit(&jolly->timer);
- timer_exit(&jolly->speech_timer);
+ osmo_timer_del(&jolly->timer);
+ osmo_timer_del(&jolly->speech_timer);
sender_destroy(&jolly->sender);
free(sender);
}
@@ -273,11 +273,11 @@ void jolly_destroy(sender_t *sender)
/* Abort connection towards mobile station changing to IDLE state */
static void jolly_go_idle(jolly_t *jolly)
{
- timer_stop(&jolly->timer);
- timer_stop(&jolly->speech_timer);
+ osmo_timer_del(&jolly->timer);
+ osmo_timer_del(&jolly->speech_timer);
reset_speech_string(jolly);
- PDEBUG(DJOLLY, DEBUG_INFO, "Entering IDLE state on channel %s.\n", jolly->sender.kanal);
+ LOGP(DJOLLY, LOGL_INFO, "Entering IDLE state on channel %s.\n", jolly->sender.kanal);
jolly->dialing[0] = '\0';
jolly->station_id[0] = '\0'; /* remove station ID before state change, so status is shown correctly */
jolly_new_state(jolly, STATE_IDLE);
@@ -286,35 +286,35 @@ static void jolly_go_idle(jolly_t *jolly)
/* Release connection towards mobile station by sending idle tone for a while. */
static void jolly_release(jolly_t *jolly)
{
- timer_stop(&jolly->timer);
- timer_stop(&jolly->speech_timer);
+ osmo_timer_del(&jolly->timer);
+ osmo_timer_del(&jolly->speech_timer);
reset_speech_string(jolly);
- PDEBUG(DJOLLY, DEBUG_INFO, "Sending Release sequence on channel %s.\n", jolly->sender.kanal);
- timer_start(&jolly->speech_timer, SPEECH_DELAY_RELEASE);
+ LOGP(DJOLLY, LOGL_INFO, "Sending Release sequence on channel %s.\n", jolly->sender.kanal);
+ osmo_timer_schedule(&jolly->speech_timer, SPEECH_DELAY_RELEASE);
jolly_new_state(jolly, STATE_RELEASED);
}
/* Enter paging state and transmit 4 paging tones. */
static void jolly_page(jolly_t *jolly, const char *dial_string)
{
- PDEBUG_CHAN(DJOLLY, DEBUG_INFO, "Entering paging state, sending paging sequence to '%s'.\n", dial_string);
+ LOGP_CHAN(DJOLLY, LOGL_INFO, "Entering paging state, sending paging sequence to '%s'.\n", dial_string);
/* set station ID before state change, so status is shown correctly */
strncpy(jolly->station_id, dial_string, sizeof(jolly->station_id) - 1);
- timer_start(&jolly->timer, T_PAGING);
- timer_start(&jolly->speech_timer, SPEECH_DELAY_PAGING);
+ osmo_timer_schedule(&jolly->timer, T_PAGING);
+ osmo_timer_schedule(&jolly->speech_timer, SPEECH_DELAY_PAGING);
jolly_new_state(jolly, STATE_IN_PAGING);
}
void speech_finished(jolly_t *jolly)
{
- PDEBUG(DJOLLY, DEBUG_DEBUG, "speaking finished.\n");
+ LOGP(DJOLLY, LOGL_DEBUG, "speaking finished.\n");
switch (jolly->state) {
case STATE_OUT_VERIFY:
- timer_start(&jolly->timer, T_DIAL);
+ osmo_timer_schedule(&jolly->timer, T_DIAL);
break;
case STATE_IN_PAGING:
- timer_start(&jolly->speech_timer, SPEECH_DELAY_PAGING);
+ osmo_timer_schedule(&jolly->speech_timer, SPEECH_DELAY_PAGING);
break;
case STATE_RELEASED:
jolly_go_idle(jolly);
@@ -331,7 +331,7 @@ void jolly_receive_dtmf(void *priv, char digit, dtmf_meas_t *meas)
{
jolly_t *jolly = (jolly_t *) priv;
- PDEBUG_CHAN(DJOLLY, DEBUG_INFO, "Received dtmf digit '%c' frequency %.1f %.1f amplitude %.1f %.1f dB.\n",
+ LOGP_CHAN(DJOLLY, LOGL_INFO, "Received dtmf digit '%c' frequency %.1f %.1f amplitude %.1f %.1f dB.\n",
digit,
meas->frequency_low, meas->frequency_high,
level2db(meas->amplitude_low), level2db(meas->amplitude_high));
@@ -343,68 +343,68 @@ void jolly_receive_dtmf(void *priv, char digit, dtmf_meas_t *meas)
switch (jolly->state) {
case STATE_IDLE:
if (digit == '*') {
- PDEBUG_CHAN(DJOLLY, DEBUG_INFO, "Received start digit, entering dialing state.\n");
+ LOGP_CHAN(DJOLLY, LOGL_INFO, "Received start digit, entering dialing state.\n");
jolly->dialing[0] = '\0';
- timer_start(&jolly->timer, T_DIAL);
+ osmo_timer_schedule(&jolly->timer, T_DIAL);
jolly_new_state(jolly, STATE_OUT_DIALING);
break;
}
break;
case STATE_OUT_DIALING:
if (digit == '*') {
- PDEBUG_CHAN(DJOLLY, DEBUG_INFO, "Received start digit again, resetting dialing state.\n");
+ LOGP_CHAN(DJOLLY, LOGL_INFO, "Received start digit again, resetting dialing state.\n");
jolly->dialing[0] = '\0';
- timer_start(&jolly->timer, T_DIAL);
+ osmo_timer_schedule(&jolly->timer, T_DIAL);
break;
}
if (digit >= '0' && digit <= '9' && strlen(jolly->dialing) < sizeof(jolly->dialing) - 1) {
- PDEBUG_CHAN(DJOLLY, DEBUG_INFO, "Received dialed digit '%c'\n", digit);
+ LOGP_CHAN(DJOLLY, LOGL_INFO, "Received dialed digit '%c'\n", digit);
jolly->dialing[strlen(jolly->dialing) + 1] = '\0';
jolly->dialing[strlen(jolly->dialing)] = digit;
- timer_start(&jolly->timer, T_DIAL);
+ osmo_timer_schedule(&jolly->timer, T_DIAL);
break;
}
if (digit == '#') {
- timer_stop(&jolly->timer);
+ osmo_timer_del(&jolly->timer);
if (!jolly->dialing[0]) {
- PDEBUG_CHAN(DJOLLY, DEBUG_INFO, "Received stop digit but no dial string, entering idle state.\n");
+ LOGP_CHAN(DJOLLY, LOGL_INFO, "Received stop digit but no dial string, entering idle state.\n");
jolly_go_idle(jolly);
break;
}
- PDEBUG_CHAN(DJOLLY, DEBUG_INFO, "Received stop digit, entering verify state.\n");
- timer_start(&jolly->speech_timer, SPEECH_DELAY_VERIFY);
+ LOGP_CHAN(DJOLLY, LOGL_INFO, "Received stop digit, entering verify state.\n");
+ osmo_timer_schedule(&jolly->speech_timer, SPEECH_DELAY_VERIFY);
jolly_new_state(jolly, STATE_OUT_VERIFY);
break;
}
break;
case STATE_OUT_VERIFY:
if (digit == '*') {
- PDEBUG_CHAN(DJOLLY, DEBUG_INFO, "Received start digit, entering dialing state.\n");
+ LOGP_CHAN(DJOLLY, LOGL_INFO, "Received start digit, entering dialing state.\n");
reset_speech_string(jolly);
jolly->dialing[0] = '\0';
- timer_start(&jolly->timer, T_DIAL);
+ osmo_timer_schedule(&jolly->timer, T_DIAL);
jolly_new_state(jolly, STATE_OUT_DIALING);
break;
}
if (digit == '#') {
- PDEBUG_CHAN(DJOLLY, DEBUG_INFO, "Received ack digit, entering call state.\n");
- timer_stop(&jolly->timer);
+ LOGP_CHAN(DJOLLY, LOGL_INFO, "Received ack digit, entering call state.\n");
+ osmo_timer_del(&jolly->timer);
jolly->callref = call_up_setup(NULL, jolly->dialing, OSMO_CC_NETWORK_JOLLYCOM_NONE, "");
jolly_new_state(jolly, STATE_CALL);
}
break;
case STATE_CALL:
if (digit == '*') {
- PDEBUG_CHAN(DJOLLY, DEBUG_INFO, "Received start digit, entering call dialing state.\n");
+ LOGP_CHAN(DJOLLY, LOGL_INFO, "Received start digit, entering call dialing state.\n");
jolly->dialing[0] = '\0';
- timer_start(&jolly->timer, T_DIAL2);
+ osmo_timer_schedule(&jolly->timer, T_DIAL2);
jolly_new_state(jolly, STATE_CALL_DIALING);
break;
}
break;
case STATE_CALL_DIALING:
if (digit == '#') {
- PDEBUG_CHAN(DJOLLY, DEBUG_INFO, "Received stop digit, going idle.\n");
+ LOGP_CHAN(DJOLLY, LOGL_INFO, "Received stop digit, going idle.\n");
call_up_release(jolly->callref, CAUSE_NORMAL);
jolly->callref = 0;
jolly_release(jolly);
@@ -413,7 +413,7 @@ void jolly_receive_dtmf(void *priv, char digit, dtmf_meas_t *meas)
break;
case STATE_IN_PAGING:
if (digit == '#') {
- PDEBUG_CHAN(DJOLLY, DEBUG_INFO, "Received answer digit, entering call state.\n");
+ LOGP_CHAN(DJOLLY, LOGL_INFO, "Received answer digit, entering call state.\n");
call_up_answer(jolly->callref, jolly->station_id);
jolly_new_state(jolly, STATE_CALL);
break;
@@ -425,25 +425,25 @@ void jolly_receive_dtmf(void *priv, char digit, dtmf_meas_t *meas)
}
/* Timeout handling */
-static void jolly_timeout(struct timer *timer)
+static void jolly_timeout(void *data)
{
- jolly_t *jolly = (jolly_t *)timer->priv;
+ jolly_t *jolly = data;
switch (jolly->state) {
case STATE_OUT_DIALING:
- PDEBUG_CHAN(DJOLLY, DEBUG_NOTICE, "Timeout while dialing, going idle.\n");
+ LOGP_CHAN(DJOLLY, LOGL_NOTICE, "Timeout while dialing, going idle.\n");
jolly_go_idle(jolly);
break;
case STATE_OUT_VERIFY:
- PDEBUG_CHAN(DJOLLY, DEBUG_NOTICE, "Timeout while verifying, going idle.\n");
+ LOGP_CHAN(DJOLLY, LOGL_NOTICE, "Timeout while verifying, going idle.\n");
jolly_go_idle(jolly);
break;
case STATE_CALL_DIALING:
- PDEBUG_CHAN(DJOLLY, DEBUG_NOTICE, "Timeout while dialing during call.\n");
+ LOGP_CHAN(DJOLLY, LOGL_NOTICE, "Timeout while dialing during call.\n");
jolly_new_state(jolly, STATE_CALL);
break;
case STATE_IN_PAGING:
- PDEBUG_CHAN(DJOLLY, DEBUG_NOTICE, "Timeout while paging, going idle.\n");
+ LOGP_CHAN(DJOLLY, LOGL_NOTICE, "Timeout while paging, going idle.\n");
call_up_release(jolly->callref, CAUSE_NOANSWER);
jolly->callref = 0;
jolly_go_idle(jolly);
@@ -453,21 +453,21 @@ static void jolly_timeout(struct timer *timer)
}
}
-static void jolly_speech_timeout(struct timer *timer)
+static void jolly_speech_timeout(void *data)
{
- jolly_t *jolly = (jolly_t *)timer->priv;
+ jolly_t *jolly = data;
switch (jolly->state) {
case STATE_OUT_VERIFY:
- PDEBUG_CHAN(DJOLLY, DEBUG_DEBUG, "Start verifying speech.\n");
+ LOGP_CHAN(DJOLLY, LOGL_DEBUG, "Start verifying speech.\n");
set_speech_string(jolly, 'o', jolly->dialing);
break;
case STATE_IN_PAGING:
- PDEBUG_CHAN(DJOLLY, DEBUG_DEBUG, "Start paging speech.\n");
+ LOGP_CHAN(DJOLLY, LOGL_DEBUG, "Start paging speech.\n");
set_speech_string(jolly, 'i', jolly->station_id);
break;
case STATE_RELEASED:
- PDEBUG_CHAN(DJOLLY, DEBUG_DEBUG, "Start release speech.\n");
+ LOGP_CHAN(DJOLLY, LOGL_DEBUG, "Start release speech.\n");
set_speech_string(jolly, 'r', "");
default:
break;
@@ -487,7 +487,7 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
break;
}
if (sender) {
- PDEBUG(DJOLLY, DEBUG_NOTICE, "Outgoing call to busy number, rejecting!\n");
+ LOGP(DJOLLY, LOGL_NOTICE, "Outgoing call to busy number, rejecting!\n");
return -CAUSE_BUSY;
}
@@ -498,11 +498,11 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
break;
}
if (!sender) {
- PDEBUG(DJOLLY, DEBUG_NOTICE, "Outgoing call, but no free channel, rejecting!\n");
+ LOGP(DJOLLY, LOGL_NOTICE, "Outgoing call, but no free channel, rejecting!\n");
return -CAUSE_NOCHANNEL;
}
- PDEBUG_CHAN(DJOLLY, DEBUG_INFO, "Call to mobile station.\n");
+ LOGP_CHAN(DJOLLY, LOGL_INFO, "Call to mobile station.\n");
/* 3. trying to page mobile station */
jolly->callref = callref;
@@ -513,7 +513,7 @@ 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 __attribute__((unused)) callref, struct timeval __attribute__((unused)) *tv_meter)
{
}
@@ -526,7 +526,7 @@ void call_down_disconnect(int callref, int cause)
sender_t *sender;
jolly_t *jolly;
- PDEBUG(DJOLLY, DEBUG_INFO, "Call has been disconnected by network.\n");
+ LOGP(DJOLLY, LOGL_INFO, "Call has been disconnected by network.\n");
for (sender = sender_head; sender; sender = sender->next) {
jolly = (jolly_t *) sender;
@@ -534,7 +534,7 @@ void call_down_disconnect(int callref, int cause)
break;
}
if (!sender) {
- PDEBUG(DJOLLY, DEBUG_NOTICE, "Outgoing disconnect, but no callref!\n");
+ LOGP(DJOLLY, LOGL_NOTICE, "Outgoing disconnect, but no callref!\n");
call_up_release(callref, CAUSE_INVALCALLREF);
return;
}
@@ -544,7 +544,7 @@ void call_down_disconnect(int callref, int cause)
return;
switch (jolly->state) {
case STATE_IN_PAGING:
- PDEBUG_CHAN(DJOLLY, DEBUG_NOTICE, "Outgoing disconnect, during paging, releaseing.\n");
+ LOGP_CHAN(DJOLLY, LOGL_NOTICE, "Outgoing disconnect, during paging, releaseing.\n");
jolly_go_idle(jolly);
break;
default:
@@ -563,7 +563,7 @@ void call_down_release(int callref, __attribute__((unused)) int cause)
sender_t *sender;
jolly_t *jolly;
- PDEBUG(DJOLLY, DEBUG_INFO, "Call has been released by network, releasing call.\n");
+ LOGP(DJOLLY, LOGL_INFO, "Call has been released by network, releasing call.\n");
for (sender = sender_head; sender; sender = sender->next) {
jolly = (jolly_t *) sender;
@@ -571,7 +571,7 @@ void call_down_release(int callref, __attribute__((unused)) int cause)
break;
}
if (!sender) {
- PDEBUG(DJOLLY, DEBUG_NOTICE, "Outgoing release, but no callref!\n");
+ LOGP(DJOLLY, LOGL_NOTICE, "Outgoing release, but no callref!\n");
/* don't send release, because caller already released */
return;
}
@@ -581,11 +581,11 @@ void call_down_release(int callref, __attribute__((unused)) int cause)
switch (jolly->state) {
case STATE_CALL:
case STATE_CALL_DIALING:
- PDEBUG_CHAN(DJOLLY, DEBUG_NOTICE, "Outgoing release, during call, releasing\n");
+ LOGP_CHAN(DJOLLY, LOGL_NOTICE, "Outgoing release, during call, releasing\n");
jolly_release(jolly);
break;
case STATE_IN_PAGING:
- PDEBUG_CHAN(DJOLLY, DEBUG_NOTICE, "Outgoing release, during paging, releaseing.\n");
+ LOGP_CHAN(DJOLLY, LOGL_NOTICE, "Outgoing release, during paging, releaseing.\n");
jolly_go_idle(jolly);
break;
default:
@@ -593,25 +593,5 @@ void call_down_release(int callref, __attribute__((unused)) int 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;
- jolly_t *jolly;
-
- for (sender = sender_head; sender; sender = sender->next) {
- jolly = (jolly_t *) sender;
- if (jolly->callref == callref)
- break;
- }
- if (!sender)
- return;
-
- if (jolly->state == STATE_CALL || jolly->state == STATE_CALL_DIALING)
- jitter_save(&jolly->sender.dejitter, samples, count, 1, sequence, timestamp, ssrc);
-}
-
-void call_down_clock(void) {}
-
void dump_info(void) {}
diff --git a/src/jolly/jolly.h b/src/jolly/jolly.h
index 226cb61..e52a9d7 100644
--- a/src/jolly/jolly.h
+++ b/src/jolly/jolly.h
@@ -21,7 +21,7 @@ typedef struct jolly {
int callref; /* call reference */
char station_id[32]; /* current station ID */
char dialing[32]; /* dial string */
- struct timer timer;
+ struct osmo_timer_list timer;
/* display measurements */
dispmeasparam_t *dmp_dtmf_low;
@@ -30,6 +30,8 @@ typedef struct jolly {
/* dsp states */
int repeater; /* mix audio of RX signal to TX signal */
jitter_t repeater_dejitter; /* forwarding audio */
+ uint16_t repeater_sequence; /* sequence & ts for jitter buffer */
+ uint32_t repeater_timestamp;
int repeater_count; /* counter to count down repeater's "transmitter on" */
int repeater_max; /* duration in samples */
squelch_t squelch; /* squelch detection process */
@@ -41,7 +43,7 @@ typedef struct jolly {
double ack_phase65536; /* current phase */
int ack_count; /* counter to count down while playing ack tone */
int ack_max; /* duration in samples */
- struct timer speech_timer;
+ struct osmo_timer_list speech_timer;
char speech_string[40]; /* speech string */
int speech_digit; /* counts digits */
int speech_pos; /* counts samples */
diff --git a/src/jolly/main.c b/src/jolly/main.c
index 254337b..e8285cf 100644
--- a/src/jolly/main.c
+++ b/src/jolly/main.c
@@ -29,8 +29,8 @@
#include <sys/stat.h>
#include "../libsample/sample.h"
#include "../libmobile/main_mobile.h"
-#include "../libdebug/debug.h"
-#include "../libtimer/timer.h"
+#include "../liblogging/logging.h"
+#include <osmocom/core/timer.h>
#include "../anetz/freiton.h"
#include "../anetz/besetztton.h"
#include "../liboptions/options.h"
@@ -51,7 +51,7 @@ const char *aaimage[] = { NULL };
void print_help(const char *arg0)
{
- main_mobile_print_help(arg0, "[-F <downlink MHz>,<uplink MHz>] ");
+ main_mobile_print_help(arg0, "[-F <downlink MHz>,<uplink MHz>,<step KHz>] ");
/* - - */
printf(" -F --frequency <downlink MHz>,<uplink MHz>,<step KHz>\n");
printf(" Downlink and uplink frequency to use for channel 0.\n");
@@ -210,6 +210,7 @@ fail:
jolly_destroy(sender_head);
/* exits */
+ main_mobile_exit();
fm_exit();
options_free();
diff --git a/src/jolly/voice.c b/src/jolly/voice.c
index e24e0b5..a3139bb 100644
--- a/src/jolly/voice.c
+++ b/src/jolly/voice.c
@@ -11065,15 +11065,11 @@ static int16_t released[] = {
jolly_voice_t jolly_voice;
-#define CHUNK 8
#define GAIN 2.5
int init_voice(int samplerate)
{
- samplerate_t srstate;
- sample_t spl_in[CHUNK], *spl_out;
- int i, s, j, chunk, count, output_num;
- int rc;
+ int i;
jolly_voice.spl[0] = (sample_t *)digit_0;
jolly_voice.size[0] = sizeof(digit_0) / sizeof(int16_t);
@@ -11102,27 +11098,25 @@ int init_voice(int samplerate)
jolly_voice.spl[12] = (sample_t *)released;
jolly_voice.size[12] = sizeof(released) / sizeof(int16_t);
- rc = init_samplerate(&srstate, 8000.0, (double)samplerate, 3300.0);
- if (rc < 0) {
- fprintf(stderr, "Failed to init sample rate conversion!\n");
- return -1;
- }
-
for (i = 0; i < 13; i++) {
+ samplerate_t srstate;
+ sample_t spl_in[jolly_voice.size[i]], *spl_out;
+ int s, output_num;
+ int rc;
+
+ rc = init_samplerate(&srstate, 8000.0, (double)samplerate, 3300.0);
+ if (rc < 0) {
+ fprintf(stderr, "Failed to init sample rate conversion!\n");
+ return -1;
+ }
+
output_num = samplerate_upsample_output_num(&srstate, jolly_voice.size[i]);
spl_out = calloc(output_num, sizeof(*spl_out));
- count = 0;
- for (s = 0; s < jolly_voice.size[i]; s += CHUNK) {
- chunk = jolly_voice.size[i] - s;
- if (chunk > CHUNK)
- chunk = CHUNK;
- for (j = 0; j < chunk; j++)
- spl_in[j] = (double)(((int16_t *)(jolly_voice.spl[i]))[s + j]) / 32767.0 * GAIN;
- samplerate_upsample(&srstate, spl_in, chunk, spl_out + count, output_num);
- count += output_num;
- }
+ for (s = 0; s < jolly_voice.size[i]; s ++)
+ spl_in[s] = (double)(((int16_t *)(jolly_voice.spl[i]))[s]) / 32767.0 * GAIN;
+ samplerate_upsample(&srstate, spl_in, jolly_voice.size[i], spl_out, output_num);
jolly_voice.spl[i] = spl_out;
- jolly_voice.size[i] = count;
+ jolly_voice.size[i] = output_num;
}
return 0;
diff --git a/src/libaaimage/Makefile.am b/src/libaaimage/Makefile.am
index 80122aa..bac897c 100644
--- a/src/libaaimage/Makefile.am
+++ b/src/libaaimage/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
noinst_LIBRARIES = libaaimage.a
diff --git a/src/libam/Makefile.am b/src/libam/Makefile.am
index a139c71..4954729 100644
--- a/src/libam/Makefile.am
+++ b/src/libam/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
noinst_LIBRARIES = libam.a
diff --git a/src/libam/am.c b/src/libam/am.c
index 7194b49..e09f7f2 100644
--- a/src/libam/am.c
+++ b/src/libam/am.c
@@ -127,7 +127,7 @@ void am_modulate_complex(am_mod_t *mod, sample_t *amplitude, uint8_t *power, int
mod->phase = phase;
}
-/* init AM demodulator */
+/* init AM demodulator, the bandwidth is the demodulated bandwidth (bandwidth of one side band) */
int am_demod_init(am_demod_t *demod, double samplerate, double offset, double bandwidth, double gain)
{
memset(demod, 0, sizeof(*demod));
diff --git a/src/libclipper/Makefile.am b/src/libclipper/Makefile.am
index 76de4b3..f25df99 100644
--- a/src/libclipper/Makefile.am
+++ b/src/libclipper/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
noinst_LIBRARIES = libclipper.a
diff --git a/src/libcompandor/Makefile.am b/src/libcompandor/Makefile.am
index 4c70a7e..984f2f6 100644
--- a/src/libcompandor/Makefile.am
+++ b/src/libcompandor/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
noinst_LIBRARIES = libcompandor.a
diff --git a/src/libcompandor/compandor.c b/src/libcompandor/compandor.c
index b06602e..1b0797c 100644
--- a/src/libcompandor/compandor.c
+++ b/src/libcompandor/compandor.c
@@ -19,6 +19,7 @@
#include <stdio.h>
#include <stdint.h>
+#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "../libsample/sample.h"
@@ -39,6 +40,7 @@
#define ENVELOPE_MAX 9.990
static double sqrt_tab[10000];
+static int compandor_initalized = 0;
/*
* Init compandor according to ITU-T G.162 specification
@@ -46,10 +48,24 @@ static double sqrt_tab[10000];
* Hopefully this is correct
*
*/
-void init_compandor(compandor_t *state, double samplerate, double attack_ms, double recovery_ms)
+
+void compandor_init(void)
{
int i;
+ // FIXME: make global, not at instance
+ for (i = 0; i < 10000; i++)
+ sqrt_tab[i] = sqrt(i * 0.001);
+ compandor_initalized = 1;
+}
+
+void setup_compandor(compandor_t *state, double samplerate, double attack_ms, double recovery_ms)
+{
+ if (!compandor_initalized) {
+ fprintf(stderr, "Compandor nicht initialized.\n");
+ abort();
+ }
+
memset(state, 0, sizeof(*state));
state->c.peak = 1.0;
@@ -60,10 +76,6 @@ void init_compandor(compandor_t *state, double samplerate, double attack_ms, dou
state->c.step_down = pow(COMPRESS_RECOVERY_FACTOR, 1000.0 / recovery_ms / samplerate);
state->e.step_up = pow(EXPAND_ATTACK_FACTOR, 1000.0 / attack_ms / samplerate);
state->e.step_down = pow(EXPAND_RECOVERY_FACTOR, 1000.0 / recovery_ms / samplerate);
-
- // FIXME: make global, not at instance
- for (i = 0; i < 10000; i++)
- sqrt_tab[i] = sqrt(i * 0.001);
}
void compress_audio(compandor_t *state, sample_t *samples, int num)
diff --git a/src/libcompandor/compandor.h b/src/libcompandor/compandor.h
index e912609..df8e020 100644
--- a/src/libcompandor/compandor.h
+++ b/src/libcompandor/compandor.h
@@ -14,7 +14,8 @@ typedef struct compandor {
} e;
} compandor_t;
-void init_compandor(compandor_t *state, double samplerate, double attack_ms, double recovery_ms);
+void compandor_init(void);
+void setup_compandor(compandor_t *state, double samplerate, double attack_ms, double recovery_ms);
void compress_audio(compandor_t *state, sample_t *samples, int num);
void expand_audio(compandor_t *state, sample_t *samples, int num);
diff --git a/src/libdebug/Makefile.am b/src/libdebug/Makefile.am
deleted file mode 100644
index 210a097..0000000
--- a/src/libdebug/Makefile.am
+++ /dev/null
@@ -1,7 +0,0 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
-
-noinst_LIBRARIES = libdebug.a
-
-libdebug_a_SOURCES = \
- debug.c
-
diff --git a/src/libdebug/debug.c b/src/libdebug/debug.c
deleted file mode 100755
index f7b91e0..0000000
--- a/src/libdebug/debug.c
+++ /dev/null
@@ -1,330 +0,0 @@
-/* Simple debug functions for level and category filtering
- *
- * (C) 2016 by Andreas Eversberg <jolly@eversberg.eu>
- * All Rights Reserved
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <stdarg.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <errno.h>
-#include <math.h>
-#include <time.h>
-#include <pthread.h>
-#include <sys/ioctl.h>
-#include <sys/time.h>
-#include "debug.h"
-
-const char *debug_level[] = {
- "debug ",
- "info ",
- "notice ",
- "error ",
- NULL,
-};
-
-struct debug_cat {
- const char *name;
- const char *color;
-} debug_cat[] = {
- { "options", "\033[0;33m" },
- { "sender", "\033[1;33m" },
- { "sound", "\033[0;35m" },
- { "dsp", "\033[0;31m" },
- { "anetz", "\033[1;34m" },
- { "bnetz", "\033[1;34m" },
- { "cnetz", "\033[1;34m" },
- { "nmt", "\033[1;34m" },
- { "amps", "\033[1;34m" },
- { "r2000", "\033[1;34m" },
- { "imts", "\033[1;34m" },
- { "mpt1327", "\033[1;34m" },
- { "jollycom", "\033[1;34m" },
- { "eurosignal", "\033[1;34m" },
- { "pocsag", "\033[1;34m" },
- { "golay", "\033[1;34m" },
- { "5-ton-folge", "\033[1;34m" },
- { "frame", "\033[0;36m" },
- { "call", "\033[0;37m" },
- { "cc", "\033[1;32m" },
- { "database", "\033[0;33m" },
- { "transaction", "\033[0;32m" },
- { "dms", "\033[0;33m" },
- { "sms", "\033[1;37m" },
- { "sdr", "\033[1;31m" },
- { "uhd", "\033[1;35m" },
- { "soapy", "\033[1;35m" },
- { "wave", "\033[1;33m" },
- { "radio", "\033[1;34m" },
- { "am791x", "\033[0;31m" },
- { "uart", "\033[0;32m" },
- { "device", "\033[0;33m" },
- { "datenklo", "\033[1;34m" },
- { "zeit", "\033[1;34m" },
- { "sim layer 1", "\033[0;31m" },
- { "sim layer 2", "\033[0;33m" },
- { "sim ICL layer", "\033[0;36m" },
- { "sim layer 7", "\033[0;37m" },
- { "mtp layer 2", "\033[1;33m" },
- { "mtp layer 3", "\033[1;36m" },
- { "MuP", "\033[1;37m" },
- { "router", "\033[1;35m" },
- { "stderr", "\033[1;37m" },
- { "ss5", "\033[1;34m" },
- { "isdn", "\033[1;35m" },
- { "misdn", "\033[0;34m" },
- { "dss1", "\033[1;34m" },
- { "sip", "\033[1;35m" },
- { "telephone", "\033[1;34m" },
- { "uk0", "\033[1;34m" },
- { "ph", "\033[0;33m" },
- { "dcf77", "\033[1;34m" },
- { "jitter", "\033[0;36m" },
- { NULL, NULL }
-};
-
-int debuglevel = DEBUG_INFO;
-int debug_date = 0;
-uint64_t debug_mask[2] = { ~0, ~0 };
-extern int num_kanal;
-
-void (*clear_console_text)(void) = NULL;
-void (*print_console_text)(void) = NULL;
-
-int debug_limit_scroll = 0;
-
-static int lock_initialized = 0;
-static pthread_mutex_t debug_mutex;
-
-void lock_debug(void)
-{
- int rc;
-
- if (!lock_initialized) {
- rc = pthread_mutex_init(&debug_mutex, NULL);
- if (rc == 0)
- lock_initialized = 1;
- }
- if (lock_initialized)
- pthread_mutex_lock(&debug_mutex);
-}
-
-void unlock_debug(void)
-{
- if (lock_initialized)
- pthread_mutex_unlock(&debug_mutex);
-}
-
-void get_win_size(int *w, int *h)
-{
- struct winsize win;
- int rc;
-
- rc = ioctl(0, TIOCGWINSZ, &win);
- if (rc) {
- *w = 80;
- *h = 25;
- return;
- }
-
- *h = win.ws_row;
- *w = win.ws_col;
-}
-
-void _printdebug(const char *file, const char __attribute__((unused)) *function, int line, int cat, int level, const char *kanal, const char *fmt, ...)
-{
- char buffer[4096], *b = buffer;
- int s = sizeof(buffer) - 1;
- const char *p;
- va_list args;
- int w, h = 0; // make GCC happy
-
- if (debuglevel > level)
- return;
-
- if (!(debug_mask[cat >> 6] & ((uint64_t)1 << (cat & 63))))
- return;
-
- lock_debug();
-
- buffer[sizeof(buffer) - 1] = '\0';
-
- /* if kanal is used, prefix the channel number */
- if (num_kanal > 1 && kanal) {
- sprintf(buffer, "(chan %s) ", kanal);
- b = strchr(buffer, '\0');
- s -= strlen(buffer);
- }
-
- va_start(args, fmt);
- vsnprintf(b, s, fmt, args);
- va_end(args);
-
- while ((p = strchr(file, '/')))
- file = p + 1;
- if (clear_console_text)
- clear_console_text();
- if (debug_limit_scroll) {
- get_win_size(&w, &h);
- printf("\0337\033[%d;%dr\0338", debug_limit_scroll + 1, h);
- }
- if (debug_date) {
- struct timeval tv;
- struct tm *tm;
-
- gettimeofday(&tv, NULL);
- tm = localtime(&tv.tv_sec);
-
- printf("%04d-%02d-%02d %02d:%02d:%02d.%03d ", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, (int)(tv.tv_usec / 10000.0));
- }
- printf("%s%s %4d %s-%s: %s\033[0;39m", debug_cat[cat].color, file, line, debug_cat[cat].name, debug_level[level], buffer);
- if (debug_limit_scroll)
- printf("\0337\033[%d;%dr\0338", 1, h);
- if (print_console_text)
- print_console_text();
- fflush(stdout);
-
- unlock_debug();
-}
-
-const char *debug_amplitude(double level)
-{
- static char text[42];
-
- strcpy(text, " : ");
- if (level > 1.0)
- level = 1.0;
- if (level < -1.0)
- level = -1.0;
- text[20 + (int)(level * 20)] = '*';
-
- return text;
-}
-
-#define level2db(level) (20 * log10(level))
-
-const char *debug_db(double level_db)
-{
- static char text[128];
- int l;
-
- strcpy(text, ": . : . : . : . : . : . : . : . | . : . : . : . : . : . : . : . :");
- if (level_db <= 0.0)
- return text;
- l = (int)round(level2db(level_db));
- if (l > 48)
- return text;
- if (l < -48)
- return text;
- text[l + 48] = '*';
-
- return text;
-}
-
-void debug_print_help(void)
-{
- printf(" -v --verbose <level> | <level>,<category>[,<category>[,...]] | list\n");
- printf(" Use 'list' to get a list of all levels and categories\n");
- printf(" Verbose level: digit of debug level (default = '%d')\n", debuglevel);
- printf(" Verbose level+category: level digit followed by one or more categories\n");
- printf(" -> If no category is specified, all categories are selected\n");
- printf(" -v --verbose date\n");
- printf(" Show date with debug output\n");
-}
-
-void debug_list_cat(void)
-{
- int i;
-
- printf("Give number of debug level:\n");
- for (i = 0; debug_level[i]; i++)
- printf(" %d = %s\n", i, debug_level[i]);
- printf("\n");
-
- printf("Give name(s) of debug category:\n");
- for (i = 0; debug_cat[i].name; i++)
- printf(" %s%s\033[0;39m\n", debug_cat[i].color, debug_cat[i].name);
- printf("\n");
-}
-
-int parse_debug_opt(const char *optarg)
-{
- int i, max_level = 0;
- char *dup, *dstring, *p;
-
- if (!strcasecmp(optarg, "date")) {
- debug_date = 1;
- return 0;
- }
-
- for (i = 0; debug_level[i]; i++)
- max_level = i;
-
- dup = dstring = strdup(optarg);
- p = strsep(&dstring, ",");
- for (i = 0; i < p[i]; i++) {
- if (p[i] < '0' || p[i] > '9') {
- fprintf(stderr, "Only digits are allowed for debug level!\n");
- free(dup);
- return -EINVAL;
- }
- }
- debuglevel = atoi(p);
- if (debuglevel > max_level) {
- fprintf(stderr, "Debug level too high, use 'list' to show available levels!\n");
- free(dup);
- return -EINVAL;
- }
- if (dstring)
- memset(debug_mask, 0, sizeof(debug_mask));
- while((p = strsep(&dstring, ","))) {
- for (i = 0; debug_cat[i].name; i++) {
- if (!strcasecmp(p, debug_cat[i].name))
- break;
- }
- if (!debug_cat[i].name) {
- fprintf(stderr, "Given debug category '%s' unknown, use 'list' to show available categories!\n", p);
- free(dup);
- return -EINVAL;
- }
- debug_mask[i >> 6] |= ((uint64_t)1 << (i & 63));
- }
-
- free(dup);
- return 0;
-}
-
-const char *debug_hex(const uint8_t *data, int len)
-{
- static char *text = NULL;
- char *p;
- int i;
-
- if (text)
- free(text);
- p = text = calloc(1, len * 3 + 1);
- for (i = 0; i < len; i++) {
- sprintf(p, "%02x ", *data++);
- p += 3;
- }
- if (text[0])
- p[-1] = '\0';
-
- return text;
-}
-
diff --git a/src/libdebug/debug.h b/src/libdebug/debug.h
deleted file mode 100644
index 5942651..0000000
--- a/src/libdebug/debug.h
+++ /dev/null
@@ -1,86 +0,0 @@
-
-#define DEBUG_DEBUG 0 /* debug info, not for normal use */
-#define DEBUG_INFO 1 /* all info about process */
-#define DEBUG_NOTICE 2 /* something unexpected happens */
-#define DEBUG_ERROR 3 /* there is an error with this software */
-
-#define DOPTIONS 0
-#define DSENDER 1
-#define DSOUND 2
-#define DDSP 3
-#define DANETZ 4
-#define DBNETZ 5
-#define DCNETZ 6
-#define DNMT 7
-#define DAMPS 8
-#define DR2000 9
-#define DIMTS 10
-#define DMPT1327 11
-#define DJOLLY 12
-#define DEURO 13
-#define DPOCSAG 14
-#define DGOLAY 15
-#define DFUENF 16
-#define DFRAME 17
-#define DCALL 18
-#define DCC 19
-#define DDB 20
-#define DTRANS 21
-#define DDMS 22
-#define DSMS 23
-#define DSDR 24
-#define DUHD 25
-#define DSOAPY 26
-#define DWAVE 27
-#define DRADIO 28
-#define DAM791X 29
-#define DUART 30
-#define DDEVICE 31
-#define DDATENKLO 32
-#define DZEIT 33
-#define DSIM1 34
-#define DSIM2 35
-#define DSIMI 36
-#define DSIM7 37
-#define DMTP2 38
-#define DMTP3 39
-#define DMUP 40
-#define DROUTER 41
-#define DSTDERR 42
-#define DSS5 43
-#define DISDN 44
-#define DMISDN 45
-#define DDSS1 46
-#define DSIP 47
-#define DTEL 48
-#define DUK0 49
-#define DPH 50
-#define DDCF77 51
-#define DJITTER 52
-//NOTE: increment mask array, if 127 is exceeded
-
-void lock_debug(void);
-void unlock_debug(void);
-
-void get_win_size(int *w, int *h);
-
-#define PDEBUG(cat, level, fmt, arg...) _printdebug(__FILE__, __FUNCTION__, __LINE__, cat, level, NULL, fmt, ## arg)
-#define PDEBUG_CHAN(cat, level, fmt, arg...) _printdebug(__FILE__, __FUNCTION__, __LINE__, cat, level, CHAN, fmt, ## arg)
-void _printdebug(const char *file, const char *function, int line, int cat, int level, const char *chan_str, const char *fmt, ...) __attribute__ ((__format__ (__printf__, 7, 8)));
-
-const char *debug_amplitude(double level);
-const char *debug_db(double level_db);
-
-void debug_print_help(void);
-void debug_list_cat(void);
-int parse_debug_opt(const char *opt);
-
-extern int debuglevel;
-
-extern void (*clear_console_text)(void);
-extern void (*print_console_text)(void);
-
-extern int debug_limit_scroll;
-
-const char *debug_hex(const uint8_t *data, int len);
-
diff --git a/src/libdisplay/Makefile.am b/src/libdisplay/Makefile.am
index 8f6097d..9443600 100644
--- a/src/libdisplay/Makefile.am
+++ b/src/libdisplay/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
noinst_LIBRARIES = libdisplay.a
diff --git a/src/libdisplay/display_iq.c b/src/libdisplay/display_iq.c
index 83cec6e..7e9e74c 100644
--- a/src/libdisplay/display_iq.c
+++ b/src/libdisplay/display_iq.c
@@ -24,7 +24,7 @@
#include <pthread.h>
#include <stdlib.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../libdisplay/display.h"
/* must be odd value! */
@@ -60,14 +60,16 @@ void display_iq_on(int on)
if (iq_on) {
memset(&screen, ' ', sizeof(screen));
memset(&screen_history, 0, sizeof(screen_history));
- lock_debug();
+ lock_logging();
+ enable_limit_scroll(false);
printf("\0337\033[H");
for (j = 0; j < SIZE; j++) {
screen[j][w] = '\0';
puts(screen[j]);
}
printf("\0338"); fflush(stdout);
- unlock_debug();
+ enable_limit_scroll(true);
+ unlock_logging();
}
if (on < 0) {
@@ -77,9 +79,9 @@ void display_iq_on(int on)
iq_on = on;
if (iq_on)
- debug_limit_scroll = SIZE;
+ logging_limit_scroll_top(SIZE);
else
- debug_limit_scroll = 0;
+ logging_limit_scroll_top(0);
}
/*
@@ -116,8 +118,6 @@ void display_iq(float *samples, int length)
if (!iq_on)
return;
- lock_debug();
-
get_win_size(&width, &h);
if (width > MAX_DISPLAY_WIDTH - 1)
width = MAX_DISPLAY_WIDTH - 1;
@@ -235,6 +235,8 @@ cont:
else
sprintf(screen[0], "(IQ log %.0f dB", db);
*strchr(screen[0], '\0') = ')';
+ lock_logging();
+ enable_limit_scroll(false);
printf("\0337\033[H");
for (j = 0; j < SIZE; j++) {
for (k = 0; k < width; k++) {
@@ -271,12 +273,12 @@ cont:
}
/* reset color and position */
printf("\033[0;39m\0338"); fflush(stdout);
+ enable_limit_scroll(true);
+ unlock_logging();
}
}
disp.interval_pos = pos;
-
- unlock_debug();
}
diff --git a/src/libdisplay/display_measurements.c b/src/libdisplay/display_measurements.c
index e2c2f0f..e4fc040 100644
--- a/src/libdisplay/display_measurements.c
+++ b/src/libdisplay/display_measurements.c
@@ -24,8 +24,9 @@
#include <pthread.h>
#include <sys/ioctl.h>
#include <math.h>
+#include <sys/param.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../libdisplay/display.h"
#define MAX_NAME_LEN 16
@@ -110,10 +111,10 @@ static void print_measurements(int on)
if (bar_width < 1)
return;
- lock_debug();
-
lines_total = 0;
color = -1;
+ lock_logging();
+ enable_limit_scroll(false);
printf("\0337\033[H");
for (disp = meas_head; disp; disp = disp->next) {
memset(line, ' ', width);
@@ -246,16 +247,16 @@ static void print_measurements(int on)
memset(line_color + width - MAX_UNIT_LEN, 4, MAX_UNIT_LEN); /* blue */
else
memset(line_color + width - MAX_UNIT_LEN, 3, MAX_UNIT_LEN); /* yellow */
- strncpy(line + width - MAX_UNIT_LEN + 1, text, (strlen(text) < MAX_UNIT_LEN) ? strlen(text) : MAX_UNIT_LEN);
+ memcpy(line + width - MAX_UNIT_LEN + 1, text, MIN(strlen(text), MAX_UNIT_LEN - 1));
display_line(on, width);
}
}
/* reset color and position */
printf("\033[0;39m\0338"); fflush(stdout);
-
- debug_limit_scroll = lines_total;
-
- unlock_debug();
+ enable_limit_scroll(true);
+ unlock_logging();
+ /* Set new limit. */
+ logging_limit_scroll_top(lines_total);
}
void display_measurements_on(int on)
@@ -268,7 +269,7 @@ void display_measurements_on(int on)
else
measurements_on = on;
- debug_limit_scroll = 0;
+ logging_limit_scroll_top(0);
}
/* add new parameter on startup to the list of measurements */
diff --git a/src/libdisplay/display_spectrum.c b/src/libdisplay/display_spectrum.c
index b0f30f4..efd3be9 100644
--- a/src/libdisplay/display_spectrum.c
+++ b/src/libdisplay/display_spectrum.c
@@ -24,7 +24,7 @@
#include <math.h>
#include "../libsample/sample.h"
#include "../libfft/fft.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../libdisplay/display.h"
#define HEIGHT 20
@@ -101,14 +101,16 @@ void display_spectrum_on(int on)
if (spectrum_on) {
memset(&screen, ' ', sizeof(screen));
memset(&buffer_hold, 0, sizeof(buffer_hold));
- lock_debug();
+ lock_logging();
+ enable_limit_scroll(false);
printf("\0337\033[H");
for (j = 0; j < HEIGHT; j++) {
screen[j][w] = '\0';
puts(screen[j]);
}
printf("\0338"); fflush(stdout);
- unlock_debug();
+ enable_limit_scroll(true);
+ unlock_logging();
}
if (on < 0) {
@@ -118,9 +120,9 @@ void display_spectrum_on(int on)
spectrum_on = on;
if (spectrum_on)
- debug_limit_scroll = HEIGHT;
+ logging_limit_scroll_top(HEIGHT);
else
- debug_limit_scroll = 0;
+ logging_limit_scroll_top(0);
}
/*
@@ -142,8 +144,6 @@ void display_spectrum(float *samples, int length)
if (!spectrum_on)
return;
- lock_debug();
-
get_win_size(&width, &h);
if (width > MAX_DISPLAY_WIDTH - 1)
width = MAX_DISPLAY_WIDTH - 1;
@@ -390,6 +390,8 @@ void display_spectrum(float *samples, int length)
screen_color[0][j-1] = 7;
screen_color[0][j+1] = 7;
/* display buffer */
+ lock_logging();
+ enable_limit_scroll(false);
printf("\0337\033[H");
for (j = 0; j < HEIGHT; j++) {
for (k = 0; k < width; k++) {
@@ -403,12 +405,11 @@ void display_spectrum(float *samples, int length)
}
/* reset color and position */
printf("\033[0;39m\0338"); fflush(stdout);
+ enable_limit_scroll(true);
+ unlock_logging();
}
}
disp.interval_pos = pos;
-
- unlock_debug();
}
-
diff --git a/src/libdisplay/display_status.c b/src/libdisplay/display_status.c
index de38c9e..400e3e9 100644
--- a/src/libdisplay/display_status.c
+++ b/src/libdisplay/display_status.c
@@ -23,7 +23,7 @@
#include <pthread.h>
#include <sys/ioctl.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../libdisplay/display.h"
static int status_on = 0;
@@ -46,7 +46,8 @@ static void print_status(int on)
if (h > lines_total)
h = lines_total;
- lock_debug();
+ lock_logging();
+ enable_limit_scroll(false);
printf("\0337\033[H\033[1;37m");
for (i = 0; i < h; i++) {
j = 0;
@@ -60,7 +61,8 @@ static void print_status(int on)
putchar('\n');
}
printf("\0338"); fflush(stdout);
- unlock_debug();
+ enable_limit_scroll(true);
+ unlock_logging();
}
void display_status_on(int on)
@@ -77,9 +79,9 @@ void display_status_on(int on)
print_status(1);
if (status_on)
- debug_limit_scroll = lines_total;
+ logging_limit_scroll_top(lines_total);
else
- debug_limit_scroll = 0;
+ logging_limit_scroll_top(0);
}
/* start status display */
@@ -139,7 +141,7 @@ void display_status_end(void)
/* set new total lines */
lines_total = line_count;
if (status_on)
- debug_limit_scroll = lines_total;
+ logging_limit_scroll_top(lines_total);
}
diff --git a/src/libdisplay/display_wave.c b/src/libdisplay/display_wave.c
index 713873f..2d54bf7 100644
--- a/src/libdisplay/display_wave.c
+++ b/src/libdisplay/display_wave.c
@@ -24,7 +24,7 @@
#include <math.h>
#include <sys/ioctl.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../libdisplay/display.h"
#define HEIGHT 11
@@ -52,7 +52,8 @@ void display_wave_on(int on)
if (wave_on) {
memset(&screen, ' ', sizeof(screen));
- lock_debug();
+ lock_logging();
+ enable_limit_scroll(false);
printf("\0337\033[H");
for (i = 0; i < num_sender; i++) {
for (j = 0; j < HEIGHT; j++) {
@@ -61,7 +62,8 @@ void display_wave_on(int on)
}
}
printf("\0338"); fflush(stdout);
- unlock_debug();
+ enable_limit_scroll(true);
+ unlock_logging();
}
if (on < 0)
@@ -70,9 +72,9 @@ void display_wave_on(int on)
wave_on = on;
if (wave_on)
- debug_limit_scroll = HEIGHT * num_sender;
+ logging_limit_scroll_top(HEIGHT * num_sender);
else
- debug_limit_scroll = 0;
+ logging_limit_scroll_top(0);
}
/*
@@ -104,8 +106,6 @@ void display_wave(dispwav_t *disp, sample_t *samples, int length, double range)
if (!wave_on)
return;
- lock_debug();
-
get_win_size(&width, &h);
if (width > MAX_DISPLAY_WIDTH - 1)
width = MAX_DISPLAY_WIDTH - 1;
@@ -208,6 +208,8 @@ void display_wave(dispwav_t *disp, sample_t *samples, int length, double range)
}
sprintf(screen[0], "(chan %s", disp->kanal);
*strchr(screen[0], '\0') = ')';
+ lock_logging();
+ enable_limit_scroll(false);
printf("\0337\033[H");
for (j = 0; j < disp->offset; j++)
puts("");
@@ -241,12 +243,12 @@ void display_wave(dispwav_t *disp, sample_t *samples, int length, double range)
}
/* reset color and position */
printf("\033[0;39m\0338"); fflush(stdout);
+ enable_limit_scroll(true);
+ unlock_logging();
}
}
disp->interval_pos = pos;
-
- unlock_debug();
}
diff --git a/src/libdtmf/Makefile.am b/src/libdtmf/Makefile.am
index f1df569..e2f7540 100644
--- a/src/libdtmf/Makefile.am
+++ b/src/libdtmf/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
noinst_LIBRARIES = libdtmf.a
diff --git a/src/libdtmf/dtmf_decode.c b/src/libdtmf/dtmf_decode.c
index 8270ae3..97aec6a 100644
--- a/src/libdtmf/dtmf_decode.c
+++ b/src/libdtmf/dtmf_decode.c
@@ -22,10 +22,10 @@
#include <string.h>
#include <math.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "dtmf_decode.h"
-//#define DEBUG
+//#define DEBUG_DTMF
#define level2db(level) (20 * log10(level))
#define db2level(db) pow(10, (double)db / 20.0)
@@ -41,7 +41,7 @@
static const char dtmf_digit[] = " 123A456B789C*0#D";
-int dtmf_decode_init(dtmf_dec_t *dtmf, void *priv, void (*recv_digit)(void *priv, char digit, dtmf_meas_t *meas), int samplerate, double max_amplitude, double min_amplitude)
+int dtmf_decode_init(dtmf_dec_t *dtmf, void *priv, void (*recv_digit)(void *priv, char digit, dtmf_meas_t *meas), int samplerate, double max_amplitude, double min_amplitude, double freq_margin)
{
int rc;
@@ -49,7 +49,7 @@ int dtmf_decode_init(dtmf_dec_t *dtmf, void *priv, void (*recv_digit)(void *priv
dtmf->priv = priv;
dtmf->recv_digit = recv_digit;
dtmf->samplerate = samplerate;
- dtmf->freq_margin = 1.03; /* 1.8 .. 3.5 % */
+ dtmf->freq_margin = freq_margin;
dtmf->max_amplitude = max_amplitude;
dtmf->min_amplitude = min_amplitude;
dtmf->forward_twist = db2level(4.0);
@@ -118,7 +118,7 @@ void dtmf_decode(dtmf_dec_t *dtmf, sample_t *samples, int length)
int amplitude_ok, twist_ok;
int i;
- margin = dtmf->freq_margin;
+ margin = dtmf->freq_margin / 100.0 + 1.0;
min_amplitude = dtmf->min_amplitude;
max_amplitude = dtmf->max_amplitude;
forward_twist = dtmf->forward_twist;
@@ -133,7 +133,7 @@ void dtmf_decode(dtmf_dec_t *dtmf, sample_t *samples, int length)
dtmf_decode_filter(dtmf, samples, length, frequency_low, frequency_high, amplitude_low, amplitude_high);
for (i = 0; i < length; i++) {
-#ifdef DEBUG
+#ifdef DEBUG_DTMF
// printf("%s %.5f\n", debug_amplitude(samples[i]/2.0), samples[i]/2.0);
#endif
/* get frequency of low frequencies, correct amplitude drop at cutoff point */
@@ -194,7 +194,7 @@ void dtmf_decode(dtmf_dec_t *dtmf, sample_t *samples, int length)
/* check for limits */
if (amplitude_low[i] <= max_amplitude && amplitude_low[i] >= min_amplitude && amplitude_high[i] <= max_amplitude && amplitude_high[i] >= min_amplitude) {
amplitude_ok = 1;
-#ifdef DEBUG
+#ifdef DEBUG_DTMF
printf("%.1f %.1f (limits %.1f .. %.1f) %.1f\n", level2db(amplitude_low[i]), level2db(amplitude_high[i]), level2db(min_amplitude), level2db(max_amplitude), level2db(amplitude_high[i] / amplitude_low[i]));
#endif
if (amplitude_high[i] / amplitude_low[i] <= forward_twist && amplitude_low[i] / amplitude_high[i] <= reverse_twist)
@@ -231,14 +231,14 @@ void dtmf_decode(dtmf_dec_t *dtmf, sample_t *samples, int length)
count++;
if (count >= time_pause) {
detected = 0;
-#ifdef DEBUG
+#ifdef DEBUG_DTMF
printf("lost!\n");
#endif
}
} else
count = 0;
}
-#ifdef DEBUG
+#ifdef DEBUG_DTMF
if (digit)
printf("DTMF tone='%c' diff frequency=%.1f %.1f amplitude=%.1f %.1f dB (%s) twist=%.1f dB (%s)\n", digit, f1, f2, level2db(amplitude_low[i]), level2db(amplitude_high[i]), (amplitude_ok) ? "OK" : "nok", level2db(amplitude_high[i] / amplitude_low[i]), (twist_ok) ? "OK" : "nok");
#endif
diff --git a/src/libdtmf/dtmf_decode.h b/src/libdtmf/dtmf_decode.h
index 9c162fe..ea2ff8e 100644
--- a/src/libdtmf/dtmf_decode.h
+++ b/src/libdtmf/dtmf_decode.h
@@ -1,6 +1,8 @@
#include "../libfm/fm.h"
-typedef struct ftmf_meas {
+#define DTMF_FREQ_MARGIN_PERCENT_DEFAULT 3 /* 1.8 .. 3.5 % */
+
+typedef struct dtmf_meas {
double frequency_low;
double frequency_high;
double amplitude_low;
@@ -28,7 +30,7 @@ typedef struct dtmf_dec {
dtmf_meas_t meas; /* measurements */
} dtmf_dec_t;
-int dtmf_decode_init(dtmf_dec_t *dtmf, void *priv, void (*recv_digit)(void *priv, char digit, dtmf_meas_t *meas), int samplerate, double max_amplitude, double min_amplitude);
+int dtmf_decode_init(dtmf_dec_t *dtmf, void *priv, void (*recv_digit)(void *priv, char digit, dtmf_meas_t *meas), int samplerate, double max_amplitude, double min_amplitude, double freq_margin);
void dtmf_decode_exit(dtmf_dec_t *dtmf);
void dtmf_decode_reset(dtmf_dec_t *dtmf);
void dtmf_decode(dtmf_dec_t *dtmf, sample_t *samples, int length);
diff --git a/src/libemphasis/Makefile.am b/src/libemphasis/Makefile.am
index 62599a6..acd80e9 100644
--- a/src/libemphasis/Makefile.am
+++ b/src/libemphasis/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
noinst_LIBRARIES = libemphasis.a
diff --git a/src/libfft/Makefile.am b/src/libfft/Makefile.am
index b6cbfc9..b134ff8 100644
--- a/src/libfft/Makefile.am
+++ b/src/libfft/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
noinst_LIBRARIES = libfft.a
diff --git a/src/libfilter/Makefile.am b/src/libfilter/Makefile.am
index 45d2ec2..4b7bdc2 100644
--- a/src/libfilter/Makefile.am
+++ b/src/libfilter/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
noinst_LIBRARIES = libfilter.a
diff --git a/src/libfilter/iir_filter.c b/src/libfilter/iir_filter.c
index 5872d61..2749f96 100644
--- a/src/libfilter/iir_filter.c
+++ b/src/libfilter/iir_filter.c
@@ -88,13 +88,12 @@ void iir_bandpass_init(iir_filter_t *filter, double frequency, int samplerate, i
filter->b2 = (1 - K / Q + K * K) * norm;
}
-void iir_notch_init(iir_filter_t *filter, double frequency, int samplerate, int iterations)
+void iir_notch_init(iir_filter_t *filter, double frequency, int samplerate, int iterations, double Q)
{
- double Fc, Q, K, norm;
+ double Fc, K, norm;
memset(filter, 0, sizeof(*filter));
filter->iter = iterations;
- Q = pow(sqrt(0.5), 1.0 / (double)iterations); /* 0.7071 @ 1 iteration */
Fc = frequency / (double)samplerate;
K = tan(PI * Fc);
norm = 1 / (1 + K / Q + K * K);
diff --git a/src/libfilter/iir_filter.h b/src/libfilter/iir_filter.h
index a5956c8..9b2d7ce 100644
--- a/src/libfilter/iir_filter.h
+++ b/src/libfilter/iir_filter.h
@@ -10,7 +10,7 @@ typedef struct iir_filter {
void iir_lowpass_init(iir_filter_t *filter, double frequency, int samplerate, int iterations);
void iir_highpass_init(iir_filter_t *filter, double frequency, int samplerate, int iterations);
void iir_bandpass_init(iir_filter_t *filter, double frequency, int samplerate, int iterations);
-void iir_notch_init(iir_filter_t *filter, double frequency, int samplerate, int iterations);
+void iir_notch_init(iir_filter_t *filter, double frequency, int samplerate, int iterations, double Q);
void iir_process(iir_filter_t *filter, sample_t *samples, int length);
void iir_process_baseband(iir_filter_t *filter, float *baseband, int length);
diff --git a/src/libfm/Makefile.am b/src/libfm/Makefile.am
index d78a28e..d74cecf 100644
--- a/src/libfm/Makefile.am
+++ b/src/libfm/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
noinst_LIBRARIES = libfm.a
diff --git a/src/libfm/fm.c b/src/libfm/fm.c
index 079491c..cd13ea1 100644
--- a/src/libfm/fm.c
+++ b/src/libfm/fm.c
@@ -244,7 +244,7 @@ again:
mod->ramp = ramp;
}
-/* init FM demodulator */
+/* init FM demodulator, bandwidth is the 2 * (deviation + modulation) */
int fm_demod_init(fm_demod_t *demod, double samplerate, double offset, double bandwidth)
{
if (!has_init) {
diff --git a/src/libfsk/Makefile.am b/src/libfsk/Makefile.am
index 53f5563..fa0c6d0 100644
--- a/src/libfsk/Makefile.am
+++ b/src/libfsk/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
noinst_LIBRARIES = libfsk.a
diff --git a/src/libfsk/fsk.c b/src/libfsk/fsk.c
index dcc437d..475ea88 100644
--- a/src/libfsk/fsk.c
+++ b/src/libfsk/fsk.c
@@ -24,7 +24,7 @@
#include <errno.h>
#include <math.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "fsk.h"
#define PI M_PI
@@ -51,7 +51,7 @@ int fsk_mod_init(fsk_mod_t *fsk, void *inst, int (*send_bit)(void *inst), int sa
int i;
int rc;
- PDEBUG(DDSP, DEBUG_DEBUG, "Setup FSK for Transmitter. (F0 = %.1f, F1 = %.1f, peak = %.1f)\n", f0, f1, level);
+ LOGP(DDSP, LOGL_DEBUG, "Setup FSK for Transmitter. (F0 = %.1f, F1 = %.1f, peak = %.1f)\n", f0, f1, level);
memset(fsk, 0, sizeof(*fsk));
@@ -79,12 +79,12 @@ int fsk_mod_init(fsk_mod_t *fsk, void *inst, int (*send_bit)(void *inst), int sa
}
fsk->bits65536_per_sample = (double)bitrate / (double)samplerate * 65536.0;
- PDEBUG(DDSP, DEBUG_DEBUG, "Bitduration of %.4f bits per sample @ %d.\n", fsk->bits65536_per_sample / 65536.0, samplerate);
+ LOGP(DDSP, LOGL_DEBUG, "Bitduration of %.4f bits per sample @ %d.\n", fsk->bits65536_per_sample / 65536.0, samplerate);
fsk->phaseshift65536[0] = f0 / (double)samplerate * 65536.0;
fsk->phaseshift65536[1] = f1 / (double)samplerate * 65536.0;
- PDEBUG(DDSP, DEBUG_DEBUG, "F0 = %.0f Hz (phaseshift65536[0] = %.4f)\n", f0, fsk->phaseshift65536[0]);
- PDEBUG(DDSP, DEBUG_DEBUG, "F1 = %.0f Hz (phaseshift65536[1] = %.4f)\n", f1, fsk->phaseshift65536[1]);
+ LOGP(DDSP, LOGL_DEBUG, "F0 = %.0f Hz (phaseshift65536[0] = %.4f)\n", f0, fsk->phaseshift65536[0]);
+ LOGP(DDSP, LOGL_DEBUG, "F1 = %.0f Hz (phaseshift65536[1] = %.4f)\n", f1, fsk->phaseshift65536[1]);
/* use ffsk modulation, i.e. each bit has an integer number of
* half waves and starts/ends at zero crossing
@@ -93,12 +93,12 @@ int fsk_mod_init(fsk_mod_t *fsk, void *inst, int (*send_bit)(void *inst), int sa
double waves;
if (filter) {
- PDEBUG(DDSP, DEBUG_ERROR, "Cannot use FFSK with filter.\n");
+ LOGP(DDSP, LOGL_ERROR, "Cannot use FFSK with filter.\n");
rc = -EINVAL;
goto error;
}
- PDEBUG(DDSP, DEBUG_DEBUG, "enable FFSK modulation mode\n");
+ LOGP(DDSP, LOGL_DEBUG, "enable FFSK modulation mode\n");
fsk->ffsk = 1;
waves = (f0 / bitrate);
if (fabs(round(waves * 2) - (waves * 2)) > 0.001) {
@@ -116,8 +116,8 @@ int fsk_mod_init(fsk_mod_t *fsk, void *inst, int (*send_bit)(void *inst), int sa
fsk->cycles_per_bit65536[0] = f0 / bitrate * 65536.0;
fsk->cycles_per_bit65536[1] = f1 / bitrate * 65536.0;
}
- PDEBUG(DDSP, DEBUG_DEBUG, "F0 = %.0f Hz (cycles_per_bit65536[0] = %.4f)\n", f0, fsk->cycles_per_bit65536[0]);
- PDEBUG(DDSP, DEBUG_DEBUG, "F1 = %.0f Hz (cycles_per_bit65536[1] = %.4f)\n", f1, fsk->cycles_per_bit65536[1]);
+ LOGP(DDSP, LOGL_DEBUG, "F0 = %.0f Hz (cycles_per_bit65536[0] = %.4f)\n", f0, fsk->cycles_per_bit65536[0]);
+ LOGP(DDSP, LOGL_DEBUG, "F1 = %.0f Hz (cycles_per_bit65536[1] = %.4f)\n", f1, fsk->cycles_per_bit65536[1]);
/* if filter is enabled, use a cosine shaped curve to change the phase each sample */
if (filter) {
@@ -138,7 +138,7 @@ int fsk_mod_init(fsk_mod_t *fsk, void *inst, int (*send_bit)(void *inst), int sa
#endif
}
- PDEBUG(DDSP, DEBUG_DEBUG, "Enable filter to smooth FSK transmission.\n");
+ LOGP(DDSP, LOGL_DEBUG, "Enable filter to smooth FSK transmission.\n");
fsk->filter = 1;
}
@@ -155,7 +155,7 @@ error:
/* Cleanup transceiver instance. */
void fsk_mod_cleanup(fsk_mod_t *fsk)
{
- PDEBUG(DDSP, DEBUG_DEBUG, "Cleanup FSK for Transmitter.\n");
+ LOGP(DDSP, LOGL_DEBUG, "Cleanup FSK for Transmitter.\n");
if (fsk->sin_tab) {
free(fsk->sin_tab);
@@ -314,7 +314,7 @@ int fsk_demod_init(fsk_demod_t *fsk, void *inst, void (*receive_bit)(void *inst,
double bandwidth;
int rc;
- PDEBUG(DDSP, DEBUG_DEBUG, "Setup FSK for Receiver. (F0 = %.1f, F1 = %.1f)\n", f0, f1);
+ LOGP(DDSP, LOGL_DEBUG, "Setup FSK for Receiver. (F0 = %.1f, F1 = %.1f)\n", f0, f1);
memset(fsk, 0, sizeof(*fsk));
@@ -341,7 +341,7 @@ int fsk_demod_init(fsk_demod_t *fsk, void *inst, void (*receive_bit)(void *inst,
goto error;
fsk->bits_per_sample = (double)bitrate / (double)samplerate;
- PDEBUG(DDSP, DEBUG_DEBUG, "Bitduration of %.4f bits per sample @ %d.\n", fsk->bits_per_sample, samplerate);
+ LOGP(DDSP, LOGL_DEBUG, "Bitduration of %.4f bits per sample @ %d.\n", fsk->bits_per_sample, samplerate);
return 0;
@@ -353,7 +353,7 @@ error:
/* Cleanup transceiver instance. */
void fsk_demod_cleanup(fsk_demod_t *fsk)
{
- PDEBUG(DDSP, DEBUG_DEBUG, "Cleanup FSK for Receiver.\n");
+ LOGP(DDSP, LOGL_DEBUG, "Cleanup FSK for Receiver.\n");
fm_demod_exit(&fsk->demod);
}
@@ -361,6 +361,8 @@ void fsk_demod_cleanup(fsk_demod_t *fsk)
//#define DEBUG_MODULATOR
//#define DEBUG_FILTER
+#define CHUNK 1024
+
/* Demodulates bits
*
* If bit is received, callback function send_bit() is called.
@@ -375,15 +377,21 @@ void fsk_demod_cleanup(fsk_demod_t *fsk)
*/
void fsk_demod_receive(fsk_demod_t *fsk, sample_t *sample, int length)
{
- sample_t I[length], Q[length], frequency[length], f;
+ sample_t I[CHUNK], Q[CHUNK], frequency[CHUNK], f;
int i;
int bit;
double level, quality;
- /* demod samples to offset around center frequency */
- fm_demodulate_real(&fsk->demod, frequency, length, sample, I, Q);
-
for (i = 0; i < length; i++) {
+ /* this is called on first sample and subsequently every sample defined by CHUNK */
+ if (i % CHUNK == 0) {
+ length -= i;
+ i = 0;
+ /* demod CHUNK samples to offset around center frequency */
+ fm_demodulate_real(&fsk->demod, frequency, (length > CHUNK) ? CHUNK : length, sample, I, Q);
+ sample += CHUNK;
+ }
+
f = frequency[i];
if (f < 0)
bit = fsk->low_bit;
diff --git a/src/libg711/Makefile.am b/src/libg711/Makefile.am
deleted file mode 100644
index 15223bf..0000000
--- a/src/libg711/Makefile.am
+++ /dev/null
@@ -1,7 +0,0 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
-
-noinst_LIBRARIES = libg711.a
-
-libg711_a_SOURCES = \
- g711.c
-
diff --git a/src/libg711/g711.c b/src/libg711/g711.c
deleted file mode 100644
index bbbdde5..0000000
--- a/src/libg711/g711.c
+++ /dev/null
@@ -1,537 +0,0 @@
-/*****************************************************************************\
-** **
-** PBX4Linux **
-** **
-**---------------------------------------------------------------------------**
-** Copyright: Andreas Eversberg (GPL) **
-** **
-** audio conversions for alaw and ulaw **
-** **
-\*****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdint.h>
-
-/* ulaw -> signed 16-bit */
-static int16_t g711_ulaw_flipped_to_linear[256] =
-{
- 0x8284, 0x8684, 0x8a84, 0x8e84, 0x9284, 0x9684, 0x9a84, 0x9e84,
- 0xa284, 0xa684, 0xaa84, 0xae84, 0xb284, 0xb684, 0xba84, 0xbe84,
- 0xc184, 0xc384, 0xc584, 0xc784, 0xc984, 0xcb84, 0xcd84, 0xcf84,
- 0xd184, 0xd384, 0xd584, 0xd784, 0xd984, 0xdb84, 0xdd84, 0xdf84,
- 0xe104, 0xe204, 0xe304, 0xe404, 0xe504, 0xe604, 0xe704, 0xe804,
- 0xe904, 0xea04, 0xeb04, 0xec04, 0xed04, 0xee04, 0xef04, 0xf004,
- 0xf0c4, 0xf144, 0xf1c4, 0xf244, 0xf2c4, 0xf344, 0xf3c4, 0xf444,
- 0xf4c4, 0xf544, 0xf5c4, 0xf644, 0xf6c4, 0xf744, 0xf7c4, 0xf844,
- 0xf8a4, 0xf8e4, 0xf924, 0xf964, 0xf9a4, 0xf9e4, 0xfa24, 0xfa64,
- 0xfaa4, 0xfae4, 0xfb24, 0xfb64, 0xfba4, 0xfbe4, 0xfc24, 0xfc64,
- 0xfc94, 0xfcb4, 0xfcd4, 0xfcf4, 0xfd14, 0xfd34, 0xfd54, 0xfd74,
- 0xfd94, 0xfdb4, 0xfdd4, 0xfdf4, 0xfe14, 0xfe34, 0xfe54, 0xfe74,
- 0xfe8c, 0xfe9c, 0xfeac, 0xfebc, 0xfecc, 0xfedc, 0xfeec, 0xfefc,
- 0xff0c, 0xff1c, 0xff2c, 0xff3c, 0xff4c, 0xff5c, 0xff6c, 0xff7c,
- 0xff88, 0xff90, 0xff98, 0xffa0, 0xffa8, 0xffb0, 0xffb8, 0xffc0,
- 0xffc8, 0xffd0, 0xffd8, 0xffe0, 0xffe8, 0xfff0, 0xfff8, 0xffff,
- 0x7d7c, 0x797c, 0x757c, 0x717c, 0x6d7c, 0x697c, 0x657c, 0x617c,
- 0x5d7c, 0x597c, 0x557c, 0x517c, 0x4d7c, 0x497c, 0x457c, 0x417c,
- 0x3e7c, 0x3c7c, 0x3a7c, 0x387c, 0x367c, 0x347c, 0x327c, 0x307c,
- 0x2e7c, 0x2c7c, 0x2a7c, 0x287c, 0x267c, 0x247c, 0x227c, 0x207c,
- 0x1efc, 0x1dfc, 0x1cfc, 0x1bfc, 0x1afc, 0x19fc, 0x18fc, 0x17fc,
- 0x16fc, 0x15fc, 0x14fc, 0x13fc, 0x12fc, 0x11fc, 0x10fc, 0x0ffc,
- 0x0f3c, 0x0ebc, 0x0e3c, 0x0dbc, 0x0d3c, 0x0cbc, 0x0c3c, 0x0bbc,
- 0x0b3c, 0x0abc, 0x0a3c, 0x09bc, 0x093c, 0x08bc, 0x083c, 0x07bc,
- 0x075c, 0x071c, 0x06dc, 0x069c, 0x065c, 0x061c, 0x05dc, 0x059c,
- 0x055c, 0x051c, 0x04dc, 0x049c, 0x045c, 0x041c, 0x03dc, 0x039c,
- 0x036c, 0x034c, 0x032c, 0x030c, 0x02ec, 0x02cc, 0x02ac, 0x028c,
- 0x026c, 0x024c, 0x022c, 0x020c, 0x01ec, 0x01cc, 0x01ac, 0x018c,
- 0x0174, 0x0164, 0x0154, 0x0144, 0x0134, 0x0124, 0x0114, 0x0104,
- 0x00f4, 0x00e4, 0x00d4, 0x00c4, 0x00b4, 0x00a4, 0x0094, 0x0084,
- 0x0078, 0x0070, 0x0068, 0x0060, 0x0058, 0x0050, 0x0048, 0x0040,
- 0x0038, 0x0030, 0x0028, 0x0020, 0x0018, 0x0010, 0x0008, 0x0000
-};
-
-/* alaw -> signed 16-bit */
-static int16_t g711_alaw_flipped_to_linear[256] =
-{
- 0x13fc, 0xec04, 0x0144, 0xfebc, 0x517c, 0xae84, 0x051c, 0xfae4,
- 0x0a3c, 0xf5c4, 0x0048, 0xffb8, 0x287c, 0xd784, 0x028c, 0xfd74,
- 0x1bfc, 0xe404, 0x01cc, 0xfe34, 0x717c, 0x8e84, 0x071c, 0xf8e4,
- 0x0e3c, 0xf1c4, 0x00c4, 0xff3c, 0x387c, 0xc784, 0x039c, 0xfc64,
- 0x0ffc, 0xf004, 0x0104, 0xfefc, 0x417c, 0xbe84, 0x041c, 0xfbe4,
- 0x083c, 0xf7c4, 0x0008, 0xfff8, 0x207c, 0xdf84, 0x020c, 0xfdf4,
- 0x17fc, 0xe804, 0x018c, 0xfe74, 0x617c, 0x9e84, 0x061c, 0xf9e4,
- 0x0c3c, 0xf3c4, 0x0084, 0xff7c, 0x307c, 0xcf84, 0x030c, 0xfcf4,
- 0x15fc, 0xea04, 0x0164, 0xfe9c, 0x597c, 0xa684, 0x059c, 0xfa64,
- 0x0b3c, 0xf4c4, 0x0068, 0xff98, 0x2c7c, 0xd384, 0x02cc, 0xfd34,
- 0x1dfc, 0xe204, 0x01ec, 0xfe14, 0x797c, 0x8684, 0x07bc, 0xf844,
- 0x0f3c, 0xf0c4, 0x00e4, 0xff1c, 0x3c7c, 0xc384, 0x03dc, 0xfc24,
- 0x11fc, 0xee04, 0x0124, 0xfedc, 0x497c, 0xb684, 0x049c, 0xfb64,
- 0x093c, 0xf6c4, 0x0028, 0xffd8, 0x247c, 0xdb84, 0x024c, 0xfdb4,
- 0x19fc, 0xe604, 0x01ac, 0xfe54, 0x697c, 0x9684, 0x069c, 0xf964,
- 0x0d3c, 0xf2c4, 0x00a4, 0xff5c, 0x347c, 0xcb84, 0x034c, 0xfcb4,
- 0x12fc, 0xed04, 0x0134, 0xfecc, 0x4d7c, 0xb284, 0x04dc, 0xfb24,
- 0x09bc, 0xf644, 0x0038, 0xffc8, 0x267c, 0xd984, 0x026c, 0xfd94,
- 0x1afc, 0xe504, 0x01ac, 0xfe54, 0x6d7c, 0x9284, 0x06dc, 0xf924,
- 0x0dbc, 0xf244, 0x00b4, 0xff4c, 0x367c, 0xc984, 0x036c, 0xfc94,
- 0x0f3c, 0xf0c4, 0x00f4, 0xff0c, 0x3e7c, 0xc184, 0x03dc, 0xfc24,
- 0x07bc, 0xf844, 0x0008, 0xfff8, 0x1efc, 0xe104, 0x01ec, 0xfe14,
- 0x16fc, 0xe904, 0x0174, 0xfe8c, 0x5d7c, 0xa284, 0x05dc, 0xfa24,
- 0x0bbc, 0xf444, 0x0078, 0xff88, 0x2e7c, 0xd184, 0x02ec, 0xfd14,
- 0x14fc, 0xeb04, 0x0154, 0xfeac, 0x557c, 0xaa84, 0x055c, 0xfaa4,
- 0x0abc, 0xf544, 0x0058, 0xffa8, 0x2a7c, 0xd584, 0x02ac, 0xfd54,
- 0x1cfc, 0xe304, 0x01cc, 0xfe34, 0x757c, 0x8a84, 0x075c, 0xf8a4,
- 0x0ebc, 0xf144, 0x00d4, 0xff2c, 0x3a7c, 0xc584, 0x039c, 0xfc64,
- 0x10fc, 0xef04, 0x0114, 0xfeec, 0x457c, 0xba84, 0x045c, 0xfba4,
- 0x08bc, 0xf744, 0x0018, 0xffe8, 0x227c, 0xdd84, 0x022c, 0xfdd4,
- 0x18fc, 0xe704, 0x018c, 0xfe74, 0x657c, 0x9a84, 0x065c, 0xf9a4,
- 0x0cbc, 0xf344, 0x0094, 0xff6c, 0x327c, 0xcd84, 0x032c, 0xfcd4
-};
-
-/* Xlaw -> signed 16-bit */
-static int16_t g711_alaw_to_linear[256];
-static int16_t g711_ulaw_to_linear[256];
-
-/* signed 16-bit -> Xlaw */
-static uint8_t g711_linear_to_alaw_flipped[65536];
-static uint8_t g711_linear_to_ulaw_flipped[65536];
-static uint8_t g711_linear_to_alaw[65536];
-static uint8_t g711_linear_to_ulaw[65536];
-
-/* transcode */
-static uint8_t g711_alaw_to_ulaw[256];
-static uint8_t g711_ulaw_to_alaw[256];
-static uint8_t g711_alaw_flipped_to_ulaw[256];
-static uint8_t g711_ulaw_flipped_to_alaw[256];
-static uint8_t g711_alaw_to_ulaw_flipped[256];
-static uint8_t g711_ulaw_to_alaw_flipped[256];
-
-/* table is used to generate linear_to_alaw */
-static int16_t g711_alaw_relations[] =
-{
- 0x8684, 0x55, 0x8a84, 0xd5, 0x8e84, 0x15, 0x9284, 0x95,
- 0x9684, 0x75, 0x9a84, 0xf5, 0x9e84, 0x35, 0xa284, 0xb5,
- 0xa684, 0x45, 0xaa84, 0xc5, 0xae84, 0x05, 0xb284, 0x85,
- 0xb684, 0x65, 0xba84, 0xe5, 0xbe84, 0x25, 0xc184, 0xa5,
- 0xc384, 0x5d, 0xc584, 0xdd, 0xc784, 0x1d, 0xc984, 0x9d,
- 0xcb84, 0x7d, 0xcd84, 0xfd, 0xcf84, 0x3d, 0xd184, 0xbd,
- 0xd384, 0x4d, 0xd584, 0xcd, 0xd784, 0x0d, 0xd984, 0x8d,
- 0xdb84, 0x6d, 0xdd84, 0xed, 0xdf84, 0x2d, 0xe104, 0xad,
- 0xe204, 0x51, 0xe304, 0xd1, 0xe404, 0x11, 0xe504, 0x91,
- 0xe604, 0x71, 0xe704, 0xf1, 0xe804, 0x31, 0xe904, 0xb1,
- 0xea04, 0x41, 0xeb04, 0xc1, 0xec04, 0x01, 0xed04, 0x81,
- 0xee04, 0x61, 0xef04, 0xe1, 0xf004, 0x21, 0xf0c4, 0x59,
- 0xf0c4, 0xa1, 0xf144, 0xd9, 0xf1c4, 0x19, 0xf244, 0x99,
- 0xf2c4, 0x79, 0xf344, 0xf9, 0xf3c4, 0x39, 0xf444, 0xb9,
- 0xf4c4, 0x49, 0xf544, 0xc9, 0xf5c4, 0x09, 0xf644, 0x89,
- 0xf6c4, 0x69, 0xf744, 0xe9, 0xf7c4, 0x29, 0xf844, 0x57,
- 0xf844, 0xa9, 0xf8a4, 0xd7, 0xf8e4, 0x17, 0xf924, 0x97,
- 0xf964, 0x77, 0xf9a4, 0xf7, 0xf9e4, 0x37, 0xfa24, 0xb7,
- 0xfa64, 0x47, 0xfaa4, 0xc7, 0xfae4, 0x07, 0xfb24, 0x87,
- 0xfb64, 0x67, 0xfba4, 0xe7, 0xfbe4, 0x27, 0xfc24, 0x5f,
- 0xfc24, 0xa7, 0xfc64, 0x1f, 0xfc64, 0xdf, 0xfc94, 0x9f,
- 0xfcb4, 0x7f, 0xfcd4, 0xff, 0xfcf4, 0x3f, 0xfd14, 0xbf,
- 0xfd34, 0x4f, 0xfd54, 0xcf, 0xfd74, 0x0f, 0xfd94, 0x8f,
- 0xfdb4, 0x6f, 0xfdd4, 0xef, 0xfdf4, 0x2f, 0xfe14, 0x53,
- 0xfe14, 0xaf, 0xfe34, 0x13, 0xfe34, 0xd3, 0xfe54, 0x73,
- 0xfe54, 0x93, 0xfe74, 0x33, 0xfe74, 0xf3, 0xfe8c, 0xb3,
- 0xfe9c, 0x43, 0xfeac, 0xc3, 0xfebc, 0x03, 0xfecc, 0x83,
- 0xfedc, 0x63, 0xfeec, 0xe3, 0xfefc, 0x23, 0xff0c, 0xa3,
- 0xff1c, 0x5b, 0xff2c, 0xdb, 0xff3c, 0x1b, 0xff4c, 0x9b,
- 0xff5c, 0x7b, 0xff6c, 0xfb, 0xff7c, 0x3b, 0xff88, 0xbb,
- 0xff98, 0x4b, 0xffa8, 0xcb, 0xffb8, 0x0b, 0xffc8, 0x8b,
- 0xffd8, 0x6b, 0xffe8, 0xeb, 0xfff8, 0x2b, 0xfff8, 0xab,
- 0x0008, 0x2a, 0x0008, 0xaa, 0x0018, 0xea, 0x0028, 0x6a,
- 0x0038, 0x8a, 0x0048, 0x0a, 0x0058, 0xca, 0x0068, 0x4a,
- 0x0078, 0xba, 0x0084, 0x3a, 0x0094, 0xfa, 0x00a4, 0x7a,
- 0x00b4, 0x9a, 0x00c4, 0x1a, 0x00d4, 0xda, 0x00e4, 0x5a,
- 0x00f4, 0xa2, 0x0104, 0x22, 0x0114, 0xe2, 0x0124, 0x62,
- 0x0134, 0x82, 0x0144, 0x02, 0x0154, 0xc2, 0x0164, 0x42,
- 0x0174, 0xb2, 0x018c, 0x32, 0x018c, 0xf2, 0x01ac, 0x72,
- 0x01ac, 0x92, 0x01cc, 0x12, 0x01cc, 0xd2, 0x01ec, 0x52,
- 0x01ec, 0xae, 0x020c, 0x2e, 0x022c, 0xee, 0x024c, 0x6e,
- 0x026c, 0x8e, 0x028c, 0x0e, 0x02ac, 0xce, 0x02cc, 0x4e,
- 0x02ec, 0xbe, 0x030c, 0x3e, 0x032c, 0xfe, 0x034c, 0x7e,
- 0x036c, 0x9e, 0x039c, 0x1e, 0x039c, 0xde, 0x03dc, 0x5e,
- 0x03dc, 0xa6, 0x041c, 0x26, 0x045c, 0xe6, 0x049c, 0x66,
- 0x04dc, 0x86, 0x051c, 0x06, 0x055c, 0xc6, 0x059c, 0x46,
- 0x05dc, 0xb6, 0x061c, 0x36, 0x065c, 0xf6, 0x069c, 0x76,
- 0x06dc, 0x96, 0x071c, 0x16, 0x075c, 0xd6, 0x07bc, 0x56,
- 0x07bc, 0xa8, 0x083c, 0x28, 0x08bc, 0xe8, 0x093c, 0x68,
- 0x09bc, 0x88, 0x0a3c, 0x08, 0x0abc, 0xc8, 0x0b3c, 0x48,
- 0x0bbc, 0xb8, 0x0c3c, 0x38, 0x0cbc, 0xf8, 0x0d3c, 0x78,
- 0x0dbc, 0x98, 0x0e3c, 0x18, 0x0ebc, 0xd8, 0x0f3c, 0x58,
- 0x0f3c, 0xa0, 0x0ffc, 0x20, 0x10fc, 0xe0, 0x11fc, 0x60,
- 0x12fc, 0x80, 0x13fc, 0x00, 0x14fc, 0xc0, 0x15fc, 0x40,
- 0x16fc, 0xb0, 0x17fc, 0x30, 0x18fc, 0xf0, 0x19fc, 0x70,
- 0x1afc, 0x90, 0x1bfc, 0x10, 0x1cfc, 0xd0, 0x1dfc, 0x50,
- 0x1efc, 0xac, 0x207c, 0x2c, 0x227c, 0xec, 0x247c, 0x6c,
- 0x267c, 0x8c, 0x287c, 0x0c, 0x2a7c, 0xcc, 0x2c7c, 0x4c,
- 0x2e7c, 0xbc, 0x307c, 0x3c, 0x327c, 0xfc, 0x347c, 0x7c,
- 0x367c, 0x9c, 0x387c, 0x1c, 0x3a7c, 0xdc, 0x3c7c, 0x5c,
- 0x3e7c, 0xa4, 0x417c, 0x24, 0x457c, 0xe4, 0x497c, 0x64,
- 0x4d7c, 0x84, 0x517c, 0x04, 0x557c, 0xc4, 0x597c, 0x44,
- 0x5d7c, 0xb4, 0x617c, 0x34, 0x657c, 0xf4, 0x697c, 0x74,
- 0x6d7c, 0x94, 0x717c, 0x14, 0x757c, 0xd4, 0x797c, 0x54
-};
-
-uint8_t g711_flip[256];
-
-static int g711_initialized = 0;
-
-/* generate tables
- */
-void g711_init(void)
-{
- int i, j;
-
- /* flip tables */
- for (i = 0; i < 256; i++) {
- g711_flip[i]
- = ((i & 1) << 7)
- + ((i & 2) << 5)
- + ((i & 4) << 3)
- + ((i & 8) << 1)
- + ((i & 16) >> 1)
- + ((i & 32) >> 3)
- + ((i & 64) >> 5)
- + ((i & 128) >> 7);
- g711_alaw_to_linear[i] = g711_alaw_flipped_to_linear[g711_flip[i]];
- g711_ulaw_to_linear[i] = g711_ulaw_flipped_to_linear[g711_flip[i]];
- }
-
- /* linear to alaw tables */
- i = j = 0;
- while(i < 65536) {
- if (i - 32768 > g711_alaw_relations[j << 1])
- j++;
- if (j > 255)
- j = 255;
- g711_linear_to_alaw_flipped[(i - 32768) & 0xffff] = g711_alaw_relations[(j << 1) | 1];
- g711_linear_to_alaw[(i - 32768) & 0xffff] = g711_flip[g711_alaw_relations[(j << 1) | 1]];
- i++;
- }
-
- /* linear to ulaw tables */
- i = j = 0;
- while(i < 32768) {
- if (i - 32768 > g711_ulaw_flipped_to_linear[j])
- j++;
- g711_linear_to_ulaw_flipped[(i - 32768) & 0xffff] = j;
- g711_linear_to_ulaw[(i - 32768) & 0xffff] = g711_flip[j];
- i++;
- }
- j = 255;
- while(i < 65536) {
- if (i - 32768 > g711_alaw_flipped_to_linear[j])
- j--;
- g711_linear_to_ulaw_flipped[(i - 32768) & 0xffff] = j;
- g711_linear_to_ulaw[(i - 32768) & 0xffff] = g711_flip[j];
- i++;
- }
-
- /* transcode */
- for (i = 0; i < 256; i++) {
- g711_alaw_to_ulaw[i] = g711_linear_to_ulaw[(uint16_t)g711_alaw_to_linear[i]];
- g711_ulaw_to_alaw[i] = g711_linear_to_alaw[(uint16_t)g711_ulaw_to_linear[i]];
- g711_alaw_flipped_to_ulaw[i] = g711_linear_to_ulaw[(uint16_t)g711_alaw_to_linear[g711_flip[i]]];
- g711_ulaw_flipped_to_alaw[i] = g711_linear_to_alaw[(uint16_t)g711_ulaw_to_linear[g711_flip[i]]];
- g711_alaw_to_ulaw_flipped[i] = g711_flip[g711_linear_to_ulaw[(uint16_t)g711_alaw_to_linear[i]]];
- g711_ulaw_to_alaw_flipped[i] = g711_flip[g711_linear_to_alaw[(uint16_t)g711_ulaw_to_linear[i]]];
- }
-
- g711_initialized = 1;
-}
-
-void g711_encode_alaw_flipped(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void __attribute__((unused)) *priv)
-{
- int16_t *src = (int16_t *)src_data;
- uint8_t *dst;
- int len = src_len / 2, i;
-
- if (!g711_initialized) {
- fprintf(stderr, "G711 codec not initialized! Please fix!\n");
- abort();
- }
-
- dst = malloc(len);
- if (!dst)
- return;
- for (i = 0; i < len; i++)
- dst[i] = g711_linear_to_alaw_flipped[(uint16_t)src[i]];
- *dst_data = dst;
- *dst_len = len;
-}
-
-void g711_encode_ulaw_flipped(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void __attribute__((unused)) *priv)
-{
- int16_t *src = (int16_t *)src_data;
- uint8_t *dst;
- int len = src_len / 2, i;
-
- if (!g711_initialized) {
- fprintf(stderr, "G711 codec not initialized! Please fix!\n");
- abort();
- }
-
- dst = malloc(len);
- if (!dst)
- return;
- for (i = 0; i < len; i++)
- dst[i] = g711_linear_to_ulaw_flipped[(uint16_t)src[i]];
- *dst_data = dst;
- *dst_len = len;
-}
-
-void g711_decode_alaw_flipped(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void __attribute__((unused)) *priv)
-{
- uint8_t *src = src_data;
- int16_t *dst;
- int len = src_len, i;
-
- if (!g711_initialized) {
- fprintf(stderr, "G711 codec not initialized! Please fix!\n");
- abort();
- }
-
- dst = malloc(len * 2);
- if (!dst)
- return;
- for (i = 0; i < len; i++)
- dst[i] = g711_alaw_flipped_to_linear[src[i]];
- *dst_data = (uint8_t *)dst;
- *dst_len = len * 2;
-}
-
-void g711_decode_ulaw_flipped(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void __attribute__((unused)) *priv)
-{
- uint8_t *src = src_data;
- int16_t *dst;
- int len = src_len, i;
-
- if (!g711_initialized) {
- fprintf(stderr, "G711 codec not initialized! Please fix!\n");
- abort();
- }
-
- dst = malloc(len * 2);
- if (!dst)
- return;
- for (i = 0; i < len; i++)
- dst[i] = g711_ulaw_flipped_to_linear[src[i]];
- *dst_data = (uint8_t *)dst;
- *dst_len = len * 2;
-}
-
-void g711_encode_alaw(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void __attribute__((unused)) *priv)
-{
- int16_t *src = (int16_t *)src_data;
- uint8_t *dst;
- int len = src_len / 2, i;
-
- if (!g711_initialized) {
- fprintf(stderr, "G711 codec not initialized! Please fix!\n");
- abort();
- }
-
- dst = malloc(len);
- if (!dst)
- return;
- for (i = 0; i < len; i++)
- dst[i] = g711_linear_to_alaw[(uint16_t)src[i]];
- *dst_data = dst;
- *dst_len = len;
-}
-
-void g711_encode_ulaw(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void __attribute__((unused)) *priv)
-{
- int16_t *src = (int16_t *)src_data;
- uint8_t *dst;
- int len = src_len / 2, i;
-
- if (!g711_initialized) {
- fprintf(stderr, "G711 codec not initialized! Please fix!\n");
- abort();
- }
-
- dst = malloc(len);
- if (!dst)
- return;
- for (i = 0; i < len; i++)
- dst[i] = g711_linear_to_ulaw[(uint16_t)src[i]];
- *dst_data = dst;
- *dst_len = len;
-}
-
-void g711_decode_alaw(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void __attribute__((unused)) *priv)
-{
- uint8_t *src = src_data;
- int16_t *dst;
- int len = src_len, i;
-
- if (!g711_initialized) {
- fprintf(stderr, "G711 codec not initialized! Please fix!\n");
- abort();
- }
-
- dst = malloc(len * 2);
- if (!dst)
- return;
- for (i = 0; i < len; i++)
- dst[i] = g711_alaw_to_linear[src[i]];
- *dst_data = (uint8_t *)dst;
- *dst_len = len * 2;
-}
-
-void g711_decode_ulaw(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void __attribute__((unused)) *priv)
-{
- uint8_t *src = src_data;
- int16_t *dst;
- int len = src_len, i;
-
- if (!g711_initialized) {
- fprintf(stderr, "G711 codec not initialized! Please fix!\n");
- abort();
- }
-
- dst = malloc(len * 2);
- if (!dst)
- return;
- for (i = 0; i < len; i++)
- dst[i] = g711_ulaw_to_linear[src[i]];
- *dst_data = (uint8_t *)dst;
- *dst_len = len * 2;
-}
-
-void g711_transcode_alaw_to_ulaw(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void __attribute__((unused)) *priv)
-{
- uint8_t *src = src_data, *dst;
- int len = src_len, i;
-
- if (!g711_initialized) {
- fprintf(stderr, "G711 codec not initialized! Please fix!\n");
- abort();
- }
-
- dst = malloc(len);
- if (!dst)
- return;
- for (i = 0; i < len; i++)
- dst[i] = g711_alaw_to_ulaw[src[i]];
- *dst_data = dst;
- *dst_len = len;
-}
-
-void g711_transcode_alaw_flipped_to_ulaw(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void __attribute__((unused)) *priv)
-{
- uint8_t *src = src_data, *dst;
- int len = src_len, i;
-
- if (!g711_initialized) {
- fprintf(stderr, "G711 codec not initialized! Please fix!\n");
- abort();
- }
-
- dst = malloc(len);
- if (!dst)
- return;
- for (i = 0; i < len; i++)
- dst[i] = g711_alaw_flipped_to_ulaw[src[i]];
- *dst_data = dst;
- *dst_len = len;
-}
-
-void g711_transcode_alaw_to_ulaw_flipped(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void __attribute__((unused)) *priv)
-{
- uint8_t *src = src_data, *dst;
- int len = src_len, i;
-
- if (!g711_initialized) {
- fprintf(stderr, "G711 codec not initialized! Please fix!\n");
- abort();
- }
-
- dst = malloc(len);
- if (!dst)
- return;
- for (i = 0; i < len; i++)
- dst[i] = g711_alaw_to_ulaw_flipped[src[i]];
- *dst_data = dst;
- *dst_len = len;
-}
-
-void g711_transcode_ulaw_to_alaw(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void __attribute__((unused)) *priv)
-{
- uint8_t *src = src_data, *dst;
- int len = src_len, i;
-
- if (!g711_initialized) {
- fprintf(stderr, "G711 codec not initialized! Please fix!\n");
- abort();
- }
-
- dst = malloc(len);
- if (!dst)
- return;
- for (i = 0; i < len; i++)
- dst[i] = g711_ulaw_to_alaw[src[i]];
- *dst_data = dst;
- *dst_len = len;
-}
-
-void g711_transcode_ulaw_flipped_to_alaw(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void __attribute__((unused)) *priv)
-{
- uint8_t *src = src_data, *dst;
- int len = src_len, i;
-
- if (!g711_initialized) {
- fprintf(stderr, "G711 codec not initialized! Please fix!\n");
- abort();
- }
-
- dst = malloc(len);
- if (!dst)
- return;
- for (i = 0; i < len; i++)
- dst[i] = g711_ulaw_flipped_to_alaw[src[i]];
- *dst_data = dst;
- *dst_len = len;
-}
-
-void g711_transcode_ulaw_to_alaw_flipped(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void __attribute__((unused)) *priv)
-{
- uint8_t *src = src_data, *dst;
- int len = src_len, i;
-
- if (!g711_initialized) {
- fprintf(stderr, "G711 codec not initialized! Please fix!\n");
- abort();
- }
-
- dst = malloc(len);
- if (!dst)
- return;
- for (i = 0; i < len; i++)
- dst[i] = g711_ulaw_to_alaw_flipped[src[i]];
- *dst_data = dst;
- *dst_len = len;
-}
-
-void g711_transcode_flipped(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void __attribute__((unused)) *priv)
-{
- uint8_t *src = src_data, *dst;
- int len = src_len, i;
-
- if (!g711_initialized) {
- fprintf(stderr, "G711 codec not initialized! Please fix!\n");
- abort();
- }
-
- dst = malloc(len);
- if (!dst)
- return;
- for (i = 0; i < len; i++)
- dst[i] = g711_flip[src[i]];
- *dst_data = dst;
- *dst_len = len;
-}
-
diff --git a/src/libg711/g711.h b/src/libg711/g711.h
deleted file mode 100644
index 389daa9..0000000
--- a/src/libg711/g711.h
+++ /dev/null
@@ -1,17 +0,0 @@
-void g711_init(void);
-void g711_encode_alaw_flipped(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void *priv);
-void g711_encode_ulaw_flipped(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void *priv);
-void g711_decode_alaw_flipped(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void *priv);
-void g711_decode_ulaw_flipped(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void *priv);
-void g711_encode_alaw(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void *priv);
-void g711_encode_ulaw(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void *priv);
-void g711_decode_alaw(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void *priv);
-void g711_decode_ulaw(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void *priv);
-void g711_transcode_alaw_to_ulaw(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void *priv);
-void g711_transcode_alaw_flipped_to_ulaw(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void *priv);
-void g711_transcode_alaw_to_ulaw_flipped(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void *priv);
-void g711_transcode_ulaw_to_alaw(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void *priv);
-void g711_transcode_ulaw_flipped_to_alaw(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void *priv);
-void g711_transcode_ulaw_to_alaw_flipped(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void *priv);
-void g711_transcode_flipped(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void *priv);
-
diff --git a/src/libgoertzel/Makefile.am b/src/libgoertzel/Makefile.am
index 56e731d..6c5e463 100644
--- a/src/libgoertzel/Makefile.am
+++ b/src/libgoertzel/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
noinst_LIBRARIES = libgoertzel.a
diff --git a/src/libgoertzel/goertzel.c b/src/libgoertzel/goertzel.c
index d928175..f3e6030 100644
--- a/src/libgoertzel/goertzel.c
+++ b/src/libgoertzel/goertzel.c
@@ -23,7 +23,7 @@
#include <errno.h>
#include <math.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "goertzel.h"
/*
diff --git a/src/libhagelbarger/Makefile.am b/src/libhagelbarger/Makefile.am
index ffd50e7..c7e6656 100644
--- a/src/libhagelbarger/Makefile.am
+++ b/src/libhagelbarger/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
noinst_LIBRARIES = libhagelbarger.a
diff --git a/src/libhagelbarger/hagelbarger.c b/src/libhagelbarger/hagelbarger.c
index 92774a0..3bb89d2 100644
--- a/src/libhagelbarger/hagelbarger.c
+++ b/src/libhagelbarger/hagelbarger.c
@@ -25,7 +25,8 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "stdint.h"
+#include <stdint.h>
+#include "hagelbarger.h"
/* enable to debug the process of parity check */
//#define DEBUG_HAGEL
diff --git a/src/libimage/Makefile.am b/src/libimage/Makefile.am
index 0d36ccd..fbbe316 100644
--- a/src/libimage/Makefile.am
+++ b/src/libimage/Makefile.am
@@ -1,4 +1,5 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes) $(IMAGEMAGICK_CFLAGS)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes) \
+ $(IMAGEMAGICK_CFLAGS)
noinst_LIBRARIES = libimage.a
diff --git a/src/libjitter/Makefile.am b/src/libjitter/Makefile.am
index 506ef87..81ed4c3 100644
--- a/src/libjitter/Makefile.am
+++ b/src/libjitter/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
noinst_LIBRARIES = libjitter.a
diff --git a/src/libjitter/jitter.c b/src/libjitter/jitter.c
index 1de03c2..1a7b619 100644
--- a/src/libjitter/jitter.c
+++ b/src/libjitter/jitter.c
@@ -21,12 +21,13 @@
*
* Storing:
*
- * Each saved frame is sorted into the list of packages by their sequence
- * number.
+ * Each saved frame is sorted into the list of packages by their timestamp.
*
- * The first packet will be stored with a delay of minimum jitter window size.
+ * The first packet will be stored with a timestamp offset of minimum jitter
+ * window size or half of the target size, depending on the adaptive jitter
+ * buffer flag.
*
- * Packets with the same sequence are dropped.
+ * Packets with the same timestamp are dropped.
*
* Early packts that exceed maximum jitter window size cause jitter
* window to shift into the future.
@@ -35,37 +36,36 @@
* delay). Minimum jitter window size is added also, to prevent subsequent
* packets from beeing late too.
*
- * If no sequence is provided (autosequence), the sequence number is generated
- * by a counter. Also the timestamp is generated by counting the length of each
- * frame.
+ * If adaptive jitter buffer is used, a delay that exceed the target size
+ * is reduced to the target size.
*
- * If ssrc changes, the buffer is reset.
+ * If ssrc changes, the buffer is reset, but not locked again.
*
*
- * Playout:
+ * Loading:
*
- * The caller of the playout function can request any length of samples from
- * the packet list. The packt's time stamp and the jitter window time stamp
- * indicate what portion of a packet is already provided to the caller.
- * Complete packet, sent to the caller, are removed.
+ * jitter_offset() will return the number of samples between the jitter buffer's head and the first packet afterwards. Packets that already passed the jitter buffer's head are ignored. If no frame is ahead the jitter buffer's head, a negative value is returned.
*
- * Missing packets are interpolated by repeating last 20ms of audio (optional)
- * or by inserting zeroes (sample size > 1 byte) or by inserting 0xff (sample
- * size = 1). In case of repeating audio, the number of turns are limited until
- * buffer is reset to silence, if no frames are received for a certain time.
+ * jitter_load() will remove and return the frame at the jitter buffer's head. Packet that already passed the jitter buffer's head are deleted. If no frame matches the jitter buffer's head, NULL is returned.
*
- * Optionally the constant delay will be measured continuously and lowered if
- * greater than minimum window size. (adaptive jitter buffer size)
+ * jitter_advance() will advance the jitter buffer's head by the given number of samples.
*
- * Note that the delay is measured with time stamp of frame, no matter what
- * the length is. Length is an extra delay, but not considered here.
+ * jitter_load_samples() will read decoded samples from jitter buffer's frames.
+ * This means that that the decoder of each frame must generate samples of equal type and size.
+ * If there is a gap between jitter buffer's head and the next frame, the samples are taken from the last frame.
+ * The conceal function is called in this case, to extrapolate the missing samples.
+ * If no conceal function is given, the last frame is repeated.
+ * If there is no gap between jitter buffer's head and the next frame, the frame is decoded and the samples are taken from that frame.
+ * After that the jitter buffer's head is advanced by the number of samples read.
+ *
+ * *TBD*
*
*
* Unlocking:
*
* If the buffer is created or reset, the buffer is locked, so no packets are
- * stored. When the playout routine is called, the buffer is unlocked. This
- * prevents from filling the buffer before playout is performed, which would
+ * stored. When the loading routine is called, the buffer is unlocked. This
+ * prevents from filling the buffer before loading is performed, which would
* cause high delay.
*
*/
@@ -77,38 +77,24 @@
#include <errno.h>
#include <math.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "jitter.h"
#define INITIAL_DELAY_INTERVAL 0.5
#define REPEAT_DELAY_INTERVAL 3.0
-#define EXTRA_BUFFER 0.020 // 20 ms
-#define EXTRA_TIMEOUT 0.500 // maximum time to repeat extrapolation buffer
/* uncomment to enable heavy debugging */
//#define HEAVY_DEBUG
+//#define VISUAL_DEBUG
static int unnamed_count = 1;
/* create jitter buffer */
-int jitter_create(jitter_t *jb, const char *name, double samplerate, int sample_size, double target_window_duration, double max_window_duration, uint32_t window_flags)
+int jitter_create(jitter_t *jb, const char *name, double samplerate, double target_window_duration, double max_window_duration, uint32_t window_flags)
{
int rc = 0;
- memset(jb, 0, sizeof(*jb));
- jb->sample_duration = 1.0 / samplerate;
- jb->sample_size = sample_size;
- jb->target_window_size = (int)(samplerate * target_window_duration);
- jb->max_window_size = (int)(samplerate * max_window_duration);
- jb->window_flags = window_flags;
- jb->extra_size = (int)(EXTRA_BUFFER * samplerate);
- jb->extra_samples = calloc(sample_size, jb->extra_size);
- if (!jb->extra_samples) {
- PDEBUG(DJITTER, DEBUG_ERROR, "No memory for frame.\n");
- rc = -ENOMEM;
- goto error;
- }
- jb->extra_timeout_max = (int)ceil(EXTRA_TIMEOUT / EXTRA_BUFFER);
+ memset(jb, 0, sizeof(*jb));
/* optionally give a string to be show with the debug */
if (name && *name)
@@ -116,36 +102,37 @@ int jitter_create(jitter_t *jb, const char *name, double samplerate, int sample_
else
snprintf(jb->name, sizeof(jb->name) - 1, "(unnamed %d) ", unnamed_count++);
+ jb->sample_duration = 1.0 / samplerate;
+ jb->samples_20ms = samplerate / 50;
+ jb->target_window_size = (int)ceil(target_window_duration / jb->sample_duration);
+ jb->max_window_size = (int)ceil(max_window_duration / jb->sample_duration);
+ jb->window_flags = window_flags;
+
jitter_reset(jb);
- PDEBUG(DJITTER, DEBUG_INFO, "%sCreated jitter buffer. (samplerate=%.0f, target_window=%.0fms, max_window=%.0fms, flag:latency=%s flag:repeat=%s)\n", jb->name, samplerate, target_window_duration * 1000.0, max_window_duration * 1000.0, (window_flags & JITTER_FLAG_LATENCY) ? "true" : "false", (window_flags & JITTER_FLAG_REPEAT) ? "true" : "false");
+ LOGP(DJITTER, LOGL_INFO, "%s Created jitter buffer. (samperate=%.0f, target_window=%.0fms, max_window=%.0fms, flag:latency=%s flag:repeat=%s)\n",
+ jb->name,
+ samplerate,
+ (double)jb->target_window_size * jb->sample_duration * 1000.0,
+ (double)jb->max_window_size * jb->sample_duration * 1000.0,
+ (window_flags & JITTER_FLAG_LATENCY) ? "true" : "false",
+ (window_flags & JITTER_FLAG_REPEAT) ? "true" : "false");
-error:
- if (rc)
- jitter_destroy(jb);
return rc;
}
-static void clear_extra_buffer(jitter_t *jb)
-{
- if (jb->sample_size == 1)
- memset(jb->extra_samples, 0xff, jb->sample_size * jb->extra_size);
- else
- memset(jb->extra_samples, 0, jb->sample_size * jb->extra_size);
-}
-
/* reset jitter buffer */
void jitter_reset(jitter_t *jb)
{
jitter_frame_t *jf, *temp;
- PDEBUG(DJITTER, DEBUG_INFO, "%sReset jitter buffer.\n", jb->name);
+ LOGP(DJITTER, LOGL_INFO, "%s Reset jitter buffer.\n", jb->name);
/* jitter buffer locked */
- jb->unlocked = 0;
+ jb->unlocked = false;
/* window becomes invalid */
- jb->window_valid = 0;
+ jb->window_valid = false;
/* remove all pending frames */
jf = jb->frame_list;
@@ -156,269 +143,410 @@ void jitter_reset(jitter_t *jb)
}
jb->frame_list = NULL;
- /* clear extrapolation buffer */
- if (jb->extra_samples)
- clear_extra_buffer(jb);
- jb->extra_index = 0;
- jb->extra_timeout_count = jb->extra_timeout_max; /* no data in buffer yet, so we set timeout condition */
-
- /* delay measurement and reduction */
- jb->delay_counter = 0.0;
- jb->delay_interval = INITIAL_DELAY_INTERVAL;
- jb->min_delay_value = -1;
+ /* remove current sample buffer */
+ free(jb->spl_buf);
+ jb->spl_buf = NULL;
+ jb->spl_valid = false;
}
void jitter_destroy(jitter_t *jb)
{
jitter_reset(jb);
- PDEBUG(DJITTER, DEBUG_INFO, "%sDestroying jitter buffer.\n", jb->name);
+ LOGP(DJITTER, LOGL_INFO, "%s Destroying jitter buffer.\n", jb->name);
+}
+
+jitter_frame_t *jitter_frame_alloc(void (*decoder)(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void *priv), void *decoder_priv, uint8_t *data, int size, uint8_t marker, uint16_t sequence, uint32_t timestamp, uint32_t ssrc)
+{
+ jitter_frame_t *jf;
- if (jb->extra_samples) {
- free(jb->extra_samples);
- jb->extra_samples = NULL;
+ jf = malloc(sizeof(*jf) + size);
+ if (!jf) {
+ LOGP(DJITTER, LOGL_ERROR, "No memory for frame.\n");
+ return NULL;
}
+ memset(jf, 0, sizeof(*jf)); // note: clear header only
+ jf->decoder = decoder;
+ jf->decoder_priv = decoder_priv;
+ memcpy(jf->data, data, size);
+ jf->size = size;
+ jf->marker = marker;
+ jf->sequence = sequence;
+ jf->timestamp = timestamp;
+ jf->ssrc = ssrc;
+
+ return jf;
+}
+
+void jitter_frame_free(jitter_frame_t *jf)
+{
+ free(jf);
}
-/* store audio in jitterbuffer
+void jitter_frame_get(jitter_frame_t *jf, void (**decoder)(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void *priv), void **decoder_priv, uint8_t **data, int *size, uint8_t *marker, uint16_t *sequence, uint32_t *timestamp, uint32_t *ssrc)
+{
+ if (decoder)
+ *decoder = jf->decoder;
+ if (decoder_priv)
+ *decoder_priv = jf->decoder_priv;
+ if (data)
+ *data = jf->data;
+ if (size)
+ *size = jf->size;
+ if (marker)
+ *marker = jf->marker;
+ if (sequence)
+ *sequence = jf->sequence;
+ if (timestamp)
+ *timestamp = jf->timestamp;
+ if (ssrc)
+ *ssrc = jf->ssrc;
+}
+
+/* Store frame in jitterbuffer
*
- * stop if buffer is completely filled
+ * Use sequence number to order frames.
+ * Use timestamp to handle delay.
*/
-void jitter_save(jitter_t *jb, void *samples, int length, int has_sequence, uint16_t sequence, uint32_t timestamp, uint32_t ssrc)
+void jitter_save(jitter_t *jb, jitter_frame_t *jf)
{
- jitter_frame_t *jf, **jfp;
- int16_t offset_sequence;
+ jitter_frame_t **jfp;
int32_t offset_timestamp;
/* ignore frames until the buffer is unlocked by jitter_load() */
- if (!jb->unlocked)
- return;
-
- /* omit frames with no data */
- if (length < 1)
+ if (!jb->unlocked) {
+ jitter_frame_free(jf);
return;
-
- /* generate sequence and timestamp automatically, if enabled */
- if (!has_sequence) {
-#ifdef DEBUG_JITTER
- PDEBUG(DJITTER, DEBUG_DEBUG, "%sSave frame of %d samples (no seqence).\n", jb->name, length);
-#endif
- sequence = jb->next_sequence;
- jb->next_sequence++;
- timestamp = jb->next_timestamp;
- jb->next_timestamp += length;
- ssrc = jb->window_ssrc;
- } else {
-#ifdef HEAVY_DEBUG
- PDEBUG(DJITTER, DEBUG_DEBUG, "%sSave frame of %d samples (seqence=%u timestamp=%u ssrc=0x%02x).\n", jb->name, length, sequence, timestamp, ssrc);
-#endif
- jb->next_sequence = sequence + 1;
- jb->next_timestamp = timestamp + length;
}
/* first packet (with this ssrc) sets window size to target_window_size */
- if (!jb->window_valid || jb->window_ssrc != ssrc) {
+ if (!jb->window_valid || jb->window_ssrc != jf->ssrc) {
if (!jb->window_valid)
- PDEBUG(DJITTER, DEBUG_DEBUG, "%s Initial frame after init or reset.\n", jb->name);
+ LOGP(DJITTER, LOGL_DEBUG, "%s Initial frame after init or reset.\n", jb->name);
else
- PDEBUG(DJITTER, DEBUG_DEBUG, "%s SSRC changed.\n", jb->name);
+ LOGP(DJITTER, LOGL_DEBUG, "%s SSRC changed.\n", jb->name);
// NOTE: Reset must be called before finding the frame location below, because there will be no frame in list anymore!
jitter_reset(jb);
- jb->unlocked = 1;
+ jb->unlocked = true;
/* when using dynamic jitter buffer, we use half of the target delay */
if ((jb->window_flags & JITTER_FLAG_LATENCY)) {
- jb->window_timestamp = timestamp - (uint32_t)jb->target_window_size / 2;
+ jb->window_timestamp = jf->timestamp - (uint32_t)jb->target_window_size / 2;
} else {
- jb->window_timestamp = timestamp - (uint32_t)jb->target_window_size;
+ jb->window_timestamp = jf->timestamp - (uint32_t)jb->target_window_size;
}
- jb->window_valid = 1;
- jb->window_ssrc = ssrc;
+ jb->window_valid = true;
+ jb->window_ssrc = jf->ssrc;
+ jb->min_delay = -1;
+ jb->delay_counter = 0.0;
+ jb->delay_interval = INITIAL_DELAY_INTERVAL;
+ }
+
+ /* reduce delay */
+ if (jb->delay_counter >= jb->delay_interval) {
+ if (jb->min_delay >= 0)
+ LOGP(DJITTER, LOGL_DEBUG, "%s Statistics: target_window_delay=%.0fms max_window_delay=%.0fms current min_delay=%.0fms\n",
+ jb->name,
+ (double)jb->target_window_size * jb->sample_duration * 1000.0,
+ (double)jb->max_window_size * jb->sample_duration * 1000.0,
+ (double)jb->min_delay * jb->sample_duration * 1000.0);
+ /* delay reduction, if minimum delay is greater than target jitter window size */
+ if ((jb->window_flags & JITTER_FLAG_LATENCY) && jb->min_delay > jb->target_window_size) {
+ LOGP(DJITTER, LOGL_DEBUG, "%s Reducing current minimum delay of %.0fms, because maximum delay is greater than target window size of %.0fms.\n",
+ jb->name,
+ (double)jb->min_delay * jb->sample_duration * 1000.0,
+ (double)jb->target_window_size * jb->sample_duration * 1000.0);
+ /* only reduce delay to half of the target window size */
+ jb->window_timestamp += jb->min_delay - jb->target_window_size / 2;
+
+ }
+ jb->delay_counter -= jb->delay_interval;
+ jb->delay_interval = REPEAT_DELAY_INTERVAL;
+ jb->min_delay = -1;
}
/* find location where to put frame into the list, depending on sequence number */
jfp = &jb->frame_list;
while(*jfp) {
- offset_sequence = (int16_t)(sequence - (*jfp)->sequence);
+ offset_timestamp = (int16_t)(jf->timestamp - (*jfp)->timestamp);
/* found double entry */
- if (offset_sequence == 0) {
- PDEBUG(DJITTER, DEBUG_DEBUG, "%s Dropping double packet (sequence = %d)\n", jb->name, sequence);
+ if (offset_timestamp == 0) {
+ LOGP(DJITTER, LOGL_DEBUG, "%s Dropping double packet (timestamp = %u)\n", jb->name, jf->timestamp);
+ jitter_frame_free(jf);
return;
}
/* offset is negative, so we found the position to insert frame */
- if (offset_sequence < 0)
+ if (offset_timestamp < 0)
break;
jfp = &((*jfp)->next);
}
- offset_timestamp = timestamp - jb->window_timestamp;
+ offset_timestamp = jf->timestamp - jb->window_timestamp;
#ifdef HEAVY_DEBUG
- PDEBUG(DJITTER, DEBUG_DEBUG, "%sFrame has offset of %.0fms in jitter buffer.\n", jb->name, (double)offset_timestamp * jb->sample_duration * 1000.0);
+ LOGP(DJITTER, LOGL_DEBUG, "%s Frame has offset of %.0fms in jitter buffer.\n", jb->name, (double)offset_timestamp * jb->sample_duration * 1000.0);
#endif
/* measure delay */
- if (jb->min_delay_value < 0 || offset_timestamp < jb->min_delay_value)
- jb->min_delay_value = offset_timestamp;
+ if (jb->min_delay < 0 || offset_timestamp < jb->min_delay)
+ jb->min_delay = offset_timestamp;
/* if frame is too early (delay ceases), shift window to the future */
if (offset_timestamp > jb->max_window_size) {
if ((jb->window_flags & JITTER_FLAG_LATENCY)) {
- PDEBUG(DJITTER, DEBUG_DEBUG, "%s Frame too early: Shift jitter buffer to the future, to make the frame fit to the end. (offset_timestamp(%d) > max_window_size(%d))\n", jb->name, offset_timestamp, jb->max_window_size);
+ LOGP(DJITTER, LOGL_DEBUG, "%s Frame too early: Shift jitter buffer to the future, to make the frame fit to the end. (offset_sequence(%d) > max_window_size(%d))\n", jb->name, offset_timestamp, jb->max_window_size);
/* shift window so it fits to the end of window */
- jb->window_timestamp = timestamp - jb->max_window_size;
+ jb->window_timestamp = jf->timestamp - jb->max_window_size;
+ jb->min_delay = -1;
+ jb->delay_counter = 0.0;
+ jb->delay_interval = REPEAT_DELAY_INTERVAL;
} else {
- PDEBUG(DJITTER, DEBUG_DEBUG, "%s Frame too early: Shift jitter buffer to the future, to make the frame fit to the target delay. (offset_timestamp(%d) > max_window_size(%d))\n", jb->name, offset_timestamp, jb->max_window_size);
+ LOGP(DJITTER, LOGL_DEBUG, "%s Frame too early: Shift jitter buffer to the future, to make the frame fit to the target delay. (offset_sequence(%d) > max_window_size(%d))\n", jb->name, offset_timestamp, jb->max_window_size);
/* shift window so frame fits to the start of window + target delay */
- jb->window_timestamp = timestamp - (uint32_t)(jb->target_window_size);
+ jb->window_timestamp = jf->timestamp - jb->target_window_size;
+ jb->min_delay = -1;
+ jb->delay_counter = 0.0;
+ jb->delay_interval = REPEAT_DELAY_INTERVAL;
}
}
/* is frame is too late, shift window to the past. */
if (offset_timestamp < 0) {
if ((jb->window_flags & JITTER_FLAG_LATENCY)) {
- PDEBUG(DJITTER, DEBUG_DEBUG, "%s Frame too late: Shift jitter buffer to the past, and add target window size. (offset_timestamp(%d) < 0)\n", jb->name, offset_timestamp);
+ LOGP(DJITTER, LOGL_DEBUG, "%s Frame too late: Shift jitter buffer to the past, and add target window size. (offset_sequence(%d) < 0)\n", jb->name, offset_timestamp);
/* shift window so frame fits to the start of window + half of target delay */
- jb->window_timestamp = timestamp - (uint32_t)(jb->target_window_size) / 2;
+ jb->window_timestamp = jf->timestamp - jb->target_window_size / 2;
+ jb->min_delay = -1;
+ jb->delay_counter = 0.0;
+ jb->delay_interval = REPEAT_DELAY_INTERVAL;
} else {
- PDEBUG(DJITTER, DEBUG_DEBUG, "%s Frame too late: Shift jitter buffer to the past, and add half target window size. (offset_timestamp(%d) < 0)\n", jb->name, offset_timestamp);
+ LOGP(DJITTER, LOGL_DEBUG, "%s Frame too late: Shift jitter buffer to the past, and add half target window size. (offset_sequence(%d) < 0)\n", jb->name, offset_timestamp);
/* shift window so frame fits to the start of window + target delay */
- jb->window_timestamp = timestamp - (uint32_t)(jb->target_window_size);
+ jb->window_timestamp = jf->timestamp - jb->target_window_size;
+ jb->min_delay = -1;
+ jb->delay_counter = 0.0;
+ jb->delay_interval = REPEAT_DELAY_INTERVAL;
}
}
/* insert or append frame */
#ifdef HEAVY_DEBUG
- PDEBUG(DJITTER, DEBUG_DEBUG, "%s Store frame\n", jb->name);
+ #include <time.h>
+ static struct timespec tv;
+ clock_gettime(CLOCK_REALTIME, &tv);
+ LOGP(DJITTER, LOGL_DEBUG, "%s Store frame. %ld.%04ld\n", jb->name, tv.tv_sec, tv.tv_nsec / 1000000);
#endif
- jf = malloc(sizeof(*jf) + length * jb->sample_size);
- if (!jf) {
- PDEBUG(DJITTER, DEBUG_ERROR, "No memory for frame.\n");
- return;
- }
- memset(jf, 0, sizeof(*jf)); // note: clear header only
- jf->sequence = sequence;
- jf->timestamp = timestamp;
- memcpy(jf->samples, samples, length * jb->sample_size);
- jf->length = length;
jf->next = *jfp;
*jfp = jf;
}
-/* get audio from jitterbuffer
- */
-void jitter_load(jitter_t *jb, void *samples, int length)
+/* get offset to next chunk, return -1, if there is no */
+int32_t jitter_offset(jitter_t *jb)
{
jitter_frame_t *jf;
- int32_t count, count2, index;
+ int16_t offset_timestamp = 0;
+
+ /* now unlock jitter buffer */
+ jb->unlocked = true;
+
+ /* get timestamp of chunk that is not in the past */
+ for (jf = jb->frame_list; jf; jf = jf->next) {
+ offset_timestamp = jf->timestamp - jb->window_timestamp;
+ if (offset_timestamp >= 0)
+ break;
+ }
+
+ return (jf) ? offset_timestamp : -1;
+}
+
+/* get next data chunk from jitterbuffer */
+jitter_frame_t *jitter_load(jitter_t *jb)
+{
+ jitter_frame_t *jf;
+ int32_t offset_timestamp;
#ifdef HEAVY_DEBUG
- PDEBUG(DJITTER, DEBUG_DEBUG, "%sLoad chunk of %d samples.\n", jb->name, length);
+ static struct timespec tv;
+ clock_gettime(CLOCK_REALTIME, &tv);
+ LOGP(DJITTER, LOGL_DEBUG, "%s Load frame. %ld.%04ld\n", jb->name, tv.tv_sec, tv.tv_nsec / 1000000);
#endif
/* now unlock jitter buffer */
- jb->unlocked = 1;
+ jb->unlocked = true;
- /* reduce delay */
- jb->delay_counter += jb->sample_duration * (double)length;
- if (jb->delay_counter >= jb->delay_interval) {
- if (jb->min_delay_value >= 0)
- PDEBUG(DJITTER, DEBUG_DEBUG, "%s Statistics: target_window_delay=%.0fms max_window_delay=%.0fms current min_delay=%.0fms\n", jb->name, (double)jb->target_window_size * jb->sample_duration * 1000.0, (double)jb->max_window_size * jb->sample_duration * 1000.0, (double)jb->min_delay_value * jb->sample_duration * 1000.0);
- /* delay reduction, if maximum delay is greater than target jitter window size */
- if ((jb->window_flags & JITTER_FLAG_LATENCY) && jb->min_delay_value > jb->target_window_size) {
- PDEBUG(DJITTER, DEBUG_DEBUG, "%s Reducing current minimum delay of %.0fms, because maximum delay is greater than target window size of %.0fms.\n", jb->name, (double)jb->min_delay_value * jb->sample_duration * 1000.0, (double)jb->target_window_size * jb->sample_duration * 1000.0);
- /* only reduce delay to half of the target window size */
- jb->window_timestamp += jb->min_delay_value - jb->target_window_size / 2;
+ /* get current chunk, free all chunks that are in the past */
+ while ((jf = jb->frame_list)) {
+ offset_timestamp = jf->timestamp - jb->window_timestamp;
+ if (offset_timestamp >= 0)
+ break;
+ /* detach and free */
+ jb->frame_list = jf->next;
+ jitter_frame_free(jf);
+ }
- }
- jb->delay_counter -= jb->delay_interval;
- jb->delay_interval = REPEAT_DELAY_INTERVAL;
- jb->min_delay_value = -1;
+ /* next frame in the future */
+ if (jf && jf->timestamp != jb->window_timestamp)
+ return NULL;
+
+ /* detach, and return */
+ if (jf)
+ jb->frame_list = jf->next;
+ return jf;
+}
+
+/* advance time stamp of jitter buffer */
+void jitter_advance(jitter_t *jb, uint32_t offset)
+{
+ if (!jb->window_valid)
+ return;
+
+ jb->window_timestamp += offset;
+
+ /* increment timer to check delay */
+ jb->delay_counter += jb->sample_duration * (double)offset;
+}
+
+/* load samples from jitter buffer
+ * store in spl_buf until all copied
+ * conceal, if frame is missing
+ * ceate silence, if no spl_buf exists in the first place */
+void jitter_load_samples(jitter_t *jb, uint8_t *spl, int len, size_t sample_size, void (*conceal)(uint8_t *spl, int len, void *priv), void *conceal_priv)
+{
+ jitter_frame_t *jf;
+ int32_t offset;
+ void (*decoder)(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void *priv);
+ void *decoder_priv;
+ uint8_t *payload;
+ int payload_len;
+ int tocopy;
+
+#ifdef VISUAL_DEBUG
+ int32_t offset_timestamp;
+ char debug[jb->max_window_size + 32];
+ int last = 0;
+ memset(debug, ' ', sizeof(debug));
+ for (jf = jb->frame_list; jf; jf = jf->next) {
+ offset_timestamp = jf->timestamp - jb->window_timestamp;
+ if (offset_timestamp < 0)
+ continue;
+ offset_timestamp = (int)((double)offset_timestamp * jb->sample_duration * 1000.0);
+ debug[offset_timestamp] = '0' + jf->sequence % 10;
+ last = offset_timestamp + 1;
}
+ debug[last] = '\0';
+ LOGP(DJITTER, LOGL_DEBUG, "%s:%s\n", jb->name, debug);
+#endif
- /* process all frames until output buffer is loaded */
- while (length) {
- /* always get frame with the lowest sequence number (1st frame) */
- jf = jb->frame_list;
-
- if (jf) {
- count = jf->timestamp - jb->window_timestamp;
- if (count > length)
- count = length;
- } else
- count = length;
- /* if there is no frame or we have not reached frame's time stamp, extrapolate */
- if (count > 0) {
+next_chunk:
+ /* nothing more to return */
+ if (!len)
+ return;
+
+copy_chunk:
+ /* consume from buffer, if valid */
+ if (jb->spl_buf && jb->spl_valid) {
+ tocopy = jb->spl_len - jb->spl_pos;
+ if (tocopy > len)
+ tocopy = len;
#ifdef HEAVY_DEBUG
- if (jf)
- PDEBUG(DJITTER, DEBUG_DEBUG, "%s There is a frame ahead in buffer after %d samples. Interpolating gap.\n", jb->name, jf->timestamp - jb->window_timestamp);
- else
- PDEBUG(DJITTER, DEBUG_DEBUG, "%s There is no frame ahead in buffer. Interpolating gap.\n", jb->name);
+ LOGP(DJITTER, LOGL_DEBUG, "%s loading %d samples: from valid sample buffer.\n", jb->name, tocopy);
#endif
- /* extrapolate by playing the extrapolation buffer */
- while (count) {
- count2 = count;
- if (count2 > jb->extra_size - jb->extra_index)
- count2 = jb->extra_size - jb->extra_index;
- memcpy(samples, (uint8_t *)jb->extra_samples + jb->extra_index * jb->sample_size, count2 * jb->sample_size);
- jb->extra_index += count2;
- if (jb->extra_index == jb->extra_size) {
- jb->extra_index = 0;
- if ((jb->window_flags & JITTER_FLAG_REPEAT) && jb->extra_timeout_count < jb->extra_timeout_max) {
- jb->extra_timeout_count++;
- if (jb->extra_timeout_count == jb->extra_timeout_max) {
+ /* advance jitter buffer */
+ jitter_advance(jb, tocopy);
+ memcpy(spl, jb->spl_buf + jb->spl_pos * sample_size, tocopy * sample_size);
+ spl += tocopy * sample_size;
+ len -= tocopy;
+ jb->spl_pos += tocopy;
+ if (jb->spl_pos == jb->spl_len) {
+ jb->spl_pos = 0;
+ jb->spl_valid = false;
+ }
+ goto next_chunk;
+ }
+
+ /* get offset to next frame in jitter buffer */
+ offset = jitter_offset(jb);
+ /* jitter buffer is empty, so we must conceal all samples we have */
+ if (offset < 0)
+ offset = len;
+ /* if we have an offset, we need to conceal the samples */
+ if (offset > 0) {
+ /* only process as much samples as need */
+ if (offset > len)
+ offset = len;
#ifdef HEAVY_DEBUG
- PDEBUG(DJITTER, DEBUG_DEBUG, "%s Repeated jitter buffer enough, clearing to silence.\n", jb->name);
+ LOGP(DJITTER, LOGL_DEBUG, "%s concealing %d samples: from invalid sample buffer.\n", jb->name, offset);
#endif
- clear_extra_buffer(jb);
- }
- }
- }
- samples = (uint8_t *)samples + count2 * jb->sample_size;
- length -= count2;
- jb->window_timestamp += count2;
- count -= count2;
- }
- if (length == 0)
- return;
+ /* advance jitter buffer */
+ jitter_advance(jb, offset);
+ /* if there is no buffer, allocate 20ms, filled with 0 */
+ if (!jb->spl_buf) {
+ jb->spl_len = jb->samples_20ms;
+ jb->spl_buf = calloc(jb->spl_len, sample_size);
+ }
+ /* do until all samples are processed */
+ while (offset) {
+ tocopy = jb->spl_len - jb->spl_pos;
+ if (tocopy > offset)
+ tocopy = offset;
+ if (conceal)
+ conceal(jb->spl_buf + jb->spl_pos * sample_size, tocopy, conceal_priv);
+ memcpy(spl, jb->spl_buf + jb->spl_pos * sample_size, tocopy * sample_size);
+ spl += tocopy * sample_size;
+ len -= tocopy;
+ jb->spl_pos += tocopy;
+ if (jb->spl_pos == jb->spl_len)
+ jb->spl_pos = 0;
+ offset -= tocopy;
}
+ goto next_chunk;
+ }
- /* copy samples from frame (what is not in the past) */
- index = jb->window_timestamp - jf->timestamp;
- while (index < jf->length) {
- /* use the lowest value of 'playout length' or 'remaining packet length' */
- count = length;
- if (jf->length - index < count)
- count = jf->length - index;
- /* if extrapolation is to be written, limit count to what we can store into buffer */
- if ((jb->window_flags & JITTER_FLAG_REPEAT) && jb->extra_size - jb->extra_index < count)
- count = jb->extra_size - jb->extra_index;
- /* copy samples from packet to play out, increment sample pointer and decrement length */
+ /* load from jitter buffer (it should work, because offset equals 0 */
+ jf = jitter_load(jb);
+ if (!jf) {
+ LOGP(DJITTER, LOGL_ERROR, "%s Failed to get frame from jitter buffer, please fix!\n", jb->name);
+ jitter_reset(jb);
+ return;
+ }
#ifdef HEAVY_DEBUG
- PDEBUG(DJITTER, DEBUG_DEBUG, "%s Copy data (offset=%u count=%u) from frame (sequence=%u timestamp=%u length=%u).\n", jb->name, index, count, jf->sequence, jf->timestamp, jf->length);
+ LOGP(DJITTER, LOGL_DEBUG, "%s loading new frame to sample buffer.\n", jb->name);
#endif
- memcpy(samples, (uint8_t *)jf->samples + index * jb->sample_size, count * jb->sample_size);
- samples = (uint8_t *)samples + count * jb->sample_size;
- length -= count;
- /* copy frame data to extrapolation buffer also, increment index */
- if ((jb->window_flags & JITTER_FLAG_REPEAT)) {
- memcpy((uint8_t *)jb->extra_samples + jb->extra_index * jb->sample_size, (uint8_t *)jf->samples + index * jb->sample_size, count * jb->sample_size);
- jb->extra_index += count;
- if (jb->extra_index == jb->extra_size)
- jb->extra_index = 0;
- jb->extra_timeout_count = 0; /* now we have new data, we reset timeout condition */
- }
- /* increment time stamp */
- jb->window_timestamp += count;
- index += count;
- /* if there was enough to play out, we are done */
- if (length == 0)
- return;
+ /* get data from frame */
+ jitter_frame_get(jf, &decoder, &decoder_priv, &payload, &payload_len, NULL, NULL, NULL, NULL);
+ /* free previous buffer */
+ free(jb->spl_buf);
+ jb->spl_buf = NULL;
+ jb->spl_pos = 0;
+ /* decode */
+ if (decoder) {
+ decoder(payload, payload_len, &jb->spl_buf, &jb->spl_len, decoder_priv);
+ if (!jb->spl_buf) {
+ jitter_frame_free(jf);
+ return;
}
+ } else {
+ /* no decoder, so just copy as it is */
+ jb->spl_buf = malloc(payload_len);
+ if (!jb->spl_buf) {
+ jitter_frame_free(jf);
+ return;
+ }
+ memcpy(jb->spl_buf, payload, payload_len);
+ jb->spl_len = payload_len;
+ }
+ jb->spl_len /= sample_size;
+ jb->spl_valid = true;
+ /* free jiter frame */
+ jitter_frame_free(jf);
+ goto copy_chunk;
+}
- /* free frame, because all samples are now in the past */
- jb->frame_list = jf->next;
- free(jf);
+void jitter_conceal_s16(uint8_t *_spl, int len, void __attribute__((unused)) *priv)
+{
+ int16_t *spl = (int16_t *)_spl;
- /* now go for next loop, in case there is still date to play out */
+ while (len) {
+ *spl++ /= 1.5;
+ len--;
}
}
diff --git a/src/libjitter/jitter.h b/src/libjitter/jitter.h
index dc618cb..c4886fd 100644
--- a/src/libjitter/jitter.h
+++ b/src/libjitter/jitter.h
@@ -4,57 +4,64 @@
#define JITTER_FLAG_REPEAT (1 << 1) // repeat audio to extrapolate gaps
/* window settings for low latency audio and extrapolation of gaps */
-#define JITTER_AUDIO 0.050, 1.000, JITTER_FLAG_LATENCY | JITTER_FLAG_REPEAT
+#define JITTER_AUDIO 0.060, 1.000, JITTER_FLAG_LATENCY | JITTER_FLAG_REPEAT
/* window settings for analog data (fax/modem) or digial data (HDLC) */
#define JITTER_DATA 0.100, 0.200, JITTER_FLAG_NONE
typedef struct jitter_frame {
struct jitter_frame *next;
+ void (*decoder)(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void *priv);
+ void *decoder_priv;
+ uint8_t marker;
uint16_t sequence;
uint32_t timestamp;
- int length;
- uint8_t samples[0];
+ uint32_t ssrc;
+ int size;
+ uint8_t data[0];
} jitter_frame_t;
typedef struct jitter {
char name[64];
- /* sample properties */
- int sample_size;
- double sample_duration;
-
- /* automatic sequence generation */
- uint16_t next_sequence;
- uint32_t next_timestamp;
+ /* frame properties */
+ double sample_duration; /* duration of a frame (ms) */
+ int samples_20ms; /* samples to compensate a gap of unknown size */
/* window properties */
- int unlocked;
- uint32_t window_flags;
- int target_window_size;
- int max_window_size;
- int window_valid;
- uint32_t window_ssrc;
- uint32_t window_timestamp;
+ bool unlocked; /* jitter buffer will be locked until some reads from it */
+ uint32_t window_flags; /* flags to alter behaviour of jitter buffer */
+ int target_window_size; /* target size of window (frames) */
+ int max_window_size; /* maximum size of window (frames) */
+ bool window_valid; /* set, if first frame has been received */
+ uint32_t window_ssrc; /* current sync source of window */
+ uint32_t window_timestamp; /* lowest timestamp number in window */
/* reduction of delay */
- double delay_interval;
- double delay_counter;
- int32_t min_delay_value;
-
- /* extrapolation */
- int extra_size;
- int extra_index;
- void *extra_samples;
- int extra_timeout_max;
- int extra_timeout_count;
+ double delay_interval; /* interval for delay measurement (seconds) */
+ double delay_counter; /* current counter to count interval (seconds) */
+ int min_delay; /* minimum delay measured during interval (frames) */
/* list of frames */
jitter_frame_t *frame_list;
+
+ /* sample buffer (optional) */
+ uint8_t *spl_buf; /* current samples buffer */
+ int spl_pos; /* position of in buffer */
+ int spl_len; /* total buffer size */
+ bool spl_valid; /* if buffer has valid frame (not repeated) */
+
} jitter_t;
-int jitter_create(jitter_t *jb, const char *name, double samplerate, int sample_size, double target_window_duration, double max_window_duration, uint32_t window_flags);
+int jitter_create(jitter_t *jb, const char *name, double samplerate, double target_window_duration, double max_window_duration, uint32_t window_flags);
void jitter_reset(jitter_t *jb);
void jitter_destroy(jitter_t *jb);
-void jitter_save(jitter_t *jb, void *samples, int length, int has_sequence, uint16_t sequence, uint32_t timestamp, uint32_t ssrc);
-void jitter_load(jitter_t *jb, void *samples, int length);
+jitter_frame_t *jitter_frame_alloc(void (*decoder)(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void *priv), void *decoder_priv, uint8_t *data, int size, uint8_t marker, uint16_t sequence, uint32_t timestamp, uint32_t ssrc);
+void jitter_frame_free(jitter_frame_t *jf);
+void jitter_frame_get(jitter_frame_t *jf, void (**decoder)(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void *priv), void **decoder_priv, uint8_t **data, int *size, uint8_t *marker, uint16_t *sequence, uint32_t *timestamp, uint32_t *ssrc);
+void jitter_save(jitter_t *jb, jitter_frame_t *jf);
+int32_t jitter_offset(jitter_t *jb);
+jitter_frame_t *jitter_load(jitter_t *jb);
+void jitter_advance(jitter_t *jb, uint32_t offset);
+void jitter_load_samples(jitter_t *jb, uint8_t *spl, int len, size_t sample_size, void (*conceal)(uint8_t *spl, int len, void *priv), void *conceal_priv);
+void jitter_conceal_s16(uint8_t *_spl, int len, void __attribute__((unused)) *priv);
diff --git a/src/liblogging/Makefile.am b/src/liblogging/Makefile.am
new file mode 100644
index 0000000..b0470d7
--- /dev/null
+++ b/src/liblogging/Makefile.am
@@ -0,0 +1,8 @@
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
+
+noinst_LIBRARIES = liblogging.a
+
+liblogging_a_SOURCES = \
+ logging.c \
+ categories.c
+
diff --git a/src/liblogging/categories.c b/src/liblogging/categories.c
new file mode 100644
index 0000000..b98a998
--- /dev/null
+++ b/src/liblogging/categories.c
@@ -0,0 +1,227 @@
+
+#include <osmocom/core/utils.h>
+#include <osmocom/core/logging.h>
+#include "categories.h"
+
+/* All logging categories used by this project. */
+
+struct log_info_cat log_categories[] = {
+ [DLCC] = {
+ .name = "DLCC",
+ .description = "libosmo-cc CC Layer",
+ .color = "\033[0;37m",
+ },
+ [DOPTIONS] = {
+ .name = "DOPTIONS",
+ .description = "config options",
+ .color = "\033[0;33m",
+ },
+ [DSENDER] = {
+ .name = "DSENDER",
+ .description = "transceiver instance",
+ .color = "\033[1;33m",
+ },
+ [DSOUND] = {
+ .name = "DSOUND",
+ .description = "sound io",
+ .color = "\033[0;35m",
+ },
+ [DDSP] = {
+ .name = "DDSP",
+ .description = "digital signal processing",
+ .color = "\033[0;31m",
+ },
+ [DANETZ] = {
+ .name = "DANETZ",
+ .description = "A-Netz",
+ .color = "\033[1;34m",
+ },
+ [DBNETZ] = {
+ .name = "DBNETZ",
+ .description = "B-Netz",
+ .color = "\033[1;34m",
+ },
+ [DCNETZ] = {
+ .name = "DCNETZ",
+ .description = "C-Netz",
+ .color = "\033[1;34m",
+ },
+ [DNMT] = {
+ .name = "DNMT",
+ .description = "Norisk Mobil Telefoni",
+ .color = "\033[1;34m",
+ },
+ [DAMPS] = {
+ .name = "DAMPS",
+ .description = "Advanced Mobile Phone Service",
+ .color = "\033[1;34m",
+ },
+ [DR2000] = {
+ .name = "DR2000",
+ .description = "Radiocom 2000",
+ .color = "\033[1;34m",
+ },
+ [DIMTS] = {
+ .name = "DIMTS",
+ .description = "Improved Mobile Telephone Service",
+ .color = "\033[1;34m",
+ },
+ [DMPT1327] = {
+ .name = "DMPT1327",
+ .description = "MPT-1327",
+ .color = "\033[1;34m",
+ },
+ [DJOLLY] = {
+ .name = "DJOLLY",
+ .description = "Jolly-Com",
+ .color = "\033[1;34m",
+ },
+ [DEURO] = {
+ .name = "DEUROSIGNAL",
+ .description = "Eurosignal",
+ .color = "\033[1;34m",
+ },
+ [DPOCSAG] = {
+ .name = "DPOCSAG",
+ .description = "POCSAG",
+ .color = "\033[1;34m",
+ },
+ [DGOLAY] = {
+ .name = "DGOLAY",
+ .description = "Golay",
+ .color = "\033[1;34m",
+ },
+ [DFUENF] = {
+ .name = "DFUENF",
+ .description = "5-Ton-Folge",
+ .color = "\033[1;34m",
+ },
+ [DFRAME] = {
+ .name = "DFRAME",
+ .description = "message frame",
+ .color = "\033[0;36m",
+ },
+ [DCALL] = {
+ .name = "DCALL",
+ .description = "call processing",
+ .color = "\033[0;37m",
+ },
+ [DDB] = {
+ .name = "DDB",
+ .description = "database access",
+ .color = "\033[0;33m",
+ },
+ [DTRANS] = {
+ .name = "DTRANS",
+ .description = "transaction handing",
+ .color = "\033[0;32m",
+ },
+ [DDMS] = {
+ .name = "DDMS",
+ .description = "DMS layer of NMT",
+ .color = "\033[0;33m",
+ },
+ [DSMS] = {
+ .name = "DSMS",
+ .description = "SMS layer of NMT",
+ .color = "\033[1;37m",
+ },
+ [DSDR] = {
+ .name = "DSDR",
+ .description = "Software Defined Radio",
+ .color = "\033[1;31m",
+ },
+ [DUHD] = {
+ .name = "DUHD",
+ .description = "UHD interface",
+ .color = "\033[1;35m",
+ },
+ [DSOAPY] = {
+ .name = "DSOAPY",
+ .description = "Soapy interface",
+ .color = "\033[1;35m",
+ },
+ [DWAVE] = {
+ .name = "DWAVE",
+ .description = "WAVE file handling",
+ .color = "\033[1;33m",
+ },
+ [DRADIO] = {
+ .name = "DRADIO",
+ .description = "Radio application",
+ .color = "\033[1;34m",
+ },
+ [DAM791X] = {
+ .name = "DAM791X",
+ .description = "AM791x modem chip emulation",
+ .color = "\033[0;31m",
+ },
+ [DUART] = {
+ .name = "DUART",
+ .description = "UART emulation",
+ .color = "\033[0;32m",
+ },
+ [DDEVICE] = {
+ .name = "DDEVICE",
+ .description = "CUSE device emulation",
+ .color = "\033[0;33m",
+ },
+ [DDATENKLO] = {
+ .name = "DDATENKLO",
+ .description = "Das Datenklo",
+ .color = "\033[1;34m",
+ },
+ [DZEIT] = {
+ .name = "DZEIT",
+ .description = "Zeitansage",
+ .color = "\033[1;34m",
+ },
+ [DSIM1] = {
+ .name = "DSIM1",
+ .description = "C-Netz SIM layer 1",
+ .color = "\033[0;31m",
+ },
+ [DSIM2] = {
+ .name = "DSIM2",
+ .description = "C-Netz SIM layer 2",
+ .color = "\033[0;33m",
+ },
+ [DSIMI] = {
+ .name = "DSIMI",
+ .description = "C-Netz SIM ICL layer",
+ .color = "\033[0;36m",
+ },
+ [DSIM7] = {
+ .name = "DSIM7",
+ .description = "C-Netz SIM layer 7",
+ .color = "\033[0;37m",
+ },
+ [DMTP2] = {
+ .name = "DMTP LAYER 2",
+ .description = "MTP layer 2",
+ .color = "\033[1;33m",
+ },
+ [DMTP3] = {
+ .name = "DMTP LAYER 3",
+ .description = "MTP layer 3",
+ .color = "\033[1;36m",
+ },
+ [DMUP] = {
+ .name = "DMUP",
+ .description = "C-Netz Mobile User Part",
+ .color = "\033[1;37m",
+ },
+ [DDCF77] = {
+ .name = "DDCF77",
+ .description = "DCF77 Radio Clock",
+ .color = "\033[1;34m",
+ },
+ [DJITTER] = {
+ .name = "DJITTER",
+ .description = "jitter buffer handling",
+ .color = "\033[0;36m",
+ },
+};
+
+size_t log_categories_size = ARRAY_SIZE(log_categories);
+
diff --git a/src/liblogging/categories.h b/src/liblogging/categories.h
new file mode 100644
index 0000000..c7ca7f8
--- /dev/null
+++ b/src/liblogging/categories.h
@@ -0,0 +1,50 @@
+
+enum {
+ DLCC,
+ DOPTIONS,
+ DSENDER,
+ DSOUND,
+ DDSP,
+ DANETZ,
+ DBNETZ,
+ DCNETZ,
+ DNMT,
+ DAMPS,
+ DR2000,
+ DIMTS,
+ DMPT1327,
+ DJOLLY,
+ DEURO,
+ DPOCSAG,
+ DGOLAY,
+ DFUENF,
+ DFRAME,
+ DCALL,
+ DDB,
+ DTRANS,
+ DDMS,
+ DSMS,
+ DSDR,
+ DUHD,
+ DSOAPY,
+ DWAVE,
+ DRADIO,
+ DAM791X,
+ DUART,
+ DDEVICE,
+ DDATENKLO,
+ DZEIT,
+ DSIM1,
+ DSIM2,
+ DSIMI,
+ DSIM7,
+ DMTP2,
+ DMTP3,
+ DMUP,
+ DDCF77,
+ DJITTER,
+};
+
+extern struct log_info_cat log_categories[];
+extern size_t log_categories_size;
+
diff --git a/src/liblogging/logging.c b/src/liblogging/logging.c
new file mode 100644
index 0000000..4268c06
--- /dev/null
+++ b/src/liblogging/logging.c
@@ -0,0 +1,264 @@
+/* Logging (on segmented part of the window)
+ *
+ * (C) 2016 by Andreas Eversberg <jolly@eversberg.eu>
+ * All Rights Reserved
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <sys/ioctl.h>
+#include <math.h>
+#include <errno.h>
+#include <osmocom/core/utils.h>
+#include <osmocom/core/application.h>
+#include <osmocom/cc/misc.h>
+#include "logging.h"
+
+int loglevel = LOGL_INFO;
+
+static int scroll_window_start = 0;
+static int scroll_window_end = 0;
+static int scroll_window_height = 0;
+
+void lock_logging(void)
+{
+ log_tgt_mutex_lock();
+}
+
+void unlock_logging(void)
+{
+ log_tgt_mutex_unlock();
+}
+
+void get_win_size(int *w, int *h)
+{
+ struct winsize win;
+ int rc;
+
+ rc = ioctl(0, TIOCGWINSZ, &win);
+ if (rc) {
+ *w = 80;
+ *h = 25;
+ return;
+ }
+
+ if (h)
+ *h = win.ws_row;
+ if (w)
+ *w = win.ws_col;
+}
+
+void enable_limit_scroll(bool enable)
+{
+ /* Before the window is set, keep scrolling everything. */
+ if (scroll_window_height == 0)
+ return;
+
+ /* If window is too small. */
+ if (scroll_window_end - scroll_window_start <= 0)
+ return;
+
+ if (enable) {
+ printf("\0337\033[%d;%dr\0338", scroll_window_start, scroll_window_end);
+ } else
+ printf("\0337\033[%d;%dr\0338", 1, scroll_window_height);
+ fflush(stdout);
+}
+
+void logging_limit_scroll_top(int lines)
+{
+ lock_logging();
+
+ get_win_size(NULL, &scroll_window_height);
+ scroll_window_start = lines + 1;
+ if (scroll_window_end == 0)
+ scroll_window_end = scroll_window_height;
+
+ enable_limit_scroll(true);
+
+ unlock_logging();
+}
+
+void logging_limit_scroll_bottom(int lines)
+{
+ int i;
+
+ lock_logging();
+
+ get_win_size(NULL, &scroll_window_height);
+ scroll_window_end = scroll_window_height - lines;
+ if (scroll_window_start == 0)
+ scroll_window_start = 1;
+
+ /* Make space by adding empty lines. */
+ for (i = scroll_window_end; i < scroll_window_height; i++)
+ printf("\n");
+ /* Go up by number of lines to be in window. */
+ printf("\033[%dA", scroll_window_height - scroll_window_end);
+ /* Enable window. */
+ enable_limit_scroll(true);
+
+ unlock_logging();
+}
+
+const char *debug_amplitude(double level)
+{
+ static char text[42];
+
+ strcpy(text, " : ");
+ if (level > 1.0)
+ level = 1.0;
+ if (level < -1.0)
+ level = -1.0;
+ text[20 + (int)(level * 20)] = '*';
+
+ return text;
+}
+
+#define level2db(level) (20 * log10(level))
+
+const char *debug_db(double level_db)
+{
+ static char text[128];
+ int l;
+
+ strcpy(text, ": . : . : . : . : . : . : . : . | . : . : . : . : . : . : . : . :");
+ if (level_db <= 0.0)
+ return text;
+ l = (int)round(level2db(level_db));
+ if (l > 48)
+ return text;
+ if (l < -48)
+ return text;
+ text[l + 48] = '*';
+
+ return text;
+}
+
+void logging_print_help(void)
+{
+ printf(" -v --verbose <level> | <level>,<category>[,<category>[,...]] | list\n");
+ printf(" Use 'list' to get a list of all levels and categories.\n");
+ printf(" Verbose level: digit of debug level (default = '%d')\n", loglevel);
+ printf(" Verbose level+category: level digit followed by one or more categories\n");
+ printf(" -> If no category is specified, all categories are selected\n");
+ printf(" -v --verbose date\n");
+ printf(" Show date with debug output\n");
+}
+
+static unsigned char log_levels[] = { LOGL_DEBUG, LOGL_INFO, LOGL_NOTICE, LOGL_ERROR };
+static char *log_level_names[] = { "debug", "info", "notice", "error" };
+
+static void list_cat(void)
+{
+ int i;
+
+ printf("Give number of debug level:\n");
+ for (i = 0; i < (int)sizeof(log_levels); i++)
+ printf(" %d = %s\n", log_levels[i], log_level_names[i]);
+ printf("\n");
+
+ printf("Give name(s) of debug category:\n");
+ for (i = 0; i < (int)log_categories_size; i++) {
+ if (!log_categories[i].name)
+ continue;
+ printf(" ");
+ if (log_categories[i].color)
+ printf("%s", log_categories[i].color);
+ if (log_categories[i].name)
+ printf("%s\033[0;39m = %s\n", log_categories[i].name, log_categories[i].description);
+ }
+ printf("\n");
+}
+
+int parse_logging_opt(const char *optarg)
+{
+ int i;
+ char *dup, *dstring, *p;
+
+ if (!strcasecmp(optarg, "list")) {
+ list_cat();
+ return 1;
+ }
+
+ if (!strcasecmp(optarg, "date")) {
+ log_set_print_timestamp(osmo_stderr_target, 1);
+ return 0;
+ }
+
+ dup = dstring = strdup(optarg);
+ p = strsep(&dstring, ",");
+ for (i = 0; i < p[i]; i++) {
+ if (p[i] < '0' || p[i] > '9') {
+ fprintf(stderr, "Only digits are allowed for debug level!\n");
+ free(dup);
+ return -EINVAL;
+ }
+ }
+ loglevel = atoi(p);
+ for (i = 0; i < (int)sizeof(log_levels); i++) {
+ if (log_levels[i] == loglevel)
+ break;
+ }
+ if (i == (int)sizeof(log_levels)) {
+ fprintf(stderr, "Logging level does not exist, use '-v list' to show available levels!\n");
+ free(dup);
+ return -EINVAL;
+ }
+ /* Set loglevel and enable all categories, if dstring is not set. Else set loglevel and disable all categories. */
+ for (i = 0; i < (int)log_categories_size; i++)
+ log_set_category_filter(osmo_stderr_target, i, (!dstring), loglevel);
+ /* Enable each given category. */
+ while((p = strsep(&dstring, ","))) {
+ for (i = 0; i < (int)log_categories_size; i++) {
+ if (!log_category_name(i))
+ continue;
+ if (!strcasecmp(p, log_category_name(i)))
+ break;
+ }
+ if (i == (int)log_categories_size) {
+ fprintf(stderr, "Given logging category '%s' unknown, use '-v list' to show available categories!\n", p);
+ free(dup);
+ return -EINVAL;
+ }
+ log_set_category_filter(osmo_stderr_target, i, 1, loglevel);
+ }
+
+ free(dup);
+ return 0;
+}
+
+/* Call after configuation above. */
+void logging_init(void)
+{
+ int i;
+
+ struct log_info log_info = {
+ .cat = log_categories,
+ .num_cat = log_categories_size,
+ };
+
+ osmo_cc_set_log_cat(DLCC);
+
+ osmo_init_logging2(NULL, &log_info);
+ log_set_print_timestamp(osmo_stderr_target, 0);
+ log_set_print_level(osmo_stderr_target, 1);
+ log_set_print_category_hex(osmo_stderr_target, 0);
+ log_set_print_category(osmo_stderr_target, 1);
+
+ /* Set loglevel and enable all categories. */
+ for (i = 0; i < (int)log_categories_size; i++)
+ log_set_category_filter(osmo_stderr_target, i, 1, loglevel);
+}
+
diff --git a/src/liblogging/logging.h b/src/liblogging/logging.h
new file mode 100644
index 0000000..67f1434
--- /dev/null
+++ b/src/liblogging/logging.h
@@ -0,0 +1,21 @@
+#pragma once
+
+#include <osmocom/core/logging.h>
+#include "categories.h"
+
+extern int loglevel;
+
+#define LOGP_CHAN(cat, level, fmt, arg...) LOGP(cat, level, "(chan %s) " fmt, CHAN, ## arg)
+
+void get_win_size(int *w, int *h);
+void lock_logging(void);
+void unlock_logging(void);
+void enable_limit_scroll(bool enable);
+void logging_limit_scroll_top(int lines);
+void logging_limit_scroll_bottom(int lines);
+const char *debug_amplitude(double level);
+const char *debug_db(double level_db);
+void logging_print_help(void);
+int parse_logging_opt(const char *optarg);
+void logging_init(void);
+
diff --git a/src/libmobile/Makefile.am b/src/libmobile/Makefile.am
index 2f03688..7a67b6a 100644
--- a/src/libmobile/Makefile.am
+++ b/src/libmobile/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
noinst_LIBRARIES = libmobile.a
@@ -8,6 +8,7 @@ libmobile_a_SOURCES = \
console.c \
testton.c \
cause.c \
+ get_time.c \
main_mobile.c
if HAVE_ALSA
diff --git a/src/libmobile/call.c b/src/libmobile/call.c
index a7858d4..69f1627 100644
--- a/src/libmobile/call.c
+++ b/src/libmobile/call.c
@@ -26,18 +26,19 @@
#include <sys/time.h>
#include <arpa/inet.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
-#include "../libtimer/timer.h"
-#include "../libosmocc/endpoint.h"
-#include "../libosmocc/helper.h"
-#include "../libg711/g711.h"
+#include "../liblogging/logging.h"
+#include <osmocom/core/timer.h>
+#include <osmocom/core/select.h>
+#include <osmocom/cc/endpoint.h>
+#include <osmocom/cc/helper.h>
+#include <osmocom/cc/g711.h>
+#include <osmocom/cc/rtp.h>
#include "cause.h"
#include "sender.h"
#include "call.h"
-#include "main_mobile.h"
#include "console.h"
-#define DISC_TIMEOUT 30
+#define DISC_TIMEOUT 30, 0
//#define DEBUG_LEVEL
@@ -96,6 +97,8 @@ static struct osmo_cc_helper_audio_codecs codecs[] = {
{ NULL, 0, 0, NULL, NULL},
};
+static int no_l16 = 0;
+
/* stream patterns/announcements */
int16_t *ringback_spl = NULL;
int ringback_size = 0;
@@ -251,14 +254,14 @@ typedef struct process {
enum audio_pattern pattern;
int audio_pos;
uint8_t cause;
- struct timer timer;
+ struct osmo_timer_list timer;
osmo_cc_session_t *session;
osmo_cc_session_codec_t *codec; /* codec to send */
} process_t;
static process_t *process_head = NULL;
-static void process_timeout(struct timer *timer);
+static void process_timeout(void *data);
static void indicate_disconnect_release(int callref, int cause, uint8_t msg_type);
static process_t *create_process(int callref, enum process_state state)
@@ -267,10 +270,10 @@ static process_t *create_process(int callref, enum process_state state)
process = calloc(sizeof(*process), 1);
if (!process) {
- PDEBUG(DCALL, DEBUG_ERROR, "No memory!\n");
+ LOGP(DCALL, LOGL_ERROR, "No memory!\n");
abort();
}
- timer_init(&process->timer, process_timeout, process);
+ osmo_timer_setup(&process->timer, process_timeout, process);
process->next = process_head;
process_head = process;
@@ -288,7 +291,7 @@ static void destroy_process(int callref)
while (process) {
if (process->callref == callref) {
*process_p = process->next;
- timer_exit(&process->timer);
+ osmo_timer_del(&process->timer);
if (process->session)
osmo_cc_free_session(process->session);
free(process);
@@ -297,7 +300,7 @@ static void destroy_process(int callref)
process_p = &process->next;
process = process->next;
}
- PDEBUG(DCALL, DEBUG_ERROR, "Process with callref %d not found!\n", callref);
+ LOGP(DCALL, LOGL_ERROR, "Process with callref %d not found!\n", callref);
}
static process_t *get_process(int callref)
@@ -317,10 +320,10 @@ static void new_state_process(int callref, enum process_state state)
process_t *process = get_process(callref);
if (!process) {
- PDEBUG(DCALL, DEBUG_ERROR, "Process with callref %d not found!\n", callref);
+ LOGP(DCALL, LOGL_ERROR, "Process with callref %d not found!\n", callref);
return;
}
- PDEBUG(DCALL, DEBUG_DEBUG, "Changing state for callref %d %d->%d\n", callref, process->state, state);
+ LOGP(DCALL, LOGL_DEBUG, "Changing state for callref %d %d->%d\n", callref, process->state, state);
process->state = state;
}
@@ -329,7 +332,7 @@ static void set_pattern_process(int callref, enum audio_pattern pattern)
process_t *process = get_process(callref);
if (!process) {
- PDEBUG(DCALL, DEBUG_ERROR, "Process with callref %d not found!\n", callref);
+ LOGP(DCALL, LOGL_ERROR, "Process with callref %d not found!\n", callref);
return;
}
process->pattern = pattern;
@@ -342,14 +345,14 @@ static void disconnect_process(int callref, int cause)
process_t *process = get_process(callref);
if (!process) {
- PDEBUG(DCALL, DEBUG_ERROR, "Process with callref %d not found!\n", callref);
+ LOGP(DCALL, LOGL_ERROR, "Process with callref %d not found!\n", callref);
return;
}
process->pattern = cause2pattern(cause);
process->audio_disconnected = 1;
process->audio_pos = 0;
process->cause = cause;
- timer_start(&process->timer, DISC_TIMEOUT);
+ osmo_timer_schedule(&process->timer, DISC_TIMEOUT);
}
static void get_process_patterns(process_t *process, int16_t *samples, int length)
@@ -372,14 +375,14 @@ static void get_process_patterns(process_t *process, int16_t *samples, int lengt
process->audio_pos = pos;
}
-static void process_timeout(struct timer *timer)
+static void process_timeout(void *data)
{
- process_t *process = (process_t *)timer->priv;
+ process_t *process = data;
{
/* announcement timeout */
if (process->state == PROCESS_DISCONNECT) {
- PDEBUG(DCALL, DEBUG_INFO, "Call released toward mobile network (after timeout)\n");
+ LOGP(DCALL, LOGL_INFO, "Call released toward mobile network (after timeout)\n");
call_down_release(process->callref, process->cause);
}
indicate_disconnect_release(process->callref, process->cause, OSMO_CC_MSG_REL_IND);
@@ -387,20 +390,22 @@ static void process_timeout(struct timer *timer)
}
}
-void down_audio(struct osmo_cc_session_codec *codec, uint8_t __attribute__((unused)) marker, uint16_t sequence_number, uint32_t timestamp, uint32_t ssrc, uint8_t *data, int len)
+static void down_audio(struct osmo_cc_session_codec *codec, uint8_t marker, uint16_t sequence_number, uint32_t timestamp, uint32_t ssrc, uint8_t *payload, int payload_len)
{
process_t *process = codec->media->session->priv;
- sample_t samples[len / 2];
+// sample_t samples[len / 2];
/* if we are disconnected, ignore audio */
if (!process || process->pattern != PATTERN_NONE)
return;
+#if 0
int16_to_samples_speech(samples, (int16_t *)data, len / 2);
#ifdef DEBUG_LEVEL
double lev = level_of(samples, len / 2);
printf("festnetz-level: %s %.4f\n", debug_db(lev), (20 * log10(lev)));
#endif
- call_down_audio(process->callref, sequence_number, timestamp, ssrc, samples, len / 2);
+#endif
+ call_down_audio(codec->decoder, process, process->callref, marker, sequence_number, timestamp, ssrc, payload, payload_len);
}
static void indicate_setup(process_t *process, const char *callerid, const char *dialing, uint8_t network_type, const char *network_id)
@@ -420,9 +425,9 @@ static void indicate_setup(process_t *process, const char *callerid, const char
/* bearer capability */
osmo_cc_add_ie_bearer(msg, OSMO_CC_CODING_ITU_T, OSMO_CC_CAPABILITY_AUDIO, OSMO_CC_MODE_CIRCUIT);
/* sdp offer */
- process->session = osmo_cc_helper_audio_offer(&ep->session_config, process, codecs, down_audio, msg, 1);
+ process->session = osmo_cc_helper_audio_offer(&ep->session_config, process, codecs + no_l16, down_audio, msg, 1);
- PDEBUG(DCALL, DEBUG_INFO, "Indicate OSMO-CC setup towards fixed network\n");
+ LOGP(DCALL, LOGL_INFO, "Indicate OSMO-CC setup towards fixed network\n");
osmo_cc_ll_msg(ep, process->callref, msg);
}
@@ -438,7 +443,7 @@ static void indicate_proceeding(int callref, const char *sdp)
/* progress information */
osmo_cc_add_ie_progress(msg, OSMO_CC_CODING_ITU_T, OSMO_CC_LOCATION_BEYOND_INTERWORKING, OSMO_CC_PROGRESS_INBAND_INFO_AVAILABLE);
- PDEBUG(DCALL, DEBUG_INFO, "Indicate OSMO-CC call confirm towards fixed network\n");
+ LOGP(DCALL, LOGL_INFO, "Indicate OSMO-CC call confirm towards fixed network\n");
osmo_cc_ll_msg(ep, callref, msg);
}
@@ -448,7 +453,7 @@ static void indicate_alerting(int callref)
msg = osmo_cc_new_msg(OSMO_CC_MSG_ALERT_IND);
- PDEBUG(DCALL, DEBUG_INFO, "Indicate OSMO-CC alerting towards fixed network\n");
+ LOGP(DCALL, LOGL_INFO, "Indicate OSMO-CC alerting towards fixed network\n");
osmo_cc_ll_msg(ep, callref, msg);
}
@@ -465,7 +470,7 @@ static void indicate_answer(int callref, const char *sdp, const char *connectid)
if (sdp)
osmo_cc_add_ie_sdp(msg, sdp);
- PDEBUG(DCALL, DEBUG_INFO, "Indicate OSMO-CC answer towards fixed network\n");
+ LOGP(DCALL, LOGL_INFO, "Indicate OSMO-CC answer towards fixed network\n");
osmo_cc_ll_msg(ep, callref, msg);
}
@@ -475,7 +480,7 @@ static void indicate_answer_ack(int callref)
msg = osmo_cc_new_msg(OSMO_CC_MSG_SETUP_COMP_IND);
- PDEBUG(DCALL, DEBUG_INFO, "Indicate OSMO-CC setup complete towards fixed network\n");
+ LOGP(DCALL, LOGL_INFO, "Indicate OSMO-CC setup complete towards fixed network\n");
osmo_cc_ll_msg(ep, callref, msg);
}
@@ -492,7 +497,7 @@ static void indicate_disconnect_release(int callref, int cause, uint8_t msg_type
if (msg_type == OSMO_CC_MSG_DISC_IND)
osmo_cc_add_ie_progress(msg, OSMO_CC_CODING_ITU_T, OSMO_CC_LOCATION_BEYOND_INTERWORKING, OSMO_CC_PROGRESS_INBAND_INFO_AVAILABLE);
- PDEBUG(DCALL, DEBUG_INFO, "%s OSMO-CC %s towards fixed network\n", (msg_type == OSMO_CC_MSG_REL_CNF) ? "Confirm" : "Indicated", (msg_type == OSMO_CC_MSG_DISC_IND) ? "disconnect" : "release");
+ LOGP(DCALL, LOGL_INFO, "%s OSMO-CC %s towards fixed network\n", (msg_type == OSMO_CC_MSG_REL_CNF) ? "Confirm" : "Indicated", (msg_type == OSMO_CC_MSG_DISC_IND) ? "disconnect" : "release");
osmo_cc_ll_msg(ep, callref, msg);
}
@@ -502,9 +507,9 @@ int call_up_setup(const char *callerid, const char *dialing, uint8_t network, co
osmo_cc_call_t *call;
process_t *process;
- PDEBUG(DCALL, DEBUG_INFO, "Incoming call from '%s' to '%s'\n", callerid ? : "unknown", dialing);
+ LOGP(DCALL, LOGL_INFO, "Incoming call from '%s' to '%s'\n", callerid ? : "unknown", dialing);
if (!strcmp(dialing, "010"))
- PDEBUG(DCALL, DEBUG_INFO, " -> Call to Operator '%s'\n", dialing);
+ LOGP(DCALL, LOGL_INFO, " -> Call to Operator '%s'\n", dialing);
call = osmo_cc_call_new(ep);
@@ -519,11 +524,11 @@ int call_up_setup(const char *callerid, const char *dialing, uint8_t network, co
void call_up_alerting(int callref)
{
if (!callref) {
- PDEBUG(DCALL, DEBUG_DEBUG, "Ignoring alerting, because callref not set. (not for us)\n");
+ LOGP(DCALL, LOGL_DEBUG, "Ignoring alerting, because callref not set. (not for us)\n");
return;
}
- PDEBUG(DCALL, DEBUG_INFO, "Call is alerting\n");
+ LOGP(DCALL, LOGL_INFO, "Call is alerting\n");
if (!connect_on_setup)
indicate_alerting(callref);
@@ -541,11 +546,11 @@ void call_up_early(int callref)
void call_up_answer(int callref, const char *connect_id)
{
if (!callref) {
- PDEBUG(DCALL, DEBUG_DEBUG, "Ignoring answer, because callref not set. (not for us)\n");
+ LOGP(DCALL, LOGL_DEBUG, "Ignoring answer, because callref not set. (not for us)\n");
return;
}
- PDEBUG(DCALL, DEBUG_INFO, "Call has been answered by '%s'\n", connect_id);
+ LOGP(DCALL, LOGL_INFO, "Call has been answered by '%s'\n", connect_id);
if (!connect_on_setup)
indicate_answer(callref, NULL, connect_id);
@@ -559,11 +564,11 @@ void call_up_release(int callref, int cause)
process_t *process;
if (!callref) {
- PDEBUG(DCALL, DEBUG_DEBUG, "Ignoring release, because callref not set. (not for us)\n");
+ LOGP(DCALL, LOGL_DEBUG, "Ignoring release, because callref not set. (not for us)\n");
return;
}
- PDEBUG(DCALL, DEBUG_INFO, "Call has been released with cause=%d\n", cause);
+ LOGP(DCALL, LOGL_INFO, "Call has been released with cause=%d\n", cause);
process = get_process(callref);
if (process) {
@@ -599,12 +604,14 @@ void call_tone_recall(int callref, int on)
}
/* forward audio to OSMO-CC or call instance */
-void call_up_audio(int callref, sample_t *samples, int count)
+void call_up_audio(int callref, sample_t *samples, int len)
{
process_t *process;
- int16_t data[count];
+ int16_t spl[len];
+ uint8_t *payload;
+ int payload_len;
- if (count != 160) {
+ if (len != 160) {
fprintf(stderr, "Samples must be 160, please fix!\n");
abort();
}
@@ -616,13 +623,21 @@ void call_up_audio(int callref, sample_t *samples, int count)
if (!process || process->pattern != PATTERN_NONE)
return;
+ /* no codec negotiated (yet) */
+ if (!process->codec)
+ return;
+
/* forward audio */
#ifdef DEBUG_LEVEL
- double lev = level_of(samples, count);
+ double lev = level_of(samples, len);
printf(" mobil-level: %s%.4f\n", debug_db(lev), (20 * log10(lev)));
#endif
- samples_to_int16_speech(data, samples, count);
- osmo_cc_rtp_send(process->codec, (uint8_t *)data, count * 2, 0, 1, count, process);
+ /* real to integer */
+ samples_to_int16_speech(spl, samples, len);
+ /* encode and send via RTP */
+ process->codec->encoder((uint8_t *)spl, len * 2, &payload, &payload_len, process);
+ osmo_cc_rtp_send(process->codec, payload, payload_len, 0, 1, len);
+ free(payload);
/* don't destroy process here in case of an error */
}
@@ -635,17 +650,22 @@ void call_clock(void)
while(process) {
if (process->pattern != PATTERN_NONE) {
- int16_t data[160];
+ int16_t spl[160];
+ uint8_t *payload;
+ int payload_len;
/* try to get patterns, else copy the samples we got */
- get_process_patterns(process, data, 160);
+ get_process_patterns(process, spl, 160);
#ifdef DEBUG_LEVEL
sample_t samples[160];
- int16_to_samples(samples, (int16_t *)data->data, 160);
+ int16_to_samples(samples, (int16_t *)spl->data, 160);
double lev = level_of(samples, 160);
printf(" mobil-level: %s%.4f\n", debug_db(lev), (20 * log10(lev)));
- samples_to_int16(data, samples, 160);
+ samples_to_int16(spl, samples, 160);
#endif
- osmo_cc_rtp_send(process->codec, (uint8_t *)data, 160 * 2, 0, 1, 160, process);
+ /* encode and send via RTP */
+ process->codec->encoder((uint8_t *)spl, 160 * 2, &payload, &payload_len, process);
+ osmo_cc_rtp_send(process->codec, payload, payload_len, 0, 1, 160);
+ free(payload);
/* don't destroy process here in case of an error */
}
process = process->next;
@@ -653,13 +673,14 @@ void call_clock(void)
}
/* messages received from fixed network */
-void ll_msg_cb(osmo_cc_endpoint_t __attribute__((unused)) *ep, uint32_t callref, osmo_cc_msg_t *msg)
+static void ll_msg_cb(osmo_cc_endpoint_t __attribute__((unused)) *ep, uint32_t callref, osmo_cc_msg_t *msg)
{
process_t *process;
uint8_t coding, location, progress, isdn_cause, socket_cause;
- uint16_t sip_cause;
+ uint16_t sip_cause, metering_connect_units;
uint8_t type, plan, present, screen, caller_type;
char caller_id[33], number[33];
+ struct timeval tv_meter = {};
const char *suffix, *invalid;
int rc;
@@ -670,7 +691,7 @@ void ll_msg_cb(osmo_cc_endpoint_t __attribute__((unused)) *ep, uint32_t callref,
else {
/* release collisions is not forbidden */
if (msg->type != OSMO_CC_MSG_REL_REQ)
- PDEBUG(DCALL, DEBUG_ERROR, "No process!\n");
+ LOGP(DCALL, LOGL_ERROR, "No process!\n");
osmo_cc_free_msg(msg);
return;
}
@@ -682,8 +703,8 @@ void ll_msg_cb(osmo_cc_endpoint_t __attribute__((unused)) *ep, uint32_t callref,
rc = osmo_cc_get_ie_cause(msg, 0, &location, &isdn_cause, &sip_cause, &socket_cause);
if (rc < 0)
isdn_cause = OSMO_CC_ISDN_CAUSE_NORM_CALL_CLEAR;
- PDEBUG(DCALL, DEBUG_INFO, "Received OSMO-CC disconnect from fixed network with cause %d\n", isdn_cause);
- PDEBUG(DCALL, DEBUG_INFO, "Call disconnected, releasing!\n");
+ LOGP(DCALL, LOGL_INFO, "Received OSMO-CC disconnect from fixed network with cause %d\n", isdn_cause);
+ LOGP(DCALL, LOGL_INFO, "Call disconnected, releasing!\n");
destroy_process(callref);
indicate_disconnect_release(callref, isdn_cause, OSMO_CC_MSG_REL_IND);
break;
@@ -691,8 +712,8 @@ void ll_msg_cb(osmo_cc_endpoint_t __attribute__((unused)) *ep, uint32_t callref,
rc = osmo_cc_get_ie_cause(msg, 0, &location, &isdn_cause, &sip_cause, &socket_cause);
if (rc < 0)
isdn_cause = OSMO_CC_ISDN_CAUSE_NORM_CALL_CLEAR;
- PDEBUG(DCALL, DEBUG_INFO, "Received OSMO-CC release from fixed network with cause %d\n", isdn_cause);
- PDEBUG(DCALL, DEBUG_INFO, "Call released\n");
+ LOGP(DCALL, LOGL_INFO, "Received OSMO-CC release from fixed network with cause %d\n", isdn_cause);
+ LOGP(DCALL, LOGL_INFO, "Call released\n");
destroy_process(callref);
indicate_disconnect_release(callref, isdn_cause, OSMO_CC_MSG_REL_CNF);
break;
@@ -701,13 +722,16 @@ void ll_msg_cb(osmo_cc_endpoint_t __attribute__((unused)) *ep, uint32_t callref,
return;
}
+ /* get metering information, tv_meter elements are 0, if no metering info available */
+ osmo_cc_get_ie_metering(msg, 0, &metering_connect_units, &tv_meter);
+
switch(msg->type) {
case OSMO_CC_MSG_SETUP_REQ:
{
const char *sdp;
/* sdp accept */
- sdp = osmo_cc_helper_audio_accept(&ep->session_config, process, codecs, down_audio, msg, &process->session, &process->codec, 0);
+ sdp = osmo_cc_helper_audio_accept(&ep->session_config, process, codecs + no_l16, down_audio, msg, &process->session, &process->codec, 0);
if (!sdp) {
disconnect_process(callref, 47);
indicate_disconnect_release(callref, 47, OSMO_CC_MSG_REJ_IND);
@@ -741,14 +765,14 @@ void ll_msg_cb(osmo_cc_endpoint_t __attribute__((unused)) *ep, uint32_t callref,
rc = osmo_cc_get_ie_called(msg, 0, &type, &plan, number, sizeof(number));
if (rc < 0)
number[0] = '\0';
- PDEBUG(DCALL, DEBUG_INFO, "Received OSMO-CC call from fixed network '%s' to mobile '%s'\n", caller_id, number);
+ LOGP(DCALL, LOGL_INFO, "Received OSMO-CC call from fixed network '%s' to mobile '%s'\n", caller_id, number);
if (!connect_on_setup)
indicate_proceeding(callref, sdp);
else {
- PDEBUG(DCALL, DEBUG_DEBUG, "Early connecting after setup\n");
+ LOGP(DCALL, LOGL_DEBUG, "Early connecting after setup\n");
indicate_answer(callref, sdp, number);
}
- PDEBUG(DCALL, DEBUG_INFO, "Outgoing call from '%s' to '%s'\n", caller_id, number);
+ LOGP(DCALL, LOGL_INFO, "Outgoing call from '%s' to '%s'\n", caller_id, number);
/* insert '+' for international dialing */
if (type == OSMO_CC_TYPE_INTERNATIONAL && number[0] != '+') {
@@ -762,10 +786,10 @@ void ll_msg_cb(osmo_cc_endpoint_t __attribute__((unused)) *ep, uint32_t callref,
/* check suffix length */
invalid = mobile_number_check_length(suffix);
if (invalid) {
- PDEBUG(DCALL, DEBUG_NOTICE, "Mobile number '%s' has invalid length: %s\n", suffix, invalid);
+ LOGP(DCALL, LOGL_NOTICE, "Mobile number '%s' has invalid length: %s\n", suffix, invalid);
disconnect_process(callref, OSMO_CC_ISDN_CAUSE_INV_NR_FORMAT);
if (!connect_on_setup) {
- PDEBUG(DCALL, DEBUG_INFO, "Disconnecting OSMO-CC call towards fixed network (cause=%d)\n", OSMO_CC_ISDN_CAUSE_INV_NR_FORMAT);
+ LOGP(DCALL, LOGL_INFO, "Disconnecting OSMO-CC call towards fixed network (cause=%d)\n", OSMO_CC_ISDN_CAUSE_INV_NR_FORMAT);
indicate_disconnect_release(callref, OSMO_CC_ISDN_CAUSE_INV_NR_FORMAT, OSMO_CC_MSG_DISC_IND);
}
break;
@@ -774,10 +798,10 @@ void ll_msg_cb(osmo_cc_endpoint_t __attribute__((unused)) *ep, uint32_t callref,
/* check suffix digits */
invalid = mobile_number_check_digits(suffix);
if (invalid) {
- PDEBUG(DCALL, DEBUG_NOTICE, "Mobile number '%s' has invalid digit: %s.\n", suffix, invalid);
+ LOGP(DCALL, LOGL_NOTICE, "Mobile number '%s' has invalid digit: %s.\n", suffix, invalid);
disconnect_process(callref, OSMO_CC_ISDN_CAUSE_INV_NR_FORMAT);
if (!connect_on_setup) {
- PDEBUG(DCALL, DEBUG_INFO, "Disconnecting OSMO-CC call towards fixed network (cause=%d)\n", OSMO_CC_ISDN_CAUSE_INV_NR_FORMAT);
+ LOGP(DCALL, LOGL_INFO, "Disconnecting OSMO-CC call towards fixed network (cause=%d)\n", OSMO_CC_ISDN_CAUSE_INV_NR_FORMAT);
indicate_disconnect_release(callref, OSMO_CC_ISDN_CAUSE_INV_NR_FORMAT, OSMO_CC_MSG_DISC_IND);
}
break;
@@ -787,10 +811,10 @@ void ll_msg_cb(osmo_cc_endpoint_t __attribute__((unused)) *ep, uint32_t callref,
if (mobile_number_check_valid) {
invalid = mobile_number_check_valid(suffix);
if (invalid) {
- PDEBUG(DCALL, DEBUG_NOTICE, "Mobile number '%s' is invalid for this network: %s\n", suffix, invalid);
+ LOGP(DCALL, LOGL_NOTICE, "Mobile number '%s' is invalid for this network: %s\n", suffix, invalid);
disconnect_process(callref, OSMO_CC_ISDN_CAUSE_INV_NR_FORMAT);
if (!connect_on_setup) {
- PDEBUG(DCALL, DEBUG_INFO, "Disconnecting OSMO-CC call towards fixed network (cause=%d)\n", OSMO_CC_ISDN_CAUSE_INV_NR_FORMAT);
+ LOGP(DCALL, LOGL_INFO, "Disconnecting OSMO-CC call towards fixed network (cause=%d)\n", OSMO_CC_ISDN_CAUSE_INV_NR_FORMAT);
indicate_disconnect_release(callref, OSMO_CC_ISDN_CAUSE_INV_NR_FORMAT, OSMO_CC_MSG_DISC_IND);
}
break;
@@ -800,9 +824,9 @@ void ll_msg_cb(osmo_cc_endpoint_t __attribute__((unused)) *ep, uint32_t callref,
/* setup call */
rc = call_down_setup(callref, caller_id, caller_type, suffix);
if (rc < 0) {
- PDEBUG(DCALL, DEBUG_NOTICE, "Call rejected, cause %d\n", -rc);
+ LOGP(DCALL, LOGL_NOTICE, "Call rejected, cause %d\n", -rc);
if (!connect_on_setup) {
- PDEBUG(DCALL, DEBUG_INFO, "Disconnecting OSMO-CC call towards fixed network (cause=%d)\n", -rc);
+ LOGP(DCALL, LOGL_INFO, "Disconnecting OSMO-CC call towards fixed network (cause=%d)\n", -rc);
indicate_disconnect_release(callref, -rc, OSMO_CC_MSG_DISC_IND);
}
disconnect_process(callref, -rc);
@@ -811,45 +835,45 @@ void ll_msg_cb(osmo_cc_endpoint_t __attribute__((unused)) *ep, uint32_t callref,
break;
}
case OSMO_CC_MSG_SETUP_ACK_REQ:
- PDEBUG(DCALL, DEBUG_INFO, "Received OSMO-CC overlap from fixed network\n");
+ LOGP(DCALL, LOGL_INFO, "Received OSMO-CC overlap from fixed network\n");
rc = osmo_cc_helper_audio_negotiate(msg, &process->session, &process->codec);
if (rc < 0) {
nego_failed:
- PDEBUG(DCALL, DEBUG_INFO, "Releasing, because codec negotiation failed.\n");
+ LOGP(DCALL, LOGL_INFO, "Releasing, because codec negotiation failed.\n");
destroy_process(callref);
indicate_disconnect_release(callref, 47, OSMO_CC_MSG_REL_IND);
- PDEBUG(DCALL, DEBUG_INFO, "Call released toward mobile network\n");
+ LOGP(DCALL, LOGL_INFO, "Call released toward mobile network\n");
call_down_release(callref, 47);
break;
}
break;
case OSMO_CC_MSG_PROC_REQ:
- PDEBUG(DCALL, DEBUG_INFO, "Received OSMO-CC proceeding from fixed network\n");
+ LOGP(DCALL, LOGL_INFO, "Received OSMO-CC proceeding from fixed network\n");
rc = osmo_cc_helper_audio_negotiate(msg, &process->session, &process->codec);
if (rc < 0)
goto nego_failed;
break;
case OSMO_CC_MSG_PROGRESS_REQ:
- PDEBUG(DCALL, DEBUG_INFO, "Received OSMO-CC progress from fixed network\n");
+ LOGP(DCALL, LOGL_INFO, "Received OSMO-CC progress from fixed network\n");
rc = osmo_cc_helper_audio_negotiate(msg, &process->session, &process->codec);
if (rc < 0)
goto nego_failed;
break;
case OSMO_CC_MSG_ALERT_REQ:
- PDEBUG(DCALL, DEBUG_INFO, "Received OSMO-CC alerting from fixed network\n");
+ LOGP(DCALL, LOGL_INFO, "Received OSMO-CC alerting from fixed network\n");
rc = osmo_cc_helper_audio_negotiate(msg, &process->session, &process->codec);
if (rc < 0)
goto nego_failed;
new_state_process(callref, PROCESS_ALERTING_RO);
break;
case OSMO_CC_MSG_SETUP_RSP:
- PDEBUG(DCALL, DEBUG_INFO, "Received OSMO-CC answer from fixed network\n");
+ LOGP(DCALL, LOGL_INFO, "Received OSMO-CC answer from fixed network\n");
rc = osmo_cc_helper_audio_negotiate(msg, &process->session, &process->codec);
if (rc < 0)
goto nego_failed;
new_state_process(callref, PROCESS_CONNECT);
- PDEBUG(DCALL, DEBUG_INFO, "Call answered\n");
- call_down_answer(callref);
+ LOGP(DCALL, LOGL_INFO, "Call answered\n");
+ call_down_answer(callref, &tv_meter);
indicate_answer_ack(callref);
break;
case OSMO_CC_MSG_DISC_REQ:
@@ -862,22 +886,22 @@ void ll_msg_cb(osmo_cc_endpoint_t __attribute__((unused)) *ep, uint32_t callref,
rc = osmo_cc_get_ie_progress(msg, 0, &coding, &location, &progress);
if (rc < 0)
progress = 0;
- PDEBUG(DCALL, DEBUG_INFO, "Received OSMO-CC disconnect from fixed network with cause %d\n", isdn_cause);
+ LOGP(DCALL, LOGL_INFO, "Received OSMO-CC disconnect from fixed network with cause %d\n", isdn_cause);
if (release_on_disconnect || (progress != 1 && progress != 8)) {
- PDEBUG(DCALL, DEBUG_INFO, "Releasing, because we don't send disconnect tones to mobile phone\n");
+ LOGP(DCALL, LOGL_INFO, "Releasing, because we don't send disconnect tones to mobile phone\n");
destroy_process(callref);
indicate_disconnect_release(callref, isdn_cause, OSMO_CC_MSG_REL_IND);
- PDEBUG(DCALL, DEBUG_INFO, "Call released toward mobile network\n");
+ LOGP(DCALL, LOGL_INFO, "Call released toward mobile network\n");
call_down_release(callref, isdn_cause);
break;
}
new_state_process(callref, PROCESS_DISCONNECT);
- PDEBUG(DCALL, DEBUG_INFO, "Call disconnected\n");
+ LOGP(DCALL, LOGL_INFO, "Call disconnected\n");
call_down_disconnect(callref, isdn_cause);
/* we might get released during disconnect handling!!! */
process = get_process(callref);
if (process && process->state == PROCESS_DISCONNECT)
- timer_start(&process->timer, DISC_TIMEOUT);
+ osmo_timer_schedule(&process->timer, DISC_TIMEOUT);
break;
case OSMO_CC_MSG_REJ_REQ:
case OSMO_CC_MSG_REL_REQ:
@@ -886,18 +910,18 @@ void ll_msg_cb(osmo_cc_endpoint_t __attribute__((unused)) *ep, uint32_t callref,
isdn_cause = OSMO_CC_ISDN_CAUSE_NORM_CALL_CLEAR;
destroy_process(callref);
if (msg->type == OSMO_CC_MSG_REL_REQ) {
- PDEBUG(DCALL, DEBUG_INFO, "Received OSMO-CC release from fixed network with cause %d\n", isdn_cause);
+ LOGP(DCALL, LOGL_INFO, "Received OSMO-CC release from fixed network with cause %d\n", isdn_cause);
indicate_disconnect_release(callref, isdn_cause, OSMO_CC_MSG_REL_CNF);
} else
- PDEBUG(DCALL, DEBUG_INFO, "Received OSMO-CC reject from fixed network with cause %d\n", isdn_cause);
- PDEBUG(DCALL, DEBUG_INFO, "Call released toward mobile network\n");
+ LOGP(DCALL, LOGL_INFO, "Received OSMO-CC reject from fixed network with cause %d\n", isdn_cause);
+ LOGP(DCALL, LOGL_INFO, "Call released toward mobile network\n");
call_down_release(callref, isdn_cause);
break;
}
osmo_cc_free_msg(msg);
}
-int call_init(const char *name, int _send_patterns, int _release_on_disconnect, int use_socket, int argc, const char *argv[])
+int call_init(const char *name, int _send_patterns, int _release_on_disconnect, int use_socket, int argc, const char *argv[], int _no_l16)
{
int rc;
@@ -906,6 +930,7 @@ int call_init(const char *name, int _send_patterns, int _release_on_disconnect,
g711_init();
+ no_l16 = !!_no_l16;
ep = &endpoint;
rc = osmo_cc_new(ep, OSMO_CC_VERSION, name, OSMO_CC_LOCATION_PRIV_SERV_LOC_USER, ll_msg_cb, (use_socket) ? NULL : console_msg, NULL, argc, argv);
if (rc > 0)
@@ -929,14 +954,3 @@ int call_handle(void)
return osmo_cc_handle();
}
-void call_media_handle(void)
-{
- process_t *process = process_head;
-
- while(process) {
- if (process->session)
- osmo_cc_session_handle(process->session, process);
- process = process->next;
- }
-}
-
diff --git a/src/libmobile/call.h b/src/libmobile/call.h
index d38f8ab..67bbf15 100644
--- a/src/libmobile/call.h
+++ b/src/libmobile/call.h
@@ -9,7 +9,10 @@ enum number_type {
TYPE_INTERNATIONAL,
};
-int call_init(const char *name, int _send_patterns, int _release_on_disconnect, int use_socket, int argc, const char *argv[]);
+void encode_l16(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void __attribute__((unused)) *arg);
+void decode_l16(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void __attribute__((unused)) *arg);
+
+int call_init(const char *name, int _send_patterns, int _release_on_disconnect, int use_socket, int argc, const char *argv[], int no_l16);
void call_exit(void);
int call_handle(void);
void call_media_handle(void);
@@ -31,15 +34,18 @@ void call_tone_recall(int callref, int on);
/* send messages */
int call_down_setup(int callref, const char *caller_id, enum number_type caller_type, const char *dialing);
-void call_down_answer(int callref);
+void call_down_answer(int callref, struct timeval *tv_meter);
void call_down_disconnect(int callref, int cause);
void call_down_release(int callref, int cause);
/* send and receive audio */
void call_up_audio(int callref, sample_t *samples, int count);
-void call_down_audio(int callref, uint16_t sequence, uint32_t timestamp, uint32_t ssrc, sample_t *samples, int count);
+void call_down_audio(void *decoder, void *decoder_priv, int callref, uint16_t sequence, uint8_t marker, uint32_t timestamp, uint32_t ssrc, uint8_t *payload, int payload_len);
/* clock to transmit to */
void call_clock(void); /* from main loop */
void call_down_clock(void); /* towards mobile implementation */
+/* display call states */
+void dump_info(void);
+
diff --git a/src/libmobile/console.c b/src/libmobile/console.c
index d0ca5dc..a07aae6 100755
--- a/src/libmobile/console.c
+++ b/src/libmobile/console.c
@@ -22,17 +22,20 @@
#include <unistd.h>
#include <stdint.h>
#include <stdlib.h>
+#include <stdbool.h>
#include <errno.h>
#include <sys/time.h>
+#include <sys/param.h>
#include "../libsample/sample.h"
#include "../libsamplerate/samplerate.h"
#include "../libjitter/jitter.h"
-#include "../libdebug/debug.h"
-#include "../libtimer/timer.h"
-#include "../libosmocc/endpoint.h"
-#include "../libosmocc/helper.h"
+#include "../liblogging/logging.h"
+#include <osmocom/core/timer.h>
+#include <osmocom/core/select.h>
+#include <osmocom/cc/endpoint.h>
+#include <osmocom/cc/helper.h>
+#include <osmocom/cc/rtp.h>
#include "testton.h"
-#include "../libmobile/main_mobile.h"
#include "console.h"
#include "cause.h"
#include "../libmobile/call.h"
@@ -89,9 +92,6 @@ static console_t console;
extern osmo_cc_endpoint_t *ep;
-void encode_l16(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void __attribute__((unused)) *arg);
-void decode_l16(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void __attribute__((unused)) *arg);
-
static struct osmo_cc_helper_audio_codecs codecs[] = {
{ "L16", 8000, 1, encode_l16, decode_l16 },
{ NULL, 0, 0, NULL, NULL},
@@ -126,7 +126,7 @@ static void get_test_patterns(int16_t *samples, int length)
static void console_new_state(enum console_state state)
{
- PDEBUG(DCC, DEBUG_DEBUG, "Call state '%s' -> '%s'\n", console_state_name[console.state], console_state_name[state]);
+ LOGP(DCALL, LOGL_DEBUG, "Call state '%s' -> '%s'\n", console_state_name[console.state], console_state_name[state]);
console.state = state;
console.test_audio_pos = 0;
}
@@ -141,26 +141,31 @@ static void free_console(void)
console.callref = 0;
}
-void up_audio(struct osmo_cc_session_codec *codec, uint8_t __attribute__((unused)) marker, uint16_t sequence_number, uint32_t timestamp, uint32_t ssrc, uint8_t *data, int len)
+static void up_audio(struct osmo_cc_session_codec *codec, uint8_t marker, uint16_t sequence, uint32_t timestamp, uint32_t ssrc, uint8_t *payload, int payload_len)
{
- int count = len / 2;
- sample_t samples[count];
-
/* save audio from transceiver to jitter buffer */
if (console.sound) {
- int16_to_samples_speech(samples, (int16_t *)data, count);
- jitter_save(&console.dejitter, samples, count, 1, sequence_number, timestamp, ssrc);
+ jitter_frame_t *jf;
+ jf = jitter_frame_alloc(codec->decoder, &console, payload, payload_len, marker, sequence, timestamp, ssrc);
+ if (!jf)
+ return;
+ jitter_save(&console.dejitter, jf);
return;
}
/* if echo test is used, send echo back to mobile */
if (console.echo_test) {
- osmo_cc_rtp_send(codec, (uint8_t *)data, count * 2, 0, 1, count, &console);
+ osmo_cc_rtp_send_ts(codec, payload, payload_len, marker, sequence, timestamp);
return;
}
/* if no sound is used, send test tone to mobile */
if (console.state == CONSOLE_CONNECT) {
- get_test_patterns((int16_t *)data, count);
- osmo_cc_rtp_send(codec, (uint8_t *)data, count * 2, 0, 1, count, &console);
+ int16_t spl[160];
+ uint8_t *payload;
+ int payload_len;
+ get_test_patterns(spl, 160);
+ codec->encoder((uint8_t *)spl, 160 * 2, &payload, &payload_len, &console);
+ osmo_cc_rtp_send(codec, payload, payload_len, 0, 1, 160);
+ free(payload);
return;
}
}
@@ -226,7 +231,7 @@ void console_msg(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
int rc;
if (msg->type != OSMO_CC_MSG_SETUP_IND && console.callref != call->callref) {
- PDEBUG(DCC, DEBUG_ERROR, "invalid call ref %u (msg=0x%02x).\n", call->callref, msg->type);
+ LOGP(DCALL, LOGL_ERROR, "invalid call ref %u (msg=0x%02x).\n", call->callref, msg->type);
request_disconnect_release_reject(call->callref, CAUSE_INVALCALLREF, OSMO_CC_MSG_REL_REQ);
osmo_cc_free_msg(msg);
return;
@@ -243,10 +248,10 @@ void console_msg(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
rc = osmo_cc_get_ie_called(msg, 0, &type, &plan, number, sizeof(number));
if (rc < 0)
number[0] = '\0';
- PDEBUG(DCC, DEBUG_INFO, "Incoming call from '%s'\n", caller_id);
+ LOGP(DCALL, LOGL_INFO, "Incoming call from '%s'\n", caller_id);
/* setup is also allowed on disconnected call */
if (console.state == CONSOLE_DISCONNECT_RO) {
- PDEBUG(DCC, DEBUG_INFO, "Releasing pending disconnected call\n");
+ LOGP(DCALL, LOGL_INFO, "Releasing pending disconnected call\n");
if (console.callref) {
request_disconnect_release_reject(console.callref, CAUSE_NORMAL, OSMO_CC_MSG_REL_REQ);
free_console();
@@ -254,7 +259,7 @@ void console_msg(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
console_new_state(CONSOLE_IDLE);
}
if (console.state != CONSOLE_IDLE) {
- PDEBUG(DCC, DEBUG_NOTICE, "We are busy, rejecting.\n");
+ LOGP(DCALL, LOGL_NOTICE, "We are busy, rejecting.\n");
request_disconnect_release_reject(console.callref, CAUSE_NORMAL, OSMO_CC_MSG_REJ_REQ);
osmo_cc_free_msg(msg);
return;
@@ -263,7 +268,7 @@ void console_msg(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
/* sdp accept */
sdp = osmo_cc_helper_audio_accept(&ep->session_config, NULL, codecs, up_audio, msg, &console.session, &console.codec, 0);
if (!sdp) {
- PDEBUG(DCC, DEBUG_NOTICE, "Cannot accept codec, rejecting.\n");
+ LOGP(DCALL, LOGL_NOTICE, "Cannot accept codec, rejecting.\n");
request_disconnect_release_reject(console.callref, CAUSE_RESOURCE_UNAVAIL, OSMO_CC_MSG_REJ_REQ);
osmo_cc_free_msg(msg);
return;
@@ -275,7 +280,7 @@ void console_msg(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
strncpy(console.dialing, number, sizeof(console.dialing) - 1);
console.dialing[sizeof(console.dialing) - 1] = '\0';
console_new_state(CONSOLE_CONNECT);
- PDEBUG(DCC, DEBUG_INFO, "Call automatically answered\n");
+ LOGP(DCALL, LOGL_INFO, "Call automatically answered\n");
request_answer(console.callref, number, sdp);
break;
}
@@ -284,7 +289,7 @@ void console_msg(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
osmo_cc_helper_audio_negotiate(msg, &console.session, &console.codec);
break;
case OSMO_CC_MSG_ALERT_IND:
- PDEBUG(DCC, DEBUG_INFO, "Call alerting\n");
+ LOGP(DCALL, LOGL_INFO, "Call alerting\n");
osmo_cc_helper_audio_negotiate(msg, &console.session, &console.codec);
console_new_state(CONSOLE_ALERTING_RT);
break;
@@ -294,7 +299,7 @@ void console_msg(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
rc = osmo_cc_get_ie_calling(msg, 0, &type, &plan, &present, &screen, caller_id, sizeof(caller_id));
if (rc < 0)
caller_id[0] = '\0';
- PDEBUG(DCC, DEBUG_INFO, "Call connected to '%s'\n", caller_id);
+ LOGP(DCALL, LOGL_INFO, "Call connected to '%s'\n", caller_id);
osmo_cc_helper_audio_negotiate(msg, &console.session, &console.codec);
console_new_state(CONSOLE_CONNECT);
if (caller_id[0]) {
@@ -313,11 +318,11 @@ void console_msg(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
rc = osmo_cc_get_ie_progress(msg, 0, &coding, &location, &progress);
osmo_cc_helper_audio_negotiate(msg, &console.session, &console.codec);
if (rc >= 0 && (progress == 1 || progress == 8)) {
- PDEBUG(DCC, DEBUG_INFO, "Call disconnected with audio (%s)\n", cause_name(isdn_cause));
+ LOGP(DCALL, LOGL_INFO, "Call disconnected with audio (%s)\n", cause_name(isdn_cause));
console_new_state(CONSOLE_DISCONNECT_RO);
console.disc_cause = isdn_cause;
} else {
- PDEBUG(DCC, DEBUG_INFO, "Call disconnected without audio (%s)\n", cause_name(isdn_cause));
+ LOGP(DCALL, LOGL_INFO, "Call disconnected without audio (%s)\n", cause_name(isdn_cause));
request_disconnect_release_reject(console.callref, isdn_cause, OSMO_CC_MSG_REL_REQ);
console_new_state(CONSOLE_IDLE);
free_console();
@@ -328,7 +333,7 @@ void console_msg(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
rc = osmo_cc_get_ie_cause(msg, 0, &location, &isdn_cause, &sip_cause, &socket_cause);
if (rc < 0)
isdn_cause = OSMO_CC_ISDN_CAUSE_NORM_CALL_CLEAR;
- PDEBUG(DCC, DEBUG_INFO, "Call released (%s)\n", cause_name(isdn_cause));
+ LOGP(DCALL, LOGL_INFO, "Call released (%s)\n", cause_name(isdn_cause));
console_new_state(CONSOLE_IDLE);
free_console();
break;
@@ -337,29 +342,8 @@ void console_msg(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
}
static char console_text[256];
-static char console_clear[256];
static int console_len = 0;
-static void _clear_console_text(void)
-{
- if (!console_len)
- return;
-
- fwrite(console_clear, console_len, 1, stdout);
- // note: fflused by user of this function
- console_len = 0;
-}
-
-static void _print_console_text(void)
-{
- if (!console_len)
- return;
-
- printf("\033[1;37m");
- fwrite(console_text, console_len, 1, stdout);
- printf("\033[0;39m");
-}
-
int console_init(const char *audiodev, int samplerate, int buffer, int loopback, int echo_test, const char *digits, const struct number_lengths *lengths, const char *station_id)
{
int rc = 0;
@@ -367,8 +351,8 @@ int console_init(const char *audiodev, int samplerate, int buffer, int loopback,
init_testton();
- clear_console_text = _clear_console_text;
- print_console_text = _print_console_text;
+ /* Put scrolling window one line above bottom. */
+ logging_limit_scroll_bottom(1);
memset(&console, 0, sizeof(console));
strncpy(console.audiodev, audiodev, sizeof(console.audiodev) - 1);
@@ -392,13 +376,13 @@ int console_init(const char *audiodev, int samplerate, int buffer, int loopback,
rc = init_samplerate(&console.srstate, 8000.0, (double)samplerate, 3300.0);
if (rc < 0) {
- PDEBUG(DSENDER, DEBUG_ERROR, "Failed to init sample rate conversion!\n");
+ LOGP(DSENDER, LOGL_ERROR, "Failed to init sample rate conversion!\n");
goto error;
}
- rc = jitter_create(&console.dejitter, "console", 8000, sizeof(sample_t), 0.050, 0.200, JITTER_FLAG_NONE);
+ rc = jitter_create(&console.dejitter, "console", 8000, 0.040, 0.200, JITTER_FLAG_NONE);
if (rc < 0) {
- PDEBUG(DSENDER, DEBUG_ERROR, "Failed to create and init dejitter buffer!\n");
+ LOGP(DSENDER, LOGL_ERROR, "Failed to create and init dejitter buffer!\n");
goto error;
}
@@ -417,13 +401,13 @@ int console_open_audio(int __attribute__((unused)) buffer_size, double __attribu
#ifdef HAVE_ALSA
/* open sound device for call control */
/* use factor 1.4 of speech level for complete range of sound card */
- console.sound = sound_open(console.audiodev, NULL, NULL, NULL, 1, 0.0, console.samplerate, buffer_size, interval, 1.4, 4000.0, 2.0);
+ console.sound = sound_open(SOUND_DIR_DUPLEX, console.audiodev, NULL, NULL, NULL, 1, 0.0, console.samplerate, buffer_size, interval, 1.4, 4000.0, 2.0);
if (!console.sound) {
- PDEBUG(DSENDER, DEBUG_ERROR, "No sound device!\n");
+ LOGP(DSENDER, LOGL_ERROR, "No sound device!\n");
return -EIO;
}
#else
- PDEBUG(DSENDER, DEBUG_ERROR, "No sound card support compiled in!\n");
+ LOGP(DSENDER, LOGL_ERROR, "No sound card support compiled in!\n");
return -ENOTSUP;
#endif
@@ -467,7 +451,7 @@ void console_cleanup(void)
static void process_ui(int c)
{
char text[256] = "";
- int len;
+ int len, w, h;
int i;
switch (console.state) {
@@ -490,7 +474,7 @@ dial_after_hangup:
break;
}
if (c == 'd' && console.number_lengths[i].usage) {
- PDEBUG(DCC, DEBUG_INFO, "Outgoing call to '%s'\n", console.station_id);
+ LOGP(DCALL, LOGL_INFO, "Outgoing call to '%s'\n", console.station_id);
console.dialing[0] = '\0';
console_new_state(CONSOLE_SETUP_RT);
console.callref = osmo_cc_new_callref();
@@ -505,11 +489,11 @@ dial_after_hangup:
}
if (console.number_lengths[i].usage) {
if (console.number_lengths[i + 1].usage)
- sprintf(strchr(text, '\0'), "(enter digits %s or press d=dial)\r", console.digits);
+ sprintf(strchr(text, '\0'), "(enter digits %s or press d=dial)", console.digits);
else
- sprintf(strchr(text, '\0'), "(press d=dial)\r");
+ sprintf(strchr(text, '\0'), "(press d=dial)");
} else
- sprintf(strchr(text, '\0'), "(enter digits %s)\r", console.digits);
+ sprintf(strchr(text, '\0'), "(enter digits %s)", console.digits);
break;
case CONSOLE_SETUP_RO:
case CONSOLE_SETUP_RT:
@@ -519,7 +503,7 @@ dial_after_hangup:
case CONSOLE_DISCONNECT_RO:
if (c > 0) {
if (c == 'h' || (c == 'd' && console.state == CONSOLE_DISCONNECT_RO)) {
- PDEBUG(DCC, DEBUG_INFO, "Call hangup\n");
+ LOGP(DCALL, LOGL_INFO, "Call hangup\n");
if (console.callref) {
if (console.state == CONSOLE_SETUP_RO)
request_disconnect_release_reject(console.callref, CAUSE_NORMAL, OSMO_CC_MSG_REJ_REQ);
@@ -533,32 +517,46 @@ dial_after_hangup:
}
}
if (console.state == CONSOLE_SETUP_RT)
- sprintf(text, "call setup: %s (press h=hangup)\r", console.station_id);
+ sprintf(text, "call setup: %s (press h=hangup)", console.station_id);
if (console.state == CONSOLE_ALERTING_RT)
- sprintf(text, "call ringing: %s (press h=hangup)\r", console.station_id);
+ sprintf(text, "call ringing: %s (press h=hangup)", console.station_id);
if (console.state == CONSOLE_CONNECT) {
if (console.dialing[0])
- sprintf(text, "call active: %s->%s (press h=hangup)\r", console.station_id, console.dialing);
+ sprintf(text, "call active: %s->%s (press h=hangup)", console.station_id, console.dialing);
else
- sprintf(text, "call active: %s (press h=hangup)\r", console.station_id);
+ sprintf(text, "call active: %s (press h=hangup)", console.station_id);
}
if (console.state == CONSOLE_DISCONNECT_RO)
- sprintf(text, "call disconnected: %s (press h=hangup d=redial)\r", cause_name(console.disc_cause));
+ sprintf(text, "call disconnected: %s (press h=hangup d=redial)", cause_name(console.disc_cause));
break;
}
/* skip if nothing has changed */
len = strlen(text);
if (console_len == len && !memcmp(console_text, text, len))
return;
- clear_console_text();
+ /* lock logging */
+ lock_logging();
+ /* disable window */
+ enable_limit_scroll(false);
+ /* geht height */
+ get_win_size(&w, &h);
+ /* save cursor go to bottom, use white color */
+ printf("\0337\033[%d;1H\033[1;37m", h);
+ /* copy text and pad with spaces */
console_len = len;
- memcpy(console_text, text, len);
- if (len) {
- memset(console_clear, ' ', len - 1);
- console_clear[len - 1] = '\r';
- }
- print_console_text();
+ memcpy(console_text, text, console_len);
+ if (console_len < (int)MIN(sizeof(console_text), w))
+ memset(console_text + console_len, ' ', MIN(sizeof(console_text), w) - console_len);
+ /* write text */
+ fwrite(console_text, MIN(sizeof(console_text), w), 1, stdout);
+ /* reset color, go back to previous line, flush */
+ printf("\033[0;39m\0338");
+ /* flush output */
fflush(stdout);
+ /* enable window */
+ enable_limit_scroll(true);
+ /* unlock logging */
+ unlock_logging();
}
/* get keys from keyboard to control call via console
@@ -568,9 +566,6 @@ void process_console(int c)
if (!console.loopback && console.number_max_length)
process_ui(c);
- if (console.session)
- osmo_cc_session_handle(console.session, &console);
-
if (!console.sound)
return;
@@ -583,41 +578,43 @@ void process_console(int c)
count = sound_get_tosend(console.sound, console.buffer_size);
if (count < 0) {
- PDEBUG(DSENDER, DEBUG_ERROR, "Failed to get samples in buffer (rc = %d)!\n", count);
+ LOGP(DSENDER, LOGL_ERROR, "Failed to get samples in buffer (rc = %d)!\n", count);
if (count == -EPIPE)
- PDEBUG(DSENDER, DEBUG_ERROR, "Trying to recover.\n");
+ LOGP(DSENDER, LOGL_ERROR, "Trying to recover.\n");
return;
}
if (count > 0) {
/* load and upsample */
input_num = samplerate_upsample_input_num(&console.srstate, count);
- jitter_load(&console.dejitter, samples, input_num);
+ {
+ int16_t spl[input_num];
+ jitter_load_samples(&console.dejitter, (uint8_t *)spl, input_num, sizeof(*spl), jitter_conceal_s16, NULL);
+ int16_to_samples_speech(samples, spl, input_num);
+ }
samplerate_upsample(&console.srstate, samples, input_num, samples, count);
/* write to sound device */
samples_list[0] = samples;
power_list[0] = NULL;
rc = sound_write(console.sound, samples_list, power_list, count, NULL, NULL, 1);
if (rc < 0) {
- PDEBUG(DSENDER, DEBUG_ERROR, "Failed to write TX data to sound device (rc = %d)\n", rc);
+ LOGP(DSENDER, LOGL_ERROR, "Failed to write TX data to sound device (rc = %d)\n", rc);
if (rc == -EPIPE)
- PDEBUG(DSENDER, DEBUG_ERROR, "Trying to recover.\n");
+ LOGP(DSENDER, LOGL_ERROR, "Trying to recover.\n");
return;
}
}
samples_list[0] = samples;
count = sound_read(console.sound, samples_list, console.buffer_size, 1, NULL);
if (count < 0) {
- PDEBUG(DSENDER, DEBUG_ERROR, "Failed to read from sound device (rc = %d)!\n", count);
+ LOGP(DSENDER, LOGL_ERROR, "Failed to read from sound device (rc = %d)!\n", count);
if (count == -EPIPE)
- PDEBUG(DSENDER, DEBUG_ERROR, "Trying to recover.\n");
+ LOGP(DSENDER, LOGL_ERROR, "Trying to recover.\n");
return;
}
if (count) {
int i;
count = samplerate_downsample(&console.srstate, samples, count);
- if (console.loopback == 3)
- jitter_save(&console.dejitter, samples, count, 0, 0, 0, 0);
/* put samples into ring buffer */
for (i = 0; i < count; i++) {
console.tx_buffer[console.tx_buffer_pos] = samples[i];
@@ -626,9 +623,12 @@ void process_console(int c)
console.tx_buffer_pos = 0;
/* only if we have a call */
if (console.callref && console.codec) {
- int16_t data[160];
- samples_to_int16_speech(data, console.tx_buffer, 160);
- osmo_cc_rtp_send(console.codec, (uint8_t *)data, 160 * 2, 0, 1, 160, &console);
+ int16_t spl[160];
+ uint8_t *payload;
+ int payload_len;
+ samples_to_int16_speech(spl, console.tx_buffer, 160);
+ console.codec->encoder((uint8_t *)spl, 160 * 2, &payload, &payload_len, &console);
+ osmo_cc_rtp_send(console.codec, payload, payload_len, 0, 1, 160);
}
}
}
@@ -636,3 +636,17 @@ void process_console(int c)
#endif
}
+/* Call this for every inscription. If the console's dial string is empty, it is set to the number that has been inscribed. */
+int console_inscription(const char *station_id)
+{
+ if (console.loopback || !console.number_max_length)
+ return -EINVAL;
+
+ if (console.station_id[0])
+ return 1;
+
+ strncpy(console.station_id, station_id, sizeof(console.station_id) - 1);
+ process_ui(-1);
+ return 0;
+}
+
diff --git a/src/libmobile/console.h b/src/libmobile/console.h
index 20b5a44..53fc1fd 100644
--- a/src/libmobile/console.h
+++ b/src/libmobile/console.h
@@ -1,4 +1,9 @@
+#include <osmocom/core/timer.h>
+#include <osmocom/core/select.h>
+#include <osmocom/cc/endpoint.h>
+#include "main_mobile.h"
+
void console_msg(osmo_cc_call_t *call, osmo_cc_msg_t *msg);
int console_init(const char *audiodev, int samplerate, int buffer, int loopback, int echo_test, const char *digits, const struct number_lengths *lengths, const char *station_id);
void console_cleanup(void);
@@ -6,4 +11,5 @@ int console_open_audio(int buffer_size, double interval);
int console_start_audio(void);
void console_process(int c);
void process_console(int c);
+int console_inscription(const char *station_id);
diff --git a/src/libmobile/get_time.c b/src/libmobile/get_time.c
new file mode 100644
index 0000000..85305a1
--- /dev/null
+++ b/src/libmobile/get_time.c
@@ -0,0 +1,13 @@
+#include <time.h>
+
+#include "get_time.h"
+
+double get_time(void)
+{
+ static struct timespec tv;
+
+ clock_gettime(CLOCK_REALTIME, &tv);
+
+ return (double)tv.tv_sec + (double)tv.tv_nsec / 1000000000.0;
+}
+
diff --git a/src/libmobile/get_time.h b/src/libmobile/get_time.h
new file mode 100644
index 0000000..1bd0c0b
--- /dev/null
+++ b/src/libmobile/get_time.h
@@ -0,0 +1,3 @@
+
+double get_time(void);
+
diff --git a/src/libmobile/main_mobile.c b/src/libmobile/main_mobile.c
index a6e7702..74208ac 100644
--- a/src/libmobile/main_mobile.c
+++ b/src/libmobile/main_mobile.c
@@ -28,13 +28,14 @@
#include <termios.h>
#include <errno.h>
#include "../libsample/sample.h"
-#include "main_mobile.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "sender.h"
-#include "../libtimer/timer.h"
+#include <osmocom/core/timer.h>
+#include <osmocom/core/select.h>
+#include <osmocom/cc/endpoint.h>
#include "call.h"
-#include "../libosmocc/endpoint.h"
#include "console.h"
+#include "get_time.h"
#ifdef HAVE_SDR
#include "../libsdr/sdr.h"
#include "../libsdr/sdr_config.h"
@@ -71,10 +72,11 @@ static int use_osmocc_sock = 0;
#define MAX_CC_ARGS 1024
static int cc_argc = 0;
static const char *cc_argv[MAX_CC_ARGS];
+int no_l16 = 0;
int send_patterns = 1;
static int release_on_disconnect = 1;
int loopback = 0;
-int rt_prio = 1;
+int rt_prio = 0;
int fast_math = 0;
const char *write_tx_wave = NULL;
const char *write_rx_wave = NULL;
@@ -165,6 +167,8 @@ const char *(*mobile_number_check_valid)(const char *);
void main_mobile_init(const char *digits, const struct number_lengths lengths[], const char *prefixes[], const char *(*check_valid)(const char *))
{
+ logging_init();
+
cc_argv[cc_argc++] = options_strdup("remote auto");
number_digits = digits;
@@ -178,6 +182,14 @@ void main_mobile_init(const char *digits, const struct number_lengths lengths[],
#endif
}
+void main_mobile_exit(void)
+{
+ if (got_init) {
+ enable_limit_scroll(false);
+ printf("\n\n");
+ }
+}
+
void main_mobile_set_number_check_valid(const char *(*check_valid)(const char *))
{
mobile_number_check_valid = check_valid;
@@ -228,12 +240,16 @@ void main_mobile_print_help(const char *arg0, const char *ext_usage)
printf(" --config [~/]<path to config file>\n");
printf(" Give a config file to use. If it starts with '~/', path is at home dir.\n");
printf(" Each line in config file is one option, '-' or '--' must not be given!\n");
- debug_print_help();
+ printf(" Default: '%s'\n", selected_config_file);
+ printf(" --no-config\n");
+ printf(" Even if a config file exists, don't use it.\n");
+ logging_print_help();
printf(" -k --kanal <channel>\n");
printf(" -k --channel <channel>\n");
printf(" Channel (German = Kanal) number of \"Sender\" (German = Transceiver)\n");
- printf(" -a --audio-device hw:<card>,<device>\n");
+ printf(" -a --audio-device hw:<card>,<device>[/hw:<card>.<rec-device>]\n");
printf(" Sound card and device number (default = '%s')\n", dsp_device[0]);
+ printf(" You may specify a different recording device by using '/'.\n");
printf(" Don't set it for SDR!\n");
printf(" -s --samplerate <rate>\n");
printf(" Sample rate of sound device (default = '%d')\n", dsp_samplerate);
@@ -261,8 +277,9 @@ void main_mobile_print_help(const char *arg0, const char *ext_usage)
printf(" -e --echo-test\n");
printf(" Use echo test, to send back audio from mobile phone's microphone to\n");
printf(" the speaker. (German: 'Blasprobe').\n");
- printf(" -c --call-device hw:<card>,<device>\n");
+ printf(" -c --call-device hw:<card>,<device>[/hw:<card>.<rec-device>]\n");
printf(" Sound card and device number for headset (default = '%s')\n", call_device);
+ printf(" You may specify a different recording device by using '/'.\n");
printf(" --call-samplerate <rate>\n");
printf(" Sample rate of sound device for headset (default = '%d')\n", call_samplerate);
printf(" --call-buffer <ms>\n");
@@ -275,6 +292,8 @@ void main_mobile_print_help(const char *arg0, const char *ext_usage)
printf(" Disable built-in call control and offer socket\n");
printf(" --cc \"<osmo-cc arg>\" [--cc ...]\n");
printf(" Pass arguments to Osmo-CC endpoint. Use '-cc help' for description.\n");
+ printf(" --no-l16\n");
+ printf(" Disable L16 (linear 16 bit) codec.\n");
printf(" -t --tones 0 | 1\n");
printf(" Connect call on setup/release to provide classic tones towards fixed\n");
printf(" network (default = '%d')\n", send_patterns);
@@ -357,6 +376,7 @@ void main_mobile_print_hotkeys(void)
#define OPT_CALL_SAMPLERATE 1008
#define OPT_CALL_BUFFER 1009
#define OPT_FAST_MATH 1010
+#define OPT_NO_L16 1011
#define OPT_LIMESDR 1100
#define OPT_LIMESDR_MINI 1101
@@ -378,6 +398,7 @@ void main_mobile_add_options(void)
option_add('x', "osmocc-cross", 0);
option_add('o', "osmocc-sock", 0);
option_add(OPT_OSMO_CC, "cc", 1);
+ option_add(OPT_NO_L16, "no-l16", 0);
option_add('c', "call-device", 1);
option_add(OPT_CALL_SAMPLERATE, "call-samplerate", 1);
option_add(OPT_CALL_BUFFER, "call-buffer", 1);
@@ -396,8 +417,6 @@ void main_mobile_add_options(void)
#endif
};
-void print_help(const char *arg0);
-
int main_mobile_handle_options(int short_option, int argi, char **argv)
{
double gain_db;
@@ -408,13 +427,11 @@ int main_mobile_handle_options(int short_option, int argi, char **argv)
print_help(argv[0]);
return 0;
case 'v':
- if (!strcasecmp(argv[argi], "list")) {
- debug_list_cat();
+ rc = parse_logging_opt(argv[argi]);
+ if (rc > 0)
return 0;
- }
- rc = parse_debug_opt(argv[argi]);
if (rc < 0) {
- fprintf(stderr, "Failed to parse debug option, please use -h for help.\n");
+ fprintf(stderr, "Failed to parse logging option, please use -h for help.\n");
return rc;
}
break;
@@ -479,6 +496,9 @@ int main_mobile_handle_options(int short_option, int argi, char **argv)
}
cc_argv[cc_argc++] = options_strdup(argv[argi]);
break;
+ case OPT_NO_L16:
+ no_l16 = 1;
+ break;
case 'c':
call_device = options_strdup(argv[argi]);
break;
@@ -568,8 +588,6 @@ void sighandler(int sigset)
if (sigset == SIGPIPE)
return;
- if (clear_console_text)
- clear_console_text();
printf("Signal received: %d\n", sigset);
quit = 1;
@@ -599,6 +617,7 @@ void main_mobile_loop(const char *name, int *quit, void (*myhandler)(void), cons
sender_t *sender;
double last_time_call = 0, begin_time, now, sleep;
struct termios term, term_orig;
+ int num_chan, i;
int c;
int rc;
@@ -657,7 +676,7 @@ void main_mobile_loop(const char *name, int *quit, void (*myhandler)(void), cons
console_init(call_device, call_samplerate, call_buffer, loopback, echo_test, number_digits, number_lengths, station_id);
/* init call control instance */
- rc = call_init(name, (use_osmocc_sock) ? send_patterns : 0, release_on_disconnect, use_osmocc_sock, cc_argc, cc_argv);
+ rc = call_init(name, (use_osmocc_sock) ? send_patterns : 0, release_on_disconnect, use_osmocc_sock, cc_argc, cc_argv, no_l16);
if (rc < 0) {
fprintf(stderr, "Failed to create call control instance. Quitting!\n");
return;
@@ -675,8 +694,14 @@ void main_mobile_loop(const char *name, int *quit, void (*myhandler)(void), cons
if (console_open_audio(buffer_size, dsp_interval))
return;
- if (!loopback)
- print_aaimage();
+ /* alloc memory for audio processing */
+ for (num_chan = 0, sender = sender_head; sender; num_chan++, sender = sender->next);
+ sample_t *samples[num_chan];
+ uint8_t *powers[num_chan];
+ for (i = 0; i < num_chan; i++) {
+ samples[i] = calloc(buffer_size, sizeof(**samples));
+ powers[i] = calloc(buffer_size, sizeof(**powers));
+ }
/* real time priority */
if (rt_prio > 0) {
@@ -686,10 +711,15 @@ void main_mobile_loop(const char *name, int *quit, void (*myhandler)(void), cons
memset(&schedp, 0, sizeof(schedp));
schedp.sched_priority = rt_prio;
rc = sched_setscheduler(0, SCHED_RR, &schedp);
- if (rc)
+ if (rc) {
fprintf(stderr, "Error setting SCHED_RR with prio %d\n", rt_prio);
+ return;
+ }
}
+ if (!loopback)
+ print_aaimage();
+
/* prepare terminal */
tcgetattr(0, &term_orig);
term = term_orig;
@@ -711,6 +741,7 @@ void main_mobile_loop(const char *name, int *quit, void (*myhandler)(void), cons
*quit = 1;
while(!(*quit)) {
+ int work;
begin_time = get_time();
/* process sound of all transceivers */
@@ -718,12 +749,9 @@ void main_mobile_loop(const char *name, int *quit, void (*myhandler)(void), cons
/* do not process audio for an audio slave, since it is done by audio master */
if (sender->master) /* if master is set, we are an audio slave */
continue;
- process_sender_audio(sender, quit, buffer_size);
+ process_sender_audio(sender, quit, samples, powers, buffer_size);
}
- /* process timers */
- process_timer();
-
/* process audio for call instances */
now = get_time();
if (now - last_time_call >= 0.1)
@@ -739,8 +767,6 @@ next_char:
switch (c) {
case 3:
/* quit */
- if (clear_console_text)
- clear_console_text();
printf("CTRL+c received, quitting!\n");
*quit = 1;
goto next_char;
@@ -777,6 +803,8 @@ next_char:
#ifdef HAVE_SDR
case 'q':
/* toggle IQ display */
+ if (!use_sdr)
+ goto next_char;
display_wave_on(0);
display_status_on(0);
display_measurements_on(0);
@@ -785,6 +813,8 @@ next_char:
goto next_char;
case 's':
/* toggle spectrum display */
+ if (!use_sdr)
+ goto next_char;
display_wave_on(0);
display_status_on(0);
display_measurements_on(0);
@@ -803,9 +833,13 @@ next_char:
#endif
}
- /* process call control */
- call_media_handle();
- while (call_handle());
+ /* handle all handlers until no more events */
+ do {
+ work = 0;
+ work |= osmo_cc_handle();
+ work |= osmo_select_main(1);
+ } while (work);
+
if (!use_osmocc_sock)
process_console(c);
@@ -831,9 +865,10 @@ next_char:
signal(SIGTERM, SIG_DFL);
signal(SIGPIPE, SIG_DFL);
- /* get rid of last entry */
- if (clear_console_text)
- clear_console_text();
+ for (i = 0; i < num_chan; i++) {
+ free(samples[i]);
+ free(powers[i]);
+ }
/* reset terminal */
tcsetattr(0, TCSANOW, &term_orig);
diff --git a/src/libmobile/main_mobile.h b/src/libmobile/main_mobile.h
index c0fe797..d5bd0a0 100644
--- a/src/libmobile/main_mobile.h
+++ b/src/libmobile/main_mobile.h
@@ -28,6 +28,8 @@ struct number_lengths {
const char *usage;
};
+void print_help(const char *);
+
const char *mobile_number_remove_prefix(const char *number);
const char *mobile_number_check_length(const char *number);
const char *mobile_number_check_digits(const char *number);
@@ -35,6 +37,7 @@ extern const char *(*mobile_number_check_valid)(const char *);
int main_mobile_number_ask(const char *number, const char *what);
void main_mobile_init(const char *digits, const struct number_lengths lengths[], const char *prefixes[], const char *(*check_valid)(const char *));
+void main_mobile_exit(void);
void main_mobile_set_number_check_valid(const char *(*check_valid)(const char *));
void main_mobile_print_help(const char *arg0, const char *ext_usage);
void main_mobile_print_hotkeys(void);
@@ -56,5 +59,3 @@ void sighandler(int sigset);
void main_mobile_loop(const char *name, int *quit, void (*myhandler)(void), const char *station_id);
-void dump_info(void);
-
diff --git a/src/libmobile/sender.c b/src/libmobile/sender.c
index 8b62f3c..82873af 100644
--- a/src/libmobile/sender.c
+++ b/src/libmobile/sender.c
@@ -25,9 +25,9 @@
#include <errno.h>
#include <string.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "sender.h"
-#include "../libtimer/timer.h"
+#include <osmocom/core/timer.h>
#ifdef HAVE_SDR
#include "../libsdr/sdr_config.h"
#endif
@@ -69,12 +69,12 @@ int sender_create(sender_t *sender, const char *kanal, double sendefrequenz, dou
}
if (samplerate < 8000) {
- PDEBUG(DSENDER, DEBUG_NOTICE, "Given sample rate is below 8 KHz. Please use higher sample rate!\n");
+ LOGP(DSENDER, LOGL_NOTICE, "Given sample rate is below 8 KHz. Please use higher sample rate!\n");
rc = -EINVAL;
goto error;
}
- PDEBUG_CHAN(DSENDER, DEBUG_DEBUG, "Creating 'Sender' instance\n");
+ LOGP_CHAN(DSENDER, LOGL_DEBUG, "Creating 'Sender' instance\n");
/* if we find a channel that uses the same device as we do,
* we will link us as slave to this master channel. then we
@@ -83,27 +83,27 @@ int sender_create(sender_t *sender, const char *kanal, double sendefrequenz, dou
*/
for (master = sender_head; master; master = master->next) {
if (!strcmp(master->kanal, kanal)) {
- PDEBUG(DSENDER, DEBUG_ERROR, "Channel %s may not be defined for multiple transceivers!\n", kanal);
+ LOGP(DSENDER, LOGL_ERROR, "Channel %s may not be defined for multiple transceivers!\n", kanal);
rc = -EIO;
goto error;
}
if (check_channel && abs(atoi(master->kanal) - atoi(kanal)) == 1) {
- PDEBUG(DSENDER, DEBUG_NOTICE, "------------------------------------------------------------------------\n");
- PDEBUG(DSENDER, DEBUG_NOTICE, "NOTE: Channel %s is next to channel %s. This will cause interferences.\n", kanal, master->kanal);
- PDEBUG(DSENDER, DEBUG_NOTICE, "Please use at least one channel distance to avoid that.\n");
- PDEBUG(DSENDER, DEBUG_NOTICE, "------------------------------------------------------------------------\n");
+ LOGP(DSENDER, LOGL_NOTICE, "------------------------------------------------------------------------\n");
+ LOGP(DSENDER, LOGL_NOTICE, "NOTE: Channel %s is next to channel %s. This will cause interferences.\n", kanal, master->kanal);
+ LOGP(DSENDER, LOGL_NOTICE, "Please use at least one channel distance to avoid that.\n");
+ LOGP(DSENDER, LOGL_NOTICE, "------------------------------------------------------------------------\n");
}
if (!strcmp(master->device, device))
break;
}
if (master) {
if (master->paging_signal != PAGING_SIGNAL_NONE && !use_sdr) {
- PDEBUG(DSENDER, DEBUG_ERROR, "Cannot share audio device with channel %s, because its second audio channel is used for paging signal! Use different audio device.\n", master->kanal);
+ LOGP(DSENDER, LOGL_ERROR, "Cannot share audio device with channel %s, because its second audio channel is used for paging signal! Use different audio device.\n", master->kanal);
rc = -EBUSY;
goto error;
}
if (paging_signal != PAGING_SIGNAL_NONE && !use_sdr) {
- PDEBUG(DSENDER, DEBUG_ERROR, "Cannot share audio device with channel %s, because we need a second audio channel for paging signal! Use different audio device.\n", master->kanal);
+ LOGP(DSENDER, LOGL_ERROR, "Cannot share audio device with channel %s, because we need a second audio channel for paging signal! Use different audio device.\n", master->kanal);
rc = -EBUSY;
goto error;
}
@@ -136,7 +136,7 @@ int sender_create(sender_t *sender, const char *kanal, double sendefrequenz, dou
sender->audio_write = sound_write;
sender->audio_get_tosend = sound_get_tosend;
#else
- PDEBUG(DSENDER, DEBUG_ERROR, "No sound card support compiled in!\n");
+ LOGP(DSENDER, LOGL_ERROR, "No sound card support compiled in!\n");
rc = -ENOTSUP;
goto error;
#endif
@@ -145,19 +145,19 @@ int sender_create(sender_t *sender, const char *kanal, double sendefrequenz, dou
rc = init_samplerate(&sender->srstate, 8000.0, (double)samplerate, 3300.0);
if (rc < 0) {
- PDEBUG(DSENDER, DEBUG_ERROR, "Failed to init sample rate conversion!\n");
+ LOGP(DSENDER, LOGL_ERROR, "Failed to init sample rate conversion!\n");
goto error;
}
- rc = jitter_create(&sender->dejitter, sender->kanal, 8000, sizeof(sample_t), JITTER_AUDIO);
+ rc = jitter_create(&sender->dejitter, sender->kanal, 8000, JITTER_AUDIO);
if (rc < 0) {
- PDEBUG(DSENDER, DEBUG_ERROR, "Failed to create and init audio buffer!\n");
+ LOGP(DSENDER, LOGL_ERROR, "Failed to create and init audio buffer!\n");
goto error;
}
- rc = jitter_create(&sender->loop_dejitter, sender->kanal, samplerate, sizeof(sample_t), JITTER_AUDIO);
+ rc = jitter_create(&sender->loop_dejitter, sender->kanal, samplerate, JITTER_AUDIO);
if (rc < 0) {
- PDEBUG(DSENDER, DEBUG_ERROR, "Failed to create and init audio buffer!\n");
+ LOGP(DSENDER, LOGL_ERROR, "Failed to create and init loop audio buffer!\n");
goto error;
}
@@ -208,36 +208,36 @@ int sender_open_audio(int buffer_size, double interval)
if (master->write_rx_wave) {
rc = wave_create_record(&master->wave_rx_rec, master->write_rx_wave, master->samplerate, channels, (master->max_deviation) ?: 1.0);
if (rc < 0) {
- PDEBUG(DSENDER, DEBUG_ERROR, "Failed to create WAVE recoding instance!\n");
+ LOGP(DSENDER, LOGL_ERROR, "Failed to create WAVE recoding instance!\n");
return rc;
}
}
if (master->write_tx_wave) {
rc = wave_create_record(&master->wave_tx_rec, master->write_tx_wave, master->samplerate, channels, (master->max_deviation) ?: 1.0);
if (rc < 0) {
- PDEBUG(DSENDER, DEBUG_ERROR, "Failed to create WAVE recoding instance!\n");
+ LOGP(DSENDER, LOGL_ERROR, "Failed to create WAVE recoding instance!\n");
return rc;
}
}
if (master->read_rx_wave) {
rc = wave_create_playback(&master->wave_rx_play, master->read_rx_wave, &master->samplerate, &channels, (master->max_deviation) ?: 1.0);
if (rc < 0) {
- PDEBUG(DSENDER, DEBUG_ERROR, "Failed to create WAVE playback instance!\n");
+ LOGP(DSENDER, LOGL_ERROR, "Failed to create WAVE playback instance!\n");
return rc;
}
}
if (master->read_tx_wave) {
rc = wave_create_playback(&master->wave_tx_play, master->read_tx_wave, &master->samplerate, &channels, (master->max_deviation) ?: 1.0);
if (rc < 0) {
- PDEBUG(DSENDER, DEBUG_ERROR, "Failed to create WAVE playback instance!\n");
+ LOGP(DSENDER, LOGL_ERROR, "Failed to create WAVE playback instance!\n");
return rc;
}
}
/* open device */
- master->audio = master->audio_open(master->device, tx_f, rx_f, am, channels, paging_frequency, master->samplerate, buffer_size, interval, (master->max_deviation) ?: 1.0, master->max_modulation, master->modulation_index);
+ master->audio = master->audio_open(SOUND_DIR_DUPLEX, master->device, tx_f, rx_f, am, channels, paging_frequency, master->samplerate, buffer_size, interval, (master->max_deviation) ?: 1.0, master->max_modulation, master->modulation_index);
if (!master->audio) {
- PDEBUG(DSENDER, DEBUG_ERROR, "No device for transceiver!\n");
+ LOGP(DSENDER, LOGL_ERROR, "No device for transceiver!\n");
return -EIO;
}
}
@@ -273,7 +273,7 @@ int sender_start_audio(void)
/* Destroy transceiver instance and unlink from list. */
void sender_destroy(sender_t *sender)
{
- PDEBUG_CHAN(DSENDER, DEBUG_DEBUG, "Destroying 'Sender' instance\n");
+ LOGP_CHAN(DSENDER, LOGL_DEBUG, "Destroying 'Sender' instance\n");
sender_tailp = &sender_head;
while (*sender_tailp) {
@@ -305,8 +305,8 @@ void sender_set_fm(sender_t *sender, double max_deviation, double max_modulation
sender->speech_deviation = speech_deviation;
sender->max_display = max_display;
- PDEBUG_CHAN(DSENDER, DEBUG_DEBUG, "Maximum deviation: %.1f kHz, Maximum modulation: %.1f kHz\n", max_deviation / 1000.0, max_modulation / 1000.0);
- PDEBUG_CHAN(DSENDER, DEBUG_DEBUG, "Deviation at speech level: %.1f kHz\n", speech_deviation / 1000.0);
+ LOGP_CHAN(DSENDER, LOGL_DEBUG, "Maximum deviation: %.1f kHz, Maximum modulation: %.1f kHz\n", max_deviation / 1000.0, max_modulation / 1000.0);
+ LOGP_CHAN(DSENDER, LOGL_DEBUG, "Deviation at speech level: %.1f kHz\n", speech_deviation / 1000.0);
}
/* set amplitude modulation and parameters */
@@ -319,7 +319,7 @@ void sender_set_am(sender_t *sender, double max_modulation, double speech_level,
sender->max_display = max_display;
sender->modulation_index = modulation_index;
- PDEBUG_CHAN(DSENDER, DEBUG_DEBUG, "Modulation degree: %.0f %%, Maximum modulation: %.1f kHz\n", modulation_index / 100.0, max_modulation / 1000.0);
+ LOGP_CHAN(DSENDER, LOGL_DEBUG, "Modulation degree: %.0f %%, Maximum modulation: %.1f kHz\n", modulation_index / 100.0, max_modulation / 1000.0);
}
static void gain_samples(sample_t *samples, int length, double gain)
@@ -331,7 +331,7 @@ static void gain_samples(sample_t *samples, int length, double gain)
}
/* Handle audio streaming of one transceiver. */
-void process_sender_audio(sender_t *sender, int *quit, int buffer_size)
+void process_sender_audio(sender_t *sender, int *quit, sample_t **samples, uint8_t **power, int buffer_size)
{
sender_t *inst;
int rc, count;
@@ -342,30 +342,24 @@ void process_sender_audio(sender_t *sender, int *quit, int buffer_size)
/* count instances for audio channel */
for (num_chan = 0, inst = sender; inst; num_chan++, inst = inst->slave);
- sample_t buff[num_chan][buffer_size], *samples[num_chan];
- uint8_t pbuff[num_chan][buffer_size], *power[num_chan];
enum paging_signal paging_signal[num_chan];
int on[num_chan];
double rf_level_db[num_chan];
- for (i = 0; i < num_chan; i++) {
- samples[i] = buff[i];
- power[i] = pbuff[i];
- }
#ifdef DEBUG_TIME_CONSUMPTION
t1 = get_time();
#endif
count = sender->audio_get_tosend(sender->audio, buffer_size);
if (count < 0) {
- PDEBUG_CHAN(DSENDER, DEBUG_ERROR, "Failed to get number of samples in buffer (rc = %d)!\n", count);
+ LOGP_CHAN(DSENDER, LOGL_ERROR, "Failed to get number of samples in buffer (rc = %d)!\n", count);
if (count == -EPIPE) {
if (cant_recover) {
cant_recover:
- PDEBUG(DSENDER, DEBUG_ERROR, "Cannot recover due to measurements, quitting!\n");
+ LOGP(DSENDER, LOGL_ERROR, "Cannot recover due to measurements, quitting!\n");
*quit = 1;
return;
}
- PDEBUG(DSENDER, DEBUG_ERROR, "Trying to recover!\n");
+ LOGP(DSENDER, LOGL_ERROR, "Trying to recover!\n");
}
return;
}
@@ -380,7 +374,7 @@ cant_recover:
for (i = 0, inst = sender; inst; i++, inst = inst->slave) {
/* load TX data from audio loop or from sender instance */
if (inst->loopback == 3)
- jitter_load(&inst->loop_dejitter, samples[i], count);
+ jitter_load_samples(&inst->loop_dejitter, (uint8_t *)samples[i], count, sizeof(*(samples[i])), NULL, NULL);
else
sender_send(inst, samples[i], power[i], count);
/* internal loopback: loop back TX audio to RX */
@@ -411,11 +405,11 @@ cant_recover:
rc = sender->audio_write(sender->audio, samples, power, count, paging_signal, on, num_chan);
if (rc < 0) {
- PDEBUG(DSENDER, DEBUG_ERROR, "Failed to write TX data to audio device (rc = %d)\n", rc);
+ LOGP(DSENDER, LOGL_ERROR, "Failed to write TX data to audio device (rc = %d)\n", rc);
if (rc == -EPIPE) {
if (cant_recover)
goto cant_recover;
- PDEBUG(DSENDER, DEBUG_ERROR, "Trying to recover!\n");
+ LOGP(DSENDER, LOGL_ERROR, "Trying to recover!\n");
}
return;
}
@@ -431,11 +425,11 @@ cant_recover:
*quit = 1;
return;
}
- PDEBUG(DSENDER, DEBUG_ERROR, "Failed to read from audio device (rc = %d)!\n", count);
+ LOGP(DSENDER, LOGL_ERROR, "Failed to read from audio device (rc = %d)!\n", count);
if (count == -EPIPE) {
if (cant_recover)
goto cant_recover;
- PDEBUG(DSENDER, DEBUG_ERROR, "Trying to recover!\n");
+ LOGP(DSENDER, LOGL_ERROR, "Trying to recover!\n");
}
return;
}
@@ -464,8 +458,14 @@ cant_recover:
display_wave(&inst->dispwav, samples[i], count, inst->max_display);
sender_receive(inst, samples[i], count, rf_level_db[i]);
}
- if (inst->loopback == 3)
- jitter_save(&inst->loop_dejitter, samples[i], count, 0, 0, 0, 0);
+ if (inst->loopback == 3) {
+ jitter_frame_t *jf;
+ jf = jitter_frame_alloc(NULL, NULL, (uint8_t *)samples[i], count * sizeof(*(samples[i])), 0, inst->loop_sequence, inst->loop_timestamp, 123);
+ if (jf)
+ jitter_save(&inst->loop_dejitter, jf);
+ inst->loop_sequence += 1;
+ inst->loop_timestamp += count;
+ }
}
}
#ifdef DEBUG_TIME_CONSUMPTION
diff --git a/src/libmobile/sender.h b/src/libmobile/sender.h
index 944ae75..c7d4ee6 100644
--- a/src/libmobile/sender.h
+++ b/src/libmobile/sender.h
@@ -44,7 +44,7 @@ typedef struct sender {
/* audio */
void *audio;
char device[64]; /* audio device name (alsa or sdr) */
- void *(*audio_open)(const char *, double *, double *, int *, int, double, int, int, double, double, double, double);
+ void *(*audio_open)(int, const char *, double *, double *, int *, int, double, int, int, double, double, double, double);
int (*audio_start)(void *);
void (*audio_close)(void *);
int (*audio_write)(void *, sample_t **, uint8_t **, int, enum paging_signal *, int *, int);
@@ -59,7 +59,7 @@ typedef struct sender {
emphasis_t estate; /* pre and de emphasis */
/* loopback test */
- int loopback; /* 0 = off, 1 = internal, 2 = external */
+ int loopback; /* 0 = off, 1 = internal, 2 = external, 3 = audio loop */
/* record and playback */
const char *write_rx_wave; /* file name pointers */
@@ -71,9 +71,11 @@ typedef struct sender {
wave_play_t wave_rx_play; /* wave playback (as rx) */
wave_play_t wave_tx_play; /* wave playback (as tx) */
- /* audio buffer for audio to send to transmitter (also used as loopback buffer) */
+ /* audio buffer for audio to send to transmitter */
jitter_t dejitter;
jitter_t loop_dejitter;
+ uint16_t loop_sequence; /* sequence + ts for loopback mode */
+ uint32_t loop_timestamp;
/* audio buffer for audio to send to caller (20ms = 160 samples @ 8000Hz) */
sample_t rxbuf[160];
@@ -100,9 +102,10 @@ void sender_set_fm(sender_t *sender, double max_deviation, double max_modulation
void sender_set_am(sender_t *sender, double max_modulation, double speech_deviation, double max_display, double modulation_index);
int sender_open_audio(int buffer_size, double interval);
int sender_start_audio(void);
-void process_sender_audio(sender_t *sender, int *quit, int buffer_size);
+void process_sender_audio(sender_t *sender, int *quit, sample_t **samples, uint8_t **power, int buffer_size);
void sender_send(sender_t *sender, sample_t *samples, uint8_t *power, int count);
void sender_receive(sender_t *sender, sample_t *samples, int count, double rf_level_db);
void sender_paging(sender_t *sender, int on);
sender_t *get_sender_by_empfangsfrequenz(double freq);
+void sender_conceal(uint8_t *_spl, int len, void __attribute__((unused)) *priv);
diff --git a/src/libmobile/testton.c b/src/libmobile/testton.c
index 87f866f..aabe283 100644
--- a/src/libmobile/testton.c
+++ b/src/libmobile/testton.c
@@ -1,4 +1,5 @@
#include <stdint.h>
+#include "testton.h"
static uint16_t pattern[] = {
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x0000,
diff --git a/src/libmtp/Makefile.am b/src/libmtp/Makefile.am
index d46d63b..f8bc31e 100644
--- a/src/libmtp/Makefile.am
+++ b/src/libmtp/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
noinst_LIBRARIES = libmtp.a
diff --git a/src/libmtp/layer2.c b/src/libmtp/layer2.c
index 42fc9ce..32774d6 100755
--- a/src/libmtp/layer2.c
+++ b/src/libmtp/layer2.c
@@ -33,8 +33,10 @@
#include <string.h>
#include <errno.h>
#include <stdlib.h>
-#include "../libtimer/timer.h"
-#include "../libdebug/debug.h"
+#include <math.h>
+#include <osmocom/core/timer.h>
+#include <osmocom/core/utils.h>
+#include "../liblogging/logging.h"
#include "crc16.h"
#include "mtp.h"
@@ -67,6 +69,8 @@
#define T ((mtp->bitrate >= 64000) ? T_64k : T_4k8)
#define D 256
+#define FLOAT_TO_TIMEOUT(f) floor(f), ((f) - floor(f)) * 1000000
+
const char *mtp_sf_names[8] = {
"SIO (Out of alignment)",
"SIN (Normal alignment)",
@@ -124,7 +128,7 @@ void mtp_l2_new_state(mtp_t *mtp, enum mtp_l2state state)
{
if (mtp->l2_state == state)
return;
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Change state '%s' -> '%s'\n", mtp_state_names[mtp->l2_state], mtp_state_names[state]);
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Change state '%s' -> '%s'\n", mtp_state_names[mtp->l2_state], mtp_state_names[state]);
mtp->l2_state = state;
}
@@ -135,12 +139,12 @@ static void mtp_stop(mtp_t *mtp, enum mtp_prim __attribute__((unused)) prim, uin
mtp_flush(mtp);
/* Send SIOS */
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Now sending SIOS\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Now sending SIOS\n");
mtp->tx_lssu = STATUS_OS;
/* Cancel processor outage */
if (mtp->remote_outage) {
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Cancel remote processor outage\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Cancel remote processor outage\n");
mtp->remote_outage = 0;
}
@@ -148,21 +152,21 @@ static void mtp_stop(mtp_t *mtp, enum mtp_prim __attribute__((unused)) prim, uin
mtp->remote_emergency = 0;
/* stop all timers */
- if (timer_running(&mtp->t1)) {
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Stop timer T1\n");
- timer_stop(&mtp->t1);
+ if (osmo_timer_pending(&mtp->t1)) {
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Stop timer T1\n");
+ osmo_timer_del(&mtp->t1);
}
- if (timer_running(&mtp->t2)) {
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Stop timer T2\n");
- timer_stop(&mtp->t2);
+ if (osmo_timer_pending(&mtp->t2)) {
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Stop timer T2\n");
+ osmo_timer_del(&mtp->t2);
}
- if (timer_running(&mtp->t3)) {
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Stop timer T3\n");
- timer_stop(&mtp->t3);
+ if (osmo_timer_pending(&mtp->t3)) {
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Stop timer T3\n");
+ osmo_timer_del(&mtp->t3);
}
- if (timer_running(&mtp->t4)) {
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Stop timer T4\n");
- timer_stop(&mtp->t4);
+ if (osmo_timer_pending(&mtp->t4)) {
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Stop timer T4\n");
+ osmo_timer_del(&mtp->t4);
}
/* reset sequence numbers */
@@ -180,12 +184,12 @@ static void mtp_stop(mtp_t *mtp, enum mtp_prim __attribute__((unused)) prim, uin
static void mtp_l3_start(mtp_t *mtp, enum mtp_prim __attribute__((unused)) prim, uint8_t __attribute__((unused)) *data, int __attribute__((unused)) len)
{
/* Send SIO */
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Now sending SIO\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Now sending SIO\n");
mtp->tx_lssu = STATUS_O;
/* Start T2 */
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Start timer T2 for %.3f seconds\n", T2);
- timer_start(&mtp->t2, T2);
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Start timer T2 for %.3f seconds\n", T2);
+ osmo_timer_schedule(&mtp->t2, FLOAT_TO_TIMEOUT(T2));
/* reset monitor counters */
mtp->proving_errors = 0;
@@ -204,20 +208,20 @@ static void mtp_t2_timeout(mtp_t *mtp, enum mtp_prim __attribute__((unused)) pri
mtp_stop(mtp, prim, data, len);
/* send message to upper layer */
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Telling L3 that we are out of service because of alignment failure\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Telling L3 that we are out of service because of alignment failure\n");
mtp_l2l3(mtp, MTP_PRIM_OUT_OF_SERVICE, 0, &cause, 1);
}
static void mtp_go_aligned(mtp_t *mtp, enum mtp_prim __attribute__((unused)) prim, uint8_t __attribute__((unused)) *data, int __attribute__((unused)) len)
{
/* stop timers */
- if (timer_running(&mtp->t2)) {
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Stop timer T2\n");
- timer_stop(&mtp->t2);
+ if (osmo_timer_pending(&mtp->t2)) {
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Stop timer T2\n");
+ osmo_timer_del(&mtp->t2);
}
- if (timer_running(&mtp->t4)) {
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Stop timer T4\n");
- timer_stop(&mtp->t4);
+ if (osmo_timer_pending(&mtp->t4)) {
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Stop timer T4\n");
+ osmo_timer_del(&mtp->t4);
}
if (prim == MTP_PRIM_SIE) {
@@ -227,17 +231,17 @@ static void mtp_go_aligned(mtp_t *mtp, enum mtp_prim __attribute__((unused)) pri
if (mtp->local_emergency) {
/* Send SIE */
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Now sending SIE\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Now sending SIE\n");
mtp->tx_lssu = STATUS_E;
} else {
/* Send SIN */
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Now sending SIN\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Now sending SIN\n");
mtp->tx_lssu = STATUS_N;
}
/* Start T3 */
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Start timer T3 for %.3f seconds\n", T3);
- timer_start(&mtp->t3, T3);
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Start timer T3 for %.3f seconds\n", T3);
+ osmo_timer_schedule(&mtp->t3, FLOAT_TO_TIMEOUT(T3));
/* Aligned */
mtp_l2_new_state(mtp, MTP_L2STATE_ALIGNED);
@@ -251,9 +255,9 @@ static void mtp_go_proving(mtp_t *mtp, enum mtp_prim __attribute__((unused)) pri
}
/* stop timer */
- if (timer_running(&mtp->t3)) {
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Stop timer T3\n");
- timer_stop(&mtp->t3);
+ if (osmo_timer_pending(&mtp->t3)) {
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Stop timer T3\n");
+ osmo_timer_del(&mtp->t3);
}
/* reset proving try counter M */
@@ -264,11 +268,11 @@ static void mtp_go_proving(mtp_t *mtp, enum mtp_prim __attribute__((unused)) pri
/* Start T4 */
if (mtp->local_emergency || mtp->remote_emergency) {
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Start timer T4 for %.3f seconds\n", T4e);
- timer_start(&mtp->t4, T4e);
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Start timer T4 for %.3f seconds\n", T4e);
+ osmo_timer_schedule(&mtp->t4, FLOAT_TO_TIMEOUT(T4e));
} else {
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Start timer T4 for %.3f seconds\n", T4n);
- timer_start(&mtp->t4, T4n);
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Start timer T4 for %.3f seconds\n", T4n);
+ osmo_timer_schedule(&mtp->t4, FLOAT_TO_TIMEOUT(T4n));
}
/* Proving */
@@ -297,7 +301,7 @@ static void mtp_align_fail(mtp_t *mtp, enum mtp_prim __attribute__((unused)) pri
mtp_stop(mtp, prim, data, len);
/* send message to upper layer */
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Telling L3 that we are out of service because of alignment failure\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Telling L3 that we are out of service because of alignment failure\n");
mtp_l2l3(mtp, MTP_PRIM_OUT_OF_SERVICE, 0, &cause, 1);
}
@@ -308,9 +312,9 @@ static void mtp_correct_su(mtp_t *mtp, enum mtp_prim __attribute__((unused)) pri
return;
/* Stop T4 */
- if (timer_running(&mtp->t4)) {
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Stop timer T4\n");
- timer_stop(&mtp->t4);
+ if (osmo_timer_pending(&mtp->t4)) {
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Stop timer T4\n");
+ osmo_timer_del(&mtp->t4);
}
/* Cancel further proving */
@@ -318,11 +322,11 @@ static void mtp_correct_su(mtp_t *mtp, enum mtp_prim __attribute__((unused)) pri
/* Start T4 */
if (mtp->local_emergency || mtp->remote_emergency) {
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Start timer T4 for %.3f seconds\n", T4e);
- timer_start(&mtp->t4, T4e);
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Start timer T4 for %.3f seconds\n", T4e);
+ osmo_timer_schedule(&mtp->t4, FLOAT_TO_TIMEOUT(T4e));
} else {
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Start timer T4 for %.3f seconds\n", T4n);
- timer_start(&mtp->t4, T4n);
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Start timer T4 for %.3f seconds\n", T4n);
+ osmo_timer_schedule(&mtp->t4, FLOAT_TO_TIMEOUT(T4n));
}
}
@@ -335,29 +339,29 @@ static void mtp_align_complete(mtp_t *mtp, enum mtp_prim __attribute__((unused))
/* Start T4 */
if (mtp->local_emergency || mtp->remote_emergency) {
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Start timer T4 for %.3f seconds\n", T4e);
- timer_start(&mtp->t4, T4e);
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Start timer T4 for %.3f seconds\n", T4e);
+ osmo_timer_schedule(&mtp->t4, FLOAT_TO_TIMEOUT(T4e));
} else {
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Start timer T4 for %.3f seconds\n", T4n);
- timer_start(&mtp->t4, T4n);
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Start timer T4 for %.3f seconds\n", T4n);
+ osmo_timer_schedule(&mtp->t4, FLOAT_TO_TIMEOUT(T4n));
}
return;
}
/* Start T1 */
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Start timer T1 for %.3f seconds\n", T1);
- timer_start(&mtp->t1, T1);
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Start timer T1 for %.3f seconds\n", T1);
+ osmo_timer_schedule(&mtp->t1, FLOAT_TO_TIMEOUT(T1));
if (mtp->local_outage) {
/* Send SIPO */
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Local processor outage, now sending SIPO\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Local processor outage, now sending SIPO\n");
mtp->tx_lssu = STATUS_PO;
/* Aligned */
mtp_l2_new_state(mtp, MTP_L2STATE_ALIGNED_NOT_READY);
} else {
/* Send FISU */
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "No local processor outage, now sending FISU\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "No local processor outage, now sending FISU\n");
mtp->tx_lssu = -1;
/* Aligned */
@@ -373,7 +377,7 @@ static void mtp_abort_proving(mtp_t *mtp, enum mtp_prim __attribute__((unused))
return;
}
- PDEBUG_CHAN(DMTP2, DEBUG_NOTICE, "Proving failed, try again!\n");
+ LOGP_CHAN(DMTP2, LOGL_NOTICE, "Proving failed, try again!\n");
/* Mark further proving */
mtp->further_proving = 1;
@@ -383,23 +387,23 @@ static void mtp_proving_emerg(mtp_t *mtp, enum mtp_prim __attribute__((unused))
{
if (prim == MTP_PRIM_EMERGENCY) {
/* Send SIE */
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Now sending SIE\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Now sending SIE\n");
mtp->tx_lssu = STATUS_E;
}
if (!mtp->local_emergency && !mtp->remote_emergency) {
/* Stop T4 */
- if (timer_running(&mtp->t4)) {
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Stop timer T4\n");
- timer_stop(&mtp->t4);
+ if (osmo_timer_pending(&mtp->t4)) {
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Stop timer T4\n");
+ osmo_timer_del(&mtp->t4);
}
/* Cancel further proving */
mtp->further_proving = 0;
/* Sart T4 */
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Start timer T4 for %.3f seconds\n", T4e);
- timer_start(&mtp->t4, T4e);
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Start timer T4 for %.3f seconds\n", T4e);
+ osmo_timer_schedule(&mtp->t4, FLOAT_TO_TIMEOUT(T4e));
}
if (prim == MTP_PRIM_EMERGENCY)
@@ -432,35 +436,35 @@ static void mtp_link_failure(mtp_t *mtp, enum mtp_prim __attribute__((unused)) p
else
cause = MTP_CAUSE_LINK_FAILURE_REMOTE;
/* send message to upper layer */
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Telling L3 that we are out of service because of link failure\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Telling L3 that we are out of service because of link failure\n");
mtp_l2l3(mtp, MTP_PRIM_OUT_OF_SERVICE, 0, &cause, 1);
}
static void mtp_remote_outage(mtp_t *mtp, enum mtp_prim __attribute__((unused)) prim, uint8_t __attribute__((unused)) *data, int __attribute__((unused)) len)
{
mtp->remote_outage = 1;
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Set remote processor outage\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Set remote processor outage\n");
/* Stop T1 */
- if (timer_running(&mtp->t1)) {
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Stop timer T1\n");
- timer_stop(&mtp->t1);
+ if (osmo_timer_pending(&mtp->t1)) {
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Stop timer T1\n");
+ osmo_timer_del(&mtp->t1);
}
/* Processor outage */
mtp_l2_new_state(mtp, MTP_L2STATE_PROCESSOR_OUTAGE);
/* send message to upper layer */
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Telling L3 about remote processor outage\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Telling L3 about remote processor outage\n");
mtp_l2l3(mtp, MTP_PRIM_REMOTE_PROCESSOR_OUTAGE, 0, NULL, 0);
}
static void mtp_fisu_msu(mtp_t *mtp, enum mtp_prim __attribute__((unused)) prim, uint8_t __attribute__((unused)) *data, int __attribute__((unused)) len)
{
/* Stop T1 */
- if (timer_running(&mtp->t1)) {
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Stop timer T1\n");
- timer_stop(&mtp->t1);
+ if (osmo_timer_pending(&mtp->t1)) {
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Stop timer T1\n");
+ osmo_timer_del(&mtp->t1);
}
if (mtp->l2_state == MTP_L2STATE_ALIGNED_READY) {
@@ -472,7 +476,7 @@ static void mtp_fisu_msu(mtp_t *mtp, enum mtp_prim __attribute__((unused)) prim,
}
/* send message to upper layer */
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Telling L3 that we are in service\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Telling L3 that we are in service\n");
mtp_l2l3(mtp, MTP_PRIM_IN_SERVICE, 0, NULL, 0);
}
@@ -481,7 +485,7 @@ static void mtp_aligned_outage(mtp_t *mtp, enum mtp_prim __attribute__((unused))
mtp->local_outage = 1;
/* Send SIPO */
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Local processor outage, now sending SIPO\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Local processor outage, now sending SIPO\n");
mtp->tx_lssu = STATUS_PO;
/* Aligned not ready */
@@ -493,7 +497,7 @@ static void mtp_not_aligned_recovered(mtp_t *mtp, enum mtp_prim __attribute__((u
mtp->local_outage = 0;
/* Send FISU */
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "No local processor outage, now sending FISU\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "No local processor outage, now sending FISU\n");
mtp->tx_lssu = -1;
/* Aligned ready */
@@ -505,7 +509,7 @@ static void mtp_in_service_outage(mtp_t *mtp, enum mtp_prim __attribute__((unuse
mtp->local_outage = 1;
/* Send SIPO */
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Local processor outage, now sending SIPO\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Local processor outage, now sending SIPO\n");
mtp->tx_lssu = STATUS_PO;
/* Processor outage */
@@ -519,7 +523,7 @@ static void mtp_outage(mtp_t *mtp, enum mtp_prim __attribute__((unused)) prim, u
mtp->local_outage = 1;
/* Send SIPO */
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Local processor outage, now sending SIPO\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Local processor outage, now sending SIPO\n");
mtp->tx_lssu = STATUS_PO;
}
@@ -528,27 +532,27 @@ static void mtp_outage(mtp_t *mtp, enum mtp_prim __attribute__((unused)) prim, u
mtp->local_outage = 0;
/* Send FISU */
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "No local processor outage, now sending FISU\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "No local processor outage, now sending FISU\n");
mtp->tx_lssu = -1;
}
/* remote outage */
if (prim == MTP_PRIM_SIPO && !mtp->remote_outage) {
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Set remote processor outage\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Set remote processor outage\n");
mtp->remote_outage = 1;
/* send message to upper layer */
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Telling L3 about remote processor outage\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Telling L3 about remote processor outage\n");
mtp_l2l3(mtp, MTP_PRIM_REMOTE_PROCESSOR_OUTAGE, 0, NULL, 0);
}
/* remote recovered */
if ((prim == MTP_PRIM_FISU || prim == MTP_PRIM_MSU) && mtp->remote_outage) {
mtp->remote_outage = 0;
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Cancel remote processor outage\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Cancel remote processor outage\n");
/* send message to upper layer */
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Telling L3 about remote processor recovered\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Telling L3 about remote processor recovered\n");
mtp_l2l3(mtp, MTP_PRIM_REMOTE_PROCESSOR_RECOVERED, 0, NULL, 0);
}
@@ -701,7 +705,7 @@ static void handle_event(mtp_t *mtp, enum mtp_prim prim, uint8_t *data, int len)
{
int i;
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Handling message '%s' in state '%s'\n", mtp_prim_names[prim], mtp_state_names[mtp->l2_state]);
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Handling message '%s' in state '%s'\n", mtp_prim_names[prim], mtp_state_names[mtp->l2_state]);
/* Find function for current state and message */
for (i = 0; i < (int)STATEMACHINE_LEN; i++)
@@ -709,7 +713,7 @@ static void handle_event(mtp_t *mtp, enum mtp_prim prim, uint8_t *data, int len)
&& ((1 << mtp->l2_state) & statemachine_list[i].states))
break;
if (i == STATEMACHINE_LEN) {
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Message '%s' unhandled at state '%s'\n", mtp_prim_names[prim], mtp_state_names[mtp->l2_state]);
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Message '%s' unhandled at state '%s'\n", mtp_prim_names[prim], mtp_state_names[mtp->l2_state]);
return;
}
@@ -727,11 +731,11 @@ int mtp_l3l2(mtp_t *mtp, enum mtp_prim prim, uint8_t sio, uint8_t *data, int len
}
if (mtp->l2_state != MTP_L2STATE_IN_SERVICE) {
- PDEBUG_CHAN(DMTP2, DEBUG_ERROR, "Rejecting data message in state '%s'\n", mtp_state_names[mtp->l2_state]);
+ LOGP_CHAN(DMTP2, LOGL_ERROR, "Rejecting data message in state '%s'\n", mtp_state_names[mtp->l2_state]);
return -EIO;
}
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Queueing data message.\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Queueing data message.\n");
/* go to end of queue */
tailp = &mtp->tx_queue;
@@ -741,7 +745,7 @@ int mtp_l3l2(mtp_t *mtp, enum mtp_prim prim, uint8_t sio, uint8_t *data, int len
/* add new message to queue */
msg = calloc(sizeof(*msg) + len, 1);
if (!msg) {
- PDEBUG_CHAN(DMTP2, DEBUG_ERROR, "No mem!\n");
+ LOGP_CHAN(DMTP2, LOGL_ERROR, "No mem!\n");
abort();
}
mtp->tx_queue_seq = (mtp->tx_queue_seq + 1) & 0x7f;
@@ -807,7 +811,7 @@ static int mtp_send_msu(mtp_t *mtp, uint8_t *bsn, uint8_t *bib, uint8_t *fsn, ui
msg = msg->next;
}
if (i == 128) {
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Cannot send MSU, because more than 127 unacknowledged messages have been sent.\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Cannot send MSU, because more than 127 unacknowledged messages have been sent.\n");
return 0;
}
@@ -833,7 +837,7 @@ static int mtp_send_msu(mtp_t *mtp, uint8_t *bsn, uint8_t *bib, uint8_t *fsn, ui
*fib = mtp->fib;
*sio = msg->sio;
if (msg->len > max) {
- PDEBUG_CHAN(DMTP2, DEBUG_ERROR, "Message from layer 3 tructated, because of length %d.\n", msg->len);
+ LOGP_CHAN(DMTP2, LOGL_ERROR, "Message from layer 3 tructated, because of length %d.\n", msg->len);
msg->len = max;
}
memcpy(data, msg->data, msg->len);
@@ -862,14 +866,14 @@ static int ack_msg(mtp_t *mtp, uint8_t bsn)
/* remove all messages up to the one found */
while (mtp->tx_queue != msg) {
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "ACK: Message with sequence number %d has been acked and is removed.\n", mtp->tx_queue->sequence);
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "ACK: Message with sequence number %d has been acked and is removed.\n", mtp->tx_queue->sequence);
temp = mtp->tx_queue;
mtp->tx_queue = temp->next;
free(temp);
}
/* remove the message found */
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "ACK: Message with sequence number %d has been acked and is removed.\n", mtp->tx_queue->sequence);
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "ACK: Message with sequence number %d has been acked and is removed.\n", mtp->tx_queue->sequence);
mtp->tx_queue = msg->next;
free(msg);
@@ -896,7 +900,7 @@ static int nack_msg(mtp_t *mtp, uint8_t bsn, uint8_t bib)
return 0;
/* rewind tx_seq to retransmit */
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "NACK: Lost messages, retransmitting from sequence number %d.\n", (bsn + 1) & 0x7f);
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "NACK: Lost messages, retransmitting from sequence number %d.\n", (bsn + 1) & 0x7f);
mtp->tx_seq = bsn;
/* flip bit */
@@ -947,7 +951,7 @@ static void mtp_receive_fisu(mtp_t *mtp, uint8_t bsn, uint8_t bib, uint8_t fsn,
/* reject, if local outage */
if (mtp->local_outage) {
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, " -> Ignoring, we have local outage.\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, " -> Ignoring, we have local outage.\n");
return;
}
@@ -963,7 +967,7 @@ static void mtp_receive_fisu(mtp_t *mtp, uint8_t bsn, uint8_t bib, uint8_t fsn,
/* if the FSN is different and received FIB equals last BIB sent */
if (fsn != mtp->rx_seq && fib == mtp->bib) {
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, " -> Send nack, because we missed a frame and FIB equals last transmitted BIB.\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, " -> Send nack, because we missed a frame and FIB equals last transmitted BIB.\n");
/* schedule NACK */
mtp->tx_nack = 1;
}
@@ -980,7 +984,7 @@ static void mtp_receive_msu(mtp_t *mtp, uint8_t bsn, uint8_t bib, uint8_t fsn, u
/* reject, if local outage */
if (mtp->local_outage) {
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, " -> Ignoring, we have local outage.\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, " -> Ignoring, we have local outage.\n");
return;
}
@@ -995,7 +999,7 @@ static void mtp_receive_msu(mtp_t *mtp, uint8_t bsn, uint8_t bib, uint8_t fsn, u
/* i) if sequence equals last received, drop it, regardless of FIB */
if (fsn == mtp->rx_seq) {
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, " -> Ignoring, because sequence number did not increase.\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, " -> Ignoring, because sequence number did not increase.\n");
return;
}
@@ -1003,13 +1007,13 @@ static void mtp_receive_msu(mtp_t *mtp, uint8_t bsn, uint8_t bib, uint8_t fsn, u
if (fsn == ((mtp->rx_seq + 1) & 0x7f)) {
/* if FIB equals last BIB */
if (fib == mtp->bib) {
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, " -> Accepting, because sequence number increases.\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, " -> Accepting, because sequence number increases.\n");
mtp_l2l3(mtp, MTP_PRIM_DATA, sio, data, len);
/* acknowledge */
mtp->rx_seq = fsn;
} else {
/* discard if not equal */
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, " -> Ignoring, because FIB does not equal last transmitted BIB.\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, " -> Ignoring, because FIB does not equal last transmitted BIB.\n");
}
return;
}
@@ -1018,10 +1022,10 @@ static void mtp_receive_msu(mtp_t *mtp, uint8_t bsn, uint8_t bib, uint8_t fsn, u
* a NACK is sent, if FIB equals last BIB */
if (fib == mtp->bib) {
/* schedule NACK */
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, " -> Send nack, because we missed a frame and FIB equals last transmitted BIB.\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, " -> Send nack, because we missed a frame and FIB equals last transmitted BIB.\n");
mtp->tx_nack = 1;
} else
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, " -> Ignoring, because we missed a frame and FIB dos not equal last transmitted BIB.\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, " -> Ignoring, because we missed a frame and FIB dos not equal last transmitted BIB.\n");
}
/*
@@ -1037,21 +1041,21 @@ static int mtp_send_frame(mtp_t *mtp, uint8_t *data, int max)
if (mtp_send_lssu(mtp, &bsn, &bib, &fsn, &fib, &sf)) {
/* transmit LSSU */
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Sending LSSU with status flag '%s'\n", mtp_sf_names[sf]);
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Sending LSSU with status flag '%s'\n", mtp_sf_names[sf]);
data[3] = sf;
len = 1;
} else if ((len = mtp_send_msu(mtp, &bsn, &bib, &fsn, &fib, &sio, data + 4, max - 5, &resending))) {
/* transmit MSU */
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "%sSending MSU with SIO '%02x' data '%s'\n", (resending) ? "Re-" : "", sio, debug_hex(data + 4, len));
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "%sSending MSU with SIO '%02x' data '%s'\n", (resending) ? "Re-" : "", sio, osmo_hexdump(data + 4, len));
data[3] = sio;
len++;
} else {
/* transmit FISU */
mtp_send_fisu(mtp, &bsn, &bib, &fsn, &fib);
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Sending FISU\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Sending FISU\n");
len = 0;
}
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, " -> FSN %d, FIB %d, BSN %d, BIB %d\n", fsn, fib, bsn, bib);
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, " -> FSN %d, FIB %d, BSN %d, BIB %d\n", fsn, fib, bsn, bib);
data[0] = (bsn & 0x7f) | (bib << 7);
data[1] = (fsn & 0x7f) | (fib << 7);
data[2] = (len > 63) ? 63 : len;
@@ -1076,7 +1080,7 @@ static int mtp_receive_frame(mtp_t *mtp, uint8_t *data, int len)
if (len < 5) {
/* frame too short */
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Receiving frame is too short (got: %d bytes)\n", len);
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Receiving frame is too short (got: %d bytes)\n", len);
return -EINVAL;
}
len -= 5;
@@ -1089,34 +1093,34 @@ static int mtp_receive_frame(mtp_t *mtp, uint8_t *data, int len)
if (li != len && (li != 63 || len <= 63)) {
/* frame wrong length */
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Receiving frame has wrong length (got %d bytes, length %d bytes)\n", li, len);
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Receiving frame has wrong length (got %d bytes, length %d bytes)\n", li, len);
return -EINVAL;
}
crc = calc_crc16(data, len + 3);
if (data[3 + len] != (crc & 0xff) || data[4 + len] != (crc >> 8)) {
/* crc error */
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Receiving frame has wrong CRC\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Receiving frame has wrong CRC\n");
return -EINVAL;
}
if (len == 1)
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Receiving LSSU (length = %d) with status flag 0x%02x (%s)\n", len, data[3], mtp_sf_names[data[3] & 0x7]);
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Receiving LSSU (length = %d) with status flag 0x%02x (%s)\n", len, data[3], mtp_sf_names[data[3] & 0x7]);
if (len == 2)
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Receiving LSSU (length = %d) with status flag 0x%04x (%s)\n", len, data[3] | (data[4] << 8), mtp_sf_names[data[3] & 0x7]);
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Receiving LSSU (length = %d) with status flag 0x%04x (%s)\n", len, data[3] | (data[4] << 8), mtp_sf_names[data[3] & 0x7]);
if (len == 1 || len == 2) {
/* receive LSSU */
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, " -> FSN %d, FIB %d, BSN %d, BIB %d\n", fsn, fib, bsn, bib);
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, " -> FSN %d, FIB %d, BSN %d, BIB %d\n", fsn, fib, bsn, bib);
func_mtp_receive_lssu(mtp, fsn, bib, data[3] & 0x7);
} else if (len > 2) {
/* receive MSU */
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Receiving MSU with SIO '%02x' data '%s'\n", data[3], debug_hex(data + 4, len - 1));
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, " -> FSN %d, FIB %d, BSN %d, BIB %d\n", fsn, fib, bsn, bib);
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Receiving MSU with SIO '%02x' data '%s'\n", data[3], osmo_hexdump(data + 4, len - 1));
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, " -> FSN %d, FIB %d, BSN %d, BIB %d\n", fsn, fib, bsn, bib);
func_mtp_receive_msu(mtp, bsn, bib, fsn, fib, data[3], data + 4, len - 1);
} else {
/* receive FISU */
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Receiving FISU\n");
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, " -> FSN %d, FIB %d, BSN %d, BIB %d\n", fsn, fib, bsn, bib);
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Receiving FISU\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, " -> FSN %d, FIB %d, BSN %d, BIB %d\n", fsn, fib, bsn, bib);
func_mtp_receive_fisu(mtp, bsn, bib, fsn, fib);
}
@@ -1194,9 +1198,9 @@ static void mtp_monitor(mtp_t *mtp, int bad)
/* raise error count auntil Ti has been reached */
mtp->proving_errors++;
if (bad == MONITOR_BAD)
- PDEBUG(DMTP2, DEBUG_NOTICE, "Proving counter raises to %d/%d due to frame error\n", mtp->proving_errors, Ti);
+ LOGP(DMTP2, LOGL_NOTICE, "Proving counter raises to %d/%d due to frame error\n", mtp->proving_errors, Ti);
else
- PDEBUG(DMTP2, DEBUG_NOTICE, "Proving counter raises to %d/%d due to octet counting\n", mtp->proving_errors, Ti);
+ LOGP(DMTP2, LOGL_NOTICE, "Proving counter raises to %d/%d due to octet counting\n", mtp->proving_errors, Ti);
if (mtp->proving_errors == Ti) {
mtp->proving_errors = 0;
handle_event(mtp, MTP_PRIM_ABORT_PROVING, NULL, 0);
@@ -1212,16 +1216,16 @@ static void mtp_monitor(mtp_t *mtp, int bad)
mtp->monitor_good = 0;
if (mtp->monitor_errors > 0) {
mtp->monitor_errors--;
- PDEBUG(DMTP2, DEBUG_NOTICE, "Link error counter reduces to %d/%d\n", mtp->monitor_errors, T);
+ LOGP(DMTP2, LOGL_NOTICE, "Link error counter reduces to %d/%d\n", mtp->monitor_errors, T);
}
}
} else {
/* raise error count auntil T has been reached */
mtp->monitor_errors++;
if (bad == MONITOR_BAD)
- PDEBUG(DMTP2, DEBUG_NOTICE, "Link error counter raises to %d/%d due to frame error\n", mtp->monitor_errors, T);
+ LOGP(DMTP2, LOGL_NOTICE, "Link error counter raises to %d/%d due to frame error\n", mtp->monitor_errors, T);
else
- PDEBUG(DMTP2, DEBUG_NOTICE, "Link error counter raises to %d/%d due to octet counting\n", mtp->monitor_errors, T);
+ LOGP(DMTP2, LOGL_NOTICE, "Link error counter raises to %d/%d due to octet counting\n", mtp->monitor_errors, T);
if (mtp->monitor_errors == T) {
mtp->monitor_errors = 0;
handle_event(mtp, MTP_PRIM_LINK_FAILURE, NULL, 0);
@@ -1246,7 +1250,7 @@ void mtp_receive_bit(mtp_t *mtp, uint8_t bit)
if (mtp->rx_octet_counting) {
if (++mtp->rx_octet_count == 8 * N) {
/* octet counter hits */
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Octet counter hits!\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Octet counter hits!\n");
mtp->rx_octet_count = 0;
mtp_monitor(mtp, MONITOR_OCTET_COUNTING);
}
@@ -1268,13 +1272,13 @@ void mtp_receive_bit(mtp_t *mtp, uint8_t bit)
}
if (rc == 0 && mtp->rx_octet_counting) {
/* stop octet counting */
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Stop Octet counting, due to correctly received frame\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Stop Octet counting, due to correctly received frame\n");
mtp->rx_octet_counting = 0;
}
mtp->rx_flag_count = 0;
} else {
if (++mtp->rx_flag_count == 100)
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Continuously receiving HDLC flags (\"01111110\"), remote link seems to be down!\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Continuously receiving HDLC flags (\"01111110\"), remote link seems to be down!\n");
}
mtp->rx_byte_count = 0;
mtp->rx_bit_count = 0;
@@ -1287,7 +1291,7 @@ void mtp_receive_bit(mtp_t *mtp, uint8_t bit)
if (mtp->rx_octet_counting)
return;
/* start octet counting */
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Start Octet counting, due to 7 consecutive bits\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Start Octet counting, due to 7 consecutive bits\n");
mtp->rx_octet_counting = 1;
mtp->rx_octet_count = 0;
return;
@@ -1306,7 +1310,7 @@ void mtp_receive_bit(mtp_t *mtp, uint8_t bit)
if (mtp->rx_byte_count == (int)sizeof(mtp->rx_frame)) {
mtp->rx_receiving = 0;
/* start octet counting */
- PDEBUG_CHAN(DMTP2, DEBUG_DEBUG, "Start Octet counting, due to frame oversize\n");
+ LOGP_CHAN(DMTP2, LOGL_DEBUG, "Start Octet counting, due to frame oversize\n");
mtp->rx_octet_counting = 1;
mtp->rx_octet_count = 0;
return;
diff --git a/src/libmtp/layer3.c b/src/libmtp/layer3.c
index 7726bd5..2259518 100644
--- a/src/libmtp/layer3.c
+++ b/src/libmtp/layer3.c
@@ -29,8 +29,9 @@
#include <string.h>
#include <errno.h>
#include <stdlib.h>
-#include "../libtimer/timer.h"
-#include "../libdebug/debug.h"
+#include <osmocom/core/timer.h>
+#include <osmocom/core/utils.h>
+#include "../liblogging/logging.h"
#include "mtp.h"
/* message from layer 4 */
@@ -39,7 +40,7 @@ int mtp_send(mtp_t *mtp, enum mtp_prim prim, uint8_t slc, uint8_t *data, int len
uint8_t buffer[len + 4];
if (prim == MTP_PRIM_DATA) {
- PDEBUG_CHAN(DMTP3, DEBUG_DEBUG, "Send frame to remote: SIO=0x%02x DPC=%d OPC=%d SLC=%d %s\n", mtp->sio, mtp->remote_pc, mtp->local_pc, slc, debug_hex(data, len));
+ LOGP_CHAN(DMTP3, LOGL_DEBUG, "Send frame to remote: SIO=0x%02x DPC=%d OPC=%d SLC=%d %s\n", mtp->sio, mtp->remote_pc, mtp->local_pc, slc, osmo_hexdump(data, len));
/* add header */
buffer[0] = mtp->remote_pc;
buffer[1] = (mtp->remote_pc >> 8) & 0x3f;
@@ -67,7 +68,7 @@ void mtp_l2l3(mtp_t *mtp, enum mtp_prim prim, uint8_t sio, uint8_t *data, int le
if (prim == MTP_PRIM_DATA) {
if (len < 4) {
- PDEBUG_CHAN(DMTP3, DEBUG_NOTICE, "Short frame from layer 2 (len=%d)\n", len);
+ LOGP_CHAN(DMTP3, LOGL_NOTICE, "Short frame from layer 2 (len=%d)\n", len);
return;
}
@@ -81,18 +82,18 @@ void mtp_l2l3(mtp_t *mtp, enum mtp_prim prim, uint8_t sio, uint8_t *data, int le
data += 4;
len -= 4;
- PDEBUG_CHAN(DMTP3, DEBUG_DEBUG, "Received frame from remote: SIO=0x%02x DPC=%d OPC=%d SLC=%d %s\n", sio, dpc, opc, slc, debug_hex(data, len));
+ LOGP_CHAN(DMTP3, LOGL_DEBUG, "Received frame from remote: SIO=0x%02x DPC=%d OPC=%d SLC=%d %s\n", sio, dpc, opc, slc, osmo_hexdump(data, len));
if (dpc != mtp->local_pc || opc != mtp->remote_pc) {
- PDEBUG_CHAN(DMTP3, DEBUG_NOTICE, "Received message with wrong point codes: %d->%d but expecting %d->%d\n", opc, dpc, mtp->remote_pc, mtp->local_pc);
+ LOGP_CHAN(DMTP3, LOGL_NOTICE, "Received message with wrong point codes: %d->%d but expecting %d->%d\n", opc, dpc, mtp->remote_pc, mtp->local_pc);
return;
}
if ((sio & 0x0f) == 0x0 && len >= 1) {
- PDEBUG_CHAN(DMTP3, DEBUG_NOTICE, "MGMT message received: SLC=%d H0=%d H1=%d %s\n", slc, data[0] & 0xf, data[0] >> 4, debug_hex(data + 1, len - 1));
+ LOGP_CHAN(DMTP3, LOGL_NOTICE, "MGMT message received: SLC=%d H0=%d H1=%d %s\n", slc, data[0] & 0xf, data[0] >> 4, osmo_hexdump(data + 1, len - 1));
return;
}
if (sio != mtp->sio) {
- PDEBUG_CHAN(DMTP3, DEBUG_NOTICE, "Received message with wrong SIO: 0x%02x but expecting 0x%02x\n", sio, mtp->sio);
+ LOGP_CHAN(DMTP3, LOGL_NOTICE, "Received message with wrong SIO: 0x%02x but expecting 0x%02x\n", sio, mtp->sio);
return;
}
}
diff --git a/src/libmtp/mtp.c b/src/libmtp/mtp.c
index 02afbdd..7cd67aa 100644
--- a/src/libmtp/mtp.c
+++ b/src/libmtp/mtp.c
@@ -25,34 +25,34 @@
#include <stdlib.h>
#include <string.h>
#include <errno.h>
-#include "../libtimer/timer.h"
-#include "../libdebug/debug.h"
+#include <osmocom/core/timer.h>
+#include "../liblogging/logging.h"
#include "mtp.h"
-static void mtp_t1(struct timer *timer)
+static void mtp_t1(void *data)
{
- mtp_t *mtp = (mtp_t *)timer->priv;
+ mtp_t *mtp = data;
mtp_send(mtp, MTP_PRIM_T1_TIMEOUT, 0, NULL, 0);
}
-static void mtp_t2(struct timer *timer)
+static void mtp_t2(void *data)
{
- mtp_t *mtp = (mtp_t *)timer->priv;
+ mtp_t *mtp = data;
mtp_send(mtp, MTP_PRIM_T2_TIMEOUT, 0, NULL, 0);
}
-static void mtp_t3(struct timer *timer)
+static void mtp_t3(void *data)
{
- mtp_t *mtp = (mtp_t *)timer->priv;
+ mtp_t *mtp = data;
mtp_send(mtp, MTP_PRIM_T3_TIMEOUT, 0, NULL, 0);
}
-static void mtp_t4(struct timer *timer)
+static void mtp_t4(void *data)
{
- mtp_t *mtp = (mtp_t *)timer->priv;
+ mtp_t *mtp = data;
mtp_send(mtp, MTP_PRIM_T4_TIMEOUT, 0, NULL, 0);
}
@@ -73,10 +73,10 @@ int mtp_init(mtp_t *mtp, const char *name, void *inst, void (*mtp_receive)(void
mtp->sio = sio;
mtp->local_pc = local_pc;
mtp->remote_pc = remote_pc;
- timer_init(&mtp->t1, mtp_t1, mtp);
- timer_init(&mtp->t2, mtp_t2, mtp);
- timer_init(&mtp->t3, mtp_t3, mtp);
- timer_init(&mtp->t4, mtp_t4, mtp);
+ osmo_timer_setup(&mtp->t1, mtp_t1, mtp);
+ osmo_timer_setup(&mtp->t2, mtp_t2, mtp);
+ osmo_timer_setup(&mtp->t3, mtp_t3, mtp);
+ osmo_timer_setup(&mtp->t4, mtp_t4, mtp);
return 0;
}
@@ -86,10 +86,10 @@ void mtp_exit(mtp_t *mtp)
if (!mtp)
return;
- timer_exit(&mtp->t1);
- timer_exit(&mtp->t2);
- timer_exit(&mtp->t3);
- timer_exit(&mtp->t4);
+ osmo_timer_del(&mtp->t1);
+ osmo_timer_del(&mtp->t2);
+ osmo_timer_del(&mtp->t3);
+ osmo_timer_del(&mtp->t4);
mtp_flush(mtp);
}
diff --git a/src/libmtp/mtp.h b/src/libmtp/mtp.h
index d1f7ac7..6d44d81 100644
--- a/src/libmtp/mtp.h
+++ b/src/libmtp/mtp.h
@@ -70,10 +70,10 @@ typedef struct mtp {
int local_outage; /* current local processor outage */
int remote_outage; /* current remote processor outage */
int tx_lssu; /* what LSSU status to transmit (-1 for nothing) */
- struct timer t1; /* timer "alignment ready" */
- struct timer t2; /* timer "not aligned" */
- struct timer t3; /* timer "aligned" */
- struct timer t4; /* proving period timer */
+ struct osmo_timer_list t1; /* timer "alignment ready" */
+ struct osmo_timer_list t2; /* timer "not aligned" */
+ struct osmo_timer_list t3; /* timer "aligned" */
+ struct osmo_timer_list t4; /* proving period timer */
int proving_try; /* counts number of proving attempts */
int further_proving;/* flag that indicates another proving attempt */
diff --git a/src/liboptions/Makefile.am b/src/liboptions/Makefile.am
index 0d10fa7..4ad4aae 100644
--- a/src/liboptions/Makefile.am
+++ b/src/liboptions/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
noinst_LIBRARIES = liboptions.a
diff --git a/src/liboptions/options.c b/src/liboptions/options.c
index d49e698..fd097df 100644
--- a/src/liboptions/options.c
+++ b/src/liboptions/options.c
@@ -23,7 +23,9 @@
#include <stdlib.h>
#include <errno.h>
#include "options.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
+
+const char *selected_config_file = NULL;
typedef struct option {
struct option *next;
@@ -47,7 +49,7 @@ char *options_strdup(const char *s)
o = malloc(sizeof(struct options_strdup_entry) + strlen(s));
if (!o) {
- PDEBUG(DOPTIONS, DEBUG_ERROR, "No mem!\n");
+ LOGP(DOPTIONS, LOGL_ERROR, "No mem!\n");
abort();
}
o->next = options_strdup_list;
@@ -62,21 +64,21 @@ void option_add(int short_option, const char *long_option, int parameter_count)
option_t *option;
/* check if option already exists or is not allowed */
+ if (!strcmp(long_option, "config") || !strcmp(long_option, "no-config")) {
+ LOGP(DOPTIONS, LOGL_ERROR, "Option '%s' is not allowed to add, please fix!\n", option->long_option);
+ abort();
+ }
for (option = option_head; option; option = option->next) {
- if (!strcmp(option->long_option, "config")) {
- PDEBUG(DOPTIONS, DEBUG_ERROR, "Option '%s' is not allowed to add, please fix!\n", option->long_option);
- abort();
- }
if (option->short_option == short_option
|| !strcmp(option->long_option, long_option)) {
- PDEBUG(DOPTIONS, DEBUG_ERROR, "Option '%s' added twice, please fix!\n", option->long_option);
+ LOGP(DOPTIONS, LOGL_ERROR, "Option '%s' added twice, please fix!\n", option->long_option);
abort();
}
}
option = calloc(1, sizeof(*option));
if (!option) {
- PDEBUG(DOPTIONS, DEBUG_ERROR, "No mem!\n");
+ LOGP(DOPTIONS, LOGL_ERROR, "No mem!\n");
abort();
}
@@ -87,7 +89,7 @@ void option_add(int short_option, const char *long_option, int parameter_count)
option_tailp = &(option->next);
}
-int options_config_file(int argc, char *argv[], const char *config_file, int (*handle_options)(int short_option, int argi, char *argv[]))
+int options_config_file(int argc, char *argv[], const char *_config_file, int (*handle_options)(int short_option, int argi, char *argv[]))
{
static const char *home;
char config[256];
@@ -101,21 +103,29 @@ int options_config_file(int argc, char *argv[], const char *config_file, int (*h
/* select for alternative config file */
if (argc > 2 && !strcmp(argv[1], "--config"))
- config_file = argv[2];
+ selected_config_file = argv[2];
+ else
+ selected_config_file = _config_file;
+
+ /* select for alternative config file */
+ if (argc > 1 && !strcmp(argv[1], "--no-config")) {
+ selected_config_file = NULL;
+ return 1;
+ }
/* add home directory */
- if (config_file[0] == '~' && config_file[1] == '/') {
+ if (selected_config_file[0] == '~' && selected_config_file[1] == '/') {
home = getenv("HOME");
if (home == NULL)
return 1;
- sprintf(config, "%s/%s", home, config_file + 2);
+ sprintf(config, "%s/%s", home, selected_config_file + 2);
} else
- strcpy(config, config_file);
+ strcpy(config, selected_config_file);
/* open config file */
fp = fopen(config, "r");
if (!fp) {
- PDEBUG(DOPTIONS, DEBUG_INFO, "Config file '%s' seems not to exist, using command line options only.\n", config);
+ LOGP(DOPTIONS, LOGL_INFO, "Config file '%s' seems not to exist, using command line options only.\n", config);
return 1;
}
@@ -201,21 +211,21 @@ int options_config_file(int argc, char *argv[], const char *config_file, int (*h
/* search option */
for (option = option_head; option; option = option->next) {
if (opt[0] == option->short_option && opt[1] == '\0') {
- PDEBUG(DOPTIONS, DEBUG_INFO, "Config file option '%s' ('%s'), parameter%s\n", opt, option->long_option, params);
+ LOGP(DOPTIONS, LOGL_INFO, "Config file option '%s' ('%s'), parameter%s\n", opt, option->long_option, params);
break;
}
if (!strcmp(opt, option->long_option)) {
- PDEBUG(DOPTIONS, DEBUG_INFO, "Config file option '%s', parameter%s\n", opt, params);
+ LOGP(DOPTIONS, LOGL_INFO, "Config file option '%s', parameter%s\n", opt, params);
break;
}
}
if (!option) {
- PDEBUG(DOPTIONS, DEBUG_ERROR, "Given option '%s' in config file '%s' at line %d is not a valid option, use '-h' for help!\n", opt, config_file, line);
+ LOGP(DOPTIONS, LOGL_ERROR, "Given option '%s' in config file '%s' at line %d is not a valid option, use '-h' for help!\n", opt, selected_config_file, line);
rc = -EINVAL;
goto done;
}
if (option->parameter_count != i) {
- PDEBUG(DOPTIONS, DEBUG_ERROR, "Given option '%s' in config file '%s' at line %d requires %d parameter(s), use '-h' for help!\n", opt, config_file, line, option->parameter_count);
+ LOGP(DOPTIONS, LOGL_ERROR, "Given option '%s' in config file '%s' at line %d requires %d parameter(s), use '-h' for help!\n", opt, selected_config_file, line, option->parameter_count);
return -EINVAL;
}
rc = handle_options(option->short_option, 0, args);
@@ -242,20 +252,22 @@ int options_command_line(int argc, char *argv[], int (*handle_options)(int short
/* --config */
if (!strcmp(argv[argi], "--config")) {
if (argi > 1) {
- PDEBUG(DOPTIONS, DEBUG_ERROR, "Given command line option '%s' must be the first option specified, use '-h' for help!\n", argv[argi]);
+ LOGP(DOPTIONS, LOGL_ERROR, "Given command line option '%s' must be the first option specified, use '-h' for help!\n", argv[argi]);
return -EINVAL;
}
if (argc <= 2) {
- PDEBUG(DOPTIONS, DEBUG_ERROR, "Given command line option '%s' requires 1 parameter, use '-h' for help!\n", argv[argi]);
+ LOGP(DOPTIONS, LOGL_ERROR, "Given command line option '%s' requires 1 parameter, use '-h' for help!\n", argv[argi]);
return -EINVAL;
}
argi += 1;
continue;
}
+ if (!strcmp(argv[argi], "--no-config"))
+ continue;
if (argv[argi][0] == '-') {
if (argv[argi][1] != '-') {
if (strlen(argv[argi]) != 2) {
- PDEBUG(DOPTIONS, DEBUG_ERROR, "Given command line option '%s' exceeds one character, use '-h' for help!\n", argv[argi]);
+ LOGP(DOPTIONS, LOGL_ERROR, "Given command line option '%s' exceeds one character, use '-h' for help!\n", argv[argi]);
return -EINVAL;
}
/* -x */
@@ -265,9 +277,9 @@ int options_command_line(int argc, char *argv[], int (*handle_options)(int short
params[0] = '\0';
for (i = 0; i < option->parameter_count; i++)
sprintf(strchr(params, '\0'), " '%s'", argv[argi + 1 + i]);
- PDEBUG(DOPTIONS, DEBUG_INFO, "Command line option '%s' ('--%s'), parameter%s\n", argv[argi], option->long_option, params);
+ LOGP(DOPTIONS, LOGL_INFO, "Command line option '%s' ('--%s'), parameter%s\n", argv[argi], option->long_option, params);
} else
- PDEBUG(DOPTIONS, DEBUG_INFO, "Command line option '%s' ('--%s')\n", argv[argi], option->long_option);
+ LOGP(DOPTIONS, LOGL_INFO, "Command line option '%s' ('--%s')\n", argv[argi], option->long_option);
break;
}
}
@@ -279,19 +291,19 @@ int options_command_line(int argc, char *argv[], int (*handle_options)(int short
params[0] = '\0';
for (i = 0; i < option->parameter_count; i++)
sprintf(strchr(params, '\0'), " '%s'", argv[argi + 1 + i]);
- PDEBUG(DOPTIONS, DEBUG_INFO, "Command line option '%s', parameter%s\n", argv[argi], params);
+ LOGP(DOPTIONS, LOGL_INFO, "Command line option '%s', parameter%s\n", argv[argi], params);
} else
- PDEBUG(DOPTIONS, DEBUG_INFO, "Command line option '%s'\n", argv[argi]);
+ LOGP(DOPTIONS, LOGL_INFO, "Command line option '%s'\n", argv[argi]);
break;
}
}
}
if (!option) {
- PDEBUG(DOPTIONS, DEBUG_ERROR, "Given command line option '%s' is not a valid option, use '-h' for help!\n", argv[argi]);
+ LOGP(DOPTIONS, LOGL_ERROR, "Given command line option '%s' is not a valid option, use '-h' for help!\n", argv[argi]);
return -EINVAL;
}
if (argi + option->parameter_count >= argc) {
- PDEBUG(DOPTIONS, DEBUG_ERROR, "Given command line option '%s' requires %d parameter(s), use '-h' for help!\n", argv[argi], option->parameter_count);
+ LOGP(DOPTIONS, LOGL_ERROR, "Given command line option '%s' requires %d parameter(s), use '-h' for help!\n", argv[argi], option->parameter_count);
return -EINVAL;
}
rc = handle_options(option->short_option, argi + 1, argv);
@@ -306,7 +318,7 @@ int options_command_line(int argc, char *argv[], int (*handle_options)(int short
/* no more options, so we check if there is an option after a non-option parameter */
for (i = argi; i < argc; i++) {
if (argv[i][0] == '-') {
- PDEBUG(DOPTIONS, DEBUG_ERROR, "Given command line option '%s' behind command line parameter '%s' not allowed! Please put all command line options before command line parameter(s).\n", argv[i], argv[argi]);
+ LOGP(DOPTIONS, LOGL_ERROR, "Given command line option '%s' behind command line parameter '%s' not allowed! Please put all command line options before command line parameter(s).\n", argv[i], argv[argi]);
return -EINVAL;
}
}
diff --git a/src/liboptions/options.h b/src/liboptions/options.h
index 5f494e0..5899e4c 100644
--- a/src/liboptions/options.h
+++ b/src/liboptions/options.h
@@ -1,4 +1,5 @@
+extern const char *selected_config_file;
char *options_strdup(const char *s);
void option_add(int short_option, const char *long_option, int parameter_count);
int options_config_file(int argc, char *argv[], const char *config_file, int (*handle_options)(int short_option, int argi, char *argv[]));
diff --git a/src/libosmocc/Makefile.am b/src/libosmocc/Makefile.am
deleted file mode 100644
index 27c0f6c..0000000
--- a/src/libosmocc/Makefile.am
+++ /dev/null
@@ -1,15 +0,0 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
-
-noinst_LIBRARIES = libosmocc.a
-
-libosmocc_a_SOURCES = \
- message.c \
- socket.c \
- cause.c \
- screen.c \
- endpoint.c \
- session.c \
- sdp.c \
- rtp.c \
- helper.c
-
diff --git a/src/libosmocc/cause.c b/src/libosmocc/cause.c
deleted file mode 100644
index df2b07b..0000000
--- a/src/libosmocc/cause.c
+++ /dev/null
@@ -1,251 +0,0 @@
-/* OSMO-CC Processing: convert causes
- *
- * (C) 2019 by Andreas Eversberg <jolly@eversberg.eu>
- * All Rights Reserved
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <stdint.h>
-#include <arpa/inet.h>
-#include "message.h"
-#include "cause.h"
-
-/* stolen from freeswitch, did some corrections */
-/* map sip responses to QSIG cause codes ala RFC4497 section 8.4.4 */
-static uint8_t status2isdn_cause(uint16_t status)
-{
- switch (status) {
- case 200:
- return 16; //SWITCH_CAUSE_NORMAL_CLEARING;
- case 401:
- case 402:
- case 403:
- case 407:
- case 603:
- return 21; //SWITCH_CAUSE_CALL_REJECTED;
- case 404:
- case 485:
- case 604:
- return 1; //SWITCH_CAUSE_UNALLOCATED_NUMBER;
- case 408:
- case 504:
- return 102; //SWITCH_CAUSE_RECOVERY_ON_TIMER_EXPIRE;
- case 410:
- return 22; //SWITCH_CAUSE_NUMBER_CHANGED;
- case 413:
- case 414:
- case 416:
- case 420:
- case 421:
- case 423:
- case 505:
- case 513:
- return 127; //SWITCH_CAUSE_INTERWORKING;
- case 480:
- return 18; //SWITCH_CAUSE_NO_USER_RESPONSE;
- case 400:
- case 481:
- case 500:
- case 503:
- return 41; //SWITCH_CAUSE_NORMAL_TEMPORARY_FAILURE;
- case 486:
- case 600:
- return 17; //SWITCH_CAUSE_USER_BUSY;
- case 484:
- return 28; //SWITCH_CAUSE_INVALID_NUMBER_FORMAT;
- case 488:
- case 606:
- return 65; //SWITCH_CAUSE_BERER_CAPABILITY_NOT_IMPLEMENTED;
- case 502:
- return 38; //SWITCH_CAUSE_NETWORK_OUT_OF_ORDER;
- case 405:
- return 63; //SWITCH_CAUSE_SERVICE_UNAVAILABLE;
- case 406:
- case 415:
- case 501:
- return 79; //SWITCH_CAUSE_SERVICE_NOT_IMPLEMENTED;
- case 482:
- case 483:
- return 25; //SWITCH_CAUSE_EXCHANGE_ROUTING_ERROR;
- case 487:
- return 31; //??? SWITCH_CAUSE_ORIGINATOR_CANCEL; (not specified)
- default:
- return 31; //SWITCH_CAUSE_NORMAL_UNSPECIFIED;
- }
-}
-
-static uint16_t isdn2status_cause(uint8_t cause, uint8_t location)
-{
- switch (cause) {
- case 1:
- return 404;
- case 2:
- return 404;
- case 3:
- return 404;
- case 17:
- return 486;
- case 18:
- return 408;
- case 19:
- return 480;
- case 20:
- return 480;
- case 21:
- if (location == OSMO_CC_LOCATION_USER)
- return 603;
- return 403;
- case 22:
- //return 301;
- return 410;
- case 23:
- return 410;
- case 26:
- return 404;
- case 27:
- return 502;
- case 28:
- return 484;
- case 29:
- return 501;
- case 31:
- return 480;
- case 34:
- return 503;
- case 38:
- return 503;
- case 41:
- return 503;
- case 42:
- return 503;
- case 47:
- return 503;
- case 55:
- return 403;
- case 57:
- return 403;
- case 58:
- return 503;
- case 65:
- return 488;
- case 69:
- return 501;
- case 70:
- return 488;
- case 79:
- return 501;
- case 87:
- return 403;
- case 88:
- return 503;
- case 102:
- return 504;
- case 111:
- return 500;
- case 127:
- return 500;
- default:
- return 468;
- }
-}
-
-static uint8_t socket2isdn_cause(uint8_t sock)
-{
- switch (sock) {
- case OSMO_CC_SOCKET_CAUSE_FAILED:
- return 47;
- case OSMO_CC_SOCKET_CAUSE_BROKEN_PIPE:
- return 41;
- case OSMO_CC_SOCKET_CAUSE_VERSION_MISMATCH:
- return 38;
- case OSMO_CC_SOCKET_CAUSE_TIMEOUT:
- return 41;
- default:
- return 31;
- }
-}
-
-void osmo_cc_convert_cause(struct osmo_cc_ie_cause *cause)
-{
- /* complete cause, from socket cause */
- if (cause->socket_cause && cause->isdn_cause == 0 && ntohs(cause->sip_cause_networkorder) == 0)
- cause->isdn_cause = socket2isdn_cause(cause->socket_cause);
-
- /* convert ISDN cause to SIP cause */
- if (cause->isdn_cause && ntohs(cause->sip_cause_networkorder) == 0) {
- cause->sip_cause_networkorder = htons(isdn2status_cause(cause->isdn_cause, cause->location));
- }
-
- /* convert SIP cause to ISDN cause */
- if (ntohs(cause->sip_cause_networkorder) && cause->isdn_cause == 0) {
- cause->isdn_cause = status2isdn_cause(ntohs(cause->sip_cause_networkorder));
- }
-
- /* no cause at all: use Normal Call Clearing */
- if (cause->isdn_cause == 0 && ntohs(cause->sip_cause_networkorder) == 0) {
- cause->isdn_cause = OSMO_CC_ISDN_CAUSE_NORM_CALL_CLEAR;
- cause->sip_cause_networkorder = htons(486);
- }
-}
-
-void osmo_cc_convert_cause_msg(osmo_cc_msg_t *msg)
-{
- void *ie;
- uint8_t type;
- uint16_t length;
- void *value;
-
- /* search for (all) cause IE and convert the values, if needed */
- ie = msg->data;
- while ((value = osmo_cc_msg_sep_ie(msg, &ie, &type, &length))) {
- if (type == OSMO_CC_IE_CAUSE && length >= sizeof(struct osmo_cc_ie_cause)) {
- osmo_cc_convert_cause(value);
- }
- }
-}
-
-uint8_t osmo_cc_collect_cause(uint8_t old_cause, uint8_t new_cause)
-{
- /* first cause */
- if (old_cause == 0)
- return new_cause;
-
- /* first prio: return 17 */
- if (old_cause == OSMO_CC_ISDN_CAUSE_USER_BUSY
- || new_cause == OSMO_CC_ISDN_CAUSE_USER_BUSY)
- return OSMO_CC_ISDN_CAUSE_USER_BUSY;
-
- /* second prio: return 21 */
- if (old_cause == OSMO_CC_ISDN_CAUSE_CALL_REJECTED
- || new_cause == OSMO_CC_ISDN_CAUSE_CALL_REJECTED)
- return OSMO_CC_ISDN_CAUSE_CALL_REJECTED;
-
- /* third prio: return other than 88 and 18 (what ever was first) */
- if (old_cause != OSMO_CC_ISDN_CAUSE_INCOMPAT_DEST
- && old_cause != OSMO_CC_ISDN_CAUSE_USER_NOTRESPOND)
- return old_cause;
- if (new_cause != OSMO_CC_ISDN_CAUSE_INCOMPAT_DEST
- && new_cause != OSMO_CC_ISDN_CAUSE_USER_NOTRESPOND)
- return new_cause;
-
- /* fourth prio: return 88 */
- if (old_cause == OSMO_CC_ISDN_CAUSE_INCOMPAT_DEST
- || new_cause == OSMO_CC_ISDN_CAUSE_INCOMPAT_DEST)
- return OSMO_CC_ISDN_CAUSE_INCOMPAT_DEST;
-
- /* fith prio: return 18 */
- return OSMO_CC_ISDN_CAUSE_USER_NOTRESPOND;
-}
-
diff --git a/src/libosmocc/cause.h b/src/libosmocc/cause.h
deleted file mode 100644
index 22319f4..0000000
--- a/src/libosmocc/cause.h
+++ /dev/null
@@ -1,5 +0,0 @@
-
-void osmo_cc_convert_cause(struct osmo_cc_ie_cause *cause);
-void osmo_cc_convert_cause_msg(osmo_cc_msg_t *msg);
-uint8_t osmo_cc_collect_cause(uint8_t old_cause, uint8_t new_cause);
-
diff --git a/src/libosmocc/endpoint.c b/src/libosmocc/endpoint.c
deleted file mode 100644
index 48290d5..0000000
--- a/src/libosmocc/endpoint.c
+++ /dev/null
@@ -1,1584 +0,0 @@
-/* Endpoint and call process handling
- *
- * (C) 2019 by Andreas Eversberg <jolly@eversberg.eu>
- * All Rights Reserved
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <stdio.h>
-#include <errno.h>
-#include <string.h>
-#include <stdlib.h>
-#include <arpa/inet.h>
-#include <unistd.h>
-#include "../libtimer/timer.h"
-#include "../libdebug/debug.h"
-#include "endpoint.h"
-
-osmo_cc_endpoint_t *osmo_cc_endpoint_list = NULL;
-
-static osmo_cc_call_t *call_new(osmo_cc_endpoint_t *ep, uint32_t callref)
-{
- osmo_cc_call_t *call, **cp;
-
- call = calloc(1, sizeof(*call));
- if (!call) {
- PDEBUG(DCC, DEBUG_ERROR, "No memory for call process instance.\n");
- abort();
- }
-
- PDEBUG(DCC, DEBUG_DEBUG, "Creating new call with callref %u.\n", callref);
-
- call->ep = ep;
- call->callref = callref;
-
- /* attach to call process list */
- cp = &ep->call_list;
- while (*cp)
- cp = &((*cp)->next);
- *cp = call;
-
- /* return new entry */
- return call;
-}
-
-static void call_delete(osmo_cc_call_t *call)
-{
- osmo_cc_call_t **cp;
-
- PDEBUG(DCC, DEBUG_DEBUG, "Destroying call with callref %u.\n", call->callref);
-
- /* detach from call process list */
- cp = &call->ep->call_list;
- while (*cp != call)
- cp = &((*cp)->next);
- *cp = call->next;
-
- /* flush message queue */
- while (call->sock_queue) {
- osmo_cc_msg_t *msg = osmo_cc_msg_list_dequeue(&call->sock_queue, NULL);
- osmo_cc_free_msg(msg);
- }
-
- /* free remote peer */
- free((char *)call->attached_name);
- free((char *)call->attached_host);
-
- free(call);
-}
-
-static const char *state_names[] = {
- "IDLE",
- "INIT-OUT",
- "INIT-IN",
- "OVERLAP-OUT",
- "OVERLAP-IN",
- "PROCEEDING-OUT",
- "PROCEEDING-IN",
- "ALERTING-OUT",
- "ALERTING-IN",
- "CONNECTING-OUT",
- "CONNECTING-IN",
- "ACTIVE",
- "DISCONNECTING-OUT",
- "DISCONNECTING-IN",
- "DISCONNECT-COLLISION",
- "RELEASING-OUT",
- "ATTACH-SENT",
- "ATTACH-OUT",
- "ATTACH-WAIT",
- "ATTACH-IN",
-};
-
-static void new_call_state(osmo_cc_call_t *call, enum osmo_cc_state new_state)
-{
- PDEBUG(DCC, DEBUG_DEBUG, "Changing call state with callref %u from %s to %s.\n", call->callref, state_names[call->state], state_names[new_state]);
- call->state = new_state;
-}
-
-/* helper to forward message to lower layer */
-static void forward_to_ll(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- if (call->lower_layer_released)
- return;
-
- if (msg->type == OSMO_CC_MSG_SETUP_REQ
- || msg->type == OSMO_CC_MSG_SETUP_RSP) {
- /* screen towards lower layer */
- msg = osmo_cc_screen_msg(call->ep, msg, 0, NULL);
- }
-
- osmo_cc_msg_list_enqueue(&call->ep->ll_queue, msg, call->callref);
-}
-
-static void sock_reject_msg(osmo_cc_socket_t *os, uint32_t callref, uint8_t location, uint8_t socket_cause, uint8_t isdn_cause, uint16_t sip_cause)
-{
- osmo_cc_msg_t *msg;
-
- /* create message */
- msg = osmo_cc_new_msg(OSMO_CC_MSG_REJ_IND);
-
- /* add cause */
- osmo_cc_add_ie_cause(msg, location, isdn_cause, sip_cause, socket_cause);
- osmo_cc_convert_cause_msg(msg);
-
- /* message to socket */
- osmo_cc_sock_send_msg(os, callref, msg, NULL, 0);
-}
-
-static void ll_reject_msg(osmo_cc_call_t *call, uint8_t location, uint8_t socket_cause, uint8_t isdn_cause, uint16_t sip_cause)
-{
- osmo_cc_msg_t *msg;
-
- /* create message */
- msg = osmo_cc_new_msg(OSMO_CC_MSG_REJ_REQ);
-
- /* add cause */
- osmo_cc_add_ie_cause(msg, location, isdn_cause, sip_cause, socket_cause);
- osmo_cc_convert_cause_msg(msg);
-
- /* message to lower layer */
- forward_to_ll(call, msg);
-}
-
-static int split_address(const char *address, const char **host_p, uint16_t *port_p)
-{
- const char *portstring;
-
- *host_p = osmo_cc_host_of_address(address);
- if (!(*host_p)) {
- PDEBUG(DCC, DEBUG_ERROR, "Host IP in given address '%s' is invalid.\n", address);
- return -EINVAL;
- }
- portstring = osmo_cc_port_of_address(address);
- if (!portstring) {
- PDEBUG(DCC, DEBUG_ERROR, "Port number in given address '%s' is not specified or invalid.\n", address);
- return -EINVAL;
- }
- *port_p = atoi(portstring);
-
- return 0;
-}
-
-
-osmo_cc_call_t *osmo_cc_get_attached_interface(osmo_cc_endpoint_t *ep, const char *interface)
-{
- osmo_cc_call_t *att;
-
- for (att = ep->call_list; att; att = att->next) {
- if (att->state != OSMO_CC_STATE_ATTACH_IN)
- continue;
- /* no interface given, just use the attached peer */
- if (!interface[0])
- break;
- /* no interface name given on attached peer, ignore it */
- if (!att->attached_name || !att->attached_name[0])
- continue;
- /* interface given, use the attached peer with the same interface name */
- if (!strcmp(interface, att->attached_name))
- break;
- }
-
- return att;
-}
-/* helper to forward message to upper layer */
-static void forward_to_ul(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- const char *address = NULL, *host = NULL;
- uint16_t port;
- int rc;
-
- if (call->upper_layer_released)
- return;
-
- if (msg->type == OSMO_CC_MSG_SETUP_IND
- || msg->type == OSMO_CC_MSG_SETUP_CNF) {
- /* screen towards upper layer */
- msg = osmo_cc_screen_msg(call->ep, msg, 1, &address);
- }
-
- /* no socket: forward message to upper layer */
- if (call->ep->ul_msg_cb) {
- call->ep->ul_msg_cb(call, msg);
- return;
- }
-
- /* if remote peer is included in the setup message */
- if (address && msg->type == OSMO_CC_MSG_SETUP_IND) {
- rc = split_address(address, &host, &port);
- if (rc < 0) {
- PDEBUG(DCC, DEBUG_ERROR, "Given remote peer's address '%s' in setup message is invalid, rejecting call.\n", address);
-reject:
- /* reject, due to error */
- osmo_cc_free_msg(msg);
- new_call_state(call, OSMO_CC_STATE_IDLE);
- ll_reject_msg(call, call->ep->serving_location, 0, OSMO_CC_ISDN_CAUSE_DEST_OOO, 0);
- call_delete(call);
- return;
- }
- PDEBUG(DCC, DEBUG_DEBUG, "Using host IP '%s' and port '%d' from setup message.\n", host, port);
- }
-
- /* for attach message, use remote peer */
- if (msg->type == OSMO_CC_MSG_ATTACH_IND) {
- host = call->ep->remote_host;
- port = call->ep->remote_port;
- PDEBUG(DCC, DEBUG_DEBUG, "Using host IP '%s' and port '%d' from remote address for attach message.\n", host, port);
- }
-
- /* if there is no remote peer in the setup message, use remote peer */
- if (!address && msg->type == OSMO_CC_MSG_SETUP_IND && call->ep->remote_host) {
- host = call->ep->remote_host;
- port = call->ep->remote_port;
- PDEBUG(DCC, DEBUG_DEBUG, "Using host IP '%s' and port '%d' from remote address for setup message.\n", host, port);
- }
-
- /* if there is no remote peer set, try to use the interface name */
- if (!host && msg->type == OSMO_CC_MSG_SETUP_IND) {
- char interface[256];
- osmo_cc_call_t *att;
-
- rc = osmo_cc_get_ie_called_interface(msg, 0, interface, sizeof(interface));
- if (rc < 0)
- interface[0] = '\0';
- /* check for incoming attachment */
- att = osmo_cc_get_attached_interface(call->ep, interface);
- if (!att && !interface[0]) {
- PDEBUG(DCC, DEBUG_ERROR, "No remote peer attached, rejecting call.\n");
- goto reject;
- }
- if (!att) {
- PDEBUG(DCC, DEBUG_ERROR, "No remote peer attached for given interface '%s', rejecting call.\n", interface);
- goto reject;
- }
- host = att->attached_host;
- port = att->attached_port;
- PDEBUG(DCC, DEBUG_DEBUG, "Using host IP '%s' and port '%d' from attached peer for setup message.\n", host, port);
- }
-
- /* add local interface name to setup message */
- // FIXME: should we do that if there is already an interface name given?
- if (msg->type == OSMO_CC_MSG_SETUP_IND && call->ep->local_name)
- osmo_cc_add_ie_calling_interface(msg, call->ep->local_name);
-
- /* forward message to socket */
- osmo_cc_sock_send_msg(&call->ep->os, call->callref, msg, host, port);
-}
-
-/* send attach indication to socket */
-void send_attach_ind(struct timer *timer)
-{
- osmo_cc_endpoint_t *ep = (osmo_cc_endpoint_t *)timer->priv;
- osmo_cc_call_t *call;
- osmo_cc_msg_t *msg;
-
- PDEBUG(DCC, DEBUG_DEBUG, "Trying to attach to remote peer \"%s\".\n", ep->remote_host);
-
- /* create new call for attachment */
- call = osmo_cc_call_new(ep);
-
- /* create attach message */
- msg = osmo_cc_new_msg(OSMO_CC_MSG_ATTACH_IND);
-
- /* set interface name and address */
- osmo_cc_add_ie_calling_interface(msg, ep->local_name);
- osmo_cc_add_ie_socket_address(msg, ep->local_address);
-
- /* message to socket */
- forward_to_ul(call, msg);
-
- /* set state */
- new_call_state(call, OSMO_CC_STATE_ATTACH_SENT);
-}
-
-void attach_rsp(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- PDEBUG(DCC, DEBUG_INFO, "Attached to remote peer \"%s\".\n", call->ep->remote_address);
-
- /* set state */
- new_call_state(call, OSMO_CC_STATE_ATTACH_OUT);
-
- /* drop message */
- osmo_cc_free_msg(msg);
-}
-
-void attach_rel(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- /* (re-)start timer for next attachment */
- if (call->state == OSMO_CC_STATE_ATTACH_SENT
- || call->state == OSMO_CC_STATE_ATTACH_OUT) {
- timer_start(&call->ep->attach_timer, OSMO_CC_ATTACH_TIMER);
- PDEBUG(DCC, DEBUG_INFO, "Attachment to remote peer \"%s\" failed, retrying.\n", call->ep->remote_address);
- }
-
- if (call->attached_name)
- PDEBUG(DCC, DEBUG_INFO, "Peer with remote interface \"%s\" detached from us.\n", call->attached_name);
-
- /* change state */
- new_call_state(call, OSMO_CC_STATE_IDLE);
-
- /* unset interface */
- free((char *)call->attached_name);
- call->attached_name = NULL;
- free((char *)call->attached_host);
- call->attached_host = NULL;
-
- /* drop message */
- osmo_cc_free_msg(msg);
-
- /* destroy */
- call_delete(call);
-}
-
-void attach_req(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- char address[256];
- char interface[256];
- const char *host;
- uint16_t port;
- int rc;
-
- /* get peer from message */
- rc = osmo_cc_get_ie_socket_address(msg, 0, address, sizeof(address));
- if (rc < 0)
- address[0] = '\0';
- if (!address[0]) {
- PDEBUG(DCC, DEBUG_ERROR, "Attachment request from remote peer has no remote address set, rejecting.\n");
-
-rel:
- /* change to REL_REQ */
- msg->type = OSMO_CC_MSG_REL_IND;
- PDEBUG(DCC, DEBUG_INFO, "Changing message to %s.\n", osmo_cc_msg_value2name(msg->type));
-
- /* message to socket */
- forward_to_ul(call, msg);
-
- /* destroy */
- call_delete(call);
-
- return;
- }
- rc = split_address(address, &host, &port);
- if (rc < 0) {
- PDEBUG(DCC, DEBUG_ERROR, "Given remote peer's address '%s' in attach message is invalid, rejecting call.\n", address);
- goto rel;
- }
- free((char *)call->attached_host);
- call->attached_host = strdup(host);
- call->attached_port = port;
-
- rc = osmo_cc_get_ie_calling_interface(msg, 0, interface, sizeof(interface));
- if (rc < 0)
- interface[0] = '\0';
- if (interface[0]) {
- free((char *)call->attached_name);
- call->attached_name = strdup(interface);
- }
-
- PDEBUG(DCC, DEBUG_INFO, "Remote peer with socket address '%s' and port '%d' and interface '%s' attached to us.\n", call->attached_host, call->attached_port, call->attached_name);
-
- /* changing to confirm message */
- msg->type = OSMO_CC_MSG_ATTACH_CNF;
- PDEBUG(DCC, DEBUG_INFO, "Changing message to %s.\n", osmo_cc_msg_value2name(msg->type));
-
- /* message to socket */
- forward_to_ul(call, msg);
-
- /* set state */
- new_call_state(call, OSMO_CC_STATE_ATTACH_IN);
-}
-
-static void setup_req(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- /* change state */
- new_call_state(call, OSMO_CC_STATE_INIT_OUT);
-
- /* to lower layer */
- forward_to_ll(call, msg);
-}
-
-static void setup_ind(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- /* change state */
- new_call_state(call, OSMO_CC_STATE_INIT_IN);
-
- /* to upper layer */
- forward_to_ul(call, msg);
-}
-
-static void rej_req(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- /* change state */
- new_call_state(call, OSMO_CC_STATE_IDLE);
-
- /* to lower layer */
- forward_to_ll(call, msg);
-
- /* destroy */
- call_delete(call);
-}
-
-static void rej_ind(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- /* change state */
- new_call_state(call, OSMO_CC_STATE_IDLE);
-
- /* to upper layer */
- forward_to_ul(call, msg);
-
- /* destroy */
- call_delete(call);
-}
-
-static void setup_ack_req(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- /* change state */
- new_call_state(call, OSMO_CC_STATE_OVERLAP_IN);
-
- /* to lower layer */
- forward_to_ll(call, msg);
-}
-
-static void setup_ack_ind(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- /* change state */
- new_call_state(call, OSMO_CC_STATE_OVERLAP_OUT);
-
- /* to upper layer */
- forward_to_ul(call, msg);
-}
-
-static void proc_req(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- /* change state */
- new_call_state(call, OSMO_CC_STATE_PROCEEDING_IN);
-
- /* to lower layer */
- forward_to_ll(call, msg);
-}
-
-static void proc_ind(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- /* change state */
- new_call_state(call, OSMO_CC_STATE_PROCEEDING_OUT);
-
- /* to upper layer */
- forward_to_ul(call, msg);
-}
-
-static void alert_req(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- /* change state */
- new_call_state(call, OSMO_CC_STATE_ALERTING_IN);
-
- /* to lower layer */
- forward_to_ll(call, msg);
-}
-
-static void alert_ind(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- /* change state */
- new_call_state(call, OSMO_CC_STATE_ALERTING_OUT);
-
- /* to upper layer */
- forward_to_ul(call, msg);
-}
-
-static void setup_rsp(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- /* change state */
- new_call_state(call, OSMO_CC_STATE_CONNECTING_IN);
-
- /* to lower layer */
- forward_to_ll(call, msg);
-}
-
-static void setup_cnf(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- /* change state */
- new_call_state(call, OSMO_CC_STATE_CONNECTING_OUT);
-
- /* to upper layer */
- forward_to_ul(call, msg);
-}
-
-static void setup_comp_req(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- /* change state */
- new_call_state(call, OSMO_CC_STATE_ACTIVE);
-
- /* to lower layer */
- forward_to_ll(call, msg);
-}
-
-static void setup_comp_ind(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- /* change state */
- new_call_state(call, OSMO_CC_STATE_ACTIVE);
-
- /* to upper layer */
- forward_to_ul(call, msg);
-}
-
-static void info_req(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- /* to lower layer */
- forward_to_ll(call, msg);
-}
-
-static void info_ind(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- /* to upper layer */
- forward_to_ul(call, msg);
-}
-
-static void progress_req(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- /* to lower layer */
- forward_to_ll(call, msg);
-}
-
-static void progress_ind(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- /* to upper layer */
- forward_to_ul(call, msg);
-}
-
-static void notify_req(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- /* to lower layer */
- forward_to_ll(call, msg);
-}
-
-static void notify_ind(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- /* to upper layer */
- forward_to_ul(call, msg);
-}
-
-static void modify_req(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- /* to lower layer */
- forward_to_ll(call, msg);
-}
-
-static void modify_cnf(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- /* to upper layer */
- forward_to_ul(call, msg);
-}
-
-static void modify_ind(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- /* to upper layer */
- forward_to_ul(call, msg);
-}
-
-static void modify_rsp(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- /* to lower layer */
- forward_to_ll(call, msg);
-}
-
-static void disc_req(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- /* change state */
- new_call_state(call, OSMO_CC_STATE_DISCONNECTING_OUT);
-
- /* to lower layer */
- forward_to_ll(call, msg);
-}
-
-static void disc_ind(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- /* change state */
- new_call_state(call, OSMO_CC_STATE_DISCONNECTING_IN);
-
- /* to upper layer */
- forward_to_ul(call, msg);
-}
-
-static void rel_req(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- /* terminate process, if there is no lower layer anmore */
- if (call->lower_layer_released) {
- /* change state */
- new_call_state(call, OSMO_CC_STATE_IDLE);
-
- /* drop message */
- osmo_cc_free_msg(msg);
-
- /* destroy */
- call_delete(call);
-
- return;
- }
-
- /* change state */
- new_call_state(call, OSMO_CC_STATE_RELEASING_OUT);
-
- /* to lower layer */
- forward_to_ll(call, msg);
-}
-
-static void rel_ind(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- /* change state */
- new_call_state(call, OSMO_CC_STATE_IDLE);
-
- /* to upper layer */
- forward_to_ul(call, msg);
-
- /* destroy */
- call_delete(call);
-}
-
-static void rel_cnf(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- /* change state */
- new_call_state(call, OSMO_CC_STATE_IDLE);
-
- /* drop message */
- osmo_cc_free_msg(msg);
-
- /* destroy */
- call_delete(call);
-}
-
-static void disc_collision_ind(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- /* release to lower layer wheen there is no upper layer */
- if (call->upper_layer_released) {
- /* change state */
- new_call_state(call, OSMO_CC_STATE_RELEASING_OUT);
-
- /* change to REL_REQ */
- msg->type = OSMO_CC_MSG_REL_REQ;
- PDEBUG(DCC, DEBUG_INFO, "Changing message to %s.\n", osmo_cc_msg_value2name(msg->type));
-
- /* to lower layer */
- forward_to_ll(call, msg);
-
- return;
- }
-
- /* change state */
- new_call_state(call, OSMO_CC_STATE_DISC_COLLISION);
-
- /* to upper layer */
- forward_to_ul(call, msg);
-}
-
-static void disc_collision_req(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- /* release to upper layer wheen there is no lower layer */
- if (call->lower_layer_released) {
- /* change to REL_REQ */
- msg->type = OSMO_CC_MSG_REL_IND;
- PDEBUG(DCC, DEBUG_INFO, "Changing message to %s.\n", osmo_cc_msg_value2name(msg->type));
-
- /* to upper layer */
- forward_to_ul(call, msg);
-
- /* destroy */
- call_delete(call);
-
- return;
- }
-
- /* change state */
- new_call_state(call, OSMO_CC_STATE_DISC_COLLISION);
-
- /* to lower layer */
- forward_to_ll(call, msg);
-}
-
-static void rel_collision(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- /* change state */
- if (call->state != OSMO_CC_STATE_IDLE)
- new_call_state(call, OSMO_CC_STATE_IDLE);
-
- /* drop message */
- osmo_cc_free_msg(msg);
-
- /* destroy */
- call_delete(call);
-}
-
-static void rej_ind_disc(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- /* change state */
- new_call_state(call, OSMO_CC_STATE_IDLE);
-
- /* change to REL_IND */
- msg->type = OSMO_CC_MSG_REL_IND;
- PDEBUG(DCC, DEBUG_INFO, "Changing message to %s.\n", osmo_cc_msg_value2name(msg->type));
-
- /* to upper layer */
- forward_to_ul(call, msg);
-
- /* destroy */
- call_delete(call);
-}
-
-static void rej_req_disc(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- /* change state */
- new_call_state(call, OSMO_CC_STATE_IDLE);
-
- /* change to REL_REQ */
- msg->type = OSMO_CC_MSG_REL_REQ;
- PDEBUG(DCC, DEBUG_INFO, "Changing message to %s.\n", osmo_cc_msg_value2name(msg->type));
-
- /* to lower layer */
- forward_to_ll(call, msg);
-
- /* destroy */
- call_delete(call);
-}
-
-static void rel_ind_other(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- // FIXME: does this event really happens in this state?
- // just to be safe we handle it
- /* if thereis no upper layer, we are done */
- if (call->upper_layer_released) {
- /* drop message */
- osmo_cc_free_msg(msg);
-
- /* destroy */
- call_delete(call);
-
- return;
- }
-
- /* change state */
- new_call_state(call, OSMO_CC_STATE_DISCONNECTING_IN);
-
- /* change to DISC_IND */
- msg->type = OSMO_CC_MSG_DISC_IND;
- PDEBUG(DCC, DEBUG_INFO, "Changing message to %s.\n", osmo_cc_msg_value2name(msg->type));
- call->lower_layer_released = 1;
-
- /* to upper layer */
- forward_to_ul(call, msg);
-}
-
-static void rel_req_other(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- // FIXME: does this event really happens in this state?
- // just to be safe we handle it
- /* if thereis no lower layer, we are done */
- if (call->lower_layer_released) {
- /* drop message */
- osmo_cc_free_msg(msg);
-
- /* destroy */
- call_delete(call);
-
- return;
- }
-
- /* change state */
- new_call_state(call, OSMO_CC_STATE_DISCONNECTING_OUT);
-
- /* change to DISC_REQ */
- msg->type = OSMO_CC_MSG_DISC_REQ;
- PDEBUG(DCC, DEBUG_INFO, "Changing message to %s.\n", osmo_cc_msg_value2name(msg->type));
- call->upper_layer_released = 1;
-
- /* to lower layer */
- forward_to_ll(call, msg);
-}
-
-#define SBIT(a) (1 << a)
-#define ALL_STATES (~0)
-
-static struct statemachine {
- uint32_t states;
- int type;
- void (*action)(osmo_cc_call_t *call, osmo_cc_msg_t *msg);
-} statemachine_list[] = {
- /* attachment states */
- {SBIT(OSMO_CC_STATE_ATTACH_SENT),
- OSMO_CC_MSG_ATTACH_RSP, attach_rsp},
- {SBIT(OSMO_CC_STATE_ATTACH_OUT) | SBIT(OSMO_CC_STATE_ATTACH_SENT),
- OSMO_CC_MSG_REL_REQ, attach_rel},
- {SBIT(OSMO_CC_STATE_IDLE),
- OSMO_CC_MSG_ATTACH_REQ, attach_req},
- {SBIT(OSMO_CC_STATE_ATTACH_IN),
- OSMO_CC_MSG_REL_REQ, attach_rel},
-
- /* call setup toward lower layer protocol */
- {SBIT(OSMO_CC_STATE_IDLE),
- OSMO_CC_MSG_SETUP_REQ, setup_req},
- {SBIT(OSMO_CC_STATE_INIT_OUT),
- OSMO_CC_MSG_SETUP_ACK_IND, setup_ack_ind},
- {SBIT(OSMO_CC_STATE_INIT_OUT) | SBIT(OSMO_CC_STATE_OVERLAP_OUT),
- OSMO_CC_MSG_PROC_IND, proc_ind},
- {SBIT(OSMO_CC_STATE_INIT_OUT) | SBIT(OSMO_CC_STATE_OVERLAP_OUT) |
- SBIT(OSMO_CC_STATE_PROCEEDING_OUT),
- OSMO_CC_MSG_ALERT_IND, alert_ind},
- {SBIT(OSMO_CC_STATE_INIT_OUT) | SBIT(OSMO_CC_STATE_OVERLAP_OUT) |
- SBIT(OSMO_CC_STATE_PROCEEDING_OUT) | SBIT(OSMO_CC_STATE_ALERTING_OUT),
- OSMO_CC_MSG_SETUP_CNF, setup_cnf},
- {SBIT(OSMO_CC_STATE_OVERLAP_OUT) | SBIT(OSMO_CC_STATE_PROCEEDING_OUT) |
- SBIT(OSMO_CC_STATE_ALERTING_OUT),
- OSMO_CC_MSG_PROGRESS_IND, progress_ind},
- {SBIT(OSMO_CC_STATE_OVERLAP_OUT),
- OSMO_CC_MSG_INFO_REQ, info_req},
- {SBIT(OSMO_CC_STATE_PROCEEDING_OUT) | SBIT(OSMO_CC_STATE_ALERTING_OUT),
- OSMO_CC_MSG_NOTIFY_IND, notify_ind},
- {SBIT(OSMO_CC_STATE_CONNECTING_OUT),
- OSMO_CC_MSG_SETUP_COMP_REQ, setup_comp_req},
-
- /* call setup from lower layer protocol */
- {SBIT(OSMO_CC_STATE_IDLE),
- OSMO_CC_MSG_SETUP_IND, setup_ind},
- {SBIT(OSMO_CC_STATE_INIT_IN),
- OSMO_CC_MSG_SETUP_ACK_REQ, setup_ack_req},
- {SBIT(OSMO_CC_STATE_INIT_IN) | SBIT(OSMO_CC_STATE_OVERLAP_IN),
- OSMO_CC_MSG_PROC_REQ, proc_req},
- {SBIT(OSMO_CC_STATE_INIT_IN) | SBIT(OSMO_CC_STATE_OVERLAP_IN) |
- SBIT(OSMO_CC_STATE_PROCEEDING_IN),
- OSMO_CC_MSG_ALERT_REQ, alert_req},
- {SBIT(OSMO_CC_STATE_INIT_IN) | SBIT(OSMO_CC_STATE_OVERLAP_IN) |
- SBIT(OSMO_CC_STATE_PROCEEDING_IN) | SBIT(OSMO_CC_STATE_ALERTING_IN),
- OSMO_CC_MSG_SETUP_RSP, setup_rsp},
- {SBIT(OSMO_CC_STATE_OVERLAP_IN) | SBIT(OSMO_CC_STATE_PROCEEDING_IN) |
- SBIT(OSMO_CC_STATE_ALERTING_IN),
- OSMO_CC_MSG_PROGRESS_REQ, progress_req},
- {SBIT(OSMO_CC_STATE_OVERLAP_IN),
- OSMO_CC_MSG_INFO_IND, info_ind},
- {SBIT(OSMO_CC_STATE_PROCEEDING_IN) | SBIT(OSMO_CC_STATE_ALERTING_IN),
- OSMO_CC_MSG_NOTIFY_REQ, notify_req},
- {SBIT(OSMO_CC_STATE_CONNECTING_IN),
- OSMO_CC_MSG_SETUP_COMP_IND, setup_comp_ind},
-
- /* active state */
- {SBIT(OSMO_CC_STATE_ACTIVE),
- OSMO_CC_MSG_NOTIFY_IND, notify_ind},
- {SBIT(OSMO_CC_STATE_ACTIVE),
- OSMO_CC_MSG_NOTIFY_REQ, notify_req},
- {SBIT(OSMO_CC_STATE_ACTIVE),
- OSMO_CC_MSG_INFO_IND, info_ind},
- {SBIT(OSMO_CC_STATE_ACTIVE),
- OSMO_CC_MSG_INFO_REQ, info_req},
- {SBIT(OSMO_CC_STATE_ACTIVE),
- OSMO_CC_MSG_MODIFY_REQ, modify_req},
- {SBIT(OSMO_CC_STATE_ACTIVE),
- OSMO_CC_MSG_MODIFY_CNF, modify_cnf},
- {SBIT(OSMO_CC_STATE_ACTIVE),
- OSMO_CC_MSG_MODIFY_IND, modify_ind},
- {SBIT(OSMO_CC_STATE_ACTIVE),
- OSMO_CC_MSG_MODIFY_RSP, modify_rsp},
-
- /* call release */
- {SBIT(OSMO_CC_STATE_INIT_OUT) | SBIT(OSMO_CC_STATE_INIT_IN) |
- SBIT(OSMO_CC_STATE_OVERLAP_OUT) | SBIT(OSMO_CC_STATE_OVERLAP_IN) |
- SBIT(OSMO_CC_STATE_PROCEEDING_OUT) | SBIT(OSMO_CC_STATE_PROCEEDING_IN) |
- SBIT(OSMO_CC_STATE_ALERTING_OUT) | SBIT(OSMO_CC_STATE_ALERTING_IN) |
- SBIT(OSMO_CC_STATE_CONNECTING_OUT) | SBIT(OSMO_CC_STATE_CONNECTING_IN) |
- SBIT(OSMO_CC_STATE_ACTIVE),
- OSMO_CC_MSG_DISC_REQ, disc_req},
- {SBIT(OSMO_CC_STATE_INIT_OUT) | SBIT(OSMO_CC_STATE_INIT_IN) |
- SBIT(OSMO_CC_STATE_OVERLAP_OUT) | SBIT(OSMO_CC_STATE_OVERLAP_IN) |
- SBIT(OSMO_CC_STATE_PROCEEDING_OUT) | SBIT(OSMO_CC_STATE_PROCEEDING_IN) |
- SBIT(OSMO_CC_STATE_ALERTING_OUT) | SBIT(OSMO_CC_STATE_ALERTING_IN) |
- SBIT(OSMO_CC_STATE_CONNECTING_OUT) | SBIT(OSMO_CC_STATE_CONNECTING_IN) |
- SBIT(OSMO_CC_STATE_ACTIVE),
- OSMO_CC_MSG_DISC_IND, disc_ind},
- {SBIT(OSMO_CC_STATE_INIT_OUT),
- OSMO_CC_MSG_REJ_IND, rej_ind},
- {SBIT(OSMO_CC_STATE_INIT_IN),
- OSMO_CC_MSG_REJ_REQ, rej_req},
- {SBIT(OSMO_CC_STATE_DISCONNECTING_OUT),
- OSMO_CC_MSG_REL_IND, rel_ind},
- {SBIT(OSMO_CC_STATE_DISCONNECTING_IN),
- OSMO_CC_MSG_REL_REQ, rel_req},
- {SBIT(OSMO_CC_STATE_RELEASING_OUT),
- OSMO_CC_MSG_REL_CNF, rel_cnf},
-
- /* race condition where disconnect is received after disconnecting (disconnect collision) */
- {SBIT(OSMO_CC_STATE_DISCONNECTING_OUT),
- OSMO_CC_MSG_DISC_IND, disc_collision_ind},
- {SBIT(OSMO_CC_STATE_DISCONNECTING_IN),
- OSMO_CC_MSG_DISC_REQ, disc_collision_req},
- {SBIT(OSMO_CC_STATE_DISC_COLLISION),
- OSMO_CC_MSG_REL_IND, rel_ind},
- {SBIT(OSMO_CC_STATE_DISC_COLLISION),
- OSMO_CC_MSG_REL_REQ, rel_req},
-
- /* race condition where release is received after releasing (release collision) */
- {SBIT(OSMO_CC_STATE_RELEASING_OUT),
- OSMO_CC_MSG_REL_IND, rel_collision},
- {SBIT(OSMO_CC_STATE_IDLE),
- OSMO_CC_MSG_REL_REQ, rel_collision},
-
- /* race condition where reject is received after disconnecting */
- {SBIT(OSMO_CC_STATE_DISCONNECTING_OUT),
- OSMO_CC_MSG_REJ_IND, rej_ind_disc},
- {SBIT(OSMO_CC_STATE_DISCONNECTING_IN),
- OSMO_CC_MSG_REJ_REQ, rej_req_disc},
-
- /* turn release into disconnect, so release is possible in any state */
- {ALL_STATES,
- OSMO_CC_MSG_REL_IND, rel_ind_other},
- {ALL_STATES,
- OSMO_CC_MSG_REL_REQ, rel_req_other},
-};
-
-#define STATEMACHINE_LEN \
- (sizeof(statemachine_list) / sizeof(struct statemachine))
-
-static void handle_msg(osmo_cc_call_t *call, osmo_cc_msg_t *msg)
-{
- int i;
-
- /* Find function for current state and message */
- for (i = 0; i < (int)STATEMACHINE_LEN; i++)
- if ((msg->type == statemachine_list[i].type)
- && ((1 << call->state) & statemachine_list[i].states))
- break;
- if (i == STATEMACHINE_LEN) {
- PDEBUG(DCC, DEBUG_INFO, "Message %s unhandled at state %s (callref %d)\n",
- osmo_cc_msg_value2name(msg->type), state_names[call->state], call->callref);
- osmo_cc_free_msg(msg);
- return;
- }
-
- PDEBUG(DCC, DEBUG_INFO, "Handle message %s at state %s (callref %d)\n",
- osmo_cc_msg_value2name(msg->type), state_names[call->state], call->callref);
- if (debuglevel <= DEBUG_INFO)
- osmo_cc_debug_ie(msg, DEBUG_INFO);
- statemachine_list[i].action(call, msg);
-}
-
-static int handle_call(osmo_cc_call_t *call)
-{
- /* may handle only one message, since call may be destroyed when handling */
- if (call->sock_queue) {
- osmo_cc_msg_t *msg = osmo_cc_msg_list_dequeue(&call->sock_queue, NULL);
- handle_msg(call, msg);
- return 1;
- }
-
- return 0;
-}
-
-static int osmo_cc_handle_endpoint(osmo_cc_endpoint_t *ep)
-{
- int work = 0;
- uint32_t callref;
- osmo_cc_call_t *call;
-
- /* may handle only one message, since call may be destroyed when handling */
- if (ep->ll_queue) {
- osmo_cc_msg_t *msg = osmo_cc_msg_list_dequeue(&ep->ll_queue, &callref);
- ep->ll_msg_cb(ep, callref, msg);
- work |= 1;
- }
-
- /* handle only one call, because it might have been removed */
- for (call = ep->call_list; call; call = call->next) {
- work |= handle_call(call);
- if (work)
- break;
- }
-
- return work;
-}
-
-/* main handler
- * note that it must be called in a loop (with other handlers) until no work was done
- */
-int osmo_cc_handle(void)
-{
- int work = 0;
- osmo_cc_endpoint_t *ep;
-
- for (ep = osmo_cc_endpoint_list; ep; ep = ep->next) {
- work |= osmo_cc_handle_endpoint(ep);
- work |= osmo_cc_handle_socket(&ep->os);
- }
-
- return work;
-}
-
-osmo_cc_call_t *osmo_cc_call_by_callref(osmo_cc_endpoint_t *ep, uint32_t callref)
-{
- osmo_cc_call_t *call;
-
- if (!callref)
- return NULL;
-
- for (call = ep->call_list; call; call = call->next) {
- if (call->callref == callref) {
- return call;
- }
- }
-
- return NULL;
-}
-
-
-void osmo_cc_ll_msg(osmo_cc_endpoint_t *ep, uint32_t callref, osmo_cc_msg_t *msg)
-{
- osmo_cc_call_t *call;
-
- if (!(msg->type & 1)) {
- PDEBUG(DCC, DEBUG_ERROR, "Received message from lower layer that is not an _IND nor _CNF, please fix!\n");
- osmo_cc_free_msg(msg);
- return;
- }
-
- call = osmo_cc_call_by_callref(ep, callref);
- if (call) {
- /* complete cause */
- osmo_cc_convert_cause_msg(msg);
- handle_msg(call, msg);
- return;
- }
-
- /* if no ref exists */
-}
-
-/* message from upper layer (socket) */
-void osmo_cc_ul_msg(void *priv, uint32_t callref, osmo_cc_msg_t *msg)
-{
- osmo_cc_endpoint_t *ep = priv;
- osmo_cc_call_t *call;
-
- if ((msg->type & 1)) {
- PDEBUG(DCC, DEBUG_ERROR, "Received message from socket that is not an _REQ nor _RSP, please fix!\n");
- osmo_cc_free_msg(msg);
- return;
- }
-
- call = osmo_cc_call_by_callref(ep, callref);
- if (call) {
- /* if we are not in INIT-IN state, we change a CC-REJ-REQ into CC-REL_REQ.
- * this happens, if the socket fails.
- */
- if (call->state != OSMO_CC_STATE_INIT_IN
- && msg->type == OSMO_CC_MSG_REJ_REQ)
- msg->type = OSMO_CC_MSG_REL_REQ;
-
- osmo_cc_msg_list_enqueue(&call->sock_queue, msg, call->callref);
- return;
- }
-
- /* if no ref exists */
-
- /* reject and release are ignored */
- if (msg->type == OSMO_CC_MSG_REJ_REQ
- || msg->type == OSMO_CC_MSG_REL_REQ) {
- osmo_cc_free_msg(msg);
- return;
- }
-
- /* reject if not a setup/attach or release message */
- if (msg->type != OSMO_CC_MSG_SETUP_REQ
- && msg->type != OSMO_CC_MSG_ATTACH_REQ) {
- sock_reject_msg(&ep->os, callref, ep->serving_location, 0, OSMO_CC_ISDN_CAUSE_INVAL_CALLREF, 0);
- osmo_cc_free_msg(msg);
- return;
- }
-
- /* create call instance with one socket reference */
- call = call_new(ep, callref);
-
- osmo_cc_msg_list_enqueue(&call->sock_queue, msg, call->callref);
-}
-
-static void osmo_cc_help_name(void)
-{
- printf("Name options:\n\n");
-
- printf("name <name>\n");
-
- printf("Allows to override endpoint name given by application.\n");
-}
-
-static int osmo_cc_set_name(osmo_cc_endpoint_t *ep, const char *text)
-{
- if (!strncasecmp(text, "name", 4)) {
- text += 4;
- /* remove spaces after keyword */
- while (*text) {
- if (*text > 32)
- break;
- text++;
- }
- } else {
- PDEBUG(DCC, DEBUG_ERROR, "Invalid name definition '%s'\n", text);
- return -EINVAL;
- }
-
- free((char *)ep->local_name);
- ep->local_name = strdup(text);
-
- return 0;
-}
-
-static void osmo_cc_help_address(void)
-{
- printf("Address options:\n\n");
-
- printf("local <IPv4 address>:<port>\n");
- printf("local [<IPv6 address>]:<port>\n");
- printf("remote <IPv4 address>:<port>\n");
- printf("remote [<IPv6 address>]:<port>\n\n");
- printf("remote auto\n\n");
- printf("remote none\n\n");
-
- printf("These options can be used to define local and remote IP and port for the socket\n");
- printf("interface. Note that IPv6 addresses must be enclosed by '[' and ']'.\n\n");
-
- printf("If no local address was given, the IPv4 loopback IP and port %d is used. If\n", OSMO_CC_DEFAULT_PORT);
- printf("this port is already in use, the first free higher port is used.\n\n");
-
- printf("If no remote address is given, the local IP is used. If the local port is %d,\n", OSMO_CC_DEFAULT_PORT);
- printf("the remote port will be %d. If not, the remote port will be %d. This way it is\n", OSMO_CC_DEFAULT_PORT + 1, OSMO_CC_DEFAULT_PORT);
- printf("possible to link two interfaces without any IP configuration required.\n\n");
-
- printf("Use 'remote auto' to enable and 'remote none' to disable. This can be useful to\n");
- printf("override application default.\n\n");
-}
-
-static int osmo_cc_set_address(osmo_cc_endpoint_t *ep, const char *text)
-{
- const char **address_p, **host_p;
- uint16_t *port_p;
- int local = 0;
- int rc;
-
- if (!strncasecmp(text, "local", 5)) {
- text += 5;
- /* remove spaces after keyword */
- while (*text) {
- if (*text > 32)
- break;
- text++;
- }
- address_p = &ep->local_address;
- host_p = &ep->local_host;
- port_p = &ep->local_port;
- local = 1;
- } else if (!strncasecmp(text, "remote", 6)) {
- text += 6;
- /* remove spaces after keyword */
- while (*text) {
- if (*text > 32)
- break;
- text++;
- }
- if (!strcasecmp(text, "auto")) {
- PDEBUG(DCC, DEBUG_DEBUG, "setting automatic remote peer selection\n");
- ep->remote_auto = 1;
- return 0;
- }
- if (!strcasecmp(text, "none")) {
- PDEBUG(DCC, DEBUG_DEBUG, "disable automatic remote peer selection\n");
- ep->remote_auto = 0;
- return 0;
- }
- ep->remote_auto = 0;
- address_p = &ep->remote_address;
- host_p = &ep->remote_host;
- port_p = &ep->remote_port;
- } else {
- PDEBUG(DCC, DEBUG_ERROR, "Invalid local or remote address definition '%s'\n", text);
- return -EINVAL;
- }
-
- if (*address_p) {
- free((char *)*address_p);
- *address_p = NULL;
- }
- if (*host_p) {
- free((char *)*host_p);
- *host_p = NULL;
- }
- rc = split_address(text, host_p, port_p);
- if (rc < 0) {
- /* unset, so that this is not treated with free() */
- *host_p = NULL;
- return rc;
- }
- *address_p = strdup(text);
- *host_p = strdup(*host_p);
-
- if (local) {
- enum osmo_cc_session_addrtype addrtype;
- addrtype = osmo_cc_address_type(*host_p);
- if (addrtype == osmo_cc_session_addrtype_unknown) {
- PDEBUG(DCC, DEBUG_ERROR, "Given local address '%s' is invalid.\n", *host_p);
- return -EINVAL;
- }
- osmo_cc_set_local_peer(&ep->session_config, osmo_cc_session_nettype_inet, addrtype, *host_p);
- return 0;
- }
-
- return 0;
-}
-
-static void osmo_cc_help_rtp(void)
-{
- printf("RTP options:\n\n");
-
- printf("rtp-peer <IPv4 address>\n");
- printf("rtp-peer <IPv6 address>\n");
- printf("rtp-ports <first> <last>\n\n");
-
- printf("These options can be used to alter the local IP and port range for RTP traffic.\n");
- printf("By default the local peer is used, which is loopback by default. To connect\n");
- printf("interfaces, between machines, local machine's IP must be given.\n\n");
-}
-
-static int osmo_cc_set_rtp(osmo_cc_endpoint_t *ep, const char *text)
-{
- int peer = 0, ports = 0;
-
- if (!strncasecmp(text, "rtp-peer", 8)) {
- text += 8;
- peer = 1;
- } else if (!strncasecmp(text, "rtp-ports", 9)) {
- text += 9;
- ports = 1;
- } else {
- PDEBUG(DCC, DEBUG_ERROR, "Invalid RTP definition '%s'\n", text);
- return -EINVAL;
- }
-
- /* remove spaces after keyword */
- while (*text) {
- if (*text > 32)
- break;
- text++;
- }
-
- if (peer) {
- enum osmo_cc_session_addrtype addrtype;
- addrtype = osmo_cc_address_type(text);
- if (addrtype == osmo_cc_session_addrtype_unknown) {
- PDEBUG(DCC, DEBUG_ERROR, "Given RTP address '%s' is invalid.\n", text);
- return -EINVAL;
- }
- osmo_cc_set_local_peer(&ep->session_config, osmo_cc_session_nettype_inet, addrtype, text);
- return 0;
- }
-
- if (ports) {
- int from = 0, to = 0;
-
- /* from port */
- while (*text > ' ') {
- if (*text < '0' || *text > '9') {
- PDEBUG(DCC, DEBUG_ERROR, "Given 'from' port in '%s' is invalid.\n", text);
- return -EINVAL;
- }
- from = from * 10 + *text - '0';
- text++;
- }
-
- /* remove spaces after keyword */
- while (*text) {
- if (*text > 32)
- break;
- text++;
- }
-
- /* to port */
- while (*text > ' ') {
- if (*text < '0' || *text > '9') {
- PDEBUG(DCC, DEBUG_ERROR, "Given 'to' port in '%s' is invalid.\n", text);
- return -EINVAL;
- }
- to = to * 10 + *text - '0';
- text++;
- }
-
- osmo_cc_set_rtp_ports(&ep->session_config, from, to);
- return 0;
- }
-
- return -EINVAL;
-}
-
-void osmo_cc_help(void)
-{
- osmo_cc_help_name();
- osmo_cc_help_address();
- osmo_cc_help_rtp();
- osmo_cc_help_screen();
-}
-
-/* create a new endpoint instance */
-int osmo_cc_new(osmo_cc_endpoint_t *ep, const char *version, const char *name, uint8_t serving_location, void (*ll_msg_cb)(osmo_cc_endpoint_t *ep, uint32_t callref, osmo_cc_msg_t *msg), void (*ul_msg_cb)(osmo_cc_call_t *call, osmo_cc_msg_t *msg), void *priv, int argc, const char *argv[])
-{
- osmo_cc_endpoint_t **epp;
- int rc;
- int i;
-
- PDEBUG(DCC, DEBUG_DEBUG, "Creating new endpoint instance.\n");
-
- if (!!strcmp(version, OSMO_CC_VERSION)) {
- PDEBUG(DCC, DEBUG_ERROR, "Application was compiled for different Osmo-CC version.\n");
- return OSMO_CC_RC_VERSION_MISMATCH;
- }
-
- memset(ep, 0, sizeof(*ep));
-
- /* attach to list */
- epp = &osmo_cc_endpoint_list;
- while (*epp)
- epp = &((*epp)->next);
- *epp = ep;
-
- if (name)
- ep->local_name = strdup(name);
- ep->ll_msg_cb = ll_msg_cb;
- ep->ul_msg_cb = ul_msg_cb;
- ep->serving_location = serving_location;
- ep->priv = priv;
-
- osmo_cc_set_local_peer(&ep->session_config, osmo_cc_session_nettype_inet, osmo_cc_session_addrtype_ipv4, "127.0.0.1");
- osmo_cc_set_rtp_ports(&ep->session_config, 16384, 32767);
-
- /* apply args */
- for (i = 0; i < argc; i++) {
- if (!strncasecmp(argv[i], "name", 4)) {
- rc = osmo_cc_set_name(ep, argv[i]);
- if (rc < 0) {
- return rc;
- }
- } else
- if (!strncasecmp(argv[i], "local", 5)) {
- rc = osmo_cc_set_address(ep, argv[i]);
- if (rc < 0) {
- return rc;
- }
- } else
- if (!strncasecmp(argv[i], "remote", 6)) {
- rc = osmo_cc_set_address(ep, argv[i]);
- if (rc < 0) {
- return rc;
- }
- } else
- if (!strncasecmp(argv[i], "rtp", 3)) {
- rc = osmo_cc_set_rtp(ep, argv[i]);
- if (rc < 0) {
- return rc;
- }
- } else
- if (!strncasecmp(argv[i], "screen", 6)) {
- rc = osmo_cc_add_screen(ep, argv[i]);
- if (rc < 0) {
- return rc;
- }
- } else {
- PDEBUG(DCC, DEBUG_ERROR, "Unknown osmo-cc argument \"%s\"\n", argv[i]);
- return -EINVAL;
- }
- }
-
- /* open socket */
- if (!ul_msg_cb) {
- char address[256];
- const char *host;
- uint16_t port;
- enum osmo_cc_session_addrtype addrtype;
-
- host = ep->local_host;
- port = ep->local_port;
- if (!host) {
- host = "127.0.0.1";
- PDEBUG(DCC, DEBUG_DEBUG, "No local peer set, using default \"%s\"\n", host);
- }
- rc = osmo_cc_open_socket(&ep->os, host, port, ep, osmo_cc_ul_msg, serving_location);
- if (rc < 0) {
- return rc;
- }
- port = rc;
- if (!ep->local_host) {
- ep->local_host = strdup(host);
- /* create address string */
- addrtype = osmo_cc_address_type(host);
- if (addrtype == osmo_cc_session_addrtype_ipv6)
- sprintf(address, "[%s]:%d", host, port);
- else
- sprintf(address, "%s:%d", host, port);
- ep->local_address = strdup(address);
- }
- ep->local_port = port;
- /* auto configure */
- if (ep->remote_auto) {
- free((char *)ep->remote_host);
- ep->remote_host = strdup(ep->local_host);
- PDEBUG(DCC, DEBUG_DEBUG, "Remote peer set to auto, using local peer's host \"%s\" for remote peer.\n", ep->remote_host);
- if (rc == OSMO_CC_DEFAULT_PORT)
- ep->remote_port = OSMO_CC_DEFAULT_PORT + 1;
- else
- ep->remote_port = OSMO_CC_DEFAULT_PORT;
- PDEBUG(DCC, DEBUG_DEBUG, " -> Using remote port %d.\n", ep->remote_port);
- /* create address string */
- free((char *)ep->remote_address);
- addrtype = osmo_cc_address_type(ep->remote_host);
- if (addrtype == osmo_cc_session_addrtype_ipv6)
- sprintf(address, "[%s]:%d", ep->remote_host, ep->remote_port);
- else
- sprintf(address, "%s:%d", ep->remote_host, ep->remote_port);
- ep->remote_address = strdup(address);
- }
- /* attach to remote host */
- timer_init(&ep->attach_timer, send_attach_ind, ep);
- if (ep->remote_host) {
- send_attach_ind(&ep->attach_timer);
- }
- }
-
- return 0;
-}
-
-/* destroy an endpoint instance */
-void osmo_cc_delete(osmo_cc_endpoint_t *ep)
-{
- osmo_cc_endpoint_t **epp;
-
- PDEBUG(DCC, DEBUG_DEBUG, "Destroying endpoint instance.\n");
-
- /* detach from list >*/
- epp = &osmo_cc_endpoint_list;
- while (*epp && *epp != ep)
- epp = &((*epp)->next);
- if (*epp)
- *epp = ep->next;
-
- /* remove timer */
- timer_exit(&ep->attach_timer);
-
- /* flush screen lists */
- osmo_cc_flush_screen(ep->screen_calling_in);
- osmo_cc_flush_screen(ep->screen_called_in);
- osmo_cc_flush_screen(ep->screen_calling_out);
- osmo_cc_flush_screen(ep->screen_called_out);
-
- /* free local and remote peer */
- free((char *)ep->local_name);
- free((char *)ep->local_address);
- free((char *)ep->local_host);
- free((char *)ep->remote_address);
- free((char *)ep->remote_host);
-
- /* destroying all child callesses (calls) */
- while(ep->call_list)
- call_delete(ep->call_list);
-
- /* flush message queue */
- while(ep->ll_queue) {
- osmo_cc_msg_t *msg = osmo_cc_msg_list_dequeue(&ep->ll_queue, NULL);
- osmo_cc_free_msg(msg);
- }
-
- /* remove socket */
- osmo_cc_close_socket(&ep->os);
-
- memset(ep, 0, sizeof(*ep));
-}
-
-/* create new call instance */
-osmo_cc_call_t *osmo_cc_call_new(osmo_cc_endpoint_t *ep)
-{
- return call_new(ep, osmo_cc_new_callref());
-}
-
-/* destroy call instance */
-void osmo_cc_call_delete(osmo_cc_call_t *call)
-{
- call_delete(call);
-}
-
-/* check valid IP and return address type (protocol) */
-enum osmo_cc_session_addrtype osmo_cc_address_type(const char *address)
-{
- struct sockaddr_storage sa;
- int rc;
-
- rc = inet_pton(AF_INET, address, &sa);
- if (rc > 0)
- return osmo_cc_session_addrtype_ipv4;
- rc = inet_pton(AF_INET6, address, &sa);
- if (rc > 0)
- return osmo_cc_session_addrtype_ipv6;
-
- return osmo_cc_session_addrtype_unknown;
-}
-
-/* get host from address */
-const char *osmo_cc_host_of_address(const char *address)
-{
- static char host[256];
- char *p;
-
- if (strlen(address) >= sizeof(host)) {
- PDEBUG(DCC, DEBUG_ERROR, "String way too long!\n");
- return NULL;
- }
-
- if (address[0] == '[' && (p = strchr(address, ']'))) {
- memcpy(host, address + 1, p - address - 1);
- host[p - address - 1] = '\0';
- return host;
- }
-
- strcpy(host, address);
- if ((p = strchr(host, ':')))
- *p = '\0';
-
- return host;
-}
-
-/* get port from address */
-const char *osmo_cc_port_of_address(const char *address)
-{
- const char *p;
- int i;
-
- if (address[0] == '[' && (p = strchr(address, ']')))
- address = p + 1;
-
- if (!(p = strchr(address, ':')))
- return NULL;
- p++;
-
- /* check for zero */
- if (p[0] == '0')
- return NULL;
-
- /* check for digits */
- for (i = 0; i < (int)strlen(p); i++) {
- if (p[i] < '0' || p[i] > '9')
- return NULL;
- }
-
- /* check for magnitude */
- if (atoi(p) > 65535)
- return NULL;
-
- return p;
-}
-
diff --git a/src/libosmocc/endpoint.h b/src/libosmocc/endpoint.h
deleted file mode 100644
index 4425532..0000000
--- a/src/libosmocc/endpoint.h
+++ /dev/null
@@ -1,131 +0,0 @@
-#ifndef OSMO_CC_ENDPOINT_H
-#define OSMO_CC_ENDPOINT_H
-
-#include "message.h"
-#include "socket.h"
-#include "cause.h"
-
-/* special osmo-cc error codes */
-#define OSMO_CC_RC_SEE_ERRNO -1
-#define OSMO_CC_RC_VERSION_MISMATCH 1
-
-#define OSMO_CC_ATTACH_TIMER 2
-
-/* call control state */
-enum osmo_cc_state {
- OSMO_CC_STATE_IDLE = 0,
- /* call states */
- OSMO_CC_STATE_INIT_OUT, /* outgoing CC-SETUP-REQ sent */
- OSMO_CC_STATE_INIT_IN, /* incoming CC-SETUP-IND received */
- OSMO_CC_STATE_OVERLAP_OUT, /* received CC-SETUP-ACK-IND on outgoing call */
- OSMO_CC_STATE_OVERLAP_IN, /* sent CC-SETUP-ACK-REQ on incoming call */
- OSMO_CC_STATE_PROCEEDING_OUT, /* received CC-PROC-IND on outgoing call */
- OSMO_CC_STATE_PROCEEDING_IN, /* sent CC-PROC-REQ on incoming call */
- OSMO_CC_STATE_ALERTING_OUT, /* received CC-ALERT-IND on outgoing call */
- OSMO_CC_STATE_ALERTING_IN, /* sent CC-ALERT-REQ on incoming call */
- OSMO_CC_STATE_CONNECTING_OUT, /* received CC-SETUP-CNF on outgoing call */
- OSMO_CC_STATE_CONNECTING_IN, /* sent CC-SETUP-RSP on incoming call */
- OSMO_CC_STATE_ACTIVE, /* received or sent CC-SETUP-COMPL-* */
- OSMO_CC_STATE_DISCONNECTING_OUT, /* sent CC-DISC-REQ */
- OSMO_CC_STATE_DISCONNECTING_IN, /* received CC-DISC-IND */
- OSMO_CC_STATE_DISC_COLLISION, /* received CC-DISC-IND after sending CC-DISC_REQ */
- OSMO_CC_STATE_RELEASING_OUT, /* sent CC-REL-REQ */
- /* attachment states */
- OSMO_CC_STATE_ATTACH_SENT, /* outgoing CC-ATT-REQ sent to socket */
- OSMO_CC_STATE_ATTACH_OUT, /* received CC-ATT-RSP on outgoing socket */
- OSMO_CC_STATE_ATTACH_WAIT, /* wait for outgoing attachment after failure */
- OSMO_CC_STATE_ATTACH_IN, /* incoming CC-ATT-REQ received from socket*/
-};
-
-/* sample type */
-typedef int16_t osmo_cc_sample_t;
-
-#define OSMO_CC_SAMPLE_MILLIWATT 23170 /* peak sine at -3 dB of full sample range */
-#define OSMO_CC_SAMPLE_SPEECH 3672 /* peak speech at -16 dB of milliwatt */
-#define OSMO_CC_SAMPLE_MIN -32768 /* lowest level */
-#define OSMO_CC_SAMPLE_MAX 32767 /* highest level */
-
-#include "session.h"
-
-struct osmo_cc_call;
-
-typedef struct osmo_cc_screen_list {
- struct osmo_cc_screen_list *next;
- int has_from_type;
- uint8_t from_type;
- int has_from_present;
- uint8_t from_present;
- char from[128];
- int has_to_type;
- uint8_t to_type;
- int has_to_present;
- uint8_t to_present;
- char to[128];
-} osmo_cc_screen_list_t;
-
-/* endpoint instance */
-typedef struct osmo_cc_endpoint {
- struct osmo_cc_endpoint *next;
- void *priv;
- void (*ll_msg_cb)(struct osmo_cc_endpoint *ep, uint32_t callref, osmo_cc_msg_t *msg);
- void (*ul_msg_cb)(struct osmo_cc_call *call, osmo_cc_msg_t *msg);
- osmo_cc_msg_list_t *ll_queue; /* messages towards lower layer */
- struct osmo_cc_call *call_list;
- const char *local_name; /* name of interface */
- const char *local_address; /* host+port */
- const char *local_host;
- uint16_t local_port;
- const char *remote_address; /* host+port */
- const char *remote_host;
- uint16_t remote_port;
- uint8_t serving_location;
- osmo_cc_socket_t os;
- osmo_cc_screen_list_t *screen_calling_in;
- osmo_cc_screen_list_t *screen_called_in;
- osmo_cc_screen_list_t *screen_calling_out;
- osmo_cc_screen_list_t *screen_called_out;
- int remote_auto; /* automatic remote address */
- struct timer attach_timer; /* timer to retry attachment */
- osmo_cc_session_config_t session_config; /* SDP/RTP default configuration */
-} osmo_cc_endpoint_t;
-
-extern osmo_cc_endpoint_t *osmo_cc_endpoint_list;
-
-/* call process */
-typedef struct osmo_cc_call {
- struct osmo_cc_call *next;
- osmo_cc_endpoint_t *ep;
- enum osmo_cc_state state;
- int lower_layer_released; /* when lower layer sent release, while upper layer gets a disconnect */
- int upper_layer_released; /* when upper layer sent release, while lower layer gets a disconnect */
- uint32_t callref;
- osmo_cc_msg_list_t *sock_queue; /* messages from socket */
- const char *attached_host; /* host and port from remote peer that attached to us */
- uint16_t attached_port;
- const char *attached_name; /* interface name from remote peer that attached to us */
-} osmo_cc_call_t;
-
-/* returns 0 if ok
- * returns <0 for error as indicated
- * returns >=1 to indicate osmo-cc error code
- */
-
-void osmo_cc_help(void);
-int osmo_cc_new(osmo_cc_endpoint_t *ep, const char *version, const char *name, uint8_t serving_location, void (*ll_msg_cb)(osmo_cc_endpoint_t *ep, uint32_t callref, osmo_cc_msg_t *msg), void (*ul_msg_cb)(osmo_cc_call_t *call, osmo_cc_msg_t *msg), void *priv, int argc, const char *argv[]);
-void osmo_cc_delete(struct osmo_cc_endpoint *ep);
-int osmo_cc_handle(void);
-osmo_cc_call_t *osmo_cc_call_by_callref(osmo_cc_endpoint_t *ep, uint32_t callref);
-osmo_cc_call_t *osmo_cc_get_attached_interface(osmo_cc_endpoint_t *ep, const char *interface);
-void osmo_cc_ll_msg(osmo_cc_endpoint_t *ep, uint32_t callref, osmo_cc_msg_t *msg);
-void osmo_cc_ul_msg(void *priv, uint32_t callref, osmo_cc_msg_t *msg);
-osmo_cc_call_t *osmo_cc_call_new(osmo_cc_endpoint_t *ep);
-void osmo_cc_call_delete(struct osmo_cc_call *call);
-enum osmo_cc_session_addrtype osmo_cc_address_type(const char *address);
-const char *osmo_cc_host_of_address(const char *address);
-const char *osmo_cc_port_of_address(const char *address);
-
-#include "rtp.h"
-#include "sdp.h"
-#include "screen.h"
-
-#endif /* OSMO_CC_ENDPOINT_H */
diff --git a/src/libosmocc/helper.c b/src/libosmocc/helper.c
deleted file mode 100644
index 7700174..0000000
--- a/src/libosmocc/helper.c
+++ /dev/null
@@ -1,193 +0,0 @@
-/* Osmo-CC: helpers to simplify Osmo-CC usage
- *
- * (C) 2016 by Andreas Eversberg <jolly@eversberg.eu>
- * All Rights Reserved
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <sys/time.h>
-#include <inttypes.h>
-#include "../libtimer/timer.h"
-#include "../libdebug/debug.h"
-#include "endpoint.h"
-#include "helper.h"
-
-osmo_cc_session_t *osmo_cc_helper_audio_offer(osmo_cc_session_config_t *conf, void *priv, struct osmo_cc_helper_audio_codecs *codecs, void (*receiver)(struct osmo_cc_session_codec *codec, uint8_t marker, uint16_t sequence_number, uint32_t timestamp, uint32_t ssrc, uint8_t *data, int len), osmo_cc_msg_t *msg, int debug)
-{
- osmo_cc_session_t *session;
- osmo_cc_session_media_t *media;
- const char *sdp;
- int i;
-
- session = osmo_cc_new_session(conf, priv, NULL, NULL, NULL, 0, 0, NULL, NULL, debug);
- if (!session)
- return NULL;
-
- media = osmo_cc_add_media(session, 0, 0, NULL, osmo_cc_session_media_type_audio, 0, osmo_cc_session_media_proto_rtp, 1, 1, receiver, debug);
- osmo_cc_rtp_open(media);
-
- for (i = 0; codecs[i].payload_name; i++)
- osmo_cc_add_codec(media, codecs[i].payload_name, codecs[i].payload_rate, codecs[i].payload_channels, codecs[i].encoder, codecs[i].decoder, debug);
-
- sdp = osmo_cc_session_send_offer(session);
- osmo_cc_add_ie_sdp(msg, sdp);
-
- return session;
-}
-
-const char *osmo_cc_helper_audio_accept(osmo_cc_session_config_t *conf, void *priv, struct osmo_cc_helper_audio_codecs *codecs, void (*receiver)(struct osmo_cc_session_codec *codec, uint8_t marker, uint16_t sequence_number, uint32_t timestamp, uint32_t ssrc, uint8_t *data, int len), osmo_cc_msg_t *msg, osmo_cc_session_t **session_p, osmo_cc_session_codec_t **codec_p, int force_our_codec)
-{
- char offer_sdp[65536];
- const char *accept_sdp;
- osmo_cc_session_media_t *media, *selected_media;
- osmo_cc_session_codec_t *codec, *selected_codec, *telephone_event;
- int rc;
- int i, selected_codec_i, telephone_event_i;
-
- if (*session_p) {
- PDEBUG(DCC, DEBUG_ERROR, "Session already set, please fix!\n");
- abort();
- }
- if (*codec_p) {
- PDEBUG(DCC, DEBUG_ERROR, "Codec already set, please fix!\n");
- abort();
- }
-
- /* SDP IE */
- rc = osmo_cc_get_ie_sdp(msg, 0, offer_sdp, sizeof(offer_sdp));
- if (rc < 0) {
- PDEBUG(DCC, DEBUG_ERROR, "There is no SDP included in setup request.\n");
- return NULL;
- }
-
- *session_p = osmo_cc_session_receive_offer(conf, priv, offer_sdp);
- if (!*session_p) {
- PDEBUG(DCC, DEBUG_ERROR, "Failed to parse SDP.\n");
- return NULL;
- }
-
- selected_media = NULL;
- osmo_cc_session_for_each_media((*session_p)->media_list, media) {
- /* only audio */
- if (media->description.type != osmo_cc_session_media_type_audio)
- continue;
- selected_codec_i = -1;
- selected_codec = NULL;
- telephone_event_i = -1;
- telephone_event = NULL;
- osmo_cc_session_for_each_codec(media->codec_list, codec) {
- if (!!strcasecmp(codec->payload_name, "telephone-event")) {
- for (i = 0; codecs[i].payload_name; i++) {
- if (osmo_cc_session_if_codec(codec, codecs[i].payload_name, codecs[i].payload_rate, codecs[i].payload_channels)) {
- /* select the first matchting codec or the one we prefer */
- if (selected_codec_i < 0 || i < selected_codec_i) {
- selected_codec = codec;
- selected_codec_i = i;
- selected_media = media;
- }
- /* if we don't force our preferred codec, use the preferred one from the remote */
- if (!force_our_codec)
- break;
- }
- }
- } else {
- /* special case: add telephone-event, if supported */
- for (i = 0; codecs[i].payload_name; i++) {
- if (!!strcasecmp(codecs[i].payload_name, "telephone-event"))
- continue;
- telephone_event = codec;
- telephone_event_i = i;
- break;
- }
- }
- }
- /* codec is selected within this media, we are done */
- if (selected_codec)
- break;
- }
- if (!selected_codec) {
- PDEBUG(DCC, DEBUG_ERROR, "No codec found in setup message that we support.\n");
- osmo_cc_free_session(*session_p);
- *session_p = NULL;
- return NULL;
- }
- osmo_cc_session_accept_codec(selected_codec, codecs[selected_codec_i].encoder, codecs[selected_codec_i].decoder);
- if (telephone_event)
- osmo_cc_session_accept_codec(telephone_event, codecs[telephone_event_i].encoder, codecs[telephone_event_i].decoder);
- osmo_cc_session_accept_media(selected_media, 0, 0, NULL, 1, 1, receiver);
- osmo_cc_rtp_open(selected_media);
- osmo_cc_rtp_connect(selected_media);
- *codec_p = selected_codec;
-
- accept_sdp = osmo_cc_session_send_answer(*session_p);
- if (!accept_sdp) {
- osmo_cc_free_session(*session_p);
- *session_p = NULL;
- return NULL;
- }
-
- return accept_sdp;
-}
-
-int osmo_cc_helper_audio_negotiate(osmo_cc_msg_t *msg, osmo_cc_session_t **session_p, osmo_cc_session_codec_t **codec_p)
-{
- char sdp[65536];
- osmo_cc_session_media_t *media;
- int rc;
-
- if (!(*session_p)) {
- PDEBUG(DCC, DEBUG_ERROR, "Session not set, please fix!\n");
- abort();
- }
-
- /* once done, just ignore further messages that reply to setup */
- if (*codec_p)
- return 0;
-
- /* SDP IE */
- rc = osmo_cc_get_ie_sdp(msg, 0, sdp, sizeof(sdp));
- if (rc < 0)
- return 0; // no reply in this message
-
- rc = osmo_cc_session_receive_answer(*session_p, sdp);
- if (rc < 0)
- return rc;
-
- osmo_cc_session_for_each_media((*session_p)->media_list, media) {
- /* only audio */
- if (media->description.type != osmo_cc_session_media_type_audio)
- continue;
- /* select first codec, if one was accpeted */
- if (media->codec_list)
- *codec_p = media->codec_list;
- if (*codec_p) {
- osmo_cc_rtp_connect(media);
- /* no more media streams */
- break;
- }
- }
- if (!(*codec_p)) {
- PDEBUG(DCC, DEBUG_ERROR, "No codec found in setup reply message that we support.\n");
- return -EIO;
- }
-
- return 0;
-}
-
diff --git a/src/libosmocc/helper.h b/src/libosmocc/helper.h
deleted file mode 100644
index 9b18ac0..0000000
--- a/src/libosmocc/helper.h
+++ /dev/null
@@ -1,13 +0,0 @@
-
-struct osmo_cc_helper_audio_codecs {
- const char *payload_name;
- uint32_t payload_rate;
- int payload_channels;
- void (*encoder)(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void *priv);
- void (*decoder)(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void *priv);
-};
-
-osmo_cc_session_t *osmo_cc_helper_audio_offer(osmo_cc_session_config_t *conf, void *priv, struct osmo_cc_helper_audio_codecs *codecs, void (*receiver)(struct osmo_cc_session_codec *codec, uint8_t marker, uint16_t sequence_number, uint32_t timestamp, uint32_t ssrc, uint8_t *data, int len), osmo_cc_msg_t *msg, int debug);
-const char *osmo_cc_helper_audio_accept(osmo_cc_session_config_t *conf, void *priv, struct osmo_cc_helper_audio_codecs *codecs, void (*receiver)(struct osmo_cc_session_codec *codec, uint8_t marker, uint16_t sequence_number, uint32_t timestamp, uint32_t ssrc, uint8_t *data, int len), osmo_cc_msg_t *msg, osmo_cc_session_t **session_p, osmo_cc_session_codec_t **codec_p, int force_our_codec);
-int osmo_cc_helper_audio_negotiate(osmo_cc_msg_t *msg, osmo_cc_session_t **session_p, osmo_cc_session_codec_t **codec_p);
-
diff --git a/src/libosmocc/message.c b/src/libosmocc/message.c
deleted file mode 100644
index ab66a9f..0000000
--- a/src/libosmocc/message.c
+++ /dev/null
@@ -1,1291 +0,0 @@
-/* Osmo-CC: Message handling
- *
- * (C) 2016 by Andreas Eversberg <jolly@eversberg.eu>
- * All Rights Reserved
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <arpa/inet.h>
-#include "../libdebug/debug.h"
-#include "message.h"
-
-#define _OSMO_CC_VALUE2NAME(array) { \
- if (value < 0 || (size_t)value >= (sizeof(array) / sizeof(array[0])) || array[value] == NULL) \
- return "<unknown>"; \
- else \
- return array[value]; \
-}
-
-#define _OSMO_CC_NAME2VALUE(array) { \
- int value; \
- for (value = 0; (size_t)value < (sizeof(array) / sizeof(array[0])); value++) { \
- if (!strcasecmp(array[value], name)) \
- return value; \
- } \
- return -1; \
-}
-
-static const char *osmo_cc_msg_name[OSMO_CC_MSG_NUM] = {
- [OSMO_CC_MSG_SETUP_REQ] = "CC-SETUP-REQ",
- [OSMO_CC_MSG_SETUP_IND] = "CC-SETUP-IND",
- [OSMO_CC_MSG_REJ_REQ] = "CC-REJ-REQ",
- [OSMO_CC_MSG_REJ_IND] = "CC-REJ-IND",
- [OSMO_CC_MSG_SETUP_ACK_REQ] = "CC-SETUP-ACK-REQ",
- [OSMO_CC_MSG_SETUP_ACK_IND] = "CC-SETUP-ACK-IND",
- [OSMO_CC_MSG_PROC_REQ] = "CC-PROC-REQ",
- [OSMO_CC_MSG_PROC_IND] = "CC-PROC-IND",
- [OSMO_CC_MSG_ALERT_REQ] = "CC-ALERT-REQ",
- [OSMO_CC_MSG_ALERT_IND] = "CC-ALERT-IND",
- [OSMO_CC_MSG_SETUP_RSP] = "CC-SETUP-RSP",
- [OSMO_CC_MSG_SETUP_CNF] = "CC-SETUP-CNF",
- [OSMO_CC_MSG_SETUP_COMP_REQ] = "CC-SETUP-COMP-REQ",
- [OSMO_CC_MSG_SETUP_COMP_IND] = "CC-SETUP-COMP-IND",
- [OSMO_CC_MSG_DISC_REQ] = "CC-DISC-REQ",
- [OSMO_CC_MSG_DISC_IND] = "CC-DISC-IND",
- [OSMO_CC_MSG_REL_REQ] = "CC-REL-REQ",
- [OSMO_CC_MSG_REL_CNF] = "CC-REL-CNF",
- [OSMO_CC_MSG_REL_IND] = "CC-REL-IND",
- [OSMO_CC_MSG_PROGRESS_REQ] = "CC-PROGRESS-REQ",
- [OSMO_CC_MSG_PROGRESS_IND] = "CC-PROGRESS-IND",
- [OSMO_CC_MSG_NOTIFY_REQ] = "CC-NOTIFY-REQ",
- [OSMO_CC_MSG_NOTIFY_IND] = "CC-NOTIFY-IND",
- [OSMO_CC_MSG_INFO_REQ] = "CC-INFO-REQ",
- [OSMO_CC_MSG_INFO_IND] = "CC-INFO-IND",
- [OSMO_CC_MSG_ATTACH_REQ] = "CC-ATTACH-REQ",
- [OSMO_CC_MSG_ATTACH_IND] = "CC-ATTACH-IND",
- [OSMO_CC_MSG_ATTACH_RSP] = "CC-ATTACH-RSP",
- [OSMO_CC_MSG_ATTACH_CNF] = "CC-ATTACH-CNF",
-};
-
-const char *osmo_cc_msg_value2name(int value) _OSMO_CC_VALUE2NAME(osmo_cc_msg_name)
-int osmo_cc_msg_name2value(const char *name) _OSMO_CC_NAME2VALUE(osmo_cc_msg_name)
-
-static const char *osmo_cc_ie_name[OSMO_CC_IE_NUM] = {
- [OSMO_CC_IE_CALLED] = "IE_CALLED",
- [OSMO_CC_IE_CALLED_SUB] = "IE_CALLED_SUB",
- [OSMO_CC_IE_CALLED_NAME] = "IE_CALLED_NAME",
- [OSMO_CC_IE_CALLED_INTERFACE] = "IE_CALLED_INTERFACE",
- [OSMO_CC_IE_DTMF] = "IE_DTMF",
- [OSMO_CC_IE_KEYPAD] = "IE_KEYPAD",
- [OSMO_CC_IE_COMPLETE] = "IE_COMPLETE",
- [OSMO_CC_IE_CALLING] = "IE_CALLING",
- [OSMO_CC_IE_CALLING_SUB] = "IE_CALLING_SUB",
- [OSMO_CC_IE_CALLING_NAME] = "IE_CALLING_NAME",
- [OSMO_CC_IE_CALLING_INTERFACE] = "IE_CALLING_INTERFACE",
- [OSMO_CC_IE_CALLING_NETWORK] = "IE_CALLING_NETWORK",
- [OSMO_CC_IE_REDIR] = "IE_REDIR",
- [OSMO_CC_IE_PROGRESS] = "IE_PROGRESS",
- [OSMO_CC_IE_NOTIFY] = "IE_NOTIFY",
- [OSMO_CC_IE_DISPLAY] = "IE_DISPLAY",
- [OSMO_CC_IE_CAUSE] = "IE_CAUSE",
- [OSMO_CC_IE_BEARER] = "IE_BEARER",
- [OSMO_CC_IE_SDP] = "IE_SDP",
- [OSMO_CC_IE_SOCKET_ADDRESS] = "IE_SOCKET_ADDRESS",
- [OSMO_CC_IE_PRIVATE] = "IE_PRIVATE",
-};
-
-const char *osmo_cc_ie_value2name(int value) _OSMO_CC_VALUE2NAME(osmo_cc_ie_name)
-int osmo_cc_ie_name2value(const char *name) _OSMO_CC_NAME2VALUE(osmo_cc_ie_name)
-
-static const char *osmo_cc_type_name[OSMO_CC_TYPE_NUM] = {
- [OSMO_CC_TYPE_UNKNOWN] = "unknown",
- [OSMO_CC_TYPE_INTERNATIONAL] = "international",
- [OSMO_CC_TYPE_NATIONAL] = "national",
- [OSMO_CC_TYPE_NETWORK] = "network",
- [OSMO_CC_TYPE_SUBSCRIBER] = "subscriber",
- [OSMO_CC_TYPE_ABBREVIATED] = "abbreviated",
- [OSMO_CC_TYPE_RESERVED] = "reserved",
-};
-
-const char *osmo_cc_type_value2name(int value) _OSMO_CC_VALUE2NAME(osmo_cc_type_name)
-int osmo_cc_type_name2value(const char *name) _OSMO_CC_NAME2VALUE(osmo_cc_type_name)
-
-static const char *osmo_cc_plan_name[OSMO_CC_PLAN_NUM] = {
- [OSMO_CC_PLAN_UNKNOWN] = "unknown",
- [OSMO_CC_PLAN_TELEPHONY] = "telephony",
- [OSMO_CC_PLAN_DATA] = "data",
- [OSMO_CC_PLAN_TTY] = "tty",
- [OSMO_CC_PLAN_NATIONAL_STANDARD] = "national standard",
- [OSMO_CC_PLAN_PRIVATE] = "private",
- [OSMO_CC_PLAN_RESERVED] = "reserved",
-};
-
-const char *osmo_cc_plan_value2name(int value) _OSMO_CC_VALUE2NAME(osmo_cc_plan_name)
-int osmo_cc_plan_name2value(const char *name) _OSMO_CC_NAME2VALUE(osmo_cc_plan_name)
-
-static const char *osmo_cc_present_name[OSMO_CC_PRESENT_NUM] = {
- [OSMO_CC_PRESENT_ALLOWED] = "allowed",
- [OSMO_CC_PRESENT_RESTRICTED] = "restricted",
- [OSMO_CC_PRESENT_NOT_AVAIL] = "not available",
- [OSMO_CC_PRESENT_RESERVED] = "reserved",
-};
-
-const char *osmo_cc_present_value2name(int value) _OSMO_CC_VALUE2NAME(osmo_cc_present_name)
-int osmo_cc_present_name2value(const char *name) _OSMO_CC_NAME2VALUE(osmo_cc_present_name)
-
-static const char *osmo_cc_screen_name[OSMO_CC_SCREEN_NUM] = {
- [OSMO_CC_SCREEN_USER_UNSCREENED] = "unscreened",
- [OSMO_CC_SCREEN_USER_VERIFIED_PASSED] = "user provided and passed",
- [OSMO_CC_SCREEN_USER_VERIFIED_FAILED] = "user provided an failed",
- [OSMO_CC_SCREEN_NETWORK] = "network provided",
-};
-
-const char *osmo_cc_screen_value2name(int value) _OSMO_CC_VALUE2NAME(osmo_cc_screen_name)
-int osmo_cc_screen_name2value(const char *name) _OSMO_CC_NAME2VALUE(osmo_cc_screen_name)
-
-static const char *osmo_cc_redir_reason_name[OSMO_CC_REDIR_REASON_NUM] = {
- [OSMO_CC_REDIR_REASON_UNKNOWN] = "unknown",
- [OSMO_CC_REDIR_REASON_CFB] = "call forward busy",
- [OSMO_CC_REDIR_REASON_CFNR] = "call forward no response",
- [OSMO_CC_REDIR_REASON_CD] = "call deflect",
- [OSMO_CC_REDIR_REASON_CF_OUTOFORDER] = "call forward out of order",
- [OSMO_CC_REDIR_REASON_CF_BY_DTE] = "call froward by dte",
- [OSMO_CC_REDIR_REASON_CFU] = "call forward unconditional",
-};
-
-const char *osmo_cc_redir_reason_value2name(int value) _OSMO_CC_VALUE2NAME(osmo_cc_redir_reason_name)
-int osmo_cc_redir_reason_name2value(const char *name) _OSMO_CC_NAME2VALUE(osmo_cc_redir_reason_name)
-
-static const char *osmo_cc_notify_name[OSMO_CC_NOTIFY_NUM] = {
- [OSMO_CC_NOTIFY_USER_SUSPENDED] = "user suspended",
- [OSMO_CC_NOTIFY_USER_RESUMED] = "user resumed",
- [OSMO_CC_NOTIFY_BEARER_SERVICE_CHANGE] = "bearer service change",
- [OSMO_CC_NOTIFY_CALL_COMPLETION_DELAY] = "call completion delay",
- [OSMO_CC_NOTIFY_CONFERENCE_ESTABLISHED] = "conference established",
- [OSMO_CC_NOTIFY_CONFERENCE_DISCONNECTED] = "conference disconnected",
- [OSMO_CC_NOTIFY_OTHER_PARTY_ADDED] = "ohter party added",
- [OSMO_CC_NOTIFY_ISOLATED] = "isolated",
- [OSMO_CC_NOTIFY_REATTACHED] = "reattached",
- [OSMO_CC_NOTIFY_OTHER_PARTY_ISOLATED] = "ohter party isolated",
- [OSMO_CC_NOTIFY_OTHER_PARTY_REATTACHED] = "ohter party reattached",
- [OSMO_CC_NOTIFY_OTHER_PARTY_SPLIT] = "other party split",
- [OSMO_CC_NOTIFY_OTHER_PARTY_DISCONNECTED] = "other party disconnected",
- [OSMO_CC_NOTIFY_CONFERENCE_FLOATING] = "confernce floating",
- [OSMO_CC_NOTIFY_CONFERENCE_DISC_PREEMPT] = "confernce disconnect preemption",
- [OSMO_CC_NOTIFY_CONFERENCE_FLOATING_SUP] = "conference floating sup",
- [OSMO_CC_NOTIFY_CALL_IS_A_WAITING_CALL] = "call is a waiting call",
- [OSMO_CC_NOTIFY_DIVERSION_ACTIVATED] = "diversion activated",
- [OSMO_CC_NOTIFY_RESERVED_CT_1] = "reserved CT 1",
- [OSMO_CC_NOTIFY_RESERVED_CT_2] = "reserved CT 2",
- [OSMO_CC_NOTIFY_REVERSE_CHARGING] = "reverse charging",
- [OSMO_CC_NOTIFY_REMOTE_HOLD] = "remote hold",
- [OSMO_CC_NOTIFY_REMOTE_RETRIEVAL] = "remote retrieval",
- [OSMO_CC_NOTIFY_CALL_IS_DIVERTING] = "call is diverting",
-};
-
-const char *osmo_cc_notify_value2name(int value) _OSMO_CC_VALUE2NAME(osmo_cc_notify_name)
-int osmo_cc_notify_name2value(const char *name) _OSMO_CC_NAME2VALUE(osmo_cc_notify_name)
-
-static const char *osmo_cc_coding_name[OSMO_CC_CODING_NUM] = {
- [OSMO_CC_CODING_ITU_T] = "ITU-T",
- [OSMO_CC_CODING_ISO_IEC] = "ISO/IEC",
- [OSMO_CC_CODING_NATIONAL] = "national",
- [OSMO_CC_CODING_STANDARD_SPECIFIC] = "standard specific",
-};
-
-const char *osmo_cc_coding_value2name(int value) _OSMO_CC_VALUE2NAME(osmo_cc_coding_name)
-int osmo_cc_coding_name2value(const char *name) _OSMO_CC_NAME2VALUE(osmo_cc_coding_name)
-
-static const char *osmo_cc_isdn_cause_name[OSMO_CC_ISDN_CAUSE_NUM] = {
- [0] = "unset",
- [OSMO_CC_ISDN_CAUSE_UNASSIGNED_NR] = "unsassigned number",
- [OSMO_CC_ISDN_CAUSE_NO_ROUTE_TRANSIT] = "no route to transit network",
- [OSMO_CC_ISDN_CAUSE_NO_ROUTE] = "no route",
- [OSMO_CC_ISDN_CAUSE_CHAN_UNACCEPT] = "channel unacceptable",
- [OSMO_CC_ISDN_CAUSE_OP_DET_BARRING] = "detected barring",
- [OSMO_CC_ISDN_CAUSE_NORM_CALL_CLEAR] = "normal call clearing",
- [OSMO_CC_ISDN_CAUSE_USER_BUSY] = "user busy",
- [OSMO_CC_ISDN_CAUSE_USER_NOTRESPOND] = "user not responding",
- [OSMO_CC_ISDN_CAUSE_USER_ALERTING_NA] = "user does not answer",
- [OSMO_CC_ISDN_CAUSE_CALL_REJECTED] = "call rejected",
- [OSMO_CC_ISDN_CAUSE_NUMBER_CHANGED] = "number changed",
- [OSMO_CC_ISDN_CAUSE_PRE_EMPTION] = "pre-emption",
- [OSMO_CC_ISDN_CAUSE_NONSE_USER_CLR] = "non-selected user clearing",
- [OSMO_CC_ISDN_CAUSE_DEST_OOO] = "destination out-of-order",
- [OSMO_CC_ISDN_CAUSE_INV_NR_FORMAT] = "invalid number format",
- [OSMO_CC_ISDN_CAUSE_FACILITY_REJ] = "facility rejected",
- [OSMO_CC_ISDN_CAUSE_RESP_STATUS_INQ] = "response to status enquiery",
- [OSMO_CC_ISDN_CAUSE_NORMAL_UNSPEC] = "normal, uspecified",
- [OSMO_CC_ISDN_CAUSE_NO_CIRCUIT_CHAN] = "no circuit/channel available",
- [OSMO_CC_ISDN_CAUSE_NETWORK_OOO] = "network out of order",
- [OSMO_CC_ISDN_CAUSE_TEMP_FAILURE] = "temporary failure",
- [OSMO_CC_ISDN_CAUSE_SWITCH_CONG] = "switching equipment congested",
- [OSMO_CC_ISDN_CAUSE_ACC_INF_DISCARD] = "access information discarded",
- [OSMO_CC_ISDN_CAUSE_REQ_CHAN_UNAVAIL] = "requested circuit/channel unavailable",
- [OSMO_CC_ISDN_CAUSE_RESOURCE_UNAVAIL] = "resource unavailable",
- [OSMO_CC_ISDN_CAUSE_QOS_UNAVAIL] = "quality of service unavailable",
- [OSMO_CC_ISDN_CAUSE_REQ_FAC_NOT_SUBSC] = "requested facility not subscribed",
- [OSMO_CC_ISDN_CAUSE_INC_BARRED_CUG] = "inc barred in closed user group",
- [OSMO_CC_ISDN_CAUSE_BEARER_CAP_UNAUTH] = "bearer capability unauthorized",
- [OSMO_CC_ISDN_CAUSE_BEARER_CA_UNAVAIL] = "bearer capability not available",
- [OSMO_CC_ISDN_CAUSE_SERV_OPT_UNAVAIL] = "service or option not available",
- [OSMO_CC_ISDN_CAUSE_BEARERSERV_UNIMPL] = "bearer service unimplemented",
- [OSMO_CC_ISDN_CAUSE_ACM_GE_ACM_MAX] = "acm ge ach max",
- [OSMO_CC_ISDN_CAUSE_REQ_FAC_NOTIMPL] = "requrested facility not implemented",
- [OSMO_CC_ISDN_CAUSE_RESTR_BCAP_AVAIL] = "restricted bearer capabilitey available",
- [OSMO_CC_ISDN_CAUSE_SERV_OPT_UNIMPL] = "service or option unimplemented",
- [OSMO_CC_ISDN_CAUSE_INVAL_CALLREF] = "invalid call reference",
- [OSMO_CC_ISDN_CAUSE_USER_NOT_IN_CUG] = "user not in closed user group",
- [OSMO_CC_ISDN_CAUSE_INCOMPAT_DEST] = "incompatible destination",
- [OSMO_CC_ISDN_CAUSE_INVAL_TRANS_NET] = "invalid transit network",
- [OSMO_CC_ISDN_CAUSE_SEMANTIC_INCORR] = "semantically incorrect",
- [OSMO_CC_ISDN_CAUSE_INVAL_MAND_INF] = "invalid mandatory information",
- [OSMO_CC_ISDN_CAUSE_MSGTYPE_NOTEXIST] = "message type does not exist",
- [OSMO_CC_ISDN_CAUSE_MSGTYPE_INCOMPAT] = "message type incompatible",
- [OSMO_CC_ISDN_CAUSE_IE_NOTEXIST] = "informaton element does not exits",
- [OSMO_CC_ISDN_CAUSE_COND_IE_ERR] = "conditional information element error",
- [OSMO_CC_ISDN_CAUSE_MSG_INCOMP_STATE] = "message at incompatlible state",
- [OSMO_CC_ISDN_CAUSE_RECOVERY_TIMER] = "recovery on time expiery",
- [OSMO_CC_ISDN_CAUSE_PROTO_ERR] = "protocol error",
- [OSMO_CC_ISDN_CAUSE_INTERWORKING] = "interworking, unspecified",
-};
-
-const char *osmo_cc_isdn_cause_value2name(int value) _OSMO_CC_VALUE2NAME(osmo_cc_isdn_cause_name)
-int osmo_cc_isdn_cause_name2value(const char *name) _OSMO_CC_NAME2VALUE(osmo_cc_isdn_cause_name)
-
-static const char *osmo_cc_location_name[OSMO_CC_LOCATION_NUM] = {
- [OSMO_CC_LOCATION_USER] = "user",
- [OSMO_CC_LOCATION_PRIV_SERV_LOC_USER] = "private network serving local user",
- [OSMO_CC_LOCATION_PUB_SERV_LOC_USER] = "public network serving local user",
- [OSMO_CC_LOCATION_TRANSIT] = "transit network",
- [OSMO_CC_LOCATION_PUB_SERV_REM_USER] = "public network serving remote user",
- [OSMO_CC_LOCATION_PRIV_SERV_REM_USER] = "private network serving remote user",
- [OSMO_CC_LOCATION_BEYOND_INTERWORKING] = "beyond interworking",
-};
-
-const char *osmo_cc_location_value2name(int value) _OSMO_CC_VALUE2NAME(osmo_cc_location_name)
-int osmo_cc_location_name2value(const char *name) _OSMO_CC_NAME2VALUE(osmo_cc_location_name)
-
-static const char *osmo_cc_progress_name[OSMO_CC_PROGRESS_NUM] = {
- [OSMO_CC_PROGRESS_NOT_END_TO_END_ISDN] = "not end-to-end ISDN",
- [OSMO_CC_PROGRESS_DEST_NOT_ISDN] = "destination not ISDN",
- [OSMO_CC_PROGRESS_ORIG_NOT_ISDN] = "originator not ISDN",
- [OSMO_CC_PROGRESS_RETURN_TO_ISDN] = "return to ISDN",
- [OSMO_CC_PROGRESS_INTERWORKING] = "interworking",
- [OSMO_CC_PROGRESS_INBAND_INFO_AVAILABLE] = "inmand information available (audio)",
-};
-
-const char *osmo_cc_progress_value2name(int value) _OSMO_CC_VALUE2NAME(osmo_cc_progress_name)
-int osmo_cc_progress_name2value(const char *name) _OSMO_CC_NAME2VALUE(osmo_cc_progress_name)
-
-static const char *osmo_cc_capability_name[OSMO_CC_CAPABILITY_NUM] = {
- [OSMO_CC_CAPABILITY_SPEECH] = "speech",
- [OSMO_CC_CAPABILITY_DATA] = "data",
- [OSMO_CC_CAPABILITY_DATA_RESTRICTED] = "data restricted",
- [OSMO_CC_CAPABILITY_AUDIO] = "audio",
- [OSMO_CC_CAPABILITY_DATA_WITH_TONES] = "data with tones",
- [OSMO_CC_CAPABILITY_VIDEO] = "video",
-};
-
-const char *osmo_cc_capability_value2name(int value) _OSMO_CC_VALUE2NAME(osmo_cc_capability_name)
-int osmo_cc_capability_name2value(const char *name) _OSMO_CC_NAME2VALUE(osmo_cc_capability_name)
-
-static const char *osmo_cc_mode_name[OSMO_CC_MODE_NUM] = {
- [OSMO_CC_MODE_CIRCUIT] = "circuit",
- [OSMO_CC_MODE_PACKET] = "packet",
-};
-
-const char *osmo_cc_mode_value2name(int value) _OSMO_CC_VALUE2NAME(osmo_cc_mode_name)
-int osmo_cc_mode_name2value(const char *name) _OSMO_CC_NAME2VALUE(osmo_cc_mode_name)
-
-static const char *osmo_cc_dtmf_mode_name[OSMO_CC_DTMF_MODE_NUM] = {
- [OSMO_CC_DTMF_MODE_OFF] = "off",
- [OSMO_CC_DTMF_MODE_ON] = "on",
- [OSMO_CC_DTMF_MODE_DIGITS] = "digit",
-};
-
-const char *osmo_cc_dtmf_mode_value2name(int value) _OSMO_CC_VALUE2NAME(osmo_cc_dtmf_mode_name)
-int osmo_cc_dtmf_mode_name2value(const char *name) _OSMO_CC_NAME2VALUE(osmo_cc_dtmf_mode_name)
-
-static const char *osmo_cc_socket_cause_name[OSMO_CC_SOCKET_CAUSE_NUM] = {
- [0] = "unset",
- [OSMO_CC_SOCKET_CAUSE_VERSION_MISMATCH] = "version mismatch",
- [OSMO_CC_SOCKET_CAUSE_FAILED] = "socket failed",
- [OSMO_CC_SOCKET_CAUSE_BROKEN_PIPE] = "broken pipe",
- [OSMO_CC_SOCKET_CAUSE_TIMEOUT] = "keepalive timeout",
-};
-
-const char *osmo_cc_socket_cause_value2name(int value) _OSMO_CC_VALUE2NAME(osmo_cc_socket_cause_name)
-int osmo_cc_socket_cause_name2value(const char *name) _OSMO_CC_NAME2VALUE(osmo_cc_socket_cause_name)
-
-static const char *osmo_cc_network_name[OSMO_CC_NETWORK_NUM] = {
- [OSMO_CC_NETWORK_UNDEFINED] = "undefined",
- [OSMO_CC_NETWORK_ALSA_NONE] = "alsa",
- [OSMO_CC_NETWORK_POTS_NONE] = "pots",
- [OSMO_CC_NETWORK_ISDN_NONE] = "isdn",
- [OSMO_CC_NETWORK_SIP_NONE] = "sip",
- [OSMO_CC_NETWORK_GSM_IMSI] = "gsm-imsi",
- [OSMO_CC_NETWORK_GSM_IMEI] = "gsm-imei",
- [OSMO_CC_NETWORK_WEB_NONE] = "web",
- [OSMO_CC_NETWORK_DECT_NONE] = "decs",
- [OSMO_CC_NETWORK_BLUETOOTH_NONE] = "bluetooth",
- [OSMO_CC_NETWORK_SS5_NONE] = "ss5",
- [OSMO_CC_NETWORK_ANETZ_NONE] = "anetz",
- [OSMO_CC_NETWORK_BNETZ_MUENZ] = "bnetz",
- [OSMO_CC_NETWORK_CNETZ_NONE] = "cnetz",
- [OSMO_CC_NETWORK_NMT_NONE] = "nmt",
- [OSMO_CC_NETWORK_R2000_NONE] = "radiocom2000",
- [OSMO_CC_NETWORK_AMPS_ESN] = "amps",
- [OSMO_CC_NETWORK_MTS_NONE] = "mts",
- [OSMO_CC_NETWORK_IMTS_NONE] = "imts",
- [OSMO_CC_NETWORK_EUROSIGNAL_NONE] = "eurosignal",
- [OSMO_CC_NETWORK_JOLLYCOM_NONE] = "jollycom",
- [OSMO_CC_NETWORK_MPT1327_PSTN] = "mpt1327-pstn",
- [OSMO_CC_NETWORK_MPT1327_PBX] = "mpt1327-pbx",
-};
-
-const char *osmo_cc_network_value2name(int value) _OSMO_CC_VALUE2NAME(osmo_cc_network_name)
-int osmo_cc_network_name2value(const char *name) _OSMO_CC_NAME2VALUE(osmo_cc_network_name)
-
-/*
- *
- */
-
-static uint32_t new_callref = 0;
-
-uint32_t osmo_cc_new_callref(void)
-{
- return (++new_callref);
-}
-
-/* create message with maximum size */
-osmo_cc_msg_t *osmo_cc_new_msg(uint8_t msg_type)
-{
- osmo_cc_msg_t *msg;
-
- /* allocate message */
- msg = calloc(1, sizeof(*msg) + 65535);
- if (!msg) {
- PDEBUG(DCC, DEBUG_ERROR, "No memory\n");
- abort();
- }
- /* set message type and zero length */
- msg->type = msg_type;
- msg->length_networkorder = htons(0);
-
- return msg;
-}
-
-/* clone message */
-osmo_cc_msg_t *osmo_cc_clone_msg(osmo_cc_msg_t *msg)
-{
- osmo_cc_msg_t *new_msg;
-
- new_msg = osmo_cc_new_msg(msg->type);
- new_msg->length_networkorder = msg->length_networkorder;
- memcpy(new_msg->data, msg->data, ntohs(msg->length_networkorder));
-
- return new_msg;
-}
-
-osmo_cc_msg_t *osmo_cc_msg_list_dequeue(osmo_cc_msg_list_t **mlp, uint32_t *callref_p)
-{
- osmo_cc_msg_list_t *ml;
- osmo_cc_msg_t *msg;
-
- ml = *mlp;
- msg = ml->msg;
- if (callref_p)
- *callref_p = ml->callref;
- *mlp = ml->next;
- free(ml);
-
- return msg;
-}
-
-osmo_cc_msg_list_t *osmo_cc_msg_list_enqueue(osmo_cc_msg_list_t **mlp, osmo_cc_msg_t *msg, uint32_t callref)
-{
- osmo_cc_msg_list_t *ml;
-
- ml = calloc(1, sizeof(*ml));
- ml->msg = msg;
- ml->callref = callref;
- while (*mlp)
- mlp = &((*mlp)->next);
- *mlp = ml;
-
- return ml;
-}
-
-/* destroy message */
-void osmo_cc_free_msg(osmo_cc_msg_t *msg)
-{
- free(msg);
-}
-
-void osmo_cc_debug_ie(osmo_cc_msg_t *msg, int level)
-{
- uint16_t msg_len, len;
- uint8_t *p;
- osmo_cc_ie_t *ie;
- int rc;
- int ie_repeat[256];
- uint8_t type, plan, present, screen, coding, capability, mode, progress, reason, duration_ms, pause_ms, dtmf_mode, location, notify, isdn_cause, socket_cause;
- uint16_t sip_cause;
- uint32_t unique;
- char string[65536];
- int i;
-
- memset(ie_repeat, 0, sizeof(ie_repeat));
-
- msg_len = ntohs(msg->length_networkorder);
- p = msg->data;
-
- while (msg_len) {
- ie = (osmo_cc_ie_t *)p;
- /* check for minimum IE length */
- if (msg_len < sizeof(*ie)) {
- PDEBUG(DCC, level, "****** Rest of message is too short for an IE: value=%s\n", debug_hex(p, msg_len));
- return;
- }
- /* get actual IE length */
- len = ntohs(ie->length_networkorder);
- /* check if IE length does not exceed message */
- if (msg_len < sizeof(*ie) + len) {
- PDEBUG(DCC, level, "****** IE: type=0x%02x length=%d would exceed the rest length of message (%d bytes left)\n", ie->type, len, msg_len - (int)sizeof(*ie));
- return;
- }
- switch (ie->type) {
- case OSMO_CC_IE_CALLED:
- rc = osmo_cc_get_ie_called(msg, ie_repeat[ie->type], &type, &plan, string, sizeof(string));
- if (rc < 0)
- break;
- PDEBUG(DCC, level, " %s type=%d(%s) plan=%d(%s) number='%s'\n", osmo_cc_ie_value2name(ie->type), type, osmo_cc_type_value2name(type), plan, osmo_cc_plan_value2name(plan), string);
- break;
- case OSMO_CC_IE_CALLED_SUB:
- rc = osmo_cc_get_ie_called_sub(msg, ie_repeat[ie->type], &type, string, sizeof(string));
- if (rc < 0)
- break;
- PDEBUG(DCC, level, " %s type=%d(%s) number='%s'\n", osmo_cc_ie_value2name(ie->type), type, osmo_cc_type_value2name(type), string);
- break;
- case OSMO_CC_IE_CALLED_NAME:
- rc = osmo_cc_get_ie_called_name(msg, ie_repeat[ie->type], string, sizeof(string));
- if (rc < 0)
- break;
- PDEBUG(DCC, level, " %s name='%s'\n", osmo_cc_ie_value2name(ie->type), string);
- break;
- case OSMO_CC_IE_CALLED_INTERFACE:
- rc = osmo_cc_get_ie_called_interface(msg, ie_repeat[ie->type], string, sizeof(string));
- if (rc < 0)
- break;
- PDEBUG(DCC, level, " %s name='%s'\n", osmo_cc_ie_value2name(ie->type), string);
- break;
- case OSMO_CC_IE_COMPLETE:
- rc = osmo_cc_get_ie_complete(msg, ie_repeat[ie->type]);
- if (rc < 0)
- break;
- PDEBUG(DCC, level, " %s\n", osmo_cc_ie_value2name(ie->type));
- break;
- case OSMO_CC_IE_CALLING:
- rc = osmo_cc_get_ie_calling(msg, ie_repeat[ie->type], &type, &plan, &present, &screen, string, sizeof(string));
- if (rc < 0)
- break;
- PDEBUG(DCC, level, " %s type=%d(%s) plan=%d(%s), presentation=%d(%s), screening=%d(%s), number='%s'\n", osmo_cc_ie_value2name(ie->type), type, osmo_cc_type_value2name(type), plan, osmo_cc_plan_value2name(plan), present, osmo_cc_present_value2name(present), screen, osmo_cc_screen_value2name(screen), string);
- break;
- case OSMO_CC_IE_CALLING_SUB:
- rc = osmo_cc_get_ie_calling_sub(msg, ie_repeat[ie->type], &type, string, sizeof(string));
- if (rc < 0)
- break;
- PDEBUG(DCC, level, " %s type=%d(%s) number='%s'\n", osmo_cc_ie_value2name(ie->type), type, osmo_cc_type_value2name(type), string);
- break;
- case OSMO_CC_IE_CALLING_NAME:
- rc = osmo_cc_get_ie_calling_name(msg, ie_repeat[ie->type], string, sizeof(string));
- if (rc < 0)
- break;
- PDEBUG(DCC, level, " %s name='%s'\n", osmo_cc_ie_value2name(ie->type), string);
- break;
- case OSMO_CC_IE_CALLING_INTERFACE:
- rc = osmo_cc_get_ie_calling_interface(msg, ie_repeat[ie->type], string, sizeof(string));
- if (rc < 0)
- break;
- PDEBUG(DCC, level, " %s name='%s'\n", osmo_cc_ie_value2name(ie->type), string);
- break;
- case OSMO_CC_IE_CALLING_NETWORK:
- rc = osmo_cc_get_ie_calling_network(msg, ie_repeat[ie->type], &type, string, sizeof(string));
- if (rc < 0)
- break;
- PDEBUG(DCC, level, " %s type=%d(%s) id='%s'\n", osmo_cc_ie_value2name(ie->type), type, osmo_cc_network_value2name(type), string);
- break;
- case OSMO_CC_IE_BEARER:
- rc = osmo_cc_get_ie_bearer(msg, ie_repeat[ie->type], &coding, &capability, &mode);
- if (rc < 0)
- break;
- PDEBUG(DCC, level, " %s coding=%d(%s) capability=%d(%s) mode=%d(%s)\n", osmo_cc_ie_value2name(ie->type), coding, osmo_cc_coding_value2name(coding), capability, osmo_cc_capability_value2name(capability), mode, osmo_cc_mode_value2name(mode));
- break;
- case OSMO_CC_IE_REDIR:
- rc = osmo_cc_get_ie_redir(msg, ie_repeat[ie->type], &type, &plan, &present, &screen, &reason, string, sizeof(string));
- if (rc < 0)
- break;
- PDEBUG(DCC, level, " %s type=%d(%s) plan=%d(%s) presentation=%d(%s) screening=%d(%s) reason=%d(%s) number='%s'\n", osmo_cc_ie_value2name(ie->type), type, osmo_cc_type_value2name(type), plan, osmo_cc_plan_value2name(plan), present, osmo_cc_present_value2name(present), screen, osmo_cc_screen_value2name(screen), reason, osmo_cc_redir_reason_value2name(reason), string);
- break;
- case OSMO_CC_IE_DTMF:
- rc = osmo_cc_get_ie_dtmf(msg, ie_repeat[ie->type], &duration_ms, &pause_ms, &dtmf_mode, string, sizeof(string));
- if (rc < 0)
- break;
- PDEBUG(DCC, level, " %s duration=%dms pause=%dms mode=%d(%s)\n", osmo_cc_ie_value2name(ie->type), duration_ms, pause_ms, dtmf_mode, osmo_cc_dtmf_mode_value2name(dtmf_mode));
- break;
- case OSMO_CC_IE_KEYPAD:
- rc = osmo_cc_get_ie_keypad(msg, ie_repeat[ie->type], string, sizeof(string));
- if (rc < 0)
- break;
- PDEBUG(DCC, level, " %s digits='%s'\n", osmo_cc_ie_value2name(ie->type), string);
- break;
- case OSMO_CC_IE_PROGRESS:
- rc = osmo_cc_get_ie_progress(msg, ie_repeat[ie->type], &coding, &location, &progress);
- if (rc < 0)
- break;
- PDEBUG(DCC, level, " %s coding=%d(%s) location=%d(%s) progress=%d(%s)\n", osmo_cc_ie_value2name(ie->type), coding, osmo_cc_coding_value2name(coding), location, osmo_cc_location_value2name(location), progress, osmo_cc_progress_value2name(progress));
- break;
- case OSMO_CC_IE_NOTIFY:
- rc = osmo_cc_get_ie_notify(msg, ie_repeat[ie->type], &notify);
- if (rc < 0)
- break;
- PDEBUG(DCC, level, " %s indicator=%d(%s)\n", osmo_cc_ie_value2name(ie->type), notify, osmo_cc_notify_value2name(notify));
- break;
- case OSMO_CC_IE_CAUSE:
- rc = osmo_cc_get_ie_cause(msg, ie_repeat[ie->type], &location, &isdn_cause, &sip_cause, &socket_cause);
- if (rc < 0)
- break;
- PDEBUG(DCC, level, " %s location=%d(%s) isdn_cause=%d(%s) sip_cause=%d socket_cause=%d(%s)\n", osmo_cc_ie_value2name(ie->type), location, osmo_cc_location_value2name(location), isdn_cause, osmo_cc_isdn_cause_value2name(isdn_cause), sip_cause, socket_cause, osmo_cc_socket_cause_value2name(socket_cause));
- break;
- case OSMO_CC_IE_DISPLAY:
- rc = osmo_cc_get_ie_display(msg, ie_repeat[ie->type], string, sizeof(string));
- if (rc < 0)
- break;
- PDEBUG(DCC, level, " %s info='%s'\n", osmo_cc_ie_value2name(ie->type), string);
- break;
- case OSMO_CC_IE_SDP:
- rc = osmo_cc_get_ie_sdp(msg, ie_repeat[ie->type], string, sizeof(string));
- if (rc < 0)
- break;
- for (i = 0; string[i]; i++) {
- if (string[i] == '\r')
- string[i] = '\\';
- if (string[i] == '\n')
- string[i] = 'n';
- }
- PDEBUG(DCC, level, " %s payload=%s\n", osmo_cc_ie_value2name(ie->type), string);
- break;
- case OSMO_CC_IE_SOCKET_ADDRESS:
- rc = osmo_cc_get_ie_socket_address(msg, ie_repeat[ie->type], string, sizeof(string));
- if (rc < 0)
- break;
- PDEBUG(DCC, level, " %s address='%s'\n", osmo_cc_ie_value2name(ie->type), string);
- break;
- case OSMO_CC_IE_PRIVATE:
- rc = osmo_cc_get_ie_private(msg, ie_repeat[ie->type], &unique, (uint8_t *)string, sizeof(string));
- if (rc < 0)
- break;
- PDEBUG(DCC, level, " %s unique=%u=0x%08x private=%s\n", osmo_cc_ie_value2name(ie->type), unique, unique, debug_hex((uint8_t *)string, rc));
- break;
- default:
- PDEBUG(DCC, level, " %s type=0x%02x length=%d value=%s\n", osmo_cc_ie_value2name(ie->type), ie->type, len, debug_hex(ie->data, len));
- }
- ie_repeat[ie->type]++;
- p += sizeof(*ie) + len;
- msg_len -= sizeof(*ie) + len;
- }
-}
-
-/* search and return information element
- * we give the IE type we are searching for
- * we also give the repetition, to find IE that is repeated
- * the result is stored in *ie_data
- * the return length is the length that exceeds the given ie_len
- * if there is an error, a value < 0 is returned
- */
-int osmo_cc_get_ie_struct(osmo_cc_msg_t *msg, uint8_t ie_type, int ie_repeat, int ie_len, const osmo_cc_ie_t **ie_struct)
-{
- uint16_t msg_len, len;
- uint8_t *p;
- osmo_cc_ie_t *ie;
-
- msg_len = ntohs(msg->length_networkorder);
- p = msg->data;
-
- while (msg_len) {
- ie = (osmo_cc_ie_t *)p;
- /* check for minimum IE length */
- if (msg_len < sizeof(*ie)) {
- PDEBUG(DCC, DEBUG_ERROR, "MSG short read\n");
- osmo_cc_debug_ie(msg, DEBUG_ERROR);
- return -EINVAL;
- }
- /* get actual IE length */
- len = ntohs(ie->length_networkorder);
- /* check if IE length does not exceed message */
- if (msg_len < sizeof(*ie) + len) {
- PDEBUG(DCC, DEBUG_ERROR, "MSG short read\n");
- osmo_cc_debug_ie(msg, DEBUG_ERROR);
- return -EINVAL;
- }
- /* check if IE matches the one that is searched for */
- if (ie->type != ie_type) {
- p += sizeof(*ie) + len;
- msg_len -= sizeof(*ie) + len;
- continue;
- }
- /* check if IE repetition exists */
- if (ie_repeat) {
- --ie_repeat;
- p += sizeof(*ie) + len;
- msg_len -= sizeof(*ie) + len;
- continue;
- }
- /* return IE and indicate how many bytes we have more than the given length*/
- if (ntohs(ie->length_networkorder) < ie_len) {
- PDEBUG(DCC, DEBUG_ERROR, "IE 0x%02d has length of %d, but we expect it to have at least %d!\n", ie_type, ntohs(ie->length_networkorder), ie_len);
- return -EINVAL;
- }
- *ie_struct = ie;
- return ntohs(ie->length_networkorder) - ie_len;
- }
-
- /* IE not found */
- return -EINVAL;
-}
-
-/* as above, but return data of IE only */
-int osmo_cc_get_ie_data(osmo_cc_msg_t *msg, uint8_t ie_type, int ie_repeat, int ie_len, const void **ie_data)
-{
- const osmo_cc_ie_t *ie;
- int rc;
-
- rc = osmo_cc_get_ie_struct(msg, ie_type, ie_repeat, ie_len, &ie);
- if (rc >= 0)
- *ie_data = ie->data;
-
- return rc;
-}
-
-/* as above, but return 1 if IE exists */
-int osmo_cc_has_ie(osmo_cc_msg_t *msg, uint8_t ie_type, int ie_repeat)
-{
- const osmo_cc_ie_t *ie;
- int rc;
-
- rc = osmo_cc_get_ie_struct(msg, ie_type, ie_repeat, 0, &ie);
- if (rc >= 0)
- return 1;
-
- return 0;
-}
-
-/* remove IE from message */
-int osmo_cc_remove_ie(osmo_cc_msg_t *msg, uint8_t ie_type, int ie_repeat)
-{
- const osmo_cc_ie_t *ie;
- int rc;
- int msg_len, before_ie, ie_size, after_ie;
-
- rc = osmo_cc_get_ie_struct(msg, ie_type, ie_repeat, 0, &ie);
- if (rc < 0)
- return rc;
-
- msg_len = ntohs(msg->length_networkorder);
- before_ie = (void *)ie - (void *)msg->data;
- ie_size = sizeof(*ie) + ntohs(ie->length_networkorder);
- after_ie = msg_len - ie_size - before_ie;
- if (after_ie)
- memcpy(msg->data + before_ie, msg->data + before_ie + ie_size, after_ie);
- msg->length_networkorder = htons(msg_len - ie_size);
-
- return 0;
-}
-
-/* add information element
- * the type is given by ie_type and length is given by ie_len
- * the return value is a pointer to the data of the IE
- */
-void *osmo_cc_add_ie(osmo_cc_msg_t *msg, uint8_t ie_type, int ie_len)
-{
- uint16_t msg_len;
- int new_msg_len;
- uint8_t *p;
- osmo_cc_ie_t *ie;
-
- /* get pointer to first IE, if any */
- p = msg->data;
- /* expand messasge */
- msg_len = ntohs(msg->length_networkorder);
- new_msg_len = msg_len + sizeof(*ie) + ie_len;
- if (new_msg_len > 65535) {
- PDEBUG(DCC, DEBUG_ERROR, "MSG overflow\n");
- return NULL;
- }
- msg->length_networkorder = htons(new_msg_len);
- /* go to end of (unexpanded) message */
- ie = (osmo_cc_ie_t *)(p + msg_len);
- /* add ie */
- ie->type = ie_type;
- ie->length_networkorder = htons(ie_len);
- memset(ie->data, 0, ie_len); /* just in case there is something, but it shouldn't */
-
- return ie->data;
-}
-
-/* gets the information element's data that *iep points to and returns that ie.
- * if *iep points to msg->data, the first IE's data is returned. (must be set before first call.)
- * if *iep points to the end of the message, NULL is returned.
- * if there is no next IE, *iep is set to point to the end of message.
- */
-void *osmo_cc_msg_sep_ie(osmo_cc_msg_t *msg, void **iep, uint8_t *ie_type, uint16_t *ie_length)
-{
- uint16_t msg_len;
- osmo_cc_ie_t *ie;
-
- /* in case that *iep points to start of message, make it point to first IE */
- if (*iep == msg)
- *iep = msg->data;
- /* case IE */
- ie = *iep;
- /* check if it is NULL */
- if (ie == NULL)
- return NULL;
- /* check if it points to the end of message or there is not at least an IE header */
- msg_len = ntohs(msg->length_networkorder);
- if ((int)((uint8_t *)ie - msg->data) > (int)(msg_len - sizeof(*ie)))
- return NULL;
- /* increment iep and return IE */
- *ie_type = ie->type;
- *ie_length = ntohs(ie->length_networkorder);
- *iep = (uint8_t *)ie + sizeof(*ie) + *ie_length;
- return ie->data;
-}
-
-/* copy given block to given string with given size */
-static void _ie2string(char *string, size_t string_size, const char *ie_string, int ie_size)
-{
- int copy_size;
-
- copy_size = string_size - 1;
- if (ie_size < copy_size)
- copy_size = ie_size;
- memcpy(string, ie_string, copy_size);
- string[copy_size] = '\0';
-}
-
-/* helper to encode called party number (dialing) */
-void osmo_cc_add_ie_called(osmo_cc_msg_t *msg, uint8_t type, uint8_t plan, const char *dialing)
-{
- struct osmo_cc_ie_called *ie_called;
-
- ie_called = osmo_cc_add_ie(msg, OSMO_CC_IE_CALLED, sizeof(*ie_called) + strlen(dialing));
- ie_called->type = type;
- ie_called->plan = plan;
- memcpy(ie_called->digits, dialing, strlen(dialing));
-}
-
-/* helper to decode called party number (dialing) */
-int osmo_cc_get_ie_called(osmo_cc_msg_t *msg, int ie_repeat, uint8_t *type, uint8_t *plan, char *dialing, size_t dialing_size)
-{
- struct osmo_cc_ie_called *ie_called;
- int rc;
-
- rc = osmo_cc_get_ie_data(msg, OSMO_CC_IE_CALLED, ie_repeat, sizeof(*ie_called), (const void **)&ie_called);
- if (rc < 0)
- return rc;
- *type = ie_called->type;
- *plan = ie_called->plan;
- _ie2string(dialing, dialing_size, ie_called->digits, rc);
- return rc;
-}
-
-/* helper to encode called party sub address (dialing) */
-void osmo_cc_add_ie_called_sub(osmo_cc_msg_t *msg, uint8_t type, const char *dialing)
-{
- struct osmo_cc_ie_called_sub *ie_called_sub;
-
- ie_called_sub = osmo_cc_add_ie(msg, OSMO_CC_IE_CALLED_SUB, sizeof(*ie_called_sub) + strlen(dialing));
- ie_called_sub->type = type;
- memcpy(ie_called_sub->digits, dialing, strlen(dialing));
-}
-
-/* helper to decode called party sub address (dialing) */
-int osmo_cc_get_ie_called_sub(osmo_cc_msg_t *msg, int ie_repeat, uint8_t *type, char *dialing, size_t dialing_size)
-{
- struct osmo_cc_ie_called_sub *ie_called_sub;
- int rc;
-
- rc = osmo_cc_get_ie_data(msg, OSMO_CC_IE_CALLED_SUB, ie_repeat, sizeof(*ie_called_sub), (const void **)&ie_called_sub);
- if (rc < 0)
- return rc;
- *type = ie_called_sub->type;
- _ie2string(dialing, dialing_size, ie_called_sub->digits, rc);
- return rc;
-}
-
-/* helper to encode called party name (dialing) */
-void osmo_cc_add_ie_called_name(osmo_cc_msg_t *msg, const char *name)
-{
- struct osmo_cc_ie_called_name *ie_called_name;
-
- ie_called_name = osmo_cc_add_ie(msg, OSMO_CC_IE_CALLED_NAME, sizeof(*ie_called_name) + strlen(name));
- memcpy(ie_called_name->name, name, strlen(name));
-}
-
-/* helper to decode called party name (dialing) */
-int osmo_cc_get_ie_called_name(osmo_cc_msg_t *msg, int ie_repeat, char *name, size_t name_size)
-{
- struct osmo_cc_ie_called_name *ie_called_name;
- int rc;
-
- rc = osmo_cc_get_ie_data(msg, OSMO_CC_IE_CALLED_NAME, ie_repeat, sizeof(*ie_called_name), (const void **)&ie_called_name);
- if (rc < 0)
- return rc;
- _ie2string(name, name_size, ie_called_name->name, rc);
- return rc;
-}
-
-/* helper to encode called interface name */
-void osmo_cc_add_ie_called_interface(osmo_cc_msg_t *msg, const char *interface)
-{
- struct osmo_cc_ie_called_interface *ie_interface;
-
- ie_interface = osmo_cc_add_ie(msg, OSMO_CC_IE_CALLED_INTERFACE, sizeof(*ie_interface) + strlen(interface));
- memcpy(ie_interface->name, interface, strlen(interface));
-}
-
-/* helper to decode called interface name */
-int osmo_cc_get_ie_called_interface(osmo_cc_msg_t *msg, int ie_repeat, char *interface, size_t interface_size)
-{
- struct osmo_cc_ie_called_interface *ie_interface;
- int rc;
-
- rc = osmo_cc_get_ie_data(msg, OSMO_CC_IE_CALLED_INTERFACE, ie_repeat, sizeof(*ie_interface), (const void **)&ie_interface);
- if (rc < 0)
- return rc;
- _ie2string(interface, interface_size, ie_interface->name, rc);
- return rc;
-}
-
-/* helper to encode complete IE */
-void osmo_cc_add_ie_complete(osmo_cc_msg_t *msg)
-{
- osmo_cc_add_ie(msg, OSMO_CC_IE_COMPLETE, 0);
-}
-
-/* helper to decode complete IE */
-int osmo_cc_get_ie_complete(osmo_cc_msg_t *msg, int ie_repeat)
-{
- int rc;
- void *ie_complete;
-
- rc = osmo_cc_get_ie_data(msg, OSMO_CC_IE_COMPLETE, ie_repeat, 0, (const void **)&ie_complete);
- return rc;
-}
-
-/* helper to encode calling/connected party number (caller ID or connected ID) */
-void osmo_cc_add_ie_calling(osmo_cc_msg_t *msg, uint8_t type, uint8_t plan, uint8_t present, uint8_t screen, const char *callerid)
-{
- struct osmo_cc_ie_calling *ie_calling;
-
- ie_calling = osmo_cc_add_ie(msg, OSMO_CC_IE_CALLING, sizeof(*ie_calling) + strlen(callerid));
- ie_calling->type = type;
- ie_calling->plan = plan;
- ie_calling->present = present;
- ie_calling->screen = screen;
- memcpy(ie_calling->digits, callerid, strlen(callerid));
-}
-
-/* helper to decode calling/connected party number (caller ID or connected ID) */
-int osmo_cc_get_ie_calling(osmo_cc_msg_t *msg, int ie_repeat, uint8_t *type, uint8_t *plan, uint8_t *present, uint8_t *screen, char *callerid, size_t callerid_size)
-{
- struct osmo_cc_ie_calling *ie_calling;
- int rc;
-
- rc = osmo_cc_get_ie_data(msg, OSMO_CC_IE_CALLING, ie_repeat, sizeof(*ie_calling), (const void **)&ie_calling);
- if (rc < 0)
- return rc;
- *type = ie_calling->type;
- *plan = ie_calling->plan;
- *present = ie_calling->present;
- *screen = ie_calling->screen;
- _ie2string(callerid, callerid_size, ie_calling->digits, rc);
- return rc;
-}
-
-/* helper to encode calling/connected sub address (caller ID or connected ID) */
-void osmo_cc_add_ie_calling_sub(osmo_cc_msg_t *msg, uint8_t type, const char *callerid)
-{
- struct osmo_cc_ie_calling_sub *ie_calling_sub;
-
- ie_calling_sub = osmo_cc_add_ie(msg, OSMO_CC_IE_CALLING_SUB, sizeof(*ie_calling_sub) + strlen(callerid));
- ie_calling_sub->type = type;
- memcpy(ie_calling_sub->digits, callerid, strlen(callerid));
-}
-
-/* helper to decode calling/connected sub address (caller ID or connected ID) */
-int osmo_cc_get_ie_calling_sub(osmo_cc_msg_t *msg, int ie_repeat, uint8_t *type, char *callerid, size_t callerid_size)
-{
- struct osmo_cc_ie_calling_sub *ie_calling_sub;
- int rc;
-
- rc = osmo_cc_get_ie_data(msg, OSMO_CC_IE_CALLING_SUB, ie_repeat, sizeof(*ie_calling_sub), (const void **)&ie_calling_sub);
- if (rc < 0)
- return rc;
- *type = ie_calling_sub->type;
- _ie2string(callerid, callerid_size, ie_calling_sub->digits, rc);
- return rc;
-}
-
-/* helper to encode calling/connected name (caller ID or connected ID) */
-void osmo_cc_add_ie_calling_name(osmo_cc_msg_t *msg, const char *name)
-{
- struct osmo_cc_ie_calling_name *ie_calling_name;
-
- ie_calling_name = osmo_cc_add_ie(msg, OSMO_CC_IE_CALLING_NAME, sizeof(*ie_calling_name) + strlen(name));
- memcpy(ie_calling_name->name, name, strlen(name));
-}
-
-/* helper to decode calling/connected name address (caller ID or connected ID) */
-int osmo_cc_get_ie_calling_name(osmo_cc_msg_t *msg, int ie_repeat, char *name, size_t name_size)
-{
- struct osmo_cc_ie_calling_name *ie_calling_name;
- int rc;
-
- rc = osmo_cc_get_ie_data(msg, OSMO_CC_IE_CALLING_NAME, ie_repeat, sizeof(*ie_calling_name), (const void **)&ie_calling_name);
- if (rc < 0)
- return rc;
- _ie2string(name, name_size, ie_calling_name->name, rc);
- return rc;
-}
-
-/* helper to encode calling interface name */
-void osmo_cc_add_ie_calling_interface(osmo_cc_msg_t *msg, const char *interface)
-{
- struct osmo_cc_ie_calling_interface *ie_interface;
-
- ie_interface = osmo_cc_add_ie(msg, OSMO_CC_IE_CALLING_INTERFACE, sizeof(*ie_interface) + strlen(interface));
- memcpy(ie_interface->name, interface, strlen(interface));
-}
-
-/* helper to decode calling interface name */
-int osmo_cc_get_ie_calling_interface(osmo_cc_msg_t *msg, int ie_repeat, char *interface, size_t interface_size)
-{
- struct osmo_cc_ie_calling_interface *ie_interface;
- int rc;
-
- rc = osmo_cc_get_ie_data(msg, OSMO_CC_IE_CALLING_INTERFACE, ie_repeat, sizeof(*ie_interface), (const void **)&ie_interface);
- if (rc < 0)
- return rc;
- _ie2string(interface, interface_size, ie_interface->name, rc);
- return rc;
-}
-
-/* helper to encode network specific caller/connected ID */
-void osmo_cc_add_ie_calling_network(osmo_cc_msg_t *msg, uint8_t type, const char *networkid)
-{
- struct osmo_cc_ie_network *ie_network;
-
- ie_network = osmo_cc_add_ie(msg, OSMO_CC_IE_CALLING_NETWORK, sizeof(*ie_network) + strlen(networkid));
- ie_network->type = type;
- memcpy(ie_network->id, networkid, strlen(networkid));
-}
-
-/* helper to encode network specific caller/connected ID */
-int osmo_cc_get_ie_calling_network(osmo_cc_msg_t *msg, int ie_repeat, uint8_t *type, char *networkid, size_t networkid_size)
-{
- struct osmo_cc_ie_network *ie_network;
- int rc;
-
- rc = osmo_cc_get_ie_data(msg, OSMO_CC_IE_CALLING_NETWORK, ie_repeat, sizeof(*ie_network), (const void **)&ie_network);
- if (rc < 0)
- return rc;
- *type = ie_network->type;
- _ie2string(networkid, networkid_size, ie_network->id, rc);
- return rc;
-}
-
-/* helper to encode bearer capability */
-void osmo_cc_add_ie_bearer(osmo_cc_msg_t *msg, uint8_t coding, uint8_t capability, uint8_t mode)
-{
- struct osmo_cc_ie_bearer *ie_bearer;
-
- ie_bearer = osmo_cc_add_ie(msg, OSMO_CC_IE_BEARER, sizeof(*ie_bearer));
- ie_bearer->coding = coding;
- ie_bearer->capability = capability;
- ie_bearer->mode = mode;
-}
-
-/* helper to decode bearer capability */
-int osmo_cc_get_ie_bearer(osmo_cc_msg_t *msg, int ie_repeat, uint8_t *coding, uint8_t *capability, uint8_t *mode)
-{
- struct osmo_cc_ie_bearer *ie_bearer;
- int rc;
-
- rc = osmo_cc_get_ie_data(msg, OSMO_CC_IE_BEARER, ie_repeat, sizeof(*ie_bearer), (const void **)&ie_bearer);
- if (rc < 0)
- return rc;
- *coding = ie_bearer->coding;
- *capability = ie_bearer->capability;
- *mode = ie_bearer->mode;
- return rc;
-}
-
-/* helper to encode redirection and redirecting number */
-void osmo_cc_add_ie_redir(osmo_cc_msg_t *msg, uint8_t type, uint8_t plan, uint8_t present, uint8_t screen, uint8_t redir_reason, const char *callerid)
-{
- struct osmo_cc_ie_redir *ie_redir;
-
- ie_redir = osmo_cc_add_ie(msg, OSMO_CC_IE_REDIR, sizeof(*ie_redir) + strlen(callerid));
- ie_redir->type = type;
- ie_redir->plan = plan;
- ie_redir->present = present;
- ie_redir->screen = screen;
- ie_redir->redir_reason = redir_reason;
- memcpy(ie_redir->digits, callerid, strlen(callerid));
-}
-
-/* helper to decode redirection and redirecting number */
-int osmo_cc_get_ie_redir(osmo_cc_msg_t *msg, int ie_repeat, uint8_t *type, uint8_t *plan, uint8_t *present, uint8_t *screen, uint8_t *reason, char *callerid, size_t callerid_size)
-{
- struct osmo_cc_ie_redir *ie_redir;
- int rc;
-
- rc = osmo_cc_get_ie_data(msg, OSMO_CC_IE_REDIR, ie_repeat, sizeof(*ie_redir), (const void **)&ie_redir);
- if (rc < 0)
- return rc;
- *type = ie_redir->type;
- *plan = ie_redir->plan;
- *present = ie_redir->present;
- *screen = ie_redir->screen;
- *reason = ie_redir->redir_reason;
- _ie2string(callerid, callerid_size, ie_redir->digits, rc);
- return rc;
-}
-
-/* helper to encode DTMF tones */
-void osmo_cc_add_ie_dtmf(osmo_cc_msg_t *msg, uint8_t duration_ms, uint8_t pause_ms, uint8_t dtmf_mode, const char *digits)
-{
- struct osmo_cc_ie_dtmf *ie_dtmf;
-
- ie_dtmf = osmo_cc_add_ie(msg, OSMO_CC_IE_DTMF, sizeof(*ie_dtmf) + strlen(digits));
- ie_dtmf->duration_ms = duration_ms;
- ie_dtmf->pause_ms = pause_ms;
- ie_dtmf->dtmf_mode = dtmf_mode;
- memcpy(ie_dtmf->digits, digits, strlen(digits));
-}
-
-/* helper to decode DTMF tones */
-int osmo_cc_get_ie_dtmf(osmo_cc_msg_t *msg, int ie_repeat, uint8_t *duration_ms, uint8_t *pause_ms, uint8_t *dtmf_mode, char *digits, size_t digits_size)
-{
- struct osmo_cc_ie_dtmf *ie_dtmf;
- int rc;
-
- rc = osmo_cc_get_ie_data(msg, OSMO_CC_IE_DTMF, ie_repeat, sizeof(*ie_dtmf), (const void **)&ie_dtmf);
- if (rc < 0)
- return rc;
- *duration_ms = ie_dtmf->duration_ms;
- *pause_ms = ie_dtmf->pause_ms;
- *dtmf_mode = ie_dtmf->dtmf_mode;
- _ie2string(digits, digits_size, ie_dtmf->digits, rc);
- return rc;
-}
-
-/* helper to encode keypad press */
-void osmo_cc_add_ie_keypad(osmo_cc_msg_t *msg, const char *digits)
-{
- struct osmo_cc_ie_keypad *ie_keypad;
-
- ie_keypad = osmo_cc_add_ie(msg, OSMO_CC_IE_KEYPAD, sizeof(*ie_keypad) + strlen(digits));
- memcpy(ie_keypad->digits, digits, strlen(digits));
-}
-
-/* helper to decode keypad press */
-int osmo_cc_get_ie_keypad(osmo_cc_msg_t *msg, int ie_repeat, char *digits, size_t digits_size)
-{
- struct osmo_cc_ie_keypad *ie_keypad;
- int rc;
-
- rc = osmo_cc_get_ie_data(msg, OSMO_CC_IE_KEYPAD, ie_repeat, sizeof(*ie_keypad), (const void **)&ie_keypad);
- if (rc < 0)
- return rc;
- _ie2string(digits, digits_size, ie_keypad->digits, rc);
- return rc;
-}
-
-/* helper to encode call progress information */
-void osmo_cc_add_ie_progress(osmo_cc_msg_t *msg, uint8_t coding, uint8_t location, uint8_t progress)
-{
- struct osmo_cc_ie_progress *ie_progress;
-
- ie_progress = osmo_cc_add_ie(msg, OSMO_CC_IE_PROGRESS, sizeof(*ie_progress));
- ie_progress->coding = coding;
- ie_progress->location = location;
- ie_progress->progress = progress;
-}
-
-/* helper to decode call progress information */
-int osmo_cc_get_ie_progress(osmo_cc_msg_t *msg, int ie_repeat, uint8_t *coding, uint8_t *location, uint8_t *progress)
-{
- struct osmo_cc_ie_progress *ie_progress;
- int rc;
-
- rc = osmo_cc_get_ie_data(msg, OSMO_CC_IE_PROGRESS, ie_repeat, sizeof(*ie_progress), (const void **)&ie_progress);
- if (rc < 0)
- return rc;
- *coding = ie_progress->coding;
- *location = ie_progress->location;
- *progress = ie_progress->progress;
- return rc;
-}
-
-/* helper to encode notification */
-void osmo_cc_add_ie_notify(osmo_cc_msg_t *msg, uint8_t notify)
-{
- struct osmo_cc_ie_notify *ie_notify;
-
- ie_notify = osmo_cc_add_ie(msg, OSMO_CC_IE_NOTIFY, sizeof(*ie_notify));
- ie_notify->notify = notify;
-}
-
-/* helper to decode notification */
-int osmo_cc_get_ie_notify(osmo_cc_msg_t *msg, int ie_repeat, uint8_t *notify)
-{
- struct osmo_cc_ie_notify *ie_notify;
- int rc;
-
- rc = osmo_cc_get_ie_data(msg, OSMO_CC_IE_NOTIFY, ie_repeat, sizeof(*ie_notify), (const void **)&ie_notify);
- if (rc < 0)
- return rc;
- *notify = ie_notify->notify;
- return rc;
-}
-
-/* helper to encode cause */
-void osmo_cc_add_ie_cause(osmo_cc_msg_t *msg, uint8_t location, uint8_t isdn_cause, uint16_t sip_cause, uint8_t socket_cause)
-{
- struct osmo_cc_ie_cause *ie_cause;
-
- ie_cause = osmo_cc_add_ie(msg, OSMO_CC_IE_CAUSE, sizeof(*ie_cause));
- ie_cause->location = location;
- ie_cause->isdn_cause = isdn_cause;
- ie_cause->sip_cause_networkorder = htons(sip_cause);
- ie_cause->socket_cause = socket_cause;
-}
-
-/* helper to deccode cause */
-int osmo_cc_get_ie_cause(osmo_cc_msg_t *msg, int ie_repeat, uint8_t *location, uint8_t *isdn_cause, uint16_t *sip_cause, uint8_t *socket_cause)
-{
- struct osmo_cc_ie_cause *ie_cause;
- int rc;
-
- rc = osmo_cc_get_ie_data(msg, OSMO_CC_IE_CAUSE, ie_repeat, sizeof(*ie_cause), (const void **)&ie_cause);
- if (rc < 0)
- return rc;
- *location = ie_cause->location;
- *isdn_cause = ie_cause->isdn_cause;
- *sip_cause = ntohs(ie_cause->sip_cause_networkorder);
- *socket_cause = ie_cause->socket_cause;
- return rc;
-}
-
-/* helper to encode DISPLAY information */
-void osmo_cc_add_ie_display(osmo_cc_msg_t *msg, const char *text)
-{
- struct osmo_cc_ie_display *ie_display;
-
- ie_display = osmo_cc_add_ie(msg, OSMO_CC_IE_DISPLAY, sizeof(*ie_display) + strlen(text));
- memcpy(ie_display->text, text, strlen(text));
-}
-
-/* helper to decode DISPLAY information */
-int osmo_cc_get_ie_display(osmo_cc_msg_t *msg, int ie_repeat, char *text, size_t text_size)
-{
- struct osmo_cc_ie_display *ie_display;
- int rc;
-
- rc = osmo_cc_get_ie_data(msg, OSMO_CC_IE_DISPLAY, ie_repeat, sizeof(*ie_display), (const void **)&ie_display);
- if (rc < 0)
- return rc;
- _ie2string(text, text_size, ie_display->text, rc);
- return rc;
-}
-
-/* helper to encode SDP */
-void osmo_cc_add_ie_sdp(osmo_cc_msg_t *msg, const char *sdp)
-{
- struct osmo_cc_ie_sdp *ie_sdp;
-
- ie_sdp = osmo_cc_add_ie(msg, OSMO_CC_IE_SDP, sizeof(*ie_sdp) + strlen(sdp));
- memcpy(ie_sdp->sdp, sdp, strlen(sdp));
-}
-
-/* helper to decode SDP */
-int osmo_cc_get_ie_sdp(osmo_cc_msg_t *msg, int ie_repeat, char *sdp, size_t sdp_size)
-{
- struct osmo_cc_ie_sdp *ie_sdp;
- int rc;
-
- rc = osmo_cc_get_ie_data(msg, OSMO_CC_IE_SDP, ie_repeat, sizeof(*ie_sdp), (const void **)&ie_sdp);
- if (rc < 0)
- return rc;
- _ie2string(sdp, sdp_size, ie_sdp->sdp, rc);
- return rc;
-}
-
-/* helper to encode socket address */
-void osmo_cc_add_ie_socket_address(osmo_cc_msg_t *msg, const char *address)
-{
- struct osmo_cc_ie_socket_address *ie_socket_address;
-
- ie_socket_address = osmo_cc_add_ie(msg, OSMO_CC_IE_SOCKET_ADDRESS, sizeof(*ie_socket_address) + strlen(address));
- memcpy(ie_socket_address->address, address, strlen(address));
-}
-
-/* helper to decode socket address */
-int osmo_cc_get_ie_socket_address(osmo_cc_msg_t *msg, int ie_repeat, char *address, size_t address_size)
-{
- struct osmo_cc_ie_socket_address *ie_socket_address;
- int rc;
-
- rc = osmo_cc_get_ie_data(msg, OSMO_CC_IE_SOCKET_ADDRESS, ie_repeat, sizeof(*ie_socket_address), (const void **)&ie_socket_address);
- if (rc < 0)
- return rc;
- _ie2string(address, address_size, ie_socket_address->address, rc);
- return rc;
-}
-
-/* helper to encode private information element */
-void osmo_cc_add_ie_private(osmo_cc_msg_t *msg, uint32_t unique, const uint8_t *data, size_t data_size)
-{
- struct osmo_cc_ie_private *ie_private;
-
- ie_private = osmo_cc_add_ie(msg, OSMO_CC_IE_PRIVATE, sizeof(*ie_private) + data_size);
- ie_private->unique_networkorder = htonl(unique);
- memcpy(ie_private->data, data, data_size);
-}
-
-/* helper to decode private information element */
-int osmo_cc_get_ie_private(osmo_cc_msg_t *msg, int ie_repeat, uint32_t *unique, uint8_t *data, size_t data_size)
-{
- struct osmo_cc_ie_private *ie_private;
- int rc;
-
- rc = osmo_cc_get_ie_data(msg, OSMO_CC_IE_PRIVATE, ie_repeat, sizeof(*ie_private), (const void **)&ie_private);
- if (rc < 0)
- return rc;
- *unique = ntohl(ie_private->unique_networkorder);
- if (rc > (int)data_size)
- rc = data_size;
- memcpy(data, ie_private->data, rc);
- return rc;
-}
-
diff --git a/src/libosmocc/message.h b/src/libosmocc/message.h
deleted file mode 100644
index da46435..0000000
--- a/src/libosmocc/message.h
+++ /dev/null
@@ -1,512 +0,0 @@
-#ifndef OSMO_CC_MSG_H
-#define OSMO_CC_MSG_H
-
-#define OSMO_CC_VERSION "OSMOCCv1"
-
-/* call control messages types */
-enum osmo_cc_msg_type {
- OSMO_CC_MSG_SETUP_REQ = 0x00,
- OSMO_CC_MSG_SETUP_IND = 0x01,
- OSMO_CC_MSG_REJ_REQ = 0x10,
- OSMO_CC_MSG_REJ_IND = 0x11,
- OSMO_CC_MSG_SETUP_ACK_REQ = 0x20,
- OSMO_CC_MSG_SETUP_ACK_IND = 0x21,
- OSMO_CC_MSG_PROC_REQ = 0x30,
- OSMO_CC_MSG_PROC_IND = 0x31,
- OSMO_CC_MSG_ALERT_REQ = 0x40,
- OSMO_CC_MSG_ALERT_IND = 0x41,
- OSMO_CC_MSG_SETUP_RSP = 0x02,
- OSMO_CC_MSG_SETUP_CNF = 0x03,
- OSMO_CC_MSG_SETUP_COMP_REQ = 0x50,
- OSMO_CC_MSG_SETUP_COMP_IND = 0x51,
- OSMO_CC_MSG_DISC_REQ = 0x60,
- OSMO_CC_MSG_DISC_IND = 0x61,
- OSMO_CC_MSG_REL_REQ = 0x70,
- OSMO_CC_MSG_REL_CNF = 0x73,
- OSMO_CC_MSG_REL_IND = 0x71,
- OSMO_CC_MSG_PROGRESS_REQ = 0x80,
- OSMO_CC_MSG_PROGRESS_IND = 0x81,
- OSMO_CC_MSG_NOTIFY_REQ = 0x84,
- OSMO_CC_MSG_NOTIFY_IND = 0x85,
- OSMO_CC_MSG_INFO_REQ = 0x88,
- OSMO_CC_MSG_INFO_IND = 0x89,
- OSMO_CC_MSG_MODIFY_REQ = 0x90,
- OSMO_CC_MSG_MODIFY_IND = 0x91,
- OSMO_CC_MSG_MODIFY_RSP = 0x92,
- OSMO_CC_MSG_MODIFY_CNF = 0x93,
- OSMO_CC_MSG_ATTACH_REQ = 0xf8,
- OSMO_CC_MSG_ATTACH_IND = 0xf9,
- OSMO_CC_MSG_ATTACH_RSP = 0xfa,
- OSMO_CC_MSG_ATTACH_CNF = 0xfb,
- OSMO_CC_MSG_DUMMY_REQ = 0xfc,
-};
-#define OSMO_CC_MSG_NUM 0x100
-
-#define OSMO_CC_MSG_MASK 0x03,
-#define OSMO_CC_MSG_REQ 0x00,
-#define OSMO_CC_MSG_IND 0x01,
-#define OSMO_CC_MSG_RSP 0x02,
-#define OSMO_CC_MSG_CNF 0x03,
-
-const char *osmo_cc_msg_value2name(int value);
-int osmo_cc_msg_name2value(const char *name);
-
-/* information elements */
-enum osmo_cc_ie_type {
- OSMO_CC_IE_CALLED = 0x11,
- OSMO_CC_IE_CALLED_SUB = 0x12,
- OSMO_CC_IE_CALLED_NAME = 0x13,
- OSMO_CC_IE_CALLED_INTERFACE = 0x14,
- OSMO_CC_IE_DTMF = 0x1d,
- OSMO_CC_IE_KEYPAD = 0x1e,
- OSMO_CC_IE_COMPLETE = 0x1f,
- OSMO_CC_IE_CALLING = 0x21,
- OSMO_CC_IE_CALLING_SUB = 0x22,
- OSMO_CC_IE_CALLING_NAME = 0x23,
- OSMO_CC_IE_CALLING_INTERFACE = 0x24,
- OSMO_CC_IE_CALLING_NETWORK = 0x2f,
- OSMO_CC_IE_REDIR = 0x31,
- OSMO_CC_IE_PROGRESS = 0x32,
- OSMO_CC_IE_NOTIFY = 0x33,
- OSMO_CC_IE_DISPLAY = 0x34,
- OSMO_CC_IE_CAUSE = 0x41,
- OSMO_CC_IE_BEARER = 0x51,
- OSMO_CC_IE_SDP = 0x52,
- OSMO_CC_IE_SOCKET_ADDRESS = 0x5e,
- OSMO_CC_IE_PRIVATE = 0x5f,
-};
-#define OSMO_CC_IE_NUM 0x100
-
-const char *osmo_cc_ie_value2name(int value);
-int osmo_cc_ie_name2value(const char *name);
-
-/* type of number, see ITU-T Rec. Q.931 */
-#define OSMO_CC_TYPE_UNKNOWN 0
-#define OSMO_CC_TYPE_INTERNATIONAL 1
-#define OSMO_CC_TYPE_NATIONAL 2
-#define OSMO_CC_TYPE_NETWORK 3
-#define OSMO_CC_TYPE_SUBSCRIBER 4
-#define OSMO_CC_TYPE_ABBREVIATED 5
-#define OSMO_CC_TYPE_RESERVED 7
-#define OSMO_CC_TYPE_NUM 8
-
-const char *osmo_cc_type_value2name(int value);
-int osmo_cc_type_name2value(const char *name);
-
-/* numbering plan, see ITU-T Rec. Q.931 */
-#define OSMO_CC_PLAN_UNKNOWN 0
-#define OSMO_CC_PLAN_TELEPHONY 1
-#define OSMO_CC_PLAN_DATA 3
-#define OSMO_CC_PLAN_TTY 4
-#define OSMO_CC_PLAN_NATIONAL_STANDARD 8
-#define OSMO_CC_PLAN_PRIVATE 9
-#define OSMO_CC_PLAN_RESERVED 15
-#define OSMO_CC_PLAN_NUM 16
-
-const char *osmo_cc_plan_value2name(int value);
-int osmo_cc_plan_name2value(const char *name);
-
-/* presentation indicator, see ITU-T Rec. Q.931 */
-#define OSMO_CC_PRESENT_ALLOWED 0
-#define OSMO_CC_PRESENT_RESTRICTED 1
-#define OSMO_CC_PRESENT_NOT_AVAIL 2
-#define OSMO_CC_PRESENT_RESERVED 3
-#define OSMO_CC_PRESENT_NUM 4
-
-const char *osmo_cc_present_value2name(int value);
-int osmo_cc_present_name2value(const char *name);
-
-/* screening indicator, see ITU-T Rec. Q.931 */
-#define OSMO_CC_SCREEN_USER_UNSCREENED 0
-#define OSMO_CC_SCREEN_USER_VERIFIED_PASSED 1
-#define OSMO_CC_SCREEN_USER_VERIFIED_FAILED 2
-#define OSMO_CC_SCREEN_NETWORK 3
-#define OSMO_CC_SCREEN_NUM 4
-
-const char *osmo_cc_screen_value2name(int value);
-int osmo_cc_screen_name2value(const char *name);
-
-/* screening indicator, see ITU-T Rec. Q.931 */
-#define OSMO_CC_REDIR_REASON_UNKNOWN 0
-#define OSMO_CC_REDIR_REASON_CFB 1
-#define OSMO_CC_REDIR_REASON_CFNR 2
-#define OSMO_CC_REDIR_REASON_CD 4
-#define OSMO_CC_REDIR_REASON_CF_OUTOFORDER 9
-#define OSMO_CC_REDIR_REASON_CF_BY_DTE 10
-#define OSMO_CC_REDIR_REASON_CFU 15
-#define OSMO_CC_REDIR_REASON_NUM 16
-
-const char *osmo_cc_redir_reason_value2name(int value);
-int osmo_cc_redir_reason_name2value(const char *name);
-
-/* notification indicator, see ITU-T Rec. Q.931 ff. */
-#define OSMO_CC_NOTIFY_USER_SUSPENDED 0x00
-#define OSMO_CC_NOTIFY_USER_RESUMED 0x01
-#define OSMO_CC_NOTIFY_BEARER_SERVICE_CHANGE 0x02
-#define OSMO_CC_NOTIFY_CALL_COMPLETION_DELAY 0x03
-#define OSMO_CC_NOTIFY_CONFERENCE_ESTABLISHED 0x42
-#define OSMO_CC_NOTIFY_CONFERENCE_DISCONNECTED 0x43
-#define OSMO_CC_NOTIFY_OTHER_PARTY_ADDED 0x44
-#define OSMO_CC_NOTIFY_ISOLATED 0x45
-#define OSMO_CC_NOTIFY_REATTACHED 0x46
-#define OSMO_CC_NOTIFY_OTHER_PARTY_ISOLATED 0x47
-#define OSMO_CC_NOTIFY_OTHER_PARTY_REATTACHED 0x48
-#define OSMO_CC_NOTIFY_OTHER_PARTY_SPLIT 0x49
-#define OSMO_CC_NOTIFY_OTHER_PARTY_DISCONNECTED 0x4a
-#define OSMO_CC_NOTIFY_CONFERENCE_FLOATING 0x4b
-#define OSMO_CC_NOTIFY_CONFERENCE_DISC_PREEMPT 0x4c /* disconnect preemted */
-#define OSMO_CC_NOTIFY_CONFERENCE_FLOATING_SUP 0x4f /* served user preemted */
-#define OSMO_CC_NOTIFY_CALL_IS_A_WAITING_CALL 0x60
-#define OSMO_CC_NOTIFY_DIVERSION_ACTIVATED 0x68
-#define OSMO_CC_NOTIFY_RESERVED_CT_1 0x69
-#define OSMO_CC_NOTIFY_RESERVED_CT_2 0x6a
-#define OSMO_CC_NOTIFY_REVERSE_CHARGING 0x6e
-#define OSMO_CC_NOTIFY_REMOTE_HOLD 0x79
-#define OSMO_CC_NOTIFY_REMOTE_RETRIEVAL 0x7a
-#define OSMO_CC_NOTIFY_CALL_IS_DIVERTING 0x7b
-#define OSMO_CC_NOTIFY_NUM 0x100
-
-const char *osmo_cc_notify_value2name(int value);
-int osmo_cc_notify_name2value(const char *name);
-
-/* coding standard, see ITU-T Rec. Q.931 */
-#define OSMO_CC_CODING_ITU_T 0
-#define OSMO_CC_CODING_ISO_IEC 1
-#define OSMO_CC_CODING_NATIONAL 2
-#define OSMO_CC_CODING_STANDARD_SPECIFIC 3
-#define OSMO_CC_CODING_NUM 4
-
-const char *osmo_cc_coding_value2name(int value);
-int osmo_cc_coding_name2value(const char *name);
-
-/* cause, see ITU-T Rec. Q.850 */
-#define OSMO_CC_ISDN_CAUSE_UNASSIGNED_NR 1
-#define OSMO_CC_ISDN_CAUSE_NO_ROUTE_TRANSIT 2
-#define OSMO_CC_ISDN_CAUSE_NO_ROUTE 3
-#define OSMO_CC_ISDN_CAUSE_CHAN_UNACCEPT 6
-#define OSMO_CC_ISDN_CAUSE_OP_DET_BARRING 8
-#define OSMO_CC_ISDN_CAUSE_NORM_CALL_CLEAR 16
-#define OSMO_CC_ISDN_CAUSE_USER_BUSY 17
-#define OSMO_CC_ISDN_CAUSE_USER_NOTRESPOND 18
-#define OSMO_CC_ISDN_CAUSE_USER_ALERTING_NA 19
-#define OSMO_CC_ISDN_CAUSE_CALL_REJECTED 21
-#define OSMO_CC_ISDN_CAUSE_NUMBER_CHANGED 22
-#define OSMO_CC_ISDN_CAUSE_PRE_EMPTION 25
-#define OSMO_CC_ISDN_CAUSE_NONSE_USER_CLR 26
-#define OSMO_CC_ISDN_CAUSE_DEST_OOO 27
-#define OSMO_CC_ISDN_CAUSE_INV_NR_FORMAT 28
-#define OSMO_CC_ISDN_CAUSE_FACILITY_REJ 29
-#define OSMO_CC_ISDN_CAUSE_RESP_STATUS_INQ 30
-#define OSMO_CC_ISDN_CAUSE_NORMAL_UNSPEC 31
-#define OSMO_CC_ISDN_CAUSE_NO_CIRCUIT_CHAN 34
-#define OSMO_CC_ISDN_CAUSE_NETWORK_OOO 38
-#define OSMO_CC_ISDN_CAUSE_TEMP_FAILURE 41
-#define OSMO_CC_ISDN_CAUSE_SWITCH_CONG 42
-#define OSMO_CC_ISDN_CAUSE_ACC_INF_DISCARD 43
-#define OSMO_CC_ISDN_CAUSE_REQ_CHAN_UNAVAIL 44
-#define OSMO_CC_ISDN_CAUSE_RESOURCE_UNAVAIL 47
-#define OSMO_CC_ISDN_CAUSE_QOS_UNAVAIL 49
-#define OSMO_CC_ISDN_CAUSE_REQ_FAC_NOT_SUBSC 50
-#define OSMO_CC_ISDN_CAUSE_INC_BARRED_CUG 55
-#define OSMO_CC_ISDN_CAUSE_BEARER_CAP_UNAUTH 57
-#define OSMO_CC_ISDN_CAUSE_BEARER_CA_UNAVAIL 58
-#define OSMO_CC_ISDN_CAUSE_SERV_OPT_UNAVAIL 63
-#define OSMO_CC_ISDN_CAUSE_BEARERSERV_UNIMPL 65
-#define OSMO_CC_ISDN_CAUSE_ACM_GE_ACM_MAX 68
-#define OSMO_CC_ISDN_CAUSE_REQ_FAC_NOTIMPL 69
-#define OSMO_CC_ISDN_CAUSE_RESTR_BCAP_AVAIL 70
-#define OSMO_CC_ISDN_CAUSE_SERV_OPT_UNIMPL 79
-#define OSMO_CC_ISDN_CAUSE_INVAL_CALLREF 81
-#define OSMO_CC_ISDN_CAUSE_USER_NOT_IN_CUG 87
-#define OSMO_CC_ISDN_CAUSE_INCOMPAT_DEST 88
-#define OSMO_CC_ISDN_CAUSE_INVAL_TRANS_NET 91
-#define OSMO_CC_ISDN_CAUSE_SEMANTIC_INCORR 95
-#define OSMO_CC_ISDN_CAUSE_INVAL_MAND_INF 96
-#define OSMO_CC_ISDN_CAUSE_MSGTYPE_NOTEXIST 97
-#define OSMO_CC_ISDN_CAUSE_MSGTYPE_INCOMPAT 98
-#define OSMO_CC_ISDN_CAUSE_IE_NOTEXIST 99
-#define OSMO_CC_ISDN_CAUSE_COND_IE_ERR 100
-#define OSMO_CC_ISDN_CAUSE_MSG_INCOMP_STATE 101
-#define OSMO_CC_ISDN_CAUSE_RECOVERY_TIMER 102
-#define OSMO_CC_ISDN_CAUSE_PROTO_ERR 111
-#define OSMO_CC_ISDN_CAUSE_INTERWORKING 127
-#define OSMO_CC_ISDN_CAUSE_NUM 128
-
-const char *osmo_cc_isdn_cause_value2name(int value);
-int osmo_cc_isdn_cause_name2value(const char *name);
-
-/* location, see ITU-T Rec. Q.931 */
-#define OSMO_CC_LOCATION_USER 0
-#define OSMO_CC_LOCATION_PRIV_SERV_LOC_USER 1
-#define OSMO_CC_LOCATION_PUB_SERV_LOC_USER 2
-#define OSMO_CC_LOCATION_TRANSIT 3
-#define OSMO_CC_LOCATION_PUB_SERV_REM_USER 4
-#define OSMO_CC_LOCATION_PRIV_SERV_REM_USER 5
-#define OSMO_CC_LOCATION_BEYOND_INTERWORKING 10
-#define OSMO_CC_LOCATION_NUM 16
-
-const char *osmo_cc_location_value2name(int value);
-int osmo_cc_location_name2value(const char *name);
-
-/* progress description, see ITU-T Rec. Q.931 */
-#define OSMO_CC_PROGRESS_NOT_END_TO_END_ISDN 1
-#define OSMO_CC_PROGRESS_DEST_NOT_ISDN 2
-#define OSMO_CC_PROGRESS_ORIG_NOT_ISDN 3
-#define OSMO_CC_PROGRESS_RETURN_TO_ISDN 4
-#define OSMO_CC_PROGRESS_INTERWORKING 5
-#define OSMO_CC_PROGRESS_INBAND_INFO_AVAILABLE 8
-#define OSMO_CC_PROGRESS_NUM 16
-
-const char *osmo_cc_progress_value2name(int value);
-int osmo_cc_progress_name2value(const char *name);
-
-/* information transfer capability, see ITU-T Rec. Q.931 */
-#define OSMO_CC_CAPABILITY_SPEECH 0
-#define OSMO_CC_CAPABILITY_DATA 8
-#define OSMO_CC_CAPABILITY_DATA_RESTRICTED 9
-#define OSMO_CC_CAPABILITY_AUDIO 16
-#define OSMO_CC_CAPABILITY_DATA_WITH_TONES 17
-#define OSMO_CC_CAPABILITY_VIDEO 24
-#define OSMO_CC_CAPABILITY_NUM 32
-
-const char *osmo_cc_capability_value2name(int value);
-int osmo_cc_capability_name2value(const char *name);
-
-/* transfer mode, see ITU-T Rec. Q.931 */
-#define OSMO_CC_MODE_CIRCUIT 0
-#define OSMO_CC_MODE_PACKET 2
-#define OSMO_CC_MODE_NUM 4
-
-const char *osmo_cc_mode_value2name(int value);
-int osmo_cc_mode_name2value(const char *name);
-
-#define OSMO_CC_DTMF_MODE_OFF 0 /* stop tone */
-#define OSMO_CC_DTMF_MODE_ON 1 /* start tone */
-#define OSMO_CC_DTMF_MODE_DIGITS 2 /* play tone(s) with duration and pauses */
-#define OSMO_CC_DTMF_MODE_NUM 3
-
-const char *osmo_cc_dtmf_mode_value2name(int value);
-int osmo_cc_dtmf_mode_name2value(const char *name);
-
-#define OSMO_CC_SOCKET_CAUSE_VERSION_MISMATCH 1 /* version mismatch */
-#define OSMO_CC_SOCKET_CAUSE_FAILED 2 /* connection failed */
-#define OSMO_CC_SOCKET_CAUSE_BROKEN_PIPE 3 /* connected socket failed */
-#define OSMO_CC_SOCKET_CAUSE_TIMEOUT 4 /* keepalive packets timeout */
-// if you add causes here, add them in process_cause.c also!
-#define OSMO_CC_SOCKET_CAUSE_NUM 5
-
-const char *osmo_cc_socket_cause_value2name(int value);
-int osmo_cc_socket_cause_name2value(const char *name);
-
-/* network type (network IE) and meaning of 'id' */
-#define OSMO_CC_NETWORK_UNDEFINED 0x00
-#define OSMO_CC_NETWORK_ALSA_NONE 0x01
-#define OSMO_CC_NETWORK_POTS_NONE 0x02
-#define OSMO_CC_NETWORK_ISDN_NONE 0x03
-#define OSMO_CC_NETWORK_SIP_NONE 0x04
-#define OSMO_CC_NETWORK_GSM_IMSI 0x05 /* id has decimal IMSI */
-#define OSMO_CC_NETWORK_GSM_IMEI 0x06 /* id has decimal IMEI */
-#define OSMO_CC_NETWORK_WEB_NONE 0x07
-#define OSMO_CC_NETWORK_DECT_NONE 0x08
-#define OSMO_CC_NETWORK_BLUETOOTH_NONE 0x09
-#define OSMO_CC_NETWORK_SS5_NONE 0x0a
-#define OSMO_CC_NETWORK_ANETZ_NONE 0x80
-#define OSMO_CC_NETWORK_BNETZ_MUENZ 0x81 /* id starts with 'M' */
-#define OSMO_CC_NETWORK_CNETZ_NONE 0x82
-#define OSMO_CC_NETWORK_NMT_NONE 0x83 /* id has decimal password */
-#define OSMO_CC_NETWORK_R2000_NONE 0x84
-#define OSMO_CC_NETWORK_AMPS_ESN 0x85 /* if has decimal ESN (TACS also) */
-#define OSMO_CC_NETWORK_MTS_NONE 0x86
-#define OSMO_CC_NETWORK_IMTS_NONE 0x87
-#define OSMO_CC_NETWORK_EUROSIGNAL_NONE 0x88
-#define OSMO_CC_NETWORK_JOLLYCOM_NONE 0x89 /* call from JollyCom... */
-#define OSMO_CC_NETWORK_MPT1327_PSTN 0x8a /* call from MPT1327 */
-#define OSMO_CC_NETWORK_MPT1327_PBX 0x8b /* id is selected PBX number */
-#define OSMO_CC_NETWORK_NUM 0x100
-
-const char *osmo_cc_network_value2name(int value);
-int osmo_cc_network_name2value(const char *name);
-
-typedef struct osmo_cc_msg {
- uint8_t type;
- uint16_t length_networkorder;
- uint8_t data[0];
-} __attribute__((packed)) osmo_cc_msg_t;
-
-typedef struct osmo_cc_msg_list {
- struct osmo_cc_msg_list *next;
- struct osmo_cc_msg *msg;
- uint32_t callref;
- char host[128];
- uint16_t port;
-} osmo_cc_msg_list_t;
-
-typedef struct osmo_cc_ie {
- uint8_t type;
- uint16_t length_networkorder;
- uint8_t data[0];
-} __attribute__((packed)) osmo_cc_ie_t;
-
-struct osmo_cc_ie_called {
- uint8_t type;
- uint8_t plan;
- char digits[0];
-} __attribute__((packed));
-
-struct osmo_cc_ie_called_sub {
- uint8_t type;
- char digits[0];
-} __attribute__((packed));
-
-struct osmo_cc_ie_called_name {
- char name[0];
-} __attribute__((packed));
-
-struct osmo_cc_ie_called_interface {
- char name[0];
-} __attribute__((packed));
-
-struct osmo_cc_ie_calling {
- uint8_t type;
- uint8_t plan;
- uint8_t present;
- uint8_t screen;
- char digits[0];
-} __attribute__((packed));
-
-struct osmo_cc_ie_calling_sub {
- uint8_t type;
- char digits[0];
-} __attribute__((packed));
-
-struct osmo_cc_ie_calling_name {
- char name[0];
-} __attribute__((packed));
-
-struct osmo_cc_ie_calling_interface {
- char name[0];
-} __attribute__((packed));
-
-struct osmo_cc_ie_network {
- uint8_t type;
- char id[0];
-} __attribute__((packed));
-
-struct osmo_cc_ie_bearer {
- uint8_t coding;
- uint8_t capability;
- uint8_t mode;
-} __attribute__((packed));
-
-struct osmo_cc_ie_redir {
- uint8_t type;
- uint8_t plan;
- uint8_t present;
- uint8_t screen;
- uint8_t redir_reason;
- char digits[0];
-} __attribute__((packed));
-
-struct osmo_cc_ie_dtmf {
- uint8_t duration_ms;
- uint8_t pause_ms;
- uint8_t dtmf_mode;
- char digits[0];
-} __attribute__((packed));
-
-struct osmo_cc_ie_keypad {
- char digits[0];
-} __attribute__((packed));
-
-struct osmo_cc_ie_progress {
- uint8_t coding;
- uint8_t location;
- uint8_t progress;
-} __attribute__((packed));
-
-struct osmo_cc_ie_notify {
- uint8_t notify;
-} __attribute__((packed));
-
-struct osmo_cc_ie_cause {
- uint8_t location;
- uint8_t isdn_cause;
- uint16_t sip_cause_networkorder;
- uint8_t socket_cause;
-} __attribute__((packed));
-
-struct osmo_cc_ie_display {
- char text[0];
-} __attribute__((packed));
-
-struct osmo_cc_ie_sdp {
- char sdp[0];
-} __attribute__((packed));
-
-struct osmo_cc_ie_socket_address {
- char address[0];
-} __attribute__((packed));
-
-struct osmo_cc_ie_private {
- uint32_t unique_networkorder;
- uint8_t data[0];
-} __attribute__((packed));
-
-uint32_t osmo_cc_new_callref(void);
-osmo_cc_msg_t *osmo_cc_new_msg(uint8_t msg_type);
-osmo_cc_msg_t *osmo_cc_clone_msg(osmo_cc_msg_t *msg);
-osmo_cc_msg_t *osmo_cc_msg_list_dequeue(osmo_cc_msg_list_t **mlp, uint32_t *callref_p);
-osmo_cc_msg_list_t *osmo_cc_msg_list_enqueue(osmo_cc_msg_list_t **mlp, osmo_cc_msg_t *msg, uint32_t callref);
-void osmo_cc_free_msg(osmo_cc_msg_t *msg);
-void osmo_cc_debug_ie(osmo_cc_msg_t *msg, int level);
-int osmo_cc_get_ie_struct(osmo_cc_msg_t *msg, uint8_t ie_type, int ie_repeat, int ie_len, const osmo_cc_ie_t **ie_struct);
-int osmo_cc_get_ie_data(osmo_cc_msg_t *msg, uint8_t ie_type, int ie_repeat, int ie_len, const void **ie_data);
-int osmo_cc_has_ie(osmo_cc_msg_t *msg, uint8_t ie_type, int ie_repeat);
-int osmo_cc_remove_ie(osmo_cc_msg_t *msg, uint8_t ie_type, int ie_repeat);
-void *osmo_cc_add_ie(osmo_cc_msg_t *msg, uint8_t ie_type, int ie_len);
-void *osmo_cc_msg_sep_ie(osmo_cc_msg_t *msg, void **iep, uint8_t *ie_type, uint16_t *ie_length);
-
-void osmo_cc_add_ie_called(osmo_cc_msg_t *msg, uint8_t type, uint8_t plan, const char *dialing);
-int osmo_cc_get_ie_called(osmo_cc_msg_t *msg, int ie_repeat, uint8_t *type, uint8_t *plan, char *dialing, size_t dialing_size);
-void osmo_cc_add_ie_called_sub(osmo_cc_msg_t *msg, uint8_t type, const char *dialing);
-int osmo_cc_get_ie_called_sub(osmo_cc_msg_t *msg, int ie_repeat, uint8_t *type, char *dialing, size_t dialing_size);
-void osmo_cc_add_ie_called_name(osmo_cc_msg_t *msg, const char *name);
-int osmo_cc_get_ie_called_name(osmo_cc_msg_t *msg, int ie_repeat, char *name, size_t name_size);
-void osmo_cc_add_ie_called_interface(osmo_cc_msg_t *msg, const char *interface);
-int osmo_cc_get_ie_called_interface(osmo_cc_msg_t *msg, int ie_repeat, char *interface, size_t interface_size);
-void osmo_cc_add_ie_complete(osmo_cc_msg_t *msg);
-int osmo_cc_get_ie_complete(osmo_cc_msg_t *msg, int ie_repeat);
-void osmo_cc_add_ie_calling(osmo_cc_msg_t *msg, uint8_t type, uint8_t plan, uint8_t present, uint8_t screen, const char *callerid);
-int osmo_cc_get_ie_calling(osmo_cc_msg_t *msg, int ie_repeat, uint8_t *type, uint8_t *plan, uint8_t *present, uint8_t *screen, char *callerid, size_t callerid_size);
-void osmo_cc_add_ie_calling_sub(osmo_cc_msg_t *msg, uint8_t type, const char *callerid);
-int osmo_cc_get_ie_calling_sub(osmo_cc_msg_t *msg, int ie_repeat, uint8_t *type, char *callerid, size_t callerid_size);
-void osmo_cc_add_ie_calling_name(osmo_cc_msg_t *msg, const char *name);
-int osmo_cc_get_ie_calling_name(osmo_cc_msg_t *msg, int ie_repeat, char *name, size_t name_size);
-void osmo_cc_add_ie_calling_interface(osmo_cc_msg_t *msg, const char *interface);
-int osmo_cc_get_ie_calling_interface(osmo_cc_msg_t *msg, int ie_repeat, char *interface, size_t interface_size);
-void osmo_cc_add_ie_calling_network(osmo_cc_msg_t *msg, uint8_t type, const char *networkid);
-int osmo_cc_get_ie_calling_network(osmo_cc_msg_t *msg, int ie_repeat, uint8_t *type, char *networkid, size_t networkid_size);
-void osmo_cc_add_ie_bearer(osmo_cc_msg_t *msg, uint8_t coding, uint8_t capability, uint8_t mode);
-int osmo_cc_get_ie_bearer(osmo_cc_msg_t *msg, int ie_repeat, uint8_t *coding, uint8_t *capability, uint8_t *mode);
-void osmo_cc_add_ie_redir(osmo_cc_msg_t *msg, uint8_t type, uint8_t plan, uint8_t present, uint8_t screen, uint8_t redir_reason, const char *callerid);
-int osmo_cc_get_ie_redir(osmo_cc_msg_t *msg, int ie_repeat, uint8_t *type, uint8_t *plan, uint8_t *present, uint8_t *screen, uint8_t *reason, char *callerid, size_t callerid_size);
-void osmo_cc_add_ie_dtmf(osmo_cc_msg_t *msg, uint8_t duration_ms, uint8_t pause_ms, uint8_t dtmf_mode, const char *digits);
-int osmo_cc_get_ie_dtmf(osmo_cc_msg_t *msg, int ie_repeat, uint8_t *duration_ms, uint8_t *pause_ms, uint8_t *dtmf_mode, char *digits, size_t digits_size);
-void osmo_cc_add_ie_keypad(osmo_cc_msg_t *msg, const char *digits);
-int osmo_cc_get_ie_keypad(osmo_cc_msg_t *msg, int ie_repeat, char *digits, size_t digits_size);
-void osmo_cc_add_ie_progress(osmo_cc_msg_t *msg, uint8_t coding, uint8_t location, uint8_t progress);
-int osmo_cc_get_ie_progress(osmo_cc_msg_t *msg, int ie_repeat, uint8_t *coding, uint8_t *location, uint8_t *progress);
-void osmo_cc_add_ie_notify(osmo_cc_msg_t *msg, uint8_t notify);
-int osmo_cc_get_ie_notify(osmo_cc_msg_t *msg, int ie_repeat, uint8_t *notify);
-void osmo_cc_add_ie_cause(osmo_cc_msg_t *msg, uint8_t location, uint8_t isdn_cause, uint16_t sip_cause, uint8_t socket_cause);
-int osmo_cc_get_ie_cause(osmo_cc_msg_t *msg, int ie_repeat, uint8_t *location, uint8_t *isdn_cause, uint16_t *sip_cause, uint8_t *socket_cause);
-void osmo_cc_add_ie_display(osmo_cc_msg_t *msg, const char *text);
-int osmo_cc_get_ie_display(osmo_cc_msg_t *msg, int ie_repeat, char *text, size_t text_size);
-void osmo_cc_add_ie_sdp(osmo_cc_msg_t *msg, const char *sdp);
-int osmo_cc_get_ie_sdp(osmo_cc_msg_t *msg, int ie_repeat, char *sdp, size_t sdp_size);
-void osmo_cc_add_ie_socket_address(osmo_cc_msg_t *msg, const char *address);
-int osmo_cc_get_ie_socket_address(osmo_cc_msg_t *msg, int ie_repeat, char *address, size_t address_size);
-void osmo_cc_add_ie_private(osmo_cc_msg_t *msg, uint32_t unique, const uint8_t *data, size_t data_size);
-int osmo_cc_get_ie_private(osmo_cc_msg_t *msg, int ie_repeat, uint32_t *unique, uint8_t *data, size_t data_size);
-
-#endif /* OSMO_CC_MSG_H */
diff --git a/src/libosmocc/rtp.c b/src/libosmocc/rtp.c
deleted file mode 100644
index fc70748..0000000
--- a/src/libosmocc/rtp.c
+++ /dev/null
@@ -1,404 +0,0 @@
-/* Osmo-CC: RTP handling
- *
- * (C) 2016 by Andreas Eversberg <jolly@eversberg.eu>
- * All Rights Reserved
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <string.h>
-#include <errno.h>
-#include <sys/socket.h>
-#include <arpa/inet.h>
-#include "../libdebug/debug.h"
-#include "../libtimer/timer.h"
-#include "endpoint.h"
-
-#define RTP_VERSION 2
-
-void osmo_cc_set_rtp_ports(osmo_cc_session_config_t *conf, uint16_t from, uint16_t to)
-{
- conf->rtp_port_next = from;
- conf->rtp_port_from = from;
- conf->rtp_port_to = to;
-}
-
-struct rtp_hdr {
- uint8_t byte0;
- uint8_t byte1;
- uint16_t sequence;
- uint32_t timestamp;
- uint32_t ssrc;
-} __attribute__((packed));
-
-struct rtp_x_hdr {
- uint16_t by_profile;
- uint16_t length;
-} __attribute__((packed));
-
-static int rtp_receive(int sock, uint8_t **payload_p, int *payload_len_p, uint8_t *marker_p, uint8_t *pt_p, uint16_t *sequence_p, uint32_t *timestamp_p, uint32_t *ssrc_p)
-{
- static uint8_t data[2048];
- int len;
- struct rtp_hdr *rtph = (struct rtp_hdr *)data;
- uint8_t version, padding, extension, csrc_count, marker, payload_type;
- struct rtp_x_hdr *rtpxh;
- uint8_t *payload;
- int payload_len;
- int x_len;
-
- len = read(sock, data, sizeof(data));
- if (len < 0) {
- if (errno == EAGAIN)
- return -EAGAIN;
- PDEBUG(DCC, DEBUG_DEBUG, "Read errno = %d (%s)\n", errno, strerror(errno));
- return -EIO;
- }
- if (len < 12) {
- PDEBUG(DCC, DEBUG_NOTICE, "Received RTP frame too short (len = %d).\n", len);
- return -EINVAL;
- }
-
- version = rtph->byte0 >> 6;
- padding = (rtph->byte0 >> 5) & 1;
- extension = (rtph->byte0 >> 4) & 1;
- csrc_count = rtph->byte0 & 0x0f;
- marker = rtph->byte1 >> 7;
- payload_type = rtph->byte1 & 0x7f;
- *sequence_p = ntohs(rtph->sequence);
- *timestamp_p = ntohl(rtph->timestamp);
- *ssrc_p = ntohl(rtph->ssrc);
-
- if (version != RTP_VERSION) {
- PDEBUG(DCC, DEBUG_NOTICE, "Received RTP version %d not supported.\n", version);
- return -EINVAL;
- }
-
- payload = data + sizeof(*rtph) + (csrc_count << 2);
- payload_len = len - sizeof(*rtph) - (csrc_count << 2);
- if (payload_len < 0) {
- PDEBUG(DCC, DEBUG_NOTICE, "Received RTP frame too short (len = %d, csrc count = %d).\n", len, csrc_count);
- return -EINVAL;
- }
-
- if (extension) {
- if (payload_len < (int)sizeof(*rtpxh)) {
- PDEBUG(DCC, DEBUG_NOTICE, "Received RTP frame too short for extension header.\n");
- return -EINVAL;
- }
- rtpxh = (struct rtp_x_hdr *)payload;
- x_len = ntohs(rtpxh->length) * 4 + sizeof(*rtpxh);
- payload += x_len;
- payload_len -= x_len;
- if (payload_len < (int)sizeof(*rtpxh)) {
- PDEBUG(DCC, DEBUG_NOTICE, "Received RTP frame too short, extension header exceeds frame length.\n");
- return -EINVAL;
- }
- }
-
- if (padding) {
- if (payload_len < 1) {
- PDEBUG(DCC, DEBUG_NOTICE, "Received RTP frame too short for padding length.\n");
- return -EINVAL;
- }
- payload_len -= payload[payload_len - 1];
- if (payload_len < 0) {
- PDEBUG(DCC, DEBUG_NOTICE, "Received RTP frame padding is greater than payload.\n");
- return -EINVAL;
- }
- }
-
- *payload_p = payload;
- *payload_len_p = payload_len;
- *marker_p = marker;
- *pt_p = payload_type;
-
- return 0;
-}
-
-static void rtp_send(int sock, uint8_t *payload, int payload_len, uint8_t marker, uint8_t pt, uint16_t sequence, uint32_t timestamp, uint32_t ssrc)
-{
- struct rtp_hdr *rtph;
- char data[sizeof(*rtph) + payload_len];
- int len, rc;
-
- rtph = (struct rtp_hdr *)data;
- len = sizeof(*rtph);
- rtph->byte0 = RTP_VERSION << 6;
- rtph->byte1 = pt | (marker << 7);
- rtph->sequence = htons(sequence);
- rtph->timestamp = htonl(timestamp);
- rtph->ssrc = htonl(ssrc);
- len += payload_len;
- if (len > (int)sizeof(data)) {
- PDEBUG(DCC, DEBUG_NOTICE, "Buffer overflow, please fix!.\n");
- abort();
- }
- memcpy(data + sizeof(*rtph), payload, payload_len);
-
- rc = write(sock, data, len);
- if (rc < 0)
- PDEBUG(DCC, DEBUG_DEBUG, "Write errno = %d (%s)\n", errno, strerror(errno));
-}
-
-/* open and bind RTP
- * set local port to what we bound
- */
-int osmo_cc_rtp_open(osmo_cc_session_media_t *media)
-{
- osmo_cc_session_config_t *conf = media->session->config;
- int domain = 0; // make GCC happy
- uint16_t start_port;
- struct sockaddr_storage sa;
- int slen = 0; // make GCC happy
- struct sockaddr_in6 *sa6;
- struct sockaddr_in *sa4;
- uint16_t *sport;
- int flags;
- int rc;
-
- media->tx_ssrc = rand();
-
- osmo_cc_rtp_close(media);
-
- switch (media->connection_data_local.addrtype) {
- case osmo_cc_session_addrtype_ipv4:
- domain = AF_INET;
- memset(&sa, 0, sizeof(sa));
- sa4 = (struct sockaddr_in *)&sa;
- sa4->sin_family = domain;
- rc = inet_pton(AF_INET, media->connection_data_local.address, &sa4->sin_addr);
- if (rc < 1) {
-pton_error:
- PDEBUG(DCC, DEBUG_NOTICE, "Cannot bind to address '%s'.\n", media->connection_data_local.address);
- return -EINVAL;
- }
- sport = &sa4->sin_port;
- slen = sizeof(*sa4);
- break;
- case osmo_cc_session_addrtype_ipv6:
- domain = AF_INET6;
- memset(&sa, 0, sizeof(sa));
- sa6 = (struct sockaddr_in6 *)&sa;
- sa6->sin6_family = domain;
- rc = inet_pton(AF_INET6, media->connection_data_local.address, &sa6->sin6_addr);
- if (rc < 1)
- goto pton_error;
- sport = &sa6->sin6_port;
- slen = sizeof(*sa6);
- break;
- case osmo_cc_session_addrtype_unknown:
- PDEBUG(DCC, DEBUG_NOTICE, "Unsupported address type '%s'.\n", media->connection_data_local.addrtype_name);
- return -EINVAL;
- }
-
- /* rtp_port_from/rtp_port_to may be changed at run time, so rtp_port_next can become out of range. */
- if (conf->rtp_port_next < conf->rtp_port_from || conf->rtp_port_next > conf->rtp_port_to)
- conf->rtp_port_next = conf->rtp_port_from;
- start_port = conf->rtp_port_next;
- while (1) {
- /* open sockets */
- rc = socket(domain, SOCK_DGRAM, IPPROTO_UDP);
- if (rc < 0) {
-socket_error:
- PDEBUG(DCC, DEBUG_ERROR, "Cannot create socket (domain=%d, errno=%d(%s))\n", domain, errno, strerror(errno));
- osmo_cc_rtp_close(media);
- return -EIO;
- }
- media->rtp_socket = rc;
- rc = socket(domain, SOCK_DGRAM, IPPROTO_UDP);
- if (rc < 0)
- goto socket_error;
- media->rtcp_socket = rc;
-
- /* bind sockets */
- *sport = htons(conf->rtp_port_next);
- rc = bind(media->rtp_socket, (struct sockaddr *)&sa, slen);
- if (rc < 0) {
-bind_error:
- osmo_cc_rtp_close(media);
- conf->rtp_port_next = (conf->rtp_port_next + 2 > conf->rtp_port_to) ? conf->rtp_port_from : conf->rtp_port_next + 2;
- if (conf->rtp_port_next == start_port) {
- PDEBUG(DCC, DEBUG_ERROR, "Cannot bind socket (errno=%d(%s))\n", errno, strerror(errno));
- return -EIO;
- }
- continue;
- }
- *sport = htons(conf->rtp_port_next + 1);
- rc = bind(media->rtcp_socket, (struct sockaddr *)&sa, slen);
- if (rc < 0)
- goto bind_error;
- media->description.port_local = conf->rtp_port_next;
- conf->rtp_port_next = (conf->rtp_port_next + 2 > conf->rtp_port_to) ? conf->rtp_port_from : conf->rtp_port_next + 2;
- /* set nonblocking io */
- flags = fcntl(media->rtp_socket, F_GETFL);
- flags |= O_NONBLOCK;
- fcntl(media->rtp_socket, F_SETFL, flags);
- flags = fcntl(media->rtcp_socket, F_GETFL);
- flags |= O_NONBLOCK;
- fcntl(media->rtcp_socket, F_SETFL, flags);
- break;
- }
-
- PDEBUG(DCC, DEBUG_DEBUG, "Opening media port %d\n", media->description.port_local);
-
- return 0;
-}
-
-/* connect RTP
- * use remote port to connect to
- */
-int osmo_cc_rtp_connect(osmo_cc_session_media_t *media)
-{
- struct sockaddr_storage sa;
- int slen = 0; // make GCC happy
- struct sockaddr_in6 *sa6;
- struct sockaddr_in *sa4;
- uint16_t *sport;
- int rc;
-
- PDEBUG(DCC, DEBUG_DEBUG, "Connecting media port %d->%d\n", media->description.port_local, media->description.port_remote);
-
- switch (media->connection_data_remote.addrtype) {
- case osmo_cc_session_addrtype_ipv4:
- memset(&sa, 0, sizeof(sa));
- sa4 = (struct sockaddr_in *)&sa;
- sa4->sin_family = AF_INET;
- rc = inet_pton(AF_INET, media->connection_data_remote.address, &sa4->sin_addr);
- if (rc < 1) {
-pton_error:
- PDEBUG(DCC, DEBUG_NOTICE, "Cannot connect to address '%s'.\n", media->connection_data_remote.address);
- return -EINVAL;
- }
- sport = &sa4->sin_port;
- slen = sizeof(*sa4);
- break;
- case osmo_cc_session_addrtype_ipv6:
- memset(&sa, 0, sizeof(sa));
- sa6 = (struct sockaddr_in6 *)&sa;
- sa6->sin6_family = AF_INET6;
- rc = inet_pton(AF_INET6, media->connection_data_remote.address, &sa6->sin6_addr);
- if (rc < 1)
- goto pton_error;
- sport = &sa6->sin6_port;
- slen = sizeof(*sa6);
- break;
- case osmo_cc_session_addrtype_unknown:
- PDEBUG(DCC, DEBUG_NOTICE, "Unsupported address type '%s'.\n", media->connection_data_local.addrtype_name);
- return -EINVAL;
- }
-
- *sport = htons(media->description.port_remote);
- rc = connect(media->rtp_socket, (struct sockaddr *)&sa, slen);
- if (rc < 0) {
-connect_error:
- PDEBUG(DCC, DEBUG_NOTICE, "Cannot connect to address '%s'.\n", media->connection_data_remote.address);
- osmo_cc_rtp_close(media);
- return -EIO;
- }
- *sport = htons(media->description.port_remote + 1);
- rc = connect(media->rtcp_socket, (struct sockaddr *)&sa, slen);
- if (rc < 0)
- goto connect_error;
-
- return 0;
-}
-
-/* send rtp data with given codec */
-void osmo_cc_rtp_send(osmo_cc_session_codec_t *codec, uint8_t *data, int len, uint8_t marker, int inc_sequence, int inc_timestamp, void *priv)
-{
- uint8_t *payload = NULL;
- int payload_len = 0;
-
- if (!codec || !codec->media->rtp_socket)
- return;
-
- if (codec->encoder)
- codec->encoder(data, len, &payload, &payload_len, priv);
- else {
- payload = data;
- payload_len = len;
- }
-
- rtp_send(codec->media->rtp_socket, payload, payload_len, marker, codec->payload_type_remote, codec->media->tx_sequence, codec->media->tx_timestamp, codec->media->tx_ssrc);
- codec->media->tx_sequence += inc_sequence;
- codec->media->tx_timestamp += inc_timestamp;
-
- if (codec->encoder)
- free(payload);
-}
-
-/* receive rtp data for given media, return < 0, if there is nothing this time */
-int osmo_cc_rtp_receive(osmo_cc_session_media_t *media, void *priv)
-{
- int rc;
- uint8_t *payload = NULL;
- int payload_len = 0;
- uint8_t marker;
- uint8_t payload_type;
- osmo_cc_session_codec_t *codec;
- uint8_t *data;
- int len;
-
- if (!media || media->rtp_socket <= 0)
- return -EIO;
-
- rc = rtp_receive(media->rtp_socket, &payload, &payload_len, &marker, &payload_type, &media->rx_sequence, &media->rx_timestamp, &media->rx_ssrc);
- if (rc < 0)
- return rc;
-
- /* search for codec */
- for (codec = media->codec_list; codec; codec = codec->next) {
-
- if (codec->payload_type_local == payload_type)
- break;
- }
- if (!codec) {
- PDEBUG(DCC, DEBUG_NOTICE, "Received RTP frame for unknown codec (payload_type = %d).\n", payload_type);
- return 0;
- }
-
- if (codec->decoder)
- codec->decoder(payload, payload_len, &data, &len, priv);
- else {
- data = payload;
- len = payload_len;
- }
-
- if (codec->media->receive)
- codec->media->receiver(codec, marker, media->rx_sequence, media->rx_timestamp, media->rx_ssrc, data, len);
-
- if (codec->decoder)
- free(data);
-
- return 0;
-}
-
-void osmo_cc_rtp_close(osmo_cc_session_media_t *media)
-{
- if (media->rtp_socket) {
- close(media->rtp_socket);
- media->rtp_socket = 0;
- }
- if (media->rtcp_socket) {
- close(media->rtcp_socket);
- media->rtcp_socket = 0;
- }
-}
-
diff --git a/src/libosmocc/rtp.h b/src/libosmocc/rtp.h
deleted file mode 100644
index f6e5632..0000000
--- a/src/libosmocc/rtp.h
+++ /dev/null
@@ -1,8 +0,0 @@
-
-void osmo_cc_set_rtp_ports(osmo_cc_session_config_t *conf, uint16_t from, uint16_t to);
-int osmo_cc_rtp_open(osmo_cc_session_media_t *media);
-int osmo_cc_rtp_connect(osmo_cc_session_media_t *media);
-void osmo_cc_rtp_send(osmo_cc_session_codec_t *codec, uint8_t *data, int len, uint8_t marker, int inc_sequence, int inc_timestamp, void *priv);
-int osmo_cc_rtp_receive(osmo_cc_session_media_t *media, void *priv);
-void osmo_cc_rtp_close(osmo_cc_session_media_t *media);
-
diff --git a/src/libosmocc/screen.c b/src/libosmocc/screen.c
deleted file mode 100644
index 5558f42..0000000
--- a/src/libosmocc/screen.c
+++ /dev/null
@@ -1,693 +0,0 @@
-/* Endpoint and call process handling
- *
- * (C) 2019 by Andreas Eversberg <jolly@eversberg.eu>
- * All Rights Reserved
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <stdio.h>
-#include <errno.h>
-#include <string.h>
-#include <stdlib.h>
-#include <arpa/inet.h>
-#include <unistd.h>
-#include "../libtimer/timer.h"
-#include "../libdebug/debug.h"
-#include "endpoint.h"
-#include "message.h"
-
-#define SCREEN_QUESTIONMARK 1
-#define SCREEN_STAR 2
-#define SCREEN_AT 3
-
-void osmo_cc_help_screen(void)
-{
- printf("Screening options:\n\n");
-
- printf("screen-calling-in [attrs] <current caller ID> [attrs] <new caller ID>\n");
- printf("screen-called-in [attrs] <current dialed number> [attrs] <new dialed number>\n");
- printf("screen-calling-out [attrs] <current caller ID> [attrs] <new caller ID>\n");
- printf("screen-called-out [attrs] <current dialed number> [attrs] <new dialed number>\n\n");
-
- printf("These options allow to screen an incoming or outgoing caller ID or dialed\n");
- printf("number. If 'the current caller ID' or 'current dialed number' matches, it will\n");
- printf("be replaced by 'new caller ID' or 'new dialed number'. 'incoming' means from\n");
- printf(" the interface and 'outgoing' means towards the interface.\n\n");
-
- printf("Attributes prior 'current caller ID' or 'new dialed number' may be used to\n");
- printf("perform screening only if the attribute match. Attributes prior\n");
- printf("'new caller ID' or 'new dialed number' may be used to alter them. Attribute to\n");
- printf("define the type of number can be: 'unknown', 'international', 'national',\n");
- printf("'network', 'subscriber', 'abbreviated' Attribute to define the restriction of a\n");
- printf("caller ID: 'allowed', 'restricted'\n\n");
-
- printf("The current caller ID or dialed number may contain one or more '?', to allow\n");
- printf("any digit to match. The current caller ID or dialed number may contain a '*',\n");
- printf("to allow any suffix to match from now on. The new caller ID or dialed number\n");
- printf("may contain a '*', to append the suffix from the current caller ID or dialed\n");
- printf("number.\n\n");
-
- printf("When screening an incoming caller ID or dialed number, the '@' can be appended\n");
- printf("to the 'new caller ID', followed by a 'host:port', to route call to a special\n");
- printf("Osmo-CC endpoint. This way it is possible to do simple routing.\n\n");
-}
-
-char *osmo_cc_strtok_quotes(const char **text_p)
-{
- static char token[1024];
- const char *text = *text_p;
- int i, quote;
-
- /* skip spaces */
- while (*text) {
- if (*text > 32)
- break;
- text++;
- }
-
- /* if eol, return NULL */
- if (!(*text))
- return NULL;
-
- i = 0;
- quote = 0;
- while (*text) {
- /* escape allows all following characters */
- if (*text == '\\') {
- text++;
- if (*text)
- token[i++] = *text++;
- continue;
- }
- /* no quote, check for them or break on white space */
- if (quote == 0) {
- if (*text == '\'') {
- quote = 1;
- text++;
- continue;
- }
- if (*text == '\"') {
- quote = 2;
- text++;
- continue;
- }
- if (*text <= ' ')
- break;
- }
- /* single quote, check for unquote */
- if (quote == 1 && *text == '\'') {
- quote = 0;
- text++;
- continue;
- }
- /* double quote, check for unquote */
- if (quote == 2 && *text == '\"') {
- quote = 0;
- text++;
- continue;
- }
- /* copy character */
- token[i++] = *text++;
- }
- token[i] = '\0';
-
- *text_p = text;
- return token;
-}
-
-int osmo_cc_add_screen(osmo_cc_endpoint_t *ep, const char *text)
-{
- osmo_cc_screen_list_t **list_p = NULL, *list;
- const char *token;
- int no_present = 0, calling_in = 0, star_used, at_used;
- int i, j;
-
- star_used = 0;
- if (!strncasecmp(text, "screen-calling-in", 17)) {
- text += 17;
- list_p = &ep->screen_calling_in;
- no_present = 1;
- calling_in = 1;
- } else if (!strncasecmp(text, "screen-called-in", 16)) {
- text += 16;
- list_p = &ep->screen_called_in;
- calling_in = 1;
- } else if (!strncasecmp(text, "screen-calling-out", 18)) {
- text += 18;
- list_p = &ep->screen_calling_out;
- no_present = 1;
- } else if (!strncasecmp(text, "screen-called-out", 17)) {
- text += 17;
- list_p = &ep->screen_called_out;
- } else {
- PDEBUG(DCC, DEBUG_ERROR, "Invalid screening definition \"%s\". It must start with 'screen-calling-in' or 'screen-called-in' or 'screen-calling-out' or 'screen-called-out'\n", text);
- return -EINVAL;
- }
-
- /* skip space behind screen list string */
- while (*text) {
- if (*text > 32)
- break;
- text++;
- }
-
- list = calloc(1, sizeof(*list));
- if (!list)
- return -ENOMEM;
-
-next_from:
- token = osmo_cc_strtok_quotes(&text);
- if (!token) {
- free(list);
- PDEBUG(DCC, DEBUG_ERROR, "Missing 'from' string in screening definition \"%s\". If the string shall be empty, use double quotes. (\'\' or \"\")\n", text);
- return -EINVAL;
- }
- if (!strcasecmp(token, "unknown")) {
- list->has_from_type = 1;
- list->from_type = OSMO_CC_TYPE_UNKNOWN;
- goto next_from;
- } else
- if (!strcasecmp(token, "international")) {
- list->has_from_type = 1;
- list->from_type = OSMO_CC_TYPE_INTERNATIONAL;
- goto next_from;
- } else
- if (!strcasecmp(token, "national")) {
- list->has_from_type = 1;
- list->from_type = OSMO_CC_TYPE_NATIONAL;
- goto next_from;
- } else
- if (!strcasecmp(token, "network")) {
- list->has_from_type = 1;
- list->from_type = OSMO_CC_TYPE_NETWORK;
- goto next_from;
- } else
- if (!strcasecmp(token, "subscriber")) {
- list->has_from_type = 1;
- list->from_type = OSMO_CC_TYPE_SUBSCRIBER;
- goto next_from;
- } else
- if (!strcasecmp(token, "abbreviated")) {
- list->has_from_type = 1;
- list->from_type = OSMO_CC_TYPE_ABBREVIATED;
- goto next_from;
- } else
- if (!strcasecmp(token, "allowed")) {
- if (no_present) {
-no_present_error:
- free(list);
- PDEBUG(DCC, DEBUG_ERROR, "Error in screening definition '%s'.\n", text);
- PDEBUG(DCC, DEBUG_ERROR, "Keyword '%s' not allowed in screen entry for called number\n", token);
- return -EINVAL;
- }
- list->has_from_present = 1;
- list->from_present = OSMO_CC_PRESENT_ALLOWED;
- goto next_from;
- } else
- if (!strcasecmp(token, "restricted")) {
- if (no_present)
- goto no_present_error;
- list->has_from_present = 1;
- list->from_present = OSMO_CC_PRESENT_RESTRICTED;
- goto next_from;
- } else {
- star_used = 0;
- for (i = j = 0; token[i] && j < (int)sizeof(list->from) - 1; i++, j++) {
- if (token[i] == '?')
- list->from[j] = SCREEN_QUESTIONMARK;
- else
- if (token[i] == '*') {
- if (star_used) {
- free(list);
- PDEBUG(DCC, DEBUG_ERROR, "Error in screening definition '%s'.\n", text);
- PDEBUG(DCC, DEBUG_ERROR, "The '*' may be used only once.\n");
- return -EINVAL;
- }
- list->from[j] = SCREEN_STAR;
- star_used = 1;
- } else
- if (token[i] == '\\' && token[i + 1] != '\0')
- list->from[j] = token[++i];
- else
- list->from[j] = token[i];
- }
- list->from[j] = '\0';
- }
-
-next_to:
- token = osmo_cc_strtok_quotes(&text);
- if (!token) {
- free(list);
- PDEBUG(DCC, DEBUG_ERROR, "Error in screening definition '%s'.\n", text);
- PDEBUG(DCC, DEBUG_ERROR, "Missing screening result. If the string shall be empty, use double quotes. (\'\' or \"\")\n");
- return -EINVAL;
- }
- if (!strcasecmp(token, "unknown")) {
- list->has_to_type = 1;
- list->to_type = OSMO_CC_TYPE_UNKNOWN;
- goto next_to;
- } else
- if (!strcasecmp(token, "international")) {
- list->has_to_type = 1;
- list->to_type = OSMO_CC_TYPE_INTERNATIONAL;
- goto next_to;
- } else
- if (!strcasecmp(token, "national")) {
- list->has_to_type = 1;
- list->to_type = OSMO_CC_TYPE_NATIONAL;
- goto next_to;
- } else
- if (!strcasecmp(token, "network")) {
- list->has_to_type = 1;
- list->to_type = OSMO_CC_TYPE_NETWORK;
- goto next_to;
- } else
- if (!strcasecmp(token, "subscriber")) {
- list->has_to_type = 1;
- list->to_type = OSMO_CC_TYPE_SUBSCRIBER;
- goto next_to;
- } else
- if (!strcasecmp(token, "abbreviated")) {
- list->has_to_type = 1;
- list->to_type = OSMO_CC_TYPE_ABBREVIATED;
- goto next_to;
- } else
- if (!strcasecmp(token, "allowed")) {
- if (no_present)
- goto no_present_error;
- list->has_to_present = 1;
- list->to_present = OSMO_CC_PRESENT_ALLOWED;
- goto next_to;
- } else
- if (!strcasecmp(token, "restricted")) {
- if (no_present)
- goto no_present_error;
- list->has_to_present = 1;
- list->to_present = OSMO_CC_PRESENT_RESTRICTED;
- goto next_to;
- } else {
- at_used = star_used = 0;
- for (i = j = 0; token[i] && j < (int)sizeof(list->to) - 1; i++, j++) {
- if (token[i] == '*') {
- if (star_used) {
- free(list);
- PDEBUG(DCC, DEBUG_ERROR, "Error in screening definition '%s'.\n", text);
- PDEBUG(DCC, DEBUG_ERROR, "The '*' may be used only once.\n");
- return -EINVAL;
- }
- list->to[j] = SCREEN_STAR;
- star_used = 1;
- } else
- if (token[i] == '@') {
- if (!calling_in) {
- free(list);
- PDEBUG(DCC, DEBUG_ERROR, "Error in screening definition '%s'.\n", text);
- PDEBUG(DCC, DEBUG_ERROR, "The '@' may be used only for incoming calls from interface.\n");
- return -EINVAL;
- }
- if (at_used) {
- free(list);
- PDEBUG(DCC, DEBUG_ERROR, "Error in screening definition '%s'.\n", text);
- PDEBUG(DCC, DEBUG_ERROR, "The '@' may be used only once.\n");
- return -EINVAL;
- }
- list->to[j] = SCREEN_AT;
- at_used = 1;
- } else
- if (token[i] == '\\' && token[i + 1] != '\0')
- list->to[j] = token[++i];
- else
- list->to[j] = token[i];
- }
- list->to[j] = '\0';
- }
-
- token = osmo_cc_strtok_quotes(&text);
- if (token) {
- free(list);
- PDEBUG(DCC, DEBUG_ERROR, "Error in screening definition '%s'.\n", text);
- PDEBUG(DCC, DEBUG_ERROR, "Got garbage behind screening result.\n");
- return -EINVAL;
- }
-
- /* attach screen entry to list */
- while (*list_p)
- list_p = &((*list_p)->next);
- *list_p = list;
-
- return 0;
-}
-
-void osmo_cc_flush_screen(osmo_cc_screen_list_t *list)
-{
- osmo_cc_screen_list_t *temp;
-
- while (list) {
- temp = list;
- list = list->next;
- free(temp);
- }
-}
-
-const char *print_rule_string(const char *input)
-{
- static char output[256];
- int i;
-
- for (i = 0; *input && i < (int)sizeof(output) - 1; i++, input++) {
- switch (*input) {
- case SCREEN_QUESTIONMARK:
- output[i] = '?';
- break;
- case SCREEN_STAR:
- output[i] = '*';
- break;
- case SCREEN_AT:
- output[i] = '@';
- break;
- default:
- output[i] = *input;
- }
- }
-
- output[i] = '\0';
- return output;
-}
-
-static int osmo_cc_screen(const char *what, osmo_cc_screen_list_t *list, uint8_t *type, uint8_t *present, char *id_to, int id_to_size, const char *id_from, const char **routing_p)
-{
- const char *suffix;
- int i, j, rule;
-
- PDEBUG(DCC, DEBUG_INFO, "Screening %s '%s':\n", what, id_from);
- switch (*type) {
- case OSMO_CC_TYPE_UNKNOWN:
- PDEBUG(DCC, DEBUG_INFO, " -> type = unknown\n");
- break;
- case OSMO_CC_TYPE_INTERNATIONAL:
- PDEBUG(DCC, DEBUG_INFO, " -> type = international\n");
- break;
- case OSMO_CC_TYPE_NATIONAL:
- PDEBUG(DCC, DEBUG_INFO, " -> type = national\n");
- break;
- case OSMO_CC_TYPE_NETWORK:
- PDEBUG(DCC, DEBUG_INFO, " -> type = network\n");
- break;
- case OSMO_CC_TYPE_SUBSCRIBER:
- PDEBUG(DCC, DEBUG_INFO, " -> type = subscriber\n");
- break;
- case OSMO_CC_TYPE_ABBREVIATED:
- PDEBUG(DCC, DEBUG_INFO, " -> type = abbreviated\n");
- break;
- }
- if (present) switch (*present) {
- case OSMO_CC_PRESENT_ALLOWED:
- PDEBUG(DCC, DEBUG_INFO, " -> present = allowed\n");
- break;
- case OSMO_CC_PRESENT_RESTRICTED:
- PDEBUG(DCC, DEBUG_INFO, " -> present = restricted\n");
- break;
- }
-
- rule = 0;
- while (list) {
- rule++;
- PDEBUG(DCC, DEBUG_INFO, "Comparing with rule #%d: '%s':\n", rule, print_rule_string(list->from));
- if (list->has_from_type) switch (list->from_type) {
- case OSMO_CC_TYPE_UNKNOWN:
- PDEBUG(DCC, DEBUG_INFO, " -> type = unknown\n");
- break;
- case OSMO_CC_TYPE_INTERNATIONAL:
- PDEBUG(DCC, DEBUG_INFO, " -> type = international\n");
- break;
- case OSMO_CC_TYPE_NATIONAL:
- PDEBUG(DCC, DEBUG_INFO, " -> type = national\n");
- break;
- case OSMO_CC_TYPE_NETWORK:
- PDEBUG(DCC, DEBUG_INFO, " -> type = network\n");
- break;
- case OSMO_CC_TYPE_SUBSCRIBER:
- PDEBUG(DCC, DEBUG_INFO, " -> type = subscriber\n");
- break;
- case OSMO_CC_TYPE_ABBREVIATED:
- PDEBUG(DCC, DEBUG_INFO, " -> type = abbreviated\n");
- break;
- }
- if (list->has_from_present) switch (list->from_present) {
- case OSMO_CC_PRESENT_ALLOWED:
- PDEBUG(DCC, DEBUG_INFO, " -> present = allowed\n");
- break;
- case OSMO_CC_PRESENT_RESTRICTED:
- PDEBUG(DCC, DEBUG_INFO, " -> present = restricted\n");
- break;
- }
- suffix = NULL;
- /* attributes do not match */
- if (list->has_from_type && list->from_type != *type) {
- PDEBUG(DCC, DEBUG_INFO, "Rule does not match, because 'type' is different.\n");
- continue;
- }
- if (present && list->has_from_present && list->from_present != *present) {
- PDEBUG(DCC, DEBUG_INFO, "Rule does not match, because 'present' is different.\n");
- continue;
- }
- for (i = 0; list->from[i] && id_from[i]; i++) {
- /* '?' means: any digit, so it machtes */
- if (list->from[i] == SCREEN_QUESTIONMARK) {
- continue;
- }
- /* '*' means: anything may follow, so it machtes */
- if (list->from[i] == SCREEN_STAR) {
- suffix = id_from + i;
- break;
- }
- /* check if digit doesn't matches */
- if (list->from[i] != id_from[i])
- break;
- }
- /* if last checked digit is '*', we have a match */
- /* also if we hit EOL at id_from and next check digit is '*' */
- if (list->from[i] == SCREEN_STAR)
- break;
- /* if all digits have matched */
- if (list->from[i] == '\0' && id_from[i] == '\0')
- break;
- PDEBUG(DCC, DEBUG_INFO, "Rule does not match, because %s is different.\n", what);
- list = list->next;
- }
-
- /* if no list entry matches */
- if (!list)
- return -1;
-
- /* replace ID */
- if (list->has_to_type) {
- *type = list->to_type;
- }
- if (present && list->has_to_present) {
- *present = list->to_present;
- }
- for (i = j = 0; list->to[i]; i++) {
- if (j == id_to_size - 1)
- break;
- /* '*' means to use suffix of input string */
- if (list->to[i] == SCREEN_STAR && suffix) {
- while (*suffix) {
- id_to[j++] = *suffix++;
- if (j == id_to_size - 1)
- break;
- }
- continue;
- /* '@' means to stop and return routing also */
- } else if (list->to[i] == SCREEN_AT) {
- if (routing_p)
- *routing_p = &list->to[i + 1];
- break;
- }
- /* copy output digit */
- id_to[j++] = list->to[i];
- }
- id_to[j] = '\0';
-
- PDEBUG(DCC, DEBUG_INFO, "Rule matches, changing %s to '%s'.\n", what, print_rule_string(id_to));
- if (list->has_to_type) switch (list->to_type) {
- case OSMO_CC_TYPE_UNKNOWN:
- PDEBUG(DCC, DEBUG_INFO, " -> type = unknown\n");
- break;
- case OSMO_CC_TYPE_INTERNATIONAL:
- PDEBUG(DCC, DEBUG_INFO, " -> type = international\n");
- break;
- case OSMO_CC_TYPE_NATIONAL:
- PDEBUG(DCC, DEBUG_INFO, " -> type = national\n");
- break;
- case OSMO_CC_TYPE_NETWORK:
- PDEBUG(DCC, DEBUG_INFO, " -> type = network\n");
- break;
- case OSMO_CC_TYPE_SUBSCRIBER:
- PDEBUG(DCC, DEBUG_INFO, " -> type = subscriber\n");
- break;
- case OSMO_CC_TYPE_ABBREVIATED:
- PDEBUG(DCC, DEBUG_INFO, " -> type = abbreviated\n");
- break;
- }
- if (list->has_to_present) switch (list->to_present) {
- case OSMO_CC_PRESENT_ALLOWED:
- PDEBUG(DCC, DEBUG_INFO, " -> present = allowed\n");
- break;
- case OSMO_CC_PRESENT_RESTRICTED:
- PDEBUG(DCC, DEBUG_INFO, " -> present = restricted\n");
- break;
- }
- if (routing_p && *routing_p)
- PDEBUG(DCC, DEBUG_INFO, " -> remote = %s\n", *routing_p);
-
- return 0;
-}
-
-osmo_cc_msg_t *osmo_cc_screen_msg(osmo_cc_endpoint_t *ep, osmo_cc_msg_t *old_msg, int in, const char **routing_p)
-{
- osmo_cc_msg_t *new_msg;
- char id[256], calling[256], called[256], redir[256];
- uint8_t calling_type, calling_plan, calling_present, calling_screen;
- uint8_t called_type, called_plan;
- uint8_t redir_type, redir_plan, redir_present, redir_screen, redir_reason;
- int calling_status = 0, called_status = 0, redir_status = 0;
- int rc;
- void *ie, *to_ie;
- uint8_t ie_type;
- uint16_t ie_length;
- void *ie_value;
-
- if (in && ep->screen_calling_in) {
- rc = osmo_cc_get_ie_calling(old_msg, 0, &calling_type, &calling_plan, &calling_present, &calling_screen, id, sizeof(id));
- if (rc >= 0) {
- rc = osmo_cc_screen("incoming caller ID", ep->screen_calling_in, &calling_type, &calling_present, calling, sizeof(calling), id, routing_p);
- if (rc >= 0)
- calling_status = 1;
- } else {
- calling_type = OSMO_CC_TYPE_UNKNOWN;
- calling_plan = OSMO_CC_PLAN_TELEPHONY;
- calling_present = OSMO_CC_PRESENT_ALLOWED;
- calling_screen = OSMO_CC_SCREEN_NETWORK;
- rc = osmo_cc_screen("incoming caller ID", ep->screen_calling_in, &calling_type, &calling_present, calling, sizeof(calling), "", routing_p);
- if (rc >= 0)
- calling_status = 1;
- }
- rc = osmo_cc_get_ie_redir(old_msg, 0, &redir_type, &redir_plan, &redir_present, &redir_screen, &redir_reason, id, sizeof(id));
- if (rc >= 0) {
- rc = osmo_cc_screen("incoming redirecting number", ep->screen_calling_in, &redir_type, &redir_present, redir, sizeof(redir), id, NULL);
- if (rc >= 0)
- redir_status = 1;
- }
- }
- if (in && ep->screen_called_in) {
- rc = osmo_cc_get_ie_called(old_msg, 0, &called_type, &called_plan, id, sizeof(id));
- if (rc >= 0) {
- rc = osmo_cc_screen("incoming dialed number", ep->screen_called_in, &called_type, NULL, called, sizeof(called), id, routing_p);
- if (rc >= 0)
- called_status = 1;
- } else {
- called_type = OSMO_CC_TYPE_UNKNOWN;
- called_plan = OSMO_CC_PLAN_TELEPHONY;
- rc = osmo_cc_screen("incoming dialed number", ep->screen_called_in, &called_type, NULL, called, sizeof(called), "", routing_p);
- if (rc >= 0)
- called_status = 1;
- }
- }
- if (!in && ep->screen_calling_out) {
- rc = osmo_cc_get_ie_calling(old_msg, 0, &calling_type, &calling_plan, &calling_present, &calling_screen, id, sizeof(id));
- if (rc >= 0) {
- rc = osmo_cc_screen("outgoing caller ID", ep->screen_calling_out, &calling_type, &calling_present, calling, sizeof(calling), id, NULL);
- if (rc >= 0)
- calling_status = 1;
- } else {
- calling_type = OSMO_CC_TYPE_UNKNOWN;
- calling_plan = OSMO_CC_PLAN_TELEPHONY;
- calling_present = OSMO_CC_PRESENT_ALLOWED;
- calling_screen = OSMO_CC_SCREEN_NETWORK;
- rc = osmo_cc_screen("outgoing caller ID", ep->screen_calling_out, &calling_type, &calling_present, calling, sizeof(calling), "", NULL);
- if (rc >= 0)
- calling_status = 1;
- }
- rc = osmo_cc_get_ie_redir(old_msg, 0, &redir_type, &redir_plan, &redir_present, &redir_screen, &redir_reason, id, sizeof(id));
- if (rc >= 0) {
- rc = osmo_cc_screen("outgoing redirecting number", ep->screen_calling_out, &redir_type, &redir_present, redir, sizeof(redir), id, NULL);
- if (rc >= 0)
- redir_status = 1;
- }
- }
- if (!in && ep->screen_called_out) {
- rc = osmo_cc_get_ie_called(old_msg, 0, &called_type, &called_plan, id, sizeof(id));
- if (rc >= 0) {
- rc = osmo_cc_screen("outgoing dialed number", ep->screen_called_out, &called_type, NULL, called, sizeof(called), id, NULL);
- if (rc >= 0)
- called_status = 1;
- } else {
- called_type = OSMO_CC_TYPE_UNKNOWN;
- called_plan = OSMO_CC_PLAN_TELEPHONY;
- rc = osmo_cc_screen("outgoing dialed number", ep->screen_called_out, &called_type, NULL, called, sizeof(called), "", NULL);
- if (rc >= 0)
- called_status = 1;
- }
- }
-
- /* nothing screened */
- if (!calling_status && !called_status && !redir_status)
- return old_msg;
-
- new_msg = osmo_cc_new_msg(old_msg->type);
-
- /* copy and replace */
- ie = old_msg->data;
- while ((ie_value = osmo_cc_msg_sep_ie(old_msg, &ie, &ie_type, &ie_length))) {
- switch (ie_type) {
- case OSMO_CC_IE_CALLING:
- if (calling_status) {
- osmo_cc_add_ie_calling(new_msg, calling_type, calling_plan, calling_present, calling_screen, calling);
- calling_status = 0;
- break;
- }
- goto copy;
- case OSMO_CC_IE_CALLED:
- if (called_status) {
- osmo_cc_add_ie_called(new_msg, called_type, called_plan, called);
- called_status = 0;
- break;
- }
- goto copy;
- case OSMO_CC_IE_REDIR:
- if (redir_status) {
- osmo_cc_add_ie_redir(new_msg, redir_type, redir_plan, redir_present, redir_screen, redir_reason, redir);
- redir_status = 0;
- break;
- }
- goto copy;
- default:
- copy:
- to_ie = osmo_cc_add_ie(new_msg, ie_type, ie_length);
- memcpy(to_ie, ie_value, ie_length);
- }
- }
-
- /* applend, if not yet in message (except redir, since it must exist) */
- if (calling_status)
- osmo_cc_add_ie_calling(new_msg, calling_type, calling_plan, calling_present, calling_screen, calling);
- if (called_status)
- osmo_cc_add_ie_called(new_msg, called_type, called_plan, called);
-
- free(old_msg);
- return new_msg;
-}
-
diff --git a/src/libosmocc/screen.h b/src/libosmocc/screen.h
deleted file mode 100644
index 29f4515..0000000
--- a/src/libosmocc/screen.h
+++ /dev/null
@@ -1,7 +0,0 @@
-
-void osmo_cc_help_screen(void);
-char *osmo_cc_strtok_quotes(const char **text_p);
-int osmo_cc_add_screen(osmo_cc_endpoint_t *ep, const char *text);
-void osmo_cc_flush_screen(osmo_cc_screen_list_t *list);
-osmo_cc_msg_t *osmo_cc_screen_msg(osmo_cc_endpoint_t *ep, osmo_cc_msg_t *old_msg, int in, const char **routing_p);
-
diff --git a/src/libosmocc/sdp.c b/src/libosmocc/sdp.c
deleted file mode 100644
index 849bfb9..0000000
--- a/src/libosmocc/sdp.c
+++ /dev/null
@@ -1,544 +0,0 @@
-/* Session Description Protocol parsing and generator
- * This shall be simple and is incomplete.
- *
- * (C) 2019 by Andreas Eversberg <jolly@eversberg.eu>
- * All Rights Reserved
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdint.h>
-#include <errno.h>
-#include "../libdebug/debug.h"
-#include "../libtimer/timer.h"
-#include "endpoint.h"
-#include "sdp.h"
-
-#define strncat_printf(sdp, fmt, arg...) \
- { \
- snprintf(sdp + strlen(sdp), sizeof(sdp) - strlen(sdp), fmt, ## arg); \
- sdp[sizeof(sdp) - 1] = '\0'; \
- }
-
-/* generate SDP from session structure */
-char *osmo_cc_session_gensdp(osmo_cc_session_t *session)
-{
- /* calc max size of SDP: quick an dirty (close to max UDP payload size) */
- static char sdp[65000];
- const char *username, *sess_id, *sess_version, *nettype, *addrtype, *unicast_address;
- const char *session_name;
- int individual_connection_data = 1; /* in case there is no media, there is no connection data */
- int individual_send_receive = 1; /* in case there is no media, there is no send/receive attribute */
- struct osmo_cc_session_media *media;
- struct osmo_cc_session_codec *codec;
-
- sdp[0] = 0;
-
- /* Version */
- strncat_printf(sdp, "v=0\r\n");
-
- /* Origin */
- username = session->origin_local.username;
- sess_id = session->origin_local.sess_id;
- sess_version = session->origin_local.sess_version;
- nettype = session->origin_local.nettype;
- addrtype = session->origin_local.addrtype;
- unicast_address = session->origin_local.unicast_address;
- strncat_printf(sdp, "o=%s %s %s %s %s %s\r\n", username, sess_id, sess_version, nettype, addrtype, unicast_address);
-
- /* Session */
- session_name = session->name;
- strncat_printf(sdp, "s=%s\r\n", session_name);
-
- /* Connection Data (if all media have the same data) */
- if (session->media_list) {
- osmo_cc_session_for_each_media(session->media_list->next, media) {
- if (session->media_list->connection_data_local.nettype != media->connection_data_local.nettype)
- break;
- if (session->media_list->connection_data_local.addrtype != media->connection_data_local.addrtype)
- break;
- if (!!strcmp(session->media_list->connection_data_local.address, media->connection_data_local.address))
- break;
- }
- if (!media)
- individual_connection_data = 0;
- }
- if (!individual_connection_data)
- strncat_printf(sdp, "c=%s %s %s\r\n", osmo_cc_session_nettype2string(session->media_list->connection_data_local.nettype), osmo_cc_session_addrtype2string(session->media_list->connection_data_local.addrtype), session->media_list->connection_data_local.address);
-
- /* timestamp */
- strncat_printf(sdp, "t=0 0\r\n");
-
- /* sendonly /recvonly (if all media have the same data) */
- if (session->media_list) {
- osmo_cc_session_for_each_media(session->media_list->next, media) {
- if (session->media_list->send != media->send)
- break;
- if (session->media_list->receive != media->receive)
- break;
- }
- if (!media)
- individual_send_receive = 0;
- }
- if (!individual_send_receive) {
- if (session->media_list->send && !session->media_list->receive)
- strncat_printf(sdp, "a=sendonly\r\n");
- if (!session->media_list->send && session->media_list->receive)
- strncat_printf(sdp, "a=recvonly\r\n");
- if (!session->media_list->send && !session->media_list->receive)
- strncat_printf(sdp, "a=inactive\r\n");
- }
-
- /* media */
- osmo_cc_session_for_each_media(session->media_list, media) {
- strncat_printf(sdp, "m=%s %u %s",
- osmo_cc_session_media_type2string(media->description.type) ? : media->description.type_name,
- media->description.port_local,
- osmo_cc_session_media_proto2string(media->description.proto) ? : media->description.proto_name);
- osmo_cc_session_for_each_codec(media->codec_list, codec)
- strncat_printf(sdp, " %u", codec->payload_type_local);
- strncat_printf(sdp, "\r\n");
- /* don't list rtpmap when session was canceled by setting port to 0 */
- if (media->description.port_local == 0)
- continue;
- if (individual_connection_data)
- strncat_printf(sdp, "c=%s %s %s\r\n", osmo_cc_session_nettype2string(media->connection_data_local.nettype), osmo_cc_session_addrtype2string(media->connection_data_local.addrtype), media->connection_data_local.address);
- osmo_cc_session_for_each_codec(media->codec_list, codec) {
- strncat_printf(sdp, "a=rtpmap:%u %s/%d", codec->payload_type_local, codec->payload_name, codec->payload_rate);
- if (codec->payload_channels >= 2)
- strncat_printf(sdp, "/%d", codec->payload_channels);
- strncat_printf(sdp, "\r\n");
- }
- if (individual_send_receive) {
- if (media->send && !media->receive)
- strncat_printf(sdp, "a=sendonly\r\n");
- if (!media->send && media->receive)
- strncat_printf(sdp, "a=recvonly\r\n");
- if (!media->send && !media->receive)
- strncat_printf(sdp, "a=inactive\r\n");
- }
- }
-
- /* check for overflow and return */
- if (strlen(sdp) == sizeof(sdp) - 1) {
- PDEBUG(DCC, DEBUG_ERROR, "Fatal error: Allocated SDP buffer with %d bytes is too small, please fix!\n", (int)sizeof(sdp));
- return NULL;
- }
- return sdp;
-}
-
-/* separate a word from string that is delimited with one or more space characters */
-static char *wordsep(char **text_p)
-{
- char *text = *text_p;
- static char word[256];
- int i;
-
- /* no text */
- if (text == NULL || *text == '\0')
- return NULL;
- /* skip spaces before text */
- while (*text && *text <= ' ')
- text++;
- /* copy content */
- i = 0;
- while (*text > ' ' && i < (int)sizeof(word))
- word[i++] = *text++;
- word[i] = '\0';
- /* set next */
- *text_p = text;
- return word;
-}
-
-/*
- * codecs and their default values
- *
- * if format is -1, payload type is dynamic
- * if rate is 0, rate may be any rate
- */
-struct codec_defaults {
- int fmt;
- char *name;
- uint32_t rate;
- int channels;
-} codec_defaults[] = {
- { 0, "PCMU", 8000, 1 },
- { 3, "GSM", 8000, 1 },
- { 4, "G723", 8000, 1 },
- { 5, "DVI4", 8000, 1 },
- { 6, "DVI4", 16000, 1 },
- { 7, "LPC", 8000, 1 },
- { 8, "PCMA", 8000, 1 },
- { 9, "G722", 8000, 1 },
- { 10, "L16", 44100, 2 },
- { 11, "L16", 44100, 1 },
- { 12, "QCELP", 8000, 1 },
- { 13, "CN", 8000, 1 },
- { 14, "MPA", 90000, 1 },
- { 15, "G728", 8000, 1 },
- { 16, "DVI4", 11025, 1 },
- { 17, "DVI4", 22050, 1 },
- { 18, "G729", 8000, 1 },
- { 25, "CELB", 90000, 0 },
- { 26, "JPEG", 90000, 0 },
- { 28, "nv", 90000, 0 },
- { 31, "H261", 90000, 0 },
- { 32, "MPV", 90000, 0 },
- { 33, "MP2T", 90000, 0 },
- { 34, "H263", 90000, 0 },
- { -1, NULL, 0, 0 },
-};
-
-static void complete_codec_by_fmt(uint8_t fmt, const char **name, uint32_t *rate, int *channels)
-{
- int i;
-
- for (i = 0; codec_defaults[i].name; i++) {
- if (codec_defaults[i].fmt == fmt)
- break;
- }
- if (!codec_defaults[i].name)
- return;
-
- free((char *)*name);
- *name = strdup(codec_defaults[i].name);
- *rate = codec_defaults[i].rate;
- *channels = codec_defaults[i].channels;
-}
-
-int osmo_cc_payload_type_by_attrs(uint8_t *fmt, const char *name, uint32_t *rate, int *channels)
-{
- int i;
-
- for (i = 0; codec_defaults[i].name; i++) {
- if (!strcmp(codec_defaults[i].name, name)
- && (*rate == 0 || codec_defaults[i].rate == *rate)
- && (*channels == 0 || codec_defaults[i].channels == *channels))
- break;
- }
- if (!codec_defaults[i].name)
- return -EINVAL;
-
- *fmt = codec_defaults[i].fmt;
- *rate = codec_defaults[i].rate;
- *channels = codec_defaults[i].channels;
-
- return 0;
-}
-
-/* parses data and codec list from SDP
- *
- * sdp = given SDP text
- * return: SDP session description structure */
-struct osmo_cc_session *osmo_cc_session_parsesdp(osmo_cc_session_config_t *conf, void *priv, const char *_sdp)
-{
- char buffer[strlen(_sdp) + 1], *sdp = buffer;
- char *line, *p, *word, *next_word;
- int line_no = 0;
- struct osmo_cc_session_connection_data ccd, *cd;
- int csend = 1, creceive = 1; /* common default */
- struct osmo_cc_session *session = NULL;
- struct osmo_cc_session_media *media = NULL;
- struct osmo_cc_session_codec *codec = NULL;
-
- /* prepare data */
- strcpy(sdp, _sdp);
- memset(&ccd, 0, sizeof(ccd));
-
- /* create SDP session description */
- session = osmo_cc_new_session(conf, priv, NULL, NULL, NULL, 0, 0, NULL, NULL, 0);
-
- /* check every line of SDP and parse its data */
- while(*sdp) {
- if ((p = strchr(sdp, '\r'))) {
- *p++ = '\0';
- if (*p == '\n')
- p++;
- line = sdp;
- sdp = p;
- } else if ((p = strchr(sdp, '\n'))) {
- *p++ = '\0';
- line = sdp;
- sdp = p;
- } else {
- line = sdp;
- sdp = strchr(sdp, '\0');
- }
- next_word = line + 2;
- line_no++;
-
- if (line[0] == '\0')
- continue;
-
- if (line[1] != '=') {
- PDEBUG(DCC, DEBUG_NOTICE, "SDP line %d = '%s' is garbage, expecting '=' as second character.\n", line_no, line);
- continue;
- }
-
- switch(line[0]) {
- case 'v':
- PDEBUG(DCC, DEBUG_DEBUG, " -> Version: %s\n", next_word);
- if (atoi(next_word) != 0) {
- PDEBUG(DCC, DEBUG_NOTICE, "SDP line %d = '%s' describes unsupported version.\n", line_no, line);
- osmo_cc_free_session(session);
- return NULL;
- }
- break;
- case 'o':
- PDEBUG(DCC, DEBUG_DEBUG, " -> Originator: %s\n", next_word);
- /* Originator */
- word = wordsep(&next_word);
- if (!word)
- break;
- free((char *)session->origin_remote.username); // if already set
- session->origin_remote.username = strdup(word);
- word = wordsep(&next_word);
- if (!word)
- break;
- free((char *)session->origin_remote.sess_id); // if already set
- session->origin_remote.sess_id = strdup(word);
- word = wordsep(&next_word);
- if (!word)
- break;
- free((char *)session->origin_remote.sess_version); // if already set
- session->origin_remote.sess_version = strdup(word);
- word = wordsep(&next_word);
- if (!word)
- break;
- free((char *)session->origin_remote.nettype); // if already set
- session->origin_remote.nettype = strdup(word);
- word = wordsep(&next_word);
- if (!word)
- break;
- free((char *)session->origin_remote.addrtype); // if already set
- session->origin_remote.addrtype = strdup(word);
- word = wordsep(&next_word);
- if (!word)
- break;
- free((char *)session->origin_remote.unicast_address); // if already set
- session->origin_remote.unicast_address = strdup(word);
- break;
- case 's':
- /* Session Name */
- PDEBUG(DCC, DEBUG_DEBUG, " -> Session Name: %s\n", next_word);
- free((char *)session->name); // if already set
- session->name = strdup(next_word);
- break;
- case 'c': /* Connection Data */
- PDEBUG(DCC, DEBUG_DEBUG, " -> Connection Data: %s\n", next_word);
- if (media)
- cd = &media->connection_data_remote;
- else
- cd = &ccd;
- /* network type */
- if (!(word = wordsep(&next_word)))
- break;
- if (!strcmp(word, "IN"))
- cd->nettype = osmo_cc_session_nettype_inet;
- else {
- PDEBUG(DCC, DEBUG_NOTICE, "Unsupported network type '%s' in SDP line %d = '%s'\n", word, line_no, line);
- break;
- }
- /* address type */
- if (!(word = wordsep(&next_word)))
- break;
- if (!strcmp(word, "IP4")) {
- cd->addrtype = osmo_cc_session_addrtype_ipv4;
- PDEBUG(DCC, DEBUG_DEBUG, " -> Address Type = IPv4\n");
- } else
- if (!strcmp(word, "IP6")) {
- cd->addrtype = osmo_cc_session_addrtype_ipv6;
- PDEBUG(DCC, DEBUG_DEBUG, " -> Address Type = IPv6\n");
- } else {
- PDEBUG(DCC, DEBUG_NOTICE, "Unsupported address type '%s' in SDP line %d = '%s'\n", word, line_no, line);
- break;
- }
- /* connection address */
- if (!(word = wordsep(&next_word)))
- break;
- if ((p = strchr(word, '/')))
- *p++ = '\0';
- free((char *)cd->address); // in case of multiple lines of 'c'
- cd->address = strdup(word);
- PDEBUG(DCC, DEBUG_DEBUG, " -> Address = %s\n", word);
- break;
- case 'm': /* Media Description */
- PDEBUG(DCC, DEBUG_DEBUG, " -> Media Description: %s\n", next_word);
- /* add media description */
- media = osmo_cc_add_media(session, 0, 0, NULL, 0, 0, 0, csend, creceive, NULL, 0);
- /* copy common connection data from common connection, if exists */
- cd = &media->connection_data_remote;
- memcpy(cd, &ccd, sizeof(*cd));
- /* media type */
- if (!(word = wordsep(&next_word)))
- break;
- if (!strcmp(word, "audio"))
- media->description.type = osmo_cc_session_media_type_audio;
- else
- if (!strcmp(word, "video"))
- media->description.type = osmo_cc_session_media_type_video;
- else {
- media->description.type = osmo_cc_session_media_type_unknown;
- media->description.type_name = strdup(word);
- PDEBUG(DCC, DEBUG_DEBUG, "Unsupported media type in SDP line %d = '%s'\n", line_no, line);
- }
- /* port */
- if (!(word = wordsep(&next_word)))
- break;
- media->description.port_remote = atoi(word);
- /* proto */
- if (!(word = wordsep(&next_word)))
- break;
- if (!strcmp(word, "RTP/AVP"))
- media->description.proto = osmo_cc_session_media_proto_rtp;
- else {
- media->description.proto = osmo_cc_session_media_proto_unknown;
- media->description.proto_name = strdup(word);
- PDEBUG(DCC, DEBUG_NOTICE, "Unsupported protocol type in SDP line %d = '%s'\n", line_no, line);
- break;
- }
- /* create codec description for each codec and link */
- while ((word = wordsep(&next_word))) {
- /* create codec */
- codec = osmo_cc_add_codec(media, NULL, 0, 1, NULL, NULL, 0);
- /* fmt */
- codec->payload_type_remote = atoi(word);
- complete_codec_by_fmt(codec->payload_type_remote, &codec->payload_name, &codec->payload_rate, &codec->payload_channels);
- PDEBUG(DCC, DEBUG_DEBUG, " -> payload type = %d\n", codec->payload_type_remote);
- if (codec->payload_name)
- PDEBUG(DCC, DEBUG_DEBUG, " -> payload name = %s\n", codec->payload_name);
- if (codec->payload_rate)
- PDEBUG(DCC, DEBUG_DEBUG, " -> payload rate = %d\n", codec->payload_rate);
- if (codec->payload_channels)
- PDEBUG(DCC, DEBUG_DEBUG, " -> payload channels = %d\n", codec->payload_channels);
- }
- break;
- case 'a':
- PDEBUG(DCC, DEBUG_DEBUG, " -> Attribute: %s\n", next_word);
- word = wordsep(&next_word);
- if (!strcmp(word, "sendrecv")) {
- if (media) {
- media->receive = 1;
- media->send = 1;
- } else {
- creceive = 1;
- csend = 1;
- }
- break;
- } else
- if (!strcmp(word, "recvonly")) {
- if (media) {
- media->receive = 1;
- media->send = 0;
- } else {
- creceive = 1;
- csend = 0;
- }
- break;
- } else
- if (!strcmp(word, "sendonly")) {
- if (media) {
- media->receive = 0;
- media->send = 1;
- } else {
- creceive = 0;
- csend = 1;
- }
- break;
- } else
- if (!strcmp(word, "inactive")) {
- if (media) {
- media->receive = 0;
- media->send = 0;
- } else {
- creceive = 0;
- csend = 0;
- }
- break;
- } else
- if (!media) {
- PDEBUG(DCC, DEBUG_NOTICE, "Attribute without previously defined media in SDP line %d = '%s'\n", line_no, line);
- break;
- }
- if (!strncmp(word, "rtpmap:", 7)) {
- int fmt = atoi(word + 7);
- osmo_cc_session_for_each_codec(media->codec_list, codec) {
- if (codec->payload_type_remote == fmt)
- break;
- }
- if (!codec) {
- PDEBUG(DCC, DEBUG_NOTICE, "Attribute without previously defined codec in SDP line %d = '%s'\n", line_no, line);
- break;
- }
- PDEBUG(DCC, DEBUG_DEBUG, " -> (rtpmap) payload type = %d\n", codec->payload_type_remote);
- if (!(word = wordsep(&next_word)))
- goto rtpmap_done;
- if ((p = strchr(word, '/')))
- *p++ = '\0';
- free((char *)codec->payload_name); // in case it is already set above
- codec->payload_name = strdup(word);
- PDEBUG(DCC, DEBUG_DEBUG, " -> (rtpmap) payload name = %s\n", codec->payload_name);
- if (!(word = p))
- goto rtpmap_done;
- if ((p = strchr(word, '/')))
- *p++ = '\0';
- codec->payload_rate = atoi(word);
- PDEBUG(DCC, DEBUG_DEBUG, " -> (rtpmap) payload rate = %d\n", codec->payload_rate);
- if (!(word = p)) {
- /* if no channel is given and no default was specified, we must set 1 channel */
- if (!codec->payload_channels)
- codec->payload_channels = 1;
- goto rtpmap_done;
- }
- codec->payload_channels = atoi(word);
- PDEBUG(DCC, DEBUG_DEBUG, " -> (rtpmap) payload channels = %d\n", codec->payload_channels);
- rtpmap_done:
- if (!codec->payload_name || !codec->payload_rate || !codec->payload_channels) {
- PDEBUG(DCC, DEBUG_NOTICE, "Broken 'rtpmap' definition in SDP line %d = '%s' Skipping codec!\n", line_no, line);
- osmo_cc_free_codec(codec);
- }
- }
- break;
- }
- }
-
- /* if something is incomplete, abort here */
- if (osmo_cc_session_check(session, 1)) {
- PDEBUG(DCC, DEBUG_NOTICE, "Parsing SDP failed.\n");
- osmo_cc_free_session(session);
- return NULL;
- }
-
- return session;
-}
-
-void osmo_cc_debug_sdp(const char *_sdp)
-{
- const unsigned char *sdp = (const unsigned char *)_sdp;
- char text[256];
- int i;
-
- while (*sdp) {
- for (i = 0; *sdp > 0 && *sdp >= 32 && i < (int)sizeof(text) - 1; i++)
- text[i] = *sdp++;
- text[i] = '\0';
- PDEBUG(DCC, DEBUG_DEBUG, " | %s\n", text);
- while (*sdp > 0 && *sdp < 32)
- sdp++;
- }
-}
-
diff --git a/src/libosmocc/sdp.h b/src/libosmocc/sdp.h
deleted file mode 100644
index c9bc721..0000000
--- a/src/libosmocc/sdp.h
+++ /dev/null
@@ -1,6 +0,0 @@
-
-char *osmo_cc_session_gensdp(struct osmo_cc_session *session);
-struct osmo_cc_session *osmo_cc_session_parsesdp(osmo_cc_session_config_t *conf, void *priv, const char *_sdp);
-int osmo_cc_payload_type_by_attrs(uint8_t *fmt, const char *name, uint32_t *rate, int *channels);
-void osmo_cc_debug_sdp(const char *sdp);
-
diff --git a/src/libosmocc/session.c b/src/libosmocc/session.c
deleted file mode 100644
index 427eca7..0000000
--- a/src/libosmocc/session.c
+++ /dev/null
@@ -1,640 +0,0 @@
-/* Osmo-CC: Media Session handling
- *
- * (C) 2016 by Andreas Eversberg <jolly@eversberg.eu>
- * All Rights Reserved
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <sys/time.h>
-#include <inttypes.h>
-#include "../libtimer/timer.h"
-#include "../libdebug/debug.h"
-#include "../liboptions/options.h"
-#include "endpoint.h"
-
-#define NTP_OFFSET 2208988800U
-
-void osmo_cc_set_local_peer(osmo_cc_session_config_t *conf, enum osmo_cc_session_nettype nettype, enum osmo_cc_session_addrtype addrtype, const char *address)
-{
- conf->default_nettype = nettype;
- conf->default_addrtype = addrtype;
- conf->default_unicast_address = options_strdup(address);
-}
-
-osmo_cc_session_t *osmo_cc_new_session(osmo_cc_session_config_t *conf, void *priv, const char *username, const char *sess_id, const char *sess_version, enum osmo_cc_session_nettype nettype, enum osmo_cc_session_addrtype addrtype, const char *unicast_address, const char *session_name, int debug)
-{
- osmo_cc_session_t *session;
-
- if (debug) PDEBUG(DCC, DEBUG_DEBUG, "Creating session structure.\n");
-
- session = calloc(1, sizeof(*session));
- if (!session) {
- PDEBUG(DCC, DEBUG_ERROR, "No mem!\n");
- abort();
- }
- session->config = conf;
- session->priv = priv;
- if (username) {
- int i;
- for (i = 0; username[i]; i++) {
- if ((uint8_t)username[i] < 33) {
- PDEBUG(DCC, DEBUG_ERROR, "Fatal error: SDP's originator (username) uses invalid characters, please fix!\n");
- abort();
- }
- }
- session->origin_local.username = strdup(username);
- }
- if (!username)
- session->origin_local.username = strdup("-");
- if (debug) PDEBUG(DCC, DEBUG_DEBUG, " -> user name = %s\n", session->origin_local.username);
- if (sess_id)
- session->origin_local.sess_id = strdup(sess_id);
- if (sess_version)
- session->origin_local.sess_version = strdup(sess_version);
- if (!sess_id || !sess_version) {
- struct timeval tv;
- char ntp_timestamp[32];
- /* get time NTP format time stamp (time since 1900) */
- gettimeofday(&tv, NULL);
- sprintf(ntp_timestamp, "%" PRIu64, (uint64_t)tv.tv_sec + NTP_OFFSET);
- if (!sess_id)
- session->origin_local.sess_id = strdup(ntp_timestamp);
- if (!sess_version)
- session->origin_local.sess_version = strdup(ntp_timestamp);
- }
- if (debug) PDEBUG(DCC, DEBUG_DEBUG, " -> session ID = %s\n", session->origin_local.sess_id);
- if (debug) PDEBUG(DCC, DEBUG_DEBUG, " -> session version = %s\n", session->origin_local.sess_version);
- if (nettype)
- session->origin_local.nettype = strdup(osmo_cc_session_nettype2string(nettype));
- else
- session->origin_local.nettype = strdup(osmo_cc_session_nettype2string(conf->default_nettype));
- if (debug) PDEBUG(DCC, DEBUG_DEBUG, " -> network type = %s\n", session->origin_local.nettype);
- if (addrtype)
- session->origin_local.addrtype = strdup(osmo_cc_session_addrtype2string(addrtype));
- else
- session->origin_local.addrtype = strdup(osmo_cc_session_addrtype2string(conf->default_addrtype));
- if (debug) PDEBUG(DCC, DEBUG_DEBUG, " -> address type = %s\n", session->origin_local.addrtype);
- if (unicast_address)
- session->origin_local.unicast_address = strdup(unicast_address);
- else
- session->origin_local.unicast_address = strdup(conf->default_unicast_address);
- if (debug) PDEBUG(DCC, DEBUG_DEBUG, " -> unicast address = %s\n", session->origin_local.unicast_address);
- if (session_name)
- session->name = strdup(session_name);
- if (!session_name)
- session->name = strdup("-");
- if (debug) PDEBUG(DCC, DEBUG_DEBUG, " -> session name = %s\n", session->name);
-
- return session;
-}
-
-void osmo_cc_free_session(osmo_cc_session_t *session)
-{
- PDEBUG(DCC, DEBUG_DEBUG, "Free session structure.\n");
-
- free((char *)session->origin_local.username);
- free((char *)session->origin_local.sess_id);
- free((char *)session->origin_local.sess_version);
- free((char *)session->origin_local.nettype);
- free((char *)session->origin_local.addrtype);
- free((char *)session->origin_local.unicast_address);
- free((char *)session->origin_remote.username);
- free((char *)session->origin_remote.sess_id);
- free((char *)session->origin_remote.sess_version);
- free((char *)session->origin_remote.nettype);
- free((char *)session->origin_remote.addrtype);
- free((char *)session->origin_remote.unicast_address);
- free((char *)session->name);
- while (session->media_list)
- osmo_cc_free_media(session->media_list);
- free(session);
-}
-
-osmo_cc_session_media_t *osmo_cc_add_media(osmo_cc_session_t *session, enum osmo_cc_session_nettype nettype, enum osmo_cc_session_addrtype addrtype, const char *address, enum osmo_cc_session_media_type type, uint16_t port, enum osmo_cc_session_media_proto proto, int send, int receive, void (*receiver)(struct osmo_cc_session_codec *codec, uint8_t marker, uint16_t sequence_number, uint32_t timestamp, uint32_t ssrc, uint8_t *data, int len), int debug)
-{
- osmo_cc_session_config_t *conf = session->config;
- osmo_cc_session_media_t *media, **mediap;
-
- media = calloc(1, sizeof(*media));
- if (!media) {
- PDEBUG(DCC, DEBUG_ERROR, "No mem!\n");
- abort();
- }
- media->session = session;
- if (nettype)
- media->connection_data_local.nettype = nettype;
- else
- media->connection_data_local.nettype = conf->default_nettype;
- if (addrtype)
- media->connection_data_local.addrtype = addrtype;
- else
- media->connection_data_local.addrtype = conf->default_addrtype;
- if (address)
- media->connection_data_local.address = strdup(address);
- else
- media->connection_data_local.address = strdup(conf->default_unicast_address);
- media->description.type = type;
- media->description.port_local = port;
- media->description.proto = proto;
- media->send = send;
- media->receive = receive;
- media->receiver = receiver;
- media->tx_sequence = random();
- media->tx_timestamp = random();
- mediap = &media->session->media_list;
- while (*mediap)
- mediap = &((*mediap)->next);
- *mediap = media;
-
- if (debug) PDEBUG(DCC, DEBUG_DEBUG, "Adding session media.\n");
- if (debug) PDEBUG(DCC, DEBUG_DEBUG, " -> network type = %s\n", osmo_cc_session_nettype2string(media->connection_data_local.nettype));
- if (debug) PDEBUG(DCC, DEBUG_DEBUG, " -> address type = %s\n", osmo_cc_session_addrtype2string(media->connection_data_local.addrtype));
- if (debug) PDEBUG(DCC, DEBUG_DEBUG, " -> address = %s\n", media->connection_data_local.address);
- if (debug) PDEBUG(DCC, DEBUG_DEBUG, " -> media type = %s\n", osmo_cc_session_media_type2string(media->description.type));
- if (debug) PDEBUG(DCC, DEBUG_DEBUG, " -> media port = %d\n", media->description.port_local);
- if (debug) PDEBUG(DCC, DEBUG_DEBUG, " -> media proto = %s\n", osmo_cc_session_media_proto2string(media->description.proto));
- if (debug) PDEBUG(DCC, DEBUG_DEBUG, "Opening and binding media port %d\n", media->description.port_local);
-
- return media;
-}
-
-void osmo_cc_free_media(osmo_cc_session_media_t *media)
-{
- osmo_cc_session_media_t **mediap;
-
- PDEBUG(DCC, DEBUG_DEBUG, "Free session media.\n");
-
- osmo_cc_rtp_close(media);
- free((char *)media->connection_data_local.nettype_name);
- free((char *)media->connection_data_local.addrtype_name);
- free((char *)media->connection_data_local.address);
- free((char *)media->connection_data_remote.nettype_name);
- free((char *)media->connection_data_remote.addrtype_name);
- free((char *)media->connection_data_remote.address);
- while (media->codec_list)
- osmo_cc_free_codec(media->codec_list);
- mediap = &media->session->media_list;
- while (*mediap != media)
- mediap = &((*mediap)->next);
- *mediap = media->next;
- free(media);
-}
-
-osmo_cc_session_codec_t *osmo_cc_add_codec(osmo_cc_session_media_t *media, const char *payload_name, uint32_t payload_rate, int payload_channels, void (*encoder)(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void *priv), void (*decoder)(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void *priv), int debug)
-{
- osmo_cc_session_codec_t *codec, **codecp;
- int rc;
-
- codec = calloc(1, sizeof(*codec));
- if (!codec) {
- PDEBUG(DCC, DEBUG_ERROR, "No mem!\n");
- abort();
- }
- codec->media = media;
- if (payload_name) {
- codec->payload_name = strdup(payload_name);
- codec->payload_rate = payload_rate;
- codec->payload_channels = payload_channels;
- rc = osmo_cc_payload_type_by_attrs(&codec->payload_type_local, payload_name, &payload_rate, &payload_channels);
- if (rc < 0) {
- /* hunt for next free dynamic payload type */
- uint8_t fmt = 96;
- osmo_cc_session_codec_t *c;
- osmo_cc_session_for_each_codec(media->codec_list, c) {
- if (c->payload_type_local >= fmt)
- fmt = c->payload_type_local + 1;
- }
- codec->payload_type_local = fmt;
- }
- }
- codec->encoder = encoder;
- codec->decoder = decoder;
- codecp = &codec->media->codec_list;
- while (*codecp)
- codecp = &((*codecp)->next);
- *codecp = codec;
-
- if (debug) PDEBUG(DCC, DEBUG_DEBUG, "Adding session codec.\n");
- if (debug) PDEBUG(DCC, DEBUG_DEBUG, " -> payload type = %d\n", codec->payload_type_local);
- if (debug) PDEBUG(DCC, DEBUG_DEBUG, " -> payload name = %s\n", codec->payload_name);
- if (debug) PDEBUG(DCC, DEBUG_DEBUG, " -> payload rate = %d\n", codec->payload_rate);
- if (debug) PDEBUG(DCC, DEBUG_DEBUG, " -> payload channels = %d\n", codec->payload_channels);
-
- return codec;
-}
-
-void osmo_cc_free_codec(osmo_cc_session_codec_t *codec)
-{
- osmo_cc_session_codec_t **codecp;
-
- PDEBUG(DCC, DEBUG_DEBUG, "Free session codec.\n");
-
- free((char *)codec->payload_name);
- codecp = &codec->media->codec_list;
- while (*codecp != codec)
- codecp = &((*codecp)->next);
- *codecp = codec->next;
- free(codec);
-}
-
-int osmo_cc_session_check(osmo_cc_session_t *session, int remote)
-{
- struct osmo_cc_session_origin *orig;
- struct osmo_cc_session_media *media;
- struct osmo_cc_session_connection_data *cd;
- struct osmo_cc_session_media_description *md;
- struct osmo_cc_session_codec *codec;
- int i, j;
-
- if (remote)
- orig = &session->origin_remote;
- else
- orig = &session->origin_local;
- if (!orig->username
- || !orig->sess_id
- || !orig->sess_version
- || !orig->nettype
- || !orig->addrtype
- || !orig->unicast_address) {
- PDEBUG(DCC, DEBUG_NOTICE, "Missing data in session origin\n");
- return -EINVAL;
- }
- if (!session->name) {
- PDEBUG(DCC, DEBUG_NOTICE, "Missing data in session origin\n");
- return -EINVAL;
- }
- if (!session->media_list) {
- PDEBUG(DCC, DEBUG_NOTICE, "Missing media session\n");
- return -EINVAL;
- }
- i = 0;
- osmo_cc_session_for_each_media(session->media_list, media) {
- i++;
- if (remote)
- cd = &media->connection_data_remote;
- else
- cd = &media->connection_data_local;
- if (!cd->nettype && !cd->nettype_name) {
- PDEBUG(DCC, DEBUG_NOTICE, "Session with media #%d is missing connection network type\n", i);
- return -EINVAL;
- }
- if (!cd->addrtype && !cd->addrtype_name) {
- PDEBUG(DCC, DEBUG_NOTICE, "Session with media #%d is missing connection address type\n", i);
- return -EINVAL;
- }
- if (!cd->address) {
- PDEBUG(DCC, DEBUG_NOTICE, "Session with media #%d is missing connection address\n", i);
- return -EINVAL;
- }
- md = &media->description;
- if (!md->type && !md->type_name) {
- PDEBUG(DCC, DEBUG_NOTICE, "Session with media #%d is missing media type\n", i);
- return -EINVAL;
- }
- if (!md->proto && !md->proto_name) {
- PDEBUG(DCC, DEBUG_NOTICE, "Session with media #%d is missing protocol\n", i);
- return -EINVAL;
- }
- j = 0;
- osmo_cc_session_for_each_codec(media->codec_list, codec) {
- j++;
- if (!codec->payload_name) {
- PDEBUG(DCC, DEBUG_NOTICE, "Session with media #%d, codec #%d is missing name\n", i, j);
- return -EINVAL;
- }
- if (!codec->payload_rate) {
- PDEBUG(DCC, DEBUG_NOTICE, "Session with media #%d, codec #%d is missing rate\n", i, j);
- return -EINVAL;
- }
- if (!codec->payload_channels) {
- PDEBUG(DCC, DEBUG_NOTICE, "Session with media #%d, codec #%d is missing channel count\n", i, j);
- return -EINVAL;
- }
- }
- }
-
- return 0;
-}
-
-/* check session description and generate SDP */
-const char *osmo_cc_session_send_offer(osmo_cc_session_t *session)
-{
- const char *sdp;
- int rc;
-
- PDEBUG(DCC, DEBUG_DEBUG, "Generating session offer and opening RTP stream.\n");
-
- rc = osmo_cc_session_check(session, 0);
- if (rc < 0) {
- PDEBUG(DCC, DEBUG_ERROR, "Please fix!\n");
- abort();
- }
-
- sdp = osmo_cc_session_gensdp(session);
- osmo_cc_debug_sdp(sdp);
-
- return sdp;
-}
-
-osmo_cc_session_t *osmo_cc_session_receive_offer(osmo_cc_session_config_t *conf, void *priv, const char *sdp)
-{
- osmo_cc_session_t *session;
- int rc;
-
- PDEBUG(DCC, DEBUG_DEBUG, "Parsing session offer.\n");
-
- osmo_cc_debug_sdp(sdp);
- session = osmo_cc_session_parsesdp(conf, priv, sdp);
- if (!session)
- return NULL;
-
- rc = osmo_cc_session_check(session, 0);
- if (rc < 0) {
- osmo_cc_free_session(session);
- return NULL;
- }
-
- return session;
-}
-
-void osmo_cc_session_accept_media(osmo_cc_session_media_t *media, enum osmo_cc_session_nettype nettype, enum osmo_cc_session_addrtype addrtype, const char *address, int send, int receive, void (*receiver)(struct osmo_cc_session_codec *codec, uint8_t marker, uint16_t sequence_number, uint32_t timestamp, uint32_t ssrc, uint8_t *data, int len))
-{
- osmo_cc_session_config_t *conf = media->session->config;
-
- media->accepted = 1;
- if (nettype)
- media->connection_data_local.nettype = nettype;
- else
- media->connection_data_local.nettype = conf->default_nettype;
- if (addrtype)
- media->connection_data_local.addrtype = addrtype;
- else
- media->connection_data_local.addrtype = conf->default_addrtype;
- free((char *)media->connection_data_local.address);
- if (address)
- media->connection_data_local.address = strdup(address);
- else
- media->connection_data_local.address = strdup(conf->default_unicast_address);
- media->send = send;
- media->receive = receive;
- media->receiver = receiver;
-
- PDEBUG(DCC, DEBUG_DEBUG, "Accepting session media.\n");
- PDEBUG(DCC, DEBUG_DEBUG, " -> network type = %s\n", osmo_cc_session_nettype2string(media->connection_data_local.nettype));
- PDEBUG(DCC, DEBUG_DEBUG, " -> address type = %s\n", osmo_cc_session_addrtype2string(media->connection_data_local.addrtype));
- PDEBUG(DCC, DEBUG_DEBUG, " -> address = %s\n", media->connection_data_local.address);
-}
-
-
-void osmo_cc_session_accept_codec(osmo_cc_session_codec_t *codec, void (*encoder)(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void *priv), void (*decoder)(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void *priv))
-{
- codec->accepted = 1;
- codec->encoder = encoder;
- codec->decoder = decoder;
- /* when we accept a codec, we just use the same payload type as the remote */
- codec->payload_type_local = codec->payload_type_remote;
-
- PDEBUG(DCC, DEBUG_DEBUG, "Accepting session codec.\n");
- PDEBUG(DCC, DEBUG_DEBUG, " -> payload type = %d\n", codec->payload_type_local);
- PDEBUG(DCC, DEBUG_DEBUG, " -> payload name = %s\n", codec->payload_name);
- PDEBUG(DCC, DEBUG_DEBUG, " -> payload rate = %d\n", codec->payload_rate);
- PDEBUG(DCC, DEBUG_DEBUG, " -> payload channels = %d\n", codec->payload_channels);
-}
-
-/* remove codecs/media that have not been accepted and generate SDP */
-const char *osmo_cc_session_send_answer(osmo_cc_session_t *session)
-{
- osmo_cc_session_media_t *media;
- osmo_cc_session_codec_t *codec, **codec_p;
- const char *sdp;
- int rc;
-
- PDEBUG(DCC, DEBUG_DEBUG, "Generating session answer.\n");
-
- /* loop all media */
- osmo_cc_session_for_each_media(session->media_list, media) {
- /* remove unaccepted codecs */
- codec_p = &media->codec_list;
- codec = *codec_p;
- while (codec) {
- if (!codec->accepted) {
- osmo_cc_free_codec(codec);
- codec = *codec_p;
- continue;
- }
- codec_p = &codec->next;
- codec = *codec_p;
- }
- /* mark media as unused, if no codec or not accepted */
- if (!media->accepted || !media->codec_list)
- media->description.port_local = 0;
- }
-
- rc = osmo_cc_session_check(session, 0);
- if (rc < 0) {
- PDEBUG(DCC, DEBUG_ERROR, "Please fix!\n");
- abort();
- }
-
- sdp = osmo_cc_session_gensdp(session);
- osmo_cc_debug_sdp(sdp);
-
- return sdp;
-}
-
-/* Apply remote session description to local session description.
- * If remote media's port is 0, remove from local session description.
- * If codecs in the remote session description are missing, remove from local session description.
- */
-static int osmo_cc_session_negotiate(osmo_cc_session_t *session_local, struct osmo_cc_session *session_remote)
-{
- osmo_cc_session_media_t *media_local, *media_remote, **media_local_p;
- osmo_cc_session_codec_t *codec_local, *codec_remote, **codec_local_p;
- int rc;
-
- PDEBUG(DCC, DEBUG_DEBUG, "Negotiating session.\n");
-
- /* copy remote session information */
- session_local->origin_remote.username = strdup(session_remote->origin_remote.username);
- session_local->origin_remote.sess_id = strdup(session_remote->origin_remote.sess_id);
- session_local->origin_remote.sess_version = strdup(session_remote->origin_remote.sess_version);
- session_local->origin_remote.nettype = strdup(session_remote->origin_remote.nettype);
- session_local->origin_remote.addrtype = strdup(session_remote->origin_remote.addrtype);
- session_local->origin_remote.unicast_address = strdup(session_remote->origin_remote.unicast_address);
-
- /* loop all media */
- for (media_local = session_local->media_list, media_remote = session_remote->media_list; media_local && media_remote; media_local = media_local->next, media_remote = media_remote->next) {
- /* copy remote media information */
- media_local->connection_data_remote.nettype = media_remote->connection_data_remote.nettype;
- if (media_remote->connection_data_remote.nettype_name)
- media_local->connection_data_remote.nettype_name = strdup(media_remote->connection_data_remote.nettype_name);
- media_local->connection_data_remote.addrtype = media_remote->connection_data_remote.addrtype;
- if (media_remote->connection_data_remote.addrtype_name)
- media_local->connection_data_remote.addrtype_name = strdup(media_remote->connection_data_remote.addrtype_name);
- if (media_remote->connection_data_remote.address)
- media_local->connection_data_remote.address = strdup(media_remote->connection_data_remote.address);
- media_local->description.port_remote = media_remote->description.port_remote;
- media_local->send = media_remote->send;
- media_local->receive = media_remote->receive;
- /* loop all codecs and remove if they are not found in local session description */
- codec_local_p = &media_local->codec_list;
- codec_local = *codec_local_p;
- while (codec_local) {
- /* search for equal codec, payload type may differe for each direction */
- osmo_cc_session_for_each_codec(media_remote->codec_list, codec_remote) {
- if (!strcmp(codec_local->payload_name, codec_remote->payload_name)
- && codec_local->payload_rate == codec_remote->payload_rate
- && codec_local->payload_channels == codec_remote->payload_channels)
- break;
- }
- if (!codec_remote) {
- osmo_cc_free_codec(codec_local);
- codec_local = *codec_local_p;
- continue;
- }
- /* copy remote codec information */
- codec_local->payload_type_remote = codec_remote->payload_type_remote;
- codec_local_p = &codec_local->next;
- codec_local = *codec_local_p;
- }
- }
- if (media_local) {
- PDEBUG(DCC, DEBUG_NOTICE, "Negotiation failed, because remote endpoint returns less media streams than we offered.\n");
- return -EINVAL;
- }
- if (media_remote) {
- PDEBUG(DCC, DEBUG_NOTICE, "Negotiation failed, because remote endpoint returns more media streams than we offered.\n");
- return -EINVAL;
- }
-
- /* remove media with port == 0 or no codec at all */
- media_local_p = &session_local->media_list;
- media_local = *media_local_p;
- while (media_local) {
- if (media_local->description.port_remote == 0 || !media_local->codec_list) {
- osmo_cc_free_media(media_local);
- media_local = *media_local_p;
- continue;
- }
- media_local_p = &media_local->next;
- media_local = *media_local_p;
- }
-
- rc = osmo_cc_session_check(session_local, 1);
- if (rc < 0)
- return rc;
-
- return 0;
-}
-
-int osmo_cc_session_receive_answer(osmo_cc_session_t *session, const char *sdp)
-{
- osmo_cc_session_t *session_remote;
- int rc;
-
- PDEBUG(DCC, DEBUG_DEBUG, "Parsing session answer.\n");
-
- osmo_cc_debug_sdp(sdp);
- session_remote = osmo_cc_session_parsesdp(session->config, NULL, sdp);
- if (!session_remote)
- return -EINVAL;
-
- rc = osmo_cc_session_check(session_remote, 1);
- if (rc < 0) {
- osmo_cc_free_session(session_remote);
- return rc;
- }
- rc = osmo_cc_session_negotiate(session, session_remote);
- if (rc < 0) {
- osmo_cc_free_session(session_remote);
- return rc;
- }
- osmo_cc_free_session(session_remote);
-
- return 0;
-}
-
-const char *osmo_cc_session_nettype2string(enum osmo_cc_session_nettype nettype)
-{
- switch (nettype) {
- case osmo_cc_session_nettype_inet:
- return "IN";
- default:
- return NULL;
- }
-}
-
-const char *osmo_cc_session_addrtype2string(enum osmo_cc_session_addrtype addrtype)
-{
- switch (addrtype) {
- case osmo_cc_session_addrtype_ipv4:
- return "IP4";
- case osmo_cc_session_addrtype_ipv6:
- return "IP6";
- default:
- return NULL;
- }
-}
-
-const char *osmo_cc_session_media_type2string(enum osmo_cc_session_media_type media_type)
-{
- switch (media_type) {
- case osmo_cc_session_media_type_audio:
- return "audio";
- case osmo_cc_session_media_type_video:
- return "video";
- default:
- return NULL;
- }
-}
-
-const char *osmo_cc_session_media_proto2string(enum osmo_cc_session_media_proto media_proto)
-{
- switch (media_proto) {
- case osmo_cc_session_media_proto_rtp:
- return "RTP/AVP";
- default:
- return NULL;
- }
-}
-
-int osmo_cc_session_if_codec(osmo_cc_session_codec_t *codec, const char *name, uint32_t rate, int channels)
-{
- return (!strcmp(codec->payload_name, name)
- && codec->payload_rate == rate
- && codec->payload_channels == channels);
-}
-
-int osmo_cc_session_handle(osmo_cc_session_t *session, void *codec_priv)
-{
- osmo_cc_session_media_t *media;
- int w = 0, rc;
-
- osmo_cc_session_for_each_media(session->media_list, media) {
- do {
- rc = osmo_cc_rtp_receive(media, codec_priv);
- if (rc >= 0)
- w = 1;
- } while (rc >= 0);
- }
-
- return w;
-}
-
diff --git a/src/libosmocc/session.h b/src/libosmocc/session.h
deleted file mode 100644
index 0330f51..0000000
--- a/src/libosmocc/session.h
+++ /dev/null
@@ -1,130 +0,0 @@
-/* configuration */
-
-enum osmo_cc_session_nettype {
- osmo_cc_session_nettype_unknown = 0,
- osmo_cc_session_nettype_inet,
-};
-
-enum osmo_cc_session_addrtype {
- osmo_cc_session_addrtype_unknown = 0,
- osmo_cc_session_addrtype_ipv4,
- osmo_cc_session_addrtype_ipv6,
-};
-
-typedef struct osmo_cc_session_config {
- enum osmo_cc_session_nettype default_nettype;
- enum osmo_cc_session_addrtype default_addrtype;
- const char *default_unicast_address;
- uint16_t rtp_port_next;
- uint16_t rtp_port_from;
- uint16_t rtp_port_to;
-} osmo_cc_session_config_t;
-
-/* session description, global part: */
-
-typedef struct osmo_cc_session_origin {
- const char *username;
- const char *sess_id;
- const char *sess_version;
- const char *nettype;
- const char *addrtype;
- const char *unicast_address;
-} osmo_cc_session_origin_t;
-
-/* session instance */
-typedef struct osmo_cc_session {
- osmo_cc_session_config_t *config;
- void *priv;
- osmo_cc_session_origin_t origin_local, origin_remote;
- const char *name;
- struct osmo_cc_session_media *media_list;
-} osmo_cc_session_t;
-
-/* connection description: */
-
-typedef struct osmo_cc_session_connection_data {
- enum osmo_cc_session_nettype nettype;
- const char *nettype_name;
- enum osmo_cc_session_addrtype addrtype;
- const char *addrtype_name;
- const char *address;
-} osmo_cc_session_connection_data_t;
-
-/* one media of session description: */
-
-enum osmo_cc_session_media_type {
- osmo_cc_session_media_type_unknown,
- osmo_cc_session_media_type_audio,
- osmo_cc_session_media_type_video,
-};
-
-enum osmo_cc_session_media_proto {
- osmo_cc_session_media_proto_unknown,
- osmo_cc_session_media_proto_rtp,
-};
-
-typedef struct osmo_cc_session_media_description {
- enum osmo_cc_session_media_type type;
- const char *type_name;
- uint16_t port_local, port_remote;
- enum osmo_cc_session_media_proto proto;
- const char *proto_name;
-} osmo_cc_session_media_description_t;
-
-/* media entry */
-typedef struct osmo_cc_session_media {
- struct osmo_cc_session_media *next;
- osmo_cc_session_t *session;
- osmo_cc_session_media_description_t description;
- osmo_cc_session_connection_data_t connection_data_local, connection_data_remote;
- struct osmo_cc_session_codec *codec_list;
- int send, receive;
- void (*receiver)(struct osmo_cc_session_codec *codec, uint8_t marker, uint16_t sequence_number, uint32_t timestamp, uint32_t ssrc, uint8_t *data, int len);
- int rtp_socket;
- int rtcp_socket;
- uint32_t tx_ssrc, rx_ssrc;
- uint16_t tx_sequence, rx_sequence;
- uint32_t tx_timestamp, rx_timestamp;
- int accepted;
-} osmo_cc_session_media_t;
-
-/* codec entry */
-typedef struct osmo_cc_session_codec {
- struct osmo_cc_session_codec *next;
- osmo_cc_session_media_t *media;
- uint8_t payload_type_local, payload_type_remote; /* local = towards local, remote = toward remote */
- const char *payload_name;
- uint32_t payload_rate;
- int payload_channels;
- void (*encoder)(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void *priv);
- void (*decoder)(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void *priv);
- int accepted;
-} osmo_cc_session_codec_t;
-
-#define osmo_cc_session_for_each_media(head, m) \
- for (m = (head); m; m = m->next)
-
-#define osmo_cc_session_for_each_codec(head, c) \
- for (c = (head); c; c = c->next)
-
-void osmo_cc_set_local_peer(osmo_cc_session_config_t *conf, enum osmo_cc_session_nettype nettype, enum osmo_cc_session_addrtype addrtype, const char *address);
-osmo_cc_session_t *osmo_cc_new_session(osmo_cc_session_config_t *conf, void *priv, const char *username, const char *sess_id, const char *sess_version, enum osmo_cc_session_nettype nettype, enum osmo_cc_session_addrtype addrtype, const char *unicast_address, const char *session_name, int debug);
-void osmo_cc_free_session(osmo_cc_session_t *session);
-osmo_cc_session_media_t *osmo_cc_add_media(osmo_cc_session_t *session, enum osmo_cc_session_nettype nettype, enum osmo_cc_session_addrtype addrtype, const char *address, enum osmo_cc_session_media_type type, uint16_t port, enum osmo_cc_session_media_proto proto, int send, int receive, void (*receiver)(struct osmo_cc_session_codec *codec, uint8_t marker, uint16_t sequence_number, uint32_t timestamp, uint32_t ssrc, uint8_t *data, int len), int debug);
-void osmo_cc_free_media(osmo_cc_session_media_t *media);
-osmo_cc_session_codec_t *osmo_cc_add_codec(osmo_cc_session_media_t *media, const char *playload_name, uint32_t playload_rate, int playload_channels, void (*encoder)(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void *priv), void (*decoder)(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void *priv), int debug);
-void osmo_cc_free_codec(osmo_cc_session_codec_t *codec);
-int osmo_cc_session_check(struct osmo_cc_session *session, int remote);
-const char *osmo_cc_session_send_offer(osmo_cc_session_t *session);
-osmo_cc_session_t *osmo_cc_session_receive_offer(osmo_cc_session_config_t *conf, void *priv, const char *sdp);
-void osmo_cc_session_accept_media(osmo_cc_session_media_t *media, enum osmo_cc_session_nettype nettype, enum osmo_cc_session_addrtype addrtype, const char *address, int send, int receive, void (*receiver)(struct osmo_cc_session_codec *codec, uint8_t marker, uint16_t sequence_number, uint32_t timestamp, uint32_t ssrc, uint8_t *data, int len));
-void osmo_cc_session_accept_codec(osmo_cc_session_codec_t *codec, void (*encoder)(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void *priv), void (*decoder)(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len, void *priv));
-const char *osmo_cc_session_send_answer(osmo_cc_session_t *session);
-int osmo_cc_session_receive_answer(osmo_cc_session_t *session, const char *sdp);
-const char *osmo_cc_session_nettype2string(enum osmo_cc_session_nettype nettype);
-const char *osmo_cc_session_addrtype2string(enum osmo_cc_session_addrtype addrtype);
-const char *osmo_cc_session_media_type2string(enum osmo_cc_session_media_type media_type);
-const char *osmo_cc_session_media_proto2string(enum osmo_cc_session_media_proto media_proto);
-int osmo_cc_session_if_codec(osmo_cc_session_codec_t *codec, const char *name, uint32_t rate, int channels);
-int osmo_cc_session_handle(osmo_cc_session_t *session, void *codec_priv);
-
diff --git a/src/libosmocc/socket.c b/src/libosmocc/socket.c
deleted file mode 100644
index d25e1f1..0000000
--- a/src/libosmocc/socket.c
+++ /dev/null
@@ -1,583 +0,0 @@
-/* Osmo-CC: Socket handling
- *
- * (C) 2016 by Andreas Eversberg <jolly@eversberg.eu>
- * All Rights Reserved
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <string.h>
-#include <errno.h>
-#include <sys/socket.h>
-#include <netdb.h>
-#include "../libdebug/debug.h"
-#include "../libtimer/timer.h"
-#include "message.h"
-#include "cause.h"
-#include "socket.h"
-
-static const char version_string[] = OSMO_CC_VERSION;
-
-static int _getaddrinfo(const char *host, uint16_t port, struct addrinfo **result)
-{
- char portstr[8];
- struct addrinfo hints;
- int rc;
-
- sprintf(portstr, "%d", port);
-
- /* bind socket */
- memset(&hints, 0, sizeof(struct addrinfo));
- hints.ai_family = AF_UNSPEC;
- hints.ai_socktype = SOCK_STREAM;
- hints.ai_flags = AI_PASSIVE;
- hints.ai_protocol = 0;
- hints.ai_canonname = NULL;
- hints.ai_addr = NULL;
- hints.ai_next = NULL;
-
- rc = getaddrinfo(host, portstr, &hints, result);
- if (rc < 0) {
- PDEBUG(DCC, DEBUG_ERROR, "Failed to create socket for host '%s', port '%d': %s.\n", host, port, gai_strerror(rc));
- return rc;
- }
- return rc;
-}
-
-/* send a reject message toward CC process.
- * the CC process will change the reject message to a release message when not in INIT_IN state
- */
-static void rej_msg(osmo_cc_socket_t *os, uint32_t callref, uint8_t socket_cause, uint8_t isdn_cause, uint16_t sip_cause)
-{
- osmo_cc_msg_t *msg;
-
- /* create message */
- msg = osmo_cc_new_msg(OSMO_CC_MSG_REJ_REQ);
- if (!msg)
- abort();
-
- /* add cause */
- osmo_cc_add_ie_cause(msg, os->location, isdn_cause, sip_cause, socket_cause);
- osmo_cc_convert_cause_msg(msg);
-
- /* message down */
- os->recv_msg_cb(os->priv, callref, msg);
-}
-
-void tx_keepalive_timeout(struct timer *timer)
-{
- osmo_cc_conn_t *conn = (osmo_cc_conn_t *)timer->priv;
- osmo_cc_msg_t *msg;
-
- /* send keepalive message */
- msg = osmo_cc_new_msg(OSMO_CC_MSG_DUMMY_REQ);
- osmo_cc_msg_list_enqueue(&conn->os->write_list, msg, conn->callref);
- timer_start(&conn->tx_keepalive_timer, OSMO_CC_SOCKET_TX_KEEPALIVE);
-}
-
-static void close_conn(osmo_cc_conn_t *conn, uint8_t socket_cause);
-
-void rx_keepalive_timeout(struct timer *timer)
-{
- osmo_cc_conn_t *conn = (osmo_cc_conn_t *)timer->priv;
-
- PDEBUG(DCC, DEBUG_ERROR, "OsmoCC-Socket failed due to timeout.\n");
- close_conn(conn, OSMO_CC_SOCKET_CAUSE_TIMEOUT);
-}
-
-/* create socket process and bind socket */
-int osmo_cc_open_socket(osmo_cc_socket_t *os, const char *host, uint16_t port, void *priv, void (*recv_msg_cb)(void *priv, uint32_t callref, osmo_cc_msg_t *msg), uint8_t location)
-{
- int try = 0, auto_port = 0;
- struct addrinfo *result, *rp;
- int rc, sock, flags;
-
- memset(os, 0, sizeof(*os));
-
-try_again:
- /* check for given port, if NULL, autoselect port */
- if (!port || auto_port) {
- port = OSMO_CC_DEFAULT_PORT + try;
- try++;
- auto_port = 1;
- }
-
- PDEBUG(DCC, DEBUG_DEBUG, "Create socket for host %s port %d.\n", host, port);
-
- rc = _getaddrinfo(host, port, &result);
- if (rc < 0)
- return rc;
- for (rp = result; rp; rp = rp->ai_next) {
- int on = 1;
- sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
- if (sock < 0)
- continue;
- setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (unsigned char *)&on, sizeof(on));
- rc = bind(sock, rp->ai_addr, rp->ai_addrlen);
- if (rc == 0)
- break;
- close(sock);
- }
- freeaddrinfo(result);
- if (rp == NULL) {
- if (auto_port && port < OSMO_CC_DEFAULT_PORT_MAX) {
- PDEBUG(DCC, DEBUG_DEBUG, "Failed to bind host %s port %d, trying again.\n", host, port);
- goto try_again;
- }
- PDEBUG(DCC, DEBUG_ERROR, "Failed to bind given host %s port %d.\n", host, port);
- return -EIO;
- }
-
- /* listen to socket */
- rc = listen(sock, 10);
- if (rc < 0) {
- PDEBUG(DCC, DEBUG_ERROR, "Failed to listen on socket.\n");
- return rc;
- }
-
- /* set nonblocking io */
- flags = fcntl(sock, F_GETFL);
- flags |= O_NONBLOCK;
- fcntl(sock, F_SETFL, flags);
-
- os->socket = sock;
- os->recv_msg_cb = recv_msg_cb;
- os->priv = priv;
- os->location = location;
-
- return port;
-}
-
-/* create a connection */
-static osmo_cc_conn_t *open_conn(osmo_cc_socket_t *os, int sock, uint32_t callref, int read_setup)
-{
- osmo_cc_conn_t *conn, **connp;
-
- /* create connection */
- conn = calloc(1, sizeof(*conn));
- if (!conn) {
- PDEBUG(DCC, DEBUG_ERROR, "No mem!\n");
- abort();
- }
- conn->os = os;
- conn->socket = sock;
- conn->read_version = 1;
- conn->write_version = 1;
- conn->read_setup = read_setup;
- if (callref)
- conn->callref = callref;
- else
- conn->callref = osmo_cc_new_callref();
-
- timer_init(&conn->tx_keepalive_timer, tx_keepalive_timeout, conn);
- timer_init(&conn->rx_keepalive_timer, rx_keepalive_timeout, conn);
- timer_start(&conn->tx_keepalive_timer, OSMO_CC_SOCKET_TX_KEEPALIVE);
- timer_start(&conn->rx_keepalive_timer, OSMO_CC_SOCKET_RX_KEEPALIVE);
-
- PDEBUG(DCC, DEBUG_DEBUG, "New socket connection (callref %d).\n", conn->callref);
-
- /* attach to list */
- connp = &os->conn_list;
- while (*connp)
- connp = &((*connp)->next);
- *connp = conn;
-
- return conn;
-}
-
-/* remove a connection */
-static void close_conn(osmo_cc_conn_t *conn, uint8_t socket_cause)
-{
- osmo_cc_conn_t **connp;
- osmo_cc_msg_list_t *ml;
-
- /* detach connection first, to prevent a destruction during message handling (double free) */
- connp = &conn->os->conn_list;
- while (*connp != conn)
- connp = &((*connp)->next);
- *connp = conn->next;
- /* send reject message, if socket_cause is set */
- if (socket_cause && !conn->read_setup) {
- /* receive a release or reject (depending on state), but only if we sent a setup */
- rej_msg(conn->os, conn->callref, socket_cause, 0, 0);
- }
-
- PDEBUG(DCC, DEBUG_DEBUG, "Destroy socket connection (callref %d).\n", conn->callref);
-
- /* close socket */
- if (conn->socket)
- close(conn->socket);
- /* free partly received message */
- if (conn->read_msg)
- osmo_cc_free_msg(conn->read_msg);
- /* free send queue */
- while ((ml = conn->write_list)) {
- osmo_cc_free_msg(ml->msg);
- conn->write_list = ml->next;
- free(ml);
- }
- /* free timers */
- timer_exit(&conn->tx_keepalive_timer);
- timer_exit(&conn->rx_keepalive_timer);
- /* free connection (already detached above) */
- free(conn);
-}
-
-/* close socket and remove */
-void osmo_cc_close_socket(osmo_cc_socket_t *os)
-{
- osmo_cc_msg_list_t *ml;
-
- PDEBUG(DCC, DEBUG_DEBUG, "Destroy socket.\n");
-
- /* free all connections */
- while (os->conn_list)
- close_conn(os->conn_list, 0);
- /* close socket */
- if (os->socket > 0) {
- close(os->socket);
- os->socket = 0;
- }
- /* free send queue */
- while ((ml = os->write_list)) {
- osmo_cc_free_msg(ml->msg);
- os->write_list = ml->next;
- free(ml);
- }
-}
-
-/* send message to send_queue of sock instance */
-int osmo_cc_sock_send_msg(osmo_cc_socket_t *os, uint32_t callref, osmo_cc_msg_t *msg, const char *host, uint16_t port)
-{
- osmo_cc_msg_list_t *ml;
-
- /* turn _IND into _REQ and _CNF into _RSP */
- msg->type &= ~1;
-
- /* create list entry */
- ml = osmo_cc_msg_list_enqueue(&os->write_list, msg, callref);
- if (host)
- strncpy(ml->host, host, sizeof(ml->host) - 1);
- ml->port = port;
-
- return 0;
-}
-
-/* receive message
- * return 1 if work was done.
- */
-static int receive_conn(osmo_cc_conn_t *conn)
-{
- uint8_t socket_cause = OSMO_CC_SOCKET_CAUSE_BROKEN_PIPE;
- int rc;
- osmo_cc_msg_t *msg;
- uint8_t msg_type;
- int len;
- int work = 0;
-
- /* get version from remote */
- if (conn->read_version) {
- rc = recv(conn->socket, conn->read_version_string + conn->read_version_pos, strlen(version_string) - conn->read_version_pos, 0);
- if (rc < 0 && errno == EAGAIN)
- return work;
- work = 1;
- if (rc <= 0) {
- goto close;
- }
- conn->read_version_pos += rc;
- if (conn->read_version_pos == strlen(version_string)) {
- conn->read_version = 0;
- if (!!memcmp(conn->read_version_string, version_string, strlen(version_string) - 1)) {
- PDEBUG(DCC, DEBUG_NOTICE, "Remote does not seem to be an Osmo-CC socket, rejecting!\n");
- socket_cause = OSMO_CC_SOCKET_CAUSE_FAILED;
- goto close;
- }
- if (conn->read_version_string[strlen(version_string) - 1] != version_string[strlen(version_string) - 1]) {
- PDEBUG(DCC, DEBUG_NOTICE, "Remote Osmo-CC socket has wrong version (local=%s, remote=%s), rejecting!\n", version_string, conn->read_version_string);
- socket_cause = OSMO_CC_SOCKET_CAUSE_VERSION_MISMATCH;
- goto close;
- }
- } else
- return work;
- }
-
-try_next_message:
- /* read message header from remote */
- if (!conn->read_msg) {
- rc = recv(conn->socket, ((uint8_t *)&conn->read_hdr) + conn->read_pos, sizeof(conn->read_hdr) - conn->read_pos, 0);
- if (rc < 0 && errno == EAGAIN)
- return work;
- work = 1;
- if (rc <= 0) {
- goto close;
- }
- conn->read_pos += rc;
- if (conn->read_pos == sizeof(conn->read_hdr)) {
- conn->read_msg = osmo_cc_new_msg(conn->read_hdr.type);
- if (!conn->read_msg)
- abort();
- conn->read_msg->length_networkorder = conn->read_hdr.length_networkorder;
- /* prepare for reading message */
- conn->read_pos = 0;
- } else
- return work;
- }
-
- /* read message data from remote */
- msg = conn->read_msg;
- len = ntohs(msg->length_networkorder);
- if (len == 0)
- goto empty_message;
- rc = recv(conn->socket, msg->data + conn->read_pos, len - conn->read_pos, 0);
- if (rc < 0 && errno == EAGAIN)
- return work;
- work = 1;
- if (rc <= 0) {
- goto close;
- }
- conn->read_pos += rc;
- if (conn->read_pos == len) {
-empty_message:
- /* start RX keepalive timeer, if not already */
- timer_start(&conn->rx_keepalive_timer, OSMO_CC_SOCKET_RX_KEEPALIVE);
- /* we got our setup message, so we clear the flag */
- conn->read_setup = 0;
- /* prepare for reading header */
- conn->read_pos = 0;
- /* detach message first, because the connection might be destroyed during message handling */
- msg_type = conn->read_msg->type;
- conn->read_msg = NULL;
- /* drop dummy or forward message */
- if (msg_type == OSMO_CC_MSG_DUMMY_REQ)
- osmo_cc_free_msg(msg);
- else
- conn->os->recv_msg_cb(conn->os->priv, conn->callref, msg);
- if (msg_type == OSMO_CC_MSG_REL_REQ || msg_type == OSMO_CC_MSG_REJ_REQ) {
- PDEBUG(DCC, DEBUG_DEBUG, "closing socket because we received a release or reject message.\n");
- close_conn(conn, 0);
- return 1; /* conn removed */
- }
- goto try_next_message;
- }
- return work;
-
-close:
- PDEBUG(DCC, DEBUG_ERROR, "OsmoCC-Socket failed, socket cause %d.\n", socket_cause);
- close_conn(conn, socket_cause);
- return work; /* conn removed */
-}
-
-/* transmit message
- * return 1 if work was done.
- */
-static int transmit_conn(osmo_cc_conn_t *conn)
-{
- uint8_t socket_cause = OSMO_CC_SOCKET_CAUSE_BROKEN_PIPE;
- int rc;
- osmo_cc_msg_t *msg;
- int len;
- osmo_cc_msg_list_t *ml;
- int work = 0;
-
- /* send socket version to remote */
- if (conn->write_version) {
- rc = write(conn->socket, version_string, strlen(version_string));
- if (rc < 0 && errno == EAGAIN)
- return work;
- work = 1;
- if (rc <= 0) {
- goto close;
- }
- if (rc != strlen(version_string)) {
- PDEBUG(DCC, DEBUG_ERROR, "short write, please fix handling!\n");
- abort();
- }
- conn->write_version = 0;
- }
-
- /* send message to remote */
- while (conn->write_list) {
- timer_stop(&conn->tx_keepalive_timer);
- msg = conn->write_list->msg;
- len = sizeof(*msg) + ntohs(msg->length_networkorder);
- rc = write(conn->socket, msg, len);
- if (rc < 0 && errno == EAGAIN)
- return work;
- work = 1;
- if (rc <= 0) {
- goto close;
- }
- if (rc != len) {
- PDEBUG(DCC, DEBUG_ERROR, "short write, please fix handling!\n");
- abort();
- }
- /* close socket after sending release/reject message */
- if (msg->type == OSMO_CC_MSG_REL_REQ || msg->type == OSMO_CC_MSG_REJ_REQ) {
- PDEBUG(DCC, DEBUG_DEBUG, "closing socket because we sent a release or reject message.\n");
- close_conn(conn, 0);
- return work; /* conn removed */
- }
- /* free message after sending */
- ml = conn->write_list;
- conn->write_list = ml->next;
- osmo_cc_free_msg(msg);
- free(ml);
- }
-
- /* start TX keepalive timeer, if not already
- * because we stop at every message above, we actually restart the timer here.
- * only if there is no message for the amount of time, the timer fires.
- */
- if (!timer_running(&conn->tx_keepalive_timer))
- timer_start(&conn->tx_keepalive_timer, OSMO_CC_SOCKET_TX_KEEPALIVE);
-
- return work;
-
-close:
- PDEBUG(DCC, DEBUG_NOTICE, "OsmoCC-Socket failed.\n");
- close_conn(conn, socket_cause);
- return work; /* conn removed */
-}
-
-/* handle all sockets of a socket interface
- * return 1 if work was done.
- */
-int osmo_cc_handle_socket(osmo_cc_socket_t *os)
-{
- struct sockaddr_storage sa;
- socklen_t slen = sizeof(sa);
- int sock;
- osmo_cc_conn_t *conn;
- osmo_cc_msg_list_t *ml, **mlp;
- int flags;
- struct addrinfo *result, *rp;
- int rc;
- int work = 0;
-
- /* handle messages in send queue */
- while ((ml = os->write_list)) {
- work = 1;
- /* detach list entry */
- os->write_list = ml->next;
- ml->next = NULL;
- /* search for socket connection */
- for (conn = os->conn_list; conn; conn=conn->next) {
- if (conn->callref == ml->callref)
- break;
- }
- if (conn) {
- /* attach to list */
- mlp = &conn->write_list;
- while (*mlp)
- mlp = &((*mlp)->next);
- *mlp = ml;
- /* done with message */
- continue;
- }
-
- /* reject and release are ignored */
- if (ml->msg->type == OSMO_CC_MSG_REJ_REQ
- || ml->msg->type == OSMO_CC_MSG_REL_REQ) {
- /* drop message */
- osmo_cc_free_msg(ml->msg);
- free(ml);
- /* done with message */
- continue;
- }
-
- /* reject, if this is not a setup message */
- if (ml->msg->type != OSMO_CC_MSG_SETUP_REQ
- && ml->msg->type != OSMO_CC_MSG_ATTACH_REQ) {
- PDEBUG(DCC, DEBUG_ERROR, "Message with unknown callref.\n");
- rej_msg(os, ml->callref, 0, OSMO_CC_ISDN_CAUSE_INVAL_CALLREF, 0);
- /* drop message */
- osmo_cc_free_msg(ml->msg);
- free(ml);
- /* done with message */
- continue;
- }
- /* connect to remote */
- rc = _getaddrinfo(ml->host, ml->port, &result);
- if (rc < 0) {
- rej_msg(os, ml->callref, OSMO_CC_SOCKET_CAUSE_FAILED, 0, 0);
- /* drop message */
- osmo_cc_free_msg(ml->msg);
- free(ml);
- /* done with message */
- continue;
- }
- for (rp = result; rp; rp = rp->ai_next) {
- sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
- if (sock < 0)
- continue;
- /* set nonblocking io */
- flags = fcntl(sock, F_GETFL);
- flags |= O_NONBLOCK;
- fcntl(sock, F_SETFL, flags);
- /* connect */
- rc = connect(sock, rp->ai_addr, rp->ai_addrlen);
- if (rc == 0 || errno == EINPROGRESS)
- break;
- close(sock);
- }
- freeaddrinfo(result);
- if (rp == NULL) {
- PDEBUG(DCC, DEBUG_ERROR, "Failed to connect to given host %s port %d.\n", ml->host, ml->port);
- rej_msg(os, ml->callref, OSMO_CC_SOCKET_CAUSE_FAILED, 0, 0);
- /* drop message */
- osmo_cc_free_msg(ml->msg);
- free(ml);
- /* done with message */
- continue;
- }
- /* create connection */
- conn = open_conn(os, sock, ml->callref, 0);
- /* attach to list */
- conn->write_list = ml;
- /* done with (setup) message */
- }
-
- /* handle new socket connection */
- while ((sock = accept(os->socket, (struct sockaddr *)&sa, &slen)) > 0) {
- work = 1;
- /* set nonblocking io */
- flags = fcntl(sock, F_GETFL);
- flags |= O_NONBLOCK;
- fcntl(sock, F_SETFL, flags);
- /* create connection */
- open_conn(os, sock, 0, 1);
- }
-
- /* start with list after each read/write, because while handling (the message), one or more connections may be destroyed */
- for (conn = os->conn_list; conn; conn=conn->next) {
- /* check for rx */
- work = receive_conn(conn);
- /* if "change" is set, connection list might have changed, so we restart processing the list */
- if (work)
- break;
- /* check for tx */
- work = transmit_conn(conn);
- /* if "change" is set, connection list might have changed, so we restart processing the list */
- if (work)
- break;
- }
-
- return work;
-}
-
diff --git a/src/libosmocc/socket.h b/src/libosmocc/socket.h
deleted file mode 100644
index bcd8b7c..0000000
--- a/src/libosmocc/socket.h
+++ /dev/null
@@ -1,44 +0,0 @@
-#ifndef OSMO_CC_SOCKET_H
-#define OSMO_CC_SOCKET_H
-
-#define OSMO_CC_DEFAULT_PORT 4200
-#define OSMO_CC_DEFAULT_PORT_MAX 4219
-
-#define OSMO_CC_SOCKET_TX_KEEPALIVE 10.0
-#define OSMO_CC_SOCKET_RX_KEEPALIVE 20.0
-
-struct osmo_cc_socket;
-
-typedef struct osmo_cc_conn {
- struct osmo_cc_conn *next;
- struct osmo_cc_socket *os;
- int socket;
- uint32_t callref;
- int read_setup;
- int read_version;
- char read_version_string[sizeof(OSMO_CC_VERSION)]; /* must include 0-termination */
- int read_version_pos;
- int write_version;
- osmo_cc_msg_t read_hdr;
- osmo_cc_msg_t *read_msg;
- int read_pos;
- osmo_cc_msg_list_t *write_list;
- struct timer tx_keepalive_timer;
- struct timer rx_keepalive_timer;
-} osmo_cc_conn_t;
-
-typedef struct osmo_cc_socket {
- int socket;
- osmo_cc_conn_t *conn_list;
- osmo_cc_msg_list_t *write_list;
- void (*recv_msg_cb)(void *priv, uint32_t callref, osmo_cc_msg_t *msg);
- void *priv;
- uint8_t location;
-} osmo_cc_socket_t;
-
-int osmo_cc_open_socket(osmo_cc_socket_t *os, const char *host, uint16_t port, void *priv, void (*recv_msg_cb)(void *priv, uint32_t callref, osmo_cc_msg_t *msg), uint8_t location);
-void osmo_cc_close_socket(osmo_cc_socket_t *os);
-int osmo_cc_sock_send_msg(osmo_cc_socket_t *os, uint32_t callref, osmo_cc_msg_t *msg, const char *host, uint16_t port);
-int osmo_cc_handle_socket(osmo_cc_socket_t *os);
-
-#endif /* OSMO_CC_SOCKET_H */
diff --git a/src/libsample/Makefile.am b/src/libsample/Makefile.am
index 5ae865c..c2406ca 100644
--- a/src/libsample/Makefile.am
+++ b/src/libsample/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
noinst_LIBRARIES = libsample.a
diff --git a/src/libsamplerate/Makefile.am b/src/libsamplerate/Makefile.am
index bd2319f..a484336 100644
--- a/src/libsamplerate/Makefile.am
+++ b/src/libsamplerate/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
noinst_LIBRARIES = libsamplerate.a
diff --git a/src/libscrambler/Makefile.am b/src/libscrambler/Makefile.am
index 05e1e05..64c337b 100644
--- a/src/libscrambler/Makefile.am
+++ b/src/libscrambler/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
noinst_LIBRARIES = libscrambler.a
diff --git a/src/libsdr/Makefile.am b/src/libsdr/Makefile.am
index 2050a17..7d074f3 100644
--- a/src/libsdr/Makefile.am
+++ b/src/libsdr/Makefile.am
@@ -1,4 +1,5 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes) $(SOAPY_CFLAGS)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes) \
+ $(SOAPY_CFLAGS)
noinst_LIBRARIES = libsdr.a
diff --git a/src/libsdr/sdr.c b/src/libsdr/sdr.c
index 32645ab..e322b5e 100644
--- a/src/libsdr/sdr.c
+++ b/src/libsdr/sdr.c
@@ -31,7 +31,7 @@ enum paging_signal;
#include "../libsample/sample.h"
#include "../libfm/fm.h"
#include "../libam/am.h"
-#include "../libtimer/timer.h"
+#include <osmocom/core/timer.h>
#include "../libmobile/sender.h"
#include "sdr_config.h"
#include "sdr.h"
@@ -41,7 +41,7 @@ enum paging_signal;
#ifdef HAVE_SOAPY
#include "soapy.h"
#endif
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
/* enable to debug buffer handling */
//#define DEBUG_BUFFER
@@ -130,14 +130,14 @@ static void show_spectrum(const char *direction, double halfbandwidth, double ce
text[x] = 'P';
}
- PDEBUG(DSDR, DEBUG_INFO, "%s Spectrum:\n%s\n---------------------------------------+---------------------------------------\n", direction, text);
+ LOGP(DSDR, LOGL_INFO, "%s Spectrum:\n%s\n---------------------------------------+---------------------------------------\n", direction, text);
for (i = 0; i < num; i++)
- PDEBUG(DSDR, DEBUG_INFO, "Frequency %c = %.4f MHz\n", '1' + i, frequency[i] / 1e6);
+ LOGP(DSDR, LOGL_INFO, "Frequency %c = %.4f MHz\n", '1' + i, frequency[i] / 1e6);
if (paging_frequency)
- PDEBUG(DSDR, DEBUG_INFO, "Frequency P = %.4f MHz (Paging Frequency)\n", paging_frequency / 1e6);
+ LOGP(DSDR, LOGL_INFO, "Frequency P = %.4f MHz (Paging Frequency)\n", paging_frequency / 1e6);
}
-void *sdr_open(const char __attribute__((__unused__)) *device, double *tx_frequency, double *rx_frequency, int *am, int channels, double paging_frequency, int samplerate, int buffer_size, double interval, double max_deviation, double max_modulation, double modulation_index)
+void *sdr_open(int __attribute__((__unused__)) direction, const char __attribute__((__unused__)) *device, double *tx_frequency, double *rx_frequency, int *am, int channels, double paging_frequency, int samplerate, int buffer_size, double interval, double max_deviation, double max_modulation, double modulation_index)
{
sdr_t *sdr;
int threads = 1, oversample = 1; /* always use threads */
@@ -146,17 +146,17 @@ void *sdr_open(const char __attribute__((__unused__)) *device, double *tx_freque
int rc;
int c;
- PDEBUG(DSDR, DEBUG_DEBUG, "Open SDR device\n");
+ LOGP(DSDR, LOGL_DEBUG, "Open SDR device\n");
if (sdr_config->samplerate != samplerate) {
if (samplerate > sdr_config->samplerate) {
- PDEBUG(DSDR, DEBUG_ERROR, "SDR sample rate must be greater than audio sample rate!\n");
- PDEBUG(DSDR, DEBUG_ERROR, "You selected an SDR rate of %d and an audio rate of %d.\n", sdr_config->samplerate, samplerate);
+ LOGP(DSDR, LOGL_ERROR, "SDR sample rate must be greater than audio sample rate!\n");
+ LOGP(DSDR, LOGL_ERROR, "You selected an SDR rate of %d and an audio rate of %d.\n", sdr_config->samplerate, samplerate);
return NULL;
}
if ((sdr_config->samplerate % samplerate)) {
- PDEBUG(DSDR, DEBUG_ERROR, "SDR sample rate must be a multiple of audio sample rate!\n");
- PDEBUG(DSDR, DEBUG_ERROR, "You selected an SDR rate of %d and an audio rate of %d.\n", sdr_config->samplerate, samplerate);
+ LOGP(DSDR, LOGL_ERROR, "SDR sample rate must be a multiple of audio sample rate!\n");
+ LOGP(DSDR, LOGL_ERROR, "You selected an SDR rate of %d and an audio rate of %d.\n", sdr_config->samplerate, samplerate);
return NULL;
}
oversample = sdr_config->samplerate / samplerate;
@@ -165,11 +165,11 @@ void *sdr_open(const char __attribute__((__unused__)) *device, double *tx_freque
bandwidth = 2.0 * (max_deviation + max_modulation);
if (bandwidth)
- PDEBUG(DSDR, DEBUG_INFO, "Require bandwidth of each channel is 2 * (%.1f deviation + %.1f modulation) = %.1f KHz\n", max_deviation / 1e3, max_modulation / 1e3, bandwidth / 1e3);
+ LOGP(DSDR, LOGL_INFO, "Require bandwidth of each channel is 2 * (%.1f deviation + %.1f modulation) = %.1f KHz\n", max_deviation / 1e3, max_modulation / 1e3, bandwidth / 1e3);
sdr = calloc(sizeof(*sdr), 1);
if (!sdr) {
- PDEBUG(DSDR, DEBUG_ERROR, "NO MEM!\n");
+ LOGP(DSDR, LOGL_ERROR, "NO MEM!\n");
goto error;
}
sdr->channels = channels;
@@ -185,12 +185,12 @@ void *sdr_open(const char __attribute__((__unused__)) *device, double *tx_freque
sdr->thread_read.buffer_size = sdr->buffer_size * 2 * sdr->oversample + 2;
sdr->thread_read.buffer = calloc(sdr->thread_read.buffer_size, sizeof(*sdr->thread_read.buffer));
if (!sdr->thread_read.buffer) {
- PDEBUG(DSDR, DEBUG_ERROR, "No mem!\n");
+ LOGP(DSDR, LOGL_ERROR, "No mem!\n");
goto error;
}
sdr->thread_read.buffer2 = calloc(sdr->thread_read.buffer_size, sizeof(*sdr->thread_read.buffer2));
if (!sdr->thread_read.buffer2) {
- PDEBUG(DSDR, DEBUG_ERROR, "No mem!\n");
+ LOGP(DSDR, LOGL_ERROR, "No mem!\n");
goto error;
}
sdr->thread_read.in = sdr->thread_read.out = 0;
@@ -202,12 +202,12 @@ void *sdr_open(const char __attribute__((__unused__)) *device, double *tx_freque
sdr->thread_write.buffer_size = sdr->buffer_size * 2 + 2;
sdr->thread_write.buffer = calloc(sdr->thread_write.buffer_size, sizeof(*sdr->thread_write.buffer));
if (!sdr->thread_write.buffer) {
- PDEBUG(DSDR, DEBUG_ERROR, "No mem!\n");
+ LOGP(DSDR, LOGL_ERROR, "No mem!\n");
goto error;
}
sdr->thread_write.buffer2 = calloc(sdr->thread_write.buffer_size * sdr->oversample, sizeof(*sdr->thread_write.buffer2));
if (!sdr->thread_write.buffer2) {
- PDEBUG(DSDR, DEBUG_ERROR, "No mem!\n");
+ LOGP(DSDR, LOGL_ERROR, "No mem!\n");
goto error;
}
sdr->thread_write.in = sdr->thread_write.out = 0;
@@ -220,32 +220,32 @@ void *sdr_open(const char __attribute__((__unused__)) *device, double *tx_freque
/* alloc fm modulation buffers */
sdr->modbuff = calloc(sdr->buffer_size * 2, sizeof(*sdr->modbuff));
if (!sdr->modbuff) {
- PDEBUG(DSDR, DEBUG_ERROR, "NO MEM!\n");
+ LOGP(DSDR, LOGL_ERROR, "NO MEM!\n");
goto error;
}
sdr->modbuff_I = calloc(sdr->buffer_size, sizeof(*sdr->modbuff_I));
if (!sdr->modbuff_I) {
- PDEBUG(DSDR, DEBUG_ERROR, "NO MEM!\n");
+ LOGP(DSDR, LOGL_ERROR, "NO MEM!\n");
goto error;
}
sdr->modbuff_Q = calloc(sdr->buffer_size, sizeof(*sdr->modbuff_Q));
if (!sdr->modbuff_Q) {
- PDEBUG(DSDR, DEBUG_ERROR, "NO MEM!\n");
+ LOGP(DSDR, LOGL_ERROR, "NO MEM!\n");
goto error;
}
sdr->modbuff_carrier = calloc(sdr->buffer_size, sizeof(*sdr->modbuff_carrier));
if (!sdr->modbuff_carrier) {
- PDEBUG(DSDR, DEBUG_ERROR, "NO MEM!\n");
+ LOGP(DSDR, LOGL_ERROR, "NO MEM!\n");
goto error;
}
sdr->wavespl0 = calloc(sdr->buffer_size, sizeof(*sdr->wavespl0));
if (!sdr->wavespl0) {
- PDEBUG(DSDR, DEBUG_ERROR, "NO MEM!\n");
+ LOGP(DSDR, LOGL_ERROR, "NO MEM!\n");
goto error;
}
sdr->wavespl1 = calloc(sdr->buffer_size, sizeof(*sdr->wavespl1));
if (!sdr->wavespl1) {
- PDEBUG(DSDR, DEBUG_ERROR, "NO MEM!\n");
+ LOGP(DSDR, LOGL_ERROR, "NO MEM!\n");
goto error;
}
@@ -259,7 +259,7 @@ void *sdr_open(const char __attribute__((__unused__)) *device, double *tx_freque
if (channels) {
sdr->chan = calloc(sizeof(*sdr->chan), channels + (sdr->paging_channel != 0));
if (!sdr->chan) {
- PDEBUG(DSDR, DEBUG_ERROR, "NO MEM!\n");
+ LOGP(DSDR, LOGL_ERROR, "NO MEM!\n");
goto error;
}
}
@@ -267,7 +267,7 @@ void *sdr_open(const char __attribute__((__unused__)) *device, double *tx_freque
/* swap links, if required */
if (sdr_config->swap_links) {
double *temp;
- PDEBUG(DSDR, DEBUG_NOTICE, "Sapping RX and TX frequencies!\n");
+ LOGP(DSDR, LOGL_NOTICE, "Sapping RX and TX frequencies!\n");
temp = rx_frequency;
rx_frequency = tx_frequency;
tx_frequency = temp;
@@ -304,10 +304,10 @@ void *sdr_open(const char __attribute__((__unused__)) *device, double *tx_freque
This is correct, since there is no bandwidth
below new center frequency.
*/
- PDEBUG(DSDR, DEBUG_INFO, "We shift center frequency %.0f KHz down (half bandwidth), to prevent channel from overlap with DC level.\n", bandwidth / 2.0 / 1e3);
+ LOGP(DSDR, LOGL_INFO, "We shift center frequency %.0f KHz down (half bandwidth), to prevent channel from overlap with DC level.\n", bandwidth / 2.0 / 1e3);
} else {
/* find two channels that are aside the center */
- double low_dist, high_dist, dist;
+ double low_dist = 0, high_dist = 0, dist;
int low_c = -1, high_c = -1;
for (c = 0; c < channels; c++) {
dist = fabs(tx_center_frequency - sdr->chan[c].tx_frequency);
@@ -342,7 +342,7 @@ void *sdr_open(const char __attribute__((__unused__)) *device, double *tx_freque
tx_center_frequency =
((sdr->chan[low_c].tx_frequency) +
(sdr->chan[high_c].tx_frequency)) / 2.0;
- PDEBUG(DSDR, DEBUG_INFO, "We move center freqeuency between the two channels in the middle, to prevent them from overlap with DC level.\n");
+ LOGP(DSDR, LOGL_INFO, "We move center freqeuency between the two channels in the middle, to prevent them from overlap with DC level.\n");
}
}
@@ -354,20 +354,20 @@ void *sdr_open(const char __attribute__((__unused__)) *device, double *tx_freque
low_side = (tx_center_frequency - tx_low_frequency) + bandwidth / 2.0;
high_side = (tx_high_frequency - tx_center_frequency) + bandwidth / 2.0;
range = ((low_side > high_side) ? low_side : high_side) * 2.0;
- PDEBUG(DSDR, DEBUG_INFO, "Total bandwidth (two side bands) for all TX Frequencies: %.0f Hz\n", range);
+ LOGP(DSDR, LOGL_INFO, "Total bandwidth (two side bands) for all TX Frequencies: %.0f Hz\n", range);
if (range > samplerate * USABLE_BANDWIDTH) {
- PDEBUG(DSDR, DEBUG_NOTICE, "*******************************************************************************\n");
- PDEBUG(DSDR, DEBUG_NOTICE, "The required bandwidth of %.0f Hz exceeds %.0f%% of the sample rate.\n", range, USABLE_BANDWIDTH * 100.0);
- PDEBUG(DSDR, DEBUG_NOTICE, "Please increase samplerate!\n");
- PDEBUG(DSDR, DEBUG_NOTICE, "*******************************************************************************\n");
+ LOGP(DSDR, LOGL_NOTICE, "*******************************************************************************\n");
+ LOGP(DSDR, LOGL_NOTICE, "The required bandwidth of %.0f Hz exceeds %.0f%% of the sample rate.\n", range, USABLE_BANDWIDTH * 100.0);
+ LOGP(DSDR, LOGL_NOTICE, "Please increase samplerate!\n");
+ LOGP(DSDR, LOGL_NOTICE, "*******************************************************************************\n");
goto error;
}
- PDEBUG(DSDR, DEBUG_INFO, "Using center frequency: TX %.6f MHz\n", tx_center_frequency / 1e6);
+ LOGP(DSDR, LOGL_INFO, "Using center frequency: TX %.6f MHz\n", tx_center_frequency / 1e6);
/* set offsets to center frequency */
for (c = 0; c < channels; c++) {
double tx_offset;
tx_offset = sdr->chan[c].tx_frequency - tx_center_frequency;
- PDEBUG(DSDR, DEBUG_DEBUG, "Frequency #%d: TX offset: %.6f MHz\n", c, tx_offset / 1e6);
+ LOGP(DSDR, LOGL_DEBUG, "Frequency #%d: TX offset: %.6f MHz\n", c, tx_offset / 1e6);
sdr->chan[c].am = am[c];
if (am[c]) {
double gain, bias;
@@ -382,18 +382,18 @@ void *sdr_open(const char __attribute__((__unused__)) *device, double *tx_freque
if (sdr->paging_channel) {
double tx_offset;
tx_offset = sdr->chan[sdr->paging_channel].tx_frequency - tx_center_frequency;
- PDEBUG(DSDR, DEBUG_DEBUG, "Paging Frequency: TX offset: %.6f MHz\n", tx_offset / 1e6);
+ LOGP(DSDR, LOGL_DEBUG, "Paging Frequency: TX offset: %.6f MHz\n", tx_offset / 1e6);
rc = fm_mod_init(&sdr->chan[sdr->paging_channel].fm_mod, samplerate, tx_offset, sdr->amplitude);
if (rc < 0)
goto error;
}
/* show gain */
- PDEBUG(DSDR, DEBUG_INFO, "Using gain: TX %.1f dB\n", sdr_config->tx_gain);
+ LOGP(DSDR, LOGL_INFO, "Using gain: TX %.1f dB\n", sdr_config->tx_gain);
/* open wave */
if (sdr_config->write_iq_tx_wave) {
rc = wave_create_record(&sdr->wave_tx_rec, sdr_config->write_iq_tx_wave, samplerate, 2, 1.0);
if (rc < 0) {
- PDEBUG(DSDR, DEBUG_ERROR, "Failed to create WAVE recoding instance!\n");
+ LOGP(DSDR, LOGL_ERROR, "Failed to create WAVE recoding instance!\n");
goto error;
}
}
@@ -401,7 +401,7 @@ void *sdr_open(const char __attribute__((__unused__)) *device, double *tx_freque
int two = 2;
rc = wave_create_playback(&sdr->wave_tx_play, sdr_config->read_iq_tx_wave, &samplerate, &two, 1.0);
if (rc < 0) {
- PDEBUG(DSDR, DEBUG_ERROR, "Failed to create WAVE playback instance!\n");
+ LOGP(DSDR, LOGL_ERROR, "Failed to create WAVE playback instance!\n");
goto error;
}
}
@@ -430,7 +430,7 @@ void *sdr_open(const char __attribute__((__unused__)) *device, double *tx_freque
This is correct, since there is no bandwidth
below new center frequency.
*/
- PDEBUG(DSDR, DEBUG_INFO, "We shift center frequency %.0f KHz down (half bandwidth), to prevent channel from overlap with DC level.\n", bandwidth / 2.0 / 1e3);
+ LOGP(DSDR, LOGL_INFO, "We shift center frequency %.0f KHz down (half bandwidth), to prevent channel from overlap with DC level.\n", bandwidth / 2.0 / 1e3);
} else {
/* find two channels that are aside the center */
double low_dist, high_dist, dist;
@@ -454,7 +454,7 @@ void *sdr_open(const char __attribute__((__unused__)) *device, double *tx_freque
rx_center_frequency =
((sdr->chan[low_c].rx_frequency) +
(sdr->chan[high_c].rx_frequency)) / 2.0;
- PDEBUG(DSDR, DEBUG_INFO, "We move center freqeuency between the two channels in the middle, to prevent them from overlap with DC level.\n");
+ LOGP(DSDR, LOGL_INFO, "We move center freqeuency between the two channels in the middle, to prevent them from overlap with DC level.\n");
}
}
@@ -466,35 +466,35 @@ void *sdr_open(const char __attribute__((__unused__)) *device, double *tx_freque
low_side = (rx_center_frequency - rx_low_frequency) + bandwidth / 2.0;
high_side = (rx_high_frequency - rx_center_frequency) + bandwidth / 2.0;
range = ((low_side > high_side) ? low_side : high_side) * 2.0;
- PDEBUG(DSDR, DEBUG_INFO, "Total bandwidth (two side bands) for all RX Frequencies: %.0f Hz\n", range);
+ LOGP(DSDR, LOGL_INFO, "Total bandwidth (two side bands) for all RX Frequencies: %.0f Hz\n", range);
if (range > samplerate * USABLE_BANDWIDTH) {
- PDEBUG(DSDR, DEBUG_NOTICE, "*******************************************************************************\n");
- PDEBUG(DSDR, DEBUG_NOTICE, "The required bandwidth of %.0f Hz exceeds %.0f%% of the sample rate.\n", range, USABLE_BANDWIDTH * 100.0);
- PDEBUG(DSDR, DEBUG_NOTICE, "Please increase samplerate!\n");
- PDEBUG(DSDR, DEBUG_NOTICE, "*******************************************************************************\n");
+ LOGP(DSDR, LOGL_NOTICE, "*******************************************************************************\n");
+ LOGP(DSDR, LOGL_NOTICE, "The required bandwidth of %.0f Hz exceeds %.0f%% of the sample rate.\n", range, USABLE_BANDWIDTH * 100.0);
+ LOGP(DSDR, LOGL_NOTICE, "Please increase samplerate!\n");
+ LOGP(DSDR, LOGL_NOTICE, "*******************************************************************************\n");
goto error;
}
- PDEBUG(DSDR, DEBUG_INFO, "Using center frequency: RX %.6f MHz\n", rx_center_frequency / 1e6);
+ LOGP(DSDR, LOGL_INFO, "Using center frequency: RX %.6f MHz\n", rx_center_frequency / 1e6);
/* set offsets to center frequency */
for (c = 0; c < channels; c++) {
double rx_offset;
rx_offset = sdr->chan[c].rx_frequency - rx_center_frequency;
- PDEBUG(DSDR, DEBUG_DEBUG, "Frequency #%d: RX offset: %.6f MHz\n", c, rx_offset / 1e6);
+ LOGP(DSDR, LOGL_DEBUG, "Frequency #%d: RX offset: %.6f MHz\n", c, rx_offset / 1e6);
sdr->chan[c].am = am[c];
if (am[c])
- rc = am_demod_init(&sdr->chan[c].am_demod, samplerate, rx_offset, bandwidth, 1.0 / modulation_index);
+ rc = am_demod_init(&sdr->chan[c].am_demod, samplerate, rx_offset, bandwidth / 2.0, 1.0 / modulation_index); /* bandwidth is only one side band */
else
- rc = fm_demod_init(&sdr->chan[c].fm_demod, samplerate, rx_offset, bandwidth / 2.0);
+ rc = fm_demod_init(&sdr->chan[c].fm_demod, samplerate, rx_offset, bandwidth); /* bandwidth are deviation and both side bands */
if (rc < 0)
goto error;
}
/* show gain */
- PDEBUG(DSDR, DEBUG_INFO, "Using gain: RX %.1f dB\n", sdr_config->rx_gain);
+ LOGP(DSDR, LOGL_INFO, "Using gain: RX %.1f dB\n", sdr_config->rx_gain);
/* open wave */
if (sdr_config->write_iq_rx_wave) {
rc = wave_create_record(&sdr->wave_rx_rec, sdr_config->write_iq_rx_wave, samplerate, 2, 1.0);
if (rc < 0) {
- PDEBUG(DSDR, DEBUG_ERROR, "Failed to create WAVE recoding instance!\n");
+ LOGP(DSDR, LOGL_ERROR, "Failed to create WAVE recoding instance!\n");
goto error;
}
}
@@ -502,7 +502,7 @@ void *sdr_open(const char __attribute__((__unused__)) *device, double *tx_freque
int two = 2;
rc = wave_create_playback(&sdr->wave_rx_play, sdr_config->read_iq_rx_wave, &samplerate, &two, 1.0);
if (rc < 0) {
- PDEBUG(DSDR, DEBUG_ERROR, "Failed to create WAVE playback instance!\n");
+ LOGP(DSDR, LOGL_ERROR, "Failed to create WAVE playback instance!\n");
goto error;
}
}
@@ -522,7 +522,7 @@ void *sdr_open(const char __attribute__((__unused__)) *device, double *tx_freque
display_iq_init(samplerate);
display_spectrum_init(samplerate, rx_center_frequency);
- PDEBUG(DSDR, DEBUG_INFO, "Using local oscillator offseet: %.0f Hz\n", sdr_config->lo_offset);
+ LOGP(DSDR, LOGL_INFO, "Using local oscillator offseet: %.0f Hz\n", sdr_config->lo_offset);
#ifdef HAVE_UHD
if (sdr_config->uhd) {
@@ -570,7 +570,7 @@ static void sdr_bias(float *buffer, int count)
if (bias_count >= sdr_config->samplerate) {
bias_I /= bias_count;
bias_Q /= bias_count;
- PDEBUG(DSDR, DEBUG_INFO, "DC bias calibration finished.\n");
+ LOGP(DSDR, LOGL_INFO, "DC bias calibration finished.\n");
}
} else {
for (i = 0; i < count; i++) {
@@ -625,7 +625,7 @@ static void *sdr_write_child(void *arg)
usleep(sdr->interval * 1000.0);
}
- PDEBUG(DSDR, DEBUG_DEBUG, "Thread received exit!\n");
+ LOGP(DSDR, LOGL_DEBUG, "Thread received exit!\n");
sdr->thread_write.exit = 1;
return NULL;
}
@@ -677,7 +677,7 @@ static void *sdr_read_child(void *arg)
usleep(sdr->interval * 1000.0);
}
- PDEBUG(DSDR, DEBUG_DEBUG, "Thread received exit!\n");
+ LOGP(DSDR, LOGL_DEBUG, "Thread received exit!\n");
sdr->thread_read.exit = 1;
return NULL;
}
@@ -704,13 +704,13 @@ int sdr_start(void *inst)
pthread_t tid;
char tname[64];
- PDEBUG(DSDR, DEBUG_DEBUG, "Create threads!\n");
+ LOGP(DSDR, LOGL_DEBUG, "Create threads!\n");
sdr->thread_write.running = 1;
sdr->thread_write.exit = 0;
rc = pthread_create(&tid, NULL, sdr_write_child, inst);
if (rc < 0) {
sdr->thread_write.running = 0;
- PDEBUG(DSDR, DEBUG_ERROR, "Failed to create thread!\n");
+ LOGP(DSDR, LOGL_ERROR, "Failed to create thread!\n");
return rc;
}
pthread_getname_np(tid, tname, sizeof(tname));
@@ -722,7 +722,7 @@ int sdr_start(void *inst)
rc = pthread_create(&tid, NULL, sdr_read_child, inst);
if (rc < 0) {
sdr->thread_read.running = 0;
- PDEBUG(DSDR, DEBUG_ERROR, "Failed to create thread!\n");
+ LOGP(DSDR, LOGL_ERROR, "Failed to create thread!\n");
return rc;
}
pthread_getname_np(tid, tname, sizeof(tname));
@@ -738,17 +738,17 @@ void sdr_close(void *inst)
{
sdr_t *sdr = (sdr_t *)inst;
- PDEBUG(DSDR, DEBUG_DEBUG, "Close SDR device\n");
+ LOGP(DSDR, LOGL_DEBUG, "Close SDR device\n");
if (sdr->threads) {
if (sdr->thread_write.running) {
- PDEBUG(DSDR, DEBUG_DEBUG, "Thread sending exit!\n");
+ LOGP(DSDR, LOGL_DEBUG, "Thread sending exit!\n");
sdr->thread_write.running = 0;
while (sdr->thread_write.exit == 0)
usleep(1000);
}
if (sdr->thread_read.running) {
- PDEBUG(DSDR, DEBUG_DEBUG, "Thread sending exit!\n");
+ LOGP(DSDR, LOGL_DEBUG, "Thread sending exit!\n");
sdr->thread_read.running = 0;
while (sdr->thread_read.exit == 0)
usleep(1000);
@@ -805,6 +805,15 @@ void sdr_close(void *inst)
display_spectrum_exit();
}
+static double get_time(void)
+{
+ static struct timespec tv;
+
+ clock_gettime(CLOCK_REALTIME, &tv);
+
+ return (double)tv.tv_sec + (double)tv.tv_nsec / 1000000000.0;
+}
+
int sdr_write(void *inst, sample_t **samples, uint8_t **power, int num, enum paging_signal __attribute__((unused)) *paging_signal, int *on, int channels)
{
sdr_t *sdr = (sdr_t *)inst;
@@ -817,7 +826,7 @@ int sdr_write(void *inst, sample_t **samples, uint8_t **power, int num, enum pag
abort();
}
if (channels != sdr->channels && channels != 0) {
- PDEBUG(DSDR, DEBUG_ERROR, "Invalid number of channels, please fix!\n");
+ LOGP(DSDR, LOGL_ERROR, "Invalid number of channels, please fix!\n");
abort();
}
@@ -872,11 +881,11 @@ int sdr_write(void *inst, sample_t **samples, uint8_t **power, int num, enum pag
delay = (double)sdr->thread_write.max_fill / 2.0 / (double)sdr->samplerate;
sdr->thread_write.max_fill = 0;
sdr->thread_write.max_fill_timer += 1.0;
- PDEBUG(DSDR, DEBUG_DEBUG, "write delay = %.3f ms\n", delay * 1000.0);
+ LOGP(DSDR, LOGL_DEBUG, "write delay = %.3f ms\n", delay * 1000.0);
}
if (space < num * 2) {
- PDEBUG(DSDR, DEBUG_ERROR, "Write SDR buffer overflow!\n");
+ LOGP(DSDR, LOGL_ERROR, "Write SDR buffer overflow!\n");
num = space / 2;
}
#ifdef DEBUG_BUFFER
@@ -940,7 +949,7 @@ int sdr_read(void *inst, sample_t **samples, int num, int channels, double *rf_l
delay = (double)sdr->thread_read.max_fill / 2.0 / (double)sdr_config->samplerate;
sdr->thread_read.max_fill = 0;
sdr->thread_read.max_fill_timer += 1.0;
- PDEBUG(DSDR, DEBUG_DEBUG, "read delay = %.3f ms\n", delay * 1000.0);
+ LOGP(DSDR, LOGL_DEBUG, "read delay = %.3f ms\n", delay * 1000.0);
}
if (fill / 2 / sdr->oversample < num)
@@ -972,7 +981,7 @@ int sdr_read(void *inst, sample_t **samples, int num, int channels, double *rf_l
}
if (sdr_rx_overflow) {
- PDEBUG(DSDR, DEBUG_ERROR, "SDR RX overflow!\n");
+ LOGP(DSDR, LOGL_ERROR, "SDR RX overflow!\n");
sdr_rx_overflow = 0;
}
diff --git a/src/libsdr/sdr.h b/src/libsdr/sdr.h
index 0455200..a79dd6d 100644
--- a/src/libsdr/sdr.h
+++ b/src/libsdr/sdr.h
@@ -2,7 +2,7 @@
enum paging_signal;
int sdr_start(void *inst);
-void *sdr_open(const char *audiodev, double *tx_frequency, double *rx_frequency, int *am, int channels, double paging_frequency, int samplerate, int buffer_size, double interval, double max_deviation, double max_modulation, double modulation_index);
+void *sdr_open(int direction, const char *audiodev, double *tx_frequency, double *rx_frequency, int *am, int channels, double paging_frequency, int samplerate, int buffer_size, double interval, double max_deviation, double max_modulation, double modulation_index);
void sdr_close(void *inst);
int sdr_write(void *inst, sample_t **samples, uint8_t **power, int num, enum paging_signal *paging_signal, int *on, int channels);
int sdr_read(void *inst, sample_t **samples, int num, int channels, double *rf_level_db);
diff --git a/src/libsdr/soapy.c b/src/libsdr/soapy.c
index e5586d7..07d7007 100644
--- a/src/libsdr/soapy.c
+++ b/src/libsdr/soapy.c
@@ -45,7 +45,7 @@
#include <SoapySDR/Device.h>
#include <SoapySDR/Formats.h>
#include "soapy.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../liboptions/options.h"
extern int sdr_rx_overflow;
@@ -72,7 +72,7 @@ static int parse_args(SoapySDRKwargs *args, const char *_args_string)
key = args_string;
val = strchr(key, '=');
if (!val) {
- PDEBUG(DSOAPY, DEBUG_ERROR, "Error parsing SDR args: No '=' after key\n");
+ LOGP(DSOAPY, LOGL_ERROR, "Error parsing SDR args: No '=' after key\n");
soapy_close();
return -EIO;
}
@@ -80,7 +80,7 @@ static int parse_args(SoapySDRKwargs *args, const char *_args_string)
args_string = strchr(val, ',');
if (args_string)
*args_string++ = '\0';
- PDEBUG(DSOAPY, DEBUG_DEBUG, "SDR device args: key='%s' value='%s'\n", key, val);
+ LOGP(DSOAPY, LOGL_DEBUG, "SDR device args: key='%s' value='%s'\n", key, val);
SoapySDRKwargs_set(args, key, val);
}
@@ -99,22 +99,22 @@ int soapy_open(size_t channel, const char *_device_args, const char *_stream_arg
use_time_stamps = timestamps;
if (use_time_stamps && (1000000000LL % (long long)rate)) {
- PDEBUG(DSOAPY, DEBUG_ERROR, "The given sample duration is not a multiple of a nano second. I.e. we can't divide 10^9 by sample rate of %.0f. Please choose a different sample rate for time stamp support!\n", rate);
+ LOGP(DSOAPY, LOGL_ERROR, "The given sample duration is not a multiple of a nano second. I.e. we can't divide 10^9 by sample rate of %.0f. Please choose a different sample rate for time stamp support!\n", rate);
use_time_stamps = 0;
}
Ns_per_sample = 1000000000LL / (long long)rate;
samplerate = rate;
/* parsing ARGS */
- PDEBUG(DSOAPY, DEBUG_INFO, "Using device args \"%s\"\n", _device_args);
+ LOGP(DSOAPY, LOGL_INFO, "Using device args \"%s\"\n", _device_args);
rc = parse_args(&device_args, _device_args);
if (rc < 0)
return rc;
- PDEBUG(DSOAPY, DEBUG_INFO, "Using stream args \"%s\"\n", _stream_args);
+ LOGP(DSOAPY, LOGL_INFO, "Using stream args \"%s\"\n", _stream_args);
rc = parse_args(&stream_args, _stream_args);
if (rc < 0)
return rc;
- PDEBUG(DSOAPY, DEBUG_INFO, "Using tune args \"%s\"\n", _tune_args);
+ LOGP(DSOAPY, LOGL_INFO, "Using tune args \"%s\"\n", _tune_args);
rc = parse_args(&tune_args, _tune_args);
if (rc < 0)
return rc;
@@ -129,7 +129,7 @@ int soapy_open(size_t channel, const char *_device_args, const char *_stream_arg
/* create SoapySDR device */
sdr = SoapySDRDevice_make(&device_args);
if (!sdr) {
- PDEBUG(DSOAPY, DEBUG_ERROR, "Failed to create SoapySDR\n");
+ LOGP(DSOAPY, LOGL_ERROR, "Failed to create SoapySDR\n");
soapy_close();
return -EIO;
}
@@ -142,29 +142,29 @@ int soapy_open(size_t channel, const char *_device_args, const char *_stream_arg
int i;
clocks = SoapySDRDevice_listClockSources(sdr, &clocks_length);
if (!clocks) {
- PDEBUG(DSOAPY, DEBUG_ERROR, "Failed to request list of clock sources!\n");
+ LOGP(DSOAPY, LOGL_ERROR, "Failed to request list of clock sources!\n");
soapy_close();
return -EIO;
}
if (clocks_length) {
for (i = 0; i < (int)clocks_length; i++)
- PDEBUG(DSOAPY, DEBUG_NOTICE, "Clock source: '%s'\n", clocks[i]);
+ LOGP(DSOAPY, LOGL_NOTICE, "Clock source: '%s'\n", clocks[i]);
got_clock = SoapySDRDevice_getClockSource(sdr);
- PDEBUG(DSOAPY, DEBUG_NOTICE, "Default clock source: '%s'\n", got_clock);
+ LOGP(DSOAPY, LOGL_NOTICE, "Default clock source: '%s'\n", got_clock);
} else
- PDEBUG(DSOAPY, DEBUG_NOTICE, "There are no clock sources configurable for this device.\n");
+ LOGP(DSOAPY, LOGL_NOTICE, "There are no clock sources configurable for this device.\n");
soapy_close();
return 1;
}
if (SoapySDRDevice_setClockSource(sdr, clock_source) != 0) {
- PDEBUG(DSOAPY, DEBUG_ERROR, "Failed to set clock source to '%s'\n", clock_source);
+ LOGP(DSOAPY, LOGL_ERROR, "Failed to set clock source to '%s'\n", clock_source);
soapy_close();
return -EIO;
}
got_clock = SoapySDRDevice_getClockSource(sdr);
if (!!strcasecmp(clock_source, got_clock)) {
- PDEBUG(DSOAPY, DEBUG_NOTICE, "Given clock source '%s' was accepted, but driver claims to use '%s'\n", clock_source, got_clock);
+ LOGP(DSOAPY, LOGL_NOTICE, "Given clock source '%s' was accepted, but driver claims to use '%s'\n", clock_source, got_clock);
soapy_close();
return -EINVAL;
}
@@ -173,9 +173,9 @@ int soapy_open(size_t channel, const char *_device_args, const char *_stream_arg
if (rx_frequency) {
/* get number of channels and check if requested channel is in range */
num_channels = SoapySDRDevice_getNumChannels(sdr, SOAPY_SDR_RX);
- PDEBUG(DSOAPY, DEBUG_DEBUG, "We have %d RX channel, selecting channel #%d\n", (int)num_channels, (int)channel);
+ LOGP(DSOAPY, LOGL_DEBUG, "We have %d RX channel, selecting channel #%d\n", (int)num_channels, (int)channel);
if (channel >= num_channels) {
- PDEBUG(DSOAPY, DEBUG_ERROR, "Requested channel #%d (capable of RX) does not exist. Please select channel %d..%d!\n", (int)channel, 0, (int)num_channels - 1);
+ LOGP(DSOAPY, LOGL_ERROR, "Requested channel #%d (capable of RX) does not exist. Please select channel %d..%d!\n", (int)channel, 0, (int)num_channels - 1);
soapy_close();
return -EIO;
}
@@ -188,26 +188,26 @@ int soapy_open(size_t channel, const char *_device_args, const char *_stream_arg
int i;
antennas = SoapySDRDevice_listAntennas(sdr, SOAPY_SDR_RX, channel, &antennas_length);
if (!antennas) {
- PDEBUG(DSOAPY, DEBUG_ERROR, "Failed to request list of RX antennas!\n");
+ LOGP(DSOAPY, LOGL_ERROR, "Failed to request list of RX antennas!\n");
soapy_close();
return -EIO;
}
for (i = 0; i < (int)antennas_length; i++)
- PDEBUG(DSOAPY, DEBUG_NOTICE, "RX Antenna: '%s'\n", antennas[i]);
+ LOGP(DSOAPY, LOGL_NOTICE, "RX Antenna: '%s'\n", antennas[i]);
got_antenna = SoapySDRDevice_getAntenna(sdr, SOAPY_SDR_RX, channel);
- PDEBUG(DSOAPY, DEBUG_NOTICE, "Default RX Antenna: '%s'\n", got_antenna);
+ LOGP(DSOAPY, LOGL_NOTICE, "Default RX Antenna: '%s'\n", got_antenna);
soapy_close();
return 1;
}
if (SoapySDRDevice_setAntenna(sdr, SOAPY_SDR_RX, channel, rx_antenna) != 0) {
- PDEBUG(DSOAPY, DEBUG_ERROR, "Failed to set RX antenna to '%s'\n", rx_antenna);
+ LOGP(DSOAPY, LOGL_ERROR, "Failed to set RX antenna to '%s'\n", rx_antenna);
soapy_close();
return -EIO;
}
got_antenna = SoapySDRDevice_getAntenna(sdr, SOAPY_SDR_RX, channel);
if (!!strcasecmp(rx_antenna, got_antenna)) {
- PDEBUG(DSOAPY, DEBUG_NOTICE, "Given RX antenna '%s' was accepted, but driver claims to use '%s'\n", rx_antenna, got_antenna);
+ LOGP(DSOAPY, LOGL_NOTICE, "Given RX antenna '%s' was accepted, but driver claims to use '%s'\n", rx_antenna, got_antenna);
soapy_close();
return -EINVAL;
}
@@ -215,7 +215,7 @@ int soapy_open(size_t channel, const char *_device_args, const char *_stream_arg
/* set rate */
if (SoapySDRDevice_setSampleRate(sdr, SOAPY_SDR_RX, channel, rate) != 0) {
- PDEBUG(DSOAPY, DEBUG_ERROR, "Failed to set RX rate to %.0f Hz\n", rate);
+ LOGP(DSOAPY, LOGL_ERROR, "Failed to set RX rate to %.0f Hz\n", rate);
soapy_close();
return -EIO;
}
@@ -223,7 +223,7 @@ int soapy_open(size_t channel, const char *_device_args, const char *_stream_arg
/* see what rate actually is */
got_rate = SoapySDRDevice_getSampleRate(sdr, SOAPY_SDR_RX, channel);
if (fabs(got_rate - rate) > 1.0) {
- PDEBUG(DSOAPY, DEBUG_ERROR, "Given RX rate %.3f Hz is not supported, try %.3f Hz\n", rate, got_rate);
+ LOGP(DSOAPY, LOGL_ERROR, "Given RX rate %.3f Hz is not supported, try %.3f Hz\n", rate, got_rate);
soapy_close();
return -EINVAL;
}
@@ -231,7 +231,7 @@ int soapy_open(size_t channel, const char *_device_args, const char *_stream_arg
if (rx_gain) {
/* set gain */
if (SoapySDRDevice_setGain(sdr, SOAPY_SDR_RX, channel, rx_gain) != 0) {
- PDEBUG(DSOAPY, DEBUG_ERROR, "Failed to set RX gain to %.0f\n", rx_gain);
+ LOGP(DSOAPY, LOGL_ERROR, "Failed to set RX gain to %.0f\n", rx_gain);
soapy_close();
return -EIO;
}
@@ -239,7 +239,7 @@ int soapy_open(size_t channel, const char *_device_args, const char *_stream_arg
/* see what gain actually is */
got_gain = SoapySDRDevice_getGain(sdr, SOAPY_SDR_RX, channel);
if (fabs(got_gain - rx_gain) > 0.001) {
- PDEBUG(DSOAPY, DEBUG_NOTICE, "Given RX gain %.3f is not supported, we use %.3f\n", rx_gain, got_gain);
+ LOGP(DSOAPY, LOGL_NOTICE, "Given RX gain %.3f is not supported, we use %.3f\n", rx_gain, got_gain);
rx_gain = got_gain;
}
}
@@ -250,7 +250,7 @@ int soapy_open(size_t channel, const char *_device_args, const char *_stream_arg
/* set frequency */
if (SoapySDRDevice_setFrequency(sdr, SOAPY_SDR_RX, channel, rx_frequency, &tune_args) != 0) {
- PDEBUG(DSOAPY, DEBUG_ERROR, "Failed to set RX frequency to %.0f Hz\n", rx_frequency);
+ LOGP(DSOAPY, LOGL_ERROR, "Failed to set RX frequency to %.0f Hz\n", rx_frequency);
soapy_close();
return -EIO;
}
@@ -258,14 +258,14 @@ int soapy_open(size_t channel, const char *_device_args, const char *_stream_arg
/* see what frequency actually is */
got_frequency = SoapySDRDevice_getFrequency(sdr, SOAPY_SDR_RX, channel);
if (fabs(got_frequency - rx_frequency) > 100.0) {
- PDEBUG(DSOAPY, DEBUG_ERROR, "Given RX frequency %.0f Hz is not supported, try %.0f Hz\n", rx_frequency, got_frequency);
+ LOGP(DSOAPY, LOGL_ERROR, "Given RX frequency %.0f Hz is not supported, try %.0f Hz\n", rx_frequency, got_frequency);
soapy_close();
return -EINVAL;
}
/* set bandwidth */
if (SoapySDRDevice_setBandwidth(sdr, SOAPY_SDR_RX, channel, bandwidth) != 0) {
- PDEBUG(DSOAPY, DEBUG_ERROR, "Failed to set RX bandwidth to %.0f Hz\n", bandwidth);
+ LOGP(DSOAPY, LOGL_ERROR, "Failed to set RX bandwidth to %.0f Hz\n", bandwidth);
soapy_close();
return -EIO;
}
@@ -273,7 +273,7 @@ int soapy_open(size_t channel, const char *_device_args, const char *_stream_arg
/* see what bandwidth actually is */
got_bandwidth = SoapySDRDevice_getBandwidth(sdr, SOAPY_SDR_RX, channel);
if (fabs(got_bandwidth - bandwidth) > 100.0) {
- PDEBUG(DSOAPY, DEBUG_ERROR, "Given RX bandwidth %.0f Hz is not supported, try %.0f Hz\n", bandwidth, got_bandwidth);
+ LOGP(DSOAPY, LOGL_ERROR, "Given RX bandwidth %.0f Hz is not supported, try %.0f Hz\n", bandwidth, got_bandwidth);
soapy_close();
return -EINVAL;
}
@@ -285,7 +285,7 @@ int soapy_open(size_t channel, const char *_device_args, const char *_stream_arg
if (SoapySDRDevice_setupStream(sdr, &rxStream, SOAPY_SDR_RX, SOAPY_SDR_CF32, &channel, 1, &stream_args) != 0)
#endif
{
- PDEBUG(DSOAPY, DEBUG_ERROR, "Failed to set RX streamer args\n");
+ LOGP(DSOAPY, LOGL_ERROR, "Failed to set RX streamer args\n");
soapy_close();
return -EIO;
}
@@ -293,7 +293,7 @@ int soapy_open(size_t channel, const char *_device_args, const char *_stream_arg
/* get buffer sizes */
rx_samps_per_buff = SoapySDRDevice_getStreamMTU(sdr, rxStream);
if (rx_samps_per_buff == 0) {
- PDEBUG(DSOAPY, DEBUG_ERROR, "Failed to get RX streamer sample buffer\n");
+ LOGP(DSOAPY, LOGL_ERROR, "Failed to get RX streamer sample buffer\n");
soapy_close();
return -EIO;
}
@@ -302,9 +302,9 @@ int soapy_open(size_t channel, const char *_device_args, const char *_stream_arg
if (tx_frequency) {
/* get number of channels and check if requested channel is in range */
num_channels = SoapySDRDevice_getNumChannels(sdr, SOAPY_SDR_TX);
- PDEBUG(DSOAPY, DEBUG_DEBUG, "We have %d TX channel, selecting channel #%d\n", (int)num_channels, (int)channel);
+ LOGP(DSOAPY, LOGL_DEBUG, "We have %d TX channel, selecting channel #%d\n", (int)num_channels, (int)channel);
if (channel >= num_channels) {
- PDEBUG(DSOAPY, DEBUG_ERROR, "Requested channel #%d (capable of TX) does not exist. Please select channel %d..%d!\n", (int)channel, 0, (int)num_channels - 1);
+ LOGP(DSOAPY, LOGL_ERROR, "Requested channel #%d (capable of TX) does not exist. Please select channel %d..%d!\n", (int)channel, 0, (int)num_channels - 1);
soapy_close();
return -EIO;
}
@@ -317,26 +317,26 @@ int soapy_open(size_t channel, const char *_device_args, const char *_stream_arg
int i;
antennas = SoapySDRDevice_listAntennas(sdr, SOAPY_SDR_TX, channel, &antennas_length);
if (!antennas) {
- PDEBUG(DSOAPY, DEBUG_ERROR, "Failed to request list of TX antennas!\n");
+ LOGP(DSOAPY, LOGL_ERROR, "Failed to request list of TX antennas!\n");
soapy_close();
return -EIO;
}
for (i = 0; i < (int)antennas_length; i++)
- PDEBUG(DSOAPY, DEBUG_NOTICE, "TX Antenna: '%s'\n", antennas[i]);
+ LOGP(DSOAPY, LOGL_NOTICE, "TX Antenna: '%s'\n", antennas[i]);
got_antenna = SoapySDRDevice_getAntenna(sdr, SOAPY_SDR_TX, channel);
- PDEBUG(DSOAPY, DEBUG_NOTICE, "Default TX Antenna: '%s'\n", got_antenna);
+ LOGP(DSOAPY, LOGL_NOTICE, "Default TX Antenna: '%s'\n", got_antenna);
soapy_close();
return 1;
}
if (SoapySDRDevice_setAntenna(sdr, SOAPY_SDR_TX, channel, tx_antenna) != 0) {
- PDEBUG(DSOAPY, DEBUG_ERROR, "Failed to set TX antenna to '%s'\n", tx_antenna);
+ LOGP(DSOAPY, LOGL_ERROR, "Failed to set TX antenna to '%s'\n", tx_antenna);
soapy_close();
return -EIO;
}
got_antenna = SoapySDRDevice_getAntenna(sdr, SOAPY_SDR_TX, channel);
if (!!strcasecmp(tx_antenna, got_antenna)) {
- PDEBUG(DSOAPY, DEBUG_NOTICE, "Given TX antenna '%s' was accepted, but driver claims to use '%s'\n", tx_antenna, got_antenna);
+ LOGP(DSOAPY, LOGL_NOTICE, "Given TX antenna '%s' was accepted, but driver claims to use '%s'\n", tx_antenna, got_antenna);
soapy_close();
return -EINVAL;
}
@@ -344,7 +344,7 @@ int soapy_open(size_t channel, const char *_device_args, const char *_stream_arg
/* set rate */
if (SoapySDRDevice_setSampleRate(sdr, SOAPY_SDR_TX, channel, rate) != 0) {
- PDEBUG(DSOAPY, DEBUG_ERROR, "Failed to set TX rate to %.0f Hz\n", rate);
+ LOGP(DSOAPY, LOGL_ERROR, "Failed to set TX rate to %.0f Hz\n", rate);
soapy_close();
return -EIO;
}
@@ -352,7 +352,7 @@ int soapy_open(size_t channel, const char *_device_args, const char *_stream_arg
/* see what rate actually is */
got_rate = SoapySDRDevice_getSampleRate(sdr, SOAPY_SDR_TX, channel);
if (fabs(got_rate - rate) > 1.0) {
- PDEBUG(DSOAPY, DEBUG_ERROR, "Given TX rate %.3f Hz is not supported, try %.3f Hz\n", rate, got_rate);
+ LOGP(DSOAPY, LOGL_ERROR, "Given TX rate %.3f Hz is not supported, try %.3f Hz\n", rate, got_rate);
soapy_close();
return -EINVAL;
}
@@ -360,7 +360,7 @@ int soapy_open(size_t channel, const char *_device_args, const char *_stream_arg
if (tx_gain) {
/* set gain */
if (SoapySDRDevice_setGain(sdr, SOAPY_SDR_TX, channel, tx_gain) != 0) {
- PDEBUG(DSOAPY, DEBUG_ERROR, "Failed to set TX gain to %.0f\n", tx_gain);
+ LOGP(DSOAPY, LOGL_ERROR, "Failed to set TX gain to %.0f\n", tx_gain);
soapy_close();
return -EIO;
}
@@ -368,14 +368,14 @@ int soapy_open(size_t channel, const char *_device_args, const char *_stream_arg
/* see what gain actually is */
got_gain = SoapySDRDevice_getGain(sdr, SOAPY_SDR_TX, channel);
if (fabs(got_gain - tx_gain) > 0.001) {
- PDEBUG(DSOAPY, DEBUG_NOTICE, "Given TX gain %.3f is not supported, we use %.3f\n", tx_gain, got_gain);
+ LOGP(DSOAPY, LOGL_NOTICE, "Given TX gain %.3f is not supported, we use %.3f\n", tx_gain, got_gain);
tx_gain = got_gain;
}
}
/* set frequency */
if (SoapySDRDevice_setFrequency(sdr, SOAPY_SDR_TX, channel, tx_frequency, &tune_args) != 0) {
- PDEBUG(DSOAPY, DEBUG_ERROR, "Failed to set TX frequency to %.0f Hz\n", tx_frequency);
+ LOGP(DSOAPY, LOGL_ERROR, "Failed to set TX frequency to %.0f Hz\n", tx_frequency);
soapy_close();
return -EIO;
}
@@ -383,14 +383,14 @@ int soapy_open(size_t channel, const char *_device_args, const char *_stream_arg
/* see what frequency actually is */
got_frequency = SoapySDRDevice_getFrequency(sdr, SOAPY_SDR_TX, channel);
if (fabs(got_frequency - tx_frequency) > 100.0) {
- PDEBUG(DSOAPY, DEBUG_ERROR, "Given TX frequency %.0f Hz is not supported, try %.0f Hz\n", tx_frequency, got_frequency);
+ LOGP(DSOAPY, LOGL_ERROR, "Given TX frequency %.0f Hz is not supported, try %.0f Hz\n", tx_frequency, got_frequency);
soapy_close();
return -EINVAL;
}
/* set bandwidth */
if (SoapySDRDevice_setBandwidth(sdr, SOAPY_SDR_TX, channel, bandwidth) != 0) {
- PDEBUG(DSOAPY, DEBUG_ERROR, "Failed to set TX bandwidth to %.0f Hz\n", bandwidth);
+ LOGP(DSOAPY, LOGL_ERROR, "Failed to set TX bandwidth to %.0f Hz\n", bandwidth);
soapy_close();
return -EIO;
}
@@ -398,7 +398,7 @@ int soapy_open(size_t channel, const char *_device_args, const char *_stream_arg
/* see what bandwidth actually is */
got_bandwidth = SoapySDRDevice_getBandwidth(sdr, SOAPY_SDR_TX, channel);
if (fabs(got_bandwidth - bandwidth) > 100.0) {
- PDEBUG(DSOAPY, DEBUG_ERROR, "Given TX bandwidth %.0f Hz is not supported, try %.0f Hz\n", bandwidth, got_bandwidth);
+ LOGP(DSOAPY, LOGL_ERROR, "Given TX bandwidth %.0f Hz is not supported, try %.0f Hz\n", bandwidth, got_bandwidth);
soapy_close();
return -EINVAL;
}
@@ -410,7 +410,7 @@ int soapy_open(size_t channel, const char *_device_args, const char *_stream_arg
if (SoapySDRDevice_setupStream(sdr, &txStream, SOAPY_SDR_TX, SOAPY_SDR_CF32, &channel, 1, &stream_args) != 0)
#endif
{
- PDEBUG(DSOAPY, DEBUG_ERROR, "Failed to set TX streamer args\n");
+ LOGP(DSOAPY, LOGL_ERROR, "Failed to set TX streamer args\n");
soapy_close();
return -EIO;
}
@@ -418,7 +418,7 @@ int soapy_open(size_t channel, const char *_device_args, const char *_stream_arg
/* get buffer sizes */
tx_samps_per_buff = SoapySDRDevice_getStreamMTU(sdr, txStream);
if (tx_samps_per_buff == 0) {
- PDEBUG(DSOAPY, DEBUG_ERROR, "Failed to get TX streamer sample buffer\n");
+ LOGP(DSOAPY, LOGL_ERROR, "Failed to get TX streamer sample buffer\n");
soapy_close();
return -EIO;
}
@@ -427,7 +427,7 @@ int soapy_open(size_t channel, const char *_device_args, const char *_stream_arg
/* create mutex for time stamp protection */
rc = pthread_mutex_init(&timestamp_mutex, NULL);
if (rc < 0) {
- PDEBUG(DSOAPY, DEBUG_ERROR, "Mutex init failed!\n");
+ LOGP(DSOAPY, LOGL_ERROR, "Mutex init failed!\n");
return rc;
}
@@ -439,13 +439,13 @@ int soapy_start(void)
{
/* enable rx stream */
if (SoapySDRDevice_activateStream(sdr, rxStream, 0, 0, 0) != 0) {
- PDEBUG(DSOAPY, DEBUG_ERROR, "Failed to issue RX stream command\n");
+ LOGP(DSOAPY, LOGL_ERROR, "Failed to issue RX stream command\n");
return -EIO;
}
/* enable tx stream */
if (SoapySDRDevice_activateStream(sdr, txStream, 0, 0, 0) != 0) {
- PDEBUG(DSOAPY, DEBUG_ERROR, "Failed to issue TX stream command\n");
+ LOGP(DSOAPY, LOGL_ERROR, "Failed to issue TX stream command\n");
return -EIO;
}
return 0;
@@ -453,7 +453,7 @@ int soapy_start(void)
void soapy_close(void)
{
- PDEBUG(DSOAPY, DEBUG_DEBUG, "Clean up SoapySDR\n");
+ LOGP(DSOAPY, LOGL_DEBUG, "Clean up SoapySDR\n");
if (txStream) {
SoapySDRDevice_deactivateStream(sdr, txStream, 0, 0);
SoapySDRDevice_closeStream(sdr, txStream);
@@ -488,12 +488,12 @@ int soapy_send(float *buff, int num)
flags |= SOAPY_SDR_HAS_TIME;
count = SoapySDRDevice_writeStream(sdr, txStream, buffs_ptr, chunk, &flags, tx_timeNs, 1000000);
if (count <= 0) {
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to write to TX streamer (error=%d)\n", count);
+ LOGP(DUHD, LOGL_ERROR, "Failed to write to TX streamer (error=%d)\n", count);
break;
}
/* process TX time stamp */
if (!tx_valid)
- PDEBUG(DSOAPY, DEBUG_ERROR, "SDR TX: tosend() was not called before, prease fix!\n");
+ LOGP(DSOAPY, LOGL_ERROR, "SDR TX: tosend() was not called before, prease fix!\n");
else {
pthread_mutex_lock(&timestamp_mutex);
tx_timeNs += count * Ns_per_sample;
@@ -528,7 +528,7 @@ int soapy_receive(float *buff, int max)
if (count > 0) {
if (!use_time_stamps || !(flags & SOAPY_SDR_HAS_TIME)) {
if (use_time_stamps) {
- PDEBUG(DSOAPY, DEBUG_ERROR, "SDR RX: No time stamps available. This may cause little gaps and problems with time slot based networks, like C-Netz.\n");
+ LOGP(DSOAPY, LOGL_ERROR, "SDR RX: No time stamps available. This may cause little gaps and problems with time slot based networks, like C-Netz.\n");
use_time_stamps = 0;
}
timeNs = rx_timeNs;
@@ -540,7 +540,7 @@ int soapy_receive(float *buff, int max)
}
pthread_mutex_lock(&timestamp_mutex);
if (rx_timeNs != timeNs)
- PDEBUG(DSOAPY, DEBUG_ERROR, "SDR RX overflow, seems we are too slow. Use lower SDR sample rate, if this happens too often.\n");
+ LOGP(DSOAPY, LOGL_ERROR, "SDR RX overflow, seems we are too slow. Use lower SDR sample rate, if this happens too often.\n");
rx_timeNs = timeNs + count * Ns_per_sample;
pthread_mutex_unlock(&timestamp_mutex);
/* commit received data to buffer */
@@ -579,7 +579,7 @@ int soapy_get_tosend(int buffer_size)
/* in case of underrun */
if (tosend > buffer_size) {
- PDEBUG(DSOAPY, DEBUG_ERROR, "SDR TX underrun, seems we are too slow. Use lower SDR sample rate.\n");
+ LOGP(DSOAPY, LOGL_ERROR, "SDR TX underrun, seems we are too slow. Use lower SDR sample rate.\n");
tosend = buffer_size;
}
diff --git a/src/libsdr/uhd.c b/src/libsdr/uhd.c
index c601828..0ffc90e 100644
--- a/src/libsdr/uhd.c
+++ b/src/libsdr/uhd.c
@@ -25,7 +25,7 @@
#include <uhd.h>
#include <uhd/usrp/usrp.h>
#include "uhd.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../liboptions/options.h"
extern int sdr_rx_overflow;
@@ -56,15 +56,15 @@ int uhd_open(size_t channel, const char *_device_args, const char *_stream_args,
samplerate = rate;
tx_timestamps = timestamps;
- PDEBUG(DUHD, DEBUG_INFO, "Using device args \"%s\"\n", _device_args);
- PDEBUG(DUHD, DEBUG_INFO, "Using stream args \"%s\"\n", _stream_args);
- PDEBUG(DUHD, DEBUG_INFO, "Using tune args \"%s\"\n", _tune_args);
+ LOGP(DUHD, LOGL_INFO, "Using device args \"%s\"\n", _device_args);
+ LOGP(DUHD, LOGL_INFO, "Using stream args \"%s\"\n", _stream_args);
+ LOGP(DUHD, LOGL_INFO, "Using tune args \"%s\"\n", _tune_args);
/* create USRP */
- PDEBUG(DUHD, DEBUG_INFO, "Creating USRP with args \"%s\"...\n", _device_args);
+ LOGP(DUHD, LOGL_INFO, "Creating USRP with args \"%s\"...\n", _device_args);
error = uhd_usrp_make(&usrp, _device_args);
if (error) {
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to create USRP\n");
+ LOGP(DUHD, LOGL_ERROR, "Failed to create USRP\n");
uhd_close();
return -EIO;
}
@@ -78,13 +78,13 @@ int uhd_open(size_t channel, const char *_device_args, const char *_stream_args,
error = uhd_string_vector_make(&clocks);
if (error) {
clock_vector_error:
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to handle UHD vector, please fix!\n");
+ LOGP(DUHD, LOGL_ERROR, "Failed to handle UHD vector, please fix!\n");
uhd_close();
return -EIO;
}
error = uhd_usrp_get_clock_sources(usrp, 0, &clocks);
if (error) {
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to request list of clock sources!\n");
+ LOGP(DUHD, LOGL_ERROR, "Failed to request list of clock sources!\n");
uhd_close();
return -EIO;
}
@@ -95,33 +95,33 @@ int uhd_open(size_t channel, const char *_device_args, const char *_stream_args,
error = uhd_string_vector_at(clocks, i, got_clock, sizeof(got_clock));
if (error)
goto clock_vector_error;
- PDEBUG(DUHD, DEBUG_NOTICE, "Clock source: '%s'\n", got_clock);
+ LOGP(DUHD, LOGL_NOTICE, "Clock source: '%s'\n", got_clock);
}
uhd_string_vector_free(&clocks);
error = uhd_usrp_get_clock_source(usrp, 0, got_clock, sizeof(got_clock));
if (error) {
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to get clock source\n");
+ LOGP(DUHD, LOGL_ERROR, "Failed to get clock source\n");
uhd_close();
return -EINVAL;
}
- PDEBUG(DUHD, DEBUG_NOTICE, "Default clock source: '%s'\n", got_clock);
+ LOGP(DUHD, LOGL_NOTICE, "Default clock source: '%s'\n", got_clock);
uhd_close();
return 1;
}
error = uhd_usrp_set_clock_source(usrp, clock_source, 0);
if (error) {
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to set clock source to '%s'\n", clock_source);
+ LOGP(DUHD, LOGL_ERROR, "Failed to set clock source to '%s'\n", clock_source);
uhd_close();
return -EIO;
}
error = uhd_usrp_get_clock_source(usrp, 0, got_clock, sizeof(got_clock));
if (error) {
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to get clock source\n");
+ LOGP(DUHD, LOGL_ERROR, "Failed to get clock source\n");
uhd_close();
return -EINVAL;
}
if (!!strcasecmp(clock_source, got_clock)) {
- PDEBUG(DUHD, DEBUG_NOTICE, "Given clock source '%s' was accepted, but driver claims to use '%s'\n", clock_source, got_clock);
+ LOGP(DUHD, LOGL_NOTICE, "Given clock source '%s' was accepted, but driver claims to use '%s'\n", clock_source, got_clock);
uhd_close();
return -EINVAL;
}
@@ -137,13 +137,13 @@ int uhd_open(size_t channel, const char *_device_args, const char *_stream_args,
error = uhd_string_vector_make(&antennas);
if (error) {
tx_vector_error:
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to handle UHD vector, please fix!\n");
+ LOGP(DUHD, LOGL_ERROR, "Failed to handle UHD vector, please fix!\n");
uhd_close();
return -EIO;
}
error = uhd_usrp_get_tx_antennas(usrp, channel, &antennas);
if (error) {
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to request list of TX antennas!\n");
+ LOGP(DUHD, LOGL_ERROR, "Failed to request list of TX antennas!\n");
uhd_close();
return -EIO;
}
@@ -154,33 +154,33 @@ int uhd_open(size_t channel, const char *_device_args, const char *_stream_args,
error = uhd_string_vector_at(antennas, i, got_antenna, sizeof(got_antenna));
if (error)
goto tx_vector_error;
- PDEBUG(DUHD, DEBUG_NOTICE, "TX Antenna: '%s'\n", got_antenna);
+ LOGP(DUHD, LOGL_NOTICE, "TX Antenna: '%s'\n", got_antenna);
}
uhd_string_vector_free(&antennas);
error = uhd_usrp_get_tx_antenna(usrp, channel, got_antenna, sizeof(got_antenna));
if (error) {
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to get TX antenna\n");
+ LOGP(DUHD, LOGL_ERROR, "Failed to get TX antenna\n");
uhd_close();
return -EINVAL;
}
- PDEBUG(DUHD, DEBUG_NOTICE, "Default TX Antenna: '%s'\n", got_antenna);
+ LOGP(DUHD, LOGL_NOTICE, "Default TX Antenna: '%s'\n", got_antenna);
uhd_close();
return 1;
}
error = uhd_usrp_set_tx_antenna(usrp, tx_antenna, channel);
if (error) {
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to set TX antenna to '%s'\n", tx_antenna);
+ LOGP(DUHD, LOGL_ERROR, "Failed to set TX antenna to '%s'\n", tx_antenna);
uhd_close();
return -EIO;
}
error = uhd_usrp_get_tx_antenna(usrp, channel, got_antenna, sizeof(got_antenna));
if (error) {
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to get TX antenna\n");
+ LOGP(DUHD, LOGL_ERROR, "Failed to get TX antenna\n");
uhd_close();
return -EINVAL;
}
if (!!strcasecmp(tx_antenna, got_antenna)) {
- PDEBUG(DUHD, DEBUG_NOTICE, "Given TX antenna '%s' was accepted, but driver claims to use '%s'\n", tx_antenna, got_antenna);
+ LOGP(DUHD, LOGL_NOTICE, "Given TX antenna '%s' was accepted, but driver claims to use '%s'\n", tx_antenna, got_antenna);
uhd_close();
return -EINVAL;
}
@@ -189,7 +189,7 @@ int uhd_open(size_t channel, const char *_device_args, const char *_stream_args,
/* create streamers */
error = uhd_tx_streamer_make(&tx_streamer);
if (error) {
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to create TX streamer\n");
+ LOGP(DUHD, LOGL_ERROR, "Failed to create TX streamer\n");
uhd_close();
return -EIO;
}
@@ -197,7 +197,7 @@ int uhd_open(size_t channel, const char *_device_args, const char *_stream_args,
/* set rate */
error = uhd_usrp_set_tx_rate(usrp, rate, channel);
if (error) {
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to set TX rate to %.0f Hz\n", rate);
+ LOGP(DUHD, LOGL_ERROR, "Failed to set TX rate to %.0f Hz\n", rate);
uhd_close();
return -EIO;
}
@@ -205,12 +205,12 @@ int uhd_open(size_t channel, const char *_device_args, const char *_stream_args,
/* see what rate actually is */
error = uhd_usrp_get_tx_rate(usrp, channel, &got_rate);
if (error) {
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to get TX rate\n");
+ LOGP(DUHD, LOGL_ERROR, "Failed to get TX rate\n");
uhd_close();
return -EIO;
}
if (fabs(got_rate - rate) > 1.0) {
- PDEBUG(DUHD, DEBUG_ERROR, "Given TX rate %.0f Hz is not supported, try %.0f Hz\n", rate, got_rate);
+ LOGP(DUHD, LOGL_ERROR, "Given TX rate %.0f Hz is not supported, try %.0f Hz\n", rate, got_rate);
uhd_close();
return -EINVAL;
}
@@ -218,7 +218,7 @@ int uhd_open(size_t channel, const char *_device_args, const char *_stream_args,
/* set gain */
error = uhd_usrp_set_tx_gain(usrp, tx_gain, channel, "");
if (error) {
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to set TX gain to %.0f\n", tx_gain);
+ LOGP(DUHD, LOGL_ERROR, "Failed to set TX gain to %.0f\n", tx_gain);
uhd_close();
return -EIO;
}
@@ -226,12 +226,12 @@ int uhd_open(size_t channel, const char *_device_args, const char *_stream_args,
/* see what gain actually is */
error = uhd_usrp_get_tx_gain(usrp, channel, "", &got_gain);
if (error) {
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to get TX gain\n");
+ LOGP(DUHD, LOGL_ERROR, "Failed to get TX gain\n");
uhd_close();
return -EIO;
}
if (fabs(got_gain - tx_gain) > 0.001) {
- PDEBUG(DUHD, DEBUG_NOTICE, "Given TX gain %.0f is not supported, we use %.0f\n", tx_gain, got_gain);
+ LOGP(DUHD, LOGL_NOTICE, "Given TX gain %.0f is not supported, we use %.0f\n", tx_gain, got_gain);
tx_gain = got_gain;
}
@@ -247,7 +247,7 @@ int uhd_open(size_t channel, const char *_device_args, const char *_stream_args,
tune_request.args = options_strdup(_tune_args);
error = uhd_usrp_set_tx_freq(usrp, &tune_request, channel, &tune_result);
if (error) {
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to set TX frequency to %.0f Hz\n", tx_frequency);
+ LOGP(DUHD, LOGL_ERROR, "Failed to set TX frequency to %.0f Hz\n", tx_frequency);
uhd_close();
return -EIO;
}
@@ -255,19 +255,19 @@ int uhd_open(size_t channel, const char *_device_args, const char *_stream_args,
/* see what frequency actually is */
error = uhd_usrp_get_tx_freq(usrp, channel, &got_frequency);
if (error) {
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to get TX frequency\n");
+ LOGP(DUHD, LOGL_ERROR, "Failed to get TX frequency\n");
uhd_close();
return -EIO;
}
if (fabs(got_frequency - tx_frequency) > 100.0) {
- PDEBUG(DUHD, DEBUG_ERROR, "Given TX frequency %.0f Hz is not supported, try %.0f Hz\n", tx_frequency, got_frequency);
+ LOGP(DUHD, LOGL_ERROR, "Given TX frequency %.0f Hz is not supported, try %.0f Hz\n", tx_frequency, got_frequency);
uhd_close();
return -EINVAL;
}
/* set bandwidth */
if (uhd_usrp_set_tx_bandwidth(usrp, bandwidth, channel) != 0) {
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to set TX bandwidth to %.0f Hz\n", bandwidth);
+ LOGP(DUHD, LOGL_ERROR, "Failed to set TX bandwidth to %.0f Hz\n", bandwidth);
uhd_close();
return -EIO;
}
@@ -275,12 +275,12 @@ int uhd_open(size_t channel, const char *_device_args, const char *_stream_args,
/* see what bandwidth actually is */
error = uhd_usrp_get_tx_bandwidth(usrp, channel, &got_bandwidth);
if (error) {
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to get TX bandwidth\n");
+ LOGP(DUHD, LOGL_ERROR, "Failed to get TX bandwidth\n");
uhd_close();
return -EIO;
}
if (fabs(got_bandwidth - bandwidth) > 100.0) {
- PDEBUG(DUHD, DEBUG_ERROR, "Given TX bandwidth %.0f Hz is not supported, try %.0f Hz\n", bandwidth, got_bandwidth);
+ LOGP(DUHD, LOGL_ERROR, "Given TX bandwidth %.0f Hz is not supported, try %.0f Hz\n", bandwidth, got_bandwidth);
uhd_close();
return -EINVAL;
}
@@ -294,7 +294,7 @@ int uhd_open(size_t channel, const char *_device_args, const char *_stream_args,
stream_args.n_channels = 1;
error = uhd_usrp_get_tx_stream(usrp, &stream_args, tx_streamer);
if (error) {
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to set TX streamer args\n");
+ LOGP(DUHD, LOGL_ERROR, "Failed to set TX streamer args\n");
uhd_close();
return -EIO;
}
@@ -302,7 +302,7 @@ int uhd_open(size_t channel, const char *_device_args, const char *_stream_args,
/* get buffer sizes */
error = uhd_tx_streamer_max_num_samps(tx_streamer, &tx_samps_per_buff);
if (error) {
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to get TX streamer sample buffer\n");
+ LOGP(DUHD, LOGL_ERROR, "Failed to get TX streamer sample buffer\n");
uhd_close();
return -EIO;
}
@@ -318,13 +318,13 @@ int uhd_open(size_t channel, const char *_device_args, const char *_stream_args,
error = uhd_string_vector_make(&antennas);
if (error) {
rx_vector_error:
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to handle UHD vector, please fix!\n");
+ LOGP(DUHD, LOGL_ERROR, "Failed to handle UHD vector, please fix!\n");
uhd_close();
return -EIO;
}
error = uhd_usrp_get_rx_antennas(usrp, channel, &antennas);
if (error) {
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to request list of RX antennas!\n");
+ LOGP(DUHD, LOGL_ERROR, "Failed to request list of RX antennas!\n");
uhd_close();
return -EIO;
}
@@ -335,33 +335,33 @@ int uhd_open(size_t channel, const char *_device_args, const char *_stream_args,
error = uhd_string_vector_at(antennas, i, got_antenna, sizeof(got_antenna));
if (error)
goto rx_vector_error;
- PDEBUG(DUHD, DEBUG_NOTICE, "RX Antenna: '%s'\n", got_antenna);
+ LOGP(DUHD, LOGL_NOTICE, "RX Antenna: '%s'\n", got_antenna);
}
uhd_string_vector_free(&antennas);
error = uhd_usrp_get_rx_antenna(usrp, channel, got_antenna, sizeof(got_antenna));
if (error) {
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to get RX antenna\n");
+ LOGP(DUHD, LOGL_ERROR, "Failed to get RX antenna\n");
uhd_close();
return -EINVAL;
}
- PDEBUG(DUHD, DEBUG_NOTICE, "Default RX Antenna: '%s'\n", got_antenna);
+ LOGP(DUHD, LOGL_NOTICE, "Default RX Antenna: '%s'\n", got_antenna);
uhd_close();
return 1;
}
error = uhd_usrp_set_rx_antenna(usrp, rx_antenna, channel);
if (error) {
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to set RX antenna to '%s'\n", rx_antenna);
+ LOGP(DUHD, LOGL_ERROR, "Failed to set RX antenna to '%s'\n", rx_antenna);
uhd_close();
return -EIO;
}
error = uhd_usrp_get_rx_antenna(usrp, channel, got_antenna, sizeof(got_antenna));
if (error) {
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to get RX antenna\n");
+ LOGP(DUHD, LOGL_ERROR, "Failed to get RX antenna\n");
uhd_close();
return -EINVAL;
}
if (!!strcasecmp(rx_antenna, got_antenna)) {
- PDEBUG(DUHD, DEBUG_NOTICE, "Given RX antenna '%s' was accepted, but driver claims to use '%s'\n", rx_antenna, got_antenna);
+ LOGP(DUHD, LOGL_NOTICE, "Given RX antenna '%s' was accepted, but driver claims to use '%s'\n", rx_antenna, got_antenna);
uhd_close();
return -EINVAL;
}
@@ -369,7 +369,7 @@ int uhd_open(size_t channel, const char *_device_args, const char *_stream_args,
/* create streamers */
error = uhd_rx_streamer_make(&rx_streamer);
if (error) {
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to create RX streamer\n");
+ LOGP(DUHD, LOGL_ERROR, "Failed to create RX streamer\n");
uhd_close();
return -EIO;
}
@@ -377,7 +377,7 @@ int uhd_open(size_t channel, const char *_device_args, const char *_stream_args,
/* create metadata */
error = uhd_rx_metadata_make(&rx_metadata);
if (error) {
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to create RX metadata\n");
+ LOGP(DUHD, LOGL_ERROR, "Failed to create RX metadata\n");
uhd_close();
return -EIO;
}
@@ -385,7 +385,7 @@ int uhd_open(size_t channel, const char *_device_args, const char *_stream_args,
/* set rate */
error = uhd_usrp_set_rx_rate(usrp, rate, channel);
if (error) {
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to set RX rate to %.0f Hz\n", rate);
+ LOGP(DUHD, LOGL_ERROR, "Failed to set RX rate to %.0f Hz\n", rate);
uhd_close();
return -EIO;
}
@@ -393,12 +393,12 @@ int uhd_open(size_t channel, const char *_device_args, const char *_stream_args,
/* see what rate actually is */
error = uhd_usrp_get_rx_rate(usrp, channel, &got_rate);
if (error) {
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to get RX rate\n");
+ LOGP(DUHD, LOGL_ERROR, "Failed to get RX rate\n");
uhd_close();
return -EIO;
}
if (fabs(got_rate - rate) > 1.0) {
- PDEBUG(DUHD, DEBUG_ERROR, "Given RX rate %.0f Hz is not supported, try %.0f Hz\n", rate, got_rate);
+ LOGP(DUHD, LOGL_ERROR, "Given RX rate %.0f Hz is not supported, try %.0f Hz\n", rate, got_rate);
uhd_close();
return -EINVAL;
}
@@ -406,7 +406,7 @@ int uhd_open(size_t channel, const char *_device_args, const char *_stream_args,
/* set gain */
error = uhd_usrp_set_rx_gain(usrp, rx_gain, channel, "");
if (error) {
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to set RX gain to %.0f\n", rx_gain);
+ LOGP(DUHD, LOGL_ERROR, "Failed to set RX gain to %.0f\n", rx_gain);
uhd_close();
return -EIO;
}
@@ -414,12 +414,12 @@ int uhd_open(size_t channel, const char *_device_args, const char *_stream_args,
/* see what gain actually is */
error = uhd_usrp_get_rx_gain(usrp, channel, "", &got_gain);
if (error) {
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to get RX gain\n");
+ LOGP(DUHD, LOGL_ERROR, "Failed to get RX gain\n");
uhd_close();
return -EIO;
}
if (fabs(got_gain - rx_gain) > 0.001) {
- PDEBUG(DUHD, DEBUG_NOTICE, "Given RX gain %.3f is not supported, we use %.3f\n", rx_gain, got_gain);
+ LOGP(DUHD, LOGL_NOTICE, "Given RX gain %.3f is not supported, we use %.3f\n", rx_gain, got_gain);
rx_gain = got_gain;
}
@@ -435,7 +435,7 @@ int uhd_open(size_t channel, const char *_device_args, const char *_stream_args,
tune_request.args = options_strdup(_tune_args);
error = uhd_usrp_set_rx_freq(usrp, &tune_request, channel, &tune_result);
if (error) {
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to set RX frequency to %.0f Hz\n", rx_frequency);
+ LOGP(DUHD, LOGL_ERROR, "Failed to set RX frequency to %.0f Hz\n", rx_frequency);
uhd_close();
return -EIO;
}
@@ -443,19 +443,19 @@ int uhd_open(size_t channel, const char *_device_args, const char *_stream_args,
/* see what frequency actually is */
error = uhd_usrp_get_rx_freq(usrp, channel, &got_frequency);
if (error) {
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to get RX frequency\n");
+ LOGP(DUHD, LOGL_ERROR, "Failed to get RX frequency\n");
uhd_close();
return -EIO;
}
if (fabs(got_frequency - rx_frequency) > 100.0) {
- PDEBUG(DUHD, DEBUG_ERROR, "Given RX frequency %.0f Hz is not supported, try %.0f Hz\n", rx_frequency, got_frequency);
+ LOGP(DUHD, LOGL_ERROR, "Given RX frequency %.0f Hz is not supported, try %.0f Hz\n", rx_frequency, got_frequency);
uhd_close();
return -EINVAL;
}
/* set bandwidth */
if (uhd_usrp_set_rx_bandwidth(usrp, bandwidth, channel) != 0) {
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to set RX bandwidth to %.0f Hz\n", bandwidth);
+ LOGP(DUHD, LOGL_ERROR, "Failed to set RX bandwidth to %.0f Hz\n", bandwidth);
uhd_close();
return -EIO;
}
@@ -463,12 +463,12 @@ int uhd_open(size_t channel, const char *_device_args, const char *_stream_args,
/* see what bandwidth actually is */
error = uhd_usrp_get_rx_bandwidth(usrp, channel, &got_bandwidth);
if (error) {
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to get RX bandwidth\n");
+ LOGP(DUHD, LOGL_ERROR, "Failed to get RX bandwidth\n");
uhd_close();
return -EIO;
}
if (fabs(got_bandwidth - bandwidth) > 100.0) {
- PDEBUG(DUHD, DEBUG_ERROR, "Given RX bandwidth %.0f Hz is not supported, try %.0f Hz\n", bandwidth, got_bandwidth);
+ LOGP(DUHD, LOGL_ERROR, "Given RX bandwidth %.0f Hz is not supported, try %.0f Hz\n", bandwidth, got_bandwidth);
uhd_close();
return -EINVAL;
}
@@ -482,7 +482,7 @@ int uhd_open(size_t channel, const char *_device_args, const char *_stream_args,
stream_args.n_channels = 1;
error = uhd_usrp_get_rx_stream(usrp, &stream_args, rx_streamer);
if (error) {
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to set RX streamer args\n");
+ LOGP(DUHD, LOGL_ERROR, "Failed to set RX streamer args\n");
uhd_close();
return -EIO;
}
@@ -490,7 +490,7 @@ int uhd_open(size_t channel, const char *_device_args, const char *_stream_args,
/* get buffer sizes */
error = uhd_rx_streamer_max_num_samps(rx_streamer, &rx_samps_per_buff);
if (error) {
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to get RX streamer sample buffer\n");
+ LOGP(DUHD, LOGL_ERROR, "Failed to get RX streamer sample buffer\n");
uhd_close();
return -EIO;
}
@@ -510,7 +510,7 @@ int uhd_start(void)
stream_cmd.stream_now = true;
error = uhd_rx_streamer_issue_stream_cmd(rx_streamer, &stream_cmd);
if (error) {
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to issue RX stream command\n");
+ LOGP(DUHD, LOGL_ERROR, "Failed to issue RX stream command\n");
return -EIO;
}
return 0;
@@ -518,7 +518,7 @@ int uhd_start(void)
void uhd_close(void)
{
- PDEBUG(DUHD, DEBUG_DEBUG, "Clean up UHD\n");
+ LOGP(DUHD, LOGL_DEBUG, "Clean up UHD\n");
if (tx_metadata)
uhd_tx_metadata_free(&tx_metadata);
if (rx_metadata)
@@ -548,12 +548,12 @@ int uhd_send(float *buff, int num)
else
error = uhd_tx_metadata_make(&tx_metadata, false, 0, 0.0, false, false);
if (error)
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to create TX metadata\n");
+ LOGP(DUHD, LOGL_ERROR, "Failed to create TX metadata\n");
buffs_ptr[0] = buff;
count = 0;
error = uhd_tx_streamer_send(tx_streamer, buffs_ptr, chunk, &tx_metadata, 1.0, &count);
if (error) {
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to write to TX streamer\n");
+ LOGP(DUHD, LOGL_ERROR, "Failed to write to TX streamer\n");
break;
}
if (count == 0)
@@ -595,7 +595,7 @@ int uhd_receive(float *buff, int max)
count = 0;
error = uhd_rx_streamer_recv(rx_streamer, buffs_ptr, rx_samps_per_buff, &rx_metadata, 0.0, false, &count);
if (error) {
- PDEBUG(DUHD, DEBUG_ERROR, "Failed to read from UHD device.\n");
+ LOGP(DUHD, LOGL_ERROR, "Failed to read from UHD device.\n");
break;
}
if (count) {
@@ -605,7 +605,7 @@ int uhd_receive(float *buff, int max)
if (rc == 0 && has_time_spec)
rc = uhd_rx_metadata_time_spec(rx_metadata, &rx_time_secs, &rx_time_fract_sec);
if (rc < 0 || !has_time_spec) {
- PDEBUG(DSOAPY, DEBUG_ERROR, "SDR RX: No time stamps available. This may cuse little gaps and problems with time slot based networks, like C-Netz.\n");
+ LOGP(DSOAPY, LOGL_ERROR, "SDR RX: No time stamps available. This may cuse little gaps and problems with time slot based networks, like C-Netz.\n");
tx_timestamps = 0;
}
}
@@ -657,7 +657,7 @@ int uhd_get_tosend(int buffer_size)
advance = ((double)tx_time_secs + tx_time_fract_sec) - ((double)rx_time_secs + rx_time_fract_sec);
/* in case of underrun: */
if (advance < 0) {
- PDEBUG(DSOAPY, DEBUG_ERROR, "SDR TX underrun, seems we are too slow. Use lower SDR sample rate.\n");
+ LOGP(DSOAPY, LOGL_ERROR, "SDR TX underrun, seems we are too slow. Use lower SDR sample rate.\n");
advance = 0;
}
tosend = buffer_size - (int)(advance * samplerate);
diff --git a/src/libsendevolumenregler/Makefile.am b/src/libsendevolumenregler/Makefile.am
index 3acd414..bed8dd4 100644
--- a/src/libsendevolumenregler/Makefile.am
+++ b/src/libsendevolumenregler/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
noinst_LIBRARIES = libsendevolumenregler.a
diff --git a/src/libserial/Makefile.am b/src/libserial/Makefile.am
index 04fe1e9..70c4133 100644
--- a/src/libserial/Makefile.am
+++ b/src/libserial/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
noinst_LIBRARIES = libserial.a
diff --git a/src/libserial/serial.c b/src/libserial/serial.c
index db091af..8ced3eb 100755
--- a/src/libserial/serial.c
+++ b/src/libserial/serial.c
@@ -78,7 +78,7 @@ serial_t *serial_open(const char *serial_device, int serial_baud, int serial_dat
serial_errnostr = "Enable or disable RTS/CTS?";
return NULL;
}
- if (serial_parity != 'n' && serial_parity != 'e' && serial_parity != 'o') {
+ if (serial_parity != 'n' && serial_parity != 'e' && serial_parity != 'o' && serial_parity != 's' && serial_parity != 'm' && serial_parity != '0' && serial_parity != '1') {
serial_errno = -EINVAL;
serial_errnostr = "Unsopported parity.";
return NULL;
@@ -145,6 +145,10 @@ serial_t *serial_open(const char *serial_device, int serial_baud, int serial_dat
((serial->databits == 8) ? CS8 : 0) |
((serial->parity == 'e') ? PARENB : 0) |
((serial->parity == 'o') ? (PARENB | PARODD) : 0) |
+ ((serial->parity == 's') ? (PARENB | CMSPAR) : 0) |
+ ((serial->parity == 'm') ? (PARENB | CMSPAR | PARODD) : 0) |
+ ((serial->parity == '0') ? (PARENB | CMSPAR) : 0) |
+ ((serial->parity == '1') ? (PARENB | CMSPAR | PARODD) : 0) |
((serial->stopbits == 2) ? CSTOPB : 0) |
((serial->rtscts =='e' ) ? CRTSCTS : 0) |
((serial->rtscts =='d' ) ? CLOCAL : 0) ;
diff --git a/src/libsound/Makefile.am b/src/libsound/Makefile.am
index afbbb0a..6cd6535 100644
--- a/src/libsound/Makefile.am
+++ b/src/libsound/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
noinst_LIBRARIES = libsound.a
diff --git a/src/libsound/sound.h b/src/libsound/sound.h
index 173dfd3..c004e0e 100644
--- a/src/libsound/sound.h
+++ b/src/libsound/sound.h
@@ -1,10 +1,18 @@
enum paging_signal;
-void *sound_open(const char *audiodev, double *tx_frequency, double *rx_frequency, int *am, int channels, double paging_frequency, int samplerate, int buffer_size, double interval, double max_deviation, double max_modulation, double modulation_index);
+enum sound_direction {
+ SOUND_DIR_PLAY,
+ SOUND_DIR_REC,
+ SOUND_DIR_DUPLEX,
+};
+
+void *sound_open(int direction, const char *audiodev, double *tx_frequency, double *rx_frequency, int *am, int channels, double paging_frequency, int samplerate, int buffer_size, double interval, double max_deviation, double max_modulation, double modulation_index);
int sound_start(void *inst);
void sound_close(void *inst);
int sound_write(void *inst, sample_t **samples, uint8_t **power, int num, enum paging_signal *paging_signal, int *on, int channels);
int sound_read(void *inst, sample_t **samples, int num, int channels, double *rf_level_db);
int sound_get_tosend(void *inst, int buffer_size);
+int sound_is_stereo_capture(void *inst);
+int sound_is_stereo_playback(void *inst);
diff --git a/src/libsound/sound_alsa.c b/src/libsound/sound_alsa.c
index bb7151b..6f2b9bf 100644
--- a/src/libsound/sound_alsa.c
+++ b/src/libsound/sound_alsa.c
@@ -22,7 +22,7 @@
#include <math.h>
#include <alsa/asoundlib.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#ifdef HAVE_MOBILE
#include "../libmobile/sender.h"
#else
@@ -32,11 +32,12 @@
static int KEEP_FRAMES=8; /* minimum frames not to read, to prevent reading from buffer before data has been received (seems to be a bug in ALSA) */
typedef struct sound {
+ enum sound_direction direction;
snd_pcm_t *phandle, *chandle;
int pchannels, cchannels;
int channels; /* required number of channels */
int samplerate; /* required sample rate */
- char *audiodev; /* required device */
+ char *caudiodev, *paudiodev; /* required device */
double spl_deviation; /* how much deviation is one sample step */
#ifdef HAVE_MOBILE
double paging_phaseshift; /* phase to shift every sample */
@@ -54,42 +55,42 @@ static int set_hw_params(snd_pcm_t *handle, int samplerate, int *channels)
rc = snd_pcm_hw_params_malloc(&hw_params);
if (rc < 0) {
- PDEBUG(DSOUND, DEBUG_ERROR, "Failed to allocate hw_params! (%s)\n", snd_strerror(rc));
+ LOGP(DSOUND, LOGL_ERROR, "Failed to allocate hw_params! (%s)\n", snd_strerror(rc));
goto error;
}
rc = snd_pcm_hw_params_any(handle, hw_params);
if (rc < 0) {
- PDEBUG(DSOUND, DEBUG_ERROR, "cannot initialize hardware parameter structure (%s)\n", snd_strerror(rc));
+ LOGP(DSOUND, LOGL_ERROR, "cannot initialize hardware parameter structure (%s)\n", snd_strerror(rc));
goto error;
}
rc = snd_pcm_hw_params_set_rate_resample(handle, hw_params, 0);
if (rc < 0) {
- PDEBUG(DSOUND, DEBUG_ERROR, "cannot set real hardware rate (%s)\n", snd_strerror(rc));
+ LOGP(DSOUND, LOGL_ERROR, "cannot set real hardware rate (%s)\n", snd_strerror(rc));
goto error;
}
rc = snd_pcm_hw_params_set_access (handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED);
if (rc < 0) {
- PDEBUG(DSOUND, DEBUG_ERROR, "cannot set access to interleaved (%s)\n", snd_strerror(rc));
+ LOGP(DSOUND, LOGL_ERROR, "cannot set access to interleaved (%s)\n", snd_strerror(rc));
goto error;
}
rc = snd_pcm_hw_params_set_format(handle, hw_params, SND_PCM_FORMAT_S16);
if (rc < 0) {
- PDEBUG(DSOUND, DEBUG_ERROR, "cannot set sample format (%s)\n", snd_strerror(rc));
+ LOGP(DSOUND, LOGL_ERROR, "cannot set sample format (%s)\n", snd_strerror(rc));
goto error;
}
rrate = samplerate;
rc = snd_pcm_hw_params_set_rate_near(handle, hw_params, &rrate, 0);
if (rc < 0) {
- PDEBUG(DSOUND, DEBUG_ERROR, "cannot set sample rate (%s)\n", snd_strerror(rc));
+ LOGP(DSOUND, LOGL_ERROR, "cannot set sample rate (%s)\n", snd_strerror(rc));
goto error;
}
if ((int)rrate != samplerate) {
- PDEBUG(DSOUND, DEBUG_ERROR, "Rate doesn't match (requested %dHz, get %dHz)\n", samplerate, rrate);
+ LOGP(DSOUND, LOGL_ERROR, "Rate doesn't match (requested %dHz, get %dHz)\n", samplerate, rrate);
rc = -EIO;
goto error;
}
@@ -100,14 +101,14 @@ static int set_hw_params(snd_pcm_t *handle, int samplerate, int *channels)
*channels = 2;
rc = snd_pcm_hw_params_set_channels(handle, hw_params, *channels);
if (rc < 0) {
- PDEBUG(DSOUND, DEBUG_ERROR, "cannot set channel count to 1 nor 2 (%s)\n", snd_strerror(rc));
+ LOGP(DSOUND, LOGL_ERROR, "cannot set channel count to 1 nor 2 (%s)\n", snd_strerror(rc));
goto error;
}
}
rc = snd_pcm_hw_params(handle, hw_params);
if (rc < 0) {
- PDEBUG(DSOUND, DEBUG_ERROR, "cannot set parameters (%s)\n", snd_strerror(rc));
+ LOGP(DSOUND, LOGL_ERROR, "cannot set parameters (%s)\n", snd_strerror(rc));
goto error;
}
@@ -125,57 +126,57 @@ error:
static int dev_open(sound_t *sound)
{
- int rc, rc_rec, rc_play;
-
- rc_play = snd_pcm_open(&sound->phandle, sound->audiodev, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK);
- rc_rec = snd_pcm_open(&sound->chandle, sound->audiodev, SND_PCM_STREAM_CAPTURE, SND_PCM_NONBLOCK);
- if (rc_play < 0 && rc_rec < 0) {
- PDEBUG(DSOUND, DEBUG_ERROR, "Failed to open '%s'! (%s)\n", sound->audiodev, snd_strerror(rc_play));
- PDEBUG(DSOUND, DEBUG_ERROR, "Run 'aplay -l' to get a list of available cards and devices.\n");
- PDEBUG(DSOUND, DEBUG_ERROR, "Then use 'hw:<card>:<device>' for audio device.\n");
- return rc_play;
- }
- if (rc_play < 0) {
- PDEBUG(DSOUND, DEBUG_ERROR, "Failed to open '%s' for playback! (%s) Please select a device that supports both direction audio.\n", sound->audiodev, snd_strerror(rc_play));
- return rc_play;
- }
- if (rc_rec < 0) {
- PDEBUG(DSOUND, DEBUG_ERROR, "Failed to open '%s' for capture! (%s) Please select a device that supports both direction audio.\n", sound->audiodev, snd_strerror(rc_rec));
- return rc_rec;
- }
+ int rc, rc_rec = 0, rc_play = 0;
- rc = set_hw_params(sound->phandle, sound->samplerate, &sound->pchannels);
- if (rc < 0) {
- PDEBUG(DSOUND, DEBUG_ERROR, "Failed to set playback hw params\n");
- return rc;
+ if (sound->direction == SOUND_DIR_PLAY || sound->direction == SOUND_DIR_DUPLEX) {
+ rc_play = snd_pcm_open(&sound->phandle, sound->paudiodev, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK);
+ if (rc_play < 0)
+ LOGP(DSOUND, LOGL_ERROR, "Failed to open '%s' for playback! (%s) Please select a device that supports playing audio.\n", sound->paudiodev, snd_strerror(rc_play));
}
- if (sound->pchannels < sound->channels) {
- PDEBUG(DSOUND, DEBUG_ERROR, "Sound card only supports %d channel for playback.\n", sound->pchannels);
- return rc;
+ if (sound->direction == SOUND_DIR_REC || sound->direction == SOUND_DIR_DUPLEX) {
+ rc_rec = snd_pcm_open(&sound->chandle, sound->caudiodev, SND_PCM_STREAM_CAPTURE, SND_PCM_NONBLOCK);
+ if (rc_rec < 0)
+ LOGP(DSOUND, LOGL_ERROR, "Failed to open '%s' for capture! (%s) Please select a device that supports capturing audio.\n", sound->caudiodev, snd_strerror(rc_rec));
}
- PDEBUG(DSOUND, DEBUG_DEBUG, "Playback with %d channels.\n", sound->pchannels);
+ if (rc_play < 0 || rc_rec < 0)
+ return (rc_play < 0) ? rc_play : rc_rec;
- rc = set_hw_params(sound->chandle, sound->samplerate, &sound->cchannels);
- if (rc < 0) {
- PDEBUG(DSOUND, DEBUG_ERROR, "Failed to set capture hw params\n");
- return rc;
- }
- if (sound->cchannels < sound->channels) {
- PDEBUG(DSOUND, DEBUG_ERROR, "Sound card only supports %d channel for capture.\n", sound->cchannels);
- return -EIO;
- }
- PDEBUG(DSOUND, DEBUG_DEBUG, "Capture with %d channels.\n", sound->cchannels);
+ if (sound->direction == SOUND_DIR_PLAY || sound->direction == SOUND_DIR_DUPLEX) {
+ rc = set_hw_params(sound->phandle, sound->samplerate, &sound->pchannels);
+ if (rc < 0) {
+ LOGP(DSOUND, LOGL_ERROR, "Failed to set playback hw params\n");
+ return rc;
+ }
+ if (sound->pchannels < sound->channels) {
+ LOGP(DSOUND, LOGL_ERROR, "Sound card only supports %d channel for playback.\n", sound->pchannels);
+ return rc;
+ }
+ LOGP(DSOUND, LOGL_DEBUG, "Playback with %d channels.\n", sound->pchannels);
- rc = snd_pcm_prepare(sound->phandle);
- if (rc < 0) {
- PDEBUG(DSOUND, DEBUG_ERROR, "cannot prepare audio interface for use (%s)\n", snd_strerror(rc));
- return rc;
+ rc = snd_pcm_prepare(sound->phandle);
+ if (rc < 0) {
+ LOGP(DSOUND, LOGL_ERROR, "cannot prepare audio interface for use (%s)\n", snd_strerror(rc));
+ return rc;
+ }
}
- rc = snd_pcm_prepare(sound->chandle);
- if (rc < 0) {
- PDEBUG(DSOUND, DEBUG_ERROR, "cannot prepare audio interface for use (%s)\n", snd_strerror(rc));
- return rc;
+ if (sound->direction == SOUND_DIR_REC || sound->direction == SOUND_DIR_DUPLEX) {
+ rc = set_hw_params(sound->chandle, sound->samplerate, &sound->cchannels);
+ if (rc < 0) {
+ LOGP(DSOUND, LOGL_ERROR, "Failed to set capture hw params\n");
+ return rc;
+ }
+ if (sound->cchannels < sound->channels) {
+ LOGP(DSOUND, LOGL_ERROR, "Sound card only supports %d channel for capture.\n", sound->cchannels);
+ return -EIO;
+ }
+ LOGP(DSOUND, LOGL_DEBUG, "Capture with %d channels.\n", sound->cchannels);
+
+ rc = snd_pcm_prepare(sound->chandle);
+ if (rc < 0) {
+ LOGP(DSOUND, LOGL_ERROR, "cannot prepare audio interface for use (%s)\n", snd_strerror(rc));
+ return rc;
+ }
}
return 0;
@@ -189,24 +190,32 @@ static void dev_close(sound_t *sound)
snd_pcm_close(sound->chandle);
}
-void *sound_open(const char *audiodev, double __attribute__((unused)) *tx_frequency, double __attribute__((unused)) *rx_frequency, int __attribute__((unused)) *am, int channels, double __attribute__((unused)) paging_frequency, int samplerate, int __attribute((unused)) buffer_size, double __attribute__((unused)) interval, double max_deviation, double __attribute__((unused)) max_modulation, double __attribute__((unused)) modulation_index)
+void *sound_open(int direction, const char *audiodev, double __attribute__((unused)) *tx_frequency, double __attribute__((unused)) *rx_frequency, int __attribute__((unused)) *am, int channels, double __attribute__((unused)) paging_frequency, int samplerate, int __attribute((unused)) buffer_size, double __attribute__((unused)) interval, double max_deviation, double __attribute__((unused)) max_modulation, double __attribute__((unused)) modulation_index)
{
sound_t *sound;
const char *env;
+ char *p;
int rc;
if (channels < 1 || channels > 2) {
- PDEBUG(DSOUND, DEBUG_ERROR, "Cannot use more than two channels with the same sound card!\n");
+ LOGP(DSOUND, LOGL_ERROR, "Cannot use more than two channels with the same sound card!\n");
return NULL;
}
sound = calloc(1, sizeof(sound_t));
if (!sound) {
- PDEBUG(DSOUND, DEBUG_ERROR, "Failed to alloc memory!\n");
+ LOGP(DSOUND, LOGL_ERROR, "Failed to alloc memory!\n");
return NULL;
}
- sound->audiodev = strdup(audiodev); // is feed when closed
+ sound->paudiodev = strdup(audiodev); // is feed when closed
+ if ((p = strchr(sound->paudiodev, '/'))) {
+ *p++ = '\0';
+ sound->caudiodev = p;
+ } else {
+ sound->caudiodev = sound->paudiodev;
+ }
+ sound->direction = direction;
sound->channels = channels;
sound->samplerate = samplerate;
sound->spl_deviation = max_deviation / 32767.0;
@@ -234,7 +243,7 @@ void *sound_open(const char *audiodev, double __attribute__((unused)) *tx_freque
if ((env = getenv("KEEP_FRAMES"))) {
KEEP_FRAMES = atoi(env);
- PDEBUG(DSOUND, DEBUG_NOTICE, "KEEP %d samples in RX buffer, to prevent corrupt read.\n", KEEP_FRAMES);
+ LOGP(DSOUND, LOGL_NOTICE, "KEEP %d samples in RX buffer, to prevent corrupt read.\n", KEEP_FRAMES);
}
return sound;
@@ -250,6 +259,9 @@ int sound_start(void *inst)
sound_t *sound = (sound_t *)inst;
int16_t buff[2];
+ if (sound->direction != SOUND_DIR_REC && sound->direction != SOUND_DIR_DUPLEX)
+ return -EINVAL;
+
/* trigger capturing */
snd_pcm_readi(sound->chandle, buff, 1);
@@ -261,7 +273,7 @@ void sound_close(void *inst)
sound_t *sound = (sound_t *)inst;
dev_close(sound);
- free(sound->audiodev);
+ free(sound->paudiodev);
free(sound);
}
@@ -320,6 +332,9 @@ int sound_write(void *inst, sample_t **samples, uint8_t __attribute__((unused))
int rc;
int i, ii;
+ if (sound->direction != SOUND_DIR_PLAY && sound->direction != SOUND_DIR_DUPLEX)
+ return -EINVAL;
+
if (sound->pchannels == 2) {
/* two channels */
#ifdef HAVE_MOBILE
@@ -377,7 +392,7 @@ int sound_write(void *inst, sample_t **samples, uint8_t __attribute__((unused))
rc = snd_pcm_writei(sound->phandle, buff, num);
if (rc < 0) {
- PDEBUG(DSOUND, DEBUG_ERROR, "failed to write audio to interface (%s)\n", snd_strerror(rc));
+ LOGP(DSOUND, LOGL_ERROR, "failed to write audio to interface (%s)\n", snd_strerror(rc));
if (rc == -EPIPE) {
dev_close(sound);
rc = dev_open(sound);
@@ -390,7 +405,7 @@ int sound_write(void *inst, sample_t **samples, uint8_t __attribute__((unused))
}
if (rc != num)
- PDEBUG(DSOUND, DEBUG_ERROR, "short write to audio interface, written %d bytes, got %d bytes\n", num, rc);
+ LOGP(DSOUND, LOGL_ERROR, "short write to audio interface, written %d bytes, got %d bytes\n", num, rc);
return rc;
}
@@ -405,6 +420,9 @@ int sound_read(void *inst, sample_t **samples, int num, int channels, double *rf
int in, rc;
int i, ii;
+ if (sound->direction != SOUND_DIR_REC && sound->direction != SOUND_DIR_DUPLEX)
+ return -EINVAL;
+
/* get samples in rx buffer */
in = snd_pcm_avail(sound->chandle);
/* if not more than KEEP_FRAMES frames available, try next time */
@@ -423,7 +441,7 @@ int sound_read(void *inst, sample_t **samples, int num, int channels, double *rf
if (rc < 0) {
if (errno == EAGAIN)
return 0;
- PDEBUG(DSOUND, DEBUG_ERROR, "failed to read audio from interface (%s)\n", snd_strerror(rc));
+ LOGP(DSOUND, LOGL_ERROR, "failed to read audio from interface (%s)\n", snd_strerror(rc));
/* recover read */
if (rc == -EPIPE) {
dev_close(sound);
@@ -502,12 +520,15 @@ int sound_get_tosend(void *inst, int buffer_size)
snd_pcm_sframes_t delay;
int tosend;
+ if (sound->direction != SOUND_DIR_PLAY && sound->direction != SOUND_DIR_DUPLEX)
+ return -EINVAL;
+
rc = snd_pcm_delay(sound->phandle, &delay);
if (rc < 0) {
if (rc == -32)
- PDEBUG(DSOUND, DEBUG_ERROR, "Buffer underrun: Please use higher buffer and enable real time scheduling\n");
+ LOGP(DSOUND, LOGL_ERROR, "Buffer underrun: Please use higher buffer and enable real time scheduling\n");
else
- PDEBUG(DSOUND, DEBUG_ERROR, "failed to get delay from interface (%s)\n", snd_strerror(rc));
+ LOGP(DSOUND, LOGL_ERROR, "failed to get delay from interface (%s)\n", snd_strerror(rc));
if (rc == -EPIPE) {
dev_close(sound);
rc = dev_open(sound);
diff --git a/src/libsquelch/Makefile.am b/src/libsquelch/Makefile.am
index 1f5e025..fd3cfe6 100644
--- a/src/libsquelch/Makefile.am
+++ b/src/libsquelch/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
noinst_LIBRARIES = libsquelch.a
diff --git a/src/libsquelch/squelch.c b/src/libsquelch/squelch.c
index ced2a79..5402ebb 100644
--- a/src/libsquelch/squelch.c
+++ b/src/libsquelch/squelch.c
@@ -20,7 +20,7 @@
#include <string.h>
#include <math.h>
#include <stdint.h>
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "squelch.h"
#define CHAN squelch->kanal
@@ -59,11 +59,11 @@ void squelch_init(squelch_t *squelch, const char *kanal, double threshold_db, do
/* measure noise floor for auto threshold mode */
if (threshold_db == 0.0) {
/* automatic threshold */
- PDEBUG_CHAN(DDSP, DEBUG_INFO, "RF signal squelch: Use automatic threshold\n");
+ LOGP_CHAN(DDSP, LOGL_INFO, "RF signal squelch: Use automatic threshold\n");
squelch->auto_state = 1;
} else if (!isinf(threshold_db)) {
/* preset threshold */
- PDEBUG_CHAN(DDSP, DEBUG_INFO, "RF signal squelch: Use preset threshold of %.1f dB\n", threshold_db);
+ LOGP_CHAN(DDSP, LOGL_INFO, "RF signal squelch: Use preset threshold of %.1f dB\n", threshold_db);
}
/* squelch is mute on init */
squelch->mute_time = mute_time;
@@ -97,7 +97,7 @@ enum squelch_result squelch(squelch_t *squelch, double rf_level_db, double durat
/* must be 0.1 dB smaller, so we prevent repeated debugging message with similar value */
if (threshold_db < squelch->threshold_db - 0.1) {
squelch->threshold_db = threshold_db;
- PDEBUG_CHAN(DDSP, DEBUG_INFO, "RF signal measurement: %.1f dB noise floor, using squelch threshold of %.1f dB\n", noise_db, threshold_db);
+ LOGP_CHAN(DDSP, LOGL_INFO, "RF signal measurement: %.1f dB noise floor, using squelch threshold of %.1f dB\n", noise_db, threshold_db);
}
squelch->auto_count = 0.0;
squelch->auto_level_count = 0;
@@ -110,7 +110,7 @@ enum squelch_result squelch(squelch_t *squelch, double rf_level_db, double durat
squelch->mute_count -= duration;
if (squelch->mute_count <= 0.0) {
if (squelch->mute_state) {
- PDEBUG_CHAN(DDSP, DEBUG_INFO, "RF signal strong: Unmuting audio (RF %.1f >= %.1f dB)\n", rf_level_db, squelch->threshold_db);
+ LOGP_CHAN(DDSP, LOGL_INFO, "RF signal strong: Unmuting audio (RF %.1f >= %.1f dB)\n", rf_level_db, squelch->threshold_db);
squelch->mute_state = 0;
}
squelch->mute_count = 0.0;
@@ -120,7 +120,7 @@ enum squelch_result squelch(squelch_t *squelch, double rf_level_db, double durat
squelch->mute_count += duration;
if (squelch->mute_count >= squelch->mute_time) {
if (!squelch->mute_state) {
- PDEBUG_CHAN(DDSP, DEBUG_INFO, "RF signal weak: Muting audio (RF %.1f < %.1f dB)\n", rf_level_db, squelch->threshold_db);
+ LOGP_CHAN(DDSP, LOGL_INFO, "RF signal weak: Muting audio (RF %.1f < %.1f dB)\n", rf_level_db, squelch->threshold_db);
squelch->mute_state = 1;
}
squelch->mute_count = squelch->mute_time;
@@ -132,7 +132,7 @@ enum squelch_result squelch(squelch_t *squelch, double rf_level_db, double durat
squelch->loss_count += duration;
if (squelch->loss_count >= squelch->loss_time) {
if (!squelch->loss_state) {
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "RF signal loss detected after %.1f seconds\n", squelch->loss_time);
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "RF signal loss detected after %.1f seconds\n", squelch->loss_time);
squelch->loss_state = 1;
return SQUELCH_LOSS;
}
diff --git a/src/libtimer/Makefile.am b/src/libtimer/Makefile.am
deleted file mode 100644
index 538670a..0000000
--- a/src/libtimer/Makefile.am
+++ /dev/null
@@ -1,6 +0,0 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
-
-noinst_LIBRARIES = libtimer.a
-
-libtimer_a_SOURCES = \
- timer.c
diff --git a/src/libtimer/timer.c b/src/libtimer/timer.c
deleted file mode 100644
index 174533f..0000000
--- a/src/libtimer/timer.c
+++ /dev/null
@@ -1,119 +0,0 @@
-/* Timer handling
- *
- * (C) 2016 by Andreas Eversberg <jolly@eversberg.eu>
- * All Rights Reserved
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <stdio.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-//#include <sys/time.h>
-#include <time.h>
-#include <errno.h>
-#include "timer.h"
-
-static struct timer *timer_head = NULL;
-static struct timer **timer_tail_p = &timer_head;
-
-double get_time(void)
-{
- static struct timespec tv;
-
- clock_gettime(CLOCK_REALTIME, &tv);
-
- return (double)tv.tv_sec + (double)tv.tv_nsec / 1000000000.0;
-}
-
-void timer_init(struct timer *timer, void (*fn)(struct timer *timer), void *priv)
-{
- if (timer->linked) {
- fprintf(stderr, "Timer is already initialized, aborting!\n");
- abort();
- }
-
- timer->timeout = 0;
- timer->fn = fn;
- timer->priv = priv;
- timer->next = NULL;
- *timer_tail_p = timer;
- timer_tail_p = &timer->next;
- timer->linked = 1;
-}
-
-void timer_exit(struct timer *timer)
-{
- timer_tail_p = &timer_head;
- while (*timer_tail_p) {
- if (timer == *timer_tail_p)
- *timer_tail_p = (*timer_tail_p)->next;
- else
- timer_tail_p = &((*timer_tail_p)->next);
- }
- timer->linked = 0;
-}
-
-void timer_start(struct timer *timer, double duration)
-{
- if (!timer->linked) {
- fprintf(stderr, "Timer is not initialized, aborting!\n");
- abort();
- }
-
- timer->duration = duration;
- timer->timeout = get_time() + duration;
-}
-
-void timer_stop(struct timer *timer)
-{
- if (!timer->linked) {
- fprintf(stderr, "Timer is not initialized, aborting!\n");
- abort();
- }
-
- timer->timeout = 0;
-}
-
-int timer_running(struct timer *timer)
-{
- if (!timer->linked) {
- fprintf(stderr, "Timer is not initialized, aborting!\n");
- abort();
- }
-
- return (timer->timeout != 0);
-}
-
-void process_timer(void)
-{
- struct timer *timer;
- double now;
-
- now = get_time();
-
-again:
- timer = timer_head;
-
- while (timer) {
- if (timer->linked && timer->timeout > 0 && now >= timer->timeout) {
- timer->timeout = 0;
- timer->fn(timer);
- goto again;
- }
- timer = timer->next;
- }
-}
-
diff --git a/src/libtimer/timer.h b/src/libtimer/timer.h
deleted file mode 100644
index 2073a8f..0000000
--- a/src/libtimer/timer.h
+++ /dev/null
@@ -1,18 +0,0 @@
-
-struct timer {
- struct timer *next;
- int linked; /* set is timer is initialized and linked */
- double duration;
- double timeout;
- void (*fn)(struct timer *timer);
- void *priv;
-};
-
-double get_time(void);
-void timer_init(struct timer *timer, void (*fn)(struct timer *timer), void *priv);
-void timer_exit(struct timer *timer);
-void timer_start(struct timer *timer, double duration);
-void timer_stop(struct timer *timer);
-int timer_running(struct timer *timer);
-void process_timer(void);
-
diff --git a/src/libv27/Makefile.am b/src/libv27/Makefile.am
index 69873d1..8fa7117 100644
--- a/src/libv27/Makefile.am
+++ b/src/libv27/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
noinst_LIBRARIES = libv27.a
diff --git a/src/libv27/modem.c b/src/libv27/modem.c
index fbcd448..aba8b97 100644
--- a/src/libv27/modem.c
+++ b/src/libv27/modem.c
@@ -20,7 +20,7 @@
#include <stdio.h>
#include <stdint.h>
#include <string.h>
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../libsample/sample.h"
#include "modem.h"
diff --git a/src/libv27/psk.c b/src/libv27/psk.c
index c20f286..a98f154 100644
--- a/src/libv27/psk.c
+++ b/src/libv27/psk.c
@@ -23,7 +23,7 @@
#include <string.h>
#include <errno.h>
#include <math.h>
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../libsample/sample.h"
#include "psk.h"
@@ -93,18 +93,18 @@ int psk_mod_init(psk_mod_t *psk, void *inst, int (*send_bit)(void *inst), int sa
sample_t spl;
if (samplerate != 48000) {
- PDEBUG(DDSP, DEBUG_NOTICE, "Sampling rate for PSK encoder must be exactly 48000 Hz!\n");
+ LOGP(DDSP, LOGL_NOTICE, "Sampling rate for PSK encoder must be exactly 48000 Hz!\n");
return -EINVAL;
}
if (symbolrate != 1600) {
- PDEBUG(DDSP, DEBUG_NOTICE, "Symbol rate for PSK encoder must be exactly 1600 Hz!\n");
+ LOGP(DDSP, LOGL_NOTICE, "Symbol rate for PSK encoder must be exactly 1600 Hz!\n");
return -EINVAL;
}
cutoff = 3300.0;
transitionband = 200;
psk->lp[0] = fir_lowpass_init((double)samplerate, cutoff, transitionband);
- PDEBUG(DDSP, DEBUG_DEBUG, "Cut off frequency is at %.1f Hz and %.1f Hz.\n", TX_CARRIER + cutoff, TX_CARRIER - cutoff);
+ LOGP(DDSP, LOGL_DEBUG, "Cut off frequency is at %.1f Hz and %.1f Hz.\n", TX_CARRIER + cutoff, TX_CARRIER - cutoff);
/* interpolate symbol table from 9600 Hz to 48000 Hz */
for (i = 0; i < 8; i++) {
@@ -119,7 +119,7 @@ int psk_mod_init(psk_mod_t *psk, void *inst, int (*send_bit)(void *inst), int sa
}
#else
if (samplerate < 48000) {
- PDEBUG(DDSP, DEBUG_NOTICE, "Sampling rate for PSK encoder must be 48000 Hz minimum!\n");
+ LOGP(DDSP, LOGL_NOTICE, "Sampling rate for PSK encoder must be 48000 Hz minimum!\n");
return -EINVAL;
}
@@ -128,13 +128,13 @@ int psk_mod_init(psk_mod_t *psk, void *inst, int (*send_bit)(void *inst), int sa
transitionband = 200;
psk->lp[0] = fir_lowpass_init((double)samplerate, cutoff, transitionband);
psk->lp[1] = fir_lowpass_init((double)samplerate, cutoff, transitionband);
- PDEBUG(DDSP, DEBUG_DEBUG, "Cut off frequency is at %.1f Hz and %.1f Hz.\n", TX_CARRIER + cutoff, TX_CARRIER - cutoff);
+ LOGP(DDSP, LOGL_DEBUG, "Cut off frequency is at %.1f Hz and %.1f Hz.\n", TX_CARRIER + cutoff, TX_CARRIER - cutoff);
psk->symbols_per_sample = symbolrate / (double)samplerate;
- PDEBUG(DDSP, DEBUG_DEBUG, "Symbol duration of %.4f symbols per sample @ %d.\n", psk->symbols_per_sample, samplerate);
+ LOGP(DDSP, LOGL_DEBUG, "Symbol duration of %.4f symbols per sample @ %d.\n", psk->symbols_per_sample, samplerate);
psk->carrier_phaseshift = 2.0 * M_PI * TX_CARRIER / (double)samplerate;
- PDEBUG(DDSP, DEBUG_DEBUG, "Carrier phase shift of %.4f per sample @ %d.\n", psk->carrier_phaseshift, samplerate);
+ LOGP(DDSP, LOGL_DEBUG, "Carrier phase shift of %.4f per sample @ %d.\n", psk->carrier_phaseshift, samplerate);
#endif
return 0;
@@ -237,7 +237,7 @@ int psk_demod_init(psk_demod_t *psk, void *inst, void (*receive_bit)(void *inst,
double cutoff, transitionband;
if (samplerate < 48000) {
- PDEBUG(DDSP, DEBUG_NOTICE, "Sampling rate for PSK decoder must be 48000 Hz minimum!\n");
+ LOGP(DDSP, LOGL_NOTICE, "Sampling rate for PSK decoder must be 48000 Hz minimum!\n");
return -EINVAL;
}
@@ -256,10 +256,10 @@ int psk_demod_init(psk_demod_t *psk, void *inst, void (*receive_bit)(void *inst,
iir_lowpass_init(&psk->lp_error[1], 50.0, samplerate, 2);
iir_bandpass_init(&psk->lp_clock, symbolrate, samplerate, 40);
psk->sample_delay = (int)floor((double)samplerate / symbolrate * 0.25); /* percent of sine duration behind zero crossing */
- PDEBUG(DDSP, DEBUG_DEBUG, "Cut off frequency is at %.1f Hz and %.1f Hz.\n", RX_CARRIER + cutoff, RX_CARRIER - cutoff);
+ LOGP(DDSP, LOGL_DEBUG, "Cut off frequency is at %.1f Hz and %.1f Hz.\n", RX_CARRIER + cutoff, RX_CARRIER - cutoff);
psk->carrier_phaseshift = 2.0 * M_PI * -RX_CARRIER / (double)samplerate;
- PDEBUG(DDSP, DEBUG_DEBUG, "Carrier phase shift of %.4f per sample @ %d.\n", psk->carrier_phaseshift, samplerate);
+ LOGP(DDSP, LOGL_DEBUG, "Carrier phase shift of %.4f per sample @ %d.\n", psk->carrier_phaseshift, samplerate);
return 0;
}
diff --git a/src/libwave/Makefile.am b/src/libwave/Makefile.am
index c573515..52e094c 100644
--- a/src/libwave/Makefile.am
+++ b/src/libwave/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
noinst_LIBRARIES = libwave.a
diff --git a/src/libwave/wave.c b/src/libwave/wave.c
index 50c2c96..57cd7b3 100644
--- a/src/libwave/wave.c
+++ b/src/libwave/wave.c
@@ -25,7 +25,7 @@
#include <unistd.h>
#include <pthread.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "wave.h"
/* NOTE: No locking required for writing and reading buffer pointers, since 'int' is atomic on >=32 bit machines */
@@ -52,7 +52,7 @@ static void *record_child(void *arg)
/* quit on error */
if (len < 0) {
error:
- PDEBUG(DWAVE, DEBUG_ERROR, "Failed to write to recording WAVE file! (errno %d)\n", errno);
+ LOGP(DWAVE, LOGL_ERROR, "Failed to write to recording WAVE file! (errno %d)\n", errno);
rec->finish = 1;
return NULL;
}
@@ -88,7 +88,7 @@ static void *playback_child(void *arg)
len = fread(play->buffer + play->buffer_writep, 1, to_read, play->fp);
/* quit on error */
if (len < 0) {
- PDEBUG(DWAVE, DEBUG_ERROR, "Failed to read from playback WAVE file! (errno %d)\n", errno);
+ LOGP(DWAVE, LOGL_ERROR, "Failed to read from playback WAVE file! (errno %d)\n", errno);
play->finish = 1;
return NULL;
}
@@ -129,7 +129,7 @@ int wave_create_record(wave_rec_t *rec, const char *filename, int samplerate, in
rec->fp = fopen(filename, "w");
if (!rec->fp) {
- PDEBUG(DWAVE, DEBUG_ERROR, "Failed to open recording file '%s'! (errno %d)\n", filename, errno);
+ LOGP(DWAVE, LOGL_ERROR, "Failed to open recording file '%s'! (errno %d)\n", filename, errno);
return -errno;
}
@@ -139,18 +139,18 @@ int wave_create_record(wave_rec_t *rec, const char *filename, int samplerate, in
rec->buffer_size = samplerate * 2 * channels;
rec->buffer = calloc(rec->buffer_size, 1);
if (!rec->buffer) {
- PDEBUG(DWAVE, DEBUG_NOTICE, "No mem!\n");
+ LOGP(DWAVE, LOGL_NOTICE, "No mem!\n");
rc = ENOMEM;
goto error;
}
rc = pthread_create(&rec->tid, NULL, record_child, rec);
if (rc < 0) {
- PDEBUG(DWAVE, DEBUG_ERROR, "Failed to create thread to record WAVE file! (errno %d)\n", errno);
+ LOGP(DWAVE, LOGL_ERROR, "Failed to create thread to record WAVE file! (errno %d)\n", errno);
goto error;
}
- PDEBUG(DWAVE, DEBUG_NOTICE, "*** Writing WAVE file to %s.\n", filename);
+ LOGP(DWAVE, LOGL_NOTICE, "*** Writing WAVE file to %s.\n", filename);
return 0;
@@ -180,50 +180,50 @@ int wave_create_playback(wave_play_t *play, const char *filename, int *samplerat
play->fp = fopen(filename, "r");
if (!play->fp) {
- PDEBUG(DWAVE, DEBUG_ERROR, "Failed to open playback file '%s'! (errno %d)\n", filename, errno);
+ LOGP(DWAVE, LOGL_ERROR, "Failed to open playback file '%s'! (errno %d)\n", filename, errno);
return -errno;
}
len = fread(buffer, 1, 12, play->fp);
if (len != 12) {
- PDEBUG(DWAVE, DEBUG_ERROR, "Failed to read RIFF header!\n");
+ LOGP(DWAVE, LOGL_ERROR, "Failed to read RIFF header!\n");
rc = -EIO;
goto error;
}
if (!!strncmp((char *)buffer, "RIFF", 4)) {
- PDEBUG(DWAVE, DEBUG_ERROR, "Missing RIFF header, seems that this is no WAVE file!\n");
+ LOGP(DWAVE, LOGL_ERROR, "Missing RIFF header, seems that this is no WAVE file!\n");
rc = -EINVAL;
goto error;
}
size = buffer[4] + (buffer[5] << 8) + (buffer[6] << 16) + (buffer[7] << 24);
if (!!strncmp((char *)buffer + 8, "WAVE", 4)) {
- PDEBUG(DWAVE, DEBUG_ERROR, "Missing WAVE header, seems that this is no WAVE file!\n");
+ LOGP(DWAVE, LOGL_ERROR, "Missing WAVE header, seems that this is no WAVE file!\n");
rc = -EINVAL;
goto error;
}
size -= 4;
while (size) {
if (size < 8) {
- PDEBUG(DWAVE, DEBUG_ERROR, "Short read of WAVE file!\n");
+ LOGP(DWAVE, LOGL_ERROR, "Short read of WAVE file!\n");
rc = -EINVAL;
goto error;
}
len = fread(buffer, 1, 8, play->fp);
if (len != 8) {
- PDEBUG(DWAVE, DEBUG_ERROR, "Failed to read chunk of WAVE file!\n");
+ LOGP(DWAVE, LOGL_ERROR, "Failed to read chunk of WAVE file!\n");
rc = -EIO;
goto error;
}
chunk = buffer[4] + (buffer[5] << 8) + (buffer[6] << 16) + (buffer[7] << 24);
size -= 8 + chunk;
if (size < 0) {
- PDEBUG(DWAVE, DEBUG_ERROR, "WAVE error: Chunk '%c%c%c%c' overflows file size!\n", buffer[4], buffer[5], buffer[6], buffer[7]);
+ LOGP(DWAVE, LOGL_ERROR, "WAVE error: Chunk '%c%c%c%c' overflows file size!\n", buffer[4], buffer[5], buffer[6], buffer[7]);
rc = -EIO;
goto error;
}
if (!strncmp((char *)buffer, "fmt ", 4)) {
if (chunk < 16 || chunk > (int)sizeof(buffer)) {
- PDEBUG(DWAVE, DEBUG_ERROR, "WAVE error: Short or corrupt 'fmt' chunk!\n");
+ LOGP(DWAVE, LOGL_ERROR, "WAVE error: Short or corrupt 'fmt' chunk!\n");
rc = -EINVAL;
goto error;
}
@@ -238,7 +238,7 @@ int wave_create_playback(wave_play_t *play, const char *filename, int *samplerat
} else
if (!strncmp((char *)buffer, "data", 4)) {
if (!gotfmt) {
- PDEBUG(DWAVE, DEBUG_ERROR, "WAVE error: 'data' without 'fmt' chunk!\n");
+ LOGP(DWAVE, LOGL_ERROR, "WAVE error: 'data' without 'fmt' chunk!\n");
rc = -EINVAL;
goto error;
}
@@ -255,42 +255,42 @@ int wave_create_playback(wave_play_t *play, const char *filename, int *samplerat
}
if (!gotfmt || !gotdata) {
- PDEBUG(DWAVE, DEBUG_ERROR, "WAVE error: Missing 'data' or 'fmt' chunk!\n");
+ LOGP(DWAVE, LOGL_ERROR, "WAVE error: Missing 'data' or 'fmt' chunk!\n");
rc = -EINVAL;
goto error;
}
if (fmt.format != 1) {
- PDEBUG(DWAVE, DEBUG_ERROR, "WAVE error: We support only PCM files!\n");
+ LOGP(DWAVE, LOGL_ERROR, "WAVE error: We support only PCM files!\n");
rc = -EINVAL;
goto error;
}
if (*channels_p == 0)
*channels_p = fmt.channels;
if (fmt.channels != *channels_p) {
- PDEBUG(DWAVE, DEBUG_ERROR, "WAVE error: We expect %d cannel(s), but wave file only has %d channel(s)\n", *channels_p, fmt.channels);
+ LOGP(DWAVE, LOGL_ERROR, "WAVE error: We expect %d cannel(s), but wave file only has %d channel(s)\n", *channels_p, fmt.channels);
rc = -EINVAL;
goto error;
}
if (*samplerate_p == 0)
*samplerate_p = fmt.sample_rate;
if ((int)fmt.sample_rate != *samplerate_p) {
- PDEBUG(DWAVE, DEBUG_ERROR, "WAVE error: The WAVE file's sample rate (%d) does not match our sample rate (%d)!\n", fmt.sample_rate, *samplerate_p);
+ LOGP(DWAVE, LOGL_ERROR, "WAVE error: The WAVE file's sample rate (%d) does not match our sample rate (%d)!\n", fmt.sample_rate, *samplerate_p);
rc = -EINVAL;
goto error;
}
if ((int)fmt.data_rate != 2 * *channels_p * *samplerate_p) {
- PDEBUG(DWAVE, DEBUG_ERROR, "WAVE error: The WAVE file's data rate is only %d bytes per second, but we expect %d bytes per second (2 bytes per sample * channels * samplerate)!\n", fmt.data_rate, 2 * *channels_p * *samplerate_p);
+ LOGP(DWAVE, LOGL_ERROR, "WAVE error: The WAVE file's data rate is only %d bytes per second, but we expect %d bytes per second (2 bytes per sample * channels * samplerate)!\n", fmt.data_rate, 2 * *channels_p * *samplerate_p);
rc = -EINVAL;
goto error;
}
if (fmt.bytes_sample != 2 * *channels_p) {
- PDEBUG(DWAVE, DEBUG_ERROR, "WAVE error: The WAVE file's bytes per sample is only %d, but we expect %d bytes sample (2 bytes per sample * channels)!\n", fmt.bytes_sample, 2 * *channels_p);
+ LOGP(DWAVE, LOGL_ERROR, "WAVE error: The WAVE file's bytes per sample is only %d, but we expect %d bytes sample (2 bytes per sample * channels)!\n", fmt.bytes_sample, 2 * *channels_p);
rc = -EINVAL;
goto error;
}
if (fmt.bits_sample != 16) {
- PDEBUG(DWAVE, DEBUG_ERROR, "WAVE error: We support only 16 bit files!\n");
+ LOGP(DWAVE, LOGL_ERROR, "WAVE error: We support only 16 bit files!\n");
rc = -EINVAL;
goto error;
}
@@ -301,18 +301,18 @@ int wave_create_playback(wave_play_t *play, const char *filename, int *samplerat
play->buffer_size = *samplerate_p * 2 * *channels_p;
play->buffer = calloc(play->buffer_size, 1);
if (!play->buffer) {
- PDEBUG(DWAVE, DEBUG_ERROR, "No mem!\n");
+ LOGP(DWAVE, LOGL_ERROR, "No mem!\n");
rc = -ENOMEM;
goto error;
}
rc = pthread_create(&play->tid, NULL, playback_child, play);
if (rc < 0) {
- PDEBUG(DWAVE, DEBUG_ERROR, "Failed to create thread to playback WAVE file! (errno %d)\n", errno);
+ LOGP(DWAVE, LOGL_ERROR, "Failed to create thread to playback WAVE file! (errno %d)\n", errno);
goto error;
}
- PDEBUG(DWAVE, DEBUG_NOTICE, "*** Reading WAVE file from %s.\n", filename);
+ LOGP(DWAVE, LOGL_NOTICE, "*** Reading WAVE file from %s.\n", filename);
return 0;
@@ -344,7 +344,7 @@ int wave_write(wave_rec_t *rec, sample_t **samples, int length)
to_write = (rec->buffer_size + rec->buffer_readp - rec->buffer_writep - 1) % rec->buffer_size;
to_write /= 2 * rec->channels;
if (to_write < length)
- PDEBUG(DWAVE, DEBUG_NOTICE, "Record WAVE buffer overflow.\n");
+ LOGP(DWAVE, LOGL_NOTICE, "Record WAVE buffer overflow.\n");
else
to_write = length;
if (to_write == 0)
@@ -398,7 +398,7 @@ read_empty:
if (to_read == 0 && play->finish) {
if (play->left) {
- PDEBUG(DWAVE, DEBUG_NOTICE, "*** Finished reading WAVE file. (short read)\n");
+ LOGP(DWAVE, LOGL_NOTICE, "*** Finished reading WAVE file. (short read)\n");
play->left = 0;
}
goto read_empty;
@@ -418,7 +418,7 @@ read_empty:
play->left -= to_read;
if (!play->left)
- PDEBUG(DWAVE, DEBUG_NOTICE, "*** Finished reading WAVE file.\n");
+ LOGP(DWAVE, LOGL_NOTICE, "*** Finished reading WAVE file.\n");
if (to_read < length)
goto read_empty;
@@ -499,7 +499,7 @@ void wave_destroy_record(wave_rec_t *rec)
fclose(rec->fp);
rec->fp = NULL;
- PDEBUG(DWAVE, DEBUG_NOTICE, "*** WAVE file written.\n");
+ LOGP(DWAVE, LOGL_NOTICE, "*** WAVE file written.\n");
}
void wave_destroy_playback(wave_play_t *play)
diff --git a/src/magnetic/Makefile.am b/src/magnetic/Makefile.am
index f5e9f83..0aaf11b 100644
--- a/src/magnetic/Makefile.am
+++ b/src/magnetic/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
bin_PROGRAMS = \
cnetz_magnetic
@@ -10,10 +10,11 @@ cnetz_magnetic_SOURCES = \
cnetz_magnetic_LDADD = \
$(COMMON_LA) \
- $(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/liboptions/liboptions.a \
$(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libaaimage/libaaimage.a \
+ $(top_builddir)/src/liblogging/liblogging.a \
+ $(LIBOSMOCORE_LIBS) \
-lm
if HAVE_ALSA
diff --git a/src/magnetic/magnetic.ino b/src/magnetic/magnetic.ino
index 3d905ad..a9c4d03 100755
--- a/src/magnetic/magnetic.ino
+++ b/src/magnetic/magnetic.ino
@@ -26,8 +26,9 @@
/* Use a clock speed of 8 MHz. If you change it, also change the fuses!!!!
* The CLKPS bits are set to 0 by software, so that 8 MHz clock is not divided.
- *
- * Press switch 1 to emulate card, press switch 2 to emulate BSA44 service card.
+ */
+
+/* Press switch 1 to emulate card, press switch 2 to emulate BSA44 service card.
* The LED will do short flashs, to indicate that power is on.
*
* Hold a switch while powering on, to enter test mode. The LED will light up.
@@ -38,11 +39,11 @@
*
* To enter programming mode, press both buttons simultaniously.
* The LED will continously blink, to indicate programming mode.
- * Press switch 1 to select subscriber number or switch 1 to select security code.
+ * Press switch 1 to change subscriber number or switch 2 to change security code.
* The LED will then show the digit values by blinking. It can be aborted with any switch.
* After short blinking, a long blink shows that the first digit can be entered.
* Press switch 1 1-10 times to enter the digit. When done, press switch 2 and continue
- * with the next digit. When all digits are entered, press switch 2 again.
+ * with the next digit. When all digits are entered, press switch 2 twice to confirm.
* A soft flash of the LED (fading in and out) will indicate that the new digits are stored.
* A false input will abort the programming procedure and restart with continuous blinking.
* To abort programming mode, press both buttuns simultaniously.
diff --git a/src/magnetic/main.c b/src/magnetic/main.c
index 2d32231..2281752 100644
--- a/src/magnetic/main.c
+++ b/src/magnetic/main.c
@@ -29,9 +29,10 @@
#include "../libsample/sample.h"
#include "../libsound/sound.h"
#include "../libwave/wave.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../liboptions/options.h"
#include "../libaaimage/aaimage.h"
+#include <osmocom/cc/misc.h>
#include "iso7811.h"
int num_kanal = 1;
@@ -54,7 +55,7 @@ static const char *sicherung = "12345";
#define CNETZ_SWITCH_ON 27 /* switch closing during lead-out, in digit-duration */
#define CNETZ_SWITCH_OFF 42 /* switch opening during lead-out, in digit-duration */
-void print_help(const char *arg0)
+static void print_help(const char *arg0)
{
printf("Usage: %s [options] -a hw:0,0 <number> | service\n", arg0);
/* - - */
@@ -64,7 +65,7 @@ void print_help(const char *arg0)
printf(" --config [~/]<path to config file>\n");
printf(" Give a config file to use. If it starts with '~/', path is at home dir.\n");
printf(" Each line in config file is one option, '-' or '--' must not be given!\n");
- debug_print_help();
+ logging_print_help();
printf(" -a --audio-device hw:<card>,<device>\n");
printf(" Input audio from sound card's device number\n");
printf(" -s --samplerate <sample rate>\n");
@@ -81,7 +82,7 @@ void print_help(const char *arg0)
printf("\n'service': BSA44 service card (to unlock phone after battery replacement)\n");
}
-void add_options(void)
+static void add_options(void)
{
option_add('h', "help", 0);
option_add('v', "debug", 1);
@@ -92,7 +93,7 @@ void add_options(void)
option_add('S', "sicherung", 1);
};
-int handle_options(int short_option, int argi, char **argv)
+static int handle_options(int short_option, int argi, char **argv)
{
int rc;
@@ -101,13 +102,11 @@ int handle_options(int short_option, int argi, char **argv)
print_help(argv[0]);
return 0;
case 'v':
- if (!strcasecmp(argv[argi], "list")) {
- debug_list_cat();
+ rc = parse_logging_opt(argv[argi]);
+ if (rc > 0)
return 0;
- }
- rc = parse_debug_opt(argv[argi]);
if (rc < 0) {
- fprintf(stderr, "Failed to parse debug option, please use -h for help.\n");
+ fprintf(stderr, "Failed to parse logging option, please use -h for help.\n");
return rc;
}
break;
@@ -133,7 +132,7 @@ int handle_options(int short_option, int argi, char **argv)
return 1;
}
-void sighandler(int sigset)
+static void sighandler(int sigset)
{
if (sigset == SIGHUP)
return;
@@ -154,7 +153,8 @@ int main(int argc, char *argv[])
int rc, argi;
int i, j;
- debuglevel = DEBUG_INFO;
+ loglevel = LOGL_INFO;
+ logging_init();
add_options();
rc = options_config_file(argc, argv, "~/.osmocom/analog/magnetic.conf", handle_options);
@@ -244,9 +244,9 @@ inval_number:
}
memset(silence, 0, sizeof(silence));
- PDEBUG(DDSP, DEBUG_INFO, "Total bits: %d\n", length * 5);
- PDEBUG(DDSP, DEBUG_INFO, "Samples per bit: %d\n", samples_per_halfbit * 2);
- PDEBUG(DDSP, DEBUG_INFO, "Total samples: %d (duration: %.3f seconds)\n", total_samples, (double)total_samples / (double)dsp_samplerate);
+ LOGP(DDSP, LOGL_INFO, "Total bits: %d\n", length * 5);
+ LOGP(DDSP, LOGL_INFO, "Samples per bit: %d\n", samples_per_halfbit * 2);
+ LOGP(DDSP, LOGL_INFO, "Total samples: %d (duration: %.3f seconds)\n", total_samples, (double)total_samples / (double)dsp_samplerate);
if (wave_file) {
wave_rec_t wave_rec;
@@ -254,7 +254,7 @@ inval_number:
/* open wave file */
rc = wave_create_record(&wave_rec, wave_file, dsp_samplerate, 1, 1.0);
if (rc < 0) {
- PDEBUG(DRADIO, DEBUG_ERROR, "Failed to create WAVE record instance!\n");
+ LOGP(DRADIO, LOGL_ERROR, "Failed to create WAVE record instance!\n");
goto error;
}
samples[0] = silence;
@@ -269,15 +269,15 @@ inval_number:
#ifdef HAVE_ALSA
/* open audio device */
- sound = sound_open(dsp_audiodev, NULL, NULL, NULL, 1, 0.0, dsp_samplerate, buffer_size, 1.0, 1.0, 0.0, 2.0);
+ sound = sound_open(SOUND_DIR_PLAY, dsp_audiodev, NULL, NULL, NULL, 1, 0.0, dsp_samplerate, buffer_size, 1.0, 1.0, 0.0, 2.0);
if (!sound) {
rc = -EIO;
- PDEBUG(DRADIO, DEBUG_ERROR, "Failed to open sound device!\n");
+ LOGP(DRADIO, LOGL_ERROR, "Failed to open sound device!\n");
goto error;
}
#else
rc = -ENOTSUP;
- PDEBUG(DRADIO, DEBUG_ERROR, "No sound card support compiled in!\n");
+ LOGP(DRADIO, LOGL_ERROR, "No sound card support compiled in!\n");
goto error;
#endif
@@ -365,4 +365,6 @@ done:
return 0;
}
+void osmo_cc_set_log_cat(int __attribute__((unused)) cc_log_cat) {}
+
#endif /* ARDUINO */
diff --git a/src/mate/Makefile.am b/src/mate/Makefile.am
new file mode 100644
index 0000000..b32cb7e
--- /dev/null
+++ b/src/mate/Makefile.am
@@ -0,0 +1,29 @@
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
+
+bin_PROGRAMS = \
+ matesimulator
+
+matesimulator_SOURCES = \
+ matesimulator.c
+
+matesimulator_LDADD = \
+ $(COMMON_LA) \
+ $(top_builddir)/src/liboptions/liboptions.a \
+ $(top_builddir)/src/libdebug/libdebug.a \
+ $(top_builddir)/src/libwave/libwave.a \
+ $(top_builddir)/src/libsample/libsample.a \
+ $(top_builddir)/src/liblogging/liblogging.a \
+ $(LIBOSMOCORE_LIBS) \
+ $(LIBOSMOCC_LIBS) \
+ -lm
+
+if HAVE_ALSA
+matesimulator_LDADD += \
+ $(top_builddir)/src/libsound/libsound.a \
+ $(ALSA_LIBS)
+endif
+
+if HAVE_ALSA
+AM_CPPFLAGS += -DHAVE_ALSA
+endif
+
diff --git a/src/mate/matesimulator.c b/src/mate/matesimulator.c
new file mode 100644
index 0000000..72d1c92
--- /dev/null
+++ b/src/mate/matesimulator.c
@@ -0,0 +1,322 @@
+/* Mate Simulator - This is a fun project that has been created on
+ * chaos communication congress. It simulates the tone of a mate bottle
+ * if you blow on it. It is used to stimulate the "mate-o-meter" of
+ * eventphone.
+ *
+ * (C) 2019 by Andreas Eversberg <jolly@eversberg.eu>
+ * All Rights Reserved
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <math.h>
+#include <errno.h>
+#include "../libsample/sample.h"
+#include "../libwave/wave.h"
+#include "../liblogging/logging.h"
+#ifdef HAVE_ALSA
+#include "../libsound/sound.h"
+#endif
+#include "../liboptions/options.h"
+
+/* presets */
+static int dsp_buffer = 50;
+static int dsp_samplerate = 48000;
+static const char *dsp_audiodev = "hw:0,0";
+const char *write_tx_wave = NULL;
+double tone, fill;
+
+/* instances */
+#ifdef HAVE_ALSA
+void *audio = NULL;
+#endif
+wave_rec_t wave_tx_rec;
+
+/* dummy functions */
+int num_kanal = 1; /* only one channel used for debugging */
+void *get_sender_by_empfangsfrequenz(void);
+void *get_sender_by_empfangsfrequenz() { return NULL; }
+void display_measurements_add(void);
+void display_measurements_add() {}
+void display_measurements_update(void);
+void display_measurements_update() {}
+
+/* mate fill table according to eventphone's research */
+static double conversion[] = {
+ /* percent, frequency */
+ // 142, 1500,
+ // 123, 1000,
+ 100, 910,
+ 98, 710,
+ 96, 608,
+ 94, 534,
+ 92, 490,
+ 90, 452,
+ 88, 418,
+ 86, 396,
+ 84, 372,
+ 82, 358,
+ 80, 340,
+ 78, 325,
+ 76, 310,
+ 74, 300,
+ 72, 294,
+ 70, 282,
+ 68, 270,
+ 66, 264,
+ 64, 256,
+ 62, 250,
+ 60, 244,
+ 58, 240,
+ 56, 234,
+ 54, 228,
+ 52, 224,
+ 50, 220,
+ 48, 216,
+ 46, 212,
+ 44, 208,
+ 42, 204,
+ 40, 202,
+ 38, 198,
+ 36, 194,
+ 34, 190,
+ 32, 187,
+ 30, 184,
+ 28, 182,
+ 26, 180,
+ 24, 178,
+ 22, 176,
+ 20, 174,
+ 18, 172,
+ 16, 170,
+ 14, 168,
+ 12, 166,
+ 10, 165,
+ 8, 164,
+ 6, 163,
+ 4, 162,
+ 2, 161,
+ 0, 160,
+};
+
+/* get the tone from the fill in percent, using conversion table */
+static double convert(double fill)
+{
+ int i = 0;
+ double t1,t2,f1,f2,offset;
+
+ f2 = conversion[i++];
+ t2 = conversion[i++];
+
+ while (23) {
+ f1 = f2;
+ t1 = t2;
+ f2 = conversion[i++];
+ t2 = conversion[i++];
+
+ if (fill >= f2)
+ break;
+ }
+
+ /* interpolate between two entries */
+ offset = (fill - f1) / (f2 - f1);
+ return offset * (t2 - t1) + t1;
+}
+
+static void print_help(const char *arg0)
+{
+ printf("Usage: %s [options] <fill in percent>\n\n", arg0);
+ /* - - */
+ printf("36c3 Mate Bottle Simulator - a fun project. Don't take it seriously!\n\n");
+ printf("This program simulates the bottle blowing of a Club Mate bottle.\n");
+ printf("It will produce a tone that depends on the given fill of a bottle.\n");
+ printf("Dial 6283 on Eventphone's network and play the tone into the phone.\n");
+ printf(" -h --help\n");
+ printf(" This help\n");
+#ifdef HAVE_ALSA
+ printf(" -a --audio-device hw:<card>,<device>\n");
+ printf(" Sound card and device number (default = '%s')\n", dsp_audiodev);
+#endif
+ printf(" -s --samplerate <rate>\n");
+ printf(" Sample rate of sound device (default = '%d')\n", dsp_samplerate);
+ printf(" -w --write-tx-wave <file>\n");
+ printf(" Write audio to given wave file also.\n");
+}
+
+static void add_options(void)
+{
+ option_add('h', "help", 0);
+ option_add('a', "audio-device", 1);
+ option_add('s', "samplerate", 1);
+ option_add('w', "write-tx-wave", 1);
+}
+
+static int handle_options(int short_option, int __attribute__((unused)) argi, char **argv)
+{
+ switch (short_option) {
+ case 'h':
+ print_help(argv[0]);
+ return 0;
+ case 'a':
+ dsp_audiodev = strdup(argv[argi]);
+ break;
+ case 's':
+ dsp_samplerate = atoi(argv[argi]);
+ break;
+ case 'w':
+ write_tx_wave = strdup(argv[argi]);
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ return 1;
+}
+
+static double phase = 0;
+
+/* encode audio */
+static void encode_audio(sample_t *samples, uint8_t *power, int length)
+{
+ int i;
+
+ memset(power, 1, length);
+
+ for (i = 0; i < length; i++) {
+ samples[i] = cos(2.0 * M_PI * tone * phase);
+ phase += 1.0 / dsp_samplerate;
+ }
+}
+
+/* loop that gets audio from encoder and fowards it to sound card.
+ * alternatively a sound file is written.
+ */
+static void process_signal(int buffer_size)
+{
+ sample_t buff[buffer_size], *samples[1] = { buff };
+ uint8_t pbuff[buffer_size], *power[1] = { pbuff };
+ int count;
+ int __attribute__((unused)) rc;
+
+ while (!feof(stdin)) {
+#ifdef HAVE_ALSA
+ count = sound_get_tosend(audio, buffer_size);
+#else
+ count = dsp_samplerate / 1000;
+#endif
+ if (count < 0) {
+ LOGP(DDSP, LOGL_ERROR, "Failed to get number of samples in buffer (rc = %d)!\n", count);
+ break;
+ }
+
+ /* encode dial_string of tones and lengths */
+ encode_audio(samples[0], power[0], count);
+
+ /* write wave, if open */
+ if (wave_tx_rec.fp)
+ wave_write(&wave_tx_rec, samples, count);
+
+#ifdef HAVE_ALSA
+ /* write audio */
+ rc = sound_write(audio, samples, power, count, NULL, NULL, 1);
+ if (rc < 0) {
+ LOGP(DDSP, LOGL_ERROR, "Failed to write TX data to audio device (rc = %d)\n", rc);
+ break;
+ }
+#endif
+
+ /* sleep a while */
+ usleep(1000);
+ }
+}
+
+int main(int argc, char *argv[])
+{
+ int rc, argi;
+ int buffer_size = dsp_samplerate * dsp_buffer / 1000;
+
+ logging_init();
+
+ /* handle options / config file */
+ add_options();
+ argi = options_command_line(argc, argv, handle_options);
+ if (argi <= 0)
+ return argi;
+
+ if (argi >= argc) {
+ printf("No fill of bottle given!\n\n");
+ print_help(argv[0]);
+ goto exit;
+ }
+
+ fill = atof(argv[argi]) / 100.0;
+ if (fill < 0.0)
+ fill = 0.0;
+ if (fill > 1.0)
+ fill = 1.0;
+ tone = convert(fill * 100.0);
+
+
+#ifdef HAVE_ALSA
+ /* init sound */
+ audio = sound_open(SOUND_DIR_PLAY, dsp_audiodev, NULL, NULL, NULL, 1, 0.0, dsp_samplerate, buffer_size, 1.0, 1.0, 4000.0, 2.0);
+ if (!audio) {
+ LOGP(DDSP, LOGL_ERROR, "No sound device!\n");
+ goto exit;
+ }
+#endif
+
+ /* open wave */
+ if (write_tx_wave) {
+ rc = wave_create_record(&wave_tx_rec, write_tx_wave, dsp_samplerate, 1, 1.0);
+ if (rc < 0) {
+ LOGP(DDSP, LOGL_ERROR, "Failed to create WAVE recoding instance!\n");
+ goto exit;
+ }
+ }
+#ifndef HAVE_ALSA
+ else {
+ LOGP(DDSP, LOGL_ERROR, "No sound support compiled in, so you need to write to a wave file. See help!\n");
+ goto exit;
+ }
+#endif
+
+#ifdef HAVE_ALSA
+ /* start sound */
+ sound_start(audio);
+#endif
+
+ printf("Sending Tone of %.1f Hz to simulate a Mate Bottle with %.0f%% fill.\n", tone, fill * 100.0);
+ printf("Press CTRL+'c' to stop.\n");
+
+ process_signal(buffer_size);
+
+exit:
+ /* close wave */
+ wave_destroy_record(&wave_tx_rec);
+
+#ifdef HAVE_ALSA
+ /* exit sound */
+ if (audio)
+ sound_close(audio);
+#endif
+
+ return 0;
+}
+
diff --git a/src/mpt1327/Makefile.am b/src/mpt1327/Makefile.am
index 49ec2c6..1d5ce7a 100644
--- a/src/mpt1327/Makefile.am
+++ b/src/mpt1327/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
bin_PROGRAMS = \
mpt1327
@@ -12,14 +12,11 @@ mpt1327_LDADD = \
$(COMMON_LA) \
../anetz/libgermanton.a \
$(top_builddir)/src/liboptions/liboptions.a \
- $(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libmobile/libmobile.a \
- $(top_builddir)/src/libosmocc/libosmocc.a \
$(top_builddir)/src/libdisplay/libdisplay.a \
$(top_builddir)/src/libjitter/libjitter.a \
$(top_builddir)/src/libsquelch/libsquelch.a \
$(top_builddir)/src/libdtmf/libdtmf.a \
- $(top_builddir)/src/libtimer/libtimer.a \
$(top_builddir)/src/libsamplerate/libsamplerate.a \
$(top_builddir)/src/libemphasis/libemphasis.a \
$(top_builddir)/src/libfsk/libfsk.a \
@@ -27,8 +24,10 @@ mpt1327_LDADD = \
$(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \
- $(top_builddir)/src/libg711/libg711.a \
$(top_builddir)/src/libaaimage/libaaimage.a \
+ $(top_builddir)/src/liblogging/liblogging.a \
+ $(LIBOSMOCORE_LIBS) \
+ $(LIBOSMOCC_LIBS) \
-lm
if HAVE_ALSA
diff --git a/src/mpt1327/dsp.c b/src/mpt1327/dsp.c
index 066ce55..a318d2a 100644
--- a/src/mpt1327/dsp.c
+++ b/src/mpt1327/dsp.c
@@ -27,8 +27,8 @@
#include <math.h>
#include "../libsample/sample.h"
#include "../libmobile/call.h"
-#include "../libdebug/debug.h"
-#include "../libtimer/timer.h"
+#include "../liblogging/logging.h"
+#include <osmocom/core/timer.h>
#include "mpt1327.h"
#include "dsp.h"
#include "message.h"
@@ -61,7 +61,7 @@ int dsp_init_sender(mpt1327_t *mpt1327, double squelch_db)
{
int rc;
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Init DSP for Transceiver.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Init DSP for Transceiver.\n");
/* init squelch */
squelch_init(&mpt1327->squelch, mpt1327->sender.kanal, squelch_db, MUTE_TIME, MUTE_TIME);
@@ -69,15 +69,15 @@ int dsp_init_sender(mpt1327_t *mpt1327, double squelch_db)
/* set modulation parameters */
sender_set_fm(&mpt1327->sender, MAX_DEVIATION, MAX_MODULATION, SPEECH_DEVIATION, MAX_DISPLAY);
- PDEBUG(DDSP, DEBUG_DEBUG, "Using FSK level of %.3f (%.3f KHz deviation)\n", TX_PEAK_FSK, SPEECH_DEVIATION * TX_PEAK_FSK / 1e3);
+ LOGP(DDSP, LOGL_DEBUG, "Using FSK level of %.3f (%.3f KHz deviation)\n", TX_PEAK_FSK, SPEECH_DEVIATION * TX_PEAK_FSK / 1e3);
/* init fsk */
if (fsk_mod_init(&mpt1327->fsk_mod, mpt1327, fsk_send_bit, mpt1327->sender.samplerate, BIT_RATE, F0, F1, TX_PEAK_FSK, 1, 0) < 0) {
- PDEBUG_CHAN(DDSP, DEBUG_ERROR, "FSK init failed!\n");
+ LOGP_CHAN(DDSP, LOGL_ERROR, "FSK init failed!\n");
return -EINVAL;
}
if (fsk_demod_init(&mpt1327->fsk_demod, mpt1327, fsk_receive_bit, mpt1327->sender.samplerate, BIT_RATE, F0, F1, BIT_ADJUST) < 0) {
- PDEBUG_CHAN(DDSP, DEBUG_ERROR, "FSK init failed!\n");
+ LOGP_CHAN(DDSP, LOGL_ERROR, "FSK init failed!\n");
return -EINVAL;
}
@@ -85,9 +85,9 @@ int dsp_init_sender(mpt1327_t *mpt1327, double squelch_db)
mpt1327->dmp_frame_quality = display_measurements_add(&mpt1327->sender.dispmeas, "Frame Quality", "%.1f %% (last)", DISPLAY_MEAS_LAST, DISPLAY_MEAS_LEFT, 0.0, 100.0, 100.0);
/* repeater */
- rc = jitter_create(&mpt1327->repeater_dejitter, "repeater", mpt1327->sender.samplerate, sizeof(sample_t), 0.050, 0.500, JITTER_FLAG_NONE);
+ rc = jitter_create(&mpt1327->repeater_dejitter, "repeater", mpt1327->sender.samplerate, 0.050, 0.500, JITTER_FLAG_NONE);
if (rc < 0) {
- PDEBUG(DDSP, DEBUG_ERROR, "Failed to create and init repeater buffer!\n");
+ LOGP(DDSP, LOGL_ERROR, "Failed to create and init repeater buffer!\n");
goto error;
}
return 0;
@@ -100,7 +100,7 @@ error:
/* Cleanup transceiver instance. */
void dsp_cleanup_sender(mpt1327_t *mpt1327)
{
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Cleanup DSP for Transceiver.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Cleanup DSP for Transceiver.\n");
fsk_mod_cleanup(&mpt1327->fsk_mod);
fsk_demod_cleanup(&mpt1327->fsk_demod);
@@ -163,7 +163,7 @@ static void fsk_receive_bit(void *inst, int bit, double quality, double level)
/* check parity */
if (mpt1327_checkbits(mpt1327->rx_bits, NULL) != (mpt1327->rx_bits & 0xffff)) {
- PDEBUG(DDSP, DEBUG_NOTICE, "Received corrupt codeword or noise.\n");
+ LOGP(DDSP, LOGL_NOTICE, "Received corrupt codeword or noise.\n");
mpt1327->rx_in_sync = 0;
mpt1327->rx_mute = 0;
return;
@@ -234,9 +234,14 @@ void sender_receive(sender_t *sender, sample_t *samples, int length, double __at
if (mpt1327->dsp_mode == DSP_MODE_TRAFFIC) {
/* if repeater mode, store sample in jitter buffer */
- if (mpt1327->repeater)
- jitter_save(&mpt1327->repeater_dejitter, samples, length, 0, 0, 0, 0);
-
+ if (mpt1327->repeater) {
+ jitter_frame_t *jf;
+ jf = jitter_frame_alloc(NULL, NULL, (uint8_t *)samples, length * sizeof(*samples), 0, mpt1327->repeater_sequence, mpt1327->repeater_timestamp, 123);
+ if (jf)
+ jitter_save(&mpt1327->repeater_dejitter, jf);
+ mpt1327->repeater_sequence += 1;
+ mpt1327->repeater_timestamp += length;
+ }
if (mpt1327->unit && mpt1327->unit->callref) {
int count;
@@ -291,13 +296,17 @@ void sender_send(sender_t *sender, sample_t *samples, uint8_t *power, int length
if (mpt1327->dsp_mode == DSP_MODE_TRAFFIC) {
input_num = samplerate_upsample_input_num(&sender->srstate, length);
- jitter_load(&sender->dejitter, samples, input_num);
+ {
+ int16_t spl[input_num];
+ jitter_load_samples(&sender->dejitter, (uint8_t *)spl, input_num, sizeof(*spl), jitter_conceal_s16, NULL);
+ int16_to_samples_speech(samples, spl, input_num);
+ }
samplerate_upsample(&sender->srstate, samples, input_num, samples, length);
/* if repeater mode, sum samples from jitter buffer to samples */
if (mpt1327->repeater) {
sample_t uplink[length];
int i;
- jitter_load(&mpt1327->repeater_dejitter, uplink, length);
+ jitter_load_samples(&mpt1327->repeater_dejitter, (uint8_t *)uplink, length, sizeof(*uplink), NULL, NULL);
for (i = 0; i < length; i++)
samples[i] += uplink[i];
}
@@ -309,7 +318,7 @@ void sender_send(sender_t *sender, sample_t *samples, uint8_t *power, int length
fsk_mod_send(&mpt1327->fsk_mod, samples, length, 0);
}
-const char *mpt1327_dsp_mode_name(enum dsp_mode mode)
+static const char *mpt1327_dsp_mode_name(enum dsp_mode mode)
{
static char invalid[16];
@@ -334,12 +343,14 @@ void mpt1327_set_dsp_mode(mpt1327_t *mpt1327, enum dsp_mode mode, int repeater)
mpt1327->sync_word = 0xc4d7;
if (mode == DSP_MODE_TRAFFIC)
mpt1327->sync_word = 0x3b28;
+ if (mode == DSP_MODE_TRAFFIC && mpt1327->dsp_mode != mode)
+ jitter_reset(&mpt1327->sender.dejitter);
if (repeater)
- jitter_reset(&mpt1327->repeater_dejitter);
+ jitter_reset(&mpt1327->repeater_dejitter);
mpt1327->repeater = repeater;
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "DSP mode %s -> %s\n", mpt1327_dsp_mode_name(mpt1327->dsp_mode), mpt1327_dsp_mode_name(mode));
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "DSP mode %s -> %s\n", mpt1327_dsp_mode_name(mpt1327->dsp_mode), mpt1327_dsp_mode_name(mode));
mpt1327->dsp_mode = mode;
}
@@ -350,3 +361,24 @@ void mpt1327_reset_sync(mpt1327_t *mpt1327)
mpt1327->rx_mute = 0;
}
+/* Receive audio from call instance. */
+void call_down_audio(void *decoder, void *decoder_priv, int callref, uint16_t sequence, uint8_t marker, uint32_t timestamp, uint32_t ssrc, uint8_t *payload, int payload_len)
+{
+ mpt1327_unit_t *unit;
+
+ unit = find_unit_callref(callref);
+ if (!unit)
+ return;
+ if (!unit->tc)
+ return;
+
+ if (unit->tc->state == STATE_BUSY && unit->tc->dsp_mode == DSP_MODE_TRAFFIC) {
+ jitter_frame_t *jf;
+ jf = jitter_frame_alloc(decoder, decoder_priv, payload, payload_len, marker, sequence, timestamp, ssrc);
+ if (jf)
+ jitter_save(&unit->tc->sender.dejitter, jf);
+ }
+}
+
+void call_down_clock(void) {}
+
diff --git a/src/mpt1327/main.c b/src/mpt1327/main.c
index 13393c1..b8b017b 100644
--- a/src/mpt1327/main.c
+++ b/src/mpt1327/main.c
@@ -29,8 +29,8 @@
#include <sys/stat.h>
#include "../libsample/sample.h"
#include "../libmobile/main_mobile.h"
-#include "../libdebug/debug.h"
-#include "../libtimer/timer.h"
+#include "../liblogging/logging.h"
+#include <osmocom/core/timer.h>
#include "../anetz/freiton.h"
#include "../anetz/besetztton.h"
#include "../liboptions/options.h"
@@ -390,6 +390,7 @@ fail:
mpt1327_destroy(sender_head);
/* exits */
+ main_mobile_exit();
fm_exit();
flush_units();
diff --git a/src/mpt1327/message.c b/src/mpt1327/message.c
index c850594..729cee1 100644
--- a/src/mpt1327/message.c
+++ b/src/mpt1327/message.c
@@ -23,7 +23,7 @@
#include <string.h>
#include <errno.h>
#include <inttypes.h>
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "message.h"
static struct mpt1327_parameter_names {
@@ -411,7 +411,7 @@ static void debug_codeword(const char *prefix, int i, uint64_t bits, int enc)
int column;
int b;
- if (debuglevel > DEBUG_INFO)
+ if (loglevel > LOGL_INFO)
return;
switch (mpt1327_definitions[i].type) {
@@ -431,13 +431,13 @@ static void debug_codeword(const char *prefix, int i, uint64_t bits, int enc)
case MPT_BCAST3:
case MPT_BCAST4:
case MPT_BCAST5:
- if (enc && debuglevel > DEBUG_DEBUG)
+ if (enc && loglevel > LOGL_DEBUG)
return;
default:
;
}
- PDEBUG(DFRAME, DEBUG_INFO, "%s Codeword %s: %s\n", prefix, mpt1327_definitions[i].short_name, mpt1327_definitions[i].long_name);
+ LOGP(DFRAME, LOGL_INFO, "%s Codeword %s: %s\n", prefix, mpt1327_definitions[i].short_name, mpt1327_definitions[i].long_name);
column = 0;
for (b = 0; b < 64; b++) {
/* if we have first parameter or we swith to next parameter */
@@ -461,7 +461,7 @@ static void debug_codeword(const char *prefix, int i, uint64_t bits, int enc)
#endif
}
text[column] = '\0';
- PDEBUG(DFRAME, DEBUG_INFO, "%s\n", text);
+ LOGP(DFRAME, LOGL_INFO, "%s\n", text);
}
uint64_t mpt1327_encode_codeword(mpt1327_codeword_t *codeword)
@@ -541,11 +541,11 @@ int mpt1327_decode_codeword(mpt1327_codeword_t *codeword, int specific, enum mpt
}
if (i == _NUM_MPT_DEFINITIONS) {
char debug[256];
- PDEBUG(DFRAME, DEBUG_NOTICE, "Received unknown codeword or loopback from transmitter side.\n");
+ LOGP(DFRAME, LOGL_NOTICE, "Received unknown codeword or loopback from transmitter side.\n");
for (b = 0; b < 64; b++)
debug[b] = ((bits >> (63 - b)) & 1) + '0';
debug[b] = '\0';
- PDEBUG(DFRAME, DEBUG_DEBUG, "%s\n", debug);
+ LOGP(DFRAME, LOGL_DEBUG, "%s\n", debug);
return -EINVAL;
}
codeword->type = mpt1327_definitions[i].type;
diff --git a/src/mpt1327/mpt1327.c b/src/mpt1327/mpt1327.c
index 5fdc2f4..61e2135 100755
--- a/src/mpt1327/mpt1327.c
+++ b/src/mpt1327/mpt1327.c
@@ -71,18 +71,19 @@
#include <math.h>
#include <inttypes.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
-#include "../libtimer/timer.h"
+#include "../liblogging/logging.h"
+#include <osmocom/core/timer.h>
#include "../libmobile/call.h"
#include "../libmobile/cause.h"
-#include "../libosmocc/message.h"
+#include "../libmobile/console.h"
+#include <osmocom/cc/message.h>
#include "mpt1327.h"
#include "dsp.h"
#include "message.h"
/* Timers and counters */
-#define RESPONSE_TIMEOUT 1.0
+#define RESPONSE_TIMEOUT 1,0
#define REPEAT_GTC 1
#define REPEAT_AHY 1
#define REPEAT_AHYC 1
@@ -152,7 +153,7 @@ static mpt1327_unit_t *unit_list = NULL;
#define UNIT_CALL_CLEAR (1 << 12) /* established call */
#define UNIT_CANCEL_ACK (1 << 13) /* need to ack cancelation */
-const char *unit_state_name(uint64_t state)
+static const char *unit_state_name(uint64_t state)
{
static char invalid[32];
@@ -193,15 +194,15 @@ const char *unit_state_name(uint64_t state)
return invalid;
}
-void unit_new_state(mpt1327_unit_t *unit, uint64_t new_state)
+static void unit_new_state(mpt1327_unit_t *unit, uint64_t new_state)
{
- PDEBUG(DMPT1327, DEBUG_DEBUG, "Radio Unit (Prefix:%d Ident:%d) state: %s -> %s\n", unit->prefix, unit->ident, unit_state_name(unit->state), unit_state_name(new_state));
+ LOGP(DMPT1327, LOGL_DEBUG, "Radio Unit (Prefix:%d Ident:%d) state: %s -> %s\n", unit->prefix, unit->ident, unit_state_name(unit->state), unit_state_name(new_state));
unit->state = new_state;
}
-static void unit_timeout(struct timer *timer);
+static void unit_timeout(void *data);
-mpt1327_unit_t *get_unit(uint8_t prefix, uint16_t ident)
+static mpt1327_unit_t *get_unit(uint8_t prefix, uint16_t ident)
{
mpt1327_unit_t **unitp;
@@ -212,9 +213,9 @@ mpt1327_unit_t *get_unit(uint8_t prefix, uint16_t ident)
}
if (!(*unitp)) {
- PDEBUG(DDB, DEBUG_INFO, "Radio Unit (Prefix:%d Ident:%d) added to database\n", prefix, ident);
+ LOGP(DDB, LOGL_INFO, "Radio Unit (Prefix:%d Ident:%d) added to database\n", prefix, ident);
*unitp = calloc(1, sizeof(mpt1327_unit_t));
- timer_init(&(*unitp)->timer, unit_timeout, (*unitp));
+ osmo_timer_setup(&(*unitp)->timer, unit_timeout, (*unitp));
(*unitp)->state = UNIT_IDLE;
(*unitp)->prefix = prefix;
(*unitp)->ident = ident;
@@ -223,7 +224,7 @@ mpt1327_unit_t *get_unit(uint8_t prefix, uint16_t ident)
return *unitp;
}
-mpt1327_unit_t *find_unit_state(uint32_t state, mpt1327_t *tc)
+static mpt1327_unit_t *find_unit_state(uint32_t state, mpt1327_t *tc)
{
mpt1327_unit_t *unit;
@@ -253,20 +254,20 @@ static void mpt1327_go_idle(mpt1327_t *mpt1327);
static void mpt1327_release(mpt1327_unit_t *unit);
/* Timeout handling */
-static void unit_timeout(struct timer *timer)
+static void unit_timeout(void *data)
{
- mpt1327_unit_t *unit = (mpt1327_unit_t *)timer->priv;
+ mpt1327_unit_t *unit = data;
// FIXME: do some retry
switch (unit->state) {
case UNIT_CALLING_SAMIS:
if (unit->repeat) {
--unit->repeat;
- PDEBUG(DMPT1327, DEBUG_INFO, "Resend AHYC, because unit timed out.\n");
+ LOGP(DMPT1327, LOGL_INFO, "Resend AHYC, because unit timed out.\n");
unit_new_state(unit, UNIT_CALLING_AHYC);
break;
}
- PDEBUG(DMPT1327, DEBUG_INFO, "Unit failed to respond to AHYC, releasing...\n");
+ LOGP(DMPT1327, LOGL_INFO, "Unit failed to respond to AHYC, releasing...\n");
mpt1327_release(unit);
if (unit->callref) {
call_up_release(unit->callref, CAUSE_NORMAL);
@@ -276,11 +277,11 @@ static void unit_timeout(struct timer *timer)
case UNIT_CALLED_ACK:
if (unit->repeat) {
--unit->repeat;
- PDEBUG(DMPT1327, DEBUG_INFO, "Resend AHY, because unit timed out.\n");
+ LOGP(DMPT1327, LOGL_INFO, "Resend AHY, because unit timed out.\n");
unit_new_state(unit, UNIT_CALLED_AHY);
break;
}
- PDEBUG(DMPT1327, DEBUG_INFO, "Unit failed to respond to AHY, releasing...\n");
+ LOGP(DMPT1327, LOGL_INFO, "Unit failed to respond to AHY, releasing...\n");
mpt1327_release(unit);
if (unit->callref) {
call_up_release(unit->callref, CAUSE_NORMAL);
@@ -288,7 +289,7 @@ static void unit_timeout(struct timer *timer)
}
break;
case UNIT_CALL:
- PDEBUG(DMPT1327, DEBUG_NOTICE, "Release call, because unit timed out.\n");
+ LOGP(DMPT1327, LOGL_NOTICE, "Release call, because unit timed out.\n");
mpt1327_release(unit);
if (unit->callref) {
call_up_release(unit->callref, CAUSE_NORMAL);
@@ -296,7 +297,7 @@ static void unit_timeout(struct timer *timer)
}
break;
default:
- PDEBUG(DMPT1327, DEBUG_ERROR, "Unknown timeout at state 0x%" PRIx64 ", please fix!\n", unit->state);
+ LOGP(DMPT1327, LOGL_ERROR, "Unknown timeout at state 0x%" PRIx64 ", please fix!\n", unit->state);
break;
}
@@ -308,24 +309,24 @@ void flush_units(void)
while (unit_list) {
next = unit_list->next;
- timer_exit(&unit_list->timer);
+ osmo_timer_del(&unit_list->timer);
free(unit_list);
unit_list = next;
}
}
-void dump_units(void)
+static void dump_units(void)
{
mpt1327_unit_t *unit = unit_list;
- PDEBUG(DDB, DEBUG_NOTICE, "Dump of Radio Unit list:\n");
+ LOGP(DDB, LOGL_NOTICE, "Dump of Radio Unit list:\n");
if (!unit) {
- PDEBUG(DDB, DEBUG_NOTICE, " - No Radio Unit seen yet!\n");
+ LOGP(DDB, LOGL_NOTICE, " - No Radio Unit seen yet!\n");
return;
}
while (unit) {
- PDEBUG(DDB, DEBUG_NOTICE, " - Radio Unit (Prefix:%d Ident:%d) seen on this TSC.\n", unit->prefix, unit->ident);
+ LOGP(DDB, LOGL_NOTICE, " - Radio Unit (Prefix:%d Ident:%d) seen on this TSC.\n", unit->prefix, unit->ident);
unit = unit->next;
}
}
@@ -420,7 +421,7 @@ double mpt1327_channel2freq(enum mpt1327_band band, int channel, int uplink)
}
/* convert channel to chan field */
-uint16_t mpt1327_channel2chan(enum mpt1327_band band, int channel)
+static uint16_t mpt1327_channel2chan(enum mpt1327_band band, int channel)
{
uint16_t chan = 0;
@@ -469,7 +470,7 @@ int mpt1327_channel_by_short_name(const char *short_name)
for (i = 0; mpt1327_channels[i].short_name; i++) {
if (!strcasecmp(mpt1327_channels[i].short_name, short_name)) {
- PDEBUG(DMPT1327, DEBUG_INFO, "Selecting channel '%s' = %s\n", mpt1327_channels[i].short_name, mpt1327_channels[i].long_name);
+ LOGP(DMPT1327, LOGL_INFO, "Selecting channel '%s' = %s\n", mpt1327_channels[i].short_name, mpt1327_channels[i].long_name);
return mpt1327_channels[i].chan_type;
}
}
@@ -543,7 +544,7 @@ static mpt1327_t *search_cc(void)
}
-const char *mpt1327_state_name(enum mpt1327_state state)
+static const char *mpt1327_state_name(enum mpt1327_state state)
{
static char invalid[16];
@@ -560,7 +561,7 @@ const char *mpt1327_state_name(enum mpt1327_state state)
return invalid;
}
-void mpt1327_display_status(void)
+static void mpt1327_display_status(void)
{
sender_t *sender;
mpt1327_t *mpt1327;
@@ -582,7 +583,7 @@ static void mpt1327_new_state(mpt1327_t *mpt1327, enum mpt1327_state new_state,
{
if (mpt1327->state == new_state)
return;
- PDEBUG_CHAN(DMPT1327, DEBUG_DEBUG, "State change: %s -> %s\n", mpt1327_state_name(mpt1327->state), mpt1327_state_name(new_state));
+ LOGP_CHAN(DMPT1327, LOGL_DEBUG, "State change: %s -> %s\n", mpt1327_state_name(mpt1327->state), mpt1327_state_name(new_state));
/* unlink unit, if linked */
if (mpt1327->unit) {
@@ -600,7 +601,7 @@ static void mpt1327_new_state(mpt1327_t *mpt1327, enum mpt1327_state new_state,
mpt1327_display_status();
}
-static void mpt1327_timeout(struct timer *timer);
+static void mpt1327_timeout(void *data);
/* Create transceiver instance and link to a list. */
int mpt1327_create(enum mpt1327_band band, const char *kanal, enum mpt1327_chan_type chan_type, const char *device, int use_sdr, int samplerate, double rx_gain, double tx_gain, const char *write_rx_wave, const char *write_tx_wave, const char *read_rx_wave, const char *read_tx_wave, int loopback, double squelch_db)
@@ -617,52 +618,52 @@ int mpt1327_create(enum mpt1327_band band, const char *kanal, enum mpt1327_chan_
mpt1327 = (mpt1327_t *)sender;
if ((mpt1327->chan_type == CHAN_TYPE_CC || mpt1327->chan_type == CHAN_TYPE_CC_TC)
&& (chan_type == CHAN_TYPE_CC || chan_type == CHAN_TYPE_CC_TC)) {
- PDEBUG(DCNETZ, DEBUG_NOTICE, "More than one control channel is not supported, please define other channels as traffic channels!\n");
+ LOGP(DCNETZ, LOGL_NOTICE, "More than one control channel is not supported, please define other channels as traffic channels!\n");
return -EINVAL;
}
}
mpt1327 = calloc(1, sizeof(mpt1327_t));
if (!mpt1327) {
- PDEBUG(DMPT1327, DEBUG_ERROR, "No memory!\n");
+ LOGP(DMPT1327, LOGL_ERROR, "No memory!\n");
return -EIO;
}
- PDEBUG(DMPT1327, DEBUG_DEBUG, "Creating 'MPT1327' instance for Channel %s on Band %s (sample rate %d).\n", kanal, mpt1327_band_def[band].name, samplerate);
+ LOGP(DMPT1327, LOGL_DEBUG, "Creating 'MPT1327' instance for Channel %s on Band %s (sample rate %d).\n", kanal, mpt1327_band_def[band].name, samplerate);
/* init general part of transceiver */
rc = sender_create(&mpt1327->sender, kanal, mpt1327_channel2freq(band, atoi(kanal), 0), mpt1327_channel2freq(band, atoi(kanal), 1), device, use_sdr, samplerate, rx_gain, tx_gain, 0, 0, write_rx_wave, write_tx_wave, read_rx_wave, read_tx_wave, loopback, PAGING_SIGNAL_NONE);
if (rc < 0) {
- PDEBUG(DMPT1327, DEBUG_ERROR, "Failed to init 'Sender' processing!\n");
+ LOGP(DMPT1327, LOGL_ERROR, "Failed to init 'Sender' processing!\n");
goto error;
}
/* init audio processing */
rc = dsp_init_sender(mpt1327, squelch_db);
if (rc < 0) {
- PDEBUG(DANETZ, DEBUG_ERROR, "Failed to init signal processing!\n");
+ LOGP(DANETZ, LOGL_ERROR, "Failed to init signal processing!\n");
goto error;
}
/* timers */
- timer_init(&mpt1327->timer, mpt1327_timeout, mpt1327);
+ osmo_timer_setup(&mpt1327->timer, mpt1327_timeout, mpt1327);
mpt1327->band = band;
mpt1327->chan_type = chan_type;
/* only accept these valued */
if (sysdef.framelength != 1 && sysdef.framelength != 3 && sysdef.framelength != 6) {
- PDEBUG(DMPT1327, DEBUG_ERROR, "Invalid frame length %d, please fix!\n", sysdef.framelength);
+ LOGP(DMPT1327, LOGL_ERROR, "Invalid frame length %d, please fix!\n", sysdef.framelength);
abort();
}
if (sysdef.wt != 5 && sysdef.wt != 10 && sysdef.wt != 15) {
- PDEBUG(DMPT1327, DEBUG_ERROR, "Invalid WT value %d, please fix!\n", sysdef.wt);
+ LOGP(DMPT1327, LOGL_ERROR, "Invalid WT value %d, please fix!\n", sysdef.wt);
abort();
}
/* go into idle state */
mpt1327_go_idle(mpt1327);
- PDEBUG(DMPT1327, DEBUG_NOTICE, "Created channel #%s of type '%s' = %s\n", kanal, chan_type_short_name(chan_type), chan_type_long_name(chan_type));
+ LOGP(DMPT1327, LOGL_NOTICE, "Created channel #%s of type '%s' = %s\n", kanal, chan_type_short_name(chan_type), chan_type_long_name(chan_type));
return 0;
@@ -691,21 +692,21 @@ void mpt1327_check_channels(void)
}
}
if (cc && !tc) {
- PDEBUG(DMPT1327, DEBUG_NOTICE, "\n");
- PDEBUG(DMPT1327, DEBUG_NOTICE, "*** Selected channel(s) can be used for control only.\n");
- PDEBUG(DMPT1327, DEBUG_NOTICE, "*** No call is possible.\n");
- PDEBUG(DMPT1327, DEBUG_NOTICE, "*** Use at least one 'TC'!\n");
+ LOGP(DMPT1327, LOGL_NOTICE, "\n");
+ LOGP(DMPT1327, LOGL_NOTICE, "*** Selected channel(s) can be used for control only.\n");
+ LOGP(DMPT1327, LOGL_NOTICE, "*** No call is possible.\n");
+ LOGP(DMPT1327, LOGL_NOTICE, "*** Use at least one 'TC'!\n");
note = 1;
}
if (tc && !cc) {
- PDEBUG(DMPT1327, DEBUG_NOTICE, "\n");
- PDEBUG(DMPT1327, DEBUG_NOTICE, "*** Selected channel(s) can be used for traffic only.\n");
- PDEBUG(DMPT1327, DEBUG_NOTICE, "*** No call to the mobile phone is possible.\n");
- PDEBUG(DMPT1327, DEBUG_NOTICE, "*** Use one 'CC'!\n");
+ LOGP(DMPT1327, LOGL_NOTICE, "\n");
+ LOGP(DMPT1327, LOGL_NOTICE, "*** Selected channel(s) can be used for traffic only.\n");
+ LOGP(DMPT1327, LOGL_NOTICE, "*** No call to the mobile phone is possible.\n");
+ LOGP(DMPT1327, LOGL_NOTICE, "*** Use one 'CC'!\n");
note = 1;
}
if (note)
- PDEBUG(DMPT1327, DEBUG_NOTICE, "\n");
+ LOGP(DMPT1327, LOGL_NOTICE, "\n");
}
/* Destroy transceiver instance and unlink from list. */
@@ -713,10 +714,10 @@ void mpt1327_destroy(sender_t *sender)
{
mpt1327_t *mpt1327 = (mpt1327_t *) sender;
- PDEBUG(DMPT1327, DEBUG_DEBUG, "Destroying 'MPT1327' instance for channel = %s.\n", sender->kanal);
+ LOGP(DMPT1327, LOGL_DEBUG, "Destroying 'MPT1327' instance for channel = %s.\n", sender->kanal);
dsp_cleanup_sender(mpt1327);
- timer_exit(&mpt1327->timer);
+ osmo_timer_del(&mpt1327->timer);
sender_destroy(&mpt1327->sender);
free(sender);
}
@@ -724,10 +725,10 @@ void mpt1327_destroy(sender_t *sender)
/* Abort connection towards mobile station changing to IDLE state */
static void mpt1327_go_idle(mpt1327_t *mpt1327)
{
- timer_stop(&mpt1327->timer);
+ osmo_timer_del(&mpt1327->timer);
mpt1327->pressel_on = 0;
- PDEBUG(DMPT1327, DEBUG_INFO, "Entering IDLE state on channel %s.\n", mpt1327->sender.kanal);
+ LOGP(DMPT1327, LOGL_INFO, "Entering IDLE state on channel %s.\n", mpt1327->sender.kanal);
mpt1327_new_state(mpt1327, STATE_IDLE, NULL);
memset(&mpt1327->tx_sched, 0, sizeof(mpt1327->tx_sched));
switch (mpt1327->chan_type) {
@@ -745,7 +746,7 @@ static void mpt1327_go_idle(mpt1327_t *mpt1327)
static void mpt1327_release(mpt1327_unit_t *unit)
{
- timer_stop(&unit->timer);
+ osmo_timer_del(&unit->timer);
if (unit->state == UNIT_CALL && unit->tc) {
/* release all units on traffic channel */
@@ -783,7 +784,7 @@ static int gtc_aloha_number(int length)
* a dummy slot is used to allow radio unit to allow multi slot response to a
* request from TSC.
*/
-int mpt1327_send_codeword_control(mpt1327_t *mpt1327, mpt1327_codeword_t *codeword)
+static int mpt1327_send_codeword_control(mpt1327_t *mpt1327, mpt1327_codeword_t *codeword)
{
mpt1327_unit_t *unit;
@@ -815,7 +816,7 @@ int mpt1327_send_codeword_control(mpt1327_t *mpt1327, mpt1327_codeword_t *codewo
codeword->params[MPT_PFIX] = 0x2a; /* just some alternating pattern (ignored) */
codeword->params[MPT_IDENT1] = IDENT_DUMMYI;
codeword->params[MPT_IDENT2] = IDENT_DUMMYI;
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, "Sending dummy AHY, to prevent random access while receiving SAMIS\n");
+ LOGP_CHAN(DMPT1327, LOGL_INFO, "Sending dummy AHY, to prevent random access while receiving SAMIS\n");
} else {
unit = find_unit_state(UNIT_REGISTER_ACK | UNIT_DIVERSION_REJ | UNIT_CALLING_REJ | UNIT_CALLING_AHYC | UNIT_CALLED_AHY | UNIT_GTC_P | UNIT_GTC_A | UNIT_GTC_B | UNIT_CANCEL_ACK | UNIT_CALLED_AHYX, NULL);
if (!unit) {
@@ -851,7 +852,7 @@ int mpt1327_send_codeword_control(mpt1327_t *mpt1327, mpt1327_codeword_t *codewo
codeword->params[MPT_IDENT2] = unit->ident;
codeword->params[MPT_QUAL] = 0;
unit_new_state(unit, UNIT_IDLE);
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, "Sending acknowledge to Radio Unit (Prefix:%d Ident:%d)\n", unit->prefix, unit->ident);
+ LOGP_CHAN(DMPT1327, LOGL_INFO, "Sending acknowledge to Radio Unit (Prefix:%d Ident:%d)\n", unit->prefix, unit->ident);
break;
case UNIT_DIVERSION_REJ: /* reject diversion */
codeword->type = MPT_ACKX;
@@ -859,7 +860,7 @@ int mpt1327_send_codeword_control(mpt1327_t *mpt1327, mpt1327_codeword_t *codewo
codeword->params[MPT_IDENT1] = unit->called_ident;
codeword->params[MPT_IDENT2] = unit->ident;
codeword->params[MPT_QUAL] = 0;
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, "Sending negative acknowledge to Radio Unit (Prefix:%d Ident:%d)\n", unit->prefix, unit->ident);
+ LOGP_CHAN(DMPT1327, LOGL_INFO, "Sending negative acknowledge to Radio Unit (Prefix:%d Ident:%d)\n", unit->prefix, unit->ident);
if (unit->repeat) {
--unit->repeat;
break;
@@ -874,7 +875,7 @@ int mpt1327_send_codeword_control(mpt1327_t *mpt1327, mpt1327_codeword_t *codewo
codeword->params[MPT_IDENT1] = unit->called_ident;
codeword->params[MPT_IDENT2] = unit->ident;
codeword->params[MPT_QUAL] = 1;
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, "Sending negative acknowledge to Radio Unit (Prefix:%d Ident:%d)\n", unit->prefix, unit->ident);
+ LOGP_CHAN(DMPT1327, LOGL_INFO, "Sending negative acknowledge to Radio Unit (Prefix:%d Ident:%d)\n", unit->prefix, unit->ident);
if (unit->repeat) {
--unit->repeat;
break;
@@ -907,15 +908,15 @@ int mpt1327_send_codeword_control(mpt1327_t *mpt1327, mpt1327_codeword_t *codewo
codeword->params[MPT_DESC] = 0x2;
break;
default:
- PDEBUG_CHAN(DMPT1327, DEBUG_ERROR, "Want to send AHYC, but called_type not set correctly, please fix!\n");
+ LOGP_CHAN(DMPT1327, LOGL_ERROR, "Want to send AHYC, but called_type not set correctly, please fix!\n");
abort();
}
unit_new_state(unit, UNIT_CALLING_SAMIS);
mpt1327->rx_sched.data_prefix = unit->prefix;
mpt1327->rx_sched.data_ident = unit->ident;
- PDEBUG_CHAN(DMPT1327, DEBUG_DEBUG, "Starting timer, waiting for response\n");
- timer_start(&unit->timer, RESPONSE_TIMEOUT);
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, "Sending AHYC, to request SAMIS from Radio Unit (Prefix:%d Ident:%d)\n", unit->prefix, unit->ident);
+ LOGP_CHAN(DMPT1327, LOGL_DEBUG, "Starting timer, waiting for response\n");
+ osmo_timer_schedule(&unit->timer, RESPONSE_TIMEOUT);
+ LOGP_CHAN(DMPT1327, LOGL_INFO, "Sending AHYC, to request SAMIS from Radio Unit (Prefix:%d Ident:%d)\n", unit->prefix, unit->ident);
break;
case UNIT_CALLED_AHY: /* call to unit and request ACK from unit */
codeword->type = MPT_AHY;
@@ -928,9 +929,9 @@ int mpt1327_send_codeword_control(mpt1327_t *mpt1327, mpt1327_codeword_t *codewo
codeword->params[MPT_E] = 0; /* no emergency call */
codeword->params[MPT_AD] = 0; /* no appended data */
unit_new_state(unit, UNIT_CALLED_ACK);
- PDEBUG_CHAN(DMPT1327, DEBUG_DEBUG, "Starting timer, waiting for response\n");
- timer_start(&unit->timer, RESPONSE_TIMEOUT);
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, "Sending AHY, to request ACK from Radio Unit (Prefix:%d Ident:%d)\n", unit->prefix, unit->ident);
+ LOGP_CHAN(DMPT1327, LOGL_DEBUG, "Starting timer, waiting for response\n");
+ osmo_timer_schedule(&unit->timer, RESPONSE_TIMEOUT);
+ LOGP_CHAN(DMPT1327, LOGL_INFO, "Sending AHY, to request ACK from Radio Unit (Prefix:%d Ident:%d)\n", unit->prefix, unit->ident);
break;
case UNIT_GTC_P: /* channel assignment to unit itself and called unit */
codeword->type = MPT_GTC;
@@ -938,7 +939,7 @@ int mpt1327_send_codeword_control(mpt1327_t *mpt1327, mpt1327_codeword_t *codewo
codeword->params[MPT_IDENT1] = unit->called_ident;
codeword->params[MPT_IDENT2] = unit->ident;
codeword->params[MPT_CHAN] = mpt1327_channel2chan(unit->tc->band, atoi(unit->tc->sender.kanal));
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, "Sending channel assignment to calling and called Radio Units (Prefix:%d Ident:%d and Ident:%d)\n", unit->prefix, unit->ident, unit->called_ident);
+ LOGP_CHAN(DMPT1327, LOGL_INFO, "Sending channel assignment to calling and called Radio Units (Prefix:%d Ident:%d and Ident:%d)\n", unit->prefix, unit->ident, unit->called_ident);
if (unit->repeat) {
--unit->repeat;
break;
@@ -946,7 +947,7 @@ int mpt1327_send_codeword_control(mpt1327_t *mpt1327, mpt1327_codeword_t *codewo
unit_new_state(unit, UNIT_CALL);
mpt1327_set_dsp_mode(unit->tc, DSP_MODE_TRAFFIC, 1);
if (sysdef.timeout)
- timer_start(&unit->timer, sysdef.timeout);
+ osmo_timer_schedule(&unit->timer, sysdef.timeout,0);
break;
case UNIT_GTC_B: /* channel assignment to called unit */
/* NOTE GTC to called unit must be sent before GTC to calling unit (1.3.5.3) */
@@ -955,7 +956,7 @@ int mpt1327_send_codeword_control(mpt1327_t *mpt1327, mpt1327_codeword_t *codewo
codeword->params[MPT_IDENT1] = unit->called_ident;
codeword->params[MPT_IDENT2] = IDENT_DUMMYI;
codeword->params[MPT_CHAN] = mpt1327_channel2chan(unit->tc->band, atoi(unit->tc->sender.kanal));
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, "Sending channel assignment to called Radio Unit (Prefix:%d Ident:%d)\n", unit->prefix, unit->ident);
+ LOGP_CHAN(DMPT1327, LOGL_INFO, "Sending channel assignment to called Radio Unit (Prefix:%d Ident:%d)\n", unit->prefix, unit->ident);
if (unit->repeat) {
--unit->repeat;
break;
@@ -969,7 +970,7 @@ int mpt1327_send_codeword_control(mpt1327_t *mpt1327, mpt1327_codeword_t *codewo
codeword->params[MPT_IDENT1] = IDENT_DUMMYI;
codeword->params[MPT_IDENT2] = unit->ident;
codeword->params[MPT_CHAN] = mpt1327_channel2chan(unit->tc->band, atoi(unit->tc->sender.kanal));
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, "Sending channel assignment to calling Radio Unit (Prefix:%d Ident:%d)\n", unit->prefix, unit->ident);
+ LOGP_CHAN(DMPT1327, LOGL_INFO, "Sending channel assignment to calling Radio Unit (Prefix:%d Ident:%d)\n", unit->prefix, unit->ident);
if (unit->repeat) {
--unit->repeat;
break;
@@ -977,7 +978,7 @@ int mpt1327_send_codeword_control(mpt1327_t *mpt1327, mpt1327_codeword_t *codewo
unit_new_state(unit, UNIT_CALL);
mpt1327_set_dsp_mode(unit->tc, DSP_MODE_TRAFFIC, 1);
if (sysdef.timeout)
- timer_start(&unit->timer, sysdef.timeout);
+ osmo_timer_schedule(&unit->timer, sysdef.timeout,0);
break;
case UNIT_CANCEL_ACK:
codeword->type = MPT_ACK;
@@ -986,14 +987,14 @@ int mpt1327_send_codeword_control(mpt1327_t *mpt1327, mpt1327_codeword_t *codewo
codeword->params[MPT_IDENT2] = unit->ident;
codeword->params[MPT_QUAL] = 1;
unit_new_state(unit, UNIT_IDLE);
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, "Sending acknowledge to Radio Unit (Prefix:%d Ident:%d)\n", unit->prefix, unit->ident);
+ LOGP_CHAN(DMPT1327, LOGL_INFO, "Sending acknowledge to Radio Unit (Prefix:%d Ident:%d)\n", unit->prefix, unit->ident);
break;
case UNIT_CALLED_AHYX: /* cancel call towards unit */
codeword->type = MPT_AHYX;
codeword->params[MPT_PFIX] = unit->prefix;
codeword->params[MPT_IDENT1] = unit->ident;
codeword->params[MPT_IDENT2] = IDENT_PABXI;
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, "Sending AHYX, to cancel call to Radio Unit (Prefix:%d Ident:%d)\n", unit->prefix, unit->ident);
+ LOGP_CHAN(DMPT1327, LOGL_INFO, "Sending AHYX, to cancel call to Radio Unit (Prefix:%d Ident:%d)\n", unit->prefix, unit->ident);
if (unit->repeat) {
--unit->repeat;
break;
@@ -1028,7 +1029,7 @@ int mpt1327_send_codeword_control(mpt1327_t *mpt1327, mpt1327_codeword_t *codewo
* a SYNC is sent the next request will send the an ADDR codeword. this will
* repeat until the repeat counter reaches 0.
*/
-int mpt1327_send_codeword_traffic(mpt1327_t *mpt1327, mpt1327_codeword_t __attribute__((unused)) *codeword)
+static int mpt1327_send_codeword_traffic(mpt1327_t *mpt1327, mpt1327_codeword_t __attribute__((unused)) *codeword)
{
mpt1327_unit_t *unit;
mpt1327_t *cc;
@@ -1047,7 +1048,7 @@ int mpt1327_send_codeword_traffic(mpt1327_t *mpt1327, mpt1327_codeword_t __attri
switch (unit->state) {
case UNIT_CALL_CLEAR: /* release channel */
if (!unit->repeat) {
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, "Done sending clear down on traffic channel, releasing\n");
+ LOGP_CHAN(DMPT1327, LOGL_INFO, "Done sending clear down on traffic channel, releasing\n");
unit_new_state(unit, UNIT_IDLE);
mpt1327_go_idle(mpt1327);
return -1;
@@ -1072,7 +1073,7 @@ int mpt1327_send_codeword_traffic(mpt1327_t *mpt1327, mpt1327_codeword_t __attri
cc = search_cc();
if (cc)
codeword->params[MPT_CONT] = mpt1327_channel2chan(cc->band, atoi(cc->sender.kanal));
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, "Sending clear down on traffic channel\n");
+ LOGP_CHAN(DMPT1327, LOGL_INFO, "Sending clear down on traffic channel\n");
}
mpt1327->tx_sched.state = SCHED_STATE_TC_ADDR;
break;
@@ -1115,7 +1116,7 @@ static void out_setup(mpt1327_unit_t *unit, uint8_t network_type, int network_id
char caller_id[32], id[16];
/* setup call */
- PDEBUG(DMPT1327, DEBUG_INFO, "Setup call to network.\n");
+ LOGP(DMPT1327, LOGL_INFO, "Setup call to network.\n");
sprintf(caller_id, "%03d%04d", unit->prefix, unit->ident);
if (network_id)
sprintf(id, "%d", network_id);
@@ -1126,25 +1127,31 @@ static void out_setup(mpt1327_unit_t *unit, uint8_t network_type, int network_id
static void _cancel_pending_call(mpt1327_t *mpt1327, mpt1327_unit_t *unit)
{
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, "We are already in a call, the phone might have restarted, so we free old channel first.\n");
+ LOGP_CHAN(DMPT1327, LOGL_INFO, "We are already in a call, the phone might have restarted, so we free old channel first.\n");
mpt1327_go_idle(unit->tc);
- timer_stop(&unit->timer);
+ osmo_timer_del(&unit->timer);
if (unit->callref) {
call_up_release(unit->callref, CAUSE_NORMAL);
unit->callref = 0;
}
}
-void mpt1327_receive_codeword_control(mpt1327_t *mpt1327, mpt1327_codeword_t *codeword)
+static void mpt1327_receive_codeword_control(mpt1327_t *mpt1327, mpt1327_codeword_t *codeword)
{
mpt1327_unit_t *unit;
mpt1327_t *tc;
+ char station_id[8];
switch (codeword->type) {
case MPT_RQR: /* register */
mpt1327_reset_sync(mpt1327); /* message complete */
unit = get_unit(codeword->params[MPT_PFIX], codeword->params[MPT_IDENT1]);
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, "Radio Unit (Prefix:%d Ident:%d) registers\n", unit->prefix, unit->ident);
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-truncation"
+ snprintf(station_id, sizeof(station_id), "%03d%04d", unit->prefix, unit->ident);
+#pragma GCC diagnostic pop
+ console_inscription(station_id);
+ LOGP_CHAN(DMPT1327, LOGL_INFO, "Radio Unit (Prefix:%d Ident:%d) registers\n", unit->prefix, unit->ident);
if (unit->tc)
_cancel_pending_call(mpt1327, unit);
unit_new_state(unit, UNIT_REGISTER_ACK);
@@ -1153,10 +1160,10 @@ void mpt1327_receive_codeword_control(mpt1327_t *mpt1327, mpt1327_codeword_t *co
mpt1327_reset_sync(mpt1327); /* message complete */
unit = get_unit(codeword->params[MPT_PFIX], codeword->params[MPT_IDENT2]);
unit->called_ident = codeword->params[MPT_IDENT1];
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, "Radio Unit (Prefix:%d Ident:%d) requests diversion\n", unit->prefix, unit->ident);
+ LOGP_CHAN(DMPT1327, LOGL_INFO, "Radio Unit (Prefix:%d Ident:%d) requests diversion\n", unit->prefix, unit->ident);
if (unit->tc)
_cancel_pending_call(mpt1327, unit);
- PDEBUG_CHAN(DMPT1327, DEBUG_NOTICE, "Diversion not supported by TSC, rejecting...\n");
+ LOGP_CHAN(DMPT1327, LOGL_NOTICE, "Diversion not supported by TSC, rejecting...\n");
unit_new_state(unit, UNIT_DIVERSION_REJ);
break;
case MPT_RQS: /* simple call */
@@ -1164,13 +1171,13 @@ void mpt1327_receive_codeword_control(mpt1327_t *mpt1327, mpt1327_codeword_t *co
mpt1327_reset_sync(mpt1327); /* message complete */
unit = get_unit(codeword->params[MPT_PFIX], codeword->params[MPT_IDENT2]);
unit->called_ident = codeword->params[MPT_IDENT1];
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, "Radio Unit (Prefix:%d Ident:%d) calls Ident:%d%s\n", unit->prefix, unit->ident, unit->called_ident, (codeword->type == MPT_RQE) ? " (emergency)" : "");
+ LOGP_CHAN(DMPT1327, LOGL_INFO, "Radio Unit (Prefix:%d Ident:%d) calls Ident:%d%s\n", unit->prefix, unit->ident, unit->called_ident, (codeword->type == MPT_RQE) ? " (emergency)" : "");
if (unit->tc)
_cancel_pending_call(mpt1327, unit);
tc = search_free_tc();
if (!tc) {
unit_new_state(unit, UNIT_CALLING_REJ);
- PDEBUG_CHAN(DMPT1327, DEBUG_NOTICE, "No free Traffic Channel, call is rejected.\n");
+ LOGP_CHAN(DMPT1327, LOGL_NOTICE, "No free Traffic Channel, call is rejected.\n");
break;
}
if (codeword->params[MPT_EXT]) {
@@ -1178,79 +1185,79 @@ void mpt1327_receive_codeword_control(mpt1327_t *mpt1327, mpt1327_codeword_t *co
unit->called_type = CALLED_TYPE_PBX_SHORT;
sprintf(unit->called_number, "%d", unit->called_ident);
exchange = ((codeword->params[MPT_FLAG1] << 1) | codeword->params[MPT_FLAG2]) + 1;
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, " -> Call to PBX exchange %d, Number %s\n", exchange, unit->called_number);
+ LOGP_CHAN(DMPT1327, LOGL_INFO, " -> Call to PBX exchange %d, Number %s\n", exchange, unit->called_number);
unit_new_state(unit, UNIT_GTC_A);
unit->repeat = REPEAT_GTC;
out_setup(unit, OSMO_CC_NETWORK_MPT1327_PBX, exchange);
} else if (unit->called_ident >= IDENT_PSTNSI1 && unit->called_ident < IDENT_PSTNSI1 + 15) {
unit->called_type = CALLED_TYPE_PSTN_PRE;
sprintf(unit->called_number, "%d", unit->called_ident - IDENT_PSTNSI1 + 1);
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, " -> Call to PSTN with pre-arranged Number %s\n", unit->called_number);
+ LOGP_CHAN(DMPT1327, LOGL_INFO, " -> Call to PSTN with pre-arranged Number %s\n", unit->called_number);
unit_new_state(unit, UNIT_GTC_A);
unit->repeat = REPEAT_GTC;
out_setup(unit, OSMO_CC_NETWORK_MPT1327_PSTN, 0);
} else switch (unit->called_ident) {
case IDENT_IPFIXI:
unit->called_type = CALLED_TYPE_INTERPFX;
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, " -> Call to Unit/Group %d with different Prefix\n", unit->called_ident);
+ LOGP_CHAN(DMPT1327, LOGL_INFO, " -> Call to Unit/Group %d with different Prefix\n", unit->called_ident);
unit_new_state(unit, UNIT_CALLING_AHYC);
unit->repeat = REPEAT_AHYC;
break;
case IDENT_ALLI:
unit->called_type = CALLED_TYPE_SYSTEM;
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, " -> System wide Call\n");
+ LOGP_CHAN(DMPT1327, LOGL_INFO, " -> System wide Call\n");
unit_new_state(unit, UNIT_GTC_P);
unit->repeat = REPEAT_GTC;
break;
case IDENT_PSTNGI:
if (codeword->params[MPT_FLAG1]) {
unit->called_type = CALLED_TYPE_PSTN_LONG2;
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, " -> Call to PSTN with long Number (10..31 Digits)\n");
+ LOGP_CHAN(DMPT1327, LOGL_INFO, " -> Call to PSTN with long Number (10..31 Digits)\n");
} else {
unit->called_type = CALLED_TYPE_PSTN_LONG1;
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, " -> Call to PSTN with long Number (1..9 Digits)\n");
+ LOGP_CHAN(DMPT1327, LOGL_INFO, " -> Call to PSTN with long Number (1..9 Digits)\n");
}
unit_new_state(unit, UNIT_CALLING_AHYC);
unit->repeat = REPEAT_AHYC;
break;
case IDENT_PABXI:
unit->called_type = CALLED_TYPE_PBX_LONG;
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, " -> Call to PBX (long number)\n");
+ LOGP_CHAN(DMPT1327, LOGL_INFO, " -> Call to PBX (long number)\n");
unit_new_state(unit, UNIT_CALLING_AHYC);
unit->repeat = REPEAT_AHYC;
break;
default:
unit->called_type = CALLED_TYPE_UNIT;
unit->called_prefix = unit->prefix;
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, " -> Call to Unit/Group %d (same Prefix)\n", unit->called_ident);
+ LOGP_CHAN(DMPT1327, LOGL_INFO, " -> Call to Unit/Group %d (same Prefix)\n", unit->called_ident);
unit_new_state(unit, UNIT_GTC_P);
unit->repeat = REPEAT_GTC;
}
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, "Allocating Traffic Channel %s\n", tc->sender.kanal);
+ LOGP_CHAN(DMPT1327, LOGL_INFO, "Allocating Traffic Channel %s\n", tc->sender.kanal);
mpt1327_new_state(tc, STATE_BUSY, unit);
break;
case MPT_SAMIS: /* SAMIS response */
unit = get_unit(mpt1327->rx_sched.data_prefix, mpt1327->rx_sched.data_ident);
if (unit->state != UNIT_CALLING_SAMIS) {
- PDEBUG_CHAN(DMPT1327, DEBUG_ERROR, "Radio Unit (Prefix:%d Ident:%d) sends SAMIS, but not requested\n", unit->prefix, unit->ident);
+ LOGP_CHAN(DMPT1327, LOGL_ERROR, "Radio Unit (Prefix:%d Ident:%d) sends SAMIS, but not requested\n", unit->prefix, unit->ident);
break;
}
switch (unit->called_type) {
case CALLED_TYPE_INTERPFX:
if (codeword->params[MPT_DESC] != 0x0) {
- PDEBUG_CHAN(DMPT1327, DEBUG_ERROR, "Expecting DESC=%d from Radio Unit, but got DESC=%d, dropping!\n", 0x0, (int)codeword->params[MPT_DESC]);
+ LOGP_CHAN(DMPT1327, LOGL_ERROR, "Expecting DESC=%d from Radio Unit, but got DESC=%d, dropping!\n", 0x0, (int)codeword->params[MPT_DESC]);
return;
}
unit->called_prefix = codeword->params[MPT_PARAMETERS1] >> 13;
unit->called_ident = codeword->params[MPT_PARAMETERS1] & 0x1fff;
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, "Radio Unit (Prefix:%d Ident:%d) calls Prefix:%d Ident:%d\n", unit->prefix, unit->ident, unit->called_prefix, unit->called_ident);
+ LOGP_CHAN(DMPT1327, LOGL_INFO, "Radio Unit (Prefix:%d Ident:%d) calls Prefix:%d Ident:%d\n", unit->prefix, unit->ident, unit->called_prefix, unit->called_ident);
unit_new_state(unit, UNIT_GTC_B);
unit->repeat = REPEAT_GTC;
break;
case CALLED_TYPE_PSTN_LONG1:
case CALLED_TYPE_PSTN_LONG2:
if (codeword->params[MPT_DESC] != 0x1) {
- PDEBUG_CHAN(DMPT1327, DEBUG_ERROR, "Expecting DESC=%d from Radio Unit, but got DESC=%d, dropping!\n", 0x1, (int)codeword->params[MPT_DESC]);
+ LOGP_CHAN(DMPT1327, LOGL_ERROR, "Expecting DESC=%d from Radio Unit, but got DESC=%d, dropping!\n", 0x1, (int)codeword->params[MPT_DESC]);
return;
}
unit->called_number[0] = '0';
@@ -1269,8 +1276,8 @@ void mpt1327_receive_codeword_control(mpt1327_t *mpt1327, mpt1327_codeword_t *co
mpt1327->rx_sched.data_count = 0;
mpt1327->rx_sched.data_word = MPT_SAMIS_DT;
if (mpt1327->rx_sched.data_num == 0) {
- timer_stop(&unit->timer);
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, "Radio Unit (Prefix:%d Ident:%d) calls Number %s\n", unit->prefix, unit->ident, unit->called_number);
+ osmo_timer_del(&unit->timer);
+ LOGP_CHAN(DMPT1327, LOGL_INFO, "Radio Unit (Prefix:%d Ident:%d) calls Number %s\n", unit->prefix, unit->ident, unit->called_number);
out_setup(unit, OSMO_CC_NETWORK_MPT1327_PSTN, 0);
unit_new_state(unit, UNIT_GTC_A);
unit->repeat = REPEAT_GTC;
@@ -1278,7 +1285,7 @@ void mpt1327_receive_codeword_control(mpt1327_t *mpt1327, mpt1327_codeword_t *co
break;
case CALLED_TYPE_PBX_LONG:
if (codeword->params[MPT_DESC] != 0x2) {
- PDEBUG_CHAN(DMPT1327, DEBUG_ERROR, "Expecting DESC=%d from Radio Unit, but got DESC=%d, dropping!\n", 0x2, (int)codeword->params[MPT_DESC]);
+ LOGP_CHAN(DMPT1327, LOGL_ERROR, "Expecting DESC=%d from Radio Unit, but got DESC=%d, dropping!\n", 0x2, (int)codeword->params[MPT_DESC]);
return;
}
unit->called_number[0] = '0';
@@ -1292,21 +1299,21 @@ void mpt1327_receive_codeword_control(mpt1327_t *mpt1327, mpt1327_codeword_t *co
unit->called_number[8] = mpt1327_bcd[(codeword->params[MPT_PARAMETERS2] >> 4) & 0xf];
unit->called_number[9] = mpt1327_bcd[(codeword->params[MPT_PARAMETERS2] >> 0) & 0xf];
unit->called_number[10] = '\0';
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, "Radio Unit (Prefix:%d Ident:%d) calls Number %s\n", unit->prefix, unit->ident, unit->called_number);
- timer_stop(&unit->timer);
+ LOGP_CHAN(DMPT1327, LOGL_INFO, "Radio Unit (Prefix:%d Ident:%d) calls Number %s\n", unit->prefix, unit->ident, unit->called_number);
+ osmo_timer_del(&unit->timer);
out_setup(unit, OSMO_CC_NETWORK_MPT1327_PBX, 0);
unit_new_state(unit, UNIT_GTC_A);
unit->repeat = REPEAT_GTC;
break;
default:
- PDEBUG_CHAN(DMPT1327, DEBUG_ERROR, "Want to receive SAMIS, but called_type not set correctly, please fix!\n");
+ LOGP_CHAN(DMPT1327, LOGL_ERROR, "Want to receive SAMIS, but called_type not set correctly, please fix!\n");
abort();
}
break;
case MPT_SAMIS_DT:
unit = get_unit(mpt1327->rx_sched.data_prefix, mpt1327->rx_sched.data_ident);
if (unit->state != UNIT_CALLING_SAMIS) {
- PDEBUG_CHAN(DMPT1327, DEBUG_ERROR, "Radio Unit (Prefix:%d Ident:%d) sends SAMIS, but not requested\n", unit->prefix, unit->ident);
+ LOGP_CHAN(DMPT1327, LOGL_ERROR, "Radio Unit (Prefix:%d Ident:%d) sends SAMIS, but not requested\n", unit->prefix, unit->ident);
break;
}
if (mpt1327->rx_sched.data_count == 1) {
@@ -1323,8 +1330,8 @@ void mpt1327_receive_codeword_control(mpt1327_t *mpt1327, mpt1327_codeword_t *co
unit->called_number[20] = mpt1327_bcd[(codeword->params[MPT_BCD11] >> 0) & 0xf];
unit->called_number[21] = '\0';
if (mpt1327->rx_sched.data_num == 1) {
- timer_stop(&unit->timer);
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, "Radio Unit (Prefix:%d Ident:%d) calls Number %s\n", unit->prefix, unit->ident, unit->called_number);
+ osmo_timer_del(&unit->timer);
+ LOGP_CHAN(DMPT1327, LOGL_INFO, "Radio Unit (Prefix:%d Ident:%d) calls Number %s\n", unit->prefix, unit->ident, unit->called_number);
out_setup(unit, OSMO_CC_NETWORK_MPT1327_PSTN, 0);
unit_new_state(unit, UNIT_GTC_A);
unit->repeat = REPEAT_GTC;
@@ -1343,8 +1350,8 @@ void mpt1327_receive_codeword_control(mpt1327_t *mpt1327, mpt1327_codeword_t *co
unit->called_number[31] = mpt1327_bcd[(codeword->params[MPT_BCD11] >> 0) & 0xf];
unit->called_number[32] = '\0';
mpt1327->rx_sched.data_num = 0; /* just in case it is more than 2 data words */
- timer_stop(&unit->timer);
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, "Radio Unit (Prefix:%d Ident:%d) calls Number %s\n", unit->prefix, unit->ident, unit->called_number);
+ osmo_timer_del(&unit->timer);
+ LOGP_CHAN(DMPT1327, LOGL_INFO, "Radio Unit (Prefix:%d Ident:%d) calls Number %s\n", unit->prefix, unit->ident, unit->called_number);
out_setup(unit, OSMO_CC_NETWORK_MPT1327_PSTN, 0);
unit_new_state(unit, UNIT_GTC_A);
unit->repeat = REPEAT_GTC;
@@ -1353,30 +1360,30 @@ void mpt1327_receive_codeword_control(mpt1327_t *mpt1327, mpt1327_codeword_t *co
case MPT_RQX: /* call cancel */
unit = get_unit(codeword->params[MPT_PFIX], codeword->params[MPT_IDENT2]);
unit->called_ident = codeword->params[MPT_IDENT1];
- timer_stop(&unit->timer);
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, "Radio Unit (Prefix:%d Ident:%d) cancels call to %d\n", unit->prefix, unit->ident, unit->called_ident);
+ osmo_timer_del(&unit->timer);
+ LOGP_CHAN(DMPT1327, LOGL_INFO, "Radio Unit (Prefix:%d Ident:%d) cancels call to %d\n", unit->prefix, unit->ident, unit->called_ident);
unit_new_state(unit, UNIT_CANCEL_ACK);
if (unit->tc) {
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, "Free Traffic Channel %s, because unit cancels on control channel\n", unit->tc->sender.kanal);
+ LOGP_CHAN(DMPT1327, LOGL_INFO, "Free Traffic Channel %s, because unit cancels on control channel\n", unit->tc->sender.kanal);
mpt1327_go_idle(unit->tc);
}
break;
case MPT_ACKI: /* ack from unit (not ready, wait for RQQ) */
unit = get_unit(codeword->params[MPT_PFIX], codeword->params[MPT_IDENT1]);
- timer_stop(&unit->timer);
+ osmo_timer_del(&unit->timer);
if (unit->state == UNIT_CALLED_ACK) {
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, "Radio Unit (Prefix:%d Ident:%d) acknowledges call (not yet ready, waiting for RQQ\n", unit->prefix, unit->ident);
+ LOGP_CHAN(DMPT1327, LOGL_INFO, "Radio Unit (Prefix:%d Ident:%d) acknowledges call (not yet ready, waiting for RQQ\n", unit->prefix, unit->ident);
if (unit->callref)
call_up_alerting(unit->callref);
break;
}
- PDEBUG_CHAN(DMPT1327, DEBUG_ERROR, "Radio Unit (Prefix:%d Ident:%d) acknowledges, no call\n", unit->prefix, unit->ident);
+ LOGP_CHAN(DMPT1327, LOGL_ERROR, "Radio Unit (Prefix:%d Ident:%d) acknowledges, no call\n", unit->prefix, unit->ident);
break;
case MPT_ACK: /* ack from unit */
unit = get_unit(codeword->params[MPT_PFIX], codeword->params[MPT_IDENT1]);
- timer_stop(&unit->timer);
+ osmo_timer_del(&unit->timer);
if (unit->state == UNIT_CALLED_ACK) {
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, "Radio Unit (Prefix:%d Ident:%d) acknowledges call\n", unit->prefix, unit->ident);
+ LOGP_CHAN(DMPT1327, LOGL_INFO, "Radio Unit (Prefix:%d Ident:%d) acknowledges call\n", unit->prefix, unit->ident);
answer:
if (unit->callref) {
char connected_id[32];
@@ -1387,22 +1394,22 @@ answer:
unit->repeat = REPEAT_GTC;
break;
}
- PDEBUG_CHAN(DMPT1327, DEBUG_ERROR, "Radio Unit (Prefix:%d Ident:%d) acknowledges, no call\n", unit->prefix, unit->ident);
+ LOGP_CHAN(DMPT1327, LOGL_ERROR, "Radio Unit (Prefix:%d Ident:%d) acknowledges, no call\n", unit->prefix, unit->ident);
break;
case MPT_RQQ: /* status from radio */
unit = get_unit(codeword->params[MPT_PFIX], codeword->params[MPT_IDENT2]);
- timer_stop(&unit->timer);
- PDEBUG_CHAN(DMPT1327, DEBUG_ERROR, "Radio Unit (Prefix:%d Ident:%d) sends RRQ with STATUS=%d\n", unit->prefix, unit->ident, (int)codeword->params[MPT_STATUS]);
+ osmo_timer_del(&unit->timer);
+ LOGP_CHAN(DMPT1327, LOGL_ERROR, "Radio Unit (Prefix:%d Ident:%d) sends RRQ with STATUS=%d\n", unit->prefix, unit->ident, (int)codeword->params[MPT_STATUS]);
switch (codeword->params[MPT_STATUS]) {
case 0x00:
if (unit->state == UNIT_CALLED_ACK) {
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, "Radio Unit (Prefix:%d Ident:%d) answers call\n", unit->prefix, unit->ident);
+ LOGP_CHAN(DMPT1327, LOGL_INFO, "Radio Unit (Prefix:%d Ident:%d) answers call\n", unit->prefix, unit->ident);
// NOTE: GTC acknowledges RQQ
goto answer;
}
break;
case 0x1f:
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, "Radio Unit (Prefix:%d Ident:%d) rejects call, releasing\n", unit->prefix, unit->ident);
+ LOGP_CHAN(DMPT1327, LOGL_INFO, "Radio Unit (Prefix:%d Ident:%d) rejects call, releasing\n", unit->prefix, unit->ident);
// NOTE: AHYX acknowledges RQQ
mpt1327_release(unit);
if (unit->callref) {
@@ -1427,11 +1434,11 @@ answer:
default:
if (mpt1327->sender.loopback)
return;
- PDEBUG_CHAN(DMPT1327, DEBUG_NOTICE, "Received unsupported codeword '%s' = '%s' on control channel\n", codeword->short_name, codeword->long_name);
+ LOGP_CHAN(DMPT1327, LOGL_NOTICE, "Received unsupported codeword '%s' = '%s' on control channel\n", codeword->short_name, codeword->long_name);
}
}
-void mpt1327_receive_codeword_traffic(mpt1327_t *mpt1327, mpt1327_codeword_t *codeword)
+static void mpt1327_receive_codeword_traffic(mpt1327_t *mpt1327, mpt1327_codeword_t *codeword)
{
mpt1327_unit_t *unit;
@@ -1439,34 +1446,34 @@ void mpt1327_receive_codeword_traffic(mpt1327_t *mpt1327, mpt1327_codeword_t *co
case MPT_MAINT: /* maintenance message */
unit = get_unit(codeword->params[MPT_PFIX], codeword->params[MPT_IDENT1]);
if (codeword->params[MPT_CHAN] != mpt1327_channel2chan(mpt1327->band, atoi(mpt1327->sender.kanal))) {
- PDEBUG_CHAN(DMPT1327, DEBUG_NOTICE, "Radio Unit (Prefix:%d Ident:%d) sends maintenance message on wrong channel %d, ignoring!\n", unit->prefix, unit->ident, (int)codeword->params[MPT_CHAN]);
+ LOGP_CHAN(DMPT1327, LOGL_NOTICE, "Radio Unit (Prefix:%d Ident:%d) sends maintenance message on wrong channel %d, ignoring!\n", unit->prefix, unit->ident, (int)codeword->params[MPT_CHAN]);
return;
}
if (!unit->tc) {
- PDEBUG_CHAN(DMPT1327, DEBUG_NOTICE, "Radio Unit (Prefix:%d Ident:%d) sends maintenance, but it has no channel assigned, ignoring!\n", unit->prefix, unit->ident);
+ LOGP_CHAN(DMPT1327, LOGL_NOTICE, "Radio Unit (Prefix:%d Ident:%d) sends maintenance, but it has no channel assigned, ignoring!\n", unit->prefix, unit->ident);
return;
}
switch (codeword->params[MPT_OPER]) {
case OPER_PRESSEL_ON:
if (sysdef.timeout)
- timer_start(&unit->timer, sysdef.timeout);
+ osmo_timer_schedule(&unit->timer, sysdef.timeout,0);
mpt1327->pressel_on = 1;
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, "Radio Unit (Prefix:%d Ident:%d) starts transmission\n", unit->prefix, unit->ident);
+ LOGP_CHAN(DMPT1327, LOGL_INFO, "Radio Unit (Prefix:%d Ident:%d) starts transmission\n", unit->prefix, unit->ident);
break;
case OPER_PRESSEL_OFF:
if (sysdef.timeout)
- timer_start(&unit->timer, sysdef.timeout);
+ osmo_timer_schedule(&unit->timer, sysdef.timeout,0);
mpt1327->pressel_on = 0;
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, "Radio Unit (Prefix:%d Ident:%d) stops transmission\n", unit->prefix, unit->ident);
+ LOGP_CHAN(DMPT1327, LOGL_INFO, "Radio Unit (Prefix:%d Ident:%d) stops transmission\n", unit->prefix, unit->ident);
break;
case OPER_DISCONNECT:
/* ignore while we send clear message */
if (unit->state == UNIT_CALL_CLEAR)
return;
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, "Radio Unit (Prefix:%d Ident:%d) disconnects from channel\n", unit->prefix, unit->ident);
+ LOGP_CHAN(DMPT1327, LOGL_INFO, "Radio Unit (Prefix:%d Ident:%d) disconnects from channel\n", unit->prefix, unit->ident);
if (unit->state == UNIT_CALL) {
- timer_stop(&unit->timer);
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, "Free Traffic Channel %s, because the initiator goes on-hook\n", unit->tc->sender.kanal);
+ osmo_timer_del(&unit->timer);
+ LOGP_CHAN(DMPT1327, LOGL_INFO, "Free Traffic Channel %s, because the initiator goes on-hook\n", unit->tc->sender.kanal);
mpt1327_go_idle(unit->tc);
if (unit->callref) {
call_up_release(unit->callref, CAUSE_NORMAL);
@@ -1477,16 +1484,16 @@ void mpt1327_receive_codeword_traffic(mpt1327_t *mpt1327, mpt1327_codeword_t *co
break;
case OPER_PERIODIC:
if (sysdef.timeout)
- timer_start(&unit->timer, sysdef.timeout);
+ osmo_timer_schedule(&unit->timer, sysdef.timeout,0);
mpt1327->pressel_on = 1;
- PDEBUG_CHAN(DMPT1327, DEBUG_INFO, "Radio Unit (Prefix:%d Ident:%d) sends periodic message\n", unit->prefix, unit->ident);
+ LOGP_CHAN(DMPT1327, LOGL_INFO, "Radio Unit (Prefix:%d Ident:%d) sends periodic message\n", unit->prefix, unit->ident);
break;
}
break;
default:
if (mpt1327->sender.loopback)
return;
- PDEBUG_CHAN(DMPT1327, DEBUG_NOTICE, "Received unsupported codeword '%s' = '%s' on traffic channel\n", codeword->short_name, codeword->long_name);
+ LOGP_CHAN(DMPT1327, LOGL_NOTICE, "Received unsupported codeword '%s' = '%s' on traffic channel\n", codeword->short_name, codeword->long_name);
}
}
@@ -1495,7 +1502,7 @@ void mpt1327_receive_codeword(mpt1327_t *mpt1327, uint64_t bits, double quality,
mpt1327_codeword_t codeword;
int rc;
- PDEBUG_CHAN(DDSP, DEBUG_INFO, "RX Level: %.0f%% Quality=%.0f%%\n", level * 100.0, quality * 100.0);
+ LOGP_CHAN(DDSP, LOGL_INFO, "RX Level: %.0f%% Quality=%.0f%%\n", level * 100.0, quality * 100.0);
rc = mpt1327_decode_codeword(&codeword, (mpt1327->rx_sched.data_num) ? mpt1327->rx_sched.data_word : -1, (mpt1327->sender.loopback) ? MPT_DOWN : MPT_UP, bits);
if (rc < 0) {
@@ -1533,14 +1540,14 @@ void mpt1327_signal_indication(mpt1327_t *mpt1327)
/* restart timer, if enabled */
if (mpt1327->unit && mpt1327->unit->state == UNIT_CALL) {
if (sysdef.timeout)
- timer_start(&mpt1327->unit->timer, sysdef.timeout);
+ osmo_timer_schedule(&mpt1327->unit->timer, sysdef.timeout,0);
}
}
/* Timeout handling */
-static void mpt1327_timeout(struct timer *timer)
+static void mpt1327_timeout(void *data)
{
- mpt1327_t *mpt1327 = (mpt1327_t *)timer->priv;
+ mpt1327_t *mpt1327 = data;
switch (mpt1327->state) {
default:
@@ -1567,18 +1574,18 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
/* 2. check if given number is already in a call, return BUSY */
unit = get_unit(prefix, ident);
if (unit->state != UNIT_IDLE) {
- PDEBUG(DMPT1327, DEBUG_NOTICE, "Outgoing call to busy Radio Unit, rejecting!\n");
+ LOGP(DMPT1327, LOGL_NOTICE, "Outgoing call to busy Radio Unit, rejecting!\n");
return -CAUSE_BUSY;
}
/* 3. check if all channels are busy, return NOCHANNEL */
tc = search_free_tc();
if (!tc) {
- PDEBUG(DMPT1327, DEBUG_NOTICE, "Outgoing call, but no free channel, rejecting!\n");
+ LOGP(DMPT1327, LOGL_NOTICE, "Outgoing call, but no free channel, rejecting!\n");
return -CAUSE_NOCHANNEL;
}
- PDEBUG(DMPT1327, DEBUG_INFO, "Outgoing call to Radio Unit (Prefix:%d Ident:%d)\n", unit->prefix, unit->ident);
+ LOGP(DMPT1327, LOGL_INFO, "Outgoing call to Radio Unit (Prefix:%d Ident:%d)\n", unit->prefix, unit->ident);
/* 4. trying to reach radio unit */
unit->callref = callref;
@@ -1591,7 +1598,7 @@ 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 __attribute__((unused)) callref, struct timeval __attribute__((unused)) *tv_meter)
{
}
@@ -1603,11 +1610,11 @@ void call_down_disconnect(int callref, int cause)
{
mpt1327_unit_t *unit;
- PDEBUG(DMPT1327, DEBUG_INFO, "Call has been disconnected by network.\n");
+ LOGP(DMPT1327, LOGL_INFO, "Call has been disconnected by network.\n");
unit = find_unit_callref(callref);
if (!unit) {
- PDEBUG(DMPT1327, DEBUG_NOTICE, "Outgoing disconnect, but no unit for callref!\n");
+ LOGP(DMPT1327, LOGL_NOTICE, "Outgoing disconnect, but no unit for callref!\n");
call_up_release(callref, CAUSE_INVALCALLREF);
return;
}
@@ -1615,7 +1622,7 @@ void call_down_disconnect(int callref, int cause)
/* Release when not active */
if (unit->state == UNIT_CALL)
return;
- PDEBUG(DMPT1327, DEBUG_NOTICE, "Outgoing disconnect, but no call, releasing!\n");
+ LOGP(DMPT1327, LOGL_NOTICE, "Outgoing disconnect, but no call, releasing!\n");
mpt1327_release(unit);
unit->callref = 0;
@@ -1627,39 +1634,22 @@ void call_down_release(int callref, __attribute__((unused)) int cause)
{
mpt1327_unit_t *unit;
- PDEBUG(DMPT1327, DEBUG_INFO, "Call has been released by network, releasing call.\n");
+ LOGP(DMPT1327, LOGL_INFO, "Call has been released by network, releasing call.\n");
unit = find_unit_callref(callref);
if (!unit) {
- PDEBUG(DMPT1327, DEBUG_NOTICE, "Outgoing release, but no unit for callref!\n");
+ LOGP(DMPT1327, LOGL_NOTICE, "Outgoing release, but no unit for callref!\n");
/* don't send release, because caller already released */
return;
}
- PDEBUG(DMPT1327, DEBUG_NOTICE, "Outgoing release, releasing!\n");
+ LOGP(DMPT1327, LOGL_NOTICE, "Outgoing release, releasing!\n");
mpt1327_release(unit);
unit->callref = 0;
}
-/* 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)
-{
- mpt1327_unit_t *unit;
-
- unit = find_unit_callref(callref);
- if (!unit)
- return;
- if (!unit->tc)
- return;
-
- if (unit->tc->state == STATE_BUSY && unit->tc->dsp_mode == DSP_MODE_TRAFFIC)
- jitter_save(&unit->tc->sender.dejitter, samples, count, 1, sequence, timestamp, ssrc);
-}
-
void dump_info(void)
{
dump_units();
}
-void call_down_clock(void) {}
-
diff --git a/src/mpt1327/mpt1327.h b/src/mpt1327/mpt1327.h
index 18af5e1..87482f2 100755
--- a/src/mpt1327/mpt1327.h
+++ b/src/mpt1327/mpt1327.h
@@ -84,7 +84,7 @@ typedef struct mpt1327_unit {
struct mpt1327_unit *next;
uint64_t state;
int repeat; /* number of repeating messages / retries after timeout */
- struct timer timer; /* timeout waiting for unit response */
+ struct osmo_timer_list timer; /* timeout waiting for unit response */
struct mpt1327 *tc; /* link to transceiver */
uint8_t prefix; /* unit's prefix */
uint16_t ident; /* unit's ident */
@@ -102,7 +102,7 @@ typedef struct mpt1327 {
/* sender's states */
enum mpt1327_state state; /* current sender's state */
- struct timer timer; /* inactivity timer to clear channel */
+ struct osmo_timer_list timer; /* inactivity timer to clear channel */
mpt1327_unit_t *unit; /* link to unit */
/* display measurements */
@@ -118,6 +118,8 @@ typedef struct mpt1327 {
/* dsp states */
int repeater; /* in repeater mode the received audio is repeated */
jitter_t repeater_dejitter; /* forwarding audio */
+ uint16_t repeater_sequence; /* sequence & ts for jitter buffer */
+ uint32_t repeater_timestamp;
int pressel_on; /* set if somebody transmitting on TC */
enum dsp_mode dsp_mode; /* current mode: audio, durable tone 0 or 1, paging */
fsk_mod_t fsk_mod; /* fsk processing */
@@ -153,4 +155,5 @@ void mpt1327_destroy(sender_t *sender);
void mpt1327_receive_codeword(mpt1327_t *mpt1327, uint64_t bits, double quality, double level);
int mpt1327_send_codeword(mpt1327_t *mpt1327, uint64_t *bits);
void mpt1327_signal_indication(mpt1327_t *mpt1327);
+mpt1327_unit_t *find_unit_callref(uint32_t callref);
diff --git a/src/nmt/Makefile.am b/src/nmt/Makefile.am
index 5887455..333cdd9 100644
--- a/src/nmt/Makefile.am
+++ b/src/nmt/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
noinst_LIBRARIES = libdmssms.a
@@ -23,16 +23,13 @@ nmt_LDADD = \
$(COMMON_LA) \
libdmssms.a \
$(top_builddir)/src/liboptions/liboptions.a \
- $(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libmobile/libmobile.a \
- $(top_builddir)/src/libosmocc/libosmocc.a \
$(top_builddir)/src/libdisplay/libdisplay.a \
$(top_builddir)/src/libcompandor/libcompandor.a \
$(top_builddir)/src/libgoertzel/libgoertzel.a \
$(top_builddir)/src/libjitter/libjitter.a \
$(top_builddir)/src/libhagelbarger/libhagelbarger.a \
$(top_builddir)/src/libdtmf/libdtmf.a \
- $(top_builddir)/src/libtimer/libtimer.a \
$(top_builddir)/src/libsamplerate/libsamplerate.a \
$(top_builddir)/src/libemphasis/libemphasis.a \
$(top_builddir)/src/libfsk/libfsk.a \
@@ -40,8 +37,10 @@ nmt_LDADD = \
$(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \
- $(top_builddir)/src/libg711/libg711.a \
$(top_builddir)/src/libaaimage/libaaimage.a \
+ $(top_builddir)/src/liblogging/liblogging.a \
+ $(LIBOSMOCORE_LIBS) \
+ $(LIBOSMOCC_LIBS) \
-lm
if HAVE_ALSA
diff --git a/src/nmt/countries.c b/src/nmt/countries.c
index 04049a6..52547f2 100644
--- a/src/nmt/countries.c
+++ b/src/nmt/countries.c
@@ -139,7 +139,7 @@ static struct nmt_country {
{ 450, 1, 7, 1,9, "PL", "Poland", "CENTERTEL", frq_450_scandinavia },
{ 450, 1, 6, 1,9, "BG", "Bulgaria", "MOBIFON", frq_450_scandinavia },
{ 450, 1, 5, 1,9, "RO", "Romania", "Telefonica Romania", frq_450_scandinavia },
- { 450, 1, 6, 1,9, "UA", "Ukraine", "Ukraine Mobile Comm.", frq_450_scandinavia },
+ { 450, 1, 8, 1,9, "UA", "Ukraine", "Ukrainian Mobile Communications", frq_450_scandinavia },
{ 450, 1, 1, 1,9, "RU1", "", "", frq_450_scandinavia },
{ 450, 1, 2, 1,9, "RU2", "", "", frq_450_scandinavia },
{ 450, 1, 3, 1,9, "RU3", "", "", frq_450_scandinavia },
diff --git a/src/nmt/dms.c b/src/nmt/dms.c
index 82d5174..c687fdf 100644
--- a/src/nmt/dms.c
+++ b/src/nmt/dms.c
@@ -22,7 +22,8 @@
#include <stdlib.h>
#include <string.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
+#include "../libmobile/get_time.h"
#include "nmt.h"
#define MUTE_DURATION 0.300 /* 200ms, and about 95ms for the frame itself */
@@ -105,12 +106,12 @@ static const char *print_ct_dt(uint8_t s, uint8_t n, uint8_t *data, int eight_bi
}
/* link DMS frame to list of TX frames */
-void link_dms_frame(nmt_t *nmt, struct dms_frame *frame)
+static void link_dms_frame(nmt_t *nmt, struct dms_frame *frame)
{
dms_t *dms = &nmt->dms;
struct dms_frame **framep;
- PDEBUG(DDMS, DEBUG_DEBUG, "link DMS frame\n");
+ LOGP(DDMS, LOGL_DEBUG, "link DMS frame\n");
/* attach to end of list */
framep = &dms->state.frame_list;
@@ -120,19 +121,19 @@ void link_dms_frame(nmt_t *nmt, struct dms_frame *frame)
}
/* unlink DMS frame from list of TX frames */
-void unlink_dms_frame(nmt_t *nmt, struct dms_frame *frame)
+static void unlink_dms_frame(nmt_t *nmt, struct dms_frame *frame)
{
dms_t *dms = &nmt->dms;
struct dms_frame **framep;
- PDEBUG(DDMS, DEBUG_DEBUG, "unlink DMS frame\n");
+ LOGP(DDMS, LOGL_DEBUG, "unlink DMS frame\n");
/* unlink */
framep = &dms->state.frame_list;
while (*framep && *framep != frame)
framep = &((*framep)->next);
if (!(*framep)) {
- PDEBUG(DTRANS, DEBUG_ERROR, "Frame not in list, please fix!!\n");
+ LOGP(DTRANS, LOGL_ERROR, "Frame not in list, please fix!!\n");
abort();
}
*framep = frame->next;
@@ -146,7 +147,7 @@ static void dms_frame_add(nmt_t *nmt, int s, const uint8_t *data)
dms_frame = calloc(1, sizeof(*dms_frame));
if (!dms_frame) {
- PDEBUG(DDMS, DEBUG_ERROR, "No memory!\n");
+ LOGP(DDMS, LOGL_ERROR, "No memory!\n");
return;
}
@@ -155,7 +156,7 @@ static void dms_frame_add(nmt_t *nmt, int s, const uint8_t *data)
dms->state.n_count = (dms->state.n_count + 1) & 7;
memcpy(dms_frame->data, data, 8);
- PDEBUG(DDMS, DEBUG_DEBUG, "add DMS %cT(%d) frame to queue\n", dms_frame->s + 'C', dms_frame->n);
+ LOGP(DDMS, LOGL_DEBUG, "add DMS %cT(%d) frame to queue\n", dms_frame->s + 'C', dms_frame->n);
link_dms_frame(nmt, dms_frame);
}
@@ -163,7 +164,7 @@ static void dms_frame_add(nmt_t *nmt, int s, const uint8_t *data)
/* delete DMS frame from list of TX frames */
static void dms_frame_delete(nmt_t *nmt, struct dms_frame *dms_frame)
{
- PDEBUG(DDMS, DEBUG_DEBUG, "delete DMS frame %cT(%d) from queue\n", dms_frame->s + 'C', dms_frame->n);
+ LOGP(DDMS, LOGL_DEBUG, "delete DMS frame %cT(%d) from queue\n", dms_frame->s + 'C', dms_frame->n);
unlink_dms_frame(nmt, dms_frame);
@@ -248,7 +249,7 @@ static void dms_encode_dt(nmt_t *nmt, uint8_t d, uint8_t s, uint8_t n, uint8_t *
uint16_t crc;
int i, j;
- PDEBUG(DDMS, DEBUG_INFO, "Sending DMS frame: %s\n", print_ct_dt(s, n, _data, dms->state.eight_bits));
+ LOGP(DDMS, LOGL_INFO, "Sending DMS frame: %s\n", print_ct_dt(s, n, _data, dms->state.eight_bits));
/* generate label */
data[0] = (d << 6) | (s << 5) | (3 << 3) | n;
@@ -354,7 +355,7 @@ void trigger_frame_transmission(nmt_t *nmt)
/* check for RR first, because high priority */
if (dms->state.send_rr) {
- PDEBUG(DDMS, DEBUG_DEBUG, "Found pending RR(%d) frame, sending.\n", dms->state.n_r);
+ LOGP(DDMS, LOGL_DEBUG, "Found pending RR(%d) frame, sending.\n", dms->state.n_r);
dms->state.send_rr = 0;
dms_encode_rr(nmt, dms->state.dir ^ 1, 1, dms->state.n_r);
return;
@@ -374,7 +375,7 @@ void trigger_frame_transmission(nmt_t *nmt)
/* check if outstanding frame */
if (!dms_frame) {
- PDEBUG(DDMS, DEBUG_DEBUG, "No pending RR/CT/DT frame found.\n");
+ LOGP(DDMS, LOGL_DEBUG, "No pending RR/CT/DT frame found.\n");
if (dms->state.tx_pending) {
dms->state.tx_pending = 0;
dms_all_sent(nmt);
@@ -382,7 +383,7 @@ void trigger_frame_transmission(nmt_t *nmt)
return;
}
- PDEBUG(DDMS, DEBUG_DEBUG, "Found pending %cT(%d) frame, sending.\n", dms_frame->s + 'C', dms_frame->n);
+ LOGP(DDMS, LOGL_DEBUG, "Found pending %cT(%d) frame, sending.\n", dms_frame->s + 'C', dms_frame->n);
/* sent next send state to next frame in buffer.
* if there is no next frame, set it to the first frame (cycle).
@@ -390,19 +391,19 @@ void trigger_frame_transmission(nmt_t *nmt)
*/
if (!dms_frame->next) {
dms->state.n_s = dms->state.frame_list->n;
- PDEBUG(DDMS, DEBUG_DEBUG, " -> Next sequence number is %d, because this was the last frame in queue.\n", dms->state.n_s);
+ LOGP(DDMS, LOGL_DEBUG, " -> Next sequence number is %d, because this was the last frame in queue.\n", dms->state.n_s);
} else if (!dms->state.established && dms_frame->next->s == 1) {
dms->state.n_s = dms->state.frame_list->n;
- PDEBUG(DDMS, DEBUG_DEBUG, " -> Next sequence number is %d, because this was the last frame before DT queue, and RAND has not been acked yet.\n", dms->state.n_s);
+ LOGP(DDMS, LOGL_DEBUG, " -> Next sequence number is %d, because this was the last frame before DT queue, and RAND has not been acked yet.\n", dms->state.n_s);
} else if (i == 3) {
dms->state.n_s = dms->state.frame_list->n;
- PDEBUG(DDMS, DEBUG_DEBUG, " -> Next sequence number is %d, because we reached max number of unacknowledged frames.\n", dms->state.n_s);
+ LOGP(DDMS, LOGL_DEBUG, " -> Next sequence number is %d, because we reached max number of unacknowledged frames.\n", dms->state.n_s);
} else if (!dms->state.established && dms_frame->next->s == 0) {
dms->state.n_s = dms_frame->next->n;
- PDEBUG(DDMS, DEBUG_DEBUG, " -> Next sequence number is %d, because this is the next CT frame in queue.\n", dms->state.n_s);
+ LOGP(DDMS, LOGL_DEBUG, " -> Next sequence number is %d, because this is the next CT frame in queue.\n", dms->state.n_s);
} else {
dms->state.n_s = dms_frame->next->n;
- PDEBUG(DDMS, DEBUG_DEBUG, " -> Next sequence number is %d, because this is the next frame in queue.\n", dms->state.n_s);
+ LOGP(DDMS, LOGL_DEBUG, " -> Next sequence number is %d, because this is the next frame in queue.\n", dms->state.n_s);
}
dms_encode_dt(nmt, dms->state.dir ^ 1, dms_frame->s, dms_frame->n, dms_frame->data);
@@ -438,7 +439,7 @@ static void dms_rx_dt(nmt_t *nmt, uint8_t d, uint8_t s, uint8_t n, uint8_t *data
/* start transfer */
if (!dms->state.started) {
- PDEBUG(DDMS, DEBUG_INFO, "Starting DMS transfer (mobile originated)\n");
+ LOGP(DDMS, LOGL_INFO, "Starting DMS transfer (mobile originated)\n");
dms->state.started = 1;
dms->state.established = 0;
dms->state.dir = d;
@@ -451,15 +452,15 @@ static void dms_rx_dt(nmt_t *nmt, uint8_t d, uint8_t s, uint8_t n, uint8_t *data
if (dms->state.dir != d && !dms_allow_loopback) {
/* drop frames with wrong direction indicator */
- PDEBUG(DDMS, DEBUG_INFO, "DMS frame ignored, direction indicator mismatch!\n");
+ LOGP(DDMS, LOGL_INFO, "DMS frame ignored, direction indicator mismatch!\n");
return;
}
if (dms->state.n_r != n) {
/* ignore out of sequence frames */
- PDEBUG(DDMS, DEBUG_DEBUG, "DMS frame number mismatch (due to resending)\n");
+ LOGP(DDMS, LOGL_DEBUG, "DMS frame number mismatch (due to resending)\n");
} else {
- PDEBUG(DDMS, DEBUG_INFO, "Received valid DMS frame: %s\n", print_ct_dt(s, n, data, dms->state.eight_bits));
+ LOGP(DDMS, LOGL_INFO, "Received valid DMS frame: %s\n", print_ct_dt(s, n, data, dms->state.eight_bits));
/* cycle sequence */
dms->state.n_r = (n + 1) % 8;
@@ -470,7 +471,7 @@ static void dms_rx_dt(nmt_t *nmt, uint8_t d, uint8_t s, uint8_t n, uint8_t *data
case 73: /* ID */
break;
case 82: /* RAND */
- PDEBUG(DDMS, DEBUG_DEBUG, "RAND frame has been received, so we can send/receive DT frame\n");
+ LOGP(DDMS, LOGL_DEBUG, "RAND frame has been received, so we can send/receive DT frame\n");
/* when we sent RAND, we do not resend it again, this would be wrong */
if (!dms->state.rand_sent) {
dms_frame_add_rand(nmt, data[7]);
@@ -484,7 +485,7 @@ static void dms_rx_dt(nmt_t *nmt, uint8_t d, uint8_t s, uint8_t n, uint8_t *data
}
} else {
if (!dms->state.established)
- PDEBUG(DDMS, DEBUG_NOTICE, "Received DT frame, but RAND frame has not been received yet\n");
+ LOGP(DDMS, LOGL_NOTICE, "Received DT frame, but RAND frame has not been received yet\n");
else {
if (!dms->state.eight_bits)
length = 8;
@@ -526,7 +527,7 @@ static void dms_rx_rr(nmt_t *nmt, uint8_t d, uint8_t s, uint8_t n)
if (dms->state.dir != d && !dms_allow_loopback) {
/* drop frames with wrong direction indicator */
- PDEBUG(DDMS, DEBUG_INFO, "DMS frame ignored, direction indicator mismatch!\n");
+ LOGP(DDMS, LOGL_INFO, "DMS frame ignored, direction indicator mismatch!\n");
return;
}
@@ -541,17 +542,17 @@ static void dms_rx_rr(nmt_t *nmt, uint8_t d, uint8_t s, uint8_t n)
/* if we don't find a frame, it must have been already acked, so we ignore RR */
if (!dms_frame || i == 4) {
- PDEBUG(DDMS, DEBUG_DEBUG, "Received already acked DMS frame: RR(%d) (s = %d), ignoring\n", n, s);
+ LOGP(DDMS, LOGL_DEBUG, "Received already acked DMS frame: RR(%d) (s = %d), ignoring\n", n, s);
return;
}
- PDEBUG(DDMS, DEBUG_INFO, "Received valid DMS frame: RR(%d) (s = %d)\n", n, s);
+ LOGP(DDMS, LOGL_INFO, "Received valid DMS frame: RR(%d) (s = %d)\n", n, s);
/* flush all acked frames. */
dms_frame = dms->state.frame_list;
for (j = 0; j <= i; j++) {
if (dms_frame->data[0] == 82) { /* RAND */
- PDEBUG(DDMS, DEBUG_DEBUG, "RAND frame has been acknowledged, so we can continue to send DT frame\n");
+ LOGP(DDMS, LOGL_DEBUG, "RAND frame has been acknowledged, so we can continue to send DT frame\n");
dms->state.established = 1;
}
/* increment ack counter */
@@ -559,9 +560,9 @@ static void dms_rx_rr(nmt_t *nmt, uint8_t d, uint8_t s, uint8_t n)
/* raise send counter if required */
if (dms->state.n_s == dms_frame->n) {
dms->state.n_s = dms->state.n_a;
- PDEBUG(DDMS, DEBUG_DEBUG, "Raising next frame to send to #%d\n", dms->state.n_s);
+ LOGP(DDMS, LOGL_DEBUG, "Raising next frame to send to #%d\n", dms->state.n_s);
}
- PDEBUG(DDMS, DEBUG_DEBUG, "Removing acked frame #%d\n", dms_frame->n);
+ LOGP(DDMS, LOGL_DEBUG, "Removing acked frame #%d\n", dms_frame->n);
dms_frame_next = dms_frame->next;
dms_frame_delete(nmt, dms_frame);
dms_frame = dms_frame_next;
@@ -581,11 +582,11 @@ static void dms_rx_nr(nmt_t *nmt, uint8_t d, uint8_t s, uint8_t n)
if (dms->state.dir != d && !dms_allow_loopback) {
/* drop frames with wrong direction indicator */
- PDEBUG(DDMS, DEBUG_INFO, "DMS frame ignored, direction indicator mismatch!\n");
+ LOGP(DDMS, LOGL_INFO, "DMS frame ignored, direction indicator mismatch!\n");
return;
}
- PDEBUG(DDMS, DEBUG_INFO, "Received valid DMS frame: NR(%d) (s = %d)\n", n, s);
+ LOGP(DDMS, LOGL_INFO, "Received valid DMS frame: NR(%d) (s = %d)\n", n, s);
// FIXME: support NR
@@ -624,7 +625,7 @@ void fsk_receive_bit_dms(nmt_t *nmt, int bit, double quality, double level)
if (quality < 0.65)
return;
- PDEBUG(DDSP, DEBUG_DEBUG, "DMS sync RX Level: %.0f%% Quality=%.0f\n", level * 100.0 + 0.5, quality * 100.0 + 0.5);
+ LOGP(DDSP, LOGL_DEBUG, "DMS sync RX Level: %.0f%% Quality=%.0f\n", level * 100.0 + 0.5, quality * 100.0 + 0.5);
/* rest sync register */
dms->rx_sync = 0;
@@ -657,10 +658,10 @@ void fsk_receive_bit_dms(nmt_t *nmt, int bit, double quality, double level)
dms->rx_label.s = (dms->rx_frame[0] >> 5) & 0x1;
dms->rx_label.p = (dms->rx_frame[0] >> 3) & 0x3;
dms->rx_label.n = dms->rx_frame[0] & 0x7;
- PDEBUG(DDMS, DEBUG_DEBUG, "Got DMS label (d = %d, s = %d, p = %d, n = %d)\n", dms->rx_label.d,dms->rx_label.s,dms->rx_label.p,dms->rx_label.n);
+ LOGP(DDMS, LOGL_DEBUG, "Got DMS label (d = %d, s = %d, p = %d, n = %d)\n", dms->rx_label.d,dms->rx_label.s,dms->rx_label.p,dms->rx_label.n);
dms->rx_frame_count++;
if (dms->rx_label.p == 0) {
- PDEBUG(DDMS, DEBUG_DEBUG, "Spare prefix '00' ignoring!\n");
+ LOGP(DDMS, LOGL_DEBUG, "Spare prefix '00' ignoring!\n");
dms->rx_in_sync = 0;
}
}
@@ -673,7 +674,7 @@ void fsk_receive_bit_dms(nmt_t *nmt, int bit, double quality, double level)
if (dms->rx_bit_count == 9) {
dms->rx_bit_count = 0;
uint8_t c = dms->rx_frame[dms->rx_frame_count];
- PDEBUG(DDMS, DEBUG_DEBUG, "Got DMS word 0x%02x (%c)\n", c, (c >= 32 && c <= 126) ? c : '.');
+ LOGP(DDMS, LOGL_DEBUG, "Got DMS word 0x%02x (%c)\n", c, (c >= 32 && c <= 126) ? c : '.');
dms->rx_frame_count++;
}
return;
@@ -681,7 +682,7 @@ void fsk_receive_bit_dms(nmt_t *nmt, int bit, double quality, double level)
if (dms->rx_frame_count <= 10) {
if (dms->rx_bit_count == 9) {
dms->rx_bit_count = 0;
- PDEBUG(DDMS, DEBUG_DEBUG, "Got DMS CRC 0x%02x\n", dms->rx_frame[dms->rx_frame_count]);
+ LOGP(DDMS, LOGL_DEBUG, "Got DMS CRC 0x%02x\n", dms->rx_frame[dms->rx_frame_count]);
dms->rx_frame_count++;
}
return;
@@ -691,7 +692,7 @@ void fsk_receive_bit_dms(nmt_t *nmt, int bit, double quality, double level)
uint8_t bits[63 + 16];
int i, j;
dms->rx_bit_count = 0;
- PDEBUG(DDMS, DEBUG_DEBUG, "Got DMS CRC 0x%x\n", dms->rx_frame[dms->rx_frame_count]);
+ LOGP(DDMS, LOGL_DEBUG, "Got DMS CRC 0x%x\n", dms->rx_frame[dms->rx_frame_count]);
crc_got = (dms->rx_frame[9] << 9) | (dms->rx_frame[10] << 2) | dms->rx_frame[11];
for (i = 0; i < 9; i++) {
for (j = 0; j < 7; j++)
@@ -700,7 +701,7 @@ void fsk_receive_bit_dms(nmt_t *nmt, int bit, double quality, double level)
for (i = 0; i < 16; i++)
bits[63 + i] = 0;
crc_calc = crc16(bits, 63 + 16);
- PDEBUG(DDMS, DEBUG_DEBUG, "DMS CRC = 0x%04x %s\n", crc_got, (crc_calc == crc_got) ? "(OK)" : "(CRC error)");
+ LOGP(DDMS, LOGL_DEBUG, "DMS CRC = 0x%04x %s\n", crc_got, (crc_calc == crc_got) ? "(OK)" : "(CRC error)");
if (crc_calc == crc_got)
dms_rx_dt(nmt, dms->rx_label.d, dms->rx_label.s, dms->rx_label.n, dms->rx_frame + 1);
dms->rx_in_sync = 0;
@@ -713,12 +714,12 @@ void fsk_receive_bit_dms(nmt_t *nmt, int bit, double quality, double level)
if (dms->rx_bit_count == 9) {
dms->rx_bit_count = 0;
if (dms->rx_frame[0] != dms->rx_frame[1]) {
- PDEBUG(DDMS, DEBUG_DEBUG, "Repeated DMS label mismatches!\n");
+ LOGP(DDMS, LOGL_DEBUG, "Repeated DMS label mismatches!\n");
dms->rx_in_sync = 0;
return;
}
dms->rx_frame_count++;
- PDEBUG(DDMS, DEBUG_DEBUG, "Repeated label matches\n");
+ LOGP(DDMS, LOGL_DEBUG, "Repeated label matches\n");
}
return;
}
@@ -727,13 +728,13 @@ void fsk_receive_bit_dms(nmt_t *nmt, int bit, double quality, double level)
int i;
dms->rx_bit_count = 0;
parity_got = dms->rx_frame[2];
- PDEBUG(DDMS, DEBUG_DEBUG, "Got DMS parity 0x%x\n", dms->rx_frame[dms->rx_frame_count]);
+ LOGP(DDMS, LOGL_DEBUG, "Got DMS parity 0x%x\n", dms->rx_frame[dms->rx_frame_count]);
for (i = 0; i < 7; i++) {
bit = (dms->rx_frame[0] >> i) & 1;
if (bit)
parity_calc ^= 0x3;
}
- PDEBUG(DDMS, DEBUG_DEBUG, "DMS parity %s\n", (parity_calc == parity_got) ? "(OK)" : "(parity error)");
+ LOGP(DDMS, LOGL_DEBUG, "DMS parity %s\n", (parity_calc == parity_got) ? "(OK)" : "(parity error)");
if (parity_calc == parity_got) {
if (dms->rx_label.p == 1)
dms_rx_rr(nmt, dms->rx_label.d, dms->rx_label.s, dms->rx_label.n);
@@ -758,18 +759,18 @@ void dms_send(nmt_t *nmt, const uint8_t *data, int length, int eight_bits)
uint8_t frame[8];
int i, copied;
- PDEBUG(DDMS, DEBUG_DEBUG, "Received message with %d digits of %d bits\n", length, (eight_bits) ? 8 : 7);
+ LOGP(DDMS, LOGL_DEBUG, "Received message with %d digits of %d bits\n", length, (eight_bits) ? 8 : 7);
/* active connection */
if (dms->state.started) {
if (dms->state.eight_bits != eight_bits) {
- PDEBUG(DDMS, DEBUG_ERROR, "DMS session active, but upper layer sends wrong bit format!\n");
+ LOGP(DDMS, LOGL_ERROR, "DMS session active, but upper layer sends wrong bit format!\n");
return;
}
}
if (!dms->state.started) {
- PDEBUG(DDMS, DEBUG_DEBUG, "Transfer not started, so we send ID + RAND first\n");
+ LOGP(DDMS, LOGL_DEBUG, "Transfer not started, so we send ID + RAND first\n");
dms->state.started = 1;
dms->state.established = 0;
dms->state.eight_bits = eight_bits;
@@ -783,7 +784,7 @@ void dms_send(nmt_t *nmt, const uint8_t *data, int length, int eight_bits)
dms->state.rand_sent = 1;
}
- PDEBUG(DDMS, DEBUG_DEBUG, "Queueing message data as DT frames...\n");
+ LOGP(DDMS, LOGL_DEBUG, "Queueing message data as DT frames...\n");
while (length) {
if (eight_bits) {
/* copy what we have */
@@ -837,7 +838,7 @@ void dms_send(nmt_t *nmt, const uint8_t *data, int length, int eight_bits)
void dms_reset(nmt_t *nmt)
{
dms_t *dms = &nmt->dms;
- PDEBUG(DDMS, DEBUG_DEBUG, "Resetting DMS states\n");
+ LOGP(DDMS, LOGL_DEBUG, "Resetting DMS states\n");
dms->rx_in_sync = 0;
memset(&dms->state, 0, sizeof(dms->state));
diff --git a/src/nmt/dsp.c b/src/nmt/dsp.c
index e63ae45..0f39622 100644
--- a/src/nmt/dsp.c
+++ b/src/nmt/dsp.c
@@ -26,7 +26,7 @@
#include <errno.h>
#include <math.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "nmt.h"
#include "transaction.h"
#include "dsp.h"
@@ -89,7 +89,7 @@ void dsp_init(void)
int i;
double s;
- PDEBUG(DDSP, DEBUG_DEBUG, "Generating sine table for supervisory signal and dial tone.\n");
+ LOGP(DDSP, LOGL_DEBUG, "Generating sine table for supervisory signal and dial tone.\n");
for (i = 0; i < 65536; i++) {
s = sin((double)i / 65536.0 * 2.0 * PI);
/* supervisor sine */
@@ -97,6 +97,8 @@ void dsp_init(void)
/* dialtone sine */
dsp_sine_dialtone[i] = s * TX_PEAK_DIALTONE;
}
+
+ compandor_init();
}
static int fsk_send_bit(void *inst);
@@ -109,23 +111,23 @@ int dsp_init_sender(nmt_t *nmt, double deviation_factor)
int i;
/* attack (3ms) and recovery time (13.5ms) according to NMT specs */
- init_compandor(&nmt->cstate, 8000, 3.0, 13.5);
+ setup_compandor(&nmt->cstate, 8000, 3.0, 13.5);
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Init DSP for Transceiver.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Init DSP for Transceiver.\n");
/* set modulation parameters */
sender_set_fm(&nmt->sender, MAX_DEVIATION * deviation_factor, MAX_MODULATION * deviation_factor, SPEECH_DEVIATION * deviation_factor, MAX_DISPLAY);
- PDEBUG(DDSP, DEBUG_DEBUG, "Using FSK level of %.3f (%.3f KHz deviation @ 1500 Hz)\n", TX_PEAK_FSK * deviation_factor, 3.5 * deviation_factor);
- PDEBUG(DDSP, DEBUG_DEBUG, "Using Supervisory level of %.3f (%.3f KHz deviation @ 4015 Hz)\n", TX_PEAK_SUPER * deviation_factor, 0.3 * deviation_factor);
+ LOGP(DDSP, LOGL_DEBUG, "Using FSK level of %.3f (%.3f KHz deviation @ 1500 Hz)\n", TX_PEAK_FSK * deviation_factor, 3.5 * deviation_factor);
+ LOGP(DDSP, LOGL_DEBUG, "Using Supervisory level of %.3f (%.3f KHz deviation @ 4015 Hz)\n", TX_PEAK_SUPER * deviation_factor, 0.3 * deviation_factor);
/* init fsk */
if (fsk_mod_init(&nmt->fsk_mod, nmt, fsk_send_bit, nmt->sender.samplerate, BIT_RATE, F0, F1, TX_PEAK_FSK, 1, 0) < 0) {
- PDEBUG_CHAN(DDSP, DEBUG_ERROR, "FSK init failed!\n");
+ LOGP_CHAN(DDSP, LOGL_ERROR, "FSK init failed!\n");
return -EINVAL;
}
if (fsk_demod_init(&nmt->fsk_demod, nmt, fsk_receive_bit, nmt->sender.samplerate, BIT_RATE, F0, F1, BIT_ADJUST) < 0) {
- PDEBUG_CHAN(DDSP, DEBUG_ERROR, "FSK init failed!\n");
+ LOGP_CHAN(DDSP, LOGL_ERROR, "FSK init failed!\n");
return -EINVAL;
}
@@ -136,7 +138,7 @@ int dsp_init_sender(nmt_t *nmt, double deviation_factor)
nmt->super_samples = (int)((double)nmt->sender.samplerate * (1.0 / (SUPER_BANDWIDTH / 2)) + 0.5);
spl = calloc(1, nmt->super_samples * sizeof(*spl));
if (!spl) {
- PDEBUG(DDSP, DEBUG_ERROR, "No memory!\n");
+ LOGP(DDSP, LOGL_ERROR, "No memory!\n");
return -ENOMEM;
}
nmt->super_filter_spl = spl;
@@ -168,7 +170,7 @@ int dsp_init_sender(nmt_t *nmt, double deviation_factor)
/* Cleanup transceiver instance. */
void dsp_cleanup_sender(nmt_t *nmt)
{
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Cleanup DSP for Transceiver.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Cleanup DSP for Transceiver.\n");
fsk_mod_cleanup(&nmt->fsk_mod);
fsk_demod_cleanup(&nmt->fsk_demod);
@@ -281,7 +283,7 @@ static void super_decode(nmt_t *nmt, sample_t *samples, int length)
if (nmt->state == STATE_ACTIVE) {
if (++nmt->super_print == SUPER_PRINT) {
nmt->super_print = 0;
- PDEBUG_CHAN(DDSP, DEBUG_NOTICE, "Supervisory level %.0f%% quality %.0f%%\n", level * 100.0, quality * 100.0);
+ LOGP_CHAN(DDSP, LOGL_NOTICE, "Supervisory level %.0f%% quality %.0f%%\n", level * 100.0, quality * 100.0);
}
/* update measurements (if dmp_* params are NULL, we omit this) */
display_measurements_update(nmt->dmp_super_level, level * 100.0, 0.0);
@@ -294,7 +296,7 @@ static void super_decode(nmt_t *nmt, sample_t *samples, int length)
if (nmt->super_detect_count == SUPER_DETECT_COUNT) {
nmt->super_detected = 1;
nmt->super_detect_count = 0;
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Supervisory signal detected with level=%.0f%%, quality=%.0f%%.\n", result[0] / 0.63662 / TX_PEAK_SUPER * 100.0, quality * 100.0);
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Supervisory signal detected with level=%.0f%%, quality=%.0f%%.\n", result[0] / 0.63662 / TX_PEAK_SUPER * 100.0, quality * 100.0);
nmt_rx_super(nmt, 1, quality);
}
} else
@@ -305,7 +307,7 @@ static void super_decode(nmt_t *nmt, sample_t *samples, int length)
if (nmt->super_detect_count == SUPER_LOST_COUNT) {
nmt->super_detected = 0;
nmt->super_detect_count = 0;
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Supervisory signal lost.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Supervisory signal lost.\n");
nmt_rx_super(nmt, 0, 0.0);
}
} else
@@ -316,7 +318,7 @@ static void super_decode(nmt_t *nmt, sample_t *samples, int length)
/* Reset supervisory detection states, so ongoing tone will be detected again. */
void super_reset(nmt_t *nmt)
{
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Supervisory detector reset.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Supervisory detector reset.\n");
nmt->super_detected = 0;
nmt->super_detect_count = 0;
}
@@ -393,7 +395,7 @@ static int fsk_send_bit(void *inst)
frame = nmt_get_frame(nmt);
if (!frame) {
nmt->tx_frame_length = 0;
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Stop sending frames.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Stop sending frames.\n");
return -1;
}
memcpy(nmt->tx_frame, frame, 166);
@@ -459,7 +461,13 @@ again:
case DSP_MODE_AUDIO:
case DSP_MODE_DTMF:
input_num = samplerate_upsample_input_num(&sender->srstate, length);
- jitter_load(&sender->dejitter, samples, input_num);
+ {
+ int16_t spl[input_num];
+ jitter_load_samples(&sender->dejitter, (uint8_t *)spl, input_num, sizeof(*spl), jitter_conceal_s16, NULL);
+ int16_to_samples_speech(samples, spl, input_num);
+ }
+ if (nmt->compandor)
+ compress_audio(&nmt->cstate, samples, input_num);
samplerate_upsample(&sender->srstate, samples, input_num, samples, length);
/* send after dejitter, so audio is flushed */
if (nmt->dms.tx_frame_valid) {
@@ -490,7 +498,7 @@ again:
}
}
-const char *nmt_dsp_mode_name(enum dsp_mode mode)
+static const char *nmt_dsp_mode_name(enum dsp_mode mode)
{
static char invalid[16];
@@ -519,7 +527,33 @@ void nmt_set_dsp_mode(nmt_t *nmt, enum dsp_mode mode)
nmt->tx_frame_length = 0;
}
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "DSP mode %s -> %s\n", nmt_dsp_mode_name(nmt->dsp_mode), nmt_dsp_mode_name(mode));
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "DSP mode %s -> %s\n", nmt_dsp_mode_name(nmt->dsp_mode), nmt_dsp_mode_name(mode));
+ if ((mode == DSP_MODE_AUDIO || mode == DSP_MODE_DTMF) && (nmt->dsp_mode != DSP_MODE_AUDIO && nmt->dsp_mode != DSP_MODE_DTMF))
+ jitter_reset(&nmt->sender.dejitter);
+
nmt->dsp_mode = mode;
}
+/* Receive audio from call instance. */
+void call_down_audio(void *decoder, void *decoder_priv, int callref, uint16_t sequence, uint8_t marker, uint32_t timestamp, uint32_t ssrc, uint8_t *payload, int payload_len)
+{
+ transaction_t *trans;
+ nmt_t *nmt;
+
+ trans = get_transaction_by_callref(callref);
+ if (!trans)
+ return;
+ nmt = trans->nmt;
+ if (!nmt)
+ return;
+
+ if (nmt->dsp_mode == DSP_MODE_AUDIO || nmt->dsp_mode == DSP_MODE_DTMF) {
+ jitter_frame_t *jf;
+ jf = jitter_frame_alloc(decoder, decoder_priv, payload, payload_len, marker, sequence, timestamp, ssrc);
+ if (jf)
+ jitter_save(&nmt->sender.dejitter, jf);
+ }
+}
+
+void call_down_clock(void) {}
+
diff --git a/src/nmt/frame.c b/src/nmt/frame.c
index 999efdd..31cb2fa 100644
--- a/src/nmt/frame.c
+++ b/src/nmt/frame.c
@@ -23,7 +23,7 @@
#include <string.h>
#include <inttypes.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../libhagelbarger/hagelbarger.h"
#include "nmt.h"
#include "frame.h"
@@ -680,7 +680,7 @@ static struct nmt_parameter {
/* Depending on P-value, direction and additional info, frame index (used for
* nmt_frame[]) is decoded.
*/
-enum nmt_mt decode_frame_mt(const uint8_t *digits, enum nmt_direction direction, int callack)
+static enum nmt_mt decode_frame_mt(const uint8_t *digits, enum nmt_direction direction, int callack)
{
if (direction == MS_TO_MTX || direction == BS_TO_MTX || direction == XX_TO_MTX) {
/* MS/BS TO MTX */
@@ -854,7 +854,7 @@ int init_frame(void)
for (i = 0; nmt_frame[i].digits; i++) {
/* check message type */
if ((int)nmt_frame[i].message_type != i) {
- PDEBUG(DFRAME, DEBUG_ERROR, "Message type at message index #%d does not have a value of %d, but has %d, please fix!\n", i, i + 1, nmt_frame[i].message_type);
+ LOGP(DFRAME, LOGL_ERROR, "Message type at message index #%d does not have a value of %d, but has %d, please fix!\n", i, i + 1, nmt_frame[i].message_type);
return -1;
}
/* check IEs */
@@ -867,7 +867,7 @@ int init_frame(void)
break;
}
if (!nmt_parameter[k].digit) {
- PDEBUG(DFRAME, DEBUG_ERROR, "Digit '%c' in message index %d does not exist, please fix!\n", digit, i);
+ LOGP(DFRAME, LOGL_ERROR, "Digit '%c' in message index %d does not exist, please fix!\n", digit, i);
return -1;
}
}
@@ -894,7 +894,7 @@ static void disassemble_frame(int nmt_system, frame_t *frame, const uint8_t *dig
/* update direction */
direction = nmt_frame[mt].direction;
- PDEBUG(DFRAME, DEBUG_DEBUG, "Decoding %s %s %s\n", nmt_dir_name(direction), nmt_frame[mt].nr, nmt_frame[mt].description);
+ LOGP(DFRAME, LOGL_DEBUG, "Decoding %s %s %s\n", nmt_dir_name(direction), nmt_frame[mt].nr, nmt_frame[mt].description);
for (i = 0; i < 16; i++) {
digit = nmt_frame[mt].digits[i];
@@ -983,28 +983,28 @@ static void disassemble_frame(int nmt_system, frame_t *frame, const uint8_t *dig
frame->waiting_info = value;
break;
default:
- PDEBUG(DFRAME, DEBUG_ERROR, "Digit '%c' does not exist, please fix!\n", digit);
+ LOGP(DFRAME, LOGL_ERROR, "Digit '%c' does not exist, please fix!\n", digit);
abort();
}
- if (debuglevel <= DEBUG_DEBUG) {
+ if (loglevel <= LOGL_DEBUG) {
for (j = 0; nmt_parameter[j].digit; j++) {
if (nmt_parameter[j].system != 0 && nmt_parameter[j].system != nmt_system)
continue;
if (nmt_parameter[j].digit == digit) {
- PDEBUG(DFRAME, DEBUG_DEBUG, " %c: %s\n", digit, nmt_parameter[j].decoder(value, ndigits, direction));
+ LOGP(DFRAME, LOGL_DEBUG, " %c: %s\n", digit, nmt_parameter[j].decoder(value, ndigits, direction));
}
}
}
}
- if (debuglevel <= DEBUG_DEBUG) {
+ if (loglevel <= LOGL_DEBUG) {
char debug_digits[17];
for (i = 0; i < 16; i++)
debug_digits[i] = "0123456789abcdef"[digits[i]];
debug_digits[i] = '\0';
- PDEBUG(DFRAME, DEBUG_DEBUG, "%s\n", nmt_frame[mt].digits);
- PDEBUG(DFRAME, DEBUG_DEBUG, "%s\n", debug_digits);
+ LOGP(DFRAME, LOGL_DEBUG, "%s\n", nmt_frame[mt].digits);
+ LOGP(DFRAME, LOGL_DEBUG, "%s\n", debug_digits);
}
}
@@ -1020,7 +1020,7 @@ static void assemble_frame(int nmt_system, frame_t *frame, uint8_t *digits, int
mt = frame->mt;
if ((int)mt >= num_frames) {
- PDEBUG(DFRAME, DEBUG_ERROR, "Frame mt %d out of range (0..%d), please fix!\n", mt, num_frames - 1);
+ LOGP(DFRAME, LOGL_ERROR, "Frame mt %d out of range (0..%d), please fix!\n", mt, num_frames - 1);
abort();
}
@@ -1031,7 +1031,7 @@ static void assemble_frame(int nmt_system, frame_t *frame, uint8_t *digits, int
direction = nmt_frame[mt].direction;
if (debug)
- PDEBUG(DFRAME, DEBUG_DEBUG, "Coding %s %s %s\n", nmt_dir_name(direction), nmt_frame[mt].nr, nmt_frame[mt].description);
+ LOGP(DFRAME, LOGL_DEBUG, "Coding %s %s %s\n", nmt_dir_name(direction), nmt_frame[mt].nr, nmt_frame[mt].description);
for (i = 15; i >= 0; i--) {
digit = nmt_frame[mt].digits[i];
@@ -1113,7 +1113,7 @@ static void assemble_frame(int nmt_system, frame_t *frame, uint8_t *digits, int
value = frame->waiting_info;
break;
default:
- PDEBUG(DFRAME, DEBUG_ERROR, "Digit '%c' does not exist, please fix!\n", digit);
+ LOGP(DFRAME, LOGL_ERROR, "Digit '%c' does not exist, please fix!\n", digit);
abort();
}
@@ -1127,7 +1127,7 @@ static void assemble_frame(int nmt_system, frame_t *frame, uint8_t *digits, int
i--;
}
}
- if (debug && debuglevel <= DEBUG_DEBUG) {
+ if (debug && loglevel <= LOGL_DEBUG) {
char debug_digits[17];
int ndigits;
@@ -1148,7 +1148,7 @@ static void assemble_frame(int nmt_system, frame_t *frame, uint8_t *digits, int
if (nmt_parameter[j].system != 0 && nmt_parameter[j].system != nmt_system)
continue;
if (nmt_parameter[j].digit == digit) {
- PDEBUG(DFRAME, DEBUG_DEBUG, " %c: %s\n", digit, nmt_parameter[j].decoder(value, ndigits, direction));
+ LOGP(DFRAME, LOGL_DEBUG, " %c: %s\n", digit, nmt_parameter[j].decoder(value, ndigits, direction));
}
}
}
@@ -1156,8 +1156,8 @@ static void assemble_frame(int nmt_system, frame_t *frame, uint8_t *digits, int
for (i = 0; i < 16; i++)
debug_digits[i] = "0123456789abcdef"[digits[i]];
debug_digits[i] = '\0';
- PDEBUG(DFRAME, DEBUG_DEBUG, "%s\n", nmt_frame[mt].digits);
- PDEBUG(DFRAME, DEBUG_DEBUG, "%s\n", debug_digits);
+ LOGP(DFRAME, LOGL_DEBUG, "%s\n", nmt_frame[mt].digits);
+ LOGP(DFRAME, LOGL_DEBUG, "%s\n", debug_digits);
}
}
diff --git a/src/nmt/main.c b/src/nmt/main.c
index f6ea447..5a5715e 100644
--- a/src/nmt/main.c
+++ b/src/nmt/main.c
@@ -28,7 +28,7 @@
#include <sys/stat.h>
#include "../libsample/sample.h"
#include "../libmobile/main_mobile.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../liboptions/options.h"
#include "nmt.h"
#include "frame.h"
@@ -432,6 +432,7 @@ fail:
nmt_destroy(sender_head);
/* exits */
+ main_mobile_exit();
fm_exit();
options_free();
diff --git a/src/nmt/nmt.c b/src/nmt/nmt.c
index 8a49dc5..a0ee610 100644
--- a/src/nmt/nmt.c
+++ b/src/nmt/nmt.c
@@ -26,9 +26,11 @@
#include <errno.h>
#include <time.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../libmobile/cause.h"
-#include "../libosmocc/message.h"
+#include "../libmobile/get_time.h"
+#include "../libmobile/console.h"
+#include <osmocom/cc/message.h>
#include "nmt.h"
#include "transaction.h"
#include "dsp.h"
@@ -51,19 +53,19 @@
static int sms_ref = 0;
/* Timers */
-#define PAGING_TO 1.0 /* wait for paging response: fictive value */
-#define RELEASE_TO 2.0 /* how long do we wait for release guard of the phone */
-#define DIALING_TO 1.0 /* if we have a pause during dialing, we abort the call */
-#define CHANNEL_TO 2.0 /* how long do we wait for phone to appear on assigned channel */
-#define RINGING_TO 60.0 /* how long may the phone ring */
-#define SUPERVISORY_TO1 3.0 /* 3 sec to detect after setup */
-#define SUPERVISORY_TO2 20.0 /* 20 sec lost until abort */
+#define PAGING_TO 1,0 /* wait for paging response: fictive value */
+#define RELEASE_TO 2,0 /* how long do we wait for release guard of the phone */
+#define DIALING_TO 1,0 /* if we have a pause during dialing, we abort the call */
+#define CHANNEL_TO 2,0 /* how long do we wait for phone to appear on assigned channel */
+#define RINGING_TO 60,0 /* how long may the phone ring */
+#define SUPERVISORY_TO1 3 /* 3 sec to detect after setup */
+#define SUPERVISORY_TO2 20,0 /* 20 sec lost until abort */
#define DTMF_DURATION 0.1 /* 100ms */
/* Counters */
#define PAGE_TRIES 3 /* How many time do we try to page the phone */
-const char *nmt_state_name(enum nmt_state state)
+static const char *nmt_state_name(enum nmt_state state)
{
static char invalid[16];
@@ -108,7 +110,7 @@ const char *nmt_state_name(enum nmt_state state)
return invalid;
}
-void nmt_display_status(void)
+static void nmt_display_status(void)
{
sender_t *sender;
nmt_t *nmt;
@@ -127,7 +129,7 @@ static void nmt_new_state(nmt_t *nmt, enum nmt_state new_state)
{
if (nmt->state == new_state)
return;
- PDEBUG_CHAN(DNMT, DEBUG_DEBUG, "State change: %s -> %s\n", nmt_state_name(nmt->state), nmt_state_name(new_state));
+ LOGP_CHAN(DNMT, LOGL_DEBUG, "State change: %s -> %s\n", nmt_state_name(nmt->state), nmt_state_name(new_state));
nmt->state = new_state;
nmt_display_status();
}
@@ -226,11 +228,11 @@ const char *nmt_dir_name(enum nmt_direction dir)
static int dialstring2number(const char *dialstring, char *ms_country, char *ms_number)
{
if (strlen(dialstring) != 7) {
- PDEBUG(DNMT, DEBUG_NOTICE, "Wrong number of digits, use 7 digits: ZXXXXXX (Z=country, X=mobile number)\n");
+ LOGP(DNMT, LOGL_NOTICE, "Wrong number of digits, use 7 digits: ZXXXXXX (Z=country, X=mobile number)\n");
return -1;
}
if (dialstring[0] < '0' || dialstring[0] > '9') {
- PDEBUG(DNMT, DEBUG_NOTICE, "Invalid country digit (first digit) of dial string\n");
+ LOGP(DNMT, LOGL_NOTICE, "Invalid country digit (first digit) of dial string\n");
return -1;
}
*ms_country = dialstring[0];
@@ -259,7 +261,7 @@ static inline int is_chan_class_tc(enum nmt_chan_type chan_type)
return 0;
}
-static void nmt_timeout(struct timer *timer);
+static void nmt_timeout(void *data);
/* Create transceiver instance and link to a list. */
int nmt_create(int nmt_system, const char *country, const char *kanal, enum nmt_chan_type chan_type, const char *device, int use_sdr, int samplerate, double rx_gain, double tx_gain, int pre_emphasis, int de_emphasis, const char *write_rx_wave, const char *write_tx_wave, const char *read_rx_wave, const char *read_tx_wave, uint8_t ms_power, uint8_t traffic_area, uint8_t area_no, int compandor, int supervisory, const char *smsc_number, int send_callerid, int send_clock, int loopback)
@@ -272,46 +274,46 @@ int nmt_create(int nmt_system, const char *country, const char *kanal, enum nmt_
/* check channel matching and set deviation factor */
if (nmt_channel2freq(nmt_system, country, atoi(kanal), 0, &deviation_factor, &scandinavia, &tested) == 0.0) {
- PDEBUG(DNMT, DEBUG_NOTICE, "Channel number %s invalid, use '-Y list' to get a list of available channels.\n", kanal);
+ LOGP(DNMT, LOGL_NOTICE, "Channel number %s invalid, use '-Y list' to get a list of available channels.\n", kanal);
return -EINVAL;
}
if (!tested) {
- PDEBUG(DNMT, DEBUG_NOTICE, "*** The given NMT country has not been tested yet. Please tell the Author, if it works.\n");
+ LOGP(DNMT, LOGL_NOTICE, "*** The given NMT country has not been tested yet. Please tell the Author, if it works.\n");
}
if (scandinavia && atoi(kanal) >= 201) {
- PDEBUG(DNMT, DEBUG_NOTICE, "*** Channels numbers above 200 have been specified, but never used. These 'interleaved channels are probably not supports by the phone.\n");
+ LOGP(DNMT, LOGL_NOTICE, "*** Channels numbers above 200 have been specified, but never used. These 'interleaved channels are probably not supports by the phone.\n");
}
if (scandinavia && atoi(kanal) >= 181 && atoi(kanal) <= 200) {
- PDEBUG(DNMT, DEBUG_NOTICE, "Extended channel numbers (181..200) have been specified, but never been supported for sure. There is no phone to test with, so don't use it!\n");
+ LOGP(DNMT, LOGL_NOTICE, "Extended channel numbers (181..200) have been specified, but never been supported for sure. There is no phone to test with, so don't use it!\n");
}
if (chan_type == CHAN_TYPE_TEST && !loopback) {
- PDEBUG(DNMT, DEBUG_NOTICE, "*** Selected channel can be used for nothing but testing signal decoder.\n");
+ LOGP(DNMT, LOGL_NOTICE, "*** Selected channel can be used for nothing but testing signal decoder.\n");
}
if (chan_type == CHAN_TYPE_CC_TC && send_clock) {
- PDEBUG(DNMT, DEBUG_NOTICE, "*** Sending clock on combined CC + TC is not applicable.\n");
+ LOGP(DNMT, LOGL_NOTICE, "*** Sending clock on combined CC + TC is not applicable.\n");
}
nmt = calloc(1, sizeof(nmt_t));
if (!nmt) {
- PDEBUG(DNMT, DEBUG_ERROR, "No memory!\n");
+ LOGP(DNMT, LOGL_ERROR, "No memory!\n");
return -ENOMEM;
}
- PDEBUG(DNMT, DEBUG_DEBUG, "Creating 'NMT' instance for channel = %s (sample rate %d).\n", kanal, samplerate);
+ LOGP(DNMT, LOGL_DEBUG, "Creating 'NMT' instance for channel = %s (sample rate %d).\n", kanal, samplerate);
/* init general part of transceiver */
rc = sender_create(&nmt->sender, kanal, nmt_channel2freq(nmt_system, country, atoi(kanal), 0, NULL, NULL, NULL), nmt_channel2freq(nmt_system, country, atoi(kanal), 1, NULL, NULL, NULL), 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_NONE);
if (rc < 0) {
- PDEBUG(DNMT, DEBUG_ERROR, "Failed to init transceiver process!\n");
+ LOGP(DNMT, LOGL_ERROR, "Failed to init transceiver process!\n");
goto error;
}
- timer_init(&nmt->timer, nmt_timeout, nmt);
+ osmo_timer_setup(&nmt->timer, nmt_timeout, nmt);
nmt->sysinfo.system = nmt_system;
nmt->sysinfo.chan_type = chan_type;
nmt->sysinfo.ms_power = ms_power;
@@ -326,35 +328,35 @@ int nmt_create(int nmt_system, const char *country, const char *kanal, enum nmt_
/* init audio processing */
rc = dsp_init_sender(nmt, deviation_factor);
if (rc < 0) {
- PDEBUG(DNMT, DEBUG_ERROR, "Failed to init audio processing!\n");
+ LOGP(DNMT, LOGL_ERROR, "Failed to init audio processing!\n");
goto error;
}
/* init DMS processing */
rc = dms_init_sender(nmt);
if (rc < 0) {
- PDEBUG(DNMT, DEBUG_ERROR, "Failed to init DMS processing!\n");
+ LOGP(DNMT, LOGL_ERROR, "Failed to init DMS processing!\n");
goto error;
}
/* init SMS processing */
rc = sms_init_sender(nmt);
if (rc < 0) {
- PDEBUG(DNMT, DEBUG_ERROR, "Failed to init SMS processing!\n");
+ LOGP(DNMT, LOGL_ERROR, "Failed to init SMS processing!\n");
goto error;
}
/* go into idle state */
nmt_go_idle(nmt);
- PDEBUG(DNMT, DEBUG_NOTICE, "Created channel #%s of type '%s' = %s\n", kanal, chan_type_short_name(nmt_system, chan_type), chan_type_long_name(nmt_system, chan_type));
+ LOGP(DNMT, LOGL_NOTICE, "Created channel #%s of type '%s' = %s\n", kanal, chan_type_short_name(nmt_system, chan_type), chan_type_long_name(nmt_system, chan_type));
if (nmt_long_name_by_short_name(nmt_system, country))
- PDEBUG(DNMT, DEBUG_NOTICE, " -> Using country '%s'\n", nmt_long_name_by_short_name(nmt_system, country));
- PDEBUG(DNMT, DEBUG_NOTICE, " -> Using traffic area %d,%d and area no %d\n", traffic_area >> 4, (nmt_system == 450) ? nmt_flip_ten((traffic_area & 0xf)) : (traffic_area & 0xf), area_no);
+ LOGP(DNMT, LOGL_NOTICE, " -> Using country '%s'\n", nmt_long_name_by_short_name(nmt_system, country));
+ LOGP(DNMT, LOGL_NOTICE, " -> Using traffic area %d,%d and area no %d\n", traffic_area >> 4, (nmt_system == 450) ? nmt_flip_ten((traffic_area & 0xf)) : (traffic_area & 0xf), area_no);
if (nmt->supervisory)
- PDEBUG(DNMT, DEBUG_NOTICE, " -> Using supervisory signal %d\n", supervisory);
+ LOGP(DNMT, LOGL_NOTICE, " -> Using supervisory signal %d\n", supervisory);
else
- PDEBUG(DNMT, DEBUG_NOTICE, " -> Using no supervisory signal\n");
+ LOGP(DNMT, LOGL_NOTICE, " -> Using no supervisory signal\n");
return 0;
@@ -392,35 +394,35 @@ void nmt_check_channels(int __attribute__((unused)) nmt_system)
}
}
if ((cca || ccb) && !tc) {
- PDEBUG(DNMT, DEBUG_NOTICE, "\n");
- PDEBUG(DNMT, DEBUG_NOTICE, "*** Selected channel(s) can be used for control only.\n");
- PDEBUG(DNMT, DEBUG_NOTICE, "*** No registration and no call is possible.\n");
- PDEBUG(DNMT, DEBUG_NOTICE, "*** Use at least one 'TC' or use combined 'CC/TC'!\n");
+ LOGP(DNMT, LOGL_NOTICE, "\n");
+ LOGP(DNMT, LOGL_NOTICE, "*** Selected channel(s) can be used for control only.\n");
+ LOGP(DNMT, LOGL_NOTICE, "*** No registration and no call is possible.\n");
+ LOGP(DNMT, LOGL_NOTICE, "*** Use at least one 'TC' or use combined 'CC/TC'!\n");
note = 1;
}
if (tc && !(cca || ccb)) {
- PDEBUG(DNMT, DEBUG_NOTICE, "\n");
- PDEBUG(DNMT, DEBUG_NOTICE, "*** Selected channel(s) can be used for traffic only.\n");
- PDEBUG(DNMT, DEBUG_NOTICE, "*** No call to the mobile phone is possible.\n");
- PDEBUG(DNMT, DEBUG_NOTICE, "*** Use one 'CC' or use combined 'CC/TC'!\n");
+ LOGP(DNMT, LOGL_NOTICE, "\n");
+ LOGP(DNMT, LOGL_NOTICE, "*** Selected channel(s) can be used for traffic only.\n");
+ LOGP(DNMT, LOGL_NOTICE, "*** No call to the mobile phone is possible.\n");
+ LOGP(DNMT, LOGL_NOTICE, "*** Use one 'CC' or use combined 'CC/TC'!\n");
note = 1;
}
if (cca && !ccb) {
- PDEBUG(DNMT, DEBUG_NOTICE, "\n");
- PDEBUG(DNMT, DEBUG_NOTICE, "*** Selected channel(s) can be used for control of MS type A only.\n");
- PDEBUG(DNMT, DEBUG_NOTICE, "*** No call to the MS type B phone is possible.\n");
- PDEBUG(DNMT, DEBUG_NOTICE, "*** Use one 'CC' instead!\n");
+ LOGP(DNMT, LOGL_NOTICE, "\n");
+ LOGP(DNMT, LOGL_NOTICE, "*** Selected channel(s) can be used for control of MS type A only.\n");
+ LOGP(DNMT, LOGL_NOTICE, "*** No call to the MS type B phone is possible.\n");
+ LOGP(DNMT, LOGL_NOTICE, "*** Use one 'CC' instead!\n");
note = 1;
}
if (!cca && ccb) {
- PDEBUG(DNMT, DEBUG_NOTICE, "\n");
- PDEBUG(DNMT, DEBUG_NOTICE, "*** Selected channel(s) can be used for control of MS type B only.\n");
- PDEBUG(DNMT, DEBUG_NOTICE, "*** No call to the MS type A phone is possible.\n");
- PDEBUG(DNMT, DEBUG_NOTICE, "*** Use one 'CC' instead!\n");
+ LOGP(DNMT, LOGL_NOTICE, "\n");
+ LOGP(DNMT, LOGL_NOTICE, "*** Selected channel(s) can be used for control of MS type B only.\n");
+ LOGP(DNMT, LOGL_NOTICE, "*** No call to the MS type A phone is possible.\n");
+ LOGP(DNMT, LOGL_NOTICE, "*** Use one 'CC' instead!\n");
note = 1;
}
if (note)
- PDEBUG(DNMT, DEBUG_NOTICE, "\n");
+ LOGP(DNMT, LOGL_NOTICE, "\n");
}
/* Destroy transceiver instance and unlink from list. */
@@ -428,11 +430,11 @@ void nmt_destroy(sender_t *sender)
{
nmt_t *nmt = (nmt_t *) sender;
- PDEBUG(DNMT, DEBUG_DEBUG, "Destroying 'NMT' instance for channel = %s.\n", sender->kanal);
+ LOGP(DNMT, LOGL_DEBUG, "Destroying 'NMT' instance for channel = %s.\n", sender->kanal);
dsp_cleanup_sender(nmt);
dms_cleanup_sender(nmt);
sms_cleanup_sender(nmt);
- timer_exit(&nmt->timer);
+ osmo_timer_del(&nmt->timer);
sender_destroy(&nmt->sender);
free(nmt);
}
@@ -440,11 +442,11 @@ void nmt_destroy(sender_t *sender)
/* Abort connection towards mobile station by sending idle digits. */
void nmt_go_idle(nmt_t *nmt)
{
- timer_stop(&nmt->timer);
+ osmo_timer_del(&nmt->timer);
dms_reset(nmt);
sms_reset(nmt);
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Entering IDLE state, sending idle frames on %s.\n", chan_type_long_name(nmt->sysinfo.system, nmt->sysinfo.chan_type));
+ LOGP_CHAN(DNMT, LOGL_INFO, "Entering IDLE state, sending idle frames on %s.\n", chan_type_long_name(nmt->sysinfo.system, nmt->sysinfo.chan_type));
nmt->trans = NULL; /* remove transaction before state change, so status is shown correctly */
nmt_new_state(nmt, STATE_IDLE);
nmt_set_dsp_mode(nmt, DSP_MODE_FRAME);
@@ -462,17 +464,17 @@ static void nmt_release(nmt_t *nmt)
{
transaction_t *trans = nmt->trans;
- timer_stop(&nmt->timer);
+ osmo_timer_del(&nmt->timer);
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Releasing connection towards mobile station.\n");
+ LOGP_CHAN(DNMT, LOGL_INFO, "Releasing connection towards mobile station.\n");
if (trans->callref) {
- PDEBUG_CHAN(DNMT, DEBUG_ERROR, "Callref already set, please fix!\n");
+ LOGP_CHAN(DNMT, LOGL_ERROR, "Callref already set, please fix!\n");
abort();
}
nmt_new_state(nmt, STATE_MT_RELEASE);
nmt->tx_frame_count = 0;
nmt_set_dsp_mode(nmt, DSP_MODE_FRAME);
- timer_start(&nmt->timer, RELEASE_TO);
+ osmo_timer_schedule(&nmt->timer, RELEASE_TO);
}
/* Enter paging state and transmit phone's number on calling channel */
@@ -481,9 +483,9 @@ static void nmt_page(transaction_t *trans, int try)
sender_t *sender;
nmt_t *nmt;
- PDEBUG(DNMT, DEBUG_INFO, "Entering paging state (try %d), sending call to '%c,%s'.\n", try, trans->subscriber.country, trans->subscriber.number);
+ LOGP(DNMT, LOGL_INFO, "Entering paging state (try %d), sending call to '%c,%s'.\n", try, trans->subscriber.country, trans->subscriber.number);
trans->page_try = try;
- timer_start(&trans->timer, PAGING_TO);
+ osmo_timer_schedule(&trans->timer, PAGING_TO);
/* page on all CC (CC/TC) */
for (sender = sender_head; sender; sender = sender->next) {
nmt = (nmt_t *)sender;
@@ -492,7 +494,7 @@ static void nmt_page(transaction_t *trans, int try)
/* page on all idle channels and on channels we previously paged */
if (nmt->state != STATE_IDLE && nmt->trans != trans)
continue;
- PDEBUG(DNMT, DEBUG_INFO, "Paging on channel %s.\n", sender->kanal);
+ LOGP(DNMT, LOGL_INFO, "Paging on channel %s.\n", sender->kanal);
nmt->trans = trans; /* add transaction before state change, so status is shown correctly */
nmt_new_state(nmt, STATE_MT_PAGING);
nmt_set_dsp_mode(nmt, DSP_MODE_FRAME);
@@ -535,12 +537,12 @@ static int match_channel(nmt_t *nmt, frame_t *frame)
/* check channel match */
rc = nmt_decode_channel(nmt->sysinfo.system, frame->channel_no, &channel, &power);
if (rc < 0) {
- PDEBUG_CHAN(DNMT, DEBUG_NOTICE, "Frame with illegal encoded channel received, ignoring.\n");
+ LOGP_CHAN(DNMT, LOGL_NOTICE, "Frame with illegal encoded channel received, ignoring.\n");
return 0;
}
/* in case of interleaved channel, ignore the missing upper bit */
if ((channel % 1024) != (atoi(nmt->sender.kanal) % 1024)) {
- PDEBUG_CHAN(DNMT, DEBUG_NOTICE, "Frame for different channel %d received, ignoring.\n", channel);
+ LOGP_CHAN(DNMT, LOGL_NOTICE, "Frame for different channel %d received, ignoring.\n", channel);
return 0;
}
@@ -559,13 +561,13 @@ static int match_area(nmt_t *nmt, frame_t *frame)
if (area_no == 0 && nmt->sysinfo.area_no != 0)
area_no = 4;
if (area_no != nmt->sysinfo.area_no) {
- PDEBUG_CHAN(DNMT, DEBUG_NOTICE, "Received area no (%d) does not match the base station's area no (%d), ignoring.\n", area_no, nmt->sysinfo.area_no);
+ LOGP_CHAN(DNMT, LOGL_NOTICE, "Received area no (%d) does not match the base station's area no (%d), ignoring.\n", area_no, nmt->sysinfo.area_no);
return 0;
}
traffic_area = ((frame->area_info & 0x3) << 4) | frame->traffic_area;
if (nmt->sysinfo.traffic_area != 0 && (nmt->sysinfo.traffic_area & 0x3f) != traffic_area) {
- PDEBUG_CHAN(DNMT, DEBUG_NOTICE, "Received 6 bits of traffic area (0x%02x) does not match the 6 bits of base station's traffic area (0x%02x), ignoring.\n", nmt->sysinfo.traffic_area & 0x3f, traffic_area);
+ LOGP_CHAN(DNMT, LOGL_NOTICE, "Received 6 bits of traffic area (0x%02x) does not match the 6 bits of base station's traffic area (0x%02x), ignoring.\n", nmt->sysinfo.traffic_area & 0x3f, traffic_area);
return 0;
}
skip_area:
@@ -577,11 +579,11 @@ skip_area:
static int match_subscriber(transaction_t *trans, frame_t *frame)
{
if (nmt_digits2value(&trans->subscriber.country, 1) != frame->ms_country) {
- PDEBUG(DNMT, DEBUG_NOTICE, "Received non matching subscriber counrtry, ignoring.\n");
+ LOGP(DNMT, LOGL_NOTICE, "Received non matching subscriber counrtry, ignoring.\n");
return 0;
}
if (nmt_digits2value(trans->subscriber.number, 6) != frame->ms_number) {
- PDEBUG(DNMT, DEBUG_NOTICE, "Received non matching subscriber number, ignoring.\n");
+ LOGP(DNMT, LOGL_NOTICE, "Received non matching subscriber number, ignoring.\n");
return 0;
}
@@ -692,12 +694,12 @@ static void rx_idle(nmt_t *nmt, frame_t *frame)
nmt_value2digits(frame->ms_country, &subscr.country, 1);
nmt_value2digits(frame->ms_number, subscr.number, 6);
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Received roaming seizure from subscriber %c,%s\n", subscr.country, subscr.number);
+ LOGP_CHAN(DNMT, LOGL_INFO, "Received roaming seizure from subscriber %c,%s\n", subscr.country, subscr.number);
/* create transaction */
trans = create_transaction(&subscr);
if (!trans) {
- PDEBUG(DNMT, DEBUG_NOTICE, "Failed to create transaction!\n");
+ LOGP(DNMT, LOGL_NOTICE, "Failed to create transaction!\n");
break;
}
@@ -722,12 +724,12 @@ static void rx_idle(nmt_t *nmt, frame_t *frame)
if (frame->mt == NMT_MESSAGE_12)
subscr.coinbox = 1;
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Received call from subscriber %c,%s%s\n", subscr.country, subscr.number, (subscr.coinbox) ? " (coinbox)" : "");
+ LOGP_CHAN(DNMT, LOGL_INFO, "Received call from subscriber %c,%s%s\n", subscr.country, subscr.number, (subscr.coinbox) ? " (coinbox)" : "");
/* create transaction */
trans = create_transaction(&subscr);
if (!trans) {
- PDEBUG(DNMT, DEBUG_NOTICE, "Failed to create transaction!\n");
+ LOGP(DNMT, LOGL_NOTICE, "Failed to create transaction!\n");
break;
}
@@ -742,7 +744,7 @@ static void rx_idle(nmt_t *nmt, frame_t *frame)
case NMT_MESSAGE_13a: /* line signal */
break;
default:
- PDEBUG_CHAN(DNMT, DEBUG_DEBUG, "Dropping message %s in state %s\n", nmt_frame_name(frame->mt), nmt_state_name(nmt->state));
+ LOGP_CHAN(DNMT, LOGL_DEBUG, "Dropping message %s in state %s\n", nmt_frame_name(frame->mt), nmt_state_name(nmt->state));
}
}
@@ -753,10 +755,10 @@ static void rx_idle(nmt_t *nmt, frame_t *frame)
static void tx_roaming_ident(nmt_t *nmt, frame_t *frame)
{
if (++nmt->tx_frame_count == 1)
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Sending identity request.\n");
+ LOGP_CHAN(DNMT, LOGL_INFO, "Sending identity request.\n");
tx_ident(nmt, frame);
if (nmt->tx_frame_count == 8) {
- PDEBUG_CHAN(DNMT, DEBUG_NOTICE, "Timeout waiting for identity reply\n");
+ LOGP_CHAN(DNMT, LOGL_NOTICE, "Timeout waiting for identity reply\n");
nmt_release(nmt);
}
}
@@ -774,16 +776,17 @@ static void rx_roaming_ident(nmt_t *nmt, frame_t *frame)
if (!match_subscriber(trans, frame))
break;
if (nmt->rx_frame_count < 2) {
- PDEBUG_CHAN(DNMT, DEBUG_DEBUG, "Skipping second seizure frame\n");
+ LOGP_CHAN(DNMT, LOGL_DEBUG, "Skipping second seizure frame\n");
break;
}
nmt_value2digits(frame->ms_password, trans->subscriber.password, 3);
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Received identity confirm (password %s).\n", trans->subscriber.password);
+ LOGP_CHAN(DNMT, LOGL_INFO, "Received identity confirm (password %s).\n", trans->subscriber.password);
nmt_new_state(nmt, STATE_ROAMING_CONFIRM);
nmt->tx_frame_count = 0;
+ console_inscription(&trans->subscriber.country);
break;
default:
- PDEBUG_CHAN(DNMT, DEBUG_DEBUG, "Dropping message %s in state %s\n", nmt_frame_name(frame->mt), nmt_state_name(nmt->state));
+ LOGP_CHAN(DNMT, LOGL_DEBUG, "Dropping message %s in state %s\n", nmt_frame_name(frame->mt), nmt_state_name(nmt->state));
}
}
@@ -791,7 +794,7 @@ static void tx_roaming_confirm(nmt_t *nmt, frame_t *frame)
{
set_line_signal(nmt, frame, 3);
if (++nmt->tx_frame_count == 1)
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Send 'Roaming updating confirmation'.\n");
+ LOGP_CHAN(DNMT, LOGL_INFO, "Send 'Roaming updating confirmation'.\n");
if (nmt->tx_frame_count == 2)
nmt_release(nmt); /* continue with this frame, then release */
}
@@ -800,7 +803,7 @@ static void rx_roaming_confirm(nmt_t *nmt, frame_t *frame)
{
switch (frame->mt) {
default:
- PDEBUG_CHAN(DNMT, DEBUG_DEBUG, "Dropping message %s in state %s\n", nmt_frame_name(frame->mt), nmt_state_name(nmt->state));
+ LOGP_CHAN(DNMT, LOGL_DEBUG, "Dropping message %s in state %s\n", nmt_frame_name(frame->mt), nmt_state_name(nmt->state));
}
}
@@ -811,10 +814,10 @@ static void rx_roaming_confirm(nmt_t *nmt, frame_t *frame)
static void tx_mo_ident(nmt_t *nmt, frame_t *frame)
{
if (++nmt->tx_frame_count == 1)
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Sending identity request.\n");
+ LOGP_CHAN(DNMT, LOGL_INFO, "Sending identity request.\n");
tx_ident(nmt, frame);
if (nmt->tx_frame_count == 8) {
- PDEBUG_CHAN(DNMT, DEBUG_NOTICE, "Timeout waiting for identity reply\n");
+ LOGP_CHAN(DNMT, LOGL_NOTICE, "Timeout waiting for identity reply\n");
nmt_release(nmt);
}
}
@@ -831,16 +834,16 @@ static void rx_mo_ident(nmt_t *nmt, frame_t *frame)
if (!match_subscriber(trans, frame))
break;
if (nmt->rx_frame_count < 2) {
- PDEBUG_CHAN(DNMT, DEBUG_DEBUG, "Skipping second seizure frame\n");
+ LOGP_CHAN(DNMT, LOGL_DEBUG, "Skipping second seizure frame\n");
break;
}
nmt_value2digits(frame->ms_password, trans->subscriber.password, 3);
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Received identity confirm (password %s).\n", trans->subscriber.password);
+ LOGP_CHAN(DNMT, LOGL_INFO, "Received identity confirm (password %s).\n", trans->subscriber.password);
nmt_new_state(nmt, STATE_MO_CONFIRM);
nmt->tx_frame_count = 0;
break;
default:
- PDEBUG_CHAN(DNMT, DEBUG_DEBUG, "Dropping message %s in state %s\n", nmt_frame_name(frame->mt), nmt_state_name(nmt->state));
+ LOGP_CHAN(DNMT, LOGL_DEBUG, "Dropping message %s in state %s\n", nmt_frame_name(frame->mt), nmt_state_name(nmt->state));
}
}
@@ -849,13 +852,13 @@ static void tx_mo_confirm(nmt_t *nmt, frame_t *frame)
set_line_signal(nmt, frame, 3);
if (++nmt->tx_frame_count <= 2) {
if (nmt->tx_frame_count == 1)
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Send 'Proceed to send'.\n");
+ LOGP_CHAN(DNMT, LOGL_INFO, "Send 'Proceed to send'.\n");
} else {
if (nmt->tx_frame_count == 3) {
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Send dial tone.\n");
+ LOGP_CHAN(DNMT, LOGL_INFO, "Send dial tone.\n");
nmt_new_state(nmt, STATE_MO_DIALING);
nmt_set_dsp_mode(nmt, DSP_MODE_DIALTONE);
- timer_start(&nmt->timer, DIALING_TO);
+ osmo_timer_schedule(&nmt->timer, DIALING_TO);
}
}
}
@@ -873,7 +876,7 @@ static void rx_mo_dialing(nmt_t *nmt, frame_t *frame)
break;
if (!match_subscriber(trans, frame))
break;
- timer_start(&nmt->timer, DIALING_TO);
+ osmo_timer_schedule(&nmt->timer, DIALING_TO);
/* max digits received */
if (len + 1 == sizeof(nmt->dialing))
break;
@@ -894,7 +897,7 @@ static void rx_mo_dialing(nmt_t *nmt, frame_t *frame)
goto not_consistent_digit;
nmt->dialing[len] = nmt_value2digit(frame->digit);
nmt->dialing[len + 1] = '\0';
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Received (odd) digit %c.\n", nmt->dialing[len]);
+ LOGP_CHAN(DNMT, LOGL_INFO, "Received (odd) digit %c.\n", nmt->dialing[len]);
nmt->rx_frame_count = 0;
/* finish dial tone after first digit */
if (!len)
@@ -907,7 +910,7 @@ static void rx_mo_dialing(nmt_t *nmt, frame_t *frame)
break;
if (!match_subscriber(trans, frame))
break;
- timer_start(&nmt->timer, DIALING_TO);
+ osmo_timer_schedule(&nmt->timer, DIALING_TO);
/* max digits received */
if (len + 1 == sizeof(nmt->dialing))
break;
@@ -931,7 +934,7 @@ static void rx_mo_dialing(nmt_t *nmt, frame_t *frame)
goto not_consistent_digit;
nmt->dialing[len] = nmt_value2digit(frame->digit);
nmt->dialing[len + 1] = '\0';
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Received (even) digit %c.\n", nmt->dialing[len]);
+ LOGP_CHAN(DNMT, LOGL_INFO, "Received (even) digit %c.\n", nmt->dialing[len]);
nmt->rx_frame_count = 0;
break;
case NMT_MESSAGE_15: /* idle */
@@ -939,7 +942,7 @@ static void rx_mo_dialing(nmt_t *nmt, frame_t *frame)
break;
if (nmt->dialing[0] == 'A') {
nmt->dialing[0] = '+';
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Dialing includes international '+' sign at the beginning.\n");
+ LOGP_CHAN(DNMT, LOGL_INFO, "Dialing includes international '+' sign at the beginning.\n");
}
if (nmt->dialing[0] == 'B') {
const char *code = NULL;
@@ -979,42 +982,42 @@ static void rx_mo_dialing(nmt_t *nmt, frame_t *frame)
break;
}
if (code)
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Dialing includes service code: '%c%c' = '%s'\n", nmt->dialing[0], nmt->dialing[1], code);
+ LOGP_CHAN(DNMT, LOGL_INFO, "Dialing includes service code: '%c%c' = '%s'\n", nmt->dialing[0], nmt->dialing[1], code);
}
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Dialing complete %s->%s, call established.\n", &trans->subscriber.country, nmt->dialing);
+ LOGP_CHAN(DNMT, LOGL_INFO, "Dialing complete %s->%s, call established.\n", &trans->subscriber.country, nmt->dialing);
if (nmt->dialing[0] == 'B')
nmt->dialing[0] = '+';
/* setup call */
if (!strcmp(nmt->dialing, nmt->smsc_number)) {
/* SMS */
- PDEBUG(DNMT, DEBUG_INFO, "Setup call to SMSC.\n");
+ LOGP(DNMT, LOGL_INFO, "Setup call to SMSC.\n");
trans->dms_call = 1;
} else {
- PDEBUG(DNMT, DEBUG_INFO, "Setup call to network.\n");
+ LOGP(DNMT, LOGL_INFO, "Setup call to network.\n");
trans->callref = call_up_setup(&trans->subscriber.country, nmt->dialing, OSMO_CC_NETWORK_NMT_NONE, "");
}
- timer_stop(&nmt->timer);
+ osmo_timer_del(&nmt->timer);
nmt_new_state(nmt, STATE_MO_COMPLETE);
nmt_set_dsp_mode(nmt, DSP_MODE_FRAME);
nmt->tx_frame_count = 0;
break;
default:
- PDEBUG_CHAN(DNMT, DEBUG_DEBUG, "Dropping message %s in state %s\n", nmt_frame_name(frame->mt), nmt_state_name(nmt->state));
+ LOGP_CHAN(DNMT, LOGL_DEBUG, "Dropping message %s in state %s\n", nmt_frame_name(frame->mt), nmt_state_name(nmt->state));
}
return;
missing_digit:
- PDEBUG_CHAN(DNMT, DEBUG_NOTICE, "Missing digit, aborting.\n");
+ LOGP_CHAN(DNMT, LOGL_NOTICE, "Missing digit, aborting.\n");
nmt_release(nmt);
return;
not_right_position:
- PDEBUG_CHAN(DNMT, DEBUG_NOTICE, "Position information of digit does not match, ignoring due to corrupt frame.\n");
+ LOGP_CHAN(DNMT, LOGL_NOTICE, "Position information of digit does not match, ignoring due to corrupt frame.\n");
return;
not_consistent_digit:
- PDEBUG_CHAN(DNMT, DEBUG_NOTICE, "Digit repetition in frame does not match, ignoring due to corrupt frame.\n");
+ LOGP_CHAN(DNMT, LOGL_NOTICE, "Digit repetition in frame does not match, ignoring due to corrupt frame.\n");
return;
}
@@ -1025,22 +1028,22 @@ static void tx_mo_complete(nmt_t *nmt, frame_t *frame)
if (++nmt->tx_frame_count <= 4) {
set_line_signal(nmt, frame, 6);
if (nmt->tx_frame_count == 1)
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Send 'address complete'.\n");
+ LOGP_CHAN(DNMT, LOGL_INFO, "Send 'address complete'.\n");
} else {
if (nmt->compandor) {
set_line_signal(nmt, frame, 5);
if (nmt->tx_frame_count == 5)
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Send 'compandor in'.\n");
+ LOGP_CHAN(DNMT, LOGL_INFO, "Send 'compandor in'.\n");
} else
frame->mt = NMT_MESSAGE_6;
if (nmt->tx_frame_count == 9) {
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Connect audio.\n");
+ LOGP_CHAN(DNMT, LOGL_INFO, "Connect audio.\n");
nmt_new_state(nmt, STATE_ACTIVE);
nmt->active_state = ACTIVE_STATE_VOICE;
nmt_set_dsp_mode(nmt, DSP_MODE_AUDIO);
if (nmt->supervisory && !trans->dms_call) {
super_reset(nmt);
- timer_start(&nmt->timer, SUPERVISORY_TO1);
+ osmo_timer_schedule(&nmt->timer, SUPERVISORY_TO1,0);
}
}
}
@@ -1048,9 +1051,9 @@ static void tx_mo_complete(nmt_t *nmt, frame_t *frame)
static void timeout_mo_dialing(nmt_t *nmt)
{
- PDEBUG_CHAN(DNMT, DEBUG_NOTICE, "Timeout while receiving digits.\n");
+ LOGP_CHAN(DNMT, LOGL_NOTICE, "Timeout while receiving digits.\n");
nmt_release(nmt);
- PDEBUG(DNMT, DEBUG_INFO, "Release call towards network.\n");
+ LOGP(DNMT, LOGL_INFO, "Release call towards network.\n");
}
/*
@@ -1067,16 +1070,16 @@ static void tx_mt_paging(nmt_t *nmt, frame_t *frame)
frame->ms_number = nmt_digits2value(trans->subscriber.number, 6);
frame->additional_info = nmt_encode_area_no(nmt->sysinfo.area_no);
if (++nmt->tx_frame_count == 1) {
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Send call to mobile.\n");
+ LOGP_CHAN(DNMT, LOGL_INFO, "Send call to mobile.\n");
} else
tx_idle(nmt, frame);
}
void timeout_mt_paging(transaction_t *trans)
{
- PDEBUG(DNMT, DEBUG_NOTICE, "No answer from mobile phone (try %d).\n", trans->page_try);
+ LOGP(DNMT, LOGL_NOTICE, "No answer from mobile phone (try %d).\n", trans->page_try);
if (trans->page_try == PAGE_TRIES) {
- PDEBUG(DNMT, DEBUG_INFO, "Release call towards network.\n");
+ LOGP(DNMT, LOGL_INFO, "Release call towards network.\n");
call_up_release(trans->callref, CAUSE_OUTOFORDER);
destroy_transaction(trans);
return;
@@ -1097,10 +1100,10 @@ static void rx_mt_paging(nmt_t *nmt, frame_t *frame)
break;
if (!match_subscriber(trans, frame))
break;
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Received call acknowledgment from subscriber %c,%s.\n", trans->subscriber.country, trans->subscriber.number);
+ LOGP_CHAN(DNMT, LOGL_INFO, "Received call acknowledgment from subscriber %c,%s.\n", trans->subscriber.country, trans->subscriber.number);
if (trans->sms_string[0])
trans->dms_call = 1;
- timer_stop(&trans->timer);
+ osmo_timer_del(&trans->timer);
nmt_new_state(nmt, STATE_MT_CHANNEL);
trans->nmt = nmt;
nmt->tx_frame_count = 0;
@@ -1114,7 +1117,7 @@ static void rx_mt_paging(nmt_t *nmt, frame_t *frame)
}
break;
default:
- PDEBUG_CHAN(DNMT, DEBUG_DEBUG, "Dropping message %s in state %s\n", nmt_frame_name(frame->mt), nmt_state_name(nmt->state));
+ LOGP_CHAN(DNMT, LOGL_DEBUG, "Dropping message %s in state %s\n", nmt_frame_name(frame->mt), nmt_state_name(nmt->state));
}
}
@@ -1126,8 +1129,8 @@ static void tx_mt_channel(nmt_t *nmt, frame_t *frame)
/* get free channel (after releasing all channels) */
tc = search_free_tc(nmt);
if (!tc) {
- PDEBUG_CHAN(DNMT, DEBUG_NOTICE, "TC is not free anymore.\n");
- PDEBUG(DNMT, DEBUG_INFO, "Release call towards network.\n");
+ LOGP_CHAN(DNMT, LOGL_NOTICE, "TC is not free anymore.\n");
+ LOGP(DNMT, LOGL_INFO, "Release call towards network.\n");
call_up_release(trans->callref, CAUSE_NOCHANNEL);
trans->callref = 0;
nmt_release(nmt);
@@ -1138,12 +1141,12 @@ static void tx_mt_channel(nmt_t *nmt, frame_t *frame)
if (nmt != tc) {
/* link trans and tc together, so we can continue with channel assignment */
- PDEBUG_CHAN(DNMT, DEBUG_NOTICE, "Switching to TC channel #%s.\n", tc->sender.kanal);
+ LOGP_CHAN(DNMT, LOGL_NOTICE, "Switching to TC channel #%s.\n", tc->sender.kanal);
nmt_go_idle(nmt);
tc->trans = trans;
trans->nmt = tc;
} else
- PDEBUG_CHAN(DNMT, DEBUG_NOTICE, "Staying on CC/TC channel #%s.\n", tc->sender.kanal);
+ LOGP_CHAN(DNMT, LOGL_NOTICE, "Staying on CC/TC channel #%s.\n", tc->sender.kanal);
nmt_new_state(tc, STATE_MT_IDENT);
tc->tx_frame_count = 0;
@@ -1154,7 +1157,7 @@ static void tx_mt_channel(nmt_t *nmt, frame_t *frame)
frame->ms_country = nmt_digits2value(&trans->subscriber.country, 1);
frame->ms_number = nmt_digits2value(trans->subscriber.number, 6);
frame->tc_no = nmt_encode_tc(tc->sysinfo.system, atoi(tc->sender.kanal), tc->sysinfo.ms_power);
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Send channel activation to mobile.\n");
+ LOGP_CHAN(DNMT, LOGL_INFO, "Send channel activation to mobile.\n");
}
static void tx_mt_ident(nmt_t *nmt, frame_t *frame)
@@ -1162,11 +1165,11 @@ static void tx_mt_ident(nmt_t *nmt, frame_t *frame)
transaction_t *trans = nmt->trans;
if (++nmt->tx_frame_count == 1)
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Sending identity request.\n");
+ LOGP_CHAN(DNMT, LOGL_INFO, "Sending identity request.\n");
tx_ident(nmt, frame);
if (nmt->tx_frame_count == 8) {
- PDEBUG_CHAN(DNMT, DEBUG_NOTICE, "Timeout waiting for identity reply\n");
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Release call towards network.\n");
+ LOGP_CHAN(DNMT, LOGL_NOTICE, "Timeout waiting for identity reply\n");
+ LOGP_CHAN(DNMT, LOGL_INFO, "Release call towards network.\n");
call_up_release(trans->callref, CAUSE_TEMPFAIL);
destroy_transaction(trans);
}
@@ -1181,7 +1184,7 @@ static void rx_mt_ident(nmt_t *nmt, frame_t *frame)
if (!match_subscriber(trans, frame))
break;
nmt_value2digits(frame->ms_password, trans->subscriber.password, 3);
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Received identity (password %s).\n", trans->subscriber.password);
+ LOGP_CHAN(DNMT, LOGL_INFO, "Received identity (password %s).\n", trans->subscriber.password);
if (trans->dms_call) {
nmt_new_state(nmt, STATE_MT_AUTOANSWER);
nmt->wait_autoanswer = 1;
@@ -1196,12 +1199,12 @@ static void rx_mt_ident(nmt_t *nmt, frame_t *frame)
nmt->tx_frame_count = 0;
nmt->tx_callerid_count = 0;
}
- timer_start(&nmt->timer, RINGING_TO);
+ osmo_timer_schedule(&nmt->timer, RINGING_TO);
call_up_alerting(trans->callref);
}
break;
default:
- PDEBUG_CHAN(DNMT, DEBUG_DEBUG, "Dropping message %s in state %s\n", nmt_frame_name(frame->mt), nmt_state_name(nmt->state));
+ LOGP_CHAN(DNMT, LOGL_DEBUG, "Dropping message %s in state %s\n", nmt_frame_name(frame->mt), nmt_state_name(nmt->state));
}
}
@@ -1215,14 +1218,14 @@ static void tx_mt_autoanswer(nmt_t *nmt, frame_t *frame)
return;
}
if (++nmt->tx_frame_count == 1)
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Send 'autoanswer order'.\n");
+ LOGP_CHAN(DNMT, LOGL_INFO, "Send 'autoanswer order'.\n");
set_line_signal(nmt, frame, 12);
if (nmt->tx_frame_count == 4) {
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "No reaction to autoanswer, proceed with ringing.\n");
+ LOGP_CHAN(DNMT, LOGL_INFO, "No reaction to autoanswer, proceed with ringing.\n");
nmt_new_state(nmt, STATE_MT_RINGING);
nmt->tx_frame_count = 0;
nmt->tx_callerid_count = 0;
- timer_start(&nmt->timer, RINGING_TO);
+ osmo_timer_schedule(&nmt->timer, RINGING_TO);
call_up_alerting(trans->callref);
}
}
@@ -1244,18 +1247,18 @@ static void rx_mt_autoanswer(nmt_t *nmt, frame_t *frame)
|| ((frame->line_signal >> 12) & 0xf) != ((frame->line_signal >> 8) & 0xf)
|| ((frame->line_signal >> 8) & 0xf) != ((frame->line_signal >> 4) & 0xf)
|| ((frame->line_signal >> 4) & 0xf) != (frame->line_signal & 0xf)) {
- PDEBUG_CHAN(DNMT, DEBUG_NOTICE, "Line signal repetition in frame does not match, ignoring due to corrupt frame.\n");
+ LOGP_CHAN(DNMT, LOGL_NOTICE, "Line signal repetition in frame does not match, ignoring due to corrupt frame.\n");
break;
}
if ((frame->line_signal & 0xf) != 12)
break;
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Received acknowledge to autoanswer.\n");
+ LOGP_CHAN(DNMT, LOGL_INFO, "Received acknowledge to autoanswer.\n");
nmt_new_state(nmt, STATE_MT_COMPLETE);
nmt->tx_frame_count = 0;
call_up_answer(trans->callref, &trans->subscriber.country);
break;
default:
- PDEBUG_CHAN(DNMT, DEBUG_DEBUG, "Dropping message %s in state %s\n", nmt_frame_name(frame->mt), nmt_state_name(nmt->state));
+ LOGP_CHAN(DNMT, LOGL_DEBUG, "Dropping message %s in state %s\n", nmt_frame_name(frame->mt), nmt_state_name(nmt->state));
}
}
@@ -1265,11 +1268,11 @@ static void tx_mt_ringing(nmt_t *nmt, frame_t *frame)
set_line_signal(nmt, frame, 9);
if (++nmt->tx_frame_count == 1)
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Send 'ringing order'.\n");
+ LOGP_CHAN(DNMT, LOGL_INFO, "Send 'ringing order'.\n");
if (nmt->tx_frame_count >= 4) {
if (nmt->tx_callerid_count) {
if (nmt->tx_frame_count == 5)
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Send 'A-number'.\n");
+ LOGP_CHAN(DNMT, LOGL_INFO, "Send 'A-number'.\n");
nmt_encode_a_number(frame, nmt->tx_frame_count - 4, trans->caller_type, trans->caller_id, nmt->sysinfo.system, atoi(nmt->sender.kanal), nmt->sysinfo.ms_power, nmt->sysinfo.traffic_area);
} else
frame->mt = NMT_MESSAGE_6;
@@ -1302,19 +1305,19 @@ static void rx_mt_ringing(nmt_t *nmt, frame_t *frame)
|| ((frame->line_signal >> 12) & 0xf) != ((frame->line_signal >> 8) & 0xf)
|| ((frame->line_signal >> 8) & 0xf) != ((frame->line_signal >> 4) & 0xf)
|| ((frame->line_signal >> 4) & 0xf) != (frame->line_signal & 0xf)) {
- PDEBUG_CHAN(DNMT, DEBUG_NOTICE, "Line signal repetition in frame does not match, ignoring due to corrupt frame.\n");
+ LOGP_CHAN(DNMT, LOGL_NOTICE, "Line signal repetition in frame does not match, ignoring due to corrupt frame.\n");
break;
}
if ((frame->line_signal & 0xf) != 14)
break;
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Received 'answer' from phone.\n");
+ LOGP_CHAN(DNMT, LOGL_INFO, "Received 'answer' from phone.\n");
nmt_new_state(nmt, STATE_MT_COMPLETE);
nmt->tx_frame_count = 0;
- timer_stop(&nmt->timer);
+ osmo_timer_del(&nmt->timer);
call_up_answer(trans->callref, &trans->subscriber.country);
break;
default:
- PDEBUG_CHAN(DNMT, DEBUG_DEBUG, "Dropping message %s in state %s\n", nmt_frame_name(frame->mt), nmt_state_name(nmt->state));
+ LOGP_CHAN(DNMT, LOGL_DEBUG, "Dropping message %s in state %s\n", nmt_frame_name(frame->mt), nmt_state_name(nmt->state));
}
}
@@ -1325,18 +1328,18 @@ static void tx_mt_complete(nmt_t *nmt, frame_t *frame)
++nmt->tx_frame_count;
if (nmt->compandor && !trans->dms_call) {
if (nmt->tx_frame_count == 1)
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Send 'compandor in'.\n");
+ LOGP_CHAN(DNMT, LOGL_INFO, "Send 'compandor in'.\n");
set_line_signal(nmt, frame, 5);
} else
frame->mt = NMT_MESSAGE_6;
if (nmt->tx_frame_count == 5) {
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Connect audio.\n");
+ LOGP_CHAN(DNMT, LOGL_INFO, "Connect audio.\n");
nmt_new_state(nmt, STATE_ACTIVE);
nmt->active_state = ACTIVE_STATE_VOICE;
nmt_set_dsp_mode(nmt, DSP_MODE_AUDIO);
if (nmt->supervisory && !trans->dms_call) {
super_reset(nmt);
- timer_start(&nmt->timer, SUPERVISORY_TO1);
+ osmo_timer_schedule(&nmt->timer, SUPERVISORY_TO1,0);
}
if (trans->dms_call) {
time_t ti = time(NULL);
@@ -1349,8 +1352,8 @@ static void timeout_mt_ringing(nmt_t *nmt)
{
transaction_t *trans = nmt->trans;
- PDEBUG_CHAN(DNMT, DEBUG_NOTICE, "Timeout while waiting for answer of the phone.\n");
- PDEBUG(DNMT, DEBUG_INFO, "Release call towards network.\n");
+ LOGP_CHAN(DNMT, LOGL_NOTICE, "Timeout while waiting for answer of the phone.\n");
+ LOGP(DNMT, LOGL_INFO, "Release call towards network.\n");
call_up_release(trans->callref, CAUSE_NOANSWER);
trans->callref = 0;
nmt_release(nmt);
@@ -1366,7 +1369,7 @@ static void tx_mo_release(nmt_t *nmt, frame_t *frame)
set_line_signal(nmt, frame, 15);
if (++nmt->tx_frame_count == 1)
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Send release.\n");
+ LOGP_CHAN(DNMT, LOGL_INFO, "Send release.\n");
if (nmt->tx_frame_count == 4)
destroy_transaction(trans); /* continue with this frame, then go idle */
}
@@ -1379,7 +1382,7 @@ static void tx_mt_release(nmt_t *nmt, frame_t *frame)
{
set_line_signal(nmt, frame, 15);
if (++nmt->tx_frame_count == 1)
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Send release.\n");
+ LOGP_CHAN(DNMT, LOGL_INFO, "Send release.\n");
}
static void rx_mt_release(nmt_t *nmt, frame_t *frame)
@@ -1396,17 +1399,17 @@ static void rx_mt_release(nmt_t *nmt, frame_t *frame)
|| ((frame->line_signal >> 12) & 0xf) != ((frame->line_signal >> 8) & 0xf)
|| ((frame->line_signal >> 8) & 0xf) != ((frame->line_signal >> 4) & 0xf)
|| ((frame->line_signal >> 4) & 0xf) != (frame->line_signal & 0xf)) {
- PDEBUG_CHAN(DNMT, DEBUG_NOTICE, "Line signal repetition in frame does not match, ignoring due to corrupt frame.\n");
+ LOGP_CHAN(DNMT, LOGL_NOTICE, "Line signal repetition in frame does not match, ignoring due to corrupt frame.\n");
break;
}
if ((frame->line_signal & 0xf) != 1)
break;
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Received release guard.\n");
- timer_stop(&nmt->timer);
+ LOGP_CHAN(DNMT, LOGL_INFO, "Received release guard.\n");
+ osmo_timer_del(&nmt->timer);
destroy_transaction(trans);
break;
default:
- PDEBUG_CHAN(DNMT, DEBUG_DEBUG, "Dropping message %s in state %s\n", nmt_frame_name(frame->mt), nmt_state_name(nmt->state));
+ LOGP_CHAN(DNMT, LOGL_DEBUG, "Dropping message %s in state %s\n", nmt_frame_name(frame->mt), nmt_state_name(nmt->state));
}
}
@@ -1414,7 +1417,7 @@ static void timeout_mt_release(nmt_t *nmt)
{
transaction_t *trans = nmt->trans;
- PDEBUG_CHAN(DNMT, DEBUG_NOTICE, "Timeout while releasing.\n");
+ LOGP_CHAN(DNMT, LOGL_NOTICE, "Timeout while releasing.\n");
destroy_transaction(trans);
}
@@ -1425,9 +1428,9 @@ static void timeout_mt_release(nmt_t *nmt)
void nmt_rx_super(nmt_t *nmt, int tone, double quality)
{
if (tone)
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Detected supervisory signal with quality=%.0f.\n", quality * 100.0);
+ LOGP_CHAN(DNMT, LOGL_INFO, "Detected supervisory signal with quality=%.0f.\n", quality * 100.0);
else
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Lost supervisory signal\n");
+ LOGP_CHAN(DNMT, LOGL_INFO, "Lost supervisory signal\n");
if (nmt->sender.loopback)
return;
@@ -1437,20 +1440,20 @@ void nmt_rx_super(nmt_t *nmt, int tone, double quality)
return;
if (tone)
- timer_stop(&nmt->timer);
+ osmo_timer_del(&nmt->timer);
else
- timer_start(&nmt->timer, SUPERVISORY_TO2);
+ osmo_timer_schedule(&nmt->timer, SUPERVISORY_TO2);
}
-static void timeout_active(nmt_t *nmt, double duration)
+static void timeout_active(nmt_t *nmt, int duration)
{
transaction_t *trans = nmt->trans;
if (duration == SUPERVISORY_TO1)
- PDEBUG_CHAN(DNMT, DEBUG_NOTICE, "Timeout after %.0f seconds not receiving supervisory signal.\n", duration);
+ LOGP_CHAN(DNMT, LOGL_NOTICE, "Timeout after %d seconds not receiving supervisory signal.\n", duration);
else
- PDEBUG_CHAN(DNMT, DEBUG_NOTICE, "Timeout after %.0f seconds loosing supervisory signal.\n", duration);
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Release call towards network.\n");
+ LOGP_CHAN(DNMT, LOGL_NOTICE, "Timeout after %d seconds loosing supervisory signal.\n", duration);
+ LOGP_CHAN(DNMT, LOGL_INFO, "Release call towards network.\n");
call_up_release(trans->callref, CAUSE_TEMPFAIL);
trans->callref = 0;
nmt_release(nmt);
@@ -1463,7 +1466,7 @@ static void rx_active(nmt_t *nmt, frame_t *frame)
/* restart timer on every reception of frame */
if (nmt->supervisory)
- timer_start(&nmt->timer, SUPERVISORY_TO2);
+ osmo_timer_schedule(&nmt->timer, SUPERVISORY_TO2);
switch (frame->mt) {
case NMT_MESSAGE_13a: /* line signal */
@@ -1475,17 +1478,17 @@ static void rx_active(nmt_t *nmt, frame_t *frame)
|| ((frame->line_signal >> 12) & 0xf) != ((frame->line_signal >> 8) & 0xf)
|| ((frame->line_signal >> 8) & 0xf) != ((frame->line_signal >> 4) & 0xf)
|| ((frame->line_signal >> 4) & 0xf) != (frame->line_signal & 0xf)) {
- PDEBUG_CHAN(DNMT, DEBUG_NOTICE, "Line signal repetition in frame does not match, ignoring due to corrupt frame.\n");
+ LOGP_CHAN(DNMT, LOGL_NOTICE, "Line signal repetition in frame does not match, ignoring due to corrupt frame.\n");
break;
}
switch ((frame->line_signal & 0xf)) {
case 5:
- PDEBUG_CHAN(DNMT, DEBUG_NOTICE, "Register Recall is not supported.\n");
+ LOGP_CHAN(DNMT, LOGL_NOTICE, "Register Recall is not supported.\n");
break;
case 8:
if (nmt->active_state != ACTIVE_STATE_VOICE)
break;
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Received 'MFT in' request.\n");
+ LOGP_CHAN(DNMT, LOGL_INFO, "Received 'MFT in' request.\n");
nmt->active_state = ACTIVE_STATE_MFT_IN;
nmt->tx_frame_count = 0;
nmt_set_dsp_mode(nmt, DSP_MODE_FRAME);
@@ -1494,7 +1497,7 @@ static void rx_active(nmt_t *nmt, frame_t *frame)
case 7:
if (nmt->active_state != ACTIVE_STATE_MFT)
break;
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Received 'MFT out' request.\n");
+ LOGP_CHAN(DNMT, LOGL_INFO, "Received 'MFT out' request.\n");
nmt->active_state = ACTIVE_STATE_MFT_OUT;
nmt->tx_frame_count = 0;
nmt_set_dsp_mode(nmt, DSP_MODE_FRAME);
@@ -1511,17 +1514,17 @@ static void rx_active(nmt_t *nmt, frame_t *frame)
if ((nmt->mft_num & 1))
break;
if ((frame->digit >> 12) != 0x00) {
- PDEBUG_CHAN(DNMT, DEBUG_NOTICE, "Position information of digit does not match, ignoring due to corrupt frame.\n");
+ LOGP_CHAN(DNMT, LOGL_NOTICE, "Position information of digit does not match, ignoring due to corrupt frame.\n");
break;
}
if (((frame->digit >> 8) & 0xf) != ((frame->digit >> 4) & 0xf)
|| ((frame->digit >> 4) & 0xf) != (frame->digit & 0xf)) {
- PDEBUG_CHAN(DNMT, DEBUG_NOTICE, "Digit repetition in frame does not match, ignoring due to corrupt frame.\n");
+ LOGP_CHAN(DNMT, LOGL_NOTICE, "Digit repetition in frame does not match, ignoring due to corrupt frame.\n");
break;
}
digit = nmt_value2digit(frame->digit);
dtmf_encode_set_tone(&nmt->dtmf, digit, DTMF_DURATION, 0.0);
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Received (odd) digit %c.\n", digit);
+ LOGP_CHAN(DNMT, LOGL_INFO, "Received (odd) digit %c.\n", digit);
nmt->mft_num++;
break;
case NMT_MESSAGE_14b: /* digits */
@@ -1534,21 +1537,21 @@ static void rx_active(nmt_t *nmt, frame_t *frame)
if (!(nmt->mft_num & 1))
break;
if ((frame->digit >> 12) != 0xff) {
- PDEBUG_CHAN(DNMT, DEBUG_NOTICE, "Position information of digit does not match, ignoring due to corrupt frame.\n");
+ LOGP_CHAN(DNMT, LOGL_NOTICE, "Position information of digit does not match, ignoring due to corrupt frame.\n");
break;
}
if (((frame->digit >> 8) & 0xf) != ((frame->digit >> 4) & 0xf)
|| ((frame->digit >> 4) & 0xf) != (frame->digit & 0xf)) {
- PDEBUG_CHAN(DNMT, DEBUG_NOTICE, "Digit repetition in frame does not match, ignoring due to corrupt frame.\n");
+ LOGP_CHAN(DNMT, LOGL_NOTICE, "Digit repetition in frame does not match, ignoring due to corrupt frame.\n");
break;
}
digit = nmt_value2digit(frame->digit);
dtmf_encode_set_tone(&nmt->dtmf, digit, DTMF_DURATION, 0.0);
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Received (even) digit %c.\n", digit);
+ LOGP_CHAN(DNMT, LOGL_INFO, "Received (even) digit %c.\n", digit);
nmt->mft_num++;
break;
default:
- PDEBUG_CHAN(DNMT, DEBUG_DEBUG, "Dropping message %s in state %s\n", nmt_frame_name(frame->mt), nmt_state_name(nmt->state));
+ LOGP_CHAN(DNMT, LOGL_DEBUG, "Dropping message %s in state %s\n", nmt_frame_name(frame->mt), nmt_state_name(nmt->state));
}
}
@@ -1558,7 +1561,7 @@ static void tx_active(nmt_t *nmt, frame_t *frame)
case ACTIVE_STATE_MFT_IN:
set_line_signal(nmt, frame, 4);
if (++nmt->tx_frame_count == 1)
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Send 'MFT in acknowledge'.\n");
+ LOGP_CHAN(DNMT, LOGL_INFO, "Send 'MFT in acknowledge'.\n");
if (nmt->tx_frame_count > 4) {
nmt->active_state = ACTIVE_STATE_MFT;
nmt_set_dsp_mode(nmt, DSP_MODE_DTMF);
@@ -1567,7 +1570,7 @@ static void tx_active(nmt_t *nmt, frame_t *frame)
case ACTIVE_STATE_MFT_OUT:
set_line_signal(nmt, frame, 10);
if (++nmt->tx_frame_count == 1)
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Send 'MFT out acknowledge'.\n");
+ LOGP_CHAN(DNMT, LOGL_INFO, "Send 'MFT out acknowledge'.\n");
if (nmt->tx_frame_count > 4) {
nmt->active_state = ACTIVE_STATE_VOICE;
nmt_set_dsp_mode(nmt, DSP_MODE_AUDIO);
@@ -1589,18 +1592,18 @@ void nmt_receive_frame(nmt_t *nmt, const char *bits, double quality, double leve
frame_t frame;
int rc;
- PDEBUG_CHAN(DDSP, DEBUG_INFO, "RX Level: %.0f%% Quality=%.0f%%\n", level * 100.0, quality * 100.0);
+ LOGP_CHAN(DDSP, LOGL_INFO, "RX Level: %.0f%% Quality=%.0f%%\n", level * 100.0, quality * 100.0);
rc = decode_frame(nmt->sysinfo.system, &frame, bits, (nmt->sender.loopback) ? MTX_TO_XX : XX_TO_MTX, (nmt->state == STATE_MT_PAGING));
if (rc < 0) {
- PDEBUG_CHAN(DNMT, (nmt->sender.loopback) ? DEBUG_NOTICE : DEBUG_DEBUG, "Received invalid frame.\n");
+ LOGP_CHAN(DNMT, (nmt->sender.loopback) ? LOGL_NOTICE : LOGL_DEBUG, "Received invalid frame.\n");
return;
}
/* frame counter */
nmt->rx_frame_count += frames_elapsed;
- PDEBUG_CHAN(DNMT, (nmt->sender.loopback) ? DEBUG_NOTICE : DEBUG_DEBUG, "Received frame %s\n", nmt_frame_name(frame.mt));
+ LOGP_CHAN(DNMT, (nmt->sender.loopback) ? LOGL_NOTICE : LOGL_DEBUG, "Received frame %s\n", nmt_frame_name(frame.mt));
if (nmt->sender.loopback)
return;
@@ -1619,15 +1622,15 @@ void nmt_receive_frame(nmt_t *nmt, const char *bits, double quality, double leve
|| ((frame.line_signal >> 12) & 0xf) != ((frame.line_signal >> 8) & 0xf)
|| ((frame.line_signal >> 8) & 0xf) != ((frame.line_signal >> 4) & 0xf)
|| ((frame.line_signal >> 4) & 0xf) != (frame.line_signal & 0xf)) {
- PDEBUG_CHAN(DNMT, DEBUG_NOTICE, "Line signal repetition in frame does not match, ignoring due to corrupt frame.\n");
+ LOGP_CHAN(DNMT, LOGL_NOTICE, "Line signal repetition in frame does not match, ignoring due to corrupt frame.\n");
return;
}
- PDEBUG_CHAN(DNMT, DEBUG_INFO, "Received clearing by mobile phone in state %s.\n", nmt_state_name(nmt->state));
+ LOGP_CHAN(DNMT, LOGL_INFO, "Received clearing by mobile phone in state %s.\n", nmt_state_name(nmt->state));
nmt_new_state(nmt, STATE_MO_RELEASE);
nmt->tx_frame_count = 0;
nmt_set_dsp_mode(nmt, DSP_MODE_FRAME);
if (nmt->trans->callref) {
- PDEBUG(DNMT, DEBUG_INFO, "Release call towards network.\n");
+ LOGP(DNMT, LOGL_INFO, "Release call towards network.\n");
call_up_release(nmt->trans->callref, CAUSE_NORMAL);
nmt->trans->callref = 0;
}
@@ -1672,14 +1675,14 @@ void nmt_receive_frame(nmt_t *nmt, const char *bits, double quality, double leve
rx_active(nmt, &frame);
break;
default:
- PDEBUG_CHAN(DNMT, DEBUG_DEBUG, "Dropping message %s in state %s\n", nmt_frame_name(frame.mt), nmt_state_name(nmt->state));
+ LOGP_CHAN(DNMT, LOGL_DEBUG, "Dropping message %s in state %s\n", nmt_frame_name(frame.mt), nmt_state_name(nmt->state));
}
}
/* Timeout handling */
-static void nmt_timeout(struct timer *timer)
+static void nmt_timeout(void *data)
{
- nmt_t *nmt = (nmt_t *)timer->priv;
+ nmt_t *nmt = data;
switch (nmt->state) {
case STATE_MO_DIALING:
@@ -1692,7 +1695,7 @@ static void nmt_timeout(struct timer *timer)
timeout_mt_release(nmt);
break;
case STATE_ACTIVE:
- timeout_active(nmt, timer->duration);
+ timeout_active(nmt, nmt->timer.timeout.tv_sec);
break;
default:
break;
@@ -1785,9 +1788,9 @@ const char *nmt_get_frame(nmt_t *nmt)
bits = encode_frame(nmt->sysinfo.system, &frame, debug);
if (debug)
- PDEBUG_CHAN(DNMT, DEBUG_DEBUG, "Sending frame %s.\n", nmt_frame_name(frame.mt));
+ LOGP_CHAN(DNMT, LOGL_DEBUG, "Sending frame %s.\n", nmt_frame_name(frame.mt));
if (debug && nmt->tx_last_frame_idle)
- PDEBUG_CHAN(DNMT, DEBUG_DEBUG, "Subsequent IDLE frames are not show, to prevent flooding the output.\n");
+ LOGP_CHAN(DNMT, LOGL_DEBUG, "Subsequent IDLE frames are not show, to prevent flooding the output.\n");
return bits;
}
@@ -1796,7 +1799,7 @@ const char *nmt_get_frame(nmt_t *nmt)
*/
/* Call control starts call towards mobile station. */
-int _out_setup(int callref, const char *caller_id, enum number_type caller_type, const char *dialing, const char *sms)
+static int _out_setup(int callref, const char *caller_id, enum number_type caller_type, const char *dialing, const char *sms)
{
sender_t *sender;
nmt_t *nmt;
@@ -1807,14 +1810,14 @@ int _out_setup(int callref, const char *caller_id, enum number_type caller_type,
/* 1. split number into country and subscriber parts */
if (dialstring2number(dialing, &subscr.country, subscr.number)) {
- PDEBUG(DNMT, DEBUG_NOTICE, "Outgoing call to invalid number '%s', rejecting!\n", dialing);
+ LOGP(DNMT, LOGL_NOTICE, "Outgoing call to invalid number '%s', rejecting!\n", dialing);
return -CAUSE_INVALNUMBER;
}
/* 2. check if given number is already in a call, return BUSY */
trans = get_transaction_by_number(&subscr);
if (trans) {
- PDEBUG(DNMT, DEBUG_NOTICE, "Outgoing call to busy number, rejecting!\n");
+ LOGP(DNMT, LOGL_NOTICE, "Outgoing call to busy number, rejecting!\n");
return -CAUSE_BUSY;
}
@@ -1827,20 +1830,20 @@ int _out_setup(int callref, const char *caller_id, enum number_type caller_type,
break;
}
if (!sender) {
- PDEBUG(DNMT, DEBUG_NOTICE, "Outgoing call, but no free calling channel, rejecting!\n");
+ LOGP(DNMT, LOGL_NOTICE, "Outgoing call, but no free calling channel, rejecting!\n");
return -CAUSE_NOCHANNEL;
}
if (!search_free_tc(NULL)) {
- PDEBUG(DNMT, DEBUG_NOTICE, "Outgoing call, but no free traffic channel, rejecting!\n");
+ LOGP(DNMT, LOGL_NOTICE, "Outgoing call, but no free traffic channel, rejecting!\n");
return -CAUSE_NOCHANNEL;
}
- PDEBUG(DNMT, DEBUG_INFO, "Call to mobile station, paging station id '%c%s'\n", subscr.country, subscr.number);
+ LOGP(DNMT, LOGL_INFO, "Call to mobile station, paging station id '%c%s'\n", subscr.country, subscr.number);
/* 4. trying to page mobile station */
trans = create_transaction(&subscr);
if (!trans) {
- PDEBUG(DNMT, DEBUG_NOTICE, "Failed to create transaction, rejecting!\n");
+ LOGP(DNMT, LOGL_NOTICE, "Failed to create transaction, rejecting!\n");
return -CAUSE_TEMPFAIL;
}
trans->callref = callref;
@@ -1861,12 +1864,12 @@ int call_down_setup(int callref, const char *caller_id, enum number_type caller_
{
return _out_setup(callref, caller_id, caller_type, dialing, NULL);
}
-int sms_out_setup(char *dialing, const char *caller_id, enum number_type caller_type, const char *sms)
+static int sms_out_setup(char *dialing, const char *caller_id, enum number_type caller_type, const char *sms)
{
return _out_setup(0, caller_id, caller_type, dialing, sms);
}
-void call_down_answer(int __attribute__((unused)) callref)
+void call_down_answer(int __attribute__((unused)) callref, struct timeval __attribute__((unused)) *tv_meter)
{
}
@@ -1879,11 +1882,11 @@ void call_down_disconnect(int callref, int cause)
transaction_t *trans;
nmt_t *nmt;
- PDEBUG(DNMT, DEBUG_INFO, "Call has been disconnected by network.\n");
+ LOGP(DNMT, LOGL_INFO, "Call has been disconnected by network.\n");
trans = get_transaction_by_callref(callref);
if (!trans) {
- PDEBUG(DNMT, DEBUG_NOTICE, "Outgoing disconnect, but no callref!\n");
+ LOGP(DNMT, LOGL_NOTICE, "Outgoing disconnect, but no callref!\n");
call_up_release(callref, CAUSE_INVALCALLREF);
return;
}
@@ -1901,12 +1904,12 @@ void call_down_disconnect(int callref, int cause)
return;
switch (nmt->state) {
case STATE_MT_RINGING:
- PDEBUG_CHAN(DNMT, DEBUG_NOTICE, "Outgoing disconnect, during ringing, releasing!\n");
+ LOGP_CHAN(DNMT, LOGL_NOTICE, "Outgoing disconnect, during ringing, releasing!\n");
trans->callref = 0;
nmt_release(nmt);
break;
default:
- PDEBUG_CHAN(DNMT, DEBUG_NOTICE, "Outgoing disconnect, when phone is in call setup, releasing!\n");
+ LOGP_CHAN(DNMT, LOGL_NOTICE, "Outgoing disconnect, when phone is in call setup, releasing!\n");
trans->callref = 0;
nmt_release(nmt);
break;
@@ -1921,11 +1924,11 @@ void call_down_release(int callref, int __attribute__((unused)) cause)
transaction_t *trans;
nmt_t *nmt;
- PDEBUG(DNMT, DEBUG_INFO, "Call has been released by network, releasing call.\n");
+ LOGP(DNMT, LOGL_INFO, "Call has been released by network, releasing call.\n");
trans = get_transaction_by_callref(callref);
if (!trans) {
- PDEBUG(DNMT, DEBUG_NOTICE, "Outgoing release, but no callref!\n");
+ LOGP(DNMT, LOGL_NOTICE, "Outgoing release, but no callref!\n");
/* don't send release, because caller already released */
return;
}
@@ -1940,42 +1943,20 @@ void call_down_release(int callref, int __attribute__((unused)) cause)
switch (nmt->state) {
case STATE_ACTIVE:
- PDEBUG_CHAN(DNMT, DEBUG_NOTICE, "Outgoing release, during active call, releasing!\n");
+ LOGP_CHAN(DNMT, LOGL_NOTICE, "Outgoing release, during active call, releasing!\n");
nmt_release(nmt);
break;
case STATE_MT_RINGING:
- PDEBUG_CHAN(DNMT, DEBUG_NOTICE, "Outgoing release, during ringing, releasing!\n");
+ LOGP_CHAN(DNMT, LOGL_NOTICE, "Outgoing release, during ringing, releasing!\n");
nmt_release(nmt);
break;
default:
- PDEBUG_CHAN(DNMT, DEBUG_NOTICE, "Outgoing release, when phone is in call setup, releasing!\n");
+ LOGP_CHAN(DNMT, LOGL_NOTICE, "Outgoing release, when phone is in call setup, releasing!\n");
nmt_release(nmt);
break;
}
}
-/* 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)
-{
- transaction_t *trans;
- nmt_t *nmt;
-
- trans = get_transaction_by_callref(callref);
- if (!trans)
- return;
- nmt = trans->nmt;
- if (!nmt)
- return;
-
- if (nmt->dsp_mode == DSP_MODE_AUDIO || nmt->dsp_mode == DSP_MODE_DTMF) {
- if (nmt->compandor)
- compress_audio(&nmt->cstate, samples, count);
- jitter_save(&nmt->sender.dejitter, samples, count, 1, sequence, timestamp, ssrc);
- }
-}
-
-void call_down_clock(void) {}
-
/*
* SMS layer messages
*/
@@ -1983,7 +1964,7 @@ void call_down_clock(void) {}
/* SMS layer releases */
void sms_release(nmt_t *nmt)
{
- PDEBUG_CHAN(DNMT, DEBUG_NOTICE, "Outgoing release, by SMS layer!\n");
+ LOGP_CHAN(DNMT, LOGL_NOTICE, "Outgoing release, by SMS layer!\n");
nmt_release(nmt);
}
@@ -1994,7 +1975,7 @@ int sms_submit(nmt_t *nmt, uint8_t ref, const char *orig_address, uint8_t __attr
if (!orig_address[0])
orig_address = &nmt->trans->subscriber.country;
- PDEBUG_CHAN(DNMT, DEBUG_NOTICE, "Received SMS from '%s' to '%s' (ref=%d)\n", orig_address, dest_address, ref);
+ LOGP_CHAN(DNMT, LOGL_NOTICE, "Received SMS from '%s' to '%s' (ref=%d)\n", orig_address, dest_address, ref);
printf("SMS received '%s' -> '%s': %s\n", orig_address, dest_address, message);
snprintf(sms, sizeof(sms) - 1, "%s,%s,%s", orig_address, dest_address, message);
sms[sizeof(sms) - 1] = '\0';
@@ -2004,7 +1985,7 @@ int sms_submit(nmt_t *nmt, uint8_t ref, const char *orig_address, uint8_t __attr
void sms_deliver_report(nmt_t *nmt, uint8_t ref, int error, uint8_t cause)
{
- PDEBUG_CHAN(DNMT, DEBUG_NOTICE, "Got SMS deliver report (ref=%d)\n", ref);
+ LOGP_CHAN(DNMT, LOGL_NOTICE, "Got SMS deliver report (ref=%d)\n", ref);
if (error)
printf("SMS failed! (cause=%d)\n", cause);
else {
@@ -2026,11 +2007,11 @@ void deliver_sms(const char *sms)
message = p;
if (!caller_id || !number || !message) {
inval:
- PDEBUG(DNMT, DEBUG_NOTICE, "Given SMS MUST be in the following format: [i|n|s|u]<caller ID>,<7 digits number>,<message with comma and spaces> (i, n, s, u indicate the type of number)\n");
+ LOGP(DNMT, LOGL_NOTICE, "Given SMS MUST be in the following format: [i|n|s|u]<caller ID>,<7 digits number>,<message with comma and spaces> (i, n, s, u indicate the type of number)\n");
return;
}
if (strlen(number) != 7) {
- PDEBUG(DNMT, DEBUG_NOTICE, "Given number must be 7 digits\n");
+ LOGP(DNMT, LOGL_NOTICE, "Given number must be 7 digits\n");
goto inval;
}
@@ -2058,12 +2039,12 @@ inval:
caller_type = TYPE_UNKNOWN;
}
- PDEBUG(DNMT, DEBUG_INFO, "SMS from '%s' for subscriber '%s' with message '%s'\n", caller_id, number, message);
+ LOGP(DNMT, LOGL_INFO, "SMS from '%s' for subscriber '%s' with message '%s'\n", caller_id, number, message);
printf("SMS sending '%s' -> '%s': %s\n", caller_id, number, message);
rc = sms_out_setup(number, caller_id, caller_type, message);
if (rc < 0) {
- PDEBUG(DNMT, DEBUG_INFO, "SMS delivery failed with cause '%d'\n", -rc);
+ LOGP(DNMT, LOGL_INFO, "SMS delivery failed with cause '%d'\n", -rc);
return;
}
}
diff --git a/src/nmt/nmt.h b/src/nmt/nmt.h
index 566ba97..6a77431 100644
--- a/src/nmt/nmt.h
+++ b/src/nmt/nmt.h
@@ -1,5 +1,5 @@
#include "../libmobile/sender.h"
-#include "../libtimer/timer.h"
+#include <osmocom/core/timer.h>
#include "../libcompandor/compandor.h"
#include "../libdtmf/dtmf_encode.h"
#include "../libmobile/call.h"
@@ -85,7 +85,7 @@ struct nmt {
enum nmt_state state;
int wait_autoanswer; /* wait for frame 15 before we can send autoanswer */
enum nmt_active_state active_state;
- struct timer timer;
+ struct osmo_timer_list timer;
int rx_frame_count; /* receive frame counter */
int tx_frame_count; /* transmit frame counter */
int tx_callerid_count; /* counter for caller ID repetition */
@@ -138,7 +138,7 @@ struct nmt {
dms_t dms; /* DMS states */
sms_t sms; /* SMS states */
char smsc_number[33]; /* digits to match SMSC */
- struct timer sms_timer;
+ struct osmo_timer_list sms_timer;
};
void nmt_channel_list(int nmt_system);
diff --git a/src/nmt/sms.c b/src/nmt/sms.c
index 87af10a..1b1a7de 100644
--- a/src/nmt/sms.c
+++ b/src/nmt/sms.c
@@ -24,11 +24,11 @@
#include <time.h>
#include <errno.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "nmt.h"
-#define SMS_RECEIVE_TO 5.0
-#define SMS_RELEASE_TO 2.0
+#define SMS_RECEIVE_TO 5,0
+#define SMS_RELEASE_TO 2,0
/* TP-Message-Type-Indicator (TP-MTI) */
#define MTI_SMS_DELIVER 0x00 /* SC -> MS */
@@ -94,12 +94,12 @@ static const char sms_header[] = {
* init and exit
*/
-static void sms_timeout(struct timer *timer);
+static void sms_timeout(void *data);
/* init instance */
int sms_init_sender(nmt_t *nmt)
{
- timer_init(&nmt->sms_timer, sms_timeout, nmt);
+ osmo_timer_setup(&nmt->sms_timer, sms_timeout, nmt);
return 0;
}
@@ -108,7 +108,7 @@ int sms_init_sender(nmt_t *nmt)
void sms_cleanup_sender(nmt_t *nmt)
{
sms_reset(nmt);
- timer_exit(&nmt->sms_timer);
+ osmo_timer_del(&nmt->sms_timer);
}
/*
@@ -130,7 +130,7 @@ static int encode_address(uint8_t *data, const char *address, uint8_t type, uint
uint8_t digit;
int i, j;
- PDEBUG(DSMS, DEBUG_DEBUG, "Encode SC->MS header\n");
+ LOGP(DSMS, LOGL_DEBUG, "Encode SC->MS header\n");
data[length++] = 0x80 | (type << 4) | plan;
j = 0;
@@ -170,7 +170,7 @@ static int encode_time(uint8_t *data, time_t timestamp, int local)
uint8_t digit1, digit2;
int quarters, sign;
- PDEBUG(DSMS, DEBUG_DEBUG, "Encode time stamp '%02d.%02d.%02d %02d:%02d:%02d'\n", tm->tm_mday, tm->tm_mon + 1, tm->tm_year % 100, tm->tm_hour, tm->tm_min, tm->tm_sec);
+ LOGP(DSMS, LOGL_DEBUG, "Encode time stamp '%02d.%02d.%02d %02d:%02d:%02d'\n", tm->tm_mday, tm->tm_mon + 1, tm->tm_year % 100, tm->tm_hour, tm->tm_min, tm->tm_sec);
/* year */
digit1 = (tm->tm_year % 100) / 10;
@@ -247,7 +247,7 @@ static int encode_userdata(uint8_t *data, const char *message)
uint8_t character;
int i, j, pos;
- PDEBUG(DSMS, DEBUG_DEBUG, "Encode user data '%s'\n", message);
+ LOGP(DSMS, LOGL_DEBUG, "Encode user data '%s'\n", message);
j = 0;
pos = 0;
@@ -293,17 +293,17 @@ int sms_deliver(nmt_t *nmt, uint8_t ref, const char *orig_address, uint8_t orig_
int orig_len;
int msg_len;
- PDEBUG(DSMS, DEBUG_INFO, "Delivering SMS from upper layer\n");
+ LOGP(DSMS, LOGL_INFO, "Delivering SMS from upper layer\n");
orig_len = strlen(orig_address);
msg_len = strlen(message);
if (orig_len > 24) {
- PDEBUG(DSMS, DEBUG_NOTICE, "Originator Address too long (%d characters)\n", orig_len);
+ LOGP(DSMS, LOGL_NOTICE, "Originator Address too long (%d characters)\n", orig_len);
return -EINVAL;
}
if (msg_len > 140) {
- PDEBUG(DSMS, DEBUG_NOTICE, "Message too long (%d characters)\n", msg_len);
+ LOGP(DSMS, LOGL_NOTICE, "Message too long (%d characters)\n", msg_len);
return -EINVAL;
}
@@ -326,13 +326,13 @@ int sms_deliver(nmt_t *nmt, uint8_t ref, const char *orig_address, uint8_t orig_
/* RP length */
*tpdu_length = length - (uint8_t)(tpdu_length - data) - 1;
- PDEBUG(DSMS, DEBUG_DEBUG, " -> TPDU length = %d\n", *tpdu_length);
+ LOGP(DSMS, LOGL_DEBUG, " -> TPDU length = %d\n", *tpdu_length);
nmt->sms.mt = 1;
dms_send(nmt, data, length, 1);
/* start timer */
- timer_start(&nmt->sms_timer, SMS_RECEIVE_TO);
+ osmo_timer_schedule(&nmt->sms_timer, SMS_RECEIVE_TO);
return 0;
}
@@ -343,7 +343,7 @@ static void sms_submit_report(nmt_t *nmt, uint8_t ref, int error)
uint8_t data[64];
int length = 0;
- PDEBUG(DSMS, DEBUG_INFO, "Sending Submit Report (%s)\n", (error) ? "error" : "ok");
+ LOGP(DSMS, LOGL_INFO, "Sending Submit Report (%s)\n", (error) ? "error" : "ok");
/* HEADER */
length = encode_header(data);
@@ -417,7 +417,7 @@ static int decode_sms_submit(nmt_t *nmt, const uint8_t *data, int length)
/* do we have originator address length ? */
if (length < 2) {
- PDEBUG(DSMS, DEBUG_DEBUG, "SMS still incomplete, waiting for originator address\n");
+ LOGP(DSMS, LOGL_DEBUG, "SMS still incomplete, waiting for originator address\n");
return 0;
}
orig_data = 2 + data;
@@ -426,7 +426,7 @@ static int decode_sms_submit(nmt_t *nmt, const uint8_t *data, int length)
orig_plan = data[1] & 0x0f;
orig_len = (orig_digits + 1) >> 1;
if (length < 2 + orig_len) {
- PDEBUG(DSMS, DEBUG_DEBUG, "SMS still incomplete, waiting for originator address digits (got %d of %d)\n", length - 1, orig_len);
+ LOGP(DSMS, LOGL_DEBUG, "SMS still incomplete, waiting for originator address digits (got %d of %d)\n", length - 1, orig_len);
return 0;
}
data += 2 + orig_len;
@@ -434,17 +434,17 @@ static int decode_sms_submit(nmt_t *nmt, const uint8_t *data, int length)
/* do we have user data IE ? */
if (length < 2) {
- PDEBUG(DSMS, DEBUG_DEBUG, "SMS still incomplete, waiting for user data IE\n");
+ LOGP(DSMS, LOGL_DEBUG, "SMS still incomplete, waiting for user data IE\n");
return 0;
}
if (data[0] != RP_IE_USER_DATA) {
- PDEBUG(DSMS, DEBUG_NOTICE, "missing user data IE\n");
+ LOGP(DSMS, LOGL_NOTICE, "missing user data IE\n");
return -FSC_ERROR_IN_MS;
}
tpdu_len = data[1];
tpdu_data = 2 + data;
if (length < 2 + tpdu_len) {
- PDEBUG(DSMS, DEBUG_DEBUG, "SMS still incomplete, waiting for TPDU to be complete\n");
+ LOGP(DSMS, LOGL_DEBUG, "SMS still incomplete, waiting for TPDU to be complete\n");
return 0;
}
data += 2 + tpdu_len;
@@ -453,7 +453,7 @@ static int decode_sms_submit(nmt_t *nmt, const uint8_t *data, int length)
/* decode orig address */
char orig_address[orig_digits + 1];
decode_address(orig_data, orig_digits, orig_address);
- PDEBUG(DSMS, DEBUG_DEBUG, "Decoded originating address: '%s'\n", orig_address);
+ LOGP(DSMS, LOGL_DEBUG, "Decoded originating address: '%s'\n", orig_address);
/* go into TP */
data = tpdu_data;
@@ -461,11 +461,11 @@ static int decode_sms_submit(nmt_t *nmt, const uint8_t *data, int length)
/* check msg_type */
if (length < 1) {
- PDEBUG(DSMS, DEBUG_NOTICE, "short read user data IE\n");
+ LOGP(DSMS, LOGL_NOTICE, "short read user data IE\n");
return -FSC_ERROR_IN_MS;
}
if ((data[0] & MTI_MASK) != MTI_SMS_SUBMIT) {
- PDEBUG(DSMS, DEBUG_NOTICE, "especting SUBMIT MTI, but got 0x%02x\n", data[0]);
+ LOGP(DSMS, LOGL_NOTICE, "especting SUBMIT MTI, but got 0x%02x\n", data[0]);
return -FSC_ERROR_IN_MS;
}
if ((data[0] & VPF_MASK))
@@ -475,7 +475,7 @@ static int decode_sms_submit(nmt_t *nmt, const uint8_t *data, int length)
/* decode msg ref */
if (length < 1) {
- PDEBUG(DSMS, DEBUG_NOTICE, "short read user data IE\n");
+ LOGP(DSMS, LOGL_NOTICE, "short read user data IE\n");
return -FSC_ERROR_IN_MS;
}
msg_ref = data[0];
@@ -484,7 +484,7 @@ static int decode_sms_submit(nmt_t *nmt, const uint8_t *data, int length)
/* decode dest address */
if (length < 2) {
- PDEBUG(DSMS, DEBUG_NOTICE, "short read user data IE\n");
+ LOGP(DSMS, LOGL_NOTICE, "short read user data IE\n");
return -FSC_ERROR_IN_MS;
}
dest_data = 2 + data;
@@ -493,18 +493,18 @@ static int decode_sms_submit(nmt_t *nmt, const uint8_t *data, int length)
dest_plan = data[1] & 0x0f;
dest_len = (dest_digits + 1) >> 1;
if (length < 2 + dest_len) {
- PDEBUG(DSMS, DEBUG_NOTICE, "short read user data IE\n");
+ LOGP(DSMS, LOGL_NOTICE, "short read user data IE\n");
return -FSC_ERROR_IN_MS;
}
data += 2 + dest_len;
length -= 2 + dest_len;
char dest_address[dest_digits + 1];
decode_address(dest_data, dest_digits, dest_address);
- PDEBUG(DSMS, DEBUG_DEBUG, "Decoded destination address: '%s'\n", dest_address);
+ LOGP(DSMS, LOGL_DEBUG, "Decoded destination address: '%s'\n", dest_address);
/* skip above protocol identifier */
if (length < 1) {
- PDEBUG(DSMS, DEBUG_NOTICE, "short read above protocol identifier IE\n");
+ LOGP(DSMS, LOGL_NOTICE, "short read above protocol identifier IE\n");
return -FSC_ERROR_IN_MS;
}
data++;
@@ -512,17 +512,17 @@ static int decode_sms_submit(nmt_t *nmt, const uint8_t *data, int length)
/* decode data coding scheme */
if (length < 1) {
- PDEBUG(DSMS, DEBUG_NOTICE, "short data coding scheme IE\n");
+ LOGP(DSMS, LOGL_NOTICE, "short data coding scheme IE\n");
return -FSC_ERROR_IN_MS;
}
if (data[0] == 0x00) {
- PDEBUG(DSMS, DEBUG_DEBUG, "SMS coding is 7 bits (got 0x%02x)\n", data[0]);
+ LOGP(DSMS, LOGL_DEBUG, "SMS coding is 7 bits (got 0x%02x)\n", data[0]);
coding = 7;
} else if ((data[0] & 0xf0) == 0x30) {
- PDEBUG(DSMS, DEBUG_DEBUG, "SMS coding is 8 bits (got 0x%02x)\n", data[0]);
+ LOGP(DSMS, LOGL_DEBUG, "SMS coding is 8 bits (got 0x%02x)\n", data[0]);
coding = 8;
} else {
- PDEBUG(DSMS, DEBUG_NOTICE, "SMS coding unsupported (got 0x%02x)\n", data[0]);
+ LOGP(DSMS, LOGL_NOTICE, "SMS coding unsupported (got 0x%02x)\n", data[0]);
return -FSC_ERROR_IN_MS;
}
data++;
@@ -531,7 +531,7 @@ static int decode_sms_submit(nmt_t *nmt, const uint8_t *data, int length)
/* skip validity period */
if (tp_vpf_present) {
if (length < 1) {
- PDEBUG(DSMS, DEBUG_NOTICE, "short read validity period IE\n");
+ LOGP(DSMS, LOGL_NOTICE, "short read validity period IE\n");
return -FSC_ERROR_IN_MS;
}
data++;
@@ -540,7 +540,7 @@ static int decode_sms_submit(nmt_t *nmt, const uint8_t *data, int length)
/* decode data message text */
if (length < 1) {
- PDEBUG(DSMS, DEBUG_NOTICE, "short read user data IE\n");
+ LOGP(DSMS, LOGL_NOTICE, "short read user data IE\n");
return -FSC_ERROR_IN_MS;
}
msg_data = data + 1;
@@ -550,20 +550,20 @@ static int decode_sms_submit(nmt_t *nmt, const uint8_t *data, int length)
else
msg_len = msg_chars;
if (length < 1 + msg_len) {
- PDEBUG(DSMS, DEBUG_NOTICE, "short read user data IE\n");
+ LOGP(DSMS, LOGL_NOTICE, "short read user data IE\n");
return -FSC_ERROR_IN_MS;
}
char message[msg_chars + 1];
if (coding == 7) {
decode_message_7(msg_data, msg_len, message);
- PDEBUG(DSMS, DEBUG_DEBUG, "Decoded message: '%s'\n", message);
+ LOGP(DSMS, LOGL_DEBUG, "Decoded message: '%s'\n", message);
} else {
memcpy(message, msg_data, msg_len);
message[msg_len] = '\0';
- PDEBUG(DSMS, DEBUG_DEBUG, "Included message: '%s'\n", message);
+ LOGP(DSMS, LOGL_DEBUG, "Included message: '%s'\n", message);
}
- PDEBUG(DSMS, DEBUG_INFO, "Submitting SMS to upper layer\n");
+ LOGP(DSMS, LOGL_INFO, "Submitting SMS to upper layer\n");
rc = sms_submit(nmt, ref, orig_address, orig_type, orig_plan, msg_ref, dest_address, dest_type, dest_plan, message);
if (rc < 0)
@@ -584,18 +584,18 @@ static int decode_deliver_report(nmt_t *nmt, const uint8_t *data, int length)
if ((data[0] & RP_MTI_MASK) == RP_MT_ERROR) {
error = 1;
if (length < 4) {
- PDEBUG(DSMS, DEBUG_DEBUG, "deliver report still incomplete, waiting for cause IE\n");
+ LOGP(DSMS, LOGL_DEBUG, "deliver report still incomplete, waiting for cause IE\n");
return 0;
}
if (length < 4 + data[3]) {
- PDEBUG(DSMS, DEBUG_DEBUG, "deliver report still incomplete, waiting for cause IE content\n");
+ LOGP(DSMS, LOGL_DEBUG, "deliver report still incomplete, waiting for cause IE content\n");
return 0;
}
if (data[2] == RP_IE_CAUSE && data[3] > 0)
cause = data[4];
- PDEBUG(DSMS, DEBUG_INFO, "Received Delivery report: ERROR, cause=%d\n", cause);
+ LOGP(DSMS, LOGL_INFO, "Received Delivery report: ERROR, cause=%d\n", cause);
} else
- PDEBUG(DSMS, DEBUG_INFO, "Received Delivery report: OK\n");
+ LOGP(DSMS, LOGL_INFO, "Received Delivery report: OK\n");
sms_deliver_report(nmt, ref, error, cause);
@@ -616,21 +616,21 @@ void dms_receive(nmt_t *nmt, const uint8_t *data, int length, int __attribute__(
debug_text[length * 5] = '\0';
/* restart timer */
- timer_start(&nmt->sms_timer, SMS_RECEIVE_TO);
+ osmo_timer_schedule(&nmt->sms_timer, SMS_RECEIVE_TO);
- PDEBUG(DSMS, DEBUG_DEBUG, "Received %d bytes from DMS layer:%s\n", length, debug_text);
+ LOGP(DSMS, LOGL_DEBUG, "Received %d bytes from DMS layer:%s\n", length, debug_text);
if (sms->mt && !sms->data_sent) {
- PDEBUG(DSMS, DEBUG_NOTICE, "Ignoring data while we transmit data\n");
+ LOGP(DSMS, LOGL_NOTICE, "Ignoring data while we transmit data\n");
return;
}
/* append received data */
space = sizeof(sms->rx_buffer) - sms->rx_count;
if (space < length) {
- PDEBUG(DSMS, DEBUG_NOTICE, "Received message exceeds RX buffer, terminating call!\n");
+ LOGP(DSMS, LOGL_NOTICE, "Received message exceeds RX buffer, terminating call!\n");
release:
- timer_start(&nmt->sms_timer, SMS_RELEASE_TO);
+ osmo_timer_schedule(&nmt->sms_timer, SMS_RELEASE_TO);
return;
}
memcpy(sms->rx_buffer + sms->rx_count, data, length);
@@ -661,12 +661,12 @@ release:
rc = 0;
break;
case RP_SM_READY_TO_RECEIVE:
- PDEBUG(DSMS, DEBUG_NOTICE, "Received READY-TO-RECEVIE message.\n");
+ LOGP(DSMS, LOGL_NOTICE, "Received READY-TO-RECEVIE message.\n");
data += length;
length -= length;
break;
default:
- PDEBUG(DSMS, DEBUG_NOTICE, "Received unknown RP message type %d.\n", data[0]);
+ LOGP(DSMS, LOGL_NOTICE, "Received unknown RP message type %d.\n", data[0]);
rc = -1;
}
if (rc)
@@ -675,9 +675,9 @@ release:
return;
}
-static void sms_timeout(struct timer *timer)
+static void sms_timeout(void *data)
{
- nmt_t *nmt = (nmt_t *)timer->priv;
+ nmt_t *nmt = data;
sms_release(nmt);
}
@@ -689,11 +689,11 @@ void dms_all_sent(nmt_t *nmt)
if (!sms->data_sent) {
if (!sms->mt) {
- PDEBUG(DSMS, DEBUG_DEBUG, "Done sending submit report, releasing.\n");
- timer_start(&nmt->sms_timer, SMS_RELEASE_TO);
+ LOGP(DSMS, LOGL_DEBUG, "Done sending submit report, releasing.\n");
+ osmo_timer_schedule(&nmt->sms_timer, SMS_RELEASE_TO);
}
sms->data_sent = 1;
- PDEBUG(DSMS, DEBUG_DEBUG, "DMS layer indicates acknowledge of sent data\n");
+ LOGP(DSMS, LOGL_DEBUG, "DMS layer indicates acknowledge of sent data\n");
}
}
@@ -701,9 +701,8 @@ void sms_reset(nmt_t *nmt)
{
sms_t *sms = &nmt->sms;
- PDEBUG(DSMS, DEBUG_DEBUG, "Resetting SMS states\n");
- if (nmt->sms_timer.linked)
- timer_stop(&nmt->sms_timer);
+ LOGP(DSMS, LOGL_DEBUG, "Resetting SMS states\n");
+ osmo_timer_del(&nmt->sms_timer);
memset(sms, 0, sizeof(*sms));
}
diff --git a/src/nmt/tones.c b/src/nmt/tones.c
index d333066..587e59f 100644
--- a/src/nmt/tones.c
+++ b/src/nmt/tones.c
@@ -1,5 +1,6 @@
#include <stdint.h>
+#include "tones.h"
static int16_t pattern[] = {
0, 5320, 10063, 13716, 15883, 16328, 15004, 12054, 7798, 2697, -2697, -7798, -12054, -15004, -16328, -15883, -13716, -10063, -5320,
diff --git a/src/nmt/transaction.c b/src/nmt/transaction.c
index 39aed2f..000d8e8 100644
--- a/src/nmt/transaction.c
+++ b/src/nmt/transaction.c
@@ -22,12 +22,12 @@
#include <stdlib.h>
#include <string.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "nmt.h"
#include "transaction.h"
static transaction_t *trans_list = NULL;
-static void transaction_timeout(struct timer *timer);
+static void transaction_timeout(void *data);
/* link transaction to list */
static void link_transaction(transaction_t *trans)
@@ -35,7 +35,7 @@ static void link_transaction(transaction_t *trans)
transaction_t **transp;
/* attach to end of list, so first transaction is served first */
- PDEBUG(DTRANS, DEBUG_DEBUG, "Linking transaction %p to list\n", trans);
+ LOGP(DTRANS, LOGL_DEBUG, "Linking transaction %p to list\n", trans);
trans->next = NULL;
transp = &trans_list;
while (*transp)
@@ -51,12 +51,12 @@ static void unlink_transaction(transaction_t *trans)
nmt_t *nmt;
/* unlink */
- PDEBUG(DTRANS, DEBUG_DEBUG, "Unlinking transaction %p from list\n", trans);
+ LOGP(DTRANS, LOGL_DEBUG, "Unlinking transaction %p from list\n", trans);
transp = &trans_list;
while (*transp && *transp != trans)
transp = &((*transp)->next);
if (!(*transp)) {
- PDEBUG(DTRANS, DEBUG_ERROR, "Transaction not in list, please fix!!\n");
+ LOGP(DTRANS, LOGL_ERROR, "Transaction not in list, please fix!!\n");
abort();
}
*transp = trans->next;
@@ -78,15 +78,15 @@ transaction_t *create_transaction(struct nmt_subscriber *subscr)
trans = calloc(1, sizeof(*trans));
if (!trans) {
- PDEBUG(DTRANS, DEBUG_ERROR, "No memory!\n");
+ LOGP(DTRANS, LOGL_ERROR, "No memory!\n");
return NULL;
}
- timer_init(&trans->timer, transaction_timeout, trans);
+ osmo_timer_setup(&trans->timer, transaction_timeout, trans);
memcpy(&trans->subscriber, subscr, sizeof(struct nmt_subscriber));
- PDEBUG(DTRANS, DEBUG_INFO, "Created transaction for subscriber '%c,%s'\n", subscr->country, subscr->number);
+ LOGP(DTRANS, LOGL_INFO, "Created transaction for subscriber '%c,%s'\n", subscr->country, subscr->number);
link_transaction(trans);
@@ -98,17 +98,17 @@ void destroy_transaction(transaction_t *trans)
{
unlink_transaction(trans);
- PDEBUG(DTRANS, DEBUG_INFO, "Destroying transaction for subscriber '%c,%s'\n", trans->subscriber.country, trans->subscriber.number);
+ LOGP(DTRANS, LOGL_INFO, "Destroying transaction for subscriber '%c,%s'\n", trans->subscriber.country, trans->subscriber.number);
- timer_exit(&trans->timer);
+ osmo_timer_del(&trans->timer);
free(trans);
}
/* Timeout handling */
-static void transaction_timeout(struct timer *timer)
+static void transaction_timeout(void *data)
{
- transaction_t *trans = (transaction_t *)timer->priv;
+ transaction_t *trans = data;
timeout_mt_paging(trans);
}
diff --git a/src/nmt/transaction.h b/src/nmt/transaction.h
index 6af4501..fcfc4d8 100644
--- a/src/nmt/transaction.h
+++ b/src/nmt/transaction.h
@@ -14,7 +14,7 @@ typedef struct transaction {
nmt_t *nmt; /* pointer to nmt instance, if bound to a channel */
int callref; /* callref for transaction */
struct nmt_subscriber subscriber;
- struct timer timer;
+ struct osmo_timer_list timer;
int page_try; /* number of paging try */
/* caller ID */
diff --git a/src/pocsag/Makefile.am b/src/pocsag/Makefile.am
index 817a95b..1813ce5 100644
--- a/src/pocsag/Makefile.am
+++ b/src/pocsag/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
bin_PROGRAMS = \
pocsag
@@ -13,20 +13,19 @@ pocsag_LDADD = \
$(COMMON_LA) \
../anetz/libgermanton.a \
$(top_builddir)/src/liboptions/liboptions.a \
- $(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libmobile/libmobile.a \
- $(top_builddir)/src/libosmocc/libosmocc.a \
$(top_builddir)/src/libdisplay/libdisplay.a \
$(top_builddir)/src/libjitter/libjitter.a \
- $(top_builddir)/src/libtimer/libtimer.a \
$(top_builddir)/src/libsamplerate/libsamplerate.a \
$(top_builddir)/src/libemphasis/libemphasis.a \
$(top_builddir)/src/libfm/libfm.a \
$(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \
- $(top_builddir)/src/libg711/libg711.a \
$(top_builddir)/src/libaaimage/libaaimage.a \
+ $(top_builddir)/src/liblogging/liblogging.a \
+ $(LIBOSMOCORE_LIBS) \
+ $(LIBOSMOCC_LIBS) \
-lm
if HAVE_ALSA
diff --git a/src/pocsag/dsp.c b/src/pocsag/dsp.c
index af1a80b..4d8b1df 100644
--- a/src/pocsag/dsp.c
+++ b/src/pocsag/dsp.c
@@ -26,7 +26,7 @@
#include <errno.h>
#include <math.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "pocsag.h"
#include "frame.h"
#include "dsp.h"
@@ -40,7 +40,7 @@ static void dsp_init_ramp(pocsag_t *pocsag)
double c;
int i;
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Generating cosine shaped ramp table.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Generating cosine shaped ramp table.\n");
for (i = 0; i < 256; i++) {
/* This is mathematically incorrect... */
if (i < 64)
@@ -59,7 +59,7 @@ int dsp_init_sender(pocsag_t *pocsag, int samplerate, int baudrate, double devia
{
int rc;
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Init DSP for transceiver.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Init DSP for transceiver.\n");
/* set modulation parameters */
// NOTE: baudrate equals modulation, because we have a raised cosine ramp of beta = 0.5
@@ -67,12 +67,12 @@ int dsp_init_sender(pocsag_t *pocsag, int samplerate, int baudrate, double devia
pocsag->fsk_bitduration = (double)samplerate / (double)baudrate;
pocsag->fsk_bitstep = 1.0 / pocsag->fsk_bitduration;
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Use %.4f samples for one bit duration @ %d.\n", pocsag->fsk_bitduration, pocsag->sender.samplerate);
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Use %.4f samples for one bit duration @ %d.\n", pocsag->fsk_bitduration, pocsag->sender.samplerate);
pocsag->fsk_tx_buffer_size = pocsag->fsk_bitduration * 32.0 + 10; /* 32 bit, add some extra to prevent short buffer due to rounding */
pocsag->fsk_tx_buffer = calloc(sizeof(sample_t), pocsag->fsk_tx_buffer_size);
if (!pocsag->fsk_tx_buffer) {
- PDEBUG_CHAN(DDSP, DEBUG_ERROR, "No memory!\n");
+ LOGP_CHAN(DDSP, LOGL_ERROR, "No memory!\n");
rc = -ENOMEM;
goto error;
}
@@ -94,7 +94,7 @@ error:
/* Cleanup transceiver instance. */
void dsp_cleanup_sender(pocsag_t *pocsag)
{
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Cleanup DSP for transceiver.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Cleanup DSP for transceiver.\n");
if (pocsag->fsk_tx_buffer) {
free(pocsag->fsk_tx_buffer);
@@ -180,7 +180,7 @@ static void fsk_block_decode(pocsag_t *pocsag, uint8_t bit)
pocsag->fsk_rx_index = 0;
} else
if (pocsag->fsk_rx_word == (uint32_t)(~CODEWORD_SYNC))
- PDEBUG_CHAN(DDSP, DEBUG_NOTICE, "Received inverted sync, caused by wrong polarity or by radio noise. Verify correct polarity!\n");
+ LOGP_CHAN(DDSP, LOGL_NOTICE, "Received inverted sync, caused by wrong polarity or by radio noise. Verify correct polarity!\n");
} else {
pocsag->fsk_rx_word = (pocsag->fsk_rx_word << 1) | bit;
if (++pocsag->fsk_rx_index == 32) {
diff --git a/src/pocsag/frame.c b/src/pocsag/frame.c
index 12ccd10..40a2fe4 100644
--- a/src/pocsag/frame.c
+++ b/src/pocsag/frame.c
@@ -23,7 +23,7 @@
#include <string.h>
#include <errno.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "pocsag.h"
#include "frame.h"
@@ -38,7 +38,7 @@
static const char numeric[16] = "0123456789RU -][";
static const char hex[16] = "0123456789abcdef";
-static const char *ctrlchar[32] = {
+static const char *ctrl_char[33] = {
"<NUL>",
"<SOH>",
"<STX>",
@@ -71,8 +71,37 @@ static const char *ctrlchar[32] = {
"<GS>",
"<RS>",
"<US>",
+ "<DEL>",
};
+const char *print_message(const char *message, int message_length)
+{
+ static char message_print[1024];
+ const char *c;
+ int i, ii, clen;
+
+ /* i is input counter, ii is output counter */
+ for (i = 0, ii = 0; i < message_length; i++) {
+ if (message[i] >= 0 && message[i] <= 31)
+ c = ctrl_char[(int)message[i]];
+ else if (message[i] == 127)
+ c = ctrl_char[(int)message[32]];
+ else {
+ message_print[ii++] = message[i];
+ continue;
+ }
+ clen = strlen(c);
+ if (ii + clen == sizeof(message_print))
+ break;
+ memcpy(message_print + ii, c, clen);
+ ii += clen;
+ }
+ message_print[ii++] = '\0';
+
+ return message_print;
+}
+
+
static uint32_t pocsag_crc(uint32_t word)
{
uint32_t denominator = 0x76900000;
@@ -103,29 +132,29 @@ static uint32_t pocsag_parity(uint32_t word)
static int debug_word(uint32_t word, int slot)
{
if (pocsag_crc(word >> 11) != ((word >> 1) & 0x3ff)) {
- PDEBUG(DPOCSAG, DEBUG_NOTICE, "CRC error in codeword 0x%08x.\n", word);
+ LOGP(DPOCSAG, LOGL_NOTICE, "CRC error in codeword 0x%08x.\n", word);
return -EINVAL;
}
if (pocsag_parity(word)) {
- PDEBUG(DPOCSAG, DEBUG_NOTICE, "Parity error in codeword 0x%08x.\n", word);
+ LOGP(DPOCSAG, LOGL_NOTICE, "Parity error in codeword 0x%08x.\n", word);
return -EINVAL;
}
if (word == CODEWORD_SYNC) {
- PDEBUG(DPOCSAG, DEBUG_DEBUG, "-> valid sync word\n");
+ LOGP(DPOCSAG, LOGL_DEBUG, "-> valid sync word\n");
return 0;
}
if (word == CODEWORD_IDLE) {
- PDEBUG(DPOCSAG, DEBUG_DEBUG, "-> valid idle word\n");
+ LOGP(DPOCSAG, LOGL_DEBUG, "-> valid idle word\n");
return 0;
}
if (!(word & 0x80000000)) {
- PDEBUG(DPOCSAG, DEBUG_DEBUG, "-> valid address word: RIC = '%d', function = '%d' (%s)\n", ((word >> 10) & 0x1ffff8) + slot, (word >> 11) & 0x3, pocsag_function_name[(word >> 11) & 0x3]);
+ LOGP(DPOCSAG, LOGL_DEBUG, "-> valid address word: RIC = '%d', function = '%d' (%s)\n", ((word >> 10) & 0x1ffff8) + slot, (word >> 11) & 0x3, pocsag_function_name[(word >> 11) & 0x3]);
} else {
- PDEBUG(DPOCSAG, DEBUG_DEBUG, "-> valid message word: message = '0x%05x'\n", (word >> 11) & 0xfffff);
+ LOGP(DPOCSAG, LOGL_DEBUG, "-> valid message word: message = '0x%05x'\n", (word >> 11) & 0xfffff);
}
return 0;
@@ -237,7 +266,7 @@ static uint32_t encode_alpha(pocsag_msg_t *msg)
/* fill remaining digit space with 0x04 (EOT) */
while (bits <= 13) {
- word = (word << 7) | 0x10;
+ word = (word << 7) | msg->padding;
bits += 7;
}
@@ -303,9 +332,9 @@ int64_t get_codeword(pocsag_t *pocsag)
return -1;
case POCSAG_PREAMBLE:
if (!pocsag->word_count)
- PDEBUG_CHAN(DPOCSAG, DEBUG_INFO, "Sending preamble.\n");
+ LOGP_CHAN(DPOCSAG, LOGL_INFO, "Sending preamble.\n");
/* transmit preamble */
- PDEBUG_CHAN(DPOCSAG, DEBUG_DEBUG, "Sending 32 bits of preamble pattern 0x%08x.\n", CODEWORD_PREAMBLE);
+ LOGP_CHAN(DPOCSAG, LOGL_DEBUG, "Sending 32 bits of preamble pattern 0x%08x.\n", CODEWORD_PREAMBLE);
if (++pocsag->word_count == PREAMBLE_COUNT) {
pocsag_new_state(pocsag, POCSAG_MESSAGE);
pocsag->word_count = 0;
@@ -315,10 +344,10 @@ int64_t get_codeword(pocsag_t *pocsag)
break;
case POCSAG_MESSAGE:
if (!pocsag->word_count)
- PDEBUG_CHAN(DPOCSAG, DEBUG_INFO, "Sending batch.\n");
+ LOGP_CHAN(DPOCSAG, LOGL_INFO, "Sending batch.\n");
/* send sync */
if (pocsag->word_count == 0) {
- PDEBUG_CHAN(DPOCSAG, DEBUG_DEBUG, "Sending 32 bits of sync pattern 0x%08x.\n", CODEWORD_SYNC);
+ LOGP_CHAN(DPOCSAG, LOGL_DEBUG, "Sending 32 bits of sync pattern 0x%08x.\n", CODEWORD_SYNC);
/* count codewords */
++pocsag->word_count;
word = CODEWORD_SYNC;
@@ -339,20 +368,16 @@ int64_t get_codeword(pocsag_t *pocsag)
default:
word = CODEWORD_IDLE; /* should never happen */
}
- /* if message is complete, reset index. if message is not to be repeated, remove message */
+ /* if message is complete, reset index and remove message */
if (msg->data_index == msg->data_length) {
pocsag->current_msg = NULL;
msg->data_index = 0;
- if (msg->repeat)
- msg->repeat--;
- else {
- pocsag_msg_destroy(msg);
- pocsag_msg_done(pocsag);
- }
+ pocsag_msg_destroy(msg);
+ pocsag_msg_done(pocsag);
}
/* prevent 'use-after-free' from this point on */
msg = NULL;
- PDEBUG_CHAN(DPOCSAG, DEBUG_DEBUG, "Sending 32 bits of message codeword 0x%08x (frame %d.%d).\n", word, slot, subslot);
+ LOGP_CHAN(DPOCSAG, LOGL_DEBUG, "Sending 32 bits of message codeword 0x%08x (frame %d.%d).\n", word, slot, subslot);
/* count codewords */
if (++pocsag->word_count == 17)
pocsag->word_count = 0;
@@ -365,46 +390,39 @@ int64_t get_codeword(pocsag_t *pocsag)
break;
}
if (msg) {
- PDEBUG_CHAN(DPOCSAG, DEBUG_INFO, "Sending message to RIC '%d' / function '%d' (%s)\n", msg->ric, msg->function, pocsag_function_name[msg->function]);
+ LOGP_CHAN(DPOCSAG, LOGL_INFO, "Sending message to RIC '%d' / function '%d' (%s)\n", msg->ric, msg->function, pocsag_function_name[msg->function]);
/* reset idle counter */
pocsag->idle_count = 0;
/* encode address */
word = encode_address(msg);
/* link message, if there is data to be sent */
- if ((msg->function == POCSAG_FUNCTION_NUMERIC || msg->function == POCSAG_FUNCTION_ALPHA) && msg->data_length) {
- char text[msg->data_length + 1];
- memcpy(text, msg->data, msg->data_length);
- text[msg->data_length] = '\0';
- PDEBUG_CHAN(DPOCSAG, DEBUG_INFO, " -> Message text is \"%s\".\n", text);
+ if (msg->function == POCSAG_FUNCTION_NUMERIC || msg->function == POCSAG_FUNCTION_ALPHA) {
+ LOGP_CHAN(DPOCSAG, LOGL_INFO, " -> Message text is \"%s\".\n", print_message(msg->data, msg->data_length));
pocsag->current_msg = msg;
msg->data_index = 0;
msg->bit_index = 0;
} else {
- /* if message is not to be repeated, remove message */
- if (msg->repeat)
- msg->repeat--;
- else {
- pocsag_msg_destroy(msg);
- pocsag_msg_done(pocsag);
- }
+ /* remove message */
+ pocsag_msg_destroy(msg);
+ pocsag_msg_done(pocsag);
/* prevent 'use-after-free' from this point on */
msg = NULL;
}
- PDEBUG_CHAN(DPOCSAG, DEBUG_DEBUG, "Sending 32 bits of address codeword 0x%08x (frame %d.%d).\n", word, slot, subslot);
+ LOGP_CHAN(DPOCSAG, LOGL_DEBUG, "Sending 32 bits of address codeword 0x%08x (frame %d.%d).\n", word, slot, subslot);
/* count codewords */
if (++pocsag->word_count == 17)
pocsag->word_count = 0;
break;
}
/* no message, so we send idle pattern */
- PDEBUG_CHAN(DPOCSAG, DEBUG_DEBUG, "Sending 32 bits of idle pattern 0x%08x (frame %d.%d).\n", CODEWORD_IDLE, slot, subslot);
+ LOGP_CHAN(DPOCSAG, LOGL_DEBUG, "Sending 32 bits of idle pattern 0x%08x (frame %d.%d).\n", CODEWORD_IDLE, slot, subslot);
/* count codewords */
if (++pocsag->word_count == 17) {
pocsag->word_count = 0;
/* if no message has been scheduled during transmission and idle counter is reached, stop transmitter */
if (!pocsag->msg_list && pocsag->idle_count++ == IDLE_BATCHES) {
- PDEBUG_CHAN(DPOCSAG, DEBUG_INFO, "Transmission done.\n");
- PDEBUG_CHAN(DPOCSAG, DEBUG_DEBUG, "Reached %d of idle batches, turning transmitter off.\n", IDLE_BATCHES);
+ LOGP_CHAN(DPOCSAG, LOGL_INFO, "Transmission done.\n");
+ LOGP_CHAN(DPOCSAG, LOGL_DEBUG, "Reached %d of idle batches, turning transmitter off.\n", IDLE_BATCHES);
pocsag_new_state(pocsag, POCSAG_IDLE);
}
}
@@ -420,31 +438,18 @@ int64_t get_codeword(pocsag_t *pocsag)
static void done_rx_msg(pocsag_t *pocsag)
{
+ const char *text;
+
if (!pocsag->rx_msg_valid)
return;
pocsag->rx_msg_valid = 0;
- PDEBUG_CHAN(DPOCSAG, DEBUG_INFO, "Received message from RIC '%d' / function '%d' (%s)\n", pocsag->rx_msg_ric, pocsag->rx_msg_function, pocsag_function_name[pocsag->rx_msg_function]);
- {
- char text[pocsag->rx_msg_data_length * 5 + 1];
- int i, j;
- for (i = 0, j = 0; i < pocsag->rx_msg_data_length; i++) {
- if (pocsag->rx_msg_data[i] == 127) {
- strcpy(text + j, "<DEL>");
- j += strlen(text + j);
- } else
- if (pocsag->rx_msg_data[i] < 32) {
- strcpy(text + j, ctrlchar[(int)pocsag->rx_msg_data[i]]);
- j += strlen(text + j);
- } else
- text[j++] = pocsag->rx_msg_data[i];
- }
- text[j] = '\0';
- if ((pocsag->rx_msg_function == POCSAG_FUNCTION_NUMERIC || pocsag->rx_msg_function == POCSAG_FUNCTION_ALPHA) && text[0])
- PDEBUG_CHAN(DPOCSAG, DEBUG_INFO, " -> Message text is \"%s\".\n", text);
- pocsag_msg_receive(pocsag->language, pocsag->sender.kanal, pocsag->rx_msg_ric, pocsag->rx_msg_function, text);
- }
+ LOGP_CHAN(DPOCSAG, LOGL_INFO, "Received message from RIC '%d' / function '%d' (%s)\n", pocsag->rx_msg_ric, pocsag->rx_msg_function, pocsag_function_name[pocsag->rx_msg_function]);
+ text = print_message(pocsag->rx_msg_data, pocsag->rx_msg_data_length);
+ if (pocsag->rx_msg_function == POCSAG_FUNCTION_NUMERIC || pocsag->rx_msg_function == POCSAG_FUNCTION_ALPHA)
+ LOGP_CHAN(DPOCSAG, LOGL_INFO, " -> Message text is \"%s\".\n", text);
+ pocsag_msg_receive(pocsag->language, pocsag->sender.kanal, pocsag->rx_msg_ric, pocsag->rx_msg_function, text);
}
void put_codeword(pocsag_t *pocsag, uint32_t word, int8_t slot, int8_t subslot)
@@ -452,17 +457,17 @@ void put_codeword(pocsag_t *pocsag, uint32_t word, int8_t slot, int8_t subslot)
int rc;
if (slot < 0 && word == CODEWORD_SYNC) {
- PDEBUG_CHAN(DPOCSAG, DEBUG_DEBUG, "Received 32 bits of sync pattern 0x%08x.\n", CODEWORD_SYNC);
+ LOGP_CHAN(DPOCSAG, LOGL_DEBUG, "Received 32 bits of sync pattern 0x%08x.\n", CODEWORD_SYNC);
return;
}
if (word == CODEWORD_IDLE) {
- PDEBUG_CHAN(DPOCSAG, DEBUG_DEBUG, "Received 32 bits of idle pattern 0x%08x.\n", CODEWORD_IDLE);
+ LOGP_CHAN(DPOCSAG, LOGL_DEBUG, "Received 32 bits of idle pattern 0x%08x.\n", CODEWORD_IDLE);
} else
if (!(word & 0x80000000))
- PDEBUG_CHAN(DPOCSAG, DEBUG_DEBUG, "Received 32 bits of address codeword 0x%08x (frame %d.%d).\n", word, slot, subslot);
+ LOGP_CHAN(DPOCSAG, LOGL_DEBUG, "Received 32 bits of address codeword 0x%08x (frame %d.%d).\n", word, slot, subslot);
else
- PDEBUG_CHAN(DPOCSAG, DEBUG_DEBUG, "Received 32 bits of message codeword 0x%08x (frame %d.%d).\n", word, slot, subslot);
+ LOGP_CHAN(DPOCSAG, LOGL_DEBUG, "Received 32 bits of message codeword 0x%08x (frame %d.%d).\n", word, slot, subslot);
rc = debug_word(word, slot);
if (rc < 0) {
done_rx_msg(pocsag);
diff --git a/src/pocsag/frame.h b/src/pocsag/frame.h
index a22bfa6..b4b7415 100644
--- a/src/pocsag/frame.h
+++ b/src/pocsag/frame.h
@@ -1,4 +1,5 @@
+const char *print_message(const char *message, int message_length);
int64_t get_codeword(pocsag_t *pocsag);
void put_codeword(pocsag_t *pocsag, uint32_t word, int8_t slot, int8_t subslot);
diff --git a/src/pocsag/main.c b/src/pocsag/main.c
index d18b99f..9db82f0 100644
--- a/src/pocsag/main.c
+++ b/src/pocsag/main.c
@@ -27,7 +27,7 @@
#include <sys/stat.h>
#include <fcntl.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../libmobile/call.h"
#include "../libmobile/main_mobile.h"
#include "../liboptions/options.h"
@@ -50,13 +50,14 @@ static double polarity = -1;
static int polarity_given = 0;
static enum pocsag_function function = POCSAG_FUNCTION_NUMERIC;
static const char *message = "1234";
+static char padding = 4;
static enum pocsag_language language = LANGUAGE_DEFAULT;
static uint32_t scan_from = 0;
static uint32_t scan_to = 0;
void print_help(const char *arg0)
{
- main_mobile_print_help(arg0, "-k 466.230 | -k list");
+ main_mobile_print_help(arg0, "-k 466.230 | -k list ");
/* - - */
printf(" -T --tx\n");
printf(" Transmit POCSAG signal on given channel, to page a receiver. (default)\n");
@@ -87,6 +88,8 @@ void print_help(const char *arg0)
printf(" time. The upper 5 digits of the RIC are sent as message, if numeric\n");
printf(" function was selected. The upper 3 digits of the RIC are sent as\n");
printf(" message (2 digits hexadecimal), if alphanumeric function was selected.\n");
+ printf(" --padding 4 | 0 | ...\n");
+ printf(" Text message padding uses 4 (EOT) by default. Old pagers want 0 (NUL).\n");
printf("\n");
printf("File: %s\n", MSG_SEND);
printf(" Write \"<ric>,0,message\" to it to send a numerical message.\n");
@@ -97,6 +100,8 @@ void print_help(const char *arg0)
main_mobile_print_hotkeys();
}
+#define OPT_PADDING 256
+
static void add_options(void)
{
main_mobile_add_options();
@@ -109,6 +114,7 @@ static void add_options(void)
option_add('M', "message", 1);
option_add('L', "language", 0);
option_add('S', "scan", 2);
+ option_add(OPT_PADDING, "padding", 1);
}
static int handle_options(int short_option, int argi, char **argv)
@@ -188,6 +194,9 @@ static int handle_options(int short_option, int argi, char **argv)
return -EINVAL;
}
break;
+ case OPT_PADDING:
+ padding = atoi(argv[argi++]);
+ break;
default:
return main_mobile_handle_options(short_option, argi, argv);
}
@@ -215,12 +224,11 @@ static void myhandler(void)
}
/* send msg */
if (i < pos) {
- buffer[i] = '\0';
pos = 0;
if (tx)
- pocsag_msg_send(language, buffer);
+ pocsag_msg_send(language, buffer, i);
else
- PDEBUG(DPOCSAG, DEBUG_ERROR, "Failed to send message, transmitter is not enabled!\n");
+ LOGP(DPOCSAG, LOGL_ERROR, "Failed to send message, transmitter is not enabled!\n");
}
}
}
@@ -244,7 +252,7 @@ int msg_receive(const char *text)
static const struct number_lengths number_lengths[] = {
{ 7, "RIC with default function" },
- { 8, "RIC with function (append 0..3)" },
+ { 8, "RIC with function (append 0..3 or A..D)" },
{ 0, NULL }
};
@@ -262,7 +270,7 @@ int main(int argc, char *argv[])
init_besetzton();
/* init mobile interface */
- main_mobile_init("0123456789", number_lengths, NULL, pocsag_number_valid);
+ main_mobile_init("0123456789ABCD", number_lengths, NULL, pocsag_number_valid);
/* handle options / config file */
add_options();
@@ -285,9 +293,11 @@ int main(int argc, char *argv[])
print_help(argv[0]);
return 0;
}
- if (!strcasecmp(kanal[0], "list")) {
- pocsag_list_channels();
- goto fail;
+ for (i = 0; i < num_kanal; i++) {
+ if (!strcasecmp(kanal[i], "list")) {
+ pocsag_list_channels();
+ goto fail;
+ }
}
if (use_sdr) {
/* set device */
@@ -341,7 +351,7 @@ int main(int argc, char *argv[])
printf("Invalid channel '%s', Use '-k list' to get a list of all channels.\n\n", kanal[i]);
goto fail;
}
- rc = pocsag_create(kanal[i], frequency, dsp_device[i], use_sdr, dsp_samplerate, rx_gain, tx_gain, tx, rx, language, baudrate, deviation, polarity, function, message, scan_from, scan_to, write_rx_wave, write_tx_wave, read_rx_wave, read_tx_wave, loopback);
+ rc = pocsag_create(kanal[i], frequency, dsp_device[i], use_sdr, dsp_samplerate, rx_gain, tx_gain, tx, rx, language, baudrate, deviation, polarity, function, message, padding, scan_from, scan_to, write_rx_wave, write_tx_wave, read_rx_wave, read_tx_wave, loopback);
if (rc < 0) {
fprintf(stderr, "Failed to create \"Sender\" instance. Quitting!\n");
goto fail;
@@ -362,6 +372,7 @@ fail:
pocsag_destroy(sender_head);
/* exits */
+ main_mobile_exit();
fm_exit();
pocsag_exit();
diff --git a/src/pocsag/pocsag.c b/src/pocsag/pocsag.c
index 40da522..163d3da 100644
--- a/src/pocsag/pocsag.c
+++ b/src/pocsag/pocsag.c
@@ -28,10 +28,10 @@
#include <sys/time.h>
#include <time.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 <osmocom/cc/message.h>
#include "pocsag.h"
#include "frame.h"
#include "dsp.h"
@@ -144,16 +144,19 @@ const char *pocsag_number_valid(const char *number)
/* assume that the number has valid length(s) and digits */
- for (i = 0; i < 7; i++)
+ for (i = 0; i < 7; i++) {
+ if (number[i] < '0' || number[i] > '9')
+ return "Illegal RIC digit (Use 0..9 only)";
ric = ric * 10 + number[i] - '0';
+ }
if (ric > 2097151)
- return "Maximum allowed RIC is (2^21)-1. (2097151)";
+ return "Maximum allowed RIC is (2^21)-1. (2097151)";
if ((ric & 0xfffffff8) == 2007664)
- return "Illegal RIC. (Used for idle codeword)";
+ return "Illegal RIC. (Used for idle codeword)";
- if (number[7] && (number[7] < '0' || number[7] > '3'))
- return "Illegal function digit #8 (Use 0..3 only)";
+ if (number[7] && !(number[7] >= '0' && number[7] <= '3') && !(number[7] >= 'A' && number[7] <= 'D'))
+ return "Illegal function digit #8 (Use 0..3 only)";
return NULL;
}
@@ -166,7 +169,7 @@ void pocsag_exit(void)
{
}
-const char *print_ric(pocsag_msg_t *msg)
+static const char *print_ric(pocsag_msg_t *msg)
{
static char text[16];
@@ -195,36 +198,36 @@ void pocsag_new_state(pocsag_t *pocsag, enum pocsag_state new_state)
{
if (pocsag->state == new_state)
return;
- PDEBUG(DPOCSAG, DEBUG_DEBUG, "State change: %s -> %s\n", pocsag_state_name[pocsag->state], pocsag_state_name[new_state]);
+ LOGP(DPOCSAG, LOGL_DEBUG, "State change: %s -> %s\n", pocsag_state_name[pocsag->state], pocsag_state_name[new_state]);
pocsag->state = new_state;
pocsag_display_status();
}
/* Create msg instance */
-static pocsag_msg_t *pocsag_msg_create(pocsag_t *pocsag, uint32_t callref, uint32_t ric, enum pocsag_function function, const char *text)
+static pocsag_msg_t *pocsag_msg_create(pocsag_t *pocsag, uint32_t callref, uint32_t ric, enum pocsag_function function, const char *message, size_t message_length)
{
pocsag_msg_t *msg, **msgp;
- PDEBUG(DPOCSAG, DEBUG_INFO, "Creating msg instance to page RIC '%d' / function '%d' (%s).\n", ric, function, pocsag_function_name[function]);
+ LOGP(DPOCSAG, LOGL_INFO, "Creating msg instance to page RIC '%d' / function '%d' (%s).\n", ric, function, pocsag_function_name[function]);
/* create */
msg = calloc(1, sizeof(*msg));
if (!msg) {
- PDEBUG(DPOCSAG, DEBUG_ERROR, "No mem!\n");
+ LOGP(DPOCSAG, LOGL_ERROR, "No mem!\n");
abort();
}
- if (strlen(text) > sizeof(msg->data)) {
- PDEBUG(DPOCSAG, DEBUG_ERROR, "Text too long!\n");
- return NULL;
+ if (message_length > sizeof(msg->data)) {
+ LOGP(DPOCSAG, LOGL_ERROR, "Text too long!\n");
+ message_length = sizeof(msg->data);
}
/* init */
msg->callref = callref;
msg->ric = ric;
msg->function = function;
- msg->repeat = 0;
- strncpy(msg->data, text, sizeof(msg->data));
- msg->data_length = (strlen(text) < sizeof(msg->data)) ? strlen(text) : sizeof(msg->data);
+ memcpy(msg->data, message, message_length);
+ msg->data_length = message_length;
+ msg->padding = pocsag->padding;
/* link */
msg->pocsag = pocsag;
@@ -280,15 +283,15 @@ static int pocsag_scan_or_loopback(pocsag_t *pocsag)
default:
message[0] = '\0';
}
- PDEBUG_CHAN(DPOCSAG, DEBUG_NOTICE, "Transmitting %s message '%s' with RIC '%d'.\n", pocsag_function_name[pocsag->default_function], message, pocsag->scan_from);
- pocsag_msg_create(pocsag, 0, pocsag->scan_from, pocsag->default_function, message);
+ LOGP_CHAN(DPOCSAG, LOGL_NOTICE, "Transmitting %s message '%s' with RIC '%d'.\n", pocsag_function_name[pocsag->default_function], message, pocsag->scan_from);
+ pocsag_msg_create(pocsag, 0, pocsag->scan_from, pocsag->default_function, message, strlen(message));
pocsag->scan_from++;
return 1;
}
if (pocsag->sender.loopback) {
- PDEBUG(DPOCSAG, DEBUG_INFO, "Sending message for loopback test.\n");
- pocsag_msg_create(pocsag, 0, 1234567, POCSAG_FUNCTION_NUMERIC, "1234");
+ LOGP(DPOCSAG, LOGL_INFO, "Sending message for loopback test.\n");
+ pocsag_msg_create(pocsag, 0, 1234567, POCSAG_FUNCTION_NUMERIC, "1234", 4);
return 1;
}
@@ -337,30 +340,30 @@ void pocsag_msg_receive(enum pocsag_language language, const char *channel, uint
}
/* Create transceiver instance and link to a list. */
-int pocsag_create(const char *kanal, double frequency, const char *device, int use_sdr, int samplerate, double rx_gain, double tx_gain, int tx, int rx, enum pocsag_language language, int baudrate, double deviation, double polarity, enum pocsag_function function, const char *message, uint32_t scan_from, uint32_t scan_to, const char *write_rx_wave, const char *write_tx_wave, const char *read_rx_wave, const char *read_tx_wave, int loopback)
+int pocsag_create(const char *kanal, double frequency, const char *device, int use_sdr, int samplerate, double rx_gain, double tx_gain, int tx, int rx, enum pocsag_language language, int baudrate, double deviation, double polarity, enum pocsag_function function, const char *message, char padding, uint32_t scan_from, uint32_t scan_to, const char *write_rx_wave, const char *write_tx_wave, const char *read_rx_wave, const char *read_tx_wave, int loopback)
{
pocsag_t *pocsag;
int rc;
pocsag = calloc(1, sizeof(*pocsag));
if (!pocsag) {
- PDEBUG(DPOCSAG, DEBUG_ERROR, "No memory!\n");
+ LOGP(DPOCSAG, LOGL_ERROR, "No memory!\n");
return -ENOMEM;
}
- PDEBUG(DPOCSAG, DEBUG_DEBUG, "Creating 'POCSAG' instance for 'Kanal' = %s (sample rate %d).\n", kanal, samplerate);
+ LOGP(DPOCSAG, LOGL_DEBUG, "Creating 'POCSAG' instance for 'Kanal' = %s (sample rate %d).\n", kanal, samplerate);
/* init general part of transceiver */
rc = sender_create(&pocsag->sender, kanal, frequency, frequency, device, use_sdr, samplerate, rx_gain, tx_gain, 0, 0, write_rx_wave, write_tx_wave, read_rx_wave, read_tx_wave, loopback, PAGING_SIGNAL_NONE);
if (rc < 0) {
- PDEBUG(DPOCSAG, DEBUG_ERROR, "Failed to init transceiver process!\n");
+ LOGP(DPOCSAG, LOGL_ERROR, "Failed to init transceiver process!\n");
goto error;
}
/* init audio processing */
rc = dsp_init_sender(pocsag, samplerate, (double)baudrate, deviation, polarity);
if (rc < 0) {
- PDEBUG(DPOCSAG, DEBUG_ERROR, "Failed to init audio processing!\n");
+ LOGP(DPOCSAG, LOGL_ERROR, "Failed to init audio processing!\n");
goto error;
}
@@ -371,10 +374,11 @@ int pocsag_create(const char *kanal, double frequency, const char *device, int u
pocsag->default_message = message;
pocsag->scan_from = scan_from;
pocsag->scan_to = scan_to;
+ pocsag->padding = padding;
pocsag_display_status();
- PDEBUG(DPOCSAG, DEBUG_NOTICE, "Created 'Kanal' %s\n", kanal);
+ LOGP(DPOCSAG, LOGL_NOTICE, "Created 'Kanal' %s\n", kanal);
pocsag_scan_or_loopback(pocsag);
@@ -391,7 +395,7 @@ void pocsag_destroy(sender_t *sender)
{
pocsag_t *pocsag = (pocsag_t *) sender;
- PDEBUG(DPOCSAG, DEBUG_DEBUG, "Destroying 'POCSAG' instance for 'Kanal' = %s.\n", sender->kanal);
+ LOGP(DPOCSAG, LOGL_DEBUG, "Destroying 'POCSAG' instance for 'Kanal' = %s.\n", sender->kanal);
while (pocsag->msg_list)
pocsag_msg_destroy(pocsag->msg_list);
@@ -401,79 +405,101 @@ void pocsag_destroy(sender_t *sender)
}
/* application sends us a message, we need to deliver */
-void pocsag_msg_send(enum pocsag_language language, const char *text)
+void pocsag_msg_send(enum pocsag_language language, const char *text, size_t text_length)
{
- char buffer[strlen(text) + 1], *p = buffer, *ric_string, *function_string, *message;
+ char ric_string[text_length + 1];
+ char function_string[text_length + 1];
+ char message[text_length];
uint32_t ric;
uint8_t function;
pocsag_t *pocsag;
- int i, j, k;
+ int message_length = 0;
+ int i, ii, j, k;
int rc;
- strcpy(buffer, text);
- ric_string = strsep(&p, ",");
- function_string = strsep(&p, ",");
- message = p;
-
- if (!ric_string || !function_string) {
+ for (i = 0; text_length; i++) {
+ if (*text == ',')
+ break;
+ ric_string[i] = *text++;
+ text_length--;
+ }
+ ric_string[i] = '\0';
+ if (!text_length) {
inval:
- PDEBUG(DNMT, DEBUG_NOTICE, "Given message MUST be in the following format: RIC,function[,<message with comma and spaces>] (function must be A = 0 = numeric, B = 1 or C = 2 = beep, D = 3 = alphanumeric)\n");
+ LOGP(DNMT, LOGL_NOTICE, "Given message MUST be in the following format: RIC,function[,<message with comma and spaces>] (function must be A = 0 = numeric, B = 1 or C = 2 = beep, D = 3 = alphanumeric)\n");
return;
}
+ text++;
+ text_length--;
+ for (i = 0; text_length; i++) {
+ if (*text == ',')
+ break;
+ function_string[i] = *text++;
+ text_length--;
+ }
+ function_string[i] = '\0';
+ if (text_length) {
+ text++;
+ text_length--;
+ memcpy(message, text, text_length);
+ message_length = text_length;
+ }
+
ric = atoi(ric_string);
if (ric > 2097151) {
- PDEBUG(DNMT, DEBUG_NOTICE, "Illegal RIC %d. Maximum allowed RIC is (2^21)-1. (2097151)\n", ric);
+ LOGP(DNMT, LOGL_NOTICE, "Illegal RIC %d. Maximum allowed RIC is (2^21)-1. (2097151)\n", ric);
goto inval;
}
if (ric == 1003832) {
- PDEBUG(DNMT, DEBUG_NOTICE, "Illegal RIC 1003832. (Used as idle codeword)\n");
+ LOGP(DNMT, LOGL_NOTICE, "Illegal RIC 1003832. (Used as idle codeword)\n");
goto inval;
}
rc = pocsag_function_name2value(function_string);
if (rc < 0) {
- PDEBUG(DNMT, DEBUG_NOTICE, "Illegal function '%s'.\n", function_string);
+ LOGP(DNMT, LOGL_NOTICE, "Illegal function '%s'.\n", function_string);
goto inval;
}
function = rc;
- if (message && (function == 1 || function == 2)) {
- PDEBUG(DNMT, DEBUG_NOTICE, "Message text is not allowed with function %d.\n", function);
+ if (message_length && (function == 1 || function == 2)) {
+ LOGP(DNMT, LOGL_NOTICE, "Message text is not allowed with function %d.\n", function);
goto inval;
}
- if (message && language != LANGUAGE_DEFAULT) {
+ if (message_length && language != LANGUAGE_DEFAULT) {
i = 0;
- p = message;
- while (*p) {
+ /* input counter is ii, output counter is i */
+ for (ii = 0; ii < message_length; i++) {
/* encode special chracter */
for (j = 0; pocsag_lang[j][0]; j++) {
for (k = 0; pocsag_lang[j][k + 1]; k++) {
- /* implies that (p[k] == '\0') causes to break */
- if (p[k] != pocsag_lang[j][k + 1])
+ /* break if input buffer ends */
+ if (ii + k == message_length)
+ break;
+ /* break if string does not match */
+ if (message[ii + k] != pocsag_lang[j][k + 1])
break;
}
+ /* break, if k-loop was completed */
if (!pocsag_lang[j][k + 1])
break;
}
- /* if character matches */
+ /* if character matches (k-loop was completed, j-loop not) */
if (pocsag_lang[j][0]) {
- message[i++] = pocsag_lang[j][0];
- p += k;
+ message[i] = pocsag_lang[j][0];
+ ii += k;
} else
- message[i++] = *p++;
+ message[i] = message[ii++];
}
- message[i] = '\0';
+ message_length = i;
}
- if (!message)
- message="";
-
- PDEBUG(DNMT, DEBUG_INFO, "Message for ID '%d/%d' with text '%s'\n", ric, function, message);
+ LOGP(DNMT, LOGL_INFO, "Message for ID '%d/%d' with text '%s'\n", ric, function, print_message(message, message_length));
pocsag = (pocsag_t *) sender_head;
- pocsag_msg_create(pocsag, 0, ric, function, message);
+ pocsag_msg_create(pocsag, 0, ric, function, message, message_length);
}
void call_down_clock(void)
@@ -505,9 +531,9 @@ int call_down_setup(int callref, const char *caller_id, enum number_type __attri
}
if (!sender) {
if (channel)
- PDEBUG(DPOCSAG, DEBUG_NOTICE, "Cannot page, because given station not available, rejecting!\n");
+ LOGP(DPOCSAG, LOGL_NOTICE, "Cannot page, because given station not available, rejecting!\n");
else
- PDEBUG(DPOCSAG, DEBUG_NOTICE, "Cannot page, no trasmitting station available, rejecting!\n");
+ LOGP(DPOCSAG, LOGL_NOTICE, "Cannot page, no trasmitting station available, rejecting!\n");
return -CAUSE_NOCHANNEL;
}
@@ -516,6 +542,10 @@ int call_down_setup(int callref, const char *caller_id, enum number_type __attri
ric = ric * 10 + dialing[i] - '0';
if (dialing[7] >= '0' && dialing[7] <= '3')
function = dialing[7]- '0';
+ else if (dialing[7] >= 'a' && dialing[7] <= 'd')
+ function = dialing[7]- 'A';
+ else if (dialing[7] >= 'A' && dialing[7] <= 'D')
+ function = dialing[7]- 'A';
else
function = pocsag->default_function;
@@ -526,7 +556,7 @@ int call_down_setup(int callref, const char *caller_id, enum number_type __attri
message = pocsag->default_message;
/* create call process to page station */
- msg = pocsag_msg_create(pocsag, callref, ric, function, message);
+ msg = pocsag_msg_create(pocsag, callref, ric, function, message, strlen(message));
if (!msg)
return -CAUSE_INVALNUMBER;
return -CAUSE_NORMAL;
@@ -541,14 +571,14 @@ void pocsag_msg_done(pocsag_t *pocsag)
pocsag_scan_or_loopback(pocsag);
}
-void call_down_answer(int __attribute__((unused)) callref)
+void call_down_answer(int __attribute__((unused)) callref, struct timeval __attribute__((unused)) *tv_meter)
{
}
static void _release(int __attribute__((unused)) callref, int __attribute__((unused)) cause)
{
- PDEBUG(DPOCSAG, DEBUG_INFO, "Call has been disconnected by network.\n");
+ LOGP(DPOCSAG, LOGL_INFO, "Call has been disconnected by network.\n");
}
void call_down_disconnect(int callref, int cause)
@@ -565,7 +595,7 @@ void call_down_release(int callref, int cause)
}
/* Receive audio from call instance. */
-void call_down_audio(int __attribute__((unused)) callref, uint16_t __attribute__((unused)) sequence, uint32_t __attribute__((unused)) timestamp, uint32_t __attribute__((unused)) ssrc, sample_t __attribute__((unused)) *samples, int __attribute__((unused)) count)
+void call_down_audio(void __attribute__((unused)) *decoder, void __attribute__((unused)) *decoder_priv, int __attribute__((unused)) callref, uint16_t __attribute__((unused)) sequence, uint8_t __attribute__((unused)) marker, uint32_t __attribute__((unused)) timestamp, uint32_t __attribute__((unused)) ssrc, uint8_t __attribute__((unused)) *payload, int __attribute__((unused)) payload_len)
{
}
diff --git a/src/pocsag/pocsag.h b/src/pocsag/pocsag.h
index 2ebadd8..1ebcd76 100644
--- a/src/pocsag/pocsag.h
+++ b/src/pocsag/pocsag.h
@@ -33,7 +33,7 @@ typedef struct pocsag_msg {
int data_length; /* length of message that is not 0-terminated */
int data_index; /* current character transmitting */
int bit_index; /* current bit transmitting */
- int repeat; /* how often the message is sent */
+ char padding; /* EOT or other padding */
} pocsag_msg_t;
/* instance of pocsag transmitter/receiver */
@@ -46,6 +46,7 @@ typedef struct pocsag {
enum pocsag_language language; /* special characters */
enum pocsag_function default_function; /* default function, if not given by caller */
const char *default_message; /* default message, if caller has no caller ID */
+ char padding; /* EOT or other padding */
/* tx states */
enum pocsag_state state; /* state (idle, preamble, message) */
@@ -98,9 +99,9 @@ int pocsag_init(void);
void pocsag_exit(void);
void pocsag_new_state(pocsag_t *pocsag, enum pocsag_state new_state);
void pocsag_msg_receive(enum pocsag_language language, const char *channel, uint32_t ric, enum pocsag_function function, const char *message);
-int pocsag_create(const char *kanal, double frequency, const char *device, int use_sdr, int samplerate, double rx_gain, double tx_gain, int tx, int rx, enum pocsag_language language, int baudrate, double deviation, double polarity, enum pocsag_function function, const char *message, uint32_t scan_from, uint32_t scan_to, const char *write_rx_wave, const char *write_tx_wave, const char *read_rx_wave, const char *read_tx_wave, int loopback);
+int pocsag_create(const char *kanal, double frequency, const char *device, int use_sdr, int samplerate, double rx_gain, double tx_gain, int tx, int rx, enum pocsag_language language, int baudrate, double deviation, double polarity, enum pocsag_function function, const char *message, char padding, uint32_t scan_from, uint32_t scan_to, const char *write_rx_wave, const char *write_tx_wave, const char *read_rx_wave, const char *read_tx_wave, int loopback);
void pocsag_destroy(sender_t *sender);
-void pocsag_msg_send(enum pocsag_language language, const char *text);
+void pocsag_msg_send(enum pocsag_language language, const char *text, size_t text_length);
void pocsag_msg_destroy(pocsag_msg_t *msg);
void pocsag_get_id(pocsag_t *euro, char *id);
void pocsag_receive_id(pocsag_t *euro, char *id);
diff --git a/src/r2000/Makefile.am b/src/r2000/Makefile.am
index c3d7cfb..5a7b9db 100644
--- a/src/r2000/Makefile.am
+++ b/src/r2000/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
bin_PROGRAMS = \
radiocom2000
@@ -13,14 +13,11 @@ radiocom2000_SOURCES = \
radiocom2000_LDADD = \
$(COMMON_LA) \
$(top_builddir)/src/liboptions/liboptions.a \
- $(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libmobile/libmobile.a \
- $(top_builddir)/src/libosmocc/libosmocc.a \
$(top_builddir)/src/libdisplay/libdisplay.a \
$(top_builddir)/src/libcompandor/libcompandor.a \
$(top_builddir)/src/libjitter/libjitter.a \
$(top_builddir)/src/libhagelbarger/libhagelbarger.a \
- $(top_builddir)/src/libtimer/libtimer.a \
$(top_builddir)/src/libsamplerate/libsamplerate.a \
$(top_builddir)/src/libemphasis/libemphasis.a \
$(top_builddir)/src/libfsk/libfsk.a \
@@ -28,8 +25,10 @@ radiocom2000_LDADD = \
$(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \
- $(top_builddir)/src/libg711/libg711.a \
$(top_builddir)/src/libaaimage/libaaimage.a \
+ $(top_builddir)/src/liblogging/liblogging.a \
+ $(LIBOSMOCORE_LIBS) \
+ $(LIBOSMOCC_LIBS) \
-lm
if HAVE_ALSA
diff --git a/src/r2000/dsp.c b/src/r2000/dsp.c
index bb3b97c..41757a3 100644
--- a/src/r2000/dsp.c
+++ b/src/r2000/dsp.c
@@ -26,7 +26,7 @@
#include <errno.h>
#include <math.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "r2000.h"
#include "dsp.h"
@@ -64,6 +64,7 @@
/* global init for FSK */
void dsp_init(void)
{
+ compandor_init();
}
static int fsk_send_bit(void *inst);
@@ -75,22 +76,22 @@ static void super_receive_bit(void *inst, int bit, double quality, double level)
int dsp_init_sender(r2000_t *r2000)
{
/* attack (3ms) and recovery time (13.5ms) according to NMT specs */
- init_compandor(&r2000->cstate, 8000, 3.0, 13.5);
+ setup_compandor(&r2000->cstate, 8000, 3.0, 13.5);
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Init DSP for Transceiver.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Init DSP for Transceiver.\n");
/* set modulation parameters */
sender_set_fm(&r2000->sender, MAX_DEVIATION, MAX_MODULATION, SPEECH_DEVIATION, MAX_DISPLAY);
- PDEBUG(DDSP, DEBUG_DEBUG, "Using FSK level of %.3f\n", TX_PEAK_FSK);
+ LOGP(DDSP, LOGL_DEBUG, "Using FSK level of %.3f\n", TX_PEAK_FSK);
/* init fsk */
if (fsk_mod_init(&r2000->fsk_mod, r2000, fsk_send_bit, r2000->sender.samplerate, FSK_BIT_RATE, FSK_F0, FSK_F1, TX_PEAK_FSK, 1, 0) < 0) {
- PDEBUG_CHAN(DDSP, DEBUG_ERROR, "FSK init failed!\n");
+ LOGP_CHAN(DDSP, LOGL_ERROR, "FSK init failed!\n");
return -EINVAL;
}
if (fsk_demod_init(&r2000->fsk_demod, r2000, fsk_receive_bit, r2000->sender.samplerate, FSK_BIT_RATE, FSK_F0, FSK_F1, FSK_BIT_ADJUST) < 0) {
- PDEBUG_CHAN(DDSP, DEBUG_ERROR, "FSK init failed!\n");
+ LOGP_CHAN(DDSP, LOGL_ERROR, "FSK init failed!\n");
return -EINVAL;
}
if (r2000->sender.loopback)
@@ -100,11 +101,11 @@ int dsp_init_sender(r2000_t *r2000)
/* init supervisorty fsk */
if (fsk_mod_init(&r2000->super_fsk_mod, r2000, super_send_bit, r2000->sender.samplerate, SUPER_BIT_RATE, SUPER_F0, SUPER_F1, TX_PEAK_SUPER, 0, 0) < 0) {
- PDEBUG_CHAN(DDSP, DEBUG_ERROR, "FSK init failed!\n");
+ LOGP_CHAN(DDSP, LOGL_ERROR, "FSK init failed!\n");
return -EINVAL;
}
if (fsk_demod_init(&r2000->super_fsk_demod, r2000, super_receive_bit, r2000->sender.samplerate, SUPER_BIT_RATE, SUPER_F0, SUPER_F1, SUPER_BIT_ADJUST) < 0) {
- PDEBUG_CHAN(DDSP, DEBUG_ERROR, "FSK init failed!\n");
+ LOGP_CHAN(DDSP, LOGL_ERROR, "FSK init failed!\n");
return -EINVAL;
}
@@ -128,7 +129,7 @@ int dsp_init_sender(r2000_t *r2000)
/* Cleanup transceiver instance. */
void dsp_cleanup_sender(r2000_t *r2000)
{
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Cleanup DSP for Transceiver.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Cleanup DSP for Transceiver.\n");
fsk_mod_cleanup(&r2000->fsk_mod);
fsk_demod_cleanup(&r2000->fsk_demod);
@@ -308,7 +309,7 @@ static int fsk_send_bit(void *inst)
frame = r2000_get_frame(r2000);
if (!frame) {
r2000->tx_frame_length = 0;
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Stop sending frames.\n");
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "Stop sending frames.\n");
return -1;
}
memcpy(r2000->tx_frame, frame, 208);
@@ -347,7 +348,13 @@ again:
case DSP_MODE_AUDIO_TX_RX:
memset(power, 1, length);
input_num = samplerate_upsample_input_num(&sender->srstate, length);
- jitter_load(&sender->dejitter, samples, input_num);
+ {
+ int16_t spl[input_num];
+ jitter_load_samples(&sender->dejitter, (uint8_t *)spl, input_num, sizeof(*spl), jitter_conceal_s16, NULL);
+ int16_to_samples_speech(samples, spl, input_num);
+ }
+ if (r2000->compandor)
+ compress_audio(&r2000->cstate, samples, input_num);
samplerate_upsample(&sender->srstate, samples, input_num, samples, length);
iir_process(&r2000->super_tx_hp, samples, length);
/* do pre-emphasis */
@@ -378,7 +385,7 @@ again:
}
}
-const char *r2000_dsp_mode_name(enum dsp_mode mode)
+static const char *r2000_dsp_mode_name(enum dsp_mode mode)
{
static char invalid[16];
@@ -408,6 +415,7 @@ void r2000_set_dsp_mode(r2000_t *r2000, enum dsp_mode mode, int super)
&& (r2000->dsp_mode != DSP_MODE_AUDIO_TX && r2000->dsp_mode != DSP_MODE_AUDIO_TX_RX)) {
r2000->super_tx_word_length = 0;
fsk_mod_reset(&r2000->super_fsk_mod);
+ jitter_reset(&r2000->sender.dejitter);
}
if (super >= 0) {
@@ -415,10 +423,35 @@ void r2000_set_dsp_mode(r2000_t *r2000, enum dsp_mode mode, int super)
r2000->super_tx_word = 0x40101 | ((super & 0x7f) << 1);
/* clear pending data in rx word */
r2000->super_rx_word = 0x00000;
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "DSP mode %s -> %s (super = 0x%05x)\n", r2000_dsp_mode_name(r2000->dsp_mode), r2000_dsp_mode_name(mode), r2000->super_tx_word);
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "DSP mode %s -> %s (super = 0x%05x)\n", r2000_dsp_mode_name(r2000->dsp_mode), r2000_dsp_mode_name(mode), r2000->super_tx_word);
} else if (r2000->dsp_mode != mode)
- PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "DSP mode %s -> %s\n", r2000_dsp_mode_name(r2000->dsp_mode), r2000_dsp_mode_name(mode));
+ LOGP_CHAN(DDSP, LOGL_DEBUG, "DSP mode %s -> %s\n", r2000_dsp_mode_name(r2000->dsp_mode), r2000_dsp_mode_name(mode));
r2000->dsp_mode = mode;
}
+/* Receive audio from call instance. */
+void call_down_audio(void *decoder, void *decoder_priv, int callref, uint16_t sequence, uint8_t marker, uint32_t timestamp, uint32_t ssrc, uint8_t *payload, int payload_len)
+{
+ sender_t *sender;
+ r2000_t *r2000;
+
+ for (sender = sender_head; sender; sender = sender->next) {
+ r2000 = (r2000_t *) sender;
+ if (r2000->callref == callref)
+ break;
+ }
+ if (!sender)
+ return;
+
+ if (r2000->dsp_mode == DSP_MODE_AUDIO_TX
+ || r2000->dsp_mode == DSP_MODE_AUDIO_TX_RX) {
+ jitter_frame_t *jf;
+ jf = jitter_frame_alloc(decoder, decoder_priv, payload, payload_len, marker, sequence, timestamp, ssrc);
+ if (jf)
+ jitter_save(&r2000->sender.dejitter, jf);
+ }
+}
+
+void call_down_clock(void) {}
+
diff --git a/src/r2000/frame.c b/src/r2000/frame.c
index b231041..14589a4 100644
--- a/src/r2000/frame.c
+++ b/src/r2000/frame.c
@@ -23,7 +23,7 @@
#include <stdlib.h>
#include <errno.h>
#include <inttypes.h>
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../libhagelbarger/hagelbarger.h"
#include "frame.h"
@@ -81,7 +81,7 @@ const char *param_aga(uint64_t value)
return "<invalid>";
}
-const char *param_power(uint64_t value)
+static const char *param_power(uint64_t value)
{
switch (value) {
case 0:
@@ -114,7 +114,7 @@ const char *param_crins(uint64_t value)
return "<invalid>";
}
-const char *param_invitation(uint64_t value)
+static const char *param_invitation(uint64_t value)
{
switch (value) {
case 3:
@@ -208,11 +208,11 @@ static void print_element(char element, uint64_t value, int dir, int debug)
decoder = (dir == REL_TO_SM) ? r2000_element[i].decoder_rel : r2000_element[i].decoder_sm;
if (!r2000_element[i].element)
- PDEBUG(DFRAME, debug, "Element '%c' %" PRIu64 " [Unknown]\n", element, value);
+ LOGP(DFRAME, debug, "Element '%c' %" PRIu64 " [Unknown]\n", element, value);
else if (!decoder)
- PDEBUG(DFRAME, debug, "Element '%c' %" PRIu64 " [%s]\n", element, value, r2000_element[i].name);
+ LOGP(DFRAME, debug, "Element '%c' %" PRIu64 " [%s]\n", element, value, r2000_element[i].name);
else
- PDEBUG(DFRAME, debug, "Element '%c' %" PRIu64 "=%s [%s]\n", element, value, decoder(value), r2000_element[i].name);
+ LOGP(DFRAME, debug, "Element '%c' %" PRIu64 "=%s [%s]\n", element, value, decoder(value), r2000_element[i].name);
}
static void store_element(frame_t *frame, char element, uint64_t value)
@@ -387,7 +387,7 @@ static const char *get_frame_def(uint8_t message, int dir)
return NULL;
}
-const char *r2000_dir_name(int dir)
+static const char *r2000_dir_name(int dir)
{
return (dir == REL_TO_SM) ? "REL->SM" : "SM->REL";
}
@@ -413,17 +413,17 @@ static void display_bits(const char *def, const uint8_t *message, int num, int d
char dispbits[num + 1];
int i;
- if (debuglevel > debug)
+ if (loglevel > debug)
return;
/* display bits */
if (def)
- PDEBUG(DFRAME, debug, "%s\n", def);
+ LOGP(DFRAME, debug, "%s\n", def);
for (i = 0; i < num; i++) {
dispbits[i] = ((message[i / 8] >> (7 - (i & 7))) & 1) + '0';
}
dispbits[i] = '\0';
- PDEBUG(DFRAME, debug, "%s\n", dispbits);
+ LOGP(DFRAME, debug, "%s\n", dispbits);
}
static int dissassemble_frame(frame_t *frame, const uint8_t *message, int num)
@@ -438,12 +438,12 @@ static int dissassemble_frame(frame_t *frame, const uint8_t *message, int num)
frame->message = message[2] & 0x1f;
def = get_frame_def(frame->message, dir);
if (!def) {
- PDEBUG(DFRAME, DEBUG_NOTICE, "Received unknown message type %d (maybe radio noise)\n", frame->message);
- display_bits(NULL, message, num, DEBUG_NOTICE);
+ LOGP(DFRAME, LOGL_NOTICE, "Received unknown message type %d (maybe radio noise)\n", frame->message);
+ display_bits(NULL, message, num, LOGL_NOTICE);
return -EINVAL;
}
- PDEBUG(DFRAME, DEBUG_DEBUG, "Decoding frame %s %s\n", r2000_dir_name(dir), r2000_frame_name(frame->message, dir));
+ LOGP(DFRAME, LOGL_DEBUG, "Decoding frame %s %s\n", r2000_dir_name(dir), r2000_frame_name(frame->message, dir));
/* disassemble elements elements */
value = 0;
@@ -451,14 +451,14 @@ static int dissassemble_frame(frame_t *frame, const uint8_t *message, int num)
value = (value << 1) | ((message[i / 8] >> (7 - (i & 7))) & 1);
if (def[i + 1] != def[i]) {
if (def[i] != '-') {
- print_element(def[i], value, dir, DEBUG_DEBUG);
+ print_element(def[i], value, dir, LOGL_DEBUG);
store_element(frame, def[i], value);
}
value = 0;
}
}
- display_bits(def, message, num, DEBUG_DEBUG);
+ display_bits(def, message, num, LOGL_DEBUG);
return 0;
}
@@ -473,13 +473,13 @@ static int assemble_frame(frame_t *frame, uint8_t *message, int num, int debug)
def = get_frame_def(frame->message, dir);
if (!def) {
- PDEBUG(DFRAME, DEBUG_ERROR, "Cannot assemble unknown message type %d, please define/fix!\n", frame->message);
+ LOGP(DFRAME, LOGL_ERROR, "Cannot assemble unknown message type %d, please define/fix!\n", frame->message);
abort();
}
memset(message, 0, (num + 7) / 8);
if (debug)
- PDEBUG(DFRAME, DEBUG_DEBUG, "Ccoding frame %s %s\n", r2000_dir_name(dir), r2000_frame_name(frame->message, dir));
+ LOGP(DFRAME, LOGL_DEBUG, "Ccoding frame %s %s\n", r2000_dir_name(dir), r2000_frame_name(frame->message, dir));
/* assemble elements elements */
element = 0;
@@ -505,11 +505,11 @@ static int assemble_frame(frame_t *frame, uint8_t *message, int num, int debug)
for (i = 0; i < num; i++) {
if (def[i + 1] != def[i] && def[i] != '-' && def[i] != '+') {
value = fetch_element(frame, def[i]);
- print_element(def[i], value, dir, DEBUG_DEBUG);
+ print_element(def[i], value, dir, LOGL_DEBUG);
}
}
- display_bits(def, message, num, DEBUG_DEBUG);
+ display_bits(def, message, num, LOGL_DEBUG);
}
return 0;
diff --git a/src/r2000/main.c b/src/r2000/main.c
index 5aed476..891211f 100644
--- a/src/r2000/main.c
+++ b/src/r2000/main.c
@@ -28,7 +28,7 @@
#include <sys/stat.h>
#include "../libsample/sample.h"
#include "../libmobile/main_mobile.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../liboptions/options.h"
#include "r2000.h"
#include "dsp.h"
@@ -376,6 +376,7 @@ fail:
r2000_destroy(sender_head);
/* exits */
+ main_mobile_exit();
fm_exit();
options_free();
diff --git a/src/r2000/r2000.c b/src/r2000/r2000.c
index d0397fb..19cc047 100644
--- a/src/r2000/r2000.c
+++ b/src/r2000/r2000.c
@@ -26,25 +26,26 @@
#include <errno.h>
#include <time.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../libmobile/cause.h"
-#include "../libosmocc/message.h"
+#include "../libmobile/console.h"
+#include <osmocom/cc/message.h>
#include "r2000.h"
//#include "transaction.h"
#include "frame.h"
#include "dsp.h"
-#define CUT_OFF_EMPHASIS_R2000 300 //FIXME: use real cut-off / time constant
+#define CUT_OFF_EMPHASIS_R2000 300 //FIXME: use real cut-off / time constant
-#define PAGE_TRIES 3 /* how many times trying to page */
-#define IDENT_TIME 3.0 /* time to wait for identity response */
-#define ALERT_TIME 60.0 /* time to wait for party to answer */
-#define DIAL1_TIME 1.0 /* time to wait for party to dial digits 1..10 */
-#define DIAL2_TIME 0.5 /* time to wait for party to dial digits 11..20 */
-#define SUSPEND_TIME 1.0 /* time to wait for suspend response */
-#define SUPER_TIME1 4.0 /* time to release if not receiving initial supervisory signal */
-#define SUPER_TIME2 20.0 /* time to release after loosing supervisory signal */
-#define RELEASE_TIME 2.0 /* time to wait for release response */
+#define PAGE_TRIES 3 /* how many times trying to page */
+#define IDENT_TIME 3,0 /* time to wait for identity response */
+#define ALERT_TIME 60,0 /* time to wait for party to answer */
+#define DIAL1_TIME 1,0 /* time to wait for party to dial digits 1..10 */
+#define DIAL2_TIME 0,500000 /* time to wait for party to dial digits 11..20 */
+#define SUSPEND_TIME 1,0 /* time to wait for suspend response */
+#define SUPER_TIME1 4,0 /* time to release if not receiving initial supervisory signal */
+#define SUPER_TIME2 20,0 /* time to release after loosing supervisory signal */
+#define RELEASE_TIME 2,0 /* time to wait for release response */
/* definition of bands and channels */
#define CHANNEL_SPACING 0.0125
@@ -101,12 +102,12 @@ double r2000_channel2freq(int band, int channel, int uplink)
}
if (!r2000_bands[i].name) {
- PDEBUG(DR2000, DEBUG_NOTICE, "Given band number is invalid! (use '-B list' for valid bands)\n");
+ LOGP(DR2000, LOGL_NOTICE, "Given band number is invalid! (use '-B list' for valid bands)\n");
return 0.0;
}
if (channel < 0 || channel > r2000_bands[i].channels - 1) {
- PDEBUG(DR2000, DEBUG_NOTICE, "Given channel number %d invalid! (use '-B list' for valid channels)\n", channel);
+ LOGP(DR2000, LOGL_NOTICE, "Given channel number %d invalid! (use '-B list' for valid channels)\n", channel);
return 0.0;
}
@@ -135,7 +136,7 @@ const char *r2000_number_valid(const char *number)
return NULL;
}
-const char *r2000_state_name(enum r2000_state state)
+static const char *r2000_state_name(enum r2000_state state)
{
static char invalid[16];
@@ -186,7 +187,7 @@ const char *r2000_state_name(enum r2000_state state)
static const char *print_subscriber_subscr(r2000_subscriber_t *subscr);
-void r2000_display_status(void)
+static void r2000_display_status(void)
{
sender_t *sender;
r2000_t *r2000;
@@ -231,7 +232,7 @@ int r2000_channel_by_short_name(const char *short_name)
for (i = 0; r2000_channels[i].short_name; i++) {
if (!strcasecmp(r2000_channels[i].short_name, short_name)) {
- PDEBUG(DR2000, DEBUG_INFO, "Selecting channel '%s' = %s\n", r2000_channels[i].short_name, r2000_channels[i].long_name);
+ LOGP(DR2000, LOGL_INFO, "Selecting channel '%s' = %s\n", r2000_channels[i].short_name, r2000_channels[i].long_name);
return r2000_channels[i].chan_type;
}
}
@@ -267,7 +268,7 @@ static void r2000_new_state(r2000_t *r2000, enum r2000_state new_state)
{
if (r2000->state == new_state)
return;
- PDEBUG_CHAN(DR2000, DEBUG_DEBUG, "State change: %s -> %s\n", r2000_state_name(r2000->state), r2000_state_name(new_state));
+ LOGP_CHAN(DR2000, LOGL_DEBUG, "State change: %s -> %s\n", r2000_state_name(r2000->state), r2000_state_name(new_state));
r2000->state = new_state;
r2000_display_status();
r2000->tx_frame_count = 0;
@@ -314,11 +315,11 @@ static int string2subscriber(const char *dialstring, r2000_subscriber_t *subscr)
static int match_voie(r2000_t *r2000, frame_t *frame, uint8_t voie)
{
if (frame->voie == 0 && voie == 1) {
- PDEBUG_CHAN(DR2000, DEBUG_NOTICE, "Frame for control channel, but expecting traffic channel, ignoring. (maybe radio noise)\n");
+ LOGP_CHAN(DR2000, LOGL_NOTICE, "Frame for control channel, but expecting traffic channel, ignoring. (maybe radio noise)\n");
return 0;
}
if (frame->voie == 1 && voie == 0) {
- PDEBUG_CHAN(DR2000, DEBUG_NOTICE, "Frame for traffic channel, but expecting control channel, ignoring. (maybe radio noise)\n");
+ LOGP_CHAN(DR2000, LOGL_NOTICE, "Frame for traffic channel, but expecting control channel, ignoring. (maybe radio noise)\n");
return 0;
}
@@ -328,7 +329,7 @@ static int match_voie(r2000_t *r2000, frame_t *frame, uint8_t voie)
static int match_channel(r2000_t *r2000, frame_t *frame)
{
if (frame->channel != atoi(r2000->sender.kanal)) {
- PDEBUG_CHAN(DR2000, DEBUG_NOTICE, "Frame for different channel %d received, ignoring.\n", frame->channel);
+ LOGP_CHAN(DR2000, LOGL_NOTICE, "Frame for different channel %d received, ignoring.\n", frame->channel);
return 0;
}
@@ -338,7 +339,7 @@ static int match_channel(r2000_t *r2000, frame_t *frame)
static int match_relais(r2000_t *r2000, frame_t *frame)
{
if (frame->relais != r2000->sysinfo.relais) {
- PDEBUG_CHAN(DR2000, DEBUG_NOTICE, "Frame for different relais %d received, ignoring.\n", frame->relais);
+ LOGP_CHAN(DR2000, LOGL_NOTICE, "Frame for different relais %d received, ignoring.\n", frame->relais);
return 0;
}
@@ -353,7 +354,7 @@ static int match_subscriber(r2000_t *r2000, frame_t *frame)
if (r2000->subscriber.relais != frame->sm_relais
|| r2000->subscriber.mor != frame->sm_mor) {
- PDEBUG_CHAN(DR2000, DEBUG_NOTICE, "Frame for different subscriber '%s' received, ignoring.\n", print_subscriber_frame(frame));
+ LOGP_CHAN(DR2000, LOGL_NOTICE, "Frame for different subscriber '%s' received, ignoring.\n", print_subscriber_frame(frame));
return 0;
}
@@ -361,7 +362,7 @@ static int match_subscriber(r2000_t *r2000, frame_t *frame)
}
/* convert nconv to supervisory digit to be transmitted to phone */
-uint8_t r2000_encode_super(r2000_t *r2000)
+static uint8_t r2000_encode_super(r2000_t *r2000)
{
uint8_t super, nconv, relais;
@@ -377,12 +378,12 @@ uint8_t r2000_encode_super(r2000_t *r2000)
| ((relais << 2) & 0x10)
| (relais & 0x08);
- PDEBUG_CHAN(DDSP, DEBUG_INFO, "TX Supervisory: NCONV: %d relais (4 lowest bits): %d\n", nconv, relais);
+ LOGP_CHAN(DDSP, LOGL_INFO, "TX Supervisory: NCONV: %d relais (4 lowest bits): %d\n", nconv, relais);
return super ^ 0x7f;
}
-static void r2000_timeout(struct timer *timer);
+static void r2000_timeout(void *data);
/* Create transceiver instance and link to a list. */
int r2000_create(int band, const char *kanal, enum r2000_chan_type chan_type, const char *device, int use_sdr, int samplerate, double rx_gain, double tx_gain, int pre_emphasis, int de_emphasis, const char *write_rx_wave, const char *write_tx_wave, const char *read_rx_wave, const char *read_tx_wave, uint16_t relais, uint8_t deport, uint8_t agi, uint8_t sm_power, uint8_t taxe, uint8_t crins, int destruction, uint8_t nconv, int recall, int loopback)
@@ -399,27 +400,27 @@ int r2000_create(int band, const char *kanal, enum r2000_chan_type chan_type, co
r2000 = (r2000_t *)sender;
if ((r2000->sysinfo.chan_type == CHAN_TYPE_CC || r2000->sysinfo.chan_type == CHAN_TYPE_CC_TC)
&& (chan_type == CHAN_TYPE_CC || chan_type == CHAN_TYPE_CC_TC)) {
- PDEBUG(DCNETZ, DEBUG_NOTICE, "More than one control channel is not supported, please define other channels as traffic channels!\n");
+ LOGP(DCNETZ, LOGL_NOTICE, "More than one control channel is not supported, please define other channels as traffic channels!\n");
return -EINVAL;
}
}
r2000 = calloc(1, sizeof(r2000_t));
if (!r2000) {
- PDEBUG(DR2000, DEBUG_ERROR, "No memory!\n");
+ LOGP(DR2000, LOGL_ERROR, "No memory!\n");
return -ENOMEM;
}
- PDEBUG(DR2000, DEBUG_DEBUG, "Creating 'Radiocom 2000' instance for channel = %s (sample rate %d).\n", kanal, samplerate);
+ LOGP(DR2000, LOGL_DEBUG, "Creating 'Radiocom 2000' instance for channel = %s (sample rate %d).\n", kanal, samplerate);
/* init general part of transceiver */
rc = sender_create(&r2000->sender, kanal, r2000_channel2freq(band, atoi(kanal), 0), r2000_channel2freq(band, atoi(kanal), 1), device, use_sdr, samplerate, rx_gain, tx_gain, 0, 0, write_rx_wave, write_tx_wave, read_rx_wave, read_tx_wave, loopback, PAGING_SIGNAL_NONE);
if (rc < 0) {
- PDEBUG(DR2000, DEBUG_ERROR, "Failed to init transceiver process!\n");
+ LOGP(DR2000, LOGL_ERROR, "Failed to init transceiver process!\n");
goto error;
}
- timer_init(&r2000->timer, r2000_timeout, r2000);
+ osmo_timer_setup(&r2000->timer, r2000_timeout, r2000);
r2000->sysinfo.relais = relais;
r2000->sysinfo.chan_type = chan_type;
r2000->sysinfo.deport = deport;
@@ -430,7 +431,7 @@ int r2000_create(int band, const char *kanal, enum r2000_chan_type chan_type, co
r2000->sysinfo.nconv = nconv;
r2000->sysinfo.recall = recall;
if (crins == 3 && destruction != 2342) {
- PDEBUG(DR2000, DEBUG_ERROR, "Crins is 3, but destruction is not confirmed, please fix!\n");
+ LOGP(DR2000, LOGL_ERROR, "Crins is 3, but destruction is not confirmed, please fix!\n");
abort();
}
r2000->compandor = 1;
@@ -445,14 +446,14 @@ int r2000_create(int band, const char *kanal, enum r2000_chan_type chan_type, co
/* init audio processing */
rc = dsp_init_sender(r2000);
if (rc < 0) {
- PDEBUG(DR2000, DEBUG_ERROR, "Failed to init audio processing!\n");
+ LOGP(DR2000, LOGL_ERROR, "Failed to init audio processing!\n");
goto error;
}
/* go into idle state */
r2000_go_idle(r2000);
- PDEBUG(DR2000, DEBUG_NOTICE, "Created channel #%s of type '%s' = %s\n", kanal, chan_type_short_name(chan_type), chan_type_long_name(chan_type));
+ LOGP(DR2000, LOGL_NOTICE, "Created channel #%s of type '%s' = %s\n", kanal, chan_type_short_name(chan_type), chan_type_long_name(chan_type));
return 0;
@@ -481,18 +482,18 @@ void r2000_check_channels(void)
}
}
if (cc && !tc) {
- PDEBUG(DR2000, DEBUG_NOTICE, "*** Selected channel(s) can be used for control only.\n");
- PDEBUG(DR2000, DEBUG_NOTICE, "*** No call is possible at all!\n");
- PDEBUG(DR2000, DEBUG_NOTICE, "*** Use combined 'CC/TC' instead!\n");
+ LOGP(DR2000, LOGL_NOTICE, "*** Selected channel(s) can be used for control only.\n");
+ LOGP(DR2000, LOGL_NOTICE, "*** No call is possible at all!\n");
+ LOGP(DR2000, LOGL_NOTICE, "*** Use combined 'CC/TC' instead!\n");
}
if (tc && !cc) {
- PDEBUG(DR2000, DEBUG_NOTICE, "*** Selected channel(s) can be used for traffic only.\n");
- PDEBUG(DR2000, DEBUG_NOTICE, "*** No register/call is possible at all!\n");
- PDEBUG(DR2000, DEBUG_NOTICE, "*** Use combined 'CC/TC' instead!\n");
+ LOGP(DR2000, LOGL_NOTICE, "*** Selected channel(s) can be used for traffic only.\n");
+ LOGP(DR2000, LOGL_NOTICE, "*** No register/call is possible at all!\n");
+ LOGP(DR2000, LOGL_NOTICE, "*** Use combined 'CC/TC' instead!\n");
}
if (combined) {
- PDEBUG(DR2000, DEBUG_NOTICE, "*** Selected (non standard) combined 'CC/TC'.\n");
- PDEBUG(DR2000, DEBUG_NOTICE, "Phones might reject this, but non of my phones does, so it's ok.\n");
+ LOGP(DR2000, LOGL_NOTICE, "*** Selected (non standard) combined 'CC/TC'.\n");
+ LOGP(DR2000, LOGL_NOTICE, "Phones might reject this, but non of my phones does, so it's ok.\n");
}
}
@@ -501,9 +502,9 @@ void r2000_destroy(sender_t *sender)
{
r2000_t *r2000 = (r2000_t *) sender;
- PDEBUG(DR2000, DEBUG_DEBUG, "Destroying 'Radiocom 2000' instance for channel = %s.\n", sender->kanal);
+ LOGP(DR2000, LOGL_DEBUG, "Destroying 'Radiocom 2000' instance for channel = %s.\n", sender->kanal);
dsp_cleanup_sender(r2000);
- timer_exit(&r2000->timer);
+ osmo_timer_del(&r2000->timer);
sender_destroy(&r2000->sender);
free(r2000);
}
@@ -511,19 +512,19 @@ void r2000_destroy(sender_t *sender)
/* go idle and return to frame mode */
void r2000_go_idle(r2000_t *r2000)
{
- timer_stop(&r2000->timer);
+ osmo_timer_del(&r2000->timer);
if (r2000->callref) {
- PDEBUG(DR2000, DEBUG_ERROR, "Going idle, but still having callref, please fix!\n");
+ LOGP(DR2000, LOGL_ERROR, "Going idle, but still having callref, please fix!\n");
call_up_release(r2000->callref, CAUSE_NORMAL);
r2000->callref = 0;
}
if (r2000->sysinfo.chan_type == CHAN_TYPE_TC) {
- PDEBUG_CHAN(DR2000, DEBUG_INFO, "Entering IDLE state, no transmission at relais %d on %s.\n", r2000->sysinfo.relais, chan_type_long_name(r2000->sysinfo.chan_type));
+ LOGP_CHAN(DR2000, LOGL_INFO, "Entering IDLE state, no transmission at relais %d on %s.\n", r2000->sysinfo.relais, chan_type_long_name(r2000->sysinfo.chan_type));
r2000_set_dsp_mode(r2000, DSP_MODE_OFF, -1);
} else {
- PDEBUG_CHAN(DR2000, DEBUG_INFO, "Entering IDLE state, sending idle frames at relais %d on %s.\n", r2000->sysinfo.relais, chan_type_long_name(r2000->sysinfo.chan_type));
+ LOGP_CHAN(DR2000, LOGL_INFO, "Entering IDLE state, sending idle frames at relais %d on %s.\n", r2000->sysinfo.relais, chan_type_long_name(r2000->sysinfo.chan_type));
r2000_set_dsp_mode(r2000, DSP_MODE_FRAME, (r2000->sender.loopback) ? r2000_encode_super(r2000) : -1);
}
r2000_new_state(r2000, STATE_IDLE);
@@ -532,7 +533,7 @@ void r2000_go_idle(r2000_t *r2000)
}
/* release towards station mobile */
-void r2000_release(r2000_t *r2000)
+static void r2000_release(r2000_t *r2000)
{
if (r2000->state == STATE_IDLE
|| r2000->state == STATE_OUT_ASSIGN
@@ -541,18 +542,18 @@ void r2000_release(r2000_t *r2000)
|| r2000->state == STATE_RECALL_WAIT) {
/* release on CC */
r2000_new_state(r2000, STATE_RELEASE_CC);
- timer_start(&r2000->timer, RELEASE_TIME);
+ osmo_timer_schedule(&r2000->timer, RELEASE_TIME);
} else {
/* release on TC */
r2000_new_state(r2000, STATE_RELEASE_TC);
- timer_start(&r2000->timer, RELEASE_TIME);
+ osmo_timer_schedule(&r2000->timer, RELEASE_TIME);
}
r2000_set_dsp_mode(r2000, DSP_MODE_FRAME, -1);
}
static void r2000_page(r2000_t *r2000, int try, enum r2000_state state)
{
- PDEBUG_CHAN(DR2000, DEBUG_INFO, "Entering paging state (try %d), sending 'Appel' to '%s'.\n", try, print_subscriber_subscr(&r2000->subscriber));
+ LOGP_CHAN(DR2000, LOGL_INFO, "Entering paging state (try %d), sending 'Appel' to '%s'.\n", try, print_subscriber_subscr(&r2000->subscriber));
r2000_new_state(r2000, state);
r2000->page_try = try;
}
@@ -586,13 +587,13 @@ static r2000_t *move_call_to_chan(r2000_t *old_r2000, enum r2000_chan_type chan_
/* no free channel, reuse combined channel, if possible, or release call */
if (!new_r2000 && old_r2000->sysinfo.chan_type == CHAN_TYPE_CC_TC) {
- PDEBUG(DR2000, DEBUG_NOTICE, "No %s found, straying on %s!\n", chan_type_long_name(chan_type), chan_type_long_name(old_r2000->sysinfo.chan_type));
+ LOGP(DR2000, LOGL_NOTICE, "No %s found, straying on %s!\n", chan_type_long_name(chan_type), chan_type_long_name(old_r2000->sysinfo.chan_type));
return old_r2000;
}
if (!new_r2000) {
- PDEBUG(DR2000, DEBUG_NOTICE, "Cannot move us to %s, because there is no free channel!\n", chan_type_long_name(chan_type));
+ LOGP(DR2000, LOGL_NOTICE, "Cannot move us to %s, because there is no free channel!\n", chan_type_long_name(chan_type));
if (old_r2000->callref) {
- PDEBUG(DR2000, DEBUG_NOTICE, "Failed to assign channel, releasing towards network\n");
+ LOGP(DR2000, LOGL_NOTICE, "Failed to assign channel, releasing towards network\n");
call_up_release(old_r2000->callref, CAUSE_NOCHANNEL);
old_r2000->callref = 0;
}
@@ -651,12 +652,13 @@ static void rx_idle(r2000_t *r2000, frame_t *frame)
r2000->subscriber.relais = frame->sm_relais;
r2000->subscriber.mor = frame->sm_mor;
- PDEBUG_CHAN(DR2000, DEBUG_INFO, "Received inscription from station mobile '%s'\n", print_subscriber_subscr(&r2000->subscriber));
- PDEBUG_CHAN(DR2000, DEBUG_INFO, " -> Mobile Type: %d'\n", r2000->subscriber.type);
- PDEBUG_CHAN(DR2000, DEBUG_INFO, " -> Home Relais: %d'\n", r2000->subscriber.relais);
- PDEBUG_CHAN(DR2000, DEBUG_INFO, " -> Mobile ID: %d'\n", r2000->subscriber.mor);
- PDEBUG_CHAN(DR2000, DEBUG_INFO, " (Use '%s' as dial string to call the station mobile.)'\n", subscriber2string(&r2000->subscriber));
+ LOGP_CHAN(DR2000, LOGL_INFO, "Received inscription from station mobile '%s'\n", print_subscriber_subscr(&r2000->subscriber));
+ LOGP_CHAN(DR2000, LOGL_INFO, " -> Mobile Type: %d'\n", r2000->subscriber.type);
+ LOGP_CHAN(DR2000, LOGL_INFO, " -> Home Relais: %d'\n", r2000->subscriber.relais);
+ LOGP_CHAN(DR2000, LOGL_INFO, " -> Mobile ID: %d'\n", r2000->subscriber.mor);
+ LOGP_CHAN(DR2000, LOGL_INFO, " (Use '%s' as dial string to call the station mobile.)'\n", subscriber2string(&r2000->subscriber));
+ console_inscription(subscriber2string(&r2000->subscriber));
r2000_new_state(r2000, STATE_INSCRIPTION);
break;
case 1:
@@ -666,18 +668,18 @@ static void rx_idle(r2000_t *r2000, frame_t *frame)
r2000->subscriber.relais = frame->sm_relais;
r2000->subscriber.mor = frame->sm_mor;
- PDEBUG_CHAN(DR2000, DEBUG_INFO, "Received outgoing call from station mobile '%s'\n", print_subscriber_frame(frame));
+ LOGP_CHAN(DR2000, LOGL_INFO, "Received outgoing call from station mobile '%s'\n", print_subscriber_frame(frame));
r2000_t *tc = get_free_chan(CHAN_TYPE_TC);
if (!tc) {
- PDEBUG_CHAN(DR2000, DEBUG_NOTICE, "Rejecting mobile originated call, no free traffic channel\n");
+ LOGP_CHAN(DR2000, LOGL_NOTICE, "Rejecting mobile originated call, no free traffic channel\n");
r2000_release(r2000);
return;
}
r2000_new_state(r2000, STATE_OUT_ASSIGN);
break;
default:
- PDEBUG_CHAN(DR2000, DEBUG_DEBUG, "Dropping frame %s in state %s\n", r2000_frame_name(frame->message, SM_TO_REL), r2000_state_name(r2000->state));
+ LOGP_CHAN(DR2000, LOGL_DEBUG, "Dropping frame %s in state %s\n", r2000_frame_name(frame->message, SM_TO_REL), r2000_state_name(r2000->state));
}
}
@@ -691,7 +693,7 @@ static void tx_inscription(r2000_t *r2000, frame_t *frame)
frame->sm_mor = r2000->subscriber.mor;
frame->crins = r2000->sysinfo.crins;
- PDEBUG_CHAN(DR2000, DEBUG_INFO, "Sending inscription acknowledge\n");
+ LOGP_CHAN(DR2000, LOGL_INFO, "Sending inscription acknowledge\n");
r2000_go_idle(r2000);
}
@@ -721,10 +723,10 @@ static void tx_out_assign(r2000_t *r2000, frame_t *frame)
frame->sm_mor = r2000->subscriber.mor;
frame->chan_assign = atoi(tc->sender.kanal);
- PDEBUG_CHAN(DR2000, DEBUG_INFO, "Sending outgoing assignment from channel %s to %s\n", r2000->sender.kanal, tc->sender.kanal);
+ LOGP_CHAN(DR2000, LOGL_INFO, "Sending outgoing assignment from channel %s to %s\n", r2000->sender.kanal, tc->sender.kanal);
r2000_new_state(tc, (tc->state == STATE_OUT_ASSIGN) ? STATE_OUT_IDENT : STATE_RECALL_IDENT);
- timer_start(&tc->timer, IDENT_TIME);
+ osmo_timer_schedule(&tc->timer, IDENT_TIME);
}
/* page phone, assign incoming call */
@@ -748,10 +750,10 @@ static void tx_in_assign(r2000_t *r2000, frame_t *frame)
frame->sm_mor = r2000->subscriber.mor;
frame->chan_assign = atoi(tc->sender.kanal);
- PDEBUG_CHAN(DR2000, DEBUG_INFO, "Sending incoming assignment from channel %s to %s\n", r2000->sender.kanal, tc->sender.kanal);
+ LOGP_CHAN(DR2000, LOGL_INFO, "Sending incoming assignment from channel %s to %s\n", r2000->sender.kanal, tc->sender.kanal);
r2000_new_state(tc, STATE_IN_IDENT);
- timer_start(&tc->timer, IDENT_TIME);
+ osmo_timer_schedule(&tc->timer, IDENT_TIME);
}
/*
@@ -768,7 +770,7 @@ static void tx_ident(r2000_t *r2000, frame_t *frame)
frame->sm_mor = r2000->subscriber.mor;
if (r2000->tx_frame_count == 1)
- PDEBUG_CHAN(DR2000, DEBUG_INFO, "Sending identity request\n");
+ LOGP_CHAN(DR2000, LOGL_INFO, "Sending identity request\n");
}
/* receive identity response */
@@ -786,38 +788,38 @@ static void rx_ident(r2000_t *r2000, frame_t *frame)
switch(frame->message) {
case 16:
/* identity response */
- PDEBUG_CHAN(DR2000, DEBUG_INFO, "Received identity response from station mobile '%s'\n", print_subscriber_frame(frame));
+ LOGP_CHAN(DR2000, LOGL_INFO, "Received identity response from station mobile '%s'\n", print_subscriber_frame(frame));
switch (r2000->state) {
case STATE_IN_IDENT:
/* alert the phone */
r2000_new_state(r2000, STATE_IN_ALERT);
- timer_start(&r2000->timer, ALERT_TIME);
+ osmo_timer_schedule(&r2000->timer, ALERT_TIME);
call_up_alerting(r2000->callref);
break;
case STATE_RECALL_IDENT:
/* alert the phone */
r2000_new_state(r2000, STATE_RECALL_ALERT);
- timer_start(&r2000->timer, ALERT_TIME);
+ osmo_timer_schedule(&r2000->timer, ALERT_TIME);
break;
case STATE_OUT_IDENT:
/* request dial string */
r2000_new_state(r2000, STATE_OUT_DIAL1);
- timer_start(&r2000->timer, DIAL1_TIME);
+ osmo_timer_schedule(&r2000->timer, DIAL1_TIME);
break;
default:
break;
}
break;
default:
- PDEBUG_CHAN(DR2000, DEBUG_DEBUG, "Dropping frame %s in state %s\n", r2000_frame_name(frame->message, SM_TO_REL), r2000_state_name(r2000->state));
+ LOGP_CHAN(DR2000, LOGL_DEBUG, "Dropping frame %s in state %s\n", r2000_frame_name(frame->message, SM_TO_REL), r2000_state_name(r2000->state));
}
}
/* no identity response from phone */
static void timeout_out_ident(r2000_t *r2000)
{
- PDEBUG_CHAN(DR2000, DEBUG_INFO, "Timeout receiving identity (outgoing call)\n");
+ LOGP_CHAN(DR2000, LOGL_INFO, "Timeout receiving identity (outgoing call)\n");
r2000_go_idle(r2000);
}
@@ -825,9 +827,9 @@ static void timeout_out_ident(r2000_t *r2000)
static void timeout_in_ident(r2000_t *r2000)
{
if (r2000->state == STATE_IN_IDENT)
- PDEBUG_CHAN(DR2000, DEBUG_INFO, "Timeout receiving identity (incoming call)\n");
+ LOGP_CHAN(DR2000, LOGL_INFO, "Timeout receiving identity (incoming call)\n");
else
- PDEBUG_CHAN(DR2000, DEBUG_INFO, "Timeout receiving identity (recalling outgoing call)\n");
+ LOGP_CHAN(DR2000, LOGL_INFO, "Timeout receiving identity (recalling outgoing call)\n");
/* move us back to cc */
r2000 = move_call_to_chan(r2000, CHAN_TYPE_CC);
@@ -841,7 +843,7 @@ static void timeout_in_ident(r2000_t *r2000)
}
/* ... or release */
- PDEBUG_CHAN(DR2000, DEBUG_NOTICE, "Phone does not response, releasing towards network\n");
+ LOGP_CHAN(DR2000, LOGL_NOTICE, "Phone does not response, releasing towards network\n");
call_up_release(r2000->callref, CAUSE_OUTOFORDER);
r2000->callref = 0;
r2000_release(r2000);
@@ -868,13 +870,13 @@ static void tx_alert(r2000_t *r2000, frame_t *frame)
tx_invitation(r2000, frame, 3, r2000->sysinfo.nconv);
if (r2000->tx_frame_count == 1)
- PDEBUG_CHAN(DR2000, DEBUG_INFO, "Sending answer invitation to station mobile\n");
+ LOGP_CHAN(DR2000, LOGL_INFO, "Sending answer invitation to station mobile\n");
}
static int setup_call(r2000_t *r2000)
{
/* make call toward network */
- PDEBUG(DR2000, DEBUG_INFO, "Setup call to network.\n");
+ LOGP(DR2000, LOGL_INFO, "Setup call to network.\n");
r2000->callref = call_up_setup(subscriber2string(&r2000->subscriber), r2000->subscriber.dialing, OSMO_CC_NETWORK_R2000_NONE, "");
return 0;
@@ -895,12 +897,12 @@ static void rx_alert(r2000_t *r2000, frame_t *frame)
switch(frame->message) {
case 17:
/* answer */
- PDEBUG_CHAN(DR2000, DEBUG_INFO, "Received answer from station mobile '%s'\n", print_subscriber_frame(frame));
+ LOGP_CHAN(DR2000, LOGL_INFO, "Received answer from station mobile '%s'\n", print_subscriber_frame(frame));
switch (r2000->state) {
case STATE_IN_ALERT:
/* answer incoming call */
- PDEBUG(DR2000, DEBUG_INFO, "Answer call to network.\n");
+ LOGP(DR2000, LOGL_INFO, "Answer call to network.\n");
call_up_answer(r2000->callref, subscriber2string(&r2000->subscriber));
break;
case STATE_OUT_ALERT:
@@ -914,23 +916,23 @@ static void rx_alert(r2000_t *r2000, frame_t *frame)
break;
}
/* go active */
- timer_stop(&r2000->timer);
+ osmo_timer_del(&r2000->timer);
r2000_new_state(r2000, STATE_ACTIVE);
r2000_set_dsp_mode(r2000, DSP_MODE_AUDIO_TX, r2000_encode_super(r2000));
/* start supervisory timer */
- timer_start(&r2000->timer, SUPER_TIME1);
+ osmo_timer_schedule(&r2000->timer, SUPER_TIME1);
break;
default:
- PDEBUG_CHAN(DR2000, DEBUG_DEBUG, "Dropping frame %s in state %s\n", r2000_frame_name(frame->message, SM_TO_REL), r2000_state_name(r2000->state));
+ LOGP_CHAN(DR2000, LOGL_DEBUG, "Dropping frame %s in state %s\n", r2000_frame_name(frame->message, SM_TO_REL), r2000_state_name(r2000->state));
}
}
/* no answer */
static void timeout_alert(r2000_t *r2000)
{
- PDEBUG_CHAN(DR2000, DEBUG_INFO, "Timeout while alerting\n");
+ LOGP_CHAN(DR2000, LOGL_INFO, "Timeout while alerting\n");
- PDEBUG_CHAN(DR2000, DEBUG_NOTICE, "Phone does not response, releasing towards network\n");
+ LOGP_CHAN(DR2000, LOGL_NOTICE, "Phone does not response, releasing towards network\n");
if (r2000->callref) {
call_up_release(r2000->callref, CAUSE_NOANSWER);
r2000->callref = 0;
@@ -948,7 +950,7 @@ static void tx_out_dial(r2000_t *r2000, frame_t *frame)
tx_invitation(r2000, frame, 10, 0);
if (r2000->tx_frame_count == 1)
- PDEBUG_CHAN(DR2000, DEBUG_INFO, "Sending dialing invitation to station mobile\n");
+ LOGP_CHAN(DR2000, LOGL_INFO, "Sending dialing invitation to station mobile\n");
}
/* receive digits */
@@ -970,20 +972,20 @@ static void rx_out_dial1(r2000_t *r2000, frame_t *frame)
r2000->subscriber.dialing[i] = frame->digit[i] + '0';
r2000->subscriber.dialing[10] = '\0';
- PDEBUG_CHAN(DR2000, DEBUG_INFO, "Received digits 1..10 from station mobile: %s\n", r2000->subscriber.dialing);
+ LOGP_CHAN(DR2000, LOGL_INFO, "Received digits 1..10 from station mobile: %s\n", r2000->subscriber.dialing);
r2000_new_state(r2000, STATE_OUT_DIAL2);
- timer_start(&r2000->timer, DIAL2_TIME);
+ osmo_timer_schedule(&r2000->timer, DIAL2_TIME);
break;
default:
- PDEBUG_CHAN(DR2000, DEBUG_DEBUG, "Dropping frame %s in state %s\n", r2000_frame_name(frame->message, SM_TO_REL), r2000_state_name(r2000->state));
+ LOGP_CHAN(DR2000, LOGL_DEBUG, "Dropping frame %s in state %s\n", r2000_frame_name(frame->message, SM_TO_REL), r2000_state_name(r2000->state));
}
}
/* no digits */
static void timeout_out_dial1(r2000_t *r2000)
{
- PDEBUG_CHAN(DR2000, DEBUG_INFO, "Timeout while receiving digits (outgoing call)\n");
+ LOGP_CHAN(DR2000, LOGL_INFO, "Timeout while receiving digits (outgoing call)\n");
r2000_release(r2000);
}
@@ -1007,34 +1009,34 @@ static void rx_out_dial2(r2000_t *r2000, frame_t *frame)
r2000->subscriber.dialing[i + 10] = frame->digit[i] + '0';
r2000->subscriber.dialing[20] = '\0';
- PDEBUG_CHAN(DR2000, DEBUG_INFO, "Received digits 11..20 from station mobile: %s\n", r2000->subscriber.dialing);
+ LOGP_CHAN(DR2000, LOGL_INFO, "Received digits 11..20 from station mobile: %s\n", r2000->subscriber.dialing);
if (r2000->sysinfo.recall) {
- PDEBUG_CHAN(DR2000, DEBUG_INFO, "Suspending call until called party has answered\n");
+ LOGP_CHAN(DR2000, LOGL_INFO, "Suspending call until called party has answered\n");
r2000_new_state(r2000, STATE_SUSPEND);
- timer_start(&r2000->timer, SUSPEND_TIME);
+ osmo_timer_schedule(&r2000->timer, SUSPEND_TIME);
} else {
r2000_new_state(r2000, STATE_OUT_ALERT);
- timer_start(&r2000->timer, ALERT_TIME);
+ osmo_timer_schedule(&r2000->timer, ALERT_TIME);
}
break;
default:
- PDEBUG_CHAN(DR2000, DEBUG_DEBUG, "Dropping frame %s in state %s\n", r2000_frame_name(frame->message, SM_TO_REL), r2000_state_name(r2000->state));
+ LOGP_CHAN(DR2000, LOGL_DEBUG, "Dropping frame %s in state %s\n", r2000_frame_name(frame->message, SM_TO_REL), r2000_state_name(r2000->state));
}
}
/* no additional digits */
static void timeout_out_dial2(r2000_t *r2000)
{
- PDEBUG_CHAN(DR2000, DEBUG_INFO, "Phone does not send digits 11..20\n");
+ LOGP_CHAN(DR2000, LOGL_INFO, "Phone does not send digits 11..20\n");
if (r2000->sysinfo.recall) {
- PDEBUG_CHAN(DR2000, DEBUG_INFO, "Suspending call until called party has answered\n");
+ LOGP_CHAN(DR2000, LOGL_INFO, "Suspending call until called party has answered\n");
r2000_new_state(r2000, STATE_SUSPEND);
- timer_start(&r2000->timer, SUSPEND_TIME);
+ osmo_timer_schedule(&r2000->timer, SUSPEND_TIME);
} else {
r2000_new_state(r2000, STATE_OUT_ALERT);
- timer_start(&r2000->timer, ALERT_TIME);
+ osmo_timer_schedule(&r2000->timer, ALERT_TIME);
}
}
@@ -1048,7 +1050,7 @@ static void tx_suspend(r2000_t *r2000, frame_t *frame)
frame->sm_mor = r2000->subscriber.mor;
if (r2000->tx_frame_count == 1)
- PDEBUG_CHAN(DR2000, DEBUG_INFO, "Sending suspend frame\n");
+ LOGP_CHAN(DR2000, LOGL_INFO, "Sending suspend frame\n");
}
/* release response */
@@ -1066,9 +1068,9 @@ static void rx_suspend(r2000_t *r2000, frame_t *frame)
switch(frame->message) {
case 26:
/* suspend ack */
- PDEBUG_CHAN(DR2000, DEBUG_INFO, "Received suspend response from station mobile '%s'\n", print_subscriber_frame(frame));
+ LOGP_CHAN(DR2000, LOGL_INFO, "Received suspend response from station mobile '%s'\n", print_subscriber_frame(frame));
- timer_stop(&r2000->timer);
+ osmo_timer_del(&r2000->timer);
/* move us back to cc */
r2000 = move_call_to_chan(r2000, CHAN_TYPE_CC);
if (!r2000)
@@ -1079,14 +1081,14 @@ static void rx_suspend(r2000_t *r2000, frame_t *frame)
return;
break;
default:
- PDEBUG_CHAN(DR2000, DEBUG_DEBUG, "Dropping frame %s in state %s\n", r2000_frame_name(frame->message, SM_TO_REL), r2000_state_name(r2000->state));
+ LOGP_CHAN(DR2000, LOGL_DEBUG, "Dropping frame %s in state %s\n", r2000_frame_name(frame->message, SM_TO_REL), r2000_state_name(r2000->state));
}
}
/* response to accept frame */
static void timeout_suspend(r2000_t *r2000)
{
- PDEBUG_CHAN(DR2000, DEBUG_INFO, "Phone does not respond to suspend frame\n");
+ LOGP_CHAN(DR2000, LOGL_INFO, "Phone does not respond to suspend frame\n");
r2000_release(r2000);
}
@@ -1097,7 +1099,7 @@ static void timeout_suspend(r2000_t *r2000)
static void timeout_active(r2000_t *r2000)
{
- PDEBUG_CHAN(DR2000, DEBUG_INFO, "Timeout after loosing supervisory signal, releasing call\n");
+ LOGP_CHAN(DR2000, LOGL_INFO, "Timeout after loosing supervisory signal, releasing call\n");
call_up_release(r2000->callref, CAUSE_TEMPFAIL);
r2000->callref = 0;
@@ -1117,12 +1119,12 @@ static void tx_release_cc(r2000_t *r2000, frame_t *frame)
frame->sm_mor = r2000->subscriber.mor;
if (r2000->tx_frame_count == 1)
- PDEBUG_CHAN(DR2000, DEBUG_INFO, "Sending release towards station mobile\n");
+ LOGP_CHAN(DR2000, LOGL_INFO, "Sending release towards station mobile\n");
}
static void timeout_release_cc(r2000_t *r2000)
{
- PDEBUG_CHAN(DR2000, DEBUG_INFO, "Done sending release, going idle\n");
+ LOGP_CHAN(DR2000, LOGL_INFO, "Done sending release, going idle\n");
r2000_go_idle(r2000);
}
@@ -1136,13 +1138,13 @@ static void tx_release_tc(r2000_t *r2000, frame_t *frame)
frame->sm_mor = r2000->subscriber.mor;
if (r2000->tx_frame_count == 1)
- PDEBUG_CHAN(DR2000, DEBUG_INFO, "Sending release towards station mobile\n");
+ LOGP_CHAN(DR2000, LOGL_INFO, "Sending release towards station mobile\n");
}
static void timeout_release_tc(r2000_t *r2000)
{
- PDEBUG_CHAN(DR2000, DEBUG_INFO, "Timeout while sending release, going idle\n");
+ LOGP_CHAN(DR2000, LOGL_INFO, "Timeout while sending release, going idle\n");
r2000_go_idle(r2000);
}
@@ -1223,9 +1225,9 @@ const char *r2000_get_frame(r2000_t *r2000)
bits = encode_frame(&frame, debug);
if (debug)
- PDEBUG_CHAN(DR2000, DEBUG_DEBUG, "Sending frame %s.\n", r2000_frame_name(frame.message, REL_TO_SM));
+ LOGP_CHAN(DR2000, LOGL_DEBUG, "Sending frame %s.\n", r2000_frame_name(frame.message, REL_TO_SM));
if (debug && r2000->tx_last_frame_idle)
- PDEBUG_CHAN(DR2000, DEBUG_DEBUG, "Subsequent IDLE frames are not show, to prevent flooding the output.\n");
+ LOGP_CHAN(DR2000, LOGL_DEBUG, "Subsequent IDLE frames are not show, to prevent flooding the output.\n");
return bits;
}
@@ -1234,18 +1236,18 @@ void r2000_receive_frame(r2000_t *r2000, const char *bits, double quality, doubl
frame_t frame;
int rc;
- PDEBUG_CHAN(DDSP, DEBUG_INFO, "RX Level: %.0f%% Quality=%.0f\n", level * 100.0, quality * 100.0);
+ LOGP_CHAN(DDSP, LOGL_INFO, "RX Level: %.0f%% Quality=%.0f\n", level * 100.0, quality * 100.0);
rc = decode_frame(&frame, bits);
if (rc < 0) {
- PDEBUG_CHAN(DR2000, (r2000->sender.loopback) ? DEBUG_NOTICE : DEBUG_DEBUG, "Received invalid frame.\n");
+ LOGP_CHAN(DR2000, (r2000->sender.loopback) ? LOGL_NOTICE : LOGL_DEBUG, "Received invalid frame.\n");
return;
}
if (r2000->sender.loopback)
- PDEBUG_CHAN(DR2000, DEBUG_NOTICE, "Received frame %s\n", r2000_frame_name(frame.message, REL_TO_SM));
+ LOGP_CHAN(DR2000, LOGL_NOTICE, "Received frame %s\n", r2000_frame_name(frame.message, REL_TO_SM));
else
- PDEBUG_CHAN(DR2000, DEBUG_DEBUG, "Received frame %s\n", r2000_frame_name(frame.message, SM_TO_REL));
+ LOGP_CHAN(DR2000, LOGL_DEBUG, "Received frame %s\n", r2000_frame_name(frame.message, SM_TO_REL));
if (r2000->sender.loopback)
return;
@@ -1263,7 +1265,7 @@ void r2000_receive_frame(r2000_t *r2000, const char *bits, double quality, doubl
if (!match_subscriber(r2000, &frame))
return;
- PDEBUG_CHAN(DR2000, DEBUG_INFO, "Received release from station mobile\n");
+ LOGP_CHAN(DR2000, LOGL_INFO, "Received release from station mobile\n");
if (r2000->callref) {
call_up_release(r2000->callref, CAUSE_NORMAL);
@@ -1297,7 +1299,7 @@ void r2000_receive_frame(r2000_t *r2000, const char *bits, double quality, doubl
rx_alert(r2000, &frame);
break;
default:
- PDEBUG_CHAN(DR2000, DEBUG_DEBUG, "Dropping frame %s in state %s\n", r2000_frame_name(frame.message, SM_TO_REL), r2000_state_name(r2000->state));
+ LOGP_CHAN(DR2000, LOGL_DEBUG, "Dropping frame %s in state %s\n", r2000_frame_name(frame.message, SM_TO_REL), r2000_state_name(r2000->state));
}
}
@@ -1318,7 +1320,7 @@ void r2000_receive_super(r2000_t *r2000, uint8_t super, double quality, double l
| ((super >> 2) & 0x04)
| (super & 0x08);
- PDEBUG_CHAN(DDSP, DEBUG_INFO, "RX Supervisory: NCONV: %d Relais (4 lowest bits): %d RX Level: %.0f%% Quality=%.0f\n", nconv, relais, level * 100.0, quality * 100.0);
+ LOGP_CHAN(DDSP, LOGL_INFO, "RX Supervisory: NCONV: %d Relais (4 lowest bits): %d RX Level: %.0f%% Quality=%.0f\n", nconv, relais, level * 100.0, quality * 100.0);
if (r2000->sender.loopback)
return;
@@ -1333,13 +1335,13 @@ void r2000_receive_super(r2000_t *r2000, uint8_t super, double quality, double l
r2000_set_dsp_mode(r2000, DSP_MODE_AUDIO_TX_RX, -1);
/* reset supervisory timer */
- timer_start(&r2000->timer, SUPER_TIME2);
+ osmo_timer_schedule(&r2000->timer, SUPER_TIME2);
}
/* Timeout handling */
-static void r2000_timeout(struct timer *timer)
+static void r2000_timeout(void *data)
{
- r2000_t *r2000 = (r2000_t *)timer->priv;
+ r2000_t *r2000 = data;
switch (r2000->state) {
case STATE_OUT_IDENT:
@@ -1392,7 +1394,7 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
/* 1. convert number to station mobile identification, return INVALNUMBER */
if (string2subscriber(dialing, &subscr)) {
- PDEBUG(DR2000, DEBUG_NOTICE, "Outgoing call to invalid number '%s', rejecting!\n", dialing);
+ LOGP(DR2000, LOGL_NOTICE, "Outgoing call to invalid number '%s', rejecting!\n", dialing);
return -CAUSE_INVALNUMBER;
}
@@ -1405,23 +1407,23 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
break;
}
if (sender) {
- PDEBUG(DR2000, DEBUG_NOTICE, "Outgoing call to busy number, rejecting!\n");
+ LOGP(DR2000, LOGL_NOTICE, "Outgoing call to busy number, rejecting!\n");
return -CAUSE_BUSY;
}
/* 3. check if all paging (control) channels are busy, return NOCHANNEL */
r2000 = get_free_chan(CHAN_TYPE_CC);
if (!r2000) {
- PDEBUG(DR2000, DEBUG_NOTICE, "Outgoing call, but no free control channel, rejecting!\n");
+ LOGP(DR2000, LOGL_NOTICE, "Outgoing call, but no free control channel, rejecting!\n");
return -CAUSE_NOCHANNEL;
}
tc = get_free_chan(CHAN_TYPE_TC);
if (!tc) {
- PDEBUG(DR2000, DEBUG_NOTICE, "Outgoing call, but no free traffic channel, rejecting!\n");
+ LOGP(DR2000, LOGL_NOTICE, "Outgoing call, but no free traffic channel, rejecting!\n");
return -CAUSE_NOCHANNEL;
}
- PDEBUG(DR2000, DEBUG_INFO, "Call to station mobile, paging station id '%s'\n", print_subscriber_subscr(&subscr));
+ LOGP(DR2000, LOGL_INFO, "Call to station mobile, paging station id '%s'\n", print_subscriber_subscr(&subscr));
/* 4. trying to page station mobile */
memcpy(&r2000->subscriber, &subscr, sizeof(r2000_subscriber_t));
@@ -1432,7 +1434,7 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
}
/* Call control answers call toward station mobile. */
-void call_down_answer(int callref)
+void call_down_answer(int callref, struct timeval __attribute__((unused)) *tv_meter)
{
sender_t *sender;
r2000_t *r2000;
@@ -1443,14 +1445,14 @@ void call_down_answer(int callref)
break;
}
if (!sender) {
- PDEBUG(DR2000, DEBUG_NOTICE, "Outgoing answer, but no callref!\n");
+ LOGP(DR2000, LOGL_NOTICE, "Outgoing answer, but no callref!\n");
call_up_release(callref, CAUSE_INVALCALLREF);
return;
}
switch (r2000->state) {
case STATE_RECALL_WAIT:
- PDEBUG_CHAN(DR2000, DEBUG_INFO, "Call has been answered by network, recalling station mobile.\n");
+ LOGP_CHAN(DR2000, LOGL_INFO, "Call has been answered by network, recalling station mobile.\n");
r2000_page(r2000, PAGE_TRIES, STATE_RECALL_ASSIGN);
call_tone_recall(callref, 1);
break;
@@ -1468,7 +1470,7 @@ void call_down_disconnect(int callref, int __attribute__((unused)) cause)
sender_t *sender;
r2000_t *r2000;
- PDEBUG(DR2000, DEBUG_INFO, "Call has been disconnected by network.\n");
+ LOGP(DR2000, LOGL_INFO, "Call has been disconnected by network.\n");
for (sender = sender_head; sender; sender = sender->next) {
r2000 = (r2000_t *) sender;
@@ -1476,7 +1478,7 @@ void call_down_disconnect(int callref, int __attribute__((unused)) cause)
break;
}
if (!sender) {
- PDEBUG(DR2000, DEBUG_NOTICE, "Outgoing disconnect, but no callref!\n");
+ LOGP(DR2000, LOGL_NOTICE, "Outgoing disconnect, but no callref!\n");
call_up_release(callref, CAUSE_INVALCALLREF);
return;
}
@@ -1486,7 +1488,7 @@ void call_down_disconnect(int callref, int __attribute__((unused)) cause)
return;
switch (r2000->state) {
default:
- PDEBUG_CHAN(DR2000, DEBUG_NOTICE, "Outgoing disconnect, during call setup, releasing!\n");
+ LOGP_CHAN(DR2000, LOGL_NOTICE, "Outgoing disconnect, during call setup, releasing!\n");
r2000->callref = 0;
r2000_release(r2000);
break;
@@ -1501,7 +1503,7 @@ void call_down_release(int callref, int __attribute__((unused)) cause)
sender_t *sender;
r2000_t *r2000;
- PDEBUG(DR2000, DEBUG_INFO, "Call has been released by network, releasing call.\n");
+ LOGP(DR2000, LOGL_INFO, "Call has been released by network, releasing call.\n");
for (sender = sender_head; sender; sender = sender->next) {
r2000 = (r2000_t *) sender;
@@ -1509,7 +1511,7 @@ void call_down_release(int callref, int __attribute__((unused)) cause)
break;
}
if (!sender) {
- PDEBUG(DR2000, DEBUG_NOTICE, "Outgoing release, but no callref!\n");
+ LOGP(DR2000, LOGL_NOTICE, "Outgoing release, but no callref!\n");
/* don't send release, because caller already released */
return;
}
@@ -1518,39 +1520,15 @@ void call_down_release(int callref, int __attribute__((unused)) cause)
switch (r2000->state) {
case STATE_ACTIVE:
- PDEBUG_CHAN(DR2000, DEBUG_NOTICE, "Outgoing release, during ringing, releasing!\n");
+ LOGP_CHAN(DR2000, LOGL_NOTICE, "Outgoing release, during ringing, releasing!\n");
r2000_release(r2000);
break;
default:
- PDEBUG_CHAN(DR2000, DEBUG_NOTICE, "Outgoing release, during call setup, releasing!\n");
+ LOGP_CHAN(DR2000, LOGL_NOTICE, "Outgoing release, during call setup, releasing!\n");
r2000_release(r2000);
break;
}
}
-/* 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;
- r2000_t *r2000;
-
- for (sender = sender_head; sender; sender = sender->next) {
- r2000 = (r2000_t *) sender;
- if (r2000->callref == callref)
- break;
- }
- if (!sender)
- return;
-
- if (r2000->dsp_mode == DSP_MODE_AUDIO_TX
- || r2000->dsp_mode == DSP_MODE_AUDIO_TX_RX) {
- if (r2000->compandor)
- compress_audio(&r2000->cstate, samples, count);
- jitter_save(&r2000->sender.dejitter, samples, count, 1, sequence, timestamp, ssrc);
- }
-}
-
-void call_down_clock(void) {}
-
void dump_info(void) {}
diff --git a/src/r2000/r2000.h b/src/r2000/r2000.h
index 2d9d07c..b1bb03a 100644
--- a/src/r2000/r2000.h
+++ b/src/r2000/r2000.h
@@ -1,5 +1,5 @@
#include "../libcompandor/compandor.h"
-#include "../libtimer/timer.h"
+#include <osmocom/core/timer.h>
#include "../libmobile/sender.h"
#include "../libmobile/call.h"
#include "../libfsk/fsk.h"
@@ -69,7 +69,7 @@ typedef struct r2000 {
/* sender's states */
enum r2000_state state;
int callref;
- struct timer timer;
+ struct osmo_timer_list timer;
r2000_subscriber_t subscriber;
int page_try; /* the try number of calling the mobile */
int tx_frame_count; /* to count repeated frames */
diff --git a/src/r2000/tones.c b/src/r2000/tones.c
index 5763c64..6eb9c0a 100644
--- a/src/r2000/tones.c
+++ b/src/r2000/tones.c
@@ -1,5 +1,6 @@
#include <stdint.h>
+#include "tones.h"
static int16_t pattern[] = {
0x0000, 0x1483,
diff --git a/src/radio/Makefile.am b/src/radio/Makefile.am
index a96e3bb..6917b79 100644
--- a/src/radio/Makefile.am
+++ b/src/radio/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
if HAVE_SDR
@@ -11,7 +11,6 @@ osmoradio_SOURCES = \
osmoradio_LDADD = \
$(COMMON_LA) \
$(top_builddir)/src/liboptions/liboptions.a \
- $(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \
$(top_builddir)/src/libsdr/libsdr.a \
@@ -24,7 +23,8 @@ osmoradio_LDADD = \
$(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/libdisplay/libdisplay.a \
$(top_builddir)/src/libfft/libfft.a \
- $(top_builddir)/src/libtimer/libtimer.a \
+ $(top_builddir)/src/liblogging/liblogging.a \
+ $(LIBOSMOCORE_LIBS) \
$(UHD_LIBS) \
$(SOAPY_LIBS) \
-lm
diff --git a/src/radio/main.c b/src/radio/main.c
index b58108f..e734c7c 100644
--- a/src/radio/main.c
+++ b/src/radio/main.c
@@ -31,10 +31,11 @@ enum paging_signal;
#include <termios.h>
#include <unistd.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../libsdr/sdr_config.h"
#include "../libsdr/sdr.h"
#include "../liboptions/options.h"
+#include <osmocom/cc/misc.h>
#include "radio.h"
#define DEFAULT_LO_OFFSET -1000000.0
@@ -42,9 +43,10 @@ enum paging_signal;
void *sender_head = NULL;
int use_sdr = 0;
int num_kanal = 1; /* only one channel used for debugging */
-int rt_prio = 1;
+int rt_prio = 0;
int fast_math = 0;
+void *get_sender_by_empfangsfrequenz(void);
void *get_sender_by_empfangsfrequenz() { return NULL; }
static double frequency = 0.0;
@@ -70,7 +72,7 @@ static int rds2 = 0;
/* global variable to quit main loop */
int quit = 0;
-void sighandler(int sigset)
+static void sighandler(int sigset)
{
if (sigset == SIGHUP)
return;
@@ -100,7 +102,7 @@ static int get_char()
return -1;
}
-void print_help(const char *arg0)
+static void print_help(const char *arg0)
{
printf("Usage: %s --sdr-soapy|--sdr-uhd <sdr options> -f <frequency> -M <modulation> -R|-T [options]\n", arg0);
@@ -299,7 +301,8 @@ int main(int argc, char *argv[])
int c;
int buffer_size;
- debuglevel = 0;
+ loglevel = LOGL_DEBUG;
+ logging_init();
sdr_config_init(DEFAULT_LO_OFFSET);
@@ -384,8 +387,10 @@ int main(int argc, char *argv[])
memset(&schedp, 0, sizeof(schedp));
schedp.sched_priority = rt_prio;
rc = sched_setscheduler(0, SCHED_RR, &schedp);
- if (rc)
+ if (rc) {
fprintf(stderr, "Error setting SCHED_RR with prio %d\n", rt_prio);
+ goto error;
+ }
}
double tx_frequencies[1], rx_frequencies[1];
@@ -393,7 +398,7 @@ int main(int argc, char *argv[])
tx_frequencies[0] = frequency;
rx_frequencies[0] = frequency;
am[0] = 0;
- sdr = sdr_open(NULL, tx_frequencies, rx_frequencies, am, 0, 0.0, dsp_samplerate, buffer_size, 1.0, 0.0, 0.0, 0.0);
+ sdr = sdr_open(0, NULL, tx_frequencies, rx_frequencies, am, 0, 0.0, dsp_samplerate, buffer_size, 1.0, 0.0, 0.0, 0.0);
if (!sdr)
goto error;
sdr_start(sdr);
@@ -528,3 +533,5 @@ error:
return 0;
}
+void osmo_cc_set_log_cat(int __attribute__((unused)) cc_log_cat) {}
+
diff --git a/src/radio/radio.c b/src/radio/radio.c
index cf2c233..dcc0b4d 100644
--- a/src/radio/radio.c
+++ b/src/radio/radio.c
@@ -25,7 +25,7 @@
#include <errno.h>
#include <pthread.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../libsound/sound.h"
#include "../libclipper/clipper.h"
#include "radio.h"
@@ -75,7 +75,7 @@ int radio_init(radio_t *radio, int buffer_size, int samplerate, double frequency
radio->signal_bandwidth = bandwidth;
break;
case MODULATION_NONE:
- PDEBUG(DRADIO, DEBUG_ERROR, "Wrong modulation, please fix!\n");
+ LOGP(DRADIO, LOGL_ERROR, "Wrong modulation, please fix!\n");
goto error;
}
@@ -85,12 +85,12 @@ int radio_init(radio_t *radio, int buffer_size, int samplerate, double frequency
radio->tx_audio_channels = 0;
rc = wave_create_playback(&radio->wave_tx_play, tx_wave_file, &_samplerate, &radio->tx_audio_channels, 1.0);
if (rc < 0) {
- PDEBUG(DRADIO, DEBUG_ERROR, "Failed to create WAVE playback instance!\n");
+ LOGP(DRADIO, LOGL_ERROR, "Failed to create WAVE playback instance!\n");
goto error;
}
if (radio->tx_audio_channels != 1 && radio->tx_audio_channels != 2)
{
- PDEBUG(DRADIO, DEBUG_ERROR, "WAVE file must have one or two channels!\n");
+ LOGP(DRADIO, LOGL_ERROR, "WAVE file must have one or two channels!\n");
goto error;
}
radio->tx_audio_samplerate = _samplerate;
@@ -100,18 +100,18 @@ int radio_init(radio_t *radio, int buffer_size, int samplerate, double frequency
/* open audio device */
radio->tx_audio_samplerate = 48000;
radio->tx_audio_channels = (stereo) ? 2 : 1;
- radio->tx_sound = sound_open(tx_audiodev, NULL, NULL, NULL, radio->tx_audio_channels, 0.0, radio->tx_audio_samplerate, radio->buffer_size, 1.0, 1.0, 0.0, 2.0);
+ radio->tx_sound = sound_open(SOUND_DIR_PLAY, tx_audiodev, NULL, NULL, NULL, radio->tx_audio_channels, 0.0, radio->tx_audio_samplerate, radio->buffer_size, 1.0, 1.0, 0.0, 2.0);
if (!radio->tx_sound) {
rc = -EIO;
- PDEBUG(DRADIO, DEBUG_ERROR, "Failed to open sound device!\n");
+ LOGP(DRADIO, LOGL_ERROR, "Failed to open sound device!\n");
goto error;
}
- jitter_create(&radio->tx_dejitter[0], "left", radio->tx_audio_samplerate, sizeof(sample_t), 0.050, 0.500, JITTER_FLAG_NONE);
- jitter_create(&radio->tx_dejitter[1], "right", radio->tx_audio_samplerate, sizeof(sample_t), 0.050, 0.500, JITTER_FLAG_NONE);
+ jitter_create(&radio->tx_dejitter[0], "left", radio->tx_audio_samplerate, 0.050, 0.500, JITTER_FLAG_NONE);
+ jitter_create(&radio->tx_dejitter[1], "right", radio->tx_audio_samplerate, 0.050, 0.500, JITTER_FLAG_NONE);
radio->tx_audio_mode = AUDIO_MODE_AUDIODEV;
#else
rc = -ENOTSUP;
- PDEBUG(DRADIO, DEBUG_ERROR, "No sound card support compiled in!\n");
+ LOGP(DRADIO, LOGL_ERROR, "No sound card support compiled in!\n");
goto error;
#endif
} else {
@@ -124,7 +124,7 @@ int radio_init(radio_t *radio, int buffer_size, int samplerate, double frequency
radio->testtone[0] = calloc(radio->testtone_length * 2, sizeof(sample_t));
if (!radio->testtone[0]) {
rc = -ENOMEM;
- PDEBUG(DRADIO, DEBUG_ERROR, "Failed to allocate test sound buffer!\n");
+ LOGP(DRADIO, LOGL_ERROR, "Failed to allocate test sound buffer!\n");
goto error;
}
radio->testtone[1] = radio->testtone[0] + radio->testtone_length;
@@ -153,7 +153,7 @@ int radio_init(radio_t *radio, int buffer_size, int samplerate, double frequency
radio->rx_audio_channels = (radio->stereo) ? 2 : 1;
rc = wave_create_record(&radio->wave_rx_rec, rx_wave_file, radio->rx_audio_samplerate, radio->rx_audio_channels, 1.0);
if (rc < 0) {
- PDEBUG(DRADIO, DEBUG_ERROR, "Failed to create WAVE record instance!\n");
+ LOGP(DRADIO, LOGL_ERROR, "Failed to create WAVE record instance!\n");
goto error;
}
radio->rx_audio_mode |= AUDIO_MODE_WAVEFILE;
@@ -164,21 +164,18 @@ int radio_init(radio_t *radio, int buffer_size, int samplerate, double frequency
radio->rx_audio_samplerate = 48000;
radio->rx_audio_channels = (stereo) ? 2 : 1;
/* check if we use same device */
- if (radio->tx_sound && !strcmp(tx_audiodev, rx_audiodev))
- radio->rx_sound = radio->tx_sound;
- else
- radio->rx_sound = sound_open(rx_audiodev, NULL, NULL, NULL, radio->rx_audio_channels, 0.0, radio->rx_audio_samplerate, radio->buffer_size, 1.0, 1.0, 0.0, 2.0);
+ radio->rx_sound = sound_open(SOUND_DIR_REC, rx_audiodev, NULL, NULL, NULL, radio->rx_audio_channels, 0.0, radio->rx_audio_samplerate, radio->buffer_size, 1.0, 1.0, 0.0, 2.0);
if (!radio->rx_sound) {
rc = -EIO;
- PDEBUG(DRADIO, DEBUG_ERROR, "Failed to open sound device!\n");
+ LOGP(DRADIO, LOGL_ERROR, "Failed to open sound device!\n");
goto error;
}
- jitter_create(&radio->rx_dejitter[0], "left", radio->rx_audio_samplerate, sizeof(sample_t), 0.050, 0.500, JITTER_FLAG_NONE);
- jitter_create(&radio->rx_dejitter[1], "right", radio->rx_audio_samplerate, sizeof(sample_t), 0.050, 0.500, JITTER_FLAG_NONE);
+ jitter_create(&radio->rx_dejitter[0], "left", radio->rx_audio_samplerate, 0.050, 0.500, JITTER_FLAG_NONE);
+ jitter_create(&radio->rx_dejitter[1], "right", radio->rx_audio_samplerate, 0.050, 0.500, JITTER_FLAG_NONE);
radio->rx_audio_mode |= AUDIO_MODE_AUDIODEV;
#else
rc = -ENOTSUP;
- PDEBUG(DRADIO, DEBUG_ERROR, "No sound card support compiled in!\n");
+ LOGP(DRADIO, LOGL_ERROR, "No sound card support compiled in!\n");
goto error;
#endif
}
@@ -191,20 +188,20 @@ int radio_init(radio_t *radio, int buffer_size, int samplerate, double frequency
/* check if sample rate is too low */
if (radio->tx_audio_samplerate > radio->signal_samplerate) {
rc = -EINVAL;
- PDEBUG(DRADIO, DEBUG_ERROR, "You have selected a signal processing sample rate of %.0f. Your audio sample rate is %.0f.\n", radio->signal_samplerate, radio->tx_audio_samplerate);
- PDEBUG(DRADIO, DEBUG_ERROR, "Please select a sample rate that is higher or equal the audio sample rate!\n");
+ LOGP(DRADIO, LOGL_ERROR, "You have selected a signal processing sample rate of %.0f. Your audio sample rate is %.0f.\n", radio->signal_samplerate, radio->tx_audio_samplerate);
+ LOGP(DRADIO, LOGL_ERROR, "Please select a sample rate that is higher or equal the audio sample rate!\n");
goto error;
}
if (radio->rx_audio_samplerate > radio->signal_samplerate) {
rc = -EINVAL;
- PDEBUG(DRADIO, DEBUG_ERROR, "You have selected a signal processing sample rate of %.0f. Your audio sample rate is %.0f.\n", radio->signal_samplerate, radio->rx_audio_samplerate);
- PDEBUG(DRADIO, DEBUG_ERROR, "Please select a sample rate that is higher or equal the audio sample rate!\n");
+ LOGP(DRADIO, LOGL_ERROR, "You have selected a signal processing sample rate of %.0f. Your audio sample rate is %.0f.\n", radio->signal_samplerate, radio->rx_audio_samplerate);
+ LOGP(DRADIO, LOGL_ERROR, "Please select a sample rate that is higher or equal the audio sample rate!\n");
goto error;
}
if (radio->signal_samplerate < radio->signal_bandwidth * 2 / 0.75) {
rc = -EINVAL;
- PDEBUG(DRADIO, DEBUG_ERROR, "You have selected a signal processing sample rate of %.0f. Your signal's bandwidth %.0f.\n", radio->signal_samplerate, radio->signal_bandwidth);
- PDEBUG(DRADIO, DEBUG_ERROR, "Your signal processing sample rate must be at least one third greater than the signal's double bandwidth. Use at least %.0f.\n", radio->signal_bandwidth * 2.0 / 0.75);
+ LOGP(DRADIO, LOGL_ERROR, "You have selected a signal processing sample rate of %.0f. Your signal's bandwidth %.0f.\n", radio->signal_samplerate, radio->signal_bandwidth);
+ LOGP(DRADIO, LOGL_ERROR, "Your signal processing sample rate must be at least one third greater than the signal's double bandwidth. Use at least %.0f.\n", radio->signal_bandwidth * 2.0 / 0.75);
goto error;
}
@@ -244,7 +241,7 @@ int radio_init(radio_t *radio, int buffer_size, int samplerate, double frequency
if (time_constant_us > 0.0) {
radio->emphasis = 1;
/* time constant */
- PDEBUG(DRADIO, DEBUG_INFO, "Using emphasis cut-off at %.0f Hz.\n", timeconstant2cutoff(time_constant_us));
+ LOGP(DRADIO, LOGL_INFO, "Using emphasis cut-off at %.0f Hz.\n", timeconstant2cutoff(time_constant_us));
rc = init_emphasis(&radio->fm_emphasis[0], radio->signal_samplerate, timeconstant2cutoff(time_constant_us), DC_CUTOFF, radio->audio_bandwidth);
if (rc < 0)
goto error;
@@ -296,21 +293,21 @@ int radio_init(radio_t *radio, int buffer_size, int samplerate, double frequency
}
if (radio->tx_audio_mode)
- PDEBUG(DRADIO, DEBUG_INFO, "Bandwidth of audio source is %.0f Hz.\n", radio->tx_audio_samplerate / 2.0);
+ LOGP(DRADIO, LOGL_INFO, "Bandwidth of audio source is %.0f Hz.\n", radio->tx_audio_samplerate / 2.0);
if (radio->rx_audio_mode)
- PDEBUG(DRADIO, DEBUG_INFO, "Bandwidth of audio sink is %.0f Hz.\n", radio->rx_audio_samplerate / 2.0);
- PDEBUG(DRADIO, DEBUG_INFO, "Bandwidth of audio signal is %.0f Hz.\n", radio->audio_bandwidth);
- PDEBUG(DRADIO, DEBUG_INFO, "Bandwidth of modulated signal is %.0f Hz.\n", radio->signal_bandwidth);
+ LOGP(DRADIO, LOGL_INFO, "Bandwidth of audio sink is %.0f Hz.\n", radio->rx_audio_samplerate / 2.0);
+ LOGP(DRADIO, LOGL_INFO, "Bandwidth of audio signal is %.0f Hz.\n", radio->audio_bandwidth);
+ LOGP(DRADIO, LOGL_INFO, "Bandwidth of modulated signal is %.0f Hz.\n", radio->signal_bandwidth);
if (radio->tx_audio_mode)
- PDEBUG(DRADIO, DEBUG_INFO, "Sample rate of audio source is %.0f Hz.\n", radio->tx_audio_samplerate);
+ LOGP(DRADIO, LOGL_INFO, "Sample rate of audio source is %.0f Hz.\n", radio->tx_audio_samplerate);
if (radio->rx_audio_mode)
- PDEBUG(DRADIO, DEBUG_INFO, "Sample rate of audio sink is %.0f Hz.\n", radio->rx_audio_samplerate);
- PDEBUG(DRADIO, DEBUG_INFO, "Sample rate of signal is %.0f Hz.\n", radio->signal_samplerate);
+ LOGP(DRADIO, LOGL_INFO, "Sample rate of audio sink is %.0f Hz.\n", radio->rx_audio_samplerate);
+ LOGP(DRADIO, LOGL_INFO, "Sample rate of signal is %.0f Hz.\n", radio->signal_samplerate);
/* one or two audio channels */
if (radio->tx_audio_channels != 1 && radio->tx_audio_channels != 2)
{
- PDEBUG(DRADIO, DEBUG_ERROR, "Wrong number of audio channels, please fix!\n");
+ LOGP(DRADIO, LOGL_ERROR, "Wrong number of audio channels, please fix!\n");
goto error;
}
@@ -323,7 +320,7 @@ int radio_init(radio_t *radio, int buffer_size, int samplerate, double frequency
radio->audio_buffer_size = rx_size;
radio->audio_buffer = calloc(radio->audio_buffer_size * 2, sizeof(*radio->audio_buffer));
if (!radio->audio_buffer) {
- PDEBUG(DRADIO, DEBUG_ERROR, "No memory!!\n");
+ LOGP(DRADIO, LOGL_ERROR, "No memory!!\n");
rc = -ENOMEM;
goto error;
}
@@ -333,7 +330,7 @@ int radio_init(radio_t *radio, int buffer_size, int samplerate, double frequency
radio->signal_buffer = calloc(radio->signal_buffer_size * 3, sizeof(*radio->signal_buffer));
radio->signal_power_buffer = calloc(radio->signal_buffer_size, sizeof(*radio->signal_power_buffer));
if (!radio->signal_buffer || !radio->signal_power_buffer) {
- PDEBUG(DRADIO, DEBUG_ERROR, "No memory!!\n");
+ LOGP(DRADIO, LOGL_ERROR, "No memory!!\n");
rc = -ENOMEM;
goto error;
}
@@ -343,7 +340,7 @@ int radio_init(radio_t *radio, int buffer_size, int samplerate, double frequency
radio->Q_buffer = calloc(buffer_size, sizeof(*radio->Q_buffer));
radio->carrier_buffer = calloc(buffer_size, sizeof(*radio->carrier_buffer));
if (!radio->I_buffer || !radio->Q_buffer || !radio->carrier_buffer) {
- PDEBUG(DRADIO, DEBUG_ERROR, "No memory!!\n");
+ LOGP(DRADIO, LOGL_ERROR, "No memory!!\n");
rc = -ENOMEM;
goto error;
}
@@ -442,16 +439,17 @@ int radio_tx(radio_t *radio, float *baseband, int signal_num)
sample_t *audio_samples[2];
sample_t *signal_samples[3];
uint8_t *signal_power;
+ jitter_frame_t *jf;
if (signal_num > radio->buffer_size) {
- PDEBUG(DRADIO, DEBUG_ERROR, "signal_num > buffer_size, please fix!.\n");
+ LOGP(DRADIO, LOGL_ERROR, "signal_num > buffer_size, please fix!.\n");
abort();
}
/* audio buffers: how many sample for audio (rounded down) */
audio_num = (int)((double)signal_num / radio->tx_resampler[0].factor);
if (audio_num > radio->audio_buffer_size) {
- PDEBUG(DRADIO, DEBUG_ERROR, "audio_num > audio_buffer_size, please fix!.\n");
+ LOGP(DRADIO, LOGL_ERROR, "audio_num > audio_buffer_size, please fix!.\n");
abort();
}
audio_samples[0] = radio->audio_buffer;
@@ -460,7 +458,7 @@ int radio_tx(radio_t *radio, float *baseband, int signal_num)
/* signal buffers: a bit more samples to be safe */
signal_num = (int)((double)audio_num * radio->tx_resampler[0].factor + 0.5) + 10;
if (signal_num > radio->signal_buffer_size) {
- PDEBUG(DRADIO, DEBUG_ERROR, "signal_num > signal_buffer_size, please fix!.\n");
+ LOGP(DRADIO, LOGL_ERROR, "signal_num > signal_buffer_size, please fix!.\n");
abort();
}
signal_samples[0] = radio->signal_buffer;
@@ -479,7 +477,7 @@ int radio_tx(radio_t *radio, float *baseband, int signal_num)
wave_destroy_playback(&radio->wave_tx_play);
rc = wave_create_playback(&radio->wave_tx_play, radio->tx_wave_file, &_samplerate, &radio->tx_audio_channels, 1.0);
if (rc < 0) {
- PDEBUG(DRADIO, DEBUG_ERROR, "Failed to re-open wave file.\n");
+ LOGP(DRADIO, LOGL_ERROR, "Failed to re-open wave file.\n");
return rc;
}
}
@@ -488,17 +486,25 @@ int radio_tx(radio_t *radio, float *baseband, int signal_num)
case AUDIO_MODE_AUDIODEV:
rc = sound_read(radio->tx_sound, audio_samples, radio->audio_buffer_size, radio->tx_audio_channels, NULL);
if (rc < 0) {
- PDEBUG(DRADIO, DEBUG_ERROR, "Failed to read from sound device (rc = %d)!\n", audio_num);
+ LOGP(DRADIO, LOGL_ERROR, "Failed to read from sound device (rc = %d)!\n", audio_num);
if (rc == -EPIPE)
- PDEBUG(DRADIO, DEBUG_ERROR, "Trying to recover.\n");
+ LOGP(DRADIO, LOGL_ERROR, "Trying to recover.\n");
else
return 0;
}
- jitter_save(&radio->tx_dejitter[0], audio_samples[0], rc, 0, 0, 0 ,0);
- jitter_load(&radio->tx_dejitter[0], audio_samples[0], audio_num);
+ jf = jitter_frame_alloc(NULL, NULL, (uint8_t *)audio_samples[0], rc * sizeof(*(audio_samples[0])), 0, radio->tx_sequence[0], radio->tx_timestamp[0], 123);
+ if (jf)
+ jitter_save(&radio->tx_dejitter[0], jf);
+ radio->tx_sequence[0] += 1;
+ radio->tx_timestamp[0] += rc;
+ jitter_load_samples(&radio->tx_dejitter[0], (uint8_t *)audio_samples[0], audio_num, sizeof(*(audio_samples[0])), NULL, NULL);
if (radio->tx_audio_channels == 2) {
- jitter_save(&radio->tx_dejitter[1], audio_samples[1], rc, 0, 0, 0 ,0);
- jitter_load(&radio->tx_dejitter[1], audio_samples[1], audio_num);
+ jf = jitter_frame_alloc(NULL, NULL, (uint8_t *)audio_samples[1], rc * sizeof(*(audio_samples[1])), 0, radio->tx_sequence[1], radio->tx_timestamp[1], 123);
+ if (jf)
+ jitter_save(&radio->tx_dejitter[1], jf);
+ radio->tx_sequence[1] += 1;
+ radio->tx_timestamp[1] += rc;
+ jitter_load_samples(&radio->tx_dejitter[1], (uint8_t *)audio_samples[1], audio_num, sizeof(*(audio_samples[1])), NULL, NULL);
}
break;
#endif
@@ -510,7 +516,7 @@ int radio_tx(radio_t *radio, float *baseband, int signal_num)
}
break;
default:
- PDEBUG(DRADIO, DEBUG_ERROR, "Wrong audio mode, please fix!\n");
+ LOGP(DRADIO, LOGL_ERROR, "Wrong audio mode, please fix!\n");
return -EINVAL;
}
@@ -616,14 +622,15 @@ int radio_rx(radio_t *radio, float *baseband, int signal_num)
int audio_num;
sample_t *samples[3];
double p;
+ jitter_frame_t *jf;
if (signal_num > radio->buffer_size) {
- PDEBUG(DRADIO, DEBUG_ERROR, "signal_num > buffer_size, please fix!.\n");
+ LOGP(DRADIO, LOGL_ERROR, "signal_num > buffer_size, please fix!.\n");
abort();
}
if (signal_num > radio->signal_buffer_size) {
- PDEBUG(DRADIO, DEBUG_ERROR, "signal_num > signal_buffer_size, please fix!.\n");
+ LOGP(DRADIO, LOGL_ERROR, "signal_num > signal_buffer_size, please fix!.\n");
abort();
}
samples[0] = radio->signal_buffer;
@@ -728,18 +735,27 @@ int radio_rx(radio_t *radio, float *baseband, int signal_num)
wave_write(&radio->wave_rx_rec, samples, audio_num);
#ifdef HAVE_ALSA
if ((radio->rx_audio_mode & AUDIO_MODE_AUDIODEV)) {
- jitter_save(&radio->rx_dejitter[0], samples[0], audio_num, 0, 0, 0 ,0);
- if (radio->rx_audio_channels == 2)
- jitter_save(&radio->rx_dejitter[1], samples[1], audio_num, 0, 0, 0 ,0);
+ jf = jitter_frame_alloc(NULL, NULL, (uint8_t *)samples[0], audio_num * sizeof(*(samples[0])), 0, radio->rx_sequence[0], radio->rx_timestamp[0], 123);
+ if (jf)
+ jitter_save(&radio->rx_dejitter[0], jf);
+ radio->rx_sequence[0] += 1;
+ radio->rx_timestamp[0] += audio_num;
+ if (radio->rx_audio_channels == 2) {
+ jf = jitter_frame_alloc(NULL, NULL, (uint8_t *)samples[1], audio_num * sizeof(*(samples[1])), 0, radio->rx_sequence[1], radio->rx_timestamp[1], 123);
+ if (jf)
+ jitter_save(&radio->rx_dejitter[1], jf);
+ radio->rx_sequence[1] += 1;
+ radio->rx_timestamp[1] += audio_num;
+ }
audio_num = sound_get_tosend(radio->rx_sound, radio->signal_buffer_size);
- jitter_load(&radio->rx_dejitter[0], samples[0], audio_num);
+ jitter_load_samples(&radio->rx_dejitter[0], (uint8_t *)samples[0], audio_num, sizeof(*samples), NULL, NULL);
if (radio->rx_audio_channels == 2)
- jitter_load(&radio->rx_dejitter[1], samples[1], audio_num);
+ jitter_load_samples(&radio->rx_dejitter[1], (uint8_t *)samples[1], audio_num, sizeof(*samples), NULL, NULL);
audio_num = sound_write(radio->rx_sound, samples, NULL, audio_num, NULL, NULL, radio->rx_audio_channels);
if (audio_num < 0) {
- PDEBUG(DRADIO, DEBUG_ERROR, "Failed to write to sound device (rc = %d)!\n", audio_num);
+ LOGP(DRADIO, LOGL_ERROR, "Failed to write to sound device (rc = %d)!\n", audio_num);
if (audio_num == -EPIPE)
- PDEBUG(DRADIO, DEBUG_ERROR, "Trying to recover.\n");
+ LOGP(DRADIO, LOGL_ERROR, "Trying to recover.\n");
else
return 0;
}
diff --git a/src/radio/radio.h b/src/radio/radio.h
index 35c36ee..ec67400 100644
--- a/src/radio/radio.h
+++ b/src/radio/radio.h
@@ -45,7 +45,11 @@ typedef struct radio {
void *tx_sound; /* sound card process */
void *rx_sound; /* sound card process */
jitter_t tx_dejitter[2]; /* jitter buffer when reading from sound card */
+ uint16_t tx_sequence[2]; /* sequence & ts for jitter buffer */
+ uint32_t tx_timestamp[2];
jitter_t rx_dejitter[2]; /* jitter buffer when writing to sound card */
+ uint16_t rx_sequence[2]; /* sequence & ts for jitter buffer */
+ uint32_t rx_timestamp[2];
sample_t *testtone[2]; /* test tone sample */
int testtone_length;
int testtone_pos;
diff --git a/src/sim/Makefile.am b/src/sim/Makefile.am
index 975de70..1a63b07 100644
--- a/src/sim/Makefile.am
+++ b/src/sim/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
bin_PROGRAMS = \
cnetz_sim
@@ -11,9 +11,10 @@ cnetz_sim_SOURCES = \
cnetz_sim_LDADD = \
$(COMMON_LA) \
- $(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/liboptions/liboptions.a \
$(top_builddir)/src/libserial/libserial.a \
$(top_builddir)/src/libaaimage/libaaimage.a \
+ $(top_builddir)/src/liblogging/liblogging.a \
+ $(LIBOSMOCORE_LIBS) \
-lm
diff --git a/src/sim/main.c b/src/sim/main.c
index fc7a7ef..147967a 100644
--- a/src/sim/main.c
+++ b/src/sim/main.c
@@ -30,10 +30,11 @@
#include <unistd.h>
#include <inttypes.h>
#include <sys/time.h>
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../liboptions/options.h"
#include "../libserial/serial.h"
#include "../libaaimage/aaimage.h"
+#include <osmocom/cc/misc.h>
#include "sim.h"
#include "sniffer.h"
#include "eeprom.h"
@@ -62,7 +63,7 @@ static const char *auth = NULL;
#define TIMEOUT 0.2
-void print_help(const char *arg0)
+static void print_help(const char *arg0)
{
printf("Usage: %s [options] <command>\n", arg0);
/* - - */
@@ -72,7 +73,7 @@ void print_help(const char *arg0)
printf(" --config [~/]<path to config file>\n");
printf(" Give a config file to use. If it starts with '~/', path is at home dir.\n");
printf(" Each line in config file is one option, '-' or '--' must not be given!\n");
- debug_print_help();
+ logging_print_help();
printf(" -s --serial-device <device>\n");
printf(" Serial device (default = '%s')\n", serialdev);
printf(" -b --baud-rate <baud>\n");
@@ -113,7 +114,7 @@ void print_help(const char *arg0)
#define OPT_SONDER 258
#define OPT_WARTUNG 259
-void add_options(void)
+static void add_options(void)
{
option_add('h', "help", 0);
option_add('v', "debug", 1);
@@ -131,7 +132,7 @@ void add_options(void)
option_add('A', "auth", 1);
};
-int handle_options(int short_option, int argi, char **argv)
+static int handle_options(int short_option, int argi, char **argv)
{
int rc;
@@ -140,13 +141,11 @@ int handle_options(int short_option, int argi, char **argv)
print_help(argv[0]);
return 0;
case 'v':
- if (!strcasecmp(argv[argi], "list")) {
- debug_list_cat();
+ rc = parse_logging_opt(argv[argi]);
+ if (rc > 0)
return 0;
- }
- rc = parse_debug_opt(argv[argi]);
if (rc < 0) {
- fprintf(stderr, "Failed to parse debug option, please use -h for help.\n");
+ fprintf(stderr, "Failed to parse logging option, please use -h for help.\n");
return rc;
}
break;
@@ -230,7 +229,7 @@ size_t eeprom_length(void)
/* main loop for interfacing serial with sim / sniffer */
-int main_loop(serial_t *serial, int sniffer)
+static int main_loop(serial_t *serial, int sniffer)
{
int rc, cts = 0, last_cts = 0;
uint8_t byte;
@@ -314,7 +313,7 @@ int main_loop(serial_t *serial, int sniffer)
return quit;
}
-void sighandler(int sigset)
+static void sighandler(int sigset)
{
if (sigset == SIGHUP)
return;
@@ -337,7 +336,8 @@ int main(int argc, char *argv[])
int sniffer = 0;
int i;
- debuglevel = DEBUG_INFO;
+ loglevel = LOGL_INFO;
+ logging_init();
add_options();
rc = options_config_file(argc, argv, "~/.osmocom/analog/sim.conf", handle_options);
@@ -366,13 +366,13 @@ int main(int argc, char *argv[])
rc = fread(eeprom_memory(), eeprom_length(), 1, fp);
fclose(fp);
} else
- PDEBUG(DOPTIONS, DEBUG_INFO, "EEPROM file '%s' does not exist yet.\n", eeprom_file);
+ LOGP(DOPTIONS, LOGL_INFO, "EEPROM file '%s' does not exist yet.\n", eeprom_file);
}
/* check version */
if (eeprom_read(EEPROM_MAGIC + 0) != 'C' || eeprom_read(EEPROM_MAGIC + 1) != '0' + EEPROM_VERSION) {
- PDEBUG(DOPTIONS, DEBUG_ERROR, "EEPROM file '%s' is not compatible with this version of program, please remove it!\n", eeprom_file);
+ LOGP(DOPTIONS, LOGL_ERROR, "EEPROM file '%s' is not compatible with this version of program, please remove it!\n", eeprom_file);
return 1;
}
@@ -400,7 +400,7 @@ int main(int argc, char *argv[])
eeprom_write(EEPROM_WARTUNG_L, ebdt_data[8]);
if (pin) {
if (strlen(pin) < 4 || strlen(pin) > 8) {
- PDEBUG(DSIM7, DEBUG_NOTICE, "Given PIN '%s' has invalid length. (Must be 4 .. 8)\n", pin);
+ LOGP(DSIM7, LOGL_NOTICE, "Given PIN '%s' has invalid length. (Must be 4 .. 8)\n", pin);
return 0;
}
eeprom_write(EEPROM_FLAGS, (strlen(pin) << EEPROM_FLAG_PIN_LEN) | (MAX_PIN_TRY << EEPROM_FLAG_PIN_TRY));
@@ -488,9 +488,9 @@ int main(int argc, char *argv[])
if (fp) {
fwrite(eeprom_memory(), eeprom_length(), 1, fp);
fclose(fp);
- PDEBUG(DOPTIONS, DEBUG_INFO, "EEPROM file '%s' written.\n", eeprom_file);
+ LOGP(DOPTIONS, LOGL_INFO, "EEPROM file '%s' written.\n", eeprom_file);
} else
- PDEBUG(DOPTIONS, DEBUG_INFO, "EEPROM file '%s' cannot be written. (errno = %d)\n", eeprom_file, errno);
+ LOGP(DOPTIONS, LOGL_INFO, "EEPROM file '%s' cannot be written. (errno = %d)\n", eeprom_file, errno);
}
error:
@@ -502,4 +502,6 @@ error:
return 0;
}
+void osmo_cc_set_log_cat(int __attribute__((unused)) cc_log_cat) {}
+
#endif /* ARDUINO */
diff --git a/src/sim/sim.c b/src/sim/sim.c
index baadb4f..0f08357 100644
--- a/src/sim/sim.c
+++ b/src/sim/sim.c
@@ -23,15 +23,17 @@
#include <stdint.h>
#include <errno.h>
#ifndef ARDUINO
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#endif
#include "sim.h"
#include "eeprom.h"
#ifdef ARDUINO
-#define PDEBUG(cat, level, fmt, arg...) while(0)
+#define LOGP(cat, level, fmt, arg...) while(0)
#define EINVAL 22
-static uint32_t my_strtoul(const char *nptr, char **endptr, int base)
+#endif
+
+static uint32_t my_strtoul(const char *nptr, char __attribute__((unused)) **endptr, int __attribute__((unused)) base)
{
uint32_t number = 0;
@@ -40,9 +42,6 @@ static uint32_t my_strtoul(const char *nptr, char **endptr, int base)
return number;
}
-#else
-#define my_strtoul strtoul
-#endif
static void my_ultostr(char *nptr, uint32_t value, int zeros)
{
@@ -112,11 +111,11 @@ int encode_ebdt(uint8_t *data, const char *futln, const char *sicherung, const c
if (futln) {
temp = strlen(futln);
if (temp < 7 || temp > 8) {
- PDEBUG(DSIM7, DEBUG_NOTICE, "Given FUTLN '%s' invalid length. (Must be 7 or 8 Digits)\n", futln);
+ LOGP(DSIM7, LOGL_NOTICE, "Given FUTLN '%s' invalid length. (Must be 7 or 8 Digits)\n", futln);
return -EINVAL;
}
if (futln[0] < '0' || futln[0] > '7') {
- PDEBUG(DSIM7, DEBUG_NOTICE, "Given FUTLN '%s' has invalid first digit. (Must be '0' .. '7')\n", futln);
+ LOGP(DSIM7, LOGL_NOTICE, "Given FUTLN '%s' has invalid first digit. (Must be '0' .. '7')\n", futln);
return -EINVAL;
}
data[0] = (futln[0] - '0') << 5;
@@ -125,7 +124,7 @@ int encode_ebdt(uint8_t *data, const char *futln, const char *sicherung, const c
/* 8 digits */
temp = (futln[0] - '0') * 10 + (futln[1] - '0');
if (futln[0] < '0' || futln[0] > '9' || futln[1] < '0' || futln[1] > '9' || temp > 31) {
- PDEBUG(DSIM7, DEBUG_NOTICE, "Given FUTLN '%s' has invalid second and third digit. (Must be '00' .. '31')\n", futln);
+ LOGP(DSIM7, LOGL_NOTICE, "Given FUTLN '%s' has invalid second and third digit. (Must be '00' .. '31')\n", futln);
return -EINVAL;
}
data[0] |= temp;
@@ -133,7 +132,7 @@ int encode_ebdt(uint8_t *data, const char *futln, const char *sicherung, const c
} else {
/* 7 digits */
if (futln[0] < '0' || futln[0] > '9') {
- PDEBUG(DSIM7, DEBUG_NOTICE, "Given FUTLN '%s' has invalid second digit. (Must be '0' .. '9')\n", futln);
+ LOGP(DSIM7, LOGL_NOTICE, "Given FUTLN '%s' has invalid second digit. (Must be '0' .. '9')\n", futln);
return -EINVAL;
}
data[0] |= (futln[0] - '0');
@@ -143,9 +142,9 @@ int encode_ebdt(uint8_t *data, const char *futln, const char *sicherung, const c
if (futln[i] < '0' || futln[i] > '9')
break;
}
- temp = my_strtoul(futln, NULL, 0);
+ temp = my_strtoul(futln, NULL, 10);
if (i < 5 || temp > 65535) {
- PDEBUG(DSIM7, DEBUG_NOTICE, "Given FUTLN '%s' has invalid last digits. (Must be '00000' .. '65535')\n", futln);
+ LOGP(DSIM7, LOGL_NOTICE, "Given FUTLN '%s' has invalid last digits. (Must be '00000' .. '65535')\n", futln);
return -EINVAL;
}
data[1] = temp >> 8;
@@ -153,9 +152,9 @@ int encode_ebdt(uint8_t *data, const char *futln, const char *sicherung, const c
}
if (sicherung) {
- temp = my_strtoul(sicherung, NULL, 0);
+ temp = my_strtoul(sicherung, NULL, 10);
if (temp > 65535) {
- PDEBUG(DSIM7, DEBUG_NOTICE, "Given security code '%s' has invalid digits. (Must be '0' .. '65535')\n", sicherung);
+ LOGP(DSIM7, LOGL_NOTICE, "Given security code '%s' has invalid digits. (Must be '0' .. '65535')\n", sicherung);
return -EINVAL;
}
data[3] = temp >> 8;
@@ -163,18 +162,18 @@ int encode_ebdt(uint8_t *data, const char *futln, const char *sicherung, const c
}
if (karten) {
- temp = my_strtoul(karten, NULL, 0);
+ temp = my_strtoul(karten, NULL, 10);
if (temp > 7) {
- PDEBUG(DSIM7, DEBUG_NOTICE, "Given card number '%s' has invalid digit. (Must be '0' .. '7')\n", karten);
+ LOGP(DSIM7, LOGL_NOTICE, "Given card number '%s' has invalid digit. (Must be '0' .. '7')\n", karten);
return -EINVAL;
}
data[5] = (data[5] & 0x1f) | ((karten[0] - '0') << 5);
}
if (sonder) {
- temp = my_strtoul(sonder, NULL, 0);
+ temp = my_strtoul(sonder, NULL, 10);
if (temp > 8191) {
- PDEBUG(DSIM7, DEBUG_NOTICE, "Given spacial code '%s' has invalid digits. (Must be '0' .. '8191')\n", sonder);
+ LOGP(DSIM7, LOGL_NOTICE, "Given spacial code '%s' has invalid digits. (Must be '0' .. '8191')\n", sonder);
return -EINVAL;
}
data[5] = (data[5] & 0xe0) | (temp >> 8);
@@ -182,9 +181,9 @@ int encode_ebdt(uint8_t *data, const char *futln, const char *sicherung, const c
}
if (wartung) {
- temp = my_strtoul(wartung, NULL, 0);
+ temp = my_strtoul(wartung, NULL, 10);
if (temp > 65535) {
- PDEBUG(DSIM7, DEBUG_NOTICE, "Given maintenance code '%s' has invalid digits. (Must be '0' .. '65535')\n", wartung);
+ LOGP(DSIM7, LOGL_NOTICE, "Given maintenance code '%s' has invalid digits. (Must be '0' .. '65535')\n", wartung);
return -EINVAL;
}
data[7] = temp >> 8;
@@ -240,7 +239,7 @@ int save_directory(int location, uint8_t *data)
size = directory_size();
if (location < 1 || location >= size) {
- PDEBUG(DSIM7, DEBUG_NOTICE, "Given location for phone number '%d' is out of range. (Must be '01' .. '%02d')\n", location, size - 1);
+ LOGP(DSIM7, LOGL_NOTICE, "Given location for phone number '%d' is out of range. (Must be '01' .. '%02d')\n", location, size - 1);
return -EINVAL;
}
@@ -278,7 +277,7 @@ int encode_directory(uint8_t *data, const char *number, const char *name)
len = strlen(number);
if (len > 16) {
- PDEBUG(DSIM7, DEBUG_NOTICE, "Given phone number '%s' has too many digits. (Must be <= 16)\n", number);
+ LOGP(DSIM7, LOGL_NOTICE, "Given phone number '%s' has too many digits. (Must be <= 16)\n", number);
return -EINVAL;
}
@@ -286,7 +285,7 @@ int encode_directory(uint8_t *data, const char *number, const char *name)
memset(data + 8, ' ', 16);
for (i = 0; i < len; i++) {
if (number[i] < '0' || number[i] > '9') {
- PDEBUG(DSIM7, DEBUG_NOTICE, "Given phone number '%s' has illegal digits. (Must be '0' .. '9')\n", number);
+ LOGP(DSIM7, LOGL_NOTICE, "Given phone number '%s' has illegal digits. (Must be '0' .. '9')\n", number);
return -EINVAL;
}
pos = 16 - len + i;
@@ -370,7 +369,7 @@ static int validate_pin(sim_sim_t *sim, uint8_t *data, int length)
valid = 1;
if (data[3] > '0')
sim->card = data[3] - '1';
- PDEBUG(DSIM1, DEBUG_INFO, "System PIN '000%c' entered. Selecting card #%d.\n", data[3], sim->card + 1);
+ LOGP(DSIM1, LOGL_INFO, "System PIN '000%c' entered. Selecting card #%d.\n", data[3], sim->card + 1);
}
/* programming mode */
@@ -379,7 +378,7 @@ static int validate_pin(sim_sim_t *sim, uint8_t *data, int length)
valid = 1;
if (data[3] > '0')
sim->card = data[3] - '1';
- PDEBUG(DSIM1, DEBUG_INFO, "Configuration PIN '999%c' entered. Selecting card #%d in configuration mode.\n", data[3], sim->card + 1);
+ LOGP(DSIM1, LOGL_INFO, "Configuration PIN '999%c' entered. Selecting card #%d in configuration mode.\n", data[3], sim->card + 1);
}
/* if not 'program mode' and PIN matches EEPROM */
@@ -390,7 +389,7 @@ static int validate_pin(sim_sim_t *sim, uint8_t *data, int length)
}
if (i == length) {
valid = 1;
- PDEBUG(DSIM1, DEBUG_INFO, "Correct PIN was entered. Selecting card #%d.\n", sim->card + 1);
+ LOGP(DSIM1, LOGL_INFO, "Correct PIN was entered. Selecting card #%d.\n", sim->card + 1);
}
}
@@ -405,7 +404,7 @@ static int validate_pin(sim_sim_t *sim, uint8_t *data, int length)
sim->program_mode = 1;
return 0;
} else {
- PDEBUG(DSIM1, DEBUG_INFO, "Wrong PIN was entered.\n");
+ LOGP(DSIM1, LOGL_INFO, "Wrong PIN was entered.\n");
#ifndef ARDUINO
/* decrement error counter */
if (sim->pin_try) {
@@ -420,16 +419,16 @@ static int validate_pin(sim_sim_t *sim, uint8_t *data, int length)
/* message buffer handling */
/* get space for return message */
-uint8_t *alloc_msg(sim_sim_t *sim, int size)
+static uint8_t *alloc_msg(sim_sim_t *sim, int size)
{
/* we add 4, because we push 4 bytes (ICL and L2 header later) */
if (size + 4 > (int)sizeof(sim->block_tx_data))
- PDEBUG(DSIM1, DEBUG_NOTICE, "TX buffer overflow: size+4=%d > buffer size (%d)\n", size + 4, (int)sizeof(sim->block_tx_data));
+ LOGP(DSIM1, LOGL_NOTICE, "TX buffer overflow: size+4=%d > buffer size (%d)\n", size + 4, (int)sizeof(sim->block_tx_data));
return sim->block_tx_data;
}
/* push space in front of a message */
-uint8_t *push_msg(uint8_t *data, int length, int offset)
+static uint8_t *push_msg(uint8_t *data, int length, int offset)
{
int i;
@@ -463,7 +462,7 @@ static void sl_appl(sim_sim_t *sim, uint8_t *data, int length)
uint8_t app;
if (length < 11) {
- PDEBUG(DSIM7, DEBUG_NOTICE, "SL-APPL too short\n");
+ LOGP(DSIM7, LOGL_NOTICE, "SL-APPL too short\n");
return_error(sim);
return;
}
@@ -473,11 +472,11 @@ static void sl_appl(sim_sim_t *sim, uint8_t *data, int length)
app += (data[7] - '0') * 10;
app += data[8] - '0';
- PDEBUG(DSIM7, DEBUG_INFO, " SL-APPL app %d\n", app);
+ LOGP(DSIM7, LOGL_INFO, " SL-APPL app %d\n", app);
/* check and set application */
if (app != APP_NETZ_C && app != APP_RUFN_GEBZ) {
- PDEBUG(DSIM7, DEBUG_NOTICE, "SL-APPL invalid app %d\n", sim->app);
+ LOGP(DSIM7, LOGL_NOTICE, "SL-APPL invalid app %d\n", sim->app);
return_error(sim);
return;
}
@@ -499,7 +498,7 @@ static void cl_appl(sim_sim_t *sim)
{
uint8_t *data;
- PDEBUG(DSIM7, DEBUG_INFO, " CL-APPL\n");
+ LOGP(DSIM7, LOGL_INFO, " CL-APPL\n");
/* remove app */
sim->app = 0;
@@ -514,7 +513,7 @@ static void sh_appl(sim_sim_t *sim)
{
uint8_t *data;
- PDEBUG(DSIM7, DEBUG_INFO, " SH-APPL\n");
+ LOGP(DSIM7, LOGL_INFO, " SH-APPL\n");
/* respond */
data = alloc_msg(sim, 33);
@@ -546,7 +545,7 @@ static void chk_kon(sim_sim_t *sim)
{
uint8_t *data;
- PDEBUG(DSIM7, DEBUG_INFO, " CHK-KON\n");
+ LOGP(DSIM7, LOGL_INFO, " CHK-KON\n");
/* respond */
data = alloc_msg(sim, 0);
@@ -558,7 +557,7 @@ static void rd_ebdt(sim_sim_t *sim)
{
uint8_t *data;
- PDEBUG(DSIM7, DEBUG_INFO, " RD-EBDT\n");
+ LOGP(DSIM7, LOGL_INFO, " RD-EBDT\n");
/* respond */
data = alloc_msg(sim, 9);
@@ -594,12 +593,12 @@ static void rd_rufn(sim_sim_t *sim, uint8_t *data, int length)
int size;
if (length < 1) {
- PDEBUG(DSIM7, DEBUG_NOTICE, "RD_RUFN too short\n");
+ LOGP(DSIM7, LOGL_NOTICE, "RD_RUFN too short\n");
return_error(sim);
return;
}
- PDEBUG(DSIM7, DEBUG_INFO, " RD-RUFN (loc=%d)\n", rufn);
+ LOGP(DSIM7, LOGL_INFO, " RD-RUFN (loc=%d)\n", rufn);
/* SERVICE MODE */
if (sim->program_mode) {
@@ -610,8 +609,8 @@ static void rd_rufn(sim_sim_t *sim, uint8_t *data, int length)
switch (rufn) {
case 0: /* send bitmap for service mode */
memset(data, 0xff, 24);
- data[0] = 5; /* 5 entries */
- data[1] = 0x07; /* upper 5 bits = 0 */
+ data[0] = 6; /* 6 entries */
+ data[1] = 0x03; /* upper 6 bits = 0 */
break;
case 1: /* FUTLN */
data[0] = eeprom_read(EEPROM_FUTLN_H + sim->card);
@@ -619,34 +618,38 @@ static void rd_rufn(sim_sim_t *sim, uint8_t *data, int length)
data[2] = eeprom_read(EEPROM_FUTLN_L + sim->card);
decode_ebdt(data, number, NULL, NULL, NULL, NULL);
encode_directory(data, number, "FUTLN");
- PDEBUG(DSIM7, DEBUG_INFO, "service mode: FUTLN = %s\n", number);
+ LOGP(DSIM7, LOGL_INFO, "service mode: FUTLN = %s\n", number);
break;
case 2: /* security code */
data[3] = eeprom_read(EEPROM_SICH_H + sim->card);
data[4] = eeprom_read(EEPROM_SICH_L + sim->card);
decode_ebdt(data, NULL, number, NULL, NULL, NULL);
encode_directory(data, number, "Sicherungscode");
- PDEBUG(DSIM7, DEBUG_INFO, "service mode: security = %s\n", number);
+ LOGP(DSIM7, LOGL_INFO, "service mode: security = %s\n", number);
break;
case 3: /* card ID */
data[5] = eeprom_read(EEPROM_SONDER_H + sim->card);
decode_ebdt(data, NULL, NULL, number, NULL, NULL);
encode_directory(data, number, "Kartenkennung");
- PDEBUG(DSIM7, DEBUG_INFO, "service mode: card = %s\n", number);
+ LOGP(DSIM7, LOGL_INFO, "service mode: card = %s\n", number);
break;
case 4: /* special key */
data[5] = eeprom_read(EEPROM_SONDER_H + sim->card);
data[6] = eeprom_read(EEPROM_SONDER_L + sim->card);
decode_ebdt(data, NULL, NULL, NULL, number, NULL);
encode_directory(data, number, "Sonderheitsschl.");
- PDEBUG(DSIM7, DEBUG_INFO, "service mode: special = %s\n", number);
+ LOGP(DSIM7, LOGL_INFO, "service mode: special = %s\n", number);
break;
case 5: /* maintenance key */
data[7] = eeprom_read(EEPROM_WARTUNG_H + sim->card);
data[8] = eeprom_read(EEPROM_WARTUNG_L + sim->card);
decode_ebdt(data, NULL, NULL, NULL, NULL, number);
encode_directory(data, number, "Wartungsschl.");
- PDEBUG(DSIM7, DEBUG_INFO, "service mode: maintenance = %s\n", number);
+ LOGP(DSIM7, LOGL_INFO, "service mode: maintenance = %s\n", number);
+ break;
+ case 6: /* sim version */
+ encode_directory(data, SIM_VERSION, SIM_VERSION_NAME);
+ LOGP(DSIM7, LOGL_INFO, "service mode: display SIM version = %s\n", SIM_VERSION);
break;
}
tx_sdu(sim, 0, data, 24);
@@ -655,9 +658,9 @@ static void rd_rufn(sim_sim_t *sim, uint8_t *data, int length)
size = directory_size();
/* first entry (0) is used as allocation map */
- PDEBUG(DSIM7, DEBUG_INFO, " %d numbers can be stored in EEPROM\n", size - 1);
+ LOGP(DSIM7, LOGL_INFO, " %d numbers can be stored in EEPROM\n", size - 1);
if (rufn >= size) {
- PDEBUG(DSIM7, DEBUG_NOTICE, "RD_RUFN entry #%d out of range\n", rufn);
+ LOGP(DSIM7, LOGL_NOTICE, "RD_RUFN entry #%d out of range\n", rufn);
return_error(sim);
return;
}
@@ -674,12 +677,12 @@ static void wt_rufn(sim_sim_t *sim, uint8_t *data, int length)
uint8_t rufn = data[0];
if (length < 25) {
- PDEBUG(DSIM7, DEBUG_NOTICE, "WT_RUFN too short\n");
+ LOGP(DSIM7, LOGL_NOTICE, "WT_RUFN too short\n");
return_error(sim);
return;
}
- PDEBUG(DSIM7, DEBUG_INFO, " WT-RUFN (loc=%d)\n", rufn);
+ LOGP(DSIM7, LOGL_INFO, " WT-RUFN (loc=%d)\n", rufn);
/* SERVICE MODE */
if (sim->program_mode) {
@@ -692,7 +695,7 @@ static void wt_rufn(sim_sim_t *sim, uint8_t *data, int length)
goto respond;
switch (rufn) {
case 1: /* FUTLN */
- PDEBUG(DSIM7, DEBUG_INFO, "service mode: FUTLN = %s\n", number);
+ LOGP(DSIM7, LOGL_INFO, "service mode: FUTLN = %s\n", number);
rc = encode_ebdt(data, number, NULL, NULL, NULL, NULL);
if (rc < 0)
break;
@@ -701,7 +704,7 @@ static void wt_rufn(sim_sim_t *sim, uint8_t *data, int length)
eeprom_write(EEPROM_FUTLN_L + sim->card, data[2]);
break;
case 2: /* security code */
- PDEBUG(DSIM7, DEBUG_INFO, "service mode: security = %s\n", number);
+ LOGP(DSIM7, LOGL_INFO, "service mode: security = %s\n", number);
rc = encode_ebdt(data, NULL, number, NULL, NULL, NULL);
if (rc < 0)
break;
@@ -709,7 +712,7 @@ static void wt_rufn(sim_sim_t *sim, uint8_t *data, int length)
eeprom_write(EEPROM_SICH_L + sim->card, data[4]);
break;
case 3: /* card ID */
- PDEBUG(DSIM7, DEBUG_INFO, "service mode: card = %s\n", number);
+ LOGP(DSIM7, LOGL_INFO, "service mode: card = %s\n", number);
data[5] = eeprom_read(EEPROM_SONDER_H + sim->card);
rc = encode_ebdt(data, NULL, NULL, number, NULL, NULL);
if (rc < 0)
@@ -717,7 +720,7 @@ static void wt_rufn(sim_sim_t *sim, uint8_t *data, int length)
eeprom_write(EEPROM_SONDER_H + sim->card, data[5]);
break;
case 4: /* special key */
- PDEBUG(DSIM7, DEBUG_INFO, "service mode: special = %s\n", number);
+ LOGP(DSIM7, LOGL_INFO, "service mode: special = %s\n", number);
data[5] = eeprom_read(EEPROM_SONDER_H + sim->card);
rc = encode_ebdt(data, NULL, NULL, NULL, number, NULL);
if (rc < 0)
@@ -726,7 +729,7 @@ static void wt_rufn(sim_sim_t *sim, uint8_t *data, int length)
eeprom_write(EEPROM_SONDER_L + sim->card, data[6]);
break;
case 5: /* maintenance key */
- PDEBUG(DSIM7, DEBUG_INFO, "service mode: maintenance = %s\n", number);
+ LOGP(DSIM7, LOGL_INFO, "service mode: maintenance = %s\n", number);
rc = encode_ebdt(data, NULL, NULL, NULL, NULL, number);
if (rc < 0)
break;
@@ -739,7 +742,7 @@ static void wt_rufn(sim_sim_t *sim, uint8_t *data, int length)
}
if (rufn >= directory_size() || rufn < 1) {
- PDEBUG(DSIM7, DEBUG_NOTICE, "WT_RUFN entry #%d out of range\n", rufn);
+ LOGP(DSIM7, LOGL_NOTICE, "WT_RUFN entry #%d out of range\n", rufn);
return_error(sim);
return;
}
@@ -757,10 +760,10 @@ static void chk_pin(sim_sim_t *sim, uint8_t *data, int length)
{
int rc;
- PDEBUG(DSIM7, DEBUG_INFO, " CHK-PIN\n");
+ LOGP(DSIM7, LOGL_INFO, " CHK-PIN\n");
if (length < 4 || length > 8) {
- PDEBUG(DSIM7, DEBUG_NOTICE, "SET-PIN wrong length: %d\n", length);
+ LOGP(DSIM7, LOGL_NOTICE, "SET-PIN wrong length: %d\n", length);
return_error(sim);
return;
}
@@ -785,10 +788,10 @@ static void set_pin(sim_sim_t *sim, uint8_t *data, int length)
int i;
int rc;
- PDEBUG(DSIM7, DEBUG_INFO, " SET-PIN\n");
+ LOGP(DSIM7, LOGL_INFO, " SET-PIN\n");
if (length < 1) {
- PDEBUG(DSIM7, DEBUG_NOTICE, "SET-PIN too short\n");
+ LOGP(DSIM7, LOGL_NOTICE, "SET-PIN too short\n");
return_error(sim);
return;
}
@@ -798,7 +801,7 @@ static void set_pin(sim_sim_t *sim, uint8_t *data, int length)
len_new = length - len_old - 1;
pin_new = data + 1 + len_old;
if (len_new < 4 || len_new > 8) {
- PDEBUG(DSIM7, DEBUG_NOTICE, "New PIN wrong length %d!\n", len_new);
+ LOGP(DSIM7, LOGL_NOTICE, "New PIN wrong length %d!\n", len_new);
return_error(sim);
return;
}
@@ -826,10 +829,10 @@ static void eh_gebz(sim_sim_t *sim, uint8_t *data, int length)
{
uint32_t gebz;
- PDEBUG(DSIM7, DEBUG_INFO, " EH-GEBZ\n");
+ LOGP(DSIM7, LOGL_INFO, " EH-GEBZ\n");
if (length < 1) {
- PDEBUG(DSIM7, DEBUG_NOTICE, "EH-GEBZ wrong length: %d\n", length);
+ LOGP(DSIM7, LOGL_NOTICE, "EH-GEBZ wrong length: %d\n", length);
return_error(sim);
return;
}
@@ -853,7 +856,7 @@ static void cl_gebz(sim_sim_t *sim)
{
uint8_t *data;
- PDEBUG(DSIM7, DEBUG_INFO, " CL-GEBZ\n");
+ LOGP(DSIM7, LOGL_INFO, " CL-GEBZ\n");
/* clear counter */
eeprom_write(EEPROM_GEBZ_H, 0);
@@ -870,7 +873,7 @@ static void rd_gebz(sim_sim_t *sim)
{
uint8_t *data;
- PDEBUG(DSIM7, DEBUG_INFO, " RD-GEBZ\n");
+ LOGP(DSIM7, LOGL_INFO, " RD-GEBZ\n");
/* respond */
data = alloc_msg(sim, 3);
@@ -885,7 +888,7 @@ static void sp_gzrv(sim_sim_t *sim)
{
uint8_t *data;
- PDEBUG(DSIM7, DEBUG_INFO, " SP-GZRV\n");
+ LOGP(DSIM7, LOGL_INFO, " SP-GZRV\n");
sim->gebz_locked = 1;
write_flags(sim);
@@ -900,7 +903,7 @@ static void fr_gzrv(sim_sim_t *sim)
{
uint8_t *data;
- PDEBUG(DSIM7, DEBUG_INFO, " FR-GZRV\n");
+ LOGP(DSIM7, LOGL_INFO, " FR-GZRV\n");
sim->gebz_locked = 0;
write_flags(sim);
@@ -916,7 +919,7 @@ static void aut_1(sim_sim_t *sim)
uint8_t *data;
int i;
- PDEBUG(DSIM7, DEBUG_INFO, " AUTH-1\n");
+ LOGP(DSIM7, LOGL_INFO, " AUTH-1\n");
/* respond */
data = alloc_msg(sim, 1);
@@ -930,7 +933,7 @@ static void rd_f4(sim_sim_t *sim)
{
uint8_t *data;
- PDEBUG(DSIM7, DEBUG_INFO, " RD-F4\n");
+ LOGP(DSIM7, LOGL_INFO, " RD-F4\n");
/* respond */
data = alloc_msg(sim, 2);
@@ -944,7 +947,7 @@ static void rd_f5(sim_sim_t *sim)
{
uint8_t *data;
- PDEBUG(DSIM7, DEBUG_INFO, " RD-F5\n");
+ LOGP(DSIM7, LOGL_INFO, " RD-F5\n");
/* respond */
data = alloc_msg(sim, 0);
@@ -956,7 +959,7 @@ static void rd_04(sim_sim_t *sim)
{
uint8_t *data;
- PDEBUG(DSIM7, DEBUG_INFO, " RD-04\n");
+ LOGP(DSIM7, LOGL_INFO, " RD-04\n");
/* respond */
data = alloc_msg(sim, 25);
@@ -971,13 +974,13 @@ static void rx_sdu(sim_sim_t *sim, uint8_t *data, int length)
uint8_t cla, ins, dlng;
if (length < 3) {
- PDEBUG(DSIM7, DEBUG_NOTICE, "SDU too short\n");
+ LOGP(DSIM7, LOGL_NOTICE, "SDU too short\n");
return;
}
/* skip all responses, because we don't send commands */
if (*data & CCRC_IDENT) {
- PDEBUG(DSIM7, DEBUG_NOTICE, "Skipping SDU with response\n");
+ LOGP(DSIM7, LOGL_NOTICE, "Skipping SDU with response\n");
return;
}
@@ -989,7 +992,7 @@ static void rx_sdu(sim_sim_t *sim, uint8_t *data, int length)
/* check length */
if (dlng != length) {
- PDEBUG(DSIM7, DEBUG_NOTICE, "Skipping SDU with invalid length\n");
+ LOGP(DSIM7, LOGL_NOTICE, "Skipping SDU with invalid length\n");
return;
}
@@ -1044,7 +1047,7 @@ static void rx_sdu(sim_sim_t *sim, uint8_t *data, int length)
}
/* unsupported message */
- PDEBUG(DSIM7, DEBUG_NOTICE, "CLA 0x%02x INS 0x%02x unknown\n", cla, ins);
+ LOGP(DSIM7, LOGL_NOTICE, "CLA 0x%02x INS 0x%02x unknown\n", cla, ins);
data = alloc_msg(sim, 0);
tx_sdu(sim, CCRC_ERROR, data, 0);
}
@@ -1075,7 +1078,7 @@ static void rx_pdu(sim_sim_t *sim, uint8_t *data, int length)
if (length < 1) {
too_short:
- PDEBUG(DSIMI, DEBUG_NOTICE, "PDU too short\n");
+ LOGP(DSIMI, LOGL_NOTICE, "PDU too short\n");
return;
}
@@ -1125,24 +1128,24 @@ static void rx_block(sim_sim_t *sim)
/* NOTE: This procedure is simplified, it does not comply with the specs. */
- PDEBUG(DSIM2, DEBUG_INFO, "RX message\n");
+ LOGP(DSIM2, LOGL_INFO, "RX message\n");
sim->addr_src = sim->block_address >> 4;
sim->addr_dst = sim->block_address & 0xf;
if (sim->block_checksum != 0) {
- PDEBUG(DSIM2, DEBUG_NOTICE, "Checksum error!\n");
+ LOGP(DSIM2, LOGL_NOTICE, "Checksum error!\n");
goto reject;
}
if ((sim->block_control & 0x11) == 0x00) {
ns = (sim->block_control >> 1) & 7;
nr = sim->block_control >> 5;
- PDEBUG(DSIM2, DEBUG_INFO, " control I: N(S)=%d N(R)=%d\n", ns, nr);
+ LOGP(DSIM2, LOGL_INFO, " control I: N(S)=%d N(R)=%d\n", ns, nr);
if (ns == sim->vr && nr == sim->vs) {
/* receive data */
sim->vr = (sim->vr + 1) & 0x7;
rx_pdu(sim, sim->block_rx_data, sim->block_rx_length);
return;
} else {
- PDEBUG(DSIM2, DEBUG_NOTICE, "Seqeuence error!\n");
+ LOGP(DSIM2, LOGL_NOTICE, "Seqeuence error!\n");
reject:
/* reject (or send resync after 3 times) */
data = alloc_msg(sim, 0);
@@ -1158,7 +1161,7 @@ reject:
}
if ((sim->block_control & 0x1f) == 0x09) {
nr = sim->block_control >> 5;
- PDEBUG(DSIM2, DEBUG_INFO, " control REJ: N(R)=%d\n", nr);
+ LOGP(DSIM2, LOGL_INFO, " control REJ: N(R)=%d\n", nr);
/* repeat last message */
if (sim->block_tx_length) {
tx_block(sim, L2_I, sim->block_tx_data, sim->block_tx_length);
@@ -1170,7 +1173,7 @@ reject:
return;
}
if (sim->block_control == 0xef) {
- PDEBUG(DSIM2, DEBUG_INFO, " control RES\n");
+ LOGP(DSIM2, LOGL_INFO, " control RES\n");
sim->vr = sim->vs = 0;
sim->reject_count = 0;
if (sim->resync_sent == 0) {
@@ -1201,7 +1204,7 @@ static int rx_char(sim_sim_t *sim, uint8_t c)
case BLOCK_STATE_LENGTH:
if (c > sizeof(sim->block_rx_data)) {
c = sizeof(sim->block_rx_data);
- PDEBUG(DSIM1, DEBUG_NOTICE, "RX buffer overflow: length=%d > buffer size (%d)\n", c, (int)sizeof(sim->block_rx_data));
+ LOGP(DSIM1, LOGL_NOTICE, "RX buffer overflow: length=%d > buffer size (%d)\n", c, (int)sizeof(sim->block_rx_data));
}
sim->block_rx_length = c;
sim->block_count = 0;
@@ -1212,8 +1215,11 @@ static int rx_char(sim_sim_t *sim, uint8_t c)
sim->block_rx_data[sim->block_count++] = c;
return 0;
}
- sim->l1_state = L1_STATE_IDLE;
- rx_block(sim);
+ sim->l1_state = L1_STATE_COMPLETE;
+ /* Waiting for timeout, then process the received PDU.
+ * This way we detect garbage after the message.
+ * Also we wait for the card reader to release the I/O line. (22 bit durations minimum) */
+ return 0;
}
return -1;
@@ -1222,24 +1228,24 @@ static int rx_char(sim_sim_t *sim, uint8_t c)
/* create layer 2 message for layer 1 */
static void tx_block(sim_sim_t *sim, enum l2_cmd cmd, uint8_t __attribute__((unused)) *data, int length)
{
- PDEBUG(DSIM2, DEBUG_INFO, "TX response\n");
+ LOGP(DSIM2, LOGL_INFO, "TX response\n");
/* header */
sim->block_address = (sim->addr_dst << 4) | sim->addr_src;
switch (cmd) {
case L2_I:
- PDEBUG(DSIM2, DEBUG_INFO, " control I: N(S)=%d N(R)=%d\n", sim->vs, sim->vr);
+ LOGP(DSIM2, LOGL_INFO, " control I: N(S)=%d N(R)=%d\n", sim->vs, sim->vr);
sim->block_control = (sim->vr << 5) | (sim->vs << 1);
sim->vs = (sim->vs + 1) & 0x7;
sim->resync_sent = 0;
break;
case L2_REJ:
- PDEBUG(DSIM2, DEBUG_INFO, " control REJ: N(R)=%d\n", sim->vr);
+ LOGP(DSIM2, LOGL_INFO, " control REJ: N(R)=%d\n", sim->vr);
sim->block_control = (sim->vr << 5) | 0x09;
sim->resync_sent = 0;
break;
case L2_RES:
- PDEBUG(DSIM2, DEBUG_INFO, " control RES\n");
+ LOGP(DSIM2, LOGL_INFO, " control RES\n");
sim->block_control = 0xef;
sim->resync_sent = 1;
break;
@@ -1313,6 +1319,7 @@ static uint8_t tx_atr(sim_sim_t *sim)
int sim_init_eeprom(void)
{
uint8_t ebdt_data[9];
+ uint8_t dir_data[24];
int i, rc;
/* init EEPROM with all bits '1' */
@@ -1343,6 +1350,14 @@ int sim_init_eeprom(void)
for (i = 0; i < 8; i++)
eeprom_write(EEPROM_AUTH_DATA + i, AUTH_DEFAULT >> ((7 - i) * 8));
+ /* store version number to phone book entry 1 */
+ encode_directory(dir_data, SIM_VERSION, SIM_VERSION_NAME);
+ save_directory(1, dir_data);
+
+ /* store Jolly's phone number to phone book entry 2 */
+ encode_directory(dir_data, JOLLY_PHONE, JOLLY_NAME);
+ save_directory(2, dir_data);
+
/* now write magic characters to identify virgin or initialized EEPROM */
eeprom_write(EEPROM_MAGIC + 0, 'C');
eeprom_write(EEPROM_MAGIC + 1, '0' + EEPROM_VERSION);
@@ -1355,7 +1370,7 @@ void sim_reset(sim_sim_t *sim, int reset)
int i;
char pin[8];
- PDEBUG(DSIM1, DEBUG_INFO, "Reset signal %s\n", (reset) ? "on (low)" : "off (high)");
+ LOGP(DSIM1, LOGL_INFO, "Reset signal %s\n", (reset) ? "on (low)" : "off (high)");
memset(sim, 0, sizeof(*sim));
if (reset)
@@ -1374,10 +1389,10 @@ void sim_reset(sim_sim_t *sim, int reset)
sim->pin_required = 0;
if (pin[3] > '0')
sim->card = pin[3] - '1';
- PDEBUG(DSIM1, DEBUG_INFO, "Card has disabled PIN (system PIN '000%c') Selecting card #%d.\n", pin[3], sim->card + 1);
+ LOGP(DSIM1, LOGL_INFO, "Card has disabled PIN (system PIN '000%c') Selecting card #%d.\n", pin[3], sim->card + 1);
}
- PDEBUG(DSIM1, DEBUG_INFO, "Sending ATR\n");
+ LOGP(DSIM1, LOGL_INFO, "Sending ATR\n");
sim->l1_state = L1_STATE_ATR;
}
@@ -1385,7 +1400,7 @@ int sim_rx(sim_sim_t *sim, uint8_t c)
{
int rc = -1;
- PDEBUG(DSIM1, DEBUG_DEBUG, "Serial RX '0x%02x'\n", c);
+ LOGP(DSIM1, LOGL_DEBUG, "Serial RX '0x%02x'\n", c);
switch (sim->l1_state) {
case L1_STATE_IDLE:
@@ -1395,6 +1410,9 @@ int sim_rx(sim_sim_t *sim, uint8_t c)
case L1_STATE_RECEIVE:
rc = rx_char(sim, c);
break;
+ case L1_STATE_COMPLETE:
+ LOGP(DSIM1, LOGL_NOTICE, "Received garbage after message!\n");
+ sim->l1_state = L1_STATE_GARBAGE;
default:
break;
}
@@ -1418,7 +1436,7 @@ int sim_tx(sim_sim_t *sim)
}
if (c >= 0)
- PDEBUG(DSIM1, DEBUG_DEBUG, "Serial TX '0x%02x'\n", c);
+ LOGP(DSIM1, LOGL_DEBUG, "Serial TX '0x%02x'\n", c);
return c;
}
@@ -1427,17 +1445,26 @@ void sim_timeout(sim_sim_t *sim)
{
switch (sim->l1_state) {
case L1_STATE_ATR:
- PDEBUG(DSIM1, DEBUG_NOTICE, "Timeout while transmitting ATR!\n");
+ LOGP(DSIM1, LOGL_NOTICE, "Timeout while transmitting ATR!\n");
sim->l1_state = L1_STATE_RESET;
break;
case L1_STATE_RECEIVE:
- PDEBUG(DSIM1, DEBUG_NOTICE, "Timeout while receiving message!\n");
+ LOGP(DSIM1, LOGL_NOTICE, "Timeout while receiving message!\n");
sim->block_state = BLOCK_STATE_ADDRESS;
break;
+ case L1_STATE_GARBAGE:
+ LOGP(DSIM1, LOGL_NOTICE, "Timeout after skipping garbage!\n");
+ sim->l1_state = L1_STATE_IDLE;
+ break;
case L1_STATE_SEND:
- PDEBUG(DSIM1, DEBUG_NOTICE, "Timeout while sending message!\n");
+ LOGP(DSIM1, LOGL_NOTICE, "Timeout while sending message!\n");
sim->l1_state = L1_STATE_IDLE;
break;
+ case L1_STATE_COMPLETE:
+ /* We did not receive garbage after message, so we process it now. */
+ sim->l1_state = L1_STATE_IDLE;
+ rx_block(sim);
+ break;
default:
break;
}
diff --git a/src/sim/sim.h b/src/sim/sim.h
index 3b11552..e21bab1 100644
--- a/src/sim/sim.h
+++ b/src/sim/sim.h
@@ -1,4 +1,8 @@
+#define SIM_VERSION_NAME "TelecardVersion"
+#define SIM_VERSION "3"
+#define JOLLY_NAME "Jolly"
+#define JOLLY_PHONE "04644973171"
#define FUTLN_DEFAULT "2222001"
#define SICHERUNG_DEFAULT "3103"
#define KARTEN_DEFAULT "3"
@@ -13,6 +17,8 @@ enum l1_state {
L1_STATE_IDLE, /* waiting for message or reset */
L1_STATE_SEND, /* sending reply */
L1_STATE_RECEIVE, /* receiving message */
+ L1_STATE_COMPLETE, /* received message complete, waiting for card reader to release */
+ L1_STATE_GARBAGE, /* received garbage right after frame, waiting for timeout */
};
enum block_state {
@@ -133,6 +139,9 @@ enum l2_cmd {
#define APP_NETZ_C 3
#define APP_RUFN_GEBZ 4
+/* defined for main.c */
+size_t eeprom_length(void);
+
int encode_ebdt(uint8_t *data, const char *futln, const char *sicherung, const char *karten, const char *sonder, const char *wartung);
void decode_ebdt(uint8_t *data, char *futln, char *sicherung, char *karten, char *sonder, char *wartung);
int directory_size(void);
diff --git a/src/sim/sim.ino b/src/sim/sim.ino
index 00b2de0..f8925e0 100644
--- a/src/sim/sim.ino
+++ b/src/sim/sim.ino
@@ -1,4 +1,4 @@
-/* SIM card for ATMEL
+ /* SIM card for ATMEL
*
* (C) 2020 by Andreas Eversberg <jolly@eversberg.eu>
* All Rights Reserved
@@ -27,14 +27,14 @@ extern "C"
#if defined(__AVR_ATtiny85__)
#define SERIAL_DATA 4
#define SERIAL_DELAY 124
-#define SERIAL_TIMEOUT 1200 /* > two bytes */
+#define SERIAL_TIMEOUT 800 /* > more than two bytes */
#else
/* settings for Arduino UNO with 16 MHz */
#define STATUS_LED LED_BUILTIN
#define RESET_PIN 6
#define SERIAL_DATA 7
#define SERIAL_DELAY 410
-#define SERIAL_TIMEOUT 2500 /* > two bytes */
+#define SERIAL_TIMEOUT 1600 /* > more than two bytes */
#endif
/* to set fused for ATTINY85:
* avrdude -c usbasp-clone -p t85 -U lfuse:w:0xc0:m -U hfuse:w:0xdf:m -U efuse:w:0xff:m
diff --git a/src/sim/sniffer.c b/src/sim/sniffer.c
index 34a2e4c..89684aa 100644
--- a/src/sim/sniffer.c
+++ b/src/sim/sniffer.c
@@ -22,7 +22,7 @@
#include <stdio.h>
#include <string.h>
#include <stdint.h>
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "sim.h"
#include "sniffer.h"
@@ -37,7 +37,7 @@ static void rx_icl_sdu(uint8_t *data, int length)
int i;
if (length < 3) {
- PDEBUG(DSIM7, DEBUG_NOTICE, "Message too short\n");
+ LOGP(DSIM7, LOGL_NOTICE, "Message too short\n");
return;
}
@@ -47,146 +47,146 @@ static void rx_icl_sdu(uint8_t *data, int length)
dlng = *data++;
length -= 3;
- PDEBUG(DSIM7, DEBUG_INFO, "Layer 7:\n");
+ LOGP(DSIM7, LOGL_INFO, "Layer 7:\n");
if (I == 0) {
- PDEBUG(DSIM7, DEBUG_INFO, " I = Command\n");
- PDEBUG(DSIM7, DEBUG_INFO, " CLA = 0x%02x\n", cla_ccrc);
+ LOGP(DSIM7, LOGL_INFO, " I = Command\n");
+ LOGP(DSIM7, LOGL_INFO, " CLA = 0x%02x\n", cla_ccrc);
switch (cla_ccrc) {
case CLA_CNTR:
- PDEBUG(DSIM7, DEBUG_INFO, " -> CNTR (Control Class)\n");
+ LOGP(DSIM7, LOGL_INFO, " -> CNTR (Control Class)\n");
break;
case CLA_STAT:
- PDEBUG(DSIM7, DEBUG_INFO, " -> STAT (Status Class)\n");
+ LOGP(DSIM7, LOGL_INFO, " -> STAT (Status Class)\n");
break;
case CLA_WRTE:
- PDEBUG(DSIM7, DEBUG_INFO, " -> WRTE (Write Class)\n");
+ LOGP(DSIM7, LOGL_INFO, " -> WRTE (Write Class)\n");
break;
case CLA_READ:
- PDEBUG(DSIM7, DEBUG_INFO, " -> READ (Read Class)\n");
+ LOGP(DSIM7, LOGL_INFO, " -> READ (Read Class)\n");
break;
case CLA_EXEC:
- PDEBUG(DSIM7, DEBUG_INFO, " -> EXEC (Execute Class)\n");
+ LOGP(DSIM7, LOGL_INFO, " -> EXEC (Execute Class)\n");
break;
case CLA_AUTO:
- PDEBUG(DSIM7, DEBUG_INFO, " -> AUTO (Authentication Class)\n");
+ LOGP(DSIM7, LOGL_INFO, " -> AUTO (Authentication Class)\n");
break;
default:
- PDEBUG(DSIM7, DEBUG_INFO, " -> unknown class\n");
+ LOGP(DSIM7, LOGL_INFO, " -> unknown class\n");
break;
}
- PDEBUG(DSIM7, DEBUG_INFO, " INS = 0x%02x\n", ins_aprc);
+ LOGP(DSIM7, LOGL_INFO, " INS = 0x%02x\n", ins_aprc);
switch (cla_ccrc) {
case CLA_CNTR:
switch (ins_aprc) {
case SL_APPL:
- PDEBUG(DSIM7, DEBUG_INFO, " -> SL-APPL (Select Application)\n");
+ LOGP(DSIM7, LOGL_INFO, " -> SL-APPL (Select Application)\n");
break;
case CL_APPL:
- PDEBUG(DSIM7, DEBUG_INFO, " -> CL-APPL (Close Application)\n");
+ LOGP(DSIM7, LOGL_INFO, " -> CL-APPL (Close Application)\n");
break;
case SH_APPL:
- PDEBUG(DSIM7, DEBUG_INFO, " -> SH-APPL (Show Application)\n");
+ LOGP(DSIM7, LOGL_INFO, " -> SH-APPL (Show Application)\n");
break;
}
break;
case CLA_STAT:
switch (ins_aprc) {
case CHK_KON:
- PDEBUG(DSIM7, DEBUG_INFO, " -> CHK-KCON (Consistency Check)\n");
+ LOGP(DSIM7, LOGL_INFO, " -> CHK-KCON (Consistency Check)\n");
break;
}
break;
case CLA_WRTE:
switch (ins_aprc) {
case WT_RUFN:
- PDEBUG(DSIM7, DEBUG_INFO, " -> WR-RUFN (Write Rufnummernsatz)\n");
+ LOGP(DSIM7, LOGL_INFO, " -> WR-RUFN (Write Rufnummernsatz)\n");
break;
}
break;
case CLA_READ:
switch (ins_aprc) {
case RD_EBDT:
- PDEBUG(DSIM7, DEBUG_INFO, " -> RD-EBDT (Read Einbuchdaten)\n");
+ LOGP(DSIM7, LOGL_INFO, " -> RD-EBDT (Read Einbuchdaten)\n");
break;
case RD_RUFN:
- PDEBUG(DSIM7, DEBUG_INFO, " -> RD-RUFN (Read Rufnummernsatz)\n");
+ LOGP(DSIM7, LOGL_INFO, " -> RD-RUFN (Read Rufnummernsatz)\n");
break;
case RD_GEBZ:
- PDEBUG(DSIM7, DEBUG_INFO, " -> RD-GEBZ (Read Gebuehrenzaehler)\n");
+ LOGP(DSIM7, LOGL_INFO, " -> RD-GEBZ (Read Gebuehrenzaehler)\n");
break;
}
break;
case CLA_EXEC:
switch (ins_aprc) {
case CHK_PIN:
- PDEBUG(DSIM7, DEBUG_INFO, " -> CHK-PIN (Check PIN)\n");
+ LOGP(DSIM7, LOGL_INFO, " -> CHK-PIN (Check PIN)\n");
break;
case SET_PIN:
- PDEBUG(DSIM7, DEBUG_INFO, " -> SET-PIN (Set PIN)\n");
+ LOGP(DSIM7, LOGL_INFO, " -> SET-PIN (Set PIN)\n");
break;
case EH_GEBZ:
- PDEBUG(DSIM7, DEBUG_INFO, " -> EH-GEBZ (Increment Gebuehrenzaehler)\n");
+ LOGP(DSIM7, LOGL_INFO, " -> EH-GEBZ (Increment Gebuehrenzaehler)\n");
break;
case CL_GEBZ:
- PDEBUG(DSIM7, DEBUG_INFO, " -> CL-GEBZ (Clear Gebuehrenzaehler)\n");
+ LOGP(DSIM7, LOGL_INFO, " -> CL-GEBZ (Clear Gebuehrenzaehler)\n");
break;
}
break;
case CLA_AUTO:
switch (ins_aprc) {
case AUT_1:
- PDEBUG(DSIM7, DEBUG_INFO, " -> AUTO-1 (Authorization)\n");
+ LOGP(DSIM7, LOGL_INFO, " -> AUTO-1 (Authorization)\n");
break;
}
break;
}
} else {
- PDEBUG(DSIM7, DEBUG_INFO, " I = Response\n");
- PDEBUG(DSIM7, DEBUG_INFO, " CCRC = 0x%02x\n", cla_ccrc);
+ LOGP(DSIM7, LOGL_INFO, " I = Response\n");
+ LOGP(DSIM7, LOGL_INFO, " CCRC = 0x%02x\n", cla_ccrc);
if (cla_ccrc & CCRC_PIN_NOK)
- PDEBUG(DSIM7, DEBUG_INFO, " -> PIN-NOT-OK\n");
+ LOGP(DSIM7, LOGL_INFO, " -> PIN-NOT-OK\n");
if (cla_ccrc & CCRC_AFBZ_NULL)
- PDEBUG(DSIM7, DEBUG_INFO, " -> AFBZ = NULL\n");
+ LOGP(DSIM7, LOGL_INFO, " -> AFBZ = NULL\n");
if (cla_ccrc & CCRC_APRC_VALID)
- PDEBUG(DSIM7, DEBUG_INFO, " -> APRC valid\n");
+ LOGP(DSIM7, LOGL_INFO, " -> APRC valid\n");
if (cla_ccrc & 0x08)
- PDEBUG(DSIM7, DEBUG_INFO, " -> reserved\n");
+ LOGP(DSIM7, LOGL_INFO, " -> reserved\n");
if (cla_ccrc & 0x10)
- PDEBUG(DSIM7, DEBUG_INFO, " -> reserved\n");
+ LOGP(DSIM7, LOGL_INFO, " -> reserved\n");
if (cla_ccrc & 0x20)
- PDEBUG(DSIM7, DEBUG_INFO, " -> reserved\n");
+ LOGP(DSIM7, LOGL_INFO, " -> reserved\n");
if (cla_ccrc & CCRC_ERROR)
- PDEBUG(DSIM7, DEBUG_INFO, " -> GENERAL ERROR\n");
- PDEBUG(DSIM7, DEBUG_INFO, " APRC = 0x%02x\n", ins_aprc);
+ LOGP(DSIM7, LOGL_INFO, " -> GENERAL ERROR\n");
+ LOGP(DSIM7, LOGL_INFO, " APRC = 0x%02x\n", ins_aprc);
if (ins_aprc & APRC_PIN_REQ)
- PDEBUG(DSIM7, DEBUG_INFO, " -> Bit 2 = 1:PIN-Check required\n");
+ LOGP(DSIM7, LOGL_INFO, " -> Bit 2 = 1:PIN-Check required\n");
else
- PDEBUG(DSIM7, DEBUG_INFO, " -> Bit 2 = 0:PIN-Check not required\n");
+ LOGP(DSIM7, LOGL_INFO, " -> Bit 2 = 0:PIN-Check not required\n");
if (ins_aprc & APRC_APP_LOCKED)
- PDEBUG(DSIM7, DEBUG_INFO, " -> Bit 3 = 1:Application locked\n");
+ LOGP(DSIM7, LOGL_INFO, " -> Bit 3 = 1:Application locked\n");
else
- PDEBUG(DSIM7, DEBUG_INFO, " -> Bit 3 = 0:Application unlocked\n");
+ LOGP(DSIM7, LOGL_INFO, " -> Bit 3 = 0:Application unlocked\n");
if (ins_aprc & APRC_GEBZ_LOCK)
- PDEBUG(DSIM7, DEBUG_INFO, " -> Bit 5 = 1:GEBZ/RUFN locked\n");
+ LOGP(DSIM7, LOGL_INFO, " -> Bit 5 = 1:GEBZ/RUFN locked\n");
else
- PDEBUG(DSIM7, DEBUG_INFO, " -> Bit 5 = 0:GEBZ/RUFN unlocked\n");
+ LOGP(DSIM7, LOGL_INFO, " -> Bit 5 = 0:GEBZ/RUFN unlocked\n");
if (ins_aprc & APRC_GEBZ_FULL)
- PDEBUG(DSIM7, DEBUG_INFO, " -> Bit 6 = 1:GEBZ full\n");
+ LOGP(DSIM7, LOGL_INFO, " -> Bit 6 = 1:GEBZ full\n");
else
- PDEBUG(DSIM7, DEBUG_INFO, " -> Bit 6 = 0:GEBZ not full\n");
+ LOGP(DSIM7, LOGL_INFO, " -> Bit 6 = 0:GEBZ not full\n");
}
if (dlng == 255) {
- PDEBUG(DSIM7, DEBUG_NOTICE, " Unsupported length 255!\n");
+ LOGP(DSIM7, LOGL_NOTICE, " Unsupported length 255!\n");
return;
}
- PDEBUG(DSIM7, DEBUG_INFO, " DLNG = %d\n", dlng);
+ LOGP(DSIM7, LOGL_INFO, " DLNG = %d\n", dlng);
if (dlng != length) {
- PDEBUG(DSIM7, DEBUG_NOTICE, " DLNG does not match message body!\n");
+ LOGP(DSIM7, LOGL_NOTICE, " DLNG does not match message body!\n");
return;
}
for (i = 0; i < length; i++) {
- PDEBUG(DSIM7, DEBUG_INFO, " DATA(%d) = 0x%02x '%c' %d\n", i, data[i], (data[i] >= 32 && data[i] <= 126) ? data[i] : '.', data[i]);
+ LOGP(DSIM7, LOGL_INFO, " DATA(%d) = 0x%02x '%c' %d\n", i, data[i], (data[i] >= 32 && data[i] <= 126) ? data[i] : '.', data[i]);
}
}
@@ -198,43 +198,43 @@ static void rx_icl_pdu(uint8_t *data, int length)
if (ext) {
if (length < 1) {
- PDEBUG(DSIMI, DEBUG_NOTICE, "Message too short\n");
+ LOGP(DSIMI, LOGL_NOTICE, "Message too short\n");
return;
}
- PDEBUG(DSIMI, DEBUG_INFO, "Interface control layer ICB1:\n");
+ LOGP(DSIMI, LOGL_INFO, "Interface control layer ICB1:\n");
if (*data & ICB1_ONLINE)
- PDEBUG(DSIMI, DEBUG_INFO, " ON-LINE-BIT: 1 = On-line data\n");
+ LOGP(DSIMI, LOGL_INFO, " ON-LINE-BIT: 1 = On-line data\n");
else
- PDEBUG(DSIMI, DEBUG_INFO, " ON-LINE-BIT: 0 = Off-line data\n");
+ LOGP(DSIMI, LOGL_INFO, " ON-LINE-BIT: 0 = Off-line data\n");
if (*data & ICB1_CONFIRM)
- PDEBUG(DSIMI, DEBUG_INFO, " CONFIRM-BIT: 1 = Confirmation\n");
+ LOGP(DSIMI, LOGL_INFO, " CONFIRM-BIT: 1 = Confirmation\n");
else
- PDEBUG(DSIMI, DEBUG_INFO, " CONFIRM-BIT: 0 = No meaning\n");
+ LOGP(DSIMI, LOGL_INFO, " CONFIRM-BIT: 0 = No meaning\n");
if (*data & ICB1_MASTER)
- PDEBUG(DSIMI, DEBUG_INFO, " MASTER/SLAVE-BIT: 1 = Sender is master\n");
+ LOGP(DSIMI, LOGL_INFO, " MASTER/SLAVE-BIT: 1 = Sender is master\n");
else
- PDEBUG(DSIMI, DEBUG_INFO, " MASTER/SLAVE-BIT: 0 = Sender is slave\n");
+ LOGP(DSIMI, LOGL_INFO, " MASTER/SLAVE-BIT: 0 = Sender is slave\n");
if (*data & ICB1_WT_EXT)
- PDEBUG(DSIMI, DEBUG_INFO, " WT-EXTENSION-BIT: 1 = Request for WT-Extension\n");
+ LOGP(DSIMI, LOGL_INFO, " WT-EXTENSION-BIT: 1 = Request for WT-Extension\n");
else
- PDEBUG(DSIMI, DEBUG_INFO, " WT-EXTENSION-BIT: 0 = No request for WT-Extension\n");
+ LOGP(DSIMI, LOGL_INFO, " WT-EXTENSION-BIT: 0 = No request for WT-Extension\n");
if (*data & ICB1_ABORT)
- PDEBUG(DSIMI, DEBUG_INFO, " ABORT/TERMINATE-BIT: 1 = Abort/Terminate request\n");
+ LOGP(DSIMI, LOGL_INFO, " ABORT/TERMINATE-BIT: 1 = Abort/Terminate request\n");
else
- PDEBUG(DSIMI, DEBUG_INFO, " ABORT/TERMINATE-BIT: 0 = No meaning\n");
+ LOGP(DSIMI, LOGL_INFO, " ABORT/TERMINATE-BIT: 0 = No meaning\n");
if (*data & ICB1_ERROR)
- PDEBUG(DSIMI, DEBUG_INFO, " ERROR-BIT: 1 = Error\n");
+ LOGP(DSIMI, LOGL_INFO, " ERROR-BIT: 1 = Error\n");
else
- PDEBUG(DSIMI, DEBUG_INFO, " ERROR-BIT: 0 = No meaning\n");
+ LOGP(DSIMI, LOGL_INFO, " ERROR-BIT: 0 = No meaning\n");
if (*data & ICB1_CHAINING)
- PDEBUG(DSIMI, DEBUG_INFO, " CHAINING-BIT: 1 = More ICL data follows\n");
+ LOGP(DSIMI, LOGL_INFO, " CHAINING-BIT: 1 = More ICL data follows\n");
else
- PDEBUG(DSIMI, DEBUG_INFO, " CHAINING-BIT: 0 = No more ICL data follows\n");
+ LOGP(DSIMI, LOGL_INFO, " CHAINING-BIT: 0 = No more ICL data follows\n");
if (*data & ICB_EXT)
- PDEBUG(DSIMI, DEBUG_INFO, " ICB-EXTENSION-BIT: 1 = ICB2 follows\n");
+ LOGP(DSIMI, LOGL_INFO, " ICB-EXTENSION-BIT: 1 = ICB2 follows\n");
else {
- PDEBUG(DSIMI, DEBUG_INFO, " ICB-EXTENSION-BIT: 0 = no ICB follows\n");
+ LOGP(DSIMI, LOGL_INFO, " ICB-EXTENSION-BIT: 0 = no ICB follows\n");
ext = 0;
}
data++;
@@ -243,27 +243,27 @@ static void rx_icl_pdu(uint8_t *data, int length)
if (ext) {
if (length < 1) {
- PDEBUG(DSIMI, DEBUG_NOTICE, "Message too short\n");
+ LOGP(DSIMI, LOGL_NOTICE, "Message too short\n");
return;
}
- PDEBUG(DSIMI, DEBUG_INFO, "Interface control layer ICB2:\n");
+ LOGP(DSIMI, LOGL_INFO, "Interface control layer ICB2:\n");
if (*data & ICB2_DYNAMIC)
- PDEBUG(DSIMI, DEBUG_INFO, " DYN-BUFFER-SIZE-BIT: 1 = Buffer size %d\n", (*data & ICB2_BUFFER) * 8);
+ LOGP(DSIMI, LOGL_INFO, " DYN-BUFFER-SIZE-BIT: 1 = Buffer size %d\n", (*data & ICB2_BUFFER) * 8);
else
- PDEBUG(DSIMI, DEBUG_INFO, " DYN-BUFFER-SIZE-BIT: 0 = No meaning\n");
+ LOGP(DSIMI, LOGL_INFO, " DYN-BUFFER-SIZE-BIT: 0 = No meaning\n");
if (*data & ICB2_ISO_L2)
- PDEBUG(DSIMI, DEBUG_INFO, " ISO-7816-BLOCK-BIT: 1 = Compatible\n");
+ LOGP(DSIMI, LOGL_INFO, " ISO-7816-BLOCK-BIT: 1 = Compatible\n");
else
- PDEBUG(DSIMI, DEBUG_INFO, " ISO-7816-BLOCK-BIT: 0 = Incompatible\n");
+ LOGP(DSIMI, LOGL_INFO, " ISO-7816-BLOCK-BIT: 0 = Incompatible\n");
if (*data & ICB2_PRIVATE)
- PDEBUG(DSIMI, DEBUG_INFO, " PRIVATE-USE-BIT: 1 = Private use layer 7 protocol\n");
+ LOGP(DSIMI, LOGL_INFO, " PRIVATE-USE-BIT: 1 = Private use layer 7 protocol\n");
else
- PDEBUG(DSIMI, DEBUG_INFO, " PRIVATE-USE-BIT: 0 = No meaning\n");
+ LOGP(DSIMI, LOGL_INFO, " PRIVATE-USE-BIT: 0 = No meaning\n");
if (*data & ICB_EXT)
- PDEBUG(DSIMI, DEBUG_INFO, " ICB-EXTENSION-BIT: 1 = ICB3 follows\n");
+ LOGP(DSIMI, LOGL_INFO, " ICB-EXTENSION-BIT: 1 = ICB3 follows\n");
else {
- PDEBUG(DSIMI, DEBUG_INFO, " ICB-EXTENSION-BIT: 0 = no ICB follows\n");
+ LOGP(DSIMI, LOGL_INFO, " ICB-EXTENSION-BIT: 0 = no ICB follows\n");
ext = 0;
}
data++;
@@ -273,12 +273,12 @@ static void rx_icl_pdu(uint8_t *data, int length)
icb_count = 2;
while (ext) {
if (length < 1) {
- PDEBUG(DSIMI, DEBUG_NOTICE, "Message too short\n");
+ LOGP(DSIMI, LOGL_NOTICE, "Message too short\n");
return;
}
- PDEBUG(DSIMI, DEBUG_INFO, "Interface control layer ICB%d:\n", ++icb_count);
- PDEBUG(DSIMI, DEBUG_INFO, " Value: 0x%02x\n", *data);
+ LOGP(DSIMI, LOGL_INFO, "Interface control layer ICB%d:\n", ++icb_count);
+ LOGP(DSIMI, LOGL_INFO, " Value: 0x%02x\n", *data);
if (!(*data & 0x80))
ext = 0;
data++;
@@ -301,7 +301,7 @@ static uint8_t flip(uint8_t c)
void sniffer_reset(sim_sniffer_t *sim)
{
- PDEBUG(DSIM1, DEBUG_INFO, "Resetting sniffer\n");
+ LOGP(DSIM1, LOGL_INFO, "Resetting sniffer\n");
memset(sim, 0, sizeof(*sim));
}
@@ -380,47 +380,47 @@ static void decode_ta1(sim_sniffer_t __attribute__((unused)) *sim, uint8_t c, in
}
if (fi > 0)
- PDEBUG(DSIM2, DEBUG_INFO, " TA%d Fi = %d, f(max.) = %.1f MHz\n", count, fi, fmax);
+ LOGP(DSIM2, LOGL_INFO, " TA%d Fi = %d, f(max.) = %.1f MHz\n", count, fi, fmax);
else
- PDEBUG(DSIM2, DEBUG_INFO, " TA%d Fi = RFU\n", count);
+ LOGP(DSIM2, LOGL_INFO, " TA%d Fi = RFU\n", count);
if (di > 0)
- PDEBUG(DSIM2, DEBUG_INFO, " TA%d Di = %d\n", count, di);
+ LOGP(DSIM2, LOGL_INFO, " TA%d Di = %d\n", count, di);
else
- PDEBUG(DSIM2, DEBUG_INFO, " TA%d Di = RFU\n", count);
+ LOGP(DSIM2, LOGL_INFO, " TA%d Di = RFU\n", count);
}
static void decode_ta2(sim_sniffer_t __attribute__((unused)) *sim, uint8_t c, int count)
{
- PDEBUG(DSIM2, DEBUG_INFO, " TA%d T = %d\n", count, c & 0xf);
+ LOGP(DSIM2, LOGL_INFO, " TA%d T = %d\n", count, c & 0xf);
if (!(c & 0x10))
- PDEBUG(DSIM2, DEBUG_INFO, " TA%d : Fi and Di by TA1 shall apply.\n", count);
+ LOGP(DSIM2, LOGL_INFO, " TA%d : Fi and Di by TA1 shall apply.\n", count);
else
- PDEBUG(DSIM2, DEBUG_INFO, " TA%d : Implicit values (and not Di / Di by TA1) sall apply.\n", count);
+ LOGP(DSIM2, LOGL_INFO, " TA%d : Implicit values (and not Di / Di by TA1) sall apply.\n", count);
if (!(c & 0x80))
- PDEBUG(DSIM2, DEBUG_INFO, " TA%d : Capable to change negotiable/specific mode.\n", count);
+ LOGP(DSIM2, LOGL_INFO, " TA%d : Capable to change negotiable/specific mode.\n", count);
else
- PDEBUG(DSIM2, DEBUG_INFO, " TA%d : Unable to change negotiable/specific mode.\n", count);
+ LOGP(DSIM2, LOGL_INFO, " TA%d : Unable to change negotiable/specific mode.\n", count);
}
static void decode_tai(sim_sniffer_t *sim, uint8_t c, int count)
{
if ((sim->atr_td & 0xf) != 14) {
- PDEBUG(DSIM2, DEBUG_INFO, " TA%d Value = 0x%02x\n", count, c);
+ LOGP(DSIM2, LOGL_INFO, " TA%d Value = 0x%02x\n", count, c);
return;
}
if (count == 3) {
switch (c & 0xf) {
case 0:
- PDEBUG(DSIM2, DEBUG_INFO, " TA%d fsmin = Default\n", count);
+ LOGP(DSIM2, LOGL_INFO, " TA%d fsmin = Default\n", count);
break;
case 1:
case 2:
case 3:
- PDEBUG(DSIM2, DEBUG_INFO, " TA%d fsmin = %d MHz\n", count, c & 0xf);
+ LOGP(DSIM2, LOGL_INFO, " TA%d fsmin = %d MHz\n", count, c & 0xf);
break;
default:
- PDEBUG(DSIM2, DEBUG_INFO, " TA%d fsmin = reserved\n", count);
+ LOGP(DSIM2, LOGL_INFO, " TA%d fsmin = reserved\n", count);
break;
}
@@ -429,110 +429,110 @@ static void decode_tai(sim_sniffer_t *sim, uint8_t c, int count)
case 1:
case 2:
case 3:
- PDEBUG(DSIM2, DEBUG_INFO, " TA%d fsmax = reserved\n", count);
+ LOGP(DSIM2, LOGL_INFO, " TA%d fsmax = reserved\n", count);
break;
case 5:
- PDEBUG(DSIM2, DEBUG_INFO, " TA%d fsmax = 5 MHz (Default)\n", count);
+ LOGP(DSIM2, LOGL_INFO, " TA%d fsmax = 5 MHz (Default)\n", count);
break;
default:
- PDEBUG(DSIM2, DEBUG_INFO, " TA%d fsmax = %d MHz\n", count, c >> 4);
+ LOGP(DSIM2, LOGL_INFO, " TA%d fsmax = %d MHz\n", count, c >> 4);
break;
}
} else {
- PDEBUG(DSIM2, DEBUG_INFO, " TA%d Block Waiting Time = %d\n", count, c);
+ LOGP(DSIM2, LOGL_INFO, " TA%d Block Waiting Time = %d\n", count, c);
}
}
static void decode_tb1(sim_sniffer_t __attribute__((unused)) *sim, uint8_t c, int count)
{
if ((c & 0x1f) == 0)
- PDEBUG(DSIM2, DEBUG_INFO, " TB%d PI1=0: VPP not connected\n", count);
+ LOGP(DSIM2, LOGL_INFO, " TB%d PI1=0: VPP not connected\n", count);
else if ((c & 0x1f) == 5)
- PDEBUG(DSIM2, DEBUG_INFO, " TB%d PI1=5: VPP is 5 Volts (default)\n", count);
+ LOGP(DSIM2, LOGL_INFO, " TB%d PI1=5: VPP is 5 Volts (default)\n", count);
else if ((c & 0x1f) >= 6 && (c & 0x1f) <= 25)
- PDEBUG(DSIM2, DEBUG_INFO, " TB%d PI1=%d: VPP is %d Volts\n", count, c & 0x1f, (c & 0x1f) - 1);
+ LOGP(DSIM2, LOGL_INFO, " TB%d PI1=%d: VPP is %d Volts\n", count, c & 0x1f, (c & 0x1f) - 1);
else
- PDEBUG(DSIM2, DEBUG_INFO, " TB%d PI1=%d: not defined\n", count, c & 0x1f);
- PDEBUG(DSIM2, DEBUG_INFO, " TB%d II = %d\n", count, (c >> 5) & 0x3);
+ LOGP(DSIM2, LOGL_INFO, " TB%d PI1=%d: not defined\n", count, c & 0x1f);
+ LOGP(DSIM2, LOGL_INFO, " TB%d II = %d\n", count, (c >> 5) & 0x3);
}
static void decode_tb2(sim_sniffer_t __attribute__((unused)) *sim, uint8_t c, int count)
{
- PDEBUG(DSIM2, DEBUG_INFO, " TB%d Value = 0x%02x\n", count, c);
+ LOGP(DSIM2, LOGL_INFO, " TB%d Value = 0x%02x\n", count, c);
}
static void decode_tbi(sim_sniffer_t *sim, uint8_t c, int count)
{
if ((sim->atr_td & 0xf) != 14) {
- PDEBUG(DSIM2, DEBUG_INFO, " TB%d Value = 0x%02x\n", count, c);
+ LOGP(DSIM2, LOGL_INFO, " TB%d Value = 0x%02x\n", count, c);
return;
}
if (count == 3) {
- PDEBUG(DSIM2, DEBUG_INFO, " TB%d Maximum block size = %d\n", count, c);
+ LOGP(DSIM2, LOGL_INFO, " TB%d Maximum block size = %d\n", count, c);
} else {
if (!(c & 0x01))
- PDEBUG(DSIM2, DEBUG_INFO, " TB%d XOR Checksum\n", count);
+ LOGP(DSIM2, LOGL_INFO, " TB%d XOR Checksum\n", count);
else
- PDEBUG(DSIM2, DEBUG_INFO, " TB%d CRC Checksum\n", count);
+ LOGP(DSIM2, LOGL_INFO, " TB%d CRC Checksum\n", count);
if (!(c & 0x02))
- PDEBUG(DSIM2, DEBUG_INFO, " TB%d 12-etu frame\n", count);
+ LOGP(DSIM2, LOGL_INFO, " TB%d 12-etu frame\n", count);
else
- PDEBUG(DSIM2, DEBUG_INFO, " TB%d 11-etu frame\n", count);
+ LOGP(DSIM2, LOGL_INFO, " TB%d 11-etu frame\n", count);
if (!(c & 0x04))
- PDEBUG(DSIM2, DEBUG_INFO, " TB%d No Chaining in ICL-Layer-Protocol\n", count);
+ LOGP(DSIM2, LOGL_INFO, " TB%d No Chaining in ICL-Layer-Protocol\n", count);
else
- PDEBUG(DSIM2, DEBUG_INFO, " TB%d Chaining in ICL-Layer-Protocol\n", count);
+ LOGP(DSIM2, LOGL_INFO, " TB%d Chaining in ICL-Layer-Protocol\n", count);
if (!(c & 0x08))
- PDEBUG(DSIM2, DEBUG_INFO, " TB%d Incompatible to ISO 7816 (Character Protocol)\n", count);
+ LOGP(DSIM2, LOGL_INFO, " TB%d Incompatible to ISO 7816 (Character Protocol)\n", count);
else
- PDEBUG(DSIM2, DEBUG_INFO, " TB%d Compatible to ISO 7816 (Character Protocol)\n", count);
+ LOGP(DSIM2, LOGL_INFO, " TB%d Compatible to ISO 7816 (Character Protocol)\n", count);
if (!(c & 0x10))
- PDEBUG(DSIM2, DEBUG_INFO, " TB%d No private in ICL-Layer-Protocol\n", count);
+ LOGP(DSIM2, LOGL_INFO, " TB%d No private in ICL-Layer-Protocol\n", count);
else
- PDEBUG(DSIM2, DEBUG_INFO, " TB%d Private in ICL-Layer-Protocol\n", count);
+ LOGP(DSIM2, LOGL_INFO, " TB%d Private in ICL-Layer-Protocol\n", count);
if (!(c & 0x20))
- PDEBUG(DSIM2, DEBUG_INFO, " TB%d No ICB-Extension in ICL-Layer-Protocol\n", count);
+ LOGP(DSIM2, LOGL_INFO, " TB%d No ICB-Extension in ICL-Layer-Protocol\n", count);
else
- PDEBUG(DSIM2, DEBUG_INFO, " TB%d ICB-Extension in ICL-Layer-Protocol\n", count);
+ LOGP(DSIM2, LOGL_INFO, " TB%d ICB-Extension in ICL-Layer-Protocol\n", count);
}
}
static void decode_tc1(sim_sniffer_t __attribute__((unused)) *sim, uint8_t c, int count)
{
- PDEBUG(DSIM2, DEBUG_INFO, " TC%d N = %d\n", count, c);
+ LOGP(DSIM2, LOGL_INFO, " TC%d N = %d\n", count, c);
}
static void decode_tc2(sim_sniffer_t __attribute__((unused)) *sim, uint8_t c, int count)
{
- PDEBUG(DSIM2, DEBUG_INFO, " TC%d Value = 0x%02x\n", count, c);
+ LOGP(DSIM2, LOGL_INFO, " TC%d Value = 0x%02x\n", count, c);
}
static void decode_tci(sim_sniffer_t *sim, uint8_t c, int count)
{
if ((sim->atr_td & 0xf) != 14) {
- PDEBUG(DSIM2, DEBUG_INFO, " TC%d Value = 0x%02x\n", count, c);
+ LOGP(DSIM2, LOGL_INFO, " TC%d Value = 0x%02x\n", count, c);
return;
}
- PDEBUG(DSIM2, DEBUG_INFO, " TC%d Character Waiting Time = %d\n", count, c);
+ LOGP(DSIM2, LOGL_INFO, " TC%d Character Waiting Time = %d\n", count, c);
}
static void decode_td(sim_sniffer_t __attribute__((unused)) *sim, uint8_t c, int count)
{
switch (c & 0xf) {
case 0:
- PDEBUG(DSIM2, DEBUG_INFO, " TD%d T=1: Half-duplex transmission of characters (ISO 7816).\n", count);
+ LOGP(DSIM2, LOGL_INFO, " TD%d T=1: Half-duplex transmission of characters (ISO 7816).\n", count);
break;
case 1:
- PDEBUG(DSIM2, DEBUG_INFO, " TD%d T=1: Half-duplex transmission of blocks (ISO 7816).\n", count);
+ LOGP(DSIM2, LOGL_INFO, " TD%d T=1: Half-duplex transmission of blocks (ISO 7816).\n", count);
break;
case 2:
case 3:
- PDEBUG(DSIM2, DEBUG_INFO, " TD%d T=%d: Reserved for future full-duplex operations.\n", count, c & 0xf);
+ LOGP(DSIM2, LOGL_INFO, " TD%d T=%d: Reserved for future full-duplex operations.\n", count, c & 0xf);
break;
case 4:
- PDEBUG(DSIM2, DEBUG_INFO, " TD%d T=4: Reserved for an enhanced half-duplex transmission of characters.\n", count);
+ LOGP(DSIM2, LOGL_INFO, " TD%d T=4: Reserved for an enhanced half-duplex transmission of characters.\n", count);
break;
case 5:
case 6:
@@ -543,13 +543,13 @@ static void decode_td(sim_sniffer_t __attribute__((unused)) *sim, uint8_t c, int
case 11:
case 12:
case 13:
- PDEBUG(DSIM2, DEBUG_INFO, " TD%d T=%d: Reserved for future use by ISO/IEC JTC 1/SC 17.\n", count, c & 0xf);
+ LOGP(DSIM2, LOGL_INFO, " TD%d T=%d: Reserved for future use by ISO/IEC JTC 1/SC 17.\n", count, c & 0xf);
break;
case 14:
- PDEBUG(DSIM2, DEBUG_INFO, " TD%d T=14: Refers to transmission protocols not standardized by ISO/IEC JTC 1/SC 17.\n", count);
+ LOGP(DSIM2, LOGL_INFO, " TD%d T=14: Refers to transmission protocols not standardized by ISO/IEC JTC 1/SC 17.\n", count);
break;
case 15:
- PDEBUG(DSIM2, DEBUG_INFO, " TD%d T=15: Does not refer to a transmission protocol, but only qualifies global interface bytes.\n", count);
+ LOGP(DSIM2, LOGL_INFO, " TD%d T=15: Does not refer to a transmission protocol, but only qualifies global interface bytes.\n", count);
break;
}
}
@@ -589,26 +589,26 @@ static void decode_if(sim_sniffer_t *sim, int count)
}
if ((sim->atr_td >> 4))
- PDEBUG(DSIM2, DEBUG_INFO, "----------------------------------------\n");
+ LOGP(DSIM2, LOGL_INFO, "----------------------------------------\n");
}
static void decode_hist(sim_sniffer_t __attribute__((unused)) *sim, uint8_t c, int count)
{
- PDEBUG(DSIM2, DEBUG_INFO, " History byte #%d: 0x%02x\n", count, c);
+ LOGP(DSIM2, LOGL_INFO, " History byte #%d: 0x%02x\n", count, c);
}
static void rx_atr(sim_sniffer_t *sim, uint8_t c)
{
/* TS */
if (sim->atr_count == 0) {
- PDEBUG(DSIM1, DEBUG_INFO, "----------------------------------------\n");
+ LOGP(DSIM1, LOGL_INFO, "----------------------------------------\n");
switch (c) {
case 0x3f:
- PDEBUG(DSIM2, DEBUG_INFO, "Reading ATR inverse bit order:\n");
+ LOGP(DSIM2, LOGL_INFO, "Reading ATR inverse bit order:\n");
sim->inverse_order = 1;
break;
case 0x3b:
- PDEBUG(DSIM2, DEBUG_INFO, "Reading ATR normal bit order:\n");
+ LOGP(DSIM2, LOGL_INFO, "Reading ATR normal bit order:\n");
sim->inverse_order = 0;
break;
default:
@@ -689,14 +689,14 @@ static void rx_atr(sim_sniffer_t *sim, uint8_t c)
}
if (sim->atr_tck == 0)
- PDEBUG(DSIM2, DEBUG_INFO, " Checksum 0x%02x ok.\n", c);
+ LOGP(DSIM2, LOGL_INFO, " Checksum 0x%02x ok.\n", c);
else
- PDEBUG(DSIM2, DEBUG_NOTICE, " Checksum 0x%02x error!\n", c);
+ LOGP(DSIM2, LOGL_NOTICE, " Checksum 0x%02x error!\n", c);
sim->l1_state = L1_STATE_RECEIVE;
sim->block_state = BLOCK_STATE_ADDRESS;
- PDEBUG(DSIM2, DEBUG_INFO, "ATR done!\n");
+ LOGP(DSIM2, LOGL_INFO, "ATR done!\n");
}
static void rx_char(sim_sniffer_t *sim, uint8_t c)
@@ -714,7 +714,7 @@ static void rx_char(sim_sniffer_t *sim, uint8_t c)
sniffer_rx(sim, c);
return;
}
- PDEBUG(DSIM1, DEBUG_INFO, "----------------------------------------\n");
+ LOGP(DSIM1, LOGL_INFO, "----------------------------------------\n");
sim->block_address = c;
sim->block_state = BLOCK_STATE_CONTROL;
sim->block_checksum = c;
@@ -733,17 +733,17 @@ static void rx_char(sim_sniffer_t *sim, uint8_t c)
sim->block_data[sim->block_count++] = c;
return;
}
- PDEBUG(DSIM2, DEBUG_INFO, "Layer 2:\n");
- PDEBUG(DSIM2, DEBUG_INFO, " source %d -> to %d\n", sim->block_address >> 4, sim->block_address & 0xf);
+ LOGP(DSIM2, LOGL_INFO, "Layer 2:\n");
+ LOGP(DSIM2, LOGL_INFO, " source %d -> to %d\n", sim->block_address >> 4, sim->block_address & 0xf);
if ((sim->block_control & 0x11) == 0x00)
- PDEBUG(DSIM2, DEBUG_INFO, " control I: N(S)=%d N(R)=%d\n", (sim->block_control >> 1) & 7, sim->block_control >> 5);
+ LOGP(DSIM2, LOGL_INFO, " control I: N(S)=%d N(R)=%d\n", (sim->block_control >> 1) & 7, sim->block_control >> 5);
else if ((sim->block_control & 0x1f) == 0x09)
- PDEBUG(DSIM2, DEBUG_INFO, " control REJ: N(R)=%d\n", sim->block_control >> 5);
+ LOGP(DSIM2, LOGL_INFO, " control REJ: N(R)=%d\n", sim->block_control >> 5);
else if (sim->block_control == 0xef)
- PDEBUG(DSIM2, DEBUG_INFO, " control RES\n");
+ LOGP(DSIM2, LOGL_INFO, " control RES\n");
else
- PDEBUG(DSIM2, DEBUG_INFO, " control unknown 0x%02x\n", sim->block_control);
- PDEBUG(DSIM2, DEBUG_INFO, " length %d\n", sim->block_length);
+ LOGP(DSIM2, LOGL_INFO, " control unknown 0x%02x\n", sim->block_control);
+ LOGP(DSIM2, LOGL_INFO, " length %d\n", sim->block_length);
if (sim->block_checksum == 0) {
FILE *fp;
if (write_pdu_file && (fp = fopen(write_pdu_file, "a"))) {
@@ -756,7 +756,7 @@ static void rx_char(sim_sniffer_t *sim, uint8_t c)
}
rx_icl_pdu(sim->block_data, sim->block_length);
} else
- PDEBUG(DSIM2, DEBUG_NOTICE, "Received message with checksum error!\n");
+ LOGP(DSIM2, LOGL_NOTICE, "Received message with checksum error!\n");
sim->block_state = BLOCK_STATE_ADDRESS;
}
}
@@ -764,12 +764,12 @@ static void rx_char(sim_sniffer_t *sim, uint8_t c)
void sniffer_rx(sim_sniffer_t *sim, uint8_t c)
{
- PDEBUG(DSIM1, DEBUG_DEBUG, "Serial RX '0x%02x'\n", c);
+ LOGP(DSIM1, LOGL_DEBUG, "Serial RX '0x%02x'\n", c);
switch (sim->l1_state) {
case L1_STATE_RESET:
if (c != 0x3f && c != 0x3b) {
- PDEBUG(DSIM1, DEBUG_INFO, "Received garbage '0x%02x' while waiting for ATR\n", c);
+ LOGP(DSIM1, LOGL_INFO, "Received garbage '0x%02x' while waiting for ATR\n", c);
break;
}
sim->l1_state = L1_STATE_ATR;
@@ -792,13 +792,13 @@ void sniffer_timeout(sim_sniffer_t *sim)
case L1_STATE_RESET:
case L1_STATE_ATR:
if (sim->l1_state == L1_STATE_ATR && sim->atr_count)
- PDEBUG(DSIM1, DEBUG_NOTICE, "Timeout while receiving ATR!\n");
+ LOGP(DSIM1, LOGL_NOTICE, "Timeout while receiving ATR!\n");
sim->l1_state = L1_STATE_ATR;
sim->atr_count = 0;
break;
case L1_STATE_RECEIVE:
if (sim->block_state != BLOCK_STATE_ADDRESS)
- PDEBUG(DSIM1, DEBUG_NOTICE, "Timeout while receiving message!\n");
+ LOGP(DSIM1, LOGL_NOTICE, "Timeout while receiving message!\n");
sim->block_state = BLOCK_STATE_ADDRESS;
break;
default:
diff --git a/src/test/Makefile.am b/src/test/Makefile.am
index 4ae1e3e..e37d9bf 100644
--- a/src/test/Makefile.am
+++ b/src/test/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -g $(all_includes)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
noinst_PROGRAMS = \
test_filter \
@@ -17,9 +17,11 @@ test_filter_SOURCES = test_filter.c dummy.c
test_filter_LDADD = \
$(COMMON_LA) \
- $(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/liboptions/liboptions.a \
+ $(top_builddir)/src/liblogging/liblogging.a \
+ $(LIBOSMOCC_LIBS) \
+ $(LIBOSMOCORE_LIBS) \
-lm
test_sendevolumenregler_SOURCES = test_sendevolumenregler.c
@@ -40,10 +42,12 @@ test_emphasis_SOURCES = test_emphasis.c dummy.c
test_emphasis_LDADD = \
$(COMMON_LA) \
- $(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libemphasis/libemphasis.a \
$(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/liboptions/liboptions.a \
+ $(top_builddir)/src/liblogging/liblogging.a \
+ $(LIBOSMOCC_LIBS) \
+ $(LIBOSMOCORE_LIBS) \
-lm
test_dtmf_SOURCES = dummy.x test_dtmf.c
@@ -59,21 +63,20 @@ test_dms_SOURCES = test_dms.c dummy.c
test_dms_LDADD = \
$(COMMON_LA) \
- $(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libmobile/libmobile.a \
- $(top_builddir)/src/libosmocc/libosmocc.a \
$(top_builddir)/src/liboptions/liboptions.a \
$(top_builddir)/src/libdisplay/libdisplay.a \
$(top_builddir)/src/nmt/libdmssms.a \
$(top_builddir)/src/libjitter/libjitter.a \
- $(top_builddir)/src/libtimer/libtimer.a \
$(top_builddir)/src/libsamplerate/libsamplerate.a \
$(top_builddir)/src/libemphasis/libemphasis.a \
$(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \
- $(top_builddir)/src/libg711/libg711.a \
$(top_builddir)/src/libaaimage/libaaimage.a \
+ $(top_builddir)/src/liblogging/liblogging.a \
+ $(LIBOSMOCORE_LIBS) \
+ $(LIBOSMOCC_LIBS) \
-lm
if HAVE_ALSA
@@ -96,21 +99,20 @@ test_sms_SOURCES = dummy.c test_sms.c
test_sms_LDADD = \
$(COMMON_LA) \
- $(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libmobile/libmobile.a \
- $(top_builddir)/src/libosmocc/libosmocc.a \
$(top_builddir)/src/liboptions/liboptions.a \
$(top_builddir)/src/libdisplay/libdisplay.a \
$(top_builddir)/src/nmt/libdmssms.a \
$(top_builddir)/src/libjitter/libjitter.a \
- $(top_builddir)/src/libtimer/libtimer.a \
$(top_builddir)/src/libsamplerate/libsamplerate.a \
$(top_builddir)/src/libemphasis/libemphasis.a \
$(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \
- $(top_builddir)/src/libg711/libg711.a \
$(top_builddir)/src/libaaimage/libaaimage.a \
+ $(top_builddir)/src/liblogging/liblogging.a \
+ $(LIBOSMOCORE_LIBS) \
+ $(LIBOSMOCC_LIBS) \
-lm
if HAVE_ALSA
@@ -155,8 +157,10 @@ test_goertzel_SOURCES = test_goertzel.c dummy.c
test_goertzel_LDADD = \
$(COMMON_LA) \
- $(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libgoertzel/libgoertzel.a \
$(top_builddir)/src/liboptions/liboptions.a \
+ $(top_builddir)/src/liblogging/liblogging.a \
+ $(LIBOSMOCC_LIBS) \
+ $(LIBOSMOCORE_LIBS) \
-lm
diff --git a/src/test/dummy.c b/src/test/dummy.c
index 5d08d6b..ef9c8c0 100644
--- a/src/test/dummy.c
+++ b/src/test/dummy.c
@@ -1,9 +1,18 @@
+void call_down_audio(void);
void call_down_audio() { }
+void call_down_setup(void);
void call_down_setup() { }
+void call_down_release(void);
void call_down_release() { }
+void call_down_disconnect(void);
void call_down_disconnect() { }
+void call_down_answer(void);
void call_down_answer() { }
+void print_help(void);
void print_help() { }
+void sender_send(void);
void sender_send() { }
+void sender_receive(void);
void sender_receive() { }
+void dump_info(void);
void dump_info() {}
diff --git a/src/test/test_compandor.c b/src/test/test_compandor.c
index b1cd51e..f91e0b4 100644
--- a/src/test/test_compandor.c
+++ b/src/test/test_compandor.c
@@ -72,7 +72,8 @@ int main(void)
sample_t samples[SAMPLERATE * 2];
int f;
- init_compandor(&cstate, SAMPLERATE, ATTACK_MS, RECOVERY_MS);
+ compandor_init();
+ setup_compandor(&cstate, SAMPLERATE, ATTACK_MS, RECOVERY_MS);
for (f = 0; f < 3; f++) {
/* -16 and -4 dB */
diff --git a/src/test/test_dms.c b/src/test/test_dms.c
index 23a91db..e571fd9 100644
--- a/src/test/test_dms.c
+++ b/src/test/test_dms.c
@@ -5,7 +5,7 @@
#include <string.h>
#include <unistd.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../nmt/nmt.h"
extern int dms_allow_loopback;
@@ -20,7 +20,7 @@ static void assert(int condition, char *why)
}
}
-void ok(void)
+static void ok(void)
{
printf("\n OK ;->\n\n");
sleep(1);
@@ -39,7 +39,7 @@ static const uint8_t test_null[][8] = {
static char ack_bits[77];
-void dms_receive(nmt_t *nmt, const uint8_t *data, int length, int eight_bits)
+void dms_receive(nmt_t __attribute__((unused)) *nmt, const uint8_t *data, int length, int __attribute__((unused)) eight_bits)
{
printf("(getting %d digits from DMS layer)\n", length);
@@ -49,11 +49,11 @@ void dms_receive(nmt_t *nmt, const uint8_t *data, int length, int eight_bits)
check_length = length;
}
-void dms_all_sent(nmt_t *nmt)
+void dms_all_sent(nmt_t __attribute__((unused)) *nmt)
{
}
-nmt_t *alloc_nmt(void)
+static nmt_t *alloc_nmt(void)
{
nmt_t *nmt;
@@ -65,7 +65,7 @@ nmt_t *alloc_nmt(void)
return nmt;
}
-void free_nmt(nmt_t *nmt)
+static void free_nmt(nmt_t *nmt)
{
dms_cleanup_sender(nmt);
free(nmt);
@@ -80,9 +80,10 @@ int main(void)
int i, j;
/* this is never called, it forces the linker to add mobile functions */
- if (debuglevel == -1000) main_mobile_loop();
+ if (loglevel == -1000) main_mobile_loop();
- debuglevel = DEBUG_DEBUG;
+ loglevel = LOGL_DEBUG;
+ logging_init();
dms_allow_loopback = 1;
nmt = alloc_nmt();
@@ -199,7 +200,7 @@ int main(void)
ok();
- debuglevel = DEBUG_INFO;
+ loglevel = LOGL_INFO;
/* test again with pseudo random packet dropps */
srandom(0);
diff --git a/src/test/test_dtmf.c b/src/test/test_dtmf.c
index f26ae3b..e35ec8e 100644
--- a/src/test/test_dtmf.c
+++ b/src/test/test_dtmf.c
@@ -2,7 +2,7 @@
#include <stdint.h>
#include <math.h>
#include <string.h>
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../libsample/sample.h"
#include "../libdtmf/dtmf_decode.h"
#include "../libdtmf/dtmf_encode.h"
@@ -49,7 +49,7 @@ static void check_level(sample_t *samples, const char *desc, double target, int
static char got_digit;
-static void recv_digit(void *inst, char digit, dtmf_meas_t *meas)
+static void recv_digit(void __attribute__((unused)) *inst, char digit, dtmf_meas_t *meas)
{
printf("decoded digit '%c' frequency %.1f %.1f amplitude %.1f %.1f dB\n", digit, meas->frequency_low, meas->frequency_high, level2db(meas->amplitude_low), level2db(meas->amplitude_high));
got_digit = digit;
@@ -65,7 +65,8 @@ int main(void)
fm_init(0);
- dtmf_decode_init(&dtmf_dec, NULL, recv_digit, SAMPLERATE, db2level(0), db2level(-30.0));
+ /* decoder uses a strict frequency offset of 0.1 percent. */
+ dtmf_decode_init(&dtmf_dec, NULL, recv_digit, SAMPLERATE, db2level(0), db2level(-30.0), 0.1);
for (f = 0; f < 8; f++) {
printf("Testing filter with frequency %.0f Hz:\n", test_frequency[f]);
diff --git a/src/test/test_emphasis.c b/src/test/test_emphasis.c
index aea6356..ab78ee9 100644
--- a/src/test/test_emphasis.c
+++ b/src/test/test_emphasis.c
@@ -5,7 +5,7 @@
#include "../libsample/sample.h"
#include "../libfilter/iir_filter.h"
#include "../libemphasis/emphasis.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#define level2db(level) (20 * log10(level))
#define db2level(db) pow(10, (double)db / 20.0)
diff --git a/src/test/test_filter.c b/src/test/test_filter.c
index 3011930..f1fe5cc 100644
--- a/src/test/test_filter.c
+++ b/src/test/test_filter.c
@@ -5,7 +5,7 @@
#include "../libsample/sample.h"
#include "../libfilter/iir_filter.h"
#include "../libfilter/fir_filter.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#define level2db(level) (20 * log10(level))
#define db2level(db) pow(10, (double)db / 20.0)
@@ -85,6 +85,25 @@ int main(void)
printf("\n");
}
+ printf("testing notch filter with %d iterations, Q = 4\n", 1);
+
+ iir_notch_init(&filter_high, 2605.0, SAMPLERATE, 1, 4);
+
+ for (i = 0; i < 4001; i += 100) {
+ gen_samples(samples, (double)i);
+ iir_process(&filter_high, samples, SAMPLERATE);
+ level = get_level(samples);
+ printf("%s%4d Hz: %.1f dB", debug_db(level), i, level2db(level));
+ if (i == 2600)
+ printf(" filter frequency (2605 Hz)\n");
+ else if (i == 2800)
+ printf(" about 200 Hz above\n");
+ else if (i == 2400)
+ printf(" about 200 Hz below\n");
+ else
+ printf("\n");
+ }
+
printf("testing band-pass filter with %d iterations\n", iter);
iir_lowpass_init(&filter_low, 2000.0, SAMPLERATE, iter);
diff --git a/src/test/test_goertzel.c b/src/test/test_goertzel.c
index ee1ba0f..656f31e 100644
--- a/src/test/test_goertzel.c
+++ b/src/test/test_goertzel.c
@@ -4,7 +4,7 @@
#include <string.h>
#include "../libsample/sample.h"
#include "../libgoertzel/goertzel.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#define level2db(level) (20 * log10(level))
#define db2level(db) pow(10, (double)db / 20.0)
diff --git a/src/test/test_performance.c b/src/test/test_performance.c
index a045eee..ae10930 100644
--- a/src/test/test_performance.c
+++ b/src/test/test_performance.c
@@ -6,7 +6,7 @@
#include "../libsample/sample.h"
#include "../libfilter/iir_filter.h"
#include "../libfm/fm.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
struct timeval start_tv, tv;
double duration;
diff --git a/src/test/test_sms.c b/src/test/test_sms.c
index 36c892b..cb3dd6a 100644
--- a/src/test/test_sms.c
+++ b/src/test/test_sms.c
@@ -5,7 +5,7 @@
#include <string.h>
#include <unistd.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../nmt/nmt.h"
static const uint8_t test_mo_sms_data1[] = {
@@ -53,7 +53,7 @@ static void assert(int condition, char *why)
}
}
-void ok(void)
+static void ok(void)
{
printf("\n OK ;->\n\n");
sleep(1);
@@ -61,7 +61,7 @@ void ok(void)
static uint8_t dms_buffer[256];
static int dms_buffer_count;
-void dms_send(nmt_t *nmt, const uint8_t *data, int length, int eight_bits)
+void dms_send(nmt_t __attribute__((unused)) *nmt, const uint8_t *data, int length, int __attribute__((unused)) eight_bits)
{
int i;
@@ -80,12 +80,12 @@ void dms_send(nmt_t *nmt, const uint8_t *data, int length, int eight_bits)
assert(!memcmp(data, test_mt_sms_data, length), "Expecting SMS binary data to match");
}
-void sms_release(nmt_t *nmt)
+void sms_release(nmt_t __attribute__((unused)) *nmt)
{
printf("(got release from SMS layer)\n");
}
-int sms_submit(nmt_t *nmt, uint8_t ref, const char *orig_address, uint8_t orig_type, uint8_t orig_plan, int msg_ref, const char *dest_address, uint8_t dest_type, uint8_t dest_plan, const char *message)
+int sms_submit(nmt_t __attribute__((unused)) *nmt, uint8_t __attribute__((unused)) ref, const char __attribute__((unused)) *orig_address, uint8_t __attribute__((unused)) orig_type, uint8_t __attribute__((unused)) orig_plan, int __attribute__((unused)) msg_ref, const char __attribute__((unused)) *dest_address, uint8_t __attribute__((unused)) dest_type, uint8_t __attribute__((unused)) dest_plan, const char *message)
{
strcpy((char *)dms_buffer, message);
dms_buffer_count = strlen(message);
@@ -93,7 +93,7 @@ int sms_submit(nmt_t *nmt, uint8_t ref, const char *orig_address, uint8_t orig_t
return 0;
}
-void sms_deliver_report(nmt_t *nmt, uint8_t ref, int error, uint8_t cause)
+void sms_deliver_report(nmt_t __attribute__((unused)) *nmt, uint8_t __attribute__((unused)) ref, int __attribute__((unused)) error, uint8_t __attribute__((unused)) cause)
{
printf("(got deliver report from SMS layer)\n");
}
@@ -107,9 +107,10 @@ int main(void)
int rc;
/* this is never called, it forces the linker to add mobile functions */
- if (debuglevel == -1000) main_mobile_loop();
+ if (loglevel == -1000) main_mobile_loop();
- debuglevel = DEBUG_DEBUG;
+ loglevel = LOGL_DEBUG;
+ logging_init();
nmt = calloc(sizeof(*nmt), 1);
sms_init_sender(nmt);
@@ -131,10 +132,10 @@ int main(void)
printf("(submitting SMS 7-bit encoded)\n");
dms_buffer_count = 0;
- for (i = 0; i < sizeof(test_mo_sms_data1); i++)
+ for (i = 0; i < (int)sizeof(test_mo_sms_data1); i++)
dms_receive(nmt, test_mo_sms_data1 + i, 1, 1);
- assert(dms_buffer_count == strlen(test_mo_sms_text1), "Expecting SMS text length to match");
+ assert(dms_buffer_count == (int)strlen(test_mo_sms_text1), "Expecting SMS text length to match");
assert(!memcmp(dms_buffer, test_mo_sms_text1, dms_buffer_count), "Expecting SMS text to match");
sms_cleanup_sender(nmt);
@@ -148,10 +149,10 @@ int main(void)
printf("(submitting SMS 8-bit encoded)\n");
dms_buffer_count = 0;
- for (i = 0; i < sizeof(test_mo_sms_data2); i++)
+ for (i = 0; i < (int)sizeof(test_mo_sms_data2); i++)
dms_receive(nmt, test_mo_sms_data2 + i, 1, 1);
- assert(dms_buffer_count == strlen(test_mo_sms_text2), "Expecting SMS text length to match");
+ assert(dms_buffer_count == (int)strlen(test_mo_sms_text2), "Expecting SMS text length to match");
assert(!memcmp(dms_buffer, test_mo_sms_text2, dms_buffer_count), "Expecting SMS text to match");
sms_cleanup_sender(nmt);
diff --git a/src/tv/Makefile.am b/src/tv/Makefile.am
index 7fe03b8..8297bf8 100644
--- a/src/tv/Makefile.am
+++ b/src/tv/Makefile.am
@@ -1,4 +1,5 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes) $(IMAGEMAGICK_CFLAGS)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes) \
+ $(IMAGEMAGICK_CFLAGS)
bin_PROGRAMS = \
osmotv
@@ -19,12 +20,13 @@ osmotv_SOURCES = \
osmotv_LDADD = \
$(COMMON_LA) \
$(top_builddir)/src/liboptions/liboptions.a \
- $(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libimage/libimage.a \
$(top_builddir)/src/libfm/libfm.a \
$(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \
+ $(top_builddir)/src/liblogging/liblogging.a \
+ $(LIBOSMOCORE_LIBS) \
$(ALSA_LIBS) \
$(IMAGEMAGICK_LIBS) \
-lm
@@ -36,8 +38,7 @@ osmotv_LDADD += \
endif
osmotv_LDADD += \
- $(top_builddir)/src/libdisplay/libdisplay.a \
- $(top_builddir)/src/libtimer/libtimer.a
+ $(top_builddir)/src/libdisplay/libdisplay.a
if HAVE_SDR
osmotv_LDADD += \
diff --git a/src/tv/channels.c b/src/tv/channels.c
index fc2ad00..e7ff12a 100644
--- a/src/tv/channels.c
+++ b/src/tv/channels.c
@@ -1,5 +1,6 @@
#include <stdio.h>
#include <string.h>
+#include "channels.h"
static struct tv_channels {
const char *channel;
diff --git a/src/tv/main.c b/src/tv/main.c
index 0bb6aca..db2e0db 100644
--- a/src/tv/main.c
+++ b/src/tv/main.c
@@ -33,12 +33,13 @@ enum paging_signal;
#include "../libfm/fm.h"
#include "../libwave/wave.h"
#include "../libimage/img.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#ifdef HAVE_SDR
#include "../libsdr/sdr_config.h"
#include "../libsdr/sdr.h"
#endif
#include "../liboptions/options.h"
+#include <osmocom/cc/misc.h>
#include "bas.h"
#include "tv_modulate.h"
#include "channels.h"
@@ -48,8 +49,9 @@ enum paging_signal;
void *sender_head = NULL;
int use_sdr = 0;
int num_kanal = 1; /* only one channel used for debugging */
-int rt_prio = 1;
+int rt_prio = 0;
+void *get_sender_by_empfangsfrequenz(void);
void *get_sender_by_empfangsfrequenz() { return NULL; }
static double __attribute__((__unused__)) modulation = 0.7; /* level of modulation for I/Q amplitudes */
@@ -68,7 +70,7 @@ static const char *wave_file = NULL;
/* global variable to quit main loop */
int quit = 0;
-void sighandler(int sigset)
+static void sighandler(int sigset)
{
if (sigset == SIGHUP)
return;
@@ -81,7 +83,7 @@ void sighandler(int sigset)
quit = 1;
}
-void print_help(const char *arg0)
+static void print_help(const char *arg0)
{
printf("Usage: %s -f <frequency> | -c <channel> <command>\n", arg0);
@@ -331,8 +333,10 @@ static void tx_bas(sample_t *sample_bas, __attribute__((__unused__)) sample_t *s
memset(&schedp, 0, sizeof(schedp));
schedp.sched_priority = rt_prio;
rc = sched_setscheduler(0, SCHED_RR, &schedp);
- if (rc)
+ if (rc) {
fprintf(stderr, "Error setting SCHED_RR with prio %d\n", rt_prio);
+ goto error;
+ }
}
double tx_frequencies[1], rx_frequencies[1];
@@ -340,7 +344,7 @@ static void tx_bas(sample_t *sample_bas, __attribute__((__unused__)) sample_t *s
tx_frequencies[0] = frequency;
rx_frequencies[0] = frequency;
am[0] = 0;
- sdr = sdr_open(NULL, tx_frequencies, rx_frequencies, am, 0, 0.0, dsp_samplerate, buffer_size, 1.0, 0.0, 0.0, 0.0);
+ sdr = sdr_open(0, NULL, tx_frequencies, rx_frequencies, am, 0, 0.0, dsp_samplerate, buffer_size, 1.0, 0.0, 0.0, 0.0);
if (!sdr)
goto error;
sdr_start(sdr);
@@ -495,7 +499,8 @@ int main(int argc, char *argv[])
{
int __attribute__((__unused__)) rc, argi;
- debuglevel = 0;
+ loglevel = LOGL_DEBUG;
+ logging_init();
#ifdef HAVE_SDR
sdr_config_init(DEFAULT_LO_OFFSET);
@@ -568,3 +573,5 @@ int main(int argc, char *argv[])
return 0;
}
+void osmo_cc_set_log_cat(int __attribute__((unused)) cc_log_cat) {}
+
diff --git a/src/zeitansage/Makefile.am b/src/zeitansage/Makefile.am
index dbab2fb..544e428 100644
--- a/src/zeitansage/Makefile.am
+++ b/src/zeitansage/Makefile.am
@@ -1,4 +1,4 @@
-AM_CPPFLAGS = -Wall -Wextra -g $(all_includes) $(FUSE_CFLAGS)
+AM_CPPFLAGS = -Wall -Wextra -Wmissing-prototypes -g $(all_includes)
bin_PROGRAMS = \
zeitansage
@@ -11,12 +11,9 @@ zeitansage_SOURCES = \
zeitansage_LDADD = \
$(COMMON_LA) \
$(top_builddir)/src/liboptions/liboptions.a \
- $(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libmobile/libmobile.a \
- $(top_builddir)/src/libosmocc/libosmocc.a \
$(top_builddir)/src/libdisplay/libdisplay.a \
$(top_builddir)/src/libjitter/libjitter.a \
- $(top_builddir)/src/libtimer/libtimer.a \
$(top_builddir)/src/libsamplerate/libsamplerate.a \
$(top_builddir)/src/libemphasis/libemphasis.a \
$(top_builddir)/src/libfsk/libfsk.a \
@@ -24,8 +21,10 @@ zeitansage_LDADD = \
$(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \
- $(top_builddir)/src/libg711/libg711.a \
$(top_builddir)/src/libaaimage/libaaimage.a \
+ $(top_builddir)/src/liblogging/liblogging.a \
+ $(LIBOSMOCORE_LIBS) \
+ $(LIBOSMOCC_LIBS) \
$(ALSA_LIBS) \
-lm
diff --git a/src/zeitansage/main.c b/src/zeitansage/main.c
index 7112f7f..d4fbb0a 100644
--- a/src/zeitansage/main.c
+++ b/src/zeitansage/main.c
@@ -23,7 +23,7 @@
#include <string.h>
#include <errno.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../libmobile/call.h"
#include "../libmobile/main_mobile.h"
#include "../liboptions/options.h"
diff --git a/src/zeitansage/samples.c b/src/zeitansage/samples.c
index ad94755..ed7adbc 100644
--- a/src/zeitansage/samples.c
+++ b/src/zeitansage/samples.c
@@ -1,4 +1,5 @@
#include <stdint.h>
+#include "samples.h"
static int16_t pattern_bntie[] = {
0xfff2, 0xffc9, 0xffe2, 0xffc9, 0xff24, 0xff1d, 0xff11, 0xfee4,
diff --git a/src/zeitansage/zeitansage.c b/src/zeitansage/zeitansage.c
index 5449d21..6509e80 100644
--- a/src/zeitansage/zeitansage.c
+++ b/src/zeitansage/zeitansage.c
@@ -25,9 +25,10 @@
#include <math.h>
#include <time.h>
#include "../libsample/sample.h"
-#include "../libdebug/debug.h"
+#include "../liblogging/logging.h"
#include "../libmobile/call.h"
#include "../libmobile/cause.h"
+#include "../libmobile/get_time.h"
#include "zeitansage.h"
#define db2level(db) pow(10, (double)(db) / 20.0)
@@ -96,7 +97,7 @@ static void call_new_state(zeit_call_t *call, enum zeit_call_state new_state)
{
if (call->state == new_state)
return;
- PDEBUG(DZEIT, DEBUG_DEBUG, "State change: %s -> %s\n", call_state_name(call->state), call_state_name(new_state));
+ LOGP(DZEIT, LOGL_DEBUG, "State change: %s -> %s\n", call_state_name(call->state), call_state_name(new_state));
call->state = new_state;
zeit_display_status();
}
@@ -133,7 +134,7 @@ int zeit_init(double audio_level_dBm, int alerting)
}
sekunden_time += minuten_time;
- PDEBUG(DZEIT, DEBUG_DEBUG, "Total time to play announcement, starting with beep: %.2f seconds\n", (double)sekunden_time / 8000.0);
+ LOGP(DZEIT, LOGL_DEBUG, "Total time to play announcement, starting with beep: %.2f seconds\n", (double)sekunden_time / 8000.0);
return 0;
}
@@ -156,10 +157,12 @@ static void zeit_calc_time(zeit_call_t *call, time_t time_sec)
call->m = tm->tm_min;
call->s = tm->tm_sec;
- PDEBUG(DZEIT, DEBUG_INFO, "The time at the next beep is: %d:%02d:%02d\n", call->h, call->m, call->s);
+ LOGP(DZEIT, LOGL_INFO, "The time at the next beep is: %d:%02d:%02d\n", call->h, call->m, call->s);
}
-static void call_timeout(struct timer *timer);
+static void call_timeout(void *data);
+
+#define FLOAT_TO_TIMEOUT(f) floor(f), ((f) - floor(f)) * 1000000
/* Create call instance */
static zeit_call_t *zeit_call_create(uint32_t callref, const char *id)
@@ -168,25 +171,25 @@ static zeit_call_t *zeit_call_create(uint32_t callref, const char *id)
double now, time_offset;
time_t time_sec;
- PDEBUG(DZEIT, DEBUG_INFO, "Creating call instance to play time for caller '%s'.\n", id);
+ LOGP(DZEIT, LOGL_INFO, "Creating call instance to play time for caller '%s'.\n", id);
/* create */
call = calloc(1, sizeof(*call));
if (!call) {
- PDEBUG(DZEIT, DEBUG_ERROR, "No mem!\n");
+ LOGP(DZEIT, LOGL_ERROR, "No mem!\n");
abort();
}
/* init */
call->callref = callref;
strncpy(call->caller_id, id, sizeof(call->caller_id) - 1);
- timer_init(&call->timer, call_timeout, call);
+ osmo_timer_setup(&call->timer, call_timeout, call);
now = get_time();
time_offset = fmod(now, 10.0);
time_sec = (int)floor(now / 10.0) * 10;
call->spl_time = (int)(time_offset * 8000.0);
zeit_calc_time(call, time_sec);
- timer_start(&call->timer, 10.0 - time_offset);
+ osmo_timer_schedule(&call->timer, FLOAT_TO_TIMEOUT(10.0 - time_offset));
/* link */
callp = &zeit_call_list;
@@ -209,7 +212,7 @@ static void zeit_call_destroy(zeit_call_t *call)
(*callp) = call->next;
/* cleanup */
- timer_exit(&call->timer);
+ osmo_timer_del(&call->timer);
/* destroy */
free(call);
@@ -317,13 +320,13 @@ void call_down_clock(void)
}
/* Timeout handling */
-static void call_timeout(struct timer *timer)
+static void call_timeout(void *data)
{
- zeit_call_t *call = (zeit_call_t *)timer->priv;
+ zeit_call_t *call = data;
double now, time_offset;
time_t time_sec;
- PDEBUG(DZEIT, DEBUG_INFO, "Beep!\n");
+ LOGP(DZEIT, LOGL_INFO, "Beep!\n");
now = get_time();
@@ -336,7 +339,7 @@ static void call_timeout(struct timer *timer)
}
call->spl_time = 0;
zeit_calc_time(call, time_sec);
- timer_start(&call->timer, 10.0 - time_offset);
+ osmo_timer_schedule(&call->timer, FLOAT_TO_TIMEOUT(10.0 - time_offset));
}
/* Call control starts call towards clock */
@@ -355,7 +358,7 @@ 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 __attribute__((unused)) callref, struct timeval __attribute__((unused)) *tv_meter)
{
}
@@ -363,14 +366,14 @@ static void _release(int callref, int __attribute__((unused)) cause)
{
zeit_call_t *call;
- PDEBUG(DZEIT, DEBUG_INFO, "Call has been disconnected by network.\n");
+ LOGP(DZEIT, LOGL_INFO, "Call has been disconnected by network.\n");
for (call = zeit_call_list; call; call = call->next) {
if (call->callref == callref)
break;
}
if (!call) {
- PDEBUG(DZEIT, DEBUG_NOTICE, "Outgoing disconnect, but no callref!\n");
+ LOGP(DZEIT, LOGL_NOTICE, "Outgoing disconnect, but no callref!\n");
call_up_release(callref, CAUSE_INVALCALLREF);
return;
}
@@ -395,7 +398,7 @@ void call_down_release(int callref, int cause)
}
/* Receive audio from call instance. */
-void call_down_audio(int __attribute__((unused)) callref, uint16_t __attribute__((unused)) sequence, uint32_t __attribute__((unused)) timestamp, uint32_t __attribute__((unused)) ssrc, sample_t __attribute__((unused)) *samples, int __attribute__((unused)) count)
+void call_down_audio(void __attribute__((unused)) *decoder, void __attribute__((unused)) *decoder_priv, int __attribute__((unused)) callref, uint16_t __attribute__((unused)) sequence, uint8_t __attribute__((unused)) marker, uint32_t __attribute__((unused)) timestamp, uint32_t __attribute__((unused)) ssrc, uint8_t __attribute__((unused)) *payload, int __attribute__((unused)) payload_len)
{
}
diff --git a/src/zeitansage/zeitansage.h b/src/zeitansage/zeitansage.h
index 64dd986..b9492a4 100644
--- a/src/zeitansage/zeitansage.h
+++ b/src/zeitansage/zeitansage.h
@@ -1,6 +1,6 @@
#include "../libfm/fm.h"
#include "../libmobile/sender.h"
-#include "../libtimer/timer.h"
+#include <osmocom/core/timer.h>
/* current state of incoming call */
enum zeit_call_state {
@@ -17,7 +17,7 @@ enum zeit_call_state {
typedef struct zeit_call {
struct zeit_call *next;
int callref; /* call reference */
- struct timer timer;
+ struct osmo_timer_list timer;
enum zeit_call_state state; /* current state */
char caller_id[32]; /* caller id to be displayed */
int spl_time; /* sample offset within 10 seconds */