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

📄 controlfsm.cpp

📁 蓝牙芯片ZV4301的调试工具源码.做蓝牙产品时很有参考价值内部有串口的编程序源码,对有串口编成需求的同志有参考价值.
💻 CPP
字号:
#include <stdio.h>
#include <string.h>
#include "ControlFSM.h"

//#define USE_ZERIAL_HCICONSOLE

#define ZERIAL_CONSOLE_HEAD "AT+ZV console"
#define ZERIAL_HCICONSOLE_HEAD "AT+ZV hciconsole"
#define ZERIAL_CMD_END "\r\n"

static void LOCAL_ON_ZEEVO_PRINT(Thci_evt_zeevo_event_print *);
static _CtrlFSM *local_ctrlfsm = NULL;
int SEARCH_STR(char *target, char *str);
/*******************************************************************************
* Constructor
*******************************************************************************/
_CtrlFSM::_CtrlFSM(void)
{
  DataOut = NULL;
  ON_ZEEVO_PRINT = NULL;
  FInterface = CI_HCI;  // Default use HCI
  FCmdState  = CCS_READY;
  _HCI_EVENT.ON_HCI_EVT_ZEEVO_PRINT = LOCAL_ON_ZEEVO_PRINT;
  local_ctrlfsm = this;
  _buffbytes = 0;
}
/*******************************************************************************
* Destructor
*******************************************************************************/
_CtrlFSM:: ~_CtrlFSM()
{
}
/*******************************************************************************
* Set Interface
*******************************************************************************/
void __fastcall _CtrlFSM::SetInterface(_CtrlInterface new_interface)
{
  FCmdState  = CCS_READY;
  FInterface = new_interface;
}
/*******************************************************************************
* Data in
*******************************************************************************/
void __fastcall _CtrlFSM::Input(unsigned __int8 *data, unsigned __int16 len)
{
  switch(FInterface){
    case CI_HCI:
      if(!_HCI_EVENT.Input(data, len))
        _HCI_EVENT.Clear();
      break;
    case CI_ZERIAL:
#ifdef USE_ZERIAL_HCICONSOLE
      if(!_HCI_EVENT.Input(data, len))
        _HCI_EVENT.Clear();
#else
        memcpy(&_buff[_buffbytes], data, len);
        _buffbytes+=len;
#endif
      break;
  }
}
/*******************************************************************************
* Parse the data
*******************************************************************************/
void __fastcall _CtrlFSM::Execute(void)
{
  _EVT_RESULT hci_evt_result;
  switch(FInterface){
    case CI_HCI:
       hci_evt_result = _HCI_EVENT.ParseEvent();
       if(EVT_OK == hci_evt_result || EVT_INVALID == hci_evt_result)
         _HCI_EVENT.Clear();
       else if(EVT_MOREDATA == hci_evt_result)
         Execute();
      break;
    case CI_ZERIAL:
#ifdef USE_ZERIAL_HCICONSOLE
       hci_evt_result = _HCI_EVENT.ParseEvent();
       if(EVT_OK == hci_evt_result || EVT_INVALID == hci_evt_result)
         _HCI_EVENT.Clear();
       else if(EVT_MOREDATA == hci_evt_result)
         Execute();
#else
         ParseZerial();
#endif
      break;
  }

}

/*******************************************************************************
* Send data
*******************************************************************************/
void __fastcall _CtrlFSM::FDataOut(unsigned __int8 *data, unsigned __int16 len)
{
  if(DataOut && len > 0)
  {
    DataOut(data, len);
  }
}
/*******************************************************************************
* Send Reset Cmd
*******************************************************************************/
void __fastcall _CtrlFSM::CmdReset(void)
{
  char sendbuff[512];
  int sendbytes = 0;
  switch(FInterface){
    case CI_HCI:
      _HCI_CMD.opcode.ogf = OGF_HOST_CONTROLLER_BASEBAND_COMMAND;
      _HCI_CMD.opcode.ocf = OCF_RESET;
      sendbytes = _HCI_CMD.MakeCommand(TL_H4, sendbuff, 512);
      break;
    case CI_ZERIAL:

      break;
  }
  FCmdState = CCS_CMD;
  FDataOut(sendbuff, sendbytes);
}
/*******************************************************************************
* Send Read Local Version Cmd
*******************************************************************************/
void __fastcall _CtrlFSM::CmdReadLocalVersion(void)
{
  char sendbuff[512];
  int sendbytes = 0;
  switch(FInterface){
    case CI_HCI:
      _HCI_CMD.opcode.ogf = OGF_INFOMATION_PARAMETERS;
      _HCI_CMD.opcode.ocf = OCF_READ_LOCAL_VERSION;
      sendbytes = _HCI_CMD.MakeCommand(TL_H4, sendbuff, 512);
      break;
    case CI_ZERIAL:
      break;
  }
  FCmdState = CCS_CMD;
  FDataOut(sendbuff, sendbytes);
}

