X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=libsigrok-internal.h;h=2577fd0dcd981202b927e9d95dbb5ee633c61d47;hb=d86e0b11c7dabcf8fbbb9f692a070f9679f0ea18;hp=3122e5812e209c424f129db66b64a8c1b1db702d;hpb=d43b090816f61e77d8054084e85202de1a1ebeb7;p=libsigrok.git diff --git a/libsigrok-internal.h b/libsigrok-internal.h index 3122e581..2577fd0d 100644 --- a/libsigrok-internal.h +++ b/libsigrok-internal.h @@ -17,8 +17,12 @@ * along with this program. If not, see . */ -#ifndef LIBSIGROK_SIGROK_INTERNAL_H -#define LIBSIGROK_SIGROK_INTERNAL_H +/** @file + * @internal + */ + +#ifndef LIBSIGROK_LIBSIGROK_INTERNAL_H +#define LIBSIGROK_LIBSIGROK_INTERNAL_H #include #include @@ -46,6 +50,42 @@ #define ARRAY_AND_SIZE(a) (a), ARRAY_SIZE(a) #endif +/** + * Read a 16 bits big endian integer out of memory. + * @param x a pointer to the input memory + * @return the corresponding integer + */ +#define RB16(x) (((unsigned)((const uint8_t*)(x))[0] << 8) | \ + (unsigned)((const uint8_t*)(x))[1]) + +/** + * Read a 16 bits little endian integer out of memory. + * @param x a pointer to the input memory + * @return the corresponding integer + */ +#define RL16(x) (((unsigned)((const uint8_t*)(x))[1] << 8) | \ + (unsigned)((const uint8_t*)(x))[0]) + +/** + * Read a 32 bits big endian integer out of memory. + * @param x a pointer to the input memory + * @return the corresponding integer + */ +#define RB32(x) (((unsigned)((const uint8_t*)(x))[0] << 24) | \ + ((unsigned)((const uint8_t*)(x))[1] << 16) | \ + ((unsigned)((const uint8_t*)(x))[2] << 8) | \ + (unsigned)((const uint8_t*)(x))[3]) + +/** + * Read a 32 bits little endian integer out of memory. + * @param x a pointer to the input memory + * @return the corresponding integer + */ +#define RL32(x) (((unsigned)((const uint8_t*)(x))[3] << 24) | \ + ((unsigned)((const uint8_t*)(x))[2] << 16) | \ + ((unsigned)((const uint8_t*)(x))[1] << 8) | \ + (unsigned)((const uint8_t*)(x))[0]) + /* Portability fixes for FreeBSD. */ #ifdef __FreeBSD__ #define LIBUSB_CLASS_APPLICATION 0xfe @@ -56,13 +96,27 @@ struct sr_context { #ifdef HAVE_LIBUSB_1_0 libusb_context *libusb_ctx; + gboolean usb_source_present; +#ifdef _WIN32 + GThread *usb_thread; + gboolean usb_thread_running; + GMutex usb_mutex; + HANDLE usb_event; + GPollFD usb_pollfd; + sr_receive_data_callback_t usb_cb; + void *usb_cb_data; +#endif #endif }; #ifdef HAVE_LIBUSB_1_0 +/** USB device instance */ struct sr_usb_dev_inst { + /** USB bus */ uint8_t bus; + /** Device address on USB bus */ uint8_t address; + /** libusb device handle */ struct libusb_device_handle *devhdl; }; #endif @@ -72,10 +126,18 @@ struct sr_usb_dev_inst { #define SERIAL_PARITY_EVEN SP_PARITY_EVEN #define SERIAL_PARITY_ODD SP_PARITY_ODD struct sr_serial_dev_inst { + /** Port name, e.g. '/dev/tty42'. */ char *port; + /** Comm params for serial_set_paramstr(). */ char *serialcomm; + /** Port is non-blocking. */ int nonblocking; + /** libserialport port handle */ struct sp_port *data; + /** libserialport event set */ + struct sp_event_set *event_set; + /** GPollFDs for event polling */ + GPollFD *pollfds; }; #endif @@ -86,6 +148,7 @@ struct sr_usbtmc_dev_inst { /* Private driver context. */ struct drv_context { + /** sigrok context */ struct sr_context *sr_ctx; GSList *instances; }; @@ -99,6 +162,16 @@ SR_PRIV int sr_info(const char *format, ...); SR_PRIV int sr_warn(const char *format, ...); SR_PRIV int sr_err(const char *format, ...); +/* Message logging helpers with subsystem-specific prefix string. */ +#ifndef NO_LOG_WRAPPERS +#define sr_log(l, s, args...) sr_log(l, "%s: " s, LOG_PREFIX, ## args) +#define sr_spew(s, args...) sr_spew("%s: " s, LOG_PREFIX, ## args) +#define sr_dbg(s, args...) sr_dbg("%s: " s, LOG_PREFIX, ## args) +#define sr_info(s, args...) sr_info("%s: " s, LOG_PREFIX, ## args) +#define sr_warn(s, args...) sr_warn("%s: " s, LOG_PREFIX, ## args) +#define sr_err(s, args...) sr_err("%s: " s, LOG_PREFIX, ## args) +#endif + /*--- device.c --------------------------------------------------------------*/ SR_PRIV struct sr_probe *sr_probe_new(int index, int type, @@ -164,7 +237,9 @@ struct sr_session { * an async fashion. We need to make sure the session is stopped from * within the session thread itself. */ + /** Mutex protecting access to abort_session. */ GMutex stop_mutex; + /** Abort current session. See sr_session_stop(). */ gboolean abort_session; }; @@ -181,6 +256,7 @@ typedef void (*std_dev_clear_t)(void *priv); SR_PRIV int std_init(struct sr_context *sr_ctx, struct sr_dev_driver *di, const char *prefix); #ifdef HAVE_LIBSERIALPORT +SR_PRIV int std_serial_dev_open(struct sr_dev_inst *sdi); SR_PRIV int std_serial_dev_acquisition_stop(struct sr_dev_inst *sdi, void *cb_data, dev_close_t dev_close_fn, struct sr_serial_dev_inst *serial, const char *prefix); @@ -214,8 +290,16 @@ SR_PRIV int serial_close(struct sr_serial_dev_inst *serial); SR_PRIV int serial_flush(struct sr_serial_dev_inst *serial); SR_PRIV int serial_write(struct sr_serial_dev_inst *serial, const void *buf, size_t count); +SR_PRIV int serial_write_blocking(struct sr_serial_dev_inst *serial, + const void *buf, size_t count); +SR_PRIV int serial_write_nonblocking(struct sr_serial_dev_inst *serial, + const void *buf, size_t count); SR_PRIV int serial_read(struct sr_serial_dev_inst *serial, void *buf, size_t count); +SR_PRIV int serial_read_blocking(struct sr_serial_dev_inst *serial, void *buf, + size_t count); +SR_PRIV int serial_read_nonblocking(struct sr_serial_dev_inst *serial, void *buf, + size_t count); SR_PRIV int serial_set_params(struct sr_serial_dev_inst *serial, int baudrate, int bits, int parity, int stopbits, int flowcontrol, int rts, int dtr); SR_PRIV int serial_set_paramstr(struct sr_serial_dev_inst *serial, @@ -248,6 +332,9 @@ SR_PRIV int ezusb_upload_firmware(libusb_device *dev, int configuration, #ifdef HAVE_LIBUSB_1_0 SR_PRIV GSList *sr_usb_find(libusb_context *usb_ctx, const char *conn); SR_PRIV int sr_usb_open(libusb_context *usb_ctx, struct sr_usb_dev_inst *usb); +SR_PRIV int usb_source_add(struct sr_context *ctx, int timeout, + sr_receive_data_callback_t cb, void *cb_data); +SR_PRIV int usb_source_remove(struct sr_context *ctx); #endif /*--- hardware/common/scpi.c ------------------------------------------------*/ @@ -292,8 +379,9 @@ struct sr_scpi_dev_inst { int timeout, sr_receive_data_callback_t cb, void *cb_data); int (*source_remove)(void *priv); int (*send)(void *priv, const char *command); - int (*receive)(void *priv, char **scpi_response); - int (*read)(void *priv, char *buf, int maxlen); + int (*read_begin)(void *priv); + int (*read_data)(void *priv, char *buf, int maxlen); + int (*read_complete)(void *priv); int (*close)(void *priv); void (*free)(void *priv); void *priv; @@ -307,9 +395,9 @@ SR_PRIV int sr_scpi_send(struct sr_scpi_dev_inst *scpi, const char *format, ...); SR_PRIV int sr_scpi_send_variadic(struct sr_scpi_dev_inst *scpi, const char *format, va_list args); -SR_PRIV int sr_scpi_receive(struct sr_scpi_dev_inst *scpi, - char **scpi_response); -SR_PRIV int sr_scpi_read(struct sr_scpi_dev_inst *scpi, char *buf, int maxlen); +SR_PRIV int sr_scpi_read_begin(struct sr_scpi_dev_inst *scpi); +SR_PRIV int sr_scpi_read_data(struct sr_scpi_dev_inst *scpi, char *buf, int maxlen); +SR_PRIV int sr_scpi_read_complete(struct sr_scpi_dev_inst *scpi); SR_PRIV int sr_scpi_close(struct sr_scpi_dev_inst *scpi); SR_PRIV void sr_scpi_free(struct sr_scpi_dev_inst *scpi); @@ -348,23 +436,6 @@ SR_PRIV struct sr_scpi_dev_inst *scpi_tcp_dev_inst_new(const char *address, SR_PRIV struct sr_scpi_dev_inst *scpi_usbtmc_dev_inst_new(const char *device); -/*--- hardware/common/dmm/es51922.c -----------------------------------------*/ - -#define ES51922_PACKET_SIZE 14 - -struct es51922_info { - gboolean is_judge, is_vbar, is_voltage, is_auto, is_micro, is_current; - gboolean is_milli, is_resistance, is_continuity, is_diode, is_lpf; - gboolean is_frequency, is_duty_cycle, is_capacitance, is_temperature; - gboolean is_celsius, is_fahrenheit, is_adp, is_sign, is_batt, is_ol; - gboolean is_max, is_min, is_rel, is_rmr, is_ul, is_pmax, is_pmin; - gboolean is_dc, is_ac, is_vahz, is_hold, is_nano, is_kilo, is_mega; -}; - -SR_PRIV gboolean sr_es51922_packet_valid(const uint8_t *buf); -SR_PRIV int sr_es51922_parse(const uint8_t *buf, float *floatval, - struct sr_datafeed_analog *analog, void *info); - /*--- hardware/common/dmm/es519xx.c -----------------------------------------*/ /** @@ -443,6 +514,15 @@ SR_PRIV void sr_fs9721_00_temp_c(struct sr_datafeed_analog *analog, void *info); SR_PRIV void sr_fs9721_01_temp_c(struct sr_datafeed_analog *analog, void *info); SR_PRIV void sr_fs9721_10_temp_c(struct sr_datafeed_analog *analog, void *info); SR_PRIV void sr_fs9721_01_10_temp_f_c(struct sr_datafeed_analog *analog, void *info); +SR_PRIV void sr_fs9721_max_c_min(struct sr_datafeed_analog *analog, void *info); + +/*--- hardware/common/dmm/m2110.c -----------------------------------------*/ + +#define BBCGM_M2110_PACKET_SIZE 9 + +SR_PRIV gboolean sr_m2110_packet_valid(const uint8_t *buf); +SR_PRIV int sr_m2110_parse(const uint8_t *buf, float *floatval, + struct sr_datafeed_analog *analog, void *info); /*--- hardware/common/dmm/metex14.c -----------------------------------------*/