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.

1069 lines
34 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
  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 xsync
  302. static XsyncTimecode_t timecode64ToXsyncTimeCode(Timecode64_t tc64) {
  303. uint8_t frameuints = tc64.tc0 & 0x0f;
  304. uint8_t frame10s = (tc64.tc0 >> 8) & 0x3;
  305. uint8_t seconduints = (tc64.tc0 >> 16) & 0x0f;
  306. uint8_t second10s = (tc64.tc0 >> 24) & 0x07;
  307. uint8_t minuteuints = tc64.tc1 & 0x0f;
  308. uint8_t minute10s = (tc64.tc1 >> 8) & 0x07;
  309. uint8_t houruints = (tc64.tc1 >> 16) & 0x0f;
  310. uint8_t hour10s = (tc64.tc1 >> 24) & 0x03;
  311. XsyncTimecode_t timecode;
  312. timecode.hour = hour10s * 10 + houruints;
  313. timecode.minute = minute10s * 10 + minuteuints;
  314. timecode.second = second10s * 10 + seconduints;
  315. timecode.frame = frame10s * 10 + frameuints;
  316. return timecode;
  317. }
  318. static Timecode64_t timecodeTo64(XsyncTimecode_t tc) {
  319. Timecode64_t tc64;
  320. uint32_t frameuints = tc.frame % 10;
  321. uint32_t frame10s = tc.frame / 10;
  322. uint32_t seconduints = tc.second % 10;
  323. uint32_t second10s = tc.second / 10;
  324. uint32_t minuteuints = tc.minute % 10;
  325. uint32_t minute10s = tc.minute / 10;
  326. uint32_t houruints = tc.hour % 10;
  327. uint32_t hour10s = tc.hour / 10;
  328. tc64.tc0 = frameuints + (frame10s << 8) + (seconduints << 16) + (second10s << 24);
  329. tc64.tc1 = minuteuints + (minute10s << 8) + (houruints << 16) + (hour10s << 24);
  330. return tc64;
  331. }
  332. /*******************************************************************************
  333. * Xsync *
  334. *******************************************************************************/
  335. Xsync::Xsync(/* args */) {}
  336. Xsync &Xsync::Ins() {
  337. static Xsync xsync;
  338. return xsync;
  339. }
  340. void Xsync::initialize(I_XSUDPFactory *xsync_udp_factory) { m_xsync_udp_factory = xsync_udp_factory; }
  341. xs_error_code_t Xsync::connect(string xsync_ip) {
  342. lock_guard<recursive_mutex> lock(lock_);
  343. m_xsync_ip = xsync_ip;
  344. disConnect();
  345. /**
  346. * @brief m_xsync_reg_udp
  347. */
  348. xs_error_code_t ecode = kxs_ec_success;
  349. auto xsync_reg_udp = m_xsync_udp_factory->createXSUDP();
  350. ecode = xsync_reg_udp->initialize("0.0.0.0", IFLYTOP_XSYNC_SERVICE_PC_PORT);
  351. if (ecode != kxs_ec_success) {
  352. return ecode;
  353. }
  354. /**
  355. * @brief m_xsync_timecode_udp_listener
  356. */
  357. auto xsync_timecode_udp_listener = m_xsync_udp_factory->createXSUDP();
  358. ecode = xsync_timecode_udp_listener->initialize("0.0.0.0", IFLYTOP_XSYNC_TIMECODE_REPORT_PC_PORT);
  359. if (ecode != kxs_ec_success) {
  360. return ecode;
  361. }
  362. ecode = xsync_timecode_udp_listener->startReceive([this](XsyncNetAdd &from, uint8_t *data, size_t length) { parseTimecodeMsgAndReport(from, data, length); });
  363. if (ecode != kxs_ec_success) {
  364. return ecode;
  365. }
  366. /**
  367. * @brief m_xsync_camera_sync_udp_listener
  368. */
  369. auto xsync_camera_sync_udp_listener = m_xsync_udp_factory->createXSUDP();
  370. ecode = xsync_camera_sync_udp_listener->initialize("0.0.0.0", IFLYTOP_XSYNC_CAMERA_SYNC_PACKET_PC_PORT);
  371. if (ecode != kxs_ec_success) {
  372. return ecode;
  373. }
  374. ecode = xsync_camera_sync_udp_listener->startReceive([this](XsyncNetAdd &from, uint8_t *data, size_t length) { parseCameraSyncMsgAndReport(from, data, length); });
  375. if (ecode != kxs_ec_success) {
  376. return ecode;
  377. }
  378. m_xsync_reg_udp = xsync_reg_udp;
  379. m_xsync_timecode_udp_listener = xsync_timecode_udp_listener;
  380. m_xsync_camera_sync_udp_listener = xsync_camera_sync_udp_listener;
  381. m_net_state = kxsync_net_state_connected;
  382. return ecode;
  383. }
  384. xs_error_code_t Xsync::disConnect() {
  385. lock_guard<recursive_mutex> lock(lock_);
  386. if (m_xsync_reg_udp != nullptr) {
  387. m_xsync_reg_udp->stopReceive();
  388. m_xsync_reg_udp = nullptr;
  389. }
  390. if (m_xsync_timecode_udp_listener != nullptr) {
  391. m_xsync_timecode_udp_listener->stopReceive();
  392. m_xsync_timecode_udp_listener = nullptr;
  393. }
  394. if (m_xsync_camera_sync_udp_listener != nullptr) {
  395. m_xsync_camera_sync_udp_listener->stopReceive();
  396. m_xsync_camera_sync_udp_listener = nullptr;
  397. }
  398. m_net_state = kxsync_net_state_disconnect;
  399. return kxs_ec_success;
  400. }
  401. xsync_net_state_t Xsync::getNetState() { return m_net_state; }
  402. void Xsync::Basic_registerOnTimecodeMsgCallback(xsync_on_timecode_msg_t on_timecode_msg_cb) { m_on_timecode_msg_cb = on_timecode_msg_cb; }
  403. 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; }
  404. 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) {
  405. lock_guard<recursive_mutex> lock(lock_);
  406. if (!m_xsync_reg_udp) return kxs_ec_lose_connect;
  407. m_xsync_reg_udp->clearRxBuffer();
  408. cmd->index = txpacket_index++;
  409. XsyncNetAdd toadd = {m_xsync_ip, IFLYTOP_XSYNC_SERVICE_XSYNC_PORT};
  410. xs_error_code_t ecode = //
  411. m_xsync_reg_udp->sendto(toadd, (const char *)cmd, sizeof(iflytop_xsync_packet_header_t) + cmd->ndata * 4, nullptr);
  412. if (ecode != kxs_ec_success) {
  413. return ecode;
  414. }
  415. XsyncNetAdd fromadd;
  416. while (true) {
  417. // ZLOGI(TAG, "start rx wait for rxdata");
  418. ecode = m_xsync_reg_udp->receive((char *)rx_data, buffersize, fromadd, overtime_ms);
  419. // ZLOGI(TAG, "end rx wait for rxdata");
  420. if (ecode != kxs_ec_success) {
  421. return ecode;
  422. }
  423. if (rx_data->index != cmd->index) {
  424. // ZLOGI(TAG, "packet index error %d %d", cmd->index, rx_data->index);
  425. continue;
  426. }
  427. break;
  428. }
  429. return (xs_error_code_t)rx_data->data[0];
  430. }
  431. xs_error_code_t Xsync::reg_write(uint32_t regadd, uint32_t regvalue, uint32_t &regbackvalue, int32_t overtime_ms) {
  432. /**
  433. * @brief
  434. *
  435. *
  436. * kxsync_packet_type_reg_write
  437. * tx: regadd,regdata
  438. * rx: ecode,regdata
  439. */
  440. uint8_t txdata[128] = {0};
  441. uint8_t rxdata[128] = {0};
  442. iflytop_xsync_packet_header_t *txpacket = (iflytop_xsync_packet_header_t *)txdata;
  443. iflytop_xsync_packet_header_t *rxpacket = (iflytop_xsync_packet_header_t *)rxdata;
  444. txpacket->type = kxsync_packet_type_cmd;
  445. txpacket->index = txpacket_index++;
  446. txpacket->cmd = kxsync_packet_type_reg_write;
  447. txpacket->ndata = 2;
  448. txpacket->data[0] = regadd;
  449. txpacket->data[1] = regvalue;
  450. auto ecode = xsync_send_cmd_block(txpacket, rxpacket, sizeof(rxdata), overtime_ms);
  451. if (ecode != kxs_ec_success) {
  452. return ecode;
  453. }
  454. regbackvalue = rxpacket->data[1];
  455. return ecode;
  456. }
  457. xs_error_code_t Xsync::reg_read(uint32_t regadd, uint32_t &regvalue, int32_t overtime_ms) {
  458. /**
  459. * @brief
  460. *
  461. *
  462. * kxsync_packet_type_reg_write
  463. * tx: regadd,regdata
  464. * rx: ecode,regdata
  465. */
  466. uint8_t txdata[128] = {0};
  467. uint8_t rxdata[128] = {0};
  468. iflytop_xsync_packet_header_t *txpacket = (iflytop_xsync_packet_header_t *)txdata;
  469. iflytop_xsync_packet_header_t *rxpacket = (iflytop_xsync_packet_header_t *)rxdata;
  470. txpacket->type = kxsync_packet_type_cmd;
  471. txpacket->index = txpacket_index++;
  472. txpacket->cmd = kxsync_packet_type_reg_read;
  473. txpacket->ndata = 2;
  474. txpacket->data[0] = regadd;
  475. txpacket->data[1] = regvalue;
  476. auto ecode = xsync_send_cmd_block(txpacket, rxpacket, sizeof(rxdata), overtime_ms);
  477. if (ecode != kxs_ec_success) {
  478. return ecode;
  479. }
  480. regvalue = rxpacket->data[1];
  481. return ecode;
  482. }
  483. xs_error_code_t Xsync::reg_read_muti(uint32_t regadd, uint32_t nreg, vector<uint32_t> &regvalues, int32_t overtime_ms) {
  484. /**
  485. * @brief
  486. *
  487. *
  488. * kxsync_packet_type_reg_read_regs
  489. * tx: regstartadd,nreg
  490. * rx: ecode,regdatas
  491. */
  492. uint8_t txdata[128] = {0};
  493. uint8_t rxdata[1280] = {0};
  494. iflytop_xsync_packet_header_t *txpacket = (iflytop_xsync_packet_header_t *)txdata;
  495. iflytop_xsync_packet_header_t *rxpacket = (iflytop_xsync_packet_header_t *)rxdata;
  496. txpacket->type = kxsync_packet_type_cmd;
  497. txpacket->index = txpacket_index++;
  498. txpacket->cmd = kxsync_packet_type_reg_read_regs;
  499. txpacket->ndata = 2;
  500. txpacket->data[0] = regadd;
  501. txpacket->data[1] = nreg;
  502. auto ecode = xsync_send_cmd_block(txpacket, rxpacket, sizeof(rxdata), overtime_ms);
  503. if (ecode != kxs_ec_success) {
  504. return ecode;
  505. }
  506. if (rxpacket->ndata > 0) {
  507. for (int i = 0; i < rxpacket->ndata - 1; i++) {
  508. regvalues.push_back(rxpacket->data[i + 1]);
  509. }
  510. }
  511. return ecode;
  512. }
  513. void Xsync::parseTimecodeMsgAndReport(XsyncNetAdd &from, uint8_t *data, size_t length) {
  514. //
  515. iflytop_timecode_report_packet_t *packet = (iflytop_timecode_report_packet_t *)data;
  516. Timecode64_t tc64;
  517. tc64.tc0 = packet->timecode0;
  518. tc64.tc1 = packet->timecode1;
  519. XsyncTimecode_t timecode = timecode64ToXsyncTimeCode(tc64);
  520. if (m_on_timecode_msg_cb) m_on_timecode_msg_cb(&timecode);
  521. }
  522. void Xsync::parseCameraSyncMsgAndReport(XsyncNetAdd &from, uint8_t *data, size_t length) {
  523. uint32_t count = 0;
  524. uint32_t data0 = data[7];
  525. uint32_t data1 = data[6];
  526. uint32_t data2 = data[5];
  527. uint32_t data3 = data[4];
  528. count = data0 + (data1 << 8) + (data2 << 16) + (data3 << 24);
  529. xysnc_camera_sync_data_t camera_sync_data;
  530. camera_sync_data.frameIndex = count;
  531. if (m_on_camera_sync_msg_cb) m_on_camera_sync_msg_cb(&camera_sync_data);
  532. }
  533. xs_error_code_t Xsync::Basic_generatorNewMac() { return doaction(xsync_stm32_action_generator_new_mac, 0, nullptr, 2000); }
  534. xs_error_code_t Xsync::Basic_factoryReset() { return doaction(xsync_stm32_action_factory_reset, 0, nullptr, 1000); }
  535. xs_error_code_t Xsync::Basic_reboot() { return doaction(xsync_stm32_action_Basic_reboot, 0, nullptr); }
  536. xs_error_code_t Xsync::storageConfig() { return doaction(xsync_stm32_action_storage_cfg, 0, nullptr, 1000); }
  537. xs_error_code_t Xsync::Basic_changeNetworkConfig(string ip, string mask, string gateway) {
  538. uint32_t ip32 = 0;
  539. uint32_t mask32 = 0;
  540. uint32_t gateway32 = 0;
  541. xs_error_code_t ecode;
  542. bool suc = false;
  543. ip32 = (uint32_t)ipToUint32(ip.c_str(), suc);
  544. if (!suc) return kxs_ec_param_error;
  545. mask32 = (uint32_t)ipToUint32(mask.c_str(), suc);
  546. if (!suc) return kxs_ec_param_error;
  547. gateway32 = (uint32_t)ipToUint32(gateway.c_str(), suc);
  548. if (!suc) return kxs_ec_param_error;
  549. uint32_t readbak = 0;
  550. ecode = reg_write(reg::kstm32_ip, ip32, readbak);
  551. if (ecode != kxs_ec_success) return ecode;
  552. ecode = reg_write(reg::kstm32_netmask, mask32, readbak);
  553. if (ecode != kxs_ec_success) return ecode;
  554. ecode = reg_write(reg::kstm32_gw, gateway32, readbak);
  555. if (ecode != kxs_ec_success) return ecode;
  556. ecode = storageConfig();
  557. if (ecode != kxs_ec_success) return ecode;
  558. return kxs_ec_success;
  559. }
  560. xs_error_code_t Xsync::Basic_clearXsyncCameraSyncIndexCount() {
  561. uint32_t readbak = 0;
  562. return reg_write(reg::kstm32_camera_sync_signal_count, 0, readbak);
  563. }
  564. xs_error_code_t Xsync::doaction(uint32_t action, uint32_t actionval, uint32_t *ackreturn, int32_t overtime_ms) {
  565. //
  566. uint32_t readbak = 0;
  567. xs_error_code_t ecode;
  568. ecode = reg_write(reg::kstm32_action_val0, actionval, readbak);
  569. if (ecode != kxs_ec_success) return ecode;
  570. ecode = reg_write(reg::kstm32_action0, action, readbak, overtime_ms);
  571. if (ecode != kxs_ec_success) return ecode;
  572. if (ackreturn) *ackreturn = readbak;
  573. return ecode;
  574. }
  575. xs_error_code_t Xsync::Basic_setGenlockFormat(GenlockFormat_t format) {
  576. DO_XSYNC(SigGenerator_setGenlockFormat(format));
  577. return kxs_ec_success;
  578. }
  579. xs_error_code_t Xsync::Basic_getGenlockFormat(GenlockFormat_t &format) {
  580. DO_XSYNC(SigGenerator_getGenlockFormat(format));
  581. return kxs_ec_success;
  582. }
  583. xs_error_code_t Xsync::Basic_setTimecodeFormat(TimecodeFormat_t format) {
  584. DO_XSYNC(SigGenerator_setTimecodeFormat(format));
  585. return kxs_ec_success;
  586. }
  587. xs_error_code_t Xsync::Basic_getTimecodeFormat(TimecodeFormat_t &format) {
  588. DO_XSYNC(SigGenerator_getTimecodeFormat(format));
  589. return kxs_ec_success;
  590. }
  591. /*******************************************************************************
  592. * TTLOutputModule *
  593. *******************************************************************************/
  594. xs_error_code_t Xsync::TTLOutputModule_setInputSigType(int32_t index, ttlout_module::TriggerSigType_t source) {
  595. xs_error_code_t ecode = kxs_ec_success;
  596. uint32_t readbak = 0;
  597. uint32_t regAdd = 0;
  598. if (index == 1) {
  599. regAdd = reg::kttlout1_input_sig_slt;
  600. } else if (index == 2) {
  601. regAdd = reg::kttlout2_input_sig_slt;
  602. } else if (index == 3) {
  603. regAdd = reg::kttlout3_input_sig_slt;
  604. } else if (index == 4) {
  605. regAdd = reg::kttlout4_input_sig_slt;
  606. } else {
  607. return kxs_ec_param_error;
  608. }
  609. return reg_write(regAdd, source, readbak, 10);
  610. }
  611. xs_error_code_t Xsync::TTLOutputModule_getInputSigType(int32_t index, ttlout_module::TriggerSigType_t &source) {
  612. xs_error_code_t ecode = kxs_ec_success;
  613. uint32_t readbak = 0;
  614. uint32_t regAdd = 0;
  615. if (index == 1) {
  616. regAdd = reg::kttlout1_input_sig_slt;
  617. } else if (index == 2) {
  618. regAdd = reg::kttlout2_input_sig_slt;
  619. } else if (index == 3) {
  620. regAdd = reg::kttlout3_input_sig_slt;
  621. } else if (index == 4) {
  622. regAdd = reg::kttlout4_input_sig_slt;
  623. } else {
  624. return kxs_ec_param_error;
  625. }
  626. ecode = reg_read(regAdd, readbak, 10);
  627. if (ecode != kxs_ec_success) return ecode;
  628. source = (ttlout_module::TriggerSigType_t)readbak;
  629. return ecode;
  630. }
  631. xs_error_code_t Xsync::TTLOutputModule_setOutputSigType(int32_t index, ttlout_module::OutputSigType_t output_type) {
  632. xs_error_code_t ecode = kxs_ec_success;
  633. uint32_t readbak = 0;
  634. uint32_t regAdd = 0;
  635. if (index == 1) {
  636. regAdd = reg::kttlout1_output_sig_slt;
  637. } else if (index == 2) {
  638. regAdd = reg::kttlout2_output_sig_slt;
  639. } else if (index == 3) {
  640. regAdd = reg::kttlout3_output_sig_slt;
  641. } else if (index == 4) {
  642. regAdd = reg::kttlout4_output_sig_slt;
  643. } else {
  644. return kxs_ec_param_error;
  645. }
  646. return reg_write(regAdd, output_type, readbak, 10);
  647. }
  648. xs_error_code_t Xsync::TTLOutputModule_getOutputSigType(int32_t index, ttlout_module::OutputSigType_t &output_type) {
  649. xs_error_code_t ecode = kxs_ec_success;
  650. uint32_t readbak = 0;
  651. uint32_t regAdd = 0;
  652. if (index == 1) {
  653. regAdd = reg::kttlout1_output_sig_slt;
  654. } else if (index == 2) {
  655. regAdd = reg::kttlout2_output_sig_slt;
  656. } else if (index == 3) {
  657. regAdd = reg::kttlout3_output_sig_slt;
  658. } else if (index == 4) {
  659. regAdd = reg::kttlout4_output_sig_slt;
  660. } else {
  661. return kxs_ec_param_error;
  662. }
  663. ecode = reg_read(regAdd, readbak, 10);
  664. if (ecode != kxs_ec_success) return ecode;
  665. output_type = (ttlout_module::OutputSigType_t)readbak;
  666. return ecode;
  667. }
  668. xs_error_code_t Xsync::TTLOutputModule_setTriggerModePulseWidth(int32_t index, uint32_t pulse_width_ms) {
  669. xs_error_code_t ecode = kxs_ec_success;
  670. uint32_t readbak = 0;
  671. uint32_t regAdd = 0;
  672. if (index == 1) {
  673. regAdd = reg::kttlout1_pulse_mode_duration;
  674. } else if (index == 2) {
  675. regAdd = reg::kttlout2_pulse_mode_duration;
  676. } else if (index == 3) {
  677. regAdd = reg::kttlout3_pulse_mode_duration;
  678. } else if (index == 4) {
  679. regAdd = reg::kttlout4_pulse_mode_duration;
  680. } else {
  681. return kxs_ec_param_error;
  682. }
  683. uint32_t pluse_width = pulse_width_ms * 1000; // 1MHZ计数
  684. return reg_write(regAdd, pluse_width, readbak, 10);
  685. }
  686. xs_error_code_t Xsync::TTLOutputModule_getTriggerModePulseWidth(int32_t index, uint32_t &pulse_width_ms) {
  687. xs_error_code_t ecode = kxs_ec_success;
  688. uint32_t regAdd = 0;
  689. uint32_t readbak = 0;
  690. if (index == 1) {
  691. regAdd = reg::kttlout1_pulse_mode_duration;
  692. } else if (index == 2) {
  693. regAdd = reg::kttlout2_pulse_mode_duration;
  694. } else if (index == 3) {
  695. regAdd = reg::kttlout3_pulse_mode_duration;
  696. } else if (index == 4) {
  697. regAdd = reg::kttlout4_pulse_mode_duration;
  698. } else {
  699. return kxs_ec_param_error;
  700. }
  701. ecode = reg_read(regAdd, regAdd, 10);
  702. if (ecode != kxs_ec_success) return ecode;
  703. pulse_width_ms = readbak / 1000;
  704. return ecode;
  705. }
  706. xs_error_code_t Xsync::TTLOutputModule_setTriggerModePulseDelay(int32_t index, uint32_t pulse_delay_ms) {
  707. xs_error_code_t ecode = kxs_ec_success;
  708. uint32_t regAdd = 0;
  709. uint32_t readbak = 0;
  710. if (index == 1) {
  711. regAdd = reg::kttlout1_pulse_mode_delay;
  712. } else if (index == 2) {
  713. regAdd = reg::kttlout2_pulse_mode_delay;
  714. } else if (index == 3) {
  715. regAdd = reg::kttlout3_pulse_mode_delay;
  716. } else if (index == 4) {
  717. regAdd = reg::kttlout4_pulse_mode_delay;
  718. } else {
  719. return kxs_ec_param_error;
  720. }
  721. uint32_t pulse_delay = pulse_delay_ms * 1000; // 1MHZ计数
  722. return reg_write(regAdd, pulse_delay, readbak, 10);
  723. }
  724. xs_error_code_t Xsync::TTLOutputModule_getTriggerModePulseDelay(int32_t index, uint32_t &pulse_delay_ms) {
  725. xs_error_code_t ecode = kxs_ec_success;
  726. uint32_t regAdd = 0;
  727. uint32_t readbak = 0;
  728. if (index == 1) {
  729. regAdd = reg::kttlout1_pulse_mode_delay;
  730. } else if (index == 2) {
  731. regAdd = reg::kttlout2_pulse_mode_delay;
  732. } else if (index == 3) {
  733. regAdd = reg::kttlout3_pulse_mode_delay;
  734. } else if (index == 4) {
  735. regAdd = reg::kttlout4_pulse_mode_delay;
  736. } else {
  737. return kxs_ec_param_error;
  738. }
  739. ecode = reg_read(regAdd, readbak, 10);
  740. if (ecode != kxs_ec_success) return ecode;
  741. pulse_delay_ms = readbak / 1000;
  742. return ecode;
  743. }
  744. xs_error_code_t Xsync::SigGenerator_setControlMode(sig_generator_module::ControlMode_t mode) {
  745. uint32_t readbak = 0;
  746. return reg_write(reg::kSigGenerator_ctl, mode, readbak, 10);
  747. }
  748. xs_error_code_t Xsync::SigGenerator_getControlMode(sig_generator_module::ControlMode_t &mode) {
  749. uint32_t readbak = 0;
  750. auto ecode = reg_read(reg::kSigGenerator_ctl, readbak, 10);
  751. if (ecode != kxs_ec_success) return ecode;
  752. mode = (sig_generator_module::ControlMode_t)readbak;
  753. return ecode;
  754. }
  755. xs_error_code_t Xsync::SigGenerator_manualStart() {
  756. uint32_t readbak = 0;
  757. return reg_write(reg::kSigGenerator_control_trigger_reg, 1, readbak, 10);
  758. }
  759. xs_error_code_t Xsync::SigGenerator_manualStop() {
  760. uint32_t readbak = 0;
  761. return reg_write(reg::kSigGenerator_control_trigger_reg, 0, readbak, 10);
  762. }
  763. xs_error_code_t Xsync::SigGenerator_setTimecode(XsyncTimecode_t timecode) {
  764. uint32_t readbak = 0;
  765. xs_error_code_t ecode = kxs_ec_success;
  766. Timecode64_t tc64 = timecodeTo64(timecode);
  767. ecode = reg_write(reg::kSigGenerator_timecode0, tc64.tc0, readbak, 10);
  768. if (ecode != kxs_ec_success) return ecode;
  769. ecode = reg_write(reg::kSigGenerator_timecode1, tc64.tc1, readbak, 10);
  770. if (ecode != kxs_ec_success) return ecode;
  771. return ecode;
  772. }
  773. xs_error_code_t Xsync::SigGenerator_getTimecode(XsyncTimecode_t &timecode) {
  774. uint32_t readbak = 0;
  775. xs_error_code_t ecode = kxs_ec_success;
  776. uint32_t tc0 = 0;
  777. uint32_t tc1 = 0;
  778. ecode = reg_read(reg::kSigGenerator_timecode0, tc0, 10);
  779. if (ecode != kxs_ec_success) return ecode;
  780. ecode = reg_read(reg::kSigGenerator_timecode1, tc1, 10);
  781. if (ecode != kxs_ec_success) return ecode;
  782. Timecode64_t tc64;
  783. tc64.tc0 = tc0;
  784. tc64.tc1 = tc1;
  785. timecode = timecode64ToXsyncTimeCode(tc64);
  786. return ecode;
  787. }
  788. xs_error_code_t Xsync::SigGenerator_setAutoStartTimecode(XsyncTimecode_t timecode) {
  789. uint32_t readbak = 0;
  790. xs_error_code_t ecode = kxs_ec_success;
  791. Timecode64_t tc64 = timecodeTo64(timecode);
  792. ecode = reg_write(reg::kSigGenerator_timecode_start0, tc64.tc0, readbak, 10);
  793. if (ecode != kxs_ec_success) return ecode;
  794. ecode = reg_write(reg::kSigGenerator_timecode_start1, tc64.tc1, readbak, 10);
  795. if (ecode != kxs_ec_success) return ecode;
  796. return ecode;
  797. }
  798. xs_error_code_t Xsync::SigGenerator_getAutoStartTimecode(XsyncTimecode_t &timecode) {
  799. uint32_t readbak = 0;
  800. xs_error_code_t ecode = kxs_ec_success;
  801. uint32_t tc0 = 0;
  802. uint32_t tc1 = 0;
  803. ecode = reg_read(reg::kSigGenerator_timecode_start0, tc0, 10);
  804. if (ecode != kxs_ec_success) return ecode;
  805. ecode = reg_read(reg::kSigGenerator_timecode_start1, tc1, 10);
  806. if (ecode != kxs_ec_success) return ecode;
  807. Timecode64_t tc64;
  808. tc64.tc0 = tc0;
  809. tc64.tc1 = tc1;
  810. timecode = timecode64ToXsyncTimeCode(tc64);
  811. return ecode;
  812. }
  813. xs_error_code_t Xsync::SigGenerator_getWorkState(uint32_t &work_state) {
  814. uint32_t readbak = 0;
  815. auto ecode = reg_read(reg::kSigGenerator_work_state, readbak, 10);
  816. if (ecode != kxs_ec_success) return ecode;
  817. work_state = readbak;
  818. return ecode;
  819. }
  820. xs_error_code_t Xsync::SigGenerator_setGenlockFormat(GenlockFormat_t format) {
  821. uint32_t readbak = 0;
  822. return reg_write(reg::kSigGenerator_genlock_format, format, readbak, 10);
  823. }
  824. xs_error_code_t Xsync::SigGenerator_getGenlockFormat(GenlockFormat_t &format) {
  825. uint32_t readbak = 0;
  826. auto ecode = reg_read(reg::kSigGenerator_genlock_format, readbak, 10);
  827. if (ecode != kxs_ec_success) return ecode;
  828. format = (GenlockFormat_t)readbak;
  829. return ecode;
  830. }
  831. xs_error_code_t Xsync::SigGenerator_setTimecodeFormat(TimecodeFormat_t format) {
  832. uint32_t readbak = 0;
  833. return reg_write(reg::kSigGenerator_timecode_format, format, readbak, 10);
  834. }
  835. xs_error_code_t Xsync::SigGenerator_getTimecodeFormat(TimecodeFormat_t &format) {
  836. uint32_t readbak = 0;
  837. auto ecode = reg_read(reg::kSigGenerator_timecode_format, readbak, 10);
  838. if (ecode != kxs_ec_success) return ecode;
  839. format = (TimecodeFormat_t)readbak;
  840. return ecode;
  841. }
  842. xs_error_code_t Xsync::TimecodeOutputModule_setTimecodeSrcSelect(timecode_output_module::TriggerSigType_t timecode_select) {
  843. uint32_t readbak = 0;
  844. DO_XSYNC(reg_write(reg::ktimecode_out_timecode_select, timecode_select, readbak, 10));
  845. return kxs_ec_success;
  846. }
  847. xs_error_code_t Xsync::TimecodeOutputModule_getTimecodeSrcSelect(timecode_output_module::TriggerSigType_t &timecode_select) {
  848. uint32_t readbak = 0;
  849. DO_XSYNC(reg_read(reg::ktimecode_out_timecode_select, readbak, 10));
  850. timecode_select = (timecode_output_module::TriggerSigType_t)readbak;
  851. return kxs_ec_success;
  852. }
  853. xs_error_code_t Xsync::TimecodeOutputModule_getTimecodeNow(XsyncTimecode_t &timecode_now) {
  854. uint32_t readbak = 0;
  855. xs_error_code_t ecode = kxs_ec_success;
  856. uint32_t tc0 = 0;
  857. uint32_t tc1 = 0;
  858. ecode = reg_read(reg::ktimecode_out_timecode0, tc0, 10);
  859. if (ecode != kxs_ec_success) return ecode;
  860. ecode = reg_read(reg::ktimecode_out_timecode1, tc1, 10);
  861. if (ecode != kxs_ec_success) return ecode;
  862. Timecode64_t tc64;
  863. tc64.tc0 = tc0;
  864. tc64.tc1 = tc1;
  865. timecode_now = timecode64ToXsyncTimeCode(tc64);
  866. return ecode;
  867. }
  868. xs_error_code_t Xsync::TimecodeOutputModule_getTimecodeFormat(TimecodeFormat_t &timecode_format) {
  869. uint32_t readbak = 0;
  870. xs_error_code_t ecode = kxs_ec_success;
  871. ecode = reg_read(reg::ktimecode_out_timecode_format, readbak, 10);
  872. if (ecode != kxs_ec_success) return ecode;
  873. timecode_format = (TimecodeFormat_t)readbak;
  874. return ecode;
  875. }
  876. xs_error_code_t Xsync::TimecodeOutputModule_setBncOutputLevel(timecode_output_module::OutputSigLevelType_t &level) {
  877. uint32_t readbak = 0;
  878. DO_XSYNC(reg_write(reg::ktimecode_out_bnc_outut_level_select, level, readbak, 10));
  879. return kxs_ec_success;
  880. }
  881. xs_error_code_t Xsync::TimecodeOutputModule_getBncOutputLevel(timecode_output_module::OutputSigLevelType_t &level) {
  882. uint32_t readbak = 0;
  883. DO_XSYNC(reg_read(reg::ktimecode_out_bnc_outut_level_select, readbak, 10));
  884. level = (timecode_output_module::OutputSigLevelType_t)readbak;
  885. return kxs_ec_success;
  886. }
  887. xs_error_code_t Xsync::TimecodeOutputModule_setHeadphoneOutputLevel(timecode_output_module::OutputSigLevelType_t &level) {
  888. uint32_t readbak = 0;
  889. DO_XSYNC(reg_write(reg::ktimecode_out_headphone_outut_level_select, level, readbak, 10));
  890. return kxs_ec_success;
  891. }
  892. xs_error_code_t Xsync::TimecodeOutputModule_getHeadphoneOutputLevel(timecode_output_module::OutputSigLevelType_t &level) {
  893. uint32_t readbak = 0;
  894. DO_XSYNC(reg_read(reg::ktimecode_out_headphone_outut_level_select, readbak, 10));
  895. level = (timecode_output_module::OutputSigLevelType_t)readbak;
  896. return kxs_ec_success;
  897. }
  898. xs_error_code_t Xsync::CameraSyncPacketGeneratorModule_setTriggerSig(camera_sync_packet_generator_module::TriggerSigType_t sig) {
  899. uint32_t readbak = 0;
  900. DO_XSYNC(reg_write(reg::kcamera_sync_out_camera_sync_select, sig, readbak, 10));
  901. return kxs_ec_success;
  902. }
  903. xs_error_code_t Xsync::CameraSyncPacketGeneratorModule_getTriggerSig(camera_sync_packet_generator_module::TriggerSigType_t &sig) {
  904. uint32_t readbak = 0;
  905. DO_XSYNC(reg_read(reg::kcamera_sync_out_camera_sync_select, readbak, 10));
  906. sig = (camera_sync_packet_generator_module::TriggerSigType_t)readbak;
  907. return kxs_ec_success;
  908. }
  909. xs_error_code_t Xsync::CameraSyncPacketGeneratorModule_setReportPeriod(uint32_t packetNum) {
  910. uint32_t readbak = 0;
  911. if (packetNum == 0) packetNum = 1;
  912. DO_XSYNC(reg_write(reg::kstm32_camera_sync_signal_count_report_period, packetNum, readbak, 10));
  913. return kxs_ec_success;
  914. }
  915. xs_error_code_t Xsync::CameraSyncPacketGeneratorModule_getReportPeriod(uint32_t &packetNum) {
  916. uint32_t readbak = 0;
  917. DO_XSYNC(reg_read(reg::kstm32_camera_sync_signal_count_report_period, readbak, 10));
  918. packetNum = readbak;
  919. return kxs_ec_success;
  920. }
  921. xs_error_code_t Xsync::CameraSyncPacketGeneratorModule_getPacketIndex(uint32_t &index) {
  922. uint32_t readbak = 0;
  923. DO_XSYNC(reg_read(reg::kstm32_camera_sync_signal_count, readbak, 10));
  924. index = readbak;
  925. return kxs_ec_success;
  926. }
  927. xs_error_code_t Xsync::CameraSyncPacketGeneratorModule_clearPacketIndex() {
  928. uint32_t readbak = 0;
  929. DO_XSYNC(reg_write(reg::kstm32_camera_sync_signal_count, 0, readbak, 10));
  930. return kxs_ec_success;
  931. }