4 Jul 2010 10:33
[PATCH 4/5 v2] fsogsmd: add preliminary support for Motorola EZX phones
Antonio Ospite <ospite <at> studenti.unina.it>
2010-07-04 08:33:57 GMT
2010-07-04 08:33:57 GMT
Signed-off-by: Antonio Ospite <ospite <at> studenti.unina.it>
---
I am committing this, posted here just as a recap.
Changes since v1:
- Fix a typo s/se/we/
- instanciate StateBasedAtParser as function argument
- get dlci lines from config file
- use Thread.usleep() in place of Posix.sleep()
Regards,
Antonio
fsogsmd/conf/Makefile.am | 1 +
fsogsmd/conf/motorola_ezx/Makefile.am | 12 ++
fsogsmd/conf/motorola_ezx/fsogsmd.conf | 45 ++++++
fsogsmd/configure.ac | 2 +
fsogsmd/src/plugins/Makefile.am | 1 +
.../plugins/modem_freescale_neptune/Makefile.am | 65 ++++++++
.../plugins/modem_freescale_neptune/commands.vala | 48 ++++++
.../plugins/modem_freescale_neptune/mediators.vala | 159 ++++++++++++++++++++
.../plugins/modem_freescale_neptune/plugin.vala | 157 +++++++++++++++++++
.../modem_freescale_neptune/unsolicited.vala | 121 +++++++++++++++
10 files changed, 611 insertions(+), 0 deletions(-)
create mode 100644 fsogsmd/conf/motorola_ezx/Makefile.am
create mode 100644 fsogsmd/conf/motorola_ezx/fsogsmd.conf
create mode 100644 fsogsmd/src/plugins/modem_freescale_neptune/Makefile.am
create mode 100644 fsogsmd/src/plugins/modem_freescale_neptune/commands.vala
create mode 100644 fsogsmd/src/plugins/modem_freescale_neptune/mediators.vala
create mode 100644 fsogsmd/src/plugins/modem_freescale_neptune/plugin.vala
create mode 100644 fsogsmd/src/plugins/modem_freescale_neptune/unsolicited.vala
diff --git a/fsogsmd/conf/Makefile.am b/fsogsmd/conf/Makefile.am
index 2d3eede..fb0b1cb 100644
--- a/fsogsmd/conf/Makefile.am
+++ b/fsogsmd/conf/Makefile.am
<at> <at> -6,6 +6,7 <at> <at> SUBDIRS = \
default \
htc_qualcomm_dream \
htc_qualcomm_msm \
+ motorola_ezx \
openmoko_gta \
palm_pre \
$(NULL)
diff --git a/fsogsmd/conf/motorola_ezx/Makefile.am b/fsogsmd/conf/motorola_ezx/Makefile.am
new file mode 100644
index 0000000..6efcd40
--- /dev/null
+++ b/fsogsmd/conf/motorola_ezx/Makefile.am
<at> <at> -0,0 +1,12 <at> <at>
+include $(top_srcdir)/Makefile.decl
+
+NULL=
+
+THISDIR = `basename $$PWD`
+
+confdir = $(sysconfdir)/freesmartphone/conf/$(THISDIR)
+dist_conf_DATA = \
+ fsogsmd.conf \
+ $(NULL)
+
+MAINTAINERCLEANFILES = Makefile.in
diff --git a/fsogsmd/conf/motorola_ezx/fsogsmd.conf b/fsogsmd/conf/motorola_ezx/fsogsmd.conf
new file mode 100644
index 0000000..ad7d27a
--- /dev/null
+++ b/fsogsmd/conf/motorola_ezx/fsogsmd.conf
<at> <at> -0,0 +1,45 <at> <at>
+#######################################################################################
+# FSO GSM Daemon Configuration File -- for SYSTEM INTEGRATORS only
+########################################################################################
+[logging]
+# Log level: DEBUG, INFO (default), WARNING, ERROR
+# Override via environment as FSO_LOG_LEVEL
+log_level = INFO
+# Where to log to: none (default), stderr, stderr:colors, file, syslog
+# Override via environment as FSO_LOG_TO
+log_to = file
+# Log Destination (valid only for log_to = file)
+# Override via environment as FSO_LOG_DESTINATION
+log_destination = /var/log/fsogsmd.log
+
+[libfsotransport]
+log_level = INFO
+log_to = file
+log_destination = /var/log/fsogsmd.log
+
+[fsogsm]
+modem_type = freescale_neptune
+sim_buffers_sms = true
+pdp_type = ppp
+
+# Global modem init sequence; this is the first sequence that gets sent to the modem after power cycling
+modem_init = E0V1;+CMEE=1;+CRC=1;+CSCS="UCS2"
+
+# Where to store SMS: <path> (default=/tmp/fsogsmd/sms/)
+sms_storage_dir = /tmp/fsogsmd/sms/
+
+[fsogsm.modem_freescale_neptune]
+muxnode_prefix = /dev/mux
+dlci_main = 1
+dlci_sms = 3
+dlci_sim = 4
+dlci_misc = 5
+
+[fsogsm.lowlevel_motorola_ezx]
+# No settings yet
+
+[fsogsm.pdp_ppp]
+# No settings yet
+
+[fsogsm.dbus_service]
+# No settings yet
diff --git a/fsogsmd/configure.ac b/fsogsmd/configure.ac
index 7596689..2455669 100644
--- a/fsogsmd/configure.ac
+++ b/fsogsmd/configure.ac
<at> <at> -174,6 +174,7 <at> <at> AC_CONFIG_FILES([
conf/default/Makefile
conf/htc_qualcomm_dream/Makefile
conf/htc_qualcomm_msm/Makefile
+ conf/motorola_ezx/Makefile
conf/openmoko_gta/Makefile
conf/palm_pre/Makefile
data/Makefile
<at> <at> -187,6 +188,7 <at> <at> AC_CONFIG_FILES([
src/plugins/lowlevel_palmpre/Makefile
src/plugins/modem_cinterion_mc75/Makefile
src/plugins/modem_dummy/Makefile
+ src/plugins/modem_freescale_neptune/Makefile
src/plugins/modem_singleline/Makefile
src/plugins/modem_ti_calypso/Makefile
src/plugins/modem_qualcomm_htc/Makefile
diff --git a/fsogsmd/src/plugins/Makefile.am b/fsogsmd/src/plugins/Makefile.am
index 2e7a65a..a537bdd 100644
--- a/fsogsmd/src/plugins/Makefile.am
+++ b/fsogsmd/src/plugins/Makefile.am
<at> <at> -13,6 +13,7 <at> <at> SUBDIRS = \
modem_dummy \
modem_singleline \
modem_qualcomm_htc \
+ modem_freescale_neptune \
\
pdp_qmi \
$(NULL)
diff --git a/fsogsmd/src/plugins/modem_freescale_neptune/Makefile.am b/fsogsmd/src/plugins/modem_freescale_neptune/Makefile.am
new file mode 100644
index 0000000..3aeffb1
--- /dev/null
+++ b/fsogsmd/src/plugins/modem_freescale_neptune/Makefile.am
<at> <at> -0,0 +1,65 <at> <at>
+include $(top_srcdir)/Makefile.decl
+
+NULL =
+
+AM_CFLAGS = \
+ -I$(top_srcdir)/src/lib \
+ -I$(top_srcdir)/src/3rdparty \
+ $(PALM_CFLAGS) \
+ $(FSO_CFLAGS) \
+ $(GLIB_CFLAGS) \
+ $(GEE_CFLAGS) \
+ $(DBUS_CFLAGS) \
+ $(NULL)
+
+noinst_PROGRAMS = $(TEST_PROGS)
+
+progs_ldadd = \
+ $(PALM_LIBS) \
+ $(FSO_LIBS) \
+ $(GLIB_LIBS) \
+ $(GEE_LIBS) \
+ $(DBUS_LIBS) \
+ $(top_srcdir)/src/lib/libfsogsm.la
+
+VALAC_ARGS = \
+ --basedir $(top_srcdir) \
+ --vapidir ../../lib \
+ --pkg posix \
+ --pkg glib-2.0 \
+ --pkg gee-1.0 \
+ --pkg dbus-glib-1 \
+ --pkg fso-glib-1.0 \
+ --pkg fsoframework-2.0 \
+ --pkg fsotransport-2.0 \
+ --pkg fsogsm-2.0
+
+if WANT_DEBUG
+VALAC_ARGS += -g -D DEBUG
+AM_CFLAGS += -ggdb -O0
+endif
+
+#
+# plugin
+#
+modlibexecdir = $(libdir)/cornucopia/modules/fsogsm
+modlibexec_LTLIBRARIES = modem_freescale_neptune.la
+modem_freescale_neptune_la_SOURCES = plugin.c commands.c mediators.c unsolicited.c
+modem_freescale_neptune_la_VALASOURCES = plugin.vala commands.vala mediators.vala unsolicited.vala
+$(modem_freescale_neptune_la_SOURCES): $(modem_freescale_neptune_la_VALASOURCES)
+ $(VALAC) -C $(VALAC_ARGS) $^
+ touch $ <at>
+modem_freescale_neptune_la_LIBADD = $(progs_ldadd)
+modem_freescale_neptune_la_LDFLAGS = -no-undefined -module -avoid-version
+modem_freescale_neptune_la_LIBTOOLFLAGS = --tag=disable-static
+
+CLEANFILES = \
+ *.c \
+ *.h \
+ *.la \
+ *.lo \
+ $(NULL)
+
+MAINTAINERCLEANFILES = \
+ Makefile.in \
+ $(NULL)
diff --git a/fsogsmd/src/plugins/modem_freescale_neptune/commands.vala b/fsogsmd/src/plugins/modem_freescale_neptune/commands.vala
new file mode 100644
index 0000000..6a19f5b
--- /dev/null
+++ b/fsogsmd/src/plugins/modem_freescale_neptune/commands.vala
<at> <at> -0,0 +1,48 <at> <at>
+/*
+ * Copyright (C) 2010 Antonio Ospite <ospite <at> studenti.unina.it>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+
+ * This library 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
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+using FsoGsm;
+using Gee;
+
+namespace FreescaleNeptune
+{
+
+/**
+ * Modem violating GSM 07.07 here.
+ *
+ * Format seems to be +CPIN=<number>,"<PIN>", where 1 is PIN1, 2 may be PIN2 or PUK1
+ **/
+public class NeptunePlusCPIN : PlusCPIN
+{
+ public new string issue( int pin_type, string pin)
+ {
+ return "+CPIN=%d,\"%s\"".printf( pin_type, pin );
+ }
+}
+
+
+/**
+ * Register all custom commands
+ **/
+public void registerCustomAtCommands( HashMap<string,AtCommand> table )
+{
+ table[ "+CPIN" ] = new NeptunePlusCPIN();
+}
+
+} /* namespace FreescaleNeptune */
diff --git a/fsogsmd/src/plugins/modem_freescale_neptune/mediators.vala b/fsogsmd/src/plugins/modem_freescale_neptune/mediators.vala
new file mode 100644
index 0000000..1615862
--- /dev/null
+++ b/fsogsmd/src/plugins/modem_freescale_neptune/mediators.vala
<at> <at> -0,0 +1,159 <at> <at>
+/*
+ * Copyright (C) 2010 Antonio Ospite <ospite <at> studenti.unina.it>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+
+ * This library 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
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+using FsoGsm;
+using Gee;
+
+namespace FreescaleNeptune {
+
+/**
+ * Debug mediators
+ **/
+
+/**
+ * Modem not implementing any of +CGMR;+CGMM;+CGMI -- only +CGSN is supported
+ **/
+public class NeptuneDeviceGetInformation : DeviceGetInformation
+{
+ public override async void run() throws FreeSmartphone.GSM.Error, FreeSmartphone.Error
+ {
+ /*
+ var channel = theModem.channel( "main" ) as AtChannel;
+ */
+ info = new GLib.HashTable<string,Value?>( str_hash, str_equal );
+
+ info.insert( "manufacturer", "Motorola" );
+ info.insert( "model", "Neptune Freescale Modem" );
+
+ /* FIXME: Use information from the +EBPV URC we get on modem init */
+ info.insert( "revision", "unknown" );
+
+ /* "+CGSN" */
+ var cgsn = theModem.createAtCommand<PlusCGSN>( "+CGSN" );
+ var response = yield theModem.processAtCommandAsync( cgsn, cgsn.query() );
+ checkResponseValid( cgsn, response );
+ info.insert( "imei", cgsn.value );
+ }
+}
+
+
+/**
+ * SIM Mediators
+ **/
+
+/**
+ * Modem violating GSM 07.07 here.
+ *
+ * Format seems to be +CPIN=<number>,"<PIN>", where 1 is PIN1, 2 may be PIN2 or PUK1
+ **/
+public class NeptuneSimSendAuthCode : SimSendAuthCode
+{
+ public override async void run( string pin ) throws FreeSmartphone.GSM.Error, FreeSmartphone.Error
+ {
+ var cmd = theModem.createAtCommand<NeptunePlusCPIN>( "+CPIN" );
+ var response = yield theModem.processAtCommandAsync( cmd, cmd.issue( 1, pin ) );
+ var code = checkResponseExpected( cmd, response,
+ { Constants.AtResponse.OK, Constants.AtResponse.CME_ERROR_016_INCORRECT_PASSWORD } );
+
+ if ( code == Constants.AtResponse.CME_ERROR_016_INCORRECT_PASSWORD )
+ {
+ throw new FreeSmartphone.GSM.Error.SIM_AUTH_FAILED( <at> "PIN $pin not accepted" );
+ }
+
+ gatherSimStatusAndUpdate();
+ }
+}
+
+
+/**
+ * SMS Mediators
+ **/
+
+/**
+ * Network Mediators
+ **/
+
+public class NeptuneNetworkRegister : NetworkRegister
+{
+ public override async void run() throws FreeSmartphone.GSM.Error, FreeSmartphone.Error
+ {
+ // FIXME: find a better way to make NetworkRegister reliable,
+ // avoid sleeping if possible.
+ Thread.usleep(4000 * 1000);
+ var cmd = theModem.createAtCommand<PlusCOPS>( "+COPS" );
+ var response = yield theModem.processAtCommandAsync( cmd, cmd.issue(
PlusCOPS.Action.REGISTER_WITH_BEST_PROVIDER ) );
+ checkResponseOk( cmd, response );
+ }
+}
+
+public class NeptuneNetworkUnregister : NetworkUnregister
+{
+ public override async void run() throws FreeSmartphone.GSM.Error, FreeSmartphone.Error
+ {
+ var cmd = theModem.createAtCommand<PlusCOPS>( "+COPS" );
+ var response = yield theModem.processAtCommandAsync( cmd, cmd.issue( PlusCOPS.Action.UNREGISTER ) );
+ // FIXME: find a better way to make NetworkRegister reliable,
+ // avoid sleeping if possible.
+ Thread.usleep(4000 * 1000);
+ checkResponseOk( cmd, response );
+ }
+}
+
+/**
+ * Call Mediators
+ **/
+
+/**
+ * Neptune replies to +CLCC? but not to +CLCC
+ * So we use cmd.query() here instead of cmd.execute()
+ **/
+public class NeptuneCallListCalls : CallListCalls
+{
+ public override async void run() throws FreeSmartphone.GSM.Error, FreeSmartphone.Error
+ {
+ var cmd = theModem.createAtCommand<PlusCLCC>( "+CLCC" );
+ var response = yield theModem.processAtCommandAsync( cmd, cmd.query() );
+ checkMultiResponseValid( cmd, response );
+ calls = cmd.calls;
+ }
+}
+
+/**
+ * PDP Mediators
+ **/
+
+/**
+ * Register all mediators
+ **/
+public void registerNeptuneMediators( HashMap<Type,Type> table )
+{
+ /*
+ table[ typeof(DebugPing) ] = typeof( NeptuneDebugPing );
+ */
+
+ table[ typeof(DeviceGetInformation) ] = typeof( NeptuneDeviceGetInformation );
+ table[ typeof(SimSendAuthCode) ] = typeof( NeptuneSimSendAuthCode );
+
+ table[ typeof(NetworkRegister) ] = typeof( NeptuneNetworkRegister );
+ table[ typeof(NetworkUnregister) ] = typeof( NeptuneNetworkUnregister );
+
+ table[ typeof(CallListCalls) ] = typeof( NeptuneCallListCalls );
+}
+
+} /* FreescaleNeptune */
diff --git a/fsogsmd/src/plugins/modem_freescale_neptune/plugin.vala b/fsogsmd/src/plugins/modem_freescale_neptune/plugin.vala
new file mode 100644
index 0000000..d191adf
--- /dev/null
+++ b/fsogsmd/src/plugins/modem_freescale_neptune/plugin.vala
<at> <at> -0,0 +1,157 <at> <at>
+/*
+ * Copyright (C) 2010 Antonio Ospite <ospite <at> studenti.unina.it>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+
+ * This library 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
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+using GLib;
+using Gee;
+using FsoGsm;
+
+namespace FreescaleNeptune
+{
+ const string MODULE_NAME = "fsogsm.modem_freescale_neptune";
+ // FIXME: rename main to call ??
+ const string CHANNEL_NAMES[] = { "main", "sms", "sim", "misc" };
+}
+
+/**
+ * <at> class FreescaleNeptune.Modem
+ *
+ * This modem plugin supports the Freescale neptune chipset used on Motorola EzX
+ * phones.
+ **/
+class FreescaleNeptune.Modem : FsoGsm.AbstractModem
+{
+ construct
+ {
+ /* Init the modem */
+ logger.info("Called FreescaleNeptune.Modem construct");
+ }
+
+ public override string repr()
+ {
+ return <at> "<$(channels.size)C>";
+ }
+
+ public override void configureData()
+ {
+ /* XXX: we could send these here too, but right now doing something
+ * like in http://git.ao2.it/fso-scripts.git/?a=blob;f=fso-auth.py;h=0fc26f98f7f31a414c46dbfc8e6d27ba3e3f8a77
+ * would fail because +CPIN? is sent before +EPOM completes...
+ """+EPOM=1,0""",
+ """+EAPF=12,1,0""",
+ * so we put these commands in the lowlevel plugin
+ */
+
+ // sequence for initializing the channel
+ registerAtCommandSequence( "main", "init", new AtCommandSequence( {
+ // GSM unsolicited
+ """+CRC=1""",
+ """+CLIP=1""",
+ """+COLP=1""",
+ """+CCWA=1""",
+ """+CSSN=1,1""",
+ """+CTZU=1""",
+ """+CTZR=1""",
+ """+CREG=2""",
+ """+CAOC=2""",
+ // GPRS unsolicited
+ """+CGEREP=2,1""",
+ """+CGREG=2"""
+ } ) );
+
+ // sequence for initializing the channel
+ registerAtCommandSequence( "sms", "unlocked", new AtCommandSequence( {
+ """+CRRM""",
+ //FIXME if this returns an error, we might have no SIM inserted
+ """+EPMS?""",
+ """+EMGL=4"""
+ } ) );
+
+ // sequence for initializing the channel
+ registerAtCommandSequence( "misc", "init", new AtCommandSequence( {
+ """+USBSTAT=255,1"""
+ } ) );
+ }
+
+ protected override void createChannels()
+ {
+ logger.info("Create Freescale Neptune channels");
+
+ var muxnode_prefix = config.stringValue( MODULE_NAME, "muxnode_prefix");
+
+ for ( int i = 0; i < CHANNEL_NAMES.length; ++i ) {
+ var channel = CHANNEL_NAMES[i];
+ var dlci = config.stringValue( MODULE_NAME, <at> "dlci_$(channel)" );
+ if ( dlci != "" ) {
+ var muxnode = <at> "$(muxnode_prefix)$(dlci)";
+ var transport = FsoFramework.Transport.create("serial", muxnode, 115200);
+ new AtChannel( channel, transport, new FsoGsm.StateBasedAtParser() );
+ } else {
+ logger.warning( <at> "No dlci for channel \"$(channel)\"" );
+ }
+ }
+ }
+
+ protected override void registerCustomMediators( HashMap<Type,Type> mediators )
+ {
+ logger.info("Register Neptune mediators");
+ FreescaleNeptune.registerNeptuneMediators( mediators );
+ }
+
+ protected override FsoGsm.UnsolicitedResponseHandler createUnsolicitedHandler()
+ {
+ return new FreescaleNeptune.UnsolicitedResponseHandler();
+ }
+
+ protected override FsoGsm.Channel channelForCommand( FsoGsm.AtCommand command, string query )
+ {
+ // FIXME: check what commands are to be sent to each channel
+ return channels[ "main" ];
+ }
+}
+
+/**
+ * This function gets called on plugin initialization time.
+ * <at> return the name of your plugin here
+ * <at> note that it needs to be a name in the format <subsystem>.<plugin>
+ * else your module will be unloaded immediately.
+ **/
+public static string fso_factory_function( FsoFramework.Subsystem subsystem ) throws Error
+{
+ FsoFramework.theLogger.debug( "fsogsm.freescale_neptune fso_factory_function" );
+ return FreescaleNeptune.MODULE_NAME;
+}
+
+[ModuleInit]
+public static void fso_register_function( TypeModule module )
+{
+ // do not remove this function
+}
+
+/**
+ * This function gets called on plugin load time.
+ * <at> return false, if the plugin operating conditions are present.
+ * <at> note Some versions of glib contain a bug that leads to a SIGSEGV
+ * in g_module_open, if you return true here.
+ **/
+/*public static bool g_module_check_init( void* m )
+{
+ var ok = FsoFramework.FileHandling.isPresent( Kernel26.SYS_CLASS_LEDS );
+ return (!ok);
+}
+*/
diff --git a/fsogsmd/src/plugins/modem_freescale_neptune/unsolicited.vala b/fsogsmd/src/plugins/modem_freescale_neptune/unsolicited.vala
new file mode 100644
index 0000000..c08696e
--- /dev/null
+++ b/fsogsmd/src/plugins/modem_freescale_neptune/unsolicited.vala
<at> <at> -0,0 +1,121 <at> <at>
+/*
+ * Copyright (C) 2010 Antonio Ospite <ospite <at> studenti.unina.it>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+
+ * This library 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
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+using Gee;
+using FsoGsm;
+
+public class FreescaleNeptune.UnsolicitedResponseHandler : FsoGsm.AtUnsolicitedResponseHandler
+{
+ public UnsolicitedResponseHandler()
+ {
+ registerUrc( "+MBAN", channelReady );
+ registerUrc( "+CIEV", plusCIEV );
+ registerUrc( "+CLIN", plusCLIN );
+ registerUrc( "+CLIP", plusCLIP );
+ registerUrc( "+EBAD", dummy );
+ registerUrc( "+EFLEX", dummy );
+ registerUrc( "+EBPV", dummy );
+ }
+
+ public virtual void channelReady( string prefix, string rhs )
+ {
+ assert( theModem.logger.debug( "Congratulations Madam, it's a channel!" ) );
+ }
+
+ /**
+ * Indicator Event Reporting. Based on 3GPP TS 07.07, Chapter 8.9, but slightly extended.
+ *
+ * As +CIND=? gives us a hint (one of the few test commands EZX exposes), we conclude:
+ *
+ * 0: battery charge level (0-5)
+ * 1: signal level (0-5)
+ * 2: service availability (0-1)
+ * 3: call active? (0-1)
+ * 4: voice mail (message) (0-1)
+ * 5: transmit activated by voice activity (0-1)
+ * 6: call progress (0-3) [0:no more in progress, 1:incoming, 2:outgoing, 3:ringing]
+ * 7: roaming (0-2)
+ * 8: sms storage full (0-1)
+ * 11: ???
+ * 20: ??? (SIM not inserted?)
+ **/
+ public override void plusCIEV( string prefix, string rhs )
+ {
+ int indicator = rhs.split(",")[0].to_int();
+ int value = rhs.split(",")[1].to_int();
+
+ switch (indicator) {
+ case 1:
+ theModem.logger.debug( <at> "plusCIEV: $indicator,$value NOT implemented" );
+ break;
+ case 2:
+ theModem.logger.debug( <at> "plusCIEV: $indicator,$value NOT implemented" );
+ break;
+ case 3:
+ theModem.logger.debug( <at> "plusCIEV: $indicator,$value NOT implemented" );
+ break;
+ case 4:
+ theModem.logger.debug( <at> "plusCIEV: $indicator,$value NOT implemented" );
+ break;
+ case 5:
+ theModem.logger.debug( <at> "plusCIEV: $indicator,$value NOT implemented" );
+ break;
+ case 6:
+ theModem.logger.debug( <at> "plusCIEV: $indicator,$value NOT implemented" );
+ break;
+ case 7:
+ theModem.logger.debug( <at> "plusCIEV: $indicator,$value NOT implemented" );
+ break;
+ case 8:
+ theModem.logger.debug( <at> "plusCIEV: $indicator,$value NOT implemented" );
+ break;
+ case 11:
+ theModem.logger.debug( <at> "plusCIEV: $indicator,$value NOT implemented" );
+ break;
+ case 20:
+ theModem.logger.debug( <at> "plusCIEV: $indicator,$value NOT implemented" );
+ break;
+ default:
+ theModem.logger.warning( <at> "plusCIEV: $indicator,$value UNKNOWN" );
+ break;
+ }
+ }
+
+ /**
+ * When an incoming call arrives we get the URC:
+ * +CLIN: 0
+ **/
+ public void plusCLIN( string prefix, string rhs )
+ {
+ theModem.callhandler.handleIncomingCall("VOICE");
+ }
+
+ /**
+ * +CLIP: "+4969123456789",145
+ **/
+ public override void plusCLIP( string prefix, string rhs )
+ {
+ assert( theModem.logger.debug( <at> "plusCLIP: not implemented on Neptune" ) );
+ }
+
+ public virtual void dummy( string prefix, string rhs )
+ {
+ assert( theModem.logger.debug( <at> "URC: $prefix not implemented on Neptune" ) );
+ }
+}
--
--
1.7.1

RSS Feed