// RtuProcess.cpp: implementation of the CRtuProcess class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "rtugprs.h"
#include "RtuProcess.h"
#include "DataType.h"
#include "MainFrm.h"
#include "Tools.h"
#include "PaintView.h"
#include "SQLMng.h"
//#include <afxsock.h>
#include "CVsp.h"
#include "WellClass.h"
#include "CanSock.h"
#include "TcpServer.h"
//#include "cstringt.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CRtuProcess::CRtuProcess(CWnd *pWnd)
{
    m_CJSJ=0;
    m_pParent=pWnd;
    m_nRtuID=0;
    //*********************************包类型初始化******************************************
    m_pRTUStaticInfo=NULL;
    m_pRtuRunCnt=NULL;
    m_pCardPacket=NULL;
    m_pRealData=NULL;
    m_pDynInfo=NULL;
    m_pElecPack=NULL;
    m_nDeviceCnt=NULL;
    m_nDeviceByte=NULL;
    m_nByteCnt=NULL;
    m_bSendConf=FALSE;
    m_nRealCnt=0;
    m_nStaticCnt=0;
    m_nDynCnt=0;
    m_nRunCnt=0;
    m_nCardCnt=0;
    m_nElecCnt=0;
    memset(m_pWellTime,0,sizeof(m_pWellTime));
    memset(m_sBuf,0,sizeof(m_sBuf));
    ZeroMemory(m_sBufUpData,sizeof(m_sBufUpData));
    m_nUpData=0;
    for (int i=0;i<4;i++)
    {
        m_pWellCalss[i]=NULL;
    }
    //    memset(m_Device,0,sizeof(m_Device));
}

