📄 msghdler.cpp
字号:
//**************************************************************************
//
// Filename : Msghdler.cpp
//
// Subsystem :
//
// Description: Protocol message handlers.
//
//**************************************************************************
/*
* NT Definitions
*/
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "gencmr.h"
#include "cmriosrv.h"
#include "locmsgdef.h"
#define TIME_DRIFT 1
#define TIME_LIMIT 300
VOID PollMarshall(REQUEST_MSGS* pReqMsg, CPio* pPio)
{
BYTE *p_buf;
/*
* If we are starting a poll, the command setup device in polled mode.
*/
p_buf = GetPioWrtBuf(pPio);
switch ( pReqMsg->FuncCode ) {
case INIT_POLL:
memset((char *)GetPioReadBuf(pPio), 0, 1);
SetPioComState(pPio, TRUE);
switch (GetRtuType(pReqMsg->pRtu)) {
case TIMERWSTYPE:
SetPioReadHeadCnt(pPio, MSGBUFLEN);
SetPioReadCnt(pPio, MSGBUFLEN);
break;
case TIMESFSTYPE:
SetPioReadHeadCnt(pPio, SFMSGBUFLEN);
SetPioReadCnt(pPio, SFMSGBUFLEN);
break;
}
break;
case INFO_POLL: // normal polling
switch (GetRtuType(pReqMsg->pRtu)) {
case TIMERWSTYPE:
SetPioReadHeadCnt(pPio, MSGBUFLEN);
SetPioReadCnt(pPio, MSGBUFLEN);
break;
case TIMESFSTYPE:
SetPioReadHeadCnt(pPio, SFMSGBUFLEN);
SetPioReadCnt(pPio, SFMSGBUFLEN);
break;
}
break;
default:
printf( "PollMarshall(), Unexpected Cmd: %d\n", pReqMsg->FuncCode);
break;
}
memcpy(GetPioUserDefMsg(pPio), pReqMsg, sizeof(REQUEST_MSGS) );
SetPioWriteCnt(pPio, 0);
SetPioWriteOffset(pPio, 0);
SetPioReadOffset(pPio, 0);
SetPioReadFixupCnt(pPio, 0);
}
BOOL PollUnmarshall(CPio *pPio, int ioStream)
{
BYTE *p_buf;
char *ptr = NULL;
char strbuf[8];
UINT value, timdelta;
FILETIME filtim, locfiltim;
SYSTEMTIME sTime, locTime;
REQUEST_MSGS *sendInfo = (REQUEST_MSGS*)GetPioUserDefMsg(pPio);
p_buf = GetPioReadBuf(pPio);
if ( GetPioRecvStatus(pPio) == PIO__SUCCESS ) {
// write data to debug buffer if rtu in debug mode
SetPioRtuDbgInMsg(pPio, sendInfo->pRtu);
switch(GetRtuType(sendInfo->pRtu)) {
case TIMERWSTYPE:
if (GetPioReadMsgCnt(pPio) == MSGBUFLEN &&
p_buf[0] == 'S') {
if (p_buf[1] == 'T' &&
p_buf[16] == 'A') { // get date & time message
memcpy(strbuf, &p_buf[12], 4);
strbuf[4] = '\0';
sTime.wYear = atoi(strbuf);
memcpy(strbuf, &p_buf[10], 2);
strbuf[2] = '\0';
sTime.wMonth = atoi(strbuf);
memcpy(strbuf, &p_buf[8], 2);
strbuf[2] = '\0';
sTime.wDay = atoi(strbuf);
memcpy(strbuf, &p_buf[2], 2);
strbuf[2] = '\0';
sTime.wHour = atoi(strbuf);
memcpy(strbuf, &p_buf[4], 2);
strbuf[2] = '\0';
sTime.wMinute = atoi(strbuf);
memcpy(strbuf, &p_buf[6], 2);
strbuf[2] = '\0';
sTime.wSecond = atoi(strbuf);
sTime.wMilliseconds = 0;
SystemTimeToFileTime( &sTime, &filtim );
LocalFileTimeToFileTime( &filtim, &filtim );
// get local cpu's file time
GetSystemTimeAsFileTime( &locfiltim );
// get time difference
if (CompareFileTime(&filtim, &locfiltim ) > 0) {
timdelta = (UINT)((((ULARGE_INTEGER *)&filtim)->QuadPart -
((ULARGE_INTEGER *)&locfiltim)->QuadPart) / 10000000);
}
else {
timdelta = (UINT)((((ULARGE_INTEGER *)&locfiltim)->QuadPart -
((ULARGE_INTEGER *)&filtim)->QuadPart) / 10000000);
}
// correct local time if inside setting range
if (timdelta >= TIME_DRIFT && timdelta < TIME_LIMIT) {
FileTimeToSystemTime( &filtim, &locTime );
SetOnlSysTime( &locTime );
}
}
if (p_buf[17] == 'F' &&
p_buf[28] == 'B') { // get date & time message
memcpy(strbuf, &p_buf[24], 4);
strbuf[4] = '\0';
value = atoi(strbuf);
UpdRtuIntData(sendInfo->pRtu, 0, 0, value, 1);
}
// clear polling flag for next polling
ClrRtuPollSts(sendInfo->pRtu);
ClrPioRtuStream(ioStream);
return TRUE;
}
SetPioRecvStatus(pPio, PIO__BYTECNT_MISMATCH);
break;
case TIMESFSTYPE:
if (GetPioReadMsgCnt(pPio) == SFMSGBUFLEN){
if(p_buf[0] == 0x00 && p_buf[1] == 0xff
&& p_buf[2] == 0x81) {
sTime.wYear = p_buf[3] + 2000;
sTime.wMonth = p_buf[4];
sTime.wDay = p_buf[5];
sTime.wHour = p_buf[6];
sTime.wMinute = p_buf[7];
sTime.wSecond = p_buf[8];
sTime.wMilliseconds = 0;
SystemTimeToFileTime( &sTime, &filtim );
LocalFileTimeToFileTime( &filtim, &filtim );
// get local cpu's file time
GetSystemTimeAsFileTime( &locfiltim );
// get time difference
if (CompareFileTime(&filtim, &locfiltim ) > 0) {
timdelta = (UINT)((((ULARGE_INTEGER *)&filtim)->QuadPart -
((ULARGE_INTEGER *)&locfiltim)->QuadPart) / 10000000);
}
else {
timdelta = (UINT)((((ULARGE_INTEGER *)&locfiltim)->QuadPart -
((ULARGE_INTEGER *)&filtim)->QuadPart) / 10000000);
}
// correct local time if inside setting range
if (timdelta >= TIME_DRIFT && timdelta < TIME_LIMIT) {
FileTimeToSystemTime( &filtim, &locTime );
SetOnlSysTime( &locTime );
}
}
// clear polling flag for next polling
ClrRtuPollSts(sendInfo->pRtu);
ClrPioRtuStream(ioStream);
return TRUE;
}
SetPioRecvStatus(pPio, PIO__BYTECNT_MISMATCH);
default:
break;
}
}
// clear polling flag for next polling
ClrRtuPollSts(sendInfo->pRtu);
ClrPioRtuStream(ioStream);
SetPioComState(pPio, TRUE);
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -