UvA NetCentric Computing listener

Dependencies:   AndroidAccessory Controls HBridge MotorController mbed

Fork of uva_nc by Jurgen Baas

Committer:
jurgy
Date:
Wed Jan 06 13:28:45 2016 +0000
Revision:
1:3cde55629b1d
Parent:
0:0f9ceecf1db8
Child:
3:0229ad4f2db1
motor support

Who changed what in which revision?

UserRevisionLine numberNew contents of line
diepvriezer 0:0f9ceecf1db8 1 #include "NetCentricApp.h"
diepvriezer 0:0f9ceecf1db8 2 #include "MbedCommand.h"
jurgy 1:3cde55629b1d 3 #include "HBridge.h"
jurgy 1:3cde55629b1d 4 #include "MotorController.h"
jurgy 1:3cde55629b1d 5 #include "PcControls.h"
diepvriezer 0:0f9ceecf1db8 6
diepvriezer 0:0f9ceecf1db8 7 // Process commands here.
diepvriezer 0:0f9ceecf1db8 8 MbedResponse *NetCentricApp::getResponse(MbedRequest *request) {
diepvriezer 0:0f9ceecf1db8 9 if (request->commandId == COMMAND_SUM) {
diepvriezer 0:0f9ceecf1db8 10 return sumCommand(request);
diepvriezer 0:0f9ceecf1db8 11 } else if (request->commandId == COMMAND_AVG) {
diepvriezer 0:0f9ceecf1db8 12 return avgCommand(request);
diepvriezer 0:0f9ceecf1db8 13 } else if (request->commandId == COMMAND_LED) {
diepvriezer 0:0f9ceecf1db8 14 return ledCommand(request);
jurgy 1:3cde55629b1d 15 } else if (request->commandId == COMMAND_MOTOR) {
jurgy 1:3cde55629b1d 16 return motorCommand(request);
diepvriezer 0:0f9ceecf1db8 17 }
diepvriezer 0:0f9ceecf1db8 18
diepvriezer 0:0f9ceecf1db8 19 MbedResponse *commandNotFound = new MbedResponse();
diepvriezer 0:0f9ceecf1db8 20 commandNotFound->requestId = request->id;
diepvriezer 0:0f9ceecf1db8 21 commandNotFound->commandId = request->commandId;
diepvriezer 0:0f9ceecf1db8 22 commandNotFound->error = ERR_COMMAND_NOT_FOUND;
diepvriezer 0:0f9ceecf1db8 23 commandNotFound->n = 0;
diepvriezer 0:0f9ceecf1db8 24 commandNotFound->values = NULL;
diepvriezer 0:0f9ceecf1db8 25
diepvriezer 0:0f9ceecf1db8 26 return commandNotFound;
diepvriezer 0:0f9ceecf1db8 27 }
diepvriezer 0:0f9ceecf1db8 28
diepvriezer 0:0f9ceecf1db8 29 // Sample commands.
diepvriezer 0:0f9ceecf1db8 30 MbedResponse *NetCentricApp::sumCommand(MbedRequest *request) {
diepvriezer 0:0f9ceecf1db8 31 float sum = 0.0f;
diepvriezer 0:0f9ceecf1db8 32 for (int i = 0; i < request->n; i++) {
diepvriezer 0:0f9ceecf1db8 33 sum += request->args[i];
diepvriezer 0:0f9ceecf1db8 34 }
diepvriezer 0:0f9ceecf1db8 35
diepvriezer 0:0f9ceecf1db8 36 MbedResponse *r = new MbedResponse();
diepvriezer 0:0f9ceecf1db8 37 r->requestId = request->id;
diepvriezer 0:0f9ceecf1db8 38 r->commandId = request->commandId;
diepvriezer 0:0f9ceecf1db8 39 r->error = NO_ERROR;
diepvriezer 0:0f9ceecf1db8 40 r->n = 1;
diepvriezer 0:0f9ceecf1db8 41 r->values = new float[1];
diepvriezer 0:0f9ceecf1db8 42 r->values[0] = sum;
diepvriezer 0:0f9ceecf1db8 43 return r;
diepvriezer 0:0f9ceecf1db8 44 }
diepvriezer 0:0f9ceecf1db8 45
diepvriezer 0:0f9ceecf1db8 46 MbedResponse *NetCentricApp::avgCommand(MbedRequest *request) {
diepvriezer 0:0f9ceecf1db8 47 float sum = 0.0f;
diepvriezer 0:0f9ceecf1db8 48 for (int i = 0; i < request->n; i++) {
diepvriezer 0:0f9ceecf1db8 49 sum += request->args[i];
diepvriezer 0:0f9ceecf1db8 50 }
diepvriezer 0:0f9ceecf1db8 51
diepvriezer 0:0f9ceecf1db8 52 MbedResponse *r = new MbedResponse();
diepvriezer 0:0f9ceecf1db8 53 r->requestId = request->id;
diepvriezer 0:0f9ceecf1db8 54 r->commandId = request->commandId;
diepvriezer 0:0f9ceecf1db8 55 r->error = NO_ERROR;
diepvriezer 0:0f9ceecf1db8 56 r->n = 1;
diepvriezer 0:0f9ceecf1db8 57 r->values = new float[1];
diepvriezer 0:0f9ceecf1db8 58
diepvriezer 0:0f9ceecf1db8 59 if (request->n > 0) {
diepvriezer 0:0f9ceecf1db8 60 r->values[0] = sum / request->n;
diepvriezer 0:0f9ceecf1db8 61 } else {
diepvriezer 0:0f9ceecf1db8 62 r->values[0] = sum;
diepvriezer 0:0f9ceecf1db8 63 }
diepvriezer 0:0f9ceecf1db8 64 return r;
diepvriezer 0:0f9ceecf1db8 65 }
diepvriezer 0:0f9ceecf1db8 66
diepvriezer 0:0f9ceecf1db8 67 // Control the LED's.
diepvriezer 0:0f9ceecf1db8 68 MbedResponse *NetCentricApp::ledCommand(MbedRequest *request) {
diepvriezer 0:0f9ceecf1db8 69 DigitalOut led1(LED1);
diepvriezer 0:0f9ceecf1db8 70 DigitalOut led2(LED2);
diepvriezer 0:0f9ceecf1db8 71 DigitalOut led3(LED3);
diepvriezer 0:0f9ceecf1db8 72 DigitalOut led4(LED4);
diepvriezer 0:0f9ceecf1db8 73
diepvriezer 0:0f9ceecf1db8 74 if (request->n > 0) led1 = request->args[0];
diepvriezer 0:0f9ceecf1db8 75 if (request->n > 1) led2 = request->args[1];
diepvriezer 0:0f9ceecf1db8 76 if (request->n > 2) led3 = request->args[2];
diepvriezer 0:0f9ceecf1db8 77 if (request->n > 3) led4 = request->args[3];
diepvriezer 0:0f9ceecf1db8 78
diepvriezer 0:0f9ceecf1db8 79 MbedResponse *r = new MbedResponse();
diepvriezer 0:0f9ceecf1db8 80 r->requestId = request->id;
diepvriezer 0:0f9ceecf1db8 81 r->commandId = request->commandId;
diepvriezer 0:0f9ceecf1db8 82 r->error = NO_ERROR;
diepvriezer 0:0f9ceecf1db8 83 r->n = 4;
diepvriezer 0:0f9ceecf1db8 84 r->values = new float[4];
diepvriezer 0:0f9ceecf1db8 85 r->values[0] = led1;
diepvriezer 0:0f9ceecf1db8 86 r->values[1] = led2;
diepvriezer 0:0f9ceecf1db8 87 r->values[2] = led3;
diepvriezer 0:0f9ceecf1db8 88 r->values[3] = led4;
diepvriezer 0:0f9ceecf1db8 89
diepvriezer 0:0f9ceecf1db8 90 return r;
diepvriezer 0:0f9ceecf1db8 91 }
diepvriezer 0:0f9ceecf1db8 92
jurgy 1:3cde55629b1d 93 // Move the motor
jurgy 1:3cde55629b1d 94 MbedResponse *NetCentricApp::motorCommand(MbedRequest *request) {
jurgy 1:3cde55629b1d 95 // HBridge, AnalogIn
jurgy 1:3cde55629b1d 96 AnalogIn motorInput(p16);
jurgy 1:3cde55629b1d 97 DigitalOut outSignal(p18);
jurgy 1:3cde55629b1d 98
jurgy 1:3cde55629b1d 99 HBridge motor(p18,p15,p22);
jurgy 1:3cde55629b1d 100
jurgy 1:3cde55629b1d 101 // MotorController, PcControls
jurgy 1:3cde55629b1d 102 MotorController motorController(motor, motorInput);
jurgy 1:3cde55629b1d 103 MotorControlsPc pcControls(motorController);
jurgy 1:3cde55629b1d 104
jurgy 1:3cde55629b1d 105 // process the input
jurgy 1:3cde55629b1d 106 char c = (char) request->args[0];
jurgy 1:3cde55629b1d 107 pcControls.ProcessPcInput(c);
jurgy 1:3cde55629b1d 108
jurgy 1:3cde55629b1d 109 // generate response
jurgy 1:3cde55629b1d 110 MbedResponse *r = new MbedResponse();
jurgy 1:3cde55629b1d 111 r->requestId = request->id;
jurgy 1:3cde55629b1d 112 r->commandId = request->commandId;
jurgy 1:3cde55629b1d 113 r->error = NO_ERROR;
jurgy 1:3cde55629b1d 114 r->n = 5;
jurgy 1:3cde55629b1d 115
jurgy 1:3cde55629b1d 116 return r;
jurgy 1:3cde55629b1d 117 }
jurgy 1:3cde55629b1d 118
diepvriezer 0:0f9ceecf1db8 119 // Setup once a device is connected.
diepvriezer 0:0f9ceecf1db8 120 void NetCentricApp::setupDevice() {
diepvriezer 0:0f9ceecf1db8 121 printf("Connected to Android!\r\n");
diepvriezer 0:0f9ceecf1db8 122 }
diepvriezer 0:0f9ceecf1db8 123
diepvriezer 0:0f9ceecf1db8 124 // Called on disconnect.
diepvriezer 0:0f9ceecf1db8 125 void NetCentricApp::resetDevice() {
diepvriezer 0:0f9ceecf1db8 126 printf("Disconnected\r\n");
diepvriezer 0:0f9ceecf1db8 127 }
diepvriezer 0:0f9ceecf1db8 128
diepvriezer 0:0f9ceecf1db8 129
diepvriezer 0:0f9ceecf1db8 130 // Construction of requests.
diepvriezer 0:0f9ceecf1db8 131 int NetCentricApp::callbackRead(u8 *buffer, int len) {
diepvriezer 0:0f9ceecf1db8 132 if (len > 0) {
diepvriezer 0:0f9ceecf1db8 133 // Parse request, format:
diepvriezer 0:0f9ceecf1db8 134 // int - request ID
diepvriezer 0:0f9ceecf1db8 135 // int - command ID
diepvriezer 0:0f9ceecf1db8 136 // ubyte - # args
diepvriezer 0:0f9ceecf1db8 137 // float[] -- args
diepvriezer 0:0f9ceecf1db8 138
diepvriezer 0:0f9ceecf1db8 139 // Note len is fixed as the packet is always equally big. Don't try to use
diepvriezer 0:0f9ceecf1db8 140 // packets of variable size, the smallest size of a encountered packet is
diepvriezer 0:0f9ceecf1db8 141 // used.
diepvriezer 0:0f9ceecf1db8 142
diepvriezer 0:0f9ceecf1db8 143 MbedRequest *request = new MbedRequest();
diepvriezer 0:0f9ceecf1db8 144
diepvriezer 0:0f9ceecf1db8 145 request->id = getInt(buffer, 0, len);
diepvriezer 0:0f9ceecf1db8 146 request->commandId = getInt(buffer, 4, len);
diepvriezer 0:0f9ceecf1db8 147 request->n = getInt(buffer, 8, len);
diepvriezer 0:0f9ceecf1db8 148 request->args = NULL;
diepvriezer 0:0f9ceecf1db8 149
diepvriezer 0:0f9ceecf1db8 150 printf("request: %i, command: %i, n-args: %i\r\n", request->id, request->commandId, request->n);
diepvriezer 0:0f9ceecf1db8 151
diepvriezer 0:0f9ceecf1db8 152 int n = request->n;
diepvriezer 0:0f9ceecf1db8 153 if (n > 0) {
diepvriezer 0:0f9ceecf1db8 154 request->args = new float[n];
diepvriezer 0:0f9ceecf1db8 155 for (int i = 0; i < n; i++) {
diepvriezer 0:0f9ceecf1db8 156 int offset = 12 + (i * 4);
diepvriezer 0:0f9ceecf1db8 157 float f = getFloat(buffer, offset, len);
diepvriezer 0:0f9ceecf1db8 158 request->args[i] = f;
diepvriezer 0:0f9ceecf1db8 159 }
diepvriezer 0:0f9ceecf1db8 160 }
diepvriezer 0:0f9ceecf1db8 161
diepvriezer 0:0f9ceecf1db8 162 // Construct and send response.
diepvriezer 0:0f9ceecf1db8 163 MbedResponse *response = getResponse(request);
diepvriezer 0:0f9ceecf1db8 164 int responseSize = 4 + 4 + 4 + 4 + (response->n*4);
diepvriezer 0:0f9ceecf1db8 165 u8 responseBuffer[responseSize];
diepvriezer 0:0f9ceecf1db8 166
diepvriezer 0:0f9ceecf1db8 167 memcpy(responseBuffer + 0, reinterpret_cast<u8 const *>(&response->requestId), 4);
diepvriezer 0:0f9ceecf1db8 168 memcpy(responseBuffer + 4, reinterpret_cast<u8 const *>(&response->commandId), 4);
diepvriezer 0:0f9ceecf1db8 169 memcpy(responseBuffer + 8, reinterpret_cast<u8 const *>(&response->error), 4);
diepvriezer 0:0f9ceecf1db8 170 memcpy(responseBuffer + 12, reinterpret_cast<u8 const *>(&response->n), 4);
diepvriezer 0:0f9ceecf1db8 171 if (response->n > 0) {
diepvriezer 0:0f9ceecf1db8 172 for (int i = 0; i < response->n; i++) {
diepvriezer 0:0f9ceecf1db8 173 float f = response->values[i];
diepvriezer 0:0f9ceecf1db8 174 memcpy(responseBuffer + 16 + i*4, reinterpret_cast<u8 const *>(&f), 4);
diepvriezer 0:0f9ceecf1db8 175 }
diepvriezer 0:0f9ceecf1db8 176
diepvriezer 0:0f9ceecf1db8 177 }
diepvriezer 0:0f9ceecf1db8 178
diepvriezer 0:0f9ceecf1db8 179 write(responseBuffer, responseSize);
diepvriezer 0:0f9ceecf1db8 180
diepvriezer 0:0f9ceecf1db8 181 // Clean up.
diepvriezer 0:0f9ceecf1db8 182 if (request->n > 0) {
diepvriezer 0:0f9ceecf1db8 183 delete[] request->args;
diepvriezer 0:0f9ceecf1db8 184 }
diepvriezer 0:0f9ceecf1db8 185 delete request;
diepvriezer 0:0f9ceecf1db8 186
diepvriezer 0:0f9ceecf1db8 187 if (response->n > 0) {
diepvriezer 0:0f9ceecf1db8 188 delete[] response->values;
diepvriezer 0:0f9ceecf1db8 189 }
diepvriezer 0:0f9ceecf1db8 190 delete response;
diepvriezer 0:0f9ceecf1db8 191 }
diepvriezer 0:0f9ceecf1db8 192
diepvriezer 0:0f9ceecf1db8 193 return 0;
diepvriezer 0:0f9ceecf1db8 194 }
diepvriezer 0:0f9ceecf1db8 195
diepvriezer 0:0f9ceecf1db8 196 // Called to confirm a write operation.
diepvriezer 0:0f9ceecf1db8 197 int NetCentricApp::callbackWrite() {
diepvriezer 0:0f9ceecf1db8 198 return 0;
diepvriezer 0:0f9ceecf1db8 199 }
diepvriezer 0:0f9ceecf1db8 200
diepvriezer 0:0f9ceecf1db8 201
diepvriezer 0:0f9ceecf1db8 202 /* Unsigned byte to primitives. Little endian assumed, Java sends Big endian by default. */
diepvriezer 0:0f9ceecf1db8 203 float NetCentricApp::getFloat(u8 *buffer, int offset, int bufferLen) {
diepvriezer 0:0f9ceecf1db8 204 if (offset + 3 > bufferLen) {
diepvriezer 0:0f9ceecf1db8 205 printf("float index out of bounds!\r\n");
diepvriezer 0:0f9ceecf1db8 206 return 0.0;
diepvriezer 0:0f9ceecf1db8 207 }
diepvriezer 0:0f9ceecf1db8 208
diepvriezer 0:0f9ceecf1db8 209 float f;
diepvriezer 0:0f9ceecf1db8 210 memcpy(&f, buffer + offset, sizeof(f));
diepvriezer 0:0f9ceecf1db8 211 return f;
diepvriezer 0:0f9ceecf1db8 212 }
diepvriezer 0:0f9ceecf1db8 213
diepvriezer 0:0f9ceecf1db8 214 int NetCentricApp::getInt(u8 *buffer, int offset, int bufferLen) {
diepvriezer 0:0f9ceecf1db8 215 if (offset + 3 > bufferLen) {
diepvriezer 0:0f9ceecf1db8 216 printf("int index out of bounds!\r\n");
diepvriezer 0:0f9ceecf1db8 217 return 0;
diepvriezer 0:0f9ceecf1db8 218 }
diepvriezer 0:0f9ceecf1db8 219
diepvriezer 0:0f9ceecf1db8 220 int i;
diepvriezer 0:0f9ceecf1db8 221 memcpy(&i, buffer + offset, sizeof(i));
diepvriezer 0:0f9ceecf1db8 222 return i;
diepvriezer 0:0f9ceecf1db8 223 }
diepvriezer 0:0f9ceecf1db8 224
diepvriezer 0:0f9ceecf1db8 225 u8 NetCentricApp::getUByte(u8 *buffer, int offset, int bufferLen) {
diepvriezer 0:0f9ceecf1db8 226 if (offset > bufferLen) {
diepvriezer 0:0f9ceecf1db8 227 printf("byte index out of bounds!\r\n");
diepvriezer 0:0f9ceecf1db8 228 return 0;
diepvriezer 0:0f9ceecf1db8 229 }
diepvriezer 0:0f9ceecf1db8 230
diepvriezer 0:0f9ceecf1db8 231 u8 b;
diepvriezer 0:0f9ceecf1db8 232 memcpy(&b, buffer + offset, sizeof(b));
diepvriezer 0:0f9ceecf1db8 233 return b;
diepvriezer 0:0f9ceecf1db8 234 }