Go to Post Jeez, I love my job! :) - dlavery [more]
Home
Go Back   Chief Delphi > Technical > Programming
CD-Media   CD-Spy  
portal register members calendar search Today's Posts Mark Forums Read FAQ rules

 
Closed Thread
 
Thread Tools Rate Thread Display Modes
  #1   Spotlight this post!  
Unread 28-03-2007, 23:14
ay2b's Avatar
ay2b ay2b is offline
Registered User
AKA: Andy
FRC #2928
Team Role: Mentor
 
Join Date: Mar 2004
Rookie Year: 1994
Location: Seattle, WA
Posts: 211
ay2b has a brilliant futureay2b has a brilliant futureay2b has a brilliant futureay2b has a brilliant futureay2b has a brilliant futureay2b has a brilliant futureay2b has a brilliant futureay2b has a brilliant futureay2b has a brilliant futureay2b has a brilliant futureay2b has a brilliant future
Re: Timer Question

That is an excellent idea. Here's how I've been implementing it for the last few years; first the code, then an explination:

First off, I have two macros, all defined in auto_next.h
("DEBUG" is a macro defined elsewhere which will either call printf, or do nothing)

Code:
#ifndef __AUTO_NEXT_H__
#define __AUTO_NEXT_H__

#define AUTO_NEXT_STEP(x,name)                                              \
    if (auto_counter >= x)                                                  \
    {                                                                       \
        DEBUG((name "\r\n"));                                               \
        DEBUG(("auto_counter(%d) >= %d    ", auto_counter, x));             \
        ++auto_step;                                                        \
        DEBUG(("advancing to state %d\r\n", auto_step));                    \
        auto_counter = 0;                                                   \
    }

#define AUTO_NEXT_STEP_COND(x,y,name)                                       \
    AUTO_NEXT_STEP(x,name)                                                  \
    else if (y)                                                             \
    {                                                                       \
        DEBUG((name "\r\n"));                                               \
        DEBUG((#y));                                                        \
        DEBUG((" (%d)  ", auto_counter));                                   \
        ++auto_step;                                                        \
        DEBUG(("advancing to state %d\r\n", auto_step));                    \
        auto_counter = 0;                                                   \
    }

#endif // __AUTO_NEXT_H__
Somewhere above your autonomous function, declare these variables:

Code:
// These are used for state in autonomous mode
static unsigned int auto_counter = 0;
static char auto_step = 0;

And finally, in your slow loop autonomous function, do something like this:

Code:
void User_Autonomous_Slow_Loop(void)
{
    auto_counter++;

    switch (auto_step)
    {
      case 0:
        robot_drive(127,192);
        AUTO_NEXT_STEP(120, "drive forward");
        break;

      case 1:
        {
            bool turn;
            turn = robot_turn_to_angle(90);
            AUTO_NEXT_STEP_COND(400, turn, "turn robot");
        }
        break;

      case 2:
        robot_all_stop();
        break;
    }
}
In your slow loop function, you basically have a simple state machine. First your robot does whatever it does while in state 0, then state 1, etc. In the pseudo-code above, in state 0 it will drive straight forward at half speed; in state 1 it will turn to 90 degrees; in state 2, it stops.

The two variables, auto_step and auto_counter keep track of the state. The macros help manipulate them. AUTO_NEXT_STEP two paramaters, a time, and a string which is the name of the current mode. Each time through the slow loop, the auto_counter gets incremented. If it reaches the time paramater of AUTO_NEXT_STEP, the counter gets reset to 0 and the auto_step gets incremented.

The advantage to doing it this way over something like a bunch of chained if statements
Code:
if (timer < 120)
{
    // drive forward
} else if (timer < 400)
{
    // turn
}
is that you can easily change the time spent in one step without having to change the time in any of the other steps. Suppose you decide that you only want to drive forward for 100 counts rather than 120 counts. With this two-variable macro approach, you simply change the argument to AUTO_NEXT_STEP to 100 instead of 120. With the chained ifs, you have to change every single value.

The AUTO_NEXT_STEP_COND macro is like AUTO_NEXT_STEP, except that it also takes a condition. If you have a function like "robot_turn(90)" which returns a boolean value of TRUE when it is completed and FALSE when it is not, then you can use AUTO_NEXT_STEP_COND to advance to the next state as soon as a condition is met, rather than waiting for a time. This is particularly useful if you have functions to drive a certain distance based on encoder counts, or move an arm to a certain position, etc.

Good luck!

--AJY
__________________

2011 - SD Quarterfinalists (980), LA Quarterfinalists (980)
2010 - LA (2404) Finalists (980), AZ Motorola Quality (980)
2009 - LA Semifinalists (980); Las Vegas Quarterfinalists (980); SD (2404); IRI #1 Seed, Finalist (980)
2008 - SD Quarterfinalists (980), LA Champions (980), LA Rookie Inspiration Award (2404); CalGames Finalists
2007 - So.Cal Finalists (980), SD Quarterfinalists (980); CalGames Finalists
2006 - So.Cal Regional Champion (4), Toronto Judge's Award Day 1 (4)
2005 - SVR Champions, Delphi "Driving Tomorrow's Technology" (980); AZ Xerox Creativity (980); So.Cal Finalists, RadioShack Innovation in Control (980); Championship Archimedes Division Semifinalists; IRI Finalists (980)
2004 - So.Cal Regional Champions, Leadership in Controls (980); AZ GM Industrial Design (980); Championship Galileo Division #2 Seed; IRI Champions
2003 - PNW Semi-finalists (488)
2002 - PNW Finalists (488)
2000 - X-bot / 488 - Mentor / Founder
1994 - Sunny Delight - Driver - champion
Closed Thread


Thread Tools
Display Modes Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
Timer questions Rick TYler Programming 3 12-02-2006 19:24
Quick Timer Question et1337 Programming 3 02-02-2006 15:19
Accelerometer Timer Question psquared Programming 3 12-02-2005 01:34
timer omega Programming 3 30-03-2004 18:52
Timer Preview Nate Smith General Forum 2 05-03-2003 12:25


All times are GMT -5. The time now is 00:22.

The Chief Delphi Forums are sponsored by Innovation First International, Inc.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Copyright © Chief Delphi