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
main.cpp@2:990c985a69ae, 2020-03-20 (annotated)
- Committer:
- vithyat
- Date:
- Fri Mar 20 20:15:18 2020 +0000
- Revision:
- 2:990c985a69ae
- Parent:
- 1:0c589850480e
Update to work with P2Scan runtime
Who changed what in which revision?
User | Revision | Line number | New 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 | 2:990c985a69ae | 25 | AnalogIn ain(A0); |
vithyat | 0:977e87915078 | 26 | |
vithyat | 1:0c589850480e | 27 | /////////////////////////////////////////////////////////////////////////////////////// |
vithyat | 1:0c589850480e | 28 | /// |
vithyat | 2:990c985a69ae | 29 | /// PFP Main code start |
vithyat | 1:0c589850480e | 30 | /// |
vithyat | 1:0c589850480e | 31 | ////////////////////////////////////////////////////////////////////////////////////// |
vithyat | 0:977e87915078 | 32 | uint8_t PFP_REGISTER_DIGITIZER = 87; |
vithyat | 1:0c589850480e | 33 | uint8_t PFP_CLK_FREQ = 11; |
vithyat | 0:977e87915078 | 34 | uint8_t PFP_ADC_GET_RAW = 3; |
vithyat | 0:977e87915078 | 35 | uint8_t PFP_ADC_INIT = 0; |
vithyat | 0:977e87915078 | 36 | uint8_t PFP_TRIG_CONFIG = 26; |
vithyat | 1:0c589850480e | 37 | uint8_t PFP_TRIG_RECEIVED = 88; |
vithyat | 0:977e87915078 | 38 | |
vithyat | 0:977e87915078 | 39 | struct DeviceData { |
vithyat | 0:977e87915078 | 40 | int channel; |
vithyat | 0:977e87915078 | 41 | |
vithyat | 0:977e87915078 | 42 | int numberOfTraces; |
vithyat | 0:977e87915078 | 43 | int traceLength; |
vithyat | 0:977e87915078 | 44 | |
vithyat | 0:977e87915078 | 45 | int sampleRate; |
vithyat | 0:977e87915078 | 46 | int digitizer; |
vithyat | 0:977e87915078 | 47 | |
vithyat | 0:977e87915078 | 48 | int trigMode; |
vithyat | 0:977e87915078 | 49 | int trigSource; |
vithyat | 0:977e87915078 | 50 | |
vithyat | 0:977e87915078 | 51 | float trigLevel; |
vithyat | 0:977e87915078 | 52 | float trigHyst; |
vithyat | 0:977e87915078 | 53 | |
vithyat | 0:977e87915078 | 54 | int trigPercentage; |
vithyat | 0:977e87915078 | 55 | int gain; |
vithyat | 0:977e87915078 | 56 | }; |
vithyat | 0:977e87915078 | 57 | |
vithyat | 0:977e87915078 | 58 | struct DeviceData deviceData; |
vithyat | 0:977e87915078 | 59 | |
vithyat | 0:977e87915078 | 60 | int bytesToInt(int8_t b0, int8_t b1, int8_t b2, int8_t b3) |
vithyat | 0:977e87915078 | 61 | { |
vithyat | 0:977e87915078 | 62 | int value = (b3 << 24) & 0xff000000 |
vithyat | 0:977e87915078 | 63 | | (b2 << 16) & 0x00ff0000 |
vithyat | 0:977e87915078 | 64 | | (b1 << 8) & 0x0000ff00 |
vithyat | 0:977e87915078 | 65 | | (b0 << 0) & 0x000000ff; |
vithyat | 0:977e87915078 | 66 | return value; |
vithyat | 0:977e87915078 | 67 | } |
vithyat | 0:977e87915078 | 68 | |
vithyat | 0:977e87915078 | 69 | float bytesToFloat(int8_t b0, int8_t b1, int8_t b2, int8_t b3) |
vithyat | 0:977e87915078 | 70 | { |
vithyat | 0:977e87915078 | 71 | |
vithyat | 0:977e87915078 | 72 | float val = 0; |
vithyat | 0:977e87915078 | 73 | unsigned long result = 0; |
vithyat | 0:977e87915078 | 74 | result |= ((unsigned long) (b0) << 0x18); |
vithyat | 0:977e87915078 | 75 | result |= ((unsigned long) (b1) << 0x10); |
vithyat | 0:977e87915078 | 76 | result |= ((unsigned long) (b2) << 0x08); |
vithyat | 0:977e87915078 | 77 | result |= ((unsigned long) (b3)); |
vithyat | 0:977e87915078 | 78 | memcpy(&val, &result, 4); |
vithyat | 0:977e87915078 | 79 | |
vithyat | 0:977e87915078 | 80 | return val; |
vithyat | 0:977e87915078 | 81 | } |
vithyat | 0:977e87915078 | 82 | |
vithyat | 0:977e87915078 | 83 | int8_t * intToBytes(int value) |
vithyat | 0:977e87915078 | 84 | { |
vithyat | 1:0c589850480e | 85 | int8_t *b = (int8_t*) calloc(4, sizeof(int8_t)); |
vithyat | 1:0c589850480e | 86 | |
vithyat | 0:977e87915078 | 87 | b[0] = ((int8_t) (value >> 0)); |
vithyat | 0:977e87915078 | 88 | b[1] = ((int8_t) (value >> 8)); |
vithyat | 0:977e87915078 | 89 | b[2] = ((int8_t) (value >> 16)); |
vithyat | 0:977e87915078 | 90 | b[3] = ((int8_t) (value >> 24)); |
vithyat | 0:977e87915078 | 91 | return b; |
vithyat | 0:977e87915078 | 92 | } |
vithyat | 0:977e87915078 | 93 | |
vithyat | 0:977e87915078 | 94 | int8_t * longToBytes(long value) |
vithyat | 0:977e87915078 | 95 | { |
vithyat | 0:977e87915078 | 96 | static int8_t b[8]; |
vithyat | 0:977e87915078 | 97 | b[0] = (int8_t) ((value >> 0) & 0xFF); |
vithyat | 0:977e87915078 | 98 | b[1] = (int8_t) ((value >> 8) & 0xFF); |
vithyat | 0:977e87915078 | 99 | b[2] = (int8_t) ((value >> 16) & 0xFF); |
vithyat | 0:977e87915078 | 100 | b[3] = (int8_t) ((value >> 24) & 0xFF); |
vithyat | 0:977e87915078 | 101 | b[4] = (int8_t) ((value >> 32) & 0xFF); |
vithyat | 0:977e87915078 | 102 | b[5] = (int8_t) ((value >> 40) & 0xFF); |
vithyat | 0:977e87915078 | 103 | b[6] = (int8_t) ((value >> 48) & 0xFF); |
vithyat | 0:977e87915078 | 104 | b[7] = (int8_t) ((value >> 56) & 0xFF); |
vithyat | 0:977e87915078 | 105 | return b; |
vithyat | 0:977e87915078 | 106 | } |
vithyat | 0:977e87915078 | 107 | |
vithyat | 1:0c589850480e | 108 | int8_t * pfp_emon_create_ack_for_client(int commandType, int numberOfBytes) |
vithyat | 0:977e87915078 | 109 | { |
vithyat | 1:0c589850480e | 110 | static int8_t b[64]; |
vithyat | 0:977e87915078 | 111 | |
vithyat | 1:0c589850480e | 112 | int8_t *totalBytes = intToBytes(numberOfBytes); |
vithyat | 0:977e87915078 | 113 | int8_t *successBytes = intToBytes(3); |
vithyat | 0:977e87915078 | 114 | int8_t *returnBytes = intToBytes(commandType); |
vithyat | 1:0c589850480e | 115 | int8_t *totaTrace = intToBytes(numberOfBytes / 2); |
vithyat | 0:977e87915078 | 116 | |
vithyat | 0:977e87915078 | 117 | // EMON HEADER |
vithyat | 0:977e87915078 | 118 | b[0] = 69; |
vithyat | 0:977e87915078 | 119 | b[1] = 77; |
vithyat | 0:977e87915078 | 120 | b[2] = 79; |
vithyat | 0:977e87915078 | 121 | b[3] = 78; |
vithyat | 0:977e87915078 | 122 | |
vithyat | 0:977e87915078 | 123 | // NUMBER OF BYTES |
vithyat | 0:977e87915078 | 124 | b[4] = totalBytes[0]; |
vithyat | 0:977e87915078 | 125 | b[5] = totalBytes[1]; |
vithyat | 0:977e87915078 | 126 | b[6] = totalBytes[2]; |
vithyat | 0:977e87915078 | 127 | b[7] = totalBytes[3]; |
vithyat | 1:0c589850480e | 128 | |
vithyat | 1:0c589850480e | 129 | // ERROR |
vithyat | 1:0c589850480e | 130 | b[8] = 0; |
vithyat | 1:0c589850480e | 131 | b[9] = 0; |
vithyat | 1:0c589850480e | 132 | b[10] = 0; |
vithyat | 1:0c589850480e | 133 | b[11] = 0; |
vithyat | 0:977e87915078 | 134 | |
vithyat | 0:977e87915078 | 135 | // SKIP BYTES |
vithyat | 0:977e87915078 | 136 | b[12] = 0; |
vithyat | 0:977e87915078 | 137 | b[13] = 0; |
vithyat | 0:977e87915078 | 138 | b[14] = 0; |
vithyat | 0:977e87915078 | 139 | b[15] = 0; |
vithyat | 0:977e87915078 | 140 | |
vithyat | 0:977e87915078 | 141 | // SUCCESS COMMAND |
vithyat | 0:977e87915078 | 142 | b[16] = successBytes[0]; |
vithyat | 0:977e87915078 | 143 | b[17] = successBytes[1]; |
vithyat | 0:977e87915078 | 144 | b[18] = successBytes[2]; |
vithyat | 0:977e87915078 | 145 | b[19] = successBytes[3]; |
vithyat | 0:977e87915078 | 146 | |
vithyat | 0:977e87915078 | 147 | // RETURN COMMAND |
vithyat | 0:977e87915078 | 148 | b[20] = returnBytes[0]; |
vithyat | 0:977e87915078 | 149 | b[21] = returnBytes[1]; |
vithyat | 0:977e87915078 | 150 | b[22] = returnBytes[2]; |
vithyat | 0:977e87915078 | 151 | b[23] = returnBytes[3]; |
vithyat | 0:977e87915078 | 152 | |
vithyat | 1:0c589850480e | 153 | // SKIP BYTES |
vithyat | 1:0c589850480e | 154 | b[24] = 0; |
vithyat | 1:0c589850480e | 155 | b[25] = 0; |
vithyat | 1:0c589850480e | 156 | b[26] = 0; |
vithyat | 1:0c589850480e | 157 | b[27] = 0; |
vithyat | 1:0c589850480e | 158 | |
vithyat | 1:0c589850480e | 159 | // TOTAL TRACE |
vithyat | 1:0c589850480e | 160 | b[28] = totaTrace[0]; |
vithyat | 1:0c589850480e | 161 | b[29] = totaTrace[1]; |
vithyat | 1:0c589850480e | 162 | b[30] = totaTrace[2]; |
vithyat | 1:0c589850480e | 163 | b[31] = totaTrace[3]; |
vithyat | 1:0c589850480e | 164 | |
vithyat | 1:0c589850480e | 165 | |
vithyat | 1:0c589850480e | 166 | free(totalBytes); |
vithyat | 1:0c589850480e | 167 | free(successBytes); |
vithyat | 1:0c589850480e | 168 | free(returnBytes); |
vithyat | 1:0c589850480e | 169 | free(totaTrace); |
vithyat | 1:0c589850480e | 170 | |
vithyat | 1:0c589850480e | 171 | |
vithyat | 0:977e87915078 | 172 | return b; |
vithyat | 0:977e87915078 | 173 | } |
vithyat | 0:977e87915078 | 174 | |
vithyat | 0:977e87915078 | 175 | |
vithyat | 0:977e87915078 | 176 | void startEmonThread(void const *args) |
vithyat | 0:977e87915078 | 177 | { |
vithyat | 0:977e87915078 | 178 | |
vithyat | 0:977e87915078 | 179 | printf("The target IP address is '%s'\r\n", net->get_ip_address()); |
vithyat | 0:977e87915078 | 180 | |
vithyat | 0:977e87915078 | 181 | TCPServer srv; |
vithyat | 0:977e87915078 | 182 | TCPSocket clt_sock; |
vithyat | 0:977e87915078 | 183 | SocketAddress clt_addr; |
vithyat | 0:977e87915078 | 184 | |
vithyat | 0:977e87915078 | 185 | /* Open the server on ethernet stack */ |
vithyat | 0:977e87915078 | 186 | srv.open(net); |
vithyat | 0:977e87915078 | 187 | |
vithyat | 0:977e87915078 | 188 | /* Bind the HTTP port (TCP 80) to the server */ |
vithyat | 0:977e87915078 | 189 | srv.bind(net->get_ip_address(), 7001); |
vithyat | 0:977e87915078 | 190 | |
vithyat | 0:977e87915078 | 191 | long traceTrack = 0; |
vithyat | 2:990c985a69ae | 192 | float sleepCore = 0.001; |
vithyat | 0:977e87915078 | 193 | |
vithyat | 0:977e87915078 | 194 | |
vithyat | 0:977e87915078 | 195 | //srv.set_blocking(false); |
vithyat | 0:977e87915078 | 196 | while (true) { |
vithyat | 0:977e87915078 | 197 | /* Can handle 5 simultaneous connections */ |
vithyat | 0:977e87915078 | 198 | int err= srv.listen(1); |
vithyat | 0:977e87915078 | 199 | printf("server listening error : %d\r\n",err); |
vithyat | 0:977e87915078 | 200 | |
vithyat | 0:977e87915078 | 201 | while(1) { |
vithyat | 0:977e87915078 | 202 | |
vithyat | 0:977e87915078 | 203 | printf("waiting for client connection\r\n"); |
vithyat | 0:977e87915078 | 204 | err = srv.accept(&clt_sock, &clt_addr); |
vithyat | 0:977e87915078 | 205 | if(err == 0) { |
vithyat | 0:977e87915078 | 206 | printf("client connected :%s:%d\r\n", clt_addr.get_ip_address(), clt_addr.get_port()); |
vithyat | 0:977e87915078 | 207 | int MAX_LEN = 80; |
vithyat | 0:977e87915078 | 208 | int8_t bytes[MAX_LEN]; |
vithyat | 0:977e87915078 | 209 | int32_t rawDataLen = 2048; |
vithyat | 0:977e87915078 | 210 | int16_t *rawData = (int16_t*)calloc(rawDataLen, sizeof(int16_t)); |
vithyat | 0:977e87915078 | 211 | int16_t MAX_TRANSMIT_DATA = 500; |
vithyat | 0:977e87915078 | 212 | int16_t data[MAX_TRANSMIT_DATA]; |
vithyat | 0:977e87915078 | 213 | traceTrack = 0; |
vithyat | 2:990c985a69ae | 214 | |
vithyat | 2:990c985a69ae | 215 | bool debug = false; |
vithyat | 2:990c985a69ae | 216 | |
vithyat | 0:977e87915078 | 217 | while(1) { |
vithyat | 0:977e87915078 | 218 | |
vithyat | 0:977e87915078 | 219 | //////////////// |
vithyat | 0:977e87915078 | 220 | int len = clt_sock.recv(bytes, MAX_LEN); |
vithyat | 2:990c985a69ae | 221 | if(debug) { |
vithyat | 2:990c985a69ae | 222 | printf("====================> len = %i <======================\n",len); |
vithyat | 2:990c985a69ae | 223 | } |
vithyat | 0:977e87915078 | 224 | |
vithyat | 0:977e87915078 | 225 | if (len < 1) { |
vithyat | 0:977e87915078 | 226 | printf("Connection is closed....\n"); |
vithyat | 0:977e87915078 | 227 | break; |
vithyat | 0:977e87915078 | 228 | } |
vithyat | 0:977e87915078 | 229 | |
vithyat | 0:977e87915078 | 230 | int commandType = 0; |
vithyat | 0:977e87915078 | 231 | int commandLength = 0; |
vithyat | 2:990c985a69ae | 232 | int indexOffset = 0; |
vithyat | 0:977e87915078 | 233 | |
vithyat | 0:977e87915078 | 234 | int8_t *sendBytes = NULL; |
vithyat | 0:977e87915078 | 235 | |
vithyat | 0:977e87915078 | 236 | if (len < 0) { |
vithyat | 0:977e87915078 | 237 | return; |
vithyat | 0:977e87915078 | 238 | } |
vithyat | 0:977e87915078 | 239 | if (len == 8) { |
vithyat | 0:977e87915078 | 240 | commandType = bytesToInt(bytes[0], bytes[1], bytes[2], bytes[3]); |
vithyat | 0:977e87915078 | 241 | } else if (len == 12) { |
vithyat | 0:977e87915078 | 242 | commandType = bytesToInt(bytes[0], bytes[1], bytes[2], bytes[3]); |
vithyat | 0:977e87915078 | 243 | commandLength = bytesToInt(bytes[4], bytes[5], bytes[6], bytes[7]); |
vithyat | 0:977e87915078 | 244 | if (commandType == PFP_REGISTER_DIGITIZER) { |
vithyat | 0:977e87915078 | 245 | |
vithyat | 0:977e87915078 | 246 | deviceData.digitizer = bytesToInt(bytes[8], bytes[9], bytes[10], |
vithyat | 0:977e87915078 | 247 | bytes[11]); |
vithyat | 0:977e87915078 | 248 | |
vithyat | 2:990c985a69ae | 249 | // send_PFP_REGISTER_DIGITIZER(clt_sock); |
vithyat | 2:990c985a69ae | 250 | |
vithyat | 0:977e87915078 | 251 | } else if (commandType == PFP_CLK_FREQ) { |
vithyat | 0:977e87915078 | 252 | deviceData.sampleRate = bytesToInt(bytes[8], bytes[9], |
vithyat | 0:977e87915078 | 253 | bytes[10], bytes[11]); |
vithyat | 2:990c985a69ae | 254 | // send_PFP_CLK_FREQ(clt_sock); |
vithyat | 0:977e87915078 | 255 | } else if (commandType == PFP_ADC_GET_RAW) { |
vithyat | 0:977e87915078 | 256 | deviceData.channel = bytesToInt(bytes[8], bytes[9], bytes[10], |
vithyat | 0:977e87915078 | 257 | bytes[11]); |
vithyat | 0:977e87915078 | 258 | } |
vithyat | 2:990c985a69ae | 259 | if(debug) { |
vithyat | 2:990c985a69ae | 260 | printf("====================> len 12 commandType= %i <======================\n",commandType); |
vithyat | 2:990c985a69ae | 261 | printf("====================> len 12 commandLength= %i <======================\n",commandLength); |
vithyat | 2:990c985a69ae | 262 | } |
vithyat | 0:977e87915078 | 263 | |
vithyat | 1:0c589850480e | 264 | } else { |
vithyat | 0:977e87915078 | 265 | commandType = bytesToInt(bytes[0], bytes[1], bytes[2], bytes[3]); |
vithyat | 0:977e87915078 | 266 | commandLength = bytesToInt(bytes[4], bytes[5], bytes[6], bytes[7]); |
vithyat | 2:990c985a69ae | 267 | if (commandLength == 8) { |
vithyat | 2:990c985a69ae | 268 | if ((len == 60) || (len == 72)) { |
vithyat | 2:990c985a69ae | 269 | commandType =bytesToInt(bytes[8], bytes[9], bytes[10], bytes[11]); |
vithyat | 2:990c985a69ae | 270 | commandLength = bytesToInt(bytes[12], bytes[13], bytes[14], bytes[15]); |
vithyat | 2:990c985a69ae | 271 | indexOffset = 8; |
vithyat | 2:990c985a69ae | 272 | if(debug) { |
vithyat | 2:990c985a69ae | 273 | printf("====================> inside commandType= %i <======================\n",commandType); |
vithyat | 2:990c985a69ae | 274 | printf("====================> inside commandLength= %i <======================\n",commandLength); |
vithyat | 2:990c985a69ae | 275 | } |
vithyat | 2:990c985a69ae | 276 | } |
vithyat | 2:990c985a69ae | 277 | } else { |
vithyat | 2:990c985a69ae | 278 | if(debug) { |
vithyat | 2:990c985a69ae | 279 | printf("====================> outside commandType= %i <======================\n",commandType); |
vithyat | 2:990c985a69ae | 280 | printf("====================> outside commandLength= %i <======================\n",commandLength); |
vithyat | 2:990c985a69ae | 281 | } |
vithyat | 2:990c985a69ae | 282 | } |
vithyat | 0:977e87915078 | 283 | } |
vithyat | 0:977e87915078 | 284 | |
vithyat | 0:977e87915078 | 285 | // Got command form client. Send back header |
vithyat | 0:977e87915078 | 286 | if (commandType == PFP_ADC_INIT) { |
vithyat | 0:977e87915078 | 287 | sendBytes = pfp_emon_create_ack_for_client(commandType, 0); |
vithyat | 1:0c589850480e | 288 | |
vithyat | 1:0c589850480e | 289 | if (sendBytes != NULL) { |
vithyat | 1:0c589850480e | 290 | clt_sock.send(sendBytes,64); |
vithyat | 2:990c985a69ae | 291 | wait(sleepCore); |
vithyat | 1:0c589850480e | 292 | } |
vithyat | 2:990c985a69ae | 293 | } |
vithyat | 2:990c985a69ae | 294 | |
vithyat | 2:990c985a69ae | 295 | if (commandType == PFP_REGISTER_DIGITIZER) { |
vithyat | 0:977e87915078 | 296 | sendBytes = pfp_emon_create_ack_for_client(commandType, 0); |
vithyat | 1:0c589850480e | 297 | |
vithyat | 1:0c589850480e | 298 | if (sendBytes != NULL) { |
vithyat | 1:0c589850480e | 299 | clt_sock.send(sendBytes,64); |
vithyat | 2:990c985a69ae | 300 | wait(sleepCore); |
vithyat | 1:0c589850480e | 301 | } |
vithyat | 2:990c985a69ae | 302 | } |
vithyat | 2:990c985a69ae | 303 | if (commandType == PFP_TRIG_CONFIG) { |
vithyat | 1:0c589850480e | 304 | |
vithyat | 1:0c589850480e | 305 | if ((commandLength > 12) && (commandLength < 1000)) { |
vithyat | 2:990c985a69ae | 306 | |
vithyat | 2:990c985a69ae | 307 | deviceData.channel = bytesToInt(bytes[indexOffset+8], bytes[indexOffset+9], bytes[indexOffset+10], |
vithyat | 2:990c985a69ae | 308 | bytes[indexOffset+11]); |
vithyat | 2:990c985a69ae | 309 | deviceData.traceLength = bytesToInt(bytes[indexOffset+12], bytes[indexOffset+13], |
vithyat | 2:990c985a69ae | 310 | bytes[indexOffset+14], bytes[indexOffset+15]); |
vithyat | 1:0c589850480e | 311 | |
vithyat | 2:990c985a69ae | 312 | deviceData.trigMode = bytesToInt(bytes[indexOffset+16], bytes[indexOffset+17], |
vithyat | 2:990c985a69ae | 313 | bytes[indexOffset+18], bytes[indexOffset+19]); |
vithyat | 2:990c985a69ae | 314 | deviceData.trigSource = bytesToInt(bytes[indexOffset+20], bytes[indexOffset+21], |
vithyat | 2:990c985a69ae | 315 | bytes[indexOffset+22], bytes[indexOffset+23]); |
vithyat | 1:0c589850480e | 316 | |
vithyat | 2:990c985a69ae | 317 | deviceData.trigLevel = bytesToFloat(bytes[indexOffset+24], bytes[indexOffset+25], |
vithyat | 2:990c985a69ae | 318 | bytes[indexOffset+26], bytes[indexOffset+27]); |
vithyat | 2:990c985a69ae | 319 | deviceData.trigHyst = bytesToFloat(bytes[indexOffset+28], bytes[indexOffset+29], |
vithyat | 2:990c985a69ae | 320 | bytes[indexOffset+30], bytes[indexOffset+31]); |
vithyat | 1:0c589850480e | 321 | |
vithyat | 2:990c985a69ae | 322 | deviceData.trigPercentage = bytesToInt(bytes[indexOffset+32], bytes[indexOffset+33], |
vithyat | 2:990c985a69ae | 323 | bytes[indexOffset+34], bytes[indexOffset+35]); |
vithyat | 2:990c985a69ae | 324 | deviceData.gain = bytesToInt(bytes[indexOffset+36], bytes[indexOffset+37], bytes[indexOffset+38], |
vithyat | 2:990c985a69ae | 325 | bytes[indexOffset+39]); |
vithyat | 2:990c985a69ae | 326 | if(debug) { |
vithyat | 2:990c985a69ae | 327 | printf("channel is %i\n", deviceData.channel); |
vithyat | 2:990c985a69ae | 328 | printf("traceLength is %i\n", deviceData.traceLength); |
vithyat | 2:990c985a69ae | 329 | printf("trigMode is %f\n", deviceData.trigLevel); |
vithyat | 2:990c985a69ae | 330 | printf("trigSource is %i\n", deviceData.trigSource); |
vithyat | 2:990c985a69ae | 331 | printf("trigLevel is %f\n", deviceData.trigLevel); |
vithyat | 2:990c985a69ae | 332 | printf("trigHyst is %f\n", deviceData.trigHyst); |
vithyat | 2:990c985a69ae | 333 | printf("trigPercentage is %i\n", deviceData.trigPercentage); |
vithyat | 2:990c985a69ae | 334 | printf("gain is %i\n", deviceData.gain); |
vithyat | 2:990c985a69ae | 335 | printf("sample rate is %i\n", deviceData.sampleRate); |
vithyat | 2:990c985a69ae | 336 | printf("gain is %i\n", deviceData.gain); |
vithyat | 2:990c985a69ae | 337 | } |
vithyat | 1:0c589850480e | 338 | |
vithyat | 2:990c985a69ae | 339 | commandType = PFP_TRIG_RECEIVED; |
vithyat | 1:0c589850480e | 340 | sendBytes = pfp_emon_create_ack_for_client(commandType, |
vithyat | 1:0c589850480e | 341 | deviceData.traceLength * 2); |
vithyat | 1:0c589850480e | 342 | |
vithyat | 1:0c589850480e | 343 | if (sendBytes != NULL) { |
vithyat | 1:0c589850480e | 344 | clt_sock.send(sendBytes,64); |
vithyat | 2:990c985a69ae | 345 | } |
vithyat | 2:990c985a69ae | 346 | |
vithyat | 2:990c985a69ae | 347 | int numOfInteration = (len - (indexOffset+40))/4; |
vithyat | 2:990c985a69ae | 348 | |
vithyat | 2:990c985a69ae | 349 | for(int i=0; i<numOfInteration; i++) { |
vithyat | 2:990c985a69ae | 350 | int index2 = i*4; |
vithyat | 2:990c985a69ae | 351 | int b0 = indexOffset+40+index2; |
vithyat | 2:990c985a69ae | 352 | int b1 = indexOffset+41+index2; |
vithyat | 2:990c985a69ae | 353 | int b2 = indexOffset+42+index2; |
vithyat | 2:990c985a69ae | 354 | int b3 = indexOffset+43+index2; |
vithyat | 2:990c985a69ae | 355 | int v = bytesToInt(bytes[b0], bytes[b1], bytes[b2],bytes[b3]); |
vithyat | 2:990c985a69ae | 356 | if(debug) { |
vithyat | 2:990c985a69ae | 357 | printf("Trailing value %i\n", v); |
vithyat | 2:990c985a69ae | 358 | } |
vithyat | 1:0c589850480e | 359 | } |
vithyat | 2:990c985a69ae | 360 | |
vithyat | 2:990c985a69ae | 361 | if(numOfInteration==6) { |
vithyat | 2:990c985a69ae | 362 | |
vithyat | 2:990c985a69ae | 363 | commandType = bytesToInt(bytes[indexOffset+40], bytes[indexOffset+41], bytes[indexOffset+42],bytes[indexOffset+43]); |
vithyat | 2:990c985a69ae | 364 | commandLength = bytesToInt(bytes[indexOffset+44], bytes[indexOffset+45], bytes[indexOffset+46],bytes[indexOffset+47]); |
vithyat | 2:990c985a69ae | 365 | int sampleRate = bytesToInt(bytes[indexOffset+48], bytes[indexOffset+49], bytes[indexOffset+50],bytes[indexOffset+51]); |
vithyat | 2:990c985a69ae | 366 | deviceData.sampleRate = sampleRate; |
vithyat | 2:990c985a69ae | 367 | |
vithyat | 2:990c985a69ae | 368 | if (commandType == PFP_CLK_FREQ) { |
vithyat | 2:990c985a69ae | 369 | sendBytes = pfp_emon_create_ack_for_client(commandType, 0); |
vithyat | 2:990c985a69ae | 370 | if (sendBytes != NULL) { |
vithyat | 2:990c985a69ae | 371 | clt_sock.send(sendBytes,64); |
vithyat | 2:990c985a69ae | 372 | } |
vithyat | 2:990c985a69ae | 373 | } |
vithyat | 2:990c985a69ae | 374 | wait(sleepCore); |
vithyat | 2:990c985a69ae | 375 | |
vithyat | 2:990c985a69ae | 376 | commandType = bytesToInt(bytes[indexOffset+52], bytes[indexOffset+53], bytes[indexOffset+54],bytes[indexOffset+55]); |
vithyat | 2:990c985a69ae | 377 | commandLength = bytesToInt(bytes[indexOffset+56], bytes[indexOffset+57], bytes[indexOffset+58],bytes[indexOffset+59]); |
vithyat | 2:990c985a69ae | 378 | // int sampleRate = bytesToInt(bytes[indexOffset+40], bytes[indexOffset+41], bytes[indexOffset+42],bytes[indexOffset+43]); |
vithyat | 2:990c985a69ae | 379 | } |
vithyat | 1:0c589850480e | 380 | |
vithyat | 1:0c589850480e | 381 | |
vithyat | 2:990c985a69ae | 382 | } |
vithyat | 2:990c985a69ae | 383 | } |
vithyat | 2:990c985a69ae | 384 | if (commandType == PFP_CLK_FREQ) { |
vithyat | 0:977e87915078 | 385 | sendBytes = pfp_emon_create_ack_for_client(commandType, 0); |
vithyat | 1:0c589850480e | 386 | if (sendBytes != NULL) { |
vithyat | 1:0c589850480e | 387 | clt_sock.send(sendBytes,64); |
vithyat | 2:990c985a69ae | 388 | wait(sleepCore); |
vithyat | 2:990c985a69ae | 389 | } |
vithyat | 2:990c985a69ae | 390 | |
vithyat | 2:990c985a69ae | 391 | if(len==24) { |
vithyat | 2:990c985a69ae | 392 | commandType = PFP_ADC_GET_RAW; |
vithyat | 1:0c589850480e | 393 | } |
vithyat | 2:990c985a69ae | 394 | |
vithyat | 2:990c985a69ae | 395 | } |
vithyat | 1:0c589850480e | 396 | |
vithyat | 2:990c985a69ae | 397 | |
vithyat | 2:990c985a69ae | 398 | if (commandType == PFP_ADC_GET_RAW) { |
vithyat | 1:0c589850480e | 399 | sendBytes = pfp_emon_create_ack_for_client(PFP_TRIG_RECEIVED, |
vithyat | 1:0c589850480e | 400 | deviceData.traceLength * 2); |
vithyat | 1:0c589850480e | 401 | |
vithyat | 1:0c589850480e | 402 | if (sendBytes != NULL) { |
vithyat | 1:0c589850480e | 403 | clt_sock.send(sendBytes,64); |
vithyat | 1:0c589850480e | 404 | } |
vithyat | 1:0c589850480e | 405 | |
vithyat | 0:977e87915078 | 406 | sendBytes = pfp_emon_create_ack_for_client(commandType, |
vithyat | 0:977e87915078 | 407 | deviceData.traceLength * 2); |
vithyat | 1:0c589850480e | 408 | if (sendBytes != NULL) { |
vithyat | 1:0c589850480e | 409 | clt_sock.send(sendBytes,64); |
vithyat | 1:0c589850480e | 410 | } |
vithyat | 0:977e87915078 | 411 | |
vithyat | 0:977e87915078 | 412 | if (deviceData.traceLength != rawDataLen) { |
vithyat | 0:977e87915078 | 413 | printf("Data size change to %i===============>\n",rawDataLen); |
vithyat | 0:977e87915078 | 414 | free(rawData); |
vithyat | 0:977e87915078 | 415 | rawDataLen = deviceData.traceLength; |
vithyat | 0:977e87915078 | 416 | rawData = (int16_t*)calloc(rawDataLen, sizeof(int16_t)); |
vithyat | 0:977e87915078 | 417 | } |
vithyat | 0:977e87915078 | 418 | |
vithyat | 0:977e87915078 | 419 | // Store raw data |
vithyat | 2:990c985a69ae | 420 | |
vithyat | 2:990c985a69ae | 421 | int val=0; |
vithyat | 2:990c985a69ae | 422 | |
vithyat | 0:977e87915078 | 423 | for (int i = 0; i < rawDataLen; i++) { |
vithyat | 2:990c985a69ae | 424 | val = ain.read_u16() - 32768; |
vithyat | 2:990c985a69ae | 425 | if(val>32762) { |
vithyat | 2:990c985a69ae | 426 | val = 32762; |
vithyat | 2:990c985a69ae | 427 | } else if(val<-32762) { |
vithyat | 2:990c985a69ae | 428 | val = -32762; |
vithyat | 2:990c985a69ae | 429 | } |
vithyat | 2:990c985a69ae | 430 | |
vithyat | 1:0c589850480e | 431 | rawData[i] =val; |
vithyat | 0:977e87915078 | 432 | } |
vithyat | 0:977e87915078 | 433 | |
vithyat | 0:977e87915078 | 434 | int num = rawDataLen/MAX_TRANSMIT_DATA; |
vithyat | 0:977e87915078 | 435 | int startIndex = 0; |
vithyat | 0:977e87915078 | 436 | for(int k =0; k<num; k++) { |
vithyat | 0:977e87915078 | 437 | startIndex = k*MAX_TRANSMIT_DATA; |
vithyat | 0:977e87915078 | 438 | for(int i=0; i<MAX_TRANSMIT_DATA; i++) { |
vithyat | 0:977e87915078 | 439 | data[i] = rawData[i + startIndex]; |
vithyat | 0:977e87915078 | 440 | } |
vithyat | 0:977e87915078 | 441 | clt_sock.send(data,MAX_TRANSMIT_DATA*sizeof(int16_t)); |
vithyat | 2:990c985a69ae | 442 | wait(sleepCore); |
vithyat | 0:977e87915078 | 443 | } |
vithyat | 0:977e87915078 | 444 | |
vithyat | 0:977e87915078 | 445 | int leftOver = rawDataLen - num*MAX_TRANSMIT_DATA; |
vithyat | 0:977e87915078 | 446 | |
vithyat | 0:977e87915078 | 447 | if(leftOver>0) { |
vithyat | 0:977e87915078 | 448 | startIndex = num*MAX_TRANSMIT_DATA; |
vithyat | 0:977e87915078 | 449 | |
vithyat | 0:977e87915078 | 450 | for(int j=startIndex; j<rawDataLen; j++) { |
vithyat | 0:977e87915078 | 451 | int i = j-startIndex; |
vithyat | 0:977e87915078 | 452 | data[i] = rawData[j]; |
vithyat | 0:977e87915078 | 453 | } |
vithyat | 0:977e87915078 | 454 | clt_sock.send(data,leftOver * sizeof(int16_t)); |
vithyat | 0:977e87915078 | 455 | } |
vithyat | 0:977e87915078 | 456 | traceTrack++; |
vithyat | 1:0c589850480e | 457 | if(traceTrack>100000000) { |
vithyat | 0:977e87915078 | 458 | traceTrack = 0; |
vithyat | 0:977e87915078 | 459 | } |
vithyat | 2:990c985a69ae | 460 | if(debug) { |
vithyat | 2:990c985a69ae | 461 | printf("<================== Trace Count is %ld ===============>\n",traceTrack); |
vithyat | 2:990c985a69ae | 462 | } |
vithyat | 0:977e87915078 | 463 | } |
vithyat | 0:977e87915078 | 464 | } |
vithyat | 0:977e87915078 | 465 | |
vithyat | 0:977e87915078 | 466 | free(rawData); |
vithyat | 0:977e87915078 | 467 | } |
vithyat | 0:977e87915078 | 468 | } |
vithyat | 0:977e87915078 | 469 | } |
vithyat | 0:977e87915078 | 470 | } |
vithyat | 1:0c589850480e | 471 | |
vithyat | 1:0c589850480e | 472 | /////////////////////////////////////////////////////////////////////////////////////// |
vithyat | 1:0c589850480e | 473 | /// |
vithyat | 2:990c985a69ae | 474 | /// PFP Main code end |
vithyat | 1:0c589850480e | 475 | /// |
vithyat | 1:0c589850480e | 476 | ////////////////////////////////////////////////////////////////////////////////////// |
vithyat | 0:977e87915078 | 477 | |
vithyat | 0:977e87915078 | 478 | int main(void) |
vithyat | 0:977e87915078 | 479 | { |
vithyat | 0:977e87915078 | 480 | printf("Connecting to the network using the default network interface...\n"); |
vithyat | 0:977e87915078 | 481 | net = NetworkInterface::get_default_instance(); |
vithyat | 0:977e87915078 | 482 | |
vithyat | 0:977e87915078 | 483 | nsapi_error_t net_status = NSAPI_ERROR_NO_CONNECTION; |
vithyat | 0:977e87915078 | 484 | while ((net_status = net->connect()) != NSAPI_ERROR_OK) { |
vithyat | 0:977e87915078 | 485 | printf("Unable to connect to network (%d). Retrying...\n", net_status); |
vithyat | 0:977e87915078 | 486 | } |
vithyat | 0:977e87915078 | 487 | |
vithyat | 0:977e87915078 | 488 | Thread thread(startEmonThread); |
vithyat | 0:977e87915078 | 489 | |
vithyat | 0:977e87915078 | 490 | while (true) { |
vithyat | 2:990c985a69ae | 491 | wait(0.001); |
vithyat | 0:977e87915078 | 492 | } |
vithyat | 0:977e87915078 | 493 | } |
vithyat | 0:977e87915078 | 494 | |
vithyat | 0:977e87915078 | 495 | #endif /* MBED_TEST_MODE */ |