//-------------------------------------------------------------------------
// 文件名 : msaunit.cpp
// 创建者 : xudongliang
// -------------------------------------------------------------------------
#include "common/include/msa_srppacket.h"
#include "common/include/srppacket.h"
#include "common/include/trppacket.h"
#include "common/include/i_semf.h"
#include "common/include/i_sets.h"
#include "common/include/aug4packet.h"
#include "logicunit/include/msaunit.h"
// -------------------------------------------------------------------------
MsaUnit::MsaUnit(IStation* uStation)
:Unit(uStation->GetUserId())
{
m_stm_n_type=1;
Vc4BufferPacketPointer=NULL;
Buffer_Vc4Packet=NULL;
InsertAlarmAuAisflag=false;
MsaAuAiscount=0;
InsertAlarmAuLopflag=false;
MsaAuLopcount=0;
InsertLopflag=0;
SetAlarm_MsaAuAis(false);
SetAlarm_MsaAuLop(false);
for(int hh=0;hh<4;hh++)
{
Up_Ptr[hh]=522;
Base_Pointer[hh]=522;
Down_Pointer[hh]=522;
Down_AuLopcount[hh]=0;
Adjust_Author_Count_Up[hh]=0;
Frame_count[hh]=0;
Frame_count_Up[hh]=0;
m_nNdf[hh]=0x06;
upSpeed[hh]=0;
m_station=uStation;
for(int i=0;i<2358;i++)
{
Au4BufferPacket[hh][i]=0x00;
}
for(int j=0;j<2349;j++)
{
Vc4BufferPacketCopy[hh][j]=0x00;
}
mSumUpSpeed[hh]=0;
for(int i=0;i<3;i++)
{
H3[hh][i]=0x00;
}
Next_Pointer_Ibit_turn[hh]=false;
Next_Pointer_Dbit_turn[hh]=false;
}
}
MsaUnit::~MsaUnit()
{
InsertAlarmAuAisflag=false;
MsaAuAiscount=0;
InsertAlarmAuLopflag=false;
MsaAuLopcount=0;
InsertLopflag=0;
SetAlarm_MsaAuAis(false);
SetAlarm_MsaAuLop(false);
}
E_DEVICE_TYPE MsaUnit::Type()
{
return e_DEVICE_UNIT_MSA;
}
void MsaUnit::Reset()
{
}
void MsaUnit::SetStmType(UInt8 uStmType)
{
m_stm_n_type=uStmType;
}
bool MsaUnit::__ProcessUpData(T_PACKET_MAP& sInPacket, Packet** psOutPacket)
{
if (sInPacket.empty())
{
RUNNING_OUTPUT("Msa Up running. Input Null.\n");
*psOutPacket = NULL;
return true;
}
if(m_stm_n_type==1)
{
if (sInPacket.find(0) != sInPacket.end() && sInPacket[0] == NULL)
{
*psOutPacket = NULL;
RUNNING_OUTPUT("Msa Up running. Input Null.\n");
return true;
}
}
else if(m_stm_n_type==4)
{
#define _CHECK_NULL(nIndex) ((sInPacket.find(nIndex) != sInPacket.end()) && (sInPacket[nIndex] == NULL))
if (_CHECK_NULL(0) && _CHECK_NULL(1) && _CHECK_NULL(2) && _CHECK_NULL(3))
{
*psOutPacket = NULL;
RUNNING_OUTPUT("Msa Up running. Input Null.\n");
return true;
}
}
//ISets* psSets=m_station->GetSets();
ISemf* psSemf=m_station->GetSemf();
SrpPacket* psInTempSrppacket=NULL;
psSemf->SendUpSrp(&psInTempSrppacket,this->Id()); //Semf发送S参考点数据包psInSrpPacket到该单元。
Msa_SrpPacket* psInSrpPacket=(Msa_SrpPacket*)psInTempSrppacket;
if(psInSrpPacket==NULL){
psInSrpPacket=new Msa_SrpPacket();
}
Msa_SrpPacket* psOutSrpPaceket=new Msa_SrpPacket();//准备往Semf发送的S参考点数据包psOutPacket,将在本处理函数返回前发到Semf。
psOutSrpPaceket->SetId(this->Id());
if(GetAlarm_MsaAuAis())
{
if(MsaAuAiscount>0)
{
MsaAuAiscount--;
InsertAlarmAuAisflag=true;
}
else if(MsaAuAiscount==0)
{
InsertAlarmAuAisflag=false;
SetAlarm_MsaAuAis(false);
}
}
if(GetAlarm_MsaAuLop())
{
if(MsaAuLopcount>0)
{
InsertLopflag=MsaAuLopcount+8;
MsaAuLopcount--;
}
else if(MsaAuLopcount==0)
{
SetAlarm_MsaAuLop(false);
}
}
if(InsertLopflag>0)
{
InsertAlarmAuLopflag=true;
InsertLopflag--;
}
else
{
InsertAlarmAuLopflag=false;
}
// Aug4Packet* UpOutPacket = new Aug4Packet();
for(int bb=0;bb<m_stm_n_type;bb++)
{
Au4Packet* psOutPacketAu4=new Au4Packet();
Vc4Packet* sInPackettt=(Vc4Packet*) sInPacket[bb];
psOutPacketAu4->SetFlowCount(sInPackettt->GetFlowCount());
psOutPacketAu4->SetTraceChannel(sInPackettt->GetTraceChannel());
psOutPacketAu4->SetTrace(sInPackettt->IsTrace());
psOutPacketAu4->SetColorR(sInPackettt->GetColorR());
psOutPacketAu4->SetColorG(sInPackettt->GetColorG());
psOutPacketAu4->SetColorB(sInPackettt->GetColorB());
if(Frame_count_Up[bb]==0)
{
//缓存通道倒换相位偏差测试数据
m_upLoiPhaseTestCounting = sInPackettt->GetLoiPhaseTestCounting();
// [3/28/2014 d]
for(int i=0;i<2349;i++)
Vc4BufferPacket[bb][i]=sInPackettt->Data()[i];
upSpeed[bb]=sInPackettt->GetSpeed();
Frame_count_Up[bb]=1;
*psOutPacket=NULL;
return true;
}
else if(Frame_count_Up[bb]==1)
{
//通道倒换测试数据vc4TOau4,同时更新缓冲区
psOutPacketAu4->SetLoiPhaseTestCounting(m_upLoiPhaseTestCounting);
m_upLoiPhaseTestCounting = sInPackettt->GetLoiPhaseTestCounting();
// [3/28/2014 d]
Vc4Packet*Vc4TempNextPacket=new Vc4Packet();
Vc4BufferPacketPointer=new Vc4Packet();
for(int i=0;i<2349;i++)
{
Vc4BufferPacketPointer->Data()[i]=Vc4BufferPacket[bb][i];
}
for(int i=0;i<2349;i++)
Vc4TempNextPacket->Data()[i]=sInPacket[bb]->Data()[i];
if((mSumUpSpeed[bb]>-24)&&(mSumUpSpeed[bb]<24))
{
Adjust_Author_Count_Up[bb]++;
Up_AdjustNoProcess(Vc4BufferPacketPointer,psOutPacketAu4,bb);
}
else if((mSumUpSpeed[bb]<=-24)&&(Adjust_Author_Count_Up[bb]>3))//正调整
{
Adjust_Author_Count_Up[bb]=1;
Up_AdjustPlusProcess(Vc4BufferPacketPointer,psOutPacketAu4,bb);
}
else if((mSumUpSpeed[bb]>=24)&&(Adjust_Author_Count_Up[bb]>3))//负调整
{
Adjust_Author_Count_Up[bb]=1;
Up_AdjustminusProcess(Vc4BufferPacketPointer,psOutPacketAu4,bb);
}
mSumUpSpeed[bb] += (upSpeed[bb] - 150336000) / 8000;
upSpeed[bb]=Vc4TempNextPacket->GetSpeed();
for(int i=0;i<783*3;i++)
{
Vc4BufferPacket[bb][i]=Vc4TempNextPacket->Data()[i];
}
}
if(m_stm_n_type==1)
{
*psOutPacket=psOutPacketAu4;
}
//间插出AUG4信号
else if(m_stm_n_type==4)
{
Aug4Packet* UpOutPacket =(Aug4Packet*) *psOutPacket;
for(int ww=0;ww<2358;ww++)
{
UpOutPacket->Data()[ww*4+bb]=psOutPacketAu4->Data()[ww];
}
UpOutPacket->SetFlowCount(UpOutPacket->GetFlowCount()+psOutPacketAu4->GetFlowCount());
UpOutPacket->SetTraceChannel(psOutPacketAu4->GetTraceChannel());
UpOutPacket->SetTrace(psOutPacketAu4->IsTrace()); //待处理
UpOutPacket->SetColorR(psOutPacketAu4->GetColorR());
UpOutPacket->SetColorG(psOutPacketAu4->GetColorG());
UpOutPacket->SetColorB(psOutPacketAu4->GetColorB());
}//这里处理有问题,待修改。
}
SrpPacket* psOutTempSrppacket=(SrpPacket*)psOutSrpPaceket;
psSemf->RecvUpSrp(&psOutTempSrppacket); //Semf接收本单元的S参考点数据包。
D_SAFE_DELETE(psInSrpPacket);
RUNNING_OUTPUT("Msa Up running. Input Not Null.\n");
return true;
}
bool MsaUnit::__ProcessDownData(Packet** psInPacket, T_PACKET_MAP& sOutPacket)
{
if (*psInPacket == NULL)
{
if(m_stm_n_type==1)
{
sOutPacket[0] = NULL;
RUNNING_OUTPUT("Msa down running. Input Null.\n");
return true;
}
else if(m_stm_n_type==4)
{
for(int m=0;m<4;m++)
{
sOutPacket[m] = NULL;
}
RUNNING_OUTPUT("Msa down running. Input Null.\n");
return true;
}
}
ISemf* psSemf=m_station->GetSemf();
SrpPacket* psInTempSrppacket=NULL;
psSemf->SendDownSrp(&psInTempSrppacket,this->Id());
Msa_SrpPacket* psInSrpPacket=(Msa_SrpPacket*)psInTempSrppacket;
if(psInSrpPacket==NULL)
{
psInSrpPacket=new Msa_SrpPacket();
}
Msa_SrpPacket* psOutSrpPaceket=new Msa_SrpPacket();
psOutSrpPaceket->SetId(this->Id());
if((*psInPacket)->Type()==e_PACKETTYPE_AUG4) //输入为aug4,需要消间插
{
m_stm_n_type=4;
//todo
}
Buffer_Vc4Packet=new Vc4Packet();
for(int dd=0;dd<m_stm_n_type;dd++)
{
Au4Packet* DeInleave=new Au4Packet();
if(m_stm_n_type==1)
{
Au4Packet*psTempInPacket=(Au4Packet*)*psInPacket;
for(int pp=0;pp<2358;pp++)
{