From 338a44521f9bc8fecbdb47672692784f0ea5dd90 Mon Sep 17 00:00:00 2001 From: Marcin Torba Date: Tue, 23 Jun 2026 22:41:03 +0200 Subject: [PATCH 1/8] ESPNOW initial --- CMake/Modules/FindNF_NativeAssemblies.cmake | 11 +- CMake/Modules/FindnanoFramework.Espnow.cmake | 43 ++++ CMake/Modules/NF_Kconfig.cmake | 1 + Kconfig.apis | 5 + src/CLR/Core/TypeSystem.cpp | 2 + src/CLR/Include/nanoCLR_Runtime.h | 2 + src/HAL/Include/nanoHAL_v2.h | 1 + .../nanoFramework_espnow_native.cpp | 55 +++++ .../nanoFramework_espnow_native.h | 152 ++++++++++++++ ..._nanoFramework_Espnow_EspNowController.cpp | 192 ++++++++++++++++++ ...w_EspNowController__EspNowEventHandler.cpp | 164 +++++++++++++++ targets/ESP32/defconfig/AtomS3_defconfig | 2 +- .../ESP32/defconfig/ESP32_BLE_REV0_defconfig | 2 +- .../ESP32/defconfig/ESP32_BLE_REV3_defconfig | 2 +- .../ESP32/defconfig/ESP32_C3_BETA_defconfig | 4 +- targets/ESP32/defconfig/ESP32_C3_defconfig | 4 +- .../ESP32/defconfig/ESP32_C5_THREAD_defconfig | 4 +- targets/ESP32/defconfig/ESP32_C61_defconfig | 4 +- .../ESP32/defconfig/ESP32_C6_THREAD_defconfig | 4 +- .../ESP32_ETHERNET_KIT_1.2_defconfig | 2 +- .../ESP32_GenericDisplay_REV0_defconfig | 2 +- .../ESP32/defconfig/ESP32_H2_THREAD_defconfig | 4 +- .../ESP32/defconfig/ESP32_LILYGO_defconfig | 2 +- .../defconfig/ESP32_OLIMEX_WROVER_defconfig | 2 +- .../ESP32/defconfig/ESP32_OLIMEX_defconfig | 2 +- .../defconfig/ESP32_P4_REV_LESS3_defconfig | 4 +- targets/ESP32/defconfig/ESP32_P4_defconfig | 4 +- targets/ESP32/defconfig/ESP32_PICO_defconfig | 2 +- ...32_PSRAM_BLE_GenericGraphic_REV3_defconfig | 2 +- .../defconfig/ESP32_PSRAM_REV0_defconfig | 2 +- .../defconfig/ESP32_PSRAM_REV3_IPV6_defconfig | 2 +- .../defconfig/ESP32_PSRAM_REV3_defconfig | 2 +- .../ESP32_PSRAM_XTAL26_REV0_defconfig | 2 +- targets/ESP32/defconfig/ESP32_REV0_defconfig | 2 +- targets/ESP32/defconfig/ESP32_REV3_defconfig | 2 +- targets/ESP32/defconfig/ESP32_S2_defconfig | 2 +- .../ESP32/defconfig/ESP32_S3_OCTAL_defconfig | 2 +- .../ESP32/defconfig/ESP32_S3_QUAD_defconfig | 2 +- .../ESP32/defconfig/ESP32_WESP32_defconfig | 2 +- .../defconfig/ESP32_WT32_ETH01_defconfig | 2 +- .../ESP32/defconfig/ESP_WROVER_KIT_defconfig | 2 +- .../defconfig/LilygoTWatch2020_defconfig | 2 +- .../defconfig/LilygoTWatch2021_defconfig | 2 +- targets/ESP32/defconfig/M5Core2_defconfig | 2 +- targets/ESP32/defconfig/M5Core_defconfig | 2 +- targets/ESP32/defconfig/M5Stack_defconfig | 2 +- .../ESP32/defconfig/M5StickCPlus_defconfig | 4 +- targets/ESP32/defconfig/M5StickC_defconfig | 2 +- 48 files changed, 672 insertions(+), 48 deletions(-) create mode 100644 CMake/Modules/FindnanoFramework.Espnow.cmake create mode 100644 targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.cpp create mode 100644 targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.h create mode 100644 targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native_nanoFramework_Espnow_EspNowController.cpp create mode 100644 targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native_nanoFramework_Espnow_EspNowController__EspNowEventHandler.cpp diff --git a/CMake/Modules/FindNF_NativeAssemblies.cmake b/CMake/Modules/FindNF_NativeAssemblies.cmake index 2d52b64b7b..0700a6521d 100644 --- a/CMake/Modules/FindNF_NativeAssemblies.cmake +++ b/CMake/Modules/FindNF_NativeAssemblies.cmake @@ -1,4 +1,4 @@ -# +# # Copyright (c) .NET Foundation and Contributors # See LICENSE file in the project root for full license information. # @@ -38,6 +38,7 @@ option(API_nanoFramework.System.Security.Cryptography "option for nanoFramewor # 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") option(API_nanoFramework.Networking.Thread "option for nanoFramework.Networking.Thread API") # Stm32 only @@ -252,6 +253,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.Networking.Thread if(API_nanoFramework.Networking.Thread) ##### API name here (doted name) @@ -565,4 +572,4 @@ macro(nf_add_lib_native_assemblies) # add alias add_library("nano::${LIB_NAME}" ALIAS ${LIB_NAME}) -endmacro() +endmacro() \ No newline at end of file diff --git a/CMake/Modules/FindnanoFramework.Espnow.cmake b/CMake/Modules/FindnanoFramework.Espnow.cmake new file mode 100644 index 0000000000..d506635911 --- /dev/null +++ b/CMake/Modules/FindnanoFramework.Espnow.cmake @@ -0,0 +1,43 @@ +# 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 + ) + + if (BUILD_VERBOSE) + message("${SRC_FILE} >> ${nanoFramework.EspNow_SRC_FILE}") + endif() + + 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/CMake/Modules/NF_Kconfig.cmake b/CMake/Modules/NF_Kconfig.cmake index 1183cbba72..3a99d21468 100644 --- a/CMake/Modules/NF_Kconfig.cmake +++ b/CMake/Modules/NF_Kconfig.cmake @@ -39,6 +39,7 @@ set(_NF_KCONFIG_API_MAP "API_NANOFRAMEWORK_SYSTEM_TEXT|API_nanoFramework.System.Text" "API_NANOFRAMEWORK_SYSTEM_SECURITY_CRYPTOGRAPHY|API_nanoFramework.System.Security.Cryptography" "API_NANOFRAMEWORK_SYSTEM_IO_HASHING|API_nanoFramework.System.IO.Hashing" + "API_NANOFRAMEWORK_ESPNOW|API_nanoFramework.EspNow" "API_NANOFRAMEWORK_NETWORKING_THREAD|API_nanoFramework.Networking.Thread" # Platform-specific APIs diff --git a/Kconfig.apis b/Kconfig.apis index 39b81eff66..2ab702f361 100644 --- a/Kconfig.apis +++ b/Kconfig.apis @@ -102,6 +102,11 @@ config API_NANOFRAMEWORK_SYSTEM_IO_HASHING bool "nanoFramework.System.IO.Hashing" default n +config API_NANOFRAMEWORK_ESPNOW + bool "nanoFramework.EspNow" + depends on RTOS_ESP32 + default n + config API_NANOFRAMEWORK_NETWORKING_THREAD bool "nanoFramework.Networking.Thread" default n diff --git a/src/CLR/Core/TypeSystem.cpp b/src/CLR/Core/TypeSystem.cpp index 6f686278e1..e03aede846 100644 --- a/src/CLR/Core/TypeSystem.cpp +++ b/src/CLR/Core/TypeSystem.cpp @@ -2859,6 +2859,8 @@ static const TypeIndexLookup c_TypeIndexLookup[] = { TIL("nanoFramework.UI", "Font", m_Font), TIL("nanoFramework.Touch", "TouchEvent", m_TouchEvent), TIL("nanoFramework.Touch", "TouchInput", m_TouchInput), + TIL("nanoFramework.EspNow", "DataSentEventInternal", m_EspNowDataSentEvent), + TIL("nanoFramework.EspNow", "DataRecvEventInternal", m_EspNowDataRecvEvent), TIL("System.Net.NetworkInformation", "NetworkInterface", m_NetworkInterface), TIL("System.Net.NetworkInformation", "Wireless80211Configuration", m_Wireless80211Configuration), diff --git a/src/CLR/Include/nanoCLR_Runtime.h b/src/CLR/Include/nanoCLR_Runtime.h index 89a14a5ef7..f40f5ae440 100644 --- a/src/CLR/Include/nanoCLR_Runtime.h +++ b/src/CLR/Include/nanoCLR_Runtime.h @@ -1581,6 +1581,8 @@ struct CLR_RT_WellKnownTypes CLR_RT_TypeDef_Index m_I2cTransferResult_old; 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 c3a637be4c..705d61e42f 100644 --- a/src/HAL/Include/nanoHAL_v2.h +++ b/src/HAL/Include/nanoHAL_v2.h @@ -115,6 +115,7 @@ typedef enum SLEEP_LEVEL #define EVENT_TOUCH 120 #define EVENT_GESTURE 130 #define EVENT_OPENTHREAD 140 +#define EVENT_ESPNOW 150 #define PAL_EVENT_TOUCH 0x1 #define PAL_EVENT_KEY 0x2 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..dc2bfa88d4 --- /dev/null +++ b/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.cpp @@ -0,0 +1,55 @@ +// Copyright (c) .NET Foundation and Contributors +// See LICENSE file in the project root for full license information. +// + +#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..8401487174 --- /dev/null +++ b/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.h @@ -0,0 +1,152 @@ +// Copyright (c) .NET Foundation and Contributors +// See LICENSE file in the project root for full license information. +// + +//----------------------------------------------------------------------------- +// +// ** 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 wifi_tx_info_t *tx_info, esp_now_send_status_t status); + static void DataRecvCb(const esp_now_recv_info *recv_info, 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..5c4ca603cc --- /dev/null +++ b/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native_nanoFramework_Espnow_EspNowController.cpp @@ -0,0 +1,192 @@ +// Copyright (c) .NET Foundation and Contributors +// See LICENSE file in the project root for full license information. +// + +//----------------------------------------------------------------------------- +// +// ** 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 wifi_tx_info_t *tx_info, + esp_now_send_status_t status) +{ + DEBUG_FENTER(); + + DEBUG_WRITELINE("Sending status:\t%d", status); + + memcpy(dataSentEventData.peer_mac, tx_info->des_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 esp_now_recv_info *recv_info, + const uint8_t *incomingData, + int len) +{ + DEBUG_FENTER(); + + if (len > 0) + { + DEBUG_WRITELINE("Recv %d bytes from[0]:\t%d", len, incomingData[0]); + } + else + { + DEBUG_WRITELINE("Recv %d bytes", len); + } + + memcpy(dataRecvEventData.peer_mac, recv_info->src_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..46d74be235 --- /dev/null +++ b/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native_nanoFramework_Espnow_EspNowController__EspNowEventHandler.cpp @@ -0,0 +1,164 @@ +// Copyright (c) .NET Foundation and Contributors +// See LICENSE file in the project root for full license information. +// + +//----------------------------------------------------------------------------- +// +// ** 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(); +} diff --git a/targets/ESP32/defconfig/AtomS3_defconfig b/targets/ESP32/defconfig/AtomS3_defconfig index cfc780ee92..4d69934912 100644 --- a/targets/ESP32/defconfig/AtomS3_defconfig +++ b/targets/ESP32/defconfig/AtomS3_defconfig @@ -1,6 +1,5 @@ # defconfig for AtomS3 # Auto-generated by preset_to_defconfig.py - CONFIG_API_HARDWARE_ESP32=y CONFIG_API_SYSTEM_DEVICE_ADC=y CONFIG_API_SYSTEM_DEVICE_GPIO=y @@ -14,6 +13,7 @@ CONFIG_API_SYSTEM_IO_FILESYSTEM=y CONFIG_API_SYSTEM_IO_PORTS=y CONFIG_API_SYSTEM_MATH=y CONFIG_API_SYSTEM_NET=y +CONFIG_API_NANOFRAMEWORK_ESPNOW=y # CONFIG_API_NANOFRAMEWORK_DEVICE_BLUETOOTH is not set # CONFIG_API_NANOFRAMEWORK_DEVICE_ONEWIRE is not set # CONFIG_API_NANOFRAMEWORK_GRAPHICS is not set diff --git a/targets/ESP32/defconfig/ESP32_BLE_REV0_defconfig b/targets/ESP32/defconfig/ESP32_BLE_REV0_defconfig index 64cfe91519..a45ed3f4a8 100644 --- a/targets/ESP32/defconfig/ESP32_BLE_REV0_defconfig +++ b/targets/ESP32/defconfig/ESP32_BLE_REV0_defconfig @@ -1,6 +1,5 @@ # defconfig for ESP32_BLE_REV0 # Auto-generated by preset_to_defconfig.py - CONFIG_API_HARDWARE_ESP32=y CONFIG_API_SYSTEM_DEVICE_ADC=y CONFIG_API_SYSTEM_DEVICE_DAC=y @@ -15,6 +14,7 @@ CONFIG_API_SYSTEM_IO_FILESYSTEM=y CONFIG_API_SYSTEM_IO_PORTS=y CONFIG_API_SYSTEM_MATH=y CONFIG_API_SYSTEM_NET=y +CONFIG_API_NANOFRAMEWORK_ESPNOW=y CONFIG_API_NANOFRAMEWORK_DEVICE_BLUETOOTH=y CONFIG_API_NANOFRAMEWORK_DEVICE_ONEWIRE=y CONFIG_API_NANOFRAMEWORK_HARDWARE_ESP32_RMT=y diff --git a/targets/ESP32/defconfig/ESP32_BLE_REV3_defconfig b/targets/ESP32/defconfig/ESP32_BLE_REV3_defconfig index d3ed462bdc..da73e57b82 100644 --- a/targets/ESP32/defconfig/ESP32_BLE_REV3_defconfig +++ b/targets/ESP32/defconfig/ESP32_BLE_REV3_defconfig @@ -1,6 +1,5 @@ # defconfig for ESP32_BLE_REV3 # Auto-generated by preset_to_defconfig.py - CONFIG_API_HARDWARE_ESP32=y CONFIG_API_SYSTEM_DEVICE_ADC=y CONFIG_API_SYSTEM_DEVICE_DAC=y @@ -15,6 +14,7 @@ CONFIG_API_SYSTEM_IO_FILESYSTEM=y CONFIG_API_SYSTEM_IO_PORTS=y CONFIG_API_SYSTEM_MATH=y CONFIG_API_SYSTEM_NET=y +CONFIG_API_NANOFRAMEWORK_ESPNOW=y CONFIG_API_NANOFRAMEWORK_DEVICE_BLUETOOTH=y CONFIG_API_NANOFRAMEWORK_DEVICE_ONEWIRE=y CONFIG_API_NANOFRAMEWORK_HARDWARE_ESP32_RMT=y diff --git a/targets/ESP32/defconfig/ESP32_C3_BETA_defconfig b/targets/ESP32/defconfig/ESP32_C3_BETA_defconfig index 87c4f68dce..9497b64340 100644 --- a/targets/ESP32/defconfig/ESP32_C3_BETA_defconfig +++ b/targets/ESP32/defconfig/ESP32_C3_BETA_defconfig @@ -1,6 +1,5 @@ -# defconfig for ESP32_C3 +# defconfig for ESP32_C3 # Auto-generated by preset_to_defconfig.py - CONFIG_API_HARDWARE_ESP32=y CONFIG_API_SYSTEM_DEVICE_ADC=y # CONFIG_API_SYSTEM_DEVICE_DAC is not set @@ -15,6 +14,7 @@ CONFIG_API_SYSTEM_IO_FILESYSTEM=y CONFIG_API_SYSTEM_IO_PORTS=y CONFIG_API_SYSTEM_MATH=y CONFIG_API_SYSTEM_NET=y +CONFIG_API_NANOFRAMEWORK_ESPNOW=y # CONFIG_API_NANOFRAMEWORK_DEVICE_ONEWIRE is not set CONFIG_API_NANOFRAMEWORK_HARDWARE_ESP32_RMT=y CONFIG_API_NANOFRAMEWORK_RESOURCEMANAGER=y diff --git a/targets/ESP32/defconfig/ESP32_C3_defconfig b/targets/ESP32/defconfig/ESP32_C3_defconfig index 45b7994e05..d7037d703b 100644 --- a/targets/ESP32/defconfig/ESP32_C3_defconfig +++ b/targets/ESP32/defconfig/ESP32_C3_defconfig @@ -1,6 +1,5 @@ -# defconfig for ESP32_C3_REV3 +# defconfig for ESP32_C3_REV3 # Auto-generated by preset_to_defconfig.py - CONFIG_API_HARDWARE_ESP32=y CONFIG_API_SYSTEM_DEVICE_ADC=y # CONFIG_API_SYSTEM_DEVICE_DAC is not set @@ -15,6 +14,7 @@ CONFIG_API_SYSTEM_IO_FILESYSTEM=y CONFIG_API_SYSTEM_IO_PORTS=y CONFIG_API_SYSTEM_MATH=y CONFIG_API_SYSTEM_NET=y +CONFIG_API_NANOFRAMEWORK_ESPNOW=y CONFIG_API_NANOFRAMEWORK_DEVICE_BLUETOOTH=y # CONFIG_API_NANOFRAMEWORK_DEVICE_ONEWIRE is not set CONFIG_API_NANOFRAMEWORK_HARDWARE_ESP32_RMT=y diff --git a/targets/ESP32/defconfig/ESP32_C5_THREAD_defconfig b/targets/ESP32/defconfig/ESP32_C5_THREAD_defconfig index d50e78b3bd..c8ad93c010 100644 --- a/targets/ESP32/defconfig/ESP32_C5_THREAD_defconfig +++ b/targets/ESP32/defconfig/ESP32_C5_THREAD_defconfig @@ -1,6 +1,5 @@ -# defconfig for ESP32_C5_UART +# defconfig for ESP32_C5_UART # Auto-generated by preset_to_defconfig.py - CONFIG_API_HARDWARE_ESP32=y # CONFIG_API_SYSTEM_DEVICE_ADC is not set CONFIG_API_SYSTEM_DEVICE_GPIO=y @@ -14,6 +13,7 @@ CONFIG_API_SYSTEM_IO_FILESYSTEM=y CONFIG_API_SYSTEM_IO_PORTS=y CONFIG_API_SYSTEM_MATH=y CONFIG_API_SYSTEM_NET=y +CONFIG_API_NANOFRAMEWORK_ESPNOW=y CONFIG_API_NANOFRAMEWORK_DEVICE_BLUETOOTH=y # CONFIG_API_NANOFRAMEWORK_DEVICE_ONEWIRE is not set CONFIG_API_NANOFRAMEWORK_GRAPHICS=y diff --git a/targets/ESP32/defconfig/ESP32_C61_defconfig b/targets/ESP32/defconfig/ESP32_C61_defconfig index 020c693cda..7a5830952e 100644 --- a/targets/ESP32/defconfig/ESP32_C61_defconfig +++ b/targets/ESP32/defconfig/ESP32_C61_defconfig @@ -1,6 +1,5 @@ -# defconfig for ESP32_C61 +# defconfig for ESP32_C61 # Auto-generated by preset_to_defconfig.py - CONFIG_API_HARDWARE_ESP32=y CONFIG_API_SYSTEM_DEVICE_ADC=y CONFIG_API_SYSTEM_DEVICE_GPIO=y @@ -14,6 +13,7 @@ CONFIG_API_SYSTEM_IO_FILESYSTEM=y CONFIG_API_SYSTEM_IO_PORTS=y CONFIG_API_SYSTEM_MATH=y CONFIG_API_SYSTEM_NET=y +CONFIG_API_NANOFRAMEWORK_ESPNOW=y CONFIG_API_NANOFRAMEWORK_DEVICE_BLUETOOTH=y # CONFIG_API_NANOFRAMEWORK_DEVICE_ONEWIRE is not set CONFIG_API_NANOFRAMEWORK_GRAPHICS=y diff --git a/targets/ESP32/defconfig/ESP32_C6_THREAD_defconfig b/targets/ESP32/defconfig/ESP32_C6_THREAD_defconfig index d463e6bfc8..986236a914 100644 --- a/targets/ESP32/defconfig/ESP32_C6_THREAD_defconfig +++ b/targets/ESP32/defconfig/ESP32_C6_THREAD_defconfig @@ -1,6 +1,5 @@ -# defconfig for ESP32_C6_THREAD +# defconfig for ESP32_C6_THREAD # Auto-generated by preset_to_defconfig.py - CONFIG_API_HARDWARE_ESP32=y CONFIG_API_SYSTEM_DEVICE_ADC=y CONFIG_API_SYSTEM_DEVICE_GPIO=y @@ -14,6 +13,7 @@ CONFIG_API_SYSTEM_IO_FILESYSTEM=y CONFIG_API_SYSTEM_IO_PORTS=y CONFIG_API_SYSTEM_MATH=y CONFIG_API_SYSTEM_NET=y +CONFIG_API_NANOFRAMEWORK_ESPNOW=y CONFIG_API_NANOFRAMEWORK_DEVICE_BLUETOOTH=y # CONFIG_API_NANOFRAMEWORK_DEVICE_ONEWIRE is not set CONFIG_API_NANOFRAMEWORK_GRAPHICS=y diff --git a/targets/ESP32/defconfig/ESP32_ETHERNET_KIT_1.2_defconfig b/targets/ESP32/defconfig/ESP32_ETHERNET_KIT_1.2_defconfig index cd17dbe90c..a4766a2d86 100644 --- a/targets/ESP32/defconfig/ESP32_ETHERNET_KIT_1.2_defconfig +++ b/targets/ESP32/defconfig/ESP32_ETHERNET_KIT_1.2_defconfig @@ -1,6 +1,5 @@ # defconfig for ESP32_ETHERNET_KIT_1.2 # Auto-generated by preset_to_defconfig.py - CONFIG_API_HARDWARE_ESP32=y CONFIG_API_SYSTEM_DEVICE_ADC=y CONFIG_API_SYSTEM_DEVICE_DAC=y @@ -15,6 +14,7 @@ CONFIG_API_SYSTEM_IO_FILESYSTEM=y CONFIG_API_SYSTEM_IO_PORTS=y CONFIG_API_SYSTEM_MATH=y CONFIG_API_SYSTEM_NET=y +CONFIG_API_NANOFRAMEWORK_ESPNOW=y CONFIG_API_NANOFRAMEWORK_DEVICE_BLUETOOTH=y CONFIG_API_NANOFRAMEWORK_DEVICE_ONEWIRE=y CONFIG_API_NANOFRAMEWORK_HARDWARE_ESP32_RMT=y diff --git a/targets/ESP32/defconfig/ESP32_GenericDisplay_REV0_defconfig b/targets/ESP32/defconfig/ESP32_GenericDisplay_REV0_defconfig index b1ab46a7a9..d34087a653 100644 --- a/targets/ESP32/defconfig/ESP32_GenericDisplay_REV0_defconfig +++ b/targets/ESP32/defconfig/ESP32_GenericDisplay_REV0_defconfig @@ -1,6 +1,5 @@ # defconfig for ESP32_GenericDisplay_REV0 # Auto-generated by preset_to_defconfig.py - CONFIG_API_HARDWARE_ESP32=y CONFIG_API_SYSTEM_DEVICE_ADC=y CONFIG_API_SYSTEM_DEVICE_DAC=y @@ -15,6 +14,7 @@ CONFIG_API_SYSTEM_IO_FILESYSTEM=y CONFIG_API_SYSTEM_IO_PORTS=y CONFIG_API_SYSTEM_MATH=y CONFIG_API_SYSTEM_NET=y +CONFIG_API_NANOFRAMEWORK_ESPNOW=y CONFIG_API_NANOFRAMEWORK_DEVICE_ONEWIRE=y CONFIG_API_NANOFRAMEWORK_GRAPHICS=y CONFIG_API_NANOFRAMEWORK_HARDWARE_ESP32_RMT=y diff --git a/targets/ESP32/defconfig/ESP32_H2_THREAD_defconfig b/targets/ESP32/defconfig/ESP32_H2_THREAD_defconfig index ff3d5b7c4f..9613876acd 100644 --- a/targets/ESP32/defconfig/ESP32_H2_THREAD_defconfig +++ b/targets/ESP32/defconfig/ESP32_H2_THREAD_defconfig @@ -1,6 +1,5 @@ -# defconfig for ESP32_H2_THREAD +# defconfig for ESP32_H2_THREAD # Auto-generated by preset_to_defconfig.py - CONFIG_API_HARDWARE_ESP32=y CONFIG_API_SYSTEM_DEVICE_ADC=y CONFIG_API_SYSTEM_DEVICE_GPIO=y @@ -13,6 +12,7 @@ CONFIG_API_SYSTEM_IO_FILESYSTEM=y CONFIG_API_SYSTEM_IO_PORTS=y CONFIG_API_SYSTEM_MATH=y CONFIG_API_SYSTEM_NET=y +CONFIG_API_NANOFRAMEWORK_ESPNOW=y CONFIG_API_NANOFRAMEWORK_DEVICE_BLUETOOTH=y # CONFIG_API_NANOFRAMEWORK_DEVICE_ONEWIRE is not set CONFIG_API_NANOFRAMEWORK_HARDWARE_ESP32_RMT=y diff --git a/targets/ESP32/defconfig/ESP32_LILYGO_defconfig b/targets/ESP32/defconfig/ESP32_LILYGO_defconfig index 82311bfda0..d189313224 100644 --- a/targets/ESP32/defconfig/ESP32_LILYGO_defconfig +++ b/targets/ESP32/defconfig/ESP32_LILYGO_defconfig @@ -1,6 +1,5 @@ # defconfig for ESP32_LILYGO # Auto-generated by preset_to_defconfig.py - CONFIG_API_HARDWARE_ESP32=y CONFIG_API_SYSTEM_DEVICE_ADC=y CONFIG_API_SYSTEM_DEVICE_DAC=y @@ -15,6 +14,7 @@ CONFIG_API_SYSTEM_IO_FILESYSTEM=y CONFIG_API_SYSTEM_IO_PORTS=y CONFIG_API_SYSTEM_MATH=y CONFIG_API_SYSTEM_NET=y +CONFIG_API_NANOFRAMEWORK_ESPNOW=y CONFIG_API_NANOFRAMEWORK_DEVICE_ONEWIRE=y CONFIG_API_NANOFRAMEWORK_HARDWARE_ESP32_RMT=y CONFIG_API_NANOFRAMEWORK_RESOURCEMANAGER=y diff --git a/targets/ESP32/defconfig/ESP32_OLIMEX_WROVER_defconfig b/targets/ESP32/defconfig/ESP32_OLIMEX_WROVER_defconfig index bc406f353f..161d90e037 100644 --- a/targets/ESP32/defconfig/ESP32_OLIMEX_WROVER_defconfig +++ b/targets/ESP32/defconfig/ESP32_OLIMEX_WROVER_defconfig @@ -1,6 +1,5 @@ # defconfig for ESP32_OLIMEX_WROVER # Auto-generated by preset_to_defconfig.py - CONFIG_API_HARDWARE_ESP32=y CONFIG_API_SYSTEM_DEVICE_ADC=y CONFIG_API_SYSTEM_DEVICE_DAC=y @@ -15,6 +14,7 @@ CONFIG_API_SYSTEM_IO_FILESYSTEM=y CONFIG_API_SYSTEM_IO_PORTS=y CONFIG_API_SYSTEM_MATH=y CONFIG_API_SYSTEM_NET=y +CONFIG_API_NANOFRAMEWORK_ESPNOW=y CONFIG_API_NANOFRAMEWORK_DEVICE_ONEWIRE=y CONFIG_API_NANOFRAMEWORK_HARDWARE_ESP32_RMT=y CONFIG_API_NANOFRAMEWORK_RESOURCEMANAGER=y diff --git a/targets/ESP32/defconfig/ESP32_OLIMEX_defconfig b/targets/ESP32/defconfig/ESP32_OLIMEX_defconfig index 5a76dffe9a..9fd0e4d7ff 100644 --- a/targets/ESP32/defconfig/ESP32_OLIMEX_defconfig +++ b/targets/ESP32/defconfig/ESP32_OLIMEX_defconfig @@ -1,6 +1,5 @@ # defconfig for ESP32_OLIMEX # Auto-generated by preset_to_defconfig.py - CONFIG_API_HARDWARE_ESP32=y CONFIG_API_SYSTEM_DEVICE_ADC=y CONFIG_API_SYSTEM_DEVICE_DAC=y @@ -15,6 +14,7 @@ CONFIG_API_SYSTEM_IO_FILESYSTEM=y CONFIG_API_SYSTEM_IO_PORTS=y CONFIG_API_SYSTEM_MATH=y CONFIG_API_SYSTEM_NET=y +CONFIG_API_NANOFRAMEWORK_ESPNOW=y CONFIG_API_NANOFRAMEWORK_DEVICE_ONEWIRE=y CONFIG_API_NANOFRAMEWORK_HARDWARE_ESP32_RMT=y CONFIG_API_NANOFRAMEWORK_RESOURCEMANAGER=y diff --git a/targets/ESP32/defconfig/ESP32_P4_REV_LESS3_defconfig b/targets/ESP32/defconfig/ESP32_P4_REV_LESS3_defconfig index cad3897691..1b909f383e 100644 --- a/targets/ESP32/defconfig/ESP32_P4_REV_LESS3_defconfig +++ b/targets/ESP32/defconfig/ESP32_P4_REV_LESS3_defconfig @@ -1,6 +1,5 @@ -# defconfig for ESP32_P4_USB_REV_LESS3 +# defconfig for ESP32_P4_USB_REV_LESS3 # Auto-generated by preset_to_defconfig.py - CONFIG_API_HARDWARE_ESP32=y CONFIG_API_SYSTEM_DEVICE_ADC=y CONFIG_API_SYSTEM_DEVICE_GPIO=y @@ -14,6 +13,7 @@ CONFIG_API_SYSTEM_IO_FILESYSTEM=y CONFIG_API_SYSTEM_IO_PORTS=y CONFIG_API_SYSTEM_MATH=y CONFIG_API_SYSTEM_NET=y +CONFIG_API_NANOFRAMEWORK_ESPNOW=y # CONFIG_API_NANOFRAMEWORK_DEVICE_ONEWIRE is not set CONFIG_API_NANOFRAMEWORK_HARDWARE_ESP32_RMT=y CONFIG_API_NANOFRAMEWORK_RESOURCEMANAGER=y diff --git a/targets/ESP32/defconfig/ESP32_P4_defconfig b/targets/ESP32/defconfig/ESP32_P4_defconfig index d2d7302652..13399abdf7 100644 --- a/targets/ESP32/defconfig/ESP32_P4_defconfig +++ b/targets/ESP32/defconfig/ESP32_P4_defconfig @@ -1,6 +1,5 @@ -# defconfig for ESP32_P4_USB +# defconfig for ESP32_P4_USB # Auto-generated by preset_to_defconfig.py - CONFIG_API_HARDWARE_ESP32=y CONFIG_API_SYSTEM_DEVICE_ADC=y CONFIG_API_SYSTEM_DEVICE_GPIO=y @@ -14,6 +13,7 @@ CONFIG_API_SYSTEM_IO_FILESYSTEM=y CONFIG_API_SYSTEM_IO_PORTS=y CONFIG_API_SYSTEM_MATH=y CONFIG_API_SYSTEM_NET=y +CONFIG_API_NANOFRAMEWORK_ESPNOW=y # CONFIG_API_NANOFRAMEWORK_DEVICE_ONEWIRE is not set CONFIG_API_NANOFRAMEWORK_HARDWARE_ESP32_RMT=y CONFIG_API_NANOFRAMEWORK_RESOURCEMANAGER=y diff --git a/targets/ESP32/defconfig/ESP32_PICO_defconfig b/targets/ESP32/defconfig/ESP32_PICO_defconfig index f31ca0fb40..e4ec10f872 100644 --- a/targets/ESP32/defconfig/ESP32_PICO_defconfig +++ b/targets/ESP32/defconfig/ESP32_PICO_defconfig @@ -1,6 +1,5 @@ # defconfig for ESP32_PICO # Auto-generated by preset_to_defconfig.py - CONFIG_API_HARDWARE_ESP32=y CONFIG_API_SYSTEM_DEVICE_ADC=y CONFIG_API_SYSTEM_DEVICE_DAC=y @@ -15,6 +14,7 @@ CONFIG_API_SYSTEM_IO_FILESYSTEM=y CONFIG_API_SYSTEM_IO_PORTS=y CONFIG_API_SYSTEM_MATH=y CONFIG_API_SYSTEM_NET=y +CONFIG_API_NANOFRAMEWORK_ESPNOW=y CONFIG_API_NANOFRAMEWORK_HARDWARE_ESP32_RMT=y CONFIG_API_NANOFRAMEWORK_RESOURCEMANAGER=y CONFIG_API_NANOFRAMEWORK_SYSTEM_COLLECTIONS=y diff --git a/targets/ESP32/defconfig/ESP32_PSRAM_BLE_GenericGraphic_REV3_defconfig b/targets/ESP32/defconfig/ESP32_PSRAM_BLE_GenericGraphic_REV3_defconfig index 44be7f844e..04907a18a1 100644 --- a/targets/ESP32/defconfig/ESP32_PSRAM_BLE_GenericGraphic_REV3_defconfig +++ b/targets/ESP32/defconfig/ESP32_PSRAM_BLE_GenericGraphic_REV3_defconfig @@ -1,6 +1,5 @@ # defconfig for ESP32_PSRAM_BLE_GenericGraphic_REV3 # Auto-generated by preset_to_defconfig.py - CONFIG_API_HARDWARE_ESP32=y CONFIG_API_SYSTEM_DEVICE_ADC=y CONFIG_API_SYSTEM_DEVICE_DAC=y @@ -15,6 +14,7 @@ CONFIG_API_SYSTEM_IO_FILESYSTEM=y CONFIG_API_SYSTEM_IO_PORTS=y CONFIG_API_SYSTEM_MATH=y CONFIG_API_SYSTEM_NET=y +CONFIG_API_NANOFRAMEWORK_ESPNOW=y CONFIG_API_NANOFRAMEWORK_DEVICE_BLUETOOTH=y CONFIG_API_NANOFRAMEWORK_DEVICE_ONEWIRE=y CONFIG_API_NANOFRAMEWORK_GRAPHICS=y diff --git a/targets/ESP32/defconfig/ESP32_PSRAM_REV0_defconfig b/targets/ESP32/defconfig/ESP32_PSRAM_REV0_defconfig index c993e39c25..fb323348d5 100644 --- a/targets/ESP32/defconfig/ESP32_PSRAM_REV0_defconfig +++ b/targets/ESP32/defconfig/ESP32_PSRAM_REV0_defconfig @@ -1,6 +1,5 @@ # defconfig for ESP32_PSRAM_REV0 # Auto-generated by preset_to_defconfig.py - CONFIG_API_HARDWARE_ESP32=y CONFIG_API_SYSTEM_DEVICE_ADC=y CONFIG_API_SYSTEM_DEVICE_DAC=y @@ -15,6 +14,7 @@ CONFIG_API_SYSTEM_IO_FILESYSTEM=y CONFIG_API_SYSTEM_IO_PORTS=y CONFIG_API_SYSTEM_MATH=y CONFIG_API_SYSTEM_NET=y +CONFIG_API_NANOFRAMEWORK_ESPNOW=y CONFIG_API_NANOFRAMEWORK_DEVICE_ONEWIRE=y CONFIG_API_NANOFRAMEWORK_HARDWARE_ESP32_RMT=y CONFIG_API_NANOFRAMEWORK_RESOURCEMANAGER=y diff --git a/targets/ESP32/defconfig/ESP32_PSRAM_REV3_IPV6_defconfig b/targets/ESP32/defconfig/ESP32_PSRAM_REV3_IPV6_defconfig index 0001864f13..ec2d646e76 100644 --- a/targets/ESP32/defconfig/ESP32_PSRAM_REV3_IPV6_defconfig +++ b/targets/ESP32/defconfig/ESP32_PSRAM_REV3_IPV6_defconfig @@ -1,6 +1,5 @@ # defconfig for ESP32_PSRAM_REV3_IPV6 # Auto-generated by preset_to_defconfig.py - CONFIG_API_HARDWARE_ESP32=y CONFIG_API_SYSTEM_DEVICE_ADC=y CONFIG_API_SYSTEM_DEVICE_DAC=y @@ -15,6 +14,7 @@ CONFIG_API_SYSTEM_IO_FILESYSTEM=y CONFIG_API_SYSTEM_IO_PORTS=y CONFIG_API_SYSTEM_MATH=y CONFIG_API_SYSTEM_NET=y +CONFIG_API_NANOFRAMEWORK_ESPNOW=y CONFIG_API_NANOFRAMEWORK_DEVICE_ONEWIRE=y CONFIG_API_NANOFRAMEWORK_GRAPHICS=y CONFIG_API_NANOFRAMEWORK_HARDWARE_ESP32_RMT=y diff --git a/targets/ESP32/defconfig/ESP32_PSRAM_REV3_defconfig b/targets/ESP32/defconfig/ESP32_PSRAM_REV3_defconfig index 32fc1a21a9..8c3e623a8f 100644 --- a/targets/ESP32/defconfig/ESP32_PSRAM_REV3_defconfig +++ b/targets/ESP32/defconfig/ESP32_PSRAM_REV3_defconfig @@ -1,6 +1,5 @@ # defconfig for ESP32_PSRAM_REV3 # Auto-generated by preset_to_defconfig.py - CONFIG_API_HARDWARE_ESP32=y CONFIG_API_SYSTEM_DEVICE_ADC=y CONFIG_API_SYSTEM_DEVICE_DAC=y @@ -15,6 +14,7 @@ CONFIG_API_SYSTEM_IO_FILESYSTEM=y CONFIG_API_SYSTEM_IO_PORTS=y CONFIG_API_SYSTEM_MATH=y CONFIG_API_SYSTEM_NET=y +CONFIG_API_NANOFRAMEWORK_ESPNOW=y CONFIG_API_NANOFRAMEWORK_DEVICE_ONEWIRE=y CONFIG_API_NANOFRAMEWORK_HARDWARE_ESP32_RMT=y CONFIG_API_NANOFRAMEWORK_RESOURCEMANAGER=y diff --git a/targets/ESP32/defconfig/ESP32_PSRAM_XTAL26_REV0_defconfig b/targets/ESP32/defconfig/ESP32_PSRAM_XTAL26_REV0_defconfig index b8af2c7332..1f324e3061 100644 --- a/targets/ESP32/defconfig/ESP32_PSRAM_XTAL26_REV0_defconfig +++ b/targets/ESP32/defconfig/ESP32_PSRAM_XTAL26_REV0_defconfig @@ -1,6 +1,5 @@ # defconfig for ESP32_PSRAM_XTAL26_REV0 # Auto-generated by preset_to_defconfig.py - CONFIG_API_HARDWARE_ESP32=y CONFIG_API_SYSTEM_DEVICE_ADC=y CONFIG_API_SYSTEM_DEVICE_DAC=y @@ -15,6 +14,7 @@ CONFIG_API_SYSTEM_IO_FILESYSTEM=y CONFIG_API_SYSTEM_IO_PORTS=y CONFIG_API_SYSTEM_MATH=y CONFIG_API_SYSTEM_NET=y +CONFIG_API_NANOFRAMEWORK_ESPNOW=y CONFIG_API_NANOFRAMEWORK_DEVICE_ONEWIRE=y CONFIG_API_NANOFRAMEWORK_HARDWARE_ESP32_RMT=y CONFIG_API_NANOFRAMEWORK_RESOURCEMANAGER=y diff --git a/targets/ESP32/defconfig/ESP32_REV0_defconfig b/targets/ESP32/defconfig/ESP32_REV0_defconfig index 3e721db0ca..837ccb2d1f 100644 --- a/targets/ESP32/defconfig/ESP32_REV0_defconfig +++ b/targets/ESP32/defconfig/ESP32_REV0_defconfig @@ -1,6 +1,5 @@ # defconfig for ESP32_REV0 # Auto-generated by preset_to_defconfig.py - CONFIG_API_HARDWARE_ESP32=y CONFIG_API_SYSTEM_DEVICE_ADC=y CONFIG_API_SYSTEM_DEVICE_DAC=y @@ -15,6 +14,7 @@ CONFIG_API_SYSTEM_IO_FILESYSTEM=y CONFIG_API_SYSTEM_IO_PORTS=y CONFIG_API_SYSTEM_MATH=y CONFIG_API_SYSTEM_NET=y +CONFIG_API_NANOFRAMEWORK_ESPNOW=y CONFIG_API_NANOFRAMEWORK_DEVICE_ONEWIRE=y CONFIG_API_NANOFRAMEWORK_HARDWARE_ESP32_RMT=y CONFIG_API_NANOFRAMEWORK_RESOURCEMANAGER=y diff --git a/targets/ESP32/defconfig/ESP32_REV3_defconfig b/targets/ESP32/defconfig/ESP32_REV3_defconfig index da319601fa..0c6973f822 100644 --- a/targets/ESP32/defconfig/ESP32_REV3_defconfig +++ b/targets/ESP32/defconfig/ESP32_REV3_defconfig @@ -1,6 +1,5 @@ # defconfig for ESP32_REV3 # Auto-generated by preset_to_defconfig.py - CONFIG_API_HARDWARE_ESP32=y CONFIG_API_SYSTEM_DEVICE_ADC=y CONFIG_API_SYSTEM_DEVICE_DAC=y @@ -15,6 +14,7 @@ CONFIG_API_SYSTEM_IO_FILESYSTEM=y CONFIG_API_SYSTEM_IO_PORTS=y CONFIG_API_SYSTEM_MATH=y CONFIG_API_SYSTEM_NET=y +CONFIG_API_NANOFRAMEWORK_ESPNOW=y CONFIG_API_NANOFRAMEWORK_DEVICE_ONEWIRE=y CONFIG_API_NANOFRAMEWORK_HARDWARE_ESP32_RMT=y CONFIG_API_NANOFRAMEWORK_RESOURCEMANAGER=y diff --git a/targets/ESP32/defconfig/ESP32_S2_defconfig b/targets/ESP32/defconfig/ESP32_S2_defconfig index ae62b9959e..08866d21d5 100644 --- a/targets/ESP32/defconfig/ESP32_S2_defconfig +++ b/targets/ESP32/defconfig/ESP32_S2_defconfig @@ -1,6 +1,5 @@ # defconfig for ESP32_S2_USB # Auto-generated by preset_to_defconfig.py - CONFIG_API_HARDWARE_ESP32=y CONFIG_API_SYSTEM_DEVICE_ADC=y CONFIG_API_SYSTEM_DEVICE_DAC=y @@ -15,6 +14,7 @@ CONFIG_API_SYSTEM_IO_FILESYSTEM=y CONFIG_API_SYSTEM_IO_PORTS=y CONFIG_API_SYSTEM_MATH=y CONFIG_API_SYSTEM_NET=y +CONFIG_API_NANOFRAMEWORK_ESPNOW=y # CONFIG_API_NANOFRAMEWORK_DEVICE_ONEWIRE is not set CONFIG_API_NANOFRAMEWORK_GRAPHICS=y CONFIG_API_NANOFRAMEWORK_HARDWARE_ESP32_RMT=y diff --git a/targets/ESP32/defconfig/ESP32_S3_OCTAL_defconfig b/targets/ESP32/defconfig/ESP32_S3_OCTAL_defconfig index d365d406aa..b75a96ed07 100644 --- a/targets/ESP32/defconfig/ESP32_S3_OCTAL_defconfig +++ b/targets/ESP32/defconfig/ESP32_S3_OCTAL_defconfig @@ -1,6 +1,5 @@ # defconfig for ESP32_S3_ALL # Auto-generated by preset_to_defconfig.py - CONFIG_API_HARDWARE_ESP32=y CONFIG_API_SYSTEM_DEVICE_ADC=y CONFIG_API_SYSTEM_DEVICE_GPIO=y @@ -14,6 +13,7 @@ CONFIG_API_SYSTEM_IO_FILESYSTEM=y CONFIG_API_SYSTEM_IO_PORTS=y CONFIG_API_SYSTEM_MATH=y CONFIG_API_SYSTEM_NET=y +CONFIG_API_NANOFRAMEWORK_ESPNOW=y CONFIG_API_NANOFRAMEWORK_DEVICE_BLUETOOTH=y CONFIG_API_NANOFRAMEWORK_DEVICE_ONEWIRE=y CONFIG_API_NANOFRAMEWORK_GRAPHICS=y diff --git a/targets/ESP32/defconfig/ESP32_S3_QUAD_defconfig b/targets/ESP32/defconfig/ESP32_S3_QUAD_defconfig index 082badcf6b..d0ce2fca8e 100644 --- a/targets/ESP32/defconfig/ESP32_S3_QUAD_defconfig +++ b/targets/ESP32/defconfig/ESP32_S3_QUAD_defconfig @@ -1,6 +1,5 @@ # defconfig for ESP32_S3_BLE # Auto-generated by preset_to_defconfig.py - CONFIG_API_HARDWARE_ESP32=y CONFIG_API_SYSTEM_DEVICE_ADC=y CONFIG_API_SYSTEM_DEVICE_GPIO=y @@ -14,6 +13,7 @@ CONFIG_API_SYSTEM_IO_FILESYSTEM=y CONFIG_API_SYSTEM_IO_PORTS=y CONFIG_API_SYSTEM_MATH=y CONFIG_API_SYSTEM_NET=y +CONFIG_API_NANOFRAMEWORK_ESPNOW=y CONFIG_API_NANOFRAMEWORK_DEVICE_BLUETOOTH=y CONFIG_API_NANOFRAMEWORK_DEVICE_ONEWIRE=y CONFIG_API_NANOFRAMEWORK_GRAPHICS=y diff --git a/targets/ESP32/defconfig/ESP32_WESP32_defconfig b/targets/ESP32/defconfig/ESP32_WESP32_defconfig index c3ad51e3d7..0ad7488408 100644 --- a/targets/ESP32/defconfig/ESP32_WESP32_defconfig +++ b/targets/ESP32/defconfig/ESP32_WESP32_defconfig @@ -1,6 +1,5 @@ # defconfig for ESP32_WESP32 # Auto-generated by preset_to_defconfig.py - CONFIG_API_HARDWARE_ESP32=y CONFIG_API_SYSTEM_DEVICE_ADC=y CONFIG_API_SYSTEM_DEVICE_DAC=y @@ -15,6 +14,7 @@ CONFIG_API_SYSTEM_IO_FILESYSTEM=y CONFIG_API_SYSTEM_IO_PORTS=y CONFIG_API_SYSTEM_MATH=y CONFIG_API_SYSTEM_NET=y +CONFIG_API_NANOFRAMEWORK_ESPNOW=y CONFIG_API_NANOFRAMEWORK_DEVICE_ONEWIRE=y CONFIG_API_NANOFRAMEWORK_HARDWARE_ESP32_RMT=y CONFIG_API_NANOFRAMEWORK_RESOURCEMANAGER=y diff --git a/targets/ESP32/defconfig/ESP32_WT32_ETH01_defconfig b/targets/ESP32/defconfig/ESP32_WT32_ETH01_defconfig index d8bd139eaa..ab71f4c9f3 100644 --- a/targets/ESP32/defconfig/ESP32_WT32_ETH01_defconfig +++ b/targets/ESP32/defconfig/ESP32_WT32_ETH01_defconfig @@ -1,6 +1,5 @@ # defconfig for ESP32_WT32_ETH01 # Auto-generated by preset_to_defconfig.py - CONFIG_API_HARDWARE_ESP32=y CONFIG_API_SYSTEM_DEVICE_ADC=y CONFIG_API_SYSTEM_DEVICE_DAC=y @@ -15,6 +14,7 @@ CONFIG_API_SYSTEM_IO_FILESYSTEM=y CONFIG_API_SYSTEM_IO_PORTS=y CONFIG_API_SYSTEM_MATH=y CONFIG_API_SYSTEM_NET=y +CONFIG_API_NANOFRAMEWORK_ESPNOW=y CONFIG_API_NANOFRAMEWORK_DEVICE_ONEWIRE=y CONFIG_API_NANOFRAMEWORK_HARDWARE_ESP32_RMT=y CONFIG_API_NANOFRAMEWORK_RESOURCEMANAGER=y diff --git a/targets/ESP32/defconfig/ESP_WROVER_KIT_defconfig b/targets/ESP32/defconfig/ESP_WROVER_KIT_defconfig index d0fbd7474d..268beca93b 100644 --- a/targets/ESP32/defconfig/ESP_WROVER_KIT_defconfig +++ b/targets/ESP32/defconfig/ESP_WROVER_KIT_defconfig @@ -1,6 +1,5 @@ # defconfig for ESP_WROVER_KIT # Auto-generated by preset_to_defconfig.py - CONFIG_API_HARDWARE_ESP32=y CONFIG_API_SYSTEM_DEVICE_ADC=y CONFIG_API_SYSTEM_DEVICE_DAC=y @@ -15,6 +14,7 @@ CONFIG_API_SYSTEM_IO_FILESYSTEM=y CONFIG_API_SYSTEM_IO_PORTS=y CONFIG_API_SYSTEM_MATH=y CONFIG_API_SYSTEM_NET=y +CONFIG_API_NANOFRAMEWORK_ESPNOW=y CONFIG_API_NANOFRAMEWORK_DEVICE_ONEWIRE=y CONFIG_API_NANOFRAMEWORK_GRAPHICS=y CONFIG_API_NANOFRAMEWORK_HARDWARE_ESP32_RMT=y diff --git a/targets/ESP32/defconfig/LilygoTWatch2020_defconfig b/targets/ESP32/defconfig/LilygoTWatch2020_defconfig index a47040b234..523fd94025 100644 --- a/targets/ESP32/defconfig/LilygoTWatch2020_defconfig +++ b/targets/ESP32/defconfig/LilygoTWatch2020_defconfig @@ -1,6 +1,5 @@ # defconfig for LilygoTWatch2020 # Auto-generated by preset_to_defconfig.py - CONFIG_API_HARDWARE_ESP32=y CONFIG_API_SYSTEM_DEVICE_ADC=y CONFIG_API_SYSTEM_DEVICE_DAC=y @@ -15,6 +14,7 @@ CONFIG_API_SYSTEM_IO_FILESYSTEM=y CONFIG_API_SYSTEM_IO_PORTS=y CONFIG_API_SYSTEM_MATH=y CONFIG_API_SYSTEM_NET=y +CONFIG_API_NANOFRAMEWORK_ESPNOW=y CONFIG_API_NANOFRAMEWORK_DEVICE_ONEWIRE=y CONFIG_API_NANOFRAMEWORK_GRAPHICS=y CONFIG_API_NANOFRAMEWORK_HARDWARE_ESP32_RMT=y diff --git a/targets/ESP32/defconfig/LilygoTWatch2021_defconfig b/targets/ESP32/defconfig/LilygoTWatch2021_defconfig index 161576b6e1..c4914ae3bc 100644 --- a/targets/ESP32/defconfig/LilygoTWatch2021_defconfig +++ b/targets/ESP32/defconfig/LilygoTWatch2021_defconfig @@ -1,6 +1,5 @@ # defconfig for LilygoTWatch2021 # Auto-generated by preset_to_defconfig.py - CONFIG_API_HARDWARE_ESP32=y CONFIG_API_SYSTEM_DEVICE_ADC=y CONFIG_API_SYSTEM_DEVICE_DAC=y @@ -15,6 +14,7 @@ CONFIG_API_SYSTEM_DEVICE_WIFI=y CONFIG_API_SYSTEM_IO_PORTS=y CONFIG_API_SYSTEM_MATH=y CONFIG_API_SYSTEM_NET=y +CONFIG_API_NANOFRAMEWORK_ESPNOW=y CONFIG_API_NANOFRAMEWORK_DEVICE_BLUETOOTH=y # CONFIG_API_NANOFRAMEWORK_DEVICE_ONEWIRE is not set CONFIG_API_NANOFRAMEWORK_GRAPHICS=y diff --git a/targets/ESP32/defconfig/M5Core2_defconfig b/targets/ESP32/defconfig/M5Core2_defconfig index dcb14f6551..c94ae7bbc9 100644 --- a/targets/ESP32/defconfig/M5Core2_defconfig +++ b/targets/ESP32/defconfig/M5Core2_defconfig @@ -1,6 +1,5 @@ # defconfig for M5Core2 # Auto-generated by preset_to_defconfig.py - CONFIG_API_HARDWARE_ESP32=y CONFIG_API_SYSTEM_DEVICE_ADC=y CONFIG_API_SYSTEM_DEVICE_DAC=y @@ -15,6 +14,7 @@ CONFIG_API_SYSTEM_IO_FILESYSTEM=y CONFIG_API_SYSTEM_IO_PORTS=y CONFIG_API_SYSTEM_MATH=y CONFIG_API_SYSTEM_NET=y +CONFIG_API_NANOFRAMEWORK_ESPNOW=y CONFIG_API_NANOFRAMEWORK_DEVICE_BLUETOOTH=y CONFIG_API_NANOFRAMEWORK_DEVICE_ONEWIRE=y CONFIG_API_NANOFRAMEWORK_GRAPHICS=y diff --git a/targets/ESP32/defconfig/M5Core_defconfig b/targets/ESP32/defconfig/M5Core_defconfig index 0718912a8c..5a83ba28fa 100644 --- a/targets/ESP32/defconfig/M5Core_defconfig +++ b/targets/ESP32/defconfig/M5Core_defconfig @@ -1,6 +1,5 @@ # defconfig for M5Core # Auto-generated by preset_to_defconfig.py - CONFIG_API_HARDWARE_ESP32=y CONFIG_API_SYSTEM_DEVICE_ADC=y CONFIG_API_SYSTEM_DEVICE_DAC=y @@ -15,6 +14,7 @@ CONFIG_API_SYSTEM_IO_FILESYSTEM=y CONFIG_API_SYSTEM_IO_PORTS=y CONFIG_API_SYSTEM_MATH=y CONFIG_API_SYSTEM_NET=y +CONFIG_API_NANOFRAMEWORK_ESPNOW=y CONFIG_API_NANOFRAMEWORK_DEVICE_ONEWIRE=y CONFIG_API_NANOFRAMEWORK_GRAPHICS=y CONFIG_API_NANOFRAMEWORK_HARDWARE_ESP32_RMT=y diff --git a/targets/ESP32/defconfig/M5Stack_defconfig b/targets/ESP32/defconfig/M5Stack_defconfig index 895a585e42..f81efaa2ad 100644 --- a/targets/ESP32/defconfig/M5Stack_defconfig +++ b/targets/ESP32/defconfig/M5Stack_defconfig @@ -1,6 +1,5 @@ # defconfig for M5Stack # Auto-generated by preset_to_defconfig.py - CONFIG_API_HARDWARE_ESP32=y CONFIG_API_SYSTEM_DEVICE_ADC=y CONFIG_API_SYSTEM_DEVICE_DAC=y @@ -15,6 +14,7 @@ CONFIG_API_SYSTEM_IO_FILESYSTEM=y CONFIG_API_SYSTEM_IO_PORTS=y CONFIG_API_SYSTEM_MATH=y CONFIG_API_SYSTEM_NET=y +CONFIG_API_NANOFRAMEWORK_ESPNOW=y # CONFIG_API_NANOFRAMEWORK_DEVICE_BLUETOOTH is not set CONFIG_API_NANOFRAMEWORK_DEVICE_ONEWIRE=y CONFIG_API_NANOFRAMEWORK_GRAPHICS=y diff --git a/targets/ESP32/defconfig/M5StickCPlus_defconfig b/targets/ESP32/defconfig/M5StickCPlus_defconfig index 5ec043296e..5323595523 100644 --- a/targets/ESP32/defconfig/M5StickCPlus_defconfig +++ b/targets/ESP32/defconfig/M5StickCPlus_defconfig @@ -1,6 +1,5 @@ -# defconfig for M5StickCPlus +# defconfig for M5StickCPlus # Auto-generated by preset_to_defconfig.py - CONFIG_API_HARDWARE_ESP32=y CONFIG_API_SYSTEM_DEVICE_ADC=y CONFIG_API_SYSTEM_DEVICE_DAC=y @@ -15,6 +14,7 @@ CONFIG_API_SYSTEM_IO_FILESYSTEM=y CONFIG_API_SYSTEM_IO_PORTS=y CONFIG_API_SYSTEM_MATH=y CONFIG_API_SYSTEM_NET=y +CONFIG_API_NANOFRAMEWORK_ESPNOW=y CONFIG_API_NANOFRAMEWORK_DEVICE_ONEWIRE=y CONFIG_API_NANOFRAMEWORK_GRAPHICS=y CONFIG_API_NANOFRAMEWORK_HARDWARE_ESP32_RMT=y diff --git a/targets/ESP32/defconfig/M5StickC_defconfig b/targets/ESP32/defconfig/M5StickC_defconfig index 32d2fcd1e7..4be33b6aca 100644 --- a/targets/ESP32/defconfig/M5StickC_defconfig +++ b/targets/ESP32/defconfig/M5StickC_defconfig @@ -1,6 +1,5 @@ # defconfig for M5StickC # Auto-generated by preset_to_defconfig.py - CONFIG_API_HARDWARE_ESP32=y CONFIG_API_SYSTEM_DEVICE_ADC=y CONFIG_API_SYSTEM_DEVICE_DAC=y @@ -15,6 +14,7 @@ CONFIG_API_SYSTEM_IO_FILESYSTEM=y CONFIG_API_SYSTEM_IO_PORTS=y CONFIG_API_SYSTEM_MATH=y CONFIG_API_SYSTEM_NET=y +CONFIG_API_NANOFRAMEWORK_ESPNOW=y CONFIG_API_NANOFRAMEWORK_DEVICE_ONEWIRE=y CONFIG_API_NANOFRAMEWORK_GRAPHICS=y CONFIG_API_NANOFRAMEWORK_HARDWARE_ESP32_RMT=y From db2741623d71d45b151fda1f6f92f3d3a86e4141 Mon Sep 17 00:00:00 2001 From: Marcin Torba Date: Wed, 24 Jun 2026 23:58:59 +0200 Subject: [PATCH 2/8] Minor error handling --- .../nanoFramework_espnow_native.cpp | 4 +- ..._nanoFramework_Espnow_EspNowController.cpp | 73 +++++++++++-------- 2 files changed, 45 insertions(+), 32 deletions(-) diff --git a/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.cpp b/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.cpp index dc2bfa88d4..e84596d480 100644 --- a/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.cpp +++ b/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.cpp @@ -47,9 +47,9 @@ static const CLR_RT_MethodHandler method_lookup[] = const CLR_RT_NativeAssemblyData g_CLR_AssemblyNative_nanoFramework_EspNow = { "nanoFramework.EspNow", - 0x3C8132ED, + 0xDE541F8F, method_lookup, - { 0, 9, 99, 999 } + { 100, 0, 0, 0 } }; // clang-format on 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 index 5c4ca603cc..f54a4313da 100644 --- 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 @@ -19,6 +19,10 @@ EspNowDataSentEventData Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController::dataSentEventData; EspNowDataRecvEventData Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController::dataRecvEventData; +static const int ESPNOW_ERR_ESPNOW_INIT = 10001; +static const int ESPNOW_ERR_INVALID_PEER = 10002; +static const int ESPNOW_ERR_ADD_PEER = 10003; + void Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController::DataSentCb( const wifi_tx_info_t *tx_info, esp_now_send_status_t status) @@ -69,31 +73,28 @@ HRESULT Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowControlle { NANOCLR_HEADER(); - DEBUG_FENTER(); - esp_err_t ret; - DEBUG_WRITELINE("EspNow init"); - ret = esp_now_init(); - if (ret == ESP_OK) + if (ret != ESP_OK) { + stack.SetResult_I4(ESPNOW_ERR_ESPNOW_INIT); + NANOCLR_NOCLEANUP_NOLABEL(); + } - 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); - } + ret = esp_now_register_recv_cb(DataRecvCb); + if (ret == ESP_OK) + { + ret = esp_now_register_send_cb(DataSentCb); } - DEBUG_FEXIT_RET(ret); + if (ret != ESP_OK) + { + stack.SetResult_I4(ESPNOW_ERR_ESPNOW_INIT); + NANOCLR_NOCLEANUP_NOLABEL(); + } - stack.SetResult_I4((int32_t)ret); + stack.SetResult_I4(0); NANOCLR_NOCLEANUP_NOLABEL(); } @@ -156,20 +157,26 @@ HRESULT Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowControlle { NANOCLR_HEADER(); - DEBUG_FENTER(); - - esp_err_t ret; + CLR_RT_HeapBlock_Array *macArray = stack.Arg1().DereferenceArray(); + if (macArray == NULL) + { + stack.SetResult_I4(ESPNOW_ERR_INVALID_PEER); + NANOCLR_NOCLEANUP_NOLABEL(); + } - CLR_RT_HeapBlock_Array *peerMacArg = stack.Arg1().DereferenceArray(); - char *peerMac = (char *)peerMacArg->GetFirstElement(); + if (macArray->m_numOfElements != ESP_NOW_ETH_ALEN) + { + stack.SetResult_I4(ESPNOW_ERR_INVALID_PEER); + NANOCLR_NOCLEANUP_NOLABEL(); + } - uint8_t channel = (uint8_t)stack.Arg2().NumericByRef().u1; + uint8_t channel = stack.Arg2().NumericByRef().u1; + uint8_t *peerMac = (uint8_t *)macArray->GetFirstElement(); - esp_now_peer_info_t peerInfo; - memset((void *)&peerInfo, 0, sizeof(peerInfo)); + esp_now_peer_info_t peerInfo = {}; memcpy(peerInfo.peer_addr, peerMac, ESP_NOW_ETH_ALEN); - peerInfo.ifidx = WIFI_IF_STA; peerInfo.channel = channel; + peerInfo.ifidx = WIFI_IF_STA; peerInfo.encrypt = false; DEBUG_WRITELINE( @@ -182,11 +189,17 @@ HRESULT Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowControlle peerMac[5], channel); - ret = esp_now_add_peer(&peerInfo); - - DEBUG_FEXIT_RET(ret); + esp_err_t result = esp_now_add_peer(&peerInfo); + if (result != ESP_OK) + { + DEBUG_WRITELINE("esp_now_add_peer failed: %d", result); + stack.SetResult_I4(ESPNOW_ERR_ADD_PEER); + NANOCLR_NOCLEANUP_NOLABEL(); + } - stack.SetResult_I4((int32_t)ret); + stack.SetResult_I4(0); NANOCLR_NOCLEANUP_NOLABEL(); } + + From 62af28beef3d87640eb32e4d61c3f767c1f85bdc Mon Sep 17 00:00:00 2001 From: Marcin Torba Date: Thu, 25 Jun 2026 23:52:02 +0200 Subject: [PATCH 3/8] Add encryption --- .../nanoFramework_espnow_native.cpp | 4 +-- .../nanoFramework_espnow_native.h | 14 +-------- ..._nanoFramework_Espnow_EspNowController.cpp | 29 ++++++++++--------- 3 files changed, 18 insertions(+), 29 deletions(-) diff --git a/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.cpp b/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.cpp index e84596d480..38da42c7ab 100644 --- a/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.cpp +++ b/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.cpp @@ -27,7 +27,7 @@ static const CLR_RT_MethodHandler method_lookup[] = 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, + Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController::NativeEspNowAddPeer___I4__SZARRAY_U1__U1__BOOLEAN__SZARRAY_U1, NULL, NULL, NULL, @@ -47,7 +47,7 @@ static const CLR_RT_MethodHandler method_lookup[] = const CLR_RT_NativeAssemblyData g_CLR_AssemblyNative_nanoFramework_EspNow = { "nanoFramework.EspNow", - 0xDE541F8F, + 0x97B518AA, method_lookup, { 100, 0, 0, 0 } }; diff --git a/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.h b/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.h index 8401487174..2d3ced748a 100644 --- a/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.h +++ b/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.h @@ -2,18 +2,6 @@ // See LICENSE file in the project root for full license information. // -//----------------------------------------------------------------------------- -// -// ** 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_ @@ -117,7 +105,7 @@ struct Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController 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); + NANOCLR_NATIVE_DECLARE(NativeEspNowAddPeer___I4__SZARRAY_U1__U1__BOOLEAN__SZARRAY_U1); //--// static EspNowDataSentEventData dataSentEventData; 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 index f54a4313da..9da51e1f07 100644 --- 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 @@ -2,18 +2,6 @@ // See LICENSE file in the project root for full license information. // -//----------------------------------------------------------------------------- -// -// ** 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; @@ -153,7 +141,7 @@ HRESULT Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowControlle } HRESULT Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController:: - NativeEspNowAddPeer___I4__SZARRAY_U1__U1(CLR_RT_StackFrame &stack) + NativeEspNowAddPeer___I4__SZARRAY_U1__U1__BOOLEAN__SZARRAY_U1(CLR_RT_StackFrame &stack) { NANOCLR_HEADER(); @@ -171,13 +159,26 @@ HRESULT Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowControlle } uint8_t channel = stack.Arg2().NumericByRef().u1; + bool encrypted = stack.Arg3().NumericByRef().u1 != 0; uint8_t *peerMac = (uint8_t *)macArray->GetFirstElement(); esp_now_peer_info_t peerInfo = {}; memcpy(peerInfo.peer_addr, peerMac, ESP_NOW_ETH_ALEN); peerInfo.channel = channel; peerInfo.ifidx = WIFI_IF_STA; - peerInfo.encrypt = false; + peerInfo.encrypt = encrypted; + + if (encrypted) + { + CLR_RT_HeapBlock_Array *localMasterKey = stack.Arg4().DereferenceArray(); + if (localMasterKey == NULL || localMasterKey->m_numOfElements != ESP_NOW_KEY_LEN) + { + stack.SetResult_I4(ESPNOW_ERR_INVALID_PEER); + NANOCLR_NOCLEANUP_NOLABEL(); + } + + memcpy(peerInfo.lmk, localMasterKey->GetFirstElement(), ESP_NOW_KEY_LEN); + } DEBUG_WRITELINE( "add_peer, mac: %x:%x:%x:%x:%x:%x, ch: %d", From 5928ae86dfc1e9bd3b1c445d9e9f6f6accbbafa5 Mon Sep 17 00:00:00 2001 From: Marcin Torba Date: Sun, 28 Jun 2026 17:20:03 +0200 Subject: [PATCH 4/8] Remove debug code/comments --- .../nanoFramework_espnow_native.h | 29 ---------- ..._nanoFramework_Espnow_EspNowController.cpp | 53 ------------------- ...w_EspNowController__EspNowEventHandler.cpp | 37 ------------- .../ESP32/defconfig/ESP32_H2_THREAD_defconfig | 1 - .../defconfig/ESP32_P4_REV_LESS3_defconfig | 1 - targets/ESP32/defconfig/ESP32_P4_defconfig | 1 - 6 files changed, 122 deletions(-) diff --git a/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.h b/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.h index 2d3ced748a..8f4028fed8 100644 --- a/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.h +++ b/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.h @@ -14,35 +14,6 @@ #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 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 index 9da51e1f07..e822321e1b 100644 --- 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 @@ -15,18 +15,10 @@ void Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController:: const wifi_tx_info_t *tx_info, esp_now_send_status_t status) { - DEBUG_FENTER(); - - DEBUG_WRITELINE("Sending status:\t%d", status); - memcpy(dataSentEventData.peer_mac, tx_info->des_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( @@ -34,26 +26,11 @@ void Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController:: const uint8_t *incomingData, int len) { - DEBUG_FENTER(); - - if (len > 0) - { - DEBUG_WRITELINE("Recv %d bytes from[0]:\t%d", len, incomingData[0]); - } - else - { - DEBUG_WRITELINE("Recv %d bytes", len); - } - memcpy(dataRecvEventData.peer_mac, recv_info->src_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( @@ -92,14 +69,10 @@ HRESULT Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowControlle { NANOCLR_HEADER(); - DEBUG_FENTER(); - esp_now_unregister_recv_cb(); esp_now_unregister_send_cb(); esp_now_deinit(); - DEBUG_FEXIT(); - NANOCLR_NOCLEANUP_NOLABEL(); } @@ -108,8 +81,6 @@ HRESULT Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowControlle { NANOCLR_HEADER(); - DEBUG_FENTER(); - esp_err_t ret; CLR_RT_HeapBlock_Array *peerMacArg = stack.Arg1().DereferenceArray(); @@ -120,21 +91,8 @@ HRESULT Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowControlle 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(); @@ -180,20 +138,9 @@ HRESULT Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowControlle memcpy(peerInfo.lmk, localMasterKey->GetFirstElement(), ESP_NOW_KEY_LEN); } - 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); - esp_err_t result = esp_now_add_peer(&peerInfo); if (result != ESP_OK) { - DEBUG_WRITELINE("esp_now_add_peer failed: %d", result); stack.SetResult_I4(ESPNOW_ERR_ADD_PEER); 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 index 46d74be235..d082c5e6ed 100644 --- 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 @@ -2,18 +2,6 @@ // See LICENSE file in the project root for full license information. // -//----------------------------------------------------------------------------- -// -// ** 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 @@ -24,8 +12,6 @@ Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController__EspNo { NANOCLR_HEADER(); - DEBUG_FENTER(); - CLR_UINT8 *firstTargetByte; CLR_RT_HeapBlock_Array *targetArray; @@ -37,13 +23,9 @@ Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController__EspNo 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(); } @@ -53,8 +35,6 @@ Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController__EspNo { NANOCLR_HEADER(); - DEBUG_FENTER(); - EspNowDataSentEventData *sentEventData = (EspNowDataSentEventData *)stack.Arg2().NumericByRef().u4; CLR_RT_HeapBlock *dataSentEvent; @@ -80,8 +60,6 @@ Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController__EspNo dataSentEvent[Library_nanoFramework_EspNow_native_nanoFramework_EspNow_DataSentEventInternal::FIELD__Status] .SetInteger(sentEventData->status); - DEBUG_FEXIT(); - NANOCLR_NOCLEANUP(); } @@ -91,8 +69,6 @@ Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController__EspNo { NANOCLR_HEADER(); - DEBUG_FENTER(); - EspNowDataRecvEventData *recvEventData = (EspNowDataRecvEventData *)stack.Arg2().NumericByRef().u4; CLR_RT_HeapBlock *dataRecvEvent; @@ -123,8 +99,6 @@ Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController__EspNo dataRecvEvent[Library_nanoFramework_EspNow_native_nanoFramework_EspNow_DataRecvEventInternal::FIELD__DataLen] .SetInteger(recvEventData->dataLen); - DEBUG_FEXIT(); - NANOCLR_NOCLEANUP(); } @@ -134,13 +108,9 @@ Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController__EspNo { 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: @@ -153,12 +123,5 @@ Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController__EspNo NANOCLR_SET_AND_LEAVE(stack.NotImplementedStub()); } - if (FAILED(hr)) - { - DEBUG_WRITELINE("failed hr: %x", hr); - } - - DEBUG_FEXIT(); - NANOCLR_NOCLEANUP(); } diff --git a/targets/ESP32/defconfig/ESP32_H2_THREAD_defconfig b/targets/ESP32/defconfig/ESP32_H2_THREAD_defconfig index 9613876acd..26414f3e48 100644 --- a/targets/ESP32/defconfig/ESP32_H2_THREAD_defconfig +++ b/targets/ESP32/defconfig/ESP32_H2_THREAD_defconfig @@ -12,7 +12,6 @@ CONFIG_API_SYSTEM_IO_FILESYSTEM=y CONFIG_API_SYSTEM_IO_PORTS=y CONFIG_API_SYSTEM_MATH=y CONFIG_API_SYSTEM_NET=y -CONFIG_API_NANOFRAMEWORK_ESPNOW=y CONFIG_API_NANOFRAMEWORK_DEVICE_BLUETOOTH=y # CONFIG_API_NANOFRAMEWORK_DEVICE_ONEWIRE is not set CONFIG_API_NANOFRAMEWORK_HARDWARE_ESP32_RMT=y diff --git a/targets/ESP32/defconfig/ESP32_P4_REV_LESS3_defconfig b/targets/ESP32/defconfig/ESP32_P4_REV_LESS3_defconfig index 1b909f383e..bc41cd2fb9 100644 --- a/targets/ESP32/defconfig/ESP32_P4_REV_LESS3_defconfig +++ b/targets/ESP32/defconfig/ESP32_P4_REV_LESS3_defconfig @@ -13,7 +13,6 @@ CONFIG_API_SYSTEM_IO_FILESYSTEM=y CONFIG_API_SYSTEM_IO_PORTS=y CONFIG_API_SYSTEM_MATH=y CONFIG_API_SYSTEM_NET=y -CONFIG_API_NANOFRAMEWORK_ESPNOW=y # CONFIG_API_NANOFRAMEWORK_DEVICE_ONEWIRE is not set CONFIG_API_NANOFRAMEWORK_HARDWARE_ESP32_RMT=y CONFIG_API_NANOFRAMEWORK_RESOURCEMANAGER=y diff --git a/targets/ESP32/defconfig/ESP32_P4_defconfig b/targets/ESP32/defconfig/ESP32_P4_defconfig index 13399abdf7..beb9f57727 100644 --- a/targets/ESP32/defconfig/ESP32_P4_defconfig +++ b/targets/ESP32/defconfig/ESP32_P4_defconfig @@ -13,7 +13,6 @@ CONFIG_API_SYSTEM_IO_FILESYSTEM=y CONFIG_API_SYSTEM_IO_PORTS=y CONFIG_API_SYSTEM_MATH=y CONFIG_API_SYSTEM_NET=y -CONFIG_API_NANOFRAMEWORK_ESPNOW=y # CONFIG_API_NANOFRAMEWORK_DEVICE_ONEWIRE is not set CONFIG_API_NANOFRAMEWORK_HARDWARE_ESP32_RMT=y CONFIG_API_NANOFRAMEWORK_RESOURCEMANAGER=y From 1436bbfae1a8fdc0bab47ca6dad15aca79c24006 Mon Sep 17 00:00:00 2001 From: Marcin Torba Date: Sun, 28 Jun 2026 19:19:09 +0200 Subject: [PATCH 5/8] PR fixes --- .../nanoFramework_espnow_native.h | 12 ++--- ..._nanoFramework_Espnow_EspNowController.cpp | 53 +++++++++++++++---- ...w_EspNowController__EspNowEventHandler.cpp | 28 ++++++++-- 3 files changed, 69 insertions(+), 24 deletions(-) diff --git a/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.h b/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.h index 8f4028fed8..d6ea8b94b4 100644 --- a/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.h +++ b/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.h @@ -2,8 +2,8 @@ // See LICENSE file in the project root for full license information. // -#ifndef _NANOFRAMEWORK_EspNow_NATIVE_H_ -#define _NANOFRAMEWORK_EspNow_NATIVE_H_ +#ifndef NANOFRAMEWORK_ESPNOW_NATIVE_H +#define NANOFRAMEWORK_ESPNOW_NATIVE_H #include #include @@ -14,9 +14,6 @@ #include #include -#define EVENT_ESPNOW_DATASENT 1 -#define EVENT_ESPNOW_DATARECV 2 - struct EspNowDataSentEventData { uint8_t peer_mac[ESP_NOW_ETH_ALEN]; @@ -79,9 +76,6 @@ struct Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController NANOCLR_NATIVE_DECLARE(NativeEspNowAddPeer___I4__SZARRAY_U1__U1__BOOLEAN__SZARRAY_U1); //--// - static EspNowDataSentEventData dataSentEventData; - static EspNowDataRecvEventData dataRecvEventData; - static void DataSentCb(const wifi_tx_info_t *tx_info, esp_now_send_status_t status); static void DataRecvCb(const esp_now_recv_info *recv_info, const uint8_t *incomingData, int len); }; @@ -108,4 +102,4 @@ struct Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowException extern const CLR_RT_NativeAssemblyData g_CLR_AssemblyNative_nanoFramework_EspNow; -#endif //_NANOFRAMEWORK_EspNow_NATIVE_H_ +#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 index e822321e1b..8e757e5b55 100644 --- 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 @@ -4,9 +4,8 @@ #include "nanoFramework_espnow_native.h" -EspNowDataSentEventData Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController::dataSentEventData; -EspNowDataRecvEventData Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController::dataRecvEventData; - +static const int EVENT_ESPNOW_DATASENT = 1; +static const int EVENT_ESPNOW_DATARECV = 2; static const int ESPNOW_ERR_ESPNOW_INIT = 10001; static const int ESPNOW_ERR_INVALID_PEER = 10002; static const int ESPNOW_ERR_ADD_PEER = 10003; @@ -15,10 +14,16 @@ void Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController:: const wifi_tx_info_t *tx_info, esp_now_send_status_t status) { - memcpy(dataSentEventData.peer_mac, tx_info->des_addr, ESP_NOW_ETH_ALEN); - dataSentEventData.status = status; + EspNowDataSentEventData *dataSentEventData = (EspNowDataSentEventData *)platform_malloc(sizeof(EspNowDataSentEventData)); + if (dataSentEventData == NULL) + { + return; + } - PostManagedEvent(EVENT_ESPNOW, 0, EVENT_ESPNOW_DATASENT, (CLR_UINT32)&dataSentEventData); + memcpy(dataSentEventData->peer_mac, tx_info->des_addr, ESP_NOW_ETH_ALEN); + dataSentEventData->status = status; + + PostManagedEvent(EVENT_ESPNOW, 0, EVENT_ESPNOW_DATASENT, (CLR_UINT32)dataSentEventData); } void Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController::DataRecvCb( @@ -26,11 +31,17 @@ void Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController:: const uint8_t *incomingData, int len) { - memcpy(dataRecvEventData.peer_mac, recv_info->src_addr, ESP_NOW_ETH_ALEN); - memcpy(dataRecvEventData.data, incomingData, len); - dataRecvEventData.dataLen = len; + EspNowDataRecvEventData *dataRecvEventData = (EspNowDataRecvEventData *)platform_malloc(sizeof(EspNowDataRecvEventData)); + if (dataRecvEventData == NULL) + { + return; + } - PostManagedEvent(EVENT_ESPNOW, 0, EVENT_ESPNOW_DATARECV, (CLR_UINT32)&dataRecvEventData); + memcpy(dataRecvEventData->peer_mac, recv_info->src_addr, ESP_NOW_ETH_ALEN); + memcpy(dataRecvEventData->data, incomingData, len); + dataRecvEventData->dataLen = len; + + PostManagedEvent(EVENT_ESPNOW, 0, EVENT_ESPNOW_DATARECV, (CLR_UINT32)dataRecvEventData); } HRESULT Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController::NativeInitialize___I4( @@ -55,6 +66,9 @@ HRESULT Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowControlle if (ret != ESP_OK) { + esp_now_unregister_recv_cb(); + esp_now_unregister_send_cb(); + esp_now_deinit(); stack.SetResult_I4(ESPNOW_ERR_ESPNOW_INIT); NANOCLR_NOCLEANUP_NOLABEL(); } @@ -84,12 +98,29 @@ HRESULT Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowControlle esp_err_t ret; CLR_RT_HeapBlock_Array *peerMacArg = stack.Arg1().DereferenceArray(); + if (peerMacArg == NULL || peerMacArg->m_numOfElements != ESP_NOW_ETH_ALEN) + { + stack.SetResult_I4(ESPNOW_ERR_INVALID_PEER); + NANOCLR_NOCLEANUP_NOLABEL(); + } + char *peerMac = (char *)peerMacArg->GetFirstElement(); CLR_RT_HeapBlock_Array *dataArg = stack.Arg2().DereferenceArray(); - char *data = (char *)dataArg->GetFirstElement(); + if (dataArg == NULL) + { + stack.SetResult_I4(ESPNOW_ERR_INVALID_PEER); + NANOCLR_NOCLEANUP_NOLABEL(); + } int32_t dataLen = stack.Arg3().NumericByRef().s4; + if (dataLen < 0 || dataLen > (int32_t)dataArg->m_numOfElements) + { + stack.SetResult_I4(ESPNOW_ERR_INVALID_PEER); + NANOCLR_NOCLEANUP_NOLABEL(); + } + + char *data = (char *)dataArg->GetFirstElement(); ret = esp_now_send((const uint8_t *)peerMac, (const uint8_t *)data, dataLen); 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 index d082c5e6ed..49718ff8be 100644 --- 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 @@ -4,6 +4,12 @@ #include "nanoFramework_espnow_native.h" +typedef EspNowDataSentEventData DataSentEventData; +typedef EspNowDataRecvEventData DataRecvEventData; + +static const int EVENT_ESPNOW_DATASENT = 1; +static const int EVENT_ESPNOW_DATARECV = 2; + HRESULT Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController__EspNowEventHandler::CopyByteArrayToCLRArray( CLR_RT_HeapBlock &target, @@ -35,7 +41,7 @@ Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController__EspNo { NANOCLR_HEADER(); - EspNowDataSentEventData *sentEventData = (EspNowDataSentEventData *)stack.Arg2().NumericByRef().u4; + DataSentEventData *sentEventData = (DataSentEventData *)stack.Arg2().NumericByRef().u4; CLR_RT_HeapBlock *dataSentEvent; // create nanoFramework.EspNow.EspNowController.DataSentEventInternal instance to return @@ -60,7 +66,14 @@ Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController__EspNo dataSentEvent[Library_nanoFramework_EspNow_native_nanoFramework_EspNow_DataSentEventInternal::FIELD__Status] .SetInteger(sentEventData->status); - NANOCLR_NOCLEANUP(); + NANOCLR_CLEANUP(); + + if (sentEventData != NULL) + { + platform_free(sentEventData); + } + + NANOCLR_CLEANUP_END(); } HRESULT @@ -69,7 +82,7 @@ Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController__EspNo { NANOCLR_HEADER(); - EspNowDataRecvEventData *recvEventData = (EspNowDataRecvEventData *)stack.Arg2().NumericByRef().u4; + DataRecvEventData *recvEventData = (DataRecvEventData *)stack.Arg2().NumericByRef().u4; CLR_RT_HeapBlock *dataRecvEvent; // create nanoFramework.EspNow.EspNowController.DataRecvEventInternal instance to return @@ -99,7 +112,14 @@ Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController__EspNo dataRecvEvent[Library_nanoFramework_EspNow_native_nanoFramework_EspNow_DataRecvEventInternal::FIELD__DataLen] .SetInteger(recvEventData->dataLen); - NANOCLR_NOCLEANUP(); + NANOCLR_CLEANUP(); + + if (recvEventData != NULL) + { + platform_free(recvEventData); + } + + NANOCLR_CLEANUP_END(); } HRESULT From d631e75820bacdcf2fa0ef784615f7247f255cd7 Mon Sep 17 00:00:00 2001 From: Marcin Torba Date: Sun, 28 Jun 2026 19:52:21 +0200 Subject: [PATCH 6/8] Fix checksum --- .../nanoFramework.Espnow/nanoFramework_espnow_native.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.cpp b/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.cpp index 38da42c7ab..3185c79c34 100644 --- a/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.cpp +++ b/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.cpp @@ -47,7 +47,7 @@ static const CLR_RT_MethodHandler method_lookup[] = const CLR_RT_NativeAssemblyData g_CLR_AssemblyNative_nanoFramework_EspNow = { "nanoFramework.EspNow", - 0x97B518AA, + 0xC6C47E7A, method_lookup, { 100, 0, 0, 0 } }; From 2229428e766b60be182f74bf605f0aff258ecd90 Mon Sep 17 00:00:00 2001 From: Marcin Torba Date: Thu, 9 Jul 2026 23:45:43 +0200 Subject: [PATCH 7/8] Fix declarations --- .../nanoFramework_espnow_native.cpp | 6 ++++-- .../nanoFramework_espnow_native.h | 16 +++++++++------- ...pnow_EspNowController__EspNowEventHandler.cpp | 8 ++++---- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.cpp b/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.cpp index 3185c79c34..58dbe859a7 100644 --- a/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.cpp +++ b/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.cpp @@ -39,7 +39,9 @@ static const CLR_RT_MethodHandler method_lookup[] = NULL, NULL, NULL, - Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController__EspNowEventHandler::ProcessEvent___nanoFrameworkRuntimeEventsBaseEvent__U4__U4__SystemDateTime, + NULL, + Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowControllerEventListener::ProcessEvent___nanoFrameworkRuntimeEventsBaseEvent__U4__U4__SystemDateTime, + NULL, NULL, NULL, }; @@ -47,7 +49,7 @@ static const CLR_RT_MethodHandler method_lookup[] = const CLR_RT_NativeAssemblyData g_CLR_AssemblyNative_nanoFramework_EspNow = { "nanoFramework.EspNow", - 0xC6C47E7A, + 0x0D47343A, method_lookup, { 100, 0, 0, 0 } }; diff --git a/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.h b/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.h index d6ea8b94b4..e4f1c28165 100644 --- a/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.h +++ b/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.h @@ -63,12 +63,14 @@ struct Library_nanoFramework_EspNow_native_nanoFramework_EspNow_DataSentEventInt struct Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController { - static const int FIELD_STATIC__BROADCASTMAC = 0; + static const int FIELD_STATIC__s_instance = 0; + static const int FIELD_STATIC__s_syncLock = 1; - static const int FIELD__DataSent = 1; - static const int FIELD__DataReceived = 2; - static const int FIELD__isDisposed = 3; - static const int FIELD__eventHandler = 4; + static const int FIELD___disposed = 1; + static const int FIELD___syncLock = 2; + static const int FIELD___eventHandler = 3; + static const int FIELD__DataSent = 4; + static const int FIELD__DataReceived = 5; NANOCLR_NATIVE_DECLARE(NativeInitialize___I4); NANOCLR_NATIVE_DECLARE(NativeDispose___VOID__BOOLEAN); @@ -80,9 +82,9 @@ struct Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController static void DataRecvCb(const esp_now_recv_info *recv_info, const uint8_t *incomingData, int len); }; -struct Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController__EspNowEventHandler +struct Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowControllerEventListener { - static const int FIELD__controllerInstance = 1; + static const int FIELD___controller = 1; NANOCLR_NATIVE_DECLARE(ProcessEvent___nanoFrameworkRuntimeEventsBaseEvent__U4__U4__SystemDateTime); 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 index 49718ff8be..f4e91a7a0e 100644 --- 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 @@ -11,7 +11,7 @@ static const int EVENT_ESPNOW_DATASENT = 1; static const int EVENT_ESPNOW_DATARECV = 2; HRESULT -Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController__EspNowEventHandler::CopyByteArrayToCLRArray( +Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowControllerEventListener::CopyByteArrayToCLRArray( CLR_RT_HeapBlock &target, uint8_t *src, CLR_UINT32 length) @@ -36,7 +36,7 @@ Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController__EspNo } HRESULT -Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController__EspNowEventHandler::ProcessEvent_DataSent( +Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowControllerEventListener::ProcessEvent_DataSent( CLR_RT_StackFrame &stack) { NANOCLR_HEADER(); @@ -77,7 +77,7 @@ Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController__EspNo } HRESULT -Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController__EspNowEventHandler::ProcessEvent_DataRecv( +Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowControllerEventListener::ProcessEvent_DataRecv( CLR_RT_StackFrame &stack) { NANOCLR_HEADER(); @@ -123,7 +123,7 @@ Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController__EspNo } HRESULT -Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController__EspNowEventHandler:: +Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowControllerEventListener:: ProcessEvent___nanoFrameworkRuntimeEventsBaseEvent__U4__U4__SystemDateTime(CLR_RT_StackFrame &stack) { NANOCLR_HEADER(); From c4c3b8d30ac63aba6b4efe5e4c3f73f641970004 Mon Sep 17 00:00:00 2001 From: Marcin Torba Date: Thu, 23 Jul 2026 14:58:36 +0200 Subject: [PATCH 8/8] Change implementation to internal queue. --- .../nanoFramework_espnow_native.cpp | 41 +--- .../nanoFramework_espnow_native.h | 46 ++-- ..._nanoFramework_Espnow_EspNowController.cpp | 211 +++++++++++++++--- ...w_EspNowController__EspNowEventHandler.cpp | 115 +--------- 4 files changed, 199 insertions(+), 214 deletions(-) diff --git a/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.cpp b/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.cpp index 58dbe859a7..f8e1a5d149 100644 --- a/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.cpp +++ b/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.cpp @@ -1,6 +1,5 @@ // Copyright (c) .NET Foundation and Contributors // See LICENSE file in the project root for full license information. -// #include "nanoFramework_espnow_native.h" @@ -8,48 +7,24 @@ static const CLR_RT_MethodHandler method_lookup[] = { - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, + NULL, NULL, NULL, NULL, 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__BOOLEAN__SZARRAY_U1, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, + Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController::NativeGetMaximumDataLength___I4, + Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController::NativeReadPacket___I4__SZARRAY_U1__SZARRAY_U1__I4, + Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController::NativeGetReceiveOverflowCount___I4, + NULL, NULL, NULL, NULL, Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowControllerEventListener::ProcessEvent___nanoFrameworkRuntimeEventsBaseEvent__U4__U4__SystemDateTime, - NULL, - NULL, - NULL, + NULL, NULL, NULL, }; const CLR_RT_NativeAssemblyData g_CLR_AssemblyNative_nanoFramework_EspNow = { "nanoFramework.EspNow", - 0x0D47343A, + 0xE70CA3CA, method_lookup, { 100, 0, 0, 0 } }; diff --git a/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.h b/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.h index e4f1c28165..1f1da4f294 100644 --- a/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.h +++ b/targets/ESP32/_nanoCLR/nanoFramework.Espnow/nanoFramework_espnow_native.h @@ -14,17 +14,19 @@ #include #include -struct EspNowDataSentEventData -{ - uint8_t peer_mac[ESP_NOW_ETH_ALEN]; - esp_now_send_status_t status; -}; +#ifdef ESP_NOW_MAX_DATA_LEN_V2 +#define NF_ESPNOW_MAX_DATA_LEN ESP_NOW_MAX_DATA_LEN_V2 +#else +#define NF_ESPNOW_MAX_DATA_LEN ESP_NOW_MAX_DATA_LEN +#endif -struct EspNowDataRecvEventData +static constexpr uint32_t NF_ESPNOW_RX_QUEUE_DEPTH = 10; + +struct EspNowPacket { uint8_t peer_mac[ESP_NOW_ETH_ALEN]; - uint8_t data[ESP_NOW_MAX_DATA_LEN]; - int dataLen; + uint8_t data[NF_ESPNOW_MAX_DATA_LEN]; + uint16_t data_len; }; struct Library_nanoFramework_EspNow_native_nanoFramework_EspNow_DataReceivedEventArgs @@ -38,26 +40,6 @@ struct Library_nanoFramework_EspNow_native_nanoFramework_EspNow_DataReceivedEven 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; - //--// }; @@ -69,13 +51,13 @@ struct Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController static const int FIELD___disposed = 1; static const int FIELD___syncLock = 2; static const int FIELD___eventHandler = 3; - static const int FIELD__DataSent = 4; - static const int FIELD__DataReceived = 5; - 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__BOOLEAN__SZARRAY_U1); + NANOCLR_NATIVE_DECLARE(NativeGetMaximumDataLength___I4); + NANOCLR_NATIVE_DECLARE(NativeReadPacket___I4__SZARRAY_U1__SZARRAY_U1__I4); + NANOCLR_NATIVE_DECLARE(NativeGetReceiveOverflowCount___I4); //--// static void DataSentCb(const wifi_tx_info_t *tx_info, esp_now_send_status_t status); @@ -90,8 +72,6 @@ struct Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController //--// - 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); }; 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 index 8e757e5b55..c4b16d3098 100644 --- 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 @@ -1,29 +1,63 @@ // Copyright (c) .NET Foundation and Contributors // See LICENSE file in the project root for full license information. -// #include "nanoFramework_espnow_native.h" -static const int EVENT_ESPNOW_DATASENT = 1; +#include +#include + static const int EVENT_ESPNOW_DATARECV = 2; static const int ESPNOW_ERR_ESPNOW_INIT = 10001; static const int ESPNOW_ERR_INVALID_PEER = 10002; static const int ESPNOW_ERR_ADD_PEER = 10003; +static const int ESPNOW_ERR_RECEIVE_TIMEOUT = 10004; -void Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController::DataSentCb( - const wifi_tx_info_t *tx_info, - esp_now_send_status_t status) +struct EspNowPacketQueue +{ + EspNowPacket packets[NF_ESPNOW_RX_QUEUE_DEPTH]; + uint32_t head; + uint32_t count; + uint32_t overflow_count; + SemaphoreHandle_t mutex; + SemaphoreHandle_t data_available; + uint32_t maximum_data_length; +}; + +static EspNowPacketQueue s_rxQueue = {}; + +static void ResetReceiveQueue(uint32_t maximumDataLength) { - EspNowDataSentEventData *dataSentEventData = (EspNowDataSentEventData *)platform_malloc(sizeof(EspNowDataSentEventData)); - if (dataSentEventData == NULL) + s_rxQueue.head = 0; + s_rxQueue.count = 0; + s_rxQueue.overflow_count = 0; + s_rxQueue.maximum_data_length = maximumDataLength; +} + +static void DisposeReceiveQueue() +{ + if (s_rxQueue.data_available != NULL) { - return; + vSemaphoreDelete(s_rxQueue.data_available); + s_rxQueue.data_available = NULL; } - memcpy(dataSentEventData->peer_mac, tx_info->des_addr, ESP_NOW_ETH_ALEN); - dataSentEventData->status = status; + if (s_rxQueue.mutex != NULL) + { + vSemaphoreDelete(s_rxQueue.mutex); + s_rxQueue.mutex = NULL; + } - PostManagedEvent(EVENT_ESPNOW, 0, EVENT_ESPNOW_DATASENT, (CLR_UINT32)dataSentEventData); + ResetReceiveQueue(0); +} + +void Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController::DataSentCb( + const wifi_tx_info_t *tx_info, + esp_now_send_status_t status) +{ + // ESP-NOW delivery confirmation remains a native callback only. Send() + // reports the result of esp_now_send() submission synchronously. + (void)tx_info; + (void)status; } void Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController::DataRecvCb( @@ -31,17 +65,39 @@ void Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController:: const uint8_t *incomingData, int len) { - EspNowDataRecvEventData *dataRecvEventData = (EspNowDataRecvEventData *)platform_malloc(sizeof(EspNowDataRecvEventData)); - if (dataRecvEventData == NULL) + if (recv_info == NULL || incomingData == NULL || len < 0 || len > (int)NF_ESPNOW_MAX_DATA_LEN + || s_rxQueue.mutex == NULL) + { + return; + } + + if (xSemaphoreTake(s_rxQueue.mutex, 0) != pdTRUE) { + s_rxQueue.overflow_count++; return; } - memcpy(dataRecvEventData->peer_mac, recv_info->src_addr, ESP_NOW_ETH_ALEN); - memcpy(dataRecvEventData->data, incomingData, len); - dataRecvEventData->dataLen = len; + if (s_rxQueue.count == NF_ESPNOW_RX_QUEUE_DEPTH) + { + // head points to the oldest packet, so overwrite it and advance head. + s_rxQueue.head = (s_rxQueue.head + 1) % NF_ESPNOW_RX_QUEUE_DEPTH; + s_rxQueue.count--; + s_rxQueue.overflow_count++; + } + + uint32_t writeIndex = (s_rxQueue.head + s_rxQueue.count) % NF_ESPNOW_RX_QUEUE_DEPTH; + EspNowPacket &packet = s_rxQueue.packets[writeIndex]; + memcpy(packet.peer_mac, recv_info->src_addr, ESP_NOW_ETH_ALEN); + memcpy(packet.data, incomingData, len); + packet.data_len = (uint16_t)len; + s_rxQueue.count++; - PostManagedEvent(EVENT_ESPNOW, 0, EVENT_ESPNOW_DATARECV, (CLR_UINT32)dataRecvEventData); + xSemaphoreGive(s_rxQueue.mutex); + xSemaphoreGive(s_rxQueue.data_available); + + // Only signal that data is available. The packet itself is read through + // NativeReadPacket by managed code. + PostManagedEvent(EVENT_ESPNOW, 0, EVENT_ESPNOW_DATARECV, 0); } HRESULT Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController::NativeInitialize___I4( @@ -49,15 +105,41 @@ HRESULT Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowControlle { NANOCLR_HEADER(); - esp_err_t ret; + esp_err_t ret = esp_now_init(); + if (ret != ESP_OK) + { + stack.SetResult_I4(ESPNOW_ERR_ESPNOW_INIT); + NANOCLR_NOCLEANUP_NOLABEL(); + } - ret = esp_now_init(); + uint32_t espNowVersion = 1; + ret = esp_now_get_version(&espNowVersion); if (ret != ESP_OK) { + esp_now_deinit(); stack.SetResult_I4(ESPNOW_ERR_ESPNOW_INIT); NANOCLR_NOCLEANUP_NOLABEL(); } + uint32_t maximumDataLength = ESP_NOW_MAX_DATA_LEN; +#ifdef ESP_NOW_MAX_DATA_LEN_V2 + if (espNowVersion >= 2) + { + maximumDataLength = ESP_NOW_MAX_DATA_LEN_V2; + } +#endif + + s_rxQueue.mutex = xSemaphoreCreateMutex(); + s_rxQueue.data_available = xSemaphoreCreateBinary(); + if (s_rxQueue.mutex == NULL || s_rxQueue.data_available == NULL) + { + DisposeReceiveQueue(); + esp_now_deinit(); + stack.SetResult_I4(ESPNOW_ERR_ESPNOW_INIT); + NANOCLR_NOCLEANUP_NOLABEL(); + } + ResetReceiveQueue(maximumDataLength); + ret = esp_now_register_recv_cb(DataRecvCb); if (ret == ESP_OK) { @@ -68,13 +150,13 @@ HRESULT Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowControlle { esp_now_unregister_recv_cb(); esp_now_unregister_send_cb(); + DisposeReceiveQueue(); esp_now_deinit(); stack.SetResult_I4(ESPNOW_ERR_ESPNOW_INIT); NANOCLR_NOCLEANUP_NOLABEL(); } stack.SetResult_I4(0); - NANOCLR_NOCLEANUP_NOLABEL(); } @@ -85,6 +167,7 @@ HRESULT Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowControlle esp_now_unregister_recv_cb(); esp_now_unregister_send_cb(); + DisposeReceiveQueue(); esp_now_deinit(); NANOCLR_NOCLEANUP_NOLABEL(); @@ -95,8 +178,6 @@ HRESULT Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowControlle { NANOCLR_HEADER(); - esp_err_t ret; - CLR_RT_HeapBlock_Array *peerMacArg = stack.Arg1().DereferenceArray(); if (peerMacArg == NULL || peerMacArg->m_numOfElements != ESP_NOW_ETH_ALEN) { @@ -104,8 +185,6 @@ HRESULT Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowControlle NANOCLR_NOCLEANUP_NOLABEL(); } - char *peerMac = (char *)peerMacArg->GetFirstElement(); - CLR_RT_HeapBlock_Array *dataArg = stack.Arg2().DereferenceArray(); if (dataArg == NULL) { @@ -114,18 +193,19 @@ HRESULT Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowControlle } int32_t dataLen = stack.Arg3().NumericByRef().s4; - if (dataLen < 0 || dataLen > (int32_t)dataArg->m_numOfElements) + if (dataLen < 0 || dataLen > (int32_t)dataArg->m_numOfElements + || s_rxQueue.maximum_data_length == 0 || dataLen > (int32_t)s_rxQueue.maximum_data_length) { stack.SetResult_I4(ESPNOW_ERR_INVALID_PEER); NANOCLR_NOCLEANUP_NOLABEL(); } - char *data = (char *)dataArg->GetFirstElement(); - - ret = esp_now_send((const uint8_t *)peerMac, (const uint8_t *)data, dataLen); + esp_err_t ret = esp_now_send( + (const uint8_t *)peerMacArg->GetFirstElement(), + (const uint8_t *)dataArg->GetFirstElement(), + dataLen); stack.SetResult_I4((int32_t)ret); - NANOCLR_NOCLEANUP_NOLABEL(); } @@ -135,13 +215,7 @@ HRESULT Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowControlle NANOCLR_HEADER(); CLR_RT_HeapBlock_Array *macArray = stack.Arg1().DereferenceArray(); - if (macArray == NULL) - { - stack.SetResult_I4(ESPNOW_ERR_INVALID_PEER); - NANOCLR_NOCLEANUP_NOLABEL(); - } - - if (macArray->m_numOfElements != ESP_NOW_ETH_ALEN) + if (macArray == NULL || macArray->m_numOfElements != ESP_NOW_ETH_ALEN) { stack.SetResult_I4(ESPNOW_ERR_INVALID_PEER); NANOCLR_NOCLEANUP_NOLABEL(); @@ -177,8 +251,73 @@ HRESULT Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowControlle } stack.SetResult_I4(0); + NANOCLR_NOCLEANUP_NOLABEL(); +} +HRESULT Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController::NativeGetMaximumDataLength___I4( + CLR_RT_StackFrame &stack) +{ + NANOCLR_HEADER(); + stack.SetResult_I4((int32_t)s_rxQueue.maximum_data_length); NANOCLR_NOCLEANUP_NOLABEL(); } +HRESULT Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController::NativeReadPacket___I4__SZARRAY_U1__SZARRAY_U1__I4( + CLR_RT_StackFrame &stack) +{ + NANOCLR_HEADER(); + + CLR_RT_HeapBlock_Array *peerMacArg = stack.Arg1().DereferenceArray(); + CLR_RT_HeapBlock_Array *dataArg = stack.Arg2().DereferenceArray(); + int32_t timeout = stack.Arg3().NumericByRef().s4; + + if (peerMacArg == NULL || peerMacArg->m_numOfElements != ESP_NOW_ETH_ALEN || dataArg == NULL + || dataArg->m_numOfElements < s_rxQueue.maximum_data_length || timeout < 0) + { + stack.SetResult_I4(-ESPNOW_ERR_INVALID_PEER); + NANOCLR_NOCLEANUP_NOLABEL(); + } + + while (true) + { + if (xSemaphoreTake(s_rxQueue.mutex, portMAX_DELAY) == pdTRUE) + { + if (s_rxQueue.count > 0) + { + EspNowPacket &packet = s_rxQueue.packets[s_rxQueue.head]; + memcpy(peerMacArg->GetFirstElement(), packet.peer_mac, ESP_NOW_ETH_ALEN); + memcpy(dataArg->GetFirstElement(), packet.data, packet.data_len); + int32_t dataLength = packet.data_len; + s_rxQueue.head = (s_rxQueue.head + 1) % NF_ESPNOW_RX_QUEUE_DEPTH; + s_rxQueue.count--; + xSemaphoreGive(s_rxQueue.mutex); + stack.SetResult_I4(dataLength); + NANOCLR_NOCLEANUP_NOLABEL(); + } + + xSemaphoreGive(s_rxQueue.mutex); + } + + if (timeout == 0 || xSemaphoreTake(s_rxQueue.data_available, pdMS_TO_TICKS(timeout)) != pdTRUE) + { + stack.SetResult_I4(-ESPNOW_ERR_RECEIVE_TIMEOUT); + NANOCLR_NOCLEANUP_NOLABEL(); + } + } +} + +HRESULT Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowController:: + NativeGetReceiveOverflowCount___I4(CLR_RT_StackFrame &stack) +{ + NANOCLR_HEADER(); + + uint32_t overflowCount = 0; + if (s_rxQueue.mutex != NULL && xSemaphoreTake(s_rxQueue.mutex, portMAX_DELAY) == pdTRUE) + { + overflowCount = s_rxQueue.overflow_count; + xSemaphoreGive(s_rxQueue.mutex); + } + stack.SetResult_I4((int32_t)overflowCount); + 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 index f4e91a7a0e..37afb61529 100644 --- 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 @@ -1,129 +1,23 @@ // Copyright (c) .NET Foundation and Contributors // See LICENSE file in the project root for full license information. -// #include "nanoFramework_espnow_native.h" -typedef EspNowDataSentEventData DataSentEventData; -typedef EspNowDataRecvEventData DataRecvEventData; - -static const int EVENT_ESPNOW_DATASENT = 1; static const int EVENT_ESPNOW_DATARECV = 2; -HRESULT -Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowControllerEventListener::CopyByteArrayToCLRArray( - CLR_RT_HeapBlock &target, - uint8_t *src, - CLR_UINT32 length) -{ - NANOCLR_HEADER(); - - 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); - } - - firstTargetByte = targetArray->GetFirstElement(); - memcpy(firstTargetByte, src, length); - - NANOCLR_NOCLEANUP(); -} - -HRESULT -Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowControllerEventListener::ProcessEvent_DataSent( +HRESULT Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowControllerEventListener::ProcessEvent_DataRecv( CLR_RT_StackFrame &stack) { NANOCLR_HEADER(); - DataSentEventData *sentEventData = (DataSentEventData *)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); - - NANOCLR_CLEANUP(); - - if (sentEventData != NULL) - { - platform_free(sentEventData); - } - - NANOCLR_CLEANUP_END(); -} - -HRESULT -Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowControllerEventListener::ProcessEvent_DataRecv( - CLR_RT_StackFrame &stack) -{ - NANOCLR_HEADER(); - - DataRecvEventData *recvEventData = (DataRecvEventData *)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); - - NANOCLR_CLEANUP(); - - if (recvEventData != NULL) - { - platform_free(recvEventData); - } - - NANOCLR_CLEANUP_END(); + NANOCLR_NOCLEANUP(); } -HRESULT -Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowControllerEventListener:: +HRESULT Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowControllerEventListener:: ProcessEvent___nanoFrameworkRuntimeEventsBaseEvent__U4__U4__SystemDateTime(CLR_RT_StackFrame &stack) { NANOCLR_HEADER(); @@ -133,9 +27,6 @@ Library_nanoFramework_EspNow_native_nanoFramework_EspNow_EspNowControllerEventLi switch (subEvent) { - case EVENT_ESPNOW_DATASENT: - hr = ProcessEvent_DataSent(stack); - break; case EVENT_ESPNOW_DATARECV: hr = ProcessEvent_DataRecv(stack); break;