Library for my home monitoring classes and serial communication protocol. It monitors temperature and movement on the mbed application board.

Dependents:   FinalProject

Motion/Motion.cpp

Committer:
groletter
Date:
2013-09-03
Revision:
1:2f5a62eb52ad
Parent:
0:3f846fc933a2

File content as of revision 1:2f5a62eb52ad:

//
// This file contains function related to the motion 
// control of the home monitoring system
//

#include <vector>
#include <string>
#include <sstream>

// TODO - add timestamp to motion samples
#include "Motion.h"
  
Motion::Motion() {
    // These are motion deltas based on playing with
    // mbed application board motion sensors.
    //
    // Originally 0.097 was sufficient, but I get false 
    // motion of 0.14 sometimes.  This makes it somewhat less
    // responsive to small motion, but better than too many
    // false alarms.  I should look into motion sensors to
    // see what is up or if something has been fixed??
    min_motion.x = 0.15;  
    min_motion.y = 0.15;  
    min_motion.z = 0.15; 
	max_samples_limit = 100; // Max motion buffer is 100 deep
    max_samples = 20;
    sample_ptr = 0;
    wrapped_once = false;
	// WARNING - width here is important - must be 7 characters!
    motion_samples.resize(max_samples,"0.00000");
}

bool Motion::change_max_samples(int num_samples) {
    // WARNING - setting this dumps all saved data!
    if (num_samples > 0 && num_samples <= max_samples_limit) {
        max_samples = num_samples;
		// WARNING - width here is important - must be 7 characters!
        motion_samples.resize(max_samples, "0.00000");
		return true;
    }
    else {
        return false;
    }
}

void Motion::add_sample(double sample) {
    std::string str_sample;
    convert_sample(sample, str_sample);
    if (sample_ptr == max_samples) {
        wrapped_once = true;
        sample_ptr = 0;
        motion_samples[sample_ptr] = str_sample;
    }
    else {
        motion_samples[sample_ptr++] = str_sample;
    }
}

bool Motion::set_motion_thresh(motion_vec motion_thresh) {
	// FIXME - maybe add limit checking here.  At least 
	// limit to 7 character values?
	min_motion.x = motion_thresh.x;
	min_motion.y = motion_thresh.y;
	min_motion.z = motion_thresh.z;
	return true;
}

motion_vec Motion::get_motion_thresh(void) {
    return min_motion;
}

int Motion::get_max_samples() {
	return max_samples;
}

const std::vector<std::string> &Motion::get_samples(void) {
    // FIXME - need to copy out samples in order of oldest
    // to newest or maybe not if change to contain timestamp
    // and let the host worry about adding it.  If use multi-map
    // it would be sorted automatically.  Maybe a better idea.
    return motion_samples;
}