public ActionResult <GenericResponse <string> > GetPinStatus(int pinNumber)
        {
            if (pinNumber < 0 || pinNumber > 31)
            {
                return(NotFound(Json(new GenericResponse <string>("The specified pin is either less than 0 or greater than 31.", Enums.HttpStatusCodes.NoContent, DateTime.Now))));
            }

            if (Core.IsUnknownOs)
            {
                return(BadRequest(new GenericResponse <string>("Failed to fetch pin status, Core running on unknown OS.", Enums.HttpStatusCodes.BadRequest,
                                                               DateTime.Now)));
            }

            if (!Core.CoreInitiationCompleted)
            {
                return(BadRequest(new GenericResponse <string>(
                                      $"{Core.AssistantName} core initiation isn't completed yet, please be patient while it is completed. retry after 20 seconds.",
                                      Enums.HttpStatusCodes.BadRequest, DateTime.Now)));
            }

            try {
                GpioPinConfig config = Core.Controller.GetPinConfig(pinNumber);
                return(Ok(new GenericResponse <GpioPinConfig>(config, Enums.HttpStatusCodes.OK, DateTime.Now)));
            }
            catch (NullReferenceException) {
                return(NotFound(new GenericResponse <string>("the specified pin isn't found or the pin configuration cannot be accessed", Enums.HttpStatusCodes.NotFound, DateTime.Now)));
            }
        }
Beispiel #2
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);
        }
        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;
            }
        }
Beispiel #4
0
        private async Task <string> OnGpioRequestAsync(GpioRequest request)
        {
            if (request == null || Helpers.IsNullOrEmpty(request.Command))
            {
                return(null);
            }

            await ProcessingSemaphore.WaitAsync().ConfigureAwait(false);

            int pinNumber;
            GpioPinDriveMode mode;
            GpioPinValue     value;
            string           result = null;

            switch (request.Command)
            {
            case "SETGPIO" when request.StringParameters.Count == 4:
                if (request.StringParameters == null)
                {
                    result = null;
                }

                pinNumber = Convert.ToInt32(request.StringParameters[0].Trim());
                mode      = (GpioPinDriveMode)Convert.ToInt32(request.StringParameters[1].Trim());
                value     = (GpioPinValue)Convert.ToInt32(request.StringParameters[2].Trim());
                int delay = Convert.ToInt32(request.StringParameters[3].Trim());
                if (Core.Controller.SetGpioWithTimeout(pinNumber, mode, value, TimeSpan.FromMinutes(delay)))
                {
                    result = $"Successfully set {pinNumber} pin to {mode.ToString()} mode with value {value.ToString()} for {delay} minutes.";
                }
                else
                {
                    result = "Failed";
                }
                break;

            case "SETGPIO" when request.StringParameters.Count == 3:
                if (request.StringParameters == null)
                {
                    result = null;
                }

                pinNumber = Convert.ToInt32(request.StringParameters[0].Trim());
                mode      = (GpioPinDriveMode)Convert.ToInt32(request.StringParameters[1].Trim());
                value     = (GpioPinValue)Convert.ToInt32(request.StringParameters[2].Trim());
                if (Core.Controller.SetGpioValue(pinNumber, mode, value))
                {
                    result = $"Successfully set {pinNumber} pin to {mode.ToString()} mode with value {value.ToString()}";
                }
                else
                {
                    result = "Failed";
                }
                break;

            case "SETGPIO" when request.StringParameters.Count == 2:
                if (request.StringParameters == null)
                {
                    result = null;
                }

                pinNumber = Convert.ToInt32(request.StringParameters[0].Trim());
                mode      = (GpioPinDriveMode)Convert.ToInt32(request.StringParameters[1].Trim());

                if (Core.Controller.SetGpioValue(pinNumber, mode, GpioPinValue.High))
                {
                    result = $"Successfully set {pinNumber} pin to {mode.ToString()} mode.";
                }
                else
                {
                    result = "Failed";
                }
                break;

            case "GETGPIO" when request.StringParameters.Count == 1:
                if (request.StringParameters == null)
                {
                    result = null;
                }

                pinNumber = Convert.ToInt32(request.StringParameters[0].Trim());
                GpioPinConfig pinConfig = Core.Controller.GetPinConfig(pinNumber);

                GetGpioResponse response = new GetGpioResponse()
                {
                    DriveMode = pinConfig.Mode,
                    PinNumber = pinConfig.Pin,
                    PinValue  = pinConfig.PinValue
                };

                result = ObjectToString <GetGpioResponse>(response);
                break;
            }

            ProcessingSemaphore.Release();
            return(result);
        }
