I’m having an issue with declaring the ThreeWirePort object to create threewire objects outside robot-config.cpp and robot-config.h.
My goal is for the client to be able to pass the relevant port number for a tracking wheel as an integer in the “Drive” constructor.
This is the Drive constructor as I would want it to look:
Drive::Drive(enum::drive_setup drive_setup, motor_group DriveL, motor_group DriveR, int gyro_port, float wheel_diameter, float wheel_ratio, float gyro_scale, int DriveLF_port, int DriveRF_port, int DriveLB_port, int DriveRB_port, int ForwardTracker_port, float ForwardTracker_diameter, float ForwardTracker_center_distance, int SidewaysTracker_port, float SidewaysTracker_diameter, float SidewaysTracker_center_distance) :
wheel_diameter(wheel_diameter),
wheel_ratio(wheel_ratio),
gyro_scale(gyro_scale),
drive_in_to_deg_ratio(wheel_ratio/360.0*M_PI*wheel_diameter),
ForwardTracker_center_distance(ForwardTracker_center_distance),
ForwardTracker_diameter(ForwardTracker_diameter),
ForwardTracker_in_to_deg_ratio(M_PI*ForwardTracker_diameter/360.0),
SidewaysTracker_center_distance(SidewaysTracker_center_distance),
SidewaysTracker_diameter(SidewaysTracker_diameter),
SidewaysTracker_in_to_deg_ratio(M_PI*SidewaysTracker_diameter/360.0),
drive_setup(drive_setup),
DriveL(DriveL),
DriveR(DriveR),
Gyro(inertial(gyro_port)),
DriveLF(DriveLF_port, is_reversed(DriveLF_port)),
DriveRF(DriveRF_port, is_reversed(DriveRF_port)),
DriveLB(DriveLB_port, is_reversed(DriveLB_port)),
DriveRB(DriveRB_port, is_reversed(DriveRB_port)),
R_ForwardTracker(ForwardTracker_port),
R_SidewaysTracker(SidewaysTracker_port),
E_ForwardTracker(Brain.ThreeWirePort.Port[ForwardTracker_port]),
E_SidewaysTracker(Brain.ThreeWirePort.Port[SidewaysTracker_port])
{
if (drive_setup != ZERO_TRACKER){
if (drive_setup == TANK_ONE_ENCODER || drive_setup == TANK_ONE_ROTATION){
odom.set_physical_distances(ForwardTracker_center_distance, 0);
} else {
odom.set_physical_distances(ForwardTracker_center_distance, SidewaysTracker_center_distance);
}
odom_task = task(position_track_task);
}
}
But as we all know, this creates a memory permission error when E_ForwardTracker and E_SidewaysTracker are defined because the Brain and ThreeWirePort haven’t been declared yet (or whatever the reason is).
For whatever reason, this code also gives a memory permission error:
triport ThreeWirePort = vex::triport( vex::PORT22 );
Drive::Drive(enum::drive_setup drive_setup, motor_group DriveL, motor_group DriveR, int gyro_port, float wheel_diameter, float wheel_ratio, float gyro_scale, int DriveLF_port, int DriveRF_port, int DriveLB_port, int DriveRB_port, int ForwardTracker_port, float ForwardTracker_diameter, float ForwardTracker_center_distance, int SidewaysTracker_port, float SidewaysTracker_diameter, float SidewaysTracker_center_distance) :
wheel_diameter(wheel_diameter),
wheel_ratio(wheel_ratio),
gyro_scale(gyro_scale),
drive_in_to_deg_ratio(wheel_ratio/360.0*M_PI*wheel_diameter),
ForwardTracker_center_distance(ForwardTracker_center_distance),
ForwardTracker_diameter(ForwardTracker_diameter),
ForwardTracker_in_to_deg_ratio(M_PI*ForwardTracker_diameter/360.0),
SidewaysTracker_center_distance(SidewaysTracker_center_distance),
SidewaysTracker_diameter(SidewaysTracker_diameter),
SidewaysTracker_in_to_deg_ratio(M_PI*SidewaysTracker_diameter/360.0),
drive_setup(drive_setup),
DriveL(DriveL),
DriveR(DriveR),
Gyro(inertial(gyro_port)),
DriveLF(DriveLF_port, is_reversed(DriveLF_port)),
DriveRF(DriveRF_port, is_reversed(DriveRF_port)),
DriveLB(DriveLB_port, is_reversed(DriveLB_port)),
DriveRB(DriveRB_port, is_reversed(DriveRB_port)),
R_ForwardTracker(ForwardTracker_port),
R_SidewaysTracker(SidewaysTracker_port),
E_ForwardTracker(ThreeWirePort.Port[ForwardTracker_port]),
E_SidewaysTracker(ThreeWirePort.Port[SidewaysTracker_port])
{
if (drive_setup != ZERO_TRACKER){
if (drive_setup == TANK_ONE_ENCODER || drive_setup == TANK_ONE_ROTATION){
odom.set_physical_distances(ForwardTracker_center_distance, 0);
} else {
odom.set_physical_distances(ForwardTracker_center_distance, SidewaysTracker_center_distance);
}
odom_task = task(position_track_task);
}
}
I also tried making ThreeWirePort a member of the drive class, which gave a memory permission error as well.
Here is some code that doesn’t give a memory permission error:
Drive::Drive(enum::drive_setup drive_setup, motor_group DriveL, motor_group DriveR, int gyro_port, float wheel_diameter, float wheel_ratio, float gyro_scale, int DriveLF_port, int DriveRF_port, int DriveLB_port, int DriveRB_port, int ForwardTracker_port, float ForwardTracker_diameter, float ForwardTracker_center_distance, int SidewaysTracker_port, float SidewaysTracker_diameter, float SidewaysTracker_center_distance) :
wheel_diameter(wheel_diameter),
wheel_ratio(wheel_ratio),
gyro_scale(gyro_scale),
drive_in_to_deg_ratio(wheel_ratio/360.0*M_PI*wheel_diameter),
ForwardTracker_center_distance(ForwardTracker_center_distance),
ForwardTracker_diameter(ForwardTracker_diameter),
ForwardTracker_in_to_deg_ratio(M_PI*ForwardTracker_diameter/360.0),
SidewaysTracker_center_distance(SidewaysTracker_center_distance),
SidewaysTracker_diameter(SidewaysTracker_diameter),
SidewaysTracker_in_to_deg_ratio(M_PI*SidewaysTracker_diameter/360.0),
drive_setup(drive_setup),
DriveL(DriveL),
DriveR(DriveR),
Gyro(inertial(gyro_port)),
DriveLF(DriveLF_port, is_reversed(DriveLF_port)),
DriveRF(DriveRF_port, is_reversed(DriveRF_port)),
DriveLB(DriveLB_port, is_reversed(DriveLB_port)),
DriveRB(DriveRB_port, is_reversed(DriveRB_port)),
R_ForwardTracker(ForwardTracker_port),
R_SidewaysTracker(SidewaysTracker_port),
E_ForwardTracker(vex::triport( vex::PORT22 ).A),
E_SidewaysTracker(vex::triport( vex::PORT22 ).C)
{
if (drive_setup != ZERO_TRACKER){
if (drive_setup == TANK_ONE_ENCODER || drive_setup == TANK_ONE_ROTATION){
odom.set_physical_distances(ForwardTracker_center_distance, 0);
} else {
odom.set_physical_distances(ForwardTracker_center_distance, SidewaysTracker_center_distance);
}
odom_task = task(position_track_task);
}
}
You’ll notice, though, the the Port[]
has been replaced with A
and C
. For some reason, this method doesn’t allow the client to access ports using integers.
How can I pass the three wire port as an integer? If I’m asking question X when I should be asking question Y, what is that question Y (i.e. how could the code structure as a whole be made better to avoid this problem altogether?)
Here is my code. It’s a template for drivetrain motions that I plan to release publicly in the future, so there should be no problem with including it here:
v5code-project-JAR-Template.zip (52.5 KB)
Thanks!
Josh