PicoScope 7 Software
Available on Windows, Mac and Linux
Code: Select all
#define _GNU_SOURCE
/* Headers for Linux */
#include
#include
#include
#include
#include
#include
#include
#include
#include
/* Definition of PS2000 driver routines on Linux */
#include
#define __stdcall
#define Sleep(x) usleep(1000*(x))
enum BOOL {FALSE,TRUE};
/* End of Linux-specific definitions */
typedef enum {
MODEL_NONE = 0,
MODEL_PS2104 = 2104,
MODEL_PS2105 = 2105,
MODEL_PS2202 = 2202,
MODEL_PS2203 = 2203,
MODEL_PS2204 = 2204,
MODEL_PS2205 = 2205
} MODEL_TYPE;
typedef struct
{
PS2000_THRESHOLD_DIRECTION channelA;
PS2000_THRESHOLD_DIRECTION channelB;
PS2000_THRESHOLD_DIRECTION channelC;
PS2000_THRESHOLD_DIRECTION channelD;
PS2000_THRESHOLD_DIRECTION ext;
} DIRECTIONS;
typedef struct
{
PS2000_PWQ_CONDITIONS * conditions;
int16_t nConditions;
PS2000_THRESHOLD_DIRECTION direction;
uint32_t lower;
uint32_t upper;
PS2000_PULSE_WIDTH_TYPE type;
} PULSE_WIDTH_QUALIFIER;
typedef struct
{
PS2000_CHANNEL channel;
float threshold;
int16_t direction;
float delay;
} SIMPLE;
typedef struct
{
int16_t hysterisis;
DIRECTIONS directions;
int16_t nProperties;
PS2000_TRIGGER_CONDITIONS * conditions;
PS2000_TRIGGER_CHANNEL_PROPERTIES * channelProperties;
PULSE_WIDTH_QUALIFIER pwq;
uint32_t totalSamples;
int16_t autoStop;
int16_t triggered;
} ADVANCED;
typedef struct
{
SIMPLE simple;
ADVANCED advanced;
} TRIGGER_CHANNEL;
typedef struct {
int16_t DCcoupled;
int16_t range;
int16_t enabled;
} CHANNEL_SETTINGS;
typedef struct {
int16_t handle;
MODEL_TYPE model;
PS2000_RANGE firstRange;
PS2000_RANGE lastRange;
TRIGGER_CHANNEL trigger;
int16_t maxTimebase;
int16_t timebases;
int16_t noOfChannels;
CHANNEL_SETTINGS channelSettings[PS2000_MAX_CHANNELS];
int16_t hasAdvancedTriggering;
int16_t hasFastStreaming;
int16_t hasEts;
int16_t hasSignalGenerator;
} UNIT_MODEL;
UNIT_MODEL unitOpened;
int main(int argc, char **argv)
{
int32_t ok;
PS2000_CHANNEL chan;
for (chan=PS2000_CHANNEL_A; chan <= PS2000_CHANNEL_B; chan++) {
unitOpened.channelSettings[chan].enabled = TRUE;
unitOpened.channelSettings[chan].DCcoupled = TRUE;
unitOpened.channelSettings[chan].range = PS2000_5V;
}
unitOpened.trigger.advanced.nProperties = 1;
unitOpened.trigger.advanced.conditions = malloc (sizeof (PS2000_TRIGGER_CONDITIONS) * unitOpened.trigger.advanced.nProperties);
unitOpened.trigger.advanced.conditions->channelA = PS2000_CONDITION_DONT_CARE;
unitOpened.trigger.advanced.conditions->channelB = PS2000_CONDITION_TRUE;
unitOpened.trigger.advanced.conditions->pulseWidthQualifier = PS2000_CONDITION_DONT_CARE;
unitOpened.trigger.advanced.directions.channelA = PS2000_ADV_FALLING;
unitOpened.trigger.advanced.directions.channelB = PS2000_ADV_FALLING;
unitOpened.trigger.advanced.directions.ext = PS2000_ADV_FALLING;
unitOpened.trigger.advanced.channelProperties = malloc (sizeof (PS2000_TRIGGER_CHANNEL_PROPERTIES) * unitOpened.trigger.advanced.nProperties);
unitOpened.trigger.advanced.channelProperties->channel = (int16_t) PS2000_CHANNEL_B;
unitOpened.trigger.advanced.channelProperties->thresholdMajor = 1500;
unitOpened.trigger.advanced.channelProperties->thresholdMinor = 0;
unitOpened.trigger.advanced.channelProperties->hysteresis = (int16_t) 4096;
unitOpened.trigger.advanced.channelProperties->thresholdMode = PS2000_LEVEL;
unitOpened.handle = ps2000_open_unit();
if (0 < unitOpened.handle) {
ok = ps2000_set_ets(unitOpened.handle, PS2000_ETS_OFF, 0, 0);
if (0 == ok) {
fprintf(stdout, "function call ps2000_set_ets failed\n");
} else {
fprintf(stdout, "function call ps2000_set_ets sucessfuly done\n");
}
for (chan=PS2000_CHANNEL_A; chan <= PS2000_CHANNEL_B; chan++) {
ok = ps2000_set_channel(unitOpened.handle, chan, unitOpened.channelSettings[chan].enabled, unitOpened.channelSettings[chan].DCcoupled, unitOpened.channelSettings[chan].range);
if (0 == ok) {
fprintf(stdout, "function call ps2000_set_channel for channel %d failed\n", chan);
}
}
ok = ps2000SetAdvTriggerChannelConditions(unitOpened.handle, unitOpened.trigger.advanced.conditions, unitOpened.trigger.advanced.nProperties);
if (0 == ok) {
fprintf(stdout, "function call: ps2000SetAdvTriggerChannelConditions failed\n");
}
ok = ps2000SetAdvTriggerChannelDirections(unitOpened.handle,
unitOpened.trigger.advanced.directions.channelA,
unitOpened.trigger.advanced.directions.channelB,
PS2000_ADV_FALLING,
PS2000_ADV_FALLING,
PS2000_ADV_FALLING);
if (0 == ok) {
fprintf(stdout, "function call: ps2000SetAdvTriggerChannelDirections failed\n");
}
ok = ps2000SetAdvTriggerChannelProperties(unitOpened.handle, unitOpened.trigger.advanced.channelProperties, unitOpened.trigger.advanced.nProperties, 0);
if (0 == ok) {
fprintf(stdout, "function call: ps2000SetAdvTriggerChannelProperties failed\n");
}
ok = ps2000_run_streaming_ns(unitOpened.handle, 160, PS2000_NS, 700, TRUE, 10, 15000);
if (0 == ok) {
fprintf(stdout, "function call: ps2000_run_streaming_ns failed\n");
}
// Close the unit
ps2000_close_unit(unitOpened.handle);
} else {
fprintf(stdout, "function call ps2000_open_unit failed\n");
}
}
Code: Select all
CC = gcc
CXX = g++
BINDIR = bin
SRCDIR = src
OBJDIR = obj
EXENAME = collect_data
CFLAGS = -Wall -pedantic -std=c99 -O2
CXXFLAGS = -Wall -O2
LFLAGS =
INCL = -I/opt/picoscope/include
LIBS = -L/opt/picoscope/lib -lps2000
OBJS = $(patsubst $(SRCDIR)/%.c, $(OBJDIR)/%.o, $(wildcard $(SRCDIR)/*.c))
OBJS += $(patsubst $(SRCDIR)/%.cpp, $(OBJDIR)/%.o, $(wildcard $(SRCDIR)/*.cpp))
#=========================================#
all: $(BINDIR)/$(EXENAME)
$(BINDIR)/$(EXENAME): $(OBJS)
@mkdir -p $(BINDIR)
@echo "* LINKING $^ TO $@"
@$(CC) -o $@ $^ $(LFLAGS) $(LIBS)
@echo "[DONE]"
$(OBJDIR)/%.o: $(SRCDIR)/%.c
@mkdir -p $(OBJDIR)
@echo "* COMPILING $< TO $@"
@$(CC) -c -o $@ $< $(INCL) $(CFLAGS)
$(OBJDIR)/%.o: $(SRCDIR)/%.cpp
@mkdir -p $(OBJDIR)
@echo "* COMPILING $< TO $@"
@$(CXX) -c -o $@ $< $(INCL) $(CXXFLAGS)
clean:
@rm -f $(BINDIR)/* $(OBJDIR)/*
@echo "[DONE]"
.PHONY: all clean
$ make all
* COMPILING src/CollectData.c TO obj/CollectData.o
* LINKING obj/CollectData.o TO bin/collect_data
[DONE]
$ ./bin/collect_data
function call ps2000_open_unit failed
Code: Select all
Pico USB device found: /dev/bus/usb/002/012
- It belongs to root (which is not you) who has permissions rw-
- The members of group pico (which you are not in) have permissions rw-
- Everyone else (this is you) has permissions r--
- You CANNOT write to this device and so will NOT be able to use it.
Please see the driver installation instructions for assistance in
resolving this problem
Code: Select all
ok = ps2000_set_ets(unitOpened.handle, PS2000_ETS_OFF, 0, 0);
....
ok = ps2000_run_streaming_ns(unitOpened.handle, 160, PS2000_NS, 700, TRUE, 10, 15000);