Skip to content

Commit

Permalink
Fixed an issue where the same id would be assigned to multiple device…
Browse files Browse the repository at this point in the history
…s of the same type. closes #4
  • Loading branch information
medevil84 committed Jul 21, 2023
1 parent b98a5fc commit b71fbba
Show file tree
Hide file tree
Showing 6 changed files with 73 additions and 57 deletions.
28 changes: 19 additions & 9 deletions FanControl.AquacomputerDevices/AquacomputerPlugin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@
using FanControl.Plugins;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

Expand All @@ -11,8 +13,9 @@ namespace FanControl.AquacomputerDevices
public class AquacomputerPlugin : IPlugin2
{
public string Name => "Aquacomputer Devices";
List<IAquacomputerDevice> devices;

//List<IAquacomputerDevice> devices;
Dictionary<IAquacomputerDevice, int> devices;

private readonly IPluginLogger _logger;

public AquacomputerPlugin(IPluginLogger logger)
Expand All @@ -23,29 +26,36 @@ public AquacomputerPlugin(IPluginLogger logger)
public void Close()
{
_logger.Log("AquacomputerPlugin: Closing.");
devices.ForEach(x => x.Unload());
devices.Keys.ToList().ForEach(x => x.Unload());
devices.Clear();
}

public void Initialize()
{
_logger.Log("AquacomputerPlugin: Initializing.");
devices = HidLibrary.HidDevices.Enumerate(0x0C70, AllDevices.GetSupportedProductIds().ToArray())
.Select(x => AllDevices.GetDevice(x, _logger)).ToList();
.Select(x => AllDevices.GetDevice(x, _logger))
.GroupBy(x => x.GetType())
.SelectMany(x => x
.OrderBy(t => t.GetDevicePath().ToLowerInvariant())
.Select((y, i) => new { Key = y, Index = i })
)
.ToDictionary(k => k.Key, e => e.Index);
}

public void Load(IPluginSensorsContainer _container)
{
_logger.Log("AquacomputerPlugin: Loading");
devices.ForEach(x => {
_logger.Log("AquacomputerPlugin: Loading device "+x.ToString());
x.Load(_container);
});
foreach (var item in devices)
{
_logger.Log("AquacomputerPlugin: Loading device " + item.Key.ToString() + " with index: " + item.Value);
item.Key.Load(_container, item.Value);
}
}

public void Update()
{
devices.ForEach(x => x.Update());
devices.Keys.ToList().ForEach(x => x.Update());
}
}
}
16 changes: 9 additions & 7 deletions FanControl.AquacomputerDevices/Devices/HighFlowNextDevice.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ internal class HighFlowNextDevice : IAquacomputerDevice

public int GetProductId() => 0xF012;

public string GetDevicePath() => hidDevice?.DevicePath;

public IAquacomputerDevice AssignDevice(HidDevice device, IPluginLogger logger)
{
_logger = logger;
Expand All @@ -24,17 +26,17 @@ public IAquacomputerDevice AssignDevice(HidDevice device, IPluginLogger logger)
return this;
}

