/src/ttap3_util.c

https://gitlab.com/farmos_public/libtp3 · C · 958 lines · 779 code · 138 blank · 41 comment · 123 complexity · 9df09e59d1c660f64e981611bb730c1f MD5 · raw file

  1. /**
  2. * \file ttap3_util.c
  3. * \brief TTAK.KO-06.0288 Part 3 구현에 사용되는 유틸리티 함수 및 데이터타입
  4. */
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <time.h>
  9. #include <ttap3_define.h>
  10. #include <ttap3_config.h>
  11. #include <ttap3_base.h>
  12. #include <ttap3_util.h>
  13. #include <../util/mem.h>
  14. #ifdef _MSC_VER
  15. #define localtime_r localtime_s
  16. #endif
  17. void
  18. tp3_setgcgprof (ptp3_gcgprof_t pgcgprof, byte *serial, byte *model, byte *ipv4, byte *ipv6, int installsite, byte mcutype, byte ostype, int osver, byte ramsize, byte powertype, int swver) {
  19. strcpy ((char *)pgcgprof->serial, (const char *)serial);
  20. strcpy ((char *)pgcgprof->model, (const char *)model);
  21. memcpy (pgcgprof->ipv4, ipv4, 4);
  22. memcpy (pgcgprof->ipv6, ipv6, 6);
  23. pgcgprof->installsite = installsite;
  24. pgcgprof->mcutype = mcutype;
  25. pgcgprof->ostype = ostype;
  26. pgcgprof->osver = osver;
  27. pgcgprof->ramsize = ramsize;
  28. pgcgprof->powertype = powertype;
  29. pgcgprof->swver = swver;
  30. }
  31. tp3_stat_t
  32. tp3_readfields_gcgprof (ptp3_msg_t pmsg, ptp3_gcgprof_t pgcgprof) {
  33. tp3_fdata_t data;
  34. int len;
  35. len = tp3_readfield (pmsg, TP3_FC_SERIALNUM, &data);
  36. strncpy ((char *)pgcgprof->serial, (const char *)data.pbyte, len);
  37. (pgcgprof->serial)[len] = '\0';
  38. len = tp3_readfield (pmsg, TP3_FC_MODELNUM, &data);
  39. strncpy ((char *)pgcgprof->model, (const char *)data.pbyte, len);
  40. (pgcgprof->model)[len] = '\0';
  41. len = tp3_readfield (pmsg, TP3_FC_IPV4ADDR, &data);
  42. memcpy (pgcgprof->ipv4, &(data.data), 4);
  43. len = tp3_readfield (pmsg, TP3_FC_IPV6ADDR, &data);
  44. memcpy (pgcgprof->ipv6, data.pbyte, 6);
  45. len = tp3_readfield (pmsg, TP3_FC_INSTSITE, &data);
  46. pgcgprof->installsite = data.data;
  47. len = tp3_readfield (pmsg, TP3_FC_MCUTYPE, &data);
  48. pgcgprof->mcutype = data.data;
  49. len = tp3_readfield (pmsg, TP3_FC_OSTYPE, &data);
  50. pgcgprof->ostype = data.data;
  51. len = tp3_readfield (pmsg, TP3_FC_OSVER, &data);
  52. pgcgprof->osver = data.data;
  53. len = tp3_readfield (pmsg, TP3_FC_RAMSIZE, &data);
  54. pgcgprof->ramsize = data.data;
  55. len = tp3_readfield (pmsg, TP3_FC_POWTYPE, &data);
  56. pgcgprof->powertype = data.data;
  57. len = tp3_readfield (pmsg, TP3_FC_SWVER, &data);
  58. pgcgprof->swver = data.data;
  59. return TP3_SC_NOERROR;
  60. }
  61. tp3_stat_t
  62. tp3_addfields_gcgprof (ptp3_msg_t pmsg, ptp3_gcgprof_t pgcgprof) {
  63. TP3_STAT_NOERROR (
  64. tp3_addfield_nbytes (pmsg, TP3_FC_SERIALNUM,
  65. strlen ((const char *)pgcgprof->serial), pgcgprof->serial));
  66. TP3_STAT_NOERROR (
  67. tp3_addfield_nbytes (pmsg, TP3_FC_MODELNUM,
  68. strlen ((const char *)pgcgprof->model), pgcgprof->model));
  69. TP3_STAT_NOERROR (
  70. tp3_addfield_nbytes (pmsg, TP3_FC_IPV4ADDR, 4, pgcgprof->ipv4));
  71. TP3_STAT_NOERROR (
  72. tp3_addfield_nbytes (pmsg, TP3_FC_IPV6ADDR, 6, pgcgprof->ipv6));
  73. TP3_STAT_NOERROR (
  74. tp3_addfield_num (pmsg, TP3_FC_INSTSITE, pgcgprof->installsite));
  75. TP3_STAT_NOERROR (
  76. tp3_addfield_num (pmsg, TP3_FC_MCUTYPE, pgcgprof->mcutype));
  77. TP3_STAT_NOERROR (
  78. tp3_addfield_num (pmsg, TP3_FC_OSTYPE, pgcgprof->ostype));
  79. TP3_STAT_NOERROR (
  80. tp3_addfield_num (pmsg, TP3_FC_OSVER, pgcgprof->osver));
  81. TP3_STAT_NOERROR (
  82. tp3_addfield_num (pmsg, TP3_FC_RAMSIZE, pgcgprof->ramsize));
  83. TP3_STAT_NOERROR (
  84. tp3_addfield_num (pmsg, TP3_FC_POWTYPE, pgcgprof->powertype));
  85. TP3_STAT_NOERROR (
  86. tp3_addfield_num (pmsg, TP3_FC_SWVER, pgcgprof->swver));
  87. return TP3_SC_NOERROR;
  88. }
  89. tp3_stat_t
  90. tp3_readfields_senattr (ptp3_msg_t pmsg, ptp3_senattr_t psenattr) {
  91. tp3_fdata_t data;
  92. int tmp;
  93. TP3_STAT_RETURN (0 > tp3_readfield (pmsg, TP3_FC_SNID, &data), TP3_SC_NOREQFIELD_ERR);
  94. tmp = data.data;
  95. TP3_STAT_RETURN (0 > tp3_readfield (pmsg, TP3_FC_SID, &data), TP3_SC_NOREQFIELD_ERR);
  96. psenattr->gsid = tp3_getgid (tmp, data.data);
  97. TP3_STAT_RETURN (0 > tp3_readfield (pmsg, TP3_FC_SENTYPE, &data), TP3_SC_NOREQFIELD_ERR);
  98. psenattr->sentype = data.data;
  99. TP3_STAT_RETURN (0 > tp3_readfield (pmsg, TP3_FC_SENDATATYPE, &data), TP3_SC_NOREQFIELD_ERR);
  100. psenattr->datatype = data.data;
  101. TP3_STAT_RETURN (0 > tp3_readfield (pmsg, TP3_FC_SENGETTYPE, &data), TP3_SC_NOREQFIELD_ERR);
  102. psenattr->gathertype = data.data;
  103. if (psenattr->gathertype == TP3_SENGT_PERIOD) {
  104. TP3_STAT_RETURN (0 > tp3_readfield (pmsg, TP3_FC_SENGETINTV, &data), TP3_SC_NOREQFIELD_ERR);
  105. psenattr->gatherinterval = tp3_getinterval (data.pbyte);
  106. }
  107. if (tp3_readfield (pmsg, TP3_FC_MAXVALUE, &data) > 0)
  108. psenattr->maxval = data.data;
  109. if (tp3_readfield (pmsg, TP3_FC_MINVALUE, &data) > 0)
  110. psenattr->minval = data.data;
  111. if (tp3_readfield (pmsg, TP3_FC_PRECISION, &data) > 0)
  112. psenattr->precision = data.data;
  113. if (tp3_readfield (pmsg, TP3_FC_ERRRANGE, &data) > 0)
  114. psenattr->errrange = data.data;
  115. if (psenattr->gathertype == TP3_SENGT_EVENT) {
  116. TP3_STAT_RETURN (0 > tp3_readfield (pmsg, TP3_FC_THRESHOLDTYPE, &data), TP3_SC_NOREQFIELD_ERR);
  117. psenattr->thresholdtype = data.data;
  118. TP3_STAT_RETURN (0 > tp3_readfield (pmsg, TP3_FC_THRESHOLD, &data), TP3_SC_NOREQFIELD_ERR);
  119. psenattr->threshold = data.data;
  120. }
  121. return TP3_SC_NOERROR;
  122. }
  123. tp3_stat_t
  124. tp3_addfields_senattr (ptp3_msg_t pmsg, ptp3_senattr_t psenattr) {
  125. TP3_STAT_NOERROR (
  126. tp3_addfield_num (pmsg, TP3_FC_SNID, tp3_getnid(psenattr->gsid)));
  127. TP3_STAT_NOERROR (
  128. tp3_addfield_num (pmsg, TP3_FC_SID, tp3_getdevid(psenattr->gsid)));
  129. TP3_STAT_NOERROR (
  130. tp3_addfield_num (pmsg, TP3_FC_SENTYPE, psenattr->sentype));
  131. TP3_STAT_NOERROR (
  132. tp3_addfield_num (pmsg, TP3_FC_SENDATATYPE, psenattr->datatype));
  133. TP3_STAT_NOERROR (
  134. tp3_addfield_num (pmsg, TP3_FC_SENGETTYPE, psenattr->gathertype));
  135. if (psenattr->gathertype == TP3_SENGT_PERIOD) {
  136. TP3_STAT_NOERROR (
  137. tp3_addfield_interval (pmsg, TP3_FC_SENGETINTV, psenattr->gatherinterval));
  138. }
  139. TP3_STAT_NOERROR (
  140. tp3_addfield_num (pmsg, TP3_FC_MAXVALUE, psenattr->maxval));
  141. TP3_STAT_NOERROR (
  142. tp3_addfield_num (pmsg, TP3_FC_MINVALUE, psenattr->minval));
  143. TP3_STAT_NOERROR (
  144. tp3_addfield_num (pmsg, TP3_FC_PRECISION, psenattr->precision));
  145. TP3_STAT_NOERROR (
  146. tp3_addfield_num (pmsg, TP3_FC_ERRRANGE, psenattr->errrange));
  147. if (psenattr->gathertype == TP3_SENGT_EVENT) {
  148. TP3_STAT_NOERROR (
  149. tp3_addfield_interval (pmsg, TP3_FC_THRESHOLDTYPE, psenattr->thresholdtype));
  150. TP3_STAT_NOERROR (
  151. tp3_addfield_interval (pmsg, TP3_FC_THRESHOLD, psenattr->threshold));
  152. }
  153. return TP3_SC_NOERROR;
  154. }
  155. tp3_stat_t
  156. tp3_readfields_actattr (ptp3_msg_t pmsg, ptp3_actattr_t pactattr) {
  157. tp3_fdata_t data;
  158. int tmp;
  159. TP3_STAT_RETURN (0 > tp3_readfield (pmsg, TP3_FC_ANID, &data), TP3_SC_NOREQFIELD_ERR);
  160. tmp = data.data;
  161. TP3_STAT_RETURN (0 > tp3_readfield (pmsg, TP3_FC_AID, &data), TP3_SC_NOREQFIELD_ERR);
  162. pactattr->gaid = tp3_getgid (tmp, data.data);
  163. TP3_STAT_RETURN (0 > tp3_readfield (pmsg, TP3_FC_ACTTYPE, &data), TP3_SC_NOREQFIELD_ERR);
  164. pactattr->acttype = data.data;
  165. TP3_STAT_RETURN (0 > tp3_readfield (pmsg, TP3_FC_ACTDATATYPE, &data), TP3_SC_NOREQFIELD_ERR);
  166. pactattr->datatype = data.data;
  167. TP3_STAT_RETURN (0 > tp3_readfield (pmsg, TP3_FC_ACTGETTYPE, &data), TP3_SC_NOREQFIELD_ERR);
  168. pactattr->gathertype = data.data;
  169. if (pactattr->gathertype == TP3_ACTGT_PERIOD) {
  170. TP3_STAT_RETURN (0 > tp3_readfield (pmsg, TP3_FC_ACTGETINTV, &data), TP3_SC_NOREQFIELD_ERR);
  171. pactattr->gatherinterval = tp3_getinterval (data.pbyte);
  172. }
  173. return TP3_SC_NOERROR;
  174. }
  175. tp3_stat_t
  176. tp3_addfields_actattr (ptp3_msg_t pmsg, ptp3_actattr_t pactattr) {
  177. TP3_STAT_NOERROR (
  178. tp3_addfield_num (pmsg, TP3_FC_ANID, tp3_getnid(pactattr->gaid)));
  179. TP3_STAT_NOERROR (
  180. tp3_addfield_num (pmsg, TP3_FC_AID, tp3_getdevid(pactattr->gaid)));
  181. TP3_STAT_NOERROR (
  182. tp3_addfield_num (pmsg, TP3_FC_ACTTYPE, pactattr->acttype));
  183. TP3_STAT_NOERROR (
  184. tp3_addfield_num (pmsg, TP3_FC_ACTDATATYPE, pactattr->datatype));
  185. TP3_STAT_NOERROR (
  186. tp3_addfield_num (pmsg, TP3_FC_ACTGETTYPE, pactattr->gathertype));
  187. if (pactattr->gathertype == TP3_ACTGT_PERIOD) {
  188. TP3_STAT_NOERROR (
  189. tp3_addfield_interval (pmsg, TP3_FC_SENGETINTV, pactattr->gatherinterval));
  190. }
  191. return TP3_SC_NOERROR;
  192. }
  193. int
  194. tp3_getgid (int nid, int devid) {
  195. return (nid << 8) + devid;
  196. }
  197. int
  198. tp3_getdevid (int gid) {
  199. return gid & 0xFF;
  200. }
  201. int
  202. tp3_getnid (int gid) {
  203. return gid >> 8;
  204. }
  205. tp3_stat_t
  206. tp3_initnodedata (ptp3_nodedata_t pnode, int numofdev, int *gids, tp3_dev_t devtype) {
  207. TP3_STAT_RETURN ((devtype != TP3_DEV_SNODE) && (devtype != TP3_DEV_ANODE),
  208. TP3_SC_NOT_PROPER_DEVTYPE);
  209. memset ((void *)pnode, 0x00, sizeof (tp3_nodedata_t));
  210. pnode->numofdev = numofdev;
  211. pnode->devtype = devtype;
  212. if (numofdev > 0) {
  213. pnode->gids = (int *)MALLOC(sizeof(int) * numofdev);
  214. pnode->stats = (tp3_devstat_t *)MALLOC(sizeof(tp3_devstat_t) * numofdev);
  215. pnode->envs = (int *)MALLOC(sizeof(int) * numofdev);
  216. if (devtype == TP3_DEV_SENSOR) {
  217. pnode->attrs = (void *)MALLOC(sizeof(tp3_senattr_t) * numofdev);
  218. } else {
  219. pnode->attrs = (void *)MALLOC(sizeof(tp3_actattr_t) * numofdev);
  220. }
  221. if (pnode->gids == NULL || pnode->stats == NULL
  222. || pnode->envs == NULL || pnode->attrs == NULL) {
  223. FREE (pnode->gids);
  224. FREE (pnode->stats);
  225. FREE (pnode->envs);
  226. FREE (pnode->attrs);
  227. TP3_STAT_PRETURN ("tp3_initnodedata : memory allocation for ptp3_nodedata_t",
  228. TP3_SC_MEMORY_ALLOCATION_FAIL);
  229. }
  230. memcpy ((void *)(pnode->gids), (void *)gids, sizeof(int) * numofdev);
  231. memset ((void *)(pnode->stats), 0x00, sizeof(tp3_nodestat_t) * numofdev);
  232. memset ((void *)(pnode->envs), 0x00, sizeof(int) * numofdev);
  233. if (devtype == TP3_DEV_SENSOR) {
  234. memset ((void *)(pnode->attrs), 0x00, sizeof(tp3_senattr_t) * numofdev);
  235. } else {
  236. memset ((void *)(pnode->attrs), 0x00, sizeof(tp3_actattr_t) * numofdev);
  237. }
  238. }
  239. return TP3_SC_NOERROR;
  240. }
  241. int
  242. tp3_getidxdev (ptp3_nodedata_t pnode, int gid) {
  243. int i;
  244. for (i = 0; i < pnode->numofdev; i++) {
  245. if ((pnode->gids)[i] == gid) {
  246. return i;
  247. }
  248. }
  249. return -1;
  250. }
  251. tp3_stat_t
  252. tp3_setdevenv (ptp3_nodedata_t pnode, int gid, int env) {
  253. int idx = tp3_getidxdev(pnode, gid);
  254. TP3_STAT_RETURN (idx < 0, TP3_SC_NOT_FOUND_DEVID);
  255. (pnode->envs)[idx] = env;
  256. return TP3_SC_NOERROR;
  257. }
  258. tp3_stat_t
  259. tp3_setdevstat (ptp3_nodedata_t pnode, int gid, tp3_devstat_t stat) {
  260. int idx = tp3_getidxdev(pnode, gid);
  261. TP3_STAT_RETURN (idx < 0, TP3_SC_NOT_FOUND_DEVID);
  262. (pnode->stats)[idx] = stat;
  263. return TP3_SC_NOERROR;
  264. }
  265. tp3_stat_t
  266. tp3_setdevattr (ptp3_nodedata_t pnode, int gid, void *attr) {
  267. int idx = tp3_getidxdev(pnode, gid);
  268. TP3_STAT_RETURN (idx < 0, TP3_SC_NOT_FOUND_DEVID);
  269. if (pnode->devtype == TP3_DEV_SENSOR) {
  270. ptp3_senattr_t pattr = (ptp3_senattr_t)(pnode->attrs);
  271. memcpy ((void *)(pattr + idx), attr, sizeof(tp3_senattr_t));
  272. } else {
  273. ptp3_actattr_t pattr = (ptp3_actattr_t)(pnode->attrs);
  274. memcpy ((void *)(pattr + idx), attr, sizeof(tp3_actattr_t));
  275. }
  276. return TP3_SC_NOERROR;
  277. }
  278. void
  279. tp3_releasenodedata (ptp3_nodedata_t pnode) {
  280. FREE (pnode->gids);
  281. FREE (pnode->envs);
  282. FREE (pnode->stats);
  283. FREE (pnode->attrs);
  284. }
  285. void
  286. tp3_setsenattr (ptp3_senattr_t psenattr, int gsid, tp3_sentype_t sentype, tp3_sendatatype_t datatype, tp3_sengathertype_t gathertype, int gatherinterval, int maxval, int minval, int precision, int errrange, tp3_senthrsdtype_t thresholdtype, int threshold) {
  287. psenattr->gsid = gsid;
  288. psenattr->sentype = sentype;
  289. psenattr->datatype = datatype;
  290. psenattr->gathertype = gathertype;
  291. psenattr->gatherinterval = gatherinterval;
  292. psenattr->maxval = maxval;
  293. psenattr->minval = minval;
  294. psenattr->precision = precision;
  295. psenattr->errrange = errrange;
  296. psenattr->thresholdtype = thresholdtype;
  297. psenattr->threshold = threshold;
  298. }
  299. void
  300. tp3_setactattr (ptp3_actattr_t pactattr, int gaid, tp3_acttype_t acttype, tp3_actdatatype_t datatype, tp3_actgathertype_t gathertype, int gatherinterval) {
  301. pactattr->gaid = gaid;
  302. pactattr->acttype = acttype;
  303. pactattr->datatype = datatype;
  304. pactattr->gathertype = gathertype;
  305. pactattr->gatherinterval = gatherinterval;
  306. }
  307. void
  308. tp3_initnset (ptp3_nsetdata_t pnset) {
  309. memset ((void *)pnset, 0x00, sizeof (tp3_nsetdata_t));
  310. }
  311. int
  312. tp3_getidxnode (ptp3_nsetdata_t pnset, int nodeid) {
  313. int i;
  314. for (i = 0; i < pnset->numofnode; i++) {
  315. if ((pnset->nids)[i] == nodeid) {
  316. return i;
  317. }
  318. }
  319. return -1;
  320. }
  321. tp3_stat_t
  322. tp3_updatenset (ptp3_nsetdata_t pnset, int nodeid, ptp3_nodedata_t pnode) {
  323. int idx = tp3_getidxnode(pnset, nodeid);
  324. if (pnode == NULL) {
  325. TP3_STAT_RETURN (idx < 0, TP3_SC_NOT_FOUND_NODEID);
  326. return tp3_delnset (pnset, nodeid);
  327. } else {
  328. if (idx < 0) {
  329. return tp3_addnset (pnset, nodeid, pnode);
  330. } else {
  331. pnset->numofdev += (pnode->numofdev - (pnset->nodedata)[idx].numofdev);
  332. tp3_releasenodedata ((pnset->nodedata) + idx);
  333. memcpy ((void *)((pnset->nodedata) + idx), (void *)pnode, sizeof(tp3_nodedata_t));
  334. return TP3_SC_NOERROR;
  335. }
  336. }
  337. }
  338. tp3_stat_t
  339. tp3_addnset (ptp3_nsetdata_t pnset, int nodeid, ptp3_nodedata_t pnode) {
  340. int idx = tp3_getidxnode(pnset, nodeid);
  341. void *ptr1, *ptr2, *ptr3;
  342. TP3_STAT_RETURN (idx >= 0, TP3_SC_EXIST_NODEID);
  343. (pnset->numofnode)++;
  344. ptr1 = REALLOC(pnset->nids, sizeof(int) * pnset->numofnode);
  345. ptr2 = REALLOC(pnset->stats, sizeof(tp3_nodestat_t) * pnset->numofnode);
  346. ptr3 = REALLOC(pnset->nodedata, sizeof(tp3_nodedata_t) * pnset->numofnode);
  347. if (ptr1 == NULL || ptr2 == NULL || ptr3 == NULL) {
  348. if (ptr1 == NULL) {
  349. FREE (pnset->nids);
  350. } else if (ptr2 == NULL) {
  351. FREE (pnset->stats);
  352. } else {
  353. FREE (pnset->nodedata);
  354. }
  355. FREE (ptr1);
  356. FREE (ptr2);
  357. FREE (ptr3);
  358. TP3_STAT_PRETURN ("tp3_initnset : memory reallocation for ptp3_nsetdata_t",
  359. TP3_SC_MEMORY_ALLOCATION_FAIL);
  360. }
  361. pnset->nids = (int *)ptr1;
  362. pnset->stats = (tp3_nodestat_t *)ptr2;
  363. pnset->nodedata = (tp3_nodedata_t *)ptr3;
  364. (pnset->nids)[pnset->numofnode - 1] = nodeid;
  365. (pnset->stats)[pnset->numofnode - 1] = TP3_NODEST_NORMAL;
  366. memcpy ((void *)((pnset->nodedata) + (pnset->numofnode - 1)), (void *)pnode, sizeof(tp3_nodedata_t));
  367. pnset->numofdev += pnode->numofdev;
  368. return TP3_SC_NOERROR;
  369. }
  370. tp3_stat_t
  371. tp3_delnset (ptp3_nsetdata_t pnset, int nodeid) {
  372. int idx = tp3_getidxnode(pnset, nodeid);
  373. TP3_STAT_RETURN (idx < 0, TP3_SC_NOT_FOUND_NODEID);
  374. (pnset->numofnode)--;
  375. pnset->numofdev -= (pnset->nodedata + idx)->numofdev;
  376. tp3_releasenodedata (pnset->nodedata + idx);
  377. (pnset->nids)[idx] = (pnset->nids)[pnset->numofnode];
  378. (pnset->stats)[idx] = (pnset->stats)[pnset->numofnode];
  379. (pnset->nodedata)[idx] = (pnset->nodedata)[pnset->numofnode];
  380. return TP3_SC_NOERROR;
  381. }
  382. tp3_stat_t
  383. tp3_setnodestat (ptp3_nsetdata_t pnset, int nodeid, tp3_nodestat_t nstat) {
  384. int idx = tp3_getidxnode(pnset, nodeid);
  385. TP3_STAT_RETURN (idx < 0, TP3_SC_NOT_FOUND_NODEID);
  386. (pnset->stats)[idx] = nstat;
  387. return TP3_SC_NOERROR;
  388. }
  389. void
  390. tp3_releasenset (ptp3_nsetdata_t pnset) {
  391. int i;
  392. for (i = 0; i < pnset->numofnode; i++) {
  393. tp3_releasenodedata (pnset->nodedata + i);
  394. }
  395. FREE (pnset->nids);
  396. FREE (pnset->stats);
  397. FREE (pnset->nodedata);
  398. }
  399. int
  400. tp3_readfield_array (ptp3_msg_t pmsg, tp3_fieldcode_t fc, int *arr, int maxsize) {
  401. tp3_fdata_t data;
  402. //int i, size, len;
  403. int len;
  404. byte *ptr;
  405. len = tp3_readfield (pmsg, fc, &data);
  406. TP3_EXP_RETURN (len < 0, -1, TP3_SC_NOREQFIELD_ERR);
  407. /*
  408. switch (fc) {
  409. case TP3_FC_ARROFSNID:
  410. case TP3_FC_ARROFANID:
  411. //size = _TP3_NODEID_SIZE;
  412. //break;
  413. case TP3_FC_ARROFGSID:
  414. case TP3_FC_ARROFGAID:
  415. //size = _TP3_GID_SIZE;
  416. //break;
  417. case TP3_FC_ARROFSNSTAT:
  418. case TP3_FC_ARROFANSTAT:
  419. case TP3_FC_ARROFSENSSTAT:
  420. case TP3_FC_ARROFACTSSTAT:
  421. //size = _TP3_STAT_SIZE;
  422. //break;
  423. case TP3_FC_ARROFSENSVAL:
  424. //size = _TP3_SENDATA_SIZE;
  425. //break;
  426. case TP3_FC_ARROFACTSVAL:
  427. //size = _TP3_ACTDATA_SIZE;
  428. break;
  429. default:
  430. TP3_EXP_RETURN (1, -1, TP3_SC_NOREQFIELD_ERR);
  431. }
  432. */
  433. if (len > _TP3_FDATA_LIMIT)
  434. ptr = data.pbyte;
  435. else
  436. ptr = (byte *)&(data.data);
  437. if (len > maxsize * sizeof(int))
  438. len = maxsize * sizeof(int);
  439. memcpy (arr, ptr, len);
  440. return len / sizeof(int);
  441. /*
  442. len = len / size;
  443. for (i = 0; i < len && i < maxsize; i++) {
  444. arr[i] = tp3_readnum (ptr + i * size, size);
  445. }
  446. return i;
  447. */
  448. }
  449. tp3_stat_t
  450. tp3_nsettoarray (ptp3_nsetdata_t pnset, tp3_fieldcode_t fc, int *length, byte **pbyte) {
  451. int len, i, j;
  452. ptp3_nodedata_t pdev;
  453. int *ptr;
  454. switch (fc) {
  455. case TP3_FC_ARROFSNID:
  456. case TP3_FC_ARROFANID:
  457. len = pnset->numofnode;
  458. ptr = (int *) MALLOC (len * sizeof(int));
  459. TP3_STAT_RETURN ((ptr == NULL), TP3_SC_MEMORY_ALLOCATION_FAIL);
  460. for (i = 0; i < len; i ++) {
  461. ptr[i] = pnset->nids[i];
  462. }
  463. break;
  464. case TP3_FC_ARROFGSID:
  465. case TP3_FC_ARROFGAID:
  466. len = pnset->numofdev;
  467. ptr = (int *) MALLOC (len * sizeof(int));
  468. TP3_STAT_RETURN ((ptr == NULL), TP3_SC_MEMORY_ALLOCATION_FAIL);
  469. pdev = pnset->nodedata;
  470. j = 0;
  471. if ( pdev->gids != NULL ) {
  472. for (i = 0; i < len; i++) {
  473. ptr[i] = pdev->gids[j++];
  474. if (j == pdev->numofdev) {
  475. pdev++;
  476. j = 0;
  477. }
  478. }
  479. }
  480. break;
  481. case TP3_FC_ARROFSNSTAT:
  482. case TP3_FC_ARROFANSTAT:
  483. len = pnset->numofnode;
  484. ptr = (int *) MALLOC (len * sizeof(int));
  485. TP3_STAT_RETURN ((ptr == NULL), TP3_SC_MEMORY_ALLOCATION_FAIL);
  486. for (i = 0; i < len; i++) {
  487. ptr[i] = pnset->stats[i];
  488. }
  489. break;
  490. case TP3_FC_ARROFSENSSTAT:
  491. case TP3_FC_ARROFACTSSTAT:
  492. len = pnset->numofdev;
  493. ptr = (int *) MALLOC (len * sizeof(int));
  494. TP3_STAT_RETURN ((ptr == NULL), TP3_SC_MEMORY_ALLOCATION_FAIL);
  495. pdev = pnset->nodedata;
  496. j = 0;
  497. if ( pdev->stats != NULL ) {
  498. for (i = 0; i < len; i++) {
  499. ptr[i] = pdev->stats[j++];
  500. if (j == pdev->numofdev) {
  501. pdev++;
  502. j = 0;
  503. }
  504. }
  505. }
  506. break;
  507. case TP3_FC_ARROFSENSVAL:
  508. case TP3_FC_ARROFACTSVAL:
  509. len = pnset->numofdev;
  510. ptr = (int *) MALLOC (len * sizeof(int));
  511. TP3_STAT_RETURN ((ptr == NULL), TP3_SC_MEMORY_ALLOCATION_FAIL);
  512. pdev = pnset->nodedata;
  513. j = 0;
  514. if ( pdev->envs != NULL ){
  515. for (i = 0; i < len; i++) {
  516. ptr[i] = pdev->envs[j++];
  517. if (j == pdev->numofdev) {
  518. pdev++;
  519. j = 0;
  520. }
  521. }
  522. }
  523. break;
  524. default:
  525. return TP3_SC_MSGTYPE_ERR;
  526. }
  527. *length = len * sizeof(int);
  528. *pbyte = (byte *)ptr;
  529. return TP3_SC_NOERROR;
  530. }
  531. tp3_stat_t
  532. tp3_addfield_nsetdata (ptp3_msg_t pmsg, tp3_fieldcode_t fc, ptp3_nsetdata_t pnset) {
  533. int length;
  534. byte *pbyte;
  535. TP3_STAT_NOERROR (tp3_nsettoarray (pnset, fc, &length, &pbyte));
  536. TP3_STAT_NOERROR (tp3_addfield_nbytes (pmsg, fc, length, pbyte));
  537. // by chj 2015.9.30
  538. // memory leak
  539. FREE(pbyte) ;
  540. return TP3_SC_NOERROR;
  541. }
  542. void
  543. tp3_settimestamp (byte *ptr, time_t epoch) {
  544. struct tm t;
  545. byte tmp;
  546. localtime_r (&epoch, &t);
  547. tmp = (t.tm_year + 1900) / 100;
  548. ptr[0] = ((tmp / 10) << 4) | tmp % 10;
  549. tmp = (t.tm_year + 1900) % 100;
  550. ptr[1] = ((tmp / 10) << 4) | tmp % 10;
  551. tmp = (t.tm_mon + 1);
  552. ptr[2] = ((tmp / 10) << 4) | tmp % 10;
  553. tmp = t.tm_mday;
  554. ptr[3] = ((tmp / 10) << 4) | tmp % 10;
  555. tmp = t.tm_hour;
  556. ptr[4] = ((tmp / 10) << 4) | tmp % 10;
  557. tmp = t.tm_min;
  558. ptr[5] = ((tmp / 10) << 4) | tmp % 10;
  559. tmp = t.tm_sec;
  560. ptr[6] = ((tmp / 10) << 4) | tmp % 10;
  561. }
  562. time_t
  563. tp3_getepoch (byte *ptr) {
  564. struct tm t;
  565. t.tm_year = ((ptr[0] / 16) * 10 + (ptr[0] & 0xF)) * 100;
  566. t.tm_year += (ptr[1] / 16) * 10 + (ptr[1] & 0xF) - 1900;
  567. t.tm_mon = (ptr[2] / 16) * 10 + (ptr[2] & 0xF) - 1;
  568. t.tm_mday = (ptr[3] / 16) * 10 + (ptr[3] & 0xF);
  569. t.tm_hour = (ptr[4] / 16) * 10 + (ptr[4] & 0xF);
  570. t.tm_min = (ptr[5] / 16) * 10 + (ptr[5] & 0xF);
  571. t.tm_sec = (ptr[6] / 16) * 10 + (ptr[6] & 0xF);
  572. return mktime (&t);
  573. }
  574. tp3_stat_t
  575. tp3_addfield_timestamp (ptp3_msg_t pmsg, tp3_fieldcode_t fc, time_t stamp) {
  576. byte ptr[7];
  577. tp3_settimestamp (ptr, stamp);
  578. return tp3_addfield_bytes (pmsg, fc, ptr);
  579. }
  580. int
  581. tp3_getinterval (byte *ptr) {
  582. return (ptr[0] - '0') * 36000 + (ptr[1] - '0') * 3600
  583. + (ptr[2] - '0') * 600 + (ptr[3] - '0') * 60
  584. + (ptr[4] - '0') * 10 + (ptr[5] - '0');
  585. }
  586. tp3_stat_t
  587. tp3_addfield_interval (ptp3_msg_t pmsg, tp3_fieldcode_t fc, int interval) {
  588. int tmp;
  589. byte ptr[6];
  590. tmp = interval / 3600;
  591. ptr[0] = tmp / 10 + '0';
  592. ptr[1] = tmp % 10 + '0';
  593. tmp = (interval - tmp * 3600) / 60;
  594. ptr[2] = tmp / 10 + '0';
  595. ptr[3] = tmp % 10 + '0';
  596. ptr[4] = (interval % 60) / 10 + '0';
  597. ptr[5] = (interval % 10) + '0';
  598. return tp3_addfield_bytes (pmsg, fc, ptr);
  599. }
  600. tp3_stat_t
  601. tp3_initblock (ptp3_block_t pblock, int rows, int numofsn, int numofsens, int numofan, int numofacts) {
  602. pblock->pitems = (tp3_blockitem_t *)MALLOC(sizeof(tp3_blockitem_t) * rows);
  603. TP3_STAT_RETURN (pblock->pitems == NULL, TP3_SC_MEMORY_ALLOCATION_FAIL);
  604. memset ((void *)(pblock->pitems), 0x00, sizeof(tp3_blockitem_t) * rows);
  605. pblock->rows = rows;
  606. pblock->numofdev[TP3_DEV_SNODE] = numofsn;
  607. pblock->numofdev[TP3_DEV_ANODE] = numofan;
  608. pblock->numofdev[TP3_DEV_SENSOR] = numofsens;
  609. pblock->numofdev[TP3_DEV_ACTUATOR] = numofacts;
  610. pblock->pcuritem = pblock->pitems;
  611. return TP3_SC_NOERROR;
  612. }
  613. void
  614. tp3_nextemptyblockitem (ptp3_block_t pblock, time_t timestamp, tp3_gcgstat_t gcgstat) {
  615. while ((pblock->pcuritem)->timestamp != 0) {
  616. //ASSERT (pblock->pcuritem < pblock->pitems + pblock->rows);
  617. (pblock->pcuritem)++;
  618. }
  619. (pblock->pcuritem)->timestamp = timestamp;
  620. (pblock->pcuritem)->gcgstat = gcgstat;
  621. (pblock->itemidx)[TP3_DEV_SNODE] = (pblock->itemidx)[TP3_DEV_ANODE]
  622. = (pblock->itemidx)[TP3_DEV_SENSOR] = (pblock->itemidx)[TP3_DEV_ACTUATOR] = 0;
  623. }
  624. void
  625. tp3_setblockitem (ptp3_block_t pblock, int id, int value, tp3_dev_t devtype) {
  626. ptp3_blockitem_t pitem = pblock->pcuritem;
  627. int *idx = pblock->itemidx;
  628. pitem->ids[devtype][idx[devtype]] = id;
  629. pitem->vals[devtype][idx[devtype]] = value;
  630. idx[devtype] ++;
  631. }
  632. byte *
  633. tp3_setstatblockbytes (byte *ptr, int numofdev, tp3_dev_t devtype, ptp3_blockitem_t pitem) {
  634. int i;
  635. *ptr = (byte)numofdev;
  636. ptr++;
  637. if (devtype == TP3_DEV_SNODE || devtype == TP3_DEV_ANODE) {
  638. for (i = 0; i < numofdev; i++) {
  639. tp3_set3bytes (ptr, (pitem->ids)[devtype][i]);
  640. ptr += _TP3_NODEID_SIZE;
  641. }
  642. } else {
  643. for (i = 0; i < numofdev; i++) {
  644. tp3_set4bytes (ptr, (pitem->ids)[devtype][i]);
  645. ptr += _TP3_GID_SIZE;
  646. }
  647. }
  648. for (i = 0; i < numofdev; i++) {
  649. *ptr = (pitem->vals)[devtype][i];
  650. ptr++;
  651. }
  652. return ptr;
  653. }
  654. tp3_stat_t
  655. tp3_addfield_statblock (ptp3_msg_t pmsg, ptp3_block_t pblock) {
  656. int i;
  657. byte *pblk, *ptr;
  658. int step = 1 /* 1: gcgstat */
  659. + 1 + 4 * pblock->numofdev[TP3_DEV_SNODE] /* 3 : node id, 1 : status */
  660. + 1 + 4 * pblock->numofdev[TP3_DEV_ANODE] /* 3 : node id, 1 : status */
  661. + 1 + 5 * pblock->numofdev[TP3_DEV_SENSOR] /* 4 : gid, 1 : status */
  662. + 1 + 5 * pblock->numofdev[TP3_DEV_ACTUATOR] /* 4 : gid, 1 : status */
  663. + 7; /* 7 : timestamp */
  664. int size = pblock->rows * step;
  665. pblk = (byte *)MALLOC (sizeof(byte) * size);
  666. TP3_STAT_RETURN (pblk == NULL, TP3_SC_MEMORY_ALLOCATION_FAIL);
  667. for (i = 0; i < pblock->rows; i++) {
  668. ptr = pblk + step * i;
  669. *ptr = (byte)((pblock->pitems + i)->gcgstat);
  670. ptr++;
  671. ptr = tp3_setstatblockbytes (ptr, pblock->numofdev[TP3_DEV_SNODE], TP3_DEV_SNODE, pblock->pitems + i);
  672. ptr = tp3_setstatblockbytes (ptr, pblock->numofdev[TP3_DEV_ANODE], TP3_DEV_ANODE, pblock->pitems + i);
  673. ptr = tp3_setstatblockbytes (ptr, pblock->numofdev[TP3_DEV_SENSOR], TP3_DEV_SENSOR, pblock->pitems + i);
  674. ptr = tp3_setstatblockbytes (ptr, pblock->numofdev[TP3_DEV_ACTUATOR], TP3_DEV_ACTUATOR, pblock->pitems + i);
  675. tp3_settimestamp (ptr, ((pblock->pitems + i)->timestamp));
  676. }
  677. TP3_STAT_NOERROR (tp3_addfield_nbytes (pmsg, TP3_FC_BLKOFSTAT, size, pblk));
  678. return TP3_SC_NOERROR;
  679. }
  680. byte *
  681. tp3_getstatblockbytes (byte *ptr, int numofdev, tp3_dev_t devtype, ptp3_blockitem_t pitem) {
  682. int j;
  683. if (devtype == TP3_DEV_SNODE || devtype == TP3_DEV_ANODE) {
  684. for (j = 0; j < numofdev; j++) {
  685. (pitem->ids)[devtype][j] = tp3_readnum (ptr, _TP3_NODEID_SIZE);
  686. ptr += _TP3_NODEID_SIZE;
  687. }
  688. } else {
  689. for (j = 0; j < numofdev; j++) {
  690. (pitem->ids)[devtype][j] = tp3_readnum (ptr, _TP3_GID_SIZE);
  691. ptr += _TP3_GID_SIZE;
  692. }
  693. }
  694. for (j = 0; j < numofdev; j++) {
  695. (pitem->vals)[devtype][j] = *ptr;
  696. ptr++;
  697. }
  698. return ptr;
  699. }
  700. tp3_stat_t
  701. tp3_parsestatblock (ptp3_block_t pblock, int rows, byte *ptr, int len) {
  702. int numofsn, numofsens, numofan, numofacts;
  703. int i, step;
  704. byte *pblk;
  705. ptp3_blockitem_t pitem;
  706. numofsn = ptr[1];
  707. numofan = ptr[1 + 1 + 4 * numofsn];
  708. numofsens = ptr[1 + 1 + 4 * numofsn + 1 + 4 * numofan];
  709. numofacts = ptr[1 + 1 + 4 * numofsn + 1 + 4 * numofan + 1 + 5 * numofsens];
  710. tp3_initblock (pblock, rows, numofsn, numofsens, numofan, numofacts);
  711. step = 1 /* 1: gcgstat */
  712. + 1 + 4 * pblock->numofdev[TP3_DEV_SNODE] /* 3 : node id, 1 : status */
  713. + 1 + 4 * pblock->numofdev[TP3_DEV_ANODE] /* 3 : node id, 1 : status */
  714. + 1 + 5 * pblock->numofdev[TP3_DEV_SENSOR] /* 4 : gid, 1 : status */
  715. + 1 + 5 * pblock->numofdev[TP3_DEV_ACTUATOR] /* 4 : gid, 1 : status */
  716. + 7; /* 7 : timestamp */
  717. for (i = 0; i < rows; i++) {
  718. pblk = ptr + i * step;
  719. pitem = pblock->pitems + i;
  720. pitem->gcgstat = *pblk;
  721. pblk += 2;
  722. pblk = tp3_getstatblockbytes (pblk, numofsn, TP3_DEV_SNODE, pitem);
  723. pblk++;
  724. pblk = tp3_getstatblockbytes (pblk, numofan, TP3_DEV_ANODE, pitem);
  725. pblk++;
  726. pblk = tp3_getstatblockbytes (pblk, numofsens, TP3_DEV_SENSOR, pitem);
  727. pblk++;
  728. pblk = tp3_getstatblockbytes (pblk, numofacts, TP3_DEV_ACTUATOR, pitem);
  729. pitem->timestamp = tp3_getepoch (pblk);
  730. }
  731. return TP3_SC_NOERROR;
  732. }
  733. byte *
  734. tp3_setenvblockbytes (byte *ptr, int numofdev, tp3_dev_t devtype, ptp3_blockitem_t pitem) {
  735. int i;
  736. *ptr = (byte)numofdev;
  737. ptr++;
  738. for (i = 0; i < numofdev; i++) {
  739. tp3_set4bytes (ptr, (pitem->ids)[devtype][i]);
  740. ptr += _TP3_GID_SIZE;
  741. }
  742. if (devtype == TP3_DEV_ACTUATOR) {
  743. for (i = 0; i < numofdev; i++) {
  744. tp3_set2bytes (ptr, (pitem->vals)[devtype][i]);
  745. ptr += _TP3_ACTDATA_SIZE;
  746. }
  747. } else {
  748. for (i = 0; i < numofdev; i++) {
  749. tp3_set4bytes (ptr, (pitem->vals)[devtype][i]);
  750. ptr += _TP3_SENDATA_SIZE;
  751. }
  752. }
  753. return ptr;
  754. }
  755. byte *
  756. tp3_getenvblockbytes (byte *ptr, int numofdev, tp3_dev_t devtype, ptp3_blockitem_t pitem) {
  757. int i;
  758. for (i = 0; i < numofdev; i++) {
  759. (pitem->ids)[devtype][i] = tp3_readnum (ptr, _TP3_GID_SIZE);
  760. ptr += _TP3_GID_SIZE;
  761. }
  762. if (devtype == TP3_DEV_ACTUATOR) {
  763. for (i = 0; i < numofdev; i++) {
  764. (pitem->vals)[devtype][i] = tp3_readnum (ptr, _TP3_ACTDATA_SIZE);
  765. ptr += _TP3_ACTDATA_SIZE;
  766. }
  767. } else {
  768. for (i = 0; i < numofdev; i++) {
  769. (pitem->vals)[devtype][i] = tp3_readnum (ptr, _TP3_SENDATA_SIZE);
  770. ptr += _TP3_SENDATA_SIZE;
  771. }
  772. }
  773. return ptr;
  774. }
  775. tp3_stat_t
  776. tp3_parseenvblock (ptp3_block_t pblock, int rows, byte *ptr, int len) {
  777. int numofsens, numofacts;
  778. int i, step;
  779. byte *pblk;
  780. ptp3_blockitem_t pitem;
  781. numofsens = ptr[0];
  782. numofacts = ptr[1 + 8 * numofsens];
  783. tp3_initblock (pblock, rows, 0, numofsens, 0, numofacts);
  784. step = 1 + 8 * pblock->numofdev[TP3_DEV_SENSOR] /* 4 : gid, 4 : env */
  785. + 1 + 6 * pblock->numofdev[TP3_DEV_ACTUATOR] /* 4 : gid, 2 : env */
  786. + 7; /* 7 : timestamp */
  787. for (i = 0; i < rows; i++) {
  788. pblk = ptr + i * step;
  789. pitem = pblock->pitems + i;
  790. pblk++;
  791. pblk = tp3_getenvblockbytes (pblk, numofsens, TP3_DEV_SENSOR, pitem);
  792. pblk++;
  793. pblk = tp3_getenvblockbytes (pblk, numofacts, TP3_DEV_ACTUATOR, pitem);
  794. pitem->timestamp = tp3_getepoch (pblk);
  795. }
  796. return TP3_SC_NOERROR;
  797. }
  798. tp3_stat_t
  799. tp3_addfield_envblock (ptp3_msg_t pmsg, ptp3_block_t pblock) {
  800. int i;
  801. byte *pblk, *ptr;
  802. int step = 1 + 8 * pblock->numofdev[TP3_DEV_SENSOR] /* 4 : gid, 4 : env */
  803. + 1 + 6 * pblock->numofdev[TP3_DEV_ACTUATOR] /* 4 : gid, 2 : env */
  804. + 7; /* 7 : timestamp */
  805. int size = pblock->rows * step;
  806. pblk = (byte *)MALLOC (sizeof(byte) * size);
  807. TP3_STAT_RETURN (pblk == NULL, TP3_SC_MEMORY_ALLOCATION_FAIL);
  808. for (i = 0; i < pblock->rows; i++) {
  809. ptr = pblk + step * i;
  810. ptr = tp3_setenvblockbytes (ptr, pblock->numofdev[TP3_DEV_SENSOR], TP3_DEV_SENSOR, pblock->pitems + i);
  811. ptr = tp3_setenvblockbytes (ptr, pblock->numofdev[TP3_DEV_ACTUATOR], TP3_DEV_ACTUATOR, pblock->pitems + i);
  812. tp3_settimestamp (ptr, ((pblock->pitems + i)->timestamp));
  813. }
  814. TP3_STAT_NOERROR (tp3_addfield_nbytes (pmsg, TP3_FC_BLKOFENV, size, pblk));
  815. return TP3_SC_NOERROR;
  816. }
  817. void
  818. tp3_releaseblock (ptp3_block_t pblock) {
  819. FREE (pblock->pitems);
  820. }