HSP Platform firmware evaluating ECG data and hearth rate over PPG data.

Dependencies:   max32630fthr Adafruit_FeatherOLED USBDevice

Committer:
phonemacro
Date:
Thu Mar 25 21:59:17 2021 +0000
Revision:
4:682a4ebb995a
Parent:
1:f60eafbf009a
fix compile errors from mbed OS changes.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gmehmet 1:f60eafbf009a 1 #include "MaximSensor.h"
gmehmet 1:f60eafbf009a 2 #include "MAX30001_Helper.h"
gmehmet 1:f60eafbf009a 3 #include "Peripherals.h"
gmehmet 1:f60eafbf009a 4 #include "EcgComm_Defines.h"
gmehmet 1:f60eafbf009a 5
gmehmet 1:f60eafbf009a 6
gmehmet 1:f60eafbf009a 7
gmehmet 1:f60eafbf009a 8
gmehmet 1:f60eafbf009a 9 /// define stream out fifo
gmehmet 1:f60eafbf009a 10 #define MAX_ECG_REPORT_COUNT 256
gmehmet 1:f60eafbf009a 11 /// allocate a large fifo buffer for streaming out
gmehmet 1:f60eafbf009a 12 static uint8_t streamOutBuffer[sizeof(ecg_sensor_report) * MAX_ECG_REPORT_COUNT];
gmehmet 1:f60eafbf009a 13
gmehmet 1:f60eafbf009a 14
gmehmet 1:f60eafbf009a 15 MAX30001_Helper::MAX30001_Helper(MAX30001 *m, InterruptIn *ir_B, InterruptIn *ir_2B)
gmehmet 1:f60eafbf009a 16 :m_max30001(m), m_max30001_InterruptB(ir_B), m_max30001_Interrupt2B(ir_2B){
gmehmet 1:f60eafbf009a 17 queue_init(&mmax30001_queue, streamOutBuffer, sizeof(ecg_sensor_report), sizeof(streamOutBuffer));
gmehmet 1:f60eafbf009a 18 printf("Constructor is called\n");
gmehmet 1:f60eafbf009a 19 m_max30001->m_max30001_int_happened_ = false;
gmehmet 1:f60eafbf009a 20 }
gmehmet 1:f60eafbf009a 21
gmehmet 1:f60eafbf009a 22
gmehmet 1:f60eafbf009a 23 int MAX30001_Helper::readRegister(uint8_t reg, uint8_t *data, int len){
gmehmet 1:f60eafbf009a 24 printf("Empty Function is Called %s", __func__);
gmehmet 1:f60eafbf009a 25 return -1;
gmehmet 1:f60eafbf009a 26 }
gmehmet 1:f60eafbf009a 27
gmehmet 1:f60eafbf009a 28 int MAX30001_Helper::writeRegister(uint8_t reg, const uint8_t data){
gmehmet 1:f60eafbf009a 29 printf("Empty Function is Called %s", __func__);
gmehmet 1:f60eafbf009a 30 return -1;
gmehmet 1:f60eafbf009a 31 }
gmehmet 1:f60eafbf009a 32
gmehmet 1:f60eafbf009a 33 int MAX30001_Helper::MS_max30001readRegister(uint8_t addr, uint32_t *return_data){
gmehmet 1:f60eafbf009a 34 return m_max30001->max30001_reg_read(static_cast<MAX30001::MAX30001_REG_map_t> (addr), return_data);
gmehmet 1:f60eafbf009a 35 }
gmehmet 1:f60eafbf009a 36
gmehmet 1:f60eafbf009a 37 int MAX30001_Helper::MS_max30001writeRegister(uint8_t addr, uint32_t data){
gmehmet 1:f60eafbf009a 38 return m_max30001->max30001_reg_write(static_cast<MAX30001::MAX30001_REG_map_t> (addr), data);
gmehmet 1:f60eafbf009a 39 }
gmehmet 1:f60eafbf009a 40
gmehmet 1:f60eafbf009a 41 int MAX30001_Helper::get_part_info(uint8_t *part_id, uint8_t *rev_id){
gmehmet 1:f60eafbf009a 42 return -1;
gmehmet 1:f60eafbf009a 43 }
gmehmet 1:f60eafbf009a 44
gmehmet 1:f60eafbf009a 45 void MAX30001_Helper::Max30001_Helper_SetInterrupts(char en){
gmehmet 1:f60eafbf009a 46 if(en){
gmehmet 1:f60eafbf009a 47 m_max30001_InterruptB->disable_irq();
gmehmet 1:f60eafbf009a 48 m_max30001_Interrupt2B->disable_irq();
gmehmet 1:f60eafbf009a 49 m_max30001_InterruptB->mode(PullUp);
gmehmet 1:f60eafbf009a 50 m_max30001_InterruptB->fall(&MAX30001Mid_IntB_Handler);
gmehmet 1:f60eafbf009a 51 m_max30001_Interrupt2B->mode(PullUp);
gmehmet 1:f60eafbf009a 52 m_max30001_Interrupt2B->fall(&MAX30001Mid_Int2B_Handler);
gmehmet 1:f60eafbf009a 53 m_max30001_InterruptB->enable_irq();
gmehmet 1:f60eafbf009a 54 m_max30001_Interrupt2B->enable_irq();
gmehmet 1:f60eafbf009a 55 MAX30001_AllowInterrupts(1);
gmehmet 1:f60eafbf009a 56 //ret |= m_max30001->max30001_sw_rst(); // Do a software reset of the MAX30001
gmehmet 1:f60eafbf009a 57 m_max30001->onDataAvailable(&StreamPacketUint32);
gmehmet 1:f60eafbf009a 58 m_max30001->m_max30001_int_happened_ = (false);
gmehmet 1:f60eafbf009a 59 }else{
gmehmet 1:f60eafbf009a 60 m_max30001_InterruptB->disable_irq();
gmehmet 1:f60eafbf009a 61 m_max30001_Interrupt2B->disable_irq();
gmehmet 1:f60eafbf009a 62 MAX30001_AllowInterrupts(0);
gmehmet 1:f60eafbf009a 63 //ret |= m_max30001->max30001_sw_rst(); // Do a software reset of the MAX30001
gmehmet 1:f60eafbf009a 64 m_max30001->m_max30001_int_happened_ = (false);
gmehmet 1:f60eafbf009a 65 }
gmehmet 1:f60eafbf009a 66 }
gmehmet 1:f60eafbf009a 67
gmehmet 1:f60eafbf009a 68 int MAX30001_Helper::Max30001Helper_InitializeECGandRtoR(){
gmehmet 1:f60eafbf009a 69 int ret = 0;
gmehmet 1:f60eafbf009a 70 /**** ENABLE CHANNELS for ECG ****/
gmehmet 1:f60eafbf009a 71 // CNFG_GEN
gmehmet 1:f60eafbf009a 72 if (m_max30001->max30001_reg_read(MAX30001::CNFG_GEN, &m_max30001->max30001_cnfg_gen.all) == -1) {
gmehmet 1:f60eafbf009a 73 return -1;
gmehmet 1:f60eafbf009a 74 }
gmehmet 1:f60eafbf009a 75 m_max30001->max30001_cnfg_gen.bit.en_ecg = 0x1; // 0b1
gmehmet 1:f60eafbf009a 76 // fmstr is default
gmehmet 1:f60eafbf009a 77 if (m_max30001->max30001_reg_write(MAX30001::CNFG_GEN, m_max30001->max30001_cnfg_gen.all) == -1) {
gmehmet 1:f60eafbf009a 78 return -1;
gmehmet 1:f60eafbf009a 79 }
gmehmet 1:f60eafbf009a 80 ret = m_max30001->max30001_PLL_lock();
gmehmet 1:f60eafbf009a 81 // MNGR_INT
gmehmet 1:f60eafbf009a 82 if (m_max30001->max30001_reg_read(MAX30001::MNGR_INT, &m_max30001->max30001_mngr_int.all) == -1) {
gmehmet 1:f60eafbf009a 83 return -1;
gmehmet 1:f60eafbf009a 84 }
gmehmet 1:f60eafbf009a 85 m_max30001->max30001_mngr_int.bit.e_fit = E_FIT; // 31
gmehmet 1:f60eafbf009a 86 // if (m_max30001->max30001_reg_write(MAX30001::MNGR_INT, m_max30001->max30001_mngr_int.all) == -1) {
gmehmet 1:f60eafbf009a 87 // return -1;
gmehmet 1:f60eafbf009a 88 // }
gmehmet 1:f60eafbf009a 89 // end of MNGR_INT
gmehmet 1:f60eafbf009a 90
gmehmet 1:f60eafbf009a 91 // Configure RtoR Parameters
gmehmet 1:f60eafbf009a 92 // MNGR_INT
gmehmet 1:f60eafbf009a 93 // if (m_max30001->max30001_reg_read(MAX30001::MNGR_INT, &m_max30001->max30001_mngr_int.all) == -1) {
gmehmet 1:f60eafbf009a 94 // return -1;
gmehmet 1:f60eafbf009a 95 // }
gmehmet 1:f60eafbf009a 96 m_max30001->max30001_mngr_int.bit.clr_rrint = 0x01; // 0b01 & 0b00 are for interrupt mode...
gmehmet 1:f60eafbf009a 97 // 0b10 is for monitoring mode... it just overwrites the data...
gmehmet 1:f60eafbf009a 98 if (m_max30001->max30001_reg_write(MAX30001::MNGR_INT, m_max30001->max30001_mngr_int.all) == -1) {
gmehmet 1:f60eafbf009a 99 return -1;
gmehmet 1:f60eafbf009a 100 }
gmehmet 1:f60eafbf009a 101 // RTOR1
gmehmet 1:f60eafbf009a 102 if (m_max30001->max30001_reg_read(MAX30001::CNFG_RTOR1, &m_max30001->max30001_cnfg_rtor1.all) == -1) {
gmehmet 1:f60eafbf009a 103 return -1;
gmehmet 1:f60eafbf009a 104 }
gmehmet 1:f60eafbf009a 105 m_max30001->max30001_cnfg_rtor1.bit.en_rtor = 0x1;
gmehmet 1:f60eafbf009a 106 if (m_max30001->max30001_reg_write(MAX30001::CNFG_RTOR1, m_max30001->max30001_cnfg_rtor1.all) == -1) {
gmehmet 1:f60eafbf009a 107 return -1;
gmehmet 1:f60eafbf009a 108 }
gmehmet 1:f60eafbf009a 109 return ret;
gmehmet 1:f60eafbf009a 110 }
gmehmet 1:f60eafbf009a 111
gmehmet 1:f60eafbf009a 112 int MAX30001_Helper::Max30001Helper_SetECGSampleRate(Max30001_Helper_ECG_Sample_Rate ecg_rate){
gmehmet 1:f60eafbf009a 113 // ECG Rate
gmehmet 1:f60eafbf009a 114 if (m_max30001->max30001_reg_read(MAX30001::CNFG_ECG, &m_max30001->max30001_cnfg_ecg.all) == -1) {
gmehmet 1:f60eafbf009a 115 return -1;
gmehmet 1:f60eafbf009a 116 }
gmehmet 1:f60eafbf009a 117 m_max30001->max30001_cnfg_ecg.bit.rate = ecg_rate;
gmehmet 1:f60eafbf009a 118 if (m_max30001->max30001_reg_write(MAX30001::CNFG_ECG, m_max30001->max30001_cnfg_ecg.all) == -1) {
gmehmet 1:f60eafbf009a 119 return -1;
gmehmet 1:f60eafbf009a 120 }
gmehmet 1:f60eafbf009a 121 pr_debug("Setting reg 0x%02X to value 0x%02X\r\n", MAX30001::CNFG_ECG, ecg_rate);
gmehmet 1:f60eafbf009a 122 return 0;
gmehmet 1:f60eafbf009a 123 }
gmehmet 1:f60eafbf009a 124
gmehmet 1:f60eafbf009a 125
gmehmet 1:f60eafbf009a 126 int MAX30001_Helper::sensor_enable(int enable){
gmehmet 1:f60eafbf009a 127 int ret = 0;
gmehmet 1:f60eafbf009a 128 queue_reset(&mmax30001_queue);
gmehmet 1:f60eafbf009a 129 memset(&m_ecg_packet_, 0, sizeof(m_ecg_packet_));
gmehmet 1:f60eafbf009a 130 m_rtor_last_bpm_ = 0;
gmehmet 1:f60eafbf009a 131 Max30001_Helper_SetInterrupts(enable);
gmehmet 1:f60eafbf009a 132 if(enable){
gmehmet 1:f60eafbf009a 133 ret = Max30001Helper_InitializeECGandRtoR();
gmehmet 1:f60eafbf009a 134 ret |= MS_Max30001_RtoR_InitStart(EN_RTOR_OP,WNDW_OP,GAIN_RTOR_OP,PAVG_OP,PTSF_OP,HOFF_OP,RAVG_OP,RHSF_OP,CLR_RRINT_OP);
gmehmet 1:f60eafbf009a 135 ret |= MS_max30001_INT_assignment(EN_ENINT_LOC, EN_EOVF_LOC, EN_FSTINT_LOC,
gmehmet 1:f60eafbf009a 136 EN_DCLOFFINT_LOC, EN_BINT_LOC,EN_BOVF_LOC,
gmehmet 1:f60eafbf009a 137 EN_BOVER_LOC,EN_BUNDR_LOC,EN_BCGMON_LOC,
gmehmet 1:f60eafbf009a 138 EN_PINT_LOC,EN_POVF_LOC,EN_PEDGE_LOC,
gmehmet 1:f60eafbf009a 139 EN_LONINT_LOC,EN_RRINT_LOC, EN_SAMP_LOC,
gmehmet 1:f60eafbf009a 140 INTB_TYPE,INT2B_TYPE);
gmehmet 1:f60eafbf009a 141 ret |= MS_max30001sync();
gmehmet 1:f60eafbf009a 142 }else{
gmehmet 1:f60eafbf009a 143 ret = m_max30001->max30001_Stop_ECG();
gmehmet 1:f60eafbf009a 144 ret |= m_max30001->max30001_Stop_RtoR();
gmehmet 1:f60eafbf009a 145 ret |= MS_max30001sync();
gmehmet 1:f60eafbf009a 146 }
gmehmet 1:f60eafbf009a 147 return ret;
gmehmet 1:f60eafbf009a 148 }
gmehmet 1:f60eafbf009a 149
gmehmet 1:f60eafbf009a 150 int MAX30001_Helper::agc_enable(int agc_enable){
gmehmet 1:f60eafbf009a 151 return -1;
gmehmet 1:f60eafbf009a 152 }
gmehmet 1:f60eafbf009a 153
gmehmet 1:f60eafbf009a 154 const char *MAX30001_Helper::get_sensor_part_name(){
gmehmet 1:f60eafbf009a 155 return "max30001";
gmehmet 1:f60eafbf009a 156 }
gmehmet 1:f60eafbf009a 157
gmehmet 1:f60eafbf009a 158 const char *MAX30001_Helper::get_sensor_name(){
gmehmet 1:f60eafbf009a 159 return "max30001";
gmehmet 1:f60eafbf009a 160 }
gmehmet 1:f60eafbf009a 161
gmehmet 1:f60eafbf009a 162 int MAX30001_Helper::get_sensor_report(ecg_sensor_report &sensor_report)
gmehmet 1:f60eafbf009a 163 {
gmehmet 1:f60eafbf009a 164 return dequeue(&mmax30001_queue, &sensor_report);
gmehmet 1:f60eafbf009a 165 }
gmehmet 1:f60eafbf009a 166
gmehmet 1:f60eafbf009a 167 int MAX30001_Helper::dump_registers(addr_val_pair *reg_vals){
gmehmet 1:f60eafbf009a 168 int i, j = 0;
gmehmet 1:f60eafbf009a 169 int ret = 0;
gmehmet 1:f60eafbf009a 170 //43 registers total
gmehmet 1:f60eafbf009a 171 for (i = 0x00; i <= 0x05; i++, j++) {
gmehmet 1:f60eafbf009a 172 reg_vals[j].addr = i;
gmehmet 1:f60eafbf009a 173 ret |= MS_max30001readRegister(i, &(reg_vals[j].val));
gmehmet 1:f60eafbf009a 174 }
gmehmet 1:f60eafbf009a 175 for (i = 0x08; i <= 0x0A; i++, j++) {
gmehmet 1:f60eafbf009a 176 reg_vals[j].addr = i;
gmehmet 1:f60eafbf009a 177 ret |= MS_max30001readRegister(i, &(reg_vals[j].val));
gmehmet 1:f60eafbf009a 178 }
gmehmet 1:f60eafbf009a 179 for (i = 0x0F; i <= 0x10; i++, j++) {
gmehmet 1:f60eafbf009a 180 reg_vals[j].addr = i;
gmehmet 1:f60eafbf009a 181 ret |= MS_max30001readRegister(i, &(reg_vals[j].val));
gmehmet 1:f60eafbf009a 182 }
gmehmet 1:f60eafbf009a 183 for (i = 0x12; i <= 0x12; i++, j++) {
gmehmet 1:f60eafbf009a 184 reg_vals[j].addr = i;
gmehmet 1:f60eafbf009a 185 ret |= MS_max30001readRegister(i, &(reg_vals[j].val));
gmehmet 1:f60eafbf009a 186 }
gmehmet 1:f60eafbf009a 187 for (i = 0x14; i <= 0x15; i++, j++) {
gmehmet 1:f60eafbf009a 188 reg_vals[j].addr = i;
gmehmet 1:f60eafbf009a 189 ret |= MS_max30001readRegister(i, &(reg_vals[j].val));
gmehmet 1:f60eafbf009a 190 }
gmehmet 1:f60eafbf009a 191 for (i = 0x17; i <= 0x18; i++, j++) {
gmehmet 1:f60eafbf009a 192 reg_vals[j].addr = i;
gmehmet 1:f60eafbf009a 193 ret |= MS_max30001readRegister(i, &(reg_vals[j].val));
gmehmet 1:f60eafbf009a 194 }
gmehmet 1:f60eafbf009a 195 for (i = 0x1A; i <= 0x1A; i++, j++) {
gmehmet 1:f60eafbf009a 196 reg_vals[j].addr = i;
gmehmet 1:f60eafbf009a 197 ret |= MS_max30001readRegister(i, &(reg_vals[j].val));
gmehmet 1:f60eafbf009a 198 }
gmehmet 1:f60eafbf009a 199 for (i = 0x1D; i <= 0x1E; i++, j++) {
gmehmet 1:f60eafbf009a 200 reg_vals[j].addr = i;
gmehmet 1:f60eafbf009a 201 ret |= MS_max30001readRegister(i, &(reg_vals[j].val));
gmehmet 1:f60eafbf009a 202 }
gmehmet 1:f60eafbf009a 203 for (i = 0x20; i <= 0x25; i++, j++) {
gmehmet 1:f60eafbf009a 204 reg_vals[j].addr = i;
gmehmet 1:f60eafbf009a 205 ret |= MS_max30001readRegister(i, &(reg_vals[j].val));
gmehmet 1:f60eafbf009a 206 }
gmehmet 1:f60eafbf009a 207 for (i = 0x30; i <= 0x47; i++, j++) {
gmehmet 1:f60eafbf009a 208 reg_vals[j].addr = i;
gmehmet 1:f60eafbf009a 209 ret |= MS_max30001readRegister(i, &(reg_vals[j].val));
gmehmet 1:f60eafbf009a 210 }
gmehmet 1:f60eafbf009a 211
gmehmet 1:f60eafbf009a 212 return ret;
gmehmet 1:f60eafbf009a 213 }
gmehmet 1:f60eafbf009a 214
gmehmet 1:f60eafbf009a 215
gmehmet 1:f60eafbf009a 216 // This function starts ECG processing
gmehmet 1:f60eafbf009a 217 int MAX30001_Helper::MS_Max30001_ECG_InitStart(uint8_t En_ecg, uint8_t Openp, uint8_t Openn,
gmehmet 1:f60eafbf009a 218 uint8_t Pol, uint8_t Calp_sel, uint8_t Caln_sel,
gmehmet 1:f60eafbf009a 219 uint8_t E_fit, uint8_t Rate, uint8_t Gain,
gmehmet 1:f60eafbf009a 220 uint8_t Dhpf, uint8_t Dlpf){
gmehmet 1:f60eafbf009a 221 int ret = 0;
gmehmet 1:f60eafbf009a 222 ret = m_max30001->max30001_ECG_InitStart(En_ecg, Openp, Openn, Pol, Calp_sel, Caln_sel, E_fit, Rate, Gain, Dhpf, Dlpf);
gmehmet 1:f60eafbf009a 223 ret |= m_max30001->max30001_synch();
gmehmet 1:f60eafbf009a 224 return ret;
gmehmet 1:f60eafbf009a 225 }
gmehmet 1:f60eafbf009a 226
gmehmet 1:f60eafbf009a 227 // This functions stops ECG processing
gmehmet 1:f60eafbf009a 228 int MAX30001_Helper::MS_Max30001_ECG_Stop(){
gmehmet 1:f60eafbf009a 229 int ret = 0;
gmehmet 1:f60eafbf009a 230 ret = m_max30001->max30001_Stop_ECG();
gmehmet 1:f60eafbf009a 231 return ret;
gmehmet 1:f60eafbf009a 232 }
gmehmet 1:f60eafbf009a 233
gmehmet 1:f60eafbf009a 234 // This functions starts R_to_R processing
gmehmet 1:f60eafbf009a 235 int MAX30001_Helper::MS_Max30001_RtoR_InitStart(uint8_t En_rtor, uint8_t Wndw, uint8_t Gain,
gmehmet 1:f60eafbf009a 236 uint8_t Pavg, uint8_t Ptsf, uint8_t Hoff,
gmehmet 1:f60eafbf009a 237 uint8_t Ravg, uint8_t Rhsf, uint8_t Clr_rrint){
gmehmet 1:f60eafbf009a 238 int ret = 0;
gmehmet 1:f60eafbf009a 239 ret = m_max30001->max30001_RtoR_InitStart(En_rtor, Wndw, Gain,
gmehmet 1:f60eafbf009a 240 Pavg, Ptsf, Hoff,
gmehmet 1:f60eafbf009a 241 Ravg, Rhsf, Clr_rrint);
gmehmet 1:f60eafbf009a 242 ret |= m_max30001->max30001_synch();
gmehmet 1:f60eafbf009a 243 return ret;
gmehmet 1:f60eafbf009a 244 }
gmehmet 1:f60eafbf009a 245
gmehmet 1:f60eafbf009a 246 // This functions stops R_to_R processing
gmehmet 1:f60eafbf009a 247 int MAX30001_Helper::MS_Max30001_RtoR_Stop(){
gmehmet 1:f60eafbf009a 248 int ret = 0;
gmehmet 1:f60eafbf009a 249 ret = m_max30001->max30001_Stop_RtoR();
gmehmet 1:f60eafbf009a 250 return ret;
gmehmet 1:f60eafbf009a 251 }
gmehmet 1:f60eafbf009a 252
gmehmet 1:f60eafbf009a 253 //This function enables the interrupts for specific parameters
gmehmet 1:f60eafbf009a 254 int MAX30001_Helper::MS_max30001_INT_assignment(uint8_t en_enint_loc, uint8_t en_eovf_loc, uint8_t en_fstint_loc,
gmehmet 1:f60eafbf009a 255 uint8_t en_dcloffint_loc, uint8_t en_bint_loc, uint8_t en_bovf_loc,
gmehmet 1:f60eafbf009a 256 uint8_t en_bover_loc, uint8_t en_bundr_loc, uint8_t en_bcgmon_loc,
gmehmet 1:f60eafbf009a 257 uint8_t en_pint_loc, uint8_t en_povf_loc, uint8_t en_pedge_loc,
gmehmet 1:f60eafbf009a 258 uint8_t en_lonint_loc, uint8_t en_rrint_loc, uint8_t en_samp_loc,
gmehmet 1:f60eafbf009a 259 uint8_t intb_Type, uint8_t int2b_Type){
gmehmet 1:f60eafbf009a 260
gmehmet 1:f60eafbf009a 261 return m_max30001->max30001_INT_assignment(static_cast<MAX30001::max30001_intrpt_Location_t> (en_enint_loc), static_cast<MAX30001::max30001_intrpt_Location_t> (en_eovf_loc), static_cast<MAX30001::max30001_intrpt_Location_t> (en_fstint_loc),
gmehmet 1:f60eafbf009a 262 static_cast<MAX30001::max30001_intrpt_Location_t> (en_dcloffint_loc), static_cast<MAX30001::max30001_intrpt_Location_t> (en_bint_loc), static_cast<MAX30001::max30001_intrpt_Location_t> (en_bovf_loc),
gmehmet 1:f60eafbf009a 263 static_cast<MAX30001::max30001_intrpt_Location_t> (en_bover_loc), static_cast<MAX30001::max30001_intrpt_Location_t> (en_bundr_loc), static_cast<MAX30001::max30001_intrpt_Location_t> (en_bcgmon_loc),
gmehmet 1:f60eafbf009a 264 static_cast<MAX30001::max30001_intrpt_Location_t> (en_pint_loc), static_cast<MAX30001::max30001_intrpt_Location_t> (en_povf_loc), static_cast<MAX30001::max30001_intrpt_Location_t> (en_pedge_loc),
gmehmet 1:f60eafbf009a 265 static_cast<MAX30001::max30001_intrpt_Location_t> (en_lonint_loc), static_cast<MAX30001::max30001_intrpt_Location_t> (en_rrint_loc), static_cast<MAX30001::max30001_intrpt_Location_t> (en_samp_loc),
gmehmet 1:f60eafbf009a 266 static_cast<MAX30001::max30001_intrpt_type_t> (intb_Type), static_cast<MAX30001::max30001_intrpt_type_t> (int2b_Type));
gmehmet 1:f60eafbf009a 267
gmehmet 1:f60eafbf009a 268 }
gmehmet 1:f60eafbf009a 269
gmehmet 1:f60eafbf009a 270 // call sync function of the sensor
gmehmet 1:f60eafbf009a 271 int MAX30001_Helper::MS_max30001sync(){
gmehmet 1:f60eafbf009a 272 return m_max30001->max30001_synch();
gmehmet 1:f60eafbf009a 273 }
gmehmet 1:f60eafbf009a 274
gmehmet 1:f60eafbf009a 275 // That Function Should Only Be called from interrupt context
gmehmet 1:f60eafbf009a 276 void MAX30001_Helper::Max30001Helper_AddDataToQueue(uint32_t id, uint32_t *buffer, uint32_t number){
gmehmet 1:f60eafbf009a 277 for(uint32_t i = 0; i != number; ++i){
gmehmet 1:f60eafbf009a 278 if(id == MAX30001_DATA_ECG){
gmehmet 1:f60eafbf009a 279 m_ecg_packet_.ecg = buffer[i];
gmehmet 1:f60eafbf009a 280 enqueue(&mmax30001_queue, &m_ecg_packet_);
gmehmet 1:f60eafbf009a 281 m_ecg_packet_.rtor = 0;
gmehmet 1:f60eafbf009a 282 m_ecg_packet_.rtor_bpm = 0;
gmehmet 1:f60eafbf009a 283 }else if(id == MAX30001_DATA_RTOR){
gmehmet 1:f60eafbf009a 284 m_ecg_packet_.rtor = buffer[i];
gmehmet 1:f60eafbf009a 285 Max30001_Helper_ConvertRtoRtoBPM(m_ecg_packet_.rtor);
gmehmet 1:f60eafbf009a 286 m_ecg_packet_.rtor_bpm = m_rtor_last_bpm_;
gmehmet 1:f60eafbf009a 287 }
gmehmet 1:f60eafbf009a 288 else{
gmehmet 1:f60eafbf009a 289 }
gmehmet 1:f60eafbf009a 290 }
gmehmet 1:f60eafbf009a 291 }
gmehmet 1:f60eafbf009a 292
gmehmet 1:f60eafbf009a 293 void MAX30001_Helper::Max30001Helper_setInterruptStatus(bool status) {
gmehmet 1:f60eafbf009a 294 m_max30001->m_max30001_int_happened_ = status;
gmehmet 1:f60eafbf009a 295 }
gmehmet 1:f60eafbf009a 296
gmehmet 1:f60eafbf009a 297 bool MAX30001_Helper::Max30001Helper_getInterruptStatus() {
gmehmet 1:f60eafbf009a 298 return m_max30001->m_max30001_int_happened_;
gmehmet 1:f60eafbf009a 299 }
gmehmet 1:f60eafbf009a 300
gmehmet 1:f60eafbf009a 301 void MAX30001_Helper::Max30001Helper_max30001_int_handler(void){
gmehmet 1:f60eafbf009a 302 m_max30001->max30001_int_handler();
gmehmet 1:f60eafbf009a 303 }
gmehmet 1:f60eafbf009a 304
gmehmet 1:f60eafbf009a 305 int MAX30001_Helper::MAX30001_Helper_Queue_Size(void){
gmehmet 1:f60eafbf009a 306 return queue_len(&mmax30001_queue);
gmehmet 1:f60eafbf009a 307 }
gmehmet 1:f60eafbf009a 308
gmehmet 1:f60eafbf009a 309 int MAX30001_Helper:: MAX30001_Helper_Invert_Waveform(void) {
gmehmet 1:f60eafbf009a 310 int ret;
gmehmet 1:f60eafbf009a 311 uint32_t return_data;
gmehmet 1:f60eafbf009a 312 ret = m_max30001->max30001_reg_read(MAX30001::CNFG_EMUX, &return_data);
gmehmet 1:f60eafbf009a 313 if(ret != 0)
gmehmet 1:f60eafbf009a 314 return ret;
gmehmet 1:f60eafbf009a 315
gmehmet 1:f60eafbf009a 316 return_data ^= ((1 << 23));
gmehmet 1:f60eafbf009a 317 ret = m_max30001->max30001_reg_write(MAX30001::CNFG_EMUX, return_data);
gmehmet 1:f60eafbf009a 318 return ret;
gmehmet 1:f60eafbf009a 319 }
gmehmet 1:f60eafbf009a 320
gmehmet 1:f60eafbf009a 321 void MAX30001_Helper::Max30001_Helper_ConvertRtoRtoBPM(uint16_t rtor_val) {
gmehmet 1:f60eafbf009a 322 const float rtor_constant = 0.0078;
gmehmet 1:f60eafbf009a 323 if(rtor_val != 0)
gmehmet 1:f60eafbf009a 324 m_rtor_last_bpm_ = (uint8_t)(60 /(rtor_constant* rtor_val));
gmehmet 1:f60eafbf009a 325 }
gmehmet 1:f60eafbf009a 326
gmehmet 1:f60eafbf009a 327 void StreamPacketUint32(uint32_t id, uint32_t *buffer, uint32_t number) {
gmehmet 1:f60eafbf009a 328 Peripherals::max30001Helper()->Max30001Helper_AddDataToQueue(id, buffer, number);
gmehmet 1:f60eafbf009a 329 }
gmehmet 1:f60eafbf009a 330
gmehmet 1:f60eafbf009a 331 /**
gmehmet 1:f60eafbf009a 332 * @brief Get sensor ID.
gmehmet 1:f60eafbf009a 333 *
gmehmet 1:f60eafbf009a 334 * @returns Sensor ID number.
gmehmet 1:f60eafbf009a 335 */
gmehmet 1:f60eafbf009a 336 unsigned char MAX30001_Helper::get_sensor_id() {
gmehmet 1:f60eafbf009a 337
gmehmet 1:f60eafbf009a 338 return( SENSOR_ID_MAX30001 );
gmehmet 1:f60eafbf009a 339
gmehmet 1:f60eafbf009a 340 }