Industry's Lowest-Power Ambient Light Sensor with ADC

Dependents:   FYPhh FYPhh5 FYPhh5ultrafinal FYPhh5ultrafinal

Committer:
mcm
Date:
Mon Sep 17 11:41:33 2018 +0000
Revision:
3:13e5af215b11
Parent:
2:08d850dd1cb8
This driver was completed and tested ( NUCLEO-L152RE ), it works as expected.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mcm 2:08d850dd1cb8 1 /**
mcm 2:08d850dd1cb8 2 * @brief MAX44009.cpp
mcm 2:08d850dd1cb8 3 * @details Industry's Lowest-Power Ambient Light Sensor with ADC.
mcm 2:08d850dd1cb8 4 * Functions file.
mcm 2:08d850dd1cb8 5 *
mcm 2:08d850dd1cb8 6 *
mcm 2:08d850dd1cb8 7 * @return N/A
mcm 2:08d850dd1cb8 8 *
mcm 2:08d850dd1cb8 9 * @author Manuel Caballero
mcm 2:08d850dd1cb8 10 * @date 17/September/2018
mcm 2:08d850dd1cb8 11 * @version 17/September/2018 The ORIGIN
mcm 2:08d850dd1cb8 12 * @pre N/A
mcm 2:08d850dd1cb8 13 * @warning N/A
mcm 2:08d850dd1cb8 14 * @pre This code belongs to Nimbus Centre ( http://www.nimbus.cit.ie ).
mcm 2:08d850dd1cb8 15 */
mcm 2:08d850dd1cb8 16
mcm 2:08d850dd1cb8 17 #include "MAX44009.h"
mcm 2:08d850dd1cb8 18
mcm 2:08d850dd1cb8 19
mcm 2:08d850dd1cb8 20 MAX44009::MAX44009 ( PinName sda, PinName scl, uint32_t addr, uint32_t freq )
mcm 2:08d850dd1cb8 21 : _i2c ( sda, scl )
mcm 2:08d850dd1cb8 22 , _MAX44009_Addr ( addr )
mcm 2:08d850dd1cb8 23 {
mcm 2:08d850dd1cb8 24 _i2c.frequency( freq );
mcm 2:08d850dd1cb8 25 }
mcm 2:08d850dd1cb8 26
mcm 2:08d850dd1cb8 27
mcm 2:08d850dd1cb8 28 MAX44009::~MAX44009()
mcm 2:08d850dd1cb8 29 {
mcm 2:08d850dd1cb8 30 }
mcm 2:08d850dd1cb8 31
mcm 2:08d850dd1cb8 32
mcm 2:08d850dd1cb8 33
mcm 2:08d850dd1cb8 34 /**
mcm 2:08d850dd1cb8 35 * @brief MAX44009_ReadInterruptStatus ( MAX44009_vector_data_t* )
mcm 2:08d850dd1cb8 36 *
mcm 2:08d850dd1cb8 37 * @details It gets the interrupt status value.
mcm 2:08d850dd1cb8 38 *
mcm 2:08d850dd1cb8 39 * @param[in] N/A.
mcm 2:08d850dd1cb8 40 *
mcm 2:08d850dd1cb8 41 * @param[out] myInterruptStatus: Interrupt status register.
mcm 2:08d850dd1cb8 42 *
mcm 2:08d850dd1cb8 43 *
mcm 2:08d850dd1cb8 44 * @return Status of MAX44009_ReadInterruptStatus.
mcm 2:08d850dd1cb8 45 *
mcm 2:08d850dd1cb8 46 *
mcm 2:08d850dd1cb8 47 * @author Manuel Caballero
mcm 2:08d850dd1cb8 48 * @date 17/September/2018
mcm 2:08d850dd1cb8 49 * @version 17/September/2018 The ORIGIN
mcm 2:08d850dd1cb8 50 * @pre N/A.
mcm 2:08d850dd1cb8 51 * @warning N/A.
mcm 2:08d850dd1cb8 52 */
mcm 2:08d850dd1cb8 53 MAX44009::MAX44009_status_t MAX44009::MAX44009_ReadInterruptStatus ( MAX44009_vector_data_t* myInterruptStatus )
mcm 2:08d850dd1cb8 54 {
mcm 2:08d850dd1cb8 55 char cmd = 0U;
mcm 2:08d850dd1cb8 56 uint32_t aux;
mcm 2:08d850dd1cb8 57
mcm 2:08d850dd1cb8 58
mcm 2:08d850dd1cb8 59 /* Read INTERRUPT STATUS register */
mcm 2:08d850dd1cb8 60 cmd = MAX44009_INTERRUPT_STATUS;
mcm 2:08d850dd1cb8 61 aux = _i2c.write ( _MAX44009_Addr, &cmd, 1U, true );
mcm 2:08d850dd1cb8 62 aux = _i2c.read ( _MAX44009_Addr, &cmd, 1U );
mcm 2:08d850dd1cb8 63
mcm 2:08d850dd1cb8 64
mcm 2:08d850dd1cb8 65 /* Parse data */
mcm 2:08d850dd1cb8 66 myInterruptStatus->interruptStatus = (MAX44009_interrupt_status_ints_t)( cmd & INTERRUPT_STATUS_INTS_MASK );
mcm 2:08d850dd1cb8 67
mcm 2:08d850dd1cb8 68
mcm 2:08d850dd1cb8 69
mcm 2:08d850dd1cb8 70 if ( aux == I2C_SUCCESS )
mcm 2:08d850dd1cb8 71 {
mcm 2:08d850dd1cb8 72 return MAX44009_SUCCESS;
mcm 2:08d850dd1cb8 73 }
mcm 2:08d850dd1cb8 74 else
mcm 2:08d850dd1cb8 75 {
mcm 2:08d850dd1cb8 76 return MAX44009_FAILURE;
mcm 2:08d850dd1cb8 77 }
mcm 2:08d850dd1cb8 78 }
mcm 2:08d850dd1cb8 79
mcm 2:08d850dd1cb8 80
mcm 2:08d850dd1cb8 81
mcm 2:08d850dd1cb8 82 /**
mcm 2:08d850dd1cb8 83 * @brief MAX44009_InterrupEnable ( MAX44009_interrupt_enable_ints_t )
mcm 2:08d850dd1cb8 84 *
mcm 2:08d850dd1cb8 85 * @details It enables/disables the interrupt.
mcm 2:08d850dd1cb8 86 *
mcm 2:08d850dd1cb8 87 * @param[in] myInterruptEnable Enable/Disable the interrupt.
mcm 2:08d850dd1cb8 88 *
mcm 2:08d850dd1cb8 89 * @param[out] N/A.
mcm 2:08d850dd1cb8 90 *
mcm 2:08d850dd1cb8 91 *
mcm 2:08d850dd1cb8 92 * @return Status of MAX44009_InterrupEnable.
mcm 2:08d850dd1cb8 93 *
mcm 2:08d850dd1cb8 94 *
mcm 2:08d850dd1cb8 95 * @author Manuel Caballero
mcm 2:08d850dd1cb8 96 * @date 17/September/2018
mcm 2:08d850dd1cb8 97 * @version 17/September/2018 The ORIGIN
mcm 2:08d850dd1cb8 98 * @pre N/A.
mcm 2:08d850dd1cb8 99 * @warning N/A.
mcm 2:08d850dd1cb8 100 */
mcm 2:08d850dd1cb8 101 MAX44009::MAX44009_status_t MAX44009::MAX44009_InterrupEnable ( MAX44009_interrupt_enable_ints_t myInterruptEnable )
mcm 2:08d850dd1cb8 102 {
mcm 2:08d850dd1cb8 103 char cmd[] = { 0U, 0U };
mcm 2:08d850dd1cb8 104 uint32_t aux;
mcm 2:08d850dd1cb8 105
mcm 2:08d850dd1cb8 106
mcm 2:08d850dd1cb8 107 /* Update the register */
mcm 2:08d850dd1cb8 108 cmd[0] = MAX44009_INTERRUPT_ENABLE;
mcm 2:08d850dd1cb8 109 cmd[1] = myInterruptEnable;
mcm 2:08d850dd1cb8 110 aux = _i2c.write ( _MAX44009_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:08d850dd1cb8 111
mcm 2:08d850dd1cb8 112
mcm 2:08d850dd1cb8 113
mcm 2:08d850dd1cb8 114 if ( aux == I2C_SUCCESS )
mcm 2:08d850dd1cb8 115 {
mcm 2:08d850dd1cb8 116 return MAX44009_SUCCESS;
mcm 2:08d850dd1cb8 117 }
mcm 2:08d850dd1cb8 118 else
mcm 2:08d850dd1cb8 119 {
mcm 2:08d850dd1cb8 120 return MAX44009_FAILURE;
mcm 2:08d850dd1cb8 121 }
mcm 2:08d850dd1cb8 122 }
mcm 2:08d850dd1cb8 123
mcm 2:08d850dd1cb8 124
mcm 2:08d850dd1cb8 125
mcm 2:08d850dd1cb8 126 /**
mcm 2:08d850dd1cb8 127 * @brief MAX44009_Configuration ( MAX44009_configuration_cont_t , MAX44009_configuration_manual_t , MAX44009_configuration_cdr_t , MAX44009_configuration_tim_t )
mcm 2:08d850dd1cb8 128 *
mcm 2:08d850dd1cb8 129 * @details It configures the device.
mcm 2:08d850dd1cb8 130 *
mcm 2:08d850dd1cb8 131 * @param[in] myContinuousMode: Default/Continuous mode.
mcm 2:08d850dd1cb8 132 * @param[in] myManualMode: Default/Manual mode.
mcm 2:08d850dd1cb8 133 * @param[in] myCurrentRatio: Current division ratio.
mcm 2:08d850dd1cb8 134 * @param[in] myIntegrationTime: Integration time.
mcm 2:08d850dd1cb8 135 *
mcm 2:08d850dd1cb8 136 * @param[out] N/A.
mcm 2:08d850dd1cb8 137 *
mcm 2:08d850dd1cb8 138 *
mcm 2:08d850dd1cb8 139 * @return Status of MAX44009_Configuration.
mcm 2:08d850dd1cb8 140 *
mcm 2:08d850dd1cb8 141 *
mcm 2:08d850dd1cb8 142 * @author Manuel Caballero
mcm 2:08d850dd1cb8 143 * @date 17/September/2018
mcm 2:08d850dd1cb8 144 * @version 17/September/2018 The ORIGIN
mcm 2:08d850dd1cb8 145 * @pre In automatic mode ( MANUAL = 0 ), reading the contents of TIM<2:0> and CDR bits reflects the automatically generated values from an internal timing register and are read-only.
mcm 2:08d850dd1cb8 146 * @warning N/A.
mcm 2:08d850dd1cb8 147 */
mcm 2:08d850dd1cb8 148 MAX44009::MAX44009_status_t MAX44009::MAX44009_Configuration ( MAX44009_configuration_cont_t myContinuousMode, MAX44009_configuration_manual_t myManualMode,
mcm 2:08d850dd1cb8 149 MAX44009_configuration_cdr_t myCurrentRatio, MAX44009_configuration_tim_t myIntegrationTime )
mcm 2:08d850dd1cb8 150 {
mcm 2:08d850dd1cb8 151 char cmd[] = { 0U, 0U };
mcm 2:08d850dd1cb8 152 uint32_t aux;
mcm 2:08d850dd1cb8 153
mcm 2:08d850dd1cb8 154
mcm 2:08d850dd1cb8 155 /* Update the register */
mcm 2:08d850dd1cb8 156 cmd[0] = MAX44009_CONFIGURATION;
mcm 2:08d850dd1cb8 157
mcm 2:08d850dd1cb8 158 /* In automatic mode ( MANUAL = 0 ), reading the contents of TIM<2:0> and CDR bits reflects the automatically generated values from an internal timing register and are read-only */
mcm 2:08d850dd1cb8 159 if ( myManualMode == CONFIGURATION_MANUAL_MANUAL_MODE )
mcm 2:08d850dd1cb8 160 {
mcm 2:08d850dd1cb8 161 cmd[1] = ( myContinuousMode | myManualMode | myCurrentRatio | myIntegrationTime );
mcm 2:08d850dd1cb8 162 }
mcm 2:08d850dd1cb8 163 else
mcm 2:08d850dd1cb8 164 {
mcm 2:08d850dd1cb8 165 cmd[1] = ( myContinuousMode | myManualMode );
mcm 2:08d850dd1cb8 166 }
mcm 2:08d850dd1cb8 167
mcm 2:08d850dd1cb8 168 /* Update the register */
mcm 2:08d850dd1cb8 169 aux = _i2c.write ( _MAX44009_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:08d850dd1cb8 170
mcm 2:08d850dd1cb8 171
mcm 2:08d850dd1cb8 172
mcm 2:08d850dd1cb8 173
mcm 2:08d850dd1cb8 174 if ( aux == I2C_SUCCESS )
mcm 2:08d850dd1cb8 175 {
mcm 2:08d850dd1cb8 176 return MAX44009_SUCCESS;
mcm 2:08d850dd1cb8 177 }
mcm 2:08d850dd1cb8 178 else
mcm 2:08d850dd1cb8 179 {
mcm 2:08d850dd1cb8 180 return MAX44009_FAILURE;
mcm 2:08d850dd1cb8 181 }
mcm 2:08d850dd1cb8 182 }
mcm 2:08d850dd1cb8 183
mcm 2:08d850dd1cb8 184
mcm 2:08d850dd1cb8 185
mcm 2:08d850dd1cb8 186 /**
mcm 2:08d850dd1cb8 187 * @brief MAX44009_GetCurrentDivisionRatio ( MAX44009_vector_data_t* )
mcm 2:08d850dd1cb8 188 *
mcm 2:08d850dd1cb8 189 * @details It gets the current division ratio.
mcm 2:08d850dd1cb8 190 *
mcm 2:08d850dd1cb8 191 * @param[in] N/A.
mcm 2:08d850dd1cb8 192 *
mcm 2:08d850dd1cb8 193 * @param[out] myCDR: Current Division Ratio value
mcm 2:08d850dd1cb8 194 *
mcm 2:08d850dd1cb8 195 *
mcm 2:08d850dd1cb8 196 * @return Status of MAX44009_GetCurrentDivisionRatio.
mcm 2:08d850dd1cb8 197 *
mcm 2:08d850dd1cb8 198 *
mcm 2:08d850dd1cb8 199 * @author Manuel Caballero
mcm 2:08d850dd1cb8 200 * @date 17/September/2018
mcm 2:08d850dd1cb8 201 * @version 17/September/2018 The ORIGIN
mcm 2:08d850dd1cb8 202 * @pre N/A.
mcm 2:08d850dd1cb8 203 * @warning N/A.
mcm 2:08d850dd1cb8 204 */
mcm 2:08d850dd1cb8 205 MAX44009::MAX44009_status_t MAX44009::MAX44009_GetCurrentDivisionRatio ( MAX44009_vector_data_t* myCDR )
mcm 2:08d850dd1cb8 206 {
mcm 2:08d850dd1cb8 207 char cmd = 0U;
mcm 2:08d850dd1cb8 208 uint32_t aux;
mcm 2:08d850dd1cb8 209
mcm 2:08d850dd1cb8 210
mcm 2:08d850dd1cb8 211 /* Read the CONFIGURATION register */
mcm 2:08d850dd1cb8 212 cmd = MAX44009_CONFIGURATION;
mcm 2:08d850dd1cb8 213 aux = _i2c.write ( _MAX44009_Addr, &cmd, 1U, true );
mcm 2:08d850dd1cb8 214 aux = _i2c.read ( _MAX44009_Addr, &cmd, 1U );
mcm 2:08d850dd1cb8 215
mcm 2:08d850dd1cb8 216 /* Parse the data */
mcm 2:08d850dd1cb8 217 myCDR->cdr = (MAX44009_configuration_cdr_t)( cmd & CONFIGURATION_CDR_MASK );
mcm 2:08d850dd1cb8 218
mcm 2:08d850dd1cb8 219
mcm 2:08d850dd1cb8 220
mcm 2:08d850dd1cb8 221 if ( aux == I2C_SUCCESS )
mcm 2:08d850dd1cb8 222 {
mcm 2:08d850dd1cb8 223 return MAX44009_SUCCESS;
mcm 2:08d850dd1cb8 224 }
mcm 2:08d850dd1cb8 225 else
mcm 2:08d850dd1cb8 226 {
mcm 2:08d850dd1cb8 227 return MAX44009_FAILURE;
mcm 2:08d850dd1cb8 228 }
mcm 2:08d850dd1cb8 229 }
mcm 2:08d850dd1cb8 230
mcm 2:08d850dd1cb8 231
mcm 2:08d850dd1cb8 232
mcm 2:08d850dd1cb8 233 /**
mcm 2:08d850dd1cb8 234 * @brief MAX44009_GetIntegrationTime ( MAX44009_vector_data_t* )
mcm 2:08d850dd1cb8 235 *
mcm 2:08d850dd1cb8 236 * @details It gets the integration time.
mcm 2:08d850dd1cb8 237 *
mcm 2:08d850dd1cb8 238 * @param[in] N/A.
mcm 2:08d850dd1cb8 239 *
mcm 2:08d850dd1cb8 240 * @param[out] myTIM: Integration Time value
mcm 2:08d850dd1cb8 241 *
mcm 2:08d850dd1cb8 242 *
mcm 2:08d850dd1cb8 243 * @return Status of MAX44009_GetIntegrationTime.
mcm 2:08d850dd1cb8 244 *
mcm 2:08d850dd1cb8 245 *
mcm 2:08d850dd1cb8 246 * @author Manuel Caballero
mcm 2:08d850dd1cb8 247 * @date 17/September/2018
mcm 2:08d850dd1cb8 248 * @version 17/September/2018 The ORIGIN
mcm 2:08d850dd1cb8 249 * @pre N/A.
mcm 2:08d850dd1cb8 250 * @warning N/A.
mcm 2:08d850dd1cb8 251 */
mcm 2:08d850dd1cb8 252 MAX44009::MAX44009_status_t MAX44009::MAX44009_GetIntegrationTime ( MAX44009_vector_data_t* myTIM )
mcm 2:08d850dd1cb8 253 {
mcm 2:08d850dd1cb8 254 char cmd = 0U;
mcm 2:08d850dd1cb8 255 uint32_t aux;
mcm 2:08d850dd1cb8 256
mcm 2:08d850dd1cb8 257
mcm 2:08d850dd1cb8 258 /* Read the CONFIGURATION register */
mcm 2:08d850dd1cb8 259 cmd = MAX44009_CONFIGURATION;
mcm 2:08d850dd1cb8 260 aux = _i2c.write ( _MAX44009_Addr, &cmd, 1U, true );
mcm 2:08d850dd1cb8 261 aux = _i2c.read ( _MAX44009_Addr, &cmd, 1U );
mcm 2:08d850dd1cb8 262
mcm 2:08d850dd1cb8 263 /* Parse the data */
mcm 2:08d850dd1cb8 264 myTIM->tim = (MAX44009_configuration_tim_t)( cmd & CONFIGURATION_TIM_MASK );
mcm 2:08d850dd1cb8 265
mcm 2:08d850dd1cb8 266
mcm 2:08d850dd1cb8 267
mcm 2:08d850dd1cb8 268 if ( aux == I2C_SUCCESS )
mcm 2:08d850dd1cb8 269 {
mcm 2:08d850dd1cb8 270 return MAX44009_SUCCESS;
mcm 2:08d850dd1cb8 271 }
mcm 2:08d850dd1cb8 272 else
mcm 2:08d850dd1cb8 273 {
mcm 2:08d850dd1cb8 274 return MAX44009_FAILURE;
mcm 2:08d850dd1cb8 275 }
mcm 2:08d850dd1cb8 276 }
mcm 2:08d850dd1cb8 277
mcm 2:08d850dd1cb8 278
mcm 2:08d850dd1cb8 279
mcm 2:08d850dd1cb8 280 /**
mcm 2:08d850dd1cb8 281 * @brief MAX44009_GetLux ( MAX44009_device_resolution_t , MAX44009_vector_data_t* )
mcm 2:08d850dd1cb8 282 *
mcm 2:08d850dd1cb8 283 * @details It gets the Lux value regarding of the resolution.
mcm 2:08d850dd1cb8 284 *
mcm 2:08d850dd1cb8 285 * @param[in] myResolution: Resolution.
mcm 2:08d850dd1cb8 286 *
mcm 2:08d850dd1cb8 287 * @param[out] myLux: Lux value
mcm 2:08d850dd1cb8 288 *
mcm 2:08d850dd1cb8 289 *
mcm 2:08d850dd1cb8 290 * @return Status of MAX44009_GetLux.
mcm 2:08d850dd1cb8 291 *
mcm 2:08d850dd1cb8 292 *
mcm 2:08d850dd1cb8 293 * @author Manuel Caballero
mcm 2:08d850dd1cb8 294 * @date 17/September/2018
mcm 2:08d850dd1cb8 295 * @version 17/September/2018 The ORIGIN
mcm 2:08d850dd1cb8 296 * @pre N/A.
mcm 2:08d850dd1cb8 297 * @warning N/A.
mcm 2:08d850dd1cb8 298 */
mcm 2:08d850dd1cb8 299 MAX44009::MAX44009_status_t MAX44009::MAX44009_GetLux ( MAX44009_device_resolution_t myResolution, MAX44009_vector_data_t* myLux )
mcm 2:08d850dd1cb8 300 {
mcm 2:08d850dd1cb8 301 char cmd = 0U;
mcm 2:08d850dd1cb8 302 uint8_t exponent = 0U;
mcm 2:08d850dd1cb8 303 uint8_t mantissa = 0U;
mcm 2:08d850dd1cb8 304 float mulFactor = 0.0f;
mcm 2:08d850dd1cb8 305 uint32_t aux;
mcm 2:08d850dd1cb8 306
mcm 2:08d850dd1cb8 307
mcm 2:08d850dd1cb8 308 /* Read the LUX HIGH BYTE register */
mcm 2:08d850dd1cb8 309 cmd = MAX44009_LUX_HIGH_BYTE;
mcm 2:08d850dd1cb8 310 aux = _i2c.write ( _MAX44009_Addr, &cmd, 1U, true );
mcm 2:08d850dd1cb8 311 aux = _i2c.read ( _MAX44009_Addr, &cmd, 1U );
mcm 2:08d850dd1cb8 312
mcm 2:08d850dd1cb8 313
mcm 2:08d850dd1cb8 314 /* Check the resolution */
mcm 2:08d850dd1cb8 315 exponent = ( cmd & LUX_HIGH_BYTE_EXPONENT_MASK );
mcm 2:08d850dd1cb8 316 exponent >>= 4U;
mcm 2:08d850dd1cb8 317 mantissa = ( cmd & LUX_HIGH_BYTE_MANTISSA_MASK );
mcm 2:08d850dd1cb8 318 if ( myResolution == RESOLUTION_NORMAL_RESOLUTION )
mcm 2:08d850dd1cb8 319 {
mcm 2:08d850dd1cb8 320 mulFactor = 0.72f;
mcm 2:08d850dd1cb8 321 }
mcm 2:08d850dd1cb8 322 else
mcm 2:08d850dd1cb8 323 {
mcm 2:08d850dd1cb8 324 cmd = MAX44009_LUX_LOW_BYTE;
mcm 2:08d850dd1cb8 325 aux = _i2c.write ( _MAX44009_Addr, &cmd, 1U, true );
mcm 2:08d850dd1cb8 326 aux = _i2c.read ( _MAX44009_Addr, &cmd, 1U );
mcm 2:08d850dd1cb8 327
mcm 2:08d850dd1cb8 328 mantissa <<= 4U;
mcm 2:08d850dd1cb8 329 mantissa |= ( cmd & LUX_LOW_BYTE_MANTISSA_MASK );
mcm 2:08d850dd1cb8 330
mcm 2:08d850dd1cb8 331 mulFactor = 0.045f;
mcm 2:08d850dd1cb8 332 }
mcm 2:08d850dd1cb8 333
mcm 2:08d850dd1cb8 334
mcm 2:08d850dd1cb8 335 /* Calculate the Lux value */
mcm 2:08d850dd1cb8 336 myLux->lux = (float)( pow( 2.0, exponent ) * mantissa * mulFactor );
mcm 2:08d850dd1cb8 337
mcm 2:08d850dd1cb8 338
mcm 2:08d850dd1cb8 339
mcm 2:08d850dd1cb8 340
mcm 2:08d850dd1cb8 341 if ( aux == I2C_SUCCESS )
mcm 2:08d850dd1cb8 342 {
mcm 2:08d850dd1cb8 343 return MAX44009_SUCCESS;
mcm 2:08d850dd1cb8 344 }
mcm 2:08d850dd1cb8 345 else
mcm 2:08d850dd1cb8 346 {
mcm 2:08d850dd1cb8 347 return MAX44009_FAILURE;
mcm 2:08d850dd1cb8 348 }
mcm 2:08d850dd1cb8 349 }
mcm 2:08d850dd1cb8 350
mcm 2:08d850dd1cb8 351
mcm 2:08d850dd1cb8 352
mcm 2:08d850dd1cb8 353 /**
mcm 2:08d850dd1cb8 354 * @brief MAX44009_SetUpperThreshold ( MAX44009_vector_data_t )
mcm 2:08d850dd1cb8 355 *
mcm 2:08d850dd1cb8 356 * @details It sets the upper threshold high-byte.
mcm 2:08d850dd1cb8 357 *
mcm 2:08d850dd1cb8 358 * @param[in] myUpperThreshold: Upper threshold Lux value.
mcm 2:08d850dd1cb8 359 *
mcm 2:08d850dd1cb8 360 * @param[out] N/A
mcm 2:08d850dd1cb8 361 *
mcm 2:08d850dd1cb8 362 *
mcm 2:08d850dd1cb8 363 * @return Status of MAX44009_SetUpperThreshold.
mcm 2:08d850dd1cb8 364 *
mcm 2:08d850dd1cb8 365 *
mcm 2:08d850dd1cb8 366 * @author Manuel Caballero
mcm 2:08d850dd1cb8 367 * @date 17/September/2018
mcm 2:08d850dd1cb8 368 * @version 17/September/2018 The ORIGIN
mcm 2:08d850dd1cb8 369 * @pre The Upper Threshold High-Byte register exponent with the four most significant bits of the mantissa sets the upper trip
mcm 2:08d850dd1cb8 370 * level for interrupt functionality.
mcm 2:08d850dd1cb8 371 *
mcm 2:08d850dd1cb8 372 * Upper lux threshold = 2^( exponent ) x mantissa x 0.045
mcm 2:08d850dd1cb8 373 *
mcm 2:08d850dd1cb8 374 * exponent: BITS<7:4>, mantissa: BITS<3:0>
mcm 2:08d850dd1cb8 375 * @warning N/A.
mcm 2:08d850dd1cb8 376 */
mcm 2:08d850dd1cb8 377 MAX44009::MAX44009_status_t MAX44009::MAX44009_SetUpperThreshold ( MAX44009_vector_data_t myUpperThreshold )
mcm 2:08d850dd1cb8 378 {
mcm 2:08d850dd1cb8 379 char cmd[] = { 0U, 0U };
mcm 2:08d850dd1cb8 380 uint32_t aux;
mcm 2:08d850dd1cb8 381
mcm 2:08d850dd1cb8 382
mcm 2:08d850dd1cb8 383 /* Update the register value */
mcm 2:08d850dd1cb8 384 cmd[0] = MAX44009_UPPER_THRESHOLD_HIGH_BYTE;
mcm 2:08d850dd1cb8 385 cmd[1] = myUpperThreshold.lux_upper_threshold;
mcm 2:08d850dd1cb8 386 aux = _i2c.write ( _MAX44009_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:08d850dd1cb8 387
mcm 2:08d850dd1cb8 388
mcm 2:08d850dd1cb8 389
mcm 2:08d850dd1cb8 390
mcm 2:08d850dd1cb8 391 if ( aux == I2C_SUCCESS )
mcm 2:08d850dd1cb8 392 {
mcm 2:08d850dd1cb8 393 return MAX44009_SUCCESS;
mcm 2:08d850dd1cb8 394 }
mcm 2:08d850dd1cb8 395 else
mcm 2:08d850dd1cb8 396 {
mcm 2:08d850dd1cb8 397 return MAX44009_FAILURE;
mcm 2:08d850dd1cb8 398 }
mcm 2:08d850dd1cb8 399 }
mcm 2:08d850dd1cb8 400
mcm 2:08d850dd1cb8 401
mcm 2:08d850dd1cb8 402
mcm 2:08d850dd1cb8 403 /**
mcm 2:08d850dd1cb8 404 * @brief MAX44009_SetLowerThreshold ( MAX44009_vector_data_t )
mcm 2:08d850dd1cb8 405 *
mcm 2:08d850dd1cb8 406 * @details It sets the lower threshold high-byte.
mcm 2:08d850dd1cb8 407 *
mcm 2:08d850dd1cb8 408 * @param[in] myLowerThreshold: Lower threshold Lux value.
mcm 2:08d850dd1cb8 409 *
mcm 2:08d850dd1cb8 410 * @param[out] N/A
mcm 2:08d850dd1cb8 411 *
mcm 2:08d850dd1cb8 412 *
mcm 2:08d850dd1cb8 413 * @return Status of MAX44009_SetLowerThreshold.
mcm 2:08d850dd1cb8 414 *
mcm 2:08d850dd1cb8 415 *
mcm 2:08d850dd1cb8 416 * @author Manuel Caballero
mcm 2:08d850dd1cb8 417 * @date 17/September/2018
mcm 2:08d850dd1cb8 418 * @version 17/September/2018 The ORIGIN
mcm 2:08d850dd1cb8 419 * @pre The Lower Threshold High-Byte register exponent with the four most significant bits of the mantissa sets the lower trip
mcm 2:08d850dd1cb8 420 * level for interrupt functionality.
mcm 2:08d850dd1cb8 421 *
mcm 2:08d850dd1cb8 422 * Lower lux threshold = 2^( exponent ) x mantissa x 0.045
mcm 2:08d850dd1cb8 423 *
mcm 2:08d850dd1cb8 424 * exponent: BITS<7:4>, mantissa: BITS<3:0>
mcm 2:08d850dd1cb8 425 * @warning N/A.
mcm 2:08d850dd1cb8 426 */
mcm 2:08d850dd1cb8 427 MAX44009::MAX44009_status_t MAX44009::MAX44009_SetLowerThreshold ( MAX44009_vector_data_t myLowerThreshold )
mcm 2:08d850dd1cb8 428 {
mcm 2:08d850dd1cb8 429 char cmd[] = { 0U, 0U };
mcm 2:08d850dd1cb8 430 uint32_t aux;
mcm 2:08d850dd1cb8 431
mcm 2:08d850dd1cb8 432
mcm 2:08d850dd1cb8 433 /* Update the register value */
mcm 2:08d850dd1cb8 434 cmd[0] = MAX44009_LOWER_THRESHOLD_HIGH_BYTE;
mcm 2:08d850dd1cb8 435 cmd[1] = myLowerThreshold.lux_lower_threshold;
mcm 2:08d850dd1cb8 436 aux = _i2c.write ( _MAX44009_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:08d850dd1cb8 437
mcm 2:08d850dd1cb8 438
mcm 2:08d850dd1cb8 439
mcm 2:08d850dd1cb8 440
mcm 2:08d850dd1cb8 441 if ( aux == I2C_SUCCESS )
mcm 2:08d850dd1cb8 442 {
mcm 2:08d850dd1cb8 443 return MAX44009_SUCCESS;
mcm 2:08d850dd1cb8 444 }
mcm 2:08d850dd1cb8 445 else
mcm 2:08d850dd1cb8 446 {
mcm 2:08d850dd1cb8 447 return MAX44009_FAILURE;
mcm 2:08d850dd1cb8 448 }
mcm 2:08d850dd1cb8 449 }
mcm 2:08d850dd1cb8 450
mcm 2:08d850dd1cb8 451
mcm 2:08d850dd1cb8 452
mcm 2:08d850dd1cb8 453 /**
mcm 2:08d850dd1cb8 454 * @brief MAX44009_GetUpperThreshold ( MAX44009_vector_data_t* )
mcm 2:08d850dd1cb8 455 *
mcm 2:08d850dd1cb8 456 * @details It gets the upper threshold high-byte.
mcm 2:08d850dd1cb8 457 *
mcm 2:08d850dd1cb8 458 * @param[in] N/A.
mcm 2:08d850dd1cb8 459 *
mcm 2:08d850dd1cb8 460 * @param[out] myUpperThreshold: Upper threshold raw data
mcm 2:08d850dd1cb8 461 *
mcm 2:08d850dd1cb8 462 *
mcm 2:08d850dd1cb8 463 * @return Status of MAX44009_GetUpperThreshold.
mcm 2:08d850dd1cb8 464 *
mcm 2:08d850dd1cb8 465 *
mcm 2:08d850dd1cb8 466 * @author Manuel Caballero
mcm 2:08d850dd1cb8 467 * @date 17/September/2018
mcm 2:08d850dd1cb8 468 * @version 17/September/2018 The ORIGIN
mcm 2:08d850dd1cb8 469 * @pre The Upper Threshold High-Byte register exponent with the four most significant bits of the mantissa sets the upper trip
mcm 2:08d850dd1cb8 470 * level for interrupt functionality.
mcm 2:08d850dd1cb8 471 *
mcm 2:08d850dd1cb8 472 * Upper lux threshold = 2^( exponent ) x mantissa x 0.045
mcm 2:08d850dd1cb8 473 *
mcm 2:08d850dd1cb8 474 * exponent: BITS<7:4>, mantissa: BITS<3:0>
mcm 2:08d850dd1cb8 475 * @warning N/A.
mcm 2:08d850dd1cb8 476 */
mcm 2:08d850dd1cb8 477 MAX44009::MAX44009_status_t MAX44009::MAX44009_GetUpperThreshold ( MAX44009_vector_data_t* myUpperThreshold )
mcm 2:08d850dd1cb8 478 {
mcm 2:08d850dd1cb8 479 char cmd = 0U;
mcm 2:08d850dd1cb8 480 uint32_t aux;
mcm 2:08d850dd1cb8 481
mcm 2:08d850dd1cb8 482
mcm 2:08d850dd1cb8 483 /* Get the register value */
mcm 2:08d850dd1cb8 484 cmd = MAX44009_UPPER_THRESHOLD_HIGH_BYTE;
mcm 2:08d850dd1cb8 485 aux = _i2c.write ( _MAX44009_Addr, &cmd, 1U, true );
mcm 2:08d850dd1cb8 486 aux = _i2c.read ( _MAX44009_Addr, (char*)&myUpperThreshold->lux_upper_threshold, 1U );
mcm 2:08d850dd1cb8 487
mcm 2:08d850dd1cb8 488
mcm 2:08d850dd1cb8 489
mcm 2:08d850dd1cb8 490 if ( aux == I2C_SUCCESS )
mcm 2:08d850dd1cb8 491 {
mcm 2:08d850dd1cb8 492 return MAX44009_SUCCESS;
mcm 2:08d850dd1cb8 493 }
mcm 2:08d850dd1cb8 494 else
mcm 2:08d850dd1cb8 495 {
mcm 2:08d850dd1cb8 496 return MAX44009_FAILURE;
mcm 2:08d850dd1cb8 497 }
mcm 2:08d850dd1cb8 498 }
mcm 2:08d850dd1cb8 499
mcm 2:08d850dd1cb8 500
mcm 2:08d850dd1cb8 501
mcm 2:08d850dd1cb8 502 /**
mcm 2:08d850dd1cb8 503 * @brief MAX44009_GetLowerThreshold ( MAX44009_vector_data_t* )
mcm 2:08d850dd1cb8 504 *
mcm 2:08d850dd1cb8 505 * @details It gets the lower threshold high-byte.
mcm 2:08d850dd1cb8 506 *
mcm 2:08d850dd1cb8 507 * @param[in] N/A.
mcm 2:08d850dd1cb8 508 *
mcm 2:08d850dd1cb8 509 * @param[out] myLowerThreshold: Lower threshold raw data
mcm 2:08d850dd1cb8 510 *
mcm 2:08d850dd1cb8 511 *
mcm 2:08d850dd1cb8 512 * @return Status of MAX44009_GetLowerThreshold.
mcm 2:08d850dd1cb8 513 *
mcm 2:08d850dd1cb8 514 *
mcm 2:08d850dd1cb8 515 * @author Manuel Caballero
mcm 2:08d850dd1cb8 516 * @date 17/September/2018
mcm 2:08d850dd1cb8 517 * @version 17/September/2018 The ORIGIN
mcm 2:08d850dd1cb8 518 * @pre The Lower Threshold High-Byte register exponent with the four most significant bits of the mantissa sets the lower trip
mcm 2:08d850dd1cb8 519 * level for interrupt functionality.
mcm 2:08d850dd1cb8 520 *
mcm 2:08d850dd1cb8 521 * Lower lux threshold = 2^( exponent ) x mantissa x 0.045
mcm 2:08d850dd1cb8 522 *
mcm 2:08d850dd1cb8 523 * exponent: BITS<7:4>, mantissa: BITS<3:0>
mcm 2:08d850dd1cb8 524 * @warning N/A.
mcm 2:08d850dd1cb8 525 */
mcm 2:08d850dd1cb8 526 MAX44009::MAX44009_status_t MAX44009::MAX44009_GetLowerThreshold ( MAX44009_vector_data_t* myLowerThreshold )
mcm 2:08d850dd1cb8 527 {
mcm 2:08d850dd1cb8 528 char cmd = 0U;
mcm 2:08d850dd1cb8 529 uint32_t aux;
mcm 2:08d850dd1cb8 530
mcm 2:08d850dd1cb8 531
mcm 2:08d850dd1cb8 532 /* Get the register value */
mcm 2:08d850dd1cb8 533 cmd = MAX44009_LOWER_THRESHOLD_HIGH_BYTE;
mcm 2:08d850dd1cb8 534 aux = _i2c.write ( _MAX44009_Addr, &cmd, 1U, true );
mcm 2:08d850dd1cb8 535 aux = _i2c.read ( _MAX44009_Addr, (char*)&myLowerThreshold->lux_lower_threshold, 1U );
mcm 2:08d850dd1cb8 536
mcm 2:08d850dd1cb8 537
mcm 2:08d850dd1cb8 538
mcm 2:08d850dd1cb8 539 if ( aux == I2C_SUCCESS )
mcm 2:08d850dd1cb8 540 {
mcm 2:08d850dd1cb8 541 return MAX44009_SUCCESS;
mcm 2:08d850dd1cb8 542 }
mcm 2:08d850dd1cb8 543 else
mcm 2:08d850dd1cb8 544 {
mcm 2:08d850dd1cb8 545 return MAX44009_FAILURE;
mcm 2:08d850dd1cb8 546 }
mcm 2:08d850dd1cb8 547 }
mcm 2:08d850dd1cb8 548
mcm 2:08d850dd1cb8 549
mcm 2:08d850dd1cb8 550
mcm 2:08d850dd1cb8 551 /**
mcm 2:08d850dd1cb8 552 * @brief MAX44009_SetThresholdTimer ( MAX44009_vector_data_t )
mcm 2:08d850dd1cb8 553 *
mcm 2:08d850dd1cb8 554 * @details It sets the threshold timer register.
mcm 2:08d850dd1cb8 555 *
mcm 2:08d850dd1cb8 556 * @param[in] myThresholdTimer_us: Time delay in us.
mcm 2:08d850dd1cb8 557 *
mcm 2:08d850dd1cb8 558 * @param[out] N/A
mcm 2:08d850dd1cb8 559 *
mcm 2:08d850dd1cb8 560 *
mcm 2:08d850dd1cb8 561 * @return Status of MAX44009_SetThresholdTimer.
mcm 2:08d850dd1cb8 562 *
mcm 2:08d850dd1cb8 563 *
mcm 2:08d850dd1cb8 564 * @author Manuel Caballero
mcm 2:08d850dd1cb8 565 * @date 17/September/2018
mcm 2:08d850dd1cb8 566 * @version 17/September/2018 The ORIGIN
mcm 2:08d850dd1cb8 567 * @pre The value in this register sets the time used to control this delay
mcm 2:08d850dd1cb8 568 *
mcm 2:08d850dd1cb8 569 * Time delay = ( 128xT7 + 64xT6 + 32xT5 + 16xT4 + 8xT3 + 4xT2 + 2xT1 + T0 ) x 100ms
mcm 2:08d850dd1cb8 570 *
mcm 2:08d850dd1cb8 571 * @warning N/A.
mcm 2:08d850dd1cb8 572 */
mcm 2:08d850dd1cb8 573 MAX44009::MAX44009_status_t MAX44009::MAX44009_SetThresholdTimer ( MAX44009_vector_data_t myThresholdTimer_us )
mcm 2:08d850dd1cb8 574 {
mcm 2:08d850dd1cb8 575 char cmd[] = { 0U, 0U };
mcm 2:08d850dd1cb8 576 uint32_t aux;
mcm 2:08d850dd1cb8 577
mcm 2:08d850dd1cb8 578
mcm 2:08d850dd1cb8 579 /* Maximum delay is 25.5ms */
mcm 2:08d850dd1cb8 580 if ( myThresholdTimer_us.threshold_timer_us > 25500U )
mcm 2:08d850dd1cb8 581 {
mcm 2:08d850dd1cb8 582 return MAX44009_FAILURE;
mcm 2:08d850dd1cb8 583 }
mcm 2:08d850dd1cb8 584
mcm 2:08d850dd1cb8 585
mcm 2:08d850dd1cb8 586 /* Update the register value */
mcm 2:08d850dd1cb8 587 cmd[0] = MAX44009_THRESHOLD_TIMER;
mcm 2:08d850dd1cb8 588 cmd[1] = ( myThresholdTimer_us.threshold_timer_us / 100U );
mcm 2:08d850dd1cb8 589 aux = _i2c.write ( _MAX44009_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 2:08d850dd1cb8 590
mcm 2:08d850dd1cb8 591
mcm 2:08d850dd1cb8 592
mcm 2:08d850dd1cb8 593
mcm 2:08d850dd1cb8 594 if ( aux == I2C_SUCCESS )
mcm 2:08d850dd1cb8 595 {
mcm 2:08d850dd1cb8 596 return MAX44009_SUCCESS;
mcm 2:08d850dd1cb8 597 }
mcm 2:08d850dd1cb8 598 else
mcm 2:08d850dd1cb8 599 {
mcm 2:08d850dd1cb8 600 return MAX44009_FAILURE;
mcm 2:08d850dd1cb8 601 }
mcm 2:08d850dd1cb8 602 }
mcm 2:08d850dd1cb8 603
mcm 2:08d850dd1cb8 604
mcm 2:08d850dd1cb8 605
mcm 2:08d850dd1cb8 606 /**
mcm 2:08d850dd1cb8 607 * @brief MAX44009_GetThresholdTimer ( MAX44009_vector_data_t* )
mcm 2:08d850dd1cb8 608 *
mcm 2:08d850dd1cb8 609 * @details It gets the threshold timer register.
mcm 2:08d850dd1cb8 610 *
mcm 2:08d850dd1cb8 611 * @param[in] N/A.
mcm 2:08d850dd1cb8 612 *
mcm 2:08d850dd1cb8 613 * @param[out] myThresholdTimer_us: Time delay in us.
mcm 2:08d850dd1cb8 614 *
mcm 2:08d850dd1cb8 615 *
mcm 2:08d850dd1cb8 616 * @return Status of MAX44009_GetThresholdTimer.
mcm 2:08d850dd1cb8 617 *
mcm 2:08d850dd1cb8 618 *
mcm 2:08d850dd1cb8 619 * @author Manuel Caballero
mcm 2:08d850dd1cb8 620 * @date 17/September/2018
mcm 2:08d850dd1cb8 621 * @version 17/September/2018 The ORIGIN
mcm 2:08d850dd1cb8 622 * @pre The value in this register gets the time used to control this delay
mcm 2:08d850dd1cb8 623 *
mcm 2:08d850dd1cb8 624 * Time delay = ( 128xT7 + 64xT6 + 32xT5 + 16xT4 + 8xT3 + 4xT2 + 2xT1 + T0 ) x 100ms
mcm 2:08d850dd1cb8 625 *
mcm 2:08d850dd1cb8 626 * @warning N/A.
mcm 2:08d850dd1cb8 627 */
mcm 2:08d850dd1cb8 628 MAX44009::MAX44009_status_t MAX44009::MAX44009_GetThresholdTimer ( MAX44009_vector_data_t* myThresholdTimer_us )
mcm 2:08d850dd1cb8 629 {
mcm 2:08d850dd1cb8 630 char cmd = 0U;
mcm 2:08d850dd1cb8 631 uint32_t aux;
mcm 2:08d850dd1cb8 632
mcm 2:08d850dd1cb8 633
mcm 2:08d850dd1cb8 634 /* Get the register value */
mcm 2:08d850dd1cb8 635 cmd = MAX44009_THRESHOLD_TIMER;
mcm 2:08d850dd1cb8 636 aux = _i2c.write ( _MAX44009_Addr, &cmd, 1U, true );
mcm 2:08d850dd1cb8 637 aux = _i2c.read ( _MAX44009_Addr, &cmd, 1U );
mcm 2:08d850dd1cb8 638
mcm 2:08d850dd1cb8 639
mcm 2:08d850dd1cb8 640 /* Parse the data */
mcm 2:08d850dd1cb8 641 myThresholdTimer_us->threshold_timer_us = ( (uint16_t)cmd * 100U );
mcm 2:08d850dd1cb8 642
mcm 2:08d850dd1cb8 643
mcm 2:08d850dd1cb8 644
mcm 2:08d850dd1cb8 645
mcm 2:08d850dd1cb8 646 if ( aux == I2C_SUCCESS )
mcm 2:08d850dd1cb8 647 {
mcm 2:08d850dd1cb8 648 return MAX44009_SUCCESS;
mcm 2:08d850dd1cb8 649 }
mcm 2:08d850dd1cb8 650 else
mcm 2:08d850dd1cb8 651 {
mcm 2:08d850dd1cb8 652 return MAX44009_FAILURE;
mcm 2:08d850dd1cb8 653 }
mcm 2:08d850dd1cb8 654 }