_modbus_rt_data_trans.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466
  1. /**
  2. * @file _modbus_rt.c
  3. * @brief modbus_rt的pika层的API实现
  4. * @author SenySunny (senysunny@163.com)
  5. * @date 2023-05-14
  6. *
  7. * @attention
  8. *
  9. * <h2><center>&copy; Copyright (c) 2022 Ma Longwei.
  10. * All rights reserved.</center></h2>
  11. *
  12. */
  13. #include "PikaStdData_List.h"
  14. #include "_modbus_rt__data_trans.h"
  15. #include "modbus_rt_platform_memory.h"
  16. #include "modbus_data_trans.h"
  17. int _modbus_rt__data_trans__reg2reg(PikaObj *self, int val) {
  18. #if (!MODBUS_DATA_TRANS_ENABLE)
  19. pika_platform_printf("MODBUS_DATA_TRANS_ENABLE is not enabled.\n");
  20. return 0;
  21. #else
  22. return modbus_data_reg2reg((uint16_t)val);
  23. #endif
  24. }
  25. PikaObj* _modbus_rt__data_trans__regs2regs(PikaObj *self, PikaObj* val) {
  26. #if (!MODBUS_DATA_TRANS_ENABLE)
  27. pika_platform_printf("MODBUS_DATA_TRANS_ENABLE is not enabled.\n");
  28. return NULL;
  29. #else
  30. (void)(self);
  31. size_t len_list = pikaList_getSize(val);
  32. PikaList* list = New_PikaList();
  33. for(size_t i = 0; i < len_list; i++ ) {
  34. uint16_t temp = (uint16_t)pikaList_getInt(val, i);
  35. pikaList_append(list, arg_newInt(modbus_data_reg2reg(temp)));
  36. }
  37. return list;
  38. #endif
  39. }
  40. Arg* _modbus_rt__data_trans__regs2bytes(PikaObj *self, PikaObj* val, int mode) {
  41. #if (!MODBUS_DATA_TRANS_ENABLE)
  42. pika_platform_printf("MODBUS_DATA_TRANS_ENABLE is not enabled.\n");
  43. return NULL;
  44. #else
  45. (void)(self);
  46. uint8_t *_Dst = NULL;
  47. uint16_t *_Src = NULL;
  48. size_t len_list = pikaList_getSize(val);
  49. size_t len = len_list << 1;
  50. _Dst = modbus_rt_calloc(1,len);
  51. _Src = modbus_rt_calloc(1,len);
  52. for(size_t i = 0;i < len_list; i++) {
  53. _Src[i] = (uint16_t)pikaList_getInt(val, i);
  54. }
  55. modbus_data_regs2bytes(mode, _Dst, _Src, len_list);
  56. Arg* r = arg_newBytes(_Dst, len);
  57. modbus_rt_free(_Dst);
  58. modbus_rt_free(_Src);
  59. return r;
  60. #endif
  61. }
  62. char* _modbus_rt__data_trans__regs2str(PikaObj *self, PikaObj* val, int mode) {
  63. #if (!MODBUS_DATA_TRANS_ENABLE)
  64. pika_platform_printf("MODBUS_DATA_TRANS_ENABLE is not enabled.\n");
  65. return NULL;
  66. #else
  67. (void)(self);
  68. char *_Dst = NULL;
  69. uint16_t *_Src = NULL;
  70. size_t len_list = pikaList_getSize(val);
  71. _Dst = modbus_rt_calloc(1,(len_list << 1) + 1);
  72. _Src = modbus_rt_calloc(1,len_list << 1);
  73. for(size_t i = 0;i < len_list; i++) {
  74. _Src[i] = (uint16_t)pikaList_getInt(val, i);
  75. }
  76. modbus_data_regs2str(mode, _Dst, _Src, len_list);
  77. char* str = obj_cacheStr(self, _Dst);
  78. modbus_rt_free(_Dst);
  79. modbus_rt_free(_Src);
  80. return str;
  81. #endif
  82. }
  83. PikaObj* _modbus_rt__data_trans__regs2signed(PikaObj *self, PikaObj* val, int mode){
  84. #if (!MODBUS_DATA_TRANS_ENABLE)
  85. pika_platform_printf("MODBUS_DATA_TRANS_ENABLE is not enabled.\n");
  86. return NULL;
  87. #else
  88. (void)(self);
  89. int16_t *_Dst = NULL;
  90. uint16_t *_Src = NULL;
  91. size_t len_list = pikaList_getSize(val);
  92. _Dst = modbus_rt_calloc(1,len_list << 1);
  93. _Src = modbus_rt_calloc(1,len_list << 1);
  94. for(size_t i = 0;i < len_list; i++) {
  95. _Src[i] = (uint16_t)pikaList_getInt(val, i);
  96. }
  97. modbus_data_regs2signed(mode, _Dst, _Src, len_list);
  98. PikaList* list = New_PikaList();
  99. for(size_t i = 0; i < len_list; i++ ) {
  100. pikaList_append(list, arg_newInt(_Dst[i]));
  101. }
  102. modbus_rt_free(_Dst);
  103. modbus_rt_free(_Src);
  104. return list;
  105. #endif
  106. }
  107. PikaObj* _modbus_rt__data_trans__regs2int(PikaObj *self, PikaObj* val, int mode) {
  108. #if (!MODBUS_DATA_TRANS_ENABLE)
  109. pika_platform_printf("MODBUS_DATA_TRANS_ENABLE is not enabled.\n");
  110. return NULL;
  111. #else
  112. (void)(self);
  113. int32_t *_Dst = NULL;
  114. uint16_t *_Src = NULL;
  115. size_t len_list = pikaList_getSize(val);
  116. size_t len_ret = len_list >> 1;
  117. if(len_list & 0x01) {
  118. len_ret += 1;
  119. }
  120. _Dst = modbus_rt_calloc(1,len_ret << 2);
  121. _Src = modbus_rt_calloc(1,len_list << 1);
  122. for(size_t i = 0;i < len_list; i++) {
  123. _Src[i] = (uint16_t)pikaList_getInt(val, i);
  124. }
  125. modbus_data_regs2int(mode, _Dst, _Src, len_list);
  126. PikaList* list = New_PikaList();
  127. for(size_t i = 0; i < len_ret; i++ ) {
  128. pikaList_append(list, arg_newInt(_Dst[i]));
  129. }
  130. modbus_rt_free(_Dst);
  131. modbus_rt_free(_Src);
  132. return list;
  133. #endif
  134. }
  135. PikaObj* _modbus_rt__data_trans__regs2uint(PikaObj *self, PikaObj* val, int mode) {
  136. #if (!MODBUS_DATA_TRANS_ENABLE)
  137. pika_platform_printf("MODBUS_DATA_TRANS_ENABLE is not enabled.\n");
  138. return NULL;
  139. #else
  140. (void)(self);
  141. uint32_t *_Dst = NULL;
  142. uint16_t *_Src = NULL;
  143. size_t len_list = pikaList_getSize(val);
  144. size_t len_ret = len_list >> 1;
  145. if(len_list & 0x01) {
  146. len_ret += 1;
  147. }
  148. _Dst = modbus_rt_calloc(1,len_ret << 2);
  149. _Src = modbus_rt_calloc(1,len_list << 1);
  150. for(size_t i = 0;i < len_list; i++) {
  151. _Src[i] = (uint16_t)pikaList_getInt(val, i);
  152. }
  153. modbus_data_regs2uint(mode, _Dst, _Src, len_list);
  154. PikaList* list = New_PikaList();
  155. for(size_t i = 0; i < len_ret; i++ ) {
  156. pikaList_append(list, arg_newInt(_Dst[i]));
  157. }
  158. modbus_rt_free(_Dst);
  159. modbus_rt_free(_Src);
  160. return list;
  161. #endif
  162. }
  163. PikaObj* _modbus_rt__data_trans__regs2long(PikaObj *self, PikaObj* val, int mode) {
  164. #if (!MODBUS_DATA_TRANS_ENABLE)
  165. pika_platform_printf("MODBUS_DATA_TRANS_ENABLE is not enabled.\n");
  166. return NULL;
  167. #else
  168. (void)(self);
  169. int64_t *_Dst = NULL;
  170. uint16_t *_Src = NULL;
  171. size_t len_list = pikaList_getSize(val);
  172. size_t len_ret = len_list >> 2;
  173. if(len_list & 0x03) {
  174. len_ret += 1;
  175. }
  176. _Dst = modbus_rt_calloc(1,len_ret << 3);
  177. _Src = modbus_rt_calloc(1,len_list << 1);
  178. for(size_t i = 0;i < len_list; i++) {
  179. _Src[i] = (uint16_t)pikaList_getInt(val, i);
  180. }
  181. modbus_data_regs2long(mode, _Dst, _Src, len_list);
  182. PikaList* list = New_PikaList();
  183. for(size_t i = 0; i < len_ret; i++ ) {
  184. pikaList_append(list, arg_newInt(_Dst[i]));
  185. }
  186. modbus_rt_free(_Dst);
  187. modbus_rt_free(_Src);
  188. return list;
  189. #endif
  190. }
  191. PikaObj* _modbus_rt__data_trans__regs2float(PikaObj *self, PikaObj* val, int mode) {
  192. #if (!MODBUS_DATA_TRANS_ENABLE)
  193. pika_platform_printf("MODBUS_DATA_TRANS_ENABLE is not enabled.\n");
  194. return NULL;
  195. #else
  196. (void)(self);
  197. float *_Dst = NULL;
  198. uint16_t *_Src = NULL;
  199. size_t len_list = pikaList_getSize(val);
  200. size_t len_ret = len_list >> 1;
  201. if(len_list & 0x01) {
  202. len_ret += 1;
  203. }
  204. _Dst = modbus_rt_calloc(1,len_ret << 2);
  205. _Src = modbus_rt_calloc(1,len_list << 1);
  206. for(size_t i = 0;i < len_list; i++) {
  207. _Src[i] = (uint16_t)pikaList_getInt(val, i);
  208. }
  209. modbus_data_regs2float(mode, _Dst, _Src, len_list);
  210. PikaList* list = New_PikaList();
  211. for(size_t i = 0; i < len_ret; i++ ) {
  212. pikaList_append(list, arg_newFloat(_Dst[i]));
  213. }
  214. modbus_rt_free(_Dst);
  215. modbus_rt_free(_Src);
  216. return list;
  217. #endif
  218. }
  219. PikaObj* _modbus_rt__data_trans__regs2double(PikaObj *self, PikaObj* val, int mode) {
  220. #if (!MODBUS_DATA_TRANS_ENABLE)
  221. pika_platform_printf("MODBUS_DATA_TRANS_ENABLE is not enabled.\n");
  222. return NULL;
  223. #else
  224. (void)(self);
  225. double *_Dst = NULL;
  226. uint16_t *_Src = NULL;
  227. size_t len_list = pikaList_getSize(val);
  228. size_t len_ret = len_list >> 2;
  229. if(len_list & 0x03) {
  230. len_ret += 1;
  231. }
  232. _Dst = modbus_rt_calloc(1,len_ret << 3);
  233. _Src = modbus_rt_calloc(1,len_list << 1);
  234. for(size_t i = 0;i < len_list; i++) {
  235. _Src[i] = (uint16_t)pikaList_getInt(val, i);
  236. }
  237. modbus_data_regs2double(mode, _Dst, _Src, len_list);
  238. PikaList* list = New_PikaList();
  239. for(size_t i = 0; i < len_ret; i++ ) {
  240. pikaList_append(list, arg_newFloat(_Dst[i]));
  241. }
  242. modbus_rt_free(_Dst);
  243. modbus_rt_free(_Src);
  244. return list;
  245. #endif
  246. }
  247. PikaObj* _modbus_rt__data_trans__bytes2regs(PikaObj *self, Arg* val, int mode) {
  248. #if (!MODBUS_DATA_TRANS_ENABLE)
  249. pika_platform_printf("MODBUS_DATA_TRANS_ENABLE is not enabled.\n");
  250. return NULL;
  251. #else
  252. (void)(self);
  253. ArgType t = arg_getType(val);
  254. if (ARG_TYPE_BYTES != t) {
  255. return NULL;
  256. }
  257. uint16_t *_Dst = NULL;
  258. uint8_t* _Src = arg_getBytes(val);
  259. size_t _Src_len = arg_getBytesSize(val);
  260. size_t len_ret = _Src_len >> 1;
  261. if(_Src_len & 0x01) {
  262. len_ret += 1;
  263. }
  264. _Dst = modbus_rt_calloc(1,len_ret << 1);
  265. modbus_data_bytes2regs(mode, _Dst, _Src, _Src_len);
  266. PikaList* list = New_PikaList();
  267. for(size_t i = 0; i < len_ret; i++ ) {
  268. pikaList_append(list, arg_newInt(_Dst[i]));
  269. }
  270. modbus_rt_free(_Dst);
  271. return list;
  272. #endif
  273. }
  274. PikaObj* _modbus_rt__data_trans__str2regs(PikaObj *self, char* val, int mode) {
  275. #if (!MODBUS_DATA_TRANS_ENABLE)
  276. pika_platform_printf("MODBUS_DATA_TRANS_ENABLE is not enabled.\n");
  277. return NULL;
  278. #else
  279. (void)(self);
  280. uint16_t *_Dst = NULL;
  281. char * _Src = val;
  282. size_t _Src_len = strlen(val) + 1;
  283. size_t len_ret = _Src_len >> 1;
  284. if(_Src_len & 0x01) {
  285. len_ret += 1;
  286. }
  287. _Dst = modbus_rt_calloc(1,len_ret << 1);
  288. modbus_data_str2regs(mode, _Dst, _Src, _Src_len);
  289. PikaList* list = New_PikaList();
  290. for(size_t i = 0; i < len_ret; i++ ) {
  291. pikaList_append(list, arg_newInt(_Dst[i]));
  292. }
  293. modbus_rt_free(_Dst);
  294. return list;
  295. #endif
  296. }
  297. PikaObj* _modbus_rt__data_trans__signed2regs(PikaObj *self, PikaObj* val, int mode) {
  298. #if (!MODBUS_DATA_TRANS_ENABLE)
  299. pika_platform_printf("MODBUS_DATA_TRANS_ENABLE is not enabled.\n");
  300. return NULL;
  301. #else
  302. (void)(self);
  303. uint16_t *_Dst = NULL;
  304. int16_t * _Src = NULL;
  305. size_t len_list = pikaList_getSize(val);
  306. size_t len_ret = len_list;
  307. _Dst = modbus_rt_calloc(1,len_ret << 1);
  308. _Src = modbus_rt_calloc(1,len_list << 1);
  309. for(int i = 0; i < len_list; i++ ) {
  310. _Src[i] = (int16_t)pikaList_getInt(val, i);
  311. }
  312. modbus_data_signed2regs(mode, _Dst, _Src, len_list);
  313. PikaList* list = New_PikaList();
  314. for(int i = 0; i < len_ret; i++ ) {
  315. pikaList_append(list, arg_newInt(_Dst[i]));
  316. }
  317. modbus_rt_free(_Dst);
  318. modbus_rt_free(_Src);
  319. return list;
  320. #endif
  321. }
  322. PikaObj* _modbus_rt__data_trans__int2regs(PikaObj *self, PikaObj* val, int mode) {
  323. #if (!MODBUS_DATA_TRANS_ENABLE)
  324. pika_platform_printf("MODBUS_DATA_TRANS_ENABLE is not enabled.\n");
  325. return NULL;
  326. #else
  327. (void)(self);
  328. uint16_t *_Dst = NULL;
  329. int32_t * _Src = NULL;
  330. size_t len_list = pikaList_getSize(val);
  331. size_t len_ret = len_list << 1;
  332. _Dst = modbus_rt_calloc(1,len_ret << 1);
  333. _Src = modbus_rt_calloc(1,len_list << 2);
  334. for(int i = 0; i < len_list; i++ ) {
  335. _Src[i] = (int32_t)pikaList_getInt(val, i);
  336. }
  337. modbus_data_int2regs(mode, _Dst, _Src, len_list);
  338. PikaList* list = New_PikaList();
  339. for(int i = 0; i < len_ret; i++ ) {
  340. pikaList_append(list, arg_newInt(_Dst[i]));
  341. }
  342. modbus_rt_free(_Dst);
  343. modbus_rt_free(_Src);
  344. return list;
  345. #endif
  346. }
  347. PikaObj* _modbus_rt__data_trans__uint2regs(PikaObj *self, PikaObj* val, int mode) {
  348. #if (!MODBUS_DATA_TRANS_ENABLE)
  349. pika_platform_printf("MODBUS_DATA_TRANS_ENABLE is not enabled.\n");
  350. return NULL;
  351. #else
  352. (void)(self);
  353. uint16_t *_Dst = NULL;
  354. uint32_t * _Src = NULL;
  355. size_t len_list = pikaList_getSize(val);
  356. size_t len_ret = len_list << 1;
  357. _Dst = modbus_rt_calloc(1,len_ret << 1);
  358. _Src = modbus_rt_calloc(1,len_list << 2);
  359. for(int i = 0; i < len_list; i++ ) {
  360. _Src[i] = (uint32_t)pikaList_getInt(val, i);
  361. }
  362. modbus_data_uint2regs(mode, _Dst, _Src, len_list);
  363. PikaList* list = New_PikaList();
  364. for(int i = 0; i < len_ret; i++ ) {
  365. pikaList_append(list, arg_newInt(_Dst[i]));
  366. }
  367. modbus_rt_free(_Dst);
  368. modbus_rt_free(_Src);
  369. return list;
  370. #endif
  371. }
  372. PikaObj* _modbus_rt__data_trans__long2regs(PikaObj *self, PikaObj* val, int mode) {
  373. #if (!MODBUS_DATA_TRANS_ENABLE)
  374. pika_platform_printf("MODBUS_DATA_TRANS_ENABLE is not enabled.\n");
  375. return NULL;
  376. #else
  377. (void)(self);
  378. uint16_t *_Dst = NULL;
  379. int64_t * _Src = NULL;
  380. size_t len_list = pikaList_getSize(val);
  381. size_t len_ret = len_list << 2;
  382. _Dst = modbus_rt_calloc(1,len_ret << 1);
  383. _Src = modbus_rt_calloc(1,len_list << 3);
  384. for(int i = 0; i < len_list; i++ ) {
  385. _Src[i] = (int64_t)pikaList_getInt(val, i);
  386. }
  387. modbus_data_long2regs(mode, _Dst, _Src, len_list);
  388. PikaList* list = New_PikaList();
  389. for(int i = 0; i < len_ret; i++ ) {
  390. pikaList_append(list, arg_newInt(_Dst[i]));
  391. }
  392. modbus_rt_free(_Dst);
  393. modbus_rt_free(_Src);
  394. return list;
  395. #endif
  396. }
  397. PikaObj* _modbus_rt__data_trans__float2regs(PikaObj *self, PikaObj* val, int mode) {
  398. #if (!MODBUS_DATA_TRANS_ENABLE)
  399. pika_platform_printf("MODBUS_DATA_TRANS_ENABLE is not enabled.\n");
  400. return NULL;
  401. #else
  402. (void)(self);
  403. uint16_t *_Dst = NULL;
  404. float * _Src = NULL;
  405. size_t len_list = pikaList_getSize(val);
  406. size_t len_ret = len_list << 1;
  407. _Dst = modbus_rt_calloc(1,len_ret << 1);
  408. _Src = modbus_rt_calloc(1,len_list << 2);
  409. for(int i = 0; i < len_list; i++ ) {
  410. _Src[i] = (float)pikaList_getFloat(val, i);
  411. }
  412. modbus_data_float2regs(mode, _Dst, _Src, len_list);
  413. PikaList* list = New_PikaList();
  414. for(int i = 0; i < len_ret; i++ ) {
  415. pikaList_append(list, arg_newInt(_Dst[i]));
  416. }
  417. modbus_rt_free(_Dst);
  418. modbus_rt_free(_Src);
  419. return list;
  420. #endif
  421. }
  422. PikaObj* _modbus_rt__data_trans__double2regs(PikaObj *self, PikaObj* val, int mode) {
  423. #if (!MODBUS_DATA_TRANS_ENABLE)
  424. pika_platform_printf("MODBUS_DATA_TRANS_ENABLE is not enabled.\n");
  425. return NULL;
  426. #else
  427. (void)(self);
  428. uint16_t *_Dst = NULL;
  429. double * _Src = NULL;
  430. size_t len_list = pikaList_getSize(val);
  431. size_t len_ret = len_list << 2;
  432. _Dst = modbus_rt_calloc(1,len_ret << 1);
  433. _Src = modbus_rt_calloc(1,len_list << 3);
  434. for(int i = 0; i < len_list; i++ ) {
  435. _Src[i] = (double)pikaList_getFloat(val, i);
  436. }
  437. modbus_data_double2regs(mode, _Dst, _Src, len_list);
  438. PikaList* list = New_PikaList();
  439. for(int i = 0; i < len_ret; i++ ) {
  440. pikaList_append(list, arg_newInt(_Dst[i]));
  441. }
  442. modbus_rt_free(_Dst);
  443. modbus_rt_free(_Src);
  444. return list;
  445. #endif
  446. }