namespace zavai {
namespace gsm {
+// Isolate here the insane loops we need to go through to turn on the bloody
+// gsm
+protected class GSMActivator : Object
+{
+ public dynamic DBus.Object device;
+ public dynamic DBus.Object network;
+ public dynamic DBus.Object sim;
+
+ public GSMActivator()
+ {
+ device = null;
+ network = null;
+ sim = null;
+ }
+
+ public void begin()
+ {
+ if (device == null)
+ {
+ device = zavai.registry.sbus.get_object(
+ "org.freesmartphone.ogsmd",
+ "/org/freesmartphone/GSM/Device",
+ "org.freesmartphone.GSM.Device");
+ network = zavai.registry.sbus.get_object(
+ "org.freesmartphone.ogsmd",
+ "/org/freesmartphone/GSM/Device",
+ "org.freesmartphone.GSM.Network");
+ sim = zavai.registry.sbus.get_object(
+ "org.freesmartphone.ogsmd",
+ "/org/freesmartphone/GSM/Device",
+ "org.freesmartphone.GSM.SIM");
+ }
+
+ device.SetAntennaPower(true, on_antenna_power);
+ }
+
+ protected void on_antenna_power(Error e)
+ {
+ if (e != null)
+ {
+ zavai.log.warning("on_antenna_power: " + e.message);
+ if (e.message.str("current status is 'enabling'") != null
+ || e.message.str("current status is 'unknown'") != null)
+ {
+ zavai.log.info("trying again after 5 seconds");
+ Timeout.add(5 * 1000, () => {
+ device.SetAntennaPower(true, on_antenna_power);
+ return false;
+ });
+ } else {
+ sim.GetAuthStatus(on_auth_status);
+ }
+ return;
+ }
+ zavai.log.warning("on_antenna_power ok");
+ network.Register(on_network_register);
+ }
+
+ protected void on_network_register(Error e)
+ {
+ if (e != null)
+ {
+ zavai.log.warning("on_network_register: " + e.message);
+ return;
+ }
+ zavai.log.info("on_network_register: registered");
+ }
+
+ protected void on_auth_status(string status, Error e)
+ {
+ if (e != null)
+ {
+ zavai.log.warning("on_auth_status: " + e.message);
+ return;
+ }
+ zavai.log.info("on_auth_status: " + status);
+ if (status == "READY")
+ device.SetAntennaPower(true, on_antenna_power);
+ else if (status == "SIM PIN")
+ sim.SendAuthCode(zavai.config.sim_pin, on_auth_code);
+ else
+ zavai.log.debug("Unknown status: " + status);
+ }
+
+ protected void on_auth_code(Error e)
+ {
+ if (e != null)
+ {
+ zavai.log.warning("on_auth_code: " + e.message);
+ return;
+ }
+ zavai.log.info("PIN OK");
+ }
+}
+
public class GSM: zavai.Service
{
protected dynamic DBus.Object dbus;
- public dynamic DBus.Object network;
public dynamic DBus.Object call;
- public dynamic DBus.Object device;
- public dynamic DBus.Object sim;
protected Pid child_pid;
protected int child_watch_id;
+ protected GSMActivator activator;
public GSM()
{
Object(name: "gsm.gsm");
- network = null;
+ activator = new GSMActivator();
+
call = null;
- device = null;
- sim = null;
child_pid = 0;
child_watch_id = 0;
// Add a child watch source to know when it ends
ChildWatch.add(child_pid, on_child);
- network = zavai.registry.sbus.get_object(
- "org.freesmartphone.ogsmd",
- "/org/freesmartphone/GSM/Device",
- "org.freesmartphone.GSM.Network");
call = zavai.registry.sbus.get_object(
"org.freesmartphone.ogsmd",
"/org/freesmartphone/GSM/Device",
"org.freesmartphone.GSM.Call");
- device = zavai.registry.sbus.get_object(
- "org.freesmartphone.ogsmd",
- "/org/freesmartphone/GSM/Device",
- "org.freesmartphone.GSM.Device");
- sim = zavai.registry.sbus.get_object(
- "org.freesmartphone.ogsmd",
- "/org/freesmartphone/GSM/Device",
- "org.freesmartphone.GSM.SIM");
// try {
// device.Enable();
{
zavai.log.debug("NOC " + name + " from " + oldOwner + " to " + newOwner);
if (name == "org.freesmartphone.ogsmd" && newOwner != "")
- {
- // Frameworkd started
- device.SetAntennaPower(true, on_antenna_power);
- // reply_handler = self.cbAntennaPowerReply,
- // error_handler = self.cbAntennaPowerError)
- }
- }
-
- protected void on_antenna_power(Error e)
- {
- if (e != null)
- {
- zavai.log.warning("on_antenna_power: " + e.message);
- // if str(e).find("current status is 'enabling'") >= 0 or str(e).find("current status is 'unknown'") >= 0:
- // time.sleep(10)
- // self.cbStartAntenna(0)
- // else:
- // self.gsm_sim_iface.GetAuthStatus(reply_handler = self.cbAuthStatusReply,
- // error_handler = lambda e: (dbg("cbAuthStatusError %s" % e), self.loop.quit()))
- return;
- }
- zavai.log.warning("on_antenna_power ok");
- // network.Register(reply_handler = self.cbRegisterReply,
- // error_handler = lambda e: (dbg("cbRegisterError %s" % e), self.loop.quit()))
+ activator.begin();
}
// Release usage of GPS
return;
}
- network = null;
call = null;
- device = null;
- sim = null;
base.stop();
}