Files
recycled-ni-neutrino/src/gui/infoviewer_bb.cpp
[CST] Focus a85e4df410 gui/infoviewer_bb.cpp: change ca status display logic, comment thread start,
reasons: on zap showIcon_CA_Status was called at least 5! times, including full cabar paint,
while channel camap changed only once, so should be enough to paint bar once, paint grey icons if zap not complete,
and paint icons on event from zapit;
thread only to speedup resolution display for some 0.5-1 seconds sounds redundant.
feel free to discuss in mail-list


Origin commit data
------------------
Commit: ab9e712e1e
Author: [CST] Focus <focus.cst@gmail.com>
Date: 2012-06-02 (Sat, 02 Jun 2012)
2012-06-02 15:02:24 +04:00

805 lines
23 KiB
C++

/*
Neutrino-GUI - DBoxII-Project
Copyright (C) 2001 Steffen Hehn 'McClean'
Homepage: http://dbox.cyberphoria.org/
Kommentar:
Diese GUI wurde von Grund auf neu programmiert und sollte nun vom
Aufbau und auch den Ausbaumoeglichkeiten gut aussehen. Neutrino basiert
auf der Client-Server Idee, diese GUI ist also von der direkten DBox-
Steuerung getrennt. Diese wird dann von Daemons uebernommen.
License: GPL
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <string>
#include <algorithm>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/sysinfo.h>
#include <sys/vfs.h>
#include <sys/timeb.h>
#include <sys/param.h>
#include <time.h>
#include <fcntl.h>
#include <global.h>
#include <neutrino.h>
#include <gui/infoviewer.h>
#include <gui/infoviewer_bb.h>
#include <gui/bouquetlist.h>
#include <gui/widget/icons.h>
#include <gui/widget/hintbox.h>
#include <gui/customcolor.h>
#include <gui/pictureviewer.h>
#include <daemonc/remotecontrol.h>
#include <zapit/femanager.h>
#include <zapit/zapit.h>
#include <video.h>
extern CRemoteControl *g_RemoteControl; /* neutrino.cpp */
extern cVideo * videoDecoder;
//#define SHOW_RADIOTEXT_ICON
#define COL_INFOBAR_BUTTONS (COL_INFOBAR_SHADOW + 1)
#define COL_INFOBAR_BUTTONS_BACKGROUND (COL_INFOBAR_SHADOW_PLUS_1)
CInfoViewerBB::CInfoViewerBB()
{
frameBuffer = CFrameBuffer::getInstance();
is_visible = false;
scrambledErr = false;
scrambledErrSave = false;
scrambledNoSig = false;
scrambledNoSigSave = false;
scrambledT = 0;
#if 0
if(!scrambledT) {
pthread_create(&scrambledT, NULL, scrambledThread, (void*) this) ;
pthread_detach(scrambledT);
}
#endif
Init();
}
void CInfoViewerBB::Init()
{
hddscale = NULL;
varscale = NULL;
hddwidth = 0;
bbIconMaxH = 0;
bbButtonMaxH = 0;
bbIconMinX = 0;
bbButtonMaxX = 0;
fta = true;
minX = 0;
for (int i = 0; i < CInfoViewerBB::BUTTON_MAX; i++) {
tmp_bbButtonInfoText[i] = "";
}
InfoHeightY_Info = g_Font[SNeutrinoSettings::FONT_TYPE_INFOBAR_SMALL]->getHeight() + 5;
setBBOffset();
changePB();
}
CInfoViewerBB::~CInfoViewerBB()
{
if(scrambledT) {
pthread_cancel(scrambledT);
scrambledT = 0;
}
}
CInfoViewerBB* CInfoViewerBB::getInstance()
{
static CInfoViewerBB* InfoViewerBB = NULL;
if(!InfoViewerBB) {
InfoViewerBB = new CInfoViewerBB();
}
return InfoViewerBB;
}
bool CInfoViewerBB::checkBBIcon(const char * const icon, int *w, int *h)
{
frameBuffer->getIconSize(icon, w, h);
if ((*w != 0) && (*h != 0))
return true;
return false;
}
void CInfoViewerBB::getBBIconInfo()
{
bbIconMaxH = 0;
BBarY = g_InfoViewer->BoxEndY + bottom_bar_offset;
BBarFontY = BBarY + InfoHeightY_Info - (InfoHeightY_Info - g_Font[SNeutrinoSettings::FONT_TYPE_INFOBAR_SMALL]->getHeight()) / 2; /* center in buttonbar */
bbIconMinX = g_InfoViewer->BoxEndX;
CNeutrinoApp* neutrino = CNeutrinoApp::getInstance();
for (int i = 0; i < CInfoViewerBB::ICON_MAX; i++) {
int w = 0, h = 0;
bool iconView = false;
switch (i) {
case CInfoViewerBB::ICON_SUBT: //no radio
if (neutrino->getMode() != NeutrinoMessages::mode_radio)
iconView = checkBBIcon(NEUTRINO_ICON_SUBT, &w, &h);
break;
case CInfoViewerBB::ICON_VTXT: //no radio
if (neutrino->getMode() != NeutrinoMessages::mode_radio)
iconView = checkBBIcon(NEUTRINO_ICON_VTXT, &w, &h);
break;
#ifdef SHOW_RADIOTEXT_ICON
case CInfoViewerBB::ICON_RT:
if (neutrino->getMode() == NeutrinoMessages::mode_radio)
iconView = checkBBIcon(NEUTRINO_ICON_RT, &w, &h);
break;
#endif
case CInfoViewerBB::ICON_DD:
iconView = checkBBIcon(NEUTRINO_ICON_DD, &w, &h);
break;
case CInfoViewerBB::ICON_16_9: //no radio
if (neutrino->getMode() != NeutrinoMessages::mode_radio)
iconView = checkBBIcon(NEUTRINO_ICON_16_9, &w, &h);
break;
case CInfoViewerBB::ICON_RES: //no radio
if ((g_settings.infobar_show_res < 2) && (neutrino->getMode() != NeutrinoMessages::mode_radio))
iconView = checkBBIcon(NEUTRINO_ICON_RESOLUTION_1280, &w, &h);
break;
case CInfoViewerBB::ICON_CA:
if (g_settings.casystem_display == 2)
iconView = checkBBIcon(NEUTRINO_ICON_SCRAMBLED2, &w, &h);
break;
case CInfoViewerBB::ICON_TUNER:
if (g_settings.infobar_show_tuner == 1) {
iconView = checkBBIcon(NEUTRINO_ICON_TUNER_1, &w, &h);
}
break;
default:
break;
}
if (iconView) {
bbIconMinX -= w + 2;
bbIconInfo[i].x = bbIconMinX;
bbIconInfo[i].h = h;
}
else
bbIconInfo[i].x = -1;
}
for (int i = 0; i < CInfoViewerBB::ICON_MAX; i++) {
if (bbIconInfo[i].x != -1)
bbIconMaxH = std::max(bbIconMaxH, bbIconInfo[i].h);
}
if (g_settings.infobar_show_sysfs_hdd)
bbIconMinX -= hddwidth + 2;
}
void CInfoViewerBB::getBBButtonInfo()
{
bbButtonMaxH = 0;
bbButtonMaxX = g_InfoViewer->ChanInfoX;
int bbButtonMaxW = 0;
for (int i = 0; i < CInfoViewerBB::BUTTON_MAX; i++) {
int w = 0, h = 0;
std::string text, icon;
switch (i) {
case CInfoViewerBB::BUTTON_EPG:
icon = NEUTRINO_ICON_BUTTON_RED;
frameBuffer->getIconSize(icon.c_str(), &w, &h);
text = g_settings.usermenu_text[SNeutrinoSettings::BUTTON_RED];
if (text.empty())
text = g_Locale->getText(LOCALE_INFOVIEWER_EVENTLIST);
break;
case CInfoViewerBB::BUTTON_AUDIO:
icon = NEUTRINO_ICON_BUTTON_GREEN;
frameBuffer->getIconSize(icon.c_str(), &w, &h);
text = g_settings.usermenu_text[SNeutrinoSettings::BUTTON_GREEN];
if (text == g_Locale->getText(LOCALE_AUDIOSELECTMENUE_HEAD))
text = "";
if (g_RemoteControl->current_PIDs.APIDs.size() > 0) {
int selected = g_RemoteControl->current_PIDs.PIDs.selected_apid;
if (text.empty())
text = g_RemoteControl->current_PIDs.APIDs[selected].desc;
}
break;
case CInfoViewerBB::BUTTON_SUBS:
icon = NEUTRINO_ICON_BUTTON_YELLOW;
frameBuffer->getIconSize(icon.c_str(), &w, &h);
text = g_settings.usermenu_text[SNeutrinoSettings::BUTTON_YELLOW];
if (text.empty())
text = g_Locale->getText((g_RemoteControl->are_subchannels) ? LOCALE_INFOVIEWER_SUBSERVICE : LOCALE_INFOVIEWER_SELECTTIME);
break;
case CInfoViewerBB::BUTTON_FEAT:
icon = NEUTRINO_ICON_BUTTON_BLUE;
frameBuffer->getIconSize(icon.c_str(), &w, &h);
text = g_settings.usermenu_text[SNeutrinoSettings::BUTTON_BLUE];
if (text.empty())
text = g_Locale->getText(LOCALE_INFOVIEWER_STREAMINFO);
break;
default:
break;
}
bbButtonInfo[i].w = g_Font[SNeutrinoSettings::FONT_TYPE_INFOBAR_SMALL]->getRenderWidth(text) + w + 10;
bbButtonInfo[i].cx = w + 5;
bbButtonInfo[i].h = h;
bbButtonInfo[i].text = text;
bbButtonInfo[i].icon = icon;
}
// Calculate position/size of buttons
minX = std::min(bbIconMinX, g_InfoViewer->ChanInfoX + (((g_InfoViewer->BoxEndX - g_InfoViewer->ChanInfoX) * 75) / 100));
int MaxBr = minX - (g_InfoViewer->ChanInfoX + 10);
bbButtonMaxX = g_InfoViewer->ChanInfoX + 10;
int br = 0;
for (int i = 0; i < CInfoViewerBB::BUTTON_MAX; i++) {
if ((i == CInfoViewerBB::BUTTON_SUBS) && (g_RemoteControl->subChannels.empty())) { // no subchannels
bbButtonInfo[i].paint = false;
// bbButtonInfo[i].x = -1;
// continue;
}
else
bbButtonInfo[i].paint = true;
br += bbButtonInfo[i].w;
bbButtonInfo[i].x = bbButtonMaxX;
bbButtonMaxX += bbButtonInfo[i].w;
bbButtonMaxW = std::max(bbButtonMaxW, bbButtonInfo[i].w);
}
if (br > MaxBr) { // TODO: Cut to long strings
printf("[infoviewer.cpp - %s, line #%d] width ColorButtons (%d) > MaxBr (%d)\n", __FUNCTION__, __LINE__, br, MaxBr);
}
#if 0
int Btns = 0;
// counting buttons
for (int i = 0; i < CInfoViewerBB::BUTTON_MAX; i++) {
if (bbButtonInfo[i].x != -1) {
Btns++;
}
}
bbButtonMaxX = g_InfoViewer->ChanInfoX + 10;
bbButtonInfo[CInfoViewerBB::BUTTON_EPG].x = bbButtonMaxX;
bbButtonInfo[CInfoViewerBB::BUTTON_FEAT].x = minX - bbButtonInfo[CInfoViewerBB::BUTTON_FEAT].w;
int x1 = bbButtonInfo[CInfoViewerBB::BUTTON_EPG].x + bbButtonInfo[CInfoViewerBB::BUTTON_EPG].w;
int rest = bbButtonInfo[CInfoViewerBB::BUTTON_FEAT].x - x1;
if (Btns < 4) {
rest -= bbButtonInfo[CInfoViewerBB::BUTTON_AUDIO].w;
bbButtonInfo[CInfoViewerBB::BUTTON_AUDIO].x = x1 + rest / 2;
}
else {
rest -= bbButtonInfo[CInfoViewerBB::BUTTON_AUDIO].w + bbButtonInfo[CInfoViewerBB::BUTTON_SUBS].w;
rest = rest / 3;
bbButtonInfo[CInfoViewerBB::BUTTON_AUDIO].x = x1 + rest;
bbButtonInfo[CInfoViewerBB::BUTTON_SUBS].x = bbButtonInfo[CInfoViewerBB::BUTTON_AUDIO].x +
bbButtonInfo[CInfoViewerBB::BUTTON_AUDIO].w + rest;
}
#endif
#if 1
bbButtonMaxX = g_InfoViewer->ChanInfoX + 10;
int step = MaxBr / 4;
bbButtonInfo[CInfoViewerBB::BUTTON_EPG].x = bbButtonMaxX;
bbButtonInfo[CInfoViewerBB::BUTTON_AUDIO].x = bbButtonMaxX + step;
bbButtonInfo[CInfoViewerBB::BUTTON_SUBS].x = bbButtonMaxX + 2*step;
bbButtonInfo[CInfoViewerBB::BUTTON_FEAT].x = bbButtonMaxX + 3*step;
#endif
}
void CInfoViewerBB::showBBButtons(const int modus)
{
if (!is_visible)
return;
int i;
bool paint = false;
getBBButtonInfo();
for (i = 0; i < CInfoViewerBB::BUTTON_MAX; i++) {
if (tmp_bbButtonInfoText[i] != bbButtonInfo[i].text) {
paint = true;
break;
}
}
if (paint) {
frameBuffer->paintBoxRel(g_InfoViewer->ChanInfoX, BBarY, minX - g_InfoViewer->ChanInfoX, InfoHeightY_Info, COL_INFOBAR_BUTTONS_BACKGROUND, RADIUS_SMALL, CORNER_BOTTOM); //round
for (i = 0; i < CInfoViewerBB::BUTTON_MAX; i++) {
if ((bbButtonInfo[i].x <= g_InfoViewer->ChanInfoX) || (bbButtonInfo[i].x >= g_InfoViewer->BoxEndX) || (!bbButtonInfo[i].paint))
continue;
if ((bbButtonInfo[i].x > 0) && ((bbButtonInfo[i].x + bbButtonInfo[i].w) <= minX)) {
frameBuffer->paintIcon(bbButtonInfo[i].icon, bbButtonInfo[i].x, BBarY, InfoHeightY_Info);
g_Font[SNeutrinoSettings::FONT_TYPE_INFOBAR_SMALL]->RenderString(bbButtonInfo[i].x + bbButtonInfo[i].cx, BBarFontY,
bbButtonInfo[i].w - bbButtonInfo[i].cx, bbButtonInfo[i].text, COL_INFOBAR_BUTTONS, 0, true); // UTF-8
}
}
if (modus == CInfoViewerBB::BUTTON_AUDIO)
showIcon_DD();
for (i = 0; i < CInfoViewerBB::BUTTON_MAX; i++) {
tmp_bbButtonInfoText[i] = bbButtonInfo[i].text;
}
}
}
void CInfoViewerBB::showBBIcons(const int modus, const std::string & icon)
{
if ((bbIconInfo[modus].x <= g_InfoViewer->ChanInfoX) || (bbIconInfo[modus].x >= g_InfoViewer->BoxEndX))
return;
if ((modus >= CInfoViewerBB::ICON_SUBT) && (modus < CInfoViewerBB::ICON_MAX) && (bbIconInfo[modus].x != -1) && (is_visible)) {
frameBuffer->paintIcon(icon, bbIconInfo[modus].x, BBarY,
InfoHeightY_Info, 1, true, true, COL_INFOBAR_BUTTONS_BACKGROUND);
}
}
void CInfoViewerBB::paintshowButtonBar()
{
if (!is_visible)
return;
getBBIconInfo();
for (int i = 0; i < CInfoViewerBB::BUTTON_MAX; i++) {
tmp_bbButtonInfoText[i] = "";
}
g_InfoViewer->sec_timer_id = g_RCInput->addTimer(1*1000*1000, false);
if (g_settings.casystem_display < 2)
paintCA_bar(0,0);
frameBuffer->paintBoxRel(g_InfoViewer->ChanInfoX, BBarY, g_InfoViewer->BoxEndX - g_InfoViewer->ChanInfoX, InfoHeightY_Info, COL_INFOBAR_BUTTONS_BACKGROUND, RADIUS_SMALL, CORNER_BOTTOM); //round
g_InfoViewer->showSNR();
// Buttons
showBBButtons();
// Icons, starting from right
showIcon_SubT();
showIcon_VTXT();
showIcon_DD();
showIcon_16_9();
#if 0
scrambledCheck(true);
#endif
showIcon_CA_Status(0);
showIcon_Resolution();
showIcon_Tuner();
showSysfsHdd();
}
void CInfoViewerBB::showIcon_SubT()
{
if (!is_visible)
return;
bool have_sub = false;
CZapitChannel * cc = CNeutrinoApp::getInstance()->channelList->getChannel(CNeutrinoApp::getInstance()->channelList->getActiveChannelNumber());
if (cc && cc->getSubtitleCount())
have_sub = true;
showBBIcons(CInfoViewerBB::ICON_SUBT, (have_sub) ? NEUTRINO_ICON_SUBT : NEUTRINO_ICON_SUBT_GREY);
}
void CInfoViewerBB::showIcon_VTXT()
{
if (!is_visible)
return;
showBBIcons(CInfoViewerBB::ICON_VTXT, (g_RemoteControl->current_PIDs.PIDs.vtxtpid != 0) ? NEUTRINO_ICON_VTXT : NEUTRINO_ICON_VTXT_GREY);
}
void CInfoViewerBB::showIcon_DD()
{
if (!is_visible)
return;
std::string dd_icon;
if ((g_RemoteControl->current_PIDs.PIDs.selected_apid < g_RemoteControl->current_PIDs.APIDs.size()) &&
(g_RemoteControl->current_PIDs.APIDs[g_RemoteControl->current_PIDs.PIDs.selected_apid].is_ac3))
dd_icon = NEUTRINO_ICON_DD;
else
dd_icon = (g_RemoteControl->has_ac3) ? NEUTRINO_ICON_DD_AVAIL : NEUTRINO_ICON_DD_GREY;
showBBIcons(CInfoViewerBB::ICON_DD, dd_icon);
}
#ifdef SHOW_RADIOTEXT_ICON
void CInfoViewerBB::showIcon_RadioText(bool rt_available)
{
// TODO: display radiotext icon
if ((showButtonBar) && (is_visible))
{
int mode = CNeutrinoApp::getInstance()->getMode();
showBBIcons(CInfoViewerBB::ICON_RT, rt_icon);
}
}
#else
void CInfoViewerBB::showIcon_RadioText(bool /*rt_available*/)
{
}
#endif
void CInfoViewerBB::showIcon_16_9()
{
if (!is_visible)
return;
if ((g_InfoViewer->aspectRatio == 0) || ( g_RemoteControl->current_PIDs.PIDs.vpid == 0 ) || (g_InfoViewer->aspectRatio != videoDecoder->getAspectRatio())) {
if (g_InfoViewer->chanready && g_RemoteControl->current_PIDs.PIDs.vpid > 0 ) {
g_InfoViewer->aspectRatio = videoDecoder->getAspectRatio();
}
else
g_InfoViewer->aspectRatio = 0;
showBBIcons(CInfoViewerBB::ICON_16_9, (g_InfoViewer->aspectRatio > 2) ? NEUTRINO_ICON_16_9 : NEUTRINO_ICON_16_9_GREY);
}
}
void CInfoViewerBB::showIcon_Resolution()
{
if ((!is_visible) || (g_settings.infobar_show_res == 2)) //show resolution icon is off
return;
const char *icon_name = NULL;
#if 0
if ((scrambledNoSig) || ((!fta) && (scrambledErr)))
#else
if (!g_InfoViewer->chanready || videoDecoder->getBlank())
#endif
{
icon_name = NEUTRINO_ICON_RESOLUTION_000;
} else {
int xres, yres, framerate;
if (g_settings.infobar_show_res == 0) {//show resolution icon on infobar
videoDecoder->getPictureInfo(xres, yres, framerate);
switch (yres) {
case 1920:
icon_name = NEUTRINO_ICON_RESOLUTION_1920;
break;
case 1088:
icon_name = NEUTRINO_ICON_RESOLUTION_1080;
break;
case 1440:
icon_name = NEUTRINO_ICON_RESOLUTION_1440;
break;
case 1280:
icon_name = NEUTRINO_ICON_RESOLUTION_1280;
break;
case 720:
icon_name = NEUTRINO_ICON_RESOLUTION_720;
break;
case 704:
icon_name = NEUTRINO_ICON_RESOLUTION_704;
break;
case 576:
icon_name = NEUTRINO_ICON_RESOLUTION_576;
break;
case 544:
icon_name = NEUTRINO_ICON_RESOLUTION_544;
break;
case 528:
icon_name = NEUTRINO_ICON_RESOLUTION_528;
break;
case 480:
icon_name = NEUTRINO_ICON_RESOLUTION_480;
break;
case 382:
icon_name = NEUTRINO_ICON_RESOLUTION_382;
break;
case 352:
icon_name = NEUTRINO_ICON_RESOLUTION_352;
break;
case 288:
icon_name = NEUTRINO_ICON_RESOLUTION_288;
break;
default:
icon_name = NEUTRINO_ICON_RESOLUTION_000;
break;
}
}
if (g_settings.infobar_show_res == 1) {//show simple resolution icon on infobar
videoDecoder->getPictureInfo(xres, yres, framerate);
switch (yres) {
case 1920:
case 1440:
case 1280:
case 1088:
case 720:
icon_name = NEUTRINO_ICON_RESOLUTION_HD;
break;
case 704:
case 576:
case 544:
case 528:
case 480:
case 382:
case 352:
case 288:
icon_name = NEUTRINO_ICON_RESOLUTION_SD;
break;
default:
icon_name = NEUTRINO_ICON_RESOLUTION_000;
break;
}
}
}
showBBIcons(CInfoViewerBB::ICON_RES, icon_name);
}
void CInfoViewerBB::showOne_CAIcon()
{
std::string sIcon = "";
#if 0
if (CNeutrinoApp::getInstance()->getMode() != NeutrinoMessages::mode_radio) {
if (scrambledNoSig)
sIcon = NEUTRINO_ICON_SCRAMBLED2_BLANK;
else {
if (fta)
sIcon = NEUTRINO_ICON_SCRAMBLED2_GREY;
else
sIcon = (scrambledErr) ? NEUTRINO_ICON_SCRAMBLED2_RED : NEUTRINO_ICON_SCRAMBLED2;
}
}
else
#endif
sIcon = (fta) ? NEUTRINO_ICON_SCRAMBLED2_GREY : NEUTRINO_ICON_SCRAMBLED2;
showBBIcons(CInfoViewerBB::ICON_CA, sIcon);
}
void CInfoViewerBB::showIcon_Tuner()
{
std::string icon_name;
switch (CFEManager::getInstance()->getLiveFE()->getNumber()) {
case 1:
icon_name = NEUTRINO_ICON_TUNER_2;
break;
case 0:
default:
icon_name = NEUTRINO_ICON_TUNER_1;
break;
}
showBBIcons(CInfoViewerBB::ICON_TUNER, icon_name);
}
void CInfoViewerBB::showSysfsHdd()
{
if ((g_settings.infobar_show_sysfs_hdd) && (is_visible)) {
long blocks_used;
struct statfs s;
int per = 0;
if (::statfs("/", &s) == 0 && s.f_blocks) {
// per = (s.f_blocks - s.f_bfree) / (s.f_blocks/100);
blocks_used = s.f_blocks - s.f_bfree;
per = (blocks_used * 100ULL) / s.f_blocks;
}
varscale->paintProgressBar(bbIconMinX, BBarY + InfoHeightY_Info / 2 - 2 - 6, hddwidth , 6, per, 100);
per = 0;
//HD info
if(!check_dir(g_settings.network_nfs_recordingdir)){
if (::statfs(g_settings.network_nfs_recordingdir, &s) == 0 && s.f_blocks) {
blocks_used = s.f_blocks - s.f_bfree;
per = (blocks_used * 100ULL) / s.f_blocks;
}
}
hddscale->paintProgressBar(bbIconMinX, BBarY + InfoHeightY_Info / 2 + 2, hddwidth, 6, per, 100);
}
}
void CInfoViewerBB::paint_ca_icons(int caid, char * icon, int &icon_space_offset)
{
char buf[20];
int endx = g_InfoViewer->BoxEndX -3;
int py = g_InfoViewer->BoxEndY + 2; /* hand-crafted, should be automatic */
int px = 0;
static map<int, std::pair<int,const char*> > icon_map;
const int icon_space = 10, icon_number = 10;
static int icon_offset[icon_number] = {0,0,0,0,0,0,0,0,0,0};
static int icon_sizeW [icon_number] = {0,0,0,0,0,0,0,0,0,0};
static bool init_flag = false;
if (!init_flag) {
init_flag = true;
int icon_sizeH = 0, index = 0;
map<int, std::pair<int,const char*> >::const_iterator it;
icon_map[0x0E00] = std::make_pair(index++,"powervu");
icon_map[0x4A00] = std::make_pair(index++,"d");
icon_map[0x2600] = std::make_pair(index++,"biss");
icon_map[0x0600] = std::make_pair(index++,"ird");
icon_map[0x0100] = std::make_pair(index++,"seca");
icon_map[0x0500] = std::make_pair(index++,"via");
icon_map[0x1800] = std::make_pair(index++,"nagra");
icon_map[0x0B00] = std::make_pair(index++,"conax");
icon_map[0x0D00] = std::make_pair(index++,"cw");
icon_map[0x0900] = std::make_pair(index ,"nds");
for (it=icon_map.begin(); it!=icon_map.end(); ++it) {
snprintf(buf, sizeof(buf), "%s_%s", (*it).second.second, icon);
frameBuffer->getIconSize(buf, &icon_sizeW[(*it).second.first], &icon_sizeH);
}
for (int j = 0; j < icon_number; j++) {
for (int i = j; i < icon_number; i++) {
icon_offset[j] += icon_sizeW[i] + icon_space;
}
}
}
caid &= 0xFF00;
if (icon_offset[icon_map[caid].first] == 0)
return;
if (g_settings.casystem_display == 0) {
px = endx - (icon_offset[icon_map[caid].first] - icon_space );
} else {
icon_space_offset += icon_sizeW[icon_map[caid].first];
px = endx - icon_space_offset;
icon_space_offset += 4;
}
if (px) {
snprintf(buf, sizeof(buf), "%s_%s", icon_map[caid].second, icon);
if ((px >= (endx-8)) || (px <= 0))
printf("#####[%s:%d] Error paint icon %s, px: %d, py: %d, endx: %d, icon_offset: %d\n",
__FUNCTION__, __LINE__, buf, px, py, endx, icon_offset[icon_map[caid].first]);
else
frameBuffer->paintIcon(buf, px, py);
}
}
void CInfoViewerBB::showIcon_CA_Status(int notfirst)
{
int caids[] = { 0x600, 0x0100, 0x0500, 0x1800, 0xB00, 0xD00, 0x900, 0x2600, 0x4a00, 0x0E00 };
const char * white = (char *) "white";
const char * yellow = (char *) "yellow";
int icon_space_offset = 0;
if (g_settings.casystem_display == 3)
return;
if(!g_InfoViewer->chanready) {
if (g_settings.casystem_display == 2) {
fta = true;
showOne_CAIcon();
}
else if(g_settings.casystem_display == 0) {
for (int i = 0; i < (int)(sizeof(caids)/sizeof(int)); i++) {
paint_ca_icons(caids[i], (char *) white, icon_space_offset);
}
}
return;
}
CZapitChannel * channel = CZapit::getInstance()->GetCurrentChannel();
if(!channel)
return;
if (g_settings.casystem_display == 2) {
fta = (channel->camap.size() == 0);
showOne_CAIcon();
return;
}
if(!notfirst) {
#if 0
static int icon_space_offset = 0;
if ((g_settings.casystem_display == 1) && (icon_space_offset)) {
paintCA_bar(0,icon_space_offset);
icon_space_offset = 0;
}
#endif
for (int i = 0; i < (int)(sizeof(caids)/sizeof(int)); i++) {
bool found = false;
for(casys_map_iterator_t it = channel->camap.begin(); it != channel->camap.end(); ++it) {
int caid = (*it) & 0xFF00;
if (caid == 0x1700)
caid = 0x0600;
if((found = (caid == caids[i])))
break;
}
if(g_settings.casystem_display == 0)
paint_ca_icons(caids[i], (char *) (found ? yellow : white), icon_space_offset);
else if(found)
paint_ca_icons(caids[i], (char *) yellow, icon_space_offset);
}
}
}
void CInfoViewerBB::paintCA_bar(int left, int right)
{
int xcnt = (g_InfoViewer->BoxEndX - g_InfoViewer->ChanInfoX) / 4;
int ycnt = bottom_bar_offset / 4;
if (right)
right = xcnt - ((right/4)+1);
if (left)
left = xcnt - ((left/4)-1);
frameBuffer->paintBox(g_InfoViewer->ChanInfoX + (right*4), g_InfoViewer->BoxEndY, g_InfoViewer->BoxEndX - (left*4), g_InfoViewer->BoxEndY + bottom_bar_offset, COL_BLACK);
if (left)
left -= 1;
for (int i = 0 + right; i < xcnt - left; i++) {
for (int j = 0; j < ycnt; j++) {
frameBuffer->paintBoxRel((g_InfoViewer->ChanInfoX + 2) + i*4, g_InfoViewer->BoxEndY + 2 + j*4, 2, 2, COL_INFOBAR_PLUS_1);
}
}
}
void CInfoViewerBB::changePB()
{
hddwidth = frameBuffer->getScreenWidth(true) * ((g_settings.screen_preset == 1) ? 10 : 8) / 128; /* 80(CRT)/100(LCD) pix if screen is 1280 wide */
if (hddscale != NULL)
delete hddscale;
hddscale = new CProgressBar(true, hddwidth, 6, 50, 100, 75, true);
if (varscale != NULL)
delete varscale;
varscale = new CProgressBar(true, hddwidth, 6, 50, 100, 75, true);
}
void CInfoViewerBB::reset_allScala()
{
hddscale->reset();
varscale->reset();
lasthdd = lastvar = -1;
}
void CInfoViewerBB::setBBOffset()
{
bottom_bar_offset = (g_settings.casystem_display < 2) ? 22 : 0;
}
void* CInfoViewerBB::scrambledThread(void *arg)
{
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, 0);
CInfoViewerBB *infoViewerBB = static_cast<CInfoViewerBB*>(arg);
while(1) {
if (infoViewerBB->is_visible)
infoViewerBB->scrambledCheck();
usleep(500*1000);
}
return 0;
}
void CInfoViewerBB::scrambledCheck(bool force)
{
scrambledErr = false;
scrambledNoSig = false;
if (videoDecoder->getBlank()) {
if (videoDecoder->getPlayState())
scrambledErr = true;
else
scrambledNoSig = true;
}
if ((scrambledErr != scrambledErrSave) || (scrambledNoSig != scrambledNoSigSave) || force) {
showIcon_CA_Status(0);
showIcon_Resolution();
scrambledErrSave = scrambledErr;
scrambledNoSigSave = scrambledNoSig;
}
}