2015-12-14 5 views
4

Я хотел иметь возможность добавлять случаи в машину состояния переменной перечисления, такую ​​как список массивов. Я сделал это, создав список массивов и используя размер, чтобы сообщить ему, сколько случаев существует и выполнить их соответственно с циклом for. Проблема в том, что это перейдет в следующий случай до завершения моего вызова метода. Как заставить программу ждать завершения метода до продолжения без использования временной задержки, так как время может варьироваться в разных ситуациях. Случай и метод относятся к нижней части кода в методе loop().Использование arraylist для конечного автомата

package com.qualcomm.ftcrobotcontroller.opmodes; 

import com.qualcomm.hardware.HiTechnicNxtCompassSensor; 
import com.qualcomm.robotcore.eventloop.opmode.OpMode; 
import com.qualcomm.robotcore.hardware.DcMotor; 
import com.qualcomm.robotcore.hardware.DcMotorController; 
import com.qualcomm.robotcore.util.ElapsedTime; 

import java.util.ArrayList; 

/** 
* Created by Robotics on 12/11/2015. 
*/ 
public class RobotAction extends OpMode { 

    //HiTechnicNxtCompassSensor compassSensor; 
    //double compassvalue = compassSensor.getDirection(); 
    double compassvalue; 
    double lastcompassvalue; 

    DcMotor rightdrive; 
    DcMotor leftdrive; 
    final double fullpower = 1; 

    double angle; 
    double distance; 

    final double wheelediameter = 4.0; 
    final double circumference = wheelediameter * Math.PI; 
    final double gearratio = 1; 
    final double countsperrotation = 1440; 


    double wheelrotations = distance/circumference; 
    double motorrotations = wheelrotations * gearratio; 
    double encodercounts = motorrotations * countsperrotation; 

    int currentpositionright; 

    int step; 

    ElapsedTime time; 

    String status; 
    String action; 

    public enum RelativePosition {North, NorthEast, East, SouthEast, South, SouthWest, West, NorthWest} 
    RelativePosition relativeposition; 

