private List <TimeProfileEntry> MakeTimeProfileEntryFromDeviceAction([NotNull] DeviceAction da, [NotNull] Affordance affordance, [NotNull] AffordanceDevice affdev, Random rnd) { var tpes = new List <TimeProfileEntry>(); foreach (var actionProfile in da.Profiles) { var lt = actionProfile.VLoadType; if (lt == null) { throw new LPGException("load type was null"); } var tp = actionProfile.Timeprofile; if (tp == null) { throw new LPGException("Time profile was null"); } var cp = CalcDeviceFactory.GetCalcProfile(tp, new TimeSpan(0, 1, 0)); var factor = GetMaxExpansionFactor((double)affordance.TimeStandardDeviation, rnd); var newlength = cp.GetNewLengthAfterCompressExpand(factor); if (da.Device == null) { throw new LPGException("Device was null"); } var tpe = new TimeProfileEntry(affdev, newlength, lt, (int)(affdev.TimeOffset + actionProfile.TimeOffset), affordance, factor, da.Device.Name); tpes.Add(tpe); } return(tpes); }
private TimeProfileEntry MakeTimeProfileEntryFromDevice([NotNull] AffordanceDevice affdev, [NotNull] Affordance affordance, Random rnd) { var lt = affdev.LoadType; if (lt == null) { throw new DataIntegrityException("LoadType was null"); } var tp = affdev.TimeProfile; if (tp == null) { throw new DataIntegrityException("Time profile was null"); } var cp = CalcDeviceFactory.GetCalcProfile(tp, new TimeSpan(0, 1, 0)); var factor = GetMaxExpansionFactor((double)affordance.TimeStandardDeviation, rnd); var newlength = cp.GetNewLengthAfterCompressExpand(factor); if (affdev.Device == null) { throw new DataIntegrityException("Device was null"); } string name = affdev.Device.Name; var tpe = new TimeProfileEntry(affdev, newlength, lt, (int)affdev.TimeOffset, affordance, factor, name); return(tpe); }
private static void CheckValidLoadtypesOnDevices([NotNull] AffordanceDevice affordanceDevice, [NotNull] Affordance affordance) { // check if all the load types on the affordance device are set on the device var rd = (RealDevice)affordanceDevice.Device; if (rd == null) { throw new DataIntegrityException("Device was null"); } var found = false; foreach (var realDeviceLoadType in rd.Loads) { if (realDeviceLoadType.LoadType == affordanceDevice.LoadType) { found = true; break; } } if (!found) { if (affordanceDevice.LoadType == null) { throw new DataIntegrityException("No load type set"); } throw new DataIntegrityException( "The affordance " + affordance.Name + " has the loadtype " + affordanceDevice.LoadType.Name + " set for the device " + rd.Name + " which the device hasn't set. This is not possible.", affordance); } // check if all the loadtypes on the real device are set on the affordance device foreach (var realDeviceLoadType in rd.Loads) { if (rd.ForceAllLoadTypesToBeSet) { var found2 = false; foreach (var affdev2 in affordance.AffordanceDevices) { if (affdev2.Device == rd && affdev2.TimeProfile == affordanceDevice.TimeProfile && affdev2.TimeOffset == affordanceDevice.TimeOffset && realDeviceLoadType.LoadType == affdev2.LoadType) { found2 = true; break; } } if (!found2) { throw new DataIntegrityException( "The device " + rd.Name + " has the loadtype " + realDeviceLoadType.Name + " set, but the affordance " + affordance.Name + " which uses the device hasn't set the load. This should not be.", affordance); } } } }
public TimeProfileEntry([NotNull] AffordanceDevice affDev, int newLength, [NotNull] VLoadType loadType, int offSet, [NotNull] Affordance affordance, double timeFactor, [NotNull] string deviceName) { AffDev = affDev; NewLength = newLength; LoadType = loadType; OffSet = offSet; Affordance = affordance; TimeFactor = timeFactor; DeviceName = deviceName; }
private static void CheckValidLoadTypesForDeviceCategories([NotNull][ItemNotNull] ObservableCollection <RealDevice> devices, [NotNull] AffordanceDevice affordanceDevice, [NotNull] Affordance affordance) { var dc = (DeviceCategory)affordanceDevice.Device; var catdevices = devices.Where(x => x.DeviceCategory == dc).ToList(); foreach (var realDevice in catdevices) { if (realDevice.Loads.All(x => x.LoadType != affordanceDevice.LoadType)) { if (affordanceDevice.LoadType == null) { throw new DataIntegrityException("No loadtype set"); } throw new DataIntegrityException( "The affordance " + affordance.Name + " has the loadtype " + affordanceDevice.LoadType.Name + " set for the device " + realDevice.Name + ". The device has not defined a power for this loadtype." + " The device is in the device category " + dc?.Name + ". This is not allowed. Please fix by removing the load type from the affordance" + " or adding the load type to the affordance", affordance); } // check if all the loadtypes on the real device are set on the affordance device if (realDevice.ForceAllLoadTypesToBeSet) { foreach (var realDeviceLoadType in realDevice.Loads) { var found2 = false; foreach (var affdev2 in affordance.AffordanceDevices) { if (affdev2.Device == dc && realDeviceLoadType.LoadType == affdev2.LoadType) { // affdev2.TimeOffset == affordanceDevice.TimeOffset && // only device and load profile need to be set. found2 = true; break; } } if (!found2) { throw new DataIntegrityException( "The device " + realDevice.Name + " has the loadtype " + realDeviceLoadType.Name + " set, but the affordance " + affordance.Name + " which uses the device via the device category " + dc?.Name + " hasn't set the load. This should not be.", affordance); } } } } }
public void LoadFromDatabaseTest() { using (var db = new DatabaseSetup(Utili.GetCurrentMethodAndClass())) { var affdev = new ObservableCollection <AffordanceDevice>(); var deviceCategories = new ObservableCollection <DeviceCategory>(); var realDevices = new ObservableCollection <RealDevice>(); var timeBasedProfiles = new ObservableCollection <TimeBasedProfile>(); var affordances = new ObservableCollection <Affordance>(); var dateBasedProfiles = db.LoadDateBasedProfiles(); var timeLimits = db.LoadTimeLimits(dateBasedProfiles); var loadtypes = db.LoadLoadTypes(); var deviceActionGroups = db.LoadDeviceActionGroups(); var deviceActions = new ObservableCollection <DeviceAction>(); db.ClearTable(AffordanceDevice.TableName); AffordanceDevice.LoadFromDatabase(affdev, db.ConnectionString, deviceCategories, realDevices, timeBasedProfiles, affordances, loadtypes, deviceActions, deviceActionGroups, false); affdev.Count.Should().Be(0); var rd = new RealDevice("blub", 1, "1", null, "name", true, false, db.ConnectionString, Guid.NewGuid().ToStrGuid()); rd.SaveToDB(); realDevices.Add(rd); var tp = new TimeBasedProfile("blub", null, db.ConnectionString, TimeProfileType.Relative, "fake", Guid.NewGuid().ToStrGuid()); tp.SaveToDB(); timeBasedProfiles.Add(tp); var aff = new Affordance("blub", tp, null, true, PermittedGender.All, 0, new ColorRGB(255, 0, 0), "bla", timeLimits[0], string.Empty, db.ConnectionString, false, false, 0, 99, false, ActionAfterInterruption.GoBackToOld, false, Guid.NewGuid().ToStrGuid(), BodilyActivityLevel.Low); aff.SaveToDB(); affordances.Add(aff); var newaffdev = new AffordanceDevice(rd, tp, null, 0, aff.ID, realDevices, deviceCategories, "blub", loadtypes[0], db.ConnectionString, 1, Guid.NewGuid().ToStrGuid()); newaffdev.SaveToDB(); AffordanceDevice.LoadFromDatabase(affdev, db.ConnectionString, deviceCategories, realDevices, timeBasedProfiles, affordances, loadtypes, deviceActions, deviceActionGroups, false); affdev.Count.Should().Be(1); affdev[0].LoadType.Should().Be(loadtypes[0]); db.Cleanup(); } }
private void MakeAffordanceDevices([NotNull] CalcLocationDto calcloc, TimeSpan internalStepSize, [NotNull] CalcLoadTypeDtoDictionary ltdict, [NotNull][ItemNotNull] ObservableCollection <DeviceAction> allDeviceActions, AffordanceWithTimeLimit aff, [NotNull] CalcAffordanceDto caff, [NotNull] AffordanceDevice devtup, [NotNull][ItemNotNull] List <CalcDeviceDto> devicesAtLocation, [ItemNotNull][NotNull] List <DeviceCategoryDto> deviceCategoryDtos) { if (devtup.Device == null) { throw new LPGException("Device was null"); } // pick the device itself var pickedDevice = _picker.GetDeviceDtoForAffordance(devtup.Device, devicesAtLocation, calcloc.ID, allDeviceActions, deviceCategoryDtos); if (pickedDevice == null) { throw new DataIntegrityException( "Affordance " + aff.Affordance.Name + " has broken devices. Please fix", aff.Affordance); } // find the device in the calc devices var dev = devicesAtLocation.Single(calcDevice => calcDevice.Name == pickedDevice.Name); if (dev == null) { throw new DataIntegrityException( "Affordance " + aff.Affordance.Name + " has broken devices. Please fix", aff.Affordance); } if (devtup.Device == null) { throw new LPGException("Device was null"); } switch (devtup.Device.AssignableDeviceType) { case AssignableDeviceType.Device: case AssignableDeviceType.DeviceCategory: { if (devtup.LoadType == null) { throw new LPGException("No load type set"); } if (ltdict.SimulateLoadtype(devtup.LoadType)) { if (devtup.TimeProfile == null) { throw new DataIntegrityException( "Affordance " + aff.Affordance.Name + " has broken time profiles. Please fix.", aff.Affordance); } var newprof = CalcDeviceDtoFactory.GetCalcProfileDto(devtup.TimeProfile); CalcLoadTypeDto loadtype = ltdict.GetLoadtypeDtoByLoadType(devtup.LoadType); caff.AddDeviceTuple(dev.Name, dev.Guid, newprof, loadtype.Name, loadtype.Guid, devtup.TimeOffset, internalStepSize, 1, devtup.Probability); } } break; case AssignableDeviceType.DeviceAction: case AssignableDeviceType.DeviceActionGroup: { DeviceAction da; // if it's a device action group, then go back to the picker to select a specific // device action based on the available devices if (devtup.Device.AssignableDeviceType == AssignableDeviceType.DeviceActionGroup) { da = _picker.GetDeviceActionFromGroup(devtup.Device, devicesAtLocation, allDeviceActions); } else { da = (DeviceAction)devtup.Device; } if (da == null) { throw new LPGException("Device action was null"); } if (da.Profiles.Count == 0) { throw new DataIntegrityException( "The device action " + da.Name + " has no time profiles. Please fix", da); } foreach (var profile in da.Profiles) { if (profile.VLoadType == null) { throw new LPGException("Profile was null"); } if (ltdict.SimulateLoadtype(profile.VLoadType)) { if (profile.Timeprofile == null) { throw new DataIntegrityException( "The device action " + da.Name + " has broken time profiles. Please fix.", da); } if (profile.VLoadType == null) { throw new DataIntegrityException( "The device action " + da.Name + " has broken load types. Please fix.", da); } var newprof = CalcDeviceDtoFactory.GetCalcProfileDto(profile.Timeprofile); CalcLoadTypeDto loadType = ltdict.GetLoadtypeDtoByLoadType(profile.VLoadType); caff.AddDeviceTuple(dev.Name, dev.Guid, newprof, loadType.Name, loadType.Guid, profile.TimeOffset + devtup.TimeOffset, internalStepSize, profile.Multiplier, devtup.Probability); } } } break; default: throw new LPGException( "Missing an AssignableDeviceType at GetCalcAffordancesAtLocation! Please report to the programmer."); } }