diff options
Diffstat (limited to 'motionMonitor')
-rw-r--r-- | motionMonitor/motionMonitor.c | 107 |
1 files changed, 68 insertions, 39 deletions
diff --git a/motionMonitor/motionMonitor.c b/motionMonitor/motionMonitor.c index bcc77ac..2d2c24b 100644 --- a/motionMonitor/motionMonitor.c +++ b/motionMonitor/motionMonitor.c @@ -2,9 +2,26 @@ #include "legato.h" #include "util.h" #include <pthread.h> +#include <semaphore.h> + +#define MAX_ARRAY_SIZE 200 void *impactMonitor(void *); +typedef struct{ + double x; + double y; + double z; +} Acceleration; + + + +double xAccImpact [MAX_ARRAY_SIZE]; +double yAccImpact [MAX_ARRAY_SIZE]; +double zAccImpact [MAX_ARRAY_SIZE]; + + + static const char FormatStr[] = "/sys/devices/i2c-0/0-0068/iio:device0/in_%s_%s"; static const char AccType[] = "accel"; static const char GyroType[] = "anglvel"; @@ -12,22 +29,18 @@ static const char CompX[] = "x_raw"; static const char CompY[] = "y_raw"; static const char CompZ[] = "z_raw"; static const char CompScale[] = "scale"; -bool hasSuddenImpact = false; -static const int impactThreshold = 20; +int totalImpacts = 0; +static const double impactThreshold = 20.0; -typedef struct { - double x; - double y; - double z; -} Acceleration; +Acceleration suddenImpact = {0, 0, 0}; pthread_t impact_thread; +sem_t impact_mutex; -Acceleration suddenImpact = {0, 0, 0}; -/** +/* * Reports the x, y and z accelerometer readings in meters per second squared. - */ +*/ le_result_t brnkl_motion_getCurrentAcceleration( double *xAcc, @@ -37,10 +50,6 @@ le_result_t brnkl_motion_getCurrentAcceleration( { le_result_t r; char path[256]; - if(hasSuddenImpact){ - LE_INFO("hasSuddenImpact"); - hasSuddenImpact = false; - } double scaling = 0.0; int pathLen = snprintf(path, sizeof(path), FormatStr, AccType, CompScale); @@ -80,26 +89,40 @@ done: } /* -*return 1 if hardware has been in a sudden impact. +* Return 1 if hardware has been in a sudden impact. */ int8_t brnkl_motion_hasSuddenImpact() { - if(hasSuddenImpact){ - hasSuddenImpact = false; - return 1; - } return 0; } +//implement case for full array, or solution to not getting a full array +void recordImpact(double* xAcc, + double* yAcc, + double* zAcc){ + + //time = (unsigned long)time(NULL) + + xAccImpact[totalImpacts] = *xAcc; + yAccImpact[totalImpacts] = *yAcc; + zAccImpact[totalImpacts] = *zAcc; + + totalImpacts++; + LE_INFO("New Impact, totalImpacts: %d", totalImpacts); + + for(int i = 0; i < totalImpacts; i++){ + LE_INFO("ImpactOf X: %f Y: %f Z: %f ", xAccImpact[i], yAccImpact[i], zAccImpact[i]); + } +} + +/* +* Return array of sudden impacts(Acceleration) +*/ + le_result_t brnkl_motion_getSuddenImpact(double* xAcc, - double* yAcc, - double* zAcc) { - *xAcc = suddenImpact.x; - *yAcc = suddenImpact.y; - *zAcc = suddenImpact.z; - suddenImpact.x = 0; - suddenImpact.y = 0; - suddenImpact.z = 0; - hasSuddenImpact = false; + double* yAcc, + double* zAcc) { + //Return Array of Sudden Impacts + //*impactArray = impactArr; return LE_OK; } @@ -115,13 +138,18 @@ void *impactMonitor(void * ptr){ brnkl_motion_getCurrentAcceleration(&x, &y, &z); - if( - abs(x) + - abs(y) + - abs(z) > - impactThreshold - ) - hasSuddenImpact = true; + double euclidian = sqrt(x*x + y*y + z*z); + + if(euclidian > impactThreshold){ + LE_INFO("euclidian : %f", euclidian); + //3. add x, y, z to impact array + sem_wait(&impact_mutex); + LE_INFO("addingImpact"); + + recordImpact(&x, &y, &z); + + sem_post(&impact_mutex); + } usleep(100*1000); @@ -134,17 +162,18 @@ void *impactMonitor(void * ptr){ *Create thread to monitor accelerometer iio */ void initThread(){ - int thread; + int thread, mutx; thread = pthread_create( &impact_thread, NULL, impactMonitor, NULL); + mutx = sem_init(&impact_mutex, 0, 1); - if(thread){ + if(thread && mutx){ LE_INFO("Reader Thread Created"); }else{ - LE_ERROR("Reader Thread Creation Failed"); + LE_ERROR("Reader Thread or Mutex Creation Failed"); } } COMPONENT_INIT { initThread(); -} +}
\ No newline at end of file |