LibDriver GP2Y1051AU0F  1.0.0
GP2Y1051AU0F full-featured driver
driver_gp2y1051au0f.c
Go to the documentation of this file.
1 
37 #include "driver_gp2y1051au0f.h"
38 
42 #define CHIP_NAME "SHARP GP2Y1051AU0F"
43 #define MANUFACTURER_NAME "SHARP"
44 #define SUPPLY_VOLTAGE_MIN 4.8f
45 #define SUPPLY_VOLTAGE_MAX 5.2f
46 #define MAX_CURRENT 20.0f
47 #define TEMPERATURE_MIN -10.0f
48 #define TEMPERATURE_MAX 65.0f
49 #define DRIVER_VERSION 1000
62 {
63  if (handle == NULL) /* check handle */
64  {
65  return 2; /* return error */
66  }
67  if (handle->debug_print == NULL) /* check debug_print */
68  {
69  return 3; /* return error */
70  }
71  if (handle->uart_init == NULL) /* check uart_init */
72  {
73  handle->debug_print("gp2y1051au0f: uart_init is null.\n"); /* uart_init is null */
74 
75  return 3; /* return error */
76  }
77  if (handle->uart_deinit == NULL) /* check uart_deinit */
78  {
79  handle->debug_print("gp2y1051au0f: uart_deinit is null.\n"); /* uart_deinit is null */
80 
81  return 3; /* return error */
82  }
83  if (handle->uart_read == NULL) /* check uart_read */
84  {
85  handle->debug_print("gp2y1051au0f: uart_read is null.\n"); /* uart_read is null */
86 
87  return 3; /* return error */
88  }
89  if (handle->uart_flush == NULL) /* check uart_flush */
90  {
91  handle->debug_print("gp2y1051au0f: uart_flush is null.\n"); /* uart_flush is null */
92 
93  return 3; /* return error */
94  }
95  if (handle->delay_ms == NULL) /* check delay_ms */
96  {
97  handle->debug_print("gp2y1051au0f: delay_ms is null.\n"); /* delay_ms is null */
98 
99  return 3; /* return error */
100  }
101 
102  if (handle->uart_init() != 0) /* uart init */
103  {
104  handle->debug_print("gp2y1051au0f: uart init failed.\n"); /* uart init failed */
105 
106  return 1; /* return error */
107  }
108  handle->inited = 1; /* flag finish initialization */
109 
110  return 0; /* success return 0 */
111 }
112 
124 {
125  if (handle == NULL) /* check handle */
126  {
127  return 2; /* return error */
128  }
129  if (handle->inited != 1) /* check handle initialization */
130  {
131  return 3; /* return error */
132  }
133 
134  if (handle->uart_deinit() != 0) /* uart deinit */
135  {
136  handle->debug_print("gp2y1051au0f: uart deinit failed.\n"); /* uart deinit failed */
137 
138  return 1; /* return error */
139  }
140  handle->inited = 0; /* flag close */
141 
142  return 0; /* success return 0 */
143 }
144 
160 uint8_t gp2y1051au0f_read(gp2y1051au0f_handle_t *handle, uint16_t *raw, float *mg_m3)
161 {
162  uint8_t res;
163  uint8_t i;
164  uint8_t offset;
165  uint8_t done;
166  uint16_t len;
167  uint16_t check_sum;
168  uint8_t buf[14];
169 
170  if (handle == NULL) /* check handle */
171  {
172  return 2; /* return error */
173  }
174  if (handle->inited != 1) /* check handle initialization */
175  {
176  return 3; /* return error */
177  }
178 
179  res = handle->uart_flush(); /* uart flush */
180  if (res != 0) /* check result */
181  {
182  handle->debug_print("gp2y1051au0f: uart flush failed.\n"); /* uart flush failed */
183 
184  return 1; /* return error */
185  }
186  handle->delay_ms(180); /* delay 180ms */
187  len = handle->uart_read((uint8_t *)buf, 14); /* uart read */
188  if (len != 14) /* check result */
189  {
190  handle->debug_print("gp2y1051au0f: uart read failed.\n"); /* uart read failed */
191 
192  return 1; /* return error */
193  }
194  offset = 0; /* init 0 */
195  done = 0; /* init 0 */
196  for (i = 0; i < 14; i++) /* loop all */
197  {
198  if ((buf[i] == 0xAA) && ((i + 7) < 14)) /* check frame */
199  {
200  if (buf[i + 6] != 0xFF) /* check frame trail */
201  {
202  handle->debug_print("gp2y1051au0f: frame is invalid.\n"); /* frame is invalid */
203 
204  return 4; /* return error */
205  }
206  offset = i; /* sava index */
207  done = 1; /* flag done */
208 
209  break; /* break */
210  }
211  }
212  if (done != 1) /* check done */
213  {
214  handle->debug_print("gp2y1051au0f: frame is error.\n"); /* frame is error */
215 
216  return 5; /* return error */
217  }
218  check_sum = 0; /* init 0 */
219  for (i = 1; i < 5; i++) /* sum 4 bytes */
220  {
221  check_sum += buf[offset + i]; /* sum all */
222  }
223  if ((check_sum & 0xFF) != buf[offset + 5]) /* check sum */
224  {
225  handle->debug_print("gp2y1051au0f: frame check error.\n"); /* frame check error */
226 
227  return 6; /* return error */
228  }
229  *raw = ((uint16_t)buf[offset + 1]) << 8 | buf[offset + 2]; /* get raw */
230  *mg_m3 = (float)(*raw) / 3.5f; /* convert to mg/m3 */
231 
232  return 0; /* success return 0 */
233 }
234 
248 uint8_t gp2y1051au0f_get_buf(gp2y1051au0f_handle_t *handle, char *buf, uint16_t len, uint32_t ms)
249 {
250  uint8_t res;
251  uint16_t l;
252 
253  if (handle == NULL) /* check handle */
254  {
255  return 2; /* return error */
256  }
257  if (handle->inited != 1) /* check handle initialization */
258  {
259  return 3; /* return error */
260  }
261 
262  res = handle->uart_flush(); /* uart flush */
263  if (res != 0) /* check result */
264  {
265  handle->debug_print("gp2y1051au0f: uart flush failed.\n"); /* uart flush failed */
266 
267  return 1; /* return error */
268  }
269  handle->delay_ms(ms); /* delay */
270  l = handle->uart_read((uint8_t *)buf, len); /* uart read */
271  if (l != len) /* check result */
272  {
273  handle->debug_print("gp2y1051au0f: uart read failed.\n"); /* uart read failed */
274 
275  return 1; /* return error */
276  }
277 
278  return 0; /* success return 0 */
279 }
280 
290 {
291  if (info == NULL) /* check handle */
292  {
293  return 2; /* return error */
294  }
295 
296  memset(info, 0, sizeof(gp2y1051au0f_info_t)); /* initialize gp2y1051au0f info structure */
297  strncpy(info->chip_name, CHIP_NAME, 32); /* copy chip name */
298  strncpy(info->manufacturer_name, MANUFACTURER_NAME, 32); /* copy manufacturer name */
299  strncpy(info->interface, "UART", 8); /* copy interface name */
300  info->supply_voltage_min_v = SUPPLY_VOLTAGE_MIN; /* set minimal supply voltage */
301  info->supply_voltage_max_v = SUPPLY_VOLTAGE_MAX; /* set maximum supply voltage */
302  info->max_current_ma = MAX_CURRENT; /* set maximum current */
303  info->temperature_max = TEMPERATURE_MAX; /* set minimal temperature */
304  info->temperature_min = TEMPERATURE_MIN; /* set maximum temperature */
305  info->driver_version = DRIVER_VERSION; /* set driver version */
306 
307  return 0; /* success return 0 */
308 }
#define MAX_CURRENT
#define SUPPLY_VOLTAGE_MAX
#define TEMPERATURE_MAX
#define MANUFACTURER_NAME
#define TEMPERATURE_MIN
#define SUPPLY_VOLTAGE_MIN
#define CHIP_NAME
chip information definition
#define DRIVER_VERSION
driver gp2y1051au0f header file
uint8_t gp2y1051au0f_read(gp2y1051au0f_handle_t *handle, uint16_t *raw, float *mg_m3)
read the data
uint8_t gp2y1051au0f_info(gp2y1051au0f_info_t *info)
get chip's information
uint8_t gp2y1051au0f_init(gp2y1051au0f_handle_t *handle)
initialize the chip
uint8_t gp2y1051au0f_deinit(gp2y1051au0f_handle_t *handle)
close the chip
uint8_t gp2y1051au0f_get_buf(gp2y1051au0f_handle_t *handle, char *buf, uint16_t len, uint32_t ms)
get buffer
gp2y1051au0f handle structure definition
uint8_t(* uart_flush)(void)
void(* delay_ms)(uint32_t ms)
uint8_t(* uart_deinit)(void)
void(* debug_print)(const char *const fmt,...)
uint16_t(* uart_read)(uint8_t *buf, uint16_t len)
uint8_t(* uart_init)(void)
gp2y1051au0f information structure definition