Dependencies:   EthernetNetIf mbed

Committer:
SED9008
Date:
Tue Apr 03 17:46:32 2012 +0000
Revision:
0:ad88907cf227
Child:
1:5721a5772035

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
SED9008 0:ad88907cf227 1 #include "mbed.h"
SED9008 0:ad88907cf227 2 #include "EthernetNetIf.h"
SED9008 0:ad88907cf227 3 #include "TCPSocket.h"
SED9008 0:ad88907cf227 4 #include "IMUfilter.h"
SED9008 0:ad88907cf227 5 #include "ADXL345_I2C.h"
SED9008 0:ad88907cf227 6 #include "L3G4200D.h"
SED9008 0:ad88907cf227 7
SED9008 0:ad88907cf227 8 #define TCP_LISTENING_PORT 1337
SED9008 0:ad88907cf227 9 //Gravity at Earth's surface in m/s/s
SED9008 0:ad88907cf227 10 #define g0 9.812865328
SED9008 0:ad88907cf227 11 //Number of samples to average.
SED9008 0:ad88907cf227 12 #define SAMPLES 4
SED9008 0:ad88907cf227 13 //Number of samples to be averaged for a null bias calculation
SED9008 0:ad88907cf227 14 //during calibration.
SED9008 0:ad88907cf227 15 #define CALIBRATION_SAMPLES 128
SED9008 0:ad88907cf227 16 //Convert from radians to degrees.
SED9008 0:ad88907cf227 17 #define toDegrees(x) (x * 57.2957795)
SED9008 0:ad88907cf227 18 //Convert from degrees to radians.
SED9008 0:ad88907cf227 19 #define toRadians(x) (x * 0.01745329252)
SED9008 0:ad88907cf227 20 //ITG-3200 sensitivity is 14.375 LSB/(degrees/sec).
SED9008 0:ad88907cf227 21 #define GYROSCOPE_GAIN (1 / 14.375)
SED9008 0:ad88907cf227 22 //Full scale resolution on the ADXL345 is 4mg/LSB.
SED9008 0:ad88907cf227 23 #define ACCELEROMETER_GAIN (0.004 * g0)
SED9008 0:ad88907cf227 24 //Sampling gyroscope at 200Hz.
SED9008 0:ad88907cf227 25 #define GYRO_RATE 0.005
SED9008 0:ad88907cf227 26 //Sampling accelerometer at 200Hz.
SED9008 0:ad88907cf227 27 #define ACC_RATE 0.005
SED9008 0:ad88907cf227 28 //Updating filter at 40Hz.
SED9008 0:ad88907cf227 29 #define FILTER_RATE 0.1
SED9008 0:ad88907cf227 30
SED9008 0:ad88907cf227 31 //At rest the gyroscope is centred around 0 and goes between about
SED9008 0:ad88907cf227 32 //-5 and 5 counts. As 1 degrees/sec is ~15 LSB, error is roughly
SED9008 0:ad88907cf227 33 //5/15 = 0.3 degrees/sec.
SED9008 0:ad88907cf227 34 IMUfilter imuFilter(FILTER_RATE, 0.3);
SED9008 0:ad88907cf227 35 ADXL345_I2C accelerometer(p9, p10);
SED9008 0:ad88907cf227 36 L3G4200D gyroscope(p9, p10);
SED9008 0:ad88907cf227 37
SED9008 0:ad88907cf227 38 PwmOut m1(p21);
SED9008 0:ad88907cf227 39 PwmOut m2(p22);
SED9008 0:ad88907cf227 40 PwmOut m3(p23);
SED9008 0:ad88907cf227 41 PwmOut m4(p24);
SED9008 0:ad88907cf227 42
SED9008 0:ad88907cf227 43 Ticker accelerometerTicker;
SED9008 0:ad88907cf227 44 Ticker gyroscopeTicker;
SED9008 0:ad88907cf227 45 Ticker filterTicker;
SED9008 0:ad88907cf227 46
SED9008 0:ad88907cf227 47
SED9008 0:ad88907cf227 48 int connected = 0,
SED9008 0:ad88907cf227 49 calibrated = 0,
SED9008 0:ad88907cf227 50 led1 = 0;
SED9008 0:ad88907cf227 51 //Offsets for the gyroscope.
SED9008 0:ad88907cf227 52 //The readings we take when the gyroscope is stationary won't be 0, so we'll
SED9008 0:ad88907cf227 53 //average a set of readings we do get when the gyroscope is stationary and
SED9008 0:ad88907cf227 54 //take those away from subsequent readings to ensure the gyroscope is offset
SED9008 0:ad88907cf227 55 //or "biased" to 0.
SED9008 0:ad88907cf227 56 double w_xBias;
SED9008 0:ad88907cf227 57 double w_yBias;
SED9008 0:ad88907cf227 58 double w_zBias;
SED9008 0:ad88907cf227 59
SED9008 0:ad88907cf227 60 //Offsets for the accelerometer.
SED9008 0:ad88907cf227 61 //Same as with the gyroscope.
SED9008 0:ad88907cf227 62 double a_xBias;
SED9008 0:ad88907cf227 63 double a_yBias;
SED9008 0:ad88907cf227 64 double a_zBias;
SED9008 0:ad88907cf227 65
SED9008 0:ad88907cf227 66 //Accumulators used for oversampling and then averaging.
SED9008 0:ad88907cf227 67 volatile double a_xAccumulator = 0;
SED9008 0:ad88907cf227 68 volatile double a_yAccumulator = 0;
SED9008 0:ad88907cf227 69 volatile double a_zAccumulator = 0;
SED9008 0:ad88907cf227 70 volatile double w_xAccumulator = 0;
SED9008 0:ad88907cf227 71 volatile double w_yAccumulator = 0;
SED9008 0:ad88907cf227 72 volatile double w_zAccumulator = 0;
SED9008 0:ad88907cf227 73
SED9008 0:ad88907cf227 74 //Accelerometer and gyroscope readings for x, y, z axes.
SED9008 0:ad88907cf227 75 volatile double a_x;
SED9008 0:ad88907cf227 76 volatile double a_y;
SED9008 0:ad88907cf227 77 volatile double a_z;
SED9008 0:ad88907cf227 78 volatile double w_x;
SED9008 0:ad88907cf227 79 volatile double w_y;
SED9008 0:ad88907cf227 80 volatile double w_z;
SED9008 0:ad88907cf227 81
SED9008 0:ad88907cf227 82 //Buffer for accelerometer readings.
SED9008 0:ad88907cf227 83 int readings[3];
SED9008 0:ad88907cf227 84 //Number of accelerometer samples we're on.
SED9008 0:ad88907cf227 85 int accelerometerSamples = 0;
SED9008 0:ad88907cf227 86 //Number of gyroscope samples we're on.
SED9008 0:ad88907cf227 87 int gyroscopeSamples = 0;
SED9008 0:ad88907cf227 88
SED9008 0:ad88907cf227 89 /**
SED9008 0:ad88907cf227 90 * Prototypes
SED9008 0:ad88907cf227 91 */
SED9008 0:ad88907cf227 92 //Set up the ADXL345 appropriately.
SED9008 0:ad88907cf227 93 void initializeAccelerometer(void);
SED9008 0:ad88907cf227 94 //Calculate the null bias.
SED9008 0:ad88907cf227 95 void calibrateAccelerometer(void);
SED9008 0:ad88907cf227 96 //Take a set of samples and average them.
SED9008 0:ad88907cf227 97 void sampleAccelerometer(void);
SED9008 0:ad88907cf227 98 //Calculate the null bias.
SED9008 0:ad88907cf227 99 void calibrateGyroscope(void);
SED9008 0:ad88907cf227 100 //Take a set of samples and average them.
SED9008 0:ad88907cf227 101 void sampleGyroscope(void);
SED9008 0:ad88907cf227 102 //Update the filter and calculate the Euler angles.
SED9008 0:ad88907cf227 103 void filter(void);
SED9008 0:ad88907cf227 104 void tcp_send(const char*);
SED9008 0:ad88907cf227 105 void onConnectedTCPSocketEvent(TCPSocketEvent e);
SED9008 0:ad88907cf227 106 void onListeningTCPSocketEvent(TCPSocketEvent e);
SED9008 0:ad88907cf227 107
SED9008 0:ad88907cf227 108 // EthernetNetIf eth;
SED9008 0:ad88907cf227 109 EthernetNetIf eth(
SED9008 0:ad88907cf227 110 IpAddr(192,168,0,16), //IP Address
SED9008 0:ad88907cf227 111 IpAddr(255,255,255,0), //Network Mask
SED9008 0:ad88907cf227 112 IpAddr(192,168,0,1), //Gateway
SED9008 0:ad88907cf227 113 IpAddr(192,168,0,1) //DNS
SED9008 0:ad88907cf227 114 );
SED9008 0:ad88907cf227 115
SED9008 0:ad88907cf227 116 TCPSocket ListeningSock;
SED9008 0:ad88907cf227 117 TCPSocket* pConnectedSock; // for ConnectedSock
SED9008 0:ad88907cf227 118 Host client;
SED9008 0:ad88907cf227 119 TCPSocketErr err;
SED9008 0:ad88907cf227 120
SED9008 0:ad88907cf227 121 void sampleAccelerometer(void) {
SED9008 0:ad88907cf227 122
SED9008 0:ad88907cf227 123 //Have we taken enough samples?
SED9008 0:ad88907cf227 124 if (accelerometerSamples == SAMPLES) {
SED9008 0:ad88907cf227 125
SED9008 0:ad88907cf227 126 //Average the samples, remove the bias, and calculate the acceleration
SED9008 0:ad88907cf227 127 //in m/s/s.
SED9008 0:ad88907cf227 128 a_x = ((a_xAccumulator / SAMPLES) - a_xBias) * ACCELEROMETER_GAIN;
SED9008 0:ad88907cf227 129 a_y = ((a_yAccumulator / SAMPLES) - a_yBias) * ACCELEROMETER_GAIN;
SED9008 0:ad88907cf227 130 a_z = ((a_zAccumulator / SAMPLES) - a_zBias) * ACCELEROMETER_GAIN;
SED9008 0:ad88907cf227 131
SED9008 0:ad88907cf227 132 a_xAccumulator = 0;
SED9008 0:ad88907cf227 133 a_yAccumulator = 0;
SED9008 0:ad88907cf227 134 a_zAccumulator = 0;
SED9008 0:ad88907cf227 135 accelerometerSamples = 0;
SED9008 0:ad88907cf227 136
SED9008 0:ad88907cf227 137 } else {
SED9008 0:ad88907cf227 138 //Take another sample.
SED9008 0:ad88907cf227 139 accelerometer.getOutput(readings);
SED9008 0:ad88907cf227 140
SED9008 0:ad88907cf227 141 a_xAccumulator += (int16_t) readings[0];
SED9008 0:ad88907cf227 142 a_yAccumulator += (int16_t) readings[1];
SED9008 0:ad88907cf227 143 a_zAccumulator += (int16_t) readings[2];
SED9008 0:ad88907cf227 144
SED9008 0:ad88907cf227 145 accelerometerSamples++;
SED9008 0:ad88907cf227 146
SED9008 0:ad88907cf227 147 }
SED9008 0:ad88907cf227 148
SED9008 0:ad88907cf227 149 }
SED9008 0:ad88907cf227 150
SED9008 0:ad88907cf227 151 void sampleGyroscope(void) {
SED9008 0:ad88907cf227 152
SED9008 0:ad88907cf227 153 //Have we taken enough samples?
SED9008 0:ad88907cf227 154 if (gyroscopeSamples == SAMPLES) {
SED9008 0:ad88907cf227 155
SED9008 0:ad88907cf227 156 //Average the samples, remove the bias, and calculate the angular
SED9008 0:ad88907cf227 157 //velocity in rad/s.
SED9008 0:ad88907cf227 158 w_x = toRadians(((w_xAccumulator / SAMPLES) - w_xBias) * GYROSCOPE_GAIN);
SED9008 0:ad88907cf227 159 w_y = toRadians(((w_yAccumulator / SAMPLES) - w_yBias) * GYROSCOPE_GAIN);
SED9008 0:ad88907cf227 160 w_z = toRadians(((w_zAccumulator / SAMPLES) - w_zBias) * GYROSCOPE_GAIN);
SED9008 0:ad88907cf227 161
SED9008 0:ad88907cf227 162 w_xAccumulator = 0;
SED9008 0:ad88907cf227 163 w_yAccumulator = 0;
SED9008 0:ad88907cf227 164 w_zAccumulator = 0;
SED9008 0:ad88907cf227 165 gyroscopeSamples = 0;
SED9008 0:ad88907cf227 166
SED9008 0:ad88907cf227 167 } else {
SED9008 0:ad88907cf227 168 //Take another sample.
SED9008 0:ad88907cf227 169 int g[3];
SED9008 0:ad88907cf227 170 gyroscope.read(g);
SED9008 0:ad88907cf227 171 w_xAccumulator += g[0];
SED9008 0:ad88907cf227 172 w_yAccumulator += g[1];
SED9008 0:ad88907cf227 173 w_zAccumulator += g[2];
SED9008 0:ad88907cf227 174
SED9008 0:ad88907cf227 175 gyroscopeSamples++;
SED9008 0:ad88907cf227 176
SED9008 0:ad88907cf227 177 }
SED9008 0:ad88907cf227 178
SED9008 0:ad88907cf227 179 }
SED9008 0:ad88907cf227 180
SED9008 0:ad88907cf227 181 void filter(void) {
SED9008 0:ad88907cf227 182
SED9008 0:ad88907cf227 183 //Update the filter variables.
SED9008 0:ad88907cf227 184 imuFilter.updateFilter(w_y, w_x, w_z, a_y, a_x, a_z);
SED9008 0:ad88907cf227 185 //Calculate the new Euler angles.
SED9008 0:ad88907cf227 186 imuFilter.computeEuler();
SED9008 0:ad88907cf227 187
SED9008 0:ad88907cf227 188 }
SED9008 0:ad88907cf227 189
SED9008 0:ad88907cf227 190
SED9008 0:ad88907cf227 191
SED9008 0:ad88907cf227 192 int main() {
SED9008 0:ad88907cf227 193
SED9008 0:ad88907cf227 194 EthernetErr ethErr = eth.setup();
SED9008 0:ad88907cf227 195 if(ethErr) { return -1;}
SED9008 0:ad88907cf227 196 IpAddr ip = eth.getIp();
SED9008 0:ad88907cf227 197 // Set the callbacks for Listening
SED9008 0:ad88907cf227 198 ListeningSock.setOnEvent(&onListeningTCPSocketEvent);
SED9008 0:ad88907cf227 199 // bind and listen on TCP
SED9008 0:ad88907cf227 200 err=ListeningSock.bind(Host(IpAddr(), TCP_LISTENING_PORT));
SED9008 0:ad88907cf227 201 //Deal with that error...
SED9008 0:ad88907cf227 202 if(err){printf("Binding Error\n");}
SED9008 0:ad88907cf227 203 err=ListeningSock.listen(); // Starts listening
SED9008 0:ad88907cf227 204 if(err){printf("Listening Error\r\n");}
SED9008 0:ad88907cf227 205
SED9008 0:ad88907cf227 206 //Initialize inertial sensors.
SED9008 0:ad88907cf227 207 initializeAccelerometer();
SED9008 0:ad88907cf227 208 calibrateAccelerometer();
SED9008 0:ad88907cf227 209 calibrateGyroscope();
SED9008 0:ad88907cf227 210
SED9008 0:ad88907cf227 211 //Set up timers.
SED9008 0:ad88907cf227 212 //Accelerometer data rate is 200Hz, so we'll sample at this speed.
SED9008 0:ad88907cf227 213 accelerometerTicker.attach(&sampleAccelerometer, 0.005);
SED9008 0:ad88907cf227 214 //Gyroscope data rate is 200Hz, so we'll sample at this speed.
SED9008 0:ad88907cf227 215 gyroscopeTicker.attach(&sampleGyroscope, 0.005);
SED9008 0:ad88907cf227 216 //Update the filter variables at the correct rate.
SED9008 0:ad88907cf227 217 filterTicker.attach(&filter, FILTER_RATE);
SED9008 0:ad88907cf227 218
SED9008 0:ad88907cf227 219 Timer tmr;
SED9008 0:ad88907cf227 220 tmr.start();
SED9008 0:ad88907cf227 221
SED9008 0:ad88907cf227 222 while(true)
SED9008 0:ad88907cf227 223 {
SED9008 0:ad88907cf227 224 wait(FILTER_RATE);
SED9008 0:ad88907cf227 225
SED9008 0:ad88907cf227 226 Net::poll();
SED9008 0:ad88907cf227 227 if(tmr.read() > 0.2){
SED9008 0:ad88907cf227 228 // led4=!led4; //Show that we are alive
SED9008 0:ad88907cf227 229 tmr.reset();
SED9008 0:ad88907cf227 230 }
SED9008 0:ad88907cf227 231 if(connected & led1 == 0){
SED9008 0:ad88907cf227 232 tcp_send("Connected\r\n");
SED9008 0:ad88907cf227 233 led1 = 1;
SED9008 0:ad88907cf227 234 calibrated = 1;
SED9008 0:ad88907cf227 235
SED9008 0:ad88907cf227 236 //Set up timers.
SED9008 0:ad88907cf227 237 //Accelerometer data rate is 200Hz, so we'll sample at this speed.
SED9008 0:ad88907cf227 238 accelerometerTicker.attach(&sampleAccelerometer, 0.005);
SED9008 0:ad88907cf227 239 //Gyroscope data rate is 200Hz, so we'll sample at this speed.
SED9008 0:ad88907cf227 240 gyroscopeTicker.attach(&sampleGyroscope, 0.005);
SED9008 0:ad88907cf227 241 //Update the filter variables at the correct rate.
SED9008 0:ad88907cf227 242 filterTicker.attach(&filter, FILTER_RATE);
SED9008 0:ad88907cf227 243
SED9008 0:ad88907cf227 244 tcp_send("Done initializing\r\n");
SED9008 0:ad88907cf227 245
SED9008 0:ad88907cf227 246 }
SED9008 0:ad88907cf227 247
SED9008 0:ad88907cf227 248 if(calibrated){
SED9008 0:ad88907cf227 249 char buffer [128];
SED9008 0:ad88907cf227 250 sprintf (buffer, "x:%f - y:%f - z:%f \r\n",toDegrees(imuFilter.getRoll()),
SED9008 0:ad88907cf227 251 toDegrees(imuFilter.getPitch()),
SED9008 0:ad88907cf227 252 toDegrees(imuFilter.getYaw()));
SED9008 0:ad88907cf227 253 tcp_send(buffer);
SED9008 0:ad88907cf227 254 }
SED9008 0:ad88907cf227 255 }
SED9008 0:ad88907cf227 256 }
SED9008 0:ad88907cf227 257
SED9008 0:ad88907cf227 258 void initializeAccelerometer(void) {
SED9008 0:ad88907cf227 259
SED9008 0:ad88907cf227 260 //Go into standby mode to configure the device.
SED9008 0:ad88907cf227 261 accelerometer.setPowerControl(0x00);
SED9008 0:ad88907cf227 262 //Full resolution, +/-16g, 4mg/LSB.
SED9008 0:ad88907cf227 263 accelerometer.setDataFormatControl(0x0B);
SED9008 0:ad88907cf227 264 //200Hz data rate.
SED9008 0:ad88907cf227 265 accelerometer.setDataRate(ADXL345_200HZ);
SED9008 0:ad88907cf227 266 //Measurement mode.
SED9008 0:ad88907cf227 267 accelerometer.setPowerControl(0x08);
SED9008 0:ad88907cf227 268 //See http://www.analog.com/static/imported-files/application_notes/AN-1077.pdf
SED9008 0:ad88907cf227 269 wait_ms(22);
SED9008 0:ad88907cf227 270
SED9008 0:ad88907cf227 271 }
SED9008 0:ad88907cf227 272
SED9008 0:ad88907cf227 273 void calibrateAccelerometer(void) {
SED9008 0:ad88907cf227 274
SED9008 0:ad88907cf227 275 a_xAccumulator = 0;
SED9008 0:ad88907cf227 276 a_yAccumulator = 0;
SED9008 0:ad88907cf227 277 a_zAccumulator = 0;
SED9008 0:ad88907cf227 278
SED9008 0:ad88907cf227 279 //Take a number of readings and average them
SED9008 0:ad88907cf227 280 //to calculate the zero g offset.
SED9008 0:ad88907cf227 281 for (int i = 0; i < CALIBRATION_SAMPLES; i++) {
SED9008 0:ad88907cf227 282
SED9008 0:ad88907cf227 283 accelerometer.getOutput(readings);
SED9008 0:ad88907cf227 284
SED9008 0:ad88907cf227 285 a_xAccumulator += (int16_t) readings[0];
SED9008 0:ad88907cf227 286 a_yAccumulator += (int16_t) readings[1];
SED9008 0:ad88907cf227 287 a_zAccumulator += (int16_t) readings[2];
SED9008 0:ad88907cf227 288
SED9008 0:ad88907cf227 289 wait(ACC_RATE);
SED9008 0:ad88907cf227 290
SED9008 0:ad88907cf227 291 }
SED9008 0:ad88907cf227 292
SED9008 0:ad88907cf227 293 a_xAccumulator /= CALIBRATION_SAMPLES;
SED9008 0:ad88907cf227 294 a_yAccumulator /= CALIBRATION_SAMPLES;
SED9008 0:ad88907cf227 295 a_zAccumulator /= CALIBRATION_SAMPLES;
SED9008 0:ad88907cf227 296
SED9008 0:ad88907cf227 297 //At 4mg/LSB, 250 LSBs is 1g.
SED9008 0:ad88907cf227 298 a_xBias = a_xAccumulator;
SED9008 0:ad88907cf227 299 a_yBias = a_yAccumulator;
SED9008 0:ad88907cf227 300 a_zBias = (a_zAccumulator - 250);
SED9008 0:ad88907cf227 301
SED9008 0:ad88907cf227 302 a_xAccumulator = 0;
SED9008 0:ad88907cf227 303 a_yAccumulator = 0;
SED9008 0:ad88907cf227 304 a_zAccumulator = 0;
SED9008 0:ad88907cf227 305
SED9008 0:ad88907cf227 306 }
SED9008 0:ad88907cf227 307
SED9008 0:ad88907cf227 308 void calibrateGyroscope(void) {
SED9008 0:ad88907cf227 309
SED9008 0:ad88907cf227 310 w_xAccumulator = 0;
SED9008 0:ad88907cf227 311 w_yAccumulator = 0;
SED9008 0:ad88907cf227 312 w_zAccumulator = 0;
SED9008 0:ad88907cf227 313
SED9008 0:ad88907cf227 314 //Take a number of readings and average them
SED9008 0:ad88907cf227 315 //to calculate the gyroscope bias offset.
SED9008 0:ad88907cf227 316 for (int i = 0; i < CALIBRATION_SAMPLES; i++) {
SED9008 0:ad88907cf227 317 int g[3];
SED9008 0:ad88907cf227 318 gyroscope.read(g);
SED9008 0:ad88907cf227 319 w_xAccumulator += g[0];
SED9008 0:ad88907cf227 320 w_yAccumulator += g[1];
SED9008 0:ad88907cf227 321 w_zAccumulator += g[2];
SED9008 0:ad88907cf227 322 wait(GYRO_RATE);
SED9008 0:ad88907cf227 323
SED9008 0:ad88907cf227 324 }
SED9008 0:ad88907cf227 325
SED9008 0:ad88907cf227 326 //Average the samples.
SED9008 0:ad88907cf227 327 w_xAccumulator /= CALIBRATION_SAMPLES;
SED9008 0:ad88907cf227 328 w_yAccumulator /= CALIBRATION_SAMPLES;
SED9008 0:ad88907cf227 329 w_zAccumulator /= CALIBRATION_SAMPLES;
SED9008 0:ad88907cf227 330
SED9008 0:ad88907cf227 331 w_xBias = w_xAccumulator;
SED9008 0:ad88907cf227 332 w_yBias = w_yAccumulator;
SED9008 0:ad88907cf227 333 w_zBias = w_zAccumulator;
SED9008 0:ad88907cf227 334
SED9008 0:ad88907cf227 335 w_xAccumulator = 0;
SED9008 0:ad88907cf227 336 w_yAccumulator = 0;
SED9008 0:ad88907cf227 337 w_zAccumulator = 0;
SED9008 0:ad88907cf227 338
SED9008 0:ad88907cf227 339 }
SED9008 0:ad88907cf227 340
SED9008 0:ad88907cf227 341
SED9008 0:ad88907cf227 342
SED9008 0:ad88907cf227 343 void tcp_send( const char* data ){
SED9008 0:ad88907cf227 344 int len = strlen(data);
SED9008 0:ad88907cf227 345 pConnectedSock->send(data, len);
SED9008 0:ad88907cf227 346 }
SED9008 0:ad88907cf227 347
SED9008 0:ad88907cf227 348 void onConnectedTCPSocketEvent(TCPSocketEvent e)
SED9008 0:ad88907cf227 349 {
SED9008 0:ad88907cf227 350 switch(e)
SED9008 0:ad88907cf227 351 {
SED9008 0:ad88907cf227 352 case TCPSOCKET_CONNECTED:
SED9008 0:ad88907cf227 353 printf("TCP Socket Connected\r\n");
SED9008 0:ad88907cf227 354 break;
SED9008 0:ad88907cf227 355 case TCPSOCKET_WRITEABLE:
SED9008 0:ad88907cf227 356 //Can now write some data...
SED9008 0:ad88907cf227 357 printf("TCP Socket Writable\r\n");
SED9008 0:ad88907cf227 358 break;
SED9008 0:ad88907cf227 359 case TCPSOCKET_READABLE:
SED9008 0:ad88907cf227 360 //Can now read dome data...
SED9008 0:ad88907cf227 361 printf("TCP Socket Readable\r\n");
SED9008 0:ad88907cf227 362 // Read in any available data into the buffer
SED9008 0:ad88907cf227 363 char buff[128];
SED9008 0:ad88907cf227 364 while ( int len = pConnectedSock->recv(buff, 128) ) {
SED9008 0:ad88907cf227 365 // And send straight back out again
SED9008 0:ad88907cf227 366 // pConnectedSock->send(buff, len);
SED9008 0:ad88907cf227 367 int test = buff[0];
SED9008 0:ad88907cf227 368 char buffer[128];
SED9008 0:ad88907cf227 369 sprintf(buffer, "|%i|\r\n", test);
SED9008 0:ad88907cf227 370 tcp_send(buffer);
SED9008 0:ad88907cf227 371 if(test == 115) {connected = 1;}
SED9008 0:ad88907cf227 372 /* if(test == 49) {m1_set += 0.00001;}
SED9008 0:ad88907cf227 373 if(test == 50) {m2_set += 0.00001;}
SED9008 0:ad88907cf227 374 if(test == 51) {m3_set += 0.00001;}
SED9008 0:ad88907cf227 375 if(test == 52) {m4_set += 0.00001;}
SED9008 0:ad88907cf227 376 if(test == 113) {m1_set -= 0.00001;}
SED9008 0:ad88907cf227 377 if(test == 119) {m2_set -= 0.00001;}
SED9008 0:ad88907cf227 378 if(test == 101) {m3_set -= 0.00001;}
SED9008 0:ad88907cf227 379 if(test == 114) {m4_set -= 0.00001;}
SED9008 0:ad88907cf227 380 if(test == 107) {
SED9008 0:ad88907cf227 381 m1_set = 0.0011;
SED9008 0:ad88907cf227 382 m2_set = 0.0011;
SED9008 0:ad88907cf227 383 m3_set = 0.0011;
SED9008 0:ad88907cf227 384 m4_set = 0.0011;}*/
SED9008 0:ad88907cf227 385
SED9008 0:ad88907cf227 386
SED9008 0:ad88907cf227 387 buff[len]=0; // make terminater
SED9008 0:ad88907cf227 388 printf("Received&Wrote:%s\r\n",buff);
SED9008 0:ad88907cf227 389 }
SED9008 0:ad88907cf227 390 break;
SED9008 0:ad88907cf227 391 case TCPSOCKET_CONTIMEOUT:
SED9008 0:ad88907cf227 392 printf("TCP Socket Timeout\r\n");
SED9008 0:ad88907cf227 393 break;
SED9008 0:ad88907cf227 394 case TCPSOCKET_CONRST:
SED9008 0:ad88907cf227 395 printf("TCP Socket CONRST\r\n");
SED9008 0:ad88907cf227 396 break;
SED9008 0:ad88907cf227 397 case TCPSOCKET_CONABRT:
SED9008 0:ad88907cf227 398 printf("TCP Socket CONABRT\r\n");
SED9008 0:ad88907cf227 399 break;
SED9008 0:ad88907cf227 400 case TCPSOCKET_ERROR:
SED9008 0:ad88907cf227 401 printf("TCP Socket Error\r\n");
SED9008 0:ad88907cf227 402 break;
SED9008 0:ad88907cf227 403 case TCPSOCKET_DISCONNECTED:
SED9008 0:ad88907cf227 404 //Close socket...
SED9008 0:ad88907cf227 405 printf("TCP Socket Disconnected\r\n");
SED9008 0:ad88907cf227 406 pConnectedSock->close();
SED9008 0:ad88907cf227 407 break;
SED9008 0:ad88907cf227 408 default:
SED9008 0:ad88907cf227 409 printf("DEFAULT\r\n");
SED9008 0:ad88907cf227 410 }
SED9008 0:ad88907cf227 411 }
SED9008 0:ad88907cf227 412
SED9008 0:ad88907cf227 413
SED9008 0:ad88907cf227 414 void onListeningTCPSocketEvent(TCPSocketEvent e)
SED9008 0:ad88907cf227 415 {
SED9008 0:ad88907cf227 416 switch(e)
SED9008 0:ad88907cf227 417 {
SED9008 0:ad88907cf227 418 case TCPSOCKET_ACCEPT:
SED9008 0:ad88907cf227 419 printf("Listening: TCP Socket Accepted\r\n");
SED9008 0:ad88907cf227 420 // Accepts connection from client and gets connected socket.
SED9008 0:ad88907cf227 421 err=ListeningSock.accept(&client, &pConnectedSock);
SED9008 0:ad88907cf227 422 if (err) {
SED9008 0:ad88907cf227 423 printf("onListeningTcpSocketEvent : Could not accept connection.\r\n");
SED9008 0:ad88907cf227 424 return; //Error in accept, discard connection
SED9008 0:ad88907cf227 425 }
SED9008 0:ad88907cf227 426 // Setup the new socket events
SED9008 0:ad88907cf227 427 pConnectedSock->setOnEvent(&onConnectedTCPSocketEvent);
SED9008 0:ad88907cf227 428 // We can find out from where the connection is coming by looking at the
SED9008 0:ad88907cf227 429 // Host parameter of the accept() method
SED9008 0:ad88907cf227 430 IpAddr clientIp = client.getIp();
SED9008 0:ad88907cf227 431 printf("Listening: Incoming TCP connection from %d.%d.%d.%d\r\n",
SED9008 0:ad88907cf227 432 clientIp[0], clientIp[1], clientIp[2], clientIp[3]);
SED9008 0:ad88907cf227 433 break;
SED9008 0:ad88907cf227 434 // the following cases will not happen
SED9008 0:ad88907cf227 435 case TCPSOCKET_CONNECTED:
SED9008 0:ad88907cf227 436 printf("Listening: TCP Socket Connected\r\n");
SED9008 0:ad88907cf227 437 break;
SED9008 0:ad88907cf227 438 case TCPSOCKET_WRITEABLE:
SED9008 0:ad88907cf227 439 printf("Listening: TCP Socket Writable\r\n");
SED9008 0:ad88907cf227 440 break;
SED9008 0:ad88907cf227 441 case TCPSOCKET_READABLE:
SED9008 0:ad88907cf227 442 printf("Listening: TCP Socket Readable\r\n");
SED9008 0:ad88907cf227 443 break;
SED9008 0:ad88907cf227 444 case TCPSOCKET_CONTIMEOUT:
SED9008 0:ad88907cf227 445 printf("Listening: TCP Socket Timeout\r\n");
SED9008 0:ad88907cf227 446 break;
SED9008 0:ad88907cf227 447 case TCPSOCKET_CONRST:
SED9008 0:ad88907cf227 448 printf("Listening: TCP Socket CONRST\r\n");
SED9008 0:ad88907cf227 449 break;
SED9008 0:ad88907cf227 450 case TCPSOCKET_CONABRT:
SED9008 0:ad88907cf227 451 printf("Listening: TCP Socket CONABRT\r\n");
SED9008 0:ad88907cf227 452 break;
SED9008 0:ad88907cf227 453 case TCPSOCKET_ERROR:
SED9008 0:ad88907cf227 454 printf("Listening: TCP Socket Error\r\n");
SED9008 0:ad88907cf227 455 break;
SED9008 0:ad88907cf227 456 case TCPSOCKET_DISCONNECTED:
SED9008 0:ad88907cf227 457 //Close socket...
SED9008 0:ad88907cf227 458 printf("Listening: TCP Socket Disconnected\r\n");
SED9008 0:ad88907cf227 459 ListeningSock.close();
SED9008 0:ad88907cf227 460 break;
SED9008 0:ad88907cf227 461 default:
SED9008 0:ad88907cf227 462 printf("DEFAULT\r\n");
SED9008 0:ad88907cf227 463 };
SED9008 0:ad88907cf227 464 }