GrpcPrint/PrintC/Communication/BaseClient.cpp

661 lines
16 KiB
C++

#include "BaseClient.h"
//#include "S7Command.h"
#include "../global.h"
#include "../Config/ConfigManager.h"
BaseClient::BaseClient()
:m_Thread(INVALID_HANDLE_VALUE)
,m_RunFlag(false)
//, m_interval(500)
{
InitializeCriticalSection(&m_ValueCS);
InitializeCriticalSection(&m_RtcCS);
}
BaseClient::~BaseClient()
{
//EnterCriticalSection(&m_RtcCS);
//while (!m_RTCommands.empty())
//{
// Command* pcommand = m_RTCommands.front();
// delete pcommand;
// pcommand = NULL;
// m_RTCommands.pop();
//}
//LeaveCriticalSection(&m_RtcCS);
//while (!m_CycleCommands.empty()) {
// Command* pcommand = m_CycleCommands.back();
// delete pcommand;
// pcommand = NULL;
// m_CycleCommands.pop_back();
//}
EnterCriticalSection(&m_ValueCS);
for (auto item = m_baseMp.begin(); item != m_baseMp.end(); ++item) {
delete item->second;
}
m_baseMp.clear();
LeaveCriticalSection(&m_ValueCS);
DeleteCriticalSection(&m_ValueCS);
DeleteCriticalSection(&m_RtcCS);
}
void BaseClient::Startup()
{
m_RunFlag = true;
m_Thread = AtlCreateThread(ThreadProc, this);
}
void BaseClient::Shutdown()
{
m_RunFlag = false;
if (m_Thread != INVALID_HANDLE_VALUE)
{
if (WaitForSingleObject(m_Thread, 1000) == WAIT_TIMEOUT) {
TerminateThread(m_Thread, 1);
}
CloseHandle(m_Thread);
m_Thread = INVALID_HANDLE_VALUE;
}
}
void BaseClient::SetRunFlag(bool runflag)
{
m_RunFlag = runflag;
}
DWORD WINAPI BaseClient::ThreadProc(BaseClient* pclient)
{
//if (pclient) {
// pclient->RunProc();
//}
return 0;
}
//void BaseClient::ClearCycleCommand()
//{
// if (m_Thread != INVALID_HANDLE_VALUE)return;
// while (!m_CycleCommands.empty())
// {
// Command* command = m_CycleCommands.back();
// m_CycleCommands.pop_back();
// delete command;
// }
// m_CycleCommands.clear();
//}
//Command* BaseClient::GetSendCycleCommand()
//{
// Command* command = NULL;
// for (size_t i = 0; i < m_CycleCommands.size(); ++i) {
// if (!m_CycleCommands[i]->isFinished)
// {
// command = m_CycleCommands[i];
// break;
// }
// }
// return command;
//}
//void BaseClient::UpdateCycleCommands()
//{
// uint64_t currentTickcount = GetTickCount64();
// uint64_t dif = currentTickcount - m_LastCycleTickcount;
// if (dif < GetInterval())return;
// m_LastCycleTickcount = currentTickcount;
//
// bool isAllFinished = true;
// for (size_t i = 0; i < m_CycleCommands.size(); ++i) {
// if (!m_CycleCommands[i]->isFinished) {
// isAllFinished = false;
// break;
// }
// }
// if (isAllFinished)
// {
// for (size_t i = 0; i < m_CycleCommands.size(); ++i) {
// m_CycleCommands[i]->isFinished = false;
// }
// }
//}
void BaseClient::InsertMp(void* startPtr, size_t count, const string& suff) {
size_t ptrSize = sizeof(nullptr); //指针大小
for (size_t i = 0; i < count; ++i) {
BaseData* bd = *((BaseData**)((char*)startPtr + ptrSize * i));
string key = bd->GetCode() + suff;
if (m_baseMp.find(key) != m_baseMp.end()) {
printf("%s is repeated...\n", key.data());
}
else { m_baseMp.insert(make_pair(key, bd)); }
}
}
void BaseClient::UpdateData(const ReadData& msg) {
for (auto start = msg.its.begin(); start != msg.its.end(); ++start) {
if (start->valueType == iFLOAT) {
float val = (float)atof(start->strValue.data());
m_baseMp[start->nameKey]->SetValue(val);
}
else if (start->valueType == iBOOL) {
bool val = (bool)atoi(start->strValue.data());
m_baseMp[start->nameKey]->SetValue(val);
}
else if (start->valueType == iSHORT) {
short val = (short)atoi(start->strValue.data());
m_baseMp[start->nameKey]->SetValue(val);
}
else if (start->valueType == iUSHORT) {
unsigned short val = (unsigned short)atoi(start->strValue.data());
m_baseMp[start->nameKey]->SetValue(val);
}
else if (start->valueType == iINT) {
int val = atoi(start->strValue.data());
m_baseMp[start->nameKey]->SetValue(val);
}
else if (start->valueType == iUCHAR) {
unsigned char val = (unsigned char)atoi(start->strValue.data());
m_baseMp[start->nameKey]->SetValue(val);
}
else if (start->valueType == iSTRING) {
m_baseMp[start->nameKey]->SetValue(start->strValue);
}
}
}
S7Client::S7Client(void* pconfig)
:m_S7Client(nullptr)
//,m_Config(pconfig)
, m_WriteTimeout(1000)
,m_ReadTimeout(2000)
, m_LocalTsap(0x0200)
,m_RemoteTsap(0x0200)
{
}
S7Client::~S7Client() {
Shutdown();
if (m_S7Client)
{
delete m_S7Client;
}
}
void S7Client::Shutdown()
{
//BaseClient::Shutdown();
//if (m_S7Client && m_S7Client->Connected)m_S7Client->Disconnect();
}
void S7Client::Init()
{
// m_S7Client = new TSnap7Client();
// m_S7Client->SetConnectionParams(m_Config->m_IP.c_str(), 0x0200, 0x0200);
// int sendtimeout = m_WriteTimeout;
// int readtimeout = m_ReadTimeout;
// int pdusize = 800;
// m_S7Client->SetParam(p_i32_PDURequest, &pdusize);
// m_S7Client->SetParam(p_i32_SendTimeout, &sendtimeout);
// m_S7Client->SetParam(p_i32_RecvTimeout, &readtimeout);
//#ifdef _DEBUG
// int pingTimeout = 0;
// m_S7Client->SetParam(p_i32_PingTimeout, &pingTimeout);
//#endif
// InitCommand();
}
//void S7Client::RunProc()
//{
// while (m_RunFlag)
// {
// if (!m_S7Client->Connected) {
//
// m_S7Client->SetConnectionParams(m_Config->m_IP.c_str(), 0x0200, 0x0200);
// int rel = m_S7Client->Connect();
//
// if (rel != 0) {
// int count = 0;
// while (m_RunFlag && (count < 5)) {
// Sleep(100);
// count++;
// }
// continue;
// }
//
// }
// Command* pCommand = NULL;
// EnterCriticalSection(&m_RtcCS);
// if (!m_RTCommands.empty()) {
// pCommand = m_RTCommands.front();
// S7Command* ps7 = (S7Command*)pCommand;
// if (ps7->m_waitTime > 0) {
// uint64_t nowtick = GetTickCount64();
// if ((nowtick - ps7->m_CreateTime) > ps7->m_waitTime) {
// m_RTCommands.pop();
// }
// else {
// pCommand = NULL;
// }
// }
// else {
// m_RTCommands.pop();
// }
// }
// LeaveCriticalSection(&m_RtcCS);
//
// if (pCommand == NULL) {
// pCommand = GetSendCycleCommand();
// }
// if (pCommand != NULL) {
//
// switch (pCommand->m_id)
// {
// case S7_COMMAND_READ_INFO:
// {
// S7Command* ps7 = (S7Command*)pCommand;
// TS7DataItem* items = ps7->getDataItems();
// int rel = m_S7Client->ReadMultiVars(items, ps7->getItemCount());
// if (rel == 0)
// {
// EnterCriticalSection(&m_ValueCS);
// m_BaseStat.readTimeoutFlag = 0;
// m_BaseStat.isConnected = true;
// LeaveCriticalSection(&m_ValueCS);
// if (ps7->m_Fun)ps7->m_Fun(ps7->m_Ref, ps7);
// }
// else if (rel == errIsoRecvPacket) {
// EnterCriticalSection(&m_ValueCS);
// m_BaseStat.readTimeoutFlag++;
// if (m_BaseStat.readTimeoutFlag >= m_Config->m_AlarmTimeoutTimes) {
// m_BaseStat.isConnected = false;
// m_S7Client->Disconnect();
// }
// LeaveCriticalSection(&m_ValueCS);
// }
// else {
// EnterCriticalSection(&m_ValueCS);
// m_BaseStat.readTimeoutFlag = 0;
// m_BaseStat.isConnected = false;
// m_S7Client->Disconnect();
// LeaveCriticalSection(&m_ValueCS);
// }
// }break;
// case S7_COMMAND_WRITE:
// {
// S7Command* ps7 = (S7Command*)pCommand;
// TS7DataItem* items = ps7->getDataItems();
// //TS7DataItem item = items[0];
// if (ps7->m_PreWrite)ps7->m_PreWrite(ps7->m_Ref, ps7);
// unsigned int itemCount = ps7->getItemCount();
// int rel = m_S7Client->WriteMultiVars(items, itemCount);
//
// if (rel == 0)
// {
// if (ps7->m_Fun)ps7->m_Fun(ps7->m_Ref, ps7);
// }
// else {
// EnterCriticalSection(&m_ValueCS);
// m_BaseStat.isConnected = false;
// m_S7Client->Disconnect();
// LeaveCriticalSection(&m_ValueCS);
// }
//
// }break;
// }
// pCommand->isFinished = true;
// if (pCommand->isNeedDel)delete pCommand;
// }
// UpdateCycleCommands();
// Sleep(50);
// }
//}
ComClient::ComClient(void* cfg)
:/*m_Config(cfg)
,*/m_Freq(50)
,m_ReadTimeout(500)
,m_WriteTimeout(250)
{
}
ComClient::~ComClient() {
Shutdown();
}
void ComClient::Shutdown()
{
BaseClient::Shutdown();
if (m_ComClient.IsOpen())m_ComClient.Close();
}
void ComClient::Init()
{
//InitCommand();
//InitSerialPort();
}
void ComClient::InitSerialPort()
{
//m_ComClient.Close();
//try {
// m_ComClient.Open(m_Config->m_COM.c_str(), m_Config->m_BaudRate, CSerialPort2::Parity(m_Config->m_Parity),m_Config->m_DataBits, CSerialPort2::StopBits(m_Config->m_StopBits-1));
//}
//catch (CSerialException& cse) {
// (void)cse;
//}
if (m_ComClient.IsOpen()) {
COMMTIMEOUTS timeouts = { 0 };
m_ComClient.GetTimeouts(timeouts);
//timeouts.ReadIntervalTimeout = 50;
timeouts.ReadIntervalTimeout = 0L;
timeouts.ReadTotalTimeoutMultiplier = 0L;
timeouts.ReadTotalTimeoutConstant = m_ReadTimeout;
timeouts.WriteTotalTimeoutConstant = m_WriteTimeout;
timeouts.WriteTotalTimeoutMultiplier = 0L;
m_ComClient.SetTimeouts(timeouts);
}
}
//void ComClient::RunProc()
//{
// unsigned char sendBuffer[1024];
// unsigned char recvBuffer[1024];
// while (m_RunFlag) {
// if (!m_ComClient.IsOpen())
// {
// InitSerialPort();
// if (!m_ComClient.IsOpen()) {
// ServerDisconnectProc();
// int count = 0;
// while ((count < 10) && m_RunFlag) {
// Sleep(100);
// count++;
// }
// continue;
// }
// else {
// ServerConnectedProc();
// }
// }
// CycleBegin();
// Command* pCommand = NULL;
// EnterCriticalSection(&m_RtcCS);
// if (!m_RTCommands.empty()) {
// pCommand = m_RTCommands.front();
// m_RTCommands.pop();
// }
// LeaveCriticalSection(&m_RtcCS);
//
// if (pCommand == NULL) {
// pCommand = GetSendCycleCommand();
// }
// if (pCommand != NULL) {
// if (pCommand->isNeedSend) {
// int bytecount = pCommand->GetRequestSequence(sendBuffer);
// DWORD wlength = 0;
// m_ComClient.ClearReadBuffer();
// m_ComClient.ClearWriteBuffer();
// m_ComClient.Write(sendBuffer, bytecount, wlength);
// if (wlength > 0L) {
// WriteSuccessProc(wlength, sendBuffer, pCommand);
// if (pCommand->isNeedRead) {
// DWORD rlength = 0L;
// memset(recvBuffer, 0, sizeof(recvBuffer));
// m_ComClient.Read(recvBuffer, pCommand->ConstReturnSize(), rlength);
// if (rlength > 0L) {
// ReadSuccessProc(rlength, recvBuffer, pCommand);
// if (pCommand->Verify(recvBuffer, rlength))
// {
// pCommand->m_RespSeq = recvBuffer;
// pCommand->m_RespLen = rlength;
// if (pCommand->m_Fun)pCommand->m_Fun(pCommand->m_Ref, pCommand);
// }
// else {
// VerifyFaild(pCommand);
// }
// }
// else if (rlength == 0L) {
// //timeout
// ReadTimeoutProc(pCommand);
// }
// else {
// m_ComClient.Close();
// //g_log->TraceError("comclient close");
// }
// }
// }
// else if (wlength == 0L) {
// //timeout
// WriteTimeoutProc(pCommand);
// }
// else {
// //error
// m_ComClient.Close();
// //g_log->TraceError("comclient close");
// }
// }
//
// pCommand->isFinished = true;
// if (pCommand->isNeedDel) {
// delete pCommand;
// pCommand = NULL;
// }
// }
// UpdateCycleCommands();
// Sleep(m_Freq);
// }
//}
//void ComClient::ServerDisconnectProc() {
// EnterCriticalSection(&m_ValueCS);
// m_BaseStat.isConnected = false;
// LeaveCriticalSection(&m_ValueCS);
//}
//void ComClient::WriteSuccessProc(int wlength, unsigned char* buffer, Command* pcommand)
//{
// EnterCriticalSection(&m_ValueCS);
// m_BaseStat.writeTimeoutFlag = 0;
// LeaveCriticalSection(&m_ValueCS);
//}
//void ComClient::WriteTimeoutProc(Command* pcommand)
//{
// EnterCriticalSection(&m_ValueCS);
// m_BaseStat.writeTimeoutFlag++;
// if (m_BaseStat.writeTimeoutFlag >= m_Config->m_AlarmTimeoutTimes) {
// m_BaseStat.isConnected = false;
// }
// LeaveCriticalSection(&m_ValueCS);
//}
//void ComClient::ReadTimeoutProc(Command* pcommand)
//{
// EnterCriticalSection(&m_ValueCS);
// m_BaseStat.readTimeoutFlag++;
// if (m_BaseStat.readTimeoutFlag >= m_Config->m_AlarmTimeoutTimes) {
// m_BaseStat.isConnected = false;
// }
// LeaveCriticalSection(&m_ValueCS);
//}
//void ComClient::ReadSuccessProc(int rlength, unsigned char* buffer, Command* pcommand)
//{
// EnterCriticalSection(&m_ValueCS);
// m_BaseStat.readTimeoutFlag = 0;
// m_BaseStat.isConnected = true;
// LeaveCriticalSection(&m_ValueCS);
//}
TcpClient::TcpClient(void* pconfig, int freq)
:/*m_Config(pconfig)
,*/ m_Freq(freq)
, m_ReadTimeout(500)
, m_WriteTimeout(250)
{
}
TcpClient::~TcpClient()
{
Shutdown();
}
void TcpClient::Init()
{
//m_interval = m_Config->m_interval;
//InitCommand();
}
//void TcpClient::RunProc()
//{
// unsigned char sendBuffer[1024];
// unsigned char recvBuffer[1024];
// //while (m_RunFlag) {
// // if (!m_Client.IsOpen()) {
// // if (!m_Client.ConnectTo(m_Config->m_IP.c_str(), m_Config->m_Port, AF_INET, SOCK_STREAM, 500)) {
// // if (!m_RunFlag)break;
// // ServerDisconnectProc();
// // int count = 0;
// // while ((count < 10) && m_RunFlag) {
// // Sleep(100);
// // count++;
// // }
// // if (!m_RunFlag)break;
// // continue;
// // }
// // else {
// // ServerConnectedProc();
// // }
// // }
// // CycleBegin();
//
// // Command* pCommand = NULL;
// // EnterCriticalSection(&m_RtcCS);
// // if (!m_RTCommands.empty()) {
// // pCommand = m_RTCommands.front();
// // m_RTCommands.pop();
// // }
// // LeaveCriticalSection(&m_RtcCS);
//
// // if (pCommand == NULL) {
// // pCommand = GetSendCycleCommand();
// // }
// // if (pCommand != NULL) {
// // if (pCommand->isNeedSend) {
// // int bytecount = pCommand->GetRequestSequence(sendBuffer);
// // int wlength = 0;
// // m_Client.Read(recvBuffer, sizeof(recvBuffer), NULL, 10);
//
// // wlength = m_Client.Write(sendBuffer, bytecount, NULL, 500);
// // if (wlength > 0) {
// // WriteSuccessProc(wlength, sendBuffer, pCommand);
// // if (pCommand->isNeedRead) {
// // int rlength = 0;
// // memset(recvBuffer, 0, sizeof(recvBuffer));
// // rlength = m_Client.Read(recvBuffer, sizeof(recvBuffer), NULL, 500);
// // if (rlength > 0) {
// // ReadSuccessProc(rlength, recvBuffer, pCommand);
// // if (pCommand->Verify(recvBuffer, rlength))
// // {
// // pCommand->m_RespSeq = recvBuffer;
// // pCommand->m_RespLen = rlength;
// // if (pCommand->m_Fun)pCommand->m_Fun(pCommand->m_Ref, pCommand);
// // }
// // else {
// // VerifyFaild(pCommand);
// // }
// // }
// // else if (rlength == 0) {
// // //timeout
// // ReadTimeoutProc(pCommand);
// // }
// // else {
// // m_Client.Close();
// // }
// // }
// // }
// // else if (wlength == 0) {
// // //timeout
// // WriteTimeoutProc(pCommand);
// // }
// // else {
// // //error
// // m_Client.Close();
// // }
// // }
//
// // pCommand->isFinished = true;
// // if (pCommand->isNeedDel) {
// // delete pCommand;
// // pCommand = NULL;
// // }
// // }
// // UpdateCycleCommands();
// // Sleep(m_Freq);
// //}
//}
//void TcpClient::ServerDisconnectProc() {
// EnterCriticalSection(&m_ValueCS);
// m_BaseStat.isConnected = false;
// LeaveCriticalSection(&m_ValueCS);
//}
//void TcpClient::WriteSuccessProc(int wlength, unsigned char* buffer, Command* pcommand)
//{
// EnterCriticalSection(&m_ValueCS);
// m_BaseStat.writeTimeoutFlag = 0;
// LeaveCriticalSection(&m_ValueCS);
//}
//void TcpClient::WriteTimeoutProc(Command* pcommand)
//{
// EnterCriticalSection(&m_ValueCS);
// m_BaseStat.writeTimeoutFlag++;
// if (m_BaseStat.writeTimeoutFlag >= m_Config->m_AlarmTimeoutTimes) {
// m_BaseStat.isConnected = false;
// }
// LeaveCriticalSection(&m_ValueCS);
//}
//void TcpClient::ReadTimeoutProc(Command* pcommand)
//{
// EnterCriticalSection(&m_ValueCS);
// m_BaseStat.readTimeoutFlag++;
// if (m_BaseStat.readTimeoutFlag >= m_Config->m_AlarmTimeoutTimes) {
// m_BaseStat.isConnected = false;
// }
// LeaveCriticalSection(&m_ValueCS);
//}
//void TcpClient::ReadSuccessProc(int rlength, unsigned char* buffer, Command* pcommand)
//{
// EnterCriticalSection(&m_ValueCS);
// m_BaseStat.readTimeoutFlag = 0;
// m_BaseStat.isConnected = true;
// LeaveCriticalSection(&m_ValueCS);
//}
//void TcpClient::Shutdown()
//{
// BaseClient::Shutdown();
// if (m_Client.IsOpen())m_Client.Close();
//}