Skip to content

Commit

Permalink
Add status checks to HAL
Browse files Browse the repository at this point in the history
  • Loading branch information
ThadHouse committed Feb 28, 2024
1 parent 1cd5d5c commit aaac26c
Show file tree
Hide file tree
Showing 19 changed files with 310 additions and 78 deletions.
34 changes: 20 additions & 14 deletions src/hal/ControlWord.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,27 +15,27 @@ public static NativeControlWord ConvertToUnmanaged(ControlWord managed)
NativeControlWord ret = default;
if (managed.Enabled)
{
ret |= NativeControlWord.Enabled;
ret.control |= (uint)NativeControlWordEnum.Enabled;
}
if (managed.Autonomous)
{
ret |= NativeControlWord.Autonomous;
ret.control |= (uint)NativeControlWordEnum.Autonomous;
}
if (managed.Test)
{
ret |= NativeControlWord.Test;
ret.control |= (uint)NativeControlWordEnum.Test;
}
if (managed.EStop)
{
ret |= NativeControlWord.EStop;
ret.control |= (uint)NativeControlWordEnum.EStop;
}
if (managed.FmsAttached)
{
ret |= NativeControlWord.FmsArrached;
ret.control |= (uint)NativeControlWordEnum.FmsAttached;
}
if (managed.DsAttached)
{
ret |= NativeControlWord.DsAttached;
ret.control |= (uint)NativeControlWordEnum.DsAttached;
}
return ret;
}
Expand All @@ -44,23 +44,29 @@ public static ControlWord ConvertToManaged(NativeControlWord unmanaged)
{
return new ControlWord
{
Enabled = unmanaged.HasFlag(NativeControlWord.Enabled),
Autonomous = unmanaged.HasFlag(NativeControlWord.Autonomous),
Test = unmanaged.HasFlag(NativeControlWord.Test),
EStop = unmanaged.HasFlag(NativeControlWord.EStop),
FmsAttached = unmanaged.HasFlag(NativeControlWord.FmsArrached),
DsAttached = unmanaged.HasFlag(NativeControlWord.DsAttached),
Enabled = (unmanaged.control & (uint)NativeControlWordEnum.Enabled) != 0,
Autonomous = (unmanaged.control & (uint)NativeControlWordEnum.Autonomous) != 0,
Test = (unmanaged.control & (uint)NativeControlWordEnum.Test) != 0,
EStop = (unmanaged.control & (uint)NativeControlWordEnum.EStop) != 0,
FmsAttached = (unmanaged.control & (uint)NativeControlWordEnum.FmsAttached) != 0,
DsAttached = (unmanaged.control & (uint)NativeControlWordEnum.DsAttached) != 0,
};
}

[StructLayout(LayoutKind.Sequential)]
public struct NativeControlWord
{
public uint control;
}

[Flags]
public enum NativeControlWord : uint
public enum NativeControlWordEnum : uint
{
Enabled = 0x1,
Autonomous = 0x2,
Test = 0x4,
EStop = 0x8,
FmsArrached = 0x10,
FmsAttached = 0x10,
DsAttached = 0x20,
}
}
37 changes: 11 additions & 26 deletions src/hal/JoystickButtons.cs
Original file line number Diff line number Diff line change
@@ -1,19 +1,24 @@
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.Marshalling;

namespace WPIHal;

