Qt5、KiCadとモジュールで遊ぶ電子工作の初心 -3ページ目

Qt5、KiCadとモジュールで遊ぶ電子工作の初心

このブログでは、Qt5とKiCadを用いた電子工作に焦点を当て、Linux上でのプロジェクト開発を探究します。初心者にも分かりやすい基板設計の指南や、多様なモジュールの活用法を紹介。Qt5のGUIを駆使したインタラクティブな制作過程を体験できます。

見ての通りです。

 正時、正分、正秒 でイベントしましょうという話しです。

 リナックスなので タイマーつかってみました。

 

#ifndef TIMESIGNALEMITTER_H
#define TIMESIGNALEMITTER_H

#include <QObject>
#include <thread>
#include <atomic>
#include <chrono>

class TimeSignalEmitter : public QObject {
    Q_OBJECT
public:
    TimeSignalEmitter();
    ~TimeSignalEmitter();
    void start();
    void stop();
signals:
    void signalTime(int flag);
private:
    std::thread timerThread;
    std::atomic<bool> running;
    void timerFunction();
    int calculateFlag(const std::tm& currentTime);
    bool m_FlgTimecheckEntry=false;
};

#endif // TIMESIGNALEMITTER_H

 

 


#include "timesignalemitter.h"
#include <ctime>
#include <QDebug>
TimeSignalEmitter::TimeSignalEmitter() : running(false)
{
    start();
}

TimeSignalEmitter::~TimeSignalEmitter() {
    stop();
}

void TimeSignalEmitter::start() {
    running = true;
    timerThread = std::thread(&TimeSignalEmitter::timerFunction, this);
}

void TimeSignalEmitter::stop() {
    running = false;
    if (timerThread.joinable()) {
        timerThread.join();
    }
}

void TimeSignalEmitter::timerFunction() {
    while (running) {
        auto now = std::chrono::system_clock::now();
        auto now_c = std::chrono::system_clock::to_time_t(now);
        std::tm now_tm = *std::localtime(&now_c);

        int flag = calculateFlag(now_tm);

        if (flag != 0) {
            emit signalTime(flag);
        }

        // Sleep for 1ms to reduce CPU usage
        std::this_thread::sleep_for(std::chrono::milliseconds(1));
    }
}

int TimeSignalEmitter::calculateFlag(const std::tm& currentTime) {
    int flag = 0;
    if (currentTime.tm_sec == 50) m_FlgTimecheckEntry=true;

    if (!((currentTime.tm_sec == 0) && m_FlgTimecheckEntry))return flag;
    m_FlgTimecheckEntry=false;
    // Check for each condition and set the appropriate flag
    if (currentTime.tm_sec == 0) {
        flag |= 1; // Every minute at 00 seconds
     }
    if (currentTime.tm_sec == 0 && currentTime.tm_min % 5 == 0) {
        flag |= 2; // Every 5 minutes at 00 seconds
    }
    if (currentTime.tm_sec == 0 && currentTime.tm_min % 15 == 0) {
        flag |= 4; // Every 15 minutes at 00 seconds
    }
    if (currentTime.tm_sec == 0 && currentTime.tm_min % 30 == 0) {
        flag |= 8; // Every 30 minutes at 00 seconds
    }
    qDebug()<<__PRETTY_FUNCTION__<<flag<<currentTime.tm_hour<<":"<<currentTime.tm_min<<":"<<currentTime.tm_sec;

    return flag;
}