224 lines
5.8 KiB
C++
224 lines
5.8 KiB
C++
#include "modbus_form.h"
|
|
#include "lua_bind.h"
|
|
#include "msgdef.h"
|
|
#include <item.h>
|
|
|
|
|
|
ModbusMasterForm::ModbusMasterForm(ui::Window* hwnd, std::wstring name,
|
|
uint32_t baurate, UINT portnum,
|
|
uint8_t data_bits, uint8_t stop_bits,
|
|
uint8_t verify, uint8_t flow_control)
|
|
:m_rich_edit_1(nullptr),
|
|
m_rich_edit_2(nullptr),
|
|
m_rich_edit_3(nullptr)
|
|
{
|
|
|
|
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;
|
|
|
|
|
|
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();
|
|
|
|
auto mRightSide = dynamic_cast<ui::Label*> (FindSubControl(L"uart_info_label"));
|
|
wchar_t p[100] = { 0 };
|
|
wsprintf(p, L"串口号: %s 波特率%d 数据位: %d 停止位: %d ",
|
|
m_name.c_str(), m_baurate,
|
|
m_data_bits, m_stop_bits);
|
|
mRightSide->SetText(std::wstring(p));
|
|
|
|
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"));
|
|
|
|
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);
|
|
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];
|
|
if (m_rich_edit_1) {
|
|
|
|
}
|
|
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);
|
|
if (ret < 0) {
|
|
printf("read %d timeout %d ", ret);
|
|
}else {
|
|
for (int i = 0; i < ret; i++) {
|
|
ui::ListContainerElement* element = new ui::ListContainerElement;
|
|
element->SetText(nbase::StringPrintf(L"地址%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);
|
|
}
|
|
}
|
|
|
|
|
|
std::string str;
|
|
|
|
modbus_flush(mModbus);
|
|
modbus_close(mModbus);
|
|
}
|
|
return false;
|
|
|
|
});
|
|
}
|
|
|
|
|
|
m_list = dynamic_cast<ui::ListBox*>(FindSubControl(L"list"));
|
|
|
|
|
|
/*
|
|
ui::ListBox* list = dynamic_cast<ui::ListBox*>(FindSubControl(L"list"));
|
|
if (list != nullptr) {
|
|
for (auto i = 0; i < 30; i++)
|
|
{
|
|
std::cout << "123";
|
|
ui::ListContainerElement* element = new ui::ListContainerElement;
|
|
element->SetText(nbase::StringPrintf(L"ListElement %d", i));
|
|
element->SetClass(L"listitem");
|
|
element->SetFixedHeight(20);
|
|
list->Add(element);
|
|
}
|
|
}
|
|
|
|
/*
|
|
mEditSend = dynamic_cast<ui::RichEdit*>(FindSubControl(L"uart_send_edit"));
|
|
mEditLua->SetReturnMsgWantCtrl(true);
|
|
|
|
mEditLua->SetText(string2wstring(mLuaScript));
|
|
mEditRecv->SetReadOnly(true);
|
|
mEditRecv->SetRich(false);
|
|
mEditRecv->SetAttribute(L"autovscroll", L"true");
|
|
mEditRecv->SetAttribute(L"multiline", L"true");
|
|
mEditRecv->SetReturnMsgWantCtrl(true);
|
|
mEditRecv->SetNeedReturnMsg(true);
|
|
mEditRecv->SetWordWrap(true);
|
|
|
|
auto mBtnSend = static_cast<ui::Button*>(FindSubControl(L"btn_send_data"));
|
|
if (mBtnSend != nullptr) {
|
|
mBtnSend->AttachClick([this](ui::EventArgs*) {
|
|
UINT PortNum = 0;
|
|
for (int i = 3; m_name[i] != '\0'; i++) //转换为数字
|
|
{
|
|
PortNum = PortNum * 10 + (m_name[i] - '0');
|
|
}
|
|
|
|
auto x = mEditSend->GetText();
|
|
auto tmp = wstring2string(x);
|
|
wprintf(L"%s\r\n", x.c_str());
|
|
SerialPort::WritePort(PortNum, tmp.c_str(), tmp.size());
|
|
return true;
|
|
});
|
|
}
|
|
auto mBtnSaveLua = static_cast<ui::Button*>(FindSubControl(L"btn_save_lua"));
|
|
if (nullptr != mBtnSaveLua) {
|
|
mBtnSaveLua->AttachClick([this](ui::EventArgs*) {
|
|
std::cout << "保存lua脚本\r\n";
|
|
std::string lua = wstring2string(mEditLua->GetText());
|
|
if (0 == this->mLua->UpdateScript(lua)) {
|
|
this->mLuaScript = lua;
|
|
mLuaFileEdit = std::ofstream(MODBUS_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;
|
|
});
|
|
}
|
|
|
|
auto mBtnClose = static_cast<ui::Button*>(FindSubControl(L"btn_close_uart"));
|
|
if (mBtnClose != nullptr) {
|
|
mBtnClose->AttachClick([this](ui::EventArgs*) {
|
|
wstring* name = new wstring(this->GetName());
|
|
::PostMessage(this->GetWindow()->GetHWND(),
|
|
WM_ADD_UART_CLOSE, (WPARAM)name, 0);
|
|
return true;
|
|
});
|
|
}
|
|
*/
|
|
}
|
|
|
|
void ModbusMasterForm::UpdateRecvEdit()
|
|
{
|
|
}
|
|
|
|
LuaDelegate* ModbusMasterForm::LuaVM() {
|
|
return nullptr;
|
|
}
|
|
|
|
void ModbusMasterForm::ShowDataInEdit(const char*) {
|
|
|
|
}
|
|
|
|
void ModbusMasterForm::OnUpdateUart()
|
|
{
|
|
}
|
|
|
|
void ModbusMasterForm::HandleMessage(ui::EventArgs& msg) {
|
|
|
|
}
|
|
|