[NativeMarshalling(typeof(JoystickButtonsMarshaller))]
[StructLayout(LayoutKind.Auto)]
public readonly record struct JoystickButtons(uint Buttons, int Count)
[StructLayout(LayoutKind.Sequential)]
public readonly struct JoystickButtons
{
private readonly uint buttons;
private readonly byte count;

public int Count => count;

public uint Buttons => buttons;

public bool? this[int index]
{
get
{
if (index < Count)
if (index < count)
{
return (Buttons & index) != 0;
return (buttons & index) != 0;
}
else
{
Expand All @@ -22,23 +27,3 @@ public bool? this[int index]
}
}
}

[CustomMarshaller(typeof(JoystickButtons), MarshalMode.ManagedToUnmanagedOut, typeof(JoystickButtonsMarshaller))]
public static class JoystickButtonsMarshaller
{
public static JoystickButtons ConvertToManaged(NativeJoystickButtons unmanaged)
{
return new JoystickButtons
{
Buttons = unmanaged.buttons,
Count = unmanaged.count,
};
}

[StructLayout(LayoutKind.Sequential)]
public struct NativeJoystickButtons
{
public uint buttons;
public byte count;
}
}
27 changes: 25 additions & 2 deletions src/hal/Natives/HalCounter.cs
Original file line number Diff line number Diff line change
@@ -1,47 +1,58 @@
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using WPIHal.Handles;
using WPIUtil;

namespace WPIHal.Natives;

public static partial class HalCounter
{
[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
[LibraryImport("wpiHal", EntryPoint = "HAL_ClearCounterDownSource")]
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial void ClearCounterDownSource(HalCounterHandle counterHandle, out HalStatus status);

[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
[LibraryImport("wpiHal", EntryPoint = "HAL_ClearCounterUpSource")]
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial void ClearCounterUpSource(HalCounterHandle counterHandle, out HalStatus status);

[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
[LibraryImport("wpiHal", EntryPoint = "HAL_FreeCounter")]
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial void FreeCounter(HalCounterHandle counterHandle, out HalStatus status);

[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
[LibraryImport("wpiHal", EntryPoint = "HAL_GetCounterSamplesToAverage")]
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial int GetCounterSamplesToAverage(HalCounterHandle counterHandle, out HalStatus status);

[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
[LibraryImport("wpiHal", EntryPoint = "HAL_GetCounterDirection")]
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial int GetCounterDirection(HalCounterHandle counterHandle, out HalStatus status);

[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
[LibraryImport("wpiHal", EntryPoint = "HAL_GetCounterPeriod")]
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial double GetCounterPeriod(HalCounterHandle counterHandle, out HalStatus status);

[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
[LibraryImport("wpiHal", EntryPoint = "HAL_GetCounterStopped")]
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial int GetCounterStopped(HalCounterHandle counterHandle, out HalStatus status);

[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
[LibraryImport("wpiHal", EntryPoint = "HAL_InitializeCounter")]
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial HalCounterHandle InitializeCounter(CounterMode mode, out int index, out HalStatus status);

[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
[LibraryImport("wpiHal", EntryPoint = "HAL_ResetCounter")]
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial void ResetCounter(HalCounterHandle counterHandle, out HalStatus status);

[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
[LibraryImport("wpiHal", EntryPoint = "HAL_SetCounterAverageSize")]
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial void SetCounterAverageSize(HalCounterHandle counterHandle, int size, out HalStatus status);
Expand All @@ -50,43 +61,53 @@ public static partial class HalCounter
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial void SetCounterDownSource(HalCounterHandle counterHandle, HalDigitalHandle digitalSourceHandle, AnalogTriggerType analogTriggerType, out HalStatus status);

[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
public static void SetCounterDownSource(HalCounterHandle counterHandle, HalDigitalHandle digitalSourceHandle, out HalStatus status)
{
SetCounterDownSource(counterHandle, digitalSourceHandle, AnalogTriggerType.InWindow, out status);
}

[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
[LibraryImport("wpiHal", EntryPoint = "HAL_SetCounterDownSource")]
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial void SetCounterDownSource(HalCounterHandle counterHandle, HalAnalogTriggerHandle analogTriggerSource, AnalogTriggerType analogTriggerType, out HalStatus status);

[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
[LibraryImport("wpiHal", EntryPoint = "HAL_SetCounterDownSourceEdge")]
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial void SetCounterDownSourceEdge(HalCounterHandle counterHandle, int risingEdge, int fallingEdge, out HalStatus status);

[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
[LibraryImport("wpiHal", EntryPoint = "HAL_SetCounterExternalDirectionMode")]
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial void SetCounterExternalDirectionMode(HalCounterHandle counterHandle, out HalStatus status);

[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
[LibraryImport("wpiHal", EntryPoint = "HAL_SetCounterMaxPeriod")]
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial void SetCounterMaxPeriod(HalCounterHandle counterHandle, double maxPeriod, out HalStatus status);

[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
[LibraryImport("wpiHal", EntryPoint = "HAL_SetCounterPulseLengthMode")]
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial void SetCounterPulseLengthMode(HalCounterHandle counterHandle, double threshold, out HalStatus status);

[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
[LibraryImport("wpiHal", EntryPoint = "HAL_SetCounterReverseDirection")]
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial void SetCounterReverseDirection(HalCounterHandle counterHandle, int reverseDirection, out HalStatus status);

[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
[LibraryImport("wpiHal", EntryPoint = "HAL_SetCounterSamplesToAverage")]
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial void SetCounterSamplesToAverage(HalCounterHandle counterHandle, int samplesToAverage, out HalStatus status);

[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
[LibraryImport("wpiHal", EntryPoint = "HAL_SetCounterSemiPeriodMode")]
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial void SetCounterSemiPeriodMode(HalCounterHandle counterHandle, int highSemiPeriod, out HalStatus status);

[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
[LibraryImport("wpiHal", EntryPoint = "HAL_SetCounterUpDownMode")]
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial void SetCounterUpDownMode(HalCounterHandle counterHandle, out HalStatus status);
Expand All @@ -95,22 +116,24 @@ public static void SetCounterDownSource(HalCounterHandle counterHandle, HalDigit
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial void SetCounterUpSource(HalCounterHandle counterHandle, HalDigitalHandle digitalSourceHandle, AnalogTriggerType analogTriggerType, out HalStatus status);

[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
public static void SetCounterUpSource(HalCounterHandle counterHandle, HalDigitalHandle digitalSourceHandle, out HalStatus status)
{
SetCounterUpSource(counterHandle, digitalSourceHandle, AnalogTriggerType.InWindow, out status);
}

[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
[LibraryImport("wpiHal", EntryPoint = "HAL_SetCounterUpSource")]
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial void SetCounterUpSource(HalCounterHandle counterHandle, HalAnalogTriggerHandle analogTriggerSource, AnalogTriggerType analogTriggerType, out HalStatus status);

[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
[LibraryImport("wpiHal", EntryPoint = "HAL_SetCounterUpSourceEdge")]
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial void SetCounterUpSourceEdge(HalCounterHandle counterHandle, int risingEdge, int fallingEdge, out HalStatus status);

[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
[LibraryImport("wpiHal", EntryPoint = "HAL_SetCounterUpdateWhenEmpty")]
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial void SetCounterUpdateWhenEmpty(HalCounterHandle counterHandle, int enabled, out HalStatus status);


}
20 changes: 18 additions & 2 deletions src/hal/Natives/HalDIO.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using WPIHal.Handles;
using WPIUtil;

namespace WPIHal.Natives;

public static partial class HalDIO
{
[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
[LibraryImport("wpiHal", EntryPoint = "HAL_AllocateDigitalPWM")]
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial HalDigitalPWMHandle AllocateDigitalPWM(out HalStatus status);
Expand All @@ -18,69 +20,83 @@ public static partial class HalDIO
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial void FreeDIOPort(HalDigitalHandle dioPortHandle);

[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
[LibraryImport("wpiHal", EntryPoint = "HAL_FreeDigitalPWM")]
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial void FreeDigitalPWM(HalDigitalPWMHandle pwmGenerator, out HalStatus status);

[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
[LibraryImport("wpiHal", EntryPoint = "HAL_GetDIO")]
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial int GetDIO(HalDigitalHandle dioPortHandle, out HalStatus status);

[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
[LibraryImport("wpiHal", EntryPoint = "HAL_GetDIODirection")]
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial int GetDIODirection(HalDigitalHandle dioPortHandle, out HalStatus status);

[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
[LibraryImport("wpiHal", EntryPoint = "HAL_GetFilterPeriod")]
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial long GetFilterPeriod(int filterIndex, out HalStatus status);

[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
[LibraryImport("wpiHal", EntryPoint = "HAL_GetFilterSelect")]
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial int GetFilterSelect(HalDigitalHandle dioPortHandle, out HalStatus status);

[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
[LibraryImport("wpiHal", EntryPoint = "HAL_InitializeDIOPort", StringMarshalling = StringMarshalling.Utf8)]
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial HalDigitalHandle InitializeDIOPort(HalPortHandle portHandle, int input, string allocationLocation, out HalStatus status);

[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
[LibraryImport("wpiHal", EntryPoint = "HAL_IsAnyPulsing")]
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial int IsAnyPulsing(out HalStatus status);

[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
[LibraryImport("wpiHal", EntryPoint = "HAL_IsPulsing")]
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial int IsPulsing(HalDigitalHandle dioPortHandle, out HalStatus status);

[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
[LibraryImport("wpiHal", EntryPoint = "HAL_Pulse")]
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial void Pulse(HalDigitalHandle dioPortHandle, double pulseLengthSeconds, out HalStatus status);

[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
[LibraryImport("wpiHal", EntryPoint = "HAL_SetDIOSimDevice")]
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial void SetDIOSimDevice(HalDigitalHandle handle, HalSimDeviceHandle device);

[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
[LibraryImport("wpiHal", EntryPoint = "HAL_SetDIODirection")]
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial void SetDIODirection(HalDigitalHandle dioPortHandle, int input, out HalStatus status);

[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
[LibraryImport("wpiHal", EntryPoint = "HAL_SetDigitalPWMDutyCycle")]
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial void SetDigitalPWMDutyCycle(HalDigitalPWMHandle pwmGenerator, double dutyCycle, out HalStatus status);

[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
[LibraryImport("wpiHal", EntryPoint = "HAL_SetDigitalPWMOutputChannel")]
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial void SetDigitalPWMOutputChannel(HalDigitalPWMHandle pwmGenerator, int channel, out HalStatus status);

[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
[LibraryImport("wpiHal", EntryPoint = "HAL_SetDigitalPWMRate")]
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial void SetDigitalPWMRate(double rate, out HalStatus status);

[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
[LibraryImport("wpiHal", EntryPoint = "HAL_SetFilterPeriod")]
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial void SetFilterPeriod(int filterIndex, long value, out HalStatus status);

[AutomateStatusCheck(StatusCheckMethod = HalBase.StatusCheckCall)]
[LibraryImport("wpiHal", EntryPoint = "HAL_SetFilterSelect")]
[UnmanagedCallConv(CallConvs = [typeof(CallConvCdecl)])]
public static partial void SetFilterSelect(HalDigitalHandle dioPortHandle, int filterIndex, out HalStatus status);


}
Loading

0 comments on commit aaac26c

Please sign in to comment.