⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rcxreceiver.java

📁 RCXDownload and RCXDirectMode是leJOS的一个可视化接口。RCXDownload自动设置JDK-, leJOS-和ClassPath
💻 JAVA
字号:
import josx.platform.rcx.*;/** * This program listens for messages from your PC. * It accepts a few standard opcodes, such as * Set Motor On/Off (0x21). You should be able to * control it using the RCXDirectMode GUI. */public class RCXReceiver implements Segment, SensorConstants{  private static final int LENGTH = 10;  private static final int MAX    = 99;  static int sensorSegment[] =      { SENSOR_1_VIEW, SENSOR_2_VIEW, SENSOR_3_VIEW };  static int motorSegment[][] =   {      { MOTOR_A_VIEW, MOTOR_B_VIEW, MOTOR_C_VIEW },     { MOTOR_A_FWD, MOTOR_B_FWD, MOTOR_C_FWD },     { MOTOR_A_REV, MOTOR_B_REV, MOTOR_C_REV }  };  private static final Sensor[]  SENSOR = { Sensor.S1, Sensor.S2, Sensor.S3 };  private static final Motor[]   MOTOR  = { Motor.A, Motor.B, Motor.C };  private static       int[]     sensorValue  = new int[3];  private static       int[]     motorValue   = new int[3];  public static void readSensorValue(byte[] pPacket)  {    //for (int k=0; k<=2; k++) SENSOR[k].activate();    byte[] rPacket = new byte[LENGTH];    int pFlagsSensor = pPacket[1] & 0xFF;    int pFlagsMode   = pPacket[2] & 0xFF;    //rPacket[0] = (byte) (45 & 0xFF); //(178 & 0xFF);  // (byte)178 = b2  -> send message    rPacket[0] = (byte) ~(pPacket[0] & 0xFF);    LCD.clear();    if ((pFlagsSensor >= 0) && (pFlagsSensor <= 2)) {       LCD.setSegment (sensorSegment[pFlagsSensor]);       int value = 0;       //Sensor s = (Sensor) pDevice;       if (pFlagsMode == 0) {                     // raw-values have to be converted         //SENSOR[pFlagsMode].setTypeAndMode (SENSOR_TYPE_LIGHT, SENSOR_MODE_RAW); // works bad in alpha5         value = SENSOR[pFlagsSensor].readRawValue();         int z = value;         int i = 0;         while (z > MAX) { i++; z = z - MAX; } // z = z-100; z = z-100; z = z-55; }         rPacket[1] = (byte) (z & 0xFF);         rPacket[2] = (byte) (i & 0xFF);         //LCD.showNumber (value);       }       else if (pFlagsMode == 3) {                 // percent values         //SENSOR[pFlagsMode].setTypeAndMode (SENSOR_TYPE_LIGHT, SENSOR_MODE_PCT); // works bad in alpha5         value = sensorValue[pFlagsSensor];         rPacket[1] = (byte) (value & 0xFF);         //LCD.showNumber (value);       }       else if (pFlagsMode == 1) {                 // boolean values         //SENSOR[pFlagsMode].setTypeAndMode (SENSOR_TYPE_TOUCH, SENSOR_MODE_BOOL); // works bad in alpha5         value = (SENSOR[pFlagsSensor].readBooleanValue() ? 1:0); //((sensorValue[pFlagsSensor] > 1000) ? 1:0);         rPacket[1] = (byte) (value & 0xFF);         //LCD.showNumber (value);       }       LCD.showNumber (value);    }    Serial.sendPacket (rPacket, 0, rPacket.length);    LCD.refresh();    Sound.beep();  }  public static void setMotorPower(byte[] pPacket)  {    int pFlagsMotor = pPacket[1] & 0xFF;    int pFlagsPower = pPacket[2] & 0xFF;    //pPacket[0] = (byte) (13 & 0xFF);    pPacket[0] = (byte) ~(pPacket[0] & 0xFF);    Serial.sendPacket (pPacket, 0, 1);    LCD.clear();    LCD.showNumber (pFlagsPower);    if ((pFlagsMotor >= 0) && (pFlagsMotor <= 2)) {       LCD.setSegment (motorSegment[0][pFlagsMotor]);       MOTOR[pFlagsMotor].setPower(pFlagsPower);       motorValue[pFlagsMotor] = pFlagsPower;    }    else Sound.beep();    LCD.refresh();  }  public static void setMotorOnOff(byte[] pPacket)  {    int pFlagsMotor = pPacket[1] & 0xFF;    //pPacket[0] = (byte) (21 & 0xFF);    pPacket[0] = (byte) ~(pPacket[0] & 0xFF);    Serial.sendPacket (pPacket, 0, 1);    //int x = (pFlagsMotor - (pFlagsMotor % 10)) / 10;    //int y = pFlagsMotor % 10;    int y = (pFlagsMotor % 16);    int x = (pFlagsMotor - y) / 16;    int pFlags = x * 10 + y;    int motor_n   = (pFlags - (pFlags % 10)) / 10;    int motor_cmd = pFlags % 10;    LCD.clear();    //LCD.showNumber (motor_n);    //LCD.showProgramNumber (motor_cmd);    if ((motor_n >= 0) && (motor_n <= 2)) {       LCD.showNumber (motorValue[motor_n]);       if (motor_cmd == 8) {          LCD.setSegment (motorSegment[1][motor_n]);          MOTOR[motor_n].forward();       }       else if (motor_cmd == 0) {                LCD.setSegment (motorSegment[2][motor_n]);               MOTOR[motor_n].backward();            }            else {                  LCD.setSegment (motorSegment[0][motor_n]);                  MOTOR[motor_n].stop();                 }    }    else Sound.beep();    LCD.refresh();  }  public static void readBatteryValue(byte[] pPacket)  {    byte[] rPacket = new byte[LENGTH];    //rPacket[0] = (byte) (45 & 0xFF);    rPacket[0] = (byte) ~(pPacket[0] & 0xFF);    int value = Battery.getVoltageInternal();    int z = value;    int i = 0;    while (z > MAX) { i++; z = z - MAX; } //z = z-100; z = z-100; z = z-55; }    rPacket[1] = (byte) (z & 0xFF);    rPacket[2] = (byte) (i & 0xFF);    Serial.sendPacket (rPacket, 0, rPacket.length);    //LCD.refresh();    LCD.showNumber (value);    Sound.beep();  }  public static void playSound(byte[] pPacket)  {    int pFlags = pPacket[1] & 0xFF;    //pPacket[0] = (byte) (51 & 0xFF);    pPacket[0] = (byte) ~(pPacket[0] & 0xFF);    Serial.sendPacket (pPacket, 0, 1);    LCD.showNumber (pFlags);    Sound.systemSound (true, pFlags);  }  public static void executePacket(byte[] pPacket)  {    int pOpCode = pPacket[0] & 0xF7;    if (pOpCode == 0x10)    {            // Alive?            LCD.showNumber (0000);            pPacket[0] = (byte) ~(pPacket[0] & 0xFF);            Serial.sendPacket (pPacket, 0, 1);            Sound.beep();    }    else if (pOpCode == 0x32)    {             readSensorValue(pPacket);     }    else if (pOpCode == 0x21)    {             setMotorOnOff(pPacket);    }    else if (pOpCode == 0x13)    {            setMotorPower(pPacket);    }    else if (pOpCode == 0x51)    {            playSound(pPacket);    }    else if (pOpCode == 0x30)    {            readBatteryValue(pPacket);    }    else {            pPacket[0] = (byte) ~(pPacket[0] & 0xFF);            Serial.sendPacket (pPacket, 0, 1);            Sound.beep();    }  }  public static void main (String[] arg)  {    //LCD.showNumber (1111);    LCD.clearSegment(WALKING);    TextLCD.print("JAVA");    LCD.refresh();    Sound.playTone(1500, 20);    // Without SensorListener, the lamp of the lightsensor would not work!    // It's also a workaround for getting percent values.    SENSOR[0].activate();    SENSOR[0].addSensorListener (new SensorListener() {      public void stateChanged (Sensor src, int oldValue, int newValue) {        //LCD.showNumber (newValue);        sensorValue[0] = newValue;        try { 	         Thread.sleep (100);        } catch (InterruptedException e) {          // ignore        }      }    });    SENSOR[1].activate();    SENSOR[1].addSensorListener (new SensorListener() {      public void stateChanged (Sensor src, int oldValue, int newValue) {        //LCD.showNumber (newValue);        sensorValue[1] = newValue;        try { 	         Thread.sleep (100);        } catch (InterruptedException e) {          // ignore        }      }    });    SENSOR[2].activate();    SENSOR[2].addSensorListener (new SensorListener() {      public void stateChanged (Sensor src, int oldValue, int newValue) {        //LCD.showNumber (newValue);        sensorValue[2] = newValue;        try { 	         Thread.sleep (100);        } catch (InterruptedException e) {          // ignore        }      }    });    for (int k=0; k<=2; k++) {        SENSOR[k].setTypeAndMode (SENSOR_TYPE_LIGHT, SENSOR_MODE_PCT);        motorValue[k] = 4;    }    byte[] pPacket = new byte[LENGTH]; // moved out of the loop (mem leak hint by David Hill)    for (;;)    {            if (Serial.isPacketAvailable())      {        Serial.readPacket (pPacket);        executePacket(pPacket);      }    }  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -