fm4ex.c 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287
  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. time_t t_t;
  32. } unit_t;
  33. static struct unit_t * units;
  34. static struct unit_t * aunit;
  35. static void (* feederLog)(int priority, const char * fmt, ...);
  36. int setLog(void * func)
  37. {
  38. feederLog = func;
  39. return 0;
  40. }
  41. void fm4LogHex(char * buffer, unsigned char * data, unsigned int length);
  42. typedef struct avl_header_t
  43. {
  44. uint16_t dummy __attribute__ ((packed));
  45. char imei[15];
  46. } avl_header_t;
  47. uint16_t byteSwap16(uint16_t value)
  48. {
  49. uint16_t swapped;
  50. swapped = (((0x00FF) & (value >> 8)) |
  51. ((0xFF00) & (value << 8)));
  52. return swapped;
  53. }
  54. uint32_t byteSwap32(uint32_t value)
  55. {
  56. uint32_t swapped;
  57. swapped = (((0x000000FF) & (value >> 24)) |
  58. ((0x0000FF00) & (value >> 8)) |
  59. ((0x00FF0000) & (value << 8)) |
  60. ((0xFF000000) & (value << 24)));
  61. return swapped;
  62. }
  63. uint64_t byteSwap64(uint64_t value)
  64. {
  65. uint64_t swapped;
  66. swapped = (((0x00000000000000FFULL) & (value >> 56)) |
  67. ((0x000000000000FF00ULL) & (value >> 40)) |
  68. ((0x0000000000FF0000ULL) & (value >> 24)) |
  69. ((0x00000000FF000000ULL) & (value >> 8)) |
  70. ((0x000000FF00000000ULL) & (value << 8)) |
  71. ((0x0000FF0000000000ULL) & (value << 24)) |
  72. ((0x00FF000000000000ULL) & (value << 40)) |
  73. ((0xFF00000000000000ULL) & (value << 56)));
  74. return swapped;
  75. }
  76. void arraySwap4(uint8_t * array)
  77. {
  78. uint8_t temp;
  79. temp = array[0];
  80. array[0] = array[3];
  81. array[3] = temp;
  82. temp = array[1];
  83. array[1] = array[2];
  84. array[2] = temp;
  85. }
  86. enum states {STATE_IDLE = 0, STATE_DATA_LENGTH, STATE_CODEC_ID, STATE_NO_OF_REC,
  87. STATE_TIMESTAMP, STATE_PRIORITY,
  88. STATE_LON, STATE_LAT, STATE_ALT, STATE_ANGLE, STATE_SATTS, STATE_SPEED,
  89. STATE_EVENT_IO_ID, STATE_TOTAL_IO,
  90. STATE_BYTE1_IO, STATE_BYTE1_ID, STATE_BYTE1_VAL,
  91. STATE_BYTE2_IO, STATE_BYTE2_ID, STATE_BYTE2_VAL,
  92. STATE_BYTE4_IO, STATE_BYTE4_ID, STATE_BYTE4_VAL,
  93. STATE_BYTE8_IO, STATE_BYTE8_ID, STATE_BYTE8_VAL,
  94. STATE_BYTEX_IO, STATE_BYTEX_ID, STATE_BYTEX_LEN, STATE_BYTEX_VAL,
  95. STATE_NO_OF_REC_END, STATE_CRC,
  96. STATE_TYPE, STATE_COMMAND_RESPONSE_SIZE, STATE_COMMAND_RESPONSE
  97. };
  98. 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)
  99. uint32_t counts_codec8[] =
  100. {
  101. 4, 4, 1, 1, //AVL data packet
  102. 8, 1, //AVL data
  103. 4, 4, 2, 2, 1, 2, //GPS element
  104. 1, 1, //IO element
  105. 1, 1, 1, //N1 IO
  106. 1, 1, 2, //N2 IO
  107. 1, 1, 4, //N4 IO
  108. 1, 1, 8, //N8 IO
  109. 0, 0, 0, 0, //placeholder for codec8ex NX IO
  110. 1, 4 //No of data, CRC
  111. };
  112. uint32_t counts_codec8ex[] =
  113. {
  114. 4, 4, 1, 1, //AVL data packet
  115. 8, 1, //AVL data
  116. 4, 4, 2, 2, 1, 2, //GPS element
  117. 2, 2, //IO element
  118. 2, 2, 1, //N1 IO
  119. 2, 2, 2, //N2 IO
  120. 2, 2, 4, //N4 IO
  121. 2, 2, 8, //N8 IO
  122. 2, 2, 2, 0, //NX IO, length is upadted in state machine
  123. 1, 4 //No of data, CRC
  124. };
  125. uint32_t counts_codec12[] =
  126. {
  127. 4, 4, 1, 1, //AVL data packet
  128. 8, 1, //AVL data
  129. 4, 4, 2, 2, 1, 2, //GPS element
  130. 1, 1, //IO element
  131. 1, 1, 1, //N1 IO
  132. 1, 1, 2, //N2 IO
  133. 1, 1, 4, //N4 IO
  134. 1, 1, 8, //N8 IO
  135. 0, 0, 0, 0, //NX IO, length is upadted in state machine
  136. 1, 4, //No of data, CRC
  137. 1, //Type
  138. 4, //Command/Response size
  139. 0 //Command/Response - length is updated in state machine
  140. };
  141. #define PRIO_LOW 0
  142. #define PRIO_HIGHT 1
  143. #define PRIO_PANIC 2
  144. #define PRIO_SECURITY 3
  145. #define VAL_DI1 1
  146. #define VAL_DI2 2
  147. void valuesCopyPos(double lat, double lon, double alt, time_t t, uint8_t type, double * values)
  148. {
  149. values[0] = lat;
  150. values[1] = lon;
  151. values[2] = alt;
  152. values_time = t;
  153. values_type[0] = type;
  154. values_type[1] = type;
  155. values_type[2] = type;
  156. }
  157. //todo: nasledujici dve pole do pole struktur, tedy vcetne multiplu
  158. /* {FM4 type, FEEDER sensor type id (AA), sensor id (BBB), alertable (if prio is 1(high)), sensor particular type (last for number - CCCC)} */
  159. /*
  160. uint16_t sensorTypes[][5] =
  161. {
  162. {1, TYPE_DIGITAL_INPUT, 5, 0, 0}, //0
  163. {2, TYPE_DIGITAL_INPUT, 6, 1, 0},
  164. {3, TYPE_DIGITAL_INPUT, 7, 0, 0},
  165. {4, TYPE_DIGITAL_INPUT, 8, 0, 0},
  166. {9, TYPE_ANALOG_INPUT, 1, 0, 0},
  167. {10, TYPE_ANALOG_INPUT, 2, 0, 0}, //5
  168. {11, TYPE_ANALOG_INPUT, 3, 0, 0},
  169. // {19, TYPE_ANALOG_INPUT, 4, 0, 0}, //possibly collision
  170. {21, TYPE_SIGNAL_STRENGTH, 3, 0, 0},
  171. {24, TYPE_SPEED, 2, 0, 0},
  172. {66, TYPE_VOLTAGE, 11, 0, 0}, //10
  173. {67, TYPE_VOLTAGE, 10, 0, 0},
  174. {68, TYPE_CURRENT, 2, 0, 0},
  175. {69, TYPE_SIGNAL_STRENGTH, 4, 0, 0},
  176. {70, TYPE_THERMOMETER, 11, 0, 0},
  177. {72, TYPE_THERMOMETER, 12, 0, 0}, //15
  178. {73, TYPE_THERMOMETER, 13, 0, 0},
  179. {74, TYPE_THERMOMETER, 14, 0, 0},
  180. {79, TYPE_ACCELERATION, 2, 0, 0},
  181. {80, TYPE_SPEED, 3, 0, 0},
  182. {81, TYPE_CRUISE, 1, 0, 0}, //20
  183. {82, TYPE_CRUISE, 2, 0, 0},
  184. {83, TYPE_CRUISE, 3, 0, 0},
  185. {84, TYPE_ENGINE, 1, 0, 0},
  186. {85, TYPE_ENGINE, 2, 0, 0},
  187. // {86, TYPE_ENGINE, 3, 0, 0},//todo: possibly collision
  188. // {86, TYPE_HUMIDITY, 20, 0, 0},
  189. {87, TYPE_LEVEL, 4, 0, 0}, //25
  190. {88, TYPE_FREQUENCY, 1, 0, 0},
  191. // {104, TYPE_TIME, 1, 0, 0},//todo: possibly collision
  192. {127, TYPE_TEMP, 20, 0, 0},
  193. {128, TYPE_TEMP, 21, 0, 0},
  194. {135, TYPE_FLOW, 6, 0, 0},
  195. {136, TYPE_FLOW, 7, 0, 0}, //30
  196. {207, TYPE_ID, 1, 0, 0},
  197. {249, TYPE_SIGNAL_STRENGTH, 5, 0, 0},
  198. {25, TYPE_TEMP, 58, 0, 1},
  199. {86, TYPE_HUMIDITY, 20, 0, 1},
  200. {331, TYPE_DIGITAL_INPUT, 19, 1, 1}, //BTSMP1 magnetic //35
  201. // {239, TYPE_DIGITAL_INPUT, 20, 1, 0}, //Fm4 ignition
  202. {239, TYPE_DIGITAL_INPUT, 4, 1, 0}, //Fm4 ignition mapped on General ignition (senslog hardcoded)
  203. {240, TYPE_DIGITAL_INPUT, 21, 1, 0}, //Fm4 movement
  204. {26, TYPE_TEMP, 58, 0, 2},
  205. {104, TYPE_HUMIDITY, 20, 0, 2},
  206. {332, TYPE_DIGITAL_INPUT, 19, 1, 2}, //BTSMP1 magnetic
  207. {113, 56, 4, 0, 0}, //battery level
  208. {205, 43, 10, 0, 0}, //cell id
  209. {17, 39, 3, 0, 0}, //x axis
  210. {18, 39, 4, 0, 0}, //y axis
  211. {19, 39, 5, 0, 0}, //z axis
  212. {0, 0, 0, 0, 0}
  213. };
  214. */
  215. uint16_t sensorTypes[][5] =
  216. {
  217. // {1, TYPE_DIGITAL_INPUT, 5, 0, 0}, //0
  218. {2, TYPE_DIGITAL_INPUT, 6, 1, 0},
  219. {3, TYPE_DIGITAL_INPUT, 7, 0, 0},
  220. {4, TYPE_DIGITAL_INPUT, 8, 0, 0},
  221. {9, TYPE_ANALOG_INPUT, 1, 0, 0},
  222. {10, TYPE_ANALOG_INPUT, 2, 0, 0}, //5
  223. {11, TYPE_ANALOG_INPUT, 3, 0, 0},
  224. // {19, TYPE_ANALOG_INPUT, 4, 0, 0}, //possibly collision
  225. // {21, TYPE_SIGNAL_STRENGTH, 3, 0, 0},
  226. {24, TYPE_SPEED, 2, 0, 0},
  227. {66, TYPE_VOLTAGE, 11, 0, 0}, //10
  228. {67, TYPE_VOLTAGE, 10, 0, 0},
  229. // {68, TYPE_CURRENT, 2, 0, 0},
  230. // {69, TYPE_SIGNAL_STRENGTH, 4, 0, 0},
  231. {70, TYPE_THERMOMETER, 11, 0, 0},
  232. {72, TYPE_THERMOMETER, 12, 0, 0}, //15
  233. {73, TYPE_THERMOMETER, 13, 0, 0},
  234. {74, TYPE_THERMOMETER, 14, 0, 0},
  235. {79, TYPE_ACCELERATION, 2, 0, 0},
  236. {80, TYPE_SPEED, 3, 0, 0},
  237. {81, TYPE_CRUISE, 1, 0, 0}, //20
  238. {82, TYPE_CRUISE, 2, 0, 0},
  239. {83, TYPE_CRUISE, 3, 0, 0},
  240. {84, TYPE_ENGINE, 1, 0, 0},
  241. {85, TYPE_ENGINE, 2, 0, 0},
  242. // {86, TYPE_ENGINE, 3, 0, 0},//todo: possibly collision //25
  243. // {86, TYPE_HUMIDITY, 20, 0, 0},
  244. // {87, TYPE_LEVEL, 4, 0, 0},
  245. {88, TYPE_FREQUENCY, 1, 0, 0},
  246. // {104, TYPE_TIME, 1, 0, 0},//todo: possibly collision
  247. {127, TYPE_TEMP, 20, 0, 0}, //30
  248. {128, TYPE_TEMP, 21, 0, 0},
  249. {135, TYPE_FLOW, 6, 0, 0},
  250. {136, TYPE_FLOW, 7, 0, 0},
  251. {207, TYPE_ID, 1, 0, 0},
  252. // {249, TYPE_SIGNAL_STRENGTH, 5, 0, 0}, //35
  253. {25, TYPE_TEMP, 58, 0, 1},
  254. {86, TYPE_HUMIDITY, 20, 0, 1},
  255. // {331, TYPE_DIGITAL_INPUT, 19, 1, 1}, //BTSMP1 magnetic
  256. // {239, TYPE_DIGITAL_INPUT, 20, 1, 0}, //Fm4 ignition
  257. {239, TYPE_DIGITAL_INPUT, 4, 1, 0}, //Fm4 ignition mapped on General ignition (senslog hardcoded) //40
  258. {240, TYPE_DIGITAL_INPUT, 21, 1, 0}, //Fm4 movement
  259. {26, TYPE_TEMP, 58, 0, 2},
  260. {104, TYPE_HUMIDITY, 20, 0, 2},
  261. // {332, TYPE_DIGITAL_INPUT, 19, 1, 2}, //BTSMP1 magnetic
  262. {113, 56, 4, 0, 0}, //battery level //45
  263. // {205, 43, 10, 0, 0}, //cell id
  264. // {17, 39, 3, 0, 0}, //x axis
  265. // {18, 39, 4, 0, 0}, //y axis
  266. // {19, 39, 5, 0, 0}, //z axis
  267. {148, 90, 1, 0, 0}, //50
  268. {78, 68, 4, 0, 0}, // IButton
  269. {149, 68, 5, 0, 0}, // IButton Teltonika Terminal
  270. {548, 68, 6, 0, 0}, // BLE EYE Beacon
  271. {549, 38, 11, 0, 0}, // BLE EYE Beacon rssi, possibly not coliding
  272. {0, 0, 0, 0, 0} //55
  273. };
  274. double sensorMulti[] =
  275. {
  276. // 1.0,//0
  277. 1.0,
  278. 1.0,
  279. 1.0,
  280. 1.0,
  281. 1.0,//5
  282. 1.0,
  283. //
  284. // 1.0,
  285. 1.0,
  286. 0.001, //10
  287. 0.001,
  288. // 0.001,
  289. // 1.0,
  290. 0.1,
  291. 0.1, //15
  292. 0.1,
  293. 0.1,
  294. 1.0,
  295. 1.0,
  296. 1.0, //20
  297. 1.0,
  298. 1.0,
  299. 1.0,
  300. 1.0,
  301. // //25
  302. //
  303. // 1.0,
  304. 1.0,
  305. //
  306. 1.0, //30
  307. 1.0,
  308. 1.0,
  309. 1.0,
  310. 1.0,
  311. // 1.0, //35
  312. 0.01,
  313. 1.0,
  314. // 1.0,
  315. //
  316. 1.0, //40
  317. 1.0,
  318. 0.01,
  319. 1.0,
  320. // 1.0,
  321. 1.0, //45
  322. // 1.0,
  323. // 1.0,
  324. // 1.0,
  325. // 1.0
  326. 1.0, //50
  327. 1.0,
  328. 1.0,
  329. 1.0,
  330. 1.0
  331. };
  332. int getSensorType(uint16_t sensor)
  333. {
  334. int i;
  335. i = 0;
  336. while (sensorTypes[i][0] != 0)
  337. {
  338. if (sensorTypes[i][0] == sensor)
  339. return i;
  340. i++;
  341. }
  342. return -1;
  343. }
  344. void valuesCopyVal(double value, uint16_t sensor, time_t t, uint8_t type, double * values)
  345. {
  346. int sensor_index;
  347. sensor_index = getSensorType(sensor);
  348. if (sensor_index < 0)
  349. {
  350. feederLog(LOG_DEBUG, "fm4: Sensor fm4 type %d unknowen\n", sensor);
  351. return;
  352. }
  353. values[values_len] = value * sensorMulti[sensor_index];
  354. values_sensor[values_len] = sensorTypes[sensor_index][2] * 10000 + sensorTypes[sensor_index][1] * 10000000;
  355. values_sensor[values_len] += sensorTypes[sensor_index][4];
  356. values_time = t;
  357. if ((type == VALUES_TYPE_ALERT) && (sensorTypes[sensor_index][3] == 1))
  358. values_type[values_len] = VALUES_TYPE_ALERT;
  359. else
  360. values_type[values_len] = VALUES_TYPE_OBS;
  361. feederLog(LOG_DEBUG, "fm4: Observation type %s, index %d\n", (values_type[values_len] == VALUES_TYPE_ALERT) ? "alert" : "obs", sensor_index);
  362. values_len++;
  363. }
  364. void valuesSpecCareRfid(uint64_t val, uint8_t sensor, time_t t, uint8_t type, double * values)
  365. {
  366. char str[9], c;
  367. int i, j;
  368. int in;
  369. uint8_t rfid[8];
  370. uint32_t id;
  371. uint8_t rssi;
  372. if (val == 0)
  373. {
  374. feederLog(LOG_DEBUG, "fm4: RFID zero value\n");
  375. return;
  376. }
  377. in = 0;
  378. str[0] = 0;
  379. for (i = 0, j = 0; i < 8; i++)
  380. {
  381. c = (uint8_t)(val >> (8 * i));
  382. if (in)
  383. {
  384. if (c == ']')
  385. {
  386. in = 0;
  387. str[j++] = 0;
  388. }
  389. else
  390. {
  391. rfid[j++] = c;
  392. }
  393. }
  394. if (c == '[')
  395. in = 1;
  396. }
  397. // rfid = atol(str);
  398. (void)str; //otherwise compilator complains
  399. if (j < 5)
  400. {
  401. feederLog(LOG_DEBUG, "fm4: RFID no tag detected\n");
  402. return;
  403. }
  404. id = (uint32_t)rfid[3] | ((uint32_t)rfid[2] << 8) | ((uint32_t)rfid[1] << 16);
  405. rssi = rfid[0];
  406. feederLog(LOG_DEBUG, "fm4: RFID %#06X, rssi %#02X\n", id, rssi);
  407. valuesCopyVal((double)id, sensor, t, type, values);
  408. valuesCopyVal((double)rssi, 249, t, type, values);
  409. }
  410. void valuesSpecCareiButton(uint64_t val, uint8_t sensor, time_t t, uint8_t type, double * values)
  411. {
  412. uint32_t id;
  413. id = (val >> 8) & 0xFFFFFF;
  414. feederLog(LOG_DEBUG, "fm4: iButton %ld\n", id);
  415. valuesCopyVal((double)id, sensor, t, type, values);
  416. }
  417. void valuesSpecCareBleFlags(uint8_t val, uint16_t sensor, time_t t, uint8_t type, double * values)
  418. {
  419. uint8_t magnetic;
  420. magnetic = (val >> 3) & 0x01;
  421. feederLog(LOG_DEBUG, "fm4: Ble %d magnetic %d\n", 1, magnetic);
  422. valuesCopyVal((double)magnetic, sensor, t, type, values);
  423. }
  424. void valuesSpecCareBLEAdvetismentData(uint8_t * val, uint16_t len, uint16_t sensor, time_t t, uint8_t type, double * values)
  425. {
  426. char buffer[256];
  427. uint16_t i;
  428. (void)sensor;
  429. (void)t;
  430. (void)type;
  431. (void)values;
  432. feederLog(LOG_DEBUG, "fm4: Ble advertisment data len %d\n", len);
  433. for (i = 1; i < len; i += 18)
  434. {
  435. fm4LogHex(buffer, val + i + 1, 16);
  436. feederLog(LOG_DEBUG, "fm4: Ble advertisment data %s\n", buffer);
  437. }
  438. }
  439. void valuesSpecCareBLEAdvetismentDataAdvanced(uint8_t * val, uint16_t len, uint16_t sensor, time_t t, uint8_t type, double * values)
  440. {
  441. char buffer[256];
  442. uint16_t i, j, p, par_len;
  443. int8_t rssi, rssi_max;
  444. uint64_t val_int;
  445. (void)len;
  446. feederLog(LOG_DEBUG, "fm4: Ble advertisment advanced beacon count %d\n", val[0]);
  447. p = 1;
  448. rssi_max = -127;
  449. val_int = 0;
  450. for (i = 0; i < val[0]; i++)
  451. {
  452. rssi = (int8_t)val[p];
  453. p += 1;
  454. par_len = val[p];
  455. p += 1;
  456. fm4LogHex(buffer, val + p, par_len);
  457. feederLog(LOG_DEBUG, "fm4: Ble advertisment advanced rssi %d id %s\n", rssi, buffer);
  458. if (rssi > rssi_max)
  459. {
  460. rssi_max = rssi;
  461. val_int = 0;
  462. for (j = 0; j < par_len; j++)
  463. {
  464. if (j > 0)
  465. val_int <<= 8;
  466. val_int |= (uint64_t)(val[p + j]);
  467. feederLog(LOG_DEBUG, "fm4: %llX\n", val_int);
  468. }
  469. }
  470. p += par_len;
  471. par_len = val[p];
  472. p += 1;
  473. p += par_len;
  474. }
  475. if (val[0] > 0)
  476. {
  477. feederLog(LOG_DEBUG, "fm4: %lf\n", (double)val_int);
  478. valuesCopyVal((double)val_int, sensor, t, type, values);
  479. valuesCopyVal((double)rssi_max, 549, t, type, values);
  480. }
  481. }
  482. #define CODEC_NONE 0
  483. #define CODEC_CODEC8 0x08
  484. #define CODEC_CODEC8EX 0x8E
  485. #define CODEC_CODEC16 0x10
  486. #define CODEC_CODEC12 0x0C
  487. int stateMachine(unsigned char c)
  488. {
  489. static uint8_t temp[2048];//todo: prechacani pri codecu12 (umi poslat hodne najednou)
  490. static uint32_t count = 0;
  491. static uint16_t qua = 0, c_qua = 0;
  492. static uint8_t no_of_recs = 0, current_rec = 0;
  493. static uint16_t val_byte_id;
  494. static uint64_t val_byte_val;
  495. static uint8_t codec = CODEC_NONE;
  496. static float lat, lon, alt;
  497. static uint8_t prio;
  498. static time_t t_t;
  499. static struct tm t;
  500. static uint32_t * counts = counts_codec8;
  501. int ret;
  502. ret = 0;
  503. /*
  504. if (state != STATE_IDLE)
  505. // printf("0x%x %d|", c, state);
  506. feederLog(LOG_DEBUG, "fm4: |0x%x %d|\n", c, state);
  507. */
  508. temp[count] = c;
  509. count++;
  510. if (count < counts[state])
  511. return 0;
  512. count = 0;
  513. switch (state)
  514. {
  515. case STATE_IDLE:
  516. if (*((uint32_t *)temp) == 0x00000000)
  517. state = STATE_DATA_LENGTH;
  518. break;
  519. case STATE_DATA_LENGTH:
  520. feederLog(LOG_DEBUG, "fm4: Data size: %d\n", byteSwap32(*((uint32_t *)temp)));
  521. state = STATE_CODEC_ID;
  522. break;
  523. case STATE_CODEC_ID:
  524. codec = temp[0];
  525. if (codec == CODEC_CODEC8)
  526. {
  527. feederLog(LOG_DEBUG, "fm4: Codec 8 detected\n");
  528. counts = counts_codec8;
  529. state = STATE_NO_OF_REC;
  530. }
  531. else if (codec == CODEC_CODEC8EX)
  532. {
  533. feederLog(LOG_DEBUG, "fm4: Codec 8 extended detected\n");
  534. counts = counts_codec8ex;
  535. state = STATE_NO_OF_REC;
  536. }
  537. else if (codec == CODEC_CODEC12)
  538. {
  539. feederLog(LOG_DEBUG, "fm4: Codec 12 detected\n");
  540. counts = counts_codec12;
  541. state = STATE_NO_OF_REC;
  542. }
  543. else
  544. {
  545. feederLog(LOG_DEBUG, "fm4: Bad codec, going to idle state\n");
  546. state = STATE_IDLE;
  547. ret = 1;
  548. }
  549. break;
  550. case STATE_NO_OF_REC:
  551. no_of_recs = temp[0];
  552. current_rec = 0;
  553. feederLog(LOG_DEBUG, "fm4: Number of records: %d\n", no_of_recs);
  554. if (codec == CODEC_CODEC12)
  555. state = STATE_TYPE;
  556. else
  557. state = STATE_TIMESTAMP;
  558. break;
  559. case STATE_TIMESTAMP:
  560. /* if (current_rec > 0)
  561. {
  562. if ((lat != 0.0) && (lon != 0.0))
  563. {
  564. }
  565. }*/
  566. lat = lon = alt = 0.0;
  567. prio = PRIO_LOW;
  568. t_t = 0;
  569. gmtime_r(&t_t, &t);
  570. t_t = (byteSwap64(*((uint64_t *)temp))) / 1000; //in ms
  571. // gmtime_r(&t_t, &t);
  572. localtime_r(&t_t, &t);//todo: save time in local zone of server, is this good?
  573. t_t = mktime(&t) - timezone;
  574. feederLog(LOG_DEBUG, "fm4: Time of rec: %04d-%02d-%02d %02d:%02d:%02d\n",
  575. t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec);
  576. /*
  577. if (t_t == aunit->t_t) //ignore packet with same timestamp as (omit ms) as packet before
  578. {
  579. state = STATE_IDLE;
  580. feederLog(LOG_DEBUG, "fm4: Packet with duplicate time (ignoring ms), omitting");
  581. current_rec++;
  582. break;
  583. }*/
  584. aunit->t_t = t_t;
  585. feederLog(LOG_DEBUG, "fm4: Processing record: %d\n", current_rec);
  586. current_rec++;
  587. state = STATE_PRIORITY;
  588. break;
  589. case STATE_PRIORITY:
  590. prio = temp[0] & 0x03;
  591. feederLog(LOG_DEBUG, "fm4: Priority: %d\n", prio);
  592. state = STATE_LON;
  593. break;
  594. case STATE_LON:
  595. lon = (float)(int32_t)(byteSwap32(*(uint32_t *)temp)) / 10000000.0;
  596. feederLog(LOG_DEBUG, "fm4: lon: %f\n", lon);
  597. state = STATE_LAT;
  598. break;
  599. case STATE_LAT:
  600. lat = (float)(int32_t)(byteSwap32(*(uint32_t *)temp)) / 10000000.0;
  601. feederLog(LOG_DEBUG, "fm4: lat: %f\n", lat);
  602. state = STATE_ALT;
  603. break;
  604. case STATE_ALT:
  605. alt = (float)(byteSwap16(*(uint16_t *)temp));
  606. feederLog(LOG_DEBUG, "fm4: alt: %f\n", alt);
  607. state = STATE_ANGLE;
  608. break;
  609. case STATE_ANGLE:
  610. feederLog(LOG_DEBUG, "fm4: angle: %f\n", (float)(byteSwap16(*(uint16_t *)temp)));
  611. state = STATE_SATTS;
  612. break;
  613. case STATE_SATTS:
  614. feederLog(LOG_DEBUG, "fm4: sattelites: %d\n", temp[0]);
  615. state = STATE_SPEED;
  616. break;
  617. case STATE_SPEED:
  618. feederLog(LOG_DEBUG, "fm4: speed: %f\n", (float)(byteSwap16(*(uint16_t *)temp)));
  619. valuesCopyPos(lat, lon, alt, t_t, VALUES_TYPE_POS, values_out);
  620. ret = 2;
  621. state = STATE_EVENT_IO_ID;
  622. break;
  623. case STATE_EVENT_IO_ID:
  624. //feederLog(LOG_DEBUG, "fm4: event io id: %d\n", temp[0]);
  625. state = STATE_TOTAL_IO;
  626. break;
  627. case STATE_TOTAL_IO:
  628. //feederLog(LOG_DEBUG, "fm4: total io: %d\n", temp[0]);
  629. values_len = 0;
  630. state = STATE_BYTE1_IO;
  631. break;
  632. case STATE_BYTE1_IO:
  633. if ((codec == CODEC_CODEC8) || (codec == CODEC_CODEC12))
  634. qua = temp[0];
  635. else
  636. qua = (uint16_t)(byteSwap16(*(uint16_t *)temp));
  637. c_qua = 0;
  638. feederLog(LOG_DEBUG, "fm4: byte1 io: %d\n", qua);
  639. if (qua == 0)
  640. state = STATE_BYTE2_IO;
  641. else
  642. state = STATE_BYTE1_ID;
  643. break;
  644. case STATE_BYTE1_ID:
  645. if ((codec == CODEC_CODEC8) || (codec == CODEC_CODEC12))
  646. val_byte_id = temp[0];
  647. else
  648. val_byte_id = (uint16_t)(byteSwap16(*(uint16_t *)temp));
  649. feederLog(LOG_DEBUG, "fm4: byte1 id: %d\n", val_byte_id);
  650. state = STATE_BYTE1_VAL;
  651. break;
  652. case STATE_BYTE1_VAL:
  653. feederLog(LOG_DEBUG, "fm4: byte1 val: %d\n", temp[0]);
  654. val_byte_val = temp[0];
  655. if (prio == 0)
  656. valuesCopyVal((double)val_byte_val, val_byte_id, t_t, VALUES_TYPE_OBS, values_out);
  657. else
  658. valuesCopyVal((double)val_byte_val, val_byte_id, t_t, VALUES_TYPE_ALERT, values_out);
  659. c_qua++;
  660. if (qua == c_qua)
  661. state = STATE_BYTE2_IO;
  662. else
  663. state = STATE_BYTE1_ID;
  664. break;
  665. case STATE_BYTE2_IO:
  666. if ((codec == CODEC_CODEC8) || (codec == CODEC_CODEC12))
  667. qua = temp[0];
  668. else
  669. qua = (uint16_t)(byteSwap16(*(uint16_t *)temp));
  670. c_qua = 0;
  671. feederLog(LOG_DEBUG, "fm4: byte2 io: %d\n", qua);
  672. if (qua == 0)
  673. state = STATE_BYTE4_IO;
  674. else
  675. state = STATE_BYTE2_ID;
  676. break;
  677. case STATE_BYTE2_ID:
  678. if ((codec == CODEC_CODEC8) || (codec == CODEC_CODEC12))
  679. val_byte_id = temp[0];
  680. else
  681. val_byte_id = (uint16_t)(byteSwap16(*(uint16_t *)temp));
  682. feederLog(LOG_DEBUG, "fm4: byte2 id: %d\n", val_byte_id);
  683. state = STATE_BYTE2_VAL;
  684. break;
  685. case STATE_BYTE2_VAL:
  686. feederLog(LOG_DEBUG, "fm4: byte2 val: %lld\n", (byteSwap16(*(uint16_t *)temp)));
  687. val_byte_val = (byteSwap16(*(uint16_t *)temp));
  688. if (prio == 0)
  689. valuesCopyVal((double)val_byte_val, val_byte_id, t_t, VALUES_TYPE_OBS, values_out);
  690. else
  691. valuesCopyVal((double)val_byte_val, val_byte_id, t_t, VALUES_TYPE_ALERT, values_out);
  692. c_qua++;
  693. if (qua == c_qua)
  694. state = STATE_BYTE4_IO;
  695. else
  696. state = STATE_BYTE2_ID;
  697. break;
  698. case STATE_BYTE4_IO:
  699. if ((codec == CODEC_CODEC8) || (codec == CODEC_CODEC12))
  700. qua = temp[0];
  701. else
  702. qua = (uint16_t)(byteSwap16(*(uint16_t *)temp));
  703. c_qua = 0;
  704. feederLog(LOG_DEBUG, "fm4: byte4 io: %d\n", qua);
  705. if (qua == 0)
  706. state = STATE_BYTE8_IO;
  707. else
  708. state = STATE_BYTE4_ID;
  709. break;
  710. case STATE_BYTE4_ID:
  711. if ((codec == CODEC_CODEC8) || (codec == CODEC_CODEC12))
  712. val_byte_id = temp[0];
  713. else
  714. val_byte_id = (uint16_t)(byteSwap16(*(uint16_t *)temp));
  715. feederLog(LOG_DEBUG, "fm4: byte4 id: %d\n", val_byte_id);
  716. state = STATE_BYTE4_VAL;
  717. break;
  718. case STATE_BYTE4_VAL:
  719. feederLog(LOG_DEBUG, "fm4: byte4 val: %d\n", (byteSwap32(*(uint32_t *)temp)));
  720. val_byte_val = (byteSwap32(*(uint32_t *)temp));
  721. if (prio == 0)
  722. valuesCopyVal((double)val_byte_val, val_byte_id, t_t, VALUES_TYPE_OBS, values_out);
  723. else
  724. valuesCopyVal((double)val_byte_val, val_byte_id, t_t, VALUES_TYPE_ALERT, values_out);
  725. c_qua++;
  726. if (qua == c_qua)
  727. state = STATE_BYTE8_IO;
  728. else
  729. state = STATE_BYTE4_ID;
  730. break;
  731. case STATE_BYTE8_IO:
  732. if ((codec == CODEC_CODEC8) || (codec == CODEC_CODEC12))
  733. qua = temp[0];
  734. else
  735. qua = (uint16_t)(byteSwap16(*(uint16_t *)temp));
  736. c_qua = 0;
  737. feederLog(LOG_DEBUG, "fm4: byte8 io: %ld\n", qua);
  738. if (qua == 0)
  739. {
  740. if (codec == CODEC_CODEC8)
  741. {
  742. if (current_rec == no_of_recs)
  743. state = STATE_NO_OF_REC_END;
  744. else
  745. state = STATE_TIMESTAMP;
  746. ret = 2;
  747. }
  748. else if (codec == CODEC_CODEC12)
  749. {
  750. state = STATE_NO_OF_REC_END;
  751. ret = 2;
  752. }
  753. else
  754. state = STATE_BYTEX_IO;
  755. }
  756. else
  757. state = STATE_BYTE8_ID;
  758. break;
  759. case STATE_BYTE8_ID:
  760. if ((codec == CODEC_CODEC8) || (codec == CODEC_CODEC12))
  761. val_byte_id = temp[0];
  762. else
  763. val_byte_id = (uint16_t)(byteSwap16(*(uint16_t *)temp));
  764. feederLog(LOG_DEBUG, "fm4: byte8 id: %d\n", val_byte_id);
  765. state = STATE_BYTE8_VAL;
  766. break;
  767. case STATE_BYTE8_VAL:
  768. feederLog(LOG_DEBUG, "fm4: byte8 val: %lld\n", (byteSwap64(*(uint64_t *)temp)));
  769. val_byte_val = (byteSwap64(*(uint64_t *)temp));
  770. if (val_byte_id == 207) //rfid value
  771. valuesSpecCareRfid(val_byte_val, val_byte_id, t_t, VALUES_TYPE_OBS, values_out);
  772. else if ((val_byte_id == 78) || (val_byte_id == 149))
  773. valuesSpecCareiButton(val_byte_val, val_byte_id, t_t, VALUES_TYPE_OBS, values_out);
  774. else
  775. valuesCopyVal((double)val_byte_val, val_byte_id, t_t, VALUES_TYPE_OBS, values_out);
  776. c_qua++;
  777. if (qua == c_qua)
  778. {
  779. if (codec == CODEC_CODEC8)
  780. {
  781. if (current_rec == no_of_recs)
  782. state = STATE_NO_OF_REC_END;
  783. else
  784. state = STATE_TIMESTAMP;
  785. ret = 2;
  786. }
  787. else if (codec == CODEC_CODEC12)
  788. {
  789. state = STATE_NO_OF_REC_END;
  790. ret = 2;
  791. }
  792. else
  793. state = STATE_BYTEX_IO;
  794. }
  795. else
  796. state = STATE_BYTE8_ID;
  797. break;
  798. case STATE_BYTEX_IO:
  799. qua = (uint16_t)(byteSwap16(*(uint16_t *)temp));
  800. c_qua = 0;
  801. feederLog(LOG_DEBUG, "fm4: bytex io: %ld\n", qua);
  802. if (qua == 0)
  803. {
  804. if (current_rec == no_of_recs)
  805. state = STATE_NO_OF_REC_END;
  806. else
  807. state = STATE_TIMESTAMP;
  808. ret = 2;
  809. }
  810. else
  811. state = STATE_BYTEX_ID;
  812. break;
  813. case STATE_BYTEX_ID:
  814. val_byte_id = (uint16_t)(byteSwap16(*(uint16_t *)temp));
  815. feederLog(LOG_DEBUG, "fm4: bytex id: %d\n", val_byte_id);
  816. state = STATE_BYTEX_LEN;
  817. break;
  818. case STATE_BYTEX_LEN:
  819. counts[STATE_BYTEX_VAL] = (uint16_t)(byteSwap16(*(uint16_t *)temp));
  820. feederLog(LOG_DEBUG, "fm4: bytex len: %d\n", counts[STATE_BYTEX_VAL]);
  821. state = STATE_BYTEX_VAL;
  822. if (counts[STATE_BYTEX_VAL] > 0)
  823. break;
  824. case STATE_BYTEX_VAL:
  825. //feederLog(LOG_DEBUG, "fm4: bytex val: %lld\n", (byteSwap64(*(uint64_t *)temp)));
  826. //val_byte_val = (byteSwap64(*(uint64_t *)temp));
  827. //valuesCopyVal((double)val_byte_val, val_byte_id, t_t, VALUES_TYPE_OBS, values_out);
  828. //todo: special care
  829. if ((val_byte_id == 331) || (val_byte_id == 332) || (val_byte_id == 333) || (val_byte_id == 334)) //BLE 1 Custom #1
  830. {
  831. valuesSpecCareBleFlags(temp[0], val_byte_id, t_t, VALUES_TYPE_OBS, values_out);
  832. }
  833. else if (val_byte_id == 10500)
  834. {
  835. valuesSpecCareBLEAdvetismentData(temp, counts[STATE_BYTEX_VAL], val_byte_id, t_t, VALUES_TYPE_OBS, values_out);
  836. }
  837. else if (val_byte_id == 548)
  838. {
  839. valuesSpecCareBLEAdvetismentDataAdvanced(temp, counts[STATE_BYTEX_VAL], val_byte_id, t_t, VALUES_TYPE_OBS, values_out);
  840. }
  841. else
  842. feederLog(LOG_DEBUG, "fm4: unprocessed bytex id %d\n", val_byte_id);
  843. c_qua++;
  844. if (qua == c_qua)
  845. {
  846. if (current_rec == no_of_recs)
  847. state = STATE_NO_OF_REC_END;
  848. else
  849. state = STATE_TIMESTAMP;
  850. ret = 2;
  851. }
  852. else
  853. state = STATE_BYTEX_ID;
  854. break;
  855. case STATE_NO_OF_REC_END:
  856. no_of_recs = temp[0];
  857. feederLog(LOG_DEBUG, "fm4: Number of records: %d\n", temp[0]);
  858. state = STATE_CRC;
  859. break;
  860. case STATE_CRC:
  861. state = STATE_IDLE;
  862. feederLog(LOG_DEBUG, "fm4: Crc\n");
  863. reply_buffer[0] = 0x00;
  864. reply_buffer[1] = 0x00;
  865. reply_buffer[2] = 0x00;
  866. reply_buffer[3] = no_of_recs;
  867. reply_len = 4;
  868. ret = 1;
  869. break;
  870. case STATE_TYPE:
  871. feederLog(LOG_DEBUG, "fm4: Type %d\n", temp[0]);
  872. state = STATE_COMMAND_RESPONSE_SIZE;
  873. break;
  874. case STATE_COMMAND_RESPONSE_SIZE:
  875. counts[STATE_COMMAND_RESPONSE] = (uint32_t)(byteSwap32(*(uint32_t *)temp));
  876. feederLog(LOG_DEBUG, "fm4: Command/Response length %d\n", counts[STATE_COMMAND_RESPONSE]);
  877. //state = STATE_COMMAND_RESPONSE;
  878. state = STATE_EVENT_IO_ID;
  879. break;
  880. case STATE_COMMAND_RESPONSE:
  881. state = STATE_NO_OF_REC_END;
  882. break;
  883. }
  884. memset(temp, 0, 16);
  885. return ret;
  886. }
  887. int parse(struct unit_t * unit)
  888. {
  889. int ret, res;
  890. ret = 0;
  891. while (res = stateMachine(unit->int_buffer[unit->int_buffer_pos]), res == 0)
  892. {
  893. if (unit->int_buffer_pos + 1 >= unit->int_buffer_pos_wr)
  894. break;
  895. unit->int_buffer_pos++;
  896. }
  897. unit->int_buffer_pos++;
  898. if (res == 1)
  899. {
  900. feederLog(LOG_DEBUG, "fm4: End of data packet\n");
  901. unit->int_buffer_pos_wr = unit->int_buffer_pos = 0;
  902. // aunit->imei[0] = 0; //todo: predpokladame ze dalsi paket bude opet uvozen 17byty s IMEI
  903. }
  904. if (res == 2)
  905. {
  906. feederLog(LOG_DEBUG, "fm4: Valid data decoded\n");
  907. ret = 1;
  908. }
  909. return ret;
  910. }
  911. //----------------------------------------------------------------------------------------------
  912. struct unit_t * unitFind(int fd)
  913. {
  914. struct unit_t * unit;
  915. unit = units;
  916. while (unit != NULL)
  917. {
  918. if (unit->fd == fd)
  919. {
  920. return unit;
  921. }
  922. unit = unit->next;
  923. }
  924. return NULL;
  925. }
  926. struct unit_t * unitCreate(int fd)
  927. {
  928. struct unit_t * unit, * unit_new;
  929. unit_new = malloc(sizeof(struct unit_t));
  930. if (unit_new == NULL)
  931. return NULL;
  932. unit_new->fd = fd;
  933. unit_new->imei[0] = 0;
  934. unit_new->next = NULL;
  935. unit_new->int_buffer = malloc(FM4_BUFFER_SIZE);
  936. if (unit_new->int_buffer == NULL)
  937. {
  938. free(unit_new);
  939. return NULL;
  940. }
  941. unit_new->int_buffer_pos = 0;
  942. unit_new->int_buffer_pos_wr = 0;
  943. if (units == NULL)
  944. units = unit_new;
  945. else
  946. {
  947. unit = units;
  948. while (unit->next != NULL)
  949. {
  950. unit = unit->next;
  951. }
  952. unit->next = unit_new;
  953. }
  954. return unit_new;
  955. }
  956. int imei(struct unit_t * unit, unsigned char * data)
  957. {
  958. struct avl_header_t * avl_header;
  959. char imei_str[16];
  960. avl_header = (struct avl_header_t *)data;
  961. memcpy(imei_str, avl_header->imei, 15);
  962. imei_str[15] = 0;
  963. feederLog(LOG_DEBUG, "fm4: Imei is %s\n", imei_str);
  964. strcpy(unit->imei, imei_str);
  965. return 1;
  966. }
  967. int init(void * param)
  968. {
  969. param = param;
  970. bzero(reply_buffer, 32);
  971. reply_len = 0;
  972. units = aunit = NULL;
  973. return 0;
  974. }
  975. void fm4LogHex(char * buffer, unsigned char * data, unsigned int length)
  976. {
  977. unsigned int i;
  978. buffer[0] = 0;
  979. for (i = 0; i < length; i++)
  980. {
  981. sprintf(buffer + strlen(buffer), "%02X ", data[i]);
  982. }
  983. }
  984. unsigned int
  985. process(void *lib_data, int socket, unsigned char *data,
  986. unsigned int length, unsigned long long int *id, time_t * tm,
  987. double *result_array, uint64_t * sensors, unsigned int *type)
  988. {
  989. unsigned int ret = 0;
  990. struct unit_t * unit;
  991. uint8_t i;
  992. char buffer[32768];
  993. unsigned int l;
  994. (void)lib_data;
  995. if (data != NULL)
  996. {
  997. feederLog(LOG_DEBUG, "fm4: Incoming data: len %d: \n", length);
  998. l = length;
  999. while (l > 0)
  1000. {
  1001. fm4LogHex(buffer, data + length - l, (l > 16) ? 16:l);
  1002. feederLog(LOG_DEBUG, "%s\n", buffer);
  1003. l -= (l > 16) ? 16:l;
  1004. }
  1005. }
  1006. unit = unitFind(socket);
  1007. if (unit == NULL)
  1008. {
  1009. feederLog(LOG_DEBUG, "fm4: new unit for socket %d\n", socket);
  1010. unit = unitCreate(socket); //todo: check if scucsefull
  1011. state = STATE_IDLE; ///todo: state do structury jednotky
  1012. }
  1013. else
  1014. {
  1015. feederLog(LOG_DEBUG, "fm4: data from known unit on socket %d\n", socket);
  1016. }
  1017. aunit = unit;
  1018. // if ((length != 0) && (strlen(aunit->imei) == 0))
  1019. if ((length != 0) && ((memcmp(data, "\0\0\0\0", 4) != 0) && (state == STATE_IDLE)) && (unit->int_buffer_pos_wr == 0))
  1020. {
  1021. imei(aunit, data);
  1022. feederLog(LOG_DEBUG, "fm4: imei for socket %d is %s\n", socket, unit->imei);
  1023. unit->int_buffer_pos = unit->int_buffer_pos_wr = 0;
  1024. reply_buffer[0] = 0x01;
  1025. reply_len = 1;
  1026. ret = 0;
  1027. }
  1028. else
  1029. {
  1030. if (length != 0)
  1031. {
  1032. feederLog(LOG_DEBUG, "fm4: Copying data for unit, imei %s\n", unit->imei);
  1033. if (unit->int_buffer_pos_wr + length >= FM4_BUFFER_SIZE)
  1034. {
  1035. feederLog(LOG_WARNING, "fm4: Buffer full, reseting, imei %s\n", unit->imei);
  1036. unit->int_buffer_pos = unit->int_buffer_pos_wr = 0;
  1037. }
  1038. else
  1039. {
  1040. if ((unit->int_buffer_pos_wr != 0) || (*((uint32_t *)data) == 0x00000000))
  1041. {
  1042. memcpy(unit->int_buffer + unit->int_buffer_pos_wr, data, length);
  1043. unit->int_buffer_pos_wr += length;
  1044. feederLog(LOG_DEBUG, "fm4: Copy done, imei %s\n", unit->imei);
  1045. }
  1046. }
  1047. }
  1048. if ((unit->int_buffer_pos_wr > 0) && (*((uint32_t *)unit->int_buffer) == 0x00000000))
  1049. {
  1050. uint32_t reported_packet_size = byteSwap32(*((uint32_t *)(unit->int_buffer + 4)));
  1051. reported_packet_size += 4 + 4 + 4; /* leading zeroes + packet size + crc */
  1052. // if (unit->int_buffer_pos_wr != reported_packet_size)
  1053. if (unit->int_buffer_pos_wr < reported_packet_size)
  1054. {
  1055. feederLog(LOG_DEBUG, "fm4: Not enough packet data, waiting for more, imei %s\n", unit->imei);
  1056. }
  1057. else
  1058. {
  1059. if ((parse(unit)) || (values_len != 0))
  1060. {
  1061. *id = atol(aunit->imei);
  1062. *tm = values_time;
  1063. // printf("val type %d\n", values_type[0]);
  1064. if (values_type[0] == VALUES_TYPE_POS)
  1065. {
  1066. memcpy(result_array, values_out, sizeof(double) * 3);
  1067. *type = VALUES_TYPE_POS;
  1068. sensors[0] = sensors[1] = sensors[2] = 0x10;
  1069. ret = 3;
  1070. values_len -= 3;
  1071. }
  1072. else if (values_type[values_len - 1] == VALUES_TYPE_OBS)
  1073. {
  1074. i = 0;
  1075. while ((values_len > 0) && (values_type[values_len - 1] == VALUES_TYPE_OBS))
  1076. {
  1077. result_array[i] = values_out[values_len - 1];
  1078. sensors[i] = values_sensor[values_len - 1];
  1079. i++;
  1080. values_len--;
  1081. }
  1082. *type = VALUES_TYPE_OBS;
  1083. ret = i;
  1084. /*
  1085. memcpy(result_array, values_out, sizeof(double) * values_len);
  1086. *type = VALUES_TYPE_OBS;
  1087. memcpy(sensors, values_sensor, sizeof(uint64_t) * values_len);
  1088. ret = values_len;
  1089. */
  1090. }
  1091. else if (values_type[values_len - 1] == VALUES_TYPE_ALERT)
  1092. {
  1093. i = 0;
  1094. while ((values_len > 0) && (values_type[values_len - 1] == VALUES_TYPE_ALERT))
  1095. {
  1096. result_array[i] = values_out[values_len - 1];
  1097. sensors[i] = values_sensor[values_len - 1];
  1098. i++;
  1099. values_len--;
  1100. }
  1101. *type = VALUES_TYPE_ALERT;
  1102. ret = i;
  1103. /* memcpy(result_array, values_out, sizeof(double) * values_len);
  1104. *type = VALUES_TYPE_ALERT;
  1105. memcpy(sensors, values_sensor, sizeof(uint64_t) * values_len);
  1106. ret = values_len;*/
  1107. }
  1108. }
  1109. }
  1110. }
  1111. }
  1112. return ret;
  1113. }
  1114. int reply(void *lib_data, int socket, unsigned char *data)
  1115. {
  1116. unsigned int temp_reply_len;
  1117. (void)lib_data;
  1118. (void)socket;
  1119. feederLog(LOG_DEBUG, "fm4: replying\n");
  1120. memcpy(data, reply_buffer, reply_len);
  1121. temp_reply_len = reply_len;
  1122. reply_len = 0;
  1123. return temp_reply_len;
  1124. }
  1125. int open(void *lib_data, int socket)
  1126. {
  1127. (void)lib_data;
  1128. (void)socket;
  1129. feederLog(LOG_DEBUG, "fm4: socket %d opened\n", socket);
  1130. return 0;
  1131. }
  1132. int close(void *lib_data, int socket)
  1133. {
  1134. struct unit_t * unit;
  1135. (void)lib_data;
  1136. (void)socket;
  1137. feederLog(LOG_DEBUG, "fm4: socket %d closed\n", socket);
  1138. unit = unitFind(socket);
  1139. if (unit != NULL)
  1140. {
  1141. // free(unit->int_buffer);
  1142. unit->imei[0] = 0; //todo: nebo mozna lepe, zrusit celou jednotku - coz bacha na next
  1143. unit->fd = 0;
  1144. }
  1145. unit->int_buffer_pos_wr = unit->int_buffer_pos = 0;
  1146. return 0;
  1147. }