/*******************************************************************************
* Send Read Local Name Cmd
*******************************************************************************/
void __fastcall _CtrlFSM::CmdReadLocalName(void)
{
  char sendbuff[1024];
  int sendbytes = 0;
  switch(FInterface){
    case CI_HCI:
      _HCI_CMD.opcode.ogf = OGF_HOST_CONTROLLER_BASEBAND_COMMAND;
      _HCI_CMD.opcode.ocf = OCF_READ_LOCAL_NAME;
      sendbytes = _HCI_CMD.MakeCommand(TL_H4, sendbuff, 512);
      break;
    case CI_ZERIAL:
      break;
  }
  FCmdState = CCS_CMD;
  FDataOut(sendbuff, sendbytes);
}
/*******************************************************************************
* Send Zeevo Console Cmd
*******************************************************************************/
void __fastcall _CtrlFSM::CmdConsole(char *string)
{
  char sendbuff[1024];
  int sendbytes = 0;
  switch(FInterface){
    case CI_HCI:
      _HCI_CMD.opcode.ogf = OGF_ZEEVO_SPECIFIC_COMMAND;
      _HCI_CMD.opcode.ocf = OCF_CONSOLE_COMMAND;
      _HCI_CMD.param._len = strlen(string) + 1;
      strcpy(_HCI_CMD.param._data, string);
      sendbytes = _HCI_CMD.MakeCommand(TL_H4, sendbuff, 1024);
      _HCI_EVENT.Clear();
      FCmdState = CCS_CMD;
      break;
    case CI_ZERIAL:
#ifdef USE_ZERIAL_HCICONSOLE
      sprintf(sendbuff,"%s %s%s", ZERIAL_HCICONSOLE_HEAD, string,ZERIAL_CMD_END);
#else
      sprintf(sendbuff,"%s %s%s", ZERIAL_CONSOLE_HEAD, string,ZERIAL_CMD_END);
#endif
      sendbytes = strlen(sendbuff);
      break;
  }

  FDataOut(sendbuff, sendbytes);
}

/*******************************************************************************
* Send Zeevo Console Cmd - Reset
*******************************************************************************/
void __fastcall _CtrlFSM::CmdConsoleReset(void)
{
  CmdConsole("reset");
}

/*******************************************************************************
* Zeevo Print Event
*******************************************************************************/
static void LOCAL_ON_ZEEVO_PRINT(Thci_evt_zeevo_event_print *Value)
{
  if(local_ctrlfsm)
    local_ctrlfsm->HCIEvtZVPrint(Value);
}
void __fastcall _CtrlFSM::HCIEvtZVPrint(Thci_evt_zeevo_event_print *Value)
{
  if(ON_ZEEVO_PRINT)
    ON_ZEEVO_PRINT(Value);

  if(SEARCH_STR(Value->value, "Done.") >= 0)
    FCmdState  = CCS_READY;
}

/*******************************************************************************
* Parse Zerial event
*******************************************************************************/
void __fastcall _CtrlFSM::ParseZerial(void)
{
  int head = 0;
  if(_buffbytes)
  {
    // Find 0x0D0A
    for(int i=0;i<_buffbytes; i++)
    {
      if(_buff[i] == 0x0D || _buff[i] == 0x0A)
      {
        if(head < i)
        {
          AnalyzeZerial(&_buff[head], i-head);
        }
        head = i+1;
      }
    }
  }
  _buffbytes = _buffbytes - head;
  if(_buffbytes < 0)
    _buffbytes = 0;
  memcpy(_buff, &_buff[head], _buffbytes);
}

/*******************************************************************************
* Analyze Zerial event
*******************************************************************************/
void __fastcall _CtrlFSM::AnalyzeZerial(unsigned __int8 *data, unsigned __int16 len)
{
  if(len)
  {
    Thci_evt_zeevo_event_print print;
    memset(&print, 0, sizeof(Thci_evt_zeevo_event_print));
    memcpy(print.value, data, len);
    print.value[len+1] = 0x00;
    HCIEvtZVPrint(&print);
  }

}

/*******************************************************************************
* Find the str in the target
*******************************************************************************/
int SEARCH_STR(char *target, char *str)
{
  int targetlen = strlen(target);
  int _strlen = strlen(str);
  for(int i = 0; i<targetlen; i++)
  {
    if(target[i] == str[0] && (targetlen - i) >= _strlen)
    {
      if( memcmp(&target[i], str, _strlen) == 0)
        return i;
    }
  }

  return -1;
}

⌨️ 快捷键说明

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