Commit Graph

55 Commits

Author SHA1 Message Date
Uwe Hermann d9251a2c9f Remove some unneeded double-spaces.
(also perform some other minor whitespace fixes while at it)
2016-08-29 21:51:27 +02:00
Lars-Peter Clausen bee2b0168c Use driver name as the log prefix in standard functions
Some of the standard helper functions take a log prefix parameter that is
used when printing messages. This log prefix is almost always identical to
the name field in the driver's sr_dev_driver struct. The only exception are
drivers which register multiple sr_dev_driver structs.

Instead of passing the log prefix as a parameter simply use the driver's
name. This simplifies the API, gives consistent behaviour between different
drivers and also makes it easier to identify where the message originates
when a driver registers sr_dev_driver structs.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
2016-05-31 15:54:52 +02:00
Alexandru Gagniuc c2af709b01 scpi-pps: Add shadow driver for HPIB supplies (ID? instead of *IDN?)
HP instruments predating the 488.2 and SCPI standards do not
necessarily have a SCPI-compliant command set. The HP6630A series of
supplies is one such example.

While scpi-pps is flexible enough to accomodate almost any command
syntax given the right profile, it still assumes that "*IDN?" is the
correct question to ask the instrument. Since older HP gear instead
responds to "ID?", this assumption is no longer true.

Thus sr_scpi_get_hw_id() is not appropriate for these instruments, and
the shadow driver added here only replaces that function call, while
reusing the rest of the existing logic. The extra noise is necessary
in order to propagate this through the .scan member of the driver.
2016-05-19 08:16:46 -07:00
Lars-Peter Clausen dd5c48a6d5 Put driver pointers into special section
The sigrok core needs a list of all available drivers. Currently this list
is manually maintained by updating a global list whenever a driver is added
or removed.

Introduce a new special section that contains the list of all drivers. The
SR_REGISTER_DEV_DRIVER() and SR_REGISTER_DEV_DRIVER_LIST() macro is used to
add drivers to this new list. This is done by placing the pointers to the
driver into a special section. Since nothing else is in this section it is
known that it is simply a list of driver pointers and the core can iterate
over it as if it was an array.

The advantage of this approach is that the code necessary to add a driver
to the list is completely contained to the driver source and it is no
longer necessary to maintain a global list. If a driver is built it will
automatically appear in the list, if it is not built in won't. This means
that the list is always correct, whereas the previous approach used ifdefs
in the global driver list file which could get out-of-sync with the actual
condition when the driver was built.

Any sr_dev_driver structs that are no longer used outside the driver module
are marked as static.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
2016-05-18 01:41:55 +02:00
Lars-Peter Clausen c2fdcc25a4 Remove unnecessary std_init() wrapper functions
Now that the signature of std_init() matches that of the driver init()
callback we can remove all wrapper functions around std_init() and use it
directly as the init() callback.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
2016-05-09 15:10:26 +02:00
Lars-Peter Clausen c45c32ce47 std_init(): Drop check if pass in driver is non-NULL
std_init() checks if the pass in struct sr_dev_driver is non-NULL and
prints a error message and returns an error if it is NULL.

std_init() is exclusively called from driver init() callbacks for which the
core already checks if the struct sr_dev_driver is non-NULL before invoking
the callback. This means the check in std_init() will always evaluate to
false. So drop this check.

This also means that the prefix parameter that was used in the error
message is no longer needed and can be removed from the function signature.
Doing so will make the std_init() function signature identical to the
init() callback signature which will allow to directly use it as such.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
2016-05-09 15:10:26 +02:00
Lars-Peter Clausen 1f8f5bc08e Match std_init() parameter order to the driver init() callback
The std_init() callback has the order of the first two paramters opposite
to the init() callback. This is primarily due to historical development.

