Esempio n. 1
0
uint8_t BUZ_ParseCommand(const unsigned char *cmd, bool *handled, const CLS1_StdIOType *io) {
  const unsigned char *p;
  uint16_t freq, duration;

  if (UTIL1_strcmp((char*)cmd, (char*)CLS1_CMD_HELP)==0 || UTIL1_strcmp((char*)cmd, (char*)"buzzer help")==0) {
    *handled = TRUE;
    return BUZ_PrintHelp(io);
  } else if (UTIL1_strcmp((char*)cmd, (char*)CLS1_CMD_STATUS)==0 || UTIL1_strcmp((char*)cmd, (char*)"buzzer status")==0) {
    *handled = TRUE;
    return BUZ_PrintStatus(io);
  } else if (UTIL1_strncmp((char*)cmd, (char*)"buzzer buz ", sizeof("buzzer buz ")-1)==0) {
    *handled = TRUE;
    p = cmd+sizeof("buzzer buz ")-1;
    if (UTIL1_ScanDecimal16uNumber(&p, &freq)==ERR_OK && UTIL1_ScanDecimal16uNumber(&p, &duration)==ERR_OK) {
      if (BUZ_Beep(freq, duration)!=ERR_OK) {
        CLS1_SendStr((unsigned char*)"Starting buzzer failed\r\n", io->stdErr);
        return ERR_FAILED;
      }
      return ERR_OK;
    }
  } else if (UTIL1_strcmp((char*)cmd, (char*)"buzzer play tune")==0) {
    *handled = TRUE;
    return BUZ_PlayTune();
  }
  return ERR_OK;
}
Esempio n. 2
0
static void CheckButton(void) {
  uint32_t timeTicks; /* time in ticks */
  #define BUTTON_CNT_MS  100  /* iteration count for button */
  bool autoCalibrate = FALSE;

  if (SW1_GetVal()==0) { /* button pressed */
    /* short press (1 beep): start or stop line following if calibrated 
     * 1 s press   (2 beep): calibrate manually
     * 2 s press   (3 beep): calibrate with auto-move
     * 3 s press   (4 beep or more): clear path
     * */
    FRTOS1_vTaskDelay(50/portTICK_RATE_MS); /* simple debounce */
    if (SW1_GetVal()==0) { /* still pressed */
      LEDG_On();
      timeTicks = 0;
      while(SW1_GetVal()==0 && timeTicks<=6000/BUTTON_CNT_MS) { 
        FRTOS1_vTaskDelay(BUTTON_CNT_MS/portTICK_RATE_MS);
        if ((timeTicks%(1000/BUTTON_CNT_MS))==0) {
#if PL_HAS_BUZZER
          BUZ_Beep(300, 200);
#endif
        }
        timeTicks++;
      } /* wait until released */
      autoCalibrate = FALSE;
      if (timeTicks<1000/BUTTON_CNT_MS) { /* less than 1 second */
        CLS1_SendStr((unsigned char*)"button press.\r\n", CLS1_GetStdio()->stdOut);
        StateMachine(TRUE); /* <1 s, short button press, according to state machine */
      } else if (timeTicks>=(1000/BUTTON_CNT_MS) && timeTicks<(2000/BUTTON_CNT_MS)) {
        CLS1_SendStr((unsigned char*)"calibrate.\r\n", CLS1_GetStdio()->stdOut);
        APP_StateStartCalibrate(); /* 1-2 s: start calibration by hand */
      } else if (timeTicks>=(2000/BUTTON_CNT_MS) && timeTicks<(3000/BUTTON_CNT_MS)) {
        CLS1_SendStr((unsigned char*)"auto calibrate.\r\n", CLS1_GetStdio()->stdOut);
        APP_StateStartCalibrate(); /* 2-3 s: start auto calibration */
        autoCalibrate = TRUE;
      } else if (timeTicks>=(3000/BUTTON_CNT_MS)) {
        CLS1_SendStr((unsigned char*)"delete solution.\r\n", CLS1_GetStdio()->stdOut);
        MAZE_ClearSolution();
      } 
      while (SW1_GetVal()==0) { /* wait until button is released */
        FRTOS1_vTaskDelay(BUTTON_CNT_MS/portTICK_RATE_MS);
      }
      if (autoCalibrate) {
        CLS1_SendStr((unsigned char*)"start auto-calibration...\r\n", CLS1_GetStdio()->stdOut);
        /* perform automatic calibration */
        WAIT1_WaitOSms(1500); /* wait some time */
        TURN_Turn(TURN_LEFT90);
        TURN_Turn(TURN_RIGHT90);
        TURN_Turn(TURN_RIGHT90);
        TURN_Turn(TURN_LEFT90);
        TURN_Turn(TURN_STOP);
        APP_StateStopCalibrate();
        CLS1_SendStr((unsigned char*)"auto-calibration finished.\r\n", CLS1_GetStdio()->stdOut);
      }
    }
  } /* if */
}
Esempio n. 3
0
static void BUZ_Play(void *dataPtr) {
  int idx = (int)dataPtr;

  BUZ_Beep(Melody[idx].freq, Melody[idx].ms);
  idx++;
  if (idx<(sizeof(Melody)/sizeof(Melody[0]))) {
    TRG_SetTrigger(TRG_BUZ_TUNE, Melody[idx-1].ms/TRG_TICKS_MS, BUZ_Play, (void*)idx);
  }
}
Esempio n. 4
0
static void BUZ_Play(void *dataPtr) {
  MelodyDesc *melody = (MelodyDesc*)dataPtr;

  BUZ_Beep(melody->melody[melody->idx].freq, melody->melody[melody->idx].ms);
  melody->idx++;
  if (melody->idx<melody->maxIdx) {
    TRG_SetTrigger(TRG_BUZ_TUNE, melody->melody[melody->idx-1].ms/TRG_TICKS_MS, BUZ_Play, (void*)melody);
  }
}
Esempio n. 5
0
static portTASK_FUNCTION(ReflTask, pvParameters) {
  (void)pvParameters; /* not used */
  for(;;) {
    if (doMinMaxCalibration) {
      REF_CalibrateMinMax(SensorWhite, SensorBlack, SensorRaw);
      BUZ_Beep(300, 50);
    } else {
      REF_Measure();
    }
    FRTOS1_vTaskDelay(20/portTICK_RATE_MS);
  }
}
Esempio n. 6
0
File: Buzzer.c Progetto: sisem/intro
uint8_t BUZ_ParseCommand(const unsigned char *cmd, bool *handled, const CLS1_StdIOType *io)
{
	  if (UTIL1_strcmp((char*)cmd, CLS1_CMD_HELP)==0 || UTIL1_strcmp((char*)cmd, "BUZ1 help")==0) {
	    *handled = TRUE;
	    CLS1_SendHelpStr((unsigned char*)"BUZ", (unsigned char*)"Group of BUZ commands\r\n", io->stdOut);
	    CLS1_SendHelpStr((unsigned char*)"  beep", (unsigned char*)"Beep with 1kHz for 1 sec\r\n", io->stdOut);
	    return ERR_OK;
	  } else if (UTIL1_strcmp((char*)cmd, "BUZ beep")==0) {
		  *handled = TRUE;
		  return BUZ_Beep(1000, 1000);
	    }
  return ERR_OK;
}
Esempio n. 7
0
static void APP_HandleEvent(EVNT_Handle event) {
  switch(event) {
  case EVNT_INIT:
    LED1_On(); WAIT1_Waitms(500); LED1_Off();
    break;
#if PL_NOF_KEYS>=1
  case EVNT_SW1_PRESSED:
    LED1_Neg();
  #if PL_HAS_BUZZER
    (void)BUZ_Beep(300, 500);
  #endif
  #if PL_HAS_REMOTE
    if (REMOTE_GetOnOff()) {
      REMOTE_SetOnOff(FALSE);
    } else {
      REMOTE_SetOnOff(TRUE);
    }
  #endif
    break;
#endif
#if PL_NOF_KEYS>=2
  case EVNT_SW2_PRESSED:
    LED2_Neg();
#if PL_HAS_REMOTE && PL_APP_ACCEL_CONTROL_SENDER
    //(void)RSTDIO_SendToTxStdio(RSTDIO_QUEUE_TX_IN, "buzzer buz 800 400\r\n", sizeof("buzzer buz 800 400\r\n")-1);
#endif
    break;
#endif
#if PL_NOF_KEYS>=3
  case EVNT_SW3_PRESSED:
    LED3_Neg();
    break;
#endif
#if PL_NOF_KEYS>=4
  case EVNT_SW4_PRESSED:
    LED4_Neg();
    break;
#endif
#if PL_HAS_LED_HEARTBEAT
  case EVNT_LED_HEARTBEAT:
    LED4_Neg();
    break;
#endif
  default:
#if PL_HAS_RADIO
    //RADIO_AppHandleEvent(event);
#endif
    break;
  }
}
Esempio n. 8
0
static void StateMachine(void) {
  switch (LF_currState) {
    case STATE_IDLE:
      break;
    case STATE_FOLLOW_SEGMENT:
      if (!FollowSegment(LINE_FOLLOW_FW)) {
#if PL_APP_LINE_MAZE
        LF_currState = STATE_TURN; /* make turn */
#else
        LF_currState = STATE_STOP; /* stop if we do not have a line any more */
#endif
      }
      break;
#if PL_APP_LINE_MAZE
    case STATE_FOLLOW_SEGMENT_BW:
      if (!FollowSegment(FALSE)) {
        TURN_Turn(TURN_STOP);
        if (EvaluateTurnBw()==ERR_OK) {
          LF_currState = STATE_FOLLOW_SEGMENT;
        } else {
          LF_currState = STATE_STOP;
        }
      }
      break;
#endif
#if PL_APP_LINE_MAZE
    case STATE_TURN:
      if (MAZE_IsSolved()) {
        TURN_Kind turn;
        
        turn = MAZE_GetSolvedTurn(&LF_solvedIdx);
        if (turn==TURN_STOP) { /* last turn reached */
          TURN_Turn(turn);
          LF_currState = STATE_FINISHED;
        } else { /* perform turning */
          TURN_Turn(TURN_STEP_LINE_FW); /* Step over line */
          TURN_Turn(TURN_STEP_POST_LINE_FW); /* step before doing the turn */
          TURN_Turn(turn);
          LF_currState = STATE_FOLLOW_SEGMENT;
        }
      } else { /* still evaluating maze */
        bool deadEndGoBw = FALSE;
        bool finished = FALSE;
        
        if (EvaluteTurn(&finished, &deadEndGoBw)==ERR_OK) { /* finished turning */
          if (finished) {
            LF_currState = STATE_FINISHED;
            MAZE_SetSolved();
#if PL_TURN_ON_FINISH
            /* turn the robot */
            TURN_Turn(TURN_LEFT180);
#endif
            TURN_Turn(TURN_STOP);
            /* now ready to do line following */
          } else if (deadEndGoBw) {
            LF_currState = STATE_FOLLOW_SEGMENT_BW;
          } else {
            LF_currState = STATE_FOLLOW_SEGMENT;
          }
        } else { /* error case */
          LF_currState = STATE_STOP;
        }
      }
      break;
#endif
#if PL_APP_LINE_MAZE
    case STATE_FINISHED:
#if PL_HAS_BUZZER
      {
        uint8_t i;
        
        for(i=0;i<4;i++) {
          (void)BUZ_Beep(300, 100);
          WAIT1_WaitOSms(500);
        }
      }
#endif
      LF_currState = STATE_STOP;
      break;
#endif
    case STATE_STOP:
      TURN_Turn(TURN_STOP);
      LF_currState = STATE_IDLE;
      break;
  } /* switch */
}
Esempio n. 9
0
File: Test.c Progetto: tbmathis/SUMO
/*
 * \brief this is a test function for the Trigger Option
 */
