* @internal
*/
+#include <config.h>
#include <math.h>
#include <string.h>
#include "protocol.h"
/* Internal Headers */
-static guchar calc_chksum_14(guchar* dta);
+static guchar calc_chksum_14(guchar *dta);
static int chk_msg14(struct sr_dev_inst *sdi);
/** Set or clear flags in devc->mqflags. */
/**
* 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)
{
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).
*
static void send_value(struct sr_dev_inst *sdi)
{
struct dev_context *devc;
- struct sr_datafeed_analog analog;
+ struct sr_datafeed_analog_old analog;
struct sr_datafeed_packet packet;
devc = sdi->priv;
- memset(&analog, 0, sizeof(analog));
+ memset(&analog, 0, sizeof(struct sr_datafeed_analog_old));
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));
- packet.type = SR_DF_ANALOG;
+ memset(&packet, 0, sizeof(struct sr_datafeed_packet));
+ packet.type = SR_DF_ANALOG_OLD;
packet.payload = &analog;
sr_session_send(devc->cb_data, &packet);
devc->value += pow(10.0, cnt) * dgt;
}
sr_spew("process_msg_inf_13() value=%f scale=%f scale1000=%d mq=%d "
- "unit=%d mqflags=0x%02llx", devc->value, devc->scale,
+ "unit=%d mqflags=0x%02" PRIx64, devc->value, devc->scale,
devc->scale1000, devc->mq, devc->unit, devc->mqflags);
if (devc->value != NAN)
devc->value *= devc->scale * pow(1000.0, devc->scale1000);
* @param buf Pointer to array of 14 data bytes.
* @param[in] raw Write only data bytes, no interpretation.
*/
-void dump_msg14(guchar* buf, gboolean raw)
+void dump_msg14(guchar *buf, gboolean raw)
{
if (!buf)
return;
* @param[in] dta Pointer to array of 13 data bytes.
* @return Checksum.
*/
-static guchar calc_chksum_14(guchar* dta)
+static guchar calc_chksum_14(guchar *dta)
{
guchar cnt, chs;
- for (chs = 0, cnt = 0; cnt < 13; cnt++)
+ for (chs = 0, cnt = 0; cnt < (GMC_REPLY_SIZE - 1); cnt++)
chs += dta[cnt];
return (64 - chs) & MASK_6BITS;
}
if (devc->buf[1] == 0) { /* Error msg from device! */
- retc = SR_ERR_ARG;
switch (devc->buf[2]) {
case 1: /* Not used */
sr_err("Device: Illegal error code!");
sr_spew("Cmd %d unimplemented!", devc->buf[3]);
break;
case 3: /* Read firmware version and status */
- sr_spew("Cmd 3, Read firmware and status", devc->buf[3]);
+ sr_spew("Cmd 3, Read firmware and status");
switch (devc->cmd_idx) {
case 0:
devc->fw_ver_maj = devc->buf[5];
devc->value += pow(10.0, cnt) * dgt;
}
sr_spew("process_msg14() value=%f scale=%f scale1000=%d mq=%d "
- "unit=%d mqflags=0x%02llx", devc->value, devc->scale,
+ "unit=%d mqflags=0x%02" PRIx64, devc->value, devc->scale,
devc->scale1000, devc->mq, devc->unit, devc->mqflags);
if (devc->value != NAN)
devc->value *= devc->scale * pow(1000.0, devc->scale1000);
if (sdi->status == SR_ST_ACTIVE) {
if (devc->response_pending) {
gint64 elapsed_us = g_get_monotonic_time() - devc->req_sent_at;
- if (elapsed_us > 1*1000*1000) /* Timeout! */
+ if (elapsed_us > (1 * 1000 * 1000)) /* Timeout! */
devc->response_pending = FALSE;
}
if (!devc->response_pending) {
* @param[in] params Further parameters (9 bytes)
* @param[out] buf Buffer to create msg in (42 bytes).
*/
-void create_cmd_14(guchar addr, guchar func, guchar* params, guchar* buf)
+void create_cmd_14(guchar addr, guchar func, guchar *params, guchar *buf)
{
- uint8_t dta[14]; /* Unencoded message */
+ uint8_t dta[GMC_REPLY_SIZE]; /* Unencoded message */
int cnt;
if (!params || !buf)
/* 4-12: Copy further parameters */
for (cnt = 0; cnt < 9; cnt++)
- dta[cnt+4] = (params[cnt] & MASK_6BITS);
+ dta[cnt + 4] = (params[cnt] & MASK_6BITS);
/* 13: Checksum (b complement) */
dta[13] = calc_chksum_14(dta);
/* The whole message is packed into 3 bytes per byte now (lower 6 bits only) the most
* peculiar way I have ever seen. Possibly to improve IR communication? */
- for (cnt = 0; cnt < 14; cnt++) {
- buf[3*cnt] = (dta[cnt] & 0x01 ? 0x0f : 0) | (dta[cnt] & 0x02 ? 0xf0 : 0);
- buf[3*cnt + 1] = (dta[cnt] & 0x04 ? 0x0f : 0) | (dta[cnt] & 0x08 ? 0xf0 : 0);
- buf[3*cnt + 2] = (dta[cnt] & 0x10 ? 0x0f : 0) | (dta[cnt] & 0x20 ? 0xf0 : 0);
+ for (cnt = 0; cnt < GMC_REPLY_SIZE; cnt++) {
+ buf[(3 * cnt) + 0] = (dta[cnt] & 0x01 ? 0x0f : 0) | (dta[cnt] & 0x02 ? 0xf0 : 0);
+ buf[(3 * cnt) + 1] = (dta[cnt] & 0x04 ? 0x0f : 0) | (dta[cnt] & 0x08 ? 0xf0 : 0);
+ buf[(3 * cnt) + 2] = (dta[cnt] & 0x10 ? 0x0f : 0) | (dta[cnt] & 0x20 ? 0xf0 : 0);
}
}
devc->cmd_idx = 0;
create_cmd_14(devc->addr, 8, params, msg);
devc->req_sent_at = g_get_monotonic_time();
- if (serial_write_blocking(serial, msg, sizeof(msg)) < (int)sizeof(msg)) {
+ if (serial_write_blocking(serial, msg, sizeof(msg),
+ serial_timeout(serial, sizeof(msg))) < (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_blocking(serial, msg, sizeof(msg)) < 0)
+ if (serial_write_blocking(serial, msg, sizeof(msg),
+ serial_timeout(serial, sizeof(msg))) < 0)
return SR_ERR;
- g_usleep(1*1000*1000);
- if (serial_write_blocking(serial, msg, sizeof(msg)) < 0)
+ g_usleep(1 * 1000 * 1000);
+ if (serial_write_blocking(serial, msg, sizeof(msg),
+ serial_timeout(serial, sizeof(msg))) < 0)
return SR_ERR;
- g_usleep(1*1000*1000);
- if (serial_write_blocking(serial, msg, sizeof(msg)) < 0)
+ g_usleep(1 * 1000 * 1000);
+ if (serial_write_blocking(serial, msg, sizeof(msg),
+ serial_timeout(serial, sizeof(msg))) < 0)
return SR_ERR;
- g_usleep(1*1000*1000);
+ 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_blocking(serial, msg, sizeof(msg)) < (int)sizeof(msg)) {
+ if (serial_write_blocking(serial, msg, sizeof(msg),
+ serial_timeout(serial, sizeof(msg))) < (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
- */
+/** @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)
{
params[0] = 5;
params[1] = 5;
create_cmd_14(devc->addr, 6, params, msg);
- if (serial_write_blocking(sdi->conn, msg, sizeof(msg)) < 0)
+ if (serial_write_blocking(sdi->conn, msg, sizeof(msg),
+ serial_timeout(sdi->conn, sizeof(msg))) < 0)
return SR_ERR;
else
- g_usleep(2000000); /* Wait to ensure transfer before interface switched off. */
+ g_usleep(2 * 1000 * 1000); /* 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;