Since the std_init() function is usually called from a driver's init()
callback aligning the order will allow direct register pass through rather
than having to swap them around. It also allow to eventually use the
std_init() function directly as the init() callback.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
2016-05-09 15:10:26 +02:00
Lars-Peter Clausen c01bf34ca2 Introduce standard implementation of the dev_list() callback
Every single hardware driver has the very same implementation of the
dev_list() callback. Put this into a helper function in the standard helper
library and use it throughout the drivers. This reduces boiler-plate code
by quite a bit.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
2016-05-03 21:25:16 +02:00
Lars-Peter Clausen 700d6b64d5 Introduce standard cleanup helper
std_init() allocates a drv_context struct which needs to be freed by the
driver in its cleanup struct. But the vast majority of drivers does never
does this causing memory leaks.

Instead of addressing the issue by manually adding code to free the struct
to each driver introduce a new helper function std_cleanup() that takes
care of this. In addition to freeing the drv_context struct std_cleanup()
also invokes sr_dev_clear() which takes care of freeing all devices
attached to the driver.

Combining both operations in the same helper function allows to use
std_cleanup() as the cleanup callback for all existing drivers, which
reduces the amount of boiler-plate code quite a bit.

All drivers are updated to use the new helper function.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
2016-05-03 21:24:39 +02:00
Lars-Peter Clausen 1e726f568d scpi-pps: Fix dev_clear() implementation
Devices for the scpi-pps driver do have additional data attached to it that
needs to be freed when the device is freed. While the driver gets it right
for the cleanup() callback it does not for the dev_clear() callback. This
will cause memory leaks when sr_dev_clear() is called for this driver.

To fix this let the dev_clear() free the additional data.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
2016-05-03 21:24:26 +02:00
Uwe Hermann c50805d59c Drop some unused or duplicated code. 2016-04-29 19:26:17 +02:00
Uwe Hermann 695dc859c1 dev_acquisition_{start,stop}(): Drop duplicate 'cb_data' parameter.
These are always 'sdi', which is passed in already.
2016-04-29 19:20:53 +02:00
Uwe Hermann 3be42bc22f Factor out std_session_send_df_end() helper.
This makes the code shorter, simpler and more consistent, and also
ensures that the (same) debug messages are always emitted and the
packet.payload field is consistently set to NULL always, etc.
2016-04-29 18:08:15 +02:00
Martin Ling a00106b7f8 scpi: Move closing of discovered devices to sr_scpi_scan_resource(). 2015-10-25 22:40:35 +01:00
Uwe Hermann e57057aee7 Fix a few "value never read" scan-build warnings.
This fixes parts of bug #423.

The list of fixed warnings:

src/output/srzip.c:285:3: warning: Value stored to 'ret' is never read
                ret = zip_append(o, logic->data, logic->unitsize, logic->length);
                ^     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/scpi/scpi.c:610:2: warning: Value stored to 'ret' is never read
        ret = SR_OK;
        ^     ~~~~~
src/scpi/scpi.c:667:2: warning: Value stored to 'ret' is never read
        ret = SR_OK;
        ^     ~~~~~
src/dmm/vc870.c:410:2: warning: Value stored to 'info_local' is never read
        info_local = (struct vc870_info *)info;
        ^            ~~~~~~~~~~~~~~~~~~~~~~~~~
src/hardware/conrad-digi-35-cpu/api.c:130:2: warning: Value stored to 'ret' is never read
        ret = SR_OK;
        ^     ~~~~~
src/hardware/fx2lafw/api.c:658:2: warning: Value stored to 'timeout' is never read
        timeout = fx2lafw_get_timeout(devc);
        ^         ~~~~~~~~~~~~~~~~~~~~~~~~~
src/hardware/gmc-mh-1x-2x/protocol.c:941:3: warning: Value stored to 'retc' is never read
                retc = SR_ERR_ARG;
                ^      ~~~~~~~~~~
src/hardware/gmc-mh-1x-2x/api.c:168:2: warning: Value stored to 'model' is never read
        model = METRAHIT_NONE;
        ^       ~~~~~~~~~~~~~
src/hardware/ikalogic-scanalogic2/api.c:325:2: warning: Value stored to 'ret' is never read
        ret = SR_OK;
        ^     ~~~~~
