public static StateMachineStateType GetStateType(this LaundryMachineStateCode code)
        {
            switch (code)
            {
            case LaundryMachineStateCode.PoweredDown:
                return(StateMachineStateType.Terminal);

            case LaundryMachineStateCode.Empty:
                return(StateMachineStateType.WaitForMoreInputOnly);

            case LaundryMachineStateCode.Full:
                return(StateMachineStateType.WaitForMoreInputOnly);

            case LaundryMachineStateCode.Activating:
                return(StateMachineStateType.WaitForTaskComplete);

            case LaundryMachineStateCode.Washing:
                return(StateMachineStateType.WaitForTaskComplete);

            case LaundryMachineStateCode.Drying:
                return(StateMachineStateType.WaitForTaskComplete);

            default:
            case LaundryMachineStateCode.Error:
                return(StateMachineStateType.Error);
            }
        }
Пример #2
0
                               StateMachineStateType, int, LaundryMachineStateTransition, LaundryVault> PerformGetNextState(
            LaundryMachineStateCode code)
        {
            switch (code)
            {
            case LaundryMachineStateCode.PoweredDown:
                return(new PoweredDownState(FlagVault, _stateCodeVault, EventRaiser, _context,
                                            TimeToAddOneUnitDampness, TimeToRemoveOneUnitDirt, TimeToRemoveOneUnitDampness));

            case LaundryMachineStateCode.Empty:
                return(new EmptyState(FlagVault, _stateCodeVault, EventRaiser, _context, TimeToAddOneUnitDampness,
                                      TimeToRemoveOneUnitDirt, TimeToRemoveOneUnitDampness));

            case LaundryMachineStateCode.Washing:
                return(new WashState(EventRaiser, _stateCodeVault, FlagVault, _context, TimeToAddOneUnitDampness,
                                     TimeToRemoveOneUnitDirt, TimeToRemoveOneUnitDampness));

            case LaundryMachineStateCode.Drying:
                return(new DryState(EventRaiser, _stateCodeVault, FlagVault, _context, TimeToAddOneUnitDampness,
                                    TimeToRemoveOneUnitDirt, TimeToRemoveOneUnitDampness));

            default:
            case LaundryMachineStateCode.Error:
                return(new ErrorState(FlagVault, _stateCodeVault, EventRaiser, _context, TimeToAddOneUnitDampness,
                                      TimeToRemoveOneUnitDirt, TimeToRemoveOneUnitDampness));
            }
        }
 protected InvariantsNotMetException(DateTime ts, LaundryMachineStateCode stateCode, [NotNull] string invariantDescription,
                                     [CanBeNull] Exception inner) : base(string.Empty, inner)
 {
     _message             = new LocklessLazyWriteOnce <string>(CreateMessage);
     TimeStamp            = ts;
     StateCode            = stateCode;
     InvariantDescription = invariantDescription ?? throw new ArgumentNullException(nameof(invariantDescription));
 }
Пример #4
0
                        StateMachineStateType, int, LaundryMachineStateTransition, LaundryVault> PerformGetNextState(
     LaundryMachineStateCode code)
 {
     if (code == LaundryMachineStateCode.Activating)
     {
         return(new ActivatingState(EventRaiser, _stateCodeVault, FlagVault, _context, TimeToAddOneUnitDampness,
                                    TimeToRemoveOneUnitDirt, TimeToRemoveOneUnitDampness));
     }
     if (code == LaundryMachineStateCode.PoweredDown)
     {
         return(new PoweredDownState(FlagVault, _stateCodeVault, EventRaiser, _context, TimeToAddOneUnitDampness,
                                     TimeToRemoveOneUnitDirt, TimeToRemoveOneUnitDampness));
     }
     return(new ErrorState(FlagVault, _stateCodeVault, EventRaiser, _context, TimeToAddOneUnitDampness,
                           TimeToRemoveOneUnitDirt, TimeToRemoveOneUnitDampness));
 }
Пример #5
0
                               StateMachineStateType, int, LaundryMachineStateTransition, LaundryVault> PerformGetNextState(
            LaundryMachineStateCode code)
        {
            switch (code)
            {
            case LaundryMachineStateCode.PoweredDown:
                return(new PoweredDownState(FlagVault, _stateCodeVault, EventRaiser, _context, TimeToAddOneUnitDampness, TimeToRemoveOneUnitDirt, TimeToRemoveOneUnitDampness));

            case LaundryMachineStateCode.Full:
                return(new FullState(FlagVault, _stateCodeVault, EventRaiser, _context, TimeToAddOneUnitDampness, TimeToRemoveOneUnitDirt, TimeToRemoveOneUnitDampness));

            case LaundryMachineStateCode.Error:
                return(new ErrorState(FlagVault, _stateCodeVault, EventRaiser, _context, TimeToAddOneUnitDampness, TimeToRemoveOneUnitDirt, TimeToRemoveOneUnitDampness));

            default:
                throw new ArgumentOutOfRangeException(nameof(code), code, null);
            }
        }
Пример #6
0
                               StateMachineStateType, int, LaundryMachineStateTransition, LaundryVault> PerformGetNextState(
            LaundryMachineStateCode code)
        {
            switch (code)
            {
            default:
            case LaundryMachineStateCode.Empty:
                return(new EmptyState(FlagVault, _stateCodeVault, EventRaiser, _context, TimeToAddOneUnitDampness,
                                      TimeToRemoveOneUnitDirt, TimeToRemoveOneUnitDampness));

            case LaundryMachineStateCode.Error:
                return(new ErrorState(FlagVault, _stateCodeVault, EventRaiser,
                                      _context, TimeToAddOneUnitDampness, TimeToRemoveOneUnitDirt, TimeToRemoveOneUnitDampness));

            case LaundryMachineStateCode.Full:
                return(new FullState(FlagVault, _stateCodeVault, EventRaiser, _context, TimeToAddOneUnitDampness,
                                     TimeToRemoveOneUnitDirt, TimeToRemoveOneUnitDampness));
            }
        }
