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 #ifndef _MAX30001_HELPER_H_
gmehmet 1:f60eafbf009a 2 #define _MAX30001_HELPER_H_
gmehmet 1:f60eafbf009a 3
gmehmet 1:f60eafbf009a 4
gmehmet 1:f60eafbf009a 5 #include "mbed.h"
gmehmet 1:f60eafbf009a 6 #include "MaximSensor.h"
gmehmet 1:f60eafbf009a 7 #include "MAX30001.h"
gmehmet 1:f60eafbf009a 8 #include "queue.h"
gmehmet 1:f60eafbf009a 9 #include "EcgComm.h"
gmehmet 1:f60eafbf009a 10
gmehmet 1:f60eafbf009a 11 #define SENSOR_ID_MAX30001 0x02
gmehmet 1:f60eafbf009a 12
gmehmet 1:f60eafbf009a 13 class MAX30001_Helper: public MaximSensor
gmehmet 1:f60eafbf009a 14 {
gmehmet 1:f60eafbf009a 15 public:
gmehmet 1:f60eafbf009a 16 MAX30001_Helper(MAX30001 *m, InterruptIn *ir_B, InterruptIn *ir_2B);
gmehmet 1:f60eafbf009a 17 // Inherited function implementations from MaximSensor
gmehmet 1:f60eafbf009a 18 virtual int readRegister(uint8_t reg, uint8_t *data, int len);
gmehmet 1:f60eafbf009a 19
gmehmet 1:f60eafbf009a 20 virtual int writeRegister(uint8_t reg, const uint8_t data);
gmehmet 1:f60eafbf009a 21
gmehmet 1:f60eafbf009a 22 /**
gmehmet 1:f60eafbf009a 23 * @brief Get Maxim Sensor part and revision info.
gmehmet 1:f60eafbf009a 24 * @details Reads Maxim Sensor part and revision info from device.
gmehmet 1:f60eafbf009a 25 *
gmehmet 1:f60eafbf009a 26 * @param[in] reg Beginning address of a register to be read.
gmehmet 1:f60eafbf009a 27 * @param[out] data Buffer space to save result value.
gmehmet 1:f60eafbf009a 28 * @param[in] len Number of consecutive bytes to be read.
gmehmet 1:f60eafbf009a 29 *
gmehmet 1:f60eafbf009a 30 * @returns 0 on success, negative error code on failure.
gmehmet 1:f60eafbf009a 31 */
gmehmet 1:f60eafbf009a 32 virtual int get_part_info(uint8_t *part_id, uint8_t *rev_id);
gmehmet 1:f60eafbf009a 33
gmehmet 1:f60eafbf009a 34 /**
gmehmet 1:f60eafbf009a 35 * @brief Enables Maxim Sensor.
gmehmet 1:f60eafbf009a 36 * @details Enable IRQ, enable LEDs, enable AGC
gmehmet 1:f60eafbf009a 37 *
gmehmet 1:f60eafbf009a 38 * @param[in] enable Any value to enable, 0 to disable.
gmehmet 1:f60eafbf009a 39 *
gmehmet 1:f60eafbf009a 40 * @returns 0 on success, negative error code on failure.
gmehmet 1:f60eafbf009a 41 */
gmehmet 1:f60eafbf009a 42 virtual int sensor_enable(int enable);
gmehmet 1:f60eafbf009a 43
gmehmet 1:f60eafbf009a 44 /**
gmehmet 1:f60eafbf009a 45 * @brief Enables AGC.
gmehmet 1:f60eafbf009a 46 * @details Enable Maxim Sensor automatic gain controller.
gmehmet 1:f60eafbf009a 47 * AGC automatically adjusts sampling rates and LED currents to save energy.
gmehmet 1:f60eafbf009a 48 *
gmehmet 1:f60eafbf009a 49 * @param[in] agc_enable Any value to enable, 0 to disable.
gmehmet 1:f60eafbf009a 50 *
gmehmet 1:f60eafbf009a 51 * @returns 0 on success, negative error code on failure.
gmehmet 1:f60eafbf009a 52 */
gmehmet 1:f60eafbf009a 53 virtual int agc_enable(int agc_enable);
gmehmet 1:f60eafbf009a 54
gmehmet 1:f60eafbf009a 55 /**
gmehmet 1:f60eafbf009a 56 * @brief Get sensor part name.
gmehmet 1:f60eafbf009a 57 *
gmehmet 1:f60eafbf009a 58 * @returns Sensor part name string.
gmehmet 1:f60eafbf009a 59 */
gmehmet 1:f60eafbf009a 60 virtual const char *get_sensor_part_name();
gmehmet 1:f60eafbf009a 61
gmehmet 1:f60eafbf009a 62 /**
gmehmet 1:f60eafbf009a 63 * @brief Get sensor name.
gmehmet 1:f60eafbf009a 64 *
gmehmet 1:f60eafbf009a 65 * @returns Sensor name string.
gmehmet 1:f60eafbf009a 66 */
gmehmet 1:f60eafbf009a 67 virtual const char *get_sensor_name();
gmehmet 1:f60eafbf009a 68
gmehmet 1:f60eafbf009a 69 /**
gmehmet 1:f60eafbf009a 70 * @brief Get sensor data
gmehmet 1:f60eafbf009a 71 *
gmehmet 1:f60eafbf009a 72 * @param[in] data_report sensor_report struct to fill out
gmehmet 1:f60eafbf009a 73 # @returns 0 on success, less than 0 otherwise
gmehmet 1:f60eafbf009a 74 */
gmehmet 1:f60eafbf009a 75 virtual int get_sensor_report(ecg_sensor_report &data_report);
gmehmet 1:f60eafbf009a 76
gmehmet 1:f60eafbf009a 77 /**
gmehmet 1:f60eafbf009a 78 * @brief Dump Maxim Sensor registers.
gmehmet 1:f60eafbf009a 79 * @details Fill out register values into list
gmehmet 1:f60eafbf009a 80 *
gmehmet 1:f60eafbf009a 81 * @returns 0 on success, negative error code on failure.
gmehmet 1:f60eafbf009a 82 */
gmehmet 1:f60eafbf009a 83 virtual int dump_registers(addr_val_pair *reg_values);
gmehmet 1:f60eafbf009a 84
gmehmet 1:f60eafbf009a 85
gmehmet 1:f60eafbf009a 86 /**
gmehmet 1:f60eafbf009a 87 * @brief Get sensor ID.
gmehmet 1:f60eafbf009a 88 *
gmehmet 1:f60eafbf009a 89 * @returns Sensor ID number.
gmehmet 1:f60eafbf009a 90 */
gmehmet 1:f60eafbf009a 91 unsigned char get_sensor_id();
gmehmet 1:f60eafbf009a 92
gmehmet 1:f60eafbf009a 93 // Implemented functions transferred mostly from HSP....
gmehmet 1:f60eafbf009a 94
gmehmet 1:f60eafbf009a 95 virtual int MS_max30001readRegister(uint8_t addr, uint32_t *return_data);
gmehmet 1:f60eafbf009a 96
gmehmet 1:f60eafbf009a 97 virtual int MS_max30001writeRegister(uint8_t addr, uint32_t data);
gmehmet 1:f60eafbf009a 98
gmehmet 1:f60eafbf009a 99 virtual int MS_Max30001_ECG_InitStart(uint8_t En_ecg, uint8_t Openp, uint8_t Openn,
gmehmet 1:f60eafbf009a 100 uint8_t Pol, uint8_t Calp_sel, uint8_t Caln_sel,
gmehmet 1:f60eafbf009a 101 uint8_t E_fit, uint8_t Rate, uint8_t Gain,
gmehmet 1:f60eafbf009a 102 uint8_t Dhpf, uint8_t Dlpf);
gmehmet 1:f60eafbf009a 103
gmehmet 1:f60eafbf009a 104 virtual int MS_Max30001_ECG_Stop();
gmehmet 1:f60eafbf009a 105
gmehmet 1:f60eafbf009a 106 // ECG Max30001 RtoR Initialization Function
gmehmet 1:f60eafbf009a 107 virtual int MS_Max30001_RtoR_InitStart(uint8_t En_rtor, uint8_t Wndw, uint8_t Gain,
gmehmet 1:f60eafbf009a 108 uint8_t Pavg, uint8_t Ptsf, uint8_t Hoff,
gmehmet 1:f60eafbf009a 109 uint8_t Ravg, uint8_t Rhsf, uint8_t Clr_rrint);
gmehmet 1:f60eafbf009a 110
gmehmet 1:f60eafbf009a 111 virtual int MS_Max30001_RtoR_Stop();
gmehmet 1:f60eafbf009a 112
gmehmet 1:f60eafbf009a 113 // This function enables the interrupts for specific parameters
gmehmet 1:f60eafbf009a 114 virtual int MS_max30001_INT_assignment(uint8_t en_enint_loc, uint8_t en_eovf_loc, uint8_t en_fstint_loc,
gmehmet 1:f60eafbf009a 115 uint8_t en_dcloffint_loc, uint8_t en_bint_loc, uint8_t en_bovf_loc,
gmehmet 1:f60eafbf009a 116 uint8_t en_bover_loc, uint8_t en_bundr_loc, uint8_t en_bcgmon_loc,
gmehmet 1:f60eafbf009a 117 uint8_t en_pint_loc, uint8_t en_povf_loc, uint8_t en_pedge_loc,
gmehmet 1:f60eafbf009a 118 uint8_t en_lonint_loc, uint8_t en_rrint_loc, uint8_t en_samp_loc,
gmehmet 1:f60eafbf009a 119 uint8_t intb_Type, uint8_t int2b_Type);
gmehmet 1:f60eafbf009a 120
gmehmet 1:f60eafbf009a 121 // call sync function of the sensor
gmehmet 1:f60eafbf009a 122 int MS_max30001sync();
gmehmet 1:f60eafbf009a 123
gmehmet 1:f60eafbf009a 124 // That Function Should Only Be called from interrupt context
gmehmet 1:f60eafbf009a 125 void Max30001Helper_AddDataToQueue(uint32_t id, uint32_t *buffer, uint32_t number);
gmehmet 1:f60eafbf009a 126
gmehmet 1:f60eafbf009a 127
gmehmet 1:f60eafbf009a 128 /**
gmehmet 1:f60eafbf009a 129 *
gmehmet 1:f60eafbf009a 130 * @param[in] status the value to set the interrupt status
gmehmet 1:f60eafbf009a 131 * variable
gmehmet 1:f60eafbf009a 132 */
gmehmet 1:f60eafbf009a 133 void Max30001Helper_setInterruptStatus(bool status);
gmehmet 1:f60eafbf009a 134
gmehmet 1:f60eafbf009a 135 /**
gmehmet 1:f60eafbf009a 136 *
gmehmet 1:f60eafbf009a 137 * @return status of the interrupt
gmehmet 1:f60eafbf009a 138 */
gmehmet 1:f60eafbf009a 139 bool Max30001Helper_getInterruptStatus();
gmehmet 1:f60eafbf009a 140
gmehmet 1:f60eafbf009a 141 /**
gmehmet 1:f60eafbf009a 142 * @brief Call the interrupt handler of Max30001
gmehmet 1:f60eafbf009a 143 */
gmehmet 1:f60eafbf009a 144 void Max30001Helper_max30001_int_handler(void);
gmehmet 1:f60eafbf009a 145
gmehmet 1:f60eafbf009a 146 int MAX30001_Helper_Queue_Size(void);
gmehmet 1:f60eafbf009a 147
gmehmet 1:f60eafbf009a 148 int MAX30001_Helper_Invert_Waveform(void);
gmehmet 1:f60eafbf009a 149
gmehmet 1:f60eafbf009a 150 enum Max30001_Helper_ECG_Sample_Rate {
gmehmet 1:f60eafbf009a 151 k512SPS = 0b00,
gmehmet 1:f60eafbf009a 152 k256SPS = 0b01,
gmehmet 1:f60eafbf009a 153 k128SPS = 0b10
gmehmet 1:f60eafbf009a 154 };
gmehmet 1:f60eafbf009a 155
gmehmet 1:f60eafbf009a 156 /**
gmehmet 1:f60eafbf009a 157 *
gmehmet 1:f60eafbf009a 158 * @param ecg_rate
gmehmet 1:f60eafbf009a 159 * @return
gmehmet 1:f60eafbf009a 160 */
gmehmet 1:f60eafbf009a 161 int Max30001Helper_SetECGSampleRate(Max30001_Helper_ECG_Sample_Rate ecg_rate);
gmehmet 1:f60eafbf009a 162
gmehmet 1:f60eafbf009a 163 private:
gmehmet 1:f60eafbf009a 164
gmehmet 1:f60eafbf009a 165 /***
gmehmet 1:f60eafbf009a 166 *
gmehmet 1:f60eafbf009a 167 * @return
gmehmet 1:f60eafbf009a 168 */
gmehmet 1:f60eafbf009a 169 void Max30001_Helper_ConvertRtoRtoBPM(uint16_t rtor_val);
gmehmet 1:f60eafbf009a 170
gmehmet 1:f60eafbf009a 171 uint8_t m_rtor_last_bpm_;
gmehmet 1:f60eafbf009a 172
gmehmet 1:f60eafbf009a 173 void Max30001_Helper_SetInterrupts(char en);
gmehmet 1:f60eafbf009a 174
gmehmet 1:f60eafbf009a 175 /**
gmehmet 1:f60eafbf009a 176 *
gmehmet 1:f60eafbf009a 177 */
gmehmet 1:f60eafbf009a 178 int Max30001Helper_InitializeECGandRtoR();
gmehmet 1:f60eafbf009a 179
gmehmet 1:f60eafbf009a 180 ecg_sensor_report m_ecg_packet_;
gmehmet 1:f60eafbf009a 181 MAX30001 *m_max30001;
gmehmet 1:f60eafbf009a 182 InterruptIn *m_max30001_InterruptB;
gmehmet 1:f60eafbf009a 183 InterruptIn *m_max30001_Interrupt2B;
gmehmet 1:f60eafbf009a 184 queue_t mmax30001_queue;
gmehmet 1:f60eafbf009a 185 };
gmehmet 1:f60eafbf009a 186
gmehmet 1:f60eafbf009a 187
gmehmet 1:f60eafbf009a 188 void StreamPacketUint32(uint32_t id, uint32_t *buffer, uint32_t number);
gmehmet 1:f60eafbf009a 189
gmehmet 1:f60eafbf009a 190 #endif