@@ -408,7 +408,19 @@ class SfeAS7331Base {
408
408
if (SFE_BUS_OK != result)
409
409
return result;
410
410
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
+ }
412
424
413
425
return SFE_BUS_OK;
414
426
}
@@ -424,7 +436,19 @@ class SfeAS7331Base {
424
436
if (SFE_BUS_OK != result)
425
437
return result;
426
438
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
+ }
428
452
429
453
return SFE_BUS_OK;
430
454
}
@@ -440,7 +464,19 @@ class SfeAS7331Base {
440
464
if (SFE_BUS_OK != result)
441
465
return result;
442
466
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
+ }
444
480
445
481
return SFE_BUS_OK;
446
482
}
@@ -456,9 +492,23 @@ class SfeAS7331Base {
456
492
if (SFE_BUS_OK != result)
457
493
return result;
458
494
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
+ }
462
512
463
513
return SFE_BUS_OK;
464
514
}
@@ -467,18 +517,31 @@ class SfeAS7331Base {
467
517
// / @return 0 if successful, negative if error, positive for warning.
468
518
int8_t readAll (void )
469
519
{
470
- uint8_t dataRaw[12 ];
520
+ uint8_t dataRaw[8 ];
471
521
472
- int8_t result = readRegister (SFE_AS7331_REGISTER_MEAS_TEMP, dataRaw, 12U );
522
+ int8_t result = readRegister (SFE_AS7331_REGISTER_MEAS_TEMP, dataRaw, 8U );
473
523
474
524
if (SFE_BUS_OK != result)
475
525
return result;
476
526
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 ])));
482
545
483
546
return SFE_BUS_OK;
484
547
}
@@ -1222,11 +1285,11 @@ class SfeAS7331Base {
1222
1285
// / @brief Converts the raw temperature value to a human readable form.
1223
1286
// / @param inputVal Raw temperature value to convert.
1224
1287
// / @return The converted device temperature in degree C.
1225
- float convertRawTempToTempC (const uint16_t * inputVal)
1288
+ float convertRawTempToTempC (const uint16_t inputVal)
1226
1289
{
1227
1290
// T_chip = TEMP*0.05 - 66.9
1228
1291
// 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 ;
1230
1293
}
1231
1294
1232
1295
// / @brief Called when changing values that affect the conversion, calculates a new conversion factor to reduce the conversion overhead.
0 commit comments