UvA NetCentric Computing listener

Dependencies:   AndroidAccessory mbed

Committer:
diepvriezer
Date:
Thu May 22 08:33:12 2014 +0000
Revision:
0:0f9ceecf1db8
Initial commit

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