@@ -2538,6 +2538,8 @@ static void loadClientConfigSnapshots();
25382538static void saveClientConfigSnapshots ();
25392539static void cacheClientConfigFromBuffer (const char *clientUid, const char *buffer);
25402540static ClientConfigSnapshot *findClientConfigSnapshot (const char *clientUid);
2541+ static ClientMetadata *findClientMetadata (const char *clientUid);
2542+ static ClientMetadata *findOrCreateClientMetadata (const char *clientUid);
25412543static bool checkSmsRateLimit (TankRecord *rec);
25422544static void publishViewerSummary ();
25432545static double computeNextAlignedEpoch (double epoch, uint8_t baseHour, uint32_t intervalSeconds);
@@ -3237,14 +3239,10 @@ static void sendClientDataJson(EthernetClient &client) {
32373239 clientObj[" lastUpdate" ] = 0.0 ;
32383240
32393241 // Add VIN voltage from client metadata if available
3240- for (uint8_t j = 0 ; j < gClientMetadataCount ; ++j) {
3241- if (strcmp (gClientMetadata [j].clientUid , rec.clientUid ) == 0 ) {
3242- if (gClientMetadata [j].vinVoltage > 0 .0f ) {
3243- clientObj[" vinVoltage" ] = gClientMetadata [j].vinVoltage ;
3244- clientObj[" vinVoltageEpoch" ] = gClientMetadata [j].vinVoltageEpoch ;
3245- }
3246- break ;
3247- }
3242+ ClientMetadata *meta = findClientMetadata (rec.clientUid );
3243+ if (meta && meta->vinVoltage > 0 .0f ) {
3244+ clientObj[" vinVoltage" ] = meta->vinVoltage ;
3245+ clientObj[" vinVoltageEpoch" ] = meta->vinVoltageEpoch ;
32483246 }
32493247 }
32503248
@@ -3645,6 +3643,44 @@ static void handleAlarm(JsonDocument &doc, double epoch) {
36453643 }
36463644}
36473645
3646+ // Helper function to find client metadata entry (read-only, does not create)
3647+ static ClientMetadata *findClientMetadata (const char *clientUid) {
3648+ if (!clientUid || strlen (clientUid) == 0 ) {
3649+ return nullptr ;
3650+ }
3651+
3652+ for (uint8_t i = 0 ; i < gClientMetadataCount ; ++i) {
3653+ if (strcmp (gClientMetadata [i].clientUid , clientUid) == 0 ) {
3654+ return &gClientMetadata [i];
3655+ }
3656+ }
3657+
3658+ return nullptr ;
3659+ }
3660+
3661+ // Helper function to find or create client metadata entry
3662+ static ClientMetadata *findOrCreateClientMetadata (const char *clientUid) {
3663+ if (!clientUid || strlen (clientUid) == 0 ) {
3664+ return nullptr ;
3665+ }
3666+
3667+ // Search for existing entry
3668+ ClientMetadata *existing = findClientMetadata (clientUid);
3669+ if (existing) {
3670+ return existing;
3671+ }
3672+
3673+ // Create new entry if space available
3674+ if (gClientMetadataCount < MAX_CLIENT_METADATA) {
3675+ ClientMetadata *meta = &gClientMetadata [gClientMetadataCount ++];
3676+ memset (meta, 0 , sizeof (ClientMetadata));
3677+ strlcpy (meta->clientUid , clientUid, sizeof (meta->clientUid ));
3678+ return meta;
3679+ }
3680+
3681+ return nullptr ;
3682+ }
3683+
36483684static void handleDaily (JsonDocument &doc, double epoch) {
36493685 // Extract VIN voltage from daily report if present
36503686 const char *clientUid = doc[" client" ] | " " ;
@@ -3654,19 +3690,7 @@ static void handleDaily(JsonDocument &doc, double epoch) {
36543690 if (part == 1 && doc.containsKey (" vinVoltage" )) {
36553691 float vinVoltage = doc[" vinVoltage" ].as <float >();
36563692 if (vinVoltage > 0 .0f ) {
3657- // Find or create client metadata entry
3658- ClientMetadata *meta = nullptr ;
3659- for (uint8_t i = 0 ; i < gClientMetadataCount ; ++i) {
3660- if (strcmp (gClientMetadata [i].clientUid , clientUid) == 0 ) {
3661- meta = &gClientMetadata [i];
3662- break ;
3663- }
3664- }
3665- if (!meta && gClientMetadataCount < MAX_CLIENT_METADATA) {
3666- meta = &gClientMetadata [gClientMetadataCount ++];
3667- memset (meta, 0 , sizeof (ClientMetadata));
3668- strlcpy (meta->clientUid , clientUid, sizeof (meta->clientUid ));
3669- }
3693+ ClientMetadata *meta = findOrCreateClientMetadata (clientUid);
36703694 if (meta) {
36713695 meta->vinVoltage = vinVoltage;
36723696 meta->vinVoltageEpoch = (epoch > 0.0 ) ? epoch : currentEpoch ();
@@ -3872,13 +3896,9 @@ static void publishViewerSummary() {
38723896 obj[" lastUpdate" ] = gTankRecords [i].lastUpdateEpoch ;
38733897
38743898 // Add VIN voltage from client metadata if available
3875- for (uint8_t j = 0 ; j < gClientMetadataCount ; ++j) {
3876- if (strcmp (gClientMetadata [j].clientUid , gTankRecords [i].clientUid ) == 0 ) {
3877- if (gClientMetadata [j].vinVoltage > 0 .0f ) {
3878- obj[" vinVoltage" ] = gClientMetadata [j].vinVoltage ;
3879- }
3880- break ;
3881- }
3899+ ClientMetadata *meta = findClientMetadata (gTankRecords [i].clientUid );
3900+ if (meta && meta->vinVoltage > 0 .0f ) {
3901+ obj[" vinVoltage" ] = meta->vinVoltage ;
38823902 }
38833903 }
38843904
0 commit comments