|
|
@ -146,9 +146,9 @@ class Xsync : public IXsync { |
|
|
|
if (m_on_timecode_msg_cb) m_on_timecode_msg_cb(&timecode); |
|
|
|
} else if (packet->eventid == kxsync_work_state_report_event) { |
|
|
|
// 信号发生器状态改变
|
|
|
|
Timecode64_t tc64; |
|
|
|
Timecode64_t tc64 = {0}; |
|
|
|
tc64.tc0 = packet->data[1]; |
|
|
|
tc64.tc1 = packet->data[2]; |
|
|
|
tc64.tc1 = packet->data[2]; // TODO:需要锁存时码的子帧
|
|
|
|
XsyncTimecode_t timecode = timecode64ToXsyncTimeCode(tc64); |
|
|
|
|
|
|
|
if (m_on_record_sig_change_msg_cb) m_on_record_sig_change_msg_cb(packet->data[0], &timecode); |
|
|
@ -203,7 +203,7 @@ class Xsync : public IXsync { |
|
|
|
virtual bool getConnectState() override { return _getConnectState(); } |
|
|
|
virtual string getDeviceIp() override { return _getXsyncIp(); } |
|
|
|
|
|
|
|
virtual xs_error_code_t NetworkConfig_setMode(NetworkMode_t mode) { REG_WRITE(reg::kstm32_obtaining_ip_mode, mode); } |
|
|
|
virtual xs_error_code_t NetworkConfig_setMode(NetworkMode_t mode) override { REG_WRITE(reg::kstm32_obtaining_ip_mode, mode); } |
|
|
|
virtual xs_error_code_t NetworkConfig_getMode(NetworkMode_t &mode) override { |
|
|
|
uint32_t mode_u32; |
|
|
|
DO_XSYNC(reg_read(reg::kstm32_obtaining_ip_mode, mode_u32, 10)); |
|
|
@ -272,24 +272,27 @@ class Xsync : public IXsync { |
|
|
|
return kxs_ec_success; |
|
|
|
} |
|
|
|
|
|
|
|
virtual xs_error_code_t readSDKVersion(version_t &version) { |
|
|
|
virtual xs_error_code_t readSDKVersion(version_t &version) override { |
|
|
|
version.main = PC_VERSION >> 16; |
|
|
|
version.sub = (PC_VERSION >> 8) & 0xff; |
|
|
|
version.fix = PC_VERSION & 0xff; |
|
|
|
return kxs_ec_success; |
|
|
|
} |
|
|
|
virtual xs_error_code_t readARMSoftwareVersion(version_t &version) { |
|
|
|
virtual xs_error_code_t readARMSoftwareVersion(version_t &version) override { |
|
|
|
uint32_t version_u32; |
|
|
|
DO_XSYNC(reg_read(reg::ksoftware_version, version_u32, 10)); |
|
|
|
version.main = version_u32 >> 16; |
|
|
|
version.sub = (version_u32 >> 8) & 0xff; |
|
|
|
version.fix = version_u32 & 0xff; |
|
|
|
return kxs_ec_success; |
|
|
|
} |
|
|
|
virtual xs_error_code_t readFPGASoftwareVersion(version_t &version) { |
|
|
|
virtual xs_error_code_t readFPGASoftwareVersion(version_t &version) override { |
|
|
|
uint32_t version_u32; |
|
|
|
DO_XSYNC(reg_read(reg::kfpga_info_reg0, version_u32, 10)); |
|
|
|
version.main = version_u32 >> 16; |
|
|
|
version.sub = (version_u32 >> 8) & 0xff; |
|
|
|
version.fix = version_u32 & 0xff; |
|
|
|
return kxs_ec_success; |
|
|
|
} |
|
|
|
|
|
|
|
virtual void registerOnTimecodeMsgCallback(xsync_on_timecode_msg_t cb) override { m_on_timecode_msg_cb = cb; } |
|
|
@ -335,18 +338,16 @@ class Xsync : public IXsync { |
|
|
|
return readTimecodeFormat(reg::external_timecode_freq, reg::external_timecode_timecode0, reg::external_timecode_timecode1, format); |
|
|
|
} |
|
|
|
|
|
|
|
virtual xs_error_code_t TTLInputModule1_detectFreq(float &freq) override; |
|
|
|
virtual xs_error_code_t TTLInputModule2_detectFreq(float &freq) override; |
|
|
|
virtual xs_error_code_t TTLInputModule3_detectFreq(float &freq) override; |
|
|
|
virtual xs_error_code_t TTLInputModule4_detectFreq(float &freq) override; |
|
|
|
|
|
|
|
virtual xs_error_code_t ExternalGenlock_detectFreq(float &freq) override; |
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
* INTERNAL * |
|
|
|
*******************************************************************************/ |
|
|
|
virtual xs_error_code_t InternalSigSrouce_start() override { //
|
|
|
|
DO_XSYNC(reg_write(reg::internal_sig_en_contrler_en, 0x7, 10)); |
|
|
|
return kxs_ec_success; |
|
|
|
} |
|
|
|
virtual xs_error_code_t InternalSigSrouce_stop() override { //
|
|
|
|
DO_XSYNC(reg_write(reg::internal_sig_en_contrler_en, 0x0, 10)); |
|
|
|
return kxs_ec_success; |
|
|
|
} |
|
|
|
virtual xs_error_code_t InternalSigSrouce_readState(bool &en) override { |
|
|
|
uint32_t en_u32; |
|
|
@ -366,56 +367,69 @@ class Xsync : public IXsync { |
|
|
|
virtual xs_error_code_t InternalTimecode_getCode(XsyncTimecode_t &timecode) override { return readtimecode(reg::internal_timecode_data0, reg::internal_timecode_data1, timecode); } |
|
|
|
virtual xs_error_code_t InternalTimecode_readFreq(float &freq) override { return readfreq(reg::internal_timecode_detect_freq, freq); }; |
|
|
|
|
|
|
|
virtual xs_error_code_t InternalGenlock_setFormat(GenlockFormat_t format) override; |
|
|
|
virtual xs_error_code_t InternalGenlock_getFormat(GenlockFormat_t &format) override; |
|
|
|
|
|
|
|
virtual xs_error_code_t InternalClock_setFreq(float freq) override; |
|
|
|
virtual xs_error_code_t InternalClock_getFreq(float &freq) override; |
|
|
|
|
|
|
|
xs_error_code_t SysTimecode_setSource(uint32_t sig) override { REG_WRITE(reg::sys_timecode_select, sig); } |
|
|
|
xs_error_code_t SysTimecode_getSource(uint32_t &sig) override { REG_READ(reg::sys_timecode_select, sig); } |
|
|
|
xs_error_code_t SysTimecode_readFormat(TimecodeFormat_t &format) override { return readTimecodeFormat(reg::sys_timecode_freq_detect, reg::sys_timecode_data0, reg::sys_timecode_data1, format); } |
|
|
|
xs_error_code_t SysTimecode_readFreq(float &freq) override { return readfreq(reg::sys_timecode_freq_detect, freq); } |
|
|
|
xs_error_code_t SysTimecode_readCode(XsyncTimecode_t &timecode) override { return readtimecode(reg::sys_timecode_data0, reg::sys_timecode_data1, timecode); } |
|
|
|
|
|
|
|
virtual xs_error_code_t SysGenlock_setSrc(uint32_t source) override; |
|
|
|
virtual xs_error_code_t SysGenlock_getSrc(uint32_t &source) override; |
|
|
|
virtual xs_error_code_t SysGenlock_readFreq(float &freq) override; |
|
|
|
|
|
|
|
virtual xs_error_code_t SysClock_setSrc(SignalType_t sig) override; |
|
|
|
virtual xs_error_code_t SysClock_getSrc(SignalType_t &sig) override; |
|
|
|
virtual xs_error_code_t SysClock_setTriggerEdge(TriggerEdge_t edge) override; |
|
|
|
virtual xs_error_code_t SysClock_getTriggerEdge(TriggerEdge_t &edge) override; |
|
|
|
virtual xs_error_code_t SysClock_setFreqDivision(uint32_t div) override; |
|
|
|
virtual xs_error_code_t SysClock_geFreqtDivision(uint32_t &div) override; |
|
|
|
virtual xs_error_code_t SysClock_setFreqMultiplication(uint32_t muti) override; |
|
|
|
virtual xs_error_code_t SysClock_getFreqMultiplication(uint32_t &muti) override; |
|
|
|
virtual xs_error_code_t SysClock_readOutSigFreq(float &freq) override; |
|
|
|
virtual xs_error_code_t SysClock_readInSigFreq(float &freq) override; |
|
|
|
|
|
|
|
virtual xs_error_code_t RecordSigGenerator_setContrlMode(ControlMode_t mode) override; |
|
|
|
virtual xs_error_code_t RecordSigGenerator_getContrlMode(ControlMode_t &mode) override; |
|
|
|
virtual xs_error_code_t RecordSigGenerator_manualStart() override; |
|
|
|
virtual xs_error_code_t RecordSigGenerator_manualStop() override; |
|
|
|
virtual xs_error_code_t RecordSigGenerator_setAutoStartTimecode(XsyncTimecode_t timecode) override; |
|
|
|
virtual xs_error_code_t RecordSigGenerator_setAutoStopTimecode(XsyncTimecode_t timecode) override; |
|
|
|
virtual xs_error_code_t RecordSigGenerator_getAutoStartTimecode(XsyncTimecode_t &timecode) override; |
|
|
|
virtual xs_error_code_t RecordSigGenerator_getAutoStopTimecode(XsyncTimecode_t &timecode) override; |
|
|
|
virtual xs_error_code_t RecordSigGenerator_setTimecodeCtrlFlag(uint32_t autoStart, uint32_t autoStop) override; |
|
|
|
virtual xs_error_code_t RecordSigGenerator_getTimecodeCtrlFlag(uint32_t &autoStart, uint32_t &autoStop) override; |
|
|
|
virtual xs_error_code_t RecordSigGenerator_setExternalTTLTriggerSrc(InputInterface_t ttlPortNum); // 1- override4
|
|
|
|
virtual xs_error_code_t RecordSigGenerator_getExternalTTLTriggerSrc(InputInterface_t &ttlPortNum) override; |
|
|
|
virtual xs_error_code_t RecordSigGenerator_setExternalTTLTriggerPolarity(uint32_t polarity) override; |
|
|
|
virtual xs_error_code_t RecordSigGenerator_getExternalTTLTriggerPolarity(uint32_t &polarity) override; |
|
|
|
virtual xs_error_code_t RecordSigGenerator_getRecordState(uint32_t &state) override; |
|
|
|
virtual xs_error_code_t RecordSigGenerator_readTimecodeSnapshot(XsyncTimecode_t &timecode) override; |
|
|
|
|
|
|
|
xs_error_code_t TimecodeOutputModule_setBncOutputLevel(int level); // 0:line,1:mi overridec
|
|
|
|
xs_error_code_t TimecodeOutputModule_getBncOutputLevel(int &level); |
|
|
|
xs_error_code_t TimecodeOutputModule_setHeadphoneOutputLevel(int level); // 0:line,1:mi overridec
|
|
|
|
xs_error_code_t TimecodeOutputModule_getHeadphoneOutputLevel(int &level); |
|
|
|
|
|
|
|
virtual xs_error_code_t TTLOutputModule_setSrcSigType(int index, SignalType_t source) { |
|
|
|
virtual xs_error_code_t InternalGenlock_setFormat(GenlockFormat_t format) override { return reg_write(reg::internal_genlock_format, format); } |
|
|
|
virtual xs_error_code_t InternalGenlock_getFormat(GenlockFormat_t &format) override { REG_READ(reg::internal_genlock_format, format); } |
|
|
|
virtual xs_error_code_t InternalGenlock_readFreq(float &freq) override { return readfreq(reg::internal_genlock_freq, freq); } |
|
|
|
|
|
|
|
virtual xs_error_code_t InternalClock_setFreq(float freq) override { |
|
|
|
double T = 1.0 / freq; |
|
|
|
double T_ns = T * 1000 * 1000 * 1000; |
|
|
|
double cnt = T_ns / 100 + 0.5; // 10MHZ <=> 100ns
|
|
|
|
|
|
|
|
uint32_t cnt_u32 = uint32_t(cnt); |
|
|
|
return reg_write(reg::internal_clock_freq, cnt_u32); |
|
|
|
return kxs_ec_success; |
|
|
|
} |
|
|
|
virtual xs_error_code_t InternalClock_getFreq(float &freq) override { return readfreq(reg::internal_clock_freq, freq); } |
|
|
|
virtual xs_error_code_t InternalClock_readOutFreq(float &freq) override { return readfreq(reg::internal_clock_freq_detect, freq); } |
|
|
|
|
|
|
|
virtual xs_error_code_t SysTimecode_setSource(uint32_t sig) override { REG_WRITE(reg::sys_timecode_select, sig); } |
|
|
|
virtual xs_error_code_t SysTimecode_getSource(uint32_t &sig) override { REG_READ(reg::sys_timecode_select, sig); } |
|
|
|
virtual xs_error_code_t SysTimecode_readFormat(TimecodeFormat_t &format) override { return readTimecodeFormat(reg::sys_timecode_freq_detect, reg::sys_timecode_data0, reg::sys_timecode_data1, format); } |
|
|
|
virtual xs_error_code_t SysTimecode_readFreq(float &freq) override { return readfreq(reg::sys_timecode_freq_detect, freq); } |
|
|
|
virtual xs_error_code_t SysTimecode_readCode(XsyncTimecode_t &timecode) override { return readtimecode(reg::sys_timecode_data0, reg::sys_timecode_data1, timecode); } |
|
|
|
|
|
|
|
virtual xs_error_code_t RecordSigGenerator_setContrlMode(ControlMode_t mode) override { |
|
|
|
if (mode != CONTROLMODE_MANUAL_TRIGGER && mode != CONTROLMODE_TIMECODE_TRIGGER && mode != CONTROLMODE_EXTERNALTTL_TRIGGER) { |
|
|
|
return kxs_ec_param_error; |
|
|
|
} |
|
|
|
return reg_write(reg::record_sig_gen_ctrl_control_mode, mode); |
|
|
|
} |
|
|
|
virtual xs_error_code_t RecordSigGenerator_getContrlMode(ControlMode_t &mode) override { return _reg_read(reg::record_sig_gen_ctrl_control_mode, mode); } |
|
|
|
virtual xs_error_code_t RecordSigGenerator_manualStart() override { return reg_write(reg::record_sig_gen_manual_ctrl, 1, 10); } |
|
|
|
virtual xs_error_code_t RecordSigGenerator_manualStop() override { return reg_write(reg::record_sig_gen_manual_ctrl, 0, 10); } |
|
|
|
virtual xs_error_code_t RecordSigGenerator_setAutoStartTimecode(XsyncTimecode_t timecode) override { return writetimecode(reg::record_sig_gen_timecode_start0, reg::record_sig_gen_timecode_start1, timecode); } |
|
|
|
virtual xs_error_code_t RecordSigGenerator_setAutoStopTimecode(XsyncTimecode_t timecode) override { return writetimecode(reg::record_sig_gen_timecode_stop0, reg::record_sig_gen_timecode_stop1, timecode); } |
|
|
|
virtual xs_error_code_t RecordSigGenerator_getAutoStartTimecode(XsyncTimecode_t &timecode) override { return readtimecode(reg::record_sig_gen_timecode_start0, reg::record_sig_gen_timecode_start1, timecode); } |
|
|
|
virtual xs_error_code_t RecordSigGenerator_getAutoStopTimecode(XsyncTimecode_t &timecode) override { return readtimecode(reg::record_sig_gen_timecode_stop0, reg::record_sig_gen_timecode_stop1, timecode); } |
|
|
|
|
|
|
|
virtual xs_error_code_t RecordSigGenerator_setExternalTTLTriggerSrc(InputInterface_t ttlPortNum) override { |
|
|
|
if (ttlPortNum != INPUT_IF_TTL1 && ttlPortNum != INPUT_IF_TTL2 && ttlPortNum != INPUT_IF_TTL3 && ttlPortNum != INPUT_IF_TTL4) { |
|
|
|
return kxs_ec_param_error; |
|
|
|
} |
|
|
|
return reg_write(reg::record_sig_gen_ttlin_trigger_sig_source, ttlPortNum); |
|
|
|
} |
|
|
|
virtual xs_error_code_t RecordSigGenerator_getExternalTTLTriggerSrc(InputInterface_t &ttlPortNum) override { return _reg_read(reg::record_sig_gen_ttlin_trigger_sig_source, ttlPortNum); } |
|
|
|
virtual xs_error_code_t RecordSigGenerator_setExternalTTLTriggerPolarity(uint32_t polarity) override { return reg_write(reg::record_sig_gen_ttlin_trigger_level, polarity); } |
|
|
|
virtual xs_error_code_t RecordSigGenerator_getExternalTTLTriggerPolarity(uint32_t &polarity) override { return _reg_read(reg::record_sig_gen_ttlin_trigger_level, polarity); } |
|
|
|
virtual xs_error_code_t RecordSigGenerator_setTimecodeCtrlFlag(uint32_t autoStart, uint32_t autoStop) override { |
|
|
|
uint32_t flag = (autoStart & 0x01) | ((autoStop & 0x01) << 1); |
|
|
|
return reg_write(reg::record_sig_gen_timecode_control_flag, flag); |
|
|
|
} |
|
|
|
virtual xs_error_code_t RecordSigGenerator_getTimecodeCtrlFlag(uint32_t &autoStart, uint32_t &autoStop) override { |
|
|
|
uint32_t flag = 0; |
|
|
|
auto ret = reg_read(reg::record_sig_gen_timecode_control_flag, flag); |
|
|
|
autoStart = flag & 0x01; |
|
|
|
autoStop = (flag >> 1) & 0x01; |
|
|
|
return ret; |
|
|
|
} |
|
|
|
|
|
|
|
virtual xs_error_code_t RecordSigGenerator_getRecordState(uint32_t &state) override { return _reg_read(reg::record_sig_gen_record_state, state); } |
|
|
|
virtual xs_error_code_t RecordSigGenerator_readTimecodeSnapshot(XsyncTimecode_t &timecode) override { return readtimecode(reg::record_sig_gen_timecode_snapshot0, reg::record_sig_gen_timecode_snapshot1, timecode); } |
|
|
|
virtual xs_error_code_t RecordSigGenerator_setTriggerEdge(TriggerEdge_t edge) override { return reg_write(reg::record_sig_gen_trigger_edge_select, edge); } |
|
|
|
virtual xs_error_code_t RecordSigGenerator_getTriggerEdge(TriggerEdge_t &edge) override { return _reg_read(reg::record_sig_gen_trigger_edge_select, edge); } |
|
|
|
|
|
|
|
virtual xs_error_code_t TTLOutputModule_setSrcSigType(int index, SignalType_t source) override { |
|
|
|
if (index < 1 || index > 4) return kxs_ec_param_error; |
|
|
|
|
|
|
|
if (source == SIGNAL_LOGIC0 || //
|
|
|
@ -428,61 +442,68 @@ class Xsync : public IXsync { |
|
|
|
REG_WRITE(reg::kreg_ttlout1_input_signal_select + (index - 1) * 16, source); |
|
|
|
return kxs_ec_success; |
|
|
|
} |
|
|
|
virtual xs_error_code_t TTLOutputModule_getSrcSigType(int index, SignalType_t &source) { |
|
|
|
virtual xs_error_code_t TTLOutputModule_getSrcSigType(int index, SignalType_t &source) override { |
|
|
|
if (index < 1 || index > 4) return kxs_ec_param_error; |
|
|
|
uint32_t source_u32; |
|
|
|
DO_XSYNC(reg_read(reg::kreg_ttlout1_input_signal_select + (index - 1) * 16, source_u32, 10)); |
|
|
|
source = (SignalType_t)source_u32; |
|
|
|
return kxs_ec_success; |
|
|
|
} |
|
|
|
virtual xs_error_code_t TTLOutputModule_setFreqDivision(int index, uint32_t div) { |
|
|
|
virtual xs_error_code_t TTLOutputModule_setFreqDivision(int index, uint32_t div) override { |
|
|
|
if (index < 1 || index > 4) return kxs_ec_param_error; |
|
|
|
REG_WRITE(reg::kreg_ttlout1_pllout_freq_division_ctrl + (index - 1) * 16, div); |
|
|
|
} |
|
|
|
virtual xs_error_code_t TTLOutputModule_getFreqDivision(int index, uint32_t &div) { |
|
|
|
virtual xs_error_code_t TTLOutputModule_getFreqDivision(int index, uint32_t &div) override { |
|
|
|
if (index < 1 || index > 4) return kxs_ec_param_error; |
|
|
|
REG_READ(reg::kreg_ttlout1_pllout_freq_division_ctrl + (index - 1) * 16, div); |
|
|
|
} |
|
|
|
virtual xs_error_code_t TTLOutputModule_setFreqMultiplication(int index, uint32_t multi) { |
|
|
|
virtual xs_error_code_t TTLOutputModule_setFreqMultiplication(int index, uint32_t multi) override { |
|
|
|
if (index < 1 || index > 4) return kxs_ec_param_error; |
|
|
|
REG_WRITE(reg::kreg_ttlout1_pllout_freq_multiplication_ctrl + (index - 1) * 16, multi); |
|
|
|
} |
|
|
|
virtual xs_error_code_t TTLOutputModule_getFreqMultiplication(int index, uint32_t &multi) { |
|
|
|
virtual xs_error_code_t TTLOutputModule_getFreqMultiplication(int index, uint32_t &multi) override { |
|
|
|
if (index < 1 || index > 4) return kxs_ec_param_error; |
|
|
|
REG_READ(reg::kreg_ttlout1_pllout_freq_multiplication_ctrl + (index - 1) * 16, multi); |
|
|
|
} |
|
|
|
virtual xs_error_code_t TTLOutputModule_readOutFreq(int index, float &freq) { |
|
|
|
|
|
|
|
virtual xs_error_code_t TTLOutputModule_readInFreq(int index, float &freq) override { |
|
|
|
if (index < 1 || index > 4) return kxs_ec_param_error; |
|
|
|
return readfreq(reg::kreg_ttlout1_sig_in_freq_detect + (index - 1) * 16, freq); |
|
|
|
} |
|
|
|
virtual xs_error_code_t TTLOutputModule_readOutFreq(int index, float &freq) override { |
|
|
|
if (index < 1 || index > 4) return kxs_ec_param_error; |
|
|
|
return readfreq(reg::kreg_ttlout1_sig_out_freq_detect + (index - 1) * 16, freq); |
|
|
|
} |
|
|
|
virtual xs_error_code_t TTLOutputModule_setPolarity(int index, uint32_t polarity) { |
|
|
|
virtual xs_error_code_t TTLOutputModule_setPolarity(int index, uint32_t polarity) override { |
|
|
|
if (index < 1 || index > 4) return kxs_ec_param_error; |
|
|
|
REG_WRITE(reg::kreg_ttlout1_pllout_polarity_ctrl + (index - 1) * 16, polarity); |
|
|
|
DO_XSYNC(reg_write(reg::kreg_ttlout1_pllout_polarity_ctrl + (index - 1) * 16, polarity, 10)); |
|
|
|
DO_XSYNC(reg_write(reg::kreg_ttlout1_forward_mode_polarity_ctrl + (index - 1) * 16, polarity, 10)); |
|
|
|
} |
|
|
|
virtual xs_error_code_t TTLOutputModule_getPolarity(int index, uint32_t &polarity) { |
|
|
|
virtual xs_error_code_t TTLOutputModule_getPolarity(int index, uint32_t &polarity) override { |
|
|
|
if (index < 1 || index > 4) return kxs_ec_param_error; |
|
|
|
REG_READ(reg::kreg_ttlout1_pllout_polarity_ctrl + (index - 1) * 16, polarity); |
|
|
|
} |
|
|
|
virtual xs_error_code_t TTLOutputModule_setTriggerEdge(int index, TriggerEdge_t edge) { |
|
|
|
virtual xs_error_code_t TTLOutputModule_setTriggerEdge(int index, TriggerEdge_t edge) override { |
|
|
|
if (index < 1 || index > 4) return kxs_ec_param_error; |
|
|
|
REG_WRITE(reg::kreg_ttlout1_pllout_trigger_edge_select + (index - 1) * 16, edge); |
|
|
|
} |
|
|
|
virtual xs_error_code_t TTLOutputModule_getTriggerEdge(int index, TriggerEdge_t &edge) { |
|
|
|
virtual xs_error_code_t TTLOutputModule_getTriggerEdge(int index, TriggerEdge_t &edge) override { |
|
|
|
if (index < 1 || index > 4) return kxs_ec_param_error; |
|
|
|
REG_READ(reg::kreg_ttlout1_pllout_trigger_edge_select + (index - 1) * 16, edge); |
|
|
|
} |
|
|
|
virtual xs_error_code_t TTLOutputModule_setPluseWidth(int index, uint32_t us) { |
|
|
|
virtual xs_error_code_t TTLOutputModule_setPluseWidth(int index, uint32_t us) override { |
|
|
|
if (index < 1 || index > 4) return kxs_ec_param_error; |
|
|
|
REG_WRITE(reg::kreg_ttlout1_pluse_width_ctrl + (index - 1) * 16, us); |
|
|
|
} |
|
|
|
virtual xs_error_code_t TTLOutputModule_getPluseWidth(int index, uint32_t &us) { |
|
|
|
virtual xs_error_code_t TTLOutputModule_getPluseWidth(int index, uint32_t &us) override { |
|
|
|
if (index < 1 || index > 4) return kxs_ec_param_error; |
|
|
|
REG_READ(reg::kreg_ttlout1_pluse_width_ctrl + (index - 1) * 16, us); |
|
|
|
} |
|
|
|
virtual xs_error_code_t TTLOutputModule_setOffsetTime(int index, uint32_t us) { |
|
|
|
virtual xs_error_code_t TTLOutputModule_setOffsetTime(int index, uint32_t us) override { |
|
|
|
if (index < 1 || index > 4) return kxs_ec_param_error; |
|
|
|
REG_WRITE(reg::kreg_ttlout1_pluse_offset_ctrl + (index - 1) * 16, us); |
|
|
|
} |
|
|
|
virtual xs_error_code_t TTLOutputModule_getOffsetTime(int index, uint32_t &us) { |
|
|
|
virtual xs_error_code_t TTLOutputModule_getOffsetTime(int index, uint32_t &us) override { |
|
|
|
if (index < 1 || index > 4) return kxs_ec_param_error; |
|
|
|
REG_READ(reg::kreg_ttlout1_pluse_offset_ctrl + (index - 1) * 16, us); |
|
|
|
} |
|
|
@ -516,10 +537,52 @@ class Xsync : public IXsync { |
|
|
|
} |
|
|
|
return kxs_ec_success; |
|
|
|
} |
|
|
|
virtual xs_error_code_t TTLInputModule1_detectFreq(float &freq) override { return readfreq(reg::k_ttlin1_freq_detector_reg, freq); } |
|
|
|
virtual xs_error_code_t TTLInputModule2_detectFreq(float &freq) override { return readfreq(reg::k_ttlin2_freq_detector_reg, freq); } |
|
|
|
virtual xs_error_code_t TTLInputModule3_detectFreq(float &freq) override { return readfreq(reg::k_ttlin3_freq_detector_reg, freq); } |
|
|
|
virtual xs_error_code_t TTLInputModule4_detectFreq(float &freq) override { return readfreq(reg::k_ttlin4_freq_detector_reg, freq); } |
|
|
|
virtual xs_error_code_t TimecodeOutputModule_setBncOutputLevel(int level) { REG_WRITE(reg::timecode_output_bnc_outut_level_select, level); } |
|
|
|
virtual xs_error_code_t TimecodeOutputModule_getBncOutputLevel(int &level) { REG_READ(reg::timecode_output_bnc_outut_level_select, level); } |
|
|
|
virtual xs_error_code_t TimecodeOutputModule_setHeadphoneOutputLevel(int level) { REG_WRITE(reg::timecode_output_headphone_outut_level_select, level); } |
|
|
|
virtual xs_error_code_t TimecodeOutputModule_getHeadphoneOutputLevel(int &level) { REG_READ(reg::timecode_output_headphone_outut_level_select, level); } |
|
|
|
virtual xs_error_code_t ExternalGenlock_detectFreq(float &freq) override { return readfreq(reg::external_genlock_freq, freq); } |
|
|
|
virtual xs_error_code_t SysGenlock_setSrc(uint32_t source) override { return reg_write(reg::sys_genlock_source, source); } |
|
|
|
virtual xs_error_code_t SysGenlock_getSrc(uint32_t &extern_or_internal) override { |
|
|
|
REG_READ(reg::sys_genlock_source, extern_or_internal); |
|
|
|
return kxs_ec_success; |
|
|
|
} |
|
|
|
virtual xs_error_code_t SysGenlock_readFreq(float &freq) override { return readfreq(reg::sys_genlock_freq, freq); } |
|
|
|
virtual xs_error_code_t SysClock_setSrc(SignalType_t sig) override { |
|
|
|
if (sig != SIGNAL_TTLIN1 && //
|
|
|
|
sig != SIGNAL_TTLIN2 && //
|
|
|
|
sig != SIGNAL_TTLIN3 && //
|
|
|
|
sig != SIGNAL_TTLIN4 && //
|
|
|
|
sig != SIGNAL_SYS_CLK_OUTPUT && //
|
|
|
|
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; |
|
|
|
|
|
|
|
private: |
|
|
|
xs_error_code_t doaction(uint32_t action, uint32_t actionval, uint32_t *ackreturn, int32_t overtime_ms = 100); |
|
|
|
xs_error_code_t storageConfig(); |
|
|
|
|
|
|
|
xs_error_code_t xsync_send_cmd_block(iflytop_xsync_packet_header_t *cmd, iflytop_xsync_packet_header_t *rx_data, int32_t buffersize, int32_t overtime_ms); |
|
|
|
|
|
|
|
xs_error_code_t readtimecode(uint32_t reg0, uint32_t reg1, XsyncTimecode_t &timecode); |
|
|
@ -756,9 +819,9 @@ xs_error_code_t Xsync::readtimecode(uint32_t reg0, uint32_t reg1, XsyncTimecode_ |
|
|
|
ecode = reg_read(reg1, tc1, 10); |
|
|
|
if (ecode != kxs_ec_success) return ecode; |
|
|
|
|
|
|
|
Timecode64_t tc64; |
|
|
|
tc64.tc0 = tc0; |
|
|
|
tc64.tc1 = tc1; |
|
|
|
Timecode64_t tc64 = {0}; |
|
|
|
tc64.tc0 = tc0; |
|
|
|
tc64.tc1 = tc1; |
|
|
|
|
|
|
|
timecode = timecode64ToXsyncTimeCode(tc64); |
|
|
|
return ecode; |
|
|
@ -829,193 +892,7 @@ xs_error_code_t Xsync::doaction(uint32_t action, uint32_t actionval, uint32_t *a |
|
|
|
return ecode; |
|
|
|
} |
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
* TTLInputModule * |
|
|
|
*******************************************************************************/ |
|
|
|
#define FREQ_CNT_TO_FREQ(cnt) ((cnt != 0) ? (uint32_t)(1.0 / (cnt * 1.0 / (10 * 1000 * 1000)) + 0.5) : 0) //+0.5是因为c++ 小数强转成整数时是取整,而非四舍五入
|
|
|
|
|
|
|
|
xs_error_code_t Xsync::TTLInputModule1_detectFreq(float &freq) { return readfreq(reg::k_ttlin1_freq_detector_reg, freq); } |
|
|
|
xs_error_code_t Xsync::TTLInputModule2_detectFreq(float &freq) { return readfreq(reg::k_ttlin2_freq_detector_reg, freq); } |
|
|
|
xs_error_code_t Xsync::TTLInputModule3_detectFreq(float &freq) { return readfreq(reg::k_ttlin3_freq_detector_reg, freq); } |
|
|
|
xs_error_code_t Xsync::TTLInputModule4_detectFreq(float &freq) { return readfreq(reg::k_ttlin4_freq_detector_reg, freq); } |
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
* TimecodeInputModule * |
|
|
|
*******************************************************************************/ |
|
|
|
#if 0
|
|
|
|
xs_error_code_t Xsync::ExternalTimecode_setSource(InputInterface_t src) { |
|
|
|
if (src == INPUT_IF_TIMECODE_BNC) { |
|
|
|
DO_XSYNC(reg_write(reg::external_timecode_sig_selt, 1, 10)); // 0:off,1:bnc,2:headphone
|
|
|
|
} else if (src == INPUT_IF_TIMECODE_HEADPHONE) { |
|
|
|
DO_XSYNC(reg_write(reg::external_timecode_sig_selt, 2, 10)); // 0:off,1:bnc,2:headphone
|
|
|
|
} else if (src == INPUT_IF_OFF) { |
|
|
|
DO_XSYNC(reg_write(reg::external_timecode_sig_selt, 0, 10)); // 0:off,1:bnc,2:headphone
|
|
|
|
} else { |
|
|
|
return kxs_ec_param_error; |
|
|
|
} |
|
|
|
return kxs_ec_success; |
|
|
|
} |
|
|
|
xs_error_code_t Xsync::ExternalTimecode_getSource(InputInterface_t &timecode_select) { |
|
|
|
uint32_t readbak = 0; |
|
|
|
DO_XSYNC(reg_read(reg::external_timecode_sig_selt, readbak, 10)); |
|
|
|
if (readbak == 1) { |
|
|
|
timecode_select = INPUT_IF_TIMECODE_BNC; |
|
|
|
} else if (readbak == 2) { |
|
|
|
timecode_select = INPUT_IF_TIMECODE_HEADPHONE; |
|
|
|
} else if (readbak == 0) { |
|
|
|
timecode_select = INPUT_IF_OFF; |
|
|
|
} else { |
|
|
|
timecode_select = INPUT_IF_OFF; |
|
|
|
} |
|
|
|
return kxs_ec_success; |
|
|
|
} |
|
|
|
xs_error_code_t Xsync::ExternalTimecode_setFormat(TimecodeFormat_t format) { REG_WRITE(reg::external_timecode_format, format); } |
|
|
|
xs_error_code_t Xsync::ExternalTimecode_getFormat(TimecodeFormat_t &format) { REG_READ(reg::external_timecode_format, format); } |
|
|
|
xs_error_code_t Xsync::ExternalTimecode_readCode(XsyncTimecode_t &timecode) { return readtimecode(reg::external_timecode_code0, reg::external_timecode_code1, timecode); } |
|
|
|
#endif
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
* InternalTimecode * |
|
|
|
*******************************************************************************/ |
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
* SysTimecode * |
|
|
|
*******************************************************************************/ |
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
* TimecodeOutputModule * |
|
|
|
*******************************************************************************/ |
|
|
|
xs_error_code_t Xsync::TimecodeOutputModule_setBncOutputLevel(int level) { REG_WRITE(reg::timecode_output_bnc_outut_level_select, level); } |
|
|
|
xs_error_code_t Xsync::TimecodeOutputModule_getBncOutputLevel(int &level) { REG_READ(reg::timecode_output_bnc_outut_level_select, level); } |
|
|
|
xs_error_code_t Xsync::TimecodeOutputModule_setHeadphoneOutputLevel(int level) { REG_WRITE(reg::timecode_output_headphone_outut_level_select, level); } |
|
|
|
xs_error_code_t Xsync::TimecodeOutputModule_getHeadphoneOutputLevel(int &level) { REG_READ(reg::timecode_output_headphone_outut_level_select, level); } |
|
|
|
/*******************************************************************************
|
|
|
|
* GENLOCK * |
|
|
|
*******************************************************************************/ |
|
|
|
xs_error_code_t Xsync::ExternalGenlock_detectFreq(float &freq) { return readfreq(reg::external_genlock_freq, freq); } |
|
|
|
xs_error_code_t Xsync::InternalGenlock_setFormat(GenlockFormat_t format) { return reg_write(reg::internal_genlock_format, format); } |
|
|
|
xs_error_code_t Xsync::InternalGenlock_getFormat(GenlockFormat_t &format) { REG_READ(reg::internal_genlock_format, format); } |
|
|
|
|
|
|
|
xs_error_code_t Xsync::SysGenlock_setSrc(uint32_t source) { return reg_write(reg::sys_genlock_source, source); } |
|
|
|
xs_error_code_t Xsync::SysGenlock_getSrc(uint32_t &extern_or_internal) { |
|
|
|
REG_READ(reg::sys_genlock_source, extern_or_internal); |
|
|
|
return kxs_ec_success; |
|
|
|
} |
|
|
|
|
|
|
|
xs_error_code_t Xsync::SysGenlock_readFreq(float &freq) { return readfreq(reg::sys_genlock_freq, freq); } |
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
* INTERNAL_CLOCK * |
|
|
|
*******************************************************************************/ |
|
|
|
xs_error_code_t Xsync::InternalClock_setFreq(float freq) { |
|
|
|
double T = 1.0 / freq; |
|
|
|
double T_ns = T * 1000 * 1000 * 1000; |
|
|
|
double cnt = T_ns / 100 + 0.5; // 10MHZ <=> 100ns
|
|
|
|
|
|
|
|
uint32_t cnt_u32 = uint32_t(cnt); |
|
|
|
return reg_write(reg::internal_clock_freq, cnt_u32); |
|
|
|
return kxs_ec_success; |
|
|
|
} |
|
|
|
xs_error_code_t Xsync::InternalClock_getFreq(float &freq) { return readfreq(reg::internal_clock_freq, freq); } |
|
|
|
/*******************************************************************************
|
|
|
|
* SysClock * |
|
|
|
*******************************************************************************/ |
|
|
|
xs_error_code_t Xsync::SysClock_setSrc(SignalType_t sig) { |
|
|
|
if (sig != SIGNAL_TTLIN1 && //
|
|
|
|
sig != SIGNAL_TTLIN2 && //
|
|
|
|
sig != SIGNAL_TTLIN3 && //
|
|
|
|
sig != SIGNAL_TTLIN4 && //
|
|
|
|
sig != SIGNAL_SYS_CLK_OUTPUT && //
|
|
|
|
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 Xsync::SysClock_getSrc(SignalType_t &sig) { REG_READ(reg::sys_clock_source, sig); } |
|
|
|
xs_error_code_t Xsync::SysClock_setTriggerEdge(TriggerEdge_t edge) { |
|
|
|
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 Xsync::SysClock_getTriggerEdge(TriggerEdge_t &edge) { return _reg_read(reg::sys_clock_trigger_edge_select, edge); } |
|
|
|
xs_error_code_t Xsync::SysClock_setFreqDivision(uint32_t div) { return reg_write(reg::sys_clock_freq_division_ctrl, div); } |
|
|
|
xs_error_code_t Xsync::SysClock_geFreqtDivision(uint32_t &div) { return _reg_read(reg::sys_clock_freq_division_ctrl, div); } |
|
|
|
xs_error_code_t Xsync::SysClock_setFreqMultiplication(uint32_t muti) { return reg_write(reg::sys_clock_freq_multiplication_ctrl, muti); } |
|
|
|
xs_error_code_t Xsync::SysClock_getFreqMultiplication(uint32_t &muti) { return _reg_read(reg::sys_clock_freq_multiplication_ctrl, muti); } |
|
|
|
xs_error_code_t Xsync::SysClock_readOutSigFreq(float &freq) { return readfreq(reg::sys_clock_outfreq_detect, freq); } |
|
|
|
xs_error_code_t Xsync::SysClock_readInSigFreq(float &freq) { return readfreq(reg::sys_clock_infreq_detect, freq); } |
|
|
|
|
|
|
|
xs_error_code_t Xsync::RecordSigGenerator_setContrlMode(ControlMode_t mode) { |
|
|
|
if (mode != CONTROLMODE_MANUAL_TRIGGER && mode != CONTROLMODE_TIMECODE_TRIGGER && mode != CONTROLMODE_EXTERNALTTL_TRIGGER) { |
|
|
|
return kxs_ec_param_error; |
|
|
|
} |
|
|
|
return reg_write(reg::record_sig_gen_ctrl_control_mode, mode); |
|
|
|
} |
|
|
|
xs_error_code_t Xsync::RecordSigGenerator_getContrlMode(ControlMode_t &mode) { //
|
|
|
|
return _reg_read(reg::record_sig_gen_ctrl_control_mode, mode); |
|
|
|
} |
|
|
|
xs_error_code_t Xsync::RecordSigGenerator_manualStart() { return reg_write(reg::record_sig_gen_manual_ctrl, 1, 10); } |
|
|
|
xs_error_code_t Xsync::RecordSigGenerator_manualStop() { return reg_write(reg::record_sig_gen_manual_ctrl, 0, 10); } |
|
|
|
xs_error_code_t Xsync::RecordSigGenerator_setAutoStartTimecode(XsyncTimecode_t timecode) { //
|
|
|
|
return writetimecode(reg::record_sig_gen_timecode_start0, reg::record_sig_gen_timecode_start1, timecode); |
|
|
|
} |
|
|
|
xs_error_code_t Xsync::RecordSigGenerator_setAutoStopTimecode(XsyncTimecode_t timecode) { //
|
|
|
|
return writetimecode(reg::record_sig_gen_timecode_stop0, reg::record_sig_gen_timecode_stop1, timecode); |
|
|
|
} |
|
|
|
xs_error_code_t Xsync::RecordSigGenerator_getAutoStartTimecode(XsyncTimecode_t &timecode) { //
|
|
|
|
return readtimecode(reg::record_sig_gen_timecode_start0, reg::record_sig_gen_timecode_start1, timecode); |
|
|
|
} |
|
|
|
xs_error_code_t Xsync::RecordSigGenerator_getAutoStopTimecode(XsyncTimecode_t &timecode) { return readtimecode(reg::record_sig_gen_timecode_stop0, reg::record_sig_gen_timecode_stop1, timecode); } |
|
|
|
|
|
|
|
xs_error_code_t Xsync::RecordSigGenerator_setExternalTTLTriggerSrc(InputInterface_t ttlPortNum) { |
|
|
|
if (ttlPortNum != INPUT_IF_TTL1 && ttlPortNum != INPUT_IF_TTL2 && ttlPortNum != INPUT_IF_TTL3 && ttlPortNum != INPUT_IF_TTL4) { |
|
|
|
return kxs_ec_param_error; |
|
|
|
} |
|
|
|
return reg_write(reg::record_sig_gen_ttlin_trigger_sig_source, ttlPortNum); |
|
|
|
} |
|
|
|
xs_error_code_t Xsync::RecordSigGenerator_getExternalTTLTriggerSrc(InputInterface_t &ttlPortNum) { //
|
|
|
|
return _reg_read(reg::record_sig_gen_ttlin_trigger_sig_source, ttlPortNum); |
|
|
|
} |
|
|
|
xs_error_code_t Xsync::RecordSigGenerator_setExternalTTLTriggerPolarity(uint32_t polarity) { //
|
|
|
|
return reg_write(reg::record_sig_gen_ttlin_trigger_level, polarity); |
|
|
|
} |
|
|
|
xs_error_code_t Xsync::RecordSigGenerator_getExternalTTLTriggerPolarity(uint32_t &polarity) { //
|
|
|
|
return _reg_read(reg::record_sig_gen_ttlin_trigger_level, polarity); |
|
|
|
} |
|
|
|
// xs_error_code_t Xsync::RecordSigGenerator_setRecordExposureTime(uint32_t us) { //
|
|
|
|
// return reg_write(reg::record_sig_gen_exposure_time, us);
|
|
|
|
// }
|
|
|
|
// xs_error_code_t Xsync::RecordSigGenerator_getRecordExposureTime(uint32_t &us) {
|
|
|
|
// auto ret = reg_read(reg::record_sig_gen_exposure_time, us);
|
|
|
|
// // us = us / 10;1
|
|
|
|
// return ret;
|
|
|
|
// }
|
|
|
|
// xs_error_code_t Xsync::RecordSigGenerator_setRecordExposureOffsetTime(uint32_t us) { return reg_write(reg::record_sig_gen_exposure_offset_time, us); }
|
|
|
|
// xs_error_code_t Xsync::RecordSigGenerator_getRecordExposureOffsetTime(uint32_t &us) {
|
|
|
|
// auto ret = reg_read(reg::record_sig_gen_exposure_offset_time, us);
|
|
|
|
// // us = us / 10;
|
|
|
|
// return ret;
|
|
|
|
// }
|
|
|
|
xs_error_code_t Xsync::RecordSigGenerator_setTimecodeCtrlFlag(uint32_t autoStart, uint32_t autoStop) { //
|
|
|
|
uint32_t flag = (autoStart & 0x01) | ((autoStop & 0x01) << 1); |
|
|
|
return reg_write(reg::record_sig_gen_timecode_control_flag, flag); |
|
|
|
} |
|
|
|
xs_error_code_t Xsync::RecordSigGenerator_getTimecodeCtrlFlag(uint32_t &autoStart, uint32_t &autoStop) { |
|
|
|
uint32_t flag = 0; |
|
|
|
auto ret = reg_read(reg::record_sig_gen_timecode_control_flag, flag); |
|
|
|
autoStart = flag & 0x01; |
|
|
|
autoStop = (flag >> 1) & 0x01; |
|
|
|
return ret; |
|
|
|
} |
|
|
|
|
|
|
|
xs_error_code_t Xsync::RecordSigGenerator_getRecordState(uint32_t &state) { return _reg_read(reg::record_sig_gen_record_state, state); } |
|
|
|
xs_error_code_t Xsync::RecordSigGenerator_readTimecodeSnapshot(XsyncTimecode_t &timecode) { //
|
|
|
|
return readtimecode(reg::record_sig_gen_timecode_snapshot0, reg::record_sig_gen_timecode_snapshot1, timecode); |
|
|
|
} |
|
|
|
|
|
|
|
namespace xsync { |
|
|
|
void XsyncInit(I_XSUDPFactory *xsync_udp_factory) { g_xsync_udp_factory = xsync_udp_factory; } |
|
|
|
IXsync *XsyncIns() { return &Xsync::Ins(); } |
|
|
|
} // namespace xsync
|
|
|
|
} // namespace xsync
|