Program to control an accelerometer, motors and a rangefinder using the ScmRTOS ported to mbed. (Work in progress and buggy)
Diff: Hexacopter/accelerometer.h
- Revision:
- 0:9b057566f9ee
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Hexacopter/accelerometer.h Mon Nov 01 20:39:01 2010 +0000 @@ -0,0 +1,197 @@ +#pragma once +#ifndef ACCELEROMETER_H +#define ACCELEROMETER_H + +#include <processes.h> +#include <Mutexes.h> +#include <channels.h> +#define X_axis p28 +#define Y_axis p27 + +//DigitalOut led3(LED3); //these LEDs are used to indicate when an interrupt occurs. +//DigitalOut led4(LED4); + + +class accelerometer { +public: + accelerometer() + :X_int(X_axis), + Y_int(Y_axis) + //X_input(X_axis), + //Y_input(Y_axis) + { + //led3 = led4 = 0; + X_time = Y_time = 0; + //enable_flag = false; + enable_X_rising_flag = enable_X_falling_flag = enable_Y_rising_flag = enable_Y_falling_flag = false; + X_int.mode(PullDown); + Y_int.mode(PullDown); + //Y_input.mode(PullDown); + //X_input.mode(PullDown); + X_timer.reset(); + Y_timer.reset(); + set_interrupts(); + enable_X_rising_flag = enable_Y_rising_flag = true; + } + + + void set_interrupts() + { + X_int.fall(this, &accelerometer::set_X_time); + X_int.rise(this, &accelerometer::start_X_timing); + Y_int.fall(this, &accelerometer::set_Y_time); + Y_int.rise(this, &accelerometer::start_Y_timing); + } + + void start_X_timing() + { + OS::TISRW ISRW; + if(enable_X_rising_flag == true) + { + X_timer.start(); + enable_X_falling_flag = true; + //printf("In start_x_time().\n"); + + } + + + } + void start_Y_timing() + { + OS::TISRW ISRW; + if(enable_Y_rising_flag == true) + { + Y_timer.start(); + enable_Y_falling_flag = true; + + } + + + } + + void set_X_time() { + if(enable_X_falling_flag == true) + { + OS::TISRW ISRW; + X_timer.stop(); + X_time = X_timer.read_us(); + X_timer.reset(); + // led3 = !led3; + //printf("In set_x_time().\n"); + + + } + } + + + void set_Y_time() { + if(enable_Y_falling_flag == true) + { + OS::TISRW ISRW; + Y_timer.stop(); + Y_time = Y_timer.read_us(); + Y_timer.reset(); + // led4 = !led4; + + + } + } + + float get_X_time() + { + return X_time; + } + + float get_Y_time() + { + return Y_time; + } + + +private: + Timer X_timer; + Timer Y_timer; + float X_time; //time in us + float Y_time; + InterruptIn X_int; + InterruptIn Y_int; + //DigitalIn X_input; + //DigitalIn Y_input; + bool enable_X_rising_flag; + bool enable_X_falling_flag; + bool enable_Y_rising_flag; + bool enable_Y_falling_flag; +}; + + + + + + + + +extern BusOut leds; + +char ACC_Return_chars[100] = ""; + + +//typedef OS::process<OS::pr2, 1400> Accelo_proc; +template<> OS_PROCESS void Accelo_proc::Exec() //Output stream handling process +{ + + accelerometer ACC; + + byte M = 0; + for(;;) + { + if(ACCELEROMETER_MESSAGE.wait(70)) //length of time to wait also determines how rapidly to return accelerometer data + { leds = 0x2; + M = ACCELEROMETER_MESSAGE; //read the message that was destined for this process + ACCELEROMETER_MESSAGE.reset(); + + if(M == 0) //then return x and y data once + { + sprintf(ACC_Return_chars, "ACC_X:%f\nACC_Y:%f\n", ACC.get_X_time(), ACC.get_Y_time()); // ready return string + //if(!Ser_out_Mutex.IsLocked()) + { + //Ser_out_Mutex.Lock(); + //if(TX_Channel.get_free_size() > strlen(Return_chars)+1) + TX_channel.write(ACC_Return_chars, strlen(ACC_Return_chars)+1); //output the data! + //Ser_out_Mutex.Unlock(); + } + + + + } + } + if(M == 1) //ticker + { + + { + //TCritSect cs; + 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" + } + //if(!Ser_out_Mutex.IsLocked()) + { + //Ser_out_Mutex.Lock(); + //if(TX_Channel.get_free_size() > strlen(Return_chars)+1) + TX_channel.write(ACC_Return_chars, strlen(ACC_Return_chars)+1); //output the data! + //Ser_out_Mutex.Unlock(); + } + //TX_flag.Signal(); + + } + + leds = 0x2; + + + } +} + + + #endif + + + + +