Committer:
narshu
Date:
Thu Apr 26 17:50:00 2012 +0000
Revision:
1:0370ea94b64a
Parent:
0:7583de124698

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
narshu 0:7583de124698 1
narshu 0:7583de124698 2 #include "RFSRF05.h"
narshu 0:7583de124698 3 #include "mbed.h"
narshu 1:0370ea94b64a 4 #include "globals.h"
narshu 1:0370ea94b64a 5 #include "system.h"
narshu 0:7583de124698 6
narshu 0:7583de124698 7
narshu 0:7583de124698 8 RFSRF05::RFSRF05(PinName trigger,
narshu 0:7583de124698 9 PinName echo0,
narshu 0:7583de124698 10 PinName echo1,
narshu 0:7583de124698 11 PinName echo2,
narshu 0:7583de124698 12 PinName echo3,
narshu 0:7583de124698 13 PinName echo4,
narshu 0:7583de124698 14 PinName echo5,
narshu 0:7583de124698 15 PinName SDI,
narshu 0:7583de124698 16 PinName SDO,
narshu 0:7583de124698 17 PinName SCK,
narshu 0:7583de124698 18 PinName NCS,
narshu 0:7583de124698 19 PinName NIRQ)
narshu 0:7583de124698 20 : _rf(SDI,SDO,SCK,NCS,NIRQ),
narshu 0:7583de124698 21 _trigger(trigger),
narshu 0:7583de124698 22 _echo0(echo0),
narshu 0:7583de124698 23 _echo1(echo1),
narshu 0:7583de124698 24 _echo2(echo2),
narshu 0:7583de124698 25 _echo3(echo3),
narshu 0:7583de124698 26 _echo4(echo4),
narshu 0:7583de124698 27 _echo5(echo5) {
narshu 1:0370ea94b64a 28
narshu 0:7583de124698 29 // initialises codes
narshu 1:0370ea94b64a 30 codes[0] = CODE0;
narshu 1:0370ea94b64a 31 codes[1] = CODE1;
narshu 1:0370ea94b64a 32 codes[2] = CODE2;
narshu 0:7583de124698 33
narshu 0:7583de124698 34 //set callback execute to true
narshu 0:7583de124698 35 ValidPulse = false;
narshu 0:7583de124698 36
narshu 0:7583de124698 37 // Attach interrupts
narshu 1:0370ea94b64a 38 #ifdef SONAR_ECHO_INV
narshu 1:0370ea94b64a 39 // inverted sonar inputs
narshu 1:0370ea94b64a 40 _echo5.fall(this, &RFSRF05::_rising);
narshu 1:0370ea94b64a 41 _echo0.rise(this, &RFSRF05::_falling);
narshu 1:0370ea94b64a 42 _echo1.rise(this, &RFSRF05::_falling);
narshu 1:0370ea94b64a 43 _echo2.rise(this, &RFSRF05::_falling);
narshu 1:0370ea94b64a 44 _echo3.rise(this, &RFSRF05::_falling);
narshu 1:0370ea94b64a 45 _echo4.rise(this, &RFSRF05::_falling);
narshu 1:0370ea94b64a 46 _echo5.rise(this, &RFSRF05::_falling);
narshu 1:0370ea94b64a 47 #else
narshu 1:0370ea94b64a 48 _echo5.rise(this, &RFSRF05::_rising);
narshu 0:7583de124698 49 _echo0.fall(this, &RFSRF05::_falling);
narshu 0:7583de124698 50 _echo1.fall(this, &RFSRF05::_falling);
narshu 0:7583de124698 51 _echo2.fall(this, &RFSRF05::_falling);
narshu 0:7583de124698 52 _echo3.fall(this, &RFSRF05::_falling);
narshu 0:7583de124698 53 _echo4.fall(this, &RFSRF05::_falling);
narshu 0:7583de124698 54 _echo5.fall(this, &RFSRF05::_falling);
narshu 1:0370ea94b64a 55 #endif
narshu 0:7583de124698 56
narshu 0:7583de124698 57
narshu 0:7583de124698 58 //init callabck function
narshu 0:7583de124698 59 callbackfunc = NULL;
narshu 0:7583de124698 60 callbackobj = NULL;
narshu 0:7583de124698 61 mcallbackfunc = NULL;
narshu 0:7583de124698 62
narshu 0:7583de124698 63 // innitialises beacon counter
narshu 0:7583de124698 64 _beacon_counter = 0;
narshu 0:7583de124698 65
narshu 1:0370ea94b64a 66 #ifdef PRIMARY_ROBOT
narshu 1:0370ea94b64a 67 //Interrupts every 50ms for primary robot
narshu 1:0370ea94b64a 68 _ticker.attach(this, &RFSRF05::_startRange, 0.05);
narshu 1:0370ea94b64a 69 #else
narshu 1:0370ea94b64a 70 //attach callback
narshu 1:0370ea94b64a 71 _rf.callbackobj = (DummyCT*)this;
narshu 1:0370ea94b64a 72 _rf.mcallbackfunc = (void (DummyCT::*)(unsigned char rx_data)) &RFSRF05::startRange;
narshu 1:0370ea94b64a 73 #endif
narshu 1:0370ea94b64a 74
narshu 0:7583de124698 75 }
narshu 0:7583de124698 76
narshu 1:0370ea94b64a 77 #ifdef PRIMARY_ROBOT
narshu 1:0370ea94b64a 78 void RFSRF05::_startRange() {
narshu 0:7583de124698 79
narshu 0:7583de124698 80 //printf("Srange\r\r");
narshu 0:7583de124698 81
narshu 0:7583de124698 82 // increments counter
narshu 0:7583de124698 83 _beacon_counter = (_beacon_counter + 1) % 3;
narshu 0:7583de124698 84
narshu 0:7583de124698 85
narshu 1:0370ea94b64a 86 // set flags
narshu 0:7583de124698 87 ValidPulse = false;
narshu 0:7583de124698 88 expValidPulse = true;
narshu 0:7583de124698 89
narshu 1:0370ea94b64a 90 // writes code to RF port
narshu 1:0370ea94b64a 91 _rf.write(codes[_beacon_counter]);
narshu 1:0370ea94b64a 92
narshu 1:0370ea94b64a 93 // send a trigger pulse, 10uS long
narshu 0:7583de124698 94 _trigger = 1;
narshu 0:7583de124698 95 wait_us (10);
narshu 0:7583de124698 96 _trigger = 0;
narshu 1:0370ea94b64a 97
narshu 0:7583de124698 98 }
narshu 1:0370ea94b64a 99 #else
narshu 0:7583de124698 100
narshu 1:0370ea94b64a 101 void RFSRF05::startRange(unsigned char rx_code) {
narshu 1:0370ea94b64a 102 for (int i = 0; i < 3; i++) {
narshu 1:0370ea94b64a 103 if (rx_code == codes[i]) {
narshu 1:0370ea94b64a 104
narshu 1:0370ea94b64a 105 // assign beacon_counter
narshu 1:0370ea94b64a 106 _beacon_counter = i;
narshu 1:0370ea94b64a 107
narshu 1:0370ea94b64a 108 // set flags
narshu 1:0370ea94b64a 109 ValidPulse = false;
narshu 1:0370ea94b64a 110 expValidPulse = true;
narshu 1:0370ea94b64a 111
narshu 1:0370ea94b64a 112 // send a trigger pulse, 10uS long
narshu 1:0370ea94b64a 113 _trigger = 1;
narshu 1:0370ea94b64a 114 wait_us (10);
narshu 1:0370ea94b64a 115 _trigger = 0;
narshu 1:0370ea94b64a 116 break;
narshu 1:0370ea94b64a 117 }
narshu 1:0370ea94b64a 118 }
narshu 1:0370ea94b64a 119 }
narshu 1:0370ea94b64a 120 #endif
narshu 0:7583de124698 121
narshu 0:7583de124698 122 // Clear and start the timer at the begining of the echo pulse
narshu 0:7583de124698 123 void RFSRF05::_rising(void) {
narshu 0:7583de124698 124
narshu 0:7583de124698 125 _timer.reset();
narshu 0:7583de124698 126 _timer.start();
narshu 0:7583de124698 127
narshu 0:7583de124698 128 //Set callback execute to ture
narshu 0:7583de124698 129 if (expValidPulse) {
narshu 0:7583de124698 130 ValidPulse = true;
narshu 0:7583de124698 131 expValidPulse = false;
narshu 0:7583de124698 132 }
narshu 0:7583de124698 133 }
narshu 0:7583de124698 134
narshu 0:7583de124698 135 // Stop and read the timer at the end of the pulse
narshu 0:7583de124698 136 void RFSRF05::_falling(void) {
narshu 0:7583de124698 137 _timer.stop();
narshu 0:7583de124698 138
narshu 0:7583de124698 139 if (ValidPulse) {
narshu 0:7583de124698 140 //printf("Validpulse trig!\r\n");
narshu 0:7583de124698 141 ValidPulse = false;
narshu 0:7583de124698 142
narshu 0:7583de124698 143 //Calucate distance
narshu 0:7583de124698 144 _dist[_beacon_counter] = _timer.read_us()/2.9 + 300;
narshu 0:7583de124698 145
narshu 0:7583de124698 146 if (callbackfunc)
narshu 0:7583de124698 147 (*callbackfunc)(_beacon_counter, _dist[_beacon_counter]);
narshu 0:7583de124698 148
narshu 0:7583de124698 149 if (callbackobj && mcallbackfunc)
narshu 1:0370ea94b64a 150 (callbackobj->*mcallbackfunc)(_beacon_counter, _dist[_beacon_counter], sonarvariance);
narshu 0:7583de124698 151
narshu 0:7583de124698 152 }
narshu 0:7583de124698 153
narshu 0:7583de124698 154 }
narshu 0:7583de124698 155
narshu 0:7583de124698 156 float RFSRF05::read0() {
narshu 0:7583de124698 157 // returns distance
narshu 0:7583de124698 158 return (_dist[0]);
narshu 0:7583de124698 159 }
narshu 0:7583de124698 160
narshu 0:7583de124698 161 float RFSRF05::read1() {
narshu 0:7583de124698 162 // returns distance
narshu 0:7583de124698 163 return (_dist[1]);
narshu 0:7583de124698 164 }
narshu 0:7583de124698 165
narshu 0:7583de124698 166 float RFSRF05::read2() {
narshu 0:7583de124698 167 // returns distance
narshu 0:7583de124698 168 return (_dist[2]);
narshu 0:7583de124698 169 }
narshu 0:7583de124698 170
narshu 0:7583de124698 171 float RFSRF05::read(unsigned int beaconnum) {
narshu 0:7583de124698 172 // returns distance
narshu 0:7583de124698 173 return (_dist[beaconnum]);
narshu 0:7583de124698 174 }
narshu 0:7583de124698 175
narshu 1:0370ea94b64a 176 void RFSRF05::setCode(int code_index, unsigned char code) {
narshu 1:0370ea94b64a 177 codes[code_index] = code;
narshu 1:0370ea94b64a 178 }
narshu 1:0370ea94b64a 179
narshu 0:7583de124698 180 //SRF05::operator float() {
narshu 0:7583de124698 181 // return read();
narshu 0:7583de124698 182 //}