Skip to content

Commit 53ba185

Browse files
committed
Merge branch 'dev' of https://github.com/letsbuildrockets/ToF-CAN into dev
2 parents 80be743 + aee14c4 commit 53ba185

File tree

5 files changed

+69
-23
lines changed

5 files changed

+69
-23
lines changed

software/ToF-CAN-Java-FRC-V1.0.zip

-3.62 KB
Binary file not shown.

software/ToF-CAN-Java-FRC-V1.1.zip

4.84 KB
Binary file not shown.
Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,25 @@
1-
import org.letsbuildrocekts.libs.TimeOfFlightSensor;
1+
package frc.robot;
2+
3+
import org.letsbuildrockets.libs.TimeOfFlightSensor;
4+
25
import edu.wpi.first.wpilibj.TimedRobot;
36

47
public class Robot extends TimedRobot {
58
private TimeOfFlightSensor tofsensor;
69

710
@Override
811
public void robotInit() {
9-
tofsensor = new TimeOfFlightSensor(0x620);
12+
tofsensor = new TimeOfFlightSensor(0x621);
13+
System.out.println("ToF Sensor at " + String.format("0x%03x", tofsensor.getID()) + "! (with firmware version: " + tofsensor.getFirwareVersion().toString()+")");
1014
}
1115

1216
@Override
1317
public void teleopPeriodic() {
14-
if(tofsensor.inRange())
15-
System.out.println("distance: " + tofsensor.getDistance());
16-
else
18+
if(tofsensor.inRange()) {
19+
System.out.println("distance: " + tofsensor.getDistance()+ " " + tofsensor.getError());
20+
} else {
1721
System.out.println("out of range");
22+
}
1823
}
24+
1925
}

software/java_frc/org/letsbuildrockets/libs/TimeOfFlightSensor.java

Lines changed: 50 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,16 @@
22

