Subversion Repositories mdb

Rev

Rev 24 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 * Copyright (C) 2015 by Andreas Theofilu <andreas@theosys.at>
 *
 * All rights reserved. No warranty, explicit or implicit, provided.
 *
 * NOTICE:  All information contained herein is, and remains
 * the property of Andreas Theofilu and his suppliers, if any.
 * The intellectual and technical concepts contained
 * herein are proprietary to Andreas Theofilu and its suppliers and
 * may be covered by European and Foreign Patents, patents in process,
 * and are protected by trade secret or copyright law.
 * Dissemination of this information or reproduction of this material
 * is strictly forbidden unless prior written permission is obtained
 * from Andreas Theofilu.
 */
MODULE_NAME='MDB_UI'    (dev dvTPs[], dev vdvMDB)

#include 'mSNAPI'

DEFINE_TYPE
        struct ST_SONG
        {
                integer nID;
                char sTitle[128];
                char sArtist[128];
                char sAlbum[128];
                char sGenre[128];
                char sCover[64];
        };

DEFINE_CONSTANT
        constant integer MAX_LINES =            5;

        constant char sPopupList[] =            'MFp_MDB_list';
        constant char sPopupAudio[] =           'MFp_MDB_audio';
        constant char sPopupDetail[] =          'MFp_MDB_detail';
        constant char sPopupMenu[] =            'MFp_MDB_menu';

        constant integer BTN_SAVE =                     340;
        constant integer BTN_DELETE =           341;
        constant integer BTN_NOW_PLAYING =      342;

        constant integer BTN_TITLE =            350;
        constant integer BTN_ARTIST =           351;
        constant integer BTN_GENRE =            352;
        constant integer BTN_ALBUM =            353;
        constant integer BTN_PLAYLIST =         354;

        constant integer BTN_LINE1_PIC =        301;
        constant integer BTN_LINE1_LINE =       321;
        constant integer BTN_LINE2_PIC =        302;
        constant integer BTN_LINE2_LINE =       322;
        constant integer BTN_LINE3_PIC =        303;
        constant integer BTN_LINE3_LINE =       323;
        constant integer BTN_LINE4_PIC =        304;
        constant integer BTN_LINE4_LINE =       324;
        constant integer BTN_LINE5_PIC =        305;
        constant integer BTN_LINE5_LINE =       325;
        constant integer BTN_LINE6_PIC =        306;
        constant integer BTN_LINE6_LINE =       326;
        constant integer BTN_LINE7_PIC =        307;
        constant integer BTN_LINE7_LINE =       327;
        constant integer BTN_LINE8_PIC =        308;
        constant integer BTN_LINE8_LINE =       328;
        constant integer BTN_LINE9_PIC =        309;
        constant integer BTN_LINE9_LINE =       329;
        constant integer BTN_LINE10_PIC =       310;
        constant integer BTN_LINE10_LINE =      330;

        constant integer BTN_MENU1 =            261;
        constant integer BTN_MENU2 =            262;
        constant integer BTN_MENU3 =            263;
        constant integer BTN_MENU4 =            264;
        constant integer BTN_MENU5 =            265;
        constant integer BTN_MENU6 =            266;
        constant integer BTN_MENU7 =            267;
        constant integer BTN_MENU8 =            268;
        constant integer BTN_MENU9 =            269;
        constant integer BTN_MENU10 =           270;

        constant integer TEXT_TITLE =           1001;
        constant integer TEXT_PROGRES =         1002;
        constant integer TEXT_MENU_TITLE =      1003;

        constant integer TEXT_DETAIL_TITLE =    1011;
        constant integer TEXT_DETAIL_ARTIST =   1012;
        constant integer TEXT_DETAIL_ALBUM =    1013;
        constant integer TEXT_DETAIL_GENRE =    1014;
        constant integer TEXT_DETAIL_TIME_PROG =1015;
        constant integer TEXT_DETAIL_TIME_TOTAL=1016;

        constant char TOK_TXT_NONE[] =          'NONE';
        constant char TOK_TXT_TITLE[] =         'TITLE';
        constant char TOK_TXT_ARTIST[] =        'ARTIST';
        constant char TOK_TXT_ALBUM[] =         'ALBUM';
        constant char TOK_TXT_GENRE[] =         'GENRE';
        constant char TOK_TXT_QUEUE[] =         'QUEUE';
        constant char TOK_TXT_PLAYLIST[] =      'PLAYLIST';

        constant integer TOK_NONE =                     0;
        constant integer TOK_TITLE =            1;
        constant integer TOK_ARTIST =           2;
        constant integer TOK_ALBUM =            3;
        constant integer TOK_GENRE =            4;
        constant integer TOK_QUEUE =            5;
        constant integer TOK_PLAYLIST =         6;

        constant integer nNavigation[] =
        {
                BTN_SAVE,
                BTN_DELETE,
                BTN_NOW_PLAYING,
                BTN_TITLE,
                BTN_ARTIST,
                BTN_GENRE,
                BTN_ALBUM,
                BTN_PLAYLIST
        };

        constant integer nMenu[] =
        {
                BTN_MENU1,
                BTN_MENU2,
                BTN_MENU3,
                BTN_MENU4,
                BTN_MENU5,
                BTN_MENU6,
                BTN_MENU7,
                BTN_MENU8,
                BTN_MENU9,
                BTN_MENU10
        };

        constant integer nBtns[] =
        {
                PLAY,
                STOP,
                PAUSE,
                FFWD,                                           // Jump forward
                REW,                                            // jump backward
                SREV,                                           // Skip backward
                SFWD,                                           // Skip forward
                MENU_THUMBS_DN,
                MENU_THUMBS_UP,
                MEDIA_RANDOM,
                MEDIA_REPEAT
        };

        constant integer nLines[] =
        {
                BTN_LINE1_PIC,
                BTN_LINE1_LINE,
                BTN_LINE2_PIC,
                BTN_LINE2_LINE,
                BTN_LINE3_PIC,
                BTN_LINE3_LINE,
                BTN_LINE4_PIC,
                BTN_LINE4_LINE,
                BTN_LINE5_PIC,
                BTN_LINE5_LINE,
                BTN_LINE6_PIC,
                BTN_LINE6_LINE,
                BTN_LINE7_PIC,
                BTN_LINE7_LINE,
                BTN_LINE8_PIC,
                BTN_LINE8_LINE,
                BTN_LINE9_PIC,
                BTN_LINE9_LINE,
                BTN_LINE10_PIC,
                BTN_LINE10_LINE
        };

        constant char sIconTitle[] = 'Song_45x45';
        constant char sIconAlbum[] = 'Album_45x45';
        constant char sIconGenre[] = 'Genre_45x45';
        constant char sIconArtist[] = 'Artist_45x45';
        constant char sIconQueue[] = 'Queue_45x45';
        constant char sIconPlaylist[] = 'Playlist_45x45';

        constant char sIconsMusic[7][24] =
        {
                sIconTitle,
                sIconArtist,
                sIconAlbum,
                sIconGenre,
                sIconQueue,
                sIconPlaylist
        };

