diff --git a/xsync.cpp b/xsync.cpp index 48fbb47..be3c7e8 100644 --- a/xsync.cpp +++ b/xsync.cpp @@ -304,6 +304,35 @@ list OutputSigLevelTypeStrSet() { } // namespace timecode_output_module +namespace camera_sync_packet_generator_module { +static map Str2TriggerSigTypeMap = { + {"off", koff}, // + {"internal_genlock_sig", kinternal_genlock_sig}, + {"ext_genlock_sig", kext_genlock_sig}, +}; +string TriggerSigType2Str(TriggerSigType_t type) { + for (auto &item : Str2TriggerSigTypeMap) { + if (item.second == type) return item.first; + } + return "unkown"; +} +TriggerSigType_t Str2TriggerSigType(string type) { + auto it = Str2TriggerSigTypeMap.find(type); + if (it != Str2TriggerSigTypeMap.end()) { + return it->second; + } + return koff; +} +list TriggerSigTypeStrSet() { + list ret; + for (auto &item : Str2TriggerSigTypeMap) { + ret.push_back(item.first); + } + return ret; +} + +} // namespace camera_sync_packet_generator_module + } // namespace xsync static XsyncTimecode_t timecode64ToXsyncTimeCode(Timecode64_t tc64) { @@ -1003,3 +1032,39 @@ xs_error_code_t Xsync::TimecodeOutputModule_getHeadphoneOutputLevel(timecode_out level = (timecode_output_module::OutputSigLevelType_t)readbak; return kxs_ec_success; } + +xs_error_code_t Xsync::CameraSyncPacketGeneratorModule_setTriggerSig(camera_sync_packet_generator_module::TriggerSigType_t sig) { + uint32_t readbak = 0; + DO_XSYNC(reg_write(reg::kcamera_sync_out_camera_sync_select, sig, readbak, 10)); + return kxs_ec_success; +} +xs_error_code_t Xsync::CameraSyncPacketGeneratorModule_getTriggerSig(camera_sync_packet_generator_module::TriggerSigType_t &sig) { + uint32_t readbak = 0; + DO_XSYNC(reg_read(reg::kcamera_sync_out_camera_sync_select, readbak, 10)); + sig = (camera_sync_packet_generator_module::TriggerSigType_t)readbak; + return kxs_ec_success; +} + +xs_error_code_t Xsync::CameraSyncPacketGeneratorModule_setReportPeriod(uint32_t packetNum) { + uint32_t readbak = 0; + if (packetNum == 0) packetNum = 1; + DO_XSYNC(reg_write(reg::kstm32_camera_sync_signal_count_report_period, packetNum, readbak, 10)); + return kxs_ec_success; +} +xs_error_code_t Xsync::CameraSyncPacketGeneratorModule_getReportPeriod(uint32_t &packetNum) { + uint32_t readbak = 0; + DO_XSYNC(reg_read(reg::kstm32_camera_sync_signal_count_report_period, readbak, 10)); + packetNum = readbak; + return kxs_ec_success; +} +xs_error_code_t Xsync::CameraSyncPacketGeneratorModule_getPacketIndex(uint32_t &index) { + uint32_t readbak = 0; + DO_XSYNC(reg_read(reg::kstm32_camera_sync_signal_count, readbak, 10)); + index = readbak; + return kxs_ec_success; +} +xs_error_code_t Xsync::CameraSyncPacketGeneratorModule_clearPacketIndex() { + uint32_t readbak = 0; + DO_XSYNC(reg_write(reg::kstm32_camera_sync_signal_count, 0, readbak, 10)); + return kxs_ec_success; +} \ No newline at end of file diff --git a/xsync.hpp b/xsync.hpp index 53d8d68..9cd092c 100644 --- a/xsync.hpp +++ b/xsync.hpp @@ -162,6 +162,19 @@ list OutputSigLevelTypeStrSet(); } // namespace timecode_output_module +namespace camera_sync_packet_generator_module { +typedef enum { + koff = 0, // 关闭输出 + kinternal_genlock_sig = 1, // 外部genlock信号 + kext_genlock_sig = 2, // 内部genlock信号 +} TriggerSigType_t; + +string TriggerSigType2Str(TriggerSigType_t type); +TriggerSigType_t Str2TriggerSigType(string type); +list TriggerSigTypeStrSet(); + +} // namespace camera_sync_packet_generator_module + class Xsync { public: private: @@ -369,6 +382,43 @@ class Xsync { public: /******************************************************************************* + * 相机同步信号上报控制模块 * + *******************************************************************************/ + + /** + * @brief 选择相机同步信号上报的信号源 + * + * @param sig + * @return xs_error_code_t + */ + xs_error_code_t CameraSyncPacketGeneratorModule_setTriggerSig(camera_sync_packet_generator_module::TriggerSigType_t sig); + xs_error_code_t CameraSyncPacketGeneratorModule_getTriggerSig(camera_sync_packet_generator_module::TriggerSigType_t &sig); + + /** + * @brief 设置相机同步信号上报的报告周期 + * + * @param packetNum 例如:30 表示每30个包上报一次 + * @return xs_error_code_t + */ + xs_error_code_t CameraSyncPacketGeneratorModule_setReportPeriod(uint32_t packetNum); + xs_error_code_t CameraSyncPacketGeneratorModule_getReportPeriod(uint32_t &packetNum); + + /** + * @brief 获取当前相机同步信号上报的包序号 + * + * @param index + * @return xs_error_code_t + */ + xs_error_code_t CameraSyncPacketGeneratorModule_getPacketIndex(uint32_t &index); + /** + * @brief 清除当前相机同步信号上报的包序号 + * + * @return xs_error_code_t + */ + xs_error_code_t CameraSyncPacketGeneratorModule_clearPacketIndex(); + + public: + /******************************************************************************* * TTL输出模块控制 * *******************************************************************************/ /** diff --git a/xsync_regs.hpp b/xsync_regs.hpp index 76075d2..9b254a1 100644 --- a/xsync_regs.hpp +++ b/xsync_regs.hpp @@ -13,8 +13,9 @@ namespace xsync { namespace reg { using namespace std; -#define REG_ADD_OFF_STM32 (0x0000) -#define REG_ADD_OFF_FPGA_TEST (0x00020) +#define REG_ADD_OFF_STM32 (0x0000) +#define REG_ADD_OFF_STM32_CONFIG_START_ADD (0x0010) +#define REG_ADD_OFF_FPGA_TEST (0x00020) // 控制中心寄存器地址 #define REG_ADD_OFF_SIG_GENERATOR (0x00030) // 输入组件 @@ -25,13 +26,13 @@ using namespace std; #define REG_ADD_OFF_TIMECODE_IN (0x0140) #define REG_ADD_OFF_GENLOCK_IN (0x0150) // 输出组件 -#define REG_ADD_OFF_TTLOUT1 (0x0200) -#define REG_ADD_OFF_TTLOUT2 (0x0210) -#define REG_ADD_OFF_TTLOUT3 (0x0220) -#define REG_ADD_OFF_TTLOUT4 (0x0230) -#define REG_ADD_OFF_TIMECODE_OUT (0x0240) -#define REG_ADD_OFF_GENLOCK_OUT (0x0250) -#define REG_ADD_OFF_STM32_IF (0x0260) +#define REG_ADD_OFF_TTLOUT1 (0x0200) +#define REG_ADD_OFF_TTLOUT2 (0x0210) +#define REG_ADD_OFF_TTLOUT3 (0x0220) +#define REG_ADD_OFF_TTLOUT4 (0x0230) +#define REG_ADD_OFF_TIMECODE_OUT (0x0240) +#define REG_ADD_OFF_GENLOCK_OUT (0x0250) +#define REG_ADD_OFF_CAMERA_SYNC_OUT (0x0260) // 调试组件 #define REG_ADD_OFF_DEBUGER (0x0300) typedef enum { @@ -53,15 +54,16 @@ typedef enum { * @brief * REG 16(32) STM32配置寄存器0 */ - kstm32_obtaining_ip_mode = REG_ADD_OFF_STM32 + 0, - kstm32_ip = REG_ADD_OFF_STM32 + 1, - kstm32_gw = REG_ADD_OFF_STM32 + 2, - kstm32_netmask = REG_ADD_OFF_STM32 + 3, - kstm32_camera_sync_signal_count = REG_ADD_OFF_STM32 + 4, // 写任意数值之后清零 - kstm32_config0 = REG_ADD_OFF_STM32 + 5, // bit0: timecode report enable, bit1: camera sync report enable + kstm32_obtaining_ip_mode = REG_ADD_OFF_STM32_CONFIG_START_ADD + 0, + kstm32_ip = REG_ADD_OFF_STM32_CONFIG_START_ADD + 1, + kstm32_gw = REG_ADD_OFF_STM32_CONFIG_START_ADD + 2, + kstm32_netmask = REG_ADD_OFF_STM32_CONFIG_START_ADD + 3, + kstm32_config0 = REG_ADD_OFF_STM32_CONFIG_START_ADD + 4, // bit0: timecode report enable, bit1: camera sync report enable + kstm32_camera_sync_signal_count = REG_ADD_OFF_STM32_CONFIG_START_ADD + 5, // 写任意数值之后清零 + kstm32_camera_sync_signal_count_report_period = REG_ADD_OFF_STM32_CONFIG_START_ADD + 6, // 上报周期,单位为帧数 - kstm32_action0 = REG_ADD_OFF_STM32 + 14, // action reg - kstm32_action_val0 = REG_ADD_OFF_STM32 + 15, // action val reg + kstm32_action0 = REG_ADD_OFF_STM32_CONFIG_START_ADD + 14, // action reg + kstm32_action_val0 = REG_ADD_OFF_STM32_CONFIG_START_ADD + 15, // action val reg /** * @brief @@ -128,12 +130,6 @@ typedef enum { * @brief 时码输出控制模块 * REG_ADD_OFF_TIMECODE_OUT */ - // reg [31:0] r0_timecode_select; - // reg [31:0] r1_timecode0; - // reg [31:0] r2_timecode1; - // reg [31:0] r3_timecode_format; - // reg [31:0] r4_bnc_outut_level_select; - // reg [31:0] r5_headphone_outut_level_select; ktimecode_out_timecode_select = REG_ADD_OFF_TIMECODE_OUT + 0, ktimecode_out_timecode0 = REG_ADD_OFF_TIMECODE_OUT + 1, @@ -142,6 +138,7 @@ typedef enum { ktimecode_out_bnc_outut_level_select = REG_ADD_OFF_TIMECODE_OUT + 4, ktimecode_out_headphone_outut_level_select = REG_ADD_OFF_TIMECODE_OUT + 5, + kcamera_sync_out_camera_sync_select = REG_ADD_OFF_CAMERA_SYNC_OUT + 0, } RegAdd_t;