#include "scanner.h" struct _YacosScanner { GObject parent_instance; // TODO: Private data goes here }; static nfc_context *nfc_ctx; // TODO: Migrate to klass static nfc_device *nfc_pnd = NULL; // TODO: Migrate to klass G_DEFINE_TYPE(YacosScanner, yacos_scanner, G_TYPE_OBJECT) enum { SIGNAL_NEWTAG = 0, SIGNAL_COUNT }; guint yacos_scanner_signals[SIGNAL_COUNT]; static gboolean *yacos_scanner_read (gpointer user_data) { YacosScanner *self = YACOS_SCANNER(user_data); // TODO: Scan for tags g_signal_emit(self, yacos_scanner_signals[SIGNAL_NEWTAG], 0); return G_SOURCE_CONTINUE; } static void yacos_scanner_finalize(GObject *gobject) { YacosScanner *obj = yacos_scanner_get_instance_private(YACOS_SCANNER(gobject)); if (nfc_pnd) nfc_close(nfc_pnd); if (nfc_ctx) nfc_exit(nfc_ctx); G_OBJECT_CLASS(yacos_scanner_parent_class)->finalize(gobject); } static void yacos_scanner_class_init(YacosScannerClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS(klass); yacos_scanner_signals[SIGNAL_NEWTAG] = g_signal_newv("newtag", G_TYPE_FROM_CLASS(object_class), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, NULL, NULL, NULL, NULL, G_TYPE_NONE, 0, NULL); object_class->finalize = yacos_scanner_finalize; g_debug("Using libnfc %s", nfc_version()); nfc_init(&nfc_ctx); if (!nfc_ctx) { g_error("Error initializing libnfc"); return; } nfc_pnd = nfc_open(nfc_ctx, NULL); if (!nfc_pnd) { g_error("Error initializing NFC device"); return; } } static void yacos_scanner_init(YacosScanner *self) { g_timeout_add(1000, G_SOURCE_FUNC(yacos_scanner_read), self); } YacosScanner *yacos_scanner_new(void) { return g_object_new(YACOS_TYPE_SCANNER, 0); }