diff --git a/include/ixsync.hpp b/include/ixsync.hpp index 76cc752..dc5c3a9 100644 --- a/include/ixsync.hpp +++ b/include/ixsync.hpp @@ -93,6 +93,16 @@ class IXsync { virtual xs_error_code_t reg_read(uint32_t regadd, uint32_t ®value, int32_t overtime_ms = 100) = 0; public: + /******************************************************************************* + * 延时控制 * + *******************************************************************************/ + + virtual xs_error_code_t DelayContrl_setInputDelay(uint32_t delay_us) = 0; + virtual xs_error_code_t DelayContrl_getInputDelay(uint32_t &delay_us) = 0; + + virtual xs_error_code_t DelayContrl_setOutputDelay(uint32_t delay_us) = 0; + virtual xs_error_code_t DelayContrl_getOutputDelay(uint32_t &delay_us) = 0; + /*********************************************************************************************** * 输入组件 * ***********************************************************************************************/ @@ -212,10 +222,10 @@ class IXsync { virtual xs_error_code_t InternalGenlock_setFormat(GenlockFormat_t format) = 0; virtual xs_error_code_t InternalGenlock_getFormat(GenlockFormat_t &format) = 0; - virtual xs_error_code_t InternalGenlock_readFreq(float &freq) = 0; + virtual xs_error_code_t InternalGenlock_readFreq(float &freq) = 0; - virtual xs_error_code_t InternalClock_setFreq(float freq) = 0; - virtual xs_error_code_t InternalClock_getFreq(float &freq) = 0; + virtual xs_error_code_t InternalClock_setFreq(float freq) = 0; + virtual xs_error_code_t InternalClock_getFreq(float &freq) = 0; virtual xs_error_code_t InternalClock_readOutFreq(float &freq) = 0; /******************************************************************************* @@ -345,16 +355,16 @@ class IXsync { virtual xs_error_code_t TTLOutputModule_setFreqMultiplication(int index, uint32_t multi) = 0; virtual xs_error_code_t TTLOutputModule_getFreqMultiplication(int index, uint32_t &multi) = 0; virtual xs_error_code_t TTLOutputModule_readOutFreq(int index, float &freq) = 0; - virtual xs_error_code_t TTLOutputModule_readInFreq(int index, float &freq) = 0; - - virtual xs_error_code_t TTLOutputModule_setPolarity(int index, uint32_t polarity) = 0; - virtual xs_error_code_t TTLOutputModule_getPolarity(int index, uint32_t &polarity) = 0; - virtual xs_error_code_t TTLOutputModule_setTriggerEdge(int index, TriggerEdge_t edge) = 0; - virtual xs_error_code_t TTLOutputModule_getTriggerEdge(int index, TriggerEdge_t &edge) = 0; - virtual xs_error_code_t TTLOutputModule_setPluseWidth(int index, uint32_t us) = 0; - virtual xs_error_code_t TTLOutputModule_getPluseWidth(int index, uint32_t &us) = 0; - virtual xs_error_code_t TTLOutputModule_setOffsetTime(int index, uint32_t us) = 0; - virtual xs_error_code_t TTLOutputModule_getOffsetTime(int index, uint32_t &us) = 0; + virtual xs_error_code_t TTLOutputModule_readInFreq(int index, float &freq) = 0; + + virtual xs_error_code_t TTLOutputModule_setPolarity(int index, uint32_t polarity) = 0; + virtual xs_error_code_t TTLOutputModule_getPolarity(int index, uint32_t &polarity) = 0; + virtual xs_error_code_t TTLOutputModule_setTriggerEdge(int index, TriggerEdge_t edge) = 0; + virtual xs_error_code_t TTLOutputModule_getTriggerEdge(int index, TriggerEdge_t &edge) = 0; + virtual xs_error_code_t TTLOutputModule_setPluseWidth(int index, uint32_t us) = 0; + virtual xs_error_code_t TTLOutputModule_getPluseWidth(int index, uint32_t &us) = 0; + virtual xs_error_code_t TTLOutputModule_setOffsetTime(int index, uint32_t us) = 0; + virtual xs_error_code_t TTLOutputModule_getOffsetTime(int index, uint32_t &us) = 0; /******************************************************************************* * 工具方法 * diff --git a/include/xsync_regs.hpp b/include/xsync_regs.hpp index 31f3f09..6ede159 100644 --- a/include/xsync_regs.hpp +++ b/include/xsync_regs.hpp @@ -224,11 +224,11 @@ typedef enum { /******************************************************************************* * 内部GENLOCK * *******************************************************************************/ - internal_genlock_module = REGADDOFF__INTERNAL_GENLOCK + 0, - internal_genlock_ctrl_mode = REGADDOFF__INTERNAL_GENLOCK + 1, - internal_genlock_en = REGADDOFF__INTERNAL_GENLOCK + 2, - internal_genlock_format = REGADDOFF__INTERNAL_GENLOCK + 3, - internal_genlock_freq = REGADDOFF__INTERNAL_GENLOCK + 4, + internal_genlock_module = REGADDOFF__INTERNAL_GENLOCK + 0, + internal_genlock_ctrl_mode = REGADDOFF__INTERNAL_GENLOCK + 1, + internal_genlock_en = REGADDOFF__INTERNAL_GENLOCK + 2, + internal_genlock_format = REGADDOFF__INTERNAL_GENLOCK + 3, + internal_genlock_freq = REGADDOFF__INTERNAL_GENLOCK + 4, /******************************************************************************* * SYSGENLOCK * @@ -293,6 +293,14 @@ typedef enum { camera_sync_module = REGADDOFF__CAMERA_SYNC_OUT + 0, camera_sync_pulse_mode_valid_len = REGADDOFF__CAMERA_SYNC_OUT + 1, + /******************************************************************************* + * DELAYER * + *******************************************************************************/ + // 0x0600 + delayer_module = REGADDOFF__DELAYER + 0, + delayer_delay_sig_index = REGADDOFF__DELAYER + 1, + delayer_delay_us = REGADDOFF__DELAYER + 2, + } RegAdd_t; } // namespace reg diff --git a/src/xsync_v2.cpp b/src/xsync_v2.cpp index 90d66e4..8983d05 100644 --- a/src/xsync_v2.cpp +++ b/src/xsync_v2.cpp @@ -435,9 +435,10 @@ class Xsync : public IXsync { if (source == SIGNAL_LOGIC0 || // source == SIGNAL_LOGIC1 || // source == SIGNAL_BUSINESS_RECORD_SIG) { - DO_XSYNC(reg_write(reg::kreg_ttlout1_signal_process_mode, 3, 10)); // 转发模式 + DO_XSYNC(reg_write(reg::kreg_ttlout1_signal_process_mode + (index - 1) * 16, 3, 10)); // 转发模式 } else { - DO_XSYNC(reg_write(reg::kreg_ttlout1_signal_process_mode, 2, 10)); // 分频倍频模式 + ZLOGI(TAG, "TTLOutputModule_setSrcSigType %d %d", index, source); + DO_XSYNC(reg_write(reg::kreg_ttlout1_signal_process_mode + (index - 1) * 16, 2, 10)); // 分频倍频模式 } REG_WRITE(reg::kreg_ttlout1_input_signal_select + (index - 1) * 16, source); return kxs_ec_success; @@ -557,28 +558,87 @@ class Xsync : public IXsync { sig != SIGNAL_TTLIN2 && // sig != SIGNAL_TTLIN3 && // sig != SIGNAL_TTLIN4 && // - sig != SIGNAL_SYS_CLK_OUTPUT && // + sig != SIGNAL_INTERNAL_CLOCK_SIG && // sig != SIGNAL_SYS_GENLOCK_OUTPUT && // sig != SIGNAL_SYS_TIMECODE_FREQ_OUTPUT) { return kxs_ec_param_error; } return reg_write(reg::sys_clock_source, sig); } - xs_error_code_t SysClock_getSrc(SignalType_t &sig) override { REG_READ(reg::sys_clock_source, sig); } - xs_error_code_t SysClock_setTriggerEdge(TriggerEdge_t edge) override { - if (edge != TRIGGER_EDGE_RISING && edge != TRIGGER_EDGE_FALLING) { - return kxs_ec_param_error; - } - return reg_write(reg::sys_clock_trigger_edge_select, edge); - } - xs_error_code_t SysClock_getTriggerEdge(TriggerEdge_t &edge) override { return _reg_read(reg::sys_clock_trigger_edge_select, edge); } - xs_error_code_t SysClock_setFreqDivision(uint32_t div) override { return reg_write(reg::sys_clock_freq_division_ctrl, div); } - xs_error_code_t SysClock_geFreqtDivision(uint32_t &div) override { return _reg_read(reg::sys_clock_freq_division_ctrl, div); } - xs_error_code_t SysClock_setFreqMultiplication(uint32_t muti) override { return reg_write(reg::sys_clock_freq_multiplication_ctrl, muti); } - xs_error_code_t SysClock_getFreqMultiplication(uint32_t &muti) override { return _reg_read(reg::sys_clock_freq_multiplication_ctrl, muti); } - xs_error_code_t SysClock_readOutSigFreq(float &freq) override { return readfreq(reg::sys_clock_outfreq_detect, freq); } - xs_error_code_t SysClock_readInSigFreq(float &freq) override { return readfreq(reg::sys_clock_infreq_detect, freq); } - xs_error_code_t storageConfig() override; + virtual xs_error_code_t SysClock_getSrc(SignalType_t &sig) override { REG_READ(reg::sys_clock_source, sig); } + virtual xs_error_code_t SysClock_setTriggerEdge(TriggerEdge_t edge) override { return reg_write(reg::sys_clock_trigger_edge_select, edge); } + virtual xs_error_code_t SysClock_getTriggerEdge(TriggerEdge_t &edge) override { return _reg_read(reg::sys_clock_trigger_edge_select, edge); } + virtual xs_error_code_t SysClock_setFreqDivision(uint32_t div) override { return reg_write(reg::sys_clock_freq_division_ctrl, div); } + virtual xs_error_code_t SysClock_geFreqtDivision(uint32_t &div) override { return _reg_read(reg::sys_clock_freq_division_ctrl, div); } + virtual xs_error_code_t SysClock_setFreqMultiplication(uint32_t muti) override { return reg_write(reg::sys_clock_freq_multiplication_ctrl, muti); } + virtual xs_error_code_t SysClock_getFreqMultiplication(uint32_t &muti) override { return _reg_read(reg::sys_clock_freq_multiplication_ctrl, muti); } + virtual xs_error_code_t SysClock_readOutSigFreq(float &freq) override { return readfreq(reg::sys_clock_outfreq_detect, freq); } + virtual xs_error_code_t SysClock_readInSigFreq(float &freq) override { return readfreq(reg::sys_clock_infreq_detect, freq); } + virtual xs_error_code_t storageConfig() override; + + xs_error_code_t DelayContrl_setDelay(int index, uint32_t delay_us) { // + DO_XSYNC(reg_write(reg::delayer_delay_sig_index, index, 10)); + DO_XSYNC(reg_write(reg::delayer_delay_us, delay_us, 10)); + return kxs_ec_success; + } + xs_error_code_t DelayContrl_getDelay(int index, uint32_t &delay_us) { + DO_XSYNC(reg_write(reg::delayer_delay_sig_index, index, 10)); + DO_XSYNC(reg_read(reg::delayer_delay_us, delay_us, 10)); + return kxs_ec_success; + } + + // assign sys_sig_delay_in[0] = sync_ttl_in1; // + // assign sys_sig_delay_in[1] = sync_ttl_in2; // + // assign sys_sig_delay_in[2] = sync_ttl_in3; // + // assign sys_sig_delay_in[3] = sync_ttl_in4; // + // assign sys_sig_delay_in[4] = timecode_headphone_in; // + // assign sys_sig_delay_in[5] = timecode_bnc_in; // + // assign sys_sig_delay_in[6] = genlock_in_hsync; // + // assign sys_sig_delay_in[7] = genlock_in_vsync; // + // assign sys_sig_delay_in[8] = genlock_in_fsync; // + // assign sys_sig_delay_in[9] = before_delay__sync_ttl_out1; // + // assign sys_sig_delay_in[10] = before_delay__sync_ttl_out2; // + // assign sys_sig_delay_in[11] = before_delay__sync_ttl_out3; // + // assign sys_sig_delay_in[12] = before_delay__sync_ttl_out4; // + // assign sys_sig_delay_in[13] = before_delay__stm32if_start_signal_out; // + // assign sys_sig_delay_in[14] = before_delay__stm32if_camera_sync_out; // + // assign sys_sig_delay_in[15] = before_delay__stm32if_timecode_sync_out; // + + virtual xs_error_code_t DelayContrl_setInputDelay(uint32_t delay_us) override { + DO_XSYNC(DelayContrl_setDelay(0, delay_us * 10)); + DO_XSYNC(DelayContrl_setDelay(1, delay_us * 10)); + DO_XSYNC(DelayContrl_setDelay(2, delay_us * 10)); + DO_XSYNC(DelayContrl_setDelay(3, delay_us * 10)); + DO_XSYNC(DelayContrl_setDelay(4, delay_us * 10)); + DO_XSYNC(DelayContrl_setDelay(5, delay_us * 10)); + DO_XSYNC(DelayContrl_setDelay(6, delay_us * 10)); + DO_XSYNC(DelayContrl_setDelay(7, delay_us * 10)); + DO_XSYNC(DelayContrl_setDelay(8, delay_us * 10)); + return kxs_ec_success; + } + virtual xs_error_code_t DelayContrl_getInputDelay(uint32_t &delay_us) override { + uint32_t delay_cnt; + DO_XSYNC(DelayContrl_getDelay(8, delay_cnt)); + delay_us = delay_cnt / 10; + return kxs_ec_success; + } + + virtual xs_error_code_t DelayContrl_setOutputDelay(uint32_t delay_us) override { + DO_XSYNC(DelayContrl_setDelay(9, delay_us * 10)); + DO_XSYNC(DelayContrl_setDelay(10, delay_us * 10)); + DO_XSYNC(DelayContrl_setDelay(11, delay_us * 10)); + DO_XSYNC(DelayContrl_setDelay(12, delay_us * 10)); + DO_XSYNC(DelayContrl_setDelay(13, delay_us * 10)); + DO_XSYNC(DelayContrl_setDelay(14, delay_us * 10)); + DO_XSYNC(DelayContrl_setDelay(15, delay_us * 10)); + return kxs_ec_success; + } + virtual xs_error_code_t DelayContrl_getOutputDelay(uint32_t &delay_us) override { + uint32_t delay_cnt; + DO_XSYNC(DelayContrl_getDelay(15, delay_cnt)); + delay_us = delay_cnt / 10; + return kxs_ec_success; + } private: xs_error_code_t doaction(uint32_t action, uint32_t actionval, uint32_t *ackreturn, int32_t overtime_ms = 100);