diff --git a/examples/proto_debuger/base_form.cpp b/examples/proto_debuger/base_form.cpp index 789f13c7..f5fc4edf 100644 --- a/examples/proto_debuger/base_form.cpp +++ b/examples/proto_debuger/base_form.cpp @@ -371,6 +371,11 @@ LuaBindInterface* BasicForm::FindCurrentFormByLuaPointer(lua_State* pointer) return (LuaBindInterface*)itr->second; } } + for (auto itr = mUdpForm.begin(); itr != mUdpForm.end(); itr++) { + if (itr->second->LuaVM()->VM() == pointer) { + return (LuaBindInterface*)itr->second; + } + } return nullptr; } diff --git a/examples/proto_debuger/proto_debuger.vcxproj b/examples/proto_debuger/proto_debuger.vcxproj index 8bb7ee8f..40bdb98a 100644 --- a/examples/proto_debuger/proto_debuger.vcxproj +++ b/examples/proto_debuger/proto_debuger.vcxproj @@ -174,6 +174,7 @@ + @@ -193,6 +194,7 @@ + diff --git a/examples/proto_debuger/udp_form.cpp b/examples/proto_debuger/udp_form.cpp index 4cb74cf2..905ecf86 100644 --- a/examples/proto_debuger/udp_form.cpp +++ b/examples/proto_debuger/udp_form.cpp @@ -1,14 +1,49 @@ #include "udp_form.h" +#include +#include "utils.h" +#include "lua_bind.h" + + +#define UDP_LUA_SCRIPT "udp_script.lua" UdpForm::UdpForm(ui::Window* hwnd, string url, uint32_t port, UdpDataGramLibevent* p) { this->mUdpPeer = p; this->m_url = url; this->m_port = port; + mLua = new LuaDelegate; + + mLuaFile.open(UDP_LUA_SCRIPT); + std::string lua_script; + if (mLuaFile.is_open()) { + std::string s; + while (getline(mLuaFile, s)) { + lua_script += s + "\r\n"; + } + mLuaFile.close(); + } + mLuaScript = lua_script; + mLua->DoString(lua_script); + + UdpDataGramLibevent::OnReadDataHandle onRecvCallBack + = [this](const char* dat, int len, struct sockaddr_in sendarr){ + std::cout << "receive udp datagram len" << len << dat << "\r\n"; + + this->mLua->CallFuntion("OnUdpData", std::string(dat), + inet_ntoa(sendarr.sin_addr),sendarr.sin_port); + + }; + if (mUdpPeer != nullptr) { + std::cout << "\r\n"<< &onRecvCallBack <<"\r\n"; + mUdpPeer->SetOnReadHandle(onRecvCallBack); + } + this->mLua->BindFunction("showdata", LuaShowData); + std::cout << "lua script is " << lua_script << std::endl; } UdpForm::~UdpForm() { + } void UdpForm::Init() @@ -22,6 +57,82 @@ void UdpForm::Init() ui::Button* m_button_2 = dynamic_cast(FindSubControl(L"btn_close_uart")); ui::Button* m_button_3 = dynamic_cast(FindSubControl(L"btn_save_lua")); ui::Button* m_button_4 = dynamic_cast(FindSubControl(L"btn_do_lua")); + + m_label_1 = dynamic_cast(FindSubControl(L"uart_info_label")); + m_rich_edit_1 = dynamic_cast(FindSubControl(L"uart_recv_eidt")); + if (nullptr != m_rich_edit_1) { + m_rich_edit_1->SetReadOnly(true); + m_rich_edit_1->SetRich(false); + m_rich_edit_1->SetAttribute(L"autovscroll", L"true"); + m_rich_edit_1->SetAttribute(L"multiline", L"true"); + m_rich_edit_1->SetReturnMsgWantCtrl(true); + m_rich_edit_1->SetNeedReturnMsg(true); + m_rich_edit_1->SetWordWrap(true); + } + + m_rich_edit_2 = dynamic_cast(FindSubControl(L"lua_script")); + if (nullptr != m_rich_edit_2) { + m_rich_edit_2->SetRich(true); + m_rich_edit_2->SetReturnMsgWantCtrl(true); + m_rich_edit_2->SetText(string2wstring(mLuaScript)); + } + + m_rich_edit_3 = dynamic_cast(FindSubControl(L"uart_send_edit")); + m_button_1 = dynamic_cast(FindSubControl(L"btn_send_data")); + m_button_2 = dynamic_cast(FindSubControl(L"btn_close_uart")); + m_button_3 = dynamic_cast(FindSubControl(L"btn_save_lua")); + m_button_4 = dynamic_cast(FindSubControl(L"btn_do_lua")); + + if (nullptr != m_label_1) { + m_label_1->SetText(wstring(L"udp:") + string2wstring(m_url) + + L":" + std::to_wstring(m_port)); + } + if (nullptr != m_button_1) { + m_button_1->AttachClick( + [this](ui::EventArgs*) { + + return true; + } + ); + } + if (nullptr != m_button_2) { + m_button_2->AttachClick( + [this](ui::EventArgs*) { + + return true; + } + ); + } + if (nullptr != m_button_3) { + m_button_3->AttachClick( + [this](ui::EventArgs*) { + std::cout << "保存lua脚本\r\n"; + std::string lua = wstring2string(this->m_rich_edit_2->GetText()); + if (0 == this->mLua->UpdateScript(lua)) { + this->mLuaScript = lua; + mLuaFileEdit = std::ofstream(UDP_LUA_SCRIPT, std::ios::out | std::ios::trunc); + mLuaFileEdit.write(lua.c_str(), lua.size()); + mLuaFileEdit.flush(); + mLuaFileEdit.close(); + } + else { + MessageBox(0, L"lua脚本错误", L"", 0); + return true; + } + std::cout << lua.c_str() << "\r\n"; + return true; + } + ); + } + if (nullptr != m_button_4) { + m_button_4->AttachClick( + [this](ui::EventArgs* ev) { + + return true; + } + ); + } + } LuaDelegate* UdpForm::LuaVM() @@ -29,9 +140,10 @@ LuaDelegate* UdpForm::LuaVM() return mLua; } -void UdpForm::ShowDataInEdit(const char*) +void UdpForm::ShowDataInEdit(const char*src) { - + std::cout << src << " from ShowDataInEdit"; + this->m_rich_edit_1->AppendText(string2wstring(std::string(src))); } void UdpForm::HandleMessage(ui::EventArgs& msg) diff --git a/examples/proto_debuger/udp_form.h b/examples/proto_debuger/udp_form.h index c5da9616..2f0da3b9 100644 --- a/examples/proto_debuger/udp_form.h +++ b/examples/proto_debuger/udp_form.h @@ -23,26 +23,32 @@ #include class UdpForm : - public ui::ChildBox + public ui::ChildBox, + LuaBindInterface { public: UdpForm(ui::Window* hwnd, string url, uint32_t port, UdpDataGramLibevent* p); ~UdpForm(); virtual void Init() override; LuaDelegate* LuaVM(); + ui::RichEdit* m_rich_edit_2; + protected: void ShowDataInEdit(const char*) ; private: ui::Label* m_label_1; ui::RichEdit* m_rich_edit_1; - ui::RichEdit* m_rich_edit_2; ui::RichEdit* m_rich_edit_3; ui::Button* m_button_1; ui::Button* m_button_2; ui::Button* m_button_3; ui::Button* m_button_4; + + std::ifstream mLuaFile; + std::ofstream mLuaFileEdit; + virtual void HandleMessage(ui::EventArgs& msg); std::string mLuaScript; std::string m_url; diff --git a/examples/proto_debuger/udp_libevent.cpp b/examples/proto_debuger/udp_libevent.cpp index ded555b3..f8f4bbcd 100644 --- a/examples/proto_debuger/udp_libevent.cpp +++ b/examples/proto_debuger/udp_libevent.cpp @@ -39,7 +39,9 @@ void read_cb(evutil_socket_t fd, short event, void* arg) { printf("recv[%s:%d]\n", buf, len); // sendto(fd, buf, len, 0, (struct sockaddr*)&cli_addr, addr_len); if (parent->OnReadHandle() != nullptr) { - (*parent->OnReadHandle())(buf, len, cli_addr); + UdpDataGramLibevent::OnReadDataHandle p = (parent->OnReadHandle()); + if(p) + p(buf, len, cli_addr); } } } @@ -82,11 +84,11 @@ int UdpDataGramLibevent::bind_socket(struct event* ev, const char* ip, uint16_t return 0; } -UdpDataGramLibevent::OnReadDataHandle* UdpDataGramLibevent::OnReadHandle() { +UdpDataGramLibevent::OnReadDataHandle UdpDataGramLibevent::OnReadHandle() { return this->mOnRead; } -void UdpDataGramLibevent::SetOnReadHandle(UdpDataGramLibevent::OnReadDataHandle* p) { +void UdpDataGramLibevent::SetOnReadHandle(UdpDataGramLibevent::OnReadDataHandle p) { this->mOnRead = p; } diff --git a/examples/proto_debuger/udp_libevent.h b/examples/proto_debuger/udp_libevent.h index a0e3d382..0d5de848 100644 --- a/examples/proto_debuger/udp_libevent.h +++ b/examples/proto_debuger/udp_libevent.h @@ -26,14 +26,14 @@ class UdpDataGramLibevent { public: typedef std::function OnReadDataHandle; UdpDataGramLibevent(std::string ip, uint32_t port); - OnReadDataHandle* OnReadHandle(); + OnReadDataHandle OnReadHandle(); typedef enum { RUNNING, STOP, FAIL }STATUS; friend void read_cb(int, short, void*); - void SetOnReadHandle(OnReadDataHandle*); + void SetOnReadHandle(OnReadDataHandle); void SendTo(const char* dat, uint32_t len, std::string ip, int port); int SocketFD(); private: @@ -47,7 +47,7 @@ private: STATUS m_status; // std::thread* m_thread; // 当前线程 intptr_t mSocketFD; // 操作系统原生socket - OnReadDataHandle* mOnRead; + OnReadDataHandle mOnRead; };