16using namespace std::chrono_literals;
21 .type = ElementType::Clock,
22 .group = ElementGroup::Input,
25 .canChangeAppearance =
true,
29 .rotatesGraphic =
false,
31 static_assert(
validate(constraints));
36 meta.pixmapPath = []{
return QStringLiteral(
":/Components/Input/clock1.svg"); };
37 meta.titleText = QT_TRANSLATE_NOOP(
"Clock",
"CLOCK SIGNAL");
38 meta.translatedName = QT_TRANSLATE_NOOP(
"Clock",
"Clock");
39 meta.trContext =
"Clock";
40 meta.defaultAppearances = QStringList({
41 ":/Components/Input/clock0.svg",
42 ":/Components/Input/clock1.svg",
68 const auto elapsed = std::chrono::duration_cast<std::chrono::microseconds>(globalTime - m_startTime);
81 constexpr auto kMaxCatchUpGap = std::chrono::seconds(5);
82 if (elapsed > kMaxCatchUpGap) {
90 if (elapsed > m_interval) {
91 m_startTime += m_interval;
118 QMap<QString, QVariant> map;
124 if (!slim ||
delay() != 0.0) {
125 map.insert(
"delay",
delay());
145 float freq; stream >> freq;
157 if (map.contains(
"frequency")) {
161 if (map.contains(
"delay")) {
163 double delayValue = map.value(
"delay").toDouble(&ok);
176 if (map.contains(
"locked")) {
177 m_locked = map.value(
"locked").toBool();
189 if (!std::isfinite(freq) || qFuzzyIsNull(freq)) {
193 const std::chrono::microseconds auxInterval =
halfPeriod(freq);
196 if (auxInterval.count() <= 0) {
200 m_interval = auxInterval;
211 if (!std::isfinite(
delay)) {
217 m_delay = std::clamp(
delay, -1.0, 1.0);
228 const auto fullPeriod = 2 * m_interval;
229 const auto delayMicroseconds =
static_cast<std::chrono::microseconds::rep
>(-m_delay *
static_cast<double>(fullPeriod.count()));
230 m_startTime = globalTime;
231 m_startTime -= std::chrono::microseconds(delayMicroseconds);
236 return QString::number(
frequency()) +
" Hz";
241 return {{0, tr(
"Low")}, {1, tr(
"High")}};
Graphic element for the real-time clock input.
Singleton factory for all circuit element types.
Self-registering element trait template and compile-time constraint validation.
ElementMetadata metadataFromConstraints(const ElementConstraints &c)
Converts ElementConstraints to an ElementMetadata with all constraint-derived fields set.
constexpr bool validate(const ElementConstraints &c)
Validates element constraints at compile time.
Enums::ElementType ElementType
Deserialization/serialization context structs passed through load()/save() call chains.
Circuit and waveform file serialization/deserialization utilities.
Named version predicates for file-format compatibility checks.
Event-driven real-time clock input element.
static constexpr double kDefaultFrequency
void save(QDataStream &stream, SerializationOptions options) const override
bool isOn(const int port=0) const override
Returns true if the clock output is currently logic-high.
void load(QDataStream &stream, SerializationContext &context) override
double delay() const override
void resetClock(std::chrono::steady_clock::time_point globalTime)
Resets the clock phase reference to globalTime.
void setOn() override
Drives all output ports logic-high.
void setOff() override
Drives all output ports logic-low.
void setFrequency(const double freq) override
Sets the clock output frequency to freq Hz.
QList< std::pair< int, QString > > appearanceStates() const override
void updateClock(std::chrono::steady_clock::time_point globalTime)
Advances the clock state based on elapsed time since globalTime.
double frequency() const override
Returns the clock frequency in Hz.
QString genericProperties() override
Returns a summary string of the clock's current frequency and delay settings.
Clock(QGraphicsItem *parent=nullptr)
Constructs the element with optional parent.
static constexpr std::chrono::microseconds halfPeriod(const double freq)
void setDelay(const double delay) override
static void registerCreator(ElementType type, std::function< GraphicElement *()> creator)
Registers a creator lambda for type, used by buildElement().
virtual void load(QDataStream &stream, SerializationContext &context)
Loads the graphic element through a binary data stream.
virtual void save(QDataStream &stream, SerializationOptions options) const
static QMap< QString, QVariant > readBoundedMetadata(QDataStream &stream)
Reads the file-level metadata QMap<QString,QVariant> from stream without calling QList::reserve() wit...
bool hasLockState(const QVersionNumber &v)
V3.1: Lock state for input elements; color for some display/button types.
bool hasClock(const QVersionNumber &v)
V1.1: Clock element added.
bool hasQMapFormat(const QVersionNumber &v)
V4.1: Format changed from flat binary to keyed QMap; port serial IDs; rotation fix.
bool hasDelayFix(const QVersionNumber &v)
V4.3: Clock delay format corrected.
Compile-time-validatable subset of ElementMetadata.
static const bool registered
static ElementMetadata metadata()
static constexpr ElementConstraints constraints
Self-registering element information trait.
Bundles all per-deserialization state so that load() overrides receive it through one explicit parame...
QVersionNumber version
File-format version read from the stream header.
Options passed to GraphicElement::save() (and friends); the save-side counterpart of SerializationCon...
SerializationPurpose purpose
What this serialization is for; see SerializationPurpose. Mandatory, no default.