private async Task ProcessFruitMessage(FruitMessage fruitMsg) { DateTime originalEventUTC = DateTime.SpecifyKind(DateTime.UtcNow, DateTimeKind.Utc); if (fruitMsg.OriginalEventUTCTime != null) { originalEventUTC = DateTime.Parse(fruitMsg.OriginalEventUTCTime, null, System.Globalization.DateTimeStyles.RoundtripKind); Log.WriteLine("processing fruit message. parsed msg time {0} from {1}", originalEventUTC.ToString("o"), fruitMsg.OriginalEventUTCTime); } else { Log.WriteLine("msg has no time. using current {0}", originalEventUTC.ToString("o")); } lock (FruitChanged) { if (originalEventUTC >= _lastFruitUTC) { Log.WriteLine("processing fruit message. original event UTC {0} prev {1}", originalEventUTC.ToString("o"), _lastFruitUTC.ToString("o")); FruitChanged?.Invoke(this, fruitMsg.FruitSeen); _lastFruitUTC = originalEventUTC; } else { Log.WriteLine("processing fruit message. ignoring stale message. original event UTC {0} prev {1}", originalEventUTC.ToString("o"), _lastFruitUTC.ToString("o")); } } await Task.CompletedTask; }
protected override async Task OnDesiredModulePropertyChanged(TwinCollection newDesiredProperties) { Log.WriteLine("derived desired properties contains {0} properties", newDesiredProperties.Count); await base.OnDesiredModulePropertyChanged(newDesiredProperties); DesiredPropertiesType <ConfigurationType> dp; if (!newDesiredProperties.Contains(Keys.Configuration)) { Log.WriteLine("derived desired properties contains no configuration. skipping..."); return; } dp.Configuration = ((JObject)newDesiredProperties[Keys.Configuration]).ToObject <ConfigurationType>(); Log.WriteLine("checking for update current desiredProperties {0} new dp {1}", _desiredProperties.ToString(), dp.ToString()); var changed = _desiredProperties.Update(dp); if (changed) { Log.WriteLine("desired properties {0} different then current properties, notifying...", _desiredProperties.ToString()); ConfigurationChanged?.Invoke(this, dp.Configuration); Log.WriteLine("local notification complete. updating reported properties to cloud twin"); await UpdateReportedPropertiesAsync(new KeyValuePair <string, Object>(Keys.Configuration, JsonConvert.SerializeObject(_desiredProperties.Configuration))); } if (newDesiredProperties.Contains(Keys.FruitTest)) { var fruit = (string)((JValue)newDesiredProperties[Keys.FruitTest]).Value; Log.WriteLine("fruittest {0}", fruit != null ? fruit : "(null)"); if (fruit != null) { Log.WriteLine("setting fruit {0}", fruit); FruitChanged?.Invoke(this, fruit); } } Log.WriteLine("update complete -- current properties {0}", _desiredProperties.ToString()); }
protected void OnFruitChanged(Fruit fruit, bool isEaten) { FruitChanged?.Invoke(this, new FruitChangedEventArgs(fruit, isEaten)); }