This is an example program that actually allows the car to race using the FRDM-TFC library!

Dependencies:   FRDM-TFC

Fork of TFC-RACING-DEMO by Daniel Hadad

main.cpp

Committer:
redxeth
Date:
2014-04-20
Revision:
0:98e98e01a6ce

File content as of revision 0:98e98e01a6ce:

#include "mbed.h"
#include "TFC.h"

#include "common.h"
#include "Spices.h"


void TFC_TickerUpdate()
{
    int i;
 
    for(i=0; i<NUM_TFC_TICKERS; i++)
     {
        if(TFC_Ticker[i]<0xFFFFFFFF) 
        {
            TFC_Ticker[i]++;
        }
    }
}

void DemoProgram()
{
  uint32_t i,j,t = 0;
  float ReadPot0, ReadPot1;


  //This Demo program will look at the middle 2 switch to select one of 4 demo modes.
  //Let's look at the middle 2 switches
  switch((TFC_GetDIP_Switch()>>1)&0x03)
  {
  default:
  case 0 :
      //Demo mode 0 just tests the switches and LED's
      if(TFC_PUSH_BUTTON_0_PRESSED)
          TFC_BAT_LED0_ON;
      else
          TFC_BAT_LED0_OFF;
      
      if(TFC_PUSH_BUTTON_1_PRESSED)
          TFC_BAT_LED3_ON;
      else
          TFC_BAT_LED3_OFF;
      
      
/*      if(TFC_GetDIP_Switch()&0x01)
          TFC_BAT_LED1_ON;
      else
          TFC_BAT_LED1_OFF;
      
      if(TFC_GetDIP_Switch()&0x08)
          TFC_BAT_LED2_ON;
      else
          TFC_BAT_LED2_OFF; */
      
      break;
          
  case 1:
     TFC_HBRIDGE_DISABLE;
                    
     // if (TFC_HBRIDGE_ENABLED) {
        
    //    TFC_HBRIDGE_ENABLED = false;
    //  }

      //Demo mode 1 will just move the servos with the on-board potentiometers
      if(TFC_Ticker[0]>=20) // every 40mS...
      {
          TFC_Ticker[0] = 0; //reset the Ticker
          //update the Servos
          ReadPot0 = TFC_ReadPot(0);
          ReadPot1 = TFC_ReadPot(1);
          TFC_SetServo(0,ReadPot0);
          TFC_SetServo(1,ReadPot1);
          TERMINAL_PRINTF("Pot0 = %1.2f\r\n", ReadPot0);
      //    TERMINAL_PRINTF("Pot1 = %1.2f\r\n", ReadPot1);
      }
      //Let's put a pattern on the LEDs
      if(TFC_Ticker[1] >= 125) // every 250mS... cycle through LEDs
      {
          TFC_Ticker[1] = 0;
          t++;
          if(t>4)
          {
              t=0;
          }           
          TFC_SetBatteryLED_Level(t);
      }
      
      TFC_SetMotorPWM(0,0); //Make sure motors are off 
      TFC_HBRIDGE_DISABLE;

      break;
      
  case 2 :
      TFC_HBRIDGE_ENABLE;
     
      ReadPot0 = TFC_ReadPot(0);
      ReadPot1 = TFC_ReadPot(1);
 //     TERMINAL_PRINTF("Pot0 = %1.2f\n", ReadPot0);
 //     TERMINAL_PRINTF("Pot1 = %1.2f\n", ReadPot1);
      TFC_SetMotorPWM(ReadPot0,ReadPot1);
              
      //Let's put a pattern on the LEDs
      if(TFC_Ticker[1] >= 125)
          {
              TFC_Ticker[1] = 0;
                  t++;
                  if(t>4)
                  {
                      t=0;
                  }           
              TFC_SetBatteryLED_Level(t);
          }
      break;
  
  case 3 :
      //Demo Mode 3 will be in Freescale Garage Mode.  It will beam data from the Camera to the 
      //Labview Application
      //note that there are some issues 
      if(TFC_Ticker[0]>1000 && TFC_LineScanImageReady>0) // every 2s ...
          {
           TFC_Ticker[0] = 0;
           TFC_LineScanImageReady=0; // must reset to 0 after detecting non-zero
          
              if(t==0)
                  t=4;
              else
                  t--;
              
               TFC_SetBatteryLED_Level(t);
              
               for(i=0;i<8;i++) // print one line worth of data (128) from Camera 0
               {
                  for(j=0;j<16;j++)
                  {
                       
                       TERMINAL_PRINTF("0x%X",TFC_LineScanImage0[(i*16)+j]);
                      
                       if((i==7) && (j==15))  // when last data reached put in line return
                           TERMINAL_PRINTF("\r\n",TFC_LineScanImage0[(i*16)+j]);
                       else
                           TERMINAL_PRINTF(",",TFC_LineScanImage0[(i*16)+j]);
                      
                  }
                  wait_ms(10);
               }
              
     /*          for(i=0;i<8;i++) // print one line worth of data (128) from Camera 1 ??
               {
                    for(j=0;j<16;j++)
                     {
                       TERMINAL_PRINTF("0x%X",TFC_LineScanImage1[(i*16)+j]);
                      
                       if((i==7) && (j==15))  // when last data reached put in line return
                           TERMINAL_PRINTF("\r\n",TFC_LineScanImage1[(i*16)+j]);
                       else
                           TERMINAL_PRINTF(",",TFC_LineScanImage1[(i*16)+j]);
                      }   
                      
                      wait_ms(10);  
              }      */                                 
                  
          }
          


      break;
  } // end case

}

 
int main()
{
    // TERMINAL TYPE  
    PC.baud(115200); // works with Excel and TeraTerm 
    //PC.baud(9600); // works with USB Serial Monitor Lite: https://play.google.com/store/apps/details?id=jp.ksksue.app.terminal; doesn't work > 9600
    TFC_TickerObj.attach_us(&TFC_TickerUpdate,2000); // update ticker array every 2mS (2000 uS)
   
    TFC_Init();
    
    for(;;)
    {      
        //TFC_Task must be called in your main loop.  This keeps certain processing happy (I.E. Serial port queue check)
        //   TFC_Task();


        // If DIP switch 1 is high, then run MCP, else Demo program
        if(TFC_GetDIP_Switch()&0x01)
          // Run MCP
          MasterControlProgram();
        else      
          // Run Demo Program
          DemoProgram();
 
    } // end of infinite for loop
    
 
}