diff --git a/xsync.cpp b/xsync.cpp index be3c7e8..dc02415 100644 --- a/xsync.cpp +++ b/xsync.cpp @@ -333,6 +333,34 @@ list TriggerSigTypeStrSet() { } // namespace camera_sync_packet_generator_module +namespace timecode_input_module { + +static map Str2TriggerSigTypeMap = { + {"off", koff}, // + {"bnc_timecode", kbnc_timecode}, + {"headphone_timecode", kheadphone_timecode}, +}; +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 timecode_input_module } // namespace xsync static XsyncTimecode_t timecode64ToXsyncTimeCode(Timecode64_t tc64) { @@ -677,6 +705,7 @@ xs_error_code_t Xsync::Basic_getGenlockFormat(GenlockFormat_t &format) { } xs_error_code_t Xsync::Basic_setTimecodeFormat(TimecodeFormat_t format) { DO_XSYNC(SigGenerator_setTimecodeFormat(format)); + DO_XSYNC(TimecodeInputModule_setTimecodeFormat(format)); return kxs_ec_success; } xs_error_code_t Xsync::Basic_getTimecodeFormat(TimecodeFormat_t &format) { @@ -1067,4 +1096,128 @@ 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; +} +xs_error_code_t Xsync::TimecodeInputModule_setSrcSelect(timecode_input_module::TriggerSigType_t timecode_select) { + uint32_t readbak = 0; + DO_XSYNC(reg_write(reg::ktimecode_in_timecode_sig_selt, timecode_select, readbak, 10)); + return kxs_ec_success; +} +xs_error_code_t Xsync::TimecodeInputModule_getSrcSelect(timecode_input_module::TriggerSigType_t timecode_select) { + uint32_t readbak = 0; + DO_XSYNC(reg_read(reg::ktimecode_in_timecode_sig_selt, readbak, 10)); + timecode_select = (timecode_input_module::TriggerSigType_t)readbak; + return kxs_ec_success; +} +xs_error_code_t Xsync::TimecodeInputModule_setTimecodeFormat(TimecodeFormat_t format) { + uint32_t readbak = 0; + DO_XSYNC(reg_write(reg::ktimecode_in_timecode_format, format, readbak, 10)); + return kxs_ec_success; +} +xs_error_code_t Xsync::TimecodeInputModule_getTimecodeFormat(TimecodeFormat_t &format) { + uint32_t readbak = 0; + DO_XSYNC(reg_read(reg::ktimecode_in_timecode_format, readbak, 10)); + format = (TimecodeFormat_t)readbak; + return kxs_ec_success; +} +xs_error_code_t Xsync::TimecodeInputModule_getTimecode(XsyncTimecode_t& timecode) { + 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_in_timecode0, tc0, 10); + if (ecode != kxs_ec_success) return ecode; + ecode = reg_read(reg::ktimecode_in_timecode1, tc1, 10); + if (ecode != kxs_ec_success) return ecode; + + Timecode64_t tc64; + tc64.tc0 = tc0; + tc64.tc1 = tc1; + + timecode = timecode64ToXsyncTimeCode(tc64); + + return ecode; +} + +xs_error_code_t Xsync::TTLInputModule_setEn(int32_t index, bool en) { + uint32_t readbak = 0; + DO_XSYNC(reg_read(reg::kttlin_en, readbak, 10)); + if (en) { + readbak |= (1 << index); + } else { + readbak &= ~(1 << index); + } + DO_XSYNC(reg_write(reg::kttlin_en, readbak, readbak, 10)); + return kxs_ec_success; +} +xs_error_code_t Xsync::TTLInputModule_getEn(int32_t index, bool &en) { + uint32_t readbak = 0; + DO_XSYNC(reg_read(reg::kttlin_en, readbak, 10)); + en = (readbak & (1 << index)) != 0; + return kxs_ec_success; +} + +xs_error_code_t Xsync::TTLInputModule_setFilterFactor(int32_t index, uint32_t factor) { + uint32_t readbak = 0; + if (index == 1) { + DO_XSYNC(reg_write(reg::kttlin1_filter_factor, factor, readbak, 10)); + } else if (index == 2) { + DO_XSYNC(reg_write(reg::kttlin2_filter_factor, factor, readbak, 10)); + } else if (index == 3) { + DO_XSYNC(reg_write(reg::kttlin3_filter_factor, factor, readbak, 10)); + } else if (index == 4) { + DO_XSYNC(reg_write(reg::kttlin4_filter_factor, factor, readbak, 10)); + } else { + return kxs_ec_param_error; + } + return kxs_ec_success; +} +xs_error_code_t Xsync::TTLInputModule_getFilterFactor(int32_t index, uint32_t &factor) { + uint32_t readbak = 0; + if (index == 1) { + DO_XSYNC(reg_read(reg::kttlin1_filter_factor, readbak, 10)); + } else if (index == 2) { + DO_XSYNC(reg_read(reg::kttlin2_filter_factor, readbak, 10)); + } else if (index == 3) { + DO_XSYNC(reg_read(reg::kttlin3_filter_factor, readbak, 10)); + } else if (index == 4) { + DO_XSYNC(reg_read(reg::kttlin4_filter_factor, readbak, 10)); + } else { + return kxs_ec_param_error; + } + factor = readbak; + return kxs_ec_success; +} + +xs_error_code_t Xsync::TTLInputModule_setDivideFactor(int32_t index, uint32_t factor) { + uint32_t readbak = 0; + if (index == 1) { + DO_XSYNC(reg_write(reg::kttlin1_devide_factor, factor, readbak, 10)); + } else if (index == 2) { + DO_XSYNC(reg_write(reg::kttlin2_devide_factor, factor, readbak, 10)); + } else if (index == 3) { + DO_XSYNC(reg_write(reg::kttlin3_devide_factor, factor, readbak, 10)); + } else if (index == 4) { + DO_XSYNC(reg_write(reg::kttlin4_devide_factor, factor, readbak, 10)); + } else { + return kxs_ec_param_error; + } + return kxs_ec_success; +} +xs_error_code_t Xsync::TTLInputModule_getDivideFactor(int32_t index, uint32_t &factor) { + uint32_t readbak = 0; + if (index == 1) { + DO_XSYNC(reg_read(reg::kttlin1_devide_factor, readbak, 10)); + } else if (index == 2) { + DO_XSYNC(reg_read(reg::kttlin2_devide_factor, readbak, 10)); + } else if (index == 3) { + DO_XSYNC(reg_read(reg::kttlin3_devide_factor, readbak, 10)); + } else if (index == 4) { + DO_XSYNC(reg_read(reg::kttlin4_devide_factor, readbak, 10)); + } else { + return kxs_ec_param_error; + } + factor = readbak; + return kxs_ec_success; } \ No newline at end of file diff --git a/xsync.hpp b/xsync.hpp index 9cd092c..4a781e2 100644 --- a/xsync.hpp +++ b/xsync.hpp @@ -139,7 +139,9 @@ ControlMode_t Str2ControlMode(string mode); list ControlModeStrSet(); } // namespace sig_generator_module - +/******************************************************************************* + * 时码输出模块 * + *******************************************************************************/ namespace timecode_output_module { typedef enum { koff = 0, // 关闭输出 @@ -161,7 +163,9 @@ OutputSigLevelType_t Str2OutputSigLevelType(string type); list OutputSigLevelTypeStrSet(); } // namespace timecode_output_module - +/******************************************************************************* + * 相机同步信号发生器模块 * + *******************************************************************************/ namespace camera_sync_packet_generator_module { typedef enum { koff = 0, // 关闭输出 @@ -175,6 +179,22 @@ list TriggerSigTypeStrSet(); } // namespace camera_sync_packet_generator_module +/******************************************************************************* + * 时码输入 * + *******************************************************************************/ +namespace timecode_input_module { +typedef enum { + koff = 0, + kbnc_timecode, + kheadphone_timecode, +} TriggerSigType_t; + +string TriggerSigType2Str(TriggerSigType_t type); +TriggerSigType_t Str2TriggerSigType(string type); +list TriggerSigTypeStrSet(); + +} // namespace timecode_input_module + class Xsync { public: private: @@ -244,6 +264,31 @@ class Xsync { xs_error_code_t Basic_getTimecodeFormat(TimecodeFormat_t &format); /******************************************************************************* + * 时码输入 * + *******************************************************************************/ + + xs_error_code_t TimecodeInputModule_setSrcSelect(timecode_input_module::TriggerSigType_t timecode_select); + xs_error_code_t TimecodeInputModule_getSrcSelect(timecode_input_module::TriggerSigType_t timecode_select); + + xs_error_code_t TimecodeInputModule_setTimecodeFormat(TimecodeFormat_t format); + xs_error_code_t TimecodeInputModule_getTimecodeFormat(TimecodeFormat_t &format); + + xs_error_code_t TimecodeInputModule_getTimecode(XsyncTimecode_t& timecode); + + /******************************************************************************* + * TTL输入模块 * + *******************************************************************************/ + + xs_error_code_t TTLInputModule_setEn(int32_t index, bool en); + xs_error_code_t TTLInputModule_getEn(int32_t index, bool &en); + + xs_error_code_t TTLInputModule_setFilterFactor(int32_t index, uint32_t factor); + xs_error_code_t TTLInputModule_getFilterFactor(int32_t index, uint32_t &factor); + + xs_error_code_t TTLInputModule_setDivideFactor(int32_t index, uint32_t factor); + xs_error_code_t TTLInputModule_getDivideFactor(int32_t index, uint32_t &factor); + + /******************************************************************************* * 信号生成器模块 * *******************************************************************************/ /** diff --git a/xsync_regs.hpp b/xsync_regs.hpp index 9b254a1..c74bbb1 100644 --- a/xsync_regs.hpp +++ b/xsync_regs.hpp @@ -20,9 +20,6 @@ using namespace std; #define REG_ADD_OFF_SIG_GENERATOR (0x00030) // 输入组件 #define REG_ADD_OFF_TTLIN1 (0x0100) -#define REG_ADD_OFF_TTLIN2 (0x0110) -#define REG_ADD_OFF_TTLIN3 (0x0120) -#define REG_ADD_OFF_TTLIN4 (0x0130) #define REG_ADD_OFF_TIMECODE_IN (0x0140) #define REG_ADD_OFF_GENLOCK_IN (0x0150) // 输出组件 @@ -140,6 +137,29 @@ typedef enum { kcamera_sync_out_camera_sync_select = REG_ADD_OFF_CAMERA_SYNC_OUT + 0, + /******************************************************************************* + * 时码输入模块 * + *******************************************************************************/ + + ktimecode_in_timecode_sig_selt = REG_ADD_OFF_TIMECODE_IN + 0, + ktimecode_in_timecode_format = REG_ADD_OFF_TIMECODE_IN + 1, + ktimecode_in_timecode0 = REG_ADD_OFF_TIMECODE_IN + 2, + ktimecode_in_timecode1 = REG_ADD_OFF_TIMECODE_IN + 3, + + /******************************************************************************* + * TTL输入模块 * + *******************************************************************************/ + + kttlin_en = REG_ADD_OFF_TTLIN1 + 0, + kttlin1_devide_factor = REG_ADD_OFF_TTLIN1 + 1, + kttlin2_devide_factor = REG_ADD_OFF_TTLIN1 + 2, + kttlin3_devide_factor = REG_ADD_OFF_TTLIN1 + 3, + kttlin4_devide_factor = REG_ADD_OFF_TTLIN1 + 4, + kttlin1_filter_factor = REG_ADD_OFF_TTLIN1 + 5, + kttlin2_filter_factor = REG_ADD_OFF_TTLIN1 + 6, + kttlin3_filter_factor = REG_ADD_OFF_TTLIN1 + 7, + kttlin4_filter_factor = REG_ADD_OFF_TTLIN1 + 8, + } RegAdd_t; } // namespace reg