Ejemplo n.º 1
0
        public bool SetGpioWithTimeout(int pin, GpioPinMode mode, GpioPinState state, TimeSpan duration)
        {
            if (!PiController.IsValidPin(pin))
            {
                Logger.Log("The specified pin is invalid.");
                return(false);
            }

            if (PiController.PinConfigCollection.Count > 0 && PiController.PinConfigCollection.Where(x => x.Pin == pin && x.IsDelayedTaskSet).Any())
            {
                return(false);
            }

            if (SetGpioValue(pin, mode, state))
            {
                UpdatePinConfig(pin, mode, state, duration);

                Extensions.Helpers.ScheduleTask(() => {
                    if (SetGpioValue(pin, mode, GpioPinState.Off))
                    {
                        UpdatePinConfig(pin, mode, GpioPinState.Off, TimeSpan.Zero);
                    }
                }, duration);

                return(true);
            }

            return(false);
        }
Ejemplo n.º 2
0
        public void UpdatePinConfig(int pin, GpioPinMode mode, GpioPinState value, TimeSpan duration)
        {
            if (!PiController.IsValidPin(pin))
            {
                Logger.Log("The specified pin is invalid.");
                return;
            }

            if (PiController.PinConfigCollection.Count <= 0)
            {
                return;
            }

            foreach (GpioPinConfig config in PiController.PinConfigCollection)
            {
                if (config.Pin == pin)
                {
                    config.IsDelayedTaskSet    = duration != TimeSpan.Zero;
                    config.TaskSetAfterMinutes = duration != TimeSpan.Zero ? duration.Minutes : 0;
                    config.Mode     = mode;
                    config.PinValue = value;
                    break;
                }
            }
        }
Ejemplo n.º 3
0
    private void Update()
    {
        RaycastHit hit;
        Vector3    fwd = transform.TransformDirection(Vector3.forward);

        int mask = 1 << LayerMask.NameToLayer(excludeLayerName) | layerMaskInteract.value;

        if (Physics.Raycast(transform.position, fwd, out hit, rayLength, mask))
        {
            if (hit.collider.CompareTag(interactableTag))
            {
                raycastedObj = hit.collider.gameObject.GetComponent <PiController>();
                CrosshairChange(true);

                isCrosshairActive = true;
                crosshair.enabled = true;
                doOnce            = true;

                if (Input.GetKeyDown(openDoorKey))
                {
                    raycastedObj.Collect();
                }
            }
        }

        else
        {
            if (isCrosshairActive)
            {
                CrosshairChange(false);
                doOnce = false;
            }
        }
    }
Ejemplo n.º 4
0
        public bool SetGpioValue(int pin, GpioPinMode mode)
        {
            if (!PiController.IsValidPin(pin))
            {
                return(false);
            }

            GpioPin GpioPin = (GpioPin)Pi.Gpio[pin];

            GpioPin.PinMode = (GpioPinDriveMode)mode;
            Logger.Trace($"Configured ({pin}) gpio pin with ({mode.ToString()}) mode.");
            return(true);
        }
Ejemplo n.º 5
0
        public GpioPinConfig GetGpioConfig(int pinNumber)
        {
            if (!PiController.IsValidPin(pinNumber) || Controller == null)
            {
                return(new GpioPinConfig());
            }

            PinValue      value  = Controller.Read(pinNumber);
            PinMode       mode   = Controller.GetPinMode(pinNumber);
            GpioPinConfig config = new GpioPinConfig(pinNumber, value == PinValue.High ? GpioPinState.Off : GpioPinState.On, mode == PinMode.Input ? GpioPinMode.Input : GpioPinMode.Output, false, 0);

            return(config);
        }
Ejemplo n.º 6
0
        public GpioPinConfig GetGpioConfig(int pinNumber)
        {
            if (!PiController.IsAllowedToExecute || !IsDriverProperlyInitialized)
            {
                return(new GpioPinConfig());
            }

            if (!PiController.IsValidPin(pinNumber))
            {
                Logger.Log("The specified pin is invalid.");
                return(new GpioPinConfig());
            }

            GpioPin pin = (GpioPin)Pi.Gpio[pinNumber];

            return(new GpioPinConfig(pinNumber, (GpioPinState)pin.ReadValue(), (GpioPinMode)pin.PinMode, false, 0));
        }
Ejemplo n.º 7
0
        public bool SetGpioValue(int pin, GpioPinState state)
        {
            if (!PiController.IsValidPin(pin))
            {
                return(false);
            }

            GpioPin GpioPin = (GpioPin)Pi.Gpio[pin];

            if (GpioPin.PinMode == GpioPinDriveMode.Output)
            {
                GpioPin.Write((GpioPinValue)state);
                Logger.Trace($"Configured ({pin}) gpio pin to ({state.ToString()}) state.");
                return(true);
            }

            return(false);
        }
