This program collects raw time series data from the ADC using the NXP board that will later be post processed by PFP Cyber-security cloud base machine learning engine to determine the state of the device.

Dependencies:   FXAS21002 FXOS8700Q

Committer:
vithyat
Date:
Wed Aug 28 19:24:56 2019 +0000
Revision:
0:977e87915078
Child:
1:0c589850480e
init

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vithyat 0:977e87915078 1 // ----------------------------------------------------------------------------
vithyat 0:977e87915078 2 // Copyright 2019 PFP Cybersecurity.
vithyat 0:977e87915078 3 //
vithyat 0:977e87915078 4 // SPDX-License-Identifier: Apache-2.0
vithyat 0:977e87915078 5 //
vithyat 0:977e87915078 6 // Licensed under the Apache License, Version 2.0 (the "License");
vithyat 0:977e87915078 7 // you may not use this file except in compliance with the License.
vithyat 0:977e87915078 8 // You may obtain a copy of the License at
vithyat 0:977e87915078 9 //
vithyat 0:977e87915078 10 // http://www.apache.org/licenses/LICENSE-2.0
vithyat 0:977e87915078 11 //
vithyat 0:977e87915078 12 // Unless required by applicable law or agreed to in writing, software
vithyat 0:977e87915078 13 // distributed under the License is distributed on an "AS IS" BASIS,
vithyat 0:977e87915078 14 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
vithyat 0:977e87915078 15 // See the License for the specific language governing permissions and
vithyat 0:977e87915078 16 // limitations under the License.
vithyat 0:977e87915078 17 // ----------------------------------------------------------------------------
vithyat 0:977e87915078 18 #ifndef MBED_TEST_MODE
vithyat 0:977e87915078 19
vithyat 0:977e87915078 20 #include "mbed.h"
vithyat 0:977e87915078 21
vithyat 0:977e87915078 22 // Default network interface object. Don't forget to change the WiFi SSID/password in mbed_app.json if you're using WiFi.
vithyat 0:977e87915078 23 NetworkInterface *net = NetworkInterface::get_default_instance();
vithyat 0:977e87915078 24
vithyat 0:977e87915078 25 AnalogIn ain(A1);
vithyat 0:977e87915078 26
vithyat 0:977e87915078 27 uint8_t PFP_REGISTER_DIGITIZER = 87;
vithyat 0:977e87915078 28 uint8_t PFP_CLK_FREQ = 11;
vithyat 0:977e87915078 29 uint8_t PFP_ADC_GET_RAW = 3;
vithyat 0:977e87915078 30 uint8_t PFP_ADC_INIT = 0;
vithyat 0:977e87915078 31 uint8_t PFP_TRIG_CONFIG = 26;
vithyat 0:977e87915078 32
vithyat 0:977e87915078 33
vithyat 0:977e87915078 34 ///////////////////////////////////////////////////////////////////////////////////////
vithyat 0:977e87915078 35 struct DeviceData {
vithyat 0:977e87915078 36 int channel;
vithyat 0:977e87915078 37
vithyat 0:977e87915078 38 int numberOfTraces;
vithyat 0:977e87915078 39 int traceLength;
vithyat 0:977e87915078 40
vithyat 0:977e87915078 41 int sampleRate;
vithyat 0:977e87915078 42 int digitizer;
vithyat 0:977e87915078 43
vithyat 0:977e87915078 44 int trigMode;
vithyat 0:977e87915078 45 int trigSource;
vithyat 0:977e87915078 46
vithyat 0:977e87915078 47 float trigLevel;
vithyat 0:977e87915078 48 float trigHyst;
vithyat 0:977e87915078 49
vithyat 0:977e87915078 50 int trigPercentage;
vithyat 0:977e87915078 51 int gain;
vithyat 0:977e87915078 52 };
vithyat 0:977e87915078 53
vithyat 0:977e87915078 54 struct DeviceData deviceData;
vithyat 0:977e87915078 55
vithyat 0:977e87915078 56 int bytesToInt(int8_t b0, int8_t b1, int8_t b2, int8_t b3)
vithyat 0:977e87915078 57 {
vithyat 0:977e87915078 58 int value = (b3 << 24) & 0xff000000
vithyat 0:977e87915078 59 | (b2 << 16) & 0x00ff0000
vithyat 0:977e87915078 60 | (b1 << 8) & 0x0000ff00
vithyat 0:977e87915078 61 | (b0 << 0) & 0x000000ff;
vithyat 0:977e87915078 62 return value;
vithyat 0:977e87915078 63 }
vithyat 0:977e87915078 64
vithyat 0:977e87915078 65 float bytesToFloat(int8_t b0, int8_t b1, int8_t b2, int8_t b3)
vithyat 0:977e87915078 66 {
vithyat 0:977e87915078 67
vithyat 0:977e87915078 68 float val = 0;
vithyat 0:977e87915078 69 unsigned long result = 0;
vithyat 0:977e87915078 70 result |= ((unsigned long) (b0) << 0x18);
vithyat 0:977e87915078 71 result |= ((unsigned long) (b1) << 0x10);
vithyat 0:977e87915078 72 result |= ((unsigned long) (b2) << 0x08);
vithyat 0:977e87915078 73 result |= ((unsigned long) (b3));
vithyat 0:977e87915078 74 memcpy(&val, &result, 4);
vithyat 0:977e87915078 75
vithyat 0:977e87915078 76 return val;
vithyat 0:977e87915078 77 }
vithyat 0:977e87915078 78
vithyat 0:977e87915078 79 int8_t * intToBytes(int value)
vithyat 0:977e87915078 80 {
vithyat 0:977e87915078 81 static int8_t b[4];
vithyat 0:977e87915078 82 b[0] = ((int8_t) (value >> 0));
vithyat 0:977e87915078 83 b[1] = ((int8_t) (value >> 8));
vithyat 0:977e87915078 84 b[2] = ((int8_t) (value >> 16));
vithyat 0:977e87915078 85 b[3] = ((int8_t) (value >> 24));
vithyat 0:977e87915078 86 return b;
vithyat 0:977e87915078 87 }
vithyat 0:977e87915078 88
vithyat 0:977e87915078 89 int8_t * longToBytes(long value)
vithyat 0:977e87915078 90 {
vithyat 0:977e87915078 91 static int8_t b[8];
vithyat 0:977e87915078 92 b[0] = (int8_t) ((value >> 0) & 0xFF);
vithyat 0:977e87915078 93 b[1] = (int8_t) ((value >> 8) & 0xFF);
vithyat 0:977e87915078 94 b[2] = (int8_t) ((value >> 16) & 0xFF);
vithyat 0:977e87915078 95 b[3] = (int8_t) ((value >> 24) & 0xFF);
vithyat 0:977e87915078 96 b[4] = (int8_t) ((value >> 32) & 0xFF);
vithyat 0:977e87915078 97 b[5] = (int8_t) ((value >> 40) & 0xFF);
vithyat 0:977e87915078 98 b[6] = (int8_t) ((value >> 48) & 0xFF);
vithyat 0:977e87915078 99 b[7] = (int8_t) ((value >> 56) & 0xFF);
vithyat 0:977e87915078 100 return b;
vithyat 0:977e87915078 101 }
vithyat 0:977e87915078 102
vithyat 0:977e87915078 103 int8_t * pfp_emon_create_ack_for_client(int commandType, long numberOfBytes)
vithyat 0:977e87915078 104 {
vithyat 0:977e87915078 105 static int8_t b[24];
vithyat 0:977e87915078 106
vithyat 0:977e87915078 107 int8_t *totalBytes = longToBytes(numberOfBytes);
vithyat 0:977e87915078 108 int8_t *successBytes = intToBytes(3);
vithyat 0:977e87915078 109 int8_t *returnBytes = intToBytes(commandType);
vithyat 0:977e87915078 110
vithyat 0:977e87915078 111 // EMON HEADER
vithyat 0:977e87915078 112 b[0] = 69;
vithyat 0:977e87915078 113 b[1] = 77;
vithyat 0:977e87915078 114 b[2] = 79;
vithyat 0:977e87915078 115 b[3] = 78;
vithyat 0:977e87915078 116
vithyat 0:977e87915078 117 // NUMBER OF BYTES
vithyat 0:977e87915078 118 b[4] = totalBytes[0];
vithyat 0:977e87915078 119 b[5] = totalBytes[1];
vithyat 0:977e87915078 120 b[6] = totalBytes[2];
vithyat 0:977e87915078 121 b[7] = totalBytes[3];
vithyat 0:977e87915078 122 b[8] = totalBytes[4];
vithyat 0:977e87915078 123 b[9] = totalBytes[5];
vithyat 0:977e87915078 124 b[10] = totalBytes[6];
vithyat 0:977e87915078 125 b[11] = totalBytes[7];
vithyat 0:977e87915078 126
vithyat 0:977e87915078 127 // SKIP BYTES
vithyat 0:977e87915078 128 b[12] = 0;
vithyat 0:977e87915078 129 b[13] = 0;
vithyat 0:977e87915078 130 b[14] = 0;
vithyat 0:977e87915078 131 b[15] = 0;
vithyat 0:977e87915078 132
vithyat 0:977e87915078 133 // SUCCESS COMMAND
vithyat 0:977e87915078 134 b[16] = successBytes[0];
vithyat 0:977e87915078 135 b[17] = successBytes[1];
vithyat 0:977e87915078 136 b[18] = successBytes[2];
vithyat 0:977e87915078 137 b[19] = successBytes[3];
vithyat 0:977e87915078 138
vithyat 0:977e87915078 139 // RETURN COMMAND
vithyat 0:977e87915078 140 b[20] = returnBytes[0];
vithyat 0:977e87915078 141 b[21] = returnBytes[1];
vithyat 0:977e87915078 142 b[22] = returnBytes[2];
vithyat 0:977e87915078 143 b[23] = returnBytes[3];
vithyat 0:977e87915078 144
vithyat 0:977e87915078 145 return b;
vithyat 0:977e87915078 146 }
vithyat 0:977e87915078 147
vithyat 0:977e87915078 148 ////////////////////////////////////////////////////////////////////////////////////
vithyat 0:977e87915078 149
vithyat 0:977e87915078 150 void startEmonThread(void const *args)
vithyat 0:977e87915078 151 {
vithyat 0:977e87915078 152
vithyat 0:977e87915078 153 printf("The target IP address is '%s'\r\n", net->get_ip_address());
vithyat 0:977e87915078 154
vithyat 0:977e87915078 155 TCPServer srv;
vithyat 0:977e87915078 156 TCPSocket clt_sock;
vithyat 0:977e87915078 157 SocketAddress clt_addr;
vithyat 0:977e87915078 158
vithyat 0:977e87915078 159 /* Open the server on ethernet stack */
vithyat 0:977e87915078 160 srv.open(net);
vithyat 0:977e87915078 161
vithyat 0:977e87915078 162 /* Bind the HTTP port (TCP 80) to the server */
vithyat 0:977e87915078 163 srv.bind(net->get_ip_address(), 7001);
vithyat 0:977e87915078 164
vithyat 0:977e87915078 165 long traceTrack = 0;
vithyat 0:977e87915078 166
vithyat 0:977e87915078 167
vithyat 0:977e87915078 168 //srv.set_blocking(false);
vithyat 0:977e87915078 169 while (true) {
vithyat 0:977e87915078 170 /* Can handle 5 simultaneous connections */
vithyat 0:977e87915078 171 int err= srv.listen(1);
vithyat 0:977e87915078 172 printf("server listening error : %d\r\n",err);
vithyat 0:977e87915078 173
vithyat 0:977e87915078 174 while(1) {
vithyat 0:977e87915078 175
vithyat 0:977e87915078 176 printf("waiting for client connection\r\n");
vithyat 0:977e87915078 177 err = srv.accept(&clt_sock, &clt_addr);
vithyat 0:977e87915078 178 if(err == 0) {
vithyat 0:977e87915078 179 printf("client connected :%s:%d\r\n", clt_addr.get_ip_address(), clt_addr.get_port());
vithyat 0:977e87915078 180 int MAX_LEN = 80;
vithyat 0:977e87915078 181 int8_t bytes[MAX_LEN];
vithyat 0:977e87915078 182 int32_t rawDataLen = 2048;
vithyat 0:977e87915078 183 int16_t *rawData = (int16_t*)calloc(rawDataLen, sizeof(int16_t));
vithyat 0:977e87915078 184 int16_t MAX_TRANSMIT_DATA = 500;
vithyat 0:977e87915078 185 int16_t data[MAX_TRANSMIT_DATA];
vithyat 0:977e87915078 186 traceTrack = 0;
vithyat 0:977e87915078 187 while(1) {
vithyat 0:977e87915078 188
vithyat 0:977e87915078 189 ////////////////
vithyat 0:977e87915078 190 // int len = read(sockfd, bytes, sizeof(bytes));
vithyat 0:977e87915078 191 int len = clt_sock.recv(bytes, MAX_LEN);
vithyat 0:977e87915078 192
vithyat 0:977e87915078 193 if (len < 1) {
vithyat 0:977e87915078 194 printf("Connection is closed....\n");
vithyat 0:977e87915078 195 break;
vithyat 0:977e87915078 196 }
vithyat 0:977e87915078 197
vithyat 0:977e87915078 198 int commandType = 0;
vithyat 0:977e87915078 199 int commandLength = 0;
vithyat 0:977e87915078 200
vithyat 0:977e87915078 201 int8_t *sendBytes = NULL;
vithyat 0:977e87915078 202
vithyat 0:977e87915078 203 if (len < 0) {
vithyat 0:977e87915078 204 return;
vithyat 0:977e87915078 205 }
vithyat 0:977e87915078 206 if (len == 8) {
vithyat 0:977e87915078 207 commandType = bytesToInt(bytes[0], bytes[1], bytes[2], bytes[3]);
vithyat 0:977e87915078 208 } else if (len == 12) {
vithyat 0:977e87915078 209 commandType = bytesToInt(bytes[0], bytes[1], bytes[2], bytes[3]);
vithyat 0:977e87915078 210 commandLength = bytesToInt(bytes[4], bytes[5], bytes[6], bytes[7]);
vithyat 0:977e87915078 211 if (commandType == PFP_REGISTER_DIGITIZER) {
vithyat 0:977e87915078 212
vithyat 0:977e87915078 213 deviceData.digitizer = bytesToInt(bytes[8], bytes[9], bytes[10],
vithyat 0:977e87915078 214 bytes[11]);
vithyat 0:977e87915078 215
vithyat 0:977e87915078 216 } else if (commandType == PFP_CLK_FREQ) {
vithyat 0:977e87915078 217 deviceData.sampleRate = bytesToInt(bytes[8], bytes[9],
vithyat 0:977e87915078 218 bytes[10], bytes[11]);
vithyat 0:977e87915078 219 } else if (commandType == PFP_ADC_GET_RAW) {
vithyat 0:977e87915078 220 deviceData.channel = bytesToInt(bytes[8], bytes[9], bytes[10],
vithyat 0:977e87915078 221 bytes[11]);
vithyat 0:977e87915078 222 }
vithyat 0:977e87915078 223
vithyat 0:977e87915078 224 }
vithyat 0:977e87915078 225
vithyat 0:977e87915078 226 else if (len == 40) {
vithyat 0:977e87915078 227 // Trig Configuration
vithyat 0:977e87915078 228 commandType = bytesToInt(bytes[0], bytes[1], bytes[2], bytes[3]);
vithyat 0:977e87915078 229 commandLength = bytesToInt(bytes[4], bytes[5], bytes[6], bytes[7]);
vithyat 0:977e87915078 230
vithyat 0:977e87915078 231 deviceData.channel = bytesToInt(bytes[8], bytes[9], bytes[10],
vithyat 0:977e87915078 232 bytes[11]);
vithyat 0:977e87915078 233 deviceData.traceLength = bytesToInt(bytes[12], bytes[13], bytes[14],
vithyat 0:977e87915078 234 bytes[15]);
vithyat 0:977e87915078 235
vithyat 0:977e87915078 236 deviceData.trigMode = bytesToInt(bytes[16], bytes[17], bytes[18],
vithyat 0:977e87915078 237 bytes[19]);
vithyat 0:977e87915078 238 deviceData.trigSource = bytesToInt(bytes[20], bytes[21], bytes[22],
vithyat 0:977e87915078 239 bytes[23]);
vithyat 0:977e87915078 240
vithyat 0:977e87915078 241 deviceData.trigLevel = bytesToFloat(bytes[24], bytes[25], bytes[26],
vithyat 0:977e87915078 242 bytes[27]);
vithyat 0:977e87915078 243 deviceData.trigHyst = bytesToFloat(bytes[28], bytes[29], bytes[30],
vithyat 0:977e87915078 244 bytes[31]);
vithyat 0:977e87915078 245
vithyat 0:977e87915078 246 deviceData.trigPercentage = bytesToInt(bytes[32], bytes[33],
vithyat 0:977e87915078 247 bytes[34], bytes[35]);
vithyat 0:977e87915078 248 deviceData.gain = bytesToInt(bytes[36], bytes[37], bytes[38],
vithyat 0:977e87915078 249 bytes[39]);
vithyat 0:977e87915078 250 }
vithyat 0:977e87915078 251
vithyat 0:977e87915078 252 // Got command form client. Send back header
vithyat 0:977e87915078 253 if (commandType == PFP_ADC_INIT) {
vithyat 0:977e87915078 254 sendBytes = pfp_emon_create_ack_for_client(commandType, 0);
vithyat 0:977e87915078 255 } else if (commandType == PFP_REGISTER_DIGITIZER) {
vithyat 0:977e87915078 256 sendBytes = pfp_emon_create_ack_for_client(commandType, 0);
vithyat 0:977e87915078 257 } else if (commandType == PFP_TRIG_CONFIG) {
vithyat 0:977e87915078 258 sendBytes = pfp_emon_create_ack_for_client(commandType,
vithyat 0:977e87915078 259 deviceData.traceLength * 2);
vithyat 0:977e87915078 260 } else if (commandType == PFP_CLK_FREQ) {
vithyat 0:977e87915078 261 sendBytes = pfp_emon_create_ack_for_client(commandType, 0);
vithyat 0:977e87915078 262 } else if (commandType == PFP_ADC_GET_RAW) {
vithyat 0:977e87915078 263 sendBytes = pfp_emon_create_ack_for_client(commandType,
vithyat 0:977e87915078 264 deviceData.traceLength * 2);
vithyat 0:977e87915078 265 }
vithyat 0:977e87915078 266
vithyat 0:977e87915078 267 if (sendBytes != NULL) {
vithyat 0:977e87915078 268 clt_sock.send(sendBytes,24);
vithyat 0:977e87915078 269 wait(0.05);
vithyat 0:977e87915078 270 }
vithyat 0:977e87915078 271
vithyat 0:977e87915078 272 if (commandType == PFP_ADC_GET_RAW) {
vithyat 0:977e87915078 273 if (deviceData.traceLength != rawDataLen) {
vithyat 0:977e87915078 274 printf("Data size change to %i===============>\n",rawDataLen);
vithyat 0:977e87915078 275 free(rawData);
vithyat 0:977e87915078 276 rawDataLen = deviceData.traceLength;
vithyat 0:977e87915078 277 rawData = (int16_t*)calloc(rawDataLen, sizeof(int16_t));
vithyat 0:977e87915078 278 }
vithyat 0:977e87915078 279
vithyat 0:977e87915078 280 // Store raw data
vithyat 0:977e87915078 281 printf("Populate sensor data to %i===============>\n",rawDataLen);
vithyat 0:977e87915078 282 for (int i = 0; i < rawDataLen; i++) {
vithyat 0:977e87915078 283 rawData[i] = ain.read_u16();
vithyat 0:977e87915078 284 }
vithyat 0:977e87915078 285
vithyat 0:977e87915078 286 int num = rawDataLen/MAX_TRANSMIT_DATA;
vithyat 0:977e87915078 287 int startIndex = 0;
vithyat 0:977e87915078 288 for(int k =0; k<num; k++) {
vithyat 0:977e87915078 289 startIndex = k*MAX_TRANSMIT_DATA;
vithyat 0:977e87915078 290 for(int i=0; i<MAX_TRANSMIT_DATA; i++) {
vithyat 0:977e87915078 291 data[i] = rawData[i + startIndex];
vithyat 0:977e87915078 292 }
vithyat 0:977e87915078 293 clt_sock.send(data,MAX_TRANSMIT_DATA*sizeof(int16_t));
vithyat 0:977e87915078 294 //printf("Sending batch %i of %i\n",k,num);
vithyat 0:977e87915078 295 wait(0.04);
vithyat 0:977e87915078 296 }
vithyat 0:977e87915078 297
vithyat 0:977e87915078 298 int leftOver = rawDataLen - num*MAX_TRANSMIT_DATA;
vithyat 0:977e87915078 299 //printf("LeftOver is %i\n",leftOver);
vithyat 0:977e87915078 300
vithyat 0:977e87915078 301 if(leftOver>0) {
vithyat 0:977e87915078 302 startIndex = num*MAX_TRANSMIT_DATA;
vithyat 0:977e87915078 303
vithyat 0:977e87915078 304 for(int j=startIndex; j<rawDataLen; j++) {
vithyat 0:977e87915078 305 int i = j-startIndex;
vithyat 0:977e87915078 306 data[i] = rawData[j];
vithyat 0:977e87915078 307 }
vithyat 0:977e87915078 308 clt_sock.send(data,leftOver * sizeof(int16_t));
vithyat 0:977e87915078 309 //printf("Sending left over bytes %i\n",leftOver);
vithyat 0:977e87915078 310 wait(0.04);
vithyat 0:977e87915078 311 }
vithyat 0:977e87915078 312 traceTrack++;
vithyat 0:977e87915078 313 if(traceTrack>100000000){
vithyat 0:977e87915078 314 traceTrack = 0;
vithyat 0:977e87915078 315 }
vithyat 0:977e87915078 316 printf("<================== Trace Count is %ld ===============>\n",traceTrack);
vithyat 0:977e87915078 317 }
vithyat 0:977e87915078 318
vithyat 0:977e87915078 319 ///////////////
vithyat 0:977e87915078 320 }
vithyat 0:977e87915078 321
vithyat 0:977e87915078 322 free(rawData);
vithyat 0:977e87915078 323 }
vithyat 0:977e87915078 324 }
vithyat 0:977e87915078 325 }
vithyat 0:977e87915078 326 }
vithyat 0:977e87915078 327 ///////////////////////////////////////////////////////////////////
vithyat 0:977e87915078 328
vithyat 0:977e87915078 329 int main(void)
vithyat 0:977e87915078 330 {
vithyat 0:977e87915078 331 printf("Connecting to the network using the default network interface...\n");
vithyat 0:977e87915078 332 net = NetworkInterface::get_default_instance();
vithyat 0:977e87915078 333
vithyat 0:977e87915078 334 nsapi_error_t net_status = NSAPI_ERROR_NO_CONNECTION;
vithyat 0:977e87915078 335 while ((net_status = net->connect()) != NSAPI_ERROR_OK) {
vithyat 0:977e87915078 336 printf("Unable to connect to network (%d). Retrying...\n", net_status);
vithyat 0:977e87915078 337 }
vithyat 0:977e87915078 338
vithyat 0:977e87915078 339 Thread thread(startEmonThread);
vithyat 0:977e87915078 340
vithyat 0:977e87915078 341 while (true) {
vithyat 0:977e87915078 342 wait(0.5);
vithyat 0:977e87915078 343 }
vithyat 0:977e87915078 344 }
vithyat 0:977e87915078 345
vithyat 0:977e87915078 346 #endif /* MBED_TEST_MODE */