diff --git a/src/PAL/Include/nanoPAL_Events.h b/src/PAL/Include/nanoPAL_Events.h index bb8e63388b..e64bb0a390 100644 --- a/src/PAL/Include/nanoPAL_Events.h +++ b/src/PAL/Include/nanoPAL_Events.h @@ -16,6 +16,7 @@ #define EVENT_UNKNOWN 0 #define EVENT_CUSTOM 10 #define EVENT_GPIO 20 +#define EVENT_SERIAL 30 //////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////// diff --git a/targets/CMSIS-OS/ChibiOS/nanoCLR/Windows.Devices.SerialCommunication/win_dev_serial_native.cpp b/targets/CMSIS-OS/ChibiOS/nanoCLR/Windows.Devices.SerialCommunication/win_dev_serial_native.cpp index 35b9966c39..79b096f5be 100644 --- a/targets/CMSIS-OS/ChibiOS/nanoCLR/Windows.Devices.SerialCommunication/win_dev_serial_native.cpp +++ b/targets/CMSIS-OS/ChibiOS/nanoCLR/Windows.Devices.SerialCommunication/win_dev_serial_native.cpp @@ -35,12 +35,24 @@ static const CLR_RT_MethodHandler method_lookup[] = NULL, NULL, NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, Library_win_dev_serial_native_Windows_Devices_SerialCommunication_SerialDevice::NativeDispose___VOID, Library_win_dev_serial_native_Windows_Devices_SerialCommunication_SerialDevice::NativeInit___VOID, Library_win_dev_serial_native_Windows_Devices_SerialCommunication_SerialDevice::NativeConfig___VOID, Library_win_dev_serial_native_Windows_Devices_SerialCommunication_SerialDevice::NativeWrite___VOID__SZARRAY_U1, Library_win_dev_serial_native_Windows_Devices_SerialCommunication_SerialDevice::NativeStore___U4, Library_win_dev_serial_native_Windows_Devices_SerialCommunication_SerialDevice::NativeRead___U4__SZARRAY_U1__I4__I4, + Library_win_dev_serial_native_Windows_Devices_SerialCommunication_SerialDevice::NativeSetWatchChar___VOID, NULL, Library_win_dev_serial_native_Windows_Devices_SerialCommunication_SerialDevice::GetDeviceSelector___STATIC__STRING, NULL, @@ -53,12 +65,19 @@ static const CLR_RT_MethodHandler method_lookup[] = NULL, NULL, NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, }; const CLR_RT_NativeAssemblyData g_CLR_AssemblyNative_Windows_Devices_SerialCommunication = { "Windows.Devices.SerialCommunication", - 0x5E530ECD, + 0x2B84D4FF, method_lookup, { 1, 0, 0, 0 } }; diff --git a/targets/CMSIS-OS/ChibiOS/nanoCLR/Windows.Devices.SerialCommunication/win_dev_serial_native.h b/targets/CMSIS-OS/ChibiOS/nanoCLR/Windows.Devices.SerialCommunication/win_dev_serial_native.h index 79e65655ef..dd3c6becf5 100644 --- a/targets/CMSIS-OS/ChibiOS/nanoCLR/Windows.Devices.SerialCommunication/win_dev_serial_native.h +++ b/targets/CMSIS-OS/ChibiOS/nanoCLR/Windows.Devices.SerialCommunication/win_dev_serial_native.h @@ -31,8 +31,29 @@ struct Library_win_dev_serial_native_Windows_Devices_SerialCommunication_PinChan }; +struct Library_win_dev_serial_native_Windows_Devices_SerialCommunication_SerialDataEvent +{ + static const int FIELD__SerialDeviceIndex = 3; + static const int FIELD__Event = 4; + + + //--// + +}; + +struct Library_win_dev_serial_native_Windows_Devices_SerialCommunication_SerialDataReceivedEventArgs +{ + static const int FIELD___data = 1; + + + //--// + +}; + struct Library_win_dev_serial_native_Windows_Devices_SerialCommunication_SerialDevice { + static const int FIELD_STATIC__s_eventListener = 0; + static const int FIELD___disposed = 1; static const int FIELD___syncLock = 2; static const int FIELD___opened = 3; @@ -48,6 +69,8 @@ struct Library_win_dev_serial_native_Windows_Devices_SerialCommunication_SerialD static const int FIELD___parity = 13; static const int FIELD___stopBits = 14; static const int FIELD___bytesReceived = 15; + static const int FIELD___watchChar = 16; + static const int FIELD___callbacksDataReceivedEvent = 17; NANOCLR_NATIVE_DECLARE(NativeDispose___VOID); NANOCLR_NATIVE_DECLARE(NativeInit___VOID); @@ -55,6 +78,7 @@ struct Library_win_dev_serial_native_Windows_Devices_SerialCommunication_SerialD NANOCLR_NATIVE_DECLARE(NativeWrite___VOID__SZARRAY_U1); NANOCLR_NATIVE_DECLARE(NativeStore___U4); NANOCLR_NATIVE_DECLARE(NativeRead___U4__SZARRAY_U1__I4__I4); + NANOCLR_NATIVE_DECLARE(NativeSetWatchChar___VOID); NANOCLR_NATIVE_DECLARE(GetDeviceSelector___STATIC__STRING); //--// @@ -63,8 +87,17 @@ struct Library_win_dev_serial_native_Windows_Devices_SerialCommunication_SerialD struct Library_win_dev_serial_native_Windows_Devices_SerialCommunication_SerialDeviceController { - static const int FIELD_STATIC__s_instance = 0; - static const int FIELD_STATIC__s_deviceCollection = 1; + static const int FIELD_STATIC__s_instance = 1; + static const int FIELD_STATIC__s_deviceCollection = 2; + + + //--// + +}; + +struct Library_win_dev_serial_native_Windows_Devices_SerialCommunication_SerialDeviceEventListener +{ + static const int FIELD___serialDevicesMap = 1; //--// @@ -90,7 +123,6 @@ struct Library_win_dev_serial_native_Windows_Devices_SerialCommunication_SerialD }; - extern const CLR_RT_NativeAssemblyData g_CLR_AssemblyNative_Windows_Devices_SerialCommunication; @@ -107,6 +139,8 @@ struct NF_PAL_UART HAL_RingBuffer RxRingBuffer; uint8_t* RxBuffer; uint16_t RxBytesToRead; + + uint8_t WatchChar; }; @@ -209,6 +243,7 @@ extern uint8_t Uart8_RxBuffer[]; Uart##num##_PAL.TxOngoingCount = 0; \ Uart##num##_PAL.RxBuffer = Uart##num##_RxBuffer; \ Uart##num##_PAL.RxRingBuffer.Initialize( Uart##num##_PAL.RxBuffer, rx_buffer_size); \ + Uart##num##_PAL.WatchChar = 0; \ } #else @@ -227,6 +262,7 @@ extern uint8_t Uart8_RxBuffer[]; Uart##num##_PAL.TxOngoingCount = 0; \ Uart##num##_PAL.RxBuffer = Uart##num##_RxBuffer; \ Uart##num##_PAL.RxRingBuffer.Initialize( Uart##num##_PAL.RxBuffer, rx_buffer_size); \ + Uart##num##_PAL.WatchChar = 0; \ } #endif diff --git a/targets/CMSIS-OS/ChibiOS/nanoCLR/Windows.Devices.SerialCommunication/win_dev_serial_native_Windows_Devices_SerialCommunication_SerialDevice.cpp b/targets/CMSIS-OS/ChibiOS/nanoCLR/Windows.Devices.SerialCommunication/win_dev_serial_native_Windows_Devices_SerialCommunication_SerialDevice.cpp index c452f42166..926ff2f33c 100644 --- a/targets/CMSIS-OS/ChibiOS/nanoCLR/Windows.Devices.SerialCommunication/win_dev_serial_native_Windows_Devices_SerialCommunication_SerialDevice.cpp +++ b/targets/CMSIS-OS/ChibiOS/nanoCLR/Windows.Devices.SerialCommunication/win_dev_serial_native_Windows_Devices_SerialCommunication_SerialDevice.cpp @@ -59,6 +59,16 @@ enum InputStreamOptions InputStreamOptions_ReadAhead }; +//////////////////////////////////////////////////////////////////////////////////////////////// +// !!! KEEP IN SYNC WITH Windows.Devices.SerialCommunication.SerialData (in managed code) !!! // +//////////////////////////////////////////////////////////////////////////////////////////////// + +enum SerialData +{ + SerialData_Chars = 0, + SerialData_WatchChar, +}; + ///////////////////////////////////////////////////////// // UART PAL strucs delcared in win_dev_serial_native.h // ///////////////////////////////////////////////////////// @@ -159,59 +169,65 @@ static void TxEnd1(UARTDriver *uartp) // This callback is invoked when a character is received but the application was not ready to receive it, the character is passed as parameter. static void RxChar(UARTDriver *uartp, uint16_t c) { - (void)uartp; - (void)c; - NATIVE_INTERRUPT_START NF_PAL_UART* palUart; + uint8_t portIndex = 0; #if STM32_UART_USE_USART1 if (uartp == &UARTD1) { palUart = &Uart1_PAL; + portIndex = 1; } #endif #if STM32_UART_USE_USART2 if (uartp == &UARTD2) { palUart = &Uart2_PAL; + portIndex = 2; } #endif #if STM32_UART_USE_USART3 if (uartp == &UARTD3) { palUart = &Uart3_PAL; + portIndex = 3; } #endif #if STM32_UART_USE_UART4 if (uartp == &UARTD4) { palUart = &Uart4_PAL; + portIndex = 4; } #endif #if STM32_UART_USE_UART5 if (uartp == &UARTD5) { palUart = &Uart5_PAL; + portIndex = 5; } #endif #if STM32_UART_USE_USART6 if (uartp == &UARTD6) { palUart = &Uart6_PAL; + portIndex = 6; } #endif #if STM32_UART_USE_UART7 if (uartp == &UARTD7) { palUart = &Uart7_PAL; + portIndex = 7; } #endif #if STM32_UART_USE_UART8 if (uartp == &UARTD8) { palUart = &Uart8_PAL; + portIndex = 8; } #endif @@ -221,14 +237,27 @@ static void RxChar(UARTDriver *uartp, uint16_t c) // don't care about the success of the operation, if it's full we are droping the char anyway palUart->RxRingBuffer.Push((uint8_t)c); - // check if the requested bytes are available in the buffer - if(palUart->RxBytesToRead > 0 && palUart->RxRingBuffer.Length() >= palUart->RxBytesToRead) + // is there a read operation going on? + if(palUart->RxBytesToRead > 0) { - // reset Rx bytes to read count - palUart->RxBytesToRead = 0; + // yes + // check if the requested bytes are available in the buffer... + //... or if the watch char was received + if((palUart->RxRingBuffer.Length() >= palUart->RxBytesToRead) || + (c == palUart->WatchChar)) + { + // reset Rx bytes to read count + palUart->RxBytesToRead = 0; - // fire event for Rx buffer complete - Events_Set(SYSTEM_EVENT_FLAG_COM_IN); + // fire event for Rx buffer complete + Events_Set(SYSTEM_EVENT_FLAG_COM_IN); + } + } + else + { + // no read operation ongoing, so fire an event + // post a managed event with the port index and event code (check if this is the watch char or just another another) + PostManagedEvent( EVENT_SERIAL, 0, portIndex, (c == palUart->WatchChar) ? SerialData_WatchChar : SerialData_Chars ); } NATIVE_INTERRUPT_END @@ -962,6 +991,71 @@ HRESULT Library_win_dev_serial_native_Windows_Devices_SerialCommunication_Serial NANOCLR_NOCLEANUP(); } +HRESULT Library_win_dev_serial_native_Windows_Devices_SerialCommunication_SerialDevice::NativeSetWatchChar___VOID( CLR_RT_StackFrame& stack ) +{ + NANOCLR_HEADER(); + { + NF_PAL_UART* palUart; + + // get a pointer to the managed object instance and check that it's not NULL + CLR_RT_HeapBlock* pThis = stack.This(); FAULT_ON_NULL(pThis); + + // Choose the driver for this SerialDevice + switch ((int)pThis[ FIELD___portIndex ].NumericByRef().s4) + { + #if STM32_UART_USE_USART1 + case 1 : + palUart = &Uart1_PAL; + break; + #endif + #if STM32_UART_USE_USART2 + case 2 : + palUart = &Uart2_PAL; + break; + #endif + #if STM32_UART_USE_USART3 + case 3 : + palUart = &Uart3_PAL; + break; + #endif + #if STM32_UART_USE_UART4 + case 4 : + palUart = &Uart4_PAL; + break; + #endif + #if STM32_UART_USE_UART5 + case 5 : + palUart = &Uart5_PAL; + break; + #endif + #if STM32_UART_USE_USART6 + case 6 : + palUart = &Uart6_PAL; + break; + #endif + #if STM32_UART_USE_UART7 + case 7 : + palUart = &Uart7_PAL; + break; + #endif + #if STM32_UART_USE_UART8 + case 8 : + palUart = &Uart8_PAL; + break; + #endif + default: + // this COM port is not valid + NANOCLR_SET_AND_LEAVE(CLR_E_INVALID_PARAMETER); + break; + } + + // set watch char + palUart->WatchChar = (uint8_t)pThis[ FIELD___watchChar ].NumericByRef().u1; + + } + NANOCLR_NOCLEANUP(); +} + HRESULT Library_win_dev_serial_native_Windows_Devices_SerialCommunication_SerialDevice::GetDeviceSelector___STATIC__STRING( CLR_RT_StackFrame& stack ) { NANOCLR_HEADER(); diff --git a/targets/FreeRTOS/ESP32_DevKitC/nanoCLR/Windows.Devices.SerialCommunication/win_dev_serial_native.cpp b/targets/FreeRTOS/ESP32_DevKitC/nanoCLR/Windows.Devices.SerialCommunication/win_dev_serial_native.cpp index 35b9966c39..79b096f5be 100644 --- a/targets/FreeRTOS/ESP32_DevKitC/nanoCLR/Windows.Devices.SerialCommunication/win_dev_serial_native.cpp +++ b/targets/FreeRTOS/ESP32_DevKitC/nanoCLR/Windows.Devices.SerialCommunication/win_dev_serial_native.cpp @@ -35,12 +35,24 @@ static const CLR_RT_MethodHandler method_lookup[] = NULL, NULL, NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, Library_win_dev_serial_native_Windows_Devices_SerialCommunication_SerialDevice::NativeDispose___VOID, Library_win_dev_serial_native_Windows_Devices_SerialCommunication_SerialDevice::NativeInit___VOID, Library_win_dev_serial_native_Windows_Devices_SerialCommunication_SerialDevice::NativeConfig___VOID, Library_win_dev_serial_native_Windows_Devices_SerialCommunication_SerialDevice::NativeWrite___VOID__SZARRAY_U1, Library_win_dev_serial_native_Windows_Devices_SerialCommunication_SerialDevice::NativeStore___U4, Library_win_dev_serial_native_Windows_Devices_SerialCommunication_SerialDevice::NativeRead___U4__SZARRAY_U1__I4__I4, + Library_win_dev_serial_native_Windows_Devices_SerialCommunication_SerialDevice::NativeSetWatchChar___VOID, NULL, Library_win_dev_serial_native_Windows_Devices_SerialCommunication_SerialDevice::GetDeviceSelector___STATIC__STRING, NULL, @@ -53,12 +65,19 @@ static const CLR_RT_MethodHandler method_lookup[] = NULL, NULL, NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, }; const CLR_RT_NativeAssemblyData g_CLR_AssemblyNative_Windows_Devices_SerialCommunication = { "Windows.Devices.SerialCommunication", - 0x5E530ECD, + 0x2B84D4FF, method_lookup, { 1, 0, 0, 0 } }; diff --git a/targets/FreeRTOS/ESP32_DevKitC/nanoCLR/Windows.Devices.SerialCommunication/win_dev_serial_native.h b/targets/FreeRTOS/ESP32_DevKitC/nanoCLR/Windows.Devices.SerialCommunication/win_dev_serial_native.h index 2576c41aab..341f217b7d 100644 --- a/targets/FreeRTOS/ESP32_DevKitC/nanoCLR/Windows.Devices.SerialCommunication/win_dev_serial_native.h +++ b/targets/FreeRTOS/ESP32_DevKitC/nanoCLR/Windows.Devices.SerialCommunication/win_dev_serial_native.h @@ -30,8 +30,29 @@ struct Library_win_dev_serial_native_Windows_Devices_SerialCommunication_PinChan }; +struct Library_win_dev_serial_native_Windows_Devices_SerialCommunication_SerialDataEvent +{ + static const int FIELD__SerialDeviceIndex = 3; + static const int FIELD__Event = 4; + + + //--// + +}; + +struct Library_win_dev_serial_native_Windows_Devices_SerialCommunication_SerialDataReceivedEventArgs +{ + static const int FIELD___data = 1; + + + //--// + +}; + struct Library_win_dev_serial_native_Windows_Devices_SerialCommunication_SerialDevice { + static const int FIELD_STATIC__s_eventListener = 0; + static const int FIELD___disposed = 1; static const int FIELD___syncLock = 2; static const int FIELD___opened = 3; @@ -47,6 +68,8 @@ struct Library_win_dev_serial_native_Windows_Devices_SerialCommunication_SerialD static const int FIELD___parity = 13; static const int FIELD___stopBits = 14; static const int FIELD___bytesReceived = 15; + static const int FIELD___watchChar = 16; + static const int FIELD___callbacksDataReceivedEvent = 17; NANOCLR_NATIVE_DECLARE(NativeDispose___VOID); NANOCLR_NATIVE_DECLARE(NativeInit___VOID); @@ -54,6 +77,7 @@ struct Library_win_dev_serial_native_Windows_Devices_SerialCommunication_SerialD NANOCLR_NATIVE_DECLARE(NativeWrite___VOID__SZARRAY_U1); NANOCLR_NATIVE_DECLARE(NativeStore___U4); NANOCLR_NATIVE_DECLARE(NativeRead___U4__SZARRAY_U1__I4__I4); + NANOCLR_NATIVE_DECLARE(NativeSetWatchChar___VOID); NANOCLR_NATIVE_DECLARE(GetDeviceSelector___STATIC__STRING); //--// @@ -62,8 +86,26 @@ struct Library_win_dev_serial_native_Windows_Devices_SerialCommunication_SerialD struct Library_win_dev_serial_native_Windows_Devices_SerialCommunication_SerialDeviceController { - static const int FIELD_STATIC__s_instance = 0; - static const int FIELD_STATIC__s_deviceCollection = 1; + static const int FIELD_STATIC__s_instance = 1; + static const int FIELD_STATIC__s_deviceCollection = 2; + + + //--// + +}; + +struct Library_win_dev_serial_native_Windows_Devices_SerialCommunication_SerialDeviceEventListener +{ + static const int FIELD___serialDevicesMap = 1; + + + //--// + +}; + +struct Library_win_dev_serial_native_Windows_Devices_SerialCommunication_SerialDeviceInputStream +{ + static const int FIELD___serialDevice = 1; //--// @@ -73,6 +115,7 @@ struct Library_win_dev_serial_native_Windows_Devices_SerialCommunication_SerialD struct Library_win_dev_serial_native_Windows_Devices_SerialCommunication_SerialDeviceOutputStream { static const int FIELD___serialDevice = 1; + static const int FIELD___unstoredBufferLength = 2; //--// diff --git a/targets/FreeRTOS/ESP32_DevKitC/nanoCLR/Windows.Devices.SerialCommunication/win_dev_serial_native_Windows_Devices_SerialCommunication_SerialDevice.cpp b/targets/FreeRTOS/ESP32_DevKitC/nanoCLR/Windows.Devices.SerialCommunication/win_dev_serial_native_Windows_Devices_SerialCommunication_SerialDevice.cpp index 8b228f527e..6db13ab49a 100644 --- a/targets/FreeRTOS/ESP32_DevKitC/nanoCLR/Windows.Devices.SerialCommunication/win_dev_serial_native_Windows_Devices_SerialCommunication_SerialDevice.cpp +++ b/targets/FreeRTOS/ESP32_DevKitC/nanoCLR/Windows.Devices.SerialCommunication/win_dev_serial_native_Windows_Devices_SerialCommunication_SerialDevice.cpp @@ -65,6 +65,16 @@ enum InputStreamOptions InputStreamOptions_ReadAhead }; +//////////////////////////////////////////////////////////////////////////////////////////////// +// !!! KEEP IN SYNC WITH Windows.Devices.SerialCommunication.SerialData (in managed code) !!! // +//////////////////////////////////////////////////////////////////////////////////////////////// + +enum SerialData +{ + SerialData_Chars = 0, + SerialData_WatchChar, +}; + static const char* TAG = "SerialDevice"; static char Esp_Serial_Initialised_Flag[UART_NUM_MAX] = {0,0,0}; @@ -464,6 +474,18 @@ HRESULT Library_win_dev_serial_native_Windows_Devices_SerialCommunication_Serial NANOCLR_NOCLEANUP(); } +HRESULT Library_win_dev_serial_native_Windows_Devices_SerialCommunication_SerialDevice::NativeSetWatchChar___VOID( CLR_RT_StackFrame& stack ) +{ + (void) stack; + + NANOCLR_HEADER(); + { + // set watch char + // (uint8_t)pThis[ FIELD___watchChar ].NumericByRef().u1; + + } + NANOCLR_NOCLEANUP_NOLABEL(); +} HRESULT Library_win_dev_serial_native_Windows_Devices_SerialCommunication_SerialDevice::GetDeviceSelector___STATIC__STRING( CLR_RT_StackFrame& stack ) {