Skip to content

Commit

Permalink
Update GPIO to add support for toggle (#699)
Browse files Browse the repository at this point in the history
  • Loading branch information
josesimoes authored May 24, 2018
1 parent 52bdcac commit aef0683
Show file tree
Hide file tree
Showing 6 changed files with 74 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ static const CLR_RT_MethodHandler method_lookup[] =
NULL,
NULL,
NULL,
Library_win_dev_gpio_native_Windows_Devices_Gpio_GpioPin::Toggle___VOID,
NULL,
Library_win_dev_gpio_native_Windows_Devices_Gpio_GpioPin::DisposeNative___VOID,
Library_win_dev_gpio_native_Windows_Devices_Gpio_GpioPin::NativeIsDriveModeSupported___BOOLEAN__WindowsDevicesGpioGpioPinDriveMode,
Expand Down Expand Up @@ -61,6 +62,6 @@ static const CLR_RT_MethodHandler method_lookup[] =
const CLR_RT_NativeAssemblyData g_CLR_AssemblyNative_Windows_Devices_Gpio =
{
"Windows.Devices.Gpio",
0x4CC19AAF,
0x75A146AB,
method_lookup
};
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ struct Library_win_dev_gpio_native_Windows_Devices_Gpio_GpioPin
static const int FIELD___disposedValue = 8;

NANOCLR_NATIVE_DECLARE(Read___WindowsDevicesGpioGpioPinValue);
NANOCLR_NATIVE_DECLARE(Toggle___VOID);
NANOCLR_NATIVE_DECLARE(DisposeNative___VOID);
NANOCLR_NATIVE_DECLARE(NativeIsDriveModeSupported___BOOLEAN__WindowsDevicesGpioGpioPinDriveMode);
NANOCLR_NATIVE_DECLARE(NativeSetDriveMode___VOID__WindowsDevicesGpioGpioPinDriveMode);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,39 @@ HRESULT Library_win_dev_gpio_native_Windows_Devices_Gpio_GpioPin::Read___Windows
NANOCLR_NOCLEANUP();
}

HRESULT Library_win_dev_gpio_native_Windows_Devices_Gpio_GpioPin::Toggle___VOID( CLR_RT_StackFrame& stack )
{
NANOCLR_HEADER();
{
CLR_RT_HeapBlock* pThis = stack.This(); FAULT_ON_NULL(pThis);

// check if object has been disposed
if(pThis[ Library_win_dev_gpio_native_Windows_Devices_Gpio_GpioPin::FIELD___disposedValue ].NumericByRef().u1 != 0)
{
NANOCLR_SET_AND_LEAVE(CLR_E_OBJECT_DISPOSED);
}

// get IoLine from pin number
ioline_t ioLine = GetIoLine(pThis[ FIELD___pinNumber ].NumericByRefConst().s4);

GpioPinDriveMode driveMode = (GpioPinDriveMode)pThis[ FIELD___driveMode ].NumericByRefConst().s4;

GpioPinValue state = (GpioPinValue)stack.Arg1().NumericByRef().s4;

// sanity check for drive mode set to output so we don't mess up writing to an input pin
if ((driveMode == GpioPinDriveMode_Output) ||
(driveMode == GpioPinDriveMode_OutputOpenDrain) ||
(driveMode == GpioPinDriveMode_OutputOpenDrainPullUp) ||
(driveMode == GpioPinDriveMode_OutputOpenSource) ||
(driveMode == GpioPinDriveMode_OutputOpenSourcePullDown))
{
palToggleLine(ioLine);
}

}
NANOCLR_NOCLEANUP();
}