    private void Action(double angle, int compassvalue, double encodercounts, RelativePosition relativeposition) { 

     action = "running"; 

     lastcompassvalue = compassvalue; 

     switch(relativeposition) { 


      case North: 
       currentpositionright = rightdrive.getCurrentPosition(); 

       if (rightdrive.getCurrentPosition() < encodercounts) { 
        rightdrive.setTargetPosition((int) (encodercounts + 1)); 
        leftdrive.setTargetPosition((int) (encodercounts + 1)); 

        rightdrive.setChannelMode(DcMotorController.RunMode.RUN_TO_POSITION); 
        leftdrive.setChannelMode(DcMotorController.RunMode.RUN_TO_POSITION); 

        rightdrive.setDirection(DcMotor.Direction.REVERSE); 
        rightdrive.setPower(.5); 
        leftdrive.setPower(.5); 

       } 
       else { 
        rightdrive.setPower(0); 
        leftdrive.setPower(0); 
        rightdrive.setChannelMode(DcMotorController.RunMode.RESET_ENCODERS); 
        leftdrive.setChannelMode(DcMotorController.RunMode.RESET_ENCODERS); 
       } 
       break; 

      case NorthEast: 
       currentpositionright = rightdrive.getCurrentPosition(); 

       if (compassvalue > lastcompassvalue - (90-angle)) { 
        rightdrive.setDirection(DcMotor.Direction.FORWARD); 
        rightdrive.setPower(fullpower); 
        leftdrive.setPower(fullpower); 
       } 
       else { 
        if(rightdrive.getCurrentPosition() < encodercounts) { 
         rightdrive.setTargetPosition((int) encodercounts + 1); 
         leftdrive.setTargetPosition((int) encodercounts + 1); 

         rightdrive.setChannelMode(DcMotorController.RunMode.RUN_TO_POSITION); 
         leftdrive.setChannelMode(DcMotorController.RunMode.RUN_TO_POSITION); 

         rightdrive.setDirection(DcMotor.Direction.REVERSE); 
         rightdrive.setPower(fullpower); 
         leftdrive.setPower(fullpower); 
        } 
        else { 
         rightdrive.setPower(0); 
         leftdrive.setPower(0); 
         rightdrive.setChannelMode(DcMotorController.RunMode.RESET_ENCODERS); 
         leftdrive.setChannelMode(DcMotorController.RunMode.RESET_ENCODERS); 
        } 
       } 

       break; 

      case East: 
       currentpositionright = rightdrive.getCurrentPosition(); 

       if (compassvalue > lastcompassvalue - 90) { 
        rightdrive.setDirection(DcMotor.Direction.FORWARD); 
        rightdrive.setPower(fullpower); 
        leftdrive.setPower(fullpower); 
       } 
       else { 
        if(rightdrive.getCurrentPosition() < encodercounts) { 
         rightdrive.setTargetPosition((int) encodercounts + 1); 
         leftdrive.setTargetPosition((int) encodercounts + 1); 

         rightdrive.setChannelMode(DcMotorController.RunMode.RUN_TO_POSITION); 
         leftdrive.setChannelMode(DcMotorController.RunMode.RUN_TO_POSITION); 

         rightdrive.setDirection(DcMotor.Direction.REVERSE); 
         rightdrive.setPower(fullpower); 
         leftdrive.setPower(fullpower); 
        } 
        else { 
         rightdrive.setPower(0); 
         leftdrive.setPower(0); 
         rightdrive.setChannelMode(DcMotorController.RunMode.RESET_ENCODERS); 
         leftdrive.setChannelMode(DcMotorController.RunMode.RESET_ENCODERS); 
        } 
       } 

       break; 

      case SouthEast: 
       currentpositionright = rightdrive.getCurrentPosition(); 

       if (compassvalue > lastcompassvalue - (90+angle)) { 
        rightdrive.setDirection(DcMotor.Direction.FORWARD); 
        rightdrive.setPower(fullpower); 
        leftdrive.setPower(fullpower); 
       } 
       else { 
        if(rightdrive.getCurrentPosition() < encodercounts) { 
         rightdrive.setTargetPosition((int) encodercounts); 
         leftdrive.setTargetPosition((int) encodercounts); 

         rightdrive.setChannelMode(DcMotorController.RunMode.RUN_TO_POSITION); 
         leftdrive.setChannelMode(DcMotorController.RunMode.RUN_TO_POSITION); 

         rightdrive.setDirection(DcMotor.Direction.REVERSE); 
         rightdrive.setPower(fullpower); 
         leftdrive.setPower(fullpower); 
        } 
        else { 
         rightdrive.setPower(0); 
         leftdrive.setPower(0); 
         rightdrive.setChannelMode(DcMotorController.RunMode.RESET_ENCODERS); 
         leftdrive.setChannelMode(DcMotorController.RunMode.RESET_ENCODERS); 
        } 
       } 

       break; 

      case South: 
       currentpositionright = rightdrive.getCurrentPosition(); 

       if (compassvalue > lastcompassvalue - 180) { 
        rightdrive.setDirection(DcMotor.Direction.FORWARD); 
        rightdrive.setPower(fullpower); 
        leftdrive.setPower(fullpower); 
       } 
       else { 
        if(rightdrive.getCurrentPosition() < encodercounts) { 
         rightdrive.setTargetPosition((int) encodercounts + 1); 
         leftdrive.setTargetPosition((int) encodercounts + 1); 

         rightdrive.setChannelMode(DcMotorController.RunMode.RUN_TO_POSITION); 
         leftdrive.setChannelMode(DcMotorController.RunMode.RUN_TO_POSITION); 

         rightdrive.setDirection(DcMotor.Direction.REVERSE); 
         rightdrive.setPower(fullpower); 
         leftdrive.setPower(fullpower); 
        } 
        else { 
         rightdrive.setPower(0); 
         leftdrive.setPower(0); 
         rightdrive.setChannelMode(DcMotorController.RunMode.RESET_ENCODERS); 
         leftdrive.setChannelMode(DcMotorController.RunMode.RESET_ENCODERS); 
        } 
       } 

       break; 

      case SouthWest: 
       currentpositionright = rightdrive.getCurrentPosition(); 

       if (compassvalue < lastcompassvalue + (90+angle)) { 
        rightdrive.setPower(fullpower); 
        leftdrive.setDirection(DcMotor.Direction.REVERSE); 
        leftdrive.setPower(fullpower); 
       } 
       else { 
        if(rightdrive.getCurrentPosition() < encodercounts) { 
         rightdrive.setTargetPosition((int) encodercounts + 1); 
         leftdrive.setTargetPosition((int) encodercounts + 1); 

         rightdrive.setChannelMode(DcMotorController.RunMode.RUN_TO_POSITION); 
         leftdrive.setChannelMode(DcMotorController.RunMode.RUN_TO_POSITION); 

         rightdrive.setPower(fullpower); 
         leftdrive.setDirection(DcMotor.Direction.FORWARD); 
         leftdrive.setPower(fullpower); 
        } 
        else { 
         rightdrive.setPower(0); 
         leftdrive.setPower(0); 
         rightdrive.setChannelMode(DcMotorController.RunMode.RESET_ENCODERS); 
         leftdrive.setChannelMode(DcMotorController.RunMode.RESET_ENCODERS); 
        } 
       } 

       break; 

      case West: 
       currentpositionright = rightdrive.getCurrentPosition(); 

       if (compassvalue < lastcompassvalue + 90) { 
        rightdrive.setPower(fullpower); 
        leftdrive.setDirection(DcMotor.Direction.REVERSE); 
        leftdrive.setPower(fullpower); 
       } 
       else { 
        if(rightdrive.getCurrentPosition() < encodercounts) { 
         rightdrive.setTargetPosition((int) encodercounts + 1); 
         leftdrive.setTargetPosition((int) encodercounts + 1); 

         rightdrive.setChannelMode(DcMotorController.RunMode.RUN_TO_POSITION); 
         leftdrive.setChannelMode(DcMotorController.RunMode.RUN_TO_POSITION); 

         rightdrive.setPower(fullpower); 
         leftdrive.setDirection(DcMotor.Direction.FORWARD); 
         leftdrive.setPower(fullpower); 
        } 
        else { 
         rightdrive.setPower(0); 
         leftdrive.setPower(0); 
         rightdrive.setChannelMode(DcMotorController.RunMode.RESET_ENCODERS); 
         leftdrive.setChannelMode(DcMotorController.RunMode.RESET_ENCODERS); 
        } 
       } 

       break; 

      case NorthWest: 
       currentpositionright = rightdrive.getCurrentPosition(); 

       if (compassvalue < lastcompassvalue + (90-angle)) { 
        rightdrive.setPower(fullpower); 
        leftdrive.setDirection(DcMotor.Direction.REVERSE); 
        leftdrive.setPower(fullpower); 
       } 
       else { 
        if(rightdrive.getCurrentPosition() < encodercounts) { 
         rightdrive.setTargetPosition((int) encodercounts + 1); 
         leftdrive.setTargetPosition((int) encodercounts + 1); 

         rightdrive.setChannelMode(DcMotorController.RunMode.RUN_TO_POSITION); 
         leftdrive.setChannelMode(DcMotorController.RunMode.RUN_TO_POSITION); 

         rightdrive.setPower(fullpower); 
         leftdrive.setDirection(DcMotor.Direction.FORWARD); 
         leftdrive.setPower(fullpower); 
        } 
        else { 
         rightdrive.setPower(0); 
         leftdrive.setPower(0); 
         rightdrive.setChannelMode(DcMotorController.RunMode.RESET_ENCODERS); 
         leftdrive.setChannelMode(DcMotorController.RunMode.RESET_ENCODERS); 
        } 
       } 

       break; 
     } 
     action = "done"; 
    } 

