mercury-api-0.1.0.0: cbits/glue/glue.h
#ifndef GLUE_H
#define GLUE_H
#include <stdbool.h>
#include <time.h>
#include <HsFFI.h>
#include "tm_reader.h"
/** An error which originates from the Haskell binding, not the underlying C library. */
#define ERROR_TYPE_BINDING 127L
#define ERROR_BINDING(x) TMR_STATUS_MAKE(ERROR_TYPE_BINDING, (x))
/** Attempt to use reader after it was destroyed. */
#define ERROR_ALREADY_DESTROYED ERROR_BINDING(1)
typedef struct TransportListenerEtc TransportListenerEtc;
typedef struct ReaderEtc ReaderEtc;
typedef struct List16 List16;
typedef struct List8 List8;
typedef struct ReadPlanEtc ReadPlanEtc;
typedef struct TagOpEtc TagOpEtc;
typedef struct TagFilterEtc TagFilterEtc;
struct ReaderEtc {
TMR_Reader reader;
TransportListenerEtc *transportListeners;
ReadPlanEtc *readPlan;
bool destroyed;
char uri[1]; // must be last
};
struct TransportListenerEtc {
TMR_TransportListenerBlock block;
char *key;
HsFunPtr funPtr;
struct TransportListenerEtc *next;
};
/* Has the same storage layout as the various TMR_*List structs
* which use a 16-bit length, such as:
* TMR_uint8List
* TMR_uint16List
* TMR_uint32List
* TMR_StatsPerAntennaValuesList
* Can also be used for TMR_String, if you ignore len.
*/
struct List16 {
/** The array of values */
void *list;
/** The number of entries there is space for in the array */
uint16_t max;
/** The number of entries in the list - may be larger than max, indicating truncated data. */
uint16_t len;
};
/* Has the same storage layout as the various TMR_*List structs
* which use an 8-bit length, such as:
* TMR_int8List
* TMR_RegionList
* TMR_TagProtocolList
*/
struct List8 {
/** The array of values */
void *list;
/** The number of entries there is space for in the array */
uint8_t max;
/** The number of entries in the list - may be larger than max, indicating truncated data. */
uint8_t len;
};
#define GLUE_MAX_MASK TMR_MAX_EMBEDDED_DATA_LENGTH
struct TagFilterEtc {
TMR_TagFilter filter;
uint8_t mask[GLUE_MAX_MASK];
};
#define GLUE_MAX_DATA16 TMR_MAX_EMBEDDED_DATA_LENGTH
struct TagOpEtc {
TMR_TagOp tagop;
union {
TMR_TagData epc;
uint16_t data16[GLUE_MAX_DATA16];
} u;
};
#define GLUE_MAX_ANTENNAS TMR_SR_MAX_ANTENNA_PORTS
#define GLUE_MAX_GPIPORTS 16
struct ReadPlanEtc {
TMR_ReadPlan plan;
uint8_t antennas[GLUE_MAX_ANTENNAS];
uint8_t gpiPorts[GLUE_MAX_GPIPORTS];
TagFilterEtc filter;
TagOpEtc tagop;
};
TMR_Status c_TMR_create (ReaderEtc *reader, const char *deviceUri);
TMR_Status c_TMR_connect (ReaderEtc *reader);
TMR_Status c_TMR_destroy (ReaderEtc *reader);
TMR_Status c_TMR_read (ReaderEtc *reader, uint32_t timeoutMs, int32_t *tagCount);
TMR_Status c_TMR_hasMoreTags (ReaderEtc *reader);
TMR_Status c_TMR_getNextTag (ReaderEtc *reader, TMR_TagReadData *tagData);
TMR_Status c_TMR_executeTagOp (ReaderEtc *reader,
TMR_TagOp *tagop,
TMR_TagFilter *filter,
TMR_uint8List *data);
TMR_Status c_TMR_gpoSet (ReaderEtc *reader,
uint8_t count,
const TMR_GpioPin state[]);
TMR_Status c_TMR_gpiGet (ReaderEtc *reader,
uint8_t *count,
TMR_GpioPin state[]);
TMR_Status c_TMR_firmwareLoad (ReaderEtc *reader,
uint8_t *firmwareStart,
uint32_t firmwareSize);
TMR_Status c_TMR_paramSet (ReaderEtc *reader,
TMR_Param key,
const void *value);
TMR_Status c_TMR_paramGet (ReaderEtc *reader, TMR_Param key, void *value);
TMR_Status c_TMR_reboot (ReaderEtc *reader);
void c_default_read_plan (TMR_ReadPlan *rp);
TMR_Status c_TMR_paramList (ReaderEtc *reader, TMR_Param *keys, uint32_t *len);
TMR_Status c_TMR_addTransportListener (ReaderEtc *reader,
TMR_TransportListener func,
char *unique);
TMR_Status c_TMR_removeTransportListener (ReaderEtc *reader,
const char *unique);
const char *c_TMR_strerr (ReaderEtc *reader, TMR_Status status);
void *c_new_c_locale (void);
int c_format_time (char *buf,
size_t len,
const char *fmt,
time_t seconds,
bool local,
void *locale);
#endif /* GLUE_H */