X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Fhantek-4032l%2Fapi.c;h=26a9315e5035024c9559f679a950576a72246b95;hb=77f3c5e51f86ca45bf8f9aaf74634e6310bae6e4;hp=c35c7a85bf1aa9d36011a19574dbac56c51ba7f1;hpb=f49065c6682b720800e05e8e2821a193b251d65a;p=libsigrok.git diff --git a/src/hardware/hantek-4032l/api.c b/src/hardware/hantek-4032l/api.c index c35c7a85..26a9315e 100644 --- a/src/hardware/hantek-4032l/api.c +++ b/src/hardware/hantek-4032l/api.c @@ -56,6 +56,10 @@ static const uint32_t devopts_cg[] = { SR_CONF_VOLTAGE_THRESHOLD | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST, }; +static const char *cg_names[] = { + "A", "B", +}; + static const char *signal_edges[] = { [H4032L_CLOCK_EDGE_TYPE_RISE] = "rising", [H4032L_CLOCK_EDGE_TYPE_FALL] = "falling", @@ -163,7 +167,7 @@ static const uint64_t samplerates_hw[] = { SR_MHZ(320), }; -SR_PRIV struct sr_dev_driver hantek_4032l_driver_info; +static struct sr_dev_driver hantek_4032l_driver_info; static GSList *scan(struct sr_dev_driver *di, GSList *options) { @@ -248,7 +252,7 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) /* Initialize command packet. */ devc->cmd_pkt.magic = H4032L_CMD_PKT_MAGIC; - devc->cmd_pkt.sample_size = 16384; + devc->cmd_pkt.sample_size = 16 * 1024; devc->sample_rate = 0; devc->status = H4032L_STATUS_IDLE; @@ -257,8 +261,13 @@ static GSList *scan(struct sr_dev_driver *di, GSList *options) devc->external_clock = FALSE; devc->clock_edge = H4032L_CLOCK_EDGE_TYPE_RISE; - devc->cur_threshold[0] = 2.5; - devc->cur_threshold[1] = 2.5; + /* Create array of thresholds from min to max. */ + GVariant *thresholds = std_gvar_min_max_step_thresholds( + H4032L_THR_VOLTAGE_MIN, H4032L_THR_VOLTAGE_MAX, + H4032L_THR_VOLTAGE_STEP); + /* Take default threshold value from array (FP workaround). */ + g_variant_get_child(thresholds, H4032L_THR_VOLTAGE_DEFAULT, + "(dd)", &devc->cur_threshold[0], &devc->cur_threshold[1]); sdi->priv = devc; devices = g_slist_append(devices, sdi); @@ -336,20 +345,16 @@ static int config_get(uint32_t key, GVariant **data, { struct dev_context *devc = sdi->priv; struct sr_usb_dev_inst *usb; - unsigned int idx; + int idx; switch (key) { case SR_CONF_VOLTAGE_THRESHOLD: - if (cg) { - if (!strcmp(cg->name, "A")) - *data = std_gvar_tuple_double( - devc->cur_threshold[0], devc->cur_threshold[0]); - else if (!strcmp(cg->name, "B")) - *data = std_gvar_tuple_double( - devc->cur_threshold[1], devc->cur_threshold[1]); - else - return SR_ERR_CHANNEL_GROUP; - } + if (!cg) + return SR_ERR_CHANNEL_GROUP; + if ((idx = std_str_idx_s(cg->name, ARRAY_AND_SIZE(cg_names))) < 0) + return SR_ERR_CHANNEL_GROUP; + *data = std_gvar_tuple_double( + devc->cur_threshold[idx], devc->cur_threshold[idx]); break; case SR_CONF_SAMPLERATE: *data = g_variant_new_uint64(samplerates_hw[devc->sample_rate]); @@ -364,10 +369,7 @@ static int config_get(uint32_t key, GVariant **data, *data = g_variant_new_boolean(devc->external_clock); break; case SR_CONF_EXTERNAL_CLOCK_SOURCE: - idx = devc->external_clock_source; - if (idx >= ARRAY_SIZE(ext_clock_sources)) - return SR_ERR_BUG; - *data = g_variant_new_string(ext_clock_sources[idx]); + *data = g_variant_new_string(ext_clock_sources[devc->external_clock_source]); break; case SR_CONF_CONN: if (!sdi || !(usb = sdi->conn)) @@ -375,10 +377,7 @@ static int config_get(uint32_t key, GVariant **data, *data = g_variant_new_printf("%d.%d", usb->bus, usb->address); break; case SR_CONF_CLOCK_EDGE: - idx = devc->clock_edge; - if (idx >= ARRAY_SIZE(signal_edges)) - return SR_ERR_BUG; - *data = g_variant_new_string(signal_edges[idx]); + *data = g_variant_new_string(signal_edges[devc->clock_edge]); break; default: return SR_ERR_NA; @@ -390,60 +389,47 @@ static int config_get(uint32_t key, GVariant **data, static int config_set(uint32_t key, GVariant *data, const struct sr_dev_inst *sdi, const struct sr_channel_group *cg) { + int idx; struct dev_context *devc = sdi->priv; struct h4032l_cmd_pkt *cmd_pkt = &devc->cmd_pkt; - int idx; + uint64_t sample_rate, num_samples; + double low, high; switch (key) { - case SR_CONF_SAMPLERATE: { - uint64_t sample_rate = g_variant_get_uint64(data); - uint8_t i = 0; - while (i < ARRAY_SIZE(samplerates_hw) && samplerates_hw[i] != sample_rate) - i++; - - if (i == ARRAY_SIZE(samplerates_hw) || sample_rate == 0) { - sr_err("Invalid sample rate."); - return SR_ERR_SAMPLERATE; - } - devc->sample_rate = i; - break; - } - case SR_CONF_CAPTURE_RATIO: { - uint64_t capture_ratio = g_variant_get_uint64(data); - if (capture_ratio > 99) { - sr_err("Invalid capture ratio."); - return SR_ERR; - } - devc->capture_ratio = capture_ratio; - break; - } - case SR_CONF_LIMIT_SAMPLES: { - uint64_t number_samples = g_variant_get_uint64(data); - number_samples += 511; - number_samples &= 0xfffffe00; - if (number_samples < H4043L_NUM_SAMPLES_MIN || - number_samples > H4032L_NUM_SAMPLES_MAX) { - sr_err("Invalid sample range 2k...64M: %" - PRIu64 ".", number_samples); - return SR_ERR; - } - cmd_pkt->sample_size = number_samples; - break; + case SR_CONF_SAMPLERATE: + idx = 0; + sample_rate = g_variant_get_uint64(data); + while (idx < (int)ARRAY_SIZE(samplerates_hw) && samplerates_hw[idx] != sample_rate) + idx++; + if (idx == ARRAY_SIZE(samplerates_hw) || sample_rate == 0) { + sr_err("Invalid sample rate."); + return SR_ERR_SAMPLERATE; } - case SR_CONF_VOLTAGE_THRESHOLD: { - double low, high; - g_variant_get(data, "(dd)", &low, &high); - double threshold = (low + high) / 2.0; - if (cg) { - if (!strcmp(cg->name, "A")) - devc->cur_threshold[0] = threshold; - else if (!strcmp(cg->name, "B")) - devc->cur_threshold[1] = threshold; - else - return SR_ERR_CHANNEL_GROUP; - } - break; + devc->sample_rate = idx; + break; + case SR_CONF_CAPTURE_RATIO: + devc->capture_ratio = g_variant_get_uint64(data); + break; + case SR_CONF_LIMIT_SAMPLES: + num_samples = g_variant_get_uint64(data); + num_samples += 511; + num_samples &= 0xfffffe00; + if (num_samples < H4043L_NUM_SAMPLES_MIN || + num_samples > H4032L_NUM_SAMPLES_MAX) { + sr_err("Invalid sample range 2k...64M: %" + PRIu64 ".", num_samples); + return SR_ERR; } + cmd_pkt->sample_size = num_samples; + break; + case SR_CONF_VOLTAGE_THRESHOLD: + if (!cg) + return SR_ERR_CHANNEL_GROUP; + if ((idx = std_str_idx_s(cg->name, ARRAY_AND_SIZE(cg_names))) < 0) + return SR_ERR_CHANNEL_GROUP; + g_variant_get(data, "(dd)", &low, &high); + devc->cur_threshold[idx] = (low + high) / 2.0; + break; case SR_CONF_EXTERNAL_CLOCK: devc->external_clock = g_variant_get_boolean(data); break; @@ -467,7 +453,6 @@ static int config_set(uint32_t key, GVariant *data, 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 = (sdi) ? sdi->priv : NULL; switch (key) { @@ -488,7 +473,8 @@ static int config_list(uint32_t key, GVariant **data, *data = std_gvar_array_i32(ARRAY_AND_SIZE(trigger_matches)); break; case SR_CONF_VOLTAGE_THRESHOLD: - *data = std_gvar_min_max_step_thresholds(-6.0, 6.0, 0.1); + *data = std_gvar_min_max_step_thresholds(H4032L_THR_VOLTAGE_MIN, + H4032L_THR_VOLTAGE_MAX, H4032L_THR_VOLTAGE_STEP); break; case SR_CONF_LIMIT_SAMPLES: *data = std_gvar_tuple_u64(H4043L_NUM_SAMPLES_MIN, H4032L_NUM_SAMPLES_MAX); @@ -529,7 +515,7 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi) else cmd_pkt->sample_rate = devc->sample_rate; - /* Set pwm channel values. */ + /* Set PWM channel values. */ devc->cmd_pkt.pwm_a = h4032l_voltage2pwm(devc->cur_threshold[0]); devc->cmd_pkt.pwm_b = h4032l_voltage2pwm(devc->cur_threshold[1]); @@ -601,25 +587,9 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi) channel = channel->next; } - /* Compress range mask value and apply range settings. */ - if (range_mask) { - cmd_pkt->trigger[0].flags.data_range_enabled = 1; - cmd_pkt->trigger[0].data_range_mask |= (range_mask); - - uint32_t new_range_value = 0; - uint32_t bit_mask = 1; - while (range_mask) { - if ((range_mask & 1) != 0) { - new_range_value <<= 1; - if ((range_value & 1) != 0) - new_range_value |= bit_mask; - bit_mask <<= 1; - } - range_mask >>= 1; - range_value >>= 1; - } - cmd_pkt->trigger[0].data_range_max |= range_value; - } + cmd_pkt->trigger[0].flags.data_range_enabled = 1; + cmd_pkt->trigger[0].data_range_mask |= range_mask; + cmd_pkt->trigger[0].data_range_max = range_value; } usb_source_add(sdi->session, drvc->sr_ctx, 1000, @@ -635,7 +605,7 @@ static int dev_acquisition_stop(struct sr_dev_inst *sdi) return h4032l_stop(sdi); } -SR_PRIV struct sr_dev_driver hantek_4032l_driver_info = { +static struct sr_dev_driver hantek_4032l_driver_info = { .name = "hantek-4032l", .longname = "Hantek 4032L", .api_version = 1,