Program to control an accelerometer, motors and a rangefinder using the ScmRTOS ported to mbed. (Work in progress and buggy)

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers accelerometer.h Source File

accelerometer.h

00001 #pragma once
00002 #ifndef ACCELEROMETER_H
00003 #define ACCELEROMETER_H
00004 
00005 #include <processes.h>
00006 #include <Mutexes.h>
00007 #include <channels.h>
00008 #define X_axis p28
00009 #define Y_axis p27
00010 
00011 //DigitalOut led3(LED3); //these LEDs are used to indicate when an interrupt occurs.
00012 //DigitalOut led4(LED4);
00013 
00014 
00015 class accelerometer {
00016 public:
00017     accelerometer()
00018             :X_int(X_axis),
00019              Y_int(Y_axis)
00020              //X_input(X_axis),
00021              //Y_input(Y_axis)
00022      {
00023             //led3 = led4 = 0;
00024             X_time = Y_time = 0;
00025             //enable_flag = false;
00026             enable_X_rising_flag = enable_X_falling_flag = enable_Y_rising_flag = enable_Y_falling_flag = false;
00027             X_int.mode(PullDown);
00028             Y_int.mode(PullDown);
00029             //Y_input.mode(PullDown);
00030             //X_input.mode(PullDown);
00031             X_timer.reset();
00032             Y_timer.reset();
00033             set_interrupts();
00034             enable_X_rising_flag = enable_Y_rising_flag = true;
00035      }
00036 
00037     
00038     void set_interrupts()
00039     {
00040          X_int.fall(this, &accelerometer::set_X_time);
00041          X_int.rise(this, &accelerometer::start_X_timing);
00042          Y_int.fall(this, &accelerometer::set_Y_time);
00043          Y_int.rise(this, &accelerometer::start_Y_timing);
00044     }
00045     
00046     void start_X_timing() 
00047     {
00048          OS::TISRW ISRW;
00049        if(enable_X_rising_flag == true)
00050        {
00051            X_timer.start();
00052            enable_X_falling_flag = true;
00053            //printf("In start_x_time().\n");
00054            
00055        }
00056         
00057         
00058     }
00059     void start_Y_timing() 
00060     {   
00061                  OS::TISRW ISRW;
00062        if(enable_Y_rising_flag == true)
00063        {
00064            Y_timer.start();
00065            enable_Y_falling_flag = true;
00066 
00067        }
00068         
00069         
00070     }
00071 
00072     void set_X_time() {
00073         if(enable_X_falling_flag == true)
00074         {
00075              OS::TISRW ISRW;
00076             X_timer.stop();
00077             X_time = X_timer.read_us();
00078             X_timer.reset();
00079             //                       led3 = !led3;
00080                                    //printf("In set_x_time().\n");
00081 
00082             
00083         }
00084     }
00085     
00086     
00087     void set_Y_time() {
00088         if(enable_Y_falling_flag == true)
00089         {
00090              OS::TISRW ISRW;
00091             Y_timer.stop();
00092             Y_time = Y_timer.read_us();
00093            Y_timer.reset();
00094               //                   led4 = !led4;
00095 
00096             
00097         }
00098     }
00099 
00100     float get_X_time() 
00101     {
00102        return X_time;
00103     }
00104     
00105     float get_Y_time() 
00106     {
00107        return Y_time;
00108     }
00109 
00110    
00111 private:
00112     Timer X_timer;
00113     Timer Y_timer;
00114     float X_time; //time in us
00115     float Y_time;
00116     InterruptIn X_int;
00117     InterruptIn Y_int;
00118     //DigitalIn X_input;
00119     //DigitalIn Y_input;
00120     bool enable_X_rising_flag;
00121     bool enable_X_falling_flag;
00122     bool enable_Y_rising_flag;
00123     bool enable_Y_falling_flag;
00124 };
00125 
00126 
00127 
00128 
00129 
00130 
00131 
00132 
00133 extern BusOut leds;
00134 
00135 char ACC_Return_chars[100] = "";
00136 
00137 
00138 //typedef OS::process<OS::pr2, 1400> Accelo_proc;
00139 template<> OS_PROCESS void Accelo_proc::Exec() //Output stream handling process
00140 {
00141    
00142     accelerometer ACC;
00143      
00144      byte M = 0;
00145      for(;;)
00146      { 
00147      if(ACCELEROMETER_MESSAGE.wait(70)) //length of time to wait also determines how rapidly to return accelerometer data
00148        {    leds = 0x2;
00149             M = ACCELEROMETER_MESSAGE; //read the message that was destined for this process
00150             ACCELEROMETER_MESSAGE.reset();
00151        
00152            if(M == 0) //then return x and y data once
00153            {
00154                 sprintf(ACC_Return_chars, "ACC_X:%f\nACC_Y:%f\n", ACC.get_X_time(), ACC.get_Y_time()); // ready return string
00155                 //if(!Ser_out_Mutex.IsLocked())
00156                 {
00157                     //Ser_out_Mutex.Lock();
00158                     //if(TX_Channel.get_free_size() > strlen(Return_chars)+1)
00159                         TX_channel.write(ACC_Return_chars, strlen(ACC_Return_chars)+1); //output the data!
00160                     //Ser_out_Mutex.Unlock();
00161                 }    
00162                 
00163                 
00164                 
00165            }
00166        }
00167        if(M == 1) //ticker
00168        {
00169              
00170               {
00171                 //TCritSect cs;
00172                 sprintf(ACC_Return_chars, "ACC_X:%f\nACC_Y:%f\n", ACC.get_X_time(), ACC.get_Y_time()); // ready return string //"ACC_X:%f\nACC_Y:%f\n"
00173                }
00174                 //if(!Ser_out_Mutex.IsLocked())
00175                 {
00176                     //Ser_out_Mutex.Lock();
00177                     //if(TX_Channel.get_free_size() > strlen(Return_chars)+1)
00178                          TX_channel.write(ACC_Return_chars, strlen(ACC_Return_chars)+1); //output the data!
00179                     //Ser_out_Mutex.Unlock();
00180                 }
00181               //TX_flag.Signal();
00182             
00183        }   
00184 
00185             leds = 0x2;
00186         
00187        
00188      }
00189 }
00190 
00191  
00192  #endif
00193 
00194   
00195 
00196 
00197