|
|
#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
|