private IEnumerable <string> ExtractTags(MeasurementField measurementField)
        {
            try
            {
                if (!string.IsNullOrWhiteSpace(measurementField.StringValue))
                {
                    return(measurementField.StringValue.Split(new[] { ',', ';', ' ' }, StringSplitOptions.RemoveEmptyEntries));
                }
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Error extracting tags.");
                // and sink
            }

            return(new List <string>());
        }
        private MeasurementField MapOldApiField(MeasurementField field, User device)
        {
            string fieldId = field.Name.ToLower().Replace("field", "");

            int fieldIdValue;

            if (int.TryParse(fieldId, out fieldIdValue))
            {
                var fieldDescriptor = device.FieldDescriptors.FirstOrDefault(x => x.Index == fieldIdValue - 1);

                if (fieldDescriptor != null)
                {
                    // Change the field name to reflect the mapped field.
                    field.Name = fieldDescriptor.Name;
                }
            }

            // No match then return the existing field.
            return(field);
        }
        private void TryExtractMetaData(Measurement measurement, MeasurementField measurementField)
        {
            if (string.IsNullOrEmpty(measurementField.Name))
            {
                return;
            }

            try
            {
                switch (measurementField.Name.ToLower())
                {
                case "sampleid":
                    measurement.SampleId = measurementField.StringValue;
                    break;

                case "operatorid":
                    measurement.OperatorId = measurementField.StringValue;
                    break;

                case "soc":     // stage of charge (expect %)
                case "ps-soc":  // (stage of charge) to match photon battery shield.
                case "battery":
                case "batterylevel":
                case "batterylevelpercentage":
                    measurement.BatteryLevel           = measurementField.Value;
                    measurement.BatteryLevelPercentage = Convert.ToInt32(measurementField.Value);
                    break;

                case "rf":
                case "rfstrength":
                    measurement.RfStrength = Convert.ToInt32(measurementField.Value);
                    break;

                case "lat":
                case "latitude":
                    measurement.Location          = measurement.Location ?? new LocationDetails();
                    measurement.Location.Latitude = Convert.ToDouble(measurementField.Value);
                    break;

                case "long":
                case "longitude":
                    measurement.Location           = measurement.Location ?? new LocationDetails();
                    measurement.Location.Longitude = Convert.ToDouble(measurementField.Value);
                    break;

                case "elevation":
                case "altitude":
                    measurement.Location           = measurement.Location ?? new LocationDetails();
                    measurement.Location.Elevation = Convert.ToDouble(measurementField.Value);
                    break;

                case "g":
                case "gps":
                case "latlong":
                case "location":
                    measurement.Location = GetLocation(measurementField.StringValue);
                    break;

                case "tag":
                case "tags":
                    measurement.Tags.AddRange(ExtractTags(measurementField));
                    break;
                }
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Failed to extract field metadata.");
                // and sink, metadata is not overly critical
            }
        }