fm4_.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983
  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[15];
  26. struct unit_t * next;
  27. } unit_t;
  28. static struct unit_t * units;
  29. static struct unit_t * aunit;
  30. 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. unsigned char counts[] =
  91. {
  92. 4, 4, 1, 1,
  93. 8, 1,
  94. 4, 4, 2, 2, 1, 2,
  95. 1, 1,
  96. 1, 1, 1,
  97. 1, 1, 2,
  98. 1, 1, 4,
  99. 1, 1, 8,
  100. 1, 4
  101. };
  102. #define PRIO_LOW 0
  103. #define PRIO_HIGHT 1
  104. #define PRIO_PANIC 2
  105. #define PRIO_SECURITY 3
  106. #define VAL_DI1 1
  107. #define VAL_DI2 2
  108. void valuesCopyPos(double lat, double lon, double alt, time_t t, uint8_t type, double * values)
  109. {
  110. values[0] = lat;
  111. values[1] = lon;
  112. values[2] = alt;
  113. values_time = t;
  114. values_type[0] = type;
  115. values_type[1] = type;
  116. values_type[2] = type;
  117. }
  118. /* {FM4 type, FEEDER sensor type id, sensor id, alertable (if prio is 1(high))} */
  119. uint8_t sensorTypes[][4] =
  120. {
  121. {1, TYPE_DIGITAL_INPUT, 5, 0},
  122. {2, TYPE_DIGITAL_INPUT, 6, 1},
  123. {3, TYPE_DIGITAL_INPUT, 7, 0},
  124. {4, TYPE_DIGITAL_INPUT, 8, 0},
  125. {9, TYPE_ANALOG_INPUT, 1, 0},
  126. {10, TYPE_ANALOG_INPUT, 2, 0},
  127. {11, TYPE_ANALOG_INPUT, 3, 0},
  128. {19, TYPE_ANALOG_INPUT, 4, 0},
  129. {21, TYPE_SIGNAL_STRENGTH, 3, 0},
  130. {24, TYPE_SPEED, 2, 0},
  131. {66, TYPE_VOLTAGE, 11, 0},
  132. {67, TYPE_VOLTAGE, 10, 0},
  133. {68, TYPE_CURRENT, 2, 0},
  134. {69, TYPE_SIGNAL_STRENGTH, 4, 0},
  135. {70, TYPE_THERMOMETER, 11, 0},
  136. {72, TYPE_THERMOMETER, 12, 0},
  137. {73, TYPE_THERMOMETER, 13, 0},
  138. {74, TYPE_THERMOMETER, 14, 0},
  139. {0, 0, 0, 0}
  140. };
  141. double sensorMulti[] =
  142. {
  143. 1.0,
  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. 0.001,
  154. 0.001,
  155. 0.001,
  156. 1.0,
  157. 0.1,
  158. 0.1,
  159. 0.1,
  160. 0.1,
  161. };
  162. uint8_t getSensorType(uint8_t sensor)
  163. {
  164. int i;
  165. i = 0;
  166. while (sensorTypes[i][0] != 0)
  167. {
  168. if (sensorTypes[i][0] == sensor)
  169. return i;
  170. i++;
  171. }
  172. return i;
  173. }
  174. void valuesCopyVal(double value, uint8_t sensor, time_t t, uint8_t type, double * values)
  175. {
  176. uint8_t sensor_index;
  177. sensor_index = getSensorType(sensor);
  178. values[values_len] = value * sensorMulti[sensor_index];
  179. values_sensor[values_len] = sensorTypes[sensor_index][2] * 10000 + sensorTypes[sensor_index][1] * 10000000;
  180. values_time = t;
  181. if ((type == VALUES_TYPE_ALERT) && (sensorTypes[sensor_index][3] == 1))
  182. values_type[values_len] = VALUES_TYPE_ALERT;
  183. else
  184. values_type[values_len] = VALUES_TYPE_OBS;
  185. feederLog(LOG_DEBUG, "Observation type %s\n", (values_type[values_len] == VALUES_TYPE_ALERT) ? "alert" : "obs");
  186. values_len++;
  187. }
  188. int stateMachine(unsigned char c)
  189. {
  190. static unsigned char state = STATE_IDLE;
  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, "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, "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, "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, "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, "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, "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, "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, "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, "alt: %f\n", alt);
  272. state = STATE_ANGLE;
  273. break;
  274. case STATE_ANGLE:
  275. feederLog(LOG_DEBUG, "angle: %f\n", (float)(byteSwap16(*(uint16_t *)temp)));
  276. state = STATE_SATTS;
  277. break;
  278. case STATE_SATTS:
  279. feederLog(LOG_DEBUG, "sattelites: %d\n", temp[0]);
  280. state = STATE_SPEED;
  281. break;
  282. case STATE_SPEED:
  283. feederLog(LOG_DEBUG, "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, "event io id: %d\n", temp[0]);
  290. state = STATE_TOTAL_IO;
  291. break;
  292. case STATE_TOTAL_IO:
  293. feederLog(LOG_DEBUG, "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, "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, "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, "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, "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, "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, "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, "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, "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, "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, "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. ret = 2;
  389. }
  390. else
  391. state = STATE_BYTE8_ID;
  392. break;
  393. case STATE_BYTE8_ID:
  394. feederLog(LOG_DEBUG, "byte8 id: %d\n", temp[0]);
  395. val_byte_id = temp[0];
  396. state = STATE_BYTE8_VAL;
  397. break;
  398. case STATE_BYTE8_VAL:
  399. feederLog(LOG_DEBUG, "byte8 val: %d\n", (byteSwap64(*(uint64_t *)temp)));
  400. val_byte_val = (byteSwap64(*(uint64_t *)temp));
  401. valuesCopyVal((double)val_byte_val, val_byte_id, t_t, VALUES_TYPE_OBS, values_out);
  402. c_qua++;
  403. if (qua == c_qua)
  404. {
  405. if (current_rec == no_of_recs)
  406. state = STATE_NO_OF_REC_END;
  407. else
  408. state = STATE_TIMESTAMP;
  409. ret = 2;
  410. }
  411. else
  412. state = STATE_BYTE8_ID;
  413. break;
  414. case STATE_NO_OF_REC_END:
  415. no_of_recs = temp[0];
  416. feederLog(LOG_DEBUG, "Number of records: %d\n", temp[0]);
  417. state = STATE_CRC;
  418. break;
  419. case STATE_CRC:
  420. state = STATE_IDLE;
  421. feederLog(LOG_DEBUG, "Crc\n");
  422. reply_buffer[0] = 0x00;
  423. reply_buffer[1] = 0x00;
  424. reply_buffer[2] = 0x00;
  425. reply_buffer[3] = no_of_recs;
  426. reply_len = 4;
  427. ret = 1;
  428. break;
  429. }
  430. return ret;
  431. }
  432. /*
  433. int stateMachine(unsigned char c)
  434. {
  435. static unsigned char state = STATE_IDLE;
  436. static uint8_t temp[16];
  437. static unsigned char count = 0;
  438. static unsigned char mask = 0, mask_global = 0;
  439. static unsigned char state_type = STATE_IDLE;
  440. static unsigned char qua = 0, c_qua = 0;
  441. static unsigned char no_of_recs = 0, current_rec = 0;
  442. static float lat, lon, alt;
  443. static uint8_t prio;
  444. static struct tm rec_time;
  445. time_t t_t;
  446. int ret;
  447. ret = 0;
  448. * if (state != STATE_IDLE)
  449. printf("0x%x %d|", c, state);*
  450. temp[count] = c;
  451. count++;
  452. if (count < counts[state])
  453. return 0;
  454. count = 0;
  455. switch (state)
  456. {
  457. case STATE_IDLE:
  458. if (*((uint32_t *)temp) == 0x00000000)
  459. state = STATE_DATA_LENGTH;
  460. break;
  461. case STATE_DATA_LENGTH:
  462. feederLog(LOG_DEBUG, "Data size: %d\n", byteSwap32(*((uint32_t *)temp)));
  463. state = STATE_CODEC_ID;
  464. break;
  465. case STATE_CODEC_ID:
  466. if (temp[0] == 0x07)
  467. state = STATE_NO_OF_REC;
  468. else
  469. {
  470. feederLog(LOG_DEBUG, "Bad codec, going to idle state\n");
  471. state = STATE_IDLE;
  472. }
  473. break;
  474. case STATE_NO_OF_REC:
  475. no_of_recs = temp[0];
  476. current_rec = 0;
  477. feederLog(LOG_DEBUG, "Number of records: %d\n", no_of_recs);
  478. state = STATE_PR_TS;
  479. break;
  480. case STATE_PR_TS:
  481. gmtime_r(&t_t, &rec_time);
  482. t_t = (byteSwap32(*((uint32_t *)temp)) & 0x3fffffff) + 1166832000 + 777600;
  483. if (current_rec > 0)
  484. {
  485. if ((lat != 0.0) && (lon != 0.0))
  486. {
  487. valuesCopy(lat, lon, alt, t_t, prio, values_out);
  488. ret = 2;
  489. }
  490. }
  491. lat = lon = alt = 0.0;
  492. prio = PRIO_UNDEFINED;
  493. localtime_r(&t_t, &rec_time);
  494. feederLog(LOG_DEBUG, "Time of rec: %04d-%02d-%02d %02d:%02d:%02d\n",
  495. rec_time.tm_year + 1900, rec_time.tm_mon + 1, rec_time.tm_mday, rec_time.tm_hour, rec_time.tm_min, rec_time.tm_sec);
  496. prio = temp[0] >> 6;
  497. feederLog(LOG_DEBUG, "Priority: %d\n", prio);
  498. feederLog(LOG_DEBUG, "Next processed record will be: %d\n", current_rec);
  499. current_rec++;
  500. state = STATE_G_MASK;
  501. break;
  502. case STATE_G_MASK:
  503. * feederLog(LOG_DEBUG, "gps:%d, io_1:%d, io_2:%d, io_4:%d\n",
  504. MASK_GPS(temp[0]), MASK_IO1(temp[0]), MASK_IO2(temp[0]), MASK_IO4(temp[0]));*
  505. state_type = STATE_G_MASK;
  506. mask_global = temp[0];
  507. state = maskGlobalNext(mask_global, state_type, current_rec == no_of_recs);
  508. state_type = state;
  509. break;
  510. case STATE_MASK:
  511. * feederLog(LOG_DEBUG, "latlon:%d, alt:%d, angle:%d, speed:%d, sats:%d, cell:%d, qua:%d, op:%d\n",
  512. MASK_LATLON(temp[0]), MASK_ALT(temp[0]), MASK_ANGLE(temp[0]), MASK_SPEED(temp[0]),
  513. MASK_SATS(temp[0]), MASK_CELL(temp[0]), MASK_QUA(temp[0]), MASK_OP(temp[0]));*
  514. mask = temp[0];
  515. state = maskNext(mask, state);
  516. break;
  517. case STATE_LATLON:
  518. arraySwap4(temp);
  519. arraySwap4(&temp[4]);
  520. lon = *((float *)(&temp[4]));
  521. lat = *((float *)(&temp[0]));
  522. feederLog(LOG_DEBUG, "latlon: %f, %f\n", lat, lon);
  523. state = maskNext(mask, state);
  524. break;
  525. case STATE_ALT:
  526. alt = (float)byteSwap16(*(uint16_t *)temp);
  527. feederLog(LOG_DEBUG, "alt: %f\n", alt);
  528. state = maskNext(mask, state);
  529. break;
  530. case STATE_ANGLE:
  531. feederLog(LOG_DEBUG, "angle: %f\n", temp[0] * 360.0 / 256.0);
  532. state = maskNext(mask, state);
  533. break;
  534. case STATE_SPEED:
  535. feederLog(LOG_DEBUG, "speed: %d\n", *(uint8_t *)temp);
  536. state = maskNext(mask, state);
  537. break;
  538. case STATE_SATTS:
  539. feederLog(LOG_DEBUG, "sats: %d\n", *(uint8_t *)temp);
  540. state = maskNext(mask, state);
  541. if (state == STATE_MASK)
  542. {
  543. feederLog(LOG_DEBUG, "End of gps\n");
  544. state = maskGlobalNext(mask_global, STATE_MASK, current_rec == no_of_recs);
  545. state_type = state;
  546. }
  547. break;
  548. case STATE_CELL:
  549. feederLog(LOG_DEBUG, "cell:\n");
  550. state = maskNext(mask, state);
  551. break;
  552. case STATE_QUA:
  553. feederLog(LOG_DEBUG, "quality: %d\n", temp[0]);
  554. state = maskNext(mask, state);
  555. break;
  556. case STATE_OP:
  557. feederLog(LOG_DEBUG, "operator: %d\n", byteSwap32(*(uint32_t *)temp));
  558. state = maskGlobalNext(mask_global, state_type, current_rec == no_of_recs); //todo: ted predpokladam ze jsou vsechny v gps (0xff)(rep minimalne tahle posledni)
  559. state_type = state;
  560. break;
  561. case STATE_IO1_Q:
  562. qua = temp[0];
  563. feederLog(LOG_DEBUG, "io1 qua: %d\n", qua);
  564. c_qua = 0;
  565. if (c_qua == qua)
  566. {
  567. state = maskGlobalNext(mask_global, state_type, current_rec == no_of_recs);
  568. state_type = state;
  569. }
  570. else
  571. state = STATE_IO1_ID;
  572. break;
  573. case STATE_IO1_ID:
  574. // feederLog(LOG_DEBUG, "io1 id:\n");
  575. state = STATE_IO1_VAL;
  576. break;
  577. case STATE_IO1_VAL:
  578. // feederLog(LOG_DEBUG, "io1 val:\n");
  579. c_qua++;
  580. if (c_qua == qua)
  581. {
  582. state = maskGlobalNext(mask_global, state_type, current_rec == no_of_recs);
  583. state_type = state;
  584. }
  585. else
  586. state = STATE_IO1_ID;
  587. break;
  588. case STATE_IO2_Q:
  589. qua = temp[0];
  590. feederLog(LOG_DEBUG, "io2 qua: %d\n", qua);
  591. c_qua = 0;
  592. if (c_qua == qua)
  593. {
  594. state = maskGlobalNext(mask_global, state_type, current_rec == no_of_recs);
  595. state_type = state;
  596. }
  597. else
  598. state = STATE_IO2_ID;
  599. break;
  600. case STATE_IO2_ID:
  601. // feederLog(LOG_DEBUG, "io2 id:\n");
  602. state = STATE_IO2_VAL;
  603. break;
  604. case STATE_IO2_VAL:
  605. // feederLog(LOG_DEBUG, "io2 val:\n");
  606. c_qua++;
  607. if (c_qua == qua)
  608. {
  609. state = maskGlobalNext(mask_global, state_type, current_rec == no_of_recs);
  610. state_type = state;
  611. }
  612. else
  613. state = STATE_IO2_ID;
  614. break;
  615. case STATE_IO4_Q:
  616. qua = temp[0];
  617. feederLog(LOG_DEBUG, "io4 qua: %d\n", qua);
  618. c_qua = 0;
  619. if (c_qua == qua)
  620. {
  621. state = maskGlobalNext(mask_global, state_type, current_rec == no_of_recs);
  622. state_type = state;
  623. }
  624. else
  625. state = STATE_IO4_ID;
  626. break;
  627. case STATE_IO4_ID:
  628. // feederLog(LOG_DEBUG, "io4 id:\n");
  629. state = STATE_IO4_VAL;
  630. break;
  631. case STATE_IO4_VAL:
  632. // feederLog(LOG_DEBUG, "io4 val:\n");
  633. c_qua++;
  634. if (c_qua == qua)
  635. {
  636. state = maskGlobalNext(mask_global, state_type, current_rec == no_of_recs);
  637. state_type = state;
  638. }
  639. else
  640. state = STATE_IO4_ID;
  641. break;
  642. case STATE_NO_OF_REC_END:
  643. no_of_recs = temp[0];
  644. feederLog(LOG_DEBUG, "Number of records: %d\n", temp[0]);
  645. ret = 2;
  646. valuesCopy(lat, lon, alt, t_t, prio, values_out);
  647. state = STATE_CRC;
  648. break;
  649. case STATE_CRC:
  650. state = STATE_IDLE;
  651. feederLog(LOG_DEBUG, "Crc\n");
  652. reply_buffer[0] = 0x00;
  653. reply_buffer[1] = 0x00;
  654. reply_buffer[2] = 0x00;
  655. reply_buffer[3] = no_of_recs;
  656. reply_len = 4;
  657. ret = 1;
  658. break;
  659. }
  660. return ret;
  661. }
  662. */
  663. int translate(unsigned char * data)
  664. {
  665. int ret, res;
  666. ret = 0;
  667. while (res = stateMachine(int_buffer[int_buffer_pos]), res == 0)
  668. {
  669. if (int_buffer_pos + 1 >= int_buffer_pos_wr)
  670. break;
  671. int_buffer_pos++;
  672. }
  673. int_buffer_pos++;
  674. if (res == 1)
  675. {
  676. feederLog(LOG_DEBUG, "End of data packet\n");
  677. int_buffer_pos_wr = int_buffer_pos = 0;
  678. }
  679. if (res == 2)
  680. {
  681. feederLog(LOG_DEBUG, "Valid data decoded\n");
  682. ret = 1;
  683. }
  684. return ret;
  685. }
  686. //----------------------------------------------------------------------------------------------
  687. struct unit_t * unitFind(int fd)
  688. {
  689. struct unit_t * unit;
  690. unit = units;
  691. while (unit != NULL)
  692. {
  693. if (unit->fd == fd)
  694. {
  695. return unit;
  696. }
  697. unit = unit->next;
  698. }
  699. return NULL;
  700. }
  701. struct unit_t * unitCreate(int fd)
  702. {
  703. struct unit_t * unit, * unit_new;
  704. unit_new = malloc(sizeof(struct unit_t));
  705. if (unit_new == NULL)
  706. return NULL;
  707. unit_new->fd = fd;
  708. unit_new->imei[0] = 0;
  709. unit_new->next = NULL;
  710. if (units == NULL)
  711. units = unit_new;
  712. else
  713. {
  714. unit = units;
  715. while (unit->next != NULL)
  716. {
  717. unit = unit->next;
  718. }
  719. unit->next = unit_new;
  720. }
  721. return unit_new;
  722. }
  723. int imei(struct unit_t * unit, unsigned char * data)
  724. {
  725. struct avl_header_t * avl_header;
  726. char imei_str[16];
  727. avl_header = (struct avl_header_t *)data;
  728. memcpy(imei_str, avl_header->imei, 15);
  729. imei_str[15] = 0;
  730. feederLog(LOG_DEBUG, "Imei is %s\n", imei_str);
  731. strcpy(unit->imei, imei_str);
  732. return 1;
  733. }
  734. int init(void * param)
  735. {
  736. param = param;
  737. bzero(reply_buffer, 32);
  738. reply_len = 0;
  739. int_buffer = malloc(32768);
  740. units = aunit = NULL;
  741. return 0;
  742. }
  743. void logHex(char * buffer, unsigned char * data, unsigned int length)
  744. {
  745. unsigned int i;
  746. buffer[0] = 0;
  747. for (i = 0; i < length; i++)
  748. {
  749. sprintf(buffer + strlen(buffer), "%02X ", data[i]);
  750. }
  751. }
  752. unsigned int
  753. process(void *lib_data, int socket, unsigned char *data,
  754. unsigned int length, unsigned long long int *id, time_t * tm,
  755. double *result_array, uint64_t * sensors, unsigned int *type)
  756. {
  757. unsigned int ret = 0;
  758. struct unit_t * unit;
  759. uint8_t i;
  760. uint8_t buffer[32768];
  761. if (data != NULL)
  762. {
  763. feederLog(LOG_DEBUG, "Incoming data: len %d: ", length);
  764. logHex(buffer, data, length);
  765. feederLog(LOG_DEBUG, "%s\n", buffer);
  766. }
  767. unit = unitFind(socket);
  768. if (unit == NULL)
  769. {
  770. feederLog(LOG_DEBUG, "fm4: new unit for socket %d\n", socket);
  771. unit = unitCreate(socket);
  772. }
  773. else
  774. feederLog(LOG_DEBUG, "fm4: data from known unit on socket %d\n", socket);
  775. aunit = unit;
  776. if ((length != 0) && (strlen(aunit->imei) == 0))
  777. {
  778. printf("fm4: getting imei\n");
  779. imei(aunit, data);
  780. feederLog(LOG_DEBUG, "fm4: imei for socket %d is %s\n", socket, unit->imei);
  781. reply_buffer[0] = 0x01;
  782. reply_len = 1;
  783. ret = 0;
  784. }
  785. else
  786. {
  787. if (length != 0)
  788. {
  789. feederLog(LOG_DEBUG, "Copying data\n", int_buffer_pos);
  790. memcpy(int_buffer + int_buffer_pos_wr, data, length);
  791. int_buffer_pos_wr += length;
  792. }
  793. if ((translate(int_buffer)) || (values_len != 0))
  794. {
  795. *id = atol(aunit->imei);
  796. *tm = values_time;
  797. // printf("val type %d\n", values_type[0]);
  798. if (values_type[0] == VALUES_TYPE_POS)
  799. {
  800. memcpy(result_array, values_out, sizeof(double) * 3);
  801. *type = VALUES_TYPE_POS;
  802. sensors[0] = sensors[1] = sensors[2] = 0x10;
  803. ret = 3;
  804. values_len -= 3;
  805. }
  806. else if (values_type[values_len - 1] == VALUES_TYPE_OBS)
  807. {
  808. i = 0;
  809. while ((values_len > 0) && (values_type[values_len - 1] == VALUES_TYPE_OBS))
  810. {
  811. result_array[i] = values_out[values_len - 1];
  812. sensors[i] = values_sensor[values_len - 1];
  813. i++;
  814. values_len--;
  815. }
  816. *type = VALUES_TYPE_OBS;
  817. ret = i;
  818. /*
  819. memcpy(result_array, values_out, sizeof(double) * values_len);
  820. *type = VALUES_TYPE_OBS;
  821. memcpy(sensors, values_sensor, sizeof(uint64_t) * values_len);
  822. ret = values_len;
  823. */
  824. }
  825. else if (values_type[values_len - 1] == VALUES_TYPE_ALERT)
  826. {
  827. i = 0;
  828. while ((values_len > 0) && (values_type[values_len - 1] == VALUES_TYPE_ALERT))
  829. {
  830. result_array[i] = values_out[values_len - 1];
  831. sensors[i] = values_sensor[values_len - 1];
  832. i++;
  833. values_len--;
  834. }
  835. *type = VALUES_TYPE_ALERT;
  836. ret = i;
  837. /* memcpy(result_array, values_out, sizeof(double) * values_len);
  838. *type = VALUES_TYPE_ALERT;
  839. memcpy(sensors, values_sensor, sizeof(uint64_t) * values_len);
  840. ret = values_len;*/
  841. }
  842. }
  843. }
  844. return ret;
  845. }
  846. int reply(void *lib_data, int socket, unsigned char *data)
  847. {
  848. unsigned int temp_reply_len;
  849. feederLog(LOG_DEBUG, "fm4: replying\n");
  850. memcpy(data, reply_buffer, reply_len);
  851. temp_reply_len = reply_len;
  852. reply_len = 0;
  853. return temp_reply_len;
  854. }
  855. int open(void *lib_data, int socket)
  856. {
  857. feederLog(LOG_DEBUG, "fm4: socket %d opened\n", socket);
  858. return 0;
  859. }
  860. int close(void *lib_data, int socket)
  861. {
  862. struct unit_t * unit;
  863. feederLog(LOG_DEBUG, "fm4: socket %d closed\n", socket);
  864. unit = unitFind(socket);
  865. if (unit != NULL)
  866. {
  867. unit->imei[0] = 0; //todo: nebo mozna lepe, zrusit celou jednotku
  868. }
  869. int_buffer_pos_wr = int_buffer_pos = 0;
  870. return 0;
  871. }