Add event

This commit is contained in:
2025-06-06 23:13:31 -05:00
parent c8aef96367
commit 8dc8b9ea86
4 changed files with 90 additions and 7 deletions

View File

@ -80,15 +80,17 @@ target_compile_definitions(TessesFramework PUBLIC TESSESFRAMEWORK_CERT_BUNDLE_FI
endif()
if(TESSESFRAMEWORK_FETCHCONTENT)
set(MBEDTLS_FATAL_WARNINGS OFF)
set(ENABLE_TESTING OFF)
set(ENABLE_PROGRAMS OFF)
if(TESSESFRAMEWORK_ENABLE_SHARED)
set(USE_SHARED_MBEDTLS_LIBRARY ON)
endif()
FetchContent_Declare(
mbedtls
GIT_REPOSITORY https://github.com/Mbed-TLS/mbedtls.git
)
set(MBEDTLS_FATAL_WARNINGS OFF)
set(ENABLE_TESTING OFF)
set(ENABLE_PROGRAMS OFF)
set(USE_SHARED_MBEDTLS_LIBRARY ON)
FetchContent_MakeAvailable(mbedtls)
else()
set(MBEDTLS_DIR "" CACHE PATH "Mbed tls directory")
@ -254,6 +256,8 @@ if(TESSESFRAMEWORK_ENABLE_EXAMPLES)
add_executable(wsecho examples/wsecho.cpp)
target_link_libraries(wsecho PUBLIC tessesframework)
add_executable(runevent examples/runevent.cpp)
target_link_libraries(runevent PUBLIC tessesframework)
endif()
if(TESSESFRAMEWORK_ENABLE_APPS)

22
examples/runevent.cpp Normal file
View File

@ -0,0 +1,22 @@
#include "TessesFramework/TessesFramework.hpp"
using namespace Tesses::Framework;
int main(int argc, char** argv)
{
TF_Init();
auto event = std::make_shared<FunctionalEvent<uint64_t>>([](uint64_t n)->void {
std::cout << n << std::endl;
});
OnItteraton += event;
auto event2 = std::make_shared<FunctionalEvent<uint64_t>>([&event](uint64_t n)->void{
if(n == 10000) OnItteraton -= event;
});
OnItteraton += event2;
TF_RunEventLoop();
return 0;
}

View File

@ -7,7 +7,7 @@
#include <filesystem>
#include <map>
#include <vector>
#include <functional>
class TextException : public std::exception {
@ -29,6 +29,60 @@
};
namespace Tesses::Framework
{
template<typename...TArgs>
class Event {
public:
virtual void Invoke(TArgs... args)=0;
virtual ~Event()
{}
};
template<typename...TArgs>
class FunctionalEvent : public Event<TArgs...> {
std::function<void(TArgs...)> cb;
public:
FunctionalEvent(std::function<void(TArgs...)> cb)
{
this->cb = cb;
}
void Invoke(TArgs... args)
{
this->cb(args...);
}
};
template<typename...TArgs>
class EventList : public Event<TArgs...> {
std::vector<std::shared_ptr<Event<TArgs...>>> items;
public:
void operator+=(std::shared_ptr<Event<TArgs...>> event)
{
for(std::shared_ptr<Event<TArgs...>>& item : this->items)
{
if(item.get() == event.get()) return;
}
this->items.push_back(event);
}
void operator-=(std::shared_ptr<Event<TArgs...>> event)
{
for(auto i = this->items.begin(); i != this->items.end(); i++)
{
if(i->get() == event.get())
{
this->items.erase(i);
return;
}
}
}
void Invoke(TArgs... args)
{
for(auto& item : this->items)
{
item->Invoke(args...);
}
}
};
extern EventList<uint64_t> OnItteraton;
void TF_Init();
void TF_InitWithConsole();
void TF_ConnectToSelf(uint16_t port);

View File

@ -36,7 +36,7 @@ static GXRModeObj *rmode = NULL;
namespace Tesses::Framework
{
EventList<uint64_t> OnItteraton;
#if defined(TESSESFRAMEWORK_ENABLE_THREADING) && (defined(GEKKO) || defined(__SWITCH__))
namespace Threading
{
@ -71,8 +71,11 @@ namespace Tesses::Framework
bool initedConsole=false;
PadState default_pad;
#endif
uint64_t ittr=0;
void TF_RunEventLoopItteration()
{
OnItteraton.Invoke(ittr++);
#if defined(TESSESFRAMEWORK_ENABLE_THREADING) && (defined(GEKKO) || defined(__SWITCH__))
Tesses::Framework::Threading::LookForFinishedThreads();
#endif