From 4185d823d248dede38a89c3e5c47f273ff9edbbe Mon Sep 17 00:00:00 2001 From: dreamsourcelabTAI Date: Fri, 12 Aug 2022 13:25:50 +0800 Subject: [PATCH] Code refactoring 10 --- libsigrok4DSL/hardware/DSL/dsl.c | 2 -- libsigrok4DSL/hardware/demo/demo.c | 14 ---------- libsigrok4DSL/lib_main.c | 35 +++++++++++++++---------- libsigrok4DSL/libsigrok-internal.h | 1 + libsigrok4DSL/libsigrok.h | 2 +- libsigrok4DSL/session.c | 41 ++++++++++++++++++++++++------ 6 files changed, 57 insertions(+), 38 deletions(-) diff --git a/libsigrok4DSL/hardware/DSL/dsl.c b/libsigrok4DSL/hardware/DSL/dsl.c index 157e8e93..8c2ae7ea 100644 --- a/libsigrok4DSL/hardware/DSL/dsl.c +++ b/libsigrok4DSL/hardware/DSL/dsl.c @@ -30,8 +30,6 @@ #undef LOG_PREFIX #define LOG_PREFIX "dsl: " -extern struct ds_trigger *trigger; - static const int32_t probeOptions[] = { SR_CONF_PROBE_COUPLING, SR_CONF_PROBE_VDIV, diff --git a/libsigrok4DSL/hardware/demo/demo.c b/libsigrok4DSL/hardware/demo/demo.c index 0c8827b9..b82f1409 100644 --- a/libsigrok4DSL/hardware/demo/demo.c +++ b/libsigrok4DSL/hardware/demo/demo.c @@ -1000,20 +1000,6 @@ static int hw_dev_acquisition_start(struct sr_dev_inst *sdi, devc->stop = FALSE; devc->samples_not_sent = 0; - /* - * trigger setting - */ -// if (!trigger->trigger_en || sdi->mode != LOGIC) { -// devc->trigger_stage = 0; -// } else { -// devc->trigger_mask = ds_trigger_get_mask0(TriggerStages); -// devc->trigger_value = ds_trigger_get_value0(TriggerStages); -// devc->trigger_edge = ds_trigger_get_edge0(TriggerStages); -// if (devc->trigger_edge != 0) -// devc->trigger_stage = 2; -// else -// devc->trigger_stage = 1; -// } devc->trigger_stage = 0; /* diff --git a/libsigrok4DSL/lib_main.c b/libsigrok4DSL/lib_main.c index 96c2a046..bafe5f8b 100644 --- a/libsigrok4DSL/lib_main.c +++ b/libsigrok4DSL/lib_main.c @@ -113,7 +113,7 @@ SR_API int ds_lib_init() } lib_ctx.lib_exit_flag = 0; - //init trigger + // Init trigger. ds_trigger_init(); // Initialise all libsigrok drivers @@ -171,14 +171,16 @@ SR_API int ds_lib_exit() pthread_mutex_destroy(&lib_ctx.mutext); //uninit locker - //uninit trigger - ds_trigger_destroy(); + // Uninit trigger. + ds_trigger_destroy(); if (sr_exit(lib_ctx.sr_ctx) != SR_OK){ sr_err("%s", "call sr_exit error"); } lib_ctx.sr_ctx = NULL; + + sr_log_uninit(); //try uninit log return SR_OK; @@ -461,12 +463,12 @@ SR_API int ds_device_start_collect() sr_err("%s", "Is collecting."); return SR_ERR_CALL_STATUS; } - if (lib_ctx.current_device_instance == NULL){ + if (di == NULL){ sr_err("%s", "Please set a current device first."); return SR_ERR_CALL_STATUS; } - if (lib_ctx.current_device_instance->status != SR_ST_ACTIVE){ - sr_err("The device cannot be used, status:%d", SR_ST_ACTIVE); + if (di->status == SR_ST_INITIALIZING){ + sr_err("Error!The device is initializing."); return SR_ERR_CALL_STATUS; } if (ds_channel_is_enabled() == 0){ @@ -480,9 +482,10 @@ SR_API int ds_device_start_collect() lib_ctx.collect_stop_flag = 0; - sr_session_new(); //create new session + // Create new session. + sr_session_new(); - ret = open_device_instance(lib_ctx.current_device_instance); //open device + ret = open_device_instance(di); //open device if (ret != SR_OK){ sr_err("%s", "Open device error!"); return ret; @@ -531,17 +534,23 @@ END: */ SR_API int ds_device_stop_collect() { - if (lib_ctx.collect_thread != NULL){ - sr_session_destroy(); + struct sr_dev_inst *di; + di = lib_ctx.current_device_instance; + if (lib_ctx.collect_thread != NULL){ + lib_ctx.collect_stop_flag = 1; + // Stop current session. + sr_session_stop(); + g_thread_join(lib_ctx.collect_thread); //Wait the collect thread ends. lib_ctx.collect_thread = NULL; - if (lib_ctx.current_device_instance != NULL){ - close_device_instance(lib_ctx.current_device_instance); - } + close_device_instance(di); + + // Destroy current session. + sr_session_destroy(); } return SR_OK; diff --git a/libsigrok4DSL/libsigrok-internal.h b/libsigrok4DSL/libsigrok-internal.h index 28477618..dd4ea866 100644 --- a/libsigrok4DSL/libsigrok-internal.h +++ b/libsigrok4DSL/libsigrok-internal.h @@ -57,6 +57,7 @@ /** global variable */ extern char DS_RES_PATH[500]; +extern struct ds_trigger *trigger; typedef void (*hotplug_event_callback)(struct libusb_context *ctx, struct libusb_device *dev, int event); diff --git a/libsigrok4DSL/libsigrok.h b/libsigrok4DSL/libsigrok.h index 88452e47..e02754f1 100644 --- a/libsigrok4DSL/libsigrok.h +++ b/libsigrok4DSL/libsigrok.h @@ -1073,7 +1073,7 @@ enum sr_config_option_id{ }; /** Device instance status. */ -enum { +enum sr_device_status { /** The device instance was not found. */ SR_ST_NOT_FOUND = 10000, /** The device instance was found, but is still booting. */ diff --git a/libsigrok4DSL/session.c b/libsigrok4DSL/session.c index a40c3a64..217c9051 100644 --- a/libsigrok4DSL/session.c +++ b/libsigrok4DSL/session.c @@ -29,6 +29,10 @@ #undef LOG_PREFIX #define LOG_PREFIX "session: " + +/* There can only be one session at a time. */ +/* 'session' is not static, it's used elsewhere (via 'extern'). */ +static struct sr_session *session = NULL; /** * @file @@ -60,10 +64,6 @@ struct datafeed_callback { void *cb_data; }; -/* There can only be one session at a time. */ -/* 'session' is not static, it's used elsewhere (via 'extern'). */ -struct sr_session *session; - /** * Create a new session. * @@ -74,8 +74,14 @@ struct sr_session *session; */ SR_API struct sr_session *sr_session_new(void) { - if (!(session = g_try_malloc0(sizeof(struct sr_session)))) { - sr_err("Session malloc failed."); + if (session != NULL){ + sr_info("%s", "Destroy the old session."); + sr_session_destroy(); // Destory the old. + } + + session = g_try_malloc0(sizeof(struct sr_session)); + if (session == NULL) { + sr_err("%s", "Session malloc failed."); return NULL; } @@ -96,7 +102,7 @@ SR_API struct sr_session *sr_session_new(void) */ SR_API int sr_session_destroy(void) { - if (!session) { + if (session == NULL) { sr_detail("%s: session was NULL", __func__); return SR_ERR_BUG; } @@ -143,6 +149,11 @@ static int sr_session_iteration(gboolean block) unsigned int i; int ret; + if (session == NULL){ + sr_err("%s", "sr_session_iteration(), session is null."); + return SR_ERR_CALL_STATUS; + } + ret = g_poll(session->pollfds, session->num_sources, block ? session->source_timeout : 0); for (i = 0; i < session->num_sources; i++) { @@ -183,7 +194,7 @@ static int sr_session_iteration(gboolean block) */ SR_API int sr_session_run(void) { - if (!session) { + if (session == NULL) { sr_err("%s: session was NULL; a session must be " "created first, before running it.", __func__); return SR_ERR_BUG; @@ -262,6 +273,11 @@ static void datafeed_dump(const struct sr_datafeed_packet *packet) const struct sr_datafeed_dso *dso; const struct sr_datafeed_analog *analog; + if (packet == NULL){ + sr_err("%s", "datafeed_dump() Error! packet is null."); + return; + } + switch (packet->type) { case SR_DF_HEADER: sr_dbg("bus: Received SR_DF_HEADER packet."); @@ -327,6 +343,10 @@ static int _sr_session_source_add(GPollFD *pollfd, int timeout, sr_err("%s: cb was NULL", __func__); return SR_ERR_ARG; } + if (session == NULL){ + sr_err("%s", "_sr_session_source_add(), session is null."); + return SR_ERR_CALL_STATUS; + } /* Note: cb_data can be NULL, that's not a bug. */ @@ -445,6 +465,11 @@ static int _sr_session_source_remove(gintptr poll_object) GPollFD *new_pollfds; unsigned int old; + if (session == NULL){ + sr_err("%s", "_sr_session_source_remove(), session is null."); + return SR_ERR_CALL_STATUS; + } + if (!session->sources || !session->num_sources) { sr_err("%s: sources was NULL", __func__); return SR_ERR_BUG;