Example #1
0
        void EngineHook(object sender, EngineEventArgs e)
        {
            switch(e.Event) {
            case EngineEvent.NapStart:
                cmdClose.Text = Strings.NapStopPreGrace;
                _secondsTimer.Enabled = true;
                SecondsTick(_secondsTimer, EventArgs.Empty);  // Display initial time
                break;

            case EngineEvent.GracePeriodOver:
                cmdClose.Text = Strings.NapStopPostGrace;
                break;

            case EngineEvent.NapElapsed: {
                if(_testMethod == TestMethod.None)
                    break;  // Just wait for the user to press the close button

                // Otherwise, hand control to the test form which will test the user
                _okToClose = true;
                Close();
                var test = new TestForm(_engine);
                test.DoTest(this.Owner, _testMethod, _testData);
                break;
            }}
        }
Example #2
0
        void EngineHook(object sender, EngineEventArgs e)
        {
            switch(e.Event) {
            case EngineEvent.LoadSettings:
                RefreshSettings();
                break;

            case EngineEvent.LoadSettingsFailed:
                Tabs.SelectedTab = tabSetup;

                switch((string)e.Data) {
                case "NapLen":
                    App.FlashTextBox(txtSetupNapLen, Strings.InvalidTimeFlash);
                    break;
                case "NapCooldown":
                    App.FlashTextBox(txtSetupNapCooldown, Strings.InvalidTimeFlash);
                    break;
                case "CoreLen":
                    App.FlashTextBox(txtSetupCoreLen, Strings.InvalidTimeFlash);
                    break;
                case "CoreCooldown":
                    App.FlashTextBox(txtSetupCoreCooldown, Strings.InvalidTimeFlash);
                    break;
                case "SoundWarningFile":
                    App.FlashTextBox(txtSoundWarningFile, Strings.CantOpenAudioFile);
                    break;
                case "SoundAlarmFile":
                    App.FlashTextBox(txtSoundAlarmFile, Strings.CantOpenAudioFile);
                    break;
                case "SoundWarningLen":
                    App.FlashTextBox(txtSoundWarningLen, "!!!");
                    break;
                case "SoundFadeInLen":
                    App.FlashTextBox(txtSoundFadeInLen, "!!!");
                    break;
                }
                break;

            case EngineEvent.VitalTest:
                new TestForm(_engine).DoTest(this, TestMethod.VitalTest, "You still there?");
                break;

            case EngineEvent.CooldownBegin:
                cmdExit.Text = Strings.ExitCoolingDown;
                break;
            case EngineEvent.CooldownDone:
                cmdExit.Text = Strings.ExitIdle;
                break;

            case EngineEvent.LogMessage: {
                var data = (LogData)e.Data;
                txtHistory.AppendText(data.Time.ToString("HH:mm:ss "));
                txtHistory.AppendText(data.Message);
                txtHistory.AppendText(Environment.NewLine);
                txtHistory.Select(txtHistory.TextLength, 0);
                break;
            }}
        }
