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); }
void AngleRadiusWidget::setMinAngle(double angle) { if (minAngle_ != angle) { minAngle_ = angle; // Update angle to be within bounds setAngle(std::max(getAngle(), getMinAngle())); update(); emit angleMinMaxChanged(); } }
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(); } }
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); }