/**
* Decode range/sign/acdc byte special chars, Metrahit 18.
*
- * @param[in] rs Rance/sign byte.
+ * @param[in] rs Range/sign byte.
*/
static void decode_rs_18(uint8_t rs, struct dev_context *devc)
{
* identify relative mode.
*/
}
- else if (devc->vmains_29S)
- devc->scale *= pow(10.0, range - 2);
else
devc->scale *= pow(10.0, range - 5);
break;
*/
static void decode_ctmv_2x(uint8_t ctmv, struct dev_context *devc)
{
- if ((ctmv > 0x1c) || (!devc)) {
- sr_err("decode_ctmv_2x(%d): invalid param(s)!", ctmv);
+ if ((ctmv > 0x20) || (!devc)) {
+ sr_err("decode_ctmv_2x(0x%x): invalid param(s)!", ctmv);
return;
}
case 0x04: /* 00100 mA DC */
case 0x05: /* 00101 mA AC+DC */
devc->scale1000 = -1;
+ /* Fall through! */
case 0x06: /* 00110 A DC */
case 0x07: /* 00111 A AC+DC */
devc->mq = SR_MQ_CURRENT;
devc->mqflags |= SR_MQFLAG_DC;
break;
case 0x0d: /* 01101 W on power, mA range (29S only) */
- devc->scale *= 0.001;
+ devc->scale *= 0.1;
/* Fall through! */
case 0x0e: /* 01110 W on power, A range (29S only) */
+ devc->scale *= 0.1;
+ devc->scale1000 = -1;
devc->mq = SR_MQ_POWER;
devc->unit = SR_UNIT_WATT;
+ devc->mqflags |= (SR_MQFLAG_AC | SR_MQFLAG_DC | SR_MQFLAG_RMS);
break;
case 0x0f: /* 01111 Diode */
case 0x10: /* 10000 Diode with buzzer (actually cont. with voltage) */
devc->unit = SR_UNIT_CELSIUS;
/* This can be Fahrenheit. That is detected by range=4 later. */
break;
- /* 0x13 10011, 0x14 10100 unsed */
+ /* 0x13 10011 unused */
+ /* 0x14 10100 unused */
case 0x15: /* 10101 Press (29S only) */
/* TODO: What does that mean? Possibly phase shift?
Then we need a unit/flag for it. */
case 0x17: /* 10111 TRMS V on mains (29S only) */
devc->mq = SR_MQ_VOLTAGE;
devc->unit = SR_UNIT_VOLT;
- devc->mqflags |= (SR_MQFLAG_AC | SR_MQFLAG_RMS);
- devc->vmains_29S = TRUE;
+ devc->mqflags |= (SR_MQFLAG_AC | SR_MQFLAG_DC | SR_MQFLAG_RMS);
break;
case 0x18: /* 11000 Counter (zero crossings of a signal) */
devc->mq = SR_MQ_VOLTAGE;
if (ctmv <= 0x19)
devc->mqflags |= SR_MQFLAG_DC;
break;
- case 0x1b: /* 11011 pulse on mains (29S only) */
- /* TODO: No unit or flags for this yet! */
- devc->mq = SR_MQ_VOLTAGE;
- devc->unit = SR_UNIT_UNITLESS;
- devc->mqflags |= SR_MQFLAG_AC;
+ case 0x1b: /* 11011 Milliamperes in power mode (29S only); error in docs, "pulse on mains" */
+ devc->mq = SR_MQ_CURRENT;
+ devc->unit = SR_UNIT_AMPERE;
+ devc->mqflags |= (SR_MQFLAG_AC | SR_MQFLAG_DC | SR_MQFLAG_RMS);
+ devc->scale1000 = -1;
break;
case 0x1c: /* 11100 dropout on mains (29S only) */
/* TODO: No unit or flags for this yet! */
devc->unit = SR_UNIT_UNITLESS;
devc->mqflags |= SR_MQFLAG_AC;
break;
- case 0x1f: /* 11111 Undocumented: 25S in stopwatch mode.
+ case 0x1d: /* 11101 Voltage in power mode (29S); undocumented! */
+ devc->mq = SR_MQ_VOLTAGE;
+ devc->unit = SR_UNIT_VOLT;
+ devc->mqflags |= (SR_MQFLAG_AC | SR_MQFLAG_DC | SR_MQFLAG_RMS);
+ break;
+ /* 0x1e: 11110 Undocumented */
+ case 0x1f: /* 11111 25S in stopwatch mode; undocumented!
The value is voltage, not time, so treat it such. */
devc->mq = SR_MQ_VOLTAGE;
devc->unit = SR_UNIT_VOLT;
devc->mqflags |= SR_MQFLAG_DC;
break;
- case 0x20: /* 100000 Undocumented: 25S in event count mode.
- Value is 0 anyway. */
+ case 0x20: /* 100000 25S in event count mode; undocumented!
+ Value is 0 anyway. */
devc->mq = SR_MQ_VOLTAGE;
devc->unit = SR_UNIT_UNITLESS;
break;
case SR_MQ_VOLTAGE:
if (devc->unit == SR_UNIT_DECIBEL_VOLT)
devc->scale *= pow(10.0, -3);
- else if (devc->vmains_29S)
- devc->scale *= pow(10.0, range - 2);
else
devc->scale *= pow(10.0, range - 6);
break;
switch (devc->mq) {
case SR_MQ_CURRENT:
if (devc->scale1000 == -1) /* mA */
- switch(range) {
- case 0: case 1: /* 100, 300 µA */
+ switch (range) {
+ case 0:
+ case 1: /* 100, 300 µA */
devc->scale *= pow(10.0, -6);
break;
- case 2: case 3: /* 1, 3 mA */
+ case 2:
+ case 3: /* 1, 3 mA */
devc->scale *= pow(10.0, -5);
break;
- case 4: case 5: /* 10, 30 mA */
+ case 4:
+ case 5: /* 10, 30 mA */
devc->scale *= pow(10.0, -4);
break;
- case 6: case 7: /* 100, 300 mA */
+ case 6:
+ case 7: /* 100, 300 mA */
devc->scale *= pow(10.0, -3);
break;
}
else /* A */
- switch(range) {
- case 0: case 1: /* 1, 3 A */
+ switch (range) {
+ case 0:
+ case 1: /* 1, 3 A */
devc->scale *= pow(10.0, -5);
break;
case 2: /* 10 A */
devc->scale *= -1.0;
}
-
/**
* Decode special chars (Metrahit 2x).
*
devc->unit = 0;
devc->mqflags = 0;
devc->scale1000 = 0;
- devc->vmains_29S = FALSE;
clean_rs_v(devc);
}
devc = sdi->priv;
- memset(&analog, 0, sizeof(analog));
+ memset(&analog, 0, sizeof(struct sr_datafeed_analog));
analog.channels = sdi->channels;
analog.num_samples = 1;
analog.mq = devc->mq;
analog.mqflags = devc->mqflags;
analog.data = &devc->value;
- memset(&packet, 0, sizeof(packet));
+ memset(&packet, 0, sizeof(struct sr_datafeed_packet));
packet.type = SR_DF_ANALOG;
packet.payload = &analog;
sr_session_send(devc->cb_data, &packet);
if (revents == G_IO_IN) { /* Serial data arrived. */
while (GMC_BUFSIZE - devc->buflen - 1 > 0) {
- len = serial_read(serial, devc->buf + devc->buflen, 1);
+ len = serial_read_nonblocking(serial, devc->buf + devc->buflen, 1);
if (len < 1)
break;
buf = *(devc->buf + devc->buflen);
if (revents == G_IO_IN) { /* Serial data arrived. */
while (GMC_BUFSIZE - devc->buflen - 1 > 0) {
- len = serial_read(serial, devc->buf + devc->buflen, 1);
+ len = serial_read_nonblocking(serial, devc->buf + devc->buflen, 1);
if (len < 1)
break;
buf = *(devc->buf + devc->buflen);
devc->cmd_idx = 0;
create_cmd_14(devc->addr, 8, params, msg);
devc->req_sent_at = g_get_monotonic_time();
- if (serial_write(serial, msg, sizeof(msg)) == -1) {
+ if (serial_write_blocking(serial, msg, sizeof(msg), 0) < (int)sizeof(msg)) {
return SR_ERR;
}
if (power_on) {
sr_info("Write some data and wait 3s to turn on powered off device...");
- if (serial_write(serial, msg, sizeof(msg)) < 0)
+ if (serial_write_blocking(serial, msg, sizeof(msg), 0) < 0)
return SR_ERR;
g_usleep(1*1000*1000);
- if (serial_write(serial, msg, sizeof(msg)) < 0)
+ if (serial_write_blocking(serial, msg, sizeof(msg), 0) < 0)
return SR_ERR;
g_usleep(1*1000*1000);
- if (serial_write(serial, msg, sizeof(msg)) < 0)
+ if (serial_write_blocking(serial, msg, sizeof(msg), 0) < 0)
return SR_ERR;
g_usleep(1*1000*1000);
serial_flush(serial);
/* Write message and wait for reply */
devc->req_sent_at = g_get_monotonic_time();
- if (serial_write(serial, msg, sizeof(msg)) == -1) {
+ if (serial_write_blocking(serial, msg, sizeof(msg), 0) < (int)sizeof(msg)) {
return SR_ERR;
}
return METRAHIT_NONE;
}
- switch(mcode) {
+ switch (mcode) {
case 0x04: /* 0100b */
return METRAHIT_12S;
case 0x08: /* 1000b */
}
}
-
-/** @copydoc sr_dev_driver.config_set
- */
-SR_PRIV int config_set(int key, GVariant *data, const struct sr_dev_inst *sdi,
- const struct sr_channel_group *cg)
+/** @copydoc sr_dev_driver.config_set */
+SR_PRIV int config_set(uint32_t key, GVariant *data, const struct sr_dev_inst *sdi,
+ const struct sr_channel_group *cg)
{
struct dev_context *devc;
uint8_t params[9];
params[0] = 5;
params[1] = 5;
create_cmd_14(devc->addr, 6, params, msg);
- if (serial_write(sdi->conn, msg, sizeof(msg)) == -1)
+ if (serial_write_blocking(sdi->conn, msg, sizeof(msg), 0) < 0)
return SR_ERR;
else
g_usleep(2000000); /* Wait to ensure transfer before interface switched off. */
break;
case SR_CONF_LIMIT_MSEC:
- if (g_variant_get_uint64(data) == 0) {
- sr_err("LIMIT_MSEC can't be 0.");
- return SR_ERR;
- }
devc->limit_msec = g_variant_get_uint64(data);
- sr_dbg("Setting time limit to %" PRIu64 "ms.",
- devc->limit_msec);
break;
case SR_CONF_LIMIT_SAMPLES:
devc->limit_samples = g_variant_get_uint64(data);
- sr_dbg("Setting sample limit to %" PRIu64 ".",
- devc->limit_samples);
break;
default:
return SR_ERR_NA;