33
import org.letsbuildrockets.libs.CustomCAN;
44
import org.letsbuildrockets.libs.VersionNumber;
5+
6+
import edu.wpi.first.hal.util.UncleanStatusException;
7+
import edu.wpi.first.wpilibj.Timer;
8+
import edu.wpi.first.hal.HAL;
59
/**
610
* TimeOfFlightSensor
711
* V1.1
812
*/
913
public class TimeOfFlightSensor {
1014

11-
1215
// Control Bytes
1316
private static final byte CTRL_SEND_ERROR = 1;
1417
private static final byte CTRL_SEND_DISTANCE = 2;
@@ -25,61 +28,77 @@ public class TimeOfFlightSensor {
2528
private static final byte ERROR_BAD_CTRL_BYTE = 5;
2629
private static final byte ERROR_NOT_ENOUGH_DATA_BYTES = 6;
2730

31+
// Required Firmware
32+
private static final VersionNumber minVersion = new VersionNumber(1,1);
2833

29-
int _ID, _distance, _error;
30-
VersionNumber _firmwareVersion;
31-
CustomCAN tofsensor;
32-
static int TOFCount = 0;
34+
35+
protected int _ID, _distance, _error = -1;
36+
protected Timer packetTimer;
37+
protected VersionNumber _firmwareVersion;
38+
protected CustomCAN tofsensor;
39+
protected static int TOFCount = 0;
3340

3441
public TimeOfFlightSensor(int ID) {
3542
tofsensor = new CustomCAN("TOF"+String.valueOf(TOFCount), ID);
43+
_firmwareVersion = new VersionNumber(0, 0);
3644
_ID = ID;
3745
TOFCount++;
38-
sendByte(CTRL_GET_FIRMWARE_VERSION);
39-
readBuffer();
46+
packetTimer = new Timer();
47+
packetTimer.start();
48+
getFirwareVersion();
49+
if(_firmwareVersion.isOlderThan(minVersion))
50+
HAL.sendError(true, -2, false, "LBR: Old Firmware! ToF sensor at " + String.format("0x%04x", _ID) + " is on firmware version " + _firmwareVersion.toString() + " but version " + minVersion.toString() + " is required. Upgrade ToF firmware, or downagrade the TimeOfFlight Java library!", "", "", false);
4051
}
4152

4253
private void readBuffer() {
4354
try {
4455
byte dat[] = tofsensor.readSafely();
4556
// for (byte byteme : dat) {
46-
// System.out.printf("rec: 0x%02x\n", byteme);
57+
// System.out.printf("rec: 0x%02x\n", byteme);
4758
// }
4859
switch (dat[0]) {
4960
case CTRL_SEND_ERROR:
5061
if(dat.length == 2){
5162
_error = dat[1];
63+
if(_error == ERROR_NONE || _error == ERROR_OUT_OF_RANGE)
64+
packetTimer.reset();
5265
}
5366
break;
5467
case CTRL_SEND_DISTANCE:
55-
if(dat.length == 3) {
56-
_error = dat[0] & 0xFF;
68+
if(dat.length == 4) {
5769
_distance = (dat[1]&0xFF) << 8 | (dat[2]&0xFF);
58-
// System.out.println("distance: " + _distance);
70+
_error = dat[3];
71+
//System.out.println("distance: " + _distance);
72+
packetTimer.reset();
5973
}
6074
break;
6175
case CTRL_SEND_FIRMWARE_VERSION:
76+
//System.out.println("ok, we received a firmware number i think");
6277
if(dat.length == 3){
63-
_firmwareVersion.major = dat[1];
64-
_firmwareVersion.minor = dat[2];
78+
_firmwareVersion = new VersionNumber(dat[1], dat[2]);
6579
}
80+
packetTimer.reset();
6681
break;
6782

6883
default:
6984
break;
7085
}
7186
} catch (CANMessageUnavailableException e) {
7287
//System.out.println("CAN error "+e.getMessage());
88+
if(packetTimer.hasPeriodPassed(5))
89+
HAL.sendError(true, -1, false, "LBR: Unable to communicate with ToF sensor at " + String.format("0x%04x", _ID), "", e.getStackTrace().toString(), false);
7390
}
7491
}
7592

7693
private void sendByte(byte byteme) {
7794
byte dat[] = new byte[8];
7895
dat[0] = byteme;
96+
try {
7997
tofsensor.writeSafely(dat);
98+
} catch (UncleanStatusException e) { }
8099
}
81100

82-
public void setHarwareCANAddress(short newID) {
101+
public void setHarwareCANAddress(int newID) {
83102
if(newID < 0x0620) {
84103
System.err.println("The new address for " + tofsensor.getName() + " must be >= 0x0620!");
85104
return;
@@ -96,23 +115,36 @@ public void setHarwareCANAddress(short newID) {
96115
}
97116

98117
public VersionNumber getFirwareVersion() {
118+
if(_firmwareVersion.major > 0) return _firmwareVersion;
99119
sendByte(CTRL_GET_FIRMWARE_VERSION);
100-
readBuffer();
120+
for(int i = 0; i < 100; i++) {
121+
Timer.delay(0.01);
122+
readBuffer();
123+
if(_firmwareVersion.major > 0) return _firmwareVersion;
124+
}
125+
HAL.sendError(true, -1, false, "LBR: Unable to communicate with ToF sensor at " + String.format("0x%04x", _ID) + " Can't get firmware version!", "", "", false);
101126
return _firmwareVersion;
102127
}
103128

129+
public int getID() {
130+
return _ID;
131+
}
132+
104133
public int getDistance() {
105-
readBuffer();
134+
if(packetTimer.hasPeriodPassed(0.01))
135+
readBuffer();
106136
return _distance;
107137
}
108138

109139
public int getError() {
110-
readBuffer();
140+
if(packetTimer.hasPeriodPassed(0.01))
141+
readBuffer();
111142
return _error;
112143
}
113144

114145
public boolean inRange() {
115-
readBuffer();
146+
if(packetTimer.hasPeriodPassed(0.01))
147+
readBuffer();
116148
return (_error == 0);
117149
}
118150

software/java_frc/org/letsbuildrockets/libs/VersionNumber.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,12 @@ public class VersionNumber {
1111
major = _major;
1212
minor = _minor;
1313
}
14+
15+
public boolean isOlderThan(VersionNumber req) {
16+
return(major < req.major || (major == req.major && minor < req.minor));
17+
}
18+
19+
public String toString() {
20+
return String.format("%d.%d", major, minor);
21+
}
1422
}

0 commit comments

Comments
 (0)