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); }
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); }