Пример #7
0
        protected LaundryMachineTaskBasedStateBase(LaundryMachineStateCode code,
                                                   CommandIds commandIds, [NotNull] IEventRaiser raiser,
                                                   [NotNull] BasicVault <LaundryMachineStateCode> stateVault, [NotNull] LaundryVault vault,
                                                   [NotNull] ILaundryMachineTaskExecutionContext <TaskResult> executionContext,
                                                   ImmutableArray <LaundryMachineStateCode> nextStatesOnCompletion, TimeSpan addOneUnitDamp, TimeSpan removeOneUnitDirt, TimeSpan removeOneUnitDamp) : base(
                StateMachineStateType.WaitForTaskComplete, code, vault, stateVault, raiser, executionContext, addOneUnitDamp, removeOneUnitDirt, removeOneUnitDamp)
        {
            if (stateVault == null)
            {
                throw new ArgumentNullException(nameof(stateVault));
            }
            if (nextStatesOnCompletion.IsDefault || nextStatesOnCompletion.IsEmpty ||
                nextStatesOnCompletion.Contains(code))
            {
                throw new ArgumentException(
                          $@"Parameter must not be default, empty or contain the value passed by the {nameof(code)} parameter.",
                          nameof(nextStatesOnCompletion));
            }
            if (executionContext == null)
            {
                throw new ArgumentNullException(nameof(executionContext));
            }
            if (!executionContext.IsActive || executionContext.IsDisposed)
            {
                throw new ArgumentException(@"The execution context is not in a useable state.",
                                            nameof(executionContext));
            }
            if (code.GetStateTaskType() == TaskType.NullTask)
            {
                throw new ArgumentException("This state must be a task-based state.");
            }

            CommandId = commandIds;
            _taskEndedTransProcedure           = new LocklessLazyWriteOnce <LTransProcedure>(InitTaskEndedTransProcedure);
            _taskEndedAdditionalTransProcedure =
                new LocklessLazyWriteOnce <LTransAdditionalProcedure>(InitTaskEndedAdditionalTransProc);
            _taskEndedTransition =
                new LocklessLazyWriteOnce <LaundryMachineStateTransition>(() =>
                                                                          InitTaskEndedTransition(nextStatesOnCompletion));
            _cancellationTransition =
                new LocklessLazyWriteOnce <LaundryMachineStateTransition>(() =>
                                                                          InitCancellationTransition(code, commandIds));
        }
        public static TaskType GetStateTaskType(this LaundryMachineStateCode code)
        {
            TaskType ret;

            switch (code)
            {
            case LaundryMachineStateCode.PoweredDown:
                ret = TaskType.NullTask;
                break;

            case LaundryMachineStateCode.Empty:
                ret = TaskType.NullTask;
                break;

            case LaundryMachineStateCode.Full:
                ret = TaskType.NullTask;
                break;

            case LaundryMachineStateCode.Activating:
                ret = TaskType.ActivateTask;
                break;

            case LaundryMachineStateCode.Washing:
                ret = TaskType.WashTask;
                break;

            case LaundryMachineStateCode.Drying:
                ret = TaskType.DryTask;
                break;

            default:
            case LaundryMachineStateCode.Error:
                ret = TaskType.NullTask;
                break;
            }
            return(ret);
        }
Пример #9
0
 public EntryInvariantsNotMetException(LaundryMachineStateCode stateCode, [NotNull] string invariantDescription) :
     this(stateCode, invariantDescription, TimeStampSource.Now, null)
 {
 }
Пример #10
0
 public EntryInvariantsNotMetException(LaundryMachineStateCode stateCode, [NotNull] string invariantDescription,
                                       DateTime timestamp, [CanBeNull] Exception inner) :
     base(timestamp, stateCode, invariantDescription, inner)
 {
 }
Пример #11
0
 public static LaundryMachineStateCode ValueOrErrorIfNDef(this LaundryMachineStateCode code) =>
 code.IsStateDefined() ? code : LaundryMachineStateCode.Error;
Пример #12
0
 public static LaundryMachineStateCode ValueOrThrowIfNDef(this LaundryMachineStateCode code) =>
 code.IsStateDefined()
         ? code
         : throw new InvalidEnumArgumentException(nameof(code), (int)code, typeof(LaundryMachineStateCode));
Пример #13
0
 public static bool IsInputOnlyStateCode(this LaundryMachineStateCode code) =>
 TheWaitInputOnlyTaskCodes.Contains(code);
Пример #14
0
 public static bool IsTaskBasedStateCode(this LaundryMachineStateCode code) =>
 TheTaskBasedStateCodes.Contains(code);
Пример #15
0
 public static bool IsUndefinedOrErrorStateCode(this LaundryMachineStateCode code) =>
 code.ValueOrErrorIfNDef() == LaundryMachineStateCode.Error;
 public ExitInvariantsNotMetException(LaundryMachineStateCode stateCode, [NotNull] string invariantDescription, Exception inner)
     : this(stateCode, invariantDescription, TimeStampSource.Now, inner)
 {
 }
Пример #17
0
 public static bool IsStateDefined(this LaundryMachineStateCode state) => TheDefinedStateCodes.Contains(state);
Пример #18
0
 protected override StateMachineStateBase <LaundryStatusFlags, LaundryMachineStateCode, TaskResultCode, TaskResult, StateMachineStateType, int, LaundryMachineStateTransition, LaundryVault> PerformGetNextState(LaundryMachineStateCode code) => throw new NotImplementedException();