diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index b9bd493825..4e6f08d76d 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -16,6 +16,10 @@ // Keep command history "source=nano-bashhistory,target=/home/vscode/commandhistory,type=volume", ], + "workspaceFolder": "/workspace", + //"workspaceMount": "type=bind,source=${localWorkspaceFolder},target=/worspaces/${localWorkspaceFolderBasename},consistency=cached", + "workspaceMount": "source=nf-interpreter,target=/workspace,type=volume", + // Set *default* container specific settings.json values on container create. "settings": { "cmake.preferredGenerators": [ @@ -31,8 +35,8 @@ }, // Add the IDs of extensions you want installed when the container is created. "extensions": [ - "ms-vsliveshare.vsliveshare-pack", - "streetsidesoftware.code-spell-checker", + //"ms-vsliveshare.vsliveshare-pack", + //"streetsidesoftware.code-spell-checker", "twxs.cmake", "ms-vscode.cmake-tools" ], diff --git a/.vscode/cmake-variants-DEVCONTAINER.json b/.vscode/cmake-variants-DEVCONTAINER.json index 1552361d8f..8b73d83f67 100644 --- a/.vscode/cmake-variants-DEVCONTAINER.json +++ b/.vscode/cmake-variants-DEVCONTAINER.json @@ -292,7 +292,8 @@ "API_nanoFramework.Hardware.Esp32.Rmt": "ON", "API_System.Device.Dac": "ON", "API_nanoFramework.Graphics": "OFF", - "API_nanoFramework.Device.Bluetooth": "ON" + "API_nanoFramework.Device.Bluetooth": "ON", + "API_nanoFramework.Espnow": "ON" } }, "ESP32_REV0": { @@ -339,7 +340,8 @@ "API_nanoFramework.Hardware.Esp32.Rmt": "ON", "API_System.Device.Dac": "ON", "API_nanoFramework.Graphics": "OFF", - "API_nanoFramework.Device.Bluetooth": "OFF" + "API_nanoFramework.Device.Bluetooth": "OFF", + "API_nanoFramework.Espnow": "ON" } }, "ESP32_BLE_REV0": { @@ -387,7 +389,8 @@ "API_nanoFramework.Hardware.Esp32.Rmt": "ON", "API_System.Device.Dac": "ON", "API_nanoFramework.Graphics": "OFF", - "API_nanoFramework.Device.Bluetooth": "ON" + "API_nanoFramework.Device.Bluetooth": "ON", + "API_nanoFramework.Espnow": "ON" } }, "ESP32_PICO": { @@ -435,7 +438,8 @@ "API_Windows.Devices.Adc": "ON", "API_nanoFramework.Device.OneWire": "ON", "API_nanoFramework.Graphics": "OFF", - "API_nanoFramework.Device.Bluetooth": "OFF" + "API_nanoFramework.Device.Bluetooth": "OFF", + "API_nanoFramework.Espnow": "ON" } }, "ESP_WROVER_KIT": { @@ -483,7 +487,7 @@ "API_nanoFramework.Hardware.Esp32.Rmt": "ON", "API_nanoFramework.Device.Bluetooth": "OFF", "API_nanoFramework.Graphics": "ON", - "API_Windows.Devices.Adc": "ON", + "API_nanoFramework.Espnow": "ON", "GRAPHICS_DISPLAY": "ILI9341_240x320_SPI.cpp", "TOUCHPANEL_DEVICE": "XPT2046.cpp", "GRAPHICS_DISPLAY_INTERFACE": "Spi_To_Display.cpp", @@ -535,7 +539,8 @@ "API_System.Device.Dac": "ON", "API_nanoFramework.Device.OneWire": "OFF", "API_nanoFramework.Graphics": "OFF", - "API_nanoFramework.Device.Bluetooth": "OFF" + "API_nanoFramework.Device.Bluetooth": "OFF", + "API_nanoFramework.Espnow": "ON" } }, "KALUGA_1": { @@ -583,8 +588,9 @@ "API_nanoFramework.Device.Bluetooth": "OFF", "API_nanoFramework.Device.OneWire": "OFF", "API_nanoFramework.Graphics": "ON", + "API_nanoFramework.Espnow": "ON", "GRAPHICS_DISPLAY": "ILI9341_240x320_SPI.cpp", - "GRAPHICS_DISPLAY_INTERFACE": "Spi_To_Display.cpp", + "GRAPHICS_DISPLAY_INTERFACE": "Spi_To_Display.cpp" } }, "M5Core": { @@ -630,6 +636,7 @@ "API_nanoFramework.Device.Bluetooth": "OFF", "API_System.Device.Dac": "ON", "API_nanoFramework.Graphics": "ON", + "API_nanoFramework.Espnow": "ON", "GRAPHICS_DISPLAY": "ILI9341_240x320_SPI.cpp", "TOUCHPANEL_DEVICE": "XPT2046.cpp", "GRAPHICS_DISPLAY_INTERFACE": "Spi_To_Display.cpp", @@ -682,8 +689,8 @@ "API_nanoFramework.Device.OneWire": "ON", "API_System.Device.Dac": "ON", "API_nanoFramework.Graphics": "OFF", - "API_nanoFramework.Device.Bluetooth": "OFF" - + "API_nanoFramework.Device.Bluetooth": "OFF", + "API_nanoFramework.Espnow": "ON" } }, "TI_CC1352R1_LAUNCHXL": { diff --git a/.vscode/cmake-variants.TEMPLATE.json b/.vscode/cmake-variants.TEMPLATE.json index 9c1f390697..1ced39e62d 100644 --- a/.vscode/cmake-variants.TEMPLATE.json +++ b/.vscode/cmake-variants.TEMPLATE.json @@ -115,6 +115,7 @@ "API_nanoFramework.TI.EasyLink": "OFF-default-ON-to-add-this-API", "API_nanoFramework.Hardware.Esp32.Rmt": "OFF-default-ON-to-add-this-API", "API_nanoFramework.Device.Bluetooth": "OFF-default-ON-to-add-this-API", + "API_nanoFramework.Espnow": "OFF-default-ON-to-add-this-API", "API_System.Device.WiFi": "OFF-default-ON-to-add-this-API" } } diff --git a/CMake/Modules/FindNF_NativeAssemblies.cmake b/CMake/Modules/FindNF_NativeAssemblies.cmake index d6f1a3053f..7a7f8b4185 100644 --- a/CMake/Modules/FindNF_NativeAssemblies.cmake +++ b/CMake/Modules/FindNF_NativeAssemblies.cmake @@ -39,6 +39,8 @@ option(API_nanoFramework.Device.Bluetooth "option for nanoFramework.Device # Esp32 only option(API_Hardware.Esp32 "option for Hardware.Esp32") option(API_nanoFramework.Hardware.Esp32.Rmt "option for nanoFramework.Hardware.Esp32.Rmt") +option(API_nanoFramework.Espnow "option for nanoFramework.Espnow") + # Stm32 only @@ -177,6 +179,12 @@ if(API_nanoFramework.Hardware.Esp32.Rmt) PerformSettingsForApiEntry("nanoFramework.Hardware.Esp32.Rmt") endif() +# nanoFramework.Espnow +if(API_nanoFramework.Espnow) + ##### API name here (doted name) + PerformSettingsForApiEntry("nanoFramework.Espnow") +endif() + # nanoFramework.Device.Bluetooth if(API_nanoFramework.Device.Bluetooth) ##### API name here (doted name) diff --git a/CMake/Modules/FindnanoFramework.Espnow.cmake b/CMake/Modules/FindnanoFramework.Espnow.cmake new file mode 100644 index 0000000000..0c4c437afd --- /dev/null +++ b/CMake/Modules/FindnanoFramework.Espnow.cmake @@ -0,0 +1,45 @@ +# +# Copyright (c) .NET Foundation and Contributors +# See LICENSE file in the project root for full license information. +# + +# native code directory +set(BASE_PATH_FOR_THIS_MODULE ${BASE_PATH_FOR_CLASS_LIBRARIES_MODULES}/nanoFramework.Espnow) + + +# set include directories +list(APPEND nanoFramework.Espnow_INCLUDE_DIRS ${PROJECT_SOURCE_DIR}/src/CLR/Core) +list(APPEND nanoFramework.Espnow_INCLUDE_DIRS ${PROJECT_SOURCE_DIR}/src/CLR/Include) +list(APPEND nanoFramework.Espnow_INCLUDE_DIRS ${PROJECT_SOURCE_DIR}/src/HAL/Include) +list(APPEND nanoFramework.Espnow_INCLUDE_DIRS ${PROJECT_SOURCE_DIR}/src/PAL/Include) +list(APPEND nanoFramework.Espnow_INCLUDE_DIRS ${BASE_PATH_FOR_THIS_MODULE}) +list(APPEND nanoFramework.Espnow_INCLUDE_DIRS ${PROJECT_SOURCE_DIR}/src/nanoFramework.Espnow) + +# source files +set(nanoFramework.Espnow_SRCS + + nanoFramework_espnow_native.cpp + + + nanoFramework_espnow_native_nanoFramework_Espnow_EspNowController.cpp + nanoFramework_espnow_native_nanoFramework_Espnow_EspNowController__EspNowEventHandler.cpp + +) + +foreach(SRC_FILE ${nanoFramework.Espnow_SRCS}) + set(nanoFramework.Espnow_SRC_FILE SRC_FILE-NOTFOUND) + find_file(nanoFramework.Espnow_SRC_FILE ${SRC_FILE} + PATHS + ${BASE_PATH_FOR_THIS_MODULE} + ${TARGET_BASE_LOCATION} + ${PROJECT_SOURCE_DIR}/src/nanoFramework.Espnow + + CMAKE_FIND_ROOT_PATH_BOTH + ) + # message("${SRC_FILE} >> ${nanoFramework.Espnow_SRC_FILE}") # debug helper + list(APPEND nanoFramework.Espnow_SOURCES ${nanoFramework.Espnow_SRC_FILE}) +endforeach() + +include(FindPackageHandleStandardArgs) + +FIND_PACKAGE_HANDLE_STANDARD_ARGS(nanoFramework.Espnow DEFAULT_MSG nanoFramework.Espnow_INCLUDE_DIRS nanoFramework.Espnow_SOURCES) diff --git a/build.ps1 b/build.ps1 index b2279c942c..678517f0bb 100644 --- a/build.ps1 +++ b/build.ps1 @@ -180,9 +180,9 @@ elseif ($TargetBoard -eq "ESP32_WROOM_32") { -DAPI_nanoFramework.System.Collections=ON -DAPI_nanoFramework.System.Text=ON -DAPI_nanoFramework.Hardware.Esp32.Rmt=ON +-DAPI_nanoFramework.Espnow=ON -DAPI_System.Device.Dac=ON "@ - # CMake prep $cmakePrep = @" -G Ninja diff --git a/src/CLR/Core/TypeSystem.cpp b/src/CLR/Core/TypeSystem.cpp index f1cdc27b91..a625a90fa1 100644 --- a/src/CLR/Core/TypeSystem.cpp +++ b/src/CLR/Core/TypeSystem.cpp @@ -2844,6 +2844,9 @@ static const TypeIndexLookup c_TypeIndexLookup[] = { TIL("nanoFramework.Hardware.Esp32.Rmt", "RmtCommand", m_RmtCommand), + TIL("nanoFramework.Espnow", "DataSentEventInternal", m_EspNowDataSentEvent), + TIL("nanoFramework.Espnow", "DataRecvEventInternal", m_EspNowDataRecvEvent), + #undef TIL }; diff --git a/src/CLR/Include/nanoCLR_Runtime.h b/src/CLR/Include/nanoCLR_Runtime.h index a4ac1cd549..e2958bf468 100644 --- a/src/CLR/Include/nanoCLR_Runtime.h +++ b/src/CLR/Include/nanoCLR_Runtime.h @@ -1581,6 +1581,9 @@ struct CLR_RT_WellKnownTypes CLR_RT_TypeDef_Index m_RmtCommand; + CLR_RT_TypeDef_Index m_EspNowDataRecvEvent; + CLR_RT_TypeDef_Index m_EspNowDataSentEvent; + PROHIBIT_COPY_CONSTRUCTORS(CLR_RT_WellKnownTypes); }; diff --git a/src/HAL/Include/nanoHAL_v2.h b/src/HAL/Include/nanoHAL_v2.h index 3bd5acc3a8..c4545d15be 100644 --- a/src/HAL/Include/nanoHAL_v2.h +++ b/src/HAL/Include/nanoHAL_v2.h @@ -112,6 +112,9 @@ typedef enum SLEEP_LEVEL #define EVENT_TOUCH 120 #define EVENT_GESTURE 130 +// keep in sync with nanoFramework.Espnow.EspNowController +#define EVENT_ESPNOW 140 + #define PAL_EVENT_TOUCH 0x1 #define PAL_EVENT_KEY 0x2 #define PAL_EVENT_MOUSE 0x4 diff --git a/targets/ESP32/ESP32/cmake-variants.json b/targets/ESP32/ESP32/cmake-variants.json index 10849f6edc..727fb3c6f7 100644 --- a/targets/ESP32/ESP32/cmake-variants.json +++ b/targets/ESP32/ESP32/cmake-variants.json @@ -65,6 +65,7 @@ "API_System.Device.Spi": "ON", "API_Hardware.Esp32": "ON", "API_nanoFramework.Hardware.Esp32.Rmt": "ON", + "API_nanoFramework.Espnow": "ON", "API_nanoFramework.Device.OneWire": "ON", "API_nanoFramework.Graphics": "OFF", "API_nanoFramework.Device.Bluetooth": "OFF" @@ -113,6 +114,7 @@ "API_System.Device.Spi": "ON", "API_Hardware.Esp32": "ON", "API_nanoFramework.Hardware.Esp32.Rmt": "ON", + "API_nanoFramework.Espnow": "ON", "API_nanoFramework.Device.OneWire": "ON", "API_nanoFramework.Graphics": "OFF", "API_nanoFramework.Device.Bluetooth": "OFF" @@ -162,6 +164,7 @@ "API_System.Device.Spi": "ON", "API_Hardware.Esp32": "ON", "API_nanoFramework.Hardware.Esp32.Rmt": "ON", + "API_nanoFramework.Espnow": "ON", "API_nanoFramework.Device.OneWire": "ON", "API_nanoFramework.Graphics": "OFF", "API_nanoFramework.Device.Bluetooth": "ON" @@ -212,6 +215,7 @@ "API_System.Device.Spi": "ON", "API_Hardware.Esp32": "ON", "API_nanoFramework.Hardware.Esp32.Rmt": "ON", + "API_nanoFramework.Espnow": "ON", "API_nanoFramework.Device.OneWire": "ON", "API_nanoFramework.Graphics": "OFF", "API_nanoFramework.Device.Bluetooth": "OFF" @@ -260,6 +264,7 @@ "API_Windows.Storage": "ON", "API_Hardware.Esp32": "ON", "API_nanoFramework.Hardware.Esp32.Rmt": "ON", + "API_nanoFramework.Espnow": "ON", "API_nanoFramework.Device.Bluetooth": "OFF", "API_nanoFramework.Graphics": "ON", "GRAPHICS_DISPLAY": "ILI9341_240x320_SPI.cpp", @@ -311,6 +316,7 @@ "API_Windows.Storage": "ON", "API_Hardware.Esp32": "ON", "API_nanoFramework.Hardware.Esp32.Rmt": "ON", + "API_nanoFramework.Espnow": "ON", "API_nanoFramework.Device.Bluetooth": "OFF", "API_nanoFramework.Graphics": "ON", "GRAPHICS_DISPLAY": "ILI9341_240x320_SPI.cpp", @@ -416,6 +422,7 @@ "API_System.Device.Spi": "ON", "API_Hardware.Esp32": "ON", "API_nanoFramework.Hardware.Esp32.Rmt": "ON", + "API_nanoFramework.Espnow": "ON", "API_nanoFramework.Device.OneWire": "ON", "API_nanoFramework.Graphics": "OFF", "API_nanoFramework.Device.Bluetooth": "OFF" diff --git a/targets/ESP32/ESP32_S2/cmake-variants.json b/targets/ESP32/ESP32_S2/cmake-variants.json index bc364c7616..fa9fb0a1a8 100644 --- a/targets/ESP32/ESP32_S2/cmake-variants.json +++ b/targets/ESP32/ESP32_S2/cmake-variants.json @@ -68,6 +68,7 @@ "API_System.Device.Spi": "ON", "API_Hardware.Esp32": "ON", "API_nanoFramework.Hardware.Esp32.Rmt": "ON", + "API_nanoFramework.Espnow": "ON", "API_nanoFramework.Device.OneWire": "OFF", "API_nanoFramework.Graphics": "OFF", "API_nanoFramework.Device.Bluetooth": "OFF" @@ -114,6 +115,7 @@ "API_System.Device.Spi": "ON", "API_Hardware.Esp32": "ON", "API_nanoFramework.Hardware.Esp32.Rmt": "ON", + "API_nanoFramework.Espnow": "ON", "API_nanoFramework.Device.Bluetooth": "OFF", "API_nanoFramework.Device.OneWire": "OFF", "API_nanoFramework.Graphics": "ON", diff --git a/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.cpp b/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.cpp new file mode 100644 index 0000000000..e299fc06e3 --- /dev/null +++ b/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.cpp @@ -0,0 +1,51 @@ +#include "nanoFramework_espnow_native.h" + +// clang-format off + +static const CLR_RT_MethodHandler method_lookup[] = +{ + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + Library_nanoFramework_espnow_native_nanoFramework_Espnow_EspNowController::NativeInitialize___I4, + Library_nanoFramework_espnow_native_nanoFramework_Espnow_EspNowController::NativeDispose___VOID__BOOLEAN, + Library_nanoFramework_espnow_native_nanoFramework_Espnow_EspNowController::NativeEspNowSend___I4__SZARRAY_U1__SZARRAY_U1__I4, + Library_nanoFramework_espnow_native_nanoFramework_Espnow_EspNowController::NativeEspNowAddPeer___I4__SZARRAY_U1__U1, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + Library_nanoFramework_espnow_native_nanoFramework_Espnow_EspNowController__EspNowEventHandler::ProcessEvent___nanoFrameworkRuntimeEventsBaseEvent__U4__U4__SystemDateTime, + NULL, + NULL, +}; + +const CLR_RT_NativeAssemblyData g_CLR_AssemblyNative_nanoFramework_Espnow = +{ + "nanoFramework.Espnow", + 0x3C8132ED, + method_lookup, + { 0, 9, 99, 999 } +}; + +// clang-format on diff --git a/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.h b/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.h new file mode 100644 index 0000000000..a592d3529a --- /dev/null +++ b/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.h @@ -0,0 +1,148 @@ +//----------------------------------------------------------------------------- +// +// ** WARNING! ** +// This file was generated automatically by a tool. +// Re-running the tool will overwrite this file. +// You should copy this file to a custom location +// before adding any customization in the copy to +// prevent loss of your changes when the tool is +// re-run. +// +//----------------------------------------------------------------------------- + +#ifndef _NANOFRAMEWORK_ESPNOW_NATIVE_H_ +#define _NANOFRAMEWORK_ESPNOW_NATIVE_H_ + +#include +#include +#include +#include + +#include +#include +#include + +//#define DEBUG_ESPNOW 1 + +#define DEBUG_FENTER() DEBUG_WRITELINE("entry") +#define DEBUG_FEXIT() DEBUG_WRITELINE("exit") +#define DEBUG_FEXIT_RET(v) DEBUG_WRITELINE("return: %d", v) + +#if defined(DEBUG_ESPNOW) +#define DEBUG_WRITELINE(...) \ + { \ + char temporaryStringBuffer1[64]; \ + snprintf(temporaryStringBuffer1, sizeof(temporaryStringBuffer1), __VA_ARGS__); \ + char temporaryStringBuffer2[128]; \ + int realStringSize = snprintf( \ + temporaryStringBuffer2, \ + sizeof(temporaryStringBuffer2), \ + "\r\n[%s] %s\r\n", \ + __func__, \ + temporaryStringBuffer1); \ + CLR_EE_DBG_EVENT_BROADCAST( \ + CLR_DBG_Commands_c_Monitor_Message, \ + realStringSize, \ + temporaryStringBuffer2, \ + WP_Flags_c_NonCritical | WP_Flags_c_NoCaching); \ + } + +#else +#define DEBUG_WRITELINE(...) ; +#endif + +#define EVENT_ESPNOW_DATASENT 1 +#define EVENT_ESPNOW_DATARECV 2 + +struct EspNowDataSentEventData +{ + uint8_t peer_mac[ESP_NOW_ETH_ALEN]; + esp_now_send_status_t status; +}; + +struct EspNowDataRecvEventData +{ + uint8_t peer_mac[ESP_NOW_ETH_ALEN]; + uint8_t data[ESP_NOW_MAX_DATA_LEN]; + int dataLen; +}; + +struct Library_nanoFramework_espnow_native_nanoFramework_Espnow_DataReceivedEventArgs +{ + static const int FIELD__PeerMac = 1; + static const int FIELD__Data = 2; + static const int FIELD__DataLen = 3; + + //--// +}; + +struct Library_nanoFramework_espnow_native_nanoFramework_Espnow_DataRecvEventInternal +{ + static const int FIELD__PeerMac = 3; + static const int FIELD__Data = 4; + static const int FIELD__DataLen = 5; + + //--// +}; + +struct Library_nanoFramework_espnow_native_nanoFramework_Espnow_DataSentEventArgs +{ + static const int FIELD__PeerMac = 1; + static const int FIELD__Status = 2; + + //--// +}; + +struct Library_nanoFramework_espnow_native_nanoFramework_Espnow_DataSentEventInternal +{ + static const int FIELD__PeerMac = 3; + static const int FIELD__Status = 4; + + //--// +}; + +struct Library_nanoFramework_espnow_native_nanoFramework_Espnow_EspNowController +{ + static const int FIELD_STATIC__BROADCASTMAC = 0; + + static const int FIELD__DataSent = 1; + static const int FIELD__DataReceived = 2; + static const int FIELD__isDisposed = 3; + static const int FIELD__eventHandler = 4; + + NANOCLR_NATIVE_DECLARE(NativeInitialize___I4); + NANOCLR_NATIVE_DECLARE(NativeDispose___VOID__BOOLEAN); + NANOCLR_NATIVE_DECLARE(NativeEspNowSend___I4__SZARRAY_U1__SZARRAY_U1__I4); + NANOCLR_NATIVE_DECLARE(NativeEspNowAddPeer___I4__SZARRAY_U1__U1); + + //--// + static EspNowDataSentEventData dataSentEventData; + static EspNowDataRecvEventData dataRecvEventData; + + static void DataSentCb(const uint8_t *mac_addr, esp_now_send_status_t status); + static void DataRecvCb(const uint8_t *mac, const uint8_t *incomingData, int len); +}; + +struct Library_nanoFramework_espnow_native_nanoFramework_Espnow_EspNowController__EspNowEventHandler +{ + static const int FIELD__controllerInstance = 1; + + NANOCLR_NATIVE_DECLARE(ProcessEvent___nanoFrameworkRuntimeEventsBaseEvent__U4__U4__SystemDateTime); + + //--// + + static HRESULT CopyByteArrayToCLRArray(CLR_RT_HeapBlock &target, uint8_t *src, CLR_UINT32 length); + static HRESULT ProcessEvent_DataSent(CLR_RT_StackFrame &stack); + static HRESULT ProcessEvent_DataRecv(CLR_RT_StackFrame &stack); +}; + +struct Library_nanoFramework_espnow_native_nanoFramework_Espnow_EspNowException +{ + static const int FIELD__esp_err = 5; + + //--// +}; + +extern const CLR_RT_NativeAssemblyData g_CLR_AssemblyNative_nanoFramework_Espnow; + +#endif //_NANOFRAMEWORK_ESPNOW_NATIVE_H_ diff --git a/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native_nanoFramework_Espnow_EspNowController.cpp b/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native_nanoFramework_Espnow_EspNowController.cpp new file mode 100644 index 0000000000..64b9e5dc98 --- /dev/null +++ b/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native_nanoFramework_Espnow_EspNowController.cpp @@ -0,0 +1,181 @@ +//----------------------------------------------------------------------------- +// +// ** WARNING! ** +// This file was generated automatically by a tool. +// Re-running the tool will overwrite this file. +// You should copy this file to a custom location +// before adding any customization in the copy to +// prevent loss of your changes when the tool is +// re-run. +// +//----------------------------------------------------------------------------- + +#include "nanoFramework_espnow_native.h" + +EspNowDataSentEventData Library_nanoFramework_espnow_native_nanoFramework_Espnow_EspNowController::dataSentEventData; +EspNowDataRecvEventData Library_nanoFramework_espnow_native_nanoFramework_Espnow_EspNowController::dataRecvEventData; + +void Library_nanoFramework_espnow_native_nanoFramework_Espnow_EspNowController::DataSentCb( + const uint8_t *mac_addr, + esp_now_send_status_t status) +{ + DEBUG_FENTER(); + + DEBUG_WRITELINE("Sending status:\t%d", status); + + memcpy(dataSentEventData.peer_mac, mac_addr, ESP_NOW_ETH_ALEN); + dataSentEventData.status = status; + + DEBUG_WRITELINE("Posting managed SENT event"); + + PostManagedEvent(EVENT_ESPNOW, 0, EVENT_ESPNOW_DATASENT, (CLR_UINT32)&dataSentEventData); + + DEBUG_FEXIT(); +} + +void Library_nanoFramework_espnow_native_nanoFramework_Espnow_EspNowController::DataRecvCb( + const uint8_t *mac_addr, + const uint8_t *incomingData, + int len) +{ + DEBUG_FENTER(); + + DEBUG_WRITELINE("Recv %d bytes from[0]:\t%d", len, incomingData[0]); + + memcpy(dataRecvEventData.peer_mac, mac_addr, ESP_NOW_ETH_ALEN); + memcpy(dataRecvEventData.data, incomingData, len); + dataRecvEventData.dataLen = len; + + DEBUG_WRITELINE("Posting managed RECV event"); + + PostManagedEvent(EVENT_ESPNOW, 0, EVENT_ESPNOW_DATARECV, (CLR_UINT32)&dataRecvEventData); + + DEBUG_FEXIT(); +} + +HRESULT Library_nanoFramework_espnow_native_nanoFramework_Espnow_EspNowController::NativeInitialize___I4( + CLR_RT_StackFrame &stack) +{ + NANOCLR_HEADER(); + + DEBUG_FENTER(); + + esp_err_t ret; + + DEBUG_WRITELINE("ESPNOW init"); + + ret = esp_now_init(); + if (ret == ESP_OK) + { + + DEBUG_WRITELINE("ESPNOW reg recvcb"); + + ret = esp_now_register_recv_cb(DataRecvCb); + if (ret == ESP_OK) + { + + DEBUG_WRITELINE("ESPNOW reg sendcb"); + + ret = esp_now_register_send_cb(DataSentCb); + } + } + + DEBUG_FEXIT_RET(ret); + + stack.SetResult_I4((int32_t)ret); + + NANOCLR_NOCLEANUP_NOLABEL(); +} + +HRESULT Library_nanoFramework_espnow_native_nanoFramework_Espnow_EspNowController::NativeDispose___VOID__BOOLEAN( + CLR_RT_StackFrame &stack) +{ + NANOCLR_HEADER(); + + DEBUG_FENTER(); + + esp_now_unregister_recv_cb(); + esp_now_unregister_send_cb(); + esp_now_deinit(); + + DEBUG_FEXIT(); + + NANOCLR_NOCLEANUP_NOLABEL(); +} + +HRESULT Library_nanoFramework_espnow_native_nanoFramework_Espnow_EspNowController:: + NativeEspNowSend___I4__SZARRAY_U1__SZARRAY_U1__I4(CLR_RT_StackFrame &stack) +{ + NANOCLR_HEADER(); + + DEBUG_FENTER(); + + esp_err_t ret; + + CLR_RT_HeapBlock_Array *peerMacArg = stack.Arg1().DereferenceArray(); + char *peerMac = (char *)peerMacArg->GetFirstElement(); + + CLR_RT_HeapBlock_Array *dataArg = stack.Arg2().DereferenceArray(); + char *data = (char *)dataArg->GetFirstElement(); + + int32_t dataLen = stack.Arg3().NumericByRef().s4; + + DEBUG_WRITELINE( + "sending %d: bytes to peer mac: %x:%x:%x:%x:%x:%x, data[0]: %x", + dataLen, + peerMac[0], + peerMac[1], + peerMac[2], + peerMac[3], + peerMac[4], + peerMac[5], + data[0]); + + ret = esp_now_send((const uint8_t *)peerMac, (const uint8_t *)data, dataLen); + + DEBUG_FEXIT_RET(ret); + + stack.SetResult_I4((int32_t)ret); + + NANOCLR_NOCLEANUP_NOLABEL(); +} + +HRESULT Library_nanoFramework_espnow_native_nanoFramework_Espnow_EspNowController:: + NativeEspNowAddPeer___I4__SZARRAY_U1__U1(CLR_RT_StackFrame &stack) +{ + NANOCLR_HEADER(); + + DEBUG_FENTER(); + + esp_err_t ret; + + CLR_RT_HeapBlock_Array *peerMacArg = stack.Arg1().DereferenceArray(); + char *peerMac = (char *)peerMacArg->GetFirstElement(); + + uint8_t channel = (uint8_t)stack.Arg2().NumericByRef().u1; + + esp_now_peer_info_t peerInfo; + memset((void *)&peerInfo, 0, sizeof(peerInfo)); + memcpy(peerInfo.peer_addr, peerMac, ESP_NOW_ETH_ALEN); + peerInfo.ifidx = WIFI_IF_STA; + peerInfo.channel = channel; + peerInfo.encrypt = false; + + DEBUG_WRITELINE( + "add_peer, mac: %x:%x:%x:%x:%x:%x, ch: %d", + peerMac[0], + peerMac[1], + peerMac[2], + peerMac[3], + peerMac[4], + peerMac[5], + channel); + + ret = esp_now_add_peer(&peerInfo); + + DEBUG_FEXIT_RET(ret); + + stack.SetResult_I4((int32_t)ret); + + NANOCLR_NOCLEANUP_NOLABEL(); +} diff --git a/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native_nanoFramework_Espnow_EspNowController__EspNowEventHandler.cpp b/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native_nanoFramework_Espnow_EspNowController__EspNowEventHandler.cpp new file mode 100644 index 0000000000..2628e15fce --- /dev/null +++ b/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native_nanoFramework_Espnow_EspNowController__EspNowEventHandler.cpp @@ -0,0 +1,160 @@ +//----------------------------------------------------------------------------- +// +// ** WARNING! ** +// This file was generated automatically by a tool. +// Re-running the tool will overwrite this file. +// You should copy this file to a custom location +// before adding any customization in the copy to +// prevent loss of your changes when the tool is +// re-run. +// +//----------------------------------------------------------------------------- + +#include "nanoFramework_espnow_native.h" + +HRESULT +Library_nanoFramework_espnow_native_nanoFramework_Espnow_EspNowController__EspNowEventHandler::CopyByteArrayToCLRArray( + CLR_RT_HeapBlock &target, + uint8_t *src, + CLR_UINT32 length) +{ + NANOCLR_HEADER(); + + DEBUG_FENTER(); + + CLR_UINT8 *firstTargetByte; + CLR_RT_HeapBlock_Array *targetArray; + + NANOCLR_CHECK_HRESULT(CLR_RT_HeapBlock_Array::CreateInstance(target, length, g_CLR_RT_WellKnownTypes.m_UInt8)); + + targetArray = target.DereferenceArray(); + if (!targetArray) + { + NANOCLR_SET_AND_LEAVE(CLR_E_OUT_OF_MEMORY); + } + + DEBUG_WRITELINE("copying %d bytes", length); + + firstTargetByte = targetArray->GetFirstElement(); + memcpy(firstTargetByte, src, length); + + DEBUG_FEXIT(); + + NANOCLR_NOCLEANUP(); +} + +HRESULT +Library_nanoFramework_espnow_native_nanoFramework_Espnow_EspNowController__EspNowEventHandler::ProcessEvent_DataSent( + CLR_RT_StackFrame &stack) +{ + NANOCLR_HEADER(); + + DEBUG_FENTER(); + + EspNowDataSentEventData *sentEventData = (EspNowDataSentEventData *)stack.Arg2().NumericByRef().u4; + CLR_RT_HeapBlock *dataSentEvent; + + // create nanoFramework.Espnow.EspNowController.DataSentEventInternal instance to return + CLR_RT_HeapBlock &clrRet = stack.PushValueAndClear(); + + NANOCLR_CHECK_HRESULT( + g_CLR_RT_ExecutionEngine.NewObjectFromIndex(clrRet, g_CLR_RT_WellKnownTypes.m_EspNowDataSentEvent)); + + dataSentEvent = clrRet.Dereference(); + if (!dataSentEvent) + { + NANOCLR_SET_AND_LEAVE(CLR_E_OUT_OF_MEMORY); + } + + // clrRet.PeerMac + NANOCLR_CHECK_HRESULT(CopyByteArrayToCLRArray( + dataSentEvent[Library_nanoFramework_espnow_native_nanoFramework_Espnow_DataSentEventInternal::FIELD__PeerMac], + sentEventData->peer_mac, + 6)); + + // clrRet.Status + dataSentEvent[Library_nanoFramework_espnow_native_nanoFramework_Espnow_DataSentEventInternal::FIELD__Status] + .SetInteger(sentEventData->status); + + DEBUG_FEXIT(); + + NANOCLR_NOCLEANUP(); +} + +HRESULT +Library_nanoFramework_espnow_native_nanoFramework_Espnow_EspNowController__EspNowEventHandler::ProcessEvent_DataRecv( + CLR_RT_StackFrame &stack) +{ + NANOCLR_HEADER(); + + DEBUG_FENTER(); + + EspNowDataRecvEventData *recvEventData = (EspNowDataRecvEventData *)stack.Arg2().NumericByRef().u4; + CLR_RT_HeapBlock *dataRecvEvent; + + // create nanoFramework.Espnow.EspNowController.DataRecvEventInternal instance to return + CLR_RT_HeapBlock &clrRet = stack.PushValue(); + NANOCLR_CHECK_HRESULT( + g_CLR_RT_ExecutionEngine.NewObjectFromIndex(clrRet, g_CLR_RT_WellKnownTypes.m_EspNowDataRecvEvent)); + + dataRecvEvent = clrRet.Dereference(); + if (!dataRecvEvent) + { + NANOCLR_SET_AND_LEAVE(CLR_E_OUT_OF_MEMORY); + } + + // clrRet.PeerMac + NANOCLR_CHECK_HRESULT(CopyByteArrayToCLRArray( + dataRecvEvent[Library_nanoFramework_espnow_native_nanoFramework_Espnow_DataRecvEventInternal::FIELD__PeerMac], + recvEventData->peer_mac, + 6)); + + // clrRet.Data + NANOCLR_CHECK_HRESULT(CopyByteArrayToCLRArray( + dataRecvEvent[Library_nanoFramework_espnow_native_nanoFramework_Espnow_DataRecvEventInternal::FIELD__Data], + recvEventData->data, + recvEventData->dataLen)); + + // clrRet.DataLen + dataRecvEvent[Library_nanoFramework_espnow_native_nanoFramework_Espnow_DataRecvEventInternal::FIELD__DataLen] + .SetInteger(recvEventData->dataLen); + + DEBUG_FEXIT(); + + NANOCLR_NOCLEANUP(); +} + +HRESULT +Library_nanoFramework_espnow_native_nanoFramework_Espnow_EspNowController__EspNowEventHandler:: + ProcessEvent___nanoFrameworkRuntimeEventsBaseEvent__U4__U4__SystemDateTime(CLR_RT_StackFrame &stack) +{ + NANOCLR_HEADER(); + + DEBUG_FENTER(); + + CLR_UINT32 data1 = stack.Arg1().NumericByRef().u4; + CLR_UINT32 subEvent = data1 >> 16; + + DEBUG_WRITELINE("subevent: %d", subEvent); + + switch (subEvent) + { + case EVENT_ESPNOW_DATASENT: + hr = ProcessEvent_DataSent(stack); + break; + case EVENT_ESPNOW_DATARECV: + hr = ProcessEvent_DataRecv(stack); + break; + default: + NANOCLR_SET_AND_LEAVE(stack.NotImplementedStub()); + } + + if (FAILED(hr)) + { + DEBUG_WRITELINE("failed hr: %x", hr); + } + + DEBUG_FEXIT(); + + NANOCLR_NOCLEANUP(); +}