fm4_pred_opravou-kazda_jednotka_vlastni_buffer.c 17 KB

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