yacos/src/scanner.c

77 lines
1.7 KiB
C

#include "scanner.h"
struct _YacosScanner {
GObject parent_instance;
nfc_context *nfc_ctx;
nfc_device *nfc_pnd;
};
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 *self = yacos_scanner_get_instance_private(YACOS_SCANNER(gobject));
if (self->nfc_pnd)
nfc_close(self->nfc_pnd);
if (self->nfc_ctx)
nfc_exit(self->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;
}
static void yacos_scanner_init(YacosScanner *self)
{
g_debug("Using libnfc %s", nfc_version());
nfc_init(&self->nfc_ctx);
if (!self->nfc_ctx) {
g_error("Error initializing libnfc");
return;
}
self->nfc_pnd = nfc_open(self->nfc_ctx, NULL);
if (!self->nfc_pnd) {
g_error("Error initializing NFC device");
return;
}
g_timeout_add(1000, G_SOURCE_FUNC(yacos_scanner_read), self);
}
YacosScanner *yacos_scanner_new(void)
{
return g_object_new(YACOS_TYPE_SCANNER, 0);
}