]> sigrok.org Git - libsigrok.git/blobdiff - src/hardware/maynuo-m97/api.c
output/csv: use intermediate time_t var, silence compiler warning
[libsigrok.git] / src / hardware / maynuo-m97 / api.c
index f8d615d18f92671ff4b186d8c7b86b0d1ecf9ead..20a922fa215177a139587c94121693ec6bac45a0 100644 (file)
@@ -23,7 +23,7 @@
 static const uint32_t scanopts[] = {
        SR_CONF_CONN,
        SR_CONF_SERIALCOMM,
-       SR_CONF_MODBUSADDR
+       SR_CONF_MODBUSADDR,
 };
 
 static const uint32_t drvopts[] = {
@@ -53,9 +53,11 @@ static const uint32_t devopts_cg[] = {
        SR_CONF_OVER_TEMPERATURE_PROTECTION_ACTIVE | SR_CONF_GET,
 };
 
-/* The IDs in this list are only guessed and needs to be verified
-   against some real hardware. If at least a few of them matches,
-   it will probably be safe to enable the others. */
+/*
+ * The IDs in this list are only guessed and needs to be verified
+ * against some real hardware. If at least a few of them matches,
+ * it will probably be safe to enable the others.
+ */
 static const struct maynuo_m97_model supported_models[] = {
 //     {  53, "M9711"     ,   30, 150,    150 },
 //     {  54, "M9712"     ,   30, 150,    300 },
@@ -109,12 +111,7 @@ static const struct maynuo_m97_model supported_models[] = {
 //     { 102, "M9812B"    ,   15, 500,    300 },
 };
 
-SR_PRIV struct sr_dev_driver maynuo_m97_driver_info;
-
-static int init(struct sr_dev_driver *di, struct sr_context *sr_ctx)
-{
-       return std_init(di, sr_ctx);
-}
+static struct sr_dev_driver maynuo_m97_driver_info;
 
 static struct sr_dev_inst *probe_device(struct sr_modbus_dev_inst *modbus)
 {
@@ -140,17 +137,15 @@ static struct sr_dev_inst *probe_device(struct sr_modbus_dev_inst *modbus)
        }
 
        sdi = g_malloc0(sizeof(struct sr_dev_inst));
-       sdi->status = SR_ST_ACTIVE;
+       sdi->status = SR_ST_INACTIVE;
        sdi->vendor = g_strdup("Maynuo");
        sdi->model = g_strdup(model->name);
-       sdi->version = g_strdup_printf("v%d.%d", version/10, version%10);
+       sdi->version = g_strdup_printf("v%d.%d", version / 10, version % 10);
        sdi->conn = modbus;
        sdi->driver = &maynuo_m97_driver_info;
        sdi->inst_type = SR_INST_MODBUS;
 
-       cg = g_malloc0(sizeof(struct sr_channel_group));
-       cg->name = g_strdup("1");
-       sdi->channel_groups = g_slist_append(sdi->channel_groups, cg);
+       cg = sr_channel_group_new(sdi, "1", NULL);
 
        ch = sr_channel_new(sdi, 0, SR_CHANNEL_ANALOG, TRUE, "V1");
        cg->channels = g_slist_append(cg->channels, ch);
@@ -175,12 +170,12 @@ static int config_compare(gconstpointer a, gconstpointer b)
 static GSList *scan(struct sr_dev_driver *di, GSList *options)
 {
        struct sr_config default_serialcomm = {
-           .key = SR_CONF_SERIALCOMM,
-           .data = g_variant_new_string("9600/8n1"),
+               .key = SR_CONF_SERIALCOMM,
+               .data = g_variant_new_string("9600/8n1"),
        };
        struct sr_config default_modbusaddr = {
-           .key = SR_CONF_MODBUSADDR,
-           .data = g_variant_new_uint64(1),
+               .key = SR_CONF_MODBUSADDR,
+               .data = g_variant_new_uint64(1),
        };
        GSList *opts = options, *devices;
 
@@ -206,8 +201,6 @@ static int dev_open(struct sr_dev_inst *sdi)
        if (sr_modbus_open(modbus) < 0)
                return SR_ERR;
 
-       sdi->status = SR_ST_ACTIVE;
-
        maynuo_m97_set_bit(modbus, PC1, 1);
 
        return SR_OK;
@@ -218,33 +211,27 @@ static int dev_close(struct sr_dev_inst *sdi)
        struct dev_context *devc;
        struct sr_modbus_dev_inst *modbus;
 
-       if (sdi->status != SR_ST_ACTIVE)
-               return SR_ERR_DEV_CLOSED;
-
        modbus = sdi->conn;
 
-       if (modbus) {
-               devc = sdi->priv;
-               if (devc->expecting_registers) {
-                       /* Wait for the last data that was requested from the device. */
-                       uint16_t registers[devc->expecting_registers];
-                       sr_modbus_read_holding_registers(modbus, -1,
-                                                        devc->expecting_registers,
-                                                        registers);
-               }
+       if (!modbus)
+               return SR_ERR_BUG;
 
-               maynuo_m97_set_bit(modbus, PC1, 0);
+       devc = sdi->priv;
 
-               if (sr_modbus_close(modbus) < 0)
-                       return SR_ERR;
-               sdi->status = SR_ST_INACTIVE;
+       if (devc->expecting_registers) {
+               /* Wait for the last data that was requested from the device. */
+               uint16_t registers[devc->expecting_registers];
+               sr_modbus_read_holding_registers(modbus, -1,
+                       devc->expecting_registers, registers);
        }
 
-       return SR_OK;
+       maynuo_m97_set_bit(modbus, PC1, 0);
+
+       return sr_modbus_close(modbus);
 }
 
-static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi,
-               const struct sr_channel_group *cg)
+static int config_get(uint32_t key, GVariant **data,
+       const struct sr_dev_inst *sdi, const struct sr_channel_group *cg)
 {
        struct dev_context *devc;
        struct sr_modbus_dev_inst *modbus;
@@ -327,110 +314,68 @@ static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *s
        return ret;
 }
 
-static int config_set(uint32_t key, GVariant *data, const struct sr_dev_inst *sdi,
-               const struct sr_channel_group *cg)
+static int config_set(uint32_t key, GVariant *data,
+       const struct sr_dev_inst *sdi, const struct sr_channel_group *cg)
 {
        struct dev_context *devc;
        struct sr_modbus_dev_inst *modbus;
-       int ret;
 
        (void)cg;
 
-       if (sdi->status != SR_ST_ACTIVE)
-               return SR_ERR_DEV_CLOSED;
-
        modbus = sdi->conn;
        devc = sdi->priv;
 
-       ret = SR_OK;
        switch (key) {
        case SR_CONF_LIMIT_SAMPLES:
        case SR_CONF_LIMIT_MSEC:
-               ret = sr_sw_limits_config_set(&devc->limits, key, data);
-               break;
+               return sr_sw_limits_config_set(&devc->limits, key, data);
        case SR_CONF_ENABLED:
-               ret = maynuo_m97_set_input(modbus, g_variant_get_boolean(data));
-               break;
+               return maynuo_m97_set_input(modbus, g_variant_get_boolean(data));
        case SR_CONF_VOLTAGE_TARGET:
-               ret = maynuo_m97_set_float(modbus, UFIX, g_variant_get_double(data));
-               break;
+               return maynuo_m97_set_float(modbus, UFIX, g_variant_get_double(data));
        case SR_CONF_CURRENT_LIMIT:
-               ret = maynuo_m97_set_float(modbus, IFIX, g_variant_get_double(data));
-               break;
+               return maynuo_m97_set_float(modbus, IFIX, g_variant_get_double(data));
        case SR_CONF_OVER_VOLTAGE_PROTECTION_THRESHOLD:
-               ret = maynuo_m97_set_float(modbus, UMAX, g_variant_get_double(data));
-               break;
+               return maynuo_m97_set_float(modbus, UMAX, g_variant_get_double(data));
        case SR_CONF_OVER_CURRENT_PROTECTION_THRESHOLD:
-               ret = maynuo_m97_set_float(modbus, IMAX, g_variant_get_double(data));
-               break;
+               return maynuo_m97_set_float(modbus, IMAX, g_variant_get_double(data));
        default:
-               ret = SR_ERR_NA;
+               return SR_ERR_NA;
        }
 
-       return ret;
+       return SR_OK;
 }
 
-static int config_list(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi,
-               const struct sr_channel_group *cg)
+static int config_list(uint32_t key, GVariant **data,
+       const struct sr_dev_inst *sdi, const struct sr_channel_group *cg)
 {
        struct dev_context *devc;
-       GVariantBuilder gvb;
-       int ret;
 
-       /* Always available, even without sdi. */
-       if (key == SR_CONF_SCAN_OPTIONS) {
-               *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32,
-                               scanopts, ARRAY_SIZE(scanopts), sizeof(uint32_t));
-               return SR_OK;
-       } else if (key == SR_CONF_DEVICE_OPTIONS && !sdi) {
-               *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32,
-                               drvopts, ARRAY_SIZE(drvopts), sizeof(uint32_t));
-               return SR_OK;
-       }
-
-       if (!sdi)
-               return SR_ERR_ARG;
-       devc = sdi->priv;
+       devc = (sdi) ? sdi->priv : NULL;
 
-       ret = SR_OK;
        if (!cg) {
-               /* No channel group: global options. */
-               switch (key) {
-               case SR_CONF_DEVICE_OPTIONS:
-                       *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32,
-                                       devopts, ARRAY_SIZE(devopts), sizeof(uint32_t));
-                       break;
-               default:
-                       return SR_ERR_NA;
-               }
+               return STD_CONFIG_LIST(key, data, sdi, cg, scanopts, drvopts, devopts);
        } else {
                switch (key) {
                case SR_CONF_DEVICE_OPTIONS:
-                       *data = g_variant_new_fixed_array(G_VARIANT_TYPE_UINT32,
-                                       devopts_cg, ARRAY_SIZE(devopts_cg), sizeof(uint32_t));
+                       *data = std_gvar_array_u32(ARRAY_AND_SIZE(devopts_cg));
                        break;
                case SR_CONF_VOLTAGE_TARGET:
-                       g_variant_builder_init(&gvb, G_VARIANT_TYPE_ARRAY);
-                       /* Min, max, write resolution. */
-                       g_variant_builder_add_value(&gvb, g_variant_new_double(0.0));
-                       g_variant_builder_add_value(&gvb, g_variant_new_double(devc->model->max_voltage));
-                       g_variant_builder_add_value(&gvb, g_variant_new_double(0.001));
-                       *data = g_variant_builder_end(&gvb);
+                       if (!devc || !devc->model)
+                               return SR_ERR_ARG;
+                       *data = std_gvar_min_max_step(0.0, devc->model->max_voltage, 0.001);
                        break;
                case SR_CONF_CURRENT_LIMIT:
-                       g_variant_builder_init(&gvb, G_VARIANT_TYPE_ARRAY);
-                       /* Min, max, step. */
-                       g_variant_builder_add_value(&gvb, g_variant_new_double(0.0));
-                       g_variant_builder_add_value(&gvb, g_variant_new_double(devc->model->max_current));
-                       g_variant_builder_add_value(&gvb, g_variant_new_double(0.0001));
-                       *data = g_variant_builder_end(&gvb);
+                       if (!devc || !devc->model)
+                               return SR_ERR_ARG;
+                       *data = std_gvar_min_max_step(0.0, devc->model->max_current, 0.0001);
                        break;
                default:
                        return SR_ERR_NA;
                }
        }
 
