Possible Errors: org.neard.Error.DoesNotExist
org.neard.Error.InvalidArguments
- void StartPoll()
+ void StartPollLoop(string mode)
- The adapter will start polling for targets when calling
- this method. It is only valid when the adapter is in
- initiator mode.
+ Starts the adapter polling loop. Depending on the mode,
+ the adapter will start polling for targets, listening
+ for NFC devices or both.
+ The mode parameter can have the following values:
+ "Initiator", "Target". For any other value, the adapter
+ will start the polling loop in both target and initiator
+ mode.
This process will start emitting TagFound and
PropertyChanged "Polling" signals.
org.neard.Error.Failed
org.neard.Error.NotSupported
- void StopPoll()
+ void StopPollLoop()
- The adapter will stop polling for targets when calling
- this method. It is only available when the adapter is in
- initiator mode.
+ The adapter polling loop will stop.
Possible errors: org.neard.Error.NotReady
org.neard.Error.Failed
in sight, or when it's been de-activated.
-Properties: string Mode [readwrite]
+Properties: string Mode [readonly]
The adapter mode.
Valid types are "initiator" and "target".
- The default value for the adapter mode is "initiator".
boolean Powered [readwrite]
static GHashTable *adapter_hash;
+#define NEAR_ADAPTER_MODE_INITIATOR 0x1
+#define NEAR_ADAPTER_MODE_TARGET 0x2
+#define NEAR_ADAPTER_MODE_DUAL 0x3
+
struct near_adapter {
char *path;
char *name;
uint32_t idx;
uint32_t protocols;
+ uint32_t poll_mode;
+ uint32_t rf_mode;
near_bool_t powered;
near_bool_t polling;
static int adapter_start_poll(struct near_adapter *adapter)
{
int err;
+ uint32_t im_protos, tm_protos;
if (g_hash_table_size(adapter->tags) > 0) {
DBG("Clearing tags");
__near_adapter_devices_changed(adapter->idx);
}
- err = __near_netlink_start_poll(adapter->idx, adapter->protocols);
+ DBG("Poll mode 0x%x", adapter->poll_mode);
+
+ im_protos = tm_protos = 0;
+
+ if (adapter->poll_mode & NEAR_ADAPTER_MODE_INITIATOR)
+ im_protos = adapter->protocols;
+
+ if (adapter->poll_mode & NEAR_ADAPTER_MODE_TARGET)
+ tm_protos = adapter->protocols;
+
+ err = __near_netlink_start_poll(adapter->idx, im_protos, tm_protos);
if (err < 0)
return err;
return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
}
-static DBusMessage *start_poll(DBusConnection *conn,
+static DBusMessage *start_poll_loop(DBusConnection *conn,
DBusMessage *msg, void *data)
{
struct near_adapter *adapter = data;
+ const char *dbus_mode;
int err;
DBG("conn %p", conn);
+ dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &dbus_mode,
+ DBUS_TYPE_INVALID);
+
+ DBG("Mode %s", dbus_mode);
+
+ if (g_strcmp0(dbus_mode, "Initiator") == 0)
+ adapter->poll_mode = NEAR_ADAPTER_MODE_INITIATOR;
+ else if (g_strcmp0(dbus_mode, "Target") == 0)
+ adapter->poll_mode = NEAR_ADAPTER_MODE_TARGET;
+ else
+ adapter->poll_mode = NEAR_ADAPTER_MODE_DUAL;
+
err = adapter_start_poll(adapter);
if (err < 0)
return __near_error_failed(msg, -err);
return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
}
-static DBusMessage *stop_poll(DBusConnection *conn,
+static DBusMessage *stop_poll_loop(DBusConnection *conn,
DBusMessage *msg, void *data)
{
struct near_adapter *adapter = data;
{ GDBUS_METHOD("SetProperty",
GDBUS_ARGS({"name", "s"}, {"value", "v"}),
NULL, set_property) },
- { GDBUS_METHOD("StartPoll", NULL, NULL, start_poll) },
- { GDBUS_METHOD("StopPoll", NULL, NULL, stop_poll) },
+ { GDBUS_METHOD("StartPollLoop", GDBUS_ARGS({"name", "s"}), NULL,
+ start_poll_loop) },
+ { GDBUS_METHOD("StopPollLoop", NULL, NULL, stop_poll_loop) },
{ },
};
#include <near/tlv.h>
int __near_netlink_get_adapters(void);
-int __near_netlink_start_poll(int idx, uint32_t protocols);
+int __near_netlink_start_poll(int idx,
+ uint32_t im_protocols, uint32_t tm_protocols);
int __near_netlink_stop_poll(int idx);
int __near_netlink_dep_link_up(uint32_t idx, uint32_t target_idx,
uint8_t comm_mode, uint8_t rf_mode);
return err;
}
-int __near_netlink_start_poll(int idx, uint32_t protocols)
+int __near_netlink_start_poll(int idx,
+ uint32_t im_protocols, uint32_t tm_protocols)
{
struct nl_msg *msg;
void *hdr;
int family, err = 0;
- DBG("");
+ DBG("IM protos 0x%x TM protos 0x%x", im_protocols, tm_protocols);
msg = nlmsg_alloc();
if (msg == NULL)
}
NLA_PUT_U32(msg, NFC_ATTR_DEVICE_INDEX, idx);
- NLA_PUT_U32(msg, NFC_ATTR_PROTOCOLS, protocols);
+ if (im_protocols != 0)
+ NLA_PUT_U32(msg, NFC_ATTR_IM_PROTOCOLS, im_protocols);
+ if (tm_protocols != 0)
+ NLA_PUT_U32(msg, NFC_ATTR_TM_PROTOCOLS, tm_protocols);
err = nl_send_msg(nfc_state->nl_sock, msg, NULL, NULL);
import dbus
if len(sys.argv) < 2:
- print "Usage: %s <nfc device>" % (sys.argv[0])
+ print "Usage: %s [nfc device] <polling mode>" % (sys.argv[0])
sys.exit(1)
+if len(sys.argv) < 3:
+ mode = ""
+else:
+ mode = sys.argv[2]
+
bus = dbus.SystemBus()
manager = dbus.Interface(bus.get_object("org.neard", "/"),
"org.neard.Manager")
+print "Mode %s" % (mode)
+
path = "/org/neard/" + sys.argv[1]
adapter = dbus.Interface(bus.get_object("org.neard", path),
"org.neard.Adapter")
try:
- adapter.StartPoll()
+ adapter.StartPollLoop(mode)
except dbus.DBusException, error:
print "%s: %s" % (error._dbus_error_name, error.message)
"org.neard.Adapter")
try:
- adapter.StopPoll()
+ adapter.StopPollLoop()
except dbus.DBusException, error:
print "%s: %s" % (error._dbus_error_name, error.message)