You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

88 lines
3.1 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#ifndef FAST_DDS_GENERATED__PUBLISHERAPP_HPP
#define FAST_DDS_GENERATED__PUBLISHERAPP_HPP
#include <condition_variable>
#include <ctime>
#include <mutex>
#include <string>
#include <fastdds/dds/domain/DomainParticipant.hpp>
#include <fastdds/dds/domain/DomainParticipantFactory.hpp>
#include <fastdds/dds/publisher/DataWriterListener.hpp>
#include <fastdds/dds/subscriber/DataReaderListener.hpp>
#include <fastdds/dds/topic/TypeSupport.hpp>
#include "MsgHandler.hpp"
class PublisherApp : public eprosima::fastdds::dds::DataWriterListener,
public eprosima::fastdds::dds::DataReaderListener
{
public:
PublisherApp(
const int& domain_id);
~PublisherApp();
//! Publisher matched method
void on_publication_matched(
eprosima::fastdds::dds::DataWriter* writer,
const eprosima::fastdds::dds::PublicationMatchedStatus& info) override;
//! Run publisher
void run(std::shared_ptr<MsgHandler> handler);
//! Trigger the end of execution
void stop();
void on_data_available(
eprosima::fastdds::dds::DataReader* reader) override;
void on_subscription_matched(
eprosima::fastdds::dds::DataReader* reader,
const eprosima::fastdds::dds::SubscriptionMatchedStatus& info) override;
//! 发布 QueueTrigger
void PublishQueueTrigger(const std::string& card_number);
private:
//! Return the current state of execution
bool is_stopped();
//! 生成 message_id相同卡号复用不同卡号累加跨日重置
std::string GenerateMessageId(const std::string& card_number);
std::shared_ptr<eprosima::fastdds::dds::DomainParticipantFactory> factory_;
eprosima::fastdds::dds::DomainParticipant* participant_;
eprosima::fastdds::dds::Publisher* publisher_;
eprosima::fastdds::dds::Topic* topic_;
eprosima::fastdds::dds::DataWriter* writer_;
eprosima::fastdds::dds::TypeSupport type_;
std::condition_variable cv_;
int32_t matched_;
std::mutex mutex_;
const uint32_t period_ms_ = 100;
uint16_t samples_sent_;
std::atomic<bool> stop_;
// ── QueueTrigger 发布者 ──
eprosima::fastdds::dds::Publisher* queue_trigger_publisher_;
eprosima::fastdds::dds::Topic* queue_trigger_topic_;
eprosima::fastdds::dds::DataWriter* queue_trigger_writer_;
eprosima::fastdds::dds::TypeSupport queue_trigger_type_;
// ── message_id 生成状态 ──
std::mutex id_mtx_;
std::string current_date_; // 当前日期 "YYYYMMDD"
uint32_t sequence_num_; // 当日序号,从 1 开始
std::string last_card_; // 上一次检测到的卡号
std::string current_message_id_;// 当前 message_id同卡复用
// ── 读卡触发逻辑:发 DDS 后等待 3 秒再恢复自动寻卡 ──
std::chrono::steady_clock::time_point wait_end_time_; // 等待结束时刻
std::string last_trigger_card_; // 上次触发时的卡号(防重)
bool wait_active_; // 是否处于"等待期",仅在 OnCardDetected 时置 true
};
#endif // FAST_DDS_GENERATED__PUBLISHERAPP_HPP