diff --git a/xsync.cpp b/xsync.cpp index acc5d6c..48fbb47 100644 --- a/xsync.cpp +++ b/xsync.cpp @@ -249,6 +249,61 @@ XsyncTimecode_t Str2XsyncTimecode(string timecode) { return ret; } +namespace timecode_output_module { +static map Str2TriggerSigTypeMap = { + {"off", koff}, // + {"ext_timecode_sig", kext_timecode_sig}, + {"internal_timecode_sig", kinternal_timecode_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; +} + +static map Str2OutputSigLevelTypeMap = { + {"line", kline}, // + {"mic", kmic}, +}; +string OutputSigLevelType2Str(OutputSigLevelType_t type) { + for (auto &item : Str2OutputSigLevelTypeMap) { + if (item.second == type) return item.first; + } + return "unkown"; +} +OutputSigLevelType_t Str2OutputSigLevelType(string type) { + auto it = Str2OutputSigLevelTypeMap.find(type); + if (it != Str2OutputSigLevelTypeMap.end()) { + return it->second; + } + return kline; +} +list OutputSigLevelTypeStrSet() { + list ret; + for (auto &item : Str2OutputSigLevelTypeMap) { + ret.push_back(item.first); + } + return ret; +} + +} // namespace timecode_output_module + } // namespace xsync static XsyncTimecode_t timecode64ToXsyncTimeCode(Timecode64_t tc64) { @@ -888,3 +943,63 @@ xs_error_code_t Xsync::SigGenerator_getTimecodeFormat(TimecodeFormat_t &format) format = (TimecodeFormat_t)readbak; return ecode; } +xs_error_code_t Xsync::TimecodeOutputModule_setTimecodeSrcSelect(timecode_output_module::TriggerSigType_t timecode_select) { + uint32_t readbak = 0; + DO_XSYNC(reg_write(reg::ktimecode_out_timecode_select, timecode_select, readbak, 10)); + return kxs_ec_success; +} +xs_error_code_t Xsync::TimecodeOutputModule_getTimecodeSrcSelect(timecode_output_module::TriggerSigType_t &timecode_select) { + uint32_t readbak = 0; + DO_XSYNC(reg_read(reg::ktimecode_out_timecode_select, readbak, 10)); + timecode_select = (timecode_output_module::TriggerSigType_t)readbak; + return kxs_ec_success; +} +xs_error_code_t Xsync::TimecodeOutputModule_getTimecodeNow(XsyncTimecode_t &timecode_now) { + uint32_t readbak = 0; + xs_error_code_t ecode = kxs_ec_success; + + uint32_t tc0 = 0; + uint32_t tc1 = 0; + + ecode = reg_read(reg::ktimecode_out_timecode0, tc0, 10); + if (ecode != kxs_ec_success) return ecode; + ecode = reg_read(reg::ktimecode_out_timecode1, tc1, 10); + if (ecode != kxs_ec_success) return ecode; + + Timecode64_t tc64; + tc64.tc0 = tc0; + tc64.tc1 = tc1; + + timecode_now = timecode64ToXsyncTimeCode(tc64); + return ecode; +} +xs_error_code_t Xsync::TimecodeOutputModule_getTimecodeFormat(TimecodeFormat_t &timecode_format) { + uint32_t readbak = 0; + xs_error_code_t ecode = kxs_ec_success; + ecode = reg_read(reg::ktimecode_out_timecode_format, readbak, 10); + if (ecode != kxs_ec_success) return ecode; + timecode_format = (TimecodeFormat_t)readbak; + return ecode; +} +xs_error_code_t Xsync::TimecodeOutputModule_setBncOutputLevel(timecode_output_module::OutputSigLevelType_t &level) { + uint32_t readbak = 0; + DO_XSYNC(reg_write(reg::ktimecode_out_bnc_outut_level_select, level, readbak, 10)); + return kxs_ec_success; +} +xs_error_code_t Xsync::TimecodeOutputModule_getBncOutputLevel(timecode_output_module::OutputSigLevelType_t &level) { + uint32_t readbak = 0; + DO_XSYNC(reg_read(reg::ktimecode_out_bnc_outut_level_select, readbak, 10)); + level = (timecode_output_module::OutputSigLevelType_t)readbak; + return kxs_ec_success; +} +xs_error_code_t Xsync::TimecodeOutputModule_setHeadphoneOutputLevel(timecode_output_module::OutputSigLevelType_t &level) { + uint32_t readbak = 0; + DO_XSYNC(reg_write(reg::ktimecode_out_headphone_outut_level_select, level, readbak, 10)); + return kxs_ec_success; +} +xs_error_code_t Xsync::TimecodeOutputModule_getHeadphoneOutputLevel(timecode_output_module::OutputSigLevelType_t &level) { + uint32_t readbak = 0; + DO_XSYNC(reg_read(reg::ktimecode_out_headphone_outut_level_select, readbak, 10)); + level = (timecode_output_module::OutputSigLevelType_t)readbak; + return kxs_ec_success; +} diff --git a/xsync.hpp b/xsync.hpp index 03d676f..53d8d68 100644 --- a/xsync.hpp +++ b/xsync.hpp @@ -134,12 +134,34 @@ typedef enum { kControlMode_externalTTL4Trigger, // 5.外部TTL输入4_高电平触发,低电平停止 } ControlMode_t; -string ControlMode2Str(ControlMode_t mode); +string ControlMode2Str(ControlMode_t mode); ControlMode_t Str2ControlMode(string mode); -list ControlModeStrSet(); +list ControlModeStrSet(); } // namespace sig_generator_module +namespace timecode_output_module { +typedef enum { + koff = 0, // 关闭输出 + kinternal_timecode_sig = 1, // 外部timecode信号 + kext_timecode_sig = 2, // 内部timecode信号 +} TriggerSigType_t; + +typedef enum { + kline, + kmic, +} OutputSigLevelType_t; + +string TriggerSigType2Str(TriggerSigType_t type); +TriggerSigType_t Str2TriggerSigType(string type); +list TriggerSigTypeStrSet(); + +string OutputSigLevelType2Str(OutputSigLevelType_t type); +OutputSigLevelType_t Str2OutputSigLevelType(string type); +list OutputSigLevelTypeStrSet(); + +} // namespace timecode_output_module + class Xsync { public: private: @@ -298,6 +320,53 @@ class Xsync { */ xs_error_code_t SigGenerator_setTimecodeFormat(TimecodeFormat_t format); // 不建议使用这个方法,用Basic_setTimecodeFormat xs_error_code_t SigGenerator_getTimecodeFormat(TimecodeFormat_t &format); // 不建议使用这个方法,用Basic_getTimecodeFormat + + public: + /******************************************************************************* + * 时码输出控制模块 * + *******************************************************************************/ + + /** + * @brief 时码输出源选择 + * + * @param timecode_select + * @return xs_error_code_t + */ + xs_error_code_t TimecodeOutputModule_setTimecodeSrcSelect(timecode_output_module::TriggerSigType_t timecode_select); + xs_error_code_t TimecodeOutputModule_getTimecodeSrcSelect(timecode_output_module::TriggerSigType_t &timecode_select); + + /** + * @brief 时码输出模块的时码 + * + * @param timecode_now + * @return xs_error_code_t + */ + xs_error_code_t TimecodeOutputModule_getTimecodeNow(XsyncTimecode_t &timecode_now); + /** + * @brief 获取时码输出模块的时码格式 + * + * @param timecode_format + * @return xs_error_code_t + */ + xs_error_code_t TimecodeOutputModule_getTimecodeFormat(TimecodeFormat_t &timecode_format); + + /** + * @brief 设置时码输出模块的BNC输出电平 + * + * @param level + * @return xs_error_code_t + */ + xs_error_code_t TimecodeOutputModule_setBncOutputLevel(timecode_output_module::OutputSigLevelType_t &level); + xs_error_code_t TimecodeOutputModule_getBncOutputLevel(timecode_output_module::OutputSigLevelType_t &level); + /** + * @brief 设置时码输出模块的耳机输出电平 + * + * @param level + * @return xs_error_code_t + */ + xs_error_code_t TimecodeOutputModule_setHeadphoneOutputLevel(timecode_output_module::OutputSigLevelType_t &level); + xs_error_code_t TimecodeOutputModule_getHeadphoneOutputLevel(timecode_output_module::OutputSigLevelType_t &level); + public: /******************************************************************************* * TTL输出模块控制 * @@ -308,7 +377,6 @@ class Xsync { * 2. 配置输出信号选择器 * 3. 配置触发模式下触发信号脉冲宽度 * 4. 配置触发模式下触发信号脉冲延时 - * */ /** diff --git a/xsync_regs.hpp b/xsync_regs.hpp index 9f15a6e..76075d2 100644 --- a/xsync_regs.hpp +++ b/xsync_regs.hpp @@ -83,6 +83,20 @@ typedef enum { kfpga_test_regd = REG_ADD_OFF_FPGA_TEST + 13, kfpga_test_rege = REG_ADD_OFF_FPGA_TEST + 14, kfpga_test_regf = REG_ADD_OFF_FPGA_TEST + 15, + + /** + * @brief 信号发生器模块 + */ + kSigGenerator_ctl = REG_ADD_OFF_SIG_GENERATOR + 0, // 控制模式选择寄存器 + kSigGenerator_genlock_format = REG_ADD_OFF_SIG_GENERATOR + 2, // genlock格式寄存器 + kSigGenerator_timecode_format = REG_ADD_OFF_SIG_GENERATOR + 3, // timecode格式寄存器 + kSigGenerator_control_trigger_reg = REG_ADD_OFF_SIG_GENERATOR + 4, // StartSigCtrl[0] + kSigGenerator_timecode0 = REG_ADD_OFF_SIG_GENERATOR + 6, // timecode0 + kSigGenerator_timecode1 = REG_ADD_OFF_SIG_GENERATOR + 7, // timecode1 + kSigGenerator_timecode_start0 = REG_ADD_OFF_SIG_GENERATOR + 8, // 时码启动寄存器0 + kSigGenerator_timecode_start1 = REG_ADD_OFF_SIG_GENERATOR + 9, // 时码启动寄存器1 + kSigGenerator_work_state = REG_ADD_OFF_SIG_GENERATOR + 12, // 工作状态 read only + /** * @brief TTL输出模块 */ @@ -111,17 +125,23 @@ typedef enum { kttlout4_pulse_mode_delay = REG_ADD_OFF_TTLOUT4 + 4, /** - * @brief 信号发生器模块 + * @brief 时码输出控制模块 + * REG_ADD_OFF_TIMECODE_OUT */ - kSigGenerator_ctl = REG_ADD_OFF_SIG_GENERATOR + 0, // 控制模式选择寄存器 - kSigGenerator_genlock_format = REG_ADD_OFF_SIG_GENERATOR + 2, // genlock格式寄存器 - kSigGenerator_timecode_format = REG_ADD_OFF_SIG_GENERATOR + 3, // timecode格式寄存器 - kSigGenerator_control_trigger_reg = REG_ADD_OFF_SIG_GENERATOR + 4, // StartSigCtrl[0] - kSigGenerator_timecode0 = REG_ADD_OFF_SIG_GENERATOR + 6, // timecode0 - kSigGenerator_timecode1 = REG_ADD_OFF_SIG_GENERATOR + 7, // timecode1 - kSigGenerator_timecode_start0 = REG_ADD_OFF_SIG_GENERATOR + 8, // 时码启动寄存器0 - kSigGenerator_timecode_start1 = REG_ADD_OFF_SIG_GENERATOR + 9, // 时码启动寄存器1 - kSigGenerator_work_state = REG_ADD_OFF_SIG_GENERATOR + 12, // 工作状态 read only + // 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, + ktimecode_out_timecode1 = REG_ADD_OFF_TIMECODE_OUT + 2, + ktimecode_out_timecode_format = REG_ADD_OFF_TIMECODE_OUT + 3, + ktimecode_out_bnc_outut_level_select = REG_ADD_OFF_TIMECODE_OUT + 4, + ktimecode_out_headphone_outut_level_select = REG_ADD_OFF_TIMECODE_OUT + 5, + } RegAdd_t;