drives the mdot used for bob demo
Dependencies: h3lis331dl libmDot mbed-rtos mbed-src
main.cpp
- Committer:
- daveheitzman
- Date:
- 2015-10-23
- Revision:
- 0:910b4d5df41e
File content as of revision 0:910b4d5df41e:
// ---------------- // CTIA Helmet Demo // ---------------- #include "mbed.h" #include "mDot.h" #include "rtos.h" #include <H3LIS331DL.h> #include <string> #include <vector> #define G_THRESHOLD 5 //please get these value by running H3LIS331DL_AdjVal #define VAL_X_AXIS 71 //68 #define VAL_Y_AXIS 97 //38 #define VAL_Z_AXIS 722 //664 #define GAIN 0.003 // these options must match the settings on your Conduit static std::string config_network_name = "Escalation"; static std::string config_network_pass = "Escalation"; static uint8_t config_frequency_sub_band = 3; //Globals mDot* dot; H3LIS331DL* h3lis=new H3LIS331DL(I2C_SDA, I2C_SCL); DigitalOut led(LED1); Ticker ledTick; Ticker heart; Timer timer; volatile bool timeToSendHeartbeat = true; //Function prototypes void log_error(mDot* dot, const char* msg, int32_t retval); bool setFrequencySubBand(uint8_t subBand); bool setNetworkName(const std::string name); bool setNetworkPassphrase(const std::string passphrase); bool setAck(uint8_t retries); bool joinNetwork(); bool sendData(const std::string text); H3LIS331DL* rebuild(H3LIS331DL* h3lis ); void ledTock() { led = !led; } void beat() { timeToSendHeartbeat = true; } int begin; int main() { int32_t ret; unsigned char id; std::vector<uint8_t> data; char data_str[40]; int16_t x=0, y=0, z=0, x_max=0, y_max=0, z_max=0; uint16_t vector_sum=0, vector_sum_max=0; ledTick.attach(&ledTock, 0.1); // get the mDot handle dot = mDot::getInstance(); // reset to default config so we know what state we're in dot->resetConfig(); dot->getDeviceId(); printf("\r\n\r\n"); printf("=======================\r\n"); printf(" CTIA Helment Demo\r\n"); printf("=======================\r\n"); printf("Library version: %s\r\n\r\n", dot->getId().c_str()); // set up the mDot with our network information setFrequencySubBand(config_frequency_sub_band); setNetworkName(config_network_name); setNetworkPassphrase(config_network_pass); setAck(0); //disable acks printf("Initializing accelerometer...\r\n"); // H3LIS331DL_FULLSCALE_4 = +- 200g, H3LIS331DL_FULLSCALE_2 = +- 100g h3lis->init(H3LIS331DL_ODR_1000Hz, H3LIS331DL_NORMAL, H3LIS331DL_FULLSCALE_2); // h3lis.init(H3LIS331DL_ODR_100Hz, H3LIS331DL_NORMAL, H3LIS331DL_FULLSCALE_2); if (!h3lis->getWHO_AM_I(&id)) { printf("Failed to initialize accelerometer!\r\n"); return 0; } // Join network while (!joinNetwork()) { wait(5); }; ledTick.detach(); led = 1; heart.attach(&beat, 10); timer.start(); while (true) { begin = timer.read_us(); h3lis->readXYZ(&x,&y,&z); x = (x - VAL_X_AXIS) * GAIN; y = (y - VAL_Y_AXIS) * GAIN; z = (z - VAL_Z_AXIS) * GAIN; // printf takes about 50 ms ! // printf("Reading: X:% d Y:% d Z:% d, timer: % d\r\n", x, y, z, begin); vector_sum = sqrt((double)(x*x + y*y + z*z)); // If impact occuring if (vector_sum > G_THRESHOLD) { //Update peak forces if needed if (vector_sum > vector_sum_max) { vector_sum_max = vector_sum; x_max = x; y_max = y; z_max = z; } printf("Reading: X:% d Y:% d Z:% d\r\n", x, y, z); } // If impact detected else if (vector_sum_max > 0) { printf("IMPACT: X:% d Y:% d Z:% d\r\n", x_max, y_max, z_max); sprintf(data_str, "%d,%d,%d", x_max, y_max, z_max); // send the data sendData(data_str); // Reset maximums vector_sum_max = 0; x_max = 0; y_max = 0; z_max = 0; timeToSendHeartbeat = false; } //Idle else { if (timeToSendHeartbeat) { sendData("heartbeat"); timeToSendHeartbeat = false; } } wait_ms(10); //Accelerometer reading updates every 1ms } return 0; } void log_error(mDot* dot, const char* msg, int32_t retval) { printf("%s - %ld:%s, %s\r\n", msg, retval, mDot::getReturnCodeString(retval).c_str(), dot->getLastError().c_str()); } bool setFrequencySubBand(uint8_t subBand) { int32_t ret; printf("Setting frequency sub band to '%d'...\r\n", subBand); if ((ret = dot->setFrequencySubBand(subBand)) != mDot::MDOT_OK) { log_error(dot, "Failed to set frequency sub band", ret); return false; } return true; } bool setNetworkName(const std::string name) { int32_t ret; printf("Setting network name to '%s'...\r\n", name.c_str()); if ((ret = dot->setNetworkName(name)) != mDot::MDOT_OK) { log_error(dot, "Failed to set network name", ret); return false; } return true; } bool setNetworkPassphrase(const std::string passphrase) { int32_t ret; printf("Setting passphrase...\r\n"); if ((ret = dot->setNetworkPassphrase(passphrase)) != mDot::MDOT_OK) { log_error(dot, "Failed to set network password", ret); return false; } return true; } bool setAck(uint8_t retries) { int32_t ret; printf("Setting ack...\r\n"); if ((ret = dot->setAck(retries)) != mDot::MDOT_OK) { log_error(dot, "Failed to set ack", ret); return false; } return true; } bool joinNetwork() { int32_t ret; printf("\r\nJoining network... "); // reset to default config so we know what state we're in if ((ret = dot->joinNetwork()) != mDot::MDOT_OK) { log_error(dot, "Failed", ret); dot->resetConfig(); dot->getDeviceId(); osDelay(200); return false; } printf("Network Joined!\r\n"); return true; } bool sendData(const std::string text) { if (dot->getNextTxMs() != 0) { printf("Sending in %lu ms...\r\n", dot->getNextTxMs()); return false; } int32_t ret; printf("Sending: '%s' ", text.c_str()); std::vector<uint8_t> data(text.begin(), text.end()); if ((ret = dot->send(data, 1)) != mDot::MDOT_OK) { log_error(dot, "Failed to send data", ret); return false; } printf("Data sent!\r\n"); return true; } H3LIS331DL* rebuild(H3LIS331DL* h3lis ){ H3LIS331DL* new_h3lis = new H3LIS331DL( I2C_SDA, I2C_SCL ); delete h3lis; new_h3lis->init(H3LIS331DL_ODR_1000Hz, H3LIS331DL_NORMAL, H3LIS331DL_FULLSCALE_2); return new_h3lis; }