Beispiel #5
0
        private static void DisplayRelayCommandMenu()
        {
            Logger.Log("-------------------- RELAY COMMAND MENU --------------------", Enums.LogLevels.UserInput);
            Logger.Log("1 | Relay pin 1", Enums.LogLevels.UserInput);
            Logger.Log("2 | Relay pin 2", Enums.LogLevels.UserInput);
            Logger.Log("3 | Relay pin 3", Enums.LogLevels.UserInput);
            Logger.Log("4 | Relay pin 4", Enums.LogLevels.UserInput);
            Logger.Log("5 | Relay pin 5", Enums.LogLevels.UserInput);
            Logger.Log("6 | Relay pin 6", Enums.LogLevels.UserInput);
            Logger.Log("7 | Relay pin 7", Enums.LogLevels.UserInput);
            Logger.Log("8 | Relay pin 8", Enums.LogLevels.UserInput);
            Logger.Log("9 | Schedule task for specified relay pin", Enums.LogLevels.UserInput);
            Logger.Log("0 | Exit menu", Enums.LogLevels.UserInput);
            Logger.Log("Press any key (between 0 - 9) for their respective option.\n", Enums.LogLevels.UserInput);
            ConsoleKeyInfo key = Console.ReadKey();

            Logger.Log("\n", Enums.LogLevels.UserInput);

            if (!int.TryParse(key.KeyChar.ToString(), out int SelectedValue))
            {
                Logger.Log("Could not parse the input key. please try again!", Enums.LogLevels.Error);
                Logger.Log("Command menu closed.");
                Logger.Log($"Press {Constants.ConsoleCommandMenuKey} for the console command menu.", Enums.LogLevels.Success);
                return;
            }

            void set(int pin)
            {
                GpioPinConfig pinStatus = Controller.GetPinConfig(pin);

                if (pinStatus.PinValue == GpioPinValue.Low)
                {
                    Controller.SetGpioValue(pin, GpioPinDriveMode.Output, GpioPinValue.High);
                    Logger.Log($"Sucessfully set {pin} pin to OFF.", Enums.LogLevels.Success);
                }
                else
                {
                    Controller.SetGpioValue(pin, GpioPinDriveMode.Output, GpioPinValue.Low);
                    Logger.Log($"Sucessfully set {pin} pin to ON.", Enums.LogLevels.Success);
                }
            }

            switch (SelectedValue)
            {
            case 1:
                set(Config.RelayPins[0]);
                break;

            case 2:
                set(Config.RelayPins[1]);
                break;

            case 3:
                set(Config.RelayPins[2]);
                break;

            case 4:
                set(Config.RelayPins[3]);
                break;

            case 5:
                set(Config.RelayPins[4]);
                break;

            case 6:
                set(Config.RelayPins[5]);
                break;

            case 7:
                set(Config.RelayPins[6]);
                break;

            case 8:
                set(Config.RelayPins[7]);
                break;

            case 9:
                Logger.Log("Please enter the pin u want to configure: ", Enums.LogLevels.UserInput);
                string pinNumberKey = Console.ReadLine();

                if (!int.TryParse(pinNumberKey, out int pinNumber) || Convert.ToInt32(pinNumberKey) <= 0)
                {
                    Logger.Log("Your entered pin number is incorrect. please enter again.", Enums.LogLevels.UserInput);

                    pinNumberKey = Console.ReadLine();
                    if (!int.TryParse(pinNumberKey, out pinNumber) || Convert.ToInt32(pinNumberKey) <= 0)
                    {
                        Logger.Log("Your entered pin number is incorrect again. press m for menu, and start again!", Enums.LogLevels.UserInput);
                        return;
                    }
                }

                Logger.Log("Please enter the amount of delay you want in between the task. (in minutes)", Enums.LogLevels.UserInput);
                string delayInMinuteskey = Console.ReadLine();
                if (!int.TryParse(delayInMinuteskey, out int delay) || Convert.ToInt32(delayInMinuteskey) <= 0)
                {
                    Logger.Log("Your entered delay is incorrect. please enter again.", Enums.LogLevels.UserInput);

                    delayInMinuteskey = Console.ReadLine();
                    if (!int.TryParse(delayInMinuteskey, out delay) || Convert.ToInt32(delayInMinuteskey) <= 0)
                    {
                        Logger.Log("Your entered pin is incorrect again. press m for menu, and start again!", Enums.LogLevels.UserInput);
                        return;
                    }
                }

                Logger.Log("Please enter the status u want the task to configure: (0 = OFF, 1 = ON)", Enums.LogLevels.UserInput);

                string pinStatuskey = Console.ReadLine();
                if (!int.TryParse(pinStatuskey, out int pinStatus) || (Convert.ToInt32(pinStatuskey) != 0 && Convert.ToInt32(pinStatus) != 1))
                {
                    Logger.Log("Your entered pin status is incorrect. please enter again.", Enums.LogLevels.UserInput);

                    pinStatuskey = Console.ReadLine();
                    if (!int.TryParse(pinStatuskey, out pinStatus) || (Convert.ToInt32(pinStatuskey) != 0 && Convert.ToInt32(pinStatus) != 1))
                    {
                        Logger.Log("Your entered pin status is incorrect again. press m for menu, and start again!", Enums.LogLevels.UserInput);
                        return;
                    }
                }

                GpioPinConfig status = Controller.GetPinConfig(pinNumber);

                if (status.PinValue == GpioPinValue.Low && pinStatus.Equals(1))
                {
                    Logger.Log("Pin is already configured to be in ON State. Command doesn't make any sense.");
                    return;
                }

                if (status.PinValue == GpioPinValue.High && pinStatus.Equals(0))
                {
                    Logger.Log("Pin is already configured to be in OFF State. Command doesn't make any sense.");
                    return;
                }

                if (Config.IRSensorPins.Contains(pinNumber))
                {
                    Logger.Log("Sorry, the specified pin is pre-configured for IR Sensor. cannot modify!");
                    return;
                }

                if (!Config.RelayPins.Contains(pinNumber))
                {
                    Logger.Log("Sorry, the specified pin doesn't exist in the relay pin catagory.");
                    return;
                }

                Helpers.ScheduleTask(() => {
                    if (status.PinValue == GpioPinValue.Low && pinStatus.Equals(0))
                    {
                        Controller.SetGpioValue(pinNumber, GpioPinDriveMode.Output, GpioPinValue.High);
                        Logger.Log($"Sucessfully finished execution of the task: {pinNumber} pin set to OFF.", Enums.LogLevels.Success);
                    }

                    if (status.PinValue == GpioPinValue.High && pinStatus.Equals(1))
                    {
                        Controller.SetGpioValue(pinNumber, GpioPinDriveMode.Output, GpioPinValue.Low);
                        Logger.Log($"Sucessfully finished execution of the task: {pinNumber} pin set to ON.", Enums.LogLevels.Success);
                    }
                }, TimeSpan.FromMinutes(delay));

                Logger.Log(
                    pinStatus.Equals(0)
                                                        ? $"Successfully scheduled a task: set {pinNumber} pin to OFF"
                                                        : $"Successfully scheduled a task: set {pinNumber} pin to ON", Enums.LogLevels.Success);
                break;
            }

            Logger.Log("Command menu closed.");
            Logger.Log($"Press {Constants.ConsoleCommandMenuKey} for the console command menu.", Enums.LogLevels.Success);
        }