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))); } }
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; } }
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); }
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); }