mirror of
https://github.com/hyperion-project/hyperion.ng.git
synced 2025-03-01 10:33:28 +00:00
Merge remote-tracking branch 'upstream/master' into temperture
This commit is contained in:
@@ -0,0 +1,655 @@
|
||||
#include <NeoPixelBus.h>
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
///////////////////////// CONFIG SECTION STARTS /////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#define THIS_IS_RGBW // RGBW SK6812, otherwise comment it
|
||||
#define COLD_WHITE // for RGBW (THIS_IS_RGBW enabled) select COLD version, comment it if NEUTRAL
|
||||
|
||||
const bool skipFirstLed = false; // if set the first led in the strip will be set to black (for level shifters using sacrifice LED)
|
||||
const int serialSpeed = 2000000; // serial port speed
|
||||
#define DATA_PIN 2 // PIN: data output for LED strip
|
||||
|
||||
const bool reportStats = false; // Send back processing statistics
|
||||
const int reportStatInterval_s = 10; // Send back processing every interval in seconds
|
||||
|
||||
/* Statistics breakdown:
|
||||
FPS: Updates to the LEDs per second
|
||||
F-FPS: Frames identified per second
|
||||
S: Shown (Done) updates to the LEDs per given interval
|
||||
F: Frames identified per interval (garbled grames cannot be counted)
|
||||
G: Good frames identified per interval
|
||||
B: Total bad frames of all types identified per interval
|
||||
BF: Bad frames identified per interval
|
||||
BS: Skipped incomplete frames
|
||||
BC: Frames failing CRC check per interval
|
||||
BFL Frames failing Fletcher content validation per interval
|
||||
*/
|
||||
|
||||
//Developer configs
|
||||
#define ENABLE_STRIP
|
||||
#define ENABLE_CHECK_FLETCHER
|
||||
|
||||
const int SERIAL_SIZE_RX = 4096;
|
||||
|
||||
#ifndef ENABLE_STRIP
|
||||
const int serial2Speed = 460800;
|
||||
const bool reportInput = false;
|
||||
#endif
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
///////////////////////// CONFIG SECTION ENDS /////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
const String version = "8.0";
|
||||
|
||||
#ifdef THIS_IS_RGBW
|
||||
float whiteLimit = 1.0f;
|
||||
#ifdef COLD_WHITE
|
||||
uint8_t rCorrection = 0xA0; // adjust red -> white in 0-0xFF range
|
||||
uint8_t gCorrection = 0xA0; // adjust green -> white in 0-0xFF range
|
||||
uint8_t bCorrection = 0xA0; // adjust blue -> white in 0-0xFF range
|
||||
#else
|
||||
uint8_t rCorrection = 0xB0; // adjust red -> white in 0-0xFF range
|
||||
uint8_t gCorrection = 0xB0; // adjust green -> white in 0-0xFF range
|
||||
uint8_t bCorrection = 0x70; // adjust blue -> white in 0-0xFF range
|
||||
#endif
|
||||
#endif
|
||||
|
||||
int ledCount = 0; // This is dynamic, don't change it
|
||||
int pixelCount = 0; // This is dynamic, don't change it
|
||||
|
||||
#ifdef THIS_IS_RGBW
|
||||
#define LED_TYPE NeoGrbwFeature
|
||||
#if defined(ARDUINO_LOLIN_S2_MINI)
|
||||
#define LED_METHOD NeoEsp32I2s0Sk6812Method
|
||||
#else
|
||||
#define LED_METHOD NeoEsp32I2s1Sk6812Method
|
||||
#endif
|
||||
#else
|
||||
#define LED_TYPE NeoGrbFeature
|
||||
#if defined(ARDUINO_LOLIN_S2_MINI)
|
||||
#define LED_METHOD NeoEsp32I2s0Ws2812xMethod
|
||||
#else
|
||||
#define LED_METHOD NeoEsp32I2s1Ws2812xMethod
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define LED_DRIVER NeoPixelBus<LED_TYPE, LED_METHOD>
|
||||
|
||||
uint8_t* ledBuffer;
|
||||
int ledBufferSize;
|
||||
|
||||
#ifdef ENABLE_STRIP
|
||||
LED_DRIVER* strip = NULL;
|
||||
#endif
|
||||
|
||||
enum class AwaProtocol
|
||||
{
|
||||
HEADER_A,
|
||||
HEADER_w,
|
||||
HEADER_a,
|
||||
HEADER_HI,
|
||||
HEADER_LO,
|
||||
HEADER_CRC,
|
||||
CHANNELCALIB_GAIN,
|
||||
CHANNELCALIB_RED,
|
||||
CHANNELCALIB_GREEN,
|
||||
CHANNELCALIB_BLUE,
|
||||
PIXEL,
|
||||
FLETCHER1,
|
||||
FLETCHER2,
|
||||
FLETCHER_EXT
|
||||
};
|
||||
|
||||
AwaProtocol state = AwaProtocol::HEADER_A;
|
||||
|
||||
const int headerSize = 6;
|
||||
const int trailerSize = 3;
|
||||
const int calibInfoSize = 4;
|
||||
int bytesRead = 0;
|
||||
|
||||
bool isVersion2 = false;
|
||||
bool isChannelCalib = false;
|
||||
uint8_t CRC = 0;
|
||||
int count = 0;
|
||||
int currentPixel = 0;
|
||||
uint16_t fletcher1 = 0;
|
||||
uint16_t fletcher2 = 0;
|
||||
uint16_t fletcherExt = 0;
|
||||
|
||||
#ifdef THIS_IS_RGBW
|
||||
RgbwColor inputColor;
|
||||
uint8_t wChannel[256];
|
||||
uint8_t rChannel[256];
|
||||
uint8_t gChannel[256];
|
||||
uint8_t bChannel[256];
|
||||
#else
|
||||
RgbColor inputColor;
|
||||
#endif
|
||||
|
||||
bool ledsComplete = false;
|
||||
|
||||
// statistics
|
||||
const int reportStatInterval_ms = reportStatInterval_s * 1000;
|
||||
unsigned long curTime;
|
||||
unsigned long stat_start = 0;
|
||||
uint16_t stat_shown = 0;
|
||||
uint16_t stat_frames = 0;
|
||||
uint16_t stat_good = 0;
|
||||
uint16_t stat_bad = 0;
|
||||
|
||||
uint16_t stat_bad_frame = 0;
|
||||
uint16_t stat_bad_skip = 0;
|
||||
uint16_t stat_bad_crc = 0;
|
||||
uint16_t stat_bad_fletcher = 0;
|
||||
|
||||
uint16_t stat_final_shown = 0;
|
||||
uint16_t stat_final_frames = 0;
|
||||
uint16_t stat_final_good = 0;
|
||||
uint16_t stat_final_bad = 0;
|
||||
|
||||
uint16_t stat_final_bad_frame = 0;
|
||||
uint16_t stat_final_bad_skip = 0;
|
||||
uint16_t stat_final_bad_crc = 0;
|
||||
uint16_t stat_final_bad_fletcher = 0;
|
||||
|
||||
//Debugging
|
||||
String inputString;
|
||||
String inputErrorString;
|
||||
String debugString;
|
||||
|
||||
void printStringHex(String string)
|
||||
{
|
||||
#ifndef ENABLE_STRIP
|
||||
Serial2.println(string.length());
|
||||
for (int i = 0; i < string.length(); ++i)
|
||||
{
|
||||
if (i % 36 == 0)
|
||||
{
|
||||
Serial2.println();
|
||||
Serial2.print("[");
|
||||
Serial2.print(i);
|
||||
Serial2.print("] ");
|
||||
}
|
||||
|
||||
if (string[i] < 16)
|
||||
Serial2.print("0");
|
||||
Serial2.print(string[i], HEX);
|
||||
Serial2.print(":");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
inline void showMe()
|
||||
{
|
||||
#ifdef ENABLE_STRIP
|
||||
if (strip != NULL && strip->CanShow())
|
||||
{
|
||||
stat_shown++;
|
||||
strip->Show();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
// statistics
|
||||
inline void showStats()
|
||||
{
|
||||
if (reportStats)
|
||||
{
|
||||
if (stat_frames > 0)
|
||||
{
|
||||
stat_final_shown = stat_shown;
|
||||
stat_final_frames = stat_frames;
|
||||
stat_final_good = stat_good;
|
||||
stat_final_bad = stat_bad;
|
||||
|
||||
stat_final_bad_frame = stat_bad_frame;
|
||||
stat_final_bad_skip = stat_bad_skip;
|
||||
stat_final_bad_crc = stat_bad_crc;
|
||||
stat_final_bad_fletcher = stat_bad_fletcher;
|
||||
}
|
||||
|
||||
stat_start = curTime;
|
||||
stat_shown = 0;
|
||||
stat_frames = 0;
|
||||
stat_good = 0;
|
||||
stat_bad = 0;
|
||||
|
||||
stat_bad_frame = 0;
|
||||
stat_bad_skip = 0;
|
||||
stat_bad_crc = 0;
|
||||
stat_bad_fletcher = 0;
|
||||
|
||||
String summary = String("FPS: ") + (stat_final_shown / reportStatInterval_s) +
|
||||
" F-FPS: " + (stat_final_frames / reportStatInterval_s) +
|
||||
" S: " + stat_final_shown +
|
||||
" F: " + stat_final_frames +
|
||||
" G: " + stat_final_good +
|
||||
" B: " + stat_final_bad +
|
||||
" (BF: " + stat_final_bad_frame +
|
||||
" BS: " + stat_final_bad_skip +
|
||||
" BC: " + stat_final_bad_crc +
|
||||
" BFL: " + stat_final_bad_fletcher +
|
||||
")";
|
||||
#ifdef ENABLE_STRIP
|
||||
Serial.println(summary);
|
||||
#else
|
||||
Serial2.println(summary);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
void InitLeds(uint16_t ledCount, int pixelCount, bool channelCalibration = false)
|
||||
{
|
||||
if (ledBuffer != NULL)
|
||||
delete ledBuffer;
|
||||
|
||||
ledBufferSize = pixelCount + (channelCalibration ? calibInfoSize : 0);
|
||||
ledBuffer = new uint8_t[ledBufferSize];
|
||||
|
||||
#ifdef ENABLE_STRIP
|
||||
if (strip != NULL)
|
||||
delete strip;
|
||||
|
||||
strip = new LED_DRIVER(ledCount, DATA_PIN);
|
||||
strip->Begin();
|
||||
#endif
|
||||
}
|
||||
|
||||
inline void processSerialData()
|
||||
{
|
||||
while (Serial.available()) {
|
||||
|
||||
char input = Serial.read();
|
||||
++bytesRead;
|
||||
|
||||
#ifndef ENABLE_STRIP
|
||||
if (reportInput)
|
||||
inputString += input;
|
||||
#endif
|
||||
|
||||
switch (state)
|
||||
{
|
||||
case AwaProtocol::HEADER_A:
|
||||
if (input == 'A')
|
||||
{
|
||||
state = AwaProtocol::HEADER_w;
|
||||
}
|
||||
break;
|
||||
|
||||
case AwaProtocol::HEADER_w:
|
||||
if (input == 'w')
|
||||
state = AwaProtocol::HEADER_a;
|
||||
else
|
||||
{
|
||||
state = AwaProtocol::HEADER_A;
|
||||
}
|
||||
break;
|
||||
|
||||
case AwaProtocol::HEADER_a:
|
||||
if (input == 'a')
|
||||
{
|
||||
isVersion2 = false;
|
||||
state = AwaProtocol::HEADER_HI;
|
||||
}
|
||||
else if (input == 'A')
|
||||
{
|
||||
state = AwaProtocol::HEADER_HI;
|
||||
isVersion2 = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
state = AwaProtocol::HEADER_A;
|
||||
}
|
||||
break;
|
||||
|
||||
case AwaProtocol::HEADER_HI:
|
||||
|
||||
stat_frames++;
|
||||
|
||||
count = input << 8;
|
||||
|
||||
CRC = input;
|
||||
fletcher1 = 0;
|
||||
fletcher2 = 0;
|
||||
fletcherExt = 0;
|
||||
state = AwaProtocol::HEADER_LO;
|
||||
break;
|
||||
|
||||
case AwaProtocol::HEADER_LO:
|
||||
count += input + 1;
|
||||
|
||||
if (ledCount != count || isChannelCalib != isVersion2)
|
||||
{
|
||||
ledCount = count;
|
||||
isChannelCalib = isVersion2;
|
||||
pixelCount = ledCount * 3;
|
||||
|
||||
if (isChannelCalib)
|
||||
prepareCalibration();
|
||||
|
||||
InitLeds(ledCount, pixelCount, isChannelCalib);
|
||||
}
|
||||
|
||||
CRC = CRC ^ input ^ 0x55;
|
||||
|
||||
state = AwaProtocol::HEADER_CRC;
|
||||
|
||||
break;
|
||||
|
||||
case AwaProtocol::HEADER_CRC:
|
||||
|
||||
// Check, if incomplete package information was skipped, set bytesread to headersize and skip wrong input
|
||||
if (bytesRead != headerSize)
|
||||
{
|
||||
stat_bad_skip++;
|
||||
bytesRead = headerSize;
|
||||
}
|
||||
|
||||
currentPixel = 0;
|
||||
if (CRC == input)
|
||||
{
|
||||
state = AwaProtocol::PIXEL;
|
||||
}
|
||||
else
|
||||
{
|
||||
// CRC failure
|
||||
stat_bad++;
|
||||
stat_bad_crc++;
|
||||
|
||||
state = AwaProtocol::HEADER_A;
|
||||
}
|
||||
break;
|
||||
|
||||
case AwaProtocol::PIXEL:
|
||||
ledBuffer[currentPixel++] = input;
|
||||
if (currentPixel == pixelCount)
|
||||
{
|
||||
if (isChannelCalib)
|
||||
state = AwaProtocol::CHANNELCALIB_GAIN;
|
||||
else
|
||||
state = AwaProtocol::FLETCHER1;
|
||||
}
|
||||
break;
|
||||
|
||||
case AwaProtocol::CHANNELCALIB_GAIN:
|
||||
ledBuffer[currentPixel++] = input;
|
||||
state = AwaProtocol::CHANNELCALIB_RED;
|
||||
break;
|
||||
|
||||
case AwaProtocol::CHANNELCALIB_RED:
|
||||
ledBuffer[currentPixel++] = input;
|
||||
|
||||
state = AwaProtocol::CHANNELCALIB_GREEN;
|
||||
break;
|
||||
|
||||
case AwaProtocol::CHANNELCALIB_GREEN:
|
||||
ledBuffer[currentPixel++] = input;
|
||||
|
||||
state = AwaProtocol::CHANNELCALIB_BLUE;
|
||||
break;
|
||||
|
||||
case AwaProtocol::CHANNELCALIB_BLUE:
|
||||
ledBuffer[currentPixel++] = input;
|
||||
|
||||
state = AwaProtocol::FLETCHER1;
|
||||
break;
|
||||
|
||||
case AwaProtocol::FLETCHER1:
|
||||
fletcher1 = input;
|
||||
|
||||
state = AwaProtocol::FLETCHER2;
|
||||
break;
|
||||
|
||||
case AwaProtocol::FLETCHER2:
|
||||
fletcher2 = input;
|
||||
|
||||
state = AwaProtocol::FLETCHER_EXT;
|
||||
break;
|
||||
|
||||
case AwaProtocol::FLETCHER_EXT:
|
||||
fletcherExt = input;
|
||||
ledsComplete = true;
|
||||
|
||||
state = AwaProtocol::HEADER_A;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void setup()
|
||||
{
|
||||
// Init serial port
|
||||
int bufSize = Serial.setRxBufferSize(SERIAL_SIZE_RX);
|
||||
Serial.begin(serialSpeed);
|
||||
Serial.setTimeout(50);
|
||||
|
||||
#ifndef ENABLE_STRIP
|
||||
Serial2.begin(serial2Speed);
|
||||
|
||||
Serial2.println();
|
||||
Serial2.println("Welcome!");
|
||||
Serial2.println("Hyperion Awa driver " + version);
|
||||
Serial2.println("!!! Debug Output !!!");
|
||||
#endif
|
||||
|
||||
// Display config
|
||||
Serial.println();
|
||||
Serial.println("Welcome!");
|
||||
Serial.println("Hyperion Awa driver " + version);
|
||||
Serial.print("(Build: ");
|
||||
Serial.print(__DATE__);
|
||||
Serial.print(" ");
|
||||
Serial.print(__TIME__);
|
||||
Serial.println(")");
|
||||
|
||||
// first LED info
|
||||
if (skipFirstLed)
|
||||
Serial.println("First LED: disabled");
|
||||
else
|
||||
Serial.println("First LED: enabled");
|
||||
|
||||
// RGBW claibration info
|
||||
#ifdef THIS_IS_RGBW
|
||||
#ifdef COLD_WHITE
|
||||
Serial.println("Default color mode: RGBW cold");
|
||||
#else
|
||||
Serial.println("Default color mode: RGBW neutral");
|
||||
#endif
|
||||
prepareCalibration();
|
||||
#else
|
||||
Serial.println("Color mode: RGB");
|
||||
#endif
|
||||
|
||||
InitLeds(ledCount, pixelCount);
|
||||
}
|
||||
|
||||
void prepareCalibration()
|
||||
{
|
||||
#ifdef THIS_IS_RGBW
|
||||
// prepare LUT calibration table, cold white is much better than "neutral" white
|
||||
for (uint32_t i = 0; i < 256; i++)
|
||||
{
|
||||
// color calibration
|
||||
float red = rCorrection * i; // adjust red
|
||||
float green = gCorrection * i; // adjust green
|
||||
float blue = bCorrection * i; // adjust blue
|
||||
|
||||
wChannel[i] = (uint8_t)round(min(whiteLimit * i, 255.0f));
|
||||
rChannel[i] = (uint8_t)round(min(red / 0xFF, 255.0f));
|
||||
gChannel[i] = (uint8_t)round(min(green / 0xFF, 255.0f));
|
||||
bChannel[i] = (uint8_t)round(min(blue / 0xFF, 255.0f));
|
||||
}
|
||||
|
||||
Serial.write("RGBW calibration. White limit(%): ");
|
||||
Serial.print(whiteLimit * 100.0f);
|
||||
Serial.write(" %, red: ");
|
||||
Serial.print(rCorrection);
|
||||
Serial.write(" , green: ");
|
||||
Serial.print(gCorrection);
|
||||
Serial.write(" , blue: ");
|
||||
Serial.print(bCorrection);
|
||||
Serial.println();
|
||||
#endif
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
curTime = millis();
|
||||
|
||||
#ifdef __AVR__
|
||||
// nothing , USART Interrupt is implemented
|
||||
ESPserialEvent();
|
||||
#else
|
||||
// ESP8266 polling
|
||||
ESPserialEvent();
|
||||
#endif
|
||||
|
||||
if (ledsComplete)
|
||||
{
|
||||
#ifndef ENABLE_STRIP
|
||||
if (reportInput)
|
||||
{
|
||||
Serial2.println();
|
||||
Serial2.print("<input> L: ");
|
||||
printStringHex(inputString);
|
||||
Serial2.println("<\input>");
|
||||
inputString = "";
|
||||
|
||||
Serial2.print("bytesRead: ");
|
||||
Serial2.print(bytesRead);
|
||||
Serial2.print(" , currentPixel: ");
|
||||
Serial2.print(currentPixel);
|
||||
Serial2.print(" ,pixelCount: ");
|
||||
Serial2.print(pixelCount);
|
||||
Serial2.println();
|
||||
}
|
||||
#endif
|
||||
|
||||
int frameSize = headerSize + ledBufferSize + trailerSize;
|
||||
|
||||
if (bytesRead > frameSize)
|
||||
{
|
||||
//Add number of frames ignored on top of frame
|
||||
int frames = bytesRead / frameSize;
|
||||
stat_frames += frames;
|
||||
|
||||
//Count frame plus frames ignored as bad frames
|
||||
int badFrames = frames + 1;
|
||||
stat_bad += badFrames;
|
||||
stat_bad_frame += badFrames;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
#ifdef ENABLE_CHECK_FLETCHER
|
||||
//Test if content is valid
|
||||
uint16_t item = 0;
|
||||
uint16_t fletch1 = 0;
|
||||
uint16_t fletch2 = 0;
|
||||
uint16_t fletchExt = 0;
|
||||
|
||||
while (item < ledBufferSize)
|
||||
{
|
||||
fletch1 = (fletch1 + (uint16_t)ledBuffer[item]) % 255;
|
||||
fletch2 = (fletch2 + fletch1) % 255;
|
||||
fletcherExt = (fletcherExt + ((uint16_t)ledBuffer[item] ^ (item))) % 255;
|
||||
++item;
|
||||
}
|
||||
if ((fletch1 == fletcher1) && (fletch2 == fletcher2) && (ledBuffer[item-1] == (fletcherExt != 0x41) ? fletcherExt : 0xaa))
|
||||
{
|
||||
#endif
|
||||
stat_good++;
|
||||
|
||||
uint16_t startLed = 0;
|
||||
if (skipFirstLed)
|
||||
{
|
||||
#ifdef ENABLE_STRIP
|
||||
#ifdef THIS_IS_RGBW
|
||||
strip->SetPixelColor(startLed, RgbwColor(0, 0, 0, 0));
|
||||
#else
|
||||
strip->SetPixelColor(startLed, RgbColor(0, 0, 0));
|
||||
#endif
|
||||
#endif
|
||||
startLed = 1;
|
||||
}
|
||||
|
||||
for (uint16_t led = startLed; led < ledCount; ++led)
|
||||
{
|
||||
inputColor.R = ledBuffer[led * 3];
|
||||
inputColor.G = ledBuffer[led * 3 + 1];
|
||||
inputColor.B = ledBuffer[led * 3 + 2];
|
||||
|
||||
#ifdef THIS_IS_RGBW
|
||||
inputColor.W = min(rChannel[inputColor.R],
|
||||
min(gChannel[inputColor.G],
|
||||
bChannel[inputColor.B]));
|
||||
inputColor.R -= rChannel[inputColor.W];
|
||||
inputColor.G -= gChannel[inputColor.W];
|
||||
inputColor.B -= bChannel[inputColor.W];
|
||||
inputColor.W = wChannel[inputColor.W];
|
||||
#endif
|
||||
#ifdef ENABLE_STRIP
|
||||
strip->SetPixelColor(led, inputColor);
|
||||
#endif
|
||||
}
|
||||
|
||||
showMe();
|
||||
yield();
|
||||
|
||||
#ifdef THIS_IS_RGBW
|
||||
if (isChannelCalib)
|
||||
{
|
||||
uint8_t incoming_gain = ledBuffer[pixelCount];
|
||||
uint8_t incoming_red = ledBuffer[pixelCount + 1];
|
||||
uint8_t incoming_green = ledBuffer[pixelCount + 2];
|
||||
uint8_t incoming_blue = ledBuffer[pixelCount + 3];
|
||||
|
||||
float final_limit = (incoming_gain != 255) ? incoming_gain / 255.0f : 1.0f;
|
||||
if (rCorrection != incoming_red || gCorrection != incoming_green || bCorrection != incoming_blue || whiteLimit != final_limit)
|
||||
{
|
||||
rCorrection = incoming_red;
|
||||
gCorrection = incoming_green;
|
||||
bCorrection = incoming_blue;
|
||||
whiteLimit = final_limit;
|
||||
prepareCalibration();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_CHECK_FLETCHER
|
||||
}
|
||||
else
|
||||
{
|
||||
stat_bad++;
|
||||
stat_bad_fletcher++;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
bytesRead = 0;
|
||||
state = AwaProtocol::HEADER_A;
|
||||
|
||||
ledsComplete = false;
|
||||
}
|
||||
|
||||
if ((curTime - stat_start > reportStatInterval_ms))
|
||||
{
|
||||
if (stat_frames > 0)
|
||||
{
|
||||
showStats();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef __AVR__
|
||||
void serialEvent()
|
||||
{
|
||||
processSerialData();
|
||||
}
|
||||
#elif defined(ARDUINO_ARCH_ESP8266) || defined(ARDUINO_ARCH_ESP32)
|
||||
void ESPserialEvent()
|
||||
{
|
||||
processSerialData();
|
||||
}
|
||||
#endif
|
@@ -0,0 +1,646 @@
|
||||
#include <NeoPixelBus.h>
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
///////////////////////// CONFIG SECTION STARTS /////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#define THIS_IS_RGBW // RGBW SK6812, otherwise comment it
|
||||
#define COLD_WHITE // for RGBW (THIS_IS_RGBW enabled) select COLD version, comment it if NEUTRAL
|
||||
|
||||
const bool skipFirstLed = false; // if set the first led in the strip will be set to black (for level shifters using sacrifice LED)
|
||||
const int serialSpeed = 2000000; // serial port speed
|
||||
|
||||
const bool reportStats = false; // Send back processing statistics
|
||||
const int reportStatInterval_s = 10; // Send back processing every interval in seconds
|
||||
|
||||
/* Statistics breakdown:
|
||||
FPS: Updates to the LEDs per second
|
||||
F-FPS: Frames identified per second
|
||||
S: Shown (Done) updates to the LEDs per given interval
|
||||
F: Frames identified per interval (garbled grames cannot be counted)
|
||||
G: Good frames identified per interval
|
||||
B: Total bad frames of all types identified per interval
|
||||
BF: Bad frames identified per interval
|
||||
BS: Skipped incomplete frames
|
||||
BC: Frames failing CRC check per interval
|
||||
BFL Frames failing Fletcher content validation per interval
|
||||
*/
|
||||
|
||||
//Developer configs
|
||||
#define ENABLE_STRIP
|
||||
#define ENABLE_CHECK_FLETCHER
|
||||
|
||||
const int SERIAL_SIZE_RX = 4096;
|
||||
|
||||
#ifndef ENABLE_STRIP
|
||||
const int serial2Speed = 460800;
|
||||
const bool reportInput = false;
|
||||
#endif
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
///////////////////////// CONFIG SECTION ENDS /////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
const String version = "8.0";
|
||||
|
||||
#ifdef THIS_IS_RGBW
|
||||
float whiteLimit = 1.0f;
|
||||
#ifdef COLD_WHITE
|
||||
uint8_t rCorrection = 0xA0; // adjust red -> white in 0-0xFF range
|
||||
uint8_t gCorrection = 0xA0; // adjust green -> white in 0-0xFF range
|
||||
uint8_t bCorrection = 0xA0; // adjust blue -> white in 0-0xFF range
|
||||
#else
|
||||
uint8_t rCorrection = 0xB0; // adjust red -> white in 0-0xFF range
|
||||
uint8_t gCorrection = 0xB0; // adjust green -> white in 0-0xFF range
|
||||
uint8_t bCorrection = 0x70; // adjust blue -> white in 0-0xFF range
|
||||
#endif
|
||||
#endif
|
||||
|
||||
int ledCount = 0; // This is dynamic, don't change it
|
||||
int pixelCount = 0; // This is dynamic, don't change it
|
||||
|
||||
#ifdef THIS_IS_RGBW
|
||||
#define LED_TYPE NeoGrbwFeature
|
||||
#define LED_METHOD NeoEsp8266Uart1Sk6812Method
|
||||
#else
|
||||
#define LED_TYPE NeoGrbFeature
|
||||
#define LED_METHOD NeoEsp8266Uart1Ws2812xMethod
|
||||
#endif
|
||||
|
||||
#define LED_DRIVER NeoPixelBus<LED_TYPE, LED_METHOD>
|
||||
|
||||
uint8_t* ledBuffer;
|
||||
int ledBufferSize;
|
||||
|
||||
#ifdef ENABLE_STRIP
|
||||
LED_DRIVER* strip = NULL;
|
||||
#endif
|
||||
|
||||
enum class AwaProtocol
|
||||
{
|
||||
HEADER_A,
|
||||
HEADER_w,
|
||||
HEADER_a,
|
||||
HEADER_HI,
|
||||
HEADER_LO,
|
||||
HEADER_CRC,
|
||||
CHANNELCALIB_GAIN,
|
||||
CHANNELCALIB_RED,
|
||||
CHANNELCALIB_GREEN,
|
||||
CHANNELCALIB_BLUE,
|
||||
PIXEL,
|
||||
FLETCHER1,
|
||||
FLETCHER2,
|
||||
FLETCHER_EXT
|
||||
};
|
||||
|
||||
AwaProtocol state = AwaProtocol::HEADER_A;
|
||||
|
||||
const int headerSize = 6;
|
||||
const int trailerSize = 3;
|
||||
const int calibInfoSize = 4;
|
||||
int bytesRead = 0;
|
||||
|
||||
bool isVersion2 = false;
|
||||
bool isChannelCalib = false;
|
||||
uint8_t CRC = 0;
|
||||
int count = 0;
|
||||
int currentPixel = 0;
|
||||
uint16_t fletcher1 = 0;
|
||||
uint16_t fletcher2 = 0;
|
||||
uint16_t fletcherExt = 0;
|
||||
|
||||
#ifdef THIS_IS_RGBW
|
||||
RgbwColor inputColor;
|
||||
uint8_t wChannel[256];
|
||||
uint8_t rChannel[256];
|
||||
uint8_t gChannel[256];
|
||||
uint8_t bChannel[256];
|
||||
#else
|
||||
RgbColor inputColor;
|
||||
#endif
|
||||
|
||||
bool ledsComplete = false;
|
||||
|
||||
// statistics
|
||||
const int reportStatInterval_ms = reportStatInterval_s * 1000;
|
||||
unsigned long curTime;
|
||||
unsigned long stat_start = 0;
|
||||
uint16_t stat_shown = 0;
|
||||
uint16_t stat_frames = 0;
|
||||
uint16_t stat_good = 0;
|
||||
uint16_t stat_bad = 0;
|
||||
|
||||
uint16_t stat_bad_frame = 0;
|
||||
uint16_t stat_bad_skip = 0;
|
||||
uint16_t stat_bad_crc = 0;
|
||||
uint16_t stat_bad_fletcher = 0;
|
||||
|
||||
uint16_t stat_final_shown = 0;
|
||||
uint16_t stat_final_frames = 0;
|
||||
uint16_t stat_final_good = 0;
|
||||
uint16_t stat_final_bad = 0;
|
||||
|
||||
uint16_t stat_final_bad_frame = 0;
|
||||
uint16_t stat_final_bad_skip = 0;
|
||||
uint16_t stat_final_bad_crc = 0;
|
||||
uint16_t stat_final_bad_fletcher = 0;
|
||||
|
||||
//Debugging
|
||||
String inputString;
|
||||
String inputErrorString;
|
||||
String debugString;
|
||||
|
||||
void printStringHex(String string)
|
||||
{
|
||||
#ifndef ENABLE_STRIP
|
||||
Serial2.println(string.length());
|
||||
for (int i = 0; i < string.length(); ++i)
|
||||
{
|
||||
if (i % 36 == 0)
|
||||
{
|
||||
Serial2.println();
|
||||
Serial2.print("[");
|
||||
Serial2.print(i);
|
||||
Serial2.print("] ");
|
||||
}
|
||||
|
||||
if (string[i] < 16)
|
||||
Serial2.print("0");
|
||||
Serial2.print(string[i], HEX);
|
||||
Serial2.print(":");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
inline void showMe()
|
||||
{
|
||||
#ifdef ENABLE_STRIP
|
||||
if (strip != NULL && strip->CanShow())
|
||||
{
|
||||
stat_shown++;
|
||||
strip->Show();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
// statistics
|
||||
inline void showStats()
|
||||
{
|
||||
if (reportStats)
|
||||
{
|
||||
if (stat_frames > 0)
|
||||
{
|
||||
stat_final_shown = stat_shown;
|
||||
stat_final_frames = stat_frames;
|
||||
stat_final_good = stat_good;
|
||||
stat_final_bad = stat_bad;
|
||||
|
||||
stat_final_bad_frame = stat_bad_frame;
|
||||
stat_final_bad_skip = stat_bad_skip;
|
||||
stat_final_bad_crc = stat_bad_crc;
|
||||
stat_final_bad_fletcher = stat_bad_fletcher;
|
||||
}
|
||||
|
||||
stat_start = curTime;
|
||||
stat_shown = 0;
|
||||
stat_frames = 0;
|
||||
stat_good = 0;
|
||||
stat_bad = 0;
|
||||
|
||||
stat_bad_frame = 0;
|
||||
stat_bad_skip = 0;
|
||||
stat_bad_crc = 0;
|
||||
stat_bad_fletcher = 0;
|
||||
|
||||
String summary = String("FPS: ") + (stat_final_shown / reportStatInterval_s) +
|
||||
" F-FPS: " + (stat_final_frames / reportStatInterval_s) +
|
||||
" S: " + stat_final_shown +
|
||||
" F: " + stat_final_frames +
|
||||
" G: " + stat_final_good +
|
||||
" B: " + stat_final_bad +
|
||||
" (BF: " + stat_final_bad_frame +
|
||||
" BS: " + stat_final_bad_skip +
|
||||
" BC: " + stat_final_bad_crc +
|
||||
" BFL: " + stat_final_bad_fletcher +
|
||||
")";
|
||||
#ifdef ENABLE_STRIP
|
||||
Serial.println(summary);
|
||||
#else
|
||||
Serial2.println(summary);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
void InitLeds(uint16_t ledCount, int pixelCount, bool channelCalibration = false)
|
||||
{
|
||||
if (ledBuffer != NULL)
|
||||
delete ledBuffer;
|
||||
|
||||
ledBufferSize = pixelCount + (channelCalibration ? calibInfoSize : 0);
|
||||
ledBuffer = new uint8_t[ledBufferSize];
|
||||
|
||||
#ifdef ENABLE_STRIP
|
||||
if (strip != NULL)
|
||||
delete strip;
|
||||
|
||||
strip = new LED_DRIVER(ledCount);
|
||||
strip->Begin();
|
||||
#endif
|
||||
}
|
||||
|
||||
inline void processSerialData()
|
||||
{
|
||||
while (Serial.available()) {
|
||||
|
||||
char input = Serial.read();
|
||||
++bytesRead;
|
||||
|
||||
#ifndef ENABLE_STRIP
|
||||
if (reportInput)
|
||||
inputString += input;
|
||||
#endif
|
||||
|
||||
switch (state)
|
||||
{
|
||||
case AwaProtocol::HEADER_A:
|
||||
if (input == 'A')
|
||||
{
|
||||
state = AwaProtocol::HEADER_w;
|
||||
}
|
||||
break;
|
||||
|
||||
case AwaProtocol::HEADER_w:
|
||||
if (input == 'w')
|
||||
state = AwaProtocol::HEADER_a;
|
||||
else
|
||||
{
|
||||
state = AwaProtocol::HEADER_A;
|
||||
}
|
||||
break;
|
||||
|
||||
case AwaProtocol::HEADER_a:
|
||||
if (input == 'a')
|
||||
{
|
||||
isVersion2 = false;
|
||||
state = AwaProtocol::HEADER_HI;
|
||||
}
|
||||
else if (input == 'A')
|
||||
{
|
||||
state = AwaProtocol::HEADER_HI;
|
||||
isVersion2 = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
state = AwaProtocol::HEADER_A;
|
||||
}
|
||||
break;
|
||||
|
||||
case AwaProtocol::HEADER_HI:
|
||||
|
||||
stat_frames++;
|
||||
|
||||
count = input << 8;
|
||||
|
||||
CRC = input;
|
||||
fletcher1 = 0;
|
||||
fletcher2 = 0;
|
||||
fletcherExt = 0;
|
||||
state = AwaProtocol::HEADER_LO;
|
||||
break;
|
||||
|
||||
case AwaProtocol::HEADER_LO:
|
||||
count += input + 1;
|
||||
|
||||
if (ledCount != count || isChannelCalib != isVersion2)
|
||||
{
|
||||
ledCount = count;
|
||||
isChannelCalib = isVersion2;
|
||||
pixelCount = ledCount * 3;
|
||||
|
||||
if (isChannelCalib)
|
||||
prepareCalibration();
|
||||
|
||||
InitLeds(ledCount, pixelCount, isChannelCalib);
|
||||
}
|
||||
|
||||
CRC = CRC ^ input ^ 0x55;
|
||||
|
||||
state = AwaProtocol::HEADER_CRC;
|
||||
|
||||
break;
|
||||
|
||||
case AwaProtocol::HEADER_CRC:
|
||||
|
||||
// Check, if incomplete package information was skipped, set bytesread to headersize and skip wrong input
|
||||
if (bytesRead != headerSize)
|
||||
{
|
||||
stat_bad_skip++;
|
||||
bytesRead = headerSize;
|
||||
}
|
||||
|
||||
currentPixel = 0;
|
||||
if (CRC == input)
|
||||
{
|
||||
state = AwaProtocol::PIXEL;
|
||||
}
|
||||
else
|
||||
{
|
||||
// CRC failure
|
||||
stat_bad++;
|
||||
stat_bad_crc++;
|
||||
|
||||
state = AwaProtocol::HEADER_A;
|
||||
}
|
||||
break;
|
||||
|
||||
case AwaProtocol::PIXEL:
|
||||
ledBuffer[currentPixel++] = input;
|
||||
if (currentPixel == pixelCount)
|
||||
{
|
||||
if (isChannelCalib)
|
||||
state = AwaProtocol::CHANNELCALIB_GAIN;
|
||||
else
|
||||
state = AwaProtocol::FLETCHER1;
|
||||
}
|
||||
break;
|
||||
|
||||
case AwaProtocol::CHANNELCALIB_GAIN:
|
||||
ledBuffer[currentPixel++] = input;
|
||||
state = AwaProtocol::CHANNELCALIB_RED;
|
||||
break;
|
||||
|
||||
case AwaProtocol::CHANNELCALIB_RED:
|
||||
ledBuffer[currentPixel++] = input;
|
||||
|
||||
state = AwaProtocol::CHANNELCALIB_GREEN;
|
||||
break;
|
||||
|
||||
case AwaProtocol::CHANNELCALIB_GREEN:
|
||||
ledBuffer[currentPixel++] = input;
|
||||
|
||||
state = AwaProtocol::CHANNELCALIB_BLUE;
|
||||
break;
|
||||
|
||||
case AwaProtocol::CHANNELCALIB_BLUE:
|
||||
ledBuffer[currentPixel++] = input;
|
||||
|
||||
state = AwaProtocol::FLETCHER1;
|
||||
break;
|
||||
|
||||
case AwaProtocol::FLETCHER1:
|
||||
fletcher1 = input;
|
||||
|
||||
state = AwaProtocol::FLETCHER2;
|
||||
break;
|
||||
|
||||
case AwaProtocol::FLETCHER2:
|
||||
fletcher2 = input;
|
||||
|
||||
state = AwaProtocol::FLETCHER_EXT;
|
||||
break;
|
||||
|
||||
case AwaProtocol::FLETCHER_EXT:
|
||||
fletcherExt = input;
|
||||
ledsComplete = true;
|
||||
|
||||
state = AwaProtocol::HEADER_A;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void setup()
|
||||
{
|
||||
// Init serial port
|
||||
int bufSize = Serial.setRxBufferSize(SERIAL_SIZE_RX);
|
||||
Serial.begin(serialSpeed);
|
||||
Serial.setTimeout(50);
|
||||
|
||||
#ifndef ENABLE_STRIP
|
||||
Serial2.begin(serial2Speed);
|
||||
|
||||
Serial2.println();
|
||||
Serial2.println("Welcome!");
|
||||
Serial2.println("Hyperion Awa driver " + version);
|
||||
Serial2.println("!!! Debug Output !!!");
|
||||
#endif
|
||||
|
||||
// Display config
|
||||
Serial.println();
|
||||
Serial.println("Welcome!");
|
||||
Serial.println("Hyperion Awa driver " + version);
|
||||
Serial.print("(Build: ");
|
||||
Serial.print(__DATE__);
|
||||
Serial.print(" ");
|
||||
Serial.print(__TIME__);
|
||||
Serial.println(")");
|
||||
|
||||
// first LED info
|
||||
if (skipFirstLed)
|
||||
Serial.println("First LED: disabled");
|
||||
else
|
||||
Serial.println("First LED: enabled");
|
||||
|
||||
// RGBW claibration info
|
||||
#ifdef THIS_IS_RGBW
|
||||
#ifdef COLD_WHITE
|
||||
Serial.println("Default color mode: RGBW cold");
|
||||
#else
|
||||
Serial.println("Default color mode: RGBW neutral");
|
||||
#endif
|
||||
prepareCalibration();
|
||||
#else
|
||||
Serial.println("Color mode: RGB");
|
||||
#endif
|
||||
|
||||
InitLeds(ledCount, pixelCount);
|
||||
}
|
||||
|
||||
void prepareCalibration()
|
||||
{
|
||||
#ifdef THIS_IS_RGBW
|
||||
// prepare LUT calibration table, cold white is much better than "neutral" white
|
||||
for (uint32_t i = 0; i < 256; i++)
|
||||
{
|
||||
// color calibration
|
||||
float red = rCorrection * i; // adjust red
|
||||
float green = gCorrection * i; // adjust green
|
||||
float blue = bCorrection * i; // adjust blue
|
||||
|
||||
wChannel[i] = (uint8_t)round(min(whiteLimit * i, 255.0f));
|
||||
rChannel[i] = (uint8_t)round(min(red / 0xFF, 255.0f));
|
||||
gChannel[i] = (uint8_t)round(min(green / 0xFF, 255.0f));
|
||||
bChannel[i] = (uint8_t)round(min(blue / 0xFF, 255.0f));
|
||||
}
|
||||
|
||||
Serial.write("RGBW calibration. White limit(%): ");
|
||||
Serial.print(whiteLimit * 100.0f);
|
||||
Serial.write(" %, red: ");
|
||||
Serial.print(rCorrection);
|
||||
Serial.write(" , green: ");
|
||||
Serial.print(gCorrection);
|
||||
Serial.write(" , blue: ");
|
||||
Serial.print(bCorrection);
|
||||
Serial.println();
|
||||
#endif
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
curTime = millis();
|
||||
|
||||
#ifdef __AVR__
|
||||
// nothing , USART Interrupt is implemented
|
||||
ESPserialEvent();
|
||||
#else
|
||||
// ESP8266 polling
|
||||
ESPserialEvent();
|
||||
#endif
|
||||
|
||||
if (ledsComplete)
|
||||
{
|
||||
#ifndef ENABLE_STRIP
|
||||
if (reportInput)
|
||||
{
|
||||
Serial2.println();
|
||||
Serial2.print("<input> L: ");
|
||||
printStringHex(inputString);
|
||||
Serial2.println("<\input>");
|
||||
inputString = "";
|
||||
|
||||
Serial2.print("bytesRead: ");
|
||||
Serial2.print(bytesRead);
|
||||
Serial2.print(" , currentPixel: ");
|
||||
Serial2.print(currentPixel);
|
||||
Serial2.print(" ,pixelCount: ");
|
||||
Serial2.print(pixelCount);
|
||||
Serial2.println();
|
||||
}
|
||||
#endif
|
||||
|
||||
int frameSize = headerSize + ledBufferSize + trailerSize;
|
||||
|
||||
if (bytesRead > frameSize)
|
||||
{
|
||||
//Add number of frames ignored on top of frame
|
||||
int frames = bytesRead / frameSize;
|
||||
stat_frames += frames;
|
||||
|
||||
//Count frame plus frames ignored as bad frames
|
||||
int badFrames = frames + 1;
|
||||
stat_bad += badFrames;
|
||||
stat_bad_frame += badFrames;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
#ifdef ENABLE_CHECK_FLETCHER
|
||||
//Test if content is valid
|
||||
uint16_t item = 0;
|
||||
uint16_t fletch1 = 0;
|
||||
uint16_t fletch2 = 0;
|
||||
uint16_t fletchExt = 0;
|
||||
|
||||
while (item < ledBufferSize)
|
||||
{
|
||||
fletch1 = (fletch1 + (uint16_t)ledBuffer[item]) % 255;
|
||||
fletch2 = (fletch2 + fletch1) % 255;
|
||||
fletcherExt = (fletcherExt + ((uint16_t)ledBuffer[item] ^ (item))) % 255;
|
||||
++item;
|
||||
}
|
||||
if ((fletch1 == fletcher1) && (fletch2 == fletcher2) && (ledBuffer[item-1] == (fletcherExt != 0x41) ? fletcherExt : 0xaa))
|
||||
{
|
||||
#endif
|
||||
stat_good++;
|
||||
|
||||
uint16_t startLed = 0;
|
||||
if (skipFirstLed)
|
||||
{
|
||||
#ifdef ENABLE_STRIP
|
||||
#ifdef THIS_IS_RGBW
|
||||
strip->SetPixelColor(startLed, RgbwColor(0, 0, 0, 0));
|
||||
#else
|
||||
strip->SetPixelColor(startLed, RgbColor(0, 0, 0));
|
||||
#endif
|
||||
#endif
|
||||
startLed = 1;
|
||||
}
|
||||
|
||||
for (uint16_t led = startLed; led < ledCount; ++led)
|
||||
{
|
||||
inputColor.R = ledBuffer[led * 3];
|
||||
inputColor.G = ledBuffer[led * 3 + 1];
|
||||
inputColor.B = ledBuffer[led * 3 + 2];
|
||||
|
||||
#ifdef THIS_IS_RGBW
|
||||
inputColor.W = min(rChannel[inputColor.R],
|
||||
min(gChannel[inputColor.G],
|
||||
bChannel[inputColor.B]));
|
||||
inputColor.R -= rChannel[inputColor.W];
|
||||
inputColor.G -= gChannel[inputColor.W];
|
||||
inputColor.B -= bChannel[inputColor.W];
|
||||
inputColor.W = wChannel[inputColor.W];
|
||||
#endif
|
||||
#ifdef ENABLE_STRIP
|
||||
strip->SetPixelColor(led, inputColor);
|
||||
#endif
|
||||
}
|
||||
|
||||
showMe();
|
||||
yield();
|
||||
|
||||
#ifdef THIS_IS_RGBW
|
||||
if (isChannelCalib)
|
||||
{
|
||||
uint8_t incoming_gain = ledBuffer[pixelCount];
|
||||
uint8_t incoming_red = ledBuffer[pixelCount + 1];
|
||||
uint8_t incoming_green = ledBuffer[pixelCount + 2];
|
||||
uint8_t incoming_blue = ledBuffer[pixelCount + 3];
|
||||
|
||||
float final_limit = (incoming_gain != 255) ? incoming_gain / 255.0f : 1.0f;
|
||||
if (rCorrection != incoming_red || gCorrection != incoming_green || bCorrection != incoming_blue || whiteLimit != final_limit)
|
||||
{
|
||||
rCorrection = incoming_red;
|
||||
gCorrection = incoming_green;
|
||||
bCorrection = incoming_blue;
|
||||
whiteLimit = final_limit;
|
||||
prepareCalibration();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_CHECK_FLETCHER
|
||||
}
|
||||
else
|
||||
{
|
||||
stat_bad++;
|
||||
stat_bad_fletcher++;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
bytesRead = 0;
|
||||
state = AwaProtocol::HEADER_A;
|
||||
|
||||
ledsComplete = false;
|
||||
}
|
||||
|
||||
if ((curTime - stat_start > reportStatInterval_ms))
|
||||
{
|
||||
if (stat_frames > 0)
|
||||
{
|
||||
showStats();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef __AVR__
|
||||
void serialEvent()
|
||||
{
|
||||
processSerialData();
|
||||
}
|
||||
#elif defined(ARDUINO_ARCH_ESP8266) || defined(ARDUINO_ARCH_ESP32)
|
||||
void ESPserialEvent()
|
||||
{
|
||||
processSerialData();
|
||||
}
|
||||
#endif
|
6
assets/firmware/arduino/network_bridge/udpraw_serialadalight.py
Executable file → Normal file
6
assets/firmware/arduino/network_bridge/udpraw_serialadalight.py
Executable file → Normal file
@@ -153,10 +153,9 @@ to this service over the network.
|
||||
|
||||
srv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||
srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
||||
srv.bind(('0.0.0.0', args.localport)) # lgtm [py/bind-socket-all-network-interfaces]
|
||||
srv.bind(('0.0.0.0', args.localport))
|
||||
|
||||
try:
|
||||
intentional_exit = False
|
||||
while True:
|
||||
try:
|
||||
while True:
|
||||
@@ -180,7 +179,7 @@ to this service over the network.
|
||||
# probably got disconnected
|
||||
break
|
||||
except KeyboardInterrupt:
|
||||
intentional_exit = True
|
||||
# intentional_exit
|
||||
raise
|
||||
except socket.error as msg:
|
||||
if args.develop:
|
||||
@@ -190,6 +189,7 @@ to this service over the network.
|
||||
ser_to_net.socket = None
|
||||
sys.stderr.write('Disconnected\n')
|
||||
except KeyboardInterrupt:
|
||||
# do not handle exceptions
|
||||
pass
|
||||
|
||||
sys.stderr.write('\n--- exit ---\n')
|
||||
|
@@ -322,6 +322,17 @@
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="ltd">
|
||||
<label class="ltdlabel" for="ip_ma_direction" data-i18n="conf_leds_layout_ma_direction">Cabling</label>
|
||||
</td>
|
||||
<td class="itd">
|
||||
<select class="form-control ledMAconstr" id="ip_ma_direction">
|
||||
<option value="horizontal" data-i18n="conf_leds_layout_ma_opthoriz">Horizontal</option>
|
||||
<option value="vertical" data-i18n="conf_leds_layout_ma_optvert">Vertical</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="ltd">
|
||||
<label class="ltdlabel" for="ip_ma_start" data-i18n="conf_leds_layout_ma_position">Input</label>
|
||||
|
@@ -42,6 +42,14 @@
|
||||
<a class="fa fa-cog fa-fw" onclick="SwitchToMenuItem('MenuItemGrabber', 'editor_container_videograbber')" style="text-decoration: none; cursor: pointer"></a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr id="dash_audio_grabber_row">
|
||||
<td></td>
|
||||
<td data-i18n="edt_conf_audio_heading_title">Audio-Grabber</td>
|
||||
<td style="text-align: right; padding-right: 0">
|
||||
<span id="dash_audio_grabber">disabled</span>
|
||||
<a class="fa fa-cog fa-fw" onclick="SwitchToMenuItem('MenuItemGrabber', 'editor_container_audiograbber')" style="text-decoration: none; cursor: pointer"></a>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<table id="dash_ports" class="table borderless">
|
||||
@@ -135,6 +143,7 @@
|
||||
</div>
|
||||
<!-- /.row -->
|
||||
</div>
|
||||
</div>
|
||||
<!-- /.container-fluid -->
|
||||
|
||||
<script src="/js/content_dashboard.js"></script>
|
||||
|
@@ -10,6 +10,9 @@
|
||||
"InfoDialog_nowrite_foottext": "Die Webkonfiguration wird automatisch wieder freigegeben, sobald das Problem behoben wurde!",
|
||||
"InfoDialog_nowrite_text": "Hyperion hat keinen Schreibzugriff auf die aktuell geladene Konfiguration. Bitte korrigiere die Dateizugriffsrechte, um fortzufahren.",
|
||||
"InfoDialog_nowrite_title": "Fehler beim Schreibzugriff!",
|
||||
"InfoDialog_systemRestart_title": "Neustart",
|
||||
"InfoDialog_systemResume_title": "Aktivieren",
|
||||
"InfoDialog_systemSuspend_title": "Ruhezustand",
|
||||
"about_3rd_party_licenses": "Drittanbieter Lizenzen",
|
||||
"about_3rd_party_licenses_error": "Wir hatten Probleme beim Laden der Drittanbieter Lizenzen aus dem Internet. <br />Klicke hier, um die Datei auf GitHub aufzurufen.",
|
||||
"about_build": "Build",
|
||||
@@ -41,6 +44,7 @@
|
||||
"conf_general_inst_title": "LED-Hardware Instanzverwaltung",
|
||||
"conf_general_intro": "Grundsätzliche Einstellungen zu Hyperion oder WebUI, die in keine andere Kategorie passen.",
|
||||
"conf_general_label_title": "Allgemeine Einstellungen",
|
||||
"conf_grabber_audio_intro": "Bei der Audioerfassung wird ein Audioeingabegerät als Quelle für die Visualisierung verwendet.",
|
||||
"conf_grabber_fg_intro": "Bildschirm Aufnahme ist das lokale System auf dem Hyperion installiert wurde, welches als Bildquelle dient.",
|
||||
"conf_grabber_inst_grabber_config_info": "Konfiguriere deine Aufnahmegeräte bevor du sie in einer LED-Instanz benutzt.",
|
||||
"conf_grabber_v4l_intro": "USB-Aufnahme ist ein Gerät, welches via USB angeschlossen ist und als Bildquelle dient.",
|
||||
@@ -55,7 +59,9 @@
|
||||
"conf_leds_error_get_properties_title": "Geräteeigenschaften",
|
||||
"conf_leds_error_hwled_gt_layout": "Die Zahl der gegebenen Hardware LEDs ($1) ist größer, als die Anzahl der im LED-Layout definierten ($2), $3 {{plural:$3|LED wird|LEDs werden}} schwarz bleiben.",
|
||||
"conf_leds_error_hwled_gt_maxled": "Die Zahl der gegebenen Hardware LEDs ($1) ist größer, als die Anzahl der durch den LED-Steuerungstyp unterstützen ($2). <br>Die Anzahl Hardware LEDs wird auf ($3) gesetzt.",
|
||||
"conf_leds_error_hwled_gt_maxled_protocol": "Die Anzahl der Hardware-LEDs ($1) ist größer als die maximale Anzahl der vom Streaming-Protokoll unterstützten LEDs ($2).<br> Das Streaming-Protokoll wird auf ($3) geändert.",
|
||||
"conf_leds_error_hwled_lt_layout": "Die Zahl der gegebenen Hardware LEDs ($1) ist kleiner, als die Anzahl der im LED-Layout definierten ($2). <br> Im LED-Layout dürfen nicht mehr LEDs konfiguriert sein, als vorhanden.",
|
||||
"conf_leds_error_wled_segment_missing": "Das aktuell konfigurierte Segment ($1) ist in WLED-Gerät nicht konfiguriert.<br> Überprüfe die WLED-Konfiguration!<br>Die Konfigurationsseite zeigt die aktuelle WLED-Einstellung.",
|
||||
"conf_leds_info_ws281x": "Hyperion muss mit 'root' Rechten für diesen LED-Steuerungstyp laufen!",
|
||||
"conf_leds_layout_advanced": "Erweiterte Optionen",
|
||||
"conf_leds_layout_blacklist_num_title": "LED-Anzahl",
|
||||
@@ -229,6 +235,27 @@
|
||||
"edt_append_pixel": "Pixel",
|
||||
"edt_append_s": "s",
|
||||
"edt_append_sdegree": "s/grad",
|
||||
"edt_conf_audio_device_expl": "Ausgewähltes Audio-Eingabegerät",
|
||||
"edt_conf_audio_device_title": "Audio-Eingabegerät",
|
||||
"edt_conf_audio_effect_enum_vumeter": "VU-Meter",
|
||||
"edt_conf_audio_effect_hotcolor_expl": "Farbe die einen hohen Pegel anzeigt.",
|
||||
"edt_conf_audio_effect_hotcolor_title": "Farbe hoher Pegel",
|
||||
"edt_conf_audio_effect_multiplier_expl": "Multiplikator zur Verstärkung des Audiosignals.",
|
||||
"edt_conf_audio_effect_multiplier_title": "Multiplikator",
|
||||
"edt_conf_audio_effect_safecolor_expl": "Farbe die einen niedrigen Pegel anzeigt.",
|
||||
"edt_conf_audio_effect_safecolor_title": "Farbe niedriger Pegel",
|
||||
"edt_conf_audio_effect_safevalue_expl": "Schwellwert bis zu dem ein niedriger Pegel gegeben ist.",
|
||||
"edt_conf_audio_effect_safevalue_title": "Schwellwert niedriger Pegel",
|
||||
"edt_conf_audio_effect_set_defaults": "Zurücksetzen auf Standardwerte",
|
||||
"edt_conf_audio_effect_tolerance_expl": "Toleranz für die automatische Berechnung eines Signalmultiplikators von 0-100",
|
||||
"edt_conf_audio_effect_tolerance_title": "Toleranz",
|
||||
"edt_conf_audio_effect_warncolor_expl": "Farbe die einen mittleren Pegel anzeigt.",
|
||||
"edt_conf_audio_effect_warncolor_title": "Farbe mittlerer Pegel",
|
||||
"edt_conf_audio_effect_warnvalue_expl": "Schwellwert bis zu dem ein mittlerer Pegel gegeben ist.",
|
||||
"edt_conf_audio_effect_warnvalue_title": "Schwellwert mittlerer Pegel",
|
||||
"edt_conf_audio_effects_expl": "Wähle einen Effekt für die Umwandlung des Audiosignals.",
|
||||
"edt_conf_audio_effects_title": "Audio-Effekte",
|
||||
"edt_conf_audio_heading_title": "Audio Aufnahme",
|
||||
"edt_conf_bb_blurRemoveCnt_expl": "Anzahl an Pixeln, die zusätzlich vom Rand abgeschnitten werden.",
|
||||
"edt_conf_bb_blurRemoveCnt_title": "Unscharfe Pixel",
|
||||
"edt_conf_bb_borderFrameCnt_expl": "Anzahl an Bildern bis ein neuer Rand festgelegt wird.",
|
||||
@@ -244,6 +271,8 @@
|
||||
"edt_conf_bb_unknownFrameCnt_title": "Unbekannte Bilder",
|
||||
"edt_conf_bge_heading_title": "Hintergrund Effekt/Farbe",
|
||||
"edt_conf_bobls_heading_title": "Boblight Server",
|
||||
"edt_conf_color_accuracyLevel_expl": "Stufe, wie genau dominante Farben ausgewertet werden. Eine höhere Stufe erzeugt genauere Ergebnisse, erfordert aber auch mehr Rechenleistung. Sollte mit reduzierter Pixelverarbeitung kombiniert werden.",
|
||||
"edt_conf_color_accuracyLevel_title": "Genauigkeitsstufe",
|
||||
"edt_conf_color_backlightColored_expl": "Die Hintergrundbeleuchtung kann mit oder ohne Farbanteile genutzt werden.",
|
||||
"edt_conf_color_backlightColored_title": "Farbige Hintergrundbeleuchtung",
|
||||
"edt_conf_color_backlightThreshold_expl": "Eine Beleuchtung die dauerhaft aktiv ist. (Automatisch deaktiviert bei Effekten, Farben oder im Zustand \"Aus\")",
|
||||
@@ -274,7 +303,7 @@
|
||||
"edt_conf_color_heading_title": "Farbkalibrierung",
|
||||
"edt_conf_color_id_expl": "Eine vom Benutzer frei angegebene ID.",
|
||||
"edt_conf_color_id_title": "ID",
|
||||
"edt_conf_color_imageToLedMappingType_expl": "Sofern nicht \"Mehrfarbig\", wird dein LED-Layout mit einer anderen Bildzuweisung überschrieben",
|
||||
"edt_conf_color_imageToLedMappingType_expl": "Sofern nicht \"Durchschnittsfarbe einfach \", wird dein LED-Layout mit einer anderen Bildzuweisung überschrieben",
|
||||
"edt_conf_color_imageToLedMappingType_title": "LED-Bereich Zuordnungstyp",
|
||||
"edt_conf_color_leds_expl": "Zugewiesen zu allen (*) LEDs oder nur zu bestimmten LED Nummern (0-17).",
|
||||
"edt_conf_color_leds_title": "LED-Iindex",
|
||||
@@ -282,6 +311,8 @@
|
||||
"edt_conf_color_magenta_title": "Magenta",
|
||||
"edt_conf_color_red_expl": "Kalibrierter Rotwert.",
|
||||
"edt_conf_color_red_title": "Rot",
|
||||
"edt_conf_color_reducedPixelSetFactorFactor_expl": "Es wird nur eine reduzierte Menge von Pixeln pro definiertem LED-Bereich ausgewertet, Niedrig ~25%, Mittel ~10%, Hoch ~6%",
|
||||
"edt_conf_color_reducedPixelSetFactorFactor_title": "Reduzierte Pixelverarbeitung",
|
||||
"edt_conf_color_saturationGain_expl": "Anpassung der Farbsättigung. 1,0 bedeutet keine Änderung, Werte größer 1,0 erhöhen die Sättigung, kleiner 1,0 verringern diese.",
|
||||
"edt_conf_color_saturationGain_title": "Sättigungsverstärkung",
|
||||
"edt_conf_color_white_expl": "Kalibrierter Weißwert.",
|
||||
@@ -313,6 +344,8 @@
|
||||
"edt_conf_enum_color": "Farbe",
|
||||
"edt_conf_enum_custom": "Benutzerdefiniert",
|
||||
"edt_conf_enum_decay": "Dämpfung",
|
||||
"edt_conf_enum_delay": "Nur Verzögerung",
|
||||
"edt_conf_enum_disabled": "Deaktiviert",
|
||||
"edt_conf_enum_dl_error": "nur Fehler",
|
||||
"edt_conf_enum_dl_informational": "informativ",
|
||||
"edt_conf_enum_dl_nodebug": "keine Debugausgabe",
|
||||
@@ -321,9 +354,12 @@
|
||||
"edt_conf_enum_dl_verbose1": "Stufe 1",
|
||||
"edt_conf_enum_dl_verbose2": "Stufe 2",
|
||||
"edt_conf_enum_dl_verbose3": "Stufe 3",
|
||||
"edt_conf_enum_dominant_color": "Dominante Farbe - pro LED",
|
||||
"edt_conf_enum_dominant_color_advanced": "Dominante Farbe fortgeschritten - pro LED",
|
||||
"edt_conf_enum_effect": "Effekt",
|
||||
"edt_conf_enum_gbr": "GBR",
|
||||
"edt_conf_enum_grb": "GRB",
|
||||
"edt_conf_enum_high": "Hoch",
|
||||
"edt_conf_enum_hsv": "HSV",
|
||||
"edt_conf_enum_left_right": "von links nach rechts",
|
||||
"edt_conf_enum_linear": "Linear",
|
||||
@@ -331,7 +367,10 @@
|
||||
"edt_conf_enum_logsilent": "Stille",
|
||||
"edt_conf_enum_logverbose": "Ausführlich",
|
||||
"edt_conf_enum_logwarn": "Warnung",
|
||||
"edt_conf_enum_multicolor_mean": "Mehrfarbig",
|
||||
"edt_conf_enum_low": "Niedrig",
|
||||
"edt_conf_enum_medium": "Mittel",
|
||||
"edt_conf_enum_multicolor_mean": "Durchschnittsfarbe einfach - pro LED",
|
||||
"edt_conf_enum_multicolor_mean_squared": "Durchschnittsfarbe zum Quadrat - pro LED",
|
||||
"edt_conf_enum_please_select": "Bitte auswählen",
|
||||
"edt_conf_enum_rbg": "RBG",
|
||||
"edt_conf_enum_rgb": "RGB",
|
||||
@@ -341,7 +380,7 @@
|
||||
"edt_conf_enum_transeffect_sudden": "Sofort",
|
||||
"edt_conf_enum_udp_ddp": "DDP",
|
||||
"edt_conf_enum_udp_raw": "RAW",
|
||||
"edt_conf_enum_unicolor_mean": "Einfarbig",
|
||||
"edt_conf_enum_unicolor_mean": "Durchschnittsfarbe Gesamtbild - auf alle LED angewandt",
|
||||
"edt_conf_fbs_heading_title": "Flatbuffers Server",
|
||||
"edt_conf_fbs_timeout_expl": "Wenn für die angegebene Zeit keine Daten empfangen werden, wird die Komponente (vorübergehend) deaktiviert",
|
||||
"edt_conf_fbs_timeout_title": "Zeitüberschreitung",
|
||||
@@ -400,11 +439,13 @@
|
||||
"edt_conf_grabber_discovered_title": "Gefundenes Aufnahmegerät",
|
||||
"edt_conf_grabber_discovered_title_info": "Wähle dein gefundenes Aufnahmegerät aus.",
|
||||
"edt_conf_grabber_discovery_inprogress": "Suche Aufnahmegeräte",
|
||||
"edt_conf_instC_audioEnable_expl": "Aktiviert die Audioaufnahme für diese LED Hardware Instanz.",
|
||||
"edt_conf_instC_audioEnable_title": "Aktivieren der Audioaufnahme",
|
||||
"edt_conf_instC_screen_grabber_device_expl": "Das verwendet Bildschirmaufnahmegerät",
|
||||
"edt_conf_instC_screen_grabber_device_title": "Bildschirmaufnahmegerät",
|
||||
"edt_conf_instC_systemEnable_expl": "Aktiviert die Bildschirm Aufnahme für diese LED Hardware Instanz.",
|
||||
"edt_conf_instC_systemEnable_title": "Aktiviere Bildschirm Aufnahme",
|
||||
"edt_conf_instC_v4lEnable_expl": "Aktiviert die USB Aufnahme für diese LED -Hardware Instanz.",
|
||||
"edt_conf_instC_v4lEnable_expl": "Aktiviert die USB Aufnahme für diese LED Hardware Instanz.",
|
||||
"edt_conf_instC_v4lEnable_title": "Aktiviere USB-Aufnahme",
|
||||
"edt_conf_instC_video_grabber_device_expl": "Das verwendete Videoaufnahmegerät.",
|
||||
"edt_conf_instC_video_grabber_device_title": "Videoaufnahmegerät",
|
||||
@@ -439,8 +480,6 @@
|
||||
"edt_conf_smooth_heading_title": "Glättung",
|
||||
"edt_conf_smooth_interpolationRate_expl": "Frequenz in der Zwischenschritte zur Glättung berechnet werden.",
|
||||
"edt_conf_smooth_interpolationRate_title": "Interpolationsfrequenz",
|
||||
"edt_conf_smooth_outputRate_expl": "Die Ausgangfrequenz zum LED-Gerät",
|
||||
"edt_conf_smooth_outputRate_title": "Ausgabefrequenz",
|
||||
"edt_conf_smooth_time_ms_expl": "Wie lange soll die Glättung Bilder sammeln?",
|
||||
"edt_conf_smooth_time_ms_title": "Zeit",
|
||||
"edt_conf_smooth_type_expl": "Algorithmus der Glättung.",
|
||||
@@ -614,10 +653,17 @@
|
||||
"edt_dev_spec_rgbw_calibration_green": "Grün/Weiß-Kanal Aspekt",
|
||||
"edt_dev_spec_rgbw_calibration_limit": "Grenzwert für Weißkanal",
|
||||
"edt_dev_spec_rgbw_calibration_red": "Rot/Weiß-Kanal Aspekt",
|
||||
"edt_dev_spec_segmentId_title": "Segment-ID",
|
||||
"edt_dev_spec_segmentsOverlapValidation_error": "Korrigiere die WLED-Konfiguration! Das Segment darf sich nicht mit {{Plural:$1|Segment|Segmenten}} überschneiden: \"$2\".",
|
||||
"edt_dev_spec_segmentsSwitchOffOthers_title": "Abschalten anderer Segmente",
|
||||
"edt_dev_spec_segments_disabled_title": "Segment-Streaming ist in WLED deaktiviert.",
|
||||
"edt_dev_spec_segments_title": "Stream zum Segment",
|
||||
"edt_dev_spec_serial_title": "Seriennummer",
|
||||
"edt_dev_spec_spipath_title": "SPI Pfad",
|
||||
"edt_dev_spec_sslHSTimeoutMax_title": "Streamer Handshake maximum Timeout",
|
||||
"edt_dev_spec_sslHSTimeoutMin_title": "Streamer Handshake minimum Timeout",
|
||||
"edt_dev_spec_stayOnAfterStreaming_title": "LED bleiben nach dem Stream an",
|
||||
"edt_dev_spec_stayOnAfterStreaming_title_info": "Die LEDs bleiben nach dem Streaming oder der Wiederherstellung des Status eingeschaltet.",
|
||||
"edt_dev_spec_stream_protocol_title": "Streaming-Protokoll",
|
||||
"edt_dev_spec_switchOffOnBlack_title": "Aus bei schwarz",
|
||||
"edt_dev_spec_switchOffOnbelowMinBrightness_title": "Aus bei Minimum",
|
||||
@@ -841,6 +887,7 @@
|
||||
"general_col_blue": "blau",
|
||||
"general_col_green": "grün",
|
||||
"general_col_red": "rot",
|
||||
"general_comp_AUDIO": "Audioaufnahme",
|
||||
"general_comp_BLACKBORDER": "Schwarze Balken Erkennung",
|
||||
"general_comp_BOBLIGHTSERVER": "Boblight Server",
|
||||
"general_comp_FLATBUFSERVER": "Flatbuffers Server",
|
||||
@@ -964,8 +1011,11 @@
|
||||
"remote_losthint": "Notiz: Alle Änderungen gehen nach einem Neustart verloren.",
|
||||
"remote_maptype_intro": "Für gewöhnlich entscheidet dein LED-Layout welcher Bildbereich welche LED zugewiesen bekommt, dies kann hier geändert werden. $1",
|
||||
"remote_maptype_label": "LED-Bereich Zuordnung",
|
||||
"remote_maptype_label_multicolor_mean": "Mehrfarbig",
|
||||
"remote_maptype_label_unicolor_mean": "Einfarbig",
|
||||
"remote_maptype_label_dominant_color": "Dominante Farbe",
|
||||
"remote_maptype_label_dominant_color_advanced": "Dominante Farbe fortgeschritten",
|
||||
"remote_maptype_label_multicolor_mean": "Durchschnittsfarbe einfach",
|
||||
"remote_maptype_label_multicolor_mean_squared": "Durchschnittsfarbe zum Quadrat",
|
||||
"remote_maptype_label_unicolor_mean": "Durchschnittsfarbe Gesamtbild",
|
||||
"remote_optgroup_syseffets": "Mitgelieferte Effekte",
|
||||
"remote_optgroup_templates_custom": "Nutzer Vorlage",
|
||||
"remote_optgroup_templates_system": "System Vorlage",
|
||||
|
@@ -51,6 +51,7 @@
|
||||
"conf_grabber_fg_intro": "Screen capture is your local system capture as input source, Hyperion is installed on.",
|
||||
"conf_grabber_inst_grabber_config_info": "Configure your capturing hardware devices to be used by the instance in advance",
|
||||
"conf_grabber_v4l_intro": "USB capture is a (capture) device connected via USB which is used to input source pictures for processing.",
|
||||
"conf_grabber_audio_intro": "Audio capture utilizes an audio input device as the source for visualization.",
|
||||
"conf_helptable_expl": "Explanation",
|
||||
"conf_helptable_option": "Option",
|
||||
"conf_leds_config_error": "Error in LED/LED layout configuration",
|
||||
@@ -58,11 +59,13 @@
|
||||
"conf_leds_contr_label_contrtype": "Controller type:",
|
||||
"conf_leds_device_info_log": "In case your LEDs do not work, check here for errors:",
|
||||
"conf_leds_device_intro": "Hyperion supports a lot of controllers to transmit data to your target device. Select a LED controller out of the sorted list and configure it. We have chosen the best default settings for each device.",
|
||||
"conf_leds_error_get_properties_text" : "Failed to get the device's properties. Please check the configuration items.",
|
||||
"conf_leds_error_get_properties_title" : "Device properties",
|
||||
"conf_leds_error_get_properties_text": "Failed to get the device's properties. Please check the configuration items.",
|
||||
"conf_leds_error_get_properties_title": "Device properties",
|
||||
"conf_leds_error_hwled_gt_layout": "The hardware LED count ($1) is greater than LEDs configured via layout ($2),<br>$3 {{plural:$3|LED|LEDs}} will stay black if you continue.",
|
||||
"conf_leds_error_hwled_lt_layout": "The hardware LED count ($1) is less than LEDs configured via layout ($2). <br> The number of LEDs configured in the layout must not exceed the available LEDs",
|
||||
"conf_leds_error_hwled_gt_maxled": "The hardware LED count ($1) is greater than the maximum number of LEDs supported by the device ($2). <br> The hardware LED count is set to ($3).",
|
||||
"conf_leds_error_hwled_gt_maxled_protocol": "The hardware LED count ($1) is greater than the maximum number of LEDs supported by the streaming protocol ($2). <br> The streaming protocol will be changed to ($3).",
|
||||
"conf_leds_error_wled_segment_missing": "The currently configured segment ($1) is not configured at your WLED device.<br>You might need to check the WLED configuration!<br>The configuration page represents the current WLED setup.",
|
||||
"conf_leds_info_ws281x": "Hyperion must run with 'root' privileges for this controller type!",
|
||||
"conf_leds_layout_advanced": "Advanced Settings",
|
||||
"conf_leds_layout_blacklist_num_title": "Number of LEDs",
|
||||
@@ -252,6 +255,8 @@
|
||||
"edt_conf_bb_unknownFrameCnt_title": "Unknown frames",
|
||||
"edt_conf_bge_heading_title": "Background Effect/Color",
|
||||
"edt_conf_bobls_heading_title": "Boblight Server",
|
||||
"edt_conf_color_accuracyLevel_expl": "Level how accurate dominat colors are evaluated. A higher level creates more accurate results, but also requries more processing power. Should to be combined with reduced pixel processing.",
|
||||
"edt_conf_color_accuracyLevel_title": "Accuracy level",
|
||||
"edt_conf_color_backlightColored_expl": "Add some color to your backlight.",
|
||||
"edt_conf_color_backlightColored_title": "Colored backlight",
|
||||
"edt_conf_color_backlightThreshold_expl": "The minimum amount of brightness (backlight). Disabled during effects, colors and in status \"Off\"",
|
||||
@@ -282,7 +287,7 @@
|
||||
"edt_conf_color_heading_title": "Color Calibration",
|
||||
"edt_conf_color_id_expl": "User given name",
|
||||
"edt_conf_color_id_title": "ID",
|
||||
"edt_conf_color_imageToLedMappingType_expl": "Overwrites the LED area assignment of your LED layout if it's not \"multicolor\"",
|
||||
"edt_conf_color_imageToLedMappingType_expl": "Overwrites the LED area assignment of your LED layout if it's not \"Mean Color Simple\"",
|
||||
"edt_conf_color_imageToLedMappingType_title": "LED area assignment",
|
||||
"edt_conf_color_leds_expl": "Assign this adjustment to all LEDs (*) or just some (0-24).",
|
||||
"edt_conf_color_leds_title": "LED index",
|
||||
@@ -294,6 +299,8 @@
|
||||
"edt_conf_color_temperature_title": "Temperature",
|
||||
"edt_conf_color_saturationGain_expl": "Adjusts the saturation of colors. 1.0 means no change, over 1.0 increases saturation, under 1.0 desaturates.",
|
||||
"edt_conf_color_saturationGain_title": "Saturation gain",
|
||||
"edt_conf_color_reducedPixelSetFactorFactor_expl": "Evaluate only a set of pixels per LED area defined, Low ~25%, Medium ~10%, High ~6%",
|
||||
"edt_conf_color_reducedPixelSetFactorFactor_title": "Reduced pixel processing",
|
||||
"edt_conf_color_white_expl": "The calibrated white value.",
|
||||
"edt_conf_color_white_title": "White",
|
||||
"edt_conf_color_yellow_expl": "The calibrated yellow value.",
|
||||
@@ -323,6 +330,8 @@
|
||||
"edt_conf_enum_color": "Color",
|
||||
"edt_conf_enum_custom": "Custom",
|
||||
"edt_conf_enum_decay": "Decay",
|
||||
"edt_conf_enum_delay": "Delay only",
|
||||
"edt_conf_enum_disabled": "Disabled",
|
||||
"edt_conf_enum_dl_error": "Error",
|
||||
"edt_conf_enum_dl_informational": "Informational",
|
||||
"edt_conf_enum_dl_nodebug": "No Debug output",
|
||||
@@ -331,9 +340,12 @@
|
||||
"edt_conf_enum_dl_verbose1": "Verbosity level 1",
|
||||
"edt_conf_enum_dl_verbose2": "Verbosity level 2",
|
||||
"edt_conf_enum_dl_verbose3": "Verbosity level 3",
|
||||
"edt_conf_enum_dominant_color": "Dominant Color - per LED",
|
||||
"edt_conf_enum_dominant_color_advanced": "Dominant Color Advanced - per LED",
|
||||
"edt_conf_enum_effect": "Effect",
|
||||
"edt_conf_enum_gbr": "GBR",
|
||||
"edt_conf_enum_grb": "GRB",
|
||||
"edt_conf_enum_high": "High",
|
||||
"edt_conf_enum_hsv": "HSV",
|
||||
"edt_conf_enum_left_right": "Left to right",
|
||||
"edt_conf_enum_linear": "Linear",
|
||||
@@ -341,7 +353,10 @@
|
||||
"edt_conf_enum_logsilent": "Silent",
|
||||
"edt_conf_enum_logverbose": "Verbose",
|
||||
"edt_conf_enum_logwarn": "Warning",
|
||||
"edt_conf_enum_multicolor_mean": "Multicolor",
|
||||
"edt_conf_enum_low": "Low",
|
||||
"edt_conf_enum_medium": "Medium",
|
||||
"edt_conf_enum_multicolor_mean": "Mean Color Simple - per LED",
|
||||
"edt_conf_enum_multicolor_mean_squared": "Mean Color Squared - per LED",
|
||||
"edt_conf_enum_please_select": "Please Select",
|
||||
"edt_conf_enum_rbg": "RBG",
|
||||
"edt_conf_enum_rgb": "RGB",
|
||||
@@ -351,7 +366,7 @@
|
||||
"edt_conf_enum_transeffect_sudden": "Sudden",
|
||||
"edt_conf_enum_udp_ddp": "DDP",
|
||||
"edt_conf_enum_udp_raw": "RAW",
|
||||
"edt_conf_enum_unicolor_mean": "Unicolor",
|
||||
"edt_conf_enum_unicolor_mean": "Mean Color Image - applied to all LEDs",
|
||||
"edt_conf_fbs_heading_title": "Flatbuffers Server",
|
||||
"edt_conf_fbs_timeout_expl": "If no data is received for the given period, the component will be (soft) disabled.",
|
||||
"edt_conf_fbs_timeout_title": "Timeout",
|
||||
@@ -416,6 +431,8 @@
|
||||
"edt_conf_instC_systemEnable_title": "Enable screen capture",
|
||||
"edt_conf_instC_v4lEnable_expl": "Enables the USB capture for this LED hardware instance",
|
||||
"edt_conf_instC_v4lEnable_title": "Enable USB capture",
|
||||
"edt_conf_instC_audioEnable_expl": "Enables the Audio capture for this LED hardware instance",
|
||||
"edt_conf_instC_audioEnable_title": "Enable Audio capture",
|
||||
"edt_conf_instC_video_grabber_device_expl": "The video capture device used",
|
||||
"edt_conf_instC_video_grabber_device_title": "Video capture device",
|
||||
"edt_conf_instCapture_heading_title": "Capture Devices",
|
||||
@@ -518,6 +535,27 @@
|
||||
"edt_conf_v4l2_hardware_set_defaults_tip": "Set device's default values for brightness, contrast, hue and saturation",
|
||||
"edt_conf_v4l2_noSignalCounterThreshold_title": "Signal Counter Threshold",
|
||||
"edt_conf_v4l2_noSignalCounterThreshold_expl": "Count of frames (check that with grabber's current FPS mode) after which the no signal is triggered",
|
||||
"edt_conf_audio_device_expl": "Selected audio input device",
|
||||
"edt_conf_audio_device_title": "Audio Device",
|
||||
"edt_conf_audio_effects_expl": "Select an effect on how the audio signal is transformed to",
|
||||
"edt_conf_audio_effects_title": "Audio Effects",
|
||||
"edt_conf_audio_effect_enum_vumeter": "VU-Meter",
|
||||
"edt_conf_audio_effect_hotcolor_expl": "Hot Color",
|
||||
"edt_conf_audio_effect_hotcolor_title": "Hot Color",
|
||||
"edt_conf_audio_effect_multiplier_expl": "Audio Signal Value multiplier",
|
||||
"edt_conf_audio_effect_multiplier_title": "Multiplier",
|
||||
"edt_conf_audio_effect_safecolor_expl": "Safe Color",
|
||||
"edt_conf_audio_effect_safecolor_title": "Safe Color",
|
||||
"edt_conf_audio_effect_safevalue_expl": "Safe Threshold",
|
||||
"edt_conf_audio_effect_safevalue_title": "Safe Threshold",
|
||||
"edt_conf_audio_effect_set_defaults": "Reset to default values",
|
||||
"edt_conf_audio_effect_tolerance_expl": "Tolerance used when auto calculating a signal multipler from 0-100",
|
||||
"edt_conf_audio_effect_tolerance_title": "Tolerance",
|
||||
"edt_conf_audio_effect_warncolor_expl": "Warning Color",
|
||||
"edt_conf_audio_effect_warncolor_title": "Warning Color",
|
||||
"edt_conf_audio_effect_warnvalue_expl": "Warning Threshold",
|
||||
"edt_conf_audio_effect_warnvalue_title": "Warning Threshold",
|
||||
"edt_conf_audio_heading_title": "Audio Capture",
|
||||
"edt_conf_webc_crtPath_expl": "Path to the certification file (format should be PEM)",
|
||||
"edt_conf_webc_crtPath_title": "Certificate path",
|
||||
"edt_conf_webc_docroot_expl": "Local webinterface root path (just for webui developer)",
|
||||
@@ -563,7 +601,7 @@
|
||||
"edt_dev_spec_brightnessOverwrite_title": "Overwrite brightness",
|
||||
"edt_dev_spec_brightnessThreshold_title": "Signal detection brightness minimum",
|
||||
"edt_dev_spec_brightness_title": "Brightness",
|
||||
"edt_dev_spec_candyGamma_title" : "'Candy' mode (double gamma correction)",
|
||||
"edt_dev_spec_candyGamma_title": "'Candy' mode (double gamma correction)",
|
||||
"edt_dev_spec_chanperfixture_title": "Channels per Fixture",
|
||||
"edt_dev_spec_cid_title": "CID",
|
||||
"edt_dev_spec_clientKey_title": "Clientkey",
|
||||
@@ -620,15 +658,22 @@
|
||||
"edt_dev_spec_razer_device_title": "Razer Chroma Device",
|
||||
"edt_dev_spec_restoreOriginalState_title": "Restore lights' state",
|
||||
"edt_dev_spec_restoreOriginalState_title_info": "Restore the device's original state when device is disabled",
|
||||
"edt_dev_spec_rgbw_calibration_enable" : "White channel calibration (RGBW only)",
|
||||
"edt_dev_spec_rgbw_calibration_limit" : "White channel limit",
|
||||
"edt_dev_spec_rgbw_calibration_red" : "Red/White channel aspect",
|
||||
"edt_dev_spec_rgbw_calibration_green" : "Green/White channel aspect",
|
||||
"edt_dev_spec_rgbw_calibration_blue" : "Blue/White channel aspect",
|
||||
"edt_dev_spec_rgbw_calibration_enable": "White channel calibration (RGBW only)",
|
||||
"edt_dev_spec_rgbw_calibration_limit": "White channel limit",
|
||||
"edt_dev_spec_rgbw_calibration_red": "Red/White channel aspect",
|
||||
"edt_dev_spec_rgbw_calibration_green": "Green/White channel aspect",
|
||||
"edt_dev_spec_rgbw_calibration_blue": "Blue/White channel aspect",
|
||||
"edt_dev_spec_segments_disabled_title": "Segment streaming disabled at WLED.",
|
||||
"edt_dev_spec_segments_title": "Stream to segment",
|
||||
"edt_dev_spec_segmentId_title": "Segment-ID",
|
||||
"edt_dev_spec_segmentsSwitchOffOthers_title": "Switch-off other segments",
|
||||
"edt_dev_spec_segmentsOverlapValidation_error": "Correct the WLED setup! The segment must not overlap with {{plural:$1| segment|segments}}: \"$2\".",
|
||||
"edt_dev_spec_serial_title": "Serial number",
|
||||
"edt_dev_spec_spipath_title": "SPI Device",
|
||||
"edt_dev_spec_sslHSTimeoutMax_title": "Streamer handshake timeout maximum",
|
||||
"edt_dev_spec_sslHSTimeoutMin_title": "Streamer handshake timeout minimum",
|
||||
"edt_dev_spec_stayOnAfterStreaming_title": "Stay on after streaming",
|
||||
"edt_dev_spec_stayOnAfterStreaming_title_info": "The device will stay on after streaming or restoring state.",
|
||||
"edt_dev_spec_switchOffOnBlack_title": "Switch off on black",
|
||||
"edt_dev_spec_switchOffOnbelowMinBrightness_title": "Switch-off, below minimum",
|
||||
"edt_dev_spec_syncOverwrite_title": "Disable synchronisation",
|
||||
@@ -860,6 +905,7 @@
|
||||
"general_comp_PROTOSERVER": "Protocol Buffers Server",
|
||||
"general_comp_SMOOTHING": "Smoothing",
|
||||
"general_comp_V4L": "Capture USB-Input",
|
||||
"general_comp_AUDIO": "Audio Capture",
|
||||
"general_country_cn": "China",
|
||||
"general_country_de": "Germany",
|
||||
"general_country_es": "Spain",
|
||||
@@ -871,11 +917,11 @@
|
||||
"general_country_us": "United States",
|
||||
"general_disabled": "disabled",
|
||||
"general_enabled": "enabled",
|
||||
"general_speech_ca": "Catalan",
|
||||
"general_speech_ca": "Catalan",
|
||||
"general_speech_cs": "Czech",
|
||||
"general_speech_da": "Danish",
|
||||
"general_speech_de": "German",
|
||||
"general_speech_el": "Greek",
|
||||
"general_speech_el": "Greek",
|
||||
"general_speech_en": "English",
|
||||
"general_speech_es": "Spanish",
|
||||
"general_speech_fr": "French",
|
||||
@@ -970,8 +1016,11 @@
|
||||
"remote_losthint": "Note: All changes will be lost after a restart.",
|
||||
"remote_maptype_intro": "Usually the LED layout defines which LED covers a specific picture area. You can change it here: $1.",
|
||||
"remote_maptype_label": "Mapping type",
|
||||
"remote_maptype_label_multicolor_mean": "Multicolor",
|
||||
"remote_maptype_label_unicolor_mean": "Unicolor",
|
||||
"remote_maptype_label_dominant_color": "Dominant Color",
|
||||
"remote_maptype_label_dominant_color_advanced": "Dominant Color Advanced",
|
||||
"remote_maptype_label_multicolor_mean": "Mean Color Simple",
|
||||
"remote_maptype_label_multicolor_mean_squared": "Mean Color Squared",
|
||||
"remote_maptype_label_unicolor_mean": "Mean Color Image",
|
||||
"remote_optgroup_syseffets": "System Effects",
|
||||
"remote_optgroup_templates_custom": "User Templates",
|
||||
"remote_optgroup_templates_system": "System Templates",
|
||||
|
@@ -10,6 +10,9 @@
|
||||
"InfoDialog_nowrite_foottext": "¡El WebUI se desbloqueará automáticamente después de haber resuelto el problema!",
|
||||
"InfoDialog_nowrite_text": "Hyperion no puede escribir en el archivo de configuración cargado actual. Repara los permisos de archivo para continuar.",
|
||||
"InfoDialog_nowrite_title": "¡Error de permiso de escritura!",
|
||||
"InfoDialog_systemRestart_title": "Reiniciar",
|
||||
"InfoDialog_systemResume_title": "Retomar",
|
||||
"InfoDialog_systemSuspend_title": "Suspender",
|
||||
"about_3rd_party_licenses": "Licencias de terceros",
|
||||
"about_3rd_party_licenses_error": "Tuvimos problemas para recopilar información de licencias de terceros a través de la Web. <br />Por favor, sigue este enlace para acceder al Recurso GitHub.",
|
||||
"about_build": "Build",
|
||||
@@ -55,7 +58,9 @@
|
||||
"conf_leds_error_get_properties_title": "Propiedades del dispositivo",
|
||||
"conf_leds_error_hwled_gt_layout": "El recuento de LEDs por hardware ($1) es mayor que los LEDs configurados a través de la disposición ($2),<br>$3 {{plural:$1|LED|LEDs}} se quedará en negro si continúas.",
|
||||
"conf_leds_error_hwled_gt_maxled": "El recuento de LEDs por hardware ($1) es mayor que el número máximo de LEDs soportado por el dispositivo ($2). <br> El recuento de LEDs de hardware se establece en ($3).",
|
||||
"conf_leds_error_hwled_gt_maxled_protocol": "El recuento de LEDs por hardware ($1) es mayor que el número máximo de LEDs soportado por el protocolo de streaming ($2). <br> El protocolo de streaming cambiará a ($3).",
|
||||
"conf_leds_error_hwled_lt_layout": "El recuento de LEDs por hardware ($1) es menor que los LEDs configurados a través del diseño ($2). <br> El número de LEDs configurados en el esquema no debe superar los LEDs disponibles.",
|
||||
"conf_leds_error_wled_segment_missing": "El segmento configurado actualmente ($1) no está configurado en tu dispositivo WLED.<br>¡Es posible que tengas que comprobar la configuración del WLED!<br>La página de configuración representa la configuración actual del WLED.",
|
||||
"conf_leds_info_ws281x": "Hyperion debe ejecutarse con privilegios 'root' para este tipo de controlador.",
|
||||
"conf_leds_layout_advanced": "Ajustes Avanzados",
|
||||
"conf_leds_layout_blacklist_num_title": "Número de LEDs",
|
||||
@@ -439,8 +444,6 @@
|
||||
"edt_conf_smooth_heading_title": "Suavizado",
|
||||
"edt_conf_smooth_interpolationRate_expl": "Velocidad de cálculo de los fotogramas intermedios suaves.",
|
||||
"edt_conf_smooth_interpolationRate_title": "Tasa de interpolación",
|
||||
"edt_conf_smooth_outputRate_expl": "La velocidad de salida a tu controlador de leds.",
|
||||
"edt_conf_smooth_outputRate_title": "Tasa de salida",
|
||||
"edt_conf_smooth_time_ms_expl": "¿Cuánto tiempo debe recoger las imágenes el suavizado?",
|
||||
"edt_conf_smooth_time_ms_title": "Tiempo",
|
||||
"edt_conf_smooth_type_expl": "Tipo de suavizado",
|
||||
@@ -614,10 +617,17 @@
|
||||
"edt_dev_spec_rgbw_calibration_green": "Aspecto del canal Verde/Blanco",
|
||||
"edt_dev_spec_rgbw_calibration_limit": "Límite del canal blanco",
|
||||
"edt_dev_spec_rgbw_calibration_red": "Aspecto del canal Rojo/Blanco",
|
||||
"edt_dev_spec_segmentId_title": "Segmento-ID",
|
||||
"edt_dev_spec_segmentsOverlapValidation_error": "¡Corrige la configuración de WLED! El segmento no debe solaparse con {{plural:$1| segmento|segmentos}}: \"$2\".",
|
||||
"edt_dev_spec_segmentsSwitchOffOthers_title": "Desconectar otros segmentos",
|
||||
"edt_dev_spec_segments_disabled_title": "Transmisión de segmentos desactivada en WLED.",
|
||||
"edt_dev_spec_segments_title": "Transmisión a segmento",
|
||||
"edt_dev_spec_serial_title": "Número de serie",
|
||||
"edt_dev_spec_spipath_title": "Dispositivo SPI",
|
||||
"edt_dev_spec_sslHSTimeoutMax_title": "Máximo tiempo de espera para el contacto con el Streamer",
|
||||
"edt_dev_spec_sslHSTimeoutMin_title": "Tiempo mínimo de espera para el contacto con el Streamer",
|
||||
"edt_dev_spec_stayOnAfterStreaming_title": "Permanecer encendido después del streaming",
|
||||
"edt_dev_spec_stayOnAfterStreaming_title_info": "El dispositivo permanecerá encendido después de transmitir o restaurar el estado.",
|
||||
"edt_dev_spec_stream_protocol_title": "Protocolo de streaming",
|
||||
"edt_dev_spec_switchOffOnBlack_title": "Apagar en negro",
|
||||
"edt_dev_spec_switchOffOnbelowMinBrightness_title": "Apagado, por debajo del mínimo",
|
||||
@@ -861,9 +871,11 @@
|
||||
"general_country_us": "Estados Unidos",
|
||||
"general_disabled": "Deshabilitado",
|
||||
"general_enabled": "Habilitado",
|
||||
"general_speech_ca": "Catalán",
|
||||
"general_speech_cs": "Czech",
|
||||
"general_speech_da": "Danés",
|
||||
"general_speech_de": "Alemán",
|
||||
"general_speech_el": "Griego",
|
||||
"general_speech_en": "Inglés",
|
||||
"general_speech_es": "Español",
|
||||
"general_speech_fr": "Francés",
|
||||
|
@@ -398,9 +398,11 @@
|
||||
"edt_conf_v4l2_greenSignalThreshold_expl": "Assombrie les valeurs vertes faibles (reconnues comme noires)",
|
||||
"edt_conf_v4l2_greenSignalThreshold_title": "Seuil de signal vert",
|
||||
"edt_conf_v4l2_hardware_brightness_expl": "Définie la luminosité matérielle",
|
||||
"edt_conf_v4l2_hardware_brightness_title": "Contrôle matériel de la luminosité",
|
||||
"edt_conf_v4l2_hardware_contrast_expl": "Définie le contraste matériel",
|
||||
"edt_conf_v4l2_hardware_contrast_title": "Contrôle le contraste matériel",
|
||||
"edt_conf_v4l2_hardware_hue_expl": "Définie le hue matériel",
|
||||
"edt_conf_v4l2_hardware_hue_title": "Contrôle matériel de la teinte",
|
||||
"edt_conf_v4l2_hardware_saturation_expl": "Définie la saturation matérielle",
|
||||
"edt_conf_v4l2_hardware_saturation_title": "Contrôle la saturation matériel",
|
||||
"edt_conf_v4l2_heading_title": "Capture USB",
|
||||
|
@@ -5,6 +5,8 @@
|
||||
"InfoDialog_changePassword_title": "Cambia Password",
|
||||
"InfoDialog_iswitch_text": "Se esegui più di un Hyperion nella tua rete locale puoi passare tra configurazioni web. Seleziona l'istanza di Hyperion qui sotto e cambia!",
|
||||
"InfoDialog_iswitch_title": "Cambia Hyperion",
|
||||
"InfoDialog_nostorage_text": "Il tuo browser non supporta localStorage. Non è possibile salvare un'impostazione di lingua specifica (fallback su \"rilevamento automatico\") e livello di accesso (fallback su \"predefinito\"). Alcuni maghi potrebbero essere nascosti. Puoi ancora utilizzare l'interfaccia web senza ulteriori problemi",
|
||||
"InfoDialog_nostorage_title": "Impossibile memorizzare le impostazioni",
|
||||
"InfoDialog_nowrite_foottext": "WebUI sarà sbloccata automaticamente appena avrai risolto il problema!",
|
||||
"InfoDialog_nowrite_text": "Hyperion non può scrivere sull'attuale file di configurazione caricato. Riparare i permessi del file per procedere",
|
||||
"InfoDialog_nowrite_title": "errore dei permessi di scrittura!",
|
||||
@@ -40,14 +42,29 @@
|
||||
"conf_general_intro": "Impostazioni base di Hyperion e WebUI che non rientrano in altre categorie.",
|
||||
"conf_general_label_title": "Impostazioni generali",
|
||||
"conf_grabber_fg_intro": "Cattura di sistema usa la cattura locale del sistema su cui è installato Hyperion come sorgente di input.",
|
||||
"conf_grabber_inst_grabber_config_info": "Configura in anticipo i dispositivi hardware di acquisizione in modo che vengano utilizzati dall'istanza",
|
||||
"conf_grabber_v4l_intro": "Cattura USB è un dispositivo (di cattura) connesso via USB usato come sorgente di immagini per l'elaborazione.",
|
||||
"conf_helptable_expl": "Spiegazione",
|
||||
"conf_helptable_option": "Opzioni",
|
||||
"conf_leds_config_error": "Errore nella configurazione del layout LED/LED",
|
||||
"conf_leds_config_warning": "Controlla la configurazione del layout LED/LED",
|
||||
"conf_leds_contr_label_contrtype": "Tipo di Controller",
|
||||
"conf_leds_device_info_log": "Nel caso in cui i tuoi LED non funzionino, controlla qui per gli errori:",
|
||||
"conf_leds_device_intro": "Hyperion supporta molti controller per trasmettere dati al tuo dispositivo. Seleziona un controller LED dalla lista e configuralo. Abbiamo scelto le impostazioni di default migliori per ogni dispositivo.",
|
||||
"conf_leds_error_get_properties_text": "Impossibile ottenere le proprietà del dispositivo. Si prega di controllare gli elementi di configurazione.",
|
||||
"conf_leds_error_get_properties_title": "Proprietà del dispositivo",
|
||||
"conf_leds_error_hwled_gt_layout": "Il conteggio dei LED hardware ($1) è maggiore dei LED configurati tramite layout ($2),<br>$3 {{plural:$3|LED|LED}} rimarranno neri se continui.",
|
||||
"conf_leds_error_hwled_gt_maxled": "Il numero di LED hardware ($ 1) è superiore al numero massimo di LED supportati dal dispositivo ($ 2). <br> Il conteggio dei LED hardware è impostato su ($ 3)",
|
||||
"conf_leds_error_hwled_lt_layout": "Il numero di LED hardware ($ 1) è inferiore ai LED configurati tramite layout ($ 2). <br> Il numero di LED configurati nel layout non deve superare i LED disponibili",
|
||||
"conf_leds_info_ws281x": "Hyperion deve essere eseguito con privilegi di 'root' per questo tipo di controller!",
|
||||
"conf_leds_layout_advanced": "Impostazioni Avanzate",
|
||||
"conf_leds_layout_blacklist_num_title": "Numero di LEDs",
|
||||
"conf_leds_layout_blacklist_rule_title": "Regole della lista nera",
|
||||
"conf_leds_layout_blacklist_rules_title": "Regole delle liste nere",
|
||||
"conf_leds_layout_blacklist_start_title": "LED Iniziale",
|
||||
"conf_leds_layout_blacklistleds_title": "I LED della lista nera",
|
||||
"conf_leds_layout_btn_checklist": "Mostra lista",
|
||||
"conf_leds_layout_btn_keystone": "Correzione trapezoidale",
|
||||
"conf_leds_layout_button_savelay": "Salva Layout",
|
||||
"conf_leds_layout_button_updsim": "Aggiorna Anteprima",
|
||||
"conf_leds_layout_checkp1": "Il led nero è il tuo primo led, il primo led è il punto in cui c'è l'input del segnale dati",
|
||||
@@ -67,6 +84,16 @@
|
||||
"conf_leds_layout_cl_leftbottom": "Sinistra 0% - 100% Sotto",
|
||||
"conf_leds_layout_cl_leftmiddle": "Sinistra 0% - 75% Centro",
|
||||
"conf_leds_layout_cl_lefttop": "Sinistra 0% - 50% Sopra",
|
||||
"conf_leds_layout_cl_lightPosBottomLeft11": "In basso: 75 - 100% da sinistra",
|
||||
"conf_leds_layout_cl_lightPosBottomLeft112": "In basso: 0 - 50% da sinistra",
|
||||
"conf_leds_layout_cl_lightPosBottomLeft12": "In basso: 25 - 50% da sinistra",
|
||||
"conf_leds_layout_cl_lightPosBottomLeft121": "In basso: 50 - 100% da sinistra",
|
||||
"conf_leds_layout_cl_lightPosBottomLeft14": "In basso: 0 - 25% da sinistra",
|
||||
"conf_leds_layout_cl_lightPosBottomLeft34": "In basso: 50 - 75% da sinistra",
|
||||
"conf_leds_layout_cl_lightPosBottomLeftNewMid": "In basso: 25 - 75% da sinistra",
|
||||
"conf_leds_layout_cl_lightPosTopLeft112": "In alto: 0 - 50% da sinistra",
|
||||
"conf_leds_layout_cl_lightPosTopLeft121": "In alto: 50 - 100% da sinistra",
|
||||
"conf_leds_layout_cl_lightPosTopLeftNewMid": "In alto: 25 - 75% da sinistra",
|
||||
"conf_leds_layout_cl_overlap": "Overlap",
|
||||
"conf_leds_layout_cl_reversdir": "Inverti direzione",
|
||||
"conf_leds_layout_cl_right": "Destra",
|
||||
@@ -81,6 +108,7 @@
|
||||
"conf_leds_layout_generatedconf": "Configurazione LED Generata/Attuale",
|
||||
"conf_leds_layout_intro": "è necessario anche un layout dei led che rifletta la disposizione dei tuoi led. Il layout classico è il comune bordo della tv, ma supportiamo anche la creazione di matrici led (parete led). La visuale sul layout è SEMPRE DI FRONTE alla TV.",
|
||||
"conf_leds_layout_ma_cabling": "Cablaggio",
|
||||
"conf_leds_layout_ma_direction": "Direzione",
|
||||
"conf_leds_layout_ma_horiz": "Orizzontale",
|
||||
"conf_leds_layout_ma_optbottomleft": "Basso a sinistra",
|
||||
"conf_leds_layout_ma_optbottomright": "Basso a destra",
|
||||
@@ -112,17 +140,21 @@
|
||||
"conf_leds_layout_textf1": "Questo campo testo mostra di default il layout attualmente caricato e viene sovrascritto se ne generi uno nuovo con le opzioni sopra. Se vuoi puoi fare ulteriori modifiche.",
|
||||
"conf_leds_nav_label_ledcontroller": "Controller LED",
|
||||
"conf_leds_nav_label_ledlayout": "Layout LED",
|
||||
"conf_leds_note_layout_overwrite": "Nota: Overwrite crea un layout predefinito per {{plural:$1| un LED| tutti i LED $1}} dati dal conteggio dei LED hardware",
|
||||
"conf_leds_optgroup_RPiGPIO": "RPi GPIO",
|
||||
"conf_leds_optgroup_RPiPWM": "RPi PWM",
|
||||
"conf_leds_optgroup_RPiSPI": "RPi SPI",
|
||||
"conf_leds_optgroup_debug": "Debug",
|
||||
"conf_leds_optgroup_network": "Rete",
|
||||
"conf_leds_optgroup_other": "Altro",
|
||||
"conf_leds_optgroup_usb": "USB/Seriale",
|
||||
"conf_logging_btn_autoscroll": "Auto scrolling",
|
||||
"conf_logging_btn_clipboard": "Copia nel registro Appunti",
|
||||
"conf_logging_btn_pbupload": "Invia segnalazione per richieste di supporto",
|
||||
"conf_logging_contpolicy": "Policy per la Privacy delle segnalazioni",
|
||||
"conf_logging_label_intro": "Area per controllare i messaggi di log, a seconda dell'impostazione di loglevel vedrai più o meno informazioni.",
|
||||
"conf_logging_lastreports": "Segnalazioni precedenti",
|
||||
"conf_logging_logoutput": "Log output",
|
||||
"conf_logging_nomessage": "Nessun messaggio di log disponibile.",
|
||||
"conf_logging_report": "Segnala",
|
||||
"conf_logging_uplfailed": "Upload fallito! Controlla la tua connessione a internet!",
|
||||
@@ -163,7 +195,12 @@
|
||||
"dashboard_infobox_label_instance": "Istanza:",
|
||||
"dashboard_infobox_label_latesthyp": "L'ultima versione di Hyperion:",
|
||||
"dashboard_infobox_label_platform": "Piattaforma:",
|
||||
"dashboard_infobox_label_port_boblight": "Server Boblight:",
|
||||
"dashboard_infobox_label_port_flat": "Flatbuffer:",
|
||||
"dashboard_infobox_label_port_json": "JSON-Server:",
|
||||
"dashboard_infobox_label_port_proto": "Protobuffer:",
|
||||
"dashboard_infobox_label_ports": "Porte",
|
||||
"dashboard_infobox_label_ports_websocket": "WebSocket (ws|wss):",
|
||||
"dashboard_infobox_label_smartacc": "Accesso Smart",
|
||||
"dashboard_infobox_label_statush": "Status Hyperion:",
|
||||
"dashboard_infobox_label_title": "Informazioni",
|
||||
@@ -181,6 +218,7 @@
|
||||
"dashboard_newsbox_readmore": "Leggi ancora",
|
||||
"dashboard_newsbox_visitblog": "Visita Hyperion-Blog",
|
||||
"edt_append_degree": "°",
|
||||
"edt_append_frames": "frames",
|
||||
"edt_append_hz": "Hz",
|
||||
"edt_append_leds": "LEDs",
|
||||
"edt_append_ms": "ms",
|
||||
@@ -216,6 +254,8 @@
|
||||
"edt_conf_color_blue_title": "Blu",
|
||||
"edt_conf_color_brightnessComp_expl": "Compensa la differenza di luminosità tra rosso verde blu, ciano magneta giallo e bianco. 100 significa massima compensazione, 0 nessuna compensazione",
|
||||
"edt_conf_color_brightnessComp_title": "Compensazione luminosità",
|
||||
"edt_conf_color_brightnessGain_expl": "Regola la luminosità dei colori. 1.0 significa nessun cambiamento, oltre 1.0 aumenta la luminosità, sotto 1.0 diminuisce la luminosità",
|
||||
"edt_conf_color_brightnessGain_title": "Intensità della luminosità",
|
||||
"edt_conf_color_brightness_expl": "Imposta la luminosità complessiva dei leds",
|
||||
"edt_conf_color_brightness_title": "Luminosità",
|
||||
"edt_conf_color_channelAdjustment_header_expl": "Crea profilo di colore che può essere assegnato a un componente specifico. Regola colore, gamma, luminosità, compensazione e altro.",
|
||||
@@ -242,6 +282,8 @@
|
||||
"edt_conf_color_magenta_title": "Magenta",
|
||||
"edt_conf_color_red_expl": "Il valore calibrato del rosso.",
|
||||
"edt_conf_color_red_title": "Rosso",
|
||||
"edt_conf_color_saturationGain_expl": "Regola la saturazione dei colori. 1.0 significa nessun cambiamento, oltre 1.0 aumenta la saturazione, sotto 1.0 desatura.",
|
||||
"edt_conf_color_saturationGain_title": "Intensità della saturazione",
|
||||
"edt_conf_color_white_expl": "Il valore calibrato del bianco.",
|
||||
"edt_conf_color_white_title": "Bianco",
|
||||
"edt_conf_color_yellow_expl": "Il valore calibrato del giallo.",
|
||||
@@ -253,10 +295,13 @@
|
||||
"edt_conf_effp_paths_expl": "Puoi definire altre cartelle che contengono effetti aggiuntivi. Il configuratore di effetti salva sempre all'interno della prima cartella.",
|
||||
"edt_conf_effp_paths_itemtitle": "Percorso",
|
||||
"edt_conf_effp_paths_title": "Percorso Effetti",
|
||||
"edt_conf_enum_BOTH": "Orizzontale e Verticale",
|
||||
"edt_conf_enum_HORIZONTAL": "Orizzontale",
|
||||
"edt_conf_enum_NO_CHANGE": "Auto",
|
||||
"edt_conf_enum_NTSC": "NTSC",
|
||||
"edt_conf_enum_PAL": "PAL",
|
||||
"edt_conf_enum_SECAM": "SECAM",
|
||||
"edt_conf_enum_VERTICAL": "Verticale",
|
||||
"edt_conf_enum_automatic": "Automatico",
|
||||
"edt_conf_enum_bbclassic": "Classico",
|
||||
"edt_conf_enum_bbdefault": "Default",
|
||||
@@ -287,12 +332,15 @@
|
||||
"edt_conf_enum_logverbose": "Verboso",
|
||||
"edt_conf_enum_logwarn": "Avvertimento",
|
||||
"edt_conf_enum_multicolor_mean": "Multicolore",
|
||||
"edt_conf_enum_please_select": "Seleziona",
|
||||
"edt_conf_enum_rbg": "RBG",
|
||||
"edt_conf_enum_rgb": "RGB",
|
||||
"edt_conf_enum_right_left": "Da destra a sinistra",
|
||||
"edt_conf_enum_top_down": "Dall'alto verso il basso",
|
||||
"edt_conf_enum_transeffect_smooth": "Dolce",
|
||||
"edt_conf_enum_transeffect_sudden": "Repentina",
|
||||
"edt_conf_enum_udp_ddp": "DDP",
|
||||
"edt_conf_enum_udp_raw": "RAW",
|
||||
"edt_conf_enum_unicolor_mean": "Monocromatico",
|
||||
"edt_conf_fbs_heading_title": "Server Flatbuffers",
|
||||
"edt_conf_fbs_timeout_expl": "Se nessuna informazione viene ricevuta per un dato periodo, il componente verrà disabilitato (soft).",
|
||||
@@ -321,11 +369,19 @@
|
||||
"edt_conf_fge_type_title": "Tipo",
|
||||
"edt_conf_fw_flat_expl": "Una destinazione flatbuffer per riga. Contiene IP:PORTA:(Esempio: 127.0.0.1:19401)",
|
||||
"edt_conf_fw_flat_itemtitle": "Destinatario flatbuffer",
|
||||
"edt_conf_fw_flat_services_discovered_expl": "Obiettivi flatbuffer scoperti",
|
||||
"edt_conf_fw_flat_services_discovered_title": "Obiettivi flatbuffer scoperti",
|
||||
"edt_conf_fw_flat_title": "Lista dei client flatbuffer",
|
||||
"edt_conf_fw_heading_title": "Forwarder",
|
||||
"edt_conf_fw_json_expl": "Una destinazione json per riga. Contiene IP:PORTA:(Esempio: 127.0.0.1:19446)",
|
||||
"edt_conf_fw_json_itemtitle": "Destinatario json",
|
||||
"edt_conf_fw_json_services_discovered_expl": "Server Hyperion scoperti che forniscono servizi JSON-API",
|
||||
"edt_conf_fw_json_services_discovered_title": "Target JSON rilevati",
|
||||
"edt_conf_fw_json_title": "Lista dei client json",
|
||||
"edt_conf_fw_remote_service_discovered_none": "Nessun servizio remoto rilevato",
|
||||
"edt_conf_fw_service_name_expl": "Nome del fornitore di servizi",
|
||||
"edt_conf_fw_service_name_title": "Nome di Servizio",
|
||||
"edt_conf_gen_configVersion_title": "Versione di configurazione",
|
||||
"edt_conf_gen_heading_title": "impostazioni Generali",
|
||||
"edt_conf_gen_name_expl": "Un nome definito dall'utente che viene utilizzato per riconoscere Hyperion. (Utile con più di un'istanza di Hyperion)",
|
||||
"edt_conf_gen_name_title": "Nome configurazione",
|
||||
@@ -339,10 +395,19 @@
|
||||
"edt_conf_general_port_title": "Porta",
|
||||
"edt_conf_general_priority_expl": "Priorità di questo componente",
|
||||
"edt_conf_general_priority_title": "Priorità canale.",
|
||||
"edt_conf_grabber_discovered_expl": "Seleziona il tuo dispositivo di acquisizione scoperto",
|
||||
"edt_conf_grabber_discovered_none": "Nessun dispositivo di acquisizione rilevato",
|
||||
"edt_conf_grabber_discovered_title": "Dispositivo scoperto",
|
||||
"edt_conf_grabber_discovered_title_info": "Seleziona il tuo dispositivo di acquisizione scoperto",
|
||||
"edt_conf_grabber_discovery_inprogress": "ricerca in corso",
|
||||
"edt_conf_instC_screen_grabber_device_expl": "l dispositivo di cattura dello schermo utilizzato",
|
||||
"edt_conf_instC_screen_grabber_device_title": "Dispositivo di cattura dello schermo",
|
||||
"edt_conf_instC_systemEnable_expl": "Abilita la cattura della piattaforma per questa istanza di hardware led",
|
||||
"edt_conf_instC_systemEnable_title": "Abilita cattura piattaforma",
|
||||
"edt_conf_instC_v4lEnable_expl": "Abilita la cattura USB per questa istanza di hardware led",
|
||||
"edt_conf_instC_v4lEnable_title": "Abilita cattura USB",
|
||||
"edt_conf_instC_video_grabber_device_expl": "Il dispositivo di acquisizione video utilizzato",
|
||||
"edt_conf_instC_video_grabber_device_title": "Dispositivo di acquisizione video",
|
||||
"edt_conf_instCapture_heading_title": "Cattura Istanza",
|
||||
"edt_conf_js_heading_title": "Server JSON",
|
||||
"edt_conf_log_heading_title": "Logging",
|
||||
@@ -374,8 +439,6 @@
|
||||
"edt_conf_smooth_heading_title": "Sfumatura",
|
||||
"edt_conf_smooth_interpolationRate_expl": "Velocità di calcolo dei regolari frame intermedi",
|
||||
"edt_conf_smooth_interpolationRate_title": "Tasso di interpolazione",
|
||||
"edt_conf_smooth_outputRate_expl": "Velocità di uscita al tuo controller LED.",
|
||||
"edt_conf_smooth_outputRate_title": "Velocità di uscita",
|
||||
"edt_conf_smooth_time_ms_expl": "Quanto a lungo la sfumatura dovrebbe raggiungere le immagini?",
|
||||
"edt_conf_smooth_time_ms_title": "Durata",
|
||||
"edt_conf_smooth_type_expl": "Tipo di sfumatura.",
|
||||
@@ -390,21 +453,41 @@
|
||||
"edt_conf_v4l2_cecDetection_title": "Rilevamento CEC",
|
||||
"edt_conf_v4l2_cropBottom_expl": "Numero di pixels in basso che vengono rimossi dall'immagine.",
|
||||
"edt_conf_v4l2_cropBottom_title": "Ritaglia in basso",
|
||||
"edt_conf_v4l2_cropHeightValidation_error": "Ritaglia in alto + Ritaglia in basso non può essere maggiore di Altezza ($ 1)",
|
||||
"edt_conf_v4l2_cropLeft_expl": "Numero di pixels sulla sinistra che vengono rimossi dall'immagine.",
|
||||
"edt_conf_v4l2_cropLeft_title": "Ritaglia sinistra",
|
||||
"edt_conf_v4l2_cropRight_expl": "Numero di pixels sulla destra che vengono rimossi dall'immagine.",
|
||||
"edt_conf_v4l2_cropRight_title": "Ritaglia destra",
|
||||
"edt_conf_v4l2_cropTop_expl": "Numero di pixels in alto che vengono rimossi dall'immagine.",
|
||||
"edt_conf_v4l2_cropTop_title": "Ritaglia in alto",
|
||||
"edt_conf_v4l2_cropWidthValidation_error": "Ritaglia a sinistra + Ritaglia a destra non può essere maggiore di Larghezza ($1)",
|
||||
"edt_conf_v4l2_device_expl": "Percorso del dispositivo di cattura USB. Imposta su 'Automatico' per riconoscimento automatico. Esempio: '/dev/video0'",
|
||||
"edt_conf_v4l2_device_title": "Dispositivo",
|
||||
"edt_conf_v4l2_encoding_expl": "Forza la codifica video per i grabber multiformato",
|
||||
"edt_conf_v4l2_encoding_title": "Formato di codifica",
|
||||
"edt_conf_v4l2_flip_expl": "Ciò consente di capovolgere l'immagine orizzontalmente, verticalmente o entrambi.",
|
||||
"edt_conf_v4l2_flip_title": "Capovolgimento dell'immagine",
|
||||
"edt_conf_v4l2_fpsSoftwareDecimation_expl": "Per risparmiare risorse verrà elaborato solo ogni n-esimo frame. Per es. se il grabber è impostato a 30fps con questa opzione impostata a 5 il risultato finale sarà di circa 6fps",
|
||||
"edt_conf_v4l2_fpsSoftwareDecimation_title": "Salto del frame del software",
|
||||
"edt_conf_v4l2_framerate_expl": "Frame al secondo supportati per il dispositivo attivo",
|
||||
"edt_conf_v4l2_framerate_title": "Frame al secondo",
|
||||
"edt_conf_v4l2_greenSignalThreshold_expl": "Scurisce valori bassi di verde (riconosciuti come nero)",
|
||||
"edt_conf_v4l2_greenSignalThreshold_title": "Soglia segnale verde",
|
||||
"edt_conf_v4l2_hardware_brightness_expl": "Imposta la luminosità dell'hardware",
|
||||
"edt_conf_v4l2_hardware_brightness_title": "Controllo hardware della luminosità",
|
||||
"edt_conf_v4l2_hardware_contrast_expl": "Imposta il contrasto hardware",
|
||||
"edt_conf_v4l2_hardware_contrast_title": "Controllo hardware del contrasto",
|
||||
"edt_conf_v4l2_hardware_hue_expl": "Imposta la tonalità dell'hardware",
|
||||
"edt_conf_v4l2_hardware_hue_title": "Controllo della tonalità hardware",
|
||||
"edt_conf_v4l2_hardware_saturation_expl": "Imposta la saturazione hardware",
|
||||
"edt_conf_v4l2_hardware_saturation_title": "Controllo della saturazione hardware",
|
||||
"edt_conf_v4l2_hardware_set_defaults": "Controlli hardware predefiniti",
|
||||
"edt_conf_v4l2_hardware_set_defaults_tip": "Imposta i valori predefiniti del dispositivo per luminosità, contrasto, tonalità e saturazione",
|
||||
"edt_conf_v4l2_heading_title": "Cattura USB",
|
||||
"edt_conf_v4l2_input_expl": "Seleziona l'input video per il tuo dispositivo. 'Automatico' mantiene il Valero scelto dall'interfaccia v4l2.",
|
||||
"edt_conf_v4l2_input_title": "Input",
|
||||
"edt_conf_v4l2_noSignalCounterThreshold_expl": "Conteggio dei fotogrammi (controllalo con l'attuale modalità FPS del grabber) dopo il quale viene attivato il segnale di assenza",
|
||||
"edt_conf_v4l2_noSignalCounterThreshold_title": "Soglia del contatore di segnale",
|
||||
"edt_conf_v4l2_redSignalThreshold_expl": "Scurisce valori bassi di rosso (riconosciuti come nero)",
|
||||
"edt_conf_v4l2_redSignalThreshold_title": "Soglia segnale rosso",
|
||||
"edt_conf_v4l2_resolution_expl": "Lista Risoluzioni supportate per il dispositivo attivo",
|
||||
@@ -435,12 +518,21 @@
|
||||
"edt_conf_webc_sslport_expl": "Porta del webserver HTTPS",
|
||||
"edt_conf_webc_sslport_title": "Porta HTTPS",
|
||||
"edt_dev_auth_key_title": "Token di autenticazione",
|
||||
"edt_dev_auth_key_title_info": "Token di autenticazione necessario per accedere al dispositivo",
|
||||
"edt_dev_enum_sub_min_cool_adjust": "Regolazione freddo min",
|
||||
"edt_dev_enum_sub_min_warm_adjust": "Regolazione calore min",
|
||||
"edt_dev_enum_subtract_minimum": "Sottrai minimo",
|
||||
"edt_dev_enum_white_off": "Bianco off",
|
||||
"edt_dev_general_autostart_title": "avvio automatico",
|
||||
"edt_dev_general_autostart_title_info": "Il dispositivo LED è acceso durante l'avvio oppure no",
|
||||
"edt_dev_general_colorOrder_title": "Ordine byte RGB",
|
||||
"edt_dev_general_colorOrder_title_info": "L'ordine dei colori del dispositivo",
|
||||
"edt_dev_general_enableAttemptsInterval_title": "Intervallo tra tentativi",
|
||||
"edt_dev_general_enableAttemptsInterval_title_info": "Intervallo tra due tentativi di connessione.",
|
||||
"edt_dev_general_enableAttempts_title": "Tentativi di connessione",
|
||||
"edt_dev_general_enableAttempts_title_info": "Numero di tentativi di connessione di un dispositivo prima che entri in uno stato di errore.",
|
||||
"edt_dev_general_hardwareLedCount_title": "Numero di LED Hardware",
|
||||
"edt_dev_general_hardwareLedCount_title_info": "Il numero di LED fisici disponibili per il dispositivo specificato",
|
||||
"edt_dev_general_heading_title": "Impostazioni Generali",
|
||||
"edt_dev_general_name_title": "Nome configurazione",
|
||||
"edt_dev_general_rewriteTime_title": "Tempo di ricarica",
|
||||
@@ -449,21 +541,28 @@
|
||||
"edt_dev_spec_FCsetConfig_title": "Imposta configurazione Fadecandy",
|
||||
"edt_dev_spec_LBap102Mode_title": "Modalità LightBerry APA102",
|
||||
"edt_dev_spec_PBFiFo_title": "Pi-Blaster FiFo",
|
||||
"edt_dev_spec_ada_mode_title": "Adalight - Standard",
|
||||
"edt_dev_spec_awa_mode_title": "HyperSerial - Alta velocità",
|
||||
"edt_dev_spec_baudrate_title": "Baudrate",
|
||||
"edt_dev_spec_blackLightsTimeout_title": "Timeout rilevamento segnale su nero",
|
||||
"edt_dev_spec_brightnessFactor_title": "Fattore luminosità",
|
||||
"edt_dev_spec_brightnessMax_title": "Luminosità massima",
|
||||
"edt_dev_spec_brightnessMin_title": "Luminosità minima",
|
||||
"edt_dev_spec_brightnessMin_title": "Luminosità minima",
|
||||
"edt_dev_spec_brightnessOverwrite_title": "Sovrascrivi luminosità",
|
||||
"edt_dev_spec_brightnessThreshold_title": "Luminosità minima per rilevamento segnale",
|
||||
"edt_dev_spec_brightness_title": "Luminosità",
|
||||
"edt_dev_spec_candyGamma_title": "Modalità \"Candy\" (doppia correzione gamma)",
|
||||
"edt_dev_spec_chanperfixture_title": "Canali per dispositivo",
|
||||
"edt_dev_spec_cid_title": "CID",
|
||||
"edt_dev_spec_clientKey_title": "Clientkey",
|
||||
"edt_dev_spec_colorComponent_title": "Componente colore",
|
||||
"edt_dev_spec_debugLevel_title": "Livello Debug",
|
||||
"edt_dev_spec_debugStreamer_title": "Debug Streamer",
|
||||
"edt_dev_spec_delayAfterConnect_title": "Ritardo dopo la connessione",
|
||||
"edt_dev_spec_devices_discovered_none": "Nessun dispositivo rilevato",
|
||||
"edt_dev_spec_devices_discovered_title": "Dispositivi trovato",
|
||||
"edt_dev_spec_devices_discovered_title_info": "Seleziona il tuo dispositivo LED trovato",
|
||||
"edt_dev_spec_devices_discovered_title_info_custom": "Seleziona il tuo dispositivo LED trovato o configurane uno personalizzato",
|
||||
"edt_dev_spec_devices_discovery_inprogress": "Ricerca in corso",
|
||||
"edt_dev_spec_dithering_title": "Dithering",
|
||||
"edt_dev_spec_dmaNumber_title": "Canale DMA",
|
||||
"edt_dev_spec_gamma_title": "Gamma",
|
||||
@@ -478,6 +577,7 @@
|
||||
"edt_dev_spec_intervall_title": "Intervallo",
|
||||
"edt_dev_spec_invert_title": "Inverti segnale",
|
||||
"edt_dev_spec_latchtime_title": "Tempo di latch",
|
||||
"edt_dev_spec_latchtime_title_info": "Il tempo di latch è l'intervallo di tempo richiesto da un dispositivo fino all'elaborazione del successivo aggiornamento. Durante tale periodo di tempo, tutti gli aggiornamenti effettuati vengono ignorati.",
|
||||
"edt_dev_spec_ledIndex_title": "Indice LED",
|
||||
"edt_dev_spec_ledType_title": "Tipo LED",
|
||||
"edt_dev_spec_lightid_itemtitle": "ID",
|
||||
@@ -491,6 +591,8 @@
|
||||
"edt_dev_spec_networkDeviceName_title": "Nome dispositivo di rete",
|
||||
"edt_dev_spec_networkDevicePort_title": "Porta",
|
||||
"edt_dev_spec_numberOfLeds_title": "Numero di LEDs",
|
||||
"edt_dev_spec_onBlackTimeToPowerOff": "È ora di spegnere la lampada se viene attivato il livello di nero",
|
||||
"edt_dev_spec_onBlackTimeToPowerOn": "È ora di accendere la lampada se il segnale viene ripristinato",
|
||||
"edt_dev_spec_orbIds_title": "Orb ID",
|
||||
"edt_dev_spec_order_left_right_title": "2.",
|
||||
"edt_dev_spec_order_top_down_title": "1.",
|
||||
@@ -498,18 +600,29 @@
|
||||
"edt_dev_spec_panel_start_position": "Pannello d'inizio [0-max panels]",
|
||||
"edt_dev_spec_panelorganisation_title": "Sequenza numerazione pannelli",
|
||||
"edt_dev_spec_pid_title": "PID",
|
||||
"edt_dev_spec_port_expl": "Porta di servizio [1-65535]",
|
||||
"edt_dev_spec_port_title": "Porta",
|
||||
"edt_dev_spec_printTimeStamp_title": "Aggiungi timestamp",
|
||||
"edt_dev_spec_pwmChannel_title": "Canale PWM",
|
||||
"edt_dev_spec_razer_device_title": "Dispositivo Razer Chroma",
|
||||
"edt_dev_spec_restoreOriginalState_title": "Ripristina lo stato delle luci",
|
||||
"edt_dev_spec_restoreOriginalState_title_info": "Ripristina lo stato originale del dispositivo quando il dispositivo è disabilitato",
|
||||
"edt_dev_spec_rgbw_calibration_blue": "Aspetto del canale blu/bianco",
|
||||
"edt_dev_spec_rgbw_calibration_enable": "Calibrazione del canale del bianco (solo RGBW)",
|
||||
"edt_dev_spec_rgbw_calibration_green": "Aspetto canale verde/bianco",
|
||||
"edt_dev_spec_rgbw_calibration_limit": "Limite canale bianco",
|
||||
"edt_dev_spec_rgbw_calibration_red": "Aspetto del canale rosso/bianco",
|
||||
"edt_dev_spec_serial_title": "Numero seriale",
|
||||
"edt_dev_spec_spipath_title": "Percorso SPI",
|
||||
"edt_dev_spec_sslHSTimeoutMax_title": "Timeout massimo handkshake streamer",
|
||||
"edt_dev_spec_sslHSTimeoutMin_title": "Timeout minimo handkshake streamer",
|
||||
"edt_dev_spec_sslReadTimeout_title": "Timeout lettura streamer",
|
||||
"edt_dev_spec_stream_protocol_title": "Protocollo di streaming",
|
||||
"edt_dev_spec_switchOffOnBlack_title": "Spegni o accendi il nero",
|
||||
"edt_dev_spec_switchOffOnbelowMinBrightness_title": "Spegni, sotto il minimo",
|
||||
"edt_dev_spec_syncOverwrite_title": "Disabilita la sincronizzazione",
|
||||
"edt_dev_spec_targetIpHost_expl": "Nome host (DNS/mDNS) o indirizzo IP (IPv4 o IPv6)",
|
||||
"edt_dev_spec_targetIpHost_title": "IP di destinazione/nome host",
|
||||
"edt_dev_spec_targetIpHost_title_info": "Il nome host o l'indirizzo IP del dispositivo",
|
||||
"edt_dev_spec_targetIp_title": "IP di destinazione",
|
||||
"edt_dev_spec_transeffect_title": "Effetto Transizione",
|
||||
"edt_dev_spec_transistionTimeExtra_title": "Tempo extra di buio",
|
||||
@@ -573,9 +686,14 @@
|
||||
"edt_eff_frequency": "Frequenza",
|
||||
"edt_eff_gif_header": "GIF",
|
||||
"edt_eff_gif_header_desc": "Questo effetto riproduce file .gif. Fornisci un semplice loop video come effetto.",
|
||||
"edt_eff_grayscale": "Scala di grigi",
|
||||
"edt_eff_height": "Altezza",
|
||||
"edt_eff_huechange": "Cambiamento colore",
|
||||
"edt_eff_image": "file immagine",
|
||||
"edt_eff_image_source": "Fonte immagine",
|
||||
"edt_eff_image_source_file": "File locale",
|
||||
"edt_eff_image_source_url": "URL",
|
||||
"edt_eff_initial_blink": "Flash per attirare l'attenzione",
|
||||
"edt_eff_interval": "Intervallo",
|
||||
"edt_eff_knightrider_header": "Supercar",
|
||||
"edt_eff_knightrider_header_desc": "K.I.T.T. è tornato! Lo scanner frontale della nota automobile, questa volta non solo in rosso.",
|
||||
@@ -613,6 +731,7 @@
|
||||
"edt_eff_reversedirection": "Inverti direzione",
|
||||
"edt_eff_rotationtime": "Tempo di rotazione",
|
||||
"edt_eff_saturation": "Saturazione",
|
||||
"edt_eff_set_post_color": "Imposta il colore del post dopo l'allarme",
|
||||
"edt_eff_showseconds": "Mostra secondi",
|
||||
"edt_eff_sleeptime": "Tempo di riposo",
|
||||
"edt_eff_smooth_custom": "Abilita sfumatura",
|
||||
@@ -631,6 +750,7 @@
|
||||
"edt_eff_traces_header_desc": "Necessita redesign",
|
||||
"edt_eff_trails_header": "Scie",
|
||||
"edt_eff_trails_header_desc": "Stelle colorate che cadono dall'alto verso il basso",
|
||||
"edt_eff_url": "Indirizzo dell'immagine",
|
||||
"edt_eff_waves_header": "Onde",
|
||||
"edt_eff_waves_header_desc": "Onde di colore! Scegli i colori, tempo di rotazione, direzione e altro.",
|
||||
"edt_eff_whichleds": "Quali Leds",
|
||||
@@ -655,6 +775,10 @@
|
||||
"edt_msg_error_disallow": "Il valore non deve essere di tipo $1",
|
||||
"edt_msg_error_disallow_union": "Il valore non deve essere di uno dei tipi forniti non ammessi",
|
||||
"edt_msg_error_enum": "Il valore deve essere uno tra quelli enumerati",
|
||||
"edt_msg_error_hostname": "Il nome host ha il formato errato",
|
||||
"edt_msg_error_invalid_epoch": "La data deve essere successiva al 1° gennaio 1970",
|
||||
"edt_msg_error_ipv4": "Il valore deve essere un indirizzo IPv4 valido sotto forma di 4 numeri compresi tra 0 e 255, separati da punti",
|
||||
"edt_msg_error_ipv6": "Il valore deve essere un indirizzo IPv6 valido",
|
||||
"edt_msg_error_maxItems": "Il valore deve contenere al massimo $1 elementi",
|
||||
"edt_msg_error_maxLength": "Il valore deve essere al massimo lungo $1 caratteri",
|
||||
"edt_msg_error_maxProperties": "L'oggetto deve avere al massimo $1 proprietà",
|
||||
@@ -675,6 +799,8 @@
|
||||
"edt_msg_error_type": "Il valore deve essere di tipo $1",
|
||||
"edt_msg_error_type_union": "Il valore deve essere di uno dei tipi forniti",
|
||||
"edt_msg_error_uniqueItems": "Il vettore deve contenere elementi diversi",
|
||||
"edt_msgcust_error_hostname_ip": "Non è un nome host valido né IPv4 né IPv6",
|
||||
"edt_msgcust_error_hostname_ip4": "Non è un nome host valido né IPv4",
|
||||
"effectsconfigurator_button_conttest": "Test continuo",
|
||||
"effectsconfigurator_button_deleffect": "Cancella Effetto",
|
||||
"effectsconfigurator_button_editeffect": "Carica Effetto",
|
||||
@@ -686,7 +812,7 @@
|
||||
"effectsconfigurator_label_effectname": "Nome Effetto",
|
||||
"effectsconfigurator_label_intro": "Crea nuovi effetti calibrati a tuo piacimento a partire dagli effetti base. A seconda dell'effetto sono disponibili opzioni come colore, velocità, direzione e altri.",
|
||||
"general_access_advanced": "Avanzate",
|
||||
"general_access_default": "Default",
|
||||
"general_access_default": "Predefinito",
|
||||
"general_access_expert": "Esperto",
|
||||
"general_btn_back": "Indietro",
|
||||
"general_btn_cancel": "Annulla",
|
||||
@@ -699,6 +825,7 @@
|
||||
"general_btn_off": "Off",
|
||||
"general_btn_ok": "OK",
|
||||
"general_btn_on": "On",
|
||||
"general_btn_overwrite": "Sovrascrivi",
|
||||
"general_btn_rename": "Rinomina",
|
||||
"general_btn_restarthyperion": "Riavvia Hyperion",
|
||||
"general_btn_save": "Salva",
|
||||
@@ -718,7 +845,7 @@
|
||||
"general_comp_FORWARDER": "Forwarder",
|
||||
"general_comp_GRABBER": "Cattura di Sistema",
|
||||
"general_comp_LEDDEVICE": "Dispositivo LED",
|
||||
"general_comp_PROTOSERVER": "Server Protocol Buffers",
|
||||
"general_comp_PROTOSERVER": "Buffer del protocollo del server",
|
||||
"general_comp_SMOOTHING": "Sfumatura",
|
||||
"general_comp_V4L": "Cattura USB",
|
||||
"general_country_cn": "Cina",
|
||||
@@ -730,14 +857,23 @@
|
||||
"general_country_ru": "Russia",
|
||||
"general_country_uk": "Regno Unito",
|
||||
"general_country_us": "Stati Uniti",
|
||||
"general_disabled": "disabilitato",
|
||||
"general_enabled": "abilitato",
|
||||
"general_speech_ca": "Catalano",
|
||||
"general_speech_cs": "Czech",
|
||||
"general_speech_da": "Danimarca",
|
||||
"general_speech_de": "Tedesco",
|
||||
"general_speech_el": "Greco",
|
||||
"general_speech_en": "Inglese",
|
||||
"general_speech_es": "Spagnolo",
|
||||
"general_speech_fr": "Francese",
|
||||
"general_speech_hu": "Ungheria",
|
||||
"general_speech_it": "Italiano",
|
||||
"general_speech_ja": "Giapponese",
|
||||
"general_speech_nb": "Norvegese (Bokmål)",
|
||||
"general_speech_nl": "Olandese",
|
||||
"general_speech_pl": "Polacco",
|
||||
"general_speech_pt": "Portoghese",
|
||||
"general_speech_ro": "Rumeno",
|
||||
"general_speech_ru": "Russo",
|
||||
"general_speech_sv": "Svedese",
|
||||
@@ -757,6 +893,10 @@
|
||||
"infoDialog_import_confirm_title": "Conferma import",
|
||||
"infoDialog_import_hyperror_text": "Il file di configurazione selezionato \"$1\" non può essere importato. Non è compatibile con Hyperion 2.0 e superiori!",
|
||||
"infoDialog_import_jsonerror_text": "Il file di configurazione selezionato \"$1\" non è un file .json o è corrotto. Messaggio di errore: ($2)",
|
||||
"infoDialog_password_current_text": "Password attuale",
|
||||
"infoDialog_password_minimum_length": "Le password devono contenere almeno 8 caratteri.",
|
||||
"infoDialog_password_new_text": "Nuova Password",
|
||||
"infoDialog_username_text": "Nome utente",
|
||||
"infoDialog_wizrgb_text": "L'ordine dei Byte RGB è già impostato correttamente.",
|
||||
"infoDialog_writeconf_error_text": "Salvataggio della configurazione fallito.",
|
||||
"infoDialog_writeimage_error_text": "Il file selezionato \"$1\" non è un immagine o è corrotto! Seleziona un altro file.",
|
||||
@@ -776,6 +916,7 @@
|
||||
"main_ledsim_btn_togglelednumber": "Numeri LED",
|
||||
"main_ledsim_btn_toggleleds": "Mostra LEDs",
|
||||
"main_ledsim_btn_togglelivevideo": "Video live",
|
||||
"main_ledsim_btn_togglesigdetect": "Area di rilevamento del segnale",
|
||||
"main_ledsim_text": "Visualizzazione live dei colori dei led e, opzionalmente, lo stream video dal dispositivo di cattura.",
|
||||
"main_ledsim_title": "Visualizzazione LED",
|
||||
"main_menu_about_token": "Info su Hyperion",
|
||||
@@ -787,6 +928,7 @@
|
||||
"main_menu_general_conf_token": "Generale",
|
||||
"main_menu_grabber_conf_token": "Hardware di cattura",
|
||||
"main_menu_input_selection_token": "Selezione Input",
|
||||
"main_menu_instcapture_conf_token": "Fonti",
|
||||
"main_menu_leds_conf_token": "Hardware LED",
|
||||
"main_menu_logging_token": "Log",
|
||||
"main_menu_network_conf_token": "Servizi di Rete",
|
||||
@@ -886,6 +1028,7 @@
|
||||
"wiz_cc_testintrok": "Premi il bottone qui sotto per iniziare un test video.",
|
||||
"wiz_cc_testintrowok": "Guarda il link di seguito per il download dei video di test",
|
||||
"wiz_cc_title": "Assistente calibrazione colore",
|
||||
"wiz_cc_try_connect": "Connessione...",
|
||||
"wiz_cololight_desc2": "Ora scegli quali Cololights dovrebbero essere aggiunti. Per identificare le singole luci, premere il pulsante a destra.",
|
||||
"wiz_cololight_intro1": "Questa procedura guidata configura Hyperion per il sistema Cololight. Le caratteristiche sono il rilevamento automatico di Cololight e la regolazione automatica delle impostazioni di Hyperion! In breve: bastano pochi clic e il gioco è fatto!<br />Nota: in caso di una Strip Cololight, potrebbe essere necessario correggere manualmente il numero e il layout dei LED",
|
||||
"wiz_cololight_noprops": "Impossibile ottenere le proprietà del dispositivo: definire manualmente il numero dei LED",
|
||||
@@ -921,6 +1064,7 @@
|
||||
"wiz_hue_username": "ID Utente",
|
||||
"wiz_identify": "Identifica",
|
||||
"wiz_identify_light": "Identifica $1",
|
||||
"wiz_identify_tip": "Identifica il dispositivo configurato accendendolo",
|
||||
"wiz_ids_disabled": "Disattivato",
|
||||
"wiz_ids_entire": "Immagine intera",
|
||||
"wiz_noLights": "Nessun $1 trovato! Per favore connetti le luci alla rete o configurale manualmente",
|
||||
|
@@ -10,6 +10,9 @@
|
||||
"InfoDialog_nowrite_foottext": "Interfejs WebUI zostanie odblokowany automatycznie po rozwiązaniu problemu!",
|
||||
"InfoDialog_nowrite_text": "Hyperion nie może zapisać do aktualnie załadowanego pliku konfiguracyjnego. zmień uprawnienia zapisu plików, aby kontynuować.",
|
||||
"InfoDialog_nowrite_title": "Nie masz uprawnień do zapisu!",
|
||||
"InfoDialog_systemRestart_title": "Restart",
|
||||
"InfoDialog_systemResume_title": "Wznów",
|
||||
"InfoDialog_systemSuspend_title": "Zawieś",
|
||||
"about_3rd_party_licenses": "Licencje stron trzecich",
|
||||
"about_3rd_party_licenses_error": "Mieliśmy problem z gromadzeniem informacji o licencjach stron trzecich z sieci. <br /> Kliknij ten link do zasobu GitHub.",
|
||||
"about_build": "Build:",
|
||||
@@ -254,6 +257,8 @@
|
||||
"edt_conf_color_blue_title": "Niebieski",
|
||||
"edt_conf_color_brightnessComp_expl": "Kompensuje różnice jasności między czerwonym, zielonym, niebieskim, cyjanowym, purpurowym, żółtym i białym. 100 oznacza pełną kompensację, 0 oznacza brak kompensacji",
|
||||
"edt_conf_color_brightnessComp_title": "Kompensacja jasności",
|
||||
"edt_conf_color_brightnessGain_expl": "Reguluje jasność kolorów. 1.0 oznacza brak zmian, powyżej 1.0 zwiększa jasność, poniżej 1.0 zmniejsza jasność.",
|
||||
"edt_conf_color_brightnessGain_title": "Wzmocnienie jasności",
|
||||
"edt_conf_color_brightness_expl": "Ustaw jasność LEDów",
|
||||
"edt_conf_color_brightness_title": "Jasność",
|
||||
"edt_conf_color_channelAdjustment_header_expl": "Utwórz profile kolorów, które można przypisać do określonego profilu. Dostosuj kolor, gamma, jasność, kompensację i więcej",
|
||||
@@ -280,6 +285,8 @@
|
||||
"edt_conf_color_magenta_title": "Magenta",
|
||||
"edt_conf_color_red_expl": "Skalibrowana wartość koloru czerwonego",
|
||||
"edt_conf_color_red_title": "Czerwony",
|
||||
"edt_conf_color_saturationGain_expl": "Reguluje nasycenie kolorów. 1.0 oznacza brak zmian, powyżej 1.0 zwiększa nasycenie, poniżej 1.0 zmniejsza nasycenie.",
|
||||
"edt_conf_color_saturationGain_title": "Wzmocnienie nasycenia",
|
||||
"edt_conf_color_white_expl": "Skalibrowana wartość koloru białego.",
|
||||
"edt_conf_color_white_title": "Biały",
|
||||
"edt_conf_color_yellow_expl": "Skalibrowana wartość koloru żółtego",
|
||||
@@ -393,7 +400,7 @@
|
||||
"edt_conf_general_priority_title": "Kanał priorytetowy",
|
||||
"edt_conf_grabber_discovered_expl": "Wybierz wykryte urządzenie do przechwytywania",
|
||||
"edt_conf_grabber_discovered_none": "Nie wykryto urządzenia do przechwytywania",
|
||||
"edt_conf_grabber_discovered_title": "Wykryto urządzenie",
|
||||
"edt_conf_grabber_discovered_title": "Wykryte urządzenia",
|
||||
"edt_conf_grabber_discovered_title_info": "Wybierz wykryte urządzenie do przechwytywania",
|
||||
"edt_conf_grabber_discovery_inprogress": "Wykrywanie w toku",
|
||||
"edt_conf_instC_screen_grabber_device_expl": "Używane urządzenie do przechwytywania ekranu",
|
||||
@@ -435,8 +442,6 @@
|
||||
"edt_conf_smooth_heading_title": "Wygładzanie",
|
||||
"edt_conf_smooth_interpolationRate_expl": "Szybkość obliczania wygładzanych ramek pośrednich.",
|
||||
"edt_conf_smooth_interpolationRate_title": "Współczynnik interpolacji",
|
||||
"edt_conf_smooth_outputRate_expl": "Prędkość wyjściowa do twojego kontrolera led.",
|
||||
"edt_conf_smooth_outputRate_title": "Szybkość wyjściowa",
|
||||
"edt_conf_smooth_time_ms_expl": "Jak długo wygładzanie powinno zbierać obrazy?",
|
||||
"edt_conf_smooth_time_ms_title": "Czas",
|
||||
"edt_conf_smooth_type_expl": "Rodzaj wygładzania.",
|
||||
@@ -539,9 +544,13 @@
|
||||
"edt_dev_spec_FCsetConfig_title": "Ustaw konfigurację zanikania",
|
||||
"edt_dev_spec_LBap102Mode_title": "Tryb \"LightBerry APA102\"",
|
||||
"edt_dev_spec_PBFiFo_title": "Pi-Blaster FiFo",
|
||||
"edt_dev_spec_ada_mode_title": "Adalight - Standard",
|
||||
"edt_dev_spec_awa_mode_title": "HyperSerial - High speed",
|
||||
"edt_dev_spec_baudrate_title": "Prędkość (Baudrate)",
|
||||
"edt_dev_spec_blackLightsTimeout_title": "Limit czasu wykrywania sygnału na czarno",
|
||||
"edt_dev_spec_brightnessFactor_title": "Współczynnik jasności",
|
||||
"edt_dev_spec_brightnessMax_title": "Maksymalna jasność",
|
||||
"edt_dev_spec_brightnessMin_title": "Minimalna jasność",
|
||||
"edt_dev_spec_brightnessOverwrite_title": "Nadpisz jasność",
|
||||
"edt_dev_spec_brightnessThreshold_title": "Minimalna jasność wykrywania sygnału",
|
||||
"edt_dev_spec_brightness_title": "Jasność",
|
||||
@@ -601,6 +610,11 @@
|
||||
"edt_dev_spec_razer_device_title": "Urządzenie Razer Chroma",
|
||||
"edt_dev_spec_restoreOriginalState_title": "Przywróć oryginalny stan świateł, gdy są wyłączone",
|
||||
"edt_dev_spec_restoreOriginalState_title_info": "Przywróć pierwotny stan urządzenia, gdy jest ono wyłączone",
|
||||
"edt_dev_spec_rgbw_calibration_blue": "Wygląd kanału niebieskiego/białego",
|
||||
"edt_dev_spec_rgbw_calibration_enable": "Kalibracja kanału bieli (tylko RGBW)",
|
||||
"edt_dev_spec_rgbw_calibration_green": "Wygląd kanału zielonego/białego",
|
||||
"edt_dev_spec_rgbw_calibration_limit": "Limit kanału białego",
|
||||
"edt_dev_spec_rgbw_calibration_red": "Wygląd kanału czerwonego/białego",
|
||||
"edt_dev_spec_serial_title": "Numer seryjny",
|
||||
"edt_dev_spec_spipath_title": "SPI path",
|
||||
"edt_dev_spec_sslHSTimeoutMax_title": "Maksymalny limit czasu uzgadniania streamera",
|
||||
@@ -848,9 +862,11 @@
|
||||
"general_country_us": "Stany Zjednoczone (United States)",
|
||||
"general_disabled": "wyłączony",
|
||||
"general_enabled": "włączony",
|
||||
"general_speech_ca": "Kataloński",
|
||||
"general_speech_cs": "Czeski (Czech)",
|
||||
"general_speech_da": "Duński",
|
||||
"general_speech_de": "Niemiecki (German)",
|
||||
"general_speech_el": "Grecki",
|
||||
"general_speech_en": "Angielski (English)",
|
||||
"general_speech_es": "Hiszpański (Spanish)",
|
||||
"general_speech_fr": "Francuski (French)",
|
||||
|
@@ -10,6 +10,9 @@
|
||||
"InfoDialog_nowrite_foottext": "Веб-интерфейс будет разблокирован автоматически после того, как вы решите проблему!",
|
||||
"InfoDialog_nowrite_text": "Hyperion не может выполнять запись в ваш текущий загруженный файл конфигурации. Чтобы продолжить, восстановите права доступа к файлу.",
|
||||
"InfoDialog_nowrite_title": "Ошибка разрешения записи!",
|
||||
"InfoDialog_systemRestart_title": "Перезапустить",
|
||||
"InfoDialog_systemResume_title": "Продолжить",
|
||||
"InfoDialog_systemSuspend_title": "Отключить",
|
||||
"about_3rd_party_licenses": "Сторонние лицензии",
|
||||
"about_3rd_party_licenses_error": "У нас возникли проблемы со сбором информации о сторонних лицензиях из Интернета. <br /> Перейдите по этой ссылке на GitHub.",
|
||||
"about_build": "Сборка",
|
||||
@@ -51,6 +54,8 @@
|
||||
"conf_leds_contr_label_contrtype": "Тип контроллера:",
|
||||
"conf_leds_device_info_log": "Если ваши светодиоды не работают, проверьте здесь наличие ошибок:",
|
||||
"conf_leds_device_intro": "Hyperion поддерживает множество контроллеров для передачи данных на целевое устройство. Выберите светодиодный контроллер из списка и настройте его. Мы выбрали лучшие настройки по умолчанию для каждого устройства.",
|
||||
"conf_leds_error_get_properties_text": "Ошибка при работе с устройством. Проверьте настройки.",
|
||||
"conf_leds_error_get_properties_title": "Настройки устройства",
|
||||
"conf_leds_error_hwled_gt_layout": "Количество светодиодов оборудования ($1) больше, чем количество светодиодов, настроенных с помощью макета ($2), <br> $3 {{plural:$3|Светодиод|Светодиоды}} останутся черными, если вы продолжите.",
|
||||
"conf_leds_error_hwled_gt_maxled": "Количество светодиодов оборудования ($1) превышает максимальное количество светодиодов, поддерживаемое устройством ($2). <br> Счетчик аппаратных светодиодов установлен на ($3).",
|
||||
"conf_leds_error_hwled_lt_layout": "Количество светодиодных индикаторов оборудования ($1) меньше, чем количество светодиодов, настроенных с помощью макета ($2). <br> Количество светодиодов, настроенных в макете, не должно превышать количество доступных светодиодов",
|
||||
@@ -62,6 +67,7 @@
|
||||
"conf_leds_layout_blacklist_start_title": "Начальный светодиод",
|
||||
"conf_leds_layout_blacklistleds_title": "Светодиоды из черного списка",
|
||||
"conf_leds_layout_btn_checklist": "Показать сверку",
|
||||
"conf_leds_layout_btn_keystone": "Коррекция трапеции",
|
||||
"conf_leds_layout_button_savelay": "Сохранить раскладку",
|
||||
"conf_leds_layout_button_updsim": "Просмотр обновления",
|
||||
"conf_leds_layout_checkp1": "Черный светодиод — это ваш первый светодиод, первый светодиод — это точка, в которую вы вводите сигнал данных.",
|
||||
@@ -81,6 +87,16 @@
|
||||
"conf_leds_layout_cl_leftbottom": "Левый 50% - 100% снизу",
|
||||
"conf_leds_layout_cl_leftmiddle": "Левый 25% - 75% посередине",
|
||||
"conf_leds_layout_cl_lefttop": "Слева 0% - 50% сверху",
|
||||
"conf_leds_layout_cl_lightPosBottomLeft11": "Низ: 75 - 100% слева",
|
||||
"conf_leds_layout_cl_lightPosBottomLeft112": "Низ: 0 - 50% слева",
|
||||
"conf_leds_layout_cl_lightPosBottomLeft12": "Низ: 25 - 50% слева",
|
||||
"conf_leds_layout_cl_lightPosBottomLeft121": "Низ: 50 - 100% слева",
|
||||
"conf_leds_layout_cl_lightPosBottomLeft14": "Низ: 0 - 25% слева",
|
||||
"conf_leds_layout_cl_lightPosBottomLeft34": "Низ: 50 - 75% слева",
|
||||
"conf_leds_layout_cl_lightPosBottomLeftNewMid": "Низ: 25 - 75% слева",
|
||||
"conf_leds_layout_cl_lightPosTopLeft112": "Верх: 0 - 50% слева",
|
||||
"conf_leds_layout_cl_lightPosTopLeft121": "Верх: 50 - 100% слева",
|
||||
"conf_leds_layout_cl_lightPosTopLeftNewMid": "Верх: 25 - 75% слева",
|
||||
"conf_leds_layout_cl_overlap": "Нахлёст",
|
||||
"conf_leds_layout_cl_reversdir": "Обратное направление",
|
||||
"conf_leds_layout_cl_right": "Справа",
|
||||
@@ -95,6 +111,7 @@
|
||||
"conf_leds_layout_generatedconf": "Сгенерированная/Текущая Конфигурация LED",
|
||||
"conf_leds_layout_intro": "Вам также нужна LED-раскладка, которая отражает положение ваших светодиодов. Классическая раскладка обычно представляет ТВ-рамку, но поддерживается и LED-матрица (LED-стена). Вид на этой раскладке ВСЕГДА СПЕРЕДИ вашего ТВ.",
|
||||
"conf_leds_layout_ma_cabling": "Подключение",
|
||||
"conf_leds_layout_ma_direction": "Направление",
|
||||
"conf_leds_layout_ma_horiz": "Горизонтально",
|
||||
"conf_leds_layout_ma_optbottomleft": "Низ слева",
|
||||
"conf_leds_layout_ma_optbottomright": "Низ справа",
|
||||
@@ -181,6 +198,7 @@
|
||||
"dashboard_infobox_label_instance": "Пример:",
|
||||
"dashboard_infobox_label_latesthyp": "Последняя версия Hyperion:",
|
||||
"dashboard_infobox_label_platform": "Платформа:",
|
||||
"dashboard_infobox_label_port_boblight": "Boblight сервер:",
|
||||
"dashboard_infobox_label_port_flat": "Плоский буфер:",
|
||||
"dashboard_infobox_label_port_json": "JSON-сервер",
|
||||
"dashboard_infobox_label_port_proto": "Протобуфер:",
|
||||
@@ -213,6 +231,7 @@
|
||||
"edt_append_percent_v": "% верт.",
|
||||
"edt_append_pixel": "Пиксель",
|
||||
"edt_append_s": "сек",
|
||||
"edt_append_sdegree": "с/градус",
|
||||
"edt_conf_bb_blurRemoveCnt_expl": "Количество пикселей, которые удаляются с обнаруженной границы, чтобы убрать размытие.",
|
||||
"edt_conf_bb_blurRemoveCnt_title": "Размытие пикселя",
|
||||
"edt_conf_bb_borderFrameCnt_expl": "Количество кадров до установки согласованной обнаруженной границы.",
|
||||
@@ -238,6 +257,8 @@
|
||||
"edt_conf_color_blue_title": "Синий",
|
||||
"edt_conf_color_brightnessComp_expl": "Компенсирует разницу в яркости между красным, зеленым, синим, голубым, пурпурным, жёлтым и белым. 100 означает полную компенсацию, 0 без компенсации",
|
||||
"edt_conf_color_brightnessComp_title": "Компенсация яркости",
|
||||
"edt_conf_color_brightnessGain_expl": "Настройка яркости. 1.0 - без коррекции, больше 1.0 - повышает, а меньше 1.0 уменьшает яркость.",
|
||||
"edt_conf_color_brightnessGain_title": "Яркость",
|
||||
"edt_conf_color_brightness_expl": "установить общую яркость светодиодов",
|
||||
"edt_conf_color_brightness_title": "Яркость",
|
||||
"edt_conf_color_channelAdjustment_header_expl": "Создавайте цветовые профили, которые можно назначить конкретному компоненту. Отрегулируйте цвет, гамму, яркость, компенсацию и многое другое.",
|
||||
@@ -264,6 +285,8 @@
|
||||
"edt_conf_color_magenta_title": "Пурпурный",
|
||||
"edt_conf_color_red_expl": "Откалиброванное значение красного.",
|
||||
"edt_conf_color_red_title": "Красный",
|
||||
"edt_conf_color_saturationGain_expl": "Настройка насыщенности цветов. 1.0 - без коррекции, больше 1.0 - повышает, а меньше 1.0 уменьшает насыщенность.",
|
||||
"edt_conf_color_saturationGain_title": "Насыщенность",
|
||||
"edt_conf_color_white_expl": "Калиброванное значение белого.",
|
||||
"edt_conf_color_white_title": "Белый",
|
||||
"edt_conf_color_yellow_expl": "Откалиброванное значение жёлтого цвета.",
|
||||
@@ -319,6 +342,8 @@
|
||||
"edt_conf_enum_top_down": "Сверху вниз",
|
||||
"edt_conf_enum_transeffect_smooth": "Сглаживание",
|
||||
"edt_conf_enum_transeffect_sudden": "Внезапный",
|
||||
"edt_conf_enum_udp_ddp": "DDP",
|
||||
"edt_conf_enum_udp_raw": "RAW",
|
||||
"edt_conf_enum_unicolor_mean": "Одноцветный",
|
||||
"edt_conf_fbs_heading_title": "Сервер Flatbuffers",
|
||||
"edt_conf_fbs_timeout_expl": "Если данные за указанный период не поступают, компонент будет (мягко) отключён.",
|
||||
@@ -347,11 +372,18 @@
|
||||
"edt_conf_fge_type_title": "Тип",
|
||||
"edt_conf_fw_flat_expl": "Одна цель плоского буфера на строку. Содержит IP: ПОРТ (Пример: 127.0.0.1:19401)",
|
||||
"edt_conf_fw_flat_itemtitle": "цель плоского буфера",
|
||||
"edt_conf_fw_flat_services_discovered_expl": "Обнаруженные Hyperion сервера с flatbuffer сервисами",
|
||||
"edt_conf_fw_flat_services_discovered_title": "Найденные Flatbuffer цели",
|
||||
"edt_conf_fw_flat_title": "Список целей плоского буфера",
|
||||
"edt_conf_fw_heading_title": "Экспедитор",
|
||||
"edt_conf_fw_json_expl": "Одна json цель на строку. Содержит IP:PORT (Пример: 127.0.0.1:19446)",
|
||||
"edt_conf_fw_json_itemtitle": "Цель Json",
|
||||
"edt_conf_fw_json_itemtitle": "Цель JSON",
|
||||
"edt_conf_fw_json_services_discovered_expl": "Обнаруженные Hyperion сервера с JSON-API сервисами",
|
||||
"edt_conf_fw_json_services_discovered_title": "Найденные JSON цели",
|
||||
"edt_conf_fw_json_title": "Список целей json",
|
||||
"edt_conf_fw_remote_service_discovered_none": "Не найдено никаких сервисов",
|
||||
"edt_conf_fw_service_name_expl": "Название провайдера",
|
||||
"edt_conf_fw_service_name_title": "Название сервиса",
|
||||
"edt_conf_gen_configVersion_title": "Версия конфигурации",
|
||||
"edt_conf_gen_heading_title": "Общие настройки",
|
||||
"edt_conf_gen_name_expl": "Пользовательское имя, которое используется для обнаружения Hyperion. (Полезно с более чем одним экземпляром Hyperion)",
|
||||
@@ -410,8 +442,6 @@
|
||||
"edt_conf_smooth_heading_title": "Сглаживание",
|
||||
"edt_conf_smooth_interpolationRate_expl": "Скорость расчета плавных промежуточных кадров.",
|
||||
"edt_conf_smooth_interpolationRate_title": "Скорость интерполяции",
|
||||
"edt_conf_smooth_outputRate_expl": "Скорость вывода на ваш светодиодный контроллер.",
|
||||
"edt_conf_smooth_outputRate_title": "Выходная скорость",
|
||||
"edt_conf_smooth_time_ms_expl": "Как долго сглаживание должно собирать картинки?",
|
||||
"edt_conf_smooth_time_ms_title": "Время",
|
||||
"edt_conf_smooth_type_expl": "Тип сглаживания.",
|
||||
@@ -497,8 +527,13 @@
|
||||
"edt_dev_enum_subtract_minimum": "Уменьшить минимум",
|
||||
"edt_dev_enum_white_off": "Выключить белый ",
|
||||
"edt_dev_general_autostart_title": "Автозапуск",
|
||||
"edt_dev_general_autostart_title_info": "Включать LED устройство при загрузке или нет",
|
||||
"edt_dev_general_colorOrder_title": "Порядок байтов RGB",
|
||||
"edt_dev_general_colorOrder_title_info": "Порядок цвета устройства",
|
||||
"edt_dev_general_enableAttemptsInterval_title": "Задержка",
|
||||
"edt_dev_general_enableAttemptsInterval_title_info": "Задержка между попытками подключения",
|
||||
"edt_dev_general_enableAttempts_title": "Количество попыток",
|
||||
"edt_dev_general_enableAttempts_title_info": "Количество попыток подключения к устройству до аварийного состояния.",
|
||||
"edt_dev_general_hardwareLedCount_title": "Количество светодиодных индикаторов оборудования",
|
||||
"edt_dev_general_hardwareLedCount_title_info": "Количество физических светодиодов, доступных для данного устройства",
|
||||
"edt_dev_general_heading_title": "Общие настройки",
|
||||
@@ -509,12 +544,17 @@
|
||||
"edt_dev_spec_FCsetConfig_title": "Установить конфигурацию fadecandy",
|
||||
"edt_dev_spec_LBap102Mode_title": "Режим LightBerry APA102",
|
||||
"edt_dev_spec_PBFiFo_title": "Pi-Blaster FiFo",
|
||||
"edt_dev_spec_ada_mode_title": "Adalight - Стандартно",
|
||||
"edt_dev_spec_awa_mode_title": "HyperSerial - Высокая скорость",
|
||||
"edt_dev_spec_baudrate_title": "Скорость",
|
||||
"edt_dev_spec_blackLightsTimeout_title": "Тайм-аут обнаружения сигнала на черном",
|
||||
"edt_dev_spec_brightnessFactor_title": "Фактор яркости",
|
||||
"edt_dev_spec_brightnessMax_title": "Максимальная яркость",
|
||||
"edt_dev_spec_brightnessMin_title": "Минимальная яркость",
|
||||
"edt_dev_spec_brightnessOverwrite_title": "Перезаписать яркость",
|
||||
"edt_dev_spec_brightnessThreshold_title": "Минимальная яркость обнаружения сигнала",
|
||||
"edt_dev_spec_brightness_title": "Яркость",
|
||||
"edt_dev_spec_candyGamma_title": "'Candy' режим (двойная гамма коррекция)",
|
||||
"edt_dev_spec_chanperfixture_title": "Каналов на прибор",
|
||||
"edt_dev_spec_cid_title": "CID",
|
||||
"edt_dev_spec_clientKey_title": "Клиентский ключ",
|
||||
@@ -530,6 +570,7 @@
|
||||
"edt_dev_spec_dmaNumber_title": "Канал DMA",
|
||||
"edt_dev_spec_gamma_title": "Гамма",
|
||||
"edt_dev_spec_globalBrightnessControlMaxLevel_title": "Максимальный текущий уровень",
|
||||
"edt_dev_spec_globalBrightnessControlThreshold_title": "Адаптивный контроль тока",
|
||||
"edt_dev_spec_gpioBcm_title": "Вывод GPIO",
|
||||
"edt_dev_spec_gpioMap_title": "Отображение GPIO",
|
||||
"edt_dev_spec_gpioNumber_title": "Номер GPIO",
|
||||
@@ -553,6 +594,8 @@
|
||||
"edt_dev_spec_networkDeviceName_title": "Сетевое имя устройства",
|
||||
"edt_dev_spec_networkDevicePort_title": "Порт",
|
||||
"edt_dev_spec_numberOfLeds_title": "Количество светодиодов",
|
||||
"edt_dev_spec_onBlackTimeToPowerOff": "Время до отключения подсветки если сработала проверка уровня черного",
|
||||
"edt_dev_spec_onBlackTimeToPowerOn": "Время до включения подсветки после восстановления сигнала",
|
||||
"edt_dev_spec_orbIds_title": "ID сфер",
|
||||
"edt_dev_spec_order_left_right_title": "2.",
|
||||
"edt_dev_spec_order_top_down_title": "1.",
|
||||
@@ -560,19 +603,27 @@
|
||||
"edt_dev_spec_panel_start_position": "Стартовая панель [0-макс панели]",
|
||||
"edt_dev_spec_panelorganisation_title": "Последовательность нумерации панелей",
|
||||
"edt_dev_spec_pid_title": "PID",
|
||||
"edt_dev_spec_port_expl": "Сервисный порт [1-65535]",
|
||||
"edt_dev_spec_port_title": "Порт",
|
||||
"edt_dev_spec_printTimeStamp_title": "Добавить отметку времени",
|
||||
"edt_dev_spec_pwmChannel_title": "Канал ШИМ (PWM)",
|
||||
"edt_dev_spec_razer_device_title": "Устройство Razer Chroma",
|
||||
"edt_dev_spec_restoreOriginalState_title": "Восстановить состояние огней",
|
||||
"edt_dev_spec_restoreOriginalState_title_info": "Восстановить исходное состояние устройства, когда устройство отключено",
|
||||
"edt_dev_spec_rgbw_calibration_blue": "Соотношение Синего/Белого каналов",
|
||||
"edt_dev_spec_rgbw_calibration_enable": "Калибровка белого (только для RGBW)",
|
||||
"edt_dev_spec_rgbw_calibration_green": "Соотношение Зеленого/Белого каналов",
|
||||
"edt_dev_spec_rgbw_calibration_limit": "Ограничение белого",
|
||||
"edt_dev_spec_rgbw_calibration_red": "Соотношение Красного/Белого каналов",
|
||||
"edt_dev_spec_serial_title": "Серийный номер",
|
||||
"edt_dev_spec_spipath_title": "Устройство SPI",
|
||||
"edt_dev_spec_sslHSTimeoutMax_title": "Максимальное время ожидания подтверждения стримером",
|
||||
"edt_dev_spec_sslHSTimeoutMin_title": "Минимальное время ожидания подтверждения стримером",
|
||||
"edt_dev_spec_stream_protocol_title": "Протокол",
|
||||
"edt_dev_spec_switchOffOnBlack_title": "Выключить черный",
|
||||
"edt_dev_spec_switchOffOnbelowMinBrightness_title": "Отключение, ниже минимального",
|
||||
"edt_dev_spec_syncOverwrite_title": "Выключить синхронизацию",
|
||||
"edt_dev_spec_targetIpHost_expl": "Имя хоста (DNS/mDNS) или IP адрес (IPv4 or IPv6)",
|
||||
"edt_dev_spec_targetIpHost_title": "Целевое имя хоста/IP-адрес",
|
||||
"edt_dev_spec_targetIpHost_title_info": "Имя хоста или IP-адрес устройства",
|
||||
"edt_dev_spec_targetIp_title": "Целевой IP-адрес",
|
||||
@@ -811,14 +862,17 @@
|
||||
"general_country_us": "Соединённые Штаты Америки",
|
||||
"general_disabled": "отключено",
|
||||
"general_enabled": "включено",
|
||||
"general_speech_ca": "Каталонский",
|
||||
"general_speech_cs": "Чешский",
|
||||
"general_speech_da": "Danish",
|
||||
"general_speech_da": "Датский",
|
||||
"general_speech_de": "Немецкий",
|
||||
"general_speech_el": "Греческий",
|
||||
"general_speech_en": "Английский",
|
||||
"general_speech_es": "Испанский",
|
||||
"general_speech_fr": "французский",
|
||||
"general_speech_hu": "Hungarian",
|
||||
"general_speech_hu": "Венгерский",
|
||||
"general_speech_it": "Итальянский",
|
||||
"general_speech_ja": "Японский",
|
||||
"general_speech_nb": "норвежский",
|
||||
"general_speech_nl": "Dutch",
|
||||
"general_speech_pl": "Polish",
|
||||
|
@@ -10,6 +10,9 @@
|
||||
"InfoDialog_nowrite_foottext": "Webbkonfigurationen kommer att släppas igen automatiskt så snart problemet har åtgärdats!",
|
||||
"InfoDialog_nowrite_text": "Hyperion har inte skrivbehörighet till den för närvarande inlästa konfigurationen. Korrigera filbehörigheterna för att fortsätta.",
|
||||
"InfoDialog_nowrite_title": "Skrivåtkomstfel!",
|
||||
"InfoDialog_systemRestart_title": "Starta om",
|
||||
"InfoDialog_systemResume_title": "Återuppta",
|
||||
"InfoDialog_systemSuspend_title": "Stäng av",
|
||||
"about_3rd_party_licenses": "Tredjepartslicenser",
|
||||
"about_3rd_party_licenses_error": "Vi hade problem med att ladda tredjepartslicenserna från internet. <br />Klicka här för att komma åt filen på GitHub.",
|
||||
"about_build": "Bygge",
|
||||
@@ -55,7 +58,9 @@
|
||||
"conf_leds_error_get_properties_title": "Enhetsegenskaper",
|
||||
"conf_leds_error_hwled_gt_layout": "Antalet givna hårdvarulysdioder ($1) är större än antalet definierade i LED-layouten ($2), $3 {{plural:$3|LEDs kommer|LEDs kommer att vara}} förblir svarta.",
|
||||
"conf_leds_error_hwled_gt_maxled": "Antalet LED-lampor för hårdvara ($1) är större än det maximala antalet lysdioder som stöds av enheten ($2). <br> Antalet LED-lampor för hårdvara är inställt på ($3).",
|
||||
"conf_leds_error_hwled_gt_maxled_protocol": "Antalet LED-lampor för hårdvara ($1) är större än det maximala antalet lysdioder som stöds av streamingprotokollet ($2). <br> Strömningsprotokollet kommer att ändras till ($3).",
|
||||
"conf_leds_error_hwled_lt_layout": "Antalet givna hårdvarulysdioder ($1) är mindre än antalet definierade i LED-layouten ($2). <br> I LED-layouten får inte fler lysdioder konfigureras än vad som är tillgängligt.",
|
||||
"conf_leds_error_wled_segment_missing": "Det för närvarande konfigurerade segmentet ($1) är inte konfigurerat på din WLED-enhet.<br>Du kan behöva kontrollera WLED-konfigurationen!<br>Konfigurationssidan representerar den aktuella WLED-inställningen.",
|
||||
"conf_leds_info_ws281x": "Hyperion måste köras med 'root'-privilegier för denna styrenhetstyp!",
|
||||
"conf_leds_layout_advanced": "Utökade alternativ",
|
||||
"conf_leds_layout_blacklist_num_title": "Antal lysdioder",
|
||||
@@ -439,8 +444,6 @@
|
||||
"edt_conf_smooth_heading_title": "Utjämning",
|
||||
"edt_conf_smooth_interpolationRate_expl": "Frekvens i vilken mellanliggande utjämningssteg beräknas.",
|
||||
"edt_conf_smooth_interpolationRate_title": "Interpolationsfrekvens",
|
||||
"edt_conf_smooth_outputRate_expl": "Utgångsfrekvensen till LED-enheten",
|
||||
"edt_conf_smooth_outputRate_title": "Utfrekvens",
|
||||
"edt_conf_smooth_time_ms_expl": "Hur länge ska utjämningen samla bilder?",
|
||||
"edt_conf_smooth_time_ms_title": "Tid",
|
||||
"edt_conf_smooth_type_expl": "Utjämningsalgoritm.",
|
||||
@@ -614,10 +617,17 @@
|
||||
"edt_dev_spec_rgbw_calibration_green": "Grön/Vit kanalförhållande",
|
||||
"edt_dev_spec_rgbw_calibration_limit": "Vit kanalgräns",
|
||||
"edt_dev_spec_rgbw_calibration_red": "Röd/Vit kanalförhållande",
|
||||
"edt_dev_spec_segmentId_title": "Segment-ID",
|
||||
"edt_dev_spec_segmentsOverlapValidation_error": "Korrigera WLED-inställningen! Segmentet får inte överlappa med {{plural:$1| segment|segments}}: \"$2\".",
|
||||
"edt_dev_spec_segmentsSwitchOffOthers_title": "Stäng av övriga segment",
|
||||
"edt_dev_spec_segments_disabled_title": "Segmentströmning inaktiverad vid WLED.",
|
||||
"edt_dev_spec_segments_title": "Streama till segment",
|
||||
"edt_dev_spec_serial_title": "Serienummer",
|
||||
"edt_dev_spec_spipath_title": "SPI Pfad",
|
||||
"edt_dev_spec_sslHSTimeoutMax_title": "Streamer handskakning maximal timeout",
|
||||
"edt_dev_spec_sslHSTimeoutMin_title": "Minsta timeout för Streamerhandslag",
|
||||
"edt_dev_spec_stayOnAfterStreaming_title": "Förbli på efter streaming",
|
||||
"edt_dev_spec_stayOnAfterStreaming_title_info": "Enheten förblir på efter streaming eller återställning.",
|
||||
"edt_dev_spec_stream_protocol_title": "Strömningsprotokoll",
|
||||
"edt_dev_spec_switchOffOnBlack_title": "Av på svart",
|
||||
"edt_dev_spec_switchOffOnbelowMinBrightness_title": "Av vid lägsta",
|
||||
@@ -861,9 +871,11 @@
|
||||
"general_country_us": "USA",
|
||||
"general_disabled": "Inaktiverad",
|
||||
"general_enabled": "Aktiverad",
|
||||
"general_speech_ca": "Katalanska",
|
||||
"general_speech_cs": "Tjeckiska",
|
||||
"general_speech_da": "Danska",
|
||||
"general_speech_de": "Tyska",
|
||||
"general_speech_el": "Grekiska",
|
||||
"general_speech_en": "Engelska",
|
||||
"general_speech_es": "Spanska",
|
||||
"general_speech_fr": "Franska",
|
||||
|
@@ -24,8 +24,10 @@
|
||||
<script src="js/lib/jquery/jquery-migrate-3.3.2.min.js"></script>
|
||||
|
||||
<!-- jQuery - Dev -->
|
||||
<!script src="js/lib/jquery/dev/jquery-3.6.0.js"></script>
|
||||
<!script src="js/lib/jquery/dev/jquery-migrate-3.3.2.js"></script>
|
||||
<!--
|
||||
<script src="js/lib/jquery/dev/jquery-3.6.0.js"></script>
|
||||
<script src="js/lib/jquery/dev/jquery-migrate-3.3.2.js"></script>
|
||||
-->
|
||||
|
||||
<!-- SemVer -->
|
||||
<script src='js/lib/semver.js'></script>
|
||||
|
@@ -58,7 +58,8 @@ $(document).ready(function () {
|
||||
if (components[idx].name != "ALL") {
|
||||
if ((components[idx].name === "FORWARDER" && window.currentHyperionInstance != 0) ||
|
||||
(components[idx].name === "GRABBER" && !window.serverConfig.framegrabber.enable) ||
|
||||
(components[idx].name === "V4L" && !window.serverConfig.grabberV4L2.enable))
|
||||
(components[idx].name === "V4L" && !window.serverConfig.grabberV4L2.enable) ||
|
||||
(components[idx].name === "AUDIO" && !window.serverConfig.grabberAudio.enable))
|
||||
continue;
|
||||
|
||||
var comp_enabled = components[idx].enabled ? "checked" : "";
|
||||
@@ -104,8 +105,9 @@ $(document).ready(function () {
|
||||
|
||||
var screenGrabberAvailable = (window.serverInfo.grabbers.screen.available.length !== 0);
|
||||
var videoGrabberAvailable = (window.serverInfo.grabbers.video.available.length !== 0);
|
||||
const audioGrabberAvailable = (window.serverInfo.grabbers.audio.available.length !== 0);
|
||||
|
||||
if (screenGrabberAvailable || videoGrabberAvailable) {
|
||||
if (screenGrabberAvailable || videoGrabberAvailable || audioGrabberAvailable) {
|
||||
|
||||
if (screenGrabberAvailable) {
|
||||
var screenGrabber = window.serverConfig.framegrabber.enable ? $.i18n('general_enabled') : $.i18n('general_disabled');
|
||||
@@ -120,6 +122,13 @@ $(document).ready(function () {
|
||||
} else {
|
||||
$("#dash_video_grabber_row").hide();
|
||||
}
|
||||
|
||||
if (audioGrabberAvailable) {
|
||||
const audioGrabber = window.serverConfig.grabberAudio.enable ? $.i18n('general_enabled') : $.i18n('general_disabled');
|
||||
$('#dash_audio_grabber').html(audioGrabber);
|
||||
} else {
|
||||
$("#dash_audio_grabber_row").hide();
|
||||
}
|
||||
} else {
|
||||
$("#dash_capture_hw").hide();
|
||||
}
|
||||
|
@@ -4,9 +4,11 @@ $(document).ready(function () {
|
||||
|
||||
var screenGrabberAvailable = (window.serverInfo.grabbers.screen.available.length !== 0);
|
||||
var videoGrabberAvailable = (window.serverInfo.grabbers.video.available.length !== 0);
|
||||
const audioGrabberAvailable = (window.serverInfo.grabbers.audio.available.length !== 0);
|
||||
var CEC_ENABLED = (jQuery.inArray("cec", window.serverInfo.services) !== -1);
|
||||
|
||||
var conf_editor_video = null;
|
||||
var conf_editor_audio = null;
|
||||
var conf_editor_screen = null;
|
||||
|
||||
var configuredDevice = "";
|
||||
@@ -38,6 +40,22 @@ $(document).ready(function () {
|
||||
}
|
||||
}
|
||||
|
||||
// Audio-Grabber
|
||||
if (audioGrabberAvailable) {
|
||||
$('#conf_cont').append(createRow('conf_cont_audio'));
|
||||
$('#conf_cont_audio').append(createOptPanel('fa-volume', $.i18n("edt_conf_audio_heading_title"), 'editor_container_audiograbber', 'btn_submit_audiograbber', 'panel-system', 'audiograbberPanelId'));
|
||||
|
||||
if (storedAccess === 'expert') {
|
||||
const conf_cont_audio_footer = document.getElementById("editor_container_audiograbber").nextElementSibling;
|
||||
$(conf_cont_audio_footer).prepend('<button class="btn btn-primary mdi-24px" id="btn_audiograbber_set_effect_defaults" disabled data-toggle="tooltip" data-placement="top" title="' + $.i18n("edt_conf_audio_hardware_set_defaults_tip") + '">'
|
||||
+ '<i class= "fa fa-fw fa-undo" ></i >' + $.i18n("edt_conf_audio_effect_set_defaults") + '</button > ');
|
||||
}
|
||||
|
||||
if (window.showOptHelp) {
|
||||
$('#conf_cont_audio').append(createHelpTable(window.schema.grabberAudio.properties, $.i18n("edt_conf_audio_heading_title"), "audiograbberHelpPanelId"));
|
||||
}
|
||||
}
|
||||
|
||||
JSONEditor.defaults.custom_validators.push(function (schema, value, path) {
|
||||
var errors = [];
|
||||
|
||||
@@ -694,6 +712,121 @@ $(document).ready(function () {
|
||||
});
|
||||
}
|
||||
|
||||
// External Input Sources (Audio-Grabbers)
|
||||
if (audioGrabberAvailable) {
|
||||
|
||||
conf_editor_audio = createJsonEditor('editor_container_audiograbber', {
|
||||
grabberAudio: window.schema.grabberAudio
|
||||
}, true, true);
|
||||
|
||||
conf_editor_audio.on('ready', () => {
|
||||
// Trigger conf_editor_audio.watch - 'root.grabberAudio.enable'
|
||||
const audioEnable = window.serverConfig.grabberAudio.enable;
|
||||
conf_editor_audio.getEditor("root.grabberAudio.enable").setValue(audioEnable);
|
||||
});
|
||||
|
||||
conf_editor_audio.on('change', () => {
|
||||
|
||||
// Validate the current editor's content
|
||||
if (!conf_editor_audio.validate().length) {
|
||||
const deviceSelected = conf_editor_audio.getEditor("root.grabberAudio.available_devices").getValue();
|
||||
switch (deviceSelected) {
|
||||
case "SELECT":
|
||||
showInputOptionsForKey(conf_editor_audio, "grabberAudio", ["enable", "available_devices"], false);
|
||||
break;
|
||||
case "NONE":
|
||||
showInputOptionsForKey(conf_editor_audio, "grabberAudio", ["enable", "available_devices"], false);
|
||||
break;
|
||||
default:
|
||||
window.readOnlyMode ? $('#btn_submit_audiograbber').prop('disabled', true) : $('#btn_submit_audiograbber').prop('disabled', false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else {
|
||||
$('#btn_submit_audiograbber').prop('disabled', true);
|
||||
}
|
||||
});
|
||||
|
||||
// Enable
|
||||
conf_editor_audio.watch('root.grabberAudio.enable', () => {
|
||||
|
||||
const audioEnable = conf_editor_audio.getEditor("root.grabberAudio.enable").getValue();
|
||||
if (audioEnable)
|
||||
{
|
||||
showInputOptionsForKey(conf_editor_audio, "grabberAudio", "enable", true);
|
||||
|
||||
$('#btn_audiograbber_set_effect_defaults').show();
|
||||
|
||||
if (window.showOptHelp) {
|
||||
$('#audiograbberHelpPanelId').show();
|
||||
}
|
||||
|
||||
discoverInputSources("audio");
|
||||
}
|
||||
else
|
||||
{
|
||||
$('#btn_submit_audiograbber').prop('disabled', false);
|
||||
$('#btn_audiograbber_set_effect_defaults').hide();
|
||||
showInputOptionsForKey(conf_editor_audio, "grabberAudio", "enable", false);
|
||||
$('#audiograbberHelpPanelId').hide();
|
||||
}
|
||||
});
|
||||
|
||||
// Available Devices
|
||||
conf_editor_audio.watch('root.grabberAudio.available_devices', () => {
|
||||
const deviceSelected = conf_editor_audio.getEditor("root.grabberAudio.available_devices").getValue();
|
||||
|
||||
if (deviceSelected === "SELECT" || deviceSelected === "NONE" || deviceSelected === "") {
|
||||
$('#btn_submit_audiograbber').prop('disabled', true);
|
||||
showInputOptionsForKey(conf_editor_audio, "grabberAudio", ["enable", "available_devices"], false);
|
||||
}
|
||||
else
|
||||
{
|
||||
showInputOptionsForKey(conf_editor_audio, "grabberAudio", ["enable", "available_devices"], true);
|
||||
|
||||
const deviceProperties = getPropertiesOfDevice("audio", deviceSelected);
|
||||
|
||||
//Update hidden input element
|
||||
conf_editor_audio.getEditor("root.grabberAudio.device").setValue(deviceProperties.device);
|
||||
|
||||
//Enfore configured JSON-editor dependencies
|
||||
conf_editor_audio.notifyWatchers("root.grabberAudio.audioEffect");
|
||||
|
||||
//Enable set defaults button
|
||||
$('#btn_audiograbber_set_effect_defaults').prop('disabled', false);
|
||||
|
||||
if (conf_editor_audio.validate().length && !window.readOnlyMode) {
|
||||
$('#btn_submit_audiograbber').prop('disabled', false);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
$('#btn_submit_audiograbber').off().on('click', function () {
|
||||
const saveOptions = conf_editor_audio.getValue();
|
||||
|
||||
const instCaptOptions = window.serverConfig.instCapture;
|
||||
instCaptOptions.audioEnable = true;
|
||||
saveOptions.instCapture = instCaptOptions;
|
||||
|
||||
requestWriteConfig(saveOptions);
|
||||
});
|
||||
|
||||
// ------------------------------------------------------------------
|
||||
|
||||
$('#btn_audiograbber_set_effect_defaults').off().on('click', function () {
|
||||
const currentEffect = conf_editor_audio.getEditor("root.grabberAudio.audioEffect").getValue();
|
||||
var effectEditor = conf_editor_audio.getEditor("root.grabberAudio." + currentEffect);
|
||||
var defaultProperties = effectEditor.schema.defaultProperties;
|
||||
|
||||
var default_values = {};
|
||||
for (const item of defaultProperties) {
|
||||
|
||||
default_values[item] = effectEditor.schema.properties[item].default;
|
||||
}
|
||||
effectEditor.setValue(default_values);
|
||||
});
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------
|
||||
|
||||
//////////////////////////////////////////////////
|
||||
@@ -706,6 +839,9 @@ $(document).ready(function () {
|
||||
if (videoGrabberAvailable) {
|
||||
createHint("intro", $.i18n('conf_grabber_v4l_intro'), "editor_container_videograbber");
|
||||
}
|
||||
if (audioGrabberAvailable) {
|
||||
createHint("intro", $.i18n('conf_grabber_audio_intro'), "editor_container_audiograbber");
|
||||
}
|
||||
}
|
||||
|
||||
removeOverlay();
|
||||
@@ -773,6 +909,38 @@ $(document).ready(function () {
|
||||
}
|
||||
};
|
||||
|
||||
// build dynamic audio input enum
|
||||
const updateAudioSourcesList = function (type, discoveryInfo) {
|
||||
const enumVals = [];
|
||||
const enumTitelVals = [];
|
||||
let enumDefaultVal = "";
|
||||
let addSelect = false;
|
||||
|
||||
if (jQuery.isEmptyObject(discoveryInfo)) {
|
||||
enumVals.push("NONE");
|
||||
enumTitelVals.push($.i18n('edt_conf_grabber_discovered_none'));
|
||||
}
|
||||
else {
|
||||
for (const device of discoveryInfo) {
|
||||
enumVals.push(device.device_name);
|
||||
}
|
||||
conf_editor_audio.getEditor('root.grabberAudio').enable();
|
||||
configuredDevice = window.serverConfig.grabberAudio.available_devices;
|
||||
|
||||
if ($.inArray(configuredDevice, enumVals) != -1) {
|
||||
enumDefaultVal = configuredDevice;
|
||||
}
|
||||
else {
|
||||
addSelect = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (enumVals.length > 0) {
|
||||
updateJsonEditorSelection(conf_editor_audio, 'root.grabberAudio',
|
||||
'available_devices', {}, enumVals, enumTitelVals, enumDefaultVal, addSelect, false);
|
||||
}
|
||||
};
|
||||
|
||||
async function discoverInputSources(type, params) {
|
||||
const result = await requestInputSourcesDiscovery(type, params);
|
||||
|
||||
@@ -782,7 +950,8 @@ $(document).ready(function () {
|
||||
}
|
||||
else {
|
||||
discoveryResult = {
|
||||
"video_sources": []
|
||||
"video_sources": [],
|
||||
"audio_soruces": []
|
||||
};
|
||||
}
|
||||
|
||||
@@ -799,6 +968,12 @@ $(document).ready(function () {
|
||||
updateVideoSourcesList(type, discoveredInputSources.video);
|
||||
}
|
||||
break;
|
||||
case "audio":
|
||||
discoveredInputSources.audio = discoveryResult.audio_sources;
|
||||
if (audioGrabberAvailable) {
|
||||
updateAudioSourcesList(type, discoveredInputSources.audio);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -278,8 +278,9 @@ $(document).ready(function () {
|
||||
if (getStorage('lastSelectedInstance'))
|
||||
removeStorage('lastSelectedInstance')
|
||||
|
||||
currentHyperionInstance = 0;
|
||||
currentHyperionInstanceName = getInstanceNameByIndex(0);
|
||||
window.currentHyperionInstance = 0;
|
||||
window.currentHyperionInstanceName = getInstanceNameByIndex(0);
|
||||
|
||||
requestServerConfig();
|
||||
setTimeout(requestServerInfo, 100)
|
||||
setTimeout(requestTokenInfo, 200)
|
||||
@@ -293,7 +294,7 @@ $(document).ready(function () {
|
||||
$('#btn_hypinstanceswitch').toggle(false)
|
||||
|
||||
// update listing for button
|
||||
updateUiOnInstance(currentHyperionInstance);
|
||||
updateUiOnInstance(window.currentHyperionInstance);
|
||||
updateHyperionInstanceListing();
|
||||
});
|
||||
|
||||
|
@@ -3,6 +3,7 @@ $(document).ready(function () {
|
||||
|
||||
var screenGrabberAvailable = (window.serverInfo.grabbers.screen.available.length !== 0);
|
||||
var videoGrabberAvailable = (window.serverInfo.grabbers.video.available.length !== 0);
|
||||
const audioGrabberAvailable = (window.serverInfo.grabbers.audio.available.length !== 0);
|
||||
|
||||
var BOBLIGHT_ENABLED = (jQuery.inArray("boblight", window.serverInfo.services) !== -1);
|
||||
|
||||
@@ -15,7 +16,7 @@ $(document).ready(function () {
|
||||
// Instance Capture
|
||||
|
||||
if (window.showOptHelp) {
|
||||
if (screenGrabberAvailable || videoGrabberAvailable) {
|
||||
if (screenGrabberAvailable || videoGrabberAvailable || audioGrabberAvailable) {
|
||||
$('#conf_cont').append(createRow('conf_cont_instCapt'));
|
||||
$('#conf_cont_instCapt').append(createOptPanel('fa-camera', $.i18n("edt_conf_instCapture_heading_title"), 'editor_container_instCapt', 'btn_submit_instCapt', ''));
|
||||
$('#conf_cont_instCapt').append(createHelpTable(window.schema.instCapture.properties, $.i18n("edt_conf_instCapture_heading_title")));
|
||||
@@ -29,7 +30,7 @@ $(document).ready(function () {
|
||||
}
|
||||
else {
|
||||
$('#conf_cont').addClass('row');
|
||||
if (screenGrabberAvailable || videoGrabberAvailable) {
|
||||
if (screenGrabberAvailable || videoGrabberAvailable || audioGrabberAvailable) {
|
||||
$('#conf_cont').append(createOptPanel('fa-camera', $.i18n("edt_conf_instCapture_heading_title"), 'editor_container_instCapt', 'btn_submit_instCapt', ''));
|
||||
}
|
||||
if (BOBLIGHT_ENABLED) {
|
||||
@@ -37,7 +38,7 @@ $(document).ready(function () {
|
||||
}
|
||||
}
|
||||
|
||||
if (screenGrabberAvailable || videoGrabberAvailable) {
|
||||
if (screenGrabberAvailable || videoGrabberAvailable || audioGrabberAvailable) {
|
||||
|
||||
// Instance Capture
|
||||
conf_editor_instCapt = createJsonEditor('editor_container_instCapt', {
|
||||
@@ -81,12 +82,29 @@ $(document).ready(function () {
|
||||
showInputOptionForItem(conf_editor_instCapt, "instCapture", "v4lPriority", false);
|
||||
}
|
||||
|
||||
if (audioGrabberAvailable) {
|
||||
if (!window.serverConfig.grabberAudio.enable) {
|
||||
conf_editor_instCapt.getEditor("root.instCapture.audioEnable").setValue(false);
|
||||
conf_editor_instCapt.getEditor("root.instCapture.audioEnable").disable();
|
||||
}
|
||||
else {
|
||||
conf_editor_instCapt.getEditor("root.instCapture.audioEnable").setValue(window.serverConfig.instCapture.audioEnable);
|
||||
|
||||
}
|
||||
} else {
|
||||
showInputOptionForItem(conf_editor_instCapt, "instCapture", "audioGrabberDevice", false);
|
||||
showInputOptionForItem(conf_editor_instCapt, "instCapture", "audioEnable", false);
|
||||
showInputOptionForItem(conf_editor_instCapt, "instCapture", "audioPriority", false);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
conf_editor_instCapt.on('change', function () {
|
||||
|
||||
if (!conf_editor_instCapt.validate().length) {
|
||||
if (!window.serverConfig.framegrabber.enable && !window.serverConfig.grabberV4L2.enable) {
|
||||
if (!window.serverConfig.framegrabber.enable &&
|
||||
!window.serverConfig.grabberV4L2.enable &&
|
||||
!window.serverConfig.grabberAudio.enable) {
|
||||
$('#btn_submit_instCapt').prop('disabled', true);
|
||||
} else {
|
||||
window.readOnlyMode ? $('#btn_submit_instCapt').prop('disabled', true) : $('#btn_submit_instCapt').prop('disabled', false);
|
||||
@@ -130,6 +148,23 @@ $(document).ready(function () {
|
||||
}
|
||||
});
|
||||
|
||||
conf_editor_instCapt.watch('root.instCapture.audioEnable', () => {
|
||||
const audioEnable = conf_editor_instCapt.getEditor("root.instCapture.audioEnable").getValue();
|
||||
if (audioEnable) {
|
||||
conf_editor_instCapt.getEditor("root.instCapture.audioGrabberDevice").setValue(window.serverConfig.grabberAudio.available_devices);
|
||||
conf_editor_instCapt.getEditor("root.instCapture.audioGrabberDevice").disable();
|
||||
showInputOptions("instCapture", ["audioGrabberDevice"], true);
|
||||
showInputOptions("instCapture", ["audioPriority"], true);
|
||||
}
|
||||
else {
|
||||
if (!window.serverConfig.grabberAudio.enable) {
|
||||
conf_editor_instCapt.getEditor("root.instCapture.audioEnable").disable();
|
||||
}
|
||||
showInputOptions("instCapture", ["audioGrabberDevice"], false);
|
||||
showInputOptions("instCapture", ["audioPriority"], false);
|
||||
}
|
||||
});
|
||||
|
||||
$('#btn_submit_instCapt').off().on('click', function () {
|
||||
requestWriteConfig(conf_editor_instCapt.getValue());
|
||||
});
|
||||
|
@@ -1002,6 +1002,21 @@ $(document).ready(function () {
|
||||
|
||||
addJsonEditorHostValidation();
|
||||
|
||||
JSONEditor.defaults.custom_validators.push(function (schema, value, path) {
|
||||
var errors = [];
|
||||
|
||||
if (path === "root.specificOptions.segments.segmentList") {
|
||||
var overlapSegNames = validateWledSegmentConfig(value);
|
||||
if (overlapSegNames.length > 0) {
|
||||
errors.push({
|
||||
path: "root.specificOptions.segments",
|
||||
message: $.i18n('edt_dev_spec_segmentsOverlapValidation_error', overlapSegNames.length, overlapSegNames.join(', '))
|
||||
});
|
||||
}
|
||||
}
|
||||
return errors;
|
||||
});
|
||||
|
||||
$("#leddevices").off().on("change", function () {
|
||||
var generalOptions = window.serverSchema.properties.device;
|
||||
|
||||
@@ -1080,8 +1095,8 @@ $(document).ready(function () {
|
||||
$('#btn_test_controller').hide();
|
||||
|
||||
switch (ledType) {
|
||||
case "cololight":
|
||||
case "wled":
|
||||
case "cololight":
|
||||
case "nanoleaf":
|
||||
showAllDeviceInputOptions("hostList", false);
|
||||
case "apa102":
|
||||
@@ -1107,7 +1122,22 @@ $(document).ready(function () {
|
||||
if (storedAccess === 'expert') {
|
||||
filter.discoverAll = true;
|
||||
}
|
||||
discover_device(ledType, filter);
|
||||
|
||||
$('#btn_submit_controller').prop('disabled', true);
|
||||
|
||||
discover_device(ledType, filter)
|
||||
.then(discoveryResult => {
|
||||
updateOutputSelectList(ledType, discoveryResult);
|
||||
})
|
||||
.then(discoveryResult => {
|
||||
if (ledType === "wled") {
|
||||
updateElementsWled(ledType);
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
showNotification('danger', "Device discovery for " + ledType + " failed with error:" + error);
|
||||
});
|
||||
|
||||
hwLedCountDefault = 1;
|
||||
colorOrderDefault = "rgb";
|
||||
break;
|
||||
@@ -1211,8 +1241,8 @@ $(document).ready(function () {
|
||||
}
|
||||
break;
|
||||
|
||||
case "cololight":
|
||||
case "wled":
|
||||
case "cololight":
|
||||
var hostList = conf_editor.getEditor("root.specificOptions.hostList").getValue();
|
||||
if (hostList !== "SELECT") {
|
||||
var host = conf_editor.getEditor("root.specificOptions.host").getValue();
|
||||
@@ -1339,7 +1369,9 @@ $(document).ready(function () {
|
||||
break;
|
||||
|
||||
case "wled":
|
||||
params = { host: host, filter: "info" };
|
||||
//Ensure that elements are defaulted for new host
|
||||
updateElementsWled(ledType, host);
|
||||
params = { host: host };
|
||||
getProperties_device(ledType, host, params);
|
||||
break;
|
||||
|
||||
@@ -1452,6 +1484,10 @@ $(document).ready(function () {
|
||||
}
|
||||
conf_editor.getEditor("root.specificOptions.rateList").setValue(rate);
|
||||
break;
|
||||
case "wled":
|
||||
var hardwareLedCount = conf_editor.getEditor("root.generalOptions.hardwareLedCount").getValue();
|
||||
validateWledLedCount(hardwareLedCount);
|
||||
break;
|
||||
default:
|
||||
}
|
||||
});
|
||||
@@ -1547,12 +1583,54 @@ $(document).ready(function () {
|
||||
}
|
||||
});
|
||||
|
||||
//WLED
|
||||
conf_editor.watch('root.specificOptions.segments.segmentList', () => {
|
||||
|
||||
//Update hidden streamSegmentId element
|
||||
var selectedSegment = conf_editor.getEditor("root.specificOptions.segments.segmentList").getValue();
|
||||
var streamSegmentId = parseInt(selectedSegment);
|
||||
conf_editor.getEditor("root.specificOptions.segments.streamSegmentId").setValue(streamSegmentId);
|
||||
|
||||
if (devicesProperties[ledType]) {
|
||||
var host = conf_editor.getEditor("root.specificOptions.host").getValue();
|
||||
var ledDeviceProperties = devicesProperties[ledType][host];
|
||||
|
||||
if (ledDeviceProperties) {
|
||||
var hardwareLedCount = 1;
|
||||
if (streamSegmentId > -1) {
|
||||
// Set hardware LED count to segment length
|
||||
if (ledDeviceProperties.state) {
|
||||
var segments = ledDeviceProperties.state.seg;
|
||||
var segmentConfig = segments.filter(seg => seg.id == streamSegmentId)[0];
|
||||
hardwareLedCount = segmentConfig.len;
|
||||
}
|
||||
} else {
|
||||
//"Use main segment only" is disabled, i.e. stream to all LEDs
|
||||
if (ledDeviceProperties.info) {
|
||||
hardwareLedCount = ledDeviceProperties.info.leds.count;
|
||||
}
|
||||
}
|
||||
conf_editor.getEditor("root.generalOptions.hardwareLedCount").setValue(hardwareLedCount);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
//Handle Hardware Led Count constraint list
|
||||
conf_editor.watch('root.generalOptions.hardwareLedCountList', () => {
|
||||
var hwLedCountSelected = conf_editor.getEditor("root.generalOptions.hardwareLedCountList").getValue();
|
||||
conf_editor.getEditor("root.generalOptions.hardwareLedCount").setValue(Number(hwLedCountSelected));
|
||||
});
|
||||
|
||||
//Handle Hardware Led update and constraints
|
||||
conf_editor.watch('root.generalOptions.hardwareLedCount', () => {
|
||||
var hardwareLedCount = conf_editor.getEditor("root.generalOptions.hardwareLedCount").getValue();
|
||||
switch (ledType) {
|
||||
case "wled":
|
||||
validateWledLedCount(hardwareLedCount);
|
||||
break;
|
||||
default:
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
//philipshueentertainment backward fix
|
||||
@@ -1798,8 +1876,8 @@ function saveLedConfig(genDefLayout = false) {
|
||||
location.reload();
|
||||
}
|
||||
|
||||
// build dynamic enum
|
||||
var updateSelectList = function (ledType, discoveryInfo) {
|
||||
// build dynamic enum for hosts or output paths
|
||||
var updateOutputSelectList = function (ledType, discoveryInfo) {
|
||||
// Only update, if ledType is equal of selected controller type and discovery info exists
|
||||
if (ledType !== $("#leddevices").val() || !discoveryInfo.devices) {
|
||||
return;
|
||||
@@ -1810,7 +1888,7 @@ var updateSelectList = function (ledType, discoveryInfo) {
|
||||
|
||||
var key;
|
||||
var enumVals = [];
|
||||
var enumTitelVals = [];
|
||||
var enumTitleVals = [];
|
||||
var enumDefaultVal = "";
|
||||
var addSelect = false;
|
||||
var addCustom = false;
|
||||
@@ -1835,7 +1913,7 @@ var updateSelectList = function (ledType, discoveryInfo) {
|
||||
|
||||
if (discoveryInfo.devices.length === 0) {
|
||||
enumVals.push("NONE");
|
||||
enumTitelVals.push($.i18n('edt_dev_spec_devices_discovered_none'));
|
||||
enumTitleVals.push($.i18n('edt_dev_spec_devices_discovered_none'));
|
||||
}
|
||||
else {
|
||||
var name;
|
||||
@@ -1876,7 +1954,7 @@ var updateSelectList = function (ledType, discoveryInfo) {
|
||||
}
|
||||
|
||||
enumVals.push(host);
|
||||
enumTitelVals.push(name);
|
||||
enumTitleVals.push(name);
|
||||
}
|
||||
|
||||
//Always allow to add custom configuration
|
||||
@@ -1904,7 +1982,7 @@ var updateSelectList = function (ledType, discoveryInfo) {
|
||||
|
||||
if (discoveryInfo.devices.length == 0) {
|
||||
enumVals.push("NONE");
|
||||
enumTitelVals.push($.i18n('edt_dev_spec_devices_discovered_none'));
|
||||
enumTitleVals.push($.i18n('edt_dev_spec_devices_discovered_none'));
|
||||
$('#btn_submit_controller').prop('disabled', true);
|
||||
showAllDeviceInputOptions(key, false);
|
||||
}
|
||||
@@ -1922,7 +2000,7 @@ var updateSelectList = function (ledType, discoveryInfo) {
|
||||
} else {
|
||||
enumVals.push(device.portName);
|
||||
}
|
||||
enumTitelVals.push(device.portName + " (" + device.vendorIdentifier + "|" + device.productIdentifier + ") - " + device.manufacturer);
|
||||
enumTitleVals.push(device.portName + " (" + device.vendorIdentifier + "|" + device.productIdentifier + ") - " + device.manufacturer);
|
||||
}
|
||||
|
||||
// Select configured device
|
||||
@@ -1951,7 +2029,7 @@ var updateSelectList = function (ledType, discoveryInfo) {
|
||||
|
||||
if (discoveryInfo.devices.length == 0) {
|
||||
enumVals.push("NONE");
|
||||
enumTitelVals.push($.i18n('edt_dev_spec_devices_discovered_none'));
|
||||
enumTitleVals.push($.i18n('edt_dev_spec_devices_discovered_none'));
|
||||
$('#btn_submit_controller').prop('disabled', true);
|
||||
showAllDeviceInputOptions(key, false);
|
||||
}
|
||||
@@ -1970,7 +2048,7 @@ var updateSelectList = function (ledType, discoveryInfo) {
|
||||
case "piblaster":
|
||||
for (const device of discoveryInfo.devices) {
|
||||
enumVals.push(device.systemLocation);
|
||||
enumTitelVals.push(device.deviceName + " (" + device.systemLocation + ")");
|
||||
enumTitleVals.push(device.deviceName + " (" + device.systemLocation + ")");
|
||||
}
|
||||
|
||||
// Select configured device
|
||||
@@ -1993,7 +2071,7 @@ var updateSelectList = function (ledType, discoveryInfo) {
|
||||
|
||||
if (discoveryInfo.devices.length == 0) {
|
||||
enumVals.push("NONE");
|
||||
enumTitelVals.push($.i18n('edt_dev_spec_devices_discovered_none'));
|
||||
enumTitleVals.push($.i18n('edt_dev_spec_devices_discovered_none'));
|
||||
$('#btn_submit_controller').prop('disabled', true);
|
||||
showAllDeviceInputOptions(key, false);
|
||||
|
||||
@@ -2004,18 +2082,19 @@ var updateSelectList = function (ledType, discoveryInfo) {
|
||||
}
|
||||
|
||||
if (enumVals.length > 0) {
|
||||
updateJsonEditorSelection(conf_editor, 'root.specificOptions', key, addSchemaElements, enumVals, enumTitelVals, enumDefaultVal, addSelect, addCustom);
|
||||
updateJsonEditorSelection(conf_editor, 'root.specificOptions', key, addSchemaElements, enumVals, enumTitleVals, enumDefaultVal, addSelect, addCustom);
|
||||
}
|
||||
};
|
||||
|
||||
async function discover_device(ledType, params) {
|
||||
|
||||
$('#btn_submit_controller').prop('disabled', true);
|
||||
|
||||
const result = await requestLedDeviceDiscovery(ledType, params);
|
||||
|
||||
var discoveryResult;
|
||||
if (result && !result.error) {
|
||||
var discoveryResult = {};
|
||||
if (result) {
|
||||
if (result.error) {
|
||||
throw (result.error);
|
||||
}
|
||||
discoveryResult = result.info;
|
||||
}
|
||||
else {
|
||||
@@ -2024,8 +2103,7 @@ async function discover_device(ledType, params) {
|
||||
ledDevicetype: ledType
|
||||
}
|
||||
}
|
||||
|
||||
updateSelectList(ledType, discoveryResult);
|
||||
return discoveryResult;
|
||||
}
|
||||
|
||||
async function getProperties_device(ledType, key, params) {
|
||||
@@ -2089,23 +2167,7 @@ function updateElements(ledType, key) {
|
||||
conf_editor.getEditor("root.generalOptions.hardwareLedCount").setValue(hardwareLedCount);
|
||||
break;
|
||||
case "wled":
|
||||
var ledProperties = devicesProperties[ledType][key];
|
||||
|
||||
if (ledProperties && ledProperties.leds) {
|
||||
hardwareLedCount = ledProperties.leds.count;
|
||||
if (ledProperties.maxLedCount) {
|
||||
var maxLedCount = ledProperties.maxLedCount;
|
||||
if (hardwareLedCount > maxLedCount) {
|
||||
showInfoDialog('warning', $.i18n("conf_leds_config_warning"), $.i18n('conf_leds_error_hwled_gt_maxled', hardwareLedCount, maxLedCount, maxLedCount));
|
||||
hardwareLedCount = maxLedCount;
|
||||
conf_editor.getEditor("root.specificOptions.streamProtocol").setValue("RAW");
|
||||
//Workaround, as value seems to getting updated property when a 'getEditor("root.specificOptions").getValue()' is done during save
|
||||
var editor = conf_editor.getEditor("root.specificOptions");
|
||||
editor.value["streamProtocol"] = "RAW";
|
||||
}
|
||||
}
|
||||
}
|
||||
conf_editor.getEditor("root.generalOptions.hardwareLedCount").setValue(hardwareLedCount);
|
||||
updateElementsWled(ledType, key);
|
||||
break;
|
||||
|
||||
case "nanoleaf":
|
||||
@@ -2190,3 +2252,168 @@ function disableAutoResolvedGeneralOptions() {
|
||||
conf_editor.getEditor("root.generalOptions.colorOrder").disable();
|
||||
}
|
||||
|
||||
function validateWledSegmentConfig(streamSegmentId) {
|
||||
var overlapSegNames = [];
|
||||
if (streamSegmentId > -1) {
|
||||
if (!jQuery.isEmptyObject(devicesProperties)) {
|
||||
var host = conf_editor.getEditor("root.specificOptions.host").getValue();
|
||||
var ledProperties = devicesProperties['wled'][host];
|
||||
if (ledProperties && ledProperties.state) {
|
||||
var segments = ledProperties.state.seg;
|
||||
var segmentConfig = segments.filter(seg => seg.id == streamSegmentId)[0];
|
||||
|
||||
var overlappingSegments = segments.filter((seg) => {
|
||||
if (seg.id != streamSegmentId) {
|
||||
if ((segmentConfig.start >= seg.stop) || (segmentConfig.start < seg.start && segmentConfig.stop <= seg.start)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
if (overlappingSegments.length > 0) {
|
||||
var overlapSegNames = [];
|
||||
for (const segment of overlappingSegments) {
|
||||
if (segment.n) {
|
||||
overlapSegNames.push(segment.n);
|
||||
} else {
|
||||
overlapSegNames.push("Segment " + segment.id);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return overlapSegNames;
|
||||
}
|
||||
|
||||
function validateWledLedCount(hardwareLedCount) {
|
||||
|
||||
if (!jQuery.isEmptyObject(devicesProperties)) {
|
||||
var host = conf_editor.getEditor("root.specificOptions.host").getValue();
|
||||
var ledDeviceProperties = devicesProperties["wled"][host];
|
||||
|
||||
if (ledDeviceProperties) {
|
||||
|
||||
var streamProtocol = conf_editor.getEditor("root.specificOptions.streamProtocol").getValue();
|
||||
if (streamProtocol === "RAW") {
|
||||
var maxLedCount = 490;
|
||||
if (ledDeviceProperties.maxLedCount) {
|
||||
//WLED not DDP ready
|
||||
maxLedCount = ledDeviceProperties.maxLedCount;
|
||||
if (hardwareLedCount > maxLedCount) {
|
||||
showInfoDialog('warning', $.i18n("conf_leds_config_warning"), $.i18n('conf_leds_error_hwled_gt_maxled', hardwareLedCount, maxLedCount, maxLedCount));
|
||||
hardwareLedCount = maxLedCount;
|
||||
conf_editor.getEditor("root.generalOptions.hardwareLedCount").setValue(hardwareLedCount);
|
||||
conf_editor.getEditor("root.specificOptions.streamProtocol").setValue("RAW");
|
||||
}
|
||||
} else {
|
||||
//WLED is DDP ready
|
||||
if (hardwareLedCount > maxLedCount) {
|
||||
var newStreamingProtocol = "DDP";
|
||||
showInfoDialog('warning', $.i18n("conf_leds_config_warning"), $.i18n('conf_leds_error_hwled_gt_maxled_protocol', hardwareLedCount, maxLedCount, newStreamingProtocol));
|
||||
conf_editor.getEditor("root.specificOptions.streamProtocol").setValue(newStreamingProtocol);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function updateElementsWled(ledType, key) {
|
||||
|
||||
// Get configured device's details
|
||||
var configuredDeviceType = window.serverConfig.device.type;
|
||||
var configuredHost = window.serverConfig.device.host;
|
||||
var host = conf_editor.getEditor("root.specificOptions.host").getValue();
|
||||
|
||||
//New segment selection list values
|
||||
var enumSegSelectVals = [];
|
||||
var enumSegSelectTitleVals = [];
|
||||
var enumSegSelectDefaultVal = "";
|
||||
|
||||
if (devicesProperties[ledType] && devicesProperties[ledType][key]) {
|
||||
var ledDeviceProperties = devicesProperties[ledType][key];
|
||||
|
||||
if (!jQuery.isEmptyObject(ledDeviceProperties)) {
|
||||
|
||||
if (ledDeviceProperties.info) {
|
||||
if (ledDeviceProperties.info.liveseg && ledDeviceProperties.info.liveseg < 0) {
|
||||
// "Use main segment only" is disabled
|
||||
var defaultSegmentId = "-1";
|
||||
enumSegSelectVals.push(defaultSegmentId);
|
||||
enumSegSelectTitleVals.push($.i18n('edt_dev_spec_segments_disabled_title'));
|
||||
enumSegSelectDefaultVal = defaultSegmentId;
|
||||
|
||||
} else {
|
||||
if (ledDeviceProperties.state) {
|
||||
//Prepare new segment selection list
|
||||
var segments = ledDeviceProperties.state.seg;
|
||||
for (const segment of segments) {
|
||||
enumSegSelectVals.push(segment.id.toString());
|
||||
if (segment.n) {
|
||||
enumSegSelectTitleVals.push(segment.n);
|
||||
} else {
|
||||
enumSegSelectTitleVals.push("Segment " + segment.id);
|
||||
}
|
||||
}
|
||||
var currentSegmentId = conf_editor.getEditor("root.specificOptions.segments.streamSegmentId").getValue().toString();
|
||||
enumSegSelectDefaultVal = currentSegmentId;
|
||||
}
|
||||
}
|
||||
|
||||
// Check if currently configured segment is available at WLED
|
||||
var configuredDeviceType = window.serverConfig.device.type;
|
||||
var configuredHost = window.serverConfig.device.host;
|
||||
|
||||
var host = conf_editor.getEditor("root.specificOptions.host").getValue();
|
||||
if (configuredDeviceType == ledType && configuredHost == host) {
|
||||
var configuredStreamSegmentId = window.serverConfig.device.segments.streamSegmentId.toString();
|
||||
var segmentIdFound = enumSegSelectVals.filter(segId => segId == configuredStreamSegmentId).length;
|
||||
if (!segmentIdFound) {
|
||||
showInfoDialog('warning', $.i18n("conf_leds_config_warning"), $.i18n('conf_leds_error_wled_segment_missing', configuredStreamSegmentId));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
//If failed to get properties
|
||||
var hardwareLedCount;
|
||||
var segmentConfig = false;
|
||||
|
||||
if (configuredDeviceType == ledType && configuredHost == host) {
|
||||
// Populate elements from existing configuration
|
||||
if (window.serverConfig.device.segments) {
|
||||
segmentConfig = true;
|
||||
}
|
||||
hardwareLedCount = window.serverConfig.device.hardwareLedCount;
|
||||
} else {
|
||||
// Populate elements with default values
|
||||
hardwareLedCount = 1;
|
||||
}
|
||||
|
||||
if (segmentConfig) {
|
||||
var configuredstreamSegmentId = window.serverConfig.device.segments.streamSegmentId.toString();
|
||||
enumSegSelectVals = [configuredstreamSegmentId];
|
||||
enumSegSelectTitleVals = ["Segment " + configuredstreamSegmentId];
|
||||
enumSegSelectDefaultVal = configuredstreamSegmentId;
|
||||
} else {
|
||||
defaultSegmentId = "-1";
|
||||
enumSegSelectVals.push(defaultSegmentId);
|
||||
enumSegSelectTitleVals.push($.i18n('edt_dev_spec_segments_disabled_title'));
|
||||
enumSegSelectDefaultVal = defaultSegmentId;
|
||||
}
|
||||
conf_editor.getEditor("root.generalOptions.hardwareLedCount").setValue(hardwareLedCount);
|
||||
}
|
||||
|
||||
updateJsonEditorSelection(conf_editor, 'root.specificOptions.segments',
|
||||
'segmentList', {}, enumSegSelectVals, enumSegSelectTitleVals, enumSegSelectDefaultVal, false, false);
|
||||
|
||||
//Show additional configuration options, if more than one segment is available
|
||||
var showAdditionalOptions = false;
|
||||
if (enumSegSelectVals.length > 1) {
|
||||
showAdditionalOptions = true;
|
||||
}
|
||||
showInputOptionForItem(conf_editor, "root.specificOptions.segments", "switchOffOtherSegments", showAdditionalOptions);
|
||||
}
|
||||
|
||||
|
@@ -35,7 +35,8 @@ $(document).ready(function () {
|
||||
function infoSummary() {
|
||||
var info = "";
|
||||
|
||||
info += 'Hyperion System Summary Report (' + window.serverConfig.general.name + '), Reported instance: ' + window.currentHyperionInstanceName + '\n';
|
||||
info += 'Hyperion System Summary Report (' + window.serverConfig.general.name + ')\n';
|
||||
info += 'Reported instance: [' + window.currentHyperionInstance + '] - ' + window.currentHyperionInstanceName + '\n';
|
||||
|
||||
info += "\n< ----- System information -------------------- >\n";
|
||||
info += getSystemInfo() + '\n';
|
||||
@@ -43,22 +44,36 @@ $(document).ready(function () {
|
||||
info += "\n< ----- Configured Instances ------------------ >\n";
|
||||
var instances = window.serverInfo.instance;
|
||||
for (var i = 0; i < instances.length; i++) {
|
||||
info += instances[i].instance + ': ' + instances[i].friendly_name + ' Running: ' + instances[i].running + '\n';
|
||||
info += instances[i].instance + ': ' + instances[i].friendly_name + ', Running: ' + instances[i].running + '\n';
|
||||
}
|
||||
|
||||
info += "\n< ----- This instance's priorities ------------ >\n";
|
||||
var prios = window.serverInfo.priorities;
|
||||
for (var i = 0; i < prios.length; i++) {
|
||||
info += prios[i].priority + ': ';
|
||||
if (prios[i].visible) {
|
||||
info += ' VISIBLE!';
|
||||
|
||||
if (prios.length > 0) {
|
||||
|
||||
for (var i = 0; i < prios.length; i++) {
|
||||
|
||||
var prio = prios[i].priority.toString().padStart(3, '0');
|
||||
|
||||
info += prio + ': ';
|
||||
if (prios[i].visible) {
|
||||
info += ' VISIBLE -';
|
||||
}
|
||||
else {
|
||||
info += ' INVISIBLE -';
|
||||
}
|
||||
info += ' (' + prios[i].componentId + ')';
|
||||
if (prios[i].owner) {
|
||||
info += ' (Owner: ' + prios[i].owner + ')';
|
||||
}
|
||||
info += '\n';
|
||||
|
||||
}
|
||||
else {
|
||||
info += ' ';
|
||||
}
|
||||
info += ' (' + prios[i].componentId + ') Owner: ' + prios[i].owner + '\n';
|
||||
} else {
|
||||
info += 'The current priority list is empty!\n';
|
||||
}
|
||||
info += 'priorities_autoselect: ' + window.serverInfo.priorities_autoselect + '\n';
|
||||
info += 'Autoselect: ' + window.serverInfo.priorities_autoselect + '\n';
|
||||
|
||||
info += "\n< ----- This instance components' status ------->\n";
|
||||
var comps = window.serverInfo.components;
|
||||
@@ -67,7 +82,7 @@ $(document).ready(function () {
|
||||
}
|
||||
|
||||
info += "\n< ----- This instance's configuration --------- >\n";
|
||||
info += JSON.stringify(window.serverConfig) + '\n';
|
||||
info += JSON.stringify(window.serverConfig, null, 2) + '\n';
|
||||
|
||||
info += "\n< ----- Current Log --------------------------- >\n";
|
||||
var logMsgs = document.getElementById("logmessages").textContent;
|
||||
@@ -193,18 +208,19 @@ $(document).ready(function () {
|
||||
});
|
||||
|
||||
// toggle fullscreen button in log output
|
||||
$(".fullscreen-btn").mousedown(function(e) {
|
||||
$(".fullscreen-btn").mousedown(function (e) {
|
||||
e.preventDefault();
|
||||
});
|
||||
|
||||
$(".fullscreen-btn").click(function(e) {
|
||||
$(".fullscreen-btn").click(function (e) {
|
||||
e.preventDefault();
|
||||
$(this).children('i')
|
||||
.toggleClass('fa-expand')
|
||||
.toggleClass('fa-compress');
|
||||
$('#conf_cont').toggle();
|
||||
$('#logmessages').css('max-height', $('#logmessages').css('max-height') !== 'none' ? 'none' : '400px' );
|
||||
$('#logmessages').css('max-height', $('#logmessages').css('max-height') !== 'none' ? 'none' : '400px');
|
||||
});
|
||||
|
||||
removeOverlay();
|
||||
});
|
||||
|
||||
|
@@ -98,7 +98,7 @@ $(document).ready(function () {
|
||||
}
|
||||
|
||||
function updateInputSelect() {
|
||||
$('.sstbody').html("");
|
||||
$('.sstbody').empty();
|
||||
var prios = window.serverInfo.priorities;
|
||||
var clearAll = false;
|
||||
|
||||
@@ -155,6 +155,9 @@ $(document).ready(function () {
|
||||
case "V4L":
|
||||
owner = $.i18n('general_comp_V4L') + ': (' + owner + ')';
|
||||
break;
|
||||
case "AUDIO":
|
||||
owner = $.i18n('general_comp_AUDIO') + ': (' + owner + ')';
|
||||
break;
|
||||
case "BOBLIGHTSERVER":
|
||||
owner = $.i18n('general_comp_BOBLIGHTSERVER');
|
||||
break;
|
||||
@@ -220,7 +223,8 @@ $(document).ready(function () {
|
||||
for (const comp of components) {
|
||||
if (comp.name === "ALL" || (comp.name === "FORWARDER" && window.currentHyperionInstance != 0) ||
|
||||
(comp.name === "GRABBER" && !window.serverConfig.framegrabber.enable) ||
|
||||
(comp.name === "V4L" && !window.serverConfig.grabberV4L2.enable))
|
||||
(comp.name === "V4L" && !window.serverConfig.grabberV4L2.enable) ||
|
||||
(comp.name === "AUDIO" && !window.serverConfig.grabberAudio.enable))
|
||||
continue;
|
||||
|
||||
const enable_style = (comp.enabled ? "checked" : "");
|
||||
|
@@ -171,6 +171,10 @@ function initLanguageSelection() {
|
||||
}
|
||||
|
||||
function updateUiOnInstance(inst) {
|
||||
|
||||
window.currentHyperionInstance = inst;
|
||||
window.currentHyperionInstanceName = getInstanceNameByIndex(inst);
|
||||
|
||||
$("#active_instance_friendly_name").text(getInstanceNameByIndex(inst));
|
||||
if (window.serverInfo.instance.filter(entry => entry.running).length > 1) {
|
||||
$('#btn_hypinstanceswitch').toggle(true);
|
||||
@@ -316,7 +320,7 @@ function showInfoDialog(type, header, message) {
|
||||
|
||||
$(document).on('click', '[data-dismiss-modal]', function () {
|
||||
var target = $(this).attr('data-dismiss-modal');
|
||||
$(target).modal('hide'); // lgtm [js/xss-through-dom]
|
||||
$.find(target).modal('hide');
|
||||
});
|
||||
}
|
||||
|
||||
@@ -407,6 +411,32 @@ function isJsonString(str) {
|
||||
return "";
|
||||
}
|
||||
|
||||
const getObjectProperty = (obj, path) => path.split(".").reduce((o, key) => o && typeof o[key] !== 'undefined' ? o[key] : undefined, obj);
|
||||
|
||||
const setObjectProperty = (object, path, value) => {
|
||||
const parts = path.split('.');
|
||||
const limit = parts.length - 1;
|
||||
for (let i = 0; i < limit; ++i) {
|
||||
const key = parts[i];
|
||||
if (key === "__proto__" || key === "constructor") continue;
|
||||
object = object[key] ?? (object[key] = {});
|
||||
}
|
||||
const key = parts[limit];
|
||||
object[key] = value;
|
||||
};
|
||||
|
||||
function getLongPropertiesPath(path) {
|
||||
if (path) {
|
||||
var path = path.replace('root.', '');
|
||||
const parts = path.split('.');
|
||||
parts.forEach(function (part, index) {
|
||||
this[index] += ".properties";
|
||||
}, parts);
|
||||
path = parts.join('.') + '.';
|
||||
}
|
||||
return path;
|
||||
}
|
||||
|
||||
function createJsonEditor(container, schema, setconfig, usePanel, arrayre) {
|
||||
$('#' + container).off();
|
||||
$('#' + container).html("");
|
||||
@@ -527,7 +557,8 @@ function updateJsonEditorSelection(rootEditor, path, key, addElements, newEnumVa
|
||||
|
||||
editor.original_schema.properties[key] = orginalProperties;
|
||||
editor.schema.properties[key] = newSchema[key];
|
||||
rootEditor.validator.schema.properties[editor.key].properties[key] = newSchema[key];
|
||||
//Update schema properties for validator
|
||||
setObjectProperty(rootEditor.validator.schema.properties, getLongPropertiesPath(path) + key, newSchema[key]);
|
||||
|
||||
editor.removeObjectProperty(key);
|
||||
delete editor.cached_editors[key];
|
||||
@@ -596,7 +627,8 @@ function updateJsonEditorMultiSelection(rootEditor, path, key, addElements, newE
|
||||
|
||||
editor.original_schema.properties[key] = orginalProperties;
|
||||
editor.schema.properties[key] = newSchema[key];
|
||||
rootEditor.validator.schema.properties[editor.key].properties[key] = newSchema[key];
|
||||
//Update schema properties for validator
|
||||
setObjectProperty(rootEditor.validator.schema.properties, getLongPropertiesPath(path) + key, newSchema[key]);
|
||||
|
||||
editor.removeObjectProperty(key);
|
||||
delete editor.cached_editors[key];
|
||||
@@ -644,7 +676,8 @@ function updateJsonEditorRange(rootEditor, path, key, minimum, maximum, defaultV
|
||||
|
||||
editor.original_schema.properties[key] = orginalProperties;
|
||||
editor.schema.properties[key] = newSchema[key];
|
||||
rootEditor.validator.schema.properties[editor.key].properties[key] = newSchema[key];
|
||||
//Update schema properties for validator
|
||||
setObjectProperty(rootEditor.validator.schema.properties, getLongPropertiesPath(path) + key, newSchema[key]);
|
||||
|
||||
editor.removeObjectProperty(key);
|
||||
delete editor.cached_editors[key];
|
||||
@@ -1187,6 +1220,7 @@ function getSystemInfo() {
|
||||
//info += '- Log lvl: ' + window.serverConfig.logger.level + '\n';
|
||||
info += '- Avail Screen Cap.: ' + window.serverInfo.grabbers.screen.available + '\n';
|
||||
info += '- Avail Video Cap.: ' + window.serverInfo.grabbers.video.available + '\n';
|
||||
info += '- Avail Audio Cap.: ' + window.serverInfo.grabbers.audio.available + '\n';
|
||||
info += '- Avail Services: ' + window.serverInfo.services + '\n';
|
||||
info += '- Config path: ' + shy.rootPath + '\n';
|
||||
info += '- Database: ' + (shy.readOnlyMode ? "ready-only" : "read/write") + '\n';
|
||||
@@ -1246,15 +1280,26 @@ function isAccessLevelCompliant(accessLevel) {
|
||||
}
|
||||
|
||||
function showInputOptions(path, elements, state) {
|
||||
|
||||
if (!path.startsWith("root.")) {
|
||||
path = ["root", path].join('.');
|
||||
}
|
||||
|
||||
for (var i = 0; i < elements.length; i++) {
|
||||
$('[data-schemapath="root.' + path + '.' + elements[i] + '"]').toggle(state);
|
||||
$('[data-schemapath="' + path + '.' + elements[i] + '"]').toggle(state);
|
||||
}
|
||||
}
|
||||
|
||||
function showInputOptionForItem(editor, path, item, state) {
|
||||
var accessLevel = editor.schema.properties[path].properties[item].access;
|
||||
//Get access level for full path and item
|
||||
var accessLevel = getObjectProperty(editor.schema.properties, getLongPropertiesPath(path) + item + ".access");
|
||||
// Enable element only, if access level compliant
|
||||
if (!state || isAccessLevelCompliant(accessLevel)) {
|
||||
|
||||
if (!path) {
|
||||
debugger;
|
||||
path = editor.path;
|
||||
}
|
||||
showInputOptions(path, [item], state);
|
||||
}
|
||||
}
|
||||
@@ -1269,17 +1314,26 @@ function showInputOptionsForKey(editor, item, showForKeys, state) {
|
||||
if (typeof showForKeys === 'string') {
|
||||
keysToshow.push(showForKeys);
|
||||
} else {
|
||||
return
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
for (var key in editor.schema.properties[item].properties) {
|
||||
for (let key in editor.schema.properties[item].properties) {
|
||||
if ($.inArray(key, keysToshow) === -1) {
|
||||
var accessLevel = editor.schema.properties[item].properties[key].access;
|
||||
const accessLevel = editor.schema.properties[item].properties[key].access;
|
||||
|
||||
var hidden = false;
|
||||
if (editor.schema.properties[item].properties[key].options) {
|
||||
hidden = editor.schema.properties[item].properties[key].options.hidden;
|
||||
if (typeof hidden === 'undefined') {
|
||||
hidden = false;
|
||||
}
|
||||
}
|
||||
//Always disable all elements, but only enable elements, if access level compliant
|
||||
if (!state || isAccessLevelCompliant(accessLevel)) {
|
||||
elements.push(key);
|
||||
if (!hidden) {
|
||||
elements.push(key);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1314,7 +1368,7 @@ function isValidIPv6(value) {
|
||||
|
||||
function isValidHostname(value) {
|
||||
if (value.match(
|
||||
'^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9])(.([a-zA-Z0-9]|[_a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]))*$' //lgtm [js/redos]
|
||||
'^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9])(.([a-zA-Z0-9]|[_a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]))*$'
|
||||
))
|
||||
return true;
|
||||
else
|
||||
@@ -1323,7 +1377,7 @@ function isValidHostname(value) {
|
||||
|
||||
function isValidServicename(value) {
|
||||
if (value.match(
|
||||
'^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9 -]{0,61}[a-zA-Z0-9])(.([a-zA-Z0-9]|[_a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]))*$' //lgtm [js/redos]
|
||||
'^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9 -]{0,61}[a-zA-Z0-9])(.([a-zA-Z0-9]|[_a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9]))*$'
|
||||
))
|
||||
return true;
|
||||
else
|
||||
|
@@ -864,6 +864,7 @@ function useGroupId(id) {
|
||||
get_hue_lights();
|
||||
}
|
||||
|
||||
|
||||
async function discover_hue_bridges() {
|
||||
$('#wiz_hue_ipstate').html($.i18n('edt_dev_spec_devices_discovery_inprogress'));
|
||||
$('#wiz_hue_discovered').html("")
|
||||
@@ -1021,11 +1022,11 @@ function beginWizardHue() {
|
||||
$('#host').val(host);
|
||||
|
||||
var port = eV("port");
|
||||
if (port > 0) {
|
||||
$('#port').val(port);
|
||||
if (port == 0) {
|
||||
$('#port').val(80);
|
||||
}
|
||||
else {
|
||||
$('#port').val('');
|
||||
$('#port').val(port);
|
||||
}
|
||||
hueIPs.unshift({ host: host, port: port });
|
||||
|
||||
@@ -1042,7 +1043,13 @@ function beginWizardHue() {
|
||||
|
||||
hueIPs = [];
|
||||
hueIPsinc = 0;
|
||||
hueIPs.push({ host: $('#host').val(), port: $('#port').val() });
|
||||
|
||||
var port = $('#port').val();
|
||||
if (isNaN(port) || port < 1 || port > 65535) {
|
||||
port = 80;
|
||||
$('#port').val(80);
|
||||
}
|
||||
hueIPs.push({ host: $('#host').val(), port: port });
|
||||
}
|
||||
else {
|
||||
discover_hue_bridges();
|
||||
|
Reference in New Issue
Block a user