Ejemplo n.º 8
0
        private async Task ProcessOnReceived(BaseRequest request)
        {
            switch (request.TypeCode)
            {
            case TYPE_CODE.EVENT_PIN_STATE:
                break;

            case TYPE_CODE.UNKNOWN:
                break;

            case TYPE_CODE.SET_ALARM:
                break;

            case TYPE_CODE.SET_GPIO:
                if (string.IsNullOrEmpty(request.RequestObject))
                {
                    return;
                }

                SetGpioRequest setGpioRequest = JsonConvert.DeserializeObject <SetGpioRequest>(request.RequestObject);
                if (!PiController.IsValidPin(setGpioRequest.PinNumber))
                {
                    return;
                }

                if (Core.PiController == null || !Core.PiController.IsControllerProperlyInitialized || Core.PinController == null)
                {
                    return;
                }

                if (Client == null || Client.IsDisposed)
                {
                    return;
                }

                if (Core.PinController.SetGpioValue(setGpioRequest.PinNumber, (GpioPinMode)setGpioRequest.PinMode, (GpioPinState)setGpioRequest.PinState))
                {
                    GpioPinConfig config = Core.PinController.GetGpioConfig(setGpioRequest.PinNumber);
                    if (await Client.SendAsync(new BaseResponse(DateTime.Now, TYPE_CODE.SET_GPIO, "Success!", GpioPinConfig.AsJson(config))).ConfigureAwait(false))
                    {
                        Logger.Log($"{request.TypeCode.ToString()} response send!", LogLevels.Trace);
                        return;
                    }
                }

                await Client.SendAsync(new BaseResponse(DateTime.Now, TYPE_CODE.SET_GPIO, "Failed.", string.Empty)).ConfigureAwait(false);

                break;

            case TYPE_CODE.SET_GPIO_DELAYED:
                if (string.IsNullOrEmpty(request.RequestObject))
                {
                    return;
                }

                SetGpioDelayedRequest setGpioDelayedRequest = JsonConvert.DeserializeObject <SetGpioDelayedRequest>(request.RequestObject);
                if (!PiController.IsValidPin(setGpioDelayedRequest.PinNumber))
                {
                    return;
                }

                if (Core.PiController == null || !Core.PiController.IsControllerProperlyInitialized || Core.PinController == null)
                {
                    return;
                }

                if (Client == null || Client.IsDisposed)
                {
                    return;
                }

                if (Core.PinController.SetGpioWithTimeout(setGpioDelayedRequest.PinNumber, (GpioPinMode)setGpioDelayedRequest.PinMode, (GpioPinState)setGpioDelayedRequest.PinState, TimeSpan.FromMinutes(setGpioDelayedRequest.Delay)))
                {
                    GpioPinConfig config = Core.PinController.GetGpioConfig(setGpioDelayedRequest.PinNumber);
                    if (await Client.SendAsync(new BaseResponse(DateTime.Now, TYPE_CODE.SET_GPIO_DELAYED, "Success!", GpioPinConfig.AsJson(config))).ConfigureAwait(false))
                    {
                        Logger.Log($"{request.TypeCode.ToString()} response send!", LogLevels.Trace);
                        return;
                    }
                }

                await Client.SendAsync(new BaseResponse(DateTime.Now, TYPE_CODE.SET_GPIO_DELAYED, "Failed.", string.Empty)).ConfigureAwait(false);

                break;

            case TYPE_CODE.SET_REMAINDER:
                break;

            case TYPE_CODE.GET_GPIO:
                break;

            case TYPE_CODE.GET_GPIO_PIN:
                break;

            case TYPE_CODE.GET_WEATHER:
                break;

            case TYPE_CODE.GET_ASSISTANT_INFO:
                break;

            case TYPE_CODE.GET_PI_INFO:
                break;

            case TYPE_CODE.SET_PI:
                break;

            case TYPE_CODE.SET_ASSISTANT:
                break;

            default:
                break;
            }
        }
