/*----------------------------------------------------------------------------*/ /* Copyright (c) Kauai Labs 2015. All Rights Reserved. */ /* */ /* Created in support of Team 2465 (Kauaibots). Go Purple Wave! */ /* */ /* Open Source Software - may be modified and shared by FRC teams. Any */ /* modifications to this code must be accompanied by the \License.txt file */ /* in the root directory of the project. */ /*----------------------------------------------------------------------------*/ package com.kauailabs.navx.frc; import com.kauailabs.navx.AHRSProtocol; import edu.wpi.first.wpilibj.SPI; import edu.wpi.first.wpilibj.Timer; class RegisterIO_SPI implements IRegisterIO{ SPI port; int bitrate; boolean trace = true; static final int DEFAULT_SPI_BITRATE_HZ = 500000; public RegisterIO_SPI( SPI spi_port ) { port = spi_port; bitrate = DEFAULT_SPI_BITRATE_HZ; } public RegisterIO_SPI( SPI spi_port, int bitrate ) { port = spi_port; this.bitrate = bitrate; } @Override public boolean init() { port.setClockRate(bitrate); port.setMSBFirst(); port.setSampleDataOnFalling(); port.setClockActiveLow(); port.setChipSelectActiveLow(); if (trace) System.out.println("navX-MXP: Initialized SPI communication at bitrate " + bitrate); return true; } @Override public boolean write(byte address, byte value ) { byte[] cmd = new byte[3]; cmd[0] = (byte) (address | (byte)0x80); cmd[1] = value; cmd[2] = AHRSProtocol.getCRC(cmd, 2); if ( port.write(cmd, cmd.length) != cmd.length) { if (trace) System.out.println("navX-MXP SPI Read: Write error"); return false; // WRITE ERROR } return true; } @Override public boolean read(byte first_address, byte[] buffer) { byte[] cmd = new byte[3]; cmd[0] = first_address; cmd[1] = (byte)buffer.length; cmd[2] = AHRSProtocol.getCRC(cmd, 2); if ( port.write(cmd, cmd.length) != cmd.length ) { return false; // WRITE ERROR } // delay 200 us /* TODO: What is min. granularity of delay()? */ Timer.delay(0.001); byte[] received_data = new byte[buffer.length+1]; if ( port.read(true, received_data, received_data.length) != received_data.length ) { if (trace) System.out.println("navX-MXP SPI Read: Read error"); return false; // READ ERROR } byte crc = AHRSProtocol.getCRC(received_data, received_data.length - 1); if ( crc != received_data[received_data.length-1] ) { if (trace) System.out.println("navX-MXP SPI Read: CRC error"); return false; // CRC ERROR } System.arraycopy(received_data, 0, buffer, 0, received_data.length - 1); return true; } @Override public boolean shutdown() { return true; } }