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.

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