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.

899 lines
29 KiB

1 year 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 sig_generator_module {
  53. static map<string, ControlMode_t> Str2ControlModeMap = {
  54. {"manualTrigger", kControlMode_manualTrigger}, //
  55. {"extTimecodeTrigger", kControlMode_externalTimecodeTrigger},
  56. {"ttl1Trigger", kControlMode_externalTTL1Trigger},
  57. {"ttl2Trigger", kControlMode_externalTTL2Trigger},
  58. {"ttl3Trigger", kControlMode_externalTTL3Trigger},
  59. {"ttl4Trigger", kControlMode_externalTTL4Trigger},
  60. };
  61. string ControlMode2Str(ControlMode_t mode) {
  62. for (auto &item : Str2ControlModeMap) {
  63. if (item.second == mode) return item.first;
  64. }
  65. return "unkown";
  66. }
  67. ControlMode_t Str2ControlMode(string mode) {
  68. auto it = Str2ControlModeMap.find(mode);
  69. if (it != Str2ControlModeMap.end()) {
  70. return it->second;
  71. }
  72. return kControlMode_manualTrigger;
  73. }
  74. list<string> ControlModeStrSet() {
  75. list<string> ret;
  76. for (auto &item : Str2ControlModeMap) {
  77. ret.push_back(item.first);
  78. }
  79. return ret;
  80. }
  81. } // namespace sig_generator_module
  82. static map<string, TimecodeFormat_t> Str2TimecodeFormatMap = {
  83. {"fps2398", TIMECODE_FPS2398}, //
  84. {"fps2400", TIMECODE_FPS2400}, //
  85. {"fps2500", TIMECODE_FPS2500}, //
  86. {"fps2997", TIMECODE_FPS2997}, //
  87. {"fps2997Drop", TIMECODE_FPS2997Drop}, {"fps3000", TIMECODE_FPS3000}, //
  88. };
  89. static map<string, GenlockFormat_t> Str2GenlockFormatMap = {
  90. {"fps2397", GENLOCK_FPS2397}, //
  91. {"fps2398", GENLOCK_FPS2398}, //
  92. {"fps2400", GENLOCK_FPS2400}, //
  93. {"fps2500", GENLOCK_FPS2500}, //
  94. {"fps2997", GENLOCK_FPS2997}, //
  95. {"fps3000", GENLOCK_FPS3000}, //
  96. {"fps5000", GENLOCK_FPS5000}, //
  97. {"fps5994", GENLOCK_FPS5994}, //
  98. {"fps6000", GENLOCK_FPS6000}, //
  99. };
  100. string GenlockFormatToStr(GenlockFormat_t fomrat) {
  101. for (auto &item : Str2GenlockFormatMap) {
  102. if (item.second == fomrat) return item.first;
  103. }
  104. return "unkown";
  105. }
  106. string TimecodeFormatToStr(TimecodeFormat_t fomrat) {
  107. for (auto &item : Str2TimecodeFormatMap) {
  108. if (item.second == fomrat) return item.first;
  109. }
  110. return "unkown";
  111. }
  112. GenlockFormat_t Str2GenlockFormat(string format) {
  113. auto it = Str2GenlockFormatMap.find(format);
  114. if (it != Str2GenlockFormatMap.end()) {
  115. return it->second;
  116. }
  117. return GENLOCK_FPS2397;
  118. }
  119. TimecodeFormat_t Str2TimecodeFormat(string format) {
  120. auto it = Str2TimecodeFormatMap.find(format);
  121. if (it != Str2TimecodeFormatMap.end()) {
  122. return it->second;
  123. }
  124. return TIMECODE_FPS2398;
  125. }
  126. list<string> GenlockFormatStrSet() {
  127. list<string> ret;
  128. for (auto &item : Str2GenlockFormatMap) {
  129. ret.push_back(item.first);
  130. }
  131. return ret;
  132. }
  133. list<string> TimecodeFormatStrSet() {
  134. list<string> ret;
  135. for (auto &item : Str2TimecodeFormatMap) {
  136. ret.push_back(item.first);
  137. }
  138. return ret;
  139. }
  140. string XsyncTimecodeToStr(XsyncTimecode_t timecode) {
  141. char buf[32] = {0};
  142. sprintf(buf, "%02d:%02d:%02d:%02d", timecode.hour, timecode.minute, timecode.second, timecode.frame);
  143. return string(buf);
  144. }
  145. XsyncTimecode_t Str2XsyncTimecode(string timecode) {
  146. XsyncTimecode_t ret;
  147. char buf[128] = {0};
  148. strncpy(buf, timecode.c_str(), 127);
  149. sscanf(buf, "%02d:%02d:%02d:%02d", &ret.hour, &ret.minute, &ret.second, &ret.frame);
  150. return ret;
  151. }
  152. namespace timecode_output_module {
  153. static map<string, TriggerSigType_t> Str2TriggerSigTypeMap = {
  154. {"off", koff}, //
  155. {"ext_timecode_sig", kext_timecode_sig},
  156. {"internal_timecode_sig", kinternal_timecode_sig},
  157. };
  158. string TriggerSigType2Str(TriggerSigType_t type) {
  159. for (auto &item : Str2TriggerSigTypeMap) {
  160. if (item.second == type) return item.first;
  161. }
  162. return "unkown";
  163. }
  164. TriggerSigType_t Str2TriggerSigType(string type) {
  165. auto it = Str2TriggerSigTypeMap.find(type);
  166. if (it != Str2TriggerSigTypeMap.end()) {
  167. return it->second;
  168. }
  169. return koff;
  170. }
  171. list<string> TriggerSigTypeStrSet() {
  172. list<string> ret;
  173. for (auto &item : Str2TriggerSigTypeMap) {
  174. ret.push_back(item.first);
  175. }
  176. return ret;
  177. }
  178. static map<string, OutputSigLevelType_t> Str2OutputSigLevelTypeMap = {
  179. {"line", kline}, //
  180. {"mic", kmic},
  181. };
  182. string OutputSigLevelType2Str(OutputSigLevelType_t type) {
  183. for (auto &item : Str2OutputSigLevelTypeMap) {
  184. if (item.second == type) return item.first;
  185. }
  186. return "unkown";
  187. }
  188. OutputSigLevelType_t Str2OutputSigLevelType(string type) {
  189. auto it = Str2OutputSigLevelTypeMap.find(type);
  190. if (it != Str2OutputSigLevelTypeMap.end()) {
  191. return it->second;
  192. }
  193. return kline;
  194. }
  195. list<string> OutputSigLevelTypeStrSet() {
  196. list<string> ret;
  197. for (auto &item : Str2OutputSigLevelTypeMap) {
  198. ret.push_back(item.first);
  199. }
  200. return ret;
  201. }
  202. } // namespace timecode_output_module
  203. namespace camera_sync_packet_generator_module {
  204. static map<string, TriggerSigType_t> Str2TriggerSigTypeMap = {
  205. {"off", koff}, //
  206. {"internal_genlock_sig", kinternal_genlock_sig},
  207. {"ext_genlock_sig", kext_genlock_sig},
  208. };
  209. string TriggerSigType2Str(TriggerSigType_t type) {
  210. for (auto &item : Str2TriggerSigTypeMap) {
  211. if (item.second == type) return item.first;
  212. }
  213. return "unkown";
  214. }
  215. TriggerSigType_t Str2TriggerSigType(string type) {
  216. auto it = Str2TriggerSigTypeMap.find(type);
  217. if (it != Str2TriggerSigTypeMap.end()) {
  218. return it->second;
  219. }
  220. return koff;
  221. }
  222. list<string> TriggerSigTypeStrSet() {
  223. list<string> ret;
  224. for (auto &item : Str2TriggerSigTypeMap) {
  225. ret.push_back(item.first);
  226. }
  227. return ret;
  228. }
  229. } // namespace camera_sync_packet_generator_module
  230. namespace timecode_input_module {
  231. static map<string, TriggerSigType_t> Str2TriggerSigTypeMap = {
  232. {"off", koff}, //
  233. {"bnc_timecode", kbnc_timecode},
  234. {"headphone_timecode", kheadphone_timecode},
  235. };
  236. string TriggerSigType2Str(TriggerSigType_t type) {
  237. for (auto &item : Str2TriggerSigTypeMap) {
  238. if (item.second == type) return item.first;
  239. }
  240. return "unkown";
  241. }
  242. TriggerSigType_t Str2TriggerSigType(string type) {
  243. auto it = Str2TriggerSigTypeMap.find(type);
  244. if (it != Str2TriggerSigTypeMap.end()) {
  245. return it->second;
  246. }
  247. return koff;
  248. }
  249. list<string> TriggerSigTypeStrSet() {
  250. list<string> ret;
  251. for (auto &item : Str2TriggerSigTypeMap) {
  252. ret.push_back(item.first);
  253. }
  254. return ret;
  255. }
  256. } // namespace timecode_input_module
  257. } // namespace xsync
  258. static XsyncTimecode_t timecode64ToXsyncTimeCode(Timecode64_t tc64) {
  259. uint8_t frameuints = tc64.tc0 & 0x0f;
  260. uint8_t frame10s = (tc64.tc0 >> 8) & 0x3;
  261. uint8_t seconduints = (tc64.tc0 >> 16) & 0x0f;
  262. uint8_t second10s = (tc64.tc0 >> 24) & 0x07;
  263. uint8_t minuteuints = tc64.tc1 & 0x0f;
  264. uint8_t minute10s = (tc64.tc1 >> 8) & 0x07;
  265. uint8_t houruints = (tc64.tc1 >> 16) & 0x0f;
  266. uint8_t hour10s = (tc64.tc1 >> 24) & 0x03;
  267. XsyncTimecode_t timecode;
  268. timecode.hour = hour10s * 10 + houruints;
  269. timecode.minute = minute10s * 10 + minuteuints;
  270. timecode.second = second10s * 10 + seconduints;
  271. timecode.frame = frame10s * 10 + frameuints;
  272. return timecode;
  273. }
  274. static Timecode64_t timecodeTo64(XsyncTimecode_t tc) {
  275. Timecode64_t tc64;
  276. uint32_t frameuints = tc.frame % 10;
  277. uint32_t frame10s = tc.frame / 10;
  278. uint32_t seconduints = tc.second % 10;
  279. uint32_t second10s = tc.second / 10;
  280. uint32_t minuteuints = tc.minute % 10;
  281. uint32_t minute10s = tc.minute / 10;
  282. uint32_t houruints = tc.hour % 10;
  283. uint32_t hour10s = tc.hour / 10;
  284. tc64.tc0 = frameuints + (frame10s << 8) + (seconduints << 16) + (second10s << 24);
  285. tc64.tc1 = minuteuints + (minute10s << 8) + (houruints << 16) + (hour10s << 24);
  286. return tc64;
  287. }
  288. /*******************************************************************************
  289. * Xsync *
  290. *******************************************************************************/
  291. Xsync::Xsync(/* args */) {}
  292. Xsync &Xsync::Ins() {
  293. static Xsync xsync;
  294. return xsync;
  295. }
  296. void Xsync::initialize(I_XSUDPFactory *xsync_udp_factory) { m_xsync_udp_factory = xsync_udp_factory; }
  297. xs_error_code_t Xsync::connect(string xsync_ip) {
  298. lock_guard<recursive_mutex> lock(lock_);
  299. m_xsync_ip = xsync_ip;
  300. disConnect();
  301. /**
  302. * @brief 创建 m_xsync_reg_udp
  303. */
  304. xs_error_code_t ecode = kxs_ec_success;
  305. auto xsync_reg_udp = m_xsync_udp_factory->createXSUDP();
  306. ecode = xsync_reg_udp->initialize("0.0.0.0", IFLYTOP_XSYNC_SERVICE_PC_PORT);
  307. if (ecode != kxs_ec_success) {
  308. return ecode;
  309. }
  310. /**
  311. * @brief 创建 m_xsync_timecode_udp_listener
  312. */
  313. auto xsync_timecode_udp_listener = m_xsync_udp_factory->createXSUDP();
  314. ecode = xsync_timecode_udp_listener->initialize("0.0.0.0", IFLYTOP_XSYNC_TIMECODE_REPORT_PC_PORT);
  315. if (ecode != kxs_ec_success) {
  316. return ecode;
  317. }
  318. ecode = xsync_timecode_udp_listener->startReceive([this](XsyncNetAdd &from, uint8_t *data, size_t length) { parseTimecodeMsgAndReport(from, data, length); });
  319. if (ecode != kxs_ec_success) {
  320. return ecode;
  321. }
  322. /**
  323. * @brief 创建 m_xsync_camera_sync_udp_listener
  324. */
  325. auto xsync_camera_sync_udp_listener = m_xsync_udp_factory->createXSUDP();
  326. ecode = xsync_camera_sync_udp_listener->initialize("0.0.0.0", IFLYTOP_XSYNC_CAMERA_SYNC_PACKET_PC_PORT);
  327. if (ecode != kxs_ec_success) {
  328. return ecode;
  329. }
  330. ecode = xsync_camera_sync_udp_listener->startReceive([this](XsyncNetAdd &from, uint8_t *data, size_t length) { parseCameraSyncMsgAndReport(from, data, length); });
  331. if (ecode != kxs_ec_success) {
  332. return ecode;
  333. }
  334. m_xsync_reg_udp = xsync_reg_udp;
  335. m_xsync_timecode_udp_listener = xsync_timecode_udp_listener;
  336. m_xsync_camera_sync_udp_listener = xsync_camera_sync_udp_listener;
  337. m_net_state = kxsync_net_state_connected;
  338. return ecode;
  339. }
  340. xs_error_code_t Xsync::disConnect() {
  341. lock_guard<recursive_mutex> lock(lock_);
  342. if (m_xsync_reg_udp != nullptr) {
  343. m_xsync_reg_udp->stopReceive();
  344. m_xsync_reg_udp = nullptr;
  345. }
  346. if (m_xsync_timecode_udp_listener != nullptr) {
  347. m_xsync_timecode_udp_listener->stopReceive();
  348. m_xsync_timecode_udp_listener = nullptr;
  349. }
  350. if (m_xsync_camera_sync_udp_listener != nullptr) {
  351. m_xsync_camera_sync_udp_listener->stopReceive();
  352. m_xsync_camera_sync_udp_listener = nullptr;
  353. }
  354. m_net_state = kxsync_net_state_disconnect;
  355. return kxs_ec_success;
  356. }
  357. xsync_net_state_t Xsync::getNetState() { return m_net_state; }
  358. void Xsync::Basic_registerOnTimecodeMsgCallback(xsync_on_timecode_msg_t on_timecode_msg_cb) { m_on_timecode_msg_cb = on_timecode_msg_cb; }
  359. 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; }
  360. 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; }
  361. 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) {
  362. lock_guard<recursive_mutex> lock(lock_);
  363. if (!m_xsync_reg_udp) return kxs_ec_lose_connect;
  364. m_xsync_reg_udp->clearRxBuffer();
  365. cmd->index = txpacket_index++;
  366. XsyncNetAdd toadd = {m_xsync_ip, IFLYTOP_XSYNC_SERVICE_XSYNC_PORT};
  367. xs_error_code_t ecode = //
  368. m_xsync_reg_udp->sendto(toadd, (const char *)cmd, sizeof(iflytop_xsync_packet_header_t) + cmd->ndata * 4, nullptr);
  369. if (ecode != kxs_ec_success) {
  370. return ecode;
  371. }
  372. XsyncNetAdd fromadd;
  373. while (true) {
  374. // ZLOGI(TAG, "start rx wait for rxdata");
  375. ecode = m_xsync_reg_udp->receive((char *)rx_data, buffersize, fromadd, overtime_ms);
  376. // ZLOGI(TAG, "end rx wait for rxdata");
  377. if (ecode != kxs_ec_success) {
  378. return ecode;
  379. }
  380. if (rx_data->index != cmd->index) {
  381. // ZLOGI(TAG, "packet index error %d %d", cmd->index, rx_data->index);
  382. continue;
  383. }
  384. break;
  385. }
  386. return (xs_error_code_t)rx_data->data[0];
  387. }
  388. xs_error_code_t Xsync::reg_write(uint32_t regadd, uint32_t regvalue, uint32_t &regbackvalue, int32_t overtime_ms) {
  389. /**
  390. * @brief
  391. * 协议说明
  392. *
  393. * kxsync_packet_type_reg_write
  394. * tx: regadd,regdata
  395. * rx: ecode,regdata
  396. */
  397. uint8_t txdata[128] = {0};
  398. uint8_t rxdata[128] = {0};
  399. iflytop_xsync_packet_header_t *txpacket = (iflytop_xsync_packet_header_t *)txdata;
  400. iflytop_xsync_packet_header_t *rxpacket = (iflytop_xsync_packet_header_t *)rxdata;
  401. txpacket->type = kxsync_packet_type_cmd;
  402. txpacket->index = txpacket_index++;
  403. txpacket->cmd = kxsync_packet_type_reg_write;
  404. txpacket->ndata = 2;
  405. txpacket->data[0] = regadd;
  406. txpacket->data[1] = regvalue;
  407. auto ecode = xsync_send_cmd_block(txpacket, rxpacket, sizeof(rxdata), overtime_ms);
  408. if (ecode != kxs_ec_success) {
  409. return ecode;
  410. }
  411. regbackvalue = rxpacket->data[1];
  412. return ecode;
  413. }
  414. xs_error_code_t Xsync::reg_read(uint32_t regadd, uint32_t &regvalue, int32_t overtime_ms) {
  415. /**
  416. * @brief
  417. * 协议说明
  418. *
  419. * kxsync_packet_type_reg_write
  420. * tx: regadd,regdata
  421. * rx: ecode,regdata
  422. */
  423. uint8_t txdata[128] = {0};
  424. uint8_t rxdata[128] = {0};
  425. iflytop_xsync_packet_header_t *txpacket = (iflytop_xsync_packet_header_t *)txdata;
  426. iflytop_xsync_packet_header_t *rxpacket = (iflytop_xsync_packet_header_t *)rxdata;
  427. txpacket->type = kxsync_packet_type_cmd;
  428. txpacket->index = txpacket_index++;
  429. txpacket->cmd = kxsync_packet_type_reg_read;
  430. txpacket->ndata = 2;
  431. txpacket->data[0] = regadd;
  432. txpacket->data[1] = regvalue;
  433. auto ecode = xsync_send_cmd_block(txpacket, rxpacket, sizeof(rxdata), overtime_ms);
  434. if (ecode != kxs_ec_success) {
  435. return ecode;
  436. }
  437. regvalue = rxpacket->data[1];
  438. return ecode;
  439. }
  440. xs_error_code_t Xsync::reg_read_muti(uint32_t regadd, uint32_t nreg, vector<uint32_t> &regvalues, int32_t overtime_ms) {
  441. /**
  442. * @brief
  443. * 协议说明
  444. *
  445. * kxsync_packet_type_reg_read_regs
  446. * tx: regstartadd,nreg
  447. * rx: ecode,regdatas
  448. */
  449. uint8_t txdata[128] = {0};
  450. uint8_t rxdata[1280] = {0};
  451. iflytop_xsync_packet_header_t *txpacket = (iflytop_xsync_packet_header_t *)txdata;
  452. iflytop_xsync_packet_header_t *rxpacket = (iflytop_xsync_packet_header_t *)rxdata;
  453. txpacket->type = kxsync_packet_type_cmd;
  454. txpacket->index = txpacket_index++;
  455. txpacket->cmd = kxsync_packet_type_reg_read_regs;
  456. txpacket->ndata = 2;
  457. txpacket->data[0] = regadd;
  458. txpacket->data[1] = nreg;
  459. auto ecode = xsync_send_cmd_block(txpacket, rxpacket, sizeof(rxdata), overtime_ms);
  460. if (ecode != kxs_ec_success) {
  461. return ecode;
  462. }
  463. if (rxpacket->ndata > 0) {
  464. for (int i = 0; i < rxpacket->ndata - 1; i++) {
  465. regvalues.push_back(rxpacket->data[i + 1]);
  466. }
  467. }
  468. return ecode;
  469. }
  470. void Xsync::parseTimecodeMsgAndReport(XsyncNetAdd &from, uint8_t *data, size_t length) {
  471. iflytop_xsync_event_report_packet_t *packet = (iflytop_xsync_event_report_packet_t *)data;
  472. if (packet->eventid == ktimecode_report_event) {
  473. Timecode64_t tc64;
  474. tc64.tc0 = packet->data[0];
  475. tc64.tc1 = packet->data[1];
  476. XsyncTimecode_t timecode = timecode64ToXsyncTimeCode(tc64);
  477. if (m_on_timecode_msg_cb) m_on_timecode_msg_cb(&timecode);
  478. } else if (packet->eventid == kxsync_work_state_report_event) {
  479. // 信号发生器状态改变
  480. if (m_on_workstate_change_msg_cb) m_on_workstate_change_msg_cb(packet->data[0]);
  481. }
  482. }
  483. void Xsync::parseCameraSyncMsgAndReport(XsyncNetAdd &from, uint8_t *data, size_t length) {
  484. uint32_t count = 0;
  485. uint32_t data0 = data[7];
  486. uint32_t data1 = data[6];
  487. uint32_t data2 = data[5];
  488. uint32_t data3 = data[4];
  489. count = data0 + (data1 << 8) + (data2 << 16) + (data3 << 24);
  490. xysnc_camera_sync_data_t camera_sync_data;
  491. camera_sync_data.frameIndex = count;
  492. if (m_on_camera_sync_msg_cb) m_on_camera_sync_msg_cb(&camera_sync_data);
  493. }
  494. xs_error_code_t Xsync::Basic_generatorNewMac() { return doaction(xsync_stm32_action_generator_new_mac, 0, nullptr, 2000); }
  495. xs_error_code_t Xsync::Basic_factoryReset() { return doaction(xsync_stm32_action_factory_reset, 0, nullptr, 1000); }
  496. xs_error_code_t Xsync::Basic_reboot() { return doaction(xsync_stm32_action_Basic_reboot, 0, nullptr); }
  497. xs_error_code_t Xsync::storageConfig() { return doaction(xsync_stm32_action_storage_cfg, 0, nullptr, 1000); }
  498. xs_error_code_t Xsync::Basic_changeNetworkConfig(string ip, string mask, string gateway) {
  499. uint32_t ip32 = 0;
  500. uint32_t mask32 = 0;
  501. uint32_t gateway32 = 0;
  502. xs_error_code_t ecode;
  503. bool suc = false;
  504. ip32 = (uint32_t)ipToUint32(ip.c_str(), suc);
  505. if (!suc) return kxs_ec_param_error;
  506. mask32 = (uint32_t)ipToUint32(mask.c_str(), suc);
  507. if (!suc) return kxs_ec_param_error;
  508. gateway32 = (uint32_t)ipToUint32(gateway.c_str(), suc);
  509. if (!suc) return kxs_ec_param_error;
  510. uint32_t readbak = 0;
  511. ecode = reg_write(reg::kstm32_ip, ip32, readbak);
  512. if (ecode != kxs_ec_success) return ecode;
  513. ecode = reg_write(reg::kstm32_netmask, mask32, readbak);
  514. if (ecode != kxs_ec_success) return ecode;
  515. ecode = reg_write(reg::kstm32_gw, gateway32, readbak);
  516. if (ecode != kxs_ec_success) return ecode;
  517. ecode = storageConfig();
  518. if (ecode != kxs_ec_success) return ecode;
  519. return kxs_ec_success;
  520. }
  521. xs_error_code_t Xsync::Basic_clearXsyncCameraSyncIndexCount() {
  522. uint32_t readbak = 0;
  523. return reg_write(reg::kstm32_camera_sync_signal_count, 0, readbak);
  524. }
  525. xs_error_code_t Xsync::doaction(uint32_t action, uint32_t actionval, uint32_t *ackreturn, int32_t overtime_ms) {
  526. //
  527. uint32_t readbak = 0;
  528. xs_error_code_t ecode;
  529. ecode = reg_write(reg::kstm32_action_val0, actionval, readbak);
  530. if (ecode != kxs_ec_success) return ecode;
  531. ecode = reg_write(reg::kstm32_action0, action, readbak, overtime_ms);
  532. if (ecode != kxs_ec_success) return ecode;
  533. if (ackreturn) *ackreturn = readbak;
  534. return ecode;
  535. }
  536. xs_error_code_t Xsync::Basic_setGenlockFormat(GenlockFormat_t format) {
  537. DO_XSYNC(SigGenerator_setGenlockFormat(format));
  538. return kxs_ec_success;
  539. }
  540. xs_error_code_t Xsync::Basic_getGenlockFormat(GenlockFormat_t &format) {
  541. DO_XSYNC(SigGenerator_getGenlockFormat(format));
  542. return kxs_ec_success;
  543. }
  544. xs_error_code_t Xsync::Basic_setTimecodeFormat(TimecodeFormat_t format) {
  545. uint32_t readbak = 0;
  546. DO_XSYNC(reg_write(reg::kSigGenerator_timecode_format, format, readbak, 10));
  547. DO_XSYNC(reg_write(reg::kexternal_timecode_format, format, readbak, 10));
  548. // DO_XSYNC(reg_write(reg::ktimecode_out_timecode_format, format, readbak, 10)); //readonly
  549. return kxs_ec_success;
  550. }
  551. // xs_error_code_t Xsync::Basic_getTimecodeFormat(TimecodeFormat_t &format) {
  552. // DO_XSYNC(SigGenerator_getTimecodeFormat(format));
  553. // return kxs_ec_success;
  554. // }
  555. /*******************************************************************************
  556. * TTLOutputModule *
  557. *******************************************************************************/
  558. xs_error_code_t Xsync::SigGenerator_setControlMode(sig_generator_module::ControlMode_t mode) {
  559. uint32_t readbak = 0;
  560. return reg_write(reg::kSigGenerator_ctl, mode, readbak, 10);
  561. }
  562. xs_error_code_t Xsync::SigGenerator_getControlMode(sig_generator_module::ControlMode_t &mode) {
  563. uint32_t readbak = 0;
  564. auto ecode = reg_read(reg::kSigGenerator_ctl, readbak, 10);
  565. if (ecode != kxs_ec_success) return ecode;
  566. mode = (sig_generator_module::ControlMode_t)readbak;
  567. return ecode;
  568. }
  569. xs_error_code_t Xsync::SigGenerator_manualStart() {
  570. uint32_t readbak = 0;
  571. return reg_write(reg::kSigGenerator_control_trigger_reg, 1, readbak, 10);
  572. }
  573. xs_error_code_t Xsync::SigGenerator_manualStop() {
  574. uint32_t readbak = 0;
  575. return reg_write(reg::kSigGenerator_control_trigger_reg, 0, readbak, 10);
  576. }
  577. xs_error_code_t Xsync::SigGenerator_setTimecode(XsyncTimecode_t timecode) {
  578. uint32_t readbak = 0;
  579. xs_error_code_t ecode = kxs_ec_success;
  580. Timecode64_t tc64 = timecodeTo64(timecode);
  581. ecode = reg_write(reg::kSigGenerator_timecode0, tc64.tc0, readbak, 10);
  582. if (ecode != kxs_ec_success) return ecode;
  583. ecode = reg_write(reg::kSigGenerator_timecode1, tc64.tc1, readbak, 10);
  584. if (ecode != kxs_ec_success) return ecode;
  585. return ecode;
  586. }
  587. xs_error_code_t Xsync::SigGenerator_getTimecode(XsyncTimecode_t &timecode) {
  588. uint32_t readbak = 0;
  589. xs_error_code_t ecode = kxs_ec_success;
  590. uint32_t tc0 = 0;
  591. uint32_t tc1 = 0;
  592. ecode = reg_read(reg::kSigGenerator_timecode0, tc0, 10);
  593. if (ecode != kxs_ec_success) return ecode;
  594. ecode = reg_read(reg::kSigGenerator_timecode1, tc1, 10);
  595. if (ecode != kxs_ec_success) return ecode;
  596. Timecode64_t tc64;
  597. tc64.tc0 = tc0;
  598. tc64.tc1 = tc1;
  599. timecode = timecode64ToXsyncTimeCode(tc64);
  600. return ecode;
  601. }
  602. xs_error_code_t Xsync::SigGenerator_setAutoStartTimecode(XsyncTimecode_t timecode) {
  603. uint32_t readbak = 0;
  604. xs_error_code_t ecode = kxs_ec_success;
  605. Timecode64_t tc64 = timecodeTo64(timecode);
  606. ecode = reg_write(reg::kSigGenerator_timecode_start0, tc64.tc0, readbak, 10);
  607. if (ecode != kxs_ec_success) return ecode;
  608. ecode = reg_write(reg::kSigGenerator_timecode_start1, tc64.tc1, readbak, 10);
  609. if (ecode != kxs_ec_success) return ecode;
  610. return ecode;
  611. }
  612. xs_error_code_t Xsync::SigGenerator_getAutoStartTimecode(XsyncTimecode_t &timecode) {
  613. uint32_t readbak = 0;
  614. xs_error_code_t ecode = kxs_ec_success;
  615. uint32_t tc0 = 0;
  616. uint32_t tc1 = 0;
  617. ecode = reg_read(reg::kSigGenerator_timecode_start0, tc0, 10);
  618. if (ecode != kxs_ec_success) return ecode;
  619. ecode = reg_read(reg::kSigGenerator_timecode_start1, tc1, 10);
  620. if (ecode != kxs_ec_success) return ecode;
  621. Timecode64_t tc64;
  622. tc64.tc0 = tc0;
  623. tc64.tc1 = tc1;
  624. timecode = timecode64ToXsyncTimeCode(tc64);
  625. return ecode;
  626. }
  627. xs_error_code_t Xsync::SigGenerator_getWorkState(uint32_t &work_state) {
  628. uint32_t readbak = 0;
  629. auto ecode = reg_read(reg::kSigGenerator_work_state, readbak, 10);
  630. if (ecode != kxs_ec_success) return ecode;
  631. work_state = readbak;
  632. return ecode;
  633. }
  634. xs_error_code_t Xsync::SigGenerator_setGenlockFormat(GenlockFormat_t format) {
  635. uint32_t readbak = 0;
  636. return reg_write(reg::kSigGenerator_genlock_format, format, readbak, 10);
  637. }
  638. xs_error_code_t Xsync::SigGenerator_getGenlockFormat(GenlockFormat_t &format) {
  639. uint32_t readbak = 0;
  640. auto ecode = reg_read(reg::kSigGenerator_genlock_format, readbak, 10);
  641. if (ecode != kxs_ec_success) return ecode;
  642. format = (GenlockFormat_t)readbak;
  643. return ecode;
  644. }
  645. xs_error_code_t Xsync::SigGenerator_setTimecodeFormat(TimecodeFormat_t format) { return Basic_setTimecodeFormat(format); }
  646. xs_error_code_t Xsync::SigGenerator_getTimecodeFormat(TimecodeFormat_t &format) {
  647. uint32_t readbak = 0;
  648. auto ecode = reg_read(reg::kSigGenerator_timecode_format, readbak, 10);
  649. if (ecode != kxs_ec_success) return ecode;
  650. format = (TimecodeFormat_t)readbak;
  651. return ecode;
  652. }
  653. xs_error_code_t Xsync::TimecodeOutputModule_setTimecodeSrcSelect(timecode_output_module::TriggerSigType_t timecode_select) {
  654. uint32_t readbak = 0;
  655. DO_XSYNC(reg_write(reg::ktimecode_out_timecode_select, timecode_select, readbak, 10));
  656. return kxs_ec_success;
  657. }
  658. xs_error_code_t Xsync::TimecodeOutputModule_getTimecodeSrcSelect(timecode_output_module::TriggerSigType_t &timecode_select) {
  659. uint32_t readbak = 0;
  660. DO_XSYNC(reg_read(reg::ktimecode_out_timecode_select, readbak, 10));
  661. timecode_select = (timecode_output_module::TriggerSigType_t)readbak;
  662. return kxs_ec_success;
  663. }
  664. xs_error_code_t Xsync::TimecodeOutputModule_getTimecodeNow(XsyncTimecode_t &timecode_now) {
  665. uint32_t readbak = 0;
  666. xs_error_code_t ecode = kxs_ec_success;
  667. uint32_t tc0 = 0;
  668. uint32_t tc1 = 0;
  669. ecode = reg_read(reg::ktimecode_out_timecode0, tc0, 10);
  670. if (ecode != kxs_ec_success) return ecode;
  671. ecode = reg_read(reg::ktimecode_out_timecode1, tc1, 10);
  672. if (ecode != kxs_ec_success) return ecode;
  673. Timecode64_t tc64;
  674. tc64.tc0 = tc0;
  675. tc64.tc1 = tc1;
  676. timecode_now = timecode64ToXsyncTimeCode(tc64);
  677. return ecode;
  678. }
  679. xs_error_code_t Xsync::CameraSyncPacketGeneratorModule_setTriggerSig(camera_sync_packet_generator_module::TriggerSigType_t sig) {
  680. uint32_t readbak = 0;
  681. DO_XSYNC(reg_write(reg::kcamera_sync_out_camera_sync_select, sig, readbak, 10));
  682. return kxs_ec_success;
  683. }
  684. xs_error_code_t Xsync::CameraSyncPacketGeneratorModule_getTriggerSig(camera_sync_packet_generator_module::TriggerSigType_t &sig) {
  685. uint32_t readbak = 0;
  686. DO_XSYNC(reg_read(reg::kcamera_sync_out_camera_sync_select, readbak, 10));
  687. sig = (camera_sync_packet_generator_module::TriggerSigType_t)readbak;
  688. return kxs_ec_success;
  689. }
  690. xs_error_code_t Xsync::CameraSyncPacketGeneratorModule_setReportPeriod(uint32_t packetNum) {
  691. uint32_t readbak = 0;
  692. if (packetNum == 0) packetNum = 1;
  693. DO_XSYNC(reg_write(reg::kstm32_camera_sync_signal_count_report_period, packetNum, readbak, 10));
  694. return kxs_ec_success;
  695. }
  696. xs_error_code_t Xsync::CameraSyncPacketGeneratorModule_getReportPeriod(uint32_t &packetNum) {
  697. uint32_t readbak = 0;
  698. DO_XSYNC(reg_read(reg::kstm32_camera_sync_signal_count_report_period, readbak, 10));
  699. packetNum = readbak;
  700. return kxs_ec_success;
  701. }
  702. xs_error_code_t Xsync::CameraSyncPacketGeneratorModule_getPacketIndex(uint32_t &index) {
  703. uint32_t readbak = 0;
  704. DO_XSYNC(reg_read(reg::kstm32_camera_sync_signal_count, readbak, 10));
  705. index = readbak;
  706. return kxs_ec_success;
  707. }
  708. xs_error_code_t Xsync::CameraSyncPacketGeneratorModule_clearPacketIndex() {
  709. uint32_t readbak = 0;
  710. DO_XSYNC(reg_write(reg::kstm32_camera_sync_signal_count, 0, readbak, 10));
  711. return kxs_ec_success;
  712. }
  713. xs_error_code_t Xsync::ExternalTimecode_setSource(timecode_input_module::TriggerSigType_t timecode_select) {
  714. uint32_t readbak = 0;
  715. DO_XSYNC(reg_write(reg::kexternal_timecode_sig_selt, timecode_select, readbak, 10));
  716. return kxs_ec_success;
  717. }
  718. xs_error_code_t Xsync::ExternalTimecode_getSource(timecode_input_module::TriggerSigType_t &timecode_select) {
  719. uint32_t readbak = 0;
  720. DO_XSYNC(reg_read(reg::kexternal_timecode_sig_selt, readbak, 10));
  721. timecode_select = (timecode_input_module::TriggerSigType_t)readbak;
  722. return kxs_ec_success;
  723. }
  724. xs_error_code_t Xsync::ExternalTimecode_setFormat(TimecodeFormat_t format) { return Basic_setTimecodeFormat(format); }
  725. xs_error_code_t Xsync::ExternalTimecode_getFormat(TimecodeFormat_t &format) {
  726. uint32_t readbak = 0;
  727. DO_XSYNC(reg_read(reg::kexternal_timecode_format, readbak, 10));
  728. format = (TimecodeFormat_t)readbak;
  729. return kxs_ec_success;
  730. }
  731. xs_error_code_t Xsync::ExternalTimecode_getTimecode(XsyncTimecode_t &timecode) {
  732. uint32_t readbak = 0;
  733. xs_error_code_t ecode = kxs_ec_success;
  734. uint32_t tc0 = 0;
  735. uint32_t tc1 = 0;
  736. ecode = reg_read(reg::kexternal_timecode_code0, tc0, 10);
  737. if (ecode != kxs_ec_success) return ecode;
  738. ecode = reg_read(reg::kexternal_timecode_code1, tc1, 10);
  739. if (ecode != kxs_ec_success) return ecode;
  740. Timecode64_t tc64;
  741. tc64.tc0 = tc0;
  742. tc64.tc1 = tc1;
  743. timecode = timecode64ToXsyncTimeCode(tc64);
  744. return ecode;
  745. }
  746. #define FREQ_CNT_TO_FREQ(cnt) ((cnt != 0) ? (uint32_t)(1.0 / (cnt * 1.0 / (10 * 1000 * 1000)) + 0.5) : 0 ) //+0.5是因为c++ 小数强转成整数时是取整,而非四舍五入
  747. /**
  748. * @brief 读取TTL输入模块的频率
  749. *
  750. * @param index
  751. * @param freq
  752. * @return xs_error_code_t
  753. */
  754. xs_error_code_t Xsync::TTLInputModule1_detectFreq(uint32_t &freq) {
  755. uint32_t freq_cnt = 0;
  756. DO_XSYNC(reg_read(reg::k_ttlin1_freq_detector_reg, freq_cnt, 10));
  757. if (freq_cnt == 0) {
  758. freq = 0;
  759. }
  760. freq = FREQ_CNT_TO_FREQ(freq_cnt);
  761. return kxs_ec_success;
  762. }
  763. xs_error_code_t Xsync::TTLInputModule2_detectFreq(uint32_t &freq) {
  764. uint32_t freq_cnt = 0;
  765. DO_XSYNC(reg_read(reg::k_ttlin2_freq_detector_reg, freq_cnt, 10));
  766. freq = FREQ_CNT_TO_FREQ(freq_cnt);
  767. return kxs_ec_success;
  768. }
  769. xs_error_code_t Xsync::TTLInputModule3_detectFreq(uint32_t &freq) {
  770. uint32_t freq_cnt = 0;
  771. DO_XSYNC(reg_read(reg::k_ttlin3_freq_detector_reg, freq_cnt, 10));
  772. freq = FREQ_CNT_TO_FREQ(freq_cnt);
  773. return kxs_ec_success;
  774. }
  775. xs_error_code_t Xsync::TTLInputModule4_detectFreq(uint32_t &freq) {
  776. uint32_t freq_cnt = 0;
  777. DO_XSYNC(reg_read(reg::k_ttlin4_freq_detector_reg, freq_cnt, 10));
  778. freq = FREQ_CNT_TO_FREQ(freq_cnt);
  779. return kxs_ec_success;
  780. }