HRESULT Library_win_dev_gpio_native_Windows_Devices_Gpio_GpioPin::DisposeNative___VOID( CLR_RT_StackFrame& stack )
{
NANOCLR_HEADER();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ static const CLR_RT_MethodHandler method_lookup[] =
NULL,
NULL,
NULL,
Library_win_dev_gpio_native_Windows_Devices_Gpio_GpioPin::Toggle___VOID,
NULL,
Library_win_dev_gpio_native_Windows_Devices_Gpio_GpioPin::DisposeNative___VOID,
Library_win_dev_gpio_native_Windows_Devices_Gpio_GpioPin::NativeIsDriveModeSupported___BOOLEAN__WindowsDevicesGpioGpioPinDriveMode,
Expand Down Expand Up @@ -61,6 +62,6 @@ static const CLR_RT_MethodHandler method_lookup[] =
const CLR_RT_NativeAssemblyData g_CLR_AssemblyNative_Windows_Devices_Gpio =
{
"Windows.Devices.Gpio",
0x4CC19AAF,
0x75A146AB,
method_lookup
};
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ struct Library_win_dev_gpio_native_Windows_Devices_Gpio_GpioPin
static const int FIELD___disposedValue = 8;

NANOCLR_NATIVE_DECLARE(Read___WindowsDevicesGpioGpioPinValue);
NANOCLR_NATIVE_DECLARE(Toggle___VOID);
NANOCLR_NATIVE_DECLARE(DisposeNative___VOID);
NANOCLR_NATIVE_DECLARE(NativeIsDriveModeSupported___BOOLEAN__WindowsDevicesGpioGpioPinDriveMode);
NANOCLR_NATIVE_DECLARE(NativeSetDriveMode___VOID__WindowsDevicesGpioGpioPinDriveMode);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,41 @@ HRESULT Library_win_dev_gpio_native_Windows_Devices_Gpio_GpioPin::Read___Windows
NANOCLR_NOCLEANUP();
}

HRESULT Library_win_dev_gpio_native_Windows_Devices_Gpio_GpioPin::Toggle___VOID( CLR_RT_StackFrame& stack )
{
NANOCLR_HEADER();
{
CLR_RT_HeapBlock* pThis = stack.This(); FAULT_ON_NULL(pThis);

// check if object has been disposed
if(pThis[ Library_win_dev_gpio_native_Windows_Devices_Gpio_GpioPin::FIELD___disposedValue ].NumericByRef().u1 != 0)
{
NANOCLR_SET_AND_LEAVE(CLR_E_OBJECT_DISPOSED);
}

int16_t pinNumber = pThis[ FIELD___pinNumber ].NumericByRefConst().s4;
GpioPinDriveMode driveMode = (GpioPinDriveMode)pThis[ FIELD___driveMode ].NumericByRefConst().s4;

// sanity check for drive mode set to output so we don't mess up writing to an input pin
if ((driveMode == GpioPinDriveMode_Output) ||
(driveMode == GpioPinDriveMode_OutputOpenDrain) ||
(driveMode == GpioPinDriveMode_OutputOpenDrainPullUp) ||
(driveMode == GpioPinDriveMode_OutputOpenSource) ||
(driveMode == GpioPinDriveMode_OutputOpenSourcePullDown))
{
// ESP32 API doesn't have a native toggle, so need to read pin...
int state = gpio_get_level((gpio_num_t)pinNumber);

// ... toggle value...
state == 1 ? state = 0 : state = 1;

// ... write back the toggled value
gpio_set_level((gpio_num_t)pinNumber, state);
}
}
NANOCLR_NOCLEANUP();
}

HRESULT Library_win_dev_gpio_native_Windows_Devices_Gpio_GpioPin::DisposeNative___VOID( CLR_RT_StackFrame& stack )
{
NANOCLR_HEADER();
Expand Down Expand Up @@ -285,7 +320,6 @@ HRESULT Library_win_dev_gpio_native_Windows_Devices_Gpio_GpioPin::NativeInit___B
NANOCLR_NOCLEANUP();
}


HRESULT Library_win_dev_gpio_native_Windows_Devices_Gpio_GpioPin::NativeSetDebounceTimeout___VOID( CLR_RT_StackFrame& stack )
{
NANOCLR_HEADER();
Expand All @@ -295,7 +329,6 @@ HRESULT Library_win_dev_gpio_native_Windows_Devices_Gpio_GpioPin::NativeSetDebou
NANOCLR_NOCLEANUP();
}


HRESULT Library_win_dev_gpio_native_Windows_Devices_Gpio_GpioPin::WriteNative___VOID__WindowsDevicesGpioGpioPinValue( CLR_RT_StackFrame& stack )
{
NANOCLR_HEADER();
Expand Down Expand Up @@ -330,7 +363,6 @@ HRESULT Library_win_dev_gpio_native_Windows_Devices_Gpio_GpioPin::WriteNative___
NANOCLR_NOCLEANUP();
}


HRESULT Library_win_dev_gpio_native_Windows_Devices_Gpio_GpioPin::NativeSetAlternateFunction___VOID__I4( CLR_RT_StackFrame& stack )
{
NANOCLR_HEADER();
Expand Down

0 comments on commit aef0683

Please sign in to comment.