Go to Post What makes a man is not the mistakes, but the actions that follow. Andy B. - Andy Baker [more]
Home
Go Back   Chief Delphi > Technical > Programming > Java
CD-Media   CD-Spy  
portal register members calendar search Today's Posts Mark Forums Read FAQ rules

 
Reply
 
Thread Tools Rate Thread Display Modes
  #1   Spotlight this post!  
Unread 04-02-2015, 17:16
curtis0gj curtis0gj is offline
Registered User
FRC #5033 (Beavertronics)
Team Role: Programmer
 
Join Date: Jan 2015
Rookie Year: 2015
Location: Canada
Posts: 121
curtis0gj will become famous soon enough
Limit Swtich Help

Hi guys, our team is trying to use a limit switch to stop the lifting mech powered by 2 victor motor controllers from bottoming out or flying off the top. But I can't get the switch to work properly.

Code:
public class Robot extends SampleRobot {
	
    RobotDrive robot;
    Joystick stick;
    Joystick xbox;

    Victor victor1;
    Victor victor2;
    DigitalInput limit;
    
    
    boolean limitPressed = false;

    boolean buttonPressedForwardVictor = false;

public Robot() {
    	
    	robot = new RobotDrive(0, 1);
        stick = new Joystick(1);
        xbox = new Joystick(0);

        limit = new DigitalInput(4);	
        
        victor1 = new Victor(4);
        victor2 = new Victor(5);
 
    }

public void operatorControl() {
    	
    	while (isOperatorControl() && isEnabled()) {
        	
            stick.getThrottle();
            robot.arcadeDrive(stick.getY(), stick.getX());
            Timer.delay(0.1);
     
            if(limit.get()) {
            	
            	limitPressed = true;
            	
            }
            
            if(limitPressed = true) {
            	
            	victor1.set(0);
            	victor2.set(0);
            	
            }
            
            if (xbox.getRawButton(4)) {
            	
            	victor1.set(1);
            	victor2.set(1);
            	buttonPressedForwardVictor = true;
            	
            } else if (buttonPressedForwardVictor = true) {
            	
            	victor1.set(0);
            	victor2.set(0);
            	buttonPressedForwardVictor = false;
            } 
            
            if (xbox.getRawButton(1)) {
            	
            	victor1.set(-1);
            	victor2.set(-1);
            }
            
            	
            }
            
    	}
Reply With Quote
  #2   Spotlight this post!  
Unread 04-02-2015, 17:21
Jon Stratis's Avatar
Jon Stratis Jon Stratis is offline
Electrical/Programming Mentor
FRC #2177 (The Robettes)
Team Role: Mentor
 
Join Date: Feb 2007
Rookie Year: 2006
Location: Minnesota
Posts: 3,738
Jon Stratis has a reputation beyond reputeJon Stratis has a reputation beyond reputeJon Stratis has a reputation beyond reputeJon Stratis has a reputation beyond reputeJon Stratis has a reputation beyond reputeJon Stratis has a reputation beyond reputeJon Stratis has a reputation beyond reputeJon Stratis has a reputation beyond reputeJon Stratis has a reputation beyond reputeJon Stratis has a reputation beyond reputeJon Stratis has a reputation beyond repute
Re: Limit Swtich Help

You need to use "==" inside of an if statement to get a Boolean. A single "=" is an assignment operation and won't do what you want it to do.
__________________
2007 - Present: Mentor, 2177 The Robettes
LRI: North Star 2012-2016; Lake Superior 2013-2014; MN State Tournament 2013-2014, 2016; Galileo 2016; Iowa 2017
2015: North Star Regional Volunteer of the Year
2016: Lake Superior WFFA
Reply With Quote
  #3   Spotlight this post!  
Unread 04-02-2015, 17:38
curtis0gj curtis0gj is offline
Registered User
FRC #5033 (Beavertronics)
Team Role: Programmer
 
Join Date: Jan 2015
Rookie Year: 2015
Location: Canada
Posts: 121
curtis0gj will become famous soon enough
Re: Limit Swtich Help

Quote:
Originally Posted by Jon Stratis View Post
You need to use "==" inside of an if statement to get a Boolean. A single "=" is an assignment operation and won't do what you want it to do.
No luck with that but I did make those changes.
Reply With Quote
  #4   Spotlight this post!  
Unread 04-02-2015, 17:39
Ether's Avatar
Ether Ether is offline
systems engineer (retired)
no team
 
Join Date: Nov 2009
Rookie Year: 1969
Location: US
Posts: 8,043
Ether has a reputation beyond reputeEther has a reputation beyond reputeEther has a reputation beyond reputeEther has a reputation beyond reputeEther has a reputation beyond reputeEther has a reputation beyond reputeEther has a reputation beyond reputeEther has a reputation beyond reputeEther has a reputation beyond reputeEther has a reputation beyond reputeEther has a reputation beyond repute
Re: Limit Swtich Help

Quote:
A single "=" is an assignment operation and won't do what you want it to do.
True. (Hey, a little Boolean humor there).

Quote:
Originally Posted by Jon Stratis View Post
You need to use "==" inside of an if statement to get a Boolean.
You don't need "==" to return a Boolean: a single "=" inside an if() statement will indeed return a Boolean. But as you said above, not what the OP was expecting.

If you already have an appropriately-named Boolean variable, you can cleanly code it by simply testing the variable:

if (limitPressed) {...}


Reply With Quote
  #5   Spotlight this post!  
Unread 04-02-2015, 18:12
curtis0gj curtis0gj is offline
Registered User
FRC #5033 (Beavertronics)
Team Role: Programmer
 
Join Date: Jan 2015
Rookie Year: 2015
Location: Canada
Posts: 121
curtis0gj will become famous soon enough
Re: Limit Swtich Help

Quote:
Originally Posted by Ether View Post
True. (Hey, a little Boolean humor there).



You don't need "==" to return a Boolean: a single "=" inside an if() statement will indeed return a Boolean. But as you said above, not what the OP was expecting.

If you already have an appropriately-named Boolean variable, you can cleanly code it by simply testing the variable:

if (limitPressed) {...}


So I will keep my if statements to one =. The limit switch is still not working here is a link for a picture of it. http://imgur.com/nRB3VqN. We used ground and signal from our pwm and it goes to DIO 4.
Reply With Quote
  #6   Spotlight this post!  
Unread 04-02-2015, 18:15
Ether's Avatar
Ether Ether is offline
systems engineer (retired)
no team
 
Join Date: Nov 2009
Rookie Year: 1969
Location: US
Posts: 8,043
Ether has a reputation beyond reputeEther has a reputation beyond reputeEther has a reputation beyond reputeEther has a reputation beyond reputeEther has a reputation beyond reputeEther has a reputation beyond reputeEther has a reputation beyond reputeEther has a reputation beyond reputeEther has a reputation beyond reputeEther has a reputation beyond reputeEther has a reputation beyond repute
Re: Limit Swtich Help

Quote:
Originally Posted by curtis0gj View Post
So I will keep my if statements to one =.
You did not read my post very carefully.


Reply With Quote
  #7   Spotlight this post!  
Unread 04-02-2015, 18:19
curtis0gj curtis0gj is offline
Registered User
FRC #5033 (Beavertronics)
Team Role: Programmer
 
Join Date: Jan 2015
Rookie Year: 2015
Location: Canada
Posts: 121
curtis0gj will become famous soon enough
Re: Limit Swtich Help

Quote:
Originally Posted by Ether View Post
You did not read my post very carefully.


Oh sorry I miss read that reply I understand now, my bad
Reply With Quote
  #8   Spotlight this post!  
Unread 04-02-2015, 18:50
Jon Stratis's Avatar
Jon Stratis Jon Stratis is offline
Electrical/Programming Mentor
FRC #2177 (The Robettes)
Team Role: Mentor
 
Join Date: Feb 2007
Rookie Year: 2006
Location: Minnesota
Posts: 3,738
Jon Stratis has a reputation beyond reputeJon Stratis has a reputation beyond reputeJon Stratis has a reputation beyond reputeJon Stratis has a reputation beyond reputeJon Stratis has a reputation beyond reputeJon Stratis has a reputation beyond reputeJon Stratis has a reputation beyond reputeJon Stratis has a reputation beyond reputeJon Stratis has a reputation beyond reputeJon Stratis has a reputation beyond reputeJon Stratis has a reputation beyond repute
Re: Limit Swtich Help

Ok, some analysis of the logic.

First, the only place you set limitPressed to false is at the very beginning. by having
Code:
            if(limit.get()) {
            	
            	limitPressed = true;
            	
            }
in operatorControl, this means that once the limit switch is pressed, limitPressed will ALWAYS be true - there is nothing to set it to false later.

Also, there is an interesting case where you hit the limit switch, so you set them to 0, but if you're still holding button 4 you then immediately set them to 1. What happens is you start to quickly oscillate between setting the motors to 0 and 1 as long as both button 4 and the limit switch is pressed.

Now, a note about how limit switches work (I'm afraid I can't view the picture from where I am... it's blocked by the school's connection). There are two ways to wire them, and they act exactly opposite in code. If you wire signal and ground to the common/normally open connectors, the switch will be TRUE when not touched, and FALSE when pressed. Connect between the common/normally closed connectors, and it operates the other way.

So, here's some code that should help:

Code:
//ensure that limitPressed is true only when the limit switch is pressed
limitPressed = limit.get();

//output the value of limitPressed so we can verify proper functionality of the limit switch
System.out.println(“limitPressed=“ + limitPressed);


//if we hit the limit switch, stop all motion
if (limitPressed)
{
	victor1.set(0);
	victor2.set(0);
}
//otherwise, if we hit button 4 move forward
else if (xbox.getRawButton(4))
{
	victor1.set(1);
	victor2.set(1);
}
//otherwise, if we aren’t pressing anything don’t move.
else 
{
	victor1.set(0);
	victor2.set(0);
}
This code only works to power the motors in a single direction, with the assumption that moving in that direction will trigger the limit switch. Without knowing the exact setup, I can't be sure about powering in both directions and stopping at both limits... I'll leave the other direction up to you.

Note a couple of things in the code:

First, I'm writing the value of the limitPressed variable to the console. This will let you look in the RIOLog to see what it is at all times - before moving anything, try manually pressing it and see how the value changes. You want to make sure this works before doing anything else!

Next, ALL of the controls for the motors are contained in a single if/else-if block. This means that only one of them will be active at a time. The default state (the final else) is to stop the motors - if you aren't touching anything, they'll stop. The limit switch control comes first to ensure that, if the limit switch is pressed, it absolutely doesn't move.

Give that a try, see if it helps, and see if you can figure out the other direction from there!
__________________
2007 - Present: Mentor, 2177 The Robettes
LRI: North Star 2012-2016; Lake Superior 2013-2014; MN State Tournament 2013-2014, 2016; Galileo 2016; Iowa 2017
2015: North Star Regional Volunteer of the Year
2016: Lake Superior WFFA
Reply With Quote
  #9   Spotlight this post!  
Unread 04-02-2015, 21:27
curtis0gj curtis0gj is offline
Registered User
FRC #5033 (Beavertronics)
Team Role: Programmer
 
Join Date: Jan 2015
Rookie Year: 2015
Location: Canada
Posts: 121
curtis0gj will become famous soon enough
Re: Limit Swtich Help

Quote:
Originally Posted by Jon Stratis View Post
Ok, some analysis of the logic.

First, the only place you set limitPressed to false is at the very beginning. by having
Code:
            if(limit.get()) {
            	
            	limitPressed = true;
            	
            }
in operatorControl, this means that once the limit switch is pressed, limitPressed will ALWAYS be true - there is nothing to set it to false later.

Also, there is an interesting case where you hit the limit switch, so you set them to 0, but if you're still holding button 4 you then immediately set them to 1. What happens is you start to quickly oscillate between setting the motors to 0 and 1 as long as both button 4 and the limit switch is pressed.

Now, a note about how limit switches work (I'm afraid I can't view the picture from where I am... it's blocked by the school's connection). There are two ways to wire them, and they act exactly opposite in code. If you wire signal and ground to the common/normally open connectors, the switch will be TRUE when not touched, and FALSE when pressed. Connect between the common/normally closed connectors, and it operates the other way.

So, here's some code that should help:

Code:
//ensure that limitPressed is true only when the limit switch is pressed
limitPressed = limit.get();

//output the value of limitPressed so we can verify proper functionality of the limit switch
System.out.println(“limitPressed=“ + limitPressed);


//if we hit the limit switch, stop all motion
if (limitPressed)
{
	victor1.set(0);
	victor2.set(0);
}
//otherwise, if we hit button 4 move forward
else if (xbox.getRawButton(4))
{
	victor1.set(1);
	victor2.set(1);
}
//otherwise, if we aren’t pressing anything don’t move.
else 
{
	victor1.set(0);
	victor2.set(0);
}
This code only works to power the motors in a single direction, with the assumption that moving in that direction will trigger the limit switch. Without knowing the exact setup, I can't be sure about powering in both directions and stopping at both limits... I'll leave the other direction up to you.

Note a couple of things in the code:

First, I'm writing the value of the limitPressed variable to the console. This will let you look in the RIOLog to see what it is at all times - before moving anything, try manually pressing it and see how the value changes. You want to make sure this works before doing anything else!

Next, ALL of the controls for the motors are contained in a single if/else-if block. This means that only one of them will be active at a time. The default state (the final else) is to stop the motors - if you aren't touching anything, they'll stop. The limit switch control comes first to ensure that, if the limit switch is pressed, it absolutely doesn't move.

Give that a try, see if it helps, and see if you can figure out the other direction from there!
Thank you so much, our team has been struggling along in the programming department this year mostly because I am the only programmer and it is my first year programming in java. But this is a great help and I think I will be far more confident when using booleans in the future. I will post an update tomorrow afternoon regarding the limit switch status, thanks!
Reply With Quote
  #10   Spotlight this post!  
Unread 04-02-2015, 22:15
curtis0gj curtis0gj is offline
Registered User
FRC #5033 (Beavertronics)
Team Role: Programmer
 
Join Date: Jan 2015
Rookie Year: 2015
Location: Canada
Posts: 121
curtis0gj will become famous soon enough
Re: Limit Swtich Help

I have setup the limit switch program with the suggestions but I am attempting to setup reverse for the victors. Also I am trying to setup the same if statement layout for my relays does this look okay?
Code:
public class Robot extends SampleRobot {
    RobotDrive robot;
    Joystick stick;
    Joystick xbox;
    Relay spike1;
    Relay spike2;
    Victor victor1;
    Victor victor2;
    DigitalInput limit;
    boolean limitPressed = false;

