⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hcicommand.cpp

📁 蓝牙协议HCI层指令发送,主要用于测试HCI以下的代码及RF部分测试.
💻 CPP
字号:
//--------------------------------------------------------------- %FILH_BEG% --
//-----------------------------------------------------------------------------
//
//  Project:		$$ProjectName
//
//  File name:		HCICommand.cpp
//  Author:			Ebrahim Khorasani 
//  Description:	  
//
//  Revision History:
//  $Log: $
//
//  Rev 1.00  15 July 2000 Initial release
//    
//
//  Copyright (c) TelenComm Corporation  2000   -   All rights reserved    
//--------------------------------------------------------------- %FILH_END% 

//------------------------------------------------------------------------------
//
//  Includes
//
//------------------------------------------------------------------------------
#include "..\..\..\stdafx.h"
#include "..\..\..\BTHost.h"
#include "process.h"

#include "..\Inc\HCICommandProc.h"
#include "..\Inc\HCICmdPacket.h"
#include "..\Inc\HCICmdTables.h"

//------------------------------------------------------------------------------
//
//  Code
//
//------------------------------------------------------------------------------
CHCICommandProcessor::CHCICommandProcessor(void)
                     :CHCILinkControlCmdProcessor(),
                      CHCILinkPolicyCmdProcessor(),
                      CHCIHC_BaseBandCmdProcessor(),
                      CHCIInfoParmProcessor(),
  		              CHCIStatusParmProcessor(),
					  CHCITestingCmdProcessor(),
					  CHCIVendSpecCmdProcessor()
               
{
  if(!ValidateHCICommandTables())
  {
    printf("Function DB or Table is corrupted");
    abort();
  }
}
bool CHCICommandProcessor::ValidateHCICommandTables(void)
{
  FOR_LOOP(CmdType,(sint32)eFIRST_CMD_TYPE,(sint32)eLAST_CMD_TYPE + 1)
  {
    if(!ValidateTableType((CHCIBaseCmdProcessor::eHCICmdType)CmdType))
      return false;
  }
    return true;
}
bool CHCICommandProcessor::ValidateTableType(eHCICmdType CmdType)
{
#ifdef BT_DEBUG
  tHCICommandTableItem*  HCICommandTable = CmdTypeTable[CmdType].CmdTable;
  int                   NoOfCmds        = CmdTypeTable[CmdType].NoOfCmds;
  int i;
  uint8  PrevOGF;
  uint16 PrevOCF;
  uint16 PrevOpCode;

  assert(NoOfCmds > 0);

  PrevOGF    = HCICommandTable[0].OpCodeGroupField;
  PrevOCF    = HCICommandTable[0].OpCodeCommandField;
  PrevOpCode = HCICommandTable[0].OpCode;
  PrevOpCode = MAKE_OPCODE(PrevOGF, PrevOCF);
  for (i = 1; i < NoOfCmds; i++)
  {
    if (HCICommandTable[i].OpCodeGroupField == PrevOGF)
      assert(HCICommandTable[i].OpCodeCommandField > PrevOCF);
    else
      assert(HCICommandTable[i].OpCodeGroupField > PrevOGF);

    assert(HCICommandTable[i].OpCode > PrevOpCode);

    PrevOGF    = HCICommandTable[i].OpCodeGroupField;
    PrevOCF    = HCICommandTable[i].OpCodeCommandField;;
    PrevOpCode = HCICommandTable[i].OpCode;
  }

  for (i = 0; i < NoOfCmds; i++)
  {
    assert(HCICommandTable[i].OpCode == 
           MAKE_OPCODE(HCICommandTable[i].OpCodeGroupField,
                       HCICommandTable[i].OpCodeCommandField));
    assert(HCICommandTable[i].OpCodeGroupField == 
           GET_OGF(HCICommandTable[i].OpCode));
    assert(HCICommandTable[i].OpCodeCommandField == 
           GET_OCF(HCICommandTable[i].OpCode));
    assert(HCICommandTable[i].CommandFunction != NULL);
    assert(HCICommandTable[i].SpecSection != NULL);
    assert(HCICommandTable[i].Name != NULL);
  }


#endif BT_DEBUG
  return true;
}

//------------------------------------------------------------------------------

