Esempio n. 1
0
void verifySequence_tick() {
  static uint16_t index = 0;
  static uint16_t timeOutTimer = 0; // counter to track whether a timeout occurs

  /////////////////////////////////
  // Perform state action first. //
  /////////////////////////////////
  switch (verifySequence_state) {
    case init_st:
      isTimeOutError = false;
      isUserInputError = false;
      index = 0;
      timeOutTimer = 0;
      break;
    case wait_for_timeout_st:
      timeOutTimer++;
      buttonHandler_enable();
      break;
    case wait_for_release_st:
      break;
    case verification_st:
      break;

    case complete_st:

      break;
    default:
      printf("Default case hit in verifySequence tick.\n");
      break;
  }

  ////////////////////////////////
  // Perform state update next. //
  ////////////////////////////////
  switch (verifySequence_state) {
    case init_st:
      if (enabled) {
        buttonHandler_enable();
        verifySequence_state = wait_for_timeout_st;
      }
      else {
        verifySequence_state = init_st;
      }
      break;
    case wait_for_timeout_st:
      if(display_isTouched()) {
        timeOutTimer = 0;
        verifySequence_state = wait_for_release_st;
      }
      // If the use waits too long before doing anything
      else if (timeOutTimer >= WAIT_TIMEOUT)
      {
        //printf("userTouchTimer: %d", userTouchTimer);
        isTimeOutError = true;
        timeOutTimer = 0;
        verifySequence_state = complete_st;
      }
      else {
        verifySequence_state = wait_for_timeout_st;
      }
      break;
    case wait_for_release_st:
      if (buttonHandler_releaseDetected())
      {
        buttonHandler_disable();
        verifySequence_state = verification_st;
      }
      else {
        verifySequence_state = wait_for_release_st;
      }
      break;
    case verification_st:
      uint8_t tempSequenceValue, tempRegionNumber;
      tempSequenceValue = globals_getSequenceValue(index);
      tempRegionNumber = buttonHandler_getRegionNumber();

      if(tempSequenceValue == tempRegionNumber) { //user touched the correct square
        // If that was the last square
        if (globals_getSequenceIterationLength() == (index + 1)) { //because index starts at 0 and length at 1
          verifySequence_state = complete_st;
        }
        else {
          index++;
          verifySequence_state = wait_for_timeout_st;
        }
      }
      else {
        isUserInputError = true;
        //printf("USER INPUT ERROR");
        verifySequence_state = complete_st;
      }
      break;
    case complete_st:
      if (!enabled) {
        verifySequence_state = init_st;
      }
      else {
        verifySequence_state = complete_st;
      }
      break;
    default:
      printf("Default case hit in verifySequence tick.\n");
      break;
  }
}
Esempio n. 2
0
// Standard tick function.
void verifySequence_tick(){
    // state actions
    switch (verifyState){
    case init_st:
        break;
    case enable_button_st:
        // enabble the buttonHandler state machine
        buttonHandler_enable();
        break;
    case wait_for_release_st:
        // Increment timout value while waiting for the display to be relased
        timeOut++;
        break;
    case verify_region_st:
        // disable the buttonhandler state machine
        buttonHandler_disable();
        // if the user tapped the wrong sequence, raise the errorFlag
        if (globals_getSequenceValue(index) != buttonHandler_getRegionNumber()){
            userErrorFlag = 1;
        }
        break;
    case increment_st:
        break;
    case done_st:
        break;
    }

    // state transitions
    switch (verifyState){
    case init_st:
        // wait for the state machine to be enabled
        if (verifyEnableFlag) {
            // reset all flags and counters
            index = 0;
            completeFlag = 0;
            timeOutFlag = 0;
            userErrorFlag = 0;
            timeOut = 0;
            verifyState = enable_button_st;
        }
        break;
    case enable_button_st:
        verifyState = wait_for_release_st;
        break;
    case wait_for_release_st:
        // if the timout value is reached
        if (timeOut == TIME_OUT_VALUE){
            // raise the timeOutFlag
            timeOutFlag = 1;
            // raise the completeFlag
            completeFlag = 1;
            // erase all the buttons
            simonDisplay_eraseAllButtons();
            // and go to done
            verifyState = done_st;
        }
        // if the display is currently touched, reset the counter.
        // I didn't want it to timeout if the user is holding the buton.
        else if (display_isTouched()){
            timeOut = 0;
        }
        // otherwise if the display was released
        else if (buttonHandler_releaseDetected()){
            // go check the region pressed against the reion in the sequence
            verifyState = verify_region_st;
        }
        break;
    case verify_region_st:
        verifyState = increment_st;
        break;
    case increment_st:
        // if we're at the end of the sequence
        if (index == (globals_getSequenceIterationLength())){
            // raise completeFlag to indicate it's over
            completeFlag = 1;
            // erase all the buttons
            simonDisplay_eraseAllButtons();
            // go to done
            verifyState = done_st;
        }
        // if the user made an error
        else if (userErrorFlag){
            // raise completeFlag
            completeFlag = 1;
            // erase the buttons
            simonDisplay_eraseAllButtons();
            // go to done
            verifyState = done_st;
        }
        else {
            // otherwise increase the index and verify the next button
            // in the sequence
            index++;
            verifyState = enable_button_st;
        }
        break;
    case done_st:
        // if the enable flag goes low
        if (!verifyEnableFlag) {
            // go to init
            verifyState = init_st;
        }
        break;
    }
}