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/>.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
|
@ -24,52 +25,75 @@
|
|||
#include <sys/time.h>
|
||||
#include <sigrok.h>
|
||||
|
||||
#define CHUNKSIZE 4096
|
||||
#define CHUNKSIZE 4096
|
||||
#define DEFAULT_NUM_PROBES 8
|
||||
|
||||
|
||||
static int format_match(const char *filename)
|
||||
{
|
||||
|
||||
/* suppress compiler warning */
|
||||
filename = NULL;
|
||||
|
||||
/* this module will handle anything you throw at it */
|
||||
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_packet packet;
|
||||
struct device *device;
|
||||
char buffer[CHUNKSIZE];
|
||||
int fd, size, num_probes;
|
||||
|
||||
if ((fd = open(filename, O_RDONLY)) == -1)
|
||||
return SIGROK_ERR;
|
||||
|
||||
/* TODO: Number of probes is hardcoded to 8. */
|
||||
num_probes = 8;
|
||||
device = device_new(NULL, 0, num_probes);
|
||||
num_probes = g_slist_length(in->vdevice->probes);
|
||||
|
||||
/* send header */
|
||||
header.feed_version = 1;
|
||||
header.num_logic_probes = num_probes;
|
||||
header.num_analog_probes = 0; /* FIXME */
|
||||
header.num_analog_probes = 0;
|
||||
header.protocol_id = PROTO_RAW;
|
||||
header.samplerate = 0;
|
||||
gettimeofday(&header.starttime, NULL);
|
||||
packet.type = DF_HEADER;
|
||||
packet.length = sizeof(struct datafeed_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.unitsize = 1;
|
||||
packet.unitsize = (num_probes + 7) / 8;
|
||||
packet.payload = buffer;
|
||||
while ((size = read(fd, buffer, CHUNKSIZE)) > 0) {
|
||||
packet.length = size;
|
||||
session_bus(device, &packet);
|
||||
session_bus(in->vdevice, &packet);
|
||||
}
|
||||
close(fd);
|
||||
|
||||
/* end of stream */
|
||||
packet.type = DF_END;
|
||||
packet.length = 0;
|
||||
session_bus(device, &packet);
|
||||
session_bus(in->vdevice, &packet);
|
||||
|
||||
return SIGROK_OK;
|
||||
}
|
||||
|
@ -78,5 +102,6 @@ struct input_format input_binary = {
|
|||
"binary",
|
||||
"Raw binary",
|
||||
format_match,
|
||||
in_loadfile,
|
||||
init,
|
||||
loadfile,
|
||||
};
|
||||
|
|
7
sigrok.h
7
sigrok.h
|
@ -123,15 +123,16 @@ struct datafeed_header {
|
|||
|
||||
struct input {
|
||||
struct input_format *format;
|
||||
void *param;
|
||||
void *internal;
|
||||
char *param;
|
||||
struct device *vdevice;
|
||||
};
|
||||
|
||||
struct input_format {
|
||||
char *extension;
|
||||
char *description;
|
||||
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