📄 controlfsm.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 + -