Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: USBDevice max32630fthr SDFileSystem
Fork of MAX30001-MAX32630FTHR-ECG-EVKIT by
Diff: HSP/Devices/MAX30001/MAX30001_RPC.cpp
- Revision:
- 0:8e4630a71eb1
diff -r 000000000000 -r 8e4630a71eb1 HSP/Devices/MAX30001/MAX30001_RPC.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/HSP/Devices/MAX30001/MAX30001_RPC.cpp Thu Apr 05 10:53:26 2018 +0300
@@ -0,0 +1,471 @@
+/*******************************************************************************
+ * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
+ * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of Maxim Integrated
+ * Products, Inc. shall not be used except as stated in the Maxim Integrated
+ * Products, Inc. Branding Policy.
+ *
+ * The mere transfer of this software does not imply any licenses
+ * of trade secrets, proprietary technology, copyrights, patents,
+ * trademarks, maskwork rights, or any other form of intellectual
+ * property whatsoever. Maxim Integrated Products, Inc. retains all
+ * ownership rights.
+ *******************************************************************************
+ */
+
+#include <stdio.h>
+#include "StringHelper.h"
+#include "MAX30001.h"
+#include "Streaming.h"
+#include "StringInOut.h"
+#include "MAX30001_helper.h"
+#include "RpcFifo.h"
+#include "RpcServer.h"
+#include "Peripherals.h"
+#include "DataLoggingService.h"
+
+int highDataRate = 0;
+
+uint32_t max30001_RegRead(MAX30001::MAX30001_REG_map_t addr) {
+ uint32_t data;
+ Peripherals::max30001()->max30001_reg_read(addr, &data);
+ return data;
+}
+
+void max30001_RegWrite(MAX30001::MAX30001_REG_map_t addr, uint32_t data) {
+ Peripherals::max30001()->max30001_reg_write(addr, data);
+}
+
+int MAX30001_WriteReg(char argStrs[32][32], char replyStrs[32][32]) {
+ uint32_t args[2];
+ uint32_t reply[1];
+ uint32_t value;
+ ProcessArgs32(argStrs, args, sizeof(args) / sizeof(uint32_t));
+
+ max30001_RegWrite((MAX30001::MAX30001_REG_map_t)args[0], args[1]);
+ reply[0] = 0x80;
+ FormatReply32(reply, sizeof(reply) / sizeof(uint32_t), replyStrs);
+ return 0;
+}
+
+int MAX30001_ReadReg(char argStrs[32][32], char replyStrs[32][32]) {
+ uint32_t args[1];
+ uint32_t reply[1];
+ uint32_t value;
+ ProcessArgs32(argStrs, args, sizeof(args) / sizeof(uint32_t));
+ value = max30001_RegRead((MAX30001::MAX30001_REG_map_t)args[0]);
+ reply[0] = value;
+ FormatReply32(reply, sizeof(reply) / sizeof(uint32_t), replyStrs);
+ return 0;
+}
+
+int MAX30001_Rbias_FMSTR_Init(char argStrs[32][32], char replyStrs[32][32]) {
+ uint32_t args[5];
+ uint32_t reply[1];
+ uint32_t value;
+ ProcessArgs32(argStrs, args, sizeof(args) / sizeof(uint32_t));
+
+ value = Peripherals::max30001()->max30001_Rbias_FMSTR_Init(args[0], // En_rbias
+ args[1], // Rbiasv
+ args[2], // Rbiasp
+ args[3], // Rbiasn
+ args[4]); // Fmstr
+
+ reply[0] = value;
+ FormatReply32(reply, sizeof(reply) / sizeof(uint32_t), replyStrs);
+ return 0;
+}
+
+int MAX30001_CAL_InitStart(char argStrs[32][32], char replyStrs[32][32]) {
+ uint32_t args[6];
+ uint32_t reply[1];
+ uint32_t value;
+ ProcessArgs32(argStrs, args, sizeof(args) / sizeof(uint32_t));
+
+ // Peripherals::serial()->printf("MAX30001_CAL_InitStart 0 ");
+ value = Peripherals::max30001()->max30001_CAL_InitStart(args[0], // En_Vcal
+ args[1], // Vmag
+ args[2], // Fcal
+ args[3], // Thigh
+ args[4], // Fifty
+ args[5]); // Vmode
+
+ reply[0] = value;
+ FormatReply32(reply, sizeof(reply) / sizeof(uint32_t), replyStrs);
+ return 0;
+}
+
+int MAX30001_ECG_InitStart(char argStrs[32][32], char replyStrs[32][32]) {
+ uint32_t args[11];
+ uint32_t reply[1];
+ uint32_t value;
+ ProcessArgs32(argStrs, args, sizeof(args) / sizeof(uint32_t));
+
+ // Peripherals::serial()->printf("MAX30001_ECG_InitStart 0 ");
+ value = Peripherals::max30001()->max30001_ECG_InitStart(args[0], // En_ecg
+ args[1], // Openp
+ args[2], // Openn
+ args[3], // Pol
+ args[4], // Calp_sel
+ args[5], // Caln_sel
+ args[6], // E_fit
+ args[7], // Rate
+ args[8], // Gain
+ args[9], // Dhpf
+ args[10]); // Dlpf
+ // Peripherals::serial()->printf("MAX30001_ECG_InitStart 1 ");
+ MAX30001_Helper_SetStreamingFlag(eStreaming_ECG, 1);
+ reply[0] = value;
+ FormatReply32(reply, sizeof(reply) / sizeof(uint32_t), replyStrs);
+ return 0;
+}
+
+int MAX30001_ECGFast_Init(char argStrs[32][32], char replyStrs[32][32]) {
+ uint32_t args[3];
+ uint32_t reply[1];
+ uint32_t value;
+ ProcessArgs32(argStrs, args, sizeof(args) / sizeof(uint32_t));
+
+ value = Peripherals::max30001()->max30001_ECGFast_Init(args[0], // Clr_Fast
+ args[1], // Fast
+ args[2]); // Fast_Th
+
+ reply[0] = value;
+ FormatReply32(reply, sizeof(reply) / sizeof(uint32_t), replyStrs);
+ return 0;
+}
+
+int MAX30001_PACE_InitStart(char argStrs[32][32], char replyStrs[32][32]) {
+ uint32_t args[9];
+ uint32_t reply[1];
+ uint32_t value;
+ ProcessArgs32(argStrs, args, sizeof(args) / sizeof(uint32_t));
+
+ value =
+ Peripherals::max30001()->max30001_PACE_InitStart(args[0], // En_pace
+ args[1], // Clr_pedge
+ args[2], // Pol
+ args[3], // Gn_diff_off
+ args[4], // Gain
+ args[5], // Aout_lbw
+ args[6], // Aout
+ args[7], // Dacp
+ args[8]); // Dacn
+
+ MAX30001_Helper_SetStreamingFlag(eStreaming_PACE, 1);
+ reply[0] = value;
+ FormatReply32(reply, sizeof(reply) / sizeof(uint32_t), replyStrs);
+ return 0;
+}
+
+int MAX30001_BIOZ_InitStart(char argStrs[32][32], char replyStrs[32][32]) {
+ uint32_t args[18];
+ uint32_t reply[1];
+ uint32_t value;
+ ProcessArgs32(argStrs, args, sizeof(args) / sizeof(uint32_t));
+
+ value = Peripherals::max30001()->max30001_BIOZ_InitStart(args[0], // En_bioz
+ args[1], // Openp
+ args[2], // Openn
+ args[3], // Calp_sel
+ args[4], // Caln_sel
+ args[5], // CG_mode
+ args[6], // B_fit
+ args[7], // Rate
+ args[8], // Ahpf
+ args[9], // Ext_rbias
+ args[10], // Gain
+ args[11], // Dhpf
+ args[12], // Dlpf
+ args[13], // Fcgen
+ args[14], // Cgmon
+ args[15], // Cgmag
+ args[16], // Phoff
+ args[17]); //INAPow_mode
+
+ MAX30001_Helper_SetStreamingFlag(eStreaming_BIOZ, 1);
+ reply[0] = value;
+ FormatReply32(reply, sizeof(reply) / sizeof(uint32_t), replyStrs);
+ return 0;
+}
+
+int MAX30001_RtoR_InitStart(char argStrs[32][32], char replyStrs[32][32]) {
+ uint32_t args[9];
+ uint32_t reply[1];
+ uint32_t value;
+ ProcessArgs32(argStrs, args, sizeof(args) / sizeof(uint32_t));
+
+ value = Peripherals::max30001()->max30001_RtoR_InitStart(args[0], // En_rtor
+ args[1], // Wndw
+ args[2], // Gain
+ args[3], // Pavg
+ args[4], // Ptsf
+ args[5], // Hoff
+ args[6], // Ravg
+ args[7], // Rhsf
+ args[8]); // Clr_rrint
+
+ MAX30001_Helper_SetStreamingFlag(eStreaming_RtoR, 1);
+ reply[0] = value;
+ FormatReply32(reply, sizeof(reply) / sizeof(uint32_t), replyStrs);
+ return 0;
+}
+
+int MAX30001_Stop_ECG(char argStrs[32][32], char replyStrs[32][32]) {
+ uint32_t reply[1];
+ Peripherals::max30001()->max30001_Stop_ECG();
+ reply[0] = 0x80;
+ FormatReply32(reply, sizeof(reply) / sizeof(uint32_t), replyStrs);
+ return 0;
+}
+int MAX30001_Stop_PACE(char argStrs[32][32], char replyStrs[32][32]) {
+ uint32_t reply[1];
+ Peripherals::max30001()->max30001_Stop_PACE();
+ reply[0] = 0x80;
+ FormatReply32(reply, sizeof(reply) / sizeof(uint32_t), replyStrs);
+ return 0;
+}
+int MAX30001_Stop_BIOZ(char argStrs[32][32], char replyStrs[32][32]) {
+ uint32_t reply[1];
+ Peripherals::max30001()->max30001_Stop_BIOZ();
+ reply[0] = 0x80;
+ FormatReply32(reply, sizeof(reply) / sizeof(uint32_t), replyStrs);
+ return 0;
+}
+int MAX30001_Stop_RtoR(char argStrs[32][32], char replyStrs[32][32]) {
+ uint32_t reply[1];
+ Peripherals::max30001()->max30001_Stop_RtoR();
+ reply[0] = 0x80;
+ FormatReply32(reply, sizeof(reply) / sizeof(uint32_t), replyStrs);
+ return 0;
+}
+int MAX30001_Stop_Cal(char argStrs[32][32], char replyStrs[32][32]) {
+ uint32_t reply[1];
+ // max30001_Stop_Cal();
+ reply[0] = 0x80;
+ FormatReply32(reply, sizeof(reply) / sizeof(uint32_t), replyStrs);
+ return 0;
+}
+
+void max30001_ServiceStreaming() {
+ char ch;
+ uint32_t val;
+ USBSerial *usbSerial = Peripherals::usbSerial();
+
+ fifo_clear(GetStreamOutFifo());
+
+ SetStreaming(TRUE);
+ clearOutReadFifo();
+ while (IsStreaming() == TRUE) {
+
+ if (fifo_empty(GetStreamOutFifo()) == 0) {
+ fifo_get32(GetStreamOutFifo(), &val);
+
+ usbSerial->printf("%02X ", val);
+
+ }
+ if (usbSerial->available()) {
+ ch = usbSerial->_getc();
+
+ MAX30001_Helper_Stop();
+ SetStreaming(FALSE);
+ fifo_clear(GetUSBIncomingFifo()); // clear USB serial incoming fifo
+ fifo_clear(GetStreamOutFifo());
+ }
+
+ }
+}
+
+int MAX30001_Start(char argStrs[32][32], char replyStrs[32][32]) {
+ uint32_t reply[1];
+ uint32_t all;
+ fifo_clear(GetUSBIncomingFifo());
+ Peripherals::max30001()->max30001_synch();
+ // max30001_ServiceStreaming();
+ highDataRate = 0;
+ Peripherals::max30001()->max30001_reg_read(MAX30001::STATUS, &all);
+ LoggingService_StartLoggingUsb();
+
+ reply[0] = 0x80;
+ FormatReply32(reply, sizeof(reply) / sizeof(uint32_t), replyStrs);
+ return 0;
+}
+
+int MAX30001_Stop(char argStrs[32][32], char replyStrs[32][32]) {
+ /* uint32_t args[1];
+ uint32_t reply[1];
+ uint32_t value;
+ //ProcessArgs32(argStrs, args, sizeof(args) / sizeof(uint32_t));
+ max30001_StopTest();
+ reply[0] = 0x80;
+ FormatReply32(reply, sizeof(reply) / sizeof(uint32_t), replyStrs);*/
+ return 0;
+}
+
+int MAX30001_INT_assignment(char argStrs[32][32], char replyStrs[32][32]) {
+ uint32_t args[17];
+ uint32_t reply[1];
+ ProcessArgs32(argStrs, args, sizeof(args) / sizeof(uint32_t));
+ /*
+ printf("MAX30001_INT_assignment ");
+ printf("%d ",args[0]);
+ printf("%d ",args[1]);
+ printf("%d ",args[2]);
+ printf("%d ",args[3]);
+ printf("%d ",args[4]);
+ printf("%d ",args[5]);
+ printf("%d ",args[6]);
+ printf("%d ",args[7]);
+ printf("%d ",args[8]);
+ printf("%d ",args[9]);
+ printf("%d ",args[10]);
+ printf("%d ",args[11]);
+ printf("%d ",args[12]);
+ printf("%d ",args[13]);
+ printf("%d ",args[14]);
+ printf("%d ",args[15]);
+ printf("%d ",args[16]);
+ printf("\n");
+ fflush(stdout);
+ */
+
+ Peripherals::max30001()->max30001_INT_assignment(
+ (MAX30001::max30001_intrpt_Location_t)args[0],
+ (MAX30001::max30001_intrpt_Location_t)args[1],
+ (MAX30001::max30001_intrpt_Location_t)args[2],
+ (MAX30001::max30001_intrpt_Location_t)args[3],
+ (MAX30001::max30001_intrpt_Location_t)args[4],
+ (MAX30001::max30001_intrpt_Location_t)args[5],
+ (MAX30001::max30001_intrpt_Location_t)args[6],
+ (MAX30001::max30001_intrpt_Location_t)args[7],
+ (MAX30001::max30001_intrpt_Location_t)args[8],
+ (MAX30001::max30001_intrpt_Location_t)args[9],
+ (MAX30001::max30001_intrpt_Location_t)args[10],
+ (MAX30001::max30001_intrpt_Location_t)args[11],
+ (MAX30001::max30001_intrpt_Location_t)args[12],
+ (MAX30001::max30001_intrpt_Location_t)args[13],
+ (MAX30001::max30001_intrpt_Location_t)args[14],
+ (MAX30001::max30001_intrpt_type_t)args[15],
+ (MAX30001::max30001_intrpt_type_t)args[16]);
+ reply[0] = 0x80;
+ FormatReply32(reply, sizeof(reply) / sizeof(uint32_t), replyStrs);
+ return 0;
+}
+
+int MAX30001_StartTest(char argStrs[32][32], char replyStrs[32][32]) {
+ uint32_t reply[1];
+ // ProcessArgs32(argStrs, args, sizeof(args) / sizeof(uint32_t));
+
+ /*** Set FMSTR over here ****/
+
+ /*** Set and Start the VCAL input ***/
+ /* NOTE VCAL must be set first if VCAL is to be used */
+ Peripherals::max30001()->max30001_CAL_InitStart(0b1, 0b1, 0b1, 0b011, 0x7FF, 0b0);
+
+ /**** ECG Initialization ****/
+ Peripherals::max30001()->max30001_ECG_InitStart(0b1, 0b1, 0b1, 0b0, 0b10, 0b11, 31, 0b00, 0b00, 0b0, 0b01);
+
+ /***** PACE Initialization ***/
+ Peripherals::max30001()->max30001_PACE_InitStart(0b1, 0b0, 0b0, 0b1, 0b000, 0b0, 0b00, 0b0, 0b0);
+
+ /**** BIOZ Initialization ****/
+ Peripherals::max30001()->max30001_BIOZ_InitStart(
+ 0b1, 0b1, 0b1, 0b10, 0b11, 0b00, 7, 0b0, 0b111, 0b0, 0b10, 0b00, 0b00, 0b0001, 0b0, 0b111, 0b0000, 0b0000);
+
+ /*** Set RtoR registers ***/
+ Peripherals::max30001()->max30001_RtoR_InitStart(
+ 0b1, 0b0011, 0b1111, 0b00, 0b0011, 0b000001, 0b00, 0b000, 0b01);
+
+ /*** Set Rbias & FMSTR over here ****/
+ Peripherals::max30001()->max30001_Rbias_FMSTR_Init(0b01, 0b10, 0b1, 0b1, 0b00);
+
+ /**** Interrupt Setting ****/
+
+ /*** Set ECG Lead ON/OFF ***/
+ // max30001_ECG_LeadOnOff();
+
+ /*** Set BIOZ Lead ON/OFF ***/
+ // max30001_BIOZ_LeadOnOff(); Does not work yet...
+
+ /**** Do a Synch ****/
+ Peripherals::max30001()->max30001_synch();
+
+ fifo_clear(GetUSBIncomingFifo());
+ max30001_ServiceStreaming();
+
+ reply[0] = 0x80;
+ FormatReply32(reply, sizeof(reply) / sizeof(uint32_t), replyStrs);
+ return 0;
+}
+/*
+static void StopAll() {
+ if (startedEcg == 1) {
+ max30001_Stop_ECG();
+ }
+ if (startedCal == 1) {
+ }
+ if (startedBioz == 1) {
+ max30001_Stop_BIOZ();
+ }
+ if (startedPace == 1) {
+ max30001_Stop_PACE();
+ }
+ if (startedRtor == 1) {
+ max30001_Stop_RtoR();
+ }
+ startedEcg = 0;
+ startedBioz = 0;
+ startedCal = 0;
+ startedPace = 0;
+ startedRtor = 0;
+}
+*/
+/*
+// switch to ECG DC Lead ON
+max30001_Enable_LeadON(0b01);
+// switch to BIOZ DC Lead ON
+max30001_Enable_LeadON(0b10);
+*/
+int MAX30001_Enable_ECG_LeadON(char argStrs[32][32], char replyStrs[32][32]) {
+ uint32_t reply[1];
+ // switch to ECG DC Lead ON
+ Peripherals::max30001()->max30001_Enable_LeadON(0b01);
+ reply[0] = 0x80;
+ FormatReply32(reply, sizeof(reply) / sizeof(uint32_t), replyStrs);
+ return 0;
+}
+int MAX30001_Enable_BIOZ_LeadON(char argStrs[32][32], char replyStrs[32][32]) {
+ uint32_t reply[1];
+ // switch to BIOZ DC Lead ON
+ Peripherals::max30001()->max30001_Enable_LeadON(0b10);
+ reply[0] = 0x80;
+ FormatReply32(reply, sizeof(reply) / sizeof(uint32_t), replyStrs);
+ return 0;
+}
+// uint32_t max30001_LeadOn; // This holds the LeadOn data, BIT1 = BIOZ Lead ON, BIT0 = ECG Lead ON
+int MAX30001_Read_LeadON(char argStrs[32][32], char replyStrs[32][32]) {
+ uint32_t reply[1];
+ // return the max30001_LeadOn var from the MAX30001 driver
+ reply[0] = Peripherals::max30001()->max30001_LeadOn;
+ FormatReply32(reply, sizeof(reply) / sizeof(uint32_t), replyStrs);
+ return 0;
+}
+

ECG, PACE, R-to-R heart peak, Bio-Z, Biopotential sensor Evaluation Kit MAX30001