@@ -408,7 +408,19 @@ class SfeAS7331Base {
408408 if (SFE_BUS_OK != result)
409409 return result;
410410
411- measures.uva = ((float )((uint16_t )((uint16_t )uvaRaw[1 ] << 8 | uvaRaw[0 ]))-1 .0f )*_conversionA;
411+ if (_state.mmode == MEAS_MODE_SYND) {
412+ result = readOutConv ();
413+
414+ if (SFE_BUS_OK != result)
415+ return result;
416+
417+ float divFactor = (bool )_config.dividerEnabled ? (float )(1 << (1 +_config.dividerRange )) : 1 .0f ;
418+ float convFactor = ((float )measures.outputConversionTime )*((float )(1 << (11 - _config.sensorGain )));
419+ measures.uva = (float )((uint16_t )(((uint16_t )uvaRaw[1 ]) << 8 | uvaRaw[0 ])-1 .0f )*fsrA*divFactor/convFactor;
420+ }
421+ else {
422+ measures.uva = (float )((uint16_t )(((uint16_t )uvaRaw[1 ]) << 8 | uvaRaw[0 ])-1 .0f )*_conversionA;
423+ }
412424
413425 return SFE_BUS_OK;
414426 }
@@ -424,7 +436,19 @@ class SfeAS7331Base {
424436 if (SFE_BUS_OK != result)
425437 return result;
426438
427- measures.uvb = ((float )((uint16_t )((uint16_t )uvbRaw[1 ] << 8 | uvbRaw[0 ]))-1 .0f )*_conversionB;
439+ if (_state.mmode == MEAS_MODE_SYND) {
440+ result = readOutConv ();
441+
442+ if (SFE_BUS_OK != result)
443+ return result;
444+
445+ float divFactor = (bool )_config.dividerEnabled ? (float )(1 << (1 +_config.dividerRange )) : 1 .0f ;
446+ float convFactor = ((float )measures.outputConversionTime )*((float )(1 << (11 - _config.sensorGain )));
447+ measures.uvb = (float )((uint16_t )(((uint16_t )uvbRaw[1 ]) << 8 | uvbRaw[0 ])-1 .0f )*fsrB*divFactor/convFactor;
448+ }
449+ else {
450+ measures.uvb = (float )((uint16_t )(((uint16_t )uvbRaw[1 ]) << 8 | uvbRaw[0 ])-1 .0f )*_conversionB;
451+ }
428452
429453 return SFE_BUS_OK;
430454 }
@@ -440,7 +464,19 @@ class SfeAS7331Base {
440464 if (SFE_BUS_OK != result)
441465 return result;
442466
443- measures.uvc = ((float )((uint16_t )((uint16_t )uvcRaw[1 ] << 8 | uvcRaw[0 ]))-1 .0f )*_conversionC;
467+ if (_state.mmode == MEAS_MODE_SYND) {
468+ result = readOutConv ();
469+
470+ if (SFE_BUS_OK != result)
471+ return result;
472+
473+ float divFactor = (bool )_config.dividerEnabled ? (float )(1 << (1 +_config.dividerRange )) : 1 .0f ;
474+ float convFactor = ((float )measures.outputConversionTime )*((float )(1 << (11 - _config.sensorGain )));
475+ measures.uvc = (float )((uint16_t )(((uint16_t )uvcRaw[1 ]) << 8 | uvcRaw[0 ])-1 .0f )*fsrC*divFactor/convFactor;
476+ }
477+ else {
478+ measures.uvc = (float )((uint16_t )(((uint16_t )uvcRaw[1 ]) << 8 | uvcRaw[0 ])-1 .0f )*_conversionC;
479+ }
444480
445481 return SFE_BUS_OK;
446482 }
@@ -456,9 +492,23 @@ class SfeAS7331Base {
456492 if (SFE_BUS_OK != result)
457493 return result;
458494
459- measures.uva = (float )((uint16_t )(((uint16_t )dataRaw[1 ]) << 8 | dataRaw[0 ])-1 .0f )*_conversionA;
460- measures.uvb = (float )((uint16_t )(((uint16_t )dataRaw[3 ]) << 8 | dataRaw[2 ])-1 .0f )*_conversionB;
461- measures.uvc = (float )((uint16_t )(((uint16_t )dataRaw[5 ]) << 8 | dataRaw[4 ])-1 .0f )*_conversionC;
495+ if (_state.mmode == MEAS_MODE_SYND) {
496+ result = readOutConv ();
497+
498+ if (SFE_BUS_OK != result)
499+ return result;
500+
501+ float divFactor = (bool )_config.dividerEnabled ? (float )(1 << (1 +_config.dividerRange )) : 1 .0f ;
502+ float convFactor = ((float )measures.outputConversionTime )*((float )(1 << (11 - _config.sensorGain )));
503+ measures.uva = (float )((uint16_t )(((uint16_t )dataRaw[1 ]) << 8 | dataRaw[0 ])-1 .0f )*fsrA*divFactor/convFactor;
504+ measures.uvb = (float )((uint16_t )(((uint16_t )dataRaw[3 ]) << 8 | dataRaw[2 ])-1 .0f )*fsrB*divFactor/convFactor;
505+ measures.uvc = (float )((uint16_t )(((uint16_t )dataRaw[5 ]) << 8 | dataRaw[4 ])-1 .0f )*fsrC*divFactor/convFactor;
506+ }
507+ else {
508+ measures.uva = (float )((uint16_t )(((uint16_t )dataRaw[1 ]) << 8 | dataRaw[0 ])-1 .0f )*_conversionA;
509+ measures.uvb = (float )((uint16_t )(((uint16_t )dataRaw[3 ]) << 8 | dataRaw[2 ])-1 .0f )*_conversionB;
510+ measures.uvc = (float )((uint16_t )(((uint16_t )dataRaw[5 ]) << 8 | dataRaw[4 ])-1 .0f )*_conversionC;
511+ }
462512
463513 return SFE_BUS_OK;
464514 }
@@ -467,18 +517,31 @@ class SfeAS7331Base {
467517 // / @return 0 if successful, negative if error, positive for warning.
468518 int8_t readAll (void )
469519 {
470- uint8_t dataRaw[12 ];
520+ uint8_t dataRaw[8 ];
471521
472- int8_t result = readRegister (SFE_AS7331_REGISTER_MEAS_TEMP, dataRaw, 12U );
522+ int8_t result = readRegister (SFE_AS7331_REGISTER_MEAS_TEMP, dataRaw, 8U );
473523
474524 if (SFE_BUS_OK != result)
475525 return result;
476526
477- measures.uva = (float )((uint16_t )(((uint16_t )dataRaw[1 ]) << 8 | dataRaw[0 ]))*_conversionA;
478- measures.uvb = (float )((uint16_t )(((uint16_t )dataRaw[3 ]) << 8 | dataRaw[2 ]))*_conversionB;
479- measures.uvc = (float )((uint16_t )(((uint16_t )dataRaw[5 ]) << 8 | dataRaw[4 ]))*_conversionC;
480- measures.temperature = convertRawTempToTempC ((uint16_t )(((uint16_t )dataRaw[7 ] << 8 | dataRaw[6 ])));
481- measures.outputConversionTime = (uint32_t )(((uint32_t )dataRaw[11 ] << 24 ) | ((uint32_t )dataRaw[10 ] << 16 ) | ((uint32_t )dataRaw[9 ] << 8 ) | dataRaw[8 ]);
527+ result = readOutConv ();
528+ if (SFE_BUS_OK != result)
529+ return result;
530+
531+ if (_state.mmode == MEAS_MODE_SYND) {
532+ float divFactor = (bool )_config.dividerEnabled ? (float )(1 << (1 +_config.dividerRange )) : 1 .0f ;
533+ float convFactor = ((float )measures.outputConversionTime )*((float )(1 << (11 - _config.sensorGain )));
534+ measures.uva = (float )((uint16_t )(((uint16_t )dataRaw[3 ]) << 8 | dataRaw[2 ])-1 .0f )*fsrA*divFactor/convFactor;
535+ measures.uvb = (float )((uint16_t )(((uint16_t )dataRaw[5 ]) << 8 | dataRaw[4 ])-1 .0f )*fsrB*divFactor/convFactor;
536+ measures.uvc = (float )((uint16_t )(((uint16_t )dataRaw[7 ]) << 8 | dataRaw[6 ])-1 .0f )*fsrC*divFactor/convFactor;
537+ }
538+ else {
539+ measures.uva = (float )((uint16_t )(((uint16_t )dataRaw[3 ]) << 8 | dataRaw[2 ])-1 .0f )*_conversionA;
540+ measures.uvb = (float )((uint16_t )(((uint16_t )dataRaw[5 ]) << 8 | dataRaw[4 ])-1 .0f )*_conversionB;
541+ measures.uvc = (float )((uint16_t )(((uint16_t )dataRaw[7 ]) << 8 | dataRaw[6 ])-1 .0f )*_conversionC;
542+ }
543+
544+ measures.temperature = convertRawTempToTempC ((uint16_t )(((uint16_t )dataRaw[1 ] << 8 | dataRaw[0 ])));
482545
483546 return SFE_BUS_OK;
484547 }
@@ -1222,11 +1285,11 @@ class SfeAS7331Base {
12221285 // / @brief Converts the raw temperature value to a human readable form.
12231286 // / @param inputVal Raw temperature value to convert.
12241287 // / @return The converted device temperature in degree C.
1225- float convertRawTempToTempC (const uint16_t * inputVal)
1288+ float convertRawTempToTempC (const uint16_t inputVal)
12261289 {
12271290 // T_chip = TEMP*0.05 - 66.9
12281291 // EX: TEMP=0x922 aka TEMP=0d2338, returns 50.0
1229- return ((float )(* inputVal) * 0 .05f ) - 66 .9f ;
1292+ return ((float )(inputVal) * 0 .05f ) - 66 .9f ;
12301293 }
12311294
12321295 // / @brief Called when changing values that affect the conversion, calculates a new conversion factor to reduce the conversion overhead.
0 commit comments