#include "ordevicemocap_device.h"
#define ORDEVICEMOCAP_CLASS ORDEVICEMOCAP_CLASSNAME
#define ORDEVICEMOCAP_NAME ORDEVICEMOCAP_CLASSSTR
#define ORDEVICEMOCAP_LABEL "Kinect 1.0"
#define ORDEVICEMOCAP_DESC "Kinect 1.0"
#define ORDEVICEMOCAP_PREFIX "MocapDevice"
#define ORDEVICEMOCAP_ICON "devices_body.png"
ORDEVICEMOCAP_CLASSNAME,
ORDEVICEMOCAP_LABEL,
ORDEVICEMOCAP_DESC,
ORDEVICEMOCAP_ICON );
bool ORDeviceMocap::FBCreate()
{
ModelTemplate.Children.Add(mRootTemplate);
mHierarchyIsDefined = false;
mHasAnimationToTranspose = false;
mPlotting = false;
mCharacterPath = "";
mClipDirectory = "";
mReadyToSetupRecording = false;
mMocapCharacterName = "MocapDeviceCharacter";
UseReferenceTransformation = true;
mFileIO = new FileIO();
mDataFromFile = false;
mOperationState = eAskForCreateModelBinding;
mSpeechCommandType = eNoCommand;
mCalibrationAudioStartTime = 0;
FBSystem().TheOne().OnUIIdle.Add(
this,(
FBCallback) &ORDeviceMocap::EventUIIdle );
return true;
}
void ORDeviceMocap::FBDestroy()
{
delete mFileIO;
delete mMocapCharacter;
if( mCalibrationAudio.Ok() )
{
mCalibrationAudio->FBDelete();
}
ParentClass::FBDestroy();
FBSystem().TheOne().OnUIIdle.Remove(
this,(
FBCallback) &ORDeviceMocap::EventUIIdle );
}
bool ORDeviceMocap::DeviceOperation( kDeviceOperations pOperation )
{
switch (pOperation)
{
case kOpInit: return Init();
case kOpStart: return Start();
case kOpAutoDetect: break;
case kOpStop: return Stop();
case kOpReset: return Reset();
case kOpDone: return Done();
}
return ParentClass::DeviceOperation(pOperation);
}
bool ORDeviceMocap::Init()
{
if(!mHardware.GetSetupInfo())
{
UpdateInfo("Error:", "Cannot Setup Device");
return false;
}
SetOperationState(eAskForCreateModelBinding);
mHierarchyIsDefined = false;
Bind();
if( !mHardware.Init() )
{
UpdateInfo("Error:", "Cannot Initialize Device");
return false;
}
return true;
}
bool ORDeviceMocap::Done()
{
UnBind();
return true;
}
bool ORDeviceMocap::Reset()
{
Stop();
return Start();
}
bool ORDeviceMocap::Start()
{
FBProgress lProgress;
lProgress.Caption = "Mocap Device";
lProgress.Text = "Create Mocap Character";
if( !SetupMocapCharacter() )
{
UpdateInfo("Error: Failed ", "To Create Mocap Character");
return false;
}
if( mDataFromFile )
{
if( mFileIO->GetStatus() == eFileIOImport_Pause )
mFileIO->SetStatus(eFileIOImport_Start);
}
else
{
lProgress.Caption = "Mocap Device";
lProgress.Text = "Open Device";
if( !mHardware.Open() )
{
UpdateInfo("Error:", "Couldn't Start Device");
return false;
}
lProgress.Caption = "Mocap Device";
lProgress.Text = "Start Data Stream";
if( !mHardware.StartDataStream() )
{
UpdateInfo("Error:", "Couldn't Get Data");
return false;
}
lProgress.Caption = "Mocap Device";
lProgress.Text = "Adjust Kinect Angle";
if( !mHardware.AdjustAngle() )
{
UpdateInfo("Error:", "Angle Cannot Be Adjusted");
return false;
}
lProgress.Caption = "Mocap Device";
lProgress.Text = "Start Speech Control";
mHardware.SetupSpeechConnection();
}
SetOperationState(eAskForPressSetupRecording);
return true;
}
bool ORDeviceMocap::Stop()
{
if( mDataFromFile )
{
if( mFileIO->GetStatus() == eFileIOImport_Start )
mFileIO->SetStatus(eFileIOImport_Pause);
}
else
{
if(! mHardware.StopDataStream() )
{
UpdateInfo("Error:", "Cannot Stop Data");
return false;
}
if(! mHardware.Close() )
{
UpdateInfo("Error:", "Cannot Stop Device");
return false;
}
}
SetOperationState(eAskForPressOnline);
return true;
}
void ORDeviceMocap::DefineHierarchy()
{
if( !mHierarchyIsDefined && GetChannelCount() > 0 )
{
int lParent;
for(
int i=0;
i< GetChannelCount();
i++)
{
lParent = GetChannelParent(
i);
if(lParent == -1)
{
mRootTemplate->Children.Add(mChannels[
i].mModelTemplate);
}
else
{
mChannels[lParent].mModelTemplate->Children.Add(mChannels[
i].mModelTemplate);
}
}
mHierarchyIsDefined = true;
}
}
void ORDeviceMocap::ProcessGlobalToLocal()
{
SetupLocalGlobal(true);
FBModel* lModel;
for(i = 0; i < lModels.GetCount(); i++)
lModels[i]->Selected = false;
lModels.Clear();
for(i = 0; i < GetChannelCount(); i++)
{
if(mChannels[i].mModelTemplate && (lModel = mChannels[i].mModelTemplate->Model) !=
NULL)
{
lModel->Selected = true;
lModels.Add(lModel);
}
}
mPlotting = true;
FBSystem().CurrentTake->PlotTakeOnSelected(SamplingPeriod);
mPlotting = false;
for(i = 0; i < lModels.GetCount(); i++)
lModels[i]->Selected = false;
SetupLocalGlobal(false);
bool ApplyReferenceTransformation = UseReferenceTransformation && mRootTemplate->Model;
if(ApplyReferenceTransformation)
{
mRootTemplate->Model->Translation.SetData(&x);
mRootTemplate->Model->Rotation.SetData(&x);
}
}
void ORDeviceMocap::SetupLocalGlobal(bool pGlobal)
{
for( int i = 0; i < GetChannelCount(); i++ )
{
if( mChannels[i].mTAnimNode )
{
mChannels[
i].mTAnimNode->SetBufferType(pGlobal);
}
if( mChannels[i].mRAnimNode )
{
mChannels[
i].mRAnimNode->SetBufferType(pGlobal);
}
}
}
bool ORDeviceMocap::ModelTemplateUnBindNotify( int pIndex, FBModelTemplate* pModelTemplate)
{
if(pModelTemplate->Model && pModelTemplate->Model == mRootTemplate->Model && !ObjectInProcess)
{
FBPlayerControl().TheOne().EvaluationPause();
for( int i = 0; i < GetChannelCount(); i++ )
{
if(mChannels[i].mTAnimNode)
{
mChannels[
i].mModelTemplate->Model->Translation.SetAnimated(
true);
FBAnimationNode* lNode = mChannels[
i].mModelTemplate->Model->Translation.GetAnimationNode();
FBVector3d lVector(mChannels[i].mModelTemplate->Model->Translation);
lNode->SetCandidate(lVector.mValue);
}
if(mChannels[i].mRAnimNode)
{
mChannels[
i].mModelTemplate->Model->Rotation.SetAnimated(
true);
FBAnimationNode* lNode = mChannels[
i].mModelTemplate->Model->Rotation.GetAnimationNode();
FBVector3d lVector(mChannels[i].mModelTemplate->Model->Rotation);
lNode->SetCandidate(lVector.mValue);
}
}
FBPlayerControl().TheOne().EvaluationResume();
}
SetOperationState(eAskForPressOnline);
return true;
}
static void SetupMapping(FBCharacter* pCharacter, FBModel* pParent)
{
FBString lName = (const char*)pParent->Name; lName += "Link";
FBProperty* lLink = pCharacter->PropertyList.Find(lName,false);
if(lLink && lLink->IsList())
{
((FBPropertyListComponent*)lLink)->Add(pParent);
}
for(int i = 0; i < pParent->Children.GetCount(); i++)
{
SetupMapping(pCharacter,pParent->Children[i]);
}
}
bool ORDeviceMocap::SetupMocapCharacter()
{
if( mMocapCharacter )
return true;
if( !mHierarchyIsDefined || GetChannelCount() <= 0 || !mRootTemplate->Model )
return false;
mMocapCharacter = new FBCharacter("MocapDeviceCharacter");
SetupMapping(mMocapCharacter, mRootTemplate->Model);
mMocapCharacter->SetCharacterizeOn(true);
mMocapCharacter->SetExternalSolver(2);
mMocapCharacter->Active = true;
mHardware.GetSkeletonJointsOrder(pSkeletonJointsOrder);
delete pSkeletonJointsOrder;
UnBind();
return true;
}
bool ORDeviceMocap::ModelTemplateBindNotify( FBModel* pModel,int pIndex, FBModelTemplate* pModelTemplate )
{
return true;
}
void ORDeviceMocap::Bind()
{
for( i = 0; i < GetChannelCount(); i++ )
{
if( !mChannels[i].mTAnimNode )
{
FBString lName( GetChannelName(i), " T" );
}
if( !mChannels[i].mRAnimNode )
{
FBString lName( GetChannelName(i), " R" );
}
if(!mChannels[i].mModelTemplate)
{
mChannels[
i].mModelTemplate->Bindings.Add(mChannels[i].mTAnimNode);
mChannels[
i].mModelTemplate->Bindings.Add(mChannels[i].mRAnimNode);
}
}
DefineHierarchy();
}
void ORDeviceMocap::UnBind()
{
for( i = 0; i < GetChannelCount(); i++ )
{
if( mChannels[i].mTAnimNode )
{
if( mChannels[i].mModelTemplate )
{
mChannels[
i].mModelTemplate->Bindings.Remove(mChannels[i].mTAnimNode);
}
}
if( mChannels[i].mRAnimNode )
{
if( mChannels[i].mModelTemplate )
{
mChannels[
i].mModelTemplate->Bindings.Remove(mChannels[i].mRAnimNode);
}
}
if( mRootTemplate->Children.Find(mChannels[i].mModelTemplate) >= 0 )
{
mRootTemplate->Children.Remove(mChannels[i].mModelTemplate);
}
if( mChannels[i].mTAnimNode )
{
AnimationNodeDestroy(mChannels[i].mTAnimNode);
}
if( mChannels[i].mRAnimNode )
{
AnimationNodeDestroy(mChannels[i].mRAnimNode);
}
mChannels[
i].mTAnimNode =
NULL;
mChannels[
i].mRAnimNode =
NULL;
if( mChannels[i].mModelTemplate )
{
mChannels[
i].mModelTemplate->Children.RemoveAll();
}
}
for( i = 0; i < GetChannelCount(); i++ )
{
delete mChannels[
i].mModelTemplate;
mChannels[
i].mModelTemplate =
NULL;
}
}
bool ORDeviceMocap::AnimationNodeNotify(FBAnimationNode* pAnimationNode ,FBEvaluateInfo* pEvaluateInfo)
{
kReference lReference = pAnimationNode->Reference;
if (lReference>=10000)
{
FBSVector Scal;
FBMatrix GlobalNodeTransformation, GlobalReferenceTransformation;
bool ApplyReferenceTransformation = UseReferenceTransformation && mRootTemplate->Model;
if(ApplyReferenceTransformation)
{
mRootTemplate->Model->GetMatrix(GlobalReferenceTransformation,
kModelTransformation,
true,pEvaluateInfo);
}
for(int i=0;i<GetChannelCount();i++)
{
if(mChannels[i].mTAnimNode && mChannels[i].mRAnimNode)
{
bool lDontWrite = false;
if ((!pAnimationNode->Live || mPlotting) && mChannels[
i].mModelTemplate->Model)
{
mChannels[
i].mModelTemplate->Model->Translation.GetAnimationNode()->Evaluate(Pos.mValue,pEvaluateInfo->GetLocalTime(),
false);
mChannels[
i].mModelTemplate->Model->Rotation.GetAnimationNode()->Evaluate(Rot.mValue,pEvaluateInfo->GetLocalTime(),
false);
} else if (pAnimationNode->Live)
{
Pos[0] = mHardware.GetDataTX(i);
Pos[1] = mHardware.GetDataTY(i);
Pos[2] = mHardware.GetDataTZ(i);
Rot[0] = mHardware.GetDataRX(i);
Rot[1] = mHardware.GetDataRY(i);
Rot[2] = mHardware.GetDataRZ(i);
} else
{
lDontWrite = true;
}
if(ApplyReferenceTransformation)
{
FBGetGlobalMatrix(GlobalNodeTransformation,GlobalReferenceTransformation,GlobalNodeTransformation);
}
if(!lDontWrite)
{
if (!pAnimationNode->Live || mPlotting)
{
mChannels[
i].mRAnimNode->WriteData( Rot.mValue, pEvaluateInfo);
mChannels[
i].mTAnimNode->WriteData( Pos.mValue, pEvaluateInfo);
} else
{
mChannels[
i].mRAnimNode->WriteGlobalData( Rot.mValue, pEvaluateInfo );
mChannels[
i].mTAnimNode->WriteGlobalData( Pos.mValue, pEvaluateInfo );
}
}
}
}
}
return ParentClass::AnimationNodeNotify( pAnimationNode , pEvaluateInfo);
}
void ORDeviceMocap::DeviceTransportNotify( kTransportMode pMode, FBTime pTime, FBTime pSystem )
{
}
void ORDeviceMocap::DeviceIONotify( kDeviceIOs pAction,FBDeviceNotifyInfo &pDeviceNotifyInfo)
{
switch (pAction)
{
case kIOPlayModeWrite:
case kIOStopModeWrite:
{
}
break;
case kIOStopModeRead:
case kIOPlayModeRead:
{
if( GetOperationState() == eReadyForRecording )
ProcessSpeech();
if( mDataFromFile )
{
if( mFileIO->GetStatus() == eFileIOImport_WaitForCalibration &&
{
mFileIO->SetStatus( eFileIOImport_Start );
}
if( mFileIO->GetStatus() == eFileIOImport_Start &&
mFileIO->FetchMocapData(mHardware.mKinectMocapJointsState) )
{
mHardware.CalculateAverageSensorFloorOffset();
mMocapCharacter->PassDeviceMocapData(mHardware.mKinectMocapJointsState);
}
}
else
{
FBTime lEvalTime;
lEvalTime = pDeviceNotifyInfo.GetLocalTime();
while(mHardware.FetchMocapData(lEvalTime))
{
{
if (mMocapCharacter)
{
mMocapCharacter->PassDeviceMocapData(mHardware.mKinectMocapJointsState);
}
}
DeviceRecordFrame(lEvalTime,pDeviceNotifyInfo);
AckOneSampleReceived();
if( mFileIO->GetStatus() == eFileIOExport_WaitForCalibration && mMocapCharacter->GetMocapCalibrationState() ==
FBCalibrationInProcessing )
{
mFileIO->SetStatus( eFileIOExport_Start );
}
if( mFileIO->GetStatus() == eFileIOExport_Start )
mFileIO->Export(mHardware.mKinectMocapJointsState);
}
}
}
break;
}
}
void ORDeviceMocap::RecordingDoneAnimation( FBAnimationNode* pAnimationNode )
{
FBDevice::RecordingDoneAnimation( pAnimationNode );
mHasAnimationToTranspose = true;
}
void ORDeviceMocap::DeviceRecordFrame(FBTime &pTime,FBDeviceNotifyInfo &pDeviceNotifyInfo)
{
{
FBAnimationNode* Data;
bool ApplyReferenceTransformation = UseReferenceTransformation && mRootTemplate->Model;
FBMatrix GlobalReferenceTransformation;
if(ApplyReferenceTransformation)
for (i=0; i<GetChannelCount(); i++)
{
if (mChannels[i].mTAnimNode)
{
Data = mChannels[
i].mTAnimNode->GetAnimationToRecord();
if (Data)
{
Pos[0] = mHardware.GetDataTX(i);
Pos[1] = mHardware.GetDataTY(i);
Pos[2] = mHardware.GetDataTZ(i);
if(ApplyReferenceTransformation)
Data->KeyAdd(pTime, Pos);
}
}
if (mChannels[i].mRAnimNode)
{
Data = mChannels[
i].mRAnimNode->GetAnimationToRecord();
if (Data)
{
Rot[0] = mHardware.GetDataRX(i);
Rot[1] = mHardware.GetDataRY(i);
Rot[2] = mHardware.GetDataRZ(i);
if(ApplyReferenceTransformation)
{
FBMatrix GRM;
}
Data->KeyAdd(pTime, Rot);
}
}
}
}
}
bool ORDeviceMocap::FbxStore(FBFbxObject* pFbxObject,
kFbxObjectStore pStoreWhat)
{
{
}
return true;
}
bool ORDeviceMocap::FbxRetrieve(FBFbxObject* pFbxObject,
kFbxObjectStore pStoreWhat)
{
{
}
return true;
}
{
if(mHasAnimationToTranspose)
{
mHasAnimationToTranspose = false;
ProcessGlobalToLocal();
}
if(mReadyToSetupRecording)
{
if( SetupRecording() )
{
SetOperationState(eAskForPressCalibration);
}
else
{
UpdateInfo("Error:", "Fail To Do Calibration");
}
mReadyToSetupRecording = false;
}
if( mCalibrationAudio.Ok() )
{
FBTime lTimeNow = FBSystem().SystemTime;
if( lTimeNow - mCalibrationAudioStartTime > mCalibrationAudio->SrcDuration )
{
mCalibrationAudio->FBDelete();
mCalibrationAudioStartTime = 0;
}
}
{
PostCalibration();
}
switch (mSpeechCommandType)
{
case eStartRecording:
{
ResetRecording();
mPlayerControl.Record();
mPlayerControl.Play();
mSpeechCommandType = eNoCommand;
}
break;
case eStopRecording:
{
mPlayerControl.Stop();
mSpeechCommandType = eNoCommand;
}
break;
case ePlay:
{
if( mTargetCharacter && mTargetCharacter->ActiveInput == true )
mTargetCharacter->ActiveInput = false;
mPlayerControl.GotoStart();
mPlayerControl.Play();
mSpeechCommandType = eNoCommand;
}
break;
case eReset:
{
mPlayerControl.Stop();
mPlayerControl.GotoStart();
ResetRecording();
mSpeechCommandType = eNoCommand;
}
break;
case eNoCommand:
break;
default:
break;
}
}
void ORDeviceMocap::UpdateInfo(FBString pInfo, FBString pStatus)
{
HardwareVersionInfo = FBString("Name: ") + mHardware.GetHardWareName();
Information = pInfo;
Status = pStatus;
}
void ORDeviceMocap::PrepareSetupRecording(FBString pCharacterPath, FBString pClipDirectory)
{
mReadyToSetupRecording = true;
mCharacterPath = pCharacterPath;
mClipDirectory = pClipDirectory;
}
bool ORDeviceMocap::SetupRecording()
{
FBProgress lProgress;
lProgress.Caption = "Mocap Device";
lProgress.Text = "Setup Recording";
if( mMocapCharacter ==
NULL )
{
for(int i=0; i<FBSystem().Scene->Characters.GetCount(); i++)
{
FBString lExpectedName = mMocapCharacterName;
if( lExpectedName == FBSystem().Scene->Characters[
i]->Name)
mMocapCharacter = FBSystem().Scene->Characters[
i];
}
if( mMocapCharacter ==
NULL )
{
UpdateInfo("Error:","Mocap Character Is Invalid.");
return false;
}
}
if( mTargetCharacter ==
NULL )
{
lProgress.Caption = "Mocap Device";
lProgress.Text = "Import Character";
FBFbxOptions* lOption = new FBFbxOptions(true);
if( !FileExist( mCharacterPath ) )
{
UpdateInfo("Error:","Target File Not Exist.");
return false;
}
mApplication.FileMerge(mCharacterPath, false, lOption);
delete lOption;
lProgress.Caption = "Mocap Device";
lProgress.Text = "Retargent Mocap character to Target Character";
int lCharacterCount = FBSystem().Scene->Characters.GetCount();
mTargetCharacter = FBSystem().Scene->Characters[lCharacterCount - 1];
if( mTargetCharacter ==
NULL || mTargetCharacter == mMocapCharacter )
{
UpdateInfo("Error:","Target Character Not Exist.");
return false;
}
}
if( mTargetCharacter->GetCurrentControlSet(
true)==
NULL)
mTargetCharacter->CreateControlRig(true);
if( mTargetCharacter->ActiveInput )
mTargetCharacter->ActiveInput = false;
if( mTargetCharacter->InputCharacter != mMocapCharacter)
mTargetCharacter->InputCharacter = mMocapCharacter;
bool lTargetCharacterExistingInStoryRoot = false;
FBStory& lStory = FBStory::TheOne();
FBStoryFolder* lActionFolder = lStory.RootFolder;
FBPropertyListStoryTrack& lTracks = lActionFolder->Tracks;
for(int i=0; i<lTracks.GetCount(); i++)
{
FBStoryTrack* lTrack = lTracks[
i];
if( lTrack->Character == mTargetCharacter && !lTrack->RecordTrack )
{
lTrack->RecordTrack = true;
lTargetCharacterExistingInStoryRoot = true;
}
}
if( !lTargetCharacterExistingInStoryRoot )
{
lProgress.Caption = "Mocap Device";
lProgress.Text = "Creating story track";
lCurrentStoryTrack->Character = mTargetCharacter;
lCurrentStoryTrack->RecordClipPath = mClipDirectory;
lCurrentStoryTrack->RecordTrack = true;
}
return true;
}
void ORDeviceMocap::ResetRecording()
{
if( mTargetCharacter && mMocapCharacter )
{
mTargetCharacter->ActiveInput = true;
mTargetCharacter->InputCharacter = mMocapCharacter;
}
FBStory& lStory = FBStory::TheOne();
FBStoryFolder* lActionFolder = lStory.RootFolder;
FBPropertyListStoryTrack& lTracks = lActionFolder->Tracks;
for(int i=0; i<lTracks.GetCount(); i++)
{
FBStoryTrack* lTrack = lTracks[
i];
if( lTrack->Character == mTargetCharacter && !lTrack->RecordTrack )
{
lTrack->RecordTrack = true;
}
}
}
bool ORDeviceMocap::TriggerMocapCalibration()
{
if( mMocapCharacter )
{
if( mTargetCharacter !=
NULL )
{
mTargetCharacter->ActiveInput = false;
}
SetOperationState(eAskForDoCalibration);
return true;
}
else
{
UpdateInfo("Error:", "Mocap Character is invalid");
return false;
}
}
FileIOStatus ORDeviceMocap::GetFileIOStatus()
{
return mFileIO->GetStatus();
}
void ORDeviceMocap::SetFileIOStatus(FileIOStatus pState)
{
if( pState == eFileIOImport_Loading )
{
mDataFromFile = true;
}
mFileIO->SetStatus(pState);
}
OperationStatus ORDeviceMocap::GetOperationState()
{
return mOperationState;
}
void ORDeviceMocap::SetOperationState(OperationStatus pState)
{
if( mOperationState != pState )
mOperationState = pState;
switch (pState)
{
case eAskForCreateModelBinding:
UpdateInfo("Step1:", "Create Model Binding");
break;
case eAskForPressOnline:
UpdateInfo("Step2:", "Press Online");
break;
case eAskForPressSetupRecording:
UpdateInfo("Step3:", "Press Setup Recording");
break;
case eAskForPressCalibration:
UpdateInfo("Step4:", "Press Calibration");
break;
case eAskForDoCalibration:
UpdateInfo("Step5:", "Perform Calibration");
break;
case eReadyForRecording:
{
UpdateInfo("Step6:", "Ready To Record");
}
break;
default:
break;
}
}
void ORDeviceMocap::PostCalibration()
{
FBSystem lSystem;
FBString lAudioFile( lSystem.ApplicationPath );
lAudioFile += "\\..\\..\\OpenRealitySDK\\Scenes\\calibration.wav";
mCalibrationAudio = new FBAudioClip( (char*)lAudioFile );
if(!mCalibrationAudio.Ok())
FBMessageBox(
"Mocap Error:",
"Cannot open the calibration.wav file! \nBut you can still use this plugin without it",
"OK");
if( mCalibrationAudio.Ok() )
{
mCalibrationAudioStartTime = lSystem.SystemTime;
mCalibrationAudio->Play();
}
double lAverageSensorFloorOffset = mHardware.GetAverageSensorFloorOffset();
if (lAverageSensorFloorOffset != 0.0)
{
mMocapCharacter->SetSensorFloorOffset(lAverageSensorFloorOffset);
mHardware.SetSensorFloorOffsetSet();
}
if(mTargetCharacter)
{
mTargetCharacter->ActiveInput = true;
}
SetOperationState(eReadyForRecording);
}
void ORDeviceMocap::ProcessSpeech()
{
SpeechCommands lCmd = mHardware.ProcessSpeech();
switch (lCmd)
{
case eStartRecording:
if( !mPlayerControl.IsRecording && !mPlayerControl.IsPlaying && !mPlayerControl.IsPlotting )
{
mSpeechCommandType = eStartRecording;
}
break;
case eStopRecording:
{
mSpeechCommandType = eStopRecording;
}
break;
case ePlay:
if(!mPlayerControl.IsRecording && !mPlayerControl.IsPlaying && !mPlayerControl.IsPlotting)
{
mSpeechCommandType = ePlay;
}
break;
case eReset:
{
mSpeechCommandType = eReset;
}
break;
case eNoCommand:
break;
default:
break;
}
}