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

Revision:
3:3a5fdfdabca3
Parent:
1:a71236906eed
Child:
4:73f9d7560e93
--- 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);
  }