Example #1
0
void
CalibratedServo::setTemperature(uint8_t temperature)
{
	static uint8_t       lastTemp = 0;
	static unsigned long detatchTime = 0;
	
	if (temperature > getMaxTemperature()) temperature = getMaxTemperature();
	if (temperature < getMinTemperature()) temperature = getMinTemperature();
	lastTemperature = temperature;
	int deltaTemp = getMaxTemperature() - getMinTemperature();
	int deltaAngle = getMaxAngle() - getMinAngle();
	if (deltaTemp == 0) return;
	int angle = ((((int)temperature - (int)getMinTemperature()) * (int)deltaAngle)
	             / (int)deltaTemp)
	            + getMinAngle();
	
	if (temperature != lastTemp) {
		detatchTime = millis() + 1500ul;
		lastTemp = temperature;
		attach(pin);
	} else if (attached() && (millis() > detatchTime)) {
		detach();
	}
	
	if (angle <= getMaxAngle() && angle >= getMinAngle())
		write(180-angle);
}
Example #2
0
void AngleRadiusWidget::setMinAngle(double angle) {
    if (minAngle_ != angle) {
        minAngle_ = angle;
        // Update angle to be within bounds
        setAngle(std::max(getAngle(), getMinAngle()));
        update();
        emit angleMinMaxChanged();
    } 
}
Example #3
0
void AngleRadiusWidget::setMinMaxAngle(double minAngle, double maxAngle) {
    if (minAngle_ != minAngle || maxAngle_ != maxAngle) {
        minAngle_ = minAngle;
        maxAngle_ = maxAngle;
        // Update radius to be within bounds
        setAngle(glm::clamp(getAngle(), getMinAngle(), getMaxAngle()));
        update();
        emit angleMinMaxChanged();
    } 
}
Example #4
0
void AngleRadiusWidget::paintEvent(QPaintEvent *) {
    const int referenceRadius = getMaxPixelSpaceRadius();
    const double pixelSpaceRadius =  referenceRadius*(getRadius()/getMaxRadius());
    const qreal angleIndicatorCircleDiameter = 6.;

    QPen angleIndicatorPen(palette().midlight(), 2, Qt::SolidLine,  Qt::SquareCap, Qt::MiterJoin);
    QPen coordinateSystemPen(palette().alternateBase(), 1, Qt::SolidLine,  Qt::SquareCap, Qt::MiterJoin);
    QPen circleBoundsPen(palette().alternateBase(), 1, Qt::DashLine,  Qt::SquareCap, Qt::MiterJoin);

    // x and y in pixel coordinates
    auto x = pixelSpaceRadius*std::cos(getAngle());
    auto y = -pixelSpaceRadius*std::sin(getAngle());

    int side = qMin(width(), height());

    QStylePainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.translate(width() / 2, height() / 2);
    painter.scale(side / (qreal)100., side / (qreal)100.);

    
    
    painter.setPen(coordinateSystemPen);
    // Draw axes and bounds circle(s)
    for (int i = 0; i < 4; ++i) {
        painter.drawLine(0, 0, referenceRadius+5, 0);
        painter.rotate(90.0);
    }
    painter.setPen(circleBoundsPen);
    // Display angle bounds by drawing a pie (pacman) if min/max is not 0/2pi 
    int innerBoundsCircleRadius = static_cast<int>(static_cast<double>(referenceRadius)*(getMinRadius()/getMaxRadius()));
    if (getMinAngle() > 0. || getMaxAngle() < 2.*M_PI) {
        // drawPie wants 16*degrees
        int pieStart = static_cast<int>( 16*glm::degrees(getMinAngle()) );
        int pieEnd = static_cast<int>( 16*(glm::degrees(getMaxAngle())-glm::degrees(getMinAngle())) );
        painter.drawPie(-referenceRadius, -referenceRadius, 2*referenceRadius, 2*referenceRadius, pieStart, pieEnd);
        if (minRadius_ > 0.) {
            painter.drawPie(-innerBoundsCircleRadius, -innerBoundsCircleRadius, 2*innerBoundsCircleRadius, 2*innerBoundsCircleRadius, pieStart, pieEnd);
        }
    } else {
        painter.drawEllipse(-referenceRadius, -referenceRadius, 2*referenceRadius, 2*referenceRadius);
        if (minRadius_ > 0.) {
            painter.drawEllipse(-innerBoundsCircleRadius, -innerBoundsCircleRadius, 2*innerBoundsCircleRadius, 2*innerBoundsCircleRadius);
        }
    }



    // Draw angle and radius 
    painter.setPen(QPen(palette().text().color()));
    QPainterPath anglePath;
    // Make sure that angle goes from 0 to 2*pi
    double sweepAngle = getAngle() < 0. ? 2.*M_PI+getAngle() : getAngle();
    // Draw angle arc and text
    anglePath.arcTo(-10., -10., 20., 20., 0., glm::degrees(sweepAngle));
    painter.drawPath(anglePath);
    std::stringstream angleStream; angleStream.precision(1); angleStream << std::fixed << glm::degrees(sweepAngle);
    int anglePosX = 5;
    int anglePosY = -10;
    QFontMetrics fm(painter.font());
    QString angleText = QString::fromStdString(angleStream.str())+ QChar(0260);
    int angleTextWidth = fm.width(angleText);
    if (anglePosX+angleTextWidth > referenceRadius) {
        anglePosX = referenceRadius+2;
        anglePosY = -2;
    }

    // 0260 is the degree symbol
    painter.drawText(anglePosX, anglePosY, angleText);
    // Draw radius text
    std::stringstream radiusStream; radiusStream.precision(2); radiusStream << getRadius();
    painter.drawText(static_cast<int>(x+angleIndicatorCircleDiameter+angleIndicatorPen.width()), 
                     static_cast<int>(y), QString::fromStdString(radiusStream.str()));
    // Rotated line and circle
    painter.setPen(angleIndicatorPen);   
    painter.drawLine(QLineF(QPointF(0., 0.), QPointF(x, y)));
 
    painter.setBrush(QBrush(palette().shadow().color(), Qt::SolidPattern));
    painter.drawEllipse(QPointF(x, y), angleIndicatorCircleDiameter, angleIndicatorCircleDiameter);
}