Browse Source

add timecode output module

xsync_v2
zhaohe 2 years ago
parent
commit
f0e204cec6
  1. 115
      xsync.cpp
  2. 74
      xsync.hpp
  3. 40
      xsync_regs.hpp

115
xsync.cpp

@ -249,6 +249,61 @@ XsyncTimecode_t Str2XsyncTimecode(string timecode) {
return ret;
}
namespace timecode_output_module {
static map<string, TriggerSigType_t> 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<string> TriggerSigTypeStrSet() {
list<string> ret;
for (auto &item : Str2TriggerSigTypeMap) {
ret.push_back(item.first);
}
return ret;
}
static map<string, OutputSigLevelType_t> 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<string> OutputSigLevelTypeStrSet() {
list<string> 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;
}

74
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<string> ControlModeStrSet();
list<string> 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<string> TriggerSigTypeStrSet();
string OutputSigLevelType2Str(OutputSigLevelType_t type);
OutputSigLevelType_t Str2OutputSigLevelType(string type);
list<string> 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.
*
*/
/**

40
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;

Loading…
Cancel
Save