| 
									
										
										
										
											2018-02-08 21:28:33 -05:00
										 |  |  | // Simple bargraph dB meter
 | 
					
						
							|  |  |  | // Implemented by Edson Pereira PY2SDR
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "signalmeter.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <QVBoxLayout>
 | 
					
						
							|  |  |  | #include <QHBoxLayout>
 | 
					
						
							|  |  |  | #include <QLabel>
 | 
					
						
							|  |  |  | #include <QPainter>
 | 
					
						
							|  |  |  | #include <QFontMetrics>
 | 
					
						
							|  |  |  | #include <QDebug>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <meterwidget.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "moc_signalmeter.cpp"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define MAXDB 90
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Scale final | 
					
						
							|  |  |  |   : public QWidget | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |   explicit Scale (QWidget * parent = 0) | 
					
						
							|  |  |  |     : QWidget {parent} | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     setSizePolicy (QSizePolicy::Minimum, QSizePolicy::MinimumExpanding); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   QSize sizeHint () const override | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     return minimumSizeHint (); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   QSize minimumSizeHint () const override | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     QFontMetrics font_metrics {font (), nullptr}; | 
					
						
							|  |  |  |     return {tick_length + text_indent + font_metrics.width ("00+"), (font_metrics.height () + line_spacing) * range}; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | protected: | 
					
						
							|  |  |  |   void paintEvent (QPaintEvent * event) override | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     QWidget::paintEvent (event); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     QPainter p {this}; | 
					
						
							| 
									
										
										
										
											2018-03-10 16:59:09 -05:00
										 |  |  |     p.setPen(Qt::white); | 
					
						
							| 
									
										
										
										
											2018-02-08 21:28:33 -05:00
										 |  |  |     auto const& target = contentsRect (); | 
					
						
							|  |  |  |     QFontMetrics font_metrics {p.font (), this}; | 
					
						
							|  |  |  |     auto font_offset = font_metrics.ascent () / 2; | 
					
						
							|  |  |  |     p.drawLine (target.left (), target.top () + font_offset, target.left (), target.bottom () - font_offset - font_metrics.descent ()); | 
					
						
							|  |  |  |     for (int i = 0; i <= range; ++i) | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         p.save (); | 
					
						
							|  |  |  |         p.translate (target.left () | 
					
						
							|  |  |  |                      , target.top () + font_offset + i * (target.height () - font_metrics.ascent () - font_metrics.descent ()) / range); | 
					
						
							|  |  |  |         p.drawLine (0, 0, tick_length, 0); | 
					
						
							|  |  |  | 	if((i%2==1)) { | 
					
						
							|  |  |  | 	  auto text = QString::number ((range - i) * scale); | 
					
						
							|  |  |  | 	  p.drawText (tick_length + text_indent, font_offset, text); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  |         p.restore (); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |   static int constexpr tick_length {4}; | 
					
						
							|  |  |  |   static int constexpr text_indent {2}; | 
					
						
							|  |  |  |   static int constexpr line_spacing {0}; | 
					
						
							|  |  |  |   static int constexpr range {MAXDB/10}; | 
					
						
							|  |  |  |   static int constexpr scale {10}; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SignalMeter::SignalMeter (QWidget * parent) | 
					
						
							|  |  |  |   : QFrame {parent} | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   auto outer_layout = new QVBoxLayout; | 
					
						
							|  |  |  |   outer_layout->setSpacing (0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   auto inner_layout = new QHBoxLayout; | 
					
						
							|  |  |  |   inner_layout->setContentsMargins (9, 0, 9, 0); | 
					
						
							|  |  |  |   inner_layout->setSpacing (0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   m_meter = new MeterWidget; | 
					
						
							|  |  |  |   m_meter->setSizePolicy (QSizePolicy::Minimum, QSizePolicy::Minimum); | 
					
						
							| 
									
										
										
										
											2018-03-10 16:59:09 -05:00
										 |  |  |   //inner_layout->addWidget (m_meter);
 | 
					
						
							| 
									
										
										
										
											2018-02-08 21:28:33 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |   m_scale = new Scale; | 
					
						
							|  |  |  |   inner_layout->addWidget (m_scale); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-10 16:59:09 -05:00
										 |  |  |   // add this second...
 | 
					
						
							|  |  |  |   inner_layout->addWidget (m_meter); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-08 21:28:33 -05:00
										 |  |  |   m_reading = new QLabel(this); | 
					
						
							| 
									
										
										
										
											2018-03-10 16:59:09 -05:00
										 |  |  |   auto p = m_reading->palette(); | 
					
						
							|  |  |  |   p.setColor(m_reading->foregroundRole(), Qt::white); | 
					
						
							|  |  |  |   m_reading->setPalette(p); | 
					
						
							| 
									
										
										
										
											2018-02-08 21:28:33 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |   outer_layout->addLayout (inner_layout); | 
					
						
							|  |  |  |   outer_layout->addWidget (m_reading); | 
					
						
							|  |  |  |   setLayout (outer_layout); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void SignalMeter::setValue(float value, float valueMax) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   if(value<0) value=0; | 
					
						
							|  |  |  |   QFontMetrics font_metrics {m_scale->font (), nullptr}; | 
					
						
							|  |  |  |   m_meter->setContentsMargins (0, font_metrics.ascent () / 2, 0, font_metrics.ascent () / 2 + font_metrics.descent ()); | 
					
						
							|  |  |  |   m_meter->setValue(int(value)); | 
					
						
							|  |  |  |   m_meter->set_sigPeak(valueMax); | 
					
						
							|  |  |  |   QString t; | 
					
						
							|  |  |  |   t.sprintf("%d dB",int(value+0.5)); | 
					
						
							|  |  |  |   m_reading->setText(t); | 
					
						
							|  |  |  | } |