mirror of
https://github.com/hyperion-project/hyperion.ng.git
synced 2023-10-10 13:36:59 +02:00
Merge remote-tracking branch 'refs/remotes/hyperion-project/master' into weba
This commit is contained in:
commit
06007fc3ee
1
.gitignore
vendored
1
.gitignore
vendored
@ -17,3 +17,4 @@ CMakeCache.txt
|
||||
/HyperionConfig.h
|
||||
/lib
|
||||
.directory
|
||||
*.pyc
|
||||
|
@ -16,24 +16,36 @@ 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_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 +68,12 @@ 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 )
|
||||
SET ( DEFAULT_USE_AVAHI_LIBS OFF )
|
||||
elseif ( "${PLATFORM}" STREQUAL "rpi" )
|
||||
SET ( DEFAULT_DISPMANX ON )
|
||||
SET ( DEFAULT_WS281XPWM ON )
|
||||
@ -83,6 +91,8 @@ elseif ( "${PLATFORM}" MATCHES "x86" )
|
||||
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 +141,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 +251,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)
|
||||
|
139
CompileHowto.md
139
CompileHowto.md
@ -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
|
||||
|
||||
|
||||
|
@ -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"
|
||||
|
||||
|
||||
|
32
README.md
32
README.md
@ -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).
|
||||
|
@ -9,12 +9,13 @@
|
||||
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 INITAL_LED_TEST_ENABLED true
|
||||
|
||||
// Number of leds in your strip. set to "1" and ANALOG_OUTPUT_ENABLED to "true" to activate analog only
|
||||
#define NUM_LEDS 100
|
||||
|
||||
|
||||
#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 +23,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 +36,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,7 +51,8 @@
|
||||
#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
|
||||
@ -90,7 +94,7 @@ void showColor(const CRGB& led) {
|
||||
|
||||
// switch of digital and analog leds
|
||||
void switchOff() {
|
||||
#if ANALOG_ONLY == false
|
||||
#if NUM_LEDS > 1 || ANALOG_OUTPUT_ENABLED == false
|
||||
memset(leds, 0, NUM_LEDS * sizeof(struct CRGB));
|
||||
FastLED.show();
|
||||
#endif
|
||||
@ -133,13 +137,9 @@ void setup() {
|
||||
}
|
||||
|
||||
#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
|
||||
FastLED.addLeds<LED_TYPE, LED_PINS, COLOR_ORDER>(leds, ledCount);
|
||||
#endif
|
||||
|
||||
|
||||
// color adjustments
|
||||
FastLED.setBrightness ( BRIGHTNESS );
|
||||
FastLED.setTemperature( COLOR_TEMPERATURE );
|
||||
@ -147,11 +147,13 @@ void setup() {
|
||||
FastLED.setDither ( DITHER_MODE );
|
||||
|
||||
// initial RGB flash
|
||||
#if INITAL_LED_TEST_ENABLED == true
|
||||
showColor(CRGB(255, 0, 0)); delay(400);
|
||||
showColor(CRGB(0, 255, 0)); delay(400);
|
||||
showColor(CRGB(0, 0, 255)); delay(400);
|
||||
#endif
|
||||
showColor(CRGB(0, 0, 0));
|
||||
|
||||
|
||||
Serial.begin(serialRate);
|
||||
Serial.print("Ada\n"); // Send "Magic Word" string to host
|
||||
|
||||
@ -161,7 +163,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
|
||||
|
@ -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.
|
||||
}
|
@ -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(;;)
|
||||
}
|
133
assets/firmware/arduino/tpm2/tpm2.ino
Normal file
133
assets/firmware/arduino/tpm2/tpm2.ino
Normal file
@ -0,0 +1,133 @@
|
||||
/**
|
||||
* This is a demo implemention how to use tpm2 protovol on arduino
|
||||
*
|
||||
* code is taken from: https://github.com/JonasVanGool/TPM2-ARDUINO
|
||||
*/
|
||||
|
||||
|
||||
#include <FastLED.h>
|
||||
|
||||
#define START_BYTE 0xC9
|
||||
#define STOP_BYTE 0x36
|
||||
#define DATA_FRAME 0xDA
|
||||
#define COMMAND 0xC0
|
||||
#define REQ_RESP 0xAA
|
||||
|
||||
#define BAUDRATE 115200
|
||||
|
||||
#define DATA_PIN 12
|
||||
#define MAX_NR_LEDS 200
|
||||
|
||||
CRGB leds[MAX_NR_LEDS];
|
||||
|
||||
enum States {
|
||||
ST_START,
|
||||
ST_PACKET_TYPE,
|
||||
ST_PAYLOAD_SIZE,
|
||||
ST_USER_DATA,
|
||||
ST_END
|
||||
};
|
||||
|
||||
States activeState = ST_START;
|
||||
uint8_t byteRead = 0;
|
||||
uint8_t payloadHighByte = 0;
|
||||
uint8_t payloadLowByte = 0;
|
||||
int payloadSize = 0;
|
||||
int bytesRead = 0;
|
||||
int nrOfLeds = 0;
|
||||
|
||||
boolean flag = false;
|
||||
void setup() {
|
||||
// Init leds
|
||||
for (int i = 0; i < MAX_NR_LEDS; i++)
|
||||
leds[i] = 0;
|
||||
// Start serial device
|
||||
Serial.begin(BAUDRATE);
|
||||
// Set time out for readBytes function
|
||||
Serial.setTimeout(100);
|
||||
// init fastLED Library
|
||||
LEDS.addLeds<WS2812B, DATA_PIN, RGB>(leds, MAX_NR_LEDS);
|
||||
// setting brightness to 50% brightness
|
||||
LEDS.setBrightness(128);
|
||||
// debug led
|
||||
pinMode(13, OUTPUT);
|
||||
|
||||
|
||||
for(;;) {
|
||||
if (Serial.available() > 0) {
|
||||
// process TPM2 protocol
|
||||
switch (activeState) {
|
||||
//------------------------------//
|
||||
// START //
|
||||
//------------------------------//
|
||||
case ST_START:
|
||||
// read incomming byte
|
||||
byteRead = Serial.read();
|
||||
if (byteRead == START_BYTE) {
|
||||
activeState = ST_PACKET_TYPE;
|
||||
}
|
||||
break;
|
||||
//------------------------------//
|
||||
// PACKET_TYPE //
|
||||
//------------------------------//
|
||||
case ST_PACKET_TYPE:
|
||||
// read incomming byte
|
||||
byteRead = Serial.read();
|
||||
if (byteRead == DATA_FRAME) {
|
||||
activeState = ST_PAYLOAD_SIZE;
|
||||
} else {
|
||||
activeState = ST_START;
|
||||
Serial.flush();
|
||||
}
|
||||
break;
|
||||
//------------------------------//
|
||||
// PAYLOAD_SIZE //
|
||||
//------------------------------//
|
||||
case ST_PAYLOAD_SIZE:
|
||||
payloadHighByte = Serial.read();
|
||||
while (Serial.available() == 0) {}
|
||||
payloadLowByte = Serial.read();
|
||||
payloadSize = (payloadHighByte << 8) + payloadLowByte;
|
||||
nrOfLeds = payloadSize / 3;
|
||||
if (nrOfLeds <= MAX_NR_LEDS) {
|
||||
activeState = ST_USER_DATA;
|
||||
} else {
|
||||
activeState = ST_START;
|
||||
Serial.flush();
|
||||
}
|
||||
break;
|
||||
//------------------------------//
|
||||
// USER_DATA //
|
||||
//------------------------------//
|
||||
case ST_USER_DATA:
|
||||
bytesRead = Serial.readBytes((char *)leds, payloadSize);
|
||||
LEDS.show();
|
||||
if (bytesRead == payloadSize) {
|
||||
activeState = ST_END;
|
||||
} else {
|
||||
activeState = ST_START;
|
||||
Serial.flush();
|
||||
}
|
||||
break;
|
||||
//------------------------------//
|
||||
// END //
|
||||
//------------------------------//
|
||||
case ST_END:
|
||||
// read incomming byte
|
||||
byteRead = Serial.read();
|
||||
if (byteRead == STOP_BYTE) {
|
||||
activeState = ST_START;
|
||||
} else {
|
||||
activeState = ST_START;
|
||||
Serial.flush();
|
||||
}
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void loop() {
|
||||
}
|
@ -2,16 +2,12 @@
|
||||
<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>
|
||||
<h2 class="page-header"><i class="fa fa-photo fa-fw"></i><span data-i18n="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>
|
||||
<h4 data-i18n="conf_colors_label_intro">Color calibration, smoothing (color transistions) and detection of blackbars.</h4>
|
||||
<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 id="conf_cont"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -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>
|
||||
|
@ -1,34 +1,35 @@
|
||||
<div class="container-fluid" id="content_dashboard">
|
||||
<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>
|
||||
<h2 class="page-header"><i class="fa fa-dashboard fa-fw"></i><span data-i18n="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>
|
||||
<h4 data-i18n="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>
|
||||
<hr />
|
||||
</div>
|
||||
<hr>
|
||||
<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">Your 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="dashboard_infobox_label_leddevice">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 +43,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,14 +63,14 @@
|
||||
<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>
|
||||
@ -77,3 +78,6 @@
|
||||
</div>
|
||||
<!-- /.container-fluid -->
|
||||
|
||||
<script type="text/javascript">
|
||||
performTranslation('content_dashboard');
|
||||
</script>
|
@ -1,18 +1,14 @@
|
||||
<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>
|
||||
<h2 class="page-header"><i class="fa fa-spinner fa-fw"></i><span data-i18n="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>
|
||||
<h4 data-i18n="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>
|
||||
<hr />
|
||||
</div>
|
||||
<div id="conf_cont"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<script src="/js/content_effects.js"></script>
|
||||
|
@ -1,41 +1,47 @@
|
||||
<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>
|
||||
<h2 class="page-header"><i class="fa fa-cogs fa-fw"></i><span data-i18n="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>
|
||||
</div>
|
||||
<h4 data-i18n="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>
|
||||
<hr />
|
||||
<div class="col-lg-12">
|
||||
</div>
|
||||
<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 pull-right" 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 pull-right" id='btn_delete' data-i18n="effectsconfigurator_button_deleffect">Delete Effect</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
30
assets/webconfig/content/general.html
Normal file
30
assets/webconfig/content/general.html
Normal file
@ -0,0 +1,30 @@
|
||||
<div class="container-fluid">
|
||||
<div class="row">
|
||||
<div class="col-lg-12">
|
||||
<h2 class="page-header"><i class="fa fa-wrench fa-fw"></i><span data-i18n="conf_general_label_title">General</span></h2>
|
||||
<div class="introd">
|
||||
<h4 data-i18n="conf_general_label_intro"></h4>
|
||||
</div>
|
||||
<hr />
|
||||
<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>
|
@ -2,16 +2,12 @@
|
||||
<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>
|
||||
<h2 class="page-header"><i class="fa fa-camera fa-fw"></i><span data-i18n="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>
|
||||
<h4 data-i18n="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>
|
||||
<hr />
|
||||
</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 id="conf_cont"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -1,23 +1,18 @@
|
||||
<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>
|
||||
<h2 class="page-header"><i class="fa fa-play-circle-o fa-fw"></i><span data-i18n="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>
|
||||
<h4 data-i18n="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>
|
||||
<hr />
|
||||
</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 class="row" id="conf_cont"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="/js/content_kodi.js"></script>
|
||||
<script src="/js/content_kodi.js"></script>
|
||||
|
@ -1,12 +1,3 @@
|
||||
<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">
|
||||
@ -15,7 +6,7 @@
|
||||
<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 />
|
||||
<span data-i18n="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" />
|
||||
@ -26,27 +17,26 @@
|
||||
</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>
|
||||
<h2 class="page-header"><i class="fa fa-lightbulb-o fa-fw"></i><span data-i18n="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>
|
||||
<h4 data-i18n="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>
|
||||
<hr />
|
||||
</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>
|
||||
<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-8">
|
||||
<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>
|
||||
<label for="leddevices" 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>
|
||||
|
||||
@ -55,259 +45,297 @@
|
||||
|
||||
<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>
|
||||
<button data-toggle="collapse" class="btn btn-success" data-target="#huebridge_content" data-i18n="hue_btn_setup_helper">Hue Bridge Setup Helper</button>
|
||||
<div id="huebridge_content" class="collapse">
|
||||
<div class="introd" style="margin-top:20px;margin-bottom:20px">
|
||||
<div class="introd" style="margin-top:20px;margin-bottom:20px" data-i18n="hue_help_text">
|
||||
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 />
|
||||
<span id="ip_alert" style="display:none; color:red; font-weight: bold;" data-i18n="hue_failure_ip_token">Please check your IP Address.</span>
|
||||
<span id="abortConnection" style="display:none; color:red; font-weight: bold;" data-i18n="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>
|
||||
<label for="ip" data-i18n="hue_label_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>
|
||||
<label for="user" data-i18n="hue_label_username">Hue Bridge Username:</label>
|
||||
<input type="text" class="form-control" id="user" readonly="readonly">
|
||||
<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>
|
||||
<button type="button" class="btn btn-success" id="create_user"> <i class="fa fa-floppy-o"></i><span data-i18n="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 class="panel-footer" style="text-align:right">
|
||||
<button id='btn_submit_controller' class="btn btn-success"><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-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>
|
||||
<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 ">
|
||||
<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 class="panel-body">
|
||||
<table class="table borderless">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="ltd">
|
||||
<label class="ltdlabel" for="ip_cl_ledstop" data-i18n="conf_leds_layout_cl_top">Top</label>
|
||||
</td>
|
||||
<td class="itd input-group">
|
||||
<input class="form-control ledCLconstr led_val_int" id="ip_cl_ledstop" 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_ledsbottom" data-i18n="conf_leds_layout_cl_bottom">Bottom</label>
|
||||
</td>
|
||||
<td class="itd input-group">
|
||||
<input class="form-control ledCLconstr led_val_int" id="ip_cl_ledsbottom" 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_ledsleft" data-i18n="conf_leds_layout_cl_left">Left</label>
|
||||
</td>
|
||||
<td class="itd input-group">
|
||||
<input class="form-control ledCLconstr led_val_int" id="ip_cl_ledsleft" 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_ledsright" data-i18n="conf_leds_layout_cl_right">Right</label>
|
||||
</td>
|
||||
<td class="itd input-group">
|
||||
<input class="form-control ledCLconstr led_val_int" id="ip_cl_ledsright" 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_ledsglength" data-i18n="conf_leds_layout_cl_gaglength">Gap length</label>
|
||||
</td>
|
||||
<td class="itd input-group">
|
||||
<input class="form-control ledCLconstr led_val_int" id="ip_cl_ledsglength" 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_ledsgpos" data-i18n="conf_leds_layout_cl_gappos">Gap position</label>
|
||||
</td>
|
||||
<td class="itd">
|
||||
<input class="form-control ledCLconstr led_val_int" id="ip_cl_ledsgpos" 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 led_val_int" 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 led_val_bool" id="ip_cl_reverse" type="checkbox" value="false"></input>
|
||||
<label></label>
|
||||
</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>
|
||||
</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_rawledshdepth" data-i18n="conf_leds_layout_cl_hleddepth">Horizontal LED depth</label>
|
||||
</td>
|
||||
<td class="itd input-group">
|
||||
<input class="form-control ledCLconstr led_val_int" id="ip_cl_rawledshdepth" 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_rawledsvdepth" data-i18n="conf_leds_layout_cl_vleddepth">Vertical LED depth</label>
|
||||
</td>
|
||||
<td class="itd input-group">
|
||||
<input class="form-control ledCLconstr led_val_int" id="ip_cl_rawledsvdepth" 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_rawledsedgegap" data-i18n="conf_leds_layout_cl_edgegap">Edge Gap</label>
|
||||
</td>
|
||||
<td class="itd input-group">
|
||||
<input class="form-control ledCLconstr led_val_int" id="ip_cl_rawledsedgegap" 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_rawledscornergap" data-i18n="conf_leds_layout_cl_cornergap">Corner Gap</label>
|
||||
</td>
|
||||
<td class="itd input-group">
|
||||
<input class="form-control ledCLconstr led_val_int" id="ip_cl_rawledscornergap" 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">
|
||||
<button id="btn_cl_generate" class="btn btn-warning" lang="en" data-lang-token="conf_leds_layout_cl_generate">Generate LED configuration</button>
|
||||
<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-success"><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 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>
|
||||
<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">
|
||||
<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>
|
||||
<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 led_val_int" 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 led_val_int" 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 led_val_string" 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>
|
||||
</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">
|
||||
</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" 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>
|
||||
<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>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
--->
|
||||
<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>
|
||||
<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 led_val_string" 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>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</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 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-success"><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>
|
||||
<b><p data-i18n="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 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-success 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 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> <!-- accordion -->
|
||||
<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 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 class="col-lg-12 st_helper" style="padding-left:0px; padding-right:0px">
|
||||
<div id="leds_preview"></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 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>
|
||||
</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>
|
||||
</div> <!-- row layout -->
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div> <!-- tab content -->
|
||||
|
@ -1,17 +1,18 @@
|
||||
<div class="container-fluid">
|
||||
<div class="container-fluid" id="trans_conf_logging">
|
||||
<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>
|
||||
<h2 class="page-header"><i class="fa fa-reorder fa-fw"></i><span data-i18n="main_menu_logging_token">Log</span></h2>
|
||||
<div class="introd">
|
||||
<h4 lang="en" data-lang-token="conf_logging_label_intro">log messages.</h4>
|
||||
</div>
|
||||
<h4 data-i18n="conf_logging_label_intro">Area to check log messages, depending on loglevel setting you see more or less.</h4>
|
||||
<hr />
|
||||
|
||||
<div class="col-lg-12">
|
||||
<div id="logmessages" style="white-space:pre">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row" id='conf_cont'></div>
|
||||
<hr />
|
||||
<pre>
|
||||
<div id="logmessages" style="overflow:scroll;max-height:400px" />
|
||||
</pre>
|
||||
<button class="btn btn-primary" id='btn_pbupload' data-i18n="conf_logging_btn_pbupload">Pastebin upload</button>
|
||||
<button class="btn btn-success" id='btn_autoscroll' data-i18n="conf_logging_btn_autoscroll">Auto scrolling</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -1,21 +1,14 @@
|
||||
|
||||
<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>
|
||||
<h2 class="page-header"><i class="fa fa-sitemap fa-fw"></i><span data-i18n="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>
|
||||
<h4 data-i18n="conf_network_label_intro">All network based settings are listed here.</h4>
|
||||
<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 id="conf_cont"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<script src="/js/content_network.js"></script>
|
||||
|
@ -1,24 +1,24 @@
|
||||
<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>
|
||||
<h2 class="page-header"><i class="fa fa-wifi fa-fw"></i><span data-i18n="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>
|
||||
<h4 data-i18n="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>
|
||||
<hr />
|
||||
</div>
|
||||
<hr>
|
||||
</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-heading" data-i18n="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>
|
||||
<span data-i18n="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>
|
||||
<div data-i18n="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>
|
||||
<button data-i18n="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>
|
||||
@ -29,20 +29,20 @@
|
||||
|
||||
<div class="container-fluid">
|
||||
<div class="row">
|
||||
<div class="col-lg-6">
|
||||
<div class="col-lg-8 col-xxl-7">
|
||||
<div class="panel panel-primary" >
|
||||
<div class="panel-heading" lang="en" data-lang-token="remote_input_label_sourceselection">Source selection</div>
|
||||
<div class="panel-heading" data-i18n="remote_input_label_sourceselection">Source selection</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>
|
||||
<span data-i18n="remote_help_text">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.</span>
|
||||
<div id="sstcont"></div>
|
||||
<div id="auto_btn"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-lg-6">
|
||||
<div class="col-lg-4 col-xxl-5">
|
||||
<div class="panel panel-primary" >
|
||||
<div class="panel-heading" lang="en" data-lang-token="remote_components_label_components">Components control</div>
|
||||
<div class="panel-heading" data-i18n="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>
|
||||
@ -51,4 +51,17 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="container-fluid">
|
||||
<div class="row">
|
||||
<div class="col-lg-6">
|
||||
<div class="panel panel-primary" >
|
||||
<div class="panel-heading" data-i18n="remote_maptype_label">Mapping types</div>
|
||||
<div class="panel-body">
|
||||
<div id="mappingsbutton"><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>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="/js/content_remote.js" ></script>
|
||||
|
35
assets/webconfig/content/restart.html
Normal file
35
assets/webconfig/content/restart.html
Normal 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>
|
@ -1,113 +1,117 @@
|
||||
<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>
|
||||
<h2 class="page-header"><i class="fa fa-info fa-fw"></i><span data-i18n="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>
|
||||
<h4 data-i18n="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>
|
||||
<hr />
|
||||
</div>
|
||||
<hr>
|
||||
<h3 style="font-weight: bold" lang="en" data-lang-token="support_label_spreadtheword">Spread the word</h3>
|
||||
<h3 style="font-weight: bold" data-i18n="support_label_spreadtheword">Spread the word</h3>
|
||||
<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>
|
||||
<h3 style="font-weight: bold" data-i18n="support_label_donate">Donate or use our affiliate links</h3>
|
||||
<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 (doesn’t 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 (doesn’t 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">
|
||||
<h3 style="font-weight: bold" data-i18n="support_label_webrestitle">Information and help ressources</h3>
|
||||
<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>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
performTranslation('trans_support');
|
||||
</script>
|
||||
|
@ -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>
|
||||
<h2 class="page-header"><i class="fa fa-download fa-fw"></i><span data-i18n="main_menu_update_token">Update</span></h2>
|
||||
<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>
|
||||
|
14
assets/webconfig/content/webconfig.html
Normal file
14
assets/webconfig/content/webconfig.html
Normal file
@ -0,0 +1,14 @@
|
||||
<div class="container-fluid">
|
||||
<div class="row">
|
||||
<div class="col-lg-12">
|
||||
<h2 class="page-header"><i class="fa fa-wrench fa-fw"></i><span data-i18n="main_menu_webconfig_token">Webinterface</span></h2>
|
||||
<div class="introd">
|
||||
<h4 data-i18n="conf_webconfig_label_intro">Webinterface settings. Edit wisely</h4>
|
||||
<hr />
|
||||
</div>
|
||||
<div class="row" id="conf_cont"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="/js/content_webconfig.js"></script>
|
@ -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"}
|
@ -5,11 +5,114 @@
|
||||
url("../fonts/Roboto-Regular.ttf") format('ttf');
|
||||
}
|
||||
body{font-family:Roboto,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:15px;}
|
||||
.form-group{margin-bottom:11px;}
|
||||
#page-content {
|
||||
padding-bottom:50px;
|
||||
}
|
||||
|
||||
/*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%}
|
||||
.borderless {margin-bottom:0px}
|
||||
@media (max-width: 767px) {.ltd{white-space:normal;}}
|
||||
|
||||
/*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;padding-top:0px !important;}}
|
||||
@media (max-width: 1000px) {.introd{display:none}}
|
||||
.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 h4{line-height:25px;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;}
|
||||
|
||||
/*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;
|
||||
}
|
||||
|
||||
/**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 +269,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
607
assets/webconfig/i18n/de.json
Normal file
607
assets/webconfig/i18n/de.json
Normal file
@ -0,0 +1,607 @@
|
||||
{
|
||||
"@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_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",
|
||||
"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_leddevice" : "LED Typ:",
|
||||
"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_ledsim_title" : "LED Visualisierung",
|
||||
"main_ledsim_text" : "Eine live Visualisierung deiner LED Farben, sofern verfügbar kann ein live Video dazugeschalten werden. (Achtung: Ressourcenhungrig)",
|
||||
"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_label_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 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_effects_label_intro" : "Stelle einen Effekt oder Farbe ein, der beim Starten sichtbar sein soll. Stelle einen Hintergrundeffekt/Farbe ein der erst sichtbar wird, wenn alle Bildquellen abgeschaltet sind (Das gilt ebenfalls für temporäres abschalten mithilfe der Kodi Überwachung).",
|
||||
"conf_leds_label_intro" : "Der LED Hardware Bereich ermöglicht eine Vielzahl von Ausgabemöglichkeiten über Raspberry Pi GPIO, USB oder Netzwerk. Erstelle ein LED Layout das zu deinem Aufbau passt und schon kann es losgehen!",
|
||||
"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_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_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_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_leds_layout_textf2" : "Vergiss nicht zu speichern!",
|
||||
"conf_grabber_label_intro" : "Hyperion unterstützt 2 Hauptarten wie Bilder aufgenommen werden können. Zum Einen die Plattform Aufnahme, die sich direkt am System bedient auf dem Hyperion läuft (beste Qualität). Zum Anderen die USB Aufnahme, die sich an einem angeschlossenen Gerät bedient die benötigten Informationen für die Verarbeitung und Ausgabe zu erhalten (Mehr Konfigurationsaufwand und Kalibrierung)",
|
||||
"conf_colors_label_intro" : "Neben der Farbkalibrierung, gehört auch die Glättung (sanfte Farbübergänge) und die Erkennung von störenden (schwarzen) Balken zur Bildverarbeitung.",
|
||||
"conf_network_label_intro" : "Alle Einstellungen zu Ports, der Weiterleitung von JSON/PROTO und Boblight sowie UDP Listener.",
|
||||
"conf_kodi_label_title" : "Kodi Überwachung",
|
||||
"conf_kodi_label_intro" : "Die Kodi Überwachung ermöglicht es dir abhängig von dem 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" : "Protokoll hochladen",
|
||||
"conf_logging_btn_autoscroll" : "Automatisch scrollen",
|
||||
"conf_webconfig_label_intro" : "Einstellungen zur Webkonfiguration. Änderungen können die Erreichbarkeit des Webinterfaces beeinflussen.",
|
||||
"remote_label_intro" : "Die Fernbedienung ermöglicht dir während Hyperion läuft Farbe/Effekte zu starten/setzen, aber auch eine Quelle manuell festzulegen. Die Komponentensteuerung ermöglicht es dir gezielt Teile von Hyperion zu aktivieren/deaktivieren. Beachte, dass nach einem Neustart die hier durchgeführten Aktionen wieder zurückgesetzt werden.",
|
||||
"remote_colors_label_coloreffect" : "Farbe/Effekt:",
|
||||
"remote_colors_button_reset" : "Farbe/Effekt zurücksetzen",
|
||||
"remote_colors_label_color" : "Farbe:",
|
||||
"remote_effects_label_effects" : "Effekt:",
|
||||
"remote_input_label_sourceselection" : "Quellenauswahl",
|
||||
"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_components" : "Komponentensteuerung",
|
||||
"remote_optgroup_usreffets" : "Benutzer Effekte",
|
||||
"remote_optgroup_syseffets" : "Mitgelieferte Effekte",
|
||||
"remote_help_text" : "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 direkt die Quelle auswählen.",
|
||||
"remote_maptype_label" : "Farbzuordnung",
|
||||
"remote_maptype_label_multicolor_mean" : "Mehrfarbig",
|
||||
"remote_maptype_label_unicolor_mean" : "Einfarbig",
|
||||
"hue_button_create_user_token" : "Benutzer anlegen",
|
||||
"hue_press_link_modal" : "Bitte Link Taste auf der Hue Bridge drücken.",
|
||||
"hue_failure_connection_token" : "Connection Timeout. Bitte drücke die Taste rechtzeitig.",
|
||||
"hue_button_pair" : "Verbinden",
|
||||
"hue_btn_setup_helper" : "Hue Bridge Einrichtungshilfe",
|
||||
"hue_failure_ip_token" : "Bitte überprüfe deine IP Adresse.",
|
||||
"hue_label_username" : "Benutzername:",
|
||||
"hue_label_ip" : "Hue Bridge IP:",
|
||||
"hue_help_text" : "Mit diesem Setupassistenten kannst du einen neuen User auf der Hue Bridge anlegen und deine LightIDs für die Hyperion Konfiguration herausfinden. Wenn du bereits einen eingetragenen User hast, siehst du diesen bereits untenstehend eingetragen. Du kannst allerdings jederzeit einen neuen Anlegen. Beachte: Dies ist nur ein Assistent. Du musst die Daten in die Konfiguration kopieren.",
|
||||
"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",
|
||||
"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",
|
||||
"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_leds_gap_title" : "Lücke verloren!",
|
||||
"infoDialog_leds_gap_text" : "Deine LED Lücke/Position ist größer als die Anzahl der LEDs, verringere die Lückenposition und/oder Lückenlänge!",
|
||||
"InfoDialog_leds_validfail_title" : "JSON Überprüfung fehlgeschlagen!",
|
||||
"infoDialog_effconf_deleted_title" : "Effekt entfernt!",
|
||||
"infoDialog_effconf_deleted_text" : "Der Effekt \"$1\" wurde erfolgreich entfernt!",
|
||||
"infoDialog_effconf_created_title" : "Effekt erstellt!",
|
||||
"infoDialog_effconf_created_text" : "Der Effekt \"$1\" wurde erfolgreich erstellt!",
|
||||
"infoDialog_effconf_invalidvalue_title" : "Fehlerhafter Wert!",
|
||||
"infoDialog_effconf_invalidvalue_text" : "Es wurde ein unzulässiger Wert eingetragen, überprüfe das rot markierte Feld und versuche es erneut!",
|
||||
"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?",
|
||||
"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_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_channelAdjustment_enable_title" : "Aktiviere Farbkanalanpassung",
|
||||
"edt_conf_color_channelAdjustment_enable_expl" : "Aktiviere die Farbkanalanpassung",
|
||||
"edt_conf_color_channelAdjustment_v4l_only_title" : "Nur für USB Aufnahme",
|
||||
"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_gamma_red_title" : "Gamma rot",
|
||||
"edt_conf_color_gamma_red_expl" : "Gamma von rot.",
|
||||
"edt_conf_color_gamma_green_title" : "Gamma grün",
|
||||
"edt_conf_color_gamma_green_expl" : "Gamma von grün.",
|
||||
"edt_conf_color_gamma_blue_title" : "Gamma blau",
|
||||
"edt_conf_color_gamma_blue_expl" : "Gamma von blau",
|
||||
"edt_conf_color_brightness_min_title" : "Minimale Helligkeit",
|
||||
"edt_conf_color_brightness_min_expl" : "Auch als Hintergrundhelligkeit genutzt.",
|
||||
"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.",
|
||||
"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_timeout_title" : "Zeitüberschreitung",
|
||||
"edt_conf_udpl_shared_title" : "Gemeinsam 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" : "Lichtuhr",
|
||||
"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_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"
|
||||
}
|
605
assets/webconfig/i18n/en.json
Normal file
605
assets/webconfig/i18n/en.json
Normal file
@ -0,0 +1,605 @@
|
||||
{
|
||||
"@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_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",
|
||||
"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_leddevice" : "LED Controller:",
|
||||
"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_ledsim_title" : "LED Visualization",
|
||||
"main_ledsim_text" : "Live visualization of led colors and optional the current video stream of your capture device. (Warning: resource heavy)",
|
||||
"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_label_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_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)",
|
||||
"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!",
|
||||
"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_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_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_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_leds_layout_textf2" : "Don't forget to save!",
|
||||
"conf_grabber_label_intro" : "Hyperion supports two ways on how to get captured pictures for processing and output. The platform capture: internal at the device you are running Hyperion on (best qualitiy) and the USB Capture which gathers from a connected device the necessary pictures (more calibration work and configuration).",
|
||||
"conf_colors_label_intro" : "Color calibration, smoothing (color transistions) and detection of blackbars.",
|
||||
"conf_network_label_intro" : "All network based settings are listed here.",
|
||||
"conf_kodi_label_title" : "Kodi Watch",
|
||||
"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.",
|
||||
"conf_logging_label_intro" : "Area to check log messages, depending on loglevel setting you see more or less information.",
|
||||
"conf_logging_btn_pbupload" : "Upload log",
|
||||
"conf_logging_btn_autoscroll" : "Auto scrolling",
|
||||
"conf_webconfig_label_intro" : "Webconfiguration settings. Edit wisely.",
|
||||
"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.",
|
||||
"remote_colors_label_coloreffect" : "Colors/Effects",
|
||||
"remote_colors_button_reset" : "Reset Color/Effect",
|
||||
"remote_colors_label_color" : "Color:",
|
||||
"remote_effects_label_effects" : "Effect:",
|
||||
"remote_input_label_sourceselection" : "Source Selection",
|
||||
"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" : "Components control",
|
||||
"remote_optgroup_usreffets" : "User Effects",
|
||||
"remote_optgroup_syseffets" : "Provided Effects",
|
||||
"remote_help_text" : "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.",
|
||||
"remote_maptype_label" : "Mapping type",
|
||||
"remote_maptype_label_multicolor_mean" : "Multicolor",
|
||||
"remote_maptype_label_unicolor_mean" : "Unicolor",
|
||||
"hue_button_create_user_token" : "Create User",
|
||||
"hue_press_link_modal" : "Please press link button on the Hue Bridge.",
|
||||
"hue_failure_connection_token" : "Connection Timeout. Please press the button in time.",
|
||||
"hue_button_pair" : "Connect",
|
||||
"hue_btn_setup_helper" : "Hue Bridge Setup Helper",
|
||||
"hue_failure_ip_token" : "Please check your IP Address.",
|
||||
"hue_label_username" : "Hue Bridge Username",
|
||||
"hue_label_ip" : "Hue Bridge IP:",
|
||||
"hue_help_text" : "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. Remember: This is only a helper. You have to copy and paste them in your config above.",
|
||||
"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",
|
||||
"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",
|
||||
"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_leds_gap_title" : "GAP LOST IN SPACE!",
|
||||
"infoDialog_leds_gap_text" : "Your gap length/position is higher than your LED count, lower the gap length or gap position!",
|
||||
"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_effconf_invalidvalue_title" : "INVALID VALUE",
|
||||
"infoDialog_effconf_invalidvalue_text" : "Please check for red marked input(s) and try again!",
|
||||
"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?",
|
||||
"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_title" : "Color channel adjustments",
|
||||
"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_channelAdjustment_enable_title" : "Enable channel adjustment",
|
||||
"edt_conf_color_channelAdjustment_enable_expl" : "Activates the adjustment option",
|
||||
"edt_conf_color_channelAdjustment_v4l_only_title" : "Assign USB Capture only",
|
||||
"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_gamma_red_title" : "gamma red",
|
||||
"edt_conf_color_gamma_red_expl" : "The gamma of red.",
|
||||
"edt_conf_color_gamma_green_title" : "gamma green",
|
||||
"edt_conf_color_gamma_green_expl" : "The gamma of green.",
|
||||
"edt_conf_color_gamma_blue_title" : "gamma blue",
|
||||
"edt_conf_color_gamma_blue_expl" : "The gamma of blue.",
|
||||
"edt_conf_color_brightness_min_title" : "minimal brightness",
|
||||
"edt_conf_color_brightness_min_expl" : "The minimum amount of brightness (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.",
|
||||
"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_timeout_title" : "Timeout",
|
||||
"edt_conf_udpl_shared_title" : "Shared",
|
||||
"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" : "Light Clock",
|
||||
"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_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"
|
||||
}
|
47
assets/webconfig/i18n/qqq.json
Normal file
47
assets/webconfig/i18n/qqq.json
Normal 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"
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<html >
|
||||
|
||||
<head>
|
||||
|
||||
@ -8,7 +8,7 @@
|
||||
<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 - WebUI</title>
|
||||
|
||||
<!-- jQuery -->
|
||||
<script src="js/lib/jquery.min.js"></script>
|
||||
@ -29,30 +29,13 @@
|
||||
<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">
|
||||
|
||||
@ -64,7 +47,6 @@
|
||||
|
||||
<!-- Custom CSS -->
|
||||
<link href="css/sb-admin-2.css" rel="stylesheet">
|
||||
|
||||
<link href="css/hyperion.css" rel="stylesheet">
|
||||
|
||||
<!-- Custom Fonts -->
|
||||
@ -76,11 +58,20 @@
|
||||
<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 -->
|
||||
@ -93,85 +84,50 @@
|
||||
<span class="icon-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 href="#">
|
||||
<i class="fa fa-globe fa-fw"></i>
|
||||
</a>
|
||||
</li>
|
||||
<li class="dropdown" id="btn_setaccess">
|
||||
<a href="#">
|
||||
<i class="fa fa-key fa-fw"></i>
|
||||
</a>
|
||||
</li>
|
||||
<li class="dropdown" id="btn_open_ledsim">
|
||||
<a href="#">
|
||||
<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">  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">  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>
|
||||
<li id="btn_wizard_byteorder">
|
||||
<a href="#">
|
||||
<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>
|
||||
<li id="btn_wizard_colorcalibration">
|
||||
<a href="#">
|
||||
<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> Color Calibration Wizard
|
||||
</div>
|
||||
</a>
|
||||
</li>
|
||||
<li class="divider"></li>
|
||||
<li>
|
||||
<a href="#">
|
||||
<div>
|
||||
<i class="fa fa-envelope fa-fw"></i> Message Sent
|
||||
<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-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>
|
||||
@ -181,7 +137,7 @@
|
||||
<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 id="btn_open_ledsim" ><a href="#"><i class="fa fa-user fa-fw"></i>led sim</a>
|
||||
</li>
|
||||
<li><a href="#"><i class="fa fa-gear fa-fw"></i>Settings</a>
|
||||
</li>
|
||||
@ -198,26 +154,28 @@
|
||||
<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="active" id="load_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" id="load_confGeneral"><i class="fa fa-wrench fa-fw"></i><span data-i18n="main_menu_general_conf_token">General</span></a> </li>
|
||||
<li> <a class="inactive" id="load_confLeds"><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" id="load_confGrabber"><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" id="load_confEffects"><i class="fa fa-spinner fa-fw"></i><span data-i18n="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 data-i18n="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 data-i18n="main_menu_kodiwatch_token">Kodi Watch</span></a> </li>
|
||||
<li> <a class="inactive" id="load_confNetwork"><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" id="load_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" id="load_effectsconfig"><i class="fa fa-cogs fa-fw"></i><span data-i18n="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 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" 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" id="load_logging"><i class="fa fa-reorder fa-fw"></i><span data-i18n="main_menu_logging_token">Log</span></a> </li>
|
||||
<li> <a class="inactive" id="load_update"><i class="fa fa-download fa-fw"></i><span data-i18n="main_menu_update_token">Update</span></a> </li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
@ -229,39 +187,65 @@
|
||||
|
||||
<!-- 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 id="wizp1_body" class="modal-body" style="text-align:center"></div>
|
||||
<div id="wizp1_footer" class="modal-footer" style="text-align:center"></div>
|
||||
</div>
|
||||
<div id="wizp2" style="display:none">
|
||||
<center>
|
||||
<div id="wizp2_body" class="modal-body"></div>
|
||||
</center>
|
||||
<div id="wizp2_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;">
|
||||
<p id="ledsim_text" data-i18n="main_ledsim_text" style="font-weight:bold; margin: 10px 15px 0px 15px">Live visualization of led colors and if available the current picture of your capture device</p>
|
||||
<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 +256,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>
|
||||
|
@ -1,20 +1,78 @@
|
||||
|
||||
var conf_editor = null;
|
||||
var editor_color = null;
|
||||
var editor_smoothing = null;
|
||||
var editor_blackborder = 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);
|
||||
|
||||
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);
|
||||
|
||||
$('#btn_submit').off().on('click',function() {
|
||||
requestWriteConfig(conf_editor.getValue());
|
||||
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());
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
$(document).ready( function() {
|
||||
performTranslation();
|
||||
requestServerConfigSchema();
|
||||
});
|
||||
|
||||
|
@ -1,17 +1,151 @@
|
||||
var conf_editor = null;
|
||||
var olddEffects = [];
|
||||
var editorReady = false;
|
||||
var effects_editor = null;
|
||||
var confFgEff = parsedConfJSON.foregroundEffect.effect;
|
||||
var confBgEff = parsedConfJSON.backgroundEffect.effect;
|
||||
var foregroundEffect_editor = null;
|
||||
var backgroundEffect_editor = null;
|
||||
|
||||
$(hyperion).one("cmd-config-getschema", function(event) {
|
||||
schema = parsedConfSchemaJSON.properties;
|
||||
conf_editor = createJsonEditor('editor_container', {
|
||||
effects : schema.effects,
|
||||
initialEffect : schema.initialEffect
|
||||
}, true);
|
||||
|
||||
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());
|
||||
});
|
||||
}
|
||||
|
||||
$('#btn_submit').off().on('click',function() {
|
||||
requestWriteConfig(conf_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());
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
function updateEffectlist(event){
|
||||
if(editorReady)
|
||||
{
|
||||
var newEffects = event.response.info.effects;
|
||||
if (newEffects.length != olddEffects.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());
|
||||
olddEffects = 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$(document).ready( function() {
|
||||
performTranslation();
|
||||
requestServerConfigSchema();
|
||||
//$("[type='checkbox']").bootstrapSwitch();
|
||||
$(hyperion).on("cmd-serverinfo",updateEffectlist);
|
||||
});
|
||||
|
@ -1,54 +1,3 @@
|
||||
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";
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
var oldDelList = [];
|
||||
|
||||
@ -66,15 +15,16 @@
|
||||
}
|
||||
$("#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>';
|
||||
EffectsHtml += '<option value="'+effects[idx].schemaContent.script+'">'+$.i18n(effects[idx].schemaContent.title)+'</option>';
|
||||
}
|
||||
$("#effectslist").html(EffectsHtml);
|
||||
$("#effectslist").trigger("change");
|
||||
@ -83,26 +33,10 @@ $(hyperion).one("cmd-config-getschema", function(event) {
|
||||
function validateEditor() {
|
||||
if(effects_editor.validate().length)
|
||||
{
|
||||
showInfoDialog('error','INVALID VALUES','Please check for red marked inputs and try again.');
|
||||
showInfoDialog('error', $.i18n('infoDialog_effconf_invalidvalue_title'), $.i18n('infoDialog_effconf_invalidvalue_text'));
|
||||
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;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
function triggerTestEffect() {
|
||||
@ -119,29 +53,41 @@ $(hyperion).one("cmd-config-getschema", function(event) {
|
||||
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") && validateEditor())
|
||||
{
|
||||
triggerTestEffect();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$("#name-input").on('change keydown click focusout', 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())
|
||||
if(validateEditor())
|
||||
{
|
||||
requestWriteEffect(effectName,effectPy,JSON.stringify(effects_editor.getValue()));
|
||||
showInfoDialog('success','SUCCESS!','Your effect "'+effectName+'" has been created successfully!');
|
||||
showInfoDialog('success', "", $.i18n('infoDialog_effconf_created_text', effectName));
|
||||
}
|
||||
});
|
||||
|
||||
$('#btn_start_test').off().on('click',function() {
|
||||
if(validateEditor() && validateName())
|
||||
if(validateEditor())
|
||||
{
|
||||
triggerTestEffect();
|
||||
}
|
||||
@ -158,10 +104,19 @@ $(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!');
|
||||
showInfoDialog('success', "", $.i18n('infoDialog_effconf_deleted_text', name));
|
||||
});
|
||||
|
||||
$('#effectsdellist').off().on('change', function(){
|
||||
if ($(this).val() == null) {
|
||||
$('#btn_delete').prop('disabled',true);
|
||||
} else {
|
||||
$('#btn_delete').prop('disabled',false);
|
||||
}
|
||||
});
|
||||
|
||||
$(document).ready( function() {
|
||||
performTranslation();
|
||||
requestServerConfigSchema();
|
||||
$(hyperion).on("cmd-serverinfo",updateDelEffectlist);
|
||||
});
|
||||
|
121
assets/webconfig/js/content_general.js
Normal file
121
assets/webconfig/js/content_general.js
Normal file
@ -0,0 +1,121 @@
|
||||
|
||||
var conf_editor = null;
|
||||
$(hyperion).one("cmd-config-getschema", function(event) {
|
||||
schema = parsedConfSchemaJSON.properties;
|
||||
|
||||
$('#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());
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
|
||||
$(document).ready( function() {
|
||||
performTranslation();
|
||||
requestServerConfigSchema();
|
||||
|
||||
var importedConf;
|
||||
var confName;
|
||||
|
||||
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 !== parsedConfJSON.general.configVersion)
|
||||
{
|
||||
showInfoDialog('error', "", $.i18n('infoDialog_import_reverror_text', f.name, content.general.configVersion, parsedConfJSON.general.configVersion));
|
||||
dis_imp_btn(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
dis_imp_btn(false);
|
||||
importedConf = content;
|
||||
confName = f.name;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
r.readAsText(f);
|
||||
}
|
||||
}
|
||||
|
||||
$('#btn_export_conf').off().on('click', function(){
|
||||
var crev = parsedConfJSON.general.configVersion;
|
||||
var name = parsedConfJSON.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(parsedConfJSON, null, "\t"), 'Hyperion-Config ('+name+') '+timestamp+'.json', "application/json");
|
||||
});
|
||||
|
||||
$('#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'));
|
||||
});
|
||||
|
||||
});
|
||||
|
@ -1,21 +1,59 @@
|
||||
|
||||
|
||||
var conf_editor = null;
|
||||
var conf_editor_v4l2 = null;
|
||||
var conf_editor_fg = null;
|
||||
$(hyperion).one("cmd-config-getschema", function(event) {
|
||||
schema = parsedConfSchemaJSON.properties;
|
||||
conf_editor = createJsonEditor('editor_container', {
|
||||
framegrabber: schema.framegrabber,
|
||||
grabberV4L2 : schema.grabberV4L2
|
||||
}, true);
|
||||
|
||||
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);
|
||||
|
||||
|
||||
$('#btn_submit').off().on('click',function() {
|
||||
requestWriteConfig(conf_editor.getValue());
|
||||
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());
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
|
||||
$(document).ready( function() {
|
||||
performTranslation();
|
||||
requestServerConfigSchema();
|
||||
});
|
||||
|
||||
|
@ -1,27 +1,31 @@
|
||||
$(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_confGeneral","general",false);
|
||||
bindNavToContent("#load_confEffects","effects",false);
|
||||
bindNavToContent("#load_confKodi","kodiconf",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);
|
||||
bindNavToContent("#load_webconfig","webconfig",false);
|
||||
|
||||
$(hyperion).on("cmd-serverinfo",function(event){
|
||||
showOptHelp = parsedConfJSON.general.showOptHelp;
|
||||
parsedServerInfoJSON = event.response;
|
||||
currentVersion = parsedServerInfoJSON.info.hyperion[0].version;
|
||||
cleanCurrentVersion = currentVersion.replace(/\./g, '');
|
||||
|
||||
|
||||
if (parsedServerInfoJSON.info.hyperion[0].config_modified)
|
||||
$("#hyperion_reload_notify").fadeIn("fast");
|
||||
else
|
||||
@ -48,7 +52,7 @@ $(document).ready( function() {
|
||||
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>';
|
||||
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);
|
||||
|
||||
@ -62,23 +66,35 @@ $(document).ready( function() {
|
||||
|
||||
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>');
|
||||
$('#versioninforesult').html('<div style="margin:0px;" class="alert alert-warning">'+$.i18n('dashboard_infobox_message_updatewarning', latestVersion)+'</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>');
|
||||
$('#versioninforesult').html('<div style="margin:0px;" class="alert alert-success">'+$.i18n('dashboard_infobox_message_updatesuccess')+'</div>');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if ($("#logmessages").length == 0)
|
||||
if ($("#logmessages").length == 0 && loggingStreamActive)
|
||||
{
|
||||
requestLoggingStop();
|
||||
}
|
||||
|
||||
|
||||
$("#loading_overlay").removeClass("overlay");
|
||||
$("#main-nav").show('slide', {direction: 'left'}, 1000);
|
||||
|
||||
if (!parsedServerInfoJSON.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
|
||||
|
||||
@ -101,11 +117,7 @@ $(document).ready( function() {
|
||||
});
|
||||
|
||||
$("#btn_hyperion_reload").on("click", function(){
|
||||
$(hyperion).off();
|
||||
requestServerConfigReload();
|
||||
watchdog = 1;
|
||||
$("#wrapper").fadeOut("slow");
|
||||
cron();
|
||||
initRestart();
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -2,19 +2,30 @@
|
||||
var conf_editor = null;
|
||||
$(hyperion).one("cmd-config-getschema", function(event) {
|
||||
schema = parsedConfSchemaJSON.properties;
|
||||
|
||||
$('#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() {
|
||||
performTranslation();
|
||||
requestServerConfigSchema();
|
||||
});
|
||||
|
||||
|
@ -1,6 +1,9 @@
|
||||
|
||||
var ledsCustomCfgInitialized = false;
|
||||
var finalLedArray = [];
|
||||
var IntListIds;
|
||||
var StrListIds;
|
||||
var BoolListIds;
|
||||
|
||||
function get_hue_lights(){
|
||||
$.ajax({
|
||||
@ -21,12 +24,62 @@ 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
|
||||
}
|
||||
|
||||
function loadStoredValues()
|
||||
{
|
||||
if (storageComp() && getStorage('ip_cl_ledstop') != null)
|
||||
{
|
||||
IntListIds = $('.led_val_int').map(function() { return this.id; }).get();
|
||||
StrListIds = $('.led_val_string').map(function() { return this.id; }).get();
|
||||
BoolListIds = $('.led_val_bool').map(function() { return this.id; }).get();
|
||||
|
||||
for(var i = 0; i < IntListIds.length; i++)
|
||||
{
|
||||
$('#'+IntListIds[i]).val(parseInt(getStorage(IntListIds[i])));
|
||||
}
|
||||
|
||||
for(var i = 0; i < BoolListIds.length; i++)
|
||||
{
|
||||
var vb = getStorage(BoolListIds[i]);
|
||||
$('#'+BoolListIds[i]).prop('checked', vb == "true" ? true : false);
|
||||
}
|
||||
|
||||
for(var i = 0; i < StrListIds.length; i++)
|
||||
{
|
||||
$('#'+StrListIds[i]).val(getStorage(StrListIds[i]));
|
||||
}
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
function saveValues()
|
||||
{
|
||||
if(storageComp())
|
||||
{
|
||||
for(var i = 0; i < IntListIds.length; i++)
|
||||
{
|
||||
setStorage(IntListIds[i], $('#'+IntListIds[i]).val());
|
||||
}
|
||||
|
||||
for(var i = 0; i < BoolListIds.length; i++)
|
||||
{
|
||||
setStorage(BoolListIds[i], $('#'+BoolListIds[i]).is(":checked"));
|
||||
}
|
||||
|
||||
for(var i = 0; i < StrListIds.length; i++)
|
||||
{
|
||||
setStorage(StrListIds[i], $('#'+StrListIds[i]).val());
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
function round(number) {
|
||||
var factor = Math.pow(10, 4);
|
||||
var tempNumber = number * factor;
|
||||
@ -35,21 +88,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 +119,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,31 +128,32 @@ 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_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 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 rawledsvdepth = parseInt($("#ip_cl_rawledsvdepth").val());
|
||||
var rawledshdepth = parseInt($("#ip_cl_rawledshdepth").val());
|
||||
var rawledsedgegap = parseInt($("#ip_cl_rawledsedgegap").val());
|
||||
var rawledscornergap = parseInt($("#ip_cl_rawledscornergap").val());
|
||||
|
||||
//helper
|
||||
var ledsVDepth = rawledsVDepth /100;
|
||||
var ledsHDepth = rawledsHDepth /100;
|
||||
var edgeVGap = rawedgeGap /100/2;
|
||||
var ledsVDepth = rawledsvdepth /100;
|
||||
var ledsHDepth = rawledshdepth /100;
|
||||
var edgeVGap = rawledsedgegap /100/2;
|
||||
var edgeHGap = edgeVGap/(16/9);
|
||||
var cornerVGap = rawcornerGap /100/2;
|
||||
var cornerVGap = rawledscornergap /100/2;
|
||||
var cornerHGap = cornerVGap/(16/9);
|
||||
var Vmin = 0.0 + edgeVGap;
|
||||
var Vmax = 1.0 - edgeVGap;
|
||||
@ -107,22 +161,6 @@ function createClassicLeds(){
|
||||
var Hmax = 1.0 - edgeHGap;
|
||||
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,11 +170,12 @@ 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!');
|
||||
if (ledsgpos+ledsglength > ledArray.length){
|
||||
showInfoDialog('error', $.i18n('infoDialog_leds_gap_title'), $.i18n('infoDialog_leds_gap_text'));
|
||||
return false
|
||||
}
|
||||
return true
|
||||
@ -167,16 +206,16 @@ function createClassicLeds(){
|
||||
}
|
||||
|
||||
function createTopLeds(){
|
||||
step=(Hmax-Hmin)/ledsTop;
|
||||
step=(Hmax-Hmin)/ledstop;
|
||||
hmin=Hmin
|
||||
if(cornerVGap != '0'){
|
||||
step=(Hmax-Hmin-(cornerHGap*2))/ledsTop;
|
||||
step=(Hmax-Hmin-(cornerHGap*2))/ledstop;
|
||||
hmin=Hmin+(cornerHGap);
|
||||
}
|
||||
vmin=Vmin
|
||||
vmax=vmin+ledsHDepth;
|
||||
hmax=hmin+step
|
||||
for (var i = 0; i<ledsTop; i++){
|
||||
for (var i = 0; i<ledstop; i++){
|
||||
createLedArray(hmin, hmax, vmin, vmax);
|
||||
hmin += step
|
||||
hmax += step
|
||||
@ -184,16 +223,16 @@ function createClassicLeds(){
|
||||
}
|
||||
|
||||
function createLeftLeds(){
|
||||
step=(Vmax-Vmin)/ledsLeft;
|
||||
step=(Vmax-Vmin)/ledsleft;
|
||||
vmax=Vmax
|
||||
if(cornerVGap != '0'){
|
||||
step=(Vmax-Vmin-(cornerVGap*2))/ledsLeft;
|
||||
step=(Vmax-Vmin-(cornerVGap*2))/ledsleft;
|
||||
vmax=Vmax-(cornerVGap);
|
||||
}
|
||||
hmin=Hmin;
|
||||
hmax=hmin+ledsVDepth;
|
||||
vmin=vmax-step
|
||||
for (var i = ledsLeft; i>0; i--){
|
||||
for (var i = ledsleft; i>0; i--){
|
||||
createLedArray(hmin, hmax, vmin, vmax);
|
||||
vmin -= step
|
||||
vmax -= step
|
||||
@ -201,16 +240,16 @@ function createClassicLeds(){
|
||||
}
|
||||
|
||||
function createRightLeds(){
|
||||
step=(Vmax-Vmin)/ledsRight;
|
||||
step=(Vmax-Vmin)/ledsright;
|
||||
vmin=Vmin
|
||||
if(cornerVGap != '0'){
|
||||
step=(Vmax-Vmin-(cornerVGap*2))/ledsRight;
|
||||
step=(Vmax-Vmin-(cornerVGap*2))/ledsright;
|
||||
vmin=Vmin+(cornerVGap);
|
||||
}
|
||||
hmax=Hmax;
|
||||
hmin=hmax-ledsVDepth;
|
||||
vmax=vmin+step
|
||||
for (var i = 0; i<ledsRight; i++){
|
||||
for (var i = 0; i<ledsright; i++){
|
||||
createLedArray(hmin, hmax, vmin, vmax);
|
||||
vmin += step
|
||||
vmax += step
|
||||
@ -218,30 +257,45 @@ function createClassicLeds(){
|
||||
}
|
||||
|
||||
function createBottomLeds(){
|
||||
step=(Hmax-Hmin)/ledsBottom;
|
||||
step=(Hmax-Hmin)/ledsbottom;
|
||||
hmax=Hmax
|
||||
if(cornerVGap != '0'){
|
||||
step=(Hmax-Hmin-(cornerHGap*2))/ledsBottom;
|
||||
step=(Hmax-Hmin-(cornerHGap*2))/ledsbottom;
|
||||
hmax=Hmax-(cornerHGap);
|
||||
}
|
||||
vmax=Vmax;
|
||||
vmin=vmax-ledsHDepth;
|
||||
hmin=hmax-step
|
||||
for (var i = ledsBottom; i>0; i--){
|
||||
for (var i = ledsbottom; i>0; i--){
|
||||
createLedArray(hmin, hmax, vmin, vmax);
|
||||
hmin -= step;
|
||||
hmax -= step;
|
||||
}
|
||||
}
|
||||
|
||||
createLeftLeds(createBottomLeds(createRightLeds(createTopLeds())));
|
||||
|
||||
if(ledsglength != "0" && validateGap()){
|
||||
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 +303,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 +341,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,66 +369,70 @@ function createMatrixLeds(){
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
//-------------------------------------------------------------------
|
||||
// translate
|
||||
performTranslation();
|
||||
|
||||
// restore values from storage
|
||||
loadStoredValues();
|
||||
|
||||
// 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');
|
||||
saveValues();
|
||||
}
|
||||
});
|
||||
|
||||
// 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');
|
||||
saveValues();
|
||||
}
|
||||
});
|
||||
|
||||
// fill textfield with current led conf and copy to finalLedArray
|
||||
$(hyperion).one("cmd-config-getconfig",function(event){
|
||||
$("#ledconfig").text(JSON.stringify(event.response.result.leds, null, "\t"));
|
||||
finalLedArray = event.response.result.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%)");
|
||||
}
|
||||
});
|
||||
|
||||
// ------------------------------------------------------------------
|
||||
// create led device selection
|
||||
$(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'];
|
||||
devNET = ['atmoorb', 'fadecandy', 'philipshue', 'tinkerforge', 'tpm2net', 'udpe131', 'udph801', 'udpraw'];
|
||||
devUSB = ['adalight', 'dmx', 'atmo', 'hyperionusbasp', 'lightpack', 'multilightpack', 'paintpack', 'rawhid', 'sedu', 'tpm2'];
|
||||
|
||||
var optArr = [[]];
|
||||
optArr[1]=[];
|
||||
@ -399,106 +457,57 @@ $(document).ready(function() {
|
||||
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").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(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();
|
||||
}
|
||||
});
|
||||
|
||||
// ------------------------------------------------------------------
|
||||
// validate textfield and update preview
|
||||
$("#leds_custom_updsim").off().on("click", function() {
|
||||
if (validateText()){
|
||||
string = $("#ledconfig").val();
|
||||
createLedPreview(JSON.parse(string), 'text');
|
||||
createLedPreview(JSON.parse($("#ledconfig").val()), 'text');
|
||||
}
|
||||
});
|
||||
|
||||
// ------------------------------------------------------------------
|
||||
// save led config and saveValues - passing textfield
|
||||
$("#btn_ma_save, #btn_cl_save").off().on("click", function() {
|
||||
requestWriteConfig(JSON.parse('{"leds" :'+finalLedArray+'}'));
|
||||
saveValues();
|
||||
});
|
||||
|
||||
// validate and save led config from textfield
|
||||
$("#leds_custom_save").off().on("click", function() {
|
||||
function createLedConfig(){
|
||||
var string = '{"leds" :';
|
||||
string += $("#ledconfig").val();
|
||||
string += "}";
|
||||
return string
|
||||
}
|
||||
if (validateText())
|
||||
requestWriteConfig(JSON.parse(createLedConfig()));
|
||||
requestWriteConfig(JSON.parse('{"leds" :'+$("#ledconfig").val()+'}'));
|
||||
});
|
||||
|
||||
// ------------------------------------------------------------------
|
||||
// toggle led numbers
|
||||
$('#leds_prev_toggle_num').off().on("click", function() {
|
||||
$('.led_prev_num').toggle();
|
||||
toggleClass('#leds_prev_toggle_num', "btn-danger", "btn-success");
|
||||
});
|
||||
// -------------------------------------------------------------
|
||||
|
||||
// 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;
|
||||
}
|
||||
});
|
||||
|
||||
// ------------------------------------------------------------------
|
||||
// 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));
|
||||
conf_editor = createJsonEditor('editor_container', {
|
||||
generalOptions : generalOptions,
|
||||
specificOptions : specificOptions,
|
||||
@ -523,10 +532,6 @@ $(document).ready(function() {
|
||||
|
||||
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")
|
||||
{
|
||||
@ -544,12 +549,13 @@ $(document).ready(function() {
|
||||
{
|
||||
$("#huebridge").hide();
|
||||
}
|
||||
|
||||
// change save button state based on validation result
|
||||
conf_editor.validate().length ? $('#btn_submit_controller').attr('disabled', true) : $('#btn_submit_controller').attr('disabled', false);
|
||||
});
|
||||
|
||||
// ------------------------------------------------------------------
|
||||
|
||||
// save led device config
|
||||
$("#btn_submit_controller").off().on("click", function(event) {
|
||||
if (conf_editor==null)
|
||||
return;
|
||||
|
||||
ledDevice = $("#leddevices").val();
|
||||
result = {device:{}};
|
||||
@ -571,3 +577,4 @@ $(document).ready(function() {
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
@ -1,11 +1,40 @@
|
||||
|
||||
var conf_editor = null;
|
||||
|
||||
|
||||
$(document).ready(function() {
|
||||
performTranslation();
|
||||
requestLoggingStart();
|
||||
|
||||
schema = parsedConfSchemaJSON.properties;
|
||||
|
||||
$('#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")));
|
||||
}
|
||||
|
||||
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());
|
||||
});
|
||||
|
||||
$('#btn_autoscroll').off().on('click',function() {
|
||||
toggleClass('#btn_autoscroll', "btn-success", "btn-danger");
|
||||
});
|
||||
|
||||
if (!loggingHandlerInstalled)
|
||||
{
|
||||
loggingHandlerInstalled = true;
|
||||
$(hyperion).on("cmd-logging-update",function(event){
|
||||
if ($("#logmessages").length == 0)
|
||||
if ($("#logmessages").length == 0 && loggingStreamActive)
|
||||
{
|
||||
requestLoggingStop();
|
||||
}
|
||||
@ -14,9 +43,26 @@ $(document).ready(function() {
|
||||
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 = "<"+file_name+":"+line+":"+function_+"()> ";
|
||||
}
|
||||
|
||||
$("#logmessages").html($("#logmessages").html()+"\n <code>"+"["+app_name+" "+logger_name+"] <"+level_string+"> "+debug+msg+"</code>");
|
||||
}
|
||||
if($("#btn_autoscroll").hasClass('btn-success')){
|
||||
$('#logmessages').stop().animate({
|
||||
scrollTop: $('#logmessages')[0].scrollHeight
|
||||
}, 800);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -1,22 +1,128 @@
|
||||
|
||||
var conf_editor = null;
|
||||
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;
|
||||
|
||||
$(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);
|
||||
|
||||
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")));
|
||||
|
||||
$('#btn_submit').off().on('click',function() {
|
||||
requestWriteConfig(conf_editor.getValue());
|
||||
//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());
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
|
||||
$(document).ready( function() {
|
||||
performTranslation();
|
||||
requestServerConfigSchema();
|
||||
});
|
||||
|
||||
|
@ -1,29 +1,84 @@
|
||||
|
||||
function updateInputSelect()
|
||||
{
|
||||
{
|
||||
$('#sstbody').html("");
|
||||
var data = "";
|
||||
var prios = parsedServerInfoJSON.info.priorities
|
||||
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;
|
||||
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_type = "success";
|
||||
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_colors_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(duration)
|
||||
owner += '<br/><span style="font-size:80%; color:grey;">'+$.i18n('remote_input_duration')+' '+duration.toFixed(0)+$.i18n('edt_append_s')+'</span>';
|
||||
|
||||
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/>';
|
||||
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));
|
||||
}
|
||||
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);
|
||||
var btn_auto_color = (parsedServerInfoJSON.info.priorities_autoselect? "btn-success" : "btn-danger");
|
||||
var btn_auto_state = (parsedServerInfoJSON.info.priorities_autoselect? "disabled" : "enabled");
|
||||
var btn_auto_text = (parsedServerInfoJSON.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()
|
||||
{
|
||||
mappingList = ["multicolor_mean", "unicolor_mean"];
|
||||
mapping = parsedServerInfoJSON.info.ledMAppingType;
|
||||
|
||||
$('#mappingsbutton').html("");
|
||||
for(var ix = 0; ix < mappingList.length; ix++)
|
||||
{
|
||||
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-lg '+btn_style+'" style="margin:10px;min-width:200px" onclick="requestMappingType(\''+mappingList[ix]+'\');">'+$.i18n('remote_maptype_label_'+mappingList[ix])+'</button><br/>');
|
||||
}
|
||||
}
|
||||
|
||||
function updateComponents(event) {
|
||||
if ($('#componentsbutton').length == 0)
|
||||
@ -33,12 +88,12 @@
|
||||
else
|
||||
{
|
||||
updateInputSelect();
|
||||
updateLedMapping();
|
||||
components = event.response.info.components;
|
||||
// create buttons
|
||||
$('#componentsbutton').html("");
|
||||
for ( idx=0; idx<components.length;idx++)
|
||||
{
|
||||
//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;
|
||||
@ -49,7 +104,7 @@
|
||||
{
|
||||
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>';
|
||||
+')"><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
|
||||
@ -82,27 +137,23 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
performTranslation();
|
||||
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));
|
||||
|
||||
// color
|
||||
$(function() {
|
||||
$('#cp2').colorpicker({
|
||||
format: 'rgb',
|
||||
|
||||
colorSelectors: {
|
||||
'default': '#777777',
|
||||
'primary': '#337ab7',
|
||||
'success': '#5cb85c',
|
||||
'info' : '#5bc0de',
|
||||
'warning': '#f0ad4e',
|
||||
'danger' : '#d9534f'
|
||||
},
|
||||
customClass: 'colorpicker-2x',
|
||||
color: '#B500FF',
|
||||
sliders: {
|
||||
saturation: {
|
||||
maxLeft: 200,
|
||||
|
30
assets/webconfig/js/content_webconfig.js
Normal file
30
assets/webconfig/js/content_webconfig.js
Normal file
@ -0,0 +1,30 @@
|
||||
|
||||
var conf_editor = null;
|
||||
$(hyperion).one("cmd-config-getschema", function(event) {
|
||||
schema = parsedConfSchemaJSON.properties;
|
||||
|
||||
$('#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());
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
$(document).ready( function() {
|
||||
performTranslation();
|
||||
requestServerConfigSchema();
|
||||
});
|
||||
|
@ -1,27 +1,7 @@
|
||||
|
||||
/**
|
||||
* 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 = true;
|
||||
var currentVersion;
|
||||
var cleanCurrentVersion;
|
||||
var latestVersion;
|
||||
@ -35,27 +15,54 @@ 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()
|
||||
{
|
||||
@ -138,95 +145,153 @@ 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)
|
||||
parsedConfJSON = config;
|
||||
else
|
||||
{
|
||||
jQuery.each(config, function(i, val) {
|
||||
parsedConfJSON[i] = val;
|
||||
});
|
||||
}
|
||||
|
||||
var config_str = escape(encode_utf8(JSON.stringify(parsedConfJSON)));
|
||||
|
||||
$.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+'"');
|
||||
}
|
||||
|
||||
|
141
assets/webconfig/js/ledsim.js
Normal file
141
assets/webconfig/js/ledsim.js
Normal file
@ -0,0 +1,141 @@
|
||||
$(document).ready(function() {
|
||||
var modalOpened = false;
|
||||
var ledsim_width = 540;
|
||||
var ledsim_height = 489;
|
||||
var dialog;
|
||||
var leds;
|
||||
|
||||
$(hyperion).one("cmd-config-getconfig",function(event){
|
||||
leds = event.response.result.leds;
|
||||
|
||||
if(storageComp() && 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) {
|
||||
updateLedLayout();
|
||||
modalOpened = true;
|
||||
requestLedColorsStart();
|
||||
|
||||
if($('#leds_toggle_live_video').hasClass('btn-success'))
|
||||
requestLedImageStart();
|
||||
},
|
||||
closed: function (e) {
|
||||
modalOpened = false;
|
||||
},
|
||||
resizeStop: function (e) {
|
||||
if(storageComp())
|
||||
{
|
||||
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();
|
||||
});
|
||||
});
|
1
assets/webconfig/js/lib/dialog.min.js
vendored
Normal file
1
assets/webconfig/js/lib/dialog.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
2
assets/webconfig/js/lib/download.min.js
vendored
Normal file
2
assets/webconfig/js/lib/download.min.js
vendored
Normal 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}});
|
1
assets/webconfig/js/lib/draggable.min.js
vendored
Normal file
1
assets/webconfig/js/lib/draggable.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
675
assets/webconfig/js/lib/jquery-lang.js
vendored
675
assets/webconfig/js/lib/jquery-lang.js
vendored
@ -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;
|
||||
})();
|
13
assets/webconfig/js/lib/jquery-ui.min.js
vendored
13
assets/webconfig/js/lib/jquery-ui.min.js
vendored
File diff suppressed because one or more lines are too long
168
assets/webconfig/js/lib/jquery.i18n.emitter.js
Normal file
168
assets/webconfig/js/lib/jquery.i18n.emitter.js
Normal 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 ) );
|
186
assets/webconfig/js/lib/jquery.i18n.fallbacks.js
Normal file
186
assets/webconfig/js/lib/jquery.i18n.fallbacks.js
Normal 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 ) );
|
287
assets/webconfig/js/lib/jquery.i18n.js
Normal file
287
assets/webconfig/js/lib/jquery.i18n.js
Normal 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 ) );
|
472
assets/webconfig/js/lib/jquery.i18n.language.js
Normal file
472
assets/webconfig/js/lib/jquery.i18n.language.js
Normal 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 ) );
|
125
assets/webconfig/js/lib/jquery.i18n.messagestore.js
Normal file
125
assets/webconfig/js/lib/jquery.i18n.messagestore.js
Normal 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 ) );
|
309
assets/webconfig/js/lib/jquery.i18n.parser.js
Normal file
309
assets/webconfig/js/lib/jquery.i18n.parser.js
Normal 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 ) );
|
@ -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
121
assets/webconfig/js/settings.js
Normal file
121
assets/webconfig/js/settings.js
Normal file
@ -0,0 +1,121 @@
|
||||
var storedAccess;
|
||||
var storedLang;
|
||||
var availLang = ['en','de'];
|
||||
var availAccess = ['default','advanced','expert'];
|
||||
//$.i18n.debug = true;
|
||||
|
||||
$(document).ready( function() {
|
||||
|
||||
//i18n
|
||||
function initTrans(lc){
|
||||
if (lc == 'auto')
|
||||
{
|
||||
$.i18n().load().done(
|
||||
function() {
|
||||
performTranslation();
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
$.i18n().locale = lc;
|
||||
$.i18n().load( "i18n", lc ).done(
|
||||
function() {
|
||||
performTranslation();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (storageComp())
|
||||
{
|
||||
storedLang = getStorage("langcode");
|
||||
if (storedLang == null)
|
||||
{
|
||||
setStorage("langcode", 'auto')
|
||||
storedLang = 'auto';
|
||||
initTrans(storedLang);
|
||||
}
|
||||
else
|
||||
{
|
||||
initTrans(storedLang);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
showInfoDialog('warning', "Can't store settings", "Your browser doesn't support localStorage. You can't save a specific language setting (fallback to 'auto detection') and access level (fallback to 'default'). Some wizards may be hidden. You could still use the webinterface without further issues");
|
||||
initTrans('auto');
|
||||
storedLang = 'auto';
|
||||
storedAccess = "default";
|
||||
$('#btn_setlang').toggle();
|
||||
$('#btn_setaccess').toggle();
|
||||
}
|
||||
|
||||
$('#btn_setlang').off().on('click',function() {
|
||||
var newLang;
|
||||
showInfoDialog('select', $.i18n('InfoDialog_lang_title'), $.i18n('InfoDialog_lang_text'));
|
||||
|
||||
for (var lcx = 0; lcx<availLang.length; lcx++)
|
||||
{
|
||||
$('#id_select').append(createSelOpt(availLang[lcx], $.i18n('general_speech_'+availLang[lcx])))
|
||||
}
|
||||
|
||||
if (storedLang != "auto")
|
||||
$('#id_select').val(storedLang);
|
||||
|
||||
$('#id_select').off().on('change',function() {
|
||||
newLang = $('#id_select').val();
|
||||
if (newLang == storedLang)
|
||||
$('#id_btn_saveset').attr('disabled', true);
|
||||
else
|
||||
$('#id_btn_saveset').attr('disabled', false);
|
||||
});
|
||||
|
||||
$('#id_btn_saveset').off().on('click',function() {
|
||||
setStorage("langcode", newLang);
|
||||
reload();
|
||||
});
|
||||
|
||||
$('#id_select').trigger('change');
|
||||
});
|
||||
|
||||
//access
|
||||
if (storageComp())
|
||||
{
|
||||
storedAccess = getStorage("accesslevel");
|
||||
if (storedAccess == null)
|
||||
{
|
||||
setStorage("accesslevel", "default");
|
||||
storedAccess = "default";
|
||||
}
|
||||
}
|
||||
|
||||
$('#btn_setaccess').off().on('click',function() {
|
||||
var newAccess;
|
||||
showInfoDialog('select', $.i18n('InfoDialog_access_title'), $.i18n('InfoDialog_access_text'));
|
||||
|
||||
for (var lcx = 0; lcx<availAccess.length; lcx++)
|
||||
{
|
||||
$('#id_select').append(createSelOpt(availAccess[lcx], $.i18n('general_access_'+availAccess[lcx])));
|
||||
}
|
||||
|
||||
$('#id_select').val(storedAccess);
|
||||
|
||||
$('#id_select').off().on('change',function() {
|
||||
newAccess = $('#id_select').val();
|
||||
if (newAccess == storedAccess)
|
||||
$('#id_btn_saveset').attr('disabled', true);
|
||||
else
|
||||
$('#id_btn_saveset').attr('disabled', false);
|
||||
});
|
||||
|
||||
$('#id_btn_saveset').off().on('click',function() {
|
||||
setStorage("accesslevel", newAccess);
|
||||
reload();
|
||||
});
|
||||
|
||||
$('#id_select').trigger('change');
|
||||
});
|
||||
|
||||
//hide menu elements
|
||||
if (storedAccess != 'expert')
|
||||
$('#load_webconfig').toggle(false);
|
||||
});
|
@ -1,3 +1,33 @@
|
||||
function reload()
|
||||
{
|
||||
location.reload();
|
||||
}
|
||||
|
||||
function storageComp()
|
||||
{
|
||||
if (typeof(Storage) !== "undefined")
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
function getStorage(item)
|
||||
{
|
||||
return localStorage.getItem(item);
|
||||
}
|
||||
|
||||
function setStorage(item, value)
|
||||
{
|
||||
localStorage.setItem(item, value);
|
||||
return true;
|
||||
}
|
||||
|
||||
function debugMessage(msg)
|
||||
{
|
||||
if (debugMessagesActive)
|
||||
{
|
||||
console.log(msg);
|
||||
}
|
||||
}
|
||||
|
||||
function bindNavToContent(containerId, fileName, loadNow)
|
||||
{
|
||||
@ -16,8 +46,6 @@ function loadContentTo(containerId, fileName)
|
||||
$(containerId).load("/content/"+fileName+".html");
|
||||
}
|
||||
|
||||
|
||||
|
||||
function toggleClass(obj,class1,class2)
|
||||
{
|
||||
if ( $(obj).hasClass(class1))
|
||||
@ -48,24 +76,51 @@ function setClassByBool(obj,enable,class1,class2)
|
||||
}
|
||||
|
||||
function showInfoDialog(type,header,message)
|
||||
{
|
||||
$('#modal_dialog .modal-bodytitle').html(header);
|
||||
$('#modal_dialog .modal-bodycontent').html(message);
|
||||
|
||||
{
|
||||
if (type=="success"){
|
||||
$('#modal_dialog .modal-bodyicon').html('<i class="fa fa-check modal-icon-check">');
|
||||
$('#modal_dialog .modal-footer-button').html('<button type="button" class="btn btn-success" data-dismiss="modal">OK</button>');
|
||||
$('#id_body').html('<i style="margin-bottom:20px" class="fa fa-check modal-icon-check">');
|
||||
if(header == "")
|
||||
$('#id_body').append('<h4 style="font-weight:bold;text-transform:uppercase;">'+$.i18n('infoDialog_general_success_title')+'</h4>');
|
||||
$('#id_footer').html('<button type="button" class="btn btn-success" data-dismiss="modal">'+$.i18n('general_btn_ok')+'</button>');
|
||||
}
|
||||
else if (type=="warning"){
|
||||
$('#modal_dialog .modal-bodyicon').html('<i class="fa fa-warning modal-icon-warning">');
|
||||
$('#modal_dialog .modal-footer-button').html('<button type="button" class="btn btn-warning" data-dismiss="modal">OK</button>');
|
||||
$('#id_body').html('<i style="margin-bottom:20px" class="fa fa-warning modal-icon-warning">');
|
||||
if(header == "")
|
||||
$('#id_body').append('<h4 style="font-weight:bold;text-transform:uppercase;">'+$.i18n('infoDialog_general_warning_title')+'</h4>');
|
||||
$('#id_footer').html('<button type="button" class="btn btn-warning" data-dismiss="modal">'+$.i18n('general_btn_ok')+'</button>');
|
||||
}
|
||||
else if (type=="error"){
|
||||
$('#modal_dialog .modal-bodyicon').html('<i class="fa fa-warning modal-icon-error">');
|
||||
$('#modal_dialog .modal-footer-button').html('<button type="button" class="btn btn-danger" data-dismiss="modal">OK</button>');
|
||||
$('#id_body').html('<i style="margin-bottom:20px" class="fa fa-warning modal-icon-error">');
|
||||
if(header == "")
|
||||
$('#id_body').append('<h4 style="font-weight:bold;text-transform:uppercase;">'+$.i18n('infoDialog_general_error_title')+'</h4>');
|
||||
$('#id_footer').html('<button type="button" class="btn btn-danger" data-dismiss="modal">'+$.i18n('general_btn_ok')+'</button>');
|
||||
}
|
||||
$('#modal_dialog').modal('show');
|
||||
else if (type == "select"){
|
||||
$('#id_body').html('<img style="margin-bottom:20px" src="img/hyperion/hyperionlogo.png" alt="Redefine ambient light!">');
|
||||
$('#id_footer').html('<button type="button" id="id_btn_saveset" class="btn btn-success" data-dismiss="modal"><i class="fa fa-fw fa-save"></i>'+$.i18n('general_btn_saveandreload')+'</button>');
|
||||
$('#id_footer').append('<button type="button" class="btn btn-danger" data-dismiss="modal"><i class="fa fa-fw fa-close"></i>'+$.i18n('general_btn_cancel')+'</button>');
|
||||
}
|
||||
else if (type == "uilock"){
|
||||
$('#id_body').html('<img src="img/hyperion/hyperionlogo.png" alt="Redefine ambient light!">');
|
||||
$('#id_footer').html('<b>'+$.i18n('InfoDialog_nowrite_foottext')+'</b>');
|
||||
}
|
||||
else if (type == "import"){
|
||||
$('#id_body').html('<i style="margin-bottom:20px" class="fa fa-warning modal-icon-warning">');
|
||||
$('#id_footer').html('<button type="button" id="id_btn_import" class="btn btn-warning" data-dismiss="modal"><i class="fa fa-fw fa-save"></i>'+$.i18n('general_btn_saverestart')+'</button>');
|
||||
$('#id_footer').append('<button type="button" class="btn btn-danger" data-dismiss="modal"><i class="fa fa-fw fa-close"></i>'+$.i18n('general_btn_cancel')+'</button>');
|
||||
}
|
||||
|
||||
$('#id_body').append('<h4 style="font-weight:bold;text-transform:uppercase;">'+header+'</h4>');
|
||||
$('#id_body').append(message);
|
||||
|
||||
if(type == "select")
|
||||
$('#id_body').append('<select id="id_select" class="form-control" style="margin-top:10px;width:auto;"></select>');
|
||||
|
||||
$("#modal_dialog").modal({
|
||||
backdrop : "static",
|
||||
keyboard: false,
|
||||
show: true
|
||||
});
|
||||
}
|
||||
|
||||
function isJsonString(str)
|
||||
@ -81,12 +136,11 @@ function isJsonString(str)
|
||||
return "";
|
||||
}
|
||||
|
||||
|
||||
function createJsonEditor(container,schema,setconfig)
|
||||
function createJsonEditor(container,schema,setconfig,usePanel)
|
||||
{
|
||||
$('#'+container).off();
|
||||
$('#'+container).html("");
|
||||
|
||||
|
||||
var editor = new JSONEditor(document.getElementById(container),
|
||||
{
|
||||
theme: 'bootstrap3',
|
||||
@ -97,17 +151,21 @@ function createJsonEditor(container,schema,setconfig)
|
||||
disable_properties: 'true',
|
||||
disable_array_reorder: 'true',
|
||||
no_additional_properties: 'true',
|
||||
disable_array_delete_all_rows: 'true',
|
||||
disable_array_delete_last_row: 'true',
|
||||
access: storedAccess,
|
||||
schema: {
|
||||
title:'',
|
||||
properties: schema
|
||||
}
|
||||
});
|
||||
|
||||
$('#editor_container .well').css("background-color","white");
|
||||
$('#editor_container .well').css("border","none");
|
||||
$('#editor_container .well').css("box-shadow","none");
|
||||
$('#editor_container .btn').addClass("btn-primary");
|
||||
$('#editor_container h3').first().remove();
|
||||
|
||||
if(usePanel)
|
||||
{
|
||||
$('#'+container+' .well').first().removeClass('well well-sm');
|
||||
$('#'+container+' h3').remove();
|
||||
$('#'+container+' .well').first().removeClass('well well-sm');
|
||||
}
|
||||
|
||||
if (setconfig)
|
||||
{
|
||||
@ -120,26 +178,191 @@ function createJsonEditor(container,schema,setconfig)
|
||||
return editor;
|
||||
}
|
||||
|
||||
function createSelGroup(group){
|
||||
var el = document.createElement('optgroup');
|
||||
el.setAttribute('label', group);
|
||||
return el
|
||||
}
|
||||
|
||||
function createSelOpt(opt){
|
||||
var el = document.createElement('option');
|
||||
el.setAttribute('value', opt);
|
||||
el.innerHTML = opt;
|
||||
return el
|
||||
// Creates a table with thead and tbody ids
|
||||
// @param string hid : a id for thead
|
||||
// @param string bid : a id for tbody
|
||||
// @param string cont : a container id to html() the table
|
||||
function createTable(hid, bid, cont)
|
||||
{
|
||||
var table = document.createElement('table');
|
||||
var thead = document.createElement('thead');
|
||||
var tbody = document.createElement('tbody');
|
||||
|
||||
table.className = "table";
|
||||
table.style.marginBottom = "0px";
|
||||
thead.setAttribute("id", hid);
|
||||
tbody.setAttribute("id", bid);
|
||||
|
||||
table.appendChild(thead);
|
||||
table.appendChild(tbody);
|
||||
|
||||
$('#'+cont).html(table);
|
||||
}
|
||||
|
||||
function createSel(array, group){
|
||||
if (array.length != "0"){
|
||||
var el = createSelGroup(group);
|
||||
for(var i=0; i<array.length; i++){
|
||||
// Creates a table row <tr>
|
||||
// @param array list :innerHTML content for <td>/<th>
|
||||
// @param bool head :if null or false it's body
|
||||
// @param bool align :if null or false no alignment
|
||||
//
|
||||
// @return : <tr> with <td> or <th> as child(s)
|
||||
function createTableRow(list, head, align)
|
||||
{
|
||||
var row = document.createElement('tr');
|
||||
|
||||
for(var i = 0; i < list.length; i++)
|
||||
{
|
||||
if(head === true)
|
||||
var el = document.createElement('th');
|
||||
else
|
||||
var el = document.createElement('td');
|
||||
|
||||
if(align)
|
||||
el.style.verticalAlign = "middle";
|
||||
|
||||
el.innerHTML = list[i];
|
||||
row.appendChild(el);
|
||||
}
|
||||
return row;
|
||||
}
|
||||
|
||||
function createRow(id)
|
||||
{
|
||||
var el = document.createElement('div');
|
||||
el.className = "row";
|
||||
el.setAttribute('id', id);
|
||||
return el;
|
||||
}
|
||||
|
||||
function createOptPanel(phicon, phead, bodyid, footerid)
|
||||
{
|
||||
phead = '<i class="fa '+phicon+' fa-fw"></i>'+phead;
|
||||
pfooter = document.createElement('button');
|
||||
pfooter.className = "btn btn-success";
|
||||
pfooter.setAttribute("id", footerid);
|
||||
pfooter.innerHTML = '<i class="fa fa-fw fa-save"></i>'+$.i18n('general_button_savesettings');
|
||||
|
||||
return createPanel(phead, "", pfooter, "panel-default", bodyid);
|
||||
}
|
||||
|
||||
function createHelpTable(list, phead){
|
||||
var table = document.createElement('table');
|
||||
var thead = document.createElement('thead');
|
||||
var tbody = document.createElement('tbody');
|
||||
//console.log(sortProperties(list));
|
||||
|
||||
phead = '<i class="fa fa-fw fa-info-circle"></i>'+phead+' '+$.i18n("conf_helptable_expl");
|
||||
|
||||
table.className = 'table table-hover borderless';
|
||||
|
||||
thead.appendChild(createTableRow([$.i18n('conf_helptable_option'), $.i18n('conf_helptable_expl')], true, false));
|
||||
for (key in list)
|
||||
{
|
||||
if(list[key].access != 'system')
|
||||
{
|
||||
var text = list[key].title.replace('title', 'expl');
|
||||
tbody.appendChild(createTableRow([$.i18n(list[key].title), $.i18n(text)], false, false));
|
||||
|
||||
if(list[key].items && list[key].items.properties)
|
||||
{
|
||||
var ilist = list[key].items.properties;
|
||||
for (ikey in ilist)
|
||||
{
|
||||
|
||||
var itext = ilist[ikey].title.replace('title', 'expl');
|
||||
tbody.appendChild(createTableRow([$.i18n(ilist[ikey].title), $.i18n(itext)], false, false));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
table.appendChild(thead);
|
||||
table.appendChild(tbody);
|
||||
|
||||
return createPanel(phead, table);
|
||||
}
|
||||
|
||||
function createPanel(head, body, footer, type, bodyid){
|
||||
var cont = document.createElement('div');
|
||||
var p = document.createElement('div');
|
||||
var phead = document.createElement('div');
|
||||
var pbody = document.createElement('div');
|
||||
var pfooter = document.createElement('div');
|
||||
|
||||
cont.className = "col-lg-6";
|
||||
|
||||
if(typeof type == 'undefined')
|
||||
type = 'panel-default';
|
||||
|
||||
p.className = 'panel '+type;
|
||||
phead.className = 'panel-heading';
|
||||
pbody.className = 'panel-body';
|
||||
pfooter.className = 'panel-footer';
|
||||
|
||||
phead.innerHTML = head;
|
||||
|
||||
if(typeof bodyid != 'undefined')
|
||||
{
|
||||
pfooter.style.textAlign = 'right';
|
||||
pbody.setAttribute("id", bodyid)
|
||||
}
|
||||
|
||||
if(typeof body != 'undefined' && body != "")
|
||||
pbody.appendChild(body);
|
||||
|
||||
if(typeof footer != 'undefined')
|
||||
pfooter.appendChild(footer);
|
||||
|
||||
p.appendChild(phead);
|
||||
p.appendChild(pbody);
|
||||
|
||||
if(typeof footer != 'undefined')
|
||||
{
|
||||
pfooter.style.textAlign = "right";
|
||||
p.appendChild(pfooter);
|
||||
}
|
||||
|
||||
cont.appendChild(p);
|
||||
|
||||
return cont;
|
||||
}
|
||||
|
||||
function createSelGroup(group)
|
||||
{
|
||||
var el = document.createElement('optgroup');
|
||||
el.setAttribute('label', group);
|
||||
return el;
|
||||
}
|
||||
|
||||
function createSelOpt(opt, title)
|
||||
{
|
||||
var el = document.createElement('option');
|
||||
el.setAttribute('value', opt);
|
||||
if (typeof title == 'undefined')
|
||||
el.innerHTML = opt;
|
||||
else
|
||||
el.innerHTML = title;
|
||||
return el;
|
||||
}
|
||||
|
||||
function createSel(array, group)
|
||||
{
|
||||
if (array.length != "0")
|
||||
{
|
||||
var el = createSelGroup(group);
|
||||
for(var i=0; i<array.length; i++)
|
||||
{
|
||||
var opt = createSelOpt(array[i])
|
||||
el.appendChild(opt);
|
||||
}
|
||||
return el;
|
||||
return el;
|
||||
}
|
||||
}
|
||||
|
||||
function performTranslation()
|
||||
{
|
||||
$('[data-i18n]').i18n();
|
||||
}
|
||||
|
||||
function encode_utf8(s)
|
||||
{
|
||||
return unescape(encodeURIComponent(s));
|
||||
}
|
||||
|
150
assets/webconfig/js/wizard.js
Normal file
150
assets/webconfig/js/wizard.js
Normal file
@ -0,0 +1,150 @@
|
||||
$(document).ready( function() {
|
||||
//clear priority if people reload the page or lost connection while a wizard was active
|
||||
$(hyperion).one("cmd-config-getschema", function(event) {
|
||||
if(getStorage("wizardactive") === 'true')
|
||||
requestPriorityClear();
|
||||
setStorage("wizardactive", false);
|
||||
});
|
||||
|
||||
function resetWizard()
|
||||
{
|
||||
$("#wizard_modal").modal('hide');
|
||||
clearInterval(colorIntveralId);
|
||||
requestPriorityClear();
|
||||
setStorage("wizardactive", false);
|
||||
$('#wizp1').toggle(true);
|
||||
$('#wizp2').toggle(false);
|
||||
}
|
||||
|
||||
//rgb byte order wizard
|
||||
var colorIntveralId;
|
||||
var new_rgb_order;
|
||||
|
||||
function changeColor()
|
||||
{
|
||||
var color = $("#wiz_canv_color").css('background-color');
|
||||
|
||||
if (color == 'rgb(255, 0, 0)')
|
||||
{
|
||||
$("#wiz_canv_color").css('background-color','rgb(0, 255, 0)');
|
||||
requestSetColor('0','255','0');
|
||||
}
|
||||
else
|
||||
{
|
||||
$("#wiz_canv_color").css('background-color','rgb(255, 0, 0)');
|
||||
requestSetColor('255','0','0');
|
||||
}
|
||||
}
|
||||
|
||||
function startWizardRGB()
|
||||
{
|
||||
//create html
|
||||
$('#wiz_header').html('<i class="fa fa-magic fa-fw"></i>'+$.i18n('wiz_rgb_title'));
|
||||
$('#wizp1_body').html('<img src="img/hyperion/hyperionlogo.png" alt="Redefine ambient light!" style="margin-bottom:20px"><h4 style="font-weight:bold;text-transform:uppercase;">'+$.i18n('wiz_rgb_title')+'</h4><p>'+$.i18n('wiz_rgb_intro1')+'</p><p style="font-weight:bold;">'+$.i18n('wiz_rgb_intro2')+'</p>');
|
||||
$('#wizp1_footer').html('<button type="button" class="btn btn-primary" id="btn_wiz_cont"><i class="fa fa-fw fa-check"></i>'+$.i18n('general_btn_continue')+'</button><button type="button" class="btn btn-danger" data-dismiss="modal"><i class="fa fa-fw fa-close"></i>'+$.i18n('general_btn_cancel')+'</button>');
|
||||
$('#wizp2_body').html('<img src="img/hyperion/hyperionlogo.png" alt="Redefine ambient light!" style="margin-bottom:20px"><p style="font-weight:bold">'+$.i18n('wiz_rgb_expl')+'</p>');
|
||||
$('#wizp2_body').append('<div class="form-group"><label>'+$.i18n('wiz_rgb_switchevery')+'</label><div class="input-group" style="width:100px"><select id="wiz_switchtime_select" class="form-control"></select><div class="input-group-addon">'+$.i18n('edt_append_s')+'</div></div></div>');
|
||||
$('#wizp2_body').append('<canvas id="wiz_canv_color" width="100" height="100" style="border-radius:60px;background-color:red; display:block; margin: 10px 0;border:4px solid grey;"></canvas><label>'+$.i18n('wiz_rgb_q')+'</label>');
|
||||
$('#wizp2_body').append('<table class="table borderless" style="width:200px"><tbody><tr><td class="ltd"><label>'+$.i18n('wiz_rgb_qrend')+'</label></td><td class="itd"><select id="wiz_r_select" class="form-control wselect"></select></td></tr><tr><td class="ltd"><label>'+$.i18n('wiz_rgb_qgend')+'</label></td><td class="itd"><select id="wiz_g_select" class="form-control wselect"></select></td></tr></tbody></table>');
|
||||
$('#wizp2_footer').html('<button type="button" class="btn btn-success" id="btn_wiz_save"><i class="fa fa-fw fa-save"></i>'+$.i18n('general_btn_saverestart')+'</button><button type="button" class="btn btn-primary" id="btn_wiz_checkok" style="display:none" data-dismiss="modal"><i class="fa fa-fw fa-check"></i>'+$.i18n('general_btn_ok')+'</button><button type="button" class="btn btn-danger" id="btn_wiz_abort"><i class="fa fa-fw fa-close"></i>'+$.i18n('general_btn_cancel')+'</button>')
|
||||
|
||||
//open modal
|
||||
$("#wizard_modal").modal({
|
||||
backdrop : "static",
|
||||
keyboard: false,
|
||||
show: true
|
||||
});
|
||||
|
||||
//listen for continue
|
||||
$('#btn_wiz_cont').off().on('click',function() {
|
||||
beginWizardRGB();
|
||||
$('#wizp1').toggle(false);
|
||||
$('#wizp2').toggle(true);
|
||||
});
|
||||
}
|
||||
|
||||
function beginWizardRGB()
|
||||
{
|
||||
$("#wiz_switchtime_select").off().on('change',function() {
|
||||
clearInterval(colorIntveralId);
|
||||
var time = $("#wiz_switchtime_select").val();
|
||||
colorIntveralId = setInterval(function() { changeColor(); }, time*1000);
|
||||
});
|
||||
|
||||
$('.wselect').change(function () {
|
||||
var rgb_order = order = parsedConfJSON.device.colorOrder.split("");
|
||||
var redS = $("#wiz_r_select").val();
|
||||
var greenS = $("#wiz_g_select").val();
|
||||
|
||||
for (var i = 0; i<order.length; i++)
|
||||
{
|
||||
if (redS == order[i])
|
||||
$('#wiz_g_select option[value='+order[i]+']').attr('disabled',true);
|
||||
else
|
||||
$('#wiz_g_select option[value='+order[i]+']').attr('disabled',false);
|
||||
if (greenS == order[i])
|
||||
$('#wiz_r_select option[value='+order[i]+']').attr('disabled',true);
|
||||
else
|
||||
$('#wiz_r_select option[value='+order[i]+']').attr('disabled',false);
|
||||
}
|
||||
|
||||
if(redS != 'null' && greenS != 'null')
|
||||
{
|
||||
$('#btn_wiz_save').attr('disabled',false);
|
||||
var blueS = parsedConfJSON.device.colorOrder.replace(redS, "").replace(greenS, "");
|
||||
|
||||
rgb_order[0] = redS;
|
||||
rgb_order[1] = greenS;
|
||||
rgb_order[2] = blueS;
|
||||
rgb_order = rgb_order.toString().replace(/,/g,"");
|
||||
|
||||
if(redS == "r" && greenS == "g")
|
||||
{
|
||||
$('#btn_wiz_save').toggle(false);
|
||||
$('#btn_wiz_checkok').toggle(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
$('#btn_wiz_save').toggle(true);
|
||||
$('#btn_wiz_checkok').toggle(false);
|
||||
}
|
||||
new_rgb_order = rgb_order
|
||||
}
|
||||
else
|
||||
$('#btn_wiz_save').attr('disabled',true);
|
||||
});
|
||||
|
||||
$("#wiz_switchtime_select").append(createSelOpt('5','5'),createSelOpt('10','10'),createSelOpt('15','15'),createSelOpt('30','30'));
|
||||
$("#wiz_switchtime_select").trigger('change');
|
||||
|
||||
$("#wiz_r_select").append(createSelOpt("null", ""),createSelOpt('r', $.i18n('general_col_red')),createSelOpt('g', $.i18n('general_col_green')),createSelOpt('b', $.i18n('general_col_blue')));
|
||||
$("#wiz_g_select").html($("#wiz_r_select").html());
|
||||
$("#wiz_r_select").trigger('change');
|
||||
|
||||
requestSetColor('255','0','0');
|
||||
setTimeout(requestSetSource, 100, 'auto');
|
||||
setStorage("wizardactive", true);
|
||||
|
||||
$('#btn_wiz_abort').off().on('click',function() {
|
||||
resetWizard()
|
||||
});
|
||||
|
||||
$('#btn_wiz_checkok').off().on('click',function() {
|
||||
showInfoDialog('success', "", $.i18n('infoDialog_wizrgb_text'));
|
||||
resetWizard();
|
||||
});
|
||||
|
||||
$('#btn_wiz_save').off().on('click',function() {
|
||||
resetWizard();
|
||||
var devConf = parsedConfJSON.device;
|
||||
devConf.colorOrder = new_rgb_order;
|
||||
requestWriteConfig(devConf);
|
||||
setTimeout(initRestart, 100);
|
||||
});
|
||||
}
|
||||
|
||||
$('#btn_wizard_byteorder').off().on('click',function() {
|
||||
startWizardRGB();
|
||||
});
|
||||
|
||||
});
|
@ -1,167 +0,0 @@
|
||||
{
|
||||
"token": {
|
||||
"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_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_button_savesettings" : "Einstellungen speichern",
|
||||
"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" : "Informationen",
|
||||
"dashboard_infobox_label_currenthyp" : "Deine Hyperion Version:",
|
||||
"dashboard_infobox_label_latesthyp" : "Aktuellste Hyperion Version:",
|
||||
"dashboard_infobox_label_leddevice" : "LED Typ:",
|
||||
"dashboard_infobox_label_device" : "Systeminformation:",
|
||||
"dashboard_infobox_message_updatewarning" : "Eine aktuellere Version von Hyperion ist verfügbar!",
|
||||
"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.",
|
||||
"dashboard_alert_button_restarthyerion" : "Hyperion neustarten",
|
||||
"main_menu_dashboard_token" : "Dashboard",
|
||||
"main_menu_configuration_token" : "Konfiguration",
|
||||
"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",
|
||||
"conf_effects_label_intro" : "Stelle einen Effekt oder Farbe ein, der beim Starten sichtbar sein soll. Stelle einen Hintergrundeffekt/Farbe ein der erst sichtbar wird, wenn alle Bildquellen abgeschaltet sind (Das gilt ebenfalls für temporäres abschalten mithilfe der Kodi Überwachung).",
|
||||
"conf_leds_label_intro" : "Der LED Hardware bereich ermöglicht eine Vielzahl von Ausgabemöglichkeiten über Raspberry Pi GPIO, USB oder Netzwerk. Erstelle ein LED Layout das zu deinem Aufbau passt und schon kann es losgehen!",
|
||||
"conf_leds_nav_label_ledcontroller" : "LED Steuerung",
|
||||
"conf_leds_nav_label_ledlayout" : "LED Layout",
|
||||
"conf_leds_nav_label_ledtesting" : "LED Test",
|
||||
"conf_leds_contr_label_contrtype" : "Steuerungstyp:",
|
||||
"conf_leds_layout_frame" : "Klassisches Layout (Rahmen)",
|
||||
"conf_leds_layout_matrix" : "Matrix Layout (LED Wand)",
|
||||
"conf_leds_layout_generatedconf" : "Generierte/Aktuelle 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_empty" : "Es wurde keine Vorschau angefordert",
|
||||
"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 Konfiguartion",
|
||||
"conf_leds_layout_cl_edgegap" : "Rahmenabstand",
|
||||
"conf_leds_layout_cl_cornergap" : "Eckabstand",
|
||||
"conf_leds_layout_ma_horiz" : "Horizontal",
|
||||
"conf_leds_layout_ma_vert" : "Vertical",
|
||||
"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" : "Einpeisung",
|
||||
"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 oben erstellt hast. Optional kann man die Werte hier weiter bearbeiten.",
|
||||
"conf_leds_layout_textf2" : "Vergiss nicht zu speichern!",
|
||||
"conf_leds_test_button_toggleleds" : "LEDs",
|
||||
"conf_leds_test_button_togglelednumber" : "LED Nummerierung",
|
||||
"conf_leds_test_button_toggleliveleds" : "LED Echtzeitansicht",
|
||||
"conf_grabber_label_intro" : "Hyperion unterstützt 2 Hauptarten wie Bilder aufgenommen werden können. Zum Einen die Plattform Aufnahme, die sich direkt am System bedient auf dem Hyperion läuft (beste Qualität). Zum Anderen die USB Aufnahme, die sich an einem angeschlossenen Gerät bedient die benötigten Informationen für die Verarbeitung und Ausgabe zu erhalten (Mehr Konfigurationsaufwand und Kalibrierung)",
|
||||
"conf_colors_label_intro" : "Neben der Farbkalibrierung, gehört auch die Glättung (sanfte Farbübergänge) und die Erkennung von störenden (schwarzen) Balken zur Bildverarbeitung.",
|
||||
"conf_network_label_intro" : "Alle Einstellungen zu Ports, der Weiterleitung von JSON/PROTO und Boblight sowie UDP Listener.",
|
||||
"conf_kodi_label_title" : "Kodi Überwachung",
|
||||
"conf_kodi_label_intro" : "Die Kodi Überwachung ermöglicht es dir abhängig von dem 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.",
|
||||
"remote_label_intro" : "Die Fernbedienung ermöglicht dir während Hyperion läuft Farbe/Effekte zu starten/setzen, aber auch eine Quelle manuell festzulegen. Die Komponentensteuerung ermöglicht es dir gezielt Teile von Hyperion zu aktivieren/deaktivieren. Beachte, dass nach einem Neustart die hier durchgeführten Aktionen wieder zurückgesetzt werden.",
|
||||
"remote_colors_label_coloreffect" : "Farbe/Effekt:",
|
||||
"remote_colors_button_reset" : "Farbe/Effekt zurücksetzen",
|
||||
"remote_colors_label_color" : "Farbe:",
|
||||
"remote_effects_label_effects" : "Effekt:",
|
||||
"remote_input_label_sourceselection" : "Quellenauswahl",
|
||||
"remote_input_label_autoselect" : "Automatische Auswahl",
|
||||
"remote_components_label_components" : "Komponentensteuerung",
|
||||
|
||||
"remote_effects_intro" : "Die Effekt-Fernbedienung ermöglicht es dir Effekte zu starten für Demonstrations- oder Testzwecke. Vergessse nicht den Effekt wieder zu stoppen, wenn du fertig bist.",
|
||||
"remote_components_intro" : "Die Komponenten-Fenbedienung ermöglicht es dir Komponenten von Hyperion zu starten und stoppen. Beachte: Dies ist nur temporär und geht nach einem Neustart verloren. Möchtest du dauerhaft Komponenten aktivieren/deaktivieren benutze die Konfigurationsseiten.",
|
||||
|
||||
"hue_button_create_user_token" : "Benutzer anlegen",
|
||||
"hue_press_link_modal" : "Bitte Link Taste auf der Hue Bridge drücken.",
|
||||
"hue_failure_connection_token" : "Connection Timeout. Bitte drücke die Taste rechtzeitig.",
|
||||
"hue_button_pair" : "Verbinden",
|
||||
"hue_failure_ip_token" : "Bitte überprüfe deine IP Adresse.",
|
||||
"hue_label_username" : "Benutzername:",
|
||||
"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 Effekttest",
|
||||
"effectsconfigurator_button_stoptest" : "Stoppe Effekttest",
|
||||
"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 füge unsere Affiliate Links als Lesezeichen hinzu",
|
||||
"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",
|
||||
"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:",
|
||||
"info_conlost_label_title" : "Verbindung zum Hyperion Service unterbrochen!",
|
||||
"info_conlost_label_reason" : "Mögliche Ursachen:",
|
||||
"info_conlost_label_reason1" : "- Hyperion startet neu",
|
||||
"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"
|
||||
},
|
||||
"regex": [
|
||||
["^Something at start of text", ""],
|
||||
["This will be case insensitive", "i", ""]
|
||||
]
|
||||
}
|
@ -4,6 +4,7 @@ After=network.target
|
||||
|
||||
[Service]
|
||||
ExecStart=/usr/bin/hyperiond /etc/hyperion/hyperion.config.json
|
||||
WorkingDirectory=/usr/share/hyperion/bin
|
||||
TimeoutStopSec=5
|
||||
KillMode=mixed
|
||||
Restart=always
|
||||
|
@ -4,6 +4,16 @@
|
||||
|
||||
|
||||
{
|
||||
/// geenral Settings
|
||||
/// * 'name' : The user friendly name of the hyperion instance (used for network things)
|
||||
/// * 'showOptHelp' : Show option expanations at the webui. Highly recommended for beginners.
|
||||
/// * 'configVersion' : Don't touch! It's an internal value regarding which validation schema for this config is used.
|
||||
"general" :
|
||||
{
|
||||
"name" : "MyHyperionConfig",
|
||||
"showOptHelp" : true,
|
||||
"configVersion" : 2
|
||||
},
|
||||
/// set log level: silent warn verbose debug
|
||||
"logger" :
|
||||
{
|
||||
@ -16,99 +26,57 @@
|
||||
/// APA102, WS2801, P9813, LPD6803, LPD8806, ---------PWM---------, WS2812b (just RPi1), WS281X (RPi1, RPi2, RPi3), --------OTHER--------, PhilipsHUE, AtmoOrb, PiBlaster, Tinkerforge, FadeCandy, RawHID (USB), UDP, SEDU, TPM2, USBASP-WS2801, USBASP-WS2812, ------3rd PARTY------, Adalight, AdalightAPA102, Atmo, Lightpack, Multi-Lightpack, Paintpack, Test (file), None)
|
||||
/// * [device type specific configuration]
|
||||
/// * 'colorOrder' : The order of the color bytes ('rgb', 'rbg', 'bgr', etc.).
|
||||
/// * 'rewriteTime': in ms. Data is resend to leds, if no new data is available in thistime. 0 means no refresh
|
||||
"device" :
|
||||
{
|
||||
"name" : "MyHyperionConfig",
|
||||
"type" : "file",
|
||||
"output" : "/dev/null",
|
||||
"rate" : 1000000,
|
||||
"colorOrder" : "rgb"
|
||||
"colorOrder" : "rgb",
|
||||
"rewriteTime": 0
|
||||
},
|
||||
|
||||
/// Color manipulation configuration used to tune the output colors to specific surroundings.
|
||||
/// The configuration contains a list of color-transforms. Each transform contains the
|
||||
/// following fields:
|
||||
/// * 'imageToLedMappingType' : multicolor_mean - every led has it's own calculatedmean color
|
||||
/// unicolor_mean - every led has same color, color is the mean of whole image
|
||||
/// * 'channelAdjustment_enable' : true/false enables/disables this channelAdjustment section
|
||||
/// * 'channelAdjustment_v4l_only' : if enabled and set to true, then channelAdjustment is only for v4l devices
|
||||
/// * 'channelAdjustment'
|
||||
/// * 'id' : The unique identifier of the channel adjustments (eg 'device_1')
|
||||
/// * 'leds' : The indices (or index ranges) of the leds to which this channel adjustment applies
|
||||
/// (eg '0-5, 9, 11, 12-17'). The indices are zero based.
|
||||
/// * 'pureRed'/'pureGreen'/'pureBlue' : The manipulation in the Red-Green-Blue color domain with the
|
||||
/// following tuning parameters for each channel:
|
||||
/// * 'transform_enable' : true/false enables/disables this transform section
|
||||
/// * 'transform_v4l_only' : if enabled and set to true, then transform is only for v4l devices
|
||||
/// * 'transform'
|
||||
/// * 'id' : The unique identifier of the color transformation (eg 'device_1')
|
||||
/// * 'leds' : The indices (or index ranges) of the leds to which this color transform applies
|
||||
/// (eg '0-5, 9, 11, 12-17'). The indices are zero based.
|
||||
/// * 'hsv' : The manipulation in the Hue-Saturation-Value color domain with the following
|
||||
/// tuning parameters:
|
||||
/// - 'saturationGain' The gain adjustement of the saturation
|
||||
/// - 'luminanceGain' The gain adjustement of the luminance
|
||||
/// - 'luminanceMinimum' The minimum luminance (backlight)
|
||||
/// * 'red'/'green'/'blue' : The manipulation in the Red-Green-Blue color domain with the
|
||||
/// following tuning parameters for each channel:
|
||||
/// - 'threshold' The minimum required input value for the channel to be on
|
||||
/// (else zero)
|
||||
/// - 'gamma' The gamma-curve correction factor
|
||||
/// * 'id' : The unique identifier of the channel adjustments (eg 'device_1')
|
||||
/// * 'leds' : The indices (or index ranges) of the leds to which this channel adjustment applies
|
||||
/// (eg '0-5, 9, 11, 12-17'). The indices are zero based.
|
||||
/// * 'black'/'white'/'red'/'green'/'blue'/'cyan'/'magenta'/'yellow' : Array of RGB to adjust the output color
|
||||
/// * 'gammaRed'/'gammaGreen'/'gammaBlue' : Gamma value for each channel
|
||||
/// * 'id' : The unique identifier of the channel adjustments (eg 'device_1')
|
||||
/// * 'id' : The unique identifier of the channel adjustments (eg 'device_1')
|
||||
/// * 'brightnessMin' : Minimum brightness (backlight)
|
||||
/// * 'brightness' : Between 0.0-0.5 the brightness is linearized (white is as bright as red, is as bright as yellow).
|
||||
/// Between 0.5-1.0 the linearization reduces slowly until it's gone with 1.0 (white is 3x brighter than red, yellow is 2x brighter than red)
|
||||
"color" :
|
||||
{
|
||||
"imageToLedMappingType" : "multicolor_mean",
|
||||
"channelAdjustment_enable" : true,
|
||||
"channelAdjustment_v4l_only" : true,
|
||||
"channelAdjustment_v4l_only" : false,
|
||||
"channelAdjustment" :
|
||||
[
|
||||
{
|
||||
"id" : "default",
|
||||
"leds" : "*",
|
||||
"pureRed" :
|
||||
{
|
||||
"redChannel" : 255,
|
||||
"greenChannel" : 0,
|
||||
"blueChannel" : 0
|
||||
},
|
||||
"pureGreen" :
|
||||
{
|
||||
"redChannel" : 0,
|
||||
"greenChannel" : 255,
|
||||
"blueChannel" : 0
|
||||
},
|
||||
"pureBlue" :
|
||||
{
|
||||
"redChannel" : 0,
|
||||
"greenChannel" : 0,
|
||||
"blueChannel" : 255
|
||||
}
|
||||
}
|
||||
],
|
||||
"transform_enable" : true,
|
||||
"transform_v4l_only" : true,
|
||||
"transform" :
|
||||
[
|
||||
{
|
||||
"id" : "default",
|
||||
"leds" : "*",
|
||||
"hsl" :
|
||||
{
|
||||
"saturationGain" : 1.0000,
|
||||
"luminanceGain" : 1.0000,
|
||||
"luminanceMinimum" : 0.0000
|
||||
},
|
||||
"red" :
|
||||
{
|
||||
"threshold" : 0.0000,
|
||||
"gamma" : 2.5000
|
||||
},
|
||||
"green" :
|
||||
{
|
||||
"threshold" : 0.0000,
|
||||
"gamma" : 2.5000
|
||||
},
|
||||
"blue" :
|
||||
{
|
||||
"threshold" : 0.0000,
|
||||
"gamma" : 2.5000
|
||||
}
|
||||
"black" : [0,0,0],
|
||||
"white" : [255,255,255],
|
||||
"red" : [255,0,0],
|
||||
"green" : [0,255,0],
|
||||
"blue" : [0,0,255],
|
||||
"cyan" : [0,255,255],
|
||||
"magenta" : [255,0,255],
|
||||
"yellow" : [255,255,0],
|
||||
"gammaRed" : 1.0,
|
||||
"gammaGreen" : 1.0,
|
||||
"gammaBlue" : 1.0,
|
||||
"brightnessMin" : 0.0,
|
||||
"brightness" : 0.5
|
||||
}
|
||||
]
|
||||
},
|
||||
@ -151,6 +119,10 @@
|
||||
/// * redSignalThreshold : Signal threshold for the red channel between 0.0 and 1.0 [default=0.0]
|
||||
/// * greenSignalThreshold : Signal threshold for the green channel between 0.0 and 1.0 [default=0.0]
|
||||
/// * blueSignalThreshold : Signal threshold for the blue channel between 0.0 and 1.0 [default=0.0]
|
||||
/// * signalDetectionVerticalOffsetMin : area for signal detection - horizontal minimum offset value. Values between 0.0 and 1.0
|
||||
/// * signalDetectionHorizontalOffsetMin : area for signal detection - vertical minimum offset value. Values between 0.0 and 1.0
|
||||
/// * signalDetectionVerticalOffsetMax : area for signal detection - horizontal maximum offset value. Values between 0.0 and 1.0
|
||||
/// * signalDetectionHorizontalOffsetMax : area for signal detection - vertical maximum offset value. Values between 0.0 and 1.0
|
||||
"grabberV4L2" :
|
||||
[
|
||||
{
|
||||
@ -162,7 +134,7 @@
|
||||
"height" : -1,
|
||||
"frameDecimation" : 2,
|
||||
"sizeDecimation" : 8,
|
||||
"priority" : 890,
|
||||
"priority" : 240,
|
||||
"mode" : "2D",
|
||||
"useKodiChecker" : false,
|
||||
"cropLeft" : 0,
|
||||
@ -171,7 +143,11 @@
|
||||
"cropBottom" : 0,
|
||||
"redSignalThreshold" : 0.0,
|
||||
"greenSignalThreshold" : 0.0,
|
||||
"blueSignalThreshold" : 0.0
|
||||
"blueSignalThreshold" : 0.0,
|
||||
"signalDetectionVerticalOffsetMin" : 0.25,
|
||||
"signalDetectionHorizontalOffsetMin" : 0.25,
|
||||
"signalDetectionVerticalOffsetMax" : 0.75,
|
||||
"signalDetectionHorizontalOffsetMax" : 0.75
|
||||
}
|
||||
],
|
||||
|
||||
@ -181,7 +157,7 @@
|
||||
/// * width : The width of the grabbed frames [pixels]
|
||||
/// * height : The height of the grabbed frames [pixels]
|
||||
/// * frequency_Hz : The frequency of the frame grab [Hz]
|
||||
/// * priority : The priority of the frame-gabber (Default=890) HINT: lower value result in HIGHER priority!
|
||||
/// * priority : The priority of the frame-gabber (Default=250) HINT: lower value result in HIGHER priority!
|
||||
/// * ATTENTION : Power-of-Two resolution is not supported and leads to unexpected behaviour!
|
||||
"framegrabber" :
|
||||
{
|
||||
@ -189,7 +165,7 @@
|
||||
"enable" : true,
|
||||
"type" : "framebuffer",
|
||||
"frequency_Hz" : 10,
|
||||
"priority" : 890,
|
||||
"priority" : 250,
|
||||
|
||||
// valid for grabber: osx|dispmanx|amlogic|framebuffer
|
||||
"width" : 96,
|
||||
@ -250,25 +226,37 @@
|
||||
"grabAudio" : true,
|
||||
"grabMenu" : false,
|
||||
"grabPause" : false,
|
||||
"grabScreensaver" : true,
|
||||
"enable3DDetection" : true
|
||||
"grabScreensaver" : false,
|
||||
"enable3DDetection" : false
|
||||
},
|
||||
|
||||
/// Initial Effect sets a "booteffect" or "color" (foreground-effect) and optional set a "effect" or "color" during inactive grabbers and network receivers (background-effect)
|
||||
/// * background-effect : 2 options: set a effect (example: ["Rainbow swirl fast"]) or set a color (RGB) (example: [255,134,0])
|
||||
/// * background-effect-args : Set optional effect arguments (Have a look at the select effect to get the possible values), define it only when needed
|
||||
/// * foreground-effect : 2 options: set a effect (example: ["Rainbow swirl fast"]) or set a color (RGB) (example: [255,134,0])
|
||||
/// * foreground-effect-args : Set optional effect arguments (Have a look at the select effect to get the possible values), define it only when needed
|
||||
/// * foreground-duration_ms : The duration of the selected foreground-effect or color (0=endless)
|
||||
/// HINT: "foreground-effect" starts always with priority 0, so it blocks all remotes and grabbers if the loop is endless
|
||||
/// HINT: Set a empty value if you want to disable a component (example: "")
|
||||
"initialEffect" :
|
||||
/// foregroundEffect sets a "booteffect" or "bootcolor" during startup for a given period in ms (duration_ms)
|
||||
/// * enable : if true, foreground effect is enabled
|
||||
/// * type : choose between "color" or "effect"
|
||||
/// * color : if type is color, a color is used (RGB) (example: [0,0,255])
|
||||
/// * effect : if type is effect a effect is used (example: "Rainbow swirl fast")
|
||||
/// * duration_ms : The duration of the selected effect or color (0=endless)
|
||||
/// HINT: "foregroundEffect" starts always with priority 0, so it blocks all remotes and grabbers if the duration_ms is endless (0)
|
||||
"foregroundEffect" :
|
||||
{
|
||||
"background-effect" : ["Full color mood blobs"],
|
||||
//"background-effect-args" : {},
|
||||
"foreground-effect" : ["Rainbow swirl fast"],
|
||||
//"foreground-effect-args" : {},
|
||||
"foreground-duration_ms" : 3000
|
||||
"enable" : true,
|
||||
"type" : "effect",
|
||||
"color" : [0,0,255],
|
||||
"effect" : "Rainbow swirl fast",
|
||||
"duration_ms" : 3000
|
||||
},
|
||||
|
||||
/// backgroundEffect sets a background effect or color. It is used when all capture devices are stopped (with the help of the kodiVideChecker or manual via remote). Could be also selected via priorities selection.
|
||||
/// * enable : if true, background effect is enabled
|
||||
/// * type : choose between "color" or "effect"
|
||||
/// * color : if type is color, a color is used (RGB) (example: [255,134,0])
|
||||
/// * effect : if type is effect a effect is used (example: "Rainbow swirl fast")
|
||||
"backgroundEffect" :
|
||||
{
|
||||
"enable" : true,
|
||||
"type" : "effect",
|
||||
"color" : [255,138,0],
|
||||
"effect" : "Warm mood blobs"
|
||||
},
|
||||
|
||||
/// The configuration of the Json/Proto forwarder. Forward messages to multiple instances of Hyperion on same and/or other hosts
|
||||
@ -302,19 +290,19 @@
|
||||
/// The configuration of the boblight server which enables the boblight remote interface
|
||||
/// * enable : Enable or disable the boblight server (true/false)
|
||||
/// * port : Port at which the boblight server is started
|
||||
/// * priority : Priority of the boblight server (Default=800) HINT: lower value result in HIGHER priority!
|
||||
/// * priority : Priority of the boblight server (Default=200) HINT: lower value result in HIGHER priority!
|
||||
"boblightServer" :
|
||||
{
|
||||
"enable" : false,
|
||||
"port" : 19333,
|
||||
"priority" : 800
|
||||
"priority" : 200
|
||||
},
|
||||
|
||||
/// The configuration of the udp listener
|
||||
/// * enable : Enable or disable the udp listener (true/false)
|
||||
/// * address : The listener address, pre configured is multicast which listen also to unicast ip addresses at the same time. If emtpy, multicast is disabled and it also accepts unicast from all IPs
|
||||
/// * port : Port at which the udp listener starts
|
||||
/// * priority : Priority of the udp lstener server (Default=800)
|
||||
/// * priority : Priority of the udp lstener server (Default=200)
|
||||
/// * timeout : The timeout sets the timelimit for a "soft" off of the udp listener, if no packages are received (for example to switch to a gabber or InitialEffect - background-effect)
|
||||
/// * shared : If true, the udp listener is shared across all hyperion instances (if using more than one (forwarder))
|
||||
"udpListener" :
|
||||
@ -322,19 +310,19 @@
|
||||
"enable" : false,
|
||||
"address" : "239.255.28.01",
|
||||
"port" : 2801,
|
||||
"priority" : 800,
|
||||
"priority" : 200,
|
||||
"timeout" : 10000,
|
||||
"shared" : false
|
||||
},
|
||||
|
||||
/// Configuration of the Hyperion webserver
|
||||
/// * enable : enable ir disable the webserver (true/false)
|
||||
/// * document_root : path to hyperion webapp files
|
||||
/// * document_root : path to hyperion webapp files (webconfig developer only)
|
||||
/// * port : the port where hyperion webapp is accasible
|
||||
"webConfig" :
|
||||
{
|
||||
"enable" : true,
|
||||
"document_root" : "/usr/share/hyperion/webconfig",
|
||||
"document_root" : "/path/to/files",
|
||||
"port" : 8099
|
||||
},
|
||||
|
||||
@ -368,234 +356,94 @@
|
||||
"leds" :
|
||||
[
|
||||
{
|
||||
"index" : 0,
|
||||
"hscan" : { "minimum" : 0.5000, "maximum" : 0.5625 },
|
||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||
"index": 0,
|
||||
"hscan": { "maximum": 0.1667, "minimum": 0 },
|
||||
"vscan": { "maximum": 0.0800, "minimum": 0 }
|
||||
},
|
||||
{
|
||||
"index" : 1,
|
||||
"hscan" : { "minimum" : 0.4375, "maximum" : 0.5000 },
|
||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||
"index": 1,
|
||||
"hscan": { "maximum": 0.3332, "minimum": 0.1667 },
|
||||
"vscan": { "maximum": 0.0800, "minimum": 0 }
|
||||
},
|
||||
{
|
||||
"index" : 2,
|
||||
"hscan" : { "minimum" : 0.3750, "maximum" : 0.4375 },
|
||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||
"index": 2,
|
||||
"hscan": { "maximum": 0.5, "minimum": 0.3333 },
|
||||
"vscan": { "maximum": 0.0800, "minimum": 0 }
|
||||
},
|
||||
{
|
||||
"index" : 3,
|
||||
"hscan" : { "minimum" : 0.3125, "maximum" : 0.3750 },
|
||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||
"index": 3,
|
||||
"hscan": { "maximum": 0.6667, "minimum": 0.5 },
|
||||
"vscan": { "maximum": 0.0800, "minimum": 0 }
|
||||
},
|
||||
{
|
||||
"index" : 4,
|
||||
"hscan" : { "minimum" : 0.2500, "maximum" : 0.3125 },
|
||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||
"index": 4,
|
||||
"hscan": { "maximum": 0.8333, "minimum": 0.6667 },
|
||||
"vscan": { "maximum": 0.0800, "minimum": 0 }
|
||||
},
|
||||
{
|
||||
"index" : 5,
|
||||
"hscan" : { "minimum" : 0.1875, "maximum" : 0.2500 },
|
||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||
"index": 5,
|
||||
"hscan": { "maximum": 1, "minimum": 0.8333 },
|
||||
"vscan": { "maximum": 0.0800, "minimum": 0 }
|
||||
},
|
||||
{
|
||||
"index" : 6,
|
||||
"hscan" : { "minimum" : 0.1250, "maximum" : 0.1875 },
|
||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||
"index": 6,
|
||||
"hscan": { "maximum": 1, "minimum": 0.95 },
|
||||
"vscan": { "maximum": 0.3333, "minimum": 0 }
|
||||
},
|
||||
{
|
||||
"index" : 7,
|
||||
"hscan" : { "minimum" : 0.0625, "maximum" : 0.1250 },
|
||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||
"index": 7,
|
||||
"hscan": { "maximum": 1, "minimum": 0.95 },
|
||||
"vscan": { "maximum": 0.6667, "minimum": 0.3333 }
|
||||
},
|
||||
{
|
||||
"index" : 8,
|
||||
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0625 },
|
||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||
"index": 8,
|
||||
"hscan": { "maximum": 1, "minimum": 0.95 },
|
||||
"vscan": { "maximum": 1, "minimum": 0.6667 }
|
||||
},
|
||||
{
|
||||
"index" : 9,
|
||||
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
|
||||
"vscan" : { "minimum" : 0.8571, "maximum" : 1.0000 }
|
||||
"index": 9,
|
||||
"hscan": { "maximum": 1, "minimum": 0.8333 },
|
||||
"vscan": { "maximum": 1, "minimum": 0.92 }
|
||||
},
|
||||
{
|
||||
"index" : 10,
|
||||
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
|
||||
"vscan" : { "minimum" : 0.7143, "maximum" : 0.8571 }
|
||||
"index": 10,
|
||||
"hscan": { "maximum": 0.8333, "minimum": 0.6667 },
|
||||
"vscan": { "maximum": 1, "minimum": 0.92 }
|
||||
},
|
||||
{
|
||||
"index" : 11,
|
||||
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
|
||||
"vscan" : { "minimum" : 0.5714, "maximum" : 0.7143 }
|
||||
"index": 11,
|
||||
"hscan": { "maximum": 0.6667, "minimum": 0.5 },
|
||||
"vscan": { "maximum": 1, "minimum": 0.92 }
|
||||
},
|
||||
{
|
||||
"index" : 12,
|
||||
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
|
||||
"vscan" : { "minimum" : 0.4286, "maximum" : 0.5714 }
|
||||
"index": 12,
|
||||
"hscan": { "maximum": 0.5, "minimum": 0.3333 },
|
||||
"vscan": { "maximum": 1, "minimum": 0.92 }
|
||||
},
|
||||
{
|
||||
"index" : 13,
|
||||
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
|
||||
"vscan" : { "minimum" : 0.2857, "maximum" : 0.4286 }
|
||||
"index": 13,
|
||||
"hscan": { "maximum": 0.3333, "minimum": 0.1667 },
|
||||
"vscan": { "maximum": 1, "minimum": 0.92 }
|
||||
},
|
||||
{
|
||||
"index" : 14,
|
||||
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
|
||||
"vscan" : { "minimum" : 0.1429, "maximum" : 0.2857 }
|
||||
"index": 14,
|
||||
"hscan": { "maximum": 0.1667, "minimum": 0 },
|
||||
"vscan": { "maximum": 1, "minimum": 0.92 }
|
||||
},
|
||||
{
|
||||
"index" : 15,
|
||||
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
|
||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.1429 }
|
||||
"index": 15,
|
||||
"hscan": { "maximum": 0.05, "minimum": 0 },
|
||||
"vscan": { "maximum": 1, "minimum": 0.6667 }
|
||||
},
|
||||
{
|
||||
"index" : 16,
|
||||
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0625 },
|
||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||
"index": 16,
|
||||
"hscan": { "maximum": 0.05, "minimum": 0 },
|
||||
"vscan": { "maximum": 0.6667, "minimum": 0.3333 }
|
||||
},
|
||||
{
|
||||
"index" : 17,
|
||||
"hscan" : { "minimum" : 0.0625, "maximum" : 0.1250 },
|
||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||
},
|
||||
{
|
||||
"index" : 18,
|
||||
"hscan" : { "minimum" : 0.1250, "maximum" : 0.1875 },
|
||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||
},
|
||||
{
|
||||
"index" : 19,
|
||||
"hscan" : { "minimum" : 0.1875, "maximum" : 0.2500 },
|
||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||
},
|
||||
{
|
||||
"index" : 20,
|
||||
"hscan" : { "minimum" : 0.2500, "maximum" : 0.3125 },
|
||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||
},
|
||||
{
|
||||
"index" : 21,
|
||||
"hscan" : { "minimum" : 0.3125, "maximum" : 0.3750 },
|
||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||
},
|
||||
{
|
||||
"index" : 22,
|
||||
"hscan" : { "minimum" : 0.3750, "maximum" : 0.4375 },
|
||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||
},
|
||||
{
|
||||
"index" : 23,
|
||||
"hscan" : { "minimum" : 0.4375, "maximum" : 0.5000 },
|
||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||
},
|
||||
{
|
||||
"index" : 24,
|
||||
"hscan" : { "minimum" : 0.5000, "maximum" : 0.5625 },
|
||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||
},
|
||||
{
|
||||
"index" : 25,
|
||||
"hscan" : { "minimum" : 0.5625, "maximum" : 0.6250 },
|
||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||
},
|
||||
{
|
||||
"index" : 26,
|
||||
"hscan" : { "minimum" : 0.6250, "maximum" : 0.6875 },
|
||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||
},
|
||||
{
|
||||
"index" : 27,
|
||||
"hscan" : { "minimum" : 0.6875, "maximum" : 0.7500 },
|
||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||
},
|
||||
{
|
||||
"index" : 28,
|
||||
"hscan" : { "minimum" : 0.7500, "maximum" : 0.8125 },
|
||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||
},
|
||||
{
|
||||
"index" : 29,
|
||||
"hscan" : { "minimum" : 0.8125, "maximum" : 0.8750 },
|
||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||
},
|
||||
{
|
||||
"index" : 30,
|
||||
"hscan" : { "minimum" : 0.8750, "maximum" : 0.9375 },
|
||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||
},
|
||||
{
|
||||
"index" : 31,
|
||||
"hscan" : { "minimum" : 0.9375, "maximum" : 1.0000 },
|
||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||
},
|
||||
{
|
||||
"index" : 32,
|
||||
"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
|
||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.1429 }
|
||||
},
|
||||
{
|
||||
"index" : 33,
|
||||
"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
|
||||
"vscan" : { "minimum" : 0.1429, "maximum" : 0.2857 }
|
||||
},
|
||||
{
|
||||
"index" : 34,
|
||||
"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
|
||||
"vscan" : { "minimum" : 0.2857, "maximum" : 0.4286 }
|
||||
},
|
||||
{
|
||||
"index" : 35,
|
||||
"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
|
||||
"vscan" : { "minimum" : 0.4286, "maximum" : 0.5714 }
|
||||
},
|
||||
{
|
||||
"index" : 36,
|
||||
"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
|
||||
"vscan" : { "minimum" : 0.5714, "maximum" : 0.7143 }
|
||||
},
|
||||
{
|
||||
"index" : 37,
|
||||
"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
|
||||
"vscan" : { "minimum" : 0.7143, "maximum" : 0.8571 }
|
||||
},
|
||||
{
|
||||
"index" : 38,
|
||||
"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
|
||||
"vscan" : { "minimum" : 0.8571, "maximum" : 1.0000 }
|
||||
},
|
||||
{
|
||||
"index" : 39,
|
||||
"hscan" : { "minimum" : 0.9375, "maximum" : 1.0000 },
|
||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||
},
|
||||
{
|
||||
"index" : 40,
|
||||
"hscan" : { "minimum" : 0.8750, "maximum" : 0.9375 },
|
||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||
},
|
||||
{
|
||||
"index" : 41,
|
||||
"hscan" : { "minimum" : 0.8125, "maximum" : 0.8750 },
|
||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||
},
|
||||
{
|
||||
"index" : 42,
|
||||
"hscan" : { "minimum" : 0.7500, "maximum" : 0.8125 },
|
||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||
},
|
||||
{
|
||||
"index" : 43,
|
||||
"hscan" : { "minimum" : 0.6875, "maximum" : 0.7500 },
|
||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||
},
|
||||
{
|
||||
"index" : 44,
|
||||
"hscan" : { "minimum" : 0.6250, "maximum" : 0.6875 },
|
||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||
},
|
||||
{
|
||||
"index" : 45,
|
||||
"hscan" : { "minimum" : 0.5625, "maximum" : 0.6250 },
|
||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||
"index": 17,
|
||||
"hscan": { "maximum": 0.05, "minimum": 0 },
|
||||
"vscan": { "maximum": 0.3333, "minimum": 0 }
|
||||
}
|
||||
]
|
||||
}
|
||||
|
@ -1,4 +1,10 @@
|
||||
{
|
||||
"general" :
|
||||
{
|
||||
"name" : "MyHyperionConfig",
|
||||
"showOptHelp" : true,
|
||||
"configVersion" : 2
|
||||
},
|
||||
"logger" :
|
||||
{
|
||||
"level" : "warn"
|
||||
@ -6,70 +12,36 @@
|
||||
|
||||
"device" :
|
||||
{
|
||||
"name" : "DefaultHyperionConfig",
|
||||
"type" : "file",
|
||||
"output" : "/dev/null",
|
||||
"rate" : 1000000,
|
||||
"colorOrder" : "rgb"
|
||||
"colorOrder" : "rgb",
|
||||
"rewriteTime": 5000
|
||||
},
|
||||
|
||||
"color" :
|
||||
{
|
||||
"imageToLedMappingType" : "multicolor_mean",
|
||||
"channelAdjustment_enable" : true,
|
||||
"channelAdjustment_v4l_only" : true,
|
||||
"channelAdjustment_v4l_only" : false,
|
||||
"channelAdjustment" :
|
||||
[
|
||||
{
|
||||
"id" : "default",
|
||||
"leds" : "*",
|
||||
"pureRed" :
|
||||
{
|
||||
"redChannel" : 255,
|
||||
"greenChannel" : 0,
|
||||
"blueChannel" : 0
|
||||
},
|
||||
"pureGreen" :
|
||||
{
|
||||
"redChannel" : 0,
|
||||
"greenChannel" : 255,
|
||||
"blueChannel" : 0
|
||||
},
|
||||
"pureBlue" :
|
||||
{
|
||||
"redChannel" : 0,
|
||||
"greenChannel" : 0,
|
||||
"blueChannel" : 255
|
||||
}
|
||||
}
|
||||
],
|
||||
"transform_enable" : true,
|
||||
"transform_v4l_only" : true,
|
||||
"transform" :
|
||||
[
|
||||
{
|
||||
"id" : "default",
|
||||
"leds" : "*",
|
||||
"hsl" :
|
||||
{
|
||||
"saturationGain" : 1.0000,
|
||||
"luminanceGain" : 1.0000,
|
||||
"luminanceMinimum" : 0.0000
|
||||
},
|
||||
"red" :
|
||||
{
|
||||
"threshold" : 0.0000,
|
||||
"gamma" : 2.5000
|
||||
},
|
||||
"green" :
|
||||
{
|
||||
"threshold" : 0.0000,
|
||||
"gamma" : 2.5000
|
||||
},
|
||||
"blue" :
|
||||
{
|
||||
"threshold" : 0.0000,
|
||||
"gamma" : 2.5000
|
||||
}
|
||||
"black" : [0,0,0],
|
||||
"white" : [255,255,255],
|
||||
"red" : [255,0,0],
|
||||
"green" : [0,255,0],
|
||||
"blue" : [0,0,255],
|
||||
"cyan" : [0,255,255],
|
||||
"magenta" : [255,0,255],
|
||||
"yellow" : [255,255,0],
|
||||
"gammaRed" : 1.0,
|
||||
"gammaGreen" : 1.0,
|
||||
"gammaBlue" : 1.0,
|
||||
"brightnessMin" : 0.0,
|
||||
"brightness" : 0.75
|
||||
}
|
||||
]
|
||||
},
|
||||
@ -95,7 +67,7 @@
|
||||
"height" : -1,
|
||||
"frameDecimation" : 2,
|
||||
"sizeDecimation" : 8,
|
||||
"priority" : 890,
|
||||
"priority" : 240,
|
||||
"mode" : "2D",
|
||||
"useKodiChecker" : false,
|
||||
"cropLeft" : 0,
|
||||
@ -104,7 +76,11 @@
|
||||
"cropBottom" : 0,
|
||||
"redSignalThreshold" : 0.0,
|
||||
"greenSignalThreshold" : 0.0,
|
||||
"blueSignalThreshold" : 0.0
|
||||
"blueSignalThreshold" : 0.0,
|
||||
"signalDetectionVerticalOffsetMin" : 0.25,
|
||||
"signalDetectionHorizontalOffsetMin" : 0.25,
|
||||
"signalDetectionVerticalOffsetMax" : 0.75,
|
||||
"signalDetectionHorizontalOffsetMax" : 0.75
|
||||
}
|
||||
],
|
||||
|
||||
@ -112,16 +88,20 @@
|
||||
{
|
||||
"enable" : true,
|
||||
"type" : "auto",
|
||||
"width" : 96,
|
||||
"height" : 96,
|
||||
"frequency_Hz" : 10.0,
|
||||
"priority" : 890
|
||||
"width" : 80,
|
||||
"height" : 45,
|
||||
"frequency_Hz" : 10,
|
||||
"priority" : 250
|
||||
},
|
||||
|
||||
"blackborderdetector" :
|
||||
{
|
||||
"enable" : true,
|
||||
"threshold" : 0.0,
|
||||
"threshold" : 0.5,
|
||||
"unknownFrameCnt" : 600,
|
||||
"borderFrameCnt" : 50,
|
||||
"maxInconsistentCnt" : 10,
|
||||
"blurRemoveCnt" : 1,
|
||||
"mode" : "default"
|
||||
},
|
||||
|
||||
@ -135,15 +115,25 @@
|
||||
"grabAudio" : true,
|
||||
"grabMenu" : false,
|
||||
"grabPause" : false,
|
||||
"grabScreensaver" : true,
|
||||
"enable3DDetection" : true
|
||||
"grabScreensaver" : false,
|
||||
"enable3DDetection" : false
|
||||
},
|
||||
|
||||
"initialEffect" :
|
||||
"foregroundEffect" :
|
||||
{
|
||||
"background-effect" : ["Full color mood blobs"],
|
||||
"foreground-effect" : ["Rainbow swirl fast"],
|
||||
"foreground-duration_ms" : 3000
|
||||
"enable" : true,
|
||||
"type" : "effect",
|
||||
"color" : [0,0,255],
|
||||
"effect" : "Rainbow swirl fast",
|
||||
"duration_ms" : 3000
|
||||
},
|
||||
|
||||
"backgroundEffect" :
|
||||
{
|
||||
"enable" : true,
|
||||
"type" : "effect",
|
||||
"color" : [255,138,0],
|
||||
"effect" : "Warm mood blobs"
|
||||
},
|
||||
|
||||
"forwarder" :
|
||||
@ -167,7 +157,7 @@
|
||||
{
|
||||
"enable" : false,
|
||||
"port" : 19333,
|
||||
"priority" : 800
|
||||
"priority" : 200
|
||||
},
|
||||
|
||||
"udpListener" :
|
||||
@ -175,254 +165,114 @@
|
||||
"enable" : false,
|
||||
"address" : "239.255.28.01",
|
||||
"port" : 2801,
|
||||
"priority" : 800,
|
||||
"priority" : 200,
|
||||
"timeout" : 10000,
|
||||
"shared" : false
|
||||
},
|
||||
|
||||
"webConfig" :
|
||||
{
|
||||
"enable" : true
|
||||
"enable" : true,
|
||||
"document_root" : "",
|
||||
"port" : 8099
|
||||
},
|
||||
|
||||
"effects" :
|
||||
{
|
||||
"paths" :
|
||||
[
|
||||
]
|
||||
"paths" : ["../custom-effects"]
|
||||
},
|
||||
|
||||
"leds" :
|
||||
"leds":
|
||||
[
|
||||
{
|
||||
"index" : 0,
|
||||
"hscan" : { "minimum" : 0.5000, "maximum" : 0.5625 },
|
||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||
"index": 0,
|
||||
"hscan": { "maximum": 0.1667, "minimum": 0 },
|
||||
"vscan": { "maximum": 0.0800, "minimum": 0 }
|
||||
},
|
||||
{
|
||||
"index" : 1,
|
||||
"hscan" : { "minimum" : 0.4375, "maximum" : 0.5000 },
|
||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||
"index": 1,
|
||||
"hscan": { "maximum": 0.3332, "minimum": 0.1667 },
|
||||
"vscan": { "maximum": 0.0800, "minimum": 0 }
|
||||
},
|
||||
{
|
||||
"index" : 2,
|
||||
"hscan" : { "minimum" : 0.3750, "maximum" : 0.4375 },
|
||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||
"index": 2,
|
||||
"hscan": { "maximum": 0.5, "minimum": 0.3333 },
|
||||
"vscan": { "maximum": 0.0800, "minimum": 0 }
|
||||
},
|
||||
{
|
||||
"index" : 3,
|
||||
"hscan" : { "minimum" : 0.3125, "maximum" : 0.3750 },
|
||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||
"index": 3,
|
||||
"hscan": { "maximum": 0.6667, "minimum": 0.5 },
|
||||
"vscan": { "maximum": 0.0800, "minimum": 0 }
|
||||
},
|
||||
{
|
||||
"index" : 4,
|
||||
"hscan" : { "minimum" : 0.2500, "maximum" : 0.3125 },
|
||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||
"index": 4,
|
||||
"hscan": { "maximum": 0.8333, "minimum": 0.6667 },
|
||||
"vscan": { "maximum": 0.0800, "minimum": 0 }
|
||||
},
|
||||
{
|
||||
"index" : 5,
|
||||
"hscan" : { "minimum" : 0.1875, "maximum" : 0.2500 },
|
||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||
"index": 5,
|
||||
"hscan": { "maximum": 1, "minimum": 0.8333 },
|
||||
"vscan": { "maximum": 0.0800, "minimum": 0 }
|
||||
},
|
||||
{
|
||||
"index" : 6,
|
||||
"hscan" : { "minimum" : 0.1250, "maximum" : 0.1875 },
|
||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||
"index": 6,
|
||||
"hscan": { "maximum": 1, "minimum": 0.95 },
|
||||
"vscan": { "maximum": 0.3333, "minimum": 0 }
|
||||
},
|
||||
{
|
||||
"index" : 7,
|
||||
"hscan" : { "minimum" : 0.0625, "maximum" : 0.1250 },
|
||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||
"index": 7,
|
||||
"hscan": { "maximum": 1, "minimum": 0.95 },
|
||||
"vscan": { "maximum": 0.6667, "minimum": 0.3333 }
|
||||
},
|
||||
{
|
||||
"index" : 8,
|
||||
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0625 },
|
||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||
"index": 8,
|
||||
"hscan": { "maximum": 1, "minimum": 0.95 },
|
||||
"vscan": { "maximum": 1, "minimum": 0.6667 }
|
||||
},
|
||||
{
|
||||
"index" : 9,
|
||||
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
|
||||
"vscan" : { "minimum" : 0.8571, "maximum" : 1.0000 }
|
||||
"index": 9,
|
||||
"hscan": { "maximum": 1, "minimum": 0.8333 },
|
||||
"vscan": { "maximum": 1, "minimum": 0.92 }
|
||||
},
|
||||
{
|
||||
"index" : 10,
|
||||
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
|
||||
"vscan" : { "minimum" : 0.7143, "maximum" : 0.8571 }
|
||||
"index": 10,
|
||||
"hscan": { "maximum": 0.8333, "minimum": 0.6667 },
|
||||
"vscan": { "maximum": 1, "minimum": 0.92 }
|
||||
},
|
||||
{
|
||||
"index" : 11,
|
||||
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
|
||||
"vscan" : { "minimum" : 0.5714, "maximum" : 0.7143 }
|
||||
"index": 11,
|
||||
"hscan": { "maximum": 0.6667, "minimum": 0.5 },
|
||||
"vscan": { "maximum": 1, "minimum": 0.92 }
|
||||
},
|
||||
{
|
||||
"index" : 12,
|
||||
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
|
||||
"vscan" : { "minimum" : 0.4286, "maximum" : 0.5714 }
|
||||
"index": 12,
|
||||
"hscan": { "maximum": 0.5, "minimum": 0.3333 },
|
||||
"vscan": { "maximum": 1, "minimum": 0.92 }
|
||||
},
|
||||
{
|
||||
"index" : 13,
|
||||
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
|
||||
"vscan" : { "minimum" : 0.2857, "maximum" : 0.4286 }
|
||||
"index": 13,
|
||||
"hscan": { "maximum": 0.3333, "minimum": 0.1667 },
|
||||
"vscan": { "maximum": 1, "minimum": 0.92 }
|
||||
},
|
||||
{
|
||||
"index" : 14,
|
||||
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
|
||||
"vscan" : { "minimum" : 0.1429, "maximum" : 0.2857 }
|
||||
"index": 14,
|
||||
"hscan": { "maximum": 0.1667, "minimum": 0 },
|
||||
"vscan": { "maximum": 1, "minimum": 0.92 }
|
||||
},
|
||||
{
|
||||
"index" : 15,
|
||||
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0500 },
|
||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.1429 }
|
||||
"index": 15,
|
||||
"hscan": { "maximum": 0.05, "minimum": 0 },
|
||||
"vscan": { "maximum": 1, "minimum": 0.6667 }
|
||||
},
|
||||
{
|
||||
"index" : 16,
|
||||
"hscan" : { "minimum" : 0.0000, "maximum" : 0.0625 },
|
||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||
"index": 16,
|
||||
"hscan": { "maximum": 0.05, "minimum": 0 },
|
||||
"vscan": { "maximum": 0.6667, "minimum": 0.3333 }
|
||||
},
|
||||
{
|
||||
"index" : 17,
|
||||
"hscan" : { "minimum" : 0.0625, "maximum" : 0.1250 },
|
||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||
},
|
||||
{
|
||||
"index" : 18,
|
||||
"hscan" : { "minimum" : 0.1250, "maximum" : 0.1875 },
|
||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||
},
|
||||
{
|
||||
"index" : 19,
|
||||
"hscan" : { "minimum" : 0.1875, "maximum" : 0.2500 },
|
||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||
},
|
||||
{
|
||||
"index" : 20,
|
||||
"hscan" : { "minimum" : 0.2500, "maximum" : 0.3125 },
|
||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||
},
|
||||
{
|
||||
"index" : 21,
|
||||
"hscan" : { "minimum" : 0.3125, "maximum" : 0.3750 },
|
||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||
},
|
||||
{
|
||||
"index" : 22,
|
||||
"hscan" : { "minimum" : 0.3750, "maximum" : 0.4375 },
|
||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||
},
|
||||
{
|
||||
"index" : 23,
|
||||
"hscan" : { "minimum" : 0.4375, "maximum" : 0.5000 },
|
||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||
},
|
||||
{
|
||||
"index" : 24,
|
||||
"hscan" : { "minimum" : 0.5000, "maximum" : 0.5625 },
|
||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||
},
|
||||
{
|
||||
"index" : 25,
|
||||
"hscan" : { "minimum" : 0.5625, "maximum" : 0.6250 },
|
||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||
},
|
||||
{
|
||||
"index" : 26,
|
||||
"hscan" : { "minimum" : 0.6250, "maximum" : 0.6875 },
|
||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||
},
|
||||
{
|
||||
"index" : 27,
|
||||
"hscan" : { "minimum" : 0.6875, "maximum" : 0.7500 },
|
||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||
},
|
||||
{
|
||||
"index" : 28,
|
||||
"hscan" : { "minimum" : 0.7500, "maximum" : 0.8125 },
|
||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||
},
|
||||
{
|
||||
"index" : 29,
|
||||
"hscan" : { "minimum" : 0.8125, "maximum" : 0.8750 },
|
||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||
},
|
||||
{
|
||||
"index" : 30,
|
||||
"hscan" : { "minimum" : 0.8750, "maximum" : 0.9375 },
|
||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||
},
|
||||
{
|
||||
"index" : 31,
|
||||
"hscan" : { "minimum" : 0.9375, "maximum" : 1.0000 },
|
||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.0800 }
|
||||
},
|
||||
{
|
||||
"index" : 32,
|
||||
"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
|
||||
"vscan" : { "minimum" : 0.0000, "maximum" : 0.1429 }
|
||||
},
|
||||
{
|
||||
"index" : 33,
|
||||
"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
|
||||
"vscan" : { "minimum" : 0.1429, "maximum" : 0.2857 }
|
||||
},
|
||||
{
|
||||
"index" : 34,
|
||||
"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
|
||||
"vscan" : { "minimum" : 0.2857, "maximum" : 0.4286 }
|
||||
},
|
||||
{
|
||||
"index" : 35,
|
||||
"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
|
||||
"vscan" : { "minimum" : 0.4286, "maximum" : 0.5714 }
|
||||
},
|
||||
{
|
||||
"index" : 36,
|
||||
"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
|
||||
"vscan" : { "minimum" : 0.5714, "maximum" : 0.7143 }
|
||||
},
|
||||
{
|
||||
"index" : 37,
|
||||
"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
|
||||
"vscan" : { "minimum" : 0.7143, "maximum" : 0.8571 }
|
||||
},
|
||||
{
|
||||
"index" : 38,
|
||||
"hscan" : { "minimum" : 0.9500, "maximum" : 1.0000 },
|
||||
"vscan" : { "minimum" : 0.8571, "maximum" : 1.0000 }
|
||||
},
|
||||
{
|
||||
"index" : 39,
|
||||
"hscan" : { "minimum" : 0.9375, "maximum" : 1.0000 },
|
||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||
},
|
||||
{
|
||||
"index" : 40,
|
||||
"hscan" : { "minimum" : 0.8750, "maximum" : 0.9375 },
|
||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||
},
|
||||
{
|
||||
"index" : 41,
|
||||
"hscan" : { "minimum" : 0.8125, "maximum" : 0.8750 },
|
||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||
},
|
||||
{
|
||||
"index" : 42,
|
||||
"hscan" : { "minimum" : 0.7500, "maximum" : 0.8125 },
|
||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||
},
|
||||
{
|
||||
"index" : 43,
|
||||
"hscan" : { "minimum" : 0.6875, "maximum" : 0.7500 },
|
||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||
},
|
||||
{
|
||||
"index" : 44,
|
||||
"hscan" : { "minimum" : 0.6250, "maximum" : 0.6875 },
|
||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||
},
|
||||
{
|
||||
"index" : 45,
|
||||
"hscan" : { "minimum" : 0.5625, "maximum" : 0.6250 },
|
||||
"vscan" : { "minimum" : 0.9200, "maximum" : 1.0000 }
|
||||
"index": 17,
|
||||
"hscan": { "maximum": 0.05, "minimum": 0 },
|
||||
"vscan": { "maximum": 0.3333, "minimum": 0 }
|
||||
}
|
||||
]
|
||||
}
|
||||
|
2
dependencies/external/protobuf
vendored
2
dependencies/external/protobuf
vendored
@ -1 +1 @@
|
||||
Subproject commit efb59b79e5a8f26eae4d15f38bbfb5667e23df60
|
||||
Subproject commit adce8a99fdab90f290d659b6b3bf2d09b721e24a
|
11
effects/candle.json
Normal file
11
effects/candle.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"name" : "Candle",
|
||||
"script" : "candle.py",
|
||||
"args" :
|
||||
{
|
||||
"sleepTime" : 0.15,
|
||||
"brightness" : 100,
|
||||
"color" : [ 255, 138, 0 ],
|
||||
"candles" : "all"
|
||||
}
|
||||
}
|
81
effects/candle.py
Normal file
81
effects/candle.py
Normal file
@ -0,0 +1,81 @@
|
||||
|
||||
# Candleflicker effect by penfold42
|
||||
# Algorithm courtesy of
|
||||
# https://cpldcpu.com/2013/12/08/hacking-a-candleflicker-led/
|
||||
|
||||
# candles can be :
|
||||
# a single led number, a list of candle numbers
|
||||
# "all" to flicker all the leds randomly
|
||||
# "all-together" to flicker all the leds in unison
|
||||
|
||||
import hyperion
|
||||
import time
|
||||
import colorsys
|
||||
import random
|
||||
|
||||
# Get parameters
|
||||
color = hyperion.args.get('color', (255,138,0))
|
||||
colorShift = float(hyperion.args.get('colorShift', 1))/100.0
|
||||
brightness = float(hyperion.args.get('brightness', 100))/100.0
|
||||
|
||||
sleepTime = float(hyperion.args.get('sleepTime', 0.14))
|
||||
|
||||
candles = hyperion.args.get('candles', "all")
|
||||
ledlist = hyperion.args.get('ledlist', "1")
|
||||
|
||||
candlelist = ()
|
||||
if (candles == "list") and (type(ledlist) is str):
|
||||
for s in ledlist.split(','):
|
||||
i = int(s)
|
||||
if (i<hyperion.ledCount):
|
||||
candlelist += (i,)
|
||||
elif (candles == "list") and (type(ledlist) is list):
|
||||
for s in (ledlist):
|
||||
i = int(s)
|
||||
if (i<hyperion.ledCount):
|
||||
candlelist += (i,)
|
||||
else:
|
||||
candlelist = range(hyperion.ledCount)
|
||||
|
||||
|
||||
# Convert rgb color to hsv
|
||||
hsv = colorsys.rgb_to_hsv(color[0]/255.0, color[1]/255.0, color [2]/255.0)
|
||||
|
||||
|
||||
def CandleRgb():
|
||||
hue = random.uniform(hsv[0]-colorShift, hsv[0]+colorShift) % 1.0
|
||||
|
||||
RAND=random.randint(0,15)
|
||||
while ((RAND & 0x0c)==0):
|
||||
RAND=random.randint(0,15)
|
||||
val = ( min(RAND, 15)/15.0001 ) * brightness
|
||||
|
||||
frgb = colorsys.hsv_to_rgb(hue, hsv[1], val);
|
||||
|
||||
return (int(255*frgb[0]), int(255*frgb[1]), int(255*frgb[2]))
|
||||
|
||||
|
||||
ledData = bytearray(hyperion.ledCount * (0,0,0) )
|
||||
while not hyperion.abort():
|
||||
if (candles == "all-together"):
|
||||
rgb = CandleRgb()
|
||||
for lednum in candlelist:
|
||||
ledData[3*lednum+0] = rgb[0]
|
||||
ledData[3*lednum+1] = rgb[1]
|
||||
ledData[3*lednum+2] = rgb[2]
|
||||
elif (candles == "all"):
|
||||
for lednum in candlelist:
|
||||
rgb = CandleRgb()
|
||||
ledData[3*lednum+0] = rgb[0]
|
||||
ledData[3*lednum+1] = rgb[1]
|
||||
ledData[3*lednum+2] = rgb[2]
|
||||
else:
|
||||
for lednum in candlelist:
|
||||
rgb = CandleRgb()
|
||||
ledData[3*lednum+0] = rgb[0]
|
||||
ledData[3*lednum+1] = rgb[1]
|
||||
ledData[3*lednum+2] = rgb[2]
|
||||
|
||||
hyperion.setColor (ledData)
|
||||
time.sleep(sleepTime)
|
||||
|
@ -1,6 +1,4 @@
|
||||
import hyperion
|
||||
import time
|
||||
import colorsys
|
||||
import hyperion, time, colorsys
|
||||
|
||||
# Get the parameters
|
||||
speed = float(hyperion.args.get('speed', 1.0))
|
||||
|
@ -1,7 +1,4 @@
|
||||
import hyperion
|
||||
import time
|
||||
import colorsys
|
||||
import math
|
||||
import hyperion, time, colorsys, math
|
||||
from random import random
|
||||
|
||||
# Get the parameters
|
||||
|
@ -1,23 +1,21 @@
|
||||
import hyperion
|
||||
import time
|
||||
import colorsys
|
||||
import hyperion, time, colorsys
|
||||
|
||||
# Get the parameters
|
||||
rotationTime = float(hyperion.args.get('rotation-time', 2.0))
|
||||
colorOne = hyperion.args.get('color_one', (255,0,0))
|
||||
colorTwo = hyperion.args.get('color_two', (0,0,255))
|
||||
colorsCount = hyperion.args.get('colors_count', hyperion.ledCount/2)
|
||||
reverse = bool(hyperion.args.get('reverse', False))
|
||||
colorOne = hyperion.args.get('color_one', (255,0,0))
|
||||
colorTwo = hyperion.args.get('color_two', (0,0,255))
|
||||
colorsCount = hyperion.args.get('colors_count', hyperion.ledCount/2)
|
||||
reverse = bool(hyperion.args.get('reverse', False))
|
||||
|
||||
# Check parameters
|
||||
rotationTime = max(0.1, rotationTime)
|
||||
colorsCount = min(hyperion.ledCount/2, colorsCount)
|
||||
|
||||
# Initialize the led data
|
||||
hsv1 = colorsys.rgb_to_hsv(colorOne[0]/255.0, colorOne[1]/255.0, colorOne[2]/255.0)
|
||||
hsv2 = colorsys.rgb_to_hsv(colorTwo[0]/255.0, colorTwo[1]/255.0, colorTwo[2]/255.0)
|
||||
hsv1 = colorsys.rgb_to_hsv(colorOne[0]/255.0, colorOne[1]/255.0, colorOne[2]/255.0)
|
||||
hsv2 = colorsys.rgb_to_hsv(colorTwo[0]/255.0, colorTwo[1]/255.0, colorTwo[2]/255.0)
|
||||
colorBlack = (0,0,0)
|
||||
ledData = bytearray()
|
||||
ledData = bytearray()
|
||||
for i in range(hyperion.ledCount):
|
||||
if i <= colorsCount:
|
||||
rgb = colorsys.hsv_to_rgb(hsv1[0], hsv1[1], hsv1[2])
|
||||
|
@ -4,7 +4,7 @@
|
||||
"args" :
|
||||
{
|
||||
"rotation-time" : 60.0,
|
||||
"brightness" : 1.0,
|
||||
"brightness" : 100,
|
||||
"reverse" : false
|
||||
}
|
||||
}
|
||||
|
@ -1,17 +1,10 @@
|
||||
import hyperion
|
||||
import time
|
||||
import colorsys
|
||||
import hyperion, time, colorsys
|
||||
|
||||
# Get the parameters
|
||||
rotationTime = float(hyperion.args.get('rotation-time', 30.0))
|
||||
brightness = float(hyperion.args.get('brightness', 1.0))
|
||||
saturation = float(hyperion.args.get('saturation', 1.0))
|
||||
reverse = bool(hyperion.args.get('reverse', False))
|
||||
|
||||
# Check parameters
|
||||
rotationTime = max(0.1, rotationTime)
|
||||
brightness = max(0.0, min(brightness, 1.0))
|
||||
saturation = max(0.0, min(saturation, 1.0))
|
||||
brightness = float(hyperion.args.get('brightness', 100))/100.0
|
||||
saturation = float(hyperion.args.get('saturation', 100))/100.0
|
||||
reverse = bool(hyperion.args.get('reverse', False))
|
||||
|
||||
# Calculate the sleep time and hue increment
|
||||
sleepTime = 0.1
|
||||
|
@ -8,7 +8,7 @@ centerY = float(hyperion.args.get('center_y', 0.5))
|
||||
|
||||
sleepTime = max(0.1, rotationTime) / 360
|
||||
angle = 0
|
||||
centerX = int(round(hyperion.imageWidth)*centerX)
|
||||
centerX = int(round(float(hyperion.imageWidth)*centerX))
|
||||
centerY = int(round(float(hyperion.imageHeight)*centerY))
|
||||
increment = -1 if reverse else 1
|
||||
|
||||
|
68
effects/schema/candle.schema.json
Normal file
68
effects/schema/candle.schema.json
Normal file
@ -0,0 +1,68 @@
|
||||
{
|
||||
"type":"object",
|
||||
"script" : "candle.py",
|
||||
"title":"edt_eff_candle_header_title",
|
||||
"required":true,
|
||||
"properties":{
|
||||
"candles": {
|
||||
"type": "string",
|
||||
"title":"edt_eff_whichleds_title",
|
||||
"enum" : ["all","all-together","list"],
|
||||
"default" : "all",
|
||||
"options" : {
|
||||
"enum_titles" : ["edt_eff_enum_all", "edt_eff_enum_all-together", "edt_eff_enum_list"]
|
||||
},
|
||||
"propertyOrder" : 1
|
||||
},
|
||||
"ledlist": {
|
||||
"type": "string",
|
||||
"title":"edt_eff_ledlist_title",
|
||||
"default" : "1,11,21",
|
||||
"propertyOrder" : 2
|
||||
},
|
||||
"color": {
|
||||
"type": "array",
|
||||
"title":"edt_eff_color_title",
|
||||
"format":"colorpicker",
|
||||
"default": [255,138,0],
|
||||
"items" : {
|
||||
"type": "integer",
|
||||
"minimum": 0,
|
||||
"maximum": 255
|
||||
},
|
||||
"minItems": 3,
|
||||
"maxItems": 3,
|
||||
"propertyOrder" : 3
|
||||
},
|
||||
"colorShift": {
|
||||
"type": "number",
|
||||
"title":"edt_eff_colorshift_title",
|
||||
"default": 1,
|
||||
"minimum" : 0,
|
||||
"maximum": 30,
|
||||
"append" : "edt_append_percent",
|
||||
"propertyOrder" : 4
|
||||
},
|
||||
"brightness": {
|
||||
"type": "number",
|
||||
"title":"edt_eff_brightness_title",
|
||||
"default": 100,
|
||||
"minimum" : 1,
|
||||
"maximum": 100,
|
||||
"step" : 10,
|
||||
"append" : "edt_append_percent",
|
||||
"propertyOrder" : 5
|
||||
},
|
||||
"sleepTime": {
|
||||
"type": "number",
|
||||
"title":"edt_eff_sleeptime_title",
|
||||
"default": 0.15,
|
||||
"minimum" : 0.01,
|
||||
"maximum": 1,
|
||||
"step": 0.01,
|
||||
"append" : "edt_append_s",
|
||||
"propertyOrder" : 6
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
@ -1,20 +1,20 @@
|
||||
{
|
||||
"type":"object",
|
||||
"script" : "fade.py",
|
||||
"title":"Fade",
|
||||
"title":"edt_eff_fade_header_title",
|
||||
"required":true,
|
||||
"properties":{
|
||||
"fade-time": {
|
||||
"type": "number",
|
||||
"title":"Fade Time",
|
||||
"title":"edt_eff_fadetime_title",
|
||||
"default": 5.0,
|
||||
"minimum" : 0.1,
|
||||
"append" : "s",
|
||||
"append" : "edt_append_s",
|
||||
"propertyOrder" : 1
|
||||
},
|
||||
"color-start": {
|
||||
"type": "array",
|
||||
"title":"Color Start",
|
||||
"title":"edt_eff_colorstart_title",
|
||||
"format":"colorpicker",
|
||||
"default": [255,174,11],
|
||||
"items" : {
|
||||
@ -29,7 +29,7 @@
|
||||
},
|
||||
"color-end": {
|
||||
"type": "array",
|
||||
"title":"Color End",
|
||||
"title":"edt_eff_colorend_title",
|
||||
"format":"colorpicker",
|
||||
"default": [100,100,100],
|
||||
"items" : {
|
||||
|
@ -1,12 +1,12 @@
|
||||
{
|
||||
"type":"object",
|
||||
"script" : "knight-rider.py",
|
||||
"title":"Knight Rider",
|
||||
"title":"edt_eff_knightrider_header_title",
|
||||
"required":true,
|
||||
"properties":{
|
||||
"color": {
|
||||
"type": "array",
|
||||
"title":"Color",
|
||||
"title":"edt_eff_color_title",
|
||||
"format":"colorpicker",
|
||||
"default": [255,0,0],
|
||||
"items" : {
|
||||
@ -20,7 +20,7 @@
|
||||
},
|
||||
"speed": {
|
||||
"type": "number",
|
||||
"title":"Speed",
|
||||
"title":"edt_eff_speed_title",
|
||||
"default": 1.0,
|
||||
"minimum": 0.1,
|
||||
"step" : 0.1,
|
||||
@ -28,7 +28,7 @@
|
||||
},
|
||||
"fadeFactor": {
|
||||
"type": "number",
|
||||
"title":"Fade Factor",
|
||||
"title":"edt_eff_fadefactor_title",
|
||||
"default": 0.7,
|
||||
"minimum" : 0.0,
|
||||
"maximum" : 0.9,
|
||||
|
@ -1,12 +1,12 @@
|
||||
{
|
||||
"type":"object",
|
||||
"script" : "light-clock.py",
|
||||
"title":"Light clock",
|
||||
"title":"edt_eff_lightclock_header_title",
|
||||
"required":true,
|
||||
"properties":{
|
||||
"show_seconds": {
|
||||
"type": "boolean",
|
||||
"title":"Show seconds",
|
||||
"title":"edt_eff_showseconds_title",
|
||||
"default": true,
|
||||
"propertyOrder" : 1
|
||||
}
|
||||
|
@ -1,12 +1,12 @@
|
||||
{
|
||||
"type":"object",
|
||||
"script" : "mood-blobs.py",
|
||||
"title":"Mood Blobs",
|
||||
"title":"edt_eff_moodblobs_header_title",
|
||||
"required":true,
|
||||
"properties":{
|
||||
"color": {
|
||||
"type": "array",
|
||||
"title":"Color",
|
||||
"title":"edt_eff_color_title",
|
||||
"format":"colorpicker",
|
||||
"default": [255,0,0],
|
||||
"items" : {
|
||||
@ -20,68 +20,69 @@
|
||||
},
|
||||
"blobs": {
|
||||
"type": "integer",
|
||||
"title":"Blob count",
|
||||
"title":"edt_eff_blobcount_title",
|
||||
"default": 5,
|
||||
"minimum" : 1,
|
||||
"propertyOrder" : 2
|
||||
},
|
||||
"rotationTime": {
|
||||
"type": "number",
|
||||
"title":"Rotation time",
|
||||
"title":"edt_eff_rotationtime_title",
|
||||
"default": 20.0,
|
||||
"minimum" : 1.0,
|
||||
"append" : "edt_append_s",
|
||||
"propertyOrder" : 3
|
||||
},
|
||||
"hueChange": {
|
||||
"type": "number",
|
||||
"title":"Hue change",
|
||||
"title":"edt_eff_huechange_title",
|
||||
"default": 60.0,
|
||||
"minimum" : 1.0,
|
||||
"propertyOrder" : 4
|
||||
},
|
||||
"reverse": {
|
||||
"type": "boolean",
|
||||
"title":"Reverse direction",
|
||||
"title":"edt_eff_reversedirection_title",
|
||||
"default": false,
|
||||
"propertyOrder" : 5
|
||||
},
|
||||
"colorRandom": {
|
||||
"type": "boolean",
|
||||
"title":"Random color",
|
||||
"title":"edt_eff_colorrandom_title",
|
||||
"default": false,
|
||||
"propertyOrder" : 6
|
||||
},
|
||||
"baseChange": {
|
||||
"type": "boolean",
|
||||
"title":"Base color change",
|
||||
"title":"edt_eff_basecolorchange_title",
|
||||
"default": false,
|
||||
"propertyOrder" : 7
|
||||
},
|
||||
"baseColorRangeLeft": {
|
||||
"type": "number",
|
||||
"title":"baseColorRangeLeft",
|
||||
"title":"edt_eff_basecolorrangeleft_title",
|
||||
"default": 0.0,
|
||||
"minimum" : 0.0,
|
||||
"maximum" : 360.0,
|
||||
"append" : "° (Degree)",
|
||||
"propertyOrder" : 8
|
||||
"append" : "edt_append_degree",
|
||||
"propertyOrder" : 9
|
||||
},
|
||||
"baseColorRangeRight": {
|
||||
"type": "number",
|
||||
"title":"baseColorRangeRight",
|
||||
"title":"edt_eff_basecolorrangeright_title",
|
||||
"default": 360.0,
|
||||
"minimum" : 0.0,
|
||||
"maximum" : 360.0,
|
||||
"append" : "° (Degree)",
|
||||
"propertyOrder" : 9
|
||||
"append" : "edt_append_degree",
|
||||
"propertyOrder" : 10
|
||||
},
|
||||
"baseColorChangeRate": {
|
||||
"type": "number",
|
||||
"title":"baseColorChangeRate",
|
||||
"title":"edt_eff_basecolorchangerate_title",
|
||||
"default": 2.0,
|
||||
"minimum" : 0.0,
|
||||
"append" : "Seconds for one degree",
|
||||
"propertyOrder" : 10
|
||||
"append" : "edt_append_sdegree",
|
||||
"propertyOrder" : 8
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
|
@ -1,12 +1,12 @@
|
||||
{
|
||||
"type":"object",
|
||||
"script" : "police.py",
|
||||
"title":"Police",
|
||||
"title":"edt_eff_police_header_title",
|
||||
"required":true,
|
||||
"properties":{
|
||||
"color_one": {
|
||||
"type": "array",
|
||||
"title":"Color one",
|
||||
"title":"edt_eff_colorone_title",
|
||||
"format":"colorpicker",
|
||||
"default": [255,0,0],
|
||||
"items" : {
|
||||
@ -20,7 +20,7 @@
|
||||
},
|
||||
"color_two": {
|
||||
"type": "array",
|
||||
"title":"Color two",
|
||||
"title":"edt_eff_colortwo_title",
|
||||
"format":"colorpicker",
|
||||
"default": [0,0,255],
|
||||
"items" : {
|
||||
@ -34,22 +34,22 @@
|
||||
},
|
||||
"colors_count": {
|
||||
"type": "integer",
|
||||
"title":"Color length",
|
||||
"title":"edt_eff_colorcount_title",
|
||||
"default": 10,
|
||||
"minimum" : 0,
|
||||
"propertyOrder" : 3
|
||||
},
|
||||
"rotation-time": {
|
||||
"type": "number",
|
||||
"title":"Rotation time",
|
||||
"title":"edt_eff_rotationtime_title",
|
||||
"default": 2.0,
|
||||
"minimum" : 0.1,
|
||||
"append" : "s",
|
||||
"append" : "edt_append_s",
|
||||
"propertyOrder" : 4
|
||||
},
|
||||
"reverse": {
|
||||
"type": "boolean",
|
||||
"title":"Reverse direction",
|
||||
"title":"edt_eff_reversedirection_title",
|
||||
"default": false,
|
||||
"propertyOrder" : 5
|
||||
}
|
||||
|
@ -1,31 +1,42 @@
|
||||
{
|
||||
"type":"object",
|
||||
"script" : "rainbow-mood.py",
|
||||
"title":"Rainbow mood",
|
||||
"title":"edt_eff_rainbowmood_header_title",
|
||||
"required":true,
|
||||
"properties":{
|
||||
"rotation-time": {
|
||||
"type": "number",
|
||||
"title":"Rotation time",
|
||||
"title":"edt_eff_rotationtime_title",
|
||||
"default": 60.0,
|
||||
"minimum" : 1.0,
|
||||
"append" : "s",
|
||||
"append" : "edt_append_s",
|
||||
"propertyOrder" : 1
|
||||
},
|
||||
"brightness": {
|
||||
"type": "number",
|
||||
"title":"Brightness",
|
||||
"default": 1.0,
|
||||
"minimum" : 0.1,
|
||||
"maximum" : 1.0,
|
||||
"step" : 0.1,
|
||||
"title":"edt_eff_brightness_title",
|
||||
"default": 100,
|
||||
"minimum" : 1,
|
||||
"maximum" : 100,
|
||||
"step" : 10,
|
||||
"append" : "edt_append_percent",
|
||||
"propertyOrder" : 2
|
||||
},
|
||||
"saturation": {
|
||||
"type": "number",
|
||||
"title":"edt_eff_saturation_title",
|
||||
"default": 100,
|
||||
"minimum" : 1,
|
||||
"maximum" : 100,
|
||||
"step" : 10,
|
||||
"append" : "edt_append_percent",
|
||||
"propertyOrder" : 3
|
||||
},
|
||||
"reverse": {
|
||||
"type": "boolean",
|
||||
"title":"Reverse direction",
|
||||
"title":"edt_eff_reversedirection_title",
|
||||
"default": false,
|
||||
"propertyOrder" : 3
|
||||
"propertyOrder" : 4
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
|
@ -1,20 +1,20 @@
|
||||
{
|
||||
"type":"object",
|
||||
"script" : "rainbow-swirl.py",
|
||||
"title":"Rainbow swirl",
|
||||
"title":"edt_eff_rainbowswirl_header_title",
|
||||
"required":true,
|
||||
"properties":{
|
||||
"rotation-time": {
|
||||
"type": "number",
|
||||
"title":"Rotation Time",
|
||||
"title":"edt_eff_rotationtime_title",
|
||||
"default": 10.0,
|
||||
"minimum" : 0.1,
|
||||
"append" : "s",
|
||||
"append" : "edt_append_s",
|
||||
"propertyOrder" : 1
|
||||
},
|
||||
"center_x": {
|
||||
"type": "number",
|
||||
"title":"Center X",
|
||||
"title":"edt_eff_centerx_title",
|
||||
"default": 0.5,
|
||||
"minimum" : 0.0,
|
||||
"maximum" : 2.0,
|
||||
@ -23,7 +23,7 @@
|
||||
},
|
||||
"center_y": {
|
||||
"type": "number",
|
||||
"title":"Center Y",
|
||||
"title":"edt_eff_centery_title",
|
||||
"default": 0.5,
|
||||
"minimum" : 0.0,
|
||||
"maximum" : 2.0,
|
||||
@ -32,7 +32,7 @@
|
||||
},
|
||||
"reverse": {
|
||||
"type": "boolean",
|
||||
"title":"Reverse direction",
|
||||
"title":"edt_eff_reversedirection_title",
|
||||
"default": false,
|
||||
"propertyOrder" : 4
|
||||
}
|
||||
|
@ -1,21 +1,23 @@
|
||||
{
|
||||
"type":"object",
|
||||
"script" : "random.py",
|
||||
"title":"Random",
|
||||
"title":"edt_eff_random_header_title",
|
||||
"required":true,
|
||||
"properties":{
|
||||
"speed": {
|
||||
"type": "number",
|
||||
"title":"Speed",
|
||||
"title":"edt_eff_speed_title",
|
||||
"default": 1.0,
|
||||
"minimum" : 0.0,
|
||||
"propertyOrder" : 1
|
||||
},
|
||||
"saturation": {
|
||||
"type": "number",
|
||||
"title":"Saturation",
|
||||
"title":"edt_eff_saturation_title",
|
||||
"default": 1.0,
|
||||
"minimum" : 0.0,
|
||||
"minimum" : 0.1,
|
||||
"maximum" : 1.0,
|
||||
"step" : 0.1,
|
||||
"propertyOrder" : 2
|
||||
}
|
||||
},
|
||||
|
@ -1,19 +1,19 @@
|
||||
{
|
||||
"type":"object",
|
||||
"script" : "running_dots.py",
|
||||
"title":"Running dots",
|
||||
"title":"edt_eff_runningdots_header_title",
|
||||
"required":true,
|
||||
"properties":{
|
||||
"speed": {
|
||||
"type": "number",
|
||||
"title":"Runner speed",
|
||||
"title":"edt_eff_speed_title",
|
||||
"default": 1.5,
|
||||
"minimum" : 0.1,
|
||||
"propertyOrder" : 1
|
||||
},
|
||||
"colorLevel": {
|
||||
"type": "integer",
|
||||
"title":"Color",
|
||||
"title":"edt_eff_colorevel_title",
|
||||
"default": 220,
|
||||
"minimium" : 0,
|
||||
"maximum" : 255,
|
||||
@ -21,7 +21,7 @@
|
||||
},
|
||||
"whiteLevel": {
|
||||
"type": "integer",
|
||||
"title":"White",
|
||||
"title":"edt_eff_whitelevel_title",
|
||||
"default": 0,
|
||||
"minimium" : 0,
|
||||
"maximum" : 254,
|
||||
|
@ -1,12 +1,12 @@
|
||||
{
|
||||
"type":"object",
|
||||
"script" : "shutdown.py",
|
||||
"title":"System Shutdown",
|
||||
"title":"edt_eff_systemshutdown_header_title",
|
||||
"required":true,
|
||||
"properties":{
|
||||
"speed": {
|
||||
"type": "number",
|
||||
"title":"Speed",
|
||||
"title":"edt_eff_speed_title",
|
||||
"default": 1.0,
|
||||
"minimum" : 0.3,
|
||||
"step" : 0.1,
|
||||
@ -14,7 +14,7 @@
|
||||
},
|
||||
"alarm-color": {
|
||||
"type": "array",
|
||||
"title":"Alarm color",
|
||||
"title":"edt_eff_alarmcolor_title",
|
||||
"format":"colorpicker",
|
||||
"default": [255,0,0],
|
||||
"items" : {
|
||||
@ -28,7 +28,7 @@
|
||||
},
|
||||
"post-color": {
|
||||
"type": "array",
|
||||
"title":"Post color",
|
||||
"title":"edt_eff_postcolor_title",
|
||||
"format" : "colorpicker",
|
||||
"default": [255,174,11],
|
||||
"items" : {
|
||||
@ -42,7 +42,7 @@
|
||||
},
|
||||
"shutdown-enabled": {
|
||||
"type": "boolean",
|
||||
"title":"Real shutdown",
|
||||
"title":"edt_eff_enableshutdown_title",
|
||||
"default": false,
|
||||
"propertyOrder" : 4
|
||||
}
|
||||
|
@ -1,12 +1,12 @@
|
||||
{
|
||||
"type":"object",
|
||||
"script" : "snake.py",
|
||||
"title":"Snake",
|
||||
"title":"edt_eff_snake_header_title",
|
||||
"required":true,
|
||||
"properties":{
|
||||
"color": {
|
||||
"type": "array",
|
||||
"title":"Color",
|
||||
"title":"edt_eff_color_title",
|
||||
"format":"colorpicker",
|
||||
"default": [255,0,0],
|
||||
"items" : {
|
||||
@ -20,17 +20,17 @@
|
||||
},
|
||||
"rotation-time": {
|
||||
"type": "number",
|
||||
"title":"Rotation time",
|
||||
"title":"edt_eff_rotationtime_title",
|
||||
"default": 12.0,
|
||||
"minimum" : 0.1,
|
||||
"append" : "s",
|
||||
"append" : "edt_append_s",
|
||||
"propertyOrder" : 2
|
||||
},
|
||||
"percentage": {
|
||||
"type": "integer",
|
||||
"title":"Length",
|
||||
"title":"edt_eff_length_title",
|
||||
"default": 10,
|
||||
"append" : "%",
|
||||
"append" : "edt_append_percent",
|
||||
"propertyOrder" : 3
|
||||
}
|
||||
},
|
||||
|
@ -1,12 +1,12 @@
|
||||
{
|
||||
"type":"object",
|
||||
"script" : "sparks.py",
|
||||
"title":"Sparks",
|
||||
"title":"edt_eff_sparks_header_title",
|
||||
"required":true,
|
||||
"properties":{
|
||||
"color": {
|
||||
"type": "array",
|
||||
"title":"Color",
|
||||
"title":"edt_eff_color_title",
|
||||
"format":"colorpicker",
|
||||
"default": [255,0,0],
|
||||
"items" : {
|
||||
@ -20,41 +20,46 @@
|
||||
},
|
||||
"rotation-time": {
|
||||
"type": "number",
|
||||
"title":"Rotation time",
|
||||
"title":"edt_eff_rotationtime_title",
|
||||
"default": 2.0,
|
||||
"minimum" : 0.1,
|
||||
"append" : "edt_append_s",
|
||||
"propertyOrder" : 2
|
||||
},
|
||||
"sleep-time": {
|
||||
"type": "number",
|
||||
"title":"Sleep time",
|
||||
"title":"edt_eff_sleeptime_title",
|
||||
"default": 0.05,
|
||||
"minimum" : 0.01,
|
||||
"propertyOrder" : 3
|
||||
},
|
||||
"brightness": {
|
||||
"type": "number",
|
||||
"title":"Brightness",
|
||||
"default": 1.0,
|
||||
"minimum" : 0.01,
|
||||
"title":"edt_eff_brightness_title",
|
||||
"default": 100,
|
||||
"minimum" : 1,
|
||||
"step" : 10,
|
||||
"append" : "edt_append_percent",
|
||||
"propertyOrder" : 4
|
||||
},
|
||||
"saturation": {
|
||||
"type": "number",
|
||||
"title":"Saturation",
|
||||
"default": 1.0,
|
||||
"minimum" : 0.01,
|
||||
"title":"edt_eff_saturation_title",
|
||||
"default": 100,
|
||||
"minimum" : 1,
|
||||
"step" : 10,
|
||||
"append" : "edt_append_percent",
|
||||
"propertyOrder" : 5
|
||||
},
|
||||
"reverse": {
|
||||
"type": "boolean",
|
||||
"title":"Reverse direction",
|
||||
"title":"edt_eff_reversedirection_title",
|
||||
"default": false,
|
||||
"propertyOrder" : 6
|
||||
},
|
||||
"random-color": {
|
||||
"type": "boolean",
|
||||
"title":"Random color",
|
||||
"title":"edt_eff_colorrandom_title",
|
||||
"default": false,
|
||||
"propertyOrder" : 7
|
||||
}
|
||||
|
@ -1,12 +1,12 @@
|
||||
{
|
||||
"type":"object",
|
||||
"script" : "strobe.py",
|
||||
"title":"Strobe",
|
||||
"title":"edt_eff_storbe_header_title",
|
||||
"required":true,
|
||||
"properties":{
|
||||
"color": {
|
||||
"type": "array",
|
||||
"title":"Color",
|
||||
"title":"edt_eff_color_title",
|
||||
"format":"colorpicker",
|
||||
"default": [255,0,0],
|
||||
"items" : {
|
||||
@ -20,10 +20,10 @@
|
||||
},
|
||||
"frequency": {
|
||||
"type": "number",
|
||||
"title":"Frequency",
|
||||
"title":"edt_eff_frequency_title",
|
||||
"default": 10.0,
|
||||
"minimum" : 0.1,
|
||||
"append" : "Hz",
|
||||
"append" : "edt_append_hz",
|
||||
"propertyOrder" : 2
|
||||
}
|
||||
},
|
||||
|
@ -1,12 +1,12 @@
|
||||
{
|
||||
"type":"object",
|
||||
"script" : "traces.py",
|
||||
"title":"Color traces",
|
||||
"title":"edt_eff_traces_header_title",
|
||||
"required":true,
|
||||
"properties":{
|
||||
"speed": {
|
||||
"type": "number",
|
||||
"title":"Speed",
|
||||
"title":"edt_eff_speed_title",
|
||||
"default": 1.0,
|
||||
"minimum" : 0.1,
|
||||
"propertyOrder" : 1
|
||||
|
65
effects/schema/trails.schema.json
Normal file
65
effects/schema/trails.schema.json
Normal file
@ -0,0 +1,65 @@
|
||||
{
|
||||
"type":"object",
|
||||
"script" : "trails.py",
|
||||
"title":"edt_eff_trails_header_title",
|
||||
"required":true,
|
||||
"properties":{
|
||||
"min_len": {
|
||||
"type": "integer",
|
||||
"title":"edt_eff_min_len_title",
|
||||
"default": 2,
|
||||
"minimum" : 1,
|
||||
"propertyOrder" : 1
|
||||
},
|
||||
"max_len": {
|
||||
"type": "integer",
|
||||
"title":"edt_eff_max_len_title",
|
||||
"default": 7,
|
||||
"minimum" : 1,
|
||||
"propertyOrder" : 2
|
||||
},
|
||||
"height": {
|
||||
"type": "integer",
|
||||
"title":"edt_eff_height_title",
|
||||
"default": 8,
|
||||
"minimum" : 1,
|
||||
"propertyOrder" : 3
|
||||
},
|
||||
"trails": {
|
||||
"type": "integer",
|
||||
"title":"edt_eff_count_title",
|
||||
"default": 3,
|
||||
"minimum" : 1,
|
||||
"propertyOrder" : 4
|
||||
},
|
||||
"speed": {
|
||||
"type": "number",
|
||||
"title":"edt_eff_speed_title",
|
||||
"default": 1.0,
|
||||
"minimum" : 0.1,
|
||||
"propertyOrder" : 5
|
||||
},
|
||||
"random": {
|
||||
"type": "boolean",
|
||||
"title":"edt_eff_colorrandom_title",
|
||||
"default": false,
|
||||
"propertyOrder" : 6
|
||||
},
|
||||
"color": {
|
||||
"type": "array",
|
||||
"title":"edt_eff_color_title",
|
||||
"format":"colorpicker",
|
||||
"default": [255,0,0],
|
||||
"items" : {
|
||||
"type": "integer",
|
||||
"minimum": 0,
|
||||
"maximum": 255
|
||||
},
|
||||
"minItems": 3,
|
||||
"maxItems": 3,
|
||||
"propertyOrder" : 7
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user