salesforce HeartRate monitor sample application. This application sends periodic heart rate values into salesforce.com via the mbed SalesforceInterface API.
Dependencies: BufferedSerial C12832 EthernetInterface GroveEarbudSensor Logger SalesforceInterface mbed-rtos mbed
Fork of df-2014-salesforce-hrm-k64f by
Diff: main.cpp
- Revision:
- 6:d5a7ca880c20
- Parent:
- 4:73f9d7560e93
- Child:
- 10:4c526b2bd92c
--- a/main.cpp Thu Sep 25 05:35:26 2014 +0000 +++ b/main.cpp Fri Sep 26 02:33:17 2014 +0000 @@ -21,11 +21,6 @@ #include "Definitions.h" // definitions including platform specifics... #include "ErrorHandler.h" - // HRM sensor defines - #define HRM_OFF 0 // earbud sensor is offline - #define HRM_MIN 10 // min HRM - #define HRM_MAX 250 // max HRM - // include salesforce.com credentials #include "sf_creds.h" @@ -37,9 +32,10 @@ // mbed AppBoard Shield LCD C12832 lcd(D11, D13, D12, D7, D10); - // Earbud - InterruptIn earbud(D0); - Timer t; + // Earbud support + #include "GroveEarbudSensor.h" + InterruptIn sensor(D0); + GroveEarbudSensor earbud(&sensor,&pc); // Ethernet #include "EthernetInterface.h" @@ -72,86 +68,24 @@ int num_retries = MAX_TRIES; // heartrate values and iteration counter + volatile int oldheartrate = HEARTRATE_OFF; volatile int iteration_counter = 1; - volatile int oldhrmCounter = HRM_MAX+1; - volatile int hrmCounter = HRM_OFF; - - // Earbud sensor tunables - #define NUM_SLOTS 11 // larger numbers give more fidelity but slow down the acquisition response rate - volatile unsigned char counter = 0; - volatile unsigned long temp[NUM_SLOTS]; - volatile unsigned long sub = 0; - volatile bool data_effect = true; - const int max_heartpluse_duty = 2000; // Change to follow your system's request. System returns error if the duty overtrips by 2 seconds. (in MS) // Salesforce.com record ID DEFINE_SML_BUFFER(bpm_record_id); - - // initialize the array - void arrayInit() { - for(int i=0;i<(NUM_SLOTS-1);++i) temp[i]=0; - temp[NUM_SLOTS-1] = t.read_ms(); - } - - // summation function - void sum() { - if(data_effect) { - int tmp = 60 * (NUM_SLOTS-1) * 1000; - hrmCounter = tmp/(temp[NUM_SLOTS-1]-temp[0]); - LOG_CONSOLE("New heartrate: %d bpm\r\n",hrmCounter); - } - data_effect=1; //sign bit -} - - // interrupt() function for earbud - void interrupt() { - temp[counter] = t.read_ms(); - switch(counter) { - case 0: - sub=temp[counter]-temp[NUM_SLOTS-1]; - break; - default: - sub=temp[counter]-temp[counter-1]; - break; - } - if(sub > max_heartpluse_duty) { //set 2 seconds as max heart pluse duty - data_effect=0;//sign bit - counter=0; - LOG_CONSOLE("Heart rate measure error. Restarting...\r\n"); - arrayInit(); - t.stop(); - t.start(); - } - if (counter == (NUM_SLOTS-1) && data_effect) { - counter=0; - sum(); - } - else if(counter != (NUM_SLOTS-1) && data_effect) { - counter++; - } - else { - counter=0; - data_effect=1; - } - } - - // Get the heartrate from the sensor - int get_heartrate() { - return hrmCounter; - } // Create the heart rate record in Salesforce.com void create_heartrate_record(ErrorHandler *logger,SalesforceInterface *sf) { // create a new record MbedJSONValue bpm_record; - int heartrate = (int)get_heartrate(); + int heartrate = (int)earbud.getHeartRate(); bpm_record[hrm_bpm_field_name] = heartrate; bpm_record[hrm_user_field_name] = hrm_user; bpm_record[hrm_counter_field_name] = (int)iteration_counter; bpm_record[hrm_latitude] = SENSOR_LATITUDE; bpm_record[hrm_longitude] = SENSOR_LONGITUDE; - logger->log("ARM Salesforce HRM v%s\r\nCreate: new bpm record(%d): %d\r\nSending...",APP_VERSION,iteration_counter,hrmCounter); + logger->log("ARM Salesforce HRM v%s\r\nCreate: new bpm record(%d): %d\r\nSending...",APP_VERSION,iteration_counter,heartrate); logger->logConsole("Initializing BPM record: %s",bpm_record.serialize().c_str()); // create the BPM record in salesforce.com @@ -161,17 +95,17 @@ char *result = (char *)response.serialize().c_str(); if (result != NULL && strlen(result) > 0 && strcmp(result,"null") != 0) { // save off the token if we succeeded - logger->log("ARM Salesforce HRM v%s\r\nCreate: new bpm record(%d): %d\r\nSending...SUCCESS",APP_VERSION,iteration_counter,hrmCounter); + logger->log("ARM Salesforce HRM v%s\r\nCreate: new bpm record(%d): %d\r\nSending...SUCCESS",APP_VERSION,iteration_counter,heartrate); logger->logConsole("Create: result: %s http_code = %d",result,sf->httpResponseCode()); RESET_SML_BUFFER(bpm_record_id); strcpy(bpm_record_id,(char *)response["id"].get<std::string>().c_str()); logger->turnLEDGreen(); - if (heartrate > 0) oldhrmCounter = heartrate; + if (heartrate > 0) oldheartrate = heartrate; ++iteration_counter; } else { // failure - logger->log("ARM Salesforce HRM v%s\r\nCreate: new bpm record(%d): %d\r\nSending...FAILED",APP_VERSION,iteration_counter,hrmCounter); + logger->log("ARM Salesforce HRM v%s\r\nCreate: new bpm record(%d): %d\r\nSending...FAILED",APP_VERSION,iteration_counter,heartrate); logger->logConsole("Create: FAILED http_code=%d",sf->httpResponseCode()); logger->turnLEDRed(); do_loop = false; @@ -183,10 +117,10 @@ logger->turnLEDOrange(); // get our latest heartrate - int heartrate = get_heartrate(); + int heartrate = (int)earbud.getHeartRate(); // only update SF if we have a valid change - if (heartrate > 0 && heartrate != oldhrmCounter) { + if (heartrate > 0 && heartrate != oldheartrate) { // update am existing record - assume "name" is the proper key for the record you wish to update... MbedJSONValue bpm_record; bpm_record[hrm_bpm_field_name] = heartrate; @@ -208,7 +142,7 @@ logger->log("ARM Salesforce HRM v%s\r\nUpdate HR(%d): %d bpm\r\nSending...SUCCESS",APP_VERSION,iteration_counter,heartrate); logger->logConsole("Update: successful! http_code=%d",sf->httpResponseCode()); logger->turnLEDGreen(); - if (heartrate > 0) { oldhrmCounter = heartrate; ++iteration_counter; } + if (heartrate > 0) { oldheartrate = heartrate; ++iteration_counter; } } else { if (num_retries > 0) { @@ -276,13 +210,6 @@ logger.logConsole("Setting credentials in the Salesforce.com interface..."); sf->setCredentials(username,password,client_id,client_secret); - // initialize the earbud - LOG_CONSOLE("Initializing Earbud...\r\n"); - t.start(); - arrayInit(); - earbud.rise(&interrupt); - hrmCounter = HRM_OFF; - // enter main loop logger.logConsole("Beginning main event loop..."); while(do_loop) {