Ejemplo n.º 9
0
        private static async Task DisplayConsoleCommandMenu()
        {
            Logger.Log("Displaying console command window", LogLevels.Trace);
            Logger.Log($"------------------------- COMMAND WINDOW -------------------------", LogLevels.Input);
            Logger.Log($"{Constants.ConsoleShutdownKey} - Shutdown assistant.", LogLevels.Input);

            if (!PiController.IsAllowedToExecute)
            {
                Logger.Log($"{Constants.ConsoleRelayCommandMenuKey} - Display relay pin control menu.", LogLevels.Input);
                Logger.Log($"{Constants.ConsoleRelayCycleMenuKey} - Display relay cycle control menu.", LogLevels.Input);

                if (Config.EnableModules)
                {
                    Logger.Log($"{Constants.ConsoleModuleShutdownKey} - Invoke shutdown method on all currently running modules.", LogLevels.Input);
                }

                Logger.Log($"{Constants.ConsoleMorseCodeKey} - Morse code generator for the specified text.", LogLevels.Input);
            }

            Logger.Log($"{Constants.ConsoleTestMethodExecutionKey} - Run preconfigured test methods or tasks.", LogLevels.Input);
            if (WeatherClient != null)
            {
                Logger.Log($"{Constants.ConsoleWeatherInfoKey} - Get weather info of the specified location based on the pin code.", LogLevels.Input);
            }

            Logger.Log($"-------------------------------------------------------------------", LogLevels.Input);
            Logger.Log("Awaiting user input: \n", LogLevels.Input);

            int failedTriesCount = 0;
            int maxTries         = 3;

            while (true)
            {
                if (failedTriesCount > maxTries)
                {
                    Logger.Log($"Multiple wrong inputs. please start the command menu again  by pressing {Constants.ConsoleCommandMenuKey} key.", LogLevels.Warn);
                    return;
                }

                char pressedKey = Console.ReadKey().KeyChar;

                switch (pressedKey)
                {
                case Constants.ConsoleShutdownKey:
                    Logger.Log("Shutting down assistant...", LogLevels.Warn);
                    await Task.Delay(1000).ConfigureAwait(false);
                    await Exit(0).ConfigureAwait(false);

                    return;

                case Constants.ConsoleRelayCommandMenuKey when !PiController.IsAllowedToExecute:
                    Logger.Log("Displaying relay command menu...", LogLevels.Warn);
                    DisplayRelayCommandMenu();
                    return;

                case Constants.ConsoleRelayCycleMenuKey when !PiController.IsAllowedToExecute:
                    Logger.Log("Displaying relay cycle menu...", LogLevels.Warn);
                    await DisplayRelayCycleMenu().ConfigureAwait(false);

                    return;

                case Constants.ConsoleRelayCommandMenuKey when PiController.IsAllowedToExecute:
                case Constants.ConsoleRelayCycleMenuKey when PiController.IsAllowedToExecute:
                    Logger.Log("Assistant is running in an Operating system/Device which doesn't support GPIO pin controlling functionality.", LogLevels.Warn);
                    return;

                case Constants.ConsoleMorseCodeKey when !PiController.IsAllowedToExecute:
                    if (PiController == null)
                    {
                        return;
                    }

                    Logger.Log("Enter text to convert to Morse: ");
                    string morseCycle      = Console.ReadLine();
                    var    morseTranslator = PiController.GetMorseTranslator();

                    if (morseTranslator == null || !morseTranslator.IsTranslatorOnline)
                    {
                        Logger.Warning("Morse translator is offline or unavailable.");
                        return;
                    }

                    await morseTranslator.RelayMorseCycle(morseCycle, Config.OutputModePins[0]).ConfigureAwait(false);

                    return;

                case Constants.ConsoleWeatherInfoKey:
                    Logger.Log("Please enter the pin code of the location: ");
                    int counter = 0;

                    int pinCode;
                    while (true)
                    {
                        if (counter > 4)
                        {
                            Logger.Log("Failed multiple times. aborting...");
                            return;
                        }

                        try {
                            pinCode = Convert.ToInt32(Console.ReadLine());
                            break;
                        }
                        catch {
                            counter++;
                            Logger.Log("Please try again!", LogLevels.Warn);
                            continue;
                        }
                    }

                    if (string.IsNullOrEmpty(Config.OpenWeatherApiKey))
                    {
                        Logger.Warning("Weather api key cannot be null.");
                        return;
                    }

                    if (WeatherClient == null)
                    {
                        Logger.Warning("Weather client is not initiated.");
                        return;
                    }

                    WeatherResponse?response = await WeatherClient.GetWeather(Config.OpenWeatherApiKey, pinCode, "in").ConfigureAwait(false);

                    if (response == null)
                    {
                        Logger.Warning("Failed to fetch weather response.");
                        return;
                    }

                    Logger.Log($"------------ Weather information for {pinCode}/{response.LocationName} ------------", LogLevels.Green);

                    if (response.Data != null)
                    {
                        Logger.Log($"Temperature: {response.Data.Temperature}", LogLevels.Green);
                        Logger.Log($"Humidity: {response.Data.Humidity}", LogLevels.Green);
                        Logger.Log($"Pressure: {response.Data.Pressure}", LogLevels.Green);
                    }

                    if (response.Wind != null)
                    {
                        Logger.Log($"Wind speed: {response.Wind.Speed}", LogLevels.Green);
                    }

                    if (response.Location != null)
                    {
                        Logger.Log($"Latitude: {response.Location.Latitude}", LogLevels.Green);
                        Logger.Log($"Longitude: {response.Location.Longitude}", LogLevels.Green);
                        Logger.Log($"Location name: {response.LocationName}", LogLevels.Green);
                    }

                    return;

                case Constants.ConsoleTestMethodExecutionKey:
                    Logger.Log("Executing test methods/tasks", LogLevels.Warn);
                    Logger.Log("Test method execution finished successfully!", LogLevels.Green);
                    return;

                case Constants.ConsoleModuleShutdownKey when ModuleLoader.Modules.Count > 0 && Config.EnableModules:
                    Logger.Log("Shutting down all modules...", LogLevels.Warn);
                    ModuleLoader.OnCoreShutdown();
                    return;

                case Constants.ConsoleModuleShutdownKey when ModuleLoader.Modules.Count <= 0:
                    Logger.Log("There are no modules to shutdown...");
                    return;

                default:
                    if (failedTriesCount > maxTries)
                    {
                        Logger.Log($"Unknown key was pressed. ({maxTries - failedTriesCount} tries left)", LogLevels.Warn);
                    }

                    failedTriesCount++;
                    continue;
                }
            }
        }
