| 
									
										
										
										
											2018-02-08 21:28:33 -05:00
										 |  |  | // Simple bargraph meter
 | 
					
						
							|  |  |  | // Implemented by Edson Pereira PY2SDR
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "meterwidget.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <QPainter>
 | 
					
						
							|  |  |  | #include <QPolygon>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "moc_meterwidget.cpp"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define MAXDB 90
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | MeterWidget::MeterWidget(QWidget * parent) | 
					
						
							|  |  |  |   : QWidget {parent} | 
					
						
							|  |  |  |   , m_signal {0} | 
					
						
							|  |  |  |   , m_noisePeak {0} | 
					
						
							|  |  |  |   , m_sigPeak {0} | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   for ( int i = 0; i < 10; i++ ) { | 
					
						
							|  |  |  |     signalQueue.enqueue(0); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void MeterWidget::setValue(int value) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     m_signal = value; | 
					
						
							|  |  |  |     signalQueue.enqueue(value); | 
					
						
							|  |  |  |     signalQueue.dequeue(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Get signal peak
 | 
					
						
							|  |  |  |     int tmp = 0; | 
					
						
							|  |  |  |     for (int i = 0; i < signalQueue.size(); ++i) { | 
					
						
							|  |  |  |         if (signalQueue.at(i) > tmp) | 
					
						
							|  |  |  |             tmp = signalQueue.at(i); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     m_noisePeak = tmp; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | QSize MeterWidget::sizeHint () const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   return {10, 100}; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void MeterWidget::paintEvent (QPaintEvent * event) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   QWidget::paintEvent (event); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Sanitize
 | 
					
						
							|  |  |  |   m_signal = m_signal < 0 ? 0 : m_signal; | 
					
						
							|  |  |  |   m_signal = m_signal > MAXDB ? MAXDB : m_signal; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   QPainter p {this}; | 
					
						
							|  |  |  |   p.setPen (Qt::NoPen); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   auto const& target = contentsRect (); | 
					
						
							|  |  |  |   QRect r {QPoint {target.left (), static_cast<int> (target.top () + target.height () - m_signal / (double)MAXDB * target.height ())} | 
					
						
							|  |  |  |     , QPoint {target.right (), target.bottom ()}}; | 
					
						
							| 
									
										
										
										
											2018-03-10 16:59:09 -05:00
										 |  |  |   //p.setBrush (QColor(85,170,85));
 | 
					
						
							|  |  |  |   p.setBrush (Qt::green); | 
					
						
							| 
									
										
										
										
											2018-02-08 21:28:33 -05:00
										 |  |  |   if (m_sigPeak > 85) { | 
					
						
							|  |  |  |       p.setBrush(Qt::red); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   else if (m_noisePeak < 15) { | 
					
						
							| 
									
										
										
										
											2018-03-10 16:59:09 -05:00
										 |  |  |       //p.setBrush(QColor(232,81,0));
 | 
					
						
							|  |  |  |       p.setBrush(Qt::yellow); | 
					
						
							| 
									
										
										
										
											2018-02-08 21:28:33 -05:00
										 |  |  |   } | 
					
						
							|  |  |  |   p.drawRect (r); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (m_noisePeak) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       // Draw peak hold indicator
 | 
					
						
							|  |  |  |       auto peak = static_cast<int> (target.top () + target.height () - m_noisePeak / (double)MAXDB * target.height ()); | 
					
						
							| 
									
										
										
										
											2018-03-10 16:59:09 -05:00
										 |  |  |       //p.setBrush (Qt::black);
 | 
					
						
							|  |  |  |       p.setBrush (Qt::white); | 
					
						
							| 
									
										
										
										
											2018-02-08 21:28:33 -05:00
										 |  |  |       p.translate (target.left (), peak); | 
					
						
							| 
									
										
										
										
											2018-03-10 16:59:09 -05:00
										 |  |  |       //p.drawPolygon (QPolygon {{{0, -4}, {0, 4}, {target.width (), 0}}});
 | 
					
						
							|  |  |  |       p.drawPolygon (QPolygon { { {target.width (), -4}, {target.width (), 4}, {0, 0} } }); | 
					
						
							| 
									
										
										
										
											2018-02-08 21:28:33 -05:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | void MeterWidget::set_sigPeak(int value) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     m_sigPeak = value; | 
					
						
							|  |  |  | } |