    private final ArrayList<Integer> Step = new ArrayList<>(); 

    @Override 
    public void init() { 

     rightdrive = hardwareMap.dcMotor.get("right_drive"); 
     leftdrive = hardwareMap.dcMotor.get("left_drive"); 

     rightdrive.setDirection(DcMotor.Direction.REVERSE); 

     leftdrive.setChannelMode(DcMotorController.RunMode.RESET_ENCODERS); 
     rightdrive.setChannelMode(DcMotorController.RunMode.RESET_ENCODERS); 


     step = 1; 
     Step.add(step); 
     //compassSensor = (HiTechnicNxtCompassSensor) hardwareMap.compassSensor.get("compass"); 
     compassvalue = 0; 

     relativeposition = RelativePosition.North; 

     distance = 12; 

     angle = 60; 



    } 

    public void start() { 
     status = "Running"; 

     time = new ElapsedTime(); 
     time.reset(); 

    } 

    @Override 
    public void loop() { 

     telemetry.addData("Status", status); 
     double currenttime = time.time(); 

     int size = Step.size(); 
     for (int i=0; i<size; i++) { 
      int element = Step.get(i); 

      switch (element) { 
       case 1: 

        Action(angle, (int) compassvalue,encodercounts,relativeposition); 

        step++; 
        Step.add(step); 

        break; 
       case 2: 

        rightdrive.setPower(0); 
        leftdrive.setPower(0); 

        status = "Done"; 

      } 
     } 


    } 
} 
+1

Старайтесь соблюдать только соответствующий код; Там есть много кода, который можно снять. Легче читать! – RafaelC

+0

Приносим извинения, что я пытался найти пару разных вещей, пытаясь решить эту проблему самостоятельно. Возможно, я оставил некоторые вещи там, где я отлаживал. –

ответ

1

Первое, что я думаю, наивное решение использовать общую глобальную булево как флаг, чтобы проверить, если метод все еще работает. Конечно, это основано на моем предположении, что за один раз у вас будет только один метод, который вы будете ждать, поскольку, согласно вашему вопросу, вы не хотите запускать другой метод, пока первый не будет выполнен с его выполнение.

Edit:

Набор булева истина, когда программа запускается, перед началом вашего метода казни.

Затем каждый раз, когда метод запускается, установите его в значение false, а затем перед возвратом из метода верните его в true. В вашем цикле, который вызывает вызовы методов, просто проверьте эту переменную перед вызовом другого метода.

+0

Итак, в основном есть логическое значение, которое установлено в true в начале функции и затем установлено в false в конце? Я довольно новичок в программировании на Java, это моя первая обширная программа, это всего лишь часть всего. –

+0

@ 5108AmishElectricians Сделано изменение, чтобы объяснить более подробно. Надеюсь, это поможет. –

+0

Я попробую это сегодня и отчитаюсь о том, как это работает. –