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 Doug Anson

Files at this revision

API Documentation at this revision

Comitter:
ansond
Date:
Thu Sep 25 03:38:14 2014 +0000
Parent:
2:ce4056f10202
Child:
4:73f9d7560e93
Commit message:
updates

Changed in this revision

Definitions.h Show annotated file Show diff for this revision Revisions of this file
SalesforceInterface.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
sf_creds.h Show annotated file Show diff for this revision Revisions of this file
--- a/Definitions.h	Wed Sep 24 21:55:13 2014 +0000
+++ b/Definitions.h	Thu Sep 25 03:38:14 2014 +0000
@@ -38,7 +38,7 @@
  #define BLINK_TIME                250
  
  // Max number of retries
- #define MAX_TRIES                 3
+ #define MAX_TRIES                 4
  
  // Wait Time for iterations (ms)
  #define WAIT_TIME_MS              10000
--- a/SalesforceInterface.lib	Wed Sep 24 21:55:13 2014 +0000
+++ b/SalesforceInterface.lib	Thu Sep 25 03:38:14 2014 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/ansond/code/SalesforceInterface/#7dc9b949bbc3
+http://mbed.org/users/ansond/code/SalesforceInterface/#6a791e5449b3
--- 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);
  }
    
--- a/sf_creds.h	Wed Sep 24 21:55:13 2014 +0000
+++ b/sf_creds.h	Thu Sep 25 03:38:14 2014 +0000
@@ -2,5 +2,4 @@
  char *username      = "xxx@yyy.zzz";
  char *password      = "password_goes_here";            // must be of the form: [password][security token]
  char *client_id     = "customer key goes here";
- char *client_secret = "client secret goes here";
- 
\ No newline at end of file
+ char *client_secret = "client secret goes here";
\ No newline at end of file