    public Robot() {
    	robot = new RobotDrive(0, 1);
        stick = new Joystick(1);
        xbox = new Joystick(0);
        spike1 = new Relay(0);
        spike2 = new Relay(1);
        limit = new DigitalInput(4);
        victor1 = new Victor(4);
        victor2 = new Victor(5);
    }
    public void operatorControl() {
    	
    	while (isOperatorControl() && isEnabled()) {
            stick.getThrottle();
            robot.arcadeDrive(stick.getY(), stick.getX());
            limitPressed = limit.get(); //Do I want this out side of my while operator control loop?
            System.out.println("limitPressed=" + limitPressed); //Read the RoboRIO log for some values before you go all out on your motors.
            
            if(limitPressed) {
            	victor1.set(0);
            	victor2.set(0);
            } else if (xbox.getRawButton(4)) {
            	victor1.set(1);
            	victor2.set(1);
            } else {
            	victor1.set(0);
            	victor1.set(0);
            }
            if(xbox.getRawButton(1)) {
            	victor1.set(-1);
            	victor1.set(-1);
            } else {
            	victor1.set(0);
            	victor2.set(0);
            }
            if(xbox.getRawButton(3)) {
            	spike1.set(Relay.Value.kForward);
            	spike2.set(Relay.Value.kForward);
            } else {
            	spike1.set(Relay.Value.kOff);
            	spike2.set(Relay.Value.kOff);            	
            }
            if(xbox.getRawButton(2)) {
            	spike1.set(Relay.Value.kReverse);
            	spike2.set(Relay.Value.kReverse);	
            } else {
            	spike1.set(Relay.Value.kOff);
            	spike2.set(Relay.Value.kOff);
            }    
    	}
    }
Reply With Quote
  #11   Spotlight this post!  
Unread 04-02-2015, 22:21
mmaunu's Avatar
mmaunu mmaunu is offline
Registered User
FRC #2485 (W.A.R. Lords)
Team Role: Mentor
 
Join Date: Mar 2013
Rookie Year: 2010
Location: San Diego, CA
Posts: 87
mmaunu is a jewel in the roughmmaunu is a jewel in the roughmmaunu is a jewel in the roughmmaunu is a jewel in the rough
Re: Limit Swtich Help

Quote:
Originally Posted by curtis0gj View Post
I have setup...
Code:
public class Robot extends SampleRobot {
    
