LEGO Mindstorms EV3


IR Control Source Code

//**********************************************************************
define appv 'IR Control V1.02'                                        //
//**********************************************************************
                                                                      //
define    MOTORL      0x02                                            //
define    MOTORR      0x04                                            //
define    MOTORLR     0x06                                            //
                                                                      //
define    MOTORA      0x01                                            //
define    MOTORD      0x08                                            //
define    MOTORAD     0x09                                            //
                                                                      //
define    MOTORALL    0x0F                                            //
                                                                      //
define    FWD_POWER   100                                             //
define    BWD_POWER   -100                                            //
                                                                      //
define    IR_PORT     3                                               //
define    IR_TYPE     33                                              //
define    IR_MODE     2                                               //
                                                                      //
define    TIMEOUT     1000                                            //
                                                                      //
DATA32    Timer                                                       //    Timer used for timeout if no IR
DATA8     Update                                                      //
                                                                      //
DATA8     Select                                                      //
DATA8     LeftPower                                                   //
DATA8     RightPower                                                  //
DATA8     OldLeftPower                                                //
DATA8     OldRightPower                                               //
DATA8     PowerA                                                      //
DATA8     PowerD                                                      //
DATA8     OldPowerA                                                   //
DATA8     OldPowerD                                                   //
                                                                      //
// MAIN ************************************************************************************************
                                                                      //
                                                                      //
vmthread  MAIN                                                        //  void MAIN(void)
{                                                                     //  {
  DATA8   Run                                                         //
  DATA8   State                                                       //
  DATA8   ShowVersion                                                 //
                                                                      //
  UI_BUTTON(PRESSED,RIGHT_BUTTON,ShowVersion)                         //    UI_BUTTON(PRESSED,RIGHT_BUTTON,ShowVersion)
  JR_FALSE(ShowVersion,DontShowVersion)                               //    if (ShowVersion)
                                                                      //    {
  UI_DRAW(FILLRECT,BG_COLOR,4,50,170,28)                              //      UI_DRAW(FILLRECT,BG_COLOR,4,50,170,28)
  UI_DRAW(RECT,FG_COLOR,6,52,166,24)                                  //      UI_DRAW(RECT,FG_COLOR,6,52,166,24)
  UI_DRAW(TEXT,FG_COLOR,13,60,appv)                                   //      UI_DRAW(TEXT,FG_COLOR,13,60,appv)
  UI_DRAW(UPDATE)                                                     //      UI_DRAW(UPDATE)
                                                                      //
ShowVersionWait:                                                      //      do
                                                                      //      {  
  UI_BUTTON(PRESSED,RIGHT_BUTTON,ShowVersion)                         //        UI_BUTTON(PRESSED,RIGHT_BUTTON,ShowVersion)
                                                                      //      }
  JR_TRUE(ShowVersion,ShowVersionWait)                                //      while (ShowVersion)
                                                                      //
  UI_BUTTON(FLUSH)                                                    //      UI_BUTTON(FLUSH)
DontShowVersion:                                                      //    }  
                                                                      //
  UI_DRAW(RESTORE,0)                                                  //    UI_DRAW(RESTORE,0)
  UI_DRAW(TOPLINE,1)                                                  //    UI_DRAW(TOPLINE,1)
  UI_BUTTON(SET_BACK_BLOCK,1)                                         //    UI_BUTTON(SET_BACK_BLOCK,1)
  UI_WRITE(LED,LED_GREEN)                                             //    UI_WRITE(LED,LED_GREEN)
                                                                      //
  CALL(Init)                                                          //    Init()
                                                                      //
  MOVE8_8(1,Run)                                                      //    Run  =  1
                                                                      //
                                                                      //    do
Loop:                                                                 //    {
                                                                      //
  CALL(Ctrl)                                                          //      Ctrl()
                                                                      //
  UI_BUTTON(SHORTPRESS,BACK_BUTTON,State)                             //      UI_BUTTON(SHORTPRESS,BACK_BUTTON,State)
  JR_FALSE(State,NotBack)                                             //      if (State)
                                                                      //      {
  MOVE8_8(0,Run)                                                      //        Run  =  0
                                                                      //
NotBack:                                                              //      }
                                                                      //    }
  JR_TRUE(Run,Loop)                                                   //    while (Run)
                                                                      //
  CALL(Exit)                                                          //    Exit()
                                                                      //
  UI_BUTTON(SET_BACK_BLOCK,0)                                         //    UI_BUTTON(SET_BACK_BLOCK,0)
                                                                      //
  UI_BUTTON(FLUSH)                                                    //    UI_BUTTON(FLUSH)
}                                                                     //  }
                                                                      //
                                                                      //
