Merge remote-tracking branch 'upstream/master' into temperture

This commit is contained in:
LordGrey
2023-02-20 08:46:18 +01:00
182 changed files with 6996 additions and 1787 deletions

View File

@@ -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

View File

@@ -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

View 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')

View File

@@ -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>

View File

@@ -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>

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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)",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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>

View File

@@ -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();
}

View File

@@ -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;
}
}

View File

@@ -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();
});

View File

@@ -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());
});

View File

@@ -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);
}

View File

@@ -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();
});

View File

@@ -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" : "");

View File

@@ -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

View File

@@ -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();