OI LEDs

Hi, team 1153 has been trying to get our OI LEDs, Pwm1_green, Pwm1_red, Relay1_green etc., to work when a button is pressed.

We have tried many various solutions but the only lights we could get to work properly in Manual mode was the Switch LEDS. The only light we get on in Manual is Pwm1_green and whenever the aux1 button is pressed on the Port 1 joystick will it change and it changes in a type of bianary going from green to red to green and red to pwm2_green and etc in that order. We have a feeling that the code causing the OI to work under that system is interferring with our code but we couldn’t find it anywhere in the code. If you could please help us get the Red LEDs to work, it would be greatly appreciated. Here is our code in question if it will help:


   if      (p4_sw_trig == 1)  {ElevW= 0; DesiredHeight=   0; }  //Lowest
   else if (p4_sw_top  == 1)  {ElevW= 1; DesiredHeight=  20; }  //Medium
   else if (p4_sw_aux1 == 1)  {ElevW= 2; DesiredHeight=  50; }  //High
   else if (p4_sw_aux2 == 1)  {ElevW= 3; DesiredHeight= 100; }  //Very High

      if (ElevW == 0)
      { 
          //printf("ELEVW=0
\r");
          Pwm1_red = 1;           //Pwm1_red LED is on
          Pwm1_green= Pwm2_green= Pwm2_red= Relay1_green= 0; // LEDs off
          Relay1_red= Relay2_green= Relay2_red= 0; //LEDs off	
      }
      else if (ElevW == 1)
      {
          //printf("ELEVW=1
\r"); 
          Pwm2_red  = 1;          //Pwm2_red LED is on
          Pwm1_green= Pwm1_red= Pwm2_green= Relay1_green= 0; // LEDs off
          Relay1_red= Relay2_green= Relay2_red= 0; //LEDs off	
      }
      else if (ElevW == 2)
      { 
          //printf("ELEVW=2
\r");
          Relay1_red  = 1;  // Relay1_red LED is on
          Pwm1_green= Pwm1_red= Pwm2_green= Pwm2_red= 0;  //LEDs off
          Relay1_green= Relay2_green= Relay2_red= 0;   //LEDS off	
      }
      else if (ElevW == 3)
      {
          //printf("ELEVW=3
\r");
          Relay2_red  = 1;  //Relay2_red LED is on
          Pwm1_green= Pwm1_red= Pwm2_green= Pwm2_red= 0; //LEDs off
          Relay1_green= Relay1_red= Relay2_green= 0;	 //LEDs off
      }

By using the printfs we are sure the code is working as it prints out the numbers and if we switch the LEDs to the Switch LEDs they will change also. Any help is greatly appreciated.

From IFI docs on the software/OI

User Mode
Bit 5 of rc_mode_byte (aliased as user_display_mode) indicates when the user selects the
“User Mode” on the OI. In “User Mode”, user_display_mode is set to 1. When the user selects
channel, team number, or voltage, user_display_mode is set to 0. When in “User Mode”, Robot
Feedback LEDs are turned off and the value stored in txdata.LED_byte1.data is displayed on the
multi-segment display on the Operator Interface. By default this is set to the value of the backup
battery. “User Mode” is identified by the letter “u” in the left digit of the display on the Operator
Interface.

So make sure the OI display is not showing “u000” in the OI-4 digit display. This is changed with the “Select” button on the OI.

Also, the LED byte in the txdata packet is shared:



#define User_Mode_byte  txdata.LED_byte1.data

#define Pwm1_green      txdata.LED_byte1.bitselect.bit0
#define Pwm1_red        txdata.LED_byte1.bitselect.bit1 
#define Pwm2_green      txdata.LED_byte1.bitselect.bit2
#define Pwm2_red        txdata.LED_byte1.bitselect.bit3 
#define Relay1_red      txdata.LED_byte1.bitselect.bit4 
#define Relay1_green    txdata.LED_byte1.bitselect.bit5
#define Relay2_red      txdata.LED_byte1.bitselect.bit6 
#define Relay2_green    txdata.LED_byte1.bitselect.bit7


Make sure no one is clearing or setting User_Mode_byte after you setup the LEDs.

Thank you very much for your help. We had User_Mode_byte set to our autonomous selector to show which autonomous code we were running. It seems odd that we can only do lights or user number. Do you know of any way to display the lights and the user number on the OI display?

when you use the LED control pins in port 1 and 3…

a 1 is off
and a 0 is on for the external led the pins are “ground” you will need to wire up a power and get some resistors on it as well

Although you can’t display both simultaneously, you can select between them. The OI sends back to the user processor which mode is being displayed in the rxdata packet.

For example:


ifi_aliases.h:311: #define user_display_mode   rxdata.rc_mode_byte.mode.user_display


  if (user_display_mode == 0) /* User Mode is Off */
  {
       set LED code
   }

:
.
{somewhere else in the code}
   if (user_display_mode == 1) /* User Mode is On */
  {
       User_Mode_byte = autonomous selectore
   }


Then the operator can choose which to look at using the selector button on the OI. The code they will send back when the operator is interested in looking at.