X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Fhameg-hmo%2Fprotocol.c;h=8e6dbb4fd0ac979be7cf76a22c622e62a0eb245e;hb=c1aae90038456a61d0f9313d34e6107c3440d3e7;hp=783c3ebc26399f5d9211f1c92567900f07bd65f7;hpb=5e23fcab889c62864b92aa3ad6902ce3e9f5be49;p=libsigrok.git diff --git a/src/hardware/hameg-hmo/protocol.c b/src/hardware/hameg-hmo/protocol.c index 783c3ebc..8e6dbb4f 100644 --- a/src/hardware/hameg-hmo/protocol.c +++ b/src/hardware/hameg-hmo/protocol.c @@ -194,7 +194,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, @@ -257,7 +257,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 +326,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 +381,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 +414,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 +476,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 +539,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) @@ -678,70 +660,70 @@ SR_PRIV int hmo_receive_data(int fd, int revents, void *cb_data) 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; - } - - 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); - data = NULL; - break; - case SR_CHANNEL_LOGIC: - if (sr_scpi_get_uint8v(sdi->conn, NULL, &data) != SR_OK) { - if (data) - g_free(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); - - 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; + 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); + 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_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); + 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;