升龙物业 老版本 ocx IPO, 加密狗 转值班电话

DevSpan.cpp 5.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. #include "StdAfx.h"
  2. #include "DevSpan.h"
  3. #include "SpanChannel.h"
  4. CDevSpan::CDevSpan(DEV_RES_NO_TYPE NodeNo, DEV_RES_NO_TYPE BoardNo) : CDevResource(NodeNo, BoardNo), m_MixCap(MIXCAP_NON), m_ChannelCount(0)
  5. {
  6. }
  7. CDevSpan::~CDevSpan(void)
  8. {
  9. close();
  10. }
  11. /*****************************************************************
  12. **【函数名称】 __openMix
  13. **【函数功能】 打开混音器
  14. **【参数】
  15. **【返回值】
  16. ****************************************************************/
  17. bool CDevSpan::__openMix( MIX_TYPE MixTp )
  18. {
  19. if(m_MixCap == MIXCAP_NORMAL)
  20. {
  21. MIX_PARAM set_mix_param;
  22. set_mix_param.ucMixType = MixTp;
  23. memset(set_mix_param.ucUnmixTimeSlot, 0xff, sizeof(set_mix_param.ucUnmixTimeSlot));
  24. return ISX_sr_SetMixParm(m_NodeNo, m_BoardNo, BT_TRUNK, &set_mix_param) == 0;
  25. }
  26. return false;
  27. }
  28. /*****************************************************************
  29. **【函数名称】 __getSpan
  30. **【函数功能】 获取指定SPAN
  31. **【参数】
  32. **【返回值】
  33. ****************************************************************/
  34. CDevSpan::CSpan* CDevSpan::__getSpan( DEV_RES_NO_TYPE SpanNo, bool NewWhenNull /*= false*/ )
  35. {
  36. ASSERT(SpanNo >= 0);
  37. if(SpanNo >= 0 && SpanNo < m_SpanList.GetCount())
  38. return m_SpanList[SpanNo];
  39. // 查不到指定SPAN,则新建一个
  40. if(NewWhenNull)
  41. {
  42. CSpan* pSpan = new CSpan;
  43. ASSERT(pSpan != NULL);
  44. m_SpanList.Add(pSpan);
  45. return pSpan;
  46. }
  47. else
  48. return NULL;
  49. }
  50. /*****************************************************************
  51. **【函数名称】 __freeSpan
  52. **【函数功能】 删除指定SPAN
  53. **【参数】
  54. **【返回值】
  55. ****************************************************************/
  56. bool CDevSpan::__freeSpan( DEV_RES_NO_TYPE SpanNo )
  57. {
  58. if(SpanNo >= 0 && SpanNo < m_SpanList.GetCount())
  59. {
  60. CSpan* pSpan = m_SpanList[SpanNo];
  61. pSpan->close();
  62. delete pSpan;
  63. m_SpanList.RemoveAt(SpanNo);
  64. return true;
  65. }
  66. else return false;
  67. }
  68. /*****************************************************************
  69. **【函数名称】 __freeSpan
  70. **【函数功能】 删除SPAN
  71. **【参数】
  72. **【返回值】
  73. ****************************************************************/
  74. void CDevSpan::__freeSpan( void )
  75. {
  76. for(int i = 0; i < m_SpanList.GetCount(); ++i)
  77. {
  78. CSpan* pSpan = m_SpanList[i];
  79. pSpan->close();
  80. delete pSpan;
  81. }
  82. m_SpanList.RemoveAll();
  83. }
  84. /*****************************************************************
  85. **【函数名称】 open
  86. **【函数功能】 span设备打开函数
  87. **【参数】
  88. **【返回值】
  89. ****************************************************************/
  90. bool CDevSpan::open( DEV_RES_NO_TYPE SpanNo )
  91. {
  92. if(m_MixCap == MIXCAP_NON)
  93. {
  94. SPEC_CAP spec_cap;
  95. if(ISX_sr_GetSpecCap(m_NodeNo, m_BoardNo, BT_TRUNK, &spec_cap) == 0)
  96. m_MixCap = (MIX_CAP)spec_cap.Span.ucMixCap;
  97. if(!__openMix(MIXTYPE_RECORD))
  98. LOGGER(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{DevSpan}: 数字中继板[%d-%d]混音打开失败"), m_NodeNo, m_BoardNo);
  99. }
  100. CSpan* pSpan = __getSpan(SpanNo, true);
  101. ASSERT(pSpan != NULL);
  102. if(pSpan->channelCount() > 0)
  103. return false;
  104. int ChanCount = pSpan->open(m_NodeNo, m_BoardNo, SpanNo);
  105. m_ChannelCount += ChanCount;
  106. LOGGER(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{DevSpan}: 数字中继板[%d-%d-%d]成功打开%d条通道"), m_NodeNo, m_BoardNo, SpanNo, ChanCount);
  107. return ChanCount == DEVICE_SPAN_CAPACITY;
  108. }
  109. /*****************************************************************
  110. **【函数名称】 close
  111. **【函数功能】 span设备关闭函数
  112. **【参数】
  113. **【返回值】
  114. ****************************************************************/
  115. void CDevSpan::close( void )
  116. {
  117. __openMix(MIXTYPE_NULL);
  118. __freeSpan();
  119. LOGGER(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{DevSpan}: 数字中继板[%d-%d]通道全部关闭"), m_NodeNo, m_BoardNo);
  120. }
  121. /*****************************************************************
  122. **【函数名称】 close
  123. **【函数功能】 span设备关闭函数
  124. **【参数】
  125. **【返回值】
  126. ****************************************************************/
  127. void CDevSpan::close( DEV_RES_NO_TYPE SpanNo )
  128. {
  129. if(__freeSpan(SpanNo))
  130. LOGGER(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{DevSpan}: 数字中继板[%d-%d]SPAN[%d]通道全部关闭"), m_NodeNo, m_BoardNo, SpanNo);
  131. else
  132. LOGGER(LOG_CLASS_DEV, LOG_LEVEL_WARNING, _T("{DevSpan}: 数字中继板[%d-%d]SPAN[%d]通道关闭失败, 未找到对应资源"), m_NodeNo, m_BoardNo, SpanNo);
  133. }
  134. /*****************************************************************
  135. **【函数名称】 getFreeSpanCh
  136. **【函数功能】 获取空闲通道
  137. **【参数】
  138. **【返回值】
  139. ****************************************************************/
  140. CSpanChannel* CDevSpan::getFreeSpanCh( void )
  141. {
  142. CSingleLock locker(&m_LockSection);
  143. locker.Lock(); // 本操作需锁定
  144. for(int i = 0; i < m_SpanList.GetCount(); ++i)
  145. {
  146. CSpanChannel* pChannel = m_SpanList[i]->getFreeSpanCh();
  147. if(pChannel != NULL)
  148. return pChannel;
  149. }
  150. return NULL;
  151. }
  152. /*****************************************************************
  153. **【函数名称】 getFreeSpanCh
  154. **【函数功能】 获取空闲通道
  155. **【参数】
  156. **【返回值】
  157. ****************************************************************/
  158. CSpanChannel* CDevSpan::getFreeSpanCh( int SpanNo )
  159. {
  160. CSingleLock locker(&m_LockSection);
  161. locker.Lock(); // 本操作需锁定
  162. CSpan* pSpan = __getSpan(SpanNo);
  163. ASSERT(pSpan != NULL);
  164. if(pSpan != NULL)
  165. return pSpan->getFreeSpanCh();
  166. else
  167. return NULL;
  168. }
  169. /*****************************************************************
  170. **【函数名称】 findChan
  171. **【函数功能】 获取指定通道
  172. **【参数】
  173. **【返回值】
  174. ****************************************************************/
  175. CSpanChannel* CDevSpan::findChan( DEV_RES_NO_TYPE SpanNo, int ResId )
  176. {
  177. CSpan* pSpan = __getSpan(SpanNo);
  178. ASSERT(pSpan != NULL);
  179. if(pSpan != NULL)
  180. return pSpan->findChan(ResId);
  181. else
  182. return NULL;
  183. }
  184. /*****************************************************************
  185. **【函数名称】 isOk
  186. **【函数功能】 判断设备状态
  187. **【参数】
  188. **【返回值】
  189. ****************************************************************/
  190. bool CDevSpan::isOk( void ) const
  191. {
  192. return (m_state == STATUS_WORKING && (m_ChannelCount == m_SpanList.GetCount() * DEVICE_SPAN_CAPACITY));
  193. }