Priliminary

Dependencies:   DS1307 MAX17048 MODSERIAL SSD1308_128x64_I2C WatchDog mbed-rpc mbed

Fork of ECGAFE_copy by Zainul Charbiwala

Revision:
0:ee0649a9025a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Sep 30 11:30:56 2015 +0000
@@ -0,0 +1,306 @@
+// Copyright 2013, Zainul Charbiwala
+
+/* Includes */
+#include "mbed.h"
+#include "ADS1298.h"
+#include "SSD1308.h"
+#include "ds1307.h"
+#include "MAX17048.h"
+#include "WatchDog.h"
+#include "oledicons.h"
+#include "mbed_rpc.h"
+#include "DebouncedIn.h"
+#include "MODSERIAL.h"
+
+/* mbed Objects */
+DigitalOut myled(LED1);
+DigitalOut lWatchdog(LED4);
+WatchDog_ms wdt(10000);
+Ticker wdtTicker;
+MODSERIAL pc(USBTX, USBRX);
+Timer tt;
+I2C i2c(p28, p27); // sda, scl
+SSD1308 oled = SSD1308(i2c, SSD1308_SA0);
+ADS1298 ads = ADS1298(p5, p6, p7, p24, p23, p22, p21); //mosi, miso, sclk, cs, reset, drdy, start
+DS1307 rtc(p28,p27); // start DS1307 class and give it pins for connections of the DS1307 device
+MAX17048 gauge(p28, p27);
+DigitalIn battChging(p14);           
+DebouncedIn button(p20);
+
+/* Constants */
+#define OLEDPAGEMAX 14
+// Page 0 for general use
+// Page 1-12 for signals
+// Page 13 for network status
+// Page 14 for something else
+
+/* Global Variables */
+uint8_t buf[27];
+char rpcInBuf[256], rpcOutBuf[256];
+int vCapturing;
+
+static char oledstr[16];
+static int vOledPage;
+
+/* External Functions */
+
+/* Local Functions */
+static void dataReady(void);
+static void wdtKicker();
+static void oledBattery(uint8_t percentage, uint8_t charging);
+static void oledNetwork(uint8_t percentage, const char *mode);
+static void oledTime();
+static void fCaptureStart(Arguments *arg, Reply *r);
+static void fCaptureStop(Arguments *arg, Reply *r);
+static void fButtonLongPress();
+static void fButtonShortPress();
+static void fOledPage0();
+static void fOledPageSignal();
+static void fOledPageNetwork();
+static void fOledPageSomethingElse();
+
+
+/* RPC Variables */
+RPCVariable<int> rpc_vCapturing(&vCapturing, "vCapturing");
+
+/* RPC Functions */
+RPCFunction rpc_fCaptureStart(&fCaptureStart, "fCaptureStart");
+RPCFunction rpc_fCaptureStop(&fCaptureStop, "fCaptureStop");
+
+
+static void wdtKicker() {
+        wdt.feed();
+}
+
+static void fCaptureStart(Arguments *arg, Reply *r){
+  vCapturing = 1;                                                 
+  ads.startCapture();
+  oled.writeString(7, 0, "Capture started.");
+}
+
+static void fCaptureStop(Arguments *arg, Reply *r){
+  vCapturing = 0;                                                 
+  ads.stopCapture();
+  oled.writeString(7, 0, "Capture stopped.");                                                 
+}
+
+static void fOledPage0() {
+  oled.writeString(5, 0, "  HR:  xxx bpm  ");
+  oled.writeString(6, 0, "  LO:           ");
+
+  sprintf(oledstr, "Display Page: %02d", vOledPage); 
+  oled.writeString(7, 0, oledstr);
+  
+}
+
+static void fOledPageSignal() {
+  sprintf(oledstr, "Display Page: %02d", vOledPage); 
+  oled.writeString(7, 0, oledstr);
+  
+}
+
+static void fOledPageNetwork() {
+  sprintf(oledstr, "Display Page: %02d", vOledPage); 
+  oled.writeString(7, 0, oledstr);
+  
+}
+
+static void fOledPageSomethingElse() {
+  sprintf(oledstr, "Display Page: %02d", vOledPage); 
+  oled.writeString(7, 0, oledstr);
+  
+}
+
+static void fButtonShortPress()
+{
+  // Scroll to the next page of the oled display
+  vOledPage++;
+  if (vOledPage > OLEDPAGEMAX) {
+    vOledPage = 0;
+  }
+  if (vOledPage == 0) {
+    fOledPage0();
+  }
+  if (vOledPage >= 1 && vOledPage <= 12) {
+    fOledPageSignal();
+  }
+  if (vOledPage == 13) {
+    fOledPageNetwork();
+  }
+  if (vOledPage == 0) {
+    fOledPageSomethingElse();
+  }
+}
+
+static void fButtonLongPress()
+{
+  // If in capture mode, stop capture
+  // If not in capture mode, start capture 
+  if (vCapturing) {
+    oled.writeString(7, 0, "Capture Stopping");
+    fCaptureStop(NULL, NULL);
+  } else {
+    oled.writeString(7, 0, "Capture Starting");
+    fCaptureStart(NULL, NULL);
+  }
+}
+
+
+static void oledBattery(uint8_t percentage, uint8_t charging)
+{
+    // Hardcoded a 24 column, 1 page high battery meter icon
+    // It has 18 columns that can be set
+    uint8_t battimg[24];
+    uint8_t i;
+    percentage=(percentage>100?100:percentage);
+    memcpy((uint8_t *)battimg, (uint8_t *)iconBattery, 24);
+    for (i=2; i<2+(18*percentage)/100; i++) {
+        battimg[i] |= 0x3C;
+    }
+    
+    if (charging) {
+        for (i=0; i<20; i++) {
+            battimg[i+2] ^= iconBattChg[i];
+        }
+    } 
+    oled.writeBitmap((uint8_t*) battimg, 0, 0, 104, 127);
+}
+
+static void oledNetwork(uint8_t percentage, const char *mode)
+{
+    // Hardcoded a 16 column, 1 page high network meter icon
+    // It has 6 columns that can be set
+    uint8_t netwimg[16];
+    percentage=(percentage>100?100:percentage);
+    memcpy((uint8_t *)netwimg, (uint8_t *)iconNetwork, 16);
+    
+    if (percentage > 0)
+        netwimg[1] = 0xF0;
+    if (percentage > 16)
+        netwimg[2] = 0xF0;
+    if (percentage > 33)
+        netwimg[6] = 0xFC;
+    if (percentage > 49)
+        netwimg[7] = 0xFC;
+    if (percentage > 66)
+        netwimg[11] = 0xFF;
+    if (percentage > 83)
+        netwimg[12] = 0xFF;
+   
+    oled.writeBitmap((uint8_t*) netwimg, 0, 0, 0, 15);
+    oled.writeString(0, 2, mode);
+}
+
+static void oledTime()
+{
+    int sec = 0, min = 0, hours = 0;
+    int day = 0, date = 0, month = 0, year = 0;
+    int ret = 0;
+
+    char timestr[7];
+    ret = rtc.gettime( &sec, &min, &hours, &day, &date, &month, &year);
+    if (ret == 0) {
+        if (hours == 0) {
+            sprintf(timestr, "%02d:%02da", hours+12, min);
+        } else if (hours == 12) {
+            sprintf(timestr, "%02d:%02dp", hours, min);        
+        } else if (hours>12) {
+            sprintf(timestr, "%02d:%02dp", hours-12, min);
+        } else {
+            sprintf(timestr, "%02d:%02da", hours, min);
+        }
+        oled.writeString(0, 5, timestr);
+    } else {
+        oled.writeString(0, 5, "00:00!");
+    }
+    
+}
+
+static void fSetTime()
+{
+}
+
+void dataReady()
+{
+  ads.readData(buf);
+  ads.updateLeadOff(buf);
+    
+  if (vCapturing) {
+    // Send it to the serial port
+    // How much time does this take ?
+    // We have 2ms until the next interrupt comes
+    //pc.printf("\r\n%d", tt.read_ms());
+    for (int i=0; i<27; i++) {
+        //if (!(i%3)) pc.printf(" ");
+        //pc.printf("%02x", buf[i]);
+        pc.putc(buf[i]);
+    }
+  }
+  myled = !myled;
+}
+
+
+
+int main() {
+    uint8_t lev=0;
+    char ch;
+
+    vOledPage = 0;
+    vCapturing = 0;
+    i2c.frequency(400000); // according to the spec the max bitrate for the SSD1308 is 400 kbit/s
+    battChging.mode(PullUp);
+    pc.baud(921600);
+    pc.printf("starting\r\n");
+
+    wdtTicker.attach(&wdtKicker, 5);
+
+    myled=1;
+    oled.setDisplayOn();
+    oled.writeString(7, 0, "Initializing... ");
+    ads.initialize(&dataReady);
+    if (!gauge.open()) {
+        oled.writeString(7, 0, "Gauge Error !!!");
+        wait(5);
+    }
+    
+    fCaptureStart(NULL, NULL);
+    
+    while(1) {
+      wait(0.1);
+      
+      // Check if there's a command over RPC
+      if (pc.readable()) {
+        pc.gets(rpcInBuf, 256);
+        RPC::call(rpcInBuf, rpcOutBuf); 
+        //pc.printf("%s", rpcOutBuf);
+      }
+      
+      // Check if there's a user event
+      if (button.releasing()) {
+        // Short press
+        if (button.pressed() < 50) {
+          fButtonShortPress();
+        } 
+        // Long press
+        if (button.pressed() > 100) {
+          fButtonLongPress();
+        }
+      }
+      
+      // Update battery status icon
+      oledBattery(gauge.socInt(), !battChging);
+      // Update time
+      oledTime();
+      // Update network
+      if (++lev > 100) lev = 0;
+      oledNetwork(lev, "H");
+    
+      //Print the current state of charge
+      sprintf(oledstr, "VCell = %.2fV\n", gauge.vcell());
+      oled.writeString(3, 0, oledstr);
+    
+      //myled = !myled;
+    }
+
+
+}