summaryrefslogtreecommitdiff
path: root/src/adapter.c
diff options
context:
space:
mode:
authorSamuel Ortiz <sameo@linux.intel.com>2012-05-25 16:06:23 +0200
committerSamuel Ortiz <sameo@linux.intel.com>2012-05-26 16:22:47 +0200
commit4e92706073a4eff5e39de81bd6ec7c298ef70aff (patch)
tree5c0cf3f342e6ec97ece3accee3ddff5b7192ef34 /src/adapter.c
parent8c31393aed8ad8b9548e6e9d95cbaf30881d4b9b (diff)
downloadneard-4e92706073a4eff5e39de81bd6ec7c298ef70aff.tar.gz
neard-4e92706073a4eff5e39de81bd6ec7c298ef70aff.tar.bz2
neard-4e92706073a4eff5e39de81bd6ec7c298ef70aff.zip
adapter: Implement new polling loop D-Bus API
The simple StartPoll is replaced with a polling loop method, where polling mode is specified. It can be Initiator, Target or both. When starting the polling loop in Target mode an NFC device could eventually activate us.
Diffstat (limited to 'src/adapter.c')
-rw-r--r--src/adapter.c41
1 files changed, 36 insertions, 5 deletions
diff --git a/src/adapter.c b/src/adapter.c
index 02a0329..b5f3fde 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -42,12 +42,18 @@ static DBusConnection *connection = NULL;
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;
@@ -119,6 +125,7 @@ static void polling_changed(struct near_adapter *adapter)
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");
@@ -134,7 +141,17 @@ static int adapter_start_poll(struct near_adapter *adapter)
__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;
@@ -367,14 +384,27 @@ static DBusMessage *set_property(DBusConnection *conn,
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);
@@ -382,7 +412,7 @@ static DBusMessage *start_poll(DBusConnection *conn,
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;
@@ -469,8 +499,9 @@ static const GDBusMethodTable adapter_methods[] = {
{ 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) },
{ },
};