Wilson Tang
/
HSP_RPC_GUI
Fork of the offical HSP_RPC_GUI firmware
Fork of MAXREFDES100 firmware for MAX32620HSP
HSP/Devices/MAX30001/MAX30001_RPC.cpp
- Committer:
- wt8008
- Date:
- 2020-01-28
- Revision:
- 4:18155622d30a
- Parent:
- 1:9490836294ea
File content as of revision 4:18155622d30a:
/******************************************************************************* * 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 "USBSerial.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" extern int highDataRate; extern USBSerial *usbSerialPtr; uint32_t max30001_RegRead(MAX30001::MAX30001_REG_map_t addr) { uint32_t data; Peripherals::max30001()->reg_read(addr, &data); return data; } //****************************************************************************** void max30001_RegWrite(MAX30001::MAX30001_REG_map_t addr, uint32_t data) { Peripherals::max30001()->reg_write(addr, data); } int MAX30001_WriteReg(char argStrs[32][32], char replyStrs[32][32]) { uint32_t args[2]; uint32_t reply[1]; 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()->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()->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)); value = Peripherals::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 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()->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()->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[17]; uint32_t reply[1]; uint32_t value; ProcessArgs32(argStrs, args, sizeof(args) / sizeof(uint32_t)); value = Peripherals::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 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()->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()->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()->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()->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()->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]; reply[0] = 0x80; FormatReply32(reply, sizeof(reply) / sizeof(uint32_t), replyStrs); return 0; } //****************************************************************************** void max30001_ServiceStreaming() { //char ch; uint32_t val; fifo_clear(GetStreamOutFifo()); SetStreaming(TRUE); clearOutReadFifo(); while (IsStreaming() == TRUE) { if (fifo_empty(GetStreamOutFifo()) == 0) { fifo_get32(GetStreamOutFifo(), &val); usbSerialPtr->printf("%02X ", val); } if (usbSerialPtr->available()) { usbSerialPtr->_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()->synch(); ///< max30001_ServiceStreaming(); highDataRate = 0; Peripherals::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)); Peripherals::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()->CAL_InitStart(0b1, 0b1, 0b1, 0b011, 0x7FF, 0b0); /**** ECG Initialization ****/ Peripherals::max30001()->ECG_InitStart(0b1, 0b1, 0b1, 0b0, 0b10, 0b11, 31, 0b00, 0b00, 0b0, 0b01); /***** PACE Initialization ***/ Peripherals::max30001()->PACE_InitStart(0b1, 0b0, 0b0, 0b1, 0b000, 0b0, 0b00, 0b0, 0b0); /**** BIOZ Initialization ****/ Peripherals::max30001()->BIOZ_InitStart( 0b1, 0b1, 0b1, 0b10, 0b11, 0b00, 7, 0b0, 0b111, 0b0, 0b10, 0b00, 0b00, 0b0001, 0b0, 0b111, 0b0000); /*** Set RtoR registers ***/ Peripherals::max30001()->RtoR_InitStart( 0b1, 0b0011, 0b1111, 0b00, 0b0011, 0b000001, 0b00, 0b000, 0b01); /*** Set Rbias & FMSTR over here ****/ Peripherals::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()->synch(); fifo_clear(GetUSBIncomingFifo()); max30001_ServiceStreaming(); reply[0] = 0x80; FormatReply32(reply, sizeof(reply) / sizeof(uint32_t), replyStrs); return 0; } //****************************************************************************** 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()->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()->Enable_LeadON(0b10); reply[0] = 0x80; FormatReply32(reply, sizeof(reply) / sizeof(uint32_t), replyStrs); return 0; } //****************************************************************************** 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; }