#define LOG_PREFIX "hp-3478a"
+#define SB1_FUNCTION_BLOCK 0b11100000
+#define SB1_RANGE_BLOCK 0b00011100
+#define SB1_DIGITS_BLOCK 0b00000011
+
+/* Status Byte 1 (Function) */
+enum sb1_function {
+ FUNCTION_VDC = 0b00100000,
+ FUNCTION_VAC = 0b01000000,
+ FUNCTION_2WR = 0b01100000,
+ FUNCTION_4WR = 0b10000000,
+ FUNCTION_ADC = 0b10100000,
+ FUNCTION_AAC = 0b11000000,
+ FUNCTION_EXR = 0b11100000,
+};
+
+/* Status Byte 1 (Range V DC) */
+enum sb1_range_vdc {
+ RANGE_VDC_30MV = 0b00000100,
+ RANGE_VDC_300MV = 0b00001000,
+ RANGE_VDC_3V = 0b00001100,
+ RANGE_VDC_30V = 0b00010000,
+ RANGE_VDC_300V = 0b00010100,
+};
+
+/* Status Byte 1 (Range V AC) */
+enum sb1_range_vac {
+ RANGE_VAC_300MV = 0b00000100,
+ RANGE_VAC_3V = 0b00001000,
+ RANGE_VAC_30V = 0b00001100,
+ RANGE_VAC_300V = 0b00010000,
+};
+
+/* Status Byte 1 (Range A) */
+enum sb1_range_a {
+ RANGE_A_300MA = 0b00000100,
+ RANGE_A_3A = 0b00001000,
+};
+
+/* Status Byte 1 (Range Ohm) */
+enum sb1_range_ohm {
+ RANGE_OHM_30R = 0b00000100,
+ RANGE_OHM_300R = 0b00001000,
+ RANGE_OHM_3KR = 0b00001100,
+ RANGE_OHM_30KR = 0b00010000,
+ RANGE_OHM_300KR = 0b00010100,
+ RANGE_OHM_3MR = 0b00011000,
+ RANGE_OHM_30MR = 0b00011100,
+};
+
+/* Status Byte 1 (Digits) */
+enum sb1_digits {
+ DIGITS_5_5 = 0b00000001,
+ DIGITS_4_5 = 0b00000010,
+ DIGITS_3_5 = 0b00000011,
+};
+
+/* Status Byte 2 */
+enum sb2_status {
+ STATUS_INT_TRIGGER = (1 << 0),
+ STATUS_AUTO_RANGE = (1 << 1),
+ STATUS_AUTO_ZERO = (1 << 2),
+ STATUS_50HZ = (1 << 3),
+ STATUS_FRONT_TERMINAL = (1 << 4),
+ STATUS_CAL_RAM = (1 << 5),
+ STATUS_EXT_TRIGGER = (1 << 6),
+};
+
+/* Status Byte 3 (Serial Poll Mask) */
+enum sb3_srq {
+ SRQ_BUS_AVAIL = (1 << 0),
+ SRQ_SYNTAX_ERR = (1 << 2),
+ SRQ_HARDWARE_ERR = (1 << 3),
+ SRQ_KEYBORD = (1 << 4),
+ SRQ_CAL_FAILED = (1 << 5),
+ SRQ_POWER_ON = (1 << 7),
+};
+
+/* Status Byte 4 (Error) */
+enum sb4_error {
+ ERROR_SELF_TEST = (1 << 0),
+ ERROR_RAM_SELF_TEST = (1 << 1),
+ ERROR_ROM_SELF_TEST = (1 << 2),
+ ERROR_AD_SLOPE = (1 << 3),
+ ERROR_AD_SELF_TEST = (1 << 4),
+ ERROR_AD_LINK = (1 << 5),
+};
+
+/* Channel connector (front terminals or rear terminals. */
+enum terminal_connector {
+ TERMINAL_FRONT,
+ TERMINAL_REAR,
+};
+
+/* Possible triggers */
+enum trigger_state {
+ TRIGGER_UNDEFINED,
+ TRIGGER_EXTERNAL,
+ TRIGGER_INTERNAL,
+};
+
+/* Possible line frequencies */
+enum line_freq {
+ LINE_50HZ,
+ LINE_60HZ,
+};
+
struct dev_context {
+ struct sr_sw_limits limits;
+
+ double measurement;
+ enum sr_mq measurement_mq;
+ enum sr_mqflag measurement_mq_flags;
+ enum sr_unit measurement_unit;
+ uint8_t enc_digits;
+ uint8_t spec_digits;
+
+ enum terminal_connector terminal;
+ enum trigger_state trigger;
+ enum line_freq line;
+ gboolean auto_zero;
+ gboolean calibration;
+};
+
+struct channel_context {
+ int index;
+ enum terminal_connector location;
};
+SR_PRIV int hp_3478a_set_mq(const struct sr_dev_inst *sdi, enum sr_mq mq,
+ enum sr_mqflag mq_flags);
+SR_PRIV int hp_3478a_get_status_bytes(const struct sr_dev_inst *sdi);
SR_PRIV int hp_3478a_receive_data(int fd, int revents, void *cb_data);
#endif