internal static Height ToHeight(this Observation observation)
        {
            var height = observation.ToThingBase <ItemTypes.Height>();

            height.Value = ObservationToHealthVault.GetThingValueFromQuantity <Length>(observation.Value as Quantity);
            height.When  = ObservationToHealthVault.GetHealthVaultTimeFromEffectiveDate(observation.Effective);

            return(height);
        }
        internal static HeartRate ToHeartRate(this Observation observation)
        {
            var heartRate = observation.ToThingBase <ItemTypes.HeartRate>();

            var observationValue = observation.Value as Quantity;

            if (observationValue?.Value == null)
            {
                throw new ArgumentException("Value quantity must have a value.");
            }

            heartRate.Value = (int)observationValue.Value.Value;
            heartRate.When  = ObservationToHealthVault.GetHealthVaultTimeFromEffectiveDate(observation.Effective);

            return(heartRate);
        }
        internal static BloodGlucose ToBloodGlucose(this Observation observation)
        {
            var bloodGlucose = observation.ToThingBase <BloodGlucose>();

            bloodGlucose.Value = ObservationToHealthVault.GetThingValueFromQuantity <BloodGlucoseMeasurement>(observation.Value as Quantity);
            bloodGlucose.When  = ObservationToHealthVault.GetHealthVaultTimeFromEffectiveDate(observation.Effective);

            var bloodGlucoseExtension = observation.GetExtension(HealthVaultExtensions.BloodGlucose);

            if (bloodGlucoseExtension != null)
            {
                bloodGlucose.MeasurementContext          = bloodGlucoseExtension.GetExtensionValue <CodeableConcept>(HealthVaultExtensions.BloodGlucoseMeasurementContext).ToCodableValue();
                bloodGlucose.OutsideOperatingTemperature = bloodGlucoseExtension.GetBoolExtension(HealthVaultExtensions.OutsideOperatingTemperatureExtensionName);
                bloodGlucose.IsControlTest = bloodGlucoseExtension.GetBoolExtension(HealthVaultExtensions.IsControlTestExtensionName);

                Normalcy normalcy;
                if (Enum.TryParse <Normalcy>(bloodGlucoseExtension.GetStringExtension(HealthVaultExtensions.ReadingNormalcyExtensionName), out normalcy))
                {
                    bloodGlucose.ReadingNormalcy = normalcy;
                }
            }

            if (observation.Code != null && observation.Code.Coding != null)
            {
                foreach (var code in observation.Code.Coding)
                {
                    if (HealthVaultVocabularies.SystemContainsHealthVaultUrl(code.System))
                    {
                        bloodGlucose.GlucoseMeasurementType = observation.Method.ToCodableValue();
                    }
                    else
                    {
                        bloodGlucose.SetGlucoseMeasurementType(
                            code.Display,
                            code.Code,
                            HealthVaultVocabularies.Fhir,
                            code.System,
                            code.Version);
                    }
                }
            }

            return(bloodGlucose);
        }
