diff -ruN libphidgets-pure/include/assert.h libphidgets-test/include/assert.h --- libphidgets-pure/include/assert.h 2005-02-20 13:14:47.000000000 -0600 +++ libphidgets-test/include/assert.h 2005-03-31 02:30:24.033197224 -0600 @@ -3,7 +3,7 @@ #ifndef PHIDGETS_INTERNAL # error "this file is only supposed to be used from within libphidgets." -#endif // PHIDGETS_INTERNAL +#endif /* PHIDGETS_INTERNAL */ #include #include @@ -12,7 +12,7 @@ fprintf(phidgets_debug_stream, "*** ASSERTION FAILURE in %s() [%s:%d]: %s\n", \ __FUNCTION__, __FILE__, __LINE__, #a) -#endif // __INCLUDED_DEBUG_H__ +#endif /* __INCLUDED_DEBUG_H__ */ /* COPYRIGHT -- * diff -ruN libphidgets-pure/include/debug.h libphidgets-test/include/debug.h --- libphidgets-pure/include/debug.h 2005-02-20 13:14:47.000000000 -0600 +++ libphidgets-test/include/debug.h 2005-03-31 02:30:24.034197072 -0600 @@ -3,7 +3,7 @@ #ifndef PHIDGETS_INTERNAL # error "this file is only supposed to be used from within libphidgets." -#endif // PHIDGETS_INTERNAL +#endif /* PHIDGETS_INTERNAL */ #include @@ -19,7 +19,7 @@ #define WARNING(s, a...) if (phidgets_debug_level & HID_DEBUG_WARNINGS) { DEBUGPRINTF("WARNING", s, ##a) } #define ERROR(s, a...) if (phidgets_debug_level & HID_DEBUG_ERRORS) { DEBUGPRINTF(" ERROR", s, ##a) } -#endif // __INCLUDED_DEBUG_H__ +#endif /* __INCLUDED_DEBUG_H__ */ /* COPYRIGHT -- * diff -ruN libphidgets-pure/include/phidgets/constants.h libphidgets-test/include/phidgets/constants.h --- libphidgets-pure/include/phidgets/constants.h 2005-02-20 13:14:47.000000000 -0600 +++ libphidgets-test/include/phidgets/constants.h 2005-03-31 02:30:24.034197072 -0600 @@ -5,6 +5,8 @@ #define PHIDGETS_USB_VENDORID 0x06C2 +#define PHIDGETS_USB_PRODUCTID_RFID 0x0031 + #define PHIDGETS_USB_PRODUCTID_QUADSERVO 0x0038 #define PHIDGETS_USB_PRODUCTID_INTERFACEKIT_0_0_4 0x0040 @@ -13,7 +15,7 @@ #define PHIDGETS_USB_PRODUCTID_INTERFACEKIT_0_5_7 0x0051 #define PHIDGETS_USB_PRODUCTID_INTERFACEKIT_0_8_8 0x0053 -// InterfaceKit 0/5/7 = AnalogIn / DigitalIn / DigitalOut +/* InterfaceKit 0/5/7 = AnalogIn / DigitalIn / DigitalOut */ #define PHIDGETS_INTERFACEKIT_MAX_ANALOG_INPUTS 8 #define PHIDGETS_INTERFACEKIT_MAX_DIGITAL_INPUTS 16 #define PHIDGETS_INTERFACEKIT_MAX_DIGITAL_OUTPUTS 16 @@ -25,6 +27,16 @@ #define PHIDGETS_HID_PATH_2 0xffa00002 #define PHIDGETS_HID_PATH_INTERFACEKIT_DIGITAL_OUTPUT_SET 0xffa10008 #define PHIDGETS_HID_PATH_INTERFACEKIT_DIGITAL_OUTPUT_GET 0xffa10000 +#define PHIDGETS_HID_PATH_RFID_SET 0xffa1000b + +#define PHIDGETS_RFID_SET_PACKETLEN 4 +#define PHIDGETS_RFID_GET_PACKETLEN 7 + +/* Bitfield for setting the state on the RFID reader */ +#define PHIDGETS_RFID_PLUS_FIVE 0x1 +#define PHIDGETS_RFID_EXTERNAL_LED 0x2 +#define PHIDGETS_RFID_ONBOARD_LED 0x4 +#define PHIDGETS_RFID_ENABLE 0x8 #define USB_CONTROL_DATA_SOMETHINGELSE 0x80 #define USB_CONTROL_DATA_WRITE 0x40 @@ -43,7 +55,7 @@ #define USB_CONTROL_REQUESTCODE_SET_CONFIGURATION 0x9 -#endif // __INCLUDED_PHIDGETS_CONSTANTS_H__ +#endif /* __INCLUDED_PHIDGETS_CONSTANTS_H__ */ /* COPYRIGHT -- * diff -ruN libphidgets-pure/include/phidgets/phidgets.h libphidgets-test/include/phidgets/phidgets.h --- libphidgets-pure/include/phidgets/phidgets.h 2005-02-20 13:14:47.000000000 -0600 +++ libphidgets-test/include/phidgets/phidgets.h 2005-03-31 02:30:24.035196920 -0600 @@ -21,7 +21,8 @@ PHIDGET_RET_NOT_INITIALISED, PHIDGET_RET_HID_ERROR, PHIDGET_RET_DEVICE_ALREADY_OPENED, - PHIDGET_RET_DEVICE_NOT_OPENED + PHIDGET_RET_DEVICE_NOT_OPENED, + PHIDGET_RET_TIMEOUT } phidget_return; typedef struct Phidget_t { @@ -73,7 +74,7 @@ } #endif -#endif // __INCLUDED_PHIDGETS_H__ +#endif /* __INCLUDED_PHIDGETS_H__ */ /* COPYRIGHT -- * diff -ruN libphidgets-pure/include/phidgets/rfid.h libphidgets-test/include/phidgets/rfid.h --- libphidgets-pure/include/phidgets/rfid.h 1969-12-31 18:00:00.000000000 -0600 +++ libphidgets-test/include/phidgets/rfid.h 2005-03-31 02:30:24.035196920 -0600 @@ -0,0 +1,49 @@ +#ifndef __INCLUDED_PHIDGETS_RFID_H__ +#define __INCLUDED_PHIDGETS_RFID_H__ + +#include + +typedef enum phidget_rfid_toggle { + PHIDGET_RFID_PLUS_FIVE = 0, + PHIDGET_RFID_EXTERNAL_LED, + PHIDGET_RFID_ONBOARD_LED, + PHIDGET_RFID_ENABLE +} phidget_rfid_toggle; + +typedef struct PhidgetRFID_t { + Phidget *phidget; + + /* Timestamp and last tag */ + time_t time; + unsigned long long l_tag; + + /* Expanded Bitfield */ + bool onboard_led; + bool plus_five; + bool external_led; + bool enabled; +} PhidgetRFID; + +#ifdef __cplusplus +extern "C" { +#endif + +PhidgetRFID* phidget_new_PhidgetRFID(); +void phidget_delete_PhidgetRFID(PhidgetRFID** const qsc); +void phidget_reset_PhidgetRFID(PhidgetRFID* const qsc); +phidget_return phidget_rfid_open(PhidgetRFID* const qsc, + unsigned int serial, unsigned short retries); +phidget_return phidget_rfid_close(PhidgetRFID* const qsc); +bool phidget_rfid_is_opened(PhidgetRFID const* const qsc); + +phidget_return phidget_rfid_set_state(PhidgetRFID* const qsc, + bool enable, bool onboard_led, bool external_led, bool plus_five); +phidget_return phidget_rfid_set_toggle(PhidgetRFID* const qsc, + phidget_rfid_toggle which, bool state); +phidget_return phidget_rfid_get_tag(PhidgetRFID* const qsc, const int timeout); + +#ifdef __cplusplus +} +#endif + +#endif /* __INCLUDED_PHIDGETS_RFID_H__ */ diff -ruN libphidgets-pure/src/Makefile.am libphidgets-test/src/Makefile.am --- libphidgets-pure/src/Makefile.am 2005-02-20 13:14:48.000000000 -0600 +++ libphidgets-test/src/Makefile.am 2005-03-31 02:30:24.035196920 -0600 @@ -11,6 +11,7 @@ servomotor.c \ quadservo.c \ interfacekit.c \ + rfid.c \ debug.c bin_PROGRAMS = phidget-quadservo-calibrate @@ -23,6 +24,7 @@ ../include/phidgets/phidgets.h \ ../include/phidgets/servomotor.h \ ../include/phidgets/quadservo.h \ + ../include/phidgets/rfid.h \ ../include/phidgets/interfacekit.h clean-local: diff -ruN libphidgets-pure/src/rfid.c libphidgets-test/src/rfid.c --- libphidgets-pure/src/rfid.c 1969-12-31 18:00:00.000000000 -0600 +++ libphidgets-test/src/rfid.c 2005-03-31 02:30:24.036196768 -0600 @@ -0,0 +1,213 @@ +#define PHIDGETS_INTERNAL + +#include +#include +#include + +/* System includes */ +#include + +PhidgetRFID* phidget_new_PhidgetRFID() +{ + PhidgetRFID *ret; + + TRACE("creating a new PhidgetRFID instance..."); + + ret = (PhidgetRFID*)malloc(sizeof(PhidgetRFID)); + if(!ret) { + ERROR("could not allocate memory for PhidgetRFID instance."); + return 0; + } + + ret->phidget = phidget_new_Phidget(); + + phidget_reset_PhidgetRFID(ret); + return ret; +} + +void phidget_delete_PhidgetRFID(PhidgetRFID** const qsc) +{ + if (!qsc || !*qsc) { + ERROR("cannot delete NULL PhidgetRFID."); + return; + } + + free(*qsc); + *qsc = 0; +} + +void phidget_reset_PhidgetRFID(PhidgetRFID* const qsc) +{ + if(!qsc) { + ERROR("cannot reset NULL PhidgetRFID."); + } + + phidget_reset_Phidget(qsc->phidget); + + qsc->onboard_led = false; + qsc->plus_five = false; + qsc->external_led = false; + qsc->enabled = false; +} + +phidget_return phidget_rfid_open(PhidgetRFID* const qsc, + unsigned int serial, unsigned short retries) +{ + HIDInterfaceMatcher matcher; + phidget_return ret; + + if(!phidget_is_initialised()) { + ERROR("cannot open PhidgetRFID when Phidgets library has not been initialised."); + return PHIDGET_RET_NOT_INITIALISED; + } + + if(!qsc) { + ERROR("cannot open NULL PhidgetRFID."); + return PHIDGET_RET_INVALID_PARAMETER; + } + + if(phidget_rfid_is_opened(qsc)) { + ERROR("cannot open already opened PhidgetRFID."); + return PHIDGET_RET_DEVICE_ALREADY_OPENED; + } + + TRACE("opening PhidgetRFID with serial number %d...", serial); + + matcher.vendor_id = PHIDGETS_USB_VENDORID; + matcher.product_id = PHIDGETS_USB_PRODUCTID_RFID; + + ret = phidget_open(qsc->phidget, 0, &matcher, serial, retries); + if(ret != PHIDGET_RET_SUCCESS) return ret; + + NOTICE("successfully opened PhidgetRFID %s...", qsc->phidget->id); + return PHIDGET_RET_SUCCESS; +} + +phidget_return phidget_rfid_close(PhidgetRFID* const qsc) +{ + if(!qsc) { + ERROR("cannot close NULL PhidgetRFID."); + return PHIDGET_RET_INVALID_PARAMETER; + } + + if(phidget_rfid_is_opened(qsc)) { + phidget_return ret; + TRACE("closing PhidgetRFID %s...", qsc->phidget->id); + ret = phidget_close(qsc->phidget); + if (ret != PHIDGET_RET_SUCCESS) return ret; + } + else WARNING("attempt to close unopened PhidgetRFID."); + + NOTICE("successfully closed PhidgetRFID %s.", qsc->phidget->id); + return PHIDGET_RET_SUCCESS; +} + +bool phidget_rfid_is_opened(PhidgetRFID const* const qsc) +{ + if(!qsc) WARNING("attempting to query open status of NULL PhidgetRFID."); + return qsc && phidget_is_opened(qsc->phidget); +} + +phidget_return phidget_rfid_set_toggle(PhidgetRFID* const qsc, + phidget_rfid_toggle which, bool state) +{ + bool enabled = qsc->enabled, + onboard_led = qsc->onboard_led, + external_led = qsc->external_led, + plus_five = qsc->plus_five; + + switch(which) { + case PHIDGET_RFID_PLUS_FIVE: plus_five = state; break; + case PHIDGET_RFID_EXTERNAL_LED: external_led = state; break; + case PHIDGET_RFID_ONBOARD_LED: onboard_led = state; break; + case PHIDGET_RFID_ENABLE: enabled = state; break; + default: + return PHIDGET_RET_INVALID_PARAMETER; + } + + return phidget_rfid_set_state(qsc, enabled, onboard_led, external_led, + plus_five); +} + +phidget_return phidget_rfid_set_state(PhidgetRFID* const qsc, + bool enable, bool onboard_led, bool external_led, bool plus_five) +{ + char packet[PHIDGETS_RFID_SET_PACKETLEN]; + int const PATH[] = + { PHIDGETS_HID_PATH_1, PHIDGETS_HID_PATH_2, PHIDGETS_HID_PATH_RFID_SET }; + hid_return ret; + + if(!phidget_rfid_is_opened(qsc)) { + ERROR("cannot toggle led of unopen PhidgetRFID."); + return PHIDGET_RET_DEVICE_NOT_OPENED; + } + + TRACE("setting state: enabled: %i; onboard led: %i; external led: %i; +5: %i.", enable, onboard_led, external_led, plus_five); + + packet[0] = packet[1] = packet[2] = packet[3] = 0; + if (enable) packet[0] |= PHIDGETS_RFID_ENABLE; + if (onboard_led) packet[0] |= PHIDGETS_RFID_ONBOARD_LED; + if (external_led) packet[0] |= PHIDGETS_RFID_EXTERNAL_LED; + if (plus_five) packet[0] |= PHIDGETS_RFID_PLUS_FIVE; + + TRACE("sending packet 0x[%02x %02x %02x %02x] to PhidgetRFID " + "%s.", packet[0], packet[1], packet[2], packet[3], qsc->phidget->id); + + + ret = hid_set_output_report(qsc->phidget->hid_iface, + PATH, PHIDGETS_HID_PATH_DEPTH, packet, 4); + if(ret != HID_RET_SUCCESS) { + WARNING("failed to send packet to PhidgetRFID %s.", qsc->phidget->id); + return PHIDGET_RET_HID_ERROR; + } + + qsc->enabled = enable; + qsc->onboard_led = onboard_led; + qsc->external_led = external_led; + qsc->plus_five = plus_five; + + return PHIDGET_RET_SUCCESS; +} + +phidget_return phidget_rfid_get_tag(PhidgetRFID *const qsc, const int timeout) { + int i, ret; + char packet[PHIDGETS_RFID_GET_PACKETLEN]; + + if(!phidget_rfid_is_opened(qsc)) { + ERROR("cannot get tag of unopened PhidgetRFID."); + return PHIDGET_RET_DEVICE_NOT_OPENED; + } + + TRACE("getting tag off of PhidgetRFID %s.", qsc->phidget->id); + + /* Read the initial card + * 0 means we got garbage .. -110 means we timed out */ + ret = 0; + while(ret == 0) { + ret = usb_interrupt_read(qsc->phidget->hid_iface->dev_handle, + USB_ENDPOINT_IN + 1, packet, PHIDGETS_RFID_GET_PACKETLEN, timeout); + } + + /* Did we timeout, or actually get an entire packet, or something else? */ + if (ret != PHIDGETS_RFID_GET_PACKETLEN) { + NOTICE("Read Error: %i", ret); + if (ret == -110) + return PHIDGET_RET_TIMEOUT; + return PHIDGET_RET_HID_ERROR; + } + + /* Convert tag to a long long */ + qsc->l_tag = 0; + for(i = 1; i <= 5; i++) { + qsc->l_tag <<= 8; + qsc->l_tag |= (0xFF & packet[i]); + } + + /* Set timestamp */ + qsc->time = time(NULL); + + TRACE("receieved tag: [ %02hhx %02hhx %02hhx %02hhx %02hhx ]", + packet[1], packet[2], packet[3], packet[4], packet[5]); + + return PHIDGET_RET_SUCCESS; +} diff -ruN libphidgets-pure/swig/Makefile.am libphidgets-test/swig/Makefile.am --- libphidgets-pure/swig/Makefile.am 2005-02-20 13:14:49.000000000 -0600 +++ libphidgets-test/swig/Makefile.am 2005-03-31 02:30:38.067063752 -0600 @@ -15,13 +15,15 @@ phidgets.i \ servomotor.i \ quadservo.i \ - interfacekit.i + interfacekit.i \ + rfid.i pkgpyexec_LTLIBRARIES = \ _phidgets.la \ _servomotor.la \ _quadservo.la \ - _interfacekit.la + _interfacekit.la \ + _rfid.la nodist__phidgets_la_SOURCES = phidgets_wrap.c _phidgets_la_DEPENDENCIES = ../src/libphidgets.la @@ -39,10 +41,15 @@ _interfacekit_la_DEPENDENCIES = ../src/libphidgets.la _interfacekit_la_LDFLAGS = -module +nodist__rfid_la_SOURCES = rfid_wrap.c +_rfid_la_DEPENDENCIES = ../src/libphidgets.la +_rfid_la_LDFLAGS = -module + nodist_pkgpython_PYTHON = __init__.py \ servomotor.py \ quadservo.py \ - interfacekit.py + interfacekit.py \ + rfid.py EXTRA_DIST = README diff -ruN libphidgets-pure/swig/rfid.i libphidgets-test/swig/rfid.i --- libphidgets-pure/swig/rfid.i 1969-12-31 18:00:00.000000000 -0600 +++ libphidgets-test/swig/rfid.i 2005-03-31 02:30:38.067063752 -0600 @@ -0,0 +1,7 @@ +%module rfid +%{ +#include +%} + +%include "phidgets/rfid.h" + diff -ruN libphidgets-pure/test/Makefile.am libphidgets-test/test/Makefile.am --- libphidgets-pure/test/Makefile.am 2005-02-20 13:14:51.000000000 -0600 +++ libphidgets-test/test/Makefile.am 2005-03-31 02:30:24.037196616 -0600 @@ -5,7 +5,7 @@ AM_CFLAGS = AM_LDFLAGS = -lm -lncurses -noinst_PROGRAMS = test_libphidgets test_libphidgets_interfacekit +noinst_PROGRAMS = test_libphidgets test_libphidgets_interfacekit test_libphidgets_rfid test_libphidgets_SOURCES = test_libphidgets.c test_libphidgets_DEPENDENCIES = ../src/libphidgets.la test_libphidgets_LDADD = ../src/libphidgets.la @@ -14,6 +14,10 @@ test_libphidgets_interfacekit_DEPENDENCIES = ../src/libphidgets.la test_libphidgets_interfacekit_LDADD = ../src/libphidgets.la +test_libphidgets_rfid_SOURCES = test_libphidgets_rfid.c +test_libphidgets_rfid_DEPENDENCIES = ../src/libphidgets.la +test_libphidgets_rfid_LDADD = ../src/libphidgets.la + ../src/libphidgets.la:: @$(MAKE) -sC ../src libphidgets.la diff -ruN libphidgets-pure/test/test_libphidgets_rfid.c libphidgets-test/test/test_libphidgets_rfid.c --- libphidgets-pure/test/test_libphidgets_rfid.c 1969-12-31 18:00:00.000000000 -0600 +++ libphidgets-test/test/test_libphidgets_rfid.c 2005-03-31 02:30:24.037196616 -0600 @@ -0,0 +1,132 @@ +#include +#include + +#include +#include + +void fail_cleanup(PhidgetRFID* rfid, int r); +void clean(PhidgetRFID* rfid); + +void usage(void) { + fprintf(stderr, "Usage: test_libphidgets_rfid serial\n"); +} + +int main(int argc, char * argv[]) { + PhidgetRFID *rfid; + phidget_return ret; + int i; + + if(argc != 2) { + usage(); + return 1; + } + + int serial = atoi(argv[1]); + + phidget_set_debug(PHIDGET_DEBUG_NONE); + phidget_set_debug_stream(stderr); + /*hid_set_debug(HID_DEBUG_ALL); + hid_set_debug_stream(stderr);*/ + + ret = phidget_init(); + if(ret != PHIDGET_RET_SUCCESS) { + fprintf(stderr, "failed to init phidgets.\n"); + phidget_cleanup(); + return 1; + } + + rfid = phidget_new_PhidgetRFID(); + + ret = phidget_rfid_open(rfid, serial, 3); + if(ret != PHIDGET_RET_SUCCESS) + { + fprintf(stderr, "failed to open RFID.\n"); + fail_cleanup(rfid, 1); + } + + /* Turn everything off */ + ret = phidget_rfid_set_state(rfid, false, false, false, false); + if (ret != PHIDGET_RET_SUCCESS) + { + fprintf(stderr, "failed to set default state.\n"); + fail_cleanup(rfid, 1); + } + + + /* Bring everything up one at a time */ + ret = phidget_rfid_set_toggle(rfid, PHIDGET_RFID_ENABLE, true); + if (ret != PHIDGET_RET_SUCCESS) + { + fprintf(stderr, "failed to enable reader.\n"); + fail_cleanup(rfid, 1); + } + + ret = phidget_rfid_set_toggle(rfid, PHIDGET_RFID_EXTERNAL_LED, true); + if (ret != PHIDGET_RET_SUCCESS) + { + fprintf(stderr, "failed to turn on external LED.\n"); + fail_cleanup(rfid, 1); + } + + ret = phidget_rfid_set_toggle(rfid, PHIDGET_RFID_ONBOARD_LED, true); + if (ret != PHIDGET_RET_SUCCESS) + { + fprintf(stderr, "failed to enable onboard LED.\n"); + fail_cleanup(rfid, 1); + } + + ret = phidget_rfid_set_toggle(rfid, PHIDGET_RFID_PLUS_FIVE, true); + if (ret != PHIDGET_RET_SUCCESS) + { + fprintf(stderr, "failed to enable +5.\n"); + fail_cleanup(rfid, 1); + } + + /* Turn everything off but the enable */ + ret = phidget_rfid_set_state(rfid, true, false, false, false); + if (ret != PHIDGET_RET_SUCCESS) + { + fprintf(stderr, "failed to turn off everything but enable.\n"); + fail_cleanup(rfid, 1); + } + + printf("Attempting to read 15 tags...\n"); + for(i = 0; i < 15; i++) { + ret = phidget_rfid_get_tag(rfid, 6000); + if (ret != PHIDGET_RET_SUCCESS) { + if (ret == PHIDGET_RET_TIMEOUT) { + fprintf(stderr, "Timed out: please wave rfid tag over reader\n"); + continue; + } + + fprintf(stderr, "failed to get a tag %i.\n", ret); + fail_cleanup(rfid, 1); + } + + fprintf(stderr, "Read tag: %010llx at %lu seconds\n", + rfid->l_tag, rfid->time); + } + + /* Disable reader */ + ret = phidget_rfid_set_state(rfid, false, false, false, false); + if (ret != PHIDGET_RET_SUCCESS) + { + fprintf(stderr, "failed to disable reader LED.\n"); + fail_cleanup(rfid, 1); + } + + cleanup(rfid); +} + +void fail_cleanup(PhidgetRFID* rfid, const int r) +{ + cleanup(rfid); + exit(r); +} + +void cleanup(PhidgetRFID* rfid) { + phidget_rfid_close(rfid); + phidget_delete_PhidgetRFID(&rfid); + phidget_cleanup(); +} +