I’m working with Kevin Watson’s 3.0 compatible FRC framework. I have code in the begining of my Autonomous() function that should cause the robot to wait, based on a few constants defined in Autonomous.h. It doesn’t seem to work, and just takes off immediately. Could it have something to do with the fact that the field control system spends a moment in teleop before jumping to autonomous in the begining?
I attached a .zip archive with my entire workspace.
The best thing to do for delays is make a counter that does everything. Here is a few lines that I used for our robot in the Tacoma Regional:
int timer = 0;
if(timer < 72)
/* 72, if I remember right, is about 2 seconds, this number can be adjusted however you need it to be */
{
timer ++;
}
else
{
// This is where the remainder of autonomous functions occured
}
It cycles 40 times a second right? So you can just make a function that returned i / 40 so you can say if(timer < 2) which would be the actual amount of seconds. I know it’s basic math to just multiply by 40, but it makes the code a little more readable for someone that doesn’t know that.
It’s in autonomous.c in the attached archive. Since it’s also based on stuff in autonomous.h, I left it in an archive. Would it help if I copy both .c and .h here?
The code is fairly confusing for me as to what you are trying to do. The way I learned programming makes this very hard to read, no offense. I just can’t figure out what is wrong with it.
I too find the highly compact style a hindrance to readability. I actually reformatted the relevant lines in order to make it easier for me to see what the code was trying to do.
I don’t remember who said it, but I agree with the philosophy that says a programmer’s job is to write documentation that compiles into a working program.
That’s the next thing I was going to check. I put it in there during our last competition in hopes of getting around to test it there, and I haven’t been able to yet. I’m hoping to do that early Thursday morning in Atlanta.
It looks like you might be being bitten by C18’s habit of doing single byte arithmetic. In your if statement cast WAITING_TIME and LOOPS_IN_A_SECOND to int.
For example:
if(auton_counter < (int) WAITING_TIME * (int) LOOPS_IN_A_SECOND){ //wait
C18 is most likely currently treating them as single byte numbers - so 8 x 38 is 304, which overflows to become 48. (Which would only give you about a 1 second wait.)
The double less-then signs will not do what you intend (they will shift auton_counter left by WAITING_TIME * LOOPS_IN_A_SECOND, which will end up being 0).