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:
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) {