void TEST_onButton(void)
{
	uint8_t err;
	err = BUZ_Beep(500,1000);
}
Esempio n. 10
0
void RTOS_HandleEvent(byte event) {
  switch(event) {
  #if PL_HAS_HW_NAV_SWITCH
    case EVNT1_BUTTON1_RELEASED:
    #if PL_HAS_HW_LCD /* rotate switch meaning depending on orientation */
      switch(GDisp1_GetDisplayOrientation()) {
        case GDisp1_ORIENTATION_LANDSCAPE180: EVNT1_SetEvent(EVNT1_BUTTON_UI_LEFT);  break;
        case GDisp1_ORIENTATION_PORTRAIT:     EVNT1_SetEvent(EVNT1_BUTTON_UI_DOWN);  break;
        case GDisp1_ORIENTATION_LANDSCAPE:    EVNT1_SetEvent(EVNT1_BUTTON_UI_RIGHT); break;
        case GDisp1_ORIENTATION_PORTRAIT180:  EVNT1_SetEvent(EVNT1_BUTTON_UI_UP);    break;
      } /* switch */
    #else
      EVNT1_SetEvent(EVNT1_BUTTON_UI_RIGHT);
    #endif
      break;
    case EVNT1_BUTTON2_RELEASED:
    #if PL_HAS_HW_LCD /* rotate switch meaning depending on orientation */
      switch(GDisp1_GetDisplayOrientation()) {
        case GDisp1_ORIENTATION_LANDSCAPE180: EVNT1_SetEvent(EVNT1_BUTTON_UI_UP);    break;
        case GDisp1_ORIENTATION_PORTRAIT:     EVNT1_SetEvent(EVNT1_BUTTON_UI_LEFT);  break;
        case GDisp1_ORIENTATION_LANDSCAPE:    EVNT1_SetEvent(EVNT1_BUTTON_UI_DOWN);  break;
        case GDisp1_ORIENTATION_PORTRAIT180:  EVNT1_SetEvent(EVNT1_BUTTON_UI_RIGHT); break;
      } /* switch */
    #else
      EVNT1_SetEvent(EVNT1_BUTTON_UI_DOWN);
    #endif
      break;
    case EVNT1_BUTTON5_RELEASED:
    #if PL_HAS_HW_LCD /* rotate switch meaning depending on orientation */
      switch(GDisp1_GetDisplayOrientation()) {
        case GDisp1_ORIENTATION_LANDSCAPE180: EVNT1_SetEvent(EVNT1_BUTTON_UI_RIGHT); break;
        case GDisp1_ORIENTATION_PORTRAIT:     EVNT1_SetEvent(EVNT1_BUTTON_UI_UP);    break;
        case GDisp1_ORIENTATION_LANDSCAPE:    EVNT1_SetEvent(EVNT1_BUTTON_UI_LEFT);  break;
        case GDisp1_ORIENTATION_PORTRAIT180:  EVNT1_SetEvent(EVNT1_BUTTON_UI_DOWN);  break;
      } /* switch */
    #else
      EVNT1_SetEvent(EVNT1_BUTTON_UI_LEFT);
    #endif
      break;
    case EVNT1_BUTTON3_PRESSED:
      EVNT1_SetEvent(EVNT1_BUTTON_UI_MIDDLE_DOWN);
      break;
    case EVNT1_BUTTON3_RELEASED:
      EVNT1_SetEvent(EVNT1_BUTTON_UI_MIDDLE);
      break;
    case EVNT1_BUTTON4_RELEASED:
    #if PL_HAS_HW_LCD /* rotate switch meaning depending on orientation */
      switch(GDisp1_GetDisplayOrientation()) {
        case GDisp1_ORIENTATION_LANDSCAPE180: EVNT1_SetEvent(EVNT1_BUTTON_UI_DOWN);  break;
        case GDisp1_ORIENTATION_PORTRAIT:     EVNT1_SetEvent(EVNT1_BUTTON_UI_RIGHT); break;
        case GDisp1_ORIENTATION_LANDSCAPE:    EVNT1_SetEvent(EVNT1_BUTTON_UI_UP);    break;
        case GDisp1_ORIENTATION_PORTRAIT180:  EVNT1_SetEvent(EVNT1_BUTTON_UI_LEFT);  break;
      } /* switch */
    #else
      EVNT1_SetEvent(EVNT1_BUTTON_UI_UP);
    #endif
      break;
  #elif (PL_BOARD_TWR_CN128 || PL_BOARD_TWR_52259) /* use the TWR SW2 and SW3, translate to navigation messages */
    case EVNT1_BUTTON1_RELEASED:      EVNT1_SetEvent(EVNT1_BUTTON_UI_LEFT);  break;
    case EVNT1_BUTTON2_RELEASED:      EVNT1_SetEvent(EVNT1_BUTTON_UI_RIGHT);  break;
    case EVNT1_BUTTON1_RELEASED_LONG: EVNT1_SetEvent(EVNT1_BUTTON_UI_MIDDLE);  break;
    case EVNT1_BUTTON2_RELEASED_LONG: EVNT1_SetEvent(EVNT1_BUTTON_UI_MIDDLE);  break;
  #endif
    case EVNT1_BUZZER_BEEP:
  #if PL_HAS_HW_SOUNDER
      BUZ_Beep();
  #endif
      break;
    default:
      break;
  } /* switch */
  /* call other event handler... */
#if PL_HAS_UI
  APP_HandleEvent(event);
#endif
#if PL_APP_MODE_I2C_LCD
  I2C_HandleEvent(event);
#endif
}
Esempio n. 11
0
static void APP_EventHandler(EVNT_Handle event) {
	#if PL_HAS_LINE_SENSOR

	#endif
	static uint16_t buzzer = 1000;
	switch(event){
	case EVNT_INIT:
	    LED1_On();
	    WAIT1_Waitms(100);
	    LED1_Off();
#if PL_HAS_BUZZER
	    BUZ_Beep(1000,400);
#endif
	    break;
	case EVNT_HEARTBEAT:
		//LED1_Off();
		break;
	case EVNT_SW_A_RELEASED:
		//BUZ_Beep(2000,2000);
		break;
	case EVNT_SW_A_PRESSED:
		#if PL_HAS_BUZZER
			BUZ_Beep(1000,10);
            #if PL_HAS_BATTLE
			    BATTLE_changeState(BATTLE_STATE_WAIT);
            #endif /* PL_HAS_BATTLE */
		#endif
		break;
	case EVNT_SW_A_LPRESSED:
		#if PL_HAS_LINE_SENSOR
			LED1_Neg();
			EVNT_SetEvent(EVNT_REF_START_STOP_CALIBRATION);
		#endif
		break;
	case EVNT_SW_B_PRESSED:
		LED2_Neg();
		LED3_Neg();
		#if PL_HAS_SHELL
			CLS1_SendStr("SW B pressed\n",CLS1_GetStdio()->stdOut);
		#endif
		break;
	case EVNT_SW_C_PRESSED:
		LED1_Neg();
		LED2_Neg();
		#if PL_HAS_SHELL
			CLS1_SendStr("SW C pressed\n",CLS1_GetStdio()->stdOut);
		#endif
		break;
	case EVNT_SW_D_PRESSED:
		LED1_Neg();
		#if PL_HAS_SHELL
			CLS1_SendStr("SW D pressed\n",CLS1_GetStdio()->stdOut);
		#endif
		break;
	case EVNT_SW_E_PRESSED:
		LED2_Neg();
		#if PL_HAS_SHELL
				CLS1_SendStr("SW E pressed\n",CLS1_GetStdio()->stdOut);
		#endif
		break;
	case EVNT_SW_F_PRESSED:
		LED3_Neg();
		#if PL_HAS_SHELL
			CLS1_SendStr("SW F pressed\n",CLS1_GetStdio()->stdOut);
		#endif
		break;
	case EVNT_SW_G_PRESSED:
		LED1_Neg();
		LED2_Neg();
		LED3_Neg();
		#if PL_HAS_SHELL
			CLS1_SendStr("SW g pressed\n",CLS1_GetStdio()->stdOut);
		#endif
		break;
	case EVNT_REF_START_STOP_CALIBRATION:

		break;
	default:
		break;
	}
}
Esempio n. 12
0
uint8_t REMOTE_HandleRemoteRxMessage(RAPP_MSG_Type type, uint8_t size, uint8_t *data, RNWK_ShortAddrType srcAddr, bool *handled, RPHY_PacketDesc *packet) {
#if PL_CONFIG_HAS_SHELL
  uint8_t buf[48];
#endif
  uint8_t val;
  int16_t x, y, z;

  (void)size;
  (void)packet;
  switch(type) {
#if PL_CONFIG_HAS_MOTOR
    case RAPP_MSG_TYPE_JOYSTICK_XY: /* values are -128...127 */
      {
        int8_t x, y;
        int16_t x1000, y1000;

        *handled = TRUE;
        x = *data; /* get x data value */
        y = *(data+1); /* get y data value */
        if (REMOTE_isVerbose) {
          UTIL1_strcpy(buf, sizeof(buf), (unsigned char*)"x/y: ");
          UTIL1_strcatNum8s(buf, sizeof(buf), (int8_t)x);
          UTIL1_chcat(buf, sizeof(buf), ',');
          UTIL1_strcatNum8s(buf, sizeof(buf), (int8_t)y);
          UTIL1_strcat(buf, sizeof(buf), (unsigned char*)"\r\n");
          SHELL_SendString(buf);
        }
  #if 0 /* using shell command */
        UTIL1_strcpy(buf, sizeof(buf), (unsigned char*)"motor L duty ");
        UTIL1_strcatNum8s(buf, sizeof(buf), scaleSpeedToPercent(x));
        SHELL_ParseCmd(buf);
        UTIL1_strcpy(buf, sizeof(buf), (unsigned char*)"motor R duty ");
        UTIL1_strcatNum8s(buf, sizeof(buf), scaleSpeedToPercent(y));
        SHELL_ParseCmd(buf);
  #endif
        /* filter noise around zero */
        if (x>-5 && x<5) {
          x = 0;
        }
        if (y>-15 && y<5) {
          y = 0;
        }
        x1000 = scaleJoystickTo1K(x);
        y1000 = scaleJoystickTo1K(y);
        if (REMOTE_useJoystick) {
          REMOTE_HandleMotorMsg(y1000, x1000, 0); /* first param is forward/backward speed, second param is direction */
        }
      }
      break;
#endif
    case RAPP_MSG_TYPE_JOYSTICK_BTN:
      *handled = TRUE;
      val = *data; /* get data value */
#if PL_CONFIG_HAS_SHELL && PL_CONFIG_HAS_BUZZER && PL_CONFIG_HAS_REMOTE
      if (val=='F') { /* F button - disable remote, drive mode none */
    	  DRV_SetMode(DRV_MODE_NONE);
    	  REMOTE_SetOnOff(FALSE);
    	  SHELL_SendString("Remote OFF\r\n");
      } else if (val=='G') { /* center joystick button: enable remote */
        REMOTE_SetOnOff(TRUE);
		#if PL_CONFIG_HAS_DRIVE
        DRV_SetMode(DRV_MODE_SPEED);
		#endif
        SHELL_SendString("Remote ON\r\n");
      }
#if PL_CONFIG_HAS_LINE_MAZE
      else if (val=='A') { /* green 'A' button */
        SHELL_SendString("Button A pressed\r\n");
        // Start Maze solving
        if(!LF_IsFollowing()){
        	LF_StartFollowing();
        }
      } else if (val=='K') { /* green A button longpress -> 'K' */
          SHELL_SendString("Clear Maze\r\n");
          // Clear old maze solution, ready for restart
          MAZE_ClearSolution();
      } else if (val =='B'){ /* yellow 'B' button */
    	  SHELL_SendString("Right hand rule!\r\n");
    	  LF_SetRule(FALSE);
      } else if (val=='E') { /* button 'E' pressed */
    	  SHELL_SendString("Stop Following! \r\n");
    	  if(LF_IsFollowing()){
    		  LF_StopFollowing();
    	  }
      } else if (val=='D') { /* blue 'D' button */
    	  SHELL_SendString("Left hand rule!\r\n");
    	  LF_SetRule(TRUE);
      }
#endif
        else if (val=='C') { /* red 'C' button */
    	  NITRO = TRUE;
    	  SHELL_SendString("Nitrooooooo!!!\r\n");
    	  BUZ_Beep(1000,1000);
      } else if (val=='J') { /* button 'C' released */
    	  NITRO = FALSE;
    	  SHELL_SendString("Stop Nitro \r\n");
      }
#else
      *handled = FALSE; /* no shell and no buzzer? */
#endif
      break;

    default:
      break;
  } /* switch */
  return ERR_OK;
}
Esempio n. 13
0
static void StateMachine_Run(void){
  int i;
  int distance;

  switch (state) {
	case START:
		WAIT1_WaitOSms(800);
		BUZ_Beep(400,400);
		WAIT1_WaitOSms(800);
		BUZ_Beep(450,400);
		WAIT1_WaitOSms(800);
		BUZ_Beep(500,400);
		WAIT1_WaitOSms(800);
		BUZ_Beep(600,400);
		WAIT1_WaitOSms(800);
		BUZ_Beep(880,400);

		MOT_SetDirection(MOT_GetMotorHandle(MOT_MOTOR_LEFT), MOT_DIR_FORWARD);
		MOT_SetDirection(MOT_GetMotorHandle(MOT_MOTOR_RIGHT), MOT_DIR_FORWARD);
		MOT_SetSpeedPercent(MOT_GetMotorHandle(MOT_MOTOR_RIGHT), 40);
		MOT_SetSpeedPercent(MOT_GetMotorHandle(MOT_MOTOR_LEFT), 40);

		/*int x0;
		int x5;
		int x0_cal;
		int x5_cal;
		x0 = Get_Reflectance_Values(0);
		x0_cal = x0 / 15;
		x5 = Get_Reflectance_Values(5);
		x5_cal = x5 / 15;
		MOT_SetSpeedPercent(MOT_GetMotorHandle(MOT_MOTOR_RIGHT), x0_cal);
		MOT_SetSpeedPercent(MOT_GetMotorHandle(MOT_MOTOR_LEFT), x5_cal);
		*/

		//uint16_t* calib_values_pointer;
		//calib_values_pointer = &SensorTimeType;
		//calib_values_pointer = S1_GetVal();

		state = DRIVE;

	  break;

	case DRIVE:
		MOT_SetSpeedPercent(MOT_GetMotorHandle(MOT_MOTOR_LEFT), SPEED_TURN);
		MOT_SetSpeedPercent(MOT_GetMotorHandle(MOT_MOTOR_RIGHT), -SPEED_TURN);

		if((Get_Reflectance_Values(3) <= 100) || (Get_Reflectance_Values(4) <= 100)){ // 0 = weiss / 1000 = schwarz
			state = STOP;
		}

		distance = US_usToCentimeters(US_Measure_us(),22);

		if((distance <= 30) && (distance != 0)){
			MOT_SetSpeedPercent(MOT_GetMotorHandle(MOT_MOTOR_RIGHT), SPEED_ATTACK);
			MOT_SetSpeedPercent(MOT_GetMotorHandle(MOT_MOTOR_LEFT), SPEED_ATTACK);
			state = ATTACK;
		}

		/*if((MMA1_GetXmg() >= 500) || (MMA1_GetXmg() <= -500)){
			state = STOP;
		}
		*/
		/*if((MMA1_GetYmg() >= 500) || (MMA1_GetYmg() <= -500)){
			state = STOP;
		}*/

		break;

	case TURN:
		state = DRIVE;
		break;

	case STOP:
		MOT_SetSpeedPercent(MOT_GetMotorHandle(MOT_MOTOR_RIGHT), -50);
		MOT_SetSpeedPercent(MOT_GetMotorHandle(MOT_MOTOR_LEFT), -50);

		WAIT1_WaitOSms(150);

		MOT_SetSpeedPercent(MOT_GetMotorHandle(MOT_MOTOR_RIGHT), -50);
		MOT_SetSpeedPercent(MOT_GetMotorHandle(MOT_MOTOR_LEFT), 50);

		WAIT1_WaitOSms(444);

		if(Get_Reflectance_Values(4) >= 400){
			state = DRIVE;
		}

		/*if((MMA1_GetXmg() >= -200) && (MMA1_GetXmg() <= 200)){
			state = DRIVE;
		}*/

		/*if((MMA1_GetYmg() >= -200) || (MMA1_GetYmg() <= 200)){
			state = DRIVE;
		}*/

		break;

	case ATTACK:
		if((distance <= 30) && (distance != 0)){
			state = ATTACK;
			MOT_SetSpeedPercent(MOT_GetMotorHandle(MOT_MOTOR_RIGHT), SPEED_ATTACK);
			MOT_SetSpeedPercent(MOT_GetMotorHandle(MOT_MOTOR_LEFT), SPEED_ATTACK);
			WAIT1_WaitOSms(50);
		}else{
			state = DRIVE;
		}
		if((Get_Reflectance_Values(3) <= 100) || (Get_Reflectance_Values(4) <= 100)){ // 0 = weiss / 1000 = schwarz
			state = STOP;
		}

	break;
  } /* switch */
}
Esempio n. 14
0
static uint8_t PrintStatus(const CLS1_StdIOType *io) {
  unsigned char buf[24];
  int i;

  CLS1_SendStatusStr((unsigned char*)"reflectance", (unsigned char*)"\r\n", io->stdOut);
  CLS1_SendStatusStr((unsigned char*)"  IR led on", ledON?(unsigned char*)"yes\r\n":(unsigned char*)"no\r\n", io->stdOut);
  CLS1_SendStatusStr((unsigned char*)"  calibrating", doMinMaxCalibration?(unsigned char*)"yes\r\n":(unsigned char*)"no\r\n", io->stdOut);
  CLS1_SendStatusStr((unsigned char*)"  calibrated", isCalibrated?(unsigned char*)"yes\r\n":(unsigned char*)"no\r\n", io->stdOut);

  UTIL1_strcpy(buf, sizeof(buf), (unsigned char*)"0x");
  UTIL1_strcatNum16Hex(buf, sizeof(buf), REF_MIN_NOISE_VAL);
  UTIL1_strcat(buf, sizeof(buf), (unsigned char*)"\r\n");
  CLS1_SendStatusStr((unsigned char*)"  min noise", buf, io->stdOut);

  UTIL1_strcpy(buf, sizeof(buf), (unsigned char*)"0x");
  UTIL1_strcatNum16Hex(buf, sizeof(buf), REF_MIN_LINE_VAL);
  UTIL1_strcat(buf, sizeof(buf), (unsigned char*)"\r\n");
  CLS1_SendStatusStr((unsigned char*)"  min line", buf, io->stdOut);

  CLS1_SendStatusStr((unsigned char*)"  raw val", (unsigned char*)"", io->stdOut);
#if REF_SENSOR1_IS_LEFT
  for (i=0;i<REF_NOF_SENSORS;i++) {
    if (i==0) {
#else
  for (i=REF_NOF_SENSORS-1;i>=0;i--) {
    if (i==REF_NOF_SENSORS-1) {
#endif
      CLS1_SendStr((unsigned char*)"0x", io->stdOut);
    } else {
      CLS1_SendStr((unsigned char*)" 0x", io->stdOut);
    }
    buf[0] = '\0'; UTIL1_strcatNum16Hex(buf, sizeof(buf), SensorRaw[i]);
    CLS1_SendStr(buf, io->stdOut);
  }
  CLS1_SendStr((unsigned char*)"\r\n", io->stdOut);
  CLS1_SendStatusStr((unsigned char*)"  min val", (unsigned char*)"", io->stdOut);
#if REF_SENSOR1_IS_LEFT
  for (i=0;i<REF_NOF_SENSORS;i++) {
    if (i==0) {
#else
  for (i=REF_NOF_SENSORS-1;i>=0;i--) {
    if (i==REF_NOF_SENSORS-1) {
#endif
      CLS1_SendStr((unsigned char*)"0x", io->stdOut);
    } else {
      CLS1_SendStr((unsigned char*)" 0x", io->stdOut);
    }
    buf[0] = '\0'; UTIL1_strcatNum16Hex(buf, sizeof(buf), SensorMin[i]);
    CLS1_SendStr(buf, io->stdOut);
  }
  CLS1_SendStr((unsigned char*)"\r\n", io->stdOut);
  CLS1_SendStatusStr((unsigned char*)"  max val", (unsigned char*)"", io->stdOut);
#if REF_SENSOR1_IS_LEFT
  for (i=0;i<REF_NOF_SENSORS;i++) {
    if (i==0) {
#else
  for (i=REF_NOF_SENSORS-1;i>=0;i--) {
    if (i==REF_NOF_SENSORS-1) {
#endif
      CLS1_SendStr((unsigned char*)"0x", io->stdOut);
    } else {
      CLS1_SendStr((unsigned char*)" 0x", io->stdOut);
    }
    buf[0] = '\0'; UTIL1_strcatNum16Hex(buf, sizeof(buf), SensorMax[i]);
    CLS1_SendStr(buf, io->stdOut);
  }
  CLS1_SendStr((unsigned char*)"\r\n", io->stdOut);
  CLS1_SendStatusStr((unsigned char*)"  calib val", (unsigned char*)"", io->stdOut);
#if REF_SENSOR1_IS_LEFT
  for (i=0;i<REF_NOF_SENSORS;i++) {
    if (i==0) {
#else
  for (i=REF_NOF_SENSORS-1;i>=0;i--) {
    if (i==REF_NOF_SENSORS-1) {
#endif
      CLS1_SendStr((unsigned char*)"0x", io->stdOut);
    } else {
      CLS1_SendStr((unsigned char*)" 0x", io->stdOut);
    }
    buf[0] = '\0'; UTIL1_strcatNum16Hex(buf, sizeof(buf), SensorCalibrated[i]);
    CLS1_SendStr(buf, io->stdOut);
  }
  CLS1_SendStr((unsigned char*)"\r\n", io->stdOut);

  CLS1_SendStatusStr((unsigned char*)"  line val", (unsigned char*)"", io->stdOut);
  buf[0] = '\0'; UTIL1_strcatNum16s(buf, sizeof(buf), refCenterLineVal);
  CLS1_SendStr(buf, io->stdOut);
  CLS1_SendStr((unsigned char*)"\r\n", io->stdOut);

#if PL_APP_LINE_MAZE
#if REF_SENSOR1_IS_LEFT
  for (i=0;i<REF_NOF_SENSORS;i++) {
    if (i==0) {
#else
  for (i=REF_NOF_SENSORS-1;i>=0;i--) {
    if (i==REF_NOF_SENSORS-1) {
#endif
      CLS1_SendStatusStr((unsigned char*)"  history", (unsigned char*)"0x", io->stdOut);
    } else {
      CLS1_SendStr((unsigned char*)" 0x", io->stdOut);
    }
    buf[0] = '\0'; UTIL1_strcatNum16Hex(buf, sizeof(buf), SensorHistory[i]);
    CLS1_SendStr(buf, io->stdOut);
  }
  CLS1_SendStr((unsigned char*)"\r\n", io->stdOut);
#endif
  
  CLS1_SendStatusStr((unsigned char*)"  line kind", REF_LineKindStr(refLineKind), io->stdOut);
  CLS1_SendStr((unsigned char*)"\r\n", io->stdOut);
  return ERR_OK;
}

byte REF_ParseCommand(const unsigned char *cmd, bool *handled, const CLS1_StdIOType *io) {
  if (UTIL1_strcmp((char*)cmd, CLS1_CMD_HELP)==0 || UTIL1_strcmp((char*)cmd, "ref help")==0) {
    *handled = TRUE;
    return PrintHelp(io);
  } else if ((UTIL1_strcmp((char*)cmd, CLS1_CMD_STATUS)==0) || (UTIL1_strcmp((char*)cmd, "ref status")==0)) {
    *handled = TRUE;
    return PrintStatus(io);
  } else if (UTIL1_strcmp((char*)cmd, "ref calib on")==0) {
    APP_StateStartCalibrate();
    *handled = TRUE;
    return ERR_OK;  
  } else if (UTIL1_strcmp((char*)cmd, "ref calib off")==0) {
    APP_StateStopCalibrate();
    *handled = TRUE;
    return ERR_OK;
  } else if (UTIL1_strcmp((char*)cmd, "ref led on")==0) {
    ledON = TRUE;
    *handled = TRUE;
    return ERR_OK;
  } else if (UTIL1_strcmp((char*)cmd, "ref led off")==0) {
    ledON = FALSE;
    *handled = TRUE;
    return ERR_OK;
  }
  return ERR_OK;
}

uint16_t REF_GetLineValue(bool *onLine) {
  *onLine = refCenterLineVal>0 && refCenterLineVal<REF_MAX_LINE_VALUE;
  return refCenterLineVal;
}

static portTASK_FUNCTION(ReflTask, pvParameters) {
  (void)pvParameters; /* not used */
  for(;;) {
    if (doMinMaxCalibration) {
      REF_CalibrateMinMax(SensorMin, SensorMax, SensorRaw);
#if PL_HAS_BUZZER
      BUZ_Beep(300, 50);
#endif
    } else {
      REF_Measure();
    }
    FRTOS1_vTaskDelay(10/portTICK_RATE_MS);
  }
}

void REF_Init(void) {
  refLineKind = REF_LINE_NONE;
  refCenterLineVal = 0;
  mutexHandle = FRTOS1_xSemaphoreCreateMutex();
  if (mutexHandle==NULL) {
    for(;;);
  }
  timerHandle = RefCnt_Init(NULL);
  REF_InitSensorValues();
  if (FRTOS1_xTaskCreate(ReflTask, (signed portCHAR *)"Refl", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+1+2, NULL) != pdPASS) {
    for(;;){} /* error */
  }
}
Esempio n. 15
0
static void APP_EventHandler(EVNT_Handle event) {
	  switch(event) {
	    case EVNT_INIT:
	      /*LED1_On();
	      WAIT1_Waitms(50);
	      LED1_Off();
	      LED2_On();
	      WAIT1_Waitms(50);
	      LED2_Off();
	      LED3_On();
	      WAIT1_Waitms(50);
	      LED3_Off();*/
	      break;
	    case EVENT_LED_HEARTBEAT:
	      //LED1_Neg();
	      break;
	#if PL_NOF_KEYS >= 1
	    case EVNT_SW1_PRESSED:
	      lastKeyPressed = 1;
	  #if PL_HAS_SHELL
	      SHELL_SendString("SW1 pressed!\r\n");
	  #endif
	  #if PL_HAS_BUZZER
	      BUZ_Beep(300, 500);
	  #endif
	      break;
	    case EVNT_SW1_LPRESSED:
	  #if PL_HAS_SHELL
	      SHELL_SendString("SW1 long pressed!\r\n");
	  #endif
	      break;
	    case EVNT_SW1_RELEASED:
	  #if PL_HAS_SHELL
	      SHELL_SendString("SW1 released!\r\n");
	  #endif
	      break;
	#endif
	#if PL_NOF_LEDS_ROBO
	    case EVNT_SW2_PRESSED:
	      lastKeyPressed = 2;
	 #if PL_HAS_SHELL
	      SHELL_SendString("SW2 pressed!\r\n");
	      EVNT_SetEvent(EVNT_REF_START_STOP_CALIBRATION);
	 #endif
	      break;
	    case EVNT_SW2_LPRESSED:
	    	LED_U1_Neg();
	 #if PL_HAS_SHELL
	      SHELL_SendString("SW2 long pressed!\r\n");
	 #endif
	      break;
	    case EVNT_SW2_RELEASED:
	    	LED_U1_Neg();
	 #if PL_HAS_SHELL
	      SHELL_SendString("SW2 released!\r\n");
	 #endif
	      break;
	#endif
	#if PL_NOF_KEYS >= 3
	    case EVNT_SW3_PRESSED:
	      lastKeyPressed = 3;
	#if PL_HAS_SHELL
	      SHELL_SendString("SW3 pressed!\r\n");
	#endif
	      break;
	#endif
	#if PL_NOF_KEYS >= 4
	    case EVNT_SW4_PRESSED:
	      lastKeyPressed = 4;
	#if PL_HAS_SHELL
	      SHELL_SendString("SW4 pressed!\r\n");
	#endif
	      break;
	#endif
	#if PL_NOF_KEYS >= 5
	    case EVNT_SW5_PRESSED:
	      lastKeyPressed = 5;
	#if PL_HAS_SHELL
	      SHELL_SendString("SW5 pressed!\r\n");
	#endif
	      break;
	#endif
	#if PL_NOF_KEYS >= 6
	    case EVNT_SW6_PRESSED:
	      lastKeyPressed = 6;
	#if PL_HAS_SHELL
	      SHELL_SendString("SW6 pressed!\r\n");
	#endif
	      break;
	#endif
	#if PL_NOF_KEYS >= 7
	    case EVNT_SW7_PRESSED:
	      lastKeyPressed = 7;
	#if PL_HAS_SHELL
	      SHELL_SendString("SW7 pressed!\r\n");
	#endif
	      break;
	#endif
	    default:
	      break;
	  }
	}
Esempio n. 16
0
static void REF_StateMachine(void) {
  int i;

  switch (refState) {
    case REF_STATE_INIT:
#if NVM_ENABLED
    refState = REF_GetCalibData();
#else
    refState = REF_STATE_NOT_CALIBRATED;
    SHELL_SendString("INFO: Sensor not calibrated");
#endif
    break;

      
    case REF_STATE_NOT_CALIBRATED:
      REF_MeasureRaw(SensorRaw);
      /*! \todo Add a new event to your event module...*/
#if REF_START_STOP_CALIB
      if (FRTOS1_xSemaphoreTake(REF_StartStopSem, 0)==pdTRUE) {
        refState = REF_STATE_START_CALIBRATION;
      }
#endif
      break;
    
    case REF_STATE_START_CALIBRATION:
      SHELL_SendString((unsigned char*)"start calibration...\r\n");
      for(i=0;i<REF_NOF_SENSORS;i++) {
        SensorCalibMinMax.minVal[i] = MAX_SENSOR_VALUE;
        SensorCalibMinMax.maxVal[i] = 0;
        SensorCalibrated[i] = 0;
      }
      refState = REF_STATE_CALIBRATING;
      break;
    
    case REF_STATE_CALIBRATING:
      REF_CalibrateMinMax(SensorCalibMinMax.minVal, SensorCalibMinMax.maxVal, SensorRaw);
#if PL_CONFIG_HAS_BUZZER
     (void)BUZ_Beep(300, 20);
#endif
#if REF_START_STOP_CALIB
      if (FRTOS1_xSemaphoreTake(REF_StartStopSem, 0)==pdTRUE) {
        refState = REF_STATE_STOP_CALIBRATION;
      }
#endif
      break;
    
    case REF_STATE_STOP_CALIBRATION:
      SHELL_SendString((unsigned char*)"...stopping calibration.\r\n");
#if NVM_ENABLED
      SHELL_SendString((unsigned char*)"saving calib data...\r\n");
      REF_SaveCalibData();
#endif
      refState = REF_STATE_READY;
      break;
        
    case REF_STATE_READY:
      REF_Measure();
#if REF_START_STOP_CALIB
      if (FRTOS1_xSemaphoreTake(REF_StartStopSem, 0)==pdTRUE) {
        refState = REF_STATE_START_CALIBRATION;
      }
#endif
      break;
  } /* switch */
}