senso.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>
  5. #include <syslog.h>
  6. #include <stdint.h>
  7. #include <zlib.h>
  8. #include "../../status.h"
  9. #include "../../feeder.h"
  10. static unsigned long int packet;
  11. void (* feederLog)(int priority, const char * fmt, ...);
  12. int setLog(void * func)
  13. {
  14. feederLog = func;
  15. return 0;
  16. }
  17. void zerr(int ret)
  18. {
  19. feederLog(LOG_WARNING, "decompression: ");
  20. switch (ret)
  21. {
  22. case Z_ERRNO:
  23. if (ferror(stdin))
  24. feederLog(LOG_WARNING, "error reading stdin\n");
  25. if (ferror(stdout))
  26. feederLog(LOG_WARNING, "error writing stdout\n");
  27. break;
  28. case Z_STREAM_ERROR:
  29. feederLog(LOG_WARNING, "invalid compression level\n");
  30. break;
  31. case Z_DATA_ERROR:
  32. feederLog(LOG_WARNING, "invalid or incomplete deflate data\n");
  33. break;
  34. case Z_MEM_ERROR:
  35. feederLog(LOG_WARNING, "out of memory\n");
  36. break;
  37. case Z_BUF_ERROR:
  38. feederLog(LOG_WARNING, "buffer error\n");
  39. break;
  40. case Z_VERSION_ERROR:
  41. feederLog(LOG_WARNING, "zlib version mismatch!\n");
  42. default:
  43. feederLog(LOG_WARNING, "no error\n");
  44. break;
  45. }
  46. }
  47. int init(void * param)
  48. {
  49. return 0;
  50. }
  51. unsigned long long int dataCheck(char * data, time_t *timestamp, double *value, uint64_t *sensor)
  52. {
  53. unsigned long long int id;
  54. struct tm t;
  55. char sensor_str[64];
  56. sscanf(data, "%lld,%ld,%04d-%02d-%02d %02d:%02d:%02d,%lf,%s",
  57. &id, &packet,
  58. &t.tm_year, &t.tm_mon, &t.tm_mday,
  59. &t.tm_hour, &t.tm_min, &t.tm_sec,
  60. value, sensor_str);
  61. t.tm_year -= 1900;
  62. t.tm_mon -= 1;
  63. *timestamp = mktime(&t);
  64. *sensor = atoll(sensor_str);
  65. feederLog(LOG_DEBUG, "Data from %ld, packet number %ld, sensor %s, value %f on %04d-%02d-%02d %02d:%02d:%02d\n",
  66. id, packet, sensor_str, *value,
  67. t.tm_year + 1900, t.tm_mon + 1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec);
  68. return id;
  69. }
  70. #define HEADER_SIZE 5
  71. #define DATA_SIZE 2048
  72. unsigned int
  73. process(void *lib_data, int socket, unsigned char *data,
  74. unsigned int length, unsigned long long int *id, time_t * tm,
  75. double *result_array, uint64_t * sensors, unsigned int *type)
  76. {
  77. int raw;
  78. int compressed = 0;
  79. int dres;
  80. unsigned long dlength;
  81. static char *ddata = NULL;
  82. static char *message = NULL;
  83. char *c;
  84. unsigned int ret = 0;
  85. feederLog(LOG_DEBUG, "senso: Analazing data\n");
  86. if (data != NULL)
  87. {
  88. if ((data[0] != ':') && (data[0] != ';'))
  89. raw = 1;
  90. else
  91. raw = 0;
  92. if (!raw)
  93. {
  94. switch (data[0])
  95. {
  96. case ':':compressed = 1;
  97. break;
  98. case ';':compressed = 0;
  99. break;
  100. }
  101. dlength = ((unsigned long)data[1]) << 24;
  102. dlength += ((unsigned long)data[2]) << 16;
  103. dlength += ((unsigned long)data[3]) << 8;
  104. dlength += ((unsigned long)data[4]);
  105. ddata = malloc(dlength + 1);
  106. if (ddata == NULL)
  107. {
  108. feederLog(LOG_WARNING, "senso: Can not allocate decompress buffer\n");
  109. return 0;
  110. }
  111. feederLog(LOG_DEBUG, "senso: Packet length %ld, data length %ld%s\n", length, dlength, compressed ? ", compressed" : "");
  112. length -= HEADER_SIZE;
  113. if (ddata != NULL)
  114. {
  115. if (compressed)
  116. {
  117. dres = uncompress((unsigned char *)ddata, (uLongf *)&dlength, data + HEADER_SIZE, length);
  118. }
  119. else
  120. {
  121. memcpy(ddata, data + HEADER_SIZE, length);
  122. dres = Z_OK;
  123. }
  124. if (dres == Z_OK)
  125. {
  126. ddata[dlength] = 0;
  127. feederLog(LOG_DEBUG, "senso: Data, cr: %f%% : \n%s", ((double)length / (double)dlength) * 100.0, ddata);
  128. message = ddata;
  129. }
  130. else
  131. {
  132. zerr(dres);
  133. }
  134. }
  135. }
  136. else
  137. {
  138. ddata = malloc(length + 1);
  139. if (ddata == NULL)
  140. {
  141. feederLog(LOG_WARNING, "Can not allocate data buffer\n");
  142. return 0;
  143. }
  144. memcpy(ddata, data, length);
  145. ddata[length] = 0;
  146. feederLog(LOG_DEBUG, "Data raw: %s\n", data);
  147. message = ddata;
  148. }
  149. }
  150. if (message != NULL)
  151. {
  152. c = strchr(message, '\n');
  153. *c = 0;
  154. *id = dataCheck(message, tm, &result_array[0], (unsigned long int *)&sensors[0]);
  155. message = c + 1;
  156. ret = 1;
  157. if (strlen(message) == 0)
  158. {
  159. free(ddata);
  160. message = ddata = NULL;
  161. }
  162. }
  163. *type = VALUES_TYPE_OBS;
  164. return ret;
  165. }
  166. int reply(void *lib_data, int socket, unsigned char *data)
  167. {
  168. feederLog(LOG_DEBUG, "senso: replying\n");
  169. sprintf((char *)data, "OK%ld", packet);
  170. feederLog(LOG_DEBUG, "senso: Acquiring with %s\n", data);
  171. return strlen((char *)data);
  172. }