DEFINE_VARIABLE
        volatile integer nStart;                                // Index position of current position in list.
        volatile integer nTotal;                                // Total number of data
        volatile integer nPage;                                 // The type of the page: TOK_TITLE, ...
        volatile ST_SONG stSong[MAX_LINES];             // The register of currently showed songs
        volatile integer nSongIdx;                              // The index of the song pointer
        volatile char _strTok[10][256];


// DecodeURL: Undo URL encoding on a data segment as necessary for CLI protocol
//      (Note: Distructive for input; copy str before call if needed)
//   str: String to be decoded
define_function char[1024] DecodeURL(char oldStr[])
{
stack_var char str[1024];
stack_var char newStr[1024];
stack_var char strSegment[1024];
stack_var char strHex[2];

    str = oldStr;
    // Loop through string looking for '%' prefix characters
    strSegment = remove_string(str, '%', 1);

    while (length_array(strSegment) != 0) 
        {
                // Strip off '%' character from string segment, fetch HEX ASCII byte, reconstruct
                set_length_array(strSegment, length_array(strSegment) - 1);
                strHex = Left_String(str, 2);
                str = Right_String(str, length_array(str) - 2);
                newStr = "newStr,strSegment,HexToI(strHex)";

                strSegment = remove_string(str, '%', 1);
    }

    newStr = "newStr,str";
    return newStr;
}

define_function integer strtok(char str[], char tok[])
{
stack_var integer i;
stack_var integer idx;

        idx = 0;
        i = find_string(str, tok, 1);

        while (i && idx <= 10)
        {
                idx++;
                _strTok[idx] = left_string(str, i - length_string(tok));
                remove_string(str, tok, 1);
        }

        return idx;
}

define_function char[256] getStrTok(integer idx)
{
        if (idx && idx <= 10)
                return _strTok[idx];

        return '';
}

define_function clearAllLogos()
{
        send_command dvTPs,"'^SHO-',itoa(BTN_LINE1_PIC),'.',itoa(BTN_LINE1_PIC+MAX_LINES-1),',0'";
}

