PageRenderTime 50ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/Current_Code/Libraries/cppfiles/tests/Individual_Sensor_Tests/LIS331/LIS331.cpp

https://github.com/VT-ATEx/Core-2014
C++ | 912 lines | 618 code | 261 blank | 33 comment | 57 complexity | 572aecde5bff67fba0acf44e6d89ac52 MD5 | raw file
Possible License(s): GPL-2.0
  1. #ifndef LIS331_cpp
  2. #define LIS331_cpp
  3. #include "LIS331.h"
  4. #include <iostream>
  5. using namespace std;
  6. using std::cout;
  7. void *update(void *ptr);
  8. LIS331::LIS331(const int bus, const int address)
  9. {
  10. char *device = new char[50];
  11. sprintf(device, "/dev/i2c-%d", bus);
  12. if ((i2cfdacc = open(device, O_RDWR)) < 0)
  13. {
  14. sprintf(device, "Failed to open %s", device);
  15. perror(device);
  16. }
  17. delete[] device;
  18. char *addr = new char[50];
  19. sprintf(addr, "0x%x", address);
  20. if (ioctl(i2cfdacc, I2C_SLAVE, address) < 0)
  21. {
  22. sprintf(addr, "Start error with address %s", addr);
  23. perror(addr);
  24. delete[] addr;
  25. }
  26. delete[] addr;
  27. //runs self test to ensure sensor functionality
  28. char tx[2];
  29. tx[0] = 0x20;
  30. tx[1] = 0x37;
  31. clients = 42;
  32. write(i2cfdacc, tx, 2);
  33. usleep (100);
  34. // tx[0] = 0x21;
  35. // tx[1] = 0x10;
  36. // write(i2cfdacc, tx, 2);
  37. // usleep (100);
  38. float valuex, valuey, valuez, valuext, valueyt, valuezt;
  39. tx[0] = 0xA8;
  40. //tx[1]=0x27;
  41. write(i2cfdacc, tx, 1);
  42. int tmp;
  43. char *data = new char[2];
  44. //gets x value
  45. tmp = read(i2cfdacc, data, 2);
  46. if (tmp != 2)
  47. perror("Read did not return bytes specified");
  48. valuex = ((data[0] | (data[1] << 8))) * .002929688;
  49. tx[0] = 0xAA;
  50. //tx[1]=0x27;
  51. write(i2cfdacc, tx, 1);
  52. tmp = read(i2cfdacc, data, 2);
  53. if (tmp != 2)
  54. perror("Read did not return bytes specified");
  55. valuey = ((data[0] | (data[1] << 8))) * .002929688;
  56. tx[0] = 0xAC;
  57. //tx[1]=0x27;
  58. write(i2cfdacc, tx, 1);
  59. ;
  60. tmp = read(i2cfdacc, data, 2);
  61. if (tmp != 2)
  62. perror("Read did not return bytes specified");
  63. valuez = ((data[0] | (data[1] << 8))) * .002929688;
  64. tx[0] = 0x23;
  65. tx[1] = 0x02;
  66. write(i2cfdacc, tx, 2);
  67. usleep (100);
  68. tmp = read(i2cfdacc, data, 2);
  69. if (tmp != 2)
  70. perror("Read did not return bytes specified");
  71. valuext = ((data[0] | (data[1] << 8))) * .002929688;
  72. tx[0] = 0xAA;
  73. //tx[1]=0x27;
  74. write(i2cfdacc, tx, 1);
  75. tmp = read(i2cfdacc, data, 2);
  76. if (tmp != 2)
  77. perror("Read did not return bytes specified");
  78. valueyt = ((data[0] | (data[1] << 8))) * .002929688;
  79. tx[0] = 0xAC;
  80. //tx[1]=0x27;
  81. write(i2cfdacc, tx, 1);
  82. tmp = read(i2cfdacc, data, 2);
  83. if (tmp != 2)
  84. perror("Read did not return bytes specified");
  85. valuezt = ((data[0] | (data[1] << 8))) * .002929688;
  86. tx[0] = 0x23;
  87. tx[1] = 0x00;
  88. write(i2cfdacc, tx, 2);
  89. tx[0] = 0x20;
  90. tx[1] = 0x07;
  91. write(i2cfdacc, tx, 2);
  92. usleep (100);
  93. if ((valuext - valuex < 180) | (valuext - valuex > 50))
  94. {
  95. }
  96. else
  97. {
  98. perror("X axis out of range!!!!");
  99. }
  100. if ((valueyt - valuey < -50) | (valueyt - valuey > -180))
  101. {
  102. }
  103. else
  104. {
  105. perror("Y axis out of range!!!!");
  106. }
  107. if ((valuezt - valuez < 370) | (valuezt - valuez > 220))
  108. {
  109. }
  110. else
  111. {
  112. perror("Z axis out of range!!!!");
  113. }
  114. pthread_mutex_init(&mutex, NULL);
  115. status = INIT;
  116. join = false;
  117. }
  118. void LIS331::Configure(int datarate, int g)
  119. {
  120. char tx[2];
  121. tx[0] = 0x20;
  122. switch (datarate)
  123. {
  124. case 50:
  125. {
  126. tx[1] = 0x27;
  127. break;
  128. }
  129. case 100:
  130. {
  131. tx[1] = 0x2F;
  132. break;
  133. }
  134. case 400:
  135. {
  136. tx[1] = 0x37;
  137. break;
  138. }
  139. case 1000:
  140. {
  141. tx[1] = 0x3F;
  142. break;
  143. }
  144. default:
  145. {
  146. tx[1] = 0x2F;
  147. break;
  148. }
  149. }
  150. write(i2cfdacc, tx, 2);
  151. tx[0] = 0x23;
  152. switch (g) //0x23
  153. {
  154. case 6: //0x00
  155. {
  156. tx[1] = 0x00;
  157. scale = .000183105;
  158. break;
  159. }
  160. case 12: //0x10
  161. {
  162. tx[1] = 0x10;
  163. scale = .000366211;
  164. break;
  165. }
  166. case 24: //0x30
  167. {
  168. tx[1] = 0x30;
  169. scale = .000732422;
  170. break;
  171. }
  172. default:
  173. {
  174. tx[1] = 0x30;
  175. scale = .000732422;
  176. break;
  177. }
  178. }
  179. write(i2cfdacc, tx, 2);
  180. maxX = 0;
  181. maxY = 0;
  182. maxZ = 0;
  183. minX = 0;
  184. minY = 0;
  185. minZ = 0;
  186. X = 0;
  187. Y = 0;
  188. Z = 0;
  189. }
  190. float LIS331::getXvalue()
  191. {
  192. char tx[2];
  193. float value = 0;
  194. tx[0] = 0xA8;
  195. //tx[1]=0x27;
  196. write(i2cfdacc, tx, 1);
  197. int tmp;
  198. char *data = new char[2];
  199. tmp = read(i2cfdacc, data, 2);
  200. if (tmp != 2)
  201. perror("Read did not return bytes specified");
  202. value = ((int16_t)(data[0] | (data[1] << 8))) * scale;
  203. delete[] data;
  204. return value;
  205. }
  206. float LIS331::getYvalue()
  207. {
  208. char tx[2];
  209. float value = 0;
  210. tx[0] = 0xAA;
  211. //tx[1]=0x27;
  212. write(i2cfdacc, &tx[0], 1);
  213. int tmp;
  214. char *data = new char[2];
  215. //data[0]=0;
  216. //data[1]=0;
  217. tmp = read(i2cfdacc, data, 2);
  218. if (tmp != 2)
  219. perror("Read did not return bytes specified");
  220. value = ((int16_t)(data[0] | (data[1] << 8))) * scale;
  221. // printf ("%x, %x\n", data[0], data [1]);
  222. delete[] data;
  223. return value;
  224. }
  225. float LIS331::getZvalue()
  226. {
  227. char tx[2];
  228. float value = 0;
  229. tx[0] = 0xAC;
  230. //tx[1]=0x27;
  231. write(i2cfdacc, &tx[0], 1);
  232. int tmp;
  233. char *data = new char[2];
  234. tmp = read(i2cfdacc, data, 2);
  235. if (tmp != 2)
  236. perror("Read did not return bytes specified");
  237. value = ((int16_t)(data[0] | (data[1] << 8))) * scale;
  238. delete[] data;
  239. return value;
  240. }
  241. float LIS331::getX()
  242. {
  243. float x = 0;
  244. pthread_mutex_lock (&mutex);
  245. x = X;
  246. pthread_mutex_unlock (&mutex);
  247. return x;
  248. }
  249. float LIS331::getY()
  250. {
  251. float y = 0;
  252. pthread_mutex_lock (&mutex);
  253. y = Y;
  254. pthread_mutex_unlock (&mutex);
  255. return y;
  256. }
  257. float LIS331::getZ()
  258. {
  259. float z = 0;
  260. pthread_mutex_lock (&mutex);
  261. z = Z;
  262. pthread_mutex_unlock (&mutex);
  263. return z;
  264. }
  265. bool LIS331::start_update()
  266. {
  267. int status_local;
  268. pthread_mutex_lock (&mutex);
  269. status_local = status;
  270. pthread_mutex_unlock (&mutex);
  271. if (status_local == INIT)
  272. {
  273. pthread_mutex_lock (&mutex);
  274. status_local = status;
  275. runningaverageX = 0;
  276. runningaverageY = 0;
  277. runningaverageZ = 0;
  278. X = 0;
  279. Y = 0;
  280. Z = 0;
  281. pthread_mutex_unlock (&mutex);
  282. pthread_create (&pt, NULL, update, (void *)this);
  283. return true;
  284. }
  285. return false;
  286. }
  287. bool LIS331::stop_update()
  288. {
  289. pthread_mutex_lock (&mutex);
  290. join = true;
  291. pthread_mutex_unlock (&mutex);
  292. //pthread_join (pt,NULL);
  293. pthread_exit (&pt);
  294. status = INIT;
  295. join = false;
  296. pt = NULL;
  297. return connected;
  298. }
  299. float LIS331::getXaverage()
  300. {
  301. float localx = 0;
  302. pthread_mutex_lock (&mutex);
  303. localx = runningaverageX;
  304. pthread_mutex_unlock (&mutex);
  305. return localx;
  306. }
  307. float LIS331::getYaverage()
  308. {
  309. float localy = 0;
  310. pthread_mutex_lock (&mutex);
  311. localy = runningaverageY;
  312. pthread_mutex_unlock (&mutex);
  313. return localy;
  314. }
  315. float LIS331::getZaverage()
  316. {
  317. float localz = 0;
  318. pthread_mutex_lock (&mutex);
  319. localz = runningaverageZ;
  320. pthread_mutex_unlock (&mutex);
  321. return localz;
  322. }
  323. void LIS331::setpollrate(int rate)
  324. {
  325. pthread_mutex_lock (&mutex);
  326. pollrate = rate;
  327. pthread_mutex_unlock (&mutex);
  328. }
  329. void LIS331::setdatapoints(int points)
  330. {
  331. pthread_mutex_lock (&mutex);
  332. datapoints = points;
  333. pthread_mutex_unlock (&mutex);
  334. }
  335. void LIS331::setclient (int c)
  336. {
  337. pthread_mutex_lock (&mutex);
  338. clients = c;
  339. pthread_mutex_unlock (&mutex);
  340. }
  341. float LIS331::getXmax()
  342. {
  343. float localx = 0;
  344. pthread_mutex_lock (&mutex);
  345. localx = maxX;
  346. pthread_mutex_unlock (&mutex);
  347. return localx;
  348. }
  349. float LIS331::getXmin()
  350. {
  351. float localx = 0;
  352. pthread_mutex_lock (&mutex);
  353. localx = minX;
  354. pthread_mutex_unlock (&mutex);
  355. return localx;
  356. }
  357. float LIS331::getYmax()
  358. {
  359. float localy = 0;
  360. pthread_mutex_lock (&mutex);
  361. localy = maxY;
  362. pthread_mutex_unlock (&mutex);
  363. return localy;
  364. }
  365. float LIS331::getYmin()
  366. {
  367. float localy = 0;
  368. pthread_mutex_lock (&mutex);
  369. localy = minY;
  370. pthread_mutex_unlock (&mutex);
  371. return localy;
  372. }
  373. float LIS331::getZmax()
  374. {
  375. float localz = 0;
  376. pthread_mutex_lock (&mutex);
  377. localz = maxZ;
  378. pthread_mutex_unlock (&mutex);
  379. return localz;
  380. }
  381. float LIS331::getZmin()
  382. {
  383. float localz = 0;
  384. pthread_mutex_lock (&mutex);
  385. localz = minZ;
  386. pthread_mutex_unlock (&mutex);
  387. return localz;
  388. }
  389. void LIS331::closer()
  390. {
  391. close(i2cfdacc);
  392. }
  393. LIS331::~LIS331()
  394. {
  395. closer();
  396. }
  397. void *update(void *ptr) //inside here need to poll and update sensors, compute running average
  398. {
  399. LIS331 *thread = ( LIS331 *) ptr;
  400. int status;
  401. int join;
  402. //create vectors for variables, add length
  403. vector<float> valuesX;
  404. vector<float> valuesY;
  405. vector<float> valuesZ;
  406. vector<float> maxx;
  407. vector<float> maxy;
  408. vector<float> maxz;
  409. vector<float> minx;
  410. vector<float> miny;
  411. vector<float> minz;
  412. float localx = 0;
  413. float localy = 0;
  414. float localz = 0;
  415. float localaveragex = 0;
  416. float localaveragey = 0;
  417. float localaveragez = 0;
  418. unsigned int i = 0;
  419. unsigned int y = 0;
  420. pthread_mutex_lock (&thread->mutex);
  421. thread->X = thread->getXvalue();
  422. thread->Y = thread->getYvalue();
  423. thread->Z = thread->getZvalue();
  424. localx = thread->X;
  425. localy = thread->Y;
  426. localz = thread->Z;
  427. pthread_mutex_unlock (&thread->mutex);
  428. usleep (400);
  429. pthread_mutex_lock (&thread->mutex);
  430. thread->X = thread->getXvalue();
  431. thread->Y = thread->getYvalue();
  432. thread->Z = thread->getZvalue();
  433. localx = thread->X;
  434. localy = thread->Y;
  435. localz = thread->Z;
  436. pthread_mutex_unlock (&thread->mutex);
  437. // printf ("X(in thread): %f\n", localx);
  438. // printf ("Y(in thread): %f\n", localy);
  439. // printf ("Z(in thread): %f\n", localz);
  440. while (i < 10)
  441. {
  442. maxx.push_back(localx);
  443. i++;
  444. }
  445. i = 0;
  446. while (i < 10)
  447. {
  448. minx.push_back(localx);
  449. i++;
  450. }
  451. i = 0;
  452. while (i < 10)
  453. {
  454. maxy.push_back(localx);
  455. i++;
  456. }
  457. i = 0;
  458. while (i < 10)
  459. {
  460. miny.push_back(localy);
  461. i++;
  462. }
  463. i = 0;
  464. while (i < 10)
  465. {
  466. maxz.push_back(localz);
  467. i++;
  468. }
  469. i = 0;
  470. while (i < 10)
  471. {
  472. minz.push_back(localz);
  473. i++;
  474. }
  475. i = 0;
  476. while (true)
  477. {
  478. //get the status variables
  479. pthread_mutex_lock (&thread->mutex);
  480. thread->status = LIS331::PROCESSING;
  481. status = thread->status;
  482. join = thread->join;
  483. pthread_mutex_unlock (&thread->mutex);
  484. //EXIT if ASKED
  485. if (join)
  486. break;
  487. //if the status is processing, then run
  488. if (status == LIS331::PROCESSING)
  489. {
  490. pthread_mutex_lock (&thread->mutex);
  491. thread->X = thread->getXvalue();
  492. thread->Y = thread->getYvalue();
  493. thread->Z = thread->getZvalue();
  494. localx = thread->X;
  495. localy = thread->Y;
  496. localz = thread->Z;
  497. pthread_mutex_unlock (&thread->mutex);
  498. if (valuesX.size() < thread->datapoints && valuesY.size() < thread->datapoints && valuesZ.size() < thread->datapoints)
  499. {
  500. if (valuesX.size() < 1 && valuesY.size() < 1 && valuesZ.size() < 1)
  501. {
  502. valuesX.push_back(localx);
  503. valuesY.push_back(localy);
  504. valuesZ.push_back(localz);
  505. localaveragex = valuesX[0];
  506. localaveragey = valuesY[0];
  507. localaveragez = valuesZ[0];
  508. // printf ("Inside of first if statement\n");
  509. }
  510. else
  511. {
  512. localaveragex = ((localaveragex * valuesX.size()) + localx) / (valuesX.size() + 1);
  513. valuesX.push_back(localx);
  514. localaveragey = ((localaveragey * valuesY.size()) + localy) / (valuesY.size() + 1);
  515. valuesY.push_back(localy);
  516. localaveragez = ((localaveragez * valuesZ.size()) + localz) / (valuesZ.size() + 1);
  517. valuesZ.push_back(localz);
  518. }
  519. }
  520. else
  521. {
  522. if (y < thread->datapoints)
  523. {
  524. localaveragex = ((localaveragex * thread->datapoints) - valuesX[y] + localx) / thread->datapoints;
  525. valuesX[y] = localx;
  526. localaveragey = ((localaveragey * thread->datapoints) - valuesY[y] + localy) / thread->datapoints;
  527. valuesY[y] = localy;
  528. localaveragez = ((localaveragez * thread->datapoints) - valuesZ[y] + localz) / thread->datapoints;
  529. valuesZ[y] = localz;
  530. y++;
  531. }
  532. else
  533. {
  534. y = 0;
  535. localaveragex = ((localaveragex * thread->datapoints) - valuesX[y] + localx) / thread->datapoints;
  536. valuesX[y] = localx;
  537. localaveragey = ((localaveragey * thread->datapoints) - valuesY[y] + localy) / thread->datapoints;
  538. valuesY[y] = localy;
  539. localaveragez = ((localaveragez * thread->datapoints) - valuesZ[y] + localz) / thread->datapoints;
  540. valuesZ[y] = localz;
  541. y++;
  542. }
  543. }
  544. pthread_mutex_lock (&thread->mutex);
  545. thread->runningaverageX = localaveragex;
  546. thread->runningaverageY = localaveragey;
  547. thread->runningaverageZ = localaveragez;
  548. pthread_mutex_unlock (&thread->mutex);
  549. // //min max stuff
  550. while (i < 10)
  551. {
  552. if (localx > maxx[i])
  553. {
  554. maxx[i] = localx;
  555. // printf ("X:%f\n", maxx[i]);
  556. }
  557. i++;
  558. }
  559. i = 0;
  560. while (i < 10)
  561. {
  562. if (localx < minx[i])
  563. {
  564. minx[i] = (localx);
  565. }
  566. i++;
  567. }
  568. i = 0;
  569. while (i < 10)
  570. {
  571. if (localy > maxy[i])
  572. {
  573. maxy[i] = localy;
  574. //printf ("Y:%f\n", maxy[i]);
  575. }
  576. i++;
  577. }
  578. i = 0;
  579. while (i < 10)
  580. {
  581. if (localy < miny[i])
  582. {
  583. miny [i] = localy;
  584. }
  585. i++;
  586. }
  587. i = 0;
  588. while (i < 10)
  589. {
  590. if (localz > maxz[i])
  591. {
  592. maxz[i] = localz;
  593. //printf ("Z:%f\n", maxz[i]);
  594. }
  595. i++;
  596. }
  597. i = 0;
  598. while (i < 10)
  599. {
  600. if (localy < minz[i])
  601. {
  602. minz[i] = localz;
  603. }
  604. i++;
  605. }
  606. i = 0;
  607. pthread_mutex_lock (&thread->mutex);
  608. int client = thread->clients;
  609. pthread_mutex_unlock (&thread->mutex);
  610. if (client < 42)
  611. {
  612. cout << maxx[client] << endl;
  613. cout << maxy[client] << endl;
  614. cout << maxz[client] << endl;
  615. cout << minx[client] << endl;
  616. cout << miny[client] << endl;
  617. cout << minz[client] << endl;
  618. pthread_mutex_lock (&thread->mutex);
  619. thread->maxX = maxx[client];
  620. thread->maxY = maxy[client];
  621. thread->maxZ = maxz[client];
  622. thread->minX = minx[client];
  623. thread->minY = miny[client];
  624. thread->minZ = minz[client];
  625. pthread_mutex_unlock (&thread->mutex);
  626. maxx[client] = thread->getX();
  627. maxy[client] = thread->getY();
  628. maxz[client] = thread->getZ();
  629. minx[client] = thread->getX();
  630. miny[client] = thread->getY();
  631. minz[client] = thread->getZ();
  632. pthread_mutex_lock (&thread->mutex);
  633. thread->clients = 42;
  634. pthread_mutex_unlock (&thread->mutex);
  635. client = 42;
  636. }
  637. // printf ("X(value at end): %f\n", localx);
  638. // printf ("Y(value at end): %f\n", localy);
  639. // printf ("Z(value at end): %f\n", localz);
  640. pthread_mutex_lock (&thread->mutex);
  641. thread->status = LIS331::WAITING;
  642. pthread_mutex_unlock (&thread->mutex);
  643. usleep(thread->pollrate);
  644. pthread_mutex_lock (&thread->mutex);
  645. thread->status = LIS331::DONE;
  646. pthread_mutex_unlock (&thread->mutex);
  647. }
  648. }
  649. return (void *) NULL;
  650. }
  651. #endif