CRtuProcess::~CRtuProcess()
{
    int i;
    for (i=0;i<4;i++)
    {
        if (m_pWellCalss[i]!=NULL)
        {
            delete m_pWellCalss[i];
            m_pWellCalss[i]=NULL;
        }
    }
    
    if (m_pRTUStaticInfo!=NULL)
    {
        for(i=0;i<MAXBYTE;i++)
        {
            if (m_pRTUStaticInfo->ArrayGTBaseInfo[i]!=NULL)
            {
                delete [] m_pRTUStaticInfo->ArrayGTBaseInfo[i];
                m_pRTUStaticInfo->ArrayGTBaseInfo[i]=NULL;
            }    
            
        }
        delete m_pRTUStaticInfo;
        m_pRTUStaticInfo=NULL;
    }
    if (m_pRtuRunCnt!=NULL)
    {
        for(i=0;i<MAXBYTE;i++)
        {
            if(m_pRtuRunCnt->ArrayEquipStatue[i]!=NULL)
            {
                delete m_pRtuRunCnt->ArrayEquipStatue[i];
                m_pRtuRunCnt->ArrayEquipStatue[i]=NULL;
            }
        }
        delete m_pRtuRunCnt;
        m_pRtuRunCnt=NULL;
    }
    if (m_pCardPacket!=NULL)
    {
        
        delete m_pCardPacket;
        m_pCardPacket=NULL;
    }
    if (m_pDynInfo!=NULL)
    {
        for(i=0;i<4;i++)
        {
            if(m_pDynInfo->DynConf.ArraryWellConf[i]!=NULL)
            {
                delete m_pDynInfo->DynConf.ArraryWellConf[i];
                m_pDynInfo->DynConf.ArraryWellConf[i]=NULL;
            }
        }   
        
        for(i=0;i<4;i++)
        {
            if(m_pDynInfo->DeviceMapping.ArrayWell[i]!=NULL)
            {
                for(int j=0;j<8;j++)
                {
                    if (m_pDynInfo->DeviceMapping.ArrayWell[i]->ArrayDevice[j]!=NULL)
                    {
                        delete m_pDynInfo->DeviceMapping.ArrayWell[i]->ArrayDevice[j];
                        m_pDynInfo->DeviceMapping.ArrayWell[i]->ArrayDevice[j]=NULL;
                    }
                }
                //    m_pDynInfo->DeviceMapping.ArrayWell[i]->ArrayDevice[j]
                delete m_pDynInfo->DeviceMapping.ArrayWell[i];
                m_pDynInfo->DeviceMapping.ArrayWell[i]=NULL;
            }
        } 
        delete m_pDynInfo;
        m_pDynInfo=NULL;
    }
    if (m_pRealData!=NULL)
    {
        delete m_pRealData;
        m_pRealData=NULL;
    }
    if (m_pElecPack!=NULL)
    {
        delete  m_pElecPack;
        m_pElecPack=NULL;
    }
    for(i=0;i<4;i++)
    {
        if (m_pWellTime[i]!=NULL)
        {
            delete m_pWellTime[i];
            m_pWellTime[i]=NULL;
        }
    }
}
void CRtuProcess::AcceptData(char *buf,int nLen)
{
/*    if(m_pDynInfo!=NULL)
{
if(m_pDynInfo->uPacketType!=0xB1)
{
m_pDynInfo=NULL;
memset(m_pWellCalss,0,sizeof(m_pWellCalss));
}
}*/
    int nSer=sizeof(sockaddr_in);
    memcpy((char *)&m_Server,buf,nSer);
    CMainFrame *pMain=(CMainFrame *)m_pParent;
    if (m_bSendConf==TRUE)
    {
        pMain->ResposeConf(buf+4+nSer,m_nDynConf+2,m_Server,0x10,m_bufDynConf);
    }
    /*    if (m_sBuf!="")
    {
    if (MAKEWORD(*(buf+nLen-1),*(buf+nLen-2))==MAKEWORD(*(m_sBuf+m_nBuf-1),*(m_sBuf+m_nBuf-2)))
    {
    return ;
    }
    }
    */
    
    
    int i=0;
    m_nRtuID=CTools::CharToInt((unsigned char *)buf+4+nSer,8);
    memset(m_sBuf,0,sizeof(m_sBuf));
    memcpy(m_sBuf,buf+nSer,nLen);
    m_nBuf=nLen;
    BYTE a=m_sBuf[0];

    //****************************升级程序*************************    
    if (a!=0xE0 && m_nUpData!=NULL)
    {
        ((CMainFrame *)m_pParent)->m_pSock->Send((unsigned char *)m_sBufUpData,m_nUpData,m_Server);
    }
    //*************************************************************
    if (a!=RTU_PACKTYPE_STATICINFO && m_pRTUStaticInfo==NULL)
    {
        ((CMainFrame *)m_pParent)->Response(m_sBuf+4,0,m_Server,0x02);
        return;
    }
    if (m_pRTUStaticInfo!=NULL)
    {
        if (a!=RTU_PACKTYPE_DYNINFO && m_pDynInfo==NULL)
        {
            ((CMainFrame *)m_pParent)->Response(m_sBuf+4,0,m_Server,0x20);
            return;
        }
    }
    
    switch(a)
    {
    case RTU_PACKTYPE_EXTENSION:
        break;
        
    case RTU_PACKTYPE_STATICINFO:
        m_nStaticCnt++;
        if(AnalysisStaticInfo()==FALSE)
        {
        /*    if (m_pRTUStaticInfo!=NULL)
        {
        for(i=0;i<MAXBYTE;i++)
        {
        if (m_pRTUStaticInfo->ArrayGTBaseInfo[i]!=NULL)
        {
        delete [] m_pRTUStaticInfo->ArrayGTBaseInfo[i];
        m_pRTUStaticInfo->ArrayGTBaseInfo[i]=NULL;
        }    
        
          }
          delete m_pRTUStaticInfo;
          m_pRTUStaticInfo=NULL;
        }*/
            ;
        }
        
        break;
        
    case RTU_PACKTYPE_DYNINFO:
        m_nDynCnt++;
        if(AnalysisDynInfo()==FALSE)
        {
            if (m_pDynInfo!=NULL)
            {
                for(i=0;i<4;i++)
                {
                    if(m_pDynInfo->DynConf.ArraryWellConf[i]!=NULL)
                    {
                        delete m_pDynInfo->DynConf.ArraryWellConf[i];
                        m_pDynInfo->DynConf.ArraryWellConf[i]=NULL;
                    }
                }   
                
                for(i=0;i<4;i++)
                {
                    if(m_pDynInfo->DeviceMapping.ArrayWell[i]!=NULL)
                    {
                        for(int j=0;j<8;j++)
                        {
                            if (m_pDynInfo->DeviceMapping.ArrayWell[i]->ArrayDevice[j]!=NULL)
                            {
                                delete m_pDynInfo->DeviceMapping.ArrayWell[i]->ArrayDevice[j];
                                m_pDynInfo->DeviceMapping.ArrayWell[i]->ArrayDevice[j]=NULL;
                            }
                        }
                        //    m_pDynInfo->DeviceMapping.ArrayWell[i]->ArrayDevice[j]
                        delete m_pDynInfo->DeviceMapping.ArrayWell[i];
                        m_pDynInfo->DeviceMapping.ArrayWell[i]=NULL;
                    }
                } 
                delete m_pDynInfo;
                m_pDynInfo=NULL;
            }
        }
        
        //        a=1000;
        break;
        
    case RTU_PACKTYPE_RESPONSE:
        break;
        
    case RTU_PACKTYPE_LONGDATA:
        AnalysisUpdata();
        break;
        
    case RTU_PACKTYPE_RUNCNT:
        m_nRunCnt++;
        AnalysisRunCnt();
        break;
        
    case RTU_PACKTYPE_TESTDATA:
        m_nRealCnt++;
        AnalysisRealData();
        break;
        
    case RTU_PACKTYPE_CARD:
        m_nCardCnt++;
        AnalysisCardsPacket();
        break;
        
    case RTU_PACKTYPE_ELECPARA:
        m_nElecCnt++;
        AnalysisElecPacket();
        break;
        
    case RTU_PACKTYPE_SCREW:
        break;
        
    case RTU_PACKTYPE_INJECTION:
        break;
        
    default: 
        break;
    }
    
    return;
}

