· 5 years ago · Feb 02, 2020, 09:00 PM
1import React, { useState, useEffect } from 'react';
2import { StyleSheet, Text, ScrollView, View, Button, ToastAndroid, Picker } from 'react-native';
3// import { BleManager, Device } from 'react-native-ble-plx'
4import AxisBar from './AxisBar';
5import { Constants } from 'react-native-unimodules';
6import SearchDeviceBox from './searchDeviceBox';
7import CoolAxis from './coolAxis';
8import {decode} from 'base-64';
9import { manager } from './bleManager';
10import * as SQLite from 'expo-sqlite';
11
12export default function App() {
13 const [connectedDevice, setConnectedDevice] = useState(null);
14 const [vectors, setVectors] = useState([]);
15 const [isNordicConnected, setStatus] = useState(false);
16 const [isMonitoring, setMonitoring] = useState(false);
17 const [dataPacket, setDataPacket] = useState({});
18
19 let selectedMode = "rm";
20 const transactionID = "XDXD";
21 const [didFirstFinish, setFirstStatus] = useState(false);
22 const [didSecondFinish, setSecondStatus] = useState(false);
23 const [rmState, setRMState] = useState(false);
24
25 const [showFirstStop, setShowFirst] = useState(false);
26 const [showSecondStop, setShowSecond] = useState(false);
27
28 const [showAccRunning, setShowAccRunning] = useState(false);
29 const [maxAcc, setMaxAcc] = useState(false);
30
31 const [finalAcc, setFinalAcc] = useState(0);
32
33 const [finalRM, setFinalRM] = useState(0);
34 let xdVectors = [];
35 let firstVectors = [];
36 let accVectors = [];
37 let secondVectors = [];
38 let packets = [];
39 let isFirstSeriesRunning = false;
40 let isSecondSeriesRunning = false;
41 let isAccRunning = false;
42 // manager.state().then((res) => console.log(res));
43
44 const db = SQLite.openDatabase("db.db");
45
46 const clearDB = () => {
47 console.log("Clear DB");
48 db.transaction(tx => {
49 tx.executeSql(
50 "drop table if exists seriesOne; create table seriesOne (id integer primary key not null, value float, type bit);"
51 );
52 });
53 //"create table if not exists seriesTwo (id integer primary key not null, value float, type bit);"
54 //"drop table if exists seriesTwo; create table seriesTwo (id integer primary key not null, value float, type bit);"
55 db.transaction(tx => {
56 tx.executeSql(
57 "drop table if exists seriesTwo; create table seriesTwo (id integer primary key not null, value float, type bit);"
58 );
59 });
60
61 db.transaction(tx => {
62 tx.executeSql(
63 "drop table if exists acc; create table acc (id integer primary key not null, value float);"
64 );
65 });
66 }
67
68 db.transaction(tx => {
69 tx.executeSql(
70 "create table if not exists seriesOne (id integer primary key not null, value float, type bit);"
71 );
72 });
73 //"create table if not exists seriesTwo (id integer primary key not null, value float, type bit);"
74 //"drop table if exists seriesTwo; create table seriesTwo (id integer primary key not null, value float, type bit);"
75 db.transaction(tx => {
76 tx.executeSql(
77 "create table if not exists seriesTwo (id integer primary key not null, value float, type bit);"
78 );
79 });
80
81 db.transaction(tx => {
82 tx.executeSql(
83 "create table if not exists acc (id integer primary key not null, value float);"
84 );
85 });
86
87 const connectToDevice = (device) => {
88 console.log(device);
89 manager.connectToDevice(device.id).then((connected) => {
90 connected.isConnected().then(conn => {
91 console.log(conn)
92 device.discoverAllServicesAndCharacteristics().then(service => {
93 console.log('Service', service);
94 service.characteristicsForService(device.serviceUUIDs[0]).then(characteristic => {
95 console.log('Characteristic', characteristic);
96 characteristic.forEach(element => {
97 console.log('Element', element);
98 setConnectedDevice(element);
99 ToastAndroid.showWithGravity(
100 "Device is connected!",
101 ToastAndroid.SHORT,
102 ToastAndroid.CENTER,
103 );
104 console.log(element)
105 setStatus(true);
106 });
107 });
108 });
109 })
110 console.log(connected);
111 }).catch(err => {
112 console.log(err)
113 console.log(connectedDevice.id);
114 if (manager.isDeviceConnected(connectedDevice.id)) {
115 console.log("Device is somehow still connected");
116 }
117 if (err.message) {
118 ToastAndroid.showWithGravity(
119 err.message,
120 ToastAndroid.SHORT,
121 ToastAndroid.CENTER,
122 );
123 } else {
124 ToastAndroid.showWithGravity(
125 "There was an error...",
126 ToastAndroid.SHORT,
127 ToastAndroid.CENTER,
128 );
129 }
130 });
131 }
132
133 const monitorDevice = () => {
134 console.log(connectedDevice);
135 setMonitoring(true);
136 if (connectToDevice) {
137 manager.monitorCharacteristicForDevice(connectedDevice.deviceID, connectedDevice.serviceUUID, connectedDevice.uuid, (err, char) => {
138 if (err) {
139 console.log(JSON.stringify(err));
140 console.log(connectedDevice.deviceID);
141 if (manager.isDeviceConnected(connectedDevice.deviceID)) {
142 console.log("Device is somehow still connected");
143 }
144 if (err.message) {
145 ToastAndroid.showWithGravity(
146 err.message,
147 ToastAndroid.SHORT,
148 ToastAndroid.CENTER,
149 );
150 ToastAndroid.show(
151 err.reason,
152 ToastAndroid.LONG,
153 ToastAndroid.CENTER
154 )
155 }
156 }
157 const payload = () => {
158 return decode(char.value);
159 }
160 if (payload()) {
161 const splices = payload().split(',');
162 const x = (Number((splices[2])/4));
163 const y = (Number((splices[1])/4));
164 const z = (Number((splices[0])/4));
165 const vector = Math.sqrt(Math.pow(x,2) + Math.pow(y,2) + Math.pow(z,2))*0.009604;
166 console.log(x);
167 console.log(y);
168 console.log(z);
169 console.log(vector);
170 const dataPacketXD = {
171 x,
172 y,
173 z,
174 max: calcMaxAcc(),
175 rm: calcRm(),
176 }
177 packets.push(dataPacket);
178 handleVector(vector).then(res => console.log(res));
179 // console.log(vector);
180 xdVectors.push(Number(vector));
181 if (vectors.length > 0) {
182 setVectors(oldArray => [...oldArray, vector]);
183 } else {
184 setVectors(vector);
185 }
186
187 setDataPacket(dataPacketXD);
188 if (xdVectors.length > 1000) {
189 const tempVects = xdVectors.shift();
190 xdVectors = tempVects;
191 }
192 }
193 }, transactionID);
194 }
195 }
196
197 const handleVector = (vector) => {
198 if(isAccRunning) {
199 return new Promise((resolve, reject) => {
200 accVectors.push(Number(vector));
201 db.transaction(
202 tx => {
203 tx.executeSql("insert into acc (value) values (?)", [vector], (_, { rows }) => resolve(rows._array), reject);
204 },
205 );
206 })
207 }
208 if (isFirstSeriesRunning && !isSecondSeriesRunning) {
209 return new Promise((resolve, reject) => {
210 firstVectors.push(Number(vector));
211 db.transaction(
212 tx => {
213 tx.executeSql("insert into seriesOne (value, type) values (?, ?)", [vector, 0], (_, { rows }) => resolve(rows._array), reject);
214 },
215 );
216 })
217 }
218 if (isSecondSeriesRunning && !isFirstSeriesRunning) {
219 return new Promise((resolve, reject) => {
220 secondVectors.push(Number(vector));
221 db.transaction(
222 tx => {
223 tx.executeSql("insert into seriesTwo (value, type) values (?, ?)", [vector, 1], (_, { rows }) => resolve(rows._array), reject);
224 },
225 );
226 })
227 }
228 }
229
230 function calcMaxVector() {
231 const max = (Math.max(...xdVectors));
232 // console.log('MAX', max);
233 return Number(max);
234 }
235
236 function calcMaxAcc() {
237 return calcMaxVector();
238 }
239
240 const getDataFirstFromSQL = () => new Promise((resolve, reject) => {
241 // let firstVectorFromSQL = [];
242 db.transaction(tx => {
243 tx.executeSql("select * from seriesOne", [], (_, { rows }) => {
244 console.log(JSON.stringify(rows))
245 resolve(rows._array.map(el => el.value));
246 }
247 );
248 });
249 // resolve(firstVectorFromSQL);
250 });
251 // resolve(rows._array.forEach(el => secondVectorFromSQL.push(el.value)));
252
253
254 const getDataSecondFromSQL = () => new Promise((resolve, reject) => {
255 // let secondVectorFromSQL = [];
256 db.transaction(tx => {
257 tx.executeSql("select * from seriesTwo", [], (_, { rows }) => {
258 console.log(JSON.stringify(rows))
259 resolve(rows._array.map(el => el.value));
260 }
261 );
262 });
263 // resolve(secondVectorFromSQL);
264 });
265
266 const getAccDataFromSQL = () => new Promise((resolve, reject) => {
267 db.transaction(tx => {
268 tx.executeSql("select * from acc", [], (_, { rows }) => {
269 console.log(JSON.stringify(rows))
270 resolve(rows._array.map(el => el.value));
271 }
272 );
273 });
274 })
275
276 const getDataFromSQL = () => {
277 // let firstVectorFromSQL = [];
278 // let secondVectorFromSQL =[];
279 // db.transaction(tx => {
280 // tx.executeSql("select * from seriesOne", [], (_, { rows }) => {
281 // console.log(JSON.stringify(rows))
282 // rows._array.forEach(el => firstVectorFromSQL.push(el.value));
283 // }
284 // );
285 // });
286
287 // db.transaction(tx => {
288 // tx.executeSql("select * from seriesTwo", [], (_, { rows }) => {
289 // console.log(JSON.stringify(rows))
290 // rows._array.forEach(el => secondVectorFromSQL.push(el.value));
291 // }
292 // );
293 // });
294
295 return { firstVectorFromSQL, secondVectorFromSQL };
296 }
297
298 function calcAllRM() {
299 console.log("Calc all RM");
300 getDataFirstFromSQL().then((res) => {
301 console.log(res);
302 let sum = 0;
303 let firstVectorFromSQL = res;
304 firstVectorFromSQL.forEach(vector => {
305 sum = sum + Number(vector)
306 });
307 console.log('SUMone', sum);
308 const avg = (sum / firstVectorFromSQL.length);
309 console.log('avgone', avg);
310 // const vel = avg * 1.5;
311 const vel = avg * firstVectorFromSQL.length * 0.1;
312
313 console.log('velone', vel);
314 const RM1 = (vel - 1.7035) / (-0.0146);
315 console.log('RM1', RM1);
316 getDataSecondFromSQL().then((newRes) => {
317 console.log(newRes);
318 let sumTwo = 0;
319 let secondVectorFromSQL = newRes;
320 secondVectorFromSQL.forEach(vector => {
321 sumTwo = sumTwo + Number(vector)
322 });
323 console.log('SUMtwo', sumTwo);
324 const avgTwo = (sumTwo / secondVectorFromSQL.length);
325 console.log('avgTwo', avgTwo);
326 const velTwo = avgTwo * secondVectorFromSQL.length * 0.1;
327 console.log('velTwo', velTwo);
328 const RM2 = (velTwo - 1.7035) / (-0.0146);
329 console.log('RM2', RM2);
330 console.log('rm1', RM1)
331 const LDO = ((-vel*(RM2 - RM1) + RM1 * (velTwo - vel))/(velTwo - vel));
332 console.log('LDO', LDO);
333 // const RMFinal = 0.871 * LDO - 0.624;
334 const RMFinal = 8.4326 * velTwo - 73.501 * vel + 112.33;
335
336 console.log('FinalRM', RMFinal);
337 setFinalRM(RMFinal);
338 })
339 })
340 }
341
342 function calcRm() {
343 let sum = 0;
344 xdVectors.forEach(vector => {
345 sum = sum + Number(vector)
346 });
347 const avg = (sum * 0.009061 / xdVectors.length);
348 const vel = avg * xdVectors.length * 0.1;
349 const RM = (vel - 1.7035) / (-0.0146);
350 // console.log('RM', RM);
351 return RM;
352 }
353
354 const startMaxAcc = () => {
355 monitorDevice();
356 isAccRunning = true;
357 setShowAccRunning(true);
358 }
359
360 const stopMaxAcc = () => {
361 setShowAccRunning(false);
362 isAccRunning = false;
363 stopMonitoring();
364 getAccDataFromSQL().then((res) => {
365 console.log(res);
366 const max = Math.max(...res);
367 setMaxAcc(Number(max));
368 })
369 }
370
371 const startRM = () => {
372 monitorDevice();
373 isFirstSeriesRunning = true;
374 setShowFirst(true);
375 ToastAndroid.showWithGravity(
376 "First series started!",
377 ToastAndroid.SHORT,
378 ToastAndroid.CENTER,
379 );
380 }
381
382 function stopFirst() {
383 isFirstSeriesRunning = false;
384 setFirstStatus(true);
385 setShowFirst(false);
386 stopMonitoring();
387 ToastAndroid.showWithGravity(
388 "First series finished!",
389 ToastAndroid.SHORT,
390 ToastAndroid.CENTER,
391 );
392 }
393
394 function runSecondSeries() {
395 setShowSecond(true);
396 isSecondSeriesRunning = true;
397 monitorDevice();
398 ToastAndroid.showWithGravity(
399 "Second series started!",
400 ToastAndroid.SHORT,
401 ToastAndroid.CENTER,
402 );
403 }
404
405 function stopSecond() {
406 isSecondSeriesRunning = false;
407 setShowSecond(false);
408 stopMonitoring();
409 // calcAllRM();
410 ToastAndroid.showWithGravity(
411 "Second series finished!",
412 ToastAndroid.SHORT,
413 ToastAndroid.CENTER,
414 );
415 }
416
417 const stopMonitoring = () => {
418 console.log("Stop monitoring");
419 manager.cancelTransaction(transactionID);
420 }
421
422 return (
423 <View style={styles.container}>
424 {!connectedDevice && <SearchDeviceBox connectToDevice={connectToDevice} />}
425 {/* <Picker
426 selectedValue={selectedMode}
427 style={{height: 50, width: 150}}
428 onValueChange={(itemValue, itemIndex) => {
429 selectedMode = itemValue;
430 }}>
431 <Picker.Item label="RM" value="rm" />
432 <Picker.Item label="Max acc" value="acc" />
433 </Picker> */}
434 {/* {dataPacket != {} && CoolAxis(dataPacket)} */}
435 {/* {isNordicConnected && <Button title="Monitor device xD" onPress={() => monitorDevice()}></Button>} */}
436 {/* {isMonitoring && <Button title="Stop monitoring" onPress={() => startRM()}></Button>} */}
437 {/* {!didFirstFinish && <Button title="Start First" onPress={() => startRM()}></Button>}
438 {showFirstStop && <Button title="Stop First" onPress={() => stopFirst()}></Button>}
439 {didFirstFinish && <Button title="Run Second" onPress={() => runSecondSeries()}></Button>}
440 {showSecondStop && <Button title="Stop Second" onPress={() => stopSecond()}></Button>} */}
441 {connectedDevice && <Button title="Max Acc start" onPress={() => startMaxAcc()} style={styles.button}></Button>}
442 {showAccRunning && <Button title="Stop Acc" onPress={() => stopMaxAcc()}></Button>}
443 {maxAcc !== 0 && <Text>Max acc: {maxAcc}</Text>}
444 <Button title="clear db" onPress={() => clearDB()}></Button>
445 {/* <Button title="calc" onPress={() => calcAllRM()}></Button> */}
446 {finalRM !== 0 && <Text>Final RM: {finalRM}</Text>}
447 {/* <AxisBar /> */}
448 </View>
449 );
450}
451
452const styles = StyleSheet.create({
453 container: {
454 flex: 1,
455 backgroundColor: '#fff',
456 alignItems: 'center',
457 justifyContent: 'center',
458 marginBottom: 20,
459 // marginTop: Constants.statusBarHeight,
460 },
461 button: {
462 marginBottom: 20,
463 }
464});