Dependencies:   EthernetNetIf mbed ADXL345_I2C

Committer:
SED9008
Date:
Thu Feb 23 13:36:41 2012 +0000
Revision:
0:5abac0d420fc

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
SED9008 0:5abac0d420fc 1 #include "mbed.h"
SED9008 0:5abac0d420fc 2 #include "EthernetNetIf.h"
SED9008 0:5abac0d420fc 3 #include "TCPSocket.h"
SED9008 0:5abac0d420fc 4 #include "ADXL345_I2C.h"
SED9008 0:5abac0d420fc 5
SED9008 0:5abac0d420fc 6 DigitalOut led1(LED1, "led1");
SED9008 0:5abac0d420fc 7 DigitalOut led2(LED2, "led2");
SED9008 0:5abac0d420fc 8 DigitalOut led3(LED3, "led3");
SED9008 0:5abac0d420fc 9 DigitalOut led4(LED4, "led4");
SED9008 0:5abac0d420fc 10 AnalogIn ana_x(p19, "ana_x");
SED9008 0:5abac0d420fc 11 AnalogIn ana_y(p20, "ana_y");
SED9008 0:5abac0d420fc 12 DigitalIn init(p5);
SED9008 0:5abac0d420fc 13 DigitalIn garbage(p6);
SED9008 0:5abac0d420fc 14 DigitalIn closesock(p7);
SED9008 0:5abac0d420fc 15 ADXL345_I2C accelerometer(p9, p10);
SED9008 0:5abac0d420fc 16
SED9008 0:5abac0d420fc 17
SED9008 0:5abac0d420fc 18 EthernetNetIf eth(
SED9008 0:5abac0d420fc 19 IpAddr(192,168,0,16), //IP Address
SED9008 0:5abac0d420fc 20 IpAddr(255,255,255,0), //Network Mask
SED9008 0:5abac0d420fc 21 IpAddr(192,168,0,1), //Gateway
SED9008 0:5abac0d420fc 22 IpAddr(192,168,0,1) //DNS
SED9008 0:5abac0d420fc 23 );
SED9008 0:5abac0d420fc 24
SED9008 0:5abac0d420fc 25
SED9008 0:5abac0d420fc 26 // == stability vars
SED9008 0:5abac0d420fc 27 Ticker routine;
SED9008 0:5abac0d420fc 28
SED9008 0:5abac0d420fc 29 float base_x_0 = 50;
SED9008 0:5abac0d420fc 30 float base_y_0 = 50;
SED9008 0:5abac0d420fc 31 float base_x_1 = 50;
SED9008 0:5abac0d420fc 32 float base_y_1 = 50;
SED9008 0:5abac0d420fc 33 float base_x_2 = 50;
SED9008 0:5abac0d420fc 34 float base_y_2 = 50;
SED9008 0:5abac0d420fc 35 float base_x_3 = 50;
SED9008 0:5abac0d420fc 36 float base_y_3 = 50;
SED9008 0:5abac0d420fc 37
SED9008 0:5abac0d420fc 38 float motor_0 = 50;
SED9008 0:5abac0d420fc 39 float motor_1 = 50;
SED9008 0:5abac0d420fc 40 float motor_2 = 50;
SED9008 0:5abac0d420fc 41 float motor_3 = 50;
SED9008 0:5abac0d420fc 42
SED9008 0:5abac0d420fc 43 float a_motor_0 = motor_0;
SED9008 0:5abac0d420fc 44 float a_motor_1 = motor_1;
SED9008 0:5abac0d420fc 45 float a_motor_2 = motor_2;
SED9008 0:5abac0d420fc 46 float a_motor_3 = motor_3;
SED9008 0:5abac0d420fc 47
SED9008 0:5abac0d420fc 48 long x = 50;
SED9008 0:5abac0d420fc 49 long y = 50;
SED9008 0:5abac0d420fc 50
SED9008 0:5abac0d420fc 51 // == end
SED9008 0:5abac0d420fc 52
SED9008 0:5abac0d420fc 53 int go = 0;
SED9008 0:5abac0d420fc 54 int countertje = 0;
SED9008 0:5abac0d420fc 55
SED9008 0:5abac0d420fc 56 #define TCP_LISTENING_PORT 1337
SED9008 0:5abac0d420fc 57
SED9008 0:5abac0d420fc 58 TCPSocket ListeningSock; //Listener
SED9008 0:5abac0d420fc 59 TCPSocket* pConnectedSock; // for ConnectedSock
SED9008 0:5abac0d420fc 60 Host client;
SED9008 0:5abac0d420fc 61 TCPSocketErr err;
SED9008 0:5abac0d420fc 62 char data[128];
SED9008 0:5abac0d420fc 63
SED9008 0:5abac0d420fc 64 void sender(const char*);
SED9008 0:5abac0d420fc 65 void interrupt();
SED9008 0:5abac0d420fc 66 void onConnectedTCPSocketEvent( TCPSocketEvent );
SED9008 0:5abac0d420fc 67 void onListeningTCPSocketEvent( TCPSocketEvent );
SED9008 0:5abac0d420fc 68
SED9008 0:5abac0d420fc 69 int main() {
SED9008 0:5abac0d420fc 70
SED9008 0:5abac0d420fc 71 //Go into standby mode to configure the device.
SED9008 0:5abac0d420fc 72 accelerometer.setPowerControl(0x00);
SED9008 0:5abac0d420fc 73
SED9008 0:5abac0d420fc 74 //Full resolution, +/-16g, 4mg/LSB.
SED9008 0:5abac0d420fc 75 accelerometer.setDataFormatControl(0x0B);
SED9008 0:5abac0d420fc 76
SED9008 0:5abac0d420fc 77 //3.2kHz data rate.
SED9008 0:5abac0d420fc 78 accelerometer.setDataRate(ADXL345_3200HZ);
SED9008 0:5abac0d420fc 79
SED9008 0:5abac0d420fc 80 //Measurement mode.
SED9008 0:5abac0d420fc 81 accelerometer.setPowerControl(0x08);
SED9008 0:5abac0d420fc 82
SED9008 0:5abac0d420fc 83 EthernetErr ethErr = eth.setup();
SED9008 0:5abac0d420fc 84 if(ethErr)
SED9008 0:5abac0d420fc 85 {
SED9008 0:5abac0d420fc 86 led3 = 1;
SED9008 0:5abac0d420fc 87 return -1;
SED9008 0:5abac0d420fc 88 }
SED9008 0:5abac0d420fc 89 // Set the callbacks for Listening
SED9008 0:5abac0d420fc 90 ListeningSock.setOnEvent(&onListeningTCPSocketEvent);
SED9008 0:5abac0d420fc 91 // bind and listen on TCP
SED9008 0:5abac0d420fc 92 err=ListeningSock.bind(Host(IpAddr(), TCP_LISTENING_PORT)); // listen on own ipaddres, port 1337
SED9008 0:5abac0d420fc 93 if(err)
SED9008 0:5abac0d420fc 94 {
SED9008 0:5abac0d420fc 95 //Deal with that error...
SED9008 0:5abac0d420fc 96 led3 = 1;
SED9008 0:5abac0d420fc 97 }
SED9008 0:5abac0d420fc 98 err=ListeningSock.listen(); // Starts listening
SED9008 0:5abac0d420fc 99 if(err)
SED9008 0:5abac0d420fc 100 {
SED9008 0:5abac0d420fc 101 led3 = 1;
SED9008 0:5abac0d420fc 102 }
SED9008 0:5abac0d420fc 103 routine.attach(&interrupt, 1);
SED9008 0:5abac0d420fc 104 Timer timer;
SED9008 0:5abac0d420fc 105 timer.start();
SED9008 0:5abac0d420fc 106 while(true)
SED9008 0:5abac0d420fc 107 {
SED9008 0:5abac0d420fc 108 Net::poll(); //poll TCPstack
SED9008 0:5abac0d420fc 109 while(init) {
SED9008 0:5abac0d420fc 110 if(!init){
SED9008 0:5abac0d420fc 111 sender("220 Connected\n");
SED9008 0:5abac0d420fc 112 go=1;
SED9008 0:5abac0d420fc 113 break;
SED9008 0:5abac0d420fc 114
SED9008 0:5abac0d420fc 115 }
SED9008 0:5abac0d420fc 116 }
SED9008 0:5abac0d420fc 117 while(closesock) {
SED9008 0:5abac0d420fc 118 if(!closesock){
SED9008 0:5abac0d420fc 119 led1=0;
SED9008 0:5abac0d420fc 120 go=0;
SED9008 0:5abac0d420fc 121 pConnectedSock->close();
SED9008 0:5abac0d420fc 122 break;
SED9008 0:5abac0d420fc 123 }
SED9008 0:5abac0d420fc 124 }
SED9008 0:5abac0d420fc 125 if(go){
SED9008 0:5abac0d420fc 126 if(countertje == 10){
SED9008 0:5abac0d420fc 127 countertje = 0;
SED9008 0:5abac0d420fc 128 }
SED9008 0:5abac0d420fc 129 char buffer [128];
SED9008 0:5abac0d420fc 130 sprintf (buffer, "%d\n",countertje);
SED9008 0:5abac0d420fc 131 sender(buffer);
SED9008 0:5abac0d420fc 132 sprintf (buffer, "x: %d\ny: %d\nmotor_0: %f\nmotor_1: %f\nmotor_2: %f\nmotor_3: %f\n", x,y,motor_0,motor_1,motor_2,motor_3);
SED9008 0:5abac0d420fc 133 sender(buffer);
SED9008 0:5abac0d420fc 134 char receive[128];
SED9008 0:5abac0d420fc 135 while ( int len = pConnectedSock->recv(receive, 128) ) {
SED9008 0:5abac0d420fc 136 led2 != led2;
SED9008 0:5abac0d420fc 137 if(strcmp(receive,"Got it!")==0){
SED9008 0:5abac0d420fc 138 led2 = 0;
SED9008 0:5abac0d420fc 139 break;
SED9008 0:5abac0d420fc 140 }
SED9008 0:5abac0d420fc 141 }
SED9008 0:5abac0d420fc 142 /*
SED9008 0:5abac0d420fc 143 sprintf (buffer, "y: %d\n", y);
SED9008 0:5abac0d420fc 144 sender(buffer);
SED9008 0:5abac0d420fc 145 sprintf (buffer, "motor_0: %d\n", motor_0);
SED9008 0:5abac0d420fc 146 sender(buffer);
SED9008 0:5abac0d420fc 147 sprintf (buffer, "motor_1: %d\n", motor_1);
SED9008 0:5abac0d420fc 148 sender(buffer);
SED9008 0:5abac0d420fc 149 sprintf (buffer, "motor_2: %d\n", motor_2);
SED9008 0:5abac0d420fc 150 sender(buffer);
SED9008 0:5abac0d420fc 151 sprintf (buffer, "motor_3: %d\n", motor_3);
SED9008 0:5abac0d420fc 152 sender(buffer); */
SED9008 0:5abac0d420fc 153 countertje++;
SED9008 0:5abac0d420fc 154 }
SED9008 0:5abac0d420fc 155 if(timer.read() > 0.2)
SED9008 0:5abac0d420fc 156 {
SED9008 0:5abac0d420fc 157 led4=!led4; //Status light toggle
SED9008 0:5abac0d420fc 158 timer.reset();
SED9008 0:5abac0d420fc 159 }
SED9008 0:5abac0d420fc 160 }
SED9008 0:5abac0d420fc 161 }
SED9008 0:5abac0d420fc 162
SED9008 0:5abac0d420fc 163 void sender( const char* data ){
SED9008 0:5abac0d420fc 164 int len = strlen(data);
SED9008 0:5abac0d420fc 165 pConnectedSock->send(data, len);
SED9008 0:5abac0d420fc 166 }
SED9008 0:5abac0d420fc 167
SED9008 0:5abac0d420fc 168
SED9008 0:5abac0d420fc 169 void interrupt()
SED9008 0:5abac0d420fc 170 {
SED9008 0:5abac0d420fc 171 x = accelerometer.getAx();
SED9008 0:5abac0d420fc 172 y = accelerometer.getAy();
SED9008 0:5abac0d420fc 173
SED9008 0:5abac0d420fc 174 a_motor_0 = a_motor_0-((((base_x_0-x)/2)+((base_x_0-y)/2))/1000);
SED9008 0:5abac0d420fc 175 if(a_motor_0>99){
SED9008 0:5abac0d420fc 176 motor_0 = 100;}
SED9008 0:5abac0d420fc 177 else if(a_motor_0 < 1){
SED9008 0:5abac0d420fc 178 motor_0 = 0;}
SED9008 0:5abac0d420fc 179 else{
SED9008 0:5abac0d420fc 180 motor_0 = a_motor_0;}
SED9008 0:5abac0d420fc 181 a_motor_1 = a_motor_1-((((base_x_1-x)/2)-((base_x_1-y)/2))/1000);
SED9008 0:5abac0d420fc 182 if(a_motor_1>99){
SED9008 0:5abac0d420fc 183 motor_1 = 100;}
SED9008 0:5abac0d420fc 184 else if(a_motor_1 < 1){
SED9008 0:5abac0d420fc 185 motor_1 = 0;}
SED9008 0:5abac0d420fc 186 else{
SED9008 0:5abac0d420fc 187 motor_1 = a_motor_1;}
SED9008 0:5abac0d420fc 188 a_motor_2 = a_motor_2+((((base_x_2-x)/2)-((base_x_2-y)/2))/1000);
SED9008 0:5abac0d420fc 189 if(a_motor_2>99){
SED9008 0:5abac0d420fc 190 motor_2 = 100;}
SED9008 0:5abac0d420fc 191 else if(a_motor_2 < 1){
SED9008 0:5abac0d420fc 192 motor_2 = 0;}
SED9008 0:5abac0d420fc 193 else{
SED9008 0:5abac0d420fc 194 motor_2 = a_motor_2;}
SED9008 0:5abac0d420fc 195 a_motor_3 = a_motor_3+((((base_x_3-x)/2)+((base_x_3-y)/2))/1000);
SED9008 0:5abac0d420fc 196 if(a_motor_3>99){
SED9008 0:5abac0d420fc 197 motor_3 = 100;}
SED9008 0:5abac0d420fc 198 else if(a_motor_3 < 1){
SED9008 0:5abac0d420fc 199 motor_3 = 0;}
SED9008 0:5abac0d420fc 200 else{
SED9008 0:5abac0d420fc 201 motor_3 = a_motor_3;}
SED9008 0:5abac0d420fc 202 }
SED9008 0:5abac0d420fc 203
SED9008 0:5abac0d420fc 204 void onConnectedTCPSocketEvent(TCPSocketEvent e)
SED9008 0:5abac0d420fc 205 {
SED9008 0:5abac0d420fc 206 switch(e)
SED9008 0:5abac0d420fc 207 {
SED9008 0:5abac0d420fc 208 case TCPSOCKET_CONNECTED:
SED9008 0:5abac0d420fc 209 led1 = 1;
SED9008 0:5abac0d420fc 210 break;
SED9008 0:5abac0d420fc 211 case TCPSOCKET_WRITEABLE:
SED9008 0:5abac0d420fc 212 //Can now write some data...
SED9008 0:5abac0d420fc 213 led1 = 1;
SED9008 0:5abac0d420fc 214 break;
SED9008 0:5abac0d420fc 215 case TCPSOCKET_READABLE:
SED9008 0:5abac0d420fc 216 //Can now read dome data...
SED9008 0:5abac0d420fc 217 led1 = 1;
SED9008 0:5abac0d420fc 218 // Read in any available data into the buffer
SED9008 0:5abac0d420fc 219 char buff[128];
SED9008 0:5abac0d420fc 220 while ( int len = pConnectedSock->recv(buff, 128) ) {
SED9008 0:5abac0d420fc 221 // And send straight back out again
SED9008 0:5abac0d420fc 222
SED9008 0:5abac0d420fc 223 //pConnectedSock->send(buff, len);
SED9008 0:5abac0d420fc 224 //buff[len]=0; // make terminater
SED9008 0:5abac0d420fc 225 led2 != led2;
SED9008 0:5abac0d420fc 226 strcpy(data,buff);
SED9008 0:5abac0d420fc 227 }
SED9008 0:5abac0d420fc 228 break;
SED9008 0:5abac0d420fc 229 case TCPSOCKET_CONTIMEOUT:
SED9008 0:5abac0d420fc 230 printf("TCP Socket Timeout\r\n");
SED9008 0:5abac0d420fc 231 break;
SED9008 0:5abac0d420fc 232 case TCPSOCKET_CONRST:
SED9008 0:5abac0d420fc 233 printf("TCP Socket CONRST\r\n");
SED9008 0:5abac0d420fc 234 break;
SED9008 0:5abac0d420fc 235 case TCPSOCKET_CONABRT:
SED9008 0:5abac0d420fc 236 printf("TCP Socket CONABRT\r\n");
SED9008 0:5abac0d420fc 237 break;
SED9008 0:5abac0d420fc 238 case TCPSOCKET_ERROR:
SED9008 0:5abac0d420fc 239 printf("TCP Socket Error\r\n");
SED9008 0:5abac0d420fc 240 break;
SED9008 0:5abac0d420fc 241 case TCPSOCKET_DISCONNECTED:
SED9008 0:5abac0d420fc 242 //Close socket...
SED9008 0:5abac0d420fc 243 printf("TCP Socket Disconnected\r\n");
SED9008 0:5abac0d420fc 244 pConnectedSock->close();
SED9008 0:5abac0d420fc 245 led1=0;
SED9008 0:5abac0d420fc 246 break;
SED9008 0:5abac0d420fc 247 default:
SED9008 0:5abac0d420fc 248 printf("DEFAULT\r\n");
SED9008 0:5abac0d420fc 249 }
SED9008 0:5abac0d420fc 250 }
SED9008 0:5abac0d420fc 251
SED9008 0:5abac0d420fc 252
SED9008 0:5abac0d420fc 253 void onListeningTCPSocketEvent(TCPSocketEvent e)
SED9008 0:5abac0d420fc 254 {
SED9008 0:5abac0d420fc 255 switch(e)
SED9008 0:5abac0d420fc 256 {
SED9008 0:5abac0d420fc 257 case TCPSOCKET_ACCEPT:
SED9008 0:5abac0d420fc 258 printf("Listening: TCP Socket Accepted\r\n");
SED9008 0:5abac0d420fc 259 // Accepts connection from client and gets connected socket.
SED9008 0:5abac0d420fc 260 err=ListeningSock.accept(&client, &pConnectedSock);
SED9008 0:5abac0d420fc 261 if (err) {
SED9008 0:5abac0d420fc 262 led3 = 1;
SED9008 0:5abac0d420fc 263 return; //Error in accept, discard connection
SED9008 0:5abac0d420fc 264 }
SED9008 0:5abac0d420fc 265 // Setup the new socket events
SED9008 0:5abac0d420fc 266 pConnectedSock->setOnEvent(&onConnectedTCPSocketEvent);
SED9008 0:5abac0d420fc 267 // We can find out from where the connection is coming by looking at the
SED9008 0:5abac0d420fc 268 // Host parameter of the accept() method
SED9008 0:5abac0d420fc 269 IpAddr clientIp = client.getIp();
SED9008 0:5abac0d420fc 270 printf("Listening: Incoming TCP connection from %d.%d.%d.%d\r\n",
SED9008 0:5abac0d420fc 271 clientIp[0], clientIp[1], clientIp[2], clientIp[3]);
SED9008 0:5abac0d420fc 272 break;
SED9008 0:5abac0d420fc 273 // the following cases will not happen
SED9008 0:5abac0d420fc 274 case TCPSOCKET_CONNECTED:
SED9008 0:5abac0d420fc 275 printf("Listening: TCP Socket Connected\r\n");
SED9008 0:5abac0d420fc 276 break;
SED9008 0:5abac0d420fc 277 case TCPSOCKET_WRITEABLE:
SED9008 0:5abac0d420fc 278 printf("Listening: TCP Socket Writable\r\n");
SED9008 0:5abac0d420fc 279 break;
SED9008 0:5abac0d420fc 280 case TCPSOCKET_READABLE:
SED9008 0:5abac0d420fc 281 printf("Listening: TCP Socket Readable\r\n");
SED9008 0:5abac0d420fc 282 break;
SED9008 0:5abac0d420fc 283 case TCPSOCKET_CONTIMEOUT:
SED9008 0:5abac0d420fc 284 printf("Listening: TCP Socket Timeout\r\n");
SED9008 0:5abac0d420fc 285 break;
SED9008 0:5abac0d420fc 286 case TCPSOCKET_CONRST:
SED9008 0:5abac0d420fc 287 printf("Listening: TCP Socket CONRST\r\n");
SED9008 0:5abac0d420fc 288 break;
SED9008 0:5abac0d420fc 289 case TCPSOCKET_CONABRT:
SED9008 0:5abac0d420fc 290 printf("Listening: TCP Socket CONABRT\r\n");
SED9008 0:5abac0d420fc 291 break;
SED9008 0:5abac0d420fc 292 case TCPSOCKET_ERROR:
SED9008 0:5abac0d420fc 293 led3 = 1;
SED9008 0:5abac0d420fc 294 break;
SED9008 0:5abac0d420fc 295 case TCPSOCKET_DISCONNECTED:
SED9008 0:5abac0d420fc 296 //Close socket...
SED9008 0:5abac0d420fc 297 printf("Listening: TCP Socket Disconnected\r\n");
SED9008 0:5abac0d420fc 298 ListeningSock.close();
SED9008 0:5abac0d420fc 299 break;
SED9008 0:5abac0d420fc 300 default:
SED9008 0:5abac0d420fc 301 printf("DEFAULT\r\n");
SED9008 0:5abac0d420fc 302 };
SED9008 0:5abac0d420fc 303 }