// Init ************************************************************************************************
                                                                      //
                                                                      //
subcall   Init                                                        //  Init
{                                                                     //  {
  DATAF   DataF                                                       //
  DATA8   Type                                                        //    Sensor type
  DATA8   Mode                                                        //    Sensor mode
  DATA8   Tmp                                                         //    Temp variable
                                                                      //
  MOVE8_8(0,Select)                                                   //    Select      =  0
                                                                      //
  MOVE8_8(0,LeftPower)                                                //    LeftPower   =  0
  MOVE8_8(0,RightPower)                                               //    RightPower  =  0
  MOVE8_8(0,PowerA)                                                   //    PowerA      =  0
  MOVE8_8(0,PowerD)                                                   //    PowerD      =  0
                                                                      //
  OUTPUT_POWER(0,MOTORALL,0)                                          //    OUTPUT_POWER(0,MOTORALL,0)
                                                                      //
  CALL(UpdateScreen)                                                  //    UpdateScreen()                                                                      
                                                                      //
  TIMER_READ(Timer)                                                   //    TIMER_READ(Timer)
  MOVE8_8(1,Update)                                                   //    Update      =  1
}                                                                     //  }
                                                                      //
                                                                      //
// Ctrl ************************************************************************************************
                                                                      //
                                                                      //
