mirror of
https://gitlab1.ptb.de/waltem01/Matrix
synced 2024-12-26 03:51:45 +00:00
delete bundled dependencies in favor of installation instructions
This commit is contained in:
parent
11a8d6d473
commit
dac82b5a5b
@ -11,6 +11,8 @@ This is a REST API to access the Raspberry PI RGB LED Matrix over HTTP.
|
|||||||
3. Download repository with `git clone https://gitlab1.ptb.de/waltem01/Matrix.git`
|
3. Download repository with `git clone https://gitlab1.ptb.de/waltem01/Matrix.git`
|
||||||
4. Navigate to the API directory with `cd API/`
|
4. Navigate to the API directory with `cd API/`
|
||||||
|
|
||||||
|
**Note:** For further instructions and examples, especially for further development, please refer to the documentation of the [library](https://github.com/hzeller/rpi-rgb-led-matrix/blob/master/bindings/python/samples/).
|
||||||
|
|
||||||
## Running
|
## Running
|
||||||
|
|
||||||
**Note:** Once run, you should not simply kill the process. Graceful shutdown is work-in-progress.
|
**Note:** Once run, you should not simply kill the process. Graceful shutdown is work-in-progress.
|
||||||
|
@ -1,10 +0,0 @@
|
|||||||
## About
|
|
||||||
|
|
||||||
This directory contains dependencies and examples for usage in, with and along the Matrix:
|
|
||||||
|
|
||||||
- `librgbmatrix.so`: Main Matrix library
|
|
||||||
- `samplebase.py`: Contains a class to access Matrix and variables directly
|
|
||||||
|
|
||||||
## Inner workings and Wiring
|
|
||||||
|
|
||||||
For reference to the inner workings of the `librgbmatrix.so` library and how to wire a Raspberry PI to a RGB LED Matrix, please see [here](https://github.com/hzeller/rpi-rgb-led-matrix/blob/master/wiring.md#connection).
|
|
140567
API/deps/fonts/10x20.bdf
140567
API/deps/fonts/10x20.bdf
File diff suppressed because it is too large
Load Diff
11981
API/deps/fonts/4x6.bdf
11981
API/deps/fonts/4x6.bdf
File diff suppressed because it is too large
Load Diff
25905
API/deps/fonts/5x7.bdf
25905
API/deps/fonts/5x7.bdf
File diff suppressed because it is too large
Load Diff
21422
API/deps/fonts/5x8.bdf
21422
API/deps/fonts/5x8.bdf
File diff suppressed because it is too large
Load Diff
31042
API/deps/fonts/6x10.bdf
31042
API/deps/fonts/6x10.bdf
File diff suppressed because it is too large
Load Diff
86121
API/deps/fonts/6x12.bdf
86121
API/deps/fonts/6x12.bdf
File diff suppressed because it is too large
Load Diff
82452
API/deps/fonts/6x13.bdf
82452
API/deps/fonts/6x13.bdf
File diff suppressed because it is too large
Load Diff
25672
API/deps/fonts/6x13B.bdf
25672
API/deps/fonts/6x13B.bdf
File diff suppressed because it is too large
Load Diff
15432
API/deps/fonts/6x13O.bdf
15432
API/deps/fonts/6x13O.bdf
File diff suppressed because it is too large
Load Diff
20768
API/deps/fonts/6x9.bdf
20768
API/deps/fonts/6x9.bdf
File diff suppressed because it is too large
Load Diff
64553
API/deps/fonts/7x13.bdf
64553
API/deps/fonts/7x13.bdf
File diff suppressed because it is too large
Load Diff
20093
API/deps/fonts/7x13B.bdf
20093
API/deps/fonts/7x13B.bdf
File diff suppressed because it is too large
Load Diff
16653
API/deps/fonts/7x13O.bdf
16653
API/deps/fonts/7x13O.bdf
File diff suppressed because it is too large
Load Diff
54128
API/deps/fonts/7x14.bdf
54128
API/deps/fonts/7x14.bdf
File diff suppressed because it is too large
Load Diff
21221
API/deps/fonts/7x14B.bdf
21221
API/deps/fonts/7x14B.bdf
File diff suppressed because it is too large
Load Diff
74092
API/deps/fonts/8x13.bdf
74092
API/deps/fonts/8x13.bdf
File diff suppressed because it is too large
Load Diff
22852
API/deps/fonts/8x13B.bdf
22852
API/deps/fonts/8x13B.bdf
File diff suppressed because it is too large
Load Diff
25932
API/deps/fonts/8x13O.bdf
25932
API/deps/fonts/8x13O.bdf
File diff suppressed because it is too large
Load Diff
105126
API/deps/fonts/9x15.bdf
105126
API/deps/fonts/9x15.bdf
File diff suppressed because it is too large
Load Diff
37168
API/deps/fonts/9x15B.bdf
37168
API/deps/fonts/9x15B.bdf
File diff suppressed because it is too large
Load Diff
119182
API/deps/fonts/9x18.bdf
119182
API/deps/fonts/9x18.bdf
File diff suppressed because it is too large
Load Diff
19082
API/deps/fonts/9x18B.bdf
19082
API/deps/fonts/9x18B.bdf
File diff suppressed because it is too large
Load Diff
@ -1,42 +0,0 @@
|
|||||||
The identity of the designer(s) of the original ASCII repertoire and
|
|
||||||
the later Latin-1 extension of the misc-fixed BDF fonts appears to
|
|
||||||
have been lost in history. (It is likely that many of these 7-bit
|
|
||||||
ASCII fonts were created in the early or mid 1980s as part of MIT's
|
|
||||||
Project Athena, or at its industrial partner, DEC.)
|
|
||||||
|
|
||||||
In 1997, Markus Kuhn at the University of Cambridge Computer
|
|
||||||
Laboratory initiated and headed a project to extend the misc-fixed BDF
|
|
||||||
fonts to as large a subset of Unicode/ISO 10646 as is feasible for
|
|
||||||
each of the available font sizes, as part of a wider effort to
|
|
||||||
encourage users of POSIX systems to migrate from ISO 8859 to UTF-8.
|
|
||||||
|
|
||||||
Robert Brady <rwb197@ecs.soton.ac.uk> and Birger Langkjer
|
|
||||||
<birger.langkjer@image.dk> contributed thousands of glyphs and made
|
|
||||||
very substantial contributions and improvements on almost all fonts.
|
|
||||||
Constantine Stathopoulos <cstath@irismedia.gr> contributed all the
|
|
||||||
Greek characters. Markus Kuhn <http://www.cl.cam.ac.uk/~mgk25/> did
|
|
||||||
most 6x13 glyphs and the italic fonts and provided many more glyphs,
|
|
||||||
coordination, and quality assurance for the other fonts. Mark Leisher
|
|
||||||
<mleisher@crl.nmsu.edu> contributed to 6x13 Armenian, Georgian, the
|
|
||||||
first version of Latin Extended Block A and some Cyrillic. Serge V.
|
|
||||||
Vakulenko <vak@crox.net.kiae.su> donated the original Cyrillic glyphs
|
|
||||||
from his 6x13 ISO 8859-5 font. Nozomi Ytow <nozomi@biol.tsukuba.ac.jp>
|
|
||||||
contributed 6x13 halfwidth Katakana. Henning Brunzel
|
|
||||||
<hbrunzel@meta-systems.de> contributed glyphs to 10x20.bdf. Theppitak
|
|
||||||
Karoonboonyanan <thep@linux.thai.net> contributed Thai for 7x13,
|
|
||||||
7x13B, 7x13O, 7x14, 7x14B, 8x13, 8x13B, 8x13O, 9x15, 9x15B, and 10x20.
|
|
||||||
Karl Koehler <koehler@or.uni-bonn.de> contributed Arabic to 9x15,
|
|
||||||
9x15B, and 10x20 and Roozbeh Pournader <roozbeh@sharif.ac.ir> and
|
|
||||||
Behdad Esfahbod revised and extended Arabic in 10x20. Raphael Finkel
|
|
||||||
<raphael@cs.uky.edu> revised Hebrew/Yiddish in 10x20. Jungshik Shin
|
|
||||||
<jshin@pantheon.yale.edu> prepared 18x18ko.bdf. Won-kyu Park
|
|
||||||
<wkpark@chem.skku.ac.kr> prepared the Hangul glyphs used in 12x13ja.
|
|
||||||
Janne V. Kujala <jvk@iki.fi> contributed 4x6. Daniel Yacob
|
|
||||||
<perl@geez.org> revised some Ethiopic glyphs. Ted Zlatanov
|
|
||||||
<tzz@lifelogs.com> did some 7x14. Mikael Öhman <micketeer@gmail.com>
|
|
||||||
worked on 6x12.
|
|
||||||
|
|
||||||
The fonts are still maintained by Markus Kuhn and the original
|
|
||||||
distribution can be found at:
|
|
||||||
|
|
||||||
http://www.cl.cam.ac.uk/~mgk25/ucs-fonts.html
|
|
@ -1,369 +0,0 @@
|
|||||||
|
|
||||||
Unicode versions of the X11 "misc-fixed-*" fonts
|
|
||||||
------------------------------------------------
|
|
||||||
|
|
||||||
Markus Kuhn <http://www.cl.cam.ac.uk/~mgk25/> -- 2008-04-21
|
|
||||||
|
|
||||||
|
|
||||||
This package contains the X Window System bitmap fonts
|
|
||||||
|
|
||||||
-Misc-Fixed-*-*-*--*-*-*-*-C-*-ISO10646-1
|
|
||||||
|
|
||||||
These are Unicode (ISO 10646-1) extensions of the classic ISO 8859-1
|
|
||||||
X11 terminal fonts that are widely used with many X11 applications
|
|
||||||
such as xterm, emacs, etc.
|
|
||||||
|
|
||||||
COVERAGE
|
|
||||||
--------
|
|
||||||
|
|
||||||
None of these fonts covers Unicode completely. Complete coverage
|
|
||||||
simply would not make much sense here. Unicode 5.1 contains over
|
|
||||||
100000 characters, and the large majority of them are
|
|
||||||
Chinese/Japanese/Korean Han ideographs (~70000) and Korean Hangul
|
|
||||||
Syllables (~11000) that cannot adequately be displayed in the small
|
|
||||||
pixel sizes of the fixed fonts. Similarly, Arabic characters are
|
|
||||||
difficult to fit nicely together with European characters into the
|
|
||||||
fixed character cells and X11 lacks the ligature substitution
|
|
||||||
mechanisms required for using Indic scripts.
|
|
||||||
|
|
||||||
Therefore these fonts primarily attempt to cover Unicode subsets that
|
|
||||||
fit together with European scripts. This includes the Latin, Greek,
|
|
||||||
Cyrillic, Armenian, Georgian, and Hebrew scripts, plus a lot of
|
|
||||||
linguistic, technical and mathematical symbols. Some of the fixed
|
|
||||||
fonts now also cover Arabic, Thai, Ethiopian, halfwidth Katakana, and
|
|
||||||
some other non-European scripts.
|
|
||||||
|
|
||||||
We have defined 3 different target character repertoires (ISO 10646-1
|
|
||||||
subsets) that the various fonts were checked against for minimal
|
|
||||||
guaranteed coverage:
|
|
||||||
|
|
||||||
TARGET1 617 characters
|
|
||||||
Covers all characters of ISO 8859 part 1-5,7-10,13-16,
|
|
||||||
CEN MES-1, ISO 6937, Microsoft CP1251/CP1252, DEC VT100
|
|
||||||
graphics symbols, and the replacement and default
|
|
||||||
character. It is intended for small bold, italic, and
|
|
||||||
proportional fonts, for which adding block graphics
|
|
||||||
characters would make little sense. This repertoire
|
|
||||||
covers the following ISO 10646-1:2000 collections
|
|
||||||
completely: 1-3, 8, 12.
|
|
||||||
|
|
||||||
TARGET2 886 characters
|
|
||||||
Adds to TARGET1 the characters of the Adobe/Microsoft
|
|
||||||
Windows Glyph List 4 (WGL4), plus a selected set of
|
|
||||||
mathematical characters (covering most of ISO 31-11
|
|
||||||
high-school level math symbols) and some combining
|
|
||||||
characters. It is intended to be covered by all normal
|
|
||||||
"fixed" fonts and covers all European IBM, Microsoft, and
|
|
||||||
Macintosh character sets. This repertoire covers the
|
|
||||||
following ISO 10646-1:2000 (including Amd 1:2002)
|
|
||||||
collections completely: 1-3, 8, 12, 33, 45.
|
|
||||||
|
|
||||||
TARGET3 3282 characters
|
|
||||||
|
|
||||||
Adds to TARGET2 all characters of all European scripts
|
|
||||||
(Latin, Greek, Cyrillic, Armenian, Georgian), all
|
|
||||||
phonetic alphabet symbols, many mathematical symbols
|
|
||||||
(including all those available in LaTeX), all typographic
|
|
||||||
punctuation, all box-drawing characters, control code
|
|
||||||
pictures, graphical shapes and some more that you would
|
|
||||||
expect in a very comprehensive Unicode 4.0 font for
|
|
||||||
European users. It is intended for some of the more
|
|
||||||
useful and more widely used normal "fixed" fonts. This
|
|
||||||
repertoire is, with two exceptions, a superset of all
|
|
||||||
graphical characters in CEN MES-3A and covers the
|
|
||||||
following ISO 10646-1:2000 (including Amd 1:2002)
|
|
||||||
collections completely: 1-12, 27, 30-31, 32 (only
|
|
||||||
graphical characters), 33-42, 44-47, 63, 65, 70 (only
|
|
||||||
graphical characters).
|
|
||||||
|
|
||||||
[The two MES-3A characters deliberately omitted are the
|
|
||||||
angle bracket characters U+2329 and U+232A. ISO and CEN
|
|
||||||
appears to have included these into collection 40 and
|
|
||||||
MES-3A by accident, because there they are the only
|
|
||||||
characters in the Unicode EastAsianWidth "wide" class.]
|
|
||||||
|
|
||||||
CURRENT STATUS:
|
|
||||||
|
|
||||||
6x13.bdf 8x13.bdf 9x15.bdf 9x18.bdf 10x20.bdf:
|
|
||||||
|
|
||||||
Complete (TARGET3 reached and checked)
|
|
||||||
|
|
||||||
5x7.bdf 5x8.bdf 6x9.bdf 6x10.bdf 6x12.bdf 7x13.bdf 7x14.bdf clR6x12.bdf:
|
|
||||||
|
|
||||||
Complete (TARGET2 reached and checked)
|
|
||||||
|
|
||||||
6x13B.bdf 7x13B.bdf 7x14B.bdf 8x13B.bdf 9x15B.bdf 9x18B.bdf:
|
|
||||||
|
|
||||||
Complete (TARGET1 reached and checked)
|
|
||||||
|
|
||||||
6x13O.bdf 7x13O.bdf 8x13O.bdf
|
|
||||||
|
|
||||||
Complete (TARGET1 minus Hebrew and block graphics)
|
|
||||||
|
|
||||||
[None of the above fonts contains any character that has in Unicode
|
|
||||||
the East Asian Width Property "W" or "F" assigned. This way, the
|
|
||||||
desired combination of "half-width" and "full-width" glyphs can be
|
|
||||||
achieved easily. Most font mechanisms display a character that is not
|
|
||||||
covered in a font by using a glyph from another font that appears
|
|
||||||
later in a priority list, which can be arranged to be a "full-width"
|
|
||||||
font.]
|
|
||||||
|
|
||||||
The supplement package
|
|
||||||
|
|
||||||
http://www.cl.cam.ac.uk/~mgk25/download/ucs-fonts-asian.tar.gz
|
|
||||||
|
|
||||||
contains the following additional square fonts with Han characters for
|
|
||||||
East Asian users:
|
|
||||||
|
|
||||||
12x13ja.bdf:
|
|
||||||
|
|
||||||
Covers TARGET2, JIS X 0208, Hangul, and a few more. This font is
|
|
||||||
primarily intended to provide Japanese full-width Hiragana,
|
|
||||||
Katakana, and Kanji for applications that take the remaining
|
|
||||||
("halfwidth") characters from 6x13.bdf. The Greek lowercase
|
|
||||||
characters in it are still a bit ugly and will need some work.
|
|
||||||
|
|
||||||
18x18ja.bdf:
|
|
||||||
|
|
||||||
Covers all JIS X 0208, JIS X 0212, GB 2312-80, KS X 1001:1992,
|
|
||||||
ISO 8859-1,2,3,4,5,7,9,10,15, CP437, CP850 and CP1252 characters,
|
|
||||||
plus a few more, where priority was given to Japanese han style
|
|
||||||
variants. This font should have everything needed to cover the
|
|
||||||
full ISO-2022-JP-2 (RFC 1554) repertoire. This font is primarily
|
|
||||||
intended to provide Japanese full-width Hiragana, Katakana, and
|
|
||||||
Kanji for applications that take the remaining ("halfwidth")
|
|
||||||
characters from 9x18.bdf.
|
|
||||||
|
|
||||||
18x18ko.bdf:
|
|
||||||
|
|
||||||
Covers the same repertoire as 18x18ja plus full coverage of all
|
|
||||||
Hangul syllables and priority was given to Hanja glyphs in the
|
|
||||||
unified CJK area as they are used for writing Korean.
|
|
||||||
|
|
||||||
The 9x18 and 6x12 fonts are recommended for use with overstriking
|
|
||||||
combining characters.
|
|
||||||
|
|
||||||
Bug reports, suggestions for improvement, and especially contributed
|
|
||||||
extensions are very welcome!
|
|
||||||
|
|
||||||
INSTALLATION
|
|
||||||
------------
|
|
||||||
|
|
||||||
You install the fonts under Unix roughly like this (details depending
|
|
||||||
on your system of course):
|
|
||||||
|
|
||||||
System-wide installation (root access required):
|
|
||||||
|
|
||||||
cd submission/
|
|
||||||
make
|
|
||||||
su
|
|
||||||
mv -b *.pcf.gz /usr/lib/X11/fonts/misc/
|
|
||||||
cd /usr/lib/X11/fonts/misc/
|
|
||||||
mkfontdir
|
|
||||||
xset fp rehash
|
|
||||||
|
|
||||||
Alternative: Installation in your private user directory:
|
|
||||||
|
|
||||||
cd submission/
|
|
||||||
make
|
|
||||||
mkdir -p ~/local/lib/X11/fonts/
|
|
||||||
mv *.pcf.gz ~/local/lib/X11/fonts/
|
|
||||||
cd ~/local/lib/X11/fonts/
|
|
||||||
mkfontdir
|
|
||||||
xset +fp ~/local/lib/X11/fonts (put this last line also in ~/.xinitrc)
|
|
||||||
|
|
||||||
Now you can have a look at say the 6x13 font with the command
|
|
||||||
|
|
||||||
xfd -fn '-misc-fixed-medium-r-semicondensed--13-120-75-75-c-60-iso10646-1'
|
|
||||||
|
|
||||||
If you want to have short names for the Unicode fonts, you can also
|
|
||||||
append the fonts.alias file to that in the directory where you install
|
|
||||||
the fonts, call "mkfontdir" and "xset fp rehash" again, and then you
|
|
||||||
can also write
|
|
||||||
|
|
||||||
xfd -fn 6x13U
|
|
||||||
|
|
||||||
Note: If you use an old version of xfontsel, you might notice that it
|
|
||||||
treats every font that contains characters >0x00ff as a Japanese JIS
|
|
||||||
font and therefore selects inappropriate sample characters for display
|
|
||||||
of ISO 10646-1 fonts. An updated xfontsel version with this bug fixed
|
|
||||||
comes with XFree86 4.0 / X11R6.8 or newer.
|
|
||||||
|
|
||||||
If you use the Exceed X server on Microsoft Windows, then you will
|
|
||||||
have to convert the BDF files into Microsoft FON files using the
|
|
||||||
"Compile Fonts" function of Exceed xconfig. See the file exceed.txt
|
|
||||||
for more information.
|
|
||||||
|
|
||||||
There is one significant efficiency problem that X11R6 has with the
|
|
||||||
sparsely populated ISO10646-1 fonts. X11 transmits and allocates 12
|
|
||||||
bytes with the XFontStruct data structure for the difference between
|
|
||||||
the lowest and the highest code value found in a font, no matter
|
|
||||||
whether the code positions in between are used for characters or not.
|
|
||||||
Even a tiny font that contains only two glyphs at positions 0x0000 and
|
|
||||||
0xfffd causes 12 bytes * 65534 codes = 786 kbytes to be requested and
|
|
||||||
stored by the client. Since all the ISO10646-1 BDF files provided in
|
|
||||||
this package contain characters in the U+00xx (ASCII) and U+ffxx
|
|
||||||
(ligatures, etc.) range, all of them would result in 786 kbyte large
|
|
||||||
XCharStruct arrays in the per_char array of the corresponding
|
|
||||||
XFontStruct (even for CharCell fonts!) when loaded by an X client.
|
|
||||||
Until this problem is fixed by extending the X11 font protocol and
|
|
||||||
implementation, non-CJK ISO10646-1 fonts that lack the (anyway not
|
|
||||||
very interesting) characters above U+31FF seem to be the best
|
|
||||||
compromise. The bdftruncate.pl program in this package can be used to
|
|
||||||
deactivate any glyphs above a threshold code value in BDF files. This
|
|
||||||
way, we get relatively memory-economic ISO10646-1 fonts that cause
|
|
||||||
"only" 150 kbyte large XCharStruct arrays to be allocated. The
|
|
||||||
deactivated glyphs are still present in the BDF files, but with an
|
|
||||||
encoding value of -1 that causes them to be ignored.
|
|
||||||
|
|
||||||
The ISO10646-1 fonts can not only be used directly by Unicode aware
|
|
||||||
software, they can also be used to create any 8-bit font. The
|
|
||||||
ucs2any.pl Perl script converts a ISO10646-1 BDF font into a BDF font
|
|
||||||
file with some different encoding. For instance the command
|
|
||||||
|
|
||||||
perl ucs2any.pl 6x13.bdf MAPPINGS/8859-7.TXT ISO8859-7
|
|
||||||
|
|
||||||
will generate the file 6x13-ISO8859-7.bdf according to the 8859-7.TXT
|
|
||||||
Latin/Greek mapping table, which available from
|
|
||||||
<ftp://ftp.unicode.org/Public/MAPPINGS/>. [The shell script
|
|
||||||
./map_fonts automatically generates a subdirectory derived-fonts/ with
|
|
||||||
many *.bdf and *.pcf.gz 8-bit versions of all the
|
|
||||||
-misc-fixed-*-iso10646-1 fonts.]
|
|
||||||
|
|
||||||
When you do a "make" in the submission/ subdirectory as suggested in
|
|
||||||
the installation instructions above, this will generate exactly the
|
|
||||||
set of fonts that have been submitted to the XFree86 project for
|
|
||||||
inclusion into XFree86 4.0. These consists of all the ISO10646-1 fonts
|
|
||||||
processed with "bdftruncate.pl U+3200" plus a selected set of derived
|
|
||||||
8-bit fonts generated with ucs2any.pl.
|
|
||||||
|
|
||||||
Every font comes with a *.repertoire-utf8 file that lists all the
|
|
||||||
characters in this font.
|
|
||||||
|
|
||||||
|
|
||||||
CONTRIBUTING
|
|
||||||
------------
|
|
||||||
|
|
||||||
If you want to help me in extending or improving the fonts, or if you
|
|
||||||
want to start your own ISO 10646-1 font project, you will have to edit
|
|
||||||
BDF font files. This is most comfortably done with the gbdfed font
|
|
||||||
editor (version 1.3 or higher), which is available from
|
|
||||||
|
|
||||||
http://crl.nmsu.edu/~mleisher/gbdfed.html
|
|
||||||
|
|
||||||
Once you are familiar with gbdfed, you will notice that it is no
|
|
||||||
problem to design up to 100 nice characters per hour (even more if
|
|
||||||
only placing accents is involved).
|
|
||||||
|
|
||||||
Information about other X11 font tools and Unicode fonts for X11 in
|
|
||||||
general can be found on
|
|
||||||
|
|
||||||
http://www.cl.cam.ac.uk/~mgk25/ucs-fonts.html
|
|
||||||
|
|
||||||
The latest version of this package is available from
|
|
||||||
|
|
||||||
http://www.cl.cam.ac.uk/~mgk25/download/ucs-fonts.tar.gz
|
|
||||||
|
|
||||||
If you want to contribute, then get the very latest version of this
|
|
||||||
package, check which glyphs are still missing or inappropriate for
|
|
||||||
your needs, and send me whatever you had the time to add and fix. Just
|
|
||||||
email me the extended BDF-files back, or even better, send me a patch
|
|
||||||
file of what you changed. The best way of preparing a patch file is
|
|
||||||
|
|
||||||
./touch_id newfile.bdf
|
|
||||||
diff -d -u -F STARTCHAR oldfile.bdf newfile.bdf >file.diff
|
|
||||||
|
|
||||||
which ensures that the patch file preserves information about which
|
|
||||||
exact version you worked on and what character each "hunk" changes.
|
|
||||||
|
|
||||||
I will try to update this packet on a daily basis. By sending me
|
|
||||||
extensions to these fonts, you agree that the resulting improved font
|
|
||||||
files will remain in the public domain for everyone's free use. Always
|
|
||||||
make sure to load the very latest version of the package immediately
|
|
||||||
before your start, and send me your results as soon as you are done,
|
|
||||||
in order to avoid revision overlaps with other contributors.
|
|
||||||
|
|
||||||
Please try to be careful with the glyphs you generate:
|
|
||||||
|
|
||||||
- Always look first at existing similar characters in order to
|
|
||||||
preserve a consistent look and feel for the entire font and
|
|
||||||
within the font family. For block graphics characters and geometric
|
|
||||||
symbols, take care of correct alignment.
|
|
||||||
|
|
||||||
- Read issues.txt, which contains some design hints for certain
|
|
||||||
characters.
|
|
||||||
|
|
||||||
- All characters of CharCell (C) fonts must strictly fit into
|
|
||||||
the pixel matrix and absolutely no out-of-box ink is allowed.
|
|
||||||
|
|
||||||
- The character cells will be displayed directly next to each other,
|
|
||||||
without any additional pixels in between. Therefore, always make
|
|
||||||
sure that at least the rightmost pixel column remains white, as
|
|
||||||
otherwise letters will stick together, except of course for
|
|
||||||
characters -- like Arabic or block graphics -- that are supposed to
|
|
||||||
stick together.
|
|
||||||
|
|
||||||
- Place accents as low as possible on the Latin characters.
|
|
||||||
|
|
||||||
- Try to keep the shape of accents consistent among each other and
|
|
||||||
with the combining characters in the U+03xx range.
|
|
||||||
|
|
||||||
- Use gbdfed only to edit the BDF file directly and do not import
|
|
||||||
the font that you want to edit from the X server. Use gbdfed 1.3
|
|
||||||
or higher.
|
|
||||||
|
|
||||||
- The glyph names should be the Adobe names for Unicode characters
|
|
||||||
defined at
|
|
||||||
|
|
||||||
http://www.adobe.com/devnet/opentype/archives/glyph.html
|
|
||||||
|
|
||||||
which gbdfed can set automatically. To make the Edit/Rename Glyphs/
|
|
||||||
Adobe Names function work, you have to download the file
|
|
||||||
|
|
||||||
http://www.adobe.com/devnet/opentype/archives/glyphlist.txt
|
|
||||||
|
|
||||||
and configure its location either in Edit/Preferences/Editing Options/
|
|
||||||
Adobe Glyph List, or as "adobe_name_file" in "~/.gbdfed".
|
|
||||||
|
|
||||||
- Be careful to not change the FONTBOUNDINGBOX box accidentally in
|
|
||||||
a patch.
|
|
||||||
|
|
||||||
You should have a copy of the ISO 10646 standard
|
|
||||||
|
|
||||||
ISO/IEC 10646:2003, Information technology -- Universal
|
|
||||||
Multiple-Octet Coded Character Set (UCS),
|
|
||||||
International Organization for Standardization, Geneva, 2003.
|
|
||||||
http://standards.iso.org/ittf/PubliclyAvailableStandards/
|
|
||||||
|
|
||||||
and/or the Unicode 5.0 book:
|
|
||||||
|
|
||||||
The Unicode Consortium: The Unicode Standard, Version 5.0,
|
|
||||||
Reading, MA, Addison-Wesley, 2006,
|
|
||||||
ISBN 9780321480910.
|
|
||||||
http://www.amazon.com/exec/obidos/ASIN/0321480910/mgk25
|
|
||||||
|
|
||||||
All these fonts are from time to time resubmitted to the X.Org
|
|
||||||
project, XFree86 (they have been in there since XFree86 4.0), and to
|
|
||||||
other X server developers for inclusion into their normal X11
|
|
||||||
distributions.
|
|
||||||
|
|
||||||
Starting with XFree86 4.0, xterm has included UTF-8 support. This
|
|
||||||
version is also available from
|
|
||||||
|
|
||||||
http://dickey.his.com/xterm/xterm.html
|
|
||||||
|
|
||||||
Please make the developer of your favourite software aware of the
|
|
||||||
UTF-8 definition in RFC 2279 and of the existence of this font
|
|
||||||
collection. For more information on how to use UTF-8, please check out
|
|
||||||
|
|
||||||
http://www.cl.cam.ac.uk/~mgk25/unicode.html
|
|
||||||
ftp://ftp.ilog.fr/pub/Users/haible/utf8/Unicode-HOWTO.html
|
|
||||||
|
|
||||||
where you will also find information on joining the
|
|
||||||
linux-utf8@nl.linux.org mailing list.
|
|
||||||
|
|
||||||
A number of UTF-8 example text files can be found in the examples/
|
|
||||||
subdirectory or on
|
|
||||||
|
|
||||||
http://www.cl.cam.ac.uk/~mgk25/ucs/examples/
|
|
||||||
|
|
@ -1,65 +0,0 @@
|
|||||||
## Provided fonts
|
|
||||||
|
|
||||||
These are BDF fonts, a simple bitmap font-format that can be created
|
|
||||||
by many font tools. Given that these are bitmap fonts, they will look good on
|
|
||||||
very low resolution screens such as the LED displays.
|
|
||||||
|
|
||||||
Fonts in this directory are public domain (see the [README](./README)) and
|
|
||||||
help you to get started with the font support in the API.
|
|
||||||
|
|
||||||
## Create your own
|
|
||||||
|
|
||||||
Fonts are in a human readable and editbable `*.bdf` format, but unless you
|
|
||||||
like reading and writing pixels in hex, generating them is probably easier :)
|
|
||||||
|
|
||||||
You can use any font-editor to generate a BDF font or use the conversion
|
|
||||||
tool [otf2bdf] to create one from some other font format.
|
|
||||||
|
|
||||||
Here is an example how you could create a 30pixel high BDF font from some
|
|
||||||
TrueType font:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
otf2bdf -v -o myfont.bdf -r 72 -p 30 /path/to/font-Bold.ttf
|
|
||||||
```
|
|
||||||
|
|
||||||
## Getting otf2bdf
|
|
||||||
|
|
||||||
Installing the tool should be fairly straight-foward
|
|
||||||
|
|
||||||
```
|
|
||||||
sudo apt-get install otf2bdf
|
|
||||||
```
|
|
||||||
|
|
||||||
## Compiling otf2bdf
|
|
||||||
|
|
||||||
If you like to compile otf2bdf, you might notice that the configure script
|
|
||||||
uses some old way of getting the freetype configuration. There does not seem
|
|
||||||
to be much activity on the mature code, so let's patch that first:
|
|
||||||
|
|
||||||
```
|
|
||||||
sudo apt-get install -y libfreetype6-dev pkg-config autoconf
|
|
||||||
git clone https://github.com/jirutka/otf2bdf.git # check it out
|
|
||||||
cd otf2bdf
|
|
||||||
patch -p1 <<"EOF"
|
|
||||||
--- a/configure.in
|
|
||||||
+++ b/configure.in
|
|
||||||
@@ -5,8 +5,8 @@ AC_INIT(otf2bdf.c)
|
|
||||||
AC_PROG_CC
|
|
||||||
|
|
||||||
OLDLIBS=$LIBS
|
|
||||||
-LIBS="$LIBS `freetype-config --libs`"
|
|
||||||
-CPPFLAGS="$CPPFLAGS `freetype-config --cflags`"
|
|
||||||
+LIBS="$LIBS `pkg-config freetype2 --libs`"
|
|
||||||
+CPPFLAGS="$CPPFLAGS `pkg-config freetype2 --cflags`"
|
|
||||||
AC_CHECK_LIB(freetype, FT_Init_FreeType, LIBS="$LIBS -lfreetype",[
|
|
||||||
AC_MSG_ERROR([Can't find Freetype library! Compile FreeType first.])])
|
|
||||||
AC_SUBST(LIBS)
|
|
||||||
EOF
|
|
||||||
|
|
||||||
autoconf # rebuild configure script
|
|
||||||
./configure # run configure
|
|
||||||
make # build the software
|
|
||||||
sudo make install # install it
|
|
||||||
```
|
|
||||||
|
|
||||||
[otf2bdf]: https://github.com/jirutka/otf2bdf
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@ -1,81 +0,0 @@
|
|||||||
import argparse
|
|
||||||
import time
|
|
||||||
import sys
|
|
||||||
import os
|
|
||||||
|
|
||||||
# sys.path.append(os.path.abspath(os.path.dirname(__file__) + '/..'))
|
|
||||||
from rgbmatrix import RGBMatrix, RGBMatrixOptions
|
|
||||||
|
|
||||||
|
|
||||||
class SampleBase(object):
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
self.parser = argparse.ArgumentParser()
|
|
||||||
|
|
||||||
self.parser.add_argument("-r", "--led-rows", action="store", help="Display rows. 16 for 16x32, 32 for 32x32. Default: 64", default=64, type=int)
|
|
||||||
self.parser.add_argument("--led-cols", action="store", help="Panel columns. Typically 32 or 64. (Default: 64)", default=64, type=int)
|
|
||||||
self.parser.add_argument("-c", "--led-chain", action="store", help="Daisy-chained boards. Default: 1.", default=1, type=int)
|
|
||||||
self.parser.add_argument("-P", "--led-parallel", action="store", help="For Plus-models or RPi2: parallel chains. 1..3. Default: 1", default=1, type=int)
|
|
||||||
self.parser.add_argument("-p", "--led-pwm-bits", action="store", help="Bits used for PWM. Something between 1..11. Default: 11", default=11, type=int)
|
|
||||||
self.parser.add_argument("-b", "--led-brightness", action="store", help="Sets brightness level. Default: 100. Range: 1..100", default=100, type=int)
|
|
||||||
self.parser.add_argument("-m", "--led-gpio-mapping", help="Hardware Mapping: regular, adafruit-hat, adafruit-hat-pwm", choices=['regular', 'regular-pi1', 'adafruit-hat', 'adafruit-hat-pwm'], default='adafruit-hat', type=str)
|
|
||||||
self.parser.add_argument("--led-scan-mode", action="store", help="Progressive or interlaced scan. 0 Progressive, 1 Interlaced (default)", default=1, choices=range(2), type=int)
|
|
||||||
self.parser.add_argument("--led-pwm-lsb-nanoseconds", action="store", help="Base time-unit for the on-time in the lowest significant bit in nanoseconds. Default: 130", default=130, type=int)
|
|
||||||
self.parser.add_argument("--led-show-refresh", action="store_true", help="Shows the current refresh rate of the LED panel")
|
|
||||||
self.parser.add_argument("--led-slowdown-gpio", action="store", help="Slow down writing to GPIO. Range: 0..4. Default: 1", default=4, type=int)
|
|
||||||
self.parser.add_argument("--led-no-hardware-pulse", action="store", help="Don't use hardware pin-pulse generation")
|
|
||||||
self.parser.add_argument("--led-rgb-sequence", action="store", help="Switch if your matrix has led colors swapped. Default: RGB", default="RGB", type=str)
|
|
||||||
self.parser.add_argument("--led-pixel-mapper", action="store", help="Apply pixel mappers. e.g \"Rotate:90\"", default="", type=str)
|
|
||||||
self.parser.add_argument("--led-row-addr-type", action="store", help="0 = default; 1=AB-addressed panels; 2=row direct; 3=ABC-addressed panels; 4 = ABC Shift + DE direct", default=0, type=int, choices=[0,1,2,3,4])
|
|
||||||
self.parser.add_argument("--led-multiplexing", action="store", help="Multiplexing type: 0=direct; 1=strip; 2=checker; 3=spiral; 4=ZStripe; 5=ZnMirrorZStripe; 6=coreman; 7=Kaler2Scan; 8=ZStripeUneven... (Default: 0)", default=0, type=int)
|
|
||||||
self.parser.add_argument("--led-panel-type", action="store", help="Needed to initialize special panels. Supported: 'FM6126A'", default="", type=str)
|
|
||||||
self.parser.add_argument("--led-no-drop-privs", dest="drop_privileges", help="Don't drop privileges from 'root' after initializing the hardware.", action='store_false')
|
|
||||||
self.parser.set_defaults(drop_privileges=True)
|
|
||||||
|
|
||||||
def usleep(self, value):
|
|
||||||
time.sleep(value / 1000000.0)
|
|
||||||
|
|
||||||
def run(self):
|
|
||||||
print("Running")
|
|
||||||
|
|
||||||
def process(self):
|
|
||||||
self.args = self.parser.parse_args()
|
|
||||||
|
|
||||||
options = RGBMatrixOptions()
|
|
||||||
|
|
||||||
if self.args.led_gpio_mapping != None:
|
|
||||||
options.hardware_mapping = self.args.led_gpio_mapping
|
|
||||||
options.rows = self.args.led_rows
|
|
||||||
options.cols = self.args.led_cols
|
|
||||||
options.chain_length = self.args.led_chain
|
|
||||||
options.parallel = self.args.led_parallel
|
|
||||||
options.row_address_type = self.args.led_row_addr_type
|
|
||||||
options.multiplexing = self.args.led_multiplexing
|
|
||||||
options.pwm_bits = self.args.led_pwm_bits
|
|
||||||
options.brightness = self.args.led_brightness
|
|
||||||
options.pwm_lsb_nanoseconds = self.args.led_pwm_lsb_nanoseconds
|
|
||||||
options.led_rgb_sequence = self.args.led_rgb_sequence
|
|
||||||
options.pixel_mapper_config = self.args.led_pixel_mapper
|
|
||||||
options.panel_type = self.args.led_panel_type
|
|
||||||
|
|
||||||
|
|
||||||
if self.args.led_show_refresh:
|
|
||||||
options.show_refresh_rate = 1
|
|
||||||
|
|
||||||
if self.args.led_slowdown_gpio != None:
|
|
||||||
options.gpio_slowdown = self.args.led_slowdown_gpio
|
|
||||||
if self.args.led_no_hardware_pulse:
|
|
||||||
options.disable_hardware_pulsing = True
|
|
||||||
if not self.args.drop_privileges:
|
|
||||||
options.drop_privileges=False
|
|
||||||
|
|
||||||
self.matrix = RGBMatrix(options = options)
|
|
||||||
|
|
||||||
try:
|
|
||||||
# Start loop
|
|
||||||
print("Press CTRL-C to stop sample")
|
|
||||||
self.run()
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
print("Exiting\n")
|
|
||||||
sys.exit(0)
|
|
||||||
|
|
||||||
return True
|
|
@ -1,37 +0,0 @@
|
|||||||
## About
|
|
||||||
|
|
||||||
These are basic example scripts on the usage of the Matrix itself.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
Unfortunately, there is no known way to run the provided scripts as is due to the projects directory structure. However, you can still run the scripts with a little bit of a workaround:
|
|
||||||
|
|
||||||
1. Copy the directory `deps/samples/` to some other, well known place
|
|
||||||
2. Copy the file `deps/samplebase.py` into the `samples` copy you just created
|
|
||||||
3. Find and replace all references to the common library `samplebase.py`:
|
|
||||||
|
|
||||||
- The erroneous imports should look like this:
|
|
||||||
|
|
||||||
```python
|
|
||||||
from ..samplebase import SampleBase
|
|
||||||
```
|
|
||||||
|
|
||||||
- And they should be replaced like this:
|
|
||||||
|
|
||||||
```python
|
|
||||||
from samplebase import SampleBase
|
|
||||||
```
|
|
||||||
|
|
||||||
4. Run any given sample script with the following template:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo python3 <script>.py
|
|
||||||
```
|
|
||||||
|
|
||||||
- **NOTE:** You may need to specify all kinds of different flags or arguments to run the matrix correctly. For usage, please refer to any of the scripts, followed by the flag `--help`
|
|
||||||
|
|
||||||
## Example Command
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo python rotating-block-generator.py --led-rows=64 --led-cols=64 --led-slowdown-gpio=5 --led-parallel=3 --led-chain=3 --led-gpio-mapping=regular
|
|
||||||
```
|
|
@ -1,32 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
from ..samplebase import SampleBase
|
|
||||||
from rgbmatrix import graphics
|
|
||||||
import time
|
|
||||||
|
|
||||||
|
|
||||||
class GraphicsTest(SampleBase):
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
super(GraphicsTest, self).__init__(*args, **kwargs)
|
|
||||||
|
|
||||||
def run(self):
|
|
||||||
canvas = self.matrix
|
|
||||||
font = graphics.Font()
|
|
||||||
font.LoadFont("../../../fonts/7x13.bdf")
|
|
||||||
|
|
||||||
red = graphics.Color(255, 0, 0)
|
|
||||||
graphics.DrawLine(canvas, 5, 5, 22, 13, red)
|
|
||||||
|
|
||||||
green = graphics.Color(0, 255, 0)
|
|
||||||
graphics.DrawCircle(canvas, 15, 15, 10, green)
|
|
||||||
|
|
||||||
blue = graphics.Color(0, 0, 255)
|
|
||||||
graphics.DrawText(canvas, font, 2, 10, blue, "Text")
|
|
||||||
|
|
||||||
time.sleep(10) # show display for 10 seconds before exit
|
|
||||||
|
|
||||||
|
|
||||||
# Main function
|
|
||||||
if __name__ == "__main__":
|
|
||||||
graphics_test = GraphicsTest()
|
|
||||||
if (not graphics_test.process()):
|
|
||||||
graphics_test.print_help()
|
|
@ -1,39 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
from ..samplebase import SampleBase
|
|
||||||
import time
|
|
||||||
|
|
||||||
|
|
||||||
class GrayscaleBlock(SampleBase):
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
super(GrayscaleBlock, self).__init__(*args, **kwargs)
|
|
||||||
|
|
||||||
def run(self):
|
|
||||||
sub_blocks = 16
|
|
||||||
width = self.matrix.width
|
|
||||||
height = self.matrix.height
|
|
||||||
x_step = max(1, width / sub_blocks)
|
|
||||||
y_step = max(1, height / sub_blocks)
|
|
||||||
count = 0
|
|
||||||
|
|
||||||
while True:
|
|
||||||
for y in range(0, height):
|
|
||||||
for x in range(0, width):
|
|
||||||
c = sub_blocks * int(y / y_step) + int(x / x_step)
|
|
||||||
if count % 4 == 0:
|
|
||||||
self.matrix.SetPixel(x, y, c, c, c)
|
|
||||||
elif count % 4 == 1:
|
|
||||||
self.matrix.SetPixel(x, y, c, 0, 0)
|
|
||||||
elif count % 4 == 2:
|
|
||||||
self.matrix.SetPixel(x, y, 0, c, 0)
|
|
||||||
elif count % 4 == 3:
|
|
||||||
self.matrix.SetPixel(x, y, 0, 0, c)
|
|
||||||
|
|
||||||
count += 1
|
|
||||||
time.sleep(2)
|
|
||||||
|
|
||||||
|
|
||||||
# Main function
|
|
||||||
if __name__ == "__main__":
|
|
||||||
grayscale_block = GrayscaleBlock()
|
|
||||||
if (not grayscale_block.process()):
|
|
||||||
grayscale_block.print_help()
|
|
@ -1,48 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
# (This is an example similar to an example from the Adafruit fork
|
|
||||||
# to show the similarities. Most important difference currently is, that
|
|
||||||
# this library wants RGB mode.)
|
|
||||||
#
|
|
||||||
# A more complex RGBMatrix example works with the Python Imaging Library,
|
|
||||||
# demonstrating a few graphics primitives and image loading.
|
|
||||||
# Note that PIL graphics do not have an immediate effect on the display --
|
|
||||||
# image is drawn into a separate buffer, which is then copied to the matrix
|
|
||||||
# using the SetImage() function (see examples below).
|
|
||||||
# Requires rgbmatrix.so present in the same directory.
|
|
||||||
|
|
||||||
# PIL Image module (create or load images) is explained here:
|
|
||||||
# http://effbot.org/imagingbook/image.htm
|
|
||||||
# PIL ImageDraw module (draw shapes to images) explained here:
|
|
||||||
# http://effbot.org/imagingbook/imagedraw.htm
|
|
||||||
|
|
||||||
from PIL import Image
|
|
||||||
from PIL import ImageDraw
|
|
||||||
import time
|
|
||||||
from rgbmatrix import RGBMatrix, RGBMatrixOptions
|
|
||||||
|
|
||||||
# Configuration for the matrix
|
|
||||||
options = RGBMatrixOptions()
|
|
||||||
options.rows = 32
|
|
||||||
options.chain_length = 1
|
|
||||||
options.parallel = 1
|
|
||||||
options.hardware_mapping = 'regular' # If you have an Adafruit HAT: 'adafruit-hat'
|
|
||||||
|
|
||||||
matrix = RGBMatrix(options = options)
|
|
||||||
|
|
||||||
# RGB example w/graphics prims.
|
|
||||||
# Note, only "RGB" mode is supported currently.
|
|
||||||
image = Image.new("RGB", (32, 32)) # Can be larger than matrix if wanted!!
|
|
||||||
draw = ImageDraw.Draw(image) # Declare Draw instance before prims
|
|
||||||
# Draw some shapes into image (no immediate effect on matrix)...
|
|
||||||
draw.rectangle((0, 0, 31, 31), fill=(0, 0, 0), outline=(0, 0, 255))
|
|
||||||
draw.line((0, 0, 31, 31), fill=(255, 0, 0))
|
|
||||||
draw.line((0, 31, 31, 0), fill=(0, 255, 0))
|
|
||||||
|
|
||||||
# Then scroll image across matrix...
|
|
||||||
for n in range(-32, 33): # Start off top-left, move off bottom-right
|
|
||||||
matrix.Clear()
|
|
||||||
matrix.SetImage(image, n, n)
|
|
||||||
time.sleep(0.05)
|
|
||||||
|
|
||||||
matrix.Clear()
|
|
@ -1,40 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
import time
|
|
||||||
from ..samplebase import SampleBase
|
|
||||||
from PIL import Image
|
|
||||||
|
|
||||||
|
|
||||||
class ImageScroller(SampleBase):
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
super(ImageScroller, self).__init__(*args, **kwargs)
|
|
||||||
self.parser.add_argument("-i", "--image", help="The image to display", default="../../../examples-api-use/runtext.ppm")
|
|
||||||
|
|
||||||
def run(self):
|
|
||||||
if not 'image' in self.__dict__:
|
|
||||||
self.image = Image.open(self.args.image).convert('RGB')
|
|
||||||
self.image.resize((self.matrix.width, self.matrix.height), Image.ANTIALIAS)
|
|
||||||
|
|
||||||
double_buffer = self.matrix.CreateFrameCanvas()
|
|
||||||
img_width, img_height = self.image.size
|
|
||||||
|
|
||||||
# let's scroll
|
|
||||||
xpos = 0
|
|
||||||
while True:
|
|
||||||
xpos += 1
|
|
||||||
if (xpos > img_width):
|
|
||||||
xpos = 0
|
|
||||||
|
|
||||||
double_buffer.SetImage(self.image, -xpos)
|
|
||||||
double_buffer.SetImage(self.image, -xpos + img_width)
|
|
||||||
|
|
||||||
double_buffer = self.matrix.SwapOnVSync(double_buffer)
|
|
||||||
time.sleep(0.01)
|
|
||||||
|
|
||||||
# Main function
|
|
||||||
# e.g. call with
|
|
||||||
# sudo ./image-scroller.py --chain=4
|
|
||||||
# if you have a chain of four
|
|
||||||
if __name__ == "__main__":
|
|
||||||
image_scroller = ImageScroller()
|
|
||||||
if (not image_scroller.process()):
|
|
||||||
image_scroller.print_help()
|
|
@ -1,34 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
import time
|
|
||||||
import sys
|
|
||||||
|
|
||||||
from rgbmatrix import RGBMatrix, RGBMatrixOptions
|
|
||||||
from PIL import Image
|
|
||||||
|
|
||||||
if len(sys.argv) < 2:
|
|
||||||
sys.exit("Require an image argument")
|
|
||||||
else:
|
|
||||||
image_file = sys.argv[1]
|
|
||||||
|
|
||||||
image = Image.open(image_file)
|
|
||||||
|
|
||||||
# Configuration for the matrix
|
|
||||||
options = RGBMatrixOptions()
|
|
||||||
options.rows = 32
|
|
||||||
options.chain_length = 1
|
|
||||||
options.parallel = 1
|
|
||||||
options.hardware_mapping = 'regular' # If you have an Adafruit HAT: 'adafruit-hat'
|
|
||||||
|
|
||||||
matrix = RGBMatrix(options = options)
|
|
||||||
|
|
||||||
# Make image fit our screen.
|
|
||||||
image.thumbnail((matrix.width, matrix.height), Image.ANTIALIAS)
|
|
||||||
|
|
||||||
matrix.SetImage(image.convert('RGB'))
|
|
||||||
|
|
||||||
try:
|
|
||||||
print("Press CTRL-C to stop.")
|
|
||||||
while True:
|
|
||||||
time.sleep(100)
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
sys.exit(0)
|
|
@ -1,35 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
from ..samplebase import SampleBase
|
|
||||||
from rgbmatrix import graphics
|
|
||||||
import time, keyboard, os
|
|
||||||
|
|
||||||
|
|
||||||
class TextMenu(SampleBase):
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
super(TextMenu, self).__init__(*args, **kwargs)
|
|
||||||
|
|
||||||
def run(self):
|
|
||||||
offscreen_canvas = self.matrix.CreateFrameCanvas()
|
|
||||||
font = graphics.Font()
|
|
||||||
font.LoadFont("7x13.bdf")
|
|
||||||
textColor = graphics.Color(255, 255, 255)
|
|
||||||
my_text = "hahahahahahah"
|
|
||||||
|
|
||||||
while True:
|
|
||||||
offscreen_canvas.Clear()
|
|
||||||
len = graphics.DrawText(offscreen_canvas, font, 7, 13, textColor, my_text)
|
|
||||||
if (keyboard.is_pressed('1')):
|
|
||||||
os.system('sudo /var/SnakeGame/Client/SnakeGame')
|
|
||||||
break
|
|
||||||
elif (keyboard.is_pressed('2')):
|
|
||||||
os.system('sudo /var/FlappyBird/FlappyBird')
|
|
||||||
break
|
|
||||||
time.sleep(0.05)
|
|
||||||
offscreen_canvas = self.matrix.SwapOnVSync(offscreen_canvas)
|
|
||||||
|
|
||||||
|
|
||||||
# Main function
|
|
||||||
if __name__ == "__main__":
|
|
||||||
run_text = TextMenu()
|
|
||||||
if (not run_text.process()):
|
|
||||||
run_text.print_help()
|
|
@ -1,36 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
from ..samplebase import SampleBase
|
|
||||||
|
|
||||||
|
|
||||||
class GrayscaleBlock(SampleBase):
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
super(GrayscaleBlock, self).__init__(*args, **kwargs)
|
|
||||||
|
|
||||||
def run(self):
|
|
||||||
max_brightness = self.matrix.brightness
|
|
||||||
count = 0
|
|
||||||
c = 255
|
|
||||||
|
|
||||||
while (True):
|
|
||||||
if self.matrix.brightness < 1:
|
|
||||||
self.matrix.brightness = max_brightness
|
|
||||||
count += 1
|
|
||||||
else:
|
|
||||||
self.matrix.brightness -= 1
|
|
||||||
|
|
||||||
if count % 4 == 0:
|
|
||||||
self.matrix.Fill(c, 0, 0)
|
|
||||||
elif count % 4 == 1:
|
|
||||||
self.matrix.Fill(0, c, 0)
|
|
||||||
elif count % 4 == 2:
|
|
||||||
self.matrix.Fill(0, 0, c)
|
|
||||||
elif count % 4 == 3:
|
|
||||||
self.matrix.Fill(c, c, c)
|
|
||||||
|
|
||||||
self.usleep(20 * 1000)
|
|
||||||
|
|
||||||
# Main function
|
|
||||||
if __name__ == "__main__":
|
|
||||||
grayscale_block = GrayscaleBlock()
|
|
||||||
if (not grayscale_block.process()):
|
|
||||||
grayscale_block.print_help()
|
|
@ -1,42 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
from ..samplebase import SampleBase
|
|
||||||
|
|
||||||
|
|
||||||
class PulsingColors(SampleBase):
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
super(PulsingColors, self).__init__(*args, **kwargs)
|
|
||||||
|
|
||||||
def run(self):
|
|
||||||
self.offscreen_canvas = self.matrix.CreateFrameCanvas()
|
|
||||||
continuum = 0
|
|
||||||
|
|
||||||
while True:
|
|
||||||
self.usleep(5 * 1000)
|
|
||||||
continuum += 1
|
|
||||||
continuum %= 3 * 255
|
|
||||||
|
|
||||||
red = 0
|
|
||||||
green = 0
|
|
||||||
blue = 0
|
|
||||||
|
|
||||||
if continuum <= 255:
|
|
||||||
c = continuum
|
|
||||||
blue = 255 - c
|
|
||||||
red = c
|
|
||||||
elif continuum > 255 and continuum <= 511:
|
|
||||||
c = continuum - 256
|
|
||||||
red = 255 - c
|
|
||||||
green = c
|
|
||||||
else:
|
|
||||||
c = continuum - 512
|
|
||||||
green = 255 - c
|
|
||||||
blue = c
|
|
||||||
|
|
||||||
self.offscreen_canvas.Fill(red, green, blue)
|
|
||||||
self.offscreen_canvas = self.matrix.SwapOnVSync(self.offscreen_canvas)
|
|
||||||
|
|
||||||
# Main function
|
|
||||||
if __name__ == "__main__":
|
|
||||||
pulsing_colors = PulsingColors()
|
|
||||||
if (not pulsing_colors.process()):
|
|
||||||
pulsing_colors.print_help()
|
|
@ -1,72 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
from ..samplebase import SampleBase
|
|
||||||
import math
|
|
||||||
|
|
||||||
|
|
||||||
def scale_col(val, lo, hi):
|
|
||||||
if val < lo:
|
|
||||||
return 0
|
|
||||||
if val > hi:
|
|
||||||
return 255
|
|
||||||
return 255 * (val - lo) / (hi - lo)
|
|
||||||
|
|
||||||
|
|
||||||
def rotate(x, y, sin, cos):
|
|
||||||
return x * cos - y * sin, x * sin + y * cos
|
|
||||||
|
|
||||||
|
|
||||||
class RotatingBlockGenerator(SampleBase):
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
super(RotatingBlockGenerator, self).__init__(*args, **kwargs)
|
|
||||||
|
|
||||||
def run(self):
|
|
||||||
cent_x = self.matrix.width / 2
|
|
||||||
cent_y = self.matrix.height / 2
|
|
||||||
|
|
||||||
rotate_square = min(self.matrix.width, self.matrix.height) * 1.41
|
|
||||||
min_rotate = cent_x - rotate_square / 2
|
|
||||||
max_rotate = cent_x + rotate_square / 2
|
|
||||||
|
|
||||||
display_square = min(self.matrix.width, self.matrix.height) * 0.7
|
|
||||||
min_display = cent_x - display_square / 2
|
|
||||||
max_display = cent_x + display_square / 2
|
|
||||||
|
|
||||||
deg_to_rad = 2 * 3.14159265 / 360
|
|
||||||
rotation = 0
|
|
||||||
|
|
||||||
# Pre calculate colors
|
|
||||||
col_table = []
|
|
||||||
for x in range(int(min_rotate), int(max_rotate)):
|
|
||||||
col_table.insert(x, scale_col(x, min_display, max_display))
|
|
||||||
|
|
||||||
offset_canvas = self.matrix.CreateFrameCanvas()
|
|
||||||
|
|
||||||
while True:
|
|
||||||
rotation += 1
|
|
||||||
rotation %= 360
|
|
||||||
|
|
||||||
# calculate sin and cos once for each frame
|
|
||||||
angle = rotation * deg_to_rad
|
|
||||||
sin = math.sin(angle)
|
|
||||||
cos = math.cos(angle)
|
|
||||||
|
|
||||||
for x in range(int(min_rotate), int(max_rotate)):
|
|
||||||
for y in range(int(min_rotate), int(max_rotate)):
|
|
||||||
# Our rotate center is always offset by cent_x
|
|
||||||
rot_x, rot_y = rotate(x - cent_x, y - cent_x, sin, cos)
|
|
||||||
|
|
||||||
if x >= min_display and x < max_display and y >= min_display and y < max_display:
|
|
||||||
x_col = col_table[x]
|
|
||||||
y_col = col_table[y]
|
|
||||||
offset_canvas.SetPixel(rot_x + cent_x, rot_y + cent_y, x_col, 255 - y_col, y_col)
|
|
||||||
else:
|
|
||||||
offset_canvas.SetPixel(rot_x + cent_x, rot_y + cent_y, 0, 0, 0)
|
|
||||||
|
|
||||||
offset_canvas = self.matrix.SwapOnVSync(offset_canvas)
|
|
||||||
|
|
||||||
|
|
||||||
# Main function
|
|
||||||
if __name__ == "__main__":
|
|
||||||
rotating_block_generator = RotatingBlockGenerator()
|
|
||||||
if (not rotating_block_generator.process()):
|
|
||||||
rotating_block_generator.print_help()
|
|
@ -1,36 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
# Display a runtext with double-buffering.
|
|
||||||
from ..samplebase import SampleBase
|
|
||||||
from rgbmatrix import graphics
|
|
||||||
import time
|
|
||||||
|
|
||||||
|
|
||||||
class RunText(SampleBase):
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
super(RunText, self).__init__(*args, **kwargs)
|
|
||||||
self.parser.add_argument("-t", "--text", help="The text to scroll on the RGB LED panel", default="Hello world!")
|
|
||||||
|
|
||||||
def run(self):
|
|
||||||
offscreen_canvas = self.matrix.CreateFrameCanvas()
|
|
||||||
font = graphics.Font()
|
|
||||||
font.LoadFont("../../../fonts/7x13.bdf")
|
|
||||||
textColor = graphics.Color(255, 255, 0)
|
|
||||||
pos = offscreen_canvas.width
|
|
||||||
my_text = self.args.text
|
|
||||||
|
|
||||||
while True:
|
|
||||||
offscreen_canvas.Clear()
|
|
||||||
len = graphics.DrawText(offscreen_canvas, font, pos, 10, textColor, my_text)
|
|
||||||
pos -= 1
|
|
||||||
if (pos + len < 0):
|
|
||||||
pos = offscreen_canvas.width
|
|
||||||
|
|
||||||
time.sleep(0.05)
|
|
||||||
offscreen_canvas = self.matrix.SwapOnVSync(offscreen_canvas)
|
|
||||||
|
|
||||||
|
|
||||||
# Main function
|
|
||||||
if __name__ == "__main__":
|
|
||||||
run_text = RunText()
|
|
||||||
if (not run_text.process()):
|
|
||||||
run_text.print_help()
|
|
@ -1,30 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
from ..samplebase import SampleBase
|
|
||||||
|
|
||||||
|
|
||||||
class SimpleSquare(SampleBase):
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
super(SimpleSquare, self).__init__(*args, **kwargs)
|
|
||||||
|
|
||||||
def run(self):
|
|
||||||
offset_canvas = self.matrix.CreateFrameCanvas()
|
|
||||||
while True:
|
|
||||||
for x in range(0, self.matrix.width):
|
|
||||||
offset_canvas.SetPixel(x, x, 255, 255, 255)
|
|
||||||
offset_canvas.SetPixel(offset_canvas.height - 1 - x, x, 255, 0, 255)
|
|
||||||
|
|
||||||
for x in range(0, offset_canvas.width):
|
|
||||||
offset_canvas.SetPixel(x, 0, 255, 0, 0)
|
|
||||||
offset_canvas.SetPixel(x, offset_canvas.height - 1, 255, 255, 0)
|
|
||||||
|
|
||||||
for y in range(0, offset_canvas.height):
|
|
||||||
offset_canvas.SetPixel(0, y, 0, 0, 255)
|
|
||||||
offset_canvas.SetPixel(offset_canvas.width - 1, y, 0, 255, 0)
|
|
||||||
offset_canvas = self.matrix.SwapOnVSync(offset_canvas)
|
|
||||||
|
|
||||||
|
|
||||||
# Main function
|
|
||||||
if __name__ == "__main__":
|
|
||||||
simple_square = SimpleSquare()
|
|
||||||
if (not simple_square.process()):
|
|
||||||
simple_square.print_help()
|
|
Loading…
Reference in New Issue
Block a user