| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * resarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| #ifndef __TSL2591_H__ |
| #define __TSL2591_H__ |
| |
| #include "os/mynewt.h" |
| #include "sensor/sensor.h" |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| enum tsl2591_light_gain { |
| TSL2591_LIGHT_GAIN_LOW = 0x00, /* 1X */ |
| TSL2591_LIGHT_GAIN_MED = 0x10, /* ~25X */ |
| TSL2591_LIGHT_GAIN_HIGH = 0x20, /* ~428X */ |
| TSL2591_LIGHT_GAIN_MAX = 0x30 /* ~9876X */ |
| }; |
| |
| enum tsl2591_light_itime { |
| TSL2591_LIGHT_ITIME_100MS = 0x00, /* 100ms */ |
| TSL2591_LIGHT_ITIME_200MS = 0x01, /* 200ms */ |
| TSL2591_LIGHT_ITIME_300MS = 0x02, /* 300ms */ |
| TSL2591_LIGHT_ITIME_400MS = 0x03, /* 400ms */ |
| TSL2591_LIGHT_ITIME_500MS = 0x04, /* 500ms */ |
| TSL2591_LIGHT_ITIME_600MS = 0x05 /* 600ms */ |
| }; |
| |
| struct tsl2591_cfg { |
| uint8_t gain; |
| uint8_t integration_time; |
| sensor_type_t mask; |
| }; |
| |
| struct tsl2591 { |
| struct os_dev dev; |
| struct sensor sensor; |
| struct tsl2591_cfg cfg; |
| os_time_t last_read_time; |
| }; |
| |
| /** |
| * Expects to be called back through os_dev_create(). |
| * |
| * @param ptr to the device object associated with this luminosity sensor |
| * @param argument passed to OS device init |
| * |
| * @return 0 on success, non-zero on failure. |
| */ |
| int tsl2591_init(struct os_dev *dev, void *arg); |
| |
| /** |
| * Enable or disables the sensor to save power |
| * |
| * @param The sensor interface |
| * @param state 1 to enable the sensor, 0 to disable it |
| * |
| * @return 0 on success, non-zero on failure |
| */ |
| int tsl2591_enable(struct sensor_itf *itf, uint8_t state); |
| |
| /** |
| * Gets the current 'enabled' state for the IC |
| * |
| * @param The sensor interface |
| * @param ptr to the enabled variable to be filled up |
| * @return 0 on success, non-zero on failure |
| */ |
| int tsl2591_get_enable(struct sensor_itf *itf, uint8_t *enabled); |
| |
| /** |
| * Gets a new data sample from the light sensor. |
| * |
| * @param The sensor interface |
| * @param broadband The full (visible + ir) sensor output |
| * @param ir The ir sensor output |
| * |
| * @return 0 on success, non-zero on failure |
| */ |
| int tsl2591_get_data(struct sensor_itf *itf, uint16_t *broadband, uint16_t *ir); |
| |
| /** |
| * Sets the integration time used when sampling light values. |
| * |
| * @param The sensor interface |
| * @param int_time The integration time which can be one of: |
| * - 0x00: 100ms |
| * - 0x01: 200ms |
| * - 0x02: 300ms |
| * - 0x03: 400ms |
| * - 0x04: 500ms |
| * - 0x05: 600ms |
| * |
| * @return 0 on success, non-zero on failure |
| */ |
| int tsl2591_set_integration_time(struct sensor_itf *itf, uint8_t int_time); |
| |
| /** |
| * Gets the current integration time used when sampling light values. |
| * |
| * @param The sensor interface |
| * @param ptr to the integration time which can be one of: |
| * - 0x00: 100ms |
| * - 0x01: 200ms |
| * - 0x02: 300ms |
| * - 0x03: 400ms |
| * - 0x04: 500ms |
| * - 0x05: 600ms |
| * |
| * @return 0 on success, non-zero on failure |
| */ |
| int tsl2591_get_integration_time(struct sensor_itf *itf, uint8_t *int_time); |
| |
| /** |
| * Sets the gain increment used when sampling light values. |
| * |
| * @param The sensor interface |
| * @param gain The gain increment which can be one of: |
| * - 0x00: Low (no gain) |
| * - 0x10: Medium (~25x gain) |
| * - 0x20: High (~428x gain) |
| * - 0x30: Max (~9876x gain) |
| * |
| * @return 0 on success, non-zero on failure |
| */ |
| int tsl2591_set_gain(struct sensor_itf *itf, uint8_t gain); |
| |
| /** |
| * Gets the current gain increment used when sampling light values. |
| * |
| * @param The sensor interface |
| * @param ptr to the gain increment which can be one of: |
| * - 0x00: Low (no gain) |
| * - 0x10: Medium (~25x gain) |
| * - 0x20: High (~428x gain) |
| * - 0x30: Max (~9876x gain) |
| * |
| * @return 0 on success, non-zero on failure |
| */ |
| int tsl2591_get_gain(struct sensor_itf *itf, uint8_t *gain); |
| |
| /** |
| * Configure the sensor |
| * |
| * @param ptr to sensor driver |
| * @param ptr to sensor driver config |
| * |
| * @return 0 on success, non-zero on failure |
| */ |
| int tsl2591_config(struct tsl2591 *, struct tsl2591_cfg *); |
| |
| /** |
| * Calculate light level in lux based on the full spectrum and IR readings |
| * |
| * NOTE: This function assumes that the gain and integration time used when |
| * reading the full spectrum and IR readings are the same as when this |
| * function gets called. If gain or integration time have changed, a |
| * fresh sample should be read before calling this function. |
| * |
| * @param ptr to sensor driver |
| * @param Full spectrum (broadband) light reading |
| * @param IR light reading |
| * @param ptr to the sensor driver config |
| * |
| * @return 0 on failure, otherwise the converted light level in lux as an |
| * unsigned 32-bit integer. |
| */ |
| uint32_t tsl2591_calculate_lux(struct sensor_itf *itf, uint16_t broadband, |
| uint16_t ir, struct tsl2591_cfg *cfg); |
| |
| /** |
| * Calculate light level in lux based on the full spectrum and IR readings |
| * |
| * NOTE: This function assumes that the gain and integration time used when |
| * reading the full spectrum and IR readings are the same as when this |
| * function gets called. If gain or integration time have changed, a |
| * fresh sample should be read before calling this function. |
| * |
| * @param ptr to sensor driver |
| * @param Full spectrum (broadband) light reading |
| * @param IR light reading |
| * @param ptr to the sensor driver config |
| * |
| * @return 0 on failure, otherwise the converted light level in lux as a |
| * single precision float. |
| */ |
| float tsl2591_calculate_lux_f(struct sensor_itf *itf, uint16_t broadband, |
| uint16_t ir, struct tsl2591_cfg *cfg); |
| |
| #if MYNEWT_VAL(TSL2591_CLI) |
| int tsl2591_shell_init(void); |
| #endif |
| |
| #ifdef ARCH_sim |
| /** |
| * Registers the sim driver with the hal_i2c simulation layer |
| * |
| * @return 0 on success, non-zero on failure |
| */ |
| int tsl2591_sim_init(void); |
| #endif |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif /* __TSL2591_H__ */ |