Demo PAH8011+ HeartRate on nRF52

Dependencies:   mbed pixart_heart_rate_demo pixart_heart_rate_lib_keil_m4

Fork of PixArt_PAH8011_HeartRate_nRF52 by PixArt Imaging

Committer:
pixus_mbed
Date:
Fri Oct 27 08:53:49 2017 +0000
Revision:
0:a6408c845aba
Child:
1:3abb06bb21c5
Init version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pixus_mbed 0:a6408c845aba 1
pixus_mbed 0:a6408c845aba 2 #include "mbed.h"
pixus_mbed 0:a6408c845aba 3 #include "system_clock.h"
pixus_mbed 0:a6408c845aba 4
pixus_mbed 0:a6408c845aba 5 #include "pixart_pah8011.h"
pixus_mbed 0:a6408c845aba 6 #include "pixart_heart_rate.h"
pixus_mbed 0:a6408c845aba 7
pixus_mbed 0:a6408c845aba 8
pixus_mbed 0:a6408c845aba 9 static Serial pc(USBTX, USBRX);
pixus_mbed 0:a6408c845aba 10 static I2C i2c(I2C_SDA0, I2C_SCL0);
pixus_mbed 0:a6408c845aba 11 static InterruptIn pah8011_interrupt(p13);
pixus_mbed 0:a6408c845aba 12
pixus_mbed 0:a6408c845aba 13 static volatile bool has_pah8011_interrupt = false;
pixus_mbed 0:a6408c845aba 14 static uint64_t pah8011_interrupt_timestamp = 0;
pixus_mbed 0:a6408c845aba 15
pixus_mbed 0:a6408c845aba 16
pixus_mbed 0:a6408c845aba 17 static void error_handler()
pixus_mbed 0:a6408c845aba 18 {
pixus_mbed 0:a6408c845aba 19 pc.printf("error_handler()!\n");
pixus_mbed 0:a6408c845aba 20
pixus_mbed 0:a6408c845aba 21 while (true)
pixus_mbed 0:a6408c845aba 22 {
pixus_mbed 0:a6408c845aba 23 }
pixus_mbed 0:a6408c845aba 24 }
pixus_mbed 0:a6408c845aba 25
pixus_mbed 0:a6408c845aba 26 static void debug_print(const char *fmt, ...)
pixus_mbed 0:a6408c845aba 27 {
pixus_mbed 0:a6408c845aba 28 char msg[128];
pixus_mbed 0:a6408c845aba 29 va_list marker;
pixus_mbed 0:a6408c845aba 30 va_start(marker, fmt);
pixus_mbed 0:a6408c845aba 31 vsprintf(msg, fmt, marker);
pixus_mbed 0:a6408c845aba 32 va_end(marker);
pixus_mbed 0:a6408c845aba 33 pc.printf(msg);
pixus_mbed 0:a6408c845aba 34 }
pixus_mbed 0:a6408c845aba 35
pixus_mbed 0:a6408c845aba 36 static void pah8011_interrupt_handle(void)
pixus_mbed 0:a6408c845aba 37 {
pixus_mbed 0:a6408c845aba 38 has_pah8011_interrupt = true;
pixus_mbed 0:a6408c845aba 39 pah8011_interrupt_timestamp = system_clock_get_tick();
pixus_mbed 0:a6408c845aba 40 }
pixus_mbed 0:a6408c845aba 41
pixus_mbed 0:a6408c845aba 42 static uint64_t time_to_millisec(uint64_t time)
pixus_mbed 0:a6408c845aba 43 {
pixus_mbed 0:a6408c845aba 44 return system_clock_time_to_milliseconds(time);
pixus_mbed 0:a6408c845aba 45 }
pixus_mbed 0:a6408c845aba 46
pixus_mbed 0:a6408c845aba 47 int main(void)
pixus_mbed 0:a6408c845aba 48 {
pixus_mbed 0:a6408c845aba 49 // system clock
pixus_mbed 0:a6408c845aba 50 system_clock_init();
pixus_mbed 0:a6408c845aba 51
pixus_mbed 0:a6408c845aba 52 // serial port
pixus_mbed 0:a6408c845aba 53 pc.baud(115200);
pixus_mbed 0:a6408c845aba 54 pc.printf("Pixart PAH8011 demo\n");
pixus_mbed 0:a6408c845aba 55
pixus_mbed 0:a6408c845aba 56 // interrupt
pixus_mbed 0:a6408c845aba 57 pah8011_interrupt.rise(pah8011_interrupt_handle);
pixus_mbed 0:a6408c845aba 58
pixus_mbed 0:a6408c845aba 59 // heart_rate
pixus_mbed 0:a6408c845aba 60 pixart::heart_rate heart_rate(time_to_millisec);
pixus_mbed 0:a6408c845aba 61 heart_rate.enable_debug_print(debug_print);
pixus_mbed 0:a6408c845aba 62 if (!heart_rate.init())
pixus_mbed 0:a6408c845aba 63 {
pixus_mbed 0:a6408c845aba 64 pc.printf("heart_rate.init() failed\n");
pixus_mbed 0:a6408c845aba 65 error_handler();
pixus_mbed 0:a6408c845aba 66 }
pixus_mbed 0:a6408c845aba 67
pixus_mbed 0:a6408c845aba 68 // pah8011
pixus_mbed 0:a6408c845aba 69 pixart::pah8011 pah8011;
pixus_mbed 0:a6408c845aba 70 pah8011.enable_debug_print(debug_print);
pixus_mbed 0:a6408c845aba 71 if (!pah8011.init(i2c))
pixus_mbed 0:a6408c845aba 72 {
pixus_mbed 0:a6408c845aba 73 pc.printf("pah8011.init() failed\n");
pixus_mbed 0:a6408c845aba 74 error_handler();
pixus_mbed 0:a6408c845aba 75 }
pixus_mbed 0:a6408c845aba 76 if (!pah8011.enable_ppg())
pixus_mbed 0:a6408c845aba 77 {
pixus_mbed 0:a6408c845aba 78 pc.printf("pah8011.enable_ppg() failed\n");
pixus_mbed 0:a6408c845aba 79 error_handler();
pixus_mbed 0:a6408c845aba 80 }
pixus_mbed 0:a6408c845aba 81
pixus_mbed 0:a6408c845aba 82 while(true)
pixus_mbed 0:a6408c845aba 83 {
pixus_mbed 0:a6408c845aba 84 if (has_pah8011_interrupt)
pixus_mbed 0:a6408c845aba 85 {
pixus_mbed 0:a6408c845aba 86 has_pah8011_interrupt = false;
pixus_mbed 0:a6408c845aba 87
pixus_mbed 0:a6408c845aba 88 if (!pah8011.task())
pixus_mbed 0:a6408c845aba 89 {
pixus_mbed 0:a6408c845aba 90 pc.printf("pah8011.task() failed\n");
pixus_mbed 0:a6408c845aba 91 error_handler();
pixus_mbed 0:a6408c845aba 92 }
pixus_mbed 0:a6408c845aba 93
pixus_mbed 0:a6408c845aba 94 pixart::pah8011::task_result result;
pixus_mbed 0:a6408c845aba 95 if (pah8011.get_result(result))
pixus_mbed 0:a6408c845aba 96 {
pixus_mbed 0:a6408c845aba 97 if (result.ch_num != 2)
pixus_mbed 0:a6408c845aba 98 error_handler();
pixus_mbed 0:a6408c845aba 99
pixus_mbed 0:a6408c845aba 100 for (uint32_t i = 0; i < result.num_per_ch; ++i)
pixus_mbed 0:a6408c845aba 101 {
pixus_mbed 0:a6408c845aba 102 pixart::heart_rate::ppg_sample ppg_sample;
pixus_mbed 0:a6408c845aba 103 ppg_sample.ch1 = result.data[i * result.ch_num + 0];
pixus_mbed 0:a6408c845aba 104 ppg_sample.ch2 = result.data[i * result.ch_num + 1];
pixus_mbed 0:a6408c845aba 105 ppg_sample.is_touched = result.is_touched;
pixus_mbed 0:a6408c845aba 106 ppg_sample.timestamp = pah8011_interrupt_timestamp;
pixus_mbed 0:a6408c845aba 107 heart_rate.set_ppg_sample(ppg_sample);
pixus_mbed 0:a6408c845aba 108
pixus_mbed 0:a6408c845aba 109 pixart::heart_rate::accel_sample accel_sample;
pixus_mbed 0:a6408c845aba 110 accel_sample.x = 0.0f;
pixus_mbed 0:a6408c845aba 111 accel_sample.y = 0.0f;
pixus_mbed 0:a6408c845aba 112 accel_sample.z = 0.0f;
pixus_mbed 0:a6408c845aba 113 accel_sample.timestamp = pah8011_interrupt_timestamp;
pixus_mbed 0:a6408c845aba 114 heart_rate.set_accel_sample(accel_sample);
pixus_mbed 0:a6408c845aba 115
pixus_mbed 0:a6408c845aba 116 }
pixus_mbed 0:a6408c845aba 117
pixus_mbed 0:a6408c845aba 118 pixart::heart_rate::result hr_result = heart_rate.get_result();
pixus_mbed 0:a6408c845aba 119 if (hr_result.ret == pixart::heart_rate::ret_success)
pixus_mbed 0:a6408c845aba 120 {
pixus_mbed 0:a6408c845aba 121 pc.printf("time = %llu, hr = %d, hr_trust_level = %d\n", pah8011_interrupt_timestamp, (int)hr_result.hr, hr_result.hr_trust_level);
pixus_mbed 0:a6408c845aba 122 }
pixus_mbed 0:a6408c845aba 123 }
pixus_mbed 0:a6408c845aba 124 }
pixus_mbed 0:a6408c845aba 125 }
pixus_mbed 0:a6408c845aba 126 }
pixus_mbed 0:a6408c845aba 127