Example #1
0
        public Xmas2015(IEnumerable <string> args)
        {
            hours.AddRange("4:00 pm", "10:00 pm");

            string expFilesParam = args.FirstOrDefault(x => x.StartsWith("EXPFILES"));

            if (!string.IsNullOrEmpty(expFilesParam))
            {
                string[] parts = expFilesParam.Split('=');
                if (parts.Length == 2)
                {
                    Exec.ExpanderSharedFiles = parts[1];
                }
            }

            pulsatingEffect1.ConnectTo(lightOlaf);
            pulsatingEffect2.ConnectTo(lightR2D2);
            pulsatingEffect3.ConnectTo(pixelsRoofEdge, Utils.Data(Color.Red));
            pulsatingEffect4.ConnectTo(lightBlueButton);
            pulsatingEffect4.ConnectTo(lightRedButton);

            expanderServer.AddInstance("ec30b8eda95b4c5cab46bf630d74810e", expanderLocal);
            expanderServer.AddInstance("ed86c3dc166f41ee86626897ba039ed2", expander1);      // rpi-eb0092ca
            expanderServer.AddInstance("10520fdcf14d47cba31da8b6e05d01d8", expander2);      // rpi-eb428ef1
            expanderServer.AddInstance("59ebb8e925c94182a0f6e0ef09180200", expander3);      // rpi-eba6cbc7
            expanderServer.AddInstance("1583f686014345888c15d7fc9c55ca3c", expander4);      // rpi-eb81c94e

            expander1.DigitalInputs[5].Connect(inR2D2);
            expander1.DigitalInputs[4].Connect(inOlaf);
            expander1.DigitalInputs[6].Connect(inShowMachine);
            expander1.DigitalOutputs[7].Connect(out1);
            expander4.DigitalOutputs[7].Connect(snowMachine);

            expander4.DigitalInputs[5].Connect(inBlueButton);
            expander4.DigitalInputs[4].Connect(inRedButton);

            expander1.Connect(audio1);
            expander2.Connect(audioMain);
            expander3.Connect(video3);
            expander4.Connect(audioDarthVader);

            blackOut.ConnectTo(Exec.Blackout);
            whiteOut.ConnectTo(Exec.Whiteout);

            midiAkai.Controller(midiChannel, 1).Subscribe(x => blackOut.Value = x.Value);
            midiAkai.Controller(midiChannel, 2).Subscribe(x => whiteOut.Value = x.Value);

            dmxPlayback.Load(Path.Combine(Exec.ExpanderSharedFiles, "Seq", "XmasLoop.bin"), 15);
            dmxPlayback.Loop = true;

            var pixelMapping = Framework.Utility.PixelMapping.GeneratePixelMappingFromGlediatorPatch(
                Path.Combine(Exec.ExpanderSharedFiles, "Glediator", "ArtNet 14-15 20x10.patch.glediator"));

            dmxPlayback.SetOutput(pixelsMatrix, pixelMapping);

            buttonOverrideHours.Output.Subscribe(x =>
            {
                if (x)
                {
                    hours.SetForced(true);
                }
                else
                {
                    hours.SetForced(null);
                }
            });

            inflatablesRunning.Subscribe(x =>
            {
                airReindeer.SetValue(x);

                Exec.SetKey("InflatablesRunning", x.ToString());
            });

            // Read from storage
            inflatablesRunning.OnNext(Exec.GetSetKey("InflatablesRunning", false));

            //            hours.Output.Log("Hours inside");

            stateMachine.ForFromSubroutine(States.Background, subBackground);
            stateMachine.ForFromSubroutine(States.Music1, subMusic1);
            stateMachine.ForFromSubroutine(States.Music2, subMusic2);
            stateMachine.ForFromSubroutine(States.SantaVideo, subSantaVideo);
            stateMachine.ForFromSubroutine(States.DarthVader, subStarWars);

            airR2D2.SetValue(true);
            airSanta1.SetValue(true);
            airOlaf.SetValue(true);
            laser.SetValue(true);

            hours
            //    .ControlsMasterPower(packages)
            //    .ControlsMasterPower(airSnowman)
            .ControlsMasterPower(airOlaf)
            .ControlsMasterPower(laser)
            .ControlsMasterPower(airSanta1)
            .ControlsMasterPower(airR2D2);
            //    .ControlsMasterPower(airSanta);

            buttonStartInflatables.Output.Subscribe(x =>
            {
                if (x && hours.IsOpen)
                {
                    inflatablesRunning.OnNext(true);
                }
            });

            acnOutput.Connect(new Physical.Pixel1D(pixelsRoofEdge, 0, 50), SacnUniverse6, 1);
            acnOutput.Connect(new Physical.Pixel1D(pixelsRoofEdge, 50, 100), SacnUniverse5, 1);

            var pixelMapping2D = Framework.Utility.PixelMapping.GeneratePixelMapping(20, 10, pixelOrder: Framework.Utility.PixelOrder.HorizontalSnakeBottomLeft);

            acnOutput.Connect(new Physical.Pixel2D(pixelsMatrix, pixelMapping2D), SacnUniverse10, 1);

            acnOutput.Connect(new Physical.Pixel1D(saberPixels, 0, 32), SacnUniverse12, 1);

            acnOutput.Connect(new Physical.GenericDimmer(airOlaf, 10), SacnUniverseDMX);
            acnOutput.Connect(new Physical.GenericDimmer(airReindeer, 12), SacnUniverseDMX);
            acnOutput.Connect(new Physical.GenericDimmer(airR2D2, 11), SacnUniverseDMX);
            acnOutput.Connect(new Physical.GenericDimmer(lightHat1, 96), SacnUniverseDMX);
            acnOutput.Connect(new Physical.GenericDimmer(lightHat2, 97), SacnUniverseDMX);
            acnOutput.Connect(new Physical.GenericDimmer(lightHat3, 98), SacnUniverseDMX);
            acnOutput.Connect(new Physical.GenericDimmer(lightHat4, 99), SacnUniverseDMX);
            acnOutput.Connect(new Physical.RGBStrobe(lightVader, 60), SacnUniverseDMX);
            acnOutput.Connect(new Physical.RGBStrobe(lightWall1, 70), SacnUniverseDMX);
            acnOutput.Connect(new Physical.RGBStrobe(lightWall2, 40), SacnUniverseDMX);
            acnOutput.Connect(new Physical.RGBStrobe(lightWall3, 80), SacnUniverseDMX);

            acnOutput.Connect(new Physical.GenericDimmer(laser, 4), SacnUniverseRenardBig);

            acnOutput.Connect(new Physical.GenericDimmer(lightOlaf, 128), SacnUniverseDMX);
            acnOutput.Connect(new Physical.GenericDimmer(lightSanta, 131), SacnUniverseDMX);
            acnOutput.Connect(new Physical.GenericDimmer(lightSnowman, 132), SacnUniverseDMX);
            acnOutput.Connect(new Physical.GenericDimmer(lightSnowman, 132), SacnUniverseDMX);
            acnOutput.Connect(new Physical.GenericDimmer(lightBlueButton, 262), SacnUniverseDMX);
            acnOutput.Connect(new Physical.GenericDimmer(lightRedButton, 263), SacnUniverseDMX);

            acnOutput.Connect(new Physical.GenericDimmer(lightR2D2, 16), SacnUniverseRenardBig);
            acnOutput.Connect(new Physical.GenericDimmer(lightRail2, 10), SacnUniverseRenardBig);
            acnOutput.Connect(new Physical.GenericDimmer(lightNet5, 11), SacnUniverseRenardBig);
            acnOutput.Connect(new Physical.GenericDimmer(lightNet6, 19), SacnUniverseRenardBig);
            acnOutput.Connect(new Physical.GenericDimmer(airSanta1, 20), SacnUniverseRenardBig);
            acnOutput.Connect(new Physical.GenericDimmer(lightNet7, 22), SacnUniverseRenardBig);

            acnOutput.Connect(new Physical.GenericDimmer(lightStairs2, 25), SacnUniverseRenardBig);
            acnOutput.Connect(new Physical.GenericDimmer(lightXmasTree, 26), SacnUniverseRenardBig);
            acnOutput.Connect(new Physical.GenericDimmer(lightReindeer2, 29), SacnUniverseRenardBig);
            acnOutput.Connect(new Physical.GenericDimmer(lightReindeer1, 32), SacnUniverseRenardBig);

            acnOutput.Connect(new Physical.GenericDimmer(lightStairs1, 1), SacnUniverseRenardSmall);
            acnOutput.Connect(new Physical.GenericDimmer(lightNet2, 2), SacnUniverseRenardSmall);
            acnOutput.Connect(new Physical.GenericDimmer(lightNet1, 3), SacnUniverseRenardSmall);
            acnOutput.Connect(new Physical.GenericDimmer(lightNet3, 4), SacnUniverseRenardSmall);
            acnOutput.Connect(new Physical.GenericDimmer(lightNet4, 5), SacnUniverseRenardSmall);
            acnOutput.Connect(new Physical.GenericDimmer(lightRail1, 6), SacnUniverseRenardSmall);
            acnOutput.Connect(new Physical.GenericDimmer(lightTopper1, 7), SacnUniverseRenardSmall);
            acnOutput.Connect(new Physical.GenericDimmer(lightTopper2, 8), SacnUniverseRenardSmall);

            hours.Output.Subscribe(x =>
            {
                if (x)
                {
                    stateMachine.GoToDefaultState();
                }
                else
                {
                    //if (buttonOverrideHours.Active)
                    //    return;

                    stateMachine.GoToIdle();

                    // Needed?
                    System.Threading.Thread.Sleep(200);

                    inflatablesRunning.OnNext(false);
                }
            });

            subBackground
            .LockWhenRunning(
                lightNet1,
                lightNet2,
                lightNet3,
                lightNet4,
                lightNet5,
                lightNet6,
                lightNet7,
                lightNet8,
                lightTopper1,
                lightTopper2,
                lightXmasTree,
                lightStairs1,
                lightStairs2,
                lightRail1,
                lightRail2,
                lightSanta,
                lightSnowman,
                lightHat1,
                lightHat2,
                lightHat3,
                lightHat4,
                lightReindeer1,
                lightReindeer2,
                lightVader,
                lightWall1,
                lightWall2,
                lightWall3,
                lightR2D2,
                lightOlaf,
                saberPixels)
            .RunAction(i =>
            {
                pulsatingEffect4.Start();
                lightR2D2.SetBrightness(1, i.Token);
                lightOlaf.SetBrightness(1, i.Token);
                lightNet1.SetBrightness(1, i.Token);
                lightNet2.SetBrightness(1, i.Token);
                lightNet3.SetBrightness(1, i.Token);
                lightNet4.SetBrightness(1, i.Token);
                lightNet5.SetBrightness(1, i.Token);
                lightNet6.SetBrightness(1, i.Token);
                lightNet7.SetBrightness(1, i.Token);
                lightNet8.SetBrightness(1, i.Token);
                lightTopper1.SetBrightness(1, i.Token);
                lightTopper2.SetBrightness(1, i.Token);
                lightXmasTree.SetBrightness(1, i.Token);
                lightStairs1.SetBrightness(1, i.Token);
                lightStairs2.SetBrightness(1, i.Token);
                lightRail1.SetBrightness(1, i.Token);
                lightRail2.SetBrightness(1, i.Token);
                lightSanta.SetBrightness(1, i.Token);
                lightSnowman.SetBrightness(1, i.Token);
                lightHat1.SetBrightness(1, i.Token);
                lightHat2.SetBrightness(1, i.Token);
                lightHat3.SetBrightness(1, i.Token);
                lightHat4.SetBrightness(1, i.Token);
                lightReindeer1.SetBrightness(1, i.Token);
                lightReindeer2.SetBrightness(1, i.Token);
                lightVader.SetColor(Color.Red, 1, i.Token);
                lightWall1.SetColor(Color.Red, 1, i.Token);
                lightWall2.SetColor(Color.Red, 1, i.Token);
                lightWall3.SetColor(Color.Red, 1, i.Token);

                saberPixels.SetColor(Color.Red, 0.4, i.Token);

                subCandyCane.Run();
                dmxPlayback.Run();

                i.WaitUntilCancel();

                dmxPlayback.Stop();
                Exec.Cancel(subCandyCane);
                pulsatingEffect4.Stop();
            });

            subCandyCane
            .LockWhenRunning(pixelsRoofEdge)
            .RunAction(i =>
            {
                const int spacing = 4;

                while (true)
                {
                    for (int x = 0; x < spacing; x++)
                    {
                        pixelsRoofEdge.Inject((x % spacing) == 0 ? Color.Red : Color.White, 0.5, i.Token);

                        i.WaitFor(S(0.30), true);
                    }
                }
            });

            subSnow
            .RunAction(ins =>
            {
                snowMachine.SetValue(true);

                ins.WaitFor(S(30));
            })
            .TearDown(i =>
            {
                snowMachine.SetValue(false);
            });

            subStarWarsCane
            .LockWhenRunning(
                pixelsRoofEdge,
                pixelsMatrix)
            .RunAction(instance =>
            {
                const int spacing = 4;

                while (!instance.CancelToken.IsCancellationRequested)
                {
                    for (int i = 0; i < spacing; i++)
                    {
                        switch (i % spacing)
                        {
                        case 0:
                        case 1:
                            pixelsRoofEdge.InjectRev(Color.Yellow, 1.0, instance.Token);
                            break;

                        case 2:
                        case 3:
                            pixelsRoofEdge.InjectRev(Color.Orange, 0.2, instance.Token);
                            break;
                        }

                        instance.WaitFor(S(0.1));

                        if (instance.IsCancellationRequested)
                        {
                            break;
                        }
                    }
                }
            });

            subMusic1
            .RunAction(ins =>
            {
                audioMain.PlayTrack("08 Feel the Light.wav");
                ins.WaitFor(S(240));
            }).TearDown(i =>
            {
                lorFeelTheLight.Stop();
                audioMain.PauseTrack();
            });

            subMusic2
            .RunAction(ins =>
            {
                snowMachine.SetValue(true);
                audioMain.PlayTrack("T.P.E. - 04 - Josh Groban - Believe.flac");
                ins.WaitFor(S(260));
            }).TearDown(i =>
            {
                snowMachine.SetValue(false);
                lorBelieve.Stop();
                audioMain.PauseTrack();
            });

            subSantaVideo
            .RunAction(i =>
            {
                pulsatingEffect3.Start();
                switch (random.Next(6))
                {
                case 0:
                    video3.PlayVideo("NBC_DeckTheHalls_Holl_H.mp4");
                    break;

                case 1:
                    video3.PlayVideo("NBC_AllThruHouse_Part1_Holl_H.mp4");
                    break;

                case 2:
                    video3.PlayVideo("NBC_AllThruHouse_Part2_Holl_H.mp4");
                    break;

                case 3:
                    video3.PlayVideo("NBC_AllThruHouse_Part3_Holl_H.mp4");
                    break;

                case 4:
                    video3.PlayVideo("NBC_JingleBells_Holl_H.mp4");
                    break;

                case 5:
                    video3.PlayVideo("NBC_WeWishYou_Holl_H.mp4");
                    break;
                }

                i.WaitFor(S(120), false);
                pulsatingEffect3.Stop();
            });

            subOlaf
            .RunAction(i =>
            {
                pulsatingEffect1.Start();
                audio1.PlayNewEffect("WarmHugs.wav", 0.0, 1.0);
                i.WaitFor(S(10));
                pulsatingEffect1.Stop();
            });

            subR2D2
            .RunAction(i =>
            {
                pulsatingEffect2.Start();
                audio1.PlayNewEffect("Im C3PO.wav", 1.0, 0.0);
                i.WaitFor(S(4));
                audio1.PlayNewEffect("Processing R2D2.wav", 0.5, 0.0);
                i.WaitFor(S(5));
                pulsatingEffect2.Stop();
            });

            subStarWars
            .LockWhenRunning(
                saberPixels,
                lightVader,
                lightR2D2)
            .RunAction(instance =>
            {
                //Exec.Cancel(subCandyCane);
                subStarWarsCane.Run();
                lightR2D2.SetBrightness(1.0, instance.Token);

                audioMain.PlayTrack("01. Star Wars - Main Title.wav");

                instance.WaitFor(S(16));

                /*
                 *  elJesus.SetPower(true);
                 *  pulsatingStar.Start();
                 *  lightJesus.SetColor(Color.White, 0.3);
                 *  light3wise.SetOnlyColor(Color.LightYellow);
                 *  light3wise.RunEffect(new Effect2.Fader(0.0, 1.0), S(1.0));*/

                Exec.MasterEffect.Fade(lightVader, 0.0, 1.0, 1000, token: instance.Token, additionalData: Utils.Data(Color.Red));
                instance.WaitFor(S(2.5));

                Exec.Cancel(subStarWarsCane);
                instance.WaitFor(S(0.5));

                audioDarthVader.PlayEffect("saberon.wav");
                for (int sab = 00; sab < 32; sab++)
                {
                    saberPixels.Inject(Color.Red, 0.5, instance.Token);
                    instance.WaitFor(S(0.01));
                }
                instance.WaitFor(S(1));
                audioMain.PauseTrack();

                lightVader.SetColor(Color.Red, 1.0, instance.Token);
                audioDarthVader.PlayEffect("father.wav");
                instance.WaitFor(S(5));

                lightVader.SetBrightness(0.0, instance.Token);
                //light3wise.TurnOff();
                //lightJesus.TurnOff();
                //pulsatingStar.Stop();
                //elJesus.TurnOff();

                audioDarthVader.PlayEffect("force1.wav");
                instance.WaitFor(S(4));

                audioDarthVader.PlayEffect("saberoff.wav");
                instance.WaitFor(S(0.7));
                for (int sab = 0; sab < 16; sab++)
                {
                    saberPixels.InjectRev(Color.Black, 0, instance.Token);
                    saberPixels.InjectRev(Color.Black, 0, instance.Token);
                    instance.WaitFor(S(0.01));
                }
                //elLightsaber.SetPower(false);
                instance.WaitFor(S(2));

                //lightJesus.TurnOff();
                //light3wise.TurnOff();
                //elLightsaber.TurnOff();
                //pulsatingStar.Stop();
                //elJesus.TurnOff();
                //instance.WaitFor(S(2));
            })
            .TearDown(i =>
            {
                audioMain.PauseTrack();
            });


            midiAkai.Note(midiChannel, 36).Subscribe(x =>
            {
                if (x)
                {
                    subOlaf.Run();
                }
            });

            midiAkai.Note(midiChannel, 37).Subscribe(x =>
            {
                if (x)
                {
                    subR2D2.Run();
                }
            });

            midiAkai.Note(midiChannel, 38).Subscribe(x =>
            {
                if (x)
                {
                    stateMachine.GoToState(States.Music1);
                }
                //                    audio2.PlayTrack("08 Feel the Light.wav");
            });

            midiAkai.Note(midiChannel, 39).Subscribe(x =>
            {
                if (x)
                {
                    lorFeelTheLight.Stop();
                    audioMain.PauseTrack();
                }
            });

            midiAkai.Note(midiChannel, 40).Subscribe(x =>
            {
                if (x)
                {
                    stateMachine.GoToState(States.SantaVideo);
                }
            });

            inOlaf.Output.Subscribe(x =>
            {
                if (x && hours.IsOpen)
                {
                    subOlaf.Run();
                }
            });

            inR2D2.Output.Subscribe(x =>
            {
                if (x && hours.IsOpen)
                {
                    subR2D2.Run();
                }
            });

            inRedButton.Output.Subscribe(x =>
            {
                if (x)
                {
                    if (hours.IsOpen)
                    {
                        if (stateMachine.CurrentState == States.Background)
                        {
                            stateMachine.GoToState(States.DarthVader);
                        }
                    }
                    else
                    {
                        audioDarthVader.PlayEffect("darthvader_lackoffaith.wav");
                    }
                }
            });

            inBlueButton.Output.Subscribe(x =>
            {
                if (x)
                {
                    if (hours.IsOpen)
                    {
                        subSnow.Run();
                        if (stateMachine.CurrentState == States.Background)
                        {
                            stateMachine.GoToState(States.Music2);
                        }
                    }
                    else
                    {
                        audioDarthVader.PlayEffect("darkside.wav");
                    }
                }
            });

            audioMain.AudioTrackStart += (o, e) =>
            {
                switch (e.FileName)
                {
                case "08 Feel the Light.wav":
                    lorFeelTheLight.Start(27830);
                    break;

                case "T.P.E. - 04 - Josh Groban - Believe.flac":
                    lorBelieve.Start();
                    break;
                }
            };

            audioMain.AudioTrackDone += (o, e) =>
            {
                //                Thread.Sleep(5000);
                //    audio2.PlayTrack("08 Feel the Light.wav");
            };

            inShowMachine.Output.Subscribe(x =>
            {
                snowMachine.SetValue(x);
                //                lightRedButton.SetBrightness(x ? 1.0 : 0.0);
                //if (x)
                //    stateMachine.GoToState(States.Music1);
            });

            in2.Output.Subscribe(x =>
            {
                if (x)
                {
                    stateMachine.GoToIdle();
                }
            });

            in3.Output.Subscribe(x =>
            {
                if (x)
                {
                    stateMachine.GoToDefaultState();
                }
            });

            ImportAndMapFeelTheLight();
            ImportAndMapBelieve();
        }