You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

607 lines
20 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. #include "xsync.hpp"
  2. #define ENABLE_LOG
  3. #ifdef ENABLE_LOG
  4. #include "../src/logger.hpp"
  5. #endif
  6. #define TAG "XSYNC"
  7. using namespace iflytop;
  8. static uint32_t ipToUint32(const std::string &ipAddress, bool &suc) {
  9. uint32_t result = 0;
  10. std::istringstream iss(ipAddress);
  11. std::string segment;
  12. int i = 0;
  13. while (std::getline(iss, segment, '.')) {
  14. uint32_t octet = std::stoi(segment);
  15. if (octet > 255) {
  16. suc = false;
  17. return 0;
  18. }
  19. result |= (octet << ((3 - i) * 8));
  20. i++;
  21. }
  22. if (i != 4) {
  23. suc = false;
  24. return 0;
  25. }
  26. suc = true;
  27. uint32_t result_n = 0;
  28. result_n |= ((result & 0xff000000) >> 24);
  29. result_n |= ((result & 0x00ff0000) >> 8);
  30. result_n |= ((result & 0x0000ff00) << 8);
  31. result_n |= ((result & 0x000000ff) << 24);
  32. return result_n;
  33. }
  34. namespace iflytop {
  35. namespace xsync_internal_signal {
  36. // level0 = 0, // 0
  37. // level1 = 1, // 1
  38. // ttlin1_module_raw_sig = 2, // ttl1输入模块原始信号
  39. // ttlin1_module_sig_divide = 3, // ttl1输入模块分频信号
  40. // ttlin2_module_raw_sig = 4, // ttl2输入模块原始信号
  41. // ttlin2_module_sig_divide = 5, // ttl2输入模块分频信号
  42. // ttlin3_module_raw_sig = 6, // ttl3输入模块原始信号
  43. // ttlin3_module_sig_divide = 7, // ttl3输入模块分频信号
  44. // ttlin4_module_raw_sig = 8, // ttl4输入模块原始信号
  45. // ttlin4_module_sig_divide = 9, // ttl4输入模块分频信号
  46. // genlockin_module_freq_sig = 10, // genlock输入模块频率信号
  47. // timecodein_module_trigger_sig = 11, // timecode输入模块触发信号
  48. // internal_camera_sync_sig = 12, // 内部相机同步信号
  49. // internal_timecode_trigger_sig = 13, // 内部timecode触发信号
  50. // internal_genlock_freq_sig = 14, // 内部genlock频率信号
  51. // internal_work_state_sig = 15 // 内部工作状态信号
  52. std::string signal_type_to_str(signal_type_t type) {
  53. switch (type) {
  54. case level0:
  55. return "level0";
  56. case level1:
  57. return "level1";
  58. case ttlin1_module_raw_sig:
  59. return "ttlin1_module_raw_sig";
  60. case ttlin1_module_sig_divide:
  61. return "ttlin1_module_sig_divide";
  62. case ttlin2_module_raw_sig:
  63. return "ttlin2_module_raw_sig";
  64. case ttlin2_module_sig_divide:
  65. return "ttlin2_module_sig_divide";
  66. case ttlin3_module_raw_sig:
  67. return "ttlin3_module_raw_sig";
  68. case ttlin3_module_sig_divide:
  69. return "ttlin3_module_sig_divide";
  70. case ttlin4_module_raw_sig:
  71. return "ttlin4_module_raw_sig";
  72. case ttlin4_module_sig_divide:
  73. return "ttlin4_module_sig_divide";
  74. case genlockin_module_freq_sig:
  75. return "genlockin_module_freq_sig";
  76. case timecodein_module_trigger_sig:
  77. return "timecodein_module_trigger_sig";
  78. case internal_camera_sync_sig:
  79. return "internal_camera_sync_sig";
  80. case internal_timecode_trigger_sig:
  81. return "internal_timecode_trigger_sig";
  82. case internal_genlock_freq_sig:
  83. return "internal_genlock_freq_sig";
  84. case internal_work_state_sig:
  85. return "internal_work_state_sig";
  86. default:
  87. return "unknow";
  88. }
  89. return "unknow";
  90. }
  91. signal_type_t str_to_signal_type(std::string type) {
  92. if (type == "level0") return level0;
  93. if (type == "level1") return level1;
  94. if (type == "ttlin1_module_raw_sig") return ttlin1_module_raw_sig;
  95. if (type == "ttlin1_module_sig_divide") return ttlin1_module_sig_divide;
  96. if (type == "ttlin2_module_raw_sig") return ttlin2_module_raw_sig;
  97. if (type == "ttlin2_module_sig_divide") return ttlin2_module_sig_divide;
  98. if (type == "ttlin3_module_raw_sig") return ttlin3_module_raw_sig;
  99. if (type == "ttlin3_module_sig_divide") return ttlin3_module_sig_divide;
  100. if (type == "ttlin4_module_raw_sig") return ttlin4_module_raw_sig;
  101. if (type == "ttlin4_module_sig_divide") return ttlin4_module_sig_divide;
  102. if (type == "genlockin_module_freq_sig") return genlockin_module_freq_sig;
  103. if (type == "timecodein_module_trigger_sig") return timecodein_module_trigger_sig;
  104. if (type == "internal_camera_sync_sig") return internal_camera_sync_sig;
  105. if (type == "internal_timecode_trigger_sig") return internal_timecode_trigger_sig;
  106. if (type == "internal_genlock_freq_sig") return internal_genlock_freq_sig;
  107. if (type == "internal_work_state_sig") return internal_work_state_sig;
  108. return level0;
  109. }
  110. } // namespace xsync_internal_signal
  111. } // namespace iflytop
  112. namespace iflytop {
  113. namespace xsync_ttlout_module {
  114. string output_signal_type_to_str(output_signal_type_t type) {
  115. switch (type) {
  116. case level0:
  117. return "level0";
  118. case level1:
  119. return "level1";
  120. case test_signal:
  121. return "test_signal";
  122. case input_signal:
  123. return "input_signal";
  124. case input_signal_mirror:
  125. return "input_signal_mirror";
  126. case trigger_mode_signal:
  127. return "trigger_mode_signal";
  128. case trigger_mode_signal_mirror:
  129. return "trigger_mode_signal_mirror";
  130. default:
  131. return "unknow";
  132. }
  133. return "unknow";
  134. }
  135. output_signal_type_t str_to_output_signal_type(string type) {
  136. if (type == "level0") return level0;
  137. if (type == "level1") return level1;
  138. if (type == "test_signal") return test_signal;
  139. if (type == "input_signal") return input_signal;
  140. if (type == "input_signal_mirror") return input_signal_mirror;
  141. if (type == "trigger_mode_signal") return trigger_mode_signal;
  142. if (type == "trigger_mode_signal_mirror") return trigger_mode_signal_mirror;
  143. return level0;
  144. }
  145. } // namespace xsync_ttlout_module
  146. } // namespace iflytop
  147. Xsync::Xsync(/* args */) {}
  148. Xsync &Xsync::Ins() {
  149. static Xsync xsync;
  150. return xsync;
  151. }
  152. void Xsync::initialize(I_XSUDPFactory *xsync_udp_factory) { m_xsync_udp_factory = xsync_udp_factory; }
  153. xs_error_code_t Xsync::connect(string xsync_ip) {
  154. lock_guard<recursive_mutex> lock(lock_);
  155. m_xsync_ip = xsync_ip;
  156. disConnect();
  157. /**
  158. * @brief m_xsync_reg_udp
  159. */
  160. xs_error_code_t ecode = kxs_ec_success;
  161. auto xsync_reg_udp = m_xsync_udp_factory->createXSUDP();
  162. ecode = xsync_reg_udp->initialize("0.0.0.0", IFLYTOP_XSYNC_SERVICE_PC_PORT);
  163. if (ecode != kxs_ec_success) {
  164. return ecode;
  165. }
  166. /**
  167. * @brief m_xsync_timecode_udp_listener
  168. */
  169. auto xsync_timecode_udp_listener = m_xsync_udp_factory->createXSUDP();
  170. ecode = xsync_timecode_udp_listener->initialize("0.0.0.0", IFLYTOP_XSYNC_TIMECODE_REPORT_PC_PORT);
  171. if (ecode != kxs_ec_success) {
  172. return ecode;
  173. }
  174. ecode = xsync_timecode_udp_listener->startReceive([this](XsyncNetAdd &from, uint8_t *data, size_t length) { parseTimecodeMsgAndReport(from, data, length); });
  175. if (ecode != kxs_ec_success) {
  176. return ecode;
  177. }
  178. /**
  179. * @brief m_xsync_camera_sync_udp_listener
  180. */
  181. auto xsync_camera_sync_udp_listener = m_xsync_udp_factory->createXSUDP();
  182. ecode = xsync_camera_sync_udp_listener->initialize("0.0.0.0", IFLYTOP_XSYNC_CAMERA_SYNC_PACKET_PC_PORT);
  183. if (ecode != kxs_ec_success) {
  184. return ecode;
  185. }
  186. ecode = xsync_camera_sync_udp_listener->startReceive([this](XsyncNetAdd &from, uint8_t *data, size_t length) { parseCameraSyncMsgAndReport(from, data, length); });
  187. if (ecode != kxs_ec_success) {
  188. return ecode;
  189. }
  190. m_xsync_reg_udp = xsync_reg_udp;
  191. m_xsync_timecode_udp_listener = xsync_timecode_udp_listener;
  192. m_xsync_camera_sync_udp_listener = xsync_camera_sync_udp_listener;
  193. m_net_state = kxsync_net_state_connected;
  194. return ecode;
  195. }
  196. xs_error_code_t Xsync::disConnect() {
  197. lock_guard<recursive_mutex> lock(lock_);
  198. if (m_xsync_reg_udp != nullptr) {
  199. m_xsync_reg_udp->stopReceive();
  200. m_xsync_reg_udp = nullptr;
  201. }
  202. if (m_xsync_timecode_udp_listener != nullptr) {
  203. m_xsync_timecode_udp_listener->stopReceive();
  204. m_xsync_timecode_udp_listener = nullptr;
  205. }
  206. if (m_xsync_camera_sync_udp_listener != nullptr) {
  207. m_xsync_camera_sync_udp_listener->stopReceive();
  208. m_xsync_camera_sync_udp_listener = nullptr;
  209. }
  210. m_net_state = kxsync_net_state_disconnect;
  211. return kxs_ec_success;
  212. }
  213. xsync_net_state_t Xsync::getNetState() { return m_net_state; }
  214. void Xsync::Basic_registerOnTimecodeMsgCallback(xsync_on_timecode_msg_t on_timecode_msg_cb) { m_on_timecode_msg_cb = on_timecode_msg_cb; }
  215. void Xsync::Basic_registerOnCameraSyncMsgCallback(xsync_on_camera_sync_msg_t on_camera_sync_msg_cb) { m_on_camera_sync_msg_cb = on_camera_sync_msg_cb; }
  216. xs_error_code_t Xsync::xsync_send_cmd_block(iflytop_xsync_packet_header_t *cmd, iflytop_xsync_packet_header_t *rx_data, int32_t buffersize, int32_t overtime_ms) {
  217. lock_guard<recursive_mutex> lock(lock_);
  218. if (!m_xsync_reg_udp) return kxs_ec_lose_connect;
  219. m_xsync_reg_udp->clearRxBuffer();
  220. cmd->index = txpacket_index++;
  221. XsyncNetAdd toadd = {m_xsync_ip, IFLYTOP_XSYNC_SERVICE_XSYNC_PORT};
  222. xs_error_code_t ecode = //
  223. m_xsync_reg_udp->sendto(toadd, (const char *)cmd, sizeof(iflytop_xsync_packet_header_t) + cmd->ndata * 4, nullptr);
  224. if (ecode != kxs_ec_success) {
  225. return ecode;
  226. }
  227. XsyncNetAdd fromadd;
  228. while (true) {
  229. // ZLOGI(TAG, "start rx wait for rxdata");
  230. ecode = m_xsync_reg_udp->receive((char *)rx_data, buffersize, fromadd, overtime_ms);
  231. // ZLOGI(TAG, "end rx wait for rxdata");
  232. if (ecode != kxs_ec_success) {
  233. return ecode;
  234. }
  235. if (rx_data->index != cmd->index) {
  236. // ZLOGI(TAG, "packet index error %d %d", cmd->index, rx_data->index);
  237. continue;
  238. }
  239. break;
  240. }
  241. return (xs_error_code_t)rx_data->data[0];
  242. }
  243. xs_error_code_t Xsync::reg_write(uint32_t regadd, uint32_t regvalue, uint32_t &regbackvalue, int32_t overtime_ms) {
  244. /**
  245. * @brief
  246. *
  247. *
  248. * kxsync_packet_type_reg_write
  249. * tx: regadd,regdata
  250. * rx: ecode,regdata
  251. */
  252. uint8_t txdata[128] = {0};
  253. uint8_t rxdata[128] = {0};
  254. iflytop_xsync_packet_header_t *txpacket = (iflytop_xsync_packet_header_t *)txdata;
  255. iflytop_xsync_packet_header_t *rxpacket = (iflytop_xsync_packet_header_t *)rxdata;
  256. txpacket->type = kxsync_packet_type_cmd;
  257. txpacket->index = txpacket_index++;
  258. txpacket->cmd = kxsync_packet_type_reg_write;
  259. txpacket->ndata = 2;
  260. txpacket->data[0] = regadd;
  261. txpacket->data[1] = regvalue;
  262. auto ecode = xsync_send_cmd_block(txpacket, rxpacket, sizeof(rxdata), overtime_ms);
  263. if (ecode != kxs_ec_success) {
  264. return ecode;
  265. }
  266. regbackvalue = rxpacket->data[1];
  267. return ecode;
  268. }
  269. xs_error_code_t Xsync::reg_read(uint32_t regadd, uint32_t &regvalue, int32_t overtime_ms) {
  270. /**
  271. * @brief
  272. *
  273. *
  274. * kxsync_packet_type_reg_write
  275. * tx: regadd,regdata
  276. * rx: ecode,regdata
  277. */
  278. uint8_t txdata[128] = {0};
  279. uint8_t rxdata[128] = {0};
  280. iflytop_xsync_packet_header_t *txpacket = (iflytop_xsync_packet_header_t *)txdata;
  281. iflytop_xsync_packet_header_t *rxpacket = (iflytop_xsync_packet_header_t *)rxdata;
  282. txpacket->type = kxsync_packet_type_cmd;
  283. txpacket->index = txpacket_index++;
  284. txpacket->cmd = kxsync_packet_type_reg_read;
  285. txpacket->ndata = 2;
  286. txpacket->data[0] = regadd;
  287. txpacket->data[1] = regvalue;
  288. auto ecode = xsync_send_cmd_block(txpacket, rxpacket, sizeof(rxdata), overtime_ms);
  289. if (ecode != kxs_ec_success) {
  290. return ecode;
  291. }
  292. regvalue = rxpacket->data[1];
  293. return ecode;
  294. }
  295. xs_error_code_t Xsync::reg_read_muti(uint32_t regadd, uint32_t nreg, vector<uint32_t> &regvalues, int32_t overtime_ms) {
  296. /**
  297. * @brief
  298. *
  299. *
  300. * kxsync_packet_type_reg_read_regs
  301. * tx: regstartadd,nreg
  302. * rx: ecode,regdatas
  303. */
  304. uint8_t txdata[128] = {0};
  305. uint8_t rxdata[1280] = {0};
  306. iflytop_xsync_packet_header_t *txpacket = (iflytop_xsync_packet_header_t *)txdata;
  307. iflytop_xsync_packet_header_t *rxpacket = (iflytop_xsync_packet_header_t *)rxdata;
  308. txpacket->type = kxsync_packet_type_cmd;
  309. txpacket->index = txpacket_index++;
  310. txpacket->cmd = kxsync_packet_type_reg_read_regs;
  311. txpacket->ndata = 2;
  312. txpacket->data[0] = regadd;
  313. txpacket->data[1] = nreg;
  314. auto ecode = xsync_send_cmd_block(txpacket, rxpacket, sizeof(rxdata), overtime_ms);
  315. if (ecode != kxs_ec_success) {
  316. return ecode;
  317. }
  318. if (rxpacket->ndata > 0) {
  319. for (int i = 0; i < rxpacket->ndata - 1; i++) {
  320. regvalues.push_back(rxpacket->data[i + 1]);
  321. }
  322. }
  323. return ecode;
  324. }
  325. void Xsync::parseTimecodeMsgAndReport(XsyncNetAdd &from, uint8_t *data, size_t length) {
  326. //
  327. iflytop_timecode_report_packet_t *packet = (iflytop_timecode_report_packet_t *)data;
  328. xysnc_timecode_t timecode;
  329. /**
  330. * @brief
  331. *
  332. * 01 02 03 04 01 02 03 04
  333. *
  334. */
  335. uint8_t frameuints = packet->timecode0 & 0x0f;
  336. uint8_t frame10s = (packet->timecode0 >> 8) & 0x3;
  337. uint8_t seconduints = (packet->timecode0 >> 16) & 0x0f;
  338. uint8_t second10s = (packet->timecode0 >> 24) & 0x03;
  339. uint8_t minuteuints = packet->timecode1 & 0x0f;
  340. uint8_t minute10s = (packet->timecode1 >> 8) & 0x03;
  341. uint8_t houruints = (packet->timecode1 >> 16) & 0x0f;
  342. uint8_t hour10s = (packet->timecode1 >> 24) & 0x03;
  343. timecode.hour = hour10s * 10 + houruints;
  344. timecode.minute = minute10s * 10 + minuteuints;
  345. timecode.second = second10s * 10 + seconduints;
  346. timecode.frame = frame10s * 10 + frameuints;
  347. if (m_on_timecode_msg_cb) m_on_timecode_msg_cb(&timecode);
  348. }
  349. void Xsync::parseCameraSyncMsgAndReport(XsyncNetAdd &from, uint8_t *data, size_t length) {
  350. uint32_t count = 0;
  351. uint32_t data0 = data[7];
  352. uint32_t data1 = data[6];
  353. uint32_t data2 = data[5];
  354. uint32_t data3 = data[4];
  355. count = data0 + (data1 << 8) + (data2 << 16) + (data3 << 24);
  356. xysnc_camera_sync_data_t camera_sync_data;
  357. camera_sync_data.frameIndex = count;
  358. if (m_on_camera_sync_msg_cb) m_on_camera_sync_msg_cb(&camera_sync_data);
  359. }
  360. // xsync_stm32_action_generator_new_mac, //
  361. // xsync_stm32_action_factory_reset, //
  362. // xsync_stm32_action_Basic_reboot, //
  363. // xsync_stm32_action_storage_cfg,
  364. xs_error_code_t Xsync::Basic_generatorNewMac() { return doaction(xsync_stm32_action_generator_new_mac, 0, nullptr, 2000); }
  365. xs_error_code_t Xsync::Basic_factoryReset() { return doaction(xsync_stm32_action_factory_reset, 0, nullptr, 1000); }
  366. xs_error_code_t Xsync::Basic_reboot() { return doaction(xsync_stm32_action_Basic_reboot, 0, nullptr); }
  367. xs_error_code_t Xsync::storageConfig() { return doaction(xsync_stm32_action_storage_cfg, 0, nullptr, 1000); }
  368. xs_error_code_t Xsync::Basic_changeNetworkConfig(string ip, string mask, string gateway) {
  369. uint32_t ip32 = 0;
  370. uint32_t mask32 = 0;
  371. uint32_t gateway32 = 0;
  372. xs_error_code_t ecode;
  373. bool suc = false;
  374. ip32 = (uint32_t)ipToUint32(ip.c_str(), suc);
  375. if (!suc) return kxs_ec_param_error;
  376. mask32 = (uint32_t)ipToUint32(mask.c_str(), suc);
  377. if (!suc) return kxs_ec_param_error;
  378. gateway32 = (uint32_t)ipToUint32(gateway.c_str(), suc);
  379. if (!suc) return kxs_ec_param_error;
  380. uint32_t readbak = 0;
  381. ecode = reg_write(kxsync_reg_stm32_ip, ip32, readbak);
  382. if (ecode != kxs_ec_success) return ecode;
  383. ecode = reg_write(kxsync_reg_stm32_netmask, mask32, readbak);
  384. if (ecode != kxs_ec_success) return ecode;
  385. ecode = reg_write(kxsync_reg_stm32_gw, gateway32, readbak);
  386. if (ecode != kxs_ec_success) return ecode;
  387. ecode = storageConfig();
  388. if (ecode != kxs_ec_success) return ecode;
  389. return kxs_ec_success;
  390. }
  391. xs_error_code_t Xsync::Basic_clearXsyncCameraSyncIndexCount() {
  392. uint32_t readbak = 0;
  393. return reg_write(kxsync_reg_stm32_camera_sync_signal_count, 0, readbak);
  394. }
  395. xs_error_code_t Xsync::doaction(uint32_t action, uint32_t actionval, uint32_t *ackreturn, int32_t overtime_ms) {
  396. //
  397. uint32_t readbak = 0;
  398. xs_error_code_t ecode;
  399. ecode = reg_write(kxsync_reg_stm32_action_val0, actionval, readbak);
  400. if (ecode != kxs_ec_success) return ecode;
  401. ecode = reg_write(kxsync_reg_stm32_action0, action, readbak, overtime_ms);
  402. if (ecode != kxs_ec_success) return ecode;
  403. if (ackreturn) *ackreturn = readbak;
  404. return ecode;
  405. }
  406. /*******************************************************************************
  407. * TTLOutputModule *
  408. *******************************************************************************/
  409. // .reg0(reg_input_signal_select),
  410. // .reg1(reg_output_signal_select),
  411. // .reg2(reg_config),
  412. // .reg3(reg_pulse_mode_valid_len),
  413. // .reg4(reg_pulse_mode_trigger_delay)
  414. xs_error_code_t Xsync::TTLOutputModule_getRegOff(int32_t index, uint32_t &regadd) {
  415. switch (index) {
  416. case 1:
  417. regadd = REG_ADD_OFF_TTLOUT1;
  418. break;
  419. case 2:
  420. regadd = REG_ADD_OFF_TTLOUT2;
  421. break;
  422. case 3:
  423. regadd = REG_ADD_OFF_TTLOUT3;
  424. break;
  425. case 4:
  426. regadd = REG_ADD_OFF_TTLOUT4;
  427. break;
  428. default:
  429. return kxs_ec_param_error;
  430. }
  431. return kxs_ec_success;
  432. }
  433. xs_error_code_t Xsync::TTLOutputModule_setInputSigType(int32_t index, xsync_internal_signal::signal_type_t source) {
  434. uint32_t regadd = REG_ADD_OFF_TTLOUT1;
  435. xs_error_code_t ecode = kxs_ec_success;
  436. uint32_t readbak = 0;
  437. ecode = TTLOutputModule_getRegOff(index, regadd);
  438. if (ecode != kxs_ec_success) return ecode;
  439. return reg_write(regadd + 0, source, readbak, 10);
  440. }
  441. xs_error_code_t Xsync::TTLOutputModule_getInputSigType(int32_t index, xsync_internal_signal::signal_type_t &source) {
  442. uint32_t regadd = REG_ADD_OFF_TTLOUT1;
  443. xs_error_code_t ecode = kxs_ec_success;
  444. uint32_t readbak = 0;
  445. ecode = TTLOutputModule_getRegOff(index, regadd);
  446. if (ecode != kxs_ec_success) return ecode;
  447. ecode = reg_read(regadd + 0, readbak, 10);
  448. if (ecode != kxs_ec_success) return ecode;
  449. source = (xsync_internal_signal::signal_type_t)readbak;
  450. return ecode;
  451. }
  452. xs_error_code_t Xsync::TTLOutputModule_setOutputSigType(int32_t index, xsync_ttlout_module::output_signal_type_t output_type) {
  453. uint32_t regadd = REG_ADD_OFF_TTLOUT1;
  454. xs_error_code_t ecode = kxs_ec_success;
  455. uint32_t readbak = 0;
  456. ecode = TTLOutputModule_getRegOff(index, regadd);
  457. if (ecode != kxs_ec_success) return ecode;
  458. return reg_write(regadd + 1, output_type, readbak, 10);
  459. }
  460. xs_error_code_t Xsync::TTLOutputModule_getOutputSigType(int32_t index, xsync_ttlout_module::output_signal_type_t &output_type) {
  461. uint32_t regadd = REG_ADD_OFF_TTLOUT1;
  462. xs_error_code_t ecode = kxs_ec_success;
  463. uint32_t readbak = 0;
  464. ecode = TTLOutputModule_getRegOff(index, regadd);
  465. if (ecode != kxs_ec_success) return ecode;
  466. ecode = reg_read(regadd + 1, readbak, 10);
  467. if (ecode != kxs_ec_success) return ecode;
  468. output_type = (xsync_ttlout_module::output_signal_type_t)readbak;
  469. return ecode;
  470. }
  471. xs_error_code_t Xsync::TTLOutputModule_setTriggerModePulseWidth(int32_t index, uint32_t pulse_width_ms) {
  472. uint32_t regadd = REG_ADD_OFF_TTLOUT1;
  473. xs_error_code_t ecode = kxs_ec_success;
  474. uint32_t readbak = 0;
  475. ecode = TTLOutputModule_getRegOff(index, regadd);
  476. if (ecode != kxs_ec_success) return ecode;
  477. uint32_t pluse_width = pulse_width_ms * 1000; // 1MHZ计数
  478. return reg_write(regadd + 3, pluse_width, readbak, 10);
  479. }
  480. xs_error_code_t Xsync::TTLOutputModule_getTriggerModePulseWidth(int32_t index, uint32_t &pulse_width_ms) {
  481. uint32_t regadd = REG_ADD_OFF_TTLOUT1;
  482. xs_error_code_t ecode = kxs_ec_success;
  483. uint32_t readbak = 0;
  484. ecode = TTLOutputModule_getRegOff(index, regadd);
  485. if (ecode != kxs_ec_success) return ecode;
  486. ecode = reg_read(regadd + 3, readbak, 10);
  487. if (ecode != kxs_ec_success) return ecode;
  488. pulse_width_ms = readbak / 1000;
  489. return ecode;
  490. }
  491. xs_error_code_t Xsync::TTLOutputModule_setTriggerModePulseDelay(int32_t index, uint32_t pulse_delay_ms) {
  492. uint32_t regadd = REG_ADD_OFF_TTLOUT1;
  493. xs_error_code_t ecode = kxs_ec_success;
  494. uint32_t readbak = 0;
  495. ecode = TTLOutputModule_getRegOff(index, regadd);
  496. if (ecode != kxs_ec_success) return ecode;
  497. uint32_t pulse_delay = pulse_delay_ms * 1000; // 1MHZ计数
  498. return reg_write(regadd + 4, pulse_delay, readbak, 10);
  499. }
  500. xs_error_code_t Xsync::TTLOutputModule_getTriggerModePulseDelay(int32_t index, uint32_t &pulse_delay_ms) {
  501. uint32_t regadd = REG_ADD_OFF_TTLOUT1;
  502. xs_error_code_t ecode = kxs_ec_success;
  503. uint32_t readbak = 0;
  504. ecode = TTLOutputModule_getRegOff(index, regadd);
  505. if (ecode != kxs_ec_success) return ecode;
  506. ecode = reg_read(regadd + 4, readbak, 10);
  507. if (ecode != kxs_ec_success) return ecode;
  508. pulse_delay_ms = readbak / 1000;
  509. return ecode;
  510. }