From b821d5a4a5c43eee223df3a75845f22cefd46441 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Tue, 9 Jan 2024 16:35:28 +0800 Subject: [PATCH] update --- iflytop_xsync_protocol | 2 +- xsync.cpp | 270 +++++++++++++++++++++++++++++++++++++++++++++++-- xsync.hpp | 123 ++++++++++++++++++++-- 3 files changed, 376 insertions(+), 19 deletions(-) diff --git a/iflytop_xsync_protocol b/iflytop_xsync_protocol index 7bbbf85..1e0da1c 160000 --- a/iflytop_xsync_protocol +++ b/iflytop_xsync_protocol @@ -1 +1 @@ -Subproject commit 7bbbf8548250d459a83f77737c7897ad167e4103 +Subproject commit 1e0da1cfa1dfded2375469bb9c93db77d84bacf8 diff --git a/xsync.cpp b/xsync.cpp index 9e5cd20..ab49b67 100644 --- a/xsync.cpp +++ b/xsync.cpp @@ -37,6 +37,126 @@ static uint32_t ipToUint32(const std::string &ipAddress, bool &suc) { return result_n; } +namespace iflytop { +namespace xsync_internal_signal { + +// level0 = 0, // 0 +// level1 = 1, // 1 + +// ttlin1_module_raw_sig = 2, // ttl1输入模块原始信号 +// ttlin1_module_sig_divide = 3, // ttl1输入模块分频信号 +// ttlin2_module_raw_sig = 4, // ttl2输入模块原始信号 +// ttlin2_module_sig_divide = 5, // ttl2输入模块分频信号 +// ttlin3_module_raw_sig = 6, // ttl3输入模块原始信号 +// ttlin3_module_sig_divide = 7, // ttl3输入模块分频信号 +// ttlin4_module_raw_sig = 8, // ttl4输入模块原始信号 +// ttlin4_module_sig_divide = 9, // ttl4输入模块分频信号 + +// genlockin_module_freq_sig = 10, // genlock输入模块频率信号 +// timecodein_module_trigger_sig = 11, // timecode输入模块触发信号 + +// internal_camera_sync_sig = 12, // 内部相机同步信号 +// internal_timecode_trigger_sig = 13, // 内部timecode触发信号 +// internal_genlock_freq_sig = 14, // 内部genlock频率信号 +// internal_work_state_sig = 15 // 内部工作状态信号 + +std::string signal_type_to_str(signal_type_t type) { + switch (type) { + case level0: + return "level0"; + case level1: + return "level1"; + case ttlin1_module_raw_sig: + return "ttlin1_module_raw_sig"; + case ttlin1_module_sig_divide: + return "ttlin1_module_sig_divide"; + case ttlin2_module_raw_sig: + return "ttlin2_module_raw_sig"; + case ttlin2_module_sig_divide: + return "ttlin2_module_sig_divide"; + case ttlin3_module_raw_sig: + return "ttlin3_module_raw_sig"; + case ttlin3_module_sig_divide: + return "ttlin3_module_sig_divide"; + case ttlin4_module_raw_sig: + return "ttlin4_module_raw_sig"; + case ttlin4_module_sig_divide: + return "ttlin4_module_sig_divide"; + case genlockin_module_freq_sig: + return "genlockin_module_freq_sig"; + case timecodein_module_trigger_sig: + return "timecodein_module_trigger_sig"; + case internal_camera_sync_sig: + return "internal_camera_sync_sig"; + case internal_timecode_trigger_sig: + return "internal_timecode_trigger_sig"; + case internal_genlock_freq_sig: + return "internal_genlock_freq_sig"; + case internal_work_state_sig: + return "internal_work_state_sig"; + default: + return "unknow"; + } + return "unknow"; +} +signal_type_t str_to_signal_type(std::string type) { + if (type == "level0") return level0; + if (type == "level1") return level1; + if (type == "ttlin1_module_raw_sig") return ttlin1_module_raw_sig; + if (type == "ttlin1_module_sig_divide") return ttlin1_module_sig_divide; + if (type == "ttlin2_module_raw_sig") return ttlin2_module_raw_sig; + if (type == "ttlin2_module_sig_divide") return ttlin2_module_sig_divide; + if (type == "ttlin3_module_raw_sig") return ttlin3_module_raw_sig; + if (type == "ttlin3_module_sig_divide") return ttlin3_module_sig_divide; + if (type == "ttlin4_module_raw_sig") return ttlin4_module_raw_sig; + if (type == "ttlin4_module_sig_divide") return ttlin4_module_sig_divide; + if (type == "genlockin_module_freq_sig") return genlockin_module_freq_sig; + if (type == "timecodein_module_trigger_sig") return timecodein_module_trigger_sig; + if (type == "internal_camera_sync_sig") return internal_camera_sync_sig; + if (type == "internal_timecode_trigger_sig") return internal_timecode_trigger_sig; + if (type == "internal_genlock_freq_sig") return internal_genlock_freq_sig; + if (type == "internal_work_state_sig") return internal_work_state_sig; + return level0; +} +} // namespace xsync_internal_signal +} // namespace iflytop + +namespace iflytop { +namespace xsync_ttlout_module { + +string output_signal_type_to_str(output_signal_type_t type) { + switch (type) { + case level0: + return "level0"; + case level1: + return "level1"; + case test_signal: + return "test_signal"; + case input_signal: + return "input_signal"; + case input_signal_mirror: + return "input_signal_mirror"; + case trigger_mode_signal: + return "trigger_mode_signal"; + case trigger_mode_signal_mirror: + return "trigger_mode_signal_mirror"; + default: + return "unknow"; + } + return "unknow"; +} +output_signal_type_t str_to_output_signal_type(string type) { + if (type == "level0") return level0; + if (type == "level1") return level1; + if (type == "test_signal") return test_signal; + if (type == "input_signal") return input_signal; + if (type == "input_signal_mirror") return input_signal_mirror; + if (type == "trigger_mode_signal") return trigger_mode_signal; + if (type == "trigger_mode_signal_mirror") return trigger_mode_signal_mirror; + return level0; +} +} // namespace xsync_ttlout_module +} // namespace iflytop Xsync::Xsync(/* args */) {} @@ -120,8 +240,8 @@ xs_error_code_t Xsync::disConnect() { } xsync_net_state_t Xsync::getNetState() { return m_net_state; } -void Xsync::regOnTimecodeMsg(xsync_on_timecode_msg_t on_timecode_msg_cb) { m_on_timecode_msg_cb = on_timecode_msg_cb; } -void Xsync::regOnCameraSyncMsg(xsync_on_camera_sync_msg_t on_camera_sync_msg_cb) { m_on_camera_sync_msg_cb = on_camera_sync_msg_cb; } +void Xsync::Basic_registerOnTimecodeMsgCallback(xsync_on_timecode_msg_t on_timecode_msg_cb) { m_on_timecode_msg_cb = on_timecode_msg_cb; } +void Xsync::Basic_registerOnCameraSyncMsgCallback(xsync_on_camera_sync_msg_t on_camera_sync_msg_cb) { m_on_camera_sync_msg_cb = on_camera_sync_msg_cb; } 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 lock(lock_); @@ -299,13 +419,13 @@ void Xsync::parseCameraSyncMsgAndReport(XsyncNetAdd &from, uint8_t *data, size_t // xsync_stm32_action_generator_new_mac, // // xsync_stm32_action_factory_reset, // -// xsync_stm32_action_reboot, // +// xsync_stm32_action_Basic_reboot, // // xsync_stm32_action_storage_cfg, -xs_error_code_t Xsync::generatorNewMac() { return doaction(xsync_stm32_action_generator_new_mac, 0, nullptr, 2000); } -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::Basic_generatorNewMac() { return doaction(xsync_stm32_action_generator_new_mac, 0, nullptr, 2000); } +xs_error_code_t Xsync::Basic_factoryReset() { return doaction(xsync_stm32_action_factory_reset, 0, nullptr, 1000); } +xs_error_code_t Xsync::Basic_reboot() { return doaction(xsync_stm32_action_Basic_reboot, 0, nullptr); } xs_error_code_t Xsync::storageConfig() { return doaction(xsync_stm32_action_storage_cfg, 0, nullptr, 1000); } -xs_error_code_t Xsync::changeNetworkConfig(string ip, string mask, string gateway) { +xs_error_code_t Xsync::Basic_changeNetworkConfig(string ip, string mask, string gateway) { uint32_t ip32 = 0; uint32_t mask32 = 0; uint32_t gateway32 = 0; @@ -334,7 +454,7 @@ xs_error_code_t Xsync::changeNetworkConfig(string ip, string mask, string gatewa return kxs_ec_success; } -xs_error_code_t Xsync::clearXsyncCameraSyncIndexCount() { +xs_error_code_t Xsync::Basic_clearXsyncCameraSyncIndexCount() { uint32_t readbak = 0; return reg_write(kxsync_reg_stm32_camera_sync_signal_count, 0, readbak); } @@ -351,3 +471,137 @@ xs_error_code_t Xsync::doaction(uint32_t action, uint32_t actionval, uint32_t *a if (ackreturn) *ackreturn = readbak; return ecode; } + +/******************************************************************************* + * TTLOutputModule * + *******************************************************************************/ +// .reg0(reg_input_signal_select), +// .reg1(reg_output_signal_select), +// .reg2(reg_config), +// .reg3(reg_pulse_mode_valid_len), +// .reg4(reg_pulse_mode_trigger_delay) + +xs_error_code_t Xsync::TTLOutputModule_getRegOff(int32_t index, uint32_t ®add) { + switch (index) { + case 1: + regadd = REG_ADD_OFF_TTLOUT1; + break; + case 2: + regadd = REG_ADD_OFF_TTLOUT2; + break; + case 3: + regadd = REG_ADD_OFF_TTLOUT3; + break; + case 4: + regadd = REG_ADD_OFF_TTLOUT4; + break; + default: + return kxs_ec_param_error; + } + return kxs_ec_success; +} + +xs_error_code_t Xsync::TTLOutputModule_setInputSigType(int32_t index, xsync_internal_signal::signal_type_t source) { + uint32_t regadd = REG_ADD_OFF_TTLOUT1; + xs_error_code_t ecode = kxs_ec_success; + uint32_t readbak = 0; + + ecode = TTLOutputModule_getRegOff(index, regadd); + if (ecode != kxs_ec_success) return ecode; + + return reg_write(regadd + 0, source, readbak, 10); +} + +xs_error_code_t Xsync::TTLOutputModule_getInputSigType(int32_t index, xsync_internal_signal::signal_type_t &source) { + uint32_t regadd = REG_ADD_OFF_TTLOUT1; + xs_error_code_t ecode = kxs_ec_success; + uint32_t readbak = 0; + + ecode = TTLOutputModule_getRegOff(index, regadd); + if (ecode != kxs_ec_success) return ecode; + + ecode = reg_read(regadd + 0, readbak, 10); + if (ecode != kxs_ec_success) return ecode; + + source = (xsync_internal_signal::signal_type_t)readbak; + return ecode; +} + +xs_error_code_t Xsync::TTLOutputModule_setOutputSigType(int32_t index, xsync_ttlout_module::output_signal_type_t output_type) { + uint32_t regadd = REG_ADD_OFF_TTLOUT1; + xs_error_code_t ecode = kxs_ec_success; + uint32_t readbak = 0; + + ecode = TTLOutputModule_getRegOff(index, regadd); + if (ecode != kxs_ec_success) return ecode; + + return reg_write(regadd + 1, output_type, readbak, 10); +} +xs_error_code_t Xsync::TTLOutputModule_getOutputSigType(int32_t index, xsync_ttlout_module::output_signal_type_t &output_type) { + uint32_t regadd = REG_ADD_OFF_TTLOUT1; + xs_error_code_t ecode = kxs_ec_success; + uint32_t readbak = 0; + + ecode = TTLOutputModule_getRegOff(index, regadd); + if (ecode != kxs_ec_success) return ecode; + + ecode = reg_read(regadd + 1, readbak, 10); + if (ecode != kxs_ec_success) return ecode; + + output_type = (xsync_ttlout_module::output_signal_type_t)readbak; + return ecode; +} + +xs_error_code_t Xsync::TTLOutputModule_setTriggerModePulseWidth(int32_t index, uint32_t pulse_width_ms) { + uint32_t regadd = REG_ADD_OFF_TTLOUT1; + xs_error_code_t ecode = kxs_ec_success; + uint32_t readbak = 0; + + ecode = TTLOutputModule_getRegOff(index, regadd); + if (ecode != kxs_ec_success) return ecode; + + uint32_t pluse_width = pulse_width_ms * 1000; // 1MHZ计数 + + return reg_write(regadd + 3, pluse_width, readbak, 10); +} +xs_error_code_t Xsync::TTLOutputModule_getTriggerModePulseWidth(int32_t index, uint32_t &pulse_width_ms) { + uint32_t regadd = REG_ADD_OFF_TTLOUT1; + xs_error_code_t ecode = kxs_ec_success; + uint32_t readbak = 0; + + ecode = TTLOutputModule_getRegOff(index, regadd); + if (ecode != kxs_ec_success) return ecode; + + ecode = reg_read(regadd + 3, readbak, 10); + if (ecode != kxs_ec_success) return ecode; + + pulse_width_ms = readbak / 1000; + return ecode; +} + +xs_error_code_t Xsync::TTLOutputModule_setTriggerModePulseDelay(int32_t index, uint32_t pulse_delay_ms) { + uint32_t regadd = REG_ADD_OFF_TTLOUT1; + xs_error_code_t ecode = kxs_ec_success; + uint32_t readbak = 0; + + ecode = TTLOutputModule_getRegOff(index, regadd); + if (ecode != kxs_ec_success) return ecode; + + uint32_t pulse_delay = pulse_delay_ms * 1000; // 1MHZ计数 + + return reg_write(regadd + 4, pulse_delay, readbak, 10); +} +xs_error_code_t Xsync::TTLOutputModule_getTriggerModePulseDelay(int32_t index, uint32_t &pulse_delay_ms) { + uint32_t regadd = REG_ADD_OFF_TTLOUT1; + xs_error_code_t ecode = kxs_ec_success; + uint32_t readbak = 0; + + ecode = TTLOutputModule_getRegOff(index, regadd); + if (ecode != kxs_ec_success) return ecode; + + ecode = reg_read(regadd + 4, readbak, 10); + if (ecode != kxs_ec_success) return ecode; + + pulse_delay_ms = readbak / 1000; + return ecode; +} diff --git a/xsync.hpp b/xsync.hpp index 5621e3f..adf7cd6 100644 --- a/xsync.hpp +++ b/xsync.hpp @@ -24,6 +24,57 @@ typedef enum { kxsync_net_state_connected, } xsync_net_state_t; +/******************************************************************************* + * XSYNC内部信号 * + *******************************************************************************/ +namespace xsync_internal_signal { +typedef enum { + level0 = 0, // 0 + level1 = 1, // 1 + + ttlin1_module_raw_sig = 2, // ttl1输入模块原始信号 + ttlin1_module_sig_divide = 3, // ttl1输入模块分频信号 + ttlin2_module_raw_sig = 4, // ttl2输入模块原始信号 + ttlin2_module_sig_divide = 5, // ttl2输入模块分频信号 + ttlin3_module_raw_sig = 6, // ttl3输入模块原始信号 + ttlin3_module_sig_divide = 7, // ttl3输入模块分频信号 + ttlin4_module_raw_sig = 8, // ttl4输入模块原始信号 + ttlin4_module_sig_divide = 9, // ttl4输入模块分频信号 + + genlockin_module_freq_sig = 10, // genlock输入模块频率信号 + timecodein_module_trigger_sig = 11, // timecode输入模块触发信号 + + internal_camera_sync_sig = 12, // 内部相机同步信号 + internal_timecode_trigger_sig = 13, // 内部timecode触发信号 + internal_genlock_freq_sig = 14, // 内部genlock频率信号 + internal_work_state_sig = 15 // 内部工作状态信号 +} signal_type_t; + +string signal_type_to_str(signal_type_t type); +signal_type_t str_to_signal_type(string type); + +} // namespace xsync_internal_signal + +/******************************************************************************* + * TTL输出模块相关枚举 * + *******************************************************************************/ +namespace xsync_ttlout_module { + +typedef enum { + level0 = 0, // 0 + level1 = 1, // 1 + test_signal = 2, // 测试信号,信号为ID*1000HZ方波信号 + input_signal = 3, // 输入信号 + input_signal_mirror = 4, // 翻转后的输入信号 + trigger_mode_signal = 5, // 触发模式下的触发信号 + trigger_mode_signal_mirror = 6, // 触发模式下的触发信号翻转 +} output_signal_type_t; + +string output_signal_type_to_str(output_signal_type_t type); +output_signal_type_t str_to_output_signal_type(string type); + +} // namespace xsync_ttlout_module + typedef struct { uint8_t hour; uint8_t minute; @@ -81,8 +132,8 @@ class Xsync { /******************************************************************************* * 上报消息监听 * *******************************************************************************/ - void regOnTimecodeMsg(xsync_on_timecode_msg_t on_timecode_msg_cb); - void regOnCameraSyncMsg(xsync_on_camera_sync_msg_t on_camera_sync_msg_cb); + void Basic_registerOnTimecodeMsgCallback(xsync_on_timecode_msg_t on_timecode_msg_cb); + void Basic_registerOnCameraSyncMsgCallback(xsync_on_camera_sync_msg_t on_camera_sync_msg_cb); /******************************************************************************* * 寄存器直接读写操作 * @@ -94,23 +145,75 @@ class Xsync { /******************************************************************************* * 设备基础操作 * *******************************************************************************/ - xs_error_code_t generatorNewMac(); - xs_error_code_t factoryReset(); - xs_error_code_t reboot(); - xs_error_code_t changeNetworkConfig(string ip, string mask, string gateway); + xs_error_code_t Basic_generatorNewMac(); + xs_error_code_t Basic_factoryReset(); + xs_error_code_t Basic_reboot(); + xs_error_code_t Basic_changeNetworkConfig(string ip, string mask, string gateway); + + xs_error_code_t Basic_clearXsyncCameraSyncIndexCount(); + + /******************************************************************************* + * TTL输出模块控制 * + *******************************************************************************/ + /** + * + * 1. 配置输入信号选择器 + * 2. 配置输出信号选择器 + * 3. 配置触发模式下触发信号脉冲宽度 + * 4. 配置触发模式下触发信号脉冲延时 + * + */ - xs_error_code_t clearXsyncCameraSyncIndexCount(); + /** + * @brief 设置TTL输出模块的输入信号 + * + * @param index + * @param source + * @return xs_error_code_t + */ + xs_error_code_t TTLOutputModule_setInputSigType(int32_t index, xsync_internal_signal::signal_type_t source); + xs_error_code_t TTLOutputModule_getInputSigType(int32_t index, xsync_internal_signal::signal_type_t &source); + + /** + * @brief 设置TTL输出模块的输出信号 + * + * @param index + * @param output_type + * @return xs_error_code_t + */ + xs_error_code_t TTLOutputModule_setOutputSigType(int32_t index, xsync_ttlout_module::output_signal_type_t output_type); + xs_error_code_t TTLOutputModule_getOutputSigType(int32_t index, xsync_ttlout_module::output_signal_type_t &output_type); + /** + * @brief 配置触发模式下触发信号脉冲宽度 + * + * @param index + * @param pulse_width_ms + * @return xs_error_code_t + */ + xs_error_code_t TTLOutputModule_setTriggerModePulseWidth(int32_t index, uint32_t pulse_width_ms); + xs_error_code_t TTLOutputModule_getTriggerModePulseWidth(int32_t index, uint32_t &pulse_width_ms); + /** + * @brief 配置触发模式下触发信号脉冲延时 + * + * @param index + * @param pulse_delay_ms + * @return xs_error_code_t + */ + xs_error_code_t TTLOutputModule_setTriggerModePulseDelay(int32_t index, uint32_t pulse_delay_ms); + xs_error_code_t TTLOutputModule_getTriggerModePulseDelay(int32_t index, uint32_t &pulse_delay_ms); /** * @brief */ private: xs_error_code_t doaction(uint32_t action, uint32_t actionval, uint32_t *ackreturn, int32_t overtime_ms = 100); - void parseTimecodeMsgAndReport(XsyncNetAdd &from, uint8_t *data, size_t length); - void parseCameraSyncMsgAndReport(XsyncNetAdd &from, uint8_t *data, size_t length); + xs_error_code_t storageConfig(); xs_error_code_t xsync_send_cmd_block(iflytop_xsync_packet_header_t *cmd, iflytop_xsync_packet_header_t *rx_data, int32_t buffersize, int32_t overtime_ms); - xs_error_code_t storageConfig(); + void parseTimecodeMsgAndReport(XsyncNetAdd &from, uint8_t *data, size_t length); + void parseCameraSyncMsgAndReport(XsyncNetAdd &from, uint8_t *data, size_t length); + + xs_error_code_t TTLOutputModule_getRegOff(int32_t index, uint32_t ®add); }; } // namespace iflytop