MythTV master
lcdserver.cpp
Go to the documentation of this file.
1/*
2 lcdserver.cpp
3
4 Methods for the core lcdserver object
5*/
6
7
8/*
9 Command list
10
11 SWITCH_TO_TIME
12 SWITCH_TO_MUSIC "Artist" "Album" "Track"
13 SWITCH_TO_VOLUME "AppName"
14 SWITCH_TO_CHANNEL "ChanNum" "Title" "SubTitle"
15 SWITCH_TO_NOTHING
16 SWITCH_TO_MENU AppName popup ["Text" Checked Selected Scroll Indent ...]
17 AppName is a string
18 Popup can be TRUE or FALSE
19 Text is a string
20 Checked can be CHECKED, UNCHECKED, NOTCHECKABLE
21 Selected can be TRUE or FALSE
22 Scroll can be TRUE or FALSE
23 Indent is an integer
24 ... repeat as required
25
26 SWITCH_TO_GENERIC RowNo Align "Text" "Screen" Scrollable ...
27 RowNo is an integer
28 Align can be ALIGN_LEFT, ALIGN_RIGHT, ALIGN_CENTERED
29 Scrollable can be TRUE or FALSE
30 ... repeat as required
31
32 SET_VOLUME_LEVEL <level>
33 level is a float between 0.0 and 1.0
34
35 SET_CHANNEL_PROGRESS <progress>
36 progress is a float between 0.0 and 1.0
37
38 SET_MUSIC_PROGRESS "Time" <progress>
39 time is a string
40 progress is a float between 0.0 and 1.0
41
42 SET_MUSIC_PLAYER_PROP <field> <val>
43 field is a string, currently SHUFFLE or REPEAT
44 val depends on field, currently integer
45
46 SET_GENERIC_PROGRESS <busy> <progress>
47 busy is 0 for busy spinner, 0 for normal progess bar
48 progress is a float between 0.0 and 1.0
49
50 UPDATE_LEDS
51
52 STOP_ALL
53
54 RESET
55
56*/
57
58// c/c++
59#include <cstdlib>
60#include <utility>
61
62//qt
63#include <QCoreApplication>
64#include <QDir>
65#include <QList>
66#include <QStringList>
67
68// mythtv
72
73// mythlcdserver
74#include "lcdserver.h"
75
77
78#define LOC QString("LCDServer: ")
79#define LOC_WARN QString("LCDServer, Warning: ")
80#define LOC_ERR QString("LCDServer, Error: ")
81
82LCDServer::LCDServer(int port, QString message, std::chrono::seconds messageTime)
83 : m_lcd(new LCDProcClient(this)),
84 m_serverPool(new ServerPool())
85{
86 if (!m_lcd->SetupLCD())
87 {
88 delete m_lcd;
89 m_lcd = nullptr;
90 }
91
94
95 if (!m_serverPool->listen(port))
96 {
97 LOG(VB_GENERAL, LOG_ERR, "There is probably a copy of mythlcdserver "
98 "already running. You can verify this by running: \n"
99 "'ps ax | grep mythlcdserver'");
100 delete m_serverPool;
101 return;
102 }
103
104 if (m_lcd)
105 m_lcd->setStartupMessage(std::move(message), messageTime);
106}
107
108void LCDServer::newConnection(QTcpSocket *socket)
109{
110 connect(socket, &QIODevice::readyRead,
111 this, &LCDServer::readSocket);
112 connect(socket, &QAbstractSocket::disconnected,
114
115 if (debug_level > 0)
116 LOG(VB_NETWORK, LOG_INFO, "LCDServer: new connection");
117
118 if (m_lcd)
120}
121
123{
124 auto *socket = qobject_cast<QTcpSocket*>(sender());
125 if (socket)
126 {
127 socket->close();
128 socket->deleteLater();
129 if (debug_level > 0)
130 LOG(VB_NETWORK, LOG_INFO, "LCDServer: close connection");
131 }
132
133 if (m_lastSocket == socket)
134 m_lastSocket = nullptr;
135}
136
138{
139 auto *socket = qobject_cast<QTcpSocket*>(sender());
140 if (socket)
141 {
142 m_lastSocket = socket;
143
144 while(socket->canReadLine())
145 {
146 QString incoming_data = socket->readLine();
147 incoming_data = incoming_data.remove("\n");
148 incoming_data = incoming_data.remove("\r");
149 incoming_data = incoming_data.simplified();
150 QStringList tokens = parseCommand(incoming_data);
151 parseTokens(tokens, socket);
152 }
153 }
154}
155
156QStringList LCDServer::parseCommand(QString &command)
157{
158 QStringList tokens;
159 QString s = "";
160 QChar c;
161 bool bInString = false;
162
163 for (auto && x : std::as_const(command))
164 {
165 c = x;
166 if (!bInString && c == '"')
167 {
168 bInString = true;
169 }
170 else if (bInString && c == '"')
171 {
172 bInString = false;
173 }
174 else if (!bInString && c == ' ')
175 {
176 tokens.append(s);
177 s = "";
178 }
179 else
180 {
181 s = s + c;
182 }
183 }
184
185 tokens.append(s);
186
187 return tokens;
188}
189
190void LCDServer::parseTokens(const QStringList &tokens, QTcpSocket *socket)
191{
192 //
193 // parse commands coming in from the socket
194 //
195
196 if (tokens[0] == "HALT" ||
197 tokens[0] == "QUIT" ||
198 tokens[0] == "SHUTDOWN")
199 {
200 shutDown();
201 }
202 else if (tokens[0] == "HELLO")
203 {
204 sendConnected(socket);
205 }
206 else if (tokens[0] == "SWITCH_TO_TIME")
207 {
208 switchToTime(socket);
209 }
210 else if (tokens[0] == "SWITCH_TO_MUSIC")
211 {
212 switchToMusic(tokens, socket);
213 }
214 else if (tokens[0] == "SWITCH_TO_VOLUME")
215 {
216 switchToVolume(tokens, socket);
217 }
218 else if (tokens[0] == "SWITCH_TO_GENERIC")
219 {
220 switchToGeneric(tokens, socket);
221 }
222 else if (tokens[0] == "SWITCH_TO_MENU")
223 {
224 switchToMenu(tokens, socket);
225 }
226 else if (tokens[0] == "SWITCH_TO_CHANNEL")
227 {
228 switchToChannel(tokens, socket);
229 }
230 else if (tokens[0] == "SWITCH_TO_NOTHING")
231 {
232 switchToNothing(socket);
233 }
234 else if (tokens[0] == "SET_VOLUME_LEVEL")
235 {
236 setVolumeLevel(tokens, socket);
237 }
238 else if (tokens[0] == "SET_GENERIC_PROGRESS")
239 {
240 setGenericProgress(tokens, socket);
241 }
242 else if (tokens[0] == "SET_MUSIC_PROGRESS")
243 {
244 setMusicProgress(tokens, socket);
245 }
246 else if (tokens[0] == "SET_MUSIC_PLAYER_PROP")
247 {
248 setMusicProp(tokens, socket);
249 }
250 else if (tokens[0] == "SET_CHANNEL_PROGRESS")
251 {
252 setChannelProgress(tokens, socket);
253 }
254 else if (tokens[0] == "UPDATE_LEDS")
255 {
256 updateLEDs(tokens, socket);
257 }
258 else if (tokens[0] == "STOP_ALL")
259 {
260 if (m_lcd)
261 m_lcd->stopAll();
262 }
263 else if (tokens[0] == "RESET")
264 {
265 // reset lcd & reload settings
266 if (m_lcd)
267 m_lcd->reset();
268 }
269 else
270 {
271 QString did_not_parse = tokens.join(" ");
272
273 if (debug_level > 0)
274 LOG(VB_GENERAL, LOG_ERR, "LCDServer::failed to parse this: " +
275 did_not_parse);
276
277 sendMessage(socket, "HUH?");
278 }
279}
280
282{
283 if (debug_level > 0)
284 LOG(VB_GENERAL, LOG_INFO, "LCDServer:: shuting down");
285
286 m_serverPool->disconnect();
288 delete m_serverPool;
289 m_serverPool = nullptr;
290
291 exit(0);
292}
293
294void LCDServer::sendMessage(QTcpSocket *where, const QString &what)
295{
296 QString message = what;
297 message.append("\n");
298 QByteArray tmp = message.toUtf8();
299 where->write(tmp.constData(), tmp.length());
300}
301
302void LCDServer::sendKeyPress(const QString& key_pressed)
303{
304 if (debug_level > 0)
305 LOG(VB_GENERAL, LOG_INFO, "LCDServer:: send key press: " + key_pressed);
306
307 // send key press to last client that sent us a message
308 if (m_lastSocket)
309 sendMessage(m_lastSocket, "KEY " + key_pressed);
310}
311
312void LCDServer::sendConnected(QTcpSocket *socket)
313{
314 QString sWidth;
315 QString sHeight;
316 int nWidth = 0;
317 int nHeight = 0;
318
319 if (m_lcd)
320 {
321 nWidth = m_lcd->getLCDWidth();
322 nHeight = m_lcd->getLCDHeight();
323 }
324
325 sWidth = sWidth.setNum(nWidth);
326 sHeight = sHeight.setNum(nHeight);
327
328 sendMessage(socket, "CONNECTED " + sWidth + " " + sHeight);
329}
330
331void LCDServer::switchToTime(QTcpSocket *socket)
332{
333 if (debug_level > 0)
334 LOG(VB_GENERAL, LOG_INFO, "LCDServer:: SWITCH_TO_TIME");
335
336 if (m_lcd)
338
339 sendMessage(socket, "OK");
340}
341
342void LCDServer::switchToMusic(const QStringList &tokens, QTcpSocket *socket)
343{
344 if (debug_level > 0)
345 LOG(VB_GENERAL, LOG_INFO, "LCDServer: SWITCH_TO_MUSIC");
346
347 QString flat = tokens.join(" ");
348
349 if (tokens.count() != 4)
350 {
351 LOG(VB_GENERAL, LOG_ERR,
352 "LCDServer: bad SWITCH_TO_MUSIC command: " + flat);
353 sendMessage(socket, "HUH?");
354 return;
355 }
356
357 if (m_lcd)
358 m_lcd->switchToMusic(tokens[1], tokens[2], tokens[3]);
359
360 sendMessage(socket, "OK");
361}
362
363void LCDServer::switchToGeneric(const QStringList &tokens, QTcpSocket *socket)
364{
365 if (debug_level > 0)
366 LOG(VB_GENERAL, LOG_INFO, "LCDServer: SWITCH_TO_GENERIC");
367
368 QString flat = tokens.join(" ");
369
370 if ((tokens.count() - 1) % 5 != 0)
371 {
372 LOG(VB_GENERAL, LOG_ERR,
373 "LCDServer: bad no. of args SWITCH_TO_GENERIC command: " + flat);
374 sendMessage(socket, "HUH?");
375 return;
376 }
377
378 QList<LCDTextItem> items;
379
380 for (int x = 1; x < tokens.count(); x += 5)
381 {
382 bool bOK = false;
383 int row = tokens[x].toInt(&bOK);
384 if (!bOK)
385 {
386 LOG(VB_GENERAL, LOG_ERR,
387 "LCDServer: bad row no. in SWITCH_TO_GENERIC "
388 "command: " + tokens[x]);
389 sendMessage(socket, "HUH?");
390 return;
391 }
392
394 if (tokens[x + 1] == "ALIGN_LEFT") {
395 align = ALIGN_LEFT;
396 } else if (tokens[x + 1] == "ALIGN_RIGHT") {
397 align = ALIGN_RIGHT;
398 } else if (tokens[x + 1] == "ALIGN_CENTERED") {
399 align = ALIGN_CENTERED;
400 } else {
401 LOG(VB_GENERAL, LOG_ERR,
402 "LCDServer: bad align in SWITCH_TO_GENERIC command: " +
403 tokens[x + 1]);
404 sendMessage(socket, "HUH?");
405 return;
406 }
407
408 const QString& text = tokens[x + 2];
409 const QString& screen = tokens[x + 3];
410 bool scrollable = false;
411 if (tokens[x + 4] == "TRUE") {
412 scrollable = true;
413 } else if (tokens[x + 4] == "FALSE") {
414 scrollable = false;
415 } else {
416 LOG(VB_GENERAL, LOG_ERR,
417 "LCDServer: bad scrollable bool in SWITCH_TO_GENERIC "
418 "command: " + tokens[x + 4]);
419 sendMessage(socket, "HUH?");
420 return;
421 }
422
423 items.append(LCDTextItem(row, align, text, screen, scrollable));
424 }
425
426 if (m_lcd)
427 m_lcd->switchToGeneric(&items);
428
429 sendMessage(socket, "OK");
430}
431
432void LCDServer::switchToChannel(const QStringList &tokens, QTcpSocket *socket)
433{
434 if (debug_level > 0)
435 LOG(VB_GENERAL, LOG_INFO, "LCDServer: SWITCH_TO_CHANNEL");
436
437 QString flat = tokens.join(" ");
438
439 if (tokens.count() != 4)
440 {
441 LOG(VB_GENERAL, LOG_ERR,
442 "LCDServer: bad SWITCH_TO_CHANNEL command: " + flat);
443 sendMessage(socket, "HUH?");
444 return;
445 }
446
447 if (m_lcd)
448 m_lcd->switchToChannel(tokens[1], tokens[2], tokens[3]);
449
450 sendMessage(socket, "OK");
451}
452
453void LCDServer::switchToVolume(const QStringList &tokens, QTcpSocket *socket)
454{
455 if (debug_level > 0)
456 LOG(VB_GENERAL, LOG_INFO, "LCDServer: SWITCH_TO_VOLUME");
457
458 QString flat = tokens.join(" ");
459
460 if (tokens.count() != 2)
461 {
462 LOG(VB_GENERAL, LOG_ERR,
463 "LCDServer: bad SWITCH_TO_VOLUME command: " + flat);
464 sendMessage(socket, "HUH?");
465 return;
466 }
467
468 if (m_lcd)
469 m_lcd->switchToVolume(tokens[1]);
470
471 sendMessage(socket, "OK");
472}
473
474void LCDServer::switchToNothing(QTcpSocket *socket)
475{
476 if (debug_level > 0)
477 LOG(VB_GENERAL, LOG_INFO, "LCDServer: SWITCH_TO_NOTHING");
478
479 if (m_lcd)
481
482 sendMessage(socket, "OK");
483}
484
485void LCDServer::switchToMenu(const QStringList &tokens, QTcpSocket *socket)
486{
487 if (debug_level > 0)
488 LOG(VB_GENERAL, LOG_INFO,
489 QString("LCDServer: SWITCH_TO_MENU: %1").arg(tokens.count()));
490
491 QString flat = tokens.join(" ");
492
493 if ((tokens.count() - 3) % 5 != 0)
494 {
495 LOG(VB_GENERAL, LOG_ERR,
496 "LCDServer: bad no. of args SWITCH_TO_MENU command: " + flat);
497 sendMessage(socket, "HUH?");
498 return;
499 }
500
501 const QString& appName = tokens[1];
502
503 bool bPopup = false;
504 if (tokens[2] == "TRUE") {
505 bPopup = true;
506 } else if (tokens[2] == "FALSE") {
507 bPopup = false;
508 } else {
509 LOG(VB_GENERAL, LOG_ERR,
510 "LCDServer: bad popup bool in SWITCH_TO_MENU command: " +
511 tokens[2]);
512 sendMessage(socket, "HUH?");
513 return;
514 }
515
516 QList<LCDMenuItem> items;
517
518 for (int x = 3; x < tokens.count(); x += 5)
519 {
520 const QString& text = tokens[x];
521
522 CHECKED_STATE checked = CHECKED;
523 if (tokens[x + 1] == "CHECKED") {
524 checked = CHECKED;
525 } else if (tokens[x + 1] == "UNCHECKED") {
526 checked = UNCHECKED;
527 } else if (tokens[x + 1] == "NOTCHECKABLE") {
528 checked = NOTCHECKABLE;
529 } else {
530 LOG(VB_GENERAL, LOG_ERR,
531 "LCDServer: bad checked state in SWITCH_TO_MENU command: " +
532 tokens[x + 1]);
533 sendMessage(socket, "HUH?");
534 return;
535 }
536
537 bool selected = false;
538 if (tokens[x + 2] == "TRUE") {
539 selected = true;
540 } else if (tokens[x + 2] == "FALSE") {
541 selected = false;
542 } else {
543 LOG(VB_GENERAL, LOG_ERR,
544 "LCDServer: bad selected state in SWITCH_TO_MENU command: " +
545 tokens[x + 2]);
546 sendMessage(socket, "HUH?");
547 return;
548 }
549
550 bool scrollable = false;
551 if (tokens[x + 3] == "TRUE") {
552 scrollable = true;
553 } else if (tokens[x + 3] == "FALSE") {
554 scrollable = false;
555 } else {
556 LOG(VB_GENERAL, LOG_ERR,
557 "LCDServer: bad scrollable bool in SWITCH_TO_MENU command: " +
558 tokens[x + 3]);
559 sendMessage(socket, "HUH?");
560 return;
561 }
562
563 bool bOK = false;
564 int indent = tokens[x + 4].toInt(&bOK);
565 if (!bOK)
566 {
567 LOG(VB_GENERAL, LOG_ERR,
568 "LCDServer: bad indent in SWITCH_TO_MENU command: " +
569 tokens[x + 4]);
570 sendMessage(socket, "HUH?");
571 return;
572 }
573
574 items.append(LCDMenuItem(selected, checked, text, indent, scrollable));
575 }
576
577 if (m_lcd)
578 m_lcd->switchToMenu(&items, appName, bPopup);
579
580 sendMessage(socket, "OK");
581}
582
583void LCDServer::setChannelProgress(const QStringList &tokens, QTcpSocket *socket)
584{
585 if (debug_level > 0)
586 LOG(VB_GENERAL, LOG_INFO, "LCDServer: SET_CHANNEL_PROGRESS");
587
588 QString flat = tokens.join(" ");
589
590 if (tokens.count() != 3)
591 {
592 LOG(VB_GENERAL, LOG_ERR,
593 "LCDServer: bad SET_CHANNEL_PROGRESS command: " + flat);
594 sendMessage(socket, "HUH?");
595 return;
596 }
597
598 bool bOK = false;
599 float progress = tokens[2].toFloat(&bOK);
600 if (!bOK)
601 {
602 LOG(VB_GENERAL, LOG_ERR,
603 QString("LCDServer: bad float value in SET_CHANNEL_PROGRESS "
604 "command: %1").arg(tokens[2]));
605 sendMessage(socket, "HUH?");
606 return;
607 }
608
609 if (m_lcd)
610 m_lcd->setChannelProgress(tokens[1], progress);
611
612 sendMessage(socket, "OK");
613}
614
615void LCDServer::setGenericProgress(const QStringList &tokens, QTcpSocket *socket)
616{
617 if (debug_level > 0)
618 LOG(VB_GENERAL, LOG_INFO, "LCDServer: SET_GENERIC_PROGRESS");
619
620 QString flat = tokens.join(" ");
621
622 if (tokens.count() != 3)
623 {
624 LOG(VB_GENERAL, LOG_ERR,
625 "LCDServer: bad SET_GENERIC_PROGRESS command: " + flat);
626 sendMessage(socket, "HUH?");
627 return;
628 }
629
630 bool bOK = false;
631 bool busy = tokens[1].toInt(&bOK) != 0;
632 if (!bOK)
633 {
634 LOG(VB_GENERAL, LOG_ERR,
635 QString("LCDServer: bad bool value in SET_GENERIC_PROGRESS "
636 "command: %1 %2").arg(tokens[1], tokens[2]));
637 sendMessage(socket, "HUH?");
638 return;
639 }
640 float progress = tokens[2].toFloat(&bOK);
641 if (!bOK)
642 {
643 LOG(VB_GENERAL, LOG_ERR,
644 QString("LCDServer: bad float value in SET_GENERIC_PROGRESS "
645 "command: %1").arg(tokens[2]));
646 sendMessage(socket, "HUH?");
647 return;
648 }
649
650 if (m_lcd)
652
653 sendMessage(socket, "OK");
654}
655
656void LCDServer::setMusicProgress(const QStringList &tokens, QTcpSocket *socket)
657{
658 if (debug_level > 0)
659 LOG(VB_GENERAL, LOG_INFO, "LCDServer: SET_MUSIC_PROGRESS");
660
661 QString flat = tokens.join(" ");
662
663 if (tokens.count() != 3)
664 {
665 LOG(VB_GENERAL, LOG_ERR,
666 "LCDServer: bad SET_MUSIC_PROGRESS command: " + flat);
667 sendMessage(socket, "HUH?");
668 return;
669 }
670
671 bool bOK = false;
672 float progress = tokens[2].toFloat(&bOK);
673 if (!bOK)
674 {
675 LOG(VB_GENERAL, LOG_ERR,
676 "LCDServer: bad float value in SET_MUSIC_PROGRESS command: " +
677 tokens[2]);
678 sendMessage(socket, "HUH?");
679 return;
680 }
681
682 if (m_lcd)
683 m_lcd->setMusicProgress(tokens[1], progress);
684
685 sendMessage(socket, "OK");
686}
687
688void LCDServer::setMusicProp(const QStringList &tokens, QTcpSocket *socket)
689{
690 if (debug_level > 0)
691 LOG(VB_GENERAL, LOG_INFO, "LCDServer: SET_MUSIC_PROP");
692
693 QString flat = tokens.join(" ");
694
695 if (tokens.count() < 3)
696 {
697 LOG(VB_GENERAL, LOG_ERR,
698 "LCDServer: bad SET_MUSIC_PROP command: " + flat);
699 sendMessage(socket, "HUH?");
700 return;
701 }
702
703 if (tokens[1] == "SHUFFLE")
704 {
705 if (tokens.count () != 3)
706 {
707 LOG(VB_GENERAL, LOG_ERR,
708 "LCDServer: missing argument for SET_MUSIC_PROP SHUFFLE "
709 "command: " + flat);
710 sendMessage(socket, "HUH?");
711 return;
712 }
713 bool bOk = false;
714 int state = tokens[2].toInt (&bOk);
715 if (!bOk)
716 {
717 LOG(VB_GENERAL, LOG_ERR,
718 "LCDServer: bad argument for SET_MUSIC_PROP SHUFFLE "
719 "command: " + tokens[2]);
720 sendMessage(socket, "HUH?");
721 return;
722 }
723 if (m_lcd)
724 m_lcd->setMusicShuffle (state);
725 }
726 else if (tokens[1] == "REPEAT")
727 {
728 if (tokens.count () != 3)
729 {
730 LOG(VB_GENERAL, LOG_ERR,
731 "LCDServer: missing argument for SET_MUSIC_PROP REPEAT "
732 "command: " + flat);
733 sendMessage(socket, "HUH?");
734 return;
735 }
736 bool bOk = false;
737 int state = tokens[2].toInt (&bOk);
738 if (!bOk)
739 {
740 LOG(VB_GENERAL, LOG_ERR,
741 "LCDServer: bad argument for SET_MUSIC_PROP REPEAT command: " +
742 tokens[2]);
743 sendMessage(socket, "HUH?");
744 return;
745 }
746 if (m_lcd)
747 m_lcd->setMusicRepeat (state);
748 }
749 else
750 {
751 LOG(VB_GENERAL, LOG_ERR,
752 "LCDServer: bad argument for SET_MUSIC_PROP command: " + tokens[1]);
753 sendMessage(socket, "HUH?");
754 return;
755 }
756
757 sendMessage(socket, "OK");
758}
759
760void LCDServer::setVolumeLevel(const QStringList &tokens, QTcpSocket *socket)
761{
762 if (debug_level > 0)
763 LOG(VB_GENERAL, LOG_INFO, "LCDServer: SET_VOLUME_LEVEL");
764
765 QString flat = tokens.join(" ");
766
767 if (tokens.count() != 2)
768 {
769 LOG(VB_GENERAL, LOG_ERR,
770 "LCDServer: bad SET_VOLUME_LEVEL command: " + flat);
771 sendMessage(socket, "HUH?");
772 return;
773 }
774
775 bool bOK = false;
776 float progress = tokens[1].toFloat(&bOK);
777 if (!bOK)
778 {
779 LOG(VB_GENERAL, LOG_ERR,
780 "LCDServer: bad float value in SET_VOLUME_LEVEL command: " +
781 tokens[1]);
782 sendMessage(socket, "HUH?");
783 return;
784 }
785
786 if (m_lcd)
788
789 sendMessage(socket, "OK");
790}
791
792void LCDServer::updateLEDs(const QStringList &tokens, QTcpSocket *socket)
793{
794 if (debug_level > 0)
795 LOG(VB_GENERAL, LOG_INFO, "LCDServer: UPDATE_LEDS");
796
797 QString flat = tokens.join(" ");
798
799 if (tokens.count() != 2)
800 {
801 LOG(VB_GENERAL, LOG_ERR, "LCDServer: bad UPDATE_LEDs command: " + flat);
802 sendMessage(socket, "HUH?");
803 return;
804 }
805
806 bool bOK = false;
807 int mask = tokens[1].toInt(&bOK);
808 if (!bOK)
809 {
810 LOG(VB_GENERAL, LOG_ERR,
811 "LCDServer: bad mask in UPDATE_LEDS command: " + tokens[1]);
812 sendMessage(socket, "HUH?");
813 return;
814 }
815
816 if (m_lcd)
817 m_lcd->updateLEDs(mask);
818
819 sendMessage(socket, "OK");
820}
void switchToChannel(const QString &channum="", const QString &title="", const QString &subtitle="")
void reset(void)
void setMusicShuffle(int shuffle)
void setGenericProgress(bool busy, float value)
void switchToVolume(const QString &app_name)
void stopAll(void)
int getLCDHeight(void) const
Definition: lcdprocclient.h:62
void setMusicRepeat(int repeat)
void switchToMenu(QList< LCDMenuItem > *menuItems, const QString &app_name="", bool popMenu=true)
void switchToGeneric(QList< LCDTextItem > *textItems)
void switchToMusic(const QString &artist, const QString &album, const QString &track)
void setVolumeLevel(float value)
void setMusicProgress(QString time, float value)
int getLCDWidth(void) const
Definition: lcdprocclient.h:61
void setChannelProgress(const QString &time, float value)
bool SetupLCD(void)
void setStartupMessage(QString msg, std::chrono::seconds messagetime)
void updateLEDs(int mask)
QTcpSocket * m_lastSocket
Definition: lcdserver.h:68
void switchToGeneric(const QStringList &tokens, QTcpSocket *socket)
Definition: lcdserver.cpp:363
void readSocket()
Definition: lcdserver.cpp:137
void switchToMusic(const QStringList &tokens, QTcpSocket *socket)
Definition: lcdserver.cpp:342
void switchToMenu(const QStringList &tokens, QTcpSocket *socket)
Definition: lcdserver.cpp:485
void newConnection(QTcpSocket *socket)
Definition: lcdserver.cpp:108
void sendConnected(QTcpSocket *socket)
Definition: lcdserver.cpp:312
ServerPool * m_serverPool
Definition: lcdserver.h:67
LCDServer(int port, QString message, std::chrono::seconds messageTime)
Definition: lcdserver.cpp:82
void switchToVolume(const QStringList &tokens, QTcpSocket *socket)
Definition: lcdserver.cpp:453
void switchToTime(QTcpSocket *socket)
Definition: lcdserver.cpp:331
void setVolumeLevel(const QStringList &tokens, QTcpSocket *socket)
Definition: lcdserver.cpp:760
void sendKeyPress(const QString &key_pressed)
Definition: lcdserver.cpp:302
static void sendMessage(QTcpSocket *where, const QString &what)
Definition: lcdserver.cpp:294
static QStringList parseCommand(QString &command)
Definition: lcdserver.cpp:156
void updateLEDs(const QStringList &tokens, QTcpSocket *socket)
Definition: lcdserver.cpp:792
void setGenericProgress(const QStringList &tokens, QTcpSocket *socket)
Definition: lcdserver.cpp:615
void switchToNothing(QTcpSocket *socket)
Definition: lcdserver.cpp:474
void endConnection(void)
Definition: lcdserver.cpp:122
void shutDown()
Definition: lcdserver.cpp:281
LCDProcClient * m_lcd
Definition: lcdserver.h:66
void setMusicProgress(const QStringList &tokens, QTcpSocket *socket)
Definition: lcdserver.cpp:656
void setChannelProgress(const QStringList &tokens, QTcpSocket *socket)
Definition: lcdserver.cpp:583
void parseTokens(const QStringList &tokens, QTcpSocket *socket)
Definition: lcdserver.cpp:190
void setMusicProp(const QStringList &tokens, QTcpSocket *socket)
Definition: lcdserver.cpp:688
void switchToChannel(const QStringList &tokens, QTcpSocket *socket)
Definition: lcdserver.cpp:432
Manages a collection of sockets listening on different ports.
Definition: serverpool.h:60
bool listen(QList< QHostAddress > addrs, quint16 port, bool requireall=true, PoolServerType type=kTCPServer)
Definition: serverpool.cpp:395
void close(void)
Definition: serverpool.cpp:374
void newConnection(QTcpSocket *)
TEXT_ALIGNMENT
Definition: lcddevice.h:57
@ ALIGN_CENTERED
Definition: lcddevice.h:57
@ ALIGN_LEFT
Definition: lcddevice.h:57
@ ALIGN_RIGHT
Definition: lcddevice.h:57
CHECKED_STATE
Definition: lcddevice.h:17
@ NOTCHECKABLE
Definition: lcddevice.h:17
@ CHECKED
Definition: lcddevice.h:17
@ UNCHECKED
Definition: lcddevice.h:17
int debug_level
Definition: lcdserver.cpp:76
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:39
static QString indent(uint level)