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
Revision 0:45616b53ea33, committed 2017-10-30
- Comitter:
- bell_huang
- Date:
- Mon Oct 30 06:05:00 2017 +0000
- Child:
- 1:51b46680bc75
- Commit message:
- Init version
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-os.lib Mon Oct 30 06:05:00 2017 +0000 @@ -0,0 +1,1 @@ +https://github.com/ARMmbed/mbed-os/#e62a1b9236b44e70ae3b0902dc538481c04d455b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pixart_heart_rate.lib Mon Oct 30 06:05:00 2017 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/bell_huang/code/pixart_heart_rate/#70ed6c78681c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/pixart_heart_rate_demo.cpp Mon Oct 30 06:05:00 2017 +0000
@@ -0,0 +1,145 @@
+#include "pixart_heart_rate_demo.h"
+
+#include "system_clock.h"
+
+
+namespace pixart {
+
+
+ static Serial *pc = NULL;
+
+
+ heart_rate_demo::heart_rate_demo(I2C &i2c, InterruptIn &interrupt, Serial &serial)
+ : m_i2c(i2c)
+ , m_interrupt(interrupt)
+ , m_has_pah8011_interrupt(false)
+ , m_pah8011_interrupt_timestamp(0)
+ {
+ pc = &serial;
+ }
+
+ void heart_rate_demo::run()
+ {
+ pc->printf("Pixart Demo HeartRate with PAH8011\n");
+
+ // system clock
+ system_clock_init();
+
+ // interrupt
+ pah8011_interrupt.rise(this, heart_rate_demo::pah8011_interrupt_handle);
+
+ // heart_rate
+ pixart::heart_rate heart_rate(time_to_millisec);
+ heart_rate.enable_debug_print(heart_rate_demo::debug_print);
+ if (!heart_rate.init())
+ {
+ pc->printf("heart_rate.init() failed\n");
+ error_handler();
+ }
+
+ // pah8011
+ pixart::pah8011 pah8011;
+ pah8011.enable_debug_print(debug_print);
+ if (!pah8011.init(i2c))
+ {
+ pc->printf("pah8011.init() failed\n");
+ error_handler();
+ }
+ if (!pah8011.enable_ppg())
+ {
+ pc->printf("pah8011.enable_ppg() failed\n");
+ error_handler();
+ }
+
+ while(true)
+ {
+ if (has_pah8011_interrupt)
+ {
+ has_pah8011_interrupt = false;
+
+ if (!pah8011.task())
+ {
+ pc->printf("pah8011.task() failed\n");
+ error_handler();
+ }
+
+ pixart::pah8011::task_result result;
+ if (pah8011.get_result(result))
+ {
+ if (result.ch_num != 2)
+ error_handler();
+
+ for (uint32_t i = 0; i < result.num_per_ch; ++i)
+ {
+ pixart::heart_rate::ppg_sample ppg_sample;
+ ppg_sample.ch1 = result.data[i * result.ch_num + 0];
+ ppg_sample.ch2 = result.data[i * result.ch_num + 1];
+ ppg_sample.is_touched = result.is_touched;
+ ppg_sample.timestamp = pah8011_interrupt_timestamp;
+ heart_rate.set_ppg_sample(ppg_sample);
+
+ pixart::heart_rate::accel_sample accel_sample;
+ accel_sample.x = 0.0f;
+ accel_sample.y = 0.0f;
+ accel_sample.z = 0.0f;
+ accel_sample.timestamp = pah8011_interrupt_timestamp;
+ heart_rate.set_accel_sample(accel_sample);
+ }
+
+ pixart::heart_rate::result hr_result = heart_rate.get_result();
+ switch (hr_result.ret)
+ {
+ case pixart::heart_rate::ret_success:
+ pc->printf("hr = %d, hr_trust_level = %d\n", (int)hr_result.hr, hr_result.hr_trust_level);
+ break;
+
+ case pixart::heart_rate::ret_no_touch:
+ pc->printf("no touch\n");
+ break;
+
+ case pixart::heart_rate::ret_no_touch:
+ pc->printf("signal is poor\n");
+ break;
+
+ default:
+ pc->printf("heart_rate.get_result() failed, ret = %d\n", hr_result.ret);
+ error_handler();
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ void heart_rate_demo::error_handler()
+ {
+ pc->printf("error_handler()!\n");
+
+ while (true)
+ {
+ }
+ }
+
+ void heart_rate_demo::debug_print(const char *fmt, ...)
+ {
+ char msg[128];
+ va_list marker;
+ va_start(marker, fmt);
+ vsprintf(msg, fmt, marker);
+ va_end(marker);
+
+ pc->printf(msg);
+ }
+
+ uint64_t heart_rate_demo::time_to_millisec(uint64_t time)
+ {
+ return system_clock_time_to_milliseconds(time);
+ }
+
+ void heart_rate_demo::pah8011_interrupt_handle(void)
+ {
+ m_has_pah8011_interrupt = true;
+ m_pah8011_interrupt_timestamp = system_clock_get_tick();
+ }
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/pixart_heart_rate_demo.h Mon Oct 30 06:05:00 2017 +0000
@@ -0,0 +1,39 @@
+#ifndef __pixart_heart_rate_demo_h__
+#define __pixart_heart_rate_demo_h__
+
+
+#include <mbed.h>
+#include <stdbool.h>
+#include <stdint.h>
+
+
+namespace pixart {
+
+
+ class heart_rate_demo {
+ public:
+ heart_rate_demo(I2C &i2c, InterruptIn &interrupt, Serial &serial);
+
+ void run();
+
+ private:
+ static void error_handler();
+ static void debug_print(const char *fmt, ...);
+ static uint64_t time_to_millisec(uint64_t time);
+
+ private:
+ void pah8011_interrupt_handle(void);
+
+ I2C &m_i2c;
+ InterruptIn &m_interrupt;
+
+ volatile bool m_has_pah8011_interrupt;
+ volatile uint64_t m_pah8011_interrupt_timestamp;
+
+ };
+
+
+}
+
+
+#endif // header guard
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pixart_pah8011.lib Mon Oct 30 06:05:00 2017 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/bell_huang/code/pixart_pah8011/#37451de228e4
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/system_clock.cpp Mon Oct 30 06:05:00 2017 +0000
@@ -0,0 +1,30 @@
+#include "system_clock.h"
+
+#include <mbed.h>
+
+
+static Ticker g_ticker;
+static volatile uint64_t g_sys_tick = 0;
+
+
+static void system_tick_handle(void)
+{
+ g_sys_tick++;
+}
+
+void system_clock_init()
+{
+ g_sys_tick = 0;
+
+ g_ticker.attach(system_tick_handle, 0.001f);
+}
+
+uint64_t system_clock_get_tick()
+{
+ return g_sys_tick;
+}
+
+uint64_t system_clock_time_to_milliseconds(uint64_t time)
+{
+ return time;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/system_clock.h Mon Oct 30 06:05:00 2017 +0000 @@ -0,0 +1,15 @@ +#ifndef __system_clock_h__ +#define __system_clock_h__ + + +#include <stdint.h> + + +void system_clock_init(); +uint64_t system_clock_get_tick(); + +uint64_t system_clock_time_to_milliseconds(uint64_t time); + + +#endif // header guard +