You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ktechlab/src/electronics/components/ecsevensegment.cpp

211 lines
5.9 KiB

/***************************************************************************
* Copyright (C) 2003-2005 by David Saxton *
* david@bluehaze.org *
* *
* 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. *
***************************************************************************/
#include "colorcombo.h"
#include "diode.h"
#include "ecled.h"
#include "ecnode.h"
#include "ecsevensegment.h"
#include "libraryitem.h"
#include "simulator.h"
#include <tdelocale.h>
#include <tqpainter.h>
#include <tqstring.h>
Item* ECSevenSegment::construct( ItemDocument *itemDocument, bool newItem, const char *id )
{
return new ECSevenSegment( (ICNDocument*)itemDocument, newItem, id );
}
LibraryItem* ECSevenSegment::libraryItem()
{
return new LibraryItem(
"ec/seven_segment",
i18n("Seven Segment"),
i18n("Outputs"),
"seven_segment.png",
LibraryItem::lit_component,
ECSevenSegment::construct );
}
ECSevenSegment::ECSevenSegment( ICNDocument *icnDocument, bool newItem, const char *id )
: Component( icnDocument, newItem, id ? id : "seven_segment" )
{
m_name = i18n("Seven Segment LED");
m_desc = i18n("A seven segment display with a decimal point. This can be configured to either have a common cathode or a common anode.");
m_bDynamicContent = true;
TQStringList pins = TQStringList::split( ',', "g,f,e,d,"+TQString(TQChar(0xB7))+",c,b,a" );
createProperty( "0-color", Variant::Type::Color );
property("0-color")->setCaption( i18n("Color") );
property("0-color")->setColorScheme( ColorCombo::LED );
createProperty( "diode-polarity", Variant::Type::Select );
property("diode-polarity")->setCaption( i18n("Configuration") );
property("diode-polarity")->setAllowed( TQStringList::split(',',"Common Cathode,Common Anode") );
property("diode-polarity")->setValue("Common Cathode");
for ( int i=0; i<8; i++ )
{
m_diodes[i] = 0L;
m_nodes[i] = 0L;
avg_brightness[i] = 0.;
last_brightness[i] = 255;
}
m_nNode = 0L;
lastUpdatePeriod = 0.;
initDIPSymbol( pins, 64 );
initDIP(pins);
m_nNode = createPin( width()/2+offsetX(), height()+8+offsetY(), 270, "-v" );
for ( int i=0; i<7; i++ )
m_nodes[i] = ecNodeWithID( TQChar('a'+i) );
m_nodes[7] = ecNodeWithID(TQChar(0xB7));
m_bCommonCathode = false; // Force update
}
ECSevenSegment::~ECSevenSegment()
{
}
void ECSevenSegment::dataChanged()
{
TQColor color = dataColor("0-color");
r = color.red();
g = color.green();
b = color.blue();
r /= 0x100;
g /= 0x100;
b /= 0x100;
bool commonCathode = dataString("diode-polarity") == "Common Cathode";
if ( commonCathode != m_bCommonCathode )
{
m_bCommonCathode = commonCathode;
for ( int i=0; i<7; i++ )
{
removeElement( m_diodes[i], false );
if (commonCathode)
m_diodes[i] = createDiode( m_nodes[i], m_nNode );
else
m_diodes[i] = createDiode( m_nNode, m_nodes[i] );
}
removeElement( m_diodes[7], false );
if (commonCathode)
m_diodes[7] = createDiode( m_nodes[7], m_nNode );
else
m_diodes[7] = createDiode( m_nNode, m_nodes[7] );
}
update();
}
void ECSevenSegment::stepNonLogic()
{
double interval = 1./LINEAR_UPDATE_RATE;
for ( int i=0; i<8; i++ ) {
avg_brightness[i] += ECLed::brightness( m_diodes[i]->current() )*interval;
}
lastUpdatePeriod += interval;
}
void ECSevenSegment::drawShape( TQPainter &p )
{
CNItem::drawShape(p);
initPainter(p);
const int _width = 20;
const int _height = 32;
const int x1 = (int)x()+offsetX() + (width()-_width)/2 - 1;
const int x2 = x1 + _width;
const int y1 = (int)y()+offsetY() + (height()-_height)/2;
const int y2 = y1 + _height/2;
const int y3 = y1 + _height;
const int ds = 2; // "Slope"
// TQPen pen;
// pen.setWidth(2);
// pen.setCapStyle(TQt::RoundCap);
// p.setPen(pen);
if ( lastUpdatePeriod != 0. )
{
for ( uint i=0; i<8; ++i )
{
last_brightness[i] = (uint)(avg_brightness[i]/lastUpdatePeriod);
}
}
double _b;
// Top
_b = last_brightness[0];
p.setPen( TQPen( TQColor( uint(255-(255-_b)*(1-r)), uint(255-(255-_b)*(1-g)), uint(255-(255-_b)*(1-b)) ), 2 ) );
p.drawLine( x1+3+ds, y1+0, x2-3+ds, y1+0 );
// Top right
_b = last_brightness[1];
p.setPen( TQPen( TQColor( uint(255-(255-_b)*(1-r)), uint(255-(255-_b)*(1-g)), uint(255-(255-_b)*(1-b)) ), 2 ) );
p.drawLine( x2+0+ds, y1+3, x2+0, y2-3 );
// Bottom right
_b = last_brightness[2];
p.setPen( TQPen( TQColor( uint(255-(255-_b)*(1-r)), uint(255-(255-_b)*(1-g)), uint(255-(255-_b)*(1-b)) ), 2 ) );
p.drawLine( x2+0, y2+3, x2+0-ds, y3-3 );
// Bottom
_b = last_brightness[3];
p.setPen( TQPen( TQColor( uint(255-(255-_b)*(1-r)), uint(255-(255-_b)*(1-g)), uint(255-(255-_b)*(1-b)) ), 2 ) );
p.drawLine( x2-3-ds, y3+0, x1+3-ds, y3+0 );
// Bottom left
_b = last_brightness[4];
p.setPen( TQPen( TQColor( uint(255-(255-_b)*(1-r)), uint(255-(255-_b)*(1-g)), uint(255-(255-_b)*(1-b)) ), 2 ) );
p.drawLine( x1+0-ds, y3-3, x1+0, y2+3 );
// Top left
_b = last_brightness[5];
p.setPen( TQPen( TQColor( uint(255-(255-_b)*(1-r)), uint(255-(255-_b)*(1-g)), uint(255-(255-_b)*(1-b)) ), 2 ) );
p.drawLine( x1+0, y2-3, x1+0+ds, y1+3 );
// Middle
_b = last_brightness[6];
p.setPen( TQPen( TQColor( uint(255-(255-_b)*(1-r)), uint(255-(255-_b)*(1-g)), uint(255-(255-_b)*(1-b)) ), 2 ) );
p.drawLine( x1+3, y2+0, x2-3, y2+0 );
// Decimal point
_b = last_brightness[7];
p.setBrush( TQBrush( TQColor( uint(255-(255-_b)*(1-r)), uint(255-(255-_b)*(1-g)), uint(255-(255-_b)*(1-b)) ) ) );
p.setPen( TQt::NoPen );
p.drawPie( x2+3, y3-2, 3, 3, 0, 16*360 );
lastUpdatePeriod = 0.;
for ( uint i=0; i<8; ++i ) {
avg_brightness[i] = 0.;
}
deinitPainter(p);
}