fm4.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882
  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. {249, TYPE_SIGNAL_STRENGTH, 5, 0},
  162. {0, 0, 0, 0}
  163. };
  164. double sensorMulti[] =
  165. {
  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. 1.0,
  176. 0.001,
  177. 0.001,
  178. 0.001,
  179. 1.0,
  180. 0.1,
  181. 0.1,
  182. 0.1,
  183. 0.1,
  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. 1.0,
  200. 1.0
  201. };
  202. int getSensorType(uint8_t sensor)
  203. {
  204. int i;
  205. i = 0;
  206. while (sensorTypes[i][0] != 0)
  207. {
  208. if (sensorTypes[i][0] == sensor)
  209. return i;
  210. i++;
  211. }
  212. return -1;
  213. }
  214. void valuesCopyVal(double value, uint8_t sensor, time_t t, uint8_t type, double * values)
  215. {
  216. uint8_t sensor_index;
  217. sensor_index = getSensorType(sensor); //todo: check return value
  218. values[values_len] = value * sensorMulti[sensor_index];
  219. values_sensor[values_len] = sensorTypes[sensor_index][2] * 10000 + sensorTypes[sensor_index][1] * 10000000;
  220. values_time = t;
  221. if ((type == VALUES_TYPE_ALERT) && (sensorTypes[sensor_index][3] == 1))
  222. values_type[values_len] = VALUES_TYPE_ALERT;
  223. else
  224. values_type[values_len] = VALUES_TYPE_OBS;
  225. feederLog(LOG_DEBUG, "fm4: Observation type %s\n", (values_type[values_len] == VALUES_TYPE_ALERT) ? "alert" : "obs");
  226. values_len++;
  227. }
  228. void valuesSpecCareRfid(uint64_t val, uint8_t sensor, time_t t, uint8_t type, double * values)
  229. {
  230. char str[9], c;
  231. int i, j;
  232. int in;
  233. uint8_t rfid[8];
  234. uint32_t id;
  235. uint8_t rssi;
  236. if (val == 0)
  237. {
  238. feederLog(LOG_DEBUG, "fm4: RFID zero value\n");
  239. return;
  240. }
  241. in = 0;
  242. str[0] = 0;
  243. for (i = 0, j = 0; i < 8; i++)
  244. {
  245. c = (uint8_t)(val >> (8 * i));
  246. if (in)
  247. {
  248. if (c == ']')
  249. {
  250. in = 0;
  251. str[j++] = 0;
  252. }
  253. else
  254. {
  255. rfid[j++] = c;
  256. }
  257. }
  258. if (c == '[')
  259. in = 1;
  260. }
  261. // rfid = atol(str);
  262. if (j < 5)
  263. {
  264. feederLog(LOG_DEBUG, "fm4: RFID no tag detected\n");
  265. return;
  266. }
  267. id = (uint32_t)rfid[3] | ((uint32_t)rfid[2] << 8) | ((uint32_t)rfid[1] << 16);
  268. rssi = rfid[0];
  269. feederLog(LOG_DEBUG, "fm4: RFID %#06X, rssi %#02X\n", id, rssi);
  270. valuesCopyVal((double)id, sensor, t, type, values);
  271. valuesCopyVal((double)rssi, 249, t, type, values);
  272. }
  273. int stateMachine(unsigned char c)
  274. {
  275. static uint8_t temp[16];
  276. static unsigned char count = 0;
  277. static unsigned char qua = 0, c_qua = 0;
  278. static unsigned char no_of_recs = 0, current_rec = 0;
  279. static uint8_t val_byte_id;
  280. static uint64_t val_byte_val;
  281. static float lat, lon, alt;
  282. static uint8_t prio;
  283. static time_t t_t;
  284. static struct tm t;
  285. int ret;
  286. ret = 0;
  287. /* if (state != STATE_IDLE)
  288. printf("0x%x %d|", c, state);*/
  289. temp[count] = c;
  290. count++;
  291. if (count < counts[state])
  292. return 0;
  293. count = 0;
  294. switch (state)
  295. {
  296. case STATE_IDLE:
  297. if (*((uint32_t *)temp) == 0x00000000)
  298. state = STATE_DATA_LENGTH;
  299. break;
  300. case STATE_DATA_LENGTH:
  301. feederLog(LOG_DEBUG, "fm4: Data size: %d\n", byteSwap32(*((uint32_t *)temp)));
  302. state = STATE_CODEC_ID;
  303. break;
  304. case STATE_CODEC_ID:
  305. if (temp[0] == 0x08)
  306. state = STATE_NO_OF_REC;
  307. else
  308. {
  309. feederLog(LOG_DEBUG, "fm4: Bad codec, going to idle state\n");
  310. state = STATE_IDLE;
  311. }
  312. break;
  313. case STATE_NO_OF_REC:
  314. no_of_recs = temp[0];
  315. current_rec = 0;
  316. feederLog(LOG_DEBUG, "fm4: Number of records: %d\n", no_of_recs);
  317. state = STATE_TIMESTAMP;
  318. break;
  319. case STATE_TIMESTAMP:
  320. /* if (current_rec > 0)
  321. {
  322. if ((lat != 0.0) && (lon != 0.0))
  323. {
  324. }
  325. }*/
  326. lat = lon = alt = 0.0;
  327. prio = PRIO_LOW;
  328. t_t = 0;
  329. gmtime_r(&t_t, &t);
  330. t_t = (byteSwap64(*((uint64_t *)temp))) / 1000; //in ms
  331. gmtime_r(&t_t, &t);
  332. feederLog(LOG_DEBUG, "fm4: Time of rec: %04d-%02d-%02d %02d:%02d:%02d\n",
  333. t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec);
  334. feederLog(LOG_DEBUG, "fm4: Processing record: %d\n", current_rec);
  335. current_rec++;
  336. state = STATE_PRIORITY;
  337. break;
  338. case STATE_PRIORITY:
  339. prio = temp[0] & 0x03;
  340. feederLog(LOG_DEBUG, "fm4: Priority: %d\n", prio);
  341. state = STATE_LON;
  342. break;
  343. case STATE_LON:
  344. lon = (float)(int32_t)(byteSwap32(*(uint32_t *)temp)) / 10000000.0;
  345. feederLog(LOG_DEBUG, "fm4: lon: %f\n", lon);
  346. state = STATE_LAT;
  347. break;
  348. case STATE_LAT:
  349. lat = (float)(int32_t)(byteSwap32(*(uint32_t *)temp)) / 10000000.0;
  350. feederLog(LOG_DEBUG, "fm4: lat: %f\n", lat);
  351. state = STATE_ALT;
  352. break;
  353. case STATE_ALT:
  354. alt = (float)(byteSwap16(*(uint16_t *)temp));
  355. feederLog(LOG_DEBUG, "fm4: alt: %f\n", alt);
  356. state = STATE_ANGLE;
  357. break;
  358. case STATE_ANGLE:
  359. feederLog(LOG_DEBUG, "fm4: angle: %f\n", (float)(byteSwap16(*(uint16_t *)temp)));
  360. state = STATE_SATTS;
  361. break;
  362. case STATE_SATTS:
  363. feederLog(LOG_DEBUG, "fm4: sattelites: %d\n", temp[0]);
  364. state = STATE_SPEED;
  365. break;
  366. case STATE_SPEED:
  367. feederLog(LOG_DEBUG, "fm4: speed: %f\n", (float)(byteSwap16(*(uint16_t *)temp)));
  368. valuesCopyPos(lat, lon, alt, t_t, VALUES_TYPE_POS, values_out);
  369. ret = 2;
  370. state = STATE_EVENT_IO_ID;
  371. break;
  372. case STATE_EVENT_IO_ID:
  373. feederLog(LOG_DEBUG, "fm4: event io id: %d\n", temp[0]);
  374. state = STATE_TOTAL_IO;
  375. break;
  376. case STATE_TOTAL_IO:
  377. feederLog(LOG_DEBUG, "fm4: total io: %d\n", temp[0]);
  378. values_len = 0;
  379. state = STATE_BYTE1_IO;
  380. break;
  381. case STATE_BYTE1_IO:
  382. qua = temp[0];
  383. c_qua = 0;
  384. feederLog(LOG_DEBUG, "fm4: byte1 io: %d\n", qua);
  385. if (qua == 0)
  386. state = STATE_BYTE2_IO;
  387. else
  388. state = STATE_BYTE1_ID;
  389. break;
  390. case STATE_BYTE1_ID:
  391. feederLog(LOG_DEBUG, "fm4: byte1 id: %d\n", temp[0]);
  392. val_byte_id = temp[0];
  393. state = STATE_BYTE1_VAL;
  394. break;
  395. case STATE_BYTE1_VAL:
  396. feederLog(LOG_DEBUG, "fm4: byte1 val: %d\n", temp[0]);
  397. val_byte_val = temp[0];
  398. if (prio == 0)
  399. valuesCopyVal((double)val_byte_val, val_byte_id, t_t, VALUES_TYPE_OBS, values_out);
  400. else
  401. valuesCopyVal((double)val_byte_val, val_byte_id, t_t, VALUES_TYPE_ALERT, values_out);
  402. c_qua++;
  403. if (qua == c_qua)
  404. state = STATE_BYTE2_IO;
  405. else
  406. state = STATE_BYTE1_ID;
  407. break;
  408. case STATE_BYTE2_IO:
  409. qua = temp[0];
  410. c_qua = 0;
  411. feederLog(LOG_DEBUG, "fm4: byte2 io: %d\n", qua);
  412. if (qua == 0)
  413. state = STATE_BYTE4_IO;
  414. else
  415. state = STATE_BYTE2_ID;
  416. break;
  417. case STATE_BYTE2_ID:
  418. feederLog(LOG_DEBUG, "fm4: byte2 id: %d\n", temp[0]);
  419. val_byte_id = temp[0];
  420. state = STATE_BYTE2_VAL;
  421. break;
  422. case STATE_BYTE2_VAL:
  423. feederLog(LOG_DEBUG, "fm4: byte2 val: %lld\n", (byteSwap16(*(uint16_t *)temp)));
  424. val_byte_val = (byteSwap16(*(uint16_t *)temp));
  425. if (prio == 0)
  426. valuesCopyVal((double)val_byte_val, val_byte_id, t_t, VALUES_TYPE_OBS, values_out);
  427. else
  428. valuesCopyVal((double)val_byte_val, val_byte_id, t_t, VALUES_TYPE_ALERT, values_out);
  429. c_qua++;
  430. if (qua == c_qua)
  431. state = STATE_BYTE4_IO;
  432. else
  433. state = STATE_BYTE2_ID;
  434. break;
  435. case STATE_BYTE4_IO:
  436. qua = temp[0];
  437. c_qua = 0;
  438. feederLog(LOG_DEBUG, "fm4: byte4 io: %d\n", qua);
  439. if (qua == 0)
  440. state = STATE_BYTE8_IO;
  441. else
  442. state = STATE_BYTE4_ID;
  443. break;
  444. case STATE_BYTE4_ID:
  445. feederLog(LOG_DEBUG, "fm4: byte4 id: %d\n", temp[0]);
  446. val_byte_id = temp[0];
  447. state = STATE_BYTE4_VAL;
  448. break;
  449. case STATE_BYTE4_VAL:
  450. feederLog(LOG_DEBUG, "fm4: byte4 val: %d\n", (byteSwap32(*(uint32_t *)temp)));
  451. val_byte_val = (byteSwap32(*(uint32_t *)temp));
  452. if (prio == 0)
  453. valuesCopyVal((double)val_byte_val, val_byte_id, t_t, VALUES_TYPE_OBS, values_out);
  454. else
  455. valuesCopyVal((double)val_byte_val, val_byte_id, t_t, VALUES_TYPE_ALERT, values_out);
  456. c_qua++;
  457. if (qua == c_qua)
  458. state = STATE_BYTE8_IO;
  459. else
  460. state = STATE_BYTE4_ID;
  461. break;
  462. case STATE_BYTE8_IO:
  463. qua = temp[0];
  464. c_qua = 0;
  465. feederLog(LOG_DEBUG, "fm4: byte8 io: %ld\n", qua);
  466. if (qua == 0)
  467. {
  468. if (current_rec == no_of_recs)
  469. state = STATE_NO_OF_REC_END;
  470. else
  471. state = STATE_TIMESTAMP;
  472. ret = 2;
  473. }
  474. else
  475. state = STATE_BYTE8_ID;
  476. break;
  477. case STATE_BYTE8_ID:
  478. feederLog(LOG_DEBUG, "fm4: byte8 id: %d\n", temp[0]);
  479. val_byte_id = temp[0];
  480. state = STATE_BYTE8_VAL;
  481. break;
  482. case STATE_BYTE8_VAL:
  483. feederLog(LOG_DEBUG, "fm4: byte8 val: %lld\n", (byteSwap64(*(uint64_t *)temp)));
  484. val_byte_val = (byteSwap64(*(uint64_t *)temp));
  485. if (val_byte_id == 207) //rfid value
  486. valuesSpecCareRfid(val_byte_val, val_byte_id, t_t, VALUES_TYPE_OBS, values_out);
  487. else
  488. valuesCopyVal((double)val_byte_val, val_byte_id, t_t, VALUES_TYPE_OBS, values_out);
  489. c_qua++;
  490. if (qua == c_qua)
  491. {
  492. if (current_rec == no_of_recs)
  493. state = STATE_NO_OF_REC_END;
  494. else
  495. state = STATE_TIMESTAMP;
  496. ret = 2;
  497. }
  498. else
  499. state = STATE_BYTE8_ID;
  500. break;
  501. case STATE_NO_OF_REC_END:
  502. no_of_recs = temp[0];
  503. feederLog(LOG_DEBUG, "fm4: Number of records: %d\n", temp[0]);
  504. state = STATE_CRC;
  505. break;
  506. case STATE_CRC:
  507. state = STATE_IDLE;
  508. feederLog(LOG_DEBUG, "fm4: Crc\n");
  509. reply_buffer[0] = 0x00;
  510. reply_buffer[1] = 0x00;
  511. reply_buffer[2] = 0x00;
  512. reply_buffer[3] = no_of_recs;
  513. reply_len = 4;
  514. ret = 1;
  515. break;
  516. }
  517. return ret;
  518. }
  519. int parse(struct unit_t * unit)
  520. {
  521. int ret, res;
  522. ret = 0;
  523. while (res = stateMachine(unit->int_buffer[unit->int_buffer_pos]), res == 0)
  524. {
  525. if (unit->int_buffer_pos + 1 >= unit->int_buffer_pos_wr)
  526. break;
  527. unit->int_buffer_pos++;
  528. }
  529. unit->int_buffer_pos++;
  530. if (res == 1)
  531. {
  532. feederLog(LOG_DEBUG, "fm4: End of data packet\n");
  533. unit->int_buffer_pos_wr = unit->int_buffer_pos = 0;
  534. // aunit->imei[0] = 0; //todo: predpokladame ze dalsi paket bude opet uvozen 17byty s IMEI
  535. }
  536. if (res == 2)
  537. {
  538. feederLog(LOG_DEBUG, "fm4: Valid data decoded\n");
  539. ret = 1;
  540. }
  541. return ret;
  542. }
  543. //----------------------------------------------------------------------------------------------
  544. struct unit_t * unitFind(int fd)
  545. {
  546. struct unit_t * unit;
  547. unit = units;
  548. while (unit != NULL)
  549. {
  550. if (unit->fd == fd)
  551. {
  552. return unit;
  553. }
  554. unit = unit->next;
  555. }
  556. return NULL;
  557. }
  558. struct unit_t * unitCreate(int fd)
  559. {
  560. struct unit_t * unit, * unit_new;
  561. unit_new = malloc(sizeof(struct unit_t));
  562. if (unit_new == NULL)
  563. return NULL;
  564. unit_new->fd = fd;
  565. unit_new->imei[0] = 0;
  566. unit_new->next = NULL;
  567. unit_new->int_buffer = malloc(FM4_BUFFER_SIZE);
  568. if (unit_new->int_buffer == NULL)
  569. {
  570. free(unit_new);
  571. return NULL;
  572. }
  573. unit_new->int_buffer_pos = 0;
  574. unit_new->int_buffer_pos_wr = 0;
  575. if (units == NULL)
  576. units = unit_new;
  577. else
  578. {
  579. unit = units;
  580. while (unit->next != NULL)
  581. {
  582. unit = unit->next;
  583. }
  584. unit->next = unit_new;
  585. }
  586. return unit_new;
  587. }
  588. int imei(struct unit_t * unit, unsigned char * data)
  589. {
  590. struct avl_header_t * avl_header;
  591. char imei_str[16];
  592. avl_header = (struct avl_header_t *)data;
  593. memcpy(imei_str, avl_header->imei, 15);
  594. imei_str[15] = 0;
  595. feederLog(LOG_DEBUG, "fm4: Imei is %s\n", imei_str);
  596. strcpy(unit->imei, imei_str);
  597. return 1;
  598. }
  599. int init(void * param)
  600. {
  601. param = param;
  602. bzero(reply_buffer, 32);
  603. reply_len = 0;
  604. units = aunit = NULL;
  605. return 0;
  606. }
  607. void logHex(char * buffer, unsigned char * data, unsigned int length)
  608. {
  609. unsigned int i;
  610. buffer[0] = 0;
  611. for (i = 0; i < length; i++)
  612. {
  613. sprintf(buffer + strlen(buffer), "%02X ", data[i]);
  614. }
  615. }
  616. unsigned int
  617. process(void *lib_data, int socket, unsigned char *data,
  618. unsigned int length, unsigned long long int *id, time_t * tm,
  619. double *result_array, uint64_t * sensors, unsigned int *type)
  620. {
  621. unsigned int ret = 0;
  622. struct unit_t * unit;
  623. uint8_t i;
  624. char buffer[32768];
  625. unsigned int l;
  626. (void)lib_data;
  627. if (data != NULL)
  628. {
  629. feederLog(LOG_DEBUG, "fm4: Incoming data: len %d: \n", length);
  630. l = length;
  631. while (l > 0)
  632. {
  633. logHex(buffer, data + length - l, (l > 16) ? 16:l);
  634. feederLog(LOG_DEBUG, "%s\n", buffer);
  635. l -= (l > 16) ? 16:l;
  636. }
  637. }
  638. unit = unitFind(socket);
  639. if (unit == NULL)
  640. {
  641. feederLog(LOG_DEBUG, "fm4: new unit for socket %d\n", socket);
  642. unit = unitCreate(socket); //todo: check if scucsefull
  643. }
  644. else
  645. {
  646. feederLog(LOG_DEBUG, "fm4: data from known unit on socket %d\n", socket);
  647. }
  648. aunit = unit;
  649. // if ((length != 0) && (strlen(aunit->imei) == 0))
  650. if ((length != 0) && ((memcmp(data, "\0\0\0\0", 4) != 0) && (state == STATE_IDLE)) && (unit->int_buffer_pos_wr == 0))
  651. {
  652. imei(aunit, data);
  653. feederLog(LOG_DEBUG, "fm4: imei for socket %d is %s\n", socket, unit->imei);
  654. unit->int_buffer_pos = unit->int_buffer_pos_wr = 0;
  655. reply_buffer[0] = 0x01;
  656. reply_len = 1;
  657. ret = 0;
  658. }
  659. else
  660. {
  661. if (length != 0)
  662. {
  663. feederLog(LOG_DEBUG, "fm4: Copying data for unit, imei %s\n", unit->imei);
  664. if (unit->int_buffer_pos_wr + length >= FM4_BUFFER_SIZE)
  665. {
  666. feederLog(LOG_WARNING, "fm4: Buffer full, reseting, imei %s\n", unit->imei);
  667. unit->int_buffer_pos = unit->int_buffer_pos_wr = 0;
  668. }
  669. else
  670. {
  671. if ((unit->int_buffer_pos_wr != 0) || (*((uint32_t *)data) == 0x00000000))
  672. {
  673. memcpy(unit->int_buffer + unit->int_buffer_pos_wr, data, length);
  674. unit->int_buffer_pos_wr += length;
  675. feederLog(LOG_DEBUG, "fm4: Copy done, imei %s\n", unit->imei);
  676. }
  677. }
  678. }
  679. if ((unit->int_buffer_pos_wr > 0) && (*((uint32_t *)unit->int_buffer) == 0x00000000))
  680. {
  681. uint32_t reported_packet_size = byteSwap32(*((uint32_t *)(unit->int_buffer + 4)));
  682. reported_packet_size += 4 + 4 + 4; /* leading zeroes + packet size + crc */
  683. if (unit->int_buffer_pos_wr != reported_packet_size)
  684. {
  685. feederLog(LOG_DEBUG, "fm4: Not enough packet data, waiting for more, imei %s\n", unit->imei);
  686. }
  687. else
  688. {
  689. if ((parse(unit)) || (values_len != 0))
  690. {
  691. *id = atol(aunit->imei);
  692. *tm = values_time;
  693. // printf("val type %d\n", values_type[0]);
  694. if (values_type[0] == VALUES_TYPE_POS)
  695. {
  696. memcpy(result_array, values_out, sizeof(double) * 3);
  697. *type = VALUES_TYPE_POS;
  698. sensors[0] = sensors[1] = sensors[2] = 0x10;
  699. ret = 3;
  700. values_len -= 3;
  701. }
  702. else if (values_type[values_len - 1] == VALUES_TYPE_OBS)
  703. {
  704. i = 0;
  705. while ((values_len > 0) && (values_type[values_len - 1] == VALUES_TYPE_OBS))
  706. {
  707. result_array[i] = values_out[values_len - 1];
  708. sensors[i] = values_sensor[values_len - 1];
  709. i++;
  710. values_len--;
  711. }
  712. *type = VALUES_TYPE_OBS;
  713. ret = i;
  714. /*
  715. memcpy(result_array, values_out, sizeof(double) * values_len);
  716. *type = VALUES_TYPE_OBS;
  717. memcpy(sensors, values_sensor, sizeof(uint64_t) * values_len);
  718. ret = values_len;
  719. */
  720. }
  721. else if (values_type[values_len - 1] == VALUES_TYPE_ALERT)
  722. {
  723. i = 0;
  724. while ((values_len > 0) && (values_type[values_len - 1] == VALUES_TYPE_ALERT))
  725. {
  726. result_array[i] = values_out[values_len - 1];
  727. sensors[i] = values_sensor[values_len - 1];
  728. i++;
  729. values_len--;
  730. }
  731. *type = VALUES_TYPE_ALERT;
  732. ret = i;
  733. /* memcpy(result_array, values_out, sizeof(double) * values_len);
  734. *type = VALUES_TYPE_ALERT;
  735. memcpy(sensors, values_sensor, sizeof(uint64_t) * values_len);
  736. ret = values_len;*/
  737. }
  738. }
  739. }
  740. }
  741. }
  742. return ret;
  743. }
  744. int reply(void *lib_data, int socket, unsigned char *data)
  745. {
  746. unsigned int temp_reply_len;
  747. (void)lib_data;
  748. (void)socket;
  749. feederLog(LOG_DEBUG, "fm4: replying\n");
  750. memcpy(data, reply_buffer, reply_len);
  751. temp_reply_len = reply_len;
  752. reply_len = 0;
  753. return temp_reply_len;
  754. }
  755. int open(void *lib_data, int socket)
  756. {
  757. (void)lib_data;
  758. (void)socket;
  759. feederLog(LOG_DEBUG, "fm4: socket %d opened\n", socket);
  760. return 0;
  761. }
  762. int close(void *lib_data, int socket)
  763. {
  764. struct unit_t * unit;
  765. (void)lib_data;
  766. (void)socket;
  767. feederLog(LOG_DEBUG, "fm4: socket %d closed\n", socket);
  768. unit = unitFind(socket);
  769. if (unit != NULL)
  770. {
  771. // free(unit->int_buffer);
  772. unit->imei[0] = 0; //todo: nebo mozna lepe, zrusit celou jednotku - coz bacha na next
  773. }
  774. unit->int_buffer_pos_wr = unit->int_buffer_pos = 0;
  775. return 0;
  776. }