22
33import org .letsbuildrockets .libs .CustomCAN ;
44import 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 */
913public 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
0 commit comments