subcall   Ctrl                                                        //  Ctrl
{                                                                     //  {
  DATA32  Time                                                        //    Time elapsed from last IR
  DATAF   Ch1                                                         //    Received channel 1 state
  DATAF   Ch2                                                         //    Received channel 2 state
  DATAF   Ch3                                                         //    Received channel 3 state
  DATAF   Ch4                                                         //    Received channel 4 state
  DATA8   State                                                       //    Button state
  DATA8   State0                                                      //    Active state 0
  DATA8   State1                                                      //    Active state 1
  DATA8   Type                                                        //    Sensor type
  DATA8   Mode                                                        //    Sensor mode
  DATA8   Tmp                                                         //    Temp variable
                                                                      //
  UI_BUTTON(SHORTPRESS,ENTER_BUTTON,State)                            //    UI_BUTTON(SHORTPRESS,ENTER_BUTTON,State)
  JR_FALSE(State,NotEnter)                                            //    if (State)
                                                                      //    {
  JR_TRUE(Select,ActSelect34)                                         //      if (!Select)
                                                                      //      {
  MOVE8_8(1,Select)                                                   //        Select  =  1
  MOVE8_8(1,Update)                                                   //        Update  =  1
                                                                      //
  JR(EndSelect34)                                                     //      }
                                                                      //      else
ActSelect34:                                                          //      {
  MOVE8_8(0,Select)                                                   //        Select  =  0
  MOVE8_8(1,Update)                                                   //        Update  =  1
                                                                      //
EndSelect34:                                                          //      }
NotEnter:                                                             //    }
                                                                      //
  INPUT_READ(0,IR_PORT,0,IR_MODE,Tmp)                                 //    INPUT_READ(0,IR_PORT,0,IR_MODE,Tmp)
  INPUT_DEVICE(GET_TYPEMODE,0,IR_PORT,Type,Mode)                      //    INPUT_DEVICE(GET_TYPEMODE,0,IR_PORT,Type,Mode)
  JR_NEQ8(Type,IR_TYPE,NoRemote)                                      //    if ((Type == IR_TYPE) &&
  JR_NEQ8(Mode,IR_MODE,NoRemote)                                      //        (Mode == IR_MODE))
                                                                      //    {
  INPUT_DEVICE(READY_SI,0,IR_PORT,0,IR_MODE,4,Ch1,Ch2,Ch3,Ch4)        //      INPUT_DEVICE(READY_SI,0,IR_PORT,0,IR_MODE,4,Ch1,Ch2,Ch3,Ch4)      
  OUTPUT_START(0,MOTORALL)                                            //      OUTPUT_START(0,MOTORALL)
                                                                      //
  JR_NEQ8(Select,0,Select1)                                           //      if (Select == 0)
Select0:                                                              //      {
                                                                      //
  MOVEF_8(Ch1,State0)                                                 //        State0  =  Ch1
  MOVEF_8(Ch2,State1)                                                 //        State1  =  Ch2
                                                                      //
  JR(SelectEnd)                                                       //      }
                                                                      //      else
Select1:                                                              //      {
                                                                      //
  MOVEF_8(Ch3,State0)                                                 //        State0  =  Ch3
  MOVEF_8(Ch4,State1)                                                 //        State1  =  Ch4
                                                                      //
SelectEnd:                                                            //      }
                                                                      //
  TIMER_READ(Timer)                                                   //      TIMER_READ(Timer)
  MOVE8_8(0,LeftPower)                                                //      LeftPower   =  0
  MOVE8_8(0,RightPower)                                               //      RightPower  =  0
  MOVE8_8(0,PowerA)                                                   //      PowerA      =  0
  MOVE8_8(0,PowerD)                                                   //      PowerD      =  0
                                                                      //
  JR_EQ8(State0,1,Yes1)                                               //      if ((State == 1) ||
  JR_EQ8(State0,5,Yes1)                                               //          (State == 5) ||
  JR_EQ8(State0,6,Yes1)                                               //          (State == 6))
  JR(Not1)                                                            //
                                                                      //
Yes1:                                                                 //      {
                                                                      //
  MOVE8_8(FWD_POWER,LeftPower)                                        //        LeftPower   =  FWD_POWER
                                                                      //
Not1:                                                                 //      }
                                                                      //
  JR_EQ8(State0,2,Yes2)                                               //      if ((State == 2) ||
  JR_EQ8(State0,7,Yes2)                                               //          (State == 7) ||
  JR_EQ8(State0,8,Yes2)                                               //          (State == 8))
  JR(Not2)                                                            //
                                                                      //
Yes2:                                                                 //      {
                                                                      //
  MOVE8_8(BWD_POWER,LeftPower)                                        //        LeftPower   =  BWD_POWER
                                                                      //
Not2:                                                                 //      }
                                                                      //
  JR_EQ8(State0,3,Yes3)                                               //      if ((State == 3) ||
  JR_EQ8(State0,5,Yes3)                                               //          (State == 5) ||
  JR_EQ8(State0,7,Yes3)                                               //          (State == 7))
  JR(Not3)                                                            //
                                                                      //
Yes3:                                                                 //      {
                                                                      //
  MOVE8_8(FWD_POWER,RightPower)                                       //        RightPower  =  FWD_POWER
                                                                      //
Not3:                                                                 //      }
                                                                      //
  JR_EQ8(State0,4,Yes4)                                               //      if ((State == 4) ||
  JR_EQ8(State0,6,Yes4)                                               //          (State == 6) ||
  JR_EQ8(State0,8,Yes4)                                               //          (State == 8))
  JR(Not4)                                                            //
                                                                      //
Yes4:                                                                 //      {
                                                                      //
  MOVE8_8(BWD_POWER,RightPower)                                       //        RightPower  =  BWD_POWER
                                                                      //
Not4:                                                                 //      }
                                                                      //
  JR_EQ8(State1,1,Yes21)                                              //      if ((State == 1) ||
  JR_EQ8(State1,5,Yes21)                                              //          (State == 5) ||
  JR_EQ8(State1,6,Yes21)                                              //          (State == 6))
  JR(Not21)                                                           //
                                                                      //
Yes21:                                                                //      {
                                                                      //
  MOVE8_8(FWD_POWER,PowerA)                                           //        PowerA   =  FWD_POWER
                                                                      //
Not21:                                                                //      }
                                                                      //
  JR_EQ8(State1,2,Yes22)                                              //      if ((State == 2) ||
  JR_EQ8(State1,7,Yes22)                                              //          (State == 7) ||
  JR_EQ8(State1,8,Yes22)                                              //          (State == 8))
  JR(Not22)                                                           //
                                                                      //
Yes22:                                                                //      {
                                                                      //
  MOVE8_8(BWD_POWER,PowerA)                                           //        PowerA   =  BWD_POWER
                                                                      //
Not22:                                                                //      }
                                                                      //
  JR_EQ8(State1,3,Yes23)                                              //      if ((State == 3) ||
  JR_EQ8(State1,5,Yes23)                                              //          (State == 5) ||
  JR_EQ8(State1,7,Yes23)                                              //          (State == 7))
  JR(Not23)                                                           //
                                                                      //
Yes23:                                                                //      {
                                                                      //
  MOVE8_8(FWD_POWER,PowerD)                                           //        PowerD   =  FWD_POWER
                                                                      //
Not23:                                                                //      }
                                                                      //
  JR_EQ8(State1,4,Yes24)                                              //      if ((State == 4) ||
  JR_EQ8(State1,6,Yes24)                                              //          (State == 6) ||
  JR_EQ8(State1,8,Yes24)                                              //          (State == 8))
  JR(Not24)                                                           //
                                                                      //
Yes24:                                                                //      {
                                                                      //
  MOVE8_8(BWD_POWER,PowerD)                                           //        PowerD   =  BWD_POWER
                                                                      //
Not24:                                                                //      }
                                                                      //
  TIMER_READ(Time)                                                    //      TIMER_READ(Time)
  SUB32(Time,Timer,Time)                                              //      Time -=  Timer
  JR_LTEQ32(Time,TIMEOUT,NoTimeout)                                   //      if (Time > TIMEOUT)
                                                                      //      {
                                                                      //
  MOVE8_8(0,LeftPower)                                                //        LeftPower   =  0
  MOVE8_8(0,RightPower)                                               //        RightPower  =  0
  MOVE8_8(0,PowerA)                                                   //        PowerA      =  0
  MOVE8_8(0,PowerD)                                                   //        PowerD      =  0
                                                                      //
NoTimeout:                                                            //      }
  JR(EndRemote)                                                       //    }
                                                                      //    else
NoRemote:                                                             //    {
  MOVE8_8(0,LeftPower)                                                //      LeftPower   =  0
  MOVE8_8(0,RightPower)                                               //      RightPower  =  0
  MOVE8_8(0,PowerA)                                                   //      PowerA      =  0
  MOVE8_8(0,PowerD)                                                   //      PowerD      =  0
  OUTPUT_STOP(0,MOTORALL,0)                                           //      OUTPUT_STOP(0,MOTORALL,0)
                                                                      //
EndRemote:                                                            //    }
                                                                      //
  JR_EQ8(LeftPower,OldLeftPower,NoLeftChange)                         //    if (OldLeftPower != LeftPower)
                                                                      //    {
  MOVE8_8(LeftPower,OldLeftPower)                                     //      OldLeftPower    =  LeftPower
  OUTPUT_POWER(0,MOTORL,LeftPower)                                    //      OUTPUT_POWER(0,MOTORL,LeftPower)
  MOVE8_8(1,Update)                                                   //      Update          =  1
                                                                      //
NoLeftChange:                                                         //    }
                                                                      //
  JR_EQ8(RightPower,OldRightPower,NoRightChange)                      //    if (OldRightPower != RightPower)
                                                                      //    {
  MOVE8_8(RightPower,OldRightPower)                                   //      OldRightPower   =  RightPower
  OUTPUT_POWER(0,MOTORR,RightPower)                                   //      OUTPUT_POWER(0,MOTORR,RightPower)
  MOVE8_8(1,Update)                                                   //      Update          =  1
                                                                      //
NoRightChange:                                                        //    }
                                                                      //
  JR_EQ8(PowerA,OldPowerA,NoAChange)                                  //    if (OldPowerA != PowerA)
                                                                      //    {
  MOVE8_8(PowerA,OldPowerA)                                           //      OldPowerA   =  PowerA
  OUTPUT_POWER(0,MOTORA,PowerA)                                       //      OUTPUT_POWER(0,MOTORA,PowerA)
  MOVE8_8(1,Update)                                                   //      Update          =  1
                                                                      //
NoAChange:                                                            //    }
                                                                      //
  JR_EQ8(PowerD,OldPowerD,NoDChange)                                  //    if (OldPowerD != PowerD)
                                                                      //    {
  MOVE8_8(PowerD,OldPowerD)                                           //      OldPowerD   =  PowerD
  OUTPUT_POWER(0,MOTORD,PowerD)                                       //      OUTPUT_POWER(0,MOTORD,PowerD)
  MOVE8_8(1,Update)                                                   //      Update          =  1
                                                                      //
NoDChange:                                                            //    }
                                                                      //
  JR_FALSE(Update,NoUpdate)                                           //    if (Update)
                                                                      //    {
  CALL(UpdateScreen)                                                  //      UpdateScreen()                                                                      
  MOVE8_8(0,Update)                                                   //      Update  =  0
                                                                      //
NoUpdate:                                                             //    }
}                                                                     //  }
                                                                      //
                                                                      //
