18#include <QApplication>
21#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
22#include <QStringConverter>
41#define LOC QString("LCDdevice: ")
44 : m_retryTimer(new QTimer(this)), m_ledTimer(new QTimer(this))
56 LOG(VB_GENERAL, LOG_DEBUG,
LOC +
57 "An LCD object now exists (LCD() was called)");
86 lcd_host =
GetMythDB()->GetSetting(
"LCDServerHost",
"localhost");
87 int lcd_port =
GetMythDB()->GetNumSetting(
"LCDServerPort", 6545);
91 if (lcd_host ==
"localhost")
92 lcd_host =
"127.0.0.1";
94 if (
m_enabled && lcd_host.length() > 0 && lcd_port > 1024)
110 LOG(VB_NETWORK, LOG_DEBUG,
LOC +
111 QString(
"connecting to host: %1 - port: %2")
112 .arg(lhostname).arg(lport));
130 if (
myth_system(
"ps ch -C mythlcdserver -o pid > /dev/null", flags) == 1)
133 LOG(VB_GENERAL, LOG_NOTICE,
"Starting mythlcdserver");
137 LOG(VB_GENERAL, LOG_ERR,
"Failed start MythTV LCD Server");
141 std::this_thread::sleep_for(500ms);
144 for (
int count = 1; count <= 10 && !
m_connected; count++)
146 LOG(VB_GENERAL, LOG_INFO, QString(
"Connecting to lcd server: "
153 QObject::connect(
m_socket, &QIODevice::readyRead,
155 QObject::connect(
m_socket, &QAbstractSocket::disconnected,
171 std::this_thread::sleep_for(500ms);
187 if (
m_socket->thread() != QThread::currentThread())
189 LOG(VB_GENERAL, LOG_ERR,
190 "Sending to LCDServer from wrong thread.");
195 if (QAbstractSocket::ConnectedState !=
m_socket->state())
203 LOG(VB_GENERAL, LOG_ERR,
204 "Connection to LCDServer died unexpectedly. "
205 "Trying to reconnect every 10 seconds...");
212#if QT_VERSION < QT_VERSION_CHECK(6,0,0)
213 os.setCodec(QTextCodec::codecForName(
"ISO 8859-1"));
215 os.setEncoding(QStringConverter::Latin1);
222 LOG(VB_NETWORK, LOG_DEBUG,
LOC +
223 QString(
"Sending to Server: %1").arg(someText));
226 os << someText <<
"\n";
255 QString lineFromServer;
264 int dataSize =
static_cast<int>(
m_socket->bytesAvailable() + 1);
265 QByteArray data(dataSize + 1, 0);
267 m_socket->read(data.data(), dataSize);
269 lineFromServer = data;
270 lineFromServer = lineFromServer.simplified();
273 if (lineFromServer !=
"OK")
274 LOG(VB_NETWORK, LOG_DEBUG,
LOC + QString(
"Received from server: %1")
275 .arg(lineFromServer));
277 aList = lineFromServer.split(
' ');
278 if (aList[0] ==
"CONNECTED")
282 if (aList.count() != 3)
284 LOG(VB_GENERAL, LOG_ERR,
LOC +
"received bad no. of arguments in "
285 "CONNECTED response from LCDServer");
292 LOG(VB_GENERAL, LOG_ERR,
LOC +
"received bad int for width in "
293 "CONNECTED response from LCDServer");
299 LOG(VB_GENERAL, LOG_ERR,
LOC +
"received bad int for height in "
300 "CONNECTED response from LCDServer");
305 else if (aList[0] ==
"HUH?")
307 LOG(VB_GENERAL, LOG_WARNING,
LOC +
"Something is getting passed to "
308 "LCDServer that it does not understand");
309 LOG(VB_GENERAL, LOG_WARNING,
LOC +
312 else if (aList[0] ==
"KEY")
322 QChar mykey = keyPressed.at(0);
334 key = Qt::Key_Escape;
336 QCoreApplication::postEvent(
337 (QObject *)(QApplication::activeWindow()),
377 LOG(VB_GENERAL, LOG_DEBUG,
LOC +
"stopAll");
478 emit
sendToServer(QString(
"SET_GENERIC_PROGRESS 0 %1").arg(value));
496 QString().setNum(value));
504 emit
sendToServer(QString(
"SET_MUSIC_PLAYER_PROP SHUFFLE %1").arg(shuffle));
512 emit
sendToServer(QString(
"SET_MUSIC_PLAYER_PROP REPEAT %1").arg(repeat));
522 else if (value > 1.0F)
526 emit
sendToServer(
"SET_VOLUME_LEVEL " + QString().setNum(value));
548 aString =
"UPDATE_LEDS ";
549 aString += QString::number(mask);
559 LOG(VB_GENERAL, LOG_DEBUG,
LOC +
"switchToTime");
569 LOG(VB_GENERAL, LOG_DEBUG,
LOC +
"switchToMusic");
577 const QString &subtitle)
582 LOG(VB_GENERAL, LOG_DEBUG,
LOC +
"switchToChannel");
595 LOG(VB_GENERAL, LOG_DEBUG,
LOC +
"switchToMenu");
597 if (menuItems.isEmpty())
600 QString s =
"SWITCH_TO_MENU ";
603 s +=
' ' + QString(popMenu ?
"TRUE" :
"FALSE");
606 for (
const auto& curItem : std::as_const(menuItems))
610 if (curItem.isChecked() ==
CHECKED)
612 else if (curItem.isChecked() ==
UNCHECKED)
615 s +=
" NOTCHECKABLE";
617 s +=
' ' + QString(curItem.isSelected() ?
"TRUE" :
"FALSE");
618 s +=
' ' + QString(curItem.Scroll() ?
"TRUE" :
"FALSE");
620 sIndent.setNum(curItem.getIndent());
632 LOG(VB_GENERAL, LOG_DEBUG,
LOC +
"switchToGeneric");
634 if (textItems.isEmpty())
637 QString s =
"SWITCH_TO_GENERIC";
639 for (
const auto& curItem : std::as_const(textItems))
642 sRow.setNum(curItem.getRow());
650 s +=
" ALIGN_CENTERED";
654 s +=
' ' + QString(curItem.getScroll() ?
"TRUE" :
"FALSE");
665 LOG(VB_GENERAL, LOG_DEBUG,
LOC +
"switchToVolume");
675 LOG(VB_GENERAL, LOG_DEBUG,
LOC +
"switchToNothing");
684 LOG(VB_GENERAL, LOG_DEBUG,
LOC +
"shutdown");
700 LOG(VB_GENERAL, LOG_DEBUG,
LOC +
"RESET");
709 LOG(VB_GENERAL, LOG_DEBUG,
LOC +
"An LCD device is being snuffed out of "
710 "existence (~LCD() was called)");
722 QString sRes = string;
723 sRes.replace(QString(
"\""), QString(
"\"\""));
724 sRes =
"\"" + sRes +
"\"";
void setAudioFormatLEDs(enum LCDAudioFormatSet acodec, bool on)
void setVideoSrcLEDs(enum LCDVideoSourceSet vsrc, bool on)
void setVolumeLevel(float value)
void setupLEDs(int(*LedMaskFunc)(void))
void sendToServer(const QString &someText)
void setFunctionLEDs(enum LCDFunctionSet func, bool on)
static void SetupLCD(void)
QString m_lcdShowMusicItems
bool connectToHost(const QString &hostname, unsigned int port)
void setGenericProgress(float value)
Update the generic progress bar.
static bool m_serverUnavailable
QRecursiveMutex m_socketLock
void setSpeakerLEDs(enum LCDSpeakerSet speaker, bool on)
void setGenericBusy()
Update the generic screen to display a busy spinner.
static QString quotedString(const QString &string)
void setMusicRepeat(int repeat)
Set music player's repeat properties.
int(* m_getLEDMask)(void)
void switchToMusic(const QString &artist, const QString &album, const QString &track)
void setTunerLEDs(enum LCDTunerSet tuner, bool on)
void setMusicProgress(const QString &time, float value)
void setMusicShuffle(int shuffle)
Set music player's shuffle properties.
void setVariousLEDs(enum LCDVariousFlags various, bool on)
void setVideoFormatLEDs(enum LCDVideoFormatSet vcodec, bool on)
void switchToMenu(QList< LCDMenuItem > &menuItems, const QString &app_name="", bool popMenu=true)
void switchToVolume(const QString &app_name)
static bool startLCDServer(void)
void sendToServerSlot(const QString &someText)
void switchToChannel(const QString &channum="", const QString &title="", const QString &subtitle="")
void switchToGeneric(QList< LCDTextItem > &textItems)
void handleKeyPress(const QString &keyPressed)
void setChannelProgress(const QString &time, float value)
@ GENERIC_EXIT_RUNNING
Process is running.
QString GetAppBinDir(void)
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
@ kMSDontBlockInputDevs
avoid blocking LIRC & Joystick Menu
@ kMSRunShell
run process through shell
@ kMSRunBackground
run child in the background
@ kMSDontDisableDrawing
avoid disabling UI drawing
uint myth_system(const QString &command, uint flags, std::chrono::seconds timeout)
static eu8 clamp(eu8 value, eu8 low, eu8 high)