mirror of
https://github.com/rofafor/vdr-plugin-femon.git
synced 2023-10-10 11:36:53 +00:00
Compare commits
33 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5819441c03 | ||
|
|
b0b0fe4f02 | ||
|
|
64e56af6dc | ||
|
|
830aa73e1a | ||
|
|
78048d8ea0 | ||
|
|
42c6b69490 | ||
|
|
6ce0ca32bd | ||
|
|
74a2a1bbe7 | ||
|
|
bf85e32d0d | ||
|
|
caf42f7ace | ||
|
|
c2b1e5a187 | ||
|
|
e90fe6065c | ||
|
|
7ee255830a | ||
|
|
7da8cb2110 | ||
|
|
e2fb9e994a | ||
|
|
37957be99f | ||
|
|
713f9e652a | ||
|
|
7c948cde72 | ||
|
|
8e57eec535 | ||
|
|
0f111eb660 | ||
|
|
6670f85a20 | ||
|
|
9814970182 | ||
|
|
5bda0fa833 | ||
|
|
ca954757db | ||
|
|
825755281f | ||
|
|
ab3f270eed | ||
|
|
995b2567e5 | ||
|
|
6f9961f499 | ||
|
|
c454189adf | ||
|
|
5339f71b33 | ||
|
|
8e53fa8521 | ||
|
|
9514ed5387 | ||
|
|
a6039cdd66 |
18
COPYING
18
COPYING
@@ -2,7 +2,7 @@
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
@@ -15,7 +15,7 @@ software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Library General Public License instead.) You can apply it to
|
||||
the GNU Lesser General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
@@ -55,7 +55,7 @@ patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
@@ -110,7 +110,7 @@ above, provided that you also meet all of these conditions:
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
@@ -168,7 +168,7 @@ access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
@@ -225,7 +225,7 @@ impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
@@ -278,7 +278,7 @@ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
@@ -305,7 +305,7 @@ the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
@@ -336,5 +336,5 @@ necessary. Here is a sample; alter the names:
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Library General
|
||||
library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License.
|
||||
|
||||
211
HISTORY
211
HISTORY
@@ -1,5 +1,6 @@
|
||||
===================================
|
||||
VDR Plugin 'femon' Revision History
|
||||
-----------------------------------
|
||||
===================================
|
||||
|
||||
2004-02-15: Version 0.0.1
|
||||
|
||||
@@ -54,7 +55,17 @@ VDR Plugin 'femon' Revision History
|
||||
|
||||
- Backported changes and fixes from version 0.1.2.
|
||||
|
||||
-------------------------
|
||||
2004-06-11: Version 0.0.6
|
||||
|
||||
- Backported the "AC3 Stream Information" feature from version 0.1.3.
|
||||
|
||||
2004-09-11: Version 0.0.7
|
||||
|
||||
- Backported changes and fixes from version 0.1.6.
|
||||
|
||||
===================================
|
||||
VDR Plugin 'femon' Revision History
|
||||
===================================
|
||||
|
||||
2004-05-18: Version 0.1.0
|
||||
|
||||
@@ -73,3 +84,199 @@ VDR Plugin 'femon' Revision History
|
||||
- Fixed the channel switch bug (reported by Stefan Lucke).
|
||||
- Nid/Tid/Rid are now included in translations.
|
||||
- Added video format and aspect ratio symbols into status window.
|
||||
|
||||
2004-06-11: Version 0.1.3
|
||||
|
||||
- Added "AC-3 Stream Information" display mode (Thanks to Lothar Englisch).
|
||||
|
||||
2004-06-24: Version 0.1.4
|
||||
|
||||
- Added some new symbols and beautified the old ones.
|
||||
- Added audio track selection feature.
|
||||
- Added preliminary device switching feature (disabled at the moment).
|
||||
|
||||
2004-08-18: Version 0.1.5
|
||||
|
||||
- Fixed OSDSTATUSWIN_XC define.
|
||||
- Added preliminary NTSC support (make NTSC_SYSTEM=1 plugins).
|
||||
- Fixed "Setup/OSD/Use Small Fonts" bug (Thanks to Winni for reporting this one).
|
||||
- Added patches directory: CA system names by Lauri Tischler.
|
||||
|
||||
2004-09-11: Version 0.1.6
|
||||
|
||||
- Yet Another Minor Release.
|
||||
- Integrated the CA system names patch: "Setup / Show CA System".
|
||||
|
||||
2004-11-28: Version 0.1.7
|
||||
|
||||
- Updated for vdr-1.3.17.
|
||||
- Fixed receiver related crash (Thanks to Marco Schluessler).
|
||||
|
||||
2005-01-15: Version 0.7.7
|
||||
|
||||
- Updated for vdr-1.3.18.
|
||||
- Added DEBUG mode (make DEBUG=1 plugins).
|
||||
- OSD height is now user configurable.
|
||||
- Added audio channel selection into Yellow key.
|
||||
|
||||
2005-01-23: Version 0.7.9
|
||||
|
||||
- Some minor cosmetic fixes.
|
||||
|
||||
2005-01-23: Version 0.8.0
|
||||
|
||||
- Updated for vdr-1.3.19.
|
||||
|
||||
2005-01-24: Version 0.8.1
|
||||
|
||||
- Added Estonian translations (Thanks to Arthur Konovalov).
|
||||
|
||||
2005-02-24: Version 0.8.5
|
||||
|
||||
- Updated for vdr-1.3.21.
|
||||
- Minor modification for DEBUG mode.
|
||||
- Added preliminary support for themes and some GUI tweaks.
|
||||
- Added horizontal offset setup option.
|
||||
|
||||
2005-02-26: Version 0.8.6
|
||||
|
||||
- Horizontal offset setup option should be functional now.
|
||||
|
||||
2005-04-01: Version 0.8.7
|
||||
|
||||
- Default make target is now all.
|
||||
- Fixed the access rights of symbols subdirectory (Thanks to Harri Kukkonen).
|
||||
- Added a new theme: Moronimo (Thanks to Morone).
|
||||
|
||||
2005-04-02: Version 0.8.8
|
||||
|
||||
- Cleaned up finnish translations (Thanks to Ville Skytt<74>).
|
||||
|
||||
2005-04-04: Version 0.8.9
|
||||
|
||||
- Updated Estonian translations (Thanks to Arthur Konovalov).
|
||||
- Added the missing german translations (Thanks to #vdr-portal).
|
||||
|
||||
2005-05-20: Version 0.9.0
|
||||
|
||||
- Renamed compiling switches ('DEBUG' to 'FEMON_DEBUG' and 'NTSC_SYSTEM' to 'FEMON_NTSC').
|
||||
- Enabled preliminary support for the device switching.
|
||||
|
||||
2005-07-23: Version 0.9.1
|
||||
|
||||
- Fixed AC3-info flickering (Thanks to Pasi Juppo for reporting this one).
|
||||
- Added "Analog" type CA system.
|
||||
- Plugin is now stripped by default.
|
||||
|
||||
2005-08-15: Version 0.9.2
|
||||
|
||||
- Threads updated for vdr-1.3.29.
|
||||
|
||||
2005-08-28: Version 0.9.3
|
||||
|
||||
- Updated for vdr-1.3.31.
|
||||
- Added preliminary svdrp and service support.
|
||||
|
||||
2005-10-04: Version 0.9.4
|
||||
|
||||
- Updated for vdr-1.3.34.
|
||||
- Added Enigma theme (Thanks to Rolf Hoverath).
|
||||
- Added EgalsTry theme (Thanks to Uwe Hanke).
|
||||
- Added option to disable rounded corners.
|
||||
|
||||
2005-11-13: Version 0.9.5
|
||||
|
||||
- Updated for vdr-1.3.36.
|
||||
- Added french translation (Thanks to Nicolas Huillard).
|
||||
- Enabled bitrate commands via SVDRP.
|
||||
- Added new SVDRP commands.
|
||||
- Modified femon service without incrementing version number.
|
||||
- Added "Duotone" theme for 2bpp on screen displays.
|
||||
- Fixed crash bug in femonreceiver.
|
||||
- Fixed setup page bug (Thanks to Thomas G<>nther for reporting this one).
|
||||
|
||||
2006-01-25: Version 0.9.6
|
||||
|
||||
- Updated for vdr-1.3.40.
|
||||
- Fixed a translation bug (Thanks to Antti Hartikainen).
|
||||
- Fixed AC3 header parsing bug (Thanks to Axel Katzur for reporting this one).
|
||||
- Fixed EgalsTry theme (Thanks to Uwe Hanke).
|
||||
|
||||
2006-02-06: Version 0.9.7
|
||||
|
||||
- Updated for vdr-1.3.42.
|
||||
- Added "SilverGreen" theme (Thanks to Rififi77 @ VDRPortal).
|
||||
|
||||
2006-03-08: Version 0.9.8
|
||||
|
||||
- Updated for vdr-1.3.44.
|
||||
- Minor Makefile changes.
|
||||
- Made all symbol data 'const'.
|
||||
- Added spanish translation (Thanks to Luis Palacios).
|
||||
|
||||
2006-04-20: Version 0.9.9
|
||||
|
||||
- Updated for vdr-1.3.47.
|
||||
|
||||
2006-04-23: Version 0.9.10
|
||||
|
||||
- Added STRIP option for Makefile (Thanks to Ville Skytt<74>).
|
||||
- Modified APIVERSION code in Makefile.
|
||||
|
||||
2006-04-30: Version 1.0.0
|
||||
|
||||
- Updated for vdr-1.4.0.
|
||||
- Modified APIVERSION code in Makefile.
|
||||
- Updated german translation (Thanks to Andreas Brachold).
|
||||
|
||||
2006-06-06: Version 1.0.1
|
||||
|
||||
- Fixed device switching priority (Thanks to Andreas Brugger).
|
||||
- Fixed device switching back to the primary device.
|
||||
|
||||
2006-09-17: Version 1.1.0
|
||||
|
||||
- Added support for svdrpservice plugin (Thanks to Frank Schmirler).
|
||||
- Added INFO SVDRP command (partially based on patch by Herbert P<>tzl).
|
||||
- Removed system log option - use SVDRP instead.
|
||||
- Added --remove-destination to the 'cp' command in Makefile.
|
||||
|
||||
2007-01-08: Version 1.1.1
|
||||
|
||||
- Updated for vdr-1.5.0.
|
||||
|
||||
2007-05-01: Version 1.1.2
|
||||
|
||||
- Fixed opening while replaying (Thanks to Antti Sepp<70>l<EFBFBD> for reporting this one).
|
||||
|
||||
2007-05-15: Version 1.1.3
|
||||
|
||||
- Fixed a race condition in cFemonReceiver (Thanks to Reinhard Nissl).
|
||||
|
||||
2007-10-14: Version 1.1.4
|
||||
|
||||
- Backported from 1.2.2.
|
||||
|
||||
2008-01-20: Version 1.1.5
|
||||
|
||||
- Updated Italian translation (Thanks to Gringo).
|
||||
- Added '-Wno-parentheses' to the compiler options.
|
||||
|
||||
2007-08-14: Version 1.2.0
|
||||
|
||||
- Updated for vdr-1.5.7.
|
||||
|
||||
2007-08-19: Version 1.2.1
|
||||
|
||||
- Updated for vdr-1.5.8.
|
||||
|
||||
2007-10-14: Version 1.2.2
|
||||
|
||||
- Added Spids support.
|
||||
- Minor OSD layout changes.
|
||||
|
||||
2008-01-20: Version 1.2.3
|
||||
|
||||
- Updated Italian translation (Thanks to Gringo).
|
||||
- Added '-Wno-parentheses' to the compiler options.
|
||||
- Mapped 'kInfo' as help key in setup menu.
|
||||
|
||||
50
Makefile
50
Makefile
@@ -3,24 +3,34 @@
|
||||
#
|
||||
# $Id$
|
||||
|
||||
# Debugging on/off
|
||||
#FEMON_DEBUG = 1
|
||||
|
||||
# NTSC on/off
|
||||
#FEMON_NTSC = 1
|
||||
|
||||
# Strip debug symbols? Set eg. to /bin/true if not
|
||||
STRIP = strip
|
||||
|
||||
# The official name of this plugin.
|
||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
||||
# By default the main source file also carries this name.
|
||||
# IMPORTANT: the presence of this macro is important for the Make.config
|
||||
# file. So it must be defined, even if it is not used here!
|
||||
#
|
||||
PLUGIN = femon
|
||||
|
||||
### The version number of this plugin (taken from the main source file):
|
||||
|
||||
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
||||
VERSION = $(shell grep 'static const char VERSION\[\] *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
|
||||
|
||||
### The C++ compiler and options:
|
||||
|
||||
CXX ?= g++
|
||||
CXXFLAGS ?= -O2 -Wall -Woverloaded-virtual
|
||||
CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual -Wno-parentheses
|
||||
|
||||
### The directory environment:
|
||||
|
||||
DVBDIR = ../../../../DVB
|
||||
VDRDIR = ../../..
|
||||
LIBDIR = ../../lib
|
||||
TMPDIR = /tmp
|
||||
@@ -29,9 +39,9 @@ TMPDIR = /tmp
|
||||
|
||||
-include $(VDRDIR)/Make.config
|
||||
|
||||
### The version number of VDR (taken from VDR's "config.h"):
|
||||
### The version number of VDR's plugin API (taken from VDR's "config.h"):
|
||||
|
||||
VDRVERSION = $(shell grep 'define VDRVERSION ' $(VDRDIR)/config.h | awk '{ print $$3 }' | sed -e 's/"//g')
|
||||
APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h)
|
||||
|
||||
### The name of the distribution archive:
|
||||
|
||||
@@ -40,22 +50,37 @@ PACKAGE = vdr-$(ARCHIVE)
|
||||
|
||||
### Includes and Defines (add further entries here):
|
||||
|
||||
INCLUDES += -I$(VDRDIR)/include -I$(DVBDIR)/include
|
||||
INCLUDES += -I$(VDRDIR)/include
|
||||
|
||||
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||
|
||||
ifdef FEMON_NTSC
|
||||
DEFINES += -DNTSC
|
||||
endif
|
||||
|
||||
ifdef FEMON_DEBUG
|
||||
DEFINES += -DDEBUG
|
||||
endif
|
||||
|
||||
.PHONY: all all-redirect
|
||||
all-redirect: all
|
||||
|
||||
### The object files (add further files here):
|
||||
|
||||
OBJS = femon.o femonosd.o femonreceiver.o femoncfg.o femoni18n.o
|
||||
OBJS = femon.o femonosd.o femonreceiver.o femoncfg.o femoni18n.o femontools.o
|
||||
|
||||
### The main target:
|
||||
|
||||
all: libvdr-$(PLUGIN).so
|
||||
|
||||
### Implicit rules:
|
||||
|
||||
%.o: %.c
|
||||
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
||||
|
||||
# Dependencies:
|
||||
### Dependencies:
|
||||
|
||||
MAKEDEP = g++ -MM -MG
|
||||
MAKEDEP = $(CXX) -MM -MG
|
||||
DEPFILE = .dependencies
|
||||
$(DEPFILE): Makefile
|
||||
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||
@@ -64,11 +89,12 @@ $(DEPFILE): Makefile
|
||||
|
||||
### Targets:
|
||||
|
||||
all: libvdr-$(PLUGIN).so
|
||||
|
||||
libvdr-$(PLUGIN).so: $(OBJS)
|
||||
$(CXX) $(CXXFLAGS) -shared $(OBJS) -o $@
|
||||
@cp $@ $(LIBDIR)/$@.$(VDRVERSION)
|
||||
ifndef FEMON_DEBUG
|
||||
@$(STRIP) $@
|
||||
endif
|
||||
@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
|
||||
|
||||
dist: clean
|
||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||
|
||||
115
README
115
README
@@ -1,18 +1,21 @@
|
||||
This is a DVB Frontend Status Monitor plugin for the Video Disk Recorder (VDR).
|
||||
|
||||
Written by: R o l f . A h r e n b e r g @ s c i . f i
|
||||
Written by: Rolf Ahrenberg
|
||||
< R o l f . A h r e n b e r g @ s c i . f i >
|
||||
|
||||
Project's homepage: http://www.saunalahti.fi/~rahrenbe/vdr/femon/
|
||||
|
||||
Latest version available at: http://www.saunalahti.fi/~rahrenbe/vdr/femon/
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
See the file COPYING for license information.
|
||||
|
||||
Requirements:
|
||||
|
||||
Ph.D. in Astro Physics and preferably a six-pack waiting in a fridge.
|
||||
Never trust a Klingon. "Qu'vaD lI' De'vam". Beam me up, Scotty!
|
||||
You're number six! I'm number two. YARRR!
|
||||
VDR & DVB. BMW & Ph.D.. BEER. YARRR!
|
||||
|
||||
Description:
|
||||
|
||||
@@ -20,22 +23,100 @@ DVB Frontend Status Monitor is a plugin that displays some signal information
|
||||
parameters of the current tuned channel on OSD. You can zap through all your
|
||||
channels and the plugin should be monitoring always the right frontend. The
|
||||
transponder and stream information are also available in advanced display modes.
|
||||
User can switch between different display modes by pressing 'OK' key.
|
||||
|
||||
The plugin is based on a neat console frontend status monitor application
|
||||
called 'femon' by Johannes Stezenbach (see DVB-apps/szap/femon.c for further
|
||||
information). The other parts of plugin code are borrowed from the excellent
|
||||
'OSD Picture-In-Picture' plugin by Sascha Volkenandt and Andreas Regel. The
|
||||
bitrate calculation algorithm originates from the 'dvbstream' application by
|
||||
Dave Chapman and the stream information routines from the 'libdvb' library by
|
||||
Metzler Brothers.
|
||||
information). The bitrate calculation trick originates from the 'dvbstream'
|
||||
application by Dave Chapman and the stream information routines are taken from
|
||||
the 'libdvb' library by Metzler Brothers.
|
||||
|
||||
Shortcomings / Todo list / Important Notes:
|
||||
Terminology:
|
||||
|
||||
--------------------------------------------------------------
|
||||
|## Channel Name ################### [SVDRP][AR][VF][A/DD][D]|
|
||||
|[=====Signal Strength in % ==============|=================]|
|
||||
|[=====Signal-to-Noise Ratio in % ========|=================]|
|
||||
| STR: #0000 (0%) BER: #00000000 Video: 0 Mbit/s |
|
||||
| SNR: #0000 (0%) UNC: #00000000 Audio: 0 kbit/s |
|
||||
| [LOCK] [SIGNAL] [CARRIER] [VITERBI] [SYNC] |
|
||||
--------------------------------------------------------------
|
||||
|
||||
STR - Signal strength
|
||||
SNR - Signal-to-noise ratio
|
||||
BER - Bit error rate
|
||||
UNC - Uncorrected blocks
|
||||
Video - Calculated video bitrate in Mbit/s
|
||||
Audio - Calculated audio / AC-3 bitrate in kbit/s
|
||||
|
||||
LOCK - Everything's working...
|
||||
SIGNAL - Found something above the noise level
|
||||
CARRIER - Found a DVB signal
|
||||
VITERBI - FEC (forward error correction) is stable
|
||||
SYNC - Found sync bytes
|
||||
|
||||
SVDRP - SVDRP connection active (optional)
|
||||
AR - Aspect Ratio: 1:1/4:3/16:9/2.21:1 (optional)
|
||||
VF - Video format: PAL/NTSC (optional)
|
||||
A/DD - Audio (0..N) / AC-3 track (optional)
|
||||
D - Device number: 0..N (optional)
|
||||
|
||||
Controls:
|
||||
|
||||
ChanUp/ChanDn - Switch channel up/down
|
||||
Up/Down - Switch channel up/down
|
||||
0-9 - Select channel
|
||||
Ok - Switch between display modes: basic, transponder, stream, AC-3
|
||||
Green - Select next audio track
|
||||
Yellow - Select audio channel: stereo, mono left, mono right
|
||||
Back - Exit plugin
|
||||
Left/Right - Switch to next/previous device that provides the current channel
|
||||
|
||||
Installation:
|
||||
|
||||
cd /put/your/path/here/VDR/PLUGINS/src
|
||||
tar -xzf /put/your/path/here/vdr-femon-X.Y.Z.tgz
|
||||
ln -s femon-X.Y.Z femon
|
||||
cd /put/your/path/here/VDR
|
||||
make
|
||||
make plugins
|
||||
./vdr -P femon
|
||||
|
||||
Client-server architecture:
|
||||
|
||||
The SVDRP service extension can be used in client-server configurations.
|
||||
A streamdev based VDR-to-VDR streaming client can retrieve frontend
|
||||
information from a server, if the SVDRP service has been activated and
|
||||
properly configured in femon. The svdrpservice plugin is required on the
|
||||
VDR client.
|
||||
|
||||
If the client fails to open a DVB card frontend corresponding to the
|
||||
current receiving device, it will connect to the SVDRP server, look for
|
||||
the femon plugin and tune the channel on the server to the one currently
|
||||
viewed on the client. If one of these steps fails, the femon OSD won't
|
||||
open on the client. An SVDRP icon in the femon title bar indicates that
|
||||
the data source is SVDRP. The device number in the title bar is always
|
||||
the local device number.
|
||||
|
||||
Notes:
|
||||
|
||||
- The plugin supports only those DVB cards with _one_ frontend, because I
|
||||
haven't yet figured howto do it without patching the VDR core.
|
||||
|
||||
- The plugin supports only those DVB cards with _one_ frontend (do any cards
|
||||
with multiple frontends even exist?), because I haven't yet figured howto do
|
||||
it without patching the VDR core.
|
||||
- Sometimes (read always) ttxtsubs plugin messes up the OSD - user should disable
|
||||
ttxtsubs, but closing and reopening the femon plugin might help temporarily as
|
||||
well. Btw., this same thing happens with OSDTeletext plugin too :)
|
||||
- Disable the stream analyze to speed up heavy zapping sessions.
|
||||
|
||||
- The signal strength and signal-to-noise ratio values are comparable only
|
||||
between the same brand/model frontends. Due to the lack of proper frontend
|
||||
specifications those values cannot be calculated into any real units.
|
||||
|
||||
- If the OSD isn't visible, you've configured the OSD height too big or too
|
||||
small. Please, try to adjust the variable on the setup page before writing
|
||||
any bug reports. NTSC users should use a shrinked default OSD height by
|
||||
compiling the plugin with: make FEMON_NTSC=1
|
||||
|
||||
- If the SVDRP service is used: femon won't notice if the server is tuned
|
||||
to a different channel and tuning the channel on the server might annoy
|
||||
people watching live TV. In some situations the server will refuse
|
||||
switching to the requested channel. On a headless server you can avoid
|
||||
this by installing the dummydevice plugin.
|
||||
|
||||
"Femon - A real womon who lives according to her natural feminine inclinations."
|
||||
|
||||
272
femon.c
272
femon.c
@@ -6,26 +6,58 @@
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#include <vdr/menu.h>
|
||||
#include <vdr/remote.h>
|
||||
#include "femoncfg.h"
|
||||
#include "femoni18n.h"
|
||||
#include "femonreceiver.h"
|
||||
#include "femonosd.h"
|
||||
#include "femon.h"
|
||||
#include "femonservice.h"
|
||||
#include "femontools.h"
|
||||
|
||||
#if VDRVERSNUM < 10307
|
||||
#error "You don't exist! Go away!"
|
||||
#if defined(APIVERSNUM) && APIVERSNUM < 10400
|
||||
#error "VDR-1.4.0 API version or greater is required!"
|
||||
#endif
|
||||
|
||||
cPluginFemon::cPluginFemon(void)
|
||||
static const char VERSION[] = "1.1.5";
|
||||
static const char DESCRIPTION[] = "DVB Signal Information Monitor (OSD)";
|
||||
static const char MAINMENUENTRY[] = "Signal Information";
|
||||
|
||||
class cPluginFemon : public cPlugin {
|
||||
public:
|
||||
cPluginFemon(void);
|
||||
virtual ~cPluginFemon();
|
||||
virtual const char *Version(void) { return VERSION; }
|
||||
virtual const char *Description(void) { return tr(DESCRIPTION); }
|
||||
virtual const char *CommandLineHelp(void);
|
||||
virtual bool ProcessArgs(int argc, char *argv[]);
|
||||
virtual bool Initialize(void);
|
||||
virtual bool Start(void);
|
||||
virtual void Stop(void);
|
||||
virtual void Housekeeping(void);
|
||||
virtual void MainThreadHook(void) {}
|
||||
virtual cString Active(void) { return NULL; }
|
||||
virtual const char *MainMenuEntry(void) { return (femonConfig.hidemenu ? NULL : tr(MAINMENUENTRY)); }
|
||||
virtual cOsdObject *MainMenuAction(void);
|
||||
virtual cMenuSetupPage *SetupMenu(void);
|
||||
virtual bool SetupParse(const char *Name, const char *Value);
|
||||
virtual bool Service(const char *Id, void *Data);
|
||||
virtual const char **SVDRPHelpPages(void);
|
||||
virtual cString SVDRPCommand(const char *Command, const char *Option, int &ReplyCode);
|
||||
};
|
||||
|
||||
cPluginFemon::cPluginFemon()
|
||||
{
|
||||
// Initialize any member variables here.
|
||||
// DON'T DO ANYTHING ELSE THAT MAY HAVE SIDE EFFECTS, REQUIRE GLOBAL
|
||||
// VDR OBJECTS TO EXIST OR PRODUCE ANY OUTPUT!
|
||||
Dprintf("%s()\n", __PRETTY_FUNCTION__);
|
||||
}
|
||||
|
||||
cPluginFemon::~cPluginFemon()
|
||||
{
|
||||
// Clean up after yourself!
|
||||
Dprintf("%s()\n", __PRETTY_FUNCTION__);
|
||||
}
|
||||
|
||||
const char *cPluginFemon::CommandLineHelp(void)
|
||||
@@ -53,6 +85,11 @@ bool cPluginFemon::Start(void)
|
||||
return true;
|
||||
}
|
||||
|
||||
void cPluginFemon::Stop(void)
|
||||
{
|
||||
// Stop the background activities.
|
||||
}
|
||||
|
||||
void cPluginFemon::Housekeeping(void)
|
||||
{
|
||||
// Perform any cleanup or other regular tasks.
|
||||
@@ -61,33 +98,203 @@ void cPluginFemon::Housekeeping(void)
|
||||
cOsdObject *cPluginFemon::MainMenuAction(void)
|
||||
{
|
||||
// Perform the action when selected from the main VDR menu.
|
||||
return new cFemonOsd();
|
||||
Dprintf("%s()\n", __PRETTY_FUNCTION__);
|
||||
if (cReplayControl::NowReplaying())
|
||||
Skins.Message(mtInfo, tr("Femon not available while replaying"));
|
||||
else
|
||||
return cFemonOsd::Instance(true);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bool cPluginFemon::SetupParse(const char *Name, const char *Value)
|
||||
{
|
||||
// Parse your own setup parameters and store their values.
|
||||
if (!strcasecmp(Name, "HideMenu")) femonConfig.hidemenu = atoi(Value);
|
||||
else if (!strcasecmp(Name, "SyslogOutput")) femonConfig.syslogoutput = atoi(Value);
|
||||
else if (!strcasecmp(Name, "DisplayMode")) femonConfig.displaymode = atoi(Value);
|
||||
else if (!strcasecmp(Name, "Position")) femonConfig.position = atoi(Value);
|
||||
else if (!strcasecmp(Name, "OSDHeight")) femonConfig.osdheight = atoi(Value);
|
||||
else if (!strcasecmp(Name, "OSDOffset")) femonConfig.osdoffset = atoi(Value);
|
||||
else if (!strcasecmp(Name, "Skin")) femonConfig.skin = atoi(Value);
|
||||
else if (!strcasecmp(Name, "Theme")) femonConfig.theme = atoi(Value);
|
||||
else if (!strcasecmp(Name, "ShowCASystem")) femonConfig.showcasystem = atoi(Value);
|
||||
else if (!strcasecmp(Name, "RedLimit")) femonConfig.redlimit = atoi(Value);
|
||||
else if (!strcasecmp(Name, "GreenLimit")) femonConfig.greenlimit = atoi(Value);
|
||||
else if (!strcasecmp(Name, "UpdateInterval")) femonConfig.updateinterval = atoi(Value);
|
||||
else if (!strcasecmp(Name, "AnalStream")) femonConfig.analyzestream = atoi(Value);
|
||||
else if (!strcasecmp(Name, "CalcInterval")) femonConfig.calcinterval = atoi(Value);
|
||||
else if (!strcasecmp(Name, "UseSvdrp")) femonConfig.usesvdrp = atoi(Value);
|
||||
else if (!strcasecmp(Name, "ServerPort")) femonConfig.svdrpport = atoi(Value);
|
||||
else if (!strcasecmp(Name, "ServerIp")) strn0cpy(femonConfig.svdrpip, Value, sizeof(femonConfig.svdrpip));
|
||||
else
|
||||
return false;
|
||||
if (femonConfig.displaymode < 0 || femonConfig.displaymode >= modeMaxNumber) femonConfig.displaymode = 0;
|
||||
if (femonConfig.displaymode < 0 || femonConfig.displaymode >= eFemonModeMaxNumber) femonConfig.displaymode = 0;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool cPluginFemon::Service(const char *Id, void *Data)
|
||||
{
|
||||
if ((strcmp(Id,"FemonService-v1.0") == 0) && Data) {
|
||||
FemonService_v1_0 *data = (FemonService_v1_0*)Data;
|
||||
int ndx = cDevice::ActualDevice()->CardIndex();
|
||||
data->fe_name = getFrontendName(ndx);
|
||||
data->fe_status = getFrontendStatus(ndx);
|
||||
data->fe_snr = getSNR(ndx);
|
||||
data->fe_signal = getSignal(ndx);
|
||||
data->fe_ber = getBER(ndx);
|
||||
data->fe_unc = getUNC(ndx);
|
||||
data->video_bitrate = cFemonOsd::Instance() ? cFemonOsd::Instance()->GetVideoBitrate() : 0.0;
|
||||
data->audio_bitrate = cFemonOsd::Instance() ? cFemonOsd::Instance()->GetAudioBitrate() : 0.0;
|
||||
data->dolby_bitrate = cFemonOsd::Instance() ? cFemonOsd::Instance()->GetDolbyBitrate() : 0.0;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
const char **cPluginFemon::SVDRPHelpPages(void)
|
||||
{
|
||||
static const char *HelpPages[] = {
|
||||
"OPEN\n"
|
||||
" Open femon plugin.",
|
||||
"QUIT\n"
|
||||
" Close femon plugin.",
|
||||
"NEXT\n"
|
||||
" Switch to next possible device.",
|
||||
"PREV\n"
|
||||
" Switch to previous possible device.",
|
||||
"INFO\n"
|
||||
" Print the current frontend information.",
|
||||
"NAME\n"
|
||||
" Print the current frontend name.",
|
||||
"STAT\n"
|
||||
" Print the current frontend status.",
|
||||
"SGNL\n"
|
||||
" Print the current signal strength.",
|
||||
"SNRA\n"
|
||||
" Print the current signal-to-noise ratio.",
|
||||
"BERA\n"
|
||||
" Print the current bit error rate.",
|
||||
"UNCB\n"
|
||||
" Print the current uncorrected blocks rate.",
|
||||
"VIBR\n"
|
||||
" Print the actual device and current video bitrate [Mbit/s].",
|
||||
"AUBR\n"
|
||||
" Print the actual device and current audio bitrate [kbit/s].",
|
||||
"DDBR\n"
|
||||
" Print the actual device and current dolby bitrate [kbit/s].",
|
||||
NULL
|
||||
};
|
||||
return HelpPages;
|
||||
}
|
||||
|
||||
cString cPluginFemon::SVDRPCommand(const char *Command, const char *Option, int &ReplyCode)
|
||||
{
|
||||
if (strcasecmp(Command, "OPEN") == 0) {
|
||||
if (cReplayControl::NowReplaying()) {
|
||||
ReplyCode = 550; // Requested action not taken
|
||||
return cString("Cannot open femon plugin while replaying");
|
||||
}
|
||||
if (!cFemonOsd::Instance())
|
||||
cRemote::CallPlugin("femon");
|
||||
return cString("Opening femon plugin");
|
||||
}
|
||||
else if (strcasecmp(Command, "QUIT") == 0) {
|
||||
if (cFemonOsd::Instance())
|
||||
cRemote::Put(kBack);
|
||||
return cString("Closing femon plugin");
|
||||
}
|
||||
else if (strcasecmp(Command, "NEXT") == 0) {
|
||||
if (cFemonOsd::Instance())
|
||||
return cString::sprintf("Switching to next device: %s", cFemonOsd::Instance()->DeviceSwitch(1) ? "ok" : "failed");
|
||||
else
|
||||
return cString("Cannot switch device");
|
||||
}
|
||||
else if (strcasecmp(Command, "PREV") == 0) {
|
||||
if (cFemonOsd::Instance())
|
||||
return cString::sprintf("Switching to previous device: %s", cFemonOsd::Instance()->DeviceSwitch(-1) ? "ok" : "failed");
|
||||
else
|
||||
return cString("Cannot switch device");
|
||||
}
|
||||
else if (strcasecmp(Command, "INFO") == 0) {
|
||||
return getFrontendInfo(cDevice::ActualDevice()->CardIndex());
|
||||
}
|
||||
else if (strcasecmp(Command, "NAME") == 0) {
|
||||
return getFrontendName(cDevice::ActualDevice()->CardIndex());
|
||||
}
|
||||
else if (strcasecmp(Command, "STAT") == 0) {
|
||||
return getFrontendStatus(cDevice::ActualDevice()->CardIndex());
|
||||
}
|
||||
else if (strcasecmp(Command, "SGNL") == 0) {
|
||||
int value = getSignal(cDevice::ActualDevice()->CardIndex());
|
||||
return cString::sprintf("%04X (%02d%%) on device #%d", value, value / 655, cDevice::ActualDevice()->CardIndex());
|
||||
}
|
||||
else if (strcasecmp(Command, "SNRA") == 0) {
|
||||
int value = getSNR(cDevice::ActualDevice()->CardIndex());
|
||||
return cString::sprintf("%04X (%02d%%) on device #%d", value, value / 655, cDevice::ActualDevice()->CardIndex());
|
||||
}
|
||||
else if (strcasecmp(Command, "BERA") == 0) {
|
||||
return cString::sprintf("%08X on device #%d", getBER(cDevice::ActualDevice()->CardIndex()), cDevice::ActualDevice()->CardIndex());
|
||||
}
|
||||
else if (strcasecmp(Command, "UNCB") == 0) {
|
||||
return cString::sprintf("%08X on device #%d", getUNC(cDevice::ActualDevice()->CardIndex()), cDevice::ActualDevice()->CardIndex());
|
||||
}
|
||||
else if (strcasecmp(Command, "VIBR") == 0) {
|
||||
if (cFemonOsd::Instance())
|
||||
return cString::sprintf("%s on device #%d", *getBitrateMbits(cFemonOsd::Instance()->GetVideoBitrate()), cDevice::ActualDevice()->CardIndex());
|
||||
else
|
||||
return cString::sprintf("--- Mbit/s on device #%d", cDevice::ActualDevice()->CardIndex());
|
||||
}
|
||||
else if (strcasecmp(Command, "AUBR") == 0) {
|
||||
if (cFemonOsd::Instance())
|
||||
return cString::sprintf("%s on device #%d", *getBitrateKbits(cFemonOsd::Instance()->GetAudioBitrate()), cDevice::ActualDevice()->CardIndex());
|
||||
else
|
||||
return cString::sprintf("--- kbit/s on device #%d", cDevice::ActualDevice()->CardIndex());
|
||||
}
|
||||
else if (strcasecmp(Command, "DDBR") == 0) {
|
||||
if (cFemonOsd::Instance())
|
||||
return cString::sprintf("%s on device #%d", *getBitrateKbits(cFemonOsd::Instance()->GetDolbyBitrate()), cDevice::ActualDevice()->CardIndex());
|
||||
else
|
||||
return cString::sprintf("--- kbit/s on device #%d", cDevice::ActualDevice()->CardIndex());
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
class cMenuFemonSetup : public cMenuSetupPage {
|
||||
private:
|
||||
const char *dispmodes[eFemonModeMaxNumber];
|
||||
const char *skins[eFemonSkinMaxNumber];
|
||||
const char *themes[eFemonThemeMaxNumber];
|
||||
cFemonConfig data;
|
||||
virtual void Setup(void);
|
||||
protected:
|
||||
virtual eOSState ProcessKey(eKeys Key);
|
||||
virtual void Store(void);
|
||||
public:
|
||||
cMenuFemonSetup(void);
|
||||
};
|
||||
|
||||
cMenuFemonSetup::cMenuFemonSetup(void)
|
||||
{
|
||||
dispmodes[0] = tr("basic");
|
||||
dispmodes[1] = tr("transponder");
|
||||
dispmodes[2] = tr("stream");
|
||||
Dprintf("%s()\n", __PRETTY_FUNCTION__);
|
||||
dispmodes[eFemonModeBasic] = tr("basic");
|
||||
dispmodes[eFemonModeTransponder] = tr("transponder");
|
||||
dispmodes[eFemonModeStream] = tr("stream");
|
||||
dispmodes[eFemonModeAC3] = tr("AC-3");
|
||||
|
||||
skins[eFemonSkinClassic] = tr("Classic");
|
||||
skins[eFemonSkinElchi] = tr("Elchi");
|
||||
|
||||
themes[eFemonThemeClassic] = tr("Classic");
|
||||
themes[eFemonThemeElchi] = tr("Elchi");
|
||||
themes[eFemonThemeDeepBlue] = tr("DeepBlue");
|
||||
themes[eFemonThemeMoronimo] = tr("Moronimo");
|
||||
themes[eFemonThemeEnigma] = tr("Enigma");
|
||||
themes[eFemonThemeEgalsTry] = tr("EgalsTry");
|
||||
themes[eFemonThemeDuotone] = tr("Duotone");
|
||||
themes[eFemonThemeSilverGreen] = tr("SilverGreen");
|
||||
|
||||
data = femonConfig;
|
||||
Setup();
|
||||
}
|
||||
|
||||
@@ -96,16 +303,25 @@ void cMenuFemonSetup::Setup(void)
|
||||
int current = Current();
|
||||
|
||||
Clear();
|
||||
Add(new cMenuEditBoolItem( tr("Hide Mainmenu Entry"), &femonConfig.hidemenu, tr("no"), tr("yes")));
|
||||
Add(new cMenuEditBoolItem( tr("Use Syslog Output"), &femonConfig.syslogoutput, tr("no"), tr("yes")));
|
||||
Add(new cMenuEditStraItem( tr("Default Display Mode"), &femonConfig.displaymode, modeMaxNumber, dispmodes));
|
||||
Add(new cMenuEditBoolItem( tr("Position"), &femonConfig.position, tr("bottom"), tr("top")));
|
||||
Add(new cMenuEditIntItem( tr("Red Limit [%]"), &femonConfig.redlimit, 1, 50));
|
||||
Add(new cMenuEditIntItem( tr("Green Limit [%]"), &femonConfig.greenlimit, 51, 100));
|
||||
Add(new cMenuEditIntItem( tr("OSD Update Interval [0.1s]"), &femonConfig.updateinterval, 1, 100));
|
||||
Add(new cMenuEditBoolItem( tr("Analyze Stream"), &femonConfig.analyzestream, tr("no"), tr("yes")));
|
||||
Add(new cMenuEditBoolItem( tr("Hide main menu entry"), &data.hidemenu, tr("no"), tr("yes")));
|
||||
Add(new cMenuEditStraItem( tr("Default display mode"), &data.displaymode, eFemonModeMaxNumber, dispmodes));
|
||||
Add(new cMenuEditStraItem( tr("Skin"), &data.skin, eFemonSkinMaxNumber, skins));
|
||||
Add(new cMenuEditStraItem( tr("Theme"), &data.theme, eFemonThemeMaxNumber,themes));
|
||||
Add(new cMenuEditBoolItem( tr("Position"), &data.position, tr("bottom"), tr("top")));
|
||||
Add(new cMenuEditIntItem( tr("Height"), &data.osdheight, 400, 500));
|
||||
Add(new cMenuEditIntItem( tr("Horizontal offset"), &data.osdoffset, -50, 50));
|
||||
Add(new cMenuEditBoolItem( tr("Show CA system"), &data.showcasystem, tr("no"), tr("yes")));
|
||||
Add(new cMenuEditIntItem( tr("Red limit [%]"), &data.redlimit, 1, 50));
|
||||
Add(new cMenuEditIntItem( tr("Green limit [%]"), &data.greenlimit, 51, 100));
|
||||
Add(new cMenuEditIntItem( tr("OSD update interval [0.1s]"), &data.updateinterval, 1, 100));
|
||||
Add(new cMenuEditBoolItem( tr("Analyze stream"), &data.analyzestream, tr("no"), tr("yes")));
|
||||
if (femonConfig.analyzestream)
|
||||
Add(new cMenuEditIntItem(tr("Calculation Interval [0.1s]"), &femonConfig.calcinterval, 1, 100));
|
||||
Add(new cMenuEditIntItem(tr("Calculation interval [0.1s]"), &data.calcinterval, 1, 100));
|
||||
Add(new cMenuEditBoolItem( tr("Use SVDRP service"), &data.usesvdrp));
|
||||
if (data.usesvdrp) {
|
||||
Add(new cMenuEditIntItem(tr("SVDRP service port"), &data.svdrpport, 1, 65535));
|
||||
Add(new cMenuEditStrItem(tr("SVDRP service IP"), data.svdrpip, MaxSvdrpIp, ".1234567890"));
|
||||
}
|
||||
|
||||
SetCurrent(Get(current));
|
||||
Display();
|
||||
@@ -113,24 +329,34 @@ void cMenuFemonSetup::Setup(void)
|
||||
|
||||
void cMenuFemonSetup::Store(void)
|
||||
{
|
||||
Dprintf("%s()\n", __PRETTY_FUNCTION__);
|
||||
femonConfig = data;
|
||||
SetupStore("HideMenu", femonConfig.hidemenu);
|
||||
SetupStore("SyslogOutput", femonConfig.syslogoutput);
|
||||
SetupStore("Position", femonConfig.position);
|
||||
SetupStore("DisplayMode", femonConfig.displaymode);
|
||||
SetupStore("Skin", femonConfig.skin);
|
||||
SetupStore("Theme", femonConfig.theme);
|
||||
SetupStore("Position", femonConfig.position);
|
||||
SetupStore("OSDHeight", femonConfig.osdheight);
|
||||
SetupStore("OSDOffset", femonConfig.osdoffset);
|
||||
SetupStore("ShowCASystem", femonConfig.showcasystem);
|
||||
SetupStore("RedLimit", femonConfig.redlimit);
|
||||
SetupStore("GreenLimit", femonConfig.greenlimit);
|
||||
SetupStore("UpdateInterval", femonConfig.updateinterval);
|
||||
SetupStore("AnalStream", femonConfig.analyzestream);
|
||||
SetupStore("CalcInterval", femonConfig.calcinterval);
|
||||
SetupStore("UseSvdrp", femonConfig.usesvdrp);
|
||||
SetupStore("ServerPort", femonConfig.svdrpport);
|
||||
SetupStore("ServerIp", femonConfig.svdrpip);
|
||||
}
|
||||
|
||||
eOSState cMenuFemonSetup::ProcessKey(eKeys Key)
|
||||
{
|
||||
int oldAnalyzestream = femonConfig.analyzestream;
|
||||
int oldUsesvdrp = data.usesvdrp;
|
||||
int oldAnalyzestream = data.analyzestream;
|
||||
|
||||
eOSState state = cMenuSetupPage::ProcessKey(Key);
|
||||
|
||||
if (Key != kNone && (femonConfig.analyzestream != oldAnalyzestream)) {
|
||||
if (Key != kNone && (data.analyzestream != oldAnalyzestream || data.usesvdrp != oldUsesvdrp)) {
|
||||
Setup();
|
||||
}
|
||||
|
||||
|
||||
49
femon.h
49
femon.h
@@ -1,49 +0,0 @@
|
||||
/*
|
||||
* Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#ifndef __FEMON_H
|
||||
#define __FEMON_H
|
||||
|
||||
#include <vdr/plugin.h>
|
||||
|
||||
static const char *VERSION = "0.1.2";
|
||||
static const char *DESCRIPTION = "DVB Signal Information Monitor (OSD)";
|
||||
static const char *MAINMENUENTRY = "Signal Information";
|
||||
|
||||
class cPluginFemon : public cPlugin {
|
||||
private:
|
||||
// Add any member variables or functions you may need here.
|
||||
public:
|
||||
cPluginFemon(void);
|
||||
virtual ~cPluginFemon();
|
||||
virtual const char *Version(void) { return VERSION; }
|
||||
virtual const char *Description(void) { return tr(DESCRIPTION); }
|
||||
virtual const char *CommandLineHelp(void);
|
||||
virtual bool ProcessArgs(int argc, char *argv[]);
|
||||
virtual bool Initialize(void);
|
||||
virtual bool Start(void);
|
||||
virtual void Housekeeping(void);
|
||||
virtual const char *MainMenuEntry(void) { return (femonConfig.hidemenu ? NULL : tr(MAINMENUENTRY)); }
|
||||
virtual cOsdObject *MainMenuAction(void);
|
||||
virtual cMenuSetupPage *SetupMenu(void);
|
||||
virtual bool SetupParse(const char *Name, const char *Value);
|
||||
};
|
||||
|
||||
class cMenuFemonSetup : public cMenuSetupPage {
|
||||
private:
|
||||
const char *dispmodes[modeMaxNumber];
|
||||
virtual void Setup(void);
|
||||
protected:
|
||||
virtual eOSState ProcessKey(eKeys Key);
|
||||
virtual void Store(void);
|
||||
public:
|
||||
cMenuFemonSetup(void);
|
||||
};
|
||||
|
||||
#endif //__FEMON_H
|
||||
|
||||
114
femoncfg.c
114
femoncfg.c
@@ -6,6 +6,7 @@
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include "femoncfg.h"
|
||||
|
||||
cFemonConfig femonConfig;
|
||||
@@ -14,11 +15,122 @@ cFemonConfig::cFemonConfig(void)
|
||||
{
|
||||
hidemenu = 0;
|
||||
displaymode = 0;
|
||||
skin = 0;
|
||||
theme = 0;
|
||||
position = 1;
|
||||
redlimit = 33;
|
||||
greenlimit = 66;
|
||||
updateinterval = 5;
|
||||
analyzestream = 1;
|
||||
calcinterval = 20;
|
||||
syslogoutput = 0;
|
||||
showcasystem = 0;
|
||||
#ifdef NTSC
|
||||
osdheight = 420;
|
||||
#else
|
||||
osdheight = 480;
|
||||
#endif
|
||||
osdoffset = 0;
|
||||
usesvdrp = 0;
|
||||
svdrpport = 2001;
|
||||
strncpy(svdrpip, "0.0.0.0", sizeof(svdrpip));
|
||||
}
|
||||
|
||||
const cFemonTheme femonTheme[eFemonThemeMaxNumber] =
|
||||
{
|
||||
{
|
||||
// eFemonThemeClassic
|
||||
4, // bpp
|
||||
0x7F000000, // clrBackground
|
||||
0xFFFCFCFC, // clrTitleBackground
|
||||
0xFF000000, // clrTitleText
|
||||
0xFFFCC024, // clrActiveText
|
||||
0xFFFCFCFC, // clrInactiveText
|
||||
0xFFFC1414, // clrRed
|
||||
0xFFFCC024, // clrYellow
|
||||
0xFF24FC24, // clrGreen
|
||||
},
|
||||
{
|
||||
// eFemonThemeElchi
|
||||
4, // bpp
|
||||
0xC8000066, // clrBackground
|
||||
0xC833AAEE, // clrTitleBackground
|
||||
0xFF000000, // clrTitleText
|
||||
0xFFCCBB22, // clrActiveText
|
||||
0xFFFFFFFF, // clrInactiveText
|
||||
0xFFFF0000, // clrRed
|
||||
0xFFFFEE00, // clrYellow
|
||||
0xFF33CC33, // clrGreen
|
||||
},
|
||||
{
|
||||
// eFemonThemeDeepBlue
|
||||
4, // bpp
|
||||
0xC80C0C0C, // clrBackground
|
||||
0xC832557A, // clrTitleBackground
|
||||
0xFF000000, // clrTitleText
|
||||
0xFFCE7B00, // clrActiveText
|
||||
0xFF9A9A9A, // clrInactiveText
|
||||
0xFF992900, // clrRed
|
||||
0xFFCE7B00, // clrYellow
|
||||
0xFF336600, // clrGreen
|
||||
},
|
||||
{
|
||||
// eFemonThemeMoronimo
|
||||
4, // bpp
|
||||
0xDF294A6B, // clrBackground
|
||||
0xDF3E5578, // clrTitleBackground
|
||||
0xFF9BBAD7, // clrTitleText
|
||||
0xFFCE7B00, // clrActiveText
|
||||
0xFF9A9A9A, // clrInactiveText
|
||||
0xFF992900, // clrRed
|
||||
0xFFCE7B00, // clrYellow
|
||||
0xFF336600, // clrGreen
|
||||
},
|
||||
{
|
||||
// eFemonThemeEnigma
|
||||
4, // bpp
|
||||
0xB8DEE5FA, // clrBackground
|
||||
0xB84158BC, // clrTitleBackground
|
||||
0xFFFFFFFF, // clrTitleText
|
||||
0xFF000000, // clrActiveText
|
||||
0xFF000000, // clrInactiveText
|
||||
0xB8C40000, // clrRed
|
||||
0xB8C4C400, // clrYellow
|
||||
0xB800C400, // clrGreen
|
||||
},
|
||||
{
|
||||
// eFemonThemeEgalsTry
|
||||
4, // bpp
|
||||
0xCA2B1B9E, // clrBackground
|
||||
0xDFBEBAC3, // clrTitleBackground
|
||||
0xFF280249, // clrTitleText
|
||||
0xFFD4D7DB, // clrActiveText
|
||||
0xDFCFCFCF, // clrInactiveText
|
||||
0xFFFF0000, // clrRed
|
||||
0xFFFCC024, // clrYellow
|
||||
0xFF20980B, // clrGreen
|
||||
},
|
||||
{
|
||||
// eFemonThemeDuotone
|
||||
2, // bpp
|
||||
0x7F000000, // clrBackground
|
||||
0xFFFCFCFC, // clrTitleBackground
|
||||
0x7F000000, // clrTitleText
|
||||
0xFFFCFCFC, // clrActiveText
|
||||
0xFFFCFCFC, // clrInactiveText
|
||||
0xFFFC1414, // clrRed
|
||||
0xFFFCFCFC, // clrYellow
|
||||
0xFFFCFCFC, // clrGreen
|
||||
},
|
||||
{
|
||||
// eFemonThemeSilverGreen
|
||||
4, // bpp
|
||||
0xD9526470, // clrBackground
|
||||
0xD9293841, // clrTitleBackground
|
||||
0xFFB3BDCA, // clrTitleText
|
||||
0xFFCE7B00, // clrActiveText
|
||||
0xFFB3BDCA, // clrInactiveText
|
||||
0xFF992900, // clrRed
|
||||
0xFFCE7B00, // clrYellow
|
||||
0xFF336600, // clrGreen
|
||||
},
|
||||
};
|
||||
|
||||
60
femoncfg.h
60
femoncfg.h
@@ -9,12 +9,16 @@
|
||||
#ifndef __FEMONCFG_H
|
||||
#define __FEMONCFG_H
|
||||
|
||||
enum dispModes {
|
||||
modeBasic,
|
||||
modeTransponder,
|
||||
modeStream,
|
||||
modeMaxNumber
|
||||
};
|
||||
#define MaxSvdrpIp 15 // xxx.xxx.xxx.xxx
|
||||
|
||||
enum eFemonModes
|
||||
{
|
||||
eFemonModeBasic,
|
||||
eFemonModeTransponder,
|
||||
eFemonModeStream,
|
||||
eFemonModeAC3,
|
||||
eFemonModeMaxNumber
|
||||
};
|
||||
|
||||
struct cFemonConfig
|
||||
{
|
||||
@@ -22,15 +26,57 @@ public:
|
||||
cFemonConfig(void);
|
||||
int hidemenu;
|
||||
int displaymode;
|
||||
int skin;
|
||||
int theme;
|
||||
int position;
|
||||
int redlimit;
|
||||
int greenlimit;
|
||||
int updateinterval;
|
||||
int analyzestream;
|
||||
int calcinterval;
|
||||
int syslogoutput;
|
||||
int showcasystem;
|
||||
int osdheight;
|
||||
int osdoffset;
|
||||
int usesvdrp;
|
||||
int svdrpport;
|
||||
char svdrpip[MaxSvdrpIp + 1]; // must end with additional null
|
||||
};
|
||||
|
||||
extern cFemonConfig femonConfig;
|
||||
|
||||
enum eFemonSkins
|
||||
{
|
||||
eFemonSkinClassic,
|
||||
eFemonSkinElchi,
|
||||
eFemonSkinMaxNumber
|
||||
};
|
||||
|
||||
enum eFemonThemes
|
||||
{
|
||||
eFemonThemeClassic,
|
||||
eFemonThemeElchi,
|
||||
eFemonThemeDeepBlue,
|
||||
eFemonThemeMoronimo,
|
||||
eFemonThemeEnigma,
|
||||
eFemonThemeEgalsTry,
|
||||
eFemonThemeDuotone,
|
||||
eFemonThemeSilverGreen,
|
||||
eFemonThemeMaxNumber
|
||||
};
|
||||
|
||||
struct cFemonTheme
|
||||
{
|
||||
int bpp;
|
||||
int clrBackground;
|
||||
int clrTitleBackground;
|
||||
int clrTitleText;
|
||||
int clrActiveText;
|
||||
int clrInactiveText;
|
||||
int clrRed;
|
||||
int clrYellow;
|
||||
int clrGreen;
|
||||
};
|
||||
|
||||
extern const cFemonTheme femonTheme[eFemonThemeMaxNumber];
|
||||
|
||||
#endif // __FEMONCFG_H
|
||||
|
||||
BIN
femonclient/vdr-femonclient-0.0.2.tgz
Normal file
BIN
femonclient/vdr-femonclient-0.0.2.tgz
Normal file
Binary file not shown.
1868
femoni18n.c
1868
femoni18n.c
File diff suppressed because it is too large
Load Diff
1115
femonosd.c
1115
femonosd.c
File diff suppressed because it is too large
Load Diff
35
femonosd.h
35
femonosd.h
@@ -15,18 +15,29 @@
|
||||
#include <vdr/osd.h>
|
||||
#include <vdr/thread.h>
|
||||
#include <vdr/status.h>
|
||||
#include <vdr/plugin.h>
|
||||
#include <vdr/channels.h>
|
||||
#include <vdr/transfer.h>
|
||||
#include <vdr/tools.h>
|
||||
#include "svdrpservice.h"
|
||||
|
||||
#define MAX_BM_NUMBER 5
|
||||
|
||||
class cFemonOsd : public cOsdObject, public cThread, public cStatus {
|
||||
private:
|
||||
bool m_Active;
|
||||
enum { MAX_BMNUMBERS = 6 };
|
||||
static cFemonOsd *pInstance;
|
||||
cOsd *m_Osd;
|
||||
cFemonReceiver *m_Receiver;
|
||||
int m_Frontend;
|
||||
int m_SvdrpFrontend;
|
||||
double m_SvdrpVideoBitrate;
|
||||
double m_SvdrpAudioBitrate;
|
||||
SvdrpConnection_v1_0 m_SvdrpConnection;
|
||||
cPlugin *m_SvdrpPlugin;
|
||||
struct dvb_frontend_info m_FrontendInfo;
|
||||
int m_Number;
|
||||
int m_OldNumber;
|
||||
int m_InputTime;
|
||||
uint16_t m_SNR;
|
||||
uint16_t m_Signal;
|
||||
uint32_t m_BER;
|
||||
@@ -34,21 +45,37 @@ private:
|
||||
fe_status_t m_FrontendStatus;
|
||||
int m_DisplayMode;
|
||||
const cFont *m_Font;
|
||||
cTimeMs m_InputTime;
|
||||
cMutex* m_Mutex;
|
||||
static cBitmap bmPAL, bmNTSC, bmAspectRatio_1_1, bmAspectRatio_16_9, bmAspectRatio_2_21_1, bmAspectRatio_4_3;
|
||||
static cBitmap bmStereo, bmMonoLeft, bmMonoRight, bmDD, bmDD20, bmDD51;
|
||||
static cBitmap bmNumbers[MAX_BMNUMBERS];
|
||||
static cBitmap bmDevice, bmPAL, bmNTSC, bmSVDRP;
|
||||
static cBitmap bmAspectRatio_1_1, bmAspectRatio_16_9, bmAspectRatio_2_21_1, bmAspectRatio_4_3;
|
||||
static cBitmap bmLock, bmSignal, bmCarrier, bmViterbi, bmSync;
|
||||
void DrawStatusWindow(void);
|
||||
void DrawInfoWindow(void);
|
||||
bool SvdrpConnect(void);
|
||||
bool SvdrpTune(void);
|
||||
|
||||
protected:
|
||||
cFemonOsd();
|
||||
cFemonOsd(const cFemonOsd&);
|
||||
cFemonOsd& operator= (const cFemonOsd&);
|
||||
virtual void Action(void);
|
||||
virtual void ChannelSwitch(const cDevice * device, int channelNumber);
|
||||
virtual void SetAudioTrack(int Index, const char * const *Tracks);
|
||||
|
||||
public:
|
||||
cFemonOsd(void);
|
||||
static cFemonOsd *Instance(bool create = false);
|
||||
~cFemonOsd();
|
||||
|
||||
virtual void Show(void);
|
||||
virtual eOSState ProcessKey(eKeys Key);
|
||||
|
||||
bool DeviceSwitch(int direction);
|
||||
double GetVideoBitrate(void);
|
||||
double GetAudioBitrate(void);
|
||||
double GetDolbyBitrate(void);
|
||||
};
|
||||
|
||||
#endif //__FEMONOSD_H
|
||||
|
||||
237
femonreceiver.c
237
femonreceiver.c
@@ -7,6 +7,7 @@
|
||||
*/
|
||||
|
||||
#include <unistd.h>
|
||||
#include "femontools.h"
|
||||
#include "femoncfg.h"
|
||||
#include "femonreceiver.h"
|
||||
|
||||
@@ -16,13 +17,18 @@
|
||||
#define PAYLOAD 0x10
|
||||
#define PTS_DTS_FLAGS 0xC0
|
||||
|
||||
cFemonReceiver::cFemonReceiver(int Ca, int Vpid, int Apid)
|
||||
:cReceiver(Ca, -1, 2, Vpid, Apid), cThread("femon receiver")
|
||||
cFemonReceiver::cFemonReceiver(tChannelID ChannelID, int Ca, int Vpid, int Apid[], int Dpid[])
|
||||
#if defined(APIVERSNUM) && APIVERSNUM < 10500
|
||||
:cReceiver(Ca, -1, Vpid, Apid, Dpid, NULL), cThread("femon receiver")
|
||||
#else
|
||||
:cReceiver(ChannelID, -1, Vpid, Apid, Dpid, NULL), cThread("femon receiver")
|
||||
#endif
|
||||
{
|
||||
//printf("cFemonReceiver::cFemonReceiver()\n");
|
||||
m_Active = false;
|
||||
Dprintf("%s()\n", __PRETTY_FUNCTION__);
|
||||
m_VideoPid = Vpid;
|
||||
m_AudioPid = Apid;
|
||||
m_AudioPid = Apid[0];
|
||||
m_AC3Pid = Dpid[0];
|
||||
m_VideoValid = false;
|
||||
m_VideoPacketCount = 0;
|
||||
m_VideoHorizontalSize = 0;
|
||||
m_VideoVerticalSize = 0;
|
||||
@@ -31,47 +37,58 @@ cFemonReceiver::cFemonReceiver(int Ca, int Vpid, int Apid)
|
||||
m_VideoFrameRate = 0.0;
|
||||
m_VideoStreamBitrate = 0.0;
|
||||
m_VideoBitrate = 0.0;
|
||||
m_AudioValid = false;
|
||||
m_AudioPacketCount = 0;
|
||||
m_AudioStreamBitrate = -2.0;
|
||||
m_AudioBitrate = 0.0;
|
||||
m_AudioSamplingFreq = -1;
|
||||
m_AudioMPEGLayer = 0;
|
||||
m_AudioBitrate = 0.0;
|
||||
|
||||
m_AC3Valid = false;
|
||||
m_AC3PacketCount = 0;
|
||||
m_AC3StreamBitrate = 0;
|
||||
m_AC3SamplingFreq = 0;
|
||||
m_AC3Bitrate = 0;
|
||||
m_AC3FrameSize = 0;
|
||||
m_AC3BitStreamMode = FR_NOTVALID;
|
||||
m_AC3AudioCodingMode = FR_NOTVALID;
|
||||
m_AC3CenterMixLevel = FR_NOTVALID;
|
||||
m_AC3SurroundMixLevel = FR_NOTVALID;
|
||||
m_AC3DolbySurroundMode = FR_NOTVALID;
|
||||
m_AC3LfeOn = false;
|
||||
m_AC3DialogLevel = FR_NOTVALID;
|
||||
}
|
||||
|
||||
cFemonReceiver::~cFemonReceiver(void)
|
||||
{
|
||||
//printf("cFemonReceiver::~cFemonReceiver()\n");
|
||||
if (m_Active) {
|
||||
m_Active = false;
|
||||
Cancel(0);
|
||||
}
|
||||
Dprintf("%s()\n", __PRETTY_FUNCTION__);
|
||||
if (Running())
|
||||
Cancel(3);
|
||||
Detach();
|
||||
}
|
||||
|
||||
/* the following function originates from libdvbmpeg: */
|
||||
/* The following function originates from libdvbmpeg: */
|
||||
void cFemonReceiver::GetVideoInfo(uint8_t *mbuf, int count)
|
||||
{
|
||||
//printf("cFemonReceiver::GetVideoInfo()\n");
|
||||
uint8_t *headr;
|
||||
int found = 0;
|
||||
int c = 0;
|
||||
while (found < 4 && c + 4 < count) {
|
||||
//m_VideoValid = false;
|
||||
while ((found < 4) && ((c + 4) < count)) {
|
||||
uint8_t *b;
|
||||
b = mbuf + c;
|
||||
if (b[0] == 0x00 && b[1] == 0x00 && b[2] == 0x01 && b[3] == 0xb3)
|
||||
if ((b[0] == 0x00) && (b[1] == 0x00) && (b[2] == 0x01) && (b[3] == 0xb3))
|
||||
found = 4;
|
||||
else
|
||||
c++;
|
||||
}
|
||||
if (!found) return;
|
||||
c += 4;
|
||||
if (c + 12 >= count) return;
|
||||
headr = mbuf + c;
|
||||
m_VideoHorizontalSize = ((headr[1] &0xF0) >> 4) | (headr[0] << 4);
|
||||
m_VideoVerticalSize = ((headr[1] &0x0F) << 8) | (headr[2]);
|
||||
if ((!found) || ((c + 16) >= count)) return;
|
||||
m_VideoValid = true;
|
||||
headr = mbuf + c + 4;
|
||||
m_VideoHorizontalSize = ((headr[1] & 0xF0) >> 4) | (headr[0] << 4);
|
||||
m_VideoVerticalSize = ((headr[1] & 0x0F) << 8) | (headr[2]);
|
||||
int sw = (int)((headr[3] & 0xF0) >> 4);
|
||||
switch( sw ){
|
||||
switch ( sw ){
|
||||
case 1:
|
||||
m_VideoAspectRatio = AR_1_1;
|
||||
break;
|
||||
@@ -85,15 +102,14 @@ void cFemonReceiver::GetVideoInfo(uint8_t *mbuf, int count)
|
||||
m_VideoAspectRatio = AR_2_21_1;
|
||||
break;
|
||||
case 5 ... 15:
|
||||
default:
|
||||
m_VideoAspectRatio = AR_RESERVED;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
sw = (int)(headr[3] & 0x0F);
|
||||
switch ( sw ) {
|
||||
case 1:
|
||||
m_VideoFrameRate = 24000/1001.0;
|
||||
m_VideoFrameRate = 24000 / 1001.0;
|
||||
m_VideoFormat = VF_UNKNOWN;
|
||||
break;
|
||||
case 2:
|
||||
@@ -105,7 +121,7 @@ void cFemonReceiver::GetVideoInfo(uint8_t *mbuf, int count)
|
||||
m_VideoFormat = VF_PAL;
|
||||
break;
|
||||
case 4:
|
||||
m_VideoFrameRate = 30000/1001.0;
|
||||
m_VideoFrameRate = 30000 / 1001.0;
|
||||
m_VideoFormat = VF_NTSC;
|
||||
break;
|
||||
case 5:
|
||||
@@ -120,8 +136,17 @@ void cFemonReceiver::GetVideoInfo(uint8_t *mbuf, int count)
|
||||
m_VideoFrameRate = 60.0;
|
||||
m_VideoFormat = VF_NTSC;
|
||||
break;
|
||||
case 8:
|
||||
m_VideoFrameRate = 60000 / 1001.0;
|
||||
m_VideoFormat = VF_NTSC;
|
||||
break;
|
||||
case 9 ... 15:
|
||||
default:
|
||||
m_VideoFrameRate = 0;
|
||||
m_VideoFormat = VF_UNKNOWN;
|
||||
break;
|
||||
}
|
||||
m_VideoStreamBitrate = 400 * (((headr[4] << 10) & 0x0003FC00UL) | ((headr[5] << 2) & 0x000003FCUL) | (((headr[6] & 0xC0) >> 6) & 0x00000003UL)) / 1000000.0;
|
||||
m_VideoStreamBitrate = 400.0 * (((headr[4] << 10) & 0x0003FC00UL) | ((headr[5] << 2) & 0x000003FCUL) | (((headr[6] & 0xC0) >> 6) & 0x00000003UL));
|
||||
}
|
||||
|
||||
static unsigned int bitrates[3][16] =
|
||||
@@ -131,25 +156,26 @@ static unsigned int bitrates[3][16] =
|
||||
{0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0}
|
||||
};
|
||||
|
||||
static unsigned int samplerates[4] = {441, 480, 320, 0};
|
||||
static unsigned int samplerates[4] =
|
||||
{441, 480, 320, 0};
|
||||
|
||||
/* the following function originates from libdvbmpeg: */
|
||||
/* The following function originates from libdvbmpeg: */
|
||||
void cFemonReceiver::GetAudioInfo(uint8_t *mbuf, int count)
|
||||
{
|
||||
//printf("cFemonReceiver::GetAudioInfo()\n");
|
||||
uint8_t *headr;
|
||||
int found = 0;
|
||||
int c = 0;
|
||||
int tmp = 0;
|
||||
while (!found && c < count) {
|
||||
//m_AudioValid = false;
|
||||
while (!found && (c < count)) {
|
||||
uint8_t *b = mbuf + c;
|
||||
if (b[0] == 0xff && (b[1] & 0xf8) == 0xf8)
|
||||
if ((b[0] == 0xff) && ((b[1] & 0xf8) == 0xf8))
|
||||
found = 1;
|
||||
else
|
||||
c++;
|
||||
}
|
||||
if (!found) return;
|
||||
if (c + 3 >= count) return;
|
||||
if ((!found) || ((c + 3) >= count)) return;
|
||||
m_AudioValid = true;
|
||||
headr = mbuf + c;
|
||||
m_AudioMPEGLayer = 4 - ((headr[1] & 0x06) >> 1);
|
||||
tmp = bitrates[(3 - ((headr[1] & 0x06) >> 1))][(headr[2] >> 4)] * 1000;
|
||||
@@ -158,7 +184,7 @@ void cFemonReceiver::GetAudioInfo(uint8_t *mbuf, int count)
|
||||
else if (tmp == 0xf)
|
||||
m_AudioStreamBitrate = (double)FR_RESERVED;
|
||||
else
|
||||
m_AudioStreamBitrate = tmp / 1000.0;
|
||||
m_AudioStreamBitrate = tmp;
|
||||
tmp = samplerates[((headr[2] & 0x0c) >> 2)] * 100;
|
||||
if (tmp == 3)
|
||||
m_AudioSamplingFreq = FR_RESERVED;
|
||||
@@ -166,15 +192,127 @@ void cFemonReceiver::GetAudioInfo(uint8_t *mbuf, int count)
|
||||
m_AudioSamplingFreq = tmp;
|
||||
}
|
||||
|
||||
static unsigned int ac3_bitrates[32] =
|
||||
{32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 448, 512, 576, 640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
|
||||
static unsigned int ac3_freq[4] =
|
||||
{480, 441, 320, 0};
|
||||
|
||||
static unsigned int ac3_frames[3][32] =
|
||||
{
|
||||
{64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 448, 512, 640, 768, 896, 1024, 1152, 1280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{69, 87, 104, 121, 139, 174, 208, 243, 278, 348, 417, 487, 557, 696, 835, 975, 1114, 1253, 1393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{96, 120, 144, 168, 192, 240, 288, 336, 384, 480, 576, 672, 768, 960, 1152, 1344, 1536, 1728, 1920, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
};
|
||||
|
||||
/*
|
||||
** AC3 Audio Header: http://www.atsc.org/standards/a_52a.pdf
|
||||
** The following function originates from libdvbmpeg:
|
||||
*/
|
||||
void cFemonReceiver::GetAC3Info(uint8_t *mbuf, int count)
|
||||
{
|
||||
uint8_t *headr;
|
||||
int found = 0;
|
||||
int c = 0;
|
||||
uint8_t frame;
|
||||
//m_AC3Valid = false;
|
||||
while (!found && (c < count)) {
|
||||
uint8_t *b = mbuf + c;
|
||||
if ((b[0] == 0x0b) && (b[1] == 0x77))
|
||||
found = 1;
|
||||
else
|
||||
c++;
|
||||
}
|
||||
if ((!found) || ((c + 5) >= count)) return;
|
||||
m_AC3Valid = true;
|
||||
headr = mbuf + c + 2;
|
||||
frame = (headr[2] & 0x3f);
|
||||
m_AC3StreamBitrate = ac3_bitrates[frame >> 1] * 1000;
|
||||
int fr = (headr[2] & 0xc0 ) >> 6;
|
||||
m_AC3SamplingFreq = ac3_freq[fr] * 100;
|
||||
m_AC3FrameSize = ac3_frames[fr][frame >> 1];
|
||||
if ((frame & 1) && (fr == 1)) m_AC3FrameSize++;
|
||||
m_AC3FrameSize <<= 1;
|
||||
m_AC3BitStreamMode = (headr[3] & 7);
|
||||
m_AC3AudioCodingMode = (headr[4] & 0xE0) >> 5;
|
||||
if ((m_AC3AudioCodingMode & 0x01) && (m_AC3AudioCodingMode != 0x01)) {
|
||||
// 3 front channels
|
||||
m_AC3CenterMixLevel = (headr[4] & 0x18) >> 3;
|
||||
if (m_AC3AudioCodingMode & 0x04) {
|
||||
// a surround channel exists
|
||||
m_AC3SurroundMixLevel = (headr[4] & 0x06) >> 1;
|
||||
if (m_AC3AudioCodingMode == 0x02) {
|
||||
// if in 2/0 mode
|
||||
m_AC3DolbySurroundMode = ((headr[4] & 0x01) << 1) | ((headr[5] & 0x80) >> 7);
|
||||
m_AC3LfeOn = (headr[5] & 0x40) >> 6;
|
||||
m_AC3DialogLevel = (headr[5] & 0x3e) >> 1;
|
||||
}
|
||||
else {
|
||||
m_AC3DolbySurroundMode = FR_NOTVALID;
|
||||
m_AC3LfeOn = (headr[4] & 0x01);
|
||||
m_AC3DialogLevel = (headr[5] & 0xF8) >> 3;
|
||||
}
|
||||
}
|
||||
else {
|
||||
m_AC3SurroundMixLevel = FR_NOTVALID;
|
||||
if (m_AC3AudioCodingMode == 0x02) {
|
||||
// if in 2/0 mode
|
||||
m_AC3DolbySurroundMode = (headr[4] & 0x06) >> 1;
|
||||
m_AC3LfeOn = (headr[4] & 0x01);
|
||||
m_AC3DialogLevel = (headr[5] & 0xF8) >> 3;
|
||||
}
|
||||
else {
|
||||
m_AC3DolbySurroundMode = FR_NOTVALID;
|
||||
m_AC3LfeOn = (headr[4] & 0x04) >> 2;
|
||||
m_AC3DialogLevel = (headr[4] & 0x03) << 3 | ((headr[5] & 0xE0) >> 5);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
m_AC3CenterMixLevel = FR_NOTVALID;
|
||||
if (m_AC3AudioCodingMode & 0x04) {
|
||||
// a surround channel exists
|
||||
m_AC3SurroundMixLevel = (headr[4] & 0x18) >> 3;
|
||||
if (m_AC3AudioCodingMode == 0x02) {
|
||||
// if in 2/0 mode
|
||||
m_AC3DolbySurroundMode = (headr[4] & 0x06) >> 1;
|
||||
m_AC3LfeOn = (headr[4] & 0x01);
|
||||
m_AC3DialogLevel = (headr[5] & 0xF8) >> 3;
|
||||
}
|
||||
else {
|
||||
m_AC3DolbySurroundMode = FR_NOTVALID;
|
||||
m_AC3LfeOn = (headr[4] & 0x04) >> 2;
|
||||
m_AC3DialogLevel = (headr[4] & 0x03) << 3 | ((headr[5] & 0xE0) >> 5);
|
||||
}
|
||||
}
|
||||
else {
|
||||
m_AC3SurroundMixLevel = FR_NOTVALID;
|
||||
if (m_AC3AudioCodingMode == 0x02) {
|
||||
// if in 2/0 mode
|
||||
m_AC3DolbySurroundMode = (headr[4] & 0x18) >> 3;
|
||||
m_AC3LfeOn = (headr[4] & 0x04) >> 2;
|
||||
m_AC3DialogLevel = (headr[4] & 0x03) << 3 | ((headr[5] & 0xE0) >> 5);
|
||||
}
|
||||
else {
|
||||
m_AC3DolbySurroundMode = FR_NOTVALID;
|
||||
m_AC3LfeOn = (headr[4] & 0x10) >> 4;
|
||||
m_AC3DialogLevel = ((headr[4] & 0x0F) << 1) | ((headr[5] & 0x80) >> 7);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void cFemonReceiver::Activate(bool On)
|
||||
{
|
||||
//printf("cFemonReceiver::Activate()\n");
|
||||
Start();
|
||||
Dprintf("%s(%d)\n", __PRETTY_FUNCTION__, On);
|
||||
if (On)
|
||||
Start();
|
||||
else
|
||||
Cancel();
|
||||
}
|
||||
|
||||
void cFemonReceiver::Receive(uchar *Data, int Length)
|
||||
{
|
||||
//printf("cFemonReceiver::Receive()\n");
|
||||
// TS packet length: TS_SIZE
|
||||
if (Length == TS_SIZE) {
|
||||
int pid = ((Data[1] & 0x1f) << 8) | (Data[2]);
|
||||
@@ -184,6 +322,9 @@ void cFemonReceiver::Receive(uchar *Data, int Length)
|
||||
else if (pid == m_AudioPid) {
|
||||
m_AudioPacketCount++;
|
||||
}
|
||||
else if (pid == m_AC3Pid) {
|
||||
m_AC3PacketCount++;
|
||||
}
|
||||
/* the following originates from libdvbmpeg: */
|
||||
if (!(Data[3] & PAYLOAD)) {
|
||||
return;
|
||||
@@ -200,9 +341,12 @@ void cFemonReceiver::Receive(uchar *Data, int Length)
|
||||
if (pid == m_VideoPid) {
|
||||
GetVideoInfo(pay, l);
|
||||
}
|
||||
if (pid == m_AudioPid) {
|
||||
else if (pid == m_AudioPid) {
|
||||
GetAudioInfo(pay, l);
|
||||
}
|
||||
else if (pid == m_AC3Pid) {
|
||||
GetAC3Info(pay, l);
|
||||
}
|
||||
}
|
||||
}
|
||||
/* end */
|
||||
@@ -211,14 +355,17 @@ void cFemonReceiver::Receive(uchar *Data, int Length)
|
||||
|
||||
void cFemonReceiver::Action(void)
|
||||
{
|
||||
//printf("cFemonReceiver::Action()\n");
|
||||
m_Active = true;
|
||||
while (m_Active) {
|
||||
Dprintf("%s()\n", __PRETTY_FUNCTION__);
|
||||
cTimeMs t;
|
||||
while (Running()) {
|
||||
t.Set(0);
|
||||
// TS packet 188 bytes - 4 byte header; MPEG standard defines 1Mbit = 1000000bit
|
||||
m_VideoBitrate = (8.0 * 184.0 * m_VideoPacketCount) / (femonConfig.calcinterval * 100000.0);
|
||||
m_VideoBitrate = (10.0 * 8.0 * 184.0 * m_VideoPacketCount) / femonConfig.calcinterval;
|
||||
m_VideoPacketCount = 0;
|
||||
m_AudioBitrate = (8.0 * 184.0 * m_AudioPacketCount) / (femonConfig.calcinterval * 100.0);
|
||||
m_AudioBitrate = (10.0 * 8.0 * 184.0 * m_AudioPacketCount) / femonConfig.calcinterval;
|
||||
m_AudioPacketCount = 0;
|
||||
usleep(100000L * femonConfig.calcinterval);
|
||||
m_AC3Bitrate = (10.0 * 8.0 * 184.0 * m_AC3PacketCount) / femonConfig.calcinterval;
|
||||
m_AC3PacketCount = 0;
|
||||
cCondWait::SleepMs(100 * femonConfig.calcinterval - t.Elapsed());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,29 +26,69 @@ enum eAspectRatio {
|
||||
AR_2_21_1 = 233,
|
||||
};
|
||||
|
||||
#define FR_RESERVED -1
|
||||
#define FR_FREE -2
|
||||
enum eCenterMixLevel {
|
||||
CML_MINUS_3dB = 0,
|
||||
CML_MINUS_4_5dB = 1,
|
||||
CML_MINUS_6dB = 2,
|
||||
CML_RESERVED = 3,
|
||||
};
|
||||
|
||||
enum eSurroundMixLevel {
|
||||
SML_MINUS_3dB = 0,
|
||||
SML_MINUS_6dB = 1,
|
||||
SML_0_dB = 2,
|
||||
SML_RESERVED = 3,
|
||||
};
|
||||
|
||||
enum eDolbySurroundMode {
|
||||
DSM_NOT_INDICATED = 0,
|
||||
DSM_NOT_DOLBYSURROUND = 1,
|
||||
DSM_DOLBYSURROUND = 2,
|
||||
DSM_RESERVED = 3,
|
||||
};
|
||||
|
||||
enum eReveiverCodes {
|
||||
FR_RESERVED = -1,
|
||||
FR_FREE = -2,
|
||||
FR_NOTVALID = -3
|
||||
};
|
||||
|
||||
class cFemonReceiver : public cReceiver, public cThread {
|
||||
private:
|
||||
bool m_Active;
|
||||
int m_VideoPid;
|
||||
int m_AudioPid;
|
||||
int m_VideoPacketCount;
|
||||
int m_VideoHorizontalSize;
|
||||
int m_VideoVerticalSize;
|
||||
int m_VideoAspectRatio;
|
||||
int m_VideoFormat;
|
||||
int m_VideoPid;
|
||||
int m_AudioPid;
|
||||
int m_AC3Pid;
|
||||
bool m_VideoValid;
|
||||
int m_VideoPacketCount;
|
||||
int m_VideoHorizontalSize;
|
||||
int m_VideoVerticalSize;
|
||||
int m_VideoAspectRatio;
|
||||
int m_VideoFormat;
|
||||
double m_VideoFrameRate;
|
||||
double m_VideoStreamBitrate;
|
||||
double m_VideoBitrate;
|
||||
int m_AudioPacketCount;
|
||||
bool m_AudioValid;
|
||||
int m_AudioPacketCount;
|
||||
double m_AudioStreamBitrate;
|
||||
double m_AudioBitrate;
|
||||
int m_AudioSamplingFreq;
|
||||
int m_AudioMPEGLayer;
|
||||
void GetVideoInfo(uint8_t *mbuf, int count);
|
||||
void GetAudioInfo(uint8_t *mbuf, int count);
|
||||
int m_AudioSamplingFreq;
|
||||
int m_AudioMPEGLayer;
|
||||
bool m_AC3Valid;
|
||||
int m_AC3PacketCount;
|
||||
double m_AC3Bitrate;
|
||||
int m_AC3FrameSize;
|
||||
int m_AC3SamplingFreq;
|
||||
int m_AC3StreamBitrate;
|
||||
int m_AC3BitStreamMode;
|
||||
int m_AC3AudioCodingMode;
|
||||
int m_AC3CenterMixLevel;
|
||||
int m_AC3SurroundMixLevel;
|
||||
int m_AC3DolbySurroundMode;
|
||||
bool m_AC3LfeOn;
|
||||
int m_AC3DialogLevel;
|
||||
void GetVideoInfo(uint8_t *mbuf, int count);
|
||||
void GetAudioInfo(uint8_t *mbuf, int count);
|
||||
void GetAC3Info(uint8_t *mbuf, int count);
|
||||
|
||||
protected:
|
||||
virtual void Activate(bool On);
|
||||
@@ -56,21 +96,38 @@ protected:
|
||||
virtual void Action(void);
|
||||
|
||||
public:
|
||||
cFemonReceiver(int Ca, int Vpid, int Apid);
|
||||
cFemonReceiver(tChannelID ChannelID, int Ca, int Vpid, int Apid[], int Dpid[]);
|
||||
virtual ~cFemonReceiver();
|
||||
|
||||
bool VideoValid(void) { return m_VideoValid; }; // boolean
|
||||
int VideoHorizontalSize(void) { return m_VideoHorizontalSize; }; // pixels
|
||||
int VideoVerticalSize(void) { return m_VideoVerticalSize; }; // pixels
|
||||
int VideoAspectRatio(void) { return m_VideoAspectRatio; }; // eAspectRatio
|
||||
int VideoFormat(void) { return m_VideoFormat; }; // eVideoFormat
|
||||
double VideoFrameRate(void) { return m_VideoFrameRate; }; // Hz
|
||||
double VideoStreamBitrate(void) { return m_VideoStreamBitrate; }; // Mbit/s
|
||||
double VideoBitrate(void) { return m_VideoBitrate; }; // Mbit/s
|
||||
double VideoStreamBitrate(void) { return m_VideoStreamBitrate; }; // bit/s
|
||||
double VideoBitrate(void) { return m_VideoBitrate; }; // bit/s
|
||||
|
||||
bool AudioValid(void) { return m_AudioValid; }; // boolean
|
||||
int AudioMPEGLayer(void) { return m_AudioMPEGLayer; }; // layer number
|
||||
int AudioSamplingFreq(void) { return m_AudioSamplingFreq; }; // Hz
|
||||
double AudioStreamBitrate(void) { return m_AudioStreamBitrate; }; // kbit/s
|
||||
double AudioBitrate(void) { return m_AudioBitrate; }; // kbit/s
|
||||
double AudioStreamBitrate(void) { return m_AudioStreamBitrate; }; // bit/s
|
||||
double AudioBitrate(void) { return m_AudioBitrate; }; // bit/s
|
||||
|
||||
bool AC3Valid(void) { return m_AC3Valid; }; // boolean
|
||||
int AC3SamplingFreq(void) { return m_AC3SamplingFreq; }; // Hz
|
||||
double AC3StreamBitrate(void) { return m_AC3StreamBitrate; }; // bit/s
|
||||
double AC3Bitrate(void) { return m_AC3Bitrate; }; // bit/s
|
||||
int AC3FrameSize(void) { return m_AC3FrameSize; }; // Bytes
|
||||
int AC3BitStreamMode(void) { return m_AC3BitStreamMode; }; // 0..7
|
||||
int AC3AudioCodingMode(void) { return m_AC3AudioCodingMode; }; // 0..7
|
||||
bool AC3_2_0(void) { return m_AC3AudioCodingMode == 2; }; // DD 2.0
|
||||
bool AC3_5_1(void) { return m_AC3AudioCodingMode == 7; }; // DD 5.1
|
||||
int AC3CenterMixLevel(void) { return m_AC3CenterMixLevel; }; // eCenterMixLevel
|
||||
int AC3SurroundMixLevel(void) { return m_AC3SurroundMixLevel; }; // eSurroundMixLevel
|
||||
int AC3DolbySurroundMode(void) { return m_AC3DolbySurroundMode; }; // eDolbySurroundMode
|
||||
bool AC3LfeOn(void) { return m_AC3LfeOn; }; // boolean
|
||||
int AC3DialogLevel(void) { return m_AC3DialogLevel; }; // -dB
|
||||
};
|
||||
|
||||
#endif //__FEMONRECEIVER_H
|
||||
|
||||
27
femonservice.h
Normal file
27
femonservice.h
Normal file
@@ -0,0 +1,27 @@
|
||||
/*
|
||||
* Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#ifndef __FEMONSERVICE_H
|
||||
#define __FEMONSERVICE_H
|
||||
|
||||
#include <linux/dvb/frontend.h>
|
||||
|
||||
struct FemonService_v1_0 {
|
||||
cString fe_name;
|
||||
cString fe_status;
|
||||
uint16_t fe_snr;
|
||||
uint16_t fe_signal;
|
||||
uint32_t fe_ber;
|
||||
uint32_t fe_unc;
|
||||
double video_bitrate;
|
||||
double audio_bitrate;
|
||||
double dolby_bitrate;
|
||||
};
|
||||
|
||||
#endif //__FEMONSERVICE_H
|
||||
|
||||
435
femontools.c
Normal file
435
femontools.c
Normal file
@@ -0,0 +1,435 @@
|
||||
/*
|
||||
* Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <linux/dvb/frontend.h>
|
||||
#include "femoni18n.h"
|
||||
#include "femonreceiver.h"
|
||||
#include "femonosd.h"
|
||||
#include "femontools.h"
|
||||
|
||||
cString getFrontendInfo(int cardIndex)
|
||||
{
|
||||
cString info;
|
||||
struct dvb_frontend_info value;
|
||||
fe_status_t status;
|
||||
uint16_t signal = 0;
|
||||
uint16_t snr = 0;
|
||||
uint32_t ber = 0;
|
||||
uint32_t unc = 0;
|
||||
char *dev = NULL;
|
||||
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
|
||||
|
||||
asprintf(&dev, FRONTEND_DEVICE, cardIndex, 0);
|
||||
int fe = open(dev, O_RDONLY | O_NONBLOCK);
|
||||
free(dev);
|
||||
if (fe < 0)
|
||||
return NULL;
|
||||
CHECK(ioctl(fe, FE_GET_INFO, &value));
|
||||
CHECK(ioctl(fe, FE_READ_STATUS, &status));
|
||||
CHECK(ioctl(fe, FE_READ_SIGNAL_STRENGTH, &signal));
|
||||
CHECK(ioctl(fe, FE_READ_SNR, &snr));
|
||||
CHECK(ioctl(fe, FE_READ_BER, &ber));
|
||||
CHECK(ioctl(fe, FE_READ_UNCORRECTED_BLOCKS, &unc));
|
||||
close(fe);
|
||||
|
||||
info = cString::sprintf("CARD:%d\nTYPE:%d\nNAME:%s\nSTAT:%02X\nSGNL:%04X\nSNRA:%04X\nBERA:%08X\nUNCB:%08X", cardIndex, value.type, value.name, status, signal, snr, ber, unc);
|
||||
|
||||
if (cFemonOsd::Instance())
|
||||
info = cString::sprintf("%s\nVIBR:%.0f\nAUBR:%.0f\nDDBR:%.0f", *info, cFemonOsd::Instance()->GetVideoBitrate(), cFemonOsd::Instance()->GetAudioBitrate(), cFemonOsd::Instance()->GetDolbyBitrate());
|
||||
|
||||
if (channel)
|
||||
info = cString::sprintf("%s\nCHAN:%s", *info, *channel->ToText());
|
||||
|
||||
return info;
|
||||
}
|
||||
|
||||
cString getFrontendName(int cardIndex)
|
||||
{
|
||||
struct dvb_frontend_info value;
|
||||
char *dev = NULL;
|
||||
|
||||
asprintf(&dev, FRONTEND_DEVICE, cardIndex, 0);
|
||||
int fe = open(dev, O_RDONLY | O_NONBLOCK);
|
||||
free(dev);
|
||||
if (fe < 0)
|
||||
return NULL;
|
||||
CHECK(ioctl(fe, FE_GET_INFO, &value));
|
||||
close(fe);
|
||||
|
||||
return (cString::sprintf("%s on device #%d", value.name, cardIndex));
|
||||
}
|
||||
|
||||
cString getFrontendStatus(int cardIndex)
|
||||
{
|
||||
fe_status_t value;
|
||||
char *dev = NULL;
|
||||
|
||||
asprintf(&dev, FRONTEND_DEVICE, cardIndex, 0);
|
||||
int fe = open(dev, O_RDONLY | O_NONBLOCK);
|
||||
free(dev);
|
||||
if (fe < 0)
|
||||
return NULL;
|
||||
CHECK(ioctl(fe, FE_READ_STATUS, &value));
|
||||
close(fe);
|
||||
|
||||
return (cString::sprintf("Status %s:%s:%s:%s:%s on device #%d", (value & FE_HAS_LOCK) ? "LOCKED" : "-", (value & FE_HAS_SIGNAL) ? "SIGNAL" : "-", (value & FE_HAS_CARRIER) ? "CARRIER" : "-", (value & FE_HAS_VITERBI) ? "VITERBI" : "-", (value & FE_HAS_SYNC) ? "SYNC" : "-", cardIndex));
|
||||
}
|
||||
|
||||
uint16_t getSignal(int cardIndex)
|
||||
{
|
||||
uint16_t value = 0;
|
||||
char *dev = NULL;
|
||||
|
||||
asprintf(&dev, FRONTEND_DEVICE, cardIndex, 0);
|
||||
int fe = open(dev, O_RDONLY | O_NONBLOCK);
|
||||
free(dev);
|
||||
if (fe < 0)
|
||||
return (value);
|
||||
CHECK(ioctl(fe, FE_READ_SIGNAL_STRENGTH, &value));
|
||||
close(fe);
|
||||
|
||||
return (value);
|
||||
}
|
||||
|
||||
uint16_t getSNR(int cardIndex)
|
||||
{
|
||||
uint16_t value = 0;
|
||||
char *dev = NULL;
|
||||
|
||||
asprintf(&dev, FRONTEND_DEVICE, cardIndex, 0);
|
||||
int fe = open(dev, O_RDONLY | O_NONBLOCK);
|
||||
free(dev);
|
||||
if (fe < 0)
|
||||
return (value);
|
||||
CHECK(ioctl(fe, FE_READ_SNR, &value));
|
||||
close(fe);
|
||||
|
||||
return (value);
|
||||
}
|
||||
|
||||
uint32_t getBER(int cardIndex)
|
||||
{
|
||||
uint32_t value = 0;
|
||||
char *dev = NULL;
|
||||
|
||||
asprintf(&dev, FRONTEND_DEVICE, cardIndex, 0);
|
||||
int fe = open(dev, O_RDONLY | O_NONBLOCK);
|
||||
free(dev);
|
||||
if (fe < 0)
|
||||
return (value);
|
||||
CHECK(ioctl(fe, FE_READ_BER, &value));
|
||||
close(fe);
|
||||
|
||||
return (value);
|
||||
}
|
||||
|
||||
uint32_t getUNC(int cardIndex)
|
||||
{
|
||||
uint32_t value = 0;
|
||||
char *dev = NULL;
|
||||
|
||||
asprintf(&dev, FRONTEND_DEVICE, cardIndex, 0);
|
||||
int fe = open(dev, O_RDONLY | O_NONBLOCK);
|
||||
free(dev);
|
||||
if (fe < 0)
|
||||
return (value);
|
||||
CHECK(ioctl(fe, FE_READ_UNCORRECTED_BLOCKS, &value));
|
||||
close(fe);
|
||||
|
||||
return (value);
|
||||
}
|
||||
|
||||
cString getApids(const cChannel *channel)
|
||||
{
|
||||
int value = 0;
|
||||
cString apids = cString::sprintf("%d", channel->Apid(value));
|
||||
while (channel->Apid(++value) && (value < MAXAPIDS))
|
||||
apids = cString::sprintf("%s, %d", *apids, channel->Apid(value));
|
||||
return apids;
|
||||
}
|
||||
|
||||
cString getDpids(const cChannel *channel)
|
||||
{
|
||||
int value = 0;
|
||||
cString dpids = cString::sprintf("%d", channel->Dpid(value));
|
||||
while (channel->Dpid(++value) && (value < MAXDPIDS))
|
||||
dpids = cString::sprintf("%s, %d", *dpids, channel->Dpid(value));
|
||||
return dpids;
|
||||
}
|
||||
|
||||
cString getSpids(const cChannel *channel)
|
||||
{
|
||||
int value = 0;
|
||||
cString spids = cString::sprintf("%d", channel->Spid(value));
|
||||
while (channel->Spid(++value) && (value < MAXSPIDS))
|
||||
spids = cString::sprintf("%s, %d", *spids, channel->Spid(value));
|
||||
return spids;
|
||||
}
|
||||
|
||||
cString getCAids(const cChannel *channel, bool identify)
|
||||
{
|
||||
cString caids;
|
||||
int value = 0;
|
||||
|
||||
if (identify) {
|
||||
caids = cString::sprintf("%s", *getCA(channel->Ca(value)));
|
||||
while (channel->Ca(++value) && (value < MAXCAIDS))
|
||||
caids = cString::sprintf("%s, %s", *caids, *getCA(channel->Ca(value)));
|
||||
}
|
||||
else {
|
||||
caids = cString::sprintf("%04x", channel->Ca(value));
|
||||
while (channel->Ca(++value) && (value < MAXCAIDS))
|
||||
caids = cString::sprintf("%s, %04x", *caids, channel->Ca(value));
|
||||
}
|
||||
return caids;
|
||||
}
|
||||
|
||||
cString getCA(int value)
|
||||
{
|
||||
/* http://www.dvb.org/index.php?id=174 */
|
||||
switch (value) {
|
||||
case 0x0000: return cString::sprintf("%s", tr("Free to Air")); /* Reserved */
|
||||
case 0x0001 ... 0x009F:
|
||||
case 0x00A2 ... 0x00FF: return cString::sprintf("%s", tr("Fixed")); /* Standardized systems */
|
||||
case 0x00A0 ... 0x00A1: return cString::sprintf("%s", tr("Analog")); /* Analog signals */
|
||||
case 0x0100 ... 0x01FF: return cString::sprintf("%s", tr("SECA/Mediaguard")); /* Canal Plus */
|
||||
case 0x0500 ... 0x05FF: return cString::sprintf("%s", tr("Viaccess")); /* France Telecom */
|
||||
case 0x0600 ... 0x06FF: return cString::sprintf("%s", tr("Irdeto")); /* Irdeto */
|
||||
case 0x0900 ... 0x09FF: return cString::sprintf("%s", tr("NDS/Videoguard")); /* News Datacom */
|
||||
case 0x0B00 ... 0x0BFF: return cString::sprintf("%s", tr("Conax")); /* Norwegian Telekom */
|
||||
case 0x0D00 ... 0x0DFF: return cString::sprintf("%s", tr("CryptoWorks")); /* Philips */
|
||||
case 0x0E00 ... 0x0EFF: return cString::sprintf("%s", tr("PowerVu")); /* Scientific Atlanta */
|
||||
case 0x1200 ... 0x12FF: return cString::sprintf("%s", tr("NagraVision")); /* BellVu Express */
|
||||
case 0x1700 ... 0x17FF: return cString::sprintf("%s", tr("BetaCrypt")); /* BetaTechnik */
|
||||
case 0x1800 ... 0x18FF: return cString::sprintf("%s", tr("NagraVision")); /* Kudelski SA */
|
||||
case 0x4A60 ... 0x4A6F: return cString::sprintf("%s", tr("SkyCrypt")); /* @Sky */
|
||||
}
|
||||
return cString::sprintf("%X", value);
|
||||
}
|
||||
|
||||
cString getCoderate(int value)
|
||||
{
|
||||
switch (value) {
|
||||
case FEC_NONE: return cString::sprintf("%s", tr("None"));
|
||||
case FEC_1_2: return cString::sprintf("1/2");
|
||||
case FEC_2_3: return cString::sprintf("2/3");
|
||||
case FEC_3_4: return cString::sprintf("3/4");
|
||||
case FEC_4_5: return cString::sprintf("4/5");
|
||||
case FEC_5_6: return cString::sprintf("5/6");
|
||||
case FEC_6_7: return cString::sprintf("6/7");
|
||||
case FEC_7_8: return cString::sprintf("7/8");
|
||||
case FEC_8_9: return cString::sprintf("8/9");
|
||||
case FEC_AUTO: return cString::sprintf("%s", tr("Auto"));
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getTransmission(int value)
|
||||
{
|
||||
switch (value) {
|
||||
case TRANSMISSION_MODE_2K: return cString::sprintf("2K");
|
||||
case TRANSMISSION_MODE_8K: return cString::sprintf("8K");
|
||||
case TRANSMISSION_MODE_AUTO: return cString::sprintf("%s", tr("Auto"));
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getBandwidth(int value)
|
||||
{
|
||||
switch (value) {
|
||||
case BANDWIDTH_8_MHZ: return cString::sprintf("8 %s", tr("MHz"));
|
||||
case BANDWIDTH_7_MHZ: return cString::sprintf("7 %s", tr("MHz"));
|
||||
case BANDWIDTH_6_MHZ: return cString::sprintf("6 %s", tr("MHz"));
|
||||
case BANDWIDTH_AUTO: return cString::sprintf("%s", tr("Auto"));
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getInversion(int value)
|
||||
{
|
||||
switch (value) {
|
||||
case INVERSION_OFF: return cString::sprintf("%s", tr("Off"));
|
||||
case INVERSION_ON: return cString::sprintf("%s", tr("On"));
|
||||
case INVERSION_AUTO: return cString::sprintf("%s", tr("Auto"));
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getHierarchy(int value)
|
||||
{
|
||||
switch (value) {
|
||||
case HIERARCHY_NONE: return cString::sprintf("%s", tr("None"));
|
||||
case HIERARCHY_1: return cString::sprintf("1");
|
||||
case HIERARCHY_2: return cString::sprintf("2");
|
||||
case HIERARCHY_4: return cString::sprintf("4");
|
||||
case HIERARCHY_AUTO: cString::sprintf("%s", tr("Auto"));
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getGuard(int value)
|
||||
{
|
||||
switch (value) {
|
||||
case GUARD_INTERVAL_1_32: return cString::sprintf("1/32");
|
||||
case GUARD_INTERVAL_1_16: return cString::sprintf("1/16");
|
||||
case GUARD_INTERVAL_1_8: return cString::sprintf("1/8");
|
||||
case GUARD_INTERVAL_1_4: return cString::sprintf("1/4");
|
||||
case GUARD_INTERVAL_AUTO: cString::sprintf("%s", tr("Auto"));
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getModulation(int value)
|
||||
{
|
||||
switch (value) {
|
||||
case QPSK: return cString::sprintf("QPSK");
|
||||
case QAM_16: return cString::sprintf("QAM 16");
|
||||
case QAM_32: return cString::sprintf("QAM 32");
|
||||
case QAM_64: return cString::sprintf("QAM 64");
|
||||
case QAM_128: return cString::sprintf("QAM 128");
|
||||
case QAM_256: return cString::sprintf("QAM 256");
|
||||
case QAM_AUTO: return cString::sprintf("QAM %s", tr("Auto"));
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getAspectRatio(int value)
|
||||
{
|
||||
switch (value) {
|
||||
case AR_RESERVED: return cString::sprintf("%s", tr("reserved"));
|
||||
case AR_1_1: return cString::sprintf("1:1");
|
||||
case AR_4_3: return cString::sprintf("4:3");
|
||||
case AR_16_9: return cString::sprintf("16:9");
|
||||
case AR_2_21_1: return cString::sprintf("2.21:1");
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getVideoFormat(int value)
|
||||
{
|
||||
switch (value) {
|
||||
case VF_UNKNOWN: return cString::sprintf("%s", tr("unknown"));
|
||||
case VF_PAL: return cString::sprintf("%s", tr("PAL"));
|
||||
case VF_NTSC: return cString::sprintf("%s", tr("NTSC"));
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getAC3BitStreamMode(int value, int coding)
|
||||
{
|
||||
switch (value) {
|
||||
case 0: return cString::sprintf("%s", tr("Complete Main (CM)"));
|
||||
case 1: return cString::sprintf("%s", tr("Music and Effects (ME)"));
|
||||
case 2: return cString::sprintf("%s", tr("Visually Impaired (VI)"));
|
||||
case 3: return cString::sprintf("%s", tr("Hearing Impaired (HI)"));
|
||||
case 4: return cString::sprintf("%s", tr("Dialogue (D)"));
|
||||
case 5: return cString::sprintf("%s", tr("Commentary (C)"));
|
||||
case 6: return cString::sprintf("%s", tr("Emergency (E)"));
|
||||
case 7: return cString::sprintf("%s", (coding == 1) ? tr("Voice Over (VO)") : tr("Karaoke"));
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getAC3AudioCodingMode(int value, int stream)
|
||||
{
|
||||
if (stream != 7) {
|
||||
switch (value) {
|
||||
case 0: return cString::sprintf("1+1 - %s, %s", tr("Ch1"), tr("Ch2"));
|
||||
case 1: return cString::sprintf("1/0 - %s", tr("C"));
|
||||
case 2: return cString::sprintf("2/0 - %s, %s", tr("L"), tr("R"));
|
||||
case 3: return cString::sprintf("3/0 - %s, %s, %s", tr("L"), tr("C"), tr("R"));
|
||||
case 4: return cString::sprintf("2/1 - %s, %s, %s", tr("L"), tr("R"), tr("S"));
|
||||
case 5: return cString::sprintf("3/1 - %s, %s, %s, %s", tr("L"), tr("C"), tr("R"), tr("S"));
|
||||
case 6: return cString::sprintf("2/2 - %s, %s, %s, %s", tr("L"), tr("R"), tr("SL"), tr("SR"));
|
||||
case 7: return cString::sprintf("3/2 - %s, %s, %s, %s, %s", tr("L"), tr("C"), tr("R"), tr("SL"), tr("SR"));
|
||||
}
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getAC3CenterMixLevel(int value)
|
||||
{
|
||||
switch (value) {
|
||||
case CML_MINUS_3dB: return cString::sprintf("-3.0 %s", tr("dB"));
|
||||
case CML_MINUS_4_5dB: return cString::sprintf("-4.5 %s", tr("dB"));
|
||||
case CML_MINUS_6dB: return cString::sprintf("-6.0 %s", tr("dB"));
|
||||
case CML_RESERVED: return cString::sprintf("%s", tr("reserved"));
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getAC3SurroundMixLevel(int value)
|
||||
{
|
||||
switch (value) {
|
||||
case SML_MINUS_3dB: return cString::sprintf("-3 %s", tr("dB"));
|
||||
case SML_MINUS_6dB: return cString::sprintf("-6 %s", tr("dB"));
|
||||
case SML_0_dB: return cString::sprintf("0 %s", tr("dB"));
|
||||
case SML_RESERVED: return cString::sprintf("%s", tr("reserved"));
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getAC3DolbySurroundMode(int value)
|
||||
{
|
||||
switch (value) {
|
||||
case DSM_NOT_INDICATED: return cString::sprintf("%s", tr("not indicated"));
|
||||
case DSM_NOT_DOLBYSURROUND: return cString::sprintf("%s", tr("no"));
|
||||
case DSM_DOLBYSURROUND: return cString::sprintf("%s", tr("yes"));
|
||||
case DSM_RESERVED: return cString::sprintf("%s", tr("reserved"));
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getAC3DialogLevel(int value)
|
||||
{
|
||||
if (value > 0)
|
||||
return cString::sprintf("-%d %s", value, tr("dB"));
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getFrequencyMHz(int value)
|
||||
{
|
||||
while (value > 20000) value /= 1000;
|
||||
return cString::sprintf("%d %s", value, tr("MHz"));
|
||||
}
|
||||
|
||||
cString getAudioSamplingFreq(int value)
|
||||
{
|
||||
switch (value) {
|
||||
case FR_NOTVALID: return cString::sprintf("---");
|
||||
case FR_RESERVED: return cString::sprintf("%s", tr("reserved"));
|
||||
}
|
||||
return cString::sprintf("%.1f %s", ((double)value / 1000.0), tr("kHz"));
|
||||
}
|
||||
|
||||
cString getAudioBitrate(double value, double stream)
|
||||
{
|
||||
switch ((int)stream) {
|
||||
case FR_NOTVALID: return cString::sprintf("---");
|
||||
case FR_RESERVED: return cString::sprintf("%s (%s)", tr("reserved"), *getBitrateKbits(value));
|
||||
case FR_FREE: return cString::sprintf("%s (%s)", tr("free"), *getBitrateKbits(value));
|
||||
}
|
||||
return cString::sprintf("%s (%s)", *getBitrateKbits(stream), *getBitrateKbits(value));
|
||||
}
|
||||
|
||||
cString getBitrateMbits(double value)
|
||||
{
|
||||
if (value >= 0)
|
||||
return cString::sprintf("%.2f %s", value / 1000000.0, tr("Mbit/s"));
|
||||
return cString::sprintf("--- %s", tr("Mbit/s"));
|
||||
}
|
||||
|
||||
cString getBitrateKbits(double value)
|
||||
{
|
||||
if (value >= 0)
|
||||
return cString::sprintf("%.0f %s", value / 1000.0, tr("kbit/s"));
|
||||
return cString::sprintf("--- %s", tr("kbit/s"));
|
||||
}
|
||||
60
femontools.h
Normal file
60
femontools.h
Normal file
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
* Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#ifndef __FEMONTOOLS_H
|
||||
#define __FEMONTOOLS_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <vdr/channels.h>
|
||||
#include <vdr/tools.h>
|
||||
|
||||
#ifdef DEBUG
|
||||
#define Dprintf(x...) printf(x);
|
||||
#else
|
||||
#define Dprintf(x...) ;
|
||||
#endif
|
||||
|
||||
#define FRONTEND_DEVICE "/dev/dvb/adapter%d/frontend%d"
|
||||
|
||||
cString getFrontendInfo(int cardIndex = 0);
|
||||
cString getFrontendName(int cardIndex = 0);
|
||||
cString getFrontendStatus(int cardIndex = 0);
|
||||
|
||||
uint16_t getSNR(int cardIndex = 0);
|
||||
uint16_t getSignal(int cardIndex = 0);
|
||||
|
||||
uint32_t getBER(int cardIndex = 0);
|
||||
uint32_t getUNC(int cardIndex = 0);
|
||||
|
||||
cString getApids(const cChannel *channel);
|
||||
cString getDpids(const cChannel *channel);
|
||||
cString getSpids(const cChannel *channel);
|
||||
cString getCAids(const cChannel *channel, bool identify = false);
|
||||
cString getCA(int value);
|
||||
cString getCoderate(int value);
|
||||
cString getTransmission(int value);
|
||||
cString getBandwidth(int value);
|
||||
cString getInversion(int value);
|
||||
cString getHierarchy(int value);
|
||||
cString getGuard(int value);
|
||||
cString getModulation(int value);
|
||||
cString getAspectRatio(int value);
|
||||
cString getVideoFormat(int value);
|
||||
cString getAC3BitStreamMode(int value, int coding);
|
||||
cString getAC3AudioCodingMode(int value, int stream);
|
||||
cString getAC3CenterMixLevel(int value);
|
||||
cString getAC3SurroundMixLevel(int value);
|
||||
cString getAC3DolbySurroundMode(int value);
|
||||
cString getAC3DialogLevel(int value);
|
||||
cString getFrequencyMHz(int value);
|
||||
cString getAudioSamplingFreq(int value);
|
||||
cString getAudioBitrate(double value, double stream);
|
||||
cString getBitrateMbits(double value);
|
||||
cString getBitrateKbits(double value);
|
||||
|
||||
#endif // __FEMONTOOLS_H
|
||||
39
svdrpservice.h
Normal file
39
svdrpservice.h
Normal file
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* svdrpservice.h: Public interface of the plugin's services
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*/
|
||||
|
||||
#ifndef _SVDRPSERVICE__H
|
||||
#define _SVDRPSERVICE__H
|
||||
|
||||
#include <vdr/tools.h>
|
||||
|
||||
class cLine: public cListObject {
|
||||
private:
|
||||
char *Line;
|
||||
public:
|
||||
const char *Text() { return Line; }
|
||||
cLine(const char *s) { Line = s ? strdup(s) : NULL; };
|
||||
virtual ~cLine() { if (Line) free(Line); };
|
||||
};
|
||||
|
||||
struct SvdrpConnection_v1_0 {
|
||||
// in
|
||||
cString serverIp;
|
||||
unsigned short serverPort;
|
||||
bool shared;
|
||||
// in+out
|
||||
int handle;
|
||||
};
|
||||
|
||||
struct SvdrpCommand_v1_0 {
|
||||
// in
|
||||
cString command;
|
||||
int handle;
|
||||
// out
|
||||
cList<cLine> reply;
|
||||
unsigned short responseCode;
|
||||
};
|
||||
|
||||
#endif //_SVDRPSERVICE__H
|
||||
@@ -1,23 +1,23 @@
|
||||
/* XPM */
|
||||
static char * ar11_xpm[] = {
|
||||
"21 18 2 1",
|
||||
static const char *const ar11_xpm[] = {
|
||||
"26 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
".....................",
|
||||
".....................",
|
||||
"....++...........++..",
|
||||
"...+++..........+++..",
|
||||
"..++++....++...++++..",
|
||||
"..++++...++++..++++..",
|
||||
"....++...++++....++..",
|
||||
"....++....++.....++..",
|
||||
"....++...........++..",
|
||||
"....++...........++..",
|
||||
"....++....++.....++..",
|
||||
"....++...++++....++..",
|
||||
"....++...++++....++..",
|
||||
"....++....++.....++..",
|
||||
"....++...........++..",
|
||||
"....++...........++..",
|
||||
".....................",
|
||||
"....................."};
|
||||
"++++++++++++++++++++++++++",
|
||||
"+........................+",
|
||||
"+......++..........++....+",
|
||||
"+...+++++.......+++++....+",
|
||||
"+...+++++.......+++++....+",
|
||||
"+......++...++.....++....+",
|
||||
"+......++...++.....++....+",
|
||||
"+......++..........++....+",
|
||||
"+......++..........++....+",
|
||||
"+......++..........++....+",
|
||||
"+......++..........++....+",
|
||||
"+......++..........++....+",
|
||||
"+......++..........++....+",
|
||||
"+......++..........++....+",
|
||||
"+......++...++.....++....+",
|
||||
"+......++...++.....++....+",
|
||||
"+........................+",
|
||||
"++++++++++++++++++++++++++"};
|
||||
|
||||
@@ -1,23 +1,23 @@
|
||||
/* XPM */
|
||||
static char * ar169_xpm[] = {
|
||||
"36 18 2 1",
|
||||
static const char *const ar169_xpm[] = {
|
||||
"38 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"....................................",
|
||||
"....................................",
|
||||
"....++....+++++............+++++....",
|
||||
"...+++...+++++++..........+++++++...",
|
||||
"..++++..+++...+++...++...+++...+++..",
|
||||
"..++++..++.....++..++++..++.....++..",
|
||||
"....++..++.........++++..++.....++..",
|
||||
"....++..++..........++...+++...+++..",
|
||||
"....++..++.++++...........++++++++..",
|
||||
"....++..++++++++...........+++++++..",
|
||||
"....++..+++...+++...++..........++..",
|
||||
"....++..++.....++..++++.........++..",
|
||||
"....++..++.....++..++++..++.....++..",
|
||||
"....++..+++...+++...++...+++...+++..",
|
||||
"....++...+++++++..........+++++++...",
|
||||
"....++....+++++............+++++....",
|
||||
"....................................",
|
||||
"...................................."};
|
||||
"++++++++++++++++++++++++++++++++++++++",
|
||||
"+....................................+",
|
||||
"+......++.....++++..........++++.....+",
|
||||
"+...+++++....+++++++.......++++++....+",
|
||||
"+...+++++....++...++......++...+++...+",
|
||||
"+......++...++........++..++....++...+",
|
||||
"+......++...++........++..++....++...+",
|
||||
"+......++...++............++....++...+",
|
||||
"+......++...++.+++.........+++++++...+",
|
||||
"+......++...+++++++.........+++.++...+",
|
||||
"+......++...++....++............++...+",
|
||||
"+......++...++....++............++...+",
|
||||
"+......++...++....++............++...+",
|
||||
"+......++...+++...++......++...++....+",
|
||||
"+......++....++++++...++..+++++++....+",
|
||||
"+......++.....++++....++...+++++.....+",
|
||||
"+....................................+",
|
||||
"++++++++++++++++++++++++++++++++++++++"};
|
||||
|
||||
@@ -1,23 +1,23 @@
|
||||
/* XPM */
|
||||
static char * ar2211_xpm[] = {
|
||||
"43 18 2 1",
|
||||
static const char *const ar2211_xpm[] = {
|
||||
"52 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"...........................................",
|
||||
"...........................................",
|
||||
"....++++........++++......++...........++..",
|
||||
"...++++++......++++++....+++..........+++..",
|
||||
"..+++..+++....+++..+++..++++....++...++++..",
|
||||
"..++....++....++....++..++++...++++..++++..",
|
||||
"..++....++....++....++....++...++++....++..",
|
||||
".......+++.........+++....++....++.....++..",
|
||||
"......+++.........+++.....++...........++..",
|
||||
".....+++.........+++......++...........++..",
|
||||
"....+++.........+++.......++....++.....++..",
|
||||
"...+++.........+++........++...++++....++..",
|
||||
"..+++.........+++.........++...++++....++..",
|
||||
"..++....++.++.++....++....++....++.....++..",
|
||||
"..++++++++.++.++++++++....++...........++..",
|
||||
"..++++++++.++.++++++++....++...........++..",
|
||||
"...........................................",
|
||||
"..........................................."};
|
||||
"++++++++++++++++++++++++++++++++++++++++++++++++++++",
|
||||
"+..................................................+",
|
||||
"+.....++++..........++++........++...........++....+",
|
||||
"+...+++++++.......+++++++....+++++........+++++....+",
|
||||
"+...++....++......++....++...+++++........+++++....+",
|
||||
"+.........++............++......++...++......++....+",
|
||||
"+.........++............++......++...++......++....+",
|
||||
"+........+++...........+++......++...........++....+",
|
||||
"+.......+++...........+++.......++...........++....+",
|
||||
"+......+++...........+++........++...........++....+",
|
||||
"+.....+++...........+++.........++...........++....+",
|
||||
"+....+++...........+++..........++...........++....+",
|
||||
"+...+++...........+++...........++...........++....+",
|
||||
"+...++............++............++...........++....+",
|
||||
"+...++++++++..++..++++++++......++...++......++....+",
|
||||
"+...++++++++..++..++++++++......++...++......++....+",
|
||||
"+..................................................+",
|
||||
"++++++++++++++++++++++++++++++++++++++++++++++++++++"};
|
||||
|
||||
@@ -1,23 +1,23 @@
|
||||
/* XPM */
|
||||
static char * ar43_xpm[] = {
|
||||
"32 18 2 1",
|
||||
static const char *const ar43_xpm[] = {
|
||||
"31 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"................................",
|
||||
"................................",
|
||||
"....++..++............++++++....",
|
||||
"....++..++...........++++++++...",
|
||||
"...+++..++.....++...+++....+++..",
|
||||
"...++...++....++++..++......++..",
|
||||
"...++...++....++++..++......++..",
|
||||
"..+++...++.....++..........+++..",
|
||||
"..++....++..............+++++...",
|
||||
"..++....++..............+++++...",
|
||||
"..++++++++++...++..........+++..",
|
||||
"..++++++++++..++++..++......++..",
|
||||
"........++....++++..++......++..",
|
||||
"........++.....++...+++....+++..",
|
||||
"........++...........++++++++...",
|
||||
"........++............++++++....",
|
||||
"................................",
|
||||
"................................"};
|
||||
"+++++++++++++++++++++++++++++++",
|
||||
"+.............................+",
|
||||
"+.........++.........+++++....+",
|
||||
"+........+++........+++++++...+",
|
||||
"+.......++++.......++....++...+",
|
||||
"+......++.++...++..++....++...+",
|
||||
"+.....++..++...++........++...+",
|
||||
"+.....++..++............++....+",
|
||||
"+....++...++..........+++.....+",
|
||||
"+...++....++..........++++....+",
|
||||
"+...+++++++++...........+++...+",
|
||||
"+...+++++++++............++...+",
|
||||
"+.........++.......++....++...+",
|
||||
"+.........++.......++...+++...+",
|
||||
"+.........++...++...++++++....+",
|
||||
"+.........++...++....++++.....+",
|
||||
"+.............................+",
|
||||
"+++++++++++++++++++++++++++++++"};
|
||||
|
||||
24
symbols/carrier.xpm
Normal file
24
symbols/carrier.xpm
Normal file
@@ -0,0 +1,24 @@
|
||||
/* XPM */
|
||||
static const char *const carrier_xpm[] = {
|
||||
"96 19 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
|
||||
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
|
||||
"++............................................................................................++",
|
||||
"++............................................................................................++",
|
||||
"++...........+++++.......+++++.....++++++++....++++++++....+++...++++++++...++++++++..........++",
|
||||
"++..........+++++++......+++++.....+++++++++...+++++++++...+++...++++++++...+++++++++.........++",
|
||||
"++..........+++.++++.....+++++.....+++...+++...+++...+++...+++...+++........+++...+++.........++",
|
||||
"++.........+++...++.....+++.+++....+++...+++...+++...+++...+++...+++........+++...+++.........++",
|
||||
"++.........+++..........+++.+++....++++++++....++++++++....+++...+++++++....++++++++..........++",
|
||||
"++.........+++..........+++.+++....+++++++.....+++++++.....+++...+++++++....+++++++...........++",
|
||||
"++.........+++.........+++...+++...+++..+++....+++..+++....+++...+++........+++..+++..........++",
|
||||
"++.........+++...++....+++++++++...+++..+++....+++..+++....+++...+++........+++..+++..........++",
|
||||
"++..........+++.++++...+++++++++...+++...+++...+++...+++...+++...+++........+++...+++.........++",
|
||||
"++..........+++++++...+++.....+++..+++...+++...+++...+++...+++...++++++++...+++...+++.........++",
|
||||
"++...........+++++....+++.....+++..+++....+++..+++....+++..+++...++++++++...+++....+++........++",
|
||||
"++............................................................................................++",
|
||||
"++............................................................................................++",
|
||||
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
|
||||
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"};
|
||||
23
symbols/device.xpm
Normal file
23
symbols/device.xpm
Normal file
@@ -0,0 +1,23 @@
|
||||
/* XPM */
|
||||
static const char *const device_xpm[] = {
|
||||
"14 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"++++++++++++++",
|
||||
"+.............",
|
||||
"+.......+..+..",
|
||||
"+.......+..+..",
|
||||
"+.......+..+..",
|
||||
"+....+++++++++",
|
||||
"+....+++++++++",
|
||||
"+......+..+...",
|
||||
"+......+..+...",
|
||||
"+......+..+...",
|
||||
"+......+..+...",
|
||||
"+...+++++++++.",
|
||||
"+...+++++++++.",
|
||||
"+.....+..+....",
|
||||
"+.....+..+....",
|
||||
"+.....+..+....",
|
||||
"+.............",
|
||||
"++++++++++++++"};
|
||||
23
symbols/dolbydigital.xpm
Normal file
23
symbols/dolbydigital.xpm
Normal file
@@ -0,0 +1,23 @@
|
||||
/* XPM */
|
||||
static const char *const dolbydigital_xpm[] = {
|
||||
"31 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"+++++++++++++++++++++++++++++++",
|
||||
"+.............................+",
|
||||
"+...+++++++++++.+++++++++++...+",
|
||||
"+...++.++++++++.++++++++.++...+",
|
||||
"+...++...++++++.++++++...++...+",
|
||||
"+...++.....++++.++++.....++...+",
|
||||
"+...++......+++.+++......++...+",
|
||||
"+...++.......++.++.......++...+",
|
||||
"+...++.......++.++.......++...+",
|
||||
"+...++.......++.++.......++...+",
|
||||
"+...++.......++.++.......++...+",
|
||||
"+...++......+++.+++......++...+",
|
||||
"+...++.....++++.++++.....++...+",
|
||||
"+...++...++++++.++++++...++...+",
|
||||
"+...++.++++++++.++++++++.++...+",
|
||||
"+...+++++++++++.+++++++++++...+",
|
||||
"+.............................+",
|
||||
"+++++++++++++++++++++++++++++++"};
|
||||
23
symbols/dolbydigital20.xpm
Normal file
23
symbols/dolbydigital20.xpm
Normal file
@@ -0,0 +1,23 @@
|
||||
/* XPM */
|
||||
static const char *const dolbydigital20_xpm[] = {
|
||||
"55 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"+++++++++++++++++++++++++++++++++++++++++++++++++++++++",
|
||||
"+.....................................................+",
|
||||
"+...+++++++++++.+++++++++++.....++++.........++++.....+",
|
||||
"+...++.++++++++.++++++++.++...+++++++.......++++++....+",
|
||||
"+...++...++++++.++++++...++...++....++......++..++....+",
|
||||
"+...++.....++++.++++.....++.........++.....++....++...+",
|
||||
"+...++......+++.+++......++.........++.....++....++...+",
|
||||
"+...++.......++.++.......++........+++.....++....++...+",
|
||||
"+...++.......++.++.......++.......+++......++....++...+",
|
||||
"+...++.......++.++.......++......+++.......++....++...+",
|
||||
"+...++.......++.++.......++.....+++........++....++...+",
|
||||
"+...++......+++.+++......++....+++.........++....++...+",
|
||||
"+...++.....++++.++++.....++...+++..........++....++...+",
|
||||
"+...++...++++++.++++++...++...++............++..++....+",
|
||||
"+...++.++++++++.++++++++.++...++++++++..++..++++++....+",
|
||||
"+...+++++++++++.+++++++++++...++++++++..++...++++.....+",
|
||||
"+.....................................................+",
|
||||
"+++++++++++++++++++++++++++++++++++++++++++++++++++++++"};
|
||||
23
symbols/dolbydigital51.xpm
Normal file
23
symbols/dolbydigital51.xpm
Normal file
@@ -0,0 +1,23 @@
|
||||
/* XPM */
|
||||
static const char *const dolbydigital51_xpm[] = {
|
||||
"51 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"+++++++++++++++++++++++++++++++++++++++++++++++++++",
|
||||
"+.................................................+",
|
||||
"+...+++++++++++.+++++++++++...+++++++........++...+",
|
||||
"+...++.++++++++.++++++++.++...+++++++.....+++++...+",
|
||||
"+...++...++++++.++++++...++...++..........+++++...+",
|
||||
"+...++.....++++.++++.....++...++.............++...+",
|
||||
"+...++......+++.+++......++...++++++.........++...+",
|
||||
"+...++.......++.++.......++...+++++++........++...+",
|
||||
"+...++.......++.++.......++...++...+++.......++...+",
|
||||
"+...++.......++.++.......++.........++.......++...+",
|
||||
"+...++.......++.++.......++.........++.......++...+",
|
||||
"+...++......+++.+++......++.........++.......++...+",
|
||||
"+...++.....++++.++++.....++...++....++.......++...+",
|
||||
"+...++...++++++.++++++...++...++...+++.......++...+",
|
||||
"+...++.++++++++.++++++++.++...+++++++...++...++...+",
|
||||
"+...+++++++++++.+++++++++++....+++++....++...++...+",
|
||||
"+.................................................+",
|
||||
"+++++++++++++++++++++++++++++++++++++++++++++++++++"};
|
||||
23
symbols/five.xpm
Normal file
23
symbols/five.xpm
Normal file
@@ -0,0 +1,23 @@
|
||||
/* XPM */
|
||||
static const char *const five_xpm[] = {
|
||||
"15 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"+++++++++++++++",
|
||||
"..............+",
|
||||
"...+++++++....+",
|
||||
"...+++++++....+",
|
||||
"...++.........+",
|
||||
"...++.........+",
|
||||
"...++.........+",
|
||||
"...++++++.....+",
|
||||
"...+++++++....+",
|
||||
"...++...+++...+",
|
||||
".........++...+",
|
||||
".........++...+",
|
||||
"...++....++...+",
|
||||
"...++...+++...+",
|
||||
"...+++++++....+",
|
||||
"....+++++.....+",
|
||||
"..............+",
|
||||
"+++++++++++++++"};
|
||||
23
symbols/four.xpm
Normal file
23
symbols/four.xpm
Normal file
@@ -0,0 +1,23 @@
|
||||
/* XPM */
|
||||
static const char *const four_xpm[] = {
|
||||
"15 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"+++++++++++++++",
|
||||
"..............+",
|
||||
".........++...+",
|
||||
"........+++...+",
|
||||
".......++++...+",
|
||||
"......++.++...+",
|
||||
".....++..++...+",
|
||||
".....++..++...+",
|
||||
"....++...++...+",
|
||||
"...++....++...+",
|
||||
"...+++++++++..+",
|
||||
"...+++++++++..+",
|
||||
".........++...+",
|
||||
".........++...+",
|
||||
".........++...+",
|
||||
".........++...+",
|
||||
"..............+",
|
||||
"+++++++++++++++"};
|
||||
24
symbols/lock.xpm
Normal file
24
symbols/lock.xpm
Normal file
@@ -0,0 +1,24 @@
|
||||
/* XPM */
|
||||
static const char *const lock_xpm[] = {
|
||||
"96 19 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
|
||||
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
|
||||
"++............................................................................................++",
|
||||
"++............................................................................................++",
|
||||
"++........................+++........+++++........+++++.....+++....+++........................++",
|
||||
"++........................+++.......++++++++.....+++++++....+++...+++.........................++",
|
||||
"++........................+++.......+++..+++.....+++.++++...+++..+++..........................++",
|
||||
"++........................+++......+++....+++...+++...++....+++.+++...........................++",
|
||||
"++........................+++......+++....+++...+++.........+++++++...........................++",
|
||||
"++........................+++......+++....+++...+++.........++++.+++..........................++",
|
||||
"++........................+++......+++....+++...+++.........+++..+++..........................++",
|
||||
"++........................+++......+++....+++...+++...++....+++...+++.........................++",
|
||||
"++........................+++.......+++..+++.....+++.++++...+++...+++.........................++",
|
||||
"++........................+++++++...++++++++.....+++++++....+++....+++........................++",
|
||||
"++........................+++++++.....++++........+++++.....+++.....+++.......................++",
|
||||
"++............................................................................................++",
|
||||
"++............................................................................................++",
|
||||
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
|
||||
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"};
|
||||
23
symbols/monoleft.xpm
Normal file
23
symbols/monoleft.xpm
Normal file
@@ -0,0 +1,23 @@
|
||||
/* XPM */
|
||||
static const char *const monoleft_xpm[] = {
|
||||
"17 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"+++++++++++++++++",
|
||||
"+................",
|
||||
"+...++...........",
|
||||
"+...++++.........",
|
||||
"+...++++++.......",
|
||||
"+...++++++++.....",
|
||||
"+...+++++++++++++",
|
||||
"+...+++++++++++++",
|
||||
"+...+++++++++..++",
|
||||
"+...+++++++++..++",
|
||||
"+...+++++++++++++",
|
||||
"+...+++++++++++++",
|
||||
"+...++++++++.....",
|
||||
"+...++++++.......",
|
||||
"+...++++.........",
|
||||
"+...+++..........",
|
||||
"+................",
|
||||
"+++++++++++++++++"};
|
||||
23
symbols/monoright.xpm
Normal file
23
symbols/monoright.xpm
Normal file
@@ -0,0 +1,23 @@
|
||||
/* XPM */
|
||||
static const char *const monoright_xpm[] = {
|
||||
"17 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"+++++++++++++++++",
|
||||
"+................",
|
||||
"+..............++",
|
||||
"+............++++",
|
||||
"+..........++++++",
|
||||
"+........++++++++",
|
||||
"+...+++++++++++++",
|
||||
"+...+++++++++++++",
|
||||
"+...++..+++++++++",
|
||||
"+...++..+++++++++",
|
||||
"+...+++++++++++++",
|
||||
"+...+++++++++++++",
|
||||
"+........++++++++",
|
||||
"+..........++++++",
|
||||
"+............++++",
|
||||
"+.............+++",
|
||||
"+................",
|
||||
"+++++++++++++++++"};
|
||||
@@ -1,23 +1,23 @@
|
||||
/* XPM */
|
||||
static char * ntsc_xpm[] = {
|
||||
"38 18 2 1",
|
||||
static const char *const ntsc_xpm[] = {
|
||||
"19 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"......................................",
|
||||
"......................................",
|
||||
"..++....++.++++++++..+++++....+++++...",
|
||||
"..++....++.++++++++.+++++++..+++++++..",
|
||||
"..+++...++....++....++...++..++...++..",
|
||||
"..+++...++....++....++...++..++...++..",
|
||||
"..++++..++....++....++.......++.......",
|
||||
"..++++..++....++....++++.....++.......",
|
||||
"..++.++.++....++.....+++++...++.......",
|
||||
"..++.++.++....++.......++++..++.......",
|
||||
"..++..++++....++.........++..++.......",
|
||||
"..++..++++....++....++...++..++...++..",
|
||||
"..++...+++....++....++...++..++...++..",
|
||||
"..++...+++....++....++...++..++...++..",
|
||||
"..++....++....++....+++++++..+++++++..",
|
||||
"..++....++....++.....+++++....+++++...",
|
||||
"......................................",
|
||||
"......................................"};
|
||||
"+++++++++++++++++++",
|
||||
"+.................+",
|
||||
"+...++.......++...+",
|
||||
"+...+++......++...+",
|
||||
"+...++++.....++...+",
|
||||
"+...++++.....++...+",
|
||||
"+...++.++....++...+",
|
||||
"+...++..++...++...+",
|
||||
"+...++..++...++...+",
|
||||
"+...++...++..++...+",
|
||||
"+...++...++..++...+",
|
||||
"+...++....++.++...+",
|
||||
"+...++.....++++...+",
|
||||
"+...++.....++++...+",
|
||||
"+...++......+++...+",
|
||||
"+...++.......++...+",
|
||||
"+.................+",
|
||||
"+++++++++++++++++++"};
|
||||
|
||||
23
symbols/one.xpm
Normal file
23
symbols/one.xpm
Normal file
@@ -0,0 +1,23 @@
|
||||
/* XPM */
|
||||
static const char *const one_xpm[] = {
|
||||
"15 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"+++++++++++++++",
|
||||
"..............+",
|
||||
".......++.....+",
|
||||
"....+++++.....+",
|
||||
"....+++++.....+",
|
||||
".......++.....+",
|
||||
".......++.....+",
|
||||
".......++.....+",
|
||||
".......++.....+",
|
||||
".......++.....+",
|
||||
".......++.....+",
|
||||
".......++.....+",
|
||||
".......++.....+",
|
||||
".......++.....+",
|
||||
".......++.....+",
|
||||
".......++.....+",
|
||||
"..............+",
|
||||
"+++++++++++++++"};
|
||||
@@ -1,23 +1,23 @@
|
||||
/* XPM */
|
||||
static char * pal_xpm[] = {
|
||||
"30 18 2 1",
|
||||
static const char *const pal_xpm[] = {
|
||||
"18 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"..............................",
|
||||
"..............................",
|
||||
"..+++++++....+++++...++.......",
|
||||
"..+++..+++..+++++++..++.......",
|
||||
"..++....++..++...++..++.......",
|
||||
"..++....++.+++...+++.++.......",
|
||||
"..++....++.++.....++.++.......",
|
||||
"..++....++.++.....++.++.......",
|
||||
"..++....++.++.....++.++.......",
|
||||
"..+++..+++.+++++++++.++.......",
|
||||
"..+++++++..+++++++++.++.......",
|
||||
"..++.......++.....++.++.......",
|
||||
"..++.......++.....++.++.......",
|
||||
"..++.......++.....++.++.......",
|
||||
"..++.......++.....++.+++++++..",
|
||||
"..++.......++.....++.+++++++..",
|
||||
"..............................",
|
||||
".............................."};
|
||||
"++++++++++++++++++",
|
||||
"+................+",
|
||||
"+...++++++++.....+",
|
||||
"+...+++++++++....+",
|
||||
"+...++.....+++...+",
|
||||
"+...++......++...+",
|
||||
"+...++......++...+",
|
||||
"+...++.....+++...+",
|
||||
"+...+++++++++....+",
|
||||
"+...++++++++.....+",
|
||||
"+...++...........+",
|
||||
"+...++...........+",
|
||||
"+...++...........+",
|
||||
"+...++...........+",
|
||||
"+...++...........+",
|
||||
"+...++...........+",
|
||||
"+................+",
|
||||
"++++++++++++++++++"};
|
||||
|
||||
24
symbols/signal.xpm
Normal file
24
symbols/signal.xpm
Normal file
@@ -0,0 +1,24 @@
|
||||
/* XPM */
|
||||
static const char *const signal_xpm[] = {
|
||||
"96 19 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
|
||||
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
|
||||
"++............................................................................................++",
|
||||
"++............................................................................................++",
|
||||
"++.................+++++....+++......+++++.....+++....+++.....+++++.....+++...................++",
|
||||
"++...............++++++++...+++....++++++++....++++...+++.....+++++.....+++...................++",
|
||||
"++...............+++..+++...+++....+++..++++...+++++..+++.....+++++.....+++...................++",
|
||||
"++...............+++........+++...+++....++....+++++..+++....+++.+++....+++...................++",
|
||||
"++...............++++++.....+++...+++..........++++++.+++....+++.+++....+++...................++",
|
||||
"++................++++++....+++...+++..+++++...+++.++.+++....+++.+++....+++...................++",
|
||||
"++..................+++++...+++...+++..+++++...+++.++++++...+++...+++...+++...................++",
|
||||
"++...............+++..+++...+++...+++....+++...+++..+++++...+++++++++...+++...................++",
|
||||
"++...............+++..+++...+++....+++...+++...+++..+++++...+++++++++...+++...................++",
|
||||
"++................++++++....+++....+++++++++...+++...++++..+++.....+++..+++++++...............++",
|
||||
"++.................++++.....+++......+++++.....+++....+++..+++.....+++..+++++++...............++",
|
||||
"++............................................................................................++",
|
||||
"++............................................................................................++",
|
||||
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
|
||||
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"};
|
||||
23
symbols/stereo.xpm
Normal file
23
symbols/stereo.xpm
Normal file
@@ -0,0 +1,23 @@
|
||||
/* XPM */
|
||||
static const char *const stereo_xpm[] = {
|
||||
"17 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"+++++++++++++++++",
|
||||
"+................",
|
||||
"+..............++",
|
||||
"+............++++",
|
||||
"+..........+++.++",
|
||||
"+........+++...++",
|
||||
"+...+++++++....++",
|
||||
"+...++++++.....++",
|
||||
"+...++..++.....++",
|
||||
"+...++..++.....++",
|
||||
"+...++++++.....++",
|
||||
"+...+++++++....++",
|
||||
"+........+++...++",
|
||||
"+..........+++.++",
|
||||
"+............++++",
|
||||
"+.............+++",
|
||||
"+................",
|
||||
"+++++++++++++++++"};
|
||||
23
symbols/svdrp.xpm
Normal file
23
symbols/svdrp.xpm
Normal file
@@ -0,0 +1,23 @@
|
||||
/* XPM */
|
||||
static const char *const svdrp_xpm[] = {
|
||||
"60 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
|
||||
"+..........................................................+",
|
||||
"+.....+++++....++....++...++++++.....++++++.....++++++.....+",
|
||||
"+....+++++++...++....++...+++++++....+++++++....+++++++....+",
|
||||
"+...+++...++...++....++...++...+++...++...+++...++...+++...+",
|
||||
"+...++....++...++....++...++....++...++....++...++....++...+",
|
||||
"+...++.........++....++...++....++...++....++...++....++...+",
|
||||
"+...+++.........++..++....++....++...++...+++...++...+++...+",
|
||||
"+....+++++......++..++....++....++...+++++++....+++++++....+",
|
||||
"+.....+++++.....++..++....++....++...++++++.....++++++.....+",
|
||||
"+........+++....++..++....++....++...++...++....++.........+",
|
||||
"+.........++.....++++.....++....++...++...++....++.........+",
|
||||
"+...++....++.....++++.....++....++...++...++....++.........+",
|
||||
"+...++...+++......++......++...+++...++....++...++.........+",
|
||||
"+...+++++++.......++......+++++++....++....++...++.........+",
|
||||
"+....+++++........++......++++++.....++....++...++.........+",
|
||||
"+..........................................................+",
|
||||
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"};
|
||||
24
symbols/sync.xpm
Normal file
24
symbols/sync.xpm
Normal file
@@ -0,0 +1,24 @@
|
||||
/* XPM */
|
||||
static const char *const sync_xpm[] = {
|
||||
"96 19 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
|
||||
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
|
||||
"++............................................................................................++",
|
||||
"++............................................................................................++",
|
||||
"++.........................+++++...+++.....+++..+++....+++.....+++++..........................++",
|
||||
"++.......................++++++++...+++...+++...++++...+++....+++++++.........................++",
|
||||
"++.......................+++..+++....+++.+++....+++++..+++....+++.++++........................++",
|
||||
"++.......................+++.........+++.+++....+++++..+++...+++...++.........................++",
|
||||
"++.......................++++++.......+++++.....++++++.+++...+++..............................++",
|
||||
"++........................++++++......+++++.....+++.++.+++...+++..............................++",
|
||||
"++..........................+++++......+++......+++.++++++...+++..............................++",
|
||||
"++.......................+++..+++......+++......+++..+++++...+++...++.........................++",
|
||||
"++.......................+++..+++......+++......+++..+++++....+++.++++........................++",
|
||||
"++........................++++++.......+++......+++...++++....+++++++.........................++",
|
||||
"++.........................++++........+++......+++....+++.....+++++..........................++",
|
||||
"++............................................................................................++",
|
||||
"++............................................................................................++",
|
||||
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
|
||||
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"};
|
||||
23
symbols/three.xpm
Normal file
23
symbols/three.xpm
Normal file
@@ -0,0 +1,23 @@
|
||||
/* XPM */
|
||||
static const char *const three_xpm[] = {
|
||||
"15 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"+++++++++++++++",
|
||||
"..............+",
|
||||
".....+++++....+",
|
||||
"....+++++++...+",
|
||||
"...++....++...+",
|
||||
"...++....++...+",
|
||||
".........++...+",
|
||||
"........++....+",
|
||||
"......+++.....+",
|
||||
"......++++....+",
|
||||
"........+++...+",
|
||||
".........++...+",
|
||||
"...++....++...+",
|
||||
"...++...+++...+",
|
||||
"....++++++....+",
|
||||
".....++++.....+",
|
||||
"..............+",
|
||||
"+++++++++++++++"};
|
||||
23
symbols/two.xpm
Normal file
23
symbols/two.xpm
Normal file
@@ -0,0 +1,23 @@
|
||||
/* XPM */
|
||||
static const char *const two_xpm[] = {
|
||||
"15 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"+++++++++++++++",
|
||||
"..............+",
|
||||
".....++++.....+",
|
||||
"...+++++++....+",
|
||||
"...++....++...+",
|
||||
".........++...+",
|
||||
".........++...+",
|
||||
"........+++...+",
|
||||
".......+++....+",
|
||||
"......+++.....+",
|
||||
".....+++......+",
|
||||
"....+++.......+",
|
||||
"...+++........+",
|
||||
"...++.........+",
|
||||
"...++++++++...+",
|
||||
"...++++++++...+",
|
||||
"..............+",
|
||||
"+++++++++++++++"};
|
||||
24
symbols/viterbi.xpm
Normal file
24
symbols/viterbi.xpm
Normal file
@@ -0,0 +1,24 @@
|
||||
/* XPM */
|
||||
static const char *const viterbi_xpm[] = {
|
||||
"96 19 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
|
||||
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
|
||||
"++............................................................................................++",
|
||||
"++............................................................................................++",
|
||||
"++............+++.....+++..+++...+++++++++..++++++++...++++++++....++++++++....+++............++",
|
||||
"++.............++.....++...+++...+++++++++..++++++++...+++++++++...+++++++++...+++............++",
|
||||
"++.............+++...+++...+++......+++.....+++........+++...+++...+++...+++...+++............++",
|
||||
"++.............+++...+++...+++......+++.....+++........+++...+++...+++...+++...+++............++",
|
||||
"++..............++...++....+++......+++.....+++++++....++++++++....++++++++....+++............++",
|
||||
"++..............+++.+++....+++......+++.....+++++++....+++++++.....++++++++....+++............++",
|
||||
"++..............+++.+++....+++......+++.....+++........+++..+++....+++...+++...+++............++",
|
||||
"++...............++.++.....+++......+++.....+++........+++..+++....+++...+++...+++............++",
|
||||
"++...............+++++.....+++......+++.....+++........+++...+++...+++...+++...+++............++",
|
||||
"++...............+++++.....+++......+++.....++++++++...+++...+++...+++++++++...+++............++",
|
||||
"++................+++......+++......+++.....++++++++...+++....+++..++++++++....+++............++",
|
||||
"++............................................................................................++",
|
||||
"++............................................................................................++",
|
||||
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
|
||||
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"};
|
||||
23
symbols/zero.xpm
Normal file
23
symbols/zero.xpm
Normal file
@@ -0,0 +1,23 @@
|
||||
/* XPM */
|
||||
static const char *const zero_xpm[] = {
|
||||
"15 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"+++++++++++++++",
|
||||
"..............+",
|
||||
".....++++.....+",
|
||||
"....++++++....+",
|
||||
"....++..++....+",
|
||||
"...++....++...+",
|
||||
"...++....++...+",
|
||||
"...++....++...+",
|
||||
"...++....++...+",
|
||||
"...++....++...+",
|
||||
"...++....++...+",
|
||||
"...++....++...+",
|
||||
"...++....++...+",
|
||||
"....++..++....+",
|
||||
"....++++++....+",
|
||||
".....++++.....+",
|
||||
"..............+",
|
||||
"+++++++++++++++"};
|
||||
Reference in New Issue
Block a user