Merge remote-tracking branch 'refs/remotes/hyperion-project/master' into webc

This commit is contained in:
brindosch 2017-02-17 09:37:42 +01:00
commit 817cdd51c0
343 changed files with 16849 additions and 7932 deletions

1
.gitignore vendored
View File

@ -17,3 +17,4 @@ CMakeCache.txt
/HyperionConfig.h
/lib
.directory
*.pyc

View File

@ -1,9 +1,7 @@
# Define the main-project name
project(hyperion)
# define the minimum cmake version (as required by cmake)
cmake_minimum_required(VERSION 2.8)
PROJECT(hyperion)
IF ( POLICY CMP0026 )
CMAKE_POLICY( SET CMP0026 OLD )
ENDIF()
@ -16,24 +14,35 @@ SET ( HYPERION_VERSION_STABLE OFF )
SET ( HYPERION_VERSION_MAJOR 2 )
SET ( HYPERION_VERSION_MINOR 0 )
SET ( HYPERION_VERSION_PATCH 0 )
SET ( CURRENT_CONFIG_VERSION 2 )
SET ( DEFAULT_AMLOGIC OFF )
SET ( DEFAULT_DISPMANX OFF )
SET ( DEFAULT_FB ON )
SET ( DEFAULT_OSX OFF )
SET ( DEFAULT_X11 OFF )
SET ( DEFAULT_SPIDEV ON )
SET ( DEFAULT_WS281XPWM OFF )
SET ( DEFAULT_V4L2 ON )
SET ( DEFAULT_USE_SHARED_AVAHI_LIBS OFF )
SET ( DEFAULT_USE_AVAHI_LIBS ON )
SET ( DEFAULT_USE_SHARED_AVAHI_LIBS ON )
SET ( DEFAULT_USE_SYSTEM_PROTO_LIBS OFF )
SET ( DEFAULT_TESTS OFF )
IF ( ${CMAKE_SYSTEM} MATCHES "Linux" )
SET ( DEFAULT_V4L2 ON )
SET ( DEFAULT_SPIDEV ON )
SET ( DEFAULT_FB ON )
ELSE()
SET ( DEFAULT_V4L2 OFF )
SET ( DEFAULT_SPIDEV OFF )
SET ( DEFAULT_FB OFF )
ENDIF()
if (APPLE)
SET( PLATFORM "osx")
endif()
if (WIN32)
SET( PLATFORM "windows")
endif()
if ( NOT DEFINED PLATFORM )
if ( "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "x86" )
SET( PLATFORM "x86")
@ -56,16 +65,11 @@ endif()
message( STATUS "PLATFORM: ${PLATFORM}")
if ( "${PLATFORM}" MATCHES "osx" )
SET(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} "/usr/local/opt/qt5" CACHE STRING "path to your QT5 files" )
include_directories("/opt/X11/include/")
SET ( DEFAULT_OSX ON )
SET ( DEFAULT_V4L2 OFF )
SET ( DEFAULT_SPIDEV OFF )
SET ( DEFAULT_FB OFF )
SET ( DEFAULT_WS281XPWM OFF )
SET ( DEFAULT_USE_AVAHI_LIBS OFF )
SET ( DEFAULT_USE_SHARED_AVAHI_LIBS OFF )
elseif ( "${PLATFORM}" STREQUAL "rpi" )
SET ( DEFAULT_DISPMANX ON )
SET ( DEFAULT_WS281XPWM ON )
@ -73,16 +77,16 @@ elseif ( "${PLATFORM}" STREQUAL "amlogic" )
SET ( DEFAULT_AMLOGIC ON )
elseif ( "${PLATFORM}" STREQUAL "amlogic64" )
SET ( DEFAULT_AMLOGIC ON )
SET ( DEFAULT_USE_SYSTEM_PROTO_LIBS ON )
elseif ( "${PLATFORM}" MATCHES "x86" )
SET ( DEFAULT_X11 ON )
SET ( DEFAULT_USE_SHARED_AVAHI_LIBS ON )
if ( "${PLATFORM}" STREQUAL "x86-dev" )
SET ( DEFAULT_AMLOGIC ON)
SET ( DEFAULT_WS281XPWM ON )
endif()
elseif ( "${PLATFORM}" STREQUAL "imx6" )
SET ( DEFAULT_FB ON )
elseif ( "${PLATFORM}" STREQUAL "windows" )
MESSAGE( WARNING "Hyperion is not developed nor tested on MS Windows.")
endif()
# enable tests for -dev builds
@ -131,6 +135,40 @@ message(STATUS "ENABLE_PROFILER = ${ENABLE_PROFILER}")
SET ( PROTOBUF_INSTALL_BIN_DIR ${CMAKE_BINARY_DIR}/proto )
SET ( PROTOBUF_INSTALL_LIB_DIR ${CMAKE_BINARY_DIR}/proto )
# check all json files
FILE ( GLOB_RECURSE HYPERION_SCHEMAS RELATIVE ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/libsrc/*schema*.json )
SET( JSON_FILES
config/hyperion.config.json.default
${HYPERION_SCHEMAS}
)
EXECUTE_PROCESS (
COMMAND python test/jsonchecks/checkjson.py ${JSON_FILES}
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
RESULT_VARIABLE CHECK_JSON_FAILED
)
IF ( ${CHECK_JSON_FAILED} )
MESSAGE (FATAL_ERROR "check of json files failed" )
ENDIF ()
EXECUTE_PROCESS (
COMMAND python test/jsonchecks/checkeffects.py effects effects/schema
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
RESULT_VARIABLE CHECK_EFFECTS_FAILED
)
IF ( ${CHECK_EFFECTS_FAILED} )
MESSAGE (FATAL_ERROR "check of json effect files failed" )
ENDIF ()
EXECUTE_PROCESS (
COMMAND python test/jsonchecks/checkschema.py config/hyperion.config.json.default libsrc/hyperion/schemas/hyperion.schema-${CURRENT_CONFIG_VERSION}.json
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
RESULT_VARIABLE CHECK_CONFIG_FAILED
)
IF ( ${CHECK_CONFIG_FAILED} )
MESSAGE (FATAL_ERROR "check of json default config failed" )
ENDIF ()
# Createt the configuration file
# Add project specific cmake modules (find, etc)
@ -207,6 +245,14 @@ endif ()
# Add the doxygen generation directory
add_subdirectory(doc)
# remove generated files on make cleaan too
LIST( APPEND GENERATED_QRC
${CMAKE_BINARY_DIR}/EffectEngine.qrc
${CMAKE_BINARY_DIR}/WebConfig.qrc
${CMAKE_BINARY_DIR}/HyperionConfig.h
)
set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${GENERATED_QRC}" )
# uninstall target
configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY)
add_custom_target(uninstall COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)

View File

@ -1,12 +1,17 @@
# Install the required tools and dependencies
## Debian/Ubuntu/Win10LinuxSubsystem
```
sudo apt-get update
sudo apt-get install git cmake build-essential qtbase5-dev libqt5serialport5-dev libusb-1.0-0-dev python-dev libxrender-dev libavahi-core-dev libavahi-compat-libdnssd-dev
```
# RPI Only
when you build on the rapberry pi and include the dispmanx grabber (which is the default)
**ATTENTION Win10LinuxSubsystem** we do not (/we can't) support using hyperion in linux subsystem of MS Windows 10, albeit some users tested it with success. Keep in mind to disable
all linux specific led and grabber hardware via cmake. Because we use QT as framework in hyperion, serialport leds and network driven devices could work.
## RPI Only
when you build on the rapberry pi and include the dispmanx grabber (which is the default)
you also need the firmware including headers installed. This downloads the firmware from the raspberrypi github
and copies the required files to the correct place. The firmware directory can be deleted afterwards if desired.
@ -16,7 +21,47 @@ git clone --depth 1 https://github.com/raspberrypi/firmware.git "$FIRMWARE_DIR"
sudo cp -R "$FIRMWARE_DIR/hardfp/opt/" /opt
```
# Create hyperion directory and checkout the code from github
## Arch
See [AUR](https://aur.archlinux.org/packages/?O=0&SeB=nd&K=hyperion&outdated=&SB=n&SO=a&PP=50&do_Search=Go) for PKGBUILDs on arch. If the PKGBUILD does not work ask questions there please.
## OSX
To install on OS X you either need Homebrew or Macport but Homebrew is the recommended way to install the packages. To use Homebrew XCode is required as well, use `brew doctor` to check your install.
First you need to install the dependencies:
```
brew install qt5
brew install cmake
brew install libusb
brew install doxygen
```
# Compiling and installing Hyperion
### The general quick way (without big comments)
be sure you fullfill the prerequisites above.
assume your home is /home/pi
```bash
git clone --recursive https://github.com/hyperion-project/hyperion.ng.git hyperion
cd hyperion
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make -j $(nproc)
# optional: install into your system
make install/strip
# to uninstall (not very well tested, please keep that in mind)
make uninstall
# ... or run it from compile directory
bin/hyperiond myconfig.json
# webui is located on localhost:8099
```
### Download
Create hyperion directory and checkout the code from github
You might want to add `--depth 1` to the `git` command if you only want to compile the current source and have no need for the entire git repository
@ -31,32 +76,26 @@ git submodule init
git submodule update
```
# Create and enter the build directory
### Preparations
Change into hyperion folder and create a build folder
```
mkdir "$HYPERION_DIR/build"
cd "$HYPERION_DIR/build"
cd "$HYPERION_DIR"
mkdir build
cd build
```
# Generate the make files:
### Generate the make files:
To generate make files on the raspberry pi WITHOUT PWM SUPPORT:
To generate make files with automatic platform detection and default settings:
This should fit to *RPI, x86, amlogic/wetek*
```
cmake -DPLATFORM=rpi -DCMAKE_BUILD_TYPE=Release ..
cmake -DCMAKE_BUILD_TYPE=Release ..
```
To generate make files on the raspberry pi WITH PWM SUPPORT:
*Developers on x86* linux should use:
```
cmake -DPLATFORM=rpi-pwm -DCMAKE_BUILD_TYPE=Release ..
```
To generate make files on a regular x86 or amd64 system:
```
cmake -DPLATFORM=x86 -DCMAKE_BUILD_TYPE=Release ..
```
To generate make files on a amlogic system:
```
cmake -DPLATFORM=aml -DCMAKE_BUILD_TYPE=Release ..
cmake -DPLATFORM=x86-dev -DCMAKE_BUILD_TYPE=Release ..
```
To use framebuffer instead of dispmanx (for example on the *cubox-i*):
@ -66,24 +105,14 @@ cmake -DENABLE_FB=ON -DCMAKE_BUILD_TYPE=Release ..
To generate make files on OS X:
To install on OS X you either need Homebrew or Macport but Homebrew is the recommended way to install the packages. To use Homebrew XCode is required as well, use `brew doctor` to check your install.
First you need to install the dependencies:
```
brew install qt5
brew install cmake
brew install libusb
brew install doxygen
```
After which you can run cmake with the correct qt5 path:
```
cmake -DCMAKE_INSTALL_PREFIX=/usr/local -DCMAKE_PREFIX_PATH=/usr/local/Cellar/qt5/5.7.0 ..
cmake -DCMAKE_PREFIX_PATH=/usr/local/Cellar/qt5/5.7.0 -DCMAKE_BUILD_TYPE=Release ..
```
# Run make to build Hyperion
### Run make to build Hyperion
The `-j $(nproc)` specifies the amount of CPU cores to use.
```
```bash
make -j $(nproc)
```
@ -91,39 +120,25 @@ On a mac you can use ``sysctl -n hw.ncpu`` to get the number of available CPU co
```bash
make -j $(sysctl -n hw.ncpu)
```
#After compile, to remove any stuff not needed for a release version.
```
strip bin/*
```
# The binaries are build in "$HYPERION_DIR/build/bin". You could copy those to /usr/bin
```
sudo cp ./bin/hyperion-remote /usr/bin/
sudo cp ./bin/hyperiond /usr/bin/
```
On a Mac with Sierra you won't be able to copy these files to the ``/usr/bin/`` folder due to Sierra's file protection. You can copy those files to ``/usr/local/bin`` instead.
```bash
cp ./bin/hyperion-remote /usr/local/bin
cp ./bin/hyperiond /usr/local/bin
```
The better way to do this is to use the make install script, which copies all necessary files to ``/usr/local/share/hyperion``:
```bash
sudo make install
```
You can combine the install command with the strip command to install and cleanup in one task:
### Install hyperion into your system
Copy all necessary files to ``/usr/local/share/hyperion``
```bash
sudo make install/strip
```
# Copy the effect folder (if you did not use the normal installation methode before)
```
sudo mkdir -p /usr/local/share/hyperion/effects && sudo cp -R ../effects/ /usr/local/share/hyperion/effects/
If you want to install into another location call this before installing
```bash
cmake -DCMAKE_INSTALL_PREFIX=/home/pi/apps ..
```
This will install to ``/home/pi/apps/share/hyperion``
### Integrating hyperion into your system
... ToDo

View File

@ -30,6 +30,9 @@
// Define to enable profiler for development purpose
#cmakedefine ENABLE_PROFILER
// Define version id of current config
#define CURRENT_CONFIG_VERSION ${CURRENT_CONFIG_VERSION}
// the hyperion build id string
#define HYPERION_BUILD_ID "${HYPERION_BUILD_ID}"
@ -39,3 +42,5 @@
#define HYPERION_VERSION "${HYPERION_VERSION_MAJOR}.${HYPERION_VERSION_MINOR}.${HYPERION_VERSION_PATCH}"
#define HYPERION_JSON_VERSION "1.0.0"

View File

@ -3,22 +3,38 @@ HYPERION
This is a pre alpha development repository for the next major version of hyperion
Feel free to join us! We are looking always for people who wants to participate.
--------
## **Important notice!**
Hyperion.NG is under heavy development. This version is currently _only for development_ purpose.
Please do not use it for your 'productiv' setup!
Current new deps (libs)
QT5
- sudo apt-get install libqt5core5a libqt5network5 libqt5gui5 libqt5serialport5 libusb-1.0-0
If you want to use hyperion as 'normal user', please use [current stable version](https://github.com/hyperion-project/hyperion)
zeroconf
- apt-get install libavahi-core-dev libavahi-compat-libdnssd-dev
Besides of that .... Feel free to join us! We are looking always for people who wants to participate.
--------
94MB free disc space for deps
Hyperion is an opensource 'AmbiLight' implementation with support for many LED devices and video grabbers.
More information can be found on the official Hyperion [Wiki](https://wiki.hyperion-project.org)
The main features of Hyperion are:
* Low CPU load makes it perfect for SoCs like Raspberry Pi
* Json interface which allows easy integration into scripts
* A command line utility to for testing and integration in automated environment
* Priority channels are not coupled to a specific led data provider which means that a provider can post led data and leave without the need to maintain a connection to Hyperion. This is ideal for a remote application (like our Android app).
* Kodi-checker which checks the playing status of Kodi and decides whether or not to capture the screen.
* Black border detector.
* A scriptable (Python) effect engine
* A web ui to configure and remote control hyperion
More information can be found on the official Hyperion [Wiki](https://wiki.hyperion-project.org)
If you need further support please open a topic at the our new forum!
[Hyperion webpage/forum](https://www.hyperion-project.org).
## Building
See [Compilehowto](CompileHowto.md) and [CrossCompileHowto](CrossCompileHowto.txt).
## License
The source is released under MIT-License (see http://opensource.org/licenses/MIT).

View File

@ -9,12 +9,19 @@
set following values to your needs
**************************************/
// Number of leds in your strip. set to 1 and ANALOG_OUTPUT_ENABLED to true to activate analog only
#define NUM_LEDS 100
#define INITIAL_LED_TEST_ENABLED true
#define INITIAL_LED_TEST_BRIGHTNESS 32 // 0..255
#define INITIAL_LED_TEST_TIME_MS 500 // 10..
// Number of leds in your strip. set to "1" and ANALOG_OUTPUT_ENABLED to "true" to activate analog only
// As of 26/1/2017:
// 582 leaves ZERO bytes free and this
// 410 is ok
// tested with 500 leds and is fine (despite the warning)
#define MAX_LEDS 500
#define SPI_LEDS false // connection type. Set "true" for 4 wire and "false" for 3 Wire stripes.
#define LED_TYPE WS2812B // type of your led controller, possible values, see below
// type of your led controller, possible values, see below
#define LED_TYPE WS2812B
// 3 wire (pwm): NEOPIXEL BTM1829 TM1812 TM1809 TM1804 TM1803 UCS1903 UCS1903B UCS1904 UCS2903 WS2812 WS2852
// S2812B SK6812 SK6822 APA106 PL9823 WS2811 WS2813 APA104 WS2811_40 GW6205 GW6205_40 LPD1886 LPD1886_8BIT
@ -22,8 +29,10 @@
// For 3 wire led stripes line Neopixel/Ws2812, which have a data line, ground, and power, you just need to define DATA_PIN.
// For led chipsets that are SPI based (four wires - data, clock, ground, and power), both defines DATA_PIN and CLOCK_PIN are needed
#define DATA_PIN 6
#define CLOCK_PIN 13
// DATA_PIN, or DATA_PIN, CLOCK_PIN
#define LED_PINS 6 // 3 wire leds
//#define LED_PINS 6, 13 // 4 wire leds
#define COLOR_ORDER GRB // colororder of the stripe, set RGB in hyperion
@ -33,7 +42,7 @@
// ATTENTION this pin config is default for atmega328 based arduinos, others might work to
// if you have flickering analog leds this might be caused by unsynced pwm signals
// try other pins is more or less the only thing that helps
#define ANALOG_OUTPUT_ENABLED true
#define ANALOG_OUTPUT_ENABLED false
#define ANALOG_MODE ANALOG_MODE_LAST_LED // use ANALOG_MODE_AVERAGE or ANALOG_MODE_LAST_LED
#define ANALOG_GROUND_PIN 8 // additional ground pin to make wiring a bit easier
#define ANALOG_RED_PIN 9
@ -48,10 +57,13 @@
#define BRIGHTNESS 255 // maximum brightness 0-255
#define DITHER_MODE BINARY_DITHER // BINARY_DITHER or DISABLE_DITHER
#define COLOR_TEMPERATURE CRGB(255,255,255) // RGB value describing the color temperature
#define COLOR_CORRECTION CRGB(255,255,255) // RGB value describing the color correction
#define COLOR_CORRECTION TypicalLEDStrip // predefined fastled color correction
//#define COLOR_CORRECTION CRGB(255,255,255) // or RGB value describing the color correction
// Baudrate, higher rate allows faster refresh rate and more LEDs (defined in /etc/boblight.conf)
#define serialRate 460800 // use 115200 for ftdi based boards
// Baudrate, higher rate allows faster refresh rate and more LEDs
//#define serialRate 460800 // use 115200 for ftdi based boards
#define serialRate 115200 // use 115200 for ftdi based boards
//#define serialRate 500000 // use 115200 for ftdi based boards
/**************************************
@ -66,7 +78,7 @@ uint8_t prefix[] = {'A', 'd', 'a'}, hi, lo, chk, i;
unsigned long endTime;
// Define the array of leds
CRGB leds[NUM_LEDS];
CRGB leds[MAX_LEDS];
// set rgb to analog led stripe
void showAnalogRGB(const CRGB& led) {
@ -82,7 +94,7 @@ void showAnalogRGB(const CRGB& led) {
// set color to all leds
void showColor(const CRGB& led) {
#if NUM_LEDS > 1 || ANALOG_OUTPUT_ENABLED == false
#if MAX_LEDS > 1 || ANALOG_OUTPUT_ENABLED == false
LEDS.showColor(led);
#endif
showAnalogRGB(led);
@ -90,8 +102,8 @@ void showColor(const CRGB& led) {
// switch of digital and analog leds
void switchOff() {
#if ANALOG_ONLY == false
memset(leds, 0, NUM_LEDS * sizeof(struct CRGB));
#if MAX_LEDS > 1 || ANALOG_OUTPUT_ENABLED == false
memset(leds, 0, MAX_LEDS * sizeof(struct CRGB));
FastLED.show();
#endif
showAnalogRGB(leds[0]);
@ -114,32 +126,27 @@ bool checkIncommingData() {
// main function that setups and runs the code
void setup() {
// additional ground pin to make wiring a bit easier
pinMode(ANALOG_GROUND_PIN, OUTPUT);
digitalWrite(ANALOG_GROUND_PIN, LOW);
Serial.begin(serialRate);
// analog output
if (ANALOG_OUTPUT_ENABLED) {
// additional ground pin to make wiring a bit easier
pinMode(ANALOG_GROUND_PIN, OUTPUT);
digitalWrite(ANALOG_GROUND_PIN, LOW);
pinMode(ANALOG_BLUE_PIN , OUTPUT);
pinMode(ANALOG_RED_PIN , OUTPUT);
pinMode(ANALOG_GREEN_PIN, OUTPUT);
}
// Uncomment/edit one of the following lines for your leds arrangement.
int ledCount = NUM_LEDS;
int ledCount = MAX_LEDS;
if (ANALOG_MODE == ANALOG_MODE_LAST_LED) {
ledCount--;
}
#if NUM_LEDS > 1 || ANALOG_OUTPUT_ENABLED == false
#if SPI_LEDS == true
FastLED.addLeds<LED_TYPE, DATA_PIN, CLOCK_PIN, COLOR_ORDER>(leds, ledCount);
#else
FastLED.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, ledCount);
#endif
#if MAX_LEDS > 1 || ANALOG_OUTPUT_ENABLED == false
FastLED.addLeds<LED_TYPE, LED_PINS, COLOR_ORDER>(leds, ledCount);
#endif
// color adjustments
FastLED.setBrightness ( BRIGHTNESS );
FastLED.setTemperature( COLOR_TEMPERATURE );
@ -147,12 +154,21 @@ void setup() {
FastLED.setDither ( DITHER_MODE );
// initial RGB flash
showColor(CRGB(255, 0, 0)); delay(400);
showColor(CRGB(0, 255, 0)); delay(400);
showColor(CRGB(0, 0, 255)); delay(400);
#if INITIAL_LED_TEST_ENABLED == true
for (int v=0;v<INITIAL_LED_TEST_BRIGHTNESS;v++)
{
showColor(CRGB(v,v,v);
delay(INITIAL_LED_TEST_TIME_MS/2/INITIAL_LED_TEST_BRIGHTNESS);
}
for (int v=0;v<INITIAL_LED_TEST_BRIGHTNESS;v++)
{
showColor(CRGB(v,v,v);
delay(INITIAL_LED_TEST_TIME_MS/2/INITIAL_LED_TEST_BRIGHTNESS);
}
#endif
showColor(CRGB(0, 0, 0));
Serial.begin(serialRate);
Serial.print("Ada\n"); // Send "Magic Word" string to host
@ -161,7 +177,7 @@ void setup() {
// loop() is avoided as even that small bit of function overhead
// has a measurable impact on this code's overall throughput.
while (true) {
for(;;) {
// wait for first byte of Magic Word
for (i = 0; i < sizeof prefix; ++i) {
// If next byte is not in Magic Word, the start over
@ -181,14 +197,16 @@ void setup() {
// if checksum does not match go back to wait
if (chk != (hi ^ lo ^ 0x55)) continue;
memset(leds, 0, NUM_LEDS * sizeof(struct CRGB));
memset(leds, 0, MAX_LEDS * sizeof(struct CRGB));
transmissionSuccess = true;
sum_r = 0;
sum_g = 0;
sum_b = 0;
int num_leds = min ( MAX_LEDS, (hi<<8) + lo + 1 );
// read the transmission data and set LED values
for (uint8_t idx = 0; idx < NUM_LEDS; idx++) {
for (int idx = 0; idx < num_leds; idx++) {
byte r, g, b;
if (!checkIncommingData()) {
transmissionSuccess = false;
@ -218,22 +236,22 @@ void setup() {
// shows new values
if (transmissionSuccess) {
endTime = millis() + OFF_TIMEOUT;
#if NUM_LEDS > 1 || ANALOG_OUTPUT_ENABLED == false
#if MAX_LEDS > 1 || ANALOG_OUTPUT_ENABLED == false
FastLED.show();
#endif
#if ANALOG_OUTPUT_ENABLED == true
#if ANALOG_MODE == ANALOG_MODE_LAST_LED
showAnalogRGB(leds[NUM_LEDS-1]);
showAnalogRGB(leds[MAX_LEDS-1]);
#else
showAnalogRGB(CRGB(sum_r/NUM_LEDS, sum_g/NUM_LEDS, sum_b/NUM_LEDS));
showAnalogRGB(CRGB(sum_r/MAX_LEDS, sum_g/MAX_LEDS, sum_b/MAX_LEDS));
#endif
#endif
}
}
} // end of setup
void loop() {
// Not used. See note in setup() function.
}

View File

@ -0,0 +1,273 @@
// Arduino "bridge" code between host computer and WS2801-based digital
// RGB LED pixels (e.g. Adafruit product ID #322). Intended for use
// with USB-native boards such as Teensy or Adafruit 32u4 Breakout;
// works on normal serial Arduinos, but throughput is severely limited.
// LED data is streamed, not buffered, making this suitable for larger
// installations (e.g. video wall, etc.) than could otherwise be held
// in the Arduino's limited RAM.
// Some effort is put into avoiding buffer underruns (where the output
// side becomes starved of data). The WS2801 latch protocol, being
// delay-based, could be inadvertently triggered if the USB bus or CPU
// is swamped with other tasks. This code buffers incoming serial data
// and introduces intentional pauses if there's a threat of the buffer
// draining prematurely. The cost of this complexity is somewhat
// reduced throughput, the gain is that most visual glitches are
// avoided (though ultimately a function of the load on the USB bus and
// host CPU, and out of our control).
// LED data and clock lines are connected to the Arduino's SPI output.
// On traditional Arduino boards, SPI data out is digital pin 11 and
// clock is digital pin 13. On both Teensy and the 32u4 Breakout,
// data out is pin B2, clock is B1. LEDs should be externally
// powered -- trying to run any more than just a few off the Arduino's
// 5V line is generally a Bad Idea. LED ground should also be
// connected to Arduino ground.
// --------------------------------------------------------------------
// This file is part of Adalight.
// Adalight is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation, either version 3 of
// the License, or (at your option) any later version.
// Adalight is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
// You should have received a copy of the GNU Lesser General Public
// License along with Adalight. If not, see
// <http://www.gnu.org/licenses/>.
// --------------------------------------------------------------------
#include <SPI.h>
// LED pin for Adafruit 32u4 Breakout Board:
//#define LED_DDR DDRE
//#define LED_PORT PORTE
//#define LED_PIN _BV(PORTE6)
// LED pin for Teensy:
//#define LED_DDR DDRD
//#define LED_PORT PORTD
//#define LED_PIN _BV(PORTD6)
// LED pin for Arduino:
#define LED_DDR DDRB
#define LED_PORT PORTB
#define LED_PIN _BV(PORTB5)
// A 'magic word' (along with LED count & checksum) precedes each block
// of LED data; this assists the microcontroller in syncing up with the
// host-side software and properly issuing the latch (host I/O is
// likely buffered, making usleep() unreliable for latch). You may see
// an initial glitchy frame or two until the two come into alignment.
// The magic word can be whatever sequence you like, but each character
// should be unique, and frequent pixel values like 0 and 255 are
// avoided -- fewer false positives. The host software will need to
// generate a compatible header: immediately following the magic word
// are three bytes: a 16-bit count of the number of LEDs (high byte
// first) followed by a simple checksum value (high byte XOR low byte
// XOR 0x55). LED data follows, 3 bytes per LED, in order R, G, B,
// where 0 = off and 255 = max brightness.
static const uint8_t magic[] = {'A','d','a'};
#define MAGICSIZE sizeof(magic)
#define HEADERSIZE (MAGICSIZE + 3)
#define MODE_HEADER 0
#define MODE_HOLD 1
#define MODE_DATA 2
#define DATA_LED A5
#define SPI_LED A3
// If no serial data is received for a while, the LEDs are shut off
// automatically. This avoids the annoying "stuck pixel" look when
// quitting LED display programs on the host computer.
static const unsigned long serialTimeout = 15000; // 15 seconds
void setup()
{
// Dirty trick: the circular buffer for serial data is 256 bytes,
// and the "in" and "out" indices are unsigned 8-bit types -- this
// much simplifies the cases where in/out need to "wrap around" the
// beginning/end of the buffer. Otherwise there'd be a ton of bit-
// masking and/or conditional code every time one of these indices
// needs to change, slowing things down tremendously.
uint8_t
buffer[256],
indexIn = 0,
indexOut = 0,
mode = MODE_HEADER,
hi, lo, chk, i, spiFlag;
int16_t
bytesBuffered = 0,
hold = 0,
c;
int32_t
bytesRemaining;
unsigned long
startTime,
lastByteTime,
lastAckTime,
t;
bool
data_in_led = false,
spi_out_led = false;
LED_DDR |= LED_PIN; // Enable output for LED
LED_PORT &= ~LED_PIN; // LED off
pinMode(DATA_LED, OUTPUT); //data in led
pinMode(SPI_LED, OUTPUT); //data out led
delay(5000);
Serial.begin(115200); // Teensy/32u4 disregards baud rate; is OK!
SPI.begin();
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE0);
SPI.setClockDivider(SPI_CLOCK_DIV16); // 1 MHz max, else flicker
// Issue test pattern to LEDs on startup. This helps verify that
// wiring between the Arduino and LEDs is correct. Not knowing the
// actual number of LEDs connected, this sets all of them (well, up
// to the first 25,000, so as not to be TOO time consuming) to red,
// green, blue, then off. Once you're confident everything is working
// end-to-end, it's OK to comment this out and reprogram the Arduino.
uint8_t testcolor[] = { 0, 0, 0, 255, 0, 0 };
for(int i=0; i<5; i++){
for(SPDR = 0x00; !(SPSR & _BV(SPIF)); );
}
for(char n=3; n>=0; n--) {
for(c=0; c<25000; c++) {
for(i=0; i<3; i++) {
for(SPDR = testcolor[n + i]; !(SPSR & _BV(SPIF)); );
}
for(i=0; i<1; i++) {
for(SPDR = 0xFF; !(SPSR & _BV(SPIF)); );
}
}
for(int i=0; i<16; i++){
for(SPDR = 0x00; !(SPSR & _BV(SPIF)); );
}
delay(1); // One millisecond pause = latch
digitalWrite(SPI_LED, spi_out_led = !spi_out_led);
}
Serial.print("Ada\n"); // Send ACK string to host
startTime = micros();
lastByteTime = lastAckTime = millis();
// loop() is avoided as even that small bit of function overhead
// has a measurable impact on this code's overall throughput.
for(;;) {
digitalWrite(DATA_LED, LOW);
digitalWrite(SPI_LED, LOW);
// Implementation is a simple finite-state machine.
// Regardless of mode, check for serial input each time:
t = millis();
if((bytesBuffered < 256) && ((c = Serial.read()) >= 0)) {
buffer[indexIn++] = c;
bytesBuffered++;
lastByteTime = lastAckTime = t; // Reset timeout counters
} else {
// No data received. If this persists, send an ACK packet
// to host once every second to alert it to our presence.
if((t - lastAckTime) > 1000) {
Serial.print("Ada\n"); // Send ACK string to host
lastAckTime = t; // Reset counter
}
// If no data received for an extended time, turn off all LEDs.
if((t - lastByteTime) > serialTimeout) {
for(c=0; c<25000; c++) {
for(i=0; i<3; i++) {
for(SPDR = 0x00; !(SPSR & _BV(SPIF)); );
}
for(i=0; i<1; i++) {
for(SPDR = 0xFF; !(SPSR & _BV(SPIF)); );
}
}
delay(1); // One millisecond pause = latch
lastByteTime = t; // Reset counter
}
}
switch(mode) {
case MODE_HEADER:
// In header-seeking mode. Is there enough data to check?
if(bytesBuffered >= HEADERSIZE) {
// Indeed. Check for a 'magic word' match.
for(i=0; (i<MAGICSIZE) && (buffer[indexOut++] == magic[i++]););
if(i == MAGICSIZE) {
// Magic word matches. Now how about the checksum?
hi = buffer[indexOut++];
lo = buffer[indexOut++];
chk = buffer[indexOut++];
if(chk == (hi ^ lo ^ 0x55)) {
// Checksum looks valid. Get 16-bit LED count, add 1
// (# LEDs is always > 0) and multiply by 3 for R,G,B.
bytesRemaining = 4L * (256L * (long)hi + (long)lo) +4L + (256L *(long)hi + (long)lo +15)/16;
bytesBuffered -= 3;
spiFlag = 0; // No data out yet
mode = MODE_HOLD; // Proceed to latch wait mode
digitalWrite(DATA_LED, data_in_led = !data_in_led);
} else {
// Checksum didn't match; search resumes after magic word.
indexOut -= 3; // Rewind
}
} // else no header match. Resume at first mismatched byte.
bytesBuffered -= i;
}
break;
case MODE_HOLD:
// Ostensibly "waiting for the latch from the prior frame
// to complete" mode, but may also revert to this mode when
// underrun prevention necessitates a delay.
if((micros() - startTime) < hold) break; // Still holding; keep buffering
// Latch/delay complete. Advance to data-issuing mode...
LED_PORT &= ~LED_PIN; // LED off
mode = MODE_DATA; // ...and fall through (no break):
case MODE_DATA:
digitalWrite(SPI_LED, spi_out_led = !spi_out_led);
while(spiFlag && !(SPSR & _BV(SPIF))); // Wait for prior byte
if(bytesRemaining > 0) {
if(bytesBuffered > 0) {
SPDR = buffer[indexOut++]; // Issue next byte
bytesBuffered--;
bytesRemaining--;
spiFlag = 1;
}
// If serial buffer is threatening to underrun, start
// introducing progressively longer pauses to allow more
// data to arrive (up to a point).
// if((bytesBuffered < 32) && (bytesRemaining > bytesBuffered)) {
// startTime = micros();
// hold = 100 + (32 - bytesBuffered) * 10;
// mode = MODE_HOLD;
//}
} else {
// End of data -- issue latch:
startTime = micros();
hold = 1000; // Latch duration = 1000 uS
LED_PORT |= LED_PIN; // LED on
mode = MODE_HEADER; // Begin next header search
}
} // end switch
} // end for(;;)
}
void loop()
{
// Not used. See note in setup() function.
}

View File

@ -71,7 +71,7 @@
// XOR 0x55). LED data follows, 3 bytes per LED, in order R, G, B,
// where 0 = off and 255 = max brightness.
static const uint8_t magic[] = {'A', 'd', 'a'};
static const uint8_t magic[] = {'A','d','a'};
#define MAGICSIZE sizeof(magic)
#define HEADERSIZE (MAGICSIZE + 3)
@ -96,37 +96,39 @@ void setup()
// masking and/or conditional code every time one of these indices
// needs to change, slowing things down tremendously.
uint8_t
buffer[256],
indexIn = 0,
indexOut = 0,
mode = MODE_HEADER,
hi, lo, chk, i, spiFlag;
buffer[256],
indexIn = 0,
indexOut = 0,
mode = MODE_HEADER,
hi, lo, chk, i, spiFlag;
int16_t
bytesBuffered = 0,
hold = 0,
c;
bytesBuffered = 0,
hold = 0,
c;
int32_t
bytesRemaining;
bytesRemaining;
unsigned long
startTime,
lastByteTime,
lastAckTime,
t;
bool
data_in_led = false,
spi_out_led = false;
startTime,
lastByteTime,
lastAckTime,
t;
bool
data_in_led = false,
spi_out_led = false;
LED_DDR |= LED_PIN; // Enable output for LED
LED_PORT &= ~LED_PIN; // LED off
pinMode(DATA_LED, OUTPUT); //data in led
pinMode(SPI_LED, OUTPUT); //data out led
delay(5000);
Serial.begin(115200); // Teensy/32u4 disregards baud rate; is OK!
SPI.begin();
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE0);
SPI.setClockDivider(SPI_CLOCK_DIV8); // 2Mhz
SPI.setClockDivider(SPI_CLOCK_DIV16); // 1 MHz max, else flicker
// Issue test pattern to LEDs on startup. This helps verify that
// wiring between the Arduino and LEDs is correct. Not knowing the
@ -135,23 +137,24 @@ void setup()
// green, blue, then off. Once you're confident everything is working
// end-to-end, it's OK to comment this out and reprogram the Arduino.
uint8_t testcolor[] = { 0, 0, 0, 255, 0, 0 };
for (char n = 3; n >= 0; n--) {
for (int i = 0; i < 4; i++) { //Start Frame
for (SPDR = 0x00; !(SPSR & _BV(SPIF)); );
}
for (c = 0; c < 25000; c++) {
for (SPDR = 0xFF; !(SPSR & _BV(SPIF)); ); //Brightness byte
for (i = 0; i < 3; i++) {
for (SPDR = testcolor[n + i]; !(SPSR & _BV(SPIF)); ); //BGR
for(int i=0; i<5; i++){
for(SPDR = 0x00; !(SPSR & _BV(SPIF)); );
}
for(char n=3; n>=0; n--) {
for(c=0; c<25000; c++) {
for(i=0; i<3; i++) {
for(SPDR = testcolor[n + i]; !(SPSR & _BV(SPIF)); );
}
for(i=0; i<1; i++) {
for(SPDR = 0xFF; !(SPSR & _BV(SPIF)); );
}
}
for (int i = 0; i < 4; i++) { //Stop Frame
for (SPDR = 0xFF; !(SPSR & _BV(SPIF)); );
for(int i=0; i<16; i++){
for(SPDR = 0x00; !(SPSR & _BV(SPIF)); );
}
delay(1); // One millisecond pause = latch
digitalWrite(SPI_LED, spi_out_led = !spi_out_led);
}
digitalWrite(SPI_LED, spi_out_led = !spi_out_led);
Serial.print("Ada\n"); // Send ACK string to host
@ -161,109 +164,105 @@ void setup()
// loop() is avoided as even that small bit of function overhead
// has a measurable impact on this code's overall throughput.
for (;;) {
for(;;) {
digitalWrite(DATA_LED, LOW);
digitalWrite(SPI_LED, LOW);
// Implementation is a simple finite-state machine.
// Regardless of mode, check for serial input each time:
t = millis();
if ((bytesBuffered < 256) && ((c = Serial.read()) >= 0)) {
if((bytesBuffered < 256) && ((c = Serial.read()) >= 0)) {
buffer[indexIn++] = c;
bytesBuffered++;
lastByteTime = lastAckTime = t; // Reset timeout counters
} else {
// No data received. If this persists, send an ACK packet
// to host once every second to alert it to our presence.
if ((t - lastAckTime) > 1000) {
if((t - lastAckTime) > 1000) {
Serial.print("Ada\n"); // Send ACK string to host
lastAckTime = t; // Reset counter
}
// If no data received for an extended time, turn off all LEDs.
if ((t - lastByteTime) > serialTimeout) {
for (i = 0; i < 4; i++) { //Start Frame
for (SPDR = 0x00; !(SPSR & _BV(SPIF)); );
}
for (c = 0; c < 25000; c++) {
for (SPDR = 0xFF; !(SPSR & _BV(SPIF)); ); //Brightness Byte
for (i = 0; i < 3; i++) {
for (SPDR = 0x00; !(SPSR & _BV(SPIF)); ); //BGR
if((t - lastByteTime) > serialTimeout) {
for(c=0; c<25000; c++) {
for(i=0; i<3; i++) {
for(SPDR = 0x00; !(SPSR & _BV(SPIF)); );
}
for(i=0; i<1; i++) {
for(SPDR = 0xFF; !(SPSR & _BV(SPIF)); );
}
}
}
for (i = 0; i < 4; i++) { //Stop Frame
for (SPDR = 0xFF; !(SPSR & _BV(SPIF)); );
}
delay(1); // One millisecond pause = latch
lastByteTime = t; // Reset counter
}
}
switch (mode) {
switch(mode) {
case MODE_HEADER:
case MODE_HEADER:
// In header-seeking mode. Is there enough data to check?
if (bytesBuffered >= HEADERSIZE) {
// Indeed. Check for a 'magic word' match.
for (i = 0; (i < MAGICSIZE) && (buffer[indexOut++] == magic[i++]););
if (i == MAGICSIZE) {
// Magic word matches. Now how about the checksum?
hi = buffer[indexOut++];
lo = buffer[indexOut++];
chk = buffer[indexOut++];
if (chk == (hi ^ lo ^ 0x55)) {
// Checksum looks valid. Get 16-bit LED count, add 1
// (# LEDs is always > 0) and multiply by 3 for R,G,B.
bytesRemaining = 4L * (256L * (long)hi + (long)lo) + 4L + (256L * (long)hi + (long)lo + 15) / 16;
bytesBuffered -= 3;
spiFlag = 0; // No data out yet
mode = MODE_HOLD; // Proceed to latch wait mode
digitalWrite(DATA_LED, data_in_led = !data_in_led);
} else {
// Checksum didn't match; search resumes after magic word.
indexOut -= 3; // Rewind
}
} // else no header match. Resume at first mismatched byte.
bytesBuffered -= i;
}
break;
case MODE_HOLD:
// Ostensibly "waiting for the latch from the prior frame
// to complete" mode, but may also revert to this mode when
// underrun prevention necessitates a delay.
if ((micros() - startTime) < hold) break; // Still holding; keep buffering
// Latch/delay complete. Advance to data-issuing mode...
LED_PORT &= ~LED_PIN; // LED off
mode = MODE_DATA; // ...and fall through (no break):
case MODE_DATA:
digitalWrite(SPI_LED, spi_out_led = !spi_out_led);
while (spiFlag && !(SPSR & _BV(SPIF))); // Wait for prior byte
if (bytesRemaining > 0) {
if (bytesBuffered > 0) {
SPDR = buffer[indexOut++]; // Issue next byte
bytesBuffered--;
bytesRemaining--;
spiFlag = 1;
// In header-seeking mode. Is there enough data to check?
if(bytesBuffered >= HEADERSIZE) {
// Indeed. Check for a 'magic word' match.
for(i=0; (i<MAGICSIZE) && (buffer[indexOut++] == magic[i++]););
if(i == MAGICSIZE) {
// Magic word matches. Now how about the checksum?
hi = buffer[indexOut++];
lo = buffer[indexOut++];
chk = buffer[indexOut++];
if(chk == (hi ^ lo ^ 0x55)) {
// Checksum looks valid. Get 16-bit LED count, add 1
// (# LEDs is always > 0) and multiply by 3 for R,G,B.
bytesRemaining = 4L * (256L * (long)hi + (long)lo) +4L + (256L *(long)hi + (long)lo +15)/16;
bytesBuffered -= 3;
spiFlag = 0; // No data out yet
mode = MODE_HOLD; // Proceed to latch wait mode
digitalWrite(DATA_LED, data_in_led = !data_in_led);
} else {
// Checksum didn't match; search resumes after magic word.
indexOut -= 3; // Rewind
}
// If serial buffer is threatening to underrun, start
// introducing progressively longer pauses to allow more
// data to arrive (up to a point).
if ((bytesBuffered < 32) && (bytesRemaining > bytesBuffered)) {
startTime = micros();
hold = 100 + (32 - bytesBuffered) * 10;
mode = MODE_HOLD;
}
} else {
// End of data -- issue latch:
startTime = micros();
hold = 1000; // Latch duration = 1000 uS
LED_PORT |= LED_PIN; // LED on
mode = MODE_HEADER; // Begin next header search
} // else no header match. Resume at first mismatched byte.
bytesBuffered -= i;
}
break;
case MODE_HOLD:
// Ostensibly "waiting for the latch from the prior frame
// to complete" mode, but may also revert to this mode when
// underrun prevention necessitates a delay.
if((micros() - startTime) < hold) break; // Still holding; keep buffering
// Latch/delay complete. Advance to data-issuing mode...
LED_PORT &= ~LED_PIN; // LED off
mode = MODE_DATA; // ...and fall through (no break):
case MODE_DATA:
digitalWrite(SPI_LED, spi_out_led = !spi_out_led);
while(spiFlag && !(SPSR & _BV(SPIF))); // Wait for prior byte
if(bytesRemaining > 0) {
if(bytesBuffered > 0) {
SPDR = buffer[indexOut++]; // Issue next byte
bytesBuffered--;
bytesRemaining--;
spiFlag = 1;
}
// If serial buffer is threatening to underrun, start
// introducing progressively longer pauses to allow more
// data to arrive (up to a point).
if((bytesBuffered < 32) && (bytesRemaining > bytesBuffered)) {
startTime = micros();
hold = 100 + (32 - bytesBuffered) * 10;
mode = MODE_HOLD;
}
} else {
// End of data -- issue latch:
startTime = micros();
hold = 1000; // Latch duration = 1000 uS
LED_PORT |= LED_PIN; // LED on
mode = MODE_HEADER; // Begin next header search
}
} // end switch
} // end for(;;)
}

View File

@ -0,0 +1,197 @@
#!/usr/bin/env python
#
# Simple UDP to Serial redirector.
# Author: https://github.com/penfold42
# raw udp packets to raw serial:
# python.exe udp_adalight.py -P 2801 COM4 115200
# raw udp packets to adalight serial protocol:
# python.exe udp_adalight.py -a -P 2801 COM4 115200
# Derived from: https://github.com/pyserial/pyserial/blob/master/examples/tcp_serial_redirect.py
#
# (C) 2002-2016 Chris Liechti <cliechti@gmx.net>
#
# SPDX-License-Identifier: BSD-3-Clause
import sys
import socket
import serial
import serial.threaded
import time
class SerialToNet(serial.threaded.Protocol):
"""serial->socket"""
def __init__(self):
self.socket = None
def __call__(self):
return self
def data_received(self, data):
if self.socket is not None:
self.socket.sendall(data)
if __name__ == '__main__': # noqa
import argparse
parser = argparse.ArgumentParser(
description='Simple UDP to Serial redirector.',
epilog="""\
NOTE: no security measures are implemented. Anyone can remotely connect
to this service over the network.
""")
parser.add_argument(
'SERIALPORT',
help="serial port name")
parser.add_argument(
'BAUDRATE',
type=int,
nargs='?',
help='set baud rate, default: %(default)s',
default=115200)
parser.add_argument(
'-q', '--quiet',
action='store_true',
help='suppress non error messages',
default=False)
parser.add_argument(
'-a', '--ada',
action='store_true',
help='prepend adalight header to serial packets',
default=False)
parser.add_argument(
'--develop',
action='store_true',
help='Development mode, prints Python internals on errors',
default=False)
group = parser.add_argument_group('serial port')
group.add_argument(
"--parity",
choices=['N', 'E', 'O', 'S', 'M'],
type=lambda c: c.upper(),
help="set parity, one of {N E O S M}, default: N",
default='N')
group.add_argument(
'--rtscts',
action='store_true',
help='enable RTS/CTS flow control (default off)',
default=False)
group.add_argument(
'--xonxoff',
action='store_true',
help='enable software flow control (default off)',
default=False)
group.add_argument(
'--rts',
type=int,
help='set initial RTS line state (possible values: 0, 1)',
default=None)
group.add_argument(
'--dtr',
type=int,
help='set initial DTR line state (possible values: 0, 1)',
default=None)
group = parser.add_argument_group('network settings')
exclusive_group = group.add_mutually_exclusive_group()
exclusive_group.add_argument(
'-P', '--localport',
type=int,
help='local UDP port',
default=2801)
args = parser.parse_args()
# connect to serial port
ser = serial.serial_for_url(args.SERIALPORT, do_not_open=True)
ser.baudrate = args.BAUDRATE
ser.parity = args.parity
ser.rtscts = args.rtscts
ser.xonxoff = args.xonxoff
if args.rts is not None:
ser.rts = args.rts
if args.dtr is not None:
ser.dtr = args.dtr
if not args.quiet:
sys.stderr.write(
'--- UDP to Serial redirector\n'
'--- listening on udp port {a.localport}\n'
'--- sending to {p.name} {p.baudrate},{p.bytesize}{p.parity}{p.stopbits}\n'
'--- type Ctrl-C / BREAK to quit\n'.format(p=ser, a=args))
try:
ser.open()
except serial.SerialException as e:
sys.stderr.write('Could not open serial port {}: {}\n'.format(ser.name, e))
sys.exit(1)
ser_to_net = SerialToNet()
serial_worker = serial.threaded.ReaderThread(ser, ser_to_net)
serial_worker.start()
srv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
srv.bind(('', args.localport))
try:
intentional_exit = False
while True:
try:
while True:
try:
data,addr = srv.recvfrom(1024)
if not data:
break
if args.ada:
numleds = len(data)/3
hi = (numleds-1)/256
lo = (numleds-1)&255
sum = hi^lo^0x55
ser.write ("Ada"+ chr(hi) + chr(lo) + chr(sum))
ser.write(data) # get a bunch of bytes and send them
except socket.error as msg:
if args.develop:
raise
sys.stderr.write('ERROR: {}\n'.format(msg))
# probably got disconnected
break
except KeyboardInterrupt:
intentional_exit = True
raise
except socket.error as msg:
if args.develop:
raise
sys.stderr.write('ERROR: {}\n'.format(msg))
finally:
ser_to_net.socket = None
sys.stderr.write('Disconnected\n')
except KeyboardInterrupt:
pass
sys.stderr.write('\n--- exit ---\n')
serial_worker.stop()

View File

@ -0,0 +1,447 @@
#include <pt.h>
#include "FastLED.h"
#define ANALOG_MODE_AVERAGE 0
#define ANALOG_MODE_LAST_LED 1
/*==============================================================================*/
/* LED und Arduino Variablen */
/*==============================================================================*/
#define INITIAL_LED_TEST_ENABLED true
#define INITIAL_LED_TEST_BRIGHTNESS 32 // 0..255
#define INITIAL_LED_TEST_TIME_MS 500 // 0..255
#define MAX_LEDS 400 // Number of LEDs
#define MAX_ARGS 10 // Max Number of command arguments
#define BAUDRATE 460800 // Baudrate
#define SERIAL Serial // Serial port for communication
#define NUM_LEDS_PER_STRIP 20
// type of your led controller, possible values, see below
#define LED_TYPE WS2812B
// 3 wire (pwm): NEOPIXEL BTM1829 TM1812 TM1809 TM1804 TM1803 UCS1903 UCS1903B UCS1904 UCS2903 WS2812 WS2852
// S2812B SK6812 SK6822 APA106 PL9823 WS2811 WS2813 APA104 WS2811_40 GW6205 GW6205_40 LPD1886 LPD1886_8BIT
// 4 wire (spi): LPD8806 WS2801 WS2803 SM16716 P9813 APA102 SK9822 DOTSTAR
// For 3 wire led stripes line Neopixel/Ws2812, which have a data line, ground, and power, you just need to define DATA_PIN.
// For led chipsets that are SPI based (four wires - data, clock, ground, and power), both defines DATA_PIN and CLOCK_PIN are needed
// DATA_PIN, or DATA_PIN, CLOCK_PIN
#define LED_PINS 6 // 3 wire leds
//#define LED_PINS 6, 13 // 4 wire leds
#define COLOR_ORDER GRB // colororder of the stripe, set RGB in hyperion
#define OFF_TIMEOUT 15000 // ms to switch off after no data was received, set 0 to deactivate
// analog rgb uni color led stripe - using of hyperion smoothing is recommended
// ATTENTION this pin config is default for atmega328 based arduinos, others might work to
// if you have flickering analog leds this might be caused by unsynced pwm signals
// try other pins is more or less the only thing that helps
#define ANALOG_OUTPUT_ENABLED false
#define ANALOG_MODE ANALOG_MODE_LAST_LED // use ANALOG_MODE_AVERAGE or ANALOG_MODE_LAST_LED
#define ANALOG_GROUND_PIN 8 // additional ground pin to make wiring a bit easier
#define ANALOG_RED_PIN 9
#define ANALOG_GREEN_PIN 10
#define ANALOG_BLUE_PIN 11
// overall color adjustments
#define ANALOG_BRIGHTNESS_RED 255 // maximum brightness for analog 0-255
#define ANALOG_BRIGHTNESS_GREEN 255 // maximum brightness for analog 0-255
#define ANALOG_BRIGHTNESS_BLUE 255 // maximum brightness for analog 0-255
#define BRIGHTNESS 255 // maximum brightness 0-255
#define DITHER_MODE BINARY_DITHER // BINARY_DITHER or DISABLE_DITHER
#define COLOR_TEMPERATURE CRGB(255,255,255) // RGB value describing the color temperature
#define COLOR_CORRECTION TypicalLEDStrip // predefined fastled color correction
//#define COLOR_CORRECTION CRGB(255,255,255) // or RGB value describing the color correction
// Baudrate, higher rate allows faster refresh rate and more LEDs
//#define serialRate 460800 // use 115200 for ftdi based boards
#define serialRate 115200 // use 115200 for ftdi based boards
//#define serialRate 500000 // use 115200 for ftdi based boards
/*==============================================================================*/
/* TPM2 Variablen */
/*==============================================================================*/
enum Protocol
{
// positions
posStart = 0,
posType = 1,
posFsHigh = 2,
posFsLow = 3,
posData = 4,
// bytes
tpm2Start = 0xc9,
tpm2DataFrame = 0xda,
tpm2Command = 0xc0,
tpm2Answer = 0xaa,
tpm2End = 0x36,
tpm2Ack = 0xAC
};
enum Mode
{
mNone,
mCommunication,
mProgram
};
struct Data
{
int pos;
uint8_t type;
uint16_t fs;
uint16_t maxSize;
uint8_t command;
CRGB rgb[MAX_LEDS];
} data;
byte args[MAX_ARGS];
unsigned long lastDataAt = 0;
int program = 0;
int mode = mNone;
int effectDelay = 100;
static struct pt pt1;
// int freeRam()
// {
// extern int __heap_start, *__brkval;
// int v;
// return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
// }
void setup()
{
SERIAL.begin(BAUDRATE);
delay(1000);
int ledCount = MAX_LEDS;
if (ANALOG_MODE == ANALOG_MODE_LAST_LED) {
ledCount--;
}
memset(data.rgb, 0, sizeof(struct CRGB) * ledCount);
FastLED.addLeds<LED_TYPE, LED_PINS, COLOR_ORDER>(data.rgb, ledCount);
// color adjustments
FastLED.setBrightness ( BRIGHTNESS );
FastLED.setTemperature( COLOR_TEMPERATURE );
FastLED.setCorrection ( COLOR_CORRECTION );
FastLED.setDither ( DITHER_MODE );
#ifdef INITIAL_LED_TEST_ENABLED
for (int v=0;v<INITIAL_LED_TEST_BRIGHTNESS;v++)
{
oneColorAll(v,v,v);
delay(INITIAL_LED_TEST_TIME_MS/2/INITIAL_LED_TEST_BRIGHTNESS);
}
for (int v=0;v<INITIAL_LED_TEST_BRIGHTNESS;v++)
{
oneColorAll(INITIAL_LED_TEST_BRIGHTNESS-v,INITIAL_LED_TEST_BRIGHTNESS-v,INITIAL_LED_TEST_BRIGHTNESS-v);
delay(INITIAL_LED_TEST_TIME_MS/2/INITIAL_LED_TEST_BRIGHTNESS);
}
#define BRIGHT 127 //max led intensity (1-500)
#define INHALE 1250 //Inhalation time in milliseconds.
#define PULSE INHALE*1000/BRIGHT
#define REST 1000 //Rest Between Inhalations.
while(true)
{
//ramp increasing intensity, Inhalation:
for (int i=1;i<BRIGHT;i++){
oneColorAll(i,i,i);
delayMicroseconds(PULSE-i*10); // wait
delay(0); //to prevent watchdog firing.
}
//ramp decreasing intensity, Exhalation (half time):
for (int i=BRIGHT-1;i>0;i--){
oneColorAll(i,i,i);
delayMicroseconds(PULSE-i*10); // wait
i--;
delay(0); //to prevent watchdog firing.
}
delay(REST); //take a rest...
}
#endif
oneColorAll(0,0,0);
memset(args, 0, MAX_ARGS);
resetVars();
PT_INIT(&pt1);
while (!SERIAL) {
; // wait for serial port to connect. Needed for native USB
}
}
/*==============================================================================*/
/* Thread für Programm/Effekte
/*==============================================================================*/
static int playProgramThread(struct pt *pt)
{
static unsigned long timestamp = 0;
PT_BEGIN(pt);
while(1)
{
PT_WAIT_UNTIL(pt, millis() - timestamp > effectDelay);
playProgram();
timestamp = millis();
}
PT_END(pt);
}
/*==============================================================================*/
/* loop
/*==============================================================================*/
void loop()
{
while (1)
{
// if data available switch to communication mode
if (SERIAL.available() > 0)
{
if (mode != mCommunication)
{
mode = mCommunication;
resetVars();
}
doCommunication();
}
else
// communication timeout after 0.5 seconds
while (SERIAL.available() == 0 && millis()-lastDataAt > 1000)
{
if (mode != mProgram)
{
mode = mProgram;
resetVars();
}
else
playProgramThread(&pt1);
}
}
}
/*==============================================================================*/
/* do communication
/*==============================================================================*/
void doCommunication()
{
// read ...
while (SERIAL.available() > 0)
{
byte val = SERIAL.read();
lastDataAt = millis();
if (data.pos == posStart && val == tpm2Start) // Startbyte
resetVars();
else if (data.pos == posType && (val == tpm2DataFrame || val == tpm2Command)) // Block-Art
data.type = val;
else if (data.pos == posFsHigh) // Framesize (High Bit)
{
data.fs = (val << 8) & 0xFF00;
data.maxSize = data.fs;
}
else if (data.pos == posFsLow) // Framesize (Low byte)
{
data.fs += val & 0x00FF;
data.maxSize = data.fs;
if (data.fs > MAX_LEDS*3) // framsize too high
{
data.fs = MAX_LEDS*3;
}
}
else if (data.pos == posData + data.maxSize && val == tpm2End) // End Byte
parsePacket();
else if (data.pos >= posData && data.pos < posData+data.fs) // Bytes zwischen Header und Ende lesen
evaluateData(val);
else if (data.pos >= posData && data.pos < posData+data.maxSize) // Bytes zwischen Header und Ende lesen
continue;
else // protocol violation ...
{
resetVars();
continue;
}
data.pos++;
}
}
/*==============================================================================*/
/* evaluate data
/*==============================================================================*/
void evaluateData(byte val)
{
if (data.type == tpm2DataFrame) // frame data
{
uint8_t* rgb = (uint8_t*)data.rgb;
rgb[data.pos-posData] = val;
}
else // command data
{
if (data.pos == posData)
{
data.command = val;
memset(args, 0, sizeof(args));
}
else
args[data.pos-posData-1] = val;
}
}
/*==============================================================================*/
/* reset variables
/*==============================================================================*/
void resetVars()
{
memset(&data, 0, sizeof(Data));
//data.rgb = (struct CRGB*)FastSPI_LED.getRGBData();
memset(data.rgb, 0, MAX_LEDS * sizeof(struct CRGB));
}
/*==============================================================================*/
/* parse packet
/*==============================================================================*/
void parsePacket()
{
switch (data.type)
{
case tpm2DataFrame:
{
showLeds();
break;
}
case tpm2Command:
{
setProgram();
break;
}
default:
break;
}
SERIAL.write(tpm2Ack);
resetVars();
data.pos = -1;
}
/*==============================================================================*/
/* set LED color
/*==============================================================================*/
void setLedColor(int led, uint8_t r, uint8_t g, uint8_t b)
{
data.rgb[led].r = r;
data.rgb[led].g = g;
data.rgb[led].b = b;
}
/*==============================================================================*/
/* one Color All
/*==============================================================================*/
void oneColorAll(uint8_t r, uint8_t g, uint8_t b)
{
memset(data.rgb, 0, MAX_LEDS * sizeof(struct CRGB));
for (int led = 0; led < MAX_LEDS; led++)
setLedColor(led, r, g, b);
showLeds();
effectDelay = 1000;
}
/*==============================================================================*/
/* Output Leds
/*==============================================================================*/
void showLeds()
{
FastLED.show();
}
void setProgram()
{
program = data.command;
}
void playProgram()
{
switch (program)
{
case 0: oneColorAll(args[0],args[1],args[2]); break;
case 1: rainbow_loop(20); break;
default: oneColorAll(0,0,0); break;
}
}
/* Set LED Color of given LED */
void oneColorAllNOSHOW(int r, int g, int b)
{
resetVars();
for (int led = 0; led < MAX_LEDS; led++)
{
setLedColor(led, r, g, b);
}
}
/*==============================================================================*/
/* Effect 0: Fixed color - Arguments RR GG BB
/*==============================================================================*/
/*==============================================================================*/
/* Effect 1: Loops rainbow colors around the stripe
/*==============================================================================*/
void rainbow_loop(int idelay) { //-LOOP HSV RAINBOW
static double idex = 0;
static double ihue = 0;
double steps = (double)255/MAX_LEDS;
for(int led = 0 ; led < MAX_LEDS; led++ ) {
ihue = led * steps + idex;
if (ihue >= 255)
ihue -= 255;
data.rgb[led] = CHSV((int)ihue, 255, 255);
if (led == 0)
idex += steps;
if (idex >= 255)
idex = 0;
}
showLeds();
effectDelay = idelay;
}

View File

@ -0,0 +1,34 @@
<div class="container-fluid">
<h3 class="page-header"><i class="fa fa-info-circle fa-fw"></i><span data-i18n="main_menu_about_token">About Hyperion</span></h3>
<div class="row">
<div class="col-lg-6">
<div id="about_cont"></div>
</div>
</div>
</div>
<script type="text/javascript">
performTranslation();
var si = serverInfo.info.hyperion[0];
var libs = {"Bootstrap 3" : "http://getbootstrap.com/", "JQuery" : "https://jquery.com/", "Bootstrap Colorpicker" : "https://itsjavi.com/bootstrap-colorpicker/", "JSON-Editor" : "http://jeremydorn.com/json-editor/", "jQuery.i18n" : "https://github.com/wikimedia/jquery.i18n", "metisMenu" : "http://mm.onokumus.com/index.html", "download.js" : "http://danml.com/download.html", "gijgo" : "http://gijgo.com/"};
var libh = "";
var lang = [];
for(var i = 0; i<availLang.length; i++)
lang.push($.i18n('general_speech_'+availLang[i]));
for(key in libs)
libh += '<a href="'+libs[key]+'" target="_blank">'+key+'</a>, ';
libh += "<br/>"+$.i18n("about_credits");
lang = lang.toString().replace(",",", ");
var fc = [$.i18n("about_version"),$.i18n("about_build"),$.i18n("about_builddate"),$.i18n("about_translations"),$.i18n("about_resources", $.i18n("general_webui_title"))];
var sc = [currentVersion,si.build,si.time,'('+availLang.length+')<p>'+lang+'</p><p><a href="#" target="_blank">'+$.i18n("about_contribute")+'</a></p>',libh];
createTable("","atb","about_cont");
for(var i = 0; i<fc.length; i++)
$('.atb').append(createTableRow([fc[i],sc[i]], "atb", false, true));
</script>

View File

@ -1,20 +0,0 @@
<div class="container-fluid">
<div class="row">
<div class="col-lg-12">
<h2 class="page-header"><i class="fa fa-photo fa-fw"></i><span lang="en" data-lang-token="main_menu_colors_conf_token">Image Processing</span></h2>
<div class="introd">
<h4 lang="en" data-lang-token="conf_colors_label_intro">Color calibration, smoothing (color transistions) and detection of blackbars.</h4>
</div>
<hr />
<div class="col-lg-12">
<div id='editor_container'/>
<button class="btn btn-success" id='btn_submit' lang="en" data-lang-token="general_button_savesettings">Save Settings</button>
</div>
</div>
</div>
</div>
<script src="/js/content_colors.js"></script>

View File

@ -0,0 +1,12 @@
<div class="container-fluid">
<div class="row">
<div class="col-lg-12">
<h3 class="page-header"><i class="fa fa-photo fa-fw"></i><span data-i18n="main_menu_colors_conf_token">Image Processing</span></h3>
<div id="conf_cont"></div>
</div>
</div>
</div>
<script src="/js/content_colors.js"></script>

View File

@ -0,0 +1,10 @@
<div class="container-fluid">
<div class="row">
<div class="col-lg-12">
<h3 class="page-header"><i class="fa fa-spinner fa-fw"></i><span data-i18n="main_menu_effect_conf_token">Effects</span></h3>
<div id="conf_cont"></div>
</div>
</div>
</div>
<script src="/js/content_effects.js"></script>

View File

@ -0,0 +1,26 @@
<div class="container-fluid">
<div class="row">
<div class="col-lg-12">
<h3 class="page-header"><i class="fa fa-wrench fa-fw"></i><span data-i18n="conf_general_label_title">General</span></h3>
<div class="row" id="conf_cont"></div>
<div class="row">
<div class="col-lg-6" id="conf_imp">
<div class="panel panel-default">
<div class="panel-heading"><i class="fa fa-wrench fa-fw"></i><span data-i18n="conf_general_impexp_title"></span></div>
<div class="panel-body">
<p data-i18n="conf_general_impexp_l1" style="font-weight:bold"></p>
<p data-i18n="conf_general_impexp_l2" style="font-weight:bold"></p>
<input type="file" id="select_import_conf" accept=".json">
</div>
<div class="panel-footer" style="text-align:right">
<button type="file" class="btn btn-primary" id="btn_import_conf" data-i18n="conf_general_impexp_impbtn" disabled>Import</button>
<button class="btn btn-primary" id="btn_export_conf" data-i18n="conf_general_impexp_expbtn">Export</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="/js/content_general.js"></script>

View File

@ -0,0 +1,12 @@
<div class="container-fluid">
<div class="row">
<div class="col-lg-12">
<h3 class="page-header"><i class="fa fa-camera fa-fw"></i><span data-i18n="main_menu_grabber_conf_token">Capturing Hardware</span></h3>
<div id="conf_cont"></div>
</div>
</div>
</div>
<script src="/js/content_grabber.js"></script>

View File

@ -0,0 +1,14 @@
<div class="container-fluid">
<div class="row">
<div class="col-lg-12">
<h3 class="page-header"><i class="fa fa-play-circle-o fa-fw"></i><span data-i18n="conf_kodi_label_title">Kodi Watch</span></h3>
<div class="alert alert-info" role="alert">
<strong>HINT 1:</strong> In any case you need to enable the remote control for Kodi. Please checkout Wiki for instructions. LINK<br>
<strong>HINT 2:</strong> If you just use a USB-Grabber you could enable the Kodi Watch for this separately at the USB-Grabber page.
</div>
<div class="row" id="conf_cont"></div>
</div>
</div>
</div>
<script src="/js/content_kodi.js"></script>

View File

@ -0,0 +1,309 @@
<div class="container-fluid">
<h3 class="page-header"><i class="fa fa-lightbulb-o fa-fw"></i><span data-i18n="main_menu_leds_conf_token">LED Hardware</span></h3>
<ul id="leds_cfg_nav" class="nav nav-tabs">
<li class="active"><a data-toggle="tab" href="#menu_controller" data-i18n="conf_leds_nav_label_ledcontroller">LED Controller</a></li>
<li><a data-toggle="tab" href="#menu_gencfg" data-i18n="conf_leds_nav_label_ledlayout">LED Layout</a></li>
</ul>
<div class="tab-content">
<div id="menu_controller" class="tab-pane fade in active" style="padding-top:10px">
<div class="row">
<div class="col-lg-12" id="leddevice_intro"></div>
<div class="col-lg-6">
<div class="panel panel-default">
<div class="panel-heading form-group">
<label for="leddevices" class="panel-title" data-i18n="conf_leds_contr_label_contrtype">Controller type:</label>
<select id="leddevices" class="form-control" style="color:black;width:auto;margin-left:10px;display:inline-block" />
</div>
<div class="panel-body">
<div id="ledDeviceOptions"> <div id='editor_container'></div> </div>
</div>
<div class="panel-footer" style="text-align:right">
<button id='btn_submit_controller' class="btn btn-primary"><i class="fa fa-fw fa-save" /><span data-i18n="general_button_savesettings">Save Settings</span></button>
</div>
</div>
</div>
</div>
</div>
<div id="menu_gencfg" class="tab-pane fade" style="padding-top:10px">
<div class="row">
<div class="col-lg-12" id="layout_intro"></div>
<div class="col-lg-6 col-md-12">
<div class="panel-group" id="accordion">
<div class="panel panel-primary">
<div class="panel-heading headcollapse" data-toggle="collapse" data-parent="#accordion" data-target="#collapse1">
<h4 class="panel-title">
<a><i class="fa fa-television fa-fw"></i><span data-i18n="conf_leds_layout_frame">Classic Layout (LED Frame)</span></a>
</h4>
</div>
<div id="collapse1" class="panel-collapse collapse in">
<div class="panel-body">
<table class="table borderless">
<tbody>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_top" data-i18n="conf_leds_layout_cl_top">Top</label>
</td>
<td class="itd input-group">
<input class="form-control ledCLconstr " id="ip_cl_top" type="number" value="10" min="0" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_leds">LEDs</div>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_bottom" data-i18n="conf_leds_layout_cl_bottom">Bottom</label>
</td>
<td class="itd input-group">
<input class="form-control ledCLconstr" id="ip_cl_bottom" type="number" value="10" min="0" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_leds">LEDs</div>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_left" data-i18n="conf_leds_layout_cl_left">Left</label>
</td>
<td class="itd input-group">
<input class="form-control ledCLconstr" id="ip_cl_left" type="number" value="6" min="0" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_leds">LEDs</div>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_right" data-i18n="conf_leds_layout_cl_right">Right</label>
</td>
<td class="itd input-group">
<input class="form-control ledCLconstr" id="ip_cl_right" type="number" value="6" min="0" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_leds">LEDs</div>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_glength" data-i18n="conf_leds_layout_cl_gaglength">Gap length</label>
</td>
<td class="itd input-group">
<input class="form-control ledCLconstr" id="ip_cl_glength" type="number" value="0" min="0" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_leds">LEDs</div>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_gpos" data-i18n="conf_leds_layout_cl_gappos">Gap position</label>
</td>
<td class="itd">
<input class="form-control ledCLconstr" id="ip_cl_gpos" type="number" value="0" min="0" step="1">
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_position" data-i18n="conf_leds_layout_cl_inppos">Input position</label>
</td>
<td class="itd">
<input class="form-control ledCLconstr" id="ip_cl_position" type="number" value="0" step="1">
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_reverse" data-i18n="conf_leds_layout_cl_reversdir">Reverse direction</label>
</td>
<td class="itd">
<div class="checkbox">
<input class="ledCLconstr" id="ip_cl_reverse" type="checkbox" value="false"></input>
<label></label>
</div>
</td>
</tr>
</tbody>
</table>
<div class="panel panel-default">
<div class="panel-heading headcollapse" data-toggle="collapse" data-target="#collapse3">
<h4 class="panel-title">
<a><span data-i18n="conf_leds_layout_advanced">Advanced settings</span></a>
</h4>
</div>
<div id="collapse3" class="panel-collapse collapse">
<div class="panel-body ">
<table class="tableform borderless">
<tbody>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_hdepth" data-i18n="conf_leds_layout_cl_hleddepth">Horizontal LED depth</label>
</td>
<td class="itd input-group">
<input class="form-control ledCLconstr" id="ip_cl_hdepth" type="number" value="8" min="1" max="100" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_percent">%</div>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_vdepth" data-i18n="conf_leds_layout_cl_vleddepth">Vertical LED depth</label>
</td>
<td class="itd input-group">
<input class="form-control ledCLconstr" id="ip_cl_vdepth" type="number" value="5" min="1" max="100" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_percent">%</div>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_overlap" data-i18n="conf_leds_layout_cl_overlap">Edge Gap</label>
</td>
<td class="itd input-group">
<input class="form-control ledCLconstr" id="ip_cl_overlap" type="number" value="0" min="0" max="200" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_percent">%</div>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_edgegap" data-i18n="conf_leds_layout_cl_edgegap">Edge Gap</label>
</td>
<td class="itd input-group">
<input class="form-control ledCLconstr" id="ip_cl_edgegap" type="number" value="0" min="0" max="50" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_percent">%</div>
</td>
</tr>
<!-- <tr>
<td class="ltd">
<label class="ltdlabel" for="ip_cl_cornergap" data-i18n="conf_leds_layout_cl_cornergap">Corner Gap</label>
</td>
<td class="itd input-group">
<input class="form-control ledCLconstr " id="ip_cl_cornergap" type="number" value="0" min="0" max="50" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_percent">%</div>
</td>
</tr>
-->
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="panel-footer" style="text-align:right;">
<button id="btn_cl_generate" class="btn btn-warning"><i class="fa fa-fw fa-television"></i><span data-i18n="conf_leds_layout_cl_generate">Generate LED configuration</span></button>
<button id="btn_cl_save" class="btn btn-primary"><i class="fa fa-fw fa-save"></i><span data-i18n="conf_leds_layout_button_savelay">Save layout</span></button>
</div>
</div>
</div>
<div class="panel panel-primary">
<div class="panel-heading headcollapse" data-toggle="collapse" data-parent="#accordion" data-target="#collapse2">
<h4 class="panel-title">
<a><i class="fa fa-th fa-fw"></i><span data-i18n="conf_leds_layout_matrix">Matrix Configuration (LED wall)</span></a>
</h4>
</div>
<div id="collapse2" class="panel-collapse collapse">
<div class="panel-body">
<table>
<tbody>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_ma_ledshoriz" data-i18n="conf_leds_layout_ma_horiz">Horizontal</label>
</td>
<td class="itd input-group">
<input class="form-control ledMAconstr" id="ip_ma_ledshoriz" type="number" value="10" min="1" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_leds">LEDs</div>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_ma_ledsvert" data-i18n="conf_leds_layout_ma_vert">Vertical</label>
</td>
<td class="itd input-group">
<input class="form-control ledMAconstr" id="ip_ma_ledsvert" type="number" value="10" min="1" step="1"></input>
<div class="input-group-addon" data-i18n="edt_append_leds">LEDs</div>
</td>
</tr>
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_ma_cabling" data-i18n="conf_leds_layout_ma_cabling">Cabling</label>
</td>
<td class="itd">
<select class="form-control ledMAconstr" id="ip_ma_cabling">
<option value="snake" data-i18n="conf_leds_layout_ma_optsnake">Snake</option>
<option value="parallel" data-i18n="conf_leds_layout_ma_optparallel">Parallel</option>
</select>
</td>
</tr>
<!--- <tr>
<td class="ltd">
<label class="ltdlabel" for="ip_ma_order" data-i18n="conf_leds_layout_ma_order">Order</label>
</td>
<td class="itd">
<select class="form-control ledMAconstr" id="ip_ma_order">
<option value="horizontal" data-i18n="conf_leds_layout_ma_opthoriz">Horizontal</option>
<option value="vertical" data-i18n="conf_leds_layout_ma_optvert">Vertical</option>
</select>
</td>
</tr>
--->
<tr>
<td class="ltd">
<label class="ltdlabel" for="ip_ma_start" data-i18n="conf_leds_layout_ma_position">Input</label>
</td>
<td class="itd">
<select class="form-control ledMAconstr" id="ip_ma_start">
<option value="top-left" data-i18n="conf_leds_layout_ma_opttopleft">Top left</option>
<option value="top-right" data-i18n="conf_leds_layout_ma_opttopright">Top right</option>
<option value="bottom-left" data-i18n="conf_leds_layout_ma_optbottomleft">Bottom left</option>
<option value="bottom-right" data-i18n="conf_leds_layout_ma_optbottomright">Bottom right</option>
</select>
</td>
</tr>
</tbody>
</table>
</div>
<div class="panel-footer" style="text-align:right;">
<button id="btn_ma_generate" class="btn btn-warning"><i class="fa fa-fw fa-th"></i><span data-i18n="conf_leds_layout_cl_generate">Generate LED configuration</span></button>
<button id="btn_ma_save" class="btn btn-primary"><i class="fa fa-fw fa-save"></i><span data-i18n="conf_leds_layout_button_savelay">Save layout</span></button>
</div>
</div>
</div>
<div id="texfield_panel" class="panel panel-primary">
<div class="panel-heading headcollapse" data-toggle="collapse" data-parent="#accordion" data-target="#collapse4">
<h4 class="panel-title">
<a><i class="fa fa-wrench fa-fw"></i><span data-i18n="conf_leds_layout_generatedconf">Generated/Actual LED Configuration</span></a>
</h4>
</div>
<div id="collapse4" class="panel-collapse collapse">
<div class="panel-body">
<p data-i18n="conf_leds_layout_textf1">This textfield shows by default your current loaded layout and will be overwritten if you generate a new one above. Optional you could perform further edits.</p>
<textarea rows="25" id="ledconfig" class="form-control"></textarea>
</div>
<div class="panel-footer">
<button type="button" class="btn btn-warning" id="leds_custom_updsim"><i class="fa fa-search fa-fw"></i><span data-i18n="conf_leds_layout_button_updsim">Update preview</span></button>
<button type="button" class="btn btn-primary pull-right" id="leds_custom_save"><i class="fa fa-fw fa-save"></i><span data-i18n="conf_leds_layout_button_savelay">Save layout</span></button>
</div>
</div>
</div>
</div>
</div> <!-- accordion -->
<div class="col-lg-6 col-md-12">
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title"><i class="fa fa-search fa-fw"></i><span data-i18n="conf_leds_layout_peview">LED Layout preview</span></h4>
</div>
<div class="panel-body">
<p id="previewcreator" style="font-weight:bold"></p>
<p id="previewledcount" style="font-weight:bold"></p>
<div id="led_vis_help"></div>
<div class="col-lg-12 st_helper" style="padding-left:0px; padding-right:0px">
<div id="leds_preview"></div>
</div>
</div>
<div class="panel-footer">
<button type="button" class="btn btn-danger" id="leds_prev_toggle_num"><i class="fa fa-info fa-fw"></i><span data-i18n="main_ledsim_btn_togglelednumber">toggle led numbers</span></button>
<button type="button" class="btn btn-primary" id="leds_prev_checklist"><i class="fa fa-info-circle fa-fw"></i><span data-i18n="conf_leds_layout_btn_checklist">toggle led numbers</span></button>
</div>
</div>
</div>
</div>
</div> <!-- row layout -->
</div>
</div>
</div> <!-- tab content -->
</div>
<script src="/js/content_leds.js"></script>

View File

@ -0,0 +1,13 @@
<div class="container-fluid" id="trans_conf_logging">
<div class="row">
<div class="col-lg-12">
<h3 class="page-header"><i class="fa fa-reorder fa-fw"></i><span data-i18n="main_menu_logging_token">Log</span></h3>
<div id="log_head"></div>
<div class="row" id='conf_cont'></div>
<hr />
<div id="log_content"><span style="font-weight:bold;font-size:17px" data-i18n="conf_logging_nomessage"></span></div>
</div>
</div>
</div>
<script src="/js/content_logging.js"></script>

View File

@ -0,0 +1,10 @@
<div class="container-fluid">
<div class="row">
<div class="col-lg-12">
<h3 class="page-header"><i class="fa fa-sitemap fa-fw"></i><span data-i18n="main_menu_network_conf_token">Network Services</span></h3>
<div id="conf_cont"></div>
</div>
</div>
</div>
<script src="/js/content_network.js"></script>

View File

@ -0,0 +1,10 @@
<div class="container-fluid">
<div class="row">
<div class="col-lg-12">
<h3 class="page-header"><i class="fa fa-wrench fa-fw"></i><span data-i18n="main_menu_webconfig_token">Webinterface</span></h3>
<div class="row" id="conf_cont"></div>
</div>
</div>
</div>
<script src="/js/content_webconfig.js"></script>

View File

@ -1,28 +1,28 @@
<div id="wrapper">
<div class="container" style="margin:20px auto;max-width:600px;">
<center>
<img src="img/hyperion/hyperionlostconnection.png" alt="Redefine ambient light!">
<div>
<h2 lang="en" data-lang-token="info_conlost_label_title">Lost connection to Hyperion service!</h2>
<h2 data-i18n="info_conlost_label_title">Lost connection to Hyperion service!</h2>
<hr>
<h4 lang="en" data-lang-token="info_conlost_label_reason">Possible reasons:</h4>
<p lang="en" data-lang-token="info_conlost_label_reason1">- Hyperion restarts</p>
<p lang="en" data-lang-token="info_conlost_label_reason2">- You perform an update</p>
<p lang="en" data-lang-token="info_conlost_label_reason3">- Hyperion isn't running</p>
<h4 data-i18n="info_conlost_label_reason">Possible reasons:</h4>
<p data-i18n="info_conlost_label_reason1">- Hyperion restarts</p>
<p data-i18n="info_conlost_label_reason2">- You perform an update</p>
<p data-i18n="info_conlost_label_reason3">- Hyperion isn't running</p>
<hr>
<i class="fa fa-refresh fa-spin" style="font-size:50px"></i>
<h4 lang="en" data-lang-token="info_conlost_label_autorefresh">This page will be automatically refreshed.</h4>
<h4 lang="en" data-lang-token="info_conlost_label_autorecon">We reconnect again after Hyperion is available.</h4>
<a href="/" lang="en" data-lang-token="info_conlost_label_reload">If not, click me or reload the page</a>
<h4 data-i18n="info_conlost_label_autorefresh">This page will be automatically refreshed.</h4>
<h4 data-i18n="info_conlost_label_autorecon">We reconnect again after Hyperion is available.</h4>
<a href="/" data-i18n="info_conlost_label_reload">If not, click me or reload the page</a>
</div>
</center>
</div>
</div>
<!-- ************************************ -->
<script>
performTranslation();
var connectionLost = false;
var connectionTimer;
@ -37,7 +37,7 @@ function tryReconnect()
function connectionLostAction()
{
connectionLost = true;
connectionTimer = window.setInterval(tryReconnect, 5000);
connectionTimer = window.setInterval(tryReconnect, 4000);
}
</script>

View File

@ -1,34 +1,32 @@
<div class="container-fluid" id="content_dashboard">
<div class="container-fluid">
<div class="row">
<div class="col-lg-12">
<h2 class="page-header"><i class="fa fa-dashboard fa-fw"></i><span lang="en" data-lang-token="main_menu_dashboard_token">Dashboard</span></h2>
<div class="introd">
<h4 lang="en" data-lang-token="dashboard_label_intro">The dashboard give you a quick overview about the status of Hyperion and show you the latest news of the Hyperion Blog.</h4>
</div>
<hr>
<h3 class="page-header"><i class="fa fa-dashboard fa-fw"></i><span data-i18n="main_menu_dashboard_token">Dashboard</span></h3>
<div id="dash_intro">
<div class="row">
<div class="col-md-6 col-xxl-4">
<div class="panel panel-default">
<div class="panel-heading">
<i class="fa fa-info-circle fa-fw"></i>
<span lang="en" data-lang-token="dashboard_infobox_label_title">Information</span>
<span data-i18n="dashboard_infobox_label_title">Information</span>
</div>
<div class="panel-body">
<table class="table borderless">
<tbody>
<tr>
<td lang="en" data-lang-token="dashboard_infobox_label_currenthyp">Your Hyperion version:</td>
<td data-i18n="dashboard_infobox_label_currenthyp">Hyperion version:</td>
<td id="currentversion">unknown</td>
</tr>
<tr>
<td lang="en" data-lang-token="dashboard_infobox_label_latesthyp">Latest version:</td>
<td data-i18n="dashboard_infobox_label_latesthyp">Latest version:</td>
<td id="latestversion">unknown</td>
</tr>
<tr>
<td lang="en" data-lang-token="dashboard_infobox_label_leddevice">LED type:</td>
<td data-i18n="conf_leds_contr_label_contrtype">LED type:</td>
<td id="dash_leddevice">unknown</td>
</tr>
<tr>
<td lang="en" data-lang-token="dashboard_infobox_label_device">Device:</td>
<td data-i18n="dashboard_infobox_label_device">Device:</td>
<td id="dash_systeminfo"></td>
</tr>
</tbody>
@ -42,14 +40,14 @@
<div class="panel panel-default">
<div class="panel-heading">
<i class="fa fa-eye fa-fw"></i>
<span lang="en" data-lang-token="dashboard_componentbox_label_title">Components status</span>
<span data-i18n="dashboard_componentbox_label_title">Components status</span>
</div>
<div class="panel-body">
<table class="table">
<thead>
<tr>
<th lang="en" data-lang-token="dashboard_componentbox_label_comp">Component</th>
<th lang="en" data-lang-token="dashboard_componentbox_label_status">Status</th>
<th data-i18n="dashboard_componentbox_label_comp">Component</th>
<th data-i18n="dashboard_componentbox_label_status">Status</th>
</tr>
</thead>
<tbody id="tab_components">
@ -62,18 +60,19 @@
<div class="panel panel-default">
<div class="panel-heading">
<i class="fa fa-newspaper-o fa-fw"></i>
<span lang="en" data-lang-token="dashboard_newsbox_label_title">Latest blog posts</span>
<span data-i18n="dashboard_newsbox_label_title">Latest blog posts</span>
</div>
<div class="panel-body">
</div>
</div>
</div>
</div>
</div>
<!-- /.col-lg-12 -->
</div>
<!-- /.row -->
</div>
<!-- /.container-fluid -->
<script src="/js/content_dashboard.js"></script>

View File

@ -1,18 +0,0 @@
<div class="container-fluid">
<div class="row">
<div class="col-lg-12">
<h2 class="page-header"><i class="fa fa-spinner fa-fw"></i><span lang="en" data-lang-token="main_menu_effect_conf_token">Effects</span></h2>
<div class="introd">
<h4 lang="en" data-lang-token="conf_effects_label_intro">Setting up a booteffect/color that is visible after Hyperion startup. Configure a background effect/color which is active, when all capture sources are disabled (also temporarily via Kodi Watch)</h4>
</div>
<hr>
<div class="col-lg-12">
<div id='editor_container'></div>
<button class="btn btn-success" id='btn_submit' lang="en" data-lang-token="general_button_savesettings">Save Settings</button>
</div>
</div>
</div>
</div>
<script src="/js/content_effects.js"></script>

View File

@ -1,41 +1,45 @@
<div class="container-fluid">
<div class="row">
<div class="col-lg-12">
<h2 class="page-header"><i class="fa fa-cogs fa-fw"></i><span lang="en" data-lang-token="main_menu_effectsconfigurator_token">Effects Configurator</span></h2>
<div class="introd">
<h4 lang="en" data-lang-token="effectsconfigurator_label_intro">Create out of the base effects new effects that are tuned to your liking. Depending on Effect there are options like color, speed, direction and more available.</h4>
<h3 class="page-header"><i class="fa fa-cogs fa-fw"></i><span data-i18n="main_menu_effectsconfigurator_token">Effects Configurator</span></h3>
<div id="intro_effc">
</div>
<hr />
<div class="col-lg-12">
<div class="row">
<div class="col-lg-6">
<div class="panel panel-default" >
<div class="panel-heading">
<label for="effectslist" lang="en" data-lang-token="effectsconfigurator_label_chooseeff">Choose Base-Effect:</label>
<label for="effectslist" data-i18n="effectsconfigurator_label_chooseeff">Choose Base-Effect:</label>
<select id="effectslist" class="form-control" style="color:black;width:auto;margin-left:10px;display:inline-block" />
</div>
<div class="panel-body">
<div class="form-group row">
<label for="name-input" class="col-xs-2 col-form-label" lang="en" data-lang-token="effectsconfigurator_label_effectname">Effect name:</label>
<div class="col-xs-10">
<input class="form-control" type="text" id="name-input">
</div>
</div>
<table style="margin-bottom:8px">
<tbody>
<tr>
<td class="ltd"><label for="name-input" data-i18n="effectsconfigurator_label_effectname">Effect name:</label></td>
<td class="itd"><input class="form-control" type="text" id="name-input" /></td>
</tr>
</tbody>
</table>
<div id="editor_container" />
</div>
<div class="panel-footer">
<button class="btn btn-warning" id='btn_start_test' lang="en" data-lang-token="effectsconfigurator_button_starttest">Start Effecttest</button>
<button class="btn btn-warning" id='btn_stop_test' lang="en" data-lang-token="effectsconfigurator_button_stoptest">Stop Effecttest</button>
<button class="btn btn-danger" id='btn_cont_test' lang="en" data-lang-token="effectsconfigurator_button_conttest">Toggle continuous testing</button>
<button class="btn btn-primary pull-right" id='btn_write' lang="en" data-lang-token="effectsconfigurator_button_saveeffect">Save Effect</button>
<div class="panel-footer" id="eff_footer">
<button class="btn btn-warning" id='btn_start_test' data-i18n="effectsconfigurator_button_starttest">Start Effecttest</button>
<button class="btn btn-warning" id='btn_stop_test' data-i18n="effectsconfigurator_button_stoptest">Stop Effecttest</button>
<button class="btn btn-danger" id='btn_cont_test' data-i18n="effectsconfigurator_button_conttest">Toggle continuous testing</button>
<button class="btn btn-primary" id='btn_write' data-i18n="effectsconfigurator_button_saveeffect">Save Effect</button>
</div>
</div>
</div>
<div class="col-lg-6">
<div class="panel panel-default" >
<div class="panel-heading">
<label for="effectsdellist" lang="en" data-lang-token="effectsconfigurator_label_deleffect">Effekt Delete:</label>
<label for="effectsdellist" data-i18n="effectsconfigurator_label_deleffect">Delete Effect:</label>
<select id="effectsdellist" class="form-control" style="color:black;width:auto;margin-left:10px;display:inline-block" />
<button class="btn btn-primary pull-right" id='btn_delete' lang="en" data-lang-token="effectsconfigurator_button_deleffect">Delete Effect</button>
<button class="btn btn-primary" id='btn_delete' data-i18n="effectsconfigurator_button_deleffect">Delete Effect</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@ -1,20 +0,0 @@
<div class="container-fluid">
<div class="row">
<div class="col-lg-12">
<h2 class="page-header"><i class="fa fa-camera fa-fw"></i><span lang="en" data-lang-token="main_menu_grabber_conf_token">Capturing Hardware</span></h2>
<div class="introd">
<h4 lang="en" data-lang-token="conf_grabber_label_intro">Hyperion supports two ways on how to get captured pictures for processing and output. The platform grabber which captures internal at the device you are running Hyperion on (best qualitiy) and the USB Grabber which gathers from a connected device the necessary pictures (more calibration work and configuration).</h4>
</div>
<hr />
<div class="col-lg-12">
<div id='editor_container'/>
<button class="btn btn-success" id='btn_submit' lang="en" data-lang-token="general_button_savesettings">Save Settings</button>
</div>
</div>
</div>
</div>
<script src="/js/content_grabber.js"></script>

View File

@ -1,23 +0,0 @@
<div class="container-fluid">
<div class="row">
<div class="col-lg-12">
<h2 class="page-header"><i class="fa fa-play-circle-o fa-fw"></i><span lang="en" data-lang-token="conf_kodi_label_title">Kodi Watch</span></h2>
<div class="introd">
<h4 lang="en" data-lang-token="conf_kodi_label_intro">The Kodi Watcher enables you to enable and disable the screencapture depending on Kodi state. This is not limited to the same machine, you could observe also a Kodi on any other device at your network.</h4>
</div>
<hr />
<div class="alert alert-info" role="alert">
<strong>HINT 1:</strong> In any case you need to enable the remote control for Kodi. Please checkout Wiki for instructions. LINK<br>
<strong>HINT 2:</strong> If you just use a USB-Grabber you could enable the Kodi Watch for this separately at the USB-Grabber page.
</div>
<div class="col-lg-12">
<div id='editor_container'/>
<button class="btn btn-success" id='btn_submit'>Save Settings</button>
</div>
</div>
</div>
</div>
<script src="/js/content_kodi.js"></script>

View File

@ -1,317 +0,0 @@
<style>
#leds_canvas {width:800px; height:450px; background-color:#AAAAAA; position:absolute; margin:10px; box-shadow: 10px 10px 5px #BBBBBB;
background-image:url(/img/hyperion/hyperionlogo.png); background-repeat:no-repeat; background-position: center; border-radius:2px; }
.led { display:inline-block; border: 1px solid black; position:absolute; opacity:0.8; text-align:center;
vertical-align:middle; padding:4px; border-radius:2px;}
.led_num, .led_prev_num {display:none; position:relative; color:black; background-color: white;
border-radius:2px; padding:1px; vertical-align:middle; text-align:center; font-size:0.8em;}
#leds_controls {white-space:nowrap; margin-top:500px;}
</style>
<div class="modal fade bs-pair-modal-lg" id="pairmodal" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel">
<div class="modal-dialog modal-lg" role="document">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">Hue Bridge</h4>
</div>
<div class="modal-body">
<span lang="en" data-lang-token="hue_press_link_modal">Please press link button on the Hue Bridge.</span> <br /><br />
<center>
<span id="connectionTime"></span><br />
<img src="/img/hyperion/ring-alt.svg" />
<center>
</div>
<div class="modal-footer" />
</div>
</div>
</div>
<div class="container-fluid">
<h2 class="page-header"><i class="fa fa-lightbulb-o fa-fw"></i><span lang="en" data-lang-token="main_menu_leds_conf_token">LED Hardware</span></h2>
<div class="introd">
<h4 lang="en" data-lang-token="conf_leds_label_intro">The LED controller of youre choice is your way to output the led data via Raspberry PI GPIO, USB or network! Choose one, define your led layout and enjoy the light!</h4>
</div>
<hr>
<ul id="leds_cfg_nav" class="nav nav-tabs">
<li class="active"><a data-toggle="tab" href="#menu_controller" lang="en" data-lang-token="conf_leds_nav_label_ledcontroller">LED Controller</a></li>
<li><a data-toggle="tab" href="#menu_gencfg" lang="en" data-lang-token="conf_leds_nav_label_ledlayout">LED Layout</a></li>
<li><a data-toggle="tab" href="#menu_display" lang="en" data-lang-token="conf_leds_nav_label_ledtesting">LED Testing</a></li>
</ul>
<div class="tab-content">
<div id="menu_controller" class="tab-pane fade in active" style="padding-top:10px">
<div class="panel panel-primary">
<div class="panel-heading form-group" style="font-size:90%;white-space:nowrap;">
<button id='btn_submit_controller' class="btn btn-success" style="float:right" lang="en" data-lang-token="general_button_savesettings">Save Settings</button>
<label for="leddevices" lang="en" data-lang-token="conf_leds_contr_label_contrtype">Controller type:</label>
<select id="leddevices" class="form-control" style="color:black;width:auto;margin-left:10px;display:inline-block" />
</div>
<div class="panel-body">
<div id="ledDeviceOptions"> <div id='editor_container'></div> </div>
<div id="huebridge" class="container-fluid" style="display:none">
<hr/>
<button data-toggle="collapse" class="btn btn-success" data-target="#huebridge_content">Hue Bridge Setup Helper</button>
<div id="huebridge_content" class="collapse">
<div class="introd" style="margin-top:20px;margin-bottom:20px">
With this Setup Helper you can get a new User for your Hue Bridge and you can see your Lights with the IDs for Hyperion Configuration.
If you already have a working User you will see it below. But you can always create a new one as well.
<b>Remember:</b> This is only a helper. You have to copy and paste them in your config above.
</div>
<div class="col-lg-12">
<span id="ip_alert" style="display:none; color:red; font-weight: bold;" lang="en" data-lang-token="hue_failure_ip_token">Please check your IP Address.</span>
<span id="abortConnection" style="display:none; color:red; font-weight: bold;" lang="en" data-lang-token="hue_failure_connection_token">Connection Timeout. Please press the button in time.</span><br />
<div class="form-group">
<label for="ip">Hue Bridge IP:</label>
<input type="text" class="form-control" id="ip">
<label for="user" lang="en" data-lang-token="hue_label_username">Hue Bridge Username:</label>
<input type="text" class="form-control" id="user" disabled>
<div id="hue_lights" class="row"></div>
<button type="button" class="btn btn-success" id="create_user"> <i class="fa fa-floppy-o"></i><span lang="en" data-lang-token="hue_button_create_user_token"> Create User</span></button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div id="menu_display" class="tab-pane fade" style="padding-top:10px">
<div class="container-fluid">
<div id="leds_canvas"/>
<div id="leds_controls">
<button lang="en" type="button" class="btn btn-success" id="leds_toggle" lang="en" data-lang-token="conf_leds_test_button_toggleleds">toggle leds</button>
<button lang="en" type="button" class="btn btn-danger" id="leds_toggle_num" lang="en" data-lang-token="conf_leds_test_button_togglelednumber">toggle led numbers</button>
<button lang="en" type="button" class="btn btn-danger" id="leds_toggle_live" lang="en" data-lang-token="conf_leds_test_button_toggleliveleds">toggle live leds</button>
</div>
</div>
</div>
<div id="menu_gencfg" class="tab-pane fade" style="padding-top:10px">
<div class="row">
<div class="col-lg-6 col-md-12">
<div class="panel-group" id="accordion">
<div class="panel panel-primary">
<div class="panel-heading headcollapse" data-toggle="collapse" data-parent="#accordion" data-target="#collapse1">
<h4 class="panel-title">
<a><i class="fa fa-television fa-fw"></i><span lang="en" data-lang-token="conf_leds_layout_frame">Classic Layout (LED Frame)</span></a>
</h4>
</div>
<div id="collapse1" class="panel-collapse collapse in">
<div class="panel-body ">
<div class="form-group">
<label class="col-form-label col-md-6" for="ip_cl_ledstop" style="width:170px" lang="en" data-lang-token="conf_leds_layout_cl_top">Top</label>
<div class=" input-group">
<input class="form-control ledCLconstr" id="ip_cl_ledstop" type="number" value="10" min="0" step="1"></input>
<div class="input-group-addon">LEDs</div>
</div>
</div>
<div class="form-group">
<label class="col-form-label col-md-6" for="ip_cl_ledsbottom" style="width:170px" lang="en" data-lang-token="conf_leds_layout_cl_bottom">Bottom</label>
<div class=" input-group">
<input class="form-control ledCLconstr" id="ip_cl_ledsbottom" type="number" value="10" min="0" step="1"></input>
<div class="input-group-addon">LEDs</div>
</div>
</div>
<div class="form-group">
<label class="col-form-label col-md-6" for="ip_cl_ledsleft" style="width:170px" lang="en" data-lang-token="conf_leds_layout_cl_left">Left</label>
<div class=" input-group">
<input class="form-control ledCLconstr" id="ip_cl_ledsleft" type="number" value="6" min="0" step="1"></input>
<div class="input-group-addon">LEDs</div>
</div>
</div>
<div class="form-group">
<label class="col-form-label col-md-6" for="ip_cl_ledsright" style="width:170px" lang="en" data-lang-token="conf_leds_layout_cl_right">Right</label>
<div class=" input-group">
<input class="form-control ledCLconstr" id="ip_cl_ledsright" type="number" value="6" min="0" step="1"></input>
<div class="input-group-addon">LEDs</div>
</div>
</div>
<div class="form-group">
<label class="col-form-label col-md-6" for="ip_cl_ledsglength" style="width:170px" lang="en" data-lang-token="conf_leds_layout_cl_gaglength">Gap length</label>
<div class=" input-group">
<input class="form-control ledCLconstr" id="ip_cl_ledsglength" type="number" value="0" min="0" step="1"></input>
<div class="input-group-addon">LEDs</div>
</div>
</div>
<div class="form-group">
<label class="col-form-label col-md-6" for="ip_cl_ledsgpos" style="width:170px" lang="en" data-lang-token="conf_leds_layout_cl_gappos">Gap position</label>
<div class=" input-group">
<input class="form-control ledCLconstr" id="ip_cl_ledsgpos" type="number" value="0" min="0" step="1">
</div>
</div>
<div class="form-group">
<label class="col-form-label col-md-6" for="ip_cl_position" style="width:170px" lang="en" data-lang-token="conf_leds_layout_cl_inppos">Input position</label>
<div class=" input-group">
<input class="form-control ledCLconstr" id="ip_cl_position" type="number" value="0" step="1">
</div>
</div>
<div class="form-group">
<label class="col-form-label col-md-6" for="ip_cl_reverse" style="width:190px" lang="en" data-lang-token="conf_leds_layout_cl_reversdir">Reverse direction</label>
<div class="checkbox">
<input class="ledCLconstr" id="ip_cl_reverse" type="checkbox" value="false"></input>
<label></label>
</div>
</div>
<div class="">
<div class="panel panel-default">
<div class="panel-heading headcollapse" data-toggle="collapse" data-target="#collapse3">
<h4 class="panel-title">
<a><span lang="en" data-lang-token="conf_leds_layout_advanced">Advanced settings</span></a>
</h4>
</div>
<div id="collapse3" class="panel-collapse collapse">
<div class="panel-body ">
<div class="form-group">
<label class="col-form-label col-md-6" for="ip_cl_ledshdepth" style="width:190px;max-width:200px" lang="en" data-lang-token="conf_leds_layout_cl_hleddepth">Horizontal LED depth</label>
<div class=" input-group">
<input class="form-control ledCLconstr" id="ip_cl_ledshdepth" type="number" value="8" min="1" max="100" step="1"></input>
<div class="input-group-addon">%</div>
</div>
</div>
<div class="form-group">
<label class="col-form-label col-md-6" for="ip_cl_ledsvdepth" style="width:190px;max-width:200px" lang="en" data-lang-token="conf_leds_layout_cl_vleddepth">Vertical LED depth</label>
<div class=" input-group">
<input class="form-control ledCLconstr" id="ip_cl_ledsvdepth" type="number" value="5" min="1" max="100" step="1"></input>
<div class="input-group-addon">%</div>
</div>
</div>
<div class="form-group">
<label class="col-form-label col-md-6" for="ip_cl_ledsedgegap" style="width:190px;max-width:200px" lang="en" data-lang-token="conf_leds_layout_cl_edgegap">Edge Gap</label>
<div class=" input-group">
<input class="form-control ledCLconstr" id="ip_cl_ledsedgegap" type="number" value="0" min="0" max="50" step="1"></input>
<div class="input-group-addon">%</div>
</div>
</div>
<div class="form-group">
<label class="col-form-label col-md-6" for="ip_cl_ledscornergap" style="width:190px;max-width:200px" lang="en" data-lang-token="conf_leds_layout_cl_cornergap">Corner Gap</label>
<div class=" input-group">
<input class="form-control ledCLconstr" id="ip_cl_ledscornergap" type="number" value="0" min="0" max="50" step="1"></input>
<div class="input-group-addon">%</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="panel-footer">
<button id="btn_cl_generate" class="btn btn-warning" lang="en" data-lang-token="conf_leds_layout_cl_generate">Generate LED configuration</button>
</div>
</div>
</div>
<div class="panel panel-primary">
<div class="panel-heading headcollapse" data-toggle="collapse" data-parent="#accordion" data-target="#collapse2">
<h4 class="panel-title">
<a><i class="fa fa-th fa-fw"></i><span lang="en" data-lang-token="conf_leds_layout_matrix">Matrix Configuration (LED wall)</span></a>
</h4>
</div>
<div id="collapse2" class="panel-collapse collapse">
<div class="panel-body">
<div class="form-group">
<label class="col-form-label col-md-6" for="ip_ma_ledshoriz" style="width:170px;max-width:200px" lang="en" data-lang-token="conf_leds_layout_ma_horiz">Horizontal</label>
<div class=" input-group">
<input class="form-control ledMAconstr" id="ip_ma_ledshoriz" type="number" value="10" min="1" step="1"></input>
<div class="input-group-addon">LEDs</div>
</div>
</div>
<div class="form-group">
<label class="col-form-label col-md-6" for="ip_ma_ledsvert" style="width:170px;max-width:200px" lang="en" data-lang-token="conf_leds_layout_ma_vert">Vertical</label>
<div class=" input-group">
<input class="form-control ledMAconstr" id="ip_ma_ledsvert" type="number" value="10" min="1" step="1"></input>
<div class="input-group-addon">LEDs</div>
</div>
</div>
<div class="form-group">
<label class="col-form-label col-md-6" for="ip_ma_cabling" style="width:170px;max-width:200px" lang="en" data-lang-token="conf_leds_layout_ma_cabling">Cabling</label>
<div class=" input-group">
<select class="form-control ledMAconstr" id="ip_ma_cabling">
<option value="snake" lang="en" data-lang-token="conf_leds_layout_ma_optsnake">Snake</option>
<option value="parallel" lang="en" data-lang-token="conf_leds_layout_ma_optparallel">Parallel</option>
</select>
</div>
</div>
<!--- <div class="form-group">
<label class="col-form-label col-md-6" for="ip_ma_order" style="width:170px;max-width:200px" lang="en" data-lang-token="conf_leds_layout_ma_order">Order</label>
<div class=" input-group">
<select class="form-control ledMAconstr" id="ip_ma_order">
<option value="horizontal" lang="en" data-lang-token="conf_leds_layout_ma_opthoriz">Horizontal</option>
<option value="vertical" lang="en" data-lang-token="conf_leds_layout_ma_optvert">Vertical</option>
</select>
</div>
</div>
--->
<div class="form-group">
<label class="col-form-label col-md-6" for="ip_ma_start" style="width:170px;max-width:200px" lang="en" data-lang-token="conf_leds_layout_ma_position">Input</label>
<div class=" input-group">
<select class="form-control ledMAconstr" id="ip_ma_start">
<option value="top-left" lang="en" data-lang-token="conf_leds_layout_ma_opttopleft">Top left</option>
<option value="top-right" lang="en" data-lang-token="conf_leds_layout_ma_opttopright">Top right</option>
<option value="bottom-left" lang="en" data-lang-token="conf_leds_layout_ma_optbottomleft">Bottom left</option>
<option value="bottom-right" lang="en" data-lang-token="conf_leds_layout_ma_optbottomright">Bottom right</option>
</select>
</div>
</div>
</div>
<div class="panel-footer">
<button id="btn_ma_generate" class="btn btn-warning" lang="en" data-lang-token="conf_leds_layout_cl_generate">Generate LED configuration</button>
</div>
</div>
</div>
<div class="panel panel-primary" style="margin-bottom:5px">
<div class="panel-heading headcollapse" data-toggle="collapse" data-parent="#accordion" data-target="#collapse4">
<h4 class="panel-title">
<a><i class="fa fa-wrench fa-fw"></i><span lang="en" data-lang-token="conf_leds_layout_generatedconf">Generated/Actual LED Configuration</span></a>
</h4>
</div>
<div id="collapse4" class="panel-collapse collapse">
<div class="panel-body">
<p lang="en" data-lang-token="conf_leds_layout_textf1">This textfield shows by default your current loaded layout and will be overwritten if you generate a new one above. Optional you could perform further edits.</p>
<b><p lang="en" data-lang-token="conf_leds_layout_textf2">Don't forget to save!</p></b>
<textarea rows="25" id="ledconfig" class="form-control"></textarea>
</div>
<div class="panel-footer">
<button lang="en" type="button" class="btn btn-warning" id="leds_custom_updsim" lang="en" data-lang-token="conf_leds_layout_button_updsim">Update preview</button>
<button lang="en" type="button" class="btn btn-success pull-right" id="leds_custom_save" lang="en" data-lang-token="conf_leds_layout_button_savelay">Save layout</button>
</div>
</div>
</div>
</div> <!-- accordion -->
</div>
<div class="col-lg-6 col-md-12">
<div class="panel panel-primary">
<div class="panel-heading">
<h4 class="panel-title"><i class="fa fa-search fa-fw"></i><span lang="en" data-lang-token="conf_leds_layout_peview">LED Layout preview</span></h4>
</div>
<div class="panel-body">
<div id="previewcreator"><span lang="en" data-lang-token="conf_leds_layout_preview_empty">No preview requested</span></div>
<div id="previewledcount"></div>
<div class="col-lg-12 st_helper" style="padding-left:0px; padding-right:0px">
<div id="leds_preview"></div>
</div>
</div>
<div class="panel-footer">
<button lang="en" type="button" class="btn btn-danger" id="leds_prev_toggle_num" lang="en" data-lang-token="conf_leds_test_button_togglelednumber">toggle led numbers</button>
</div>
</div>
</div>
</div> <!-- row layout -->
</div>
</div>
</div> <!-- tab content -->
</div>
<script src="/js/content_leds.js"></script>
<script src="/js/content_huebridge.js"></script>

View File

@ -1,19 +0,0 @@
<div class="container-fluid">
<div class="row">
<div class="col-lg-12">
<h2 class="page-header"><i class="fa fa-play-circle-o fa-fw"></i><span lang="en" data-lang-token="conf_kodi_label_title">Log Messages</span></h2>
<div class="introd">
<h4 lang="en" data-lang-token="conf_logging_label_intro">log messages.</h4>
</div>
<hr />
<div class="col-lg-12">
<div id="logmessages" style="white-space:pre">
</div>
</div>
</div>
</div>
</div>
<script src="/js/content_logging.js"></script>

View File

@ -1,21 +0,0 @@
<div class="container-fluid">
<div class="row">
<div class="col-lg-12">
<h2 class="page-header"><i class="fa fa-sitemap fa-fw"></i><span lang="en" data-lang-token="main_menu_network_conf_token">Network Services</span></h2>
<div class="introd">
<h4 lang="en" data-lang-token="conf_network_label_intro">All network based settings could you find here.</h4>
</div>
<hr />
<div class="col-lg-12">
<!-- <form id="grabberConfForm"></form>-->
<div id='editor_container'/>
<button class="btn btn-success" id='btn_submit'>Save Settings</button>
</div>
</div>
</div>
</div>
<script src="/js/content_network.js"></script>

View File

@ -1,50 +1,73 @@
<div class="container-fluid">
<h2 class="page-header"><i class="fa fa-wifi fa-fw"></i><span lang="en" data-lang-token="main_menu_remotecontrol_token">Remote Control</span></h2>
<div class="introd">
<h4 lang="en" data-lang-token="remote_label_intro">Set an effect/color. You could also select a source manually. The Components control give the opportunity to enable/disable components of Hyprion during runtime. All changes you made here are lost after a restart.</h4>
</div>
<hr>
<h3 class="page-header"><i class="fa fa-wifi fa-fw"></i><span data-i18n="main_menu_remotecontrol_token">Remote Control</span></h3>
</div>
<div class="container-fluid">
<div class="row">
<div class="col-lg-12">
<div class="panel panel-primary" >
<div class="panel-heading" lang="en" data-lang-token="remote_colors_label_coloreffect">Colors/Effects</div>
<div class="panel-body">
<span lang="en" data-lang-token="remote_colors_label_color" style="display:inline-block">Color:</span>
<div id="cp2" class="colorpicker-component" style="width:auto;display:inline-block;white-space:nowrap;">
<input type="text" value="#00AABB" class="form-control" style="display:inline" /><span class="input-group-addon form-control" style="display:inline-block;width:auto;"><i></i></span>
</div>
<div lang="en" data-lang-token="remote_effects_label_effects" style="display:inline-block;margin-left:50px;">Effect:</div>
<select id="effect_select" class="form-control" style="width:auto;display:inline-block"></select>
<button lang="en" data-lang-token="remote_colors_button_reset" type="button" class="btn btn-warning" id="reset_color" style="margin-left:20px;width:auto;display:inline-block">Reset Color/Effect</button>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="container-fluid">
<div class="row">
<div class="col-lg-6">
<div class="panel panel-primary" >
<div class="panel-heading" lang="en" data-lang-token="remote_input_label_sourceselection">Source selection</div>
<div class="col-lg-8 col-xxl-7">
<div class="panel panel-default" >
<div class="panel-heading"><i class="fa fa-wifi fa-fw"></i><span data-i18n="remote_input_label">Source selection</span></div>
<div class="panel-body">
<p>Hyperion uses a priority system to select a source. Everything you set has a priority (Effect/Color/Platform capture/USB capture and network sources). By default, Hyperion select sources depending on priority (lowest number reflects the current active source). Now you have the opportunity to select sources on your own.</p>
<p style="font-weight:bold">Schema: NameOfSource(priority)</p>
<div id="hyperion_inputs"><i style="font-size:120px;padding:20px;text-align:center;display: inline-block;width: 100%;line-height: normal;" class="fa fa-cog fa-spin"></i></div>
<div id="sstcont"></div>
<div id="auto_btn"></div>
</div>
</div>
</div>
<div class="col-lg-6">
<div class="panel panel-primary" >
<div class="panel-heading" lang="en" data-lang-token="remote_components_label_components">Components control</div>
<div class="panel-body">
<div id="componentsbutton"><i style="font-size:120px;padding:20px;text-align:center;display: inline-block;width: 100%;line-height: normal;" class="fa fa-cog fa-spin"></i></div>
<div class="col-lg-4 col-xxl-5">
<div class="panel panel-default" >
<div class="panel-heading"><i class="fa fa-wifi fa-fw"></i><span data-i18n="remote_components_label">Components control</span></div>
<div class="panel-body" id="comp_intro">
<div id="componentsbutton"></div>
</div>
</div>
</div>
</div>
</div>
<div class="container-fluid">
<div class="row">
<div class="col-lg-6 col-xxl-4">
<div class="panel panel-default" >
<div class="panel-heading"><i class="fa fa-wifi fa-fw"></i><span data-i18n="remote_color_label">Colors/Effects</span></div>
<div class="panel-body" id="color_intro">
<table class="table borderless">
<tbody>
<tr>
<td style="vertical-align:middle"><label data-i18n="remote_color_label_color"></label></td>
<td><div id="cp2" class="colorpicker-component input-group">
<input type="text" class="form-control"/><span class="input-group-addon"><i></i></span>
</div>
</td>
</tr>
<tr>
<td style="vertical-align:middle"><label data-i18n="remote_effects_label_effects">Effect:</label></td>
<td><select id="effect_select" class="form-control"></select></td>
</tr>
</tbody>
</table>
<button data-i18n="remote_color_button_reset" type="button" class="btn btn-warning" id="reset_color" style="margin-top:10px;">Reset Color/Effect</button>
</div>
</div>
</div>
<div class="col-lg-6 col-xxl-3">
<div class="panel panel-default" >
<div class="panel-heading"><i class="fa fa-wifi fa-fw"></i><span data-i18n="remote_maptype_label">Mapping types</span></div>
<div class="panel-body" id="maptype_intro">
<div id="mappingsbutton"></div>
</div>
</div>
</div>
<div class="col-lg-6 col-xxl-5">
<div class="panel panel-default" >
<div class="panel-heading"><i class="fa fa-wifi fa-fw"></i><span data-i18n="remote_adjustment_label"></span></div>
<div class="panel-body" id="adjust_content">
</div>
</div>
</div>

View File

@ -0,0 +1,35 @@
<div class="container" style="margin:20px auto;max-width:500px;">
<center>
<img src="img/hyperion/hyperionlogo.png" alt="Redefine ambient light!">
<div>
<h3 data-i18n="info_restart_title"></h3>
<h4 data-i18n="info_restart_rightback"></h4>
<p data-i18n="info_restart_contus"></p>
<a href="https://forum.hyperion-project.org?pk_campaign=WebUI&pk_kwd=failedrestart" data-i18n="info_restart_contusa"></a>
</div>
</center>
</div>
<!-- ************************************ -->
<script>
performTranslation();
var connectionLost = false;
var connectionTimer;
function tryReconnect()
{
$.ajax({ url: "/" }).done(function(data) {
window.clearInterval(connectionTimer);
window.location.href ="/";
});
}
function restartAction()
{
connectionLost = true;
connectionTimer = window.setInterval(tryReconnect, 1000);
}
</script>

View File

@ -1,113 +1,124 @@
<div class="container-fluid">
<div class="row">
<div class="col-xs-12">
<h2 class="page-header"><i class="fa fa-info fa-fw"></i><span lang="en" data-lang-token="support_label_title">Support Hyperion</span></h2>
<div class="introd">
<h4 lang="en" data-lang-token="support_label_intro">Hyperion is a free non-profit software. A small team is working on it and this is why we need your steady support.</h4>
</div>
<hr>
<h3 style="font-weight: bold" lang="en" data-lang-token="support_label_spreadtheword">Spread the word</h3>
<h3 class="page-header"><i class="fa fa-info fa-fw"></i><span data-i18n="support_label_title">Support Hyperion</span></h3>
<div id="supp_intro"></div>
<h4 style="font-weight: bold" data-i18n="support_label_spreadtheword">Spread the word</h4>
<a href="#" target="_blank" class="unlink">
<div class="col-xs-12 col-sm-6 col-lg-3 support-container">
<i class="fa fa-facebook bg-color-fb"></i>
<h4>Facebook</h4>
<p lang="en" data-lang-token="support_label_fbtext">Share our Hyperion Facebook page and get a notice when new updates are released</p>
<p data-i18n="support_label_fbtext">Share our Hyperion Facebook page and get a notice when new updates are released</p>
</div>
</a>
<a href="#" target="_blank" class="unlink">
<div class="col-xs-12 col-sm-6 col-lg-3 support-container">
<i class="fa fa-twitter bg-color-tw"></i>
<h4>Twitter</h4>
<p lang="en" data-lang-token="support_label_twtext">Share and follow on Twitter, be always up to date with latest post about the Hyperion development</p>
<p data-i18n="support_label_twtext">Share and follow on Twitter, be always up to date with latest post about the Hyperion development</p>
</div>
</a>
<a href="https://plus.google.com/103082579494653418604" target="_blank" class="unlink">
<div class="col-xs-12 col-sm-6 col-lg-3 support-container">
<i class="fa fa-google-plus bg-color-g"></i>
<h4>Google+</h4>
<p lang="en" data-lang-token="support_label_ggtext">Circle us on Google +!</p>
<p data-i18n="support_label_ggtext">Circle us on Google +!</p>
</div>
</a>
<a href="https://www.youtube.com/channel/UCCah_idbSMqgo4UwP6R9H-A" target="_blank" class="unlink">
<div class="col-xs-12 col-sm-6 col-lg-3 support-container">
<i class="fa fa-youtube bg-color-g"></i>
<h4>Youtube</h4>
<p lang="en" data-lang-token="support_label_yttext">Bored from pictures? Checkout our Youtube channel</p>
<p data-i18n="support_label_yttext">Bored from pictures? Checkout our Youtube channel!</p>
</div>
</a>
</div>
<div class="col-xs-12">
<hr>
<h3 style="font-weight: bold" lang="en" data-lang-token="support_label_donate">Donate or bookmark our affiliate links</h3>
<h4 style="font-weight: bold" data-i18n="support_label_donate">Donate or use our affiliate links</h4>
<ol>
<li lang="en" data-lang-token="support_label_affinstr1">Click on the appropriate link of your country</li>
<li lang="en" data-lang-token="support_label_affinstr2">Everything you buy (doesnt matter what) we get a small fee based on your turnover</li>
<li lang="en" data-lang-token="support_label_affinstr3">You ALWAYS pay the same price, there is absolutely no difference. Try it out!</li>
<li data-i18n="support_label_affinstr1">Click on the appropriate link of your country</li>
<li data-i18n="support_label_affinstr2">Everything you buy (doesnt matter what) we get a small fee based on your turnover</li>
<li data-i18n="support_label_affinstr3">You ALWAYS pay the same price, there is absolutely no difference. Try it out!</li>
</ol>
<div class="col-xs-12 col-sm-6 col-lg-3 support-container">
<i class="fa fa-amazon bg-color-am"></i>
<h4>Amazon</h4>
<ul>
<li><a href="http://www.amazon.de/?tag=hyperionproje-21" target="_blank" lang="en" data-lang-token="general_country_de">Germany</a></li>
<li><a href="http://www.amazon.com/?tag=hyperionpro05-20" target="_blank" lang="en" data-lang-token="general_country_us">United States</a></li>
<li><a href="http://www.amazon.co.uk/?tag=hyperionpro02-21" target="_blank" lang="en" data-lang-token="general_country_uk">United Kingdom</a></li>
<li><a href="http://www.amazon.fr/?tag=hyperionpro0c-21" target="_blank" lang="en" data-lang-token="general_country_fr">France</a></li>
<li><a href="http://www.amazon.es/?tag=hyperionpro07-21" target="_blank" lang="en" data-lang-token="general_country_es">Spain</a></li>
<li><a href="http://www.amazon.it/?tag=hyperionpro00-21" target="_blank" lang="en" data-lang-token="general_country_it">Italy</a></li>
<li><a href="http://www.amazon.de/?tag=hyperionproje-21" target="_blank" data-i18n="general_country_de">Germany</a></li>
<li><a href="http://www.amazon.com/?tag=hyperionpro05-20" target="_blank" data-i18n="general_country_us">United States</a></li>
<li><a href="http://www.amazon.co.uk/?tag=hyperionpro02-21" target="_blank" data-i18n="general_country_uk">United Kingdom</a></li>
<li><a href="http://www.amazon.fr/?tag=hyperionpro0c-21" target="_blank" data-i18n="general_country_fr">France</a></li>
<li><a href="http://www.amazon.es/?tag=hyperionpro07-21" target="_blank" data-i18n="general_country_es">Spain</a></li>
<li><a href="http://www.amazon.it/?tag=hyperionpro00-21" target="_blank" data-i18n="general_country_it">Italy</a></li>
</ul>
</div>
<div class="col-xs-12 col-sm-6 col-lg-3 support-container">
<i class="fa fa-shopping-cart bg-color-am"></i>
<h4>ebay</h4>
<ul>
<li><a href="http://rover.ebay.com/rover/1/707-53477-19255-0/1?pub=5575174930&toolid=10001&campid=707-53477-19255-0&customid=&mpt=9592320&mpre=http%3A%2F%2Fwww.ebay.de" target="_blank" lang="en" data-lang-token="general_country_de">Germany</a></li>
<li><a href="http://rover.ebay.com/rover/1/711-53200-19255-0/1?pub=5575174930&toolid=10001&campid=711-53200-19255-0&customid=&mpt=8091563&mpre=http%3A%2F%2Fwww.ebay.com" target="_blank" lang="en" data-lang-token="general_country_us">United States</a></li>
<li><a href="http://rover.ebay.com/rover/1/710-53481-19255-0/1?pub=5575174930&toolid=10001&campid=710-53481-19255-0&customid=&mpt=9837178&mpre=http%3A%2F%2Fwww.ebay.co.uk" target="_blank" lang="en" data-lang-token="general_country_uk">United Kingdom</a></li>
<li><a href="http://rover.ebay.com/rover/1/1346-53482-19255-0/1?pub=5575174930&toolid=10001&campid=1346-53482-19255-0&customid=&mpt=9890408&mpre=http%3A%2F%2Fwww.ebay.nl" target="_blank" lang="en" data-lang-token="general_country_nl">Netherlands</a></li>
<li><a href="http://rover.ebay.com/rover/1/709-53476-19255-0/1?pub=5575174930&toolid=10001&campid=709-53476-19255-0&customid=&mpt=9865977&mpre=http%3A%2F%2Fwww.ebay.fr" target="_blank" lang="en" data-lang-token="general_country_fr">France</a></li>
<li><a href="http://rover.ebay.com/rover/1/1185-53479-19255-0/1?pub=5575174930&toolid=10001&campid=1185-53479-19255-0&customid=&mpt=1016300&mpre=http%3A%2F%2Fwww.ebay.es" target="_blank" lang="en" data-lang-token="general_country_es">Spain</a></li>
<li><a href="http://rover.ebay.com/rover/1/707-53477-19255-0/1?pub=5575174930&toolid=10001&campid=707-53477-19255-0&customid=&mpt=9592320&mpre=http%3A%2F%2Fwww.ebay.de" target="_blank" data-i18n="general_country_de">Germany</a></li>
<li><a href="http://rover.ebay.com/rover/1/711-53200-19255-0/1?pub=5575174930&toolid=10001&campid=711-53200-19255-0&customid=&mpt=8091563&mpre=http%3A%2F%2Fwww.ebay.com" target="_blank" data-i18n="general_country_us">United States</a></li>
<li><a href="http://rover.ebay.com/rover/1/710-53481-19255-0/1?pub=5575174930&toolid=10001&campid=710-53481-19255-0&customid=&mpt=9837178&mpre=http%3A%2F%2Fwww.ebay.co.uk" target="_blank" data-i18n="general_country_uk">United Kingdom</a></li>
<li><a href="http://rover.ebay.com/rover/1/1346-53482-19255-0/1?pub=5575174930&toolid=10001&campid=1346-53482-19255-0&customid=&mpt=9890408&mpre=http%3A%2F%2Fwww.ebay.nl" target="_blank" data-i18n="general_country_nl">Netherlands</a></li>
<li><a href="http://rover.ebay.com/rover/1/709-53476-19255-0/1?pub=5575174930&toolid=10001&campid=709-53476-19255-0&customid=&mpt=9865977&mpre=http%3A%2F%2Fwww.ebay.fr" target="_blank" data-i18n="general_country_fr">France</a></li>
<li><a href="http://rover.ebay.com/rover/1/1185-53479-19255-0/1?pub=5575174930&toolid=10001&campid=1185-53479-19255-0&customid=&mpt=1016300&mpre=http%3A%2F%2Fwww.ebay.es" target="_blank" data-i18n="general_country_es">Spain</a></li>
</ul>
</div>
<a href="https://www.paypal.me/hyperionproject/10" target="_blank" class="unlink">
<div class="col-xs-12 col-sm-6 col-lg-3 support-container">
<i class="fa fa-paypal bg-color-pp"></i>
<h4>Paypal</h4>
<p lang="en" data-lang-token="support_label_donationpp">Donation:</p><a href="https://www.paypal.me/hyperionproject/10" target="_blank">Paypal</a>
<p data-i18n="support_label_donationpp">Donation:</p><a href="https://www.paypal.me/hyperionproject/10" target="_blank">Paypal</a>
</div>
</a>
<a href="bitcoin:1GGZbsT6fH3cGq25H5HS2PfisPfDnffSJR?amount=0.5&label=Hyperion Donation" class="unlink">
<div class="col-xs-12 col-sm-6 col-lg-3 support-container">
<i class="fa fa-btc bg-color-btc"></i>
<h4>Bitcoin</h4>
<p lang="en" data-lang-token="support_label_btctext">Address:</p>
<p data-i18n="support_label_btctext">Address:</p>
<p>1GGZbsT6fH3cGq25H5HS2PfisPfDnffSJR</p>
</div>
</a>
</div>
<div class="col-xs-12">
<hr>
<h3 style="font-weight: bold" lang="en" data-lang-token="support_label_webrestitle">Information and help ressources</h3>
<a href="https://www.hyperion-project.org" target="_blank" class="unlink">
<h4 style="font-weight: bold" data-i18n="support_label_webrestitle">Information and help ressources</h4>
<a href="https://www.hyperion-project.org?pk_campaign=WebUI&pk_kwd=support_webpage" target="_blank" class="unlink">
<div class="col-xs-12 col-sm-6 col-lg-3 support-container">
<i class="fa fa-globe bg-color-wf"></i>
<h4 lang="en" data-lang-token="support_label_webpagetitle">Webpage</h4>
<p lang="en" data-lang-token="support_label_webpagetext">Home of Hyperion</p>
<h4 data-i18n="support_label_webpagetitle">Webpage</h4>
<p data-i18n="support_label_webpagetext">Home of Hyperion</p>
</div>
</a>
<a href="https://wiki.hyperion-project.org" target="_blank" class="unlink">
<a href="https://wiki.hyperion-project.org?pk_campaign=WebUI&pk_kwd=support_wiki" target="_blank" class="unlink">
<div class="col-xs-12 col-sm-6 col-lg-3 support-container">
<i class="fa fa-book bg-color-wf"></i>
<h4 lang="en" data-lang-token="support_label_wikititle">Wiki</h4>
<p lang="en" data-lang-token="support_label_wikitext">The A to Z source for almost everything Hyperion related</p>
<h4 data-i18n="support_label_wikititle">Wiki</h4>
<p data-i18n="support_label_wikitext">The A to Z source for almost everything Hyperion related</p>
</div>
</a>
<a href="https://forum.hyperion-project.org" target="_blank" class="unlink">
<a href="https://forum.hyperion-project.org?pk_campaign=WebUI&pk_kwd=support_forum" target="_blank" class="unlink">
<div class="col-xs-12 col-sm-6 col-lg-3 support-container">
<i class="fa fa-comments bg-color-wf"></i>
<h4 lang="en" data-lang-token="support_label_forumtitle">Forum</h4>
<p lang="en" data-lang-token="support_label_forumtext">Showcases, discussions, help and more</p>
<h4 data-i18n="support_label_forumtitle">Forum</h4>
<p data-i18n="support_label_forumtext">Showcases, discussions, help and more</p>
</div>
</a>
<a href="https://github.com/hyperion-project" target="_blank" class="unlink">
<div class="col-xs-12 col-sm-6 col-lg-3 support-container">
<i class="fa fa-github bg-color-wf"></i>
<h4>Github</h4>
<p data-i18n="support_label_ghtext">Visit our Github repository</p>
</div>
</a>
</div>
</div>
</div>
<script type="text/javascript">
performTranslation();
if(showOptHelp)
createHintH("intro", $.i18n('support_label_intro'), "supp_intro");
</script>

View File

@ -1,11 +1,11 @@
<div class="container-fluid">
<div class="row">
<div class="col-lg-12">
<h2 class="page-header"><i class="fa fa-download fa-fw"></i><span lang="en" data-lang-token="main_menu_update_token">Update</span></h2>
<h3 class="page-header"><i class="fa fa-download fa-fw"></i><span data-i18n="main_menu_update_token">Update</span></h3>
<div class="introd">
<h4 lang="en" data-lang-token="update_label_intro">This page gives you an overview of all Hyperion versions available. On top you could update or downgrade your version of Hyperion whenever you want. Sorted from newest to oldest</h4>
<h4 data-i18n="update_label_intro">Overview about all available Hyperion versions. On top you could update or downgrade your version of Hyperion whenever you want. Sorted from newest to oldest</h4>
<hr />
</div>
<hr>
<h4 id="update_currver"></h4>
<hr>
<div class="col-lg-12" id="versionlist">
@ -15,9 +15,11 @@
</div>
<script>
performTranslation('trans_update');
for (key in parsedUpdateJSON)
{
$('#versionlist').append('<div class="col-lg-6"><div class="panel panel-default"><div class="panel-heading"><i class="fa fa-television fa-fw"></i>Hyperion V'+parsedUpdateJSON[key].versionnr+'</div><div class="panel-body"><p><span style="font-weight:bold;" lang="en" data-lang-token="update_label_type">Type:</span> '+ parsedUpdateJSON[key].channel +'</p><p><span style="font-weight:bold;" lang="en" data-lang-token="update_label_description">Description:</span> '+parsedUpdateJSON[key].versiondesc+'</p><hr><a class="btn btn-primary" href="'+ parsedUpdateJSON[key].versionchangelog +'" target="_blank"><i class="fa fa-list fa-fw"></i><span style="font-weight:bold;" lang="en" data-lang-token="update_button_changelog">Full changelog</span></a><button type="button" class="btn btn-warning pull-right"><i class="fa fa-download fa-fw"></i><span lang="en" data-lang-token="update_button_install">Install</span></button></div></div></div>');
$('#versionlist').append('<div class="col-lg-6"><div class="panel panel-default"><div class="panel-heading"><i class="fa fa-television fa-fw"></i>Hyperion V'+parsedUpdateJSON[key].versionnr+'</div><div class="panel-body"><p><span style="font-weight:bold;">'+$.i18n('update_label_type')+'</span> '+ parsedUpdateJSON[key].channel +'</p><p><span style="font-weight:bold;">'+$.i18n('update_label_description')+'</span> '+parsedUpdateJSON[key].versiondesc+'</p><hr><a class="btn btn-primary" href="'+ parsedUpdateJSON[key].versionchangelog +'" target="_blank"><i class="fa fa-list fa-fw"></i><span style="font-weight:bold;">'+$.i18n('update_button_changelog')+'</span></a><button type="button" class="btn btn-warning pull-right"><i class="fa fa-download fa-fw"></i>'+$.i18n('update_button_install')+'</button></div></div></div>');
}
$('#update_currver').append(currentVersion);
$('#update_currver').append($.i18n('update_versreminder', currentVersion));
</script>

View File

@ -1,10 +1,10 @@
/*!
* Bootstrap Colorpicker v2.3.3
* http://mjolnic.github.io/bootstrap-colorpicker/
* Bootstrap Colorpicker v2.4.0
* https://itsjavi.com/bootstrap-colorpicker/
*
* Originally written by (c) 2012 Stefan Petre
* Licensed under the Apache License v2.0
* http://www.apache.org/licenses/LICENSE-2.0.txt
*
*/.colorpicker-saturation{width:100px;height:100px;background-image:url(../img/bootstrap-colorpicker/saturation.png);cursor:crosshair;float:left}.colorpicker-saturation i{display:block;height:5px;width:5px;border:1px solid #000;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;position:absolute;top:0;left:0;margin:-4px 0 0 -4px}.colorpicker-saturation i b{display:block;height:5px;width:5px;border:1px solid #fff;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.colorpicker-alpha,.colorpicker-hue{width:15px;height:100px;float:left;cursor:row-resize;margin-left:4px;margin-bottom:4px}.colorpicker-alpha i,.colorpicker-hue i{display:block;height:1px;background:#000;border-top:1px solid #fff;position:absolute;top:0;left:0;width:100%;margin-top:-1px}.colorpicker-hue{background-image:url(../img/bootstrap-colorpicker/hue.png)}.colorpicker-alpha{background-image:url(../img/bootstrap-colorpicker/alpha.png);display:none}.colorpicker-alpha,.colorpicker-hue,.colorpicker-saturation{background-size:contain}.colorpicker{padding:4px;min-width:130px;margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;z-index:2500}.colorpicker:after,.colorpicker:before{display:table;content:"";line-height:0}.colorpicker:after{clear:both}.colorpicker:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,.2);position:absolute;top:-7px;left:6px}.colorpicker:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;position:absolute;top:-6px;left:7px}.colorpicker div{position:relative}.colorpicker.colorpicker-with-alpha{min-width:140px}.colorpicker.colorpicker-with-alpha .colorpicker-alpha{display:block}.colorpicker-color{height:10px;margin-top:5px;clear:both;background-image:url(../img/bootstrap-colorpicker/alpha.png);background-position:0 100%}.colorpicker-color div{height:10px}.colorpicker-selectors{display:none;height:10px;margin-top:5px;clear:both}.colorpicker-selectors i{cursor:pointer;float:left;height:10px;width:10px}.colorpicker-selectors i+i{margin-left:3px}.colorpicker-element .add-on i,.colorpicker-element .input-group-addon i{display:inline-block;cursor:pointer;height:16px;vertical-align:text-top;width:16px}.colorpicker.colorpicker-inline{position:relative;display:inline-block;float:none;z-index:auto}.colorpicker.colorpicker-horizontal{width:110px;min-width:110px;height:auto}.colorpicker.colorpicker-horizontal .colorpicker-saturation{margin-bottom:4px}.colorpicker.colorpicker-horizontal .colorpicker-color{width:100px}.colorpicker.colorpicker-horizontal .colorpicker-alpha,.colorpicker.colorpicker-horizontal .colorpicker-hue{width:100px;height:15px;float:left;cursor:col-resize;margin-left:0;margin-bottom:4px}.colorpicker.colorpicker-horizontal .colorpicker-alpha i,.colorpicker.colorpicker-horizontal .colorpicker-hue i{display:block;height:15px;background:#fff;position:absolute;top:0;left:0;width:1px;border:none;margin-top:0}.colorpicker.colorpicker-horizontal .colorpicker-hue{background-image:url(../img/bootstrap-colorpicker/hue-horizontal.png)}.colorpicker.colorpicker-horizontal .colorpicker-alpha{background-image:url(../img/bootstrap-colorpicker/alpha-horizontal.png)}.colorpicker.colorpicker-hidden{display:none}.colorpicker.colorpicker-visible{display:block}.colorpicker-inline.colorpicker-visible{display:inline-block}.colorpicker-right:before{left:auto;right:6px}.colorpicker-right:after{left:auto;right:7px}.colorpicker-no-arrow:before{border-right:0;border-left:0}.colorpicker-no-arrow:after{border-right:0;border-left:0}
*/.colorpicker-saturation{width:100px;height:100px;background-image:url(../img/bootstrap-colorpicker/saturation.png);cursor:crosshair;float:left}.colorpicker-saturation i{display:block;height:5px;width:5px;border:1px solid #000;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;position:absolute;top:0;left:0;margin:-4px 0 0 -4px}.colorpicker-saturation i b{display:block;height:5px;width:5px;border:1px solid #fff;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.colorpicker-alpha,.colorpicker-hue{width:15px;height:100px;float:left;cursor:row-resize;margin-left:4px;margin-bottom:4px}.colorpicker-alpha i,.colorpicker-hue i{display:block;height:1px;background:#000;border-top:1px solid #fff;position:absolute;top:0;left:0;width:100%;margin-top:-1px}.colorpicker-hue{background-image:url(../img/bootstrap-colorpicker/hue.png)}.colorpicker-alpha{background-image:url(../img/bootstrap-colorpicker/alpha.png);display:none}.colorpicker-alpha,.colorpicker-hue,.colorpicker-saturation{background-size:contain}.colorpicker{padding:4px;min-width:130px;margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;z-index:2500}.colorpicker:after,.colorpicker:before{display:table;content:"";line-height:0}.colorpicker:after{clear:both}.colorpicker:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,.2);position:absolute;top:-7px;left:6px}.colorpicker:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;position:absolute;top:-6px;left:7px}.colorpicker div{position:relative}.colorpicker.colorpicker-with-alpha{min-width:140px}.colorpicker.colorpicker-with-alpha .colorpicker-alpha{display:block}.colorpicker-color{height:10px;margin-top:5px;clear:both;background-image:url(../img/bootstrap-colorpicker/alpha.png);background-position:0 100%}.colorpicker-color div{height:10px}.colorpicker-selectors{display:none;height:10px;margin-top:5px;clear:both}.colorpicker-selectors i{cursor:pointer;float:left;height:10px;width:10px}.colorpicker-selectors i+i{margin-left:3px}.colorpicker-element .add-on i,.colorpicker-element .input-group-addon i{display:inline-block;cursor:pointer;height:16px;vertical-align:text-top;width:16px}.colorpicker.colorpicker-inline{position:relative;display:inline-block;float:none;z-index:auto}.colorpicker.colorpicker-horizontal{width:110px;min-width:110px;height:auto}.colorpicker.colorpicker-horizontal .colorpicker-saturation{margin-bottom:4px}.colorpicker.colorpicker-horizontal .colorpicker-color{width:100px}.colorpicker.colorpicker-horizontal .colorpicker-alpha,.colorpicker.colorpicker-horizontal .colorpicker-hue{width:100px;height:15px;float:left;cursor:col-resize;margin-left:0;margin-bottom:4px}.colorpicker.colorpicker-horizontal .colorpicker-alpha i,.colorpicker.colorpicker-horizontal .colorpicker-hue i{display:block;height:15px;background:#fff;position:absolute;top:0;left:0;width:1px;border:none;margin-top:0}.colorpicker.colorpicker-horizontal .colorpicker-hue{background-image:url(../img/bootstrap-colorpicker/hue-horizontal.png)}.colorpicker.colorpicker-horizontal .colorpicker-alpha{background-image:url(../img/bootstrap-colorpicker/alpha-horizontal.png)}.colorpicker-right:before{left:auto;right:6px}.colorpicker-right:after{left:auto;right:7px}.colorpicker-no-arrow:before{border-right:0;border-left:0}.colorpicker-no-arrow:after{border-right:0;border-left:0}.colorpicker-alpha.colorpicker-visible,.colorpicker-hue.colorpicker-visible,.colorpicker-saturation.colorpicker-visible,.colorpicker-selectors.colorpicker-visible,.colorpicker.colorpicker-visible{display:block}.colorpicker-alpha.colorpicker-hidden,.colorpicker-hue.colorpicker-hidden,.colorpicker-saturation.colorpicker-hidden,.colorpicker-selectors.colorpicker-hidden,.colorpicker.colorpicker-hidden{display:none}.colorpicker-inline.colorpicker-visible{display:inline-block}
/*# sourceMappingURL=bootstrap-colorpicker.min.css.map */

View File

@ -1 +0,0 @@
{"version":3,"sources":["src/less/colorpicker.less"],"names":[],"mappings":";;;;;;;;AAqBA,wBACE,MAAA,MACA,OAAA,MAXA,iBAAsB,iDAatB,OAAA,UACA,MAAA,KACA,0BACE,QAAA,MACA,OAAA,IACA,MAAA,IACA,OAAA,IAAA,MAAA,KAfF,sBAAA,IACA,mBAAA,IACA,cAAA,IAeE,SAAA,SACA,IAAA,EACA,KAAA,EACA,OAAA,KAAA,EAAA,EAAA,KACA,4BACE,QAAA,MACA,OAAA,IACA,MAAA,IACA,OAAA,IAAA,MAAA,KAzBJ,sBAAA,IACA,mBAAA,IACA,cAAA,IA8BF,mBADA,iBAEE,MAAA,KACA,OAAA,MACA,MAAA,KACA,OAAA,WACA,YAAA,IACA,cAAA,IAIiB,qBADF,mBAEf,QAAA,MACA,OAAA,IACA,WAAA,KACA,WAAA,IAAA,MAAA,KACA,SAAA,SACA,IAAA,EACA,KAAA,EACA,MAAA,KACA,WAAA,KAGF,iBA1DE,iBAAsB,0CA8DxB,mBA9DE,iBAAsB,4CAgEtB,QAAA,KAKF,mBADA,iBADA,wBAGE,gBAAA,QAGF,aACE,QAAA,IACA,UAAA,MACA,WAAA,IAxEA,sBAAA,IACA,mBAAA,IACA,cAAA,IAwEA,QAAA,KAIU,mBADA,oBAEV,QAAA,MACA,QAAA,GACA,YAAA,EAGU,mBACV,MAAA,KAGU,oBACV,QAAA,GACA,QAAA,aACA,YAAA,IAAA,MAAA,YACA,aAAA,IAAA,MAAA,YACA,cAAA,IAAA,MAAA,KACA,oBAAA,eACA,SAAA,SACA,IAAA,KACA,KAAA,IAGU,mBACV,QAAA,GACA,QAAA,aACA,YAAA,IAAA,MAAA,YACA,aAAA,IAAA,MAAA,YACA,cAAA,IAAA,MAAA,KACA,SAAA,SACA,IAAA,KACA,KAAA,IAGW,iBACX,SAAA,SAGU,oCACV,UAAA,MAGkC,uDAClC,QAAA,MAGF,mBACE,OAAA,KACA,WAAA,IACA,MAAA,KAlIA,iBAAsB,4CAoItB,oBAAA,EAAA,KAGiB,uBACjB,OAAA,KAGF,uBACE,QAAA,KACA,OAAA,KACA,WAAA,IACA,MAAA,KAGqB,yBACrB,OAAA,QACA,MAAA,KACA,OAAA,KACA,MAAA,KAGuB,2BACvB,YAAA,IAI2B,+BADW,0CAEtC,QAAA,aACA,OAAA,QACA,OAAA,KACA,eAAA,SACA,MAAA,KAGU,gCACV,SAAA,SACA,QAAA,aACA,MAAA,KACA,QAAA,KAGU,oCACV,MAAA,MACA,UAAA,MACA,OAAA,KAGkC,4DAClC,cAAA,IAGkC,uDAClC,MAAA,MAIkC,uDADA,qDAElC,MAAA,MACA,OAAA,KACA,MAAA,KACA,OAAA,WACA,YAAA,EACA,cAAA,IAIqD,yDADF,uDAEnD,QAAA,MACA,OAAA,KACA,WAAA,KACA,SAAA,SACA,IAAA,EACA,KAAA,EACA,MAAA,IACA,OAAA,KACA,WAAA,EAGkC,qDAlNlC,iBAAsB,qDAsNY,uDAtNlC,iBAAsB,uDA0NZ,gCACV,QAAA,KAGU,iCACV,QAAA,MAGiB,wCACjB,QAAA,aAGgB,0BAChB,KAAA,KACA,MAAA,IAGgB,yBAChB,KAAA,KACA,MAAA,IAGmB,6BACnB,aAAA,EACA,YAAA,EAGmB,4BACnB,aAAA,EACA,YAAA"}

View File

@ -4,12 +4,227 @@
src: url("../fonts/Roboto-Regular.woff") format('woff'),
url("../fonts/Roboto-Regular.ttf") format('ttf');
}
body{font-family:Roboto,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:15px;}
body{font-family:Roboto,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:15px;max-width:2000px;margin: 0 auto;}
.form-group{margin-bottom:11px;}
#page-content {
padding-bottom:50px;
}
.btn{margin: 2px 0;}
/*mobile nav*/
@media (max-width: 768px){
.navbar-toggle{position:fixed;right:0px;}
#main-nav{position:fixed;right:-200px;}
}
.navbar-toggle .icon-bar {
background-color:#4c4c4c !important;
width: 22px;
transition: all 0.2s;
}
.navbar-toggle .top-bar {
transform: rotate(45deg);
transform-origin: 10% 10%;
}
.navbar-toggle .middle-bar {
opacity: 0;
}
.navbar-toggle .bottom-bar {
transform: rotate(-45deg);
transform-origin: 10% 90%;
}
.navbar-toggle.closed .top-bar {
transform: rotate(0);
}
.navbar-toggle.closed .middle-bar {
opacity: 1;
}
.navbar-toggle.closed .bottom-bar {
transform: rotate(0);
}
/*editor changes*/
[id^=editor_container] h3{margin-top:10px;}
[id^=editor_container] .well{margin-bottom:9px;border:none;background-color:white;box-shadow:none;}
[id^=editor_container] label{padding-left:0px !important; padding-right:0px !important;}
.ltd{width:auto;text-align:left;white-space:nowrap;vertical-align:middle !important;padding:6px !important;}
.itd{width:100%;padding:6px !important;}
table.input-group{width:100%}
@media (max-width: 767px) {.ltd{white-space:normal;}}
/*icon spacing*/
.fa-fw{margin-right:5px;}
/*table*/
table.borderless td,table.borderless th{border: none !important;}
.borderless {margin-bottom:0px}
table label{margin:0}
/*Header*/
.navbar-brand{padding: 5px;padding-left:20px;height:60px;}
.sidebar{margin-top:62px;padding-top:20px;}
.dropdown{font-size:18px;}
@media (max-width: 767px) {.sidebar{margin-top:0px;padding-top:0px !important;}}
.page-header{margin-top:15px;}
/*Panels*/
.panel-heading{font-size:18px;}
.headcollapse{cursor:pointer;}
.headcollapse a:hover{text-decoration:none;}
.panel-default{
background-color:#fff !important;
border-color:#d0d0d0 !important;
}
.panel-default>.panel-heading{
background-color:#f3f3f3 !important;
border-color:#ddd !important;
}
/*remote page*/
@media (max-width: 500px) {.ssthead th:nth-child(1), .sstbody td:nth-child(1){display:none}}
/*Dashboard*/
.component-on{color:green;}
.component-off{color:grey;}
/*Colorpicker 2x*/
.colorpicker-2x {z-index:99999}
.colorpicker-2x .colorpicker-saturation {width: 200px;height: 200px;}
.colorpicker-2x .colorpicker-hue,.colorpicker-2x .colorpicker-alpha {width: 30px;height: 200px;}
.colorpicker-2x .colorpicker-color,.colorpicker-2x .colorpicker-color div {height: 30px;}
/*Hint*/
.info-hint{
background-color:rgb(236,236,236);
border-radius:10px;
}
.intro-hint{
padding:8px 8px 8px 14px;
margin:0px 0px 15px 0px;
border-left:8px solid #0088cc;
border-top:1px solid #0088cc;
box-shadow: 1px 1px 1px 0px rgba(0,0,0,0.25);
font-size:97%;
}
/*Support page*/
.unlink,.unlink:hover{color:#333;text-decoration:none;}
.support-container ul{padding-left:0px;list-style-type: none;}
.support-container{text-align: center;margin-top:15px;color:#333;}
.support-container .fa{line-height:58px;font-size:40px;width:100px;height:100px;padding:20px;border-radius: 120px;border: 1px solid;transition: background-color 0.5s linear, color 0.5s linear;}
.support-container h4{margin-top:13px;}
.support-container:hover .bg-color-fb{background-color:#3b5998;color:white;}
.support-container:hover .bg-color-tw{background-color:#1da1f2; color:white;}
.support-container:hover .bg-color-g{background-color:#cc181e; color:white;}
.support-container:hover .bg-color-wf{background-color:#0088cc; color:white;}
.support-container:hover .bg-color-btc{background-color:#f7931a; color:white;}
.support-container:hover .bg-color-pp{background-color:#0070ba; color:white;}
.support-container:hover .bg-color-am{background-color:#ef9c00; color:white;}
/*Config introduction*/
.introd h4{padding-left:14px;border-left:5px solid #0088cc;}
/*backported bootstrap 4 forms-label alignment*/
.col-form-label {
padding-top: .5rem;
padding-bottom: .5rem;
margin-bottom: 0;
}
/*led preview & led visualisation*/
#leds_canvas {background-color:#AAAAAA; position:absolute; margin:15px; background-image:url(/img/hyperion/hyperionlogo.png); background-repeat:no-repeat; background-position: center;}
.led { display:inline-block; border: 1px solid black; position:absolute; opacity:0.8; text-align:center; vertical-align:middle; padding:4px; border-radius:2px;}
.led_num, .led_prev_num {display:none; position:relative; color:black; background-color: white; border-radius:2px; padding:1px; vertical-align:middle; text-align:center; font-size:0.8em;}
.led_ex{height:15px;width:25px;border-radius:3px;display:inline-block;border:1px solid black}
/*checklists*/
.checklist{list-style-type:none;padding-left:0px}
.checklist li::before{content: "\f00c";font: normal normal normal 14px/1 FontAwesome;margin-right:5px;color:green;font-size:19px}
/*Modal icons*/
[class*="modal-icon"]{
padding:30px;
border-radius: 60px;
color:white;
font-size:50px !important;
}
.modal-icon-check{
background-color:#71c341;
}
.modal-icon-warning{
background-color:#f7c44a;
}
.modal-icon-error{
background-color:#d1322e;
}
.overlay {
background-image: url('/img/hyperion/hyperionwhitelogo.png');
background-repeat: no-repeat;
background-position: center center;
background-color: rgba(1, 1, 1, 0.7);
position: fixed;
bottom: 0;
left: 0;
right: 0;
top: 0;
z-index:99999;
}
/*simple ripple effect for li a and btn*/
.btn, li a{
position: relative;
overflow: hidden;
}
.btn:after {
content: "";
display: block;
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
pointer-events: none;
background-image: radial-gradient(circle, #000 10%, transparent 10.01%);
background-repeat: no-repeat;
background-position: 50%;
transform: scale(10, 10);
opacity: 0;
transition: transform .5s, opacity 1s;
}
.btn:active:after {
transform: scale(0, 0);
opacity: .2;
transition: 0s;
}
li a:after {
content: "";
display: block;
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
pointer-events: none;
background-image: radial-gradient(circle, #000 10%, transparent 10.01%);
background-repeat: no-repeat;
background-position: 50%;
transform: scale(10, 10);
opacity: 0;
transition: transform .5s, opacity 1s;
}
li a:active:after {
transform: scale(0, 0);
opacity: .2;
transition: 0s;
}
/**add a dditional width defintion for bootstrap**/
@media (min-width: 1500px) {
.col-xxl-1, .col-xxl-2, .col-xxl-3, .col-xxl-4, .col-xxl-5, .col-xxl-6, .col-xxl-7, .col-xxl-8, .col-xxl-9, .col-xxl-10, .col-xxl-11, .col-xxl-12 {
float: left;
padding-left:15px;
padding-right:15px;
}
.col-xxl-12 {
width: 100%;
@ -166,102 +381,143 @@ body{font-family:Roboto,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:15
}
}
/*icon spacing*/
.fa-fw{margin-right:5px;}
/*borderless table*/
table.borderless td,table.borderless th{border: none !important;}
/*Header*/
.navbar-brand{padding: 5px;padding-left:20px;height:60px;}
.sidebar{margin-top:61px;padding-top:20px;}
.dropdown{font-size:18px;}
@media (max-width: 767px) {.sidebar{margin-top:0px;}}
.page-header{margin-top:15px;}
/*Panels*/
.panel-heading{font-size:18px;}
.headcollapse{cursor:pointer;}
.headcollapse a:hover{text-decoration:none;}
/*Dashboard*/
.component-on{color:green;}
.component-off{color:grey;}
/*Colorpicker 2x*/
.colorpicker-2x .colorpicker-saturation {width: 200px;height: 200px;}
.colorpicker-2x .colorpicker-hue,.colorpicker-2x .colorpicker-alpha {width: 30px;height: 200px;}
.colorpicker-2x .colorpicker-color,.colorpicker-2x .colorpicker-color div {height: 30px;}
.colorpicker-2x .colorpicker-selectors i{height:20px;width:20px;}
/*Support page*/
.unlink,.unlink:hover{color:#333;text-decoration:none;}
.support-container ul{padding-left:0px;list-style-type: none;}
.support-container{text-align: center;margin-top:15px;color:#333;}
.support-container .fa{line-height:58px;font-size:40px;width:100px;height:100px;padding:20px;border-radius: 120px;border: 1px solid;transition: background-color 0.5s linear, color 0.5s linear;}
.support-container h4{margin-top:13px;}
.support-container:hover .bg-color-fb{background-color:#3b5998;color:white;}
.support-container:hover .bg-color-tw{background-color:#1da1f2; color:white;}
.support-container:hover .bg-color-g{background-color:#cc181e; color:white;}
.support-container:hover .bg-color-wf{background-color:#0088cc; color:white;}
.support-container:hover .bg-color-btc{background-color:#f7931a; color:white;}
.support-container:hover .bg-color-pp{background-color:#0070ba; color:white;}
.support-container:hover .bg-color-am{background-color:#ef9c00; color:white;}
/*Config introduction*/
.introd{padding-left:14px;border-left:5px solid #0088cc;}
.introd h4{line-height:25px;}
/*backported bootstrap 4 forms-label alignment*/
.col-form-label {
padding-top: .5rem;
padding-bottom: .5rem;
margin-bottom: 0;
/* drag and resizable modal http://gijgo.com/ */
.gj-draggable {
cursor: move;
}
.gj-unselectable {
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.gj-resizable-handle {
position: absolute;
font-size: 0.1px;
display: block;
-ms-touch-action: none;
touch-action: none;
z-index: 90;
}
/*Modal icons*/
.modal-icon-check{
background-color:#71c341;
padding:30px;
border-radius: 60px;
color:white;
font-size:50px !important;
.gj-resizable-n {
cursor: n-resize;
height: 7px;
width: 100%;
top: -5px;
left: 0;
}
.modal-icon-warning{
background-color:#f7c44a;
padding:30px;
border-radius: 60px;
color:white;
font-size:50px !important;
.gj-resizable-e {
cursor: e-resize;
width: 7px;
right: -5px;
top: 0;
height: 100%;
}
.modal-icon-error{
background-color:#d1322e;
padding:30px;
border-radius: 60px;
color:white;
font-size:50px !important;
.gj-resizable-s {
cursor: s-resize;
height: 7px;
width: 100%;
bottom: -5px;
left: 0;
}
.overlay {
background-image: url('/img/hyperion/hyperionwhitelogo.png');
background-repeat: no-repeat;
background-position: center center;
background-color: rgba(1, 1, 1, 0.7);
position: fixed;
bottom: 0;
left: 0;
right: 0;
.gj-resizable-w {
cursor: w-resize;
width: 7px;
left: -5px;
top: 0;
z-index:99999;
height: 100%;
}
.gj-resizable-se {
cursor: se-resize;
width: 12px;
height: 12px;
right: 1px;
bottom: 1px;
}
.gj-resizable-sw {
cursor: sw-resize;
width: 9px;
height: 9px;
left: -5px;
bottom: -5px;
}
.gj-resizable-nw {
cursor: nw-resize;
width: 9px;
height: 9px;
left: -5px;
top: -5px;
}
.gj-resizable-ne {
cursor: ne-resize;
width: 9px;
height: 9px;
right: -5px;
top: -5px;
}
#page-content {
padding-bottom:50px;
.gj-dialog-footer {
position: absolute;
bottom: 0px;
width: 100%;
}
.gj-modal {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: 1040;
display: none;
overflow: hidden;
-webkit-overflow-scrolling: touch;
outline: 0;
}
.gj-content {
border: 1px solid #999;
background-color: #fff;
border-radius: 6px;
outline: 0;
}
.gj-header {
min-height: 16.43px;
padding: 15px;
border-bottom: 1px solid #e5e5e5;
}
.gj-title {
margin: 2px;
}
.gj-close {
-webkit-appearance: none;
padding: 0;
cursor: pointer;
background: 0 0;
border: 0;
float: right;
font-size: 21px;
color: #000;
}
.gj-body {
position: relative;
padding: 15px;
}
/*https://github.com/flatlogic/awesome-bootstrap-checkbox slighty edited for our purposes*/
.checkbox {
height:34px;
padding-left: 20px;
padding-top:2px !important;
margin-top: 0px !important;
margin-bottom: 0px !important;
}
.checkbox label {
display: inline-block;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -27,6 +27,10 @@ body {
}
}
.nav a{
cursor:pointer;
}
.navbar-top-links {
margin-right: 0;
}
@ -35,10 +39,6 @@ body {
display: inline-block;
}
.navbar-top-links li:last-child {
margin-right: 15px;
}
.navbar-top-links li a {
padding: 15px;
min-height: 50px;

View File

@ -0,0 +1,4 @@
<div class="panel panel-danger">
<div class="panel-heading">403 Forbidden</div>
<div class="panel-body">{MESSAGE}</div>
</div>

View File

@ -0,0 +1,4 @@
<div class="panel panel-danger">
<div class="panel-heading">404 Page not found</div>
<div class="panel-body">{MESSAGE}</div>
</div>

View File

@ -0,0 +1,4 @@
<div class="panel panel-danger">
<div class="panel-heading">405 Method not allowed</div>
<div class="panel-body">{MESSAGE}</div>
</div>

View File

@ -0,0 +1,4 @@
<div class="panel panel-danger">
<div class="panel-heading">500 Internal server error</div>
<div class="panel-body">{MESSAGE}</div>
</div>

View File

@ -0,0 +1,4 @@
</div> <!-- page -->
</body>
</html>

View File

@ -0,0 +1,30 @@
<!DOCTYPE html>
<html>
<head>
<title>Hyperion WebServer - Error</title>
<!-- Bootstrap Core CSS -->
<link href="/css/bootstrap.css" rel="stylesheet">
<!-- Flags -->
<link href="/css/flag-icon.min.css" rel="stylesheet">
<!-- MetisMenu CSS -->
<link href="/css/metisMenu.css" rel="stylesheet">
<!-- Custom CSS -->
<link href="/css/sb-admin-2.css" rel="stylesheet">
<link href="/css/hyperion.css" rel="stylesheet">
<!-- Custom Fonts -->
<link href="/css/font-awesome.min.css" rel="stylesheet" type="text/css">
<style>
body {margin:auto; padding-top:50px; }
#footer { margin-top:10px; font-size:0.5em; }
#page { }
.panel-heading { font-weight:bold; font-size: 1.3em; }
</style>
</head>
<body>
<div id="page" class="container">

View File

@ -0,0 +1,675 @@
{
"@metadata": {
"authors": [
"brindosch"
],
"project" : "Hyperion WebUI",
"locale": "de",
"last-updated": "2016-11-30",
"message-documentation": "qqq"
},
"general_webui_title" : "Hyperion - Web Konfiguration",
"general_country_de" : "Deutschland",
"general_country_us" : "Amerika",
"general_country_uk" : "England",
"general_country_fr" : "Frankreich",
"general_country_es" : "Spanien",
"general_country_it" : "Italien",
"general_country_nl" : "Niederlande",
"general_speech_de" : "Deutsch",
"general_speech_en" : "Englisch",
"general_speech_es" : "Spanisch",
"general_access_default" : "Standard",
"general_access_advanced" : "Fortgeschritten",
"general_access_expert" : "Experte",
"general_comp_SMOOTHING" : "Glättung",
"general_comp_BLACKBORDER" : "Schwarze Balken Erkennung",
"general_comp_KODICHECKER" : "Kodi Überwachung",
"general_comp_FORWARDER" : "JSON/PROTO Weiterleitung",
"general_comp_UDPLISTENER" : "UDP Listener",
"general_comp_BOBLIGHTSERVER" : "Boblight Server",
"general_comp_GRABBER" : "Plattform Aufnahme",
"general_comp_V4L" : "USB Aufnahme",
"general_col_red" : "rot",
"general_col_green" : "grün",
"general_col_blue" : "blau",
"general_button_savesettings" : "Einstellungen speichern",
"general_btn_ok" : "OK",
"general_btn_cancel" : "Abbrechen",
"general_btn_continue" : "Fortfahren",
"general_btn_save" : "Speichern",
"general_btn_saverestart" : "Speichern und neustarten",
"general_btn_saveandreload" : "Speichern und neu laden",
"general_btn_restarthyperion" : "Hyperion neustarten",
"general_btn_off" : "Aus",
"general_btn_on" : "An",
"general_btn_next" : "Weiter",
"general_btn_back" : "Zurück",
"dashboard_label_intro" : "Das Dashboard zeigt dir Informationen zum Systemstatus, ob Updates verfügbar sind, den Komponentenstatus sowie die letzten Blog-Posts vom Hyperion Team.",
"dashboard_infobox_label_title" : "Information",
"dashboard_infobox_label_currenthyp" : "Deine Hyperion Version:",
"dashboard_infobox_label_latesthyp" : "Aktuellste Hyperion Version:",
"dashboard_infobox_label_device" : "Systeminformation:",
"dashboard_infobox_message_updatewarning" : "Eine aktuellere Version von Hyperion ist verfügbar! (V$1)",
"dashboard_infobox_message_updatesuccess" : "Du nutzt die aktuellste Version von Hyperion.",
"dashboard_componentbox_label_title" : "Komponenten Status",
"dashboard_componentbox_label_comp" : "Komponente",
"dashboard_componentbox_label_status" : "Status",
"dashboard_newsbox_label_title" : "Die letzten Blogposts",
"dashboard_alert_message_confedit" : "Deine Hyperion Konfiguration wurde verändert. Um die Änderungen anzuwenden, starte Hyperion neu.",
"main_menu_dashboard_token" : "Dashboard",
"main_menu_configuration_token" : "Konfiguration",
"main_menu_general_conf_token" : "Allgemein",
"main_menu_leds_conf_token" : "LED Hardware",
"main_menu_grabber_conf_token" : "Aufnahme Hardware",
"main_menu_effect_conf_token" : "Effekte",
"main_menu_colors_conf_token" : "Bildverarbeitung",
"main_menu_kodiwatch_token" : "Kodi Überwachung",
"main_menu_network_conf_token" : "Netzwerk",
"main_menu_remotecontrol_token" : "Fernbedienung",
"main_menu_effectsconfigurator_token" : "Effekt Konfigurator",
"main_menu_support_token" : "Hilfe",
"main_menu_update_token" : "Update",
"main_menu_system_token" : "System",
"main_menu_input_selection_token" : "Eingabeauswahl",
"main_menu_logging_token" : "Protokoll",
"main_menu_webconfig_token" : "Web Konfiguration",
"main_menu_about_token" : "Über Hyperion",
"main_ledsim_title" : "LED Visualisierung",
"main_ledsim_text" : "Eine live Visualisierung deiner LED Farben, sofern verfügbar kann ein live Video dazugeschalten werden.",
"main_ledsim_btn_toggleleds" : "Zeige LEDs",
"main_ledsim_btn_togglelednumber" : "LED Nummern",
"main_ledsim_btn_togglelivevideo" : "Live Video",
"conf_general_label_title" : "Allgemeine Einstellungen",
"conf_general_intro" : "Grundsätzliche Einstellungen zu Hyperion oder WebUI, die in keine andere Kategorie passen.",
"conf_general_impexp_title" : "Importiere/Exportiere Konfiguration",
"conf_general_impexp_l1" : "Importiere eine bestehende Konfiguration, indem du unten eine Datei auswählst und anschließend auf \"Importieren\" klickst.",
"conf_general_impexp_l2" : "Exportiere eine Konfiguration, indem du auf \"Exportieren\" klickst. Dein Browser startet einen Download.",
"conf_general_impexp_impbtn" : "Importieren",
"conf_general_impexp_expbtn" : "Exportieren",
"conf_helptable_option" : "Option",
"conf_helptable_expl" : "Erklärung",
"conf_effect_path_intro" : "Definiere weitere Effekt-Pfade, wenn nötig.",
"conf_effect_fgeff_intro" : "Definiere einen Start Effekt/Farbe, dieser wird angezeigt, wenn Hyperion startet für die angegebene Dauer.",
"conf_effect_bgeff_intro" : "Definiere einen Hintergrund Effekt/Farbe, dieser wird aktiv, wenn Hyperion sich im Leerlauf befindet. (Das gilt ebenfalls für temporäres abschalten mithilfe der Kodi Überwachung).",
"conf_leds_device_intro" : "Wähle eine Methode zur Steuerung deiner LEDs aus, sie sind unterteilt in verschiedene Kategorien. Neben den allgemeinen Optionen die für alle gültig sind, gibt es auch spezfische die sich unterscheiden je nach Wahl.",
"conf_leds_layout_intro" : "Du benötigst ebenfalls ein LED Layout, welches deine LED-Positionen wiederspiegelt. Das klassische Layout wird für gewöhnlichen für TVs verwendet, Hyperion unterstützt aber auch LED Wände (Matrix). Die Ansicht des LAYOUTS ist die perspektive VOR dem Fernseher, nicht dahinter.",
"conf_leds_nav_label_ledcontroller" : "LED Steuerung",
"conf_leds_nav_label_ledlayout" : "LED Layout",
"conf_leds_contr_label_contrtype" : "Steuerungstyp:",
"conf_leds_optgroup_RPiSPI" : "RPi SPI",
"conf_leds_optgroup_RPiPWM" : "RPi PWM",
"conf_leds_optgroup_RPiGPIO" : "RPi GPIO",
"conf_leds_optgroup_network" : "Netzwerk",
"conf_leds_optgroup_usb" : "USB",
"conf_leds_optgroup_debug" : "Debug",
"conf_leds_layout_btn_checklist" : "Zeige Checkliste",
"conf_leds_leyout_checkp1" : "Die schwarze eingefärbte LED ist die erste LED. Das ist der Punkt, an dem die Daten eingespeist werden.",
"conf_leds_leyout_checkp2" : "Das Layout ist die Ansicht vor dem Fernseher stehend, nicht dahinter.",
"conf_leds_leyout_checkp3" : "Stelle sicher, dass die Richtung richtig eingestellt ist, dazu ist die zweite und dritte LED grau markiert um den Datenfluss anzuzeigen.",
"conf_leds_leyout_checkp4" : "Vorgang Lücke: Solltest du eine Lücke benötigen, ignoriere diese bei der LED Angabe Oben/Unten/Rechts/Links und gebe anschließend unter Lückenlänge an, wieviel LEDs du abziehen möchtest. Verändere jetzt die Lückenposition, um die Lücke an die richtige Stelle zu rücken.",
"conf_leds_layout_frame" : "Klassisches Layout (Rahmen)",
"conf_leds_layout_matrix" : "Matrix Layout (LED Wand)",
"conf_leds_layout_generatedconf" : "Generierte/Aktuelle LED Konfiguration",
"conf_leds_layout_button_savelay" : "Speichere Layout",
"conf_leds_layout_button_updsim" : "Aktualisiere Vorschau",
"conf_leds_layout_peview" : "LED Layout Vorschau",
"conf_leds_layout_advanced" : "Erweiterte Optionen",
"conf_leds_layout_preview_originCL" : "Erstellt von: Klassisches Layout (Rahmen)",
"conf_leds_layout_preview_originTEXT" : "Erstellt von: Textfeld",
"conf_leds_layout_preview_originMA" : "Erstellt von: Matrix Layout (LED Wand)",
"conf_leds_layout_preview_totalleds" : "LEDs gesamt: $1",
"conf_leds_layout_preview_l1" : "Das ist die erste LED (Einspeisung)",
"conf_leds_layout_preview_l2" : "Das visualisiert die Richtung des Datenstroms (zweite/dritte LED)",
"conf_leds_layout_cl_top" : "Oben",
"conf_leds_layout_cl_bottom" : "Unten",
"conf_leds_layout_cl_left" : "Links",
"conf_leds_layout_cl_right" : "Rechts",
"conf_leds_layout_cl_gaglength" : "Lückenlänge",
"conf_leds_layout_cl_gappos" : "Lückenposition",
"conf_leds_layout_cl_inppos" : "Einspeisepunkt",
"conf_leds_layout_cl_reversdir" : "Richtung umkehren",
"conf_leds_layout_cl_hleddepth" : "Horizontale LED Tiefe",
"conf_leds_layout_cl_vleddepth" : "Vertikale LED Tiefe",
"conf_leds_layout_cl_generate" : "Generiere LED Konfiguration",
"conf_leds_layout_cl_edgegap" : "Rahmenabstand",
"conf_leds_layout_cl_cornergap" : "Eckabstand",
"conf_leds_layout_cl_overlap" : "Überlappung",
"conf_leds_layout_ma_horiz" : "Horizontal",
"conf_leds_layout_ma_vert" : "Vertikal",
"conf_leds_layout_ma_cabling" : "Verkabelung",
"conf_leds_layout_ma_optsnake" : "Schlange",
"conf_leds_layout_ma_optparallel" : "Parallel",
"conf_leds_layout_ma_order" : "Reihenfolge",
"conf_leds_layout_ma_opthoriz" : "Horizontal",
"conf_leds_layout_ma_optvert" : "Vertikal",
"conf_leds_layout_ma_position" : "Einpeisepunkt",
"conf_leds_layout_ma_opttopleft" : "Oben links",
"conf_leds_layout_ma_opttopright" : "Oben rechts",
"conf_leds_layout_ma_optbottomleft" : "Unten links",
"conf_leds_layout_ma_optbottomright" : "Unten rechts",
"conf_leds_layout_textf1" : "Das Textfeld zeigt dir dein aktuell geladenes Layout, sofern du kein neues Layout mit den Optionen unten erstellt hast. Optional kann man die Werte hier weiter bearbeiten.",
"conf_grabber_fg_intro" : "Plattform Aufnahme ist das lokale System auf dem Hyperion installiert wurde, welches als Bildquelle dient.",
"conf_grabber_v4l_intro" : "USB Aufnahme ist ein Gerät, welches via USB angeschlossen ist und als Bildquelle dient.",
"conf_colors_color_intro" : "Erstelle Kalibrierungsprofile und passe Farben an, Helligkeit, Linearisierung und mehr.",
"conf_colors_smoothing_intro" : "Glätte den Farbverlauf und Helligkeitsänderungen um nicht von schnellen Übergängen abgelenkt zu werden.",
"conf_colors_blackborder_intro" : "Ignoriere schwarze Balken, jeder Modus nutzt einen anderen Algorithmus um diese zu erkennen. Erhöhe die Schwelle, sollte es nicht funktionieren.",
"conf_network_json_intro" : "Der JSON-RPC-Port dieser Hyperion-Instanz, wird genutzt zur Fernsteuerung.",
"conf_network_proto_intro" : "Der PROTO-Port dieser Hyperion-Instanz, wird genutzt für \"Bildstreams\" (HyperionScreenCap, Kodi Adddon, ...)",
"conf_network_bobl_intro" : "Boblight Empfänger",
"conf_network_udpl_intro" : "UDP Empfänger",
"conf_network_forw_intro" : "Leite alles an eine zweite Hyperion Instanz weiter, diese kann dann mit einer anderen LED Steuerung genutzt werden",
"conf_kodi_label_title" : "Kodi Überwachung",
"conf_kodi_intro" : "Die Kodi Überwachung ermöglicht es dir abhängig vom Kodi Status dein ambient light an oder abzuschalten. Dies ist nicht limitiert auf das selbe Gerät. Du kannst jedes Kodi in deinem lokalen Netzwerk überwachen lassen.",
"conf_logging_label_intro" : "Überprüfe die Meldungen im Prokotoll um zu erfahren was Hyperion gerade beschäftigt. Je nach eingestellter Protokoll-Stufe siehst du mehr oder weniger Informationen.",
"conf_logging_btn_pbupload" : "Bericht für Supportanfrage erstellen",
"conf_logging_btn_autoscroll" : "Automatisch scrollen",
"conf_logging_nomessage" : "Keine Einträge vorhanden.",
"conf_logging_uploading" : "Aufbereitung der Daten...",
"conf_logging_yourlink" : "Link zu deinem Bericht",
"conf_logging_uplfailed" : "Hochladen fehlgeschlagen! Überprüfe deine Internetverbindung!",
"conf_webconfig_label_intro" : "Einstellungen zur Webkonfiguration. Änderungen können die Erreichbarkeit des Webinterfaces beeinflussen.",
"remote_losthint" : "Notiz: Alle Änderungen gehen nach einem Neustart verloren.",
"remote_color_label" : "Farbe/Effekt",
"remote_color_intro" : "Setze einen Effekt oder eine Farbe. Auch deine selbst erstellten Effekte sind gelistet (sofern verfügbar). $1",
"remote_color_button_reset" : "Farbe/Effekt zurücksetzen",
"remote_color_label_color" : "Farbe:",
"remote_effects_label_effects" : "Effekt:",
"remote_adjustment_label" : "Farbanpassung",
"remote_adjustment_intro" : "Verändere live Farbe/Helligkeit/Linearisierung. $1",
"remote_input_label" : "Quellenauswahl",
"remote_input_intro" : "Hyperion nutzt ein Prioritätensystem um die Quelle zu wählen. Alles was du setzte hat eine Prioität (Effekte/Farben/Plattform Aufnahme/USB Aufnahme und Netzwerkquellen). Standardmäßig nutzt Hyperion die Quelle mit der niedrigsten Prioität. Hier kannst du aktiv Einfluss darauf nehmen. $1",
"remote_input_label_autoselect" : "Automatische Auswahl",
"remote_input_setsource_btn" : "Wähle Quelle",
"remote_input_sourceactiv_btn" : "Quelle aktiv",
"remote_input_origin" : "Ursprung",
"remote_input_owner" : "Typ",
"remote_input_priority" : "Priorität",
"remote_input_status" : "Status/Aktion",
"remote_input_duration" : "Dauer:",
"remote_input_ip" : "IP:",
"remote_components_label" : "Komponentensteuerung",
"remote_components_intro" : "Starte und stoppe Komponenten von Hyperion. $1",
"remote_optgroup_usreffets" : "Benutzer Effekte",
"remote_optgroup_syseffets" : "Mitgelieferte Effekte",
"remote_maptype_label" : "LED-Bereich Zuordnung",
"remote_maptype_intro" : "Wechsle zwischen verschiedenen Typen um die Auswirkungen besser vergleichen zu können. $1",
"remote_maptype_label_multicolor_mean" : "Mehrfarbig",
"remote_maptype_label_unicolor_mean" : "Einfarbig",
"effectsconfigurator_label_intro" : "Erstelle auf Grundlage der Basiseffekte neue Effekt die nach deinen Wünschen angepasst sind. Je nach Effekt stehen Optionen wie Farbe, Geschwindigkeit, oder Richtung und vieles mehr zur Auswahl.",
"effectsconfigurator_label_chooseeff" : "Basis-Effekt auswählen:",
"effectsconfigurator_button_saveeffect" : "Effekt speichern",
"effectsconfigurator_label_effectname" : "Effektname",
"effectsconfigurator_button_starttest" : "Starte Test",
"effectsconfigurator_button_stoptest" : "Stoppe Test",
"effectsconfigurator_button_conttest" : "Fortlaufender Test",
"effectsconfigurator_label_deleffect" : "Effekt entfernen:",
"effectsconfigurator_button_deleffect" : "Effekt entfernen",
"support_label_title" : "Unterstütze Hyperion",
"support_label_intro" : "Hyperion ist ein kostenloses Open Source Projekt und ein kleines Team arbeitet an seiner Weiterentwicklung. Darum benötigen wir DEINE Unterstützung um den Ball weiter rollen zu lassen und um weiter in bessere Infrastruktur und Weiterentwicklung investieren zu können.",
"support_label_spreadtheword" : "Weitersagen!",
"support_label_fbtext" : "Teile Inhalte in Facebook und halte dich und andere auf dem Laufenden",
"support_label_twtext" : "Nutze die 140 Zeichen und bleibe auf dem Laufenden auch auf Twitter",
"support_label_ggtext" : "Platziere uns in deinen Kreisen auf Google+",
"support_label_yttext" : "Gelangweilt von Bildern? Werfe einen Blick auf unsere Youtube Videos",
"support_label_donate" : "Spende oder nutze unsere Affiliate Links",
"support_label_affinstr1" : "Klicke auf den Link deines Landes",
"support_label_affinstr2" : "Kaufe wie gewohnt ein, abhängig von deinem Umsatz bekommen wir eine kleine Provision",
"support_label_affinstr3" : "Du zahlst immer den selben Preis. Teste es!",
"support_label_btctext" : "Adresse:",
"support_label_donationpp" : "Spende:",
"support_label_webrestitle" : "Informationsquellen und Hilfe",
"support_label_webpagetitle" : "Internetseite",
"support_label_webpagetext" : "Das Zuhause von Hyperion",
"support_label_wikititle" : "Wiki",
"support_label_wikitext" : "Von A bis Z - Alles wissenwerte zu Hyperion",
"support_label_forumtitle" : "Forum",
"support_label_forumtext" : "Diskussion und Hilfestellung von der Community",
"support_label_ghtext" : "Besuche uns auf Github",
"update_label_intro" : "Diese Seite zeigt dir alle verfügbaren Versionen von Hyperion, du kannst nach Belieben eine aktuellere Version installieren oder eine Ältere. Die aktuellsten Versionen befinden sich immer oben.",
"update_label_description" : "Beschreibung:",
"update_button_install" : "Installieren",
"update_button_changelog" : "Zeige Änderungsprotokoll",
"update_label_type" : "Art:",
"update_versreminder" : "Deine Version: $1",
"about_version" : "Version",
"about_build" : "Build",
"about_builddate" : "Build Datum",
"about_translations" : "Übersetzungen",
"about_resources" : "$1 Bibliotheken",
"about_contribute" : "Übersetze Hyperion in weitere Sprachen!",
"about_credits" : "Einen Dank an alle Entwickler!",
"info_conlost_label_title" : "Verbindung zum Hyperion Service unterbrochen!",
"info_conlost_label_reason" : "Mögliche Ursachen:",
"info_conlost_label_reason1" : "- Schlechte WLAN Verbindung",
"info_conlost_label_reason2" : "- Ein Update wird durchgeführt",
"info_conlost_label_reason3" : "- Hyperion wird nicht mehr ausgeführt",
"info_conlost_label_autorecon" : "Du wirst verbunden, sobald Hyperion wieder verfügbar ist",
"info_conlost_label_autorefresh" : "Diese Seite wird automatisch aktualisiert",
"info_conlost_label_reload" : "Wenn nicht, klicke hier",
"info_restart_title" : "Startet gerade neu...",
"info_restart_rightback" : "Hyperion ist gleich wieder für dich da!",
"info_restart_contus" : "Solltest du nach 20 Sekunden immer noch hier sein, ist etwas schief gelaufen. Öffne bitte in unserem Support Forum ein neues Thema...",
"info_restart_contusa" : "...mit deinen letztes Schritten. Danke!",
"infoDialog_general_success_title" : "Erfolg",
"infoDialog_general_error_title" : "Fehler",
"infoDialog_general_warning_title" : "Warnung",
"infoDialog_checklist_title" : "Checkliste!",
"InfoDialog_leds_validfail_title" : "JSON Überprüfung fehlgeschlagen!",
"infoDialog_effconf_deleted_text" : "Der Effekt \"$1\" wurde erfolgreich entfernt!",
"infoDialog_effconf_created_text" : "Der Effekt \"$1\" wurde erfolgreich erstellt!",
"InfoDialog_lang_title" : "Spracheinstellung",
"InfoDialog_lang_text" : "Sollte dir die Vorauswahl der automatischen Spracherkennung nicht gefallen, kannst du die Sprache hier manuell festlegen.",
"InfoDialog_access_title" : "Einstellungsstufe",
"InfoDialog_access_text" : "Je höher die Stufe je mehr Einstellungen und Funktionen stehen zur Verfügung. Empfohlen ist \"Standard\".",
"InfoDialog_nowrite_title" : "Fehler beim Schreibzugriff!",
"InfoDialog_nowrite_text" : "Hyperion hat keinen Schreibzugriff auf die aktuell geladene Konfiguration. Bitte korrigiere die Dateizugriffsrechte um fortzufahren.",
"InfoDialog_nowrite_foottext" : "Die Webkonfiguration wird automatisch wieder freigegeben, sobald das Problem behoben wurde!",
"infoDialog_wizrgb_text" : "Deine RGB Byte Reihenfolge ist bereits richtig eingestellt.",
"infoDialog_writeconf_error_text" : "Das speichern der Konfiguration ist fehlgeschlagen.",
"infoDialog_import_jsonerror_text" : "Die ausgewählte Konfigurations-Datei \"$1\" ist keine .json Datei oder ist beschädigt! Fehlermeldung: ($2)",
"infoDialog_import_hyperror_text" : "Die ausgewählte Konfigurations-Datei \"$1\" kann nicht importiert werden. Sie ist nicht kompatibel mit Hyperion 2.0 und höher!",
"infoDialog_import_reverror_text" : "Die Version deiner Konfigurations-Datei \"$1\" stimmt nicht mit deiner Hyperion Version überein (Datei: $2, Hyperion: $3). Du kannst nur übereinstimmende Versionen importieren!",
"infoDialog_import_comperror_text" : "Dein Browser unterstützt leider keinen Import. Bitte versuche es mit einem anderen Browser erneut.",
"infoDialog_import_confirm_title" : "Bestätige Import",
"infoDialog_import_confirm_text" : "Bist du sicher, dass du die Konfigurations-Datei \"$1\" importieren möchtest? Diese Aktion kann nicht rückgängig gemacht werden!",
"wiz_rgb_title" : "RGB Byte Reihenfolge Assistent",
"wiz_rgb_intro1" : "Dieser Assisent wird dir dabei helfen die richtige Byte Reihenfolge für deine leds zu finden. Klicke auf Fortfahren um zu beginnen.",
"wiz_rgb_intro2" : "Wann benötigt man diesen Assistenten? Zur Erstkonfiguration oder wenn deine LEDs zb rot leuchten sollten, sie aber blau oder grün sind.",
"wiz_rgb_expl" : "Der Farbpunkt ändert alle x Sekunden die Farbe (rot, grün), zur selben Zeit ändern deine LEDs die Farbe ebenfalls. Beantworte die Fragen unten, um deine RGB Byte Reihenfolge zu überprüfen/korrigieren.",
"wiz_rgb_switchevery" : "Ändere Farbe alle...",
"wiz_rgb_q" : "Welche Farbe zeigen deine LEDs, wenn der Farbpunkt oben...",
"wiz_rgb_qrend" : "...rot ist?",
"wiz_rgb_qgend" : "...grün ist?",
"wiz_hue_title" : "Hue Bridge Assistent",
"wiz_hue_intro1" : "Mit diesem Setupassistenten kannst du einen neuen User auf der Hue Bridge anlegen und deine LightIDs für die Hyperion Konfiguration herausfinden.",
"wiz_hue_intro2" : "Beachte: Dies ist nur ein Assistent. Du musst die Daten in die Konfiguration kopieren.",
"wiz_hue_ip" : "Hue Bridge IP:",
"wiz_hue_username" : "Benutzername:",
"wiz_hue_create_user" : "Benutzer anlegen",
"wiz_hue_failure_ip" : "Bitte überprüfe deine IP Adresse.",
"wiz_hue_failure_connection" : "Connection Timeout. Bitte drücke die Taste rechtzeitig.",
"wiz_hue_press_link" : "Bitte \"Link\" Taste auf der Hue Bridge drücken.",
"wiz_cc_title" : "Farbkalibrierungs Assistent",
"wiz_cc_intro1" : "Der Assistent wird dich durch die Kalibrierung deiner LEDs leiten. Sofern du Kodi nutzt, können die Bilder und Testvideos direkt an Kodi geschickt werden. Andernfalls musst du das Material selbst herunterladen und anwenden.",
"wiz_cc_kwebs" : "Kodi Webserver (IP:Port)",
"wiz_cc_kodidiscon" : "Kodi Webserver nicht gefunden, fahre ohne Kodi-Unterstützung fort.",
"wiz_cc_kodidisconlink" : "Download Link Bilder:",
"wiz_cc_kodicon" : "Kodi Webserver gefunden, fahre mit Kodi-Unterstützung fort.",
"wiz_cc_kodimsg_start" : "Test bestanden - Zeit zu beginnen",
"wiz_cc_kodishould" : "Kodi sollte jetzt folgendes Bild anzeigen: $1",
"wiz_cc_lettvshow" : "Lass dabei deinen Fernseher folgendes Bild anzeigen: $1",
"wiz_cc_lettvshowm" : "Überprüfe dies mithilfe folgender Bildern: $1",
"wiz_cc_adjustit" : "Verändere dein \"$1\", bis du zufrieden bist. Beachte: Je mehr du reduzierst bzw von dem Standardwert abweichst, je mehr veränderst du den maximalen Farbraum, was alle Farben die daraus abgeleitet werden ebenfalls betrifft. Je nach TV/LED Farbspektrum sind die Ergebnisse unterschiedlich.",
"wiz_cc_adjustgamma" : "Gamma: Was du jetzt tun musst ist, jeden Gamma-Kanal so einstellen, dass der \"Grauverlauf\" auf den LEDs nicht grünlich/rötlich/bläulich aussieht. Beispiel: Sollte dein grau etwas rötlich sein bedeutet dies, dass du dein Gamma für Rot erhöhen musst um den Rot-Anteil zu verringern (Je mehr Gamma, desto weniger Farbe).",
"wiz_cc_chooseid" : "Wähle einen Namen für dieses Profil.",
"wiz_cc_btn_switchpic" : "Testbild ändern",
"wiz_cc_backlight" : "Zusätzlich kannst du eine Hintergrundbeluchtung einstellen, um \"irritierende Farben\" bei fast schwarzem Bild zu vermeiden oder du den Wechsel zwischen Farbe und Aus als zu anstrengend empfindest. Zusätzlich kann bestimmt werden, ob diese farbig oder nur weiß sein soll. Wird automatisch deaktiviert im Zustand \"Aus\" sowie bei \"Farbe\" und \"Effekt\".",
"wiz_cc_testintro" : "Nun ist es an der Zeit für einen Testlauf.",
"wiz_cc_testintrok" : "Klicke auf einen Button, um eines der Testvideos abzuspielen.",
"wiz_cc_testintrowok" : "Unter folgendem Link findest du ein paar Testvideos zum herunterladen und abspielen:",
"wiz_cc_link" : "Klick mich",
"wiz_cc_morethanone" : "Du hast mehr als 1 Profil, bitte wähle das zu kalibrierende Profil",
"wiz_cc_btn_stop" : "Stoppe Video",
"wiz_cc_summary" : "Im folgenden eine Zusammenfassung deiner Einstellungen. Während du ein Video abspielst, kannst du hier weiter ausprobieren. Wenn du fertig bist, klicke auf speichern.",
"edt_dev_enum_subtract_minimum" : "Subtrahiere minimum",
"edt_dev_enum_sub_min_warm_adjust" : "Minimale Anpassung: warm",
"edt_dev_enum_white_off" : "Weiß ist aus",
"edt_dev_general_heading_title" : "Allgemeine Einstellungen",
"edt_dev_general_ledCount_title" : "Anzahl Hardware LEDs",
"edt_dev_general_colorOrder_title" : "RGB Byte Reihenfolge",
"edt_dev_general_rewriteTime_title" : "Aktualisierungszeit",
"edt_dev_spec_header_title" : "Spezifische Einstellungen",
"edt_dev_spec_baudrate_title" : "Baudrate",
"edt_dev_spec_spipath_title" : "SPI Pfad",
"edt_dev_spec_invert_title" : "Invertiere Signal",
"edt_dev_spec_multicastGroup_title" : "Multicast Gruppe",
"edt_dev_spec_numberOfLeds_title" : "Anzahl der LEDs",
"edt_dev_spec_port_title" : "Port",
"edt_dev_spec_orbIds_title" : "Orb ID(s)",
"edt_dev_spec_useOrbSmoothing_title" : "Nutze Orb Glättung",
"edt_dev_spec_targetIp_title" : "Ziel IP",
"edt_dev_spec_targetIpHost_title" : "Ziel IP/hostname",
"edt_dev_spec_outputPath_title" : "Ausgabepfad",
"edt_dev_spec_delayAfterConnect_title" : "Verzögerung nach Verbindung",
"edt_dev_spec_FCsetConfig_title" : "Wende fadecandy Konfiguration an",
"edt_dev_spec_FCmanualControl_title" : "Manuelle Steuerung der fadecandy LEDs",
"edt_dev_spec_FCledToOn_title" : "Fadecandy LEDs set to on",
"edt_dev_spec_interpolation_title" : "Interpolation",
"edt_dev_spec_dithering_title" : "Dithering",
"edt_dev_spec_gamma_title" : "Gamma",
"edt_dev_spec_whitepoint_title" : "Weißpunkt",
"edt_dev_spec_username_title" : "Benutzername",
"edt_dev_spec_lightid_title" : "Lampen ID(s)",
"edt_dev_spec_lightid_itemtitle" : "ID",
"edt_dev_spec_transistionTime_title" : "Übergangszeit",
"edt_dev_spec_switchOffOnBlack_title" : "Aus bei schwarz",
"edt_dev_spec_uid_title" : "UID",
"edt_dev_spec_intervall_title" : "Intervall",
"edt_dev_spec_latchtime_title" : "Sperrzeit",
"edt_dev_spec_maxPacket_title" : "Paketgröße",
"edt_dev_spec_serial_title" : "Seriennummer",
"edt_dev_spec_vid_title" : "VID",
"edt_dev_spec_pid_title" : "PID",
"edt_dev_spec_cid_title" : "CID",
"edt_dev_spec_LBap102Mode_title" : "LightBerry APA102 Modus",
"edt_dev_spec_universe_title" : "Universum",
"edt_dev_spec_whiteLedAlgor_title" : "Weiß Algorithmus",
"edt_dev_spec_useRgbwProtocol_title" : "Nutze RGBW Protokoll",
"edt_dev_spec_maximumLedCount_title" : "Maximale Anzahl LEDs",
"edt_dev_spec_gpioNumber_title" : "GPIO Nummer",
"edt_dev_spec_gpioMap_title" : "GPIO Zuweisung",
"edt_dev_spec_PBFiFo_title" : "Pi-Blaster FiFo",
"edt_dev_spec_gpioBcm_title" : "GPIO Pin",
"edt_dev_spec_ledIndex_title" : "LED index",
"edt_dev_spec_colorComponent_title" : "Farbkomponente",
"edt_conf_general_enable_title" : "Aktiviert",
"edt_conf_general_enable_expl" : "Wenn aktiviert, ist die Komponente aktiv.",
"edt_conf_general_priority_title" : "Priorität",
"edt_conf_general_priority_expl" : "Die Priorität dieser Komponente.",
"edt_conf_general_port_title" : "Port",
"edt_conf_general_port_expl" : "Der genutzte Port.",
"edt_conf_enum_color" : "Farbe",
"edt_conf_enum_effect" : "Effekt",
"edt_conf_enum_multicolor_mean" : "Mehrfarbig",
"edt_conf_enum_unicolor_mean" : "Einfarbig",
"edt_conf_enum_rgb" : "RGB",
"edt_conf_enum_bgr" : "BGR",
"edt_conf_enum_rbg" : "RBG",
"edt_conf_enum_brg" : "BRG",
"edt_conf_enum_gbr" : "GBR",
"edt_conf_enum_grb" : "GRB",
"edt_conf_enum_linear" : "Linear",
"edt_conf_enum_PAL" : "PAL",
"edt_conf_enum_NTSC" : "NTSC",
"edt_conf_enum_logsilent" : "Stille",
"edt_conf_enum_logwarn" : "Warnung",
"edt_conf_enum_logverbose" : "Ausführlich",
"edt_conf_enum_logdebug" : "Debug",
"edt_conf_enum_bbdefault" : "Standard",
"edt_conf_enum_bbclassic" : "Klassisch",
"edt_conf_enum_bbosd" : "OSD",
"edt_conf_gen_heading_title" : "Allgemeine Einstellungen",
"edt_conf_gen_name_title" : "Name der Konfiguration",
"edt_conf_gen_name_expl" : "Der Name wird verwendet, um Hyperion besser zu identifizieren. (Hilfreich bei mehreren Instanzen)",
"edt_conf_gen_showOptHelp_title" : "Zeige Erklärungen",
"edt_conf_gen_showOptHelp_expl" : "Zeige alle verfügbaren Options-Erklärungen. Empfohlen für Anfänger",
"edt_conf_color_heading_title" : "Farbkalibrierung",
"edt_conf_color_channelAdjustment_header_title" : "Anpassung Farbkanäle",
"edt_conf_color_channelAdjustment_header_itemtitle" : "Profil",
"edt_conf_color_channelAdjustment_header_expl" : "Passe die Farbkanäle deinen LEDs an",
"edt_conf_color_imageToLedMappingType_title" : "LED-Bereich Zuordnungstyp",
"edt_conf_color_imageToLedMappingType_expl" : "Sofern nicht \"Mehrfarbig\", wird dein LED Layout mit einer anderen Bildzuweisung überschrieben",
"edt_conf_color_id_title" : "ID",
"edt_conf_color_id_expl" : "Eine vom Benutzer frei angegebene ID.",
"edt_conf_color_leds_title" : "LED index",
"edt_conf_color_leds_expl" : "Zugewiesen zu allen (*) LEDs oder nur zu bestimmten LED Nummern (0-17).",
"edt_conf_color_black_title" : "Schwarz",
"edt_conf_color_black_expl" : "Kalibrierter Schwarzwert.",
"edt_conf_color_white_title" : "Weiß",
"edt_conf_color_white_expl" : "Kalibrierter Weißwert.",
"edt_conf_color_red_title" : "Rot",
"edt_conf_color_red_expl" : "Kalibrierter Rotwert.",
"edt_conf_color_green_title" : "Grün",
"edt_conf_color_green_expl" : "Kalibrierter Grünwert.",
"edt_conf_color_blue_title" : "Blau",
"edt_conf_color_blue_expl" : "Kalibrierter Blauwert.",
"edt_conf_color_cyan_title" : "Cyan",
"edt_conf_color_cyan_expl" : "Kalibrierter Cyanwert.",
"edt_conf_color_magenta_title" : "Magenta",
"edt_conf_color_magenta_expl" : "Kalibrierter Magentawert.",
"edt_conf_color_yellow_title" : "Gelb",
"edt_conf_color_yellow_expl" : "Kalibrierter Gelbwert.",
"edt_conf_color_gammaRed_title" : "Gamma rot",
"edt_conf_color_gammaRed_expl" : "Gamma von rot.",
"edt_conf_color_gammaGreen_title" : "Gamma grün",
"edt_conf_color_gammaGreen_expl" : "Gamma von grün.",
"edt_conf_color_gammaBlue_title" : "Gamma blau",
"edt_conf_color_gammaBlue_expl" : "Gamma von blau",
"edt_conf_color_backlightThreshold_title" : "Hintergrund - beleuchtung",
"edt_conf_color_backlightThreshold_expl" : "Eine Beleuchtung die dauerhaft aktiv ist. (Automatisch deaktiviert bei Effekten, Farben oder im Zustand \"Aus\")",
"edt_conf_color_backlightColored_title" : "Farbige Hintergrund - beleuchtung",
"edt_conf_color_backlightColored_expl" : "Die Hintergrundbeleuchtung kann mit oder ohne Farbanteile genutzt werden.",
"edt_conf_color_brightness_title" : "Maximale Helligkeit",
"edt_conf_color_brightness_expl" : "Zwischen 0.0 und 0.5 ist die Helligkeit linearisiert. Von 0.5 bis 1.0 wird cyan, magenta und gelb bis zu 2x heller und weiß bis zu 3x.",
"edt_conf_smooth_heading_title" : "Glättung",
"edt_conf_smooth_type_title" : "Art",
"edt_conf_smooth_type_expl" : "Algorithmus der Glättung.",
"edt_conf_smooth_time_ms_title" : "Zeit",
"edt_conf_smooth_time_ms_expl" : "Wie lange soll die Glättung Bilder sammeln?",
"edt_conf_smooth_updateFrequency_title" : "Aktualisierungsfrequenz",
"edt_conf_smooth_updateFrequency_expl" : "Die Geschwindigkeit der Datenausgabe an die LED Steuerung.",
"edt_conf_smooth_updateDelay_title" : "Aktualisierungsverzögerung",
"edt_conf_smooth_updateDelay_expl" : "Verzögere die Ausgabe, sollte dein ambient light schneller sein als dein TV.",
"edt_conf_smooth_continuousOutput_title" : "Fortlaufende Ausgabe",
"edt_conf_smooth_continuousOutput_expl" : "Aktualisiere die LEDs, auch wenn das Bild sich nicht geändert hat.",
"edt_conf_v4l2_heading_title" : "USB Aufnahme",
"edt_conf_v4l2_device_title" : "Gerät",
"edt_conf_v4l2_device_expl" : "Der Pfad zum USB Aufnahmegerät.",
"edt_conf_v4l2_input_title" : "Eingang",
"edt_conf_v4l2_input_expl" : "Der Eingang des Pfades.",
"edt_conf_v4l2_standard_title" : "Videoformat",
"edt_conf_v4l2_standard_expl" : "Wähle das passende Videoformat deiner Region.",
"edt_conf_v4l2_width_title" : "Breite",
"edt_conf_v4l2_width_expl" : "Die Breite des Bildes. (-1 = Automatische Breitenbestimmung)",
"edt_conf_v4l2_height_title" : "Höhe",
"edt_conf_v4l2_height_expl" : "Die Höhes des Bildes. (-1 = Automatische Höhenbestimmung)",
"edt_conf_v4l2_frameDecimation_title" : "Bildverkleinerung",
"edt_conf_v4l2_frameDecimation_expl" : "Der Faktor der Bildverkleinerung",
"edt_conf_v4l2_sizeDecimation_title" : "Größenänderung",
"edt_conf_v4l2_sizeDecimation_expl" : "Der Faktor der Größenänderung",
"edt_conf_v4l2_mode_title" : "Modus",
"edt_conf_v4l2_mode_expl" : "Modus der USB Aufnahme",
"edt_conf_v4l2_useKodiChecker_title" : "Nutze Kodi Überwachung",
"edt_conf_v4l2_useKodiChecker_expl" : "Starte/Stoppe Aufnahme mithilfe der Kodi Überwachung.",
"edt_conf_v4l2_cropLeft_title" : "Entferne links",
"edt_conf_v4l2_cropLeft_expl" : "Anzahl der Pixel auf der linken Seite die vom Bild entfernt werden.",
"edt_conf_v4l2_cropRight_title" : "Entferne rechts",
"edt_conf_v4l2_cropRight_expl" : "Anzahl der Pixel auf der rechten Seite die vom Bild entfernt werden.",
"edt_conf_v4l2_cropTop_title" : "Entferne oben",
"edt_conf_v4l2_cropTop_expl" : "Anzahl der Pixel auf der oberen Seite die vom Bild entfernt werden.",
"edt_conf_v4l2_cropBottom_title" : "Entferne unten",
"edt_conf_v4l2_cropBottom_expl" : "Anzahl der Pixel auf der unteren Seite die vom Bild entfernt werden.",
"edt_conf_v4l2_redSignalThreshold_title" : "Rote Signalschwelle",
"edt_conf_v4l2_redSignalThreshold_expl" : "Verdunkelt rote Werte. (Wird als schwarz interpretiert)",
"edt_conf_v4l2_greenSignalThreshold_title" : "Grüne Signalschwelle",
"edt_conf_v4l2_greenSignalThreshold_expl" : "Verdunkelt grüne Werte. (Wird als schwarz interpretiert)",
"edt_conf_v4l2_blueSignalThreshold_title" : "Blaue Signalschwelle",
"edt_conf_v4l2_blueSignalThreshold_expl" : "Verdunkelt blaue Werte. (Wird als schwarz interpretiert))",
"edt_conf_fg_heading_title" : "Plattform Aufnahme",
"edt_conf_fg_type_title" : "Typ",
"edt_conf_fg_type_expl" : "Art der Plattform Aufnahme, standard ist 'auto'",
"edt_conf_fg_frequency_Hz_title" : "Aufnahmefrequenz",
"edt_conf_fg_frequency_Hz_expl" : "Wie schnell neue Bilder aufgenommen werden.",
"edt_conf_fg_horizontalPixelDecimation_title" : "Horizontale Pixelreduzierung",
"edt_conf_fg_horizontalPixelDecimation_expl" : "Horizontale Pixelreduzierung (Faktor)",
"edt_conf_fg_useXGetImage_title" : "Nutze XGetImage",
"edt_conf_fg_useXGetImage_expl" : "XGetImage für aktuelle X11 desktops",
"edt_conf_fg_verticalPixelDecimation_title" : "Vertikale Pixelreduzierung",
"edt_conf_fg_verticalPixelDecimation_expl" : "Vertikale Pixelreduzierung (Faktor)",
"edt_conf_fg_device_title" : "Device",
"edt_conf_fg_display_title" : "Display",
"edt_conf_fg_display_expl" : "Gebe an von welchem Desktop aufgenommen werden soll. (Multi Monitor Setup)",
"edt_conf_bb_heading_title" : "Schwarze Balken Erkennung",
"edt_conf_bb_threshold_title" : "Schwelle",
"edt_conf_bb_threshold_expl" : "Wenn die Erkennung nicht funktioniert, erhöhe die Schwelle um auf 'graues' schwarz zu reagieren.",
"edt_conf_bb_unknownFrameCnt_title" : "unknownFrameCnt",
"edt_conf_bb_borderFrameCnt_title" : "borderFrameCnt",
"edt_conf_bb_maxInconsistentCnt_title" : "maxInconsistentCn",
"edt_conf_bb_blurRemoveCnt_title" : "blurRemoveCnt",
"edt_conf_bb_mode_title" : "Modus",
"edt_conf_bb_mode_expl" : "Algorithmus zur Auswertung. (siehe Wiki)",
"edt_conf_kodic_heading_title" : "Kodi Überwachung",
"edt_conf_kodic_kodiAddress_title" : "Kodi IP Adresse",
"edt_conf_kodic_kodiAddress_expl" : "Die IP Adresse von Kodi.",
"edt_conf_kodic_kodiTcpPort_title" : "Kodi TCP Port",
"edt_conf_kodic_kodiTcpPort_expl" : "Der Kodi TCP Port. Nutze nicht den Webserver Port!",
"edt_conf_kodic_grabVideo_title" : "Video",
"edt_conf_kodic_grabVideo_expl" : "Wenn aktiviert, ist die Aufnahme aktiv während ein Video abgespielt werden.",
"edt_conf_kodic_grabPictures_title" : "Bilder",
"edt_conf_kodic_grabPictures_expl" : "Wenn aktiviert, ist die Aufnahme aktiv während Bilder angezeigt werden.",
"edt_conf_kodic_grabAudio_title" : "Audio",
"edt_conf_kodic_grabAudio_expl" : "Wenn aktiviert, ist die Aufnahme aktiv während Musik abgespielt wird.",
"edt_conf_kodic_grabMenu_title" : "Menü",
"edt_conf_kodic_grabMenu_expl" : "Wenn aktiviert, ist die Aufnahme aktiv während du dich im Kodi Menü oder Nutzerauswahl befindest.",
"edt_conf_kodic_grabPause_title" : "Pause",
"edt_conf_kodic_grabPause_expl" : "Wenn aktiviert, ist die Aufnahme aktiv während Kodi pausiert (Video, Musik, Diashow).",
"edt_conf_kodic_grabScreensaver_title" : "Bildschirmschoner",
"edt_conf_kodic_grabScreensaver_expl" : "Wenn aktiviert, ist die Aufnahme aktiv während Kodi pausiert (Video, Musik, Diashow).",
"edt_conf_kodic_enable3DDetection_title" : "Erkenne 3D",
"edt_conf_kodic_enable3DDetection_expl" : "Wenn aktiviert, erkenne und wende den passenden 3D Modus an. (kein MVC und nicht für USB Aufnahme)",
"edt_conf_fge_heading_title" : "Start Effekt/Farbe",
"edt_conf_fge_type_title" : "Typ",
"edt_conf_fge_type_expl" : "Wähle zwischen einem Effekt oder einer Farbe.",
"edt_conf_fge_color_title" : "Farbe",
"edt_conf_fge_color_expl" : "Sofern der Typ \"Farbe\" ist, stelle hier eine Farbe deiner Wahl sein.",
"edt_conf_fge_effect_title" : "Effekt",
"edt_conf_fge_effect_expl" : "Sofern der Typ \"Effekt\" ist, wähle hier einen Effekt deiner Wahl. (Gilt auch für selbst erstellte)",
"edt_conf_fge_duration_ms_title" : "Dauer",
"edt_conf_fge_duration_ms_expl" : "Dauer des Effekts/Farbe beim Hyperion Start.",
"edt_conf_bge_heading_title" : "Hintergrund Effekt/Farbe",
"edt_conf_fw_heading_title" : "Weiterleitung",
"edt_conf_fw_json_title" : "Liste von Json zielen",
"edt_conf_fw_json_expl" : "Ein Json Ziel pro Zeile. Bestehend aus IP:PORT (Beispiel: 127.0.0.1:19446)",
"edt_conf_fw_json_itemtitle" : "Json Ziel",
"edt_conf_fw_proto_title" : "Liste von Proto zielen",
"edt_conf_fw_proto_expl" : "Ein Proto Ziel pro Zeile. Bestehend aus IP:PORT (Beispiel: 127.0.0.1:19447)",
"edt_conf_fw_proto_itemtitle" : "Proto Ziel",
"edt_conf_js_heading_title" : "JSON Server",
"edt_conf_ps_heading_title" : "PROTO Server",
"edt_conf_bobls_heading_title" : "Boblight Server",
"edt_conf_udpl_heading_title" : "UDP Listener",
"edt_conf_udpl_address_title" : "Adresse",
"edt_conf_udpl_address_expl" : "Die Adresse auf der UDP Pakete akzeptiert werden.",
"edt_conf_udpl_timeout_title" : "Zeitüberschreitung",
"edt_conf_udpl_timeout_expl" : "Wenn für die angegeben Zeit keine UDP Pakete empfangen werden, wird die Komponente (vorübergehend) deaktiviert",
"edt_conf_udpl_shared_title" : "Gemeinsam genutzt",
"edt_conf_udpl_shared_expl" : "Wird gemeinsam über alle Hyperion Instanzen genutzt.",
"edt_conf_webc_heading_title" : "Web Konfiguration",
"edt_conf_webc_docroot_title" : "Verzeichnis",
"edt_conf_webc_docroot_expl" : "Lokaler Pfad zum WebUI Wurzelverzeichnis (Nur für WebUI Entwickler)",
"edt_conf_effp_heading_title" : "Effekt Pfade",
"edt_conf_effp_paths_title" : "Effekt Pfad(e)",
"edt_conf_effp_paths_itemtitle" : "Pfad",
"edt_conf_effp_disable_title" : "Deaktivierte Effekte",
"edt_conf_effp_disable_itemtitle" : "Effekt",
"edt_conf_log_heading_title" : "Protokoll",
"edt_conf_log_level_title" : "Protokollstufe",
"edt_conf_log_level_expl" : "Abhängig der Stufe sind weniger oder mehr Meldungen sichtbar.",
"edt_eff_candle_header_title" : "Kerze",
"edt_eff_police_header_title" : "Polizei",
"edt_eff_fade_header_title" : "Farbübergang",
"edt_eff_rainbowmood_header_title" : "Regenbogen",
"edt_eff_knightrider_header_title" : "Knight Rider",
"edt_eff_lightclock_header_title" : "Uhr 1",
"edt_eff_clock_header_title" : "Uhr 2",
"edt_eff_pacman_header_title" : "Pac-Man",
"edt_eff_moodblobs_header_title" : "Stimmungskugeln",
"edt_eff_rainbowswirl_header_title" : "Regenbogenwirbel",
"edt_eff_random_header_title" : "Zufällig",
"edt_eff_runningdots_header_title" : "Rennende Punkte",
"edt_eff_systemshutdown_header_title" : "Herunterfahren",
"edt_eff_snake_header_title" : "Schlange",
"edt_eff_sparks_header_title" : "Funken",
"edt_eff_storbe_header_title" : "Stroboskop",
"edt_eff_traces_header_title" : "Farbspuren",
"edt_eff_x-mas_header_title" : "Weihnachten",
"edt_eff_trails_header_title" : "Spuren",
"edt_eff_enum_all" : "Alle",
"edt_eff_enum_all-together" : "Alle zusammen",
"edt_eff_enum_list" : "LED Liste",
"edt_eff_count_title" : "Anzahl",
"edt_eff_color_title" : "Farbe",
"edt_eff_colorrandom_title" : "Zufällige Farbe",
"edt_eff_colorone_title" : "Farbe eins",
"edt_eff_colortwo_title" : "Farbe zwei",
"edt_eff_colorcount_title" : "Farblänge",
"edt_eff_rotationtime_title" : "Rotationszeit",
"edt_eff_sleeptime_title" : "Schlafzeit",
"edt_eff_reversedirection_title" : "Richtung umkehren",
"edt_eff_fadetime_title" : "Übergangszeit",
"edt_eff_colorstart_title" : "Farbe Start",
"edt_eff_colorend_title" : "Farbe Ende",
"edt_eff_colorshift_title" : "Farbverschiebung",
"edt_eff_whichleds_title" : "Welche LEDs",
"edt_eff_ledlist_title" : "LED Liste",
"edt_eff_speed_title" : "Geschwindigkeit",
"edt_eff_fadefactor_title" : "Verblass Faktor",
"edt_eff_showseconds_title" : "Zeige Sekunden",
"edt_eff_blobcount_title" : "Kugelanzahl",
"edt_eff_huechange_title" : "Farbänderung",
"edt_eff_basecolorchange_title" : "Basisfarben verändern",
"edt_eff_basecolorchangerate_title" : "BF Geschwindigkeit",
"edt_eff_basecolorrangeleft_title" : "BF Bereich links",
"edt_eff_basecolorrangeright_title" : "BF Bereich rechts",
"edt_eff_brightness_title" : "Helligkeit",
"edt_eff_centerx_title" : "Mittelpunkt X-Achse",
"edt_eff_centery_title" : "Mittelpunkt Y-Achse",
"edt_eff_saturation_title" : "Sättigung",
"edt_eff_colorevel_title" : "Farbstufe",
"edt_eff_whitelevel_title" : "Weißstufe",
"edt_eff_alarmcolor_title" : "Alarm Farbe",
"edt_eff_postcolor_title" : "Startfarbe",
"edt_eff_enableshutdown_title" : "Echtes herunterfahren",
"edt_eff_length_title" : "Länge",
"edt_eff_frequency_title" : "Frequenz",
"edt_eff_min_len_title" : "Minimale Länge",
"edt_eff_max_len_title" : "Maximale Länge",
"edt_eff_height_title" : "Höhe",
"edt_eff_offset_title" : "Verschiebung",
"edt_eff_colorHour_title" : "Farbe Stunde",
"edt_eff_colorMinute_title" : "Farbe Minute",
"edt_eff_colorSecond_title" : "Farbe Sekunde",
"edt_eff_hourMargin_title" : "Länge Stunde",
"edt_eff_minuteMargin_title" : "Länge Minute",
"edt_eff_secondMargin_title" : "Länge Sekunde",
"edt_eff_margin_title" : "Abstand",
"edt_eff_colorMarker_title" : "Farbe Markierung",
"edt_append_ns" : "ns",
"edt_append_ms" : "ms",
"edt_append_s" : "s",
"edt_append_hz" : "Hz",
"edt_append_pixel" : "Pixel",
"edt_append_percent" : "%",
"edt_append_degree" : "°",
"edt_append_sdegree" : "s/grad",
"edt_append_leds" : "LEDs",
"edt_msg_error_notset" : "Attribut muss gesetzt sein",
"edt_msg_error_notempty" : "Eingabe benötigt",
"edt_msg_error_enum" : "Die Eingabe muss einem der aufgeführten Werte entsprechen",
"edt_msg_error_anyOf" : "Die Eingabe muss gegen mindestens eines der gegebenen Schemata validiert werden können",
"edt_msg_error_oneOf" : "Die Eingabe muss gegen genau eines der gegebenen Schemata validiert werden können. Momentan können $1 Schemata validiert werden",
"edt_msg_error_not" : "Die Eingabe darf nicht gegen das gegebene Schema validiert werden können",
"edt_msg_error_type_union" : "Die Eingabe muss einem der gegebenen Typen entsprechen",
"edt_msg_error_type" : "Die Eingabe muss vom Typ $1 sein",
"edt_msg_error_disallow_union" : "Die Eingabe darf nicht einem der gegebenen Werte entsprechen",
"edt_msg_error_disallow" : "Die Eingabe muss vom Typ $1 sein",
"edt_msg_error_multipleOf" : "Die Eingabe muss ein Vielfaches von $1 sein",
"edt_msg_error_maximum_excl" : "Der Wert muss kleiner als $1 sein",
"edt_msg_error_maximum_incl" : "Der Wert darf höchstens $1 sein",
"edt_msg_error_minimum_excl" : "Der Wert muss größer als $1 sein",
"edt_msg_error_minimum_incl" : "Der Wert muss mindestens $1 sein",
"edt_msg_error_maxLength" : "Die Eingabe darf höchstens $1 Zeichen lang sein",
"edt_msg_error_minLength" : "Die Eingabe muss mindestens $ Zeichen lang sein",
"edt_msg_error_pattern" : "Die Eingabe muss dem gegebenen Muster entsprechen",
"edt_msg_error_additionalItems" : "In diesem Feld sind keine weiteren Elemente erlaubt",
"edt_msg_error_maxItems" : "Das Feld darf höchstens $1 Element(e) beinhalten",
"edt_msg_error_minItems" : "Das Feld muss mindestens $1 Element(e) beinhalten",
"edt_msg_error_uniqueItems" : "Das Feld darf nur einzigartige Elemente beinhalten",
"edt_msg_error_maxProperties" : "Das Objekt darf höchstens $1 Attribute habe",
"edt_msg_error_minProperties" : "Das Objekt muss mindestens $1 Attribute haben",
"edt_msg_error_required" : "Das Objekt beinhaltet nicht das benötigte Attribut '$1'",
"edt_msg_error_additional_properties" : "Es sind keine weiteren Attribute erlaubt. $1 muss entfernt werden",
"edt_msg_error_dependency" : "Das Attribut $1 ist zwingend erforderlich",
"edt_msg_button_delete_all" : "Alle",
"edt_msg_button_delete_all_title" : "Alle löschen",
"edt_msg_button_delete_last" : "Letzes $1-Element",
"edt_msg_button_delete_last_title" : "Letzes $1-Element löschen",
"edt_msg_button_add_row_title" : "$1 Hinzufügen",
"edt_msg_button_move_down_title" : "Nach unten verschieben",
"edt_msg_button_move_up_title" : "Nach oben verschieben",
"edt_msg_button_delete_row_title" : "$1 Löschen",
"edt_msg_button_delete_row_title_short" : "Löschen",
"edt_msg_button_collapse" : "Einklappen",
"edt_msg_button_expand" : "Ausklappen"
}

View File

@ -0,0 +1,676 @@
{
"@metadata": {
"authors": [
"brindosch"
],
"project" : "Hyperion WebUI",
"locale": "en",
"last-updated": "2016-11-30",
"message-documentation": "qqq.json"
},
"general_webui_title" : "Hyperion - Web Configuration",
"general_country_de" : "Germany",
"general_country_us" : "United States",
"general_country_uk" : "United Kingdom",
"general_country_fr" : "France",
"general_country_es" : "Spain",
"general_country_it" : "Italy",
"general_country_nl" : "Netherlands",
"general_speech_de" : "German",
"general_speech_en" : "English",
"general_speech_es" : "Spanish",
"general_access_default" : "Default",
"general_access_advanced" : "Advanced",
"general_access_expert" : "Expert",
"general_comp_SMOOTHING" : "Smoothing",
"general_comp_BLACKBORDER" : "Blackbar Detection",
"general_comp_KODICHECKER" : "Kodi Watch",
"general_comp_FORWARDER" : "JSON/PROTO Forward",
"general_comp_UDPLISTENER" : "UDP Listener",
"general_comp_BOBLIGHTSERVER" : "Boblight Server",
"general_comp_GRABBER" : "Platform Capture",
"general_comp_V4L" : "USB Capture",
"general_col_red" : "red",
"general_col_green" : "green",
"general_col_blue" : "blue",
"general_button_savesettings" : "Save settings",
"general_btn_ok" : "OK",
"general_btn_cancel" : "Cancel",
"general_btn_continue" : "Continue",
"general_btn_save" : "Save",
"general_btn_saverestart" : "Save and restart",
"general_btn_saveandreload" : "Save and reload",
"general_btn_restarthyperion" : "Restart Hyperion",
"general_btn_off" : "Off",
"general_btn_on" : "On",
"general_btn_next" : "Next",
"general_btn_back" : "Back",
"dashboard_label_intro" : "The dashboard give you a quick overview about the status of Hyperion and show you the latest news of the Hyperion Blog.",
"dashboard_infobox_label_title" : "Information",
"dashboard_infobox_label_currenthyp" : "Your Hyperion version:",
"dashboard_infobox_label_latesthyp" : "Latest Hyperion version:",
"dashboard_infobox_label_device" : "System:",
"dashboard_infobox_message_updatewarning" : "A newer version of Hyperion is available! (V$1)",
"dashboard_infobox_message_updatesuccess" : "You run the latest version of Hyperion.",
"dashboard_componentbox_label_title" : "Components status",
"dashboard_componentbox_label_comp" : "Component",
"dashboard_componentbox_label_status" : "Status",
"dashboard_newsbox_label_title" : "Latest Blog posts",
"dashboard_alert_message_confedit" : "Your Hyperion configuration has been modified. To apply it, restart Hyperion.",
"main_menu_dashboard_token" : "Dashboard",
"main_menu_configuration_token" : "Configuration",
"main_menu_general_conf_token" : "General",
"main_menu_leds_conf_token" : "LED Hardware",
"main_menu_grabber_conf_token" : "Capturing Hardware",
"main_menu_effect_conf_token" : "Effects",
"main_menu_colors_conf_token" : "Image Processing",
"main_menu_kodiwatch_token" : "Kodi Watch",
"main_menu_network_conf_token" : "Network Services",
"main_menu_remotecontrol_token" : "Remote Control",
"main_menu_effectsconfigurator_token" : "Effects Configurator",
"main_menu_support_token" : "Support",
"main_menu_update_token" : "Update",
"main_menu_system_token" : "System",
"main_menu_input_selection_token" : "Input Selection",
"main_menu_logging_token" : "Log",
"main_menu_webconfig_token" : "Web configuration",
"main_menu_about_token" : "About Hyperion",
"main_ledsim_title" : "LED Visualization",
"main_ledsim_text" : "Live visualization of led colors and optional the current video stream of your capture device.",
"main_ledsim_btn_toggleleds" : "Show LEDs",
"main_ledsim_btn_togglelednumber" : "LED numbers",
"main_ledsim_btn_togglelivevideo" : "Live video",
"conf_general_label_title" : "General settings",
"conf_general_intro" : "Basic settings around Hyperion and WebUI that don't fit into another category.",
"conf_general_impexp_title" : "Import/Export Configuration",
"conf_general_impexp_l1" : "Import a configuration by selecting a configuration file below and click on \"Import\".",
"conf_general_impexp_l2" : "Export a configuration by clicking on \"Export\". Your browser starts a download.",
"conf_general_impexp_impbtn" : "Import",
"conf_general_impexp_expbtn" : "Export",
"conf_helptable_option" : "Option",
"conf_helptable_expl" : "Explanation",
"conf_effect_path_intro" : "Define more effect paths if necessary.",
"conf_effect_fgeff_intro" : "Define a booteffect or color, which is shown during Hyperion startup for the defined duration.",
"conf_effect_bgeff_intro" : "Define a background effect, which us shown during \"idle\". (also temporarily via Kodi Watch)",
"conf_leds_device_intro" : "Hyperion supports a lot of controllers to transmit data to your target device. Select a LED controller out of the sorted list and configure it. We have chosen the best default settings for each device.",
"conf_leds_layout_intro" : "You need also a led layout, which reflects your led positions. The classic layout is the usual used tv frame, but we also support led matrix (led walls) creation. The view on this layout is ALWAYS of the FRONT of your TV.",
"conf_leds_nav_label_ledcontroller" : "LED Controller",
"conf_leds_nav_label_ledlayout" : "LED Layout",
"conf_leds_contr_label_contrtype" : "Controller type:",
"conf_leds_optgroup_RPiSPI" : "RPi SPI",
"conf_leds_optgroup_RPiPWM" : "RPi PWM",
"conf_leds_optgroup_RPiGPIO" : "RPi GPIO",
"conf_leds_optgroup_network" : "Network",
"conf_leds_optgroup_usb" : "USB",
"conf_leds_optgroup_debug" : "Debug",
"conf_leds_layout_btn_checklist" : "Show checklist",
"conf_leds_leyout_checkp1" : "The black led is your first led, the first led is the point where you input your data signal.",
"conf_leds_leyout_checkp2" : "The layout is always the front view of your TV, never the back view.",
"conf_leds_leyout_checkp3" : "Make sure the direction is right. The grey leds indicate led number 2 and 3 to visualize the data direction.",
"conf_leds_leyout_checkp4" : "Case Gap: To create a gap, ignore it first when you define Top/Bottom/Left/Right and set afterwards your gap length to remove a amount of leds. Modify the gap position until it matches.",
"conf_leds_layout_frame" : "Classic Layout (LED Frame)",
"conf_leds_layout_matrix" : "Matrix Layout (LED Wall)",
"conf_leds_layout_generatedconf" : "Generated/Current LED Configuration",
"conf_leds_layout_button_savelay" : "Save Layout",
"conf_leds_layout_button_updsim" : "Update Preview",
"conf_leds_layout_peview" : "LED Layout Preview",
"conf_leds_layout_advanced" : "Advanced Settings",
"conf_leds_layout_preview_originCL" : "Created from: Classic Layout (LED Frame)",
"conf_leds_layout_preview_originTEXT" : "Created from: Textfield",
"conf_leds_layout_preview_originMA" : "Created from: Matrix Layout(LED wall)",
"conf_leds_layout_preview_totalleds" : "Totel LEDs: $1",
"conf_leds_layout_preview_l1" : "This is your first led (input position)",
"conf_leds_layout_preview_l2" : "This visualizes the data direction (second/third led)",
"conf_leds_layout_cl_top" : "Top",
"conf_leds_layout_cl_bottom" : "Bottom",
"conf_leds_layout_cl_left" : "Left",
"conf_leds_layout_cl_right" : "Right",
"conf_leds_layout_cl_gaglength" : "Gap length",
"conf_leds_layout_cl_gappos" : "gap position",
"conf_leds_layout_cl_inppos" : "Input position",
"conf_leds_layout_cl_reversdir" : "Reverse direction",
"conf_leds_layout_cl_hleddepth" : "Horizontal LED depth",
"conf_leds_layout_cl_vleddepth" : "Vertical LED depth",
"conf_leds_layout_cl_generate" : "Generate LED configuration",
"conf_leds_layout_cl_edgegap" : "Edge Gap",
"conf_leds_layout_cl_cornergap" : "Corner Gap",
"conf_leds_layout_cl_overlap" : "Overlap",
"conf_leds_layout_ma_horiz" : "Horizontal",
"conf_leds_layout_ma_vert" : "Vertical",
"conf_leds_layout_ma_cabling" : "Cabling",
"conf_leds_layout_ma_optsnake" : "Snake",
"conf_leds_layout_ma_optparallel" : "Parallel",
"conf_leds_layout_ma_order" : "Order",
"conf_leds_layout_ma_opthoriz" : "Horizontal",
"conf_leds_layout_ma_optvert" : "Vertical",
"conf_leds_layout_ma_position" : "Input",
"conf_leds_layout_ma_opttopleft" : "Top Left",
"conf_leds_layout_ma_opttopright" : "Top right",
"conf_leds_layout_ma_optbottomleft" : "Bottom left",
"conf_leds_layout_ma_optbottomright" : "Bottom right",
"conf_leds_layout_textf1" : "This textfield shows by default your current loaded layout and will be overwritten if you generate a new one with the options below. Optional you could perform further edits.",
"conf_grabber_fg_intro" : "Platforum capture is your local system capture as input source, Hyperion is installed on.",
"conf_grabber_v4l_intro" : "USB capture is a (capture)device connected via USB which is used to input source pictures for processing.",
"conf_colors_color_intro" : "Create one or more calibration profiles, adjust each color, brightness, linearization and more.",
"conf_colors_smoothing_intro" : "Smoothing flattens color/brightness changes to reduce annoying distraction.",
"conf_colors_blackborder_intro" : "Skip black bars wherever they are. Each mode use another detection algorithm which is tuned for special situations. Higher the threshold if it doesn't work for you.",
"conf_network_json_intro" : "The JSON-RPC-Port of this Hyperion instance, used for remote control.",
"conf_network_proto_intro" : "The PROTO-Port of this Hyperion instance, used for picture streams (HyperionScreenCap, Kodi Adddon, ...)",
"conf_network_bobl_intro" : "Receiver for Boblight",
"conf_network_udpl_intro" : "Receiver for UDP",
"conf_network_forw_intro" : "Forward all input to a second Hyperion instance which could be driven with another led controller",
"conf_kodi_label_title" : "Kodi Watch",
"conf_kodi_intro" : "The Kodi Watcher enables you to enable and disable the screencapture depending on Kodi state. This is not limited to the same machine, you could observe also a Kodi on any other device at your network.",
"conf_logging_label_intro" : "Area to check log messages, depending on loglevel setting you see more or less information.",
"conf_logging_btn_pbupload" : "Create report for support request",
"conf_logging_btn_autoscroll" : "Auto scrolling",
"conf_logging_nomessage" : "No log messages available.",
"conf_logging_uploading" : "Prepare data...",
"conf_logging_yourlink" : "Link to your report",
"conf_logging_uplfailed" : "Upload failed! Please check your internet connection!",
"conf_webconfig_label_intro" : "Webconfiguration settings. Edit wisely.",
"remote_losthint" : "Note: All changes are lost after a restart.",
"remote_color_label" : "Colors/Effects",
"remote_color_intro" : "Set an effect or color. Also your self created effects are listed (if available). $1",
"remote_color_button_reset" : "Reset Color/Effect",
"remote_color_label_color" : "Color:",
"remote_effects_label_effects" : "Effect:",
"remote_adjustment_label" : "Color adjustment",
"remote_adjustment_intro" : "Modifiy color/brightness/linearization during runtime. $1",
"remote_input_label" : "Source Selection",
"remote_input_intro" : "Hyperion uses a priority system to select a source. Everything you set has a priority (Effect/Color/Platform capture/USB capture and network sources). By default, Hyperion select sources depending on priority (lowest number reflects the current active source). Now you have the opportunity to select sources on your own. $1",
"remote_input_label_autoselect" : "Auto Selection",
"remote_input_setsource_btn" : "Select Input",
"remote_input_sourceactiv_btn" : "Input active",
"remote_input_origin" : "Origin",
"remote_input_owner" : "Type",
"remote_input_priority" : "Priority",
"remote_input_status" : "Status/Action",
"remote_input_duration" : "Duration:",
"remote_input_ip" : "IP:",
"remote_components_label" : "Components control",
"remote_components_intro" : "Enable and disable components of Hyperion during runtime. $1",
"remote_optgroup_usreffets" : "User Effects",
"remote_optgroup_syseffets" : "Provided Effects",
"remote_maptype_label" : "Mapping type",
"remote_maptype_intro" : "Change the mapping type during runtime. $1",
"remote_maptype_label_multicolor_mean" : "Multicolor",
"remote_maptype_label_unicolor_mean" : "Unicolor",
"effectsconfigurator_label_intro" : "Create out of the base effects new effects that are tuned to your liking. Depending on Effect there are options like color, speed, direction and more available.",
"effectsconfigurator_label_chooseeff" : "Choose Base-Effect:",
"effectsconfigurator_button_saveeffect" : "Save Effect",
"effectsconfigurator_label_effectname" : "Effect name",
"effectsconfigurator_button_starttest" : "Start test",
"effectsconfigurator_button_stoptest" : "Stop test",
"effectsconfigurator_button_conttest" : "Continuous test",
"effectsconfigurator_label_deleffect" : "Delete Effect:",
"effectsconfigurator_button_deleffect" : "Delete Effect",
"support_label_title" : "Support Hyperion",
"support_label_intro" : "Hyperion is a free non-profit software. A small team is working on it and this is why we need your steady support.",
"support_label_spreadtheword" : "Spread the word",
"support_label_fbtext" : "Share our Hyperion Facebook page and get a notice when new updates are released",
"support_label_twtext" : "Share and follow on Twitter, be always up to date with latest post about the Hyperion development",
"support_label_ggtext" : "Circle us on Google +!",
"support_label_yttext" : "Bored from pictures? Checkout our Youtube channel!",
"support_label_donate" : "Donate or use our affiliate links",
"support_label_affinstr1" : "Click on the appropriate link of your country",
"support_label_affinstr2" : "Everything you buy (doesn't matter what) we get a small fee based on your turnover",
"support_label_affinstr3" : "You ALWAYS pay the same price, there is absolutely no difference. Try it out!",
"support_label_btctext" : "Address:",
"support_label_donationpp" : "Donation:",
"support_label_webrestitle" : "Information and help ressources",
"support_label_webpagetitle" : "Webpage",
"support_label_webpagetext" : "Home of Hyperion",
"support_label_wikititle" : "Wiki",
"support_label_wikitext" : "The A to Z source for almost everything Hyperion related",
"support_label_forumtitle" : "Forum",
"support_label_forumtext" : "Showcases, discussions, help and more",
"support_label_ghtext" : "Visit us on Github",
"update_label_intro" : "Overview about all available Hyperion versions. On top you could update or downgrade your version of Hyperion whenever you want. Sorted from newest to oldest",
"update_label_description" : "Description:",
"update_button_install" : "Install",
"update_button_changelog" : "Full changelog",
"update_label_type" : "Type:",
"update_versreminder" : "Your version: $1",
"about_version" : "Version",
"about_build" : "Build",
"about_builddate" : "Build date",
"about_translations" : "Translations",
"about_resources" : "$1 libraries",
"about_contribute" : "Add more languages to Hyperion!",
"about_credits" : "Credits to all these developers!",
"info_conlost_label_title" : "Lost connection to Hyperion service!",
"info_conlost_label_reason" : "Possible reasons:",
"info_conlost_label_reason1" : "- Bad WLAN connection",
"info_conlost_label_reason2" : "- You perform an update",
"info_conlost_label_reason3" : "- Hyperion isn't running",
"info_conlost_label_autorecon" : "We reconnect again after Hyperion is available.",
"info_conlost_label_autorefresh" : "This page will be automatically refreshed.",
"info_conlost_label_reload" : "If not, click me or reload the page",
"info_restart_title" : "Restarts currently...",
"info_restart_rightback" : "Hyperion will be right back immediately!",
"info_restart_contus" : "If you still hang around here after 20 seconds and you have no clue why please open a new topic at our support forum...",
"info_restart_contusa" : "...with your last steps. Thank you!",
"infoDialog_general_success_title" : "Success",
"infoDialog_general_error_title" : "Error",
"infoDialog_general_warning_title" : "Warning",
"infoDialog_checklist_title" : "Checklist!",
"InfoDialog_leds_validfail_title" : "JSON Validation failed!",
"infoDialog_effconf_deleted_text" : "The effect \"$1\" has been deleted successfully!",
"infoDialog_effconf_created_text" : "The effect \"$1\" has been created successfully!",
"InfoDialog_lang_title" : "Language setting",
"InfoDialog_lang_text" : "If you don't like the result of the automatic language detection you could overwrite it here.",
"InfoDialog_access_title" : "Settings level",
"InfoDialog_access_text" : "Depending on settings level you could adjust more options or get access to more features. Recommended is the \"Default\" level.",
"InfoDialog_nowrite_title" : "write permission error!",
"InfoDialog_nowrite_text" : "Hyperion can't write to your current loaded configuration file. Please repair the file permissions to proceed.",
"InfoDialog_nowrite_foottext" : "The WebUI will be unlocked automatically after you solved the problem!",
"infoDialog_wizrgb_text" : "Your RGB Byte Order is already well adjusted.",
"infoDialog_writeconf_error_text" : "Saving your configuration failed.",
"infoDialog_import_jsonerror_text" : "The selected configuration file \"$1\" is no .json file or it's corrupted. Error message: ($2)",
"infoDialog_import_hyperror_text" : "The selected configuration file \"$1\" can't be imported. It's not compatible with Hyperion 2.0 and higher!",
"infoDialog_import_reverror_text" : "The revision of your configuration file \"$1\" doesnt match the current Hyperion version you run (File: $2, Hyperion: $3). You could just import matching configurations!",
"infoDialog_import_comperror_text" : "Sad! Your browser doesn't support a import. Please try again with another browser.",
"infoDialog_import_confirm_title" : "Confirm import",
"infoDialog_import_confirm_text" : "Are you sure to import \"$1\"? This process can't be reverted!",
"wiz_rgb_title" : "RGB Byte Order Wizard",
"wiz_rgb_intro1" : "This wizard will guide you through the finding process of the correct color order for your leds. Click on continue to begin.",
"wiz_rgb_intro2" : "When do you need this wizard? Example: You set the color red, but you get green or blue. You could also use it for first configuration.",
"wiz_rgb_expl" : "The color dot switches every x seconds the color (red, green), at the same time your leds switch the color too. Answer the questions at the bottom to check/correct your byte order.",
"wiz_rgb_switchevery" : "Switch color every...",
"wiz_rgb_q" : "Which color show your leds, when the color dot above shows...",
"wiz_rgb_qrend" : "...red?",
"wiz_rgb_qgend" : "...green?",
"wiz_hue_title" : "Hue Bridge Wizard",
"wiz_hue_intro1" : "With this Setup Helper you can get a new User for your Hue Bridge and you can see your Lights with the IDs for Hyperion Configuration.",
"wiz_hue_intro2" : "Remember: This is only a wizard. You have to copy and paste them in your config.",
"wiz_hue_ip" : "Hue Bridge IP:",
"wiz_hue_username" : "Username:",
"wiz_hue_create_user" : "Create User",
"wiz_hue_failure_ip" : "Please check your IP Address.",
"wiz_hue_failure_connection" : "Connection Timeout. Please press the button in time.",
"wiz_hue_press_link" : "Please press link button on the Hue Bridge.",
"wiz_cc_title" : "Color calibration wizard",
"wiz_cc_intro1" : "This wizard will guide you through your led calibration. If you are using Kodi, the calibration pictures and videos can be send directly to kodi without further tasks on your side. If not, you need to download these files yourself and apply them, if the wizard wants it.",
"wiz_cc_kwebs" : "Kodi webserver (IP:Port)",
"wiz_cc_kodidiscon" : "Kodi webserver not found, proceed without Kodi support.",
"wiz_cc_kodidisconlink" : "Download link pictures:",
"wiz_cc_kodicon" : "Kodi webserver found, proceed with Kodi support.",
"wiz_cc_kodimsg_start" : "Test success - time to proceed!",
"wiz_cc_kodishould" : "Kodi should show the following picture: $1",
"wiz_cc_lettvshow" : "Let your TV show the following picture: $1",
"wiz_cc_lettvshowm" : "Check this with the following pictures: $1",
"wiz_cc_adjustit" : "Adjust your \"$1\", until your are fine with it. Take notice: The more you adjust away from the default value the color spectrum will be limited (Also for all colors in between). Depending on TV/LED color spectrum the results will vary.",
"wiz_cc_adjustgamma" : "Gamma: What you have to do is, adjust gamma levels of each channel until you have the same perceived amount of each channel. For example, if your Grey is a bit reddish it means that you have to increase red gamma to reduce the amount of red (the more gamma, the less amount of color).",
"wiz_cc_chooseid" : "Define a name for this profile.",
"wiz_cc_btn_switchpic" : "Switch picture",
"wiz_cc_backlight" : "Additional you could define a backlight to sort out \"bad colors\" on nearly dark areas or if you don't like the switch between color and off during watching. Additional you could define if there should be some color in it or just white. This is disabled during the state \"Off\" ,\"Color\" and \"Effect\".",
"wiz_cc_testintro" : "Time for a real test!",
"wiz_cc_testintrok" : "Push on a button below to start a test video.",
"wiz_cc_testintrowok" : "Checkout the following link to download test videos:",
"wiz_cc_link" : "Click me!",
"wiz_cc_morethanone" : "You have more than one profile, please choose the profile you want to calibrate.",
"wiz_cc_btn_stop" : "Stop video",
"wiz_cc_summary" : "A conclusen of your settings. During video playback, you could change or test values again. If you are done, click on save.",
"edt_dev_enum_subtract_minimum" : "Substract minimum",
"edt_dev_enum_sub_min_warm_adjust" : "Min warm adjust",
"edt_dev_enum_white_off" : "White off",
"edt_dev_general_heading_title" : "General Settings",
"edt_dev_general_name_title" : "Configuration name",
"edt_dev_general_ledCount_title" : "Count of all hardware LEDs",
"edt_dev_general_colorOrder_title" : "RGB byte order",
"edt_dev_general_rewriteTime_title" : "Refresh time",
"edt_dev_spec_header_title" : "Specific Settings",
"edt_dev_spec_baudrate_title" : "Baudrate",
"edt_dev_spec_spipath_title" : "SPI path",
"edt_dev_spec_invert_title" : "Invert signal",
"edt_dev_spec_multicastGroup_title" : "Multicast group",
"edt_dev_spec_numberOfLeds_title" : "Number of LEDs",
"edt_dev_spec_port_title" : "Port",
"edt_dev_spec_orbIds_title" : "Orb ID(s)",
"edt_dev_spec_useOrbSmoothing_title" : "Use orb smoothing",
"edt_dev_spec_targetIp_title" : "Target IP",
"edt_dev_spec_targetIpHost_title" : "Target IP/hostname",
"edt_dev_spec_outputPath_title" : "Output path",
"edt_dev_spec_delayAfterConnect_title" : "Delay after connect",
"edt_dev_spec_FCsetConfig_title" : "Set fadecandy configuration",
"edt_dev_spec_FCmanualControl_title" : "Manual control of fadecandy LED",
"edt_dev_spec_FCledToOn_title" : "Fadecandy LED set to on",
"edt_dev_spec_interpolation_title" : "Interpolation",
"edt_dev_spec_dithering_title" : "Dithering",
"edt_dev_spec_gamma_title" : "Gamma",
"edt_dev_spec_whitepoint_title" : "Whitepoint",
"edt_dev_spec_username_title" : "Username",
"edt_dev_spec_lightid_title" : "Light ID(s)",
"edt_dev_spec_lightid_itemtitle" : "ID",
"edt_dev_spec_transistionTime_title" : "Transistion time",
"edt_dev_spec_switchOffOnBlack_title" : "Switch off on black",
"edt_dev_spec_uid_title" : "UID",
"edt_dev_spec_intervall_title" : "Intervall",
"edt_dev_spec_latchtime_title" : "Latch time",
"edt_dev_spec_maxPacket_title" : "Max packet",
"edt_dev_spec_serial_title" : "Serial number",
"edt_dev_spec_vid_title" : "VID",
"edt_dev_spec_pid_title" : "PID",
"edt_dev_spec_cid_title" : "CID",
"edt_dev_spec_LBap102Mode_title" : "LightBerry APA102 Mode",
"edt_dev_spec_universe_title" : "Universe",
"edt_dev_spec_whiteLedAlgor_title" : "White LED algorithm",
"edt_dev_spec_useRgbwProtocol_title" : "Use RGBW protocol",
"edt_dev_spec_maximumLedCount_title" : "Maximum LED count",
"edt_dev_spec_gpioNumber_title" : "GPIO number",
"edt_dev_spec_gpioMap_title" : "GPIO mapping",
"edt_dev_spec_PBFiFo_title" : "Pi-Blaster FiFo",
"edt_dev_spec_gpioBcm_title" : "GPIO Pin",
"edt_dev_spec_ledIndex_title" : "LED index",
"edt_dev_spec_colorComponent_title" : "Color component",
"edt_conf_general_enable_title" : "Activate",
"edt_conf_general_enable_expl" : "If checked, the component is enabled.",
"edt_conf_general_priority_title" : "Priority channel",
"edt_conf_general_priority_expl" : "The priority of this component",
"edt_conf_general_port_title" : "Port",
"edt_conf_general_port_expl" : "The port that is used.",
"edt_conf_enum_color" : "Color",
"edt_conf_enum_effect" : "Effect",
"edt_conf_enum_multicolor_mean" : "Multicolor",
"edt_conf_enum_unicolor_mean" : "Unicolor",
"edt_conf_enum_rgb" : "RGB",
"edt_conf_enum_bgr" : "BGR",
"edt_conf_enum_rbg" : "RBG",
"edt_conf_enum_brg" : "BRG",
"edt_conf_enum_gbr" : "GBR",
"edt_conf_enum_grb" : "GRB",
"edt_conf_enum_linear" : "Linear",
"edt_conf_enum_PAL" : "PAL",
"edt_conf_enum_NTSC" : "NTSC",
"edt_conf_enum_logsilent" : "Silent",
"edt_conf_enum_logwarn" : "Warning",
"edt_conf_enum_logverbose" : "Verbose",
"edt_conf_enum_logdebug" : "Debug",
"edt_conf_enum_bbdefault" : "Default",
"edt_conf_enum_bbclassic" : "Classic",
"edt_conf_enum_bbosd" : "OSD",
"edt_conf_gen_heading_title" : "General Settings",
"edt_conf_gen_name_title" : "Configuration name",
"edt_conf_gen_name_expl" : "A user defined name which is used to detect Hyperion. (Helpful with more than one Hyperion instance)",
"edt_conf_gen_showOptHelp_title" : "Show explanations",
"edt_conf_gen_showOptHelp_expl" : "Show all available explanations in each section. Highly recommended for beginners!",
"edt_conf_color_heading_title" : "Color Calibration",
"edt_conf_color_channelAdjustment_header_itemtitle" : "Profile",
"edt_conf_color_channelAdjustment_header_title" : "Color channel adjustments",
"edt_conf_color_channelAdjustment_header_expl": "Adjustments for color, brightness, linearization and more.",
"edt_conf_color_imageToLedMappingType_title" : "Led area assignment",
"edt_conf_color_imageToLedMappingType_expl" : "Overwrites the led area assignment of your led layout if it's not \"multicolor\"",
"edt_conf_color_id_title" : "ID",
"edt_conf_color_id_expl" : "User given name",
"edt_conf_color_leds_title" : "LED index",
"edt_conf_color_leds_expl" : "Assign this adjustment to all leds (*) or just some (0-24).",
"edt_conf_color_black_title" : "black",
"edt_conf_color_black_expl" : "The calibrated black value.",
"edt_conf_color_white_title" : "white",
"edt_conf_color_white_expl" : "The calibrated white value.",
"edt_conf_color_red_title" : "red",
"edt_conf_color_red_expl" : "The calibrated red value.",
"edt_conf_color_green_title" : "green",
"edt_conf_color_green_expl" : "The calibrated green value.",
"edt_conf_color_blue_title" : "blue",
"edt_conf_color_blue_expl" : "The calibrated blue value.",
"edt_conf_color_cyan_title" : "cyan",
"edt_conf_color_cyan_expl" : "The calibrated cyan value.",
"edt_conf_color_magenta_title" : "magenta",
"edt_conf_color_magenta_expl" : "The calibrated magenta value.",
"edt_conf_color_yellow_title" : "yellow",
"edt_conf_color_yellow_expl" : "The calibrated yellow value.",
"edt_conf_color_gammaRed_title" : "gamma red",
"edt_conf_color_gammaRed_expl" : "The gamma of red.",
"edt_conf_color_gammaGreen_title" : "gamma green",
"edt_conf_color_gammaGreen_expl" : "The gamma of green.",
"edt_conf_color_gammaBlue_title" : "gamma blue",
"edt_conf_color_gammaBlue_expl" : "The gamma of blue.",
"edt_conf_color_backlightThreshold_title" : "Backlight threshold",
"edt_conf_color_backlightThreshold_expl" : "The minimum amount of brightness (backlight). Disabled during effects, colors and in status \"Off\"",
"edt_conf_color_backlightColored_title" : "Colored backlight",
"edt_conf_color_backlightColored_expl" : "Add some color to your backlight.",
"edt_conf_color_brightness_title" : "maximal brightness",
"edt_conf_color_brightness_expl" : "From 0.0 to 0.5 the brightness is linearised, from 0.5 to 1.0 cyan, magenta, yellow is up to 2x brighter and white 3x.",
"edt_conf_smooth_heading_title" : "Smoothing",
"edt_conf_smooth_type_title" : "Type",
"edt_conf_smooth_type_expl" : "Type of smoothing.",
"edt_conf_smooth_time_ms_title" : "Time",
"edt_conf_smooth_time_ms_expl" : "How long should the smoothing gather pictures?",
"edt_conf_smooth_updateFrequency_title" : "Update frequency",
"edt_conf_smooth_updateFrequency_expl" : "The output speed to your led controller.",
"edt_conf_smooth_updateDelay_title" : "Update delay",
"edt_conf_smooth_updateDelay_expl" : "Delay the output in case your ambient light is faster than your TV.",
"edt_conf_smooth_continuousOutput_title" : "Continuous output",
"edt_conf_smooth_continuousOutput_expl" : "Update the leds even there is no changed picture.",
"edt_conf_v4l2_heading_title" : "USB Capture",
"edt_conf_v4l2_device_title" : "Device",
"edt_conf_v4l2_device_expl" : "The path to the usb capture.",
"edt_conf_v4l2_input_title" : "Input",
"edt_conf_v4l2_input_expl" : "Input of this path.",
"edt_conf_v4l2_standard_title" : "Video standard",
"edt_conf_v4l2_standard_expl" : "Select the video standard for your region.",
"edt_conf_v4l2_width_title" : "Width",
"edt_conf_v4l2_width_expl" : "The width of the picture. (-1 = auto width)",
"edt_conf_v4l2_height_title" : "Height",
"edt_conf_v4l2_height_expl" : "The height of the picture. (-1 = auto height)",
"edt_conf_v4l2_frameDecimation_title" : "Frame decimation",
"edt_conf_v4l2_frameDecimation_expl" : "The factor of frame decimation",
"edt_conf_v4l2_sizeDecimation_title" : "Size decimation",
"edt_conf_v4l2_sizeDecimation_expl" : "The factor of size decimation",
"edt_conf_v4l2_mode_title" : "Mode",
"edt_conf_v4l2_mode_expl" : "Modus of USB capture",
"edt_conf_v4l2_useKodiChecker_title" : "Use Kodi Watch",
"edt_conf_v4l2_useKodiChecker_expl" : "Start/stop capturing with Kodi Watch results.",
"edt_conf_v4l2_cropLeft_title" : "Crop left",
"edt_conf_v4l2_cropLeft_expl" : "Count of pixels on the left side that are removed from the picture.",
"edt_conf_v4l2_cropRight_title" : "Crop right",
"edt_conf_v4l2_cropRight_expl" : "Count of pixels on the right side that are removed from the picture.",
"edt_conf_v4l2_cropTop_title" : "Crop top",
"edt_conf_v4l2_cropTop_expl" : "Count of pixels on the top side that are removed from the picture.",
"edt_conf_v4l2_cropBottom_title" : "Crop bottom",
"edt_conf_v4l2_cropBottom_expl" : "Count of pixels on the bottom side that are removed from the picture.",
"edt_conf_v4l2_redSignalThreshold_title" : "Red signal threshold",
"edt_conf_v4l2_redSignalThreshold_expl" : "Darkens low red values (recognized as black)",
"edt_conf_v4l2_greenSignalThreshold_title" : "Green signal threshold",
"edt_conf_v4l2_greenSignalThreshold_expl" : "Darkens low green values (recognized as black)",
"edt_conf_v4l2_blueSignalThreshold_title" : "Blue signal threshold",
"edt_conf_v4l2_blueSignalThreshold_expl" : "Darkens low blue values (recognized as black)",
"edt_conf_fg_heading_title" : "Platform Capture",
"edt_conf_fg_type_title" : "Type",
"edt_conf_fg_type_expl" : "Type of platform capture, default is 'auto'",
"edt_conf_fg_frequency_Hz_title" : "Capture frequency",
"edt_conf_fg_frequency_Hz_expl" : "How fast new pictures are captured",
"edt_conf_fg_horizontalPixelDecimation_title" : "Horizontal pixel decimation",
"edt_conf_fg_horizontalPixelDecimation_expl" : "Horizontal pixel decimation (factor)",
"edt_conf_fg_useXGetImage_title" : "Use XGetImage",
"edt_conf_fg_useXGetImage_expl" : "XGetImage for newer X11 desktops",
"edt_conf_fg_verticalPixelDecimation_title" : "Vertical pixel decimation",
"edt_conf_fg_verticalPixelDecimation_expl" : "Vertical pixel decimation (factor)",
"edt_conf_fg_device_title" : "Device",
"edt_conf_fg_display_title" : "Display",
"edt_conf_fg_display_expl" : "Select which desktop should be captured (multi monitor setup)",
"edt_conf_bb_heading_title" : "Blackbar detector",
"edt_conf_bb_threshold_title" : "Threshold",
"edt_conf_bb_threshold_expl" : "If the detection doesn't work, higher the threshold to adjust on 'greyish' black",
"edt_conf_bb_unknownFrameCnt_title" : "unknownFrameCnt",
"edt_conf_bb_borderFrameCnt_title" : "borderFrameCnt",
"edt_conf_bb_maxInconsistentCnt_title" : "maxInconsistentCn",
"edt_conf_bb_blurRemoveCnt_title" : "blurRemoveCnt",
"edt_conf_bb_mode_title" : "Mode",
"edt_conf_bb_mode_expl" : "Algorithm for processing. (see Wiki)",
"edt_conf_kodic_heading_title" : "Kodi Watch",
"edt_conf_kodic_kodiAddress_title" : "Kodi IP address",
"edt_conf_kodic_kodiAddress_expl" : "The IP address of Kodi.",
"edt_conf_kodic_kodiTcpPort_title" : "Kodi TCP port",
"edt_conf_kodic_kodiTcpPort_expl" : "The TCP port of Kodi. Don't use the webserver port!",
"edt_conf_kodic_grabVideo_title" : "Video",
"edt_conf_kodic_grabVideo_expl" : "If checked, the capturing is enabled during video playback, else it's disabled.",
"edt_conf_kodic_grabPictures_title" : "Pictures",
"edt_conf_kodic_grabPictures_expl" : "If checked, the capturing is enabled on picture playback, else it's disabled.",
"edt_conf_kodic_grabAudio_title" : "Audio",
"edt_conf_kodic_grabAudio_expl" : "If checked, the capturing is enabled during audio playback, else it's disabled.",
"edt_conf_kodic_grabMenu_title" : "Menu",
"edt_conf_kodic_grabMenu_expl" : "If checked, the capturing is enabled in menu and login screen, else it's disabled.",
"edt_conf_kodic_grabPause_title" : "Pause",
"edt_conf_kodic_grabPause_expl" : "If checked, the capturing is enabled in pause mode (Music, Video, Diashow), else it's disabled.",
"edt_conf_kodic_grabScreensaver_title" : "Screensaver",
"edt_conf_kodic_grabScreensaver_expl" : "If checked, the capturing is enabled during screensaver, else it's disabled.",
"edt_conf_kodic_enable3DDetection_title" : "Detect 3D",
"edt_conf_kodic_enable3DDetection_expl" : "Detect which 3D mode Kodi is running. (no MVC and not for USB capture)",
"edt_conf_fge_heading_title" : "Boot Effect/Color",
"edt_conf_fge_type_title" : "Type",
"edt_conf_fge_type_expl" : "Choose between a color of effect.",
"edt_conf_fge_color_title" : "Color",
"edt_conf_fge_color_expl" : "If type is \"Color\", set a color of your choice here.",
"edt_conf_fge_effect_title" : "Effect",
"edt_conf_fge_effect_expl" : "If type is \"Effect\", select a effect of your choice (Also self created effects).",
"edt_conf_fge_duration_ms_title" : "Duration",
"edt_conf_fge_duration_ms_expl" : "Duration of Effect/Color during Hyperion startup.",
"edt_conf_bge_heading_title" : "Background Effect/Color",
"edt_conf_fw_heading_title" : "Forwarder",
"edt_conf_fw_json_title" : "List of json clients",
"edt_conf_fw_json_expl" : "One json target per line. Contains IP:PORT (Example: 127.0.0.1:19446)",
"edt_conf_fw_json_itemtitle" : "Json target",
"edt_conf_fw_proto_title" : "List of proto clients",
"edt_conf_fw_proto_expl" : "One proto target per line. Contains IP:PORT (Example: 127.0.0.1:19447)",
"edt_conf_fw_proto_itemtitle" : "Proto target",
"edt_conf_js_heading_title" : "JSON Server",
"edt_conf_ps_heading_title" : "PROTO Server",
"edt_conf_bobls_heading_title" : "Boblight Server",
"edt_conf_udpl_heading_title" : "UDP Listener",
"edt_conf_udpl_address_title" : "Address",
"edt_conf_udpl_address_expl" : "The address where UDP packages are accepted.",
"edt_conf_udpl_timeout_title" : "Timeout",
"edt_conf_udpl_timeout_expl" : "If no packages are received for the given period, the component will be (soft) disabled.",
"edt_conf_udpl_shared_title" : "Shared",
"edt_conf_udpl_shared_expl" : "Shared across all Hyperion instances.",
"edt_conf_webc_heading_title" : "Web Configuration",
"edt_conf_webc_docroot_title" : "Document Root",
"edt_conf_webc_docroot_expl" : "Local webinterface root path (just for webui developer)",
"edt_conf_effp_heading_title" : "Effekt Paths",
"edt_conf_effp_paths_title" : "Effect Path(s)",
"edt_conf_effp_paths_itemtitle" : "Path",
"edt_conf_effp_disable_title" : "Disabed Effects",
"edt_conf_effp_disable_itemtitle" : "Effect",
"edt_conf_log_heading_title" : "Logging",
"edt_conf_log_level_title" : "Log-Level",
"edt_conf_log_level_expl" : "Depending on loglevel you see less or more messages in your log.",
"edt_eff_candle_header_title" : "Candle",
"edt_eff_police_header_title" : "Police",
"edt_eff_fade_header_title" : "Fade",
"edt_eff_rainbowmood_header_title" : "Rainbow Mood",
"edt_eff_knightrider_header_title" : "Knight Rider",
"edt_eff_lightclock_header_title" : "Clock 1",
"edt_eff_clock_header_title" : "Clock 2",
"edt_eff_pacman_header_title" : "Pac-Man",
"edt_eff_moodblobs_header_title" : "Mood Blobs",
"edt_eff_rainbowswirl_header_title" : "Rainbow Swirl",
"edt_eff_random_header_title" : "Random",
"edt_eff_runningdots_header_title" : "Running Dots",
"edt_eff_systemshutdown_header_title" : "System Shutdown",
"edt_eff_snake_header_title" : "Snake",
"edt_eff_sparks_header_title" : "Sparks",
"edt_eff_storbe_header_title" : "Strobe",
"edt_eff_traces_header_title" : "Color Traces",
"edt_eff_x-mas_header_title" : "X-Mas",
"edt_eff_trails_header_title" : "Trails",
"edt_eff_enum_all" : "All",
"edt_eff_enum_all-together" : "All together",
"edt_eff_enum_list" : "LED List",
"edt_eff_count_title" : "Count",
"edt_eff_color_title" : "Color",
"edt_eff_colorrandom_title" : "Random color",
"edt_eff_colorone_title" : "Color one",
"edt_eff_colortwo_title" : "Color two",
"edt_eff_colorcount_title" : "Color length",
"edt_eff_rotationtime_title" : "Rotation time",
"edt_eff_sleeptime_title" : "Sleep time",
"edt_eff_reversedirection_title" : "Reverse direction",
"edt_eff_fadetime_title" : "Fade time",
"edt_eff_colorstart_title" : "Color start",
"edt_eff_colorend_title" : "Color end",
"edt_eff_colorshift_title" : "Color Shift",
"edt_eff_whichleds_title" : "Which Leds",
"edt_eff_ledlist_title" : "Led List",
"edt_eff_speed_title" : "Speed",
"edt_eff_fadefactor_title" : "Fade factor",
"edt_eff_showseconds_title" : "Show seconds",
"edt_eff_blobcount_title" : "Blob count",
"edt_eff_huechange_title" : "Color change",
"edt_eff_basecolorchange_title" : "Base color change",
"edt_eff_basecolorchangerate_title" : "BC change rate",
"edt_eff_basecolorrangeleft_title" : "BC range left",
"edt_eff_basecolorrangeright_title" : "BC range right",
"edt_eff_brightness_title" : "Brightness",
"edt_eff_centerx_title" : "Center X-Axis",
"edt_eff_centery_title" : "Center Y-Axis",
"edt_eff_saturation_title" : "Saturation",
"edt_eff_colorevel_title" : "Color level",
"edt_eff_whitelevel_title" : "White level",
"edt_eff_alarmcolor_title" : "Alarm color",
"edt_eff_postcolor_title" : "Post color",
"edt_eff_enableshutdown_title" : "Real shutdown",
"edt_eff_length_title" : "Length",
"edt_eff_frequency_title" : "Frequency",
"edt_eff_min_len_title" : "Minimal length",
"edt_eff_max_len_title" : "Maximal length",
"edt_eff_height_title" : "Height",
"edt_eff_offset_title" : "Offset",
"edt_eff_colorHour_title" : "Color hour",
"edt_eff_colorMinute_title" : "Color minute",
"edt_eff_colorSecond_title" : "Color second",
"edt_eff_hourMargin_title" : "Margin hour",
"edt_eff_minuteMargin_title" : "Margin minute",
"edt_eff_secondMargin_title" : "Margin second",
"edt_eff_margin_title" : "Margin",
"edt_eff_colorMarker_title" : "Color marker",
"edt_append_ns" : "ns",
"edt_append_ms" : "ms",
"edt_append_s" : "s",
"edt_append_hz" : "Hz",
"edt_append_pixel" : "Pixel",
"edt_append_percent" : "%",
"edt_append_degree" : "°",
"edt_append_sdegree" : "s/degree",
"edt_append_leds" : "LEDs",
"edt_msg_error_notset" : "Property must be set",
"edt_msg_error_notempty" : "Value required",
"edt_msg_error_enum" : "Value must be one of the enumerated values",
"edt_msg_error_anyOf" : "Value must validate against at least one of the provided schemas",
"edt_msg_error_oneOf" : "Value must validate against exactly one of the provided schemas. It currently validates against $1 of the schemas.",
"edt_msg_error_not" : "Value must not validate against the provided schema",
"edt_msg_error_type_union" : "Value must be one of the provided types",
"edt_msg_error_type" : "Value must be of type $1",
"edt_msg_error_disallow_union" : "Value must not be one of the provided disallowed types",
"edt_msg_error_disallow" : "Value must not be of type $1",
"edt_msg_error_multipleOf" : "Value must be a multiple of $1",
"edt_msg_error_maximum_excl" : "Value must be less than $1",
"edt_msg_error_maximum_incl" : "Value must be at most $1",
"edt_msg_error_minimum_excl" : "Value must be greater than $1",
"edt_msg_error_minimum_incl" : "Value must be at least $1",
"edt_msg_error_maxLength" : "Value must be at most $1 characters long",
"edt_msg_error_minLength" : "Value must be at least $1 characters long",
"edt_msg_error_pattern" : "Value must match the pattern",
"edt_msg_error_additionalItems" : "No additional items allowed in this array",
"edt_msg_error_maxItems" : "Value must have at most $1 items",
"edt_msg_error_minItems" : "Value must have at least $1 items",
"edt_msg_error_uniqueItems" : "Array must have unique items",
"edt_msg_error_maxProperties" : "Object must have at most $1 properties",
"edt_msg_error_minProperties" : "Object must have at least $1 properties",
"edt_msg_error_required" : "Object is missing the required property '$1'",
"edt_msg_error_additional_properties" : "No additional properties allowed, but property $1 is set",
"edt_msg_error_dependency" : "Must have property $1",
"edt_msg_button_delete_all" : "All",
"edt_msg_button_delete_all_title" : "Delete All",
"edt_msg_button_delete_last" : "Last $1",
"edt_msg_button_delete_last_title" : "Delete Last $1",
"edt_msg_button_add_row_title" : "Add $1",
"edt_msg_button_move_down_title" : "Move down",
"edt_msg_button_move_up_title" : "Move up",
"edt_msg_button_delete_row_title" : "Delete $1",
"edt_msg_button_delete_row_title_short" : "Delete",
"edt_msg_button_collapse" : "Collapse",
"edt_msg_button_expand" : "Expand"
}

View File

@ -0,0 +1,676 @@
{
"general_webui_title": "Hyperion - Configuración Web",
"general_country_de": "Alemania",
"general_country_us": "Estados Unidos",
"general_country_uk": "Reino Unido",
"general_country_fr": "Francia",
"general_country_es": "España",
"general_country_it": "Italia",
"general_country_nl": "Holanda",
"general_speech_de": "Alemán",
"general_speech_en": "Inglés",
"general_access_default": "Predeterminado",
"general_access_advanced": "Avanzado",
"general_access_expert": "Experto",
"general_comp_SMOOTHING": "Suavizado",
"general_comp_BLACKBORDER": "Detección de bordes negros",
"general_comp_KODICHECKER": "Observador Kodi",
"general_comp_FORWARDER": "JSON/PROTO Progresivo",
"general_comp_UDPLISTENER": "Oyente UDP",
"general_comp_BOBLIGHTSERVER": "Servidor Boblight",
"general_comp_GRABBER": "Captura de plataforma",
"general_comp_V4L": "Captura USB",
"general_col_red": "rojo",
"general_col_green": "verde",
"general_col_blue": "azul",
"general_button_savesettings": "Guardar ajustes",
"general_btn_ok": "OK",
"general_btn_cancel": "Cancelar",
"general_btn_continue": "Continuar",
"general_btn_save": "Guardar",
"general_btn_saverestart": "Guardar y reiniciar",
"general_btn_saveandreload": "Guardar y recargar",
"general_btn_restarthyperion": "Reiniciar Hyperion",
"general_btn_off": "Apagado",
"general_btn_on": "Encendido",
"general_btn_next": "Siguiente",
"general_btn_back": "Atrás",
"dashboard_label_intro": "El cuadro de mandos te ofrece una visión general sobre el estado de Hyperion y te mostrará las últimas noticias del Blog de Hyperion.",
"dashboard_infobox_label_title": "Información",
"dashboard_infobox_label_currenthyp": "Tu versión de Hyperion:",
"dashboard_infobox_label_latesthyp": "Última versión de Hyperion:",
"dashboard_infobox_label_device": "Sistema:",
"dashboard_infobox_message_updatewarning": "¡Una versión más nueva de Hyperion está disponible! (V$1)",
"dashboard_infobox_message_updatesuccess": "Ejecutas la última versión de Hyperion.",
"dashboard_componentbox_label_title": "Estado de los componentes",
"dashboard_componentbox_label_comp": "Estado de los componentes",
"dashboard_componentbox_label_status": "Estado",
"dashboard_newsbox_label_title": "Últimas entradas del Blog",
"dashboard_alert_message_confedit": "Se ha modificado la configuración de Hyperion. Para aplicarlo, reinicia Hyperion.",
"main_menu_dashboard_token": "Cuadro de mandos",
"main_menu_configuration_token": "Configuración",
"main_menu_general_conf_token": "General",
"main_menu_leds_conf_token": "Hardware LED",
"main_menu_grabber_conf_token": "Capturando Hardware",
"main_menu_effect_conf_token": "Efectos",
"main_menu_colors_conf_token": "Procesamiento de imágen",
"main_menu_kodiwatch_token": "Observador Kodi",
"main_menu_network_conf_token": "Servicios de red",
"main_menu_remotecontrol_token": "Control Remoto",
"main_menu_effectsconfigurator_token": "Configurador de Efectos",
"main_menu_support_token": "Soporte",
"main_menu_update_token": "Actualizar",
"main_menu_system_token": "Sistema",
"main_menu_input_selection_token": "Selección de entrada",
"main_menu_logging_token": "Log",
"main_menu_webconfig_token": "Configuración web",
"main_menu_about_token": "Acerca de Hyperion",
"main_ledsim_title": "Visualización LED",
"main_ledsim_text": "Visualización en vivo de los colores LED y opcional el flujo de vídeo actual de tu dispositivo de captura.",
"main_ledsim_btn_toggleleds": "Mostrar LEDs",
"main_ledsim_btn_togglelednumber": "Números LED",
"main_ledsim_btn_togglelivevideo": "video en vivo",
"conf_general_label_title": "Configuración General",
"conf_general_intro": "Ajustes básicos de Hyperion y WebUI que no encajan en otra categoría.",
"conf_general_impexp_title": "Importar/Exportar Configuración",
"conf_general_impexp_l1": "Importa una configuración seleccionando un archivo de configuración a continuación y haz clic en \"Importar\".",
"conf_general_impexp_l2": "Exporta una configuración haciendo clic en \"Exportar\". Tu navegador inicia una descarga.",
"conf_general_impexp_impbtn": "Importar",
"conf_general_impexp_expbtn": "Exportar",
"conf_helptable_option": "Opción",
"conf_helptable_expl": "Explicación",
"conf_effect_path_intro": "Define más rutas de efectos si es necesario.",
"conf_effect_fgeff_intro": "Define un efecto de arranque o color, que se muestra durante el inicio de Hyperion durante una duración definida.",
"conf_effect_bgeff_intro": "Definir un efecto de fondo, que se muestra durante \"inactivo\". (También temporalmente a través de Observador Kodi)",
"conf_leds_device_intro": "Hyperion soporta una gran cantidad de controladores para transmitir datos a tu dispositivo de destino. Selecciona un controlador LED fuera de la lista ordenada y configúralo. Hemos elegido los mejores ajustes por defecto para cada dispositivo.",
"conf_leds_layout_intro": "Necesitas también un diseño led, que refleje tus posiciones led. La disposición clásica es el marco generalmente usado de la TV, pero también apoyamos la creación de matriz led (paredes led). La vista en esta disposición es SIEMPRE del FRENTE de su TV.",
"conf_leds_nav_label_ledcontroller": "Controlador LED",
"conf_leds_nav_label_ledlayout": "Disposición LED",
"conf_leds_contr_label_contrtype": "Tipo de controladora:",
"conf_leds_optgroup_RPiSPI": "SPI RPi",
"conf_leds_optgroup_RPiPWM": "PWM RPi",
"conf_leds_optgroup_RPiGPIO": "GPIO RPi",
"conf_leds_optgroup_network": "Red",
"conf_leds_optgroup_usb": "USB",
"conf_leds_optgroup_debug": "Depurar",
"conf_leds_layout_btn_checklist": "Mostrar lista",
"conf_leds_leyout_checkp1": "El led negro es tu primer led, el primer led es el punto donde introduces tu señal de datos.",
"conf_leds_leyout_checkp2": "La disposición es siempre la vista delantera de tu TV, nunca la visión posterior.",
"conf_leds_leyout_checkp3": "Asegúrate de que la dirección es correcta. Los leds grises indican los led números 2 y 3 para visualizar la dirección de los datos.",
"conf_leds_leyout_checkp4": "Caso Hueco: Para crear un hueco, ignóralo primero cuando definas Superior/Inferior/Izquieda/Derecha y ajusta después su longitud de hueco para eliminar una cantidad de leds. Modifica la posición del hueco hasta que coincida.",
"conf_leds_layout_frame": "Disposición Clásica (Marco LED)",
"conf_leds_layout_matrix": "Disposición de Matriz (Pared LED)",
"conf_leds_layout_generatedconf": "Configuración LED Generada/Actual",
"conf_leds_layout_button_savelay": "Guardar Disposición",
"conf_leds_layout_button_updsim": "Actualizar Vista Previa",
"conf_leds_layout_peview": "Vista Previa de Configuración LED",
"conf_leds_layout_advanced": "Ajustes Avanzados",
"conf_leds_layout_preview_originCL": "Creado a partir de: Disposición Clásica (Marco LED)",
"conf_leds_layout_preview_originTEXT": "Creado a partir de: Cuadro de texto",
"conf_leds_layout_preview_originMA": "Creado a partir de: Disposición en Matriz (Pared LED)",
"conf_leds_layout_preview_totalleds": "Total de LEDs:$1",
"conf_leds_layout_preview_l1": "Este es tu primer led (posición de entrada)",
"conf_leds_layout_preview_l2": "Esto visualiza la dirección de datos (segundo/tercer led)",
"conf_leds_layout_cl_top": "Superior",
"conf_leds_layout_cl_bottom": "Inferior",
"conf_leds_layout_cl_left": "Izquierda",
"conf_leds_layout_cl_right": "Derecha",
"conf_leds_layout_cl_gaglength": "Longitud de hueco",
"conf_leds_layout_cl_gappos": "Posición del hueco",
"conf_leds_layout_cl_inppos": "Posición de entrada",
"conf_leds_layout_cl_reversdir": "Dirección inversa",
"conf_leds_layout_cl_hleddepth": "Profundidad LED Horizontal",
"conf_leds_layout_cl_vleddepth": "Profundidad LED vertical",
"conf_leds_layout_cl_generate": "Generar configuración LED",
"conf_leds_layout_cl_edgegap": "Hueco de borde",
"conf_leds_layout_cl_cornergap": "Hueco de esquina",
"conf_leds_layout_cl_overlap": "Superposición",
"conf_leds_layout_ma_horiz": "Horizontal",
"conf_leds_layout_ma_vert": "Vertical",
"conf_leds_layout_ma_cabling": "Cableado",
"conf_leds_layout_ma_optsnake": "Serpiente",
"conf_leds_layout_ma_optparallel": "Paralelo",
"conf_leds_layout_ma_order": "Orden",
"conf_leds_layout_ma_opthoriz": "Horizontal",
"conf_leds_layout_ma_optvert": "Vertical",
"conf_leds_layout_ma_position": "Entrada",
"conf_leds_layout_ma_opttopleft": "Superior Izquierda",
"conf_leds_layout_ma_opttopright": "Superior Derecha",
"conf_leds_layout_ma_optbottomleft": "Inferior Izquierda",
"conf_leds_layout_ma_optbottomright": "Inferior Derecha",
"conf_leds_layout_textf1": "Este campo de texto muestra de forma predeterminada el diseño cargado actual y se sobrescribirá si genera uno nuevo con las opciones siguientes. Opcional, puede realizar más ediciones.",
"conf_grabber_fg_intro": "La captura de la plataforma es la captura del sistema local como fuente de entrada, en la que Hyperion está instalado.",
"conf_grabber_v4l_intro": "La captura USB es un dispositivo (de captura) conectado a través de USB que se utiliza para introducir imágenes de origen para su procesamiento.",
"conf_colors_color_intro": "Cree uno o más perfiles de calibración, ajuste cada color, brillo, linealización y más.",
"conf_colors_smoothing_intro": "El suavizado aplana los cambios de color/brillo para reducir la distracción molesta.",
"conf_colors_blackborder_intro": "Omite bordes negros dondequiera que estén. Cada modo usa otro algoritmo de detección que está ajustado para situaciones especiales. Sube el umbral si no percibes funcionamiento.",
"conf_network_json_intro": "El puerto JSON-RPC de esta instancia de Hyperion, utilizado para el control remoto.",
"conf_network_proto_intro": "El PROTO-puerto de esta instancia de Hyperion, utilizado para flujos de imágenes (HyperionScreenCap, Kodi Adddon, ...)",
"conf_network_bobl_intro": "Receptor para Boblight",
"conf_network_udpl_intro": "Receptor para UDP",
"conf_network_forw_intro": "Reenviar toda la entrada a una segunda instancia de Hyperion que podría ser gestionada con otro controlador led",
"conf_kodi_label_title": "Observador Kodi",
"conf_kodi_intro": "El Observador de Kodi te permite habilitar y deshabilitar la captura de pantalla dependiendo del estado de Kodi. Esto no se limita a la misma máquina, se puede observar también un Kodi en cualquier otro dispositivo de tu red.",
"conf_logging_label_intro": "Área para comprobar los mensajes de registro, dependiendo de la configuración de nivel de registro, verás más o menos información.",
"conf_logging_btn_pbupload": "Crear informe para solicitud de soporte",
"conf_logging_btn_autoscroll": "Desplazamiento automático",
"conf_logging_nomessage": "No hay mensajes de registro disponibles.",
"conf_logging_uploading": "Preparar datos...",
"conf_logging_yourlink": "Enlace a su informe",
"conf_logging_uplfailed": "¡Subida fallida! ¡Por favor revise su conexion a internet!",
"conf_webconfig_label_intro": "Ajustes de configuración web. Editar con sabiduría.",
"remote_losthint": "Nota: Todos los cambios se pierden después de un reinicio.",
"remote_color_label": "Colores/Efectos",
"remote_color_intro": "Establecer un efecto o color. También se enumeran los efectos creados uno mismo (si están disponibles). $1",
"remote_color_button_reset": "Restablecer Color/Efecto",
"remote_color_label_color": "Color:",
"remote_effects_label_effects": "Efecto:",
"remote_adjustment_label": "Ajustes de color",
"remote_adjustment_intro": "Modifica el color/brillo/linealización durante el tiempo de ejecución. $1",
"remote_input_label": "Selección de Fuente",
"remote_input_intro": "Hyperion utiliza un sistema de prioridad para seleccionar una fuente. Todo lo que establezcas tiene una prioridad (Efecto/Color/Plataforma de captura/Captura USB y fuentes de red). De forma predeterminada, Hyperion selecciona las fuentes según la prioridad (el número más bajo refleja la fuente activa actual). Ahora tienes la oportunidad de seleccionar fuentes por tu cuenta. $1",
"remote_input_label_autoselect": "Auto Selección",
"remote_input_setsource_btn": "Selecciona Entrada",
"remote_input_sourceactiv_btn": "Entrada activa",
"remote_input_origin": "Origen",
"remote_input_owner": "Tipo",
"remote_input_priority": "Prioridad",
"remote_input_status": "Estado/Acción",
"remote_input_duration": "Duración:",
"remote_input_ip": "IP:",
"remote_components_label": "Control de componentes",
"remote_components_intro": "Habilitar y deshabilitar componentes de Hyperion durante el tiempo de ejecución. $1",
"remote_optgroup_usreffets": "Efectos de Usuario",
"remote_optgroup_syseffets": "Efectos Proporcionados",
"remote_maptype_label": "Tipo de Mapeo",
"remote_maptype_intro": "Cambie el tipo de mapeo durante el tiempo de ejecución. $1",
"remote_maptype_label_multicolor_mean": "Multicolor",
"remote_maptype_label_unicolor_mean": "Unicolor",
"effectsconfigurator_label_intro": "Crea efectos fuera de base, nuevos efectos que se sintonizan a tu gusto. Dependiendo del efecto hay opciones como color, velocidad, dirección y más disponibles.",
"effectsconfigurator_label_chooseeff": "Selecciona Efecto de base:",
"effectsconfigurator_button_saveeffect": "Guardar Efecto",
"effectsconfigurator_label_effectname": "Nombre del efecto",
"effectsconfigurator_button_starttest": "Comenzar test",
"effectsconfigurator_button_stoptest": "Detener test",
"effectsconfigurator_button_conttest": "Test contínuo",
"effectsconfigurator_label_deleffect": "Eliminar Efecto:",
"effectsconfigurator_button_deleffect": "Eliminar Efecto",
"support_label_title": "Apoyar a Hyperior",
"support_label_intro": "Hyperion es un software libre sin fines de lucro. Un pequeño equipo está trabajando en ello y es por eso que necesitamos tu apoyo constante.",
"support_label_spreadtheword": "Difundir la palabra",
"support_label_fbtext": "Comparte nuestra página de Hyperion en Facebook y obten un aviso cuando se publiquen nuevas actualizaciones",
"support_label_twtext": "Compartir y seguir en Twitter, estar siempre al día con el último post sobre el desarrollo de Hyperion",
"support_label_ggtext": "¡Haznos un círculo en Google+!",
"support_label_yttext": "¿Aburrido de las fotos? ¡Comprueba nuestro canal de Youtube!",
"support_label_donate": "Dona o utiliza nuestros enlaces de afiliados",
"support_label_affinstr1": "Haga clic en el enlace apropiado de tu país",
"support_label_affinstr2": "Todo lo que compres (no importa qué) recibimos una pequeña tarifa basada en tu facturación",
"support_label_affinstr3": "SIEMPRE pagas el mismo precio, no hay absolutamente ninguna diferencia. ¡Pruébalo!",
"support_label_btctext": "Dirección:",
"support_label_donationpp": "Donación:",
"support_label_webrestitle": "Información y recursos de ayuda",
"support_label_webpagetitle": "Página web",
"support_label_webpagetext": "Hogar de Hyperion",
"support_label_wikititle": "Wiki",
"support_label_wikitext": "La fuente de la A a la Z para casi todo lo relacionado con Hyperion",
"support_label_forumtitle": "Foro",
"support_label_forumtext": "Casos de muestra, discusiones, ayuda y mucho más",
"support_label_ghtext": "Visitanos en Github",
"update_label_intro": "Descripción general de todas las versiones disponibles de Hyperion. En la parte superior puedes actualizar o degradar tu versión de Hyperion siempre que lo desees. Ordenado de nuevo a más antiguo",
"update_label_description": "Descripción:",
"update_button_install": "Instalar",
"update_button_changelog": "Registro completo de cambios",
"update_label_type": "Tipo:",
"update_versreminder": "Tu versión: $1",
"about_version": "Versión",
"about_build": "Build",
"about_builddate": "la fecha de creación",
"about_translations": "Traducciones",
"about_resources": "$1 librerías",
"about_contribute": "¡Añade más idiomas a Hyperion!",
"about_credits": "¡Créditos a todos estos desarrolladores!",
"info_conlost_label_title": "¡Se ha perdido la conexión con el servicio Hyperion!",
"info_conlost_label_reason": "Posibles causas:",
"info_conlost_label_reason1": "- Mala conexión WLAN",
"info_conlost_label_reason2": "- Realizas una actualización",
"info_conlost_label_reason3": "- Hyperion no se está ejecutando",
"info_conlost_label_autorecon": "Nos volvemos a conectar después de que Hyperion esté disponible.",
"info_conlost_label_autorefresh": "Esta página se actualizará automáticamente.",
"info_conlost_label_reload": "Si no, haga clic en mí o vuelva a cargar la página",
"info_restart_title": "Reinicia actualmente...",
"info_restart_rightback": "¡Hyperion regresará inmediatamente!",
"info_restart_contus": "Si todavía te quedas por aquí después de 20 segundos y no tienes idea de por qué, abre un nuevo tema en nuestro foro de soporte ...",
"info_restart_contusa": "... con tus últimos pasos. ¡Gracias!",
"infoDialog_general_success_title": "Éxito",
"infoDialog_general_error_title": "Error",
"infoDialog_general_warning_title": "Advertencia",
"infoDialog_checklist_title": "¡Lista!",
"InfoDialog_leds_validfail_title": "¡Validación JSON fallida!",
"infoDialog_effconf_deleted_text": "¡El efecto \"$1\" ha sido eliminado con éxito!",
"infoDialog_effconf_created_text": "¡El efecto \"$1\" ha sido creado con éxito!",
"InfoDialog_lang_title": "Configuración de idioma",
"InfoDialog_lang_text": "Si no te gusta el resultado de la detección automática del idioma, puedes sobrescribirlo aquí.",
"InfoDialog_access_title": "Nivel de configuración",
"InfoDialog_access_text": "Dependiendo del nivel de configuración, puedes ajustar más opciones o acceder a más funciones. Se recomienda el nivel \"Predeterminado\".",
"InfoDialog_nowrite_title": "¡Error de permiso de escritura!",
"InfoDialog_nowrite_text": "Hyperion no puede escribir en el archivo de configuración cargado actual. Repara los permisos de archivo para continuar.",
"InfoDialog_nowrite_foottext": "¡El WebUI se desbloqueará automáticamente después de haber resuelto el problema!",
"infoDialog_wizrgb_text": "Tu Orden de Bytes RGB ya está bien ajustado.",
"infoDialog_writeconf_error_text": "Error al guardar la configuración.",
"infoDialog_import_jsonerror_text": "El archivo de configuración seleccionado \"$1\" no es un archivo .json o está dañado. Mensaje de error: ($2)",
"infoDialog_import_hyperror_text": "No se puede importar el archivo de configuración seleccionado \"$1\". ¡No es compatible con Hyperion 2.0 y superior!",
"infoDialog_import_reverror_text": "La revisión de tu archivo de configuración \"$1\" no coincide con la versión actual de Hyperion que ejecuta (Archivo: $2, Hyperion: $3). ¡Podrías importar las configuraciones correspondientes!",
"infoDialog_import_comperror_text": ":( Tu navegador no admite una importación. Inténtalo de nuevo con otro navegador.",
"infoDialog_import_confirm_title": "Confirmar importación",
"infoDialog_import_confirm_text": "¿Estás seguro de importar \"$1\"? ¡Este proceso no puede revertirse!",
"wiz_rgb_title": "Asistente para Órden de Bytes RGB",
"wiz_rgb_intro1": "Este asistente te guiará a través del proceso de búsqueda del orden de color correcto para tus leds. Haz clic en continuar para comenzar.",
"wiz_rgb_intro2": "¿Cuándo necesitas este asistente? Ejemplo: Estableces el color rojo, pero obtienes verde o azul. También lo puedes utilizar para la primera configuración.",
"wiz_rgb_expl": "El punto de color cambia cada x segundos el color (rojo, verde), al mismo tiempo que tus leds cambian el color también. Responde las preguntas en la parte inferior para verificar/corregir tu orden de bytes.",
"wiz_rgb_switchevery": "Cambiar el color cada...",
"wiz_rgb_q": "¿Qué color muestran tus leds, cuando el punto de color de arriba muestra ...",
"wiz_rgb_qrend": "...rojo?",
"wiz_rgb_qgend": "...verde?",
"wiz_hue_title": "Asistente Puente de Matiz",
"wiz_hue_intro1": "Con este ayudante de configuración puedes obtener un nuevo usuario para tu Puente de Matiz y puedes ver tus luces con las ID para la Configuración de Hyperion.",
"wiz_hue_intro2": "Recuerda: esto es sólo un asistente. Tienes que copiar y pegarlos en tu config.",
"wiz_hue_ip": "IP Puente de Matiz:",
"wiz_hue_username": "Nombre de usuario:",
"wiz_hue_create_user": "Crear Usuario",
"wiz_hue_failure_ip": "Comprueba tu dirección IP.",
"wiz_hue_failure_connection": "El tiempo de conexión expiró. Por favor, pulsa el botón a tiempo.",
"wiz_hue_press_link": "Por favor, presione el botón de enlace en el Puente de Matiz.",
"wiz_cc_title": "Asistente de calibración de color",
"wiz_cc_intro1": "Este asistente te guiará a través de la calibración led. Si estás utilizando Kodi, las imágenes de calibración y los videos se pueden enviar directamente a kodi sin más tareas de tu lado. Si no, necesitas descargar estos archivos tú mismo y aplicarlos, si el asistente lo desea.",
"wiz_cc_kwebs": "Servidor web Kodi (IP:PUERTO)",
"wiz_cc_kodidiscon": "No se encuentra el servidor web de Kodi, procede sin el soporte de Kodi.",
"wiz_cc_kodidisconlink": "Descarga enlaces de imagenes:",
"wiz_cc_kodicon": "Servidor web Kodi encontrado, proceder con el soporte de Kodi.",
"wiz_cc_kodimsg_start": "Prueba con éxito - ¡tiempo de continuar!",
"wiz_cc_kodishould": "Kodi debería la siguiente imagen: $1",
"wiz_cc_lettvshow": "Deja que tu TV muestre la siguiente imagen: $1",
"wiz_cc_lettvshowm": "Comprueba esto con las siguientes imágenes: $1",
"wiz_cc_adjustit": "Ajusta tu \"$1\", hasta que estés agusto con él. Ten en cuenta: Cuanto más lo ajustes fuera del valor predeterminado, el espectro de color será limitado (también para todos los colores intermedios). Dependiendo del espectro de color de TV/LED, los resultados variarán.",
"wiz_cc_adjustgamma": "Gamma: What you have to do is, adjust gamma levels of each channel until you have the same perceived amount of each channel. For example, if your Grey is a bit reddish it means that you have to increase red gamma to reduce the amount of red (the more gamma, the less amount of color).",
"wiz_cc_chooseid": "Define un nombre para éste perfil.",
"wiz_cc_btn_switchpic": "Cambiar imagen",
"wiz_cc_backlight": "Adicionalmente podrías definir una retroiluminación para solucionar \"malos colores\" en áreas casi oscuras o si no te gusta el cambio entre color y apagado durante la observación. Adicionalmente se podría definir si debe haber algún color en ella o simplemente blanco. Esto se desactiva durante el estado \"Off\", \"Color\" y \"Efecto\".",
"wiz_cc_testintro": "¡Tiempo para una prueba real!",
"wiz_cc_testintrok": "Pulsa un botón de abajo para iniciar un vídeo de prueba.",
"wiz_cc_testintrowok": "Haz el siguiente enlace para descargar videos de prueba:",
"wiz_cc_link": "¡Haz click en mi!",
"wiz_cc_morethanone": "Tienes más de un perfil, elije el perfil que deseas calibrar.",
"wiz_cc_btn_stop": "Parar vídeo",
"wiz_cc_summary": "Una conclusión de su configuración. Durante la reproducción de vídeo, puede cambiar o probar valores de nuevo. Si está hecho, haga clic en guardar.",
"edt_dev_enum_subtract_minimum": "Restar mínimo",
"edt_dev_enum_sub_min_warm_adjust": "Min. Ajuste caliente",
"edt_dev_enum_white_off": "Blanco apagado",
"edt_dev_general_heading_title": "Configuración general",
"edt_dev_general_name_title": "Nombre de configuración",
"edt_dev_general_ledCount_title": "Cuenta de todos los LED hardware",
"edt_dev_general_colorOrder_title": "Orden de bytes RGB",
"edt_dev_general_rewriteTime_title": "Tiempo de actualización",
"edt_dev_spec_header_title": "Ajustes Específicos",
"edt_dev_spec_baudrate_title": "Tasa de baudios",
"edt_dev_spec_spipath_title": "Ruta SPI",
"edt_dev_spec_invert_title": "Invertir señal",
"edt_dev_spec_multicastGroup_title": "Grupo multidifusión",
"edt_dev_spec_numberOfLeds_title": "Número de LEDs",
"edt_dev_spec_port_title": "Puerto",
"edt_dev_spec_orbIds_title": "ID(s) Orb",
"edt_dev_spec_useOrbSmoothing_title": "Utilizar suavizado de orbe",
"edt_dev_spec_targetIp_title": "IP de destino",
"edt_dev_spec_targetIpHost_title": "IP de destino/nombre de host",
"edt_dev_spec_outputPath_title": "Ruta de salida",
"edt_dev_spec_delayAfterConnect_title": "Retraso después de la conexión",
"edt_dev_spec_FCsetConfig_title": "Establecer configuración fadecandy",
"edt_dev_spec_FCmanualControl_title": "Control manual del LED fadecandy",
"edt_dev_spec_FCledToOn_title": "Fadecandy LED encendido",
"edt_dev_spec_interpolation_title": "Interpolación",
"edt_dev_spec_dithering_title": "Tintineo",
"edt_dev_spec_gamma_title": "Gamma",
"edt_dev_spec_whitepoint_title": "Punto blanco",
"edt_dev_spec_username_title": "Nombre de usuario",
"edt_dev_spec_lightid_title": "ID(s) de luz",
"edt_dev_spec_lightid_itemtitle": "ID",
"edt_dev_spec_transistionTime_title": "Tiempo de transición",
"edt_dev_spec_switchOffOnBlack_title": "Apagar en negro",
"edt_dev_spec_uid_title": "UID",
"edt_dev_spec_intervall_title": "Intervalo",
"edt_dev_spec_latchtime_title": "Tiempo de cierre",
"edt_dev_spec_maxPacket_title": "Paquete máximo",
"edt_dev_spec_serial_title": "Número de serie",
"edt_dev_spec_vid_title": "VID",
"edt_dev_spec_pid_title": "PID",
"edt_dev_spec_cid_title": "CID",
"edt_dev_spec_LBap102Mode_title": "Modo LightBerry APA102",
"edt_dev_spec_universe_title": "Universo",
"edt_dev_spec_whiteLedAlgor_title": "Algoritmo LED blanco",
"edt_dev_spec_useRgbwProtocol_title": "Utilizar el protocolo RGBW",
"edt_dev_spec_maximumLedCount_title": "Número máximo de LEDs",
"edt_dev_spec_gpioNumber_title": "Número GPIO",
"edt_dev_spec_gpioMap_title": "Mapeo GPIO",
"edt_dev_spec_PBFiFo_title": "Pi-Blaster FiFo",
"edt_dev_spec_gpioBcm_title": "Pin GPIO",
"edt_dev_spec_ledIndex_title": "Índice LED",
"edt_dev_spec_colorComponent_title": "Componente de color",
"edt_conf_general_enable_title": "Activar",
"edt_conf_general_enable_expl": "Si está marcada, el componente está habilitado",
"edt_conf_general_priority_title": "Canal prioritario",
"edt_conf_general_priority_expl": "La prioridad de este componente",
"edt_conf_general_port_title": "Puerto",
"edt_conf_general_port_expl": "El puerto que se utiliza.",
"edt_conf_enum_color": "Color",
"edt_conf_enum_effect": "Efecto",
"edt_conf_enum_multicolor_mean": "Multicolor",
"edt_conf_enum_unicolor_mean": "Unicolor",
"edt_conf_enum_rgb": "RGB",
"edt_conf_enum_bgr": "BGR",
"edt_conf_enum_rbg": "RBG",
"edt_conf_enum_brg": "BRG",
"edt_conf_enum_gbr": "GBR",
"edt_conf_enum_grb": "GRB",
"edt_conf_enum_linear": "Lineal",
"edt_conf_enum_PAL": "PAL",
"edt_conf_enum_NTSC": "NTSC",
"edt_conf_enum_logsilent": "Silencio",
"edt_conf_enum_logwarn": "Advertencia",
"edt_conf_enum_logverbose": "Detallado",
"edt_conf_enum_logdebug": "Depurar",
"edt_conf_enum_bbdefault": "Predeterminado",
"edt_conf_enum_bbclassic": "Clásico",
"edt_conf_enum_bbosd": "OSD",
"edt_conf_gen_heading_title": "Configuración General",
"edt_conf_gen_name_title": "Nombre de configuración",
"edt_conf_gen_name_expl": "Un nombre definido por el usuario que se utiliza para detectar Hyperion. (Útil con más de una instancia de Hyperion)",
"edt_conf_gen_showOptHelp_title": "Mostrar explicaciones",
"edt_conf_gen_showOptHelp_expl": "Muestra todas las explicaciones disponibles en cada sección. ¡Muy recomendable para principiantes!",
"edt_conf_color_heading_title": "Calibración de Color",
"edt_conf_color_channelAdjustment_header_itemtitle": "Perfil",
"edt_conf_color_channelAdjustment_header_title": "Ajustes del canal de color",
"edt_conf_color_imageToLedMappingType_title": "Asignación de área led",
"edt_conf_color_imageToLedMappingType_expl": "Sobreescribe la asignación del área led de su disposicion led si no es \"multicolor\"",
"edt_conf_color_id_title": "ID",
"edt_conf_color_id_expl": "Nombre dado al usuario",
"edt_conf_color_leds_title": "Índice LED",
"edt_conf_color_leds_expl": "Asigne este ajuste a todos los leds (*) o sólo algunos (0-24).",
"edt_conf_color_black_title": "negro",
"edt_conf_color_black_expl": "El valor negro calibrado.",
"edt_conf_color_white_title": "blanco",
"edt_conf_color_white_expl": "El valor blanco calibrado.",
"edt_conf_color_red_title": "rojo",
"edt_conf_color_red_expl": "El valor rojo calibrado.",
"edt_conf_color_green_title": "verde",
"edt_conf_color_green_expl": "El valor verde calibrado.",
"edt_conf_color_blue_title": "azul",
"edt_conf_color_blue_expl": "El valor azulcalibrado.",
"edt_conf_color_cyan_title": "cyan",
"edt_conf_color_cyan_expl": "El valor cian calibrado.",
"edt_conf_color_magenta_title": "magenta",
"edt_conf_color_magenta_expl": "El valor magenta calibrado.",
"edt_conf_color_yellow_title": "amarillo",
"edt_conf_color_yellow_expl": "El valor amarillo calibrado.",
"edt_conf_color_gammaRed_title": "Rojo gamma",
"edt_conf_color_gammaRed_expl": "El gamma de rojo.",
"edt_conf_color_gammaGreen_title": "verde gamma",
"edt_conf_color_gammaGreen_expl": "El gamma del verde.",
"edt_conf_color_gammaBlue_title": "azul gamma",
"edt_conf_color_gammaBlue_expl": "El gamma del azul.",
"edt_conf_color_backlightThreshold_title": "Umbral de retroiluminación",
"edt_conf_color_backlightThreshold_expl": "La cantidad mínima de brillo (retroiluminación). Desactivado durante los efectos, colores y en estado \"Off\"",
"edt_conf_color_backlightColored_title": "Retroiluminación colorida",
"edt_conf_color_backlightColored_expl": "Añada un poco de color a su retroiluminación.",
"edt_conf_color_brightness_title": "Brillo máximo",
"edt_conf_color_brightness_expl": "De 0,0 a 0,5 el brillo se lineariza, de 0,5 a 1,0 cian, magenta, amarillo es hasta 2x más brillante y blanco 3x.",
"edt_conf_smooth_heading_title": "Suavizado",
"edt_conf_smooth_type_title": "Tipo",
"edt_conf_smooth_type_expl": "Tipo de suavizado",
"edt_conf_smooth_time_ms_title": "Tiempo",
"edt_conf_smooth_time_ms_expl": "¿Cuánto tiempo debe recoger las imágenes el suavizado?",
"edt_conf_smooth_updateFrequency_title": "Frecuencia de actualización",
"edt_conf_smooth_updateFrequency_expl": "La velocidad de salida a tu controlador led.",
"edt_conf_smooth_updateDelay_title": "Retardo de actualización",
"edt_conf_smooth_updateDelay_expl": "Atrasa la salida en caso de que la luz ambiente sea más rápida que tu TV.",
"edt_conf_smooth_continuousOutput_title": "Salida continua",
"edt_conf_smooth_continuousOutput_expl": "Actualizar los leds incluso si no hay cambio de imagen.",
"edt_conf_v4l2_heading_title": "Captura USB",
"edt_conf_v4l2_device_title": "Dispositivo",
"edt_conf_v4l2_device_expl": "La ruta a la captura USB.",
"edt_conf_v4l2_input_title": "Entrada",
"edt_conf_v4l2_input_expl": "Entrada de esta ruta.",
"edt_conf_v4l2_standard_title": "Estándar de vídeo",
"edt_conf_v4l2_standard_expl": "Selecciona el estándar de vídeo para tu región.",
"edt_conf_v4l2_width_title": "Anchura",
"edt_conf_v4l2_width_expl": "El ancho de la imagen. (-1 = ancho automático)",
"edt_conf_v4l2_height_title": "Altura",
"edt_conf_v4l2_height_expl": "El alto de la imagen. (-1 = ancho automático)",
"edt_conf_v4l2_frameDecimation_title": "Diezmación de fotograma",
"edt_conf_v4l2_frameDecimation_expl": "El factor de diezmación del fotograma",
"edt_conf_v4l2_sizeDecimation_title": "Diezmación de tamaño",
"edt_conf_v4l2_sizeDecimation_expl": "El factor de diezmación del tamaño",
"edt_conf_v4l2_mode_title": "Modo",
"edt_conf_v4l2_mode_expl": "Modos de captura USB",
"edt_conf_v4l2_useKodiChecker_title": "Utilizar Observador Kodi",
"edt_conf_v4l2_useKodiChecker_expl": "Iniciar/detener la captura con los resultados del Observador Kodi.",
"edt_conf_v4l2_cropLeft_title": "Cortar izquierda",
"edt_conf_v4l2_cropLeft_expl": "Cuenta de píxeles en la parte izquierda que se quitan de la imagen.",
"edt_conf_v4l2_cropRight_title": "Cortar derecha",
"edt_conf_v4l2_cropRight_expl": "Cuenta de píxeles en la parte derecha que se quitan de la imagen.",
"edt_conf_v4l2_cropTop_title": "Cortar arriba",
"edt_conf_v4l2_cropTop_expl": "Cuenta de píxeles en la parte superior que se quitan de la imagen.",
"edt_conf_v4l2_cropBottom_title": "Cortar abajo",
"edt_conf_v4l2_cropBottom_expl": "Cuenta de píxeles en la parte inferior que se quitan de la imagen.",
"edt_conf_v4l2_redSignalThreshold_title": "Umbral de señal rojo",
"edt_conf_v4l2_redSignalThreshold_expl": "Oscurece los valores bajos de color rojo (reconocidos como negros)",
"edt_conf_v4l2_greenSignalThreshold_title": "Umbral de señal verde",
"edt_conf_v4l2_greenSignalThreshold_expl": "Oscurece los valores bajos de color verde (reconocidos como negros)",
"edt_conf_v4l2_blueSignalThreshold_title": "Umbral de señal azul",
"edt_conf_v4l2_blueSignalThreshold_expl": "Oscurece los valores bajos de color azul (reconocidos como negros)",
"edt_conf_fg_heading_title": "Captura de Plataforma",
"edt_conf_fg_type_title": "Tipo",
"edt_conf_fg_type_expl": "Tipo de captura de plataforma, por defecto es 'auto'",
"edt_conf_fg_frequency_Hz_title": "Frecuencia de captura",
"edt_conf_fg_frequency_Hz_expl": "Cómo de rápido se capturan las nuevas imágenes",
"edt_conf_fg_horizontalPixelDecimation_title": "Diezmo horizontal de píxeles",
"edt_conf_fg_horizontalPixelDecimation_expl": "Diezmo horizontal de píxeles (factor)",
"edt_conf_fg_useXGetImage_title": "Utilizar XGetImage",
"edt_conf_fg_useXGetImage_expl": "XGetImage para los nuevos escritorios X11",
"edt_conf_fg_verticalPixelDecimation_title": "Diezmo vertical de píxeles",
"edt_conf_fg_verticalPixelDecimation_expl": "Diezmo vertical de píxeles (factor)",
"edt_conf_fg_device_title": "Dispositivo",
"edt_conf_fg_display_title": "Visualización",
"edt_conf_fg_display_expl": "Selecciona qué escritorio debe ser capturado (configuración de varios monitores)",
"edt_conf_bb_heading_title": "Detector de bordes negros",
"edt_conf_bb_threshold_title": "Umbral",
"edt_conf_bb_threshold_expl": "Si la detección no funciona, Sube el umbral para ajustar en negro \"grisáceo\"",
"edt_conf_bb_unknownFrameCnt_title": "unknownFrameCnt",
"edt_conf_bb_borderFrameCnt_title": "borderFrameCnt",
"edt_conf_bb_maxInconsistentCnt_title": "maxInconsistentCn",
"edt_conf_bb_blurRemoveCnt_title": "blurRemoveCnt",
"edt_conf_bb_mode_title": "Modo",
"edt_conf_bb_mode_expl": "Algoritmo para procesamiento. (Ver Wiki)",
"edt_conf_kodic_heading_title": "Observador Kodi",
"edt_conf_kodic_kodiAddress_title": "Dirección IP de Kodi",
"edt_conf_kodic_kodiAddress_expl": "La dirección IP de Kodi.",
"edt_conf_kodic_kodiTcpPort_title": "Puerto TCP de Kodi",
"edt_conf_kodic_kodiTcpPort_expl": "El puerto TCP de Kodi. ¡No uses el puerto del servidor web!",
"edt_conf_kodic_grabVideo_title": "Vídeo",
"edt_conf_kodic_grabVideo_expl": "Si está activada, la captura se activará durante la reproducción de vídeo, de lo contrario se deshabilitará.",
"edt_conf_kodic_grabPictures_title": "Imágenes",
"edt_conf_kodic_grabPictures_expl": "Si se selecciona, la captura se habilita en la reproducción de imágenes, de lo contrario está deshabilitada.",
"edt_conf_kodic_grabAudio_title": "Audio",
"edt_conf_kodic_grabAudio_expl": "Si se selecciona, la captura se habilita durante la reproducción de audio, de lo contrario está deshabilitada.",
"edt_conf_kodic_grabMenu_title": "Menú",
"edt_conf_kodic_grabMenu_expl": "Si está marcada, la captura está habilitada en el menú y en la pantalla de inicio de sesión, de lo contrario está desactivada.",
"edt_conf_kodic_grabPause_title": "Pausa",
"edt_conf_kodic_grabPause_expl": "Si está seleccionada, la captura se habilita en el modo de pausa (Música, Vídeo, Diapositivas), de lo contrario está desactivada.",
"edt_conf_kodic_grabScreensaver_title": "Salvapantallas",
"edt_conf_kodic_grabScreensaver_expl": "Si está marcada, la captura se habilita durante el salvapantallas, de lo contrario está deshabilitada.",
"edt_conf_kodic_enable3DDetection_title": "Detectar 3D",
"edt_conf_kodic_enable3DDetection_expl": "Detecta en qué modo 3D 3D se está ejecutando Kodi. (No MVC y no para la captura USB)",
"edt_conf_fge_heading_title": "Efecto/Color de Arranque",
"edt_conf_fge_type_title": "Tipo",
"edt_conf_fge_type_expl": "Elige entre un color o efecto.",
"edt_conf_fge_color_title": "Color",
"edt_conf_fge_color_expl": "Si el tipo es \"Color\", selecciona un color de tu elección.",
"edt_conf_fge_effect_title": "Efecto",
"edt_conf_fge_effect_expl": "Si el tipo es \"Efecto\", selecciona un efecto de tu elección (también efectos creados por ti mismo).",
"edt_conf_fge_duration_ms_title": "Duración",
"edt_conf_fge_duration_ms_expl": "Duración del Efecto/Color durante el inicio de Hyperion.",
"edt_conf_bge_heading_title": "Efecto de fondo/Color",
"edt_conf_fw_heading_title": "Expedidor",
"edt_conf_fw_json_title": "Lista de clientes JSON",
"edt_conf_fw_json_expl": "Un destino json por línea. Contiene IP:PUERTO (Ejemplo: 127.0.0.1:19446)",
"edt_conf_fw_json_itemtitle": "Destino json",
"edt_conf_fw_proto_title": "Lista de clientes proto",
"edt_conf_fw_proto_expl": "Un destino proto por línea. Contiene IP:PUERTO (Ejemplo: 127.0.0.1:19446)",
"edt_conf_fw_proto_itemtitle": "Destino proto",
"edt_conf_js_heading_title": "Servidor JSON",
"edt_conf_ps_heading_title": "Servidor PROTO",
"edt_conf_bobls_heading_title": "Servidor Boblight",
"edt_conf_udpl_heading_title": "Oyente UDP",
"edt_conf_udpl_address_title": "Dirección",
"edt_conf_udpl_address_expl": "La dirección donde se aceptan paquetes UDP.",
"edt_conf_udpl_timeout_title": "Tiempo muerto",
"edt_conf_udpl_timeout_expl": "Si no se reciben paquetes durante el período especificado, el componente se desactivará (suavemente).",
"edt_conf_udpl_shared_title": "Compartido",
"edt_conf_udpl_shared_expl": "Compartido entre todas las instancias de Hyperion.",
"edt_conf_webc_heading_title": "Configuración web",
"edt_conf_webc_docroot_title": "Documento raíz",
"edt_conf_webc_docroot_expl": "Ruta raíz de la interfaz web local (sólo para desarrolladores webui)",
"edt_conf_effp_heading_title": "Rutas del efecto",
"edt_conf_effp_paths_title": "Ruta(s) del efecto",
"edt_conf_effp_paths_itemtitle": "Ruta",
"edt_conf_effp_disable_title": "Efectos Deshabilitados",
"edt_conf_effp_disable_itemtitle": "Efecto",
"edt_conf_log_heading_title": "Registrando",
"edt_conf_log_level_title": "Nivel de registro",
"edt_conf_log_level_expl": "Dependiendo del nivel de registro verás menos o más mensajes en tu registro.",
"edt_eff_candle_header_title": "Vela",
"edt_eff_police_header_title": "Policía",
"edt_eff_fade_header_title": "Fundido",
"edt_eff_rainbowmood_header_title": "Ánimo Arcoiris",
"edt_eff_knightrider_header_title": "Coche Fantástico",
"edt_eff_lightclock_header_title": "Reloj 1",
"edt_eff_clock_header_title": "Reloj 2",
"edt_eff_pacman_header_title": "Come-Cocos",
"edt_eff_moodblobs_header_title": "Ánimo Gotas",
"edt_eff_rainbowswirl_header_title": "Remolino Arcoiris",
"edt_eff_random_header_title": "Aleatorio",
"edt_eff_runningdots_header_title": "Puntos Corriendo",
"edt_eff_systemshutdown_header_title": "Apagado del Sistema",
"edt_eff_snake_header_title": "Serpiente",
"edt_eff_sparks_header_title": "Chispas",
"edt_eff_storbe_header_title": "Estroboscópico",
"edt_eff_traces_header_title": "Rastros de Color",
"edt_eff_x-mas_header_title": "Navidad",
"edt_eff_trails_header_title": "Caminos",
"edt_eff_enum_all": "Todo",
"edt_eff_enum_all-together": "Todo junto",
"edt_eff_enum_list": "Lista LED",
"edt_eff_count_title": "Cuenta",
"edt_eff_color_title": "Color",
"edt_eff_colorrandom_title": "Color aleatório",
"edt_eff_colorone_title": "Color uno",
"edt_eff_colortwo_title": "Color dos",
"edt_eff_colorcount_title": "Longitud de color",
"edt_eff_rotationtime_title": "Tiempo de rotación",
"edt_eff_sleeptime_title": "Hora de dormir",
"edt_eff_reversedirection_title": "Dirección inversa",
"edt_eff_fadetime_title": "Tiempo de fundido",
"edt_eff_colorstart_title": "Color de inicio",
"edt_eff_colorend_title": "Color final",
"edt_eff_colorshift_title": "Cambio de Color",
"edt_eff_whichleds_title": "Qué Leds",
"edt_eff_ledlist_title": "Lista Led",
"edt_eff_speed_title": "Velocidad",
"edt_eff_fadefactor_title": "Factor de fundido",
"edt_eff_showseconds_title": "Mostrar segundos",
"edt_eff_blobcount_title": "Contador de gotas",
"edt_eff_huechange_title": "Cambio de color",
"edt_eff_basecolorchange_title": "Cambio de color base",
"edt_eff_basecolorchangerate_title": "Proporción de cambio de BC",
"edt_eff_basecolorrangeleft_title": "Gama BC izquierda",
"edt_eff_basecolorrangeright_title": "Gama BC derecha",
"edt_eff_brightness_title": "Brillo",
"edt_eff_centerx_title": "Centrar Eje-X",
"edt_eff_centery_title": "Centrar Eje-Y",
"edt_eff_saturation_title": "Saturación",
"edt_eff_colorevel_title": "Nivel de color",
"edt_eff_whitelevel_title": "Nivel de blanco",
"edt_eff_alarmcolor_title": "Color de alarma",
"edt_eff_postcolor_title": "Post color",
"edt_eff_enableshutdown_title": "Apagado real",
"edt_eff_length_title": "Longitud",
"edt_eff_frequency_title": "Frecuencia",
"edt_eff_min_len_title": "Longitud mínima",
"edt_eff_max_len_title": "Longitud máxima",
"edt_eff_height_title": "Altura",
"edt_eff_offset_title": "Compensación",
"edt_eff_colorHour_title": "Color de hora",
"edt_eff_colorMinute_title": "Color de minuto",
"edt_eff_colorSecond_title": "Color de segundo",
"edt_eff_hourMargin_title": "Hora de margen",
"edt_eff_minuteMargin_title": "Minuto de margen",
"edt_eff_secondMargin_title": "Segundo de margen",
"edt_eff_margin_title": "Margen",
"edt_eff_colorMarker_title": "Marcador de color",
"edt_append_ns": "ns",
"edt_append_ms": "ms",
"edt_append_s": "s",
"edt_append_hz": "Hz",
"edt_append_pixel": "Píxel",
"edt_append_percent": "%",
"edt_append_degree": "º",
"edt_append_sdegree": "s/grado",
"edt_append_leds": "LEDs",
"edt_msg_error_notset": "La propiedad debe establecerse",
"edt_msg_error_notempty": "Valor requerido",
"edt_msg_error_enum": "El valor debe ser uno de los valores enumerados",
"edt_msg_error_anyOf": "El valor debe validarse contra al menos uno de los esquemas proporcionados",
"edt_msg_error_oneOf": "El valor debe validarse contra exactamente uno de los esquemas proporcionados. Actualmente valida contra $1 de los esquemas.",
"edt_msg_error_not": "El valor no debe validarse contra el esquema proporcionado",
"edt_msg_error_type_union": "El valor debe ser uno de los tipos proporcionados",
"edt_msg_error_type": "El valor debe ser del tipo $1",
"edt_msg_error_disallow_union": "El valor no debe ser uno de los tipos no permitidos",
"edt_msg_error_disallow": "El valor no debe ser del tipo $1",
"edt_msg_error_multipleOf": "El valor debe ser múltiplo de $1",
"edt_msg_error_maximum_excl": "El valor debe ser menos de $1",
"edt_msg_error_maximum_incl": "El valor debe ser como máximo $1",
"edt_msg_error_minimum_excl": "El valor debe ser mayor de $1",
"edt_msg_error_minimum_incl": "El valor debe ser al menos $1",
"edt_msg_error_maxLength": "El valor debe tener un máximo de $1 caracteres",
"edt_msg_error_minLength": "El valor debe tener un mínimo de $1 caracteres",
"edt_msg_error_pattern": "El valor debe coincidir con el patrón",
"edt_msg_error_additionalItems": "No se permiten elementos adicionales en esta formación",
"edt_msg_error_maxItems": "El valor debe tener como máximo $1",
"edt_msg_error_minItems": "El valor debe tener como mínimo $1",
"edt_msg_error_uniqueItems": "Formación debe tener elementos únicos",
"edt_msg_error_maxProperties": "El objeto debe tener como máximo $1 propiedades",
"edt_msg_error_minProperties": "El objeto debe tener como mínimo $1 propiedades",
"edt_msg_error_required": "Al objeto le falta la propiedad necesaria '$1'",
"edt_msg_error_additional_properties": "No se permiten propiedades adicionales, pero la propiedad $1 se establece",
"edt_msg_error_dependency": "Debe tener propiedad $1",
"edt_msg_button_delete_all": "Todo",
"edt_msg_button_delete_all_title": "Eliminar Todo",
"edt_msg_button_delete_last": "Último $1",
"edt_msg_button_delete_last_title": "Eliminar Último $1",
"edt_msg_button_add_row_title": "Añadir $1",
"edt_msg_button_move_down_title": "Mover abajo",
"edt_msg_button_move_up_title": "Mover arriba",
"edt_msg_button_delete_row_title": "Eliminar $1",
"edt_msg_button_delete_row_title_short": "Eliminar",
"edt_msg_button_collapse": "Colapsar",
"edt_msg_button_expand": "Expandir",
"@metadata": {
"authors": [
"brindosch"
],
"project": "WebUI Hyperion",
"locale": "en",
"last-updated": "2016-11-30",
"message-documentation": "qqq.json"
},
"edt_conf_color_channelAdjustment_header_expl": "Ajustes para color, brillo, linealización y más.",
"general_speech_es": "Español"
}

View File

@ -0,0 +1,47 @@
{
"@metadata": {
"authors": [
"brindosch"
],
"project" : "Hyperion WebUI string docu",
"last-updated": "2016-11-30"
},
"edt_msg_error_notset" : " When a property is not set",
"edt_msg_error_notempty" : "When a string must not be empty",
"edt_msg_error_enum" : "When a value is not one of the enumerated values",
"edt_msg_error_anyOf" : "When a value doesn't validate any schema of a 'anyOf' combination",
"edt_msg_error_oneOf" : "When a value doesn't validate. $1 = This key takes one variable: The number of schemas the value does not validate",
"edt_msg_error_not" : "When a value does not validate a 'not' schema",
"edt_msg_error_type_union" : "When a value does not match any of the provided types",
"edt_msg_error_type" : "When a value does not match the given type. $1 = This key takes one variable: The type the value should be of",
"edt_msg_error_disallow_union" : "When the value validates one of the disallowed types",
"edt_msg_error_disallow" : "When the value validates a disallowed type. $1 = This key takes one variable: The type the value should not be of",
"edt_msg_error_multipleOf" : "When a value is not a multiple of or divisible by a given number. $1 = This key takes one variable: The number mentioned above",
"edt_msg_error_maximum_excl" : "When a value is greater than it's supposed to be (exclusive). $1 = This key takes one variable: The maximum",
"edt_msg_error_maximum_incl" : "When a value is greater than it's supposed to be (inclusive). $1 = This key takes one variable: The maximum",
"edt_msg_error_minimum_excl" : "When a value is lesser than it's supposed to be (exclusive). $1 = This key takes one variable: The minimum",
"edt_msg_error_minimum_incl" : "When a value is lesser than it's supposed to be (inclusive). $1 = This key takes one variable: The minimum",
"edt_msg_error_maxLength" : "When a value have too many characters. $1 = This key takes one variable: The maximum character count",
"edt_msg_error_minLength" : "When a value does not have enough characters. $1 = This key takes one variable: The minimum character count",
"edt_msg_error_pattern" : "When a value does not match a given pattern.",
"edt_msg_error_additionalItems" : "When an array has additional items whereas it is not supposed to",
"edt_msg_error_maxItems" : "When there are to many items in an array. $1 = This key takes one variable: The maximum item count",
"edt_msg_error_minItems" : "When there are not enough items in an array. $1 = This key takes one variable: The minimum item count",
"edt_msg_error_uniqueItems" : "When an array is supposed to have unique items but has duplicates",
"edt_msg_error_maxProperties" : "When there are too many properties in an object. $1 = This key takes one variable: The maximum property count",
"edt_msg_error_minProperties" : " When there are not enough properties in an object. $1 = This key takes one variable: The minimum property count",
"edt_msg_error_required" : "When a required property is not defined. $1 = This key takes one variable: The name of the missing property",
"edt_msg_error_additional_properties" : "When there is an additional property is set whereas there should be none. $1 = This key takes one variable: The name of the additional property",
"edt_msg_error_dependency" : "When a dependency is not resolved. $1 = This key takes one variable: The name of the missing property for the dependency",
"edt_msg_button_delete_all" : "Text on Delete All buttons",
"edt_msg_button_delete_all_title" : "Title on Delete All buttons",
"edt_msg_button_delete_last" : "Text on Delete Last buttons. $1 = This key takes one variable: The title of object to delete",
"edt_msg_button_delete_last_title" : "Text on Delete Last buttons. $1 = This key takes one variable: The title of object to delete",
"edt_msg_button_add_row_title" : "Title on Add Row buttons. $1 = This key takes one variable: The title of object to add",
"edt_msg_button_move_down_title" : "Title on Move Down buttons",
"edt_msg_button_move_up_title" : "Title on Move Up buttons",
"edt_msg_button_delete_row_titlet" : "Title on Delete Row buttons. $1 = This key takes one variable: The title of object to delete",
"edt_msg_button_delete_row_title_short" : "Title on Delete Row buttons, short version (no parameter with the object title)",
"edt_msg_button_collapse" : "Title on Collapse buttons",
"edt_msg_button_expand" : "Title on Expand buttons"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

@ -1,74 +1,55 @@
<!DOCTYPE html>
<html lang="en">
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0' name='viewport' />
<meta name="description" content="">
<title>Hyperion - WebUI</title>
<title data-i18n="general_webui_title">Hyperion - Error</title>
<!-- jQuery -->
<script src="js/lib/jquery.min.js"></script>
<script src="/js/lib/jquery.min.js"></script>
<!-- Hyperion -->
<script src="js/hyperion.js"></script>
<script src="js/ui_utils.js"></script>
<script src="/js/hyperion.js"></script>
<script src="/js/ui_utils.js"></script>
<!-- textarea -->
<script src="js/lib/jquery-linedtextarea.js"></script>
<link href="css/jquery-linedtextarea.css" type="text/css" rel="stylesheet" />
<script src="/js/lib/jquery-linedtextarea.js"></script>
<link href="/css/jquery-linedtextarea.css" type="text/css" rel="stylesheet" />
<!-- Colorpicker -->
<script src="js/lib/bootstrap-colorpicker.min.js"></script>
<link href="css/bootstrap-colorpicker.min.css" rel="stylesheet">
<script src="/js/lib/bootstrap-colorpicker.min.js"></script>
<link href="/css/bootstrap-colorpicker.min.css" rel="stylesheet">
<!-- JSONEditor -->
<script src="js/lib/jsoneditor.js"></script>
<script src="/js/lib/jsoneditor.js"></script>
<!--Language Support -->
<script src="js/lib/jquery-lang.js" charset="utf-8" type="text/javascript"></script>
<script src="js/lib/js.cookie.js"></script>
<!-- jquery ui -->
<link href="css/jquery-ui/jquery-ui.min.css" rel="stylesheet">
<link href="css/jquery-ui/jquery-ui.structure.min.css" rel="stylesheet">
<link href="css/jquery-ui/jquery-ui.theme.min.css" rel="stylesheet">
<script src="/js/lib/jquery.i18n.js"></script>
<script src="/js/lib/jquery.i18n.messagestore.js"></script>
<script src="/js/lib/jquery.i18n.fallbacks.js"></script>
<script src="/js/lib/jquery.i18n.parser.js"></script>
<script src="/js/lib/jquery.i18n.emitter.js"></script>
<script src="/js/lib/jquery.i18n.language.js"></script>
<script type="text/javascript">
// Create language switcher instance
var lang = new Lang();
lang.dynamic('de', 'lang/de.json');
lang.init({
defaultLang: 'en',
cookie: {
name: 'langCookie',
expiry: 365,
path: '/'
},
allowCookieOverride: true
});
</script>
<!-- Bootstrap Core CSS -->
<link href="css/bootstrap.css" rel="stylesheet">
<link href="/css/bootstrap.css" rel="stylesheet">
<!-- Flags -->
<link href="css/flag-icon.min.css" rel="stylesheet">
<link href="/css/flag-icon.min.css" rel="stylesheet">
<!-- MetisMenu CSS -->
<link href="css/metisMenu.css" rel="stylesheet">
<link href="/css/metisMenu.css" rel="stylesheet">
<!-- Custom CSS -->
<link href="css/sb-admin-2.css" rel="stylesheet">
<link href="css/hyperion.css" rel="stylesheet">
<link href="/css/sb-admin-2.css" rel="stylesheet">
<link href="/css/hyperion.css" rel="stylesheet">
<!-- Custom Fonts -->
<link href="css/font-awesome.min.css" rel="stylesheet" type="text/css">
<link href="/css/font-awesome.min.css" rel="stylesheet" type="text/css">
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
@ -76,148 +57,116 @@
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body>
<div id="loading_overlay"></div>
<noscript>
<div style="color:red;margin: 40px 0;text-align:center">
<img src="img/hyperion/hyperionlogo.png" alt="Redefine ambient light!">
<h3>Hyperion Web Configuration requires Javascript. Please enable Javascript in your browser for this page in order to use it!</h3>
</div>
<style type="text/css"> #loading_overlay, #wrapper{ display: none } </style>
</noscript>
<div id="loading_overlay" class="overlay"></div>
<div id="wrapper">
<!-- Navigation -->
<nav class="navbar navbar-default navbar-static-top" role="navigation" style="margin-bottom: 0">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<button type="button" class="navbar-toggle closed" aria-controls="navbar" style="background-color:#d0d0d0;">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar top-bar"></span>
<span class="icon-bar middle-bar"></span>
<span class="icon-bar bottom-bar"></span>
</button>
<a class="navbar-brand" href="/"><img src="img/hyperion/hyperionlogo.png" alt="Redefine ambient light!" height="55"></a>
<a class="navbar-brand" href="https://www.hyperion-project.org?pk_campaign=WebUI&pk_kwd=mainlogo" target="_blank"><img src="img/hyperion/hyperionlogo.png" alt="Redefine ambient light!" height="55"></a>
<a class="navbar-brand" href="/"><img src="img/hyperion/hyperionlostconnection.png" alt="Redefine ambient light!" style="display:none;"></a>
</div>
<!-- /.navbar-header -->
<ul class="nav navbar-top-links navbar-right">
<li class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
<i class="fa fa-globe fa-fw"></i> <i class="fa fa-caret-down"></i>
<li class="dropdown" id="btn_setlang">
<a>
<i class="fa fa-globe fa-fw"></i>
</a>
</li>
<li class="dropdown" id="btn_setaccess">
<a>
<i class="fa fa-key fa-fw"></i>
</a>
</li>
<li class="dropdown" id="btn_open_ledsim">
<a>
<i class="fa fa-television fa-fw"></i>
</a>
<ul class="dropdown-menu dropdown-language">
<li>
<a href="#lang-en" onclick="window.lang.change('en'); return false;"><span lang="en" class="flag-icon flag-icon-gb" data-lang-token="general_speech_en">&emsp; English</span></a>
</li>
<li class="divider"></li>
<li>
<a href="#lang-de" onclick="window.lang.change('de'); return false;"><span lang="en" class="flag-icon flag-icon-de" data-lang-token="general_speech_de">&emsp; German</span></a>
</li>
</ul>
<!-- /.dropdown-language -->
</li>
<!-- /.dropdown -->
<li class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
<i class="fa fa-bell fa-fw"></i> <i class="fa fa-caret-down"></i>
<i class="fa fa-magic fa-fw"></i> <i class="fa fa-caret-down"></i>
</a>
<ul class="dropdown-menu dropdown-alerts">
<li>
<a href="#">
<li id="btn_wizard_byteorder">
<a>
<div>
<i class="fa fa-comment fa-fw"></i> New Comment
<span class="pull-right text-muted small">4 minutes ago</span>
<i class="fa fa-magic fa-fw"></i>
<span data-i18n="wiz_rgb_title"></span>
</div>
</a>
</li>
<li class="divider"></li>
<li>
<a href="#">
<li id="btn_wizard_colorcalibration">
<a>
<div>
<i class="fa fa-twitter fa-fw"></i> 3 New Followers
<span class="pull-right text-muted small">12 minutes ago</span>
<i class="fa fa-magic fa-fw"></i>
<span data-i18n="wiz_cc_title"></span>
</div>
</a>
</li>
<li class="divider"></li>
<li>
<a href="#">
<li id="btn_wizard_philipshue">
<a>
<div>
<i class="fa fa-envelope fa-fw"></i> Message Sent
<span class="pull-right text-muted small">4 minutes ago</span>
<i class="fa fa-magic fa-fw"></i>
<span data-i18n="wiz_hue_title"></span>
</div>
</a>
</li>
<li class="divider"></li>
<li>
<a href="#">
<div>
<i class="fa fa-tasks fa-fw"></i> New Task
<span class="pull-right text-muted small">4 minutes ago</span>
</div>
</a>
</li>
<li class="divider"></li>
<li>
<a href="#">
<div>
<i class="fa fa-upload fa-fw"></i> Server Rebooted
<span class="pull-right text-muted small">4 minutes ago</span>
</div>
</a>
</li>
<li class="divider"></li>
<li>
<a class="text-center" href="#">
<strong>See All Alerts</strong>
<i class="fa fa-angle-right"></i>
</a>
</li>
</ul>
<!-- /.dropdown-alerts -->
</li>
<!-- /.dropdown -->
<li class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
<i class="fa fa-user fa-fw"></i> <i class="fa fa-caret-down"></i>
</a>
<ul class="dropdown-menu dropdown-user">
<li><a href="#"><i class="fa fa-user fa-fw"></i>User Profile</a>
</li>
<li><a href="#"><i class="fa fa-gear fa-fw"></i>Settings</a>
</li>
<li class="divider"></li>
<li><a href="login.html"><i class="fa fa-sign-out fa-fw"></i>Logout</a>
</li>
</ul>
<!-- /.dropdown-user -->
</li>
<!-- /.dropdown -->
</ul>
<!-- /.navbar-top-left -->
<div id="main-nav" class="navbar-default sidebar" role="navigation">
<div class="sidebar-nav navbar-collapse">
<ul class="nav" id="side-menu">
<li> <a class="active" id="load_dashboard"><i class="fa fa-dashboard fa-fw"></i><span lang="en" data-lang-token="main_menu_dashboard_token">Dashboard</span></a> </li>
<li> <a class="inactive mnava" href="#dashboard"><i class="fa fa-dashboard fa-fw"></i><span data-i18n="main_menu_dashboard_token">Dashboard</span></a> </li>
<li>
<a class="inactive"><i class="fa fa-cog fa-fw"></i><span lang="en" data-lang-token="main_menu_configuration_token">Configuration</span><span class="fa arrow"></span></a>
<a class="inactive"><i class="fa fa-cog fa-fw"></i><span data-i18n="main_menu_configuration_token">Configuration</span><span class="fa arrow"></span></a>
<ul class="nav nav-second-level">
<li> <a class="inactive" id="load_confLeds"><i class="fa fa-lightbulb-o fa-fw"></i><span lang="en" data-lang-token="main_menu_leds_conf_token">LED Hardware</span></a> </li>
<li> <a class="inactive" id="load_confGrabber"><i class="fa fa-camera fa-fw"></i><span lang="en" data-lang-token="main_menu_grabber_conf_token">Capturing Hardware</span></a> </li>
<li> <a class="inactive" id="load_confEffects"><i class="fa fa-spinner fa-fw"></i><span lang="en" data-lang-token="main_menu_effect_conf_token">Effects</span></a> </li>
<li> <a class="inactive" id="load_confColors"><i class="fa fa-photo fa-fw"></i><span lang="en" data-lang-token="main_menu_colors_conf_token">Image Processing</span></a> </li>
<li> <a class="inactive" id="load_confKodi"><i class="fa fa-play-circle-o fa-fw"></i><span lang="en" data-lang-token="main_menu_kodiwatch_token">KODI Connector</span></a> </li>
<li> <a class="inactive" id="load_confNetwork"><i class="fa fa-sitemap fa-fw"></i><span lang="en" data-lang-token="main_menu_network_conf_token">Network</span></a> </li>
<li> <a class="inactive mnava" href="#conf_general"><i class="fa fa-wrench fa-fw"></i><span data-i18n="main_menu_general_conf_token">General</span></a> </li>
<li> <a class="inactive mnava" href="#conf_leds"><i class="fa fa-lightbulb-o fa-fw"></i><span data-i18n="main_menu_leds_conf_token">LED Hardware</span></a> </li>
<li> <a class="inactive mnava" href="#conf_grabber"><i class="fa fa-camera fa-fw"></i><span data-i18n="main_menu_grabber_conf_token">Capturing Hardware</span></a> </li>
<li> <a class="inactive mnava" href="#conf_effect"><i class="fa fa-spinner fa-fw"></i><span data-i18n="main_menu_effect_conf_token">Effects</span></a> </li>
<li> <a class="inactive mnava" href="#conf_colors"><i class="fa fa-photo fa-fw"></i><span data-i18n="main_menu_colors_conf_token">Image Processing</span></a> </li>
<li> <a class="inactive mnava" href="#conf_kodi"><i class="fa fa-play-circle-o fa-fw"></i><span data-i18n="main_menu_kodiwatch_token">Kodi Watch</span></a> </li>
<li> <a class="inactive mnava" href="#conf_network"><i class="fa fa-sitemap fa-fw"></i><span data-i18n="main_menu_network_conf_token">Network</span></a> </li>
</ul>
</li>
<li> <a class="inactive" id="load_remote"><i class="fa fa-wifi fa-fw"></i><span lang="en" data-lang-token="main_menu_remotecontrol_token">Remote Control</span></a> </li>
<li> <a class="inactive" id="load_effectsconfig"><i class="fa fa-cogs fa-fw"></i><span lang="en" data-lang-token="main_menu_effectsconfigurator_token">Effects Configurator</span></a> </li>
<li> <a class="inactive" id="load_support"><i class="fa fa-info fa-fw"></i><span lang="en" data-lang-token="main_menu_support_token">Support</span></a> </li>
<li> <a class="inactive mnava" href="#remote"><i class="fa fa-wifi fa-fw"></i><span data-i18n="main_menu_remotecontrol_token">Remote Control</span></a> </li>
<li> <a class="inactive mnava" href="#effects_configurator"><i class="fa fa-cogs fa-fw"></i><span data-i18n="main_menu_effectsconfigurator_token">Effects Configurator</span></a> </li>
<li> <a class="inactive mnava" href="#support"><i class="fa fa-info fa-fw"></i><span data-i18n="main_menu_support_token">Support</span></a> </li>
<li>
<a class="inactive"><i class="fa fa-industry fa-fw"></i><span lang="en" data-lang-token="main_menu_system_token">System</span><span class="fa arrow"></span></a>
<a class="inactive"><i class="fa fa-industry fa-fw"></i><span data-i18n="main_menu_system_token">System</span><span class="fa arrow"></span></a>
<ul class="nav nav-second-level">
<li> <a class="inactive" id="load_logging"><i class="fa fa-download fa-fw"></i><span lang="en" data-lang-token="main_menu_logging_token">Events</span></a> </li>
<li> <a class="inactive" id="load_update"><i class="fa fa-download fa-fw"></i><span lang="en" data-lang-token="main_menu_update_token">Update</span></a> </li>
<li> <a class="inactive mnava" href="#conf_webconfig" id="load_webconfig"><i class="fa fa-wrench fa-fw"></i><span data-i18n="main_menu_webconfig_token">Webconfiguration</span></a> </li>
<li> <a class="inactive mnava" href="#conf_logging"><i class="fa fa-reorder fa-fw"></i><span data-i18n="main_menu_logging_token">Log</span></a> </li>
<li> <a class="inactive mnava" href="#update"><i class="fa fa-download fa-fw"></i><span data-i18n="main_menu_update_token">Update</span></a> </li>
<li> <a class="inactive mnava" href="#about"><i class="fa fa-info-circle fa-fw"></i><span data-i18n="main_menu_about_token">Update</span></a> </li>
</ul>
</li>
</ul>
@ -229,39 +178,80 @@
<!-- Page Content -->
<div id="page-wrapper" style="padding-top:10px">
<div id="hyperion_reload_notify" class="alert alert-warning" style="display:none;padding:10px;margin:0">
<div id="hyperion_reload_notify" class="alert alert-warning" style="display:none;padding:10px;margin:0">
<div class="panel-danger" style="text-align:right">
<div style="float:left;line-height:33px;" lang="en" data-lang-token="dashboard_alert_message_confedit">Your Hyperion configuration has been modified. To apply it, restart Hyperion.</div>
<button id="btn_hyperion_reload" class="btn btn-danger" lang="en" data-lang-token="dashboard_alert_button_restarthyerion">Restart Hyperion</button>
<div style="float:left;line-height:33px;" data-i18n="dashboard_alert_message_confedit">Your Hyperion configuration has been modified. To apply it, restart Hyperion.</div>
<button id="btn_hyperion_reload" class="btn btn-danger" data-i18n="general_btn_restarthyperion">Restart Hyperion</button>
</div>
</div>
<div id="page-content" />
<div id="page-content"></div>
</div>
</div>
<!-- /#wrapper -->
<div id="container_connection_lost" style="display:none"></div>
<div id="modal_dialog" class="modal fade" role="dialog">
<div id="container_restart" style="display:none"></div>
<!-- infoDialog -->
<div id="modal_dialog" class="modal fade" role="dialog" style="z-index:9999">
<div class="modal-dialog">
<center>
<div class="modal-content">
<div id="id_body" class="modal-body"></div>
<div id="id_footer" class="modal-footer" style="text-align:center"></div>
</div>
</center>
</div>
</div>
<!-- wizardDialog -->
<div id="wizard_modal" class="modal fade" role="dialog">
<div class="modal-dialog">
<!-- Modal content-->
<div class="modal-content">
<div class="modal-body">
<center>
<div class="modal-bodyicon"></div>
<h4 class="modal-bodytitle" style="font-weight:bold;text-transform:uppercase;"></h4>
<div class="modal-bodycontent"></div>
</center>
</div>
<div class="modal-footer">
<center>
<div class="modal-footer-button"></div>
</center>
<div id="wiz_header" class="modal-header"></div>
<div id="wizp1">
<div class="modal-body" style="text-align:center">
<img src="img/hyperion/hyperionlogo.png" alt="Redefine ambient light!" style="margin-bottom:15px">
<div id="wizp1_body" ></div>
</div>
<div id="wizp1_footer" class="modal-footer" style="text-align:center"></div>
</div>
<div id="wizp2" style="display:none">
<center>
<div class="modal-body">
<img src="img/hyperion/hyperionlogo.png" alt="Redefine ambient light!" style="margin-bottom:15px">
<div id="wizp2_body"></div>
</div>
</center>
<div id="wizp2_footer" class="modal-footer" style="text-align:center"></div>
</div>
<div id="wizp3" style="display:none">
<center>
<div class="modal-body">
<img src="img/hyperion/hyperionlogo.png" alt="Redefine ambient light!" style="margin-bottom:15px">
<div id="wizp3_body"></div>
</div>
</center>
<div id="wizp3_footer" class="modal-footer" style="text-align:center"></div>
</div>
</div>
</div>
</div>
<!-- ledsimDialog -->
<div id="ledsim_dialog" style="display:none; z-index:9998">
<div data-role="body" style="padding:0px;">
<div id="ledsim_text"></div>
<div id="leds_canvas"></div>
</div>
<div data-role="footer" style="text-align:center">
<button type="button" class="btn btn-success" id="leds_toggle"><i class="fa fa-fw fa-lightbulb-o"></i><span data-i18n="main_ledsim_btn_toggleleds">leds</span></button>
<button type="button" class="btn btn-danger" id="leds_toggle_num"> <i class="fa fa-fw fa-info"></i><span data-i18n="main_ledsim_btn_togglelednumber">led numbers</span></button>
<button type="button" class="btn btn-danger" id="leds_toggle_live_video"><i class="fa fa-fw fa-television"></i><span data-i18n="main_ledsim_btn_togglelivevideo">live video</span></button>
</div>
</div>
<!-- Bootstrap Core JavaScript -->
<script src="/js/lib/bootstrap.min.js"></script>
@ -272,8 +262,17 @@
<!-- Custom Theme JavaScript -->
<script src="/js/lib/sb-admin-2.js"></script>
<script src="/js/lib/jquery-ui.min.js"></script>
<script src="/js/content_index.js"></script>
<script src="/js/settings.js"></script>
<script src="/js/wizard.js"></script>
<!--gijgo dialog-->
<script src="/js/lib/draggable.min.js"></script>
<script src="/js/lib/dialog.min.js"></script>
<script src="/js/ledsim.js"></script>
<!--Client-side download-->
<script src='/js/lib/download.min.js'></script>
</body>
</html>

View File

@ -1,20 +1,81 @@
var conf_editor = null;
$(hyperion).one("cmd-config-getschema", function(event) {
schema = parsedConfSchemaJSON.properties;
conf_editor = createJsonEditor('editor_container', {
color : schema.color,
smoothing : schema.smoothing,
blackborderdetector: schema.blackborderdetector,
}, true);
$('#btn_submit').off().on('click',function() {
requestWriteConfig(conf_editor.getValue());
});
});
$(document).ready( function() {
requestServerConfigSchema();
performTranslation();
var editor_color = null;
var editor_smoothing = null;
var editor_blackborder = null;
if(showOptHelp)
{
//color
$('#conf_cont').append(createRow('conf_cont_color'))
$('#conf_cont_color').append(createOptPanel('fa-photo', $.i18n("edt_conf_color_heading_title"), 'editor_container_color', 'btn_submit_color'));
$('#conf_cont_color').append(createHelpTable(schema.color.properties, $.i18n("edt_conf_color_heading_title")));
//smoothing
$('#conf_cont').append(createRow('conf_cont_smoothing'))
$('#conf_cont_smoothing').append(createOptPanel('fa-photo', $.i18n("edt_conf_smooth_heading_title"), 'editor_container_smoothing', 'btn_submit_smoothing'));
$('#conf_cont_smoothing').append(createHelpTable(schema.smoothing.properties, $.i18n("edt_conf_smooth_heading_title")));
//blackborder
$('#conf_cont').append(createRow('conf_cont_blackborder'))
$('#conf_cont_blackborder').append(createOptPanel('fa-photo', $.i18n("edt_conf_bb_heading_title"), 'editor_container_blackborder', 'btn_submit_blackborder'));
$('#conf_cont_blackborder').append(createHelpTable(schema.blackborderdetector.properties, $.i18n("edt_conf_bb_heading_title")));
}
else
{
$('#conf_cont').addClass('row');
$('#conf_cont').append(createOptPanel('fa-photo', $.i18n("edt_conf_color_heading_title"), 'editor_container_color', 'btn_submit_color'));
$('#conf_cont').append(createOptPanel('fa-photo', $.i18n("edt_conf_smooth_heading_title"), 'editor_container_smoothing', 'btn_submit_smoothing'));
$('#conf_cont').append(createOptPanel('fa-photo', $.i18n("edt_conf_bb_heading_title"), 'editor_container_blackborder', 'btn_submit_blackborder'));
}
//color
editor_color = createJsonEditor('editor_container_color', {
color : schema.color
}, true, true);
editor_color.on('change',function() {
editor_color.validate().length ? $('#btn_submit_color').attr('disabled', true) : $('#btn_submit_color').attr('disabled', false);
});
$('#btn_submit_color').off().on('click',function() {
requestWriteConfig(editor_color.getValue());
});
//smoothing
editor_smoothing = createJsonEditor('editor_container_smoothing', {
smoothing : schema.smoothing
}, true, true);
editor_smoothing.on('change',function() {
editor_smoothing.validate().length ? $('#btn_submit_smoothing').attr('disabled', true) : $('#btn_submit_smoothing').attr('disabled', false);
});
$('#btn_submit_smoothing').off().on('click',function() {
requestWriteConfig(editor_smoothing.getValue());
});
//blackborder
editor_blackborder = createJsonEditor('editor_container_blackborder', {
blackborderdetector: schema.blackborderdetector
}, true, true);
editor_blackborder.on('change',function() {
editor_blackborder.validate().length ? $('#btn_submit_blackborder').attr('disabled', true) : $('#btn_submit_blackborder').attr('disabled', false);
});
$('#btn_submit_blackborder').off().on('click',function() {
requestWriteConfig(editor_blackborder.getValue());
});
//create introduction
if(showOptHelp)
{
createHint("intro", $.i18n('conf_colors_color_intro'), "editor_container_color");
createHint("intro", $.i18n('conf_colors_smoothing_intro'), "editor_container_smoothing");
createHint("intro", $.i18n('conf_colors_blackborder_intro'), "editor_container_blackborder");
}
removeOverlay();
});

View File

@ -0,0 +1,46 @@
$(document).ready( function() {
performTranslation();
function updateComponents()
{
var components = serverInfo.info.components;
components_html = "";
for ( idx=0; idx<components.length;idx++)
{
components_html += '<tr><td>'+$.i18n('general_comp_'+components[idx].name)+'</td><td><i class="fa fa-circle component-'+(components[idx].enabled?"on":"off")+'"></i></td></tr>';
}
$("#tab_components").html(components_html);
}
// get active led device
var leddevice = serverInfo.info.ledDevices.active;
$('#dash_leddevice').html(leddevice);
// get host
var hostname = serverInfo.info.hostname;
$('#dash_systeminfo').html(hostname+':'+jsonPort);
$.get( "https://raw.githubusercontent.com/hyperion-project/hyperion.ng/master/version.json", function( data ) {
parsedUpdateJSON = JSON.parse(data);
latestVersion = parsedUpdateJSON[0].versionnr;
var cleanLatestVersion = latestVersion.replace(/\./g, '');
var cleanCurrentVersion = currentVersion.replace(/\./g, '');
$('#currentversion').html(currentVersion);
$('#latestversion').html(latestVersion);
if ( cleanCurrentVersion < cleanLatestVersion )
$('#versioninforesult').html('<div style="margin:0px;" class="alert alert-warning">'+$.i18n('dashboard_infobox_message_updatewarning', latestVersion)+'</div>');
else
$('#versioninforesult').html('<div style="margin:0px;" class="alert alert-success">'+$.i18n('dashboard_infobox_message_updatesuccess')+'</div>');
});
//interval update
updateComponents();
$(hyperion).on("cmd-serverinfo",updateComponents);
if(showOptHelp)
createHintH("intro", $.i18n('dashboard_label_intro'), "dash_intro");
removeOverlay();
});

View File

@ -1,17 +1,156 @@
var conf_editor = null;
$(hyperion).one("cmd-config-getschema", function(event) {
schema = parsedConfSchemaJSON.properties;
conf_editor = createJsonEditor('editor_container', {
effects : schema.effects,
initialEffect : schema.initialEffect
}, true);
$('#btn_submit').off().on('click',function() {
requestWriteConfig(conf_editor.getValue());
});
});
$(document).ready( function() {
requestServerConfigSchema();
//$("[type='checkbox']").bootstrapSwitch();
performTranslation();
var oldEffects = [];
var editorReady = false;
var effects_editor = null;
var confFgEff = serverConfig.foregroundEffect.effect;
var confBgEff = serverConfig.backgroundEffect.effect;
var foregroundEffect_editor = null;
var backgroundEffect_editor = null;
if(showOptHelp)
{
//effect path
if(storedAccess != 'default')
{
$('#conf_cont').append(createRow('conf_cont_ef'))
$('#conf_cont_ef').append(createOptPanel('fa-spinner', $.i18n("edt_conf_effp_heading_title"), 'editor_container_effects', 'btn_submit_effects'));
$('#conf_cont_ef').append(createHelpTable(schema.effects.properties, $.i18n("edt_conf_effp_heading_title")));
}
//foreground effect
$('#conf_cont').append(createRow('conf_cont_fge'))
$('#conf_cont_fge').append(createOptPanel('fa-spinner', $.i18n("edt_conf_fge_heading_title"), 'editor_container_foregroundEffect', 'btn_submit_foregroundEffect'));
$('#conf_cont_fge').append(createHelpTable(schema.foregroundEffect.properties, $.i18n("edt_conf_fge_heading_title")));
//background effect
$('#conf_cont').append(createRow('conf_cont_bge'))
$('#conf_cont_bge').append(createOptPanel('fa-spinner', $.i18n("edt_conf_bge_heading_title"), 'editor_container_backgroundEffect', 'btn_submit_backgroundEffect'));
$('#conf_cont_bge').append(createHelpTable(schema.backgroundEffect.properties, $.i18n("edt_conf_bge_heading_title")));
}
else
{
if(storedAccess != 'default')
$('#conf_cont').append(createOptPanel('fa-spinner', $.i18n("edt_conf_effp_heading_title"), 'editor_container_effects', 'btn_submit_effects'));
$('#conf_cont').addClass('row');
$('#conf_cont').append(createOptPanel('fa-spinner', $.i18n("edt_conf_fge_heading_title"), 'editor_container_foregroundEffect', 'btn_submit_foregroundEffect'));
$('#conf_cont').append(createOptPanel('fa-spinner', $.i18n("edt_conf_bge_heading_title"), 'editor_container_backgroundEffect', 'btn_submit_backgroundEffect'));
}
if(storedAccess != 'default')
{
effects_editor = createJsonEditor('editor_container_effects', {
effects : schema.effects
}, true, true);
effects_editor.on('change',function() {
effects_editor.validate().length ? $('#btn_submit_effects').attr('disabled', true) : $('#btn_submit_effects').attr('disabled', false);
});
$('#btn_submit_effects').off().on('click',function() {
requestWriteConfig(effects_editor.getValue());
});
}
foregroundEffect_editor = createJsonEditor('editor_container_foregroundEffect', {
foregroundEffect : schema.foregroundEffect
}, true, true);
backgroundEffect_editor = createJsonEditor('editor_container_backgroundEffect', {
backgroundEffect : schema.backgroundEffect
}, true, true);
foregroundEffect_editor.on('ready',function() {
editorReady = true;
});
foregroundEffect_editor.on('change',function() {
foregroundEffect_editor.validate().length ? $('#btn_submit_foregroundEffect').attr('disabled', true) : $('#btn_submit_foregroundEffect').attr('disabled', false);
var type = foregroundEffect_editor.getEditor('root.foregroundEffect.type');
if(type.value == "color")
{
foregroundEffect_editor.getEditor('root.foregroundEffect.effect').disable();
foregroundEffect_editor.getEditor('root.foregroundEffect.color').enable();
}
else
{
foregroundEffect_editor.getEditor('root.foregroundEffect.effect').enable();
foregroundEffect_editor.getEditor('root.foregroundEffect.color').disable();
}
});
backgroundEffect_editor.on('change',function() {
backgroundEffect_editor.validate().length ? $('#btn_submit_backgroundEffect').attr('disabled', true) : $('#btn_submit_backgroundEffect').attr('disabled', false);
var type = backgroundEffect_editor.getEditor('root.backgroundEffect.type');
if(type.value == "color")
{
backgroundEffect_editor.getEditor('root.backgroundEffect.effect').disable();
backgroundEffect_editor.getEditor('root.backgroundEffect.color').enable();
}
else
{
backgroundEffect_editor.getEditor('root.backgroundEffect.effect').enable();
backgroundEffect_editor.getEditor('root.backgroundEffect.color').disable();
}
});
$('#btn_submit_foregroundEffect').off().on('click',function() {
//requestWriteConfig(foregroundEffect_editor.getValue());
console.log(foregroundEffect_editor.getValue());
});
$('#btn_submit_backgroundEffect').off().on('click',function() {
//requestWriteConfig(backgroundEffect_editor.getValue());
console.log(backgroundEffect_editor.getValue());
});
//create introduction
if(showOptHelp)
{
createHint("intro", $.i18n('conf_effect_path_intro'), "editor_container_effects");
createHint("intro", $.i18n('conf_effect_fgeff_intro'), "editor_container_foregroundEffect");
createHint("intro", $.i18n('conf_effect_bgeff_intro'), "editor_container_backgroundEffect");
}
function updateEffectlist(){
if(editorReady)
{
var newEffects = serverInfo.info.effects;
if (newEffects.length != oldEffects.length)
{
$('#root_foregroundEffect_effect').html('');
var usrEffArr = [];
var sysEffArr = [];
for(i = 0; i < newEffects.length; i++)
{
var effectName = newEffects[i].name;
if(!/^\:/.test(newEffects[i].file))
usrEffArr.push(effectName);
else
sysEffArr.push(effectName);
}
$('#root_foregroundEffect_effect').append(createSel(usrEffArr, $.i18n('remote_optgroup_usreffets')));
$('#root_foregroundEffect_effect').append(createSel(sysEffArr, $.i18n('remote_optgroup_syseffets')));
$('#root_backgroundEffect_effect').html($('#root_foregroundEffect_effect').html());
oldEffects = newEffects;
$('#root_foregroundEffect_effect').val(confFgEff).change();
//$('select').trigger('change');
//var fgeff = foregroundEffect_editor.getEditor('root.foregroundEffect.effect').setValue(confFgEff);
//console.log(fgeff);
$('#root_backgroundEffect_effect').val(confBgEff).change();
}
}
}
//interval update
$(hyperion).on("cmd-serverinfo",updateEffectlist);
removeOverlay();
});

View File

@ -1,59 +1,16 @@
JSONEditor.defaults.editors.colorPicker = JSONEditor.defaults.editors.string.extend({
getValue: function() {
var color = $(this.input).data('colorpicker').color.toRGB();
return [color.r, color.g, color.b];
},
setValue: function(val) {
function rgb2hex(rgb)
{
return "#" +
("0" + parseInt(rgb[0],10).toString(16)).slice(-2) +
("0" + parseInt(rgb[1],10).toString(16)).slice(-2) +
("0" + parseInt(rgb[2],10).toString(16)).slice(-2);
}
$(this.input).colorpicker('updateInput', 'rgb('+val+')');
$(this.input).colorpicker('updateData', val);
$(this.input).colorpicker('updatePicker', rgb2hex(val));
},
build: function() {
this._super();
var myinput = this;
$(myinput.input).colorpicker({
format: 'rgb',
customClass: 'colorpicker-2x',
sliders: {
saturation: {
maxLeft: 200,
maxTop: 200
},
hue: {
maxTop: 200
},
},
})
$(this.input).colorpicker().on('changeColor', function(e) {
$(myinput).val(e.color.toRGB()).change();
});
}
});
JSONEditor.defaults.resolvers.unshift(function(schema) {
if(schema.type === "array" && schema.format === "colorpicker") {
return "colorPicker";
}
});
$(document).ready( function() {
performTranslation();
var oldDelList = [];
var effectName = "";
var effects_editor = null;
var effectPy = "";
var testrun;
function updateDelEffectlist(event){
var newDelList = event.response.info.effects
if(showOptHelp)
createHintH("intro", $.i18n('effectsconfigurator_label_intro'), "intro_effc");
function updateDelEffectlist(){
var newDelList = serverInfo.info.effects;
if(newDelList.length != oldDelList.length)
{
var EffectHtml = null;
@ -66,89 +23,76 @@
}
$("#effectsdellist").html(EffectHtml);
oldDelList = newDelList;
$('#effectsdellist').trigger('change');
}
}
$(hyperion).one("cmd-config-getschema", function(event) {
effects = parsedConfSchemaJSON.properties.effectSchemas.internal
EffectsHtml = "";
for(var idx=0; idx<effects.length; idx++)
{
EffectsHtml += '<option value="'+effects[idx].schemaContent.script+'">'+effects[idx].schemaContent.title+'</option>';
}
$("#effectslist").html(EffectsHtml);
$("#effectslist").trigger("change");
});
function validateEditor() {
if(effects_editor.validate().length)
{
showInfoDialog('error','INVALID VALUES','Please check for red marked inputs and try again.');
return false;
}
else
{
return true;
}
};
function validateName() {
effectName = $('#name-input').val();
if (effectName == "")
{
showInfoDialog('error','INVALID NAME FIELD','Effect name is empty! Please fill in a name and try again.');
return false;
}
else
{
return true;
}
};
function triggerTestEffect() {
testrun = true;
var args = effects_editor.getEditor('root.args');
requestTestEffect(effectName, ":/effects/" + effectPy.slice(1), JSON.stringify(args.getValue()));
};
effectName = "";
effects_editor = null;
effectPy = "";
$("#effectslist").off().on("change", function(event) {
for(var idx=0; idx<effects.length; idx++){
if (effects[idx].schemaContent.script == this.value){
effects_editor = createJsonEditor('editor_container', {
args : effects[idx].schemaContent,
},false);
},false, true);
effectPy = ':';
effectPy += effects[idx].schemaContent.script;
}
$("#name-input").trigger("change");
}
effects_editor.on('change',function() {
if ($("#btn_cont_test").hasClass("btn-success") && validateName() && validateEditor())
if ($("#btn_cont_test").hasClass("btn-success") && effects_editor.validate().length == 0 && effectName != "")
{
triggerTestEffect();
}
if( effects_editor.validate().length == 0 && effectName != "")
{
$('#btn_start_test').attr('disabled', false);
$('#btn_write').attr('disabled', false);
}
else
{
$('#btn_start_test').attr('disabled', true);
$('#btn_write').attr('disabled', true);
}
});
});
$("#name-input").on('change keyup', function(event) {
effectName = $(this).val();
if ($(this).val() == '') {
effects_editor.disable();
$("#eff_footer").children().attr('disabled',true);
} else {
effects_editor.enable();
$("#eff_footer").children().attr('disabled',false);
}
});
$('#btn_write').off().on('click',function() {
if(validateEditor() && validateName())
{
requestWriteEffect(effectName,effectPy,JSON.stringify(effects_editor.getValue()));
showInfoDialog('success','SUCCESS!','Your effect "'+effectName+'" has been created successfully!');
}
requestWriteEffect(effectName,effectPy,JSON.stringify(effects_editor.getValue()));
$(hyperion).one("cmd-create-effect", function(event) {
if (event.response.success)
showInfoDialog('success', "", $.i18n('infoDialog_effconf_created_text', effectName));
});
if (testrun)
setTimeout(requestPriorityClear,100);
});
$('#btn_start_test').off().on('click',function() {
if(validateEditor() && validateName())
{
triggerTestEffect();
}
triggerTestEffect();
});
$('#btn_stop_test').off().on('click',function() {
requestPriorityClear();
testrun = false;
});
$('#btn_cont_test').off().on('click',function() {
@ -158,10 +102,32 @@ $(hyperion).one("cmd-config-getschema", function(event) {
$('#btn_delete').off().on('click',function() {
var name = $("#effectsdellist").val();
requestDeleteEffect(name);
showInfoDialog('success','Effect deleted!', 'The effect "'+name+'" has been deleted successfully!');
$(hyperion).one("cmd-delete-effect", function(event) {
if (event.response.success)
showInfoDialog('success', "", $.i18n('infoDialog_effconf_deleted_text', name));
});
});
$(document).ready( function() {
requestServerConfigSchema();
$('#effectsdellist').off().on('change', function(){
if ($(this).val() == null) {
$('#btn_delete').prop('disabled',true);
} else {
$('#btn_delete').prop('disabled',false);
}
});
//create basic effect list
var effects = serverSchema.properties.effectSchemas.internal
for(var idx=0; idx<effects.length; idx++)
{
$("#effectslist").append(createSelOpt(effects[idx].schemaContent.script, $.i18n(effects[idx].schemaContent.title)));
}
$("#effectslist").trigger("change");
updateDelEffectlist();
//interval update
$(hyperion).on("cmd-serverinfo",updateDelEffectlist);
});
removeOverlay();
});

View File

@ -0,0 +1,119 @@
$(document).ready( function() {
performTranslation();
var importedConf;
var confName;
var conf_editor = null;
$('#conf_cont').append(createOptPanel('fa-wrench', $.i18n("edt_conf_gen_heading_title"), 'editor_container', 'btn_submit'));
if(showOptHelp)
{
$('#conf_cont').append(createHelpTable(schema.general.properties, $.i18n("edt_conf_gen_heading_title")));
}
else
$('#conf_imp').appendTo('#conf_cont');
conf_editor = createJsonEditor('editor_container', {
general: schema.general
}, true, true);
conf_editor.on('change',function() {
conf_editor.validate().length ? $('#btn_submit').attr('disabled', true) : $('#btn_submit').attr('disabled', false);
});
$('#btn_submit').off().on('click',function() {
requestWriteConfig(conf_editor.getValue());
});
//import
function dis_imp_btn(state)
{
state ? $('#btn_import_conf').attr('disabled', true) : $('#btn_import_conf').attr('disabled', false);
}
function readFile(evt)
{
var f = evt.target.files[0];
if (f)
{
var r = new FileReader();
r.onload = function(e)
{
var content = e.target.result;
//check file is json
var check = isJsonString(content);
if(check.length != 0)
{
showInfoDialog('error', "", $.i18n('infoDialog_import_jsonerror_text', f.name, JSON.stringify(check)));
dis_imp_btn(true);
}
else
{
content = JSON.parse(content);
//check for hyperion json
if(typeof content.leds === 'undefined' || typeof content.general === 'undefined')
{
showInfoDialog('error', "", $.i18n('infoDialog_import_hyperror_text', f.name));
dis_imp_btn(true);
}
else
{
//check config revision
if(content.general.configVersion !== serverConfig.general.configVersion)
{
showInfoDialog('error', "", $.i18n('infoDialog_import_reverror_text', f.name, content.general.configVersion, serverConfig.general.configVersion));
dis_imp_btn(true);
}
else
{
dis_imp_btn(false);
importedConf = content;
confName = f.name;
}
}
}
}
r.readAsText(f);
}
}
$('#btn_import_conf').off().on('click', function(){
showInfoDialog('import', $.i18n('infoDialog_import_confirm_title'), $.i18n('infoDialog_import_confirm_text', confName));
$('#id_btn_import').off().on('click', function(){
requestWriteConfig(importedConf, true);
setTimeout(initRestart, 100);
});
});
$('#select_import_conf').off().on('change', function(e){
if (window.File && window.FileReader && window.FileList && window.Blob)
readFile(e);
else
showInfoDialog('error', "", $.i18n('infoDialog_import_comperror_text'));
});
//export
$('#btn_export_conf').off().on('click', function(){
var name = serverConfig.general.name;
var d = new Date();
var month = d.getMonth()+1;
var day = d.getDate();
var timestamp = d.getFullYear() + '.' +
(month<10 ? '0' : '') + month + '.' +
(day<10 ? '0' : '') + day;
download(JSON.stringify(serverConfig, null, "\t"), 'Hyperion-'+currentVersion+'-Backup ('+name+') '+timestamp+'.json', "application/json");
});
//create introduction
if(showOptHelp)
createHint("intro", $.i18n('conf_general_intro'), "editor_container");
removeOverlay();
});

View File

@ -1,21 +1,60 @@
var conf_editor = null;
$(hyperion).one("cmd-config-getschema", function(event) {
schema = parsedConfSchemaJSON.properties;
conf_editor = createJsonEditor('editor_container', {
framegrabber: schema.framegrabber,
grabberV4L2 : schema.grabberV4L2
}, true);
$('#btn_submit').off().on('click',function() {
requestWriteConfig(conf_editor.getValue());
});
});
$(document).ready( function() {
requestServerConfigSchema();
performTranslation();
var conf_editor_v4l2 = null;
var conf_editor_fg = null;
if(showOptHelp)
{
//fg
$('#conf_cont').append(createRow('conf_cont_fg'))
$('#conf_cont_fg').append(createOptPanel('fa-camera', $.i18n("edt_conf_fg_heading_title"), 'editor_container_fg', 'btn_submit_fg'));
$('#conf_cont_fg').append(createHelpTable(schema.framegrabber.properties, $.i18n("edt_conf_fg_heading_title")));
//v4l
$('#conf_cont').append(createRow('conf_cont_v4l'))
$('#conf_cont_v4l').append(createOptPanel('fa-camera', $.i18n("edt_conf_v4l2_heading_title"), 'editor_container_v4l2', 'btn_submit_v4l2'));
$('#conf_cont_v4l').append(createHelpTable(schema.grabberV4L2.items.properties, $.i18n("edt_conf_v4l2_heading_title")));
}
else
{
$('#conf_cont').addClass('row');
$('#conf_cont').append(createOptPanel('fa-camera', $.i18n("edt_conf_fg_heading_title"), 'editor_container_fg', 'btn_submit_fg'));
$('#conf_cont').append(createOptPanel('fa-camera', $.i18n("edt_conf_v4l2_heading_title"), 'editor_container_v4l2', 'btn_submit_v4l2'));
}
//fg
conf_editor_fg = createJsonEditor('editor_container_fg', {
framegrabber: schema.framegrabber
}, true, true);
conf_editor_fg.on('change',function() {
conf_editor_fg.validate().length ? $('#btn_submit_fg').attr('disabled', true) : $('#btn_submit_fg').attr('disabled', false);
});
$('#btn_submit_fg').off().on('click',function() {
requestWriteConfig(conf_editor_fg.getValue());
});
//vl4
conf_editor_v4l2 = createJsonEditor('editor_container_v4l2', {
grabberV4L2 : schema.grabberV4L2
}, true, true);
conf_editor_v4l2.on('change',function() {
conf_editor_v4l2.validate().length ? $('#btn_submit_v4l2').attr('disabled', true) : $('#btn_submit_v4l2').attr('disabled', false);
});
$('#btn_submit_v4l2').off().on('click',function() {
requestWriteConfig(conf_editor_v4l2.getValue());
});
//create introduction
if(showOptHelp)
{
createHint("intro", $.i18n('conf_grabber_fg_intro'), "editor_container_fg");
createHint("intro", $.i18n('conf_grabber_v4l_intro'), "editor_container_v4l2");
}
removeOverlay();
});

View File

@ -1,95 +1,54 @@
$(document).ready( function() {
$("#main-nav").hide();
$("#loading_overlay").addClass("overlay");
var uiLock = false;
loadContentTo("#container_connection_lost","connection_lost");
loadContentTo("#container_restart","restart");
initWebSocket();
bindNavToContent("#load_dashboard","dashboard",true);
bindNavToContent("#load_remote","remote",false);
bindNavToContent("#load_huebridge","huebridge",false);
bindNavToContent("#load_support","support",false);
bindNavToContent("#load_confKodi","kodiconf",false);
bindNavToContent("#load_update","update",false);
bindNavToContent("#load_confEffects","effects",false);
bindNavToContent("#load_confLeds","leds",false);
bindNavToContent("#load_confGrabber","grabber",false);
bindNavToContent("#load_confColors","colors",false);
bindNavToContent("#load_confNetwork","network",false);
bindNavToContent("#load_effectsconfig","effects_configurator",false);
bindNavToContent("#load_logging","logging",false);
$(hyperion).on("cmd-serverinfo",function(event){
parsedServerInfoJSON = event.response;
currentVersion = parsedServerInfoJSON.info.hyperion[0].version;
cleanCurrentVersion = currentVersion.replace(/\./g, '');
if (parsedServerInfoJSON.info.hyperion[0].config_modified)
serverInfo = event.response;
currentVersion = serverInfo.info.hyperion[0].version;
$(hyperion).trigger("ready");
if (serverInfo.info.hyperion[0].config_modified)
$("#hyperion_reload_notify").fadeIn("fast");
else
$("#hyperion_reload_notify").fadeOut("fast");
// get active led device
var leddevice = parsedServerInfoJSON.info.ledDevices.active;
if ($("#content_dashboard").length > 0)
{
$('#dash_leddevice').html(leddevice);
}
// get host
var hostname = parsedServerInfoJSON.info.hostname;
if ($("#content_dashboard").length > 0)
{
$('#dash_systeminfo').html(hostname+':'+hyperionport);
}
if ($("#content_dashboard").length > 0)
{
var components = parsedServerInfoJSON.info.components;
components_html = "";
for ( idx=0; idx<components.length;idx++)
{
components_html += '<tr><td lang="en" data-lang-token="general_comp_'+components[idx].name+'">'+(components[idx].title)+'</td><td><i class="fa fa-circle component-'+(components[idx].enabled?"on":"off")+'"></i></td></tr>';
}
$("#tab_components").html(components_html);
$.get( "https://raw.githubusercontent.com/hyperion-project/hyperion.ng/master/version.json", function( data ) {
parsedUpdateJSON = JSON.parse(data);
latestVersion = parsedUpdateJSON[0].versionnr;
cleanLatestVersion = latestVersion.replace(/\./g, '');
$('#currentversion').html(' V'+currentVersion);
$('#latestversion').html(' V'+latestVersion);
if ( cleanCurrentVersion < cleanLatestVersion )
{
$('#versioninforesult').html('<div lang="en" data-lang-token="dashboard_infobox_message_updatewarning" style="margin:0px;" class="alert alert-warning">A newer version of Hyperion is available!</div>');
}
else
{
$('#versioninforesult').html('<div lang="en" data-lang-token="dashboard_infobox_message_updatesuccess" style="margin:0px;" class="alert alert-success">You run the latest version of Hyperion.</div>');
}
});
}
if ($("#logmessages").length == 0)
if ($("#logmessages").length == 0 && loggingStreamActive)
{
requestLoggingStop();
loggingStreamActive = false;
}
$("#loading_overlay").removeClass("overlay");
$("#main-nav").show('slide', {direction: 'left'}, 1000);
if (!serverInfo.info.hyperion[0].config_writeable)
{
showInfoDialog('uilock',$.i18n('InfoDialog_nowrite_title'),$.i18n('InfoDialog_nowrite_text'));
$('#wrapper').toggle(false);
uiLock = true;
}
else if (uiLock)
{
$("#modal_dialog").modal('hide');
$('#wrapper').toggle(true);
uiLock = false;
}
}); // end cmd-serverinfo
$(hyperion).one("cmd-config-getschema", function(event) {
parsedConfSchemaJSON = event.response.result;
serverSchema = event.response.result;
requestServerConfig();
schema = serverSchema.properties;
});
$(hyperion).one("cmd-config-getconfig", function(event) {
parsedConfJSON = event.response.result;
serverConfig = event.response.result;
requestServerInfo();
showOptHelp = serverConfig.general.showOptHelp;
});
$(hyperion).on("error",function(event){
@ -99,14 +58,19 @@ $(document).ready( function() {
$(hyperion).on("open",function(event){
requestServerConfigSchema();
});
$("#btn_hyperion_reload").on("click", function(){
$(hyperion).off();
requestServerConfigReload();
watchdog = 1;
$("#wrapper").fadeOut("slow");
cron();
$(hyperion).one("ready", function(event) {
loadContent();
});
$("#btn_hyperion_reload").on("click", function(){
initRestart();
});
$(".mnava").on('click', function(e){
loadContent(e);
});
});
$(function(){

View File

@ -1,20 +1,29 @@
var conf_editor = null;
$(hyperion).one("cmd-config-getschema", function(event) {
schema = parsedConfSchemaJSON.properties;
$(document).ready( function() {
var conf_editor = null;
performTranslation();
$('#conf_cont').append(createOptPanel('fa-play-circle-o', $.i18n("conf_kodi_label_title"), 'editor_container', 'btn_submit'));
if(showOptHelp)
{
$('#conf_cont').append(createHelpTable(schema.kodiVideoChecker.properties, $.i18n("conf_kodi_label_title")));
}
conf_editor = createJsonEditor('editor_container', {
kodiVideoChecker: schema.kodiVideoChecker
}, true);
$('#editor_container h3').remove();
}, true, true);
conf_editor.on('change',function() {
conf_editor.validate().length ? $('#btn_submit').attr('disabled', true) : $('#btn_submit').attr('disabled', false);
});
$('#btn_submit').off().on('click',function() {
requestWriteConfig(conf_editor.getValue());
});
});
$(document).ready( function() {
requestServerConfigSchema();
//create introduction
if(showOptHelp)
createHint("intro", $.i18n('conf_kodi_intro'), "editor_container");
removeOverlay();
});

View File

@ -2,26 +2,11 @@
var ledsCustomCfgInitialized = false;
var finalLedArray = [];
function get_hue_lights(){
$.ajax({
type: "GET",
url: 'http://'+$("#ip").val()+'/api/'+$("#user").val()+'/lights',
processData: false,
contentType: 'application/json',
success: function(r) {
for(var lightid in r){
//console.log(r[lightid].name);
$('#hue_lights').append('ID: '+lightid+' Name: '+r[lightid].name+'<br />');
}
}
});
}
function validateText(){
e = isJsonString($("#ledconfig").val());
if (e.length != 0){
showInfoDialog("error", "Validation failed!", e);
showInfoDialog("error", $.i18n('InfoDialog_leds_validfail_title'), e);
return false
}
return true
@ -35,21 +20,21 @@ function round(number) {
};
function createLedPreview(leds, origin){
if (origin == "classic"){
$('#previewcreator').html('<h5 lang="en" data-lang-token="conf_leds_layout_preview_originCL">Created from: Classic Layout (LED Frame)</h5>');
$('#previewcreator').html($.i18n('conf_leds_layout_preview_originCL'));
$('#leds_preview').css("padding-top", "56.25%");
}
else if(origin == "text"){
$('#previewcreator').html('<h5 lang="en" data-lang-token="conf_leds_layout_preview_originTEXT">Created from: Textfield</h5>');
$('#previewcreator').html($.i18n('conf_leds_layout_preview_originTEXT'));
$('#leds_preview').css("padding-top", "56.25%");
}
else if(origin == "matrix"){
$('#previewcreator').html('<h5 lang="en" data-lang-token="conf_leds_layout_preview_originMA">Created from: Matrix Layout(LED wall)</h5>');
$('#previewcreator').html($.i18n('conf_leds_layout_preview_originMA'));
$('#leds_preview').css("padding-top", "100%");
}
$('#previewledcount').html('<h5>Total LED count: '+leds.length+'</h5>');
$('#previewledcount').html($.i18n('conf_leds_layout_preview_totalleds', leds.length));
$('.st_helper').css("border", "8px solid grey");
@ -66,7 +51,7 @@ function createLedPreview(leds, origin){
"top:"+(led.vscan.minimum * canvas_height)+"px;"+
"width:"+((led.hscan.maximum-led.hscan.minimum) * canvas_width-1)+"px;"+
"height:"+((led.vscan.maximum-led.vscan.minimum) * canvas_height-1)+"px;";
leds_html += '<div id="'+led_id+'" class="led" style="'+bgcolor+pos+'" title="'+idx+'"><span id="'+led_id+'_num" class="led_prev_num">'+idx+'</span></div>';
leds_html += '<div id="'+led_id+'" class="led" style="'+bgcolor+pos+'" title="'+led.index+'"><span id="'+led_id+'_num" class="led_prev_num">'+led.index+'</span></div>';
}
$('#leds_preview').html(leds_html);
$('#ledc_0').css({"background-color":"black","z-index":"12"});
@ -75,54 +60,38 @@ function createLedPreview(leds, origin){
if($('#leds_prev_toggle_num').hasClass('btn-success'))
$('.led_prev_num').css("display", "inline");
}
function createClassicLeds(){
//get values
var ledsTop = parseInt($("#ip_cl_ledstop").val());
var ledsBottom = parseInt($("#ip_cl_ledsbottom").val());
var ledsLeft = parseInt($("#ip_cl_ledsleft").val());
var ledsRight = parseInt($("#ip_cl_ledsright").val());
var ledsGlength = parseInt($("#ip_cl_ledsglength").val());
var ledsGPos = parseInt($("#ip_cl_ledsgpos").val());
var ledstop = parseInt($("#ip_cl_top").val());
var ledsbottom = parseInt($("#ip_cl_bottom").val());
var ledsleft = parseInt($("#ip_cl_left").val());
var ledsright = parseInt($("#ip_cl_right").val());
var ledsglength = parseInt($("#ip_cl_glength").val());
var ledsgpos = parseInt($("#ip_cl_gpos").val());
var position = parseInt($("#ip_cl_position").val());
var reverse = $("#ip_cl_reverse").is(":checked");
//advanced values
var rawledsVDepth = parseInt($("#ip_cl_ledsvdepth").val());
var rawledsHDepth = parseInt($("#ip_cl_ledshdepth").val());
var rawedgeGap = parseInt($("#ip_cl_ledsedgegap").val());
var rawcornerGap = parseInt($("#ip_cl_ledscornergap").val());
var ledsVDepth = parseInt($("#ip_cl_vdepth").val())/100;
var ledsHDepth = parseInt($("#ip_cl_hdepth").val())/100;
var edgeVGap = parseInt($("#ip_cl_edgegap").val())/100/2;
//var cornerVGap = parseInt($("#ip_cl_cornergap").val())/100/2;
var overlap = $("#ip_cl_overlap").val()/4000;
//helper
var ledsVDepth = rawledsVDepth /100;
var ledsHDepth = rawledsHDepth /100;
var edgeVGap = rawedgeGap /100/2;
var edgeHGap = edgeVGap/(16/9);
var cornerVGap = rawcornerGap /100/2;
var cornerHGap = cornerVGap/(16/9);
//var cornerHGap = cornerVGap/(16/9);
var Vmin = 0.0 + edgeVGap;
var Vmax = 1.0 - edgeVGap;
var Hmin = 0.0 + edgeHGap;
var Hmax = 1.0 - edgeHGap;
var Hdiff = Hmax-Hmin;
var Vdiff = Vmax-Vmin;
var ledArray = [];
createLeftLeds(createBottomLeds(createRightLeds(createTopLeds())));
if(ledsGlength != "0" && validateGap()){
ledArray.splice(ledsGPos, ledsGlength);
}
if (position != "0"){
rotateArray(ledArray, position);
}
if (reverse)
ledArray.reverse();
createLedPreview(ledArray, 'classic');
createFinalArray(ledArray);
function createFinalArray(array){
finalLedArray = [];
for(var i = 0; i<array.length; i++){
@ -132,16 +101,9 @@ function createClassicLeds(){
vmax = array[i].vscan.maximum;
finalLedArray[i] = { "index" : i, "hscan": { "maximum" : hmax, "minimum" : hmin }, "vscan": { "maximum": vmax, "minimum": vmin}}
}
createLedPreview(finalLedArray, 'classic');
}
function validateGap(){
if (ledsGPos+ledsGlength > ledArray.length){
showInfoDialog('error','GAP LOST IN SPACE!','You moved the gap out of your TV frame, lower the gap length or position and try again!');
return false
}
return true
}
function rotateArray(array, times){
if (times > "0"){
while( times-- ){
@ -158,6 +120,23 @@ function createClassicLeds(){
}
}
function valScan(val)
{
if(val > 1)
return val = 1;
if(val < 0)
return val = 0;
return val;
}
function ovl(scan,val)
{
if(scan == "+")
return valScan(val += overlap);
else
return valScan(val -= overlap);
}
function createLedArray(hmin, hmax, vmin, vmax){
hmin = round(hmin);
hmax = round(hmax);
@ -167,81 +146,99 @@ function createClassicLeds(){
}
function createTopLeds(){
step=(Hmax-Hmin)/ledsTop;
hmin=Hmin
if(cornerVGap != '0'){
step=(Hmax-Hmin-(cornerHGap*2))/ledsTop;
hmin=Hmin+(cornerHGap);
}
vmin=Vmin
step=(Hmax-Hmin)/ledstop;
//if(cornerVGap != '0')
// step=(Hmax-Hmin-(cornerHGap*2))/ledstop;
vmin=Vmin;
vmax=vmin+ledsHDepth;
hmax=hmin+step
for (var i = 0; i<ledsTop; i++){
for (var i = 0; i<ledstop; i++){
hmin = ovl("-",(Hdiff/ledstop*[i])+edgeHGap);
hmax = ovl("+",(Hdiff/ledstop*[i])+step+edgeHGap);
createLedArray(hmin, hmax, vmin, vmax);
hmin += step
hmax += step
}
}
function createLeftLeds(){
step=(Vmax-Vmin)/ledsLeft;
vmax=Vmax
if(cornerVGap != '0'){
step=(Vmax-Vmin-(cornerVGap*2))/ledsLeft;
vmax=Vmax-(cornerVGap);
}
step=(Vmax-Vmin)/ledsleft;
//if(cornerVGap != '0')
// step=(Vmax-Vmin-(cornerVGap*2))/ledsleft;
hmin=Hmin;
hmax=hmin+ledsVDepth;
vmin=vmax-step
for (var i = ledsLeft; i>0; i--){
for (var i = ledsleft-1; i>-1; --i){
vmin = ovl("-",(Vdiff/ledsleft*[i])+edgeVGap);
vmax = ovl("+",(Vdiff/ledsleft*[i])+step+edgeVGap);
createLedArray(hmin, hmax, vmin, vmax);
vmin -= step
vmax -= step
}
}
function createRightLeds(){
step=(Vmax-Vmin)/ledsRight;
vmin=Vmin
if(cornerVGap != '0'){
step=(Vmax-Vmin-(cornerVGap*2))/ledsRight;
vmin=Vmin+(cornerVGap);
}
step=(Vmax-Vmin)/ledsright;
//if(cornerVGap != '0')
// step=(Vmax-Vmin-(cornerVGap*2))/ledsright;
hmax=Hmax;
hmin=hmax-ledsVDepth;
vmax=vmin+step
for (var i = 0; i<ledsRight; i++){
createLedArray(hmin, hmax, vmin, vmax);
vmin += step
vmax += step
for (var i = 0; i<ledsright; i++){
vmin = ovl("-",(Vdiff/ledsright*[i])+edgeVGap);
vmax = ovl("+",(Vdiff/ledsright*[i])+step+edgeVGap);
createLedArray(hmin, hmax, vmin, vmax);
}
}
function createBottomLeds(){
step=(Hmax-Hmin)/ledsBottom;
hmax=Hmax
if(cornerVGap != '0'){
step=(Hmax-Hmin-(cornerHGap*2))/ledsBottom;
hmax=Hmax-(cornerHGap);
}
step=(Hmax-Hmin)/ledsbottom;
//if(cornerVGap != '0')
// step=(Hmax-Hmin-(cornerHGap*2))/ledsbottom;
vmax=Vmax;
vmin=vmax-ledsHDepth;
hmin=hmax-step
for (var i = ledsBottom; i>0; i--){
for (var i = ledsbottom-1; i>-1; i--){
hmin = ovl("-",(Hdiff/ledsbottom*[i])+edgeHGap);
hmax = ovl("+",(Hdiff/ledsbottom*[i])+step+edgeHGap);
createLedArray(hmin, hmax, vmin, vmax);
hmin -= step;
hmax -= step;
}
}
createLeftLeds(createBottomLeds(createRightLeds(createTopLeds())));
//check led gap pos
if (ledsgpos+ledsglength > ledArray.length)
{
var mpos = Math.max(0,ledArray.length-ledsglength);
$('#ip_cl_ledsgpos').val(mpos);
ledsgpos = mpos;
}
//check led gap length
if(ledsglength >= ledArray.length)
{
$('#ip_cl_ledsglength').val(ledArray.length-1);
ledsglength = ledArray.length-ledsglength-1;
}
if(ledsglength != 0){
ledArray.splice(ledsgpos, ledsglength);
}
if (position != 0){
rotateArray(ledArray, position);
}
if (reverse)
ledArray.reverse();
createFinalArray(ledArray);
}
function createMatrixLeds(){
// Big thank you to RanzQ (Juha Rantanen) from Github for this script
// https://raw.githubusercontent.com/RanzQ/hyperion-audio-effects/master/matrix-config.js
//get values
var width = parseInt($("#ip_ma_ledshoriz").val());
var height = parseInt($("#ip_ma_ledsvert").val());
var ledshoriz = parseInt($("#ip_ma_ledshoriz").val());
var ledsvert = parseInt($("#ip_ma_ledsvert").val());
var cabling = $("#ip_ma_cabling").val();
//var order = $("#ip_ma_order").val();
var start = $("#ip_ma_start").val();
@ -249,8 +246,8 @@ function createMatrixLeds(){
var parallel = false
var index = 0
var leds = []
var hblock = 1.0 / width
var vblock = 1.0 / height
var hblock = 1.0 / ledshoriz
var vblock = 1.0 / ledsvert
if (cabling == "parallel"){
parallel = true
@ -287,10 +284,10 @@ function createMatrixLeds(){
}
var startYX = start.split('-')
var startX = startYX[1] === 'right' ? width - 1 : 0
var startY = startYX[0] === 'bottom' ? height - 1 : 0
var endX = startX === 0 ? width - 1 : 0
var endY = startY === 0 ? height - 1 : 0
var startX = startYX[1] === 'right' ? ledshoriz - 1 : 0
var startY = startYX[0] === 'bottom' ? ledsvert - 1 : 0
var endX = startX === 0 ? ledshoriz - 1 : 0
var endY = startY === 0 ? ledsvert - 1 : 0
var forward = startX < endX
var downward = startY < endY
@ -315,190 +312,93 @@ function createMatrixLeds(){
}
$(document).ready(function() {
//-------------------------------------------------------------------
// translate
performTranslation();
//add intros
if(showOptHelp)
{
createHintH("intro", $.i18n('conf_leds_device_intro'), "leddevice_intro");
createHintH("intro", $.i18n('conf_leds_layout_intro'), "layout_intro");
$('#led_vis_help').html('<div><div class="led_ex" style="background-color:black;margin-right:5px;margin-top:3px"></div><div style="display:inline-block;vertical-align:top">'+$.i18n('conf_leds_layout_preview_l1')+'</div></div><div class="led_ex" style="background-color:grey;margin-top:3px;margin-right:2px"></div><div class="led_ex" style="background-color: rgb(169, 169, 169);margin-right:5px;margin-top:3px;"></div><div style="display:inline-block;vertical-align:top">'+$.i18n('conf_leds_layout_preview_l2')+'</div>');
}
var slConfig = serverConfig.ledConfig;
//restore ledConfig
for(key in slConfig)
{
if(typeof(slConfig[key]) === "boolean")
$('#ip_cl_'+key).prop('checked', slConfig[key]);
else
$('#ip_cl_'+key).val(slConfig[key]);
}
function saveValues()
{
var ledConfig = {};
for(key in slConfig)
{
if(typeof(slConfig[key]) === "boolean")
ledConfig[key] = $('#ip_cl_'+key).is(':checked');
else if(Number.isInteger(slConfig[key]))
ledConfig[key] = parseInt($('#ip_cl_'+key).val());
else
ledConfig[key] = $('#ip_cl_'+key).val();
}
setTimeout(requestWriteConfig, 100, {ledConfig});
}
// check access level and adjust ui
if(storedAccess == "default")
{
$('#btn_ma_generate').toggle(false);
$('#btn_cl_generate').toggle(false);
$('#texfield_panel').toggle(false);
$('#previewcreator').toggle(false);
}
else
{
$('#btn_ma_save').toggle(false);
$('#btn_cl_save').toggle(false);
}
// bind change event to all inputs
$('.ledCLconstr').bind("change", function() {
createClassicLeds();
});
$('.ledMAconstr').bind("change", function() {
createMatrixLeds();
});
// cl leds push to textfield and save values
$('#btn_cl_generate').off().on("click", function() {
if (finalLedArray != ""){
$("#ledconfig").text(JSON.stringify(finalLedArray, null, "\t"));
$('#collapse1').collapse('hide')
$('#collapse1').collapse('hide');
$('#collapse4').collapse('show');
}
});
// ma leds push to textfield and save values
$('#btn_ma_generate').off().on("click", function() {
if (finalLedArray != ""){
$("#ledconfig").text(JSON.stringify(finalLedArray, null, "\t"));
$('#collapse2').collapse('hide')
$('#collapse2').collapse('hide');
$('#collapse4').collapse('show');
}
});
// fill textfield with current led conf and copy to finalLedArray
$("#ledconfig").text(JSON.stringify(serverConfig.leds, null, "\t"));
finalLedArray = serverConfig.leds;
// ------------------------------------------------------------------
$(hyperion).on("cmd-ledcolors-ledstream-update",function(event){
if ($("#leddevices").length == 0)
{
requestLedColorsStop();
}
else
{
ledColors = (event.response.result.leds);
for(var idx=0; idx<ledColors.length; idx++)
{
led = ledColors[idx]
$("#led_"+led.index).css("background","rgb("+led.red+","+led.green+","+led.blue+")");
}
}
});
// ------------------------------------------------------------------
$(hyperion).on("cmd-ledcolors-ledstream-stop",function(event){
led_count = $(".led").length;
for(var idx=0; idx<led_count; idx++)
{
$('#led_'+idx).css("background-color","hsl("+(idx*360/led_count)+",100%,50%)");
}
});
// ------------------------------------------------------------------
$(hyperion).one("cmd-serverinfo",function(event){
server = event.response;
ledDevices = server.info.ledDevices.available
devRPiSPI = ['apa102', 'ws2801', 'lpd6803', 'lpd8806', 'p9813', 'sk6812spi', 'ws2812spi'];
devRPiPWM = ['ws281x'];
devRPiGPIO = ['piblaster'];
devNET = ['atmoorb', 'dmx', 'fadecandy', 'philipshue', 'tinkerforge', 'tpm2net', 'udpe131', 'udph801', 'udpraw'];
devUSB = ['adalight', 'adalightapa102', 'atmo', 'hyperionusbasp', 'lightpack', 'multilightpack', 'paintpack', 'rawhid', 'sedu', 'tpm2'];
var optArr = [[]];
optArr[1]=[];
optArr[2]=[];
optArr[3]=[];
optArr[4]=[];
optArr[5]=[];
for (idx=0; idx<ledDevices.length; idx++)
{
if($.inArray(ledDevices[idx], devRPiSPI) != -1)
optArr[0].push(ledDevices[idx]);
else if($.inArray(ledDevices[idx], devRPiPWM) != -1)
optArr[1].push(ledDevices[idx]);
else if($.inArray(ledDevices[idx], devRPiGPIO) != -1)
optArr[2].push(ledDevices[idx]);
else if($.inArray(ledDevices[idx], devNET) != -1)
optArr[3].push(ledDevices[idx]);
else if($.inArray(ledDevices[idx], devUSB) != -1)
optArr[4].push(ledDevices[idx]);
else
optArr[5].push(ledDevices[idx]);
}
$("#leddevices").append(createSel(optArr[0], "RPi SPI"));
$("#leddevices").append(createSel(optArr[1], "RPi PWM"));
$("#leddevices").append(createSel(optArr[2], "RPi GPIO"));
$("#leddevices").append(createSel(optArr[3], "Network"));
$("#leddevices").append(createSel(optArr[4], "USB"));
$("#leddevices").append(createSel(optArr[5], "Debug"));
$("#leddevices").val(server.info.ledDevices.active);
$("#leddevices").trigger("change");
});
// ------------------------------------------------------------------
$(hyperion).on("cmd-config-getconfig",function(event){
parsedConfJSON = event.response.result;
leds = parsedConfJSON.leds;
$("#ledconfig").text(JSON.stringify(leds, null, "\t"));
canvas_height = $('#leds_canvas').innerHeight();
canvas_width = $('#leds_canvas').innerWidth();
leds_html = "";
for(var idx=0; idx<leds.length; idx++)
{
led = leds[idx];
led_id='led_'+led.index;
bgcolor = "background-color:hsl("+(idx*360/leds.length)+",100%,50%);";
pos = "left:"+(led.hscan.minimum * canvas_width)+"px;"+
"top:"+(led.vscan.minimum * canvas_height)+"px;"+
"width:"+((led.hscan.maximum-led.hscan.minimum) * canvas_width-1)+"px;"+
"height:"+((led.vscan.maximum-led.vscan.minimum) * canvas_height-1)+"px;";
leds_html += '<div id="'+led_id+'" class="led" style="'+bgcolor+pos+'" title="'+led.index+'"><span id="'+led_id+'_num" class="led_num">'+led.index+'</span></div>';
}
$('#leds_canvas').html(leds_html);
$('#led_0').css({"z-index":"10"});
});
// ------------------------------------------------------------------
$('#leds_toggle_num').off().on("click", function() {
$('.led_num').toggle();
toggleClass('#leds_toggle_num', "btn-danger", "btn-success");
});
// ------------------------------------------------------------------
$('#leds_toggle').off().on("click", function() {
$('.led').toggle();
toggleClass('#leds_toggle', "btn-success", "btn-danger");
});
// ------------------------------------------------------------------
$('#leds_toggle_live').off().on("click", function() {
setClassByBool('#leds_toggle_live',ledStreamActive,"btn-success","btn-danger");
if ( ledStreamActive )
{
requestLedColorsStop();
}
else
{
requestLedColorsStart();
}
});
// ------------------------------------------------------------------
$("#leds_custom_updsim").off().on("click", function() {
if (validateText()){
string = $("#ledconfig").val();
createLedPreview(JSON.parse(string), 'text');
}
});
// ------------------------------------------------------------------
$("#leds_custom_save").off().on("click", function() {
function createLedConfig(){
var string = '{"leds" :';
string += $("#ledconfig").val();
string += "}";
return string
}
if (validateText())
requestWriteConfig(JSON.parse(createLedConfig()));
});
// ------------------------------------------------------------------
$('#leds_prev_toggle_num').off().on("click", function() {
$('.led_prev_num').toggle();
toggleClass('#leds_prev_toggle_num', "btn-danger", "btn-success");
});
// -------------------------------------------------------------
$('#leds_cfg_nav a[data-toggle="tab"]').off().on('shown.bs.tab', function (e) {
var target = $(e.target).attr("href") // activated tab
if (target == "#menu_gencfg" && !ledsCustomCfgInitialized)
{
ledsCustomCfgInitialized = true;
}
});
// ------------------------------------------------------------------
// create and update editor
var conf_editor = null;
$("#leddevices").off().on("change", function(event) {
generalOptions = parsedConfSchemaJSON.properties.device;
specificOptions = parsedConfSchemaJSON.properties.alldevices[$(this).val()];
//$('#ledDeviceOptions').html(JSON.stringify(generalOptions)+"<br>"+JSON.stringify(specificOptions));
$("#leddevices").off().on("change", function() {
generalOptions = serverSchema.properties.device;
specificOptions = serverSchema.properties.alldevices[$(this).val()];
conf_editor = createJsonEditor('editor_container', {
generalOptions : generalOptions,
specificOptions : specificOptions,
@ -506,11 +406,11 @@ $(document).ready(function() {
values_general = {};
values_specific = {};
isCurrentDevice = (server.info.ledDevices.active == $(this).val());
isCurrentDevice = (serverInfo.info.ledDevices.active == $(this).val());
for(var key in parsedConfJSON.device){
for(var key in serverConfig.device){
if (key != "type" && key in generalOptions.properties)
values_general[key] = parsedConfJSON.device[key];
values_general[key] = serverConfig.device[key];
};
conf_editor.getEditor("root.generalOptions").setValue( values_general );
@ -518,38 +418,111 @@ $(document).ready(function() {
{
specificOptions_val = conf_editor.getEditor("root.specificOptions").getValue()
for(var key in specificOptions_val){
values_specific[key] = (key in parsedConfJSON.device) ? parsedConfJSON.device[key] : specificOptions_val[key];
values_specific[key] = (key in serverConfig.device) ? serverConfig.device[key] : specificOptions_val[key];
};
conf_editor.getEditor("root.specificOptions").setValue( values_specific );
};
$('#editor_container .well').css("background-color","white");
$('#editor_container .well').css("border","none");
$('#editor_container .well').css("box-shadow","none");
if ($(this).val() == "philipshue")
{
$("#huebridge").show();
$("#ip").attr('value', values_specific.output);
$("#user").attr('value', values_specific.username);
if($("#ip").val() != '' && $("#user").val() != '') {
get_hue_lights();
}
}
// change save button state based on validation result
conf_editor.validate().length ? $('#btn_submit_controller').attr('disabled', true) : $('#btn_submit_controller').attr('disabled', false);
});
// create led device selection
ledDevices = serverInfo.info.ledDevices.available
devRPiSPI = ['apa102', 'ws2801', 'lpd6803', 'lpd8806', 'p9813', 'sk6812spi', 'sk6822spi', 'ws2812spi'];
devRPiPWM = ['ws281x'];
devRPiGPIO = ['piblaster'];
devNET = ['atmoorb', 'fadecandy', 'philipshue', 'tinkerforge', 'tpm2net', 'udpe131', 'udph801', 'udpraw'];
devUSB = ['adalight', 'dmx', 'atmo', 'hyperionusbasp', 'lightpack', 'multilightpack', 'paintpack', 'rawhid', 'sedu', 'tpm2'];
var optArr = [[]];
optArr[1]=[];
optArr[2]=[];
optArr[3]=[];
optArr[4]=[];
optArr[5]=[];
for (idx=0; idx<ledDevices.length; idx++)
{
if($.inArray(ledDevices[idx], devRPiSPI) != -1)
optArr[0].push(ledDevices[idx]);
else if($.inArray(ledDevices[idx], devRPiPWM) != -1)
optArr[1].push(ledDevices[idx]);
else if($.inArray(ledDevices[idx], devRPiGPIO) != -1)
optArr[2].push(ledDevices[idx]);
else if($.inArray(ledDevices[idx], devNET) != -1)
optArr[3].push(ledDevices[idx]);
else if($.inArray(ledDevices[idx], devUSB) != -1)
optArr[4].push(ledDevices[idx]);
else
optArr[5].push(ledDevices[idx]);
}
$("#leddevices").append(createSel(optArr[0], $.i18n('conf_leds_optgroup_RPiSPI')));
$("#leddevices").append(createSel(optArr[1], $.i18n('conf_leds_optgroup_RPiPWM')));
$("#leddevices").append(createSel(optArr[2], $.i18n('conf_leds_optgroup_RPiGPIO')));
$("#leddevices").append(createSel(optArr[3], $.i18n('conf_leds_optgroup_network')));
$("#leddevices").append(createSel(optArr[4], $.i18n('conf_leds_optgroup_usb')));
$("#leddevices").append(createSel(optArr[5], $.i18n('conf_leds_optgroup_debug')));
$("#leddevices").val(serverInfo.info.ledDevices.active);
$("#leddevices").trigger("change");
// validate textfield and update preview
$("#leds_custom_updsim").off().on("click", function() {
if (validateText()){
createLedPreview(JSON.parse($("#ledconfig").val()), 'text');
}
});
// save led config and saveValues - passing textfield
$("#btn_ma_save, #btn_cl_save").off().on("click", function() {
requestWriteConfig({"leds" :finalLedArray});
saveValues();
});
// validate and save led config from textfield
$("#leds_custom_save").off().on("click", function() {
if (validateText())
{
$("#huebridge").hide();
requestWriteConfig(JSON.parse('{"leds" :'+$("#ledconfig").val()+'}'));
saveValues();
}
});
// ------------------------------------------------------------------
// toggle led numbers
$('#leds_prev_toggle_num').off().on("click", function() {
$('.led_prev_num').toggle();
toggleClass('#leds_prev_toggle_num', "btn-danger", "btn-success");
});
// open checklist
$('#leds_prev_checklist').off().on("click", function() {
var liList = [$.i18n('conf_leds_leyout_checkp1'),$.i18n('conf_leds_leyout_checkp3'),$.i18n('conf_leds_leyout_checkp2'),$.i18n('conf_leds_leyout_checkp4')];
var ul = document.createElement("ul");
ul.className = "checklist"
for(var i = 0; i<liList.length; i++)
{
var li = document.createElement("li");
li.innerHTML = liList[i];
ul.appendChild(li);
}
showInfoDialog('checklist', "", ul);
});
// nav
$('#leds_cfg_nav a[data-toggle="tab"]').off().on('shown.bs.tab', function (e) {
var target = $(e.target).attr("href") // activated tab
if (target == "#menu_gencfg" && !ledsCustomCfgInitialized)
{
$('#leds_custom_updsim').trigger('click');
ledsCustomCfgInitialized = true;
}
});
// save led device config
$("#btn_submit_controller").off().on("click", function(event) {
if (conf_editor==null)
return;
ledDevice = $("#leddevices").val();
result = {device:{}};
@ -567,7 +540,8 @@ $(document).ready(function() {
requestWriteConfig(result)
});
requestServerConfig();
removeOverlay();
});

View File

@ -1,24 +1,149 @@
var conf_editor = null;
var createdCont = false;
performTranslation();
requestLoggingStart();
$(document).ready(function() {
requestLoggingStart();
var messages;
$('#conf_cont').append(createOptPanel('fa-reorder', $.i18n("edt_conf_log_heading_title"), 'editor_container', 'btn_submit'));
if(showOptHelp)
{
$('#conf_cont').append(createHelpTable(schema.logger.properties, $.i18n("edt_conf_log_heading_title")));
createHintH("intro", $.i18n('conf_logging_label_intro'), "log_head");
}
conf_editor = createJsonEditor('editor_container', {
logger : schema.logger
}, true, true);
conf_editor.on('change',function() {
conf_editor.validate().length ? $('#btn_submit').attr('disabled', true) : $('#btn_submit').attr('disabled', false);
});
$('#btn_submit').off().on('click',function() {
requestWriteConfig(conf_editor.getValue());
});
function uploadLog()
{
var reportUrl = 'https://glot.io/snippets/';
var log = "";
var config = JSON.stringify(serverConfig, null, "\t").replace(/"/g, '\\"');
var prios = serverInfo.info.priorities;
var comps = serverInfo.info.components;
//create log
for(var i = 0; i<messages.length; i++)
{
app_name = messages[i].appName;
logger_name = messages[i].loggerName;
function_ = messages[i].function;
line = messages[i].line;
file_name = messages[i].fileName;
msg = messages[i].message;
level_string = messages[i].levelString;
debug = "";
if(level_string == "DEBUG") {
debug = "<"+file_name+":"+line+":"+function_+"()> ";
}
log += "["+app_name+" "+logger_name+"] <"+level_string+"> "+debug+msg+"\n";
}
//create prios
var info = "######## PRIORITIES ######## \n";
for(var i = 0; i<prios.length; i++)
{
info += prios[i].priority;
if(prios[i].visible)
info += ' VISIBLE!';
else
info += ' ';
info += ' ('+prios[i].component+') Owner: '+prios[i].owner+'\n';
}
info += '\npriorities_autoselect: '+serverInfo.info.priorities_autoselect+'\n\n';
//create comps
info += '######## COMPONENTS ######## \n'
for(var i = 0; i<comps.length; i++)
{
info += comps[i].enabled+' - '+comps[i].name+'\n';
}
$.ajax({
url: 'https://snippets.glot.io/snippets',
// headers: { "Authorization": "Token 9ed92d37-36ca-4430-858f-47b6a3d4d535", "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Methods": "GET,HEAD,OPTIONS,POST,PUT", "Access-Control-Allow-Headers": "Origin, X-Requested-With, Content-Type, Accept, Authorization" },
crossDomain: true,
contentType: 'application/json',
type: 'POST',
timeout: 7000,
data: '{"language":"plaintext","title":"Hyperion '+currentVersion+' Report ('+serverConfig.general.name+' ('+serverInfo.info.ledDevices.active+'))","public":false,"files":[{"name":"Info","content":"'+info+'"},{"name":"Hyperion Log","content":"'+log+'"},{"name":"Hyperion Config","content":"'+config+'"}]}'
})
.done( function( data, textStatus, jqXHR ) {
reportUrl += data.id;
if(textStatus == "success")
{
$('#upl_link').html($.i18n('conf_logging_yourlink')+': <a href="'+reportUrl+'" target="_blank">'+reportUrl+'</a>');
$("html, body").animate({ scrollTop: 9999 }, "fast");
}
else
{
$('#btn_logupload').attr("disabled", false);
$('#upl_link').html('<span style="color:red">'+$.i18n('conf_logging_uplfailed')+'<span>');
}
})
.fail( function( jqXHR, textStatus ) {
//console.log(jqXHR, textStatus)
});
}
if (!loggingHandlerInstalled)
{
loggingHandlerInstalled = true;
$(hyperion).on("cmd-logging-update",function(event){
if ($("#logmessages").length == 0)
messages = (event.response.result.messages);
if(messages.length != 0 && !createdCont)
{
requestLoggingStop();
$('#log_content').html('<pre><div id="logmessages" style="overflow:scroll;max-height:400px"></div></pre><button class="btn btn-primary" id="btn_logupload">'+$.i18n('conf_logging_btn_pbupload')+'</button><button class="btn btn-success" id="btn_autoscroll" style="margin-left:10px;">'+$.i18n('conf_logging_btn_autoscroll')+'</button><div id="upl_link" style="margin-top:10px;font-weight:bold;"></div>');
createdCont = true;
$('#btn_autoscroll').off().on('click',function() {
toggleClass('#btn_autoscroll', "btn-success", "btn-danger");
});
$('#btn_logupload').off().on('click',function() {
uploadLog();
$(this).attr("disabled", true);
$('#upl_link').html($.i18n('conf_logging_uploading'))
});
}
else
for(var idx=0; idx<messages.length; idx++)
{
messages = (event.response.result.messages);
for(var idx=0; idx<messages.length; idx++)
{
msg = messages[idx];
$("#logmessages").html($("#logmessages").html()+"\n"+msg);
app_name = messages[idx].appName;
logger_name = messages[idx].loggerName;
function_ = messages[idx].function;
line = messages[idx].line;
file_name = messages[idx].fileName;
msg = messages[idx].message;
level_string = messages[idx].levelString;
var debug = "";
if(level_string == "DEBUG") {
debug = "&lt;"+file_name+":"+line+":"+function_+"()&gt; ";
}
$("#logmessages").html($("#logmessages").html()+"\n <code>"+"["+app_name+" "+logger_name+"] &lt;"+level_string+"&gt; "+debug+msg+"</code>");
}
if($("#btn_autoscroll").hasClass('btn-success')){
$('#logmessages').stop().animate({
scrollTop: $('#logmessages')[0].scrollHeight
}, 800);
}
});
}
removeOverlay();
});

View File

@ -1,22 +1,131 @@
var conf_editor = null;
$(hyperion).one("cmd-config-getschema", function(event) {
schema = parsedConfSchemaJSON.properties;
conf_editor = createJsonEditor('editor_container', {
jsonServer : schema.jsonServer,
protoServer : schema.protoServer,
boblightServer : schema.boblightServer,
udpListener : schema.udpListener,
forwarder : schema.forwarder,
}, true);
$('#btn_submit').off().on('click',function() {
requestWriteConfig(conf_editor.getValue());
});
});
$(document).ready( function() {
requestServerConfigSchema();
performTranslation();
var conf_editor_json = null;
var conf_editor_proto = null;
var conf_editor_bobl = null;
var conf_editor_udpl = null;
var conf_editor_forw = null;
if(showOptHelp)
{
//jsonserver
$('#conf_cont').append(createRow('conf_cont_json'))
$('#conf_cont_json').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_js_heading_title"), 'editor_container_jsonserver', 'btn_submit_jsonserver'));
$('#conf_cont_json').append(createHelpTable(schema.jsonServer.properties, $.i18n("edt_conf_js_heading_title")));
//protoserver
$('#conf_cont').append(createRow('conf_cont_proto'))
$('#conf_cont_proto').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_ps_heading_title"), 'editor_container_protoserver', 'btn_submit_protoserver'));
$('#conf_cont_proto').append(createHelpTable(schema.protoServer.properties, $.i18n("edt_conf_ps_heading_title")));
//boblight
$('#conf_cont').append(createRow('conf_cont_bobl'))
$('#conf_cont_bobl').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_bobls_heading_title"), 'editor_container_boblightserver', 'btn_submit_boblightserver'));
$('#conf_cont_bobl').append(createHelpTable(schema.boblightServer.properties, $.i18n("edt_conf_bobls_heading_title")));
//udplistener
$('#conf_cont').append(createRow('conf_cont_udpl'))
$('#conf_cont_udpl').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_udpl_heading_title"), 'editor_container_udplistener', 'btn_submit_udplistener'));
$('#conf_cont_udpl').append(createHelpTable(schema.udpListener.properties, $.i18n("edt_conf_udpl_heading_title")));
//forwarder
if(storedAccess != 'default')
{
$('#conf_cont').append(createRow('conf_cont_fw'))
$('#conf_cont_fw').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_fw_heading_title"), 'editor_container_forwarder', 'btn_submit_forwarder'));
$('#conf_cont_fw').append(createHelpTable(schema.forwarder.properties, $.i18n("edt_conf_fw_heading_title")));
}
}
else
{
$('#conf_cont').addClass('row');
$('#conf_cont').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_js_heading_title"), 'editor_container_jsonserver', 'btn_submit_jsonserver'));
$('#conf_cont').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_ps_heading_title"), 'editor_container_protoserver', 'btn_submit_protoserver'));
$('#conf_cont').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_bobls_heading_title"), 'editor_container_boblightserver', 'btn_submit_boblightserver'));
$('#conf_cont').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_udpl_heading_title"), 'editor_container_udplistener', 'btn_submit_udplistener'));
if(storedAccess != 'default')
$('#conf_cont').append(createOptPanel('fa-sitemap', $.i18n("edt_conf_fw_heading_title"), 'editor_container_forwarder', 'btn_submit_forwarder'));
}
//json
conf_editor_json = createJsonEditor('editor_container_jsonserver', {
jsonServer : schema.jsonServer
}, true, true);
conf_editor_json.on('change',function() {
conf_editor_json.validate().length ? $('#btn_submit_jsonserver').attr('disabled', true) : $('#btn_submit_jsonserver').attr('disabled', false);
});
$('#btn_submit_jsonserver').off().on('click',function() {
requestWriteConfig(conf_editor_json.getValue());
});
//proto
conf_editor_proto = createJsonEditor('editor_container_protoserver', {
protoServer : schema.protoServer
}, true, true);
conf_editor_proto.on('change',function() {
conf_editor_proto.validate().length ? $('#btn_submit_protoserver').attr('disabled', true) : $('#btn_submit_protoserver').attr('disabled', false);
});
$('#btn_submit_protoserver').off().on('click',function() {
requestWriteConfig(conf_editor_proto.getValue());
});
//boblight
conf_editor_bobl = createJsonEditor('editor_container_boblightserver', {
boblightServer : schema.boblightServer
}, true, true);
conf_editor_bobl.on('change',function() {
conf_editor_bobl.validate().length ? $('#btn_submit_boblightserver').attr('disabled', true) : $('#btn_submit_boblightserver').attr('disabled', false);
});
$('#btn_submit_boblightserver').off().on('click',function() {
requestWriteConfig(conf_editor_bobl.getValue());
});
//udplistener
conf_editor_udpl = createJsonEditor('editor_container_udplistener', {
udpListener : schema.udpListener
}, true, true);
conf_editor_udpl.on('change',function() {
conf_editor_udpl.validate().length ? $('#btn_submit_udplistener').attr('disabled', true) : $('#btn_submit_udplistener').attr('disabled', false);
});
$('#btn_submit_udplistener').off().on('click',function() {
requestWriteConfig(conf_editor_udpl.getValue());
});
if(storedAccess != 'default')
{
//forwarder
conf_editor_forw = createJsonEditor('editor_container_forwarder', {
forwarder : schema.forwarder
}, true, true);
conf_editor_forw.on('change',function() {
conf_editor_forw.validate().length ? $('#btn_submit_forwarder').attr('disabled', true) : $('#btn_submit_forwarder').attr('disabled', false);
});
$('#btn_submit_forwarder').off().on('click',function() {
requestWriteConfig(conf_editor_forw.getValue());
});
}
//create introduction
if(showOptHelp)
{
createHint("intro", $.i18n('conf_network_json_intro'), "editor_container_jsonserver");
createHint("intro", $.i18n('conf_network_proto_intro'), "editor_container_protoserver");
createHint("intro", $.i18n('conf_network_bobl_intro'), "editor_container_boblightserver");
createHint("intro", $.i18n('conf_network_udpl_intro'), "editor_container_udplistener");
createHint("intro", $.i18n('conf_network_forw_intro'), "editor_container_forwarder");
}
removeOverlay();
});

View File

@ -1,72 +1,199 @@
$(document).ready(function() {
performTranslation();
var oldEffects = [];
var cpcolor = '#B500FF';
var mappingList = serverSchema.properties.color.properties.imageToLedMappingType.enum;
function updateInputSelect()
//create html
createTable('ssthead', 'sstbody', 'sstcont');
$('.ssthead').html(createTableRow([$.i18n('remote_input_origin'), $.i18n('remote_input_owner'), $.i18n('remote_input_priority'), $.i18n('remote_input_status')], true, true));
createTable('crthead', 'crtbody', 'adjust_content', true);
//create introduction
if(showOptHelp)
{
var data = "";
var i;
for(i = 0; i < parsedServerInfoJSON.info.priorities.length; i++) {
var owner = parsedServerInfoJSON.info.priorities[i].owner;
var active = parsedServerInfoJSON.info.priorities[i].active;
var visible = parsedServerInfoJSON.info.priorities[i].visible;
var priority = parsedServerInfoJSON.info.priorities[i].priority;
var btn_type = "default";
if (active) btn_type = "warning";
if (visible) btn_type = "success";
data += '<button id="srcBtn'+i+'" type="button" class="btn btn-lg btn-'+btn_type+' btn_input_selection" style="margin:10px;min-width:200px" onclick="requestSetSource('+priority+');">'+owner+'<span style="font-size:70% !important;"> ('+priority+')</span></button><br/>';
createHint("intro", $.i18n('remote_color_intro', $.i18n('remote_losthint')), "color_intro");
createHint("intro", $.i18n('remote_input_intro', $.i18n('remote_losthint')), "sstcont");
createHint("intro", $.i18n('remote_adjustment_intro', $.i18n('remote_losthint')), "adjust_content");
createHint("intro", $.i18n('remote_components_intro', $.i18n('remote_losthint')), "comp_intro");
createHint("intro", $.i18n('remote_maptype_intro', $.i18n('remote_losthint')), "maptype_intro");
}
//color adjustment
var sColor = sortProperties(serverSchema.properties.color.properties.channelAdjustment.items.properties)
var values = serverInfo.info.adjustment[0]
for(key in sColor)
{
if(sColor[key].key != "id" && sColor[key].key != "leds")
{
var title = '<label for="cr_'+sColor[key].key+'">'+$.i18n(sColor[key].title)+'</label>';
var property;
var value = values[sColor[key].key]
if(sColor[key].type == "array")
{
property = '<div id="cr_'+sColor[key].key+'" class="input-group colorpicker-component" ><input type="text" class="form-control" /><span class="input-group-addon"><i></i></span></div>';
$('.crtbody').append(createTableRow([title, property], false, true));
createCP('cr_'+sColor[key].key, value, function(rgb,hex,e){
requestAdjustment(e.target.id.substr(e.target.id.indexOf("_") + 1), '['+rgb.r+','+rgb.g+','+rgb.b+']');
});
}
else if(sColor[key].type == "boolean")
{
property = '<div class="checkbox"><input id="cr_'+sColor[key].key+'" type="checkbox" value="'+value+'"/><label></label></div>';
$('.crtbody').append(createTableRow([title, property], false, true));
$('#cr_'+sColor[key].key).off().on('change', function(e){
requestAdjustment(e.target.id.substr(e.target.id.indexOf("_") + 1), e.currentTarget.checked);
});
}
else
{
if(sColor[key].key == "brightness" || sColor[key].key == "backlightThreshold")
property = '<input id="cr_'+sColor[key].key+'" type="number" class="form-control" min="0.0" max="1.0" step="0.05" value="'+value+'"/>';
else
property = '<input id="cr_'+sColor[key].key+'" type="number" class="form-control" min="0.0" max="4.0" step="0.1" value="'+value+'"/>';
$('.crtbody').append(createTableRow([title, property], false, true));
$('#cr_'+sColor[key].key).off().on('change', function(e){
requestAdjustment(e.target.id.substr(e.target.id.indexOf("_") + 1), e.currentTarget.value);
});
}
}
data += '<button id="srcBtn'+i+'" type="button" class="btn btn-lg btn-info btn_input_selection" style="margin:10px;min-width:200px" onclick="requestSetSource(\'auto\');" lang="en" data-lang-token="remote_input_label_autoselect">auto selection</button><br/>';
$('#hyperion_inputs').html(data);
}
function updateRemote()
{
if ($('#componentsbutton').length == 0)
{
$(hyperion).off("cmd-serverinfo",updateRemote);
}
else
{
updateInputSelect();
updateLedMapping();
updateComponents();
updateEffectlist();
}
}
function updateInputSelect()
{
$('.sstbody').html("");
var data = "";
var prios = serverInfo.info.priorities
var i;
for(i = 0; i < prios.length; i++)
{
var origin = "not impl";
var ip = "xxx.xxx.xxx.xxx";
var owner = prios[i].owner;
var active = prios[i].active;
var visible = prios[i].visible;
var priority = prios[i].priority;
var compId = prios[i].componentId;
var duration = prios[i].duration_ms/1000;
var btn_type = "default";
var btn_text = $.i18n('remote_input_setsource_btn');
var btn_state = "enabled";
if (active) btn_type = "warning";
if (visible)
{
btn_state = "disabled";
btn_type = "success";
btn_text = $.i18n('remote_input_sourceactiv_btn');
}
if(ip)
origin += '<br/><span style="font-size:80%; color:grey;">'+$.i18n('remote_input_ip')+' '+ip+'</span>';
if(compId == "10")
owner = $.i18n('remote_effects_label_effects')+' '+owner;
if(compId == "9")
owner = $.i18n('remote_color_label_color')+' '+'<div style="width:18px; height:18px; border-radius:20px; margin-bottom:-4px; border:1px grey solid; background-color: rgb('+prios[i].value.RGB+'); display:inline-block" title="RGB: ('+prios[i].value.RGB+')"></div>';
if(compId == "7")
owner = $.i18n('general_comp_GRABBER')+': ('+owner+')';
if(compId == "8")
owner = $.i18n('general_comp_V4L')+': ('+owner+')';
if(compId == "6")
owner = $.i18n('general_comp_BOBLIGHTSERVER');
if(compId == "5")
owner = $.i18n('general_comp_UDPLISTENER');
if(owner == "Off")
owner = $.i18n('general_btn_off');
if(duration)
owner += '<br/><span style="font-size:80%; color:grey;">'+$.i18n('remote_input_duration')+' '+duration.toFixed(0)+$.i18n('edt_append_s')+'</span>';
var btn = '<button id="srcBtn'+i+'" type="button" '+btn_state+' class="btn btn-'+btn_type+' btn_input_selection" onclick="requestSetSource('+priority+');">'+btn_text+'</button>';
if((compId == "10" || compId == "9") && priority != 254)
btn += '<button type="button" class="btn btn-sm btn-danger" style="margin-left:10px;" onclick="requestPriorityClear('+priority+');"><i class="fa fa-close"></button>';
if(btn_type != 'default')
$('.sstbody').append(createTableRow([origin, owner, priority, btn], false, true));
}
var btn_auto_color = (serverInfo.info.priorities_autoselect? "btn-success" : "btn-danger");
var btn_auto_state = (serverInfo.info.priorities_autoselect? "disabled" : "enabled");
var btn_auto_text = (serverInfo.info.priorities_autoselect? $.i18n('general_btn_on') : $.i18n('general_btn_off'));
$('#auto_btn').html('<button id="srcBtn'+i+'" type="button" '+btn_auto_state+' class="btn '+btn_auto_color+'" style="margin:10px;display:inline-block;" onclick="requestSetSource(\'auto\');">'+$.i18n('remote_input_label_autoselect')+' ('+btn_auto_text+')</button>');
var max_width=200;
var max_width=100;
$('.btn_input_selection').each(function() {
if ($(this).innerWidth() > max_width)
max_width = $(this).innerWidth();
});
$('.btn_input_selection').css("min-width",max_width+"px");
}
function updateLedMapping()
{
mapping = serverInfo.info.ledMAppingType;
function updateComponents(event) {
if ($('#componentsbutton').length == 0)
$('#mappingsbutton').html("");
for(var ix = 0; ix < mappingList.length; ix++)
{
$(hyperion).off("cmd-serverinfo",updateComponents);
if(mapping == mappingList[ix])
btn_style = 'btn-success';
else
btn_style = 'btn-warning';
$('#mappingsbutton').append('<button type="button" id="lmBtn_'+mappingList[ix]+'" class="btn '+btn_style+'" style="margin:10px;min-width:200px" onclick="requestMappingType(\''+mappingList[ix]+'\');">'+$.i18n('remote_maptype_label_'+mappingList[ix])+'</button><br/>');
}
else
}
function updateComponents()
{
components = serverInfo.info.components;
// create buttons
$('#componentsbutton').html("");
for ( idx=0; idx<components.length;idx++)
{
updateInputSelect();
components = event.response.info.components;
// create buttons
$('#componentsbutton').html("");
for ( idx=0; idx<components.length;idx++)
enable_style = (components[idx].enabled? "btn-success" : "btn-danger");
enable_icon = (components[idx].enabled? "fa-play" : "fa-stop");
comp_name = components[idx].name;
comp_btn_id = "comp_btn_"+comp_name;
// create btn if not there
if ($("#"+comp_btn_id).length == 0)
{
//components_html += '<tr><td>'+(components[idx].title)+'</td><td><i class="fa fa-circle component-'+(components[idx].enabled?"on":"off")+'"></i></td></tr>';
enable_style = (components[idx].enabled? "btn-success" : "btn-danger");
enable_icon = (components[idx].enabled? "fa-play" : "fa-stop");
comp_name = components[idx].name;
comp_btn_id = "comp_btn_"+comp_name;
// create btn if not there
if ($("#"+comp_btn_id).length == 0)
{
d='<p><button type="button" id="'+comp_btn_id+'" class="btn '+enable_style
+'" onclick="requestSetComponentState(\''+comp_name+'\','+(!components[idx].enabled)
+')"><i id="'+comp_btn_id+'_icon" class="fa '+enable_icon+'"></i></button> <span lang="en" data-lang-token="general_comp_'+components[idx].name+'"> '+components[idx].title+'</span></p>';
$('#componentsbutton').append(d);
}
else // already create, update state
{
setClassByBool( $('#'+comp_btn_id) , components[idx].enabled, "btn-danger", "btn-success" );
setClassByBool( $('#'+comp_btn_id+"_icon"), components[idx].enabled, "fa-stop" , "fa-play" );
$('#'+comp_btn_id).attr("onclick",'requestSetComponentState(\''+comp_name+'\','+(!components[idx].enabled)+')');
}
d='<p><button type="button" id="'+comp_btn_id+'" class="btn '+enable_style
+'" onclick="requestSetComponentState(\''+comp_name+'\','+(!components[idx].enabled)
+')"><i id="'+comp_btn_id+'_icon" class="fa '+enable_icon+'"></i></button> '+$.i18n('general_comp_'+components[idx].name)+'</p>';
$('#componentsbutton').append(d);
}
else // already create, update state
{
setClassByBool( $('#'+comp_btn_id) , components[idx].enabled, "btn-danger", "btn-success" );
setClassByBool( $('#'+comp_btn_id+"_icon"), components[idx].enabled, "fa-stop" , "fa-play" );
$('#'+comp_btn_id).attr("onclick",'requestSetComponentState(\''+comp_name+'\','+(!components[idx].enabled)+')');
}
}
}
var oldEffects = [];
function updateEffectlist(event){
var newEffects = event.response.info.effects;
function updateEffectlist()
{
var newEffects = serverInfo.info.effects;
if (newEffects.length != oldEffects.length)
{
$('#effect_select').html('<option value="__none__"></option>');
@ -82,63 +209,43 @@
sysEffArr.push(effectName);
}
}
$('#effect_select').append(createSel(usrEffArr, "User Effects"));
$('#effect_select').append(createSel(sysEffArr, "Provided Effects"));
$('#effect_select').append(createSel(usrEffArr, $.i18n('remote_optgroup_usreffets')));
$('#effect_select').append(createSel(sysEffArr, $.i18n('remote_optgroup_syseffets')));
oldEffects = newEffects;
}
}
// colorpicker and effect
if (getStorage('rmcpcolor') != null)
cpcolor = getStorage('rmcpcolor');
createCP('cp2', cpcolor, function(rgb,hex){
requestSetColor(rgb.r, rgb.g, rgb.b);
$("#effect_select").val("__none__");
setStorage('rmcpcolor', hex);
});
$(document).ready(function() {
// color
$(function() {
$('#cp2').colorpicker({
format: 'rgb',
$("#reset_color").off().on("click", function(){
requestPriorityClear();
$("#effect_select").val("__none__");
});
colorSelectors: {
'default': '#777777',
'primary': '#337ab7',
'success': '#5cb85c',
'info' : '#5bc0de',
'warning': '#f0ad4e',
'danger' : '#d9534f'
},
customClass: 'colorpicker-2x',
sliders: {
saturation: {
maxLeft: 200,
maxTop: 200
},
hue: {
maxTop: 200
},
alpha: {
maxTop: 200
},
}
$("#effect_select").off().on("change", function(event) {
efx = $(this).val();
if(efx != "__none__")
{
requestPriorityClear();
$(hyperion).one("cmd-clear", function(event) {
setTimeout(function() {requestPlayEffect(efx)}, 100);
});
$('#cp2').colorpicker().on('changeColor', function(e) {
color = e.color.toRGB();
$("#effect_select").val("__none__");
requestSetColor(color.r, color.g, color.b);
});
});
$("#reset_color").off().on("click", requestPriorityClear);
$("#effect_select").off().on("change", function(event) {
efx = $(this).val();
if(efx != "__none__")
{
requestPriorityClear();
$(hyperion).one("cmd-clear", function(event) {
setTimeout(function() {requestPlayEffect(efx)}, 100);
});
}
});
// components
$(hyperion).on("cmd-serverinfo",updateComponents);
// effects
$(hyperion).on("cmd-serverinfo",updateEffectlist);
}
});
//force first update
updateRemote();
// interval updates
$(hyperion).on("cmd-serverinfo",updateRemote);
removeOverlay();
});

View File

@ -0,0 +1,29 @@
$(document).ready( function() {
performTranslation();
var conf_editor = null;
$('#conf_cont').append(createOptPanel('fa-wrench', $.i18n("edt_conf_webc_heading_title"), 'editor_container', 'btn_submit'));
if(showOptHelp)
{
$('#conf_cont').append(createHelpTable(schema.webConfig.properties, $.i18n("edt_conf_webc_heading_title")));
}
conf_editor = createJsonEditor('editor_container', {
webConfig : schema.webConfig
}, true, true);
conf_editor.on('change',function() {
conf_editor.validate().length ? $('#btn_submit').attr('disabled', true) : $('#btn_submit').attr('disabled', false);
});
$('#btn_submit').off().on('click',function() {
requestWriteConfig(conf_editor.getValue());
});
if(showOptHelp)
createHint("intro", $.i18n('conf_webconfig_label_intro'), "editor_container");
removeOverlay();
});

View File

@ -1,61 +1,67 @@
/**
* Enables translation for the form
* with the ID given in "formID"
* Generates token with the given token prefix
* and an underscore followed by the input id
* Example: input id = input_one
* token prefix = tokenprefix
* The translation token would be: "tokenprefix_input_one"
* Default language in "lang" attribute will always be "en"
* @param {String} tokenPrefix
* @param {String} formID
function enableFormTranslation(tokenPrefix, formID) {
var $inputs = $("#" + formID + " label");
$inputs.each(function() {
console.log("InputID: " + $(this).attr('id'));
var oldtext = $("label[for='" + $(this).attr('id') + "']").text();
$("label[for='" + $(this).attr('id') + "']").html('<span lang="en" data-lang-token="' + tokenPrefix + "_" + $(this).attr('id') + '">' + oldtext + '</span>');
});
}
*/
// global vars
var webPrio = 1;
var showOptHelp;
var currentVersion;
var cleanCurrentVersion;
var latestVersion;
var cleanLatestVersion;
var parsedServerInfoJSON = {};
var serverInfo = {};
var parsedUpdateJSON = {};
var parsedConfSchemaJSON = {};
var parsedConfJSON = {};
var hyperionport = 19444;
var serverSchema = {};
var serverConfig = {};
var schema;
var jsonPort = 19444;
var websocket = null;
var hyperion = {};
var wsTan = 1;
var cronId = 0;
var ledStreamActive=false;
var loggingStreamActive=false;
var ledStreamActive = false;
var imageStreamActive = false;
var loggingStreamActive = false;
var loggingHandlerInstalled = false;
var watchdog = 0;
var debugMessagesActive = true;
function initRestart()
{
$(hyperion).off();
requestServerConfigReload();
watchdog = 10;
connectionLostDetection('restart');
}
//
function cron()
{
if ( watchdog > 2)
requestServerInfo();
$(hyperion).trigger({type:"cron"});
}
function connectionLostDetection(type)
{
if ( watchdog > 1 )
{
var interval_id = window.setInterval("", 9999); // Get a reference to the last
for (var i = 1; i < interval_id; i++)
window.clearInterval(i);
$("body").html($("#container_connection_lost").html());
connectionLostAction();
if(type == 'restart')
{
$("body").html($("#container_restart").html());
restartAction();
}
else
{
$("body").html($("#container_connection_lost").html());
connectionLostAction();
}
}
else
{
$.get( "/cgi/cfg_jsonserver", function() {watchdog=0}).fail(function() {watchdog++;});
}
requestServerInfo();
$(hyperion).trigger({type:"cron"});
}
setInterval(connectionLostDetection, 3000);
// init websocket to hyperion and bind socket events to jquery events of $(hyperion) object
function initWebSocket()
{
@ -64,7 +70,7 @@ function initWebSocket()
if (websocket == null)
{
$.ajax({ url: "/cgi/cfg_jsonserver" }).done(function(data) {
hyperionport = data.substr(1);
jsonPort = data.substr(1);
websocket = new WebSocket('ws://'+document.location.hostname+data);
websocket.onopen = function (event) {
@ -97,6 +103,8 @@ function initWebSocket()
default: reason = "Unknown reason";
}
$(hyperion).trigger({type:"close", reason:reason});
watchdog = 10;
connectionLostDetection();
};
websocket.onmessage = function (event) {
@ -138,95 +146,160 @@ function initWebSocket()
}
}
function sendToHyperion(command, subcommand, msg)
{
if (typeof subcommand != 'undefined' && subcommand.length > 0)
subcommand = ',"subcommand":"'+subcommand+'"';
else
subcommand = "";
if (typeof msg != 'undefined' && msg.length > 0)
msg = ","+msg;
else
msg = "";
websocket.send(encode_utf8('{"command":"'+command+'", "tan":'+wsTan+subcommand+msg+'}'));
}
// -----------------------------------------------------------
// wrapped server commands
// also used for watchdog
function requestServerInfo() {
watchdog++;
websocket.send('{"command":"serverinfo", "tan":'+wsTan+'}');
function requestServerInfo()
{
sendToHyperion("serverinfo");
}
function requestServerConfigSchema() {
websocket.send('{"command":"config", "tan":'+wsTan+',"subcommand":"getschema"}');
function requestServerConfigSchema()
{
sendToHyperion("config","getschema");
}
function requestServerConfig() {
websocket.send('{"command":"config", "tan":'+wsTan+',"subcommand":"getconfig"}');
function requestServerConfig()
{
sendToHyperion("config", "getconfig");
}
function requestServerConfigReload() {
websocket.send('{"command":"config", "tan":'+wsTan+',"subcommand":"reload"}');
function requestServerConfigReload()
{
sendToHyperion("config", "reload");
}
function requestLedColorsStart() {
function requestLedColorsStart()
{
ledStreamActive=true;
websocket.send('{"command":"ledcolors", "tan":'+wsTan+',"subcommand":"ledstream-start"}');
sendToHyperion("ledcolors", "ledstream-start");
}
function requestLedColorsStop() {
function requestLedColorsStop()
{
ledStreamActive=false;
websocket.send('{"command":"ledcolors", "tan":'+wsTan+',"subcommand":"ledstream-stop"}');
sendToHyperion("ledcolors", "ledstream-stop");
}
function requestPriorityClear() {
websocket.send('{"command":"clear", "tan":'+wsTan+', "priority":1}');
function requestLedImageStart()
{
imageStreamActive=true;
sendToHyperion("ledcolors", "imagestream-start");
}
function requestPlayEffect(effectName) {
websocket.send('{"command":"effect", "tan":'+wsTan+',"effect":{"name":"'+effectName+'"},"priority":1}');
function requestLedImageStop()
{
imageStreamActive=false;
sendToHyperion("ledcolors", "imagestream-stop");
}
function requestSetColor(r,g,b) {
websocket.send('{"command":"color", "tan":'+wsTan+', "color":['+r+','+g+','+b+'], "priority":1}');
function requestPriorityClear(prio)
{
if(typeof prio !== 'number')
prio = webPrio;
sendToHyperion("clear", "", '"priority":'+prio+'');
}
function requestSetComponentState(comp, state){
state_str = state?"true":"false";
websocket.send('{"command":"componentstate", "tan":'+wsTan+',"componentstate":{"component":"'+comp+'","state":'+state_str+'}}');
console.log(comp+' state: '+state_str);
function requestPlayEffect(effectName)
{
sendToHyperion("effect", "", '"effect":{"name":"'+effectName+'"},"priority":'+webPrio+'');
}
function requestSetColor(r,g,b)
{
sendToHyperion("color", "", '"color":['+r+','+g+','+b+'], "priority":'+webPrio+'');
}
function requestSetComponentState(comp, state)
{
state_str = state ? "true" : "false";
sendToHyperion("componentstate", "", '"componentstate":{"component":"'+comp+'","state":'+state_str+'}');
}
function requestSetSource(prio)
{
if ( prio == "auto" )
websocket.send('{"command":"sourceselect", "tan":'+wsTan+', "auto" : true}');
sendToHyperion("sourceselect", "", '"auto":true');
else
websocket.send('{"command":"sourceselect", "tan":'+wsTan+', "priority" : '+prio+'}');
sendToHyperion("sourceselect", "", '"priority":'+prio);
}
function requestWriteConfig(config)
function requestWriteConfig(config, full)
{
var complete_config = parsedConfJSON;
jQuery.each(config, function(i, val) {
complete_config[i] = val;
if(full === true)
serverConfig = config;
else
{
jQuery.each(config, function(i, val) {
serverConfig[i] = val;
});
}
var config_str = escape(encode_utf8(JSON.stringify(serverConfig)));
$.post( "/cgi/cfg_set", { cfg: config_str })
.done(function( data ) {
$("html, body").animate({ scrollTop: 0 }, "slow");
})
.fail(function() {
showInfoDialog('error', $.i18n('infoDialog_writeconf_error_title'), $.i18n('infoDialog_writeconf_error_text'));
});
websocket.send('{"command":"config","subcommand":"setconfig", "tan":'+wsTan+', "config":'+JSON.stringify(complete_config)+'}');
}
function requestWriteEffect(effectName,effectPy,effectArgs)
{
var cutArgs = effectArgs.slice(1, -1);
websocket.send('{"command":"create-effect","name":"'+effectName+'", "script":"'+effectPy+'", '+cutArgs+'}');
sendToHyperion("create-effect", "", '"name":"'+effectName+'", "script":"'+effectPy+'", '+cutArgs);
}
function requestTestEffect(effectName,effectPy,effectArgs) {
websocket.send('{"command":"effect", "tan":'+wsTan+',"effect":{"name":"'+effectName+'", "args":'+effectArgs+'},"priority":1, "pythonScript":"'+effectPy+'"}');
function requestTestEffect(effectName,effectPy,effectArgs)
{
sendToHyperion("effect", "", '"effect":{"name":"'+effectName+'", "args":'+effectArgs+'},"priority":'+webPrio+', "pythonScript":"'+effectPy+'"}');
}
function requestDeleteEffect(effectName) {
websocket.send('{"command":"delete-effect", "tan":'+wsTan+',"name":"'+effectName+'"}');
function requestDeleteEffect(effectName)
{
sendToHyperion("delete-effect", "", '"name":"'+effectName+'"');
}
function requestLoggingStart() {
function requestLoggingStart()
{
loggingStreamActive=true;
websocket.send('{"command":"logging", "tan":'+wsTan+',"subcommand":"start"}');
sendToHyperion("logging", "start");
}
function requestLoggingStop() {
function requestLoggingStop()
{
loggingStreamActive=false;
websocket.send('{"command":"logging", "tan":'+wsTan+',"subcommand":"stop"}');
sendToHyperion("logging", "stop");
}
function requestMappingType(type)
{
sendToHyperion("processing", "", '"mappingType": "'+type+'"');
}
function requestAdjustment(type, value, complete)
{
if(complete === true)
sendToHyperion("adjustment", "", '"adjustment": '+type+'');
else
sendToHyperion("adjustment", "", '"adjustment": {"'+type+'": '+value+'}');
}

View File

@ -0,0 +1,150 @@
$(document).ready(function() {
var modalOpened = false;
var ledsim_width = 540;
var ledsim_height = 489;
var dialog;
var leds;
var lC = false;
$(hyperion).one("ready",function(){
leds = serverConfig.leds;
if(showOptHelp)
{
createHint('intro', $.i18n('main_ledsim_text'), 'ledsim_text');
$('#ledsim_text').css({'margin':'10px 15px 0px 15px'});
$('#ledsim_text .intro-hint').css("margin","0px")
}
if(getStorage('ledsim_width') != null)
{
ledsim_width = getStorage('ledsim_width');
ledsim_height = getStorage('ledsim_height');
}
dialog = $("#ledsim_dialog").dialog({
uiLibrary: 'bootstrap',
resizable: true,
modal: false,
minWidth: 250,
width: ledsim_width,
minHeight: 350,
height: ledsim_height,
closeOnEscape: true,
autoOpen: false,
title: $.i18n('main_ledsim_title'),
resize: function (e) {
updateLedLayout();
},
opened: function (e) {
if(!lC)
{
updateLedLayout();
lC = true;
}
modalOpened = true;
requestLedColorsStart();
if($('#leds_toggle_live_video').hasClass('btn-success'))
requestLedImageStart();
},
closed: function (e) {
modalOpened = false;
},
resizeStop: function (e) {
setStorage("ledsim_width", $("#ledsim_dialog").outerWidth());
setStorage("ledsim_height", $("#ledsim_dialog").outerHeight());
}
});
});
function updateLedLayout()
{
//calculate body size
var canvas_height = $('#ledsim_dialog').outerHeight()-$('#ledsim_text').outerHeight()-$('[data-role=footer]').outerHeight()-$('[data-role=header]').outerHeight()-40;
var canvas_width = $('#ledsim_dialog').outerWidth()-30;
$('#leds_canvas').html("");
leds_html = '<img src="" id="image_preview" style="position:relative" />';
for(var idx=0; idx<leds.length; idx++)
{
led = leds[idx];
led_id='led_'+led.index;
bgcolor = "background-color:hsl("+(idx*360/leds.length)+",100%,50%);";
pos = "left:"+(led.hscan.minimum * canvas_width)+"px;"+
"top:"+(led.vscan.minimum * canvas_height)+"px;"+
"width:"+((led.hscan.maximum-led.hscan.minimum) * canvas_width-1)+"px;"+
"height:"+((led.vscan.maximum-led.vscan.minimum) * canvas_height-1)+"px;";
leds_html += '<div id="'+led_id+'" class="led" style="'+bgcolor+pos+'" title="'+led.index+'"><span id="'+led_id+'_num" class="led_num">'+led.index+'</span></div>';
}
$('#leds_canvas').html(leds_html);
if($('#leds_toggle_num').hasClass('btn-success'))
$('.led_num').toggle(true);
if($('#leds_toggle').hasClass('btn-danger'))
$('.led').toggle(false);
$('#image_preview').attr("width" , canvas_width-1);
$('#image_preview').attr("height", canvas_height-1);
}
// ------------------------------------------------------------------
$('#leds_toggle_num').off().on("click", function() {
$('.led_num').toggle();
toggleClass('#leds_toggle_num', "btn-danger", "btn-success");
});
// ------------------------------------------------------------------
$('#leds_toggle').off().on("click", function() {
$('.led').toggle();
toggleClass('#leds_toggle', "btn-success", "btn-danger");
});
// ------------------------------------------------------------------
$('#leds_toggle_live_video').off().on("click", function() {
setClassByBool('#leds_toggle_live_video',imageStreamActive,"btn-success","btn-danger");
if ( imageStreamActive )
{
requestLedImageStop();
$('#image_preview').removeAttr("src");
}
else
{
requestLedImageStart();
}
});
// ------------------------------------------------------------------
$(hyperion).on("cmd-ledcolors-ledstream-update",function(event){
if (!modalOpened)
{
requestLedColorsStop();
}
else
{
ledColors = (event.response.result.leds);
for(var idx=0; idx<ledColors.length; idx++)
{
led = ledColors[idx]
$("#led_"+led.index).css("background","rgb("+led.red+","+led.green+","+led.blue+")");
}
}
});
// ------------------------------------------------------------------
$(hyperion).on("cmd-ledcolors-imagestream-update",function(event){
if (!modalOpened)
{
requestLedImageStop();
}
else
{
imageData = (event.response.result.image);
$("#image_preview").attr("src", imageData);
}
});
$("#btn_open_ledsim").off().on("click", function(event) {
dialog.open();
});
});

File diff suppressed because one or more lines are too long

1
assets/webconfig/js/lib/dialog.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,2 @@
//download.js v4.2, by dandavis; 2008-2016. [CCBY2] see http://danml.com/download.html for tests/usage
(function(r,k){"function"==typeof define&&define.amd?define([],k):"object"==typeof exports?module.exports=k():r.download=k()})(this,function(){return function k(a,b,g){function q(p){var a=p.split(/[:;,]/);p=a[1];var a=("base64"==a[2]?atob:decodeURIComponent)(a.pop()),d=a.length,b=0,c=new Uint8Array(d);for(b;b<d;++b)c[b]=a.charCodeAt(b);return new f([c],{type:p})}function l(a,b){if("download"in d)return d.href=a,d.setAttribute("download",m),d.className="download-js-link",d.innerHTML="downloading...",d.style.display="none",document.body.appendChild(d),setTimeout(function(){d.click(),document.body.removeChild(d),!0===b&&setTimeout(function(){e.URL.revokeObjectURL(d.href)},250)},66),!0;if(/(Version)\/(\d+)\.(\d+)(?:\.(\d+))?.*Safari\//.test(navigator.userAgent))return a=a.replace(/^data:([\w\/\-\+]+)/,"application/octet-stream"),!window.open(a)&&confirm("Displaying New Document\n\nUse Save As... to download, then click back to return to this page.")&&(location.href=a),!0;var c=document.createElement("iframe");document.body.appendChild(c),b||(a="data:"+a.replace(/^data:([\w\/\-\+]+)/,"application/octet-stream")),c.src=a,setTimeout(function(){document.body.removeChild(c)},333)}var e=window,c=g||"application/octet-stream",h=!b&&!g&&a,d=document.createElement("a");g=function(a){return String(a)};var f=e.Blob||e.MozBlob||e.WebKitBlob||g,m=b||"download",f=f.call?f.bind(e):Blob;"true"===String(this)&&(a=[a,c],c=a[0],a=a[1]);if(h&&2048>h.length&&(m=h.split("/").pop().split("?")[0],d.href=h,-1!==d.href.indexOf(h))){var n=new XMLHttpRequest;return n.open("GET",h,!0),n.responseType="blob",n.onload=function(a){k(a.target.response,m,"application/octet-stream")},setTimeout(function(){n.send()},0),n}if(/^data\:[\w+\-]+\/[\w+\-]+[,;]/.test(a)){if(!(2096103.424<a.length&&f!==g))return navigator.msSaveBlob?navigator.msSaveBlob(q(a),m):l(a);a=q(a),c=a.type||"application/octet-stream"}b=a instanceof f?a:new f([a],{type:c});if(navigator.msSaveBlob)return navigator.msSaveBlob(b,m);if(e.URL)l(e.URL.createObjectURL(b),!0);else{if("string"==typeof b||b.constructor===g)try{return l("data:"+c+";base64,"+e.btoa(b))}catch(p){return l("data:"+c+","+encodeURIComponent(b))}c=new FileReader,c.onload=function(a){l(this.result)},c.readAsDataURL(b)}return!0}});

File diff suppressed because one or more lines are too long

View File

@ -1,675 +0,0 @@
/*
The MIT License (MIT)
Copyright (c) 2014 Irrelon Software Limited
http://www.irrelon.com
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice, url and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
Source: https://github.com/irrelon/jquery-lang-js
Changelog: See readme.md
*/
var Lang = (function () {
"use strict";
var Lang = function () {
// Enable firing events
this._fireEvents = true;
// Allow storage of dynamic language pack data
this._dynamic = {};
};
/**
* Initialise the library with the library options.
* @param {Object} options The options to init the library with.
* See the readme.md for the details of the options available.
*/
Lang.prototype.init = function (options) {
var self = this,
cookieLang,
defaultLang,
currentLang,
allowCookieOverride;
options = options || {};
options.cookie = options.cookie || {};
defaultLang = options.defaultLang;
currentLang = options.currentLang;
allowCookieOverride = options.allowCookieOverride;
// Set cookie settings
this.cookieName = options.cookie.name || 'langCookie';
this.cookieExpiry = options.cookie.expiry || 365;
this.cookiePath = options.cookie.path || '/';
// Store existing mutation methods so we can auto-run
// translations when new data is added to the page
this._mutationCopies = {
append: $.fn.append,
appendTo: $.fn.appendTo,
prepend: $.fn.prepend,
before: $.fn.before,
after: $.fn.after,
html: $.fn.html
};
// Now override the existing mutation methods with our own
$.fn.append = function () { return self._mutation(this, 'append', arguments) };
$.fn.appendTo = function () { return self._mutation(this, 'appendTo', arguments) };
$.fn.prepend = function () { return self._mutation(this, 'prepend', arguments) };
$.fn.before = function () { return self._mutation(this, 'before', arguments) };
$.fn.after = function () { return self._mutation(this, 'after', arguments) };
$.fn.html = function () { return self._mutation(this, 'html', arguments) };
// Set default and current language to the default one
// to start with
this.defaultLang = defaultLang || 'en';
this.currentLang = defaultLang || 'en';
// Check for cookie support when no current language is specified
if ((allowCookieOverride || !currentLang) && typeof Cookies !== 'undefined') {
// Check for an existing language cookie
cookieLang = Cookies.get(this.cookieName);
if (cookieLang) {
// We have a cookie language, set the current language
currentLang = cookieLang;
}
}
$(function () {
// Setup data on the language items
self._start();
// Check if the current language is not the same as our default
if (currentLang && currentLang !== self.defaultLang) {
// Switch to the current language
self.change(currentLang);
}
});
};
/**
* Object that holds the language packs.
* @type {{}}
*/
Lang.prototype.pack = {};
/**
* Array of translatable attributes to check for on elements.
* @type {string[]}
*/
Lang.prototype.attrList = [
'title',
'alt',
'placeholder',
'href'
];
/**
* Defines a language pack that can be dynamically loaded and the
* path to use when doing so.
* @param {String} lang The language two-letter iso-code.
* @param {String} path The path to the language pack js file.
*/
Lang.prototype.dynamic = function (lang, path) {
if (lang !== undefined && path !== undefined) {
this._dynamic[lang] = path;
}
};
/**
* Loads a new language pack for the given language.
* @param {string} lang The language to load the pack for.
* @param {Function=} callback Optional callback when the file has loaded.
*/
Lang.prototype.loadPack = function (lang, callback) {
var self = this;
if (lang && self._dynamic[lang]) {
$.ajax({
dataType: "json",
url: self._dynamic[lang],
success: function (data) {
self.pack[lang] = data;
// Process the regex list
if (self.pack[lang].regex) {
var packRegex = self.pack[lang].regex,
regex,
i;
for (i = 0; i < packRegex.length; i++) {
regex = packRegex[i];
if (regex.length === 2) {
// String, value
regex[0] = new RegExp(regex[0]);
} else if (regex.length === 3) {
// String, modifiers, value
regex[0] = new RegExp(regex[0], regex[1]);
// Remove modifier
regex.splice(1, 1);
}
}
}
//console.log('Loaded language pack: ' + self._dynamic[lang]);
if (callback) { callback(false, lang, self._dynamic[lang]); }
},
error: function () {
if (callback) { callback(true, lang, self._dynamic[lang]); }
throw('Error loading language pack' + self._dynamic[lang]);
}
});
} else {
throw('Cannot load language pack, no file path specified!');
}
};
/**
* Scans the DOM for elements with [lang] selector and saves translate data
* for them for later use.
* @private
*/
Lang.prototype._start = function (selector) {
// Get the page HTML
var arr = selector !== undefined ? $(selector).find('[lang]') : $(':not(html)[lang]'),
arrCount = arr.length,
elem;
while (arrCount--) {
elem = $(arr[arrCount]);
this._processElement(elem);
}
};
Lang.prototype._processElement = function (elem) {
// Only store data if the element is set to our default language
if (elem.attr('lang') === this.defaultLang) {
// Store translatable attributes
this._storeAttribs(elem);
// Store translatable content
this._storeContent(elem);
}
};
/**
* Stores the translatable attribute values in their default language.
* @param {object} elem The jQuery selected element.
* @private
*/
Lang.prototype._storeAttribs = function (elem) {
var attrIndex,
attr,
attrObj;
for (attrIndex = 0; attrIndex < this.attrList.length; attrIndex++) {
attr = this.attrList[attrIndex];
if (elem.attr(attr)) {
// Grab the existing attribute store or create a new object
attrObj = elem.data('lang-attr') || {};
// Add the attribute and value to the store
attrObj[attr] = elem.attr(attr);
// Save the attribute data to the store
elem.data('lang-attr', attrObj);
}
}
};
/**
* Reads the existing content from the element and stores it for
* later use in translation.
* @param elem
* @private
*/
Lang.prototype._storeContent = function (elem) {
// Check if the element is an input element
if (elem.is('input')) {
switch (elem.attr('type')) {
case 'button':
case 'submit':
case 'hidden':
case 'reset':
elem.data('lang-val', elem.val());
break;
}
} else if (elem.is('img')) {
elem.data('lang-src', elem.attr('src'));
} else {
// Get the text nodes immediately inside this element
var nodes = this._getTextNodes(elem);
if (nodes) {
elem.data('lang-text', nodes);
}
}
};
/**
* Retrieves the text nodes from an element and returns them in array wrap into
* object with two properties:
* - node - which corresponds to text node,
* - langDefaultText - which remember current data of text node
* @param elem
* @returns {Array|*}
* @private
*/
Lang.prototype._getTextNodes = function (elem) {
var nodes = elem.contents(), nodeObjArray = [], nodeObj = {},
nodeArr, that = this, map = Array.prototype.map;
$.each(nodes, function (index, node) {
if ( node.nodeType !== 3 ) {
return;
}
nodeObj = {
node : node,
langDefaultText : node.data
};
nodeObjArray.push(nodeObj);
});
// If element has only one text node and data-lang-token is defined
// set langContentKey property to use as a token
if(nodes.length == 1){
nodeObjArray[0].langToken = elem.data('langToken');
}
return nodeObjArray;
};
/**
* Sets text nodes of an element translated based on the passed language.
* @param elem
* @param {Array|*} nodes array of objecs with text node and defaultText returned from _getTextNodes
* @param lang
* @private
*/
Lang.prototype._setTextNodes = function (elem, nodes, lang) {
var index,
textNode,
defaultText,
translation,
langNotDefault = lang !== this.defaultLang;
for (index = 0; index < nodes.length; index++) {
textNode = nodes[index];
if (langNotDefault) {
// If langToken is set, use it as a token
defaultText = textNode.langToken || $.trim(textNode.langDefaultText);
if (defaultText) {
// Translate the langDefaultText
translation = this.translate(defaultText, lang);
if (translation) {
try {
// Replace the text with the translated version
textNode.node.data = textNode.node.data.split($.trim(textNode.node.data)).join(translation);
} catch (e) {
}
} else {
if (console && console.log) {
console.log('Translation for "' + defaultText + '" not found!');
}
}
}
} else {
// Replace with original text
try {
textNode.node.data = textNode.langDefaultText;
} catch (e) {
}
}
}
};
/**
* Translates and sets the attributes of an element to the passed language.
* @param elem
* @param lang
* @private
*/
Lang.prototype._translateAttribs = function (elem, lang) {
var attr,
attrObj = elem.data('lang-attr') || {},
translation;
for (attr in attrObj) {
if (attrObj.hasOwnProperty(attr)) {
// Check the element still has the attribute
if (elem.attr(attr)) {
if (lang !== this.defaultLang) {
// Get the translated value
translation = this.translate(attrObj[attr], lang);
// Check we actually HAVE a translation
if (translation) {
// Change the attribute to the translated value
elem.attr(attr, translation);
}
} else {
// Set default language value
elem.attr(attr, attrObj[attr]);
}
}
}
}
};
/**
* Translates and sets the contents of an element to the passed language.
* @param elem
* @param lang
* @private
*/
Lang.prototype._translateContent = function (elem, lang) {
var langNotDefault = lang !== this.defaultLang,
translation,
nodes;
// Check if the element is an input element
if (elem.is('input')) {
switch (elem.attr('type')) {
case 'button':
case 'submit':
case 'hidden':
case 'reset':
if (langNotDefault) {
// Get the translated value
translation = this.translate(elem.data('lang-val'), lang);
// Check we actually HAVE a translation
if (translation) {
// Set translated value
elem.val(translation);
}
} else {
// Set default language value
elem.val(elem.data('lang-val'));
}
break;
}
} else if (elem.is('img')) {
if (langNotDefault) {
// Get the translated value
translation = this.translate(elem.data('lang-src'), lang);
// Check we actually HAVE a translation
if (translation) {
// Set translated value
elem.attr('src', translation);
}
} else {
// Set default language value
elem.attr('src', elem.data('lang-src'));
}
} else {
// Set text node translated text
nodes = elem.data('lang-text');
if (nodes) {
this._setTextNodes(elem, nodes, lang);
}
}
};
/**
* Call this to change the current language on the page.
* @param {String} lang The new two-letter language code to change to.
* @param {String=} selector Optional selector to find language-based
* elements for updating.
* @param {Function=} callback Optional callback function that will be
* called once the language change has been successfully processed. This
* is especially useful if you are using dynamic language pack loading
* since you will get a callback once it has been loaded and changed.
* Your callback will be passed three arguments, a boolean to denote if
* there was an error (true if error), the second will be the language
* you passed in the change call (the lang argument) and the third will
* be the selector used in the change update.
*/
Lang.prototype.change = function (lang, selector, callback) {
var self = this;
if (lang === this.defaultLang || this.pack[lang] || this._dynamic[lang]) {
// Check if the language pack is currently loaded
if (lang !== this.defaultLang) {
if (!this.pack[lang] && this._dynamic[lang]) {
// The language pack needs loading first
//console.log('Loading dynamic language pack: ' + this._dynamic[lang] + '...');
this.loadPack(lang, function (err, loadingLang, fromUrl) {
if (!err) {
// Process the change language request
self.change.call(self, lang, selector, callback);
} else {
// Call the callback with the error
if (callback) { callback('Language pack could not load from: ' + fromUrl, lang, selector); }
}
});
return;
} else if (!this.pack[lang] && !this._dynamic[lang]) {
// Pack not loaded and no dynamic entry
if (callback) { callback('Language pack not defined for: ' + lang, lang, selector); }
throw('Could not change language to ' + lang + ' because no language pack for this language exists!');
}
}
var fireAfterUpdate = false,
currLang = this.currentLang;
if (this.currentLang != lang) {
this.beforeUpdate(currLang, lang);
fireAfterUpdate = true;
}
this.currentLang = lang;
// Get the page HTML
var arr = selector !== undefined ? $(selector).find('[lang]') : $(':not(html)[lang]'),
arrCount = arr.length,
elem;
while (arrCount--) {
elem = $(arr[arrCount]);
if (elem.attr('lang') !== lang) {
this._translateElement(elem, lang);
}
}
if (fireAfterUpdate) {
this.afterUpdate(currLang, lang);
}
// Check for cookie support
if (typeof Cookies !== "undefined") {
// Set a cookie to remember this language setting with 1 year expiry
Cookies.set(self.cookieName, lang, {
expires: self.cookieExpiry,
path: self.cookiePath
});
}
if (callback) { callback(false, lang, selector); }
} else {
if (callback) { callback('No language pack defined for: ' + lang, lang, selector); }
throw('Attempt to change language to "' + lang + '" but no language pack for that language is loaded!');
}
};
Lang.prototype._translateElement = function (elem, lang) {
// Translate attributes
this._translateAttribs(elem, lang);
// Translate content
if (elem.attr('data-lang-content') != 'false') {
this._translateContent(elem, lang);
}
// Update the element's current language
elem.attr('lang', lang);
};
/**
* Translates text from the default language into the passed language.
* @param {String} text The text to translate.
* @param {String} lang The two-letter language code to translate to.
* @returns {*}
*/
Lang.prototype.translate = function (text, lang) {
lang = lang || this.currentLang;
if (this.pack[lang]) {
var translation = '';
if (lang != this.defaultLang) {
// Check for a direct token translation
translation = this.pack[lang].token[text];
if (!translation) {
// No token translation was found, test for regex match
translation = this._regexMatch(text, lang);
}
if (!translation) {
if (console && console.log) {
console.log('Translation for "' + text + '" not found in language pack: ' + lang);
}
}
return translation || text;
} else {
return text;
}
} else {
return text;
}
};
/**
* Checks the regex items for a match against the passed text and
* if a match is made, translates to the given replacement.
* @param {String} text The text to test regex matches against.
* @param {String} lang The two-letter language code to translate to.
* @returns {string}
* @private
*/
Lang.prototype._regexMatch = function (text, lang) {
// Loop the regex array and test them against the text
var arr,
arrCount,
arrIndex,
item,
regex,
expressionResult;
arr = this.pack[lang].regex;
if (arr) {
arrCount = arr.length;
for (arrIndex = 0; arrIndex < arrCount; arrIndex++) {
item = arr[arrIndex];
regex = item[0];
// Test regex
expressionResult = regex.exec(text);
if (expressionResult && expressionResult[0]) {
return text.split(expressionResult[0]).join(item[1]);
}
}
}
return '';
};
Lang.prototype.beforeUpdate = function (currentLang, newLang) {
if (this._fireEvents) {
$(this).triggerHandler('beforeUpdate', [currentLang, newLang, this.pack[currentLang], this.pack[newLang]]);
}
};
Lang.prototype.afterUpdate = function (currentLang, newLang) {
if (this._fireEvents) {
$(this).triggerHandler('afterUpdate', [currentLang, newLang, this.pack[currentLang], this.pack[newLang]]);
}
};
Lang.prototype.refresh = function () {
// Process refresh on the page
this._fireEvents = false;
this.change(this.currentLang);
this._fireEvents = true;
};
////////////////////////////////////////////////////
// Mutation overrides
////////////////////////////////////////////////////
Lang.prototype._mutation = function (context, method, args) {
var result = this._mutationCopies[method].apply(context, args),
currLang = this.currentLang,
rootElem = $(context);
if (rootElem.attr('lang')) {
// Switch off events for the moment
this._fireEvents = false;
// Check if the root element is currently set to another language from current
//if (rootElem.attr('lang') !== this.currentLang) {
this._translateElement(rootElem, this.defaultLang);
this.change(this.defaultLang, rootElem);
// Calling change above sets the global currentLang but this is supposed to be
// an isolated change so reset the global value back to what it was before
this.currentLang = currLang;
// Record data on the default language from the root element
this._processElement(rootElem);
// Translate the root element
this._translateElement(rootElem, this.currentLang);
//}
}
// Record data on the default language from the root's children
this._start(rootElem);
// Process translation on any child elements of this element
this.change(this.currentLang, rootElem);
// Switch events back on
this._fireEvents = true;
return result;
};
return Lang;
})();

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,168 @@
/**
* jQuery Internationalization library
*
* Copyright (C) 2011-2013 Santhosh Thottingal, Neil Kandalgaonkar
*
* jquery.i18n is dual licensed GPLv2 or later and MIT. You don't have to do
* anything special to choose one license or the other and you don't have to
* notify anyone which license you are using. You are free to use
* UniversalLanguageSelector in commercial projects as long as the copyright
* header is left intact. See files GPL-LICENSE and MIT-LICENSE for details.
*
* @licence GNU General Public Licence 2.0 or later
* @licence MIT License
*/
( function ( $ ) {
'use strict';
var MessageParserEmitter = function () {
this.language = $.i18n.languages[String.locale] || $.i18n.languages['default'];
};
MessageParserEmitter.prototype = {
constructor: MessageParserEmitter,
/**
* (We put this method definition here, and not in prototype, to make
* sure it's not overwritten by any magic.) Walk entire node structure,
* applying replacements and template functions when appropriate
*
* @param {Mixed} node abstract syntax tree (top node or subnode)
* @param {Array} replacements for $1, $2, ... $n
* @return {Mixed} single-string node or array of nodes suitable for
* jQuery appending.
*/
emit: function ( node, replacements ) {
var ret, subnodes, operation,
messageParserEmitter = this;
switch ( typeof node ) {
case 'string':
case 'number':
ret = node;
break;
case 'object':
// node is an array of nodes
subnodes = $.map( node.slice( 1 ), function ( n ) {
return messageParserEmitter.emit( n, replacements );
} );
operation = node[0].toLowerCase();
if ( typeof messageParserEmitter[operation] === 'function' ) {
ret = messageParserEmitter[operation]( subnodes, replacements );
} else {
throw new Error( 'unknown operation "' + operation + '"' );
}
break;
case 'undefined':
// Parsing the empty string (as an entire expression, or as a
// paramExpression in a template) results in undefined
// Perhaps a more clever parser can detect this, and return the
// empty string? Or is that useful information?
// The logical thing is probably to return the empty string here
// when we encounter undefined.
ret = '';
break;
default:
throw new Error( 'unexpected type in AST: ' + typeof node );
}
return ret;
},
/**
* Parsing has been applied depth-first we can assume that all nodes
* here are single nodes Must return a single node to parents -- a
* jQuery with synthetic span However, unwrap any other synthetic spans
* in our children and pass them upwards
*
* @param {Array} nodes Mixed, some single nodes, some arrays of nodes.
* @return String
*/
concat: function ( nodes ) {
var result = '';
$.each( nodes, function ( i, node ) {
// strings, integers, anything else
result += node;
} );
return result;
},
/**
* Return escaped replacement of correct index, or string if
* unavailable. Note that we expect the parsed parameter to be
* zero-based. i.e. $1 should have become [ 0 ]. if the specified
* parameter is not found return the same string (e.g. "$99" ->
* parameter 98 -> not found -> return "$99" ) TODO throw error if
* nodes.length > 1 ?
*
* @param {Array} nodes One element, integer, n >= 0
* @param {Array} replacements for $1, $2, ... $n
* @return {string} replacement
*/
replace: function ( nodes, replacements ) {
var index = parseInt( nodes[0], 10 );
if ( index < replacements.length ) {
// replacement is not a string, don't touch!
return replacements[index];
} else {
// index not found, fallback to displaying variable
return '$' + ( index + 1 );
}
},
/**
* Transform parsed structure into pluralization n.b. The first node may
* be a non-integer (for instance, a string representing an Arabic
* number). So convert it back with the current language's
* convertNumber.
*
* @param {Array} nodes List [ {String|Number}, {String}, {String} ... ]
* @return {String} selected pluralized form according to current
* language.
*/
plural: function ( nodes ) {
var count = parseFloat( this.language.convertNumber( nodes[0], 10 ) ),
forms = nodes.slice( 1 );
return forms.length ? this.language.convertPlural( count, forms ) : '';
},
/**
* Transform parsed structure into gender Usage
* {{gender:gender|masculine|feminine|neutral}}.
*
* @param {Array} nodes List [ {String}, {String}, {String} , {String} ]
* @return {String} selected gender form according to current language
*/
gender: function ( nodes ) {
var gender = nodes[0],
forms = nodes.slice( 1 );
return this.language.gender( gender, forms );
},
/**
* Transform parsed structure into grammar conversion. Invoked by
* putting {{grammar:form|word}} in a message
*
* @param {Array} nodes List [{Grammar case eg: genitive}, {String word}]
* @return {String} selected grammatical form according to current
* language.
*/
grammar: function ( nodes ) {
var form = nodes[0],
word = nodes[1];
return word && form && this.language.convertGrammar( word, form );
}
};
$.extend( $.i18n.parser.emitter, new MessageParserEmitter() );
}( jQuery ) );

View File

@ -0,0 +1,186 @@
/**
* jQuery Internationalization library
*
* Copyright (C) 2012 Santhosh Thottingal
*
* jquery.i18n is dual licensed GPLv2 or later and MIT. You don't have to do anything special to
* choose one license or the other and you don't have to notify anyone which license you are using.
* You are free to use UniversalLanguageSelector in commercial projects as long as the copyright
* header is left intact. See files GPL-LICENSE and MIT-LICENSE for details.
*
* @licence GNU General Public Licence 2.0 or later
* @licence MIT License
*/
( function ( $, undefined ) {
'use strict';
$.i18n = $.i18n || {};
$.extend( $.i18n.fallbacks, {
ab: [ 'ru' ],
ace: [ 'id' ],
aln: [ 'sq' ],
// Not so standard - als is supposed to be Tosk Albanian,
// but in Wikipedia it's used for a Germanic language.
als: [ 'gsw', 'de' ],
an: [ 'es' ],
anp: [ 'hi' ],
arn: [ 'es' ],
arz: [ 'ar' ],
av: [ 'ru' ],
ay: [ 'es' ],
ba: [ 'ru' ],
bar: [ 'de' ],
'bat-smg': [ 'sgs', 'lt' ],
bcc: [ 'fa' ],
'be-x-old': [ 'be-tarask' ],
bh: [ 'bho' ],
bjn: [ 'id' ],
bm: [ 'fr' ],
bpy: [ 'bn' ],
bqi: [ 'fa' ],
bug: [ 'id' ],
'cbk-zam': [ 'es' ],
ce: [ 'ru' ],
crh: [ 'crh-latn' ],
'crh-cyrl': [ 'ru' ],
csb: [ 'pl' ],
cv: [ 'ru' ],
'de-at': [ 'de' ],
'de-ch': [ 'de' ],
'de-formal': [ 'de' ],
dsb: [ 'de' ],
dtp: [ 'ms' ],
egl: [ 'it' ],
eml: [ 'it' ],
ff: [ 'fr' ],
fit: [ 'fi' ],
'fiu-vro': [ 'vro', 'et' ],
frc: [ 'fr' ],
frp: [ 'fr' ],
frr: [ 'de' ],
fur: [ 'it' ],
gag: [ 'tr' ],
gan: [ 'gan-hant', 'zh-hant', 'zh-hans' ],
'gan-hans': [ 'zh-hans' ],
'gan-hant': [ 'zh-hant', 'zh-hans' ],
gl: [ 'pt' ],
glk: [ 'fa' ],
gn: [ 'es' ],
gsw: [ 'de' ],
hif: [ 'hif-latn' ],
hsb: [ 'de' ],
ht: [ 'fr' ],
ii: [ 'zh-cn', 'zh-hans' ],
inh: [ 'ru' ],
iu: [ 'ike-cans' ],
jut: [ 'da' ],
jv: [ 'id' ],
kaa: [ 'kk-latn', 'kk-cyrl' ],
kbd: [ 'kbd-cyrl' ],
khw: [ 'ur' ],
kiu: [ 'tr' ],
kk: [ 'kk-cyrl' ],
'kk-arab': [ 'kk-cyrl' ],
'kk-latn': [ 'kk-cyrl' ],
'kk-cn': [ 'kk-arab', 'kk-cyrl' ],
'kk-kz': [ 'kk-cyrl' ],
'kk-tr': [ 'kk-latn', 'kk-cyrl' ],
kl: [ 'da' ],
'ko-kp': [ 'ko' ],
koi: [ 'ru' ],
krc: [ 'ru' ],
ks: [ 'ks-arab' ],
ksh: [ 'de' ],
ku: [ 'ku-latn' ],
'ku-arab': [ 'ckb' ],
kv: [ 'ru' ],
lad: [ 'es' ],
lb: [ 'de' ],
lbe: [ 'ru' ],
lez: [ 'ru' ],
li: [ 'nl' ],
lij: [ 'it' ],
liv: [ 'et' ],
lmo: [ 'it' ],
ln: [ 'fr' ],
ltg: [ 'lv' ],
lzz: [ 'tr' ],
mai: [ 'hi' ],
'map-bms': [ 'jv', 'id' ],
mg: [ 'fr' ],
mhr: [ 'ru' ],
min: [ 'id' ],
mo: [ 'ro' ],
mrj: [ 'ru' ],
mwl: [ 'pt' ],
myv: [ 'ru' ],
mzn: [ 'fa' ],
nah: [ 'es' ],
nap: [ 'it' ],
nds: [ 'de' ],
'nds-nl': [ 'nl' ],
'nl-informal': [ 'nl' ],
no: [ 'nb' ],
os: [ 'ru' ],
pcd: [ 'fr' ],
pdc: [ 'de' ],
pdt: [ 'de' ],
pfl: [ 'de' ],
pms: [ 'it' ],
pt: [ 'pt-br' ],
'pt-br': [ 'pt' ],
qu: [ 'es' ],
qug: [ 'qu', 'es' ],
rgn: [ 'it' ],
rmy: [ 'ro' ],
'roa-rup': [ 'rup' ],
rue: [ 'uk', 'ru' ],
ruq: [ 'ruq-latn', 'ro' ],
'ruq-cyrl': [ 'mk' ],
'ruq-latn': [ 'ro' ],
sa: [ 'hi' ],
sah: [ 'ru' ],
scn: [ 'it' ],
sg: [ 'fr' ],
sgs: [ 'lt' ],
sli: [ 'de' ],
sr: [ 'sr-ec' ],
srn: [ 'nl' ],
stq: [ 'de' ],
su: [ 'id' ],
szl: [ 'pl' ],
tcy: [ 'kn' ],
tg: [ 'tg-cyrl' ],
tt: [ 'tt-cyrl', 'ru' ],
'tt-cyrl': [ 'ru' ],
ty: [ 'fr' ],
udm: [ 'ru' ],
ug: [ 'ug-arab' ],
uk: [ 'ru' ],
vec: [ 'it' ],
vep: [ 'et' ],
vls: [ 'nl' ],
vmf: [ 'de' ],
vot: [ 'fi' ],
vro: [ 'et' ],
wa: [ 'fr' ],
wo: [ 'fr' ],
wuu: [ 'zh-hans' ],
xal: [ 'ru' ],
xmf: [ 'ka' ],
yi: [ 'he' ],
za: [ 'zh-hans' ],
zea: [ 'nl' ],
zh: [ 'zh-hans' ],
'zh-classical': [ 'lzh' ],
'zh-cn': [ 'zh-hans' ],
'zh-hant': [ 'zh-hans' ],
'zh-hk': [ 'zh-hant', 'zh-hans' ],
'zh-min-nan': [ 'nan' ],
'zh-mo': [ 'zh-hk', 'zh-hant', 'zh-hans' ],
'zh-my': [ 'zh-sg', 'zh-hans' ],
'zh-sg': [ 'zh-hans' ],
'zh-tw': [ 'zh-hant', 'zh-hans' ],
'zh-yue': [ 'yue' ]
} );
}( jQuery ) );

View File

@ -0,0 +1,287 @@
/**
* jQuery Internationalization library
*
* Copyright (C) 2012 Santhosh Thottingal
*
* jquery.i18n is dual licensed GPLv2 or later and MIT. You don't have to do
* anything special to choose one license or the other and you don't have to
* notify anyone which license you are using. You are free to use
* UniversalLanguageSelector in commercial projects as long as the copyright
* header is left intact. See files GPL-LICENSE and MIT-LICENSE for details.
*
* @licence GNU General Public Licence 2.0 or later
* @licence MIT License
*/
( function ( $ ) {
'use strict';
var nav, I18N,
slice = Array.prototype.slice;
/**
* @constructor
* @param {Object} options
*/
I18N = function ( options ) {
// Load defaults
this.options = $.extend( {}, I18N.defaults, options );
this.parser = this.options.parser;
this.locale = this.options.locale;
this.messageStore = this.options.messageStore;
this.languages = {};
this.init();
};
I18N.prototype = {
/**
* Initialize by loading locales and setting up
* String.prototype.toLocaleString and String.locale.
*/
init: function () {
var i18n = this;
// Set locale of String environment
String.locale = i18n.locale;
// Override String.localeString method
String.prototype.toLocaleString = function () {
var localeParts, localePartIndex, value, locale, fallbackIndex,
tryingLocale, message;
value = this.valueOf();
locale = i18n.locale;
fallbackIndex = 0;
while ( locale ) {
// Iterate through locales starting at most-specific until
// localization is found. As in fi-Latn-FI, fi-Latn and fi.
localeParts = locale.split( '-' );
localePartIndex = localeParts.length;
do {
tryingLocale = localeParts.slice( 0, localePartIndex ).join( '-' );
message = i18n.messageStore.get( tryingLocale, value );
if ( message ) {
return message;
}
localePartIndex--;
} while ( localePartIndex );
if ( locale === 'en' ) {
break;
}
locale = ( $.i18n.fallbacks[i18n.locale] && $.i18n.fallbacks[i18n.locale][fallbackIndex] ) ||
i18n.options.fallbackLocale;
$.i18n.log( 'Trying fallback locale for ' + i18n.locale + ': ' + locale );
fallbackIndex++;
}
// key not found
return '';
};
},
/*
* Destroy the i18n instance.
*/
destroy: function () {
$.removeData( document, 'i18n' );
},
/**
* General message loading API This can take a URL string for
* the json formatted messages. Example:
* <code>load('path/to/all_localizations.json');</code>
*
* To load a localization file for a locale:
* <code>
* load('path/to/de-messages.json', 'de' );
* </code>
*
* To load a localization file from a directory:
* <code>
* load('path/to/i18n/directory', 'de' );
* </code>
* The above method has the advantage of fallback resolution.
* ie, it will automatically load the fallback locales for de.
* For most usecases, this is the recommended method.
* It is optional to have trailing slash at end.
*
* A data object containing message key- message translation mappings
* can also be passed. Example:
* <code>
* load( { 'hello' : 'Hello' }, optionalLocale );
* </code>
*
* A source map containing key-value pair of languagename and locations
* can also be passed. Example:
* <code>
* load( {
* bn: 'i18n/bn.json',
* he: 'i18n/he.json',
* en: 'i18n/en.json'
* } )
* </code>
*
* If the data argument is null/undefined/false,
* all cached messages for the i18n instance will get reset.
*
* @param {String|Object} source
* @param {String} locale Language tag
* @returns {jQuery.Promise}
*/
load: function ( source, locale ) {
var fallbackLocales, locIndex, fallbackLocale, sourceMap = {};
if ( !source && !locale ) {
source = 'i18n';
locale = $.i18n().locale;
}
if ( typeof source === 'string' &&
source.split( '.' ).pop() !== 'json'
) {
// Load specified locale then check for fallbacks when directory is specified in load()
sourceMap[locale] = source + '/' + locale + '.json';
fallbackLocales = ( $.i18n.fallbacks[locale] || [] )
.concat( this.options.fallbackLocale );
for ( locIndex in fallbackLocales ) {
fallbackLocale = fallbackLocales[locIndex];
sourceMap[fallbackLocale] = source + '/' + fallbackLocale + '.json';
}
return this.load( sourceMap );
} else {
return this.messageStore.load( source, locale );
}
},
/**
* Does parameter and magic word substitution.
*
* @param {string} key Message key
* @param {Array} parameters Message parameters
* @return {string}
*/
parse: function ( key, parameters ) {
var message = key.toLocaleString();
// FIXME: This changes the state of the I18N object,
// should probably not change the 'this.parser' but just
// pass it to the parser.
this.parser.language = $.i18n.languages[$.i18n().locale] || $.i18n.languages['default'];
if ( message === '' ) {
message = key;
}
return this.parser.parse( message, parameters );
}
};
/**
* Process a message from the $.I18N instance
* for the current document, stored in jQuery.data(document).
*
* @param {string} key Key of the message.
* @param {string} param1 [param...] Variadic list of parameters for {key}.
* @return {string|$.I18N} Parsed message, or if no key was given
* the instance of $.I18N is returned.
*/
$.i18n = function ( key, param1 ) {
var parameters,
i18n = $.data( document, 'i18n' ),
options = typeof key === 'object' && key;
// If the locale option for this call is different then the setup so far,
// update it automatically. This doesn't just change the context for this
// call but for all future call as well.
// If there is no i18n setup yet, don't do this. It will be taken care of
// by the `new I18N` construction below.
// NOTE: It should only change language for this one call.
// Then cache instances of I18N somewhere.
if ( options && options.locale && i18n && i18n.locale !== options.locale ) {
String.locale = i18n.locale = options.locale;
}
if ( !i18n ) {
i18n = new I18N( options );
$.data( document, 'i18n', i18n );
}
if ( typeof key === 'string' ) {
if ( param1 !== undefined ) {
parameters = slice.call( arguments, 1 );
} else {
parameters = [];
}
return i18n.parse( key, parameters );
} else {
// FIXME: remove this feature/bug.
return i18n;
}
};
$.fn.i18n = function () {
var i18n = $.data( document, 'i18n' );
if ( !i18n ) {
i18n = new I18N();
$.data( document, 'i18n', i18n );
}
String.locale = i18n.locale;
return this.each( function () {
var $this = $( this ),
messageKey = $this.data( 'i18n' );
if ( messageKey ) {
$this.text( i18n.parse( messageKey ) );
} else {
$this.find( '[data-i18n]' ).i18n();
}
} );
};
String.locale = String.locale || $( 'html' ).attr( 'lang' );
if ( !String.locale ) {
if ( typeof window.navigator !== undefined ) {
nav = window.navigator;
String.locale = nav.language || nav.userLanguage || '';
} else {
String.locale = '';
}
}
$.i18n.languages = {};
$.i18n.messageStore = $.i18n.messageStore || {};
$.i18n.parser = {
// The default parser only handles variable substitution
parse: function ( message, parameters ) {
return message.replace( /\$(\d+)/g, function ( str, match ) {
var index = parseInt( match, 10 ) - 1;
return parameters[index] !== undefined ? parameters[index] : '$' + match;
} );
},
emitter: {}
};
$.i18n.fallbacks = {};
$.i18n.debug = false;
$.i18n.log = function ( /* arguments */ ) {
if ( window.console && $.i18n.debug ) {
window.console.log.apply( window.console, arguments );
}
};
/* Static members */
I18N.defaults = {
locale: String.locale,
fallbackLocale: 'en',
parser: $.i18n.parser,
messageStore: $.i18n.messageStore
};
// Expose constructor
$.i18n.constructor = I18N;
}( jQuery ) );

View File

@ -0,0 +1,472 @@
/*global pluralRuleParser */
( function ( $ ) {
'use strict';
var language = {
// CLDR plural rules generated using
// libs/CLDRPluralRuleParser/tools/PluralXML2JSON.html
pluralRules: {
ak: {
one: 'n = 0..1'
},
am: {
one: 'i = 0 or n = 1'
},
ar: {
zero: 'n = 0',
one: 'n = 1',
two: 'n = 2',
few: 'n % 100 = 3..10',
many: 'n % 100 = 11..99'
},
be: {
one: 'n % 10 = 1 and n % 100 != 11',
few: 'n % 10 = 2..4 and n % 100 != 12..14',
many: 'n % 10 = 0 or n % 10 = 5..9 or n % 100 = 11..14'
},
bh: {
one: 'n = 0..1'
},
bn: {
one: 'i = 0 or n = 1'
},
br: {
one: 'n % 10 = 1 and n % 100 != 11,71,91',
two: 'n % 10 = 2 and n % 100 != 12,72,92',
few: 'n % 10 = 3..4,9 and n % 100 != 10..19,70..79,90..99',
many: 'n != 0 and n % 1000000 = 0'
},
bs: {
one: 'v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11',
few: 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14'
},
cs: {
one: 'i = 1 and v = 0',
few: 'i = 2..4 and v = 0',
many: 'v != 0'
},
cy: {
zero: 'n = 0',
one: 'n = 1',
two: 'n = 2',
few: 'n = 3',
many: 'n = 6'
},
da: {
one: 'n = 1 or t != 0 and i = 0,1'
},
fa: {
one: 'i = 0 or n = 1'
},
ff: {
one: 'i = 0,1'
},
fil: {
one: 'i = 0..1 and v = 0'
},
fr: {
one: 'i = 0,1'
},
ga: {
one: 'n = 1',
two: 'n = 2',
few: 'n = 3..6',
many: 'n = 7..10'
},
gd: {
one: 'n = 1,11',
two: 'n = 2,12',
few: 'n = 3..10,13..19'
},
gu: {
one: 'i = 0 or n = 1'
},
guw: {
one: 'n = 0..1'
},
gv: {
one: 'n % 10 = 1',
two: 'n % 10 = 2',
few: 'n % 100 = 0,20,40,60'
},
he: {
one: 'i = 1 and v = 0',
two: 'i = 2 and v = 0',
many: 'v = 0 and n != 0..10 and n % 10 = 0'
},
hi: {
one: 'i = 0 or n = 1'
},
hr: {
one: 'v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11',
few: 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14'
},
hy: {
one: 'i = 0,1'
},
is: {
one: 't = 0 and i % 10 = 1 and i % 100 != 11 or t != 0'
},
iu: {
one: 'n = 1',
two: 'n = 2'
},
iw: {
one: 'i = 1 and v = 0',
two: 'i = 2 and v = 0',
many: 'v = 0 and n != 0..10 and n % 10 = 0'
},
kab: {
one: 'i = 0,1'
},
kn: {
one: 'i = 0 or n = 1'
},
kw: {
one: 'n = 1',
two: 'n = 2'
},
lag: {
zero: 'n = 0',
one: 'i = 0,1 and n != 0'
},
ln: {
one: 'n = 0..1'
},
lt: {
one: 'n % 10 = 1 and n % 100 != 11..19',
few: 'n % 10 = 2..9 and n % 100 != 11..19',
many: 'f != 0'
},
lv: {
zero: 'n % 10 = 0 or n % 100 = 11..19 or v = 2 and f % 100 = 11..19',
one: 'n % 10 = 1 and n % 100 != 11 or v = 2 and f % 10 = 1 and f % 100 != 11 or v != 2 and f % 10 = 1'
},
mg: {
one: 'n = 0..1'
},
mk: {
one: 'v = 0 and i % 10 = 1 or f % 10 = 1'
},
mo: {
one: 'i = 1 and v = 0',
few: 'v != 0 or n = 0 or n != 1 and n % 100 = 1..19'
},
mr: {
one: 'i = 0 or n = 1'
},
mt: {
one: 'n = 1',
few: 'n = 0 or n % 100 = 2..10',
many: 'n % 100 = 11..19'
},
naq: {
one: 'n = 1',
two: 'n = 2'
},
nso: {
one: 'n = 0..1'
},
pa: {
one: 'n = 0..1'
},
pl: {
one: 'i = 1 and v = 0',
few: 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14',
many: 'v = 0 and i != 1 and i % 10 = 0..1 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100 = 12..14'
},
pt: {
one: 'i = 1 and v = 0 or i = 0 and t = 1'
},
// jscs:disable requireCamelCaseOrUpperCaseIdentifiers
pt_PT: {
one: 'n = 1 and v = 0'
},
// jscs:enable requireCamelCaseOrUpperCaseIdentifiers
ro: {
one: 'i = 1 and v = 0',
few: 'v != 0 or n = 0 or n != 1 and n % 100 = 1..19'
},
ru: {
one: 'v = 0 and i % 10 = 1 and i % 100 != 11',
many: 'v = 0 and i % 10 = 0 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100 = 11..14'
},
se: {
one: 'n = 1',
two: 'n = 2'
},
sh: {
one: 'v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11',
few: 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14'
},
shi: {
one: 'i = 0 or n = 1',
few: 'n = 2..10'
},
si: {
one: 'n = 0,1 or i = 0 and f = 1'
},
sk: {
one: 'i = 1 and v = 0',
few: 'i = 2..4 and v = 0',
many: 'v != 0'
},
sl: {
one: 'v = 0 and i % 100 = 1',
two: 'v = 0 and i % 100 = 2',
few: 'v = 0 and i % 100 = 3..4 or v != 0'
},
sma: {
one: 'n = 1',
two: 'n = 2'
},
smi: {
one: 'n = 1',
two: 'n = 2'
},
smj: {
one: 'n = 1',
two: 'n = 2'
},
smn: {
one: 'n = 1',
two: 'n = 2'
},
sms: {
one: 'n = 1',
two: 'n = 2'
},
sr: {
one: 'v = 0 and i % 10 = 1 and i % 100 != 11 or f % 10 = 1 and f % 100 != 11',
few: 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14 or f % 10 = 2..4 and f % 100 != 12..14'
},
ti: {
one: 'n = 0..1'
},
tl: {
one: 'i = 0..1 and v = 0'
},
tzm: {
one: 'n = 0..1 or n = 11..99'
},
uk: {
one: 'v = 0 and i % 10 = 1 and i % 100 != 11',
few: 'v = 0 and i % 10 = 2..4 and i % 100 != 12..14',
many: 'v = 0 and i % 10 = 0 or v = 0 and i % 10 = 5..9 or v = 0 and i % 100 = 11..14'
},
wa: {
one: 'n = 0..1'
},
zu: {
one: 'i = 0 or n = 1'
}
},
/**
* Plural form transformations, needed for some languages.
*
* @param count
* integer Non-localized quantifier
* @param forms
* array List of plural forms
* @return string Correct form for quantifier in this language
*/
convertPlural: function ( count, forms ) {
var pluralRules,
pluralFormIndex,
index,
explicitPluralPattern = new RegExp( '\\d+=', 'i' ),
formCount,
form;
if ( !forms || forms.length === 0 ) {
return '';
}
// Handle for Explicit 0= & 1= values
for ( index = 0; index < forms.length; index++ ) {
form = forms[index];
if ( explicitPluralPattern.test( form ) ) {
formCount = parseInt( form.substring( 0, form.indexOf( '=' ) ), 10 );
if ( formCount === count ) {
return ( form.substr( form.indexOf( '=' ) + 1 ) );
}
forms[index] = undefined;
}
}
forms = $.map( forms, function ( form ) {
if ( form !== undefined ) {
return form;
}
} );
pluralRules = this.pluralRules[$.i18n().locale];
if ( !pluralRules ) {
// default fallback.
return ( count === 1 ) ? forms[0] : forms[1];
}
pluralFormIndex = this.getPluralForm( count, pluralRules );
pluralFormIndex = Math.min( pluralFormIndex, forms.length - 1 );
return forms[pluralFormIndex];
},
/**
* For the number, get the plural for index
*
* @param number
* @param pluralRules
* @return plural form index
*/
getPluralForm: function ( number, pluralRules ) {
var i,
pluralForms = [ 'zero', 'one', 'two', 'few', 'many', 'other' ],
pluralFormIndex = 0;
for ( i = 0; i < pluralForms.length; i++ ) {
if ( pluralRules[pluralForms[i]] ) {
if ( pluralRuleParser( pluralRules[pluralForms[i]], number ) ) {
return pluralFormIndex;
}
pluralFormIndex++;
}
}
return pluralFormIndex;
},
/**
* Converts a number using digitTransformTable.
*
* @param {number} num Value to be converted
* @param {boolean} integer Convert the return value to an integer
*/
convertNumber: function ( num, integer ) {
var tmp, item, i,
transformTable, numberString, convertedNumber;
// Set the target Transform table:
transformTable = this.digitTransformTable( $.i18n().locale );
numberString = String( num );
convertedNumber = '';
if ( !transformTable ) {
return num;
}
// Check if the restore to Latin number flag is set:
if ( integer ) {
if ( parseFloat( num, 10 ) === num ) {
return num;
}
tmp = [];
for ( item in transformTable ) {
tmp[transformTable[item]] = item;
}
transformTable = tmp;
}
for ( i = 0; i < numberString.length; i++ ) {
if ( transformTable[numberString[i]] ) {
convertedNumber += transformTable[numberString[i]];
} else {
convertedNumber += numberString[i];
}
}
return integer ? parseFloat( convertedNumber, 10 ) : convertedNumber;
},
/**
* Grammatical transformations, needed for inflected languages.
* Invoked by putting {{grammar:form|word}} in a message.
* Override this method for languages that need special grammar rules
* applied dynamically.
*
* @param word {String}
* @param form {String}
* @return {String}
*/
convertGrammar: function ( word, form ) { /*jshint unused: false */
return word;
},
/**
* Provides an alternative text depending on specified gender. Usage
* {{gender:[gender|user object]|masculine|feminine|neutral}}. If second
* or third parameter are not specified, masculine is used.
*
* These details may be overriden per language.
*
* @param gender
* string male, female, or anything else for neutral.
* @param forms
* array List of gender forms
*
* @return string
*/
gender: function ( gender, forms ) {
if ( !forms || forms.length === 0 ) {
return '';
}
while ( forms.length < 2 ) {
forms.push( forms[forms.length - 1] );
}
if ( gender === 'male' ) {
return forms[0];
}
if ( gender === 'female' ) {
return forms[1];
}
return ( forms.length === 3 ) ? forms[2] : forms[0];
},
/**
* Get the digit transform table for the given language
* See http://cldr.unicode.org/translation/numbering-systems
* @param language
* @returns {Array|boolean} List of digits in the passed language or false
* representation, or boolean false if there is no information.
*/
digitTransformTable: function ( language ) {
var tables = {
ar: '٠١٢٣٤٥٦٧٨٩',
fa: '۰۱۲۳۴۵۶۷۸۹',
ml: '൦൧൨൩൪൫൬൭൮൯',
kn: '೦೧೨೩೪೫೬೭೮೯',
lo: '໐໑໒໓໔໕໖໗໘໙',
or: '୦୧୨୩୪୫୬୭୮୯',
kh: '០១២៣៤៥៦៧៨៩',
pa: '੦੧੨੩੪੫੬੭੮੯',
gu: '૦૧૨૩૪૫૬૭૮૯',
hi: '०१२३४५६७८९',
my: '၀၁၂၃၄၅၆၇၈၉',
ta: '௦௧௨௩௪௫௬௭௮௯',
te: '౦౧౨౩౪౫౬౭౮౯',
th: '๐๑๒๓๔๕๖๗๘๙', // FIXME use iso 639 codes
bo: '༠༡༢༣༤༥༦༧༨༩' // FIXME use iso 639 codes
};
if ( !tables[language] ) {
return false;
}
return tables[language].split( '' );
}
};
$.extend( $.i18n.languages, {
'default': language
} );
}( jQuery ) );

View File

@ -0,0 +1,125 @@
/**
* jQuery Internationalization library - Message Store
*
* Copyright (C) 2012 Santhosh Thottingal
*
* jquery.i18n is dual licensed GPLv2 or later and MIT. You don't have to do anything special to
* choose one license or the other and you don't have to notify anyone which license you are using.
* You are free to use UniversalLanguageSelector in commercial projects as long as the copyright
* header is left intact. See files GPL-LICENSE and MIT-LICENSE for details.
*
* @licence GNU General Public Licence 2.0 or later
* @licence MIT License
*/
( function ( $, window, undefined ) {
'use strict';
var MessageStore = function () {
this.messages = {};
this.sources = {};
};
/**
* See https://github.com/wikimedia/jquery.i18n/wiki/Specification#wiki-Message_File_Loading
*/
MessageStore.prototype = {
/**
* General message loading API This can take a URL string for
* the json formatted messages.
* <code>load('path/to/all_localizations.json');</code>
*
* This can also load a localization file for a locale <code>
* load( 'path/to/de-messages.json', 'de' );
* </code>
* A data object containing message key- message translation mappings
* can also be passed Eg:
* <code>
* load( { 'hello' : 'Hello' }, optionalLocale );
* </code> If the data argument is
* null/undefined/false,
* all cached messages for the i18n instance will get reset.
*
* @param {String|Object} source
* @param {String} locale Language tag
* @return {jQuery.Promise}
*/
load: function ( source, locale ) {
var key = null,
deferred = null,
deferreds = [],
messageStore = this;
if ( typeof source === 'string' ) {
// This is a URL to the messages file.
$.i18n.log( 'Loading messages from: ' + source );
deferred = jsonMessageLoader( source )
.done( function ( localization ) {
messageStore.set( locale, localization );
} );
return deferred.promise();
}
if ( locale ) {
// source is an key-value pair of messages for given locale
messageStore.set( locale, source );
return $.Deferred().resolve();
} else {
// source is a key-value pair of locales and their source
for ( key in source ) {
if ( Object.prototype.hasOwnProperty.call( source, key ) ) {
locale = key;
// No {locale} given, assume data is a group of languages,
// call this function again for each language.
deferreds.push( messageStore.load( source[key], locale ) );
}
}
return $.when.apply( $, deferreds );
}
},
/**
* Set messages to the given locale.
* If locale exists, add messages to the locale.
* @param locale
* @param messages
*/
set: function ( locale, messages ) {
if ( !this.messages[locale] ) {
this.messages[locale] = messages;
} else {
this.messages[locale] = $.extend( this.messages[locale], messages );
}
},
/**
*
* @param locale
* @param messageKey
* @returns {Boolean}
*/
get: function ( locale, messageKey ) {
return this.messages[locale] && this.messages[locale][messageKey];
}
};
function jsonMessageLoader( url ) {
var deferred = $.Deferred();
$.getJSON( url )
.done( deferred.resolve )
.fail( function ( jqxhr, settings, exception ) {
$.i18n.log( 'Error in loading messages from ' + url + ' Exception: ' + exception );
// Ignore 404 exception, because we are handling fallabacks explicitly
deferred.resolve();
} );
return deferred.promise();
}
$.extend( $.i18n.messageStore, new MessageStore() );
}( jQuery, window ) );

View File

@ -0,0 +1,309 @@
/**
* jQuery Internationalization library
*
* Copyright (C) 2011-2013 Santhosh Thottingal, Neil Kandalgaonkar
*
* jquery.i18n is dual licensed GPLv2 or later and MIT. You don't have to do
* anything special to choose one license or the other and you don't have to
* notify anyone which license you are using. You are free to use
* UniversalLanguageSelector in commercial projects as long as the copyright
* header is left intact. See files GPL-LICENSE and MIT-LICENSE for details.
*
* @licence GNU General Public Licence 2.0 or later
* @licence MIT License
*/
( function ( $ ) {
'use strict';
var MessageParser = function ( options ) {
this.options = $.extend( {}, $.i18n.parser.defaults, options );
this.language = $.i18n.languages[String.locale] || $.i18n.languages['default'];
this.emitter = $.i18n.parser.emitter;
};
MessageParser.prototype = {
constructor: MessageParser,
simpleParse: function ( message, parameters ) {
return message.replace( /\$(\d+)/g, function ( str, match ) {
var index = parseInt( match, 10 ) - 1;
return parameters[index] !== undefined ? parameters[index] : '$' + match;
} );
},
parse: function ( message, replacements ) {
if ( message.indexOf( '{{' ) < 0 ) {
return this.simpleParse( message, replacements );
}
this.emitter.language = $.i18n.languages[$.i18n().locale] ||
$.i18n.languages['default'];
return this.emitter.emit( this.ast( message ), replacements );
},
ast: function ( message ) {
var pipe, colon, backslash, anyCharacter, dollar, digits, regularLiteral,
regularLiteralWithoutBar, regularLiteralWithoutSpace, escapedOrLiteralWithoutBar,
escapedOrRegularLiteral, templateContents, templateName, openTemplate,
closeTemplate, expression, paramExpression, result,
pos = 0;
// Try parsers until one works, if none work return null
function choice( parserSyntax ) {
return function () {
var i, result;
for ( i = 0; i < parserSyntax.length; i++ ) {
result = parserSyntax[i]();
if ( result !== null ) {
return result;
}
}
return null;
};
}
// Try several parserSyntax-es in a row.
// All must succeed; otherwise, return null.
// This is the only eager one.
function sequence( parserSyntax ) {
var i, res,
originalPos = pos,
result = [];
for ( i = 0; i < parserSyntax.length; i++ ) {
res = parserSyntax[i]();
if ( res === null ) {
pos = originalPos;
return null;
}
result.push( res );
}
return result;
}
// Run the same parser over and over until it fails.
// Must succeed a minimum of n times; otherwise, return null.
function nOrMore( n, p ) {
return function () {
var originalPos = pos,
result = [],
parsed = p();
while ( parsed !== null ) {
result.push( parsed );
parsed = p();
}
if ( result.length < n ) {
pos = originalPos;
return null;
}
return result;
};
}
// Helpers -- just make parserSyntax out of simpler JS builtin types
function makeStringParser( s ) {
var len = s.length;
return function () {
var result = null;
if ( message.substr( pos, len ) === s ) {
result = s;
pos += len;
}
return result;
};
}
function makeRegexParser( regex ) {
return function () {
var matches = message.substr( pos ).match( regex );
if ( matches === null ) {
return null;
}
pos += matches[0].length;
return matches[0];
};
}
pipe = makeStringParser( '|' );
colon = makeStringParser( ':' );
backslash = makeStringParser( '\\' );
anyCharacter = makeRegexParser( /^./ );
dollar = makeStringParser( '$' );
digits = makeRegexParser( /^\d+/ );
regularLiteral = makeRegexParser( /^[^{}\[\]$\\]/ );
regularLiteralWithoutBar = makeRegexParser( /^[^{}\[\]$\\|]/ );
regularLiteralWithoutSpace = makeRegexParser( /^[^{}\[\]$\s]/ );
// There is a general pattern:
// parse a thing;
// if it worked, apply transform,
// otherwise return null.
// But using this as a combinator seems to cause problems
// when combined with nOrMore().
// May be some scoping issue.
function transform( p, fn ) {
return function () {
var result = p();
return result === null ? null : fn( result );
};
}
// Used to define "literals" within template parameters. The pipe
// character is the parameter delimeter, so by default
// it is not a literal in the parameter
function literalWithoutBar() {
var result = nOrMore( 1, escapedOrLiteralWithoutBar )();
return result === null ? null : result.join( '' );
}
function literal() {
var result = nOrMore( 1, escapedOrRegularLiteral )();
return result === null ? null : result.join( '' );
}
function escapedLiteral() {
var result = sequence( [ backslash, anyCharacter ] );
return result === null ? null : result[1];
}
choice( [ escapedLiteral, regularLiteralWithoutSpace ] );
escapedOrLiteralWithoutBar = choice( [ escapedLiteral, regularLiteralWithoutBar ] );
escapedOrRegularLiteral = choice( [ escapedLiteral, regularLiteral ] );
function replacement() {
var result = sequence( [ dollar, digits ] );
if ( result === null ) {
return null;
}
return [ 'REPLACE', parseInt( result[1], 10 ) - 1 ];
}
templateName = transform(
// see $wgLegalTitleChars
// not allowing : due to the need to catch "PLURAL:$1"
makeRegexParser( /^[ !"$&'()*,.\/0-9;=?@A-Z\^_`a-z~\x80-\xFF+\-]+/ ),
function ( result ) {
return result.toString();
}
);
function templateParam() {
var expr,
result = sequence( [ pipe, nOrMore( 0, paramExpression ) ] );
if ( result === null ) {
return null;
}
expr = result[1];
// use a "CONCAT" operator if there are multiple nodes,
// otherwise return the first node, raw.
return expr.length > 1 ? [ 'CONCAT' ].concat( expr ) : expr[0];
}
function templateWithReplacement() {
var result = sequence( [ templateName, colon, replacement ] );
return result === null ? null : [ result[0], result[2] ];
}
function templateWithOutReplacement() {
var result = sequence( [ templateName, colon, paramExpression ] );
return result === null ? null : [ result[0], result[2] ];
}
templateContents = choice( [
function () {
var res = sequence( [
// templates can have placeholders for dynamic
// replacement eg: {{PLURAL:$1|one car|$1 cars}}
// or no placeholders eg:
// {{GRAMMAR:genitive|{{SITENAME}}}
choice( [ templateWithReplacement, templateWithOutReplacement ] ),
nOrMore( 0, templateParam )
] );
return res === null ? null : res[0].concat( res[1] );
},
function () {
var res = sequence( [ templateName, nOrMore( 0, templateParam ) ] );
if ( res === null ) {
return null;
}
return [ res[0] ].concat( res[1] );
}
] );
openTemplate = makeStringParser( '{{' );
closeTemplate = makeStringParser( '}}' );
function template() {
var result = sequence( [ openTemplate, templateContents, closeTemplate ] );
return result === null ? null : result[1];
}
expression = choice( [ template, replacement, literal ] );
paramExpression = choice( [ template, replacement, literalWithoutBar ] );
function start() {
var result = nOrMore( 0, expression )();
if ( result === null ) {
return null;
}
return [ 'CONCAT' ].concat( result );
}
result = start();
/*
* For success, the pos must have gotten to the end of the input
* and returned a non-null.
* n.b. This is part of language infrastructure, so we do not throw an internationalizable message.
*/
if ( result === null || pos !== message.length ) {
throw new Error( 'Parse error at position ' + pos.toString() + ' in input: ' + message );
}
return result;
}
};
$.extend( $.i18n.parser, new MessageParser() );
}( jQuery ) );

View File

@ -1,145 +0,0 @@
/*!
* JavaScript Cookie v2.0.4
* https://github.com/js-cookie/js-cookie
*
* Copyright 2006, 2015 Klaus Hartl & Fagner Brack
* Released under the MIT license
*/
(function (factory) {
if (typeof define === 'function' && define.amd) {
define(factory);
} else if (typeof exports === 'object') {
module.exports = factory();
} else {
var _OldCookies = window.Cookies;
var api = window.Cookies = factory();
api.noConflict = function () {
window.Cookies = _OldCookies;
return api;
};
}
}(function () {
function extend () {
var i = 0;
var result = {};
for (; i < arguments.length; i++) {
var attributes = arguments[ i ];
for (var key in attributes) {
result[key] = attributes[key];
}
}
return result;
}
function init (converter) {
function api (key, value, attributes) {
var result;
// Write
if (arguments.length > 1) {
attributes = extend({
path: '/'
}, api.defaults, attributes);
if (typeof attributes.expires === 'number') {
var expires = new Date();
expires.setMilliseconds(expires.getMilliseconds() + attributes.expires * 864e+5);
attributes.expires = expires;
}
try {
result = JSON.stringify(value);
if (/^[\{\[]/.test(result)) {
value = result;
}
} catch (e) {}
if (!converter.write) {
value = encodeURIComponent(String(value))
.replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent);
} else {
value = converter.write(value, key);
}
key = encodeURIComponent(String(key));
key = key.replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent);
key = key.replace(/[\(\)]/g, escape);
return (document.cookie = [
key, '=', value,
attributes.expires && '; expires=' + attributes.expires.toUTCString(), // use expires attribute, max-age is not supported by IE
attributes.path && '; path=' + attributes.path,
attributes.domain && '; domain=' + attributes.domain,
attributes.secure ? '; secure' : ''
].join(''));
}
// Read
if (!key) {
result = {};
}
// To prevent the for loop in the first place assign an empty array
// in case there are no cookies at all. Also prevents odd result when
// calling "get()"
var cookies = document.cookie ? document.cookie.split('; ') : [];
var rdecode = /(%[0-9A-Z]{2})+/g;
var i = 0;
for (; i < cookies.length; i++) {
var parts = cookies[i].split('=');
var name = parts[0].replace(rdecode, decodeURIComponent);
var cookie = parts.slice(1).join('=');
if (cookie.charAt(0) === '"') {
cookie = cookie.slice(1, -1);
}
try {
cookie = converter.read ?
converter.read(cookie, name) : converter(cookie, name) ||
cookie.replace(rdecode, decodeURIComponent);
if (this.json) {
try {
cookie = JSON.parse(cookie);
} catch (e) {}
}
if (key === name) {
result = cookie;
break;
}
if (!key) {
result[name] = cookie;
}
} catch (e) {}
}
return result;
}
api.get = api.set = api;
api.getJSON = function () {
return api.apply({
json: true
}, [].slice.call(arguments));
};
api.defaults = {};
api.remove = function (key, attributes) {
api(key, '', extend(attributes, {
expires: -1
}));
};
api.withConverter = init;
return api;
}
return init(function () {});
}));

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More