Example #3
0
        void EngineHook(object sender, EngineEventArgs e)
        {
            switch(e.Event) {
            case EngineEvent.Init: {
                uint origVol;
                if(waveOutGetVolume(IntPtr.Zero, out origVol) == MMSYSERR_NOERROR)
                    _originalVolume = origVol;
                else
                    _engine.Log(DateTime.Now, "Warning: couldn't determine current volume");
                break;
            }
            case EngineEvent.Shutdown:
                if(_originalVolume != null)
                    waveOutSetVolume(IntPtr.Zero, (uint)_originalVolume);
                break;

            case EngineEvent.LoadSettings:
                CloseAll();
                if(!_warning.TryOpen(App.Settings.WarningSoundFile))
                    _engine.LoadSettingsFailed("SoundWarningFile");
                if(!_alarm.TryOpen(App.Settings.AlarmSoundFile))
                    _engine.LoadSettingsFailed("SoundAlarmFile");
                break;
            case EngineEvent.NapDone:
                App.Assert(!_warning.Playing);
                App.Assert(!_alarm.Playing);
                break;

            case EngineEvent.SoundWarning:
                if(_engine.State == EngineState.Warning &&
                        App.Settings.WarningSoundFadeIn.Ticks != 0) {
                    SetVolume(0);
                    _fadeInTimer.Start();
                    FadeInTimer_Elapsed(_fadeInTimer, EventArgs.Empty);
                }

                _warning.SeekToStart();
                _warning.Play();
                break;
            case EngineEvent.SoundAlarm:
                _warning.Stop();
                _alarm.SeekToStart();
                _alarm.Play();
                break;
            case EngineEvent.SoundVital:
                _warning.SeekToStart();
                _warning.Play();
                Countdown.Queue(new TimeSpan(0, 0, 1), () => {
                    _engine.Invoker.Invoke((DelayedAction)(() => _warning.Stop()));
                });
                break;
            case EngineEvent.SoundVitalOuch:
                _alarm.SeekToStart();
                _alarm.Play();
                Countdown.Queue(new TimeSpan(0, 0, 1), () => {
                    _engine.Invoker.Invoke((DelayedAction)(() => _alarm.Stop()));
                });
                break;

            case EngineEvent.SoundStopAll:
                _warning.Stop();
                _alarm.Stop();
                break;

            case EngineEvent.SoundMute:
                SetMuted(true);
                break;
            case EngineEvent.SoundUnmute:
                SetMuted(false);
                break;
            }
        }
Example #4
0
        void SelfHook(object sender, EngineEventArgs e)
        {
            switch(e.Event) {
            case EngineEvent.Init:
                State = EngineState.Idle;
                RaiseEvent(EngineEvent.SoundUnmute);
                if(App.Settings.VitalEnabled)
                    _vitalTimer.Start(App.Settings.VitalPeriod);
                break;

            case EngineEvent.Shutdown:
                _napTimer.Stop();
                _graceTimer.Stop();
                RaiseEvent(EngineEvent.SoundStopAll);
                RaiseEvent(EngineEvent.SoundUnmute);
                break;

            case EngineEvent.LoadSettings:
                if(State == EngineState.Idle && App.Settings.NextNapAllowed > DateTime.Now) {
                    // User tried to nap sooner by killing the process and restarting...
                    Log(DateTime.Now, "So you think you're slick, huh?");
                    CooldownLength = App.Settings.NextNapAllowed - DateTime.Now;
                    RaiseEvent(EngineEvent.CooldownBegin);
                }
                break;

            case EngineEvent.NapStart:
                App.Assert(State == EngineState.Idle);
                State = EngineState.NapStarting;
                _vitalTimer.Stop();
                _napTimer.Start(NapLength);
                _graceTimer.Start(new TimeSpan(0, 0, CancelGraceSeconds));
                break;

            case EngineEvent.NapCancelled:
                App.Assert(State == EngineState.NapStarting);
                State = EngineState.Idle;
                _napTimer.Stop();
                _graceTimer.Stop();
                if(App.Settings.VitalEnabled)
                    _vitalTimer.Start(App.Settings.VitalPeriod);
                break;

            case EngineEvent.GracePeriodOver:
                _graceTimer.Stop();
                _anySignsOfLife = false;
                App.Assert(State == EngineState.NapStarting);
                State = EngineState.Napping;
                break;

            case EngineEvent.NapElapsed:
                if(WithinGracePeriod)
                    RaiseEvent(EngineEvent.GracePeriodOver);
                RaiseEvent(EngineEvent.NapWarning);
                break;

            case EngineEvent.NapWarning:
                App.Assert(State == EngineState.Napping);
                State = EngineState.Warning;
                RaiseEvent(EngineEvent.SoundUnmute);
                RaiseEvent(EngineEvent.SoundWarning);
                _warningTimer.Start(App.Settings.WarningSoundLength);
                break;

            case EngineEvent.NapAlarm:
                App.Assert(State == EngineState.Warning);
                State = EngineState.Alarming;
                RaiseEvent(EngineEvent.SoundAlarm);
                break;

            case EngineEvent.NapDone:
                _napTimer.Stop();
                _graceTimer.Stop();
                _warningTimer.Stop();
                RaiseEvent(EngineEvent.SoundStopAll);
                RaiseEvent(EngineEvent.CooldownBegin);
                if(App.Settings.VitalEnabled)
                    _vitalTimer.Start(App.Settings.VitalInitial);
                break;

            case EngineEvent.VitalTest:
                // This is handled in MainForm, so that the resulting dialog
                // can be modal and owned by MainForm
                break;

            case EngineEvent.VitalConfirmed:
            case EngineEvent.VitalGaveUp:
                App.Assert(App.Settings.VitalEnabled);
                _vitalTimer.Start(App.Settings.VitalPeriod);
                break;

            case EngineEvent.CooldownBegin:
                State = EngineState.CoolingDown;
                _cooldownTimer.Start(CooldownLength);
                App.Settings.NextNapAllowed = DateTime.Now + CooldownLength;
                App.Settings.SaveToFile();
                break;

            case EngineEvent.CooldownDone:
                App.Assert(State == EngineState.CoolingDown);
                State = EngineState.Idle;
                App.Settings.NextNapAllowed = DateTime.MinValue;
                App.Settings.SaveToFile();
                break;

            case EngineEvent.TriedToNapTooSoon:
            case EngineEvent.TriedToExitTooSoon: {
                RaiseEvent(EngineEvent.SoundUnmute);
                RaiseEvent(EngineEvent.SoundAlarm);

                Countdown.Queue(new TimeSpan(0, 0, 2), () => {
                    RaiseEvent(EngineEvent.SoundStopAll);
                });
                break;
            }}
        }
