@@ -402,7 +402,7 @@ CHIP_ERROR ASRFactoryDataProvider::GetProductId(uint16_t & productId)
402
402
#else
403
403
uint32_t productId32;
404
404
ReturnErrorOnFailure (ASRConfig::ReadFactoryConfigValue (ASR_PRODUCT_ID_PARTITION, productId32));
405
- productId = static_cast <uint16_t >(productId32);
405
+ productId = static_cast <uint16_t >(productId32);
406
406
#endif
407
407
return CHIP_NO_ERROR;
408
408
}
@@ -424,40 +424,88 @@ CHIP_ERROR ASRFactoryDataProvider::GetProductLabel(char * buf, size_t bufSize)
424
424
425
425
CHIP_ERROR ASRFactoryDataProvider::GetSerialNumber (char * buf, size_t bufSize)
426
426
{
427
- ChipError err = CHIP_NO_ERROR;
427
+ #if !CONFIG_ENABLE_ASR_FACTORY_DEVICE_INFO_PROVIDER
428
+ ReturnErrorCodeIf (bufSize < sizeof (CHIP_DEVICE_CONFIG_TEST_SERIAL_NUMBER), CHIP_ERROR_BUFFER_TOO_SMALL);
429
+ strcpy (buf, CHIP_DEVICE_CONFIG_TEST_SERIAL_NUMBER);
430
+ #else
431
+ #define BUFFER_MAX_SIZE 32
432
+ uint8_t buffer[BUFFER_MAX_SIZE + 1 ] = { 0 };
433
+ size_t buffer_len = BUFFER_MAX_SIZE + 1 ;
434
+ ReturnErrorOnFailure (ASRConfig::ReadFactoryConfigValue (ASR_SERIAL_NUMBER_PARTITION, buffer, buffer_len, buffer_len));
435
+ ReturnErrorCodeIf (bufSize < buffer_len, CHIP_ERROR_BUFFER_TOO_SMALL);
436
+ memcpy (buf, buffer, buffer_len);
437
+ buf[buffer_len] = 0 ;
438
+ #endif
439
+ return CHIP_NO_ERROR;
440
+ }
428
441
429
- size_t serialNumLen = 0 ; // without counting null-terminator
442
+ CHIP_ERROR ASRFactoryDataProvider::GetManufacturingDate (uint16_t & year, uint8_t & month, uint8_t & day)
443
+ {
444
+ CHIP_ERROR err = CHIP_NO_ERROR;
445
+ enum
446
+ {
447
+ kDateStringLength = 10 // YYYY-MM-DD
448
+ };
449
+ char dateStr[kDateStringLength + 1 ];
450
+ char * parseEnd;
451
+ #if !CONFIG_ENABLE_ASR_FACTORY_DEVICE_INFO_PROVIDER
452
+ memcpy (dateStr, CHIP_DEVICE_CONFIG_TEST_MANUFACTURY_DATE, kDateStringLength + 1 );
453
+ #else
454
+ size_t dateLen;
455
+ err = ASRConfig::ReadFactoryConfigValue (ASR_MANUFACTURY_DATE_PARTITION, (uint8_t *) dateStr, sizeof (dateStr), dateLen);
456
+ SuccessOrExit (err);
430
457
431
- #ifdef CHIP_DEVICE_CONFIG_TEST_SERIAL_NUMBER
432
- if (CHIP_DEVICE_CONFIG_TEST_SERIAL_NUMBER[0 ] != 0 )
458
+ VerifyOrExit (dateLen == kDateStringLength , err = CHIP_ERROR_INVALID_ARGUMENT);
459
+ #endif
460
+ // Cast does not lose information, because we then check that we only parsed
461
+ // 4 digits, so our number can't be bigger than 9999.
462
+ year = static_cast <uint16_t >(strtoul (dateStr, &parseEnd, 10 ));
463
+ VerifyOrExit (parseEnd == dateStr + 4 , err = CHIP_ERROR_INVALID_ARGUMENT);
464
+
465
+ // Cast does not lose information, because we then check that we only parsed
466
+ // 2 digits, so our number can't be bigger than 99.
467
+ month = static_cast <uint8_t >(strtoul (dateStr + 5 , &parseEnd, 10 ));
468
+ VerifyOrExit (parseEnd == dateStr + 7 , err = CHIP_ERROR_INVALID_ARGUMENT);
469
+
470
+ // Cast does not lose information, because we then check that we only parsed
471
+ // 2 digits, so our number can't be bigger than 99.
472
+ day = static_cast <uint8_t >(strtoul (dateStr + 8 , &parseEnd, 10 ));
473
+ VerifyOrExit (parseEnd == dateStr + 10 , err = CHIP_ERROR_INVALID_ARGUMENT);
474
+
475
+ exit :
476
+ if (err != CHIP_NO_ERROR && err != CHIP_DEVICE_ERROR_CONFIG_NOT_FOUND)
433
477
{
434
- ReturnErrorCodeIf (sizeof (CHIP_DEVICE_CONFIG_TEST_SERIAL_NUMBER) > bufSize, CHIP_ERROR_BUFFER_TOO_SMALL);
435
- memcpy (buf, CHIP_DEVICE_CONFIG_TEST_SERIAL_NUMBER, sizeof (CHIP_DEVICE_CONFIG_TEST_SERIAL_NUMBER));
436
- serialNumLen = sizeof (CHIP_DEVICE_CONFIG_TEST_SERIAL_NUMBER) - 1 ;
437
- err = CHIP_NO_ERROR;
478
+ ChipLogError (DeviceLayer, " Invalid manufacturing date: %s" , dateStr);
438
479
}
439
- #endif // CHIP_DEVICE_CONFIG_TEST_SERIAL_NUMBER
440
-
441
- ReturnErrorCodeIf (serialNumLen >= bufSize, CHIP_ERROR_BUFFER_TOO_SMALL);
442
- ReturnErrorCodeIf (buf[serialNumLen] != 0 , CHIP_ERROR_INVALID_STRING_LENGTH);
443
-
444
480
return err;
445
481
}
446
482
447
- CHIP_ERROR ASRFactoryDataProvider::GetManufacturingDate (uint16_t & year, uint8_t & month, uint8_t & day)
448
- {
449
- return CHIP_ERROR_NOT_IMPLEMENTED;
450
- }
451
-
452
483
CHIP_ERROR ASRFactoryDataProvider::GetHardwareVersion (uint16_t & hardwareVersion)
453
484
{
454
- return CHIP_ERROR_NOT_IMPLEMENTED;
485
+ #if !CONFIG_ENABLE_ASR_FACTORY_DEVICE_INFO_PROVIDER
486
+ hardwareVersion = static_cast <uint16_t >(CHIP_DEVICE_CONFIG_DEFAULT_DEVICE_HARDWARE_VERSION);
487
+ #else
488
+ uint32_t hardwareVersion32;
489
+ ReturnErrorOnFailure (ASRConfig::ReadFactoryConfigValue (ASR_HARDWARE_VERSION_PARTITION, hardwareVersion32));
490
+ hardwareVersion = static_cast <uint16_t >(hardwareVersion32);
491
+ #endif
492
+ return CHIP_NO_ERROR;
455
493
}
456
494
457
495
CHIP_ERROR ASRFactoryDataProvider::GetHardwareVersionString (char * buf, size_t bufSize)
458
496
{
497
+ #if !CONFIG_ENABLE_ASR_FACTORY_DEVICE_INFO_PROVIDER
459
498
ReturnErrorCodeIf (bufSize < sizeof (CHIP_DEVICE_CONFIG_DEFAULT_DEVICE_HARDWARE_VERSION_STRING), CHIP_ERROR_BUFFER_TOO_SMALL);
460
499
strcpy (buf, CHIP_DEVICE_CONFIG_DEFAULT_DEVICE_HARDWARE_VERSION_STRING);
500
+ #else
501
+ #define BUFFER_MAX_SIZE 32
502
+ uint8_t buffer[BUFFER_MAX_SIZE + 1 ] = { 0 };
503
+ size_t buffer_len = BUFFER_MAX_SIZE + 1 ;
504
+ ReturnErrorOnFailure (ASRConfig::ReadFactoryConfigValue (ASR_HARDWARE_VERSION_STR_PARTITION, buffer, buffer_len, buffer_len));
505
+ ReturnErrorCodeIf (bufSize < buffer_len, CHIP_ERROR_BUFFER_TOO_SMALL);
506
+ memcpy (buf, buffer, buffer_len);
507
+ buf[buffer_len] = 0 ;
508
+ #endif
461
509
return CHIP_NO_ERROR;
462
510
}
463
511
0 commit comments