From 2e7daf717d1c0fea50f1304b2f79d62ff531fc5a Mon Sep 17 00:00:00 2001 From: Dorota Moskal Date: Mon, 8 Oct 2012 21:52:11 +0200 Subject: [PATCH] tag: Don't check presence while busy When reading, writing or formating is in progress, no check presence should be done. --- src/adapter.c | 33 +++++++++++++++++++++++++++++++++ src/near.h | 2 ++ src/tag.c | 41 +++++++++++++++++++++++++++++++++-------- 3 files changed, 68 insertions(+), 8 deletions(-) diff --git a/src/adapter.c b/src/adapter.c index e5f9e6a..ca80ed6 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -499,6 +499,39 @@ static void tag_present_cb(uint32_t adapter_idx, uint32_t target_idx, check_presence, adapter); } +void __near_adapter_start_check_presence(uint32_t adapter_idx, + uint32_t target_idx) +{ + struct near_adapter *adapter; + + DBG(""); + + adapter = g_hash_table_lookup(adapter_hash, + GINT_TO_POINTER(adapter_idx)); + if (adapter == NULL) + return; + + adapter->presence_timeout = + g_timeout_add_seconds(CHECK_PRESENCE_PERIOD, + check_presence, adapter); +} + +void __near_adapter_stop_check_presence(uint32_t adapter_idx, + uint32_t target_idx) +{ + struct near_adapter *adapter; + + DBG(""); + + adapter = g_hash_table_lookup(adapter_hash, + GINT_TO_POINTER(adapter_idx)); + if (adapter == NULL) + return; + + if (adapter->presence_timeout > 0) + g_source_remove(adapter->presence_timeout); +} + static const GDBusMethodTable adapter_methods[] = { { GDBUS_METHOD("GetProperties", NULL, GDBUS_ARGS({"properties", "a{sv}"}), diff --git a/src/near.h b/src/near.h index aee34be..3e0ccf6 100644 --- a/src/near.h +++ b/src/near.h @@ -91,6 +91,8 @@ void __near_adapter_tags_changed(uint32_t adapter_idx); void __near_adapter_devices_changed(uint32_t adapter_idx); void __near_adapter_listen(struct near_device_driver *driver); void __near_adapter_list(DBusMessageIter *iter, void *user_data); +void __near_adapter_start_check_presence(uint32_t adapter_idx, uint32_t target_idx); +void __near_adapter_stop_check_presence(uint32_t adapter_idx, uint32_t target_idx); int __near_adapter_init(void); void __near_adapter_cleanup(void); diff --git a/src/tag.c b/src/tag.c index b4aff76..363f083 100644 --- a/src/tag.c +++ b/src/tag.c @@ -230,6 +230,8 @@ static DBusMessage *set_property(DBusConnection *conn, static void tag_read_cb(uint32_t adapter_idx, uint32_t target_idx, int status) { + __near_adapter_start_check_presence(adapter_idx, target_idx); + __near_adapter_tags_changed(adapter_idx); } @@ -245,7 +247,7 @@ static void write_cb(uint32_t adapter_idx, uint32_t target_idx, int status) tag = near_tag_get_tag(adapter_idx, target_idx); if (conn == NULL || tag == NULL) - return; + goto out; if (status != 0) { reply = __near_error_failed(tag->write_msg, EINVAL); @@ -263,8 +265,17 @@ static void write_cb(uint32_t adapter_idx, uint32_t target_idx, int status) tag->records = NULL; g_free(tag->data); - if (status == 0) + if (status == 0) { + /* + * If writing succeeded, + * check presence will be restored after reading + */ __near_tag_read(tag, tag_read_cb); + return; + } + +out: + __near_adapter_start_check_presence(tag->adapter_idx, tag->target_idx); } static void format_cb(uint32_t adapter_idx, uint32_t target_idx, int status) @@ -908,6 +919,9 @@ int __near_tag_read(struct near_tag *tag, near_tag_io_cb cb) DBG("type 0x%x", tag->type); + /* Stop check presence while reading */ + __near_adapter_stop_check_presence(tag->adapter_idx, tag->target_idx); + for (list = driver_list; list; list = list->next) { struct near_tag_driver *driver = list->data; @@ -936,21 +950,32 @@ int __near_tag_write(struct near_tag *tag, DBG("driver type 0x%x", driver->type); if (driver->type == tag->type) { + /* Stop check presence while writing */ + __near_adapter_stop_check_presence(tag->adapter_idx, + tag->target_idx); + if (tag->blank == TRUE && driver->format != NULL) { DBG("Blank tag detected, formatting"); err = driver->format(tag->adapter_idx, tag->target_idx, format_cb); - if (err < 0) - return err; } else { - return driver->write(tag->adapter_idx, - tag->target_idx, ndef, - cb); + err = driver->write(tag->adapter_idx, + tag->target_idx, ndef, + cb); } + + break; } } - return 0; + if (list == NULL) + err = -EOPNOTSUPP; + + if (err < 0) + __near_adapter_start_check_presence(tag->adapter_idx, + tag->target_idx); + + return err; } int __near_tag_check_presence(struct near_tag *tag, near_tag_io_cb cb) -- 2.7.4