组件

PduDataFormat.cpp 3.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. #include "StdAfx.h"
  2. #include "PduDataFormat.h"
  3. #include "PduLinkInc.h"
  4. #include "PduDataFormatOne.h"
  5. CPduDataFormat* CPduDataFormat::m_pInstance = NULL;
  6. CPduDataFormat::CPduDataFormat(void)
  7. {
  8. ZeroMemory(m_pDataFormatArray, PDU_MAX_CMD_COUNT*sizeof(long));
  9. }
  10. CPduDataFormat::~CPduDataFormat(void)
  11. {
  12. UnLoad();
  13. if(NULL != m_pInstance)
  14. delete m_pInstance;
  15. }
  16. /*****************************************************************
  17. **【函数名称】 getInstance
  18. **【函数功能】 得到接口指针
  19. **【参数】
  20. **【返回值】
  21. ****************************************************************/
  22. CPduDataFormat* CPduDataFormat::getInstance()
  23. {
  24. if(NULL == m_pInstance)
  25. {
  26. m_pInstance = new CPduDataFormat();
  27. } // end if
  28. return m_pInstance;
  29. }
  30. /*****************************************************************
  31. **【函数名称】 Load
  32. **【函数功能】 从配置文件中读取PDU数据格式配置信息
  33. **【参数】 a_lpFileName 配置文件名
  34. **【返回值】
  35. ****************************************************************/
  36. BOOL CPduDataFormat::Load(LPCTSTR a_lpFileName)
  37. {
  38. // 读取配置文件头
  39. int nTotalCount = GetPrivateProfileInt("Head", "TotalCount", 0, a_lpFileName);
  40. ASSERT(nTotalCount != 0);
  41. // 读取配置文件内容
  42. for(int i=0; i<nTotalCount; i++)
  43. {
  44. // 读取单个命令的配置信息
  45. CHAR szAppName[32];
  46. ZeroMemory(szAppName, 32);
  47. sprintf_s(szAppName, 32, "PDU_CMD_FORMAT_%03d", i);
  48. // 生成PDU命令格式解析类
  49. int nCmdType = GetPrivateProfileInt(szAppName, "CmdType", 0, a_lpFileName); // 命令类型
  50. CPduDataFormatOne* pFormat = new CPduDataFormatOne((PDU_CMD_TYPE)nCmdType);
  51. // 生成元数据内容
  52. int nDataCount = GetPrivateProfileInt(szAppName, "DataCount", 0, a_lpFileName); // 元数据条数
  53. for(int j=0; j<nDataCount; j++)
  54. {
  55. // 得到Key值
  56. CHAR szKey[32];
  57. ZeroMemory(szKey, 32);
  58. sprintf_s(szKey, 32, "DATA[%d]", j);
  59. // 填充元数据条目
  60. CHAR szMemo[256];
  61. ZeroMemory(szMemo, 256);
  62. GetPrivateProfileString(szAppName, szKey, "0|0|null|0", szMemo, 256, a_lpFileName);
  63. pFormat->InsertDataMemo(j, szMemo);
  64. } // end for(DataCount)
  65. // 保存当前命令解析
  66. m_pDataFormatArray[nCmdType] = pFormat;
  67. } // end for(TotalCount)
  68. return TRUE;
  69. }
  70. void CPduDataFormat::UnLoad()
  71. {
  72. for (int i = 0; i < PDU_MAX_CMD_COUNT; i++)
  73. {
  74. if (m_pDataFormatArray[i] != NULL)
  75. {
  76. delete m_pDataFormatArray[i];
  77. m_pDataFormatArray[i] = NULL;
  78. }
  79. }
  80. }
  81. /*****************************************************************
  82. **【函数名称】 Load
  83. **【函数功能】 从数据库中读取PDU数据格式配置信息
  84. **【参数】
  85. **【返回值】
  86. ****************************************************************/
  87. BOOL CPduDataFormat::Load()
  88. {
  89. return FALSE;
  90. }
  91. /*****************************************************************
  92. **【函数名称】 Clone
  93. **【函数功能】 拷贝一个指定命令的副本
  94. **【参数】 a_nCmdType 命令类型
  95. a_pCloned 命令副本
  96. **【返回值】
  97. ****************************************************************/
  98. CPduDataFormatOne* CPduDataFormat::Clone(PDU_CMD_TYPE a_nCmdType)
  99. {
  100. // 命令格式定义
  101. if(a_nCmdType >= PDU_MAX_CMD_COUNT) return NULL;
  102. CPduDataFormatOne* pSource = m_pDataFormatArray[a_nCmdType];
  103. if(pSource == NULL) return NULL;
  104. // 生成副本
  105. CPduDataFormatOne* pDest = new CPduDataFormatOne(a_nCmdType);
  106. for(int i=0; i<PDU_CMD_MAX_DATA_COUNT; i++)
  107. {
  108. if(pSource->m_pDataMemoArray[i] == NULL) break;
  109. // 拷贝数据
  110. PduDataMemo* pDataMemo = new PduDataMemo;
  111. memcpy(pDataMemo, pSource->m_pDataMemoArray[i], sizeof(PduDataMemo));
  112. pDest->m_pDataMemoArray[i] = pDataMemo;
  113. } // end for
  114. return pDest;
  115. }