|
|
@ -4,6 +4,7 @@ |
|
|
|
|
|
|
|
#include <map>
|
|
|
|
|
|
|
|
#include "../src/logger.hpp"
|
|
|
|
#include "xsync_errcode.hpp"
|
|
|
|
#include "xsync_regs.hpp"
|
|
|
|
#include "xsync_utils.hpp"
|
|
|
@ -46,11 +47,12 @@ using namespace std; |
|
|
|
return kxs_ec_success; \ |
|
|
|
} |
|
|
|
|
|
|
|
I_XSUDPFactory *g_xsync_udp_factory = nullptr; |
|
|
|
|
|
|
|
class Xsync : public IXsync { |
|
|
|
private: |
|
|
|
/* data */ |
|
|
|
|
|
|
|
I_XSUDPFactory *m_xsync_udp_factory = nullptr; |
|
|
|
shared_ptr<I_XSUDP> m_xsync_reg_udp = nullptr; |
|
|
|
shared_ptr<I_XSUDP> m_xsync_timecode_udp_listener = nullptr; |
|
|
|
shared_ptr<I_XSUDP> m_xsync_camera_sync_udp_listener = nullptr; |
|
|
@ -61,33 +63,150 @@ class Xsync : public IXsync { |
|
|
|
xsync_on_camera_sync_msg_t m_on_camera_sync_msg_cb = nullptr; |
|
|
|
xsync_on_timecode_msg_t m_on_timecode_msg_cb = nullptr; |
|
|
|
xsync_on_record_sig_change_msg_t m_on_record_sig_change_msg_cb = nullptr; |
|
|
|
xsync_on_connect_state_change_t m_on_connect_state_change_cb = nullptr; |
|
|
|
|
|
|
|
int txpacket_index = 0; |
|
|
|
uint8_t m_xync_cmd_rxdata_cache[2560]; |
|
|
|
std::recursive_mutex lock_; |
|
|
|
std::recursive_mutex connectStatelock_; |
|
|
|
|
|
|
|
// <thread>
|
|
|
|
unique_ptr<thread> device_state_monitor_thread; |
|
|
|
bool destoryflag = false; |
|
|
|
int64_t m_last_receive_packet_tp = 0; |
|
|
|
|
|
|
|
private: |
|
|
|
void _setNetworkState(bool connected, string ip) { |
|
|
|
lock_guard<recursive_mutex> lock(connectStatelock_); |
|
|
|
m_is_connected = connected; |
|
|
|
m_xsync_ip = ip; |
|
|
|
if (m_on_connect_state_change_cb) m_on_connect_state_change_cb(m_xsync_ip, m_is_connected); |
|
|
|
} |
|
|
|
|
|
|
|
string _getXsyncIp() { |
|
|
|
lock_guard<recursive_mutex> lock(connectStatelock_); |
|
|
|
return m_xsync_ip; |
|
|
|
} |
|
|
|
|
|
|
|
bool _getConnectState() { |
|
|
|
lock_guard<recursive_mutex> lock(connectStatelock_); |
|
|
|
return m_is_connected; |
|
|
|
} |
|
|
|
|
|
|
|
public: |
|
|
|
static Xsync &Ins(); |
|
|
|
|
|
|
|
Xsync(/* args */); |
|
|
|
virtual ~Xsync() {} |
|
|
|
|
|
|
|
void initialize(I_XSUDPFactory *xsync_udp_factory); |
|
|
|
Xsync(/* args */) {} |
|
|
|
virtual ~Xsync() { |
|
|
|
destoryflag = true; |
|
|
|
if (device_state_monitor_thread) device_state_monitor_thread->join(); |
|
|
|
|
|
|
|
if (m_xsync_timecode_udp_listener) m_xsync_timecode_udp_listener->stopReceive(); |
|
|
|
if (m_xsync_camera_sync_udp_listener) m_xsync_camera_sync_udp_listener->stopReceive(); |
|
|
|
if (m_xsync_reg_udp) m_xsync_reg_udp->stopReceive(); |
|
|
|
} |
|
|
|
|
|
|
|
virtual xs_error_code_t initialize(xsync_config_t *config) override { |
|
|
|
lock_guard<recursive_mutex> lock(lock_); |
|
|
|
xs_error_code_t ecode = kxs_ec_success; |
|
|
|
shared_ptr<I_XSUDP> xsync_reg_udp; |
|
|
|
shared_ptr<I_XSUDP> xsync_timecode_udp_listener; |
|
|
|
shared_ptr<I_XSUDP> xsync_camera_sync_udp_listener; |
|
|
|
|
|
|
|
// 寄存器读写UDP
|
|
|
|
xsync_reg_udp = g_xsync_udp_factory->createXSUDP(); |
|
|
|
ecode = xsync_reg_udp->initialize("0.0.0.0", IFLYTOP_XSYNC_SERVICE_PC_PORT); |
|
|
|
if (ecode != kxs_ec_success) goto err; |
|
|
|
|
|
|
|
// TIMECODE上报消息接收UDP
|
|
|
|
xsync_timecode_udp_listener = g_xsync_udp_factory->createXSUDP(); |
|
|
|
ecode = xsync_timecode_udp_listener->initialize("0.0.0.0", IFLYTOP_XSYNC_TIMECODE_REPORT_PC_PORT); |
|
|
|
if (ecode != kxs_ec_success) goto err; |
|
|
|
ecode = xsync_timecode_udp_listener->startReceive([this](XsyncNetAdd &from, uint8_t *data, size_t length) { |
|
|
|
iflytop_xsync_event_report_packet_t *packet = (iflytop_xsync_event_report_packet_t *)data; |
|
|
|
|
|
|
|
if (!_getConnectState()) { |
|
|
|
m_last_receive_packet_tp = Xsync_GetTicket(); |
|
|
|
_setNetworkState(true, from.ip); |
|
|
|
} |
|
|
|
|
|
|
|
if (_getConnectState() && _getXsyncIp() != from.ip) { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
m_last_receive_packet_tp = Xsync_GetTicket(); |
|
|
|
|
|
|
|
if (packet->eventid == ktimecode_report_event) { |
|
|
|
Timecode64_t tc64; |
|
|
|
tc64.tc0 = packet->data[0]; |
|
|
|
tc64.tc1 = packet->data[1]; |
|
|
|
XsyncTimecode_t timecode = timecode64ToXsyncTimeCode(tc64); |
|
|
|
if (m_on_timecode_msg_cb) m_on_timecode_msg_cb(&timecode); |
|
|
|
} else if (packet->eventid == kxsync_work_state_report_event) { |
|
|
|
// 信号发生器状态改变
|
|
|
|
Timecode64_t tc64; |
|
|
|
tc64.tc0 = packet->data[1]; |
|
|
|
tc64.tc1 = packet->data[2]; |
|
|
|
XsyncTimecode_t timecode = timecode64ToXsyncTimeCode(tc64); |
|
|
|
|
|
|
|
if (m_on_record_sig_change_msg_cb) m_on_record_sig_change_msg_cb(packet->data[0], &timecode); |
|
|
|
} |
|
|
|
}); |
|
|
|
if (ecode != kxs_ec_success) goto err; |
|
|
|
|
|
|
|
#if 1
|
|
|
|
// 相机同步包
|
|
|
|
xsync_camera_sync_udp_listener = g_xsync_udp_factory->createXSUDP(); |
|
|
|
ecode = xsync_camera_sync_udp_listener->initialize("0.0.0.0", IFLYTOP_XSYNC_CAMERA_SYNC_PACKET_PC_PORT); |
|
|
|
if (ecode != kxs_ec_success) goto err; |
|
|
|
ecode = xsync_camera_sync_udp_listener->startReceive([this](XsyncNetAdd &from, uint8_t *data, size_t length) { parseCameraSyncMsgAndReport(from, data, length); }); |
|
|
|
if (ecode != kxs_ec_success) goto err; |
|
|
|
#endif
|
|
|
|
|
|
|
|
m_xsync_timecode_udp_listener = xsync_timecode_udp_listener; |
|
|
|
m_xsync_camera_sync_udp_listener = xsync_camera_sync_udp_listener; |
|
|
|
m_xsync_reg_udp = xsync_reg_udp; |
|
|
|
|
|
|
|
// 设备枚举线程
|
|
|
|
device_state_monitor_thread.reset(new thread([this]() { |
|
|
|
while (!destoryflag) { |
|
|
|
int32_t has_not_receive_packet_time_s = (Xsync_GetTicket() - m_last_receive_packet_tp) / 1000 / 1000 / 1000; |
|
|
|
// ZLOGI(TAG, "%lld ", has_not_receive_packet_time_s);
|
|
|
|
if (m_is_connected && (has_not_receive_packet_time_s) > 5) { |
|
|
|
_setNetworkState(false, ""); |
|
|
|
} |
|
|
|
this_thread::sleep_for(chrono::seconds(1)); |
|
|
|
} |
|
|
|
return; |
|
|
|
})); |
|
|
|
|
|
|
|
return kxs_ec_success; |
|
|
|
err: |
|
|
|
if (xsync_timecode_udp_listener) xsync_timecode_udp_listener->stopReceive(); |
|
|
|
if (xsync_camera_sync_udp_listener) xsync_camera_sync_udp_listener->stopReceive(); |
|
|
|
return ecode; |
|
|
|
} |
|
|
|
|
|
|
|
xs_error_code_t connect(string xsync_ip); |
|
|
|
xs_error_code_t disConnect(); |
|
|
|
virtual bool ping() override { |
|
|
|
uint32_t readbak; |
|
|
|
xs_error_code_t ecode = reg_read(reg::kproduct_type_id, readbak, 10); |
|
|
|
if (ecode != kxs_ec_success) { |
|
|
|
return false; |
|
|
|
} |
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
virtual xs_error_code_t changeXsyncIp(string xsync_ip) override; |
|
|
|
virtual bool ping() override; |
|
|
|
virtual bool getConnectState() override { return _getConnectState(); } |
|
|
|
virtual string getDeviceIp() override { return _getXsyncIp(); } |
|
|
|
|
|
|
|
virtual void registerOnTimecodeMsgCallback(xsync_on_timecode_msg_t cb) override; |
|
|
|
virtual void registerOnCameraSyncMsgCallback(xsync_on_camera_sync_msg_t cb) override; |
|
|
|
virtual void registerOnRecordSigChangeMsgCallback(xsync_on_record_sig_change_msg_t cb) override; |
|
|
|
virtual void registerOnTimecodeMsgCallback(xsync_on_timecode_msg_t cb) override { m_on_timecode_msg_cb = cb; } |
|
|
|
virtual void registerOnCameraSyncMsgCallback(xsync_on_camera_sync_msg_t cb) override { m_on_camera_sync_msg_cb = cb; } |
|
|
|
virtual void registerOnRecordSigChangeMsgCallback(xsync_on_record_sig_change_msg_t cb) override { m_on_record_sig_change_msg_cb = cb; } |
|
|
|
virtual void registerOnConnectStateChangeCallback(xsync_on_connect_state_change_t cb) override { m_on_connect_state_change_cb = cb; }; |
|
|
|
|
|
|
|
virtual xs_error_code_t generatorNewMac() override; |
|
|
|
virtual xs_error_code_t factoryReset() override; |
|
|
|
virtual xs_error_code_t reboot() override; |
|
|
|
virtual xs_error_code_t changeNetworkConfig(string ip, string mask, string gateway) override; |
|
|
|
virtual xs_error_code_t readSn(string &sn) override; |
|
|
|
virtual xs_error_code_t readMac(string &mac) override; |
|
|
|
|
|
|
@ -229,101 +348,11 @@ class Xsync : public IXsync { |
|
|
|
/*******************************************************************************
|
|
|
|
* Xsync * |
|
|
|
*******************************************************************************/ |
|
|
|
Xsync::Xsync(/* args */) {} |
|
|
|
|
|
|
|
Xsync &Xsync::Ins() { |
|
|
|
static Xsync xsync; |
|
|
|
return xsync; |
|
|
|
} |
|
|
|
void Xsync::initialize(I_XSUDPFactory *xsync_udp_factory) { m_xsync_udp_factory = xsync_udp_factory; } |
|
|
|
|
|
|
|
xs_error_code_t Xsync::changeXsyncIp(string xsync_ip) { |
|
|
|
disConnect(); |
|
|
|
return connect(xsync_ip); |
|
|
|
} |
|
|
|
bool Xsync::ping() { |
|
|
|
uint32_t readbak; |
|
|
|
xs_error_code_t ecode = reg_read(reg::kproduct_type_id, readbak, 10); |
|
|
|
if (ecode != kxs_ec_success) { |
|
|
|
return false; |
|
|
|
} |
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
xs_error_code_t Xsync::connect(string xsync_ip) { |
|
|
|
lock_guard<recursive_mutex> lock(lock_); |
|
|
|
|
|
|
|
m_xsync_ip = xsync_ip; |
|
|
|
disConnect(); |
|
|
|
/**
|
|
|
|
* @brief 创建 m_xsync_reg_udp |
|
|
|
*/ |
|
|
|
|
|
|
|
xs_error_code_t ecode = kxs_ec_success; |
|
|
|
|
|
|
|
auto xsync_reg_udp = m_xsync_udp_factory->createXSUDP(); |
|
|
|
ecode = xsync_reg_udp->initialize("0.0.0.0", IFLYTOP_XSYNC_SERVICE_PC_PORT); |
|
|
|
if (ecode != kxs_ec_success) { |
|
|
|
return ecode; |
|
|
|
} |
|
|
|
/**
|
|
|
|
* @brief 创建 m_xsync_timecode_udp_listener |
|
|
|
*/ |
|
|
|
auto xsync_timecode_udp_listener = m_xsync_udp_factory->createXSUDP(); |
|
|
|
|
|
|
|
ecode = xsync_timecode_udp_listener->initialize("0.0.0.0", IFLYTOP_XSYNC_TIMECODE_REPORT_PC_PORT); |
|
|
|
if (ecode != kxs_ec_success) { |
|
|
|
return ecode; |
|
|
|
} |
|
|
|
ecode = xsync_timecode_udp_listener->startReceive([this](XsyncNetAdd &from, uint8_t *data, size_t length) { parseTimecodeMsgAndReport(from, data, length); }); |
|
|
|
if (ecode != kxs_ec_success) { |
|
|
|
return ecode; |
|
|
|
} |
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief 创建 m_xsync_camera_sync_udp_listener |
|
|
|
*/ |
|
|
|
auto xsync_camera_sync_udp_listener = m_xsync_udp_factory->createXSUDP(); |
|
|
|
|
|
|
|
ecode = xsync_camera_sync_udp_listener->initialize("0.0.0.0", IFLYTOP_XSYNC_CAMERA_SYNC_PACKET_PC_PORT); |
|
|
|
if (ecode != kxs_ec_success) { |
|
|
|
return ecode; |
|
|
|
} |
|
|
|
ecode = xsync_camera_sync_udp_listener->startReceive([this](XsyncNetAdd &from, uint8_t *data, size_t length) { parseCameraSyncMsgAndReport(from, data, length); }); |
|
|
|
if (ecode != kxs_ec_success) { |
|
|
|
return ecode; |
|
|
|
} |
|
|
|
|
|
|
|
m_xsync_reg_udp = xsync_reg_udp; |
|
|
|
m_xsync_timecode_udp_listener = xsync_timecode_udp_listener; |
|
|
|
m_xsync_camera_sync_udp_listener = xsync_camera_sync_udp_listener; |
|
|
|
|
|
|
|
return ecode; |
|
|
|
} |
|
|
|
xs_error_code_t Xsync::disConnect() { |
|
|
|
lock_guard<recursive_mutex> lock(lock_); |
|
|
|
|
|
|
|
if (m_xsync_reg_udp != nullptr) { |
|
|
|
m_xsync_reg_udp->stopReceive(); |
|
|
|
m_xsync_reg_udp = nullptr; |
|
|
|
} |
|
|
|
|
|
|
|
if (m_xsync_timecode_udp_listener != nullptr) { |
|
|
|
m_xsync_timecode_udp_listener->stopReceive(); |
|
|
|
m_xsync_timecode_udp_listener = nullptr; |
|
|
|
} |
|
|
|
|
|
|
|
if (m_xsync_camera_sync_udp_listener != nullptr) { |
|
|
|
m_xsync_camera_sync_udp_listener->stopReceive(); |
|
|
|
m_xsync_camera_sync_udp_listener = nullptr; |
|
|
|
} |
|
|
|
|
|
|
|
return kxs_ec_success; |
|
|
|
} |
|
|
|
|
|
|
|
void Xsync::registerOnTimecodeMsgCallback(xsync_on_timecode_msg_t cb) { m_on_timecode_msg_cb = cb; } |
|
|
|
void Xsync::registerOnCameraSyncMsgCallback(xsync_on_camera_sync_msg_t cb) { m_on_camera_sync_msg_cb = cb; } |
|
|
|
void Xsync::registerOnRecordSigChangeMsgCallback(xsync_on_record_sig_change_msg_t cb) { m_on_record_sig_change_msg_cb = cb; } |
|
|
|
|
|
|
|
xs_error_code_t Xsync::readSn(string &sn) { |
|
|
|
sn = "X1001000000000"; |
|
|
@ -346,12 +375,16 @@ xs_error_code_t Xsync::readMac(string &mac) { |
|
|
|
|
|
|
|
xs_error_code_t Xsync::xsync_send_cmd_block(iflytop_xsync_packet_header_t *cmd, iflytop_xsync_packet_header_t *rx_data, int32_t buffersize, int32_t overtime_ms) { |
|
|
|
lock_guard<recursive_mutex> lock(lock_); |
|
|
|
if (!m_xsync_reg_udp) return kxs_ec_lose_connect; |
|
|
|
|
|
|
|
string xsyncip = _getXsyncIp(); |
|
|
|
m_xsync_reg_udp->clearRxBuffer(); |
|
|
|
|
|
|
|
if (!m_xsync_reg_udp) return kxs_ec_device_offline; |
|
|
|
if (xsyncip.empty()) return kxs_ec_device_offline; |
|
|
|
|
|
|
|
cmd->index = txpacket_index++; |
|
|
|
|
|
|
|
XsyncNetAdd toadd = {m_xsync_ip, IFLYTOP_XSYNC_SERVICE_XSYNC_PORT}; |
|
|
|
XsyncNetAdd toadd = {xsyncip, IFLYTOP_XSYNC_SERVICE_XSYNC_PORT}; |
|
|
|
xs_error_code_t ecode = //
|
|
|
|
m_xsync_reg_udp->sendto(toadd, (const char *)cmd, sizeof(iflytop_xsync_packet_header_t) + cmd->ndata * 4, nullptr); |
|
|
|
if (ecode != kxs_ec_success) { |
|
|
@ -525,24 +558,7 @@ xs_error_code_t Xsync::readfreq(uint32_t reg, float &freqfloat) { |
|
|
|
return kxs_ec_success; |
|
|
|
} |
|
|
|
|
|
|
|
void Xsync::parseTimecodeMsgAndReport(XsyncNetAdd &from, uint8_t *data, size_t length) { |
|
|
|
iflytop_xsync_event_report_packet_t *packet = (iflytop_xsync_event_report_packet_t *)data; |
|
|
|
if (packet->eventid == ktimecode_report_event) { |
|
|
|
Timecode64_t tc64; |
|
|
|
tc64.tc0 = packet->data[0]; |
|
|
|
tc64.tc1 = packet->data[1]; |
|
|
|
XsyncTimecode_t timecode = timecode64ToXsyncTimeCode(tc64); |
|
|
|
if (m_on_timecode_msg_cb) m_on_timecode_msg_cb(&timecode); |
|
|
|
} else if (packet->eventid == kxsync_work_state_report_event) { |
|
|
|
// 信号发生器状态改变
|
|
|
|
Timecode64_t tc64; |
|
|
|
tc64.tc0 = packet->data[1]; |
|
|
|
tc64.tc1 = packet->data[2]; |
|
|
|
XsyncTimecode_t timecode = timecode64ToXsyncTimeCode(tc64); |
|
|
|
|
|
|
|
if (m_on_record_sig_change_msg_cb) m_on_record_sig_change_msg_cb(packet->data[0], &timecode); |
|
|
|
} |
|
|
|
} |
|
|
|
void Xsync::parseTimecodeMsgAndReport(XsyncNetAdd &from, uint8_t *data, size_t length) {} |
|
|
|
void Xsync::parseCameraSyncMsgAndReport(XsyncNetAdd &from, uint8_t *data, size_t length) { |
|
|
|
uint32_t count = 0; |
|
|
|
|
|
|
@ -563,6 +579,7 @@ xs_error_code_t Xsync::generatorNewMac() { return doaction(xsync_stm32_action_ge |
|
|
|
xs_error_code_t Xsync::factoryReset() { return doaction(xsync_stm32_action_factory_reset, 0, nullptr, 1000); } |
|
|
|
xs_error_code_t Xsync::reboot() { return doaction(xsync_stm32_action_reboot, 0, nullptr); } |
|
|
|
xs_error_code_t Xsync::storageConfig() { return doaction(xsync_stm32_action_storage_cfg, 0, nullptr, 1000); } |
|
|
|
#if 0
|
|
|
|
xs_error_code_t Xsync::changeNetworkConfig(string ip, string mask, string gateway) { |
|
|
|
uint32_t ip32 = 0; |
|
|
|
uint32_t mask32 = 0; |
|
|
@ -591,6 +608,7 @@ xs_error_code_t Xsync::changeNetworkConfig(string ip, string mask, string gatewa |
|
|
|
|
|
|
|
return kxs_ec_success; |
|
|
|
} |
|
|
|
#endif
|
|
|
|
|
|
|
|
xs_error_code_t Xsync::doaction(uint32_t action, uint32_t actionval, uint32_t *ackreturn, int32_t overtime_ms) { |
|
|
|
//
|
|
|
@ -953,10 +971,6 @@ xs_error_code_t Xsync::RecordSigGenerator_readTimecodeSnapshot(XsyncTimecode_t & |
|
|
|
} |
|
|
|
|
|
|
|
namespace xsync { |
|
|
|
|
|
|
|
void XsyncInit(I_XSUDPFactory *xsync_udp_factory, string xsyncIp) { |
|
|
|
Xsync::Ins().initialize(xsync_udp_factory); |
|
|
|
Xsync::Ins().changeXsyncIp(xsyncIp); |
|
|
|
} |
|
|
|
void XsyncInit(I_XSUDPFactory *xsync_udp_factory) { g_xsync_udp_factory = xsync_udp_factory; } |
|
|
|
IXsync *XsyncIns() { return &Xsync::Ins(); } |
|
|
|
} // namespace xsync
|