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.

1176 lines
38 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
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
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
2 years ago
2 years ago
2 years ago
  1. #include "xsync.hpp"
  2. #include <string.h>
  3. #include <map>
  4. #define ENABLE_LOG
  5. #ifdef ENABLE_LOG
  6. #include "../src/logger.hpp"
  7. #endif
  8. #define TAG "XSYNC"
  9. using namespace xsync;
  10. using namespace std;
  11. /**
  12. * @brief XSYNC协议端口
  13. */
  14. #define IFLYTOP_XSYNC_SERVICE_XSYNC_PORT 19900 // xsync端端口
  15. #define IFLYTOP_XSYNC_SERVICE_PC_PORT 19901 // pc 端端口
  16. #define IFLYTOP_XSYNC_TIMECODE_REPORT_XSYNC_PORT 19902 // xsync端端口
  17. #define IFLYTOP_XSYNC_TIMECODE_REPORT_PC_PORT 19903 // pc端端口
  18. #define IFLYTOP_XSYNC_CAMERA_SYNC_PACKET_XSYNC_PORT 13013 // xsync端端口
  19. #define IFLYTOP_XSYNC_CAMERA_SYNC_PACKET_PC_PORT 13014 // pc端端口
  20. #define DO_XSYNC(exptr) \
  21. { \
  22. xs_error_code_t ecode = exptr; \
  23. if (ecode != kxs_ec_success) return ecode; \
  24. }
  25. static uint32_t ipToUint32(const std::string &ipAddress, bool &suc) {
  26. uint32_t result = 0;
  27. std::istringstream iss(ipAddress);
  28. std::string segment;
  29. int i = 0;
  30. while (std::getline(iss, segment, '.')) {
  31. uint32_t octet = std::stoi(segment);
  32. if (octet > 255) {
  33. suc = false;
  34. return 0;
  35. }
  36. result |= (octet << ((3 - i) * 8));
  37. i++;
  38. }
  39. if (i != 4) {
  40. suc = false;
  41. return 0;
  42. }
  43. suc = true;
  44. uint32_t result_n = 0;
  45. result_n |= ((result & 0xff000000) >> 24);
  46. result_n |= ((result & 0x00ff0000) >> 8);
  47. result_n |= ((result & 0x0000ff00) << 8);
  48. result_n |= ((result & 0x000000ff) << 24);
  49. return result_n;
  50. }
  51. namespace xsync {
  52. namespace ttlout_module {
  53. static map<string, TriggerSigType_t> TriggerSigType2StrMap = {
  54. {"logic0", tri_logic0},
  55. {"logic1", tri_logic1},
  56. {"ttlin1_module_ext", tri_ttlin1_module_ext},
  57. {"ttlin1_module_divide", tri_ttlin1_module_divide},
  58. {"ttlin2_module_ext", tri_ttlin2_module_ext},
  59. {"ttlin2_module_divide", tri_ttlin2_module_divide},
  60. {"ttlin3_module_ext", tri_ttlin3_module_ext},
  61. {"ttlin3_module_divide", tri_ttlin3_module_divide},
  62. {"ttlin4_module_ext", tri_ttlin4_module_ext},
  63. {"ttlin4_module_divide", tri_ttlin4_module_divide},
  64. {"internal_en_flag", tri_internal_en_flag},
  65. {"genlock_frame_sync_ext", tri_genlock_frame_sync_ext},
  66. {"genlock_frame_sync_internal", tri_genlock_frame_sync_internal},
  67. {"timecode_frame_sync_ext", tri_timecode_frame_sync_ext},
  68. {"timecode_frame_sync_internal", tri_timecode_frame_sync_internal},
  69. {"timecode_serial_data_ext", tri_timecode_serial_data_ext},
  70. {"timecode_serial_data_internal", tri_timecode_serial_data_internal},
  71. {"internal_100hz", tri_internal_100hz},
  72. };
  73. static map<string, OutputSigType_t> Str2TriggerSigTypeMap = {
  74. {"logic0", OutSigType_logic0}, //
  75. {"logic1", OutSigType_logic1}, //
  76. {"test_signal", OutSigType_test_signal}, //
  77. {"input_signal", OutSigType_input_signal}, //
  78. {"input_signal_mirror", OutSigType_input_signal_mirror}, //
  79. {"trigger_mode_signal", OutSigType_trigger_mode_signal}, //
  80. {"trigger_mode_signal_mirror", OutSigType_trigger_mode_signal_mirror},
  81. };
  82. string TriggerSigType2Str(TriggerSigType_t type) {
  83. for (auto &item : TriggerSigType2StrMap) {
  84. if (item.second == type) return item.first;
  85. }
  86. return "unkown";
  87. }
  88. TriggerSigType_t Str2TriggerSigType(string type) {
  89. auto it = TriggerSigType2StrMap.find(type);
  90. if (it != TriggerSigType2StrMap.end()) {
  91. return it->second;
  92. }
  93. return tri_logic0;
  94. }
  95. string OutputSigType2Str(OutputSigType_t type) {
  96. for (auto &item : Str2TriggerSigTypeMap) {
  97. if (item.second == type) return item.first;
  98. }
  99. return "unkown";
  100. }
  101. OutputSigType_t Str2OutputSigType(string type) {
  102. auto it = Str2TriggerSigTypeMap.find(type);
  103. if (it != Str2TriggerSigTypeMap.end()) {
  104. return it->second;
  105. }
  106. return OutSigType_logic0;
  107. }
  108. list<string> TriggerSigTypeStrSet() {
  109. list<string> ret;
  110. for (auto &item : TriggerSigType2StrMap) {
  111. ret.push_back(item.first);
  112. }
  113. return ret;
  114. }
  115. list<string> OutputSigTypeStrSet() {
  116. list<string> ret;
  117. for (auto &item : Str2TriggerSigTypeMap) {
  118. ret.push_back(item.first);
  119. }
  120. return ret;
  121. }
  122. } // namespace ttlout_module
  123. namespace sig_generator_module {
  124. static map<string, ControlMode_t> Str2ControlModeMap = {
  125. {"manualTrigger", kControlMode_manualTrigger}, //
  126. {"extTimecodeTrigger", kControlMode_externalTimecodeTrigger},
  127. {"ttl1Trigger", kControlMode_externalTTL1Trigger},
  128. {"ttl2Trigger", kControlMode_externalTTL2Trigger},
  129. {"ttl3Trigger", kControlMode_externalTTL3Trigger},
  130. {"ttl4Trigger", kControlMode_externalTTL4Trigger},
  131. };
  132. string ControlMode2Str(ControlMode_t mode) {
  133. for (auto &item : Str2ControlModeMap) {
  134. if (item.second == mode) return item.first;
  135. }
  136. return "unkown";
  137. }
  138. ControlMode_t Str2ControlMode(string mode) {
  139. auto it = Str2ControlModeMap.find(mode);
  140. if (it != Str2ControlModeMap.end()) {
  141. return it->second;
  142. }
  143. return kControlMode_manualTrigger;
  144. }
  145. list<string> ControlModeStrSet() {
  146. list<string> ret;
  147. for (auto &item : Str2ControlModeMap) {
  148. ret.push_back(item.first);
  149. }
  150. return ret;
  151. }
  152. } // namespace sig_generator_module
  153. static map<string, TimecodeFormat_t> Str2TimecodeFormatMap = {
  154. {"fps2398", TIMECODE_FPS2398}, //
  155. {"fps2400", TIMECODE_FPS2400}, //
  156. {"fps2500", TIMECODE_FPS2500}, //
  157. {"fps2997", TIMECODE_FPS2997}, //
  158. {"fps2997Drop", TIMECODE_FPS2997Drop}, {"fps3000", TIMECODE_FPS3000}, //
  159. };
  160. static map<string, GenlockFormat_t> Str2GenlockFormatMap = {
  161. {"fps2397", GENLOCK_FPS2397}, //
  162. {"fps2398", GENLOCK_FPS2398}, //
  163. {"fps2400", GENLOCK_FPS2400}, //
  164. {"fps2500", GENLOCK_FPS2500}, //
  165. {"fps2997", GENLOCK_FPS2997}, //
  166. {"fps3000", GENLOCK_FPS3000}, //
  167. {"fps5000", GENLOCK_FPS5000}, //
  168. {"fps5994", GENLOCK_FPS5994}, //
  169. {"fps6000", GENLOCK_FPS6000}, //
  170. };
  171. string GenlockFormatToStr(GenlockFormat_t fomrat) {
  172. for (auto &item : Str2GenlockFormatMap) {
  173. if (item.second == fomrat) return item.first;
  174. }
  175. return "unkown";
  176. }
  177. string TimecodeFormatToStr(TimecodeFormat_t fomrat) {
  178. for (auto &item : Str2TimecodeFormatMap) {
  179. if (item.second == fomrat) return item.first;
  180. }
  181. return "unkown";
  182. }
  183. GenlockFormat_t Str2GenlockFormat(string format) {
  184. auto it = Str2GenlockFormatMap.find(format);
  185. if (it != Str2GenlockFormatMap.end()) {
  186. return it->second;
  187. }
  188. return GENLOCK_FPS2397;
  189. }
  190. TimecodeFormat_t Str2TimecodeFormat(string format) {
  191. auto it = Str2TimecodeFormatMap.find(format);
  192. if (it != Str2TimecodeFormatMap.end()) {
  193. return it->second;
  194. }
  195. return TIMECODE_FPS2398;
  196. }
  197. list<string> GenlockFormatStrSet() {
  198. list<string> ret;
  199. for (auto &item : Str2GenlockFormatMap) {
  200. ret.push_back(item.first);
  201. }
  202. return ret;
  203. }
  204. list<string> TimecodeFormatStrSet() {
  205. list<string> ret;
  206. for (auto &item : Str2TimecodeFormatMap) {
  207. ret.push_back(item.first);
  208. }
  209. return ret;
  210. }
  211. string XsyncTimecodeToStr(XsyncTimecode_t timecode) {
  212. char buf[32] = {0};
  213. sprintf(buf, "%02d:%02d:%02d:%02d", timecode.hour, timecode.minute, timecode.second, timecode.frame);
  214. return string(buf);
  215. }
  216. XsyncTimecode_t Str2XsyncTimecode(string timecode) {
  217. XsyncTimecode_t ret;
  218. char buf[128] = {0};
  219. strncpy(buf, timecode.c_str(), 127);
  220. sscanf(buf, "%02d:%02d:%02d:%02d", &ret.hour, &ret.minute, &ret.second, &ret.frame);
  221. return ret;
  222. }
  223. namespace timecode_output_module {
  224. static map<string, TriggerSigType_t> Str2TriggerSigTypeMap = {
  225. {"off", koff}, //
  226. {"ext_timecode_sig", kext_timecode_sig},
  227. {"internal_timecode_sig", kinternal_timecode_sig},
  228. };
  229. string TriggerSigType2Str(TriggerSigType_t type) {
  230. for (auto &item : Str2TriggerSigTypeMap) {
  231. if (item.second == type) return item.first;
  232. }
  233. return "unkown";
  234. }
  235. TriggerSigType_t Str2TriggerSigType(string type) {
  236. auto it = Str2TriggerSigTypeMap.find(type);
  237. if (it != Str2TriggerSigTypeMap.end()) {
  238. return it->second;
  239. }
  240. return koff;
  241. }
  242. list<string> TriggerSigTypeStrSet() {
  243. list<string> ret;
  244. for (auto &item : Str2TriggerSigTypeMap) {
  245. ret.push_back(item.first);
  246. }
  247. return ret;
  248. }
  249. static map<string, OutputSigLevelType_t> Str2OutputSigLevelTypeMap = {
  250. {"line", kline}, //
  251. {"mic", kmic},
  252. };
  253. string OutputSigLevelType2Str(OutputSigLevelType_t type) {
  254. for (auto &item : Str2OutputSigLevelTypeMap) {
  255. if (item.second == type) return item.first;
  256. }
  257. return "unkown";
  258. }
  259. OutputSigLevelType_t Str2OutputSigLevelType(string type) {
  260. auto it = Str2OutputSigLevelTypeMap.find(type);
  261. if (it != Str2OutputSigLevelTypeMap.end()) {
  262. return it->second;
  263. }
  264. return kline;
  265. }
  266. list<string> OutputSigLevelTypeStrSet() {
  267. list<string> ret;
  268. for (auto &item : Str2OutputSigLevelTypeMap) {
  269. ret.push_back(item.first);
  270. }
  271. return ret;
  272. }
  273. } // namespace timecode_output_module
  274. namespace camera_sync_packet_generator_module {
  275. static map<string, TriggerSigType_t> Str2TriggerSigTypeMap = {
  276. {"off", koff}, //
  277. {"internal_genlock_sig", kinternal_genlock_sig},
  278. {"ext_genlock_sig", kext_genlock_sig},
  279. };
  280. string TriggerSigType2Str(TriggerSigType_t type) {
  281. for (auto &item : Str2TriggerSigTypeMap) {
  282. if (item.second == type) return item.first;
  283. }
  284. return "unkown";
  285. }
  286. TriggerSigType_t Str2TriggerSigType(string type) {
  287. auto it = Str2TriggerSigTypeMap.find(type);
  288. if (it != Str2TriggerSigTypeMap.end()) {
  289. return it->second;
  290. }
  291. return koff;
  292. }
  293. list<string> TriggerSigTypeStrSet() {
  294. list<string> ret;
  295. for (auto &item : Str2TriggerSigTypeMap) {
  296. ret.push_back(item.first);
  297. }
  298. return ret;
  299. }
  300. } // namespace camera_sync_packet_generator_module
  301. namespace timecode_input_module {
  302. static map<string, TriggerSigType_t> Str2TriggerSigTypeMap = {
  303. {"off", koff}, //
  304. {"bnc_timecode", kbnc_timecode},
  305. {"headphone_timecode", kheadphone_timecode},
  306. };
  307. string TriggerSigType2Str(TriggerSigType_t type) {
  308. for (auto &item : Str2TriggerSigTypeMap) {
  309. if (item.second == type) return item.first;
  310. }
  311. return "unkown";
  312. }
  313. TriggerSigType_t Str2TriggerSigType(string type) {
  314. auto it = Str2TriggerSigTypeMap.find(type);
  315. if (it != Str2TriggerSigTypeMap.end()) {
  316. return it->second;
  317. }
  318. return koff;
  319. }
  320. list<string> TriggerSigTypeStrSet() {
  321. list<string> ret;
  322. for (auto &item : Str2TriggerSigTypeMap) {
  323. ret.push_back(item.first);
  324. }
  325. return ret;
  326. }
  327. } // namespace timecode_input_module
  328. } // namespace xsync
  329. static XsyncTimecode_t timecode64ToXsyncTimeCode(Timecode64_t tc64) {
  330. uint8_t frameuints = tc64.tc0 & 0x0f;
  331. uint8_t frame10s = (tc64.tc0 >> 8) & 0x3;
  332. uint8_t seconduints = (tc64.tc0 >> 16) & 0x0f;
  333. uint8_t second10s = (tc64.tc0 >> 24) & 0x07;
  334. uint8_t minuteuints = tc64.tc1 & 0x0f;
  335. uint8_t minute10s = (tc64.tc1 >> 8) & 0x07;
  336. uint8_t houruints = (tc64.tc1 >> 16) & 0x0f;
  337. uint8_t hour10s = (tc64.tc1 >> 24) & 0x03;
  338. XsyncTimecode_t timecode;
  339. timecode.hour = hour10s * 10 + houruints;
  340. timecode.minute = minute10s * 10 + minuteuints;
  341. timecode.second = second10s * 10 + seconduints;
  342. timecode.frame = frame10s * 10 + frameuints;
  343. return timecode;
  344. }
  345. static Timecode64_t timecodeTo64(XsyncTimecode_t tc) {
  346. Timecode64_t tc64;
  347. uint32_t frameuints = tc.frame % 10;
  348. uint32_t frame10s = tc.frame / 10;
  349. uint32_t seconduints = tc.second % 10;
  350. uint32_t second10s = tc.second / 10;
  351. uint32_t minuteuints = tc.minute % 10;
  352. uint32_t minute10s = tc.minute / 10;
  353. uint32_t houruints = tc.hour % 10;
  354. uint32_t hour10s = tc.hour / 10;
  355. tc64.tc0 = frameuints + (frame10s << 8) + (seconduints << 16) + (second10s << 24);
  356. tc64.tc1 = minuteuints + (minute10s << 8) + (houruints << 16) + (hour10s << 24);
  357. return tc64;
  358. }
  359. /*******************************************************************************
  360. * Xsync *
  361. *******************************************************************************/
  362. Xsync::Xsync(/* args */) {}
  363. Xsync &Xsync::Ins() {
  364. static Xsync xsync;
  365. return xsync;
  366. }
  367. void Xsync::initialize(I_XSUDPFactory *xsync_udp_factory) { m_xsync_udp_factory = xsync_udp_factory; }
  368. xs_error_code_t Xsync::connect(string xsync_ip) {
  369. lock_guard<recursive_mutex> lock(lock_);
  370. m_xsync_ip = xsync_ip;
  371. disConnect();
  372. /**
  373. * @brief m_xsync_reg_udp
  374. */
  375. xs_error_code_t ecode = kxs_ec_success;
  376. auto xsync_reg_udp = m_xsync_udp_factory->createXSUDP();
  377. ecode = xsync_reg_udp->initialize("0.0.0.0", IFLYTOP_XSYNC_SERVICE_PC_PORT);
  378. if (ecode != kxs_ec_success) {
  379. return ecode;
  380. }
  381. /**
  382. * @brief m_xsync_timecode_udp_listener
  383. */
  384. auto xsync_timecode_udp_listener = m_xsync_udp_factory->createXSUDP();
  385. ecode = xsync_timecode_udp_listener->initialize("0.0.0.0", IFLYTOP_XSYNC_TIMECODE_REPORT_PC_PORT);
  386. if (ecode != kxs_ec_success) {
  387. return ecode;
  388. }
  389. ecode = xsync_timecode_udp_listener->startReceive([this](XsyncNetAdd &from, uint8_t *data, size_t length) { parseTimecodeMsgAndReport(from, data, length); });
  390. if (ecode != kxs_ec_success) {
  391. return ecode;
  392. }
  393. /**
  394. * @brief m_xsync_camera_sync_udp_listener
  395. */
  396. auto xsync_camera_sync_udp_listener = m_xsync_udp_factory->createXSUDP();
  397. ecode = xsync_camera_sync_udp_listener->initialize("0.0.0.0", IFLYTOP_XSYNC_CAMERA_SYNC_PACKET_PC_PORT);
  398. if (ecode != kxs_ec_success) {
  399. return ecode;
  400. }
  401. ecode = xsync_camera_sync_udp_listener->startReceive([this](XsyncNetAdd &from, uint8_t *data, size_t length) { parseCameraSyncMsgAndReport(from, data, length); });
  402. if (ecode != kxs_ec_success) {
  403. return ecode;
  404. }
  405. m_xsync_reg_udp = xsync_reg_udp;
  406. m_xsync_timecode_udp_listener = xsync_timecode_udp_listener;
  407. m_xsync_camera_sync_udp_listener = xsync_camera_sync_udp_listener;
  408. m_net_state = kxsync_net_state_connected;
  409. return ecode;
  410. }
  411. xs_error_code_t Xsync::disConnect() {
  412. lock_guard<recursive_mutex> lock(lock_);
  413. if (m_xsync_reg_udp != nullptr) {
  414. m_xsync_reg_udp->stopReceive();
  415. m_xsync_reg_udp = nullptr;
  416. }
  417. if (m_xsync_timecode_udp_listener != nullptr) {
  418. m_xsync_timecode_udp_listener->stopReceive();
  419. m_xsync_timecode_udp_listener = nullptr;
  420. }
  421. if (m_xsync_camera_sync_udp_listener != nullptr) {
  422. m_xsync_camera_sync_udp_listener->stopReceive();
  423. m_xsync_camera_sync_udp_listener = nullptr;
  424. }
  425. m_net_state = kxsync_net_state_disconnect;
  426. return kxs_ec_success;
  427. }
  428. xsync_net_state_t Xsync::getNetState() { return m_net_state; }
  429. void Xsync::Basic_registerOnTimecodeMsgCallback(xsync_on_timecode_msg_t on_timecode_msg_cb) { m_on_timecode_msg_cb = on_timecode_msg_cb; }
  430. 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; }
  431. void Xsync::Basic_registerOnWorkstateChangeMsgCallback(xsync_on_workstate_change_msg_t on_workstate_change_msg_cb) { m_on_workstate_change_msg_cb = on_workstate_change_msg_cb; }
  432. 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) {
  433. lock_guard<recursive_mutex> lock(lock_);
  434. if (!m_xsync_reg_udp) return kxs_ec_lose_connect;
  435. m_xsync_reg_udp->clearRxBuffer();
  436. cmd->index = txpacket_index++;
  437. XsyncNetAdd toadd = {m_xsync_ip, IFLYTOP_XSYNC_SERVICE_XSYNC_PORT};
  438. xs_error_code_t ecode = //
  439. m_xsync_reg_udp->sendto(toadd, (const char *)cmd, sizeof(iflytop_xsync_packet_header_t) + cmd->ndata * 4, nullptr);
  440. if (ecode != kxs_ec_success) {
  441. return ecode;
  442. }
  443. XsyncNetAdd fromadd;
  444. while (true) {
  445. // ZLOGI(TAG, "start rx wait for rxdata");
  446. ecode = m_xsync_reg_udp->receive((char *)rx_data, buffersize, fromadd, overtime_ms);
  447. // ZLOGI(TAG, "end rx wait for rxdata");
  448. if (ecode != kxs_ec_success) {
  449. return ecode;
  450. }
  451. if (rx_data->index != cmd->index) {
  452. // ZLOGI(TAG, "packet index error %d %d", cmd->index, rx_data->index);
  453. continue;
  454. }
  455. break;
  456. }
  457. return (xs_error_code_t)rx_data->data[0];
  458. }
  459. xs_error_code_t Xsync::reg_write(uint32_t regadd, uint32_t regvalue, uint32_t &regbackvalue, int32_t overtime_ms) {
  460. /**
  461. * @brief
  462. *
  463. *
  464. * kxsync_packet_type_reg_write
  465. * tx: regadd,regdata
  466. * rx: ecode,regdata
  467. */
  468. uint8_t txdata[128] = {0};
  469. uint8_t rxdata[128] = {0};
  470. iflytop_xsync_packet_header_t *txpacket = (iflytop_xsync_packet_header_t *)txdata;
  471. iflytop_xsync_packet_header_t *rxpacket = (iflytop_xsync_packet_header_t *)rxdata;
  472. txpacket->type = kxsync_packet_type_cmd;
  473. txpacket->index = txpacket_index++;
  474. txpacket->cmd = kxsync_packet_type_reg_write;
  475. txpacket->ndata = 2;
  476. txpacket->data[0] = regadd;
  477. txpacket->data[1] = regvalue;
  478. auto ecode = xsync_send_cmd_block(txpacket, rxpacket, sizeof(rxdata), overtime_ms);
  479. if (ecode != kxs_ec_success) {
  480. return ecode;
  481. }
  482. regbackvalue = rxpacket->data[1];
  483. return ecode;
  484. }
  485. xs_error_code_t Xsync::reg_read(uint32_t regadd, uint32_t &regvalue, int32_t overtime_ms) {
  486. /**
  487. * @brief
  488. *
  489. *
  490. * kxsync_packet_type_reg_write
  491. * tx: regadd,regdata
  492. * rx: ecode,regdata
  493. */
  494. uint8_t txdata[128] = {0};
  495. uint8_t rxdata[128] = {0};
  496. iflytop_xsync_packet_header_t *txpacket = (iflytop_xsync_packet_header_t *)txdata;
  497. iflytop_xsync_packet_header_t *rxpacket = (iflytop_xsync_packet_header_t *)rxdata;
  498. txpacket->type = kxsync_packet_type_cmd;
  499. txpacket->index = txpacket_index++;
  500. txpacket->cmd = kxsync_packet_type_reg_read;
  501. txpacket->ndata = 2;
  502. txpacket->data[0] = regadd;
  503. txpacket->data[1] = regvalue;
  504. auto ecode = xsync_send_cmd_block(txpacket, rxpacket, sizeof(rxdata), overtime_ms);
  505. if (ecode != kxs_ec_success) {
  506. return ecode;
  507. }
  508. regvalue = rxpacket->data[1];
  509. return ecode;
  510. }
  511. xs_error_code_t Xsync::reg_read_muti(uint32_t regadd, uint32_t nreg, vector<uint32_t> &regvalues, int32_t overtime_ms) {
  512. /**
  513. * @brief
  514. *
  515. *
  516. * kxsync_packet_type_reg_read_regs
  517. * tx: regstartadd,nreg
  518. * rx: ecode,regdatas
  519. */
  520. uint8_t txdata[128] = {0};
  521. uint8_t rxdata[1280] = {0};
  522. iflytop_xsync_packet_header_t *txpacket = (iflytop_xsync_packet_header_t *)txdata;
  523. iflytop_xsync_packet_header_t *rxpacket = (iflytop_xsync_packet_header_t *)rxdata;
  524. txpacket->type = kxsync_packet_type_cmd;
  525. txpacket->index = txpacket_index++;
  526. txpacket->cmd = kxsync_packet_type_reg_read_regs;
  527. txpacket->ndata = 2;
  528. txpacket->data[0] = regadd;
  529. txpacket->data[1] = nreg;
  530. auto ecode = xsync_send_cmd_block(txpacket, rxpacket, sizeof(rxdata), overtime_ms);
  531. if (ecode != kxs_ec_success) {
  532. return ecode;
  533. }
  534. if (rxpacket->ndata > 0) {
  535. for (int i = 0; i < rxpacket->ndata - 1; i++) {
  536. regvalues.push_back(rxpacket->data[i + 1]);
  537. }
  538. }
  539. return ecode;
  540. }
  541. void Xsync::parseTimecodeMsgAndReport(XsyncNetAdd &from, uint8_t *data, size_t length) {
  542. iflytop_xsync_event_report_packet_t *packet = (iflytop_xsync_event_report_packet_t *)data;
  543. if (packet->eventid == ktimecode_report_event) {
  544. Timecode64_t tc64;
  545. tc64.tc0 = packet->data[0];
  546. tc64.tc1 = packet->data[1];
  547. XsyncTimecode_t timecode = timecode64ToXsyncTimeCode(tc64);
  548. if (m_on_timecode_msg_cb) m_on_timecode_msg_cb(&timecode);
  549. } else if (packet->eventid == kxsync_work_state_report_event) {
  550. // 信号发生器状态改变
  551. if (m_on_workstate_change_msg_cb) m_on_workstate_change_msg_cb(packet->data[0]);
  552. }
  553. }
  554. void Xsync::parseCameraSyncMsgAndReport(XsyncNetAdd &from, uint8_t *data, size_t length) {
  555. uint32_t count = 0;
  556. uint32_t data0 = data[7];
  557. uint32_t data1 = data[6];
  558. uint32_t data2 = data[5];
  559. uint32_t data3 = data[4];
  560. count = data0 + (data1 << 8) + (data2 << 16) + (data3 << 24);
  561. xysnc_camera_sync_data_t camera_sync_data;
  562. camera_sync_data.frameIndex = count;
  563. if (m_on_camera_sync_msg_cb) m_on_camera_sync_msg_cb(&camera_sync_data);
  564. }
  565. xs_error_code_t Xsync::Basic_generatorNewMac() { return doaction(xsync_stm32_action_generator_new_mac, 0, nullptr, 2000); }
  566. xs_error_code_t Xsync::Basic_factoryReset() { return doaction(xsync_stm32_action_factory_reset, 0, nullptr, 1000); }
  567. xs_error_code_t Xsync::Basic_reboot() { return doaction(xsync_stm32_action_Basic_reboot, 0, nullptr); }
  568. xs_error_code_t Xsync::storageConfig() { return doaction(xsync_stm32_action_storage_cfg, 0, nullptr, 1000); }
  569. xs_error_code_t Xsync::Basic_changeNetworkConfig(string ip, string mask, string gateway) {
  570. uint32_t ip32 = 0;
  571. uint32_t mask32 = 0;
  572. uint32_t gateway32 = 0;
  573. xs_error_code_t ecode;
  574. bool suc = false;
  575. ip32 = (uint32_t)ipToUint32(ip.c_str(), suc);
  576. if (!suc) return kxs_ec_param_error;
  577. mask32 = (uint32_t)ipToUint32(mask.c_str(), suc);
  578. if (!suc) return kxs_ec_param_error;
  579. gateway32 = (uint32_t)ipToUint32(gateway.c_str(), suc);
  580. if (!suc) return kxs_ec_param_error;
  581. uint32_t readbak = 0;
  582. ecode = reg_write(reg::kstm32_ip, ip32, readbak);
  583. if (ecode != kxs_ec_success) return ecode;
  584. ecode = reg_write(reg::kstm32_netmask, mask32, readbak);
  585. if (ecode != kxs_ec_success) return ecode;
  586. ecode = reg_write(reg::kstm32_gw, gateway32, readbak);
  587. if (ecode != kxs_ec_success) return ecode;
  588. ecode = storageConfig();
  589. if (ecode != kxs_ec_success) return ecode;
  590. return kxs_ec_success;
  591. }
  592. xs_error_code_t Xsync::Basic_clearXsyncCameraSyncIndexCount() {
  593. uint32_t readbak = 0;
  594. return reg_write(reg::kstm32_camera_sync_signal_count, 0, readbak);
  595. }
  596. xs_error_code_t Xsync::doaction(uint32_t action, uint32_t actionval, uint32_t *ackreturn, int32_t overtime_ms) {
  597. //
  598. uint32_t readbak = 0;
  599. xs_error_code_t ecode;
  600. ecode = reg_write(reg::kstm32_action_val0, actionval, readbak);
  601. if (ecode != kxs_ec_success) return ecode;
  602. ecode = reg_write(reg::kstm32_action0, action, readbak, overtime_ms);
  603. if (ecode != kxs_ec_success) return ecode;
  604. if (ackreturn) *ackreturn = readbak;
  605. return ecode;
  606. }
  607. xs_error_code_t Xsync::Basic_setGenlockFormat(GenlockFormat_t format) {
  608. DO_XSYNC(SigGenerator_setGenlockFormat(format));
  609. return kxs_ec_success;
  610. }
  611. xs_error_code_t Xsync::Basic_getGenlockFormat(GenlockFormat_t &format) {
  612. DO_XSYNC(SigGenerator_getGenlockFormat(format));
  613. return kxs_ec_success;
  614. }
  615. xs_error_code_t Xsync::Basic_setTimecodeFormat(TimecodeFormat_t format) {
  616. uint32_t readbak = 0;
  617. DO_XSYNC(reg_write(reg::kSigGenerator_timecode_format, format, readbak, 10));
  618. DO_XSYNC(reg_write(reg::ktimecode_in_timecode_format, format, readbak, 10));
  619. // DO_XSYNC(reg_write(reg::ktimecode_out_timecode_format, format, readbak, 10)); //readonly
  620. return kxs_ec_success;
  621. }
  622. // xs_error_code_t Xsync::Basic_getTimecodeFormat(TimecodeFormat_t &format) {
  623. // DO_XSYNC(SigGenerator_getTimecodeFormat(format));
  624. // return kxs_ec_success;
  625. // }
  626. /*******************************************************************************
  627. * TTLOutputModule *
  628. *******************************************************************************/
  629. xs_error_code_t Xsync::TTLOutputModule_setInputSigType(int32_t index, ttlout_module::TriggerSigType_t source) {
  630. xs_error_code_t ecode = kxs_ec_success;
  631. uint32_t readbak = 0;
  632. uint32_t regAdd = 0;
  633. if (index == 1) {
  634. regAdd = reg::kttlout1_input_sig_slt;
  635. } else if (index == 2) {
  636. regAdd = reg::kttlout2_input_sig_slt;
  637. } else if (index == 3) {
  638. regAdd = reg::kttlout3_input_sig_slt;
  639. } else if (index == 4) {
  640. regAdd = reg::kttlout4_input_sig_slt;
  641. } else {
  642. return kxs_ec_param_error;
  643. }
  644. return reg_write(regAdd, source, readbak, 10);
  645. }
  646. xs_error_code_t Xsync::TTLOutputModule_getInputSigType(int32_t index, ttlout_module::TriggerSigType_t &source) {
  647. xs_error_code_t ecode = kxs_ec_success;
  648. uint32_t readbak = 0;
  649. uint32_t regAdd = 0;
  650. if (index == 1) {
  651. regAdd = reg::kttlout1_input_sig_slt;
  652. } else if (index == 2) {
  653. regAdd = reg::kttlout2_input_sig_slt;
  654. } else if (index == 3) {
  655. regAdd = reg::kttlout3_input_sig_slt;
  656. } else if (index == 4) {
  657. regAdd = reg::kttlout4_input_sig_slt;
  658. } else {
  659. return kxs_ec_param_error;
  660. }
  661. ecode = reg_read(regAdd, readbak, 10);
  662. if (ecode != kxs_ec_success) return ecode;
  663. source = (ttlout_module::TriggerSigType_t)readbak;
  664. return ecode;
  665. }
  666. xs_error_code_t Xsync::TTLOutputModule_setOutputSigType(int32_t index, ttlout_module::OutputSigType_t output_type) {
  667. xs_error_code_t ecode = kxs_ec_success;
  668. uint32_t readbak = 0;
  669. uint32_t regAdd = 0;
  670. if (index == 1) {
  671. regAdd = reg::kttlout1_output_sig_slt;
  672. } else if (index == 2) {
  673. regAdd = reg::kttlout2_output_sig_slt;
  674. } else if (index == 3) {
  675. regAdd = reg::kttlout3_output_sig_slt;
  676. } else if (index == 4) {
  677. regAdd = reg::kttlout4_output_sig_slt;
  678. } else {
  679. return kxs_ec_param_error;
  680. }
  681. return reg_write(regAdd, output_type, readbak, 10);
  682. }
  683. xs_error_code_t Xsync::TTLOutputModule_getOutputSigType(int32_t index, ttlout_module::OutputSigType_t &output_type) {
  684. xs_error_code_t ecode = kxs_ec_success;
  685. uint32_t readbak = 0;
  686. uint32_t regAdd = 0;
  687. if (index == 1) {
  688. regAdd = reg::kttlout1_output_sig_slt;
  689. } else if (index == 2) {
  690. regAdd = reg::kttlout2_output_sig_slt;
  691. } else if (index == 3) {
  692. regAdd = reg::kttlout3_output_sig_slt;
  693. } else if (index == 4) {
  694. regAdd = reg::kttlout4_output_sig_slt;
  695. } else {
  696. return kxs_ec_param_error;
  697. }
  698. ecode = reg_read(regAdd, readbak, 10);
  699. if (ecode != kxs_ec_success) return ecode;
  700. output_type = (ttlout_module::OutputSigType_t)readbak;
  701. return ecode;
  702. }
  703. xs_error_code_t Xsync::TTLOutputModule_setTriggerModePulseWidth(int32_t index, uint32_t pulse_width_ms) {
  704. xs_error_code_t ecode = kxs_ec_success;
  705. uint32_t readbak = 0;
  706. uint32_t regAdd = 0;
  707. if (index == 1) {
  708. regAdd = reg::kttlout1_pulse_mode_duration;
  709. } else if (index == 2) {
  710. regAdd = reg::kttlout2_pulse_mode_duration;
  711. } else if (index == 3) {
  712. regAdd = reg::kttlout3_pulse_mode_duration;
  713. } else if (index == 4) {
  714. regAdd = reg::kttlout4_pulse_mode_duration;
  715. } else {
  716. return kxs_ec_param_error;
  717. }
  718. uint32_t pluse_width = pulse_width_ms * 1000; // 1MHZ计数
  719. return reg_write(regAdd, pluse_width, readbak, 10);
  720. }
  721. xs_error_code_t Xsync::TTLOutputModule_getTriggerModePulseWidth(int32_t index, uint32_t &pulse_width_ms) {
  722. xs_error_code_t ecode = kxs_ec_success;
  723. uint32_t regAdd = 0;
  724. uint32_t readbak = 0;
  725. if (index == 1) {
  726. regAdd = reg::kttlout1_pulse_mode_duration;
  727. } else if (index == 2) {
  728. regAdd = reg::kttlout2_pulse_mode_duration;
  729. } else if (index == 3) {
  730. regAdd = reg::kttlout3_pulse_mode_duration;
  731. } else if (index == 4) {
  732. regAdd = reg::kttlout4_pulse_mode_duration;
  733. } else {
  734. return kxs_ec_param_error;
  735. }
  736. ecode = reg_read(regAdd, regAdd, 10);
  737. if (ecode != kxs_ec_success) return ecode;
  738. pulse_width_ms = readbak / 1000;
  739. return ecode;
  740. }
  741. xs_error_code_t Xsync::TTLOutputModule_setTriggerModePulseDelay(int32_t index, uint32_t pulse_delay_ms) {
  742. xs_error_code_t ecode = kxs_ec_success;
  743. uint32_t regAdd = 0;
  744. uint32_t readbak = 0;
  745. if (index == 1) {
  746. regAdd = reg::kttlout1_pulse_mode_delay;
  747. } else if (index == 2) {
  748. regAdd = reg::kttlout2_pulse_mode_delay;
  749. } else if (index == 3) {
  750. regAdd = reg::kttlout3_pulse_mode_delay;
  751. } else if (index == 4) {
  752. regAdd = reg::kttlout4_pulse_mode_delay;
  753. } else {
  754. return kxs_ec_param_error;
  755. }
  756. uint32_t pulse_delay = pulse_delay_ms * 1000; // 1MHZ计数
  757. return reg_write(regAdd, pulse_delay, readbak, 10);
  758. }
  759. xs_error_code_t Xsync::TTLOutputModule_getTriggerModePulseDelay(int32_t index, uint32_t &pulse_delay_ms) {
  760. xs_error_code_t ecode = kxs_ec_success;
  761. uint32_t regAdd = 0;
  762. uint32_t readbak = 0;
  763. if (index == 1) {
  764. regAdd = reg::kttlout1_pulse_mode_delay;
  765. } else if (index == 2) {
  766. regAdd = reg::kttlout2_pulse_mode_delay;
  767. } else if (index == 3) {
  768. regAdd = reg::kttlout3_pulse_mode_delay;
  769. } else if (index == 4) {
  770. regAdd = reg::kttlout4_pulse_mode_delay;
  771. } else {
  772. return kxs_ec_param_error;
  773. }
  774. ecode = reg_read(regAdd, readbak, 10);
  775. if (ecode != kxs_ec_success) return ecode;
  776. pulse_delay_ms = readbak / 1000;
  777. return ecode;
  778. }
  779. xs_error_code_t Xsync::SigGenerator_setControlMode(sig_generator_module::ControlMode_t mode) {
  780. uint32_t readbak = 0;
  781. return reg_write(reg::kSigGenerator_ctl, mode, readbak, 10);
  782. }
  783. xs_error_code_t Xsync::SigGenerator_getControlMode(sig_generator_module::ControlMode_t &mode) {
  784. uint32_t readbak = 0;
  785. auto ecode = reg_read(reg::kSigGenerator_ctl, readbak, 10);
  786. if (ecode != kxs_ec_success) return ecode;
  787. mode = (sig_generator_module::ControlMode_t)readbak;
  788. return ecode;
  789. }
  790. xs_error_code_t Xsync::SigGenerator_manualStart() {
  791. uint32_t readbak = 0;
  792. return reg_write(reg::kSigGenerator_control_trigger_reg, 1, readbak, 10);
  793. }
  794. xs_error_code_t Xsync::SigGenerator_manualStop() {
  795. uint32_t readbak = 0;
  796. return reg_write(reg::kSigGenerator_control_trigger_reg, 0, readbak, 10);
  797. }
  798. xs_error_code_t Xsync::SigGenerator_setTimecode(XsyncTimecode_t timecode) {
  799. uint32_t readbak = 0;
  800. xs_error_code_t ecode = kxs_ec_success;
  801. Timecode64_t tc64 = timecodeTo64(timecode);
  802. ecode = reg_write(reg::kSigGenerator_timecode0, tc64.tc0, readbak, 10);
  803. if (ecode != kxs_ec_success) return ecode;
  804. ecode = reg_write(reg::kSigGenerator_timecode1, tc64.tc1, readbak, 10);
  805. if (ecode != kxs_ec_success) return ecode;
  806. return ecode;
  807. }
  808. xs_error_code_t Xsync::SigGenerator_getTimecode(XsyncTimecode_t &timecode) {
  809. uint32_t readbak = 0;
  810. xs_error_code_t ecode = kxs_ec_success;
  811. uint32_t tc0 = 0;
  812. uint32_t tc1 = 0;
  813. ecode = reg_read(reg::kSigGenerator_timecode0, tc0, 10);
  814. if (ecode != kxs_ec_success) return ecode;
  815. ecode = reg_read(reg::kSigGenerator_timecode1, tc1, 10);
  816. if (ecode != kxs_ec_success) return ecode;
  817. Timecode64_t tc64;
  818. tc64.tc0 = tc0;
  819. tc64.tc1 = tc1;
  820. timecode = timecode64ToXsyncTimeCode(tc64);
  821. return ecode;
  822. }
  823. xs_error_code_t Xsync::SigGenerator_setAutoStartTimecode(XsyncTimecode_t timecode) {
  824. uint32_t readbak = 0;
  825. xs_error_code_t ecode = kxs_ec_success;
  826. Timecode64_t tc64 = timecodeTo64(timecode);
  827. ecode = reg_write(reg::kSigGenerator_timecode_start0, tc64.tc0, readbak, 10);
  828. if (ecode != kxs_ec_success) return ecode;
  829. ecode = reg_write(reg::kSigGenerator_timecode_start1, tc64.tc1, readbak, 10);
  830. if (ecode != kxs_ec_success) return ecode;
  831. return ecode;
  832. }
  833. xs_error_code_t Xsync::SigGenerator_getAutoStartTimecode(XsyncTimecode_t &timecode) {
  834. uint32_t readbak = 0;
  835. xs_error_code_t ecode = kxs_ec_success;
  836. uint32_t tc0 = 0;
  837. uint32_t tc1 = 0;
  838. ecode = reg_read(reg::kSigGenerator_timecode_start0, tc0, 10);
  839. if (ecode != kxs_ec_success) return ecode;
  840. ecode = reg_read(reg::kSigGenerator_timecode_start1, tc1, 10);
  841. if (ecode != kxs_ec_success) return ecode;
  842. Timecode64_t tc64;
  843. tc64.tc0 = tc0;
  844. tc64.tc1 = tc1;
  845. timecode = timecode64ToXsyncTimeCode(tc64);
  846. return ecode;
  847. }
  848. xs_error_code_t Xsync::SigGenerator_getWorkState(uint32_t &work_state) {
  849. uint32_t readbak = 0;
  850. auto ecode = reg_read(reg::kSigGenerator_work_state, readbak, 10);
  851. if (ecode != kxs_ec_success) return ecode;
  852. work_state = readbak;
  853. return ecode;
  854. }
  855. xs_error_code_t Xsync::SigGenerator_setGenlockFormat(GenlockFormat_t format) {
  856. uint32_t readbak = 0;
  857. return reg_write(reg::kSigGenerator_genlock_format, format, readbak, 10);
  858. }
  859. xs_error_code_t Xsync::SigGenerator_getGenlockFormat(GenlockFormat_t &format) {
  860. uint32_t readbak = 0;
  861. auto ecode = reg_read(reg::kSigGenerator_genlock_format, readbak, 10);
  862. if (ecode != kxs_ec_success) return ecode;
  863. format = (GenlockFormat_t)readbak;
  864. return ecode;
  865. }
  866. xs_error_code_t Xsync::SigGenerator_setTimecodeFormat(TimecodeFormat_t format) { return Basic_setTimecodeFormat(format); }
  867. xs_error_code_t Xsync::SigGenerator_getTimecodeFormat(TimecodeFormat_t &format) {
  868. uint32_t readbak = 0;
  869. auto ecode = reg_read(reg::kSigGenerator_timecode_format, readbak, 10);
  870. if (ecode != kxs_ec_success) return ecode;
  871. format = (TimecodeFormat_t)readbak;
  872. return ecode;
  873. }
  874. xs_error_code_t Xsync::TimecodeOutputModule_setTimecodeSrcSelect(timecode_output_module::TriggerSigType_t timecode_select) {
  875. uint32_t readbak = 0;
  876. DO_XSYNC(reg_write(reg::ktimecode_out_timecode_select, timecode_select, readbak, 10));
  877. return kxs_ec_success;
  878. }
  879. xs_error_code_t Xsync::TimecodeOutputModule_getTimecodeSrcSelect(timecode_output_module::TriggerSigType_t &timecode_select) {
  880. uint32_t readbak = 0;
  881. DO_XSYNC(reg_read(reg::ktimecode_out_timecode_select, readbak, 10));
  882. timecode_select = (timecode_output_module::TriggerSigType_t)readbak;
  883. return kxs_ec_success;
  884. }
  885. xs_error_code_t Xsync::TimecodeOutputModule_getTimecodeNow(XsyncTimecode_t &timecode_now) {
  886. uint32_t readbak = 0;
  887. xs_error_code_t ecode = kxs_ec_success;
  888. uint32_t tc0 = 0;
  889. uint32_t tc1 = 0;
  890. ecode = reg_read(reg::ktimecode_out_timecode0, tc0, 10);
  891. if (ecode != kxs_ec_success) return ecode;
  892. ecode = reg_read(reg::ktimecode_out_timecode1, tc1, 10);
  893. if (ecode != kxs_ec_success) return ecode;
  894. Timecode64_t tc64;
  895. tc64.tc0 = tc0;
  896. tc64.tc1 = tc1;
  897. timecode_now = timecode64ToXsyncTimeCode(tc64);
  898. return ecode;
  899. }
  900. xs_error_code_t Xsync::TimecodeOutputModule_getTimecodeFormat(TimecodeFormat_t &timecode_format) {
  901. uint32_t readbak = 0;
  902. xs_error_code_t ecode = kxs_ec_success;
  903. ecode = reg_read(reg::ktimecode_out_timecode_format, readbak, 10);
  904. if (ecode != kxs_ec_success) return ecode;
  905. timecode_format = (TimecodeFormat_t)readbak;
  906. return ecode;
  907. }
  908. xs_error_code_t Xsync::TimecodeOutputModule_setBncOutputLevel(timecode_output_module::OutputSigLevelType_t &level) {
  909. uint32_t readbak = 0;
  910. DO_XSYNC(reg_write(reg::ktimecode_out_bnc_outut_level_select, level, readbak, 10));
  911. return kxs_ec_success;
  912. }
  913. xs_error_code_t Xsync::TimecodeOutputModule_getBncOutputLevel(timecode_output_module::OutputSigLevelType_t &level) {
  914. uint32_t readbak = 0;
  915. DO_XSYNC(reg_read(reg::ktimecode_out_bnc_outut_level_select, readbak, 10));
  916. level = (timecode_output_module::OutputSigLevelType_t)readbak;
  917. return kxs_ec_success;
  918. }
  919. xs_error_code_t Xsync::TimecodeOutputModule_setHeadphoneOutputLevel(timecode_output_module::OutputSigLevelType_t &level) {
  920. uint32_t readbak = 0;
  921. DO_XSYNC(reg_write(reg::ktimecode_out_headphone_outut_level_select, level, readbak, 10));
  922. return kxs_ec_success;
  923. }
  924. xs_error_code_t Xsync::TimecodeOutputModule_getHeadphoneOutputLevel(timecode_output_module::OutputSigLevelType_t &level) {
  925. uint32_t readbak = 0;
  926. DO_XSYNC(reg_read(reg::ktimecode_out_headphone_outut_level_select, readbak, 10));
  927. level = (timecode_output_module::OutputSigLevelType_t)readbak;
  928. return kxs_ec_success;
  929. }
  930. xs_error_code_t Xsync::CameraSyncPacketGeneratorModule_setTriggerSig(camera_sync_packet_generator_module::TriggerSigType_t sig) {
  931. uint32_t readbak = 0;
  932. DO_XSYNC(reg_write(reg::kcamera_sync_out_camera_sync_select, sig, readbak, 10));
  933. return kxs_ec_success;
  934. }
  935. xs_error_code_t Xsync::CameraSyncPacketGeneratorModule_getTriggerSig(camera_sync_packet_generator_module::TriggerSigType_t &sig) {
  936. uint32_t readbak = 0;
  937. DO_XSYNC(reg_read(reg::kcamera_sync_out_camera_sync_select, readbak, 10));
  938. sig = (camera_sync_packet_generator_module::TriggerSigType_t)readbak;
  939. return kxs_ec_success;
  940. }
  941. xs_error_code_t Xsync::CameraSyncPacketGeneratorModule_setReportPeriod(uint32_t packetNum) {
  942. uint32_t readbak = 0;
  943. if (packetNum == 0) packetNum = 1;
  944. DO_XSYNC(reg_write(reg::kstm32_camera_sync_signal_count_report_period, packetNum, readbak, 10));
  945. return kxs_ec_success;
  946. }
  947. xs_error_code_t Xsync::CameraSyncPacketGeneratorModule_getReportPeriod(uint32_t &packetNum) {
  948. uint32_t readbak = 0;
  949. DO_XSYNC(reg_read(reg::kstm32_camera_sync_signal_count_report_period, readbak, 10));
  950. packetNum = readbak;
  951. return kxs_ec_success;
  952. }
  953. xs_error_code_t Xsync::CameraSyncPacketGeneratorModule_getPacketIndex(uint32_t &index) {
  954. uint32_t readbak = 0;
  955. DO_XSYNC(reg_read(reg::kstm32_camera_sync_signal_count, readbak, 10));
  956. index = readbak;
  957. return kxs_ec_success;
  958. }
  959. xs_error_code_t Xsync::CameraSyncPacketGeneratorModule_clearPacketIndex() {
  960. uint32_t readbak = 0;
  961. DO_XSYNC(reg_write(reg::kstm32_camera_sync_signal_count, 0, readbak, 10));
  962. return kxs_ec_success;
  963. }
  964. xs_error_code_t Xsync::TimecodeInputModule_setSrcSelect(timecode_input_module::TriggerSigType_t timecode_select) {
  965. uint32_t readbak = 0;
  966. DO_XSYNC(reg_write(reg::ktimecode_in_timecode_sig_selt, timecode_select, readbak, 10));
  967. return kxs_ec_success;
  968. }
  969. xs_error_code_t Xsync::TimecodeInputModule_getSrcSelect(timecode_input_module::TriggerSigType_t &timecode_select) {
  970. uint32_t readbak = 0;
  971. DO_XSYNC(reg_read(reg::ktimecode_in_timecode_sig_selt, readbak, 10));
  972. timecode_select = (timecode_input_module::TriggerSigType_t)readbak;
  973. return kxs_ec_success;
  974. }
  975. xs_error_code_t Xsync::TimecodeInputModule_setTimecodeFormat(TimecodeFormat_t format) { return Basic_setTimecodeFormat(format); }
  976. xs_error_code_t Xsync::TimecodeInputModule_getTimecodeFormat(TimecodeFormat_t &format) {
  977. uint32_t readbak = 0;
  978. DO_XSYNC(reg_read(reg::ktimecode_in_timecode_format, readbak, 10));
  979. format = (TimecodeFormat_t)readbak;
  980. return kxs_ec_success;
  981. }
  982. xs_error_code_t Xsync::TimecodeInputModule_getTimecode(XsyncTimecode_t &timecode) {
  983. uint32_t readbak = 0;
  984. xs_error_code_t ecode = kxs_ec_success;
  985. uint32_t tc0 = 0;
  986. uint32_t tc1 = 0;
  987. ecode = reg_read(reg::ktimecode_in_timecode0, tc0, 10);
  988. if (ecode != kxs_ec_success) return ecode;
  989. ecode = reg_read(reg::ktimecode_in_timecode1, tc1, 10);
  990. if (ecode != kxs_ec_success) return ecode;
  991. Timecode64_t tc64;
  992. tc64.tc0 = tc0;
  993. tc64.tc1 = tc1;
  994. timecode = timecode64ToXsyncTimeCode(tc64);
  995. return ecode;
  996. }
  997. #define FREQ_CNT_TO_FREQ(cnt) ((cnt != 0) ? (uint32_t)(1.0 / (cnt * 1.0 / (10 * 1000 * 1000)) + 0.5) : 0 ) //+0.5是因为c++ 小数强转成整数时是取整,而非四舍五入
  998. /**
  999. * @brief TTL输入模块的频率
  1000. *
  1001. * @param index
  1002. * @param freq
  1003. * @return xs_error_code_t
  1004. */
  1005. xs_error_code_t Xsync::TTLInputModule1_detectFreq(uint32_t &freq) {
  1006. uint32_t freq_cnt = 0;
  1007. DO_XSYNC(reg_read(reg::k_ttlin1_freq_detector_reg, freq_cnt, 10));
  1008. if (freq_cnt == 0) {
  1009. freq = 0;
  1010. }
  1011. freq = FREQ_CNT_TO_FREQ(freq_cnt);
  1012. return kxs_ec_success;
  1013. }
  1014. xs_error_code_t Xsync::TTLInputModule2_detectFreq(uint32_t &freq) {
  1015. uint32_t freq_cnt = 0;
  1016. DO_XSYNC(reg_read(reg::k_ttlin2_freq_detector_reg, freq_cnt, 10));
  1017. freq = FREQ_CNT_TO_FREQ(freq_cnt);
  1018. return kxs_ec_success;
  1019. }
  1020. xs_error_code_t Xsync::TTLInputModule3_detectFreq(uint32_t &freq) {
  1021. uint32_t freq_cnt = 0;
  1022. DO_XSYNC(reg_read(reg::k_ttlin3_freq_detector_reg, freq_cnt, 10));
  1023. freq = FREQ_CNT_TO_FREQ(freq_cnt);
  1024. return kxs_ec_success;
  1025. }
  1026. xs_error_code_t Xsync::TTLInputModule4_detectFreq(uint32_t &freq) {
  1027. uint32_t freq_cnt = 0;
  1028. DO_XSYNC(reg_read(reg::k_ttlin4_freq_detector_reg, freq_cnt, 10));
  1029. freq = FREQ_CNT_TO_FREQ(freq_cnt);
  1030. return kxs_ec_success;
  1031. }