nim_duilib/examples/proto_debuger/modbus_form.cpp

199 lines
5.2 KiB
C++
Raw Normal View History

2023-01-20 00:17:17 +08:00
#include "modbus_form.h"
#include "lua_bind.h"
#include "msgdef.h"
2023-03-26 00:32:27 +08:00
#include <item.h>
2023-01-22 00:01:26 +08:00
2023-01-20 00:17:17 +08:00
ModbusMasterForm::ModbusMasterForm(ui::Window* hwnd, std::wstring name,
uint32_t baurate, UINT portnum,
uint8_t data_bits, uint8_t stop_bits,
2023-03-26 00:32:27 +08:00
uint8_t verify, uint8_t flow_control)
:m_rich_edit_1(nullptr),
m_rich_edit_2(nullptr),
m_rich_edit_3(nullptr)
{
2023-01-20 00:17:17 +08:00
m_portnum = portnum;
m_name = name;
m_baurate = baurate;
m_data_bits = data_bits;
m_stop_bits = stop_bits;
m_verify = verify;
m_flow_contro = flow_control;
m_runing = true;
mLua = new LuaDelegate;
mLuaFile.open(MODBUS_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);
std::cout << "lua script is " << lua_script << std::endl;
2023-01-24 23:05:06 +08:00
2023-01-20 00:17:17 +08:00
if (nullptr != hwnd) {
// set window so we get getwindow by GetWindow funtion
this->SetWindow(hwnd, nullptr, false);
}
this->mLua->BindFunction("showdata", LuaShowData);
}
ModbusMasterForm::~ModbusMasterForm() {
}
void ModbusMasterForm::Init() {
ui::ChildBox::Init();
2023-01-22 00:01:26 +08:00
2023-01-20 00:17:17 +08:00
auto mRightSide = dynamic_cast<ui::Label*> (FindSubControl(L"uart_info_label"));
wchar_t p[100] = { 0 };
wsprintf(p, L"<EFBFBD><EFBFBD><EFBFBD>ں<EFBFBD>: %s <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%d <20><><EFBFBD><EFBFBD>λ: %d ֹͣλ: %d ",
m_name.c_str(), m_baurate,
m_data_bits, m_stop_bits);
mRightSide->SetText(std::wstring(p));
2023-01-24 23:05:06 +08:00
m_rich_edit_1 = dynamic_cast<ui::RichEdit*>(FindSubControl(L"read_single_addr"));
m_button_1 = dynamic_cast<ui::Button*>(FindSubControl(L"btn_send_modbus"));
m_rich_edit_2 = dynamic_cast<ui::RichEdit*>(FindSubControl(L"read_batch_addr"));
m_rich_edit_3 = dynamic_cast<ui::RichEdit*>(FindSubControl(L"read_batch_cnt"));
auto mBtnSend = static_cast<ui::Button*>(FindSubControl(L"btn_send_modbus"));
2023-03-27 22:47:17 +08:00
auto mBtnSend2 = static_cast<ui::Button*>(FindSubControl(L"btn_send_modbus_batch"));
2023-01-24 23:05:06 +08:00
if (NULL != mBtnSend)
{
mBtnSend->AttachClick([this](ui::EventArgs*){
wprintf(L"com is %s m_name", m_name.c_str());
printf("open ptr is %s %d %d %d ", wstring2string(m_name).c_str(), m_baurate,m_data_bits,m_stop_bits);
2023-01-25 00:33:35 +08:00
mModbus = modbus_new_rtu(wstring2string(wstring(L"\\\\.\\") + m_name).c_str(),
2023-01-24 23:05:06 +08:00
m_baurate,'N',m_data_bits, m_stop_bits);
if (mModbus != nullptr) {
modbus_set_slave(mModbus, 9);
modbus_set_debug(mModbus,true);
int ret = modbus_connect(mModbus);
if (ret < 0) {
printf("modbus_connect err %d\r\n", ret);
}
timeval* ptr = new timeval;
ptr->tv_sec = 1;
ptr->tv_usec = 0;
modbus_set_response_timeout(mModbus, ptr);
uint16_t dest[32];
2023-03-27 22:47:17 +08:00
2023-03-26 00:32:27 +08:00
uint16_t addr = 0;
if (m_rich_edit_1) {
int i = 0;
nbase::StringToInt(m_rich_edit_1->GetText(),&i);
addr = uint16_t(i);
}
ret = modbus_read_registers(mModbus, addr, 1, dest);
2023-01-24 23:05:06 +08:00
if (ret < 0) {
printf("read %d timeout %d ", ret);
2023-03-26 00:32:27 +08:00
}else {
for (int i = 0; i < ret; i++) {
ui::ListContainerElement* element = new ui::ListContainerElement;
element->SetText(nbase::StringPrintf(L"<EFBFBD><EFBFBD>ַ%d: %d", addr + i,dest[i]));
element->SetClass(L"listitem");
element->SetFixedHeight(30);
element->SetFont(L"system_20");
m_list->RemoveAll();
m_list->Add(element);
}
2023-01-24 23:05:06 +08:00
}
2023-03-26 00:32:27 +08:00
std::string str;
2023-01-24 23:05:06 +08:00
modbus_flush(mModbus);
modbus_close(mModbus);
}
return false;
});
}
2023-03-26 00:32:27 +08:00
m_list = dynamic_cast<ui::ListBox*>(FindSubControl(L"list"));
2023-03-27 22:47:17 +08:00
if (nullptr != mBtnSend2) {
mBtnSend2->AttachClick([this](ui::EventArgs* arg) {
uint16_t addr = 0;
uint16_t cnt = 0;
2023-03-26 00:32:27 +08:00
2023-03-27 22:47:17 +08:00
if (m_rich_edit_2) {
int i = 0;
nbase::StringToInt(m_rich_edit_2->GetText(), &i);
addr = uint16_t(i);
2023-01-20 00:17:17 +08:00
}
2023-03-27 22:47:17 +08:00
if (m_rich_edit_3) {
int i = 0;
nbase::StringToInt(m_rich_edit_3->GetText(), &i);
cnt = uint16_t(i);
2023-01-20 00:17:17 +08:00
}
2023-03-27 22:47:17 +08:00
wprintf(L"com is %s m_name", m_name.c_str());
printf("open ptr is %s %d %d %d ", wstring2string(m_name).c_str(), m_baurate, m_data_bits, m_stop_bits);
mModbus = modbus_new_rtu(wstring2string(wstring(L"\\\\.\\") + m_name).c_str(),
m_baurate, 'N', m_data_bits, m_stop_bits);
if (mModbus != nullptr) {
modbus_set_slave(mModbus, 9);
modbus_set_debug(mModbus, true);
int ret = modbus_connect(mModbus);
if (ret < 0) {
printf("modbus_connect err %d\r\n", ret);
}
timeval* ptr = new timeval;
ptr->tv_sec = 1;
ptr->tv_usec = 0;
modbus_set_response_timeout(mModbus, ptr);
uint16_t dest[32];
ret = modbus_read_registers(mModbus, addr, cnt, dest);
if (ret < 0) {
printf("read %d timeout %d ", ret);
}
else {
m_list->RemoveAll();
for (int i = 0; i < ret; i++) {
ui::ListContainerElement* element = new ui::ListContainerElement;
element->SetText(nbase::StringPrintf(L"<EFBFBD><EFBFBD>ַ%d: %d", addr + i, dest[i]));
element->SetClass(L"listitem");
element->SetFixedHeight(30);
element->SetFont(L"system_20");
m_list->Add(element);
}
}
std::string str;
modbus_flush(mModbus);
modbus_close(mModbus);
2023-01-20 00:17:17 +08:00
}
return true;
2023-03-27 22:47:17 +08:00
});
2023-01-22 00:01:26 +08:00
}
2023-01-20 00:17:17 +08:00
}
void ModbusMasterForm::UpdateRecvEdit()
{
}
LuaDelegate* ModbusMasterForm::LuaVM() {
return nullptr;
}
void ModbusMasterForm::ShowDataInEdit(const char*) {
}
void ModbusMasterForm::OnUpdateUart()
{
}
void ModbusMasterForm::HandleMessage(ui::EventArgs& msg) {
}