public void Load(IPluginSensorsContainer _container)
public void Load(IPluginSensorsContainer _container, int index = 0)
{
_logger.Log($"HighFlowNextDevice.Load(_container: {_container})");
_logger.Log($"HighFlowNextDevice.Load(_container: {_container}, index = {index})");
if (hidDevice == null)
return;

_container.TempSensors.Add(new DeviceBaseSensor<AquacomputerStructs.Devices.HighFlowNext.sensor_data>("HighFlowNextDevice.TemperatureWater", "Water Temperature", () => this.Data_GetTemperature(() => sensor_data.temperature_water)));
_container.TempSensors.Add(new DeviceBaseSensor<AquacomputerStructs.Devices.HighFlowNext.sensor_data>("HighFlowNextDevice.TemperatureExt", "External Water Temperature", () => this.Data_GetTemperature(() => sensor_data.temperature_ext)));
_container.FanSensors.Add(new DeviceBaseSensor<AquacomputerStructs.Devices.HighFlowNext.sensor_data>("HighFlowNextDevice.Flow", "Flow", () => this.Data_GetTemperature(() => sensor_data.flow, 10.0f)));
_container.FanSensors.Add(new DeviceBaseSensor<AquacomputerStructs.Devices.HighFlowNext.sensor_data>("HighFlowNextDevice.WaterQuality", "Water Quality", () => this.Data_GetTemperature(() => sensor_data.water_quality)));
_container.FanSensors.Add(new DeviceBaseSensor<AquacomputerStructs.Devices.HighFlowNext.sensor_data>("HighFlowNextDevice.Conductivity", "Conductivity", () => this.Data_GetTemperature(() => sensor_data.conductivity, 10.0f)));
_container.TempSensors.Add(new DeviceBaseSensor<AquacomputerStructs.Devices.HighFlowNext.sensor_data>("HighFlowNextDevice"+index+".TemperatureWater", "HighFlowNext "+index+" Water Temperature", () => this.Data_GetTemperature(() => sensor_data.temperature_water)));
_container.TempSensors.Add(new DeviceBaseSensor<AquacomputerStructs.Devices.HighFlowNext.sensor_data>("HighFlowNextDevice"+index+".TemperatureExt" , "HighFlowNext "+index+" External Water Temperature", () => this.Data_GetTemperature(() => sensor_data.temperature_ext)));
_container.FanSensors.Add( new DeviceBaseSensor<AquacomputerStructs.Devices.HighFlowNext.sensor_data>("HighFlowNextDevice"+index+".Flow" , "HighFlowNext "+index+" Flow", () => this.Data_GetTemperature(() => sensor_data.flow, 10.0f)));
_container.FanSensors.Add( new DeviceBaseSensor<AquacomputerStructs.Devices.HighFlowNext.sensor_data>("HighFlowNextDevice"+index+".WaterQuality" , "HighFlowNext "+index+" Water Quality", () => this.Data_GetTemperature(() => sensor_data.water_quality)));
_container.FanSensors.Add( new DeviceBaseSensor<AquacomputerStructs.Devices.HighFlowNext.sensor_data>("HighFlowNextDevice"+index+".Conductivity" , "HighFlowNext "+index+" Conductivity", () => this.Data_GetTemperature(() => sensor_data.conductivity, 10.0f)));

}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,11 @@ internal interface IAquacomputerDevice
{
int GetProductId();

String GetDevicePath();

IAquacomputerDevice AssignDevice(HidDevice device, IPluginLogger logger);

void Load(IPluginSensorsContainer _container);
void Load(IPluginSensorsContainer _container, int index = 0);

void Unload();

Expand Down
47 changes: 24 additions & 23 deletions FanControl.AquacomputerDevices/Devices/OctoDevice.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ internal class OctoDevice : IAquacomputerDevice
private readonly TimeSpan settings_timeout = new TimeSpan(0, 5, 0); // every 5 minutes

public int GetProductId() => 0xF011;
public string GetDevicePath() => hidDevice?.DevicePath;

public IAquacomputerDevice AssignDevice(HidDevice device, IPluginLogger logger)
{
Expand All @@ -36,58 +37,58 @@ public IAquacomputerDevice AssignDevice(HidDevice device, IPluginLogger logger)
return this;
}

public void Load(IPluginSensorsContainer _container)
public void Load(IPluginSensorsContainer _container, int index = 0)
{
_logger.Log($"OctoDevice.Load(_container: {_container})");
_logger.Log($"OctoDevice.Load(_container: {_container}, index = {index})");
if (hidDevice == null)
return;

_container.FanSensors.Add(new DeviceBaseSensor<AquacomputerStructs.Devices.Octo.sensor_data>("OctoDevice.Fans0", "Octo Fan 1", () => this.Data_GetTemperature(() => this.sensor_data.fans[0].speed, 1.0f)));
_container.FanSensors.Add(new DeviceBaseSensor<AquacomputerStructs.Devices.Octo.sensor_data>("OctoDevice.Fans1", "Octo Fan 2", () => this.Data_GetTemperature(() => this.sensor_data.fans[1].speed, 1.0f)));
_container.FanSensors.Add(new DeviceBaseSensor<AquacomputerStructs.Devices.Octo.sensor_data>("OctoDevice.Fans2", "Octo Fan 3", () => this.Data_GetTemperature(() => this.sensor_data.fans[2].speed, 1.0f)));
_container.FanSensors.Add(new DeviceBaseSensor<AquacomputerStructs.Devices.Octo.sensor_data>("OctoDevice.Fans3", "Octo Fan 4", () => this.Data_GetTemperature(() => this.sensor_data.fans[3].speed, 1.0f)));
_container.FanSensors.Add(new DeviceBaseSensor<AquacomputerStructs.Devices.Octo.sensor_data>("OctoDevice.Fans4", "Octo Fan 5", () => this.Data_GetTemperature(() => this.sensor_data.fans[4].speed, 1.0f)));
_container.FanSensors.Add(new DeviceBaseSensor<AquacomputerStructs.Devices.Octo.sensor_data>("OctoDevice.Fans5", "Octo Fan 6", () => this.Data_GetTemperature(() => this.sensor_data.fans[5].speed, 1.0f)));
_container.FanSensors.Add(new DeviceBaseSensor<AquacomputerStructs.Devices.Octo.sensor_data>("OctoDevice.Fans6", "Octo Fan 7", () => this.Data_GetTemperature(() => this.sensor_data.fans[6].speed, 1.0f)));
_container.FanSensors.Add(new DeviceBaseSensor<AquacomputerStructs.Devices.Octo.sensor_data>("OctoDevice.Fans7", "Octo Fan 8", () => this.Data_GetTemperature(() => this.sensor_data.fans[7].speed, 1.0f)));
_container.FanSensors.Add(new DeviceBaseSensor<AquacomputerStructs.Devices.Octo.sensor_data>("OctoDevice"+index+".Fans0", "Octo "+index+" Fan 1", () => this.Data_GetTemperature(() => this.sensor_data.fans[0].speed, 1.0f)));
_container.FanSensors.Add(new DeviceBaseSensor<AquacomputerStructs.Devices.Octo.sensor_data>("OctoDevice"+index+".Fans1", "Octo "+index+" Fan 2", () => this.Data_GetTemperature(() => this.sensor_data.fans[1].speed, 1.0f)));
_container.FanSensors.Add(new DeviceBaseSensor<AquacomputerStructs.Devices.Octo.sensor_data>("OctoDevice"+index+".Fans2", "Octo "+index+" Fan 3", () => this.Data_GetTemperature(() => this.sensor_data.fans[2].speed, 1.0f)));
_container.FanSensors.Add(new DeviceBaseSensor<AquacomputerStructs.Devices.Octo.sensor_data>("OctoDevice"+index+".Fans3", "Octo "+index+" Fan 4", () => this.Data_GetTemperature(() => this.sensor_data.fans[3].speed, 1.0f)));
_container.FanSensors.Add(new DeviceBaseSensor<AquacomputerStructs.Devices.Octo.sensor_data>("OctoDevice"+index+".Fans4", "Octo "+index+" Fan 5", () => this.Data_GetTemperature(() => this.sensor_data.fans[4].speed, 1.0f)));
_container.FanSensors.Add(new DeviceBaseSensor<AquacomputerStructs.Devices.Octo.sensor_data>("OctoDevice"+index+".Fans5", "Octo "+index+" Fan 6", () => this.Data_GetTemperature(() => this.sensor_data.fans[5].speed, 1.0f)));
_container.FanSensors.Add(new DeviceBaseSensor<AquacomputerStructs.Devices.Octo.sensor_data>("OctoDevice"+index+".Fans6", "Octo "+index+" Fan 7", () => this.Data_GetTemperature(() => this.sensor_data.fans[6].speed, 1.0f)));
_container.FanSensors.Add(new DeviceBaseSensor<AquacomputerStructs.Devices.Octo.sensor_data>("OctoDevice"+index+".Fans7", "Octo "+index+" Fan 8", () => this.Data_GetTemperature(() => this.sensor_data.fans[7].speed, 1.0f)));

// Value for this sensor should be checked!
_container.FanSensors.Add(new DeviceBaseSensor<AquacomputerStructs.Devices.Octo.sensor_data>("OctoDevice.Flow", "Octo Flow Sensor", () => this.Data_GetTemperature(() => this.sensor_data.flow)));
_container.FanSensors.Add(new DeviceBaseSensor<AquacomputerStructs.Devices.Octo.sensor_data>("OctoDevice"+index+".Flow", "Octo "+index+" Flow Sensor", () => this.Data_GetTemperature(() => this.sensor_data.flow)));

_container.TempSensors.Add(new DeviceBaseSensor<AquacomputerStructs.Devices.Octo.sensor_data>("OctoDevice.Temp0", "Octo Temperature 1", () => this.Data_GetTemperature(() => this.sensor_data.temperatures[0])));
_container.TempSensors.Add(new DeviceBaseSensor<AquacomputerStructs.Devices.Octo.sensor_data>("OctoDevice.Temp1", "Octo Temperature 2", () => this.Data_GetTemperature(() => this.sensor_data.temperatures[1])));
_container.TempSensors.Add(new DeviceBaseSensor<AquacomputerStructs.Devices.Octo.sensor_data>("OctoDevice.Temp2", "Octo Temperature 3", () => this.Data_GetTemperature(() => this.sensor_data.temperatures[2])));
_container.TempSensors.Add(new DeviceBaseSensor<AquacomputerStructs.Devices.Octo.sensor_data>("OctoDevice.Temp3", "Octo Temperature 4", () => this.Data_GetTemperature(() => this.sensor_data.temperatures[3])));
_container.TempSensors.Add(new DeviceBaseSensor<AquacomputerStructs.Devices.Octo.sensor_data>("OctoDevice"+index+".Temp0", "Octo "+index+" Temperature 1", () => this.Data_GetTemperature(() => this.sensor_data.temperatures[0])));
_container.TempSensors.Add(new DeviceBaseSensor<AquacomputerStructs.Devices.Octo.sensor_data>("OctoDevice"+index+".Temp1", "Octo "+index+" Temperature 2", () => this.Data_GetTemperature(() => this.sensor_data.temperatures[1])));
_container.TempSensors.Add(new DeviceBaseSensor<AquacomputerStructs.Devices.Octo.sensor_data>("OctoDevice"+index+".Temp2", "Octo "+index+" Temperature 3", () => this.Data_GetTemperature(() => this.sensor_data.temperatures[2])));
_container.TempSensors.Add(new DeviceBaseSensor<AquacomputerStructs.Devices.Octo.sensor_data>("OctoDevice"+index+".Temp3", "Octo "+index+" Temperature 4", () => this.Data_GetTemperature(() => this.sensor_data.temperatures[3])));

_container.ControlSensors.Add(new DeviceBaseControlSensor<AquacomputerStructs.Devices.Octo.Settings>("OctoDevice.Power0", "Octo Controller Power 1",
_container.ControlSensors.Add(new DeviceBaseControlSensor<AquacomputerStructs.Devices.Octo.Settings>("OctoDevice"+index+".Power0", "Octo Controller Power 1",
() => this.Settings_GetControllerPower(0), null,
(x) => this.Settings_SetControllerPower(0, x),
() => this.Settings_ResetControllerPower(0)));
_container.ControlSensors.Add(new DeviceBaseControlSensor<AquacomputerStructs.Devices.Octo.Settings>("OctoDevice.Power1", "Octo Controller Power 2",
_container.ControlSensors.Add(new DeviceBaseControlSensor<AquacomputerStructs.Devices.Octo.Settings>("OctoDevice"+index+".Power1", "Octo "+index+" Controller Power 2",
() => this.Settings_GetControllerPower(1), null,
(x) => this.Settings_SetControllerPower(1, x),
() => this.Settings_ResetControllerPower(1)));
_container.ControlSensors.Add(new DeviceBaseControlSensor<AquacomputerStructs.Devices.Octo.Settings>("OctoDevice.Power2", "Octo Controller Power 3",
_container.ControlSensors.Add(new DeviceBaseControlSensor<AquacomputerStructs.Devices.Octo.Settings>("OctoDevice"+index+".Power2", "Octo "+index+" Controller Power 3",
() => this.Settings_GetControllerPower(2), null,
(x) => this.Settings_SetControllerPower(2, x),
() => this.Settings_ResetControllerPower(2)));
_container.ControlSensors.Add(new DeviceBaseControlSensor<AquacomputerStructs.Devices.Octo.Settings>("OctoDevice.Power3", "Octo Controller Power 4",
_container.ControlSensors.Add(new DeviceBaseControlSensor<AquacomputerStructs.Devices.Octo.Settings>("OctoDevice"+index+".Power3", "Octo "+index+" Controller Power 4",
() => this.Settings_GetControllerPower(3), null,
(x) => this.Settings_SetControllerPower(3, x),
() => this.Settings_ResetControllerPower(3)));
_container.ControlSensors.Add(new DeviceBaseControlSensor<AquacomputerStructs.Devices.Octo.Settings>("OctoDevice.Power4", "Octo Controller Power 5",
_container.ControlSensors.Add(new DeviceBaseControlSensor<AquacomputerStructs.Devices.Octo.Settings>("OctoDevice"+index+".Power4", "Octo "+index+" Controller Power 5",
() => this.Settings_GetControllerPower(4), null,
(x) => this.Settings_SetControllerPower(4, x),
() => this.Settings_ResetControllerPower(4)));
_container.ControlSensors.Add(new DeviceBaseControlSensor<AquacomputerStructs.Devices.Octo.Settings>("OctoDevice.Power5", "Octo Controller Power 6",
_container.ControlSensors.Add(new DeviceBaseControlSensor<AquacomputerStructs.Devices.Octo.Settings>("OctoDevice"+index+".Power5", "Octo "+index+" Controller Power 6",
() => this.Settings_GetControllerPower(5), null,
(x) => this.Settings_SetControllerPower(5, x),
() => this.Settings_ResetControllerPower(5)));
_container.ControlSensors.Add(new DeviceBaseControlSensor<AquacomputerStructs.Devices.Octo.Settings>("OctoDevice.Power6", "Octo Controller Power 7",
_container.ControlSensors.Add(new DeviceBaseControlSensor<AquacomputerStructs.Devices.Octo.Settings>("OctoDevice"+index+".Power6", "Octo "+index+" Controller Power 7",
() => this.Settings_GetControllerPower(6), null,
(x) => this.Settings_SetControllerPower(6, x),
() => this.Settings_ResetControllerPower(6)));
_container.ControlSensors.Add(new DeviceBaseControlSensor<AquacomputerStructs.Devices.Octo.Settings>("OctoDevice.Power7", "Octo Controller Power 8",
_container.ControlSensors.Add(new DeviceBaseControlSensor<AquacomputerStructs.Devices.Octo.Settings>("OctoDevice."+index+"Power7", "Octo "+index+" Controller Power 8",
() => this.Settings_GetControllerPower(7), null,
(x) => this.Settings_SetControllerPower(7, x),
() => this.Settings_ResetControllerPower(7)));
Expand Down
Loading

0 comments on commit b71fbba

Please sign in to comment.