Files
UltraGrid/quad/Examples/ASI/txmon.c
Martin Pulec 0a57fc4faf Quad - bugfixes
* format is now entered as a parameter string (-g <mode>)
 * expect currently buffers as big as needed (exactly one frame)
   TODO: revide if isn't possible to read whole buffer at once
   (ideally the memmapped one, and extract frames by hand)
 * now it is needed to set /sys/class/sdivideo/sdivideorxX/bufsize
 * bump to new driver (2.7.2)
2011-05-31 15:47:22 +02:00

143 lines
4.1 KiB
C

/* txmon.c
*
* Monitor a DVB ASI transmitter for events.
*
* Copyright (C) 2001-2004 Linear Systems Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. Neither the name of Linear Systems Ltd. nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY LINEAR SYSTEMS LTD. "AS IS" AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL LINEAR SYSTEMS LTD. OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* Linear Systems can be contacted at <http://www.linsys.ca/>.
*
*/
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/poll.h>
#include "asi.h"
#include "master.h"
#include "../util.h"
static const char progname[] = "txmon";
int
main (int argc, char **argv)
{
int opt, fd, val;
struct pollfd pfd;
while ((opt = getopt (argc, argv, "hV")) != -1) {
switch (opt) {
case 'h':
printf ("Usage: %s [OPTION]... DEVICE_FILE\n",
argv[0]);
printf ("Monitor DEVICE_FILE for "
"DVB ASI transmitter events.\n\n");
printf (" -h\tdisplay this help and exit\n");
printf (" -V\toutput version information "
"and exit\n");
printf ("\nReport bugs to <support@linsys.ca>.\n");
return 0;
case 'V':
printf ("%s from master-%s (%s)\n", progname,
MASTER_DRIVER_VERSION,
MASTER_DRIVER_DATE);
printf ("\nCopyright (C) 2001-2004 "
"Linear Systems Ltd.\n"
"This is free software; "
"see the source for copying conditions. "
"There is NO\n"
"warranty; not even for MERCHANTABILITY "
"or FITNESS FOR A PARTICULAR PURPOSE.\n");
return 0;
case '?':
goto USAGE;
}
}
/* Check the number of arguments */
if ((argc - optind) < 1) {
fprintf (stderr, "%s: missing arguments\n", argv[0]);
goto USAGE;
} else if ((argc - optind) > 1) {
fprintf (stderr, "%s: extra operand\n", argv[0]);
goto USAGE;
}
/* Open the file */
if ((fd = open (argv[optind], O_WRONLY, 0)) < 0) {
fprintf (stderr, "%s: ", argv[0]);
perror ("unable to open file for writing");
return -1;
}
/* Monitor the interface */
pfd.fd = fd;
pfd.events = POLLPRI;
for (;;) {
if (poll (&pfd, 1, -1) < 0) {
fprintf (stderr, "%s: ", argv[0]);
perror ("unable to poll device file");
close (fd);
return -1;
}
if (pfd.revents & POLLPRI) {
if (ioctl (fd, ASI_IOC_TXGETEVENTS, &val) < 0) {
fprintf (stderr, "%s: ", argv[0]);
perror ("unable to get "
"the transmitter event flags");
close (fd);
return -1;
}
if (val & ASI_EVENT_TX_BUFFER) {
fprinttime (stdout, progname);
printf ("driver transmit buffer queue "
"underrun detected\n");
}
if (val & ASI_EVENT_TX_FIFO) {
fprinttime (stdout, progname);
printf ("onboard transmit FIFO "
"underrun detected\n");
}
if (val & ASI_EVENT_TX_DATA) {
fprinttime (stdout, progname);
printf ("transmit data status "
"change detected\n");
}
}
}
close (fd);
return 0;
USAGE:
fprintf (stderr, "Try '%s -h' for more information.\n", argv[0]);
return -1;
}