define_function clearLogo(integer pos)
{
        if (!pos || pos > MAX_LINES)
                return;

        send_command dvTPs,"'^SHO-',itoa(BTN_LINE1_PIC+pos-1),',0'";
}

define_function setLogo(char sFile[], integer pos)
{
stack_var integer nType;
stack_var char sHost[64];
stack_var char sPath[512];
stack_var integer i;

        if (pos > MAX_LINES)
                return;

        sHost = IP;
        sPath = 'mdb';
        nType = 0;                      // 0 = HTTP, 1 = FTP
        send_command dvTPs,"'^SHO-',itoa(300+pos),',1'";

        if (!length_string(sFile))
        {
                if (nPage && pos)
                        send_command dvTPs,"'^BBR-',itoa(300+pos),',0,',sIconsMusic[nPage]";

                return;
        }

        if (pos && pos <= MAX_LINES)
        {
                send_command dvTPs,"'^RMF-XBMC_Audio',itoa(pos),',%P',itoa(nType),'%H',sHost,'%A',sPath,'%F',sFile";
                send_command dvTPs,"'^BBR-',itoa(300+pos),',0,XBMC_Audio',itoa(pos)";
        }
        else
        {
                send_command dvTPs,"'^RMF-XBMC_AudioCover,%P',itoa(nType),'%H',sHost,'%A',sPath,'%F',sFile";
                send_command dvTPs,"'^BBR-',itoa(300+pos),',0,XBMC_AudioCover'";
        }
}

define_function clearPage()
{
        clearAllLogos();
        send_command dvTPs,"'^TXT-',itoa(BTN_LINE1_LINE),'.',itoa(BTN_LINE1_LINE+MAX_LINES-1)',0,'";
}

define_function char[32] requestActualPage()
{
stack_var char sPage[32];

        sPage = '';

        if (nPage == TOK_NONE)
                return sPage;

        switch(nPage)
        {
                case TOK_TITLE:         sPage = TOK_TXT_TITLE;
                case TOK_ALBUM:         sPage = TOK_TXT_ALBUM;
                case TOK_ARTIST:        sPage = TOK_TXT_ARTIST;
                case TOK_GENRE:         sPage = TOK_TXT_GENRE;
                case TOK_QUEUE:         sPage = TOK_TXT_QUEUE;
                case TOK_PLAYLIST:      sPage = TOK_TXT_PLAYLIST;
        }

        return sPage;
}

define_function integer setActualPage(char pg[])
{
        nPage = TOK_NONE;

        select
        {
                active (pg == TOK_TXT_TITLE):           nPage = TOK_TITLE;
                active (pg == TOK_TXT_ARTIST):          nPage = TOK_ARTIST;
                active (pg == TOK_TXT_ALBUM):           nPage = TOK_ALBUM;
                active (pg == TOK_TXT_GENRE):           nPage = TOK_GENRE;
                active (pg == TOK_TXT_QUEUE):           nPage = TOK_QUEUE;
                active (pg == TOK_TXT_PLAYLIST):        nPage = TOK_PLAYLIST;
        }

        switch(nPage)
        {
                case TOK_TITLE:
                case TOK_ALBUM:
                case TOK_ARTIST:
                case TOK_GENRE:
                case TOK_PLAYLIST:
                        send_command dvTPs, "'@PPN-',sPopupAudio";
                break;

                case TOK_QUEUE:
                        send_command dvTPs, "'@PPN-',sPopupList";
                break;
        }

        return nPage;
}

define_function displaySong(integer idx)
{
        if (!idx || idx > MAX_LINES)
                return;

        send_command dvTPs, "'^TXT-',itoa(BTN_LINE1_LINE+idx-1),',0,',stSong[idx].sTitle,$0d$0a,stSong[idx].sArtist";
}

DEFINE_START
        nStart = 1;
        nPage = TOK_NONE;

