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:
- 3:3a5fdfdabca3
- Parent:
- 1:a71236906eed
- Child:
- 4:73f9d7560e93
diff -r ce4056f10202 -r 3a5fdfdabca3 main.cpp --- a/main.cpp Wed Sep 24 21:55:13 2014 +0000 +++ b/main.cpp Thu Sep 25 03:38:14 2014 +0000 @@ -72,7 +72,7 @@ int num_retries = MAX_TRIES; // heartrate values and iteration counter - volatile int iteration_counter = 0; + volatile int iteration_counter = 1; volatile int oldhrmCounter = HRM_MAX+1; volatile int hrmCounter = HRM_OFF; @@ -98,7 +98,7 @@ if(data_effect) { int tmp = 60 * (NUM_SLOTS-1) * 1000; hrmCounter = tmp/(temp[NUM_SLOTS-1]-temp[0]); - LOG_CONSOLE("Heart_rate_is: %d bpm\r\n",hrmCounter); + LOG_CONSOLE("New heartrate: %d bpm\r\n",hrmCounter); } data_effect=1; //sign bit } @@ -137,7 +137,6 @@ // Get the heartrate from the sensor int get_heartrate() { - ++iteration_counter; return hrmCounter; } @@ -145,7 +144,8 @@ void create_heartrate_record(ErrorHandler *logger,SalesforceInterface *sf) { // create a new record MbedJSONValue bpm_record; - bpm_record[hrm_bpm_field_name] = (int)get_heartrate(); + int heartrate = (int)get_heartrate(); + 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; @@ -166,6 +166,8 @@ 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; + ++iteration_counter; } else { // failure @@ -180,55 +182,66 @@ void update_heartrate_record(ErrorHandler *logger,SalesforceInterface *sf) { logger->turnLEDOrange(); - // update am existing record - assume "name" is the proper key for the record you wish to update... - MbedJSONValue bpm_record; - int bpm = get_heartrate(); - bpm_record[hrm_bpm_field_name] = bpm; - 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; - - // DEBUG - logger->log("ARM Salesforce HRM v%s\r\nUpdate HR(%d): %d bpm\r\nSending...",APP_VERSION,iteration_counter,bpm); - logger->logConsole("Update: updated record: %s",bpm_record.serialize().c_str()); + // get our latest heartrate + int heartrate = get_heartrate(); - // update the BPM record in salesforce.com - bool updated = sf->updateRecord(hrm_object_name,bpm_record_id,bpm_record); - - // display the result - if (updated) { - // SUCCESS - logger->log("ARM Salesforce HRM v%s\r\nUpdate HR(%d): %d bpm\r\nSending...SUCCESS",APP_VERSION,iteration_counter,bpm); - logger->logConsole("Update: successful! http_code=%d",sf->httpResponseCode()); - logger->turnLEDGreen(); + // only update SF if we have a valid change + if (heartrate > 0 && heartrate != oldhrmCounter) { + // 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; + 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; + + // DEBUG + logger->log("ARM Salesforce HRM v%s\r\nUpdate HR(%d): %d bpm\r\nSending...",APP_VERSION,iteration_counter,heartrate); + logger->logConsole("Update: updated record: %s",bpm_record.serialize().c_str()); + + // update the BPM record in salesforce.com + bool updated = sf->updateRecord(hrm_object_name,bpm_record_id,bpm_record); + + // display the result + if (updated) { + // SUCCESS + 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; } + } + else { + if (num_retries > 0) { + // retry state + logger->turnLEDPurple(); + + // OAUTH token may have expired - reset and retry + logger->logConsole("Retrying update (%d of %d)...",(MAX_TRIES - num_retries)+1, MAX_TRIES); + if (num_retries == MAX_TRIES) --iteration_counter; // one time only in retries... + --num_retries; + sf->resetSalesforceToken(); + update_heartrate_record(logger,sf); + } + else { + // failure + logger->log("ARM Salesforce HRM v%s\r\nUpdate HR(%d): %d bpm\r\nSending...FAILED",APP_VERSION,iteration_counter,heartrate); + logger->logConsole("Update: FAILED http_code=%d",sf->httpResponseCode()); + do_loop = false; + + // give-up state + logger->turnLEDRed(); + } + } } else { - if (num_retries > 0) { - // retry state - logger->turnLEDPurple(); - - // OAUTH token may have expired - reset and retry - if (num_retries == MAX_TRIES) --iteration_counter; // one time only in retries... - --num_retries; - sf->resetSalesforceToken(); - update_heartrate_record(logger,sf); - } - else { - // failure - logger->log("ARM Salesforce HRM v%s\r\nUpdate HR(%d): %d bpm\r\nSending...FAILED",APP_VERSION,iteration_counter,bpm); - logger->logConsole("Update: FAILED http_code=%d",sf->httpResponseCode()); - do_loop = false; - - // give-up state - logger->turnLEDRed(); - } + logger->logConsole("Heartrate unchanged..."); + logger->turnLEDGreen(); } } // Report heart rate to Salesforce.com void report_heartrate(ErrorHandler *logger,SalesforceInterface *sf) { - if (iteration_counter == 0) create_heartrate_record(logger,sf); + if (iteration_counter == 1) create_heartrate_record(logger,sf); else update_heartrate_record(logger,sf); }