src/hardware/openbench-logic-sniffer/api.c:185:3: warning: Value stored to 'devc' is never read
                devc = sdi->priv;
                ^      ~~~~~~~~~
src/hardware/rigol-ds/api.c:813:3: warning: Value stored to 'devc' is never read
                devc = sdi->priv;
                ^      ~~~~~~~~~
src/hardware/scpi-pps/api.c:405:2: warning: Value stored to 'ret' is never read
        ret = SR_OK;
        ^     ~~~~~
src/hardware/yokogawa-dlm/api.c:239:2: warning: Value stored to 'ret' is never read
        ret = SR_ERR_NA;
        ^     ~~~~~~~~~
2015-09-25 12:02:42 +02:00
Aurelien Jacobs 069d9f25d9 scpi-pps: cleaner rewriting of output regulation GVariant 2015-09-20 16:43:43 +02:00
Aurelien Jacobs d66c93ccda scpi-pps: sr_scpi_get_string() is already called by scpi_cmd_resp()
This double call was causing the following error:
sr: scpi_usbtmc: USBTMC bulk in transfer error: LIBUSB_ERROR_TIMEOUT.
2015-09-20 16:22:21 +02:00
Daniel Elstner 6ec6c43b47 Build: Include <config.h> first in all source files
Since Autoconf places some important feature flags only into the
configuration header, it is necessary to include it globally to
guarantee a consistent build.
2015-09-13 18:54:46 +02:00
Uwe Hermann 34577da641 portability: Use g_ascii_strcasecmp() in favor of strcasecmp().
This is more portable and guaranteed locale-independent.
2015-09-09 15:20:10 +02:00
Bert Vermeulen 9c24d16a1d Make sr_next_enabled_channel() from scpi-pps available library-wide. 2015-08-25 19:13:17 +02:00
Bert Vermeulen 91ef511db2 scpi: Make helper functions from scpi-pps available library-wide. 2015-08-25 19:13:17 +02:00
Soeren Apel 41812aca43 Fix #442 by renaming sr_dev_driver.priv to .context 2015-07-10 01:22:15 +02:00
Aurelien Jacobs 7a0b98b544 Rename SR_CONF_OUTPUT_* to SR_CONF_*.
All those options are currently applied only to power-supplies
but they could apply as well to electronic loads, except for the
fact that electronic loads channels are called inputs and not
outputs.
Also when you think about an SMU (or any kind of 4-quadrants
power-supply), their channels can both source and sink current,
so they can be considered as input as much as output.
Those SR_CONF_* are thus renamed so that they can be used in all
those situations.
2015-05-12 13:22:34 +02:00
Aurelien Jacobs c1603f4574 scpi-pps: don't fail acquisition start for devices with no CMD_SELECT_CHANNEL
For devices such as the HP 6632B the following invocation was failing due to
scpi_cmd(sdi, SCPI_CMD_SELECT_CHANNEL, ...) returning SR_OK_CONTINUE.