-       return ret;
+       return SR_OK;
 }
 
 static int dev_acquisition_start(const struct sr_dev_inst *sdi)
@@ -439,9 +384,6 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi)
        struct sr_modbus_dev_inst *modbus;
        int ret;
 
-       if (sdi->status != SR_ST_ACTIVE)
-               return SR_ERR_DEV_CLOSED;
-
        modbus = sdi->conn;
        devc = sdi->priv;
 
@@ -450,7 +392,7 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi)
                return ret;
 
        sr_sw_limits_acquisition_start(&devc->limits);
-       std_session_send_df_header(sdi, LOG_PREFIX);
+       std_session_send_df_header(sdi);
 
        return maynuo_m97_capture_start(sdi);
 }
@@ -459,10 +401,7 @@ static int dev_acquisition_stop(struct sr_dev_inst *sdi)
 {
        struct sr_modbus_dev_inst *modbus;
 
-       if (sdi->status != SR_ST_ACTIVE)
-               return SR_ERR_DEV_CLOSED;
-
-       std_session_send_df_end(sdi, LOG_PREFIX);
+       std_session_send_df_end(sdi);
 
        modbus = sdi->conn;
        sr_modbus_source_remove(sdi->session, modbus);
@@ -470,14 +409,15 @@ static int dev_acquisition_stop(struct sr_dev_inst *sdi)
        return SR_OK;
 }
 
-SR_PRIV struct sr_dev_driver maynuo_m97_driver_info = {
+static struct sr_dev_driver maynuo_m97_driver_info = {
        .name = "maynuo-m97",
        .longname = "maynuo M97/M98 series",
        .api_version = 1,
-       .init = init,
+       .init = std_init,
        .cleanup = std_cleanup,
        .scan = scan,
        .dev_list = std_dev_list,
+       .dev_clear = std_dev_clear,
        .config_get = config_get,
        .config_set = config_set,
        .config_list = config_list,
@@ -487,3 +427,4 @@ SR_PRIV struct sr_dev_driver maynuo_m97_driver_info = {
        .dev_acquisition_stop = dev_acquisition_stop,
        .context = NULL,
 };
+SR_REGISTER_DEV_DRIVER(maynuo_m97_driver_info);