cleaned up demo driver

removed unused samplerate
added patternmode (random and incremental)
This commit is contained in:
Bert Vermeulen 2011-01-15 05:12:41 +01:00
parent 925dbf9f97
commit e15f48c268
1 changed files with 54 additions and 81 deletions

View File

@ -25,48 +25,15 @@
#include <sigrok.h>
#include "config.h"
#define BUFSIZE 4096
#define NUM_PROBES 8
#define DEMONAME "Demo device"
/* size of chunks to send through the session bus */
#define BUFSIZE 4096
#define NUM_PROBES 8
#define NUM_TRIGGER_STAGES 4
#define TRIGGER_TYPES "01"
/* Software trigger implementation: positive values indicate trigger stage. */
#define TRIGGER_FIRED -1
#define USB_MODEL_NAME "demodevice"
#define USB_VENDOR_NAME "sigrok"
#define USB_MODEL_VERSION "v1.0"
#define GENMODE_RANDOM 1
#define GENMODE_INC 2
static GThread *my_thread;
static int thread_running;
static int capabilities[] = {
HWCAP_LOGIC_ANALYZER,
HWCAP_SAMPLERATE,
HWCAP_LIMIT_SAMPLES,
HWCAP_CONTINUOUS
};
/* Random selection of samplerates this "device" shall support. */
static uint64_t supported_samplerates[] = {
KHZ(100),
KHZ(500),
MHZ(1),
MHZ(2),
MHZ(12),
MHZ(24),
0,
};
static struct samplerates samplerates = {
KHZ(100),
MHZ(24),
0,
supported_samplerates,
enum {
GENMODE_RANDOM,
GENMODE_INC,
};
struct databag {
@ -79,34 +46,42 @@ struct databag {
gpointer session_device_id;
};
static GThread *my_thread;
static int thread_running;
static int capabilities[] = {
HWCAP_LOGIC_ANALYZER,
HWCAP_PATTERN_MODE,
HWCAP_LIMIT_SAMPLES,
HWCAP_CONTINUOUS
};
static char *patternmodes[] = {
"random",
"incremental",
NULL
};
/* List of struct sigrok_device_instance, maintained by opendev()/closedev(). */
static GSList *device_instances = NULL;
/* TODO: All of these should go in a device-specific struct. */
static uint64_t cur_samplerate = 0;
static uint64_t limit_samples = -1;
// static uint8_t probe_mask = 0;
// static uint8_t trigger_mask[NUM_TRIGGER_STAGES] = { 0 };
// static uint8_t trigger_value[NUM_TRIGGER_STAGES] = { 0 };
// static uint8_t trigger_buffer[NUM_TRIGGER_STAGES] = { 0 };
static int default_genmode = GENMODE_RANDOM;
// static int trigger_stage = TRIGGER_FIRED;
static int hw_set_configuration(int device_index, int capability, void *value);
static void hw_stop_acquisition(int device_index, gpointer session_device_id);
static int hw_init(char *deviceinfo)
{
struct sigrok_device_instance *sdi;
/* Avoid compiler warnings. */
deviceinfo = deviceinfo;
struct sigrok_device_instance *sdi;
sdi = sigrok_device_instance_new(0, ST_ACTIVE,
USB_VENDOR_NAME, USB_MODEL_NAME, USB_MODEL_VERSION);
sdi = sigrok_device_instance_new(0, ST_ACTIVE, DEMONAME, NULL, NULL);
if (!sdi)
return 0;
device_instances = g_slist_append(device_instances, sdi);
return 1;
@ -149,15 +124,12 @@ static void *hw_get_device_info(int device_index, int device_info_id)
case DI_NUM_PROBES:
info = GINT_TO_POINTER(NUM_PROBES);
break;
case DI_SAMPLERATES:
info = &samplerates;
break;
case DI_TRIGGER_TYPES:
info = TRIGGER_TYPES;
break;
case DI_CUR_SAMPLERATE:
info = &cur_samplerate;
break;
case DI_PATTERNMODES:
info = &patternmodes;
break;
}
return info;
@ -168,11 +140,12 @@ static int hw_get_status(int device_index)
/* Avoid compiler warnings. */
device_index = device_index;
return 0; /* FIXME */
return ST_ACTIVE;
}
static int *hw_get_capabilities(void)
{
return capabilities;
}
@ -180,20 +153,29 @@ static int hw_set_configuration(int device_index, int capability, void *value)
{
int ret;
uint64_t *tmp_u64;
char *stropt;
/* Avoid compiler warnings. */
device_index = device_index;
if (capability == HWCAP_SAMPLERATE) {
cur_samplerate = *(uint64_t *) value;
ret = SIGROK_OK;
} else if (capability == HWCAP_PROBECONFIG) {
// ret = configure_probes((GSList *) value); FIXME
if (capability == HWCAP_PROBECONFIG) {
/* nothing to do */
ret = SIGROK_OK;
} else if (capability == HWCAP_LIMIT_SAMPLES) {
tmp_u64 = value;
limit_samples = *tmp_u64;
ret = SIGROK_OK;
} else if (capability == HWCAP_PATTERN_MODE) {
stropt = value;
if (!strcmp(stropt, "random")) {
default_genmode = GENMODE_RANDOM;
ret = SIGROK_OK;
} else if (!strcmp(stropt, "incremental")) {
default_genmode = GENMODE_INC;
ret = SIGROK_OK;
} else {
ret = SIGROK_ERR;
}
} else {
ret = SIGROK_ERR;
}
@ -276,24 +258,21 @@ static int hw_start_acquisition(int device_index, gpointer session_device_id)
{
struct datafeed_packet *packet;
struct datafeed_header *header;
unsigned char *buf;
struct databag *mydata;
mydata = malloc(sizeof(struct databag));
if (!mydata)
return SIGROK_ERR_MALLOC;
mydata->sample_generator = GENMODE_RANDOM;
mydata->sample_generator = default_genmode;
mydata->session_device_id = session_device_id;
mydata->device_index = device_index;
mydata->samples_counter = 0;
mydata->loop_sleep = 100000;
if (pipe(mydata->pipe_fds)) {
fprintf(stderr, "Pipe failed.\n");
return SIGROK_ERR_MALLOC; /* FIXME */
if (pipe(mydata->pipe_fds))
return SIGROK_ERR;
}
source_add(mydata->pipe_fds[0], G_IO_IN | G_IO_ERR, 40, receive_data,
session_device_id);
@ -302,20 +281,14 @@ static int hw_start_acquisition(int device_index, gpointer session_device_id)
thread_running = 1;
my_thread =
g_thread_create((GThreadFunc)thread_func, mydata, TRUE, NULL);
if (!my_thread) {
fprintf(stderr, "demo: Thread creation failed.\n");
return SIGROK_ERR_MALLOC; /* FIXME */
}
if (!my_thread)
return SIGROK_ERR;
packet = malloc(sizeof(struct datafeed_packet));
header = malloc(sizeof(struct datafeed_header));
buf = malloc(2048);
if (!packet || !header || !buf)
if (!packet || !header)
return SIGROK_ERR_MALLOC;
/* FIXME */
memset(buf, 0x55, 2048);
packet->type = DF_HEADER;
packet->length = sizeof(struct datafeed_header);
packet->payload = (unsigned char *)header;
@ -332,7 +305,6 @@ static int hw_start_acquisition(int device_index, gpointer session_device_id)
return SIGROK_OK;
}
/* This stops acquisition on ALL devices, ignoring device_index. */
static void hw_stop_acquisition(int device_index, gpointer session_device_id)
{
struct datafeed_packet packet;
@ -343,6 +315,7 @@ static void hw_stop_acquisition(int device_index, gpointer session_device_id)
/* Send last packet. */
packet.type = DF_END;
session_bus(session_device_id, &packet);
}
struct device_plugin demo_plugin_info = {