SR_CONF_POWER_OFF | SR_CONF_GET | SR_CONF_SET,
};
-
/* TODO:
* - For the 29S SR_CONF_ENERGYMETER, too.
* - SR_CONF_PATTERN_MODE for some 2x devices
* Need to implement device-specific lists.
*/
-/** Init driver gmc_mh_1x_2x_rs232. */
-static int init_1x_2x_rs232(struct sr_context *sr_ctx)
+static int init(struct sr_dev_driver *di, struct sr_context *sr_ctx)
{
- return std_init(sr_ctx, &gmc_mh_1x_2x_rs232_driver_info, LOG_PREFIX);
-}
-
-/** Init driver gmc_mh_2x_bd232. */
-static int init_2x_bd232(struct sr_context *sr_ctx)
-{
- return std_init(sr_ctx, &gmc_mh_2x_bd232_driver_info, LOG_PREFIX);
+ return std_init(sr_ctx, di, LOG_PREFIX);
}
/**
gint64 timeout_us;
model = METRAHIT_NONE;
- timeout_us = g_get_monotonic_time() + 1 * 1000 * 1000;
+ timeout_us = g_get_monotonic_time() + (1 * 1000 * 1000);
/*
* Try to find message consisting of device code and several
* on configuration and measurement mode the intervals can be much larger and
* then the detection might not work.
*/
-static GSList *scan_1x_2x_rs232(GSList *options)
+static GSList *scan_1x_2x_rs232(struct sr_dev_driver *di, GSList *options)
{
struct sr_dev_inst *sdi;
struct drv_context *drvc;
struct dev_context *devc;
struct sr_config *src;
- struct sr_channel *ch;
struct sr_serial_dev_inst *serial;
GSList *l, *devices;
const char *conn, *serialcomm;
gboolean serialcomm_given;
devices = NULL;
- drvc = (&gmc_mh_1x_2x_rs232_driver_info)->priv;
+ drvc = di->priv;
drvc->instances = NULL;
conn = serialcomm = NULL;
model = METRAHIT_NONE;
if (!serialcomm)
serialcomm = SERIALCOMM_2X_RS232;
- if (!(serial = sr_serial_dev_inst_new(conn, serialcomm)))
- return NULL;
+ serial = sr_serial_dev_inst_new(conn, serialcomm);
if (serial_open(serial, SERIAL_RDWR) != SR_OK) {
sr_serial_dev_inst_free(serial);
devc->settings_ok = FALSE;
sdi->conn = serial;
sdi->priv = devc;
- sdi->driver = &gmc_mh_1x_2x_rs232_driver_info;
- ch = sr_channel_new(0, SR_CHANNEL_ANALOG, TRUE, "P1");
- sdi->channels = g_slist_append(sdi->channels, ch);
+ sdi->driver = di;
+ sr_channel_new(sdi, 0, SR_CHANNEL_ANALOG, TRUE, "P1");
drvc->instances = g_slist_append(drvc->instances, sdi);
devices = g_slist_append(devices, sdi);
}
return devices;
}
-/** Scan for Metrahit 2x in a bidirectional mode using Gossen Metrawatt 'BD 232' interface.
- *
+/**
+ * Scan for Metrahit 2x in a bidirectional mode using Gossen Metrawatt
+ * 'BD 232' interface.
*/
-static GSList *scan_2x_bd232(GSList *options)
+static GSList *scan_2x_bd232(struct sr_dev_driver *di, GSList *options)
{
struct sr_dev_inst *sdi;
struct drv_context *drvc;
struct dev_context *devc;
struct sr_config *src;
- struct sr_channel *ch;
struct sr_serial_dev_inst *serial;
GSList *l, *devices;
const char *conn, *serialcomm;
conn = serialcomm = NULL;
devices = NULL;
- drvc = (&gmc_mh_2x_bd232_driver_info)->priv;
+ drvc = di->priv;
drvc->instances = NULL;
sr_spew("scan_2x_bd232() called!");
if (!serialcomm)
serialcomm = SERIALCOMM_2X;
- if (!(serial = sr_serial_dev_inst_new(conn, serialcomm)))
- return NULL;
+ serial = sr_serial_dev_inst_new(conn, serialcomm);
if (serial_open(serial, SERIAL_RDWR) != SR_OK)
goto exit_err;
goto exit_err;
/* Wait for reply from device(s) for up to 2s. */
- timeout_us = g_get_monotonic_time() + 2*1000*1000;
+ timeout_us = g_get_monotonic_time() + (2 * 1000 * 1000);
while (timeout_us > g_get_monotonic_time()) {
/* Receive reply (14 bytes) */
devc->buflen = 0;
- for (cnt = 0; cnt < 14; cnt++) {
+ for (cnt = 0; cnt < GMC_REPLY_SIZE; cnt++) {
byte = read_byte(serial, timeout_us);
if (byte != -1)
devc->buf[devc->buflen++] = (byte & MASK_6BITS);
}
- if (devc->buflen != 14)
+ if (devc->buflen != GMC_REPLY_SIZE)
continue;
devc->addr = devc->buf[0];
sdi->version = g_strdup_printf("Firmware %d.%d", devc->fw_ver_maj, devc->fw_ver_min);
sdi->conn = serial;
sdi->priv = devc;
- sdi->driver = &gmc_mh_2x_bd232_driver_info;
- ch = sr_channel_new(0, SR_CHANNEL_ANALOG, TRUE, "P1");
- sdi->channels = g_slist_append(sdi->channels, ch);
+ sdi->driver = di;
+ sr_channel_new(sdi, 0, SR_CHANNEL_ANALOG, TRUE, "P1");
drvc->instances = g_slist_append(drvc->instances, sdi);
devices = g_slist_append(devices, sdi);
devc = g_malloc0(sizeof(struct dev_context));
if (serial)
sr_serial_dev_inst_free(serial);
- if (devc)
- g_free(devc);
+ g_free(devc);
if (sdi)
sr_dev_inst_free(sdi);
return NULL;
}
-/** Driver device list function */
-static GSList *dev_list_1x_2x_rs232(void)
+static GSList *dev_list(const struct sr_dev_driver *di)
{
- return ((struct drv_context *)(gmc_mh_1x_2x_rs232_driver_info.priv))->instances;
-}
-
-/** Driver device list function */
-static GSList *dev_list_2x_bd232(void)
-{
- return ((struct drv_context *)(gmc_mh_2x_bd232_driver_info.priv))
- ->instances;
+ return ((struct drv_context *)(di->priv))->instances;
}
static int dev_close(struct sr_dev_inst *sdi)
return SR_OK;
}
-static int cleanup_sm_rs232(void)
-{
- return std_dev_clear(&gmc_mh_1x_2x_rs232_driver_info, NULL);
-}
-
-static int cleanup_2x_bd232(void)
+static int cleanup(const struct sr_dev_driver *di)
{
- return std_dev_clear(&gmc_mh_2x_bd232_driver_info, NULL);
+ return std_dev_clear(di, NULL);
}
-/** Get value of configuration item */
static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi,
const struct sr_channel_group *cg)
{
(void)cg;
- ret = SR_OK;
-
if (!sdi || !(devc = sdi->priv))
return SR_ERR_ARG;
return ret;
}
-/** Implementation of config_list, auxiliary function for common parts, */
+/** Implementation of config_list, auxiliary function for common parts. */
static int config_list_common(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi,
const struct sr_channel_group *cg)
{
.name = "gmc-mh-1x-2x-rs232",
.longname = "Gossen Metrawatt Metrahit 1x/2x, RS232 interface",
.api_version = 1,
- .init = init_1x_2x_rs232,
- .cleanup = cleanup_sm_rs232,
+ .init = init,
+ .cleanup = cleanup,
.scan = scan_1x_2x_rs232,
- .dev_list = dev_list_1x_2x_rs232,
+ .dev_list = dev_list,
.dev_clear = NULL,
.config_get = config_get,
.config_set = config_set,
.name = "gmc-mh-2x-bd232",
.longname = "Gossen Metrawatt Metrahit 2x, BD232/SI232-II interface",
.api_version = 1,
- .init = init_2x_bd232,
- .cleanup = cleanup_2x_bd232,
+ .init = init,
+ .cleanup = cleanup,
.scan = scan_2x_bd232,
- .dev_list = dev_list_2x_bd232,
+ .dev_list = dev_list,
.dev_clear = NULL,
.config_get = config_get,
.config_set = config_set,