fully implement input_binary module
This commit is contained in:
parent
78ed642035
commit
13a1291350
|
@ -17,6 +17,7 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
@ -25,51 +26,74 @@
|
||||||
#include <sigrok.h>
|
#include <sigrok.h>
|
||||||
|
|
||||||
#define CHUNKSIZE 4096
|
#define CHUNKSIZE 4096
|
||||||
|
#define DEFAULT_NUM_PROBES 8
|
||||||
|
|
||||||
|
|
||||||
static int format_match(const char *filename)
|
static int format_match(const char *filename)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
/* suppress compiler warning */
|
||||||
filename = NULL;
|
filename = NULL;
|
||||||
|
|
||||||
|
/* this module will handle anything you throw at it */
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int in_loadfile(const char *filename)
|
static int init(struct input *in)
|
||||||
|
{
|
||||||
|
int num_probes;
|
||||||
|
|
||||||
|
if (in->param && in->param[0]) {
|
||||||
|
num_probes = strtoul(in->param, NULL, 10);
|
||||||
|
if (num_probes < 1)
|
||||||
|
return SIGROK_ERR;
|
||||||
|
} else
|
||||||
|
num_probes = DEFAULT_NUM_PROBES;
|
||||||
|
|
||||||
|
/* create a virtual device */
|
||||||
|
in->vdevice = device_new(NULL, 0, num_probes);
|
||||||
|
|
||||||
|
return SIGROK_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int loadfile(struct input *in, const char *filename)
|
||||||
{
|
{
|
||||||
struct datafeed_header header;
|
struct datafeed_header header;
|
||||||
struct datafeed_packet packet;
|
struct datafeed_packet packet;
|
||||||
struct device *device;
|
|
||||||
char buffer[CHUNKSIZE];
|
char buffer[CHUNKSIZE];
|
||||||
int fd, size, num_probes;
|
int fd, size, num_probes;
|
||||||
|
|
||||||
if ((fd = open(filename, O_RDONLY)) == -1)
|
if ((fd = open(filename, O_RDONLY)) == -1)
|
||||||
return SIGROK_ERR;
|
return SIGROK_ERR;
|
||||||
|
|
||||||
/* TODO: Number of probes is hardcoded to 8. */
|
num_probes = g_slist_length(in->vdevice->probes);
|
||||||
num_probes = 8;
|
|
||||||
device = device_new(NULL, 0, num_probes);
|
|
||||||
|
|
||||||
|
/* send header */
|
||||||
header.feed_version = 1;
|
header.feed_version = 1;
|
||||||
header.num_logic_probes = num_probes;
|
header.num_logic_probes = num_probes;
|
||||||
header.num_analog_probes = 0; /* FIXME */
|
header.num_analog_probes = 0;
|
||||||
header.protocol_id = PROTO_RAW;
|
header.protocol_id = PROTO_RAW;
|
||||||
header.samplerate = 0;
|
header.samplerate = 0;
|
||||||
gettimeofday(&header.starttime, NULL);
|
gettimeofday(&header.starttime, NULL);
|
||||||
packet.type = DF_HEADER;
|
packet.type = DF_HEADER;
|
||||||
packet.length = sizeof(struct datafeed_header);
|
packet.length = sizeof(struct datafeed_header);
|
||||||
packet.payload = &header;
|
packet.payload = &header;
|
||||||
session_bus(device, &packet);
|
session_bus(in->vdevice, &packet);
|
||||||
|
|
||||||
|
/* chop up the input file into chunks and feed it into the session bus */
|
||||||
packet.type = DF_LOGIC;
|
packet.type = DF_LOGIC;
|
||||||
packet.unitsize = 1;
|
packet.unitsize = (num_probes + 7) / 8;
|
||||||
packet.payload = buffer;
|
packet.payload = buffer;
|
||||||
while ((size = read(fd, buffer, CHUNKSIZE)) > 0) {
|
while ((size = read(fd, buffer, CHUNKSIZE)) > 0) {
|
||||||
packet.length = size;
|
packet.length = size;
|
||||||
session_bus(device, &packet);
|
session_bus(in->vdevice, &packet);
|
||||||
}
|
}
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
||||||
|
/* end of stream */
|
||||||
packet.type = DF_END;
|
packet.type = DF_END;
|
||||||
packet.length = 0;
|
packet.length = 0;
|
||||||
session_bus(device, &packet);
|
session_bus(in->vdevice, &packet);
|
||||||
|
|
||||||
return SIGROK_OK;
|
return SIGROK_OK;
|
||||||
}
|
}
|
||||||
|
@ -78,5 +102,6 @@ struct input_format input_binary = {
|
||||||
"binary",
|
"binary",
|
||||||
"Raw binary",
|
"Raw binary",
|
||||||
format_match,
|
format_match,
|
||||||
in_loadfile,
|
init,
|
||||||
|
loadfile,
|
||||||
};
|
};
|
||||||
|
|
7
sigrok.h
7
sigrok.h
|
@ -123,15 +123,16 @@ struct datafeed_header {
|
||||||
|
|
||||||
struct input {
|
struct input {
|
||||||
struct input_format *format;
|
struct input_format *format;
|
||||||
void *param;
|
char *param;
|
||||||
void *internal;
|
struct device *vdevice;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct input_format {
|
struct input_format {
|
||||||
char *extension;
|
char *extension;
|
||||||
char *description;
|
char *description;
|
||||||
int (*format_match) (const char *filename);
|
int (*format_match) (const char *filename);
|
||||||
int (*in_loadfile) (const char *filename);
|
int (*init) (struct input *in);
|
||||||
|
int (*loadfile) (struct input *in, const char *filename);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue