]> sigrok.org Git - libsigrok.git/blobdiff - src/hardware/serial-dmm/protocol.h
serial-dmm: more DMM parser callbacks (open, var length, config, start)
[libsigrok.git] / src / hardware / serial-dmm / protocol.h
index 0713f5cfcacfcce887a218c6917e8523c6afe0ee..092f506b207b8f525cac7971e0c5a1d9e498d0f0 100644 (file)
@@ -34,17 +34,17 @@ struct dmm_info {
        /** serialcomm string. */
        const char *serialcomm;
        /** Packet size in bytes. */
-       int packet_size;
+       size_t packet_size;
        /**
         * Request timeout [ms] before request is considered lost and a new
         * one is sent. Used only if device needs polling.
         */
-       int64_t req_timeout_ms;
+       uint64_t req_timeout_ms;
        /**
         * Delay between reception of packet and next request. Some DMMs
         * need this. Used only if device needs polling.
         */
-       int64_t req_delay_ms;
+       uint64_t req_delay_ms;
        /** Packet request function. */
        int (*packet_request)(struct sr_serial_dev_inst *);
        /** Number of channels / displays. */
@@ -60,6 +60,24 @@ struct dmm_info {
        void (*dmm_details)(struct sr_datafeed_analog *, void *);
        /** Size of chipset info struct. */
        gsize info_size;
+       /* Serial-dmm items "with state" and variable length packets. */
+       void *dmm_state;
+       void *(*dmm_state_init)(void);
+       void (*dmm_state_free)(void *state);
+       int (*after_open)(struct sr_serial_dev_inst *serial);
+       int (*packet_valid_len)(void *state, const uint8_t *data, size_t dlen,
+               size_t *pkt_len);
+       int (*packet_parse_len)(void *state, const uint8_t *data, size_t dlen,
+               double *val, struct sr_datafeed_analog *analog, void *info);
+       int (*config_get)(void *state, uint32_t key, GVariant **data,
+               const struct sr_dev_inst *sdi, const struct sr_channel_group *cg);
+       int (*config_set)(void *state, uint32_t key, GVariant *data,
+               const struct sr_dev_inst *sdi, const struct sr_channel_group *cg);
+       int (*config_list)(void *state, uint32_t key, GVariant **data,
+               const struct sr_dev_inst *sdi, const struct sr_channel_group *cg);
+       /** Hook at acquisition start. Can re-route the receive routine. */
+       int (*acquire_start)(void *state, const struct sr_dev_inst *sdi,
+               sr_receive_data_callback *cb, void **cb_data);
 };
 
 #define DMM_BUFSIZE 256
@@ -68,14 +86,13 @@ struct dev_context {
        struct sr_sw_limits limits;
 
        uint8_t buf[DMM_BUFSIZE];
-       int bufoffset;
-       int buflen;
+       size_t buflen;
 
        /**
         * The timestamp [µs] to send the next request.
         * Used only if device needs polling.
         */
-       int64_t req_next_at;
+       uint64_t req_next_at;
 };
 
 SR_PRIV int req_packet(struct sr_dev_inst *sdi);