./sigrok-cli -d scpi-pps:conn=/dev/ttyUSB0:serialcomm=9600/8n1 --continuous
sr: session: sr_session_start: could not start an acquisition (not enough data to decide error status yet)
Failed to start session.
2015-05-09 23:06:10 +02:00
Uwe Hermann 562a34908e scpi-pps: Minor cleanups. 2015-05-07 03:15:35 +02:00
Alexandru Gagniuc 4264f1c03b scpi-pps: Add infrastructure for controlling output frequency
This patch only adds the needed infrastructure to control output
frequency in the same manner as output voltage or current limit. This
does require a new field in the channel_spec struct, for the sake of
symmetry.
2015-05-06 19:41:46 +02:00
Aurelien Jacobs ba464a1217 strcasecmp() is defined in strings.h. 2015-04-28 22:07:01 +02:00
Uwe Hermann 329733d92c Constify a few arrays and variables. 2015-03-21 20:30:53 +01:00
Martin Ling 4f840ce965 Pass driver struct pointer to driver callbacks.
This lays the groundwork for subdrivers to share callbacks without
needing a separate wrapper function for each subdriver.
2015-03-21 13:09:40 +01:00
Martin Ling 7d4f1741e3 scpi-pps: Initialise sdi with status SR_ST_INACTIVE.
Without this change a segfault occurs at exit after scan, because
dev_close() is called and the device is believed to be open.
2015-03-20 15:33:49 +01:00
Martin Ling 5e23fcab88 Simplify channel creation.
We always follow sr_channel_new() with a call to add the channel to the sdi.
Tidy up a bit by adding this functionality to sr_channel_new() instead.
2015-03-19 21:37:33 +00:00
Uwe Hermann aac29cc192 Eliminate sr_dev_inst_new(). 2014-11-21 02:01:36 +01:00
Bert Vermeulen 9d9cf1c4b9 scpi-pps: Fix driver options. 2014-11-18 16:44:14 +01:00
Uwe Hermann 0af636bed9 Change sr_dev_inst_new() to take no parameters.
Change all callers to set the fields manually as needed.
2014-11-12 17:18:46 +01:00
Bert Vermeulen a258204e00 scpi-pps: Publish driver options. 2014-10-27 17:09:47 +01:00
Bert Vermeulen c1d56d2013 scpi-pps: Move non-standard data type processing to SCPI parser. 2014-10-18 23:21:37 +02:00
Bert Vermeulen 4a471029c2 scpi-pps: Add channel probe facility to scan.
If the number and specs of the device's channels are not static, i.e.
need to be probed, this facility is needed.

Initially this will be used for the Philips PM2800 series, where only
the model returned by *IDN? is needed. However this could also be used
to do actual discovery with vendor-specific SCPI commands.
2014-10-18 23:21:37 +02:00
Soeren Apel d08667c53b scpi-pps: Populate sdi->serial_num and fix hw_info mem leak 2014-10-17 03:02:52 +02:00
Bert Vermeulen 984e4b0db8 scpi-pps: Start acquisition on the first enabled channel. 2014-10-17 03:00:55 +02:00
Bert Vermeulen ee2860ee11 scpi-pps: Disable beeper during session.
At least the Rigol DP800 series trigger the beeper when changing
channels remotely. Which gets rather annoying when doing acquisition
on three channels as fast as you can.
2014-10-16 15:24:27 +02:00
Bert Vermeulen bf48ccebee scpi-pps: Properly clean up acquisition session. 2014-10-16 14:55:56 +02:00
Bert Vermeulen 60475cd788 scpi-pps: Use only standard SCPI for Rigol DP800 series. 2014-10-16 13:23:21 +02:00
Bert Vermeulen ca95e90fb3 Use SR_CONF_OUTPUT_VOLTAGE_TARGET and _CURRENT_LIMIT.
These describe them better; the two are fundamentally different
things to set.
2014-10-15 12:03:00 +02:00
Bert Vermeulen 53a81803e4 scpi-pps: Split boolean set options into enable/disable.
This makes it easier to support devices that need something else
than "ON" or "OFF".
2014-10-13 12:50:28 +02:00
Soeren Apel aed4ad0bea Removal of sdi->index, step 4: fix trivial sr_dev_inst_new() calls 2014-09-30 01:42:58 +02:00
Bert Vermeulen 584560f142 Change type of SR_CONF keys to uint32_t. 2014-09-16 21:22:41 +02:00
Bert Vermeulen 331f56543a scpi-pps: Fix compile warning. 2014-09-08 23:31:54 +02:00
Bert Vermeulen fdedbfcdef scpi-pps: Fix config_set checks. 2014-09-08 23:30:21 +02:00
Bert Vermeulen 01b0257aef scpi-pps: Create one channel per MQ/output combination.
This allows frontends to trivially select which MQs on which channels
they want to see; others won't even be fetched.
2014-09-08 12:45:21 +02:00
Bert Vermeulen 478c8d923e scpi-pps: Simplify SCPI command handling. 2014-09-08 12:45:21 +02:00