Demo Heart Rate with PAH8011

Dependencies:   pixart_heart_rate pixart_pah8011

Dependents:   PAH8011_nRF52_Program PixArt_PAH8011_HeartRate_NUCLEO-L476RG PixArt_PAH8011_HR_NUCLEO-L476RG

Committer:
bell_huang
Date:
Wed Jan 23 08:10:59 2019 +0000
Revision:
5:4fe132cb9273
Parent:
3:e03a9fcf825c
Fix demo

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bell_huang 0:45616b53ea33 1 #include "pixart_heart_rate_demo.h"
bell_huang 0:45616b53ea33 2
bell_huang 0:45616b53ea33 3 #include "system_clock.h"
bell_huang 0:45616b53ea33 4
bell_huang 2:b3716992c4cb 5 #include "pixart_heart_rate.h"
bell_huang 2:b3716992c4cb 6 #include "pixart_pah8011.h"
bell_huang 2:b3716992c4cb 7
bell_huang 0:45616b53ea33 8
bell_huang 0:45616b53ea33 9 namespace pixart {
bell_huang 0:45616b53ea33 10
bell_huang 0:45616b53ea33 11
bell_huang 0:45616b53ea33 12 static Serial *pc = NULL;
bell_huang 0:45616b53ea33 13
bell_huang 0:45616b53ea33 14
bell_huang 0:45616b53ea33 15 heart_rate_demo::heart_rate_demo(I2C &i2c, InterruptIn &interrupt, Serial &serial)
bell_huang 0:45616b53ea33 16 : m_i2c(i2c)
bell_huang 0:45616b53ea33 17 , m_interrupt(interrupt)
bell_huang 0:45616b53ea33 18 , m_has_pah8011_interrupt(false)
bell_huang 0:45616b53ea33 19 , m_pah8011_interrupt_timestamp(0)
bell_huang 0:45616b53ea33 20 {
bell_huang 0:45616b53ea33 21 pc = &serial;
bell_huang 0:45616b53ea33 22 }
bell_huang 0:45616b53ea33 23
bell_huang 0:45616b53ea33 24 void heart_rate_demo::run()
bell_huang 0:45616b53ea33 25 {
bell_huang 0:45616b53ea33 26 pc->printf("Pixart Demo HeartRate with PAH8011\n");
bell_huang 0:45616b53ea33 27
bell_huang 0:45616b53ea33 28 // system clock
bell_huang 0:45616b53ea33 29 system_clock_init();
bell_huang 0:45616b53ea33 30
bell_huang 0:45616b53ea33 31 // interrupt
bell_huang 2:b3716992c4cb 32 m_interrupt.rise(this, &heart_rate_demo::pah8011_interrupt_handle);
bell_huang 0:45616b53ea33 33
bell_huang 0:45616b53ea33 34 // heart_rate
bell_huang 1:51b46680bc75 35 pixart::heart_rate heart_rate(heart_rate_demo::time_to_millisec);
bell_huang 0:45616b53ea33 36 heart_rate.enable_debug_print(heart_rate_demo::debug_print);
bell_huang 0:45616b53ea33 37 if (!heart_rate.init())
bell_huang 0:45616b53ea33 38 {
bell_huang 0:45616b53ea33 39 pc->printf("heart_rate.init() failed\n");
bell_huang 0:45616b53ea33 40 error_handler();
bell_huang 0:45616b53ea33 41 }
bell_huang 0:45616b53ea33 42
bell_huang 0:45616b53ea33 43 // pah8011
bell_huang 5:4fe132cb9273 44 pixart::pah8011 pah8011(m_i2c);
bell_huang 1:51b46680bc75 45 pah8011.enable_debug_print(heart_rate_demo::debug_print);
bell_huang 5:4fe132cb9273 46 if (!pah8011.init())
bell_huang 0:45616b53ea33 47 {
bell_huang 0:45616b53ea33 48 pc->printf("pah8011.init() failed\n");
bell_huang 0:45616b53ea33 49 error_handler();
bell_huang 0:45616b53ea33 50 }
bell_huang 0:45616b53ea33 51 if (!pah8011.enable_ppg())
bell_huang 0:45616b53ea33 52 {
bell_huang 0:45616b53ea33 53 pc->printf("pah8011.enable_ppg() failed\n");
bell_huang 0:45616b53ea33 54 error_handler();
bell_huang 0:45616b53ea33 55 }
bell_huang 0:45616b53ea33 56
bell_huang 0:45616b53ea33 57 while(true)
bell_huang 0:45616b53ea33 58 {
bell_huang 2:b3716992c4cb 59 if (m_has_pah8011_interrupt)
bell_huang 0:45616b53ea33 60 {
bell_huang 2:b3716992c4cb 61 m_has_pah8011_interrupt = false;
bell_huang 0:45616b53ea33 62
bell_huang 0:45616b53ea33 63 if (!pah8011.task())
bell_huang 0:45616b53ea33 64 {
bell_huang 0:45616b53ea33 65 pc->printf("pah8011.task() failed\n");
bell_huang 0:45616b53ea33 66 error_handler();
bell_huang 0:45616b53ea33 67 }
bell_huang 0:45616b53ea33 68
bell_huang 0:45616b53ea33 69 pixart::pah8011::task_result result;
bell_huang 0:45616b53ea33 70 if (pah8011.get_result(result))
bell_huang 0:45616b53ea33 71 {
bell_huang 0:45616b53ea33 72 if (result.ch_num != 2)
bell_huang 0:45616b53ea33 73 error_handler();
bell_huang 0:45616b53ea33 74
bell_huang 0:45616b53ea33 75 for (uint32_t i = 0; i < result.num_per_ch; ++i)
bell_huang 0:45616b53ea33 76 {
bell_huang 2:b3716992c4cb 77 // set ppg sample
bell_huang 0:45616b53ea33 78 pixart::heart_rate::ppg_sample ppg_sample;
bell_huang 0:45616b53ea33 79 ppg_sample.ch1 = result.data[i * result.ch_num + 0];
bell_huang 0:45616b53ea33 80 ppg_sample.ch2 = result.data[i * result.ch_num + 1];
bell_huang 0:45616b53ea33 81 ppg_sample.is_touched = result.is_touched;
bell_huang 2:b3716992c4cb 82 ppg_sample.timestamp = m_pah8011_interrupt_timestamp;
bell_huang 0:45616b53ea33 83 heart_rate.set_ppg_sample(ppg_sample);
bell_huang 0:45616b53ea33 84
bell_huang 2:b3716992c4cb 85 // set accel sample (dummy)
bell_huang 0:45616b53ea33 86 pixart::heart_rate::accel_sample accel_sample;
bell_huang 0:45616b53ea33 87 accel_sample.x = 0.0f;
bell_huang 0:45616b53ea33 88 accel_sample.y = 0.0f;
bell_huang 0:45616b53ea33 89 accel_sample.z = 0.0f;
bell_huang 2:b3716992c4cb 90 accel_sample.timestamp = m_pah8011_interrupt_timestamp;
bell_huang 0:45616b53ea33 91 heart_rate.set_accel_sample(accel_sample);
bell_huang 0:45616b53ea33 92 }
bell_huang 0:45616b53ea33 93
bell_huang 0:45616b53ea33 94 pixart::heart_rate::result hr_result = heart_rate.get_result();
bell_huang 0:45616b53ea33 95 switch (hr_result.ret)
bell_huang 0:45616b53ea33 96 {
bell_huang 0:45616b53ea33 97 case pixart::heart_rate::ret_success:
bell_huang 0:45616b53ea33 98 pc->printf("hr = %d, hr_trust_level = %d\n", (int)hr_result.hr, hr_result.hr_trust_level);
bell_huang 0:45616b53ea33 99 break;
bell_huang 0:45616b53ea33 100
bell_huang 0:45616b53ea33 101 case pixart::heart_rate::ret_no_touch:
bell_huang 0:45616b53ea33 102 pc->printf("no touch\n");
bell_huang 0:45616b53ea33 103 break;
bell_huang 0:45616b53ea33 104
bell_huang 3:e03a9fcf825c 105 case pixart::heart_rate::ret_signal_poor:
bell_huang 0:45616b53ea33 106 pc->printf("signal is poor\n");
bell_huang 0:45616b53ea33 107 break;
bell_huang 0:45616b53ea33 108
bell_huang 0:45616b53ea33 109 default:
bell_huang 0:45616b53ea33 110 pc->printf("heart_rate.get_result() failed, ret = %d\n", hr_result.ret);
bell_huang 0:45616b53ea33 111 error_handler();
bell_huang 0:45616b53ea33 112 break;
bell_huang 0:45616b53ea33 113 }
bell_huang 0:45616b53ea33 114 }
bell_huang 0:45616b53ea33 115 }
bell_huang 0:45616b53ea33 116 }
bell_huang 0:45616b53ea33 117 }
bell_huang 0:45616b53ea33 118
bell_huang 0:45616b53ea33 119 void heart_rate_demo::error_handler()
bell_huang 0:45616b53ea33 120 {
bell_huang 0:45616b53ea33 121 pc->printf("error_handler()!\n");
bell_huang 0:45616b53ea33 122
bell_huang 0:45616b53ea33 123 while (true)
bell_huang 0:45616b53ea33 124 {
bell_huang 0:45616b53ea33 125 }
bell_huang 0:45616b53ea33 126 }
bell_huang 0:45616b53ea33 127
bell_huang 0:45616b53ea33 128 void heart_rate_demo::debug_print(const char *fmt, ...)
bell_huang 0:45616b53ea33 129 {
bell_huang 0:45616b53ea33 130 char msg[128];
bell_huang 0:45616b53ea33 131 va_list marker;
bell_huang 0:45616b53ea33 132 va_start(marker, fmt);
bell_huang 0:45616b53ea33 133 vsprintf(msg, fmt, marker);
bell_huang 0:45616b53ea33 134 va_end(marker);
bell_huang 0:45616b53ea33 135
bell_huang 0:45616b53ea33 136 pc->printf(msg);
bell_huang 0:45616b53ea33 137 }
bell_huang 0:45616b53ea33 138
bell_huang 0:45616b53ea33 139 uint64_t heart_rate_demo::time_to_millisec(uint64_t time)
bell_huang 0:45616b53ea33 140 {
bell_huang 0:45616b53ea33 141 return system_clock_time_to_milliseconds(time);
bell_huang 0:45616b53ea33 142 }
bell_huang 0:45616b53ea33 143
bell_huang 0:45616b53ea33 144 void heart_rate_demo::pah8011_interrupt_handle(void)
bell_huang 0:45616b53ea33 145 {
bell_huang 0:45616b53ea33 146 m_has_pah8011_interrupt = true;
bell_huang 0:45616b53ea33 147 m_pah8011_interrupt_timestamp = system_clock_get_tick();
bell_huang 0:45616b53ea33 148 }
bell_huang 0:45616b53ea33 149
bell_huang 0:45616b53ea33 150 }