I am using grip with networktables and I do not think I am setting it up properly. Here is my code:
package org.usfirst.frc.team2847.robot.subsystems;
import org.usfirst.frc.team2847.robot.RobotMap;
import org.usfirst.frc.team2847.robot.commands.JoystickDrive;
import edu.wpi.first.wpilibj.RobotDrive;
import edu.wpi.first.wpilibj.command.PIDSubsystem;
import edu.wpi.first.wpilibj.networktables.NetworkTable;
/**
*
*/
public class Drivetrain extends PIDSubsystem {
// Initialize your subsystem here
double] greenAreasArray = {};
double] greenXArray = {};
double] greenYArray = {};
double] defaultValue = new double[0];
double maxArea = 0;
double greenX = 0;
double greenY = 0;
double offsetX;
int arrayNum = 0;
// create our drivetrain object
RobotDrive myDriveTrain = new RobotDrive(RobotMap.frontLeftDrive, RobotMap.rearRightDrive);
NetworkTable table = NetworkTable.getTable("GRIP/myContoursReport");
public Drivetrain() {
// Use these to get going:
// setSetpoint() - Sets where the PID controller should move the system
// to
// enable() - Enables the PID controller.
super("Drivetrain", RobotMap.kDriveP, RobotMap.kDriveI, RobotMap.kDriveD);
setPercentTolerance(5.0);
// viz
}
// Put methods for controlling this subsystem
// here. Call these from Commands.
public void initDefaultCommand() {
// Set the default command for a subsystem here.
setDefaultCommand(new JoystickDrive());
}
// make the method for our drivetrain
public void manDrive(double leftValue, double rightValue) {
myDriveTrain.tankDrive(leftValue, rightValue);
}
/*
* starts a counter and for each item in the number array compares it to the
* max value from before in the end of the loop we should have max = the
* biggest value in our array we do this to find out which contour is our
* target this should filter out any minor interference in the camera
*/
public boolean isContours() {
table = NetworkTable.getTable("GRIP/myContoursReport");
greenAreasArray = table.getNumberArray("area", defaultValue);
if (greenAreasArray.length > 0) {
System.out.println(greenAreasArray.length);
return true;
} else {
System.out.println("no array");
return false;
}
}
public void findMaxArea() {
if (isContours()) {
System.out.println("Areas:");
for (int counter = 0; counter < greenAreasArray.length; counter++) {
if (greenAreasArray[counter] > maxArea) {
maxArea = greenAreasArray[counter];
arrayNum = counter;
System.out.println(greenAreasArray[counter]);
}
}
System.out.print(maxArea);
}
}
public void updateArea() {
findMaxArea();
}
public void useCenter() {
this.updateArea();
if (isContours()) {
greenXArray = table.getNumberArray("centerX", defaultValue);
greenYArray = table.getNumberArray("centerY", defaultValue);
greenX = greenXArray[arrayNum];
greenY = greenYArray[arrayNum];
}
}
public double offsetCalc() {
this.useCenter();
offsetX = 320 - greenX;
return offsetX;
}
protected double returnPIDInput() {
// Return your input value for the PID loop
// e.g. a sensor, like a potentiometer:
// yourPot.getAverageVoltage() / kYourMaxVoltage;
return greenY;
}
protected void usePIDOutput(double output) {
// Use output to drive your system, like a motor
// e.g. yourMotor.set(output);
double go;
go = (output * 0.50);
if (offsetCalc() > 0) {
this.manDrive(go * (greenX / 320), go);
} else if (offsetCalc() < 0) {
this.manDrive(go, go * (greenX / 320));
} else {
this.manDrive(go, go);
}
System.out.println(go);
}
}
I currently use a button to call the PID, but my area array doesnt update. Its always 1001.1. How am I supposed to set up the NetworkTable, as a server, do I need to give it an IP? I am using Outline viewer server to view the GRIP tables right now, but how do I replicate that in my code to update.