Exemple #4
0
        internal static BloodPressure ToBloodPressure(this Observation observation)
        {
            var bloodPressure = observation.ToThingBase <BloodPressure>();

            bloodPressure.When = ObservationToHealthVault.GetHealthVaultTimeFromEffectiveDate(observation.Effective);

            bloodPressure.IrregularHeartbeatDetected = observation.GetBoolExtension(HealthVaultVocabularies.IrregularHeartBeatExtensionName);

            if (observation.Component != null)
            {
                foreach (var component in observation.Component)
                {
                    if (component.Code != null && component.Code.Coding != null)
                    {
                        foreach (var code in component.Code.Coding)
                        {
                            if (code.Code != null)
                            {
                                if (HealthVaultVocabularies.SystemContainsHealthVaultUrl(code.System))
                                {
                                    if (code.Code == HealthVaultVitalStatisticsCodes.BloodPressureDiastolic.Code)
                                    {
                                        SetDiastolic(bloodPressure, component);
                                    }
                                    else if (code.Code == HealthVaultVitalStatisticsCodes.BloodPressureSystolic.Code)
                                    {
                                        SetSystolic(bloodPressure, component);
                                    }
                                    else if (code.Code == HealthVaultVitalStatisticsCodes.HeartRate.Code)
                                    {
                                        SetPulse(bloodPressure, component);
                                    }
                                }
                                else
                                {
                                    switch (code.Code.ToLowerInvariant())
                                    {
                                    // HeartRate component
                                    case "8867-4":
                                        SetPulse(bloodPressure, component);
                                        break;

                                    // Systolic LOINC, SNOMED, ACME codes
                                    case "8480-6":
                                    case "271649006":
                                    case "bp-s":
                                        SetSystolic(bloodPressure, component);
                                        break;

                                    // Diastolic LOINC code
                                    case "8462-4":
                                        SetDiastolic(bloodPressure, component);
                                        break;

                                    default:
                                        continue;
                                    }
                                    break;
                                }
                            }
                        }
                    }
                }
            }

            return(bloodPressure);
        }
        internal static SleepJournalAM ToSleepJournalAM(this Observation observation)
        {
            var sleepJournalAm = observation.ToThingBase <SleepJournalAM>();

            sleepJournalAm.When = ObservationToHealthVault.GetHealthVaultTimeFromEffectiveDate(observation.Effective);

            foreach (var component in observation.Component)
            {
                if (string.IsNullOrEmpty(component.Code?.Text) || component.Value == null)
                {
                    continue;
                }

                switch (component.Code.Text)
                {
                case HealthVaultVocabularies.SleepJournalAMBedtime:
                    if (component.Value.GetType() == typeof(Time))
                    {
                        sleepJournalAm.Bedtime = ((Time)component.Value).ToAppoximateTime();
                    }

                    break;

                case HealthVaultVocabularies.SleepJournalAMWaketime:
                    if (component.Value.GetType() == typeof(Time))
                    {
                        sleepJournalAm.WakeTime = ((Time)component.Value).ToAppoximateTime();
                    }

                    break;

                case HealthVaultVocabularies.SleepJournalAMSleepMinutes:
                    if (component.Value.GetType() == typeof(SimpleQuantity))
                    {
                        var sleepMinutes = (Quantity)component.Value;
                        if (sleepMinutes.Value.HasValue)
                        {
                            sleepJournalAm.SleepMinutes = (int)sleepMinutes.Value.Value;
                        }
                    }

                    break;

                case HealthVaultVocabularies.SleepJournalAMSettlingMinutes:
                    if (component.Value.GetType() == typeof(SimpleQuantity))
                    {
                        var settlingMinutes = (Quantity)component.Value;
                        if (settlingMinutes.Value.HasValue)
                        {
                            sleepJournalAm.SettlingMinutes = (int)settlingMinutes.Value.Value;
                        }
                    }

                    break;

                case HealthVaultVocabularies.SleepJournalAMWakeState:
                    if (component.Value.GetType() == typeof(FhirString))
                    {
                        WakeState wakeState;
                        var       wakeStateValue = (FhirString)component.Value;

                        if (Enum.TryParse(wakeStateValue.Value, out wakeState))
                        {
                            sleepJournalAm.WakeState = wakeState;
                        }
                    }

                    break;

                case HealthVaultVocabularies.SleepJournalAMMedication:
                    if (component.Value.GetType() == typeof(CodeableConcept))
                    {
                        sleepJournalAm.Medications = ((CodeableConcept)component.Value).ToCodableValue();
                    }

                    break;

                case HealthVaultVocabularies.SleepJournalAMAwakening:
                    if (component.Value.GetType() == typeof(Period))
                    {
                        var startTime = ((Period)component.Value).StartElement.ToDateTimeOffset();
                        var endTime   = ((Period)component.Value).EndElement.ToDateTimeOffset();

                        var approximateTime = new ApproximateTime
                        {
                            Hour        = startTime.Hour,
                            Minute      = startTime.Minute,
                            Second      = startTime.Second,
                            Millisecond = startTime.Millisecond
                        };

                        var occurrence = new Occurrence
                        {
                            When    = approximateTime,
                            Minutes = (endTime - startTime).Minutes
                        };

                        sleepJournalAm.Awakenings.Add(occurrence);
                    }

                    break;
                }
            }

            return(sleepJournalAm);
        }