/************************************************************************* 【文件名】 DevSpan.h 【功能模块和目的】 数字中继通道管理类头文件 【开发者及日期】 郑石诺 2015/03/09 【版本】 V1.0.0 【版权信息】 Copyright (C)2015 河南华谊网络科技有限公司 【更改记录】 *************************************************************************/ #pragma once #include "DevResource.h" #include "SpanChannel.h" #include "MC.h" /************************************************************************* 【类名】 CDevSpan 【功能】 【接口说明】 数字中继通道管理类 【开发者及日期】 郑石诺 2015/03/09 【版本】 V1.0.0 【版权信息】 Copyright (C)2015 河南华谊网络科技有限公司 【更改记录】 *************************************************************************/ class CDevSpan : public CDevResource { private: class CSpan { public: CSpan(void) : m_CurPos(0) {} ~CSpan(void) {} int channelCount(void) const { return m_SpanChList.GetCount(); } int open(DEV_RES_NO_TYPE NodeNo, DEV_RES_NO_TYPE BoardNo, DEV_RES_NO_TYPE SpanNo) { m_CurPos = 0; for(int i = 1; i < 31; i++) { CSpanChannel* pChannel = new CSpanChannel(i, SpanNo, NodeNo, BoardNo); ASSERT(pChannel != NULL); if(pChannel != NULL) { if(pChannel->open()) { m_SpanChList.Add(pChannel); CMC::GetInstance().onDevResCreate(pChannel->id()); } else delete pChannel; } } return m_SpanChList.GetCount(); } void close(void) { for(int i = 0; i < m_SpanChList.GetCount(); ++i) { CSpanChannel* pChannel = m_SpanChList[i]; ASSERT(pChannel != NULL); CMC::GetInstance().onDevResDestroy(pChannel->id()); pChannel->close(); delete pChannel; } m_SpanChList.RemoveAll(); m_CurPos = 0; } CSpanChannel* getFreeSpanCh(void) { for(int i = 0; i < m_SpanChList.GetCount(); ++i) // 保证遍历一轮 { if(m_CurPos >= m_SpanChList.GetCount()) m_CurPos = 0; CSpanChannel* pChannel = m_SpanChList[m_CurPos++]; ASSERT(pChannel != NULL); // 当前外线是否空闲 if(pChannel->isValid() && pChannel->isFree()) return pChannel; } return NULL; } CSpanChannel* findChan(int ResId) { if(ResId > 0 && ResId < 31) return m_SpanChList[ResId - 1]; else return NULL; } private: CArray m_SpanChList; int m_CurPos; }; public: CDevSpan(DEV_RES_NO_TYPE NodeNo, DEV_RES_NO_TYPE BoardNo); virtual ~CDevSpan(void); MIX_CAP mixCapacity(void) const { return m_MixCap; } int channelCount(void) const { return m_ChannelCount; } bool open(void) { return false; } bool open(DEV_RES_NO_TYPE SpanNo); void close(void); void close(DEV_RES_NO_TYPE SpanNo); bool isOk(void) const; CSpanChannel* getFreeSpanCh(void); CSpanChannel* getFreeSpanCh(int SpanNo); CSpanChannel* findChan(DEV_RES_NO_TYPE SpanNo, int ResId); private: bool __openMix(MIX_TYPE MixTp); CDevSpan::CSpan* __getSpan(DEV_RES_NO_TYPE SpanNo, bool NewWhenNull = false); bool __freeSpan(DEV_RES_NO_TYPE SpanNo); void __freeSpan(void); private: MIX_CAP m_MixCap; int m_ChannelCount; CArray m_SpanList; };