DEFINE_EVENT
        data_event[dvTPs]
        {
                online:
                {
                        stack_var integer pan;

                        pan = get_last(dvTPs);

                        switch(nPage)
                        {
                                case TOK_TITLE:
                                case TOK_ALBUM:
                                case TOK_ARTIST:
                                case TOK_GENRE:
                                case TOK_PLAYLIST:
                                        send_command dvTPs[pan], "'@PPN-',sPopupAudio";
                                        send_command vdvMDB, "'LIST:',requestActualPage(),':',itoa(nStart),':',itoa(MAX_LINES),';'";
                                break;

                                case TOK_QUEUE:
                                        send_command dvTPs[pan], "'@PPN-',sPopupList";
                                        send_command vdvMDB, "'LIST:',requestActualPage(),':',itoa(nStart),':',itoa(MAX_LINES),';'";
                                break;
                        }
                }
        }

        button_event[dvTPs, nNavigation]
        {
                push:
                {
                        switch(BUTTON.INPUT.CHANNEL)
                        {
                                case BTN_TITLE:         send_command vdvMDB, "'LIST:TITLE:1:',itoa(MAX_LINES),';'"; break;
                                case BTN_ARTIST:        send_command vdvMDB, "'LIST:ARTIST:1:',itoa(MAX_LINES),';'"; break;
                                case BTN_ALBUM:         send_command vdvMDB, "'LIST:ALBUM:1:',itoa(MAX_LINES),';'"; break;
                                case BTN_GENRE:         send_command vdvMDB, "'LIST:GENRE:1:',itoa(MAX_LINES),';'"; break;
                                case BTN_NOW_PLAYING: send_command vdvMDB, "'LIST:QUEUE:1:',itoa(MAX_LINES),';'"; break;
                        }
                }
        }

        button_event[dvTPs, nBtns]
        {
                push:
                {
                        switch(BUTTON.INPUT.CHANNEL)
                        {
                                case PLAY:                      send_command vdvMDB, 'PLAY;';
                                case PAUSE:                     send_command vdvMDB, 'PAUSE;';
                                case STOP:                      send_command vdvMDB, 'STOP;';
                                case FFWD:                      send_command vdvMDB, 'FORWARD;';
                                case REW:                       send_command vdvMDB, 'REWIND;';
                                case SREV:                      send_command vdvMDB, 'SKIPREW;';
                                case SFWD:                      send_command vdvMDB, 'SKIPFWD;';
                                case MEDIA_RANDOM:      send_command vdvMDB, 'RANDOM;';
                                case MEDIA_REPEAT:      send_command vdvMDB, 'REPEAT;';

                                case MENU_THUMBS_DN:
                                        if (nStart > MAX_LINES)
                                        {
                                                nStart = nStart - MAX_LINES;
                                                send_command vdvMDB, "'LIST:',requestActualPage(),':',itoa(nStart),':',itoa(MAX_LINES),';'";
                                        }
                                break;

                                case MENU_THUMBS_UP:
                                        if (nTotal && (nStart+MAX_LINES) <= nTotal)
                                        {
                                                nStart = nStart + MAX_LINES;
                                                send_command vdvMDB, "'LIST:',requestActualPage(),':',itoa(nStart),':',itoa(MAX_LINES),';'";
                                        }
                                break;
                        }
                }
        }

        data_event[vdvMDB]
        {
                string:
                {
                        stack_var char buf[8192];

                        while (find_string(DATA.TEXT, ';', 1))
                        {
                                buf = remove_string(DATA.TEXT, ';', 1);
                                set_length_string(buf, length_string(buf) - 1);

                                select
                                {
                                        active(find_string(buf, 'LIST:', 1)):
                                        {
                                        stack_var char sPg[32];
                                        stack_var integer nSongID;
                                        stack_var integer nLine;
                                        stack_var integer anz;
                                        stack_var integer i;

                                                remove_string(buf, 'LIST:', 1);
                                                anz = strtok(buf, ':');
                                                
                                                for (i = 1; i <= anz; i++)
                                                {
                                                        switch (i)
                                                        {
                                                                case 1: sPg = getStrTok(i);
                                                                case 2: nSongID = atoi(getStrTok(i));
                                                                case 3: nLine = atoi(getStrTok(i));
                                                                case 4: stSong[nLine].sTitle = getStrTok(i);
                                                                case 5: stSong[nLine].sArtist = getStrTok(i);
                                                                case 6: stSong[nLine].sAlbum = getStrTok(i);
                                                                case 7: stSong[nLine].sGenre = getStrTok(i);
                                                                case 8: stSong[nLine].sCover = getStrTok(i);
                                                        }
                                                }

                                                stSong[nLine].nID = nSongID;

                                                if (nLine == 1)
                                                {
                                                        setActualPage(sPg);
                                                        clearPage();
                                                }

                                                displaySong(nLine);
                                        }

                                        active(find_string(buf, 'TOTAL:', 1)):
                                        {
                                                remove_string(buf, 'TOTAL:', 1);
                                                nTotal = atoi(buf);
                                        }

                                        active(find_string(buf, 'PAGE:', 1)):
                                        {
                                                remove_string(buf, 'PAGE:', 1);
                                                setActualPage(buf);
                                        }
                                }
                        }
                }
        }