001 /*----------------------------------------------------------------------------*/ 002 /* Copyright (c) FIRST 2008-2012. All Rights Reserved. */ 003 /* Open Source Software - may be modified and shared by FRC teams. The code */ 004 /* must be accompanied by the FIRST BSD license file in the root directory of */ 005 /* the project. */ 006 /*----------------------------------------------------------------------------*/ 007 008 package edu.wpi.first.wpilibj.communication; 009 010 import com.sun.cldc.jna.Structure; 011 012 /** 013 * Structure for data exchanged between the robot and the driver station. 014 */ 015 public final class FRCCommonControlData extends Structure { 016 017 public static final short RESET_BIT = 0x80; 018 public static final short ESTOP_BIT = 0x40; 019 public static final short ENABLED_BIT = 0x20; 020 public static final short AUTONOMOUS_BIT = 0x10; 021 public static final short FMS_ATTATCHED = 0x08; 022 public static final short RESYNCH = 0x04; 023 public static final short TEST_MODE_BIT = 0x02; 024 public static final short CHECK_VERSIONS_BIT = 0x01; 025 026 /** 027 * The index of the packet 028 */ 029 public /*UINT16*/ int packetIndex; 030 /** 031 * The control mode e.g. Autonomous, E-stop, enabled ... 032 */ 033 public /*UINT8*/ short control; 034 // { reset, notEStop, enabled, autonomous, fmsAttached, resync, cRIOChkSum, fpgaChkSum } 035 036 /** 037 * Determine if the robot should be enabled 038 * @return true if the robot is enabled 039 */ 040 public boolean enabled() { 041 return (control & ENABLED_BIT) == ENABLED_BIT; 042 } 043 044 /** 045 * Determine if the robot is in test mode 046 * @return true if the robot is in test mode 047 */ 048 public boolean testMode() { 049 return (control & TEST_MODE_BIT) == TEST_MODE_BIT; 050 } 051 052 /** 053 * Determine if the robot should be in autonomous 054 * @return true if the robot is in autonomous 055 */ 056 public boolean autonomous() { 057 return (control & AUTONOMOUS_BIT) == AUTONOMOUS_BIT; 058 } 059 /** 060 * The state of the digital inputs on the ds 061 */ 062 public /*UINT8*/ short dsDigitalIn; 063 /** 064 * The team number from the ds 065 */ 066 public /*UINT16*/ int teamID; 067 /** 068 * Which alliance the robot is on 069 */ 070 public char dsID_Alliance; 071 /** 072 * The position of the controls on the alliance station wall. 073 */ 074 public char dsID_Position; 075 /** 076 * Position of the axes of the first js 077 */ 078 public byte[] stick0Axes = new byte[6]; 079 /** 080 * Button state of the first js 081 */ 082 public short stick0Buttons; // Left-most 4 bits are unused 083 /** 084 * Position of the axes of the second js 085 */ 086 public byte[] stick1Axes = new byte[6]; 087 /** 088 * Button state of the second js 089 */ 090 public short stick1Buttons; // Left-most 4 bits are unused 091 /** 092 * Position of the axes of the third js 093 */ 094 public byte[] stick2Axes = new byte[6]; 095 /** 096 * Button state of the third js 097 */ 098 public short stick2Buttons; // Left-most 4 bits are unused 099 /** 100 * Position of the axes of the fourth js 101 */ 102 public byte[] stick3Axes = new byte[6]; 103 /** 104 * Button state of the fourth js 105 */ 106 public short stick3Buttons; // Left-most 4 bits are unused 107 //Analog inputs are 10 bit right-justified 108 /** Driver Station analog input */ 109 public short analog1; 110 /** Driver Station analog input */ 111 public short analog2; 112 /** Driver Station analog input */ 113 public short analog3; 114 /** Driver Station analog input */ 115 public short analog4; 116 117 // Other fields are used by the lower-level comm system and not needed by robot code: 118 119 /** 120 * Create a new FRCControlData structure 121 */ 122 public FRCCommonControlData() { 123 allocateMemory(); 124 } 125 126 /** 127 * Method to free the memory used by this structure 128 */ 129 protected void free() { 130 freeMemory(); 131 } 132 133 /** 134 * Read new data in the structure 135 */ 136 public void read() { 137 packetIndex = backingNativeMemory.getShort(0) & 0xFFFF; 138 control = (short)(backingNativeMemory.getByte(2) & 0xFF); 139 140 dsDigitalIn = (short)(backingNativeMemory.getByte(3) & 0xFF); 141 teamID = backingNativeMemory.getShort(4) & 0xFFFF; 142 143 dsID_Alliance = (char) backingNativeMemory.getByte(6); 144 dsID_Position = (char) backingNativeMemory.getByte(7); 145 146 backingNativeMemory.getBytes(8, stick0Axes, 0, 6); 147 stick0Buttons = backingNativeMemory.getShort(14); 148 149 backingNativeMemory.getBytes(16, stick1Axes, 0, 6); 150 stick1Buttons = backingNativeMemory.getShort(22); 151 152 backingNativeMemory.getBytes(24, stick2Axes, 0, 6); 153 stick2Buttons = backingNativeMemory.getShort(30); 154 155 backingNativeMemory.getBytes(32, stick3Axes, 0, 6); 156 stick3Buttons = backingNativeMemory.getShort(38); 157 158 analog1 = backingNativeMemory.getShort(40); 159 analog2 = backingNativeMemory.getShort(42); 160 analog3 = backingNativeMemory.getShort(44); 161 analog4 = backingNativeMemory.getShort(46); 162 163 // Other fields are used by the lower-level comm system and not needed by robot code 164 } 165 166 /** 167 * Write new data in the structure 168 */ 169 public void write() { 170 throw new IllegalStateException("FRCCommonControlData is not writable"); 171 } 172 173 /** 174 * Get the size of the structure 175 * @return size of the structure 176 */ 177 public int size() { 178 return 80; 179 } 180 181 }