Program test for Coragem

Dependencies:   SX1272 SPI_MX25R

Committer:
marcoantonioara
Date:
Wed Nov 13 16:42:06 2019 +0000
Revision:
4:05d5aa4d3f2d
Test version firmware Coragem using all sensors

Who changed what in which revision?

UserRevisionLine numberNew contents of line
marcoantonioara 4:05d5aa4d3f2d 1 /***************************************************************************//**
marcoantonioara 4:05d5aa4d3f2d 2 * @file Si1133.h
marcoantonioara 4:05d5aa4d3f2d 3 *******************************************************************************
marcoantonioara 4:05d5aa4d3f2d 4 * @section License
marcoantonioara 4:05d5aa4d3f2d 5 * <b>(C) Copyright 2017 Silicon Labs, http://www.silabs.com</b>
marcoantonioara 4:05d5aa4d3f2d 6 *******************************************************************************
marcoantonioara 4:05d5aa4d3f2d 7 *
marcoantonioara 4:05d5aa4d3f2d 8 * SPDX-License-Identifier: Apache-2.0
marcoantonioara 4:05d5aa4d3f2d 9 *
marcoantonioara 4:05d5aa4d3f2d 10 * Licensed under the Apache License, Version 2.0 (the "License"); you may
marcoantonioara 4:05d5aa4d3f2d 11 * not use this file except in compliance with the License.
marcoantonioara 4:05d5aa4d3f2d 12 * You may obtain a copy of the License at
marcoantonioara 4:05d5aa4d3f2d 13 *
marcoantonioara 4:05d5aa4d3f2d 14 * http://www.apache.org/licenses/LICENSE-2.0
marcoantonioara 4:05d5aa4d3f2d 15 *
marcoantonioara 4:05d5aa4d3f2d 16 * Unless required by applicable law or agreed to in writing, software
marcoantonioara 4:05d5aa4d3f2d 17 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
marcoantonioara 4:05d5aa4d3f2d 18 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
marcoantonioara 4:05d5aa4d3f2d 19 * See the License for the specific language governing permissions and
marcoantonioara 4:05d5aa4d3f2d 20 * limitations under the License.
marcoantonioara 4:05d5aa4d3f2d 21 *
marcoantonioara 4:05d5aa4d3f2d 22 ******************************************************************************/
marcoantonioara 4:05d5aa4d3f2d 23
marcoantonioara 4:05d5aa4d3f2d 24 #ifndef SI1133_H
marcoantonioara 4:05d5aa4d3f2d 25 #define SI1133_H
marcoantonioara 4:05d5aa4d3f2d 26
marcoantonioara 4:05d5aa4d3f2d 27 #include "mbed.h"
marcoantonioara 4:05d5aa4d3f2d 28
marcoantonioara 4:05d5aa4d3f2d 29 /** Si1133 class.
marcoantonioara 4:05d5aa4d3f2d 30 * Used for taking Light level and UV index measurements.
marcoantonioara 4:05d5aa4d3f2d 31 *
marcoantonioara 4:05d5aa4d3f2d 32 * Example:
marcoantonioara 4:05d5aa4d3f2d 33 * @code
marcoantonioara 4:05d5aa4d3f2d 34 * #include "mbed.h"
marcoantonioara 4:05d5aa4d3f2d 35 * #include "Si1133.h"
marcoantonioara 4:05d5aa4d3f2d 36 *
marcoantonioara 4:05d5aa4d3f2d 37 * //Create an Si1133 object
marcoantonioara 4:05d5aa4d3f2d 38 * Si1133 sensor(PC4, PC5);
marcoantonioara 4:05d5aa4d3f2d 39 *
marcoantonioara 4:05d5aa4d3f2d 40 * int main()
marcoantonioara 4:05d5aa4d3f2d 41 * {
marcoantonioara 4:05d5aa4d3f2d 42 * //Try to open the Si1133
marcoantonioara 4:05d5aa4d3f2d 43 * if (sensor.open()) {
marcoantonioara 4:05d5aa4d3f2d 44 * printf("Device detected!\n");
marcoantonioara 4:05d5aa4d3f2d 45 *
marcoantonioara 4:05d5aa4d3f2d 46 * while (1) {
marcoantonioara 4:05d5aa4d3f2d 47 * //Print the current light level
marcoantonioara 4:05d5aa4d3f2d 48 * printf("Lux = %.3f\n", (float)sensor.get_light_level());
marcoantonioara 4:05d5aa4d3f2d 49 * //Print the current UV index
marcoantonioara 4:05d5aa4d3f2d 50 * printf("UV index = %.3f\n", (float)sensor.get_uv_index());
marcoantonioara 4:05d5aa4d3f2d 51 *
marcoantonioara 4:05d5aa4d3f2d 52 * //Sleep for 0.5 seconds
marcoantonioara 4:05d5aa4d3f2d 53 * wait(0.5);
marcoantonioara 4:05d5aa4d3f2d 54 * }
marcoantonioara 4:05d5aa4d3f2d 55 * } else {
marcoantonioara 4:05d5aa4d3f2d 56 * error("Device not detected!\n");
marcoantonioara 4:05d5aa4d3f2d 57 * }
marcoantonioara 4:05d5aa4d3f2d 58 * }
marcoantonioara 4:05d5aa4d3f2d 59 * @endcode
marcoantonioara 4:05d5aa4d3f2d 60 */
marcoantonioara 4:05d5aa4d3f2d 61 class Si1133
marcoantonioara 4:05d5aa4d3f2d 62 {
marcoantonioara 4:05d5aa4d3f2d 63 public:
marcoantonioara 4:05d5aa4d3f2d 64
marcoantonioara 4:05d5aa4d3f2d 65 /** Create an Si1133 object connected to the specified I2C pins with the specified I2C slave address
marcoantonioara 4:05d5aa4d3f2d 66 *
marcoantonioara 4:05d5aa4d3f2d 67 * @param sda The I2C data pin.
marcoantonioara 4:05d5aa4d3f2d 68 * @param scl The I2C clock pin.
marcoantonioara 4:05d5aa4d3f2d 69 * @param hz The I2C bus frequency (defaults to 400kHz).
marcoantonioara 4:05d5aa4d3f2d 70 */
marcoantonioara 4:05d5aa4d3f2d 71 Si1133(PinName sda, PinName scl, int hz = 400000);
marcoantonioara 4:05d5aa4d3f2d 72
marcoantonioara 4:05d5aa4d3f2d 73 /**
marcoantonioara 4:05d5aa4d3f2d 74 * Si1133 destructor
marcoantonioara 4:05d5aa4d3f2d 75 */
marcoantonioara 4:05d5aa4d3f2d 76 ~Si1133(void);
marcoantonioara 4:05d5aa4d3f2d 77
marcoantonioara 4:05d5aa4d3f2d 78 /** Probe for the Si1133 and try to initialize the sensor
marcoantonioara 4:05d5aa4d3f2d 79 *
marcoantonioara 4:05d5aa4d3f2d 80 * @returns
marcoantonioara 4:05d5aa4d3f2d 81 * 'true' if the device exists on the bus,
marcoantonioara 4:05d5aa4d3f2d 82 * 'false' if the device doesn't exist on the bus.
marcoantonioara 4:05d5aa4d3f2d 83 */
marcoantonioara 4:05d5aa4d3f2d 84 bool open();
marcoantonioara 4:05d5aa4d3f2d 85
marcoantonioara 4:05d5aa4d3f2d 86 /** Measure the current light level (in lux) on the Si1133
marcoantonioara 4:05d5aa4d3f2d 87 *
marcoantonioara 4:05d5aa4d3f2d 88 * @returns The current temperature measurement in Lux.
marcoantonioara 4:05d5aa4d3f2d 89 */
marcoantonioara 4:05d5aa4d3f2d 90 float get_light_level();
marcoantonioara 4:05d5aa4d3f2d 91
marcoantonioara 4:05d5aa4d3f2d 92 /** Measure the current UV Index on the Si1133
marcoantonioara 4:05d5aa4d3f2d 93 *
marcoantonioara 4:05d5aa4d3f2d 94 * @returns The current UV index measurement.
marcoantonioara 4:05d5aa4d3f2d 95 */
marcoantonioara 4:05d5aa4d3f2d 96 float get_uv_index();
marcoantonioara 4:05d5aa4d3f2d 97
marcoantonioara 4:05d5aa4d3f2d 98 /** Do a combined measurement and return both the light level and UV index
marcoantonioara 4:05d5aa4d3f2d 99 *
marcoantonioara 4:05d5aa4d3f2d 100 * @param[out] light_level Measured light level in Lux
marcoantonioara 4:05d5aa4d3f2d 101 * @param[out] uv_index Measured UV index
marcoantonioara 4:05d5aa4d3f2d 102 *
marcoantonioara 4:05d5aa4d3f2d 103 * @returns true if measurement was successful
marcoantonioara 4:05d5aa4d3f2d 104 */
marcoantonioara 4:05d5aa4d3f2d 105 bool get_light_and_uv(float *light_level, float *uv_index);
marcoantonioara 4:05d5aa4d3f2d 106
marcoantonioara 4:05d5aa4d3f2d 107 uint32_t wait_until_sleep(void);
marcoantonioara 4:05d5aa4d3f2d 108 uint32_t wake(void);
marcoantonioara 4:05d5aa4d3f2d 109
marcoantonioara 4:05d5aa4d3f2d 110 #ifdef MBED_OPERATORS
marcoantonioara 4:05d5aa4d3f2d 111 /** A shorthand for get_light_level()
marcoantonioara 4:05d5aa4d3f2d 112 *
marcoantonioara 4:05d5aa4d3f2d 113 * @returns The current temperature measurement in Lux.
marcoantonioara 4:05d5aa4d3f2d 114 */
marcoantonioara 4:05d5aa4d3f2d 115 operator float();
marcoantonioara 4:05d5aa4d3f2d 116 #endif
marcoantonioara 4:05d5aa4d3f2d 117
marcoantonioara 4:05d5aa4d3f2d 118 private:
marcoantonioara 4:05d5aa4d3f2d 119 /**
marcoantonioara 4:05d5aa4d3f2d 120 * @name I2C Registers
marcoantonioara 4:05d5aa4d3f2d 121 * @{
marcoantonioara 4:05d5aa4d3f2d 122 */
marcoantonioara 4:05d5aa4d3f2d 123 enum Register {
marcoantonioara 4:05d5aa4d3f2d 124 REG_PART_ID = 0x00, /**< Part ID */
marcoantonioara 4:05d5aa4d3f2d 125 REG_HW_ID = 0x01, /**< Hardware ID */
marcoantonioara 4:05d5aa4d3f2d 126 REG_REV_ID = 0x02, /**< Hardware revision */
marcoantonioara 4:05d5aa4d3f2d 127 REG_HOSTIN0 = 0x0A, /**< Data for parameter table on PARAM_SET write to COMMAND register */
marcoantonioara 4:05d5aa4d3f2d 128 REG_COMMAND = 0x0B, /**< Initiated action in Sensor when specific codes written here */
marcoantonioara 4:05d5aa4d3f2d 129 REG_IRQ_ENABLE = 0x0F, /**< Interrupt enable */
marcoantonioara 4:05d5aa4d3f2d 130 REG_RESPONSE1 = 0x10, /**< Contains the readback value from a query or a set command */
marcoantonioara 4:05d5aa4d3f2d 131 REG_RESPONSE0 = 0x11, /**< Chip state and error status */
marcoantonioara 4:05d5aa4d3f2d 132 REG_IRQ_STATUS = 0x12, /**< Interrupt status */
marcoantonioara 4:05d5aa4d3f2d 133 REG_HOSTOUT0 = 0x13, /**< Captured Sensor Data */
marcoantonioara 4:05d5aa4d3f2d 134 REG_HOSTOUT1 = 0x14, /**< Captured Sensor Data */
marcoantonioara 4:05d5aa4d3f2d 135 REG_HOSTOUT2 = 0x15, /**< Captured Sensor Data */
marcoantonioara 4:05d5aa4d3f2d 136 REG_HOSTOUT3 = 0x16, /**< Captured Sensor Data */
marcoantonioara 4:05d5aa4d3f2d 137 REG_HOSTOUT4 = 0x17, /**< Captured Sensor Data */
marcoantonioara 4:05d5aa4d3f2d 138 REG_HOSTOUT5 = 0x18, /**< Captured Sensor Data */
marcoantonioara 4:05d5aa4d3f2d 139 REG_HOSTOUT6 = 0x19, /**< Captured Sensor Data */
marcoantonioara 4:05d5aa4d3f2d 140 REG_HOSTOUT7 = 0x1A, /**< Captured Sensor Data */
marcoantonioara 4:05d5aa4d3f2d 141 REG_HOSTOUT8 = 0x1B, /**< Captured Sensor Data */
marcoantonioara 4:05d5aa4d3f2d 142 REG_HOSTOUT9 = 0x1C, /**< Captured Sensor Data */
marcoantonioara 4:05d5aa4d3f2d 143 REG_HOSTOUT10 = 0x1D, /**< Captured Sensor Data */
marcoantonioara 4:05d5aa4d3f2d 144 REG_HOSTOUT11 = 0x1E, /**< Captured Sensor Data */
marcoantonioara 4:05d5aa4d3f2d 145 REG_HOSTOUT12 = 0x1F, /**< Captured Sensor Data */
marcoantonioara 4:05d5aa4d3f2d 146 REG_HOSTOUT13 = 0x20, /**< Captured Sensor Data */
marcoantonioara 4:05d5aa4d3f2d 147 REG_HOSTOUT14 = 0x21, /**< Captured Sensor Data */
marcoantonioara 4:05d5aa4d3f2d 148 REG_HOSTOUT15 = 0x22, /**< Captured Sensor Data */
marcoantonioara 4:05d5aa4d3f2d 149 REG_HOSTOUT16 = 0x23, /**< Captured Sensor Data */
marcoantonioara 4:05d5aa4d3f2d 150 REG_HOSTOUT17 = 0x24, /**< Captured Sensor Data */
marcoantonioara 4:05d5aa4d3f2d 151 REG_HOSTOUT18 = 0x25, /**< Captured Sensor Data */
marcoantonioara 4:05d5aa4d3f2d 152 REG_HOSTOUT19 = 0x26, /**< Captured Sensor Data */
marcoantonioara 4:05d5aa4d3f2d 153 REG_HOSTOUT20 = 0x27, /**< Captured Sensor Data */
marcoantonioara 4:05d5aa4d3f2d 154 REG_HOSTOUT21 = 0x28, /**< Captured Sensor Data */
marcoantonioara 4:05d5aa4d3f2d 155 REG_HOSTOUT22 = 0x29, /**< Captured Sensor Data */
marcoantonioara 4:05d5aa4d3f2d 156 REG_HOSTOUT23 = 0x2A, /**< Captured Sensor Data */
marcoantonioara 4:05d5aa4d3f2d 157 REG_HOSTOUT24 = 0x2B, /**< Captured Sensor Data */
marcoantonioara 4:05d5aa4d3f2d 158 REG_HOSTOUT25 = 0x2C, /**< Captured Sensor Data */
marcoantonioara 4:05d5aa4d3f2d 159 };
marcoantonioara 4:05d5aa4d3f2d 160 /**@}*/
marcoantonioara 4:05d5aa4d3f2d 161
marcoantonioara 4:05d5aa4d3f2d 162 /**
marcoantonioara 4:05d5aa4d3f2d 163 * @name Parameters
marcoantonioara 4:05d5aa4d3f2d 164 * @{
marcoantonioara 4:05d5aa4d3f2d 165 */
marcoantonioara 4:05d5aa4d3f2d 166 enum Parameter {
marcoantonioara 4:05d5aa4d3f2d 167 PARAM_I2C_ADDR = 0x00, /**< I2C address */
marcoantonioara 4:05d5aa4d3f2d 168 PARAM_CH_LIST = 0x01, /**< Channel list */
marcoantonioara 4:05d5aa4d3f2d 169 PARAM_ADCCONFIG0 = 0x02, /**< ADC config for Channel 0 */
marcoantonioara 4:05d5aa4d3f2d 170 PARAM_ADCSENS0 = 0x03, /**< ADC sensitivity setting for Channel 0 */
marcoantonioara 4:05d5aa4d3f2d 171 PARAM_ADCPOST0 = 0x04, /**< ADC resolution, shift and threshold settings for Channel 0 */
marcoantonioara 4:05d5aa4d3f2d 172 PARAM_MEASCONFIG0 = 0x05, /**< ADC measurement counter selection for Channel 0 */
marcoantonioara 4:05d5aa4d3f2d 173 PARAM_ADCCONFIG1 = 0x06, /**< ADC config for Channel 1 */
marcoantonioara 4:05d5aa4d3f2d 174 PARAM_ADCSENS1 = 0x07, /**< ADC sensitivity setting for Channel 1 */
marcoantonioara 4:05d5aa4d3f2d 175 PARAM_ADCPOST1 = 0x08, /**< ADC resolution, shift and threshold settings for Channel 1 */
marcoantonioara 4:05d5aa4d3f2d 176 PARAM_MEASCONFIG1 = 0x09, /**< ADC measurement counter selection for Channel 1 */
marcoantonioara 4:05d5aa4d3f2d 177 PARAM_ADCCONFIG2 = 0x0A, /**< ADC config for Channel 2 */
marcoantonioara 4:05d5aa4d3f2d 178 PARAM_ADCSENS2 = 0x0B, /**< ADC sensitivity setting for Channel 2 */
marcoantonioara 4:05d5aa4d3f2d 179 PARAM_ADCPOST2 = 0x0C, /**< ADC resolution, shift and threshold settings for Channel 2 */
marcoantonioara 4:05d5aa4d3f2d 180 PARAM_MEASCONFIG2 = 0x0D, /**< ADC measurement counter selection for Channel 2 */
marcoantonioara 4:05d5aa4d3f2d 181 PARAM_ADCCONFIG3 = 0x0E, /**< ADC config for Channel 3 */
marcoantonioara 4:05d5aa4d3f2d 182 PARAM_ADCSENS3 = 0x0F, /**< ADC sensitivity setting for Channel 3 */
marcoantonioara 4:05d5aa4d3f2d 183 PARAM_ADCPOST3 = 0x10, /**< ADC resolution, shift and threshold settings for Channel 3 */
marcoantonioara 4:05d5aa4d3f2d 184 PARAM_MEASCONFIG3 = 0x11, /**< ADC measurement counter selection for Channel 3 */
marcoantonioara 4:05d5aa4d3f2d 185 PARAM_ADCCONFIG4 = 0x12, /**< ADC config for Channel 4 */
marcoantonioara 4:05d5aa4d3f2d 186 PARAM_ADCSENS4 = 0x13, /**< ADC sensitivity setting for Channel 4 */
marcoantonioara 4:05d5aa4d3f2d 187 PARAM_ADCPOST4 = 0x14, /**< ADC resolution, shift and threshold settings for Channel 4 */
marcoantonioara 4:05d5aa4d3f2d 188 PARAM_MEASCONFIG4 = 0x15, /**< ADC measurement counter selection for Channel 4 */
marcoantonioara 4:05d5aa4d3f2d 189 PARAM_ADCCONFIG5 = 0x16, /**< ADC config for Channel 5 */
marcoantonioara 4:05d5aa4d3f2d 190 PARAM_ADCSENS5 = 0x17, /**< ADC sensitivity setting for Channel 5 */
marcoantonioara 4:05d5aa4d3f2d 191 PARAM_ADCPOST5 = 0x18, /**< ADC resolution, shift and threshold settings for Channel 5 */
marcoantonioara 4:05d5aa4d3f2d 192 PARAM_MEASCONFIG5 = 0x19, /**< ADC measurement counter selection for Channel 5 */
marcoantonioara 4:05d5aa4d3f2d 193 PARAM_MEASRATE_H = 0x1A, /**< Main measurement rate counter MSB */
marcoantonioara 4:05d5aa4d3f2d 194 PARAM_MEASRATE_L = 0x1B, /**< Main measurement rate counter LSB */
marcoantonioara 4:05d5aa4d3f2d 195 PARAM_MEASCOUNT0 = 0x1C, /**< Measurement rate extension counter 0 */
marcoantonioara 4:05d5aa4d3f2d 196 PARAM_MEASCOUNT1 = 0x1D, /**< Measurement rate extension counter 1 */
marcoantonioara 4:05d5aa4d3f2d 197 PARAM_MEASCOUNT2 = 0x1E, /**< Measurement rate extension counter 2 */
marcoantonioara 4:05d5aa4d3f2d 198 PARAM_THRESHOLD0_H = 0x25, /**< Threshold level 0 MSB */
marcoantonioara 4:05d5aa4d3f2d 199 PARAM_THRESHOLD0_L = 0x26, /**< Threshold level 0 LSB */
marcoantonioara 4:05d5aa4d3f2d 200 PARAM_THRESHOLD1_H = 0x27, /**< Threshold level 1 MSB */
marcoantonioara 4:05d5aa4d3f2d 201 PARAM_THRESHOLD1_L = 0x28, /**< Threshold level 1 LSB */
marcoantonioara 4:05d5aa4d3f2d 202 PARAM_THRESHOLD2_H = 0x29, /**< Threshold level 2 MSB */
marcoantonioara 4:05d5aa4d3f2d 203 PARAM_THRESHOLD2_L = 0x2A, /**< Threshold level 2 LSB */
marcoantonioara 4:05d5aa4d3f2d 204 PARAM_BURST = 0x2B, /**< Burst enable and burst count */
marcoantonioara 4:05d5aa4d3f2d 205 };
marcoantonioara 4:05d5aa4d3f2d 206 /**@}*/
marcoantonioara 4:05d5aa4d3f2d 207
marcoantonioara 4:05d5aa4d3f2d 208 /**
marcoantonioara 4:05d5aa4d3f2d 209 * @name Commands
marcoantonioara 4:05d5aa4d3f2d 210 * @{
marcoantonioara 4:05d5aa4d3f2d 211 */
marcoantonioara 4:05d5aa4d3f2d 212 enum Command {
marcoantonioara 4:05d5aa4d3f2d 213 CMD_RESET_CMD_CTR = 0x00, /**< Resets the command counter */
marcoantonioara 4:05d5aa4d3f2d 214 CMD_RESET = 0x01, /**< Forces a Reset */
marcoantonioara 4:05d5aa4d3f2d 215 CMD_NEW_ADDR = 0x02, /**< Stores the new I2C address */
marcoantonioara 4:05d5aa4d3f2d 216 CMD_FORCE_CH = 0x11, /**< Initiates a set of measurements specified in CHAN_LIST parameter */
marcoantonioara 4:05d5aa4d3f2d 217 CMD_PAUSE_CH = 0x12, /**< Pauses autonomous measurements */
marcoantonioara 4:05d5aa4d3f2d 218 CMD_START = 0x13, /**< Starts autonomous measurements */
marcoantonioara 4:05d5aa4d3f2d 219 CMD_PARAM_SET = 0x80, /**< Sets a parameter */
marcoantonioara 4:05d5aa4d3f2d 220 CMD_PARAM_QUERY = 0x40, /**< Reads a parameter */
marcoantonioara 4:05d5aa4d3f2d 221 };
marcoantonioara 4:05d5aa4d3f2d 222 /**@}*/
marcoantonioara 4:05d5aa4d3f2d 223
marcoantonioara 4:05d5aa4d3f2d 224 /**
marcoantonioara 4:05d5aa4d3f2d 225 * @name Responses
marcoantonioara 4:05d5aa4d3f2d 226 * @{
marcoantonioara 4:05d5aa4d3f2d 227 */
marcoantonioara 4:05d5aa4d3f2d 228 enum Response {
marcoantonioara 4:05d5aa4d3f2d 229 RSP0_CHIPSTAT_MASK = 0xE0, /**< Chip state mask in Response0 register */
marcoantonioara 4:05d5aa4d3f2d 230 RSP0_COUNTER_MASK = 0x1F, /**< Command counter and error indicator mask in Response0 register */
marcoantonioara 4:05d5aa4d3f2d 231 RSP0_SLEEP = 0x20, /**< Sleep state indicator bit mask in Response0 register */
marcoantonioara 4:05d5aa4d3f2d 232 };
marcoantonioara 4:05d5aa4d3f2d 233 /**@}*/
marcoantonioara 4:05d5aa4d3f2d 234
marcoantonioara 4:05d5aa4d3f2d 235 /**
marcoantonioara 4:05d5aa4d3f2d 236 * @brief
marcoantonioara 4:05d5aa4d3f2d 237 * Structure to store the data measured by the Si1133
marcoantonioara 4:05d5aa4d3f2d 238 */
marcoantonioara 4:05d5aa4d3f2d 239 typedef struct {
marcoantonioara 4:05d5aa4d3f2d 240 uint8_t irq_status; /**< Interrupt status of the device */
marcoantonioara 4:05d5aa4d3f2d 241 int32_t ch0; /**< Channel 0 measurement data */
marcoantonioara 4:05d5aa4d3f2d 242 int32_t ch1; /**< Channel 1 measurement data */
marcoantonioara 4:05d5aa4d3f2d 243 int32_t ch2; /**< Channel 2 measurement data */
marcoantonioara 4:05d5aa4d3f2d 244 int32_t ch3; /**< Channel 3 measurement data */
marcoantonioara 4:05d5aa4d3f2d 245 } Samples_t;
marcoantonioara 4:05d5aa4d3f2d 246
marcoantonioara 4:05d5aa4d3f2d 247 /**
marcoantonioara 4:05d5aa4d3f2d 248 * @brief
marcoantonioara 4:05d5aa4d3f2d 249 * Structure to store the calculation coefficients
marcoantonioara 4:05d5aa4d3f2d 250 */
marcoantonioara 4:05d5aa4d3f2d 251 typedef struct {
marcoantonioara 4:05d5aa4d3f2d 252 int16_t info; /**< Info */
marcoantonioara 4:05d5aa4d3f2d 253 uint16_t mag; /**< Magnitude */
marcoantonioara 4:05d5aa4d3f2d 254 } Coeff_t;
marcoantonioara 4:05d5aa4d3f2d 255
marcoantonioara 4:05d5aa4d3f2d 256 /**
marcoantonioara 4:05d5aa4d3f2d 257 * @brief
marcoantonioara 4:05d5aa4d3f2d 258 * Structure to store the coefficients used for Lux calculation
marcoantonioara 4:05d5aa4d3f2d 259 */
marcoantonioara 4:05d5aa4d3f2d 260 typedef struct {
marcoantonioara 4:05d5aa4d3f2d 261 Coeff_t coeff_high[4]; /**< High amplitude coeffs */
marcoantonioara 4:05d5aa4d3f2d 262 Coeff_t coeff_low[9]; /**< Low amplitude coeffs */
marcoantonioara 4:05d5aa4d3f2d 263 } LuxCoeff_t;
marcoantonioara 4:05d5aa4d3f2d 264
marcoantonioara 4:05d5aa4d3f2d 265 /* Forward-declare constant coefficient table */
marcoantonioara 4:05d5aa4d3f2d 266 static const LuxCoeff_t lk;
marcoantonioara 4:05d5aa4d3f2d 267 static const Coeff_t uk[];
marcoantonioara 4:05d5aa4d3f2d 268
marcoantonioara 4:05d5aa4d3f2d 269 /* Private functions */
marcoantonioara 4:05d5aa4d3f2d 270 uint32_t read_register(enum Register reg, uint8_t *data);
marcoantonioara 4:05d5aa4d3f2d 271 uint32_t write_register(enum Register reg, uint8_t data);
marcoantonioara 4:05d5aa4d3f2d 272 uint32_t write_register_block(enum Register reg, uint8_t length, uint8_t *data);
marcoantonioara 4:05d5aa4d3f2d 273 uint32_t read_register_block(enum Register reg, uint8_t length, uint8_t *data);
marcoantonioara 4:05d5aa4d3f2d 274 uint32_t get_irq_status(uint8_t *irq_status);
marcoantonioara 4:05d5aa4d3f2d 275
marcoantonioara 4:05d5aa4d3f2d 276 uint32_t reset(void);
marcoantonioara 4:05d5aa4d3f2d 277 uint32_t reset_cmd_counter (void);
marcoantonioara 4:05d5aa4d3f2d 278 uint32_t send_cmd(enum Command command);
marcoantonioara 4:05d5aa4d3f2d 279 uint32_t force_measurement (void);
marcoantonioara 4:05d5aa4d3f2d 280 uint32_t pause_measurement (void);
marcoantonioara 4:05d5aa4d3f2d 281 uint32_t start_measurement (void);
marcoantonioara 4:05d5aa4d3f2d 282 uint32_t set_parameter (enum Parameter address, uint8_t value);
marcoantonioara 4:05d5aa4d3f2d 283 uint32_t read_parameter (enum Parameter address);
marcoantonioara 4:05d5aa4d3f2d 284 uint32_t init (void);
marcoantonioara 4:05d5aa4d3f2d 285 uint32_t deinit (void);
marcoantonioara 4:05d5aa4d3f2d 286 uint32_t measure (Samples_t *samples);
marcoantonioara 4:05d5aa4d3f2d 287 int32_t get_uv (int32_t uv);
marcoantonioara 4:05d5aa4d3f2d 288 int32_t get_lux (int32_t vis_high, int32_t vis_low, int32_t ir);
marcoantonioara 4:05d5aa4d3f2d 289 uint32_t measure_lux_uv (float *lux, float *uvi);
marcoantonioara 4:05d5aa4d3f2d 290 uint32_t get_measurement (float *lux, float *uvi);
marcoantonioara 4:05d5aa4d3f2d 291 uint32_t get_hardware_id (uint8_t *hardware_id);
marcoantonioara 4:05d5aa4d3f2d 292
marcoantonioara 4:05d5aa4d3f2d 293 int32_t calculate_polynomial_helper (int32_t input, int8_t fraction, uint16_t mag, int8_t shift);
marcoantonioara 4:05d5aa4d3f2d 294 int32_t calculate_polynomial (int32_t x, int32_t y, uint8_t input_fraction, uint8_t output_fraction, uint8_t num_coeff, const Coeff_t *kp);
marcoantonioara 4:05d5aa4d3f2d 295
marcoantonioara 4:05d5aa4d3f2d 296 /* Member variables */
marcoantonioara 4:05d5aa4d3f2d 297 I2C m_I2C;
marcoantonioara 4:05d5aa4d3f2d 298 };
marcoantonioara 4:05d5aa4d3f2d 299
marcoantonioara 4:05d5aa4d3f2d 300 #endif