Ejemplo n.º 10
0
        /// <summary>
        /// This method starts up the assistant core.
        /// After registration of very important events on Program.cs, control moves to here.
        /// This is basically the entry point of the application.
        /// </summary>
        /// <param name="args">The startup arguments. (if any)</param>
        /// <returns></returns>
        public static async Task <bool> InitCore(string[] args)
        {
            if (File.Exists(Constants.TraceLogPath))
            {
                File.Delete(Constants.TraceLogPath);
            }

            Helpers.CheckMultipleProcess();
            StartupTime = DateTime.Now;

            if (Helpers.CheckForInternetConnection())
            {
                IsNetworkAvailable = true;
            }
            else
            {
                Logger.Log("No internet connection.", Enums.LogLevels.Warn);
                Logger.Log($"Starting {AssistantName} in offline mode...");
                IsNetworkAvailable = false;
            }

            Config                    = Config.LoadConfig();
            RunningPlatform           = Helpers.GetOsPlatform();
            AssistantName             = Config.AssistantDisplayName;
            Logger.LogIdentifier      = AssistantName;
            Config.ProgramLastStartup = StartupTime;
            Constants.LocalIP         = Helpers.GetLocalIpAddress();

            SecureLine = new SecureLineServer(IPAddress.Any, 7777);
            SecureLine.StartSecureLine();

            SendLocalIp(!Helpers.IsNullOrEmpty(Constants.LocalIP));

            Helpers.SetFileSeperator();

            Helpers.GenerateAsciiFromText(Config.AssistantDisplayName);
            Constants.ExternelIP = Helpers.GetExternalIp();

            File.WriteAllText("version.txt", Constants.Version.ToString());

            if (Helpers.IsNullOrEmpty(Constants.ExternelIP))
            {
                Constants.ExternelIP = "Failed.";
            }

            Helpers.InBackgroundThread(SetConsoleTitle, "Console Title Updater", true);
            Logger.Log($"X---------------- Starting {AssistantName} v{Constants.Version} ----------------X", Enums.LogLevels.Ascii);

            ConfigWatcher.InitConfigWatcher();
            ParseStartupArguments(args);

            if (!Helpers.IsNullOrEmpty(Config.PushBulletApiKey))
            {
                PushBulletService = new PushBulletService(Config.PushBulletApiKey);
                (bool status, UserDeviceListResponse currentPushDevices) = PushBulletService.InitPushService();

                if (status)
                {
                    Logger.Log("Push bullet service started.", Enums.LogLevels.Trace);
                }
            }

            if (!Helpers.IsRaspberryEnvironment())
            {
                DisablePiMethods = true;
                IsUnknownOs      = true;
            }

            if (Helpers.GetOsPlatform().Equals(OSPlatform.Windows))
            {
                AssistantStatus = new ProcessStatus();
            }
            else
            {
                Logger.Log("Could not start performence counters as it is not supported on this platform.", Enums.LogLevels.Trace);
            }

            await Update.CheckAndUpdateAsync(true).ConfigureAwait(false);

            if (Config.KestrelServer && !Helpers.IsNullOrEmpty(Config.KestrelServerUrl))
            {
                await KestrelServer.Start().ConfigureAwait(false);
            }

            ModuleLoader = new ModuleInitializer();

            ModuleLoader.LoadAndStartModulesOfType <IModuleBase>();

            ModuleWatcher.InitModuleWatcher();
            Controller = new PiController(true);
            CoreInitiationCompleted = true;

            await PostInitTasks().ConfigureAwait(false);

            return(true);
        }
Ejemplo n.º 11
0
 public GpioEventManager(PiController controller)
 {
     Controller = controller ?? throw new ArgumentNullException();
 }