#include "stdafx.h"
|
#include "HsmsPassive.h"
|
#include "Log.h"
|
#include "Model.h"
|
#include "Common.h"
|
#include <time.h>
|
#include <iostream>
|
#include <time.h>
|
#include <stdlib.h>
|
#include <string.h>
|
#include <regex>
|
|
|
const char ACK[2] = {0, 1};
|
const char* ACK0 = &ACK[0];
|
const char* ACK1 = &ACK[1];
|
|
unsigned __stdcall CimWorkThreadFunction(LPVOID lpParam)
|
{
|
CHsmsPassive* pPassive = (CHsmsPassive*)lpParam;
|
return pPassive->OnCimWork();
|
}
|
|
CHsmsPassive* g_pPassive = NULL;
|
void CALLBACK HsmsPassiveTimerProc(HWND hWnd, UINT nMsg, UINT nTimerid, DWORD dwTime)
|
{
|
if (g_pPassive != NULL) {
|
g_pPassive->OnTimer(nTimerid);
|
}
|
}
|
|
CHsmsPassive::CHsmsPassive()
|
{
|
m_pPassive = nullptr;
|
m_bAreYouThereRequest = FALSE;
|
m_pModel = nullptr;
|
m_nActionTimeout = 6;
|
m_nSystemByte = 0;
|
m_strEquipmentModelType = "2860";
|
m_strSoftRev = _T("1.0.1");
|
m_hCimWorkThreadHandle = NULL;
|
m_nCimWorkThrdaddr = 0;
|
m_bCimWorking = FALSE;
|
m_hCimWorkEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL);
|
m_nSessionId = 1;
|
m_listener.onEQOffLine = nullptr;
|
m_listener.onEQOnLine = nullptr;
|
m_listener.onCommand = nullptr;
|
m_listener.onEQConstantRequest = nullptr;
|
m_listener.onEQConstantSend = nullptr;
|
InitializeCriticalSection(&m_criticalSection);
|
}
|
|
CHsmsPassive::~CHsmsPassive()
|
{
|
Lock();
|
for (auto item : m_listAction) {
|
delete item;
|
}
|
m_listAction.clear();
|
for (auto item : m_listActionSent) {
|
delete item;
|
}
|
m_listActionSent.clear();
|
Unlock();
|
|
if (m_hCimWorkEvent != NULL) {
|
CloseHandle(m_hCimWorkEvent);
|
m_hCimWorkEvent = NULL;
|
}
|
DeleteCriticalSection(&m_criticalSection);
|
}
|
|
void CHsmsPassive::setListener(SECSListener listener)
|
{
|
m_listener = listener;
|
}
|
|
void CHsmsPassive::setActionTimeout(int nSecond)
|
{
|
m_nActionTimeout = max(3, nSecond);
|
}
|
|
void CHsmsPassive::setEquipmentModelType(const char* pszMode)
|
{
|
m_strEquipmentModelType = pszMode;
|
if (m_strEquipmentModelType.length() > 20) {
|
m_strEquipmentModelType = m_strEquipmentModelType.substr(0, 20);
|
}
|
}
|
|
void CHsmsPassive::setSoftRev(const char* pszRev)
|
{
|
m_strSoftRev = pszRev;
|
if (m_strSoftRev.length() > 20) {
|
m_strSoftRev = m_strSoftRev.substr(0, 20);
|
}
|
|
}
|
|
void CHsmsPassive::addReport(unsigned int id, const char* pszName)
|
{
|
Lock();
|
REPORT report;
|
report.id = id;
|
strcpy_s(report.szName, REPORT_NAME_MAX, pszName);
|
m_mapReport[id] = report;
|
Unlock();
|
}
|
|
void CHsmsPassive::linkEventReport(unsigned int RPTID, unsigned int CEID)
|
{
|
m_mapReportIdToCEID[RPTID] = CEID;
|
}
|
|
void CHsmsPassive::unlinkEventReport(unsigned int CEID)
|
{
|
for (auto it = m_mapReportIdToCEID.begin(); it != m_mapReportIdToCEID.end(); ) {
|
if (it->second == CEID) {
|
m_mapReportIdToCEID.erase(it++); // ¸üеü´úÆ÷
|
}
|
else {
|
++it;
|
}
|
}
|
|
}
|
|
unsigned int CHsmsPassive::getCEID(int RPTID)
|
{
|
auto iter = m_mapReportIdToCEID.find(RPTID);
|
if (iter != m_mapReportIdToCEID.end()) return iter->second;
|
return 0;
|
}
|
|
void CHsmsPassive::deleteReport(unsigned int RPTID)
|
{
|
for (auto it = m_mapValueIdToPRTID.begin(); it != m_mapValueIdToPRTID.end(); ) {
|
if (it->second == RPTID) {
|
m_mapValueIdToPRTID.erase(it++); // ¸üеü´úÆ÷
|
}
|
else {
|
++it;
|
}
|
}
|
}
|
|
void CHsmsPassive::deleteAllReport()
|
{
|
m_mapValueIdToPRTID.clear();
|
}
|
|
void CHsmsPassive::defineReport(unsigned int VID, unsigned int RPTID)
|
{
|
m_mapValueIdToPRTID[VID] = RPTID;
|
}
|
|
void CHsmsPassive::OnTimer(UINT nTimerid)
|
{
|
// ËùÓÐÒÑ·¢Ë͵ÄAction×Ô¼Ó1
|
Lock();
|
for (auto iter = m_listActionSent.begin(); iter != m_listActionSent.end();) {
|
if ((*iter)->incrementAndCheckTimeout()) {
|
TRACE("CHsmsPassive::³¬Ê±\n");
|
delete (*iter);
|
m_listActionSent.erase(iter++);
|
}
|
else {
|
++iter;
|
}
|
}
|
Unlock();
|
}
|
|
int CHsmsPassive::onRecvMsg(IMessage* pMessage)
|
{
|
LOGI("onRecvMsg:%s", pMessage->toString());
|
Lock();
|
CHsmsAction* pAction = nullptr;
|
for (auto iter = m_listActionSent.begin(); iter != m_listActionSent.end(); iter++) {
|
if ((*iter)->getSendMessage()->getHeader()->systemBytes == pMessage->getHeader()->systemBytes) {
|
LOGI("CHsmsPassive::ÕÒµ½");
|
pAction = (*iter);
|
m_listActionSent.erase(iter);
|
break;
|
}
|
}
|
Unlock();
|
|
if (pAction != nullptr) {
|
LOGI("onRecvMsg::ÏàÓ¦´¦Àí");
|
delete pAction;
|
}
|
|
|
return 0;
|
}
|
|
int CHsmsPassive::loadVarialbleList(const char* pszFilepath)
|
{
|
CStdioFile file;
|
if (!file.Open(pszFilepath, CFile::modeRead)) {
|
return -1;
|
}
|
|
std::regex pattern("^\\d+,.*"); // Æ¥ÅäÒÔÊý×Ö+¶ººÅ¿ªÍ·µÄ×Ö·û´®
|
std::vector<SERVO::CVariable*> variables;
|
int index, last;
|
CString strLine;
|
CString strId, strName, strFormat, strRemark;
|
while (file.ReadString(strLine)) {
|
if (!std::regex_match((LPTSTR)(LPCTSTR)strLine, pattern)) {
|
continue;
|
}
|
|
last = 0;
|
index = strLine.Find(",", last);
|
if (index < 0) continue;
|
strId = strLine.Left(index);
|
last = index + 1;
|
|
index = strLine.Find(",", last);
|
if (index < 0) continue;
|
strName = strLine.Mid(last, index - last);
|
last = index + 1;
|
|
index = strLine.Find(",", last);
|
if (index < 0) continue;
|
strFormat = strLine.Mid(last, index - last);
|
strRemark = strLine.Right(strLine.GetLength() - index - 1);
|
|
SERVO::CVariable* pVarialble = new SERVO::CVariable(
|
(LPTSTR)(LPCTSTR)strId, (LPTSTR)(LPCTSTR)strName, (LPTSTR)(LPCTSTR)strFormat, (LPTSTR)(LPCTSTR)strRemark);
|
variables.push_back(pVarialble);
|
}
|
|
if (!variables.empty()) {
|
clearAllVariabel();
|
for (auto item : variables) {
|
m_variabels.push_back(item);
|
}
|
}
|
|
|
file.Close();
|
return 0;
|
}
|
|
void CHsmsPassive::clearAllVariabel()
|
{
|
for (auto item : m_variabels) {
|
delete item;
|
}
|
m_variabels.clear();
|
}
|
|
int CHsmsPassive::init(CModel* pModel, const char* pszName, unsigned int port)
|
{
|
m_pModel = pModel;
|
HSMS_CreatePassive(m_pPassive, pszName, port);
|
if (m_pPassive == NULL) {
|
return -1;
|
}
|
auto onStatusChanged = [&](void* pFrom, STATE state) -> void {
|
m_pModel->notifyInt(RX_CODE_PASSIVE_STATUS_CHANGED, (int)state);
|
|
// Á¬ÉÏÖ®ºó·¢S1F1
|
// ÐÞ¸ÄΪ²»Ö÷¶¯·¢ËÍ£¬¶øÊÇÏìÓ¦
|
/*
|
if (STATE::SELECTED == state) {
|
m_bAreYouThereRequest = FALSE;
|
if (!m_bAreYouThereRequest) {
|
m_bAreYouThereRequest = TRUE;
|
secsAreYouThereRequest();
|
}
|
}
|
*/
|
};
|
auto onRecvSysMessage = [&](void* pFrom, IMessage* pMessage) -> void {
|
LOGI("<HSMS>onRecvSysMessage:sessionId:%d, sType:%d systemBytes:%d",
|
pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes);
|
onRecvMsg(pMessage);
|
if (MSG_LINKTEST_REQ == pMessage->getHeader()->sType) {
|
/*
|
Sleep(10);
|
if (!m_bAreYouThereRequest) {
|
m_bAreYouThereRequest = TRUE;
|
requestYouThere();
|
}
|
*/
|
}
|
};
|
|
auto onError = [&](void* pFrom, int error) -> void {
|
LOGI("<HSMS>onError:%d", error);
|
// secsIllegalData();
|
};
|
|
auto onRecvRawData = [&](void* pFrom, const char* pszData, int size) {
|
LOGI("<HSMS>onRecvRawData:<0x%x, %d>", pszData, size);
|
};
|
|
auto onRecvDataMessage = [&](void* pFrom, IMessage* pMessage) -> void {
|
HEADER* pHeader = pMessage->getHeader();
|
int nStream = (pHeader->stream & 0x7F);
|
|
LOGI("<HSMS>ÊÕµ½ÏûÏ¢ S%dF%d", nStream, pHeader->function);
|
if (nStream == 1 && pHeader->function == 1) {
|
// S1F1
|
replyAreYouThere(pMessage);
|
}
|
else if (nStream == 1 && pHeader->function == 13) {
|
replyEstablishCommunications(pMessage);
|
}
|
else if (nStream == 1 && pHeader->function == 15) {
|
replyOffLine(pMessage);
|
}
|
else if (nStream == 1 && pHeader->function == 17) {
|
replyOnLine(pMessage);
|
}
|
else if (nStream == 2 && pHeader->function == 13) {
|
replyEquipmentConstantRequest(pMessage);
|
}
|
else if (nStream == 2 && pHeader->function == 15) {
|
replyEquipmentConstantSend(pMessage);
|
}
|
else if (nStream == 2 && pHeader->function == 31) {
|
replyDatetime(pMessage);
|
}
|
else if (nStream == 2 && pHeader->function == 33) {
|
replyDefineReport(pMessage);
|
}
|
else if (nStream == 2 && pHeader->function == 35) {
|
replyLinkEventReport(pMessage);
|
}
|
else if (nStream == 2 && pHeader->function == 37) {
|
replyEanbleDisableEventReport(pMessage);
|
}
|
else if (nStream == 2 && pHeader->function == 41) {
|
replyCommand(pMessage);
|
}
|
else if (nStream == 5 && pHeader->function == 3) {
|
replyEanbleDisableAlarmReport(pMessage);
|
}
|
else if (nStream == 7 && pHeader->function == 19) {
|
replyQueryPPIDList(pMessage);
|
}
|
else if (nStream == 10 && pHeader->function == 3) {
|
replyTerminalDisplay(pMessage);
|
}
|
};
|
|
PassiveListener listener;
|
listener.funStateChanged = onStatusChanged;
|
listener.funRecvRawData = onRecvRawData;
|
listener.funRecvDataMessage = onRecvDataMessage;
|
listener.funRecvSysMessage = onRecvSysMessage;
|
listener.funError = onError;
|
m_pPassive->setListener(listener);
|
|
// Æô¶¯¹¤×÷Ïß³Ì
|
m_bCimWorking = TRUE;
|
m_hCimWorkThreadHandle = (HANDLE)_beginthreadex(NULL, 0, ::CimWorkThreadFunction, this,
|
0, &m_nCimWorkThrdaddr);
|
|
g_pPassive = this;
|
SetTimer(NULL, 1, 1000, (TIMERPROC)HsmsPassiveTimerProc);
|
|
return 0;
|
}
|
|
int CHsmsPassive::term()
|
{
|
// ½áÊøÏß³Ì
|
m_bCimWorking = FALSE;
|
SetEvent(m_hCimWorkEvent);
|
if (m_hCimWorkThreadHandle != NULL) {
|
WaitForSingleObject(m_hCimWorkThreadHandle, INFINITE);
|
CloseHandle(m_hCimWorkThreadHandle);
|
m_hCimWorkThreadHandle = NULL;
|
}
|
|
if (m_pPassive != NULL) {
|
HSMS_DestroyPassive(m_pPassive);
|
m_pPassive = NULL;
|
}
|
|
clearAllVariabel();
|
|
return 0;
|
}
|
|
unsigned CHsmsPassive::OnCimWork()
|
{
|
while (m_bCimWorking) {
|
|
// ´ýÍ˳öÐźŻòʱ¼äµ½
|
int nRet = WaitForSingleObject(m_hCimWorkEvent, INFINITE);
|
ResetEvent(m_hCimWorkEvent);
|
if (!m_bCimWorking) break;
|
|
// È¡³öÇëÇóÁÐ±í²¢½øÐд¦Àí
|
std::list<CHsmsAction*> list;
|
Lock();
|
list.splice(list.end(), m_listAction);
|
Unlock();
|
|
while (!list.empty()) {
|
Lock();
|
CHsmsAction* pAction = list.front();
|
Unlock();
|
list.pop_front();
|
TRACE("OnCimWork 004.\n");
|
|
IMessage* pMessage = pAction->getSendMessage();
|
ASSERT(pMessage);
|
m_pPassive->sendMessage(pMessage);
|
LOGI("<HSMS> [SEND] SysByte=%u sessionId:%d", pMessage->getHeader()->systemBytes, pMessage->getHeader()->sessionId);
|
|
if (pAction->isNeedWaitReply()) {
|
// Èç¹ûÐèÒªµÈ´ý»Ø¸´
|
int nRet = WaitForSingleObject(pAction->getEvent(), pAction->getTimeout() * 1000);
|
if (nRet == WAIT_TIMEOUT) {
|
TRACE("Timeout...\n");
|
CContext* pContext = pAction->getContext();
|
if (pContext != NULL) {
|
//pContext->setRetCode(CRC_TIMEOUT);
|
//pContext->setRetMsg("³¬Ê±");
|
//pContext->setEvent();
|
}
|
}
|
|
delete pAction;
|
pAction = NULL;
|
TRACE("delete m_pCurrentAction, next...\n");
|
}
|
else {
|
Lock();
|
m_listActionSent.push_back(pAction);
|
Unlock();
|
}
|
|
|
}
|
|
TRACE("OnCimWork \n");
|
}
|
|
// _endthreadex(0);
|
TRACE("OnCimWork exit\n");
|
return 0;
|
}
|
|
// ͨÓõÄreply ackº¯Êý
|
void CHsmsPassive::replyAck(int s, int f, unsigned int systemBytes, BYTE ack, const char* pszAckName)
|
{
|
IMessage* pMessage = NULL;
|
HSMS_Create1Message(pMessage, m_nSessionId, s, f, systemBytes);
|
ASSERT(pMessage);
|
ISECS2Item* pItem = pMessage->getBody();
|
pItem->setBinary((const char*)&ack, 1, pszAckName);
|
m_pPassive->sendMessage(pMessage);
|
LOGI("<HSMS>[SECS Msg SEND]S%dF%d (SysByte=%u)", s, f, systemBytes);
|
HSMS_Destroy1Message(pMessage);
|
}
|
|
// S1F1
|
int CHsmsPassive::requestAreYouThere()
|
{
|
if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
|
return ER_NOTSELECT;
|
}
|
|
Lock();
|
CHsmsAction* pAction = new CHsmsAction(ACTION_HELLO, FALSE, m_nActionTimeout);
|
m_listAction.push_back(pAction);
|
IMessage* pMessage = NULL;
|
HSMS_Create1Message(pMessage, m_nSessionId, 1 | REPLY, 1, ++m_nSystemByte);
|
ASSERT(pMessage);
|
pAction->setSendMessage(pMessage);
|
|
SetEvent(m_hCimWorkEvent);
|
Unlock();
|
|
return ER_NOERROR;
|
}
|
|
// S1F2
|
int CHsmsPassive::replyAreYouThere(IMessage* pRecv)
|
{
|
if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
|
return ER_NOTSELECT;
|
}
|
|
IMessage* pMessage = NULL;
|
HSMS_Create1Message(pMessage, m_nSessionId, 1, 2, pRecv->getHeader()->systemBytes);
|
ASSERT(pMessage);
|
|
ISECS2Item* pItem = pMessage->getBody();
|
pItem->addItem(m_strEquipmentModelType.c_str(), "MDLN");
|
pItem->addItem(m_strSoftRev.c_str(), "SOFTREV");
|
m_pPassive->sendMessage(pMessage);
|
LOGI("<HSMS>[SECS Msg SEND]S1F2 (SysByte=%u)", pMessage->getHeader()->systemBytes);
|
HSMS_Destroy1Message(pMessage);
|
|
return 0;
|
}
|
|
// S1F15
|
int CHsmsPassive::replyOffLine(IMessage* pRecv)
|
{
|
if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
|
return ER_NOTSELECT;
|
}
|
|
|
// ½»ÓÉÉϲãÓ¦ÓÃÀ´»ñÈ¡»úÆ÷³£Á¿Öµ
|
if (m_listener.onEQOffLine != nullptr) {
|
m_listener.onEQOffLine(this);
|
}
|
|
|
// »Ø¸´
|
replyAck(1, 16, pRecv->getHeader()->systemBytes, BYTE(0), "OFLACK");
|
return 0;
|
}
|
|
// S1F17
|
int CHsmsPassive::replyOnLine(IMessage* pRecv)
|
{
|
if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
|
return ER_NOTSELECT;
|
}
|
|
|
// ½»ÓÉÉϲãÓ¦ÓÃÀ´»ñÈ¡»úÆ÷³£Á¿Öµ
|
if (m_listener.onEQOnLine != nullptr) {
|
m_listener.onEQOnLine(this);
|
}
|
|
|
// »Ø¸´
|
replyAck(1, 18, pRecv->getHeader()->systemBytes, BYTE(0), "ONLACK");
|
return 0;
|
}
|
|
int CHsmsPassive::replyEstablishCommunications(IMessage* pRecv)
|
{
|
if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
|
return ER_NOTSELECT;
|
}
|
|
IMessage* pMessage = NULL;
|
HSMS_Create1Message(pMessage, m_nSessionId, 1, 14, pRecv->getHeader()->systemBytes);
|
ASSERT(pMessage);
|
|
ISECS2Item* pItem = pMessage->getBody();
|
pItem->addBinaryItem(ACK0, 1, "COMMACK");
|
ISECS2Item* pList = pItem->addItem();
|
pList->addItem(m_strEquipmentModelType.c_str(), "MDLN");
|
pList->addItem(m_strSoftRev.c_str(), "SOFTREV");
|
m_pPassive->sendMessage(pMessage);
|
LOGI("<HSMS>[SECS Msg SEND]%s", pMessage->toString());
|
HSMS_Destroy1Message(pMessage);
|
|
return 0;
|
}
|
|
// S2F13
|
int CHsmsPassive::replyEquipmentConstantRequest(IMessage* pRecv)
|
{
|
if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
|
return ER_NOTSELECT;
|
}
|
|
|
// Òª»ñÈ¡µÄ³£Á¿±í±í
|
BOOL bCheckData = FALSE;
|
std::vector<EQConstant> eqcs;
|
{
|
ISECS2Item* pItem = pRecv->getBody();
|
int ecidSize = pItem->getSubItemSize();
|
for (int i = 0; i < ecidSize; i++) {
|
EQConstant eqc;
|
unsigned short id;
|
if (pItem->getSubItemU2(i, id)) {
|
eqc.id = id;
|
eqcs.push_back(eqc);
|
}
|
}
|
}
|
|
|
// ½»ÓÉÉϲãÓ¦ÓÃÀ´»ñÈ¡»úÆ÷³£Á¿Öµ
|
if (m_listener.onEQConstantRequest != nullptr) {
|
m_listener.onEQConstantRequest(this, eqcs);
|
}
|
|
|
// »Ø¸´
|
IMessage* pMessage = NULL;
|
HSMS_Create1Message(pMessage, m_nSessionId, 1, 14, pRecv->getHeader()->systemBytes);
|
ASSERT(pMessage);
|
ISECS2Item* pItem = pMessage->getBody();
|
for (auto& item : eqcs) {
|
pItem->addItem(item.szValue, "ECV");
|
}
|
|
m_pPassive->sendMessage(pMessage);
|
LOGI("<HSMS>[SECS Msg SEND]S2F14 (SysByte=%u)", pMessage->getHeader()->systemBytes);
|
HSMS_Destroy1Message(pMessage);
|
|
return 0;
|
}
|
|
// S2F15
|
int CHsmsPassive::replyEquipmentConstantSend(IMessage* pRecv)
|
{
|
if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
|
return ER_NOTSELECT;
|
}
|
|
|
// ÒªÉèÖõij£Á¿±í±í
|
BOOL bCheckData = FALSE;
|
std::vector<EQConstant> eqcs;
|
{
|
ISECS2Item* pItem = pRecv->getBody();
|
int ecidSize = pItem->getSubItemSize();
|
for (int i = 0; i < ecidSize; i++) {
|
ISECS2Item* pItemEqc = pItem->getSubItem(i);
|
if (pItemEqc != nullptr) {
|
EQConstant eqc;
|
unsigned short eqcid;
|
const char* pszValue;
|
if (pItemEqc->getSubItemU2(0, eqcid)
|
&& pItemEqc->getSubItemString(1, pszValue)) {
|
eqc.id = eqcid;
|
strcpy_s(eqc.szValue, EQCONSTANT_VALUE_MAX, pszValue);
|
eqcs.push_back(eqc);
|
}
|
}
|
}
|
}
|
|
|
// ½»ÓÉÉϲãÓ¦ÓÃÀ´±£´æºÍÉèÖûúÆ÷³£Á¿Öµ
|
std::vector<unsigned int> ecvs;
|
if (m_listener.onEQConstantSend != nullptr) {
|
m_listener.onEQConstantSend(this, eqcs);
|
}
|
|
|
// »Ø¸´
|
replyAck(2, 16, pRecv->getHeader()->systemBytes, BYTE(0), "EACK");
|
return 0;
|
}
|
|
// S2F31
|
int CHsmsPassive::replyDatetime(IMessage* pRecv)
|
{
|
if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
|
return ER_NOTSELECT;
|
}
|
ISECS2Item* pBody = pRecv->getBody();
|
if (pBody == nullptr || pBody->getType() != SITYPE::A) ER_PARAM_ERROR;
|
const char* pszMessage;
|
if (pBody->getString(pszMessage)) {
|
// ¸üÐÂʱ¼ä
|
SYSTEMTIME time;
|
char szBuffer[20];
|
memcpy(szBuffer, pszMessage, 16);
|
szBuffer[14] = '\0';
|
time.wSecond = atoi(&szBuffer[12]);
|
szBuffer[12] = '\0';
|
time.wMinute = atoi(&szBuffer[10]);
|
szBuffer[10] = '\0';
|
time.wHour = atoi(&szBuffer[8]);
|
szBuffer[8] = '\0';
|
time.wDay = atoi(&szBuffer[6]);
|
szBuffer[6] = '\0';
|
time.wMonth = atoi(&szBuffer[4]);
|
szBuffer[4] = '\0';
|
time.wYear = atoi(&szBuffer[0]);
|
time.wMilliseconds = 0;
|
SetLocalTime(&time);
|
if (m_listener.onDatetimeSync != nullptr) {
|
m_listener.onDatetimeSync(this, time);
|
}
|
}
|
|
replyAck(2, 32, pRecv->getHeader()->systemBytes, BYTE(0), "TIACK");
|
return 0;
|
}
|
|
// S2F33
|
int CHsmsPassive::replyDefineReport(IMessage* pRecv)
|
{
|
if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
|
return ER_NOTSELECT;
|
}
|
|
|
ISECS2Item* pBody = pRecv->getBody();
|
ISECS2Item* defineItem, *rptListItem, * vidListItem;
|
unsigned int dataId, rptid, vid;
|
if (!pBody->getSubItemU4(0, dataId)) goto MYREPLY;
|
rptListItem = pBody->getSubItem(1);
|
if (rptListItem == nullptr) goto MYREPLY;
|
if (rptListItem->getSubItemSize() == 0) {
|
deleteAllReport();
|
goto MYREPLY;
|
}
|
for (int i = 0; i < rptListItem->getSubItemSize(); i++) {
|
defineItem = rptListItem->getSubItem(i);
|
if (defineItem == nullptr) continue;
|
vidListItem = defineItem->getSubItem(1);
|
if (defineItem->getSubItemU4(0, rptid)
|
&& vidListItem != nullptr) {
|
int vidCount = vidListItem->getSubItemSize();
|
if (vidCount == 0) {
|
deleteReport(rptid);
|
}
|
else {
|
for (int k = 0; k < vidCount; k++) {
|
if (vidListItem->getSubItemU4(k, vid)) {
|
defineReport(vid, rptid);
|
}
|
}
|
}
|
}
|
}
|
|
|
MYREPLY:
|
// ¼ìÑé½á¹ûÊÇ·ñÕýÈ·
|
for (auto item : m_mapValueIdToPRTID) {
|
LOGE("=== vid:%d, prtid:%d", item.first, item.second);
|
}
|
|
replyAck(2, 34, pRecv->getHeader()->systemBytes, BYTE(0), "DRACK");
|
return 0;
|
}
|
|
// S2F35
|
int CHsmsPassive::replyLinkEventReport(IMessage* pRecv)
|
{
|
if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
|
return ER_NOTSELECT;
|
}
|
|
|
ISECS2Item* pBody = pRecv->getBody();
|
ISECS2Item* linkItem, *ceidListItem, *rptListItem;
|
unsigned int dataId, ceid, rptid;
|
if (!pBody->getSubItemU4(0, dataId)) goto MYREPLY;
|
ceidListItem = pBody->getSubItem(1);
|
if (ceidListItem == nullptr) goto MYREPLY;
|
for (int i = 0; i < ceidListItem->getSubItemSize(); i++) {
|
linkItem = ceidListItem->getSubItem(i);
|
if (linkItem == nullptr) continue;
|
rptListItem = linkItem->getSubItem(1);
|
if (linkItem->getSubItemU4(0, ceid)
|
&& rptListItem != nullptr) {
|
int prtCount = rptListItem->getSubItemSize();
|
if (prtCount == 0) {
|
unlinkEventReport(ceid);
|
}
|
else {
|
for (int k = 0; k < prtCount; k++) {
|
if (rptListItem->getSubItemU4(k, rptid)) {
|
linkEventReport(rptid, ceid);
|
}
|
}
|
}
|
}
|
}
|
|
|
// ¼ìÑé½á¹ûÊÇ·ñÕýÈ·
|
for (auto item : m_mapReportIdToCEID) {
|
LOGE("=== prtid:%d, ceid:%d", item.first, item.second);
|
}
|
|
MYREPLY:
|
replyAck(2, 36, pRecv->getHeader()->systemBytes, BYTE(0), "LRACK");
|
return 0;
|
}
|
|
// S2F37
|
int CHsmsPassive::replyEanbleDisableEventReport(IMessage* pRecv)
|
{
|
if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
|
return ER_NOTSELECT;
|
}
|
ISECS2Item* pBody = pRecv->getBody();
|
if (pBody == nullptr || pBody->getType() != SITYPE::A) ER_PARAM_ERROR;
|
|
|
|
BOOL bCheckData = FALSE;
|
bool bEnable;
|
std::vector<unsigned int> ids;
|
{
|
ISECS2Item* pItemIds;
|
ISECS2Item* pItem = pRecv->getBody();
|
if (pItem->getSubItemSize() < 2) goto MYREPLY;
|
if (!pItem->getSubItemBool(0, bEnable)) goto MYREPLY;
|
pItemIds = pItem->getSubItem(1);
|
if (pItemIds == nullptr || pItemIds->getType() != SITYPE::L) goto MYREPLY;
|
for (int i = 0; i < pItemIds->getSubItemSize(); i++) {
|
unsigned int id;
|
if (pItemIds->getSubItemU4(i, id)) {
|
ids.push_back(id);
|
}
|
}
|
bCheckData = TRUE;
|
if (m_listener.onEnableDisableEventReport != nullptr) {
|
m_listener.onEnableDisableEventReport(this, bEnable, ids);
|
}
|
}
|
|
|
MYREPLY:
|
replyAck(2, 38, pRecv->getHeader()->systemBytes,
|
bCheckData ? BYTE(0) : BYTE(1), "ERACK");
|
return 0;
|
}
|
|
// S2F41
|
int CHsmsPassive::replyCommand(IMessage* pRecv)
|
{
|
if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
|
return ER_NOTSELECT;
|
}
|
ISECS2Item* pBody = pRecv->getBody();
|
if (pBody == nullptr || pBody->getType() != SITYPE::A) ER_PARAM_ERROR;
|
|
|
|
BOOL bCheckData = FALSE;
|
const char* pszCmdName;
|
std::vector<CommandParameter> params;
|
{
|
ISECS2Item* pItemParams, *pItemParam;
|
ISECS2Item* pItem = pRecv->getBody();
|
if (pItem->getSubItemSize() < 2) goto MYREPLY;
|
if (!pItem->getSubItemString(0, pszCmdName)) goto MYREPLY;
|
pItemParams = pItem->getSubItem(1);
|
if (pItemParams == nullptr || pItemParams->getType() != SITYPE::L) goto MYREPLY;
|
for (int i = 0; i < pItemParams->getSubItemSize(); i++) {
|
const char* pszParamName, * pszParamValue;
|
pItemParam = pItemParams->getSubItem(i);
|
if (pItemParam != nullptr
|
&& pItemParam->getSubItemString(0, pszParamName)
|
&& pItemParam->getSubItemString(1, pszParamValue)) {
|
CommandParameter cp;
|
strcpy_s(cp.szName, COMMAND_NAME_MAX, pszParamName);
|
strcpy_s(cp.szValue, COMMAND_VALUE_MAX, pszParamValue);
|
params.push_back(cp);
|
}
|
}
|
bCheckData = TRUE;
|
}
|
|
|
// »Øµ÷µ½Ó¦Óòã
|
if (bCheckData) {
|
if (m_listener.onCommand != nullptr) {
|
m_listener.onCommand(this, pszCmdName, params);
|
}
|
}
|
|
MYREPLY:
|
replyAck(2, 42, pRecv->getHeader()->systemBytes, BYTE(0), "ERACK");
|
return 0;
|
}
|
|
// S5F3
|
int CHsmsPassive::replyEanbleDisableAlarmReport(IMessage* pRecv)
|
{
|
if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
|
return ER_NOTSELECT;
|
}
|
ISECS2Item* pBody = pRecv->getBody();
|
if (pBody == nullptr || pBody->getType() != SITYPE::A) ER_PARAM_ERROR;
|
|
|
|
BOOL bCheckData = FALSE;
|
const char* ALED;
|
unsigned int ALID;
|
unsigned int ALEDLEN;
|
{
|
ISECS2Item* pItem = pRecv->getBody();
|
if (pItem->getSubItemSize() < 2) goto MYREPLY;
|
if (!pItem->getSubItemBinary(0, ALED, ALEDLEN)) goto MYREPLY;
|
if (!pItem->getSubItemU4(1, ALID)) goto MYREPLY;
|
bCheckData = TRUE;
|
LOGI("EanbleDisableAlarmReport ALED:0x%02x, ALID:%d", ALED[0], ALID);
|
if (m_listener.onEnableDisableAlarmReport != nullptr) {
|
m_listener.onEnableDisableAlarmReport(this, ALED[0] != 0, ALID);
|
}
|
}
|
|
|
MYREPLY:
|
replyAck(5, 4, pRecv->getHeader()->systemBytes, BYTE(0), "ACKC5");
|
return 0;
|
}
|
|
// S7F19
|
int CHsmsPassive::replyQueryPPIDList(IMessage* pRecv)
|
{
|
if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
|
return ER_NOTSELECT;
|
}
|
|
|
IMessage* pMessage = NULL;
|
HSMS_Create1Message(pMessage, m_nSessionId, 7, 20, pRecv->getHeader()->systemBytes);
|
ASSERT(pMessage);
|
|
ISECS2Item* pItem = pMessage->getBody();
|
pItem->addItem("banana1", "PPID1");
|
pItem->addItem("banana2", "PPID2");
|
pItem->addF8Item(-123.45, "PPID2");
|
pItem->addF4Item(-568.99f, "PPID2");
|
pItem->addF8Item(456.456, "PPID2");
|
pItem->addF4Item(123.123f, "PPID2");
|
m_pPassive->sendMessage(pMessage);
|
LOGI("<HSMS>[SECS Msg SEND]S7F20 (SysByte=%u)", pMessage->getHeader()->systemBytes);
|
HSMS_Destroy1Message(pMessage);
|
|
return 0;
|
}
|
|
// S10F3
|
int CHsmsPassive::replyTerminalDisplay(IMessage* pRecv)
|
{
|
if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
|
return ER_NOTSELECT;
|
}
|
ISECS2Item* pBody = pRecv->getBody();
|
if (pBody == nullptr || pBody->getType() != SITYPE::A) ER_PARAM_ERROR;
|
|
|
|
BOOL bCheckData = FALSE;
|
const char* tid;
|
unsigned int tidlen;
|
const char* pszText = nullptr;;
|
{
|
ISECS2Item* pItem = pRecv->getBody();
|
if (pItem->getSubItemSize() < 2) goto MYREPLY;
|
if (!pItem->getSubItemBinary(0, tid, tidlen)) goto MYREPLY;
|
if (!pItem->getSubItemString(1, pszText)) goto MYREPLY;
|
bCheckData = TRUE;
|
LOGI("TerminalDisplay tid:0x%02x, pszText:%s", tid[0], pszText);
|
m_pModel->notifyText(RX_HSMS_TERMINAL_TEXT, pszText);
|
}
|
|
|
MYREPLY:
|
replyAck(10, 4, pRecv->getHeader()->systemBytes, BYTE(0), "ACKC10");
|
return 0;
|
}
|
|
// S5F1
|
int CHsmsPassive::requestAlarmReport(int ALCD, int ALID, const char* ALTX)
|
{
|
if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
|
return ER_NOTSELECT;
|
}
|
|
char szALCD[1];
|
szALCD[0] = ALCD & 0xff;
|
|
Lock();
|
CHsmsAction* pAction = new CHsmsAction(ACTION_ALARM_REPORT, TRUE, m_nActionTimeout);
|
m_listAction.push_back(pAction);
|
IMessage* pMessage = NULL;
|
HSMS_Create1Message(pMessage, m_nSessionId, 5 | REPLY, 1, ++m_nSystemByte);
|
ASSERT(pMessage);
|
ISECS2Item* pItem = pMessage->getBody();
|
pItem->addBinaryItem(szALCD, 1, "ALCD");
|
pItem->addU4Item(ALID, "ALID");
|
pItem->addItem(ALTX, "ALTX");
|
pAction->setSendMessage(pMessage);
|
|
SetEvent(m_hCimWorkEvent);
|
Unlock();
|
|
return ER_NOERROR;
|
}
|
|
// S6F11
|
int CHsmsPassive::requestEventReportSend(unsigned int DATAID, unsigned int RPTID, const std::vector<std::string>& values)
|
{
|
if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
|
return ER_NOTSELECT;
|
}
|
|
Lock();
|
CHsmsAction* pAction = new CHsmsAction(ACTION_EVENT_REPORT, TRUE, m_nActionTimeout);
|
m_listAction.push_back(pAction);
|
IMessage* pMessage = NULL;
|
HSMS_Create1Message(pMessage, m_nSessionId, 6 | REPLY, 11, ++m_nSystemByte);
|
ASSERT(pMessage);
|
ISECS2Item* pItem = pMessage->getBody();
|
pItem->addU4Item(DATAID, "DATAID");
|
pItem->addU4Item(getCEID(RPTID), "CEID");
|
ISECS2Item* pItemList1 = pItem->addItem();
|
ISECS2Item* pItemList2 = pItemList1->addItem();
|
pItemList2->addU4Item(RPTID, "RPTID");
|
ISECS2Item* pItemList3 = pItemList2->addItem();
|
for (auto item : values) {
|
pItemList3->addItem(item.c_str(), "V");
|
}
|
pAction->setSendMessage(pMessage);
|
|
SetEvent(m_hCimWorkEvent);
|
Unlock();
|
|
return ER_NOERROR;
|
}
|