// UpdateScreen ****************************************************************************************
                                                                      //
                                                                      //
subcall   UpdateScreen                                                //  void UpdateScreen(void)
{                                                                     //  {
  DATA8   Tmp                                                         //
                                                                      //
  UI_DRAW(FILLWINDOW,BG_COLOR,TOPLINE_HEIGHT,0)                       //      UI_DRAW(FILLWINDOW,BG_COLOR,TOPLINE_HEIGHT,0)
                                                                      //
  JR_TRUE(Select,Select34)                                            //      if (!Select)
                                                                      //      {
  UI_DRAW(BMPFILE,FG_COLOR,0,17,'IRCtl12')                            //        UI_DRAW(BMPFILE,FG_COLOR,0,17,'IRCtl12')
                                                                      //
  JR(EndSelect)                                                       //      }
                                                                      //      else
Select34:                                                             //      {
                                                                      //
  UI_DRAW(BMPFILE,FG_COLOR,0,17,'IRCtl34')                            //        UI_DRAW(BMPFILE,FG_COLOR,0,17,'IRCtl34')
                                                                      //
EndSelect:                                                            //      }
                                                                      //
  JR_EQ8(LeftPower,0,NoLeftPower)                                     //      if (LeftPower != 0)
                                                                      //      {
  UI_DRAW(INVERSERECT,51,18,34,15)                                    //        UI_DRAW(INVERSERECT,51,18,34,15)
                                                                      //
NoLeftPower:                                                          //      }
                                                                      //
  JR_EQ8(RightPower,0,NoRightPower)                                   //      if (RightPower != 0)
                                                                      //      {
  UI_DRAW(INVERSERECT,91,18,34,15)                                    //        UI_DRAW(INVERSERECT,91,18,34,15)
                                                                      //
NoRightPower:                                                         //      }
                                                                      //
  JR_EQ8(PowerA,0,NoAPower)                                           //      if (PowerA != 0)
                                                                      //      {
  UI_DRAW(INVERSERECT,11,18,34,15)                                    //        UI_DRAW(INVERSERECT,11,18,34,15)
                                                                      //
NoAPower:                                                             //      }
                                                                      //
  JR_EQ8(PowerD,0,NoDPower)                                           //      if (PowerD != 0)
                                                                      //      {
  UI_DRAW(INVERSERECT,131,18,34,15)                                   //        UI_DRAW(INVERSERECT,131,18,34,15)
                                                                      //
NoDPower:                                                             //      }
                                                                      //
  MOVE8_8(0,Tmp)                                                      //      Tmp  =  0
  OR8(LeftPower,Tmp,Tmp)                                              //      Tmp |=  LeftPower
  OR8(RightPower,Tmp,Tmp)                                             //      Tmp |=  RightPower
  OR8(PowerA,Tmp,Tmp)                                                 //      Tmp |=  PowerA
  OR8(PowerD,Tmp,Tmp)                                                 //      Tmp |=  PowerB
                                                                      //
  JR_EQ8(Tmp,0,NotActive)                                             //      if (Tmp)
                                                                      //      {
  UI_WRITE(LED,LED_GREEN_PULSE)                                       //        UI_WRITE(LED,LED_GREEN_PULSE)
                                                                      //
  JR(EndActive)                                                       //      }
                                                                      //      else
NotActive:                                                            //      {
                                                                      //
  UI_WRITE(LED,LED_GREEN)                                             //        UI_WRITE(LED,LED_GREEN)
                                                                      //
EndActive:                                                            //      }
                                                                      //
  UI_DRAW(UPDATE)                                                     //      UI_DRAW(UPDATE)
}                                                                     //  }
                                                                      //
                                                                      //
// Exit ************************************************************************************************
                                                                      //
                                                                      //
subcall   Exit                                                        //  Exit
{                                                                     //  {
  DATAF   DataF                                                       //    Temp variable
                                                                      //
  INPUT_READSI(0,IR_PORT,0,0,DataF)                                   //    INPUT_READSI(0,IR_PORT,0,0,DataF)
  OUTPUT_STOP(0,MOTORALL,0)                                           //    OUTPUT_STOP(0,MOTORALL,0)
}                                                                     //  }
                                                                      //
                                                                      //
//! 

LEGO® Robotics Firmware Documentation
Confidential Information © 2013 The LEGO Group