            if(limitPressed) {
            	victor1.set(0);
            	victor2.set(0);
            } else if (xbox.getRawButton(4)) {
            	victor1.set(1);
            	victor2.set(1);
            } else {
            	victor1.set(0);
            	victor1.set(0);
            }
            if(xbox.getRawButton(1)) {
            	victor1.set(-1);
            	victor1.set(-1);
            } else {
A quick glance (I'll look longer later) shows that you have set victor1 twice in several places when you should be setting victor1 and victor2.

Ether: I have learned so much from reading your posts and papers over the years. I didn't intend to sound like I was correcting your post but merely adding explicit context for other readers.
__________________
2014 Las Vegas (Winners with 987, 2478; Excellence in Engineering)
2014 San Diego (Finalists with 987, 3250; Quality Award)
2013 Inland Empire (Winners with 1538, 968; Excellence in Engineering Award)
2013 San Diego (Finalists with 2984, 4322; Creativity Award)
2012 Las Vegas (Finalists with 2034, 3187; Quality Award)
Reply With Quote
  #12   Spotlight this post!  
Unread 04-02-2015, 22:26
curtis0gj curtis0gj is offline
Registered User
FRC #5033 (Beavertronics)
Team Role: Programmer
 
Join Date: Jan 2015
Rookie Year: 2015
Location: Canada
Posts: 121
curtis0gj will become famous soon enough
Re: Limit Swtich Help

Quote:
Originally Posted by mmaunu View Post
A quick glance (I'll look longer later) shows that you have set victor1 twice in several places when you should be setting victor1 and victor2.
Woops I will fix that up thanks.
Reply With Quote
  #13   Spotlight this post!  
Unread 04-02-2015, 22:42
cstelter cstelter is offline
Programming Mentor
AKA: Craig Stelter
FRC #3018 (Nordic Storm)
Team Role: Mentor
 
Join Date: Apr 2012
Rookie Year: 2012
Location: Mankato, MN
Posts: 77
cstelter will become famous soon enough
Re: Limit Swtich Help

Quote:
Originally Posted by mmaunu View Post
Ether: I have learned so much from reading your posts and papers over the years. I didn't intend to sound like I was correcting your post but merely adding explicit context for other readers.
I for one appreciated the post. As a C/C++ guy who only recently has been using java (and only WRT FRC), I would have expected

Code:
int x=0;
if(x=8)
{
}
to compile fine. I didn't realize the if statement was strongly typed to boolean in java (kind of would have expected it to be overloaded to many types or that there may be some sort of implicit conversion of int to boolean that would happen transparently.)

Of course had I tried to code it, eclipse/netbeans/whatever would have let me know I was wrong long before I tried compile.

Reminds me of the most 'duh' moment I ever had that IDE's don't tend to flag for us yet. I had coded something along the lines of

int x=0;
...
if(x==4 && something_else==2 && something_else==some_other_thing);
{
//some stuff to do
}

It took me the longest time to figure out why I kept entering the if clause even though I was nearly 100% certain that x was *not* 4 and thus the hypothesis should evaluate to false. Finally I put in a sanity check to print x and confirmed that I was right (x was not 4 and the full expression for the if evaluated to false). Only then was I able to see the error of my ways...

sorry to send this slightly off topic.... I did appreciate the points made thoug.
Reply With Quote
  #14   Spotlight this post!  
Unread 04-02-2015, 22:49
Ether's Avatar
Ether Ether is offline
systems engineer (retired)
no team
 
Join Date: Nov 2009
Rookie Year: 1969
Location: US
Posts: 8,043
Ether has a reputation beyond reputeEther has a reputation beyond reputeEther has a reputation beyond reputeEther has a reputation beyond reputeEther has a reputation beyond reputeEther has a reputation beyond reputeEther has a reputation beyond reputeEther has a reputation beyond reputeEther has a reputation beyond reputeEther has a reputation beyond reputeEther has a reputation beyond repute
Re: Limit Swtich Help

Quote:
Originally Posted by mmaunu View Post
Ether: I have learned so much from reading your posts and papers over the years. I didn't intend to sound like I was correcting your post but merely adding explicit context for other readers.
Understood. The additional explanation you provided was appropriate and useful. Reps :-)



Last edited by Ether : 04-02-2015 at 22:55.
Reply With Quote
  #15   Spotlight this post!  
Unread 04-02-2015, 22:58
Jon Stratis's Avatar
Jon Stratis Jon Stratis is offline
Electrical/Programming Mentor
FRC #2177 (The Robettes)
Team Role: Mentor
 
Join Date: Feb 2007
Rookie Year: 2006
Location: Minnesota
Posts: 3,738
Jon Stratis has a reputation beyond reputeJon Stratis has a reputation beyond reputeJon Stratis has a reputation beyond reputeJon Stratis has a reputation beyond reputeJon Stratis has a reputation beyond reputeJon Stratis has a reputation beyond reputeJon Stratis has a reputation beyond reputeJon Stratis has a reputation beyond reputeJon Stratis has a reputation beyond reputeJon Stratis has a reputation beyond reputeJon Stratis has a reputation beyond repute
Re: Limit Swtich Help

Quote:
Originally Posted by curtis0gj View Post
I have setup the limit switch program with the suggestions but I am attempting to setup reverse for the victors. Also I am trying to setup the same if statement layout for my relays does this look okay?
Code:
public class Robot extends SampleRobot {
    RobotDrive robot;
    Joystick stick;
    Joystick xbox;
    Relay spike1;
    Relay spike2;
    Victor victor1;
    Victor victor2;
    DigitalInput limit;
    boolean limitPressed = false;

    public Robot() {
    	robot = new RobotDrive(0, 1);
        stick = new Joystick(1);
        xbox = new Joystick(0);
        spike1 = new Relay(0);
        spike2 = new Relay(1);
        limit = new DigitalInput(4);
        victor1 = new Victor(4);
        victor2 = new Victor(5);
    }
    public void operatorControl() {
    	
    	while (isOperatorControl() && isEnabled()) {
            stick.getThrottle();
            robot.arcadeDrive(stick.getY(), stick.getX());
            limitPressed = limit.get(); //Do I want this out side of my while operator control loop?
            System.out.println("limitPressed=" + limitPressed); //Read the RoboRIO log for some values before you go all out on your motors.
            
            if(limitPressed) {
            	victor1.set(0);
            	victor2.set(0);
            } else if (xbox.getRawButton(4)) {
            	victor1.set(1);
            	victor2.set(1);
            } else {
            	victor1.set(0);
            	victor1.set(0);
            }
            if(xbox.getRawButton(1)) {
            	victor1.set(-1);
            	victor1.set(-1);
            } else {
            	victor1.set(0);
            	victor2.set(0);
            }
            if(xbox.getRawButton(3)) {
            	spike1.set(Relay.Value.kForward);
            	spike2.set(Relay.Value.kForward);
            } else {
            	spike1.set(Relay.Value.kOff);
            	spike2.set(Relay.Value.kOff);            	
            }
            if(xbox.getRawButton(2)) {
            	spike1.set(Relay.Value.kReverse);
            	spike2.set(Relay.Value.kReverse);	
            } else {
            	spike1.set(Relay.Value.kOff);
            	spike2.set(Relay.Value.kOff);
            }    
    	}
    }
The relays look good. In addition to double victor1's which have already been pointed out, consider the effect of pushing buttons 1 and 4 at the same time - you'll oscillate between full speed forward and full speed reverse. It's probably not a big deal, as your driver shouldn't be pushing them both at the same time anyways, but I personally like to prevent that sort of situation. Using some fairly simple logic, you can reduce everything dealing with the victors to a single if/else-if/else block. Something like:
Code:
if ()//the conditions you want it to go up
{
    //go up
}
else if ()//the conditions you want it to go down
{
    //go down
}
else
{
    //stop
}
You can set up the conditionals using the AND (&&) operator, the OR (||) operator, and the not (!). For example, to say "when button 4 is pressed and the limit switch is not pressed", you would do "xbox.getRawButton(4) || !limitPressed". Figuring out how to use logic like this is a very powerful tool while programming!
__________________
2007 - Present: Mentor, 2177 The Robettes
LRI: North Star 2012-2016; Lake Superior 2013-2014; MN State Tournament 2013-2014, 2016; Galileo 2016; Iowa 2017
2015: North Star Regional Volunteer of the Year
2016: Lake Superior WFFA
Reply With Quote
Reply


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


All times are GMT -5. The time now is 11:43.

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