Advertisement
Guest User

Untitled

a guest
Oct 15th, 2019
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.04 KB | None | 0 0
  1. package MainMenu;
  2.  
  3. import java.io.IOException;
  4. import java.util.ArrayList;
  5.  
  6. import lejos.hardware.Button;
  7. import lejos.hardware.ev3.LocalEV3;
  8. import lejos.hardware.port.Port;
  9. import lejos.hardware.sensor.EV3IRSensor;
  10. import lejos.hardware.sensor.SensorModes;
  11. import lejos.robotics.RegulatedMotor;
  12. import lejos.robotics.SampleProvider;
  13. import lejos.utility.Delay;
  14.  
  15. public class ManualSorter {
  16.    
  17.     public void manualLoop(RegulatedMotor mRanni, RegulatedMotor mJalusta,
  18.             ArrayList<int[]> kalibroidutVarit, SampleProvider colorProvider, float[] sample) throws IOException, ClassNotFoundException {
  19.        
  20.         boolean manualMode = true;
  21.         int[] syotettyVari = new int[3];
  22.         double[] variEtaisyys = new double[4];
  23.         int[] variArvot = {0,0,0};
  24.        
  25.         String start = "";
  26.         while(start.contains("Start")) start = (String) Main.OBJECTIN.readObject();
  27.         System.out.println("Manual: Started.");
  28.        
  29.         while (manualMode) {
  30.            
  31.             mJalusta.setSpeed(50);
  32.            
  33.             switch (buttonPressed(sensorIR)) {
  34.             // Skannaa ja tiputtaa palikan
  35.             case SCANEJECT:
  36.                 System.out.println("READING...");
  37.                 // Lue värejä
  38.                 colorProvider.fetchSample(sample, 0);
  39.                 for (int i = 0; i < syotettyVari.length; i++)
  40.                     syotettyVari[i] = Math.round(sample[i] * 765);
  41.    
  42.                 // Tarkista onko väri lähellä kalibroituja värejä
  43.                 for (int i = 0; i < variEtaisyys.length; i++)
  44.                     variEtaisyys[i] = variTarkastus(kalibroidutVarit.get(i), syotettyVari);
  45.    
  46.                 // TODO: laske lyhin etäisyys. Palauttaa indeksin
  47.                 int shortest = minDistance(variEtaisyys);
  48.    
  49.                 // TODO: tunnista väri taulukon indeksistä
  50.                 if(shortest < variArvot.length) variArvot[shortest]++;
  51.                 System.out.println(Main.VARINIMET[shortest] + " color");
  52.                    
  53.                 // TODO: update databaseen
  54.                 mRanni.rotate(-180);
  55.                 mRanni.rotate(180);
  56.                 break;
  57.             case CALIBRATE:
  58.                 luePalikat(mRanni, kalibroidutVarit, colorProvider, sample);
  59.                 break;
  60.             case ROTATELEFT:
  61.                 System.out.println(mJalusta.getLimitAngle());
  62.                 if(mJalusta.getLimitAngle() > -60) mJalusta.rotate(-60, true);
  63.                 while(mJalusta.isMoving());
  64.                 break;
  65.             case ROTATERIGHT:
  66.                 System.out.println(mJalusta.getLimitAngle());
  67.                 if(mJalusta.getLimitAngle() < 60) mJalusta.rotate(60, true);
  68.                 while(mJalusta.isMoving());
  69.                 break;
  70.             case ESCAPE:
  71.                 manualMode = false;
  72.                 break;
  73.             default:
  74.                 break;
  75.             }
  76.         }
  77.         for(int i: variArvot)
  78.             Main.OBJECTOUT.writeObject(i);
  79.        
  80.         mJalusta.rotateTo(0, true);
  81.         mRanni.rotateTo(0, true);
  82.         while(mRanni.isMoving() || mJalusta.isMoving());
  83.         Main.mainLoop();
  84.     }
  85.    
  86.    
  87.     private static void luePalikat(RegulatedMotor mRanni, ArrayList<int[]> kalibroidutVarit, SampleProvider colorProvider, float[] sample) {
  88.         // Kalibroidaan palikan väri
  89.         System.out.println("Calibration starts in 3 sec...");
  90.         Delay.msDelay(3000);
  91.        
  92.         for(int i = 0; i < kalibroidutVarit.size(); i++) {
  93.             System.out.print(Main.VARINIMET[i] + ": ");
  94.             kalibroidutVarit.set(i, Main.kalibroi(Main.KALIBROINTITARKKUUS, colorProvider, sample));
  95.             System.out.println("Success!");
  96.            
  97.             mRanni.rotate(-180, true);
  98.             while (mRanni.isMoving());
  99.             mRanni.rotate(180, true);
  100.             while (mRanni.isMoving());
  101.             Delay.msDelay(750);
  102.         }
  103.        
  104.         System.out.println("Ready!");
  105.         Delay.msDelay(500);
  106.     }
  107.    
  108.     // Vertaa kahta väri. True = värit ovat samat, false = värit ovat eri
  109.         private static double variTarkastus(int[] vari1, int[] vari2) {
  110.             // Muuttujat
  111.             int[] variEtaisyysItseisarv = new int[vari1.length];
  112.             int summa = 0;
  113.  
  114.             // Laksetaan värien etäisyys ja korotetaan neliöön
  115.             for (int i = 0; i < vari1.length; i++) {
  116.                 variEtaisyysItseisarv[i] = vari1[i] - vari2[i];
  117.                 variEtaisyysItseisarv[i] *= variEtaisyysItseisarv[i];
  118.             }
  119.  
  120.             // Summataan etäisyyden neliöt ja lasketaan summan neliöjuuri
  121.             for (int i : variEtaisyysItseisarv)
  122.                 summa += i;
  123.  
  124.             return Math.sqrt((double) summa);
  125.         }
  126.        
  127.         // Palauttaa lyhimmän arvon indeksiluvun
  128.         private static int minDistance(double[] taulukko) {
  129.             int pienin = taulukko[0] < taulukko[1] ? 0 : 1;
  130.             pienin = taulukko[pienin] < taulukko[2] ? pienin : 2;
  131.             return taulukko[pienin] < taulukko[3] ? pienin : 3;
  132.         }
  133.    
  134.     public int[] kalibroi(int accuracy, SampleProvider colorProvider, float[] sample) {
  135.         // Muuttujat
  136.         int[] rgb = { 0, 0, 0 };
  137.  
  138.         // Lasketaan R-, G-, ja B-arvojen kertymä n-kertaa
  139.         for (int i = 0; i < accuracy; i++) {
  140.             colorProvider.fetchSample(sample, 0);
  141.             for (int j = 0; j < rgb.length; j++)
  142.                 rgb[j] += Math.round(sample[j] * 765);
  143.         }
  144.  
  145.         // Jaetaan kertymä n-kerralla. Saadaan jäsenien keskiarvo
  146.         for (int i = 0; i < rgb.length; i++)
  147.             rgb[i] = Math.round(rgb[i] / accuracy);
  148.  
  149.         // Palautetaan kolmiarvoinen int-tyyppinen lista
  150.         return rgb;
  151.     }
  152.    
  153.     // Palauttaa komennon riippuen painetusta näppäimestä
  154.         // Näppäin voi olla kauko-ohjaimesta tai EV3:sta
  155.         static Commands buttonPressed(SensorModes sensorIR) {
  156.             int channel = 0;
  157.             int command = ((EV3IRSensor) sensorIR).getRemoteCommand(channel);
  158.             if (Button.UP.isDown() || command == IR_DOWNRIGHT) {
  159.                 return Commands.CALIBRATE;
  160.             } else if (Button.DOWN.isDown() || command == IR_DOWNLEFT) {
  161.                 return Commands.SCANEJECT;
  162.             } else if (Button.LEFT.isDown() || command == IR_UPLEFT) {
  163.                 return Commands.ROTATELEFT;
  164.             } else if (Button.RIGHT.isDown() || command == IR_UPRIGHT) {
  165.                 return Commands.ROTATERIGHT;
  166.             } else if (Button.ENTER.isDown()) {
  167.                 return Commands.SCAN;
  168.             } else if (Button.ESCAPE.isDown()) {
  169.                 return Commands.ESCAPE;
  170.             }
  171.             return Commands.NONE;
  172.         }
  173.        
  174.         //Manual mode commands
  175.         private static enum Commands {
  176.             CALIBRATE, SCANEJECT, ROTATELEFT, ROTATERIGHT, SCAN, ESCAPE, NONE
  177.         }
  178.        
  179.         // IR -ohjaimen näppäinten arvoja vastaavat muuttujat
  180.         private static final int IR_UPLEFT = 1;
  181.         private static final int IR_UPRIGHT = 2;
  182.         private static final int IR_DOWNLEFT = 3;
  183.         private static final int IR_DOWNRIGHT= 4;
  184.        
  185.         // Käynnistetään IR -anturi
  186.         private static Port portIR = LocalEV3.get().getPort("S2");
  187.         private static SensorModes sensorIR = new EV3IRSensor(portIR);
  188. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement