Move from local to external osmo* libraries

src/libdebug -> libosmocore
src/libselect -> libosmocore
src/libtimer -> libosmocore
src/libosmocc -> libosmo-cc
src/libg711 -> libosmo-cc
This commit is contained in:
Andreas Eversberg committed 2024-02-18 16:23:29 +01:00
1 parent 6cd2c3e323
commit 3158c48365
198 files changed
+4181 -12543

No files matched your search

+1 -6
View File
@@ -19,8 +19,8 @@ compile
.deps .deps
.libs .libs
.dirstamp .dirstamp
src/liblogging/liblogging.a
src/liboptions/liboptions.a src/liboptions/liboptions.a
src/libdebug/libdebug.a
src/libmobile/libmobile.a src/libmobile/libmobile.a
src/libdisplay/libdisplay.a src/libdisplay/libdisplay.a
src/libimage/libimage.a src/libimage/libimage.a
@@ -31,9 +31,6 @@ src/libjitter/libjitter.a
src/libsquelch/libsquelch.a src/libsquelch/libsquelch.a
src/libhagelbarger/libhagelbarger.a src/libhagelbarger/libhagelbarger.a
src/libdtmf/libdtmf.a src/libdtmf/libdtmf.a
src/libtimer/libtimer.a
src/libselect/libselect.a
src/libph_socket/libph_socket.a
src/libsamplerate/libsamplerate.a src/libsamplerate/libsamplerate.a
src/libscrambler/libscrambler.a src/libscrambler/libscrambler.a
src/libemphasis/libemphasis.a src/libemphasis/libemphasis.a
@@ -50,8 +47,6 @@ src/libclipper/libclipper.a
src/libserial/libserial.a src/libserial/libserial.a
src/libv27/libv27.a src/libv27/libv27.a
src/libmtp/libmtp.a src/libmtp/libmtp.a
src/libosmocc/libosmocc.a
src/libg711/libg711.a
src/libaaimage/libaaimage.a src/libaaimage/libaaimage.a
src/anetz/libgermanton.a src/anetz/libgermanton.a
src/anetz/anetz src/anetz/anetz
+19 -13
View File
@@ -1,24 +1,30 @@
You need to have the following packages install: You need to have the following packages install:
* libosmocore, core libraries for various osmocom related projects
* libosmo-cc, call control interface library, to interconnect applications
* automake, gcc for compilation * automake, gcc for compilation
* libasound2 for sound card support, which is what you need! * libasound2 for sound card support, which is what you need!
* libsoapysdr or libuhd (developer) to support SDR * libsoapysdr or libuhd (developer) to support SDR
* -> SoapySDR modules to support your SDR hardware * -> SoapySDR modules to support your SDR hardware
* libimagamagick version >= 7 (developer) optionally for TV image display * libimagamagick version >= 7 (developer) optionally for TV image display
Install libosmocore:
See: https://osmocom.org/projects/libosmocore/wiki/Libosmocore
Generate "configure": Install libosmo-cc:
$ git clone https://gitea.osmocom.org/osmocom/libosmo-cc.git
$ autoreconf -if $ cd libosmocore/
$ autoreconf -i
$./configure
Run "configure":
$ ./configure
Build and install:
$ make $ make
$ make install s udo make install
$ sudo ldconfig -i
$ cd ..
Install osmocom-analog:
$ autoreconf -i
$ ./configure
$ make
$ sudo make install
+7 -14
View File
@@ -1,7 +1,5 @@
dnl Process this file with autoconf to produce a configure script dnl Process this file with autoconf to produce a configure script
AC_INIT([abcnetz], AC_INIT([abcnetz],[m4_esyscmd(./git-version-gen .tarball-version)],[[email protected]])
m4_esyscmd([./git-version-gen .tarball-version]),
[[email protected]])
AM_INIT_AUTOMAKE([dist-bzip2]) AM_INIT_AUTOMAKE([dist-bzip2])
@@ -17,9 +15,6 @@ AC_PROG_CXX
AC_PROG_INSTALL AC_PROG_INSTALL
AC_PROG_RANLIB AC_PROG_RANLIB
dnl checks for header files
AC_HEADER_STDC
dnl Checks for typedefs, structures and compiler characteristics dnl Checks for typedefs, structures and compiler characteristics
AC_CANONICAL_HOST AC_CANONICAL_HOST
@@ -27,6 +22,9 @@ AC_CANONICAL_HOST
AC_CHECK_LIB([m], [main], [], [echo "Failed to find lib!" ; exit -1]) AC_CHECK_LIB([m], [main], [], [echo "Failed to find lib!" ; exit -1])
AC_CHECK_LIB([pthread], [main], [], [echo "Failed to find lib!" ; exit -1]) AC_CHECK_LIB([pthread], [main], [], [echo "Failed to find lib!" ; exit -1])
PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 1.6.0)
PKG_CHECK_MODULES(LIBOSMOCC, libosmocc >= 1.0.0)
with_sdr=no with_sdr=no
soapy_0_8_0_or_higher= soapy_0_8_0_or_higher=
AC_ARG_WITH([alsa], [AS_HELP_STRING([--with-alsa], [compile with Alsa driver @<:@default=check@:>@]) ], [], [with_alsa="check"]) AC_ARG_WITH([alsa], [AS_HELP_STRING([--with-alsa], [compile with Alsa driver @<:@default=check@:>@]) ], [], [with_alsa="check"])
@@ -60,9 +58,8 @@ AS_IF([test "x$with_alsa" != "xyes" -a "x$with_sdr" != "xyes"],[AC_MSG_NOTICE( W
SOAPY_CFLAGS="$soapy_0_8_0_or_higher" SOAPY_CFLAGS="$soapy_0_8_0_or_higher"
AC_OUTPUT( AC_CONFIG_FILES([src/liblogging/Makefile
src/liboptions/Makefile src/liboptions/Makefile
src/libdebug/Makefile
src/libmobile/Makefile src/libmobile/Makefile
src/libdisplay/Makefile src/libdisplay/Makefile
src/libimage/Makefile src/libimage/Makefile
@@ -73,9 +70,6 @@ AC_OUTPUT(
src/libsquelch/Makefile src/libsquelch/Makefile
src/libhagelbarger/Makefile src/libhagelbarger/Makefile
src/libdtmf/Makefile src/libdtmf/Makefile
src/libtimer/Makefile
src/libselect/Makefile
src/libph_socket/Makefile
src/libsamplerate/Makefile src/libsamplerate/Makefile
src/libscrambler/Makefile src/libscrambler/Makefile
src/libemphasis/Makefile src/libemphasis/Makefile
@@ -92,8 +86,6 @@ AC_OUTPUT(
src/libserial/Makefile src/libserial/Makefile
src/libv27/Makefile src/libv27/Makefile
src/libmtp/Makefile src/libmtp/Makefile
src/libosmocc/Makefile
src/libg711/Makefile
src/libaaimage/Makefile src/libaaimage/Makefile
src/anetz/Makefile src/anetz/Makefile
src/bnetz/Makefile src/bnetz/Makefile
@@ -119,6 +111,7 @@ AC_OUTPUT(
src/test/Makefile src/test/Makefile
src/Makefile src/Makefile
extra/Makefile extra/Makefile
Makefile) Makefile])
AC_OUTPUT
+84 -15
View File
@@ -66,7 +66,7 @@ Create a virtual machine with the following settings:
<ul> <ul>
<li>Create a virtual machine with Ubuntu (64-bit) <li>Create a virtual machine with Ubuntu (64-bit)
<li>Choose memory size of at least 2 GB <li>Choose memory size of at least 2 GB
<li>Create a virtual hard drive with at least 10 GB <li>Create a virtual hard drive with 25 GB
<li>Emulate sound with output and input <li>Emulate sound with output and input
<li>Select USB 3.0 (xHCI) Controller <li>Select USB 3.0 (xHCI) Controller
</ul> </ul>
@@ -162,6 +162,18 @@ Installing osmocom-analog
</p> </p>
<p> <p>
You need two libraries, the first is "libosmocore". It is included with Ubuntu/Debian:
</p>
<pre>
# sudo apt install libosmocore-dev
</pre>
<p>
The next library is "libosmo-cc". It is not included with Ubuntu/Debian, so you need to install it from GIT.
Use GIT to clone latest source repository. First you need to install GIT. Use GIT to clone latest source repository. First you need to install GIT.
</p> </p>
@@ -172,6 +184,72 @@ Use GIT to clone latest source repository. First you need to install GIT.
</pre> </pre>
<p>
Then you can clone libosmo-cc from <a href="https://gitea.osmocom.org/cc/libosmo-cc">https://gitea.osmocom.org/cc/libosmo-cc</a> in your home directory.
</p>
<pre>
# cd ~
# git clone https://gitea.osmocom.org/cc/libosmo-cc
Cloning into 'libosmo-cc'...
...
</pre>
<p>
Before you can compile, you need to install <b>"autoconf"</b>, <b>"gcc"</b> and <b>"make"</b>, and <b>"libtool"</b>.
</p>
<pre>
# sudo apt install autoconf gcc make libtool
</pre>
<p>
Change to the repository directory and run <b>"autoconf -if"</b> once. This is only needed the first time compiling. It will generate the configure script.
</p>
<pre>
# cd libosmo-c
# autoreconf -if
...
#
</pre>
<p>
Run configure script. It will generate the make files depending on your supported libraries.
</p>
<pre>
# ./configure
</pre>
<p>
Run <b>"make"</b> and <b>"make install"</b> to build and install osmocom-analog. Don't forget to run <b>"ldconfig"</b>, so you library database does know it.
</p>
<pre>
# make clean # always do this after you pulled from GIT server
# make
...
# sudo make install
...
# sudo ldconfig
# cd ..
</pre>
<p>
Use GIT to clone latest source repository. First you need to install GIT.
</p>
<p> <p>
Then you can clone osmocom-analog from <a href="https://gitea.osmocom.org/cellular-infrastructure/osmocom-analog">https://gitea.osmocom.org/cellular-infrastructure/osmocom-analog</a> in your home directory. Then you can clone osmocom-analog from <a href="https://gitea.osmocom.org/cellular-infrastructure/osmocom-analog">https://gitea.osmocom.org/cellular-infrastructure/osmocom-analog</a> in your home directory.
</p> </p>
@@ -184,20 +262,6 @@ Cloning into 'osmocom-analog'...
... ...
</pre>
<p>
Before you can compile, you need to install <b>"autoconf"</b>, <b>"gcc"</b> and <b>"make"</b>.
</p>
<pre>
# sudo apt install autoconf
# sudo apt install gcc
# sudo apt install make
</pre>
</pre> </pre>
<p> <p>
@@ -242,6 +306,10 @@ configure: Compiling with FUSE
</pre> </pre>
<p style="background-color: yellow;">
If you get something like "sytax error near unexpected token `ALSA,`", check, if pkg-config is installed. If you just installed it, run "autoreconf -if" again and then "./configure".
</p>
<p> <p>
Run <b>"make"</b> and <b>"make install"</b> to build and install osmocom-analog. Run <b>"make"</b> and <b>"make install"</b> to build and install osmocom-analog.
</p> </p>
@@ -253,6 +321,7 @@ Run <b>"make"</b> and <b>"make install"</b> to build and install osmocom-analog.
... ...
# sudo make install # sudo make install
... ...
# cd ..
</pre> </pre>
+3 -2
View File
@@ -7,6 +7,7 @@ cnetz_memory_card_generator_SOURCES = \
main.c main.c
cnetz_memory_card_generator_LDADD = \ cnetz_memory_card_generator_LDADD = \
$(COMMON_LA) \ $(COMMON_LA) \
$(top_builddir)/src/libdebug/libdebug.a \ $(top_builddir)/src/liboptions/liboptions.a \
$(top_builddir)/src/liboptions/liboptions.a $(top_builddir)/src/liblogging/liblogging.a \
$(LIBOSMOCORE_LIBS)
+5 -2
View File
@@ -22,7 +22,7 @@
#include <stdint.h> #include <stdint.h>
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
#include <../src/libdebug/debug.h> #include <../src/liblogging/logging.h>
#include <../src/liboptions/options.h> #include <../src/liboptions/options.h>
int num_kanal = 1; int num_kanal = 1;
@@ -196,7 +196,8 @@ int main(int argc, char *argv[])
int argi; int argi;
int i; int i;
debuglevel = DEBUG_INFO; loglevel = LOGL_INFO;
logging_init();
add_options(); add_options();
@@ -255,3 +256,5 @@ inval_sub:
return 0; return 0;
} }
void osmo_cc_set_log_cat(void) {}
+1 -6
View File
@@ -1,8 +1,8 @@
AUTOMAKE_OPTIONS = foreign AUTOMAKE_OPTIONS = foreign
SUBDIRS = \ SUBDIRS = \
liblogging \
liboptions \ liboptions \
libdebug \
libmobile \ libmobile \
libdisplay \ libdisplay \
libsample \ libsample \
@@ -14,9 +14,6 @@ SUBDIRS = \
libsquelch \ libsquelch \
libhagelbarger \ libhagelbarger \
libdtmf \ libdtmf \
libtimer \
libselect \
libph_socket \
libsamplerate \ libsamplerate \
libscrambler \ libscrambler \
libemphasis \ libemphasis \
@@ -30,8 +27,6 @@ SUBDIRS = \
libserial \ libserial \
libv27 \ libv27 \
libmtp \ libmtp \
libosmocc \
libg711 \
libaaimage libaaimage
if HAVE_ALSA if HAVE_ALSA
+9 -15
View File
@@ -31,23 +31,21 @@ amps_LDADD = \
libamps.a \ libamps.a \
libusatone.a \ libusatone.a \
$(top_builddir)/src/liboptions/liboptions.a \ $(top_builddir)/src/liboptions/liboptions.a \
$(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libmobile/libmobile.a \ $(top_builddir)/src/libmobile/libmobile.a \
$(top_builddir)/src/libosmocc/libosmocc.a \
$(top_builddir)/src/libdisplay/libdisplay.a \ $(top_builddir)/src/libdisplay/libdisplay.a \
$(top_builddir)/src/libcompandor/libcompandor.a \ $(top_builddir)/src/libcompandor/libcompandor.a \
$(top_builddir)/src/libgoertzel/libgoertzel.a \ $(top_builddir)/src/libgoertzel/libgoertzel.a \
$(top_builddir)/src/libjitter/libjitter.a \ $(top_builddir)/src/libjitter/libjitter.a \
$(top_builddir)/src/libtimer/libtimer.a \
$(top_builddir)/src/libselect/libselect.a \
$(top_builddir)/src/libsamplerate/libsamplerate.a \ $(top_builddir)/src/libsamplerate/libsamplerate.a \
$(top_builddir)/src/libemphasis/libemphasis.a \ $(top_builddir)/src/libemphasis/libemphasis.a \
$(top_builddir)/src/libfm/libfm.a \ $(top_builddir)/src/libfm/libfm.a \
$(top_builddir)/src/libfilter/libfilter.a \ $(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/libwave/libwave.a \ $(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \ $(top_builddir)/src/libsample/libsample.a \
$(top_builddir)/src/libg711/libg711.a \
$(top_builddir)/src/libaaimage/libaaimage.a \ $(top_builddir)/src/libaaimage/libaaimage.a \
$(top_builddir)/src/liblogging/liblogging.a \
$(LIBOSMOCORE_LIBS) \
$(LIBOSMOCC_LIBS) \
-lm -lm
if HAVE_ALSA if HAVE_ALSA
@@ -76,23 +74,21 @@ tacs_LDADD = \
$(COMMON_LA) \ $(COMMON_LA) \
libamps.a \ libamps.a \
$(top_builddir)/src/liboptions/liboptions.a \ $(top_builddir)/src/liboptions/liboptions.a \
$(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libmobile/libmobile.a \ $(top_builddir)/src/libmobile/libmobile.a \
$(top_builddir)/src/libosmocc/libosmocc.a \
$(top_builddir)/src/libdisplay/libdisplay.a \ $(top_builddir)/src/libdisplay/libdisplay.a \
$(top_builddir)/src/libcompandor/libcompandor.a \ $(top_builddir)/src/libcompandor/libcompandor.a \
$(top_builddir)/src/libgoertzel/libgoertzel.a \ $(top_builddir)/src/libgoertzel/libgoertzel.a \
$(top_builddir)/src/libjitter/libjitter.a \ $(top_builddir)/src/libjitter/libjitter.a \
$(top_builddir)/src/libtimer/libtimer.a \
$(top_builddir)/src/libselect/libselect.a \
$(top_builddir)/src/libsamplerate/libsamplerate.a \ $(top_builddir)/src/libsamplerate/libsamplerate.a \
$(top_builddir)/src/libemphasis/libemphasis.a \ $(top_builddir)/src/libemphasis/libemphasis.a \
$(top_builddir)/src/libfm/libfm.a \ $(top_builddir)/src/libfm/libfm.a \
$(top_builddir)/src/libfilter/libfilter.a \ $(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/libwave/libwave.a \ $(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \ $(top_builddir)/src/libsample/libsample.a \
$(top_builddir)/src/libg711/libg711.a \
$(top_builddir)/src/libaaimage/libaaimage.a \ $(top_builddir)/src/libaaimage/libaaimage.a \
$(top_builddir)/src/liblogging/liblogging.a \
$(LIBOSMOCORE_LIBS) \
$(LIBOSMOCC_LIBS) \
-lm -lm
if HAVE_ALSA if HAVE_ALSA
@@ -120,23 +116,21 @@ jtacs_LDADD = \
$(COMMON_LA) \ $(COMMON_LA) \
libamps.a \ libamps.a \
$(top_builddir)/src/liboptions/liboptions.a \ $(top_builddir)/src/liboptions/liboptions.a \
$(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libmobile/libmobile.a \ $(top_builddir)/src/libmobile/libmobile.a \
$(top_builddir)/src/libosmocc/libosmocc.a \
$(top_builddir)/src/libdisplay/libdisplay.a \ $(top_builddir)/src/libdisplay/libdisplay.a \
$(top_builddir)/src/libcompandor/libcompandor.a \ $(top_builddir)/src/libcompandor/libcompandor.a \
$(top_builddir)/src/libgoertzel/libgoertzel.a \ $(top_builddir)/src/libgoertzel/libgoertzel.a \
$(top_builddir)/src/libjitter/libjitter.a \ $(top_builddir)/src/libjitter/libjitter.a \
$(top_builddir)/src/libtimer/libtimer.a \
$(top_builddir)/src/libselect/libselect.a \
$(top_builddir)/src/libsamplerate/libsamplerate.a \ $(top_builddir)/src/libsamplerate/libsamplerate.a \
$(top_builddir)/src/libemphasis/libemphasis.a \ $(top_builddir)/src/libemphasis/libemphasis.a \
$(top_builddir)/src/libfm/libfm.a \ $(top_builddir)/src/libfm/libfm.a \
$(top_builddir)/src/libfilter/libfilter.a \ $(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/libwave/libwave.a \ $(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \ $(top_builddir)/src/libsample/libsample.a \
$(top_builddir)/src/libg711/libg711.a \
$(top_builddir)/src/libaaimage/libaaimage.a \ $(top_builddir)/src/libaaimage/libaaimage.a \
$(top_builddir)/src/liblogging/liblogging.a \
$(LIBOSMOCORE_LIBS) \
$(LIBOSMOCC_LIBS) \
-lm -lm
if HAVE_ALSA if HAVE_ALSA
+118 -115
View File
@@ -43,10 +43,10 @@
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "../libmobile/call.h" #include "../libmobile/call.h"
#include "../libmobile/cause.h" #include "../libmobile/cause.h"
#include "../libosmocc/message.h" #include <osmocom/cc/message.h>
#include "amps.h" #include "amps.h"
#include "dsp.h" #include "dsp.h"
#include "frame.h" #include "frame.h"
@@ -57,15 +57,15 @@
/* Uncomment this to test SAT via loopback */ /* Uncomment this to test SAT via loopback */
//#define DEBUG_VC //#define DEBUG_VC
#define SAT_TO1 5.0 /* 5 sec to detect after setup */ #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 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_TRIES 2 /* how many times to page the phone */
#define PAGE_TO1 8.0 /* max time to wait for paging reply */ #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 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_TRIES 3 /* how many times to alert the phone */
#define ALERT_TO 0.6 /* max time to wait for alert confirm */ #define ALERT_TO 0,600000 /* max time to wait for alert confirm */
#define ANSWER_TO 60.0 /* max time to wait for answer */ #define ANSWER_TO 60,0 /* max time to wait for answer */
#define RELEASE_TIMER 5.0 /* max time to send release messages */ #define RELEASE_TIMER 5,0 /* max time to send release messages */
/* Convert channel number to frequency number of base station. /* Convert channel number to frequency number of base station.
Set 'uplink' to 1 to get frequency of mobile station. */ Set 'uplink' to 1 to get frequency of mobile station. */
@@ -395,7 +395,7 @@ static void amps_new_state(amps_t *amps, enum amps_state new_state)
{ {
if (amps->state == new_state) if (amps->state == new_state)
return; 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->state = new_state;
amps_display_status(); amps_display_status();
} }
@@ -429,7 +429,7 @@ int amps_channel_by_short_name(const char *short_name)
for (i = 0; amps_channels[i].short_name; i++) { for (i = 0; amps_channels[i].short_name; i++) {
if (!strcasecmp(amps_channels[i].short_name, short_name)) { 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; return amps_channels[i].chan_type;
} }
} }
@@ -528,15 +528,15 @@ int amps_create(const char *kanal, enum amps_chan_type chan_type, const char *de
/* check for channel number */ /* check for channel number */
if (amps_channel2freq(atoi(kanal), 0) == 0) { 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) 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; return -EINVAL;
} }
/* no paging channel (without control channel) support */ /* no paging channel (without control channel) support */
if (chan_type == CHAN_TYPE_PC) { 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; return -EINVAL;
} }
@@ -545,7 +545,7 @@ int amps_create(const char *kanal, enum amps_chan_type chan_type, const char *de
for (sender = sender_head; sender; sender = sender->next) { for (sender = sender_head; sender; sender = sender->next) {
amps = (amps_t *)sender; 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) { 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; return -EINVAL;
} }
} }
@@ -554,51 +554,51 @@ int amps_create(const char *kanal, enum amps_chan_type chan_type, const char *de
/* check if channel type matches channel number */ /* check if channel type matches channel number */
ct = amps_channel2type(atoi(kanal)); 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) { 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) { 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; return -EINVAL;
} }
/* only even channels */ /* only even channels */
if (jtacs && chan_type != CHAN_TYPE_VC && (atoi(kanal) & 1)) { 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; return -EINVAL;
} }
/* check if sid machtes channel band */ /* check if sid machtes channel band */
band = amps_channel2band(atoi(kanal)); band = amps_channel2band(atoi(kanal));
if (band[0] == 'A' && (sid & 1) == 0 && chan_type != CHAN_TYPE_VC) { 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; return -EINVAL;
} }
if (band[0] == 'B' && (sid & 1) == 1 && chan_type != CHAN_TYPE_VC) { 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; return -EINVAL;
} }
/* check if we use combined voice channel hack */ /* check if we use combined voice channel hack */
if (chan_type == CHAN_TYPE_CC_PC_VC) { 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 */ /* check if we selected a voice channel that i outside 20 MHz band */
if (chan_type == CHAN_TYPE_VC && atoi(kanal) > 666) { 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)); amps = calloc(1, sizeof(amps_t));
if (!amps) { if (!amps) {
PDEBUG(DAMPS, DEBUG_ERROR, "No memory!\n"); LOGP(DAMPS, LOGL_ERROR, "No memory!\n");
return -ENOMEM; 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 */ /* 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); 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) { 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; goto error;
} }
@@ -619,7 +619,7 @@ int amps_create(const char *kanal, enum amps_chan_type chan_type, const char *de
/* init audio processing */ /* init audio processing */
rc = dsp_init_sender(amps, tolerant); rc = dsp_init_sender(amps, tolerant);
if (rc < 0) { 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; goto error;
} }
@@ -634,7 +634,7 @@ int amps_create(const char *kanal, enum amps_chan_type chan_type, const char *de
// amps_new_state(amps, STATE_BUSY); // amps_new_state(amps, STATE_BUSY);
#endif #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; return 0;
@@ -650,11 +650,11 @@ void amps_destroy(sender_t *sender)
amps_t *amps = (amps_t *) sender; amps_t *amps = (amps_t *) sender;
transaction_t *trans; 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)) { while ((trans = amps->trans_list)) {
const char *number = amps_min2number(trans->min1, trans->min2); 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); destroy_transaction(trans);
} }
@@ -672,7 +672,7 @@ void amps_go_idle(amps_t *amps)
return; return;
if (amps->trans_list) { 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) if (amps->trans_list->callref)
call_up_release(amps->trans_list->callref, CAUSE_NORMAL); call_up_release(amps->trans_list->callref, CAUSE_NORMAL);
destroy_transaction(amps->trans_list); destroy_transaction(amps->trans_list);
@@ -681,14 +681,14 @@ void amps_go_idle(amps_t *amps)
amps_new_state(amps, STATE_IDLE); amps_new_state(amps, STATE_IDLE);
if (amps->chan_type != CHAN_TYPE_VC) { 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) if (amps->sender.loopback)
frame_length = 441; /* bits after sync (FOCC) */ frame_length = 441; /* bits after sync (FOCC) */
else else
frame_length = 247; /* bits after sync (RECC) */ frame_length = 247; /* bits after sync (RECC) */
amps_set_dsp_mode(amps, DSP_MODE_FRAME_RX_FRAME_TX, frame_length); amps_set_dsp_mode(amps, DSP_MODE_FRAME_RX_FRAME_TX, frame_length);
} else { } 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); amps_set_dsp_mode(amps, DSP_MODE_OFF, 0);
} }
} }
@@ -698,8 +698,8 @@ static void amps_release(transaction_t *trans, uint8_t cause)
{ {
amps_t *amps = trans->amps; amps_t *amps = trans->amps;
timer_stop(&trans->timer); osmo_timer_del(&trans->timer);
timer_start(&trans->timer, RELEASE_TIMER); osmo_timer_schedule(&trans->timer, RELEASE_TIMER);
trans_new_state(trans, TRANS_CALL_RELEASE); trans_new_state(trans, TRANS_CALL_RELEASE);
trans->chan = 0; trans->chan = 0;
trans->msg_type = 0; trans->msg_type = 0;
@@ -722,14 +722,14 @@ void amps_rx_signaling_tone(amps_t *amps, int tone, double quality)
{ {
transaction_t *trans = amps->trans_list; transaction_t *trans = amps->trans_list;
if (trans == NULL) { 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; return;
} }
if (tone) 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 else
PDEBUG_CHAN(DAMPS, DEBUG_INFO, "Lost Signaling Tone signal\n"); LOGP_CHAN(DAMPS, LOGL_INFO, "Lost Signaling Tone signal\n");
switch (trans->state) { switch (trans->state) {
case TRANS_CALL_MO_ASSIGN_CONFIRM: // should not happen case TRANS_CALL_MO_ASSIGN_CONFIRM: // should not happen
@@ -740,7 +740,7 @@ void amps_rx_signaling_tone(amps_t *amps, int tone, double quality)
case TRANS_CALL_RELEASE: case TRANS_CALL_RELEASE:
case TRANS_CALL_RELEASE_SEND: case TRANS_CALL_RELEASE_SEND:
/* also loosing singaling tone indicates release confirm (after alerting) */ /* also loosing singaling tone indicates release confirm (after alerting) */
timer_stop(&trans->timer); osmo_timer_del(&trans->timer);
if (trans->callref) if (trans->callref)
call_up_release(trans->callref, CAUSE_NORMAL); call_up_release(trans->callref, CAUSE_NORMAL);
destroy_transaction(trans); destroy_transaction(trans);
@@ -751,24 +751,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_SEND: // should not happen
case TRANS_CALL_MT_ALERT_CONFIRM: case TRANS_CALL_MT_ALERT_CONFIRM:
if (tone) { if (tone) {
timer_stop(&trans->timer); osmo_timer_del(&trans->timer);
call_up_alerting(trans->callref); call_up_alerting(trans->callref);
amps_set_dsp_mode(amps, DSP_MODE_AUDIO_RX_AUDIO_TX, 0); amps_set_dsp_mode(amps, DSP_MODE_AUDIO_RX_AUDIO_TX, 0);
trans_new_state(trans, TRANS_CALL_MT_ANSWER_WAIT); trans_new_state(trans, TRANS_CALL_MT_ANSWER_WAIT);
timer_start(&trans->timer, ANSWER_TO); osmo_timer_schedule(&trans->timer, ANSWER_TO);
} }
break; break;
case TRANS_CALL_MT_ANSWER_WAIT: case TRANS_CALL_MT_ANSWER_WAIT:
if (!tone) { if (!tone) {
timer_stop(&trans->timer); osmo_timer_del(&trans->timer);
if (!trans->sat_detected) 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)); call_up_answer(trans->callref, amps_min2number(trans->min1, trans->min2));
trans_new_state(trans, TRANS_CALL); trans_new_state(trans, TRANS_CALL);
} }
break; break;
default: 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");
} }
} }
@@ -776,7 +776,7 @@ void amps_rx_sat(amps_t *amps, int tone, double quality)
{ {
transaction_t *trans = amps->trans_list; transaction_t *trans = amps->trans_list;
if (trans == NULL) { 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; return;
} }
@@ -793,40 +793,40 @@ void amps_rx_sat(amps_t *amps, int tone, double quality)
&& trans->state != TRANS_CALL_MT_ALERT_CONFIRM && trans->state != TRANS_CALL_MT_ALERT_CONFIRM
&& trans->state != TRANS_CALL_MT_ANSWER_WAIT && trans->state != TRANS_CALL_MT_ANSWER_WAIT
&& trans->state != TRANS_CALL) { && 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; return;
} }
if (tone) { 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; trans->sat_detected = 1;
} else { } else {
PDEBUG(DAMPS, DEBUG_INFO, "Lost SAT signal\n"); LOGP(DAMPS, LOGL_INFO, "Lost SAT signal\n");
trans->sat_detected = 0; trans->sat_detected = 0;
} }
/* initial SAT received */ /* initial SAT received */
if (tone && trans->state == TRANS_CALL_MO_ASSIGN_CONFIRM) { if (tone && trans->state == TRANS_CALL_MO_ASSIGN_CONFIRM) {
PDEBUG_CHAN(DAMPS, DEBUG_INFO, "Confirm from mobile (SAT) received\n"); LOGP_CHAN(DAMPS, LOGL_INFO, "Confirm from mobile (SAT) received\n");
timer_stop(&trans->timer); osmo_timer_del(&trans->timer);
trans_new_state(trans, TRANS_CALL); trans_new_state(trans, TRANS_CALL);
amps_set_dsp_mode(amps, DSP_MODE_AUDIO_RX_AUDIO_TX, 0); amps_set_dsp_mode(amps, DSP_MODE_AUDIO_RX_AUDIO_TX, 0);
} }
if (tone && trans->state == TRANS_CALL_MT_ASSIGN_CONFIRM) { if (tone && trans->state == TRANS_CALL_MT_ASSIGN_CONFIRM) {
PDEBUG_CHAN(DAMPS, DEBUG_INFO, "Confirm from mobile (SAT) received\n"); LOGP_CHAN(DAMPS, LOGL_INFO, "Confirm from mobile (SAT) received\n");
timer_stop(&trans->timer); osmo_timer_del(&trans->timer);
trans->alert_retry = 1; trans->alert_retry = 1;
trans_new_state(trans, TRANS_CALL_MT_ALERT); trans_new_state(trans, TRANS_CALL_MT_ALERT);
amps_set_dsp_mode(amps, DSP_MODE_AUDIO_RX_FRAME_TX, 0); amps_set_dsp_mode(amps, DSP_MODE_AUDIO_RX_FRAME_TX, 0);
} }
if (tone) { if (tone) {
timer_stop(&trans->timer); osmo_timer_del(&trans->timer);
} else { } else {
if (!trans->dtx) if (!trans->dtx)
timer_start(&trans->timer, SAT_TO2); osmo_timer_schedule(&trans->timer, SAT_TO2);
else else
timer_stop(&trans->timer); osmo_timer_del(&trans->timer);
} }
if (amps->sender.loopback) if (amps->sender.loopback)
@@ -843,50 +843,50 @@ 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 */ /* check if we are busy, so we ignore all signaling */
if (amps->state == STATE_BUSY) { 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; return;
} }
if (order == 13 && (ordq == 0 || ordq == 1 || ordq == 2 || ordq == 3) && msg_type == 0) { if (order == 13 && (ordq == 0 || ordq == 1 || ordq == 2 || ordq == 3) && msg_type == 0) {
PDEBUG_CHAN(DAMPS, DEBUG_INFO, "Registration %s (ESN = %s, %s, %s)\n", callerid, esn_to_string(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: _register:
numbering(callerid, &carrier, &country, &national_number); numbering(callerid, &carrier, &country, &national_number);
if (carrier) if (carrier)
PDEBUG_CHAN(DAMPS, DEBUG_INFO, " -> Home carrier: %s\n", carrier); LOGP_CHAN(DAMPS, LOGL_INFO, " -> Home carrier: %s\n", carrier);
if (country) 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) 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); trans = create_transaction(amps, TRANS_REGISTER_ACK, min1, min2, esn, msg_type, ordq, order, 0);
if (!trans) { if (!trans) {
PDEBUG(DAMPS, DEBUG_ERROR, "Failed to create transaction\n"); LOGP(DAMPS, LOGL_ERROR, "Failed to create transaction\n");
return; return;
} }
} else } else
if (order == 13 && ordq == 3 && msg_type == 1) { if (order == 13 && ordq == 3 && msg_type == 1) {
PDEBUG_CHAN(DAMPS, DEBUG_INFO, "Registration - Power Down %s (ESN = %s, %s, %s)\n", callerid, esn_to_string(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; goto _register;
} else } else
if (order == 0 && ordq == 0 && msg_type == 0) { if (order == 0 && ordq == 0 && msg_type == 0) {
if (!dialing) if (!dialing)
PDEBUG_CHAN(DAMPS, DEBUG_INFO, "Paging reply %s (ESN = %s, %s, %s)\n", callerid, esn_to_string(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 else
PDEBUG_CHAN(DAMPS, DEBUG_INFO, "Call %s -> %s (ESN = %s, %s, %s)\n", callerid, dialing, esn_to_string(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); trans = search_transaction_number(amps, min1, min2);
if (!trans && !dialing) { 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; goto reject;
} }
if (trans && dialing) 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(); vc = search_free_vc();
if (!vc) { if (!vc) {
PDEBUG(DAMPS, DEBUG_NOTICE, "No free channel, rejecting call\n"); LOGP(DAMPS, LOGL_NOTICE, "No free channel, rejecting call\n");
reject: reject:
if (!trans) { if (!trans) {
trans = create_transaction(amps, TRANS_CALL_REJECT, min1, min2, esn, 0, 0, 3, 0); trans = create_transaction(amps, TRANS_CALL_REJECT, min1, min2, esn, 0, 0, 3, 0);
if (!trans) { if (!trans) {
PDEBUG(DAMPS, DEBUG_ERROR, "Failed to create transaction\n"); LOGP(DAMPS, LOGL_ERROR, "Failed to create transaction\n");
return; return;
} }
} else { } else {
@@ -902,7 +902,7 @@ reject:
trans = create_transaction(amps, TRANS_CALL_MO_ASSIGN, min1, min2, esn, 0, 0, 0, atoi(vc->sender.kanal)); 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); strncpy(trans->dialing, dialing, sizeof(trans->dialing) - 1);
if (!trans) { if (!trans) {
PDEBUG(DAMPS, DEBUG_ERROR, "Failed to create transaction\n"); LOGP(DAMPS, LOGL_ERROR, "Failed to create transaction\n");
return; return;
} }
} else { } else {
@@ -912,13 +912,13 @@ reject:
/* if we support DTX and also the phone does, we set DTX state of transaction */ /* if we support DTX and also the phone does, we set DTX state of transaction */
if (amps->si.word2.dtx) { if (amps->si.word2.dtx) {
if ((scm & 4)) { 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; trans->dtx = 1;
} else } 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 } 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);
} }
/* /*
@@ -939,7 +939,7 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
/* 2. check if the subscriber is attached */ /* 2. check if the subscriber is attached */
// if (!find_db(min1, min2)) { // 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; // return -CAUSE_OUTOFORDER;
// } // }
@@ -952,29 +952,29 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
break; break;
} }
if (sender) { 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; return -CAUSE_BUSY;
} }
/* 4. check if all senders are busy, return NOCHANNEL */ /* 4. check if all senders are busy, return NOCHANNEL */
if (!search_free_vc()) { 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; return -CAUSE_NOCHANNEL;
} }
/* 5. check if we have (currently) no paging channel, return NOCHANNEL */ /* 5. check if we have (currently) no paging channel, return NOCHANNEL */
amps = search_pc(); amps = search_pc();
if (!amps) { 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; 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 */ /* 6. trying to page mobile station */
trans = create_transaction(amps, TRANS_PAGE, min1, min2, 0, 0, 0, 0, 0); trans = create_transaction(amps, TRANS_PAGE, min1, min2, 0, 0, 0, 0, 0);
if (!trans) { if (!trans) {
PDEBUG(DAMPS, DEBUG_ERROR, "Failed to create transaction\n"); LOGP(DAMPS, LOGL_ERROR, "Failed to create transaction\n");
return -CAUSE_TEMPFAIL; return -CAUSE_TEMPFAIL;
} }
trans->callref = callref; trans->callref = callref;
@@ -1002,7 +1002,7 @@ void call_down_disconnect(int callref, int cause)
amps_t *amps; amps_t *amps;
transaction_t *trans; 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) { for (sender = sender_head; sender; sender = sender->next) {
amps = (amps_t *) sender; amps = (amps_t *) sender;
@@ -1012,7 +1012,7 @@ void call_down_disconnect(int callref, int cause)
break; break;
} }
if (!sender) { 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); call_up_release(callref, CAUSE_INVALCALLREF);
return; return;
} }
@@ -1027,12 +1027,12 @@ void call_down_disconnect(int callref, int cause)
|| trans->state == TRANS_CALL_MT_ALERT_SEND || trans->state == TRANS_CALL_MT_ALERT_SEND
|| trans->state == TRANS_CALL_MT_ALERT_CONFIRM || trans->state == TRANS_CALL_MT_ALERT_CONFIRM
|| trans->state == TRANS_CALL_MT_ANSWER_WAIT) { || 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); amps_release(trans, cause);
} }
return; return;
default: 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); call_up_release(callref, cause);
trans->callref = 0; trans->callref = 0;
destroy_transaction(trans); destroy_transaction(trans);
@@ -1047,7 +1047,7 @@ void call_down_release(int callref, int cause)
amps_t *amps; amps_t *amps;
transaction_t *trans; 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) { for (sender = sender_head; sender; sender = sender->next) {
amps = (amps_t *) sender; amps = (amps_t *) sender;
@@ -1057,7 +1057,7 @@ void call_down_release(int callref, int cause)
break; break;
} }
if (!sender) { 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 */ /* don't send release, because caller already released */
return; return;
} }
@@ -1068,11 +1068,11 @@ void call_down_release(int callref, int cause)
case DSP_MODE_AUDIO_RX_SILENCE_TX: case DSP_MODE_AUDIO_RX_SILENCE_TX:
case DSP_MODE_AUDIO_RX_AUDIO_TX: case DSP_MODE_AUDIO_RX_AUDIO_TX:
case DSP_MODE_AUDIO_RX_FRAME_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); amps_release(trans, cause);
break; break;
default: 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); destroy_transaction(trans);
amps_go_idle(amps); amps_go_idle(amps);
} }
@@ -1109,47 +1109,47 @@ void transaction_timeout(void *data)
switch (trans->state) { switch (trans->state) {
case TRANS_CALL_MO_ASSIGN_CONFIRM: case TRANS_CALL_MO_ASSIGN_CONFIRM:
case TRANS_CALL_MT_ASSIGN_CONFIRM: case TRANS_CALL_MT_ASSIGN_CONFIRM:
PDEBUG_CHAN(DAMPS, DEBUG_NOTICE, "Timeout after %.0f seconds not receiving initial SAT signal.\n", trans->timer.duration); LOGP_CHAN(DAMPS, LOGL_NOTICE, "Timeout after %ld seconds not receiving initial SAT signal.\n", trans->timer.timeout.tv_sec);
PDEBUG_CHAN(DAMPS, DEBUG_INFO, "Release call towards network.\n"); LOGP_CHAN(DAMPS, LOGL_INFO, "Release call towards network.\n");
amps_release(amps->trans_list, CAUSE_TEMPFAIL); amps_release(amps->trans_list, CAUSE_TEMPFAIL);
break; break;
case TRANS_CALL: case TRANS_CALL:
PDEBUG_CHAN(DAMPS, DEBUG_NOTICE, "Timeout after %.0f seconds loosing SAT signal.\n", trans->timer.duration); LOGP_CHAN(DAMPS, LOGL_NOTICE, "Timeout after %ld seconds loosing SAT signal.\n", trans->timer.timeout.tv_sec);
PDEBUG_CHAN(DAMPS, DEBUG_INFO, "Release call towards network.\n"); LOGP_CHAN(DAMPS, LOGL_INFO, "Release call towards network.\n");
amps_release(amps->trans_list, CAUSE_TEMPFAIL); amps_release(amps->trans_list, CAUSE_TEMPFAIL);
break; break;
case TRANS_CALL_RELEASE: case TRANS_CALL_RELEASE:
case TRANS_CALL_RELEASE_SEND: 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); destroy_transaction(trans);
amps_go_idle(amps); amps_go_idle(amps);
break; break;
case TRANS_CALL_MT_ALERT_SEND: case TRANS_CALL_MT_ALERT_SEND:
case TRANS_CALL_MT_ALERT_CONFIRM: case TRANS_CALL_MT_ALERT_CONFIRM:
if (trans->alert_retry++ == ALERT_TRIES) { 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); amps_release(trans, CAUSE_TEMPFAIL);
} else { } 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); trans_new_state(trans, TRANS_CALL_MT_ALERT);
amps_set_dsp_mode(amps, DSP_MODE_AUDIO_RX_FRAME_TX, 0); amps_set_dsp_mode(amps, DSP_MODE_AUDIO_RX_FRAME_TX, 0);
} }
break; break;
case TRANS_CALL_MT_ANSWER_WAIT: 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); amps_release(trans, CAUSE_NOANSWER);
break; break;
case TRANS_PAGE_REPLY: case TRANS_PAGE_REPLY:
if (trans->page_retry++ == PAGE_TRIES) { 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); amps_release(trans, CAUSE_OUTOFORDER);
} else { } 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); trans_new_state(trans, TRANS_PAGE);
} }
break; break;
default: 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);
} }
} }
@@ -1161,18 +1161,18 @@ static amps_t *assign_voice_channel(transaction_t *trans)
vc = search_channel(trans->chan); vc = search_channel(trans->chan);
if (!vc) { 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); amps_release(trans, CAUSE_NOCHANNEL);
return NULL; return NULL;
} }
if (vc == amps) 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 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... */ /* switch channel... */
timer_start(&trans->timer, SAT_TO1); osmo_timer_schedule(&trans->timer, SAT_TO1);
/* make channel busy */ /* make channel busy */
amps_new_state(vc, STATE_BUSY); amps_new_state(vc, STATE_BUSY);
/* relink */ /* relink */
@@ -1185,7 +1185,7 @@ static amps_t *assign_voice_channel(transaction_t *trans)
char esn_text[16]; char esn_text[16];
sprintf(esn_text, "%u", trans->esn); sprintf(esn_text, "%u", trans->esn);
/* setup call */ /* 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); trans->callref = call_up_setup(callerid, trans->dialing, OSMO_CC_NETWORK_AMPS_ESN, esn_text);
} }
@@ -1204,52 +1204,55 @@ again:
switch (trans->state) { switch (trans->state) {
case TRANS_REGISTER_ACK: 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); trans_new_state(trans, TRANS_REGISTER_ACK_SEND);
return trans; return trans;
case TRANS_REGISTER_ACK_SEND: case TRANS_REGISTER_ACK_SEND:
destroy_transaction(trans); destroy_transaction(trans);
goto again; goto again;
case TRANS_CALL_REJECT: 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); trans_new_state(trans, TRANS_CALL_REJECT_SEND);
return trans; return trans;
case TRANS_CALL_REJECT_SEND: case TRANS_CALL_REJECT_SEND:
destroy_transaction(trans); destroy_transaction(trans);
goto again; goto again;
case TRANS_CALL_MO_ASSIGN: 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); trans_new_state(trans, TRANS_CALL_MO_ASSIGN_SEND);
return trans; return trans;
case TRANS_CALL_MO_ASSIGN_SEND: case TRANS_CALL_MO_ASSIGN_SEND:
vc = assign_voice_channel(trans); vc = assign_voice_channel(trans);
if (vc) { 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() */ /* timer and other things are processed at assign_voice_channel() */
trans_new_state(trans, TRANS_CALL_MO_ASSIGN_CONFIRM); trans_new_state(trans, TRANS_CALL_MO_ASSIGN_CONFIRM);
amps_set_dsp_mode(vc, DSP_MODE_AUDIO_RX_SILENCE_TX, 0); amps_set_dsp_mode(vc, DSP_MODE_AUDIO_RX_SILENCE_TX, 0);
} }
return NULL; return NULL;
case TRANS_CALL_MT_ASSIGN: 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); trans_new_state(trans, TRANS_CALL_MT_ASSIGN_SEND);
return trans; return trans;
case TRANS_CALL_MT_ASSIGN_SEND: case TRANS_CALL_MT_ASSIGN_SEND:
vc = assign_voice_channel(trans); vc = assign_voice_channel(trans);
if (vc) { 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() */ /* timer and other things are processed at assign_voice_channel() */
trans_new_state(trans, TRANS_CALL_MT_ASSIGN_CONFIRM); trans_new_state(trans, TRANS_CALL_MT_ASSIGN_CONFIRM);
amps_set_dsp_mode(vc, DSP_MODE_AUDIO_RX_SILENCE_TX, 0); amps_set_dsp_mode(vc, DSP_MODE_AUDIO_RX_SILENCE_TX, 0);
} }
return NULL; return NULL;
case TRANS_PAGE: 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); trans_new_state(trans, TRANS_PAGE_SEND);
return trans; return trans;
case TRANS_PAGE_SEND: case TRANS_PAGE_SEND:
trans_new_state(trans, TRANS_PAGE_REPLY); 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; return NULL;
default: default:
return NULL; return NULL;
@@ -1266,11 +1269,11 @@ transaction_t *amps_tx_frame_fvc(amps_t *amps)
switch (trans->state) { switch (trans->state) {
case TRANS_CALL_RELEASE: 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); trans_new_state(trans, TRANS_CALL_RELEASE_SEND);
return trans; return trans;
case TRANS_CALL_RELEASE_SEND: 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; return trans;
case TRANS_CALL_MT_ALERT: case TRANS_CALL_MT_ALERT:
trans->chan = 0; trans->chan = 0;
@@ -1278,17 +1281,17 @@ transaction_t *amps_tx_frame_fvc(amps_t *amps)
trans->ordq = 0; 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 // "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]) { 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; trans->order = 17;
} else { } else {
PDEBUG_CHAN(DAMPS, DEBUG_INFO, "Sending alerting\n"); LOGP_CHAN(DAMPS, LOGL_INFO, "Sending alerting\n");
trans->order = 1; trans->order = 1;
} }
trans_new_state(trans, TRANS_CALL_MT_ALERT_SEND); trans_new_state(trans, TRANS_CALL_MT_ALERT_SEND);
return trans; return trans;
case TRANS_CALL_MT_ALERT_SEND: case TRANS_CALL_MT_ALERT_SEND:
PDEBUG_CHAN(DAMPS, DEBUG_INFO, "Alerting was sent, continue waiting for ST or timeout\n"); LOGP_CHAN(DAMPS, LOGL_INFO, "Alerting was sent, continue waiting for ST or timeout\n");
timer_start(&trans->timer, ALERT_TO); osmo_timer_schedule(&trans->timer, ALERT_TO);
amps_set_dsp_mode(amps, DSP_MODE_AUDIO_RX_SILENCE_TX, 0); amps_set_dsp_mode(amps, DSP_MODE_AUDIO_RX_SILENCE_TX, 0);
trans_new_state(trans, TRANS_CALL_MT_ALERT_CONFIRM); trans_new_state(trans, TRANS_CALL_MT_ALERT_CONFIRM);
return NULL; return NULL;
+1 -1
View File
@@ -1,6 +1,6 @@
#include "../libgoertzel/goertzel.h" #include "../libgoertzel/goertzel.h"
#include "../libmobile/sender.h" #include "../libmobile/sender.h"
#include "../libtimer/timer.h" #include <osmocom/core/timer.h>
#include "../libcompandor/compandor.h" #include "../libcompandor/compandor.h"
typedef struct amps amps_t; typedef struct amps amps_t;
#include "sysinfo.h" #include "sysinfo.h"
+28 -27
View File
@@ -82,8 +82,9 @@
#include <errno.h> #include <errno.h>
#include <math.h> #include <math.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "../libmobile/call.h" #include "../libmobile/call.h"
#include "../libmobile/get_time.h"
#include "amps.h" #include "amps.h"
#include "frame.h" #include "frame.h"
#include "dsp.h" #include "dsp.h"
@@ -146,7 +147,7 @@ void dsp_init(void)
int i; int i;
double s; 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++) { for (i = 0; i < 65536; i++) {
s = sin((double)i / 65536.0 * 2.0 * PI); s = sin((double)i / 65536.0 * 2.0 * PI);
dsp_sine_sat[i] = s * ((!tacs) ? AMPS_SAT_DEVIATION : TACS_SAT_DEVIATION); dsp_sine_sat[i] = s * ((!tacs) ? AMPS_SAT_DEVIATION : TACS_SAT_DEVIATION);
@@ -171,7 +172,7 @@ static void dsp_init_ramp(amps_t *amps)
double c; double c;
int i; 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++) { for (i = 0; i < 256; i++) {
c = cos((double)i / 256.0 * PI); c = cos((double)i / 256.0 * PI);
#if 0 #if 0
@@ -198,7 +199,7 @@ int dsp_init_sender(amps_t *amps, int tolerant)
/* attack (3ms) and recovery time (13.5ms) according to amps specs */ /* attack (3ms) and recovery time (13.5ms) according to amps specs */
setup_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 */ /* set modulation parameters */
sender_set_fm(&amps->sender, sender_set_fm(&amps->sender,
@@ -208,18 +209,18 @@ int dsp_init_sender(amps_t *amps, int tolerant)
(!tacs) ? AMPS_MAX_DISPLAY : TACS_MAX_DISPLAY); (!tacs) ? AMPS_MAX_DISPLAY : TACS_MAX_DISPLAY);
if (amps->sender.samplerate < 96000) { 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; return -EINVAL;
} }
amps->fsk_bitduration = (double)amps->sender.samplerate / (double)((!tacs) ? AMPS_BITRATE : TACS_BITRATE); amps->fsk_bitduration = (double)amps->sender.samplerate / (double)((!tacs) ? AMPS_BITRATE : TACS_BITRATE);
amps->fsk_bitstep = 1.0 / amps->fsk_bitduration; 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 */ 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); spl = calloc(sizeof(*spl), amps->fsk_tx_buffer_size);
if (!spl) { if (!spl) {
PDEBUG(DDSP, DEBUG_ERROR, "No memory!\n"); LOGP(DDSP, LOGL_ERROR, "No memory!\n");
rc = -ENOMEM; rc = -ENOMEM;
goto error; goto error;
} }
@@ -230,12 +231,12 @@ int dsp_init_sender(amps_t *amps, int tolerant)
amps->fsk_rx_window_begin = half >> 1; amps->fsk_rx_window_begin = half >> 1;
amps->fsk_rx_window_half = half; amps->fsk_rx_window_half = half;
amps->fsk_rx_window_end = amps->fsk_rx_window_length - (half >> 1); 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); LOGP(DDSP, LOGL_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); 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);
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, " -> 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); spl = calloc(sizeof(*amps->fsk_rx_window), amps->fsk_rx_window_length);
if (!spl) { if (!spl) {
PDEBUG(DDSP, DEBUG_ERROR, "No memory!\n"); LOGP(DDSP, LOGL_ERROR, "No memory!\n");
rc = -ENOMEM; rc = -ENOMEM;
goto error; goto error;
} }
@@ -252,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); amps->sat_samples = (int)((double)amps->sender.samplerate * (1.0 / (SAT_BANDWIDTH / 2.0)) + 0.5);
spl = calloc(sizeof(*spl), amps->sat_samples); spl = calloc(sizeof(*spl), amps->sat_samples);
if (!spl) { if (!spl) {
PDEBUG(DDSP, DEBUG_ERROR, "No memory!\n"); LOGP(DDSP, LOGL_ERROR, "No memory!\n");
return -ENOMEM; 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; amps->sat_filter_spl = spl;
/* count SAT tones */ /* count SAT tones */
@@ -289,7 +290,7 @@ error:
/* Cleanup transceiver instance. */ /* Cleanup transceiver instance. */
void dsp_cleanup_sender(amps_t *amps) 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) if (amps->fsk_tx_buffer)
free(amps->fsk_tx_buffer); free(amps->fsk_tx_buffer);
@@ -770,7 +771,7 @@ static void sat_decode(amps_t *amps, sample_t *samples, int length)
/* debug SAT */ /* debug SAT */
if (++amps->sat_print == SAT_PRINT) { 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; amps->sat_print = 0;
} }
@@ -779,8 +780,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); display_measurements_update(amps->dmp_sat_quality, sat_quality * 100.0, 0.0);
/* debug signaling tone */ /* debug signaling tone */
if (amps->sender.loopback || debuglevel == DEBUG_DEBUG) { if (amps->sender.loopback || loglevel == LOGL_DEBUG) {
PDEBUG_CHAN(DDSP, debuglevel, "Signaling Tone level %.2f%% quality %.0f%%\n", sig_level * 100.0, sig_quality * 100.0); 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 */ /* mute if SAT quality or level is below threshold */
@@ -796,7 +797,7 @@ static void sat_decode(amps_t *amps, sample_t *samples, int length)
if (amps->sat_detect_count == SAT_DETECT_COUNT) { if (amps->sat_detect_count == SAT_DETECT_COUNT) {
amps->sat_detected = 1; amps->sat_detected = 1;
amps->sat_detect_count = 0; 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); amps_rx_sat(amps, 1, sat_quality);
} }
} else } else
@@ -807,7 +808,7 @@ static void sat_decode(amps_t *amps, sample_t *samples, int length)
if (amps->sat_detect_count == SAT_LOST_COUNT) { if (amps->sat_detect_count == SAT_LOST_COUNT) {
amps->sat_detected = 0; amps->sat_detected = 0;
amps->sat_detect_count = 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); amps_rx_sat(amps, 0, 0.0);
} }
} else } else
@@ -821,7 +822,7 @@ static void sat_decode(amps_t *amps, sample_t *samples, int length)
if (amps->sig_detect_count == SIG_DETECT_COUNT) { if (amps->sig_detect_count == SIG_DETECT_COUNT) {
amps->sig_detected = 1; amps->sig_detected = 1;
amps->sig_detect_count = 0; 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); amps_rx_signaling_tone(amps, 1, sig_quality);
} }
} else } else
@@ -832,7 +833,7 @@ static void sat_decode(amps_t *amps, sample_t *samples, int length)
if (amps->sig_detect_count == SIG_LOST_COUNT) { if (amps->sig_detect_count == SIG_LOST_COUNT) {
amps->sig_detected = 0; amps->sig_detected = 0;
amps->sig_detect_count = 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); amps_rx_signaling_tone(amps, 0, 0.0);
} }
} else } else
@@ -918,7 +919,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. */ /* Reset SAT detection states, so ongoing tone will be detected again. */
static void sat_reset(amps_t *amps, const char *reason) 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_detected = 0;
amps->sat_detect_count = 0; amps->sat_detect_count = 0;
amps->sig_detected = 0; amps->sig_detected = 0;
@@ -935,28 +936,28 @@ void amps_set_dsp_mode(amps_t *amps, enum dsp_mode mode, int frame_length)
if (mode == DSP_MODE_FRAME_RX_FRAME_TX) { if (mode == DSP_MODE_FRAME_RX_FRAME_TX) {
/* reset SAT detection */ /* reset SAT detection */
sat_reset(amps, "Change to FOCC"); 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; amps->tx_focc_debugged = 0;
} }
if (amps->dsp_mode == DSP_MODE_FRAME_RX_FRAME_TX 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)) { && (mode == DSP_MODE_AUDIO_RX_AUDIO_TX || mode == DSP_MODE_AUDIO_RX_FRAME_TX || mode == DSP_MODE_AUDIO_RX_SILENCE_TX)) {
/* reset SAT detection */ /* reset SAT detection */
sat_reset(amps, "Change from FOCC to FVC"); 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 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)) { && (mode == DSP_MODE_AUDIO_RX_AUDIO_TX || mode == DSP_MODE_AUDIO_RX_FRAME_TX || mode == DSP_MODE_AUDIO_RX_SILENCE_TX)) {
/* reset SAT detection */ /* reset SAT detection */
sat_reset(amps, "Enable FVC"); 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) { if (mode == DSP_MODE_OFF) {
/* reset SAT detection */ /* reset SAT detection */
sat_reset(amps, "Disable FVC"); 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");
} }
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; amps->dsp_mode = mode;
if (frame_length) if (frame_length)
+2 -2
View File
@@ -22,10 +22,10 @@
#include <string.h> #include <string.h>
#include <pthread.h> #include <pthread.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "../libmobile/call.h" #include "../libmobile/call.h"
#include "../libmobile/cause.h" #include "../libmobile/cause.h"
#include "../libosmocc/message.h" #include <osmocom/cc/message.h>
#include "amps.h" #include "amps.h"
#include "esn.h" #include "esn.h"
+40 -39
View File
@@ -27,7 +27,8 @@
#include <math.h> #include <math.h>
#include <inttypes.h> #include <inttypes.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "../libmobile/get_time.h"
#include "amps.h" #include "amps.h"
#include "dsp.h" #include "dsp.h"
#include "frame.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; sum_bits += w->ie[i].bits;
if (debug) if (debug)
PDEBUG(DFRAME, DEBUG_INFO, "Transmit: %s\n", w->name); LOGP(DFRAME, LOGL_INFO, "Transmit: %s\n", w->name);
word = 0; word = 0;
for (i = 0; w->ie[i].name; i++) { for (i = 0; w->ie[i].name; i++) {
bits = w->ie[i].bits; 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]); word = (word << bits) | (value & cut_bits[bits]);
if (debug) { if (debug) {
if (amps_ie_desc[w->ie[i].ie].decoder) 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 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 */ /* 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) 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) { if (t4 == 3) {
t4 = 0; t4 = 0;
if (debug) 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++) for (i = 0; w->ie[i].name; i++)
bits_left += w->ie[i].bits; 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++) { for (i = 0; w->ie[i].name; i++) {
bits = w->ie[i].bits; bits = w->ie[i].bits;
bits_left -= bits; bits_left -= bits;
value = (word >> bits_left) & cut_bits[bits]; value = (word >> bits_left) & cut_bits[bits];
frame.ie[w->ie[i].ie] = value; frame.ie[w->ie[i].ie] = value;
if (amps_ie_desc[w->ie[i].ie].decoder) 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 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 */ /* 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) 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++; t4++;
if (t4 == 3) { if (t4 == 3) {
t4 = 0; 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 */ /* control message */
if (t1t2 != 3) { 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) if (t1t2 == 1)
amps->rx_focc_word_count = 1; amps->rx_focc_word_count = 1;
if (t1t2 == 0 || t1t2 == 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; w = &word2_extended_address_word_b;
goto decode; 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; return;
} }
@@ -3188,14 +3189,14 @@ static void amps_decode_word_focc(amps_t *amps, uint64_t word)
decode: decode:
if (!w) { if (!w) {
PDEBUG_CHAN(DFRAME, DEBUG_INFO, "Received Illegal Overhead Message\n"); LOGP_CHAN(DFRAME, LOGL_INFO, "Received Illegal Overhead Message\n");
return; return;
} }
frame = amps_decode_word(word, w); frame = amps_decode_word(word, w);
/* show control filler delay */ /* show control filler delay */
if (amps->sender.loopback && ohd == 1) 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 /* 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_word_count = 0;
amps->rx_recc_nawc = nawc; amps->rx_recc_nawc = nawc;
if (f == 0) { 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; return 0;
} }
} else { } else {
if (f == 1) { 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; return 0;
} }
amps->rx_recc_nawc--; amps->rx_recc_nawc--;
if (amps->rx_recc_nawc != 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; msg_count = amps->rx_recc_word_count;
if (msg_count == 8) { 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; return 0;
} }
@@ -3268,7 +3269,7 @@ static int amps_decode_word_recc(amps_t *amps, uint64_t word, int first)
if (!w) { if (!w) {
PDEBUG_CHAN(DFRAME, DEBUG_INFO, "Received Illegal RECC Message\n"); LOGP_CHAN(DFRAME, LOGL_INFO, "Received Illegal RECC Message\n");
goto done; 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]]; 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 (msg_count >= 3 && amps->rx_recc_nawc == 0) {
/* if no digit messages are present, send NULL as dial string (paging reply) */ /* 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'; bits[k] = '\0';
#ifdef BIT_DEBUGGING #ifdef BIT_DEBUGGING
if (debuglevel == DEBUG_DEBUG) { if (loglevel == LOGL_DEBUG) {
char text[64]; char text[64];
strncpy(text, bits, 23); strncpy(text, bits, 23);
text[23] = '\0'; 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++) { for (i = 0; i < 10; i++) {
strncpy(text, bits + 23 + i * 44, 44); strncpy(text, bits + 23 + i * 44, 44);
text[44] = '\0'; 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 #endif
@@ -3440,8 +3441,8 @@ static void amps_encode_fvc_bits(uint64_t word_a, char *bits)
bits[k] = '\0'; bits[k] = '\0';
#ifdef BIT_DEBUGGING #ifdef BIT_DEBUGGING
if (debuglevel == DEBUG_DEBUG) { if (loglevel == LOGL_DEBUG) {
PDEBUG(DFRAME, DEBUG_INFO, "TX FVC: %s\n", bits); LOGP(DFRAME, LOGL_INFO, "TX FVC: %s\n", bits);
} }
#endif #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) if (++amps->tx_focc_frame_count >= amps->si.overhead_repeat)
amps->tx_focc_frame_count = 0; amps->tx_focc_frame_count = 0;
if (debug) 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; amps->tx_focc_debugged = 1;
send: send:
@@ -3626,17 +3627,17 @@ static void amps_decode_bits_focc(amps_t *amps, const char *bits)
else else
idle = 0; idle = 0;
PDEBUG_CHAN(DFRAME, DEBUG_INFO, "RX FOCC: B/I = %s\n", (idle) ? "idle" : "busy"); LOGP_CHAN(DFRAME, LOGL_INFO, "RX FOCC: B/I = %s\n", (idle) ? "idle" : "busy");
if (debuglevel == DEBUG_DEBUG) { if (loglevel == LOGL_DEBUG) {
char text[64]; char text[64];
for (i = 0; i < 10; i++) { for (i = 0; i < 10; i++) {
strncpy(text, bits + i * 44, 44); strncpy(text, bits + i * 44, 44);
text[44] = '\0'; text[44] = '\0';
if ((i & 1) == 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 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++; crc_ok++;
} }
if (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; return 0;
} }
bits_ -= 221; bits_ -= 221;
@@ -3724,24 +3725,24 @@ static int amps_decode_bits_recc(amps_t *amps, const char *bits, int first)
} }
if (first) { if (first) {
if (debuglevel == DEBUG_DEBUG || crc_ok_count > 0) { if (loglevel == LOGL_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); 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) { 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; return 0;
} }
} }
} else { } else {
if (debuglevel == DEBUG_DEBUG || crc_ok_count > 0) if (loglevel == LOGL_DEBUG || crc_ok_count > 0)
PDEBUG_CHAN(DFRAME, DEBUG_INFO, "RX RECC: (%d of 5 CRCs are ok)\n", crc_ok_count); 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]; char text[64];
for (i = 0; i < 5; i++) { for (i = 0; i < 5; i++) {
strncpy(text, bits + i * 48, 48); strncpy(text, bits + i * 48, 48);
text[48] = '\0'; 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 */ /* not if additional words are received without sync */
if (count != 240) { 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) { if (count == 441) {
amps_decode_bits_focc(amps, bits); 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) { } else if (count == 240) {
more = amps_decode_bits_recc(amps, bits, 0); more = amps_decode_bits_recc(amps, bits, 0);
} else { } 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; return more;
+2 -1
View File
@@ -24,7 +24,7 @@
#include <errno.h> #include <errno.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libmobile/main_mobile.h" #include "../libmobile/main_mobile.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "../libmobile/call.h" #include "../libmobile/call.h"
#include "../liboptions/options.h" #include "../liboptions/options.h"
#include "../libfm/fm.h" #include "../libfm/fm.h"
@@ -423,6 +423,7 @@ fail:
amps_destroy(sender_head); amps_destroy(sender_head);
/* exits */ /* exits */
main_mobile_exit();
fm_exit(); fm_exit();
options_free(); options_free();
+15 -15
View File
@@ -21,7 +21,7 @@
#include <stdint.h> #include <stdint.h>
#include <stdlib.h> #include <stdlib.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "../libmobile/call.h" #include "../libmobile/call.h"
#include "../libmobile/cause.h" #include "../libmobile/cause.h"
#include "amps.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); const char *number = amps_min2number(trans->min1, trans->min2);
int old_callref = trans->callref; int old_callref = trans->callref;
amps_t *old_amps = trans->amps; 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); destroy_transaction(trans);
if (old_amps) /* should be... */ if (old_amps) /* should be... */
amps_go_idle(old_amps); 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)); trans = calloc(1, sizeof(*trans));
if (!trans) { if (!trans) {
PDEBUG(DTRANS, DEBUG_ERROR, "No memory!\n"); LOGP(DTRANS, LOGL_ERROR, "No memory!\n");
return NULL; return NULL;
} }
timer_init(&trans->timer, transaction_timeout, trans); osmo_timer_setup(&trans->timer, transaction_timeout, trans);
trans_new_state(trans, state); trans_new_state(trans, state);
trans->min1 = min1; trans->min1 = min1;
@@ -159,7 +159,7 @@ transaction_t *create_transaction(amps_t *amps, enum amps_trans_state state, uin
trans->chan = chan; trans->chan = chan;
const char *number = amps_min2number(trans->min1, trans->min2); 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); link_transaction(trans, amps);
@@ -172,9 +172,9 @@ void destroy_transaction(transaction_t *trans)
unlink_transaction(trans); unlink_transaction(trans);
const char *number = amps_min2number(trans->min1, trans->min2); 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); trans_new_state(trans, 0);
@@ -187,7 +187,7 @@ void link_transaction(transaction_t *trans, amps_t *amps)
transaction_t **transp; transaction_t **transp;
/* attach to end of list, so first transaction is served first */ /* 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->amps = amps;
trans->next = NULL; trans->next = NULL;
transp = &amps->trans_list; transp = &amps->trans_list;
@@ -203,12 +203,12 @@ void unlink_transaction(transaction_t *trans)
transaction_t **transp; transaction_t **transp;
/* unlink */ /* 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; transp = &trans->amps->trans_list;
while (*transp && *transp != trans) while (*transp && *transp != trans)
transp = &((*transp)->next); transp = &((*transp)->next);
if (!(*transp)) { 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(); abort();
} }
*transp = trans->next; *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 if (trans->min1 == min1
&& trans->min2 == min2) { && trans->min2 == min2) {
const char *number = amps_min2number(trans->min1, trans->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; return trans;
} }
trans = trans->next; trans = trans->next;
@@ -243,7 +243,7 @@ transaction_t *search_transaction_callref(amps_t *amps, int callref)
while (trans) { while (trans) {
if (trans->callref == callref) { if (trans->callref == callref) {
const char *number = amps_min2number(trans->min1, trans->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; return trans;
} }
trans = trans->next; 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) 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; trans->state = state;
amps_display_status(); amps_display_status();
} }
@@ -263,12 +263,12 @@ void amps_flush_other_transactions(amps_t *amps, transaction_t *trans)
{ {
/* flush after this very trans */ /* flush after this very trans */
while (trans->next) { 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); destroy_transaction(trans->next);
} }
/* flush before this very trans */ /* flush before this very trans */
while (amps->trans_list != 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); destroy_transaction(amps->trans_list);
} }
} }
+1 -1
View File
@@ -39,7 +39,7 @@ typedef struct transaction {
char caller_id[33]; /* id of calling phone */ char caller_id[33]; /* id of calling phone */
char dialing[33]; /* number dialed by the phone */ char dialing[33]; /* number dialed by the phone */
enum amps_trans_state state; /* state of transaction */ 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 sat_detected; /* state if we detected SAT */
int dtx; /* if set, DTX is used with this call */ int dtx; /* if set, DTX is used with this call */
} transaction_t; } transaction_t;
+3 -5
View File
@@ -19,23 +19,21 @@ anetz_LDADD = \
$(COMMON_LA) \ $(COMMON_LA) \
libgermanton.a \ libgermanton.a \
$(top_builddir)/src/liboptions/liboptions.a \ $(top_builddir)/src/liboptions/liboptions.a \
$(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libmobile/libmobile.a \ $(top_builddir)/src/libmobile/libmobile.a \
$(top_builddir)/src/libosmocc/libosmocc.a \
$(top_builddir)/src/libdisplay/libdisplay.a \ $(top_builddir)/src/libdisplay/libdisplay.a \
$(top_builddir)/src/libgoertzel/libgoertzel.a \ $(top_builddir)/src/libgoertzel/libgoertzel.a \
$(top_builddir)/src/libjitter/libjitter.a \ $(top_builddir)/src/libjitter/libjitter.a \
$(top_builddir)/src/libsquelch/libsquelch.a \ $(top_builddir)/src/libsquelch/libsquelch.a \
$(top_builddir)/src/libtimer/libtimer.a \
$(top_builddir)/src/libselect/libselect.a \
$(top_builddir)/src/libsamplerate/libsamplerate.a \ $(top_builddir)/src/libsamplerate/libsamplerate.a \
$(top_builddir)/src/libemphasis/libemphasis.a \ $(top_builddir)/src/libemphasis/libemphasis.a \
$(top_builddir)/src/libfm/libfm.a \ $(top_builddir)/src/libfm/libfm.a \
$(top_builddir)/src/libfilter/libfilter.a \ $(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/libwave/libwave.a \ $(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \ $(top_builddir)/src/libsample/libsample.a \
$(top_builddir)/src/libg711/libg711.a \
$(top_builddir)/src/libaaimage/libaaimage.a \ $(top_builddir)/src/libaaimage/libaaimage.a \
$(top_builddir)/src/liblogging/liblogging.a \
$(LIBOSMOCORE_LIBS) \
$(LIBOSMOCC_LIBS) \
-lm -lm
if HAVE_ALSA if HAVE_ALSA
+47 -47
View File
@@ -25,17 +25,17 @@
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "../libtimer/timer.h" #include <osmocom/core/timer.h>
#include "../libmobile/call.h" #include "../libmobile/call.h"
#include "../libmobile/cause.h" #include "../libmobile/cause.h"
#include "../libosmocc/message.h" #include <osmocom/cc/message.h>
#include "anetz.h" #include "anetz.h"
#include "dsp.h" #include "dsp.h"
/* Timers */ /* Timers */
#define PAGING_TO 30 /* Nach dieser Zeit ist der Operator genervt... */ #define PAGING_TO 30,0 /* Nach dieser Zeit ist der Operator genervt... */
#define RELEASE_TO 3 /* Release time, so station keeps blocked for a while */ #define RELEASE_TO 3,0 /* Release time, so station keeps blocked for a while */
const char *anetz_state_name(enum anetz_state state) const char *anetz_state_name(enum anetz_state state)
{ {
@@ -77,7 +77,7 @@ static void anetz_new_state(anetz_t *anetz, enum anetz_state new_state)
{ {
if (anetz->state == new_state) if (anetz->state == new_state)
return; 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->state = new_state;
anetz_display_status(); anetz_display_status();
} }
@@ -141,7 +141,7 @@ static double *anetz_nummer2freq(const char *nummer)
/* get decade */ /* get decade */
dekade = anetz_gruppenkennziffer[*nummer - '0'].dekade; 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++; nummer++;
/* get 4 frequencies out of decades */ /* 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; return freq;
} }
@@ -196,40 +196,40 @@ int anetz_create(const char *kanal, const char *device, int use_sdr, int sampler
int rc; int rc;
if (atoi(kanal) < 30 || atoi(kanal) > 63) { 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; return -EINVAL;
} }
anetz = calloc(1, sizeof(anetz_t)); anetz = calloc(1, sizeof(anetz_t));
if (!anetz) { if (!anetz) {
PDEBUG(DANETZ, DEBUG_ERROR, "No memory!\n"); LOGP(DANETZ, LOGL_ERROR, "No memory!\n");
return -EIO; return -EIO;
} }
anetz->operator = operator; 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 */ /* 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); 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) { 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; goto error;
} }
/* init audio processing */ /* init audio processing */
rc = dsp_init_sender(anetz, page_gain, page_sequence, squelch_db); rc = dsp_init_sender(anetz, page_gain, page_sequence, squelch_db);
if (rc < 0) { 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; goto error;
} }
timer_init(&anetz->timer, anetz_timeout, anetz); osmo_timer_setup(&anetz->timer, anetz_timeout, anetz);
/* go into idle state */ /* go into idle state */
anetz_go_idle(anetz); anetz_go_idle(anetz);
PDEBUG(DANETZ, DEBUG_NOTICE, "Created 'Kanal' #%s\n", kanal); LOGP(DANETZ, LOGL_NOTICE, "Created 'Kanal' #%s\n", kanal);
return 0; return 0;
@@ -244,9 +244,9 @@ void anetz_destroy(sender_t *sender)
{ {
anetz_t *anetz = (anetz_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); dsp_cleanup_sender(anetz);
sender_destroy(&anetz->sender); sender_destroy(&anetz->sender);
free(sender); free(sender);
@@ -255,9 +255,9 @@ void anetz_destroy(sender_t *sender)
/* Abort connection towards mobile station by sending idle tone. */ /* Abort connection towards mobile station by sending idle tone. */
static void anetz_go_idle(anetz_t *anetz) 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->station_id[0] = '\0'; /* remove station ID before state change, so status is shown correctly */
anetz_new_state(anetz, ANETZ_FREI); anetz_new_state(anetz, ANETZ_FREI);
/* also reset detector, so if there is a new call it is answered */ /* 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. */ /* Release connection towards mobile station by sending idle tone for a while. */
static void anetz_release(anetz_t *anetz) 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->station_id[0] = '\0'; /* remove station ID before state change, so status is shown correctly */
anetz_new_state(anetz, ANETZ_AUSLOESEN); anetz_new_state(anetz, ANETZ_AUSLOESEN);
anetz_set_dsp_mode(anetz, DSP_MODE_TONE, 0); 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. */ /* Enter paging state and transmit 4 paging tones. */
static void anetz_page(anetz_t *anetz, const char *dial_string, double *freq) 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 */ strcpy(anetz->station_id, dial_string); /* set station ID before state change, so status is shown correctly */
anetz_new_state(anetz, ANETZ_ANRUF); anetz_new_state(anetz, ANETZ_ANRUF);
anetz_set_dsp_mode(anetz, DSP_MODE_PAGING, 0); anetz_set_dsp_mode(anetz, DSP_MODE_PAGING, 0);
dsp_set_paging(anetz, freq); 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. */ /* Loss of signal was detected, release active call. */
void anetz_loss_indication(anetz_t *anetz, double loss_time) void anetz_loss_indication(anetz_t *anetz, double loss_time)
{ {
if (anetz->state == ANETZ_GESPRAECH) { 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); anetz_release(anetz);
call_up_release(anetz->callref, CAUSE_TEMPFAIL); call_up_release(anetz->callref, CAUSE_TEMPFAIL);
anetz->callref = 0; 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) void anetz_receive_tone(anetz_t *anetz, int tone)
{ {
if (tone >= 0) 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 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 */ /* skip any handling in loopback mode */
if (anetz->sender.loopback) if (anetz->sender.loopback)
@@ -318,7 +318,7 @@ void anetz_receive_tone(anetz_t *anetz, int tone)
case ANETZ_FREI: case ANETZ_FREI:
/* initiate call on calling tone */ /* initiate call on calling tone */
if (tone == 1) { 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 */ strcpy(anetz->station_id, "unknown"); /* set station ID before state change, so status is shown correctly */
anetz_new_state(anetz, ANETZ_GESPRAECH); 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 */ /* throughconnect speech when calling/answer tone is gone */
if (tone != 1) { if (tone != 1) {
if (!anetz->callref) { 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, ""); anetz->callref = call_up_setup(NULL, anetz->operator, OSMO_CC_NETWORK_ANETZ_NONE, "");
} else { } 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); call_up_answer(anetz->callref, anetz->station_id);
} }
anetz_set_dsp_mode(anetz, DSP_MODE_AUDIO, 0); anetz_set_dsp_mode(anetz, DSP_MODE_AUDIO, 0);
} }
/* release call */ /* release call */
if (tone == 1) { 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); anetz_release(anetz);
call_up_release(anetz->callref, CAUSE_NORMAL); call_up_release(anetz->callref, CAUSE_NORMAL);
anetz->callref = 0; anetz->callref = 0;
@@ -350,8 +350,8 @@ void anetz_receive_tone(anetz_t *anetz, int tone)
case ANETZ_ANRUF: case ANETZ_ANRUF:
/* answer call on answer tone */ /* answer call on answer tone */
if (tone == 1) { if (tone == 1) {
PDEBUG_CHAN(DANETZ, DEBUG_INFO, "Received 1750 Hz answer signal from mobile station, removing paging tones.\n"); LOGP_CHAN(DANETZ, LOGL_INFO, "Received 1750 Hz answer signal from mobile station, removing paging tones.\n");
timer_stop(&anetz->timer); osmo_timer_del(&anetz->timer);
anetz_new_state(anetz, ANETZ_GESPRAECH); anetz_new_state(anetz, ANETZ_GESPRAECH);
anetz_set_dsp_mode(anetz, DSP_MODE_SILENCE, 0); anetz_set_dsp_mode(anetz, DSP_MODE_SILENCE, 0);
break; break;
@@ -368,7 +368,7 @@ static void anetz_timeout(void *data)
switch (anetz->state) { switch (anetz->state) {
case ANETZ_ANRUF: 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); anetz_go_idle(anetz);
call_up_release(anetz->callref, CAUSE_NOANSWER); call_up_release(anetz->callref, CAUSE_NOANSWER);
anetz->callref = 0; anetz->callref = 0;
@@ -391,8 +391,8 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
/* 1. determine paging frequencies */ /* 1. determine paging frequencies */
freq = anetz_nummer2freq(dialing); freq = anetz_nummer2freq(dialing);
if (!freq) { if (!freq) {
PDEBUG(DANETZ, DEBUG_NOTICE, "Number invalid: %s\n", anetz_nummer2freq_error); LOGP(DANETZ, LOGL_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, "Outgoing call to invalid number '%s', rejecting!\n", dialing);
return -CAUSE_INVALNUMBER; return -CAUSE_INVALNUMBER;
} }
@@ -405,7 +405,7 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
break; break;
} }
if (sender) { 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; return -CAUSE_BUSY;
} }
@@ -416,13 +416,13 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
break; break;
} }
if (!sender) { 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; 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) 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 */ /* 4. trying to page mobile station */
anetz->callref = callref; anetz->callref = callref;
@@ -446,7 +446,7 @@ void call_down_disconnect(int callref, int cause)
sender_t *sender; sender_t *sender;
anetz_t *anetz; 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) { for (sender = sender_head; sender; sender = sender->next) {
anetz = (anetz_t *) sender; anetz = (anetz_t *) sender;
@@ -454,7 +454,7 @@ void call_down_disconnect(int callref, int cause)
break; break;
} }
if (!sender) { 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); call_up_release(callref, CAUSE_INVALCALLREF);
return; return;
} }
@@ -464,7 +464,7 @@ void call_down_disconnect(int callref, int cause)
return; return;
switch (anetz->state) { switch (anetz->state) {
case ANETZ_ANRUF: 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); anetz_go_idle(anetz);
break; break;
default: default:
@@ -483,7 +483,7 @@ void call_down_release(int callref, __attribute__((unused)) int cause)
sender_t *sender; sender_t *sender;
anetz_t *anetz; 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) { for (sender = sender_head; sender; sender = sender->next) {
anetz = (anetz_t *) sender; anetz = (anetz_t *) sender;
@@ -491,7 +491,7 @@ void call_down_release(int callref, __attribute__((unused)) int cause)
break; break;
} }
if (!sender) { 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 */ /* don't send release, because caller already released */
return; return;
} }
@@ -500,11 +500,11 @@ void call_down_release(int callref, __attribute__((unused)) int cause)
switch (anetz->state) { switch (anetz->state) {
case ANETZ_GESPRAECH: 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); anetz_release(anetz);
break; break;
case ANETZ_ANRUF: 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); anetz_go_idle(anetz);
break; break;
default: default:
+1 -1
View File
@@ -24,7 +24,7 @@ typedef struct anetz {
enum anetz_state state; /* current sender's state */ enum anetz_state state; /* current sender's state */
int callref; /* call reference */ int callref; /* call reference */
char station_id[8]; /* current station ID */ char station_id[8]; /* current station ID */
struct timer timer; struct osmo_timer_list timer;
/* display measurements */ /* display measurements */
dispmeasparam_t *dmp_tone_level; dispmeasparam_t *dmp_tone_level;
+11 -11
View File
@@ -26,8 +26,8 @@
#include <errno.h> #include <errno.h>
#include <math.h> #include <math.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "../libtimer/timer.h" #include <osmocom/core/timer.h>
#include "../libmobile/call.h" #include "../libmobile/call.h"
#include "anetz.h" #include "anetz.h"
#include "dsp.h" #include "dsp.h"
@@ -68,7 +68,7 @@ void dsp_init(void)
int i; int i;
double s; double s;
PDEBUG(DDSP, DEBUG_DEBUG, "Generating sine tables.\n"); LOGP(DDSP, LOGL_DEBUG, "Generating sine tables.\n");
for (i = 0; i < 65536; i++) { for (i = 0; i < 65536; i++) {
s = sin((double)i / 65536.0 * 2.0 * PI); s = sin((double)i / 65536.0 * 2.0 * PI);
dsp_sine_tone[i] = s * TX_PEAK_TONE; 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; int i;
double tone; double tone;
PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Init DSP for 'Sender'.\n"); LOGP_CHAN(DDSP, LOGL_DEBUG, "Init DSP for 'Sender'.\n");
/* init squelch */ /* init squelch */
squelch_init(&anetz->squelch, anetz->sender.kanal, squelch_db, MUTE_TIME, LOSS_TIME); 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->page_sequence = page_sequence;
anetz->samples_per_chunk = anetz->sender.samplerate * CHUNK_DURATION; 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)); spl = calloc(anetz->samples_per_chunk, sizeof(sample_t));
if (!spl) { if (!spl) {
PDEBUG(DDSP, DEBUG_ERROR, "No memory!\n"); LOGP(DDSP, LOGL_ERROR, "No memory!\n");
return -ENOMEM; return -ENOMEM;
} }
anetz->fsk_filter_spl = spl; 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. */ /* Cleanup transceiver instance. */
void dsp_cleanup_sender(anetz_t *anetz) 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) { if (anetz->fsk_filter_spl) {
free(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 */ /* lost tone because it is not good anymore or has changed */
if (!goodtone || tone != anetz->tone_detected) { if (!goodtone || tone != anetz->tone_detected) {
if (anetz->tone_count >= TONE_DETECT_TH) { 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); anetz_receive_tone(anetz, -1);
} }
if (goodtone) if (goodtone)
@@ -148,7 +148,7 @@ static void fsk_receive_tone(anetz_t *anetz, int tone, int goodtone, double leve
anetz->tone_count++; anetz->tone_count++;
if (anetz->tone_count == TONE_DETECT_TH) { 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); 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_level, level * 100.0, 0.0);
display_measurements_update(anetz->dmp_tone_quality, quality[1] * 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) 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 */ /* adjust level, so we get peak of sine curve */
/* indicate detected tone */ /* indicate detected tone */
@@ -403,7 +403,7 @@ 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) 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));
anetz->dsp_mode = mode; anetz->dsp_mode = mode;
/* reset sequence paging */ /* reset sequence paging */
anetz->paging_tone = 0; anetz->paging_tone = 0;
+3 -2
View File
@@ -25,8 +25,8 @@
#include <math.h> #include <math.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libmobile/main_mobile.h" #include "../libmobile/main_mobile.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "../libtimer/timer.h" #include <osmocom/core/timer.h>
#include "../libmobile/call.h" #include "../libmobile/call.h"
#include "../liboptions/options.h" #include "../liboptions/options.h"
#include "../libfm/fm.h" #include "../libfm/fm.h"
@@ -198,6 +198,7 @@ fail:
anetz_destroy(sender_head); anetz_destroy(sender_head);
/* exits */ /* exits */
main_mobile_exit();
fm_exit(); fm_exit();
options_free(); options_free();
+6 -6
View File
@@ -16,14 +16,10 @@ bnetz_LDADD = \
$(COMMON_LA) \ $(COMMON_LA) \
../anetz/libgermanton.a \ ../anetz/libgermanton.a \
$(top_builddir)/src/liboptions/liboptions.a \ $(top_builddir)/src/liboptions/liboptions.a \
$(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libmobile/libmobile.a \ $(top_builddir)/src/libmobile/libmobile.a \
$(top_builddir)/src/libosmocc/libosmocc.a \
$(top_builddir)/src/libdisplay/libdisplay.a \ $(top_builddir)/src/libdisplay/libdisplay.a \
$(top_builddir)/src/libjitter/libjitter.a \ $(top_builddir)/src/libjitter/libjitter.a \
$(top_builddir)/src/libsquelch/libsquelch.a \ $(top_builddir)/src/libsquelch/libsquelch.a \
$(top_builddir)/src/libtimer/libtimer.a \
$(top_builddir)/src/libselect/libselect.a \
$(top_builddir)/src/libsamplerate/libsamplerate.a \ $(top_builddir)/src/libsamplerate/libsamplerate.a \
$(top_builddir)/src/libemphasis/libemphasis.a \ $(top_builddir)/src/libemphasis/libemphasis.a \
$(top_builddir)/src/libfsk/libfsk.a \ $(top_builddir)/src/libfsk/libfsk.a \
@@ -31,8 +27,10 @@ bnetz_LDADD = \
$(top_builddir)/src/libfilter/libfilter.a \ $(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/libwave/libwave.a \ $(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \ $(top_builddir)/src/libsample/libsample.a \
$(top_builddir)/src/libg711/libg711.a \
$(top_builddir)/src/libaaimage/libaaimage.a \ $(top_builddir)/src/libaaimage/libaaimage.a \
$(top_builddir)/src/liblogging/liblogging.a \
$(LIBOSMOCORE_LIBS) \
$(LIBOSMOCC_LIBS) \
-lm -lm
bnetz_dialer_SOURCES = \ bnetz_dialer_SOURCES = \
@@ -41,12 +39,14 @@ bnetz_dialer_SOURCES = \
bnetz_dialer_LDADD = \ bnetz_dialer_LDADD = \
$(COMMON_LA) \ $(COMMON_LA) \
$(top_builddir)/src/liboptions/liboptions.a \ $(top_builddir)/src/liboptions/liboptions.a \
$(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libfsk/libfsk.a \ $(top_builddir)/src/libfsk/libfsk.a \
$(top_builddir)/src/libfm/libfm.a \ $(top_builddir)/src/libfm/libfm.a \
$(top_builddir)/src/libfilter/libfilter.a \ $(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/libwave/libwave.a \ $(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \ $(top_builddir)/src/libsample/libsample.a \
$(top_builddir)/src/liblogging/liblogging.a \
$(LIBOSMOCORE_LIBS) \
$(LIBOSMOCC_LIBS) \
$(ALSA_LIBS) $(ALSA_LIBS)
-lm -lm
+100 -99
View File
@@ -25,30 +25,31 @@
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "../libmobile/call.h" #include "../libmobile/call.h"
#include "../libmobile/cause.h" #include "../libmobile/cause.h"
#include "../libosmocc/message.h" #include "../libmobile/get_time.h"
#include <osmocom/cc/message.h>
#include "bnetz.h" #include "bnetz.h"
#include "telegramm.h" #include "telegramm.h"
#include "dsp.h" #include "dsp.h"
/* mobile originating call */ /* mobile originating call */
#define CARRIER_TO 0.08 /* 80 ms search for carrier */ #define CARRIER_TO 0.080000 /* 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_TO 3,800000 /* 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 DIALING_TO2 0,500000 /* timeout while receiving digits */
/* mobile terminating call */ /* 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 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.1 /* 700..2100 ms timeout after paging "Selektivruf" (according to FTZ 1727 Pfl 32 Clause 3.2.2.2.4.3) */ #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 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 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 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_DURATION 0,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 */ #define METERING_START 1,0 /* start metering 1 second after call start */
const char *bnetz_state_name(enum bnetz_state state) const char *bnetz_state_name(enum bnetz_state state)
{ {
@@ -99,7 +100,7 @@ static void bnetz_new_state(bnetz_t *bnetz, enum bnetz_state new_state)
{ {
if (bnetz->state == new_state) if (bnetz->state == new_state)
return; 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->state = new_state;
bnetz_display_status(); bnetz_display_status();
} }
@@ -133,7 +134,7 @@ static void switch_channel_19(bnetz_t *bnetz, int on)
fp = fopen(bnetz->paging_file, "w"); fp = fopen(bnetz->paging_file, "w");
if (!fp) { 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; return;
} }
fprintf(fp, "%s\n", (on) ? bnetz->paging_on : bnetz->paging_off); fprintf(fp, "%s\n", (on) ? bnetz->paging_on : bnetz->paging_off);
@@ -162,22 +163,22 @@ int bnetz_create(const char *kanal, const char *device, int use_sdr, int sampler
int rc; int rc;
if (!(atoi(kanal) >= 1 && atoi(kanal) <= 39) && !(atoi(kanal) >= 50 && atoi(kanal) <= 86)) { 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; return -EINVAL;
} }
if (atoi(kanal) == 19) { 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; return -EINVAL;
} }
if (atoi(kanal) >= 38 && atoi(kanal) <= 39) 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) 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)) { 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; return -EINVAL;
} }
@@ -199,7 +200,7 @@ int bnetz_create(const char *kanal, const char *device, int use_sdr, int sampler
p = strchr(paging_file, '='); p = strchr(paging_file, '=');
if (!p) { if (!p) {
error_paging: 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; return -EINVAL;
} }
*p++ = '\0'; *p++ = '\0';
@@ -213,16 +214,16 @@ error_paging:
bnetz = calloc(1, sizeof(bnetz_t)); bnetz = calloc(1, sizeof(bnetz_t));
if (!bnetz) { if (!bnetz) {
PDEBUG(DBNETZ, DEBUG_ERROR, "No memory!\n"); LOGP(DBNETZ, LOGL_ERROR, "No memory!\n");
return -ENOMEM; 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 */ /* 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); 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) { 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; goto error;
} }
bnetz->sender.ruffrequenz = bnetz_kanal2freq(19, 0); bnetz->sender.ruffrequenz = bnetz_kanal2freq(19, 0);
@@ -230,7 +231,7 @@ error_paging:
/* init audio processing */ /* init audio processing */
rc = dsp_init_sender(bnetz, squelch_db); rc = dsp_init_sender(bnetz, squelch_db);
if (rc < 0) { 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; goto error;
} }
@@ -239,13 +240,13 @@ error_paging:
strncpy(bnetz->paging_file, paging_file, sizeof(bnetz->paging_file) - 1); 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_on, paging_on, sizeof(bnetz->paging_on) - 1);
strncpy(bnetz->paging_off, paging_off, sizeof(bnetz->paging_off) - 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 */ /* go into idle state */
bnetz_go_idle(bnetz); bnetz_go_idle(bnetz);
PDEBUG(DBNETZ, DEBUG_NOTICE, "Created 'Kanal' #%s\n", kanal); LOGP(DBNETZ, LOGL_NOTICE, "Created 'Kanal' #%s\n", kanal);
PDEBUG(DBNETZ, DEBUG_NOTICE, " -> Using station ID (Gruppenfreisignal) %d\n", gfs); LOGP(DBNETZ, LOGL_NOTICE, " -> Using station ID (Gruppenfreisignal) %d\n", gfs);
return 0; return 0;
@@ -260,10 +261,10 @@ void bnetz_destroy(sender_t *sender)
{ {
bnetz_t *bnetz = (bnetz_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); switch_channel_19(bnetz, 0);
dsp_cleanup_sender(bnetz); dsp_cleanup_sender(bnetz);
timer_exit(&bnetz->timer); osmo_timer_del(&bnetz->timer);
sender_destroy(&bnetz->sender); sender_destroy(&bnetz->sender);
free(bnetz); free(bnetz);
} }
@@ -271,9 +272,9 @@ void bnetz_destroy(sender_t *sender)
/* releaseing connection towards mobile station by sending idle digits. */ /* releaseing connection towards mobile station by sending idle digits. */
static void bnetz_go_idle(bnetz_t *bnetz) 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->station_id[0] = '\0'; /* remove station ID before state change, so status is shown correctly */
bnetz_new_state(bnetz, BNETZ_FREI); bnetz_new_state(bnetz, BNETZ_FREI);
bnetz_set_dsp_mode(bnetz, DSP_MODE_TELEGRAMM); 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. */ /* Release connection towards mobile station by sending release digits. */
static void bnetz_release(bnetz_t *bnetz, int trenn_count) 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->station_id[0] = '\0'; /* remove station ID before state change, so status is shown correctly */
bnetz_new_state(bnetz, BNETZ_TRENNEN); bnetz_new_state(bnetz, BNETZ_TRENNEN);
bnetz_set_dsp_mode(bnetz, DSP_MODE_TELEGRAMM); 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. */ /* Enter paging state and transmit station ID. */
static void bnetz_page(bnetz_t *bnetz, const char *dial_string, int try) 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); LOGP_CHAN(DBNETZ, LOGL_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 */ 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->station_id_pos = 0;
bnetz_new_state(bnetz, BNETZ_SELEKTIVRUF_EIN); bnetz_new_state(bnetz, BNETZ_SELEKTIVRUF_EIN);
bnetz_set_dsp_mode(bnetz, DSP_MODE_0); bnetz_set_dsp_mode(bnetz, DSP_MODE_0);
bnetz->page_mode = PAGE_MODE_NUMBER; bnetz->page_mode = PAGE_MODE_NUMBER;
bnetz->page_try = try; bnetz->page_try = try;
timer_start(&bnetz->timer, SWITCH19_TIME); osmo_timer_schedule(&bnetz->timer, SWITCH19_TIME);
switch_channel_19(bnetz, 1); switch_channel_19(bnetz, 1);
} }
@@ -332,10 +333,10 @@ const char *bnetz_get_telegramm(bnetz_t *bnetz)
break; break;
case BNETZ_SELEKTIVRUF_EIN: case BNETZ_SELEKTIVRUF_EIN:
if (bnetz->page_mode == PAGE_MODE_KANALBEFEHL) { 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_new_state(bnetz, BNETZ_SELEKTIVRUF_AUS);
bnetz_set_dsp_mode(bnetz, DSP_MODE_SILENCE); bnetz_set_dsp_mode(bnetz, DSP_MODE_SILENCE);
timer_start(&bnetz->timer, SWITCHBACK_TIME); osmo_timer_schedule(&bnetz->timer, SWITCHBACK_TIME);
return NULL; return NULL;
} }
if (bnetz->station_id_pos == 5) { if (bnetz->station_id_pos == 5) {
@@ -347,7 +348,7 @@ const char *bnetz_get_telegramm(bnetz_t *bnetz)
break; break;
case BNETZ_TRENNEN: case BNETZ_TRENNEN:
if (bnetz->trenn_count-- == 0) { 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); bnetz_go_idle(bnetz);
return NULL; return NULL;
} }
@@ -360,7 +361,7 @@ const char *bnetz_get_telegramm(bnetz_t *bnetz)
if (!it) if (!it)
abort(); 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; return it->sequence;
} }
@@ -369,7 +370,7 @@ void bnetz_loss_indication(bnetz_t *bnetz, double loss_time)
{ {
if (bnetz->state == BNETZ_GESPRAECH if (bnetz->state == BNETZ_GESPRAECH
|| bnetz->state == BNETZ_RUFHALTUNG) { || 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); bnetz_release(bnetz, TRENN_COUNT);
call_up_release(bnetz->callref, CAUSE_TEMPFAIL); call_up_release(bnetz->callref, CAUSE_TEMPFAIL);
bnetz->callref = 0; 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) void bnetz_receive_tone(bnetz_t *bnetz, int bit)
{ {
if (bit >= 0) 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 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) { if (bnetz->sender.loopback) {
return; return;
@@ -391,11 +392,11 @@ void bnetz_receive_tone(bnetz_t *bnetz, int bit)
switch (bnetz->state) { switch (bnetz->state) {
case BNETZ_FREI: case BNETZ_FREI:
if (bit == 0) { 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_new_state(bnetz, BNETZ_WAHLABRUF);
bnetz->dial_mode = DIAL_MODE_START; bnetz->dial_mode = DIAL_MODE_START;
bnetz_set_dsp_mode(bnetz, DSP_MODE_1); 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 */ /* must reset, so we will not get corrupt first digit */
bnetz->rx_telegramm = bnetz->tone_detected * 0xffff; bnetz->rx_telegramm = bnetz->tone_detected * 0xffff;
break; break;
@@ -403,24 +404,24 @@ void bnetz_receive_tone(bnetz_t *bnetz, int bit)
break; break;
case BNETZ_RUFBESTAETIGUNG: case BNETZ_RUFBESTAETIGUNG:
if (bit == 1) { if (bit == 1) {
PDEBUG_CHAN(DBNETZ, DEBUG_INFO, "Received signal 'Rufbestaetigung' from mobile station, sending signal 'Rufhaltung'. (call is ringing)\n"); LOGP_CHAN(DBNETZ, LOGL_INFO, "Received signal 'Rufbestaetigung' from mobile station, sending signal 'Rufhaltung'. (call is ringing)\n");
timer_stop(&bnetz->timer); osmo_timer_del(&bnetz->timer);
bnetz_new_state(bnetz, BNETZ_RUFHALTUNG); bnetz_new_state(bnetz, BNETZ_RUFHALTUNG);
bnetz_set_dsp_mode(bnetz, DSP_MODE_1); bnetz_set_dsp_mode(bnetz, DSP_MODE_1);
call_up_alerting(bnetz->callref); call_up_alerting(bnetz->callref);
timer_start(&bnetz->timer, ALERTING_TO); osmo_timer_schedule(&bnetz->timer, ALERTING_TO);
break; break;
} }
break; break;
case BNETZ_RUFHALTUNG: case BNETZ_RUFHALTUNG:
if (bit == 0) { if (bit == 0) {
PDEBUG_CHAN(DBNETZ, DEBUG_INFO, "Received signal 'Beginnsignal' from mobile station, call establised.\n"); LOGP_CHAN(DBNETZ, LOGL_INFO, "Received signal 'Beginnsignal' from mobile station, call establised.\n");
timer_stop(&bnetz->timer); osmo_timer_del(&bnetz->timer);
bnetz_new_state(bnetz, BNETZ_GESPRAECH); bnetz_new_state(bnetz, BNETZ_GESPRAECH);
bnetz_set_dsp_mode(bnetz, DSP_MODE_AUDIO); bnetz_set_dsp_mode(bnetz, DSP_MODE_AUDIO);
/* start metering pulses if forced */ /* start metering pulses if forced */
if (bnetz->metering < 0) if (bnetz->metering < 0)
timer_start(&bnetz->timer, METERING_START); osmo_timer_schedule(&bnetz->timer, METERING_START);
call_up_answer(bnetz->callref, bnetz->station_id); call_up_answer(bnetz->callref, bnetz->station_id);
break; break;
} }
@@ -438,22 +439,22 @@ void bnetz_receive_telegramm(bnetz_t *bnetz, uint16_t telegramm)
it = bnetz_telegramm2digit(telegramm); it = bnetz_telegramm2digit(telegramm);
if (it) { if (it) {
digit = it->digit; 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 { } 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; return;
} }
if (bnetz->sender.loopback) { if (bnetz->sender.loopback) {
if (digit >= '0' && digit <= '9') { 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; return;
} }
switch (bnetz->state) { switch (bnetz->state) {
case BNETZ_WAHLABRUF: case BNETZ_WAHLABRUF:
timer_start(&bnetz->timer, DIALING_TO2); osmo_timer_schedule(&bnetz->timer, DIALING_TO2);
switch (bnetz->dial_mode) { switch (bnetz->dial_mode) {
case DIAL_MODE_START: case DIAL_MODE_START:
switch (digit) { switch (digit) {
@@ -467,7 +468,7 @@ void bnetz_receive_telegramm(bnetz_t *bnetz, uint16_t telegramm)
bnetz->dial_type = DIAL_TYPE_METER_MUENZ; bnetz->dial_type = DIAL_TYPE_METER_MUENZ;
break; break;
default: 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); bnetz_release(bnetz, TRENN_COUNT);
return; return;
} }
@@ -477,7 +478,7 @@ void bnetz_receive_telegramm(bnetz_t *bnetz, uint16_t telegramm)
break; break;
case DIAL_MODE_STATIONID: case DIAL_MODE_STATIONID:
if (digit < '0' || digit > '9') { 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); bnetz_release(bnetz, TRENN_COUNT);
return; return;
} }
@@ -485,29 +486,29 @@ void bnetz_receive_telegramm(bnetz_t *bnetz, uint16_t telegramm)
/* update status while receiving station ID */ /* update status while receiving station ID */
bnetz_display_status(); bnetz_display_status();
if (bnetz->dial_pos == 5) { 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; bnetz->dial_mode = DIAL_MODE_NUMBER;
memset(bnetz->dial_number, 0, sizeof(bnetz->dial_number)); memset(bnetz->dial_number, 0, sizeof(bnetz->dial_number));
bnetz->dial_pos = 0; bnetz->dial_pos = 0;
/* reply station ID */ /* 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_set_dsp_mode(bnetz, DSP_MODE_TELEGRAMM);
bnetz->station_id_pos = 0; bnetz->station_id_pos = 0;
} }
break; break;
case DIAL_MODE_NUMBER: case DIAL_MODE_NUMBER:
if (digit == 'e') { 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; bnetz->dial_mode = DIAL_MODE_START2;
break; break;
} }
if (digit < '0' || digit > '9') { 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); bnetz_release(bnetz, TRENN_COUNT);
return; return;
} }
if (bnetz->dial_pos == sizeof(bnetz->dial_number) - 1) { 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); bnetz_release(bnetz, TRENN_COUNT);
return; return;
} }
@@ -517,27 +518,27 @@ void bnetz_receive_telegramm(bnetz_t *bnetz, uint16_t telegramm)
switch (digit) { switch (digit) {
case 's': case 's':
if (bnetz->dial_type != DIAL_TYPE_NOMETER) { 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); bnetz_release(bnetz, TRENN_COUNT);
return; return;
} }
break; break;
case 'S': case 'S':
if (bnetz->dial_type != DIAL_TYPE_METER) { 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); bnetz_release(bnetz, TRENN_COUNT);
return; return;
} }
break; break;
case 'M': case 'M':
if (bnetz->dial_type != DIAL_TYPE_METER_MUENZ) { 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); bnetz_release(bnetz, TRENN_COUNT);
return; return;
} }
break; break;
default: 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); bnetz_release(bnetz, TRENN_COUNT);
return; return;
} }
@@ -546,12 +547,12 @@ void bnetz_receive_telegramm(bnetz_t *bnetz, uint16_t telegramm)
break; break;
case DIAL_MODE_STATIONID2: case DIAL_MODE_STATIONID2:
if (digit < '0' || digit > '9') { 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); bnetz_release(bnetz, TRENN_COUNT);
return; return;
} }
if (bnetz->station_id[bnetz->dial_pos++] != digit) { 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); bnetz_release(bnetz, TRENN_COUNT);
return; return;
} }
@@ -567,43 +568,43 @@ void bnetz_receive_telegramm(bnetz_t *bnetz, uint16_t telegramm)
strcpy(dialing + 1, bnetz->dial_number); strcpy(dialing + 1, bnetz->dial_number);
if (bnetz->dial_pos != (int)strlen(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); bnetz_release(bnetz, TRENN_COUNT);
return; return;
} }
if (!strncmp(dialing, "0110", 4)) { 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"); strcpy(dialing, "110");
} }
if (!strncmp(dialing, "0112", 4)) { 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"); strcpy(dialing, "112");
} }
PDEBUG(DBNETZ, DEBUG_INFO, "Dialing complete %s->%s, call established.\n", bnetz->station_id, dialing); LOGP(DBNETZ, LOGL_INFO, "Dialing complete %s->%s, call established.\n", bnetz->station_id, dialing);
timer_stop(&bnetz->timer); osmo_timer_del(&bnetz->timer);
bnetz_set_dsp_mode(bnetz, DSP_MODE_AUDIO); bnetz_set_dsp_mode(bnetz, DSP_MODE_AUDIO);
bnetz_new_state(bnetz, BNETZ_GESPRAECH); bnetz_new_state(bnetz, BNETZ_GESPRAECH);
/* start metering pulses if enabled and supported by phone or if forced */ /* 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))) 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); osmo_timer_schedule(&bnetz->timer, METERING_START);
/* setup call */ /* 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" : ""); bnetz->callref = call_up_setup(bnetz->station_id, dialing, OSMO_CC_NETWORK_BNETZ_MUENZ, (bnetz->dial_type == DIAL_TYPE_METER_MUENZ) ? "MUENZ" : "");
break; break;
} }
if (digit < '0' || digit > '9') { 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); bnetz_release(bnetz, TRENN_COUNT);
return; return;
} }
if (bnetz->dial_pos == (int)strlen(bnetz->dial_number)) { 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); bnetz_release(bnetz, TRENN_COUNT);
return; return;
} }
if (bnetz->dial_number[bnetz->dial_pos++] != digit) { 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); bnetz_release(bnetz, TRENN_COUNT);
return; return;
} }
@@ -618,7 +619,7 @@ lets see, if noise will not generate a release signal....
return; return;
#endif #endif
if (digit == 't') { 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); bnetz_release(bnetz, TRENN_COUNT);
call_up_release(bnetz->callref, CAUSE_NORMAL); call_up_release(bnetz->callref, CAUSE_NORMAL);
bnetz->callref = 0; bnetz->callref = 0;
@@ -637,32 +638,32 @@ static void bnetz_timeout(void *data)
switch (bnetz->state) { switch (bnetz->state) {
case BNETZ_WAHLABRUF: 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); bnetz_release(bnetz, TRENN_COUNT);
break; break;
case BNETZ_SELEKTIVRUF_EIN: 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); bnetz_set_dsp_mode(bnetz, DSP_MODE_TELEGRAMM);
break; break;
case BNETZ_SELEKTIVRUF_AUS: 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); bnetz_new_state(bnetz, BNETZ_RUFBESTAETIGUNG);
switch_channel_19(bnetz, 0); switch_channel_19(bnetz, 0);
timer_start(&bnetz->timer, PAGING_TO); osmo_timer_schedule(&bnetz->timer, PAGING_TO);
break; break;
case BNETZ_RUFBESTAETIGUNG: case BNETZ_RUFBESTAETIGUNG:
if (bnetz->page_try == PAGE_TRIES) { 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); bnetz_release(bnetz, TRENN_COUNT);
call_up_release(bnetz->callref, CAUSE_OUTOFORDER); call_up_release(bnetz->callref, CAUSE_OUTOFORDER);
bnetz->callref = 0; bnetz->callref = 0;
break; 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); bnetz_page(bnetz, bnetz->station_id, bnetz->page_try + 1);
break; break;
case BNETZ_RUFHALTUNG: 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); bnetz_release(bnetz, TRENN_COUNT);
call_up_release(bnetz->callref, CAUSE_NOANSWER); call_up_release(bnetz->callref, CAUSE_NOANSWER);
bnetz->callref = 0; bnetz->callref = 0;
@@ -672,12 +673,12 @@ static void bnetz_timeout(void *data)
case DSP_MODE_AUDIO: case DSP_MODE_AUDIO:
/* turn on merting pulse */ /* turn on merting pulse */
bnetz_set_dsp_mode(bnetz, DSP_MODE_AUDIO_METER); bnetz_set_dsp_mode(bnetz, DSP_MODE_AUDIO_METER);
timer_start(&bnetz->timer, METERING_DURATION); osmo_timer_schedule(&bnetz->timer, METERING_DURATION);
break; break;
case DSP_MODE_AUDIO_METER: case DSP_MODE_AUDIO_METER:
/* turn off and wait given seconds for next metering cycle */ /* turn off and wait given seconds for next metering cycle */
bnetz_set_dsp_mode(bnetz, DSP_MODE_AUDIO); bnetz_set_dsp_mode(bnetz, DSP_MODE_AUDIO);
timer_start(&bnetz->timer, (double)abs(bnetz->metering) - METERING_DURATION); osmo_timer_schedule(&bnetz->timer, (double)abs(bnetz->metering) - METERING_DURATION);
break; break;
default: default:
break; break;
@@ -701,7 +702,7 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
break; break;
} }
if (sender) { 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; return -CAUSE_BUSY;
} }
@@ -712,11 +713,11 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
break; break;
} }
if (!sender) { 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; 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 */ /* 3. trying to page mobile station */
bnetz->callref = callref; bnetz->callref = callref;
@@ -738,7 +739,7 @@ void call_down_disconnect(int callref, int cause)
sender_t *sender; sender_t *sender;
bnetz_t *bnetz; 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) { for (sender = sender_head; sender; sender = sender->next) {
bnetz = (bnetz_t *) sender; bnetz = (bnetz_t *) sender;
@@ -746,7 +747,7 @@ void call_down_disconnect(int callref, int cause)
break; break;
} }
if (!sender) { 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); call_up_release(callref, CAUSE_INVALCALLREF);
return; return;
} }
@@ -758,11 +759,11 @@ void call_down_disconnect(int callref, int cause)
case BNETZ_SELEKTIVRUF_EIN: case BNETZ_SELEKTIVRUF_EIN:
case BNETZ_SELEKTIVRUF_AUS: case BNETZ_SELEKTIVRUF_AUS:
case BNETZ_RUFBESTAETIGUNG: 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); bnetz_release(bnetz, TRENN_COUNT);
break; break;
case BNETZ_RUFHALTUNG: 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); bnetz_release(bnetz, TRENN_COUNT);
break; break;
default: default:
@@ -780,7 +781,7 @@ void call_down_release(int callref, int __attribute__((unused)) cause)
sender_t *sender; sender_t *sender;
bnetz_t *bnetz; 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) { for (sender = sender_head; sender; sender = sender->next) {
bnetz = (bnetz_t *) sender; bnetz = (bnetz_t *) sender;
@@ -788,7 +789,7 @@ void call_down_release(int callref, int __attribute__((unused)) cause)
break; break;
} }
if (!sender) { 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 */ /* don't send release, because caller already released */
return; return;
} }
@@ -797,17 +798,17 @@ void call_down_release(int callref, int __attribute__((unused)) cause)
switch (bnetz->state) { switch (bnetz->state) {
case BNETZ_GESPRAECH: 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); bnetz_release(bnetz, TRENN_COUNT);
break; break;
case BNETZ_SELEKTIVRUF_EIN: case BNETZ_SELEKTIVRUF_EIN:
case BNETZ_SELEKTIVRUF_AUS: case BNETZ_SELEKTIVRUF_AUS:
case BNETZ_RUFBESTAETIGUNG: 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); bnetz_release(bnetz, TRENN_COUNT);
break; break;
case BNETZ_RUFHALTUNG: 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); bnetz_release(bnetz, TRENN_COUNT);
break; break;
default: default:
+2 -2
View File
@@ -1,7 +1,7 @@
#include "../libsquelch/squelch.h" #include "../libsquelch/squelch.h"
#include "../libfsk/fsk.h" #include "../libfsk/fsk.h"
#include "../libmobile/sender.h" #include "../libmobile/sender.h"
#include "../libtimer/timer.h" #include <osmocom/core/timer.h>
/* fsk modes of transmission */ /* fsk modes of transmission */
enum dsp_mode { enum dsp_mode {
@@ -74,7 +74,7 @@ typedef struct bnetz {
int station_id_pos; /* position while transmitting */ int station_id_pos; /* position while transmitting */
enum page_mode page_mode; /* sub state while paging */ enum page_mode page_mode; /* sub state while paging */
int page_try; /* try number (1 or 2) */ int page_try; /* try number (1 or 2) */
struct timer timer; struct osmo_timer_list timer;
int trenn_count; /* count number of release messages */ int trenn_count; /* count number of release messages */
/* display measurements */ /* display measurements */
+16 -16
View File
@@ -26,7 +26,7 @@
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libfsk/fsk.h" #include "../libfsk/fsk.h"
#include "../libwave/wave.h" #include "../libwave/wave.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#ifdef HAVE_ALSA #ifdef HAVE_ALSA
#include "../libsound/sound.h" #include "../libsound/sound.h"
#endif #endif
@@ -161,13 +161,13 @@ static int fsk_send_bit(void __attribute__((unused)) *inst)
if (!tx_telegramm || tx_telegramm_pos == 16) { if (!tx_telegramm || tx_telegramm_pos == 16) {
switch (funkwahl[digit_pos]) { switch (funkwahl[digit_pos]) {
case '\0': 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_mode = TX_MODE_SILENCE;
tx_silence_count = 0; tx_silence_count = 0;
return -1; return -1;
case 'w': case 'w':
if (!tx_telegramm) 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 = "0000000000000000";
tx_telegramm_pos = 0; tx_telegramm_pos = 0;
digit_pos++; digit_pos++;
@@ -175,23 +175,23 @@ static int fsk_send_bit(void __attribute__((unused)) *inst)
default: default:
switch (funkwahl[digit_pos]) { switch (funkwahl[digit_pos]) {
case 's': 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; break;
case 'S': 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; break;
case 'M': 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; break;
case 'e': case 'e':
PDEBUG(DBNETZ, DEBUG_INFO, "Sending stop digit\n"); LOGP(DBNETZ, LOGL_INFO, "Sending stop digit\n");
break; break;
default: 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]); impulstelegramm = bnetz_digit2telegramm(funkwahl[digit_pos]);
if (!impulstelegramm) { 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(); abort();
} }
tx_telegramm = impulstelegramm->sequence; tx_telegramm = impulstelegramm->sequence;
@@ -252,7 +252,7 @@ static void process_signal(int buffer_size)
count = dsp_samplerate / 1000; count = dsp_samplerate / 1000;
#endif #endif
if (count < 0) { 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; break;
} }
@@ -267,7 +267,7 @@ static void process_signal(int buffer_size)
/* write audio */ /* write audio */
rc = sound_write(audio, samples, power, count, NULL, NULL, 1); rc = sound_write(audio, samples, power, count, NULL, NULL, 1);
if (rc < 0) { 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; break;
} }
#endif #endif
@@ -340,7 +340,7 @@ int main(int argc, char *argv[])
/* init fsk */ /* init fsk */
if (fsk_mod_init(&fsk_mod, NULL, fsk_send_bit, dsp_samplerate, BIT_RATE, F0, F1, 1.0, 0, 0) < 0) { 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; goto exit;
} }
@@ -348,7 +348,7 @@ int main(int argc, char *argv[])
/* init sound */ /* 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(dsp_audiodev, NULL, NULL, NULL, 1, 0.0, dsp_samplerate, buffer_size, 1.0, 1.0, 4000.0, 2.0);
if (!audio) { if (!audio) {
PDEBUG(DBNETZ, DEBUG_ERROR, "No sound device!\n"); LOGP(DBNETZ, LOGL_ERROR, "No sound device!\n");
goto exit; goto exit;
} }
#endif #endif
@@ -357,13 +357,13 @@ int main(int argc, char *argv[])
if (write_tx_wave) { if (write_tx_wave) {
rc = wave_create_record(&wave_tx_rec, write_tx_wave, dsp_samplerate, 1, 1.0); rc = wave_create_record(&wave_tx_rec, write_tx_wave, dsp_samplerate, 1, 1.0);
if (rc < 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; goto exit;
} }
} }
#ifndef HAVE_ALSA #ifndef HAVE_ALSA
else { 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; goto exit;
} }
#endif #endif
@@ -373,7 +373,7 @@ int main(int argc, char *argv[])
sound_start(audio); sound_start(audio);
#endif #endif
PDEBUG(DBNETZ, DEBUG_ERROR, "Start audio after pause...\n"); LOGP(DBNETZ, LOGL_ERROR, "Start audio after pause...\n");
process_signal(buffer_size); process_signal(buffer_size);
+14 -14
View File
@@ -26,7 +26,7 @@
#include <errno.h> #include <errno.h>
#include <math.h> #include <math.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "../libmobile/call.h" #include "../libmobile/call.h"
#include "bnetz.h" #include "bnetz.h"
#include "dsp.h" #include "dsp.h"
@@ -70,7 +70,7 @@ void dsp_init(void)
{ {
int i; 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++) for (i = 0; i < 65536; i++)
dsp_metering[i] = sin((double)i / 65536.0 * 2.0 * PI) * TX_PEAK_METER; 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. */ /* Init transceiver instance. */
int dsp_init_sender(bnetz_t *bnetz, double squelch_db) 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])) { 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; return -EINVAL;
} }
@@ -94,15 +94,15 @@ int dsp_init_sender(bnetz_t *bnetz, double squelch_db)
/* set modulation parameters */ /* set modulation parameters */
sender_set_fm(&bnetz->sender, MAX_DEVIATION, MAX_MODULATION, SPEECH_DEVIATION, MAX_DISPLAY); 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 */ /* 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) { 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; return -EINVAL;
} }
if (fsk_demod_init(&bnetz->fsk_demod, bnetz, fsk_receive_bit, bnetz->sender.samplerate, BIT_RATE, F0, F1, BIT_ADJUST) < 0) { 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; return -EINVAL;
} }
@@ -124,7 +124,7 @@ int dsp_init_sender(bnetz_t *bnetz, double squelch_db)
/* Cleanup transceiver instance. */ /* Cleanup transceiver instance. */
void dsp_cleanup_sender(bnetz_t *bnetz) 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_mod_cleanup(&bnetz->fsk_mod);
fsk_demod_cleanup(&bnetz->fsk_demod); 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 */ /* set duration to TONE_DETECT_CNT, because it took that long to detect the tone */
bnetz->tone_duration = TONE_DETECT_CNT; bnetz->tone_duration = TONE_DETECT_CNT;
bnetz->tone_detected = tone; 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); 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++; bnetz->tone_count++;
if (bnetz->tone_count == TONE_LOST_CNT) { if (bnetz->tone_count == TONE_LOST_CNT) {
/* subtract TONE_LOST_CNT from duration, because it took that long to detect loss of tone */ /* 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->tone_detected = -1;
bnetz_receive_tone(bnetz, -1); bnetz_receive_tone(bnetz, -1);
} }
@@ -250,7 +250,7 @@ static void fsk_receive_bit(void *inst, int bit, double quality, double level)
j++; 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 */ /* drop any telegramm that is too bad */
if (level_stddev / level_avg > TONE_STDDEV_TH || j < 16) 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_stddev, level_stddev / level_avg * 100.0, 0.0);
display_measurements_update(bnetz->dmp_frame_quality, quality_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 */ /* receive telegramm */
bnetz_receive_telegramm(bnetz, bnetz->rx_telegramm); bnetz_receive_telegramm(bnetz, bnetz->rx_telegramm);
@@ -320,7 +320,7 @@ static int fsk_send_bit(void *inst)
/* request frame */ /* request frame */
bnetz->tx_telegramm = bnetz_get_telegramm(bnetz); bnetz->tx_telegramm = bnetz_get_telegramm(bnetz);
if (!bnetz->tx_telegramm) { if (!bnetz->tx_telegramm) {
PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Stop sending 'Telegramm'.\n"); LOGP_CHAN(DDSP, LOGL_DEBUG, "Stop sending 'Telegramm'.\n");
return -1; return -1;
} }
bnetz->tx_telegramm_pos = 0; bnetz->tx_telegramm_pos = 0;
@@ -423,7 +423,7 @@ void bnetz_set_dsp_mode(bnetz_t *bnetz, enum dsp_mode mode)
fsk_mod_reset(&bnetz->fsk_mod); fsk_mod_reset(&bnetz->fsk_mod);
} }
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; bnetz->dsp_mode = mode;
} }
+2 -1
View File
@@ -24,7 +24,7 @@
#include <errno.h> #include <errno.h>
#include <math.h> #include <math.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "../libmobile/call.h" #include "../libmobile/call.h"
#include "../libmobile/main_mobile.h" #include "../libmobile/main_mobile.h"
#include "../anetz/freiton.h" #include "../anetz/freiton.h"
@@ -218,6 +218,7 @@ fail:
bnetz_destroy(sender_head); bnetz_destroy(sender_head);
/* exits */ /* exits */
main_mobile_exit();
fm_exit(); fm_exit();
options_free(); options_free();
+3 -5
View File
@@ -24,14 +24,10 @@ cnetz_LDADD = \
../anetz/libgermanton.a \ ../anetz/libgermanton.a \
libcnetztones.a \ libcnetztones.a \
$(top_builddir)/src/liboptions/liboptions.a \ $(top_builddir)/src/liboptions/liboptions.a \
$(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libmobile/libmobile.a \ $(top_builddir)/src/libmobile/libmobile.a \
$(top_builddir)/src/libosmocc/libosmocc.a \
$(top_builddir)/src/libdisplay/libdisplay.a \ $(top_builddir)/src/libdisplay/libdisplay.a \
$(top_builddir)/src/libcompandor/libcompandor.a \ $(top_builddir)/src/libcompandor/libcompandor.a \
$(top_builddir)/src/libjitter/libjitter.a \ $(top_builddir)/src/libjitter/libjitter.a \
$(top_builddir)/src/libtimer/libtimer.a \
$(top_builddir)/src/libselect/libselect.a \
$(top_builddir)/src/libsamplerate/libsamplerate.a \ $(top_builddir)/src/libsamplerate/libsamplerate.a \
$(top_builddir)/src/libscrambler/libscrambler.a \ $(top_builddir)/src/libscrambler/libscrambler.a \
$(top_builddir)/src/libemphasis/libemphasis.a \ $(top_builddir)/src/libemphasis/libemphasis.a \
@@ -39,8 +35,10 @@ cnetz_LDADD = \
$(top_builddir)/src/libfilter/libfilter.a \ $(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/libwave/libwave.a \ $(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \ $(top_builddir)/src/libsample/libsample.a \
$(top_builddir)/src/libg711/libg711.a \
$(top_builddir)/src/libaaimage/libaaimage.a \ $(top_builddir)/src/libaaimage/libaaimage.a \
$(top_builddir)/src/liblogging/liblogging.a \
$(LIBOSMOCORE_LIBS) \
$(LIBOSMOCC_LIBS) \
-lm -lm
if HAVE_ALSA if HAVE_ALSA
+165 -162
View File
File diff suppressed because it is too large. Load diff
+4 -4
View File
@@ -1,5 +1,5 @@
#include "../libcompandor/compandor.h" #include "../libcompandor/compandor.h"
#include "../libtimer/timer.h" #include <osmocom/core/timer.h>
#include "../libmobile/sender.h" #include "../libmobile/sender.h"
#include "../libscrambler/scrambler.h" #include "../libscrambler/scrambler.h"
typedef struct cnetz cnetz_t; 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_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_AFV 4 /* number of release frames to send during distributed signaling */
#define N 3 /* now many times we repeat a message on OgK */ #define N 3 /* now many times we repeat a message on OgK */
#define T_VAG2 180 /* time on outgoing queue */ #define T_VAG2 180,0 /* time on outgoing queue */
#define T_VAK 60 /* time on incoming queue */ #define T_VAK 60,0 /* time on incoming queue */
#define T_AP 750 /* Time to wait for SIM card's authentication reply */ #define T_AP 0,750000 /* Time to wait for SIM card's authentication reply */
/* clear causes */ /* clear causes */
#define CNETZ_CAUSE_GASSENBESETZT 0 /* network congested */ #define CNETZ_CAUSE_GASSENBESETZT 0 /* network congested */
+24 -23
View File
@@ -22,7 +22,8 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "../libmobile/get_time.h"
#include "cnetz.h" #include "cnetz.h"
#include "database.h" #include "database.h"
#include "sysinfo.h" #include "sysinfo.h"
@@ -45,7 +46,7 @@ typedef struct cnetz_database {
int eingebucht; /* set if still available */ int eingebucht; /* set if still available */
double last_seen; double last_seen;
int busy; /* set if currently in a call */ 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 */ int retry; /* counts number of retries */
} cnetz_db_t; } cnetz_db_t;
@@ -72,14 +73,14 @@ static void remove_db(cnetz_db_t *db)
while (*dbp && *dbp != db) while (*dbp && *dbp != db)
dbp = &((*dbp)->next); dbp = &((*dbp)->next);
if (!(*dbp)) { 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(); abort();
} }
*dbp = db->next; *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); free(db);
} }
@@ -90,15 +91,15 @@ static void db_timeout(void *data)
cnetz_db_t *db = data; cnetz_db_t *db = data;
int rc; 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); rc = cnetz_meldeaufruf(db->futln_nat, db->futln_fuvst, db->futln_rest, db->ogk_kanal);
if (rc < 0) { if (rc < 0) {
/* OgK is used for speech, but this never happens in a real /* OgK is used for speech, but this never happens in a real
* network. We just assume that the phone has responded and * network. We just assume that the phone has responded and
* assume we had a response. */ * assume we had a response. */
PDEBUG(DDB, DEBUG_INFO, "OgK busy, so we assume a positive response.\n"); LOGP(DDB, LOGL_INFO, "OgK busy, so we assume a positive response.\n");
timer_start(&db->timer, si.meldeinterval); /* when to check avaiability again */ osmo_timer_schedule(&db->timer, si.meldeinterval,0); /* when to check avaiability again */
db->retry = 0; 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) { if (!db) {
db = calloc(1, sizeof(*db)); db = calloc(1, sizeof(*db));
if (!db) { if (!db) {
PDEBUG(DDB, DEBUG_ERROR, "No memory!\n"); LOGP(DDB, LOGL_ERROR, "No memory!\n");
return 0; return 0;
} }
timer_init(&db->timer, db_timeout, db); osmo_timer_setup(&db->timer, db_timeout, db);
db->eingebucht = 1; db->eingebucht = 1;
db->futln_nat = futln_nat; 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 = &((*dbp)->next);
*dbp = db; *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) 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; db->busy = busy;
if (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); 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);
timer_stop(&db->timer); osmo_timer_del(&db->timer);
} else if (!failed) { } 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); 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);
timer_start(&db->timer, si.meldeinterval); /* when to check avaiability (again) */ osmo_timer_schedule(&db->timer, si.meldeinterval,0); /* when to check avaiability (again) */
db->retry = 0; db->retry = 0;
db->eingebucht = 1; db->eingebucht = 1;
db->last_seen = get_time(); db->last_seen = get_time();
} else { } else {
db->retry++; 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) { 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; db->eingebucht = 0;
return db->extended; 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) if (futelg_bit)
@@ -211,18 +212,18 @@ void dump_db(void)
int last; int last;
char attached[16]; char attached[16];
PDEBUG(DDB, DEBUG_NOTICE, "Dump of subscriber database:\n"); LOGP(DDB, LOGL_NOTICE, "Dump of subscriber database:\n");
if (!db) { if (!db) {
PDEBUG(DDB, DEBUG_NOTICE, " - No subscribers attached!\n"); LOGP(DDB, LOGL_NOTICE, " - No subscribers attached!\n");
return; return;
} }
PDEBUG(DDB, DEBUG_NOTICE, "Subscriber\tAttached\tBusy\t\tLast seen\tMeldeaufrufe\n"); LOGP(DDB, LOGL_NOTICE, "Subscriber\tAttached\tBusy\t\tLast seen\tMeldeaufrufe\n");
PDEBUG(DDB, DEBUG_NOTICE, "-------------------------------------------------------------------------------\n"); LOGP(DDB, LOGL_NOTICE, "-------------------------------------------------------------------------------\n");
while (db) { while (db) {
last = (db->busy) ? 0 : (uint32_t)(now - db->last_seen); last = (db->busy) ? 0 : (uint32_t)(now - db->last_seen);
sprintf(attached, "YES (OGK %d)", db->ogk_kanal); 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; db = db->next;
} }
} }
+22 -21
View File
@@ -26,8 +26,9 @@
#include <math.h> #include <math.h>
#include <errno.h> #include <errno.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "../libmobile/call.h" #include "../libmobile/call.h"
#include "../libmobile/get_time.h"
#include "cnetz.h" #include "cnetz.h"
#include "sysinfo.h" #include "sysinfo.h"
#include "telegramm.h" #include "telegramm.h"
@@ -84,7 +85,7 @@ static void dsp_init_ramp(cnetz_t *cnetz)
double c; double c;
int i; 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++) { for (i = 0; i < 256; i++) {
/* use square-root of cosine ramp. tests showed that phones are more /* use square-root of cosine ramp. tests showed that phones are more
* happy with that. (This is not correct pulse shaping!) */ * happy with that. (This is not correct pulse shaping!) */
@@ -104,7 +105,7 @@ int dsp_init_sender(cnetz_t *cnetz, int measure_speed, double clock_speed[2], en
int rc = 0; int rc = 0;
double size; 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 */ /* set modulation parameters */
sender_set_fm(&cnetz->sender, MAX_DEVIATION, MAX_MODULATION, speech_deviation, MAX_DISPLAY); sender_set_fm(&cnetz->sender, MAX_DEVIATION, MAX_MODULATION, speech_deviation, MAX_DISPLAY);
@@ -115,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) { 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; 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_bitduration = (double)cnetz->sender.samplerate / ((double)BITRATE / (1.0 + clock_speed[1] / 1000000.0));
cnetz->fsk_tx_bitstep = 1.0 / cnetz->fsk_bitduration; 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 */ 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_size = size * 1.1; /* more to compensate clock speed */
cnetz->fsk_tx_buffer = calloc(sizeof(sample_t), cnetz->fsk_tx_buffer_size); cnetz->fsk_tx_buffer = calloc(sizeof(sample_t), cnetz->fsk_tx_buffer_size);
if (!cnetz->fsk_tx_buffer) { if (!cnetz->fsk_tx_buffer) {
PDEBUG_CHAN(DDSP, DEBUG_ERROR, "No memory!\n"); LOGP_CHAN(DDSP, LOGL_ERROR, "No memory!\n");
rc = -ENOMEM; rc = -ENOMEM;
goto error; goto error;
} }
@@ -143,7 +144,7 @@ int dsp_init_sender(cnetz_t *cnetz, int measure_speed, double clock_speed[2], en
/* create speech buffer */ /* 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). */ 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) { if (!cnetz->dsp_speech_buffer) {
PDEBUG_CHAN(DDSP, DEBUG_ERROR, "No memory!\n"); LOGP_CHAN(DDSP, LOGL_ERROR, "No memory!\n");
rc = -ENOMEM; rc = -ENOMEM;
goto error; goto error;
} }
@@ -169,7 +170,7 @@ int dsp_init_sender(cnetz_t *cnetz, int measure_speed, double clock_speed[2], en
#ifdef TEST_SCRAMBLE #ifdef TEST_SCRAMBLE
rc = jitter_create(&scrambler_test_jb, "scramble", cnetz->sender.samplerate, sizeof(sample_t), JITTER_AUDIO); rc = jitter_create(&scrambler_test_jb, "scramble", cnetz->sender.samplerate, sizeof(sample_t), JITTER_AUDIO);
if (rc < 0) { 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 jitter buffer for scrambler test!\n");
exit(0); exit(0);
} }
scrambler_setup(&scrambler_test_scrambler1, cnetz->sender.samplerate); scrambler_setup(&scrambler_test_scrambler1, cnetz->sender.samplerate);
@@ -188,7 +189,7 @@ error:
void dsp_cleanup_sender(cnetz_t *cnetz) 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) { if (cnetz->fsk_tx_buffer) {
free(cnetz->fsk_tx_buffer); free(cnetz->fsk_tx_buffer);
@@ -256,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] += cs->speed_ppm[index][(cs->idx[index] - i - 1) & 0xff];
speed_ppm_avg[index] /= (double)cs->num[index]; 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) static int fsk_nothing_encode(cnetz_t *cnetz)
@@ -642,10 +643,10 @@ again:
* because one has a phase wrap before and the other after a sample. * because one has a phase wrap before and the other after a sample.
* then we do it next super frame cycle */ * then we do it next super frame cycle */
if (master->frame_last_scount == cnetz->fsk_tx_scount) { 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; cnetz->fsk_tx_phase = master->frame_last_phase;
} else { } 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");
} }
} }
} }
@@ -654,7 +655,7 @@ again:
if (cnetz->sched_dsp_mode_ts >= 0 && cnetz->sched_r_m == 0) { if (cnetz->sched_dsp_mode_ts >= 0 && cnetz->sched_r_m == 0) {
if (cnetz->sched_dsp_mode_ts == cnetz->sched_ts) { if (cnetz->sched_dsp_mode_ts == cnetz->sched_ts) {
/* OgK / SpK(K) / SpK(V) */ /* 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->sched_dsp_mode_ts = -1;
cnetz_set_dsp_mode(cnetz, cnetz->sched_dsp_mode); cnetz_set_dsp_mode(cnetz, cnetz->sched_dsp_mode);
} }
@@ -671,14 +672,14 @@ again:
cnetz->sched_last_ts = cnetz->sched_ts; cnetz->sched_last_ts = cnetz->sched_ts;
bits = cnetz_encode_telegramm(cnetz); bits = cnetz_encode_telegramm(cnetz);
if (bits) { 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); fsk_block_encode(cnetz, bits, 1);
} else } else
fsk_nothing_encode(cnetz); fsk_nothing_encode(cnetz);
} else { } else {
bits = cnetz_encode_telegramm(cnetz); bits = cnetz_encode_telegramm(cnetz);
if (bits) { 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); fsk_block_encode(cnetz, bits, 1);
} else } else
fsk_nothing_encode(cnetz); fsk_nothing_encode(cnetz);
@@ -690,7 +691,7 @@ again:
case DSP_MODE_SPK_K: case DSP_MODE_SPK_K:
bits = cnetz_encode_telegramm(cnetz); bits = cnetz_encode_telegramm(cnetz);
if (bits) { 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); fsk_block_encode(cnetz, bits, 0);
} else } else
fsk_nothing_encode(cnetz); fsk_nothing_encode(cnetz);
@@ -698,7 +699,7 @@ again:
case DSP_MODE_SPK_V: case DSP_MODE_SPK_V:
bits = cnetz_encode_telegramm(cnetz); bits = cnetz_encode_telegramm(cnetz);
if (bits) { 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); fsk_distributed_encode(cnetz, bits);
} else } else
fsk_nothing_encode(cnetz); fsk_nothing_encode(cnetz);
@@ -860,7 +861,7 @@ void unshrink_speech(cnetz_t *cnetz, sample_t *speech_buffer, int count)
void cnetz_set_dsp_mode(cnetz_t *cnetz, enum dsp_mode mode) void cnetz_set_dsp_mode(cnetz_t *cnetz, enum dsp_mode mode)
{ {
if (mode != cnetz->dsp_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; cnetz->dsp_mode = mode;
} }
/* we must get rid of partly received frame */ /* we must get rid of partly received frame */
@@ -870,10 +871,10 @@ 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) 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) { 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; 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 = mode;
cnetz->sched_dsp_mode_ts = timeslot; cnetz->sched_dsp_mode_ts = timeslot;
} }
+7 -7
View File
@@ -132,7 +132,7 @@ static int debug = 0;
#include <string.h> #include <string.h>
#include <math.h> #include <math.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "cnetz.h" #include "cnetz.h"
#include "dsp.h" #include "dsp.h"
#include "telegramm.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)); memset(fsk, 0, sizeof(*fsk));
if (samplerate < 48000) { 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; return -1;
} }
@@ -152,13 +152,13 @@ int fsk_fm_init(fsk_fm_demod_t *fsk, cnetz_t *cnetz, int samplerate, double bitr
switch (demod) { switch (demod) {
case FSK_DEMOD_SLOPE: 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; break;
case FSK_DEMOD_LEVEL: 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; break;
default: default:
PDEBUG(DDSP, DEBUG_ERROR, "Wrong demod type, please fix!\n"); LOGP(DDSP, LOGL_ERROR, "Wrong demod type, please fix!\n");
abort(); 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); half = (int)((double)samplerate / bitrate / 2.0 + 0.5);
fsk->bit_buffer_spl = calloc(sizeof(fsk->bit_buffer_spl[0]), len); fsk->bit_buffer_spl = calloc(sizeof(fsk->bit_buffer_spl[0]), len);
if (!fsk->bit_buffer_spl) { if (!fsk->bit_buffer_spl) {
PDEBUG(DDSP, DEBUG_ERROR, "No mem!\n"); LOGP(DDSP, LOGL_ERROR, "No mem!\n");
goto error; 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_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); fsk->speech_buffer = calloc(sizeof(fsk->speech_buffer[0]), fsk->speech_size);
if (!fsk->speech_buffer) { if (!fsk->speech_buffer) {
PDEBUG(DDSP, DEBUG_ERROR, "No mem!\n"); LOGP(DDSP, LOGL_ERROR, "No mem!\n");
goto error; goto error;
} }
+2 -1
View File
@@ -24,7 +24,7 @@
#include <errno.h> #include <errno.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libmobile/main_mobile.h" #include "../libmobile/main_mobile.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "../libmobile/call.h" #include "../libmobile/call.h"
#include "../anetz/freiton.h" #include "../anetz/freiton.h"
#include "../anetz/besetztton.h" #include "../anetz/besetztton.h"
@@ -700,6 +700,7 @@ fail:
cnetz_destroy(sender_head); cnetz_destroy(sender_head);
/* exits */ /* exits */
main_mobile_exit();
fm_exit(); fm_exit();
options_free(); options_free();
+37 -37
View File
@@ -27,7 +27,7 @@
#include <errno.h> #include <errno.h>
#include <math.h> #include <math.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "cnetz.h" #include "cnetz.h"
#include "dsp.h" #include "dsp.h"
#include "sysinfo.h" #include "sysinfo.h"
@@ -510,13 +510,13 @@ static int encode_dialstring(uint64_t *value, const char *number)
max = strlen(number); max = strlen(number);
if (max > 16) { 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; return -EINVAL;
} }
if (max == 16) { if (max == 16) {
if (number[0] != '0') { 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; return -EINVAL;
} }
*value = 0; *value = 0;
@@ -575,7 +575,7 @@ int match_fuz(telegramm_t *telegramm)
if (telegramm->fuz_nationalitaet != si.fuz_nat if (telegramm->fuz_nationalitaet != si.fuz_nat
|| telegramm->fuz_fuvst_nr != si.fuz_fuvst || telegramm->fuz_fuvst_nr != si.fuz_fuvst
|| telegramm->fuz_rest_nr != si.fuz_rest) { || 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; 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 if (telegramm->futln_nationalitaet != futln_nat
|| telegramm->futln_heimat_fuvst_nr != futln_fuvst || telegramm->futln_heimat_fuvst_nr != futln_fuvst
|| telegramm->futln_rest_nr != futln_rest) { || 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; return 0;
} }
@@ -600,19 +600,19 @@ static void debug_parameter(char digit, uint64_t value)
parameter = get_parameter(digit); parameter = get_parameter(digit);
if (!parameter) { 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(); abort();
} }
if (parameter->value_names) 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) 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') { else if (digit == 'X') {
char wahlziffern[17]; char wahlziffern[17];
decode_dialstring(wahlziffern, value); 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 } 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 /* encode telegram to 70 bits
@@ -628,12 +628,12 @@ static char *assemble_telegramm(const telegramm_t *telegramm, int debug)
int rc; int rc;
if (telegramm->opcode >= 64) { 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(); abort();
} }
if (debug) 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 */ /* copy opcode */
for (i = 0; i < 6; i++) for (i = 0; i < 6; i++)
@@ -717,7 +717,7 @@ static char *assemble_telegramm(const telegramm_t *telegramm, int debug)
case 'X': case 'X':
rc = encode_dialstring(&value, telegramm->wahlziffern); rc = encode_dialstring(&value, telegramm->wahlziffern);
if (rc < 0) { 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(); abort();
} }
break; break;
@@ -806,10 +806,10 @@ static char *assemble_telegramm(const telegramm_t *telegramm, int debug)
value = telegramm->illegaler_opcode; value = telegramm->illegaler_opcode;
break; break;
default: 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(); abort();
} }
if (debug && debuglevel <= DEBUG_DEBUG) if (debug && loglevel <= LOGL_DEBUG)
debug_parameter(parameter, value); debug_parameter(parameter, value);
val = value; val = value;
for (j = 0; string[63 - i - j] == parameter; j++) { 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; val >>= 1;
} }
if (val) 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; i += j - 1;
} }
bits[70] = '\0'; bits[70] = '\0';
if (debug) { if (debug) {
PDEBUG(DFRAME, DEBUG_DEBUG, "OOOOOO%s\n", string); LOGP(DFRAME, LOGL_DEBUG, "OOOOOO%s\n", string);
PDEBUG(DFRAME, DEBUG_DEBUG, "%s\n", bits); LOGP(DFRAME, LOGL_DEBUG, "%s\n", bits);
} }
return bits; return bits;
@@ -848,7 +848,7 @@ static void disassemble_telegramm(telegramm_t *telegramm, const char *bits, int
value = (value << 1) | (bits[i] == '1'); value = (value << 1) | (bits[i] == '1');
telegramm->opcode = value; 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 */ /* copy parameters */
if (auth && bits[1]) /* auth flag and chip card flag */ 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 = (value >> 1) | ((uint64_t)(bits[69 - i - j] == '1') << 63);
value >>= 64 - j; value >>= 64 - j;
i += j - 1; i += j - 1;
if (debuglevel <= DEBUG_DEBUG) if (loglevel <= LOGL_DEBUG)
debug_parameter(parameter, value); debug_parameter(parameter, value);
switch (parameter) { switch (parameter) {
case 'A': case 'A':
@@ -1021,18 +1021,18 @@ static void disassemble_telegramm(telegramm_t *telegramm, const char *bits, int
telegramm->illegaler_opcode = value; telegramm->illegaler_opcode = value;
break; break;
default: 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(); abort();
} }
} }
if (debuglevel <= DEBUG_DEBUG) { if (loglevel <= LOGL_DEBUG) {
char debug_bits[71]; char debug_bits[71];
memcpy(debug_bits, bits, 70); memcpy(debug_bits, bits, 70);
debug_bits[70] = '\0'; debug_bits[70] = '\0';
PDEBUG(DFRAME, DEBUG_DEBUG, "OOOOOO%s\n", string); LOGP(DFRAME, LOGL_DEBUG, "OOOOOO%s\n", string);
PDEBUG(DFRAME, DEBUG_DEBUG, "%s\n", debug_bits); 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'; fail_str[10] = '\0';
if (failed) 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) 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 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) if (failed)
return NULL; return NULL;
@@ -1496,13 +1496,13 @@ void cnetz_decode_telegramm(cnetz_t *cnetz, const char *bits, double level, doub
break; break;
} }
if (i == 70) { 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; 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) 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); disassemble_telegramm(&telegramm, bits, si.authentifikationsbit);
opcode = telegramm.opcode; 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; telegramm.sync_time = sync_time;
if (cnetz->sender.loopback) { 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); cnetz_sync_frame(cnetz, sync_time, -1);
return; return;
} }
if (opcode >= 32) { 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; return;
} }
if (definition_opcode[opcode].block == BLOCK_I) { 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; return;
} }
@@ -1544,7 +1544,7 @@ void cnetz_decode_telegramm(cnetz_t *cnetz, const char *bits, double level, doub
switch (cnetz->dsp_mode) { switch (cnetz->dsp_mode) {
case DSP_MODE_OGK: case DSP_MODE_OGK:
if (definition_opcode[opcode].block != BLOCK_R && definition_opcode[opcode].block != BLOCK_M) { 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; return;
} }
/* determine block by last timeslot sent and by message type /* 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; break;
case DSP_MODE_SPK_K: case DSP_MODE_SPK_K:
if (definition_opcode[opcode].block != BLOCK_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; return;
} }
cnetz_receive_telegramm_spk_k(cnetz, &telegramm); cnetz_receive_telegramm_spk_k(cnetz, &telegramm);
break; break;
case DSP_MODE_SPK_V: case DSP_MODE_SPK_V:
if (definition_opcode[opcode].block != BLOCK_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; return;
} }
cnetz_receive_telegramm_spk_v(cnetz, &telegramm); cnetz_receive_telegramm_spk_v(cnetz, &telegramm);
@@ -1622,7 +1622,7 @@ const char *cnetz_encode_telegramm(cnetz_t *cnetz)
cnetz->sched_lr_debugged = 1; cnetz->sched_lr_debugged = 1;
if (opcode == OPCODE_MLR_M && !cnetz->sched_mlr_debugged) { if (opcode == OPCODE_MLR_M && !cnetz->sched_mlr_debugged) {
cnetz->sched_mlr_debugged = 1; 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; return bits;
+20 -20
View File
@@ -22,7 +22,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <math.h> #include <math.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "../libmobile/call.h" #include "../libmobile/call.h"
#include "../libmobile/cause.h" #include "../libmobile/cause.h"
#include "cnetz.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 ((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 (!isnan(trans->rf_level_db) && !isnan(rf_level_db) && trans->cnetz->kanal != cnetz->kanal) {
if (rf_level_db > trans->rf_level_db) { 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; trans->rf_level_db = rf_level_db;
unlink_transaction(trans); unlink_transaction(trans);
link_transaction(trans, cnetz); link_transaction(trans, cnetz);
@@ -62,14 +62,14 @@ transaction_t *create_transaction(cnetz_t *cnetz, uint64_t state, uint8_t futln_
return trans; return trans;
} }
if (rf_level_db < trans->rf_level_db) { 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; 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; 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); destroy_transaction(trans);
if (old_cnetz) /* should be... */ if (old_cnetz) /* should be... */
cnetz_go_idle(old_cnetz); 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)); trans = calloc(1, sizeof(*trans));
if (!trans) { if (!trans) {
PDEBUG(DTRANS, DEBUG_ERROR, "No memory!\n"); LOGP(DTRANS, LOGL_ERROR, "No memory!\n");
return NULL; return NULL;
} }
timer_init(&trans->timer, transaction_timeout, trans); osmo_timer_setup(&trans->timer, transaction_timeout, trans);
trans_new_state(trans, state); trans_new_state(trans, state);
trans->futln_nat = futln_nat; 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; trans->mt_call = 1;
const char *rufnummer = transaction2rufnummer(trans); 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); link_transaction(trans, cnetz);
@@ -119,9 +119,9 @@ void destroy_transaction(transaction_t *trans)
unlink_transaction(trans); unlink_transaction(trans);
const char *rufnummer = transaction2rufnummer(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); trans_new_state(trans, 0);
@@ -134,7 +134,7 @@ void link_transaction(transaction_t *trans, cnetz_t *cnetz)
transaction_t **transp; transaction_t **transp;
/* attach to end of list, so first transaction is served first */ /* 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->cnetz = cnetz;
trans->next = NULL; trans->next = NULL;
transp = &cnetz->trans_list; transp = &cnetz->trans_list;
@@ -150,12 +150,12 @@ void unlink_transaction(transaction_t *trans)
transaction_t **transp; transaction_t **transp;
/* unlink */ /* 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; transp = &trans->cnetz->trans_list;
while (*transp && *transp != trans) while (*transp && *transp != trans)
transp = &((*transp)->next); transp = &((*transp)->next);
if (!(*transp)) { 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(); abort();
} }
*transp = trans->next; *transp = trans->next;
@@ -170,7 +170,7 @@ transaction_t *search_transaction(cnetz_t *cnetz, uint64_t state_mask)
while (trans) { while (trans) {
if ((trans->state & state_mask)) { if ((trans->state & state_mask)) {
const char *rufnummer = transaction2rufnummer(trans); 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; return trans;
} }
trans = trans->next; 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_fuvst == futln_fuvst
&& trans->futln_rest == futln_rest) { && trans->futln_rest == futln_rest) {
const char *rufnummer = transaction2rufnummer(trans); 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; return trans;
} }
trans = trans->next; trans = trans->next;
@@ -224,7 +224,7 @@ transaction_t *search_transaction_callref(cnetz_t *cnetz, int callref)
while (trans) { while (trans) {
if (trans->callref == callref) { if (trans->callref == callref) {
const char *rufnummer = transaction2rufnummer(trans); 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; return trans;
} }
trans = trans->next; trans = trans->next;
@@ -262,7 +262,7 @@ transaction_t *search_transaction_queue(void)
if (found) { if (found) {
const char *rufnummer = transaction2rufnummer(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; 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) 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; trans->state = state;
/* in case of a queue, set new positon */ /* in case of a queue, set new positon */
if (!trans->queue_position && (state == TRANS_MO_QUEUE || state == TRANS_MT_QUEUE)) 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 */ /* flush after this very trans */
while (trans->next) { 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); destroy_transaction(trans->next);
} }
/* flush before this very trans */ /* flush before this very trans */
while (cnetz->trans_list != 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); destroy_transaction(cnetz->trans_list);
} }
} }
+1 -1
View File
@@ -50,7 +50,7 @@ typedef struct transaction {
int8_t release_cause; /* reason for release, (c-netz coding) */ int8_t release_cause; /* reason for release, (c-netz coding) */
int try; /* counts resending messages */ int try; /* counts resending messages */
int repeat; /* counts repeating 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 mo_call; /* flags a moile originating call */
int mt_call; /* flags a moile terminating call */ int mt_call; /* flags a moile terminating call */
int page_failed; /* failed to get a response from MS */ int page_failed; /* failed to get a response from MS */
+2 -2
View File
@@ -12,15 +12,15 @@ datenklo_SOURCES = \
datenklo_LDADD = \ datenklo_LDADD = \
$(COMMON_LA) \ $(COMMON_LA) \
$(top_builddir)/src/liboptions/liboptions.a \ $(top_builddir)/src/liboptions/liboptions.a \
$(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libfsk/libfsk.a \ $(top_builddir)/src/libfsk/libfsk.a \
$(top_builddir)/src/libtimer/libtimer.a \
$(top_builddir)/src/libfm/libfm.a \ $(top_builddir)/src/libfm/libfm.a \
$(top_builddir)/src/libfilter/libfilter.a \ $(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/libsound/libsound.a \ $(top_builddir)/src/libsound/libsound.a \
$(top_builddir)/src/libwave/libwave.a \ $(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libdisplay/libdisplay.a \ $(top_builddir)/src/libdisplay/libdisplay.a \
$(top_builddir)/src/libsample/libsample.a \ $(top_builddir)/src/libsample/libsample.a \
$(top_builddir)/src/liblogging/liblogging.a \
$(LIBOSMOCORE_LIBS) \
$(ALSA_LIBS) \ $(ALSA_LIBS) \
$(FUSE_LIBS) \ $(FUSE_LIBS) \
-lm -lm
+87 -85
View File
@@ -75,12 +75,14 @@
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
#include <math.h> #include <math.h>
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "../libtimer/timer.h" #include <osmocom/core/timer.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libfsk/fsk.h" #include "../libfsk/fsk.h"
#include "am791x.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 db2level(db) pow(10, (double)(db) / 20.0)
#define level2db(level) (20 * log10(level)) #define level2db(level) (20 * log10(level))
@@ -373,19 +375,19 @@ static int fsk_send_bit(void *inst)
/* main channel returns TD */ /* main channel returns TD */
if (!am791x->block_td) { if (!am791x->block_td) {
#ifdef HEAVY_DEBUG #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 #endif
return bit; return bit;
} }
/* back channel returns BTD */ /* back channel returns BTD */
if (!am791x->block_btd) { if (!am791x->block_btd) {
#ifdef HEAVY_DEBUG #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 #endif
return bbit; return bbit;
} }
#ifdef HEAVY_DEBUG #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 #endif
return 1; return 1;
} }
@@ -399,7 +401,7 @@ static void fsk_receive_bit(void *inst, int bit, double quality, double level)
int *block, *cd; int *block, *cd;
#ifdef HEAVY_DEBUG #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 #endif
if (!am791x->rx_back_channel) { 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); handle_rx_state(am791x);
} else } else
if (!(*block) && !(*cd) && level > am791x->cd_on && quality >= RX_QUALITY) { 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; *cd = 1;
handle_rx_state(am791x); handle_rx_state(am791x);
} else } else
if (*cd && (level < am791x->cd_off || quality < RX_QUALITY)) { 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; *cd = 0;
handle_rx_state(am791x); 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 */ /* main channel forwards bit to RD */
if (!am791x->block_rd) { if (!am791x->block_rd) {
#ifdef HEAVY_DEBUG #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 #endif
am791x->rd_cb(am791x->inst, bit, quality * 100.0, level2db(level)); am791x->rd_cb(am791x->inst, bit, quality * 100.0, level2db(level));
} else { } else {
#ifdef HEAVY_DEBUG #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 #endif
am791x->rd_cb(am791x->inst, 1, NAN, NAN); am791x->rd_cb(am791x->inst, 1, NAN, NAN);
} }
/* main channel forwards bit to RD */ /* main channel forwards bit to RD */
if (!am791x->block_brd) { if (!am791x->block_brd) {
#ifdef HEAVY_DEBUG #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 #endif
am791x->brd_cb(am791x->inst, bit, quality * 100.0, level2db(level)); am791x->brd_cb(am791x->inst, bit, quality * 100.0, level2db(level));
} else { } else {
#ifdef HEAVY_DEBUG #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 #endif
am791x->brd_cb(am791x->inst, 1, NAN, NAN); am791x->brd_cb(am791x->inst, 1, NAN, NAN);
} }
@@ -529,9 +531,9 @@ static void set_filters(am791x_t *am791x)
/* transmitter used */ /* transmitter used */
if (f0_tx > 0 && am791x->f0_tx == 0) { 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) 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 { else {
am791x->f0_tx = f0_tx; am791x->f0_tx = f0_tx;
am791x->f1_tx = f1_tx; am791x->f1_tx = f1_tx;
@@ -548,9 +550,9 @@ static void set_filters(am791x_t *am791x)
/* receiver used */ /* receiver used */
if (f0_rx > 0 && am791x->f0_rx == 0) { 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) 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 { else {
am791x->f0_rx = f0_rx; am791x->f0_rx = f0_rx;
am791x->f1_rx = f1_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) static void new_tx_state(am791x_t *am791x, enum am791x_st state)
{ {
if (am791x->tx_state != 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; am791x->tx_state = state;
} }
static void new_rx_state(am791x_t *am791x, enum am791x_st state) static void new_rx_state(am791x_t *am791x, enum am791x_st state)
{ {
if (am791x->rx_state != 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; 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) static void set_flag(int *flag_p, int value, const char *name)
{ {
if (*flag_p != value) { if (*flag_p != value) {
PDEBUG(DAM791X, DEBUG_DEBUG, " -> %s\n", name); LOGP(DAM791X, LOGL_DEBUG, " -> %s\n", name);
*flag_p = value; *flag_p = value;
} }
} }
@@ -588,7 +590,7 @@ static void set_flag(int *flag_p, int value, const char *name)
static void go_main_channel_tx(am791x_t *am791x) 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) */ /* only block RD, if not full duplex and not 4-wire (loopback mode) */
if (!am791x->fullduplex && !am791x->loopback_main) { if (!am791x->fullduplex && !am791x->loopback_main) {
@@ -599,7 +601,7 @@ static void go_main_channel_tx(am791x_t *am791x)
/* activate TD now and set CTS timer (RCON) */ /* activate TD now and set CTS timer (RCON) */
set_flag(&am791x->block_td, 0, "TD RELEASED"); set_flag(&am791x->block_td, 0, "TD RELEASED");
set_flag(&am791x->tx_silence, 0, "RESET SILENCE"); set_flag(&am791x->tx_silence, 0, "RESET SILENCE");
timer_start(&am791x->tx_timer, am791x->t_rcon); osmo_timer_schedule(&am791x->tx_timer, FLOAT_TO_TIMEOUT(am791x->t_rcon));
new_tx_state(am791x, AM791X_STATE_RCON); new_tx_state(am791x, AM791X_STATE_RCON);
set_filters(am791x); set_filters(am791x);
/* check CD to be blocked */ /* 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) 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->block_td, 1, "TD IGNORED");
set_flag(&am791x->tx_silence, 1, "SET SILENCE"); 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) 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); new_tx_state(am791x, AM791X_STATE_DATA);
/* CTS on */ /* CTS on */
@@ -638,7 +640,7 @@ static void rcon_done(am791x_t *am791x)
static void tx_data_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); new_tx_state(am791x, AM791X_STATE_RCOFF);
set_flag(&am791x->block_td, 1, "TD IGNORED"); set_flag(&am791x->block_td, 1, "TD IGNORED");
@@ -650,12 +652,12 @@ static void tx_data_done(am791x_t *am791x)
if (!am791x->fullduplex) { if (!am791x->fullduplex) {
set_flag(&am791x->squelch, 1, "SET SQUELCH (ON)"); set_flag(&am791x->squelch, 1, "SET SQUELCH (ON)");
} }
timer_start(&am791x->tx_timer, am791x->t_rcoff); osmo_timer_schedule(&am791x->tx_timer, FLOAT_TO_TIMEOUT(am791x->t_rcoff));
} }
static void rcoff_done(am791x_t *am791x) static void rcoff_done(am791x_t *am791x)
{ {
PDEBUG(DAM791X, DEBUG_DEBUG, "Transmission over\n"); LOGP(DAM791X, LOGL_DEBUG, "Transmission over\n");
/* CTS off */ /* CTS off */
am791x->cts_cb(am791x->inst, 0); am791x->cts_cb(am791x->inst, 0);
@@ -665,17 +667,17 @@ static void rcoff_done(am791x_t *am791x)
return; return;
} }
if (!am791x->sto) { if (!am791x->sto) {
timer_start(&am791x->tx_timer, am791x->t_sq - am791x->t_rcoff); osmo_timer_schedule(&am791x->tx_timer, FLOAT_TO_TIMEOUT(am791x->t_sq - am791x->t_rcoff));
new_tx_state(am791x, AM791X_STATE_SQ_OFF); new_tx_state(am791x, AM791X_STATE_SQ_OFF);
return; return;
} }
timer_start(&am791x->tx_timer, am791x->t_sto - am791x->t_rcoff); osmo_timer_schedule(&am791x->tx_timer, FLOAT_TO_TIMEOUT(am791x->t_sto - am791x->t_rcoff));
new_tx_state(am791x, AM791X_STATE_STO_OFF); new_tx_state(am791x, AM791X_STATE_STO_OFF);
} }
static void sq_done(am791x_t *am791x) 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"); set_flag(&am791x->block_cd, 0, "CD RELEASED");
new_tx_state(am791x, AM791X_STATE_INIT); new_tx_state(am791x, AM791X_STATE_INIT);
@@ -690,16 +692,16 @@ static void sq_done(am791x_t *am791x)
static void sto_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"); set_flag(&am791x->tx_sto, 0, "stop STO");
timer_start(&am791x->tx_timer, am791x->t_sq - am791x->t_sto); osmo_timer_schedule(&am791x->tx_timer, FLOAT_TO_TIMEOUT(am791x->t_sq - am791x->t_sto));
new_tx_state(am791x, AM791X_STATE_SQ_OFF); new_tx_state(am791x, AM791X_STATE_SQ_OFF);
} }
static void go_back_channel_tx(am791x_t *am791x) 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) { if (!am791x->loopback_back) {
set_flag(&am791x->block_brd, 1, "BRD = MARK"); set_flag(&am791x->block_brd, 1, "BRD = MARK");
@@ -709,7 +711,7 @@ static void go_back_channel_tx(am791x_t *am791x)
/* activate BTD now and set BCTS timer (BRCON) */ /* activate BTD now and set BCTS timer (BRCON) */
set_flag(&am791x->block_btd, 0, "BTD RELEASED"); set_flag(&am791x->block_btd, 0, "BTD RELEASED");
set_flag(&am791x->tx_silence, 0, "RESET SILENCE"); set_flag(&am791x->tx_silence, 0, "RESET SILENCE");
timer_start(&am791x->tx_timer, am791x->t_brcon); osmo_timer_schedule(&am791x->tx_timer, FLOAT_TO_TIMEOUT(am791x->t_brcon));
new_tx_state(am791x, AM791X_STATE_BRCON); new_tx_state(am791x, AM791X_STATE_BRCON);
set_filters(am791x); set_filters(am791x);
/* check BCD to be blocked */ /* check BCD to be blocked */
@@ -723,7 +725,7 @@ static void go_back_channel_tx(am791x_t *am791x)
static void brcon_release_brts(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"); set_flag(&am791x->tx_silence, 1, "SET SILENCE");
new_tx_state(am791x, AM791X_STATE_INIT); new_tx_state(am791x, AM791X_STATE_INIT);
@@ -732,7 +734,7 @@ static void brcon_release_brts(am791x_t *am791x)
static void brcon_done(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); new_tx_state(am791x, AM791X_STATE_BDATA);
/* BCTS on */ /* BCTS on */
@@ -741,16 +743,16 @@ static void brcon_done(am791x_t *am791x)
static void tx_bdata_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->block_btd, 1, "BTD IGNORED");
set_flag(&am791x->tx_silence, 1, "SET SILENCE"); set_flag(&am791x->tx_silence, 1, "SET SILENCE");
timer_start(&am791x->tx_timer, am791x->t_brcoff); osmo_timer_schedule(&am791x->tx_timer, FLOAT_TO_TIMEOUT(am791x->t_brcoff));
} }
static void brcoff_done(am791x_t *am791x) static void brcoff_done(am791x_t *am791x)
{ {
PDEBUG(DAM791X, DEBUG_DEBUG, "Transmission over\n"); LOGP(DAM791X, LOGL_DEBUG, "Transmission over\n");
/* BCTS off */ /* BCTS off */
am791x->bcts_cb(am791x->inst, 0); am791x->bcts_cb(am791x->inst, 0);
@@ -791,7 +793,7 @@ static void handle_tx_state(am791x_t *am791x)
rcon_release_rts(am791x); rcon_release_rts(am791x);
break; break;
} }
if (!timer_running(&am791x->tx_timer)) { if (!osmo_timer_pending(&am791x->tx_timer)) {
rcon_done(am791x); rcon_done(am791x);
break; break;
} }
@@ -803,19 +805,19 @@ static void handle_tx_state(am791x_t *am791x)
} }
break; break;
case AM791X_STATE_RCOFF: case AM791X_STATE_RCOFF:
if (!timer_running(&am791x->tx_timer)) { if (!osmo_timer_pending(&am791x->tx_timer)) {
rcoff_done(am791x); rcoff_done(am791x);
break; break;
} }
break; break;
case AM791X_STATE_STO_OFF: case AM791X_STATE_STO_OFF:
if (!timer_running(&am791x->tx_timer)) { if (!osmo_timer_pending(&am791x->tx_timer)) {
sto_done(am791x); sto_done(am791x);
break; break;
} }
break; break;
case AM791X_STATE_SQ_OFF: case AM791X_STATE_SQ_OFF:
if (!timer_running(&am791x->tx_timer)) { if (!osmo_timer_pending(&am791x->tx_timer)) {
sq_done(am791x); sq_done(am791x);
break; break;
} }
@@ -826,7 +828,7 @@ static void handle_tx_state(am791x_t *am791x)
brcon_release_brts(am791x); brcon_release_brts(am791x);
break; break;
} }
if (!timer_running(&am791x->tx_timer)) { if (!osmo_timer_pending(&am791x->tx_timer)) {
brcon_done(am791x); brcon_done(am791x);
break; break;
} }
@@ -838,27 +840,27 @@ static void handle_tx_state(am791x_t *am791x)
} }
break; break;
case AM791X_STATE_BRCOFF: case AM791X_STATE_BRCOFF:
if (!timer_running(&am791x->tx_timer)) { if (!osmo_timer_pending(&am791x->tx_timer)) {
brcoff_done(am791x); brcoff_done(am791x);
break; break;
} }
break; break;
default: 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) 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); osmo_timer_schedule(&am791x->rx_timer, FLOAT_TO_TIMEOUT(am791x->t_cdon));
new_rx_state(am791x, AM791X_STATE_CDON); new_rx_state(am791x, AM791X_STATE_CDON);
} }
static void cdon_done(am791x_t *am791x) 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"); set_flag(&am791x->block_rd, 0, "RD RELEASED");
new_rx_state(am791x, AM791X_STATE_DATA); new_rx_state(am791x, AM791X_STATE_DATA);
@@ -872,23 +874,23 @@ static void cdon_done(am791x_t *am791x)
static void cdon_no_cd(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); osmo_timer_del(&am791x->rx_timer);
new_rx_state(am791x, AM791X_STATE_INIT); new_rx_state(am791x, AM791X_STATE_INIT);
} }
static void rx_data_done(am791x_t *am791x) 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); osmo_timer_schedule(&am791x->rx_timer, FLOAT_TO_TIMEOUT(am791x->t_cdoff));
new_rx_state(am791x, AM791X_STATE_CDOFF); new_rx_state(am791x, AM791X_STATE_CDOFF);
} }
static void cdoff_done(am791x_t *am791x) 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"); set_flag(&am791x->block_rd, 1, "RD = MARK");
new_rx_state(am791x, AM791X_STATE_INIT); new_rx_state(am791x, AM791X_STATE_INIT);
@@ -902,23 +904,23 @@ static void cdoff_done(am791x_t *am791x)
static void cdoff_cd(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); osmo_timer_del(&am791x->rx_timer);
new_rx_state(am791x, AM791X_STATE_DATA); new_rx_state(am791x, AM791X_STATE_DATA);
} }
static void go_back_channel_rx(am791x_t *am791x) 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); osmo_timer_schedule(&am791x->rx_timer, FLOAT_TO_TIMEOUT(am791x->t_bcdon));
new_rx_state(am791x, AM791X_STATE_BCDON); new_rx_state(am791x, AM791X_STATE_BCDON);
} }
static void bcdon_done(am791x_t *am791x) 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"); set_flag(&am791x->block_brd, 0, "BRD RELEASED");
new_rx_state(am791x, AM791X_STATE_BDATA); new_rx_state(am791x, AM791X_STATE_BDATA);
@@ -932,23 +934,23 @@ static void bcdon_done(am791x_t *am791x)
static void bcdon_no_cd(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); osmo_timer_del(&am791x->rx_timer);
new_rx_state(am791x, AM791X_STATE_INIT); new_rx_state(am791x, AM791X_STATE_INIT);
} }
static void rx_bdata_done(am791x_t *am791x) 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); osmo_timer_schedule(&am791x->rx_timer, FLOAT_TO_TIMEOUT(am791x->t_bcdoff));
new_rx_state(am791x, AM791X_STATE_BCDOFF); new_rx_state(am791x, AM791X_STATE_BCDOFF);
} }
static void bcdoff_done(am791x_t *am791x) 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) if (!am791x->bell_202)
set_flag(&am791x->block_brd, 1, "BRD = MARK"); set_flag(&am791x->block_brd, 1, "BRD = MARK");
@@ -963,9 +965,9 @@ static void bcdoff_done(am791x_t *am791x)
static void bcdoff_cd(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); osmo_timer_del(&am791x->rx_timer);
new_rx_state(am791x, AM791X_STATE_BDATA); new_rx_state(am791x, AM791X_STATE_BDATA);
} }
@@ -992,7 +994,7 @@ static void handle_rx_state(am791x_t *am791x)
break; break;
/* all main channel states ... */ /* all main channel states ... */
case AM791X_STATE_CDON: case AM791X_STATE_CDON:
if (!timer_running(&am791x->rx_timer)) { if (!osmo_timer_pending(&am791x->rx_timer)) {
cdon_done(am791x); cdon_done(am791x);
break; break;
} }
@@ -1008,7 +1010,7 @@ static void handle_rx_state(am791x_t *am791x)
} }
break; break;
case AM791X_STATE_CDOFF: case AM791X_STATE_CDOFF:
if (!timer_running(&am791x->rx_timer)) { if (!osmo_timer_pending(&am791x->rx_timer)) {
cdoff_done(am791x); cdoff_done(am791x);
break; break;
} }
@@ -1019,7 +1021,7 @@ static void handle_rx_state(am791x_t *am791x)
break; break;
/* all back channel states ... */ /* all back channel states ... */
case AM791X_STATE_BCDON: case AM791X_STATE_BCDON:
if (!timer_running(&am791x->rx_timer)) { if (!osmo_timer_pending(&am791x->rx_timer)) {
bcdon_done(am791x); bcdon_done(am791x);
break; break;
} }
@@ -1035,7 +1037,7 @@ static void handle_rx_state(am791x_t *am791x)
} }
break; break;
case AM791X_STATE_BCDOFF: case AM791X_STATE_BCDOFF:
if (!timer_running(&am791x->rx_timer)) { if (!osmo_timer_pending(&am791x->rx_timer)) {
bcdoff_done(am791x); bcdoff_done(am791x);
break; break;
} }
@@ -1045,7 +1047,7 @@ static void handle_rx_state(am791x_t *am791x)
} }
break; break;
default: 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]);
} }
} }
@@ -1086,10 +1088,10 @@ int am791x_init(am791x_t *am791x, void *inst, enum am791x_type type, uint8_t mc,
memset(am791x, 0, sizeof(*am791x)); memset(am791x, 0, sizeof(*am791x));
/* init timers */ /* init timers */
timer_init(&am791x->tx_timer, tx_timeout, am791x); osmo_timer_setup(&am791x->tx_timer, tx_timeout, am791x);
timer_init(&am791x->rx_timer, rx_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->inst = inst;
am791x->type = type; am791x->type = type;
@@ -1119,13 +1121,13 @@ int am791x_init(am791x_t *am791x, void *inst, enum am791x_type type, uint8_t mc,
/* exit routine, must be called when exit */ /* exit routine, must be called when exit */
void am791x_exit(am791x_t *am791x) 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 */ /* bring to reset state, be sure to clean FSK processes */
am791x_reset(am791x); am791x_reset(am791x);
timer_exit(&am791x->tx_timer); osmo_timer_del(&am791x->tx_timer);
timer_exit(&am791x->rx_timer); osmo_timer_del(&am791x->rx_timer);
} }
/* get some default baud rate for each mode, before IOCTL sets it (if it sets it) */ /* get some default baud rate for each mode, before IOCTL sets it (if it sets it) */
@@ -1149,8 +1151,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)) if (!((am791x->type) ? am791x_modes[mc].sup_7911 : am791x_modes[mc].sup_7910))
rc = -EINVAL; rc = -EINVAL;
PDEBUG(DAM791X, DEBUG_INFO, "Setting mode %d: %s\n", mc, am791x_modes[mc].description); LOGP(DAM791X, LOGL_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_DEBUG, " -> Baud rate: %.1f/%.1f\n", rx_baud, tx_baud);
am791x->mc = mc; am791x->mc = mc;
am791x->samplerate = samplerate; am791x->samplerate = samplerate;
@@ -1187,10 +1189,10 @@ 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 */ /* reset at any time, may be called any time by upper layer */
void am791x_reset(am791x_t *am791x) void am791x_reset(am791x_t *am791x)
{ {
PDEBUG(DAM791X, DEBUG_INFO, "Reset!\n"); LOGP(DAM791X, LOGL_INFO, "Reset!\n");
timer_stop(&am791x->tx_timer); osmo_timer_del(&am791x->tx_timer);
timer_stop(&am791x->rx_timer); osmo_timer_del(&am791x->rx_timer);
if (am791x->f0_tx) { if (am791x->f0_tx) {
fsk_mod_cleanup(&am791x->fsk_tx); fsk_mod_cleanup(&am791x->fsk_tx);
@@ -1228,7 +1230,7 @@ void am791x_reset(am791x_t *am791x)
/* change input lines */ /* change input lines */
void am791x_dtr(am791x_t *am791x, int dtr) 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 */ /* set filters, if DTR becomes on */
if (!am791x->line_dtr && dtr) { if (!am791x->line_dtr && dtr) {
@@ -1242,7 +1244,7 @@ void am791x_dtr(am791x_t *am791x, int dtr)
void am791x_rts(am791x_t *am791x, int rts) 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; am791x->line_rts = rts;
handle_state(am791x); handle_state(am791x);
@@ -1250,7 +1252,7 @@ void am791x_rts(am791x_t *am791x, int rts)
void am791x_brts(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; am791x->line_brts = rts;
handle_state(am791x); handle_state(am791x);
@@ -1258,7 +1260,7 @@ void am791x_brts(am791x_t *am791x, int rts)
void am791x_ring(am791x_t *am791x, int ring) 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; am791x->line_ring = ring;
handle_state(am791x); handle_state(am791x);
+1 -1
View File
@@ -67,7 +67,7 @@ typedef struct am791x {
int f0_rx, f1_rx; int f0_rx, f1_rx;
/* timers */ /* timers */
struct timer tx_timer, rx_timer; struct osmo_timer_list tx_timer, rx_timer;
double t_rcon; double t_rcon;
double t_rcoff; double t_rcoff;
double t_brcon; double t_brcon;
+112 -116
View File
@@ -32,12 +32,14 @@
#include <fcntl.h> #include <fcntl.h>
#include <math.h> #include <math.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libtimer/timer.h" #include <osmocom/core/select.h>
#include <osmocom/core/timer.h>
#include "../libfsk/fsk.h" #include "../libfsk/fsk.h"
#include "../libsound/sound.h" #include "../libsound/sound.h"
#include "../libwave/wave.h" #include "../libwave/wave.h"
#include "../libdisplay/display.h" #include "../libdisplay/display.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "../libmobile/get_time.c"
#include "device.h" #include "device.h"
#include "am791x.h" #include "am791x.h"
#include "uart.h" #include "uart.h"
@@ -217,7 +219,7 @@ static void cts(void *inst, int cts)
return; return;
if (datenklo->auto_rts) { 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; datenklo->auto_rts_cts = cts;
return; return;
} }
@@ -226,7 +228,7 @@ static void cts(void *inst, int cts)
datenklo->lines |= TIOCM_CTS; datenklo->lines |= TIOCM_CTS;
else else
datenklo->lines &= ~TIOCM_CTS; 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) */ /* modem changes CTS state (back channel) */
@@ -238,7 +240,7 @@ static void bcts(void *inst, int cts)
return; return;
if (datenklo->auto_rts) { 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; datenklo->auto_rts_cts = cts;
return; return;
} }
@@ -247,7 +249,7 @@ static void bcts(void *inst, int cts)
datenklo->lines |= TIOCM_CTS; datenklo->lines |= TIOCM_CTS;
else else
datenklo->lines &= ~TIOCM_CTS; 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 */ /* modem changes CD state */
@@ -259,7 +261,7 @@ static void cd(void *inst, int cd)
return; return;
if (datenklo->auto_rts) { 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; datenklo->auto_rts_cd = cd;
return; return;
} }
@@ -268,7 +270,7 @@ static void cd(void *inst, int cd)
datenklo->lines |= TIOCM_CD; datenklo->lines |= TIOCM_CD;
else else
datenklo->lines &= ~TIOCM_CD; 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) */ /* modem changes CD state (back channel) */
@@ -280,7 +282,7 @@ static void bcd(void *inst, int cd)
return; return;
if (datenklo->auto_rts) { 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; datenklo->auto_rts_cd = cd;
return; return;
} }
@@ -289,7 +291,7 @@ static void bcd(void *inst, int cd)
datenklo->lines |= TIOCM_CD; datenklo->lines |= TIOCM_CD;
else else
datenklo->lines &= ~TIOCM_CD; 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 */ /* modem request bit */
@@ -405,7 +407,7 @@ static int tx(void *inst)
if (datenklo->onlcr_char) { if (datenklo->onlcr_char) {
datenklo->onlcr_char = 0; datenklo->onlcr_char = 0;
data = '\n'; data = '\n';
PDEBUG(DDATENKLO, DEBUG_DEBUG, "ONLCR: sending NL\n"); LOGP(DDATENKLO, LOGL_DEBUG, "ONLCR: sending NL\n");
goto out; goto out;
} }
@@ -414,7 +416,7 @@ again:
if (fill == (size_t)datenklo->tx_fifo_full) { if (fill == (size_t)datenklo->tx_fifo_full) {
/* tell cuse to write again */ /* tell cuse to write again */
PDEBUG(DDATENKLO, DEBUG_DEBUG, "Set POLLOUT!\n"); LOGP(DDATENKLO, LOGL_DEBUG, "Set POLLOUT!\n");
datenklo->revents |= POLLOUT; datenklo->revents |= POLLOUT;
device_set_poll_events(datenklo->device, datenklo->revents); device_set_poll_events(datenklo->device, datenklo->revents);
} }
@@ -424,12 +426,12 @@ again:
datenklo->auto_rts_on = 0; datenklo->auto_rts_on = 0;
if (datenklo->tcsetsw) { 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)); memcpy(&datenklo->termios, &datenklo->tcsetsw_termios, sizeof(datenklo->termios));
if (datenklo->tcsetsw == 2) { if (datenklo->tcsetsw == 2) {
flush_rx(datenklo); flush_rx(datenklo);
if ((datenklo->revents & POLLIN)) { if ((datenklo->revents & POLLIN)) {
PDEBUG(DDATENKLO, DEBUG_DEBUG, "Reset POLLIN (flushed)\n"); LOGP(DDATENKLO, LOGL_DEBUG, "Reset POLLIN (flushed)\n");
datenklo->revents &= ~POLLIN; datenklo->revents &= ~POLLIN;
device_set_poll_events(datenklo->device, datenklo->revents); device_set_poll_events(datenklo->device, datenklo->revents);
} }
@@ -450,26 +452,26 @@ again:
/* process output features */ /* process output features */
if (datenklo->opost) { if (datenklo->opost) {
if (datenklo->olcuc) { 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); data = toupper(data);
} }
if (datenklo->onlret && data == '\r') { if (datenklo->onlret && data == '\r') {
PDEBUG(DDATENKLO, DEBUG_DEBUG, "ONLRET: ignore CR\n"); LOGP(DDATENKLO, LOGL_DEBUG, "ONLRET: ignore CR\n");
goto again; goto again;
} }
if (datenklo->ocrnl && data == '\r') { if (datenklo->ocrnl && data == '\r') {
PDEBUG(DDATENKLO, DEBUG_DEBUG, "OCRNL: CR -> NL\n"); LOGP(DDATENKLO, LOGL_DEBUG, "OCRNL: CR -> NL\n");
data = '\n'; data = '\n';
} }
if (datenklo->onlcr && data == '\n') { if (datenklo->onlcr && data == '\n') {
datenklo->onlcr_char = 1; datenklo->onlcr_char = 1;
data = '\r'; data = '\r';
PDEBUG(DDATENKLO, DEBUG_DEBUG, "ONLCR: sending CR\n"); LOGP(DDATENKLO, LOGL_DEBUG, "ONLCR: sending CR\n");
} }
} }
out: 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; return data;
} }
@@ -480,35 +482,35 @@ static void rx(void *inst, int data, uint32_t __attribute__((unused)) flags)
datenklo_t *datenklo = (datenklo_t *)inst; datenklo_t *datenklo = (datenklo_t *)inst;
size_t space; 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 */ /* process input features */
if (datenklo->ignbrk && (flags & UART_BREAK)) { if (datenklo->ignbrk && (flags & UART_BREAK)) {
PDEBUG(DDATENKLO, DEBUG_DEBUG, "IGNBRK: ignore BREAK\n"); LOGP(DDATENKLO, LOGL_DEBUG, "IGNBRK: ignore BREAK\n");
return; return;
} }
if (datenklo->istrip && (data & 0x80)) { 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; data &= 0x7f;
} }
if (datenklo->inlcr && data == '\n') { if (datenklo->inlcr && data == '\n') {
PDEBUG(DDATENKLO, DEBUG_DEBUG, "INLCR: NL -> CR\n"); LOGP(DDATENKLO, LOGL_DEBUG, "INLCR: NL -> CR\n");
data = '\r'; data = '\r';
} }
if (datenklo->igncr && data == '\r') { if (datenklo->igncr && data == '\r') {
PDEBUG(DDATENKLO, DEBUG_DEBUG, "IGNCR: ignore CR\n"); LOGP(DDATENKLO, LOGL_DEBUG, "IGNCR: ignore CR\n");
return; return;
} }
if (datenklo->icrnl && data == '\r') { if (datenklo->icrnl && data == '\r') {
PDEBUG(DDATENKLO, DEBUG_DEBUG, "ICRNL: CR -> NL\n"); LOGP(DDATENKLO, LOGL_DEBUG, "ICRNL: CR -> NL\n");
data = '\n'; data = '\n';
} }
if (datenklo->iuclc) { 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); data = tolower(data);
} }
if (datenklo->echo) { 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; space = (datenklo->tx_fifo_out - datenklo->tx_fifo_in - 1 + datenklo->tx_fifo_size) % datenklo->tx_fifo_size;
if (space) { if (space) {
datenklo->tx_fifo[datenklo->tx_fifo_in++] = data; 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 */ /* empty buffer gets data */
if (datenklo->rx_fifo_out == datenklo->rx_fifo_in) { if (datenklo->rx_fifo_out == datenklo->rx_fifo_in) {
/* tell cuse to read again */ /* tell cuse to read again */
PDEBUG(DDATENKLO, DEBUG_DEBUG, "Set POLLIN!\n"); LOGP(DDATENKLO, LOGL_DEBUG, "Set POLLIN!\n");
datenklo->revents |= POLLIN; datenklo->revents |= POLLIN;
device_set_poll_events(datenklo->device, datenklo->revents); 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) { if (!space) {
err_overflow: err_overflow:
PDEBUG(DDATENKLO, DEBUG_NOTICE, "RX buffer overflow, dropping!\n"); LOGP(DDATENKLO, LOGL_NOTICE, "RX buffer overflow, dropping!\n");
return; return;
} }
if (datenklo->parmrk) { if (datenklo->parmrk) {
if ((flags & (UART_BREAK | UART_PARITY_ERROR))) { 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) if (space < 3)
goto err_overflow; goto err_overflow;
datenklo->rx_fifo[datenklo->rx_fifo_in++] = 0xff; 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; datenklo->rx_fifo_in %= datenklo->rx_fifo_size;
space--; space--;
} else if (data == 0xff) { } 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) if (space < 2)
goto err_overflow; goto err_overflow;
datenklo->rx_fifo[datenklo->rx_fifo_in++] = 0xff; 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; int old = datenklo->lines;
if (!(old & TIOCM_DTR) && (new & TIOCM_DTR)) { 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_tx(datenklo);
flush_rx(datenklo); flush_rx(datenklo);
am791x_dtr(&datenklo->am791x, 1); am791x_dtr(&datenklo->am791x, 1);
} }
if ((old & TIOCM_DTR) && !(new & TIOCM_DTR)) { 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); am791x_dtr(&datenklo->am791x, 0);
} }
if (!(old & TIOCM_RTS) && (new & TIOCM_RTS)) { 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) if (datenklo->auto_rts)
new |= TIOCM_CTS | TIOCM_CD; new |= TIOCM_CTS | TIOCM_CD;
else { else {
@@ -589,7 +591,7 @@ static void set_lines(datenklo_t *datenklo, int new)
} }
} }
if ((old & TIOCM_RTS) && !(new & TIOCM_RTS)) { 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) if (datenklo->auto_rts)
new &= ~(TIOCM_CTS | TIOCM_CD); new &= ~(TIOCM_CTS | TIOCM_CD);
else { else {
@@ -609,7 +611,7 @@ static void process_auto_rts(datenklo_t *datenklo)
if (!datenklo->auto_rts) if (!datenklo->auto_rts)
return; return;
if (datenklo->auto_rts_on && !datenklo->auto_rts_rts && !datenklo->auto_rts_cd) { 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; datenklo->auto_rts_rts = 1;
if (!datenklo->tx_back) if (!datenklo->tx_back)
am791x_rts(&datenklo->am791x, 1); am791x_rts(&datenklo->am791x, 1);
@@ -617,7 +619,7 @@ static void process_auto_rts(datenklo_t *datenklo)
am791x_brts(&datenklo->am791x, 1); am791x_brts(&datenklo->am791x, 1);
} }
if (!datenklo->auto_rts_on && datenklo->auto_rts_rts) { 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; datenklo->auto_rts_rts = 0;
if (!datenklo->tx_back) if (!datenklo->tx_back)
am791x_rts(&datenklo->am791x, 0); 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; ssize_t rc = 0;
#ifdef HEAVY_DEBUG #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 #endif
switch (cmd) { 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) if (!out_bufsz)
break; break;
#ifdef HEAVY_DEBUG #ifdef HEAVY_DEBUG
PDEBUG(DDATENKLO, DEBUG_DEBUG, "Terminal requests termios.\n"); LOGP(DDATENKLO, LOGL_DEBUG, "Terminal requests termios.\n");
#endif #endif
memcpy(buf, &datenklo->termios, rc); memcpy(buf, &datenklo->termios, rc);
break; break;
@@ -652,7 +654,7 @@ static ssize_t dk_ioctl_get(void *inst, int cmd, void *buf, size_t out_bufsz)
if (!out_bufsz) if (!out_bufsz)
break; break;
#ifdef HEAVY_DEBUG #ifdef HEAVY_DEBUG
PDEBUG(DDATENKLO, DEBUG_DEBUG, "Terminal requests line states.\n"); LOGP(DDATENKLO, LOGL_DEBUG, "Terminal requests line states.\n");
#endif #endif
status = datenklo->lines | TIOCM_LE | TIOCM_DSR; status = datenklo->lines | TIOCM_LE | TIOCM_DSR;
memcpy(buf, &status, rc); 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) if (!out_bufsz)
break; break;
#ifdef HEAVY_DEBUG #ifdef HEAVY_DEBUG
PDEBUG(DDATENKLO, DEBUG_DEBUG, "Terminal requests window size.\n"); LOGP(DDATENKLO, LOGL_DEBUG, "Terminal requests window size.\n");
#endif #endif
struct winsize *winsize = (struct winsize *)buf; struct winsize *winsize = (struct winsize *)buf;
winsize->ws_row = 25; 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; status = (datenklo->rx_fifo_in - datenklo->rx_fifo_out + datenklo->rx_fifo_size) % datenklo->rx_fifo_size;
memcpy(buf, &status, rc); memcpy(buf, &status, rc);
#ifdef HEAVY_DEBUG #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 #endif
break; break;
case TIOCOUTQ: 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) if (!out_bufsz)
break; break;
#ifdef HEAVY_DEBUG #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 #endif
status = (datenklo->tx_fifo_in - datenklo->tx_fifo_out + datenklo->tx_fifo_size) % datenklo->tx_fifo_size; status = (datenklo->tx_fifo_in - datenklo->tx_fifo_out + datenklo->tx_fifo_size) % datenklo->tx_fifo_size;
memcpy(buf, &status, rc); 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); new_echo = !!(datenklo->termios.c_lflag & ECHO);
if (old_baud != new_baud && (!datenklo->force_tx_baud || !datenklo->force_rx_baud)) { 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) { 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); am791x_dtr(&datenklo->am791x, 0);
} }
datenklo->baudrate = new_baud; datenklo->baudrate = new_baud;
am791x_mc(&datenklo->am791x, datenklo->mc, datenklo->samplerate, tx_baud_rate(datenklo), rx_baud_rate(datenklo)); am791x_mc(&datenklo->am791x, datenklo->mc, datenklo->samplerate, tx_baud_rate(datenklo), rx_baud_rate(datenklo));
if ((datenklo->lines & TIOCM_DTR) && !old_baud) { 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); am791x_dtr(&datenklo->am791x, 1);
} }
} }
@@ -802,10 +804,10 @@ static void set_termios(datenklo_t *datenklo, const void *buf)
if (old_databits != new_databits if (old_databits != new_databits
|| old_parity != new_parity || old_parity != new_parity
|| old_stopbits != new_stopbits) { || 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); 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) 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 if (old_stopbits != new_stopbits
@@ -835,8 +837,8 @@ static void set_termios(datenklo_t *datenklo, const void *buf)
datenklo->onlret = new_onlret; datenklo->onlret = new_onlret;
datenklo->olcuc = new_olcuc; datenklo->olcuc = new_olcuc;
datenklo->echo = new_echo; datenklo->echo = new_echo;
PDEBUG(DDATENKLO, DEBUG_INFO, "Terminal sets serial flags:\n"); LOGP(DDATENKLO, LOGL_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, "%cignbrk %cparmrk %cistrip %cinlcr %cigncr %cicrnl %ciuclc %copost %conlcr %cocrnl %conlret %colcuc %cecho\n",
(datenklo->ignbrk) ? '+' : '-', (datenklo->ignbrk) ? '+' : '-',
(datenklo->parmrk) ? '+' : '-', (datenklo->parmrk) ? '+' : '-',
(datenklo->istrip) ? '+' : '-', (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; size_t space;
#ifdef HEAVY_DEBUG #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 #endif
switch (cmd) { 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); rc = sizeof(datenklo->termios);
if (!in_bufsz) if (!in_bufsz)
break; break;
PDEBUG(DDATENKLO, DEBUG_DEBUG, "Terminal sets termios now.\n"); LOGP(DDATENKLO, LOGL_DEBUG, "Terminal sets termios now.\n");
set_termios(datenklo, buf); set_termios(datenklo, buf);
break; break;
case TCSETSW: 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); rc = sizeof(datenklo->termios);
if (!in_bufsz) if (!in_bufsz)
break; 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) { 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); set_termios(datenklo, buf);
break; 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) if (!in_bufsz)
break; break;
memcpy(&status, buf, rc); 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) { if (status == TCIOFLUSH || status == TCOFLUSH) {
flush_tx(datenklo); flush_tx(datenklo);
if (!(datenklo->revents & POLLOUT)) { if (!(datenklo->revents & POLLOUT)) {
/* tell cuse to write again */ /* tell cuse to write again */
PDEBUG(DDATENKLO, DEBUG_DEBUG, "Set POLLOUT (flushed)\n"); LOGP(DDATENKLO, LOGL_DEBUG, "Set POLLOUT (flushed)\n");
datenklo->revents |= POLLOUT; datenklo->revents |= POLLOUT;
device_set_poll_events(datenklo->device, datenklo->revents); 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) { if (status == TCIOFLUSH || status == TCIFLUSH) {
flush_rx(datenklo); flush_rx(datenklo);
if ((datenklo->revents & POLLIN)) { if ((datenklo->revents & POLLIN)) {
PDEBUG(DDATENKLO, DEBUG_DEBUG, "Reset POLLIN (flushed)\n"); LOGP(DDATENKLO, LOGL_DEBUG, "Reset POLLIN (flushed)\n");
datenklo->revents &= ~POLLIN; datenklo->revents &= ~POLLIN;
device_set_poll_events(datenklo->device, datenklo->revents); 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; break;
case TCSBRK: case TCSBRK:
rc = 0; 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; datenklo->break_bits = tx_baud_rate(datenklo) * 3 / 10;
break; break;
case TCSBRKP: 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) if (!in_bufsz)
break; break;
memcpy(&status, buf, rc); 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) if (status == 0)
status = 3; status = 3;
if (status > 30) 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; break;
case TIOCSBRK: case TIOCSBRK:
rc = 0; rc = 0;
PDEBUG(DDATENKLO, DEBUG_DEBUG, "Terminal turns break on\n"); LOGP(DDATENKLO, LOGL_DEBUG, "Terminal turns break on\n");
datenklo->break_on = 1; datenklo->break_on = 1;
break; break;
case TIOCCBRK: case TIOCCBRK:
rc = 0; rc = 0;
PDEBUG(DDATENKLO, DEBUG_DEBUG, "Terminal turns break off\n"); LOGP(DDATENKLO, LOGL_DEBUG, "Terminal turns break off\n");
datenklo->break_on = 0; datenklo->break_on = 0;
break; break;
case TIOCMBIS: 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) if (!in_bufsz)
break; break;
memcpy(&status, buf, rc); 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; status = datenklo->lines | status;
set_lines(datenklo, status); set_lines(datenklo, status);
break; 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) if (!in_bufsz)
break; break;
memcpy(&status, buf, rc); 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; status = datenklo->lines & ~status;
set_lines(datenklo, status); set_lines(datenklo, status);
break; 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) if (!in_bufsz)
break; break;
memcpy(&status, buf, rc); 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); set_lines(datenklo, status);
break; break;
case TIOCGSID: case TIOCGSID:
PDEBUG(DDATENKLO, DEBUG_DEBUG, "TIOGSID -> ENOTTY\n"); LOGP(DDATENKLO, LOGL_DEBUG, "TIOGSID -> ENOTTY\n");
rc = -ENOTTY; rc = -ENOTTY;
break; break;
case TIOCGPGRP: case TIOCGPGRP:
PDEBUG(DDATENKLO, DEBUG_DEBUG, "TIOCGPGRP -> ENOTTY\n"); LOGP(DDATENKLO, LOGL_DEBUG, "TIOCGPGRP -> ENOTTY\n");
rc = -ENOTTY; rc = -ENOTTY;
break; break;
case TIOCSCTTY: case TIOCSCTTY:
PDEBUG(DDATENKLO, DEBUG_DEBUG, "TIOCSCTTY -> ENOTTY\n"); LOGP(DDATENKLO, LOGL_DEBUG, "TIOCSCTTY -> ENOTTY\n");
rc = -ENOTTY; rc = -ENOTTY;
break; break;
case TIOCSPGRP: case TIOCSPGRP:
PDEBUG(DDATENKLO, DEBUG_DEBUG, "TIOCSPGRP -> ENOTTY\n"); LOGP(DDATENKLO, LOGL_DEBUG, "TIOCSPGRP -> ENOTTY\n");
rc = -ENOTTY; rc = -ENOTTY;
break; break;
case TIOCSWINSZ: case TIOCSWINSZ:
rc = sizeof(struct winsize); rc = sizeof(struct winsize);
if (!in_bufsz) if (!in_bufsz)
break; break;
PDEBUG(DDATENKLO, DEBUG_DEBUG, "Terminal sets window size.\n"); LOGP(DDATENKLO, LOGL_DEBUG, "Terminal sets window size.\n");
break; break;
case TCXONC: case TCXONC:
rc = sizeof(status); 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); memcpy(&status, buf, rc);
switch (status) { switch (status) {
case TCOOFF: case TCOOFF:
PDEBUG(DDATENKLO, DEBUG_DEBUG, "Terminal turns off output.\n"); LOGP(DDATENKLO, LOGL_DEBUG, "Terminal turns off output.\n");
datenklo->output_off = 1; datenklo->output_off = 1;
break; break;
case TCOON: case TCOON:
PDEBUG(DDATENKLO, DEBUG_DEBUG, "Terminal turns on output.\n"); LOGP(DDATENKLO, LOGL_DEBUG, "Terminal turns on output.\n");
datenklo->output_off = 0; datenklo->output_off = 0;
break; break;
case TCIOFF: 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; space = (datenklo->rx_fifo_out - datenklo->rx_fifo_in - 1 + datenklo->rx_fifo_size) % datenklo->rx_fifo_size;
if (space < 1) if (space < 1)
break; 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; datenklo->rx_fifo_in %= datenklo->rx_fifo_size;
break; break;
case TCION: 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; space = (datenklo->rx_fifo_out - datenklo->rx_fifo_in - 1 + datenklo->rx_fifo_size) % datenklo->rx_fifo_size;
if (space < 1) if (space < 1)
break; break;
@@ -1034,12 +1036,12 @@ static int dk_open(void *inst, int flags)
datenklo_t *datenklo = (datenklo_t *)inst; datenklo_t *datenklo = (datenklo_t *)inst;
if (datenklo->open_count) { if (datenklo->open_count) {
PDEBUG(DDATENKLO, DEBUG_NOTICE, "Device is busy.\n"); LOGP(DDATENKLO, LOGL_NOTICE, "Device is busy.\n");
return -EBUSY; return -EBUSY;
} }
datenklo->open_count++; datenklo->open_count++;
datenklo->flags = flags; 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; int status = datenklo->lines | TIOCM_DTR | TIOCM_RTS;
set_lines(datenklo, status); set_lines(datenklo, status);
@@ -1051,7 +1053,7 @@ static void dk_close(void *inst)
{ {
datenklo_t *datenklo = (datenklo_t *)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--; datenklo->open_count--;
int status = datenklo->lines & ~(TIOCM_DTR | TIOCM_RTS); int status = datenklo->lines & ~(TIOCM_DTR | TIOCM_RTS);
set_lines(datenklo, status); set_lines(datenklo, status);
@@ -1071,7 +1073,7 @@ static void debug_data(const char *buf, int count)
count--; count--;
} }
text[i] = '\0'; 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) { if (vmin && vtime) {
/* first: start timer */ /* first: start timer */
if (!datenklo->vtimeout) if (!datenklo->vtimeout)
timer_start(&datenklo->vtimer, (double)vtime * 0.1); osmo_timer_schedule(&datenklo->vtimer, vtime/10,(vtime % 10) * 100000);
/* no data: block (in blocking IO) */ /* no data: block (in blocking IO) */
if (fill == 0) { if (fill == 0) {
/* special value to tell device there is no data right now, we have to block */ /* 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 */ /* enough data or timeout or nonblocking IO: stop timer and return what we have */
datenklo->vtimeout = 0; datenklo->vtimeout = 0;
timer_stop(&datenklo->vtimer); osmo_timer_del(&datenklo->vtimer);
} }
/* both MIN and TIME are zero */ /* both MIN and TIME are zero */
if (!vmin && !vtime) { if (!vmin && !vtime) {
@@ -1117,7 +1119,7 @@ static ssize_t dk_read(void *inst, char *buf, size_t size, int flags)
if (!vmin && vtime) { if (!vmin && vtime) {
/* first: start timer */ /* first: start timer */
if (!datenklo->vtimeout) if (!datenklo->vtimeout)
timer_start(&datenklo->vtimer, (double)vtime * 0.1); osmo_timer_schedule(&datenklo->vtimer, vtime/10,(vtime % 10) * 100000);
if (fill == 0) { if (fill == 0) {
/* no data and no timeout: block (in blocking IO) */ /* no data and no timeout: block (in blocking IO) */
if (!datenklo->vtimeout) { 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 */ /* data: stop timer and return what we have */
datenklo->vtimeout = 0; datenklo->vtimeout = 0;
timer_stop(&datenklo->vtimer); osmo_timer_del(&datenklo->vtimer);
} }
/* MIN is nonzero, TIME is zero */ /* MIN is nonzero, TIME is zero */
if (vmin && !vtime) { 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 */ /* 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 */ /* get data from fifo */
count = 0; count = 0;
@@ -1160,7 +1162,7 @@ static ssize_t dk_read(void *inst, char *buf, size_t size, int flags)
if (!fill) { if (!fill) {
/* tell cuse not to read anymore */ /* tell cuse not to read anymore */
if ((datenklo->revents & POLLIN)) { 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; datenklo->revents &= ~POLLIN;
device_set_poll_events(datenklo->device, datenklo->revents); 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; size_t i;
if (!(datenklo->lines & TIOCM_DTR)) { 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; return -EIO;
} }
if (!(datenklo->lines & TIOCM_RTS)) { 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; return -EIO;
} }
if (size > (size_t)datenklo->tx_fifo_size - 1) { 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; return -EIO;
} }
@@ -1199,7 +1201,7 @@ static ssize_t dk_write(void *inst, const char *buf, size_t size, int __attribut
return -EAGAIN; 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); debug_data(buf, size);
if (datenklo->auto_rts) 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) { if ((datenklo->revents & POLLOUT) && fill >= (size_t)datenklo->tx_fifo_full) {
/* tell cuse not to write */ /* 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; datenklo->revents &= ~POLLOUT;
device_set_poll_events(datenklo->device, datenklo->revents); 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; 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); flush_tx(datenklo);
} }
@@ -1270,7 +1272,7 @@ static void vtime_timeout(void *data)
void datenklo_init_global(void) void datenklo_init_global(void)
{ {
if (pthread_mutex_init(&mutex, NULL)) { 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); exit(0);
} }
} }
@@ -1282,7 +1284,7 @@ int datenklo_init(datenklo_t *datenklo, const char *dev_name, enum am791x_type a
tcflag_t flag; tcflag_t flag;
cc_t *cc; cc_t *cc;
PDEBUG(DDATENKLO, DEBUG_DEBUG, "Creating Datenklo instance.\n"); LOGP(DDATENKLO, LOGL_DEBUG, "Creating Datenklo instance.\n");
memset(datenklo, 0, sizeof(*datenklo)); 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); 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) { 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; rc = -errno;
goto error; 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); 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); 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) { 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; 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->tx_fifo = calloc(datenklo->tx_fifo_size, 1);
datenklo->rx_fifo = calloc(datenklo->rx_fifo_size, 1); datenklo->rx_fifo = calloc(datenklo->rx_fifo_size, 1);
if (!datenklo->tx_fifo || !datenklo->rx_fifo) { if (!datenklo->tx_fifo || !datenklo->rx_fifo) {
PDEBUG(DDATENKLO, DEBUG_ERROR, "No mem!\n"); LOGP(DDATENKLO, LOGL_ERROR, "No mem!\n");
rc = -ENOMEM; rc = -ENOMEM;
goto error; 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); 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) { if (rc < 0) {
PDEBUG(DDATENKLO, DEBUG_ERROR, "Failed to initialize UART.\n"); LOGP(DDATENKLO, LOGL_ERROR, "Failed to initialize UART.\n");
goto error; goto error;
} }
@@ -1397,7 +1399,7 @@ int datenklo_open_audio(datenklo_t *datenklo, const char *audiodev, int buffer,
/* init sound */ /* 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(audiodev, NULL, NULL, NULL, channels, 0.0, datenklo->samplerate, datenklo->buffer_size, 1.0, 1.0, 4000.0, 2.0);
if (!datenklo->audio) { if (!datenklo->audio) {
PDEBUG(DDATENKLO, DEBUG_ERROR, "No sound device!\n"); LOGP(DDATENKLO, LOGL_ERROR, "No sound device!\n");
return -EIO; return -EIO;
} }
#endif #endif
@@ -1405,28 +1407,28 @@ int datenklo_open_audio(datenklo_t *datenklo, const char *audiodev, int buffer,
if (write_rx_wave) { if (write_rx_wave) {
rc = wave_create_record(&datenklo->wave_rx_rec, write_rx_wave, datenklo->samplerate, channels, 1.0); rc = wave_create_record(&datenklo->wave_rx_rec, write_rx_wave, datenklo->samplerate, channels, 1.0);
if (rc < 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; return rc;
} }
} }
if (write_tx_wave) { if (write_tx_wave) {
rc = wave_create_record(&datenklo->wave_tx_rec, write_tx_wave, datenklo->samplerate, channels, 1.0); rc = wave_create_record(&datenklo->wave_tx_rec, write_tx_wave, datenklo->samplerate, channels, 1.0);
if (rc < 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; return rc;
} }
} }
if (read_rx_wave) { if (read_rx_wave) {
rc = wave_create_playback(&datenklo->wave_rx_play, read_rx_wave, &datenklo->samplerate, &channels, 1.0); rc = wave_create_playback(&datenklo->wave_rx_play, read_rx_wave, &datenklo->samplerate, &channels, 1.0);
if (rc < 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; return rc;
} }
} }
if (read_tx_wave) { if (read_tx_wave) {
rc = wave_create_playback(&datenklo->wave_tx_play, read_tx_wave, &datenklo->samplerate, &channels, 1.0); rc = wave_create_playback(&datenklo->wave_tx_play, read_tx_wave, &datenklo->samplerate, &channels, 1.0);
if (rc < 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; return rc;
} }
} }
@@ -1521,14 +1523,14 @@ void datenklo_main(datenklo_t *datenklo, int loopback)
process_auto_rts(datenklo->slave); process_auto_rts(datenklo->slave);
/* process timers */ /* process timers */
process_timer(); osmo_select_main(1);
#ifdef HAVE_ALSA #ifdef HAVE_ALSA
count = sound_read(datenklo->audio, samples, datenklo->buffer_size, num_chan, rf_level_db); count = sound_read(datenklo->audio, samples, datenklo->buffer_size, num_chan, rf_level_db);
if (count < 0) { 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) { if (count == -EPIPE) {
PDEBUG(DDATENKLO, DEBUG_ERROR, "Trying to recover!\n"); LOGP(DDATENKLO, LOGL_ERROR, "Trying to recover!\n");
continue; continue;
} }
break; break;
@@ -1561,9 +1563,9 @@ void datenklo_main(datenklo_t *datenklo, int loopback)
count = samplerate / 1000; count = samplerate / 1000;
#endif #endif
if (count < 0) { 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) { if (count == -EPIPE) {
PDEBUG(DDATENKLO, DEBUG_ERROR, "Trying to recover!\n"); LOGP(DDATENKLO, LOGL_ERROR, "Trying to recover!\n");
continue; continue;
} }
break; break;
@@ -1611,9 +1613,9 @@ void datenklo_main(datenklo_t *datenklo, int loopback)
/* write audio */ /* write audio */
rc = sound_write(datenklo->audio, samples, power, count, NULL, NULL, num_chan); rc = sound_write(datenklo->audio, samples, power, count, NULL, NULL, num_chan);
if (rc < 0) { 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) { if (rc == -EPIPE) {
PDEBUG(DDATENKLO, DEBUG_ERROR, "Trying to recover!\n"); LOGP(DDATENKLO, LOGL_ERROR, "Trying to recover!\n");
continue; continue;
} }
break; break;
@@ -1625,8 +1627,6 @@ next_char:
switch (c) { switch (c) {
case 3: case 3:
/* quit */ /* quit */
if (clear_console_text)
clear_console_text();
printf("CTRL+c received, quitting!\n"); printf("CTRL+c received, quitting!\n");
quit = 1; quit = 1;
goto next_char; goto next_char;
@@ -1655,10 +1655,6 @@ next_char:
pthread_mutex_lock(&mutex); pthread_mutex_lock(&mutex);
} }
/* get rid of last entry */
if (clear_console_text)
clear_console_text();
/* reset terminal */ /* reset terminal */
tcsetattr(0, TCSANOW, &term_orig); tcsetattr(0, TCSANOW, &term_orig);
@@ -1674,9 +1670,9 @@ next_char:
/* cleanup function */ /* cleanup function */
void datenklo_exit(datenklo_t *datenklo) 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 */ /* exit device */
if (datenklo->device) if (datenklo->device)
+1 -1
View File
@@ -52,7 +52,7 @@ typedef struct datenklo {
int auto_rts_cts; /* CTS was indicated */ int auto_rts_cts; /* CTS was indicated */
int auto_rts_cd; /* CD was indicated */ int auto_rts_cd; /* CD was indicated */
int output_off; /* output stopped by flow control */ int output_off; /* output stopped by flow control */
struct timer vtimer; /* VTIME timer */ struct osmo_timer_list vtimer; /* VTIME timer */
int vtimeout; /* when timeout has fired */ int vtimeout; /* when timeout has fired */
/* data fifos */ /* data fifos */
+15 -15
View File
@@ -27,7 +27,7 @@
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include <errno.h> #include <errno.h>
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#define __USE_GNU #define __USE_GNU
#include <pthread.h> #include <pthread.h>
#include <signal.h> #include <signal.h>
@@ -122,7 +122,7 @@ static void cuse_read_interrupt(fuse_req_t req, void *data)
if (!device->read_locked) if (!device->read_locked)
device->lock_cb(); 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) { if (device->read_req) {
device->read_req = NULL; 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) { if (device->read_req) {
device->unlock_cb(); 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); fuse_reply_err(req, EBUSY);
return; 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) */ /* 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) { 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_req = req;
device->read_size = size; device->read_size = size;
@@ -216,7 +216,7 @@ static void cuse_write_interrupt(fuse_req_t req, void *data)
if (!device->write_locked) if (!device->write_locked)
device->lock_cb(); 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) { if (device->write_req) {
device->write_req = NULL; 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) { if (device->write_req) {
device->unlock_cb(); 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); fuse_reply_err(req, EBUSY);
return; 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) */ /* 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) { 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_req = req;
device->write_size = size; device->write_size = size;
device->write_buf = malloc(size); device->write_buf = malloc(size);
if (!buf) { if (!buf) {
PDEBUG(DDEVICE, DEBUG_ERROR, "No memory!\n"); LOGP(DDEVICE, LOGL_ERROR, "No memory!\n");
exit(0); exit(0);
} }
memcpy(device->write_buf, buf, size); 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; break;
default: 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); 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)req;
(void)fi; (void)fi;
device_t *device = get_device_by_thread(); 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) 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)datasync;
(void)fi; (void)fi;
device_t *device = get_device_by_thread(); 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);
} }
@@ -478,9 +478,9 @@ static void *device_child(void *arg)
device->thread_started = 1; 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); 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; 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)); device = calloc(1, sizeof(*device));
if (!device) { if (!device) {
PDEBUG(DDEVICE, DEBUG_ERROR, "No memory!\n"); LOGP(DDEVICE, LOGL_ERROR, "No memory!\n");
errno = ENOMEM; errno = ENOMEM;
goto error; goto error;
} }
@@ -514,7 +514,7 @@ void *device_init(void *inst, const char *name, int (*open)(void *inst, int flag
rc = pthread_create(&device->thread, NULL, device_child, device); rc = pthread_create(&device->thread, NULL, device_child, device);
if (rc < 0) { 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; errno = -rc;
goto error; goto error;
} }
+10 -7
View File
@@ -26,9 +26,9 @@
#include <errno.h> #include <errno.h>
#include <math.h> #include <math.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libtimer/timer.h" #include <osmocom/core/timer.h>
#include "../liboptions/options.h" #include "../liboptions/options.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "../libfsk/fsk.h" #include "../libfsk/fsk.h"
#include "../libwave/wave.h" #include "../libwave/wave.h"
#include "../libdisplay/display.h" #include "../libdisplay/display.h"
@@ -80,6 +80,7 @@ void print_help(const char *arg0)
printf(" --config [~/]<path to config file>\n"); 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(" 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"); 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(" -T --am791x-type 7910 | 7911\n");
printf(" Give modem chip type. (Default = 791%d)\n", am791x_type); printf(" Give modem chip type. (Default = 791%d)\n", am791x_type);
printf(" -M --mc <mode>\n"); printf(" -M --mc <mode>\n");
@@ -158,13 +159,11 @@ static int handle_options(int short_option, int argi, char **argv)
print_help(argv[0]); print_help(argv[0]);
return 0; return 0;
case 'v': case 'v':
if (!strcasecmp(argv[argi], "list")) { rc = parse_logging_opt(argv[argi]);
debug_list_cat(); if (rc > 0)
return 0; return 0;
}
rc = parse_debug_opt(argv[argi]);
if (rc < 0) { 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; return rc;
} }
break; break;
@@ -265,6 +264,8 @@ int main(int argc, char *argv[])
int rc, argi; int rc, argi;
int i; int i;
logging_init();
/* handle options / config file */ /* handle options / config file */
add_options(); add_options();
rc = options_config_file(argc, argv, "~/.osmocom/analog/datenklo.conf", handle_options); rc = options_config_file(argc, argv, "~/.osmocom/analog/datenklo.conf", handle_options);
@@ -325,3 +326,5 @@ fail:
return 0; return 0;
} }
void osmo_cc_set_log_cat(void) {}
+3 -3
View File
@@ -21,7 +21,7 @@
#include <stdint.h> #include <stdint.h>
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "uart.h" #include "uart.h"
static uint32_t calc_parity(uint32_t data, uint8_t data_bits, enum uart_parity parity) 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->rx_cb = rx_cb;
uart->data_bits = data_bits; uart->data_bits = data_bits;
if (uart->data_bits > 9) { 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(); abort();
} }
uart->parity = parity; uart->parity = parity;
uart->stop_bits = stop_bits; uart->stop_bits = stop_bits;
if (uart->stop_bits < 1 || uart->stop_bits > 2) { 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(); abort();
} }
uart->tx_pos = -1; uart->tx_pos = -1;
+2 -1
View File
@@ -13,13 +13,14 @@ dcf77_SOURCES = \
dcf77_LDADD = \ dcf77_LDADD = \
$(COMMON_LA) \ $(COMMON_LA) \
$(top_builddir)/src/liboptions/liboptions.a \ $(top_builddir)/src/liboptions/liboptions.a \
$(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libdisplay/libdisplay.a \ $(top_builddir)/src/libdisplay/libdisplay.a \
$(top_builddir)/src/libfilter/libfilter.a \ $(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/libwave/libwave.a \ $(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \ $(top_builddir)/src/libsample/libsample.a \
$(top_builddir)/src/libsound/libsound.a \ $(top_builddir)/src/libsound/libsound.a \
$(top_builddir)/src/libaaimage/libaaimage.a \ $(top_builddir)/src/libaaimage/libaaimage.a \
$(top_builddir)/src/liblogging/liblogging.a \
$(LIBOSMOCORE_LIBS) \
$(ALSA_LIBS) \ $(ALSA_LIBS) \
-lm -lm
endif endif
+52 -54
View File
@@ -26,7 +26,7 @@
#include <inttypes.h> #include <inttypes.h>
#include <stdlib.h> #include <stdlib.h>
#include <math.h> #include <math.h>
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "dcf77.h" #include "dcf77.h"
#include "weather.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)); dcf77 = calloc(1, sizeof(*dcf77));
if (!dcf77) { if (!dcf77) {
PDEBUG(DDCF77, DEBUG_ERROR, "No mem!\n"); LOGP(DDCF77, LOGL_ERROR, "No mem!\n");
return NULL; return NULL;
} }
tx = &dcf77->tx; 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_size = ceil((double)SAMPLE_CLOCK * 0.1);
rx->delay_buffer = calloc(rx->delay_size, sizeof(*rx->delay_buffer)); rx->delay_buffer = calloc(rx->delay_size, sizeof(*rx->delay_buffer));
if (!rx->delay_buffer) { if (!rx->delay_buffer) {
PDEBUG(DDCF77, DEBUG_ERROR, "No mem!\n"); LOGP(DDCF77, LOGL_ERROR, "No mem!\n");
return NULL; return NULL;
} }
@@ -444,9 +444,9 @@ dcf77_t *dcf77_create(int samplerate, int use_tx, int use_rx, int test_tone)
} }
if (tx->enable) 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) 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 #if 0
void rx_frame_test(dcf77_t *dcf77, const char *string); void rx_frame_test(dcf77_t *dcf77, const char *string);
@@ -467,7 +467,7 @@ void dcf77_destroy(dcf77_t *dcf77)
free(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) 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; hour = (19 + (region - 60) / 20) % 24;
} }
min = (region % 20) * 3; 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 */ /* reset to 0:00 UTC at same day */
timestamp -= (timestamp % 86400); timestamp -= (timestamp % 86400);
@@ -521,7 +521,7 @@ time_t dcf77_start_weather(time_t timestamp, int region, int offset)
timestamp += hour * 3600 + min * 60; timestamp += hour * 3600 + min * 60;
/* substract offset */ /* 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; timestamp -= 60 * offset;
return timestamp; return timestamp;
@@ -576,7 +576,7 @@ static uint64_t generate_weather(time_t timestamp, int minute, int utc_hour, int
/* generate weather data */ /* generate weather data */
timestamp -= 120; timestamp -= 120;
weather = 0; 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("Peparing Weather INFO\n");
printf("---------------------\n"); printf("---------------------\n");
printf("Time (UTC): %02d:%02d\n", (int)(timestamp / 3600) % 24, (int)(timestamp / 60) % 60); 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; utc_hour += 24;
/* in index 0 we transmit minute + 1 (next minute), so we substract 1 */ /* 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); 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 & 0x3f) << 1; /* bit 2-7 */
chunk |= (tx->weather_cipher & 0x0fc0) << 2; /* bit 9-14 */ chunk |= (tx->weather_cipher & 0x0fc0) << 2; /* bit 9-14 */
tx->weather_cipher >>= 12; tx->weather_cipher >>= 12;
return chunk; 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; chunk = tx->weather_cipher & 0x3fff;
tx->weather_cipher >>= 14; tx->weather_cipher >>= 14;
return chunk; return chunk;
@@ -759,7 +759,7 @@ static char tx_symbol(dcf77_t *dcf77, time_t timestamp, int second)
else else
zone = 2; 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)) if ((tm->tm_isdst > 0) != (isdst_next_hour > 0))
frame |= (uint64_t)1 << 16; 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' + ((frame >> i) & 1);
} }
tx->data_string[j] = '\0'; tx->data_string[j] = '\0';
PDEBUG(DDSP, DEBUG_INFO, "Start transmission of frame:\n"); LOGP(DDSP, LOGL_INFO, "Start transmission of frame:\n");
PDEBUG(DDSP, DEBUG_INFO, "0 Wetterdaten Info 1 Minute P StundeP Tag WoT Monat Jahr P\n"); LOGP(DDSP, LOGL_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, "%s\n", tx->data_string);
} }
if (second == 59) if (second == 59)
@@ -818,7 +818,7 @@ static char tx_symbol(dcf77_t *dcf77, time_t timestamp, int second)
else else
symbol = ((tx->data_frame >> second) & 1) + '0'; 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; 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 dataset = ((utc_hour + 2) % 24) * 20 + (minute / 3); /* data sets since 22:00 UTC */
int value; 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("Received Weather INFO\n");
printf("---------------------\n"); printf("---------------------\n");
printf("Time (UTC): %02d:%02d\n", utc_hour, minute); 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; int32_t weather;
if (rx->weather_index == 0 && index != 0) { 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; 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_cipher |= (frame >> 3) & 0x0fc0; /* bit 9-14 */
rx->weather_index++; rx->weather_index++;
if (((frame & 0x0002)) || ((frame & 0x0100)) || !rx->weather_cipher) { 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); rx_weather_reset(rx);
return; return;
} }
PDEBUG(DFRAME, DEBUG_INFO, "Got first chunk of weather info.\n"); LOGP(DFRAME, LOGL_INFO, "Got first chunk of weather info.\n");
return; return;
} }
if (rx->weather_index == 1 && index == 1) { 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_cipher |= (frame << 11) & 0x3fff000; /* bit 1-14 */
rx->weather_key |= (frame >> 21) & 0x7f; rx->weather_key |= (frame >> 21) & 0x7f;
rx->weather_key |= ((frame >> 29) & 0x3f) << 8; 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; return;
} }
if (rx->weather_index == 2 && index == 2) { 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 */ rx->weather_cipher |= (frame << 25) & 0xfffc000000; /* bit 1-14 */
weather = weather_decode(rx->weather_cipher, rx->weather_key); weather = weather_decode(rx->weather_cipher, rx->weather_key);
if (weather < 0) 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 { else {
/* convert hour to UTC */ /* convert hour to UTC */
utc_hour = hour - 1; 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); 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 */ /* 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; int year_one, year_ten, year = -1;
uint64_t p; uint64_t p;
PDEBUG(DFRAME, DEBUG_INFO, "Bit 0 is '0'? : %s\n", ((frame >> 0) & 1) ? "no" : "yes"); LOGP(DFRAME, LOGL_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); LOGP(DFRAME, LOGL_INFO, "Bits 1..14 : 0x%04x\n", (int)(frame >> 1) & 0x3fff);
PDEBUG(DFRAME, DEBUG_INFO, "Call Bit : %d\n", (int)(frame >> 15) & 1); LOGP(DFRAME, LOGL_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, "Change Time Zone : %s\n", ((frame >> 16) & 1) ? "yes" : "no");
zone = ((frame >> 17) & 3); zone = ((frame >> 17) & 3);
PDEBUG(DFRAME, DEBUG_INFO, "Time Zone : %s\n", time_zone[zone]); LOGP(DFRAME, LOGL_INFO, "Time Zone : %s\n", time_zone[zone]);
PDEBUG(DFRAME, DEBUG_INFO, "Add Leap Second : %s\n", ((frame >> 19) & 1) ? "yes" : "no"); LOGP(DFRAME, LOGL_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, "Bit 20 is '1'? : %s\n", ((frame >> 20) & 1) ? "yes" : "no");
minute_one = (frame >> 21 & 0xf); minute_one = (frame >> 21 & 0xf);
minute_ten = ((frame >> 25) & 0x7); 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 >> 2);
p = p ^ (p >> 1); p = p ^ (p >> 1);
if (minute_one > 9 || minute_ten > 5 || (p & 1)) if (minute_one > 9 || minute_ten > 5 || (p & 1))
PDEBUG(DFRAME, DEBUG_INFO, "Minute : ???\n"); LOGP(DFRAME, LOGL_INFO, "Minute : ???\n");
else { else {
minute = minute_ten * 10 + minute_one; 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); 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 >> 2);
p = p ^ (p >> 1); p = p ^ (p >> 1);
if (hour_one > 9 || hour_ten > 2 || (hour_ten == 2 && hour_one > 3) || (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 { else {
hour = hour_ten * 10 + hour_one; 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); day_one = (frame >> 36 & 0xf);
@@ -1099,34 +1099,34 @@ static void rx_frame(dcf77_rx_t *rx, uint64_t frame)
p = p ^ (p >> 2); p = p ^ (p >> 2);
p = p ^ (p >> 1); 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)) 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 { else {
day = day_ten * 10 + day_one; 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)) { if (wday < 1 || wday > 7 || (p & 1)) {
PDEBUG(DFRAME, DEBUG_INFO, "Week Day : ???\n"); LOGP(DFRAME, LOGL_INFO, "Week Day : ???\n");
wday = -1; wday = -1;
} else } 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)) 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 { else {
month = month_ten * 10 + month_one; 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)) if (year_one > 9 || year_ten > 9 || (p & 1))
PDEBUG(DFRAME, DEBUG_INFO, "Year : ???\n"); LOGP(DFRAME, LOGL_INFO, "Year : ???\n");
else { else {
year = year_ten * 10 + year_one; 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) { 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); rx_weather(rx, minute, hour, zone, frame);
} else { } 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); rx_weather_reset(rx);
} }
} }
@@ -1151,11 +1151,11 @@ static void rx_symbol(dcf77_t *dcf77, char symbol)
dcf77_rx_t *rx = &dcf77->rx; dcf77_rx_t *rx = &dcf77->rx;
double second = -NAN; 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 (!rx->data_receive) {
if (symbol == 'm') { 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_receive = 1;
rx->data_index = 0; rx->data_index = 0;
rx->string_index = 0; rx->string_index = 0;
@@ -1167,20 +1167,20 @@ static void rx_symbol(dcf77_t *dcf77, char symbol)
rx->data_string[rx->string_index] = '\0'; rx->data_string[rx->string_index] = '\0';
rx->data_index = 0; rx->data_index = 0;
rx->string_index = 0; rx->string_index = 0;
PDEBUG(DDSP, DEBUG_INFO, "Received complete frame:\n"); LOGP(DDSP, LOGL_INFO, "Received complete frame:\n");
PDEBUG(DDSP, DEBUG_INFO, "0 Wetterdaten Info 1 Minute P StundeP Tag WoT Monat Jahr P\n"); LOGP(DDSP, LOGL_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, "%s\n", rx->data_string);
rx_frame(rx, rx->data_frame); rx_frame(rx, rx->data_frame);
second = 0; second = 0;
} else { } 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->data_index = 0;
rx->string_index = 0; rx->string_index = 0;
rx_weather_reset(rx); rx_weather_reset(rx);
} }
} else { } else {
if (rx->data_index == 59) { 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->data_receive = 0;
rx_weather_reset(rx); rx_weather_reset(rx);
} else { } else {
@@ -1312,5 +1312,3 @@ void dcf77_decode(dcf77_t *dcf77, sample_t *samples, int length)
} }
} }
+15 -13
View File
@@ -28,7 +28,7 @@
#include <sched.h> #include <sched.h>
#include <time.h> #include <time.h>
#include <math.h> #include <math.h>
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "../liboptions/options.h" #include "../liboptions/options.h"
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libsound/sound.h" #include "../libsound/sound.h"
@@ -146,7 +146,7 @@ void print_help(void)
printf(" --config [~/]<path to config file>\n"); 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(" 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"); 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(" -a --audio-device hw:<card>,<device>\n");
printf(" Sound card and device number (default = '%s')\n", dsp_device); printf(" Sound card and device number (default = '%s')\n", dsp_device);
printf(" -s --samplerate <rate>\n"); printf(" -s --samplerate <rate>\n");
@@ -253,13 +253,11 @@ static int handle_options(int short_option, int argi, char **argv)
print_help(); print_help();
return 0; return 0;
case 'v': case 'v':
if (!strcasecmp(argv[argi], "list")) { rc = parse_logging_opt(argv[argi]);
debug_list_cat(); if (rc > 0)
return 0; return 0;
}
rc = parse_debug_opt(argv[argi]);
if (rc < 0) { 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; return rc;
} }
break; break;
@@ -416,14 +414,14 @@ static int get_char()
int soundif_open(const char *audiodev, int samplerate, int buffer_size) int soundif_open(const char *audiodev, int samplerate, int buffer_size)
{ {
if (!audiodev || !audiodev[0]) { if (!audiodev || !audiodev[0]) {
PDEBUG(DDSP, DEBUG_ERROR, "No audio device given!\n"); LOGP(DDSP, LOGL_ERROR, "No audio device given!\n");
return -EINVAL; return -EINVAL;
} }
/* open audiodev */ /* 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); 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 (!soundif) { 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 -EIO;
} }
@@ -433,7 +431,7 @@ int soundif_open(const char *audiodev, int samplerate, int buffer_size)
void soundif_start(void) void soundif_start(void)
{ {
sound_start(soundif); sound_start(soundif);
PDEBUG(DDSP, DEBUG_DEBUG, "Starting audio stream!\n"); LOGP(DDSP, LOGL_DEBUG, "Starting audio stream!\n");
} }
void soundif_close(void) void soundif_close(void)
@@ -456,7 +454,7 @@ void soundif_work(int buffer_size)
/* encode and write */ /* encode and write */
count = sound_get_tosend(soundif, buffer_size); count = sound_get_tosend(soundif, buffer_size);
if (count < 0) { 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);
return; return;
} }
if (count) { if (count) {
@@ -467,7 +465,7 @@ void soundif_work(int buffer_size)
} }
rc = sound_write(soundif, samples, NULL, count, NULL, NULL, (double_amplitude) ? 2 : 1); rc = sound_write(soundif, samples, NULL, count, NULL, NULL, (double_amplitude) ? 2 : 1);
if (rc < 0) { 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);
return; return;
} }
} }
@@ -475,7 +473,7 @@ void soundif_work(int buffer_size)
/* read */ /* read */
count = sound_read(soundif, samples, buffer_size, 1, rf_level_db); count = sound_read(soundif, samples, buffer_size, 1, rf_level_db);
if (count < 0) { if (count < 0) {
PDEBUG(DDSP, DEBUG_ERROR, "Failed to read from audio device (rc = %d)!\n", count); LOGP(DDSP, LOGL_ERROR, "Failed to read from audio device (rc = %d)!\n", count);
return; return;
} }
@@ -491,6 +489,8 @@ int main(int argc, char *argv[])
double begin_time, now, sleep; double begin_time, now, sleep;
char c; char c;
logging_init();
/* handle options / config file */ /* handle options / config file */
add_options(); add_options();
rc = options_config_file(argc, argv, "~/.osmocom/dcf77/dcf77.conf", handle_options); rc = options_config_file(argc, argv, "~/.osmocom/dcf77/dcf77.conf", handle_options);
@@ -642,3 +642,5 @@ error:
return 0; return 0;
} }
void osmo_cc_set_log_cat(void) {}
+7 -7
View File
@@ -7,7 +7,7 @@ https://github.com/tobozo/esp32-dcf77-weatherman/blob/master/dcf77.cpp
#include <stdio.h> #include <stdio.h>
#include <stdint.h> #include <stdint.h>
#include <endian.h> #include <endian.h>
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "weather.h" #include "weather.h"
/// Container zum Konvertieren zwischen 4 Bytes und Uint. /// 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); weather = GetWeatherFromPlain(PlainBytes);
#ifdef DEBUG_CIPER #ifdef DEBUG_CIPER
printf("cipher=%s\n", debug_hex(CipherBytes, 5)); printf("cipher=%s\n", osmo_hexdump(CipherBytes, 5));
printf("key =%s\n", debug_hex(KeyBytes, 5)); printf("key =%s\n", osmo_hexdump(KeyBytes, 5));
printf("plain =%s\n", debug_hex(PlainBytes, 5)); printf("plain =%s\n", osmo_hexdump(PlainBytes, 5));
if (weather < 0) if (weather < 0)
printf("weather=error\n"); printf("weather=error\n");
else else
@@ -569,9 +569,9 @@ uint64_t weather_encode(uint32_t weather, uint64_t key)
CipherBytes = Encrypt(PlainBytes, KeyBytes); CipherBytes = Encrypt(PlainBytes, KeyBytes);
#ifdef DEBUG_CIPER #ifdef DEBUG_CIPER
printf("plain =%s\n", debug_hex(PlainBytes, 5)); printf("plain =%s\n", osmo_hexdump(PlainBytes, 5));
printf("key =%s\n", debug_hex(KeyBytes, 5)); printf("key =%s\n", osmo_hexdump(KeyBytes, 5));
printf("cipher=%s\n", debug_hex(CipherBytes, 5)); printf("cipher=%s\n", osmo_hexdump(CipherBytes, 5));
#endif #endif
for (i = 0; i < 5; i++) for (i = 0; i < 5; i++)
+3 -5
View File
@@ -16,13 +16,9 @@ eurosignal_LDADD = \
$(COMMON_LA) \ $(COMMON_LA) \
../anetz/libgermanton.a \ ../anetz/libgermanton.a \
$(top_builddir)/src/liboptions/liboptions.a \ $(top_builddir)/src/liboptions/liboptions.a \
$(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libmobile/libmobile.a \ $(top_builddir)/src/libmobile/libmobile.a \
$(top_builddir)/src/libosmocc/libosmocc.a \
$(top_builddir)/src/libdisplay/libdisplay.a \ $(top_builddir)/src/libdisplay/libdisplay.a \
$(top_builddir)/src/libjitter/libjitter.a \ $(top_builddir)/src/libjitter/libjitter.a \
$(top_builddir)/src/libtimer/libtimer.a \
$(top_builddir)/src/libselect/libselect.a \
$(top_builddir)/src/libsamplerate/libsamplerate.a \ $(top_builddir)/src/libsamplerate/libsamplerate.a \
$(top_builddir)/src/libemphasis/libemphasis.a \ $(top_builddir)/src/libemphasis/libemphasis.a \
$(top_builddir)/src/libfsk/libfsk.a \ $(top_builddir)/src/libfsk/libfsk.a \
@@ -30,8 +26,10 @@ eurosignal_LDADD = \
$(top_builddir)/src/libfilter/libfilter.a \ $(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/libwave/libwave.a \ $(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \ $(top_builddir)/src/libsample/libsample.a \
$(top_builddir)/src/libg711/libg711.a \
$(top_builddir)/src/libaaimage/libaaimage.a \ $(top_builddir)/src/libaaimage/libaaimage.a \
$(top_builddir)/src/liblogging/liblogging.a \
$(LIBOSMOCORE_LIBS) \
$(LIBOSMOCC_LIBS) \
-lm -lm
if HAVE_ALSA if HAVE_ALSA
+12 -12
View File
@@ -26,7 +26,7 @@
#include <errno.h> #include <errno.h>
#include <math.h> #include <math.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "eurosignal.h" #include "eurosignal.h"
#include "dsp.h" #include "dsp.h"
@@ -105,11 +105,11 @@ void dsp_init(int samplerate)
{ {
int i; 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++) for (i = 0; dsp_digits[i].digit; i++)
dsp_digits[i].phaseshift65536 = 65536.0 / ((double)samplerate / dsp_digits[i].frequency); 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++) for (i = 0; i < 65536; i++)
dsp_tone[i] = sin((double)i / 65536.0 * 2.0 * PI); 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; 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 */ /* set modulation parameters */
if (fm) if (fm)
@@ -154,7 +154,7 @@ error:
/* Cleanup transceiver instance. */ /* Cleanup transceiver instance. */
void dsp_cleanup_sender(euro_t *euro) 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 */ /* cleanup demodulator */
fm_demod_exit(&euro->rx_demod); fm_demod_exit(&euro->rx_demod);
@@ -201,7 +201,7 @@ static void tone_decode(euro_t *euro, sample_t *samples, int length)
case 'I': case 'I':
/* pause tone */ /* pause tone */
if (euro->rx_digit_count == DIGIT_DETECT) { 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_receiving = 1;
euro->rx_digit_index = 0; euro->rx_digit_index = 0;
euro->rx_timeout_count = 0; euro->rx_timeout_count = 0;
@@ -213,7 +213,7 @@ static void tone_decode(euro_t *euro, sample_t *samples, int length)
break; break;
if (euro->rx_digit_count == DIGIT_DETECT) { if (euro->rx_digit_count == DIGIT_DETECT) {
/* out of range tone */ /* 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; euro->rx_digit_receiving = 0;
} }
break; break;
@@ -225,7 +225,7 @@ static void tone_decode(euro_t *euro, sample_t *samples, int length)
if (euro->rx_digit_count == DIGIT_DETECT) { if (euro->rx_digit_count == DIGIT_DETECT) {
double level; double level;
level = sqrt(I[i] * I[i] + Q[i] * Q[i]) * 2; 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); display_measurements_update(euro->dmp_tone_level, level * 100.0, 0.0);
euro->rx_digits[euro->rx_digit_index] = digit; euro->rx_digits[euro->rx_digit_index] = digit;
euro->rx_digit_index++; 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) { if (euro->rx_digit_receiving && euro->rx_digit_index) {
euro->rx_timeout_count++; euro->rx_timeout_count++;
if (euro->rx_timeout_count == TIMEOUT_DETECT) { 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; 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->tx_time -= PAUSE_DURATION;
euro_get_id(euro, euro->tx_digits); euro_get_id(euro, euro->tx_digits);
euro->tx_digit_index = 0; 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]); euro->tx_phaseshift65536 = digit_to_phaseshift65536(euro->tx_digits[0]);
} }
} else { } else {
if (euro->tx_time >= DIGIT_DURATION) { if (euro->tx_time >= DIGIT_DURATION) {
euro->tx_time -= DIGIT_DURATION; euro->tx_time -= DIGIT_DURATION;
if (++euro->tx_digit_index == 6) { 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_digits[0] = '\0';
euro->tx_phaseshift65536 = digit_to_phaseshift65536('I'); euro->tx_phaseshift65536 = digit_to_phaseshift65536('I');
} else { } 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]); euro->tx_phaseshift65536 = digit_to_phaseshift65536(euro->tx_digits[euro->tx_digit_index]);
} }
} }
+57 -57
View File
@@ -26,22 +26,22 @@
#include <errno.h> #include <errno.h>
#include <math.h> #include <math.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "../libmobile/call.h" #include "../libmobile/call.h"
#include "../libmobile/cause.h" #include "../libmobile/cause.h"
#include "../libosmocc/message.h" #include <osmocom/cc/message.h>
#include "eurosignal.h" #include "eurosignal.h"
#include "dsp.h" #include "dsp.h"
/* announcement timers */ /* announcement timers */
#define ANSWER_TIME 1.0 /* wait after answer */ #define ANSWER_TIME 1,0 /* wait after answer */
#define OOO_TIME 3.8 /* announcement 1.7 s, pause 2.1 s */ #define OOO_TIME 3,800000 /* announcement 1.7 s, pause 2.1 s */
#define UNASSIGNED_TIME1 2.2 /* announcement 2.2 s s */ #define UNASSIGNED_TIME1 2,200000 /* announcement 2.2 s s */
#define UNASSIGNED_TIME2 2.9 /* announcement 2.2 s, pause 0.7 s */ #define UNASSIGNED_TIME2 2,900000 /* announcement 2.2 s, pause 0.7 s */
#define DEGRADED_TIME 4.95 /* announcement 2.25 s, pause 2.7 s */ #define DEGRADED_TIME 4,950000 /* announcement 2.25 s, pause 2.7 s */
#define ACKNOWLEDGE_TIME1 2.8 /* announcement 1.7 s, pause 1.1 s */ #define ACKNOWLEDGE_TIME1 2,800000 /* announcement 1.7 s, pause 1.1 s */
#define ACKNOWLEDGE_TIME2 4.6 /* announcement 1.7 s, pause 2.9 s */ #define ACKNOWLEDGE_TIME2 4,600000 /* announcement 1.7 s, pause 2.9 s */
#define BEEP_TIME 4.0 /* beep after answer */ #define BEEP_TIME 4,000000 /* beep after answer */
/* these calls are not associated with a transmitter */ /* these calls are not associated with a transmitter */
euro_call_t *ooo_call_list = NULL; 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) if (call->state == new_state)
return; 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; call->state = new_state;
euro_display_status(); euro_display_status();
} }
@@ -243,29 +243,29 @@ int euro_create(const char *kanal, const char *device, int use_sdr, int samplera
int rc; int rc;
if (euro_kanal2freq(kanal, 0) == 0.0) { 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; return -EINVAL;
} }
euro = calloc(1, sizeof(*euro)); euro = calloc(1, sizeof(*euro));
if (!euro) { if (!euro) {
PDEBUG(DEURO, DEBUG_ERROR, "No memory!\n"); LOGP(DEURO, LOGL_ERROR, "No memory!\n");
return -ENOMEM; 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 */ /* 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); 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) { 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; goto error;
} }
/* init audio processing */ /* init audio processing */
rc = dsp_init_sender(euro, samplerate, fm); rc = dsp_init_sender(euro, samplerate, fm);
if (rc < 0) { 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; goto error;
} }
@@ -279,7 +279,7 @@ int euro_create(const char *kanal, const char *device, int use_sdr, int samplera
euro_display_status(); euro_display_status();
PDEBUG(DEURO, DEBUG_NOTICE, "Created 'Kanal' %s\n", kanal); LOGP(DEURO, LOGL_NOTICE, "Created 'Kanal' %s\n", kanal);
return 0; return 0;
@@ -294,7 +294,7 @@ void euro_destroy(sender_t *sender)
{ {
euro_t *euro = (euro_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) while (euro->call_list)
euro_call_destroy(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; 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 */ /* create */
call = calloc(1, sizeof(*call)); call = calloc(1, sizeof(*call));
if (!call) { if (!call) {
PDEBUG(DEURO, DEBUG_ERROR, "No mem!\n"); LOGP(DEURO, LOGL_ERROR, "No mem!\n");
abort(); 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); strcpy(call->station_id, id);
if (euro) if (euro)
call->page_count = euro->repeat; call->page_count = euro->repeat;
timer_init(&call->timer, call_timeout, call); osmo_timer_setup(&call->timer, call_timeout, call);
timer_start(&call->timer, ANSWER_TIME); osmo_timer_schedule(&call->timer, ANSWER_TIME);
/* link */ /* link */
call->euro = euro; call->euro = euro;
@@ -347,7 +347,7 @@ static void euro_call_destroy(euro_call_t *call)
(*callp) = call->next; (*callp) = call->next;
/* cleanup */ /* cleanup */
timer_exit(&call->timer); osmo_timer_del(&call->timer);
/* destroy */ /* destroy */
free(call); free(call);
@@ -364,12 +364,12 @@ void euro_get_id(euro_t *euro, char *id)
if (euro->scan_from < euro->scan_to) { if (euro->scan_from < euro->scan_to) {
sprintf(id, "%06d", euro->scan_from++); 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; goto encode;
} }
if (euro->sender.loopback) { 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); memcpy(id, "123456", 6);
goto encode; goto encode;
} }
@@ -377,7 +377,7 @@ void euro_get_id(euro_t *euro, char *id)
for (call = euro->call_list; call; call = call->next) { for (call = euro->call_list; call; call = call->next) {
if ((call->state == EURO_CALL_ACKNOWLEDGE || call->state == EURO_CALL_RELEASED) && call->page_count) { if ((call->state == EURO_CALL_ACKNOWLEDGE || call->state == EURO_CALL_RELEASED) && call->page_count) {
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); memcpy(id, call->station_id, 6);
if (call->page_count == 0 && call->state == EURO_CALL_RELEASED) if (call->page_count == 0 && call->state == EURO_CALL_RELEASED)
euro_call_destroy(call); euro_call_destroy(call);
@@ -400,15 +400,15 @@ void euro_get_id(euro_t *euro, char *id)
memcpy(id, euro->random_id, 6); memcpy(id, euro->random_id, 6);
euro->random_count--; euro->random_count--;
if (id[0] == 'R') { 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; 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; goto encode;
} }
if (!call) { if (!call) {
PDEBUG_CHAN(DEURO, DEBUG_DEBUG, "Transmitting Idle sequence.\n"); LOGP_CHAN(DEURO, LOGL_DEBUG, "Transmitting Idle sequence.\n");
memcpy(id, "RIIIII", 6); memcpy(id, "RIIIII", 6);
return; return;
} }
@@ -432,7 +432,7 @@ void euro_receive_id(euro_t *euro, char *id)
int count = 0; int count = 0;
if (id[0] == 'R') { if (id[0] == 'R') {
PDEBUG_CHAN(DEURO, DEBUG_DEBUG, "Received Idle sequence'\n"); LOGP_CHAN(DEURO, LOGL_DEBUG, "Received Idle sequence'\n");
return; return;
} }
@@ -444,7 +444,7 @@ void euro_receive_id(euro_t *euro, char *id)
/* loopback display */ /* loopback display */
if (euro->sender.loopback) { 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; return;
} }
@@ -452,12 +452,12 @@ void euro_receive_id(euro_t *euro, char *id)
if (id_list) { if (id_list) {
count = search_id(id); count = search_id(id);
if (!count) { 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; 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 */ /* we want to send beep via MNCC */
if (id_list) { if (id_list) {
@@ -475,7 +475,7 @@ void euro_receive_id(euro_t *euro, char *id)
return; return;
/* create call and send setup */ /* 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); sprintf(dialing, "%d", count);
callref = call_up_setup(call->station_id, dialing, OSMO_CC_NETWORK_EUROSIGNAL_NONE, ""); callref = call_up_setup(call->station_id, dialing, OSMO_CC_NETWORK_EUROSIGNAL_NONE, "");
call = euro_call_create(NULL, callref, id); call = euro_call_create(NULL, callref, id);
@@ -557,43 +557,43 @@ static void call_timeout(void *data)
case EURO_CALL_ANSWER: case EURO_CALL_ANSWER:
/* if no station is linked to the call, we are out-of-order */ /* if no station is linked to the call, we are out-of-order */
if (!call->euro) { 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_spl = es_ges_spl;
call->announcement_size = es_ges_size; call->announcement_size = es_ges_size;
call->announcement_index = 0; call->announcement_index = 0;
timer_start(&call->timer, OOO_TIME); osmo_timer_schedule(&call->timer, OOO_TIME);
call_new_state(call, EURO_CALL_OUTOFORDER); call_new_state(call, EURO_CALL_OUTOFORDER);
break; break;
} }
/* if subcriber list is available, but ID is not found, we are unassigned */ /* if subcriber list is available, but ID is not found, we are unassigned */
if (id_list && !search_id(call->station_id)) { 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_spl = es_kaudn_spl;
call->announcement_size = es_kaudn_size; call->announcement_size = es_kaudn_size;
call->announcement_index = 0; call->announcement_index = 0;
call->announcement_count = 1; call->announcement_count = 1;
timer_start(&call->timer, UNASSIGNED_TIME1); osmo_timer_schedule(&call->timer, UNASSIGNED_TIME1);
call_new_state(call, EURO_CALL_UNASSIGNED); call_new_state(call, EURO_CALL_UNASSIGNED);
break; break;
} }
/* if station is degraded, play that announcement */ /* if station is degraded, play that announcement */
if (call->euro->degraded) { 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_spl = es_teilges_spl;
call->announcement_size = es_teilges_size; call->announcement_size = es_teilges_size;
call->announcement_index = 0; call->announcement_index = 0;
timer_start(&call->timer, DEGRADED_TIME); osmo_timer_schedule(&call->timer, DEGRADED_TIME);
call_new_state(call, EURO_CALL_DEGRADED); call_new_state(call, EURO_CALL_DEGRADED);
break; break;
} }
/* fall through */ /* fall through */
case EURO_CALL_DEGRADED: 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_spl = es_mitte_spl;
call->announcement_size = es_mitte_size; call->announcement_size = es_mitte_size;
call->announcement_index = 0; call->announcement_index = 0;
call->announcement_count = 1; call->announcement_count = 1;
timer_start(&call->timer, ACKNOWLEDGE_TIME1); osmo_timer_schedule(&call->timer, ACKNOWLEDGE_TIME1);
call_new_state(call, EURO_CALL_ACKNOWLEDGE); call_new_state(call, EURO_CALL_ACKNOWLEDGE);
break; break;
case EURO_CALL_ACKNOWLEDGE: case EURO_CALL_ACKNOWLEDGE:
@@ -602,22 +602,22 @@ static void call_timeout(void *data)
call->announcement_size = es_mitte_size; call->announcement_size = es_mitte_size;
call->announcement_index = 0; call->announcement_index = 0;
call->announcement_count = 2; call->announcement_count = 2;
timer_start(&call->timer, ACKNOWLEDGE_TIME2); osmo_timer_schedule(&call->timer, ACKNOWLEDGE_TIME2);
break; break;
} }
if (call->page_count) { 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_up_release(call->callref, CAUSE_NORMAL);
call->callref = 0; call->callref = 0;
call_new_state(call, EURO_CALL_RELEASED); call_new_state(call, EURO_CALL_RELEASED);
break; 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); call_up_release(call->callref, CAUSE_NORMAL);
euro_call_destroy(call); euro_call_destroy(call);
break; break;
case EURO_CALL_OUTOFORDER: 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); call_up_release(call->callref, CAUSE_NORMAL);
euro_call_destroy(call); euro_call_destroy(call);
break; break;
@@ -627,18 +627,18 @@ static void call_timeout(void *data)
call->announcement_size = es_kaudn_size; call->announcement_size = es_kaudn_size;
call->announcement_index = 0; call->announcement_index = 0;
call->announcement_count = 2; call->announcement_count = 2;
timer_start(&call->timer, UNASSIGNED_TIME2); osmo_timer_schedule(&call->timer, UNASSIGNED_TIME2);
break; 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_spl = es_kaudn_spl;
call->announcement_size = es_kaudn_size; call->announcement_size = es_kaudn_size;
call->announcement_index = 0; call->announcement_index = 0;
call->announcement_count = 1; call->announcement_count = 1;
timer_start(&call->timer, UNASSIGNED_TIME1); osmo_timer_schedule(&call->timer, UNASSIGNED_TIME1);
break; break;
case EURO_CALL_BEEPING: 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_up_release(call->callref, CAUSE_NORMAL);
call->callref = 0; call->callref = 0;
euro_call_destroy(call); 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 */ /* just (ab)use busy signal when no station is available */
if (!sender) { if (!sender) {
if (channel) 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 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; euro = NULL;
} }
@@ -688,19 +688,19 @@ void call_down_answer(int __attribute__((unused)) callref)
{ {
euro_call_t *call; 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) { for (call = ooo_call_list; call; call = call->next) {
if (call->callref == callref) if (call->callref == callref)
break; break;
} }
if (!call) { 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); call_up_release(callref, CAUSE_INVALCALLREF);
return; return;
} }
timer_start(&call->timer, BEEP_TIME); osmo_timer_schedule(&call->timer, BEEP_TIME);
} }
static void _release(int callref, int __attribute__((unused)) cause) 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_t *euro;
euro_call_t *call; 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) { for (sender = sender_head; sender; sender = sender->next) {
euro = (euro_t *) sender; euro = (euro_t *) sender;
@@ -727,7 +727,7 @@ static void _release(int callref, int __attribute__((unused)) cause)
} }
} }
if (!call) { 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); call_up_release(callref, CAUSE_INVALCALLREF);
return; return;
} }
+2 -2
View File
@@ -1,6 +1,6 @@
#include "../libfm/fm.h" #include "../libfm/fm.h"
#include "../libmobile/sender.h" #include "../libmobile/sender.h"
#include "../libtimer/timer.h" #include <osmocom/core/timer.h>
/* current state of transmitter */ /* current state of transmitter */
enum euro_health_state { enum euro_health_state {
@@ -30,7 +30,7 @@ typedef struct euro_call {
int callref; /* call reference */ int callref; /* call reference */
char station_id[7]; /* current station ID */ char station_id[7]; /* current station ID */
int page_count; /* number of transmissions left */ int page_count; /* number of transmissions left */
struct timer timer; struct osmo_timer_list timer;
enum euro_call_state state; /* current state */ enum euro_call_state state; /* current state */
int announcement_count; /* used to replay annoucements */ int announcement_count; /* used to replay annoucements */
int16_t *announcement_spl; /* current sample */ int16_t *announcement_spl; /* current sample */
+2 -1
View File
@@ -23,7 +23,7 @@
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "../libmobile/call.h" #include "../libmobile/call.h"
#include "../libmobile/main_mobile.h" #include "../libmobile/main_mobile.h"
#include "../liboptions/options.h" #include "../liboptions/options.h"
@@ -247,6 +247,7 @@ fail:
euro_destroy(sender_head); euro_destroy(sender_head);
/* exits */ /* exits */
main_mobile_exit();
fm_exit(); fm_exit();
euro_exit(); euro_exit();
+3 -5
View File
@@ -12,22 +12,20 @@ bin_PROGRAMS = \
$(COMMON_LA) \ $(COMMON_LA) \
../anetz/libgermanton.a \ ../anetz/libgermanton.a \
$(top_builddir)/src/liboptions/liboptions.a \ $(top_builddir)/src/liboptions/liboptions.a \
$(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libmobile/libmobile.a \ $(top_builddir)/src/libmobile/libmobile.a \
$(top_builddir)/src/libosmocc/libosmocc.a \
$(top_builddir)/src/libdisplay/libdisplay.a \ $(top_builddir)/src/libdisplay/libdisplay.a \
$(top_builddir)/src/libgoertzel/libgoertzel.a \ $(top_builddir)/src/libgoertzel/libgoertzel.a \
$(top_builddir)/src/libjitter/libjitter.a \ $(top_builddir)/src/libjitter/libjitter.a \
$(top_builddir)/src/libtimer/libtimer.a \
$(top_builddir)/src/libselect/libselect.a \
$(top_builddir)/src/libsamplerate/libsamplerate.a \ $(top_builddir)/src/libsamplerate/libsamplerate.a \
$(top_builddir)/src/libemphasis/libemphasis.a \ $(top_builddir)/src/libemphasis/libemphasis.a \
$(top_builddir)/src/libfm/libfm.a \ $(top_builddir)/src/libfm/libfm.a \
$(top_builddir)/src/libfilter/libfilter.a \ $(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/libwave/libwave.a \ $(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \ $(top_builddir)/src/libsample/libsample.a \
$(top_builddir)/src/libg711/libg711.a \
$(top_builddir)/src/libaaimage/libaaimage.a \ $(top_builddir)/src/libaaimage/libaaimage.a \
$(top_builddir)/src/liblogging/liblogging.a \
$(LIBOSMOCORE_LIBS) \
$(LIBOSMOCC_LIBS) \
-lm -lm
if HAVE_ALSA if HAVE_ALSA
+24 -24
View File
@@ -26,7 +26,7 @@
#include <errno.h> #include <errno.h>
#include <math.h> #include <math.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "../libmobile/call.h" #include "../libmobile/call.h"
#include "fuenf.h" #include "fuenf.h"
#include "dsp.h" #include "dsp.h"
@@ -106,7 +106,7 @@ int dsp_init_sender(fuenf_t *fuenf, int samplerate, double max_deviation, double
sample_t *spl; sample_t *spl;
int len; 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 */ /* set modulation parameters */
sender_set_fm(&fuenf->sender, max_deviation, MAX_MODULATION, signal_deviation, MAX_DISPLAY); 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); len = (int)(8000.0 * (1.0 / RX_TOL_TONE_FREQ) + 0.5);
spl = calloc(1, len * sizeof(*spl)); spl = calloc(1, len * sizeof(*spl));
if (!spl) { if (!spl) {
PDEBUG(DDSP, DEBUG_ERROR, "No memory!\n"); LOGP(DDSP, LOGL_ERROR, "No memory!\n");
goto error; goto error;
} }
fuenf->rx_tone_filter_spl = spl; fuenf->rx_tone_filter_spl = spl;
@@ -154,7 +154,7 @@ error:
/* Cleanup transceiver instance. */ /* Cleanup transceiver instance. */
void dsp_cleanup_sender(fuenf_t *fuenf) 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 */ /* free tone buffers */
if (fuenf->rx_tone_filter_spl) if (fuenf->rx_tone_filter_spl)
@@ -228,7 +228,7 @@ static void digit_decode(fuenf_t *fuenf, sample_t *samples, int length)
break; break;
/* check if we have enought silence */ /* check if we have enought silence */
if (fuenf->rx_digit_count == RX_MIN_PREAMBLE) { 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; fuenf->rx_state = RX_STATE_IDLE;
break; break;
} }
@@ -237,7 +237,7 @@ static void digit_decode(fuenf_t *fuenf, sample_t *samples, int length)
/* wait for digit */ /* wait for digit */
if (d < 0) if (d < 0)
break; 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_count = 0;
fuenf->rx_callsign[fuenf->rx_callsign_count] = d; fuenf->rx_callsign[fuenf->rx_callsign_count] = d;
fuenf->rx_state = RX_STATE_DIGIT; fuenf->rx_state = RX_STATE_DIGIT;
@@ -247,18 +247,18 @@ static void digit_decode(fuenf_t *fuenf, sample_t *samples, int length)
if (!change) { if (!change) {
if (fuenf->rx_digit_count == RX_LEN_DIGIT_TH) { if (fuenf->rx_digit_count == RX_LEN_DIGIT_TH) {
if (d < 0) { 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 = 0;
fuenf->rx_function_count = 0; fuenf->rx_function_count = 0;
fuenf->rx_state = RX_STATE_RESET; fuenf->rx_state = RX_STATE_RESET;
break; 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); display_measurements_update(fuenf->dmp_digit_level, sqrt(a) * 100.0, 0.0);
break; break;
} }
if (fuenf->rx_digit_count == RX_LEN_DIGIT_MAX) { 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; fuenf->rx_state = RX_STATE_RESET;
break; break;
} }
@@ -272,7 +272,7 @@ static void digit_decode(fuenf_t *fuenf, sample_t *samples, int length)
} }
/* if counter (when changed) was too low */ /* if counter (when changed) was too low */
if (change_count < RX_LEN_DIGIT_MIN) { 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; fuenf->rx_state = RX_STATE_RESET;
break; break;
} }
@@ -284,7 +284,7 @@ static void digit_decode(fuenf_t *fuenf, sample_t *samples, int length)
for (i = 0; i < 5; i++) { for (i = 0; i < 5; i++) {
if (fuenf->rx_callsign[i] == REPEAT_DIGIT) { if (fuenf->rx_callsign[i] == REPEAT_DIGIT) {
if (i == 0) { 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; fuenf->rx_state = RX_STATE_RESET;
break; break;
} }
@@ -298,7 +298,7 @@ static void digit_decode(fuenf_t *fuenf, sample_t *samples, int length)
fuenf->rx_callsign[i] = '\0'; fuenf->rx_callsign[i] = '\0';
if (i < 5) if (i < 5)
break; 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_callsign(fuenf, fuenf->rx_callsign);
fuenf->rx_function_count = 0; /* must reset, so we can detect timeout */ fuenf->rx_function_count = 0; /* must reset, so we can detect timeout */
fuenf->rx_state = RX_STATE_WAIT_SIGNAL; fuenf->rx_state = RX_STATE_WAIT_SIGNAL;
@@ -362,7 +362,7 @@ static void tone_decode(fuenf_t *fuenf, sample_t *samples, int length)
/* wait for signal */ /* wait for signal */
if (!funktion) { if (!funktion) {
if (fuenf->rx_function_count >= RX_WAIT_TONE_MAX) { 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; fuenf->rx_state = RX_STATE_RESET;
break; break;
} }
@@ -376,13 +376,13 @@ static void tone_decode(fuenf_t *fuenf, sample_t *samples, int length)
case RX_STATE_SIGNAL: case RX_STATE_SIGNAL:
/* if signal ceases too early */ /* if signal ceases too early */
if (funktion != fuenf->rx_function) { 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; fuenf->rx_state = RX_STATE_RESET;
break; break;
} }
if (fuenf->rx_function_count >= RX_LEN_TONE_MIN) { 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); 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);
PDEBUG_CHAN(DDSP, DEBUG_DEBUG, "Signal tones detected, done, waiting for next transmission.\n"); LOGP_CHAN(DDSP, LOGL_DEBUG, "Signal tones detected, done, waiting for next transmission.\n");
fuenf_rx_function(fuenf, fuenf->rx_function); fuenf_rx_function(fuenf, fuenf->rx_function);
fuenf->rx_state = RX_STATE_RESET; fuenf->rx_state = RX_STATE_RESET;
break; break;
@@ -435,11 +435,11 @@ int dsp_setup(fuenf_t *fuenf, const char *rufzeichen, enum fuenf_funktion funkti
fuenf->tx_seq_length = 0; fuenf->tx_seq_length = 0;
if (strlen(rufzeichen) != 5) { 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; 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 */ /* add preamble */
seq[index].phasestep1 = 0; seq[index].phasestep1 = 0;
@@ -451,7 +451,7 @@ int dsp_setup(fuenf_t *fuenf, const char *rufzeichen, enum fuenf_funktion funkti
tone_index = index; tone_index = index;
for (i = 0; rufzeichen[i]; i++) { for (i = 0; rufzeichen[i]; i++) {
if (rufzeichen[i] < '0' || rufzeichen[i] > '9') { 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; return -EINVAL;
} }
if (rufzeichen[i] == '0') if (rufzeichen[i] == '0')
@@ -461,9 +461,9 @@ int dsp_setup(fuenf_t *fuenf, const char *rufzeichen, enum fuenf_funktion funkti
/* use repeat digit, if two subsequent digits are the same */ /* use repeat digit, if two subsequent digits are the same */
if (i > 0 && seq[index - 1].phasestep1 == seq[index].phasestep1) { if (i > 0 && seq[index - 1].phasestep1 == seq[index].phasestep1) {
seq[index].phasestep1 = 2.0 * M_PI * digit_freq[REPEAT_DIGIT] * fuenf->sample_duration; 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 } 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].phasestep2 = 0;
seq[index].duration = TX_LEN_DIGIT; seq[index].duration = TX_LEN_DIGIT;
index++; index++;
@@ -493,7 +493,7 @@ int dsp_setup(fuenf_t *fuenf, const char *rufzeichen, enum fuenf_funktion funkti
#ifndef DEBUG #ifndef DEBUG
if (funktion == FUENF_FUNKTION_RUF) { 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++) { for (i = 0; i < TX_NUM_KANAL; i++) {
/* add tone (double volume) */ /* add tone (double volume) */
seq[index].phasestep1 = 2.0 * M_PI * digit_freq[REPEAT_DIGIT] * fuenf->sample_duration; seq[index].phasestep1 = 2.0 * M_PI * digit_freq[REPEAT_DIGIT] * fuenf->sample_duration;
@@ -522,7 +522,7 @@ int dsp_setup(fuenf_t *fuenf, const char *rufzeichen, enum fuenf_funktion funkti
if (signals[i].funktion == funktion) if (signals[i].funktion == funktion)
break; 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].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].phasestep2 = 2.0 * M_PI * tone_freq[signals[i].tone2] * fuenf->sample_duration;
seq[index].duration = TX_LEN_SIGNAL; seq[index].duration = TX_LEN_SIGNAL;
@@ -532,7 +532,7 @@ int dsp_setup(fuenf_t *fuenf, const char *rufzeichen, enum fuenf_funktion funkti
/* check array overflow, if it did not already crashed before */ /* check array overflow, if it did not already crashed before */
if (index > (int)(sizeof(fuenf->tx_seq) / sizeof(fuenf->tx_seq[0]))) { 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(); abort();
} }
+21 -21
View File
@@ -26,10 +26,10 @@
#include <errno.h> #include <errno.h>
#include <math.h> #include <math.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "../libmobile/call.h" #include "../libmobile/call.h"
#include "../libmobile/cause.h" #include "../libmobile/cause.h"
#include "../libosmocc/message.h" #include <osmocom/cc/message.h>
#include "../liboptions/options.h" #include "../liboptions/options.h"
#include "fuenf.h" #include "fuenf.h"
#include "dsp.h" #include "dsp.h"
@@ -149,7 +149,7 @@ void fuenf_new_state(fuenf_t *fuenf, enum fuenf_state new_state)
{ {
if (fuenf->state == new_state) if (fuenf->state == new_state)
return; 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->state = new_state;
fuenf_display_status(); fuenf_display_status();
} }
@@ -160,13 +160,13 @@ static int fuenf_scan_or_loopback(fuenf_t *fuenf)
if (fuenf->scan_from < fuenf->scan_to) { if (fuenf->scan_from < fuenf->scan_to) {
sprintf(rufzeichen, "%05d", fuenf->scan_from++); 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); dsp_setup(fuenf, rufzeichen, fuenf->default_funktion);
return 1; return 1;
} }
if (fuenf->sender.loopback) { 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); dsp_setup(fuenf, "10357", FUENF_FUNKTION_FEUER);
return 1; return 1;
} }
@@ -182,23 +182,23 @@ int fuenf_create(const char *kanal, double frequency, const char *device, int us
fuenf = calloc(1, sizeof(*fuenf)); fuenf = calloc(1, sizeof(*fuenf));
if (!fuenf) { if (!fuenf) {
PDEBUG(DFUENF, DEBUG_ERROR, "No memory!\n"); LOGP(DFUENF, LOGL_ERROR, "No memory!\n");
return -ENOMEM; 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 */ /* 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); 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) { 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; goto error;
} }
/* init audio processing */ /* init audio processing */
rc = dsp_init_sender(fuenf, samplerate, max_deviation, signal_deviation); rc = dsp_init_sender(fuenf, samplerate, max_deviation, signal_deviation);
if (rc < 0) { 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; goto error;
} }
@@ -210,7 +210,7 @@ int fuenf_create(const char *kanal, double frequency, const char *device, int us
fuenf_display_status(); 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 */ /* start scanning, if enabled, otherwise send loopback sequence, if enabled */
fuenf_scan_or_loopback(fuenf); fuenf_scan_or_loopback(fuenf);
@@ -228,7 +228,7 @@ void fuenf_destroy(sender_t *sender)
{ {
fuenf_t *fuenf = (fuenf_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); dsp_cleanup_sender(fuenf);
sender_destroy(&fuenf->sender); sender_destroy(&fuenf->sender);
@@ -238,7 +238,7 @@ void fuenf_destroy(sender_t *sender)
/* call sign was transmitted */ /* call sign was transmitted */
void fuenf_tx_done(fuenf_t *fuenf) 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 */ /* start scanning, if enabled, otherwise send loopback sequence, if enabled */
if (fuenf_scan_or_loopback(fuenf)) { if (fuenf_scan_or_loopback(fuenf)) {
@@ -247,7 +247,7 @@ void fuenf_tx_done(fuenf_t *fuenf)
/* go talker state */ /* go talker state */
if (fuenf->callref && fuenf->tx_funktion == FUENF_FUNKTION_RUF) { 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); fuenf_new_state(fuenf, FUENF_STATE_DURCHSAGE);
return; return;
} }
@@ -255,19 +255,19 @@ void fuenf_tx_done(fuenf_t *fuenf)
/* go idle */ /* go idle */
fuenf_new_state(fuenf, FUENF_STATE_IDLE); fuenf_new_state(fuenf, FUENF_STATE_IDLE);
if (fuenf->callref) { 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); call_up_release(fuenf->callref, CAUSE_NORMAL);
} }
} }
void fuenf_rx_callsign(fuenf_t *fuenf, const char *callsign) 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) void fuenf_rx_function(fuenf_t *fuenf, enum fuenf_funktion funktion)
{ {
PDEBUG_CHAN(DFUENF, DEBUG_INFO, "Received function '%s'.\n", fuenf_funktion_name[funktion]); LOGP_CHAN(DFUENF, LOGL_INFO, "Received function '%s'.\n", fuenf_funktion_name[funktion]);
} }
void call_down_clock(void) void call_down_clock(void)
@@ -298,9 +298,9 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
} }
if (!sender) { if (!sender) {
if (channel) 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 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; return -CAUSE_NOCHANNEL;
} }
@@ -335,7 +335,7 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
return -CAUSE_INVALNUMBER; 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); dsp_setup(fuenf, rufzeichen, funktion);
@@ -357,7 +357,7 @@ static void _release(int __attribute__((unused)) callref, int __attribute__((unu
sender_t *sender; sender_t *sender;
fuenf_t *fuenf; 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) { for (sender = sender_head; sender; sender = sender->next) {
fuenf = (fuenf_t *) sender; fuenf = (fuenf_t *) sender;
@@ -365,7 +365,7 @@ static void _release(int __attribute__((unused)) callref, int __attribute__((unu
break; break;
} }
if (!sender) { 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 */ /* don't send release, because caller already released */
return; return;
} }
+2 -1
View File
@@ -27,7 +27,7 @@
#include <sys/stat.h> #include <sys/stat.h>
#include <fcntl.h> #include <fcntl.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "../libmobile/call.h" #include "../libmobile/call.h"
#include "../libmobile/main_mobile.h" #include "../libmobile/main_mobile.h"
#include "../liboptions/options.h" #include "../liboptions/options.h"
@@ -259,6 +259,7 @@ fail:
fuenf_destroy(sender_head); fuenf_destroy(sender_head);
/* exits */ /* exits */
main_mobile_exit();
fm_exit(); fm_exit();
fuenf_exit(); fuenf_exit();
+6 -10
View File
@@ -15,14 +15,10 @@ fuvst_LDADD = \
../anetz/libgermanton.a \ ../anetz/libgermanton.a \
../cnetz/libcnetztones.a \ ../cnetz/libcnetztones.a \
$(top_builddir)/src/liboptions/liboptions.a \ $(top_builddir)/src/liboptions/liboptions.a \
$(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libmobile/libmobile.a \ $(top_builddir)/src/libmobile/libmobile.a \
$(top_builddir)/src/libosmocc/libosmocc.a \
$(top_builddir)/src/libdisplay/libdisplay.a \ $(top_builddir)/src/libdisplay/libdisplay.a \
$(top_builddir)/src/libcompandor/libcompandor.a \ $(top_builddir)/src/libcompandor/libcompandor.a \
$(top_builddir)/src/libjitter/libjitter.a \ $(top_builddir)/src/libjitter/libjitter.a \
$(top_builddir)/src/libtimer/libtimer.a \
$(top_builddir)/src/libselect/libselect.a \
$(top_builddir)/src/libsamplerate/libsamplerate.a \ $(top_builddir)/src/libsamplerate/libsamplerate.a \
$(top_builddir)/src/libemphasis/libemphasis.a \ $(top_builddir)/src/libemphasis/libemphasis.a \
$(top_builddir)/src/libfm/libfm.a \ $(top_builddir)/src/libfm/libfm.a \
@@ -32,8 +28,10 @@ fuvst_LDADD = \
$(top_builddir)/src/libwave/libwave.a \ $(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \ $(top_builddir)/src/libsample/libsample.a \
$(top_builddir)/src/libsound/libsound.a \ $(top_builddir)/src/libsound/libsound.a \
$(top_builddir)/src/libg711/libg711.a \
$(top_builddir)/src/libaaimage/libaaimage.a \ $(top_builddir)/src/libaaimage/libaaimage.a \
$(top_builddir)/src/liblogging/liblogging.a \
$(LIBOSMOCORE_LIBS) \
$(LIBOSMOCC_LIBS) \
$(ALSA_LIBS) \ $(ALSA_LIBS) \
-lm -lm
@@ -42,14 +40,10 @@ fuvst_sniffer_SOURCES = \
fuvst_sniffer_LDADD = \ fuvst_sniffer_LDADD = \
$(COMMON_LA) \ $(COMMON_LA) \
$(top_builddir)/src/liboptions/liboptions.a \ $(top_builddir)/src/liboptions/liboptions.a \
$(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libmobile/libmobile.a \ $(top_builddir)/src/libmobile/libmobile.a \
$(top_builddir)/src/libosmocc/libosmocc.a \
$(top_builddir)/src/libdisplay/libdisplay.a \ $(top_builddir)/src/libdisplay/libdisplay.a \
$(top_builddir)/src/libcompandor/libcompandor.a \ $(top_builddir)/src/libcompandor/libcompandor.a \
$(top_builddir)/src/libjitter/libjitter.a \ $(top_builddir)/src/libjitter/libjitter.a \
$(top_builddir)/src/libtimer/libtimer.a \
$(top_builddir)/src/libselect/libselect.a \
$(top_builddir)/src/libsamplerate/libsamplerate.a \ $(top_builddir)/src/libsamplerate/libsamplerate.a \
$(top_builddir)/src/libemphasis/libemphasis.a \ $(top_builddir)/src/libemphasis/libemphasis.a \
$(top_builddir)/src/libfm/libfm.a \ $(top_builddir)/src/libfm/libfm.a \
@@ -59,8 +53,10 @@ fuvst_sniffer_LDADD = \
$(top_builddir)/src/libwave/libwave.a \ $(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \ $(top_builddir)/src/libsample/libsample.a \
$(top_builddir)/src/libsound/libsound.a \ $(top_builddir)/src/libsound/libsound.a \
$(top_builddir)/src/libg711/libg711.a \
$(top_builddir)/src/libaaimage/libaaimage.a \ $(top_builddir)/src/libaaimage/libaaimage.a \
$(top_builddir)/src/liblogging/liblogging.a \
$(LIBOSMOCORE_LIBS) \
$(LIBOSMOCC_LIBS) \
$(ALSA_LIBS) \ $(ALSA_LIBS) \
-lm -lm
+78 -76
View File
@@ -35,12 +35,14 @@
#include <time.h> #include <time.h>
#include <inttypes.h> #include <inttypes.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "../liboptions/options.h" #include "../liboptions/options.h"
#include "../libmobile/call.h" #include "../libmobile/call.h"
#include "../libmobile/cause.h" #include "../libmobile/cause.h"
#include "../libtimer/timer.h" #include "../libmobile/get_time.h"
#include "../libosmocc/message.h" #include <osmocom/core/timer.h>
#include <osmocom/core/utils.h>
#include <osmocom/cc/message.h>
#include "fuvst.h" #include "fuvst.h"
/* digital loopback test */ /* digital loopback test */
@@ -120,21 +122,21 @@ int config_file(const char *filename)
uint8_t byte; uint8_t byte;
if (!fp) { 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; return -EIO;
} }
rc = fread(conf.data, 1, sizeof(conf.data), fp); rc = fread(conf.data, 1, sizeof(conf.data), fp);
if (rc < (int)sizeof(conf.data)) { if (rc < (int)sizeof(conf.data)) {
fclose(fp); 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; return -EIO;
} }
rc = fread(&byte, 1, 1, fp); rc = fread(&byte, 1, 1, fp);
if (rc == 1) { if (rc == 1) {
fclose(fp); 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; return -EIO;
} }
@@ -156,10 +158,10 @@ static void config_send(uint8_t ident, uint8_t job, uint16_t offset, uint16_t le
uint32_t checksum = 0; uint32_t checksum = 0;
uint8_t rc = 1; /* Auftrag angenommen */ 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) { 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: error:
/* return error */ /* return error */
len = encode_xedbu_1(&opcode, &data, 16, job, 0); len = encode_xedbu_1(&opcode, &data, 16, job, 0);
@@ -168,7 +170,7 @@ error:
} }
if (offset + length > sizeof(conf.data)) { 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; goto error;
} }
@@ -262,7 +264,7 @@ void add_emergency(const char *number)
emerg = calloc(1, sizeof(*emerg)); emerg = calloc(1, sizeof(*emerg));
if (!emerg) { if (!emerg) {
PDEBUG(DTRANS, DEBUG_ERROR, "No memory!\n"); LOGP(DTRANS, LOGL_ERROR, "No memory!\n");
return; return;
} }
@@ -288,7 +290,7 @@ static int check_emerg(const char *number)
if (!emerg) if (!emerg)
return 0; 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; return 1;
} }
@@ -337,12 +339,12 @@ static void remove_db(uint8_t futln_nat, uint8_t futln_fuvst, uint16_t futln_res
while (*dbp && *dbp != db) while (*dbp && *dbp != db)
dbp = &((*dbp)->next); dbp = &((*dbp)->next);
if (!(*dbp)) { 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(); abort();
} }
*dbp = db->next; *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 */ /* remove */
free(db); free(db);
@@ -353,7 +355,7 @@ static void flush_db(void)
cnetz_db_t *db; cnetz_db_t *db;
while ((db = cnetz_db_head)) { 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; cnetz_db_head = db->next;
free(db); free(db);
} }
@@ -370,7 +372,7 @@ static void add_db(uint8_t futln_nat, uint8_t futln_fuvst, uint16_t futln_rest,
/* add */ /* add */
db = calloc(1, sizeof(*db)); db = calloc(1, sizeof(*db));
if (!db) { if (!db) {
PDEBUG(DDB, DEBUG_ERROR, "No memory!\n"); LOGP(DDB, LOGL_ERROR, "No memory!\n");
return; return;
} }
db->futln_nat = futln_nat; db->futln_nat = futln_nat;
@@ -378,7 +380,7 @@ static void add_db(uint8_t futln_nat, uint8_t futln_fuvst, uint16_t futln_rest,
db->futln_rest = futln_rest; db->futln_rest = futln_rest;
db->chip = chip; db->chip = chip;
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.\n", db->futln_nat, db->futln_fuvst, db->futln_rest);
/* attach to end of list */ /* attach to end of list */
dbp = &cnetz_db_head; dbp = &cnetz_db_head;
@@ -392,7 +394,7 @@ static void add_db(uint8_t futln_nat, uint8_t futln_fuvst, uint16_t futln_rest,
*/ */
/* Release timeout */ /* Release timeout */
#define RELEASE_TO 3.0 #define RELEASE_TO 3,0
/* BSC originated Ident-Numbers */ /* BSC originated Ident-Numbers */
#define IDENT_BSC_FROM 0x9f #define IDENT_BSC_FROM 0x9f
@@ -425,7 +427,7 @@ typedef struct transaction {
fuvst_t *spk; /* assigned SPK */ fuvst_t *spk; /* assigned SPK */
char number[17]; /* dialed by mobile */ char number[17]; /* dialed by mobile */
int sonderruf; /* an emergency call */ int sonderruf; /* an emergency call */
struct timer timer; /* release timer */ struct osmo_timer_list timer; /* release timer */
} transaction_t; } transaction_t;
transaction_t *trans_list = NULL; transaction_t *trans_list = NULL;
@@ -500,7 +502,7 @@ static void new_call_state(transaction_t *trans, enum call_state new_state)
{ {
if (trans->state == new_state) if (trans->state == new_state)
return; 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; trans->state = new_state;
display_status(); display_status();
} }
@@ -514,7 +516,7 @@ transaction_t *search_transaction_number(uint8_t futln_nat, uint8_t futln_fuvst,
&& trans->futln_fuvst == futln_fuvst && trans->futln_fuvst == futln_fuvst
&& trans->futln_rest == futln_rest) { && trans->futln_rest == futln_rest) {
const char *rufnummer = transaction2rufnummer(trans); 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; return trans;
} }
trans = trans->next; trans = trans->next;
@@ -530,7 +532,7 @@ transaction_t *search_transaction_ident(uint8_t ident)
while (trans) { while (trans) {
if (trans->ident == ident) { if (trans->ident == ident) {
const char *rufnummer = transaction2rufnummer(trans); 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; return trans;
} }
trans = trans->next; trans = trans->next;
@@ -549,7 +551,7 @@ transaction_t *search_transaction_callref(int callref)
while (trans) { while (trans) {
if (trans->callref == callref) { if (trans->callref == callref) {
const char *rufnummer = transaction2rufnummer(trans); 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; return trans;
} }
trans = trans->next; trans = trans->next;
@@ -564,9 +566,9 @@ static void destroy_transaction(transaction_t *trans)
transaction_t **transp; transaction_t **transp;
const char *rufnummer = transaction2rufnummer(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);
/* check for old callref (before removal) then detach SPK /* check for old callref (before removal) then detach SPK
* if SPK has been reused by BS, our old callref will not match, * if SPK has been reused by BS, our old callref will not match,
@@ -580,7 +582,7 @@ static void destroy_transaction(transaction_t *trans)
while (*transp && *transp != trans) while (*transp && *transp != trans)
transp = &((*transp)->next); transp = &((*transp)->next);
if (!(*transp)) { 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(); abort();
} }
*transp = trans->next; *transp = trans->next;
@@ -595,7 +597,7 @@ void trans_timeout(void *data)
{ {
transaction_t *trans = data; 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) if (trans->callref)
call_up_release(trans->callref, CAUSE_NORMAL); call_up_release(trans->callref, CAUSE_NORMAL);
trans->callref = 0; trans->callref = 0;
@@ -611,7 +613,7 @@ static transaction_t *create_transaction(uint8_t ident, uint8_t futln_nat, uint8
trans = search_transaction_number(futln_nat, futln_fuvst, futln_rest); trans = search_transaction_number(futln_nat, futln_fuvst, futln_rest);
if (trans && mo) { if (trans && mo) {
const char *rufnummer = transaction2rufnummer(trans); 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) if (trans->callref)
call_up_release(trans->callref, CAUSE_NORMAL); call_up_release(trans->callref, CAUSE_NORMAL);
trans->callref = 0; trans->callref = 0;
@@ -620,13 +622,13 @@ static transaction_t *create_transaction(uint8_t ident, uint8_t futln_nat, uint8
} }
if (trans) { if (trans) {
const char *rufnummer = transaction2rufnummer(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; return NULL;
} }
trans = calloc(1, sizeof(*trans)); trans = calloc(1, sizeof(*trans));
if (!trans) { if (!trans) {
PDEBUG(DTRANS, DEBUG_ERROR, "No memory!\n"); LOGP(DTRANS, LOGL_ERROR, "No memory!\n");
return NULL; return NULL;
} }
@@ -636,10 +638,10 @@ static transaction_t *create_transaction(uint8_t ident, uint8_t futln_nat, uint8
trans->futln_fuvst = futln_fuvst; trans->futln_fuvst = futln_fuvst;
trans->futln_rest = futln_rest; 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); 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 */ /* attach to end of list, so first transaction is served first */
transp = &trans_list; transp = &trans_list;
@@ -763,14 +765,14 @@ static int message_send(uint8_t ident, uint8_t opcode, uint8_t *data, int len)
if (!zzk) if (!zzk)
zzk = get_zzk(0); zzk = get_zzk(0);
if (!zzk) { if (!zzk) {
PDEBUG(DCNETZ, DEBUG_ERROR, "No ZZK or link down!\n"); LOGP(DCNETZ, LOGL_ERROR, "No ZZK or link down!\n");
return -EIO; return -EIO;
} }
uint8_t buffer[len + 2]; uint8_t buffer[len + 2];
if (debuglevel == DEBUG_DEBUG || opcode != OPCODE_XEDBU) if (loglevel == LOGL_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)); 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 */ /* assemble Ident, swap Opcode and add data */
slc = ident & 0xf; slc = ident & 0xf;
@@ -808,25 +810,25 @@ static void release_for_emergency(void)
/* found idle channel */ /* found idle channel */
if (sender) { 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; return;
} }
/* found no normal call (no emergency) */ /* found no normal call (no emergency) */
if (!last_trans) { 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; return;
} }
/* releasing the last call in list */ /* 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)); len = encode_aau(&opcode, &data, trans->spk_nr, 0, cnetz_cause2futln(CAUSE_NORMAL));
message_send(trans->ident, opcode, data, len); message_send(trans->ident, opcode, data, len);
call_up_release(trans->callref, CAUSE_NORMAL); call_up_release(trans->callref, CAUSE_NORMAL);
trans->callref = 0; trans->callref = 0;
new_call_state(trans, STATE_RELEASE); 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 */ /* MTP data message from lower layer */
@@ -851,8 +853,8 @@ static void message_receive(fuvst_t *zzk, uint8_t ident, uint8_t opcode, uint8_t
int i, num; int i, num;
char number[17]; char number[17];
if (debuglevel == DEBUG_DEBUG || opcode != OPCODE_YLSMF) if (loglevel == LOGL_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)); 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) { switch (opcode) {
case OPCODE_SWAF: /* BS restarts */ case OPCODE_SWAF: /* BS restarts */
@@ -866,7 +868,7 @@ static void message_receive(fuvst_t *zzk, uint8_t ident, uint8_t opcode, uint8_t
message_send(5, opcode, NULL, 0); message_send(5, opcode, NULL, 0);
#endif #endif
if (warmstart) { 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; warmstart = 0;
len = encode_yaaau(&opcode, &data, 42); len = encode_yaaau(&opcode, &data, 42);
message_send(0, opcode, data, len); message_send(0, opcode, data, len);
@@ -932,11 +934,11 @@ static void message_receive(fuvst_t *zzk, uint8_t ident, uint8_t opcode, uint8_t
break; break;
case OPCODE_GVAF: /* MO call */ case OPCODE_GVAF: /* MO call */
decode_gvaf(data, len, &T, &U, &N, number); 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; goto outgoing;
case OPCODE_GVWAF: /* MO call (queue) */ case OPCODE_GVWAF: /* MO call (queue) */
decode_gvaf(data, len, &T, &U, &N, number); 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: outgoing:
trans = create_transaction(ident, N, U, T, 1); trans = create_transaction(ident, N, U, T, 1);
if (!trans) { if (!trans) {
@@ -958,7 +960,7 @@ outgoing:
trans = search_transaction_ident(ident); trans = search_transaction_ident(ident);
if (!trans) if (!trans)
break; 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); new_call_state(trans, STATE_MT_QUEUE);
if (trans->callref) if (trans->callref)
call_up_alerting(trans->callref); call_up_alerting(trans->callref);
@@ -968,7 +970,7 @@ outgoing:
trans = search_transaction_ident(ident); trans = search_transaction_ident(ident);
if (!trans) if (!trans)
break; 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); new_call_state(trans, STATE_MT_CONNECT);
if (trans->callref) if (trans->callref)
call_up_answer(trans->callref, transaction2rufnummer(trans)); call_up_answer(trans->callref, transaction2rufnummer(trans));
@@ -986,7 +988,7 @@ outgoing:
trans->spk_nr = Q; trans->spk_nr = Q;
/* SPK not exist, release */ /* SPK not exist, release */
if (!trans->spk) { 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); len = encode_stnqu(&opcode, &data, Q);
message_send(ident, opcode, data, len); message_send(ident, opcode, data, len);
if (trans->callref) if (trans->callref)
@@ -1002,22 +1004,22 @@ outgoing:
message_send(ident, opcode, data, len); message_send(ident, opcode, data, len);
/* no callref == outgoing call */ /* no callref == outgoing call */
if (!trans->callref) { 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, ""); trans->callref = trans->old_callref = call_up_setup(transaction2rufnummer(trans), trans->number, OSMO_CC_NETWORK_CNETZ_NONE, "");
} else { } 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); new_call_state(trans, STATE_MT_ALERTING);
call_up_alerting(trans->callref); call_up_alerting(trans->callref);
} }
trans->spk->callref = 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; break;
case OPCODE_APF: /* auth response */ case OPCODE_APF: /* auth response */
decode_apf(data, len, &Q, &a); decode_apf(data, len, &Q, &a);
break; break;
case OPCODE_FAF: /* MCID request */ case OPCODE_FAF: /* MCID request */
decode_faf(data, len); 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; break;
case OPCODE_NAF: /* incoming release (before SPK assignment) */ case OPCODE_NAF: /* incoming release (before SPK assignment) */
decode_naf(data, len, &X); decode_naf(data, len, &X);
@@ -1027,7 +1029,7 @@ outgoing:
trans = search_transaction_ident(ident); trans = search_transaction_ident(ident);
if (!trans) if (!trans)
break; 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); new_call_state(trans, STATE_RELEASE);
if (trans->callref) if (trans->callref)
call_up_release(trans->callref, cnetz_fufst2cause(X)); call_up_release(trans->callref, cnetz_fufst2cause(X));
@@ -1057,7 +1059,7 @@ outgoing:
message_send(ident, opcode, data, len); message_send(ident, opcode, data, len);
if (trans->callref) if (trans->callref)
call_up_release(trans->callref, cnetz_fufst2cause(X)); 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); new_call_state(trans, STATE_RELEASE);
trans->callref = 0; trans->callref = 0;
destroy_transaction(trans); destroy_transaction(trans);
@@ -1087,7 +1089,7 @@ outgoing:
message_send(ident, opcode, data, len); message_send(ident, opcode, data, len);
break; break;
default: 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 +1125,25 @@ static void mtp_receive(void *inst, enum mtp_prim prim, uint8_t slc, uint8_t *da
default: default:
cause_text = "MTP link '%s' failed! Trying again.\n"; 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); mtp_send(&zzk->mtp, MTP_PRIM_START, 0, NULL, 0);
zzk->link = 0; zzk->link = 0;
display_status(); display_status();
break; break;
case MTP_PRIM_IN_SERVICE: 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; zzk->link = 1;
display_status(); display_status();
break; break;
case MTP_PRIM_REMOTE_PROCESSOR_OUTAGE: 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; break;
case MTP_PRIM_REMOTE_PROCESSOR_RECOVERED: 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; break;
case MTP_PRIM_DATA: case MTP_PRIM_DATA:
if (len < 2) { if (len < 2) {
PDEBUG(DCNETZ, DEBUG_NOTICE, "No Opcode, message too short!\n"); LOGP(DCNETZ, LOGL_NOTICE, "No Opcode, message too short!\n");
return; return;
} }
@@ -1172,17 +1174,17 @@ int fuvst_create(const char *kanal, enum fuvst_chan_type chan_type, const char *
fuvst = calloc(1, sizeof(fuvst_t)); fuvst = calloc(1, sizeof(fuvst_t));
if (!fuvst) { if (!fuvst) {
PDEBUG(DCNETZ, DEBUG_ERROR, "No memory!\n"); LOGP(DCNETZ, LOGL_ERROR, "No memory!\n");
return -ENOMEM; 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 */ /* init general part of transceiver */
/* do not enable emphasis, since it is done by fuvst code, not by common sender code */ /* 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); 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) { 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; goto error;
} }
fuvst->chan_num = atoi(kanal); fuvst->chan_num = atoi(kanal);
@@ -1208,7 +1210,7 @@ int fuvst_create(const char *kanal, enum fuvst_chan_type chan_type, const char *
goto error; goto error;
} }
PDEBUG(DCNETZ, DEBUG_NOTICE, "Created 'Kanal' %s\n", chan_name); LOGP(DCNETZ, LOGL_NOTICE, "Created 'Kanal' %s\n", chan_name);
display_status(); display_status();
@@ -1225,7 +1227,7 @@ void fuvst_destroy(sender_t *sender)
{ {
fuvst_t *fuvst = (fuvst_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) { if (fuvst->chan_type == CHAN_TYPE_ZZK) {
mtp_exit(&fuvst->mtp); mtp_exit(&fuvst->mtp);
@@ -1325,19 +1327,19 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
/* 2. base station ready? */ /* 2. base station ready? */
if (!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; return -CAUSE_TEMPFAIL;
} }
/* 3. create transaction */ /* 3. create transaction */
ident = get_free_ident(); ident = get_free_ident();
if (!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; return -CAUSE_TEMPFAIL;
} }
trans = create_transaction(ident, futln_nat, futln_fuvst, futln_rest, 0); trans = create_transaction(ident, futln_nat, futln_fuvst, futln_rest, 0);
if (!trans) { 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; return -CAUSE_BUSY;
} }
trans->callref = trans->old_callref = callref; trans->callref = trans->old_callref = callref;
@@ -1345,7 +1347,7 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
/* 4. start call */ /* 4. start call */
len = encode_kvau(&opcode, &data, futln_rest, futln_fuvst, futln_nat, 0, authentication); len = encode_kvau(&opcode, &data, futln_rest, futln_fuvst, futln_nat, 0, authentication);
message_send(trans->ident, opcode, data, len); 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); new_call_state(trans, STATE_MT);
return 0; return 0;
@@ -1359,7 +1361,7 @@ void call_down_answer(int callref)
trans = search_transaction_callref(callref); trans = search_transaction_callref(callref);
if (!trans) { if (!trans) {
PDEBUG(DCNETZ, DEBUG_NOTICE, "Answer to unknown callref.\n"); LOGP(DCNETZ, LOGL_NOTICE, "Answer to unknown callref.\n");
return; return;
} }
@@ -1387,7 +1389,7 @@ static void _disconnect_release(transaction_t *trans, int callref, int cause)
call_up_release(callref, cause); call_up_release(callref, cause);
trans->callref = 0; trans->callref = 0;
new_call_state(trans, STATE_RELEASE); 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). /* Call control sends disconnect (with tones).
@@ -1398,11 +1400,11 @@ void call_down_disconnect(int callref, int cause)
{ {
transaction_t *trans; 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); trans = search_transaction_callref(callref);
if (!trans) { 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); call_up_release(callref, CAUSE_INVALCALLREF);
return; return;
} }
@@ -1422,11 +1424,11 @@ void call_down_release(int callref, int cause)
{ {
transaction_t *trans; 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); trans = search_transaction_callref(callref);
if (!trans) { 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); call_up_release(callref, CAUSE_INVALCALLREF);
return; return;
} }
@@ -1438,14 +1440,14 @@ void dump_info(void)
{ {
cnetz_db_t *db = cnetz_db_head; 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) { if (!db) {
PDEBUG(DDB, DEBUG_NOTICE, " - No subscribers attached!\n"); LOGP(DDB, LOGL_NOTICE, " - No subscribers attached!\n");
return; return;
} }
while (db) { 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' is attached.\n", db->futln_nat, db->futln_fuvst, db->futln_rest);
db = db->next; db = db->next;
} }
} }
+3 -2
View File
@@ -23,10 +23,10 @@
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "../libmobile/call.h" #include "../libmobile/call.h"
#include "../libmobile/main_mobile.h" #include "../libmobile/main_mobile.h"
#include "../libtimer/timer.h" #include <osmocom/core/timer.h>
#include "../liboptions/options.h" #include "../liboptions/options.h"
#include "../libfm/fm.h" #include "../libfm/fm.h"
#include "../anetz/freiton.h" #include "../anetz/freiton.h"
@@ -293,6 +293,7 @@ fail:
fuvst_destroy(sender_head); fuvst_destroy(sender_head);
/* exits */ /* exits */
main_mobile_exit();
// zeit_exit(); // zeit_exit();
fm_exit(); fm_exit();
+76 -75
View File
@@ -23,7 +23,8 @@
#include <string.h> #include <string.h>
#include <time.h> #include <time.h>
#include <inttypes.h> #include <inttypes.h>
#include "../libdebug/debug.h" #include <osmocom/core/utils.h>
#include "../liblogging/logging.h"
#include "mup.h" #include "mup.h"
#include "systemmeldungen.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) 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) { if (len < 6) {
PDEBUG(DMUP, DEBUG_NOTICE, "Message too short!\n"); LOGP(DMUP, LOGL_NOTICE, "Message too short!\n");
return; 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]; *C = data[4];
*B = data[5]; *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 */ /* 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]; 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; *opcode = OPCODE_SWQU;
buffer[0] = A; 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) 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) { if (len < 6) {
PDEBUG(DMUP, DEBUG_NOTICE, "Message too short!\n"); LOGP(DMUP, LOGL_NOTICE, "Message too short!\n");
return; 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]; *C = data[4];
*B = data[5]; *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 */ /* 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; m = tm->tm_min;
s = tm->tm_sec; 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; *opcode = OPCODE_SUQU;
buffer[0] = Q | (N << 1) | (R << 2); 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; int i, start_i = 0, stop_i = 0;
if (len < 11) { if (len < 11) {
PDEBUG(DMUP, DEBUG_NOTICE, "Message too short!\n"); LOGP(DMUP, LOGL_NOTICE, "Message too short!\n");
return; return;
} }
@@ -388,9 +389,9 @@ void decode_sssaf(uint8_t *data, int len)
A = data[1] | (data[2] << 8); A = data[1] | (data[2] << 8);
E = data[3] | (data[4] << 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) { 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; return;
} }
if ((int)E - (int)A < 0) if ((int)E - (int)A < 0)
@@ -411,9 +412,9 @@ void decode_sssaf(uint8_t *data, int len)
if (i > 0 && S != last_S) { if (i > 0 && S != last_S) {
end: end:
if (start_i == stop_i) 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 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 */ /* new start */
start_i = stop_i = i; start_i = stop_i = i;
} }
@@ -425,20 +426,20 @@ end:
void encode_sssqu(uint8_t *opcode) void encode_sssqu(uint8_t *opcode)
{ {
*opcode = OPCODE_SSSQU; *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 */ /* base station locks a voice channel */
void decode_ssaf(uint8_t *data, int len, uint8_t *S) void decode_ssaf(uint8_t *data, int len, uint8_t *S)
{ {
if (len < 1) { if (len < 1) {
PDEBUG(DMUP, DEBUG_NOTICE, "Message too short!\n"); LOGP(DMUP, LOGL_NOTICE, "Message too short!\n");
return; return;
} }
*S = data[0]; *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 */ /* 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]; 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; *opcode = OPCODE_SSQU;
buffer[0] = S; 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) void decode_sfaf(uint8_t *data, int len, uint8_t *S)
{ {
if (len < 1) { if (len < 1) {
PDEBUG(DMUP, DEBUG_NOTICE, "Message too short!\n"); LOGP(DMUP, LOGL_NOTICE, "Message too short!\n");
return; return;
} }
*S = data[0]; *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 */ /* 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]; 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; *opcode = OPCODE_SFQU;
buffer[0] = S; buffer[0] = S;
@@ -485,13 +486,13 @@ int encode_sfqu(uint8_t *opcode, uint8_t **data, uint8_t S)
/* base station ready */ /* base station ready */
void decode_svaf(uint8_t __attribute__((unused)) *data, int __attribute__((unused)) len) 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 */ /* ack to base station ready */
int encode_svqu(uint8_t *opcode, uint8_t **data) 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; *opcode = OPCODE_SVQU;
*data = NULL; *data = NULL;
@@ -501,13 +502,13 @@ int encode_svqu(uint8_t *opcode, uint8_t **data)
/* base station requests alarm messages */ /* base station requests alarm messages */
void decode_ylsaf(uint8_t __attribute__((unused)) *data, int __attribute__((unused)) len) 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 */ /* ack to base stations alarm request */
int encode_ylsmu(uint8_t *opcode, uint8_t **data) 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; *opcode = OPCODE_YLSMU;
*data = NULL; *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) void decode_ylsmf(uint8_t *data, int len, uint8_t *N, uint8_t *C, struct SysMeld *SM)
{ {
if (len < 9) { if (len < 9) {
PDEBUG(DMUP, DEBUG_NOTICE, "Message too short!\n"); LOGP(DMUP, LOGL_NOTICE, "Message too short!\n");
return; return;
} }
@@ -578,7 +579,7 @@ void decode_ylsmf(uint8_t *data, int len, uint8_t *N, uint8_t *C, struct SysMeld
indizien[strlen(indizien)] = ' '; 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, SM->Monat, SM->Tag, SM->Stunde, SM->Minute,
einrichtrungstyp_string(SM->Einrichtungstyp), SM->Einrichtungsnr, einrichtrungstyp_string(SM->Einrichtungstyp), SM->Einrichtungsnr,
SM->ASCII_Typ ? : '0', SM->Systemmeldungsnr, 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 */ /* base station ends list of alarm messages */
void decode_ylsef(uint8_t __attribute__((unused)) *data, int __attribute__((unused)) len) 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 */ /* base station requests billing info */
void decode_stdaf(uint8_t __attribute__((unused)) *data, int __attribute__((unused)) len) 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 */ /* 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 }; // Example from UeLE-ROM = { 0xff, 0x00, 0x01, 0xec, 0x3f, 0x01, 0x31, 0x1c, 0x03 };
// { 0xff, 0x00, 0x01, 0xec, 0x3f, 0x01, 0x41, 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; *opcode = OPCODE_XGTAU;
buffer[0] = 0xff; 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) 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) { if (len < 6) {
PDEBUG(DMUP, DEBUG_NOTICE, "Message too short!\n"); LOGP(DMUP, LOGL_NOTICE, "Message too short!\n");
return; 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; *b = (data[5] >> 6) & 0x1;
*l = data[5] >> 7; *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)\n", *N, *U, *T, *N, *U, *T);
} }
/* ack to inscription */ /* ack to inscription */
int encode_ebpqu(uint8_t *opcode, uint8_t **data) 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; *opcode = OPCODE_EBPQU;
*data = NULL; *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) void decode_abaf(uint8_t *data, int len, uint16_t *T, uint8_t *U, uint8_t *N)
{ {
if (len < 3) { if (len < 3) {
PDEBUG(DMUP, DEBUG_NOTICE, "Message too short!\n"); LOGP(DMUP, LOGL_NOTICE, "Message too short!\n");
return; return;
} }
@@ -664,7 +665,7 @@ void decode_abaf(uint8_t *data, int len, uint16_t *T, uint8_t *U, uint8_t *N)
*U = data[2] & 0x1f; *U = data[2] & 0x1f;
*N = data[2] >> 5; *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"; static char digit2char[16] = "0123456789a*#bcd";
@@ -675,7 +676,7 @@ void _decode_outgoing(uint8_t *data, int len, uint16_t *T, uint8_t *U, uint8_t *
int i; int i;
if (len < 11) { if (len < 11) {
PDEBUG(DMUP, DEBUG_NOTICE, "Message too short!\n"); LOGP(DMUP, LOGL_NOTICE, "Message too short!\n");
return; 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); _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) 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); _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 */ /* 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]; 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; *opcode = OPCODE_GVNQU;
buffer[0] = P; 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]; 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; *opcode = OPCODE_GVNQU;
buffer[0] = X; 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]; 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; *opcode = OPCODE_KVAU;
buffer[0] = T; 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 */ /* ack to MT call on queue */
void decode_kvwqf(uint8_t __attribute__((unused)) *data, int __attribute__((unused)) len) 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 */ /* answer of MT call */
void decode_kvbaf(uint8_t __attribute__((unused)) *data, int __attribute__((unused)) len) 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 */ /* loop test request */
void decode_staf(uint8_t *data, int len, uint8_t *Q, uint8_t *V, uint8_t *e, uint64_t *n) void decode_staf(uint8_t *data, int len, uint8_t *Q, uint8_t *V, uint8_t *e, uint64_t *n)
{ {
if (len < 10) { if (len < 10) {
PDEBUG(DMUP, DEBUG_NOTICE, "Message too short!\n"); LOGP(DMUP, LOGL_NOTICE, "Message too short!\n");
return; 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[8] << 48;
*n |= (uint64_t)data[9] << 56; *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 */ /* 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]; 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; *opcode = OPCODE_STPQU;
buffer[0] = Q; buffer[0] = Q;
@@ -827,7 +828,7 @@ int encode_stnqu(uint8_t *opcode, uint8_t **data, uint8_t Q)
{ {
static uint8_t buffer[1]; 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; *opcode = OPCODE_STNQU;
buffer[0] = Q; 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) void decode_apf(uint8_t *data, int len, uint8_t *Q, uint64_t *a)
{ {
if (len < 9) { if (len < 9) {
PDEBUG(DMUP, DEBUG_NOTICE, "Message too short!\n"); LOGP(DMUP, LOGL_NOTICE, "Message too short!\n");
return; 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[7] << 48;
*a |= (uint64_t)data[8] << 56; *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) */ /* 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]; 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; *opcode = OPCODE_GSTAU;
buffer[0] = Q; 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 */ /* MCID */
void decode_faf(uint8_t __attribute__((unused)) *data, int __attribute__((unused)) len) 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) */ /* release by base station (before SPK assignment) */
void decode_naf(uint8_t *data, int len, uint8_t *X) void decode_naf(uint8_t *data, int len, uint8_t *X)
{ {
if (len < 1) { if (len < 1) {
PDEBUG(DMUP, DEBUG_NOTICE, "Message too short!\n"); LOGP(DMUP, LOGL_NOTICE, "Message too short!\n");
return; return;
} }
*X = data[0]; *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) */ /* release by base station ack (before SPK assignment) */
int encode_equ(uint8_t *opcode, uint8_t **data) 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; *opcode = OPCODE_EQU;
*data = NULL; *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) void decode_aaf(uint8_t *data, int len, uint8_t *Q, uint8_t *X)
{ {
if (len < 2) { if (len < 2) {
PDEBUG(DMUP, DEBUG_NOTICE, "Message too short!\n"); LOGP(DMUP, LOGL_NOTICE, "Message too short!\n");
return; return;
} }
*Q = data[0]; *Q = data[0];
*X = data[1]; *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) */ /* 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]; 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; *opcode = OPCODE_AQU;
buffer[0] = Q; 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]; 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; *opcode = OPCODE_NAU;
buffer[0] = X; 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) */ /* release by network ack (before SPK assignment) */
void decode_eqf(uint8_t __attribute__((unused)) *data, int __attribute__((unused)) len) 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) */ /* 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]; 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; *opcode = OPCODE_AAU;
buffer[0] = Q; 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) void decode_aqf(uint8_t *data, int len, uint8_t *Q)
{ {
if (len < 1) { if (len < 1) {
PDEBUG(DMUP, DEBUG_NOTICE, "Message too short!\n"); LOGP(DMUP, LOGL_NOTICE, "Message too short!\n");
return; return;
} }
*Q = data[0]; *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 */ /* request data base block */
void decode_xadbf(uint8_t *data, int len, uint8_t *PJ, uint16_t *D, uint16_t *L) void decode_xadbf(uint8_t *data, int len, uint8_t *PJ, uint16_t *D, uint16_t *L)
{ {
if (len < 6) { if (len < 6) {
PDEBUG(DMUP, DEBUG_NOTICE, "Message too short!\n"); LOGP(DMUP, LOGL_NOTICE, "Message too short!\n");
return; 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); *D = data[2] | (data[3] << 8);
*L = data[4] | (data[5] << 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 */ /* 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]; 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; *opcode = OPCODE_XEDBU;
buffer[0] = R; 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]; static uint8_t buffer[11];
if (debuglevel == DEBUG_DEBUG) if (loglevel == LOGL_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)); 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) 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; *opcode = OPCODE_XEDBU;
buffer[0] = S; 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]; 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; *opcode = OPCODE_XEDBU;
buffer[0] = S; buffer[0] = S;
@@ -1057,7 +1058,7 @@ int encode_yaaau(uint8_t *opcode, uint8_t **data, uint8_t J)
{ {
static uint8_t buffer[2]; 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; *opcode = OPCODE_YAAAU;
buffer[0] = 0xff; buffer[0] = 0xff;
@@ -1072,7 +1073,7 @@ int encode_swau(uint8_t *opcode, uint8_t **data, uint8_t V)
{ {
static uint8_t buffer[1]; 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; *opcode = OPCODE_SWAU;
buffer[0] = V; 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) 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) { if (len < 6) {
PDEBUG(DMUP, DEBUG_NOTICE, "Message too short!\n"); LOGP(DMUP, LOGL_NOTICE, "Message too short!\n");
return; return;
} }
@@ -1096,14 +1097,14 @@ void decode_swqf(uint8_t *data, int len, uint8_t *V, uint8_t *N, uint8_t *U, uin
*C = data[4]; *C = data[4];
*B = data[5]; *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) */ /* request "Aktivdatei" (inscripted substribers) */
void encode_sadau(uint8_t *opcode) void encode_sadau(uint8_t *opcode)
{ {
*opcode = OPCODE_SADAU; *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" */ /* ack "Aktivdatei" */
@@ -1112,7 +1113,7 @@ int decode_sadqf(uint8_t *data, int len, uint16_t *S, uint8_t *E, uint8_t *l, ui
int i, n = 0; int i, n = 0;
if (len < 11) { if (len < 11) {
PDEBUG(DMUP, DEBUG_NOTICE, "Message too short!\n"); LOGP(DMUP, LOGL_NOTICE, "Message too short!\n");
return 0; return 0;
} }
@@ -1127,9 +1128,9 @@ int decode_sadqf(uint8_t *data, int len, uint16_t *S, uint8_t *E, uint8_t *l, ui
n++; 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++) 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)\n", i + 1, N[i], U[i], T[i], N[i], U[i], T[i]);
return n; return n;
} }
+14 -12
View File
@@ -23,8 +23,9 @@
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libtimer/timer.h" #include <osmocom/core/timer.h>
#include "../libdebug/debug.h" #include <osmocom/core/utils.h>
#include "../liblogging/logging.h"
#include "../libmobile/call.h" #include "../libmobile/call.h"
#include "../libmobile/main_mobile.h" #include "../libmobile/main_mobile.h"
#include "../liboptions/options.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; 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 */ /* store current FSN */
sniffer->last_fsn = 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; 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 */ /* store initial FSN */
sniffer->last_fsn = 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; uint8_t ident, opcode;
if (len < 4) { 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; return;
} }
if (fsn == sniffer->last_fsn) { 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; return;
} }
if (len < 6) { 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; return;
} }
@@ -126,9 +127,9 @@ static void receive_msu(mtp_t *mtp, uint8_t bsn, uint8_t bib, uint8_t fsn, uint8
len -= 6; len -= 6;
if (sio == 0xcd) 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 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 */ /* store current FSN */
sniffer->last_fsn = fsn; sniffer->last_fsn = fsn;
@@ -158,7 +159,7 @@ void sniffer_destroy(sender_t *sender)
{ {
sniffer_t *sniffer = (sniffer_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); mtp_exit(&sniffer->mtp);
@@ -202,11 +203,11 @@ int main(int argc, char *argv[])
if (num_device <= 1) if (num_device <= 1)
dsp_device[1] = dsp_device[0]; dsp_device[1] = dsp_device[0];
for (i = 0; i < num_kanal; i++) { 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)); sniffer = calloc(1, sizeof(sniffer_t));
if (!sniffer) { if (!sniffer) {
PDEBUG(DCNETZ, DEBUG_ERROR, "No memory!\n"); LOGP(DCNETZ, LOGL_ERROR, "No memory!\n");
goto fail; 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); 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); sniffer_destroy(sender_head);
/* exits */ /* exits */
main_mobile_exit();
fm_exit(); fm_exit();
return 0; return 0;
+3 -3
View File
@@ -1,6 +1,6 @@
#include <stdlib.h> #include <stdlib.h>
#include <inttypes.h> #include <inttypes.h>
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "systemmeldungen.h" #include "systemmeldungen.h"
static struct systemmeldungen { static struct systemmeldungen {
@@ -21894,8 +21894,8 @@ void print_systemmeldung(uint16_t code, int bytes, uint8_t *ind)
if (i == ii) if (i == ii)
return; 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++) 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]);
} }
+3 -5
View File
@@ -12,21 +12,19 @@ golay_LDADD = \
$(COMMON_LA) \ $(COMMON_LA) \
../amps/libusatone.a \ ../amps/libusatone.a \
$(top_builddir)/src/liboptions/liboptions.a \ $(top_builddir)/src/liboptions/liboptions.a \
$(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libmobile/libmobile.a \ $(top_builddir)/src/libmobile/libmobile.a \
$(top_builddir)/src/libosmocc/libosmocc.a \
$(top_builddir)/src/libdisplay/libdisplay.a \ $(top_builddir)/src/libdisplay/libdisplay.a \
$(top_builddir)/src/libjitter/libjitter.a \ $(top_builddir)/src/libjitter/libjitter.a \
$(top_builddir)/src/libtimer/libtimer.a \
$(top_builddir)/src/libselect/libselect.a \
$(top_builddir)/src/libsamplerate/libsamplerate.a \ $(top_builddir)/src/libsamplerate/libsamplerate.a \
$(top_builddir)/src/libemphasis/libemphasis.a \ $(top_builddir)/src/libemphasis/libemphasis.a \
$(top_builddir)/src/libfm/libfm.a \ $(top_builddir)/src/libfm/libfm.a \
$(top_builddir)/src/libfilter/libfilter.a \ $(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/libwave/libwave.a \ $(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \ $(top_builddir)/src/libsample/libsample.a \
$(top_builddir)/src/libg711/libg711.a \
$(top_builddir)/src/libaaimage/libaaimage.a \ $(top_builddir)/src/libaaimage/libaaimage.a \
$(top_builddir)/src/liblogging/liblogging.a \
$(LIBOSMOCORE_LIBS) \
$(LIBOSMOCC_LIBS) \
-lm -lm
if HAVE_ALSA if HAVE_ALSA
+9 -9
View File
@@ -27,7 +27,7 @@
#include <math.h> #include <math.h>
#include <sys/param.h> #include <sys/param.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "golay.h" #include "golay.h"
#include "dsp.h" #include "dsp.h"
@@ -39,7 +39,7 @@ static void dsp_init_ramp(gsc_t *gsc)
double c; double c;
int i; 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++) { for (i = 0; i < 256; i++) {
/* This is mathematically incorrect... */ /* This is mathematically incorrect... */
if (i < 64) if (i < 64)
@@ -58,7 +58,7 @@ int dsp_init_sender(gsc_t *gsc, int samplerate, double deviation, double polarit
{ {
int rc; 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 */ /* set modulation parameters */
// NOTE: baudrate equals modulation, because we have a raised cosine ramp of beta = 0.5 // NOTE: baudrate equals modulation, because we have a raised cosine ramp of beta = 0.5
@@ -66,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_bitduration = (double)samplerate / 600.0;
gsc->fsk_bitstep = 1.0 / gsc->fsk_bitduration; 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_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); gsc->fsk_tx_buffer = calloc(sizeof(sample_t), gsc->fsk_tx_buffer_size);
if (!gsc->fsk_tx_buffer) { if (!gsc->fsk_tx_buffer) {
PDEBUG_CHAN(DDSP, DEBUG_ERROR, "No memory!\n"); LOGP_CHAN(DDSP, LOGL_ERROR, "No memory!\n");
rc = -ENOMEM; rc = -ENOMEM;
goto error; goto error;
} }
@@ -93,7 +93,7 @@ error:
/* Cleanup transceiver instance. */ /* Cleanup transceiver instance. */
void dsp_cleanup_sender(gsc_t *gsc) 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) { if (gsc->fsk_tx_buffer) {
free(gsc->fsk_tx_buffer); free(gsc->fsk_tx_buffer);
@@ -202,7 +202,7 @@ again:
} }
samplerate_upsample(&gsc->wave_tx_upsample, wave_samples[0], wave_num, samples, length); samplerate_upsample(&gsc->wave_tx_upsample, wave_samples[0], wave_num, samples, length);
if (!gsc->wave_tx_play.left) { if (!gsc->wave_tx_play.left) {
PDEBUG_CHAN(DDSP, DEBUG_INFO, "Voice message sent.\n"); LOGP_CHAN(DDSP, LOGL_INFO, "Voice message sent.\n");
wave_destroy_playback(&gsc->wave_tx_play); wave_destroy_playback(&gsc->wave_tx_play);
return; return;
} }
@@ -221,9 +221,9 @@ again:
rc = wave_create_playback(&gsc->wave_tx_play, gsc->wave_tx_filename, &gsc->wave_tx_samplerate, &gsc->wave_tx_channels, gsc->fsk_deviation); 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) { if (rc < 0) {
gsc->wave_tx_play.left = 0; gsc->wave_tx_play.left = 0;
PDEBUG_CHAN(DDSP, DEBUG_ERROR, "Failed to open wave file '%s' for voice message.\n", gsc->wave_tx_filename); LOGP_CHAN(DDSP, LOGL_ERROR, "Failed to open wave file '%s' for voice message.\n", gsc->wave_tx_filename);
} else { } else {
PDEBUG_CHAN(DDSP, DEBUG_INFO, "Sending wave file '%s' for voice message after 2 seconds.\n", gsc->wave_tx_filename); 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); init_samplerate(&gsc->wave_tx_upsample, gsc->wave_tx_samplerate, gsc->sender.samplerate, VOICE_BANDWIDTH);
} }
} }
+61 -61
View File
@@ -34,7 +34,7 @@
#include <sys/types.h> #include <sys/types.h>
#include <sys/param.h> #include <sys/param.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "../libmobile/call.h" #include "../libmobile/call.h"
#include "../libmobile/main_mobile.h" #include "../libmobile/main_mobile.h"
#include "../libmobile/cause.h" #include "../libmobile/cause.h"
@@ -49,30 +49,30 @@ int golay_create(const char *kanal, double frequency, const char *device, int us
gsc = calloc(1, sizeof(*gsc)); gsc = calloc(1, sizeof(*gsc));
if (!gsc) { if (!gsc) {
PDEBUG(DGOLAY, DEBUG_ERROR, "No memory!\n"); LOGP(DGOLAY, LOGL_ERROR, "No memory!\n");
return -ENOMEM; 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 */ /* 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); 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) { 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; goto error;
} }
/* init audio processing */ /* init audio processing */
rc = dsp_init_sender(gsc, samplerate, deviation, polarity); rc = dsp_init_sender(gsc, samplerate, deviation, polarity);
if (rc < 0) { 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; goto error;
} }
gsc->tx = 1; gsc->tx = 1;
gsc->default_message = message; 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; return 0;
@@ -89,7 +89,7 @@ void golay_destroy(sender_t *sender)
{ {
gsc_t *gsc = (gsc_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) while (gsc->msg_list)
golay_msg_destroy(gsc, gsc->msg_list); golay_msg_destroy(gsc, gsc->msg_list);
@@ -104,11 +104,11 @@ static gsc_msg_t *golay_msg_create(gsc_t *gsc, const char *address, const char *
gsc_msg_t *msg, **msgp; gsc_msg_t *msg, **msgp;
if (strlen(address) != sizeof(msg->address) - 1) { 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; return NULL;
} }
if (strlen(text) > sizeof(msg->data) - 1) { 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; return NULL;
} }
@@ -126,18 +126,18 @@ static gsc_msg_t *golay_msg_create(gsc_t *gsc, const char *address, const char *
case '9': type = TYPE_TONE; break; case '9': type = TYPE_TONE; break;
case '0': type = TYPE_TONE; break; case '0': type = TYPE_TONE; break;
default: 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 NULL; return NULL;
} }
} else } else
PDEBUG(DGOLAY, DEBUG_INFO, "Overriding message type as defined by sender.\n"); LOGP(DGOLAY, LOGL_INFO, "Overriding message type as defined by sender.\n");
PDEBUG(DGOLAY, DEBUG_INFO, "Creating msg instance to page address '%s'.\n", address); LOGP(DGOLAY, LOGL_INFO, "Creating msg instance to page address '%s'.\n", address);
/* create */ /* create */
msg = calloc(1, sizeof(*msg)); msg = calloc(1, sizeof(*msg));
if (!msg) { if (!msg) {
PDEBUG(DGOLAY, DEBUG_ERROR, "No mem!\n"); LOGP(DGOLAY, LOGL_ERROR, "No mem!\n");
abort(); abort();
} }
@@ -281,27 +281,27 @@ static char encode_alpha(char c)
switch (c) { switch (c) {
case 0x0a: case 0x0a:
case 0x0d: case 0x0d:
PDEBUG(DGOLAY, DEBUG_DEBUG, " -> CR/LF character.\n"); LOGP(DGOLAY, LOGL_DEBUG, " -> CR/LF character.\n");
c = 0x3c; c = 0x3c;
break; break;
case '{': case '{':
PDEBUG(DGOLAY, DEBUG_DEBUG, " -> '%c' character.\n", c); LOGP(DGOLAY, LOGL_DEBUG, " -> '%c' character.\n", c);
c = 0x3b; c = 0x3b;
break; break;
case '}': case '}':
PDEBUG(DGOLAY, DEBUG_DEBUG, " -> '%c' character.\n", c); LOGP(DGOLAY, LOGL_DEBUG, " -> '%c' character.\n", c);
c = 0x3d; c = 0x3d;
break; break;
case '\\': case '\\':
PDEBUG(DGOLAY, DEBUG_DEBUG, " -> '%c' character.\n", c); LOGP(DGOLAY, LOGL_DEBUG, " -> '%c' character.\n", c);
c = 0x20; c = 0x20;
break; break;
default: default:
if (c < 0x20 || c > 0x5d) { if (c < 0x20 || c > 0x5d) {
PDEBUG(DGOLAY, DEBUG_DEBUG, " -> ' ' character.\n"); LOGP(DGOLAY, LOGL_DEBUG, " -> ' ' character.\n");
c = 0x20; c = 0x20;
} else { } else {
PDEBUG(DGOLAY, DEBUG_DEBUG, " -> '%c' character.\n", c); LOGP(DGOLAY, LOGL_DEBUG, " -> '%c' character.\n", c);
c = c - 0x20; c = c - 0x20;
} }
} }
@@ -314,93 +314,93 @@ static char encode_numeric(char c)
switch (c) { switch (c) {
case 'u': case 'u':
case 'U': case 'U':
PDEBUG(DGOLAY, DEBUG_DEBUG, " -> 'U' character.\n"); LOGP(DGOLAY, LOGL_DEBUG, " -> 'U' character.\n");
c = 0xb; c = 0xb;
break; break;
case ' ': case ' ':
PDEBUG(DGOLAY, DEBUG_DEBUG, " -> '%c' character.\n", c); LOGP(DGOLAY, LOGL_DEBUG, " -> '%c' character.\n", c);
c = 0xc; c = 0xc;
break; break;
case '-': case '-':
PDEBUG(DGOLAY, DEBUG_DEBUG, " -> '%c' character.\n", c); LOGP(DGOLAY, LOGL_DEBUG, " -> '%c' character.\n", c);
c = 0xd; c = 0xd;
break; break;
case '=': case '=':
case '*': case '*':
PDEBUG(DGOLAY, DEBUG_DEBUG, " -> '*' character.\n"); LOGP(DGOLAY, LOGL_DEBUG, " -> '*' character.\n");
c = 0xe; c = 0xe;
break; break;
case 'a': case 'a':
case 'A': case 'A':
PDEBUG(DGOLAY, DEBUG_DEBUG, " -> 'A' character.\n"); LOGP(DGOLAY, LOGL_DEBUG, " -> 'A' character.\n");
c = 0xf0; c = 0xf0;
break; break;
case 'b': case 'b':
case 'B': case 'B':
PDEBUG(DGOLAY, DEBUG_DEBUG, " -> 'B' character.\n"); LOGP(DGOLAY, LOGL_DEBUG, " -> 'B' character.\n");
c = 0xf1; c = 0xf1;
break; break;
case 'c': case 'c':
case 'C': case 'C':
PDEBUG(DGOLAY, DEBUG_DEBUG, " -> 'C' character.\n"); LOGP(DGOLAY, LOGL_DEBUG, " -> 'C' character.\n");
c = 0xf2; c = 0xf2;
break; break;
case 'd': case 'd':
case 'D': case 'D':
PDEBUG(DGOLAY, DEBUG_DEBUG, " -> 'D' character.\n"); LOGP(DGOLAY, LOGL_DEBUG, " -> 'D' character.\n");
c = 0xf3; c = 0xf3;
break; break;
case 'e': case 'e':
case 'E': case 'E':
PDEBUG(DGOLAY, DEBUG_DEBUG, " -> 'E' character.\n"); LOGP(DGOLAY, LOGL_DEBUG, " -> 'E' character.\n");
c = 0xf4; c = 0xf4;
break; break;
case 'f': case 'f':
case 'F': case 'F':
PDEBUG(DGOLAY, DEBUG_DEBUG, " -> 'F' character.\n"); LOGP(DGOLAY, LOGL_DEBUG, " -> 'F' character.\n");
c = 0xf6; c = 0xf6;
break; break;
case 'g': case 'g':
case 'G': case 'G':
PDEBUG(DGOLAY, DEBUG_DEBUG, " -> 'G' character.\n"); LOGP(DGOLAY, LOGL_DEBUG, " -> 'G' character.\n");
c = 0xf7; c = 0xf7;
break; break;
case 'h': case 'h':
case 'H': case 'H':
PDEBUG(DGOLAY, DEBUG_DEBUG, " -> 'H' character.\n"); LOGP(DGOLAY, LOGL_DEBUG, " -> 'H' character.\n");
c = 0xf8; c = 0xf8;
break; break;
case 'j': case 'j':
case 'J': case 'J':
PDEBUG(DGOLAY, DEBUG_DEBUG, " -> 'J' character.\n"); LOGP(DGOLAY, LOGL_DEBUG, " -> 'J' character.\n");
c = 0xf9; c = 0xf9;
break; break;
case 'l': case 'l':
case 'L': case 'L':
PDEBUG(DGOLAY, DEBUG_DEBUG, " -> 'L' character.\n"); LOGP(DGOLAY, LOGL_DEBUG, " -> 'L' character.\n");
c = 0xfb; c = 0xfb;
break; break;
case 'n': case 'n':
case 'N': case 'N':
PDEBUG(DGOLAY, DEBUG_DEBUG, " -> 'N' character.\n"); LOGP(DGOLAY, LOGL_DEBUG, " -> 'N' character.\n");
c = 0xfc; c = 0xfc;
break; break;
case 'p': case 'p':
case 'P': case 'P':
PDEBUG(DGOLAY, DEBUG_DEBUG, " -> 'P' character.\n"); LOGP(DGOLAY, LOGL_DEBUG, " -> 'P' character.\n");
c = 0xfd; c = 0xfd;
break; break;
case 'r': case 'r':
case 'R': case 'R':
PDEBUG(DGOLAY, DEBUG_DEBUG, " -> 'r' character.\n"); LOGP(DGOLAY, LOGL_DEBUG, " -> 'r' character.\n");
c = 0xfe; c = 0xfe;
break; break;
default: default:
if (c >= '0' && c <= '9') { if (c >= '0' && c <= '9') {
PDEBUG(DGOLAY, DEBUG_DEBUG, " -> '%c' character.\n", c); LOGP(DGOLAY, LOGL_DEBUG, " -> '%c' character.\n", c);
c = c - '0'; c = c - '0';
} else { } else {
PDEBUG(DGOLAY, DEBUG_DEBUG, " -> ' ' character.\n"); LOGP(DGOLAY, LOGL_DEBUG, " -> ' ' character.\n");
c = 0xc; c = 0xc;
} }
} }
@@ -419,7 +419,7 @@ static int encode_address(const char *code, int *preamble, uint16_t *word1, uint
break; break;
} }
if (code[i]) { 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; return -EINVAL;
} }
@@ -457,7 +457,7 @@ static int encode_address(const char *code, int *preamble, uint16_t *word1, uint
break; break;
} }
if (i < 16) { 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; return -EINVAL;
} }
} else { } else {
@@ -466,7 +466,7 @@ static int encode_address(const char *code, int *preamble, uint16_t *word1, uint
break; break;
} }
if (i < 7) { 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; return -EINVAL;
} }
} }
@@ -528,7 +528,7 @@ static int queue_batch(gsc_t *gsc, const char *address, enum gsc_msg_type type,
/* check address length */ /* check address length */
if (!address || strlen(address) != 7) { 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; return -EINVAL;
} }
@@ -550,24 +550,24 @@ static int queue_batch(gsc_t *gsc, const char *address, enum gsc_msg_type type,
case '9': function = 0; break; case '9': function = 0; break;
case '0': function = 1; break; case '0': function = 1; break;
default: 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; return -EINVAL;
} }
switch (type) { switch (type) {
case TYPE_ALPHA: case TYPE_ALPHA:
case TYPE_NUMERIC: case TYPE_NUMERIC:
PDEBUG(DGOLAY, DEBUG_INFO, "Coding text message for functional address '%s' and message '%s'.\n", address, message); LOGP(DGOLAY, LOGL_INFO, "Coding text message for functional address '%s' and message '%s'.\n", address, message);
break; break;
case TYPE_VOICE: case TYPE_VOICE:
PDEBUG(DGOLAY, DEBUG_INFO, "Coding voice message for functional address %s with wave file '%s'.\n", address, message); LOGP(DGOLAY, LOGL_INFO, "Coding voice message for functional address %s with wave file '%s'.\n", address, message);
break; break;
default: default:
PDEBUG(DGOLAY, DEBUG_INFO, "Coding tone only message for functional address %s.\n", address); LOGP(DGOLAY, LOGL_INFO, "Coding tone only message for functional address %s.\n", address);
} }
/* encode preamble and store */ /* 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]); golay = calc_golay(preamble_values[preamble]);
queue_comma(gsc, 28, golay & 1); queue_comma(gsc, 28, golay & 1);
for (i = 0; i < 18; i++) { for (i = 0; i < 18; i++) {
@@ -575,7 +575,7 @@ static int queue_batch(gsc_t *gsc, const char *address, enum gsc_msg_type type,
} }
/* encode start code and store */ /* 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); golay = calc_golay(start_code);
queue_comma(gsc, 28, golay & 1); queue_comma(gsc, 28, golay & 1);
queue_dup(gsc, golay, 23); queue_dup(gsc, golay, 23);
@@ -584,7 +584,7 @@ static int queue_batch(gsc_t *gsc, const char *address, enum gsc_msg_type type,
queue_dup(gsc, golay, 23); queue_dup(gsc, golay, 23);
/* encode address and store */ /* 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); golay = calc_golay(word1);
if (function & 0x2) if (function & 0x2)
golay ^= 0x7fffff; golay ^= 0x7fffff;
@@ -599,10 +599,10 @@ static int queue_batch(gsc_t *gsc, const char *address, enum gsc_msg_type type,
/* encode message */ /* encode message */
switch (type) { switch (type) {
case TYPE_ALPHA: case TYPE_ALPHA:
PDEBUG(DGOLAY, DEBUG_DEBUG, "Encoding %d alphanumeric digits.\n", (int)strlen(message)); LOGP(DGOLAY, LOGL_DEBUG, "Encoding %d alphanumeric digits.\n", (int)strlen(message));
for (i = 0; *message; i++) { for (i = 0; *message; i++) {
if (i == MAX_ADB) { 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++) { for (j = 0; *message && j < 8; j++) {
msg[j] = encode_alpha(*message++); msg[j] = encode_alpha(*message++);
@@ -635,11 +635,11 @@ static int queue_batch(gsc_t *gsc, const char *address, enum gsc_msg_type type,
} }
break; break;
case TYPE_NUMERIC: case TYPE_NUMERIC:
PDEBUG(DGOLAY, DEBUG_DEBUG, "Encoding %d numeric digits.\n", (int)strlen(message)); LOGP(DGOLAY, LOGL_DEBUG, "Encoding %d numeric digits.\n", (int)strlen(message));
shifted = 0; shifted = 0;
for (i = 0; *message; i++) { for (i = 0; *message; i++) {
if (i == MAX_NDB) { 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++) { for (j = 0; *message && j < 12; j++) {
/* get next digit or shifted digit */ /* get next digit or shifted digit */
@@ -690,7 +690,7 @@ static int queue_batch(gsc_t *gsc, const char *address, enum gsc_msg_type type,
/* store bit number for activation code. this is used to play the AC again after voice message. */ /* store bit number for activation code. this is used to play the AC again after voice message. */
gsc->bit_ac = gsc->bit_num; gsc->bit_ac = gsc->bit_num;
/* encode activation code and store */ /* encode activation code and store */
PDEBUG(DGOLAY, DEBUG_DEBUG, "Encoding activation code.\n"); LOGP(DGOLAY, LOGL_DEBUG, "Encoding activation code.\n");
golay = calc_golay(activation_code); golay = calc_golay(activation_code);
queue_comma(gsc, 28, golay & 1); queue_comma(gsc, 28, golay & 1);
queue_dup(gsc, golay, 23); queue_dup(gsc, golay, 23);
@@ -700,13 +700,13 @@ static int queue_batch(gsc_t *gsc, const char *address, enum gsc_msg_type type,
break; break;
default: default:
/* encode comma after message and store */ /* encode comma after message and store */
PDEBUG(DGOLAY, DEBUG_DEBUG, "Encoding 'comma' sequence after message.\n"); LOGP(DGOLAY, LOGL_DEBUG, "Encoding 'comma' sequence after message.\n");
queue_comma(gsc, 121 * 8, 1); queue_comma(gsc, 121 * 8, 1);
} }
/* check overflow */ /* check overflow */
if (gsc->bit_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; return -EOVERFLOW;
} }
@@ -741,7 +741,7 @@ int8_t get_bit(gsc_t *gsc)
return 2; return 2;
} }
queue_reset(gsc); queue_reset(gsc);
PDEBUG(DGOLAY, DEBUG_INFO, "Done transmitting message.\n"); LOGP(DGOLAY, LOGL_INFO, "Done transmitting message.\n");
goto next_msg; goto next_msg;
} }
return gsc->bit[gsc->bit_index++]; return gsc->bit[gsc->bit_index++];
@@ -757,7 +757,7 @@ next_msg:
/* encode first message in queue */ /* encode first message in queue */
rc = queue_batch(gsc, msg->address, msg->type, msg->data); rc = queue_batch(gsc, msg->address, msg->type, msg->data);
if (rc >= 0) 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); golay_msg_destroy(gsc, msg);
if (rc < 0) if (rc < 0)
goto next_msg; goto next_msg;
@@ -823,9 +823,9 @@ int call_down_setup(int __attribute__((unused)) callref, const char *caller_id,
} }
if (!sender) { if (!sender) {
if (channel) 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 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; return -CAUSE_NOCHANNEL;
} }
@@ -852,7 +852,7 @@ void call_down_answer(int __attribute__((unused)) callref)
static void _release(int __attribute__((unused)) callref, int __attribute__((unused)) cause) 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) void call_down_disconnect(int callref, int cause)
+3 -2
View File
@@ -27,7 +27,7 @@
#include <sys/stat.h> #include <sys/stat.h>
#include <fcntl.h> #include <fcntl.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "../libmobile/call.h" #include "../libmobile/call.h"
#include "../libmobile/main_mobile.h" #include "../libmobile/main_mobile.h"
#include "../liboptions/options.h" #include "../liboptions/options.h"
@@ -172,7 +172,7 @@ static void myhandler(void)
if (tx) if (tx)
golay_msg_send(buffer); golay_msg_send(buffer);
else 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");
} }
} }
} }
@@ -294,6 +294,7 @@ fail:
golay_destroy(sender_head); golay_destroy(sender_head);
/* exits */ /* exits */
main_mobile_exit();
fm_exit(); fm_exit();
options_free(); options_free();
+5 -6
View File
@@ -13,22 +13,20 @@ imts_LDADD = \
$(COMMON_LA) \ $(COMMON_LA) \
../amps/libusatone.a \ ../amps/libusatone.a \
$(top_builddir)/src/liboptions/liboptions.a \ $(top_builddir)/src/liboptions/liboptions.a \
$(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libmobile/libmobile.a \ $(top_builddir)/src/libmobile/libmobile.a \
$(top_builddir)/src/libosmocc/libosmocc.a \
$(top_builddir)/src/libdisplay/libdisplay.a \ $(top_builddir)/src/libdisplay/libdisplay.a \
$(top_builddir)/src/libjitter/libjitter.a \ $(top_builddir)/src/libjitter/libjitter.a \
$(top_builddir)/src/libsquelch/libsquelch.a \ $(top_builddir)/src/libsquelch/libsquelch.a \
$(top_builddir)/src/libtimer/libtimer.a \
$(top_builddir)/src/libselect/libselect.a \
$(top_builddir)/src/libsamplerate/libsamplerate.a \ $(top_builddir)/src/libsamplerate/libsamplerate.a \
$(top_builddir)/src/libemphasis/libemphasis.a \ $(top_builddir)/src/libemphasis/libemphasis.a \
$(top_builddir)/src/libfm/libfm.a \ $(top_builddir)/src/libfm/libfm.a \
$(top_builddir)/src/libfilter/libfilter.a \ $(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/libwave/libwave.a \ $(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \ $(top_builddir)/src/libsample/libsample.a \
$(top_builddir)/src/libg711/libg711.a \
$(top_builddir)/src/libaaimage/libaaimage.a \ $(top_builddir)/src/libaaimage/libaaimage.a \
$(top_builddir)/src/liblogging/liblogging.a \
$(LIBOSMOCORE_LIBS) \
$(LIBOSMOCC_LIBS) \
-lm -lm
imts_dialer_SOURCES = \ imts_dialer_SOURCES = \
@@ -37,9 +35,10 @@ imts_dialer_SOURCES = \
imts_dialer_LDADD = \ imts_dialer_LDADD = \
$(COMMON_LA) \ $(COMMON_LA) \
$(top_builddir)/src/liboptions/liboptions.a \ $(top_builddir)/src/liboptions/liboptions.a \
$(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libwave/libwave.a \ $(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \ $(top_builddir)/src/libsample/libsample.a \
$(top_builddir)/src/liblogging/liblogging.a \
$(LIBOSMOCORE_LIBS) \
-lm -lm
if HAVE_ALSA if HAVE_ALSA
+7 -7
View File
@@ -26,7 +26,7 @@
#include <errno.h> #include <errno.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libwave/wave.h" #include "../libwave/wave.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#ifdef HAVE_ALSA #ifdef HAVE_ALSA
#include "../libsound/sound.h" #include "../libsound/sound.h"
#endif #endif
@@ -186,7 +186,7 @@ static void process_signal(int buffer_size)
count = dsp_samplerate / 1000; count = dsp_samplerate / 1000;
#endif #endif
if (count < 0) { 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; break;
} }
@@ -201,7 +201,7 @@ static void process_signal(int buffer_size)
/* write audio */ /* write audio */
rc = sound_write(audio, samples, power, count, NULL, NULL, 1); rc = sound_write(audio, samples, power, count, NULL, NULL, 1);
if (rc < 0) { 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; break;
} }
#endif #endif
@@ -309,7 +309,7 @@ int main(int argc, char *argv[])
/* init sound */ /* 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(dsp_audiodev, NULL, NULL, NULL, 1, 0.0, dsp_samplerate, dsp_buffer, 1.0, 1.0, 4000.0, 2.0);
if (!audio) { if (!audio) {
PDEBUG(DBNETZ, DEBUG_ERROR, "No sound device!\n"); LOGP(DBNETZ, LOGL_ERROR, "No sound device!\n");
goto exit; goto exit;
} }
#endif #endif
@@ -318,13 +318,13 @@ int main(int argc, char *argv[])
if (write_tx_wave) { if (write_tx_wave) {
rc = wave_create_record(&wave_tx_rec, write_tx_wave, dsp_samplerate, 1, 1.0); rc = wave_create_record(&wave_tx_rec, write_tx_wave, dsp_samplerate, 1, 1.0);
if (rc < 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; goto exit;
} }
} }
#ifndef HAVE_ALSA #ifndef HAVE_ALSA
else { 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; goto exit;
} }
#endif #endif
@@ -334,7 +334,7 @@ int main(int argc, char *argv[])
sound_start(audio); sound_start(audio);
#endif #endif
PDEBUG(DBNETZ, DEBUG_ERROR, "Start audio after pause...\n"); LOGP(DBNETZ, LOGL_ERROR, "Start audio after pause...\n");
process_signal(buffer_size); process_signal(buffer_size);
+16 -16
View File
@@ -26,8 +26,8 @@
#include <errno.h> #include <errno.h>
#include <math.h> #include <math.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "../libtimer/timer.h" #include <osmocom/core/timer.h>
#include "../libmobile/call.h" #include "../libmobile/call.h"
#include "imts.h" #include "imts.h"
#include "dsp.h" #include "dsp.h"
@@ -111,7 +111,7 @@ void dsp_init(void)
int i; int i;
double s; double s;
PDEBUG(DDSP, DEBUG_DEBUG, "Generating sine tables.\n"); LOGP(DDSP, LOGL_DEBUG, "Generating sine tables.\n");
for (i = 0; i < 65536; i++) { for (i = 0; i < 65536; i++) {
s = sin((double)i / 65536.0 * 2.0 * PI); s = sin((double)i / 65536.0 * 2.0 * PI);
dsp_sine_tone[i] = s * TX_PEAK_TONE; 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; 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; 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 */ /* delay buffer */
if (ptt) { 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_max = (int)((double)imts->sender.samplerate * DELAY_TIME);
imts->delay_spl = calloc(imts->delay_max, sizeof(*imts->delay_spl)); imts->delay_spl = calloc(imts->delay_max, sizeof(*imts->delay_spl));
if (!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; goto error;
} }
} }
@@ -186,7 +186,7 @@ error:
/* Cleanup transceiver instance. */ /* Cleanup transceiver instance. */
void dsp_cleanup_transceiver(imts_t *imts) 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); fm_demod_exit(&imts->demod);
if (imts->delay_spl) { if (imts->delay_spl) {
@@ -221,7 +221,7 @@ static int generate_tone(imts_t *imts, sample_t *samples, int length)
case TONE_SILENCE: case TONE_SILENCE:
break; break;
default: 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; return length;
} }
@@ -386,7 +386,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]); printf("decoder debug: %s detected, waiting to sustain\n", tone_names[tone]);
#endif #endif
if (imts->demod_sig_tone) { 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_lost_tone(imts, imts->demod_current_tone, imts->demod_duration);
imts->demod_sig_tone = 0; imts->demod_sig_tone = 0;
} }
@@ -406,7 +406,7 @@ static void tone_demod(imts_t *imts, sample_t *samples, int length)
amp = amplitude[i]; amp = amplitude[i];
imts->demod_sig_tone = 0; 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_receive_tone(imts, imts->demod_current_tone, imts->demod_duration, amp);
imts->demod_last_tone = imts->demod_current_tone; imts->demod_last_tone = imts->demod_current_tone;
imts->demod_duration = imts->demod_sustain; imts->demod_duration = imts->demod_sustain;
@@ -419,7 +419,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; double quality = 1.0 - imts->demod_quality_value / (double)imts->demod_quality_count * 2.0;
if (quality < 0) if (quality < 0)
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); display_measurements_update(imts->dmp_tone_quality, quality * 100.0, 0.0);
} }
} }
@@ -465,7 +465,7 @@ void sender_receive(sender_t *sender, sample_t *samples, int length, double rf_l
/* FALLTHRU */ /* FALLTHRU */
case SQUELCH_MUTE: case SQUELCH_MUTE:
if (imts->mode == MODE_MTS && !imts->is_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); memset(imts->delay_spl, 0, sizeof(*samples) * imts->delay_max);
imts->is_mute = 1; imts->is_mute = 1;
} }
@@ -475,7 +475,7 @@ void sender_receive(sender_t *sender, sample_t *samples, int length, double rf_l
break; break;
default: default:
if (imts->is_mute) { 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; imts->is_mute = 0;
} }
/* detect signal, if it is steady for a while */ /* detect signal, if it is steady for a while */
@@ -550,15 +550,15 @@ void imts_set_dsp_mode(imts_t *imts, enum dsp_mode mode, int tone, double durati
} }
if (imts->dsp_mode != mode) { 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; imts->dsp_mode = mode;
} }
if (mode == DSP_MODE_TONE) { if (mode == DSP_MODE_TONE) {
if (duration) 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 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 = tone;
imts->tone_duration = duration * (double)imts->sender.samplerate; imts->tone_duration = duration * (double)imts->sender.samplerate;
} }
+133 -132
View File
@@ -39,11 +39,12 @@
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "../libtimer/timer.h" #include <osmocom/core/timer.h>
#include "../libmobile/call.h" #include "../libmobile/call.h"
#include "../libmobile/cause.h" #include "../libmobile/cause.h"
#include "../libosmocc/message.h" #include "../libmobile/get_time.h"
#include <osmocom/cc/message.h>
#include "imts.h" #include "imts.h"
#include "dsp.h" #include "dsp.h"
@@ -127,24 +128,24 @@ void imts_list_channels(void)
} }
/* Timers */ /* Timers */
#define PAGING_TO 4.0 /* Time to wait for the phone to respond */ #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 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 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 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 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 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 RELEASE_TO 0,350000 /* 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 ANI_PULSE_TO 0,100000 /* Time to detect end of digit */
#define DIAL_PULSE_TO 0.200 /* Time to detect end of digit */ #define DIAL_PULSE_TO 0,200000 /* Time to detect end of digit */
#define DISC_PULSE_TO 0.100 /* Time until aborting disconnect detection */ #define DISC_PULSE_TO 0.1 /* Time until aborting disconnect detection */
#define PAGE_PULSE_TO 0.200 /* Time to detect end of digit */ #define PAGE_PULSE_TO 0.2 /* Time to detect end of digit */
/* Counters */ /* Counters */
#define DISC_COUNT 2 /* Number of pulses to detect disconnect (100 ms) */ #define DISC_COUNT 2 /* Number of pulses to detect disconnect (100 ms) */
#define RING_PULSES 40 /* 2 seconds ringer on */ #define RING_PULSES 40 /* 2 seconds ringer on */
/* Durations */ /* Durations */
#define IDLE_DETECT 0.500 /* Time to detect Idle signal (loopback) */ #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_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_PAUSE 0.225 /* Time to pause after each digit */
#define PAGE_MARK 0.050 /* Mark duration of page pulse */ #define PAGE_MARK 0.050 /* Mark duration of page pulse */
@@ -154,7 +155,7 @@ void imts_list_channels(void)
#define RING_SPACE 0.025 /* Space duration of ring pulse */ #define RING_SPACE 0.025 /* Space duration of ring pulse */
#define RING_OFF 4.0 /* 4 seconds ringer off */ #define RING_OFF 4.0 /* 4 seconds ringer off */
#define GUARD_TIME 0.200 /* Time until detecting Guard tone from mobile */ #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_TIME 0,300000 /* Time until sending Seize tone >= 250 */
#define SEIZE_LENGTH 0.250 /* Length of Seize */ #define SEIZE_LENGTH 0.250 /* Length of Seize */
#define RECEIVE_TIME 0.200 /* Time until detecting receive signal (Guard tone) from mobile */ #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 */ #define ANSWER_TIME 0.200 /* Time until detecting answer signal (Connect tone) from mobile */
@@ -213,7 +214,7 @@ static void imts_new_state(imts_t *imts, enum imts_state new_state)
{ {
if (imts->state == new_state) if (imts->state == new_state)
return; 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->state = new_state;
imts_display_status(); imts_display_status();
} }
@@ -295,34 +296,34 @@ int imts_create(const char *kanal, const char *device, int use_sdr, int samplera
int rc; int rc;
if (imts_channel2freq(kanal, 0) == 0.0) { if (imts_channel2freq(kanal, 0) == 0.0) {
PDEBUG(DIMTS, DEBUG_ERROR, "Channel number %s invalid.\n", kanal); LOGP(DIMTS, LOGL_ERROR, "Channel number %s invalid.\n", kanal);
return -EINVAL; return -EINVAL;
} }
if (imts_is_canada_only(kanal)) { if (imts_is_canada_only(kanal)) {
PDEBUG(DIMTS, DEBUG_NOTICE, "*******************************************************************************\n"); LOGP(DIMTS, LOGL_NOTICE, "*******************************************************************************\n");
PDEBUG(DIMTS, DEBUG_NOTICE, "Given channel '%s' was only available in Canada with Canadian phones.\n", kanal); LOGP(DIMTS, LOGL_NOTICE, "Given channel '%s' was only available in Canada with Canadian phones.\n", kanal);
PDEBUG(DIMTS, DEBUG_NOTICE, "*******************************************************************************\n"); LOGP(DIMTS, LOGL_NOTICE, "*******************************************************************************\n");
} }
if (mode == MODE_IMTS && imts_channel2band(kanal) == VHF_LOW) { if (mode == MODE_IMTS && imts_channel2band(kanal) == VHF_LOW) {
PDEBUG(DIMTS, DEBUG_NOTICE, "*******************************************************************************\n"); LOGP(DIMTS, LOGL_NOTICE, "*******************************************************************************\n");
PDEBUG(DIMTS, DEBUG_NOTICE, "Given channel '%s' was only available at MTS network.\n", kanal); LOGP(DIMTS, LOGL_NOTICE, "Given channel '%s' was only available at MTS network.\n", kanal);
PDEBUG(DIMTS, DEBUG_NOTICE, "*******************************************************************************\n"); LOGP(DIMTS, LOGL_NOTICE, "*******************************************************************************\n");
return -EINVAL; return -EINVAL;
} }
if (mode == MODE_MTS && imts_channel2band(kanal) == UHF) { if (mode == MODE_MTS && imts_channel2band(kanal) == UHF) {
PDEBUG(DIMTS, DEBUG_NOTICE, "*******************************************************************************\n"); LOGP(DIMTS, LOGL_NOTICE, "*******************************************************************************\n");
PDEBUG(DIMTS, DEBUG_NOTICE, "Given channel '%s' was only available at IMTS network.\n", kanal); LOGP(DIMTS, LOGL_NOTICE, "Given channel '%s' was only available at IMTS network.\n", kanal);
PDEBUG(DIMTS, DEBUG_NOTICE, "*******************************************************************************\n"); LOGP(DIMTS, LOGL_NOTICE, "*******************************************************************************\n");
return -EINVAL; return -EINVAL;
} }
imts = calloc(1, sizeof(imts_t)); imts = calloc(1, sizeof(imts_t));
if (!imts) { if (!imts) {
PDEBUG(DIMTS, DEBUG_ERROR, "No memory!\n"); LOGP(DIMTS, LOGL_ERROR, "No memory!\n");
return -EIO; 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->fast_seize = fast_seize;
imts->mode = mode; imts->mode = mode;
@@ -333,18 +334,18 @@ int imts_create(const char *kanal, const char *device, int use_sdr, int samplera
/* do not enable emphasis, since it is done by imts code, not by common sender code */ /* 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), 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);
if (rc < 0) { 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; goto error;
} }
/* init audio processing */ /* init audio processing */
rc = dsp_init_transceiver(imts, squelch_db, ptt); rc = dsp_init_transceiver(imts, squelch_db, ptt);
if (rc < 0) { 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; goto error;
} }
timer_init(&imts->timer, imts_timeout, imts); osmo_timer_setup(&imts->timer, imts_timeout, imts);
imts->pre_emphasis = pre_emphasis; imts->pre_emphasis = pre_emphasis;
imts->de_emphasis = de_emphasis; imts->de_emphasis = de_emphasis;
@@ -363,7 +364,7 @@ int imts_create(const char *kanal, const char *device, int use_sdr, int samplera
imts_go_idle(imts); imts_go_idle(imts);
} }
PDEBUG(DIMTS, DEBUG_NOTICE, "Created channel #%s\n", kanal); LOGP(DIMTS, LOGL_NOTICE, "Created channel #%s\n", kanal);
return 0; return 0;
@@ -378,9 +379,9 @@ void imts_destroy(sender_t *sender)
{ {
imts_t *imts = (imts_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); dsp_cleanup_transceiver(imts);
sender_destroy(&imts->sender); sender_destroy(&imts->sender);
free(sender); free(sender);
@@ -392,7 +393,7 @@ static void imts_go_idle(imts_t *imts)
sender_t *sender; sender_t *sender;
imts_t *idle; 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 */ imts->station_id[0] = '\0'; /* remove station ID before state change, so status is shown correctly */
for (sender = sender_head; sender; sender = sender->next) { for (sender = sender_head; sender; sender = sender->next) {
@@ -403,17 +404,17 @@ static void imts_go_idle(imts_t *imts)
break; break;
} }
if (sender) { 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_new_state(imts, IMTS_OFF);
imts_set_dsp_mode(imts, DSP_MODE_OFF, 0, 0.0, 0); imts_set_dsp_mode(imts, DSP_MODE_OFF, 0, 0.0, 0);
} else { } else {
if (imts->mode == MODE_IMTS) { 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); imts_new_state(imts, IMTS_IDLE);
/* also reset detector, so if there is a new call it is answered */ /* 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); imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_IDLE, 0.0, 1);
} else { } 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); imts_new_state(imts, IMTS_IDLE);
/* also reset detector, so if there is a new call it is answered */ /* 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); imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_600, 0.0, 1);
@@ -435,13 +436,13 @@ static void imts_activate_idle(void)
if (sender) if (sender)
imts_go_idle(idle); imts_go_idle(idle);
else 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. */ /* Release connection towards mobile station by sending pause for a while. */
static void imts_release(imts_t *imts) 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 */ /* remove station ID before state change, so status is shown correctly */
imts->station_id[0] = '\0'; imts->station_id[0] = '\0';
@@ -455,22 +456,22 @@ static void imts_release(imts_t *imts)
tone = TONE_600; tone = TONE_600;
else else
tone = TONE_1500; 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_new_state(imts, IMTS_RELEASE);
imts_set_dsp_mode(imts, DSP_MODE_TONE, tone, PAGE_PAUSE, 0); imts_set_dsp_mode(imts, DSP_MODE_TONE, tone, PAGE_PAUSE, 0);
} else { } else {
PDEBUG_CHAN(DIMTS, DEBUG_INFO, "Turing transmitter off.\n"); LOGP_CHAN(DIMTS, LOGL_INFO, "Turing transmitter off.\n");
if (imts->state != IMTS_RELEASE) if (imts->state != IMTS_RELEASE)
imts_new_state(imts, IMTS_RELEASE); imts_new_state(imts, IMTS_RELEASE);
imts_set_dsp_mode(imts, DSP_MODE_OFF, 0, 0.0, 0); 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 */ /* Enter detector test state */
static void imts_detector_test(imts_t *imts, double length_1, double length_2, double length_3) 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_1 = length_1;
imts->detector_test_length_2 = length_2; imts->detector_test_length_2 = length_2;
imts->detector_test_length_3 = length_3; imts->detector_test_length_3 = length_3;
@@ -483,12 +484,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) 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 */ /* 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) 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 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 */ /* set station ID before state change, so status is shown correctly */
strncpy(imts->station_id, dial_string, sizeof(imts->station_id) - 1); strncpy(imts->station_id, dial_string, sizeof(imts->station_id) - 1);
imts->tx_page_index = 0; imts->tx_page_index = 0;
@@ -509,18 +510,18 @@ static void imts_paging(imts_t *imts, const char *dial_string, int loopback)
/* Enter ringing state */ /* Enter ringing state */
static void imts_ringing(imts_t *imts) 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->tx_ring_pulse = 0;
imts_new_state(imts, IMTS_RINGING); imts_new_state(imts, IMTS_RINGING);
imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_IDLE, RING_MARK, 0); 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 */ /* Enter conversation state */
static void imts_answer(imts_t *imts) static void imts_answer(imts_t *imts)
{ {
PDEBUG_CHAN(DIMTS, DEBUG_INFO, "Received answer from mobile phone, conversation started.\n"); LOGP_CHAN(DIMTS, LOGL_INFO, "Received answer from mobile phone, conversation started.\n");
timer_stop(&imts->timer); osmo_timer_del(&imts->timer);
imts_new_state(imts, IMTS_CONVERSATION); imts_new_state(imts, IMTS_CONVERSATION);
imts_set_dsp_mode(imts, DSP_MODE_AUDIO, 0, 0.0, 0); imts_set_dsp_mode(imts, DSP_MODE_AUDIO, 0, 0.0, 0);
imts->rx_disc_pulse = 0; imts->rx_disc_pulse = 0;
@@ -531,10 +532,10 @@ void imts_loss_indication(imts_t *imts, double loss_time)
{ {
/* stop timer */ /* stop timer */
if (imts->mode == MODE_MTS && (imts->state == IMTS_IDLE || imts->state == IMTS_RINGING)) 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) { 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); imts_release(imts);
call_up_release(imts->callref, CAUSE_TEMPFAIL); call_up_release(imts->callref, CAUSE_TEMPFAIL);
imts->callref = 0; imts->callref = 0;
@@ -546,7 +547,7 @@ void imts_signal_indication(imts_t *imts)
{ {
/* setup a call from mobile to base station */ /* setup a call from mobile to base station */
if (imts->mode == MODE_MTS && imts->state == IMTS_IDLE) { 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->callref = call_up_setup(NULL, imts->operator, OSMO_CC_NETWORK_MTS_NONE, "");
imts_new_state(imts, IMTS_CONVERSATION); imts_new_state(imts, IMTS_CONVERSATION);
imts_set_dsp_mode(imts, DSP_MODE_AUDIO, 0, 0.0, 0); imts_set_dsp_mode(imts, DSP_MODE_AUDIO, 0, 0.0, 0);
@@ -554,7 +555,7 @@ void imts_signal_indication(imts_t *imts)
/* answer a call from base station to mobile */ /* answer a call from base station to mobile */
if (imts->mode == MODE_MTS && imts->state == IMTS_RINGING) { 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); call_up_answer(imts->callref, imts->station_id);
imts_answer(imts); imts_answer(imts);
} }
@@ -564,26 +565,26 @@ void imts_signal_indication(imts_t *imts)
static void imts_receive_seize(imts_t *imts, int tone) static void imts_receive_seize(imts_t *imts, int tone)
{ {
/* other tone stops IDLE / GUARD timer */ /* other tone stops IDLE / GUARD timer */
timer_stop(&imts->timer); osmo_timer_del(&imts->timer);
switch (tone) { switch (tone) {
case TONE_IDLE: case TONE_IDLE:
case TONE_600: case TONE_600:
timer_start(&imts->timer, IDLE_DETECT); osmo_timer_schedule(&imts->timer, IDLE_DETECT);
break; break;
case TONE_GUARD: case TONE_GUARD:
imts->rx_guard_timestamp = get_time(); imts->rx_guard_timestamp = get_time();
if (imts->fast_seize) if (imts->fast_seize)
timer_start(&imts->timer, imts->fast_seize); osmo_timer_schedule(&imts->timer, 0,imts->fast_seize * 1000000);
break; break;
case TONE_CONNECT: case TONE_CONNECT:
if (imts->last_tone == TONE_GUARD && imts->rx_guard_duration >= GUARD_TIME) { 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"); LOGP_CHAN(DIMTS, LOGL_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, " -> 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_set_dsp_mode(imts, DSP_MODE_TONE, TONE_SILENCE, 0.0, 0);
imts_new_state(imts, IMTS_SEIZE); imts_new_state(imts, IMTS_SEIZE);
imts_activate_idle(); /* must activate another channel right after station is not idle anymore */ 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; break;
default: default:
@@ -604,34 +605,34 @@ static void imts_receive_ani(imts_t *imts, int tone)
imts->rx_ani_pulse++; imts->rx_ani_pulse++;
imts->rx_ani_totpulses++; imts->rx_ani_totpulses++;
if (imts->rx_ani_pulse > 10) { 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); imts_release(imts);
break; break;
} }
PDEBUG_CHAN(DIMTS, DEBUG_DEBUG, "Detected ANI pulse #%d.\n", imts->rx_ani_pulse); LOGP_CHAN(DIMTS, LOGL_DEBUG, "Detected ANI pulse #%d.\n", imts->rx_ani_pulse);
timer_start(&imts->timer, ANI_PULSE_TO); osmo_timer_schedule(&imts->timer, ANI_PULSE_TO);
break; break;
case TONE_GUARD: case TONE_GUARD:
/* even pulse completed */ /* even pulse completed */
if ((imts->rx_ani_totpulses & 1)) { 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); imts_release(imts);
break; break;
} }
timer_start(&imts->timer, ANI_PULSE_TO); osmo_timer_schedule(&imts->timer, ANI_PULSE_TO);
break; break;
case TONE_SILENCE: case TONE_SILENCE:
/* odd pulse completed */ /* odd pulse completed */
if (!(imts->rx_ani_totpulses & 1)) { 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); imts_release(imts);
break; break;
} }
timer_start(&imts->timer, ANI_PULSE_TO); osmo_timer_schedule(&imts->timer, ANI_PULSE_TO);
break; break;
default: default:
/* received noise */ /* 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); imts_release(imts);
} }
} }
@@ -647,23 +648,23 @@ static void imts_receive_dialing(imts_t *imts, int tone)
/* pulse detected */ /* pulse detected */
imts->rx_dial_pulse++; imts->rx_dial_pulse++;
if (imts->rx_dial_pulse > 10) { 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); imts_release(imts);
break; break;
} }
PDEBUG_CHAN(DIMTS, DEBUG_DEBUG, "Detected dialing pulse #%d.\n", imts->rx_dial_pulse); LOGP_CHAN(DIMTS, LOGL_DEBUG, "Detected dialing pulse #%d.\n", imts->rx_dial_pulse);
timer_start(&imts->timer, DIAL_PULSE_TO); osmo_timer_schedule(&imts->timer, DIAL_PULSE_TO);
break; break;
case TONE_GUARD: case TONE_GUARD:
/* pulse completed */ /* pulse completed */
if (imts->rx_dial_pulse) if (imts->rx_dial_pulse)
timer_start(&imts->timer, DIAL_PULSE_TO); osmo_timer_schedule(&imts->timer, DIAL_PULSE_TO);
break; break;
default: default:
; ;
#if 0 #if 0
/* received noise */ /* 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); imts_release(imts);
#endif #endif
} }
@@ -675,7 +676,7 @@ static void imts_receive_disconnect(imts_t *imts, int tone, double elapsed, doub
/* reset disc counter on timeout */ /* reset disc counter on timeout */
if (elapsed > DISC_PULSE_TO) { if (elapsed > DISC_PULSE_TO) {
if (imts->rx_disc_pulse) { 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; imts->rx_disc_pulse = 0;
} }
return; return;
@@ -684,11 +685,11 @@ static void imts_receive_disconnect(imts_t *imts, int tone, double elapsed, doub
switch (tone) { switch (tone) {
case TONE_DISCONNECT: case TONE_DISCONNECT:
imts->rx_disc_pulse++; 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; break;
case TONE_GUARD: case TONE_GUARD:
if (imts->rx_disc_pulse == DISC_COUNT) { 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 if (imts->state == IMTS_SEIZE
|| imts->state == IMTS_ANI || imts->state == IMTS_ANI
|| imts->state == IMTS_DIALING || imts->state == IMTS_DIALING
@@ -704,7 +705,7 @@ static void imts_receive_disconnect(imts_t *imts, int tone, double elapsed, doub
break; break;
default: default:
if (imts->rx_disc_pulse) { 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; imts->rx_disc_pulse = 0;
} }
} }
@@ -717,15 +718,15 @@ static void receive_page_imts(imts_t *imts, int tone)
case TONE_IDLE: case TONE_IDLE:
/* pulse detected */ /* pulse detected */
imts->rx_page_pulse++; 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) { 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; break;
case TONE_SEIZE: case TONE_SEIZE:
/* pulse completed */ /* 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; break;
default: default:
; ;
@@ -738,11 +739,11 @@ static void receive_page_mts(imts_t *imts, int tone)
if (tone == TONE_600 || tone == TONE_1500) { if (tone == TONE_600 || tone == TONE_1500) {
/* pulse detected */ /* pulse detected */
imts->rx_page_pulse++; 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) { 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 +785,12 @@ void imts_lost_tone(imts_t *imts, int tone, double elapsed)
{ {
switch (imts->state) { switch (imts->state) {
case IMTS_IDLE: case IMTS_IDLE:
timer_stop(&imts->timer); osmo_timer_del(&imts->timer);
imts->rx_guard_duration = elapsed; imts->rx_guard_duration = elapsed;
break; break;
case IMTS_PAGING: case IMTS_PAGING:
if (elapsed >= 0.300 && tone == TONE_GUARD && timer_running(&imts->timer)) { if (elapsed >= 0.300 && tone == TONE_GUARD && osmo_timer_pending(&imts->timer)) {
PDEBUG_CHAN(DIMTS, DEBUG_INFO, "Received acknowledge (Guard tone) from mobile phone (level %.0f%%).\n", imts->last_sigtone_amplitude * 100.0); 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); call_up_alerting(imts->callref);
imts_ringing(imts); imts_ringing(imts);
break; break;
@@ -797,7 +798,7 @@ void imts_lost_tone(imts_t *imts, int tone, double elapsed)
break; break;
case IMTS_RINGING: case IMTS_RINGING:
if (elapsed >= 0.190 && tone == TONE_CONNECT) { 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); call_up_answer(imts->callref, imts->station_id);
imts_answer(imts); imts_answer(imts);
break; break;
@@ -818,30 +819,30 @@ static void ani_after_digit(imts_t *imts)
imts->rx_ani_pulse = 0; imts->rx_ani_pulse = 0;
imts->station_id[imts->rx_ani_index] = imts->rx_ani_pulse + '0'; imts->station_id[imts->rx_ani_index] = imts->rx_ani_pulse + '0';
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'; imts->station_id[++imts->rx_ani_index] = '\0';
/* update status while receiving station ID */ /* update status while receiving station ID */
imts_display_status(); imts_display_status();
/* if all digits have been received */ /* if all digits have been received */
if (imts->rx_ani_index == 7) { 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: dt:
imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_DIALTONE, 0.0, 0); 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->dial_number[0] = '\0';
imts->rx_dial_index = 0; imts->rx_dial_index = 0;
imts->rx_dial_pulse = 0; imts->rx_dial_pulse = 0;
imts_new_state(imts, IMTS_DIALING); imts_new_state(imts, IMTS_DIALING);
return; return;
} }
timer_start(&imts->timer, ANI_TO); osmo_timer_schedule(&imts->timer, ANI_TO);
} else { } else {
/* if only 5 digits have been received */ /* if only 5 digits have been received */
if (imts->rx_ani_index == 5) { 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; 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); imts_release(imts);
} }
} }
@@ -850,7 +851,7 @@ static void dial_after_digit(imts_t *imts)
{ {
/* special case where nothing happens after dial tone */ /* special case where nothing happens after dial tone */
if (!imts->rx_dial_pulse && !imts->rx_dial_index) { 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); imts_release(imts);
return; return;
} }
@@ -860,7 +861,7 @@ static void dial_after_digit(imts_t *imts)
*/ */
if (imts->rx_dial_pulse) { if (imts->rx_dial_pulse) {
if (imts->rx_dial_index == sizeof(imts->dial_number) - 1) { 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); imts_release(imts);
return; return;
} }
@@ -868,11 +869,11 @@ static void dial_after_digit(imts_t *imts)
imts->rx_dial_pulse = 0; imts->rx_dial_pulse = 0;
imts->dial_number[imts->rx_dial_index] = imts->rx_dial_pulse + '0'; imts->dial_number[imts->rx_dial_index] = imts->rx_dial_pulse + '0';
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'; imts->dial_number[++imts->rx_dial_index] = '\0';
timer_start(&imts->timer, DIALING_TO); osmo_timer_schedule(&imts->timer, DIALING_TO);
} else { } 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->callref = call_up_setup(imts->station_id, imts->dial_number, OSMO_CC_NETWORK_IMTS_NONE, "");
imts_new_state(imts, IMTS_CONVERSATION); imts_new_state(imts, IMTS_CONVERSATION);
imts_set_dsp_mode(imts, DSP_MODE_AUDIO, 0, 0.0, 0); imts_set_dsp_mode(imts, DSP_MODE_AUDIO, 0, 0.0, 0);
@@ -892,7 +893,7 @@ static void page_after_digit(imts_t *imts)
imts->rx_page_pulse = 0; imts->rx_page_pulse = 0;
digit = imts->rx_page_pulse + '0'; digit = imts->rx_page_pulse + '0';
delay = get_time() - imts->tx_page_timestamp - PAGE_PULSE_TO; 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; imts->rx_page_pulse = 0;
} }
@@ -907,29 +908,29 @@ static void imts_timeout(void *data)
case IMTS_IDLE: case IMTS_IDLE:
switch (imts->last_tone) { switch (imts->last_tone) {
case TONE_IDLE: 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 */ /* trigger reset of decoder to force detection again and again */
imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_IDLE, 0.0, 1); imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_IDLE, 0.0, 1);
break; break;
case TONE_600: 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 */ /* trigger reset of decoder to force detection again and again */
imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_600, 0.0, 1); imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_600, 0.0, 1);
break; break;
case TONE_GUARD: 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); imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_SILENCE, 0.5, 0);
break; break;
} }
break; break;
case IMTS_PAGING: 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); imts_go_idle(imts);
call_up_release(imts->callref, CAUSE_OUTOFORDER); call_up_release(imts->callref, CAUSE_OUTOFORDER);
imts->callref = 0; imts->callref = 0;
break; break;
case IMTS_RINGING: 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); imts_release(imts);
call_up_release(imts->callref, CAUSE_NOANSWER); call_up_release(imts->callref, CAUSE_NOANSWER);
imts->callref = 0; imts->callref = 0;
@@ -938,9 +939,9 @@ static void imts_timeout(void *data)
imts_go_idle(imts); imts_go_idle(imts);
break; break;
case IMTS_SEIZE: 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); 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->station_id[0] = '\0';
imts->rx_ani_index = 0; imts->rx_ani_index = 0;
imts->rx_ani_pulse = 0; imts->rx_ani_pulse = 0;
@@ -973,7 +974,7 @@ static void paging_pulses_imts(imts_t *imts, int tone)
if (tone == TONE_SEIZE) { if (tone == TONE_SEIZE) {
if (imts->tx_page_pulse == 0) 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) */ /* send mark (pulse start) */
imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_IDLE, PAGE_MARK, 0); imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_IDLE, PAGE_MARK, 0);
imts->tx_page_pulse++; imts->tx_page_pulse++;
@@ -993,7 +994,7 @@ static void paging_pulses_imts(imts_t *imts, int tone)
duration = PAGE_PAUSE; duration = PAGE_PAUSE;
else { else {
duration = 0; 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); imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_SEIZE, duration, 0);
@@ -1015,7 +1016,7 @@ static void paging_pulses_mts(imts_t *imts, int tone)
tone = TONE_1500; tone = TONE_1500;
if (imts->tx_page_pulse == 0) { 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++; imts->tx_page_pulse++;
if (imts->tx_page_pulse < pulses) if (imts->tx_page_pulse < pulses)
@@ -1030,7 +1031,7 @@ static void paging_pulses_mts(imts_t *imts, int tone)
if (imts->station_id[imts->tx_page_index]) if (imts->station_id[imts->tx_page_index])
duration = PAGE_PAUSE; duration = PAGE_PAUSE;
else { 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; duration = 0;
imts_new_state(imts, IMTS_RINGING); imts_new_state(imts, IMTS_RINGING);
call_up_alerting(imts->callref); call_up_alerting(imts->callref);
@@ -1044,7 +1045,7 @@ static void ringing_pulses(imts_t *imts, int tone)
{ {
if (tone == TONE_IDLE) { if (tone == TONE_IDLE) {
if (imts->tx_ring_pulse == 0) 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) */ /* send space (pulse end) */
imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_SEIZE, RING_SPACE, 0); imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_SEIZE, RING_SPACE, 0);
imts->tx_ring_pulse++; imts->tx_ring_pulse++;
@@ -1053,7 +1054,7 @@ static void ringing_pulses(imts_t *imts, int tone)
/* send mark (pulse start) */ /* send mark (pulse start) */
imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_IDLE, RING_MARK, 0); imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_IDLE, RING_MARK, 0);
} else { } 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 */ /* send long space after last pulse */
imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_SEIZE, RING_OFF, 0); imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_SEIZE, RING_OFF, 0);
imts->tx_ring_pulse = 0; imts->tx_ring_pulse = 0;
@@ -1077,21 +1078,21 @@ static void detector_test_imts(imts_t *imts, int tone)
tone_idle: tone_idle:
if (imts->detector_test_length_1 <= 0) if (imts->detector_test_length_1 <= 0)
goto tone_seize; 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); imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_IDLE, imts->detector_test_length_1, 0);
break; break;
case TONE_IDLE: case TONE_IDLE:
tone_seize: tone_seize:
if (imts->detector_test_length_2 <= 0) if (imts->detector_test_length_2 <= 0)
goto tone_silence; 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); imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_SEIZE, imts->detector_test_length_2, 0);
break; break;
case TONE_SEIZE: case TONE_SEIZE:
tone_silence: tone_silence:
if (imts->detector_test_length_3 <= 0) if (imts->detector_test_length_3 <= 0)
goto tone_idle; 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); imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_SILENCE, imts->detector_test_length_3, 0);
break; break;
} }
@@ -1103,21 +1104,21 @@ static void detector_test_mts(imts_t *imts, int tone)
tone_idle: tone_idle:
if (imts->detector_test_length_1 <= 0) if (imts->detector_test_length_1 <= 0)
goto tone_seize; 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); imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_600, imts->detector_test_length_1, 0);
break; break;
case TONE_600: case TONE_600:
tone_seize: tone_seize:
if (imts->detector_test_length_2 <= 0) if (imts->detector_test_length_2 <= 0)
goto tone_silence; 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); imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_1500, imts->detector_test_length_2, 0);
break; break;
case TONE_1500: case TONE_1500:
tone_silence: tone_silence:
if (imts->detector_test_length_3 <= 0) if (imts->detector_test_length_3 <= 0)
goto tone_idle; 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); imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_SILENCE, imts->detector_test_length_3, 0);
break; break;
} }
@@ -1128,7 +1129,7 @@ void imts_tone_sent(imts_t *imts, int tone)
{ {
switch (imts->state) { switch (imts->state) {
case IMTS_IDLE: 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); imts_set_dsp_mode(imts, DSP_MODE_TONE, TONE_IDLE, 0.0, 0);
break; break;
case IMTS_ANI: case IMTS_ANI:
@@ -1172,7 +1173,7 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
break; break;
} }
if (sender) { 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; return -CAUSE_BUSY;
} }
@@ -1183,7 +1184,7 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
break; break;
} }
if (!sender) { 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; return -CAUSE_NOCHANNEL;
} }
@@ -1195,7 +1196,7 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
} }
/* 4. trying to page mobile station */ /* 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->callref = callref;
imts_paging(imts, dialing, 0); imts_paging(imts, dialing, 0);
@@ -1215,7 +1216,7 @@ void call_down_disconnect(int callref, int cause)
sender_t *sender; sender_t *sender;
imts_t *imts; 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) { for (sender = sender_head; sender; sender = sender->next) {
imts = (imts_t *) sender; imts = (imts_t *) sender;
@@ -1223,7 +1224,7 @@ void call_down_disconnect(int callref, int cause)
break; break;
} }
if (!sender) { 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); call_up_release(callref, CAUSE_INVALCALLREF);
return; return;
} }
@@ -1234,7 +1235,7 @@ void call_down_disconnect(int callref, int cause)
switch (imts->state) { switch (imts->state) {
case IMTS_PAGING: case IMTS_PAGING:
case IMTS_RINGING: 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); imts_release(imts);
break; break;
default: default:
@@ -1253,7 +1254,7 @@ void call_down_release(int callref, __attribute__((unused)) int cause)
sender_t *sender; sender_t *sender;
imts_t *imts; 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) { for (sender = sender_head; sender; sender = sender->next) {
imts = (imts_t *) sender; imts = (imts_t *) sender;
@@ -1261,7 +1262,7 @@ void call_down_release(int callref, __attribute__((unused)) int cause)
break; break;
} }
if (!sender) { 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 */ /* don't send release, because caller already released */
return; return;
} }
@@ -1270,12 +1271,12 @@ void call_down_release(int callref, __attribute__((unused)) int cause)
switch (imts->state) { switch (imts->state) {
case IMTS_CONVERSATION: 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); imts_release(imts);
break; break;
case IMTS_PAGING: case IMTS_PAGING:
case IMTS_RINGING: 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); imts_release(imts);
break; break;
default: default:
+1 -1
View File
@@ -61,7 +61,7 @@ typedef struct imts {
int callref; /* call reference */ int callref; /* call reference */
char station_id[11]; /* current station ID (also used for test pattern) */ char station_id[11]; /* current station ID (also used for test pattern) */
char dial_number[33]; /* number dialing */ char dial_number[33]; /* number dialing */
struct timer timer; struct osmo_timer_list timer;
int last_tone; /* last tone received */ int last_tone; /* last tone received */
double last_sigtone_amplitude; /* amplitude of last signaling tone received */ double last_sigtone_amplitude; /* amplitude of last signaling tone received */
double fast_seize; /* fast seize: guard-length - roundtrip-delay */ double fast_seize; /* fast seize: guard-length - roundtrip-delay */
+3 -2
View File
@@ -25,8 +25,8 @@
#include <math.h> #include <math.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libmobile/main_mobile.h" #include "../libmobile/main_mobile.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "../libtimer/timer.h" #include <osmocom/core/timer.h>
#include "../libmobile/call.h" #include "../libmobile/call.h"
#include "../liboptions/options.h" #include "../liboptions/options.h"
#include "../amps/tones.h" #include "../amps/tones.h"
@@ -279,6 +279,7 @@ fail:
imts_destroy(sender_head); imts_destroy(sender_head);
/* exits */ /* exits */
main_mobile_exit();
fm_exit(); fm_exit();
options_free(); options_free();
+3 -5
View File
@@ -12,23 +12,21 @@ jollycom_LDADD = \
$(COMMON_LA) \ $(COMMON_LA) \
../anetz/libgermanton.a \ ../anetz/libgermanton.a \
$(top_builddir)/src/liboptions/liboptions.a \ $(top_builddir)/src/liboptions/liboptions.a \
$(top_builddir)/src/libdebug/libdebug.a \
$(top_builddir)/src/libmobile/libmobile.a \ $(top_builddir)/src/libmobile/libmobile.a \
$(top_builddir)/src/libosmocc/libosmocc.a \
$(top_builddir)/src/libdisplay/libdisplay.a \ $(top_builddir)/src/libdisplay/libdisplay.a \
$(top_builddir)/src/libjitter/libjitter.a \ $(top_builddir)/src/libjitter/libjitter.a \
$(top_builddir)/src/libsquelch/libsquelch.a \ $(top_builddir)/src/libsquelch/libsquelch.a \
$(top_builddir)/src/libdtmf/libdtmf.a \ $(top_builddir)/src/libdtmf/libdtmf.a \
$(top_builddir)/src/libtimer/libtimer.a \
$(top_builddir)/src/libselect/libselect.a \
$(top_builddir)/src/libsamplerate/libsamplerate.a \ $(top_builddir)/src/libsamplerate/libsamplerate.a \
$(top_builddir)/src/libemphasis/libemphasis.a \ $(top_builddir)/src/libemphasis/libemphasis.a \
$(top_builddir)/src/libfilter/libfilter.a \ $(top_builddir)/src/libfilter/libfilter.a \
$(top_builddir)/src/libwave/libwave.a \ $(top_builddir)/src/libwave/libwave.a \
$(top_builddir)/src/libsample/libsample.a \ $(top_builddir)/src/libsample/libsample.a \
$(top_builddir)/src/libfm/libfm.a \ $(top_builddir)/src/libfm/libfm.a \
$(top_builddir)/src/libg711/libg711.a \
$(top_builddir)/src/libaaimage/libaaimage.a \ $(top_builddir)/src/libaaimage/libaaimage.a \
$(top_builddir)/src/liblogging/liblogging.a \
$(LIBOSMOCORE_LIBS) \
$(LIBOSMOCC_LIBS) \
-lm -lm
if HAVE_ALSA if HAVE_ALSA
+13 -13
View File
@@ -27,8 +27,8 @@
#include <math.h> #include <math.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libtimer/timer.h" #include <osmocom/core/timer.h>
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "../libmobile/call.h" #include "../libmobile/call.h"
#include "jolly.h" #include "jolly.h"
#include "dsp.h" #include "dsp.h"
@@ -63,7 +63,7 @@ void dsp_init(void)
int i; int i;
double s; double s;
PDEBUG(DDSP, DEBUG_DEBUG, "Generating sine tables.\n"); LOGP(DDSP, LOGL_DEBUG, "Generating sine tables.\n");
for (i = 0; i < 65536; i++) { for (i = 0; i < 65536; i++) {
s = sin((double)i / 65536.0 * 2.0 * M_PI); s = sin((double)i / 65536.0 * 2.0 * M_PI);
dsp_info_tone[i] = s * TX_INFO_TONE; dsp_info_tone[i] = s * TX_INFO_TONE;
@@ -92,7 +92,7 @@ int dsp_init_sender(jolly_t *jolly, int nbfm, double squelch_db, int repeater)
* also we allow a minimum of -30 dB for each tone. */ * 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));
if (rc < 0) { 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; goto error;
} }
@@ -106,7 +106,7 @@ 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_max = (int)((double)jolly->sender.samplerate * DELAY_TIME);
jolly->delay_spl = calloc(jolly->delay_max, sizeof(*jolly->delay_spl)); jolly->delay_spl = calloc(jolly->delay_max, sizeof(*jolly->delay_spl));
if (!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; goto error;
} }
@@ -115,7 +115,7 @@ int dsp_init_sender(jolly_t *jolly, int nbfm, double squelch_db, int repeater)
jolly->repeater_max = (int)((double)jolly->sender.samplerate * REPEATER_TIME); 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, sizeof(sample_t), 0.050, 0.500, JITTER_FLAG_NONE);
if (rc < 0) { 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; goto error;
} }
@@ -174,25 +174,25 @@ again:
spl = jolly_voice.spl[10]; spl = jolly_voice.spl[10];
size = jolly_voice.size[10]; size = jolly_voice.size[10];
if (!jolly->speech_pos) if (!jolly->speech_pos)
PDEBUG(DDSP, DEBUG_DEBUG, "speaking 'incoming'.\n"); LOGP(DDSP, LOGL_DEBUG, "speaking 'incoming'.\n");
break; break;
case 'o': case 'o':
spl = jolly_voice.spl[11]; spl = jolly_voice.spl[11];
size = jolly_voice.size[11]; size = jolly_voice.size[11];
if (!jolly->speech_pos) if (!jolly->speech_pos)
PDEBUG(DDSP, DEBUG_DEBUG, "speaking 'outgoing'.\n"); LOGP(DDSP, LOGL_DEBUG, "speaking 'outgoing'.\n");
break; break;
case 'r': case 'r':
spl = jolly_voice.spl[12]; spl = jolly_voice.spl[12];
size = jolly_voice.size[12]; size = jolly_voice.size[12];
if (!jolly->speech_pos) if (!jolly->speech_pos)
PDEBUG(DDSP, DEBUG_DEBUG, "speaking 'released'.\n"); LOGP(DDSP, LOGL_DEBUG, "speaking 'released'.\n");
break; break;
case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': 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']; spl = jolly_voice.spl[jolly->speech_string[jolly->speech_digit] - '0'];
size = jolly_voice.size[jolly->speech_string[jolly->speech_digit] - '0']; size = jolly_voice.size[jolly->speech_string[jolly->speech_digit] - '0'];
if (!jolly->speech_pos) 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; break;
default: default:
jolly->speech_digit++; 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_LOSS:
case SQUELCH_MUTE: case SQUELCH_MUTE:
if (!jolly->is_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->ack_count = jolly->ack_max;
jolly->repeater_count = jolly->repeater_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; break;
default: default:
if (jolly->is_mute) 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; jolly->is_mute = 0;
break; break;
} }
@@ -355,7 +355,7 @@ void sender_send(sender_t *sender, sample_t *samples, uint8_t *power, int length
if (jolly->repeater_count) { if (jolly->repeater_count) {
jolly->repeater_count -= length; jolly->repeater_count -= length;
if (jolly->repeater_count < 0) { 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; jolly->repeater_count = 0;
} }
} }
+69 -69
View File
@@ -134,11 +134,11 @@
#include <errno.h> #include <errno.h>
#include <math.h> #include <math.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "../libtimer/timer.h" #include <osmocom/core/timer.h>
#include "../libmobile/call.h" #include "../libmobile/call.h"
#include "../libmobile/cause.h" #include "../libmobile/cause.h"
#include "../libosmocc/message.h" #include <osmocom/cc/message.h>
#include "jolly.h" #include "jolly.h"
#include "dsp.h" #include "dsp.h"
#include "voice.h" #include "voice.h"
@@ -146,12 +146,12 @@
#define db2level(db) pow(10, (double)db / 20.0) #define db2level(db) pow(10, (double)db / 20.0)
/* Timers */ /* Timers */
#define T_DIAL 6 /* Time between digits */ #define T_DIAL 6,0 /* Time between digits */
#define T_DIAL2 1.5 /* Time between digits during call*/ #define T_DIAL2 1,500000 /* Time between digits during call*/
#define T_PAGING 30 /* How long do we page the mobile party */ #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_PAGING 1,0 /* time before speaking paging sequence */
#define SPEECH_DELAY_VERIFY 2.0 /* time before speaking verifying sequence */ #define SPEECH_DELAY_VERIFY 2,0 /* time before speaking verifying sequence */
#define SPEECH_DELAY_RELEASE 2.0/* time before speaking release sequence */ #define SPEECH_DELAY_RELEASE 2,0 /* time before speaking release sequence */
const char *jolly_state_name(enum jolly_state state) const char *jolly_state_name(enum jolly_state state)
{ {
@@ -199,7 +199,7 @@ static void jolly_new_state(jolly_t *jolly, enum jolly_state new_state)
{ {
if (jolly->state == new_state) if (jolly->state == new_state)
return; 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->state = new_state;
jolly_display_status(); jolly_display_status();
} }
@@ -216,11 +216,11 @@ int jolly_create(const char *kanal, double dl_freq, double ul_freq, double step,
jolly = calloc(1, sizeof(jolly_t)); jolly = calloc(1, sizeof(jolly_t));
if (!jolly) { if (!jolly) {
PDEBUG(DJOLLY, DEBUG_ERROR, "No memory!\n"); LOGP(DJOLLY, LOGL_ERROR, "No memory!\n");
return -EIO; 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); dl_freq = dl_freq * 1e6 + step * 1e3 * (double)atoi(kanal);
ul_freq = ul_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 */ /* 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); 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) { 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; goto error;
} }
/* init audio processing */ /* init audio processing */
rc = dsp_init_sender(jolly, nbfm, squelch_db, repeater); rc = dsp_init_sender(jolly, nbfm, squelch_db, repeater);
if (rc < 0) { 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; goto error;
} }
/* timers */ /* timers */
timer_init(&jolly->timer, jolly_timeout, jolly); osmo_timer_setup(&jolly->timer, jolly_timeout, jolly);
timer_init(&jolly->speech_timer, jolly_speech_timeout, jolly); osmo_timer_setup(&jolly->speech_timer, jolly_speech_timeout, jolly);
/* go into idle state */ /* go into idle state */
jolly_go_idle(jolly); jolly_go_idle(jolly);
PDEBUG(DJOLLY, DEBUG_NOTICE, "Created 'Kanal' #%s\n", kanal); LOGP(DJOLLY, LOGL_NOTICE, "Created 'Kanal' #%s\n", kanal);
return 0; return 0;
@@ -261,11 +261,11 @@ void jolly_destroy(sender_t *sender)
{ {
jolly_t *jolly = (jolly_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); dsp_cleanup_sender(jolly);
timer_exit(&jolly->timer); osmo_timer_del(&jolly->timer);
timer_exit(&jolly->speech_timer); osmo_timer_del(&jolly->speech_timer);
sender_destroy(&jolly->sender); sender_destroy(&jolly->sender);
free(sender); free(sender);
} }
@@ -273,11 +273,11 @@ void jolly_destroy(sender_t *sender)
/* Abort connection towards mobile station changing to IDLE state */ /* Abort connection towards mobile station changing to IDLE state */
static void jolly_go_idle(jolly_t *jolly) static void jolly_go_idle(jolly_t *jolly)
{ {
timer_stop(&jolly->timer); osmo_timer_del(&jolly->timer);
timer_stop(&jolly->speech_timer); osmo_timer_del(&jolly->speech_timer);
reset_speech_string(jolly); 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->dialing[0] = '\0';
jolly->station_id[0] = '\0'; /* remove station ID before state change, so status is shown correctly */ jolly->station_id[0] = '\0'; /* remove station ID before state change, so status is shown correctly */
jolly_new_state(jolly, STATE_IDLE); 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. */ /* Release connection towards mobile station by sending idle tone for a while. */
static void jolly_release(jolly_t *jolly) static void jolly_release(jolly_t *jolly)
{ {
timer_stop(&jolly->timer); osmo_timer_del(&jolly->timer);
timer_stop(&jolly->speech_timer); osmo_timer_del(&jolly->speech_timer);
reset_speech_string(jolly); reset_speech_string(jolly);
PDEBUG(DJOLLY, DEBUG_INFO, "Sending Release sequence on channel %s.\n", jolly->sender.kanal); LOGP(DJOLLY, LOGL_INFO, "Sending Release sequence on channel %s.\n", jolly->sender.kanal);
timer_start(&jolly->speech_timer, SPEECH_DELAY_RELEASE); osmo_timer_schedule(&jolly->speech_timer, SPEECH_DELAY_RELEASE);
jolly_new_state(jolly, STATE_RELEASED); jolly_new_state(jolly, STATE_RELEASED);
} }
/* Enter paging state and transmit 4 paging tones. */ /* Enter paging state and transmit 4 paging tones. */
static void jolly_page(jolly_t *jolly, const char *dial_string) 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 */ /* set station ID before state change, so status is shown correctly */
strncpy(jolly->station_id, dial_string, sizeof(jolly->station_id) - 1); strncpy(jolly->station_id, dial_string, sizeof(jolly->station_id) - 1);
timer_start(&jolly->timer, T_PAGING); osmo_timer_schedule(&jolly->timer, T_PAGING);
timer_start(&jolly->speech_timer, SPEECH_DELAY_PAGING); osmo_timer_schedule(&jolly->speech_timer, SPEECH_DELAY_PAGING);
jolly_new_state(jolly, STATE_IN_PAGING); jolly_new_state(jolly, STATE_IN_PAGING);
} }
void speech_finished(jolly_t *jolly) void speech_finished(jolly_t *jolly)
{ {
PDEBUG(DJOLLY, DEBUG_DEBUG, "speaking finished.\n"); LOGP(DJOLLY, LOGL_DEBUG, "speaking finished.\n");
switch (jolly->state) { switch (jolly->state) {
case STATE_OUT_VERIFY: case STATE_OUT_VERIFY:
timer_start(&jolly->timer, T_DIAL); osmo_timer_schedule(&jolly->timer, T_DIAL);
break; break;
case STATE_IN_PAGING: case STATE_IN_PAGING:
timer_start(&jolly->speech_timer, SPEECH_DELAY_PAGING); osmo_timer_schedule(&jolly->speech_timer, SPEECH_DELAY_PAGING);
break; break;
case STATE_RELEASED: case STATE_RELEASED:
jolly_go_idle(jolly); 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; 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, digit,
meas->frequency_low, meas->frequency_high, meas->frequency_low, meas->frequency_high,
level2db(meas->amplitude_low), level2db(meas->amplitude_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) { switch (jolly->state) {
case STATE_IDLE: case STATE_IDLE:
if (digit == '*') { 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'; jolly->dialing[0] = '\0';
timer_start(&jolly->timer, T_DIAL); osmo_timer_schedule(&jolly->timer, T_DIAL);
jolly_new_state(jolly, STATE_OUT_DIALING); jolly_new_state(jolly, STATE_OUT_DIALING);
break; break;
} }
break; break;
case STATE_OUT_DIALING: case STATE_OUT_DIALING:
if (digit == '*') { 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'; jolly->dialing[0] = '\0';
timer_start(&jolly->timer, T_DIAL); osmo_timer_schedule(&jolly->timer, T_DIAL);
break; break;
} }
if (digit >= '0' && digit <= '9' && strlen(jolly->dialing) < sizeof(jolly->dialing) - 1) { 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) + 1] = '\0';
jolly->dialing[strlen(jolly->dialing)] = digit; jolly->dialing[strlen(jolly->dialing)] = digit;
timer_start(&jolly->timer, T_DIAL); osmo_timer_schedule(&jolly->timer, T_DIAL);
break; break;
} }
if (digit == '#') { if (digit == '#') {
timer_stop(&jolly->timer); osmo_timer_del(&jolly->timer);
if (!jolly->dialing[0]) { 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); jolly_go_idle(jolly);
break; break;
} }
PDEBUG_CHAN(DJOLLY, DEBUG_INFO, "Received stop digit, entering verify state.\n"); LOGP_CHAN(DJOLLY, LOGL_INFO, "Received stop digit, entering verify state.\n");
timer_start(&jolly->speech_timer, SPEECH_DELAY_VERIFY); osmo_timer_schedule(&jolly->speech_timer, SPEECH_DELAY_VERIFY);
jolly_new_state(jolly, STATE_OUT_VERIFY); jolly_new_state(jolly, STATE_OUT_VERIFY);
break; break;
} }
break; break;
case STATE_OUT_VERIFY: case STATE_OUT_VERIFY:
if (digit == '*') { 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); reset_speech_string(jolly);
jolly->dialing[0] = '\0'; jolly->dialing[0] = '\0';
timer_start(&jolly->timer, T_DIAL); osmo_timer_schedule(&jolly->timer, T_DIAL);
jolly_new_state(jolly, STATE_OUT_DIALING); jolly_new_state(jolly, STATE_OUT_DIALING);
break; break;
} }
if (digit == '#') { if (digit == '#') {
PDEBUG_CHAN(DJOLLY, DEBUG_INFO, "Received ack digit, entering call state.\n"); LOGP_CHAN(DJOLLY, LOGL_INFO, "Received ack digit, entering call state.\n");
timer_stop(&jolly->timer); osmo_timer_del(&jolly->timer);
jolly->callref = call_up_setup(NULL, jolly->dialing, OSMO_CC_NETWORK_JOLLYCOM_NONE, ""); jolly->callref = call_up_setup(NULL, jolly->dialing, OSMO_CC_NETWORK_JOLLYCOM_NONE, "");
jolly_new_state(jolly, STATE_CALL); jolly_new_state(jolly, STATE_CALL);
} }
break; break;
case STATE_CALL: case STATE_CALL:
if (digit == '*') { 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'; jolly->dialing[0] = '\0';
timer_start(&jolly->timer, T_DIAL2); osmo_timer_schedule(&jolly->timer, T_DIAL2);
jolly_new_state(jolly, STATE_CALL_DIALING); jolly_new_state(jolly, STATE_CALL_DIALING);
break; break;
} }
break; break;
case STATE_CALL_DIALING: case STATE_CALL_DIALING:
if (digit == '#') { 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); call_up_release(jolly->callref, CAUSE_NORMAL);
jolly->callref = 0; jolly->callref = 0;
jolly_release(jolly); jolly_release(jolly);
@@ -413,7 +413,7 @@ void jolly_receive_dtmf(void *priv, char digit, dtmf_meas_t *meas)
break; break;
case STATE_IN_PAGING: case STATE_IN_PAGING:
if (digit == '#') { 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); call_up_answer(jolly->callref, jolly->station_id);
jolly_new_state(jolly, STATE_CALL); jolly_new_state(jolly, STATE_CALL);
break; break;
@@ -431,19 +431,19 @@ static void jolly_timeout(void *data)
switch (jolly->state) { switch (jolly->state) {
case STATE_OUT_DIALING: 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); jolly_go_idle(jolly);
break; break;
case STATE_OUT_VERIFY: 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); jolly_go_idle(jolly);
break; break;
case STATE_CALL_DIALING: 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); jolly_new_state(jolly, STATE_CALL);
break; break;
case STATE_IN_PAGING: 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); call_up_release(jolly->callref, CAUSE_NOANSWER);
jolly->callref = 0; jolly->callref = 0;
jolly_go_idle(jolly); jolly_go_idle(jolly);
@@ -459,15 +459,15 @@ static void jolly_speech_timeout(void *data)
switch (jolly->state) { switch (jolly->state) {
case STATE_OUT_VERIFY: 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); set_speech_string(jolly, 'o', jolly->dialing);
break; break;
case STATE_IN_PAGING: 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); set_speech_string(jolly, 'i', jolly->station_id);
break; break;
case STATE_RELEASED: 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', ""); set_speech_string(jolly, 'r', "");
default: default:
break; break;
@@ -487,7 +487,7 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
break; break;
} }
if (sender) { 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; return -CAUSE_BUSY;
} }
@@ -498,11 +498,11 @@ int call_down_setup(int callref, const char __attribute__((unused)) *caller_id,
break; break;
} }
if (!sender) { 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; 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 */ /* 3. trying to page mobile station */
jolly->callref = callref; jolly->callref = callref;
@@ -526,7 +526,7 @@ void call_down_disconnect(int callref, int cause)
sender_t *sender; sender_t *sender;
jolly_t *jolly; 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) { for (sender = sender_head; sender; sender = sender->next) {
jolly = (jolly_t *) sender; jolly = (jolly_t *) sender;
@@ -534,7 +534,7 @@ void call_down_disconnect(int callref, int cause)
break; break;
} }
if (!sender) { 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); call_up_release(callref, CAUSE_INVALCALLREF);
return; return;
} }
@@ -544,7 +544,7 @@ void call_down_disconnect(int callref, int cause)
return; return;
switch (jolly->state) { switch (jolly->state) {
case STATE_IN_PAGING: 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); jolly_go_idle(jolly);
break; break;
default: default:
@@ -563,7 +563,7 @@ void call_down_release(int callref, __attribute__((unused)) int cause)
sender_t *sender; sender_t *sender;
jolly_t *jolly; 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) { for (sender = sender_head; sender; sender = sender->next) {
jolly = (jolly_t *) sender; jolly = (jolly_t *) sender;
@@ -571,7 +571,7 @@ void call_down_release(int callref, __attribute__((unused)) int cause)
break; break;
} }
if (!sender) { 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 */ /* don't send release, because caller already released */
return; return;
} }
@@ -581,11 +581,11 @@ void call_down_release(int callref, __attribute__((unused)) int cause)
switch (jolly->state) { switch (jolly->state) {
case STATE_CALL: case STATE_CALL:
case STATE_CALL_DIALING: 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); jolly_release(jolly);
break; break;
case STATE_IN_PAGING: 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); jolly_go_idle(jolly);
break; break;
default: default:
+2 -2
View File
@@ -21,7 +21,7 @@ typedef struct jolly {
int callref; /* call reference */ int callref; /* call reference */
char station_id[32]; /* current station ID */ char station_id[32]; /* current station ID */
char dialing[32]; /* dial string */ char dialing[32]; /* dial string */
struct timer timer; struct osmo_timer_list timer;
/* display measurements */ /* display measurements */
dispmeasparam_t *dmp_dtmf_low; dispmeasparam_t *dmp_dtmf_low;
@@ -41,7 +41,7 @@ typedef struct jolly {
double ack_phase65536; /* current phase */ double ack_phase65536; /* current phase */
int ack_count; /* counter to count down while playing ack tone */ int ack_count; /* counter to count down while playing ack tone */
int ack_max; /* duration in samples */ int ack_max; /* duration in samples */
struct timer speech_timer; struct osmo_timer_list speech_timer;
char speech_string[40]; /* speech string */ char speech_string[40]; /* speech string */
int speech_digit; /* counts digits */ int speech_digit; /* counts digits */
int speech_pos; /* counts samples */ int speech_pos; /* counts samples */
+3 -2
View File
@@ -29,8 +29,8 @@
#include <sys/stat.h> #include <sys/stat.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libmobile/main_mobile.h" #include "../libmobile/main_mobile.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "../libtimer/timer.h" #include <osmocom/core/timer.h>
#include "../anetz/freiton.h" #include "../anetz/freiton.h"
#include "../anetz/besetztton.h" #include "../anetz/besetztton.h"
#include "../liboptions/options.h" #include "../liboptions/options.h"
@@ -210,6 +210,7 @@ fail:
jolly_destroy(sender_head); jolly_destroy(sender_head);
/* exits */ /* exits */
main_mobile_exit();
fm_exit(); fm_exit();
options_free(); options_free();
-7
View File
@@ -1,7 +0,0 @@
AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
noinst_LIBRARIES = libdebug.a
libdebug_a_SOURCES = \
debug.c
-331
View File
@@ -1,331 +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" },
{ "r1", "\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;
}
-94
View File
@@ -1,94 +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 DR1 44
#define DISDN 45
#define DMISDN 46
#define DDSS1 47
#define DSIP 48
#define DTEL 49
#define DUK0 50
#define DPH 51
#define DDCF77 52
#define DJITTER 53
//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);
#define LOGP PDEBUG
#define LOGL_DEBUG DEBUG_DEBUG
#define LOGL_INFO DEBUG_INFO
#define LOGL_NOTICE DEBUG_NOTICE
#define LOGL_ERROR DEBUG_ERROR
#define osmo_hexdump debug_hex
+11 -9
View File
@@ -24,7 +24,7 @@
#include <pthread.h> #include <pthread.h>
#include <stdlib.h> #include <stdlib.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "../libdisplay/display.h" #include "../libdisplay/display.h"
/* must be odd value! */ /* must be odd value! */
@@ -60,14 +60,16 @@ void display_iq_on(int on)
if (iq_on) { if (iq_on) {
memset(&screen, ' ', sizeof(screen)); memset(&screen, ' ', sizeof(screen));
memset(&screen_history, 0, sizeof(screen_history)); memset(&screen_history, 0, sizeof(screen_history));
lock_debug(); lock_logging();
enable_limit_scroll(false);
printf("\0337\033[H"); printf("\0337\033[H");
for (j = 0; j < SIZE; j++) { for (j = 0; j < SIZE; j++) {
screen[j][w] = '\0'; screen[j][w] = '\0';
puts(screen[j]); puts(screen[j]);
} }
printf("\0338"); fflush(stdout); printf("\0338"); fflush(stdout);
unlock_debug(); enable_limit_scroll(true);
unlock_logging();
} }
if (on < 0) { if (on < 0) {
@@ -77,9 +79,9 @@ void display_iq_on(int on)
iq_on = on; iq_on = on;
if (iq_on) if (iq_on)
debug_limit_scroll = SIZE; logging_limit_scroll_top(SIZE);
else else
debug_limit_scroll = 0; logging_limit_scroll_top(0);
} }
/* /*
@@ -116,8 +118,6 @@ void display_iq(float *samples, int length)
if (!iq_on) if (!iq_on)
return; return;
lock_debug();
get_win_size(&width, &h); get_win_size(&width, &h);
if (width > MAX_DISPLAY_WIDTH - 1) if (width > MAX_DISPLAY_WIDTH - 1)
width = MAX_DISPLAY_WIDTH - 1; width = MAX_DISPLAY_WIDTH - 1;
@@ -235,6 +235,8 @@ cont:
else else
sprintf(screen[0], "(IQ log %.0f dB", db); sprintf(screen[0], "(IQ log %.0f dB", db);
*strchr(screen[0], '\0') = ')'; *strchr(screen[0], '\0') = ')';
lock_logging();
enable_limit_scroll(false);
printf("\0337\033[H"); printf("\0337\033[H");
for (j = 0; j < SIZE; j++) { for (j = 0; j < SIZE; j++) {
for (k = 0; k < width; k++) { for (k = 0; k < width; k++) {
@@ -271,12 +273,12 @@ cont:
} }
/* reset color and position */ /* reset color and position */
printf("\033[0;39m\0338"); fflush(stdout); printf("\033[0;39m\0338"); fflush(stdout);
enable_limit_scroll(true);
unlock_logging();
} }
} }
disp.interval_pos = pos; disp.interval_pos = pos;
unlock_debug();
} }
+8 -8
View File
@@ -26,7 +26,7 @@
#include <math.h> #include <math.h>
#include <sys/param.h> #include <sys/param.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "../libdisplay/display.h" #include "../libdisplay/display.h"
#define MAX_NAME_LEN 16 #define MAX_NAME_LEN 16
@@ -111,10 +111,10 @@ static void print_measurements(int on)
if (bar_width < 1) if (bar_width < 1)
return; return;
lock_debug();
lines_total = 0; lines_total = 0;
color = -1; color = -1;
lock_logging();
enable_limit_scroll(false);
printf("\0337\033[H"); printf("\0337\033[H");
for (disp = meas_head; disp; disp = disp->next) { for (disp = meas_head; disp; disp = disp->next) {
memset(line, ' ', width); memset(line, ' ', width);
@@ -253,10 +253,10 @@ static void print_measurements(int on)
} }
/* reset color and position */ /* reset color and position */
printf("\033[0;39m\0338"); fflush(stdout); printf("\033[0;39m\0338"); fflush(stdout);
enable_limit_scroll(true);
debug_limit_scroll = lines_total; unlock_logging();
/* Set new limit. */
unlock_debug(); logging_limit_scroll_top(lines_total);
} }
void display_measurements_on(int on) void display_measurements_on(int on)
@@ -269,7 +269,7 @@ void display_measurements_on(int on)
else else
measurements_on = on; measurements_on = on;
debug_limit_scroll = 0; logging_limit_scroll_top(0);
} }
/* add new parameter on startup to the list of measurements */ /* add new parameter on startup to the list of measurements */
+11 -10
View File
@@ -24,7 +24,7 @@
#include <math.h> #include <math.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libfft/fft.h" #include "../libfft/fft.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "../libdisplay/display.h" #include "../libdisplay/display.h"
#define HEIGHT 20 #define HEIGHT 20
@@ -101,14 +101,16 @@ void display_spectrum_on(int on)
if (spectrum_on) { if (spectrum_on) {
memset(&screen, ' ', sizeof(screen)); memset(&screen, ' ', sizeof(screen));
memset(&buffer_hold, 0, sizeof(buffer_hold)); memset(&buffer_hold, 0, sizeof(buffer_hold));
lock_debug(); lock_logging();
enable_limit_scroll(false);
printf("\0337\033[H"); printf("\0337\033[H");
for (j = 0; j < HEIGHT; j++) { for (j = 0; j < HEIGHT; j++) {
screen[j][w] = '\0'; screen[j][w] = '\0';
puts(screen[j]); puts(screen[j]);
} }
printf("\0338"); fflush(stdout); printf("\0338"); fflush(stdout);
unlock_debug(); enable_limit_scroll(true);
unlock_logging();
} }
if (on < 0) { if (on < 0) {
@@ -118,9 +120,9 @@ void display_spectrum_on(int on)
spectrum_on = on; spectrum_on = on;
if (spectrum_on) if (spectrum_on)
debug_limit_scroll = HEIGHT; logging_limit_scroll_top(HEIGHT);
else else
debug_limit_scroll = 0; logging_limit_scroll_top(0);
} }
/* /*
@@ -142,8 +144,6 @@ void display_spectrum(float *samples, int length)
if (!spectrum_on) if (!spectrum_on)
return; return;
lock_debug();
get_win_size(&width, &h); get_win_size(&width, &h);
if (width > MAX_DISPLAY_WIDTH - 1) if (width > MAX_DISPLAY_WIDTH - 1)
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;
screen_color[0][j+1] = 7; screen_color[0][j+1] = 7;
/* display buffer */ /* display buffer */
lock_logging();
enable_limit_scroll(false);
printf("\0337\033[H"); printf("\0337\033[H");
for (j = 0; j < HEIGHT; j++) { for (j = 0; j < HEIGHT; j++) {
for (k = 0; k < width; k++) { for (k = 0; k < width; k++) {
@@ -403,12 +405,11 @@ void display_spectrum(float *samples, int length)
} }
/* reset color and position */ /* reset color and position */
printf("\033[0;39m\0338"); fflush(stdout); printf("\033[0;39m\0338"); fflush(stdout);
enable_limit_scroll(true);
unlock_logging();
} }
} }
disp.interval_pos = pos; disp.interval_pos = pos;
unlock_debug();
} }
+8 -6
View File
@@ -23,7 +23,7 @@
#include <pthread.h> #include <pthread.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "../libdisplay/display.h" #include "../libdisplay/display.h"
static int status_on = 0; static int status_on = 0;
@@ -46,7 +46,8 @@ static void print_status(int on)
if (h > lines_total) if (h > lines_total)
h = lines_total; h = lines_total;
lock_debug(); lock_logging();
enable_limit_scroll(false);
printf("\0337\033[H\033[1;37m"); printf("\0337\033[H\033[1;37m");
for (i = 0; i < h; i++) { for (i = 0; i < h; i++) {
j = 0; j = 0;
@@ -60,7 +61,8 @@ static void print_status(int on)
putchar('\n'); putchar('\n');
} }
printf("\0338"); fflush(stdout); printf("\0338"); fflush(stdout);
unlock_debug(); enable_limit_scroll(true);
unlock_logging();
} }
void display_status_on(int on) void display_status_on(int on)
@@ -77,9 +79,9 @@ void display_status_on(int on)
print_status(1); print_status(1);
if (status_on) if (status_on)
debug_limit_scroll = lines_total; logging_limit_scroll_top(lines_total);
else else
debug_limit_scroll = 0; logging_limit_scroll_top(0);
} }
/* start status display */ /* start status display */
@@ -139,7 +141,7 @@ void display_status_end(void)
/* set new total lines */ /* set new total lines */
lines_total = line_count; lines_total = line_count;
if (status_on) if (status_on)
debug_limit_scroll = lines_total; logging_limit_scroll_top(lines_total);
} }
+11 -9
View File
@@ -24,7 +24,7 @@
#include <math.h> #include <math.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "../libdisplay/display.h" #include "../libdisplay/display.h"
#define HEIGHT 11 #define HEIGHT 11
@@ -52,7 +52,8 @@ void display_wave_on(int on)
if (wave_on) { if (wave_on) {
memset(&screen, ' ', sizeof(screen)); memset(&screen, ' ', sizeof(screen));
lock_debug(); lock_logging();
enable_limit_scroll(false);
printf("\0337\033[H"); printf("\0337\033[H");
for (i = 0; i < num_sender; i++) { for (i = 0; i < num_sender; i++) {
for (j = 0; j < HEIGHT; j++) { for (j = 0; j < HEIGHT; j++) {
@@ -61,7 +62,8 @@ void display_wave_on(int on)
} }
} }
printf("\0338"); fflush(stdout); printf("\0338"); fflush(stdout);
unlock_debug(); enable_limit_scroll(true);
unlock_logging();
} }
if (on < 0) if (on < 0)
@@ -70,9 +72,9 @@ void display_wave_on(int on)
wave_on = on; wave_on = on;
if (wave_on) if (wave_on)
debug_limit_scroll = HEIGHT * num_sender; logging_limit_scroll_top(HEIGHT * num_sender);
else 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) if (!wave_on)
return; return;
lock_debug();
get_win_size(&width, &h); get_win_size(&width, &h);
if (width > MAX_DISPLAY_WIDTH - 1) if (width > MAX_DISPLAY_WIDTH - 1)
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); sprintf(screen[0], "(chan %s", disp->kanal);
*strchr(screen[0], '\0') = ')'; *strchr(screen[0], '\0') = ')';
lock_logging();
enable_limit_scroll(false);
printf("\0337\033[H"); printf("\0337\033[H");
for (j = 0; j < disp->offset; j++) for (j = 0; j < disp->offset; j++)
puts(""); puts("");
@@ -241,12 +243,12 @@ void display_wave(dispwav_t *disp, sample_t *samples, int length, double range)
} }
/* reset color and position */ /* reset color and position */
printf("\033[0;39m\0338"); fflush(stdout); printf("\033[0;39m\0338"); fflush(stdout);
enable_limit_scroll(true);
unlock_logging();
} }
} }
disp->interval_pos = pos; disp->interval_pos = pos;
unlock_debug();
} }
+6 -6
View File
@@ -22,10 +22,10 @@
#include <string.h> #include <string.h>
#include <math.h> #include <math.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "dtmf_decode.h" #include "dtmf_decode.h"
//#define DEBUG //#define DEBUG_DTMF
#define level2db(level) (20 * log10(level)) #define level2db(level) (20 * log10(level))
#define db2level(db) pow(10, (double)db / 20.0) #define db2level(db) pow(10, (double)db / 20.0)
@@ -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); dtmf_decode_filter(dtmf, samples, length, frequency_low, frequency_high, amplitude_low, amplitude_high);
for (i = 0; i < length; i++) { 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); // printf("%s %.5f\n", debug_amplitude(samples[i]/2.0), samples[i]/2.0);
#endif #endif
/* get frequency of low frequencies, correct amplitude drop at cutoff point */ /* 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 */ /* check for limits */
if (amplitude_low[i] <= max_amplitude && amplitude_low[i] >= min_amplitude && amplitude_high[i] <= max_amplitude && amplitude_high[i] >= min_amplitude) { if (amplitude_low[i] <= max_amplitude && amplitude_low[i] >= min_amplitude && amplitude_high[i] <= max_amplitude && amplitude_high[i] >= min_amplitude) {
amplitude_ok = 1; 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])); 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 #endif
if (amplitude_high[i] / amplitude_low[i] <= forward_twist && amplitude_low[i] / amplitude_high[i] <= reverse_twist) 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++; count++;
if (count >= time_pause) { if (count >= time_pause) {
detected = 0; detected = 0;
#ifdef DEBUG #ifdef DEBUG_DTMF
printf("lost!\n"); printf("lost!\n");
#endif #endif
} }
} else } else
count = 0; count = 0;
} }
#ifdef DEBUG #ifdef DEBUG_DTMF
if (digit) 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"); 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 #endif
+14 -14
View File
@@ -24,7 +24,7 @@
#include <errno.h> #include <errno.h>
#include <math.h> #include <math.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "fsk.h" #include "fsk.h"
#define PI M_PI #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 i;
int rc; 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)); 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; 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[0] = f0 / (double)samplerate * 65536.0;
fsk->phaseshift65536[1] = f1 / (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]); LOGP(DDSP, LOGL_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, "F1 = %.0f Hz (phaseshift65536[1] = %.4f)\n", f1, fsk->phaseshift65536[1]);
/* use ffsk modulation, i.e. each bit has an integer number of /* use ffsk modulation, i.e. each bit has an integer number of
* half waves and starts/ends at zero crossing * 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; double waves;
if (filter) { if (filter) {
PDEBUG(DDSP, DEBUG_ERROR, "Cannot use FFSK with filter.\n"); LOGP(DDSP, LOGL_ERROR, "Cannot use FFSK with filter.\n");
rc = -EINVAL; rc = -EINVAL;
goto error; goto error;
} }
PDEBUG(DDSP, DEBUG_DEBUG, "enable FFSK modulation mode\n"); LOGP(DDSP, LOGL_DEBUG, "enable FFSK modulation mode\n");
fsk->ffsk = 1; fsk->ffsk = 1;
waves = (f0 / bitrate); waves = (f0 / bitrate);
if (fabs(round(waves * 2) - (waves * 2)) > 0.001) { 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[0] = f0 / bitrate * 65536.0;
fsk->cycles_per_bit65536[1] = f1 / 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]); LOGP(DDSP, LOGL_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, "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 is enabled, use a cosine shaped curve to change the phase each sample */
if (filter) { if (filter) {
@@ -138,7 +138,7 @@ int fsk_mod_init(fsk_mod_t *fsk, void *inst, int (*send_bit)(void *inst), int sa
#endif #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; fsk->filter = 1;
} }
@@ -155,7 +155,7 @@ error:
/* Cleanup transceiver instance. */ /* Cleanup transceiver instance. */
void fsk_mod_cleanup(fsk_mod_t *fsk) 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) { if (fsk->sin_tab) {
free(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; double bandwidth;
int rc; 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)); 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; goto error;
fsk->bits_per_sample = (double)bitrate / (double)samplerate; 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; return 0;
@@ -353,7 +353,7 @@ error:
/* Cleanup transceiver instance. */ /* Cleanup transceiver instance. */
void fsk_demod_cleanup(fsk_demod_t *fsk) 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); fm_demod_exit(&fsk->demod);
} }
-7
View File
@@ -1,7 +0,0 @@
AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
noinst_LIBRARIES = libg711.a
libg711_a_SOURCES = \
g711.c
-537
View File
@@ -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_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_flipped_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_flipped_to_linear[i] = g711_ulaw_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_to_linear[j])
j++;
g711_linear_to_ulaw[(i - 32768) & 0xffff] = j;
g711_linear_to_ulaw_flipped[(i - 32768) & 0xffff] = g711_flip[j];
i++;
}
j = 255;
while(i < 65536) {
if (i - 32768 > g711_ulaw_to_linear[j])
j--;
g711_linear_to_ulaw[(i - 32768) & 0xffff] = j;
g711_linear_to_ulaw_flipped[(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;
}
-17
View File
@@ -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);
+1 -1
View File
@@ -23,7 +23,7 @@
#include <errno.h> #include <errno.h>
#include <math.h> #include <math.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "goertzel.h" #include "goertzel.h"
/* /*
+24 -24
View File
@@ -77,7 +77,7 @@
#include <errno.h> #include <errno.h>
#include <math.h> #include <math.h>
#include "../libsample/sample.h" #include "../libsample/sample.h"
#include "../libdebug/debug.h" #include "../liblogging/logging.h"
#include "jitter.h" #include "jitter.h"
#define INITIAL_DELAY_INTERVAL 0.5 #define INITIAL_DELAY_INTERVAL 0.5
@@ -104,7 +104,7 @@ int jitter_create(jitter_t *jb, const char *name, double samplerate, int sample_
jb->extra_size = (int)(EXTRA_BUFFER * samplerate); jb->extra_size = (int)(EXTRA_BUFFER * samplerate);
jb->extra_samples = calloc(sample_size, jb->extra_size); jb->extra_samples = calloc(sample_size, jb->extra_size);
if (!jb->extra_samples) { if (!jb->extra_samples) {
PDEBUG(DJITTER, DEBUG_ERROR, "No memory for frame.\n"); LOGP(DJITTER, LOGL_ERROR, "No memory for frame.\n");
rc = -ENOMEM; rc = -ENOMEM;
goto error; goto error;
} }
@@ -118,7 +118,7 @@ int jitter_create(jitter_t *jb, const char *name, double samplerate, int sample_
jitter_reset(jb); 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, "%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");
error: error:
if (rc) if (rc)
@@ -139,7 +139,7 @@ void jitter_reset(jitter_t *jb)
{ {
jitter_frame_t *jf, *temp; jitter_frame_t *jf, *temp;
PDEBUG(DJITTER, DEBUG_INFO, "%sReset jitter buffer.\n", jb->name); LOGP(DJITTER, LOGL_INFO, "%sReset jitter buffer.\n", jb->name);
/* jitter buffer locked */ /* jitter buffer locked */
jb->unlocked = 0; jb->unlocked = 0;
@@ -172,7 +172,7 @@ void jitter_destroy(jitter_t *jb)
{ {
jitter_reset(jb); jitter_reset(jb);
PDEBUG(DJITTER, DEBUG_INFO, "%sDestroying jitter buffer.\n", jb->name); LOGP(DJITTER, LOGL_INFO, "%sDestroying jitter buffer.\n", jb->name);
if (jb->extra_samples) { if (jb->extra_samples) {
free(jb->extra_samples); free(jb->extra_samples);
@@ -201,7 +201,7 @@ void jitter_save(jitter_t *jb, void *samples, int length, int has_sequence, uint
/* generate sequence and timestamp automatically, if enabled */ /* generate sequence and timestamp automatically, if enabled */
if (!has_sequence) { if (!has_sequence) {
#ifdef DEBUG_JITTER #ifdef DEBUG_JITTER
PDEBUG(DJITTER, DEBUG_DEBUG, "%sSave frame of %d samples (no seqence).\n", jb->name, length); LOGP(DJITTER, LOGL_DEBUG, "%sSave frame of %d samples (no seqence).\n", jb->name, length);
#endif #endif
sequence = jb->next_sequence; sequence = jb->next_sequence;
jb->next_sequence++; jb->next_sequence++;
@@ -210,7 +210,7 @@ void jitter_save(jitter_t *jb, void *samples, int length, int has_sequence, uint
ssrc = jb->window_ssrc; ssrc = jb->window_ssrc;
} else { } else {
#ifdef HEAVY_DEBUG #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); LOGP(DJITTER, LOGL_DEBUG, "%sSave frame of %d samples (seqence=%u timestamp=%u ssrc=0x%02x).\n", jb->name, length, sequence, timestamp, ssrc);
#endif #endif
jb->next_sequence = sequence + 1; jb->next_sequence = sequence + 1;
jb->next_timestamp = timestamp + length; jb->next_timestamp = timestamp + length;
@@ -219,9 +219,9 @@ void jitter_save(jitter_t *jb, void *samples, int length, int has_sequence, uint
/* first packet (with this ssrc) sets window size to target_window_size */ /* 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 != ssrc) {
if (!jb->window_valid) 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 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! // NOTE: Reset must be called before finding the frame location below, because there will be no frame in list anymore!
jitter_reset(jb); jitter_reset(jb);
jb->unlocked = 1; jb->unlocked = 1;
@@ -241,7 +241,7 @@ void jitter_save(jitter_t *jb, void *samples, int length, int has_sequence, uint
offset_sequence = (int16_t)(sequence - (*jfp)->sequence); offset_sequence = (int16_t)(sequence - (*jfp)->sequence);
/* found double entry */ /* found double entry */
if (offset_sequence == 0) { if (offset_sequence == 0) {
PDEBUG(DJITTER, DEBUG_DEBUG, "%s Dropping double packet (sequence = %d)\n", jb->name, sequence); LOGP(DJITTER, LOGL_DEBUG, "%s Dropping double packet (sequence = %d)\n", jb->name, sequence);
return; return;
} }
/* offset is negative, so we found the position to insert frame */ /* offset is negative, so we found the position to insert frame */
@@ -252,7 +252,7 @@ void jitter_save(jitter_t *jb, void *samples, int length, int has_sequence, uint
offset_timestamp = timestamp - jb->window_timestamp; offset_timestamp = timestamp - jb->window_timestamp;
#ifdef HEAVY_DEBUG #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, "%sFrame has offset of %.0fms in jitter buffer.\n", jb->name, (double)offset_timestamp * jb->sample_duration * 1000.0);
#endif #endif
/* measure delay */ /* measure delay */
@@ -262,11 +262,11 @@ void jitter_save(jitter_t *jb, void *samples, int length, int has_sequence, uint
/* if frame is too early (delay ceases), shift window to the future */ /* if frame is too early (delay ceases), shift window to the future */
if (offset_timestamp > jb->max_window_size) { if (offset_timestamp > jb->max_window_size) {
if ((jb->window_flags & JITTER_FLAG_LATENCY)) { 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_timestamp(%d) > max_window_size(%d))\n", jb->name, offset_timestamp, jb->max_window_size);
/* shift window so it fits to the end of window */ /* shift window so it fits to the end of window */
jb->window_timestamp = timestamp - jb->max_window_size; jb->window_timestamp = timestamp - jb->max_window_size;
} else { } 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_timestamp(%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 */ /* 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 = timestamp - (uint32_t)(jb->target_window_size);
} }
@@ -275,11 +275,11 @@ void jitter_save(jitter_t *jb, void *samples, int length, int has_sequence, uint
/* is frame is too late, shift window to the past. */ /* is frame is too late, shift window to the past. */
if (offset_timestamp < 0) { if (offset_timestamp < 0) {
if ((jb->window_flags & JITTER_FLAG_LATENCY)) { 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_timestamp(%d) < 0)\n", jb->name, offset_timestamp);
/* shift window so frame fits to the start of window + half of target delay */ /* 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 = timestamp - (uint32_t)(jb->target_window_size) / 2;
} else { } 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_timestamp(%d) < 0)\n", jb->name, offset_timestamp);
/* shift window so frame fits to the start of window + target delay */ /* 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 = timestamp - (uint32_t)(jb->target_window_size);
} }
@@ -287,11 +287,11 @@ void jitter_save(jitter_t *jb, void *samples, int length, int has_sequence, uint
/* insert or append frame */ /* insert or append frame */
#ifdef HEAVY_DEBUG #ifdef HEAVY_DEBUG
PDEBUG(DJITTER, DEBUG_DEBUG, "%s Store frame\n", jb->name); LOGP(DJITTER, LOGL_DEBUG, "%s Store frame\n", jb->name);
#endif #endif
jf = malloc(sizeof(*jf) + length * jb->sample_size); jf = malloc(sizeof(*jf) + length * jb->sample_size);
if (!jf) { if (!jf) {
PDEBUG(DJITTER, DEBUG_ERROR, "No memory for frame.\n"); LOGP(DJITTER, LOGL_ERROR, "No memory for frame.\n");
return; return;
} }
memset(jf, 0, sizeof(*jf)); // note: clear header only memset(jf, 0, sizeof(*jf)); // note: clear header only
@@ -311,7 +311,7 @@ void jitter_load(jitter_t *jb, void *samples, int length)
int32_t count, count2, index; int32_t count, count2, index;
#ifdef HEAVY_DEBUG #ifdef HEAVY_DEBUG
PDEBUG(DJITTER, DEBUG_DEBUG, "%sLoad chunk of %d samples.\n", jb->name, length); LOGP(DJITTER, LOGL_DEBUG, "%sLoad chunk of %d samples.\n", jb->name, length);
#endif #endif
/* now unlock jitter buffer */ /* now unlock jitter buffer */
@@ -321,10 +321,10 @@ void jitter_load(jitter_t *jb, void *samples, int length)
jb->delay_counter += jb->sample_duration * (double)length; jb->delay_counter += jb->sample_duration * (double)length;
if (jb->delay_counter >= jb->delay_interval) { if (jb->delay_counter >= jb->delay_interval) {
if (jb->min_delay_value >= 0) 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); 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_value * jb->sample_duration * 1000.0);
/* delay reduction, if maximum delay is greater than target jitter window size */ /* 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) { 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); 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_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 */ /* only reduce delay to half of the target window size */
jb->window_timestamp += jb->min_delay_value - jb->target_window_size / 2; jb->window_timestamp += jb->min_delay_value - jb->target_window_size / 2;
@@ -349,9 +349,9 @@ void jitter_load(jitter_t *jb, void *samples, int length)
if (count > 0) { if (count > 0) {
#ifdef HEAVY_DEBUG #ifdef HEAVY_DEBUG
if (jf) 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); LOGP(DJITTER, LOGL_DEBUG, "%s There is a frame ahead in buffer after %d samples. Interpolating gap.\n", jb->name, jf->timestamp - jb->window_timestamp);
else else
PDEBUG(DJITTER, DEBUG_DEBUG, "%s There is no frame ahead in buffer. Interpolating gap.\n", jb->name); LOGP(DJITTER, LOGL_DEBUG, "%s There is no frame ahead in buffer. Interpolating gap.\n", jb->name);
#endif #endif
/* extrapolate by playing the extrapolation buffer */ /* extrapolate by playing the extrapolation buffer */
while (count) { while (count) {
@@ -366,7 +366,7 @@ void jitter_load(jitter_t *jb, void *samples, int length)
jb->extra_timeout_count++; jb->extra_timeout_count++;
if (jb->extra_timeout_count == jb->extra_timeout_max) { if (jb->extra_timeout_count == jb->extra_timeout_max) {
#ifdef HEAVY_DEBUG #ifdef HEAVY_DEBUG
PDEBUG(DJITTER, DEBUG_DEBUG, "%s Repeated jitter buffer enough, clearing to silence.\n", jb->name); LOGP(DJITTER, LOGL_DEBUG, "%s Repeated jitter buffer enough, clearing to silence.\n", jb->name);
#endif #endif
clear_extra_buffer(jb); clear_extra_buffer(jb);
} }
@@ -393,7 +393,7 @@ void jitter_load(jitter_t *jb, void *samples, int length)
count = jb->extra_size - jb->extra_index; count = jb->extra_size - jb->extra_index;
/* copy samples from packet to play out, increment sample pointer and decrement length */ /* copy samples from packet to play out, increment sample pointer and decrement length */
#ifdef HEAVY_DEBUG #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 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);
#endif #endif
memcpy(samples, (uint8_t *)jf->samples + index * jb->sample_size, count * jb->sample_size); memcpy(samples, (uint8_t *)jf->samples + index * jb->sample_size, count * jb->sample_size);
samples = (uint8_t *)samples + count * jb->sample_size; samples = (uint8_t *)samples + count * jb->sample_size;
+8
View File
@@ -0,0 +1,8 @@
AM_CPPFLAGS = -Wall -Wextra -g $(all_includes)
noinst_LIBRARIES = liblogging.a
liblogging_a_SOURCES = \
logging.c \
categories.c
+227
View File
@@ -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);
+50
View File
@@ -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;
+264
View File
@@ -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);
}
+21
View File
@@ -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);
+1
View File
@@ -8,6 +8,7 @@ libmobile_a_SOURCES = \
console.c \ console.c \
testton.c \ testton.c \
cause.c \ cause.c \
get_time.c \
main_mobile.c main_mobile.c
if HAVE_ALSA if HAVE_ALSA
Loaded 100 of 198 files, more files were not shown because too many files have changed in this diff. Show more