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:
Mon Oct 30 06:11:23 2017 +0000
Revision:
1:51b46680bc75
Parent:
0:45616b53ea33
Child:
2:b3716992c4cb
fix

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