SequenceStatus GestureSeqRecorder::ensureSameState(ControlState state) { if (prevState != state.getMode()) { // Try and recover from corruption by resetting prevState, and returning // error. prevState = state.getMode(); return SequenceStatus::UNEXPECT_STATE_CHANGE; } return SequenceStatus::SUCCESS; }
SequenceStatus GestureSeqRecorder::findActivation(Pose::Type gesture, ControlState state, commandData& response) { SequenceStatus status = SequenceStatus::SUCCESS; sequenceList *seqList = (*seqMapPerMode)[state.getMode()]; // Loop through all possible sequences in this mode, and activate any that // have a matching first gesture. for (sequenceList::iterator it = seqList->begin(); it != seqList->end(); it++) { if ((it->seq.size() >= 0) && (it->seq.at(0).type == gesture)) { clock_t now = clock(); progressBaseTime = now; if (it->seq.at(0).poseLen == SeqElement::PoseLength::IMMEDIATE) { // Special case. Immediate isn't 'held' response = it->sequenceResponse; break; } // found sequence to activate! activeSequencesMutex.lock(); activeSequences.push_back(&(*it)); activeSequencesMutex.unlock(); printStatus(true); holdGestTimer = REQ_HOLD_TIME; // set count on any progression } } seqList = NULL; return status; }
SequenceStatus GestureSeqRecorder::progressSequence(Pose::Type gesture, ControlState state, CommandData& response) { SequenceStatus status = SequenceStatus::SUCCESS; response.setType(commandType::NONE); prevPose = gesture; if (activeSequences.size() != 0) { status = ensureSameState(state); if (status == SequenceStatus::SUCCESS) { status = progressActiveSequences(gesture, state, response); } } else { status = findActivation(gesture, state, response); if (state.getMode() != prevState) { updateGuiSequences(); } prevState = state.getMode(); } if (response.getType() != commandType::NONE || status != SequenceStatus::SUCCESS) { // if the response is not NONE, a sequence has completed. Therefore all // active sequences must be cleared so that all valid sequences can potentially // be started. emptyActiveSequences(); if (response.getType() != commandType::NONE) { std::cout << "GestureSeqRecorder returning a registered response." << std::endl; } } return status; }
SequenceStatus GestureSeqRecorder::findActivation(Pose::Type gesture, ControlState state, CommandData& response) { SequenceStatus status = SequenceStatus::SUCCESS; sequenceList *seqList = (*seqMapPerMode)[state.getMode()]; // Loop through all possible sequences in this mode, and activate any that // have a matching first gesture. for (sequenceList::iterator it = seqList->begin(); it != seqList->end(); it++) { if ((it->seq.size() >= 0) && (it->seq.at(0).type == gesture)) { clock_t now = clock(); progressBaseTime = now; // found sequence to activate! activeSequencesMutex.lock(); activeSequences.push_back(&(*it)); activeSequencesMutex.unlock(); printStatus(true); if (it->seq.at(0).poseLen == PoseLength::IMMEDIATE) { if (it->seq.size() == 1) { // Special case. Immediate of size one should return response! response = it->sequenceResponse; break; } else { it->progress++; updateGuiSequences(); } } holdGestTimer = settingsSignaller.getHoldLength(); // set count on any progression } } seqList = NULL; return status; }