BOOL CRtuProcess::AnalysisStaticInfo()
{
    //**************************解析*****************************************
    CString msg="";
    CString hexTostr="";
    char *pData=(char*)m_sBuf;
    int nTolStatic=0;
    if (m_pRTUStaticInfo==NULL)
    {
        m_pRTUStaticInfo=new CRTUStaticInfo;
        memset(m_pRTUStaticInfo,0,sizeof(CRTUStaticInfo));
    }
    CTools::WriteLog("1",1,"Static26");
    //
    m_pRTUStaticInfo->uPacketType=*pData++;
    nTolStatic++;
    m_pRTUStaticInfo->uPacketLen=CTools::CharToInt((unsigned char *)pData,2);
    pData+=2;
    nTolStatic+=2;
    m_pRTUStaticInfo->uVersion=*(pData++);
    nTolStatic++;
    m_pRTUStaticInfo->uRTUPhysicAddr=CTools::CharToInt((unsigned char *)pData,8);
    pData+=8;
    nTolStatic+=8;
    m_pRTUStaticInfo->uPackageTime=CTools::CharToInt((unsigned char *)pData,4);
    pData+=4;
    nTolStatic+=4;
    m_pRTUStaticInfo->uDeviceCnt=*(pData++);
    nTolStatic++;
    if(m_pRTUStaticInfo->uDeviceCnt>18)
    {
        //        memset(m_pRTUStaticInfo,0,size);
        return false;
    }
    //    m_pRTUStaticInfo->uDeviceSN=*(pData++);
    //    m_pRTUStaticInfo->uDeviceLen=*(pData++);
    int i;
    for(i=0;i<m_pRTUStaticInfo->uDeviceCnt;i++)
    {
        int nTolDevLen=0;
        if (m_pRTUStaticInfo->ArrayGTBaseInfo[i]==NULL)
        {
            m_pRTUStaticInfo->ArrayGTBaseInfo[i]=new CGTBaseInfo;
            memset(m_pRTUStaticInfo->ArrayGTBaseInfo[i],0,sizeof(CGTBaseInfo));
        }
        m_pRTUStaticInfo->ArrayGTBaseInfo[i]->uDeviceSN=*(pData++);
        nTolDevLen++;
        m_pRTUStaticInfo->ArrayGTBaseInfo[i]->uDeviceLen=*(pData++);
        nTolDevLen++;
        m_pRTUStaticInfo->ArrayGTBaseInfo[i]->uGTPhysicAddr=CTools::CharToInt((unsigned char *)pData,8);
        pData+=8;
        nTolDevLen+=8;
        m_pRTUStaticInfo->ArrayGTBaseInfo[i]->uModel=CTools::CharToInt((unsigned char *)pData,2);
        pData+=2;
        nTolDevLen+=2;
        m_pRTUStaticInfo->ArrayGTBaseInfo[i]->uInstrumentationType=*(pData++);
        nTolDevLen++;
        //        m_pRTUStaticInfo->ArrayGTBaseInfo[i]->uDataType=*(pData++);
        memcpy(m_pRTUStaticInfo->ArrayGTBaseInfo[i]->sModelCode,pData,8);
        pData+=8;
        nTolDevLen+=8;
        m_pRTUStaticInfo->ArrayGTBaseInfo[i]->uSN=CTools::CharToInt((unsigned char *)pData,4);
        pData+=4;
        nTolDevLen+=4;
        m_pRTUStaticInfo->ArrayGTBaseInfo[i]->uFirmwareVS=CTools::CharToInt((unsigned char *)pData,2);
        pData+=2;
        nTolDevLen+=2;
        m_pRTUStaticInfo->ArrayGTBaseInfo[i]->uSoftwareVS=CTools::CharToInt((unsigned char *)pData,2);
        pData+=2;
        nTolDevLen+=2;
        m_pRTUStaticInfo->ArrayGTBaseInfo[i]->uRange=CTools::CharToInt((unsigned char *)pData,2);
        pData+=2;
        nTolDevLen+=2;
        m_pRTUStaticInfo->ArrayGTBaseInfo[i]->uAccuracy=CTools::CharToInt((unsigned char *)pData,2);
        pData+=2;
        nTolDevLen+=2;
        m_pRTUStaticInfo->ArrayGTBaseInfo[i]->uLowOperatingTemperature=*(pData++);
        nTolDevLen++;
        m_pRTUStaticInfo->ArrayGTBaseInfo[i]->uHighOperatingTemperature=*(pData++);
        nTolDevLen++;
        //        m_pRTUStaticInfo->ArrayGTBaseInfo[i]->uReserve=*(pData++);
        m_pRTUStaticInfo->ArrayGTBaseInfo[i]->uProLev=*(pData++);
        nTolDevLen++;
        memcpy(m_pRTUStaticInfo->ArrayGTBaseInfo[i]->sExplosionLev,pData,8);
        pData+=8;
        nTolDevLen+=8;
        /*#define INSTRUTYPE_INTEGRATIONLOAD        0x01        //一体化负荷
        #define INSTRUTYPE_PRESS                0x02           //压力
        #define INSTRUTYPE_TEMP                    0x03           //温度
        #define INSTRUTYPE_ELEC                    0x04           //3相电参数
        #define INSTRUTYPE_SPEED                0x05        //转速
        #define INSTRUTYPE_FLOWMETER            0x06        //流量计
        #define INSTRUTYPE_VALVE                0x07        //调节阀
        #define INSTRUTYPE_TLSENSOR                0x08        //扭矩载荷传感器
        
          #define INSTRUTYPE_RTUEQ                0xf0        //RTU设备
#define INSTRUTYPE_HANDWRITE            0xf1           //手操器*/
        switch(m_pRTUStaticInfo->ArrayGTBaseInfo[i]->uInstrumentationType)
        {
        case 0x01:
            m_pRTUStaticInfo->ArrayGTBaseInfo[i]->nAidVarRange1=CTools::CharToInt((unsigned char *)pData,2);
            pData+=2;
            nTolDevLen+=2;
            m_pRTUStaticInfo->ArrayGTBaseInfo[i]->nAidVarAccuracy1=CTools::CharToInt((unsigned char *)pData,2);
            pData+=2;
            nTolDevLen+=2;
            break;
        case 0x02:
            break;
        case 0x03:
            break;
        case 0x04:
            m_pRTUStaticInfo->ArrayGTBaseInfo[i]->nAidVarRange1=CTools::CharToInt((unsigned char *)pData,2);
            pData+=2;
            nTolDevLen+=2;
            m_pRTUStaticInfo->ArrayGTBaseInfo[i]->nAidVarAccuracy1=CTools::CharToInt((unsigned char *)pData,2);
            pData+=2;
            nTolDevLen+=2;
            m_pRTUStaticInfo->ArrayGTBaseInfo[i]->nAidVarRange2=CTools::CharToInt((unsigned char *)pData,2);
            pData+=2;
            nTolDevLen+=2;
            m_pRTUStaticInfo->ArrayGTBaseInfo[i]->nAidVarAccuracy2=CTools::CharToInt((unsigned char *)pData,2);
            pData+=2;
            nTolDevLen+=2;
            m_pRTUStaticInfo->ArrayGTBaseInfo[i]->nAidVarRange3=CTools::CharToInt((unsigned char *)pData,2);
            pData+=2;
            nTolDevLen+=2;
            m_pRTUStaticInfo->ArrayGTBaseInfo[i]->nAidVarAccuracy3=CTools::CharToInt((unsigned char *)pData,2);
            pData+=2;
            nTolDevLen+=2;
            break;
        case 0x05:
            break;
        case 0x06:
            m_pRTUStaticInfo->ArrayGTBaseInfo[i]->nAidVarRange1=CTools::CharToInt((unsigned char *)pData,2);
            pData+=2;
            nTolDevLen+=2;
            m_pRTUStaticInfo->ArrayGTBaseInfo[i]->nAidVarAccuracy1=CTools::CharToInt((unsigned char *)pData,2);
            pData+=2;
            nTolDevLen+=2;
            break;
        case 0x07:
            break;
        case 0x08:
            m_pRTUStaticInfo->ArrayGTBaseInfo[i]->nAidVarRange1=CTools::CharToInt((unsigned char *)pData,2);
            pData+=2;
            nTolDevLen+=2;
            m_pRTUStaticInfo->ArrayGTBaseInfo[i]->nAidVarAccuracy1=CTools::CharToInt((unsigned char *)pData,2);
            pData+=2;
            nTolDevLen+=2;
            m_pRTUStaticInfo->ArrayGTBaseInfo[i]->nAidVarRange2=CTools::CharToInt((unsigned