Ticket #157: mythtv.diff

File mythtv.diff, 28.7 KB (added by mythtv@…, 14 years ago)

patch to lcddevice

  • libs/libmyth/lcddevice.cpp

     
    1010#include "lcddevice.h"
    1111#include "mythcontext.h"
    1212#include "mythdialogs.h"
     13#include "mythdbcon.h"
     14#include "../libmythtv/tv.h"
    1315
    1416#include <unistd.h>
    1517#include <cmath>
     
    3032#define LCD_VERSION_4 1
    3133#define LCD_VERSION_5 2
    3234
     35#define LCD_RECSTATUS_TIME  10000
     36#define LCD_TIME_TIME       5000
     37#define LCD_SCROLLLIST_TIME 2000
     38
    3339LCD::LCD()
    3440   :QObject(NULL, "LCD")
    3541{
     
    6874    connected = FALSE;
    6975    send_buffer = "";
    7076    lcdMenuItems = new QPtrList<LCDMenuItem>;
    71 
     77    lcdMenuItems->setAutoDelete(true);
     78   
    7279    timeTimer = new QTimer(this);
    7380    connect(timeTimer, SIGNAL(timeout()), this, SLOT(outputTime()));   
    7481   
     
    104111
    105112    retryTimer = new QTimer(this);
    106113    connect(retryTimer, SIGNAL(timeout()), this, SLOT(restartConnection()));
     114   
     115    recStatusTimer = new QTimer(this);
     116    connect(recStatusTimer, SIGNAL(timeout()), this, SLOT(outputRecStatus()));
     117
     118    scrollListTimer = new QTimer(this);
     119    connect(scrollListTimer, SIGNAL(timeout()), this, SLOT(scrollList()));
     120
     121    gContext->addListener(this);
     122   
     123    isRecording = false;
    107124}
    108125
    109126bool LCD::m_server_unavailable = false;
     
    138155            m_server_unavailable = false;
    139156        }
    140157    }
    141  
    142158}
    143159
    144160bool LCD::connectToHost(const QString &lhostname, unsigned int lport)
     
    268284    case LOW:
    269285      aString += QString::number (prioLow);
    270286      break;
     287    case OFF:
     288      aString += QString::number (prioOff);
     289      break;
     290
    271291    }
    272292
    273293    sendToServer (aString);
     
    363383            prioHigh = 240;
    364384            prioMedium = 248;
    365385            prioLow = 252;
     386            prioOff = 255;
    366387            if (protocolVersion == "0.3") {
    367388                if (serverVersion.startsWith ("CVS-current")) {
    368389                    // Latest CVS versions of LCDd has priorities switched
     
    371392                    prioHigh = 240;
    372393                    prioMedium = 128;
    373394                    prioLow = 64;
     395                    prioOff = 0;
    374396                }
    375397            }
    376398
     
    382404           
    383405            tempString = *it;
    384406            setHeight(tempString.toInt());
    385 
    386407            it++; // the string "cellwid"
    387408            it++; // Cell width in pixels;
    388409
     
    449470    lcd_showgeneric=(gContext->GetSetting("LCDShowGeneric", "1")=="1");
    450471    lcd_showvolume=(gContext->GetSetting("LCDShowVolume", "1")=="1");
    451472    lcd_showmenu=(gContext->GetSetting("LCDShowMenu", "1")=="1");
     473    lcd_showrecstatus=(gContext->GetSetting("LCDShowRecStatus", "1")=="1");
    452474    lcd_backlighton=(gContext->GetSetting("LCDBacklightOn", "1")=="1");
    453475    lcd_heartbeaton=(gContext->GetSetting("LCDHeartBeatOn", "1")=="1");
    454476    aString = gContext->GetSetting("LCDPopupTime", "5");
     
    461483
    462484    sendToServer("client_set name Myth");
    463485    sendToServer("client_add_key ABCDEF");   
    464  
     486        
    465487    // Create all the screens and widgets (when we change activity in the myth
    466488    // program, we just swap the priorities of the screens to show only the
    467489    // "current one")
     
    486508    sendToServer("screen_set Menu backlight on");
    487509    sendToServer("widget_add Menu topWidget string");
    488510    for (unsigned int i = 1; i < lcdHeight; i++) {
    489          aString = "widget_add Menu menuWidget";
    490          aString += QString::number (i);
    491          aString += " string";
    492          sendToServer(aString);
     511        aString = "widget_add Menu menuWidget";
     512        aString += QString::number (i);
     513        aString += " string";
     514        sendToServer(aString);
    493515    }
    494516
    495517    // The Music Screen
     
    522544    sendToServer("widget_add Channel topWidget string");
    523545    sendToServer("widget_add Channel botWidget string");
    524546    sendToServer("widget_add Channel progressBar hbar");
    525    
     547
    526548    // The Generic Screen
    527549
    528550    sendToServer("screen_add Generic");
     
    544566    sendToServer("widget_add Volume botWidget string");
    545567    sendToServer("widget_add Volume progressBar hbar");
    546568
     569    // The Recording Status Screen
     570
     571    sendToServer("screen_add RecStatus");
     572    setHeartbeat ("RecStatus", lcd_heartbeaton);
     573    setPriority("RecStatus", LOW);
     574    sendToServer("screen_set RecStatus backlight on");
     575    sendToServer("widget_add RecStatus textWidget1 string");
     576    sendToServer("widget_add RecStatus textWidget2 string");
     577    sendToServer("widget_add RecStatus textWidget3 string");
     578    sendToServer("widget_add RecStatus progressBar hbar");
     579   
    547580    lcd_ready = true;
    548581 
     582    updateRecordingList();
     583   
    549584    switchToTime();    // clock is on by default
    550585   
    551586    // send buffer if there's anything in there
     
    603638        prioHigh = 240;
    604639        prioMedium = 248;
    605640        prioLow = 252;
     641        prioOff = 0;
    606642    } else {
    607643        pVersion = LCD_VERSION_5;
    608644        prioTop = 252;
     
    610646        prioHigh = 240;
    611647        prioMedium = 128;
    612648        prioLow = 64;
     649        prioOff = 0;
    613650    }
    614651}
    615652
     
    627664    VERBOSE(VB_GENERAL, QString("lcddevice: - showmusicitems : %1").arg(lcd_showmusic_items));
    628665    VERBOSE(VB_GENERAL, QString("lcddevice: - showtime       : %1").arg(lcd_showtime));
    629666    VERBOSE(VB_GENERAL, QString("lcddevice: - showchannel    : %1").arg(lcd_showchannel));
     667    VERBOSE(VB_GENERAL, QString("lcddevice: - showrecstatus  : %1").arg(lcd_showrecstatus));
    630668    VERBOSE(VB_GENERAL, QString("lcddevice: - showgeneric    : %1").arg(lcd_showgeneric));
    631669    VERBOSE(VB_GENERAL, QString("lcddevice: - showvolume     : %1").arg(lcd_showvolume));
    632670    VERBOSE(VB_GENERAL, QString("lcddevice: - showmenu       : %1").arg(lcd_showmenu));
     
    658696
    659697void LCD::scrollText()
    660698{
    661     if (theMode == 0)
    662         outputLeftText("Time", scrollingText.mid(scrollPosition, lcdWidth),
     699    if (activeScreen != scrollScreen)
     700        return;
     701
     702    outputLeftText(scrollScreen, scrollingText.mid(scrollPosition, lcdWidth),
    663703                       scrollWidget, scrollRow);
    664     else if (theMode == 1)
    665         outputLeftText("Music", scrollingText.mid(scrollPosition, lcdWidth),
    666                        scrollWidget, scrollRow);
    667     else if (theMode == 2)
    668         outputLeftText("Channel", scrollingText.mid(scrollPosition, lcdWidth),
    669                        scrollWidget, scrollRow);
    670     else if (theMode == 3)
    671         outputLeftText("Generic", scrollingText.mid(scrollPosition, lcdWidth),
    672                        scrollWidget, scrollRow);
    673 
     704   
    674705    scrollPosition++;
    675706    if (scrollPosition >= scrollingText.length())
    676707        scrollPosition = 0;
    677708}
    678709
     710void LCD::scrollList()
     711{
     712    if (scrollListItems.count() == 0)
     713        return;
     714       
     715    if (activeScreen != scrollListScreen)
     716        return;
     717       
     718    outputLeftText(scrollListScreen, scrollListItems[scrollListItem],
     719                    scrollListWidget, scrollListRow);
     720
     721    scrollListItem++;
     722    if (scrollListItem >= scrollListItems.count())
     723        scrollListItem = 0;
     724}
     725
    679726void LCD::stopAll()
    680727{
    681728    // The usual reason things would get this far and then lcd_ready being
     
    686733#endif
    687734    if (lcd_ready)
    688735    {
    689         setPriority("Music", LOW);
    690         setPriority("Channel", LOW);
    691         setPriority("Generic", LOW);
    692         setPriority("Volume", LOW);
    693         setPriority("Menu", LOW);
     736        setPriority("Time", OFF);
     737        setPriority("Music", OFF);
     738        setPriority("Channel", OFF);
     739        setPriority("Generic", OFF);
     740        setPriority("Volume", OFF);
     741        setPriority("Menu", OFF);
     742        setPriority("RecStatus", OFF);
    694743    }
    695744
     745    timeTimer->stop();
    696746    preScrollTimer->stop();
    697747    scrollTimer->stop();
    698748    musicTimer->stop();
     
    701751    popMenuTimer->stop();
    702752    menuScrollTimer->stop();
    703753    menuPreScrollTimer->stop();
     754    recStatusTimer->stop();
     755    scrollListTimer->stop();
     756   
    704757    unPopMenu();
    705758}
    706759
    707760void LCD::startTime()
    708761{
    709762    setPriority("Time", MEDIUM);
     763    setPriority("RecStatus", LOW);
     764
    710765    timeTimer->start(1000, FALSE);
    711766    outputTime();
    712     theMode = 0;   
     767    activeScreen = "Time";
     768    isTimeVisible = true;
     769   
     770    if (lcd_showrecstatus && isRecording)
     771        recStatusTimer->start(LCD_TIME_TIME, FALSE);
    713772}
    714773
    715774void LCD::outputText(QPtrList<LCDTextItem> *textItems)
     
    732791        num.setNum(curItem->getRow());
    733792
    734793        if (curItem->getScroll())
    735             assignScrollingText(curItem->getText(), "textWidget" + num,
    736                                 curItem->getRow());
     794            assignScrollingText(curItem->getText(), curItem->getScreen(),
     795                                "textWidget" + num, curItem->getRow());
    737796        else
    738797        {
    739798            switch (curItem->getAlignment())
     
    764823    QString aString;
    765824    unsigned int x = 0;
    766825   
    767     x = (int) (rint((lcdWidth - theText.length()) / 2.0) + 1);
    768     // Had a problem where I would get something like this:
    769     //    2147483633 = (int) (rint((20 - 51) / 2.0) + 1)
    770     // so hense this
     826    x = (lcdWidth - theText.length()) / 2 + 1;
     827   
    771828    if (x > lcdWidth)
    772829        x = 1;
    773830
     
    817874    sendToServer(aString);
    818875}
    819876
    820 void LCD::assignScrollingText(QString theText, QString theWidget, int theRow)
     877void LCD::assignScrollingText(QString theText, QString theScreen,
     878                              QString theWidget, int theRow)
    821879{
    822880    // Have to decide what to do with "top line" text given the size
    823881    // of the LCD (as reported by the server)
    824882   
     883    scrollScreen = theScreen;
    825884    scrollWidget = theWidget;
    826885    scrollRow = theRow;
    827886
    828887    if (theText.length() < lcdWidth)
    829888    {
    830889        // This is trivial, just show the text
    831 
    832         if (theMode == 0)
    833             outputCenteredText("Time", theText, theWidget, theRow);
    834         else if (theMode == 1)
    835             outputCenteredText("Music", theText, theWidget, theRow);
    836         else if (theMode == 2)
    837             outputCenteredText("Channel", theText, theWidget, theRow);
    838         else if (theMode == 3)
    839             outputCenteredText("Generic", theText, theWidget, theRow);       
     890        outputCenteredText(theScreen, theText, theWidget, theRow);
    840891 
    841892        scrollTimer->stop();
    842893        preScrollTimer->stop();
     
    844895    else
    845896    {
    846897        // Setup for scrolling
    847         if (theMode == 0)
    848             outputCenteredText("Time", theText.left(lcdWidth), theWidget,
    849                                theRow);
    850         else if (theMode == 1)
    851             outputCenteredText("Music", theText.left(lcdWidth), theWidget,
    852                                theRow);
    853         else if (theMode == 2)
    854             outputCenteredText("Channel", theText.left(lcdWidth), theWidget,
    855                                theRow);
    856         else if (theMode == 3)
    857             outputCenteredText("Generic", theText.left(lcdWidth), theWidget,
    858                                theRow);
     898        outputCenteredText(theScreen, theText.left(lcdWidth), theWidget, theRow);
    859899
    860900        scrollingText = theText;
    861901        scrollPosition = 0;
     
    864904    }
    865905}
    866906
     907void LCD::assignScrollingList(QStringList theList, QString theScreen,
     908                              QString theWidget, int theRow)
     909{
     910    scrollListScreen = theScreen;
     911    scrollListWidget = theWidget;
     912    scrollListRow = theRow;
     913    scrollListItems = theList;
     914   
     915    scrollListItem = 0;
     916    scrollList();
     917    scrollListTimer->start(LCD_SCROLLLIST_TIME, FALSE);
     918}
     919
    867920void LCD::startMusic(QString artist, QString album, QString track)
    868921{
    869922    QString aString;
     
    879932        aString += " - ";
    880933    }
    881934    aString += track;
    882     theMode = 1;
    883     assignScrollingText(aString);
     935    activeScreen = "Music";
     936    assignScrollingText(aString, "Music");
    884937}
    885938
    886939void LCD::startChannel(QString channum, QString title, QString subtitle)
     
    889942    if (lcd_showchannel)
    890943      setPriority("Channel", HIGH);
    891944    aString = channum;
    892     theMode = 2;
    893     assignScrollingText(aString, "topWidget", 1);
     945    activeScreen = "Channel";
     946    assignScrollingText(aString, "Channel", "topWidget", 1);
    894947    aString = title;
    895948    if (subtitle.length() > 0)
    896949    {
     
    898951        aString += subtitle;
    899952        aString += "'";
    900953    }
    901     assignScrollingText(aString, "botWidget", 2);
     954    assignScrollingText(aString, "Channel", "botWidget", 2);
    902955    if (lcdHeight > 2)
    903956    {
    904957        progress = 0.0;
     
    927980        return;
    928981
    929982    genericTimer->start(500, FALSE);
    930     theMode = 3;
     983    activeScreen = "Generic";
    931984    generic_progress = 0.0;
    932985
    933986    // Return if there are no more items
     
    937990    // Todo, make scrolling definable in LCDTextItem
    938991    ++it;
    939992
    940     theMode = 3;
    941     assignScrollingText(curItem->getText(), "textWidget1", curItem->getRow());
     993    assignScrollingText(curItem->getText(), "Generic", "textWidget1", curItem->getRow());
    942994
    943995    outputGeneric();
    944996
     
    13651417{
    13661418    // Stop the scrolling timer
    13671419    menuScrollTimer->stop();
    1368     setPriority("Menu", LOW);
     1420    setPriority("Menu", OFF);
    13691421}
    13701422
    13711423void LCD::setLevels(int numbLevels, float *values)
     
    14621514
    14631515void LCD::outputTime()
    14641516{
     1517    if (isRecording)
     1518        outputCenteredText("Time", tr("RECORDING"), "topWidget", 1);
     1519    else
     1520        outputCenteredText("Time", "", "topWidget", 1);
     1521
    14651522    QString aString;
    14661523    int x, y;
    1467 
     1524   
    14681525    if (lcdHeight < 3)
    14691526        y = 2;
    14701527    else
    14711528        y = (int) rint(lcdHeight / 2) + 1;
    1472 
    1473     x = (int) rint((lcdWidth - 5) / 2) + 1;
    1474 
     1529   
     1530    QString time = QTime::currentTime().toString(timeformat);
     1531    x = (lcdWidth - time.length()) / 2 + 1;
    14751532    aString = "widget_set Time timeWidget ";
    14761533    aString += QString::number(x);
    14771534    aString += " ";
    14781535    aString += QString::number(y);
    14791536    aString += " \"";
    14801537    if (lcd_showtime) {
    1481         aString += QTime::currentTime().toString(timeformat).left(8) + "\"";
     1538        aString += time + "\"";
    14821539        if (timeFlash)
    14831540        {
    14841541            aString = aString.replace(QRegExp(":"), " ");
     
    14921549    sendToServer(aString);
    14931550}
    14941551
     1552// if one or more recordings are taking place we alternate between
     1553// showing the time and the recording status screen
     1554void LCD::outputRecStatus(void)
     1555{
     1556    if (!lcd_ready || !isRecording || !lcd_showrecstatus)
     1557        return;
     1558
     1559    int listTime;
     1560   
     1561    if (isTimeVisible)
     1562    {
     1563        // switch to the rec status screen
     1564        setPriority("RecStatus", MEDIUM);
     1565        setPriority("Time", LOW);
     1566       
     1567        timeTimer->stop();
     1568        scrollTimer->stop();
     1569        scrollListTimer->stop();
     1570        listTime = LCD_RECSTATUS_TIME;
     1571        isTimeVisible = false;
     1572        activeScreen = "RecStatus";
     1573    }
     1574    else
     1575    {
     1576        // switch to the time screen
     1577        setPriority("Time", MEDIUM);
     1578        setPriority("RecStatus", LOW);
     1579
     1580        timeTimer->start(1000, FALSE);
     1581        scrollTimer->stop();
     1582        scrollListTimer->stop();
     1583        recStatusTimer->start(LCD_TIME_TIME, FALSE);
     1584
     1585        outputTime();
     1586        activeScreen = "Time";
     1587        isTimeVisible = true;
     1588
     1589        return;
     1590    }
     1591   
     1592    QString aString, status;
     1593    QStringList list;
     1594   
     1595    TunerStatus *tuner = tunerList.at(lcdTunerNo);
     1596
     1597    scrollListItems.clear();
     1598    if (lcdHeight >= 4)
     1599    {
     1600        outputCenteredText("RecStatus", tr("RECORDING"), "textWidget1", 1);
     1601       
     1602        status = tuner->title;
     1603        if (tuner->subTitle != "")
     1604            status += " (" + tuner->subTitle + ")";
     1605   
     1606        list = formatScrollerText(status);
     1607        assignScrollingList(list, "RecStatus", "textWidget2", 2);
     1608
     1609        status = tuner->startTime.toString("hh:mm") + " to " +
     1610                tuner->endTime.toString("hh:mm");                       
     1611        outputCenteredText("RecStatus", status, "textWidget3", 3);
     1612       
     1613        int length = tuner->startTime.secsTo(tuner->endTime);
     1614        int delta = tuner->startTime.secsTo(QDateTime::currentDateTime());
     1615        double rec_progress = (double) delta / length;
     1616       
     1617        aString = "widget_set RecStatus progressBar 1 ";
     1618        aString += QString::number(lcdHeight);
     1619        aString += " ";
     1620        aString += QString::number((int)rint(rec_progress * lcdWidth *
     1621                                cellWidth));
     1622        sendToServer(aString);
     1623       
     1624        listTime = list.count() * LCD_SCROLLLIST_TIME * 2;
     1625    }
     1626    else
     1627    {
     1628        status = tr("RECORDING|");
     1629        status += tuner->title;
     1630        if (tuner->subTitle != "")
     1631            status += "|(" + tuner->subTitle + ")";
     1632
     1633        status += "|" + tuner->startTime.toString("hh:mm") + " to " +
     1634                tuner->endTime.toString("hh:mm");                       
     1635       
     1636        list = formatScrollerText(status);
     1637        assignScrollingList(list, "RecStatus", "textWidget1", 1);
     1638
     1639        int length = tuner->startTime.secsTo(tuner->endTime);
     1640        int delta = tuner->startTime.secsTo(QDateTime::currentDateTime());
     1641        double rec_progress = (double) delta / length;
     1642       
     1643        aString = "widget_set RecStatus progressBar 1 ";
     1644        aString += QString::number(lcdHeight);
     1645        aString += " ";
     1646        aString += QString::number((int)rint(rec_progress * lcdWidth *
     1647                                cellWidth));
     1648        sendToServer(aString);
     1649       
     1650        listTime = list.count() * LCD_SCROLLLIST_TIME * 2;
     1651    }
     1652   
     1653    recStatusTimer->start(listTime, FALSE);
     1654   
     1655    if (lcdTunerNo < (int) tunerList.count() - 1)
     1656        lcdTunerNo++;
     1657    else
     1658        lcdTunerNo = 0;
     1659}
     1660
     1661void LCD::outputScrollerText(QString theScreen, QString theText,
     1662                             QString widget, int top, int bottom)
     1663{
     1664    QString aString;
     1665    aString =  "widget_set " + theScreen + " " + widget;
     1666    aString += " 1 ";
     1667    aString += QString::number(top) + " ";
     1668    aString += QString::number(lcdWidth) + " ";
     1669    aString += QString::number(bottom);
     1670    aString += " v 8 \"" + theText + "\"";
     1671   
     1672    sendToServer(aString);
     1673}
     1674
     1675QStringList LCD::formatScrollerText(const QString &text)
     1676{
     1677    QString separators = " |-_/:('<~";
     1678    QStringList lines;
     1679   
     1680    int lastSplit = 0;
     1681    QString line = "";
     1682   
     1683    for (uint x = 0; x < text.length(); x++)
     1684    {
     1685        if (separators.contains(text[x]) > 0)   
     1686            lastSplit = line.length();
     1687       
     1688        line += text[x];
     1689        if (line.length() > lcdWidth || text[x] == '|')
     1690        {
     1691            QString formatedLine;
     1692            formatedLine.fill(' ', lcdWidth);
     1693            formatedLine = formatedLine.replace((lcdWidth - lastSplit) / 2,
     1694                     lastSplit, line.left(lastSplit)); 
     1695                       
     1696            lines.append(formatedLine);
     1697           
     1698            if (line[lastSplit] == ' ' || line[lastSplit] == '|')
     1699                line = line.mid(lastSplit + 1);
     1700            else
     1701                line = line.mid(lastSplit);
     1702           
     1703            lastSplit = lcdWidth;             
     1704        }
     1705    }
     1706   
     1707    // make sure we add the last line
     1708    QString formatedLine;
     1709    formatedLine.fill(' ', lcdWidth);
     1710    formatedLine = formatedLine.replace((lcdWidth - line.length()) / 2,
     1711                line.length(), line); 
     1712               
     1713    lines.append(formatedLine);
     1714
     1715//    for (uint x = 0; x < lines.count(); x++)
     1716//        cout << "*" << lines[x] << "*" << endl;
     1717       
     1718    return lines;
     1719}
     1720
    14951721void LCD::outputMusic()
    14961722{
    14971723    QString aString;
     
    16331859    if (!lcd_ready)
    16341860        return;
    16351861    stopAll();
     1862   
    16361863#if LCD_DEVICE_DEBUG > 1
    16371864    cout << "lcddevice: switchToNothing " << endl ;
    16381865#endif
     
    16851912    sendToServer("widget_del Time topWidget");
    16861913    sendToServer("screen_del Time");
    16871914   
     1915    sendToServer("widget_del RecStatus textWidget1");
     1916    sendToServer("widget_del RecStatus textWidget2");
     1917    sendToServer("widget_del RecStatus textWidget3");
     1918    sendToServer("widget_del RecStatus progressBar");
     1919
    16881920    socket->close();
    16891921
    16901922    lcd_ready = false;
     
    17061938    }
    17071939    if (lcdMenuItems)
    17081940        delete lcdMenuItems;
     1941       
     1942    gContext->removeListener(this);     
    17091943}
    17101944
     1945void LCD::customEvent(QCustomEvent *e)
     1946{
     1947    if ((MythEvent::Type)(e->type()) == MythEvent::MythEventMessage)
     1948    {
     1949        MythEvent *me = (MythEvent *) e;
     1950       
     1951        if (me->Message().left(21) == "RECORDING_LIST_CHANGE")
     1952        {
     1953            if (lcd_showrecstatus)
     1954            {   
     1955                updateRecordingList();
     1956           
     1957                if (isRecording)
     1958                    outputRecStatus();
     1959                else
     1960                {
     1961                    setPriority("Time", MEDIUM);
     1962                    setPriority("RecStatus", LOW);
     1963           
     1964                    timeTimer->start(1000, FALSE);
     1965           
     1966                    outputTime();
     1967                    activeScreen = "Time";
     1968                    isTimeVisible = true;
     1969                }   
     1970            }   
     1971        }
     1972    }   
     1973}
     1974
     1975void LCD::updateRecordingList(void)
     1976{
     1977    if (!gContext->IsConnectedToMaster())
     1978    {   
     1979        VERBOSE(VB_IMPORTANT, "LCD: Cannot get recording status "
     1980                               "- not connected to master server?");
     1981        return;
     1982    }
     1983   
     1984    tunerList.clear();
     1985    isRecording = false;
     1986
     1987    QStringList strlist;
     1988   
     1989    // are we currently recording
     1990    QString querytext = QString("SELECT cardid FROM capturecard;");
     1991    MSqlQuery query(MSqlQuery::InitCon());
     1992    query.exec(querytext);
     1993    QString Status = "";
     1994
     1995    if (query.isActive() && query.numRowsAffected())
     1996    {
     1997        while(query.next())
     1998        {
     1999            QString status = "";
     2000            int cardid = query.value(0).toInt();
     2001            int state = kState_ChangingState;
     2002            QString channelName = "";
     2003            QString title = "";
     2004            QString subtitle = "";
     2005            QDateTime dtStart = QDateTime();
     2006            QDateTime dtEnd = QDateTime();
     2007
     2008            QString cmd = QString("QUERY_REMOTEENCODER %1").arg(cardid);
     2009
     2010            while (state == kState_ChangingState)
     2011            {
     2012                strlist = cmd;
     2013                strlist << "GET_STATE";
     2014                gContext->SendReceiveStringList(strlist);
     2015                VERBOSE(VB_IMPORTANT,
     2016                    QString("cardid: %1 state: %2").arg(cardid).arg(strlist[0])); 
     2017
     2018                state = strlist[0].toInt();
     2019                if (state == kState_ChangingState)
     2020                    usleep(500);
     2021                    //qApp->processEvents();
     2022            }
     2023             
     2024            if (state == kState_RecordingOnly || state == kState_WatchingRecording)
     2025            {
     2026                isRecording = true;
     2027               
     2028                strlist = QString("QUERY_RECORDER %1").arg(cardid);
     2029                strlist << "GET_RECORDING";
     2030                gContext->SendReceiveStringList(strlist);
     2031                title = strlist[0];
     2032                subtitle = strlist[1];
     2033                channelName = strlist[7];
     2034                dtStart.setTime_t((uint)atoi(strlist[11].ascii()));
     2035                dtEnd.setTime_t((uint)atoi(strlist[12].ascii()));
     2036            }
     2037            else
     2038                continue;
     2039       
     2040            TunerStatus *tuner = new TunerStatus;
     2041            tuner->id = cardid;
     2042            tuner->isRecording = (state == kState_RecordingOnly ||
     2043                                  state == kState_WatchingRecording);
     2044            tuner->channel = channelName;
     2045            tuner->title = title;
     2046            tuner->subTitle = subtitle;
     2047            tuner->startTime = dtStart;
     2048            tuner->endTime = dtEnd;
     2049            tunerList.append(tuner);
     2050        }       
     2051    }
     2052   
     2053    lcdTunerNo = 0;
     2054}
  • libs/libmyth/lcddevice.h

     
    107107
    108108    static bool m_server_unavailable;
    109109    static class LCD * m_lcd;
    110 
     110   
     111    void customEvent(QCustomEvent  *e);
     112     
    111113  public:
    112114   ~LCD();
    113115
     
    197199    void outputChannel();          // Longer timer (progress bar)
    198200    void outputGeneric();          // Longer timer (progress bar)
    199201    void outputVolume();
    200 
     202    void outputRecStatus();       
    201203    void scrollMenuText();         // Scroll the menu items if need be
    202204    void beginScrollingMenuText(); // But only after a bit of time has gone by
    203205    void scrollText();             // Scroll the topline text
    204206    void beginScrollingText();     // But only after a bit of time has gone by
    205207    void unPopMenu();              // Remove the Pop Menu display
    206        
     208    void scrollList();             // display a list line by line
     209         
    207210  private:
    208211    void outputCenteredText(QString theScreen, QString theText,
    209212                            QString widget = "topWidget", int row = 1);
     
    212215                        QString widget = "topWidget", int row = 1);
    213216    void outputRightText(QString theScreen, QString theText,
    214217                         QString widget = "topWidget", int row = 1);
     218   
     219    void outputScrollerText(QString theScreen, QString theText,
     220                         QString widget = "scroller", int top = 1, int bottom = 1);
     221   
     222    QStringList formatScrollerText(const QString &text);
    215223   
     224   
    216225    void sendToServer(const QString &someText);
    217226
    218     enum PRIORITY {TOP, URGENT, HIGH, MEDIUM, LOW};
     227    enum PRIORITY {TOP, URGENT, HIGH, MEDIUM, LOW, OFF};
    219228    void setPriority(const QString &screen, PRIORITY priority);
    220229
    221230    void setHeartbeat (const QString &screen, bool onoff);
    222231
    223232    void init();
    224     void assignScrollingText(QString theText, QString theWidget = "topWidget",
    225                              int theRox = 1);
    226 
     233    void assignScrollingText(QString theText, QString theScreen,
     234                             QString theWidget = "topWidget", int theRox = 1);
     235    void assignScrollingList(QStringList theList, QString theScreen,
     236                             QString theWidget = "topWidget", int theRow = 1);
     237                             
    227238    void startTime();
    228239    void startMusic(QString artist, QString album, QString track);
    229240    void startChannel(QString channum, QString title, QString subtitle);
     
    234245    void handleKeyPress(QString key);
    235246    void startVolume(QString app_name);
    236247
    237     unsigned int theMode;
     248    QString activeScreen;
    238249
    239250    QSocket *socket;
    240251    QTimer *LEDTimer;
     
    248259    QTimer *menuPreScrollTimer;
    249260    QTimer *popMenuTimer;
    250261    QTimer *retryTimer;
    251 
     262    QTimer *recStatusTimer;
     263    QTimer *scrollListTimer;
     264   
    252265    void setWidth(unsigned int);
    253266    void setHeight(unsigned int);
    254267    void setCellWidth(unsigned int);
     
    261274    unsigned int prioHigh;
    262275    unsigned int prioMedium;
    263276    unsigned int prioLow;
    264 
     277    unsigned int prioOff;
     278     
    265279    unsigned int lcdWidth;
    266280    unsigned int lcdHeight;
    267281    unsigned int cellWidth;
     
    280294    QString music_time;
    281295
    282296    QString scrollingText;
    283     QString scrollWidget;
     297    QString scrollScreen, scrollWidget;
    284298    int scrollRow;
    285299    unsigned int scrollPosition;
    286300    QString timeformat;
     301
     302    QStringList scrollListItems;
     303    QString scrollListScreen, scrollListWidget;
     304    int scrollListRow;
     305    unsigned int scrollListItem;
    287306       
    288307    unsigned int menuScrollPosition;
    289308    QPtrList<LCDMenuItem> *lcdMenuItems;
     
    304323    bool lcd_showmusic;
    305324    bool lcd_showchannel;
    306325    bool lcd_showvolume;
     326    bool lcd_showrecstatus;
    307327    bool lcd_backlighton;
    308328    bool lcd_heartbeaton;
    309329    int  lcd_popuptime;   
    310330    QString lcd_showmusic_items;
    311331
    312332    int (*GetLEDMask)(void);
     333   
     334    // recording status stuff
     335    typedef struct
     336    {
     337        int     id;
     338        bool    isRecording;
     339        QString channel, title, subTitle;
     340        QDateTime startTime, endTime;
     341    } TunerStatus;
     342   
     343    void updateRecordingList(void);
     344
     345    bool isRecording;
     346    bool isTimeVisible;
     347    int lcdTunerNo;
     348   
     349    QPtrList<TunerStatus> tunerList;   
    313350};
    314351
    315352#endif
  • programs/mythfrontend/globalsettings.cpp

     
    24692469    return gc;
    24702470}
    24712471
     2472static HostCheckBox *LCDShowRecStatus()
     2473{
     2474    HostCheckBox *gc = new HostCheckBox("LCDShowRecStatus");
     2475    gc->setLabel(QObject::tr("LCD Displays Recording Status"));
     2476    gc->setHelpText(QObject::tr("Display current recordings information."));
     2477    gc->setValue(false);
     2478    return gc;
     2479}
     2480
    24722481static HostCheckBox *LCDShowMenu()
    24732482{
    24742483    HostCheckBox *gc = new HostCheckBox("LCDShowMenu");
     
    25862595         setLeft->addChild(LCDShowMusic());
    25872596         setLeft->addChild(LCDShowMusicItems());
    25882597         setLeft->addChild(LCDShowChannel());
     2598         setRight->addChild(LCDShowRecStatus());
    25892599         setRight->addChild(LCDShowVolume());
    25902600         setRight->addChild(LCDShowGeneric());
    25912601         setRight->addChild(LCDBacklightOn());