add plugin
building enigma2
Hi,
I've checked out https://github.com/OpenPLi/enigma2.git and said ./autogen.sh && ./configure.
This fails with:
checking for TUXTXT... no
configure: error: Package requirements (tuxbox-tuxtxt) were not met:
Package 'tuxbox-tuxtxt', required by 'virtual:world', not found
How can I fix this?
Thanks!
Michael
[SOLVED] Problems watching broadcast being recorded (gbue4k)
On my gbue4k with freshly installed OpenPLi 7.2, I got distortions (artifacts, short stops) when watching a broadcast while it was recorded. Watching a recording while a different broadcast was being recorded didn't show any problems.
For each distortion, I found basically these messages in the log:
gbue4k user.warn kernel: [24938.598392] enigma2: page allocation failure: order:5, mode:0x2040d0
gbue4k user.warn kernel: [24938.604789] CPU: 1 PID: 6503 Comm: enigma2 Tainted: P O 4.1.20-1.9 #1
gbue4k user.warn kernel: [24938.612369] Hardware name: Broadcom STB (Flattened Device Tree)
gbue4k user.warn kernel: [24938.618315] [<c001795c>] (unwind_backtrace) from [<c001323c>] (show_stack+0x10/0x14)
gbue4k user.warn kernel: [24938.626079] [<c001323c>] (show_stack) from [<c065fb8c>] (dump_stack+0x84/0x98)
gbue4k user.warn kernel: [24938.633317] [<c065fb8c>] (dump_stack) from [<c00a8218>] (warn_alloc_failed+0xe4/0x120)
gbue4k user.warn kernel: [24938.641248] [<c00a8218>] (warn_alloc_failed) from [<c00ab158>] (__alloc_pages_nodemask+0x558/0x84c)
gbue4k user.warn kernel: [24938.650308] [<c00ab158>] (__alloc_pages_nodemask) from [<c00ddd34>] (cache_alloc_refill+0x364/0x59c)
gbue4k user.warn kernel: [24938.659454] [<c00ddd34>] (cache_alloc_refill) from [<c00de024>] (__kmalloc_track_caller+0xb8/0xec)
gbue4k user.warn kernel: [24938.668425] [<c00de024>] (__kmalloc_track_caller) from [<c00b9818>] (memdup_user+0x1c/0xa4)
gbue4k user.warn kernel: [24938.676790] [<c00b9818>] (memdup_user) from [<c049ad44>] (dvbdmx_write+0x30/0xb8)
gbue4k user.warn kernel: [24938.684308] [<c049ad44>] (dvbdmx_write) from [<bf63d750>] (dev_dmx_demux_write_hook+0xa0/0xd0 [dvb])
gbue4k user.warn kernel: [24938.693481] [<bf63d750>] (dev_dmx_demux_write_hook [dvb]) from [<bf63da3c>] (dev_dmx_dvr_write_hook+0xfc/0x41c [dvb])
gbue4k user.warn kernel: [24938.704118] [<bf63da3c>] (dev_dmx_dvr_write_hook [dvb]) from [<c00e2fe8>] (__vfs_write+0x1c/0xd8)
gbue4k user.warn kernel: [24938.713002] [<c00e2fe8>] (__vfs_write) from [<c00e37f0>] (vfs_write+0x90/0x170)
gbue4k user.warn kernel: [24938.720319] [<c00e37f0>] (vfs_write) from [<c00e4010>] (SyS_write+0x3c/0x90)
gbue4k user.warn kernel: [24938.727378] [<c00e4010>] (SyS_write) from [<c000ff40>] (ret_fast_syscall+0x0/0x3c)
gbue4k user.warn kernel: [24938.735375] Mem-Info:
gbue4k user.warn kernel: [24938.737755] active_anon:23895 inactive_anon:101 isolated_anon:0
gbue4k user.warn kernel: [24938.737755] active_file:82159 inactive_file:83463 isolated_file:24
gbue4k user.warn kernel: [24938.737755] unevictable:0 dirty:25028 writeback:21977 unstable:0
gbue4k user.warn kernel: [24938.737755] slab_reclaimable:8555 slab_unreclaimable:3144
gbue4k user.warn kernel: [24938.737755] mapped:1347 shmem:3296 pagetables:713 bounce:0
gbue4k user.warn kernel: [24938.737755] free:2881 free_pcp:150 free_cma:65
gbue4k user.warn kernel: [24938.772425] DMA free:8500kB min:2732kB low:3412kB high:4096kB active_anon:34792kB inactive_anon:260kB active_file:158908kB inacti
gbue4k user.warn kernel: [24938.818678] lowmem_reserve[]: 0 0 428 428
gbue4k user.warn kernel: [24938.823584] HighMem free:2888kB min:428kB low:1068kB high:1712kB active_anon:60788kB inactive_anon:144kB active_file:169344kB ina
gbue4k user.warn kernel: [24938.868991] lowmem_reserve[]: 0 0 0 0
gbue4k user.warn kernel: [24938.873261] DMA: 1848*4kB (UEM) 234*8kB (UMR) 34*16kB (UMR) 3*32kB ® 0*64kB 1*128kB ® 0*256kB 0*512kB 0*1024kB 0*2048kB 0*409
gbue4k user.warn kernel: [24938.889174] HighMem: 479*4kB (MRC) 67*8kB ® 10*16kB ® 0*32kB 1*64kB ® 0*128kB 1*256kB ® 0*512kB 0*1024kB 0*2048kB 0*4096k
gbue4k user.warn kernel: [24938.908771] 168589 total pagecache pages
gbue4k user.warn kernel: [24938.913452] 0 pages in swap cache
gbue4k user.warn kernel: [24938.917438] Swap cache stats: add 0, delete 0, find 0/0
gbue4k user.warn kernel: [24938.923274] Free swap = 0kB
gbue4k user.warn kernel: [24938.926618] Total swap = 0kB
gbue4k user.warn kernel: [24938.930039] 524288 pages RAM
gbue4k user.warn kernel: [24938.932952] 400896 pages HighMem/MovableOnly
gbue4k user.warn kernel: [24938.938089] 293632 pages reserved
gbue4k user.warn kernel: [24938.942179] 4096 pages cma reserved
This thread (https://www.opena.tv/openatv-4-1-rueckmeldungen/7355-timeshift-haengt-19.html) discusses the issue at length. It comes down to memory being fragmented in such a way that a buffer of the required size cannot be allocated. The thread ends with settings that didn't fix the problem (neither for me nor in the context of the thread).
However, I found that these "more aggressive" values:
vm.min_free_kbytes = 129072
vm.dirty_ratio = 60
vm.vfs_cache_pressure = 110
fix the problem. I know that the settings may be a bit "exaggerated", I didn't test them individually. It may well be that adjusting only e.g. vm.min_free_kbytes is sufficient.
Maybe this information helps if somebody encounters the same problem.
- Michael
build --with-libxine
For research purposes, I wanted to compile only the enigma2 folder on PC with the --with-libxine option. However, I get errors:
service/servicexine.cpp: In constructor ‘eServiceFactoryXine::eServiceFactoryXine()’: service/servicexine.cpp:25:54: error: no matching function for call to ‘eServiceCenter::addServiceFactory(eServiceFactoryXine::<unnamed enum>, eServiceFactoryXine*)’ sc->addServiceFactory(eServiceFactoryXine::id, this); ^ ... service/servicexine.cpp:45:41: error: invalid new-expression of abstract class type ‘eServiceXine’ ptr = new eServiceXine(ref.path.c_str()); ^ ... service/servicexine.cpp: In member function ‘virtual int eServiceXine::getInfo(int)’: service/servicexine.cpp:332:7: error: ‘sTitle’ was not declared in this scope case sTitle: ^~~~~~ ... service/servicexine.cpp:333:7: error: ‘sArtist’ was not declared in this scope case sArtist: ^~~~~~~ ... service/servicexine.cpp:334:7: error: ‘sAlbum’ was not declared in this scope case sAlbum: ^~~~~~ ... sTagAlbum service/servicexine.cpp:335:7: error: ‘sComment’ was not declared in this scope case sComment: ^~~~~~~~ ... service/servicexine.cpp:336:7: error: ‘sTracknumber’ was not declared in this scope case sTracknumber: ^~~~~~~~~~~~ ... service/servicexine.cpp:337:7: error: ‘sGenre’ was not declared in this scope case sGenre: ^~~~~~
I tried to insert the following:
diff -ruN o/configure.ac pc/configure.ac --- o/configure.ac 2019-08-01 17:26:23.924716525 +0300 +++ pc/configure.ac 2019-12-24 14:09:57.726693201 +0300 @@ -238,7 +250,7 @@ AC_CHECK_LIB([crypt], [crypt], [BASE_LIBS+=" -lcrypt"], [AC_MSG_ERROR([Could not find crypt])]) AC_CHECK_LIB([rt], [clock_gettime], [BASE_LIBS+=" -lrt"], [AC_MSG_ERROR([Could not find rt])]) -ENIGMA2_CFLAGS="-fno-rtti -fno-exceptions -rdynamic -funwind-tables" +ENIGMA2_CFLAGS="-fno-rtti -fno-exceptions -rdynamic -funwind-tables -Wno-error=implicit-function-declaration" AC_SUBST(ENIGMA2_CFLAGS) AX_CXX_COMPILE_STDCXX_11([ext],[mandatory])
But this doesnt help. Any suggestion?
Suggestion: channel number indicated in event programming
Hello the team,
Just an idea: when programming event (record or other), it can be verry useful to have too the channel number indicated near the name of the channel, because i.e. I have 3 satellites but some with the same channels, and in order to know immediately on which one pointing...?
Thanks and again, congrats for the job done, really good, OP is at the top.
PS: Best wishes for the holidays.
Slow zap for CI
solo4k sdl
Hello,
I wonder if anyone else tried to use SDL1.2 or SDL2 on solo4k and if it works.
I tried and the video init tells that "No available video device" the sound init seems to not give any error.
Many thanks,
Marc
build image failing
Hello,
I am trying to build an image for zgemma-sh1, following steps finalize with an error:
zgemma@IMATH:~/oe$ git clone https://github.com/OpenPLi/openpli-oe-core.git
Cloning into 'openpli-oe-core'...
remote: Enumerating objects: 22, done.
remote: Counting objects: 100% (22/22), done.
remote: Compressing objects: 100% (17/17), done.
remote: Total 32306 (delta 10), reused 8 (delta 5), pack-reused 32284
Receiving objects: 100% (32306/32306), 46.67 MiB | 2.27 MiB/s, done.
Resolving deltas: 100% (20831/20831), done.
zgemma@IMATH:~/oe$ ls
openpli-oe-core
zgemma@IMATH:~/oe$ cd openpli-oe-core
zgemma@IMATH:~/oe/openpli-oe-core$ make
[ -d /home/zgemma/oe/openpli-oe-core/meta-openembedded/meta-oe ] || make update
make[1]: Entering directory '/home/zgemma/oe/openpli-oe-core'
Updating Git repositories...
Already up-to-date.
Submodule 'bitbake' (git://git.openembedded.org/bitbake) registered for path 'bitbake'
Submodule 'meta-amiko' (https://github.com/open-amiko/meta-amiko.git) registered for path 'meta-amiko'
Submodule 'meta-axasuhd' (https://github.com/Axas-UHD/meta-axasuhd.git) registered for path 'meta-axasuhd'
Submodule 'meta-edision' (https://github.com/edision-open/meta-edision.git) registered for path 'meta-edision'
Submodule 'meta-formuler' (https://github.com/formuler/meta-formuler.git) registered for path 'meta-formuler'
Submodule 'meta-gfutures' (https://github.com/HD-Digital/meta-gfutures.git) registered for path 'meta-gfutures'
Submodule 'meta-gi' (https://github.com/GIDeveloperTeam/meta-gi.git) registered for path 'meta-gi'
Submodule 'meta-gigablue' (https://github.com/GigaBlue-STB/meta-gigablue) registered for path 'meta-gigablue'
Submodule 'meta-maxytec' (https://github.com/v8droide2/meta-maxytec) registered for path 'meta-maxytec'
Submodule 'meta-miraclebox' (https://github.com/miraclebox-git/meta-miraclebox.git) registered for path 'meta-miraclebox'
Submodule 'meta-octagon' (https://github.com/zhtq/meta-octagon) registered for path 'meta-octagon'
Submodule 'meta-openembedded' (git://git.openembedded.org/meta-openembedded) registered for path 'meta-openembedded'
Submodule 'meta-qt5' (https://github.com/meta-qt5/meta-qt5.git) registered for path 'meta-qt5'
Submodule 'meta-qviart' (https://github.com/pli3/meta-qviart-5.git) registered for path 'meta-qviart'
Submodule 'meta-sab' (https://github.com/mariner2/meta-sab.git) registered for path 'meta-sab'
Submodule 'meta-spycat' (https://github.com/open-spycat/meta-spycat.git) registered for path 'meta-spycat'
Submodule 'meta-vuplus' (https://github.com/vu-plus/meta-vuplus.git) registered for path 'meta-vuplus'
Submodule 'meta-xp' (https://github.com/XP-Master/meta-xp.git) registered for path 'meta-xp'
Submodule 'meta-xpeedc' (https://github.com/XpeedDeveloperTeam/meta-xpeedc.git) registered for path 'meta-xpeedc'
Submodule 'meta-xsarius.pli5' (https://github.com/pli3/meta-xsarius.pli5.git) registered for path 'meta-xsarius.pli5'
Submodule 'meta-xtrend' (https://github.com/nextv-xtrend/meta-xtrend.git) registered for path 'meta-xtrend'
Submodule 'meta-zgemma' (https://github.com/zgemma-star/meta-zgemma.git) registered for path 'meta-zgemma'
Submodule 'openembedded-core' (git://git.openembedded.org/openembedded-core) registered for path 'openembedded-core'
Cloning into '/home/zgemma/oe/openpli-oe-core/bitbake'...
Cloning into '/home/zgemma/oe/openpli-oe-core/meta-amiko'...
Cloning into '/home/zgemma/oe/openpli-oe-core/meta-axasuhd'...
Cloning into '/home/zgemma/oe/openpli-oe-core/meta-edision'...
Cloning into '/home/zgemma/oe/openpli-oe-core/meta-formuler'...
Cloning into '/home/zgemma/oe/openpli-oe-core/meta-gfutures'...
Cloning into '/home/zgemma/oe/openpli-oe-core/meta-gi'...
Cloning into '/home/zgemma/oe/openpli-oe-core/meta-gigablue'...
Cloning into '/home/zgemma/oe/openpli-oe-core/meta-maxytec'...
Cloning into '/home/zgemma/oe/openpli-oe-core/meta-miraclebox'...
Cloning into '/home/zgemma/oe/openpli-oe-core/meta-octagon'...
Cloning into '/home/zgemma/oe/openpli-oe-core/meta-openembedded'...
Cloning into '/home/zgemma/oe/openpli-oe-core/meta-qt5'...
Cloning into '/home/zgemma/oe/openpli-oe-core/meta-qviart'...
Cloning into '/home/zgemma/oe/openpli-oe-core/meta-sab'...
Cloning into '/home/zgemma/oe/openpli-oe-core/meta-spycat'...
Cloning into '/home/zgemma/oe/openpli-oe-core/meta-vuplus'...
Cloning into '/home/zgemma/oe/openpli-oe-core/meta-xp'...
Cloning into '/home/zgemma/oe/openpli-oe-core/meta-xpeedc'...
Cloning into '/home/zgemma/oe/openpli-oe-core/meta-xsarius.pli5'...
Cloning into '/home/zgemma/oe/openpli-oe-core/meta-xtrend'...
Cloning into '/home/zgemma/oe/openpli-oe-core/meta-zgemma'...
Cloning into '/home/zgemma/oe/openpli-oe-core/openembedded-core'...
Submodule path 'bitbake': checked out 'ca9b9ffc250eb3ece5af3d64ff5febef69d555b0'
Submodule path 'meta-amiko': checked out 'b6416ddfc6130265e0b3054d144b96b59fdf7a03'
Submodule path 'meta-axasuhd': checked out 'f454aabecfdfccf2ec338a30971b20fdd1d58130'
Submodule path 'meta-edision': checked out '563c99925e465dc601b2096b4c066e8661478cc7'
Submodule path 'meta-formuler': checked out 'b5cd4f24b62825740dc2d43b2ebd22b07b9ecd05'
Submodule path 'meta-gfutures': checked out '10c7ab9a58d738c634613163ebb8b82f4c842573'
Submodule path 'meta-gi': checked out '01fd1e8256f53d40371e65514e13a53ef53e400d'
Submodule path 'meta-gigablue': checked out '80a5584686f87feee6260d05f1e3df65b2271c84'
Submodule path 'meta-maxytec': checked out 'c7cbbeefae15b3d6cdeb419f72f5595e978c83e4'
Submodule path 'meta-miraclebox': checked out '99117bcc87c3bcf1885b631af915834e4d31bb9a'
Submodule path 'meta-octagon': checked out 'cba05eb6d45146a7c8b90ce126c472657cedd4a2'
Submodule path 'meta-openembedded': checked out 'dfbdd28d206a74bf264c2f7ee0f7b3e5af587796'
Submodule path 'meta-qt5': checked out 'c6aa602d0640040b470ee81de39726276ddc0ea3'
Submodule path 'meta-qviart': checked out 'e29333f48e443c02c171b148b28e214758f5c649'
Submodule path 'meta-sab': checked out '92262feb14e4005c8096150daac7313e9cb3d85a'
Submodule path 'meta-spycat': checked out 'a19f11bbcdcad969e9f6f8d2c30df0653427d4cb'
Submodule path 'meta-vuplus': checked out '4666f262c93c379678585b97d99375690d90e0fa'
Submodule path 'meta-xp': checked out '42958cf03e531dd9447b2f06fcba934cdf1d85b8'
Submodule path 'meta-xpeedc': checked out 'f12908a5573de8a6a06ad9f75081846a590511c4'
Submodule path 'meta-xsarius.pli5': checked out 'becd6945c9cc29a290b90c1bfa9d8b23c784d686'
Submodule path 'meta-xtrend': checked out '0bb2fec713b620d36c0734118edd3ec03e675b89'
Submodule path 'meta-zgemma': checked out 'b2aaedc62ffbb949485db90d9b0517fd6a0529ad'
Submodule path 'openembedded-core': checked out '93dd2f9f3edf0584f9e806c629611d645dd72dbf'
The openpli OE is now up-to-date.
make[1]: Leaving directory '/home/zgemma/oe/openpli-oe-core'
Generating /home/zgemma/oe/openpli-oe-core/build/env.source
Generating /home/zgemma/oe/openpli-oe-core/build/conf/openpli.conf
Generating /home/zgemma/oe/openpli-oe-core/build/conf/bblayers.conf
Generating /home/zgemma/oe/openpli-oe-core/build/conf/local.conf
Openembedded for the OpenPLi develop environment has been initialized
properly. Now you can start building your image, by doing either:
MACHINE=... make image
or:
cd /home/zgemma/oe/openpli-oe-core/build
source env.source
MACHINE=... bitbake openpli-enigma2-image
or, if you want to build not just the image, but the optional packages in the feed as well:
MACHINE=... make feed
or:
MACHINE=... bitbake openpli-enigma2-feed
zgemma@IMATH:~/oe/openpli-oe-core$ MACHINE=sh1 make image
Building image for sh1
NOTE: Your conf/bblayers.conf has been automatically updated.
NOTE: Your conf/bblayers.conf has been automatically updated.
ERROR: OE-core's config sanity checker detected a potential misconfiguration.
Either fix the cause of this error or at your own risk disable the checker (see sanity.conf).
Following is the list of potential problems / advisories:
Your gcc version is older than 4.5 or is not working properly. Please verify you can build and link something that uses atomic operations, such as:
__sync_bool_compare_and_swap (&atomic, 2, 3);
Summary: There was 1 ERROR message shown, returning a non-zero exit code.
Makefile:127: recipe for target 'image' failed
make: *** [image] Error 1
zgemma@IMATH:~/oe/openpli-oe-core$
My gcc is debian's version 6.3. May be environment is wrongly created, because it is talking not about system gcc,isn't it ?
please help
KodiLite Version 5.0
A new version of KodiLite - version 5.0 - is descibed below.
The plugin is now made more simple to use.
This version already includes a number of requested addons. If you want any other addons - please ask.
Included addons :-
Showtime
-NeptuneMovies
IPTV
-iptvday
-m3uliste
-m3uplayer
-SportsDevil
Youtube & Co
-youtube
Albanian
-filmi24
-tvseriale
Italian
-tivustream
-videomediaset
Turkish
-turkvod
Adult 18+ (protect with parental PIN)
-16 adult addons
Regards, pcd.
Install using plugin KodiLiteInstaller from here :-
show additional info with double click on ok
I am using open pli 6 on a vu+ duo2. Until a couple of days, when double-clicking the ok button, some additional info (encryptions, ecm info, frequency,...) was showed in the left upper corner, above the epg information. After a crash, or maybe some unintentional configuration change, I get now only the plain epg information when double-clicking the ok button, the additional information has disappeared.
Where exactly can the display of the additional information be again activated?
Play Audio CD on Hisilicon chip Zgemma H9 Combo
Hi I have a problem playing audi CD' on my zgemma H9 combo.
The CD is recognized and the correct playlist file in /media/audiocd/ is created.
But selecting a track from the playlist and pressing OK I just get a "format not supported" error.
I can play the cd using for examle
gst-launch-1.0 cdiocddasrc track=5 ! audioconvert ! audioresample ! alsasink
so the CD is OK and a working software is there,
Running enigma2 in debugging mode, it says
... playing 4097:0:0:0:0:0:0:0:0:0:/media/audiocd/track-02.cda
10:28:21.9231 ../servicehisilicon.cpp:709 eServiceHisilicon [eServiceHisilicon] construct!
10:28:21.9232 ../servicehisilicon.cpp:755 eServiceHisilicon [eServiceHisilicon] uri=/media/audiocd/track-02.cda
10:28:21.9424 ../servicehisilicon.cpp:532 netlink_event [eServiceHisilicon] error 6
It seems like the playing request uri=/media/audiocd/track-02.cda is correctly passed to servicehisilicon.cpp
and there, it is unable to play a cda file.
Is there a way to redirect the playing request to something like the gst-launch line above?
Can I install any other player plugin that would take precedence over the servicehisilicon application?
Any help is appreciated
Martin
OpenMultiboot for openPLi
Sources here:
https://github.com/oe-alliance/openmultiboot
https://github.com/oe-alliance/openmultibootmanager
Thanks to all the creators of this supplement.
From my small patch for openPli .
External IR receiver to which will alow you to use others remote controls

Are you interested with such hardware?
Cool TV Guide 1920x1080 full screen skin V2.
Attached Files
Crash management
Hello,
Having had sometimes some crash, and in order to find and send it in a more simple way, can it be possible to have an option in settings to manage the crash logs?
Thanks and congrats as always for the good job done on OP.
Error MovieList.
Good afternoon.Please check.Openpli-develop.I’m recording a channel or recording it on a timer and I want to see the recording in the movie player.
crashdate=Чт янв 23 12:27:56 2020 compiledate=Jan 23 2020 skin=PLi-FullNightHD/skin.xml sourcedate=2020-01-22 branch=develop rev=e2456bc component=Enigma2 Traceback (most recent call last): File "/usr/lib/enigma2/python/Components/ActionMap.py", line 57, in action File "/usr/lib/enigma2/python/Screens/InfoBar.py", line 135, in showMovies File "/usr/lib/enigma2/python/mytest.py", line 289, in openWithCallback dlg = self.open(screen, *arguments, **kwargs) File "/usr/lib/enigma2/python/mytest.py", line 299, in open dlg = self.current_dialog = self.instantiateDialog(screen, *arguments, **kwargs) File "/usr/lib/enigma2/python/mytest.py", line 242, in instantiateDialog return self.doInstantiateDialog(screen, arguments, kwargs, self.desktop) File "/usr/lib/enigma2/python/mytest.py", line 259, in doInstantiateDialog dlg = screen(self, *arguments, **kwargs) File "/usr/lib/enigma2/python/Screens/MovieSelection.py", line 564, in __init__ File "/usr/lib/enigma2/python/Components/MovieList.py", line 200, in __init__ File "/usr/lib/enigma2/python/Components/MovieList.py", line 225, in updateRecordings AttributeError: 'RecordTimerEntry' object has no attribute 'failed'
IMDb - Issue
Hi, can i ask if it is at all possible for OpenPli to fix the IMDb feature/plugin please?
The version which is available on the OpenPli 7.2 image, and other versions too i imagine,
has not worked for a long time yet the Pur-E2 images have an excellent version which
works very well.
Is it not possible for OpenPli to offer a working version of IMDb?
Service references?
Hello. I was wondering if anyone knows how to make a reference?
This is what I am talking about "1:0:19:1CE9:7F6:2:11A0000:0:0:0:"
I understand the information needed to manually create these is on sites like kos.
I cant figure out how to build them.
Does anyone know?
Thanks,
Chris
Enigma Signal Meter
