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