コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
                    }
                }
            }
        }
コード例 #4
0
 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;
 }
コード例 #5
0
        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();
     }
 }
コード例 #7
0
        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.");
            }
        }