sensor.c 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include "mb.h"
  4. #include "lock.h"
  5. #include "sensor.h"
  6. #define RETRY_TIMES 3
  7. #define TIMEOUT 200
  8. typedef struct {
  9. lock_t lck;
  10. sensor_all_t all;
  11. }sensor_handle_t;
  12. static sensor_handle_t ssHandle={0};
  13. static int read_reg(uint8_t addr, uint16_t reg, uint16_t *data, int cnt)
  14. {
  15. int i,r=0;
  16. for(i=0; i<RETRY_TIMES; i++) {
  17. r = mb_read(MB_ID_SENSOR, addr, reg, data, cnt, TIMEOUT);
  18. if(r==cnt) {
  19. break;
  20. }
  21. }
  22. return (r==cnt)?0:-1;
  23. }
  24. int sensor_init(void)
  25. {
  26. sensor_handle_t *h=&ssHandle;
  27. h->lck = lock_init();
  28. return 0;
  29. }
  30. int sensor_deinit(void)
  31. {
  32. sensor_handle_t *h=&ssHandle;
  33. lock_deinit(h->lck);
  34. return 0;
  35. }
  36. int sensor_set(sensor_data_t *data)
  37. {
  38. int i,r=-1,cnt;
  39. sensor_data_t *p=NULL;
  40. sensor_handle_t *h=&ssHandle;
  41. if(!data) {
  42. return -1;
  43. }
  44. lock_on(h->lck);
  45. for(i=0; i<h->all.cnt; i++) {
  46. sensor_data_t *p=&h->all.data[i];
  47. if(memcmp(&data->info, &p->info, sizeof(sensor_info_t))==0) {
  48. r = 0;
  49. p->info = data->info;
  50. break;
  51. }
  52. }
  53. if(r==-1) {
  54. cnt = h->all.cnt+1;
  55. if(h->all.data) {
  56. p = (sensor_data_t*)realloc(h->all.data, sizeof(sensor_data_t)*cnt);
  57. }
  58. else {
  59. p = (sensor_data_t*)calloc(1, sizeof(sensor_data_t));
  60. }
  61. if(p) {
  62. p[cnt-1].info = data->info;
  63. memset(&p[cnt-1].val, 0, sizeof(p[cnt-1].val));
  64. h->all.cnt = cnt;
  65. h->all.data = p;
  66. r = 0;
  67. }
  68. }
  69. if(r==0) {
  70. //db_update
  71. }
  72. lock_off(h->lck);
  73. return r;
  74. }
  75. int sensor_remove(sensor_data_t *data)
  76. {
  77. int i,r=-1;
  78. sensor_handle_t *h=&ssHandle;
  79. if(!data) {
  80. return -1;
  81. }
  82. lock_on(h->lck);
  83. for(i=0; i<h->all.cnt; i++) {
  84. sensor_data_t *p=&h->all.data[i];
  85. if(memcmp(&data->info, &p->info, sizeof(sensor_info_t))==0) {
  86. r = 0;
  87. break;
  88. }
  89. }
  90. if(r==0) { //find and remove it
  91. if(i!=h->all.cnt-1) {
  92. memmove(&h->all.data[i], &h->all.data[i+1], sizeof(sensor_data_t)*(h->all.cnt-i-1));
  93. }
  94. h->all.cnt -= 1;
  95. }
  96. lock_off(h->lck);
  97. return r;
  98. }
  99. static int my_read(sensor_data_t *data)
  100. {
  101. int r=-1;
  102. uint16_t time=0;
  103. uint16_t tmp[10]={0};
  104. uint8_t addr=data->info.addr;
  105. sensor_handle_t *h=&ssHandle;
  106. switch(data->info.type) {
  107. case SENSOR_TYPE_TEMP_HUMI:
  108. {
  109. switch(data->info.subtype) {
  110. case SENSOR_TYPE_TEMP_HUMI_RSWSN01PVC:
  111. {
  112. r = read_reg(addr, 0, tmp, 2);
  113. if(r<0) {
  114. return -1 ;
  115. }
  116. data->val[0].value = tmp[1]/10.0f; //湿度值
  117. data->val[1].value = tmp[0]/10.0f; //湿度值
  118. }
  119. break;
  120. case SENSOR_TYPE_TEMP_HUMI_HKSHT301T1H536VRS485: //anderson
  121. {
  122. r = read_reg(addr, 0, tmp, 2);
  123. if (r < 0) {
  124. return -1;
  125. }
  126. data->val[0].value = tmp[0]/10.0f; //温度值
  127. data->val[1].value = tmp[1]/10.0f; //湿度值
  128. }
  129. break;
  130. }
  131. }
  132. break;
  133. case SENSOR_TYPE_SMOKE:
  134. case SENSOR_TYPE_WATER:
  135. case SENSOR_TYPE_ACCESS:
  136. {
  137. r = -1;//read_reg(subaddr+GPIO_PD11);
  138. if(r<0) {
  139. return -1;
  140. }
  141. data->val[0].value = r;
  142. }
  143. break;
  144. case SENSOR_TYPE_GAS:
  145. {
  146. r = read_reg(addr, 19, tmp, 1);
  147. if(r<0) {
  148. return -1 ;
  149. }
  150. data->val[0].value = tmp[0]; //气体浓度值
  151. }
  152. break;
  153. case SENSOR_TYPE_AIR_PRESS:
  154. {
  155. }
  156. break;
  157. case SENSOR_TYPE_AIR_COND:
  158. {
  159. }
  160. break;
  161. case SENSOR_TYPE_TEMP_DOUBLE:
  162. {
  163. switch(data->info.subtype) {
  164. case SENSOR_TYPE_TEMP_HUMI_RSWSN01PVC:
  165. {
  166. r = read_reg(addr, 0x0400, &tmp[0], 1);
  167. if (r < 0) {
  168. LOGE("___ sensor RSWSN01PVC 1 read failed, addr: %d\n", addr);
  169. return -1;
  170. }
  171. r = read_reg(addr, 0x0401, &tmp[1], 1);
  172. if (r < 0) {
  173. LOGE("___ sensor RSWSN01PVC 2 read failed, addr: %d\n", addr);
  174. return -1;
  175. }
  176. data->val[0].value = tmp[1]/10.0f; //解算温度值
  177. data->val[0].value = tmp[0]/10.0f; //解算湿度值
  178. }
  179. break;
  180. }
  181. }
  182. break;
  183. case SENSOR_TYPE_TEMP:
  184. {
  185. switch(data->info.subtype) {
  186. case SENSOR_TYPE_TEMP_BTG50H8EL3200:
  187. {
  188. r = read_reg(addr, 0, tmp, 1);
  189. if (r < 0) {
  190. LOGE("___ sensor BTG50H8EL3200 read failed, addr: %d\n", addr);
  191. return -1;
  192. }
  193. data->val[0].value = tmp[0]/10.0f - 50;
  194. //printf("___ BTG50H8EL3200 read: 0x%04x, temp: %0.2f\n", tmp, data->val[0]);
  195. }
  196. break;
  197. }
  198. }
  199. break;
  200. case SENSOR_TYPE_LEAK:
  201. {
  202. switch(data->info.subtype) {
  203. case SENSOR_TYPE_LEAK_XWDC01A:
  204. {
  205. r = read_reg(addr, 0, tmp, 4);
  206. if (r < 0) {
  207. LOGE("___ sensor XWDC01A read failed, addr: %d\n", data->info.addr);
  208. return -1;
  209. }
  210. //printf("___ XWDC01A read: 0x%04x, 0x%04x, 0x%04x, 0x%04x\n", tmp[0],tmp[1],tmp[2],tmp[3]);
  211. data->val[0].value = 0;
  212. if(tmp[0] || tmp[1]) {
  213. data->val[0].value = 1;
  214. }
  215. }
  216. break;
  217. }
  218. }
  219. break;
  220. }
  221. if(r==0) {
  222. data->time = mktime(localtime(NULL));
  223. }
  224. return r;
  225. }
  226. int sensor_query(void)
  227. {
  228. int i,r=-1;
  229. sensor_handle_t *h=&ssHandle;
  230. lock_on(h->lck);
  231. for(i=0; i<h->all.cnt; i++) {
  232. r = my_read(&h->all.data[i]);
  233. }
  234. lock_off(h->lck);
  235. return 0;
  236. }
  237. int sensor_data_get(sensor_all_t *all)
  238. {
  239. sensor_handle_t *h=&ssHandle;
  240. if(!all) {
  241. return -1;
  242. }
  243. lock_on(h->lck);
  244. *all = h->all;
  245. lock_off(h->lck);
  246. return 0;
  247. }
  248. int sensor_data_free(sensor_all_t *all)
  249. {
  250. if(!all) {
  251. return -1;
  252. }
  253. if(all->data) {
  254. free(all->data);
  255. all->data = NULL;
  256. }
  257. all->cnt = 0;
  258. return 0;
  259. }