X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Fhameg-hmo%2Fprotocol.c;h=ea704eeff003e4051941bea4c5ae64b8411d32b3;hb=6ec6c43b4738dbc7091f4a49a4ec80ea6102cb52;hp=1a788407a4be1db03287b51039922a661b3385e6;hpb=562b7ae513ed755ee93f233d6a460259cea535de;p=libsigrok.git diff --git a/src/hardware/hameg-hmo/protocol.c b/src/hardware/hameg-hmo/protocol.c index 1a788407..ea704eef 100644 --- a/src/hardware/hameg-hmo/protocol.c +++ b/src/hardware/hameg-hmo/protocol.c @@ -17,6 +17,8 @@ * along with this program. If not, see . */ +#include +#include "scpi.h" #include "protocol.h" static const char *hameg_scpi_dialect[] = { @@ -45,21 +47,21 @@ static const char *hameg_scpi_dialect[] = { [SCPI_CMD_SET_ANALOG_CHAN_STATE] = ":CHAN%d:STAT %d", }; -static const int32_t hmo_hwcaps[] = { +static const uint32_t hmo_devopts[] = { SR_CONF_OSCILLOSCOPE, - SR_CONF_TRIGGER_SOURCE, - SR_CONF_TIMEBASE, - SR_CONF_NUM_TIMEBASE, - SR_CONF_TRIGGER_SLOPE, - SR_CONF_HORIZ_TRIGGERPOS, - SR_CONF_SAMPLERATE, - SR_CONF_LIMIT_FRAMES, + SR_CONF_LIMIT_FRAMES | SR_CONF_GET | SR_CONF_SET, + SR_CONF_TRIGGER_SOURCE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST, + SR_CONF_TIMEBASE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST, + SR_CONF_NUM_HDIV | SR_CONF_GET, + SR_CONF_TRIGGER_SLOPE | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST, + SR_CONF_HORIZ_TRIGGERPOS | SR_CONF_GET | SR_CONF_SET, + SR_CONF_SAMPLERATE | SR_CONF_GET, }; -static const int32_t hmo_analog_caps[] = { - SR_CONF_NUM_VDIV, - SR_CONF_COUPLING, - SR_CONF_VDIV, +static const uint32_t hmo_analog_devopts[] = { + SR_CONF_NUM_VDIV | SR_CONF_GET, + SR_CONF_COUPLING | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST, + SR_CONF_VDIV | SR_CONF_GET | SR_CONF_SET | SR_CONF_LIST, }; static const char *hmo_coupling_options[] = { @@ -194,7 +196,7 @@ static const char *scope_digital_channel_names[] = { "D15", }; -static struct scope_config scope_models[] = { +static const struct scope_config scope_models[] = { { .name = {"HMO722", "HMO1022", "HMO1522", "HMO2022", NULL}, .analog_channels = 2, @@ -204,11 +206,11 @@ static struct scope_config scope_models[] = { .analog_names = &scope_analog_channel_names, .digital_names = &scope_digital_channel_names, - .hw_caps = &hmo_hwcaps, - .num_hwcaps = ARRAY_SIZE(hmo_hwcaps), + .devopts = &hmo_devopts, + .num_devopts = ARRAY_SIZE(hmo_devopts), - .analog_hwcaps = &hmo_analog_caps, - .num_analog_hwcaps = ARRAY_SIZE(hmo_analog_caps), + .analog_devopts = &hmo_analog_devopts, + .num_analog_devopts = ARRAY_SIZE(hmo_analog_devopts), .coupling_options = &hmo_coupling_options, .trigger_sources = &hmo_compact2_trigger_sources, @@ -234,11 +236,11 @@ static struct scope_config scope_models[] = { .analog_names = &scope_analog_channel_names, .digital_names = &scope_digital_channel_names, - .hw_caps = &hmo_hwcaps, - .num_hwcaps = ARRAY_SIZE(hmo_hwcaps), + .devopts = &hmo_devopts, + .num_devopts = ARRAY_SIZE(hmo_devopts), - .analog_hwcaps = &hmo_analog_caps, - .num_analog_hwcaps = ARRAY_SIZE(hmo_analog_caps), + .analog_devopts = &hmo_analog_devopts, + .num_analog_devopts = ARRAY_SIZE(hmo_analog_devopts), .coupling_options = &hmo_coupling_options, .trigger_sources = &hmo_compact4_trigger_sources, @@ -257,7 +259,7 @@ static struct scope_config scope_models[] = { }, }; -static void scope_state_dump(struct scope_config *config, +static void scope_state_dump(const struct scope_config *config, struct scope_state *state) { unsigned int i; @@ -326,7 +328,7 @@ static int scope_state_get_array_option(struct sr_scpi_dev_inst *scpi, } static int analog_channel_state_get(struct sr_scpi_dev_inst *scpi, - struct scope_config *config, + const struct scope_config *config, struct scope_state *state) { unsigned int i, j; @@ -381,7 +383,7 @@ static int analog_channel_state_get(struct sr_scpi_dev_inst *scpi, } static int digital_channel_state_get(struct sr_scpi_dev_inst *scpi, - struct scope_config *config, + const struct scope_config *config, struct scope_state *state) { unsigned int i; @@ -414,7 +416,7 @@ SR_PRIV int hmo_update_sample_rate(const struct sr_dev_inst *sdi) { struct dev_context *devc; struct scope_state *state; - struct scope_config *config; + const struct scope_config *config; int tmp; unsigned int i; @@ -476,7 +478,7 @@ SR_PRIV int hmo_scope_state_get(struct sr_dev_inst *sdi) { struct dev_context *devc; struct scope_state *state; - struct scope_config *config; + const struct scope_config *config; float tmp_float; unsigned int i; @@ -539,37 +541,19 @@ SR_PRIV int hmo_scope_state_get(struct sr_dev_inst *sdi) return SR_OK; } -static struct scope_state *scope_state_new(struct scope_config *config) +static struct scope_state *scope_state_new(const struct scope_config *config) { struct scope_state *state; - if (!(state = g_try_malloc0(sizeof(struct scope_state)))) - return NULL; - - if (!(state->analog_channels = g_try_malloc0_n(config->analog_channels, - sizeof(struct analog_channel_state)))) - goto fail; - - if (!(state->digital_channels = g_try_malloc0_n( - config->digital_channels, sizeof(gboolean)))) - goto fail; - - if (!(state->digital_pods = g_try_malloc0_n(config->digital_pods, - sizeof(gboolean)))) - goto fail; + state = g_malloc0(sizeof(struct scope_state)); + state->analog_channels = g_malloc0_n(config->analog_channels, + sizeof(struct analog_channel_state)); + state->digital_channels = g_malloc0_n( + config->digital_channels, sizeof(gboolean)); + state->digital_pods = g_malloc0_n(config->digital_pods, + sizeof(gboolean)); return state; - -fail: - if (state->analog_channels) - g_free(state->analog_channels); - if (state->digital_channels) - g_free(state->digital_channels); - if (state->digital_pods) - g_free(state->digital_pods); - g_free(state); - - return NULL; } SR_PRIV void hmo_scope_state_free(struct scope_state *state) @@ -616,10 +600,8 @@ SR_PRIV int hmo_init_device(struct sr_dev_inst *sdi) /* Add analog channels. */ for (i = 0; i < scope_models[model_index].analog_channels; i++) { - if (!(ch = sr_channel_new(i, SR_CHANNEL_ANALOG, TRUE, - (*scope_models[model_index].analog_names)[i]))) - return SR_ERR_MALLOC; - sdi->channels = g_slist_append(sdi->channels, ch); + ch = sr_channel_new(sdi, i, SR_CHANNEL_ANALOG, TRUE, + (*scope_models[model_index].analog_names)[i]); devc->analog_groups[i] = g_malloc0(sizeof(struct sr_channel_group)); @@ -644,10 +626,8 @@ SR_PRIV int hmo_init_device(struct sr_dev_inst *sdi) /* Add digital channels. */ for (i = 0; i < scope_models[model_index].digital_channels; i++) { - if (!(ch = sr_channel_new(i, SR_CHANNEL_LOGIC, TRUE, - (*scope_models[model_index].digital_names)[i]))) - return SR_ERR_MALLOC; - sdi->channels = g_slist_append(sdi->channels, ch); + ch = sr_channel_new(sdi, i, SR_CHANNEL_LOGIC, TRUE, + (*scope_models[model_index].digital_names)[i]); devc->digital_groups[i < 8 ? 0 : 1]->channels = g_slist_append( devc->digital_groups[i < 8 ? 0 : 1]->channels, ch); @@ -674,74 +654,78 @@ SR_PRIV int hmo_receive_data(int fd, int revents, void *cb_data) (void)fd; + data = NULL; + if (!(sdi = cb_data)) return TRUE; if (!(devc = sdi->priv)) return TRUE; - if (revents == G_IO_IN) { - ch = devc->current_channel->data; + if (revents != G_IO_IN) + return TRUE; - switch (ch->type) { - case SR_CHANNEL_ANALOG: - if (sr_scpi_get_floatv(sdi->conn, NULL, &data) != SR_OK) { - if (data) - g_array_free(data, TRUE); + ch = devc->current_channel->data; - return TRUE; - } + switch (ch->type) { + case SR_CHANNEL_ANALOG: + if (sr_scpi_get_floatv(sdi->conn, NULL, &data) != SR_OK) { + if (data) + g_array_free(data, TRUE); - packet.type = SR_DF_FRAME_BEGIN; - sr_session_send(sdi, &packet); - - analog.channels = g_slist_append(NULL, ch); - analog.num_samples = data->len; - analog.data = (float *) data->data; - analog.mq = SR_MQ_VOLTAGE; - analog.unit = SR_UNIT_VOLT; - analog.mqflags = 0; - packet.type = SR_DF_ANALOG; - packet.payload = &analog; - sr_session_send(cb_data, &packet); - g_slist_free(analog.channels); - g_array_free(data, TRUE); - break; - case SR_CHANNEL_LOGIC: - if (sr_scpi_get_uint8v(sdi->conn, NULL, &data) != SR_OK) { - if (data) - g_free(data); - return TRUE; - } + return TRUE; + } - packet.type = SR_DF_FRAME_BEGIN; - sr_session_send(sdi, &packet); + packet.type = SR_DF_FRAME_BEGIN; + sr_session_send(sdi, &packet); - logic.length = data->len; - logic.unitsize = 1; - logic.data = data->data; - packet.type = SR_DF_LOGIC; - packet.payload = &logic; - sr_session_send(cb_data, &packet); - g_array_free(data, TRUE); - break; - default: - sr_err("Invalid channel type."); - break; + analog.channels = g_slist_append(NULL, ch); + analog.num_samples = data->len; + analog.data = (float *) data->data; + analog.mq = SR_MQ_VOLTAGE; + analog.unit = SR_UNIT_VOLT; + analog.mqflags = 0; + packet.type = SR_DF_ANALOG; + packet.payload = &analog; + sr_session_send(cb_data, &packet); + g_slist_free(analog.channels); + g_array_free(data, TRUE); + data = NULL; + break; + case SR_CHANNEL_LOGIC: + if (sr_scpi_get_uint8v(sdi->conn, NULL, &data) != SR_OK) { + g_free(data); + return TRUE; } - packet.type = SR_DF_FRAME_END; + packet.type = SR_DF_FRAME_BEGIN; sr_session_send(sdi, &packet); - if (devc->current_channel->next) { - devc->current_channel = devc->current_channel->next; - hmo_request_data(sdi); - } else if (++devc->num_frames == devc->frame_limit) { - sdi->driver->dev_acquisition_stop(sdi, cb_data); - } else { - devc->current_channel = devc->enabled_channels; - hmo_request_data(sdi); - } + logic.length = data->len; + logic.unitsize = 1; + logic.data = data->data; + packet.type = SR_DF_LOGIC; + packet.payload = &logic; + sr_session_send(cb_data, &packet); + g_array_free(data, TRUE); + data = NULL; + break; + default: + sr_err("Invalid channel type."); + break; + } + + packet.type = SR_DF_FRAME_END; + sr_session_send(sdi, &packet); + + if (devc->current_channel->next) { + devc->current_channel = devc->current_channel->next; + hmo_request_data(sdi); + } else if (++devc->num_frames == devc->frame_limit) { + sdi->driver->dev_acquisition_stop(sdi, cb_data); + } else { + devc->current_channel = devc->enabled_channels; + hmo_request_data(sdi); } return TRUE;