gh120x.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>
  5. #include <stdint.h>
  6. #include <syslog.h>
  7. #include <stdarg.h>
  8. #include "../../status.h"
  9. #include "../../feeder.h"
  10. static unsigned char * int_buffer;
  11. static unsigned int int_buffer_pos = 0, int_buffer_pos_wr = 0;
  12. static int imei_flag = 0;
  13. char imei_str[16]; //todo: tohle nejak predavat
  14. unsigned char reply_buffer[32];
  15. unsigned int reply_len;
  16. static double values_out[6];
  17. static uint32_t values_sensor[6];
  18. static time_t values_time;
  19. static uint8_t values_type;
  20. void (* feederLog)(int priority, const char * fmt, ...);
  21. int setLog(void * func)
  22. {
  23. feederLog = func;
  24. return 0;
  25. }
  26. double conv_latlon(char * str)
  27. {
  28. double res;
  29. char min[3], dg[4], * point;
  30. point = strchr(str, '.');
  31. memcpy(dg, str, point - str - 2);
  32. dg[point - str - 2] = 0;
  33. memcpy(min, point - 2, 2);
  34. min[2] = 0;
  35. // printf("str %s: dg %s, min %s, tis %s \n", str, dg, min, point + 1);
  36. // printf("%p, %p, %d\n", str, point, point - str - 2);
  37. res = atof(dg);
  38. res += (atof(min) + atof(point + 1) / 100000) / 60.0;
  39. return res;
  40. }
  41. typedef struct avl_header_t
  42. {
  43. uint16_t dummy __attribute__ ((packed));
  44. char imei[15];
  45. } avl_header_t;
  46. uint16_t byteSwap16(uint16_t value)
  47. {
  48. uint16_t swapped;
  49. swapped = (((0x00FF) & (value >> 8)) |
  50. ((0xFF00) & (value << 8)));
  51. return swapped;
  52. }
  53. uint32_t byteSwap32(uint32_t value)
  54. {
  55. uint32_t swapped;
  56. swapped = (((0x000000FF) & (value >> 24)) |
  57. ((0x0000FF00) & (value >> 8)) |
  58. ((0x00FF0000) & (value << 8)) |
  59. ((0xFF000000) & (value << 24)));
  60. return swapped;
  61. }
  62. uint64_t byteSwap64(uint64_t value)
  63. {
  64. uint64_t swapped;
  65. swapped = (((0x00000000000000FFULL) & (value >> 56)) |
  66. ((0x000000000000FF00ULL) & (value >> 40)) |
  67. ((0x0000000000FF0000ULL) & (value >> 24)) |
  68. ((0x00000000FF000000ULL) & (value >> 8)) |
  69. ((0x000000FF00000000ULL) & (value << 8)) |
  70. ((0x0000FF0000000000ULL) & (value << 24)) |
  71. ((0x00FF000000000000ULL) & (value << 40)) |
  72. ((0xFF00000000000000ULL) & (value << 56)));
  73. return swapped;
  74. }
  75. void arraySwap4(uint8_t * array)
  76. {
  77. uint8_t temp;
  78. temp = array[0];
  79. array[0] = array[3];
  80. array[3] = temp;
  81. temp = array[1];
  82. array[1] = array[2];
  83. array[2] = temp;
  84. }
  85. enum states {STATE_IDLE = 0, STATE_DATA_LENGTH, STATE_CODEC_ID, STATE_NO_OF_REC, STATE_PR_TS, STATE_G_MASK, STATE_MASK,
  86. STATE_LATLON, STATE_ALT, STATE_ANGLE, STATE_SPEED, STATE_SATTS, STATE_CELL, STATE_QUA, STATE_OP,
  87. STATE_IO1_Q, STATE_IO1_ID, STATE_IO1_VAL,
  88. STATE_IO2_Q, STATE_IO2_ID, STATE_IO2_VAL,
  89. STATE_IO4_Q, STATE_IO4_ID, STATE_IO4_VAL,
  90. STATE_NO_OF_REC_END, STATE_CRC
  91. };
  92. unsigned char counts[] =
  93. {
  94. 4, 4, 1, 1, 4, 1, 1,
  95. 8, 2, 1, 1, 1, 4, 1, 4,
  96. 1, 1, 1,
  97. 1, 1, 2,
  98. 1, 1, 4,
  99. 1, 4
  100. };
  101. #define MASK_LATLON(x) (x & 0x01)
  102. #define MASK_ALT(x) ((x >> 1) & 0x01)
  103. #define MASK_ANGLE(x) ((x >> 2) & 0x01)
  104. #define MASK_SPEED(x) ((x >> 3) & 0x01)
  105. #define MASK_SATS(x) ((x >> 4) & 0x01)
  106. #define MASK_CELL(x) ((x >> 5) & 0x01)
  107. #define MASK_QUA(x) ((x >> 6) & 0x01)
  108. #define MASK_OP(x) ((x >> 7) & 0x01)
  109. #define MASK_GEN(x, y) ((x >> y) & 0x01)
  110. #define MASK_GPS(x) (MASK_GEN(x, 0))
  111. #define MASK_IO1(x) (MASK_GEN(x, 1))
  112. #define MASK_IO2(x) (MASK_GEN(x, 2))
  113. #define MASK_IO4(x) (MASK_GEN(x, 3))
  114. #define PRIO_TRACK 0
  115. #define PRIO_PERIODIC 1
  116. #define PRIO_ALARM 2
  117. #define PRIO_UNDEFINED 3
  118. unsigned char maskGlobalNext(unsigned char mask, unsigned char state, unsigned char end_of_data)
  119. {
  120. unsigned int i, c;
  121. unsigned char order[] =
  122. {STATE_G_MASK, STATE_MASK, STATE_IO1_Q, STATE_IO2_Q, STATE_IO4_Q};
  123. c = 0;
  124. // printf("gs%d|%d ", state, mask);
  125. for (i = 0; i < 5; i++)
  126. {
  127. if (order[i] == state)
  128. c = i;
  129. }
  130. for (i = c; i < 5; i++)
  131. {
  132. // printf("g%d|%d ", i, mask);
  133. if (MASK_GEN(mask, i))
  134. {
  135. return order[i + 1];
  136. }
  137. }
  138. // printf("End of rec\n");
  139. if (end_of_data)
  140. return STATE_NO_OF_REC_END;
  141. else
  142. return STATE_PR_TS;
  143. }
  144. unsigned char maskNext(unsigned char mask, unsigned char state)
  145. {
  146. unsigned char i;
  147. for (i = state - STATE_MASK; i < 8; i++)
  148. {
  149. // printf(" %d|%d ", i, mask);
  150. if (MASK_GEN(mask, i))
  151. {
  152. return STATE_MASK + 1 + i;
  153. }
  154. }
  155. return STATE_MASK;
  156. }
  157. uint8_t sensorTypes[][2] =
  158. {
  159. {001, TYPE_CAPACITY},
  160. {010, TYPE_ALARM},
  161. {0, 0}
  162. };
  163. uint8_t getSensorType(uint8_t sensor)
  164. {
  165. int i;
  166. i = 0;
  167. while (sensorTypes[i][0] != 0)
  168. {
  169. if (sensorTypes[i][0] == sensor)
  170. return sensorTypes[i][1];
  171. i++;
  172. }
  173. return 0;
  174. }
  175. void valuesCopyPos(double lat, double lon, double alt, time_t t, double * values)
  176. {
  177. values[0] = lat;
  178. values[1] = lon;
  179. values[2] = alt;
  180. values_time = t;
  181. values_type = VALUES_TYPE_POS;
  182. }
  183. void valuesCopySingle(double val, uint8_t sensor, time_t t, double * values)
  184. {
  185. values[0] = val;
  186. values_sensor[0] = sensor * 10000 + getSensorType(sensor) * 10000000;
  187. values_time = t;
  188. if (sensor == 010)
  189. values_type = VALUES_TYPE_ALARM;
  190. else
  191. values_type = VALUES_TYPE_OBS;
  192. }
  193. int stateMachine(unsigned char c)
  194. {
  195. static unsigned char state = STATE_IDLE;
  196. static uint8_t temp[16];
  197. static unsigned char count = 0;
  198. static unsigned char mask = 0, mask_global = 0;
  199. static unsigned char state_type = STATE_IDLE;
  200. static unsigned char qua = 0, c_qua = 0;
  201. static unsigned char no_of_recs = 0, current_rec = 0;
  202. static float lat, lon, alt;
  203. static uint8_t prio, io_type;
  204. static struct tm rec_time;
  205. static time_t t_t;
  206. int ret;
  207. ret = 0;
  208. /* if (state != STATE_IDLE)
  209. printf("0x%x %d|", c, state);*/
  210. temp[count] = c;
  211. count++;
  212. if (count < counts[state])
  213. return 0;
  214. count = 0;
  215. switch (state)
  216. {
  217. case STATE_IDLE:
  218. if (*((uint32_t *)temp) == 0x00000000)
  219. state = STATE_DATA_LENGTH;
  220. break;
  221. case STATE_DATA_LENGTH:
  222. feederLog(LOG_DEBUG, "Data size: %d\n", byteSwap32(*((uint32_t *)temp)));
  223. state = STATE_CODEC_ID;
  224. break;
  225. case STATE_CODEC_ID:
  226. if (temp[0] == 0x07)
  227. state = STATE_NO_OF_REC;
  228. else
  229. {
  230. feederLog(LOG_DEBUG, "Bad codec, going to idle state\n");
  231. state = STATE_IDLE;
  232. }
  233. break;
  234. case STATE_NO_OF_REC:
  235. no_of_recs = temp[0];
  236. current_rec = 0;
  237. feederLog(LOG_DEBUG, "Number of records: %d\n", no_of_recs);
  238. state = STATE_PR_TS;
  239. break;
  240. case STATE_PR_TS:
  241. gmtime_r(&t_t, &rec_time);
  242. t_t = (byteSwap32(*((uint32_t *)temp)) & 0x3fffffff) + 1166832000 + 777600;
  243. /* if (current_rec > 0)
  244. {
  245. if ((lat != 0.0) && (lon != 0.0))
  246. {
  247. }
  248. }*/
  249. lat = lon = alt = 0.0;
  250. prio = PRIO_UNDEFINED;
  251. t_t = 0;
  252. gmtime_r(&t_t, &rec_time);
  253. t_t = (byteSwap32(*((uint32_t *)temp)) & 0x3fffffff) + 1166832000 + 777600;
  254. localtime_r(&t_t, &rec_time);
  255. feederLog(LOG_DEBUG, "Time of rec: %04d-%02d-%02d %02d:%02d:%02d\n",
  256. rec_time.tm_year + 1900, rec_time.tm_mon + 1, rec_time.tm_mday, rec_time.tm_hour, rec_time.tm_min, rec_time.tm_sec);
  257. prio = temp[0] >> 6;
  258. feederLog(LOG_DEBUG, "Priority: %d\n", prio);
  259. if (prio == 2)
  260. {
  261. valuesCopySingle(1.0, 010, t_t, values_out);
  262. ret = 2;
  263. }
  264. feederLog(LOG_DEBUG, "Next processed record will be: %d\n", current_rec);
  265. current_rec++;
  266. state = STATE_G_MASK;
  267. break;
  268. case STATE_G_MASK:
  269. feederLog(LOG_DEBUG, "gps:%d, io_1:%d, io_2:%d, io_4:%d\n",
  270. MASK_GPS(temp[0]), MASK_IO1(temp[0]), MASK_IO2(temp[0]), MASK_IO4(temp[0]));
  271. state_type = STATE_G_MASK;
  272. mask_global = temp[0];
  273. state = maskGlobalNext(mask_global, state_type, current_rec == no_of_recs);
  274. state_type = state;
  275. break;
  276. case STATE_MASK:
  277. feederLog(LOG_DEBUG, "latlon:%d, alt:%d, angle:%d, speed:%d, sats:%d, cell:%d, qua:%d, op:%d\n",
  278. MASK_LATLON(temp[0]), MASK_ALT(temp[0]), MASK_ANGLE(temp[0]), MASK_SPEED(temp[0]),
  279. MASK_SATS(temp[0]), MASK_CELL(temp[0]), MASK_QUA(temp[0]), MASK_OP(temp[0]));
  280. mask = temp[0];
  281. state = maskNext(mask, state);
  282. break;
  283. case STATE_LATLON:
  284. arraySwap4(temp);
  285. arraySwap4(&temp[4]);
  286. lon = *((float *)(&temp[4]));
  287. lat = *((float *)(&temp[0]));
  288. feederLog(LOG_DEBUG, "latlon: %f, %f\n", lat, lon);
  289. state = maskNext(mask, state);
  290. break;
  291. case STATE_ALT:
  292. alt = (float)byteSwap16(*(uint16_t *)temp);
  293. feederLog(LOG_DEBUG, "alt: %f\n", alt);
  294. if ((lat != 0.0) && (lon != 0.0))
  295. {
  296. valuesCopyPos(lat, lon, alt, t_t, values_out);
  297. ret = 2;
  298. }
  299. state = maskNext(mask, state);
  300. break;
  301. case STATE_ANGLE:
  302. feederLog(LOG_DEBUG, "angle: %f\n", temp[0] * 360.0 / 256.0);
  303. state = maskNext(mask, state);
  304. break;
  305. case STATE_SPEED:
  306. feederLog(LOG_DEBUG, "speed: %d\n", *(uint8_t *)temp);
  307. state = maskNext(mask, state);
  308. break;
  309. case STATE_SATTS:
  310. feederLog(LOG_DEBUG, "sats: %d\n", *(uint8_t *)temp);
  311. state = maskNext(mask, state);
  312. if (state == STATE_MASK)
  313. {
  314. feederLog(LOG_DEBUG, "End of gps\n");
  315. state = maskGlobalNext(mask_global, STATE_MASK, current_rec == no_of_recs);
  316. state_type = state;
  317. }
  318. break;
  319. case STATE_CELL:
  320. feederLog(LOG_DEBUG, "cell:\n");
  321. state = maskNext(mask, state);
  322. break;
  323. case STATE_QUA:
  324. feederLog(LOG_DEBUG, "quality: %d\n", temp[0]);
  325. state = maskNext(mask, state);
  326. break;
  327. case STATE_OP:
  328. feederLog(LOG_DEBUG, "operator: %d\n", byteSwap32(*(uint32_t *)temp));
  329. state = maskGlobalNext(mask_global, state_type, current_rec == no_of_recs); //todo: ted predpokladam ze jsou vsechny v gps (0xff)(rep minimalne tahle posledni)
  330. state_type = state;
  331. break;
  332. case STATE_IO1_Q:
  333. qua = temp[0];
  334. feederLog(LOG_DEBUG, "io1 qua: %d\n", qua);
  335. c_qua = 0;
  336. if (c_qua == qua)
  337. {
  338. state = maskGlobalNext(mask_global, state_type, current_rec == no_of_recs);
  339. state_type = state;
  340. }
  341. else
  342. state = STATE_IO1_ID;
  343. break;
  344. case STATE_IO1_ID:
  345. feederLog(LOG_DEBUG, "io1 id: %d\n", temp[0]);
  346. io_type = temp[0];
  347. state = STATE_IO1_VAL;
  348. break;
  349. case STATE_IO1_VAL:
  350. feederLog(LOG_DEBUG, "io1 val: %d\n", temp[0]);
  351. if (io_type == 1)
  352. {
  353. valuesCopySingle(temp[0], io_type, t_t, values_out);
  354. ret = 2;
  355. }
  356. c_qua++;
  357. if (c_qua == qua)
  358. {
  359. state = maskGlobalNext(mask_global, state_type, current_rec == no_of_recs);
  360. state_type = state;
  361. }
  362. else
  363. state = STATE_IO1_ID;
  364. break;
  365. case STATE_IO2_Q:
  366. qua = temp[0];
  367. feederLog(LOG_DEBUG, "io2 qua: %d\n", qua);
  368. c_qua = 0;
  369. if (c_qua == qua)
  370. {
  371. state = maskGlobalNext(mask_global, state_type, current_rec == no_of_recs);
  372. state_type = state;
  373. }
  374. else
  375. state = STATE_IO2_ID;
  376. break;
  377. case STATE_IO2_ID:
  378. // feederLog(LOG_DEBUG, "io2 id:\n");
  379. state = STATE_IO2_VAL;
  380. break;
  381. case STATE_IO2_VAL:
  382. // feederLog(LOG_DEBUG, "io2 val:\n");
  383. c_qua++;
  384. if (c_qua == qua)
  385. {
  386. state = maskGlobalNext(mask_global, state_type, current_rec == no_of_recs);
  387. state_type = state;
  388. }
  389. else
  390. state = STATE_IO2_ID;
  391. break;
  392. case STATE_IO4_Q:
  393. qua = temp[0];
  394. feederLog(LOG_DEBUG, "io4 qua: %d\n", qua);
  395. c_qua = 0;
  396. if (c_qua == qua)
  397. {
  398. state = maskGlobalNext(mask_global, state_type, current_rec == no_of_recs);
  399. state_type = state;
  400. }
  401. else
  402. state = STATE_IO4_ID;
  403. break;
  404. case STATE_IO4_ID:
  405. // feederLog(LOG_DEBUG, "io4 id:\n");
  406. state = STATE_IO4_VAL;
  407. break;
  408. case STATE_IO4_VAL:
  409. // feederLog(LOG_DEBUG, "io4 val:\n");
  410. c_qua++;
  411. if (c_qua == qua)
  412. {
  413. state = maskGlobalNext(mask_global, state_type, current_rec == no_of_recs);
  414. state_type = state;
  415. }
  416. else
  417. state = STATE_IO4_ID;
  418. break;
  419. case STATE_NO_OF_REC_END:
  420. no_of_recs = temp[0];
  421. feederLog(LOG_DEBUG, "Number of records: %d\n", temp[0]);
  422. state = STATE_CRC;
  423. break;
  424. case STATE_CRC:
  425. state = STATE_IDLE;
  426. feederLog(LOG_DEBUG, "Crc\n");
  427. reply_buffer[0] = 0x00;
  428. reply_buffer[1] = 0x00;
  429. reply_buffer[2] = 0x00;
  430. reply_buffer[3] = no_of_recs;
  431. reply_len = 4;
  432. ret = 1;
  433. break;
  434. }
  435. return ret;
  436. }
  437. int translate(unsigned char * data)
  438. {
  439. int ret, res;
  440. ret = 0;
  441. while (res = stateMachine(int_buffer[int_buffer_pos]), res == 0)
  442. {
  443. if (int_buffer_pos + 1 >= int_buffer_pos_wr)
  444. break;
  445. int_buffer_pos++;
  446. }
  447. int_buffer_pos++;
  448. if (res == 1)
  449. {
  450. feederLog(LOG_DEBUG, "End of data packet\n");
  451. int_buffer_pos_wr = int_buffer_pos = 0;
  452. }
  453. if (res == 2)
  454. ret = 1;
  455. return ret;
  456. }
  457. //----------------------------------------------------------------------------------------------
  458. int imei(unsigned char * data)
  459. {
  460. struct avl_header_t * avl_header;
  461. avl_header = (struct avl_header_t *)data;
  462. memcpy(imei_str, avl_header->imei, 15);
  463. imei_str[15] = 0;
  464. feederLog(LOG_DEBUG, "Imei is %s\n", imei_str);
  465. reply_buffer[0] = 0x01;
  466. reply_len = 1;
  467. return 1;
  468. }
  469. int init(void * param)
  470. {
  471. param = param;
  472. imei_flag = 0;
  473. bzero(imei_str, 16);
  474. bzero(reply_buffer, 32);
  475. reply_len = 0;
  476. int_buffer = malloc(32768);
  477. return 0;
  478. }
  479. unsigned int
  480. process(void *lib_data, int socket, unsigned char *data,
  481. unsigned int length, unsigned long long int *id, time_t * tm,
  482. double *result_array, uint64_t * sensors, unsigned int *type)
  483. {
  484. unsigned int ret = 0;
  485. if ((!imei_flag) && (length != 0))
  486. {
  487. if (!imei_flag)
  488. {
  489. if (imei(data))
  490. imei_flag = 1;
  491. }
  492. ret = 0;
  493. }
  494. else
  495. {
  496. if (length != 0)
  497. {
  498. feederLog(LOG_DEBUG, "Copying data\n", int_buffer_pos);
  499. memcpy(int_buffer + int_buffer_pos_wr, data, length);
  500. int_buffer_pos_wr += length;
  501. }
  502. if (translate(int_buffer))
  503. {
  504. *id = atol(imei_str);
  505. *tm = values_time;
  506. if (values_type == VALUES_TYPE_POS)
  507. {
  508. memcpy(result_array, values_out, sizeof(double) * 3);
  509. sensors[0] = sensors[1] = sensors[2] = 0x10;
  510. *type = VALUES_TYPE_POS;
  511. ret = 3;
  512. }
  513. if (values_type == VALUES_TYPE_ALARM)
  514. {
  515. result_array[0] = 1.0;
  516. *type = VALUES_TYPE_ALARM;
  517. sensors[0] = TYPE_ALARM * 10000000 + 10 * 10000;
  518. ret = 1;
  519. }
  520. if (values_type == VALUES_TYPE_OBS)
  521. {
  522. result_array[0] = values_out[0];
  523. *type = VALUES_TYPE_OBS;
  524. sensors[0] = values_sensor[0];
  525. ret = 1;
  526. }
  527. }
  528. }
  529. return ret;
  530. }
  531. int reply(void *lib_data, int socket, unsigned char *data)
  532. {
  533. unsigned int temp_reply_len;
  534. feederLog(LOG_DEBUG, "gh120x: replying\n");
  535. memcpy(data, reply_buffer, reply_len);
  536. temp_reply_len = reply_len;
  537. reply_len = 0;
  538. return temp_reply_len;
  539. }
  540. int close(void *lib_data, int socket)
  541. {
  542. feederLog(LOG_DEBUG, "gh120x: socket closed\n");
  543. int_buffer_pos_wr = int_buffer_pos = 0;
  544. imei_flag = 0;
  545. imei_str[0] = 0;
  546. return 0;
  547. }
  548. int open(void *lib_data, int socket)
  549. {
  550. feederLog(LOG_DEBUG, "gh120x: socket open\n");
  551. return 0;
  552. }