Skip to content

Commit

Permalink
- Added device multicasting to send moves to multiple devices at once
Browse files Browse the repository at this point in the history
  • Loading branch information
RonSijm committed Jan 6, 2023
1 parent 5173078 commit 5ecde19
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 41 deletions.
14 changes: 9 additions & 5 deletions RonSijm.ButtFish/ButtFishCore.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public async Task Start()
Console.WriteLine($"Using engine: {enginePath.Name}");

var deviceDiscoveryManager = new DeviceDiscoveryManager();
using var device = await deviceDiscoveryManager.GetDevice();
var devices = await deviceDiscoveryManager.GetDevice();

_iuciEngine = new UCIEngine(enginePath.Path);

Expand Down Expand Up @@ -76,7 +76,7 @@ public async Task Start()
nextPosition = nextPosition.Substring(2, 2);
}

await SendNextMoveToDevice(nextPosition, device);
await SendNextMoveToDevice(nextPosition, devices);
Console.WriteLine();
}
else
Expand Down Expand Up @@ -115,7 +115,7 @@ public async Task Start()
}


private async Task SendNextMoveToDevice(string nextPosition, IDeviceAbstraction device)
private async Task SendNextMoveToDevice(string nextPosition, IList<IDeviceAbstraction> devices)
{
Console.WriteLine(nextPosition);

Expand All @@ -127,22 +127,26 @@ private async Task SendNextMoveToDevice(string nextPosition, IDeviceAbstraction

foreach (var morseCodeChar in morseCodeForChar)
{
var durationToSend = 0;

if (morseCodeChar == '.')
{
Console.Write('.');
await device.SendDuration(TimeUnitConfig.DotTime);
durationToSend = TimeUnitConfig.DotTime;
}
else if (morseCodeChar == '-')
{
Console.Write('-');
await device.SendDuration(TimeUnitConfig.DashTime);
durationToSend = TimeUnitConfig.DashTime;
}
else
{
// Should never happen
throw new ArgumentException(nameof(morseCodeChar));
}

Task.WaitAll(devices.Select(device => device.SendDuration(durationToSend)).ToArray());

// Wait 1 time unit
Console.Write(" ");
await Task.Delay(TimeUnitConfig.SpaceBetweenSymbols);
Expand Down
5 changes: 3 additions & 2 deletions RonSijm.ButtFish/Connectors/ButtplugConnector.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Buttplug;
using System.Drawing;
using Buttplug;
using RonSijm.ButtFish.Models;

namespace RonSijm.ButtFish.Connectors;
Expand All @@ -11,7 +12,7 @@ public async Task<List<IDeviceAbstraction>> GetDiscoveredDevices(string discover
{
Console.WriteLine(discoverAddress == null ? "Starting to scan for ButtPlug Devices..." : $"Attempting to connect to {discoverAddress}...");

Console.WriteLine("Will return results after 5 seconds.");
Colorful.Console.WriteLine("Will return results after 5 seconds.", Color.Green);

if (discoverAddress == null)
{
Expand Down
48 changes: 36 additions & 12 deletions RonSijm.ButtFish/DeviceDiscoveryManager.cs
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
using RonSijm.ButtFish.Connectors;
using RonSijm.ButtFish.Helpers;
using RonSijm.ButtFish.Models;
using Color = System.Drawing.Color;

namespace RonSijm.ButtFish;

public class DeviceDiscoveryManager
{
public async Task<IDeviceAbstraction> GetDevice()
public async Task<IList<IDeviceAbstraction>> GetDevice()
{
IDeviceAbstraction device;
IList<IDeviceAbstraction> device;

do
{
Expand Down Expand Up @@ -37,7 +36,7 @@ public async Task<IDeviceAbstraction> GetDevice()
return device;
}

private static async Task<IDeviceAbstraction> GetDeviceByChoice(ConsoleKey usageChoice)
private static async Task<IList<IDeviceAbstraction>> GetDeviceByChoice(ConsoleKey usageChoice)
{
if (usageChoice == ConsoleKey.D1)
{
Expand All @@ -51,8 +50,10 @@ private static async Task<IDeviceAbstraction> GetDeviceByChoice(ConsoleKey usage
Colorful.Console.WriteLine("Please provide Yeelight IP or hostname...", Color.Green);
var ipAddress = Console.ReadLine();
Console.WriteLine();

return await yeelightConnector.GetDeviceToUse(ipAddress);

var device = await yeelightConnector.GetDeviceToUse(ipAddress);

return new List<IDeviceAbstraction>(){ device };
}
else if (usageChoice == ConsoleKey.D3)
{
Expand All @@ -69,15 +70,15 @@ private static async Task<IDeviceAbstraction> GetDeviceByChoice(ConsoleKey usage
return null;
}

private static async Task<IDeviceAbstraction> GetDeviceFromDiscovery()
private static async Task<IList<IDeviceAbstraction>> GetDeviceFromDiscovery()
{
var connector = new DeviceConnector();

var discoveredDevices = await connector.DiscoverDevices();
return ListDiscoveredDevices(discoveredDevices);
}

private static IDeviceAbstraction ListDiscoveredDevices(List<IDeviceAbstraction> discoveredDevices)
private static List<IDeviceAbstraction> ListDiscoveredDevices(List<IDeviceAbstraction> discoveredDevices)
{
if (!discoveredDevices.Any())
{
Expand All @@ -98,11 +99,34 @@ private static IDeviceAbstraction ListDiscoveredDevices(List<IDeviceAbstraction>
}

Console.WriteLine();
Colorful.Console.WriteLine("Which device do you want to use?", Color.Green);
var deviceChoice = Console.ReadKey().Key.ToNumber();
Colorful.Console.WriteLine("Which devices do you want to use?", Color.Green);
Colorful.Console.WriteLine("Separate the devices you want to use by a space", Color.Green);

var device = discoveredDevices[deviceChoice - 1];
var deviceChoices = Console.ReadLine();

return device;
if (string.IsNullOrWhiteSpace(deviceChoices))
{
return null;
}

var devicesSplit = deviceChoices.Split(" ");

var output = new List<IDeviceAbstraction>();

foreach (var deviceString in devicesSplit)
{
var deviceIntParseResult = int.TryParse(deviceString, out var deviceId);

if (!deviceIntParseResult)
{
Colorful.Console.WriteLine($"'{deviceString}' is an invalid option.", Color.Red);
}

var device = discoveredDevices[deviceId - 1];

output.Add(device);
}

return output;
}
}
22 changes: 0 additions & 22 deletions RonSijm.ButtFish/Helpers/KeyToNumberConverter.cs

This file was deleted.

0 comments on commit 5ecde19

Please sign in to comment.