fm4_at.c 21 KB

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