public bool GenerateDefaultConfig()
        {
            Logger.Log("GPIO config file doesnt exist. press c to continue generating default config or q to quit.");

            ConsoleKeyInfo?Key = Helpers.FetchUserInputSingleChar(TimeSpan.FromMinutes(1));

            if (!Key.HasValue)
            {
                Logger.Log("No value has been entered, continuing to run the program...");
            }
            else
            {
                switch (Key.Value.KeyChar)
                {
                case 'c':
                    break;

                case 'q':
                    System.Threading.Tasks.Task.Run(async() => await Core.Exit().ConfigureAwait(false));
                    return(false);

                default:
                    Logger.Log("Unknown value entered! continuing to run the program...");
                    break;
                }
            }

            Logger.Log("Generating default GPIO Config...");

            if (!Directory.Exists(Constants.ConfigDirectory))
            {
                Logger.Log("Config directory doesnt exist, creating one...");
                Directory.CreateDirectory(Constants.ConfigDirectory);
            }

            if (File.Exists(Constants.GpioConfigPath))
            {
                return(true);
            }

            GpioConfigRoot Config = new GpioConfigRoot {
                GPIOData = new List <GpioPinConfig>()
            };

            for (int i = 0; i <= 31; i++)
            {
                GpioPinConfig PinConfig = new GpioPinConfig()
                {
                    IsOn = false,
                    Mode = Enums.PinMode.Output,
                    Pin  = i
                };

                Config.GPIOData.Add(PinConfig);
            }

            SaveGPIOConfig(Config);
            return(true);
        }
示例#2
0
        public PiController(bool withPolling)
        {
            if (Core.DisablePiMethods || Core.RunningPlatform != OSPlatform.Linux)
            {
                Logger.Log("Failed to start PiController.", Enums.LogLevels.Warn);
                return;
            }

            Pi.Init <BootstrapWiringPi>();
            GpioPollingManager = new GpioEventManager(this);
            MorseTranslator    = new GpioMorseTranslator(this);
            PiBluetooth        = new BluetoothController();
            PiSound            = new SoundController();
            ControllerHelpers.DisplayPiInfo();
            PinConfigCollection.Clear();

            for (int i = 0; i < Constants.BcmGpioPins.Length; i++)
            {
                GpioPinConfig config = GetPinConfig(Constants.BcmGpioPins[i]);
                PinConfigCollection.Add(config);
                Logger.Log($"Generated config for {Constants.BcmGpioPins[i]} gpio pin.", Enums.LogLevels.Trace);
            }

            if (withPolling && GpioPollingManager != null)
            {
                Helpers.ScheduleTask(() => {
                    List <GpioPinEventData> pinData = new List <GpioPinEventData>();

                    if (Core.Config.RelayPins.Count() > 0)
                    {
                        foreach (int pin in Core.Config.RelayPins)
                        {
                            pinData.Add(new GpioPinEventData()
                            {
                                PinMode       = GpioPinDriveMode.Output,
                                GpioPin       = pin,
                                PinEventState = Enums.GpioPinEventStates.ALL
                            });
                        }

                        GpioPollingManager.RegisterGpioEvent(pinData);

                        foreach (GpioEventGenerator gen in GpioPollingManager.GpioPinEventGenerators)
                        {
                            gen.GPIOPinValueChanged += OnGpioPinValueChanged;
                        }
                    }
                }, TimeSpan.FromSeconds(5));
            }

            IsProperlyInitialized = true;
            Logger.Log("Initiated GPIO Controller class!", Enums.LogLevels.Trace);
        }
示例#3
0
        public GpioPinConfig GetPinConfig(int pinToCheck)
        {
            if (pinToCheck > 40)
            {
                return(null);
            }

            (int pin, GpioPinDriveMode driveMode, GpioPinValue pinValue) = GetGpio(pinToCheck);
            GpioPinConfig result = new GpioPinConfig()
            {
                PinValue            = pinValue,
                Mode                = driveMode,
                Pin                 = pin,
                IsDelayedTaskSet    = false,
                TaskSetAfterMinutes = 0
            };

            return(result);
        }
        public async Task <bool> RelayMorseCycle(string textToConvert, int relayPin)
        {
            if (Helpers.IsNullOrEmpty(textToConvert))
            {
                Logger.Log("The specified text is either null or empty.", Enums.LogLevels.Warn);
                return(false);
            }

            if (relayPin <= 0)
            {
                Logger.Log("Please specify a valid relay pin to run the cycle.", Enums.LogLevels.Warn);
                return(false);
            }

            Logger.Log($"Converting {textToConvert} to morse...", Enums.LogLevels.Trace);
            string Morse = MorseCore.ConvertToMorseCode(textToConvert);

            if (Helpers.IsNullOrEmpty(Morse))
            {
                Logger.Log("Conversion to morse failed. cannot proceed.", Enums.LogLevels.Warn);
                return(false);
            }

            Logger.Log($"TEXT >> {textToConvert}");
            Logger.Log($"MORSE >> {Morse}");

            if (Core.Config.RelayPins != null && Core.Config.RelayPins.Count() > 0)
            {
                foreach (int pin in Core.Config.RelayPins)
                {
                    if (pin.Equals(relayPin))
                    {
                        GpioPinConfig pinStatus = Controller.GetPinConfig(pin);

                        if (pinStatus.PinValue == GpioPinValue.Low)
                        {
                            Controller.SetGpioValue(pin, GpioPinDriveMode.Output, GpioPinValue.High);
                        }

                        break;
                    }
                }
            }

            if (!MorseCore.IsValidMorse(Morse))
            {
                Logger.Log("The specified morse is not valid!", Enums.LogLevels.Warn);
                return(false);
            }

            string pauseBetweenLetters = "_";                 // One Time Unit
            string pauseBetweenWords   = "_______";           // Seven Time Unit

            Morse = Morse.Replace("  ", pauseBetweenWords);
            Morse = Morse.Replace(" ", pauseBetweenLetters);

            foreach (char character in Morse.ToCharArray())
            {
                switch (character)
                {
                case '.':
                    Controller.SetGpioWithTimeout(relayPin, GpioPinDriveMode.Output, GpioPinValue.Low, TimeSpan.FromMilliseconds(300));
                    break;

                case '-':
                    Controller.SetGpioWithTimeout(relayPin, GpioPinDriveMode.Output, GpioPinValue.Low, TimeSpan.FromMilliseconds(300 * 3));
                    break;

                case '_':
                    await Task.Delay(300).ConfigureAwait(false);

                    break;
                }
            }

            if (Core.Config.RelayPins != null && Core.Config.RelayPins.Count() > 0)
            {
                foreach (int pin in Core.Config.RelayPins)
                {
                    GpioPinConfig pinStatus = Controller.GetPinConfig(pin);

                    if (pinStatus.PinValue == GpioPinValue.Low)
                    {
                        Controller.SetGpioValue(pin, GpioPinDriveMode.Output, GpioPinValue.High);
                    }
                }
            }

            return(true);
        }