Example #5
0
        void RaiseEvent(EngineEvent ƐƲƺŋƫ, object data)
        {
            var args = new EngineEventArgs(ƐƲƺŋƫ, data);

            // Invoke used liberally for thread safety
            if(Invoker != null && Invoker.IsHandleCreated && Invoker.InvokeRequired)
                Invoker.Invoke(Hook, this, args);
            else
                Hook(this, args);
        }
Example #6
0
        void EngineHook(object sender, EngineEventArgs e)
        {
            switch(e.Event) {
            case EngineEvent.Init:
                try {
                    Directory.CreateDirectory(App.StoragePath);
                    _file = new FileStream(App.LogFilename, FileMode.Append, FileAccess.Write);
                    _output = new StreamWriter(_file);
                } catch {
                    // Logging isn't critical, so just display an error and continue
                    _engine.Log(DateTime.Now, "Failed to open log file on disk.");
                }
                break;
            case EngineEvent.Shutdown:
                if(_output != null)
                    _output.Close();
                break;

            case EngineEvent.NapStart:
                _napStartTime = DateTime.Now;
                break;
            case EngineEvent.FirstSignOfLife:
                _wakeState = _engine.State;
                _sleepTime = _engine.NapTimeElapsed;
                _verifyFails = 0;
                break;
            case EngineEvent.VerifiedWrong:
                _verifyFails += 1;
                break;
            case EngineEvent.TriedToNapTooSoon:
                _engine.Log(DateTime.Now, "Tried to nap again too soon");
                break;
            case EngineEvent.TriedToExitTooSoon:
                _engine.Log(DateTime.Now, "Tried to exit the program :(");
                break;

            case EngineEvent.NapDone: {
                var msg = "Slept for ";
                msg += App.TimeToStringHHMMSS(_sleepTime);
                msg += ", woke to ";
                switch(_wakeState) {
                case EngineState.Napping: msg += "silence"; break;
                case EngineState.Warning: msg += "warning"; break;
                case EngineState.Alarming: msg += "alarm"; break;
                default: App.Assert(false); break;
                }
                if(_verifyFails > 0)
                    msg += string.Format(", failed {0} test{1}",
                        _verifyFails, _verifyFails == 1 ? null : "s");
                _engine.Log(_napStartTime, msg);
                break;
            }
            case EngineEvent.LogMessage: {
                if(_output != null) {
                    var data = (LogData)e.Data;
                    _output.Write(data.Time.ToString("yyyy-MM-dd HH:mm:ss  "));
                    _output.WriteLine(data.Message);
                    _output.Flush();
                }
                break;
            }}
        }