3 * Copyright (C) 2016-2020 William Morrow
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published
7 * by the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
15 * You should have received a copy of the GNU General Public
16 * License along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
25 #include "devicedvbinput.h"
27 #include "signalstatus.h"
32 SignalStatus::SignalStatus(BC_WindowBase *wdw, int x, int y)
33 : BC_SubWindow(x, y, xS(100), yS(35))
47 SignalStatus::~SignalStatus()
50 dvb_input->set_signal_status(0);
54 void SignalStatus::create_objects()
56 clear_box(0,0,get_w(),get_h());
58 channel_title = new BC_Title(x, y, " ", SMALLFONT, GREEN);
59 add_subwindow(channel_title);
60 y += channel_title->get_h();
62 add_subwindow(title = new BC_Title(x, y, "lk:", SMALLFONT, YELLOW));
63 lck_x = x + title->get_w() + pad0;
65 int x1 = lck_x + lck_w + pad1;
66 int y1 = y + title->get_h();
67 add_subwindow(title = new BC_Title(x, y1, "cr:", SMALLFONT, YELLOW));
70 add_subwindow(title = new BC_Title(x1, y, "pwr", SMALLFONT, YELLOW));
71 pwr_x = x1 + title->get_w() + pad0;
74 snr_y = pwr_y + pwr_h;
75 add_subwindow(title = new BC_Title(x1, y1, "err", SMALLFONT, YELLOW));
79 unc_y = ber_y + ber_h;
82 int SignalStatus::calculate_w(BC_WindowBase *wdw)
84 return BC_Title::calculate_w(wdw, "lk:", SMALLFONT) + pad0 + lck_w + pad1 +
85 BC_Title::calculate_w(wdw, "pwr", SMALLFONT) + pad0 + pwr_w;
88 int SignalStatus::calculate_h(BC_WindowBase *wdw)
90 return 3*BC_Title::calculate_h(wdw, "lk:", SMALLFONT);
93 void SignalStatus::update_lck(int v)
95 set_color(v>0 ? GREEN : RED);
96 draw_box(lck_x, lck_y, lck_w, lck_h);
99 void SignalStatus::update_crr(int v)
101 set_color(v>0 ? GREEN : RED);
102 draw_box(crr_x, crr_y, crr_w, crr_h);
105 void SignalStatus::update_pwr(int v)
108 int w0 = (v*pwr_w) / 65535, w1 = pwr_w-w0;
109 if( w0 > 0 ) { set_color(GREEN); draw_box(pwr_x, pwr_y, w0, pwr_h); }
110 if( w1 > 0 ) clear_box(pwr_x+w0, pwr_y, w1, pwr_h);
113 void SignalStatus::update_snr(int v)
116 int w0 = (v*snr_w) / 65535, w1 = pwr_w-w0;
117 if( w0 > 0 ) { set_color(BLUE); draw_box(snr_x, snr_y, w0, snr_h); }
118 if( w1 > 0 ) clear_box(snr_x+w0, snr_y, w1, snr_h);
121 void SignalStatus::update_ber(int v)
125 while( v > 0 ) { ++b; v>>=1; }
126 int w0 = (ber_w*b)/16, w1 = ber_w-w0;
127 if( w0 > 0 ) { set_color(YELLOW); draw_box(ber_x, ber_y, w0, ber_h); }
128 if( w1 > 0 ) clear_box(ber_x+w0, ber_y, w1, ber_h);
131 void SignalStatus::update_unc(int v)
135 while( v > 0 ) { ++b; v>>=1; }
136 int w0 = (unc_w*b)/16, w1 = unc_w-w0;
137 if( w0 > 0 ) { set_color(RED); draw_box(unc_x, unc_y, w0, unc_h); }
138 if( w1 > 0 ) clear_box(unc_x+w0, unc_y, w1, unc_h);
142 void SignalStatus::update()
144 channel_title->update(dvb_input->channel_title());
145 update_lck(dvb_input->signal_lck); update_crr(dvb_input->signal_crr);
146 update_pwr(dvb_input->signal_pwr); update_snr(dvb_input->signal_snr);
147 update_ber(dvb_input->signal_ber); update_unc(dvb_input->signal_unc);