diff --git a/include/hsdaoh.h b/include/hsdaoh.h index d3ad647..f1c374c 100644 --- a/include/hsdaoh.h +++ b/include/hsdaoh.h @@ -34,6 +34,14 @@ extern "C" { #include #include +typedef struct hsdaoh_data_info { + void *ctx; + unsigned char *buf; + uint32_t len; /* buffer length */ + uint16_t stream_id; + bool device_error; /* device error happened, terminate application */ +} hsdaoh_data_info_t; + typedef struct hsdaoh_dev hsdaoh_dev_t; HSDAOH_API uint32_t hsdaoh_get_device_count(void); @@ -89,7 +97,7 @@ HSDAOH_API int hsdaoh_get_usb_strings(hsdaoh_dev_t *dev, char *manufact, /* streaming functions */ -typedef void(*hsdaoh_read_cb_t)(unsigned char *buf, uint32_t len, void *ctx); +typedef void(*hsdaoh_read_cb_t)(hsdaoh_data_info_t *data_info); /*! * Start streaming data from the device. diff --git a/src/hsdaoh_file.c b/src/hsdaoh_file.c index cf27cf2..454cac0 100644 --- a/src/hsdaoh_file.c +++ b/src/hsdaoh_file.c @@ -75,8 +75,11 @@ static void sighandler(int signum) } #endif -static void hsdaoh_callback(unsigned char *buf, uint32_t len, void *ctx) +void hsdaoh_callback(hsdaoh_data_info_t *data_info) { + unsigned char *buf = data_info->buf; + uint32_t len = data_info->len; + void *ctx = data_info->ctx; size_t nbytes = 0; if (ctx) { diff --git a/src/hsdaoh_tcp.c b/src/hsdaoh_tcp.c index 900c80b..c0b6d66 100644 --- a/src/hsdaoh_tcp.c +++ b/src/hsdaoh_tcp.c @@ -147,8 +147,12 @@ static void sighandler(int signum) } #endif -void hsdaoh_callback(unsigned char *buf, uint32_t len, void *ctx) +void hsdaoh_callback(hsdaoh_data_info_t *data_info) { + unsigned char *buf = data_info->buf; + uint32_t len = data_info->len; + void *ctx = data_info->ctx; + if(!do_exit) { struct llist *rpt = (struct llist*)malloc(sizeof(struct llist)); rpt->data = (char*)malloc(len); diff --git a/src/hsdaoh_test.c b/src/hsdaoh_test.c index 802d95e..9d8a0a7 100644 --- a/src/hsdaoh_test.c +++ b/src/hsdaoh_test.c @@ -222,8 +222,12 @@ static void ppm_test(uint32_t len) uint16_t last_value = 0; -static void hsdaoh_callback(unsigned char *buf, uint32_t len, void *ctx) +static void hsdaoh_callback(hsdaoh_data_info_t *data_info) { + unsigned char *buf = data_info->buf; + uint32_t len = data_info->len; + void *ctx = data_info->ctx; + /* verify the counter value */ uint16_t *cnt = (uint16_t *)buf; int n = len / sizeof(uint16_t); diff --git a/src/libhsdaoh.c b/src/libhsdaoh.c index c606b99..dafbd11 100644 --- a/src/libhsdaoh.c +++ b/src/libhsdaoh.c @@ -601,7 +601,6 @@ void hsdaoh_process_frame(hsdaoh_dev_t *dev, uint8_t *data, int size) dev->in_order_cnt++; dev->last_frame_cnt = meta.framecounter; - int frame_errors = 0; for (unsigned int i = 0; i < dev->height; i++) { @@ -610,6 +609,7 @@ void hsdaoh_process_frame(hsdaoh_dev_t *dev, uint8_t *data, int size) /* extract number of payload words from reserved field at end of line */ uint16_t payload_len = le16toh(((uint16_t *)line_dat)[dev->width - 1]); uint16_t crc = le16toh(((uint16_t *)line_dat)[dev->width - 2]); + uint16_t stream_id = le16toh(((uint16_t *)line_dat)[dev->width - 3]); /* we only use 12 bits, the upper 4 bits are reserved for the metadata */ payload_len &= 0x0fff; @@ -641,8 +641,14 @@ void hsdaoh_process_frame(hsdaoh_dev_t *dev, uint8_t *data, int size) frame_payload_bytes += payload_len * sizeof(uint16_t); } + hsdaoh_data_info_t data_info; + data_info.stream_id = 0; + data_info.buf = (uint8_t *)data; + data_info.len = frame_payload_bytes; + data_info.ctx = dev->cb_ctx; + if (dev->cb && dev->stream_synced) - dev->cb(data, frame_payload_bytes, dev->cb_ctx); + dev->cb(&data_info); if (frame_errors && dev->stream_synced) { fprintf(stderr,"%d frame errors, %d frames since last error\n", frame_errors, dev->frames_since_error);