fm4_pred_prasovanim_rfid.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828
  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. #define FM4_BUFFER_SIZE 32768
  11. //static unsigned char * int_buffer;
  12. //static unsigned int int_buffer_pos = 0, int_buffer_pos_wr = 0;
  13. //static int imei_flag = 0;
  14. //char imei_str[16]; //todo: tohle nejak predavat
  15. unsigned char reply_buffer[32];
  16. unsigned int reply_len;
  17. static double values_out[64];
  18. static uint64_t values_sensor[64];
  19. static uint8_t values_type[64];
  20. static time_t values_time;
  21. //static uint8_t values_type;
  22. static uint8_t values_len;
  23. typedef struct unit_t
  24. {
  25. int fd;
  26. char imei[16];
  27. struct unit_t * next;
  28. unsigned char * int_buffer;
  29. unsigned int int_buffer_pos;
  30. unsigned int int_buffer_pos_wr;
  31. } unit_t;
  32. static struct unit_t * units;
  33. static struct unit_t * aunit;
  34. static void (* feederLog)(int priority, const char * fmt, ...);
  35. int setLog(void * func)
  36. {
  37. feederLog = func;
  38. return 0;
  39. }
  40. typedef struct avl_header_t
  41. {
  42. uint16_t dummy __attribute__ ((packed));
  43. char imei[15];
  44. } avl_header_t;
  45. uint16_t byteSwap16(uint16_t value)
  46. {
  47. uint16_t swapped;
  48. swapped = (((0x00FF) & (value >> 8)) |
  49. ((0xFF00) & (value << 8)));
  50. return swapped;
  51. }
  52. uint32_t byteSwap32(uint32_t value)
  53. {
  54. uint32_t swapped;
  55. swapped = (((0x000000FF) & (value >> 24)) |
  56. ((0x0000FF00) & (value >> 8)) |
  57. ((0x00FF0000) & (value << 8)) |
  58. ((0xFF000000) & (value << 24)));
  59. return swapped;
  60. }
  61. uint64_t byteSwap64(uint64_t value)
  62. {
  63. uint64_t swapped;
  64. swapped = (((0x00000000000000FFULL) & (value >> 56)) |
  65. ((0x000000000000FF00ULL) & (value >> 40)) |
  66. ((0x0000000000FF0000ULL) & (value >> 24)) |
  67. ((0x00000000FF000000ULL) & (value >> 8)) |
  68. ((0x000000FF00000000ULL) & (value << 8)) |
  69. ((0x0000FF0000000000ULL) & (value << 24)) |
  70. ((0x00FF000000000000ULL) & (value << 40)) |
  71. ((0xFF00000000000000ULL) & (value << 56)));
  72. return swapped;
  73. }
  74. void arraySwap4(uint8_t * array)
  75. {
  76. uint8_t temp;
  77. temp = array[0];
  78. array[0] = array[3];
  79. array[3] = temp;
  80. temp = array[1];
  81. array[1] = array[2];
  82. array[2] = temp;
  83. }
  84. enum states {STATE_IDLE = 0, STATE_DATA_LENGTH, STATE_CODEC_ID, STATE_NO_OF_REC,
  85. STATE_TIMESTAMP, STATE_PRIORITY,
  86. STATE_LON, STATE_LAT, STATE_ALT, STATE_ANGLE, STATE_SATTS, STATE_SPEED,
  87. STATE_EVENT_IO_ID, STATE_TOTAL_IO,
  88. STATE_BYTE1_IO, STATE_BYTE1_ID, STATE_BYTE1_VAL,
  89. STATE_BYTE2_IO, STATE_BYTE2_ID, STATE_BYTE2_VAL,
  90. STATE_BYTE4_IO, STATE_BYTE4_ID, STATE_BYTE4_VAL,
  91. STATE_BYTE8_IO, STATE_BYTE8_ID, STATE_BYTE8_VAL,
  92. STATE_NO_OF_REC_END, STATE_CRC
  93. };
  94. static unsigned char state = STATE_IDLE; //state of status machine, must be global to be accesible by process function when determining if this packet could be imei packet (state is IDLE)
  95. unsigned char counts[] =
  96. {
  97. 4, 4, 1, 1,
  98. 8, 1,
  99. 4, 4, 2, 2, 1, 2,
  100. 1, 1,
  101. 1, 1, 1,
  102. 1, 1, 2,
  103. 1, 1, 4,
  104. 1, 1, 8,
  105. 1, 4
  106. };
  107. #define PRIO_LOW 0
  108. #define PRIO_HIGHT 1
  109. #define PRIO_PANIC 2
  110. #define PRIO_SECURITY 3
  111. #define VAL_DI1 1
  112. #define VAL_DI2 2
  113. void valuesCopyPos(double lat, double lon, double alt, time_t t, uint8_t type, double * values)
  114. {
  115. values[0] = lat;
  116. values[1] = lon;
  117. values[2] = alt;
  118. values_time = t;
  119. values_type[0] = type;
  120. values_type[1] = type;
  121. values_type[2] = type;
  122. }
  123. //todo: nasledujici dve pole do pole struktur, tedy vcetne multiplu
  124. /* {FM4 type, FEEDER sensor type id, sensor id, alertable (if prio is 1(high))} */
  125. uint8_t sensorTypes[][4] =
  126. {
  127. {1, TYPE_DIGITAL_INPUT, 5, 0},
  128. {2, TYPE_DIGITAL_INPUT, 6, 1},
  129. {3, TYPE_DIGITAL_INPUT, 7, 0},
  130. {4, TYPE_DIGITAL_INPUT, 8, 0},
  131. {9, TYPE_ANALOG_INPUT, 1, 0},
  132. {10, TYPE_ANALOG_INPUT, 2, 0},
  133. {11, TYPE_ANALOG_INPUT, 3, 0},
  134. {19, TYPE_ANALOG_INPUT, 4, 0},
  135. {21, TYPE_SIGNAL_STRENGTH, 3, 0},
  136. {24, TYPE_SPEED, 2, 0},
  137. {66, TYPE_VOLTAGE, 11, 0},
  138. {67, TYPE_VOLTAGE, 10, 0},
  139. {68, TYPE_CURRENT, 2, 0},
  140. {69, TYPE_SIGNAL_STRENGTH, 4, 0},
  141. {70, TYPE_THERMOMETER, 11, 0},
  142. {72, TYPE_THERMOMETER, 12, 0},
  143. {73, TYPE_THERMOMETER, 13, 0},
  144. {74, TYPE_THERMOMETER, 14, 0},
  145. {79, TYPE_ACCELERATION, 2, 0},
  146. {80, TYPE_SPEED, 3, 0},
  147. {81, TYPE_CRUISE, 1, 0},
  148. {82, TYPE_CRUISE, 2, 0},
  149. {83, TYPE_CRUISE, 3, 0},
  150. {84, TYPE_ENGINE, 1, 0},
  151. {85, TYPE_ENGINE, 2, 0},
  152. {86, TYPE_ENGINE, 3, 0},
  153. {87, TYPE_LEVEL, 4, 0},
  154. {88, TYPE_FREQUENCY, 1, 0},
  155. {104, TYPE_TIME, 1, 0},
  156. {127, TYPE_TEMP, 20, 0},
  157. {128, TYPE_TEMP, 21, 0},
  158. {135, TYPE_FLOW, 6, 0},
  159. {136, TYPE_FLOW, 7, 0},
  160. {207, TYPE_ID, 1, 0},
  161. {0, 0, 0, 0}
  162. };
  163. double sensorMulti[] =
  164. {
  165. 1.0,
  166. 1.0,
  167. 1.0,
  168. 1.0,
  169. 1.0,
  170. 1.0,
  171. 1.0,
  172. 1.0,
  173. 1.0,
  174. 1.0,
  175. 0.001,
  176. 0.001,
  177. 0.001,
  178. 1.0,
  179. 0.1,
  180. 0.1,
  181. 0.1,
  182. 0.1,
  183. 1.0,
  184. 1.0,
  185. 1.0,
  186. 1.0,
  187. 1.0,
  188. 1.0,
  189. 1.0,
  190. 1.0,
  191. 1.0,
  192. 1.0,
  193. 1.0,
  194. 1.0,
  195. 1.0,
  196. 1.0,
  197. 1.0,
  198. 1.0
  199. };
  200. int getSensorType(uint8_t sensor)
  201. {
  202. int i;
  203. i = 0;
  204. while (sensorTypes[i][0] != 0)
  205. {
  206. if (sensorTypes[i][0] == sensor)
  207. return i;
  208. i++;
  209. }
  210. return -1;
  211. }
  212. void valuesCopyVal(double value, uint8_t sensor, time_t t, uint8_t type, double * values)
  213. {
  214. uint8_t sensor_index;
  215. sensor_index = getSensorType(sensor); //todo: check return value
  216. values[values_len] = value * sensorMulti[sensor_index];
  217. values_sensor[values_len] = sensorTypes[sensor_index][2] * 10000 + sensorTypes[sensor_index][1] * 10000000;
  218. values_time = t;
  219. if ((type == VALUES_TYPE_ALERT) && (sensorTypes[sensor_index][3] == 1))
  220. values_type[values_len] = VALUES_TYPE_ALERT;
  221. else
  222. values_type[values_len] = VALUES_TYPE_OBS;
  223. feederLog(LOG_DEBUG, "fm4: Observation type %s\n", (values_type[values_len] == VALUES_TYPE_ALERT) ? "alert" : "obs");
  224. values_len++;
  225. }
  226. int stateMachine(unsigned char c)
  227. {
  228. static uint8_t temp[16];
  229. static unsigned char count = 0;
  230. static unsigned char qua = 0, c_qua = 0;
  231. static unsigned char no_of_recs = 0, current_rec = 0;
  232. static uint8_t val_byte_id;
  233. static uint64_t val_byte_val;
  234. static float lat, lon, alt;
  235. static uint8_t prio;
  236. static time_t t_t;
  237. static struct tm t;
  238. int ret;
  239. ret = 0;
  240. /* if (state != STATE_IDLE)
  241. printf("0x%x %d|", c, state);*/
  242. temp[count] = c;
  243. count++;
  244. if (count < counts[state])
  245. return 0;
  246. count = 0;
  247. switch (state)
  248. {
  249. case STATE_IDLE:
  250. if (*((uint32_t *)temp) == 0x00000000)
  251. state = STATE_DATA_LENGTH;
  252. break;
  253. case STATE_DATA_LENGTH:
  254. feederLog(LOG_DEBUG, "fm4: Data size: %d\n", byteSwap32(*((uint32_t *)temp)));
  255. state = STATE_CODEC_ID;
  256. break;
  257. case STATE_CODEC_ID:
  258. if (temp[0] == 0x08)
  259. state = STATE_NO_OF_REC;
  260. else
  261. {
  262. feederLog(LOG_DEBUG, "fm4: Bad codec, going to idle state\n");
  263. state = STATE_IDLE;
  264. }
  265. break;
  266. case STATE_NO_OF_REC:
  267. no_of_recs = temp[0];
  268. current_rec = 0;
  269. feederLog(LOG_DEBUG, "fm4: Number of records: %d\n", no_of_recs);
  270. state = STATE_TIMESTAMP;
  271. break;
  272. case STATE_TIMESTAMP:
  273. /* if (current_rec > 0)
  274. {
  275. if ((lat != 0.0) && (lon != 0.0))
  276. {
  277. }
  278. }*/
  279. lat = lon = alt = 0.0;
  280. prio = PRIO_LOW;
  281. t_t = 0;
  282. gmtime_r(&t_t, &t);
  283. t_t = (byteSwap64(*((uint64_t *)temp))) / 1000; //in ms
  284. gmtime_r(&t_t, &t);
  285. feederLog(LOG_DEBUG, "fm4: Time of rec: %04d-%02d-%02d %02d:%02d:%02d\n",
  286. t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec);
  287. feederLog(LOG_DEBUG, "fm4: Processing record: %d\n", current_rec);
  288. current_rec++;
  289. state = STATE_PRIORITY;
  290. break;
  291. case STATE_PRIORITY:
  292. prio = temp[0] & 0x03;
  293. feederLog(LOG_DEBUG, "fm4: Priority: %d\n", prio);
  294. state = STATE_LON;
  295. break;
  296. case STATE_LON:
  297. lon = (float)(byteSwap32(*(uint32_t *)temp)) / 10000000.0;
  298. feederLog(LOG_DEBUG, "fm4: lon: %f\n", lon);
  299. state = STATE_LAT;
  300. break;
  301. case STATE_LAT:
  302. lat = (float)(byteSwap32(*(uint32_t *)temp)) / 10000000.0;
  303. feederLog(LOG_DEBUG, "fm4: lat: %f\n", lat);
  304. state = STATE_ALT;
  305. break;
  306. case STATE_ALT:
  307. alt = (float)(byteSwap16(*(uint16_t *)temp));
  308. feederLog(LOG_DEBUG, "fm4: alt: %f\n", alt);
  309. state = STATE_ANGLE;
  310. break;
  311. case STATE_ANGLE:
  312. feederLog(LOG_DEBUG, "fm4: angle: %f\n", (float)(byteSwap16(*(uint16_t *)temp)));
  313. state = STATE_SATTS;
  314. break;
  315. case STATE_SATTS:
  316. feederLog(LOG_DEBUG, "fm4: sattelites: %d\n", temp[0]);
  317. state = STATE_SPEED;
  318. break;
  319. case STATE_SPEED:
  320. feederLog(LOG_DEBUG, "fm4: speed: %f\n", (float)(byteSwap16(*(uint16_t *)temp)));
  321. valuesCopyPos(lat, lon, alt, t_t, VALUES_TYPE_POS, values_out);
  322. ret = 2;
  323. state = STATE_EVENT_IO_ID;
  324. break;
  325. case STATE_EVENT_IO_ID:
  326. feederLog(LOG_DEBUG, "fm4: event io id: %d\n", temp[0]);
  327. state = STATE_TOTAL_IO;
  328. break;
  329. case STATE_TOTAL_IO:
  330. feederLog(LOG_DEBUG, "fm4: total io: %d\n", temp[0]);
  331. values_len = 0;
  332. state = STATE_BYTE1_IO;
  333. break;
  334. case STATE_BYTE1_IO:
  335. qua = temp[0];
  336. c_qua = 0;
  337. feederLog(LOG_DEBUG, "fm4: byte1 io: %d\n", qua);
  338. if (qua == 0)
  339. state = STATE_BYTE2_IO;
  340. else
  341. state = STATE_BYTE1_ID;
  342. break;
  343. case STATE_BYTE1_ID:
  344. feederLog(LOG_DEBUG, "fm4: byte1 id: %d\n", temp[0]);
  345. val_byte_id = temp[0];
  346. state = STATE_BYTE1_VAL;
  347. break;
  348. case STATE_BYTE1_VAL:
  349. feederLog(LOG_DEBUG, "fm4: byte1 val: %d\n", temp[0]);
  350. val_byte_val = temp[0];
  351. if (prio == 0)
  352. valuesCopyVal((double)val_byte_val, val_byte_id, t_t, VALUES_TYPE_OBS, values_out);
  353. else
  354. valuesCopyVal((double)val_byte_val, val_byte_id, t_t, VALUES_TYPE_ALERT, values_out);
  355. c_qua++;
  356. if (qua == c_qua)
  357. state = STATE_BYTE2_IO;
  358. else
  359. state = STATE_BYTE1_ID;
  360. break;
  361. case STATE_BYTE2_IO:
  362. qua = temp[0];
  363. c_qua = 0;
  364. feederLog(LOG_DEBUG, "fm4: byte2 io: %d\n", qua);
  365. if (qua == 0)
  366. state = STATE_BYTE4_IO;
  367. else
  368. state = STATE_BYTE2_ID;
  369. break;
  370. case STATE_BYTE2_ID:
  371. feederLog(LOG_DEBUG, "fm4: byte2 id: %d\n", temp[0]);
  372. val_byte_id = temp[0];
  373. state = STATE_BYTE2_VAL;
  374. break;
  375. case STATE_BYTE2_VAL:
  376. feederLog(LOG_DEBUG, "fm4: byte2 val: %lld\n", (byteSwap16(*(uint16_t *)temp)));
  377. val_byte_val = (byteSwap16(*(uint16_t *)temp));
  378. if (prio == 0)
  379. valuesCopyVal((double)val_byte_val, val_byte_id, t_t, VALUES_TYPE_OBS, values_out);
  380. else
  381. valuesCopyVal((double)val_byte_val, val_byte_id, t_t, VALUES_TYPE_ALERT, values_out);
  382. c_qua++;
  383. if (qua == c_qua)
  384. state = STATE_BYTE4_IO;
  385. else
  386. state = STATE_BYTE2_ID;
  387. break;
  388. case STATE_BYTE4_IO:
  389. qua = temp[0];
  390. c_qua = 0;
  391. feederLog(LOG_DEBUG, "fm4: byte4 io: %d\n", qua);
  392. if (qua == 0)
  393. state = STATE_BYTE8_IO;
  394. else
  395. state = STATE_BYTE4_ID;
  396. break;
  397. case STATE_BYTE4_ID:
  398. feederLog(LOG_DEBUG, "fm4: byte4 id: %d\n", temp[0]);
  399. val_byte_id = temp[0];
  400. state = STATE_BYTE4_VAL;
  401. break;
  402. case STATE_BYTE4_VAL:
  403. feederLog(LOG_DEBUG, "fm4: byte4 val: %d\n", (byteSwap32(*(uint32_t *)temp)));
  404. val_byte_val = (byteSwap32(*(uint32_t *)temp));
  405. if (prio == 0)
  406. valuesCopyVal((double)val_byte_val, val_byte_id, t_t, VALUES_TYPE_OBS, values_out);
  407. else
  408. valuesCopyVal((double)val_byte_val, val_byte_id, t_t, VALUES_TYPE_ALERT, values_out);
  409. c_qua++;
  410. if (qua == c_qua)
  411. state = STATE_BYTE8_IO;
  412. else
  413. state = STATE_BYTE4_ID;
  414. break;
  415. case STATE_BYTE8_IO:
  416. qua = temp[0];
  417. c_qua = 0;
  418. feederLog(LOG_DEBUG, "fm4: byte8 io: %ld\n", qua);
  419. if (qua == 0)
  420. {
  421. if (current_rec == no_of_recs)
  422. state = STATE_NO_OF_REC_END;
  423. else
  424. state = STATE_TIMESTAMP;
  425. }
  426. else
  427. state = STATE_BYTE8_ID;
  428. break;
  429. case STATE_BYTE8_ID:
  430. feederLog(LOG_DEBUG, "fm4: byte8 id: %d\n", temp[0]);
  431. val_byte_id = temp[0];
  432. state = STATE_BYTE8_VAL;
  433. break;
  434. case STATE_BYTE8_VAL:
  435. feederLog(LOG_DEBUG, "fm4: byte8 val: %d\n", (byteSwap64(*(uint64_t *)temp)));
  436. val_byte_val = (byteSwap64(*(uint64_t *)temp));
  437. valuesCopyVal((double)val_byte_val, val_byte_id, t_t, VALUES_TYPE_OBS, values_out);
  438. c_qua++;
  439. if (qua == c_qua)
  440. {
  441. if (current_rec == no_of_recs)
  442. state = STATE_NO_OF_REC_END;
  443. else
  444. state = STATE_TIMESTAMP;
  445. ret = 2;
  446. }
  447. else
  448. state = STATE_BYTE8_ID;
  449. break;
  450. case STATE_NO_OF_REC_END:
  451. no_of_recs = temp[0];
  452. feederLog(LOG_DEBUG, "fm4: Number of records: %d\n", temp[0]);
  453. state = STATE_CRC;
  454. break;
  455. case STATE_CRC:
  456. state = STATE_IDLE;
  457. feederLog(LOG_DEBUG, "fm4: Crc\n");
  458. reply_buffer[0] = 0x00;
  459. reply_buffer[1] = 0x00;
  460. reply_buffer[2] = 0x00;
  461. reply_buffer[3] = no_of_recs;
  462. reply_len = 4;
  463. ret = 1;
  464. break;
  465. }
  466. return ret;
  467. }
  468. int parse(struct unit_t * unit)
  469. {
  470. int ret, res;
  471. ret = 0;
  472. while (res = stateMachine(unit->int_buffer[unit->int_buffer_pos]), res == 0)
  473. {
  474. if (unit->int_buffer_pos + 1 >= unit->int_buffer_pos_wr)
  475. break;
  476. unit->int_buffer_pos++;
  477. }
  478. unit->int_buffer_pos++;
  479. if (res == 1)
  480. {
  481. feederLog(LOG_DEBUG, "fm4: End of data packet\n");
  482. unit->int_buffer_pos_wr = unit->int_buffer_pos = 0;
  483. // aunit->imei[0] = 0; //todo: predpokladame ze dalsi paket bude opet uvozen 17byty s IMEI
  484. }
  485. if (res == 2)
  486. {
  487. feederLog(LOG_DEBUG, "fm4: Valid data decoded\n");
  488. ret = 1;
  489. }
  490. return ret;
  491. }
  492. //----------------------------------------------------------------------------------------------
  493. struct unit_t * unitFind(int fd)
  494. {
  495. struct unit_t * unit;
  496. unit = units;
  497. while (unit != NULL)
  498. {
  499. if (unit->fd == fd)
  500. {
  501. return unit;
  502. }
  503. unit = unit->next;
  504. }
  505. return NULL;
  506. }
  507. struct unit_t * unitCreate(int fd)
  508. {
  509. struct unit_t * unit, * unit_new;
  510. unit_new = malloc(sizeof(struct unit_t));
  511. if (unit_new == NULL)
  512. return NULL;
  513. unit_new->fd = fd;
  514. unit_new->imei[0] = 0;
  515. unit_new->next = NULL;
  516. unit_new->int_buffer = malloc(FM4_BUFFER_SIZE);
  517. if (unit_new->int_buffer == NULL)
  518. {
  519. free(unit_new);
  520. return NULL;
  521. }
  522. unit_new->int_buffer_pos = 0;
  523. unit_new->int_buffer_pos_wr = 0;
  524. if (units == NULL)
  525. units = unit_new;
  526. else
  527. {
  528. unit = units;
  529. while (unit->next != NULL)
  530. {
  531. unit = unit->next;
  532. }
  533. unit->next = unit_new;
  534. }
  535. return unit_new;
  536. }
  537. int imei(struct unit_t * unit, unsigned char * data)
  538. {
  539. struct avl_header_t * avl_header;
  540. char imei_str[16];
  541. avl_header = (struct avl_header_t *)data;
  542. memcpy(imei_str, avl_header->imei, 15);
  543. imei_str[15] = 0;
  544. feederLog(LOG_DEBUG, "fm4: Imei is %s\n", imei_str);
  545. strcpy(unit->imei, imei_str);
  546. return 1;
  547. }
  548. int init(void * param)
  549. {
  550. param = param;
  551. bzero(reply_buffer, 32);
  552. reply_len = 0;
  553. units = aunit = NULL;
  554. return 0;
  555. }
  556. void logHex(char * buffer, unsigned char * data, unsigned int length)
  557. {
  558. unsigned int i;
  559. buffer[0] = 0;
  560. for (i = 0; i < length; i++)
  561. {
  562. sprintf(buffer + strlen(buffer), "%02X ", data[i]);
  563. }
  564. }
  565. unsigned int
  566. process(void *lib_data, int socket, unsigned char *data,
  567. unsigned int length, unsigned long long int *id, time_t * tm,
  568. double *result_array, uint64_t * sensors, unsigned int *type)
  569. {
  570. unsigned int ret = 0;
  571. struct unit_t * unit;
  572. uint8_t i;
  573. char buffer[32768];
  574. unsigned int l;
  575. (void)lib_data;
  576. if (data != NULL)
  577. {
  578. feederLog(LOG_DEBUG, "fm4: Incoming data: len %d: \n", length);
  579. l = length;
  580. while (l > 0)
  581. {
  582. logHex(buffer, data + length - l, (l > 16) ? 16:l);
  583. feederLog(LOG_DEBUG, "%s\n", buffer);
  584. l -= (l > 16) ? 16:l;
  585. }
  586. }
  587. unit = unitFind(socket);
  588. if (unit == NULL)
  589. {
  590. feederLog(LOG_DEBUG, "fm4: new unit for socket %d\n", socket);
  591. unit = unitCreate(socket); //todo: check if scucsefull
  592. }
  593. else
  594. {
  595. feederLog(LOG_DEBUG, "fm4: data from known unit on socket %d\n", socket);
  596. }
  597. aunit = unit;
  598. // if ((length != 0) && (strlen(aunit->imei) == 0))
  599. if ((length != 0) && ((memcmp(data, "\0\0\0\0", 4) != 0) && (state == STATE_IDLE)) && (unit->int_buffer_pos_wr == 0))
  600. {
  601. imei(aunit, data);
  602. feederLog(LOG_DEBUG, "fm4: imei for socket %d is %s\n", socket, unit->imei);
  603. unit->int_buffer_pos = unit->int_buffer_pos_wr = 0;
  604. reply_buffer[0] = 0x01;
  605. reply_len = 1;
  606. ret = 0;
  607. }
  608. else
  609. {
  610. if (length != 0)
  611. {
  612. feederLog(LOG_DEBUG, "fm4: Copying data for unit, imei %s\n", unit->imei);
  613. if (unit->int_buffer_pos_wr + length >= FM4_BUFFER_SIZE)
  614. {
  615. feederLog(LOG_WARNING, "fm4: Buffer full, reseting, imei %s\n", unit->imei);
  616. unit->int_buffer_pos = unit->int_buffer_pos_wr = 0;
  617. }
  618. else
  619. {
  620. if ((unit->int_buffer_pos_wr != 0) || (*((uint32_t *)data) == 0x00000000))
  621. {
  622. memcpy(unit->int_buffer + unit->int_buffer_pos_wr, data, length);
  623. unit->int_buffer_pos_wr += length;
  624. feederLog(LOG_DEBUG, "fm4: Copy done, imei %s\n", unit->imei);
  625. }
  626. }
  627. }
  628. if ((unit->int_buffer_pos_wr > 0) && (*((uint32_t *)unit->int_buffer) == 0x00000000))
  629. {
  630. uint32_t reported_packet_size = byteSwap32(*((uint32_t *)(unit->int_buffer + 4)));
  631. reported_packet_size += 4 + 4 + 4; /* leading zeroes + packet size + crc */
  632. if (unit->int_buffer_pos_wr != reported_packet_size)
  633. {
  634. feederLog(LOG_DEBUG, "fm4: Not enough packet data, waiting for more, imei %s\n", unit->imei);
  635. }
  636. else
  637. {
  638. if ((parse(unit)) || (values_len != 0))
  639. {
  640. *id = atol(aunit->imei);
  641. *tm = values_time;
  642. // printf("val type %d\n", values_type[0]);
  643. if (values_type[0] == VALUES_TYPE_POS)
  644. {
  645. memcpy(result_array, values_out, sizeof(double) * 3);
  646. *type = VALUES_TYPE_POS;
  647. sensors[0] = sensors[1] = sensors[2] = 0x10;
  648. ret = 3;
  649. values_len -= 3;
  650. }
  651. else if (values_type[values_len - 1] == VALUES_TYPE_OBS)
  652. {
  653. i = 0;
  654. while ((values_len > 0) && (values_type[values_len - 1] == VALUES_TYPE_OBS))
  655. {
  656. result_array[i] = values_out[values_len - 1];
  657. sensors[i] = values_sensor[values_len - 1];
  658. i++;
  659. values_len--;
  660. }
  661. *type = VALUES_TYPE_OBS;
  662. ret = i;
  663. /*
  664. memcpy(result_array, values_out, sizeof(double) * values_len);
  665. *type = VALUES_TYPE_OBS;
  666. memcpy(sensors, values_sensor, sizeof(uint64_t) * values_len);
  667. ret = values_len;
  668. */
  669. }
  670. else if (values_type[values_len - 1] == VALUES_TYPE_ALERT)
  671. {
  672. i = 0;
  673. while ((values_len > 0) && (values_type[values_len - 1] == VALUES_TYPE_ALERT))
  674. {
  675. result_array[i] = values_out[values_len - 1];
  676. sensors[i] = values_sensor[values_len - 1];
  677. i++;
  678. values_len--;
  679. }
  680. *type = VALUES_TYPE_ALERT;
  681. ret = i;
  682. /* memcpy(result_array, values_out, sizeof(double) * values_len);
  683. *type = VALUES_TYPE_ALERT;
  684. memcpy(sensors, values_sensor, sizeof(uint64_t) * values_len);
  685. ret = values_len;*/
  686. }
  687. }
  688. }
  689. }
  690. }
  691. return ret;
  692. }
  693. int reply(void *lib_data, int socket, unsigned char *data)
  694. {
  695. unsigned int temp_reply_len;
  696. (void)lib_data;
  697. (void)socket;
  698. feederLog(LOG_DEBUG, "fm4: replying\n");
  699. memcpy(data, reply_buffer, reply_len);
  700. temp_reply_len = reply_len;
  701. reply_len = 0;
  702. return temp_reply_len;
  703. }
  704. int open(void *lib_data, int socket)
  705. {
  706. (void)lib_data;
  707. (void)socket;
  708. feederLog(LOG_DEBUG, "fm4: socket %d opened\n", socket);
  709. return 0;
  710. }
  711. int close(void *lib_data, int socket)
  712. {
  713. struct unit_t * unit;
  714. (void)lib_data;
  715. (void)socket;
  716. feederLog(LOG_DEBUG, "fm4: socket %d closed\n", socket);
  717. unit = unitFind(socket);
  718. if (unit != NULL)
  719. {
  720. // free(unit->int_buffer);
  721. unit->imei[0] = 0; //todo: nebo mozna lepe, zrusit celou jednotku - coz bacha na next
  722. }
  723. unit->int_buffer_pos_wr = unit->int_buffer_pos = 0;
  724. return 0;
  725. }