void CHCICommandProcessor::PrintHCICommandTable(eHCICmdType CmdType)
{
  tHCICommandTableItem*  HCICommandTable = CmdTypeTable[CmdType].CmdTable;
  int                   NoOfCmds        = CmdTypeTable[CmdType].NoOfCmds;

  int i;

  printf("\n");
  printf("HCICommandTable\n");
  printf("===============\n\n");

  for (i = 0; i < NoOfCmds; i++)
  {
    printf("Entry[%0i] -----------\n");
    printf("----------------------\n");
    printf("OpCode:               %x\n", HCICommandTable[i].OpCode);
    printf("OpCodeGroupField:     %x\n", HCICommandTable[i].OpCodeGroupField);
    printf("OpCodeCommandField:   %x\n", HCICommandTable[i].OpCodeCommandField);
    printf("ParameterTotalLength: %x\n", HCICommandTable[i].ParameterTotalLength);
    printf("CommandFunction:      %x\n", HCICommandTable[i].CommandFunction);
    printf("SpecSection:          %s\n", HCICommandTable[i].SpecSection);
    printf("Name:                 %s\n", HCICommandTable[i].Name);
  }
  printf("----------------------\n\n");
}

//------------------------------------------------------------------------------

int CHCICommandProcessor::FindHCICommandType(uint16 OpCode)
{
  int Lower,Upper,Current;
  int FindIdx = -1;
  int CmdType = GET_OGF(OpCode);

  if (CmdType == 0x3F)
	  CmdType = eVEND_SPEC_CMD;		// EK Vendor Specific Command

  if(CmdType >=1 && CmdType <= 7)
  {

    tHCICommandTableItem*   HCICommandTable = CmdTypeTable[CmdType].CmdTable;
    int                     MaxIdx        = CmdTypeTable[CmdType].NoOfCmds -1;


    Lower = 0;
    Upper = MaxIdx;

    FOR_LOOP(i,0,1000) // to avoid infinite loop
    {
      Current = (Upper + Lower) / 2;

      if (HCICommandTable[Current].OpCode > OpCode)
      {
        Upper = Current;
      }
      else if (HCICommandTable[Current].OpCode < OpCode)
      {
        Lower = Current+1;
      }
      else
      {
        FindIdx = Current;
        break;
      }

      if (Upper == Lower)
      {
        if(OpCode == HCICommandTable[MaxIdx].OpCode)
          FindIdx = MaxIdx;
        break; // not found
      }
    }
  }
  return FindIdx;
}

//------------------------------------------------------------------------------

CHCICommandProcessor::tCmdParseStatus CHCICommandProcessor::ParseHCICmdType(CHCI_CmdPacket& HCI_CmdPacket)
{

  ASSERT(0);
  /* update as per ParseHCIEventType function*/
  int Index;
  int OpCode = HCI_CmdPacket.GetOpCode();
  int CmdType = GET_OGF(OpCode);

  if (CmdType == 0x3F)
	  CmdType = eVEND_SPEC_CMD;		// EK Vendor Specific Command

  if(CmdType >=1 && CmdType <= 7)
  {
    if ( (Index = FindHCICommandType(OpCode) )!= -1 )
    {
    
      tHCICommandTableItem*   HCICommandTable = CmdTypeTable[CmdType].CmdTable;
      int                     NoOfCmds        = CmdTypeTable[CmdType].NoOfCmds;
    

      if ((HCICommandTable[Index].ParameterTotalLength != NO_PAR) &&
          (HCICommandTable[Index].ParameterTotalLength != 
           HCI_CmdPacket.GetParmLen()))
      {
        MessageBox(NULL,"Wrong parameter total length in command packet","Error",MB_OK|MB_ICONWARNING);
        return CHCIBaseCmdProcessor::ePARAMETER_SIZE_MISMATCH;
      }
      else
      {
          // Dispatch to HCI Command Function

          HCICommandTable[Index].CommandFunction(HCI_CmdPacket);
          return CHCIBaseCmdProcessor::ePARSING_OK;
      }
    }
  }
  MessageBox(NULL,"Wrong command code in Command Complete Event packet","Error",MB_OK|MB_ICONWARNING);
  return CHCIBaseCmdProcessor::eUNKNOWN_CMD;

}

CHCICommandProcessor::tCmdParseStatus  CHCICommandProcessor::ParseHCICommand(CHCI_CmdPacket& HCI_CmdPacket, sint32 PacketLen)
{
  //tCmdParseStatus retsts;
  //FOR_LOOP(CmdType,(sint32)eFIRST_CMD_TYPE,(sint32)eLAST_CMD_TYPE)
  //{
    //retsts=ParseHCICmdType(HCI_CmdPacket);
    //if( retsts==ePARSING_OK)
      //break;
  //}
  //return retsts;
    return ParseHCICmdType(HCI_CmdPacket);
}


//------------------------------------------------------------------------------
//  End of  HCICommand.cpp

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -