00001
00106 #include <stdlib.h>
00107
00108 #define _EXPORT_CCL_
00109
00110 #include "CigiOutgoingMsg.h"
00111
00112 #include "CigiVersionID.h"
00113 #include "CigiAllPackets.h"
00114 #include "CigiExceptions.h"
00115 #include "CigiSwapping.h"
00116 #include "CigiSession.h"
00117
00118
00119 #ifdef CIGI_LITTLE_ENDIAN
00120 #define CIGI_SCOPY2 CigiSwap2
00121 #define CIGI_SCOPY4 CigiSwap4
00122 #define CIGI_SCOPY8 CigiSwap8
00123 #else
00124 #define CIGI_SCOPY2 CigiCopy2
00125 #define CIGI_SCOPY4 CigiCopy4
00126 #define CIGI_SCOPY8 CigiCopy8
00127 #endif
00128
00129 using namespace std;
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139 CigiOutgoingMsg::CigiOutgoingMsg()
00140 {
00141
00142 pIGCtrlPck[0] = NULL;
00143 pIGCtrlPck[1] = new CigiIGCtrlV1;
00144 pIGCtrlPck[2] = new CigiIGCtrlV2;
00145 pIGCtrlPck[3] = new CigiIGCtrlV3;
00146 pIGCtrlPck[4] = new CigiIGCtrlV3_2;
00147 pIGCtrlPck[5] = new CigiIGCtrlV3_3;
00148
00149 pSOFPck[0] = NULL;
00150 pSOFPck[1] = new CigiSOFV1;
00151 pSOFPck[2] = new CigiSOFV2;
00152 pSOFPck[3] = new CigiSOFV3;
00153 pSOFPck[4] = new CigiSOFV3_2;
00154
00155 for(int ndx=0;ndx<256;ndx++)
00156 {
00157 OutgoingHandlerTbl[ndx] = (CigiBasePacket *)&DefaultPacket;
00158 VldSnd[ndx] = false;
00159 }
00160
00161 CmdVersionChng = false;
00162 CmdVersion.SetCigiVersion(3,3);
00163 MostMatureVersionReceived.SetCigiVersion(0,0);
00164
00165 FrameCnt = 0;
00166 LastRcvdFrame = 0;
00167
00168 }
00169
00170
00171
00172
00173 CigiOutgoingMsg::~CigiOutgoingMsg()
00174 {
00175 int ndx;
00176 for(ndx=1;ndx<6;ndx++)
00177 {
00178 delete pIGCtrlPck[ndx];
00179 }
00180 for(ndx=1;ndx<5;ndx++)
00181 {
00182 delete pSOFPck[ndx];
00183 }
00184
00185 ClearHandlerTable();
00186
00187 }
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199 bool CigiOutgoingMsg::IsSynchronous(void) const
00200 {
00201 if(Session != NULL)
00202 return(Session->IsSynchronous());
00203 else
00204 return(true);
00205 }
00206
00207
00208
00209
00210
00211 void CigiOutgoingMsg::AdvanceBuffer(void)
00212 {
00213 if(AvailBuff.empty())
00214 {
00215
00216 CrntFillBuf = new CigiMessageBuffer(BufferSize);
00217 }
00218 else
00219 {
00220
00221 CrntFillBuf = (*AvailBuff.begin());
00222 AvailBuff.pop_front();
00223 }
00224
00225
00226 Buffers.push_back(CrntFillBuf);
00227
00228
00229 CrntFillBuf->Active = true;
00230 CrntFillBuf->BufferFillCnt = 0;
00231 CrntFillBuf->DataPresent = false;
00232 CrntFillBuf->FillBufferPos = CrntFillBuf->Buffer;
00233 CrntFillBuf->Locked = false;
00234 CrntFillBuf->ValidIGCtrlSOF = false;
00235
00236 if(CmdVersionChng)
00237 {
00238 MostMatureVersionReceived.SetCigiVersion(0,0);
00239 ChangeOutgoingCigiVersion(CmdVersion);
00240 CmdVersionChng = false;
00241 }
00242 else if((OutgoingVersion != MostMatureVersionReceived) &&
00243 (MostMatureVersionReceived.CigiMajorVersion > 0))
00244 ChangeOutgoingCigiVersion(MostMatureVersionReceived);
00245
00246
00247 ChangeBufferCigiVersion(OutgoingVersion);
00248
00249 }
00250
00251
00252
00253
00254
00255 void CigiOutgoingMsg::ChangeOutgoingCigiVersion(CigiVersionID &Version)
00256 {
00257
00258 if((Session != NULL) &&
00259 (Version.CigiMajorVersion > 0))
00260 {
00261 OutgoingVersion = Version;
00262
00263 ClearHandlerTable();
00264
00265 if(Session->IsHost())
00266 {
00267 if(OutgoingVersion.CigiMajorVersion >= 3)
00268 SetOutgoingHostV3Tbls();
00269 else if(OutgoingVersion.CigiMajorVersion == 2)
00270 SetOutgoingHostV2Tbls();
00271 else if(OutgoingVersion.CigiMajorVersion == 1)
00272 SetOutgoingHostV1Tbls();
00273 }
00274 else
00275 {
00276 if(OutgoingVersion.CigiMajorVersion >= 3)
00277 SetOutgoingIGV3Tbls();
00278 else if(OutgoingVersion.CigiMajorVersion == 2)
00279 SetOutgoingIGV2Tbls();
00280 else if(OutgoingVersion.CigiMajorVersion == 1)
00281 SetOutgoingIGV1Tbls();
00282 }
00283 }
00284 }
00285
00286
00287
00288
00289
00290 void CigiOutgoingMsg::SetMostMatureReceivedCigiVersion(CigiVersionID &Version)
00291 {
00292 if(Version.IsKnownCigiVersion())
00293 {
00294 if(Version.GetCombinedCigiVersion() >
00295 MostMatureVersionReceived.GetCombinedCigiVersion())
00296 {
00297 MostMatureVersionReceived = Version;
00298
00299 if(CrntFillBuf != NULL)
00300 {
00301 if((CrntFillBuf->Active) &&
00302 (!CrntFillBuf->DataPresent))
00303 {
00304
00305 ChangeBufferCigiVersion(OutgoingVersion);
00306 }
00307 }
00308 }
00309 }
00310 }
00311
00312
00313
00314
00315
00316 int CigiOutgoingMsg::SetOutgoingCigiVersion(CigiVersionID &Version,
00317 bool bndchk)
00318 {
00319 int stat = CIGI_ERROR_WRONG_VERSION;
00320
00321 if(Version.IsKnownCigiVersion())
00322 {
00323 MostMatureVersionReceived.SetCigiVersion(0,0);
00324 CmdVersionChng = true;
00325 CmdVersion = Version;
00326 stat = CIGI_SUCCESS;
00327
00328 if(CrntFillBuf != NULL)
00329 {
00330 if((CrntFillBuf->Active) &&
00331 (!CrntFillBuf->DataPresent))
00332 {
00333 ChangeOutgoingCigiVersion(Version);
00334
00335
00336 ChangeBufferCigiVersion(OutgoingVersion);
00337
00338 CmdVersionChng = false;
00339 }
00340 }
00341 }
00342
00343 return(stat);
00344 }
00345
00346
00347
00348
00349
00350 void CigiOutgoingMsg::ChangeBufferCigiVersion(CigiVersionID &Version)
00351 {
00352
00353 CrntFillBuf->CigiVersion = OutgoingVersion;
00354
00355 if(Session->IsHost())
00356 {
00357 if((OutgoingVersion.GetCombinedCigiVersion() >= 0x303))
00358 CrntFillBuf->PackIGCtrl = pIGCtrlPck[5];
00359 else if((OutgoingVersion.GetCombinedCigiVersion() == 0x301))
00360 CrntFillBuf->PackIGCtrl = pIGCtrlPck[4];
00361 else
00362 CrntFillBuf->PackIGCtrl =
00363 pIGCtrlPck[OutgoingVersion.CigiMajorVersion];
00364
00365 int pSize = CrntFillBuf->PackIGCtrl->GetPacketSize();
00366 CrntFillBuf->BufferFillCnt = pSize;
00367 CrntFillBuf->FillBufferPos = CrntFillBuf->Buffer + pSize;
00368
00369 }
00370 else
00371 {
00372 CrntFillBuf->PackSOF =
00373 pSOFPck[OutgoingVersion.CigiMajorVersion];
00374 if((OutgoingVersion.GetCombinedCigiVersion() >= 0x302))
00375 CrntFillBuf->PackSOF = pSOFPck[4];
00376
00377 int pSize = CrntFillBuf->PackSOF->GetPacketSize();
00378 CrntFillBuf->BufferFillCnt = pSize;
00379 CrntFillBuf->FillBufferPos = CrntFillBuf->Buffer + pSize;
00380
00381 }
00382 }
00383
00384
00385
00386
00387
00388 CigiOutgoingMsg & CigiOutgoingMsg::operator <<(CigiBaseIGCtrl &refPacket)
00389 {
00390 CigiMessageBuffer *HostMsgBuf = NULL;
00391
00392 if(Buffers.empty())
00393 {
00394 #ifndef CIGI_NO_EXCEPT
00395 throw CigiCalledOutOfSequenceException();
00396 #endif
00397 return(*this);
00398 }
00399
00400 HostMsgBuf = *(Buffers.begin());
00401 if(HostMsgBuf == NULL)
00402 {
00403 #ifndef CIGI_NO_EXCEPT
00404 throw CigiCalledOutOfSequenceException();
00405 #endif
00406 return(*this);
00407 }
00408
00409 if(!HostMsgBuf->Active || HostMsgBuf->Locked)
00410 {
00411 #ifndef CIGI_NO_EXCEPT
00412 throw CigiCalledOutOfSequenceException();
00413 #endif
00414 return(*this);
00415 }
00416
00417 if(Session->IsHost())
00418 {
00419 if(HostMsgBuf->PackIGCtrl != NULL)
00420 {
00421 HostMsgBuf->PackIGCtrl->Pack(&refPacket,
00422 CrntFillBuf->Buffer,
00423 (void *)&OutgoingVersion);
00424 HostMsgBuf->ValidIGCtrlSOF = true;
00425 HostMsgBuf->DataPresent = true;
00426 }
00427 }
00428
00429 return(*this);
00430
00431 }
00432
00433
00434
00435
00436
00437 CigiOutgoingMsg & CigiOutgoingMsg::operator <<(CigiBaseSOF &refPacket)
00438 {
00439 CigiMessageBuffer *IgMsgBuf = NULL;
00440
00441 if(Buffers.empty())
00442 {
00443 #ifndef CIGI_NO_EXCEPT
00444 throw CigiCalledOutOfSequenceException();
00445 #endif
00446 return(*this);
00447 }
00448
00449 IgMsgBuf = *(Buffers.begin());
00450
00451 if(IgMsgBuf == NULL)
00452 {
00453 #ifndef CIGI_NO_EXCEPT
00454 throw CigiCalledOutOfSequenceException();
00455 #endif
00456 return(*this);
00457 }
00458
00459
00460 if(!IgMsgBuf->Active || IgMsgBuf->Locked)
00461 {
00462 #ifndef CIGI_NO_EXCEPT
00463 throw CigiCalledOutOfSequenceException();
00464 #endif
00465 return(*this);
00466 }
00467
00468 if(Session->IsIG())
00469 {
00470 if(IgMsgBuf->PackSOF != NULL)
00471 {
00472 IgMsgBuf->PackSOF->Pack(&refPacket,
00473 CrntFillBuf->Buffer,
00474 (void *)&OutgoingVersion);
00475 IgMsgBuf->ValidIGCtrlSOF = true;
00476 IgMsgBuf->DataPresent = true;
00477 }
00478 }
00479
00480 return(*this);
00481
00482 }
00483
00484
00485
00486
00487
00488 CigiOutgoingMsg & CigiOutgoingMsg::operator <<(CigiBaseEntityCtrl &refPacket)
00489 {
00490 CigiCnvtInfoType::Type Cnvt;
00491 refPacket.GetCnvt(OutgoingVersion,Cnvt);
00492
00493 if(VldSnd[Cnvt.CnvtPacketID])
00494 PackObj(refPacket,*OutgoingHandlerTbl[Cnvt.CnvtPacketID],ATbl);
00495
00496 return(*this);
00497
00498 }
00499
00500
00501
00502
00503
00504
00505 CigiOutgoingMsg & CigiOutgoingMsg::operator <<(CigiBaseEnvCtrl &refPacket)
00506 {
00507
00508 refPacket.FillHold(&EnvHoldObj);
00509
00510 Cigi_uint8 FillVer = refPacket.GetVersion();
00511
00512 if(FillVer >= 3)
00513 {
00514
00515 if(OutgoingVersion.CigiMajorVersion >= 3)
00516 {
00517
00518 if(VldSnd[refPacket.GetPacketID()])
00519 {
00520 PackObj(refPacket,
00521 *OutgoingHandlerTbl[refPacket.GetPacketID()],
00522 NULL);
00523 }
00524 }
00525 else
00526 {
00527
00528
00529 if(VldSnd[CIGI_ENV_CTRL_PACKET_ID_V2])
00530 {
00531 PackObj(EnvHoldObj,
00532 *OutgoingHandlerTbl[CIGI_ENV_CTRL_PACKET_ID_V2],
00533 NULL);
00534 }
00535 }
00536 }
00537 else
00538 {
00539
00540 if(OutgoingVersion.CigiMajorVersion >= 3)
00541 {
00542
00543
00544
00545 if(VldSnd[CIGI_ATMOS_CTRL_PACKET_ID_V3])
00546 {
00547 PackObj(EnvHoldObj,
00548 *OutgoingHandlerTbl[CIGI_ATMOS_CTRL_PACKET_ID_V3],
00549 NULL);
00550 PackObj(EnvHoldObj,
00551 *OutgoingHandlerTbl[CIGI_CELESTIAL_CTRL_PACKET_ID_V3],
00552 NULL);
00553 }
00554 }
00555 else
00556 {
00557
00558
00559 if(VldSnd[refPacket.GetPacketID()])
00560 {
00561 PackObj(refPacket,
00562 *OutgoingHandlerTbl[refPacket.GetPacketID()],
00563 NULL);
00564 }
00565 }
00566 }
00567
00568 return(*this);
00569
00570 }
00571
00572
00573
00574
00575
00576 CigiOutgoingMsg & CigiOutgoingMsg::operator <<(CigiBaseVariableSizePckt &refPacket)
00577 {
00578 if(CrntFillBuf == NULL)
00579 {
00580 #ifndef CIGI_NO_EXCEPT
00581 throw CigiCalledOutOfSequenceException();
00582 #endif
00583 return(*this);
00584 }
00585
00586
00587 if(!CrntFillBuf->Active || CrntFillBuf->Locked)
00588 {
00589 #ifndef CIGI_NO_EXCEPT
00590 throw CigiCalledOutOfSequenceException();
00591 #endif
00592 return(*this);
00593 }
00594
00595 CigiCnvtInfoType::Type Cnvt;
00596 refPacket.GetCnvt(OutgoingVersion,Cnvt);
00597 CigiBaseVariableSizePckt *PackingPacket =
00598 (CigiBaseVariableSizePckt *)OutgoingHandlerTbl[Cnvt.CnvtPacketID];
00599
00600 if(VldSnd[Cnvt.CnvtPacketID])
00601 {
00602
00603 int Size = PackingPacket->GetTruePacketSize(refPacket);
00604
00605 if( Size > 0 )
00606 {
00607
00608 if((BufferSize - CrntFillBuf->BufferFillCnt) < Size)
00609 AdvanceBuffer();
00610
00611 int pSize = PackingPacket->Pack(&refPacket, CrntFillBuf->FillBufferPos, NULL);
00612 CrntFillBuf->BufferFillCnt += pSize;
00613 CrntFillBuf->FillBufferPos += pSize;
00614 CrntFillBuf->DataPresent = true;
00615
00616 }
00617 }
00618
00619 return(*this);
00620
00621 }
00622
00623
00624
00625
00626
00627
00628 CigiOutgoingMsg & CigiOutgoingMsg::operator <<(CigiBasePacket &refBasePacket)
00629 {
00630 CigiCnvtInfoType::Type Cnvt;
00631 refBasePacket.GetCnvt(OutgoingVersion,Cnvt);
00632
00633 if((Cnvt.ProcID == CigiProcessType::ProcStd) ||
00634 (Cnvt.ProcID == CigiProcessType::TwoPassCnvtProcStd))
00635 {
00636 if(VldSnd[Cnvt.CnvtPacketID])
00637 PackObj(refBasePacket,*OutgoingHandlerTbl[Cnvt.CnvtPacketID],NULL);
00638 }
00639 else
00640 {
00641 CigiBaseEntityCtrl *pEnt;
00642 CigiBaseEnvCtrl *pEnv;
00643 CigiBaseIGCtrl *pIG;
00644 CigiBaseSOF *pSof;
00645 CigiBaseVariableSizePckt *pVSz;
00646
00647 switch(Cnvt.ProcID)
00648 {
00649 case CigiProcessType::ProcShortArtPartToArtPart:
00650 if(VldSnd[Cnvt.CnvtPacketID])
00651 {
00652 CigiBaseShortArtPartCtrl *pSArtPart =
00653 (CigiBaseShortArtPartCtrl *)&refBasePacket;
00654 Cigi_uint8 ArtPartID1 = pSArtPart->GetArtPart1();
00655 Cigi_uint8 ArtPartID2 = pSArtPart->GetArtPart2();
00656 CigiArtPartCtrlV3 tArtPart;
00657 pSArtPart->SpecialConversion(OutgoingVersion,ArtPartID1,&tArtPart);
00658 PackObj(tArtPart,*OutgoingHandlerTbl[Cnvt.CnvtPacketID],NULL);
00659 if(ArtPartID2 != ArtPartID1)
00660 {
00661 CigiArtPartCtrlV3 tArtPart2;
00662 pSArtPart->SpecialConversion(OutgoingVersion,ArtPartID2,&tArtPart2);
00663 PackObj(tArtPart2,*OutgoingHandlerTbl[Cnvt.CnvtPacketID],NULL);
00664 }
00665 }
00666 break;
00667 case CigiProcessType::ProcEntity:
00668 pEnt = (CigiBaseEntityCtrl *)&refBasePacket;
00669 operator<<(*pEnt);
00670 break;
00671 case CigiProcessType::ProcEnvCtrl:
00672 pEnv = (CigiBaseEnvCtrl *)&refBasePacket;
00673 operator<<(*pEnv);
00674 break;
00675 case CigiProcessType::ProcIGCtrl:
00676 pIG = (CigiBaseIGCtrl *)&refBasePacket;
00677 operator<<(*pIG);
00678 break;
00679 case CigiProcessType::ProcSOF:
00680 pSof = (CigiBaseSOF *)&refBasePacket;
00681 operator<<(*pSof);
00682 break;
00683 case CigiProcessType::ProcVarSize:
00684 pVSz = (CigiBaseVariableSizePckt *)&refBasePacket;
00685 operator<<(*pVSz);
00686 break;
00687 default:
00688 break;
00689 }
00690 }
00691
00692 return(*this);
00693
00694 }
00695
00696
00697
00698
00699
00700
00701 CigiOutgoingMsg & CigiOutgoingMsg::PackObj(CigiBasePacket &DataPacket,
00702 CigiBasePacket &PackingPacket, void *Spec)
00703 {
00704 if(CrntFillBuf == NULL)
00705 {
00706 #ifndef CIGI_NO_EXCEPT
00707 throw CigiCalledOutOfSequenceException();
00708 #endif
00709 return(*this);
00710 }
00711
00712
00713 if(!CrntFillBuf->Active || CrntFillBuf->Locked)
00714 {
00715 #ifndef CIGI_NO_EXCEPT
00716 throw CigiCalledOutOfSequenceException();
00717 #endif
00718 return(*this);
00719 }
00720
00721 int Size = PackingPacket.GetPacketSize();
00722
00723 if( Size > 0 )
00724 {
00725
00726 if((BufferSize - CrntFillBuf->BufferFillCnt) < Size)
00727 AdvanceBuffer();
00728
00729 int pSize = PackingPacket.Pack(&DataPacket, CrntFillBuf->FillBufferPos, Spec);
00730 CrntFillBuf->BufferFillCnt += pSize;
00731 CrntFillBuf->FillBufferPos += pSize;
00732 CrntFillBuf->DataPresent = true;
00733
00734 }
00735
00736 return(*this);
00737
00738 }
00739
00740
00741
00742
00743
00744 int CigiOutgoingMsg::UpdateFrameCntr(void)
00745 {
00746 int stat = CIGI_ERROR_UNEXPECTED_NULL;
00747
00748 if(CrntMsgBuf == NULL)
00749 {
00750 if(!Buffers.empty())
00751 {
00752 CigiMessageBuffer *tBuf = *(Buffers.begin());
00753 if(tBuf->IsValidIGCtrlSOF())
00754 {
00755 Cigi_uint32 *tFrm = (Cigi_uint32 *)(tBuf->Buffer + 8);
00756 *tFrm = FrameCnt++;
00757 stat = CIGI_SUCCESS;
00758 }
00759 }
00760 }
00761 else
00762 stat = UpdateFrameCntr(CrntMsgBuf->Buffer);
00763
00764 return(stat);
00765 }
00766
00767
00768
00769
00770 int CigiOutgoingMsg::UpdateFrameCntr(Cigi_uint8 *OutgoingMsg, Cigi_uint8 *IncomingMsg)
00771 {
00772 if((OutgoingMsg == NULL) ||
00773 (CrntMsgBuf == NULL) ||
00774 (Session == NULL))
00775 return(CIGI_ERROR_UNEXPECTED_NULL);
00776
00777 if(!CrntMsgBuf->ValidIGCtrlSOF)
00778 {
00779 if(Session->IsHost())
00780 {
00781 #ifndef CIGI_NO_EXCEPT
00782 throw CigiMissingIgControlException();
00783 #endif
00784 return(CIGI_ERROR_MISSING_IG_CONTROL_PACKET);
00785 }
00786 else
00787 {
00788 #ifndef CIGI_NO_EXCEPT
00789 throw CigiMissingStartOfFrameException();
00790 #endif
00791 return(CIGI_ERROR_MISSING_SOF_PACKET);
00792 }
00793 }
00794
00795
00796
00797
00798
00799
00800
00801
00802
00803
00804
00805
00806
00807
00808 Cigi_uint32 *OutgoingMsgWord = (Cigi_uint32 *)OutgoingMsg;
00809 Cigi_uint32 *IncomingMsgWord = (Cigi_uint32 *)IncomingMsg;
00810
00811
00812
00813 bool FrameIncr = false;
00814 bool FrameRcvd = false;
00815 CigiVersionID OutVer;
00816 OutVer.CigiMajorVersion = (int) *(OutgoingMsg + 2);
00817 if(OutVer.CigiMajorVersion < 3)
00818 {
00819 if((Session->IsHost()) && (Session->IsSynchronous()))
00820 FrameRcvd = true;
00821 else
00822 FrameIncr = true;
00823 }
00824 else
00825 {
00826 int tVer = 0;
00827 if(Session->IsHost())
00828 {
00829 tVer = (int) *(OutgoingMsg + 4);
00830 if(Session->IsSynchronous())
00831 FrameRcvd = true;
00832 else
00833 FrameIncr = true;
00834 }
00835 else
00836 {
00837 tVer = (int) *(OutgoingMsg + 5);
00838 FrameIncr = true;
00839 }
00840
00841 OutVer.CigiMinorVersion = (tVer >> 4) & 0x0f;
00842
00843 if(OutVer.GetCombinedCigiVersion() >= 0x0302)
00844 {
00845 FrameIncr = true;
00846 FrameRcvd = true;
00847 }
00848 }
00849
00850 int NewFrame = FrameCnt;
00851 int RcvdFrame = -1;
00852 if(FrameRcvd)
00853 {
00854 if(IncomingMsg == NULL)
00855 RcvdFrame = LastRcvdFrame;
00856 else
00857 {
00858 int InVer = (int) *(IncomingMsg + 2);
00859 if(InVer >= 3)
00860 {
00861
00862 Cigi_uint16 *IncomingMsgShort = (Cigi_uint16 *)IncomingMsg;
00863 if(*(IncomingMsgShort + 3) == 0x8000)
00864 RcvdFrame = *(IncomingMsgWord + 2);
00865 else
00866 CigiSwap4(&RcvdFrame,(IncomingMsgWord + 2));
00867 }
00868 }
00869
00870 if(!FrameIncr)
00871 NewFrame = RcvdFrame;
00872 }
00873
00874 if(OutVer.CigiMajorVersion < 3)
00875 CIGI_SCOPY4((OutgoingMsgWord + 2),&NewFrame);
00876 else
00877 {
00878 *(OutgoingMsgWord + 2) = NewFrame;
00879 if(FrameIncr && FrameRcvd)
00880 *(OutgoingMsgWord + 4) = RcvdFrame;
00881 }
00882
00883 FrameCnt++;
00884
00885 return(CIGI_SUCCESS);
00886
00887 }
00888
00889
00890
00891
00892
00893 int CigiOutgoingMsg::UpdateIGCtrl(Cigi_uint8 *OutgoingMsg, Cigi_uint8 *IncomingMsg)
00894 {
00895
00896 Cigi_int8 *OBufr = NULL;
00897 Cigi_int8 *IBufr = NULL;
00898
00899 if(OutgoingMsg == NULL)
00900 return(CIGI_ERROR_UNEXPECTED_NULL);
00901
00902
00903
00904
00905
00906
00907
00908
00909
00910
00911
00912 UpdateFrameCntr(OutgoingMsg,IncomingMsg);
00913
00914
00915
00916 OBufr = (Cigi_int8 *)(OutgoingMsg + 3);
00917 if(*OBufr != 0)
00918 {
00919 if(*OBufr < 0)
00920 {
00921 *OBufr = 0;
00922 }
00923 #if !defined(_NO_DATABASE_ADJUSTMENT_)
00924 else if(IncomingMsg != NULL)
00925 {
00926
00927
00928
00929
00930
00931
00932 IBufr = (Cigi_int8 *)(IncomingMsg + 3);
00933 if((*IBufr != -128) &&
00934 ((*OBufr == *IBufr) || (*OBufr == (*IBufr * (-1)))))
00935 {
00936 *OBufr = 0;
00937 }
00938 }
00939 #endif
00940 }
00941
00942 return(CIGI_SUCCESS);
00943
00944 }
00945
00946
00947
00948
00949
00950 int CigiOutgoingMsg::LockMsg()
00951 {
00952
00953 if(Buffers.empty())
00954 {
00955 #ifndef CIGI_NO_EXCEPT
00956 throw CigiCalledOutOfSequenceException();
00957 #endif
00958 return(CIGI_ERROR_CALLED_OUT_OF_SEQUENCE);
00959 }
00960
00961
00962 if(CrntMsgBuf != NULL)
00963 {
00964 #ifndef CIGI_NO_EXCEPT
00965 throw CigiCalledOutOfSequenceException();
00966 #endif
00967 return(CIGI_ERROR_CALLED_OUT_OF_SEQUENCE);
00968 }
00969
00970
00971
00972 CrntMsgBuf = *(Buffers.begin());
00973 if((CrntMsgBuf == NULL) || (Session == NULL))
00974 {
00975 #ifndef CIGI_NO_EXCEPT
00976 throw CigiNullPointerException();
00977 #endif
00978 return(CIGI_ERROR_UNEXPECTED_NULL);
00979 }
00980
00981 if(!CrntMsgBuf->ValidIGCtrlSOF)
00982 {
00983 if(Session->IsHost())
00984 {
00985 #ifndef CIGI_NO_EXCEPT
00986 throw CigiMissingIgControlException();
00987 #endif
00988 return(CIGI_ERROR_MISSING_IG_CONTROL_PACKET);
00989 }
00990 else
00991 {
00992 #ifndef CIGI_NO_EXCEPT
00993 throw CigiMissingStartOfFrameException();
00994 #endif
00995 return(CIGI_ERROR_MISSING_SOF_PACKET);
00996 }
00997 }
00998
00999 if( !CrntMsgBuf->Active || CrntMsgBuf->Locked )
01000 {
01001 #ifndef CIGI_NO_EXCEPT
01002 throw CigiCalledOutOfSequenceException();
01003 #endif
01004 return(CIGI_ERROR_CALLED_OUT_OF_SEQUENCE);
01005 }
01006
01007 CrntMsgBuf->Locked = true;
01008
01009
01010
01011 if(CrntFillBuf == CrntMsgBuf)
01012 AdvanceBuffer();
01013
01014 return(CIGI_SUCCESS);
01015
01016 }
01017
01018
01019
01020
01021
01022 Cigi_uint8 * CigiOutgoingMsg::GetMsg(int &length)
01023 {
01024 Cigi_uint8 * Buff = NULL;
01025 length = 0;
01026
01027
01028 if(CrntMsgBuf != NULL)
01029 {
01030 if((CrntMsgBuf->Active) && (CrntMsgBuf->Locked))
01031 {
01032 Buff = CrntMsgBuf->Buffer;
01033 length = CrntMsgBuf->BufferFillCnt;
01034 }
01035 }
01036
01037 return(Buff);
01038 }
01039
01040
01041
01042
01043
01044 Cigi_uint8 * CigiOutgoingMsg::GetBuffer()
01045 {
01046 Cigi_uint8 * Buff = NULL;
01047
01048
01049 if(CrntMsgBuf != NULL)
01050 {
01051 if((CrntMsgBuf->Active) && (CrntMsgBuf->Locked))
01052 Buff = CrntMsgBuf->Buffer;
01053 }
01054
01055 return(Buff);
01056 }
01057
01058
01059
01060
01061
01062 int CigiOutgoingMsg::GetMsgLength()
01063 {
01064 int length = 0;
01065
01066
01067 if(CrntMsgBuf != NULL)
01068 {
01069 if((CrntMsgBuf->Active) && (CrntMsgBuf->Locked))
01070 length = CrntMsgBuf->BufferFillCnt;
01071 }
01072
01073 return(length);
01074 }
01075
01076
01077
01078
01079
01080 std::string CigiOutgoingMsg::GetBufferString(void)
01081 {
01082 Cigi_uint8 *buffer = this->GetBuffer();
01083 int size = this->GetMsgLength();
01084 return std::string(buffer,buffer+size);
01085 }
01086
01087
01088
01089
01090
01091 int CigiOutgoingMsg::UnlockMsg()
01092 {
01093
01094 if(CrntMsgBuf == NULL)
01095 {
01096 #ifndef CIGI_NO_EXCEPT
01097 throw CigiCalledOutOfSequenceException();
01098 #endif
01099 return(CIGI_ERROR_CALLED_OUT_OF_SEQUENCE);
01100 }
01101
01102
01103 if(!CrntMsgBuf->Active || !CrntMsgBuf->Locked)
01104 {
01105 #ifndef CIGI_NO_EXCEPT
01106 throw CigiCalledOutOfSequenceException();
01107 #endif
01108 return(CIGI_ERROR_CALLED_OUT_OF_SEQUENCE);
01109 }
01110
01111
01112 CrntMsgBuf->Active = false;
01113 CrntMsgBuf->BufferFillCnt = 0;
01114 CrntMsgBuf->DataPresent = false;
01115 CrntMsgBuf->FillBufferPos = CrntMsgBuf->Buffer;
01116 CrntMsgBuf->Locked = false;
01117 CrntMsgBuf->ValidIGCtrlSOF = false;
01118
01119
01120 if(!Buffers.empty())
01121 {
01122 if(CrntMsgBuf == *(Buffers.begin()))
01123 Buffers.pop_front();
01124 else
01125 {
01126 list<CigiMessageBuffer *>::iterator iBuf;
01127 for(iBuf=Buffers.begin();iBuf!=Buffers.end();iBuf++)
01128 {
01129 if(*iBuf == CrntMsgBuf)
01130 {
01131 iBuf = Buffers.erase(iBuf);
01132 break;
01133 }
01134 }
01135 }
01136 }
01137
01138
01139 AvailBuff.push_back(CrntMsgBuf);
01140
01141
01142 CrntMsgBuf = NULL;
01143
01144 return(CIGI_SUCCESS);
01145
01146 }
01147
01148
01149
01150
01151
01152 int CigiOutgoingMsg::PackageMsg(Cigi_uint8 **Msg, int &length)
01153 {
01154 *Msg = NULL;
01155 length = 0;
01156
01157 if(PackagedMsg != NULL)
01158 {
01159 #ifndef CIGI_NO_EXCEPT
01160 throw CigiCalledOutOfSequenceException();
01161 #endif
01162 return(CIGI_ERROR_CALLED_OUT_OF_SEQUENCE);
01163 }
01164
01165 int stat = LockMsg();
01166
01167 if(stat == CIGI_SUCCESS)
01168 {
01169 *Msg = GetMsg(length);
01170 if(*Msg != NULL)
01171 PackagedMsg = CrntMsgBuf;
01172 else
01173 stat = CIGI_ERROR_CALLED_OUT_OF_SEQUENCE;
01174 }
01175
01176 return(stat);
01177
01178 }
01179
01180
01181
01182
01183 int CigiOutgoingMsg::FreeMsg(void)
01184 {
01185 if(PackagedMsg == NULL)
01186 {
01187 #ifndef CIGI_NO_EXCEPT
01188 throw CigiCalledOutOfSequenceException();
01189 #endif
01190 return(CIGI_ERROR_CALLED_OUT_OF_SEQUENCE);
01191 }
01192
01193 int stat = UnlockMsg();
01194
01195 PackagedMsg = NULL;
01196
01197 return(stat);
01198 }
01199
01200
01201
01202
01203
01204
01205 int CigiOutgoingMsg::Reset(void)
01206 {
01207 CrntMsgBuf = NULL;
01208 PackagedMsg = NULL;
01209 CrntFillBuf = NULL;
01210
01211 list<CigiMessageBuffer *>::iterator iBuf;
01212 for(iBuf=Buffers.begin();iBuf!=Buffers.end();iBuf++)
01213 {
01214 (*iBuf)->Active = false;
01215 (*iBuf)->BufferFillCnt = 0;
01216 (*iBuf)->DataPresent = false;
01217 (*iBuf)->FillBufferPos = (*iBuf)->Buffer;
01218 (*iBuf)->Locked = false;
01219 (*iBuf)->ValidIGCtrlSOF = false;
01220
01221 AvailBuff.push_back(*iBuf);
01222 }
01223
01224 Buffers.clear();
01225
01226 return(CIGI_SUCCESS);
01227
01228 }
01229
01230
01231
01232
01233
01234 int CigiOutgoingMsg::RegisterUserPacket(CigiBasePacket *Packet,
01235 Cigi_uint8 PacketID,
01236 bool HostSend,
01237 bool IGSend)
01238 {
01239 int stat = CIGI_ERROR_INVALID_USER_PACKET;
01240 if(((PacketID > 199) && (PacketID <= 255)) &&
01241 (Packet != NULL) &&
01242 ((HostSend && Session->IsHost()) ||
01243 (IGSend && Session->IsIG())))
01244 {
01245 OutgoingHandlerTbl[PacketID] = Packet;
01246 VldSnd[PacketID] = true;
01247 stat = CIGI_SUCCESS;
01248 }
01249
01250 return(stat);
01251 }
01252
01253
01254
01255
01256
01257 void CigiOutgoingMsg::ClearHandlerTable()
01258 {
01259 for(int ndx=0;ndx<200;ndx++)
01260 {
01261 if(OutgoingHandlerTbl[ndx] != (CigiBasePacket *)&DefaultPacket)
01262 {
01263 delete OutgoingHandlerTbl[ndx];
01264 OutgoingHandlerTbl[ndx] = &DefaultPacket;
01265 }
01266 VldSnd[ndx] = false;
01267 }
01268 }
01269
01270
01271
01272
01273
01274 void CigiOutgoingMsg::SetOutgoingHostV1Tbls(void)
01275 {
01276
01277 OutgoingHandlerTbl[CIGI_IG_CTRL_PACKET_ID_V1] = (CigiBasePacket *) new CigiIGCtrlV1;
01278 VldSnd[CIGI_IG_CTRL_PACKET_ID_V1] = true;
01279 OutgoingHandlerTbl[CIGI_ENTITY_CTRL_PACKET_ID_V1] = (CigiBasePacket *) new CigiEntityCtrlV1;
01280 VldSnd[CIGI_ENTITY_CTRL_PACKET_ID_V1] = true;
01281 OutgoingHandlerTbl[CIGI_VIEW_DEF_PACKET_ID_V1] = (CigiBasePacket *) new CigiViewDefV1;
01282 VldSnd[CIGI_VIEW_DEF_PACKET_ID_V1] = true;
01283 OutgoingHandlerTbl[CIGI_VIEW_CTRL_PACKET_ID_V1] = (CigiBasePacket *) new CigiViewCtrlV1;
01284 VldSnd[CIGI_VIEW_CTRL_PACKET_ID_V1] = true;
01285 OutgoingHandlerTbl[CIGI_RATE_CTRL_PACKET_ID_V1] = (CigiBasePacket *) new CigiRateCtrlV1;
01286 VldSnd[CIGI_RATE_CTRL_PACKET_ID_V1] = true;
01287 OutgoingHandlerTbl[CIGI_SENSOR_CTRL_PACKET_ID_V1] = (CigiBasePacket *) new CigiSensorCtrlV1;
01288 VldSnd[CIGI_SENSOR_CTRL_PACKET_ID_V1] = true;
01289 OutgoingHandlerTbl[CIGI_TRAJECTORY_DEF_PACKET_ID_V1] = (CigiBasePacket *) new CigiTrajectoryDefV1;
01290 VldSnd[CIGI_TRAJECTORY_DEF_PACKET_ID_V1] = true;
01291 OutgoingHandlerTbl[CIGI_WEATHER_CTRL_PACKET_ID_V1] = (CigiBasePacket *) new CigiWeatherCtrlV1;
01292 VldSnd[CIGI_WEATHER_CTRL_PACKET_ID_V1] = true;
01293 OutgoingHandlerTbl[CIGI_COLL_DET_SEG_DEF_PACKET_ID_V1] = (CigiBasePacket *) new CigiCollDetSegDefV1;
01294 VldSnd[CIGI_COLL_DET_SEG_DEF_PACKET_ID_V1] = true;
01295 OutgoingHandlerTbl[CIGI_LOS_SEG_REQ_PACKET_ID_V1] = (CigiBasePacket *) new CigiLosSegReqV1;
01296 VldSnd[CIGI_LOS_SEG_REQ_PACKET_ID_V1] = true;
01297 OutgoingHandlerTbl[CIGI_LOS_VECT_REQ_PACKET_ID_V1] = (CigiBasePacket *) new CigiLosVectReqV1;
01298 VldSnd[CIGI_LOS_VECT_REQ_PACKET_ID_V1] = true;
01299 OutgoingHandlerTbl[CIGI_HAT_REQ_PACKET_ID_V1] = (CigiBasePacket *) new CigiHatReqV1;
01300 VldSnd[CIGI_HAT_REQ_PACKET_ID_V1] = true;
01301 OutgoingHandlerTbl[CIGI_ENV_CTRL_PACKET_ID_V1] = (CigiBasePacket *) new CigiEnvCtrlV1;
01302 VldSnd[CIGI_ENV_CTRL_PACKET_ID_V1] = true;
01303 OutgoingHandlerTbl[CIGI_SPEC_EFF_DEF_PACKET_ID_V1] = (CigiBasePacket *) new CigiSpecEffDefV1;
01304 VldSnd[CIGI_SPEC_EFF_DEF_PACKET_ID_V1] = true;
01305 OutgoingHandlerTbl[CIGI_ART_PART_CTRL_PACKET_ID_V1] = (CigiBasePacket *) new CigiArtPartCtrlV1;
01306 VldSnd[CIGI_ART_PART_CTRL_PACKET_ID_V1] = true;
01307 OutgoingHandlerTbl[CIGI_COMP_CTRL_PACKET_ID_V1] = (CigiBasePacket *) new CigiCompCtrlV1;
01308 VldSnd[CIGI_COMP_CTRL_PACKET_ID_V1] = true;
01309
01310 }
01311
01312
01313
01314
01315
01316 void CigiOutgoingMsg::SetOutgoingIGV1Tbls(void)
01317 {
01318
01319 OutgoingHandlerTbl[CIGI_SOF_PACKET_ID_V1] = (CigiBasePacket *) new CigiSOFV1;
01320 VldSnd[CIGI_SOF_PACKET_ID_V1] = true;
01321 OutgoingHandlerTbl[CIGI_COLL_DET_SEG_RESP_PACKET_ID_V1] = (CigiBasePacket *) new CigiCollDetSegRespV1;
01322 VldSnd[CIGI_COLL_DET_SEG_RESP_PACKET_ID_V1] = true;
01323 OutgoingHandlerTbl[CIGI_SENSOR_RESP_PACKET_ID_V1] = (CigiBasePacket *) new CigiSensorRespV1;
01324 VldSnd[CIGI_SENSOR_RESP_PACKET_ID_V1] = true;
01325 OutgoingHandlerTbl[CIGI_LOS_RESP_PACKET_ID_V1] = (CigiBasePacket *) new CigiLosRespV1;
01326 VldSnd[CIGI_LOS_RESP_PACKET_ID_V1] = true;
01327 OutgoingHandlerTbl[CIGI_HAT_RESP_PACKET_ID_V1] = (CigiBasePacket *) new CigiHatRespV1;
01328 VldSnd[CIGI_HAT_RESP_PACKET_ID_V1] = true;
01329
01330 }
01331
01332
01333
01334
01335
01336 void CigiOutgoingMsg::SetOutgoingHostV2Tbls(void)
01337 {
01338
01339 OutgoingHandlerTbl[CIGI_IG_CTRL_PACKET_ID_V2] = (CigiBasePacket *) new CigiIGCtrlV2;
01340 VldSnd[CIGI_IG_CTRL_PACKET_ID_V2] = true;
01341 OutgoingHandlerTbl[CIGI_ENTITY_CTRL_PACKET_ID_V2] = (CigiBasePacket *) new CigiEntityCtrlV2;
01342 VldSnd[CIGI_ENTITY_CTRL_PACKET_ID_V2] = true;
01343 OutgoingHandlerTbl[CIGI_VIEW_DEF_PACKET_ID_V2] = (CigiBasePacket *) new CigiViewDefV2;
01344 VldSnd[CIGI_VIEW_DEF_PACKET_ID_V2] = true;
01345 OutgoingHandlerTbl[CIGI_VIEW_CTRL_PACKET_ID_V2] = (CigiBasePacket *) new CigiViewCtrlV2;
01346 VldSnd[CIGI_VIEW_CTRL_PACKET_ID_V2] = true;
01347 OutgoingHandlerTbl[CIGI_RATE_CTRL_PACKET_ID_V2] = (CigiBasePacket *) new CigiRateCtrlV2;
01348 VldSnd[CIGI_RATE_CTRL_PACKET_ID_V2] = true;
01349 OutgoingHandlerTbl[CIGI_SENSOR_CTRL_PACKET_ID_V2] = (CigiBasePacket *) new CigiSensorCtrlV2;
01350 VldSnd[CIGI_SENSOR_CTRL_PACKET_ID_V2] = true;
01351 OutgoingHandlerTbl[CIGI_TRAJECTORY_DEF_PACKET_ID_V2] = (CigiBasePacket *) new CigiTrajectoryDefV2;
01352 VldSnd[CIGI_TRAJECTORY_DEF_PACKET_ID_V2] = true;
01353 OutgoingHandlerTbl[CIGI_WEATHER_CTRL_PACKET_ID_V2] = (CigiBasePacket *) new CigiWeatherCtrlV2;
01354 VldSnd[CIGI_WEATHER_CTRL_PACKET_ID_V2] = true;
01355 OutgoingHandlerTbl[CIGI_COLL_DET_SEG_DEF_PACKET_ID_V2] = (CigiBasePacket *) new CigiCollDetSegDefV2;
01356 VldSnd[CIGI_COLL_DET_SEG_DEF_PACKET_ID_V2] = true;
01357 OutgoingHandlerTbl[CIGI_LOS_SEG_REQ_PACKET_ID_V2] = (CigiBasePacket *) new CigiLosSegReqV2;
01358 VldSnd[CIGI_LOS_SEG_REQ_PACKET_ID_V2] = true;
01359 OutgoingHandlerTbl[CIGI_LOS_VECT_REQ_PACKET_ID_V2] = (CigiBasePacket *) new CigiLosVectReqV2;
01360 VldSnd[CIGI_LOS_VECT_REQ_PACKET_ID_V2] = true;
01361 OutgoingHandlerTbl[CIGI_HAT_REQ_PACKET_ID_V2] = (CigiBasePacket *) new CigiHatReqV2;
01362 VldSnd[CIGI_HAT_REQ_PACKET_ID_V2] = true;
01363 OutgoingHandlerTbl[CIGI_HOT_REQ_PACKET_ID_V2] = (CigiBasePacket *) new CigiHotReqV2;
01364 VldSnd[CIGI_HOT_REQ_PACKET_ID_V2] = true;
01365 OutgoingHandlerTbl[CIGI_ENV_CTRL_PACKET_ID_V2] = (CigiBasePacket *) new CigiEnvCtrlV2;
01366 VldSnd[CIGI_ENV_CTRL_PACKET_ID_V2] = true;
01367 OutgoingHandlerTbl[CIGI_SPEC_EFF_DEF_PACKET_ID_V2] = (CigiBasePacket *) new CigiSpecEffDefV2;
01368 VldSnd[CIGI_SPEC_EFF_DEF_PACKET_ID_V2] = true;
01369 OutgoingHandlerTbl[CIGI_ART_PART_CTRL_PACKET_ID_V2] = (CigiBasePacket *) new CigiArtPartCtrlV2;
01370 VldSnd[CIGI_ART_PART_CTRL_PACKET_ID_V2] = true;
01371 OutgoingHandlerTbl[CIGI_COLL_DET_VOL_DEF_PACKET_ID_V2] = (CigiBasePacket *) new CigiCollDetVolDefV2;
01372 VldSnd[CIGI_COLL_DET_VOL_DEF_PACKET_ID_V2] = true;
01373 OutgoingHandlerTbl[CIGI_COMP_CTRL_PACKET_ID_V2] = (CigiBasePacket *) new CigiCompCtrlV2;
01374 VldSnd[CIGI_COMP_CTRL_PACKET_ID_V2] = true;
01375
01376 }
01377
01378
01379
01380
01381
01382 void CigiOutgoingMsg::SetOutgoingIGV2Tbls(void)
01383 {
01384
01385 OutgoingHandlerTbl[CIGI_SOF_PACKET_ID_V2] = (CigiBasePacket *) new CigiSOFV2;
01386 VldSnd[CIGI_SOF_PACKET_ID_V2] = true;
01387 OutgoingHandlerTbl[CIGI_COLL_DET_SEG_RESP_PACKET_ID_V2] = (CigiBasePacket *) new CigiCollDetSegRespV2;
01388 VldSnd[CIGI_COLL_DET_SEG_RESP_PACKET_ID_V2] = true;
01389 OutgoingHandlerTbl[CIGI_SENSOR_RESP_PACKET_ID_V2] = (CigiBasePacket *) new CigiSensorRespV2;
01390 VldSnd[CIGI_SENSOR_RESP_PACKET_ID_V2] = true;
01391 OutgoingHandlerTbl[CIGI_LOS_RESP_PACKET_ID_V2] = (CigiBasePacket *) new CigiLosRespV2;
01392 VldSnd[CIGI_LOS_RESP_PACKET_ID_V2] = true;
01393 OutgoingHandlerTbl[CIGI_HAT_RESP_PACKET_ID_V2] = (CigiBasePacket *) new CigiHatRespV2;
01394 VldSnd[CIGI_HAT_RESP_PACKET_ID_V2] = true;
01395 OutgoingHandlerTbl[CIGI_HOT_RESP_PACKET_ID_V2] = (CigiBasePacket *) new CigiHotRespV2;
01396 VldSnd[CIGI_HOT_RESP_PACKET_ID_V2] = true;
01397 OutgoingHandlerTbl[CIGI_COLL_DET_VOL_RESP_PACKET_ID_V2] = (CigiBasePacket *) new CigiCollDetVolRespV2;
01398 VldSnd[CIGI_COLL_DET_VOL_RESP_PACKET_ID_V2] = true;
01399 OutgoingHandlerTbl[CIGI_IG_MSG_PACKET_ID_V2] = (CigiBasePacket *) new CigiIGMsgV2;
01400 VldSnd[CIGI_IG_MSG_PACKET_ID_V2] = true;
01401
01402 }
01403
01404
01405
01406
01407
01408 void CigiOutgoingMsg::SetOutgoingHostV3Tbls(void)
01409 {
01410
01411 if(OutgoingVersion.CigiMinorVersion >= 2)
01412 {
01413 if(OutgoingVersion.CigiMinorVersion >= 3)
01414 {
01415 OutgoingHandlerTbl[CIGI_IG_CTRL_PACKET_ID_V3_3] = (CigiBasePacket *) new CigiIGCtrlV3_3;
01416 VldSnd[CIGI_IG_CTRL_PACKET_ID_V3_3] = true;
01417 OutgoingHandlerTbl[CIGI_ENTITY_CTRL_PACKET_ID_V3_3] = (CigiBasePacket *) new CigiEntityCtrlV3_3;
01418 VldSnd[CIGI_ENTITY_CTRL_PACKET_ID_V3_3] = true;
01419 OutgoingHandlerTbl[CIGI_SYMBOL_SURFACE_DEF_PACKET_ID_V3_3] = (CigiBasePacket *) new CigiSymbolSurfaceDefV3_3;
01420 VldSnd[CIGI_SYMBOL_SURFACE_DEF_PACKET_ID_V3_3] = true;
01421 OutgoingHandlerTbl[CIGI_SYMBOL_CONTROL_PACKET_ID_V3_3] = (CigiBasePacket *) new CigiSymbolCtrlV3_3;
01422 VldSnd[CIGI_SYMBOL_CONTROL_PACKET_ID_V3_3] = true;
01423 OutgoingHandlerTbl[CIGI_SHORT_SYMBOL_CONTROL_PACKET_ID_V3_3] = (CigiBasePacket *) new CigiShortSymbolCtrlV3_3;
01424 VldSnd[CIGI_SHORT_SYMBOL_CONTROL_PACKET_ID_V3_3] = true;
01425 OutgoingHandlerTbl[CIGI_SYMBOL_TEXT_DEFINITION_PACKET_ID_V3_3] = (CigiBasePacket *) new CigiSymbolTextDefV3_3;
01426 VldSnd[CIGI_SYMBOL_TEXT_DEFINITION_PACKET_ID_V3_3] = true;
01427 OutgoingHandlerTbl[CIGI_SYMBOL_CIRCLE_DEFINITION_PACKET_ID_V3_3] = (CigiBasePacket *) new CigiSymbolCircleDefV3_3;
01428 VldSnd[CIGI_SYMBOL_CIRCLE_DEFINITION_PACKET_ID_V3_3] = true;
01429 OutgoingHandlerTbl[CIGI_SYMBOL_LINE_DEFINITION_PACKET_ID_V3_3] = (CigiBasePacket *) new CigiSymbolLineDefV3_3;
01430 VldSnd[CIGI_SYMBOL_LINE_DEFINITION_PACKET_ID_V3_3] = true;
01431 OutgoingHandlerTbl[CIGI_SYMBOL_CLONE_PACKET_ID_V3_3] = (CigiBasePacket *) new CigiSymbolCloneV3_3;
01432 VldSnd[CIGI_SYMBOL_CLONE_PACKET_ID_V3_3] = true;
01433 OutgoingHandlerTbl[CIGI_COMP_CTRL_PACKET_ID_V3_3] = (CigiBasePacket *) new CigiCompCtrlV3_3;
01434 VldSnd[CIGI_COMP_CTRL_PACKET_ID_V3_3] = true;
01435 OutgoingHandlerTbl[CIGI_SHORT_COMP_CTRL_PACKET_ID_V3_3] = (CigiBasePacket *) new CigiShortCompCtrlV3_3;
01436 VldSnd[CIGI_SHORT_COMP_CTRL_PACKET_ID_V3_3] = true;
01437 }
01438 else
01439 {
01440 OutgoingHandlerTbl[CIGI_IG_CTRL_PACKET_ID_V3_2] = (CigiBasePacket *) new CigiIGCtrlV3_2;
01441 VldSnd[CIGI_IG_CTRL_PACKET_ID_V3_2] = true;
01442 OutgoingHandlerTbl[CIGI_ENTITY_CTRL_PACKET_ID_V3] = (CigiBasePacket *) new CigiEntityCtrlV3;
01443 VldSnd[CIGI_ENTITY_CTRL_PACKET_ID_V3] = true;
01444 OutgoingHandlerTbl[CIGI_COMP_CTRL_PACKET_ID_V3] = (CigiBasePacket *) new CigiCompCtrlV3;
01445 VldSnd[CIGI_COMP_CTRL_PACKET_ID_V3] = true;
01446 OutgoingHandlerTbl[CIGI_SHORT_COMP_CTRL_PACKET_ID_V3] = (CigiBasePacket *) new CigiShortCompCtrlV3;
01447 VldSnd[CIGI_SHORT_COMP_CTRL_PACKET_ID_V3] = true;
01448 }
01449 OutgoingHandlerTbl[CIGI_RATE_CTRL_PACKET_ID_V3] = (CigiBasePacket *) new CigiRateCtrlV3_2;
01450 VldSnd[CIGI_RATE_CTRL_PACKET_ID_V3] = true;
01451 OutgoingHandlerTbl[CIGI_HAT_HOT_REQ_PACKET_ID_V3] = (CigiBasePacket *) new CigiHatHotReqV3_2;
01452 VldSnd[CIGI_HAT_HOT_REQ_PACKET_ID_V3] = true;
01453 OutgoingHandlerTbl[CIGI_LOS_SEG_REQ_PACKET_ID_V3] = (CigiBasePacket *) new CigiLosSegReqV3_2;
01454 VldSnd[CIGI_LOS_SEG_REQ_PACKET_ID_V3] = true;
01455 OutgoingHandlerTbl[CIGI_LOS_VECT_REQ_PACKET_ID_V3] = (CigiBasePacket *) new CigiLosVectReqV3_2;
01456 VldSnd[CIGI_LOS_VECT_REQ_PACKET_ID_V3] = true;
01457 }
01458 else
01459 {
01460 OutgoingHandlerTbl[CIGI_IG_CTRL_PACKET_ID_V3] = (CigiBasePacket *) new CigiIGCtrlV3;
01461 VldSnd[CIGI_IG_CTRL_PACKET_ID_V3] = true;
01462 OutgoingHandlerTbl[CIGI_ENTITY_CTRL_PACKET_ID_V3] = (CigiBasePacket *) new CigiEntityCtrlV3;
01463 VldSnd[CIGI_ENTITY_CTRL_PACKET_ID_V3] = true;
01464 OutgoingHandlerTbl[CIGI_RATE_CTRL_PACKET_ID_V3] = (CigiBasePacket *) new CigiRateCtrlV3;
01465 VldSnd[CIGI_RATE_CTRL_PACKET_ID_V3] = true;
01466 OutgoingHandlerTbl[CIGI_HAT_HOT_REQ_PACKET_ID_V3] = (CigiBasePacket *) new CigiHatHotReqV3;
01467 VldSnd[CIGI_HAT_HOT_REQ_PACKET_ID_V3] = true;
01468 OutgoingHandlerTbl[CIGI_LOS_SEG_REQ_PACKET_ID_V3] = (CigiBasePacket *) new CigiLosSegReqV3;
01469 VldSnd[CIGI_LOS_SEG_REQ_PACKET_ID_V3] = true;
01470 OutgoingHandlerTbl[CIGI_LOS_VECT_REQ_PACKET_ID_V3] = (CigiBasePacket *) new CigiLosVectReqV3;
01471 VldSnd[CIGI_LOS_VECT_REQ_PACKET_ID_V3] = true;
01472 OutgoingHandlerTbl[CIGI_COMP_CTRL_PACKET_ID_V3] = (CigiBasePacket *) new CigiCompCtrlV3;
01473 VldSnd[CIGI_COMP_CTRL_PACKET_ID_V3] = true;
01474 OutgoingHandlerTbl[CIGI_SHORT_COMP_CTRL_PACKET_ID_V3] = (CigiBasePacket *) new CigiShortCompCtrlV3;
01475 VldSnd[CIGI_SHORT_COMP_CTRL_PACKET_ID_V3] = true;
01476 }
01477
01478 OutgoingHandlerTbl[CIGI_VIEW_DEF_PACKET_ID_V3] = (CigiBasePacket *) new CigiViewDefV3;
01479 VldSnd[CIGI_VIEW_DEF_PACKET_ID_V3] = true;
01480 OutgoingHandlerTbl[CIGI_VIEW_CTRL_PACKET_ID_V3] = (CigiBasePacket *) new CigiViewCtrlV3;
01481 VldSnd[CIGI_VIEW_CTRL_PACKET_ID_V3] = true;
01482 OutgoingHandlerTbl[CIGI_SENSOR_CTRL_PACKET_ID_V3] = (CigiBasePacket *) new CigiSensorCtrlV3;
01483 VldSnd[CIGI_SENSOR_CTRL_PACKET_ID_V3] = true;
01484 OutgoingHandlerTbl[CIGI_TRAJECTORY_DEF_PACKET_ID_V3] = (CigiBasePacket *) new CigiTrajectoryDefV3;
01485 VldSnd[CIGI_TRAJECTORY_DEF_PACKET_ID_V3] = true;
01486 OutgoingHandlerTbl[CIGI_WEATHER_CTRL_PACKET_ID_V3] = (CigiBasePacket *) new CigiWeatherCtrlV3;
01487 VldSnd[CIGI_WEATHER_CTRL_PACKET_ID_V3] = true;
01488 OutgoingHandlerTbl[CIGI_COLL_DET_SEG_DEF_PACKET_ID_V3] = (CigiBasePacket *) new CigiCollDetSegDefV3;
01489 VldSnd[CIGI_COLL_DET_SEG_DEF_PACKET_ID_V3] = true;
01490 OutgoingHandlerTbl[CIGI_ATMOS_CTRL_PACKET_ID_V3] = (CigiBasePacket *) new CigiAtmosCtrlV3;
01491 VldSnd[CIGI_ATMOS_CTRL_PACKET_ID_V3] = true;
01492 OutgoingHandlerTbl[CIGI_CELESTIAL_CTRL_PACKET_ID_V3] = (CigiBasePacket *) new CigiCelestialCtrlV3;
01493 VldSnd[CIGI_CELESTIAL_CTRL_PACKET_ID_V3] = true;
01494 OutgoingHandlerTbl[CIGI_ART_PART_CTRL_PACKET_ID_V3] = (CigiBasePacket *) new CigiArtPartCtrlV3;
01495 VldSnd[CIGI_ART_PART_CTRL_PACKET_ID_V3] = true;
01496 OutgoingHandlerTbl[CIGI_COLL_DET_VOL_DEF_PACKET_ID_V3] = (CigiBasePacket *) new CigiCollDetVolDefV3;
01497 VldSnd[CIGI_COLL_DET_VOL_DEF_PACKET_ID_V3] = true;
01498 OutgoingHandlerTbl[CIGI_SHORT_ART_PART_CTRL_PACKET_ID_V3] = (CigiBasePacket *) new CigiShortArtPartCtrlV3;
01499 VldSnd[CIGI_SHORT_ART_PART_CTRL_PACKET_ID_V3] = true;
01500 OutgoingHandlerTbl[CIGI_CONF_CLAMP_ENTITY_CTRL_PACKET_ID_V3] = (CigiBasePacket *) new CigiConfClampEntityCtrlV3;
01501 VldSnd[CIGI_CONF_CLAMP_ENTITY_CTRL_PACKET_ID_V3] = true;
01502 OutgoingHandlerTbl[CIGI_MARITIME_SURFACE_CTRL_PACKET_ID_V3] = (CigiBasePacket *) new CigiMaritimeSurfaceCtrlV3;
01503 VldSnd[CIGI_MARITIME_SURFACE_CTRL_PACKET_ID_V3] = true;
01504 OutgoingHandlerTbl[CIGI_ENV_RGN_CTRL_PACKET_ID_V3] = (CigiBasePacket *) new CigiEnvRgnCtrlV3;
01505 VldSnd[CIGI_ENV_RGN_CTRL_PACKET_ID_V3] = true;
01506 OutgoingHandlerTbl[CIGI_TERRESTRIAL_SURFACE_CTRL_PACKET_ID_V3] = (CigiBasePacket *) new CigiTerrestrialSurfaceCtrlV3;
01507 VldSnd[CIGI_TERRESTRIAL_SURFACE_CTRL_PACKET_ID_V3] = true;
01508 OutgoingHandlerTbl[CIGI_MOTION_TRACK_CTRL_PACKET_ID_V3] = (CigiBasePacket *) new CigiMotionTrackCtrlV3;
01509 VldSnd[CIGI_MOTION_TRACK_CTRL_PACKET_ID_V3] = true;
01510 OutgoingHandlerTbl[CIGI_EARTH_MODEL_DEF_PACKET_ID_V3] = (CigiBasePacket *) new CigiEarthModelDefV3;
01511 VldSnd[CIGI_EARTH_MODEL_DEF_PACKET_ID_V3] = true;
01512 OutgoingHandlerTbl[CIGI_POSITION_REQ_PACKET_ID_V3] = (CigiBasePacket *) new CigiPositionReqV3;
01513 VldSnd[CIGI_POSITION_REQ_PACKET_ID_V3] = true;
01514 OutgoingHandlerTbl[CIGI_ENV_COND_REQ_PACKET_ID_V3] = (CigiBasePacket *) new CigiEnvCondReqV3;
01515 VldSnd[CIGI_ENV_COND_REQ_PACKET_ID_V3] = true;
01516 OutgoingHandlerTbl[CIGI_WAVE_CTRL_PACKET_ID_V3] = (CigiBasePacket *) new CigiWaveCtrlV3;
01517 VldSnd[CIGI_WAVE_CTRL_PACKET_ID_V3] = true;
01518
01519 }
01520
01521
01522
01523
01524
01525 void CigiOutgoingMsg::SetOutgoingIGV3Tbls(void)
01526 {
01527
01528 if(OutgoingVersion.CigiMinorVersion >= 2)
01529 {
01530 OutgoingHandlerTbl[CIGI_SOF_PACKET_ID_V3] = (CigiBasePacket *) new CigiSOFV3_2;
01531 VldSnd[CIGI_SOF_PACKET_ID_V3] = true;
01532 OutgoingHandlerTbl[CIGI_LOS_RESP_PACKET_ID_V3] = (CigiBasePacket *) new CigiLosRespV3_2;
01533 VldSnd[CIGI_LOS_RESP_PACKET_ID_V3] = true;
01534 OutgoingHandlerTbl[CIGI_LOS_XRESP_PACKET_ID_V3] = (CigiBasePacket *) new CigiLosXRespV3_2;
01535 VldSnd[CIGI_LOS_XRESP_PACKET_ID_V3] = true;
01536 OutgoingHandlerTbl[CIGI_HAT_HOT_RESP_PACKET_ID_V3] = (CigiBasePacket *) new CigiHatHotRespV3_2;
01537 VldSnd[CIGI_HAT_HOT_RESP_PACKET_ID_V3] = true;
01538 OutgoingHandlerTbl[CIGI_HAT_HOT_XRESP_PACKET_ID_V3] = (CigiBasePacket *) new CigiHatHotXRespV3_2;
01539 VldSnd[CIGI_HAT_HOT_XRESP_PACKET_ID_V3] = true;
01540 }
01541 else
01542 {
01543 OutgoingHandlerTbl[CIGI_SOF_PACKET_ID_V3] = (CigiBasePacket *) new CigiSOFV3;
01544 VldSnd[CIGI_SOF_PACKET_ID_V3] = true;
01545 OutgoingHandlerTbl[CIGI_LOS_RESP_PACKET_ID_V3] = (CigiBasePacket *) new CigiLosRespV3;
01546 VldSnd[CIGI_LOS_RESP_PACKET_ID_V3] = true;
01547 OutgoingHandlerTbl[CIGI_LOS_XRESP_PACKET_ID_V3] = (CigiBasePacket *) new CigiLosXRespV3;
01548 VldSnd[CIGI_LOS_XRESP_PACKET_ID_V3] = true;
01549 OutgoingHandlerTbl[CIGI_HAT_HOT_RESP_PACKET_ID_V3] = (CigiBasePacket *) new CigiHatHotRespV3;
01550 VldSnd[CIGI_HAT_HOT_RESP_PACKET_ID_V3] = true;
01551 OutgoingHandlerTbl[CIGI_HAT_HOT_XRESP_PACKET_ID_V3] = (CigiBasePacket *) new CigiHatHotXRespV3;
01552 VldSnd[CIGI_HAT_HOT_XRESP_PACKET_ID_V3] = true;
01553 }
01554
01555 OutgoingHandlerTbl[CIGI_COLL_DET_SEG_RESP_PACKET_ID_V3] = (CigiBasePacket *) new CigiCollDetSegRespV3;
01556 VldSnd[CIGI_COLL_DET_SEG_RESP_PACKET_ID_V3] = true;
01557 OutgoingHandlerTbl[CIGI_SENSOR_RESP_PACKET_ID_V3] = (CigiBasePacket *) new CigiSensorRespV3;
01558 VldSnd[CIGI_SENSOR_RESP_PACKET_ID_V3] = true;
01559 OutgoingHandlerTbl[CIGI_SENSOR_XRESP_PACKET_ID_V3] = (CigiBasePacket *) new CigiSensorXRespV3;
01560 VldSnd[CIGI_SENSOR_XRESP_PACKET_ID_V3] = true;
01561 OutgoingHandlerTbl[CIGI_COLL_DET_VOL_RESP_PACKET_ID_V3] = (CigiBasePacket *) new CigiCollDetVolRespV3;
01562 VldSnd[CIGI_COLL_DET_VOL_RESP_PACKET_ID_V3] = true;
01563 OutgoingHandlerTbl[CIGI_POSITION_RESP_PACKET_ID_V3] = (CigiBasePacket *) new CigiPositionRespV3;
01564 VldSnd[CIGI_POSITION_RESP_PACKET_ID_V3] = true;
01565 OutgoingHandlerTbl[CIGI_WEATHER_COND_RESP_PACKET_ID_V3] = (CigiBasePacket *) new CigiWeatherCondRespV3;
01566 VldSnd[CIGI_WEATHER_COND_RESP_PACKET_ID_V3] = true;
01567 OutgoingHandlerTbl[CIGI_AEROSOL_RESP_PACKET_ID_V3] = (CigiBasePacket *) new CigiAerosolRespV3;
01568 VldSnd[CIGI_AEROSOL_RESP_PACKET_ID_V3] = true;
01569 OutgoingHandlerTbl[CIGI_MARITIME_SURFACE_RESP_PACKET_ID_V3] = (CigiBasePacket *) new CigiMaritimeSurfaceRespV3;
01570 VldSnd[CIGI_MARITIME_SURFACE_RESP_PACKET_ID_V3] = true;
01571 OutgoingHandlerTbl[CIGI_TERRESTRIAL_SURFACE_RESP_PACKET_ID_V3] = (CigiBasePacket *) new CigiTerrestrialSurfaceRespV3;
01572 VldSnd[CIGI_TERRESTRIAL_SURFACE_RESP_PACKET_ID_V3] = true;
01573 OutgoingHandlerTbl[CIGI_ANIMATION_STOP_PACKET_ID_V3] = (CigiBasePacket *) new CigiAnimationStopV3;
01574 VldSnd[CIGI_ANIMATION_STOP_PACKET_ID_V3] = true;
01575 OutgoingHandlerTbl[CIGI_EVENT_NOTIFICATION_PACKET_ID_V3] = (CigiBasePacket *) new CigiEventNotificationV3;
01576 VldSnd[CIGI_EVENT_NOTIFICATION_PACKET_ID_V3] = true;
01577 OutgoingHandlerTbl[CIGI_IG_MSG_PACKET_ID_V3] = (CigiBasePacket *) new CigiIGMsgV3;
01578 VldSnd[CIGI_IG_MSG_PACKET_ID_V3] = true;
01579
01580 }
01581
01582