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:
Fri Sep 26 02:33:17 2014 +0000
Parent:
5:1a6c3571c663
Child:
7:d6c57c7e8411
Commit message:
incorporate GrooveEarbudSensor

Changed in this revision

GroveEarbudSensor.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
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GroveEarbudSensor.lib	Fri Sep 26 02:33:17 2014 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/users/ansond/code/GroveEarbudSensor/#618117fe4b04
--- 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) {
--- a/sf_creds.h	Thu Sep 25 05:35:26 2014 +0000
+++ b/sf_creds.h	Fri Sep 26 02:33:17 2014 +0000
@@ -1,5 +1,12 @@
- /* Tunables: Salesforce Credentials */
+ /* Tunables: Salesforce Credentials /
  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";
+*/
+ 
+ // Tunables: Salesforce Credentials
+ char *username      = "danson@austin.rr.com";
+ char *password      = "d8wjyKa0arYih5icg43dwg5avViCeWO5EvKDic4";
+ char *client_id     = "3MVG9A2kN3Bn17hvE16FXaPLpTK1CEPVbzU9kbsPVmCrERuOvm5LEz6qc1WLBwC_S.X_QcOgH9fmFqRvWt2Hh";
+ char *client_secret = "989796221362081717";
\ No newline at end of file