From f20c123b6ca569520fd149f7a8c891bcfda0d669 Mon Sep 17 00:00:00 2001 From: penglei <1624952103@qq.com> Date: Tue, 29 Jul 2025 09:44:33 +0800 Subject: [PATCH] =?utf8?q?=E7=A7=BB=E6=A4=8D=E5=8E=9F=E7=9B=B8=E5=BF=83?= =?utf8?q?=E7=8E=87=E9=A9=B1=E5=8A=A8=EF=BC=8C=E5=85=89=E7=94=B5=E7=BC=96?= =?utf8?q?=E7=A0=81=E5=99=A8=E6=9C=8D=E5=8A=A1=EF=BC=8C=E5=8E=BB=E9=99=A4V?= =?utf8?q?C=E5=BF=83=E7=8E=87=E9=A9=B1=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- autobuild.sh | 10 + .../brandy/brandy_standard/thread_pri_init.c | 8 +- .../brandy-native-js-n9/libuikit_fwk.a | Bin 0 -> 240634 bytes .../src/AlarmClockTimerConfig.cpp | 32 +- .../brandy/nandflash/nandflash_config.c | 1 + .../config/target_config/brandy/config.py | 124 +- .../porting/pinctrl/pinctrl_porting_brandy.c | 2 +- .../touch/cst86xx_touch/cst86xx_touch1.c | 2 +- .../drivers/driver/touch/touch_screen_drv.c | 8 +- .../drivers/driver/touch/touch_screen_drv.h | 17 + .../sdk/zhihui/drivers/cywee/dml/cywee_data.h | 9 + code/sdk/zhihui/drivers/cywee/dml/cywee_dml.c | 73 +- code/sdk/zhihui/drivers/cywee/dml/cywee_hal.h | 7 - .../drivers/cywee/service/cywee_service.c | 10 +- code/sdk/zhihui/drivers/ppg/CMakeLists.txt | 3 +- code/sdk/zhihui/drivers/ppg/hal/ppg_hal.c | 38 +- code/sdk/zhihui/drivers/ppg/hal/ppg_hal.h | 17 +- .../zhihui/drivers/ppg/pah8009/CMakeLists.txt | 57 + .../algorithm/MEMS_INT/Interrupt_function.c | 12 + .../pah8009/algorithm/MEMS_INT/pxi_interp.c | 42 + .../pah8009/algorithm/MEMS_INT/pxi_interp.h | 7 + .../algorithm/pah_hr/V303009/libv307009_4.a | Bin 0 -> 627020 bytes .../pah_hr/V303009/pah8009_testpattern_HRD.h | 23944 ++++++++++++++++ .../pah8009/algorithm/pah_hr/V303009/pxialg.h | 698 + .../pah8009/algorithm/pah_hr/V303009/pxivar.h | 96 + .../pah_hr/V303009/test_library_HRD.c | 117 + .../algorithm/pah_spo2/V703/libv703_0_1.a | Bin 0 -> 902382 bytes .../pah_spo2/V703/pah8009_testpattern_SPO2.h | 257 + .../algorithm/pah_spo2/V703/pxialg_spo2.h | 152 + .../pah_spo2/V703/test_library_SPO2.c | 432 + .../algorithm/pah_stress/V6033/pxialg_hrv.h | 72 + .../ppg/pah8009/factory/pah8009_factory_reg.h | 94 + .../pah8009/factory/pah800x_factory_test.c | 556 + .../pah8009/factory/pah800x_factory_test.h | 160 + .../drivers/ppg/pah8009/sensor/pah800x_bsp.c | 95 + .../drivers/ppg/pah8009/sensor/pah800x_bsp.h | 46 + .../drivers/ppg/pah8009/sensor/pah800x_main.c | 1865 ++ .../drivers/ppg/pah8009/sensor/pah800x_main.h | 197 + .../pah_8009_reg_arr_default_20220623.h | 491 + .../drivers/ppg/pah8009/sensor/pah_800x.c | 833 + .../drivers/ppg/pah8009/sensor/pah_800x.h | 158 + .../ppg/pah8009/sensor/pah_800x_config.h | 166 + .../drivers/ppg/pah8009/sensor/pah_unit.h | 340 + .../drivers/ppg/service/ppg_service.cpp | 330 +- .../zhihui/drivers/ppg/vc9202/CMakeLists.txt | 63 - .../drivers/ppg/vc9202/inc/BIODetect_V15_1.h | 16 - code/sdk/zhihui/drivers/ppg/vc9202/inc/algo.h | 70 - .../zhihui/drivers/ppg/vc9202/inc/spo2Algo.h | 14 - .../ppg/vc9202/inc/vc30x91x92x_common.h | 87 - .../drivers/ppg/vc9202/inc/vc9202_common.h | 77 - .../drivers/ppg/vc9202/inc/vc9202_driver.h | 184 - .../drivers/ppg/vc9202/inc/vc9202_hal.h | 57 - .../drivers/ppg/vc9202/inc/vc9202_user.h | 63 - .../ppg/vc9202/inc/vcSportMotionIntAlgo.h | 13 - .../zhihui/drivers/ppg/vc9202/lib/.WeDrive | 1 - .../vc9202/lib/lib_BIO_V151_MiniSdk_NA_01.a | Bin 18232 -> 0 bytes .../lib/lib_BIO_v151_int_miniSDK_log_01.a | Bin 20668 -> 0 bytes .../lib/lib_BIO_v151_int_miniSDK_log_02.a | Bin 20796 -> 0 bytes .../ppg/vc9202/lib/lib_Sp_Int_HaiSi_01.a | Bin 16452 -> 0 bytes .../lib/lib_hr_v640ed04_miniSDK_NA_01.a | Bin 351376 -> 0 bytes .../lib/lib_spo2_9202A4_limit_HaiSi_NA_01.a | Bin 162592 -> 0 bytes .../drivers/ppg/vc9202/src/vc9202_driver.c | 1621 -- .../ppg/vc9202/src/vc9202_driver_testmode.c | 176 - .../drivers/ppg/vc9202/src/vc9202_hal.c | 207 - .../drivers/ppg/vc9202/src/vc9202_user.c | 652 - .../ppg/vc9202/src/vc9202_user_debug.c | 188 - .../zhihui/drivers/ppg/vc921x/CMakeLists.txt | 62 - .../drivers/ppg/vc921x/inc/BIODetect_V14_1.h | 19 - code/sdk/zhihui/drivers/ppg/vc921x/inc/algo.h | 70 - .../drivers/ppg/vc921x/inc/spo2Algo_16bit.h | 57 - .../drivers/ppg/vc921x/inc/vc921x_core.h | 325 - .../drivers/ppg/vc921x/inc/vc921x_core_com.h | 458 - .../drivers/ppg/vc921x/inc/vc921x_driver.h | 127 - .../ppg/vc921x/inc/vc921x_driver_com.h | 148 - .../ppg/vc921x/inc/vc921x_driver_config.h | 115 - .../drivers/ppg/vc921x/inc/vc921x_hal.h | 54 - .../ppg/vc921x/inc/vc921x_sample_result.h | 158 - .../drivers/ppg/vc921x/inc/vc921x_user_app.h | 47 - .../ppg/vc921x/inc/vcSportMotionIntAlgo.h | 12 - .../drivers/ppg/vc921x/inc/vcare_device_com.h | 200 - .../zhihui/drivers/ppg/vc921x/lib/.WeDrive | 1 - .../lib/lib_BIO_v141_int_miniSDK_NA_01.a | Bin 19284 -> 0 bytes .../lib/lib_hr_vH102_int_miniSDK_NA_01.a | Bin 353584 -> 0 bytes .../lib_spo2_vc30FS_float_V07_miniSDK_NA_01.a | Bin 184840 -> 0 bytes .../lib_sportMotion_std_int_miniSDK_NA_01.a | Bin 16730 -> 0 bytes .../drivers/ppg/vc921x/src/vc921x_core.c | 956 - .../drivers/ppg/vc921x/src/vc921x_driver.c | 1907 -- .../drivers/ppg/vc921x/src/vc921x_hal.c | 75 - .../vc921x/src/vc921x_original_data_send.c | 267 - .../drivers/ppg/vc921x/src/vc921x_user_app.c | 897 - .../drivers/rotary_encoder/CMakeLists.txt | 2 + .../drivers/rotary_encoder/mixo/mixo_hal.c | 151 + .../drivers/rotary_encoder/mixo/mixo_hal.h | 47 + .../rotary_encoder/mixo/mixo_ots_driver.c | 151 +- .../rotary_encoder/mixo/mixo_ots_driver.h | 18 + .../rotary_encoder/mixo/mixo_service.c | 157 + .../rotary_encoder/mixo/mixo_service.h | 45 + .../rotary_encoder/rotary_encoder_drv.c | 41 +- .../rotary_encoder/rotary_encoder_drv.h | 9 + .../battery/service/battery_driver.cpp | 8 +- .../ble_service/blemoder/bleInstruct.cpp | 11 +- .../blemoder/ble_congfig_adapt.cpp | 6 +- .../blemoder/bleinstruct_sample.cpp | 14 +- .../factorytest_protocol.c | 609 +- .../board_porting/tiot_board_pin_port.h | 2 +- code/sdk/zhihui/services/gnss/src/gnss_ctl.c | 4 +- .../zhihui/utils/custom_fileoperate_service.c | 8 +- code/sdk/zhihui/utils/custom_utils.c | 4 +- 108 files changed, 32123 insertions(+), 10186 deletions(-) create mode 100644 code/sdk/application/wearable/fd230/nativeapp/brandy-native-js-n9/libuikit_fwk.a create mode 100644 code/sdk/zhihui/drivers/ppg/pah8009/CMakeLists.txt create mode 100644 code/sdk/zhihui/drivers/ppg/pah8009/algorithm/MEMS_INT/Interrupt_function.c create mode 100644 code/sdk/zhihui/drivers/ppg/pah8009/algorithm/MEMS_INT/pxi_interp.c create mode 100644 code/sdk/zhihui/drivers/ppg/pah8009/algorithm/MEMS_INT/pxi_interp.h create mode 100644 code/sdk/zhihui/drivers/ppg/pah8009/algorithm/pah_hr/V303009/libv307009_4.a create mode 100644 code/sdk/zhihui/drivers/ppg/pah8009/algorithm/pah_hr/V303009/pah8009_testpattern_HRD.h create mode 100644 code/sdk/zhihui/drivers/ppg/pah8009/algorithm/pah_hr/V303009/pxialg.h create mode 100644 code/sdk/zhihui/drivers/ppg/pah8009/algorithm/pah_hr/V303009/pxivar.h create mode 100644 code/sdk/zhihui/drivers/ppg/pah8009/algorithm/pah_hr/V303009/test_library_HRD.c create mode 100644 code/sdk/zhihui/drivers/ppg/pah8009/algorithm/pah_spo2/V703/libv703_0_1.a create mode 100644 code/sdk/zhihui/drivers/ppg/pah8009/algorithm/pah_spo2/V703/pah8009_testpattern_SPO2.h create mode 100644 code/sdk/zhihui/drivers/ppg/pah8009/algorithm/pah_spo2/V703/pxialg_spo2.h create mode 100644 code/sdk/zhihui/drivers/ppg/pah8009/algorithm/pah_spo2/V703/test_library_SPO2.c create mode 100644 code/sdk/zhihui/drivers/ppg/pah8009/algorithm/pah_stress/V6033/pxialg_hrv.h create mode 100644 code/sdk/zhihui/drivers/ppg/pah8009/factory/pah8009_factory_reg.h create mode 100644 code/sdk/zhihui/drivers/ppg/pah8009/factory/pah800x_factory_test.c create mode 100644 code/sdk/zhihui/drivers/ppg/pah8009/factory/pah800x_factory_test.h create mode 100644 code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah800x_bsp.c create mode 100644 code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah800x_bsp.h create mode 100644 code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah800x_main.c create mode 100644 code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah800x_main.h create mode 100644 code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah_8009_reg_arr_default_20220623.h create mode 100644 code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah_800x.c create mode 100644 code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah_800x.h create mode 100644 code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah_800x_config.h create mode 100644 code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah_unit.h delete mode 100644 code/sdk/zhihui/drivers/ppg/vc9202/CMakeLists.txt delete mode 100644 code/sdk/zhihui/drivers/ppg/vc9202/inc/BIODetect_V15_1.h delete mode 100644 code/sdk/zhihui/drivers/ppg/vc9202/inc/algo.h delete mode 100644 code/sdk/zhihui/drivers/ppg/vc9202/inc/spo2Algo.h delete mode 100644 code/sdk/zhihui/drivers/ppg/vc9202/inc/vc30x91x92x_common.h delete mode 100644 code/sdk/zhihui/drivers/ppg/vc9202/inc/vc9202_common.h delete mode 100644 code/sdk/zhihui/drivers/ppg/vc9202/inc/vc9202_driver.h delete mode 100644 code/sdk/zhihui/drivers/ppg/vc9202/inc/vc9202_hal.h delete mode 100644 code/sdk/zhihui/drivers/ppg/vc9202/inc/vc9202_user.h delete mode 100644 code/sdk/zhihui/drivers/ppg/vc9202/inc/vcSportMotionIntAlgo.h delete mode 100644 code/sdk/zhihui/drivers/ppg/vc9202/lib/.WeDrive delete mode 100644 code/sdk/zhihui/drivers/ppg/vc9202/lib/lib_BIO_V151_MiniSdk_NA_01.a delete mode 100644 code/sdk/zhihui/drivers/ppg/vc9202/lib/lib_BIO_v151_int_miniSDK_log_01.a delete mode 100644 code/sdk/zhihui/drivers/ppg/vc9202/lib/lib_BIO_v151_int_miniSDK_log_02.a delete mode 100644 code/sdk/zhihui/drivers/ppg/vc9202/lib/lib_Sp_Int_HaiSi_01.a delete mode 100644 code/sdk/zhihui/drivers/ppg/vc9202/lib/lib_hr_v640ed04_miniSDK_NA_01.a delete mode 100644 code/sdk/zhihui/drivers/ppg/vc9202/lib/lib_spo2_9202A4_limit_HaiSi_NA_01.a delete mode 100644 code/sdk/zhihui/drivers/ppg/vc9202/src/vc9202_driver.c delete mode 100644 code/sdk/zhihui/drivers/ppg/vc9202/src/vc9202_driver_testmode.c delete mode 100644 code/sdk/zhihui/drivers/ppg/vc9202/src/vc9202_hal.c delete mode 100644 code/sdk/zhihui/drivers/ppg/vc9202/src/vc9202_user.c delete mode 100644 code/sdk/zhihui/drivers/ppg/vc9202/src/vc9202_user_debug.c delete mode 100644 code/sdk/zhihui/drivers/ppg/vc921x/CMakeLists.txt delete mode 100644 code/sdk/zhihui/drivers/ppg/vc921x/inc/BIODetect_V14_1.h delete mode 100644 code/sdk/zhihui/drivers/ppg/vc921x/inc/algo.h delete mode 100644 code/sdk/zhihui/drivers/ppg/vc921x/inc/spo2Algo_16bit.h delete mode 100644 code/sdk/zhihui/drivers/ppg/vc921x/inc/vc921x_core.h delete mode 100644 code/sdk/zhihui/drivers/ppg/vc921x/inc/vc921x_core_com.h delete mode 100644 code/sdk/zhihui/drivers/ppg/vc921x/inc/vc921x_driver.h delete mode 100644 code/sdk/zhihui/drivers/ppg/vc921x/inc/vc921x_driver_com.h delete mode 100644 code/sdk/zhihui/drivers/ppg/vc921x/inc/vc921x_driver_config.h delete mode 100644 code/sdk/zhihui/drivers/ppg/vc921x/inc/vc921x_hal.h delete mode 100644 code/sdk/zhihui/drivers/ppg/vc921x/inc/vc921x_sample_result.h delete mode 100644 code/sdk/zhihui/drivers/ppg/vc921x/inc/vc921x_user_app.h delete mode 100644 code/sdk/zhihui/drivers/ppg/vc921x/inc/vcSportMotionIntAlgo.h delete mode 100644 code/sdk/zhihui/drivers/ppg/vc921x/inc/vcare_device_com.h delete mode 100644 code/sdk/zhihui/drivers/ppg/vc921x/lib/.WeDrive delete mode 100644 code/sdk/zhihui/drivers/ppg/vc921x/lib/lib_BIO_v141_int_miniSDK_NA_01.a delete mode 100644 code/sdk/zhihui/drivers/ppg/vc921x/lib/lib_hr_vH102_int_miniSDK_NA_01.a delete mode 100644 code/sdk/zhihui/drivers/ppg/vc921x/lib/lib_spo2_vc30FS_float_V07_miniSDK_NA_01.a delete mode 100644 code/sdk/zhihui/drivers/ppg/vc921x/lib/lib_sportMotion_std_int_miniSDK_NA_01.a delete mode 100644 code/sdk/zhihui/drivers/ppg/vc921x/src/vc921x_core.c delete mode 100644 code/sdk/zhihui/drivers/ppg/vc921x/src/vc921x_driver.c delete mode 100644 code/sdk/zhihui/drivers/ppg/vc921x/src/vc921x_hal.c delete mode 100644 code/sdk/zhihui/drivers/ppg/vc921x/src/vc921x_original_data_send.c delete mode 100644 code/sdk/zhihui/drivers/ppg/vc921x/src/vc921x_user_app.c create mode 100644 code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_hal.c create mode 100644 code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_hal.h create mode 100644 code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_service.c create mode 100644 code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_service.h diff --git a/autobuild.sh b/autobuild.sh index bad237134..5ab4a35f1 100644 --- a/autobuild.sh +++ b/autobuild.sh @@ -121,6 +121,16 @@ RECOVERY_NAME=$APPLICATION_NAME-r SSB_NAME=$APPLICATION_NAME-ssb BUILD_NAME=_L22 fi + +if [ "$1" == "n9" ] +then +TARGET_PACK_NAME=pack_brandy_native_js_n9 +APPLICATION_NAME=brandy-native-js-n9 +RECOVERY_NAME=brandy-native-js-n9-r +SSB_NAME=brandy-native-js-n9-ssb +BUILD_NAME=_N9 +fi + if [ "$1" == "hso" ] then HSO_BUILD=hso diff --git a/code/sdk/application/brandy/brandy_standard/thread_pri_init.c b/code/sdk/application/brandy/brandy_standard/thread_pri_init.c index 5c44a742d..544b35ba2 100644 --- a/code/sdk/application/brandy/brandy_standard/thread_pri_init.c +++ b/code/sdk/application/brandy/brandy_standard/thread_pri_init.c @@ -128,6 +128,10 @@ #include "bp_service.h" #endif +#ifdef ROTARYENCODER_MIXO +#include "mixo_service.h" +#endif + #define EMMC_BASE_ADDR 0x52062000 #define TASK_PRIORITY_APP (osPriority_t)(17) #define TICK_TEN_MS (10U) @@ -531,7 +535,9 @@ static void thread_main(const void *unused) // custom_i2c_init(I2C_BUS_3); // custom_i2c_init(I2C_BUS_0); custom_i2c_init(I2C_BUS_2); - +#ifdef ROTARYENCODER_MIXO + uapi_mixo_service_init(); +#endif #ifdef SUPORT_MAG_SERVICE uapi_mag_service_init(); #endif diff --git a/code/sdk/application/wearable/fd230/nativeapp/brandy-native-js-n9/libuikit_fwk.a b/code/sdk/application/wearable/fd230/nativeapp/brandy-native-js-n9/libuikit_fwk.a new file mode 100644 index 0000000000000000000000000000000000000000..b1ab9d2d0d1b9d1126089aea9eb9f39c253bcac3 GIT binary patch literal 240634 zcmeFa4SZcinLj?sP5MT`Hfez-fN9d!0yiNyFKvqGCQWW>O5bcs1uT2Hy}4~JO_Okw zmX<{=w1E~23l@-8bR!nFRCG~!6HyD>YGF~Ui|_svSziEAS!7*BW&hvr%sl7JJ@?); zt=*sC|2LnUobU6@GtWHpdS>R%nKSjgcskMb&T;2dWV*=ghS^P#NK<2dMMbUla{pIU zL}oQLHfjE4rU+3C9N~!;M{jcXi!P-x$qq??!R22+&?R``g{1val_&e1x zUDsWu3jg1AEO`*SWO2ii`Aa$?v*yMVYunQCH49Vy1IeCbIucpZL%L%io*sxUTig+w zbz%F8RPxH`vI{`WpSAiZb?zTD|;o^>g`dBOysg1=}ukT3=q8RD97&-=e`!X`|sFfU{sBE0`2tKywr<&GuLHngqF+w(QG+)308u;VWYldE|y zw;G$~C*yr{csTV;02>ulfC zo$5@oSD%kZPH%dX+rY8|MH=TO*Q9!M#_KGMq9cjS@@bYtG9BbDkEhop2Q;_AmtDT8 zFBx6Mo+Hw5emdUQl}dCZ(;HHWWF!)NVjbH9#E)xPGSQpv%%Rux%(H#TMe!aK7oNO9 z6V6|8L_?!ZDf^g3s*X;Y+U--qwr1Q|#$xqu6^EqeYjxLm>ZnmvcvsNS%sM+mIX1$-NMd-?p zkeoTXva@mc!GcwL*a|;fX4Thq#5W{6r1^F9#QQqBdI#E9FHRR&Qb+_al$>$YqX> zO?St`6;oXk^R{(;I*n0wNALP{B6&*pM24|+r%7~<;Yozuq|{7M7M^B{6`9BI7&mkz=5)h%RIu6`(g$5kKg>2%t-+fI%! zWeJYNrQ?$!Nya!gPmamBRVU{dI^~QwjwQT1tR6|XnGxZL0@xUA-_zg?twuDe@+XZL zeyzgTD`U2Z>S)x~p{V=;SS-1&uRD&`YD+!mKrBbUrk@E?#UnXGv8f%`C?!9SuhNV> zKTes$0dQ|m?5bqCH^%_@I7Lzy2}Yua;LejlCJ1vnk^@V6mi1x+o%ALWcx={UM3cq$ zdPpxco+VjQTpt;x%1BX}t|wRZ$Y{+HRV@r%k?K#a>b65(6F%b14w_)iyHlM5T~0b9 zuD~1!%ulA)bPYHXHiB8plKrWxlF|Nt&wT6CfS50e=44--&5lGMzO=XB4DPeF1^tc0 z1v)j7);ieP+Lh|=oV%&LGrIJG1Whs`8R^kOY|e}HM8MB?(bKRnzNvS;QH7_knJQ#N z#VqR>*n~Xo3MLy9yX3&U-o*O;xR>V{VIz_De&0Vk_9ld1(xW8;HLEem_R}Y()3BhF zj>5L^5iT0!d0yzLvYpY7KqSvp{x~lQ9K&$4*+4HuH-g6{nU<1hWcqBn+p^WtWF`Z27 z>(MfOZq6l%VZ%2q!vY8v=hH_}qG#1jzL1Oued|V&mZqia`@1*+^;e#C){Z2seGbV2 zuXu^b@lE2ZOQKVre*7UdUPOJc;Q6b z5x1)j`4a5cU?+?*sjjxQw`X+<_E^=+dl8wF|HqUay?yi2z4#T%e~h};+L-GQk>4OZ z19Tv1v5hUOQr)S6O^f*Lq31(F!ftB0XKsufp z=x+Ll_A8i;p~EMTP354bSC zD%m}PY>71aVOr9Okp^>fb8hd(rRm-^X{_swAVN1JB0P$aZt_-OUB7n(vAJQ;=J2Q) zK~1Uiv*dz!cQV!4+n?ygYW|UfMrJM23yCc~oy(H(&bjMXJAp3uJFeOb+a&?>~ePch?Yc{dN%HJc}%1W#7OJ*mR zw>`~Bii~vvIpYp%hVdG%e-_Qd$=LBtW`$|Z7~5p}WsH03YMCnU=_BLSte>IeX^>mq z@7#0yXH>4-B5#1AHxu>T=5ZCo^gfwopSOzUdO!!C&$&hexy$1(YGk=n6lsv5hE3OT zXm9Atj$Bo9n`1{ErZ(pm2}~_=3%RW>zr=9SWVD^!Dx?Y7>39A59{kLkmc0TQ$i#srUtDhh5?^@C&zR0;I41VI>v4LLmOBXoK;1N_q zUp$p==T;yL|2ewDXfoP?%>k(%Oi<$8ScprJZGX6v9TBduC-62HyW$2uBgi(%XF38Uc)S4Chus|preGqvd)u*y2- z#5!ijJYgp<5EB$|3yfWChn5rujoD-%kw-^ejd44CXbMJX_o`Kc@2l!F8^r z@MPz{GV_ZxOw!z*-p*t@B3g={8>7)x`u9cs^J1;LbLX#B@Y0|DO&4%5k$*e$Ej=Fc zp1CXPgEOw6zyElR1ijojkU#64*HRlT|a)8RJk_!^RmBC zkv~y821R*hZpWa>owt}d*|8|eHMctkJ#Lw~lfA!Cl{@=8232krnd#tPsKm?>afV(=-Wmk~l z-P#rJS>yk{>Cf4+RL*JX>|EZ9WMP`j-G&_IqepYTC-?_f*_59l$1U9Tr^>lK$=M5yT%MD4H80DP}%Wn!&)w~V?Px7vT{4K?HNS=7d`c)gyR?q-hS7&Fb zbADjXdh*+6n(ab7O~=r+$w13Aj9`7tT>J_8{)NjwS?b;>3qV*~r_IU24Wxohy|*OAa zNk@`B!p=Cyyd$Y~MP02ql9Hh+mw(32F1|?hH@K=WE1hJjqWU+1zv=096W=Kbrqx+x z(T^nTCeek=Wen27b){A7 z6Kj(LdND25ne?}y!`sQBj#jgz)QDf$@T%idO;aSE&!P#`}6nS-SSkK|s+C}?FWW3Hk#}G7gcp+vTeTa-bIbvK+ z<`Eu_ZtjdkH2+pT=h=7!r9nxn)60d-@jzB4WqRisD`x!ckX7vZ7l(6#$3kQt5|Kqk zni?$cvT@wb<-X%xlj!TK>0NdCIpeb4k@3C!eKU3{l*`NPv+;d6M)npr^RTnjWdvGL z?*}`_9CYEO%{vJL{JPp&?|-DWcGfH;H`3VHU{ZbAxc5gF&MPP=P~r;IZD@3i;7v-f7)TP&W7d#lCm_Pzl33veCSr6$bA`5&PfW7WQ`RWlB} zKIYQKuO3=iI%~43zOlY>NWJUE>Yp8I9(!r-J?m2kU zHPLHt7oOY?t=w5$TvS?I^ty0DlZ#$|dS%tkdx~}r27TIIuexPVQE_zQP(gId^s%tz z!0U;f2i2Zk61sUetSnZlbZoKO9$hdf{4uvY4BK~Z9jm51K4Y+Ax9_v=ds@DDP*n}x ztE%oAtAyTm;JMRE2M?&|ylbMO=XaBSe%dRiy>{BqCzKX%9$$6mo>4}+SUt>GuPavf zcyao1Y0r?)(OEjUwMZ}}cET3;7w$NqcAbK1v<7vF>Dsq-%%$%* zShv0AI^%neN$TexM)sG==1ich#VS~qy@?OSe} zR#ZQDZ}WoNx^78)w{|F;GvZhTKfL}rCSQK%BDD4vAY0Q^M_5`>mCor z9DgAz=3PZanK3g~#ChSp;|{GH-x8WqTok&8RuvkXinZ^G2gj5at3t_zor7D|;gt{L z#Fw4dU8g2JzVPu02g@d|nq1soHEw!Adh%7153fA5|Ih)Xv@9c)-$U%*M@q--Yc8EU zuApUb=WSyP9v>{d9r(J>+%|UJXAd4MOgwY<7{pM-JeC-XqlfN$*HA(GPxc0_JnK5< z)uEO3qn>Q;`(Wbm!NLhG%+0>PFT8#4!qXpjORsu}c?teSQx3W%EU`>z*|9P-W7Jy; zZ!d2D!qDzXJ5dWpW)@h0w*7)JpS<$ii-}-obvd# z-UG|8y}oU?I`v`3ea~1`H4VB3?;cmP9lcO{V%%*CWmu3H^|`_whpJ}Yt2Pa3`o`&@ z@hyj=Pce7rk8j!0e(i0rq+r{jPY!KsSsJYwyazty7{6`v8FuTTYxXkKPNc>U_uM2S zcNo^VVM5c3{#-S4EJ7`fGR2IGyz%X%uDz{l=9vYdyHU>5x4xbzeNau?ExBdt|CsjY zCMB-hqo%OO)Ok%S@l4RAJf@wk;Lb(NeF?`B5{yUMFwTy^vd+E9cQ%H|2j8-cD&yk} zV~2_L$X*gpaI7Zr$a_8w!80s|Q=RC>&o~u!x>*satEsJtRLoqM>e*PqBRMKMdRGrz ziJxw&7qwnk5vi$%|J>Tz*=MR24kyy7{=^1Vz>!DMgyQsu`nptIUu|q1|E=b~1pjU9 zhPrj}hzD2sFaemuK8}6F6{-LHAHlqb6b>(QTu7BV6#XX!=*a>46m_!YjKRG?ovRjE zdb6hISjyZ&iX%SXg;cpu0EN`)0s5^0dTM~K3eeL7G)I!Y3#l`G0w|<7qV!!zaa8HM zkmAVFcOk{mrSC$DBTV0g^eEG%XZr+DNCorb+<^bv1N1urG)Jqx3n`9TeTQ+8PXL7! zN3gyNsWzVg3aNPkdVYXz56~R_`Yxmv`UFr&Em7CvezV7&tZo3l$)P_8%<;K#lhtm3 zj|!u(SPXeCn(5C<|cjyY>`yBdAVBem% zstD+dJbR|9IiSyQ=oZj^eoa;FpqD!S?*h%aj&W7$V$jV(swx!+z09FgpwkY01!%t) zI9pu>`ZUk~Y_$dSsSdpZv|o#=)oq~5JpXglM?w4cpQHX6G|SMqh`Jv%=XFAV4)kIn z(f*zQ-R;o-2Kpg~eg^a*hyD?0>7x|d>n}k2_SdVILHqXAt3QCA;DzU`(RU%o5^_UM zP8%A59T!rC4n=uPUmO=wMGi%O45}O#QW)|(E~G{~6y?VRXbevr7gFOKit;A}=6pg$F$zhvn z1n3iOmb1(!qQ5)a(yX%+)!S9fDH7VZ+S1Lym3Uqay8h7pL6?TiKLzN|TAFpdvhZy6 z6H8wWx&-}Cg)QIVV&UkB*XPL-nm zlLK_ErB}eOM7>pAV(AL4zg}&(^d;JVsyZA9|3ZMCY^&@ITE0qMVrjOqN;O^mqovtr zRjRkC1C|D<+ue6E^=eRk3ZtM&ANFJaQ~3V&U5R0Xo;QlGsG=p9q=jx96h?RI_mI z+}hYIW$umk-eB)d`W}hZ*?UCa>tlvrADd%oBVQkzt?35q-w-qW1}oQq_aLo6L?r8K zg=6A?j0B1pYrrwlG+Hxe*=S~2^|N9|aF$KRY%4e0`p>rhvu(IYBv!8@1u!82Or-cd z)+V)HWa`CBQW2440hr_fnB)N19D~s&uOf}2s8J$o6pgbGnfJbP);#KH&JV>4l&DCt zMAzEbn)UH?r>C}QS#K{6uSi}Qcp1|Zkl9dedk=m;OYyxS=S@(&-H;f-nmP_!6)Vtp!|gf`hskgZSuw2=4Y(|l9T zb;))3O>r1A&5ua2&i-EfLfg~X4I{K+$c2q51az#lM+Z`w{8;9nZS#gc5LNF;!V7ff zZrJTc~j`HMG`F+Y(FJrePL zzq~x_8nG!GXXv_bCDBe;rC+W7XUzJLLnOw4d z0PjW)_{q<11-a|_@TW&+^((oRWb9iRY0MeB+EC2%(nb9lyWz9J^_3@0*1DUY_jyG)?0tI*|KNyaWroA6^DLiO_;tV~m*XEC zvGC^s3!hl{oP(CE#XmS=;a>(^(v5#`m*EorRlve07XHn^Vh^$Kxdu|Y4*%eYh0nQn zcqX}K9VC3F!DNNcGI$4W)mDb{qE@@C#e68U9Sok!nq!0h#h=tGJV#}^jde%xzK7%*mDz|)M;hzV5n$=G%dYUbtX(A?{ zxD8hs7B3itSoF*XF1LJQ;a>z?+K+#5#N^XKRFw^AsIl<5?o@91#KLF!maRAPZdt#N z@|I65@>_vRr~r;w_%{KUTuH83GZTI#=x|uGbzKeHWy;&Zsw(DR242!ru*Ca*dHE7XD-8Uu*cp!q;WN&JvFOK-l6lh^dKUh{y@adUE|ZT(T&=7uaHj!>?Q;29z}4p(euKkbLB0)p7x{Miyab{p zY*@VG68jmY@QH;_n}ts-{0iXkdH4s%G?rYap~fN;CjWZFCl-D)`L>=D3x7WO_Blc< z{3776UG5*}VD`hU@5Dbi=6UPiX{h(gR5u%ZGHy~&h(#ymrJfKApJ^%EjDK*%!e>7t z^@LdXX8}t+Ar^i!`8m=^mb43Ek!PEdd?pq?t5LWG|KM26;kg=OH3qoV;MK$|9608c z^hLzf!@9{!`XXZC>-xZk4(HYf-DjpvxU4?Y^2Z^J=oz-p{D4-kDy%#y>MR)`GFZ~9 z?XmK%J+!$ss>RiK+`{t=rcCwu1~a`!GtOasD7n#ub?e47^7+7lBNp4(rAog|EPOUg z8MhD%e?G8`TZo0<4BScv9MctU*HAx?S{E36v}t)1!Ndk)iR%!s*g!0N-F7Yj1CI5- zb)kk>cLZK!Fxzakm8m12gF85iRxi;|KRZO`39wq18b0er>$?m-3AgYvgIQ0iI}D}` zCI9GSv5j>jyxj1a4<$GISY*gAxW(|9hXsQMvu+e@Gno1dwj0cN3vMu&{|jz6d9U@{ z>hSMy_&W_>>%T3J%m*Er4;id=?sE8D25Z|k8LVx)%3y8VfWfEYR+=1zlEP5-8KIC%m0fwZ}I3Bpp%fU3d5Rb17q!r?+SSgDEEkXv(H7S~3oFJo19 zWJc&Y_lVSEimyKx#P`xP22K#p3n!LXVM9~9#d7d}la!KV~gUVz4(aL8h z7FHyB*R8{A|Ei{^cOY4F{^AR(^$$8o1b2?r#0PLb=Bo7rNj%-w@Ypr`R2|&ESa~haman7CLeqp5&9e$dTjlAfH^PBe!uFIc9>`$LV!G zeVmJk9EZyJ8#$dP;BFmm@favVzLi}w-uaoogmd+6Md|guD&}?$9jp?cZ&6+zK3vWeKuen?#E-&3tMAuP!2K`cMBjAqTzz*`DD`{rs1Hf^ z^j!%agL4i=_YeZDFi`&&ed&O{n=7&R4ieOdqKliQoGHq17k%3U`W}J4%ivFaY&)XwYXN z(`*^t(DwjnrnefG=({wa?@{Pu+ZQMLE(++Ym|^xxQr|haMBna!zMn(iVNr&==({bT zuL=70!=L&hxJ2Lg0{R}p^SuK8;zZvw0e!!RzG)DmKCVHCzES`;|Go`;#Md~u?0KI9li^ff~t`-;A+0Nj3@#Af)5 zqaWP^IpoBT{(`>*Ioc<7(8EnHytR82fVkO^>LS>89x&~DJ1+V$U4H~{^_>cRtoP#R zN5^-Xw49B2KIGhXByyJqF-Bpm&>9FzM>g01X{3RV9 z3+THV%G`1jeRl@*-3NWspojS~*U|U1=mU>#TONI15q(BX9d`7!fhYEzh<2m%&&u5j zeWzK>o7gu7a>UJK!o3Q8^Kqwr^Kgm2`hdRsp)Xf?Tr6@n|DJ*zpD*I1JhlhqUV>b% z{M!mSZJ*V5-b_FL7C@=k_c_sLBl>+FeGiB}D|eZrZ=s{_$5x-z&7!epJ>CY>dCRms zZ{>vlPRO}V())YJp^NDgKguyaaU#dNO{(_V0lCAtxSZOBi|L(!i_t)z=T?^DxkaXR zqK|FCmD`H+P8=;#rjC$0r*2k->%4cKBe~yso>f~nt4Rkq@;lGZ956OC=xArE|5m@# z`Nw5vE-}+q);Fe+xC0l*CdBW?b&@ zy$|93F^liA_mA8A9^CJ?_#WK<+2Xyp-)r$c+&^LQeYk(p;!oN8zu-k-(&Cl>z#_vbBs z!QNlQ{g)QMg!`{7{59;q(V~z2YD;vx3eDT4 zN@ty{u6c5N``BM^!MpGi7Tr4U#G!?kPI=K%3nuO*s%?2@-kC!dEm(keus?(tez943 z@5F99fVYl^guA0nP-sTGN^H7E!S{Z=1Bo{o+tt*eeS^fOEm|cNH6KmE99dA@o4^j%L1g?C`*n|ENJZywV)<*N>Vq2cds9^dkE`(U*2_Cxcl zDvMsPswjH>xk)eLtzePG`<32X`iB;Z%qx>#%OkUQA>V@b-)%Q(!F!~5E7N~tpKn(# zj4qh?d<)(@)$d*MUH7xLhoXa_(;vU4eP>a7;kM?gPr;fAzAd5X_R!$ij}`sLf86_e z)%dZ66}zcte#^vz{=2z&d-l%FV;(+1sV#d>Q1AS}quXn4IBQ4MS-1YF>a1s8tD1S> zHI6^F8-ws4n@b0DIL3TjQcKeX!^oY zA2_wRI5d67sKn{f0=%R8$1T&xk4~KOprZWXg7v?ecvmR;*yyodX_SsC`r|jf^8?;> z5OSji7rb{ePgmF(EmwA0M;H7`>^3$QtI|==7N0&;byD}}#HbSrL(v_f6WWVI z*;38knFCcPjUQE2xp1_k=4)Q8Rh9P@oq2Fe@u2$n_{T<#Z~ScI{py+_qy{G^3`Q4z zT0$6Gzjoav-g~l4m74?CESNlWP4wgA$Bzol8$YJ%#K%T49aZD+8#VFE{yW#9yH7w3 zZ~HUfR9-Q-_fFBzwy0B(eUbx8ZRgfveUih_E??8S@6GU1;if&`sSHm(d@OMo&4cRD z{--9PcB?}NwjFq7l5fT1Uoth(wo(#=9IC}CE#q<0& zn=O6+m?`?~1GdwLS@PPhm&f>FR(^QS6`RNMP4z8!Qyslw#WSyuiPmh7988=rsw`XM z{&8MjwpG;>y;2n}dgYY~uQ|O7+V*cnX50LN7d|%>+E-MNC>mFk7&q$VY>mw)h&1|6 zt1;Mj`WmSn@49<2;7#@4;v|#b9%`c{48P;R;RAkOmtjrYJDwz6I;we`e@X#+*3gWD zC+>s~Pd1qTbp zVW{e^XlT0EFMVMsJI#l^G;h!0+dN+4Myk$2s%B>Av7ZA~Hx-TY+pc+gzv%Tu$%92x z}iV;#;tr zZyQx`_C0scMVY@ic>Ys^1?P(|o+rQDGX21dp&46Wtg6`aV(6^4UslyT@O)MH!1E~k zU*c)~U#KNxMLschT%q4fA@qv~{Q^S2uPFtNCJXjjd4rz8&^7(Mn$>L{4!=hO_0V5EFjdbz_>CXhEc zX97?D(TVZJB{kcBa*%nR@3fCC2X7sH=!c2xi*XiD(W^+acjCvE=|!)GX0*ME)>u*W zDn=@=?l^S#kpG+wO>cYEZ(lp+KaMt4^lE0ClGKGRES@;!XMWCIdeCoeMX&1Cb`YiW z0-lGjN|U zEzw=0L-Xz(Epnp2w0L`we^yKgbBYsx(&CLO9@bCRK{fvI1ryT~t7c3usH(hIF(->( za8G99Tx2#@IZ8)erzYTBru0Of%Y<>^y*!nvs^VUSS<>h~AEXuA4{pIpFWY~1aA?c) zCqplMbxZW#(SHDMd%+(LidC?qX#DigJ-KDt*sT6<-*%Cb`;O)<{~R5=^LCu+bY0iZ z891k>VBWPK5?`Flg!n=;t~-e*!n7BSX}p+iwTSbYYcQ|bGHv^DiDP@gmbYDZlG=Uk z^@y+NBRN`A-(<0A!JuC@6}$g8PV>QeJS`_aK7aa@uLeupJ%0$N+u#Yv(|dwaiLqnV z^Gi=Sy||z_TD5u4sCNwc{kO=P+QISQ;VF``DMMA8i$)!4<5_5#qo-d_sJauq(TzOY zYHN`{N@4#rCHnl~z0dsoG|?h=jxIS{Z1Yaq5g)ma{VHWX4y|WuIsX|V5_0GG^Q`T= zGPEU580(FH{gCFFjWIe#qyBi3R4yJ)X^KkSzxnaZnP#&dUx)>6&S&~eIq3SCQrWk4 zV)36Zoal|hO6N>gV}G`-d3NCc&>;A&; z8JkOsqaoOv&D@n^OO*N3(& zo4Rwu47Ky2lhr40y5)(XJ4!cv`_DT^RTP$vR)uH(;-SjVCcmNV>F(l! z(o4n_+>5qdcstKVoOw&4C>q+g^CQLE4H|Fj-I$AQ z*dv_9*0OZz)$e(Cv}IY#+=bDK_H!<+@Q;d7KVIl3 z7^mKIemdUQl}c1Z)9K#yr4{d)-hXbz^v+B1MOFJ{?uymv-gOn1_gD0H^{(&ktiVpR zivIO|eRw<8=&4wRBL*r~ukT6l#pS6}$EmrD);A-6Bwfjhp7rZ0dRH4wT2U9ivDcg4 zRFUehSl63QRt(?;{EGT;1rlN7yD|m1Dp`@}PU2*>PR2NbT+qq~dMoyYxdZdS+ z4jfSqI4MW8Y4aWLiYvR4JvN7pZZFHcJeZ4|89_cQ?ybNl5jvANG7dQj8+FR4C13F* z;yrIe_Qy9Qot*3MiTA|zlzPlTTyi->Pq;)imr311ZkZoVRIGMmF zjN|D|eq`^Cr}?FFzc!@S;1i69Do=bmCt#ANJ;tb4|~9=LKtD7hi*7 z)oEk-vfg&ueAYSR<*-f~QfkYBvE+`X<*7xj zz8Sg>jU??kY|dZ3VX?%Kz|jFc8Rpjv8*ZecYz@otIm_fgNALP{0+rkE-ca(Xo(;Wg zQTdovIa+rxbl#GW_oUY810AHs_9T;?!xtBhw4hblWt>0V`WOt|(Qp^{Q6_~)Xn0|V z?@6)w7`?tp6YCIc{DPQAq*Fp`ZDSgz zqCK5D`*a%c>t;S@&L8Dh1=l3K{BA`b$ND9QkmlMQe;kfMH7d-B`sQmNzRBi<`N$lf zv!st7ZABXS1)gD@(VOE#0g-xNo&D0!u!@H9%yFy^K4Zc0M!URyfsg*#Jk^D;XiYlO z7#M`$leqYN?kwLb<~+VN9%P$7!LS>A>E--%$f{`lv{-H6GbOX}iII65_#s=B+fsa4 zHQ8<@awYTV5|KL%8C)+3I5I0|3UXPI&9kY|hktZ&pcTVFLOu#C=k?6Fuw6g3d1wzm zPN+XnAIPCP{UMj^2>yS>G3_LhGq`0D$1}%5I`7WftzTnc_ zQRO?HL3@fN!?+jd6B}HA?z-|_NbkII=?i@VD5TyUpf3*4?+MVC2IyFTjtA&OfKCSJ zH32#mpw|Xy?ill3NcH*zP)J=7pt-BecOm`8k4tlhneRgCN}m7WQH9i3pQdiV_a}w@_89VQ(e}@_>|4y~0$gobvtx&(I4+m)O-t%2ZaR;C8 zLTbn-fI|AjW}g*OANL9E&)t2#3#og20w|>4K=D~2ed4oAbGM)GLh4gK0Tfc)`RBWk z`m|2~g%o!H`Yxn*^t&{71o|%IoF+_eNImR(YMMI*eHU_0FD5snKJR;Kn!5*m7gF3s z=(~{OZbILM)P8l%XhZ)UZUyQI-xDYVdK>)d$DWG*w}8GCnDv!3&oE`Kud+1vn~y@B zf4ilpf^GrLo{jQnfxZLuBujq?G~bD-v-A*Xo};|b()WU98<}e95cZl}0Qw?Jj|cs6 z(5o#y8T44RiBl|n3Fr#YX7B40DginTy4?Cd0{TYK^DX@Z=x>3ZW$C9upMW-WuBE>X zItu!1OFs*`5A+mE*NwwDu%H_(eIDp9fNrw%JkbB;gkK7}0&Q-E^}hu42GA2Ny$AI5 zpzAIDDbSBP^dq2u1$w#le*$z1+UQ#>eG2yAEd@Qt(o;cmZ@A>&*`R*{TJpaUG}e3d zxfLw0zXRO}nomB`?Vzs(&Gt{)bs_byE{XbcFhGAfKz}7b9}3V<1?Z;(^w$FP*8}w7 z0R4>s{qF(#nE?Im0R5c+{k;Iq9kRX)VLUL1{GuC=t3W-c>IvZX;VMu+(pdh5vgjX+ zm%fM8vjO_K0R7Vd{j&i5ivayXfPOJRzZ9T<9iV>`pkGlxLHhWtF>aoE0rY^7c;n#} z&}>V_%~P*|X4@0G@I?20xOwUX&}_TnUkaLgzlA;x^j$(i|8&qRJ$k;X27R7GH-h%< znXldf`VPl`9_R-gdI@O1md{rgfv)xZFHo0(p61Y9pi3OOFN0pBHiEv|^IxJigZAxT zqPBtNJDSEVQMZ8Jn>E~ z8S?K|RT=W{R%e5*5pi{~Y5={;q2B@eI)|PIdYeNp0nNVGxQo?Ap#A!Iv5JE}RlL=E z)a9US9J(L$T!+3Ibf-sOss=$H_VVXa^^c(a`h2On19YDw|1r?_JMhu#BvheLk~ zbhAT00{Y8Nd{2P(`=gZlH_$hD@+tK#&`l2gW6-a7;Zy1b(0tF^xRm-W=&Kz1&!F!U zZ=E#?UzQm!Yf$nkW8qjBX`qrx1pf@^nGiX1)wW=NTN4@ZCRR`$( zj{Hi{etxV~t3h)-Xxv)W2YQx6UqyL`-U|AgBCgh|n?U>Rb)EVUXy4vmHIzYLq3#9k zx4$dYXF&Vy{|fba(3gAquTTd--|x_01?|_*E7W&D`{i+k`U&XQ9r<5^KEtCosaHXt z=F#s}e+FIY(eGEIFz}n?(buTAfcE9DQKy3T`=e{rRM2If{1$ZQ=%5Ahb_&LDZzU8&}aZSeJ(HN7cT|E|IX4J<5uFW;wgS-t@U4QX=C3t>iU5H zZcDGw;XBlUfdAVjGj`)>Z;hon=BUIf(!~M)T>*NW)5S3STP-~Xc&hrkS`zS&S-L{| ze@)#O@c&qV{#=0mhD+n|@FSOo&R+)T{{c-~#GYBU3*<8sUp!K4Elt~}s&A-$mOcq| z30C2L0GfUhzSIr|n2l4_w^h5PP5AGqO_qkY4)^{5E#DaWDEvz>e|m(9;TGa5!F(r; z^)0$-NLz`zRQ;0;&oO^x;VyL&7rv}xoRb4|Yk;0+^|AhxV7_pX^=CGfsJPl;>E|?^ zP)`QJKOdmSIgbR!KRrNS5ui5)=#N>NJx7U3s^3`qZpEX&1oMaI1M+_i(36};5aX{3 z(B}u})Hn#i@oel8jL*MeY4eS)wd(y=eko)s)jBm42>*bkSqu}g-u9h<|4RXSls_2L zi4cG;l`#O4V=a3h*lNd(j?CQ-=0@ z!qP0pO7#!whnD7(xw7#6YMe79p#0k{t?et^u2u#7Qvtd+K<^6B|7vMw+f?-nbxH+* zb&M}kVThM;n~D?5msy(SU5VdM{@KzXb$Xt%w6-6oA-r`eeI!5rNo~!bht#hv&1PPS zm8Wo}7T0GbSK{}S4off7{(IDVOH+#W{iCH#{@tTKZRrLrzgKm3WlidT^xMIks{UPFpW**~^{}PG+W&j%7nWwRPE|ivC)y#b zvFBM;Z)v0dMRmP1#AW&qT6(Dt|ALw_6Tmw9zunR%{BP9Cfd8!l`YQqY&jI>OX9!LG zi2!|Pfc|2D{_g;N7Au~0)OS&U-X5SI4bZ;~&=qHkHdB5b0eWkIek4GDKS2L6K%c>a zvyS#Q2k6cKeO-XQJ3t=@(7z1Olbk6B>kI?c7D2VV2<}SI(Fb4e}z4;=!xGf z85fC|oYSB1(`CN=D7QXm><{*KK4)-`ylc2-A-}SLFXZx8!_U~pV)HIs+`7Dd$>Lbd z|ER{uc4KEme)J}Z8T>4-wuhhY)qr2@9kF3^^fqz65#{fc#^&#l8z-^ygTXp_e)@N$ z(bv}<>7}eFck9cSJtPW#R9MHwj|z`8uDZJ1Z%Cm&S#A89@`$y~%56Dc1m)_iK+d}q8?z7y_$gWY^V93JM&=(YCa>0q$!@N4b% z3+WO0{J4BiTs}T7K_jtK zi4LCDCLn7IkTnL#WF3QgayF~LtM?V#&&uce7`+YXd|uv~C}kIs90jmmvttpf5y&c- zEh(BU)d_ySytM^9Ydw%nE=tH20eCh=K$h1e-@Qk{*<5V$q6hMMRvqNLppv&ulA{P< z^AX5ef&kV!sS}YolF~Vnm^ogYb3_+dUO2HEJey`98xxSpBfJ`Afz+Bhl#;Hc045xO zNe6(*V*q0)fGF~co;({+DteuyqF$n_m*@bDasU&mUJL-RoO&Bwz1O(wZ6<(YOad@z z1F+>(-(XV$VB=`88XF~g0OQpt{Y9gMYLxodD9LD)hB}MskuR|2c^xv(SHC1wB*zf5 zt^+TcauCN?V9mrxf8c)h{Fa5wQ;D^K4>EZci2rQ7bi6#Z&aNM12Cau*v>Pv7C$+@o z_%OZx4o@u6wKle9eLUUismuF?_oijNy#strE{7rZ5j6*D&6{>tCgW>kiQe@+18Af% ze7G)&mk6z=Nt-;?YyiBPH|#5UQTdL0jyVsyme_`P_xhxHsZzhHXy%qqD*2kZm&iP& zmh;PM!<1QFL=Q>5_y6acqaTpKzI3W*0I{bTWu(C#Qqhr2Z@`%iIWjOyWY*H&{s9{- zx&bfx4>N*76q1|%nq00-(RtW6(3MWcJ7eqc*`cVtxdieE_*M3FX_uOx5}3qrac(nDwSCT>w9b=oWJ6Tb;bD% zTPzmGfextziV&q4K`M?ebYf%NH2qjSamD&nI>~$p*2C6_X{|wio94$l`+H+J-lVe| zfn!vNC8&+50ZZtPMH)Y}GkvC@vNJlfp1H~NKT+qGW6sK%5lFsAcTBI057Xo$vs?Je zeh1#zXFrW1Nb4N()0U$Wjv#SI7fMn$vKQB5m-NKZqQ!6HPLq1!*b~-s^Gq0`=xhG30&S5LLQfHo$ffWdRdJ_w} zbulmbO&7K=(lt8DMk7rv&yYdS(e2k7y`dACrl<2*je0#K+x$7Oett5wrfb0XjqE}0 zeX11kj4XuneNwS4*C2FON3PCogmIXUn2LHS!`k*949-&cPN-Y;-6y~8&1bjwFU9F5 zIJjv^Uw?F6-+=u&CeI_It`@aobqd1vu#e@v7NoUbcnW1ido1B=om7qFIbkF0j5~IZD4dPR*24yG4lt78 zf6f^LRLG2h^N4&6Lw;=3<9)HdTU+0ArSrTy(x+{`#+v;F)8KcYb$4JAdfbi`k@mu# z(L0I+4V<+{I-fiTZ+NZ$I2j{#&K6~^!pRglUh!sBq2r{K6VKkB*j34NZ;pxQaf+la z5{x9~S6S%|^rU$X#xzTMmh}#xA6$reV$%N5fK^XSI|F>LN=hfn$3&Kt-@oLnA5v7N z|8#3trcbUzU4k8&PC_k`up-r;T7^*vSJLfZ-qoCID3ejKgU>rRk7g}P_NT5&M*I6c z_`OSm_O^YlyYbb`kVMJa7~HmQAJm(yL0ZQ_D&2$6Ew+)WTZzA z{+K)ZfF-{~q~IDB#y9n@A84g2oY!aaEh8#sS;xR8lMy;#9x5 zR~#8?Ba!xg-#^>1CWK$oqa^~>u`$T@&5~5nu%MKV!uE}gu^3hvdauN8kWO!x5Qcc& z{KY@M3P*23r;HNwJX7_^%6{Q`1R}W(9zz^ff%92!KjKX0ip5w>$0T-Rd{t^gB%-(D z#QXd8Z`QF?&+1-nkj#Z<1&0ZCAn5AQeM~BbaBI6GJ1z5d05zKhb$msb=*8^%$g!IBO_eBg!9)Nj}*jvdf}(mVMFEUJ?AXx zS(;9^rQ=uX=~@G4-hN^-I$A{I$wg}Cu3x=6nbwN}dg(0?Qu?V{=&#fXaX48?K!B`t*E*c605EBp`3=C0qb`G&6$o{)mCMd}W;oT? zWn~A!bIGhD^O3BV%w=_C=~C=ZJn8@)joD$ip2GzR7^Um0|7^{uJ$%5LRh_JHOQcc! zmL_pvC)RG9^=@}K#X+N89mrO~RWjq5twm~Sy%|z@0)9Lq!Liaso_|&b(fi{3-b|#7 zv^=ToNOFs<&Jv`Y84GdE%?yJ4{=k~-3w3P_+S}NHK?YW~xNtao1$vX-bY1)EXtbjt zs~mHP*5?t8pr&529$Q59aLJihOD3YV;3()kzKwbK4RgEKo5kadKA0n9a|m#*B`n=r zXVkMuq;35=E*0wDP*=trJ#B<5q35qpc|tNW$~kq&c;dJfGK#(JC*dkti{Nv7cD%83TNt+jpX+mKC$p`cI1hL&ny#pV&UIM{(#X#Ec^$6 zC0)eAe*(C4y^$vt{v_b=9{hvjyJdp;dQbRna`7${F5zEJd=I$_rxpVLvxfSFz3^Ux zAH%KnUV~4=P4ay* zz-5=kQv-WQK67{uq6Z~xKg$;w;HA4%Rez{Ikf z3v?ey%(O86CS2u~Pb~a}z>;?2jI@6d3^<+kFB!ZXw`z;^b78;X>wNfNo_w(U5$D6s zJo#YxBhH6g^W=l&yZJC5$tbza#7ivsunf5DcEcwY{tDo7%O@5->yOk)w=VrX?0Pwu49*i0Vj2gSl2Pjm%JtaJX~c=G#s($X$CI0d}872vart@w=9^S@+@%k zb{qI*G5mug7Ck$F%PpT+_%{QKJ;cJlmGageV&UsN|5q^Jbe%h7JdbASsef1DsTyZ8gRMg z6AQlvxNH^v!4V6eX(_jSV&St-7X8G+KbP`WKe6!JfMskzEc_zi@RRrl$9fokN<$UK zt@_^#W*;K+1!4(Hd3lbzb@&YM%aZs9M=bIzqjJk97C!53*=qcQBNqNyz~z=tEPUpJ zq{YpX1?2O=3r8&SZ2K}_AQpZfaM>FCgCiFH0C2hG6APd9N9-gP{?(MXb`lGJE3nu} zEc`pkw{{W>e=qrV9z-nsN65DapArlIyX0Fv#KQk6`Bo3H@LvNi{jkX&V&Rv8Rl)%p z9I^1{lK&CICl>xCd;eU#Jn-9dof0TTi|HQ&S zME;fd2S+UY!@$yxh=u<$u;f3n@QVt4d1B#D0v3CSh0ileWn4`x{8M2^_-Sp9K8J9^ zR}G#|{?`n?jQHyYufnbRu)!?O2^Mz~f5Y&1;}-s=!QUqScY}XT{EWdRNK5!z2G0VX zKtZ^R$hS7E0L>fiUcwmtk4{uqoAeMYM zk9=E>#KLa_E=%Aa9I^13KjoHBEc}JQWu5p3M=boMz~z=tEc{D=rCt#We++Qj5AYAJ z30L@s8tO4(`2QF@3b&)_lTU_x$;XgMaKsW9`{$Co4Bzdm+24wMR^R(^Bk%UTOjijf zb8v1NH-j#{+wh4c-kX3+?lF8~;XeT^^2EY_3Rv0*vG7^sQn!hPKLfb!NB9S~4c7#V z9|5lZF}dcf)YfM;#Q9CIXRon`SoF*!-;M`}h2KEFZOg>M*Jbw;FyNS<;pa3|M_XPM z2v&Blv4>dnPXjKud}86#wz7Rj-nBDKdCMmjd2RnEjJ#|AV#vs|hFIi#$hU2TSol{v zd}85$5Lliy#KPZAdAnvvEc|`svvI=_3;%1tB}0Z!EPOTzd1es{|3zS_C&a@49dOy@ z_y57JiuWwtR_&ulp9u zcl(y}AR~PRvBvjEb@O(dCMmj z{wm5_{lvmwO?k^F7Jd(~q>EVi?3W~;iG_ayu=F{^!socF?bpW6O59q1WAM4SRljU- zGj8GkG`NkJ6$h>h*M#3{s6L2W_*H|4i2uvr`-u5)gFB2X{NEZXs;;(SUjvqSIS!Y2 zD}aU1zNq^5CM^3>;g1Katl#j7C0!GM%PpT+_>+Lk2JjD#SorLF%PpT+_{ zjjP=9iG_bHu;?KcJvRZDeb(q97I~Iqx#bfJ|C_)i4;XuhMbFR4x6f8$;j>DW*fBY= z@PF^f6ANEKb;*N9Ke6!7Am5J7h=sp^d>b#Z@RyNq<0TgUN=Kep_?_h2c!`D2IwtWF z3;(0QWgB2P9I^240xq|FV&UIId0VfDg};yTmQO5v6roq&h=u<}^4H=Y9I^0O_HBRA zZ2et?FdGxx)wsfc)KGs9A^azUA0q$H20up3&K~ZIxT>v;9w%7*6!_u)p@eO}mj5j1 zFbfK<3Ab>8!FLiD8e9ZFnGX`XHcKBx`-OipaLGd^EV1yXk^iva6AQnV{HqP0Somyr zqTg+U^TC%skXYoKfm=gH&q=^#SK=QWvB;DFms>uu@U_jGvTd$}jFcC#$TPj+A|ucK zN-+6l8}Sd0SmY^FZu!CfP5KkJe+xri=77YaNB38oz<|r@uPooqtMedNc9j;-UVFFv zW_XK!=BMgLO6B-6D)re zaLMC_Pb~K2d5B+9Bv`5>L~_a zPHbhK0B$Wae4UnZgLS^0W-#-!`gDVJ{y*hou}$;;Et^k0viF9V^2}rAr|i9v@+F^n zDDuQ2Pd||-7Jfc^7`EhTV~^+o%j~uLs^N=0m^bm_Y`~PywCl2>X78A*Djyy(w5ENcS9qMvy#YXXx0VCmmdWlccxpZp43vL-+*dS(F2ngFrz z-$_0PgK)&cUjSV4J;Ns!KJz4ehT+#Zn9u0&TMeK2Q1V?LyJ2(nnPJM?=P9wsvmC<} zMi0vba3Inl@7Kq><5j&Nh6V zSJejVygJ8V*8hTt!L0KIwg4)K8x4ON@oa-<5}#`@|7Ya$Yk6$G$;j(`{-Yz~mQj;H>$E&$uujXL4c2M-mciOKH~(KZd~L)37_8&MSGMUizrbLfZ~Q?I zPRA88SjY8kC$8@ptn<0?Q8Qe^Kg28RX{IL;kKJkeLFC;$6;HAWGF?c!g1cNUko@nq&;vX2BFC#87{7&Lh zgS&|N120@R@ehrBAMs?vA0R&2;Elxp$H-hw{3C-m6Q5#awi5r?@V614YWO>dpEdlO ziKiI;t;9bu{5y!t4F68z=L~;{xZLpf5dVka?c%GYo$}@mmc(KwM$)A>ye9KTZ6+3456M1%saLqV=HGJ*%SjVMaI^~E!T^eY|qtq~l3nr(582=kvZ zmKk2&rgRS7v2SSSd}q*{sFtb1yj_xg{7a-!A2aM9oss7lEWCB&p1NU=^ddL=5Uk9Y zg9l6n57o((Hg+EA6sZyBZzSiDPPrn?J~?S5X6DGw<8W&8h^o#}pU*rZt#wCncJjy+ z4s*2g$Q0x|=P73?9>bAOBhyoN6sIJOP~%8XiXKrm9r5(%k!d-Kvz;>(nhq-8@k=Ai z5F{b{grX4!%{mM^v**q}K|r6AkwbZ&$BI5QBU9%wyrG{j(qmD@b5(NKKav;u^O-TC zu-Wkr^Ll&E6GAhswxLIIwouN1&N&2m&&52JfZjP=#}e2%lIvK4o71+u>LyQr{{+zN z^O24e4MM!}zBy!CRYpgW;|$n0r0LEleKNEDO_zWiU-ucl=DqRik@Jn8%)-doa^86M z=lR^vn=&o>bmmOU-z-fc&qsjXoQVm3m?tw8wqg8VISw{g%*W|~og5<>ld|KbUypWV z-Ql>Z&UuF2|6*3fxn`EF!VTw9as zoq5Jw_9=M*!N5r+C~D`dJWn>G46;wm%S>#B1?~xXxz*L-NEv+qi#;dLlgiK&JT1?Y z$}o*5&jgRX(<7ru_L+H}hRk?!pPUy+VfKh5*Q_PSL)3OY!ydm^lkVl3DHl{D{0N#J zSz8`XWwU1)=b7Si&C&$-&(=E%(d;R9E``pyd_n8%DQHKQ$Q=_Gh<*F5vi$aART)dk z*{9+MR{flV=WF`)O0)ztea4a2Dc$h7OXC>k{<$*t7}ey=wPVwjnK4IPPd#$ZjAS_? zS5}NPT+Xx~Ti`d*SALyF(jg}kI%_Cz$jNq~l(YNLjP(#o2g~+&1$pDm9W(Pr4(`qI z!^H9bohMp9ErzdB1vC2%V1u;B<1`J(%wyYXj-&3}we^230y_@KIpz)|)jZ{Ljkj~P zvSFnYz3bNDJVaH~(>su?Ie+nm)%f%fzED(?PW2}?)Win{(y3MWa1lnNYxo5T{)RkK zSB8yR6CL3O;PJR##nq3Wt&4Ey6_jfRPvou|MsA@a_r77|E^_3q8Ah(tk-L8wIc5TX zGiN%ur6^xIHahya-6)^jR!1MV2j!F7;ppSmp?q?8IC9)3luvGtBgZX7`Q*6oLCPaN zj2!nqh#a@z=F`Xh4+l~0a3M2=gf^2u>ar^s;|RX(}j!%xyNFpM0x?}^+? z!^m-4oy1EU^2N(7ZX(BRsrlr%txV$OHqU%=VMp%OVdR>ec&{HuuGx{}@pAd%o$thZ z^DuJD9ew{jjND2`AGg-#i?_?sw{sY|K1biJ!^mCj=;PMfeDQ8|^s(;ble^i`_u4RW zcR2dEB{rYFJ&qiz(Dpq@EGp}){pU4L7CQP0}dh3B=E(FzB3@C^;yQt&^HZ2 z)VBy1{ituX=mVyE03LiMi4%Qs(Pup-;hn_?kcZT_1efT0R`l6`eR!FmQU)o)Zy=y=H}p*tC62z{fWFQxINuBr&^{hDDfS%<==&mGZs~--I8nVnpf9{lsr?Y5 zz8EgiHwwT_Z{-Q*okxghC;AE?$1u%?tzLpYwg>8q;}U(*fW9W^d(MX8P4qPf^!*?nIf>zO|0N1ES9cY{O#5Qc>pU`;zFha$`P({tEuoCw)B2`(@DwOm{2vh5tY5 z-UPm?>RcP&$w@*cX*eMYiRcMQ7~)CHNy6yRgybN>NRg@5DTE|QG$b(z6ub^#5=sCq ziXb4`)C&}&r4FFhS_{3zPq=8QRj>8hUadpbs>NRIwHEF7JbSHo@0FbshPL}hg7&|}?+;>6`#lYNZ0EGsgiX?W4*Dl%7k0MW2YaVS$iGogF!Qf? zGu9+SV6=BVHnDfL*wYbt1%r&(W&jeu)gHaqp~rVA#fe_KgsX|Cx2kt-8EzXk3HMQt zy$=Qm_e+o7(E-B!+!O9gMz|Paop7h2zq9jC$L}lH3&3BTq@xUacK&JNL)e=GC8mR~ z(@Q!!Joe5?#kDUnhP~Lk#bdAJ9?L3#KkfYsHnF$QV{ant;gXx<#NJOl_L^aj?VR>* z!Y1~<^4OaPd!rm{Zv6h@vG)+{WovsFN*sF=&>x%mcjEx@D})~7P@*Gz#IU#0u-ELd zw-xpxwU6sO_CAHZVLE>8hP@wp>^%#6N8m3`@^6>NUh+1#zwd;y}4kO&A-QC4^`K362IA^r+uD=UZnOm1A2BoYrUfgSMmj2u#=9{Fz(sq zru7cNUZi>&4?WXf{Jm;k`YDcEXV`neWAAO)OVPHulXM*P*qaG^Qt$a%pycyC828Nh zeF}S#^5qJ2s;1r-(2JBW9H-25tU$PuFLxN>j>h<7+KW$%Jf4q)o@sBhk&X?9y*EAf z&Vs!&;V(||<#ms}=L~xrp)C2b8;LXHHyQRKrS}1lX8b-k>|rQz?6qNhwC(ALOoP30 zi5&J4zb5F}_B1gDlf?D#XFb@0P2%^l$KE>FV?K)$d+&SfJqdf$phSCU%8tDms6=M` zw!>be{;C3cX8f%0x$_q!-Ldz8$KIg<@^3iCQ8V0E2hbY|Ju}?-2v_P=w-Iia$KJcJ zhc3c#k}uDD^gf0jnvCN_?{6Nx&!IQV(Q?b}3s3x(A%4f8$9&$7P0B5ZanDTebS%~p zsXrJEJu|&+-ERBcY1sRg$6hV$6~kYgq+^c9-u7;{pWFpyiQlardz)deM2ulC_HOdn zd#>9pj~?iWz1<#ruMS}E0gt^m40{h5_Bc;6^KaN0k=yxSJ$l8^n+ZGOBprYDg!_57 zd%o}^C`&puplY{|C$X1&4tnfO zff91B2!rpq!F~u<~Zr5l%v7a62 zn-1EeTOi>o(W*tb=L0hx|AtM%z0+gw{D5Vh4S#VAlkTUYrvtts(6|2+y|+AiOQ44? z)^Va2i~fXIFB@R34)iTwNe355A}-P4c7NZkf6sxJbd2`cTMv6?d5FD{9(zy1UN-D7 zUk(}eW{Ev;blU=v?Oh`FY%R-r-LQ8UoW$=Y=&}Clr4g)Mu!o=HBz_Nzp7x=hSx==6 zJT7`VU#Mr!o5bE{(2IgC$!F@B?OgPZLXTMT*}C7&mtTUXAM^8k^kb&ICj(g14!k(} z(XICAeHw_If9=pS!_79reF=6X++RS?%s(r$?{!w{(R~e>WyX(skCM!5e0 zI}+|i9(yUU7qmlCe+-MR!=raT^di;2TRh=57~#GKI}+}Gv1ePy+|LuPr1xpDr}fsu z-ZEg;=hv}`y>AcK`J(mOV2|UyI7vqyCN;!TU(On-*3RbtQgRK#y4J zRs6rY?e`6>$9&o#_JHZ8!Cs{NyIt%lH7fvn*}zQi@32XFD>C|~cMj~e>SMT*^gi#= zdv1VqJO@2H9oj~@k&bu3Nw}Ay5t{jT1ok4e%Sw>8y=Z0dO4yqQ$aMVPu=hicy$@l} zoDWGl29M|)?)h1f^DhBpmJYoWw64lRcmM6pigmy~+rB)YnC8`+f+$^(ec~AaQA?80^_EC18U+$K805Wj&kk zh)zA_7;5T0jPzz26HkfXx#NlgrVC9do-i>Knm8^L2ox3+6v%(5pkVy?;y_@0Q6c{6 z<|p0~uACYbC6<^s|Lug&7;VFZj&UfafE9X1<4lvwK2YQ$id{&!=<-w zRPur$?Q^@V&V=9{-;a6gj}IJ6jjgb(t!E&L*C3wzHe2yMo$=ubnEs~5t+LkdAJV&G zv-oyzroTTY>V;|Hl~aer`bPKuttS2nt1~V$_N@<|{VFQly*a+Ld-H)UR>}kvl5cc^ zl{M<^uSUGEd)45aI}TnJUU^YWS)r{C1vwe#roxV3_LM-AH8*4p*{f5q1#IYc{V~fPk(Hycjy1(WM zLsLS+71EU4HB&RM&CKtrS-(9db>mPgE49a(5F2lmrkxYs$V={aoZ55NSUp|0?VHh= zziQ5uVN>SpAGSX;?#rQ>u^)ZDA#sg0sk?pb8f)w>;(L4ZJDua^Ot-SSCr71r!m_^y zX{$im60CDpZHb%q^W>ig?payh`$WkWu4Gpf^a(sac|E!EA7>T3ewmX@ZLs{&W# zv`!A>)LzxrQr*~E-&Wt$7^tak9NiXJP#0)i($LV{){M=Wa}aDZudRdz8B`oDb~~Q$8e!tigf_UJwC-c40(olBmZ6k zcEj`Ab3e`lmGj%*w{TPCx5wuD#T&;q1Km>XF2{utyol$@rKN$X)iP6G|1N) z@(9QshCB-LLPK^SfX~V_MaWqm83!BA*Jotq@#yjm=d(vwm+)EWVh!i(b47&58z_FWYss%^Znp9(`3fL*RaH~x z&M2Ex@r@Z(RnE$3p$PA0P3+&R+v|XN*Y?6IkyW9IZm4C|4GjzM6hGbuu*2kAhm}*N z6jY7V`(nK>wD+MZwJ)qve4*AW)O=CZ1Y562^F>vYv|Ob3Ar(NeRw%9-Z+jG1DTQKf zpjaPRTou9_Du_{W)kLexc{9aLfX+7iRb%l#nXyP8An#P3%pqY!ptgGE(&NP=RD}0v z-PlDe1FNdaesiL#X3=$3*DR@SsdX%#Of)9WT++H|3d?NP#j^{mtmc;b#q7Mk9jijV>Zp1eJZm8SKpW!fb9Q9Dad&ekjOPFkw!8y7a&;rG?D-^8h}!lc5hs8`|Z-=fMxSf9y02l5x8 zvBL3uNJIM^KFA3?9Ov&r{=pSsE7OB8`-F51cHDF0vD~w7$*Sy4sTBQ7wh!ht663C)YEIh|k z;faO69GL5E(-8}QH89uPrXv=90dP9*SJDv+&+#uq^Tfh81N$fA4~|&)Wxx_2V&OTi zrt8T7vGA*bGc->u{5tCEaEXOqPkqf33%?au;zKO_{lKZ`;SY{j_!Quvo?O^Y#DQzSUl!V3l>Az6v5DOmz9QAd@vmVOY zz>Hhe1&Zf?RGDfowtlI>BeFcs=1UZB+nJ(u{;_pQBaE&Ctz&UAz2QK|MhNDl#t!wi zrY!lOUfAp3dxic9^8x#{&^`g3OnSYeQ-t`Qj2XQe$jK~+a5Cm1y%qWQ9%qbE{a&5z zcYZs7#z}_#zxK-IXVHD{H}RZ|?JpY}+bP=?H?Lj^IML&fF_2!Rp~ogYkltm69^){O zUM>9C#iuU0e+&#E@L3QHuy<8*li4?x5Ch4mnC{~ZI1mN-8!{%{*k@5V^L zY~sY;H$m9;G%*GT&jCk!97@IBW?(aZA4496O`O=<0K&GXJ#K_O+TzA>QtZ72Y}(_q z-96yMiM`)~Fzt229^b2?J&rwMuM(VXPapUUgw8x#fiP!J@!&?A(-PY?Qt$3_6})#h1$S;7`RVk?idy~zGKL}+<#)lVZMo@ zJvx3Cg1AISqy*tIOm3V;(vS6k%d4CAQeZC#UL5`CW_a|@haS&`#fe_CM{g$dSii+F zT)OL^M=bHHMf`?AX8brklK9=}v3D8lG2Y_D-fbRxd~TbzxN%w~_6})#ECae)*qf}N z{m*o8`<2!cult~9I!W(a(1TaA_))J?1nfnRd#F0@L+H&%q&UT5nKOPYNALZPN@U*m zjIhO?_kKq=(tFGZK=jU?h+7(lJJJ1)Nuh}+eZM0f8Ox}#|K|OUvvI|a;j+A$4r0cW z?XY~?3hN2&2yyMX|ySs9`vVxx;s}9Sx@Z7aS4!#+FbL!=tQB#FWJ9xQs zeciVs3D?s*zN{It_jKR+d%YW*H6xz?B>c(LSw?I&6sK8v-Lxa|%iB+jkL>d8m~OSx z{-_5L#!svVx>uI_b|zZ!Q%3Ah4rh(obF8v7Yt)`&@ugYW+mCIC?Kn2eO&9bkr@X&z zgfnMxpM801w*p3bE5upN4b@}zkL6?lIQlfZ#-bF-j~{$W*yqz zy@mIUD#MwvdAFsGOS5nv$-dt)^pe$6YKHHPUi+)GSc%(XgZ5h6vL@i-V(Oql)`fRR ze z{tOisPTi@Q7LE_EKAhTF?v(lJ%7otJ(%A6Y&9QNkmM4(k>MqsMK@xgYIIu<8h!1bT z@il|@S~E-6ADCI1{BzM+GiLbyo6^?of+p_h^>oBvl3e=Y7_ll^t1E|=uKnfdu@Xwr zcV4!JWvM%Nan|Hb(W~0Wc3P>wPKc5t)>R%U-8^=~#)PQ-D-W%5@A`>lv6LEDk|@Wx zc^uf99G+P^bgXE*$IlEWhv$?==KHg>(x0_6cc7b8i|ZCQwJZ-bHP^LN+qb;*Evki0 zEdlrP+Bd{I(VAVow9fPx@b*_tQ{%$=YXaY{ZfukLUIQ8}ojLQyE4~>nomD!eG90Kl z_bMaoKr2GTow$aEx|YefS=L&ALml>s0|wmKWF!Z-u5fJ4qPp75%tWiqj+2v`IZd;c zG+M_Eyk$vapt-KGwjOuMP9Y8zjZ3Q=>T8XN@HStcxFBdVA9en-u>OB}PtF)Lk%Uvf z=V8uTczmK=ZRM~3Jw1J)NGtg4JN}~0wg^lNRl%K>t4udi;UsC=8`wYlDKcMUb{w6kF z!lIlE%y;P+6UwIJJw?;`F#F~EgYH}^&bkb8gQFB@&4;`jn{shhJ@8=>ac0v3d6yyI z0Qn6=ZioCQLzeeZ6%}V~g#To0BHsrbFytQq7aQ`!zzv4{W8nJ@nd|IaZOHo5d)oeK z)=TgUN^rQx`#NNONe*n1#q}|Go~2xpeO@v}MEHLS|5=92_vfb?at!8k?m17AbsA)z zdnuP>r9qxABJA;#LU$T6-=EKRioI=Xm_bd*ta_rmi3T z&kb7MW6Md_Z#??{2Rt4713&tox3zyRfKg#DqkAIy}GIomT+4*Bg?XzlCx)IOH6y?&rduC>N?5xL_FM^f?tpTvHHtY>V_Q z-690{=KgnK7h^KlRAXW8*;?0D)oLxo{ZHris=oL9cdV`IUJ{>ORAr$S)naix zELZ$ZOhLm9b@rlqS}f-m)9f3%xJBGzl{M5=w@|H5WcA%$eXV(J#U*yM!|uIa^E+Rv zNrfg4N%(`nKhsWq_RsOmO_m7U2oAy4el&HFe>( zNS{G#TY#hFiGy+axJz2g8tSnMqQ}0m7%nnZEh`=BcTC~zw(6EPZ7DqS;$jwUq@Wq{ zfL6xOscTtW-&oxyX$>!rWaD@y#!YQ%sj1^f@1`titZk?ZFF%gbli= zQ&g|d;ec~ZI?kTY*F3TCX9D}n@CQdMd;ze(oUFP&Dm>>?{;*Bkb1UJgD)xzmp9w7Y zeu;(Wyh-l;5(|GB^*LC<5ev_GTZZO|g|7wn>q#21@aupjKE%Rz1N$$+A6z#!;W@99 zd>|H{^Cig#V&RXFpN2m;V&QpR+|QE&IAY;*$xl~2vG672b$p10=k@V)UZ{g37M^qZ z49yb@KM&Y{vC=0Np7UkN2V&uyfz$OV5V7!Wz!{n+7JeD^b^a3zeeMSH!|^H+W*{2~LdFz|ZdymRpf$8#aE^C)nhwnM+n0{$zPqw@jTZ)JuQ zM=U%~GcvUfvGAPU3r{S34EaL*!4V73X5*htR-J!Ho@7H#Pqk_Ld{KB7XNKm9g=aRU z4^{fa!ZS%3nkN>X?LyinvG8m*K`jJ;%Zu>`Hw>G9jty-r`pKZm^m9_I`azA!r}Lr) z9I@y#y&0M(7M@X*zKd9RJ0He_fFl;(&Iiq#`M@krpFnMO4@dN=nxT1O;W=#h=iv{I zSoo`f{of?p_c^JBkke1MY5Tle^sfb#p?PBA8>z1^(+~^aLVe8>3x5N!lnb%&cLArf z;=>UOzZp0~^Tfj62kieA{@{p(e+XFY5DWh>u-G9M{&8Uc<@kdm7XIhJVux7xXMx2I zvG9k1{a4@*j#&6tfyEB7@UH`l9b(~s2kgHRe{jUY2Y|~b;!nFwUDgzHG`8EaezwkT z%bJgdPUd8FAhGD%ZJ8I|;Ow@n_1S(i&$nsSmL;rz@L8vR=c@WMq|U1*-)KI?8Gob+ zB0dq_|6!uP>r_CVeC3Ih^A(qYzT^?{oF_s|{ufVwJdgkAQGe8ml-7 zHwc39EYTj>e#?3l#+hEmnSM;y53$+y^nrYKg?S@R?Ck09Dw#t!zStA^?M#8<;#L8hb&IQNdYk9cLesBSG0%6J{)_q#hyN}9QO27*ET8k z_$-fYPZP_K$pzXT>#xLb2mHHVT?LN^NN7jMEd)KY-p3=uX+xag3ECd>f{uE6 zsJ3OXSEBW75`R;i0#uAdfzLkS*KF#UZBz8Pmpq~Fde}RHjNvI`DK^HB^*aF@>^W{e z8rRQ_3>14TLsM@X@~_??MDN^C!Fc1*pn&siP@%j9t=@>1ccF_XgeIs1PW&$P%m-B* zR68GoHEn0vWx@8uK7nyyTNtb{r!^Bb=Cq0VPMr&|U8wO?y=PxK4ck6EF@dL3y4*K# z_s^|awl}7yBWX@-65sFr&lL~s>wG(HS88WWRO$_}e{-L9$=d#awV^H@@9X~9%DR6G z-uIo+d8l*Ls=HzL_bV{h>)c{R59!`I!+A=C&#@GC?d}kbot@Ji?IHWSx2z7_RUX^5 z0q_1k`0kE?JoWGd%11vJ;#=Xo>C0zilusv~qG=qybokA~7mj!$_UKm)zg{{bYjA8_ zRv=bu#9Ed6TZV|8%H9QO4nEl8;^!9(clcknxcKD-u&d%w`Rf)J|7M|Mvtj>I7xyl7 zY&INR>f+}Y4#(Tx_u?ro6rXQrGM;ogaO{(VyE}5be3$eNDs`UNT7EEhO=_%_AotTE5eBt@cs9@iRJa-Q-Kdb5m*8T7z=dSif2ldt~;XV~>mu>^U}i~Z0?v>7~SM6LCb&>EF?9W}dVe$wZ z^P2G_*No2JIW}sxB*x6@Jg2TZvmxjE-4l>oecw9|qzvEHpM4`mLbz$}%3Z$RBrCRS z()$}$WmtFYS{cUs>CXG)L!QT*;Bm>NzMZkDFLXw4a%DKZs?W6Ey8{TMd-dLTlbWYcxto%8DZSP!;IBfqS%i41+Yvf%h*{--$JOk(GZLF}e z(zhS;b=F&1N%r$`e|6JTy5GeWy(&ib`}Muctp_`MqDL9!TC*l8zP)#?wLC&O9`)yS zXZA_?%8TFHm~gaz-tJ44n0-0t`UsYe42@JH3ew~#Urr**5;?T-%Q+Wx_pJ>H2i@B6 zB5FgZ+tprKZq)a1$FbP1;k~|`m@i$s`U%LPdr_aqY!jaCass+j->B2-mxok>n#{|d4$$`=@StwPECyR{h-(1 z)0w(z`k+yr(RaJ80X;>|X{x8#&}(hKSJF^&-wLayGd5-Sy4z|LBo|?Qi?zbJjmr>htE*@0$(GF{&d(>@meEaCNgFZlA zc-QF7t9x_17IuDY)CE4lI0|F89OZjWuva_Cms@_UCK)LXudxz# zsTwx+9oDe#vxgYlajZQ%sZTB2aUgYEy7jF$+p{l@^Pz_no2X?|w_2U{bI7We-PYYc zDrr!AcE_>)F)TRqTBoMDW#gvl`>1pM>_1y?^{sR6)3NT6c)s<%Y4@#2c>)tu-_95d z^(OnkG1j;Ib?A4_OpTi#?T)fNc;34vD&fr3*nOu-O3ZQQU{rhB`%w?(>e@ANlX}~COds^v+dHfUPI(yp&JWfM+Sz&e zs^1y)Y97^&rVMkeFUH~-cPSC{rWijb zMep5(c4d@aZWnvbgtz^tq-r=zz`aGqmlZ(9+aW{jUBx+CaJ9UHCda-8Zv-SDEq zj9>eX81$hX$7;}rj=4`_RkF<*_A+{#_VV6A$P1@0ysEcnZR$^kqP9PH?fL-5QD@|E zXS(ehFUDI2oGV>twQpK$`R;zuY9Ad=!0hhscFYvrHspKu9Go8{MHx(ILTvkvf45TW za;&V?55#0W^y8TJ-VE!ssfG?_my`C_WF*07azfGMhcQa^&*Ax5k!C3+*^)x^Slilr z&$D=Z&FPp~^yVfE?~a=8*1)vqeJ>{^AbznUo;N}ti&1Z5l9MA`<4Agoin!^WFRqHd zdjxtXna_^hWgOdQChYc(=u5VhV1=gM=W#xP9%T7`vTrp>o7d|C zuJ!c=8*rxQ%IzDoQ3mBket!^Xf4M%krfY|lb4kqjI{4|jY(dEE2dJ(yL>8ASep zW4}4LdyOicdX$b8{fg6TuzcP``MB>AxaHHn@on7}VxrnNWk>n$E{~G7V3wT^XU6-|~v>_1SI3eRsqxo2~>^HaG)t+KL-aRJhtXm-CiH%{t8ObXj1e^|P;b z)5FrJSsCL;dr6WMnB{>oKzL{uD34l{M~71$zKyj}?HfCy5~db~d!vh9Q=?HkQD)xNRTXkm9||JrUR60%vwN6KIB`mt!?)vAejdPfuHJH19Hz67GD5u4{^C)|EjV{ak z@cRc<|2OG*)TvmBQ%^_knjarV+rbEujq$$29&_?H-jw#}rqu8J`ET#txoiWjb~tD8 zH3^9^?cqZ)k3{I3tnnN*_Qkliqo)5RLf>>`ylC7s_s5U`9G%m8ON|=2cz-z?)w-yp2W=+1Qq<*)@v3Vl1|8Xd37m~+JLZT)LxV3Hhn)7gpfny}0_v zd2gh;6`1T^uUqm2uK>4)JL6>a&Cafr{dc_Cy?M;H+%-7WyMq#rxl$zG6~wjZuA*@d zTaS&~XDz-h?alsiJmPy{)pY0Fud~}t(};sT9i8Fnt6p%%&YI|)Shp7Rx3wZB(p)kS zbI7rTfM2_WE5tU1&o|ZvQh0wdhjk4M$1! zr2Q+yS;t;l5owZhwC(R-A+#74F`e z8k-oE8do2^A=ZlD5NA2pbjLr9Fk2HFu?W3??B>Va_5|~I>yK>huy^@B! z=X)ZQ=>~jsCTs8&gYpipERUM*%SnoV(TVG~aJ}>5xRg?iV^PgBqBn^&HmYDArKI?| z2fv(Kvo0~&*ZXPWRqy;IQi&&B&=Vn@NjdksBf#`N^>oH1KThn$oQLE3%O-%0H0nDjGW@4>{=_HT$?ap7Yx?}#27VV?3va((xgbD3Jn zJKqk}h~R^9zGr`(=vqZ9S>x;dbz*7n%JRn&x8j^F(MozPHu;>`pTx~9#e2p}PPZ=K z*oF6#AKmEN`PttNp)X7NTI}C=OlQpMJKlPC&#_0k-F)burhU#`0Q7A4v_G3@_17u+ zn#9uWKV6%s5BIQt8-6fpXlzt!=VyOgeFxr_-X9wcpUoTI$+2R?NwX6zsDUito*j~YI5 zHM%#K<2v}GT^Oa-*mtRL7lplJ(fIY~hqA_OKi2tv|Fop!N?M{Sd^n;V*V}8(+&gr7 zXZF40*Q_2HTalEI7M)~`i(34NeGdxPVu}X32Zd`f8*shpMbAAb+!OPRO1%H%_CwWA z_`-*9C3c+U_J^1D_H_8ta&bL=I_{WVYh?|^`A^!OV}%=ir?0VYO3ONZ`?2<^hpeK` zUP@=ERRv~rx>sD?{ygUi&iLDNViS3PX>Dq3f^XCz%-L7sZFtisDWx}wK7D8DAMNd* zYwOQ>f3J7cON?-r>fzj3&IlCVD>==3sa#j!O^iYAnckb>QRv}UPId2-9+1_gb1?rJ zwf!r`V*}QN#`UtV#1_svonF~pS6O0=>sw#BIpPb)e5LNGbU4T3JOVj$;H#R{z1H?E zVioHS5BNT}yi46&-BP_cGq4a#C}W-G<{*|!uCATUx4{EBOY##f^?FWeW9=;PQyF2j}8XxLwu`buu2HKhe)wNhZLLYIQymk+eM72WO&5T)1EU)7QX{M=3 zHH?$Z>2KKTH0}miUVlw}TXnl~~GYZ#i+v`l;q7Um$paT>9{6`=}x?cfqn^0 zAJl)H{7lmvp5e>#$T=RFPxQLZXX%%OH086-aXo>2&MNDQ_F4KxB}bo6{<_ZRyz!to zU%&jB;3@<8EIzsCI$xhJU(ugW^SRDvecgEu_y*9?kmqV|mP?fV^rNX?YCi``hR;Ms z8LL^4^YxRD6K z5mW;d{{`|A$WlK0A+Lta_D%hNhrHX+ zzX13dY!ZL2QSp)?{{r{}Y+~P!XLG+W ztpGl>_W!MZ&&0)kWV+{7a=2KwM(^L>*Jql{SLAl-&E@Z$kPq||Asu@ zkdHxLW61cJki~aul}oh-L%z_E&w$Lb75}p#zhwB2fz0=y#XkhuefJ{Onhd$e@GpbB z$B?;R3y|M1)#pHCy=up{WGk;KxY4~+!hBp=KI8`D_z95582Vp_{IKCa4f3Ogd@1BV8S>?j|7^%Lkl!`r2FUs7qm?_uS^{~N zA>Rzy{g%oZ)^{Mg_3sR8J>=IMd&8|QkdGSj{g6Ku^VV>y2lBgy{3zt9hW<|=yZJlZ z`Zvgfo%js54nub9+i>e;$ZmXxTfc=o$I$;hWVgNzxBdv3@3$y7-1;2ynT8ydXjuV6 zPK12GkW(Rd81k8r*Bdf!ty+5w88drJ)`{ZEx)UJ3X!w^vepsS|H@c=le%6p@LU!{j z!@3Oe=Z1eZ=I6`FhB1f1F|60Qs2V-wwIN$^Q&%9b~tCWLO&^*Bbu!L4Mjf zeuT9X@{5MN8?rkdjIf@7e52w2GsrQHy%E-Pklp@wg!N0vDTe=Rklpl-u-<|kFzo#S z@-RdHQ^@XkGs5~3vRhw9SaFy*U2Eun4f3sqJPfj%|7Tm7kY9JgJKM^I{IMYyK~8p# zKij$h@+d>T2=aJCz7%qSAzuMG+K}t$Z`f~y?B>te)-uR$e9yLSh3vMMv#oWICmZ%Q zL3Y!7w$%;UZNFz*J&@h}JKNd=*&UxVt)D`6$EQr|S;%u7`1 z=RvX(#&8uBfW^9{KRvfq&J zgq&^Iy9e?D!yh*sjQLBJ^&`k``^>U_40)cR|8I~x4EcG;^Bwy+)+>;g8uEWZUTw(l zLEdG^pFr+0x(g$^3>X^`FiKF2x(@_UAVCS*5%bF6b9yY)ZE8VA|UkI~kJ zkS9CGkG3v??B@Sy>r%*-hX3V|-TWPG)j~dM_%}j!%WJf?46<8Zqpe#ZyX|wdwGOh| ze~z{`K_2GV8*6 z{9lk)81j3NU3=$RpFloh`2Q8Mn_uTzv4hS0IoJ9cyTgbW`@(qrE5!OJ)cxuQEkarsLQpm3u@(Rdq zc@|k~AiML4BI_>5?)lcvA z4gFt3-fhTlLH^v3KZ3m7kpBnrWzb>-UAg4R&A7`Bf`E)}b4cV=q zy#G zFG6lHWCsHHtV>K0@;5xP6OhgSZ+u7bKM_B=MrJ z_K_p;M(uKs{|`L!cwYF@j$RjN`AJ}|8Tu_PvyKh1$}GMEPWKS9#?Px}xE@3Ip)IFc zS818=sQYn#wOh;A+VUCJXIg&EmWNvx#i-*sr|@Gwyhh9GZFz)MiEAr#Yi#*!YonHr z+H$7#TP?4)>}{$@9nyJo4Qh`2{UAzx}u$^MRHbZ9neE#2L4M z7~lWV!PVONcdnJ}@lW;0G8W!t+Y33@ZdCtUWS!~JFY(AXc;r{KoD6$Ia25U&Ewfq< z!S(Cpvs45F*x_u-D$sJgEnj5K(K5A|o*O*!ziRnO_;GysnU*DgxcsQSj8kQ3(roqc zL3w>^GZvub4gNZN4JzF2G?+zJ)kT%xm{N)blUtW8sH&*yb1&3hLfWxeSU7u5>70tP zs+py;W`}20%`2T%HKX*Buzd6us}0-hFLSly$m=f`^|2lr?|r5xJab}I#W$*^R#b+s z6>EK#ini@@5#y7xKe7J`j85sq^p*(nT#zOVm1Jeal#)YcB(BN8Db#S|MidNu^<&eY2g}rJjQ^ zqTvLrVF{8_sPUIWEgaw7U^s7WXu#6xQTWjFzIW@E+Kn$@{_R`QdOXZb-;d}q_44) zGBMGOlsuKv*NTeL$=6EH!zzX`^^NYi6{QQ%!m4YWXIj)se5&2MPr0z+pG*qOx@0^K zV}$#67&4xqIdwy3vDgpY{9`8U=X6fpL}8&@vgV^beJ!cd9dObA!Vrt4--A76h5w9R z6H6)%{HTxmTDw{}zd)~g@2>i+E*F$|d_ltiS|n!GB{-{*bdM zzjKgUlpi{>pugQ!@Mxv$e#~8DbtpdSE?bN2TTc)0$G0lZYUkJoV+uLBw{8UV@)fXWU4RS@on3v~X#M-`R(sRJE5d;>wn z4nP$QfP}0++WwZ0^F)c|L>1);(LP~iZma+oBU z0H6-S=k8S$08}ObC}jX`nMj!=a`d%zaw^+^RGdhu_yXyoA?Jjk<3nF39=b|XPg@B| z+(HsJO#AFEB*aOfgLK@$>9_%@lv7W~EhKRRrQ?RK%Lz&1245!#i5v8sBP4Exx*~)M zC6a{_$wDVgAblW^4ysU+P$&_CpN=<>&LSY4Dj=N}ARRU7YePj63+YqAI69JY=`rD_ z&XJp_;xN&ibqn+4LD4Wx|$>F5LLWCH2JL${?$5p7U_ zR+4@oG(qxJdWg_OQAPvO0ZOxjpN>2Hv`HWx86cgjKsp>C9T_0!Sgj`QFEmLqdXi+x zBwg->(r^G&)&uBh5vfQJDVs#Dp2{0=y2GKb%1t2M8fp)?Kv9e~u%!Xlm706JpDIxh+_YC4q8L~s&+sXU}~f`N3bfpolp zbmHU#JhZEdgh)qKzRFXGvBa(^0L47BALz6Z#oF(z(R0*3Q zrm&#T1n!dRM!bK};`z#pbCqHM?P7VLTg@o{*XMrrhk_P5u?qD)FU91OU(A^^Z-9r$ z`+xsPE|^S|H<55LL%7fcW{`7!%hUFP#}c(EiNUgn4x}IQuWGScq#a z3)|`%8Vq|Ce8r=T-@rUUZsX%c{ZuDZ;G!nZW_YDh) z)nSDjYi-@oczm*LX==Ap}y|P=8J1%%)aeK^Ql)sU9EGa-$#Npoww} z515EDwGEv3nAy#I{e%%ePJ|}GczIn-J>DF|^~;+2*7~N#FfQjF@0js8hVQqaPp-5( z@Dm+SfCFYD(UCIt_(3u45{!WA&>66XsUf9{7wyU0Y>+W8DOf)9 z+=@AM%i1dO&9o)xw(a`B57&ipnb%E|Jpef|!=?PXHXilO`nE;itZ%5TscxyYM{=jE z`yRjuQNORwc-DHk=GHI8p#oee)31r0WR%_b8plS?4AZ)urwEEMEJM=kTEeZZ5p9LW z&8owzxvh&NV#YYx$Kp67SX(S@yawN4TWEAt{nC9B`PuK7$XRNSJjO-9{<(@NfcNra zh;6E@x|zKp`-KUD-8_hN6boev2Ec1@k-xEacH43!bI~&Q7&|V=1bGv$e_Sw_mese^ zG}MVoh^bOVfKIKR@Avj8iv9<1gtA8hmCZ)6_19&GiE*Hx=0J(V=ke+WN}OH4?Q5I; zlf{Ns-&Qw!iT%M-I;;vr-`Uv}Ve)(jky!`I5#$2$65__1bYpHLlHS-w}^|o79Dtn6BZ-&9I z=$N_fJ+hEZ!L8mGwN%&g+n0KZh!6NQ;`5{qt41ul-tx?coIVSGaKyqF0%vHRSorb4 z>9g?%M=bng;0(lbIZ`Yq=oxY*wU|1 zX(1MyeC9So^Tfh4{^?gLeQ#PaG;gNmLh4_o^ohmJ6yOZa6AM3``d2G`V&P{{U-QJm zvpCcFk|-Rp@XU@3%@Yg1062ZV(kB+4^&~^{W}RuIeznpk7X23LYo1v68>p`zSSJ?# zX6kF6Sol@cuTl1ig!0B~LpIG?&sjqor;d`jR zQ0Ws3znl7+Cl;Rd?YwK0KC$quTjy(D>KiEgn>2p?f&=TV=<|6jf4#CpEc|%#`h^W* z;oHbxr}T-1XI}Xm6mRC+UE~)lo>=rBBCj9FB^LhYS_z!{8C*u!}SoovB8JZ^+{tMvrJp92C3;z{xhUSTd=Q{*qpIG=fV6jgu z{9s_|TZo0vCy#f+=!k`%MxHNU!x0P5ZdZ6>;aTKTABcs&0XY3U+l>9*pYS(>&(J)v z@V8Q5=MS;)tEjJeV&U!QWObiOEc{kri6^n}d=@>G58J{K3(se@f>+qI{XRzUN`?23 zze?d(uuHjG;oo7GSEcah#Pby%2Ag@+3I~9L3lttjzDD8kud_46pQ0m0OCsSYZ#KNZo zOTG~c&-X>7Z4wL5_9AW5Y&(V2*Y=4;pXDy$5(|GJu(VBL;im(qvq0d8g`WYOp?PBA zIfasNiG`m>eH|ZS;W-?pbD;z{V&QA4uX$qO*{;RD*~Zx&i+y6zXBClj5esj(S>5ND zZT3m(>pq8A^beC?hCeuB;a>ulK8INNw}GXN6AN#*@kO>7dwv+KS2&1W%C!m~!Y+87 z!ffxs28I8OUCLsGzrrrBQQ@JmpVy=?+jvT|!qdoKukh8xoJ7E_CT>-DGjOm?;a%jH zDEusWeeCPNWlI%*s{O!7947UdSn^>!dEE~X3tvKhIRb<$!6y6-!2TN)Pb~a8^8ccE zV&U&2uU}dr7M^{n^e4o^KSN%R-NeGbLcUSiCl;RLtn?4&nENStcA{{^q8|rJ`VC^? z6M?1QAQpZw^-E|)y&EsQpZX;>ZNGCTd;q-UGqLamw4=vvV&RK{rQaYHej@d?ePZFy zr@rQig)aw|_C+lGLh`zO5evV9{7v|SBNo0JSjK2#;kN_J7)>lZ>#D?)Sonviuj5H9 z{Nun9Ph#Qsk=N~=Sojyo>v$3if7H+?7XAxh=?92~=Q;<{4-gA)_XFRyv%&5MQkE&4 zk6p@gg@21(kd+yiSF;5^MfBVxCOEMI&8h-%)rNc2WvRzdUrT+>6ARw}EbW(Ac+SuLEAR(r z&ehkEU#WOv(SMq}?w5##e}%km@5I7?0WAFzvG893OTR=cJlle#i&*$LU`ZFT@b)_* z%rH1&;nRU7pNWOfHh5y;x&D;IpICUV%OQ4%g}>V1iG`10JXYJ$vELm@=~6hGJWqDv zcnXxV)`s?b=|MI)xYw`+Z?mBlk0h1du5dDN-ggxqNxWWRjyoxLC|qgqo5|m)_-^tW z6y60Kyi4KTnhEc}P$^*I!=@G(%8aEXOyKPlmweJ1OS zgi9>?1?0Q%2S+UYh2(X(#KO-3mN9}@_-5+sd>|J72J$)|h=sqMyv_$=;qND}!zC8} zN%Cv(2S+UYbL7`5o>=%d$S+bnvG7NMrH>^R{!?J-V~K_Tocd*Uu=e}#!XKl)=81)m zL0gbMmRR@zu(S(e;l}`{mn-|k!m~|fXr5U30_y8sZ@a=D zlHZ|lGUAiR0O5uL2Y;Y2$C|ud3eO~dK;Z?{=~1|r_(6sFPI>Slg>R+)4;8+hSo4R0 z%XTZC^Ioaj#F8hukx4`V&Sg__TQ#>V&R*~vr)nk3(sN0|6Ros3;!^1 zdMW|x?_v;E z@JINA8-^{&Ooi*l7JP&V*A=m)aKM3Mwa9zShW45(dCY9MkFllfwW0NA?D8I0nBzt8 z355p}vk>6e&*%ME;pqnUgOd72Eb-4Kuj?DJ@cHELgaJ5W;U@$8Hz=N1`03>DQarKn zSCZeTcw*t($Zt|SvGBK(zgzLd!aofx^^;imeZW#biG@D^oIVwQaKyqt2b`gKV&Pu_ zmi!?W{%v5Xx5UD~2Q2lLSa^=_60SMcAEmwymss>a2bOwEEPOh$KItNbAr zzJ$E4x5UD8IQMVC9~`mpoK8vKPAq&3^ny>>>Q*xGPZU0jm>CauEw-|s+R$Rx7JNqG z-Poo4OktYH+o$jm;{6K$4!hvb6;4LDDgUPMP~bck6dc=Kuvg(AF*^*nE2;B;6y~%* zFyk!a5wWBt9$3aBV&O*uOIZ^OUrb)N1!CbZB+o$xj#&7G!2Wv_Pb~b+w(!!bc;iQn!hPXMZJik68F&z*1hs!cV5Y?!$?NuOzSQJhAXg$?HCu zSom9kWgbE-dDYn?ZD{vBF+f8|1VOHNf76{yH z*z$g1L;Id%kc|M2*EaKhsc-p!vZ<>c=}fN;dZuK@OcPw~XUZzA8Vcw*tVlmEWriG|-o{(i+1 z3%`%NZePU0Gb^Qi5exr@!4nJ5JePJyEc_T?X?MiJvn-_D5ev`$Hhnq_!Zb!tzGhP0Fg#kEX;jaYtZ&y6A@D1d5D4tmO zTgf*lo>=&G--@W{zhPlC$aD`$dllE z_=6jaE%?3-tpIi@A1M3~cELX=e2Dyq3Um0$`$%D$$YaLCeSt0Ik2bW|Fbp15I2YmO zeWEbO;^3bYo=*P16=q+Q_o>2++o{aW&Vs(w0b)tx4DvsKVK`#p=L1WfBo@9FSn4FP z@QZ-cEAa+rC$zfnW2H7R8`6tbix8(8WLvG8MnrOprwAEf>z_=6)Bz5qBw^Tfhm z2rS_e3qO;*E<0l3uO_d@3u56Hk?&DuM=bo!o~di{8V5Gmst21gcr0xzzrsjQus__ zCK_%ewmhH06NzIKo(e2Fml4M*eitz_11=l8;2?$V{yARZ8QA3|C>#$xc~+U2apOK2 zn>?#bEIi{T&-oBbTG)<)%xt(gZ2sLY79BtNWr`;jp2wz-#vh#79@%eXXr5T~8E*O* z{K1)V2tdxzJhA8pfhGTmg=cRs~jz6*ROQ}B=e{jUY-vFGUd1B#j1{V9o!gEe2_KAgG2Q2wREIi97 zn56Qd7&tFk;S%zvDLf0fY_P&@)cKmicA1_70MAT&^)p5 zEx_qI{=~ww95Xa;mgx%W=iv`-1vb&|0G9a!vGA*b#Xhm{>!`2o6AQl?Sn4pb@H@%t zKA%|lhk?`c@drmN{2t&8%@Yg%B(TJXSoo)@uj4~3`~hI8d&I)OL0;!SvG5-Nrx)N4 zj#&7QfipBuEc~B!X0V-UMe$v0xrA4YzWswc$4Pa&`S3S!~e z_e%K^3qK23%9mL9dDPeOBo_X1>T8}@ct7GFOaTEm23y_`g(m|CIq1R7Bu-U$5%Exk z*;nMHDSQ{PK6W>CPFMVU#AhhXVDgw~xBzy+;R=r-pRVu%Vr_^0fINFlEOBN${d@JX z27f+qdNKash(*5yI79Qq!j}W57vc|&Somqc8JZ^+p7|hUO)UJ?!093U!4V6;060VQ z#KJEGmT-xMXa6AKnteqZ^|cbQ=r5zb7Knwvk@`CR#KNxt7W>4)uLhQM5epv!9L!Mp z98Y|v!V`hZM=0C^oOhPOgMp=P6N{ZQfu)Zn7CrzheJru?*}&4r5({5KUe9}ph38n7 zJ`R6y-f=BM^Q^0)&#^3hJhkzR6E@*j0cU8QSorn8(gulzzl-|1?0^n7KL9L!EV1y<0ZV*{g+EMv9Uo%hUj>%<5DWh{ zaQX!N!4V7p9&m={iG}|VSi&V1{wVczxWvML0W9^9Sa?norCyoy^L+49F2tf=2rT77 zEc|%t>u`yM=k*7P53%smf&Gu;4~|%PUYC&g5DU*KpyV5|@J|9uJc)&W8d%~v$3ie}MX$Cl>xNu;d%D@UH`>Pqd?N5exqYaE9iIg@2p++CH)H?@?d##KIp1mT-xM z|AM?8%ZP=KiFSEnhes5HXG0P0bmD-*#l)EkPa__wF#E<}mcos|DcK4yC7+}4GT=PT z-%dPA@!Jjj4E0AV{w0Ht29?J_364WxaIC^-lFwC`Q3;--aFDzXYYMRrYY}zm3D-=V zr|^x~m9xUa-A?{og}0F}Pxjlgm}gjjgiCAl6#EIh{o zxgKJU3-^=P{Wh`aKTQ4!l~=^VA0W@l0!J)7Ps{!6FyM%VPa&_{7qRd&$ls4YIAY;1 z1D5`WSokY}rT-xoem?beei92`OMT4~3%`Q;<#w=r-a+V~zUGNVe>L^B9b)0vQD5`K z!fyhWawHbM8(6L-5(^(dRDu&hz|maUB!%Yzm$QS1yPWtug*j&np0Ds`;tLdh5;#xu z93O)hDt;Jt!n3KDe_ioxmU$%#b62j9okw2d2I5ks!+U2zb{KFskS|mCKH_qP2g6V9 zQ4*VJl(G&Od)(3NsI*eyngj@g9Yfi62pz`4+WXVdhoTj}!*9qJHYW*B|v0gMY^0pHjSS z|7k-flNR9eTbD0xt6qS8TZ`H+64ZwEdaV3ftm9?nFTg4$`7Lz~)%j%evG~P5vcj6N zHep|*_NNT~AFc`ACxv!oJS$V!YXe4zvq#Nb(H+a@wAI&eeK+@82cEo)6q32@xU;6* zsTwik;Vj*DYVj~lIIFOonu(KGnEr$rZ?1XXe<}JCAAX``=uc?DEDvJ^s8h@dC|eA}{1)k$zAH$Dc$ln$X0OBM_Qj|C z)rkI?!nLuyYd{UW>YEwe6Mc#&zg3OAO&o?fMu+mTe6SsZ7R4QBq1t>`WuP^q`l}4Q zE|fRe6D}k*zyY4I65rvl(^KDA-&R%K(o((L%I6ZqSTM`VZ)|F-%fD#G+`Lw<1q;pk z)|#dH)ou8K&VnUvb(oZJ1-WK5mpO_5{g?<1G4zUoIp3Pe4bvme$+&s-O2CO8r-}pV zRT_F5kE3^)p?CLj^lA+~K4v&jxXc00@t6)y1qagOIi{q8(?QY801weV@5j#S;Gf~5 zHO|DIdOj_C_2@^(TcwQ8iS&30+YVO;Kzlqt7AN5bK`^c*n#itJ-$7-1le8bx#cQjk zy+1)_nTQj6D?ym{_Q2jAaI|-t_M<)Cny~Ew)A2No=WgP}-eB;yJ?*h*0j|ryllH!b zjefMpQ$*9=pCRxXj5x8!OD3khS8Guw$V}Q}{S|wB#F2;ddJWzE(D^WeJ)Xvx_O4un z@&Q46so2Ec&pq~TkHs}Gi4^n%;?$#$z1jxL3TS(2hP_xE!01T)?i+-Am14xON5f|P zI-2nvb#3nq!`?KHy?9&R~s7WUG?ixYb{dF(BM zy#grF9v@*4dk=W*-3)tM#TfQtZ@b6dX4rcP5urWab`pCZcyK5V+2|6cZdk{@9Wqkz1`3==Ou5zo{?M!@6_S)x*{F*u0bA%<1yTx(s~k)X*uTi z#Z|aGX0IoHG55Rmr40TOzu$Q5&4)cSVaGXfMIwl~ZUx=9p%<```V+m7M{hIqn0|2# zmo5m>ERPbz4^7?9zl*S!_$?57JP58E_Sg=^iM^}Dp7yv5_OgLl9u?Tc-Wurf+B2$> z?H+F&!-)7P`9+>Vfgm;F9&M)(Y z+joqec>NJ}wv+t(A?%R0Ch?=)EFt(8JN}!ZaC|4_p&vq9Iv0%fkjIdYjgJ_}u>z{; zQ!u z*N)%be99#%u@o~zUtXHZ$vT=qusQkP9J~C!V9uDQ-@ZC~fX~ULWWU1R?_9ZP@H8)vMjY}@ zO?n5RywkCEnDSpWw(h>*h&ObuYI`@f8C5BftJBha;iPvqRQkqpk4)8idfPkx4P!6f z8_e(zedmt)y}^zzWvj7+wx_%ly`U$oo-WT=m#O?4?pW3njC^OAFQa6biuzNZoU<`< zI{hfAXpiZr>BRd0>(+_i;7$)t*sLM$dP1W90s5(#x+d_%L(N zhRPpx*(KW%MLLsTNMe3VT6^c)hRP9Lt)mAeFy;RC5k0=#ws*wRmz$B z%B}g?&Emt_Sk!)JoA41mgUWwfzB@W&-lcTIc4`qK%PL2PMVk z(RaHd8H191yL28s8@g2N1e4Fb|lSEW23dHPrCKZ7oL%FM|5XO&hFd4-*E-!{~BQyJPvetT;;tlK8qT2AnGwPpW?s*a@8giU2b zkS~viuj*_KSEWQ#2VH-`o}_&*zk2(}8!B@WQ&Wol+ZFa55N*G{XT@U4%l$(K?)dBa z;Eponakrbpc~Q0fBy;SaO31jv|H(YpGH2)Qs-rGT<#hc-<=nPib+^xn9!5)+*o&jvRpOAY9dq10(9y(k z7hpy8rWN&(V7R$?b@Srj1-UI}1aoT_<4Yd3L41>j-%APdOF|=ql;+o8Q3wCEJBr1t!2v4nN5b9`=~T zSkC8+dY<5OuGrX|S6n>jbFP@!oTH)Ve9jdMn{!0+oUhl6iRtG|#&bSg0l3Cc&J7Y2 z&)_}h1MdK(9|jM{|JV4h#KxSV{R{Y?ZgD`@`JAW5U5fa5M(;VF3aU3i$GDPTy#qYj z;(Yzc^BTeD z@Xqs66>nL4w~tfRIpF4&JVH%X=YgBYmmIzXoad9;r7FHUw9n$a#`2oQ{{`5a1`SlL z;G8dMH&|T_j!OY9?*QK+6j$tS2KUY*2P?jkdWGfBTj={N&PQcdSo~q|GK)V7e!${K zz$dwUhe|G{#Y`Vv=1yEmaF`OFhUo|`k96Bvv^|+AI^;Zn)^)s zI7!?uR8Drs{9ZTTouGJ&O#}ToPJC3<`79?sOzQm0XTkB&TJw2N_uHTH(NXz~sC-D( z{Yf)iPmvVGWPtAw0srkxQbp?SL5qH ztLh`w4frS}GMAs6sj0??(wb|lYa*Adt#7X52XD-WIOB&I<`+#{>b!5~#W&O65UQ?i zSzW!Nrm?mG0Xvb^;CZHc>}-!<2H?O9s#r4)o9Lr}L*{gj*X~0n;|FdH zwgQ8By*V(8s=oFt`wjySnNu|u$(Lr+Lf<6q4x#&E= zi~dL8EOUBKEc#o(*+wT8{XO6S3mlGE^fjE_IFV?`A;nR<2kg+)0po7 zh|Ln(oTl}qzy-#J=kj9zHQE?`J#fVsZQn+F6EE-K7o4tjK0;oQukk_PkkNk&T)~^q za4FcNO%Y2zqyvXS_<`GuP3i!#*zBZ!0e;|!MNa|_6;RdpdMd|hJRE=Nyr~SwqOBP3 zK(z#ap+b#o@t0ntaRdIuW*u=s@Q>ko2ES zCxhg1bCdp4@`3-uuu1<(EXSAzEa4DKI41y0IK-mQ0+#woEa5QBPziqEg4jZ(M7nRU zn56M^{DpY)7j6-@$}=43JR1?1=3xml07>E^7Mw8FPkfo^O;FCq8Y*|K)QE{UD|!^zS%*?)zwL{7KQ@H_h&y zyid!=|LGa`ai^@m_ebJqQ-4p%_ha4nVflaL)XIKI2M;0Rou9w+@{DKg3G zhBv_YF}w@}W{39zG+rMTC*hp{%?|Hm z%mc^c;2B;jHc8+7nDCxN06_^1{}LYOR(5!^FyWB&4Yb0$J0`rh5Wr(`!u!{l@R|_b zR7bGWEa>7G7q{=n#CtLtnK_kkOldr z&V-$$o&J)(*k@(mMEXz#o%Hc^mv&4a0mEil(N!Y6Gc#8`h z`(ok5$#@XTb?&oM#q!jYeu7G#ohqF;zO=-#{_JO`4kRTwX<(nv+3FGX3+Fi5=d%2n z2F`csPt4N_PTz?+b?20wcr`X=An{sk?4OA*#dev&|APOo8GI%Fzi#k1@W0;R4d(wU z{I?q1hX1I+8}a{5gV|=<4c?6Zs|~&e|62^c*8G19|JNCOJ^r^E+=2fa4DQ7LHiK`( z|4jyO$Nvt4zm5N!4Za2cw;KE%{C64rUHso>@a^Wm8~=A0d?)^YXz*R;|3~KkZv5Y4 z@V)roYcR(s=I4*G{lwr0%>PgE|1*Oh#Q#GEKWzT@;eWrukKq631|Km0J@`L}O+S%y z#gOJ9D~Bu{QtDs-<(x6Mt07O`+1@cUPtCwHV{_bRUEUdbedRd>9$E7SnHy%qp>-a9VwoFe!!Or)_?cy=blo)l*7fQ4V=~~|Jy3OT&KZ5+ z*owuGB!A$}w(_an?sH0!WPc!kb53yQu?)XTl|0OE7v#%LRjrw6$~P=uwdVDt%!ppK z&6ha?+DbJbceDD{TK|#x@A;3M7P|N7Y2ywY?eMpK=sgSR3m;akyABV?7?!Cd#QG=l zuc4k3YWuLmUzRqgQ+(?7=U<(Zcf(P~cTDYvs}A9bu&XzxJin!N;UFBxj8q@Ox~Jhj zH>~_EvTy6|!vk8szd7|aJiV4MP1MLBe|mQt_xhvt)MG|+Sz2S%dv?<|^{|SjrVi@Z zGCS?%|2*{m-aVx#PT)MAl8$6TEl-tyAVe?M zjj4+DXwYobo=#XD6Cd9$JV%q;b}TZK&q|KDRdlEBVm$QiPQtTxrtbRv>Eo`RY}efZ z{`CAUsJAD`ezEm-FzRiAS8sP6a&xdXyb7)2-JYCLwI6P%+%P+1VC9D$SGT8R3~Ku@ zCnf3V?5XGDd0GkAx2ruhXY|ga8Sj2{;@D_+Vou)9qs3{rD4)L@_509(oRpnMbMo&! zx-|NGuS_y$tJXo?Dkre>n9qNO%JJAYVE97^U+8B z>Rt3vqjw%VE$?2I!Z9x|e4Xu%g{|BkqqIJA2x+TKef`3FR$9H!)sp_dUfBBmw$zTR z+fw-Stk?fcJd}UU>lZ$6^*uA9FL}9ia72Rd#y3>!qp1lU$yEdLqEESg(aO$v<(wb4 zoX1K!HdKDswC#jf*|zbN^6sS6zAg9dv5VZ6>$S`cmEQBKzFmV*f=M6gmO1(siNR@^ znCAL+r@Es`-4l1V6!@Es)&9bK|%5EsZ0V{~LRH zj{&XW9acZD$AWH*1*s_#X6An1)XmCw62|0dE8$Z$K#v6CAFcGqX~pZmDE=EN??-v& z?$Kj{S8vekL+_i~7sgq=e(yei;s_PqG6X%D*VlWaK<|DZvxV+F|E`^n&)lBi`M36r zu>AO>eaFJErJxT<=-7O9%8w5DcF)8dH|jfbVt3o zxVPOOw05>9{C9+l+&-F-ygo5waMDq49BZ$Z3eD#i3hIJsu(=mT>!+@RdU{zvAvN!5}^$Fj>$%(!jQxjVs zJsmz(11{>_=f$h3d=b)_*>9-)33|6Q%v@MYvz*>-V5;xegX7fFV6p5K8DNi6z52LZ z_HmefWbRGm?4xg8?{Y(V`3tE>e|f)z$#)65+gB{E-#@M$v&qzM_oy%5-`$20>Ljtu z-z=!Lvl6o)%%r!~s@837%6H>V)p}YubzbzU8?Om^?;6|{?7;g69{2gv{Et^=)a9z2 zl#*eSMrh zZ2g3Ieb@^VWS@j^*N)y{GsLIdd8hYIk{_0mQ>zX!r`B6Jb>$)Elo}!7dO2n1#&zR+ z=SFMiXyjm}@>1}}VC%w_{z&^Sm6P3_rd z8=Z1FSeZ)gkkMLu7R1Td-2GNK2PZiB+WP3|)Q;q|l+Vi9BPH>2Hdrb-5Sz0TQa>$c zE5EIV-=D^jI8EVwvEYG^S1ew9=uYIavU5W-hK3w9)LPUZCk3B_M^eVjIb-IwC!lsZ%PN~jvShh;WsHd;?-LX}tN ze7n*(Z~2(>mKo8}-lrYhkFu>5B4O!etpwctFEBl=A7D{!d}2rTRUqlwsrJxoVq7zw%fsx%4d4{ z#oDqoHcdY={f1f3eP(G)KIA)?gkE^3x|uyf+Gm$X*IDt(BmHbi>E|zxeK)J&-EAut z*BlzRxyG71UVg|K+vCg&TRFSO%)*)BZ>vK8S?~0pIH$Z3=U~=&{pN+f-R%}{-Ibc~ z_srf4dOm&jUX{QZyLY}6f6lJT;^p0vGReE+owLs^|ExKCUbO3G)^om3+KPIb6TJ81 zhQ<4z$Y-D6m-sr)$W#k4O8IgRrMC7QND}?>L#V^(F-Pms34QFi&MPzT-j?yr_da=j z>t!7{qyI>3Hw6c(+=PWMK318Nz4MqJH^ZvKU+Y?&g>n?@)@N>auh=9^o&1FF+1u53 z;Oli%*!bs)7he8^3|e@0}WKOJW-ZjWjm=R(v@=Pa?;tSaU#G2@!H zl;@*Mtr_CE`@3t-^V^R5#XQNNLJ?*YI`8KyQ zUJcw=DPbne_)(WHJV?*0l27jUtZ`rXeD|y|@=YA;F3$7kum`rTEzFAsZz=n>o*#|d zY@ZjNdk8hrU*?{Fc6G`VbE3Q5{F}I+J$QQgJZOpA zqH)Hax7`tL!;IUzTBE5cyjF5|XU_Vccqw0qRCiMMuAgiw8#Eg!?JVpPw86@iMbY55 zd6k{@?9TQfR*!eeeyL@tZn_5_;`_#uE8T5BiIYxMCH@;KbN9S{p|Do}2<6+Dl)@C> zo6@@Qbfon43%ztkE4?{-UQ}PlZw*INN^w6cBYC5Wwx{pE{>84Fe7XKq@A`iK@740C z_?B|<#Jkiz6ZffATQXnlJCj~Ngm1k|8lzoa8cxAHFdCkLx8lV&l9=oF+HK#k#s}in z=OaVBo_IqgkBlk1yREnc=_k~WtDg|$oyY(j_PIxb5Jh;cVuqv^2S5@llEjfF3 zrucH(({j4;@Bd9&&Nbv!19R@&nSxN$GLowjm`aH)UWnHXoyZgn%t+oo(6&9Lr|;3I zObKa2O#O&f_B_mcJt^fwdc6A3brWayBM+8rzWvEF+V5`XoGI!aU(RinsX2F!PVH5T zqyF%ZUhNxm+3<;R^0Dcpcx8N-dtSx4@&S%@yu*<wdbgWjsmQNX zb#nO(^qhLVf=y*7qsJp={TOj*;81@;M)ciJHeK%zU%lU-h%&mVnXuDp4@lKP632-6roax(Ao zjK0~457%AN8P~QK-Maw2#~7*WT#MzJedt|=y#Bb>qU!Y{IkzSyXGGhQUw?Yf(>d#t zQi9vrAFcUa!*6mF?$i$IN%mKjAHEa0oDkl0{ga*7jT|_4*a=vvVm#oWa z-0@3J+;&P2^S`yHZNSS*_8yCuBX^xD<)7JA9IZ+iI#SYnzqw0{)nmROHmn2sddPik z8Mx=uao;etaLb7O?8%DS{f9G#jc~{R49w97@8_B>Pgmq-0s3UUIYpQioZu0n!NXKic>!zIay~#O4dXl{!ownmw{VI2NS9?zr{_pGB z@Wz-wHT=o5=(>sbY3{}fCf%EzyEV8+z!AR~qw70c*yBZ=bzXYkIZdA|X-cSa?<$?G&z9omn#>W7!Y-1}METXX$soDE-{;ZODD9mYI;L-_PP zw$H%yo`LjvCJaA!?Ecf``Im=S4^apXS~W; zzMivU27(&v)lMFBcbn|LXs#y0$Z>?r2I_=E&FW?>!gl-E;L?b><)1Gxiuc3gT=bKdf4x_oF37 z2BamGE?l@U!@qFh*l@U_*xy}t|HR_rj_AbVu?KfmuG&)6Io7{x`u&+Fp4bt6_w7|% z?)N7obVM`L2X%HVj3#9GkA5=nSN_D}e_5C?xvRZv(bbVxW+W7UIK$`5OT`=g%lt`G zIuCU0%~fq>o%@cIMFuWP*uKC1+S9utwNn#{*G=_BPFj|*b@afG?u$hBs$Tb1@~iN~ z2Cci*hFA6RME*J>VbRqix}4*|7biYN`#0_1RF=7a zdO2e&UiW|+@zSa-Ji;($2w`6<_8c4Cm6U`t$3sXL#*n<*(K`iiX3frTZ?7EqO+D{f zwPnPMceYLL8t3+0-EFO>SEswovb>dAAI7=JA@}`QWNfZ z_b1MA{%Y;8BXXp(xA0g~-x&D3KQZ#wz39Cnf0~#O++oEKefhn6KYsad6F->|4d2h% z*Vx=$Q?ONHn~rTRwk2P?<$lzXj_AULcl7LumUlRMU0MFNrGbw!hxkAGVE4ugzPC|D2KxrJj;T;y zYH};?@&BZ(w4}H=Be|q_?6mtT-`Vm&=N-|#(@Te)cw$EKdvCw9r8GGqAtQNM`gNTh zzeb%+`QVd*&kjhu=lzs~k$b#Y|CqjaPvn&`3HQ7|#&=EG9nnnx4f}nk`P5lI@3{Lk zbzwy$nyBvi+kga=>?@}w-1E27e32VYN;so+Ll>>zO}e4{jE$WK?~bNVNj*61w6wgJ zuipJ}PVncr9x>McZc<8lN;&I^#>4lY-j&l;r_N}7XcOa@{TJOw-tXi~XY=SAOrA9EeutCYVqq;Fhv%g;T0 z?a2EVp}aRPT6o97gH!HFezvT%6gfPgwD^u`zpnh?+K0B?vGLjIr6(bW2mI~r53Vg8 zfE*rhQuL~7TZ{D=}vjF|JKujOs|La<2Fd!P&Xw zi0;wjt;t894m`zWpY`C%zIWx$z3#*-hBK^@-4|~ANU!Ub^s&UF$MLq0BN=uMV6YlB!!pk~#`;IjG#uIAMgie1}lc1=UW>PUHG?L4gcHD&Fxegj-s zrA^HeVJ+VBVErY*Sz96giemlkf>lR?wOBeO*wkFNuD2e(I>NTq)s~cpcG%UK-Ulzsed1=j>$cp3HttnXF5^P-C(9pDo znYgeCpG>G@KK2{aTF1nc2dj}=0{x}UStU;IumaVouGy3yOJP;eNLYvBv$7SHwgo#o zHNmO|4qS72QymZG(&p8T%W)u1oE57Z*VNQE)-}&xyOdTf{T`H;eNH4nC%D|T2&lh< zsy8jkv0U58ql!p$Tp-URL4W+G6{RZM>oyq22<%O)VO4~7GO_}bLX}`fmYMN@6);H9zxf}-)#HT5O zEo+;aRyX4x-*~FST7#dG%XV65j&%y_SJf=nEimNtU%e}^-hs(-zaZ6b%Dmh%9YQ@i zjdFfVBY5eGx<>XdE%jKZ(2bZCtH1id#dwgm<+>8OLquPgq8Kn>(|sYd|H|%rFLNk-O>!QICY|U0M3WCERIi9 zX{o=eg7UH2QOq}XtbnW!W?8EB1uRQ-K51of=NnZPpIOsTS6{oj1>;JcCA&SOrI{|P z-{SBJw7G71eG9r6WDSNU=7qbs**xQg=cM90y+BOi#9n(XDh|scqD8$toL*~LO{6Xy zKeWE84u8TdB(Q4Ee5^Uf@YsR6hg^zInL;=$kxoKa*2D!!k24k>N2ysswPaCUWXT)ZW`mVh? z&ho`<-T69#C;8mB@3iJqd}GXWK6jM_t@)fc$87&nj{y19_HysreoO@~MR}{3|j1t1^t}kWYOhhHr@Be8bRlzL+mb`J68_+5UXn&~rY; zHx51Lb64usnose~L(lmX-$3-7Pw_28&-t8{d~M$85g?y)jm49EYP&}qf4-UMIUhfy zVL6}rj>Q<>cVqbXoOP}!K8-C=eNRaa<3$a$#a;Arov#nyt(c>b`F8kjJJ_lUV^JDN$;F)IsA;4TOc9P-Qz|UYi!SEX3m$6BB z7X$OVL6SdDfR6$Hva$a)_;PT*lg#v-416gz$=^KSd$F;nqyKo|kFc@7CEo-*#IF>4 zI`XaH7lBLu-VA;txa0?3(^C9?jpXlL;KT4d342cN&$VW2z=s(=6t4cp_+{Xde$SfW-Dy+syJGl{V))%L{N5POHro`8!dh#_)Qk?0>9Vdw}YSR9?x0oN8l4I{s1_~9PQ3hKL_V}>%t!gM@4b@ z)8Jg=K)bWlZ^5|+p72+}r(66j@O>8l8#vb*6nlktqP+Y+OQnKy{dVyWfdAg&+2Gw4 z9}PatzyJ{}=FaR`|!jz4h$Nm47hC zH`l*HodEu4IUJn73 zKM&k%KNac%@bQ*^E%*eBuL56c@pa%`7XJqLc^2OUepr&L!s>eP7c9O5+-px^^*!*D z-Qx?ZAAtYWvfm4S)aBFEL*VJI{WSF`_!XA_5%BSr|8Ky(`aey*3_jZOe-qqGZD)lkAm)vWforw?zQikssa2t_jqQjwcu}A{OjOc!%Dl^>YLzR{hO_> z2T!#8cYu5SR-Wwmi_(U-4Z;`r}u$-`F)N$1n!mRIqFy7uUq!N1OM3K ze*pK&;~e!4xYxg*qdo-Ba^pWo;Z~!S-{+_k!Jl-)J68<{f5qY>!7JVU&sAf=v7C-^ z=c)chF}0&uUq&sBBcUjEEijo@DX%vYC!d&fUt ztp`tW!=JC(!M*tAtF7Q?N^)>!_HA%)zOhj41m9%&|10=bi{A&%xs!HZQ4fQc2vrxT z$G~r}_%FfNS^RnMZ5DqSe6z*h1Rvw_#p>N&`!7}>gD)k!#r3HL;Imv_qZWgE>8nx8z}H*; ztHHhes8N@J|IGD|s14vxS$s42pDo@2KGaQ5MBNNtWbxhLuUYm#1V7vI{|UI)|3%c# z!M*w!QBQz-`Cq4=1UHp87Jmoas~^kNQSkAuf4%bI!a$M52Z2B2 z@{83l@Ff-xf_vqAvC0RZYWWv~cUk-_@bfJ`6}-XXbHTmzU#z|gzR&WHfO}^-7pqm^ zUi(<3)`36b+OJaU!GB=!&EVegu2LP~Z(07gfP3w8mHIyTvzGslz=yl#wMzXI{5IGB z64e8~#Ntnad--vR`Zc&W|GY%K0PY>{CF%|EE^GfkgL~!IqCNzl?)tZ=Bvf{ z;43WuVc=f)Yt&w-7;ANJ7 z4S1uq|Ha_vS$r+{1dD$I+#ByNSMA^>R(M;%zh>Fr48GptyTQ-4?0*REwU;Z^kHJT~ z{#UB~;HSELqdMG+V-+Rvi(LQf)o;O~Xz~@=~4sfr({jRzf{3gr)A@KDU ze+>Kvi$4Xv$>P5Szs};XfqUimUG-n!54rx|Q(W)$af`bUz-Q$=b)RLaxm!_5;h*UI z%g^zA%TR3j?{imM)oR~w7kW9Z?Q!wXaz2%2F@}eW3zqZo;)3OT&Wf*|;B&4*+Z>ZG z%lVwEpq}7!uKL?N;1Qs{-$q1cTh8ZP)%66QRr9DG&$ko3y=k9iQ}FBDcGR@Y7!x_yGwOf5T zNeA{bG}QpEcOEkQZ5(d^cTEcX+Mn0d0=UcaEyFKz?90_34Cng80bH+{k*w|W9s97l z)$sEjK25dYUI87)%mD6kJYo2C4xgz`GfkRvm;mm={EOk7!vt`C{0qb9Is9CeZ}Nv@ zN&xqluQHr-f&k9%d{z@+eo5cU{{YU{@W8$6=zn?)uZrO2p`_o)wJ{0EyU#)a@7h39Juttkh?Uubib%~G4ge{~FRH9Xk~Z-cte zaA*F3Tz|uGeY`(bL#-(dwJgK6|AVTs7k@-W3=cZtZ&crk*?*hitRJIrX7NZb`_1Z4 zz5K6H!wX;tr_+0_nq;_6@3+)>hQ9}!QF#7m$~ec|`C%F_G@RFfMyXCU{fpW^h`&*Z z+tn`(=lo?9o)3C{y!PiW_kY1~?SG3JP^A4Gp7G1DX zLBsX_KUFggXR{xPD?{sg`R`L*hO<47R1d4ez5ILB8-{b5FcM$QPMHV*_Z&9P2lEW) z{_GFj533dyRZp9B&XjU|xOWb|pgW&W^v+$=tUuLiJ~lI}aPoZpkbPx+OH)J5<$M^v zF3jg(@m#H?tWa)XEo+xnS5^0V>UL4F^KoMLQ^EXV@Hl=UH};#s&R2!{Jj+{H68jpF z_0`~&2*wGIpTl(kzn|*>epvT7W0-_jgP3INtsg6nxjbO!31iz|qTzRWo%r}UVh2nT zFj+t$KLhOe74j>_$C;}C?GI9!6tkps+TA>MzGi%UM^RMdJmT&?E-kOHgq>XN`#5!Y zg&Q3UP)E!>KF;XIJJFek&)vx8u?Q!*iLjmnmnc|z#}`Fmu@i;7MH8O8V#VA^)m7(I zPpz7TZy=c@vl1LFD}-zGl!x2Fs@g>@>lm&t1oyD4aJ~J~i~? zOLn1dBTks|V$7!o>m<6EHTgIrm>BZ{jny!816){Dz7zvjO=Qj7=GDvbLRO125SHk1 zLo0l%j?MD;;w-Xis`Zl2rykem57~Or=bsRAq3%GOf^c3I`X`6!ym0hS2-6HZPCD(E zmi`Gr7g|lz9Z~)n;g)(Gml?l4HB?>2`|YBO3VTh$fsnxUVnwQtrPHR}b6t9iCbIw^s zMe`SwFQ}@ho?AX|et2H>qVjpwbINDqeuA%d1=X%2HJ=GIw2FGhPg1lbSMR zd^Lv%{&UcnGNq`Rg987xUR2G2gPg<0lqto=ZelgN-6>NhR^sR6#3Zo*&}jtF(M~eaLC~R2GNDeYcBTbWrU2*zgoy-ijtgEo zW_anG1khy;FA2|?N=%tDS$3anqMU4wc(RFcvPmrrb+!TM;3rF30Cf5RbnvjzSqq?( z055khHyoX)!to|b0PO{!cL&hB1L&M7EcAe}DU{vOK%L438*|cmD~p{{-28g6u!RGBOE(q%*Q`f&>Lg zXJDZ;WB_x#Zo`G-S(!>j%>)Ky4jxF?8v2@iERmFz$Z?>B7^@OFMrmk;ZZje>DFf0K zfts$Kh0=lmOx)6BpqQ9TCG<(A4=bD`*(EIjipd+)B&U>%3O%61fuf@T(8Ug*_bMt9 zW4F7MiU2ROJ4#z88j{Hlunj-Aelo2(h(HPumxc3iS%I*Ib}+q!za=iNTicNq{A&n8JJzA^dK2~Y0ps1 zeo~0VQcM8GSlTQUT?>jQn4>7hV5Ji^Q50zy#TY0|GTkZ08Dg5ItfHNOd@v&ol;1} zI(0+>`1xt^vfP;-MY z$3;zN5s;2^qVxm+I&K0JSfRuuBMAH?A|Rc9Y9>M0(+k5y1Wo4*?Q{+j8DFW26Q#%| zN~HoYVM#5Rh#7;4NLnr=lL+{k19B%AwD){XV9-piNas3H>JPvKPBhKrw|H&i>Sips zQde8Os;0?&tGck5v)Xf}J8#Wb)rKeIC3s%xsjB5XxUhJ7P0NaNR){aIDow&AhMI=z zHLI)U7gck%Y)_WKCN$O5H&@Ms=lo*$!(j$Ke@$UYePjI^M1_@(nyVYQyukeOYG)oS zbMxxz6^N{QP0iAVI=%LQQLq%t+PZ4481tElb`pe+ySmr0Isw-;S0P37Csxlv+CKfj znDALk3z2pl5QdhR(3~7Ffz6*>J-@WtHMUM15EBAG$6Z~w3fGb&bqJ*%3x!l)Tz7eO zP4n^=hA@NYCT^Y~c@uP=&6z*F+Q|d#?&L~6P79p#5$EI_NpjT2)wOk1h-mIQX7ti9 zPIVSkS2mrqV0`ue0|hVF*8fizaO^=Yt!b%`RO7-4mcXfspm5`yVA@TF=a&^lRh5l6 z%bXce*s-Cm5rx-y=}Lvgov?%!OLC^pL)Jw*g6hcXRjXDvRyp;rXnb|`nib8fFRexh z%h#-^c9!@GujBsCord_Iu`evd&48*#tk#1iY(Cq1f}B|EllTAjlj|mA1uk#6Zev?v-C-!l`SO; ztEiRe%b?+9P6IC0YnT*OEyJn(vNd%L4OVznTotIICb9ynk~9J~_m|^^rF~6HXJLV) za~iS!)a9br)Od<$%!Z_)BrA5X=6wpn{@4Pj(W? zh2n7QLaJ7rT;pD|aQ)u4ie0v*aB_KV?Sj>)N_CBEzEZzt1+%vQi$Kn;0aF0I%ax1k zc!`h$sLjat*ZCTumm{o4CS_wYF{H!YZd`Ijsvu^P3}mDx8<&u{EivIHo4C z3LHmmn&jHCt9CB&Ro1MjaV~5x^`dhQ#Jw-kPp0`0@tTg4 zP;U*czDbBB3+gU&y5zMOg`84dg>E;DdA^q`y;ByiBKEd$N|fQU z_x?(KLu~{DER*wTLDIgrjdNE?Zglm@lfv=18D*A-JI;ghqPO;qpIvt7POc*=rmzB; zgKP0E-u3)mmJ{dIVNKSS6_PNkTkdU#GBP2SH!g3e3oo-e$Ues%FUR{B9Y?13*@pr5 z&39+GvF^q7&3ep{V($YMvVm39G&!9lI*C%jUZ%&}izPP&6S3vZtFiFs{56*&FIHUU z?c<~cIVHCn`=$j$e?@(Bq@hks3VBqzoY2GJ{1Uy1U0!{6;85xeQ@Sjyvh8cj-V=jV zAIts@ZtCjhy8aH%X*JFb#J-2c_KNen`D>fGR3H8Ed=iqWdBy66)y+6(WOrQZkm4e% zH|`y<)8jkQI9-rC&9mpXePd&Jnn!({TV2)^&n+Iz`y*>A3X#1!gUuNUF0=n%JZ+z_ ztiG|9C+O}a0Ox!=vKr?})yH!#&J%Gr?}`fb!iI9{^cm*?{h3dwYLN>um*E16b*;vY zNng%k6`F=t)>K%8SrKPA-fd>59D8@ZrV4%5K2{w<3$Sl8_pQ=#3^<;B`kXG#PDQMm z=2UAP`s1m19AR~{J#CD)lQ+jKZ^Tpsdo1E5Bzre!(&eOERv*TR{X6O_wOvxZBE*&t)8WK{&I>ix30Nqlu>H)KeWa)av4a$QQ0IICbsasY)uo|Tdj}e4&m#8w zUSE!7N^9#mPtxaaIKIZZnr2tkp*#KZ{57kaoC)x>MRLXExEg+VQoXtSf@>A1t*dYW ziA(9?>VNh5e}71k%WCxXj_R7oC2Q-O>)fO6r-LyCZ7vqYPkNRJ2?9gi! zSAI@EcPP;R;u!!vPyAdrbM$?U@Fep%R_{z7Z|%7OsIMjG-euciBGZ80>7>?#ToF;XRyvtQxzpU!KmS)_XuUJtRx!74l-?>6l z*Q}ofa61qfrJlWpO3;R(DA7M?%5TGcGY#{k%+d$sfbU>#(=ar3vXnm4@klk~?^ z@7z0MRyO_rsMeT{c!AvYjGdA?)2{jb-}g9wf${AB(M1exCiG9WSu_XFWnpN)44Aho(E5;c#?cv+b z?Bg*t#~8=d8j3$7&{)gZeCs_6>61ylz5A&rIHk8vGh(ZlGu`7WrGZ!Ui;=|giWrv; z2=T>qIKHM9y3v8oyK;fov_0RO6ZVp)vFHncGybS`V$qk;{y()& zEc#I3ikt8Q$M^dxw>!{T8#uH><1zRv__oG;M=kIt9S*S_PT(!AGfdI>&Rf>k@dHOJ zI$yENHafBBCBRwVzz-a;=w|?D8=YA6O5nhM>3E4n=PT-=oACpege~ix1n2!aV%jk6 z+_H@>$HIRn&41Qm_DQqR?KCqzS%1;?cG~zpYqrseC2dn_|5t5KEcy)E8=YA6d9;65 z+Y^hvi1tP&7X2dHzo+eqMPEvLqZ5n1lJ=tzXm504(I2Ay$J(A)^haoKbYjsD)BY1}Pb~VAv^P4j=&ZwEGVAI{ zeTL-J=QE8i^_lvq*a8WOgbtQ)CQvsEuM&%XHg%u2Cl>u{)RVMMEc$iSP58v3GY=(v zJ3oI*-LJzT7W>zzn}v~yML$M;fVL+VJ%B6=q-dR3^ijal2NH{ZCU8~_0)QhHy$m?p z=)|IPjmxa1+MZbS>A=}WCl-Ak?PqCwV$m1T-sr@lb3GIZpIG#ZXm7$N7JV78^mW9d zHv>z&#GEAd}7hRPJ5#hi@p(9;w2V+D{xjsA1|@!+kmr;PAvKk+MDo+ zMZcByMkf}1H?YJ@Ecye~QxlztiA8?|SlR`#=ugu=P1_TT&fz&QQ0v5^vkMCh(mJu| zteRPM`gn;&XVBS3Cl>t#+Ar1i#G(g)<#>rj=NjNy%d|bQ=;LT_bYjtqXunk36N_E~ zEa4N2&Naj(KZ!->+ToIK#G=my&Z^bn6N|n8INRvNqMt|mrP`iY^b3I{J;b6f1D5m< zi@uKfKphUT=vP@fvFJBjIt04~_6@m%6v8aEN|)|l%a6?|XgyNUN`d=NNv zyT-pIW+w{AF1X+hjkAbO*zr%AHvB z-vdjz6N~;ju=EMUqC0&88$Dbew)A@(=&b)5x>w`3@fX^w@t=t~8H7tgI2Gn|ASVMC z{8;Nn#6Qt^9`OSjF98nyRO3z5S;65r_N5#A7;wddT0cVjhctePHVdJU2i7^Zb%$SWABaWI0+#-PSoBkAztRb&Z+~KRyFUrh-t+^+ z63%#F=^uziclr|(PM`k7=#wma_7&2;h$WnhfMu*F7JVtOjP=B#FQdH)pIG#jv^P4j z=xcx_USiQVQ#b9JSakLk(yr}(<2LBhPKm|dX{Y;iK0EDnzsAquFZ77ULt$U=bB*(f z4`@7txJP5Q$IwBI*-sWcs__osipMnmylv`a>?Y?&#FFL`OD7h6E_HKWMl8BBR%Yuu zX^)lbEqh|I=d?iD4zcL$o}}#%i~cxu({_kOe~EgWw!^+o&a;Tceh~61>tYCS#GcX-sr@lv#ce2V$r$&q=Zi_dI_-9RbtVn z086~YqE7{uc!@=4y^?r|MV~`^b6mutF9Mc$iA7&Q{bXJ4#G zcT+cg8nNj20n2#@vFHx~%XtT}=nv7}q@P&yM`&+!V$lx+%W)Bl{xqQ88#jN__!QsXq> zf?sGHB<8>f$NsB7yy zu~hs<<9}A4IS#=|-$*QZHHrGEh!Bog^f|zRFKC@u^d;1TS|=90k@`rj6N~;e>O43& zV$rV!4&-Q^So9xIH`lm`MgP2g@AC|2v<{zG!ucb0(O zM-hwubzm7Ih(*5&SjGrq(KpiGq=#7a&9pZ z{@sC!T~+9}8ox*UJB>pq>kuytz}-gt9~%D{xbg*!oj&bFjTPc5cuC_R@yi;I0S>*Q z@i^+QYP-Lqn@vIV$nH{1o+`sIAYOv0|!D{Cl-Alb<>WBMduJDb3bCyp9Ge< zAF=39(S9|4;D|-%(2{L*V$oj!mUc=k`YXWFPKiZl)=T)rqQ6Od6F#x%e+8C$NGy6H z>PetL=L50mL#YqaIVv%IpJAi&vW z$2n5A(TT;L=O$9eV$V~gj@e~B+zOvq!r?U^37=SWXUsMCtow|)B|0DMF}D)?N*yDX zaCq(@b<94GaO&7w`gpVO7y2)aSKzOL83}g;Tj(7JI@d)D{;VleJDP`cCR+Xq{N} zhp3xAidgi&tB-0y0B}!XlW?3q%IN=aA7#RM-3p&wK(^6|CEot}D3+bn2V$`w1}x=8 zEP5WWjIG3?4@F!dMgo_IE%dGfoo{@F-qZLo{1yC7euYwH}?(^2A zAoh{EL@a45qHgLEvFK+~|B|i)#G*TOh7%|_yUtt-9ym+u#A1Il^|Q53Ecy?q^TX$G z#G?NgSn4XV=*%CftHh!|XX(VECn2w-4ik$Wq;BdkvFM!7NFPWn`gmaJ1BpeSK>Ia_ z5RO>%NwhaQvFKB1KTF#ai$0b1Mkf}12JKBa#GFb0}ib+o&gNdt%X@I&99N z>^giW?aet9vDiOAy+VgWEc)Zr&D@4qbk-CsG zOr2@D3|qF*iA7%z90==hh$WnBs87{8vFJBZpQd$U(Yt}A-V%$>wjlM^ZWnjcejR?` zh{gUs;B2E4i~bO>lrOR9hk>O&6N~;Nu+(Q_(VwEd37=T>XK8PAV$pvOEb$VH{#WYL zbv_V_&Z-co(mJu|0qUk65{u4pT>4)7T!wX9`d(tO4NpFy1!6K(~z z%E1~p0E@nfn3ET{+lWupcn@%a!H*HAYyCCiAsQbeHsNzVQ^A9P>#yG)4ZpxJ$He&x znWVpjy6Mk}MK7a1L+2Z@=!>YE{+U?xCDcv-Oe{LFI`kTNKKC$R;155bCqQ4I;^`BVuVJLp-&xu86A1M7fvFNPZ z60cp)N73FK7qQs0&P%*@{pY+$+L1j+N2fZ#aCOV8H$1aRrMi6#A~QaAOSSoHDK=ji%FEc$xt z!|(&Q9-HV}fdl7gdt%Yq$4a>qi+(4tlsmELtgBgU5OBnz-v^v+bYjsT0+#$I7X3Nu zracmi&blP+%dS_y}$e) z1v|-4Vu{zue?D*rXXpQ!;F6!jVqXR<`AIB#C2-c|_<47M=TMO~nr!vFO8rvyDzH`pLjq z)9?dFEP4<)+vvoihkzx|iAA48-Ly?&(PvPfuhU5^`gzpN*i9_@65y;V{J<^2CVDM! zw$X`2UjZ!XClHeINUsJ6{l;w2Dl(!WA2;9%!9Mbn)Nf==)@9N7I4-~{O})} z=&WPeMz`zRIOx*f5{vy5>I-$*5sN+xIBPb3;D|+M8_YJk-5wV}m-G;eJcMY^83Fmssp?2F{v;A2?#syMVKe zPAvLPU`Y?L=zD-AJ;b8F0xa#zbSAs26pfQ_4h=IW^!B+4^jn@;8*LVkTs8Hj(ESoo}^8z-UGgmSDa>^1a*7|h( z6>yRQmxfK!Ni6A11`bWsHbZG+p8F*hn=#bCqT3X)=scDzHV!yq(a!+RHafBBX9H)= z!w(#>=xnFiMkf~CX|v}-fa}v{jn1MKdqyeY6N~P&SrdMrHaj1NaDCdW(fhPn6HcEt zYxG8hCGoBUmO4W$dJ=Gm7boCSh)Xq|Ks-rf){TP68ZWUh_x)#FPhfe;yvQy)C(Y;S zvbNKF4eiZ+F=9EEoz%ao?TJOdoBBZfz!8i7GvKU?s47J)`aa-nqZ5mM0641}KXAmN zKL(s_bYjt;0+xQ5SoCLU&q@SGEc)}n5w`Ui=IMDc4zOIuAQs)}C)shrjlvfClE!BfpQ-T;#Aj*z z0B`{VhC4$1WsTn^F4LHoBnrwk=DA_T6pa~|)Olh_LlSVPLfZ@{uGHAk!y2=ntYlzt z0pe*I2Q54rxWL#91(vvod&R|$8SZ3kp(>3VfV0>+!4Zpn6L7ZCiA7%noV5r)aKxft z2ApklV$rVx&RU2cIAYN^0%seYSoF=n5qIUsjeFZ;oUD!n5 z37lhR)kT&_gpd&IhiXrSX~6XKT#*NpNQYy z&#SDXeu37B#h&FDxKQhMnKIw9&c_d&oriaUXB(YZ!nqeX>#O*IBNqL~z}ZG87X1-m zDQjZU57OS0HL>W2X>YQtSQfG+8eiN|N8Di0|p}h&8SajyU#7ivt zO~4W_vFOaJ(1kkxgTR%GHFo-hi!`1~n`({OJSvuGd=YSg+4pP2HCjIvSmsE?64wOk zOLW;0i+(nBbM8Pa`Yhlqb~bRtqBA|&Mkf}10dUr0{J;^5ejaeP(TPQ00xWq#EP6U{ zXsJGy;lvS*^NDLUo(f!0r}1cDc{Yhy!bt_z>;soqL%?ndWc1D z1eR-h#G+qD-Q2Sv7X3Qv=AJUK=(kZf*8u;&_O1oEis}qs6j2m4Ua4Y2Yow@1@4bZ> z-`GZPP|%1}BQhOo$O{q#5|g0f6BRKkYDB>|;)_~EOO;xDU^6s6#)74zZJjA?ec+>x zZJCxjwskuFzWvXC_rE8*a5XriOwX{{@BaJkcmDI(J-h7L{fX7SlJ?r2@Hc^o*P*=! zSold^_=M!K;DO&c2TJ7O@Y(O6`XLSGJ0sxA*Du1Xs}R z_T^Bdd}f($6HW(Ksdm8^(M|)>QsOy+_rh!r^SD}OiO5@#n? zdlB%y4ZD zvD$eaD{dA(vD!}|-`R=PJ`p%ML-@pMXS*lQ6+5xohXJR~mpU&azCdstaN6PBfpx4W z)_s$}I@S}beLr9w>xtE#A>WPZ#I&JS%WLOSaMsy7 zfK$$XiNW*8xlH);X}?@>Cvci4d!*~IWF1~a>~wf8&0Zm#rNHSc1#bdQT_yM<;7Se- zNc?}2?A3yKUQI0!oWd&Y_!;2rHDWI}_DbLs2NNXT&ZVyv%**%Gb%Li6UoV(LLYjjN z63@w5hl}w$d6CpDvDPh*$K=IgCssS_O8LZUXJ4wkLG;<*Qa1`_zfC*)2;l5ZV&`#` z?GoHX{>_4C09P&&Je! zAoies+%r&HKf6=sLE#hu>v2k~buxtZ%cKs8)y}?=dPw#qPF^k?V&x2`eV*8f)y{nN znJlr|`va$zizfN09~R*M!@>#L?ni=8!oHP{2%ZR>epGNZaMs}l>aP%clffP2JSO&w zh#wbx8F1S1=K-gFEOz$W^h&{Cj)*+86&Z%P} zRz9ycIH!(@SnU&llkZ4g#A=@eT>P%siPipn;1XviR{J^RyK53+wbzmF?8Itk9qP3T zvD#aKi?jHHM67n!bBVJPtDWbc6+7XtTo3h|BzO?*)q;zN-CTvi z#Ak>dFwyU7x%LQjt}^xo#(t&PcO!qk;DCRPvCkA7|E++{khTbt^L7klFGR?Hl zorTXUgny0DD$$>Ml%c!*hf|CX)dbXcGS!TmFuHs*{HDeVHmkSijF=a z6b+)5^;PfaP%jr(3o%L%Xc-?w@2ExSjkeF&3OdOhd0G%E;Dp%? zXEfF}oH%FN*oh`$S3wd-BX}=Qk}iB#5L7f234$U7-}JWIBhQv)H78e{e&PvLH8m4( zw4GVs(%Lw&qpjdVBjjBxt`r*S%k~&*a`g}tAwPl=BcU-=XFI}b&*kXQSlH;}4llYm z4)u-Leql{T)`|Z$^ge~FjcCp)1oE5H+KM<1d4=g+yrzQO`(k3CM)=)pxGs|uL+;>3 zK&kT)gA8F$S(b=^Q3V!A#w>UI=0rc+aojui!mmOO4^ASCgcZa(oY>U#S$m8OXf|#Y zDkaysgMh|S5wM~=vf_K>g8ksQ(N{|`^y77>Us7Z5K9Pi>oBZ~oio)YXiy z;Vp9R|9B@Io~dtb#n9fuM*)0JFgi2Zjr7hIMo8^-Ysfnp*%74pV0FDo+xnm8P<5LT z?4+Q*c8K(qk2pf+B#D}qyQYk|U9dro&7Q8PpMOsiq%Ow)Z8Hka9glbLOy~2)8qTzb zkB55IUBn%Ny&s9{9|i1^-%Rnr_WZ2!_jAn~k)OF8DbPc2kNk|{9o*_}e)kJ+X`-CU zwRS!&(vz)ln`bw7;9jAvc5d+4FO#XNIjym6dSk=MGh6CvXW}_veaoy_h=`rY%x>vu z%$z*otaN)vZT-18(wp1s&(G9$bhI_s&FN?abvnb)>jTaL)-^*DiG2*O9GK5H*JI%$ zem;}s;`1tCQyw4f$MLERkB{8rc#{o}kJRIM4Ti^8N8)&_1NCq8R(O2=uRMNsGER^4 z0hGtj3&!zoHN2Cy!dqr|6Sl%z0Un>hvpx8@Jucr>Mvsr;<9OYM$LXeVymf}h$MA8y zHw=%D=;L^s43CfF<9M45kB{o(c%Oo&^}@&UalHQMOWJOHWFN;XGQ3S&>3>5Fk5dcd z^hOvSr^ChZI5$uI<8-k&9_L9bkJHfNcvXh?9&j9w^V?OA)2iZl4Ti^QR&l&m!yCI5 z9;Z=iyK(ACoZft+$LS|=ye`ATRN+`2r^IQ#oO%+c_n_f%>Pj4s)3mhyIL#xDx7zSH zbtaD2WAf#+@i^W(qlc-#vAj2o9;e8}>Ah+6IQ1ru$8)ll7t?)Xd7qekIi)5}FM(~U z$EiATyg`PCsnM~#A=swv%PBZQ+t$Gg7XPn59Wtsg>UEaZS&9HjxbF;Bslj=2rWc6N#UKdEzI|7U9t@ZRaLZC{;uvWb_ zp5Ele@~$TJjxu`ubX4G<(-?sY=a{5P^-ci@{Bs)yEy3JZ*r<057WI!~gw^AQ=Trnd zg`8e*^)}v)x#XB2O1tX$%5wD6UBtf=jNU7r-YRs;hqcm- ze=m4?U5{ekveU~Ny#rAQTiz*qu=N~_pqyFuM@N9VpbwdPwi0%75qu1!^U4oO^ei3?8 zeZ5~Kf_L($cc#&M+S6NfKq7%tM=ojot@891_8=w)@}=HcShT!*?3!QR5ykQzrwXdx z0Pt*idtQ)tRj9{T&Q-76)0+T2{L3ZP`?jYy_XAI_31WBV)WY-2WKVA# z^j>%6N!L8Z{!=rtiKj4THgPv zp6s63T#A^T4s)e?|581-Z5{L~Q4Z>zheh=&_Q6Rk-lh@?LE8R(pEG zQP_qEy(c}rP0*X-+V@hU_jgaP6MEGVdVlfsD*h1mzsrr@0eiaobLH3wJv|pvR?B;~ z$9o&RsQZdD!0V6wD%_5%kuQeepdVa`HMhaF#9~ixGxVmwu1WLl^7J-9uN$QGSmt9< zy&g}m>R=q_*se+Se(vdY{V^O@7l5pK|MB!@LN97u{n*pn1U>Bsokp(=l@;_;=g5K> z|I*;m2d%%se+vD(&geCHddp+{tM~Mppr`&VGIXd@??v!n%B5UAd->ju ze6=6kWb*x+r}sMa+$*4grs{p@>8*rbhdVxQHhR@X`So0PsC=JH9aO#3!L#)|{H^f( zcZ<;*zfZp2WSk6!upwPiy-M(`-r%><|D1n|!PS0MftOsl`vA9N>tRwazTR=*S-tXi z!t0mYj9&G=`FfquD^)S9)xXohvwD-Er{nn@M(+bp?_uZ-jnI3?)4LUV+OO_1dT-$3 z%$Bz&ro69#XZ`CjdiNN;-S^Aa+Zdy_3wTybeRjoz<3y)DpN8d2U?JiQ^C1jg+`lDyi-9>Hf|?x1k$)Z(>L4J%EM2^E^4y>6HO9P5Ty(4_rHH zVqRRn<9MpSr1kfR$6EnjRQ)~V`8NjsY5n29FmnE_^Ym6hFRK1t^7N`rc~=>|0T>+V&(5yh zx}i5NR|?6OKgTN1Z6nW?L-9oLYBm%-3GgavR(%Q3~{jR7yJ z9A|@P>u;0Ew;P&Tf46vg<6_Ejqo=pq2jTIt*62Os=}m?nOu3}xc+cZ?#FXPLFW;2O z_XU%05`!5oC362SKM#5=qb6c5dxFPx1s0}>&}04ayzvqiZsYH7fX6<&GZv=#(Btu@ zi9Duq@K`2}kxb+rD=_%WZCs9bJl*s>cs6OhoCY59Y}IY#Rp}3`mB+O^B!jJkj)V^w n<6gxteZJ4*Y9JOZ1Bqj5aDQp?Rz04ZEN=?xWg2|Zq`dzDE_cry literal 0 HcmV?d00001 diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/alarmclocktimerconfig/src/AlarmClockTimerConfig.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/alarmclocktimerconfig/src/AlarmClockTimerConfig.cpp index 22d65b3b7..fba8330b8 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/alarmclocktimerconfig/src/AlarmClockTimerConfig.cpp +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/alarmclocktimerconfig/src/AlarmClockTimerConfig.cpp @@ -36,7 +36,7 @@ #include "record/include/RecordingPlayerView.h" #include "custom_utils.h" #include "alarm/include/AlarmClockModel.h" -#ifdef CYWEE_SPORT +#ifdef SUPPORT_CYWEE_SERVICE #include "cywee_service.h" #endif @@ -118,9 +118,9 @@ extern "C" sedentary_switch = get_sedentary_switch_from_config_model(); sedentary_time = get_sedentary_time_from_config_model(); sedentary_interval = get_sedentary_interval_from_config_model(); - #ifdef CYWEE_SPORT +#ifdef SUPPORT_CYWEE_SERVICE do_cywee_service_check_msg(CYWEE_SERVICE_CMD_SET_SEDENTARY_INTERVAL, &sedentary_interval); // 设置久坐提醒间隔 - #endif +#endif // sedentary_start_hour = (sedentary_time & 0XFF000000) >> 24; // sedentary_start_min = (sedentary_time & 0X00FF0000) >> 16; @@ -371,9 +371,9 @@ extern "C" if (curTime.tm_sec % 60 == 0) { - #ifdef CYWEE_SPORT +#ifdef SUPPORT_CYWEE_SERVICE do_cywee_service_check_msg(CYWEE_SERVICE_CMD_CHECK_ACC, NULL); // 一分钟检查一次gsensor是否停止 - #endif +#endif } if (curTime.tm_min % 60 == 0 && curTime.tm_sec == 0) @@ -544,12 +544,12 @@ extern "C" // 设置状态为小睡 uapi_dev_runtime_set_nap_status(0); // 清零小睡状态 uapi_dev_runtime_set_absolute_static_status(0); // 清零绝对静止状态 - #ifdef SUPPORT_PPG_SERVICE - set_keep_in_wear_det_mode(1); // 开启小睡佩戴监测 - #endif - #ifdef CYWEE_SPORT +#ifdef SUPPORT_PPG_SERVICE + set_keep_in_wear_det_mode(1); // 开启小睡佩戴监测 +#endif +#ifdef SUPPORT_CYWEE_SERVICE do_cywee_service_check_msg(CYWEE_SERVICE_CMD_NAP_SEDENTARY_MODE, NULL); // 算法底层切换小睡监测模式 - #endif +#endif time_sync_flag = 0; } } @@ -563,12 +563,12 @@ extern "C" // if(uapi_dev_runtime_get_nap_monitoring_status() == 1) // uapi_clean_sleep_flag(); // 清除睡眠标志文件 // OHOS::create_sleep_folder(); // 创建睡眠文件夹 - #ifdef SUPPORT_PPG_SERVICE +#ifdef SUPPORT_PPG_SERVICE set_keep_in_wear_det_mode(0); - #endif - #ifdef CYWEE_SPORT +#endif +#ifdef SUPPORT_CYWEE_SERVICE do_cywee_service_check_msg(CYWEE_SERVICE_CMD_GET_SLEEP_DATA, &cmd); // 强制获取小睡数据,结束小睡 - #endif +#endif // 睡眠弹窗 WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "要睡觉啦!"); @@ -585,9 +585,9 @@ extern "C" WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "要睡觉啦!!!! 结束"); } - #ifdef CYWEE_SPORT +#ifdef SUPPORT_CYWEE_SERVICE do_cywee_service_check_msg(CYWEE_SERVICE_CMD_SLEEPING_MODE, NULL); // 算法底层切换睡眠监测模式 - #endif +#endif time_sync_flag = 0; } } diff --git a/code/sdk/bootloader/flashboot/brandy/nandflash/nandflash_config.c b/code/sdk/bootloader/flashboot/brandy/nandflash/nandflash_config.c index 380ec0ffa..ecdf1fcee 100644 --- a/code/sdk/bootloader/flashboot/brandy/nandflash/nandflash_config.c +++ b/code/sdk/bootloader/flashboot/brandy/nandflash/nandflash_config.c @@ -15,6 +15,7 @@ #include "hal_nandflash.h" #include "nandflash_ds35x1g.h" #include "nandflash_w25n01g.h" +#include "nandflash_f35uqa001g.h" #include "nandflash_inner.h" #include "nandflash.h" #include "hal_nandflash.h" diff --git a/code/sdk/build/config/target_config/brandy/config.py b/code/sdk/build/config/target_config/brandy/config.py index a0e2ce53b..ca626bc35 100644 --- a/code/sdk/build/config/target_config/brandy/config.py +++ b/code/sdk/build/config/target_config/brandy/config.py @@ -923,7 +923,128 @@ target = { 'CFG_FLASH_SIZE=8', 'NANDFLASH_F35UQA' ] - } + }, + ################# N9 ############################ + 'brandy-native-js-n9': { + 'base_target_name': 'brandy-native-js', + 'defines': [ + 'BOARD_N9', + 'FT_SINGLE_UART', + 'CONFIG_EFUSE_READ_TO_RAM', + 'CUSTOM_UTILS', + # 'CUSTOM_HID_SERVICE', + # 'WEARABLE_LOG_DEBUG', + 'SUPPORT_RC_CALIBRATION', + 'VIB_USE_PWM', + 'CONFIG_PWM_SUPPORT', + # 'ACC_LIS2DOC', + 'ENABLE_CUSTOM_I2C', + #'ENABLE_VIBRATOR', + # 'ENABLE_SLIP', + 'ENCODER_SUPPORT', + # 'SUPPORT_SPO2_NOTIFICATION', + # 'SUPPORT_SPO2_NOTIFICATION_TEST', + 'SUPPORT_DEVICE_PAIRING_NOTIFICATION', + # 'ENABLE_FONT_VECTOR_GLOBAL', + # 'ENABLE_SHAPING', + 'SUPPORT_CHARGER_PLUG_DETECTION_NOTIFICATION', + # 'SUPPORT_AT_CUSTOMUTILS', + 'SUPPORT_BLE_SERVICE', + 'SUPPORT_PPG_SERVICE', + 'SUPPORT_CYWEE_SERVICE', + 'SUPPORT_BATTERY_SERVICE', + 'FD230', + # 'SUPPORT_AUTO_OTA_SERVER', + # 'CONFIG_DFX_SUPPORT_DIAG_UP_MACHINE=1', + #"MEM_CHECK", + #'ENABLE_WEBSOCKET', + 'CYWEE_MAC_ACTIVE', + 'SUPPORT_CAT1_SERVICE', + #'SUPPORT_TCPIP', + #'SUPPORT_HID_SERVICE', + 'SUPPORT_BAIDU_MAP', + 'CFG_FLASH_SIZE=16', + 'SINGLE_USER_PARTITION', + 'TPTYPE_CST86XX', + 'ROTARYENCODER_MIXO', + 'NANDFLASH_F35UQA', + 'BLE_INSTRUCT', + 'PPG_PAH8009', + # 'AILPAY_SUPPORT', + # 'FACTORYTEST_SERVICE', + # 'MEMORY_CORRUPTION', + + ], + #添加自定义应用 + 'ram_component': [ + 'audio_at_service', + 'media_at_service', + 'bt_manager_at_service', + "ppg_sensor_pah8009", + # "ppgBleService", + "mag_sensor_mmc5603", + "vibrator", + "vibrator_service", + "-:lwip", + "cat1Service", + "cat1Test", + "audio_manager", + "CustomUIcomponentTool", + "nativeabilityfwk", + "custom_utils", + "custom_utilscpp", + "custom_config", + "rotary_encoder", + "nativelauncher", + "ppg_service", + "cywee_service", + "batterry_service", + "bleservice", + "blemoder", + "transspecard", + "factorytest_service", + # "hid_service", + "producttest", + "ppg_hal", + "mag_hal", + "mag_service", + "cywee_dml", + #"cyweeBleService", + ], + 'image_analysis': False, + 'fs_image_path':'fd230', + # 'fs_image_path':'evb', + 'fs_image': True + }, + 'brandy-native-js-n9-r': { + 'base_target_name': 'brandy-native-js-r', + #自定义配置项,选择硬件及功能参数 + 'defines': [ + 'BOARD_N9', + 'FT_SINGLE_UART', + 'CFG_FLASH_SIZE=16', + 'FD230', + 'SINGLE_USER_PARTITION', + 'TPTYPE_CST86XX', + 'NANDFLASH_F35UQA' + ], + 'ram_component': ["at_cmd"] + }, + 'brandy-native-js-n9-ssb': { + 'base_target_name': 'brandy-ssb', + #自定义配置项,选择硬件及功能参数 + 'defines': [ + 'CFG_FLASH_SIZE=16', + 'FD230', + 'BOARD_N9', + 'FT_SINGLE_UART', + 'ENABLE_ECC', + 'CFG_DRIVERS_NANDFLASH', + 'SINGLE_USER_PARTITION', + 'GPIO_POWERON_FLASH', + 'NANDFLASH_F35UQA' + ] + }, } target_group = { @@ -940,6 +1061,7 @@ target_group = { 'pack_brandy_native_js_fd230': ['brandy-native-js-fd230-ssb', 'brandy-native-js-fd230-r', 'brandy-native-js-fd230'], 'pack_brandy_native_js_u8': ['brandy-native-js-u8-ssb', 'brandy-native-js-u8-r', 'brandy-native-js-u8'], 'pack_brandy_native_js_w9': ['brandy-native-js-w9-ssb', 'brandy-native-js-w9-r', 'brandy-native-js-w9'], + 'pack_brandy_native_js_n9': ['brandy-native-js-n9-ssb', 'brandy-native-js-n9-r', 'brandy-native-js-n9'], 'pack_brandy_native_js_lt22': ['brandy-native-js-lt22-ssb', 'brandy-native-js-lt22-r', 'brandy-native-js-lt22'], 'pack_brandy_native_js_xts': ['brandy-native-js-xts-ssb', 'brandy-native-js-xts-r', 'brandy-native-js-xts'], diff --git a/code/sdk/drivers/chips/brandy/porting/pinctrl/pinctrl_porting_brandy.c b/code/sdk/drivers/chips/brandy/porting/pinctrl/pinctrl_porting_brandy.c index 970be6daa..815e04f6d 100644 --- a/code/sdk/drivers/chips/brandy/porting/pinctrl/pinctrl_porting_brandy.c +++ b/code/sdk/drivers/chips/brandy/porting/pinctrl/pinctrl_porting_brandy.c @@ -16,7 +16,7 @@ #include "board_fd230.h" #elif defined(BOARD_U8) #include "board_u8.h" -#elif defined(BOARD_W9) +#elif defined(BOARD_W9) || defined(BOARD_N9) #include "board_w9.h" #elif defined(BOARD_L22) #include "board_lt22.h" diff --git a/code/sdk/drivers/drivers/driver/touch/cst86xx_touch/cst86xx_touch1.c b/code/sdk/drivers/drivers/driver/touch/cst86xx_touch/cst86xx_touch1.c index b5e28b1fd..ec3a96128 100644 --- a/code/sdk/drivers/drivers/driver/touch/cst86xx_touch/cst86xx_touch1.c +++ b/code/sdk/drivers/drivers/driver/touch/cst86xx_touch/cst86xx_touch1.c @@ -407,7 +407,7 @@ void cst86xx_get_chip_id(uint16_t *chip_id) ext_errno ret = cst86xx_tp_i2c_data_read(CST86XX_HW_ID, chip_id, 1); if (ret != EXT_ERR_SUCCESS) { tp_err("configuration error (read chip id) 0x%x", ret); - return EXT_ERR_FAILURE; + return; } } diff --git a/code/sdk/drivers/drivers/driver/touch/touch_screen_drv.c b/code/sdk/drivers/drivers/driver/touch/touch_screen_drv.c index c344ceae2..b0a5e6a17 100644 --- a/code/sdk/drivers/drivers/driver/touch/touch_screen_drv.c +++ b/code/sdk/drivers/drivers/driver/touch/touch_screen_drv.c @@ -510,11 +510,11 @@ void touch_screen_restart(void) uapi_gpio_enable_interrupt(TOUCH_INT_GPIO); // open tp_int gpio interrupt } -void touch_getid(uint16_t *id) +void touch_get_chip_id(uint16_t *id) { -#ifdef TPTYPE_FT6X46 - ft6x46_get_chip_id(id); -#elif defined TPTYPE_CST86XX +#ifdef TPTYPE_CST86XX cst86xx_get_chip_id(id); +#elif defined TPTYPE_FT6X46 + ft6x46_get_chip_id(id); #endif } \ No newline at end of file diff --git a/code/sdk/drivers/drivers/driver/touch/touch_screen_drv.h b/code/sdk/drivers/drivers/driver/touch/touch_screen_drv.h index b6c116da3..3624e1152 100644 --- a/code/sdk/drivers/drivers/driver/touch/touch_screen_drv.h +++ b/code/sdk/drivers/drivers/driver/touch/touch_screen_drv.h @@ -1,3 +1,11 @@ +/* + * @Author: penglei 1624952103@qq.com + * @Date: 2024-12-07 15:32:08 + * @LastEditors: penglei 1624952103@qq.com + * @LastEditTime: 2025-07-28 16:18:51 + * @FilePath: /FD230/code/sdk/drivers/peripheral/touch/touch_screen_drv.h + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ /* * Copyright (c) @CompanyNameMagicTag 2021-2022. All rights reserved. * Description: header of touch screen driver. @@ -26,8 +34,17 @@ struct ts_ops { uint32_t (*priv_operator)(struct ts_driver_data *udd); }; +#ifdef TPTYPE_FT6X46 +#define TP_CHIP_ID 0x6456 +#elif defined TPTYPE_CST86XX +#define TP_CHIP_ID 0xb7 +#else +#define TP_CHIP_ID 0 +#endif + ext_errno touch_screen_module_init(void); ext_errno touch_screen_module_deinit(void); ext_errno touch_info_process(void); +void touch_get_chip_id(uint16_t *id); #endif \ No newline at end of file diff --git a/code/sdk/zhihui/drivers/cywee/dml/cywee_data.h b/code/sdk/zhihui/drivers/cywee/dml/cywee_data.h index 9449b920b..375eb81c4 100644 --- a/code/sdk/zhihui/drivers/cywee/dml/cywee_data.h +++ b/code/sdk/zhihui/drivers/cywee/dml/cywee_data.h @@ -1,3 +1,11 @@ +/* + * @Author: penglei 1624952103@qq.com + * @Date: 2025-05-20 11:51:23 + * @LastEditors: penglei 1624952103@qq.com + * @LastEditTime: 2025-07-23 14:02:35 + * @FilePath: /FD230/code/sdk/zhihui/drivers/cywee/dml/cywee_data.h + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ /** * Copyright (c) @CompanyNameMagicTag 2022-2022. All rights reserved. \n * @@ -75,6 +83,7 @@ void cywee_calories_history_save(uint32_t time); void cywee_stand_history_save(uint32_t time); void cywee_restoreData(void); void cywee_save_data(void); +int32_t cywee_get_now_hour_data(void*value, uint8_t type); #ifdef __cplusplus #if __cplusplus diff --git a/code/sdk/zhihui/drivers/cywee/dml/cywee_dml.c b/code/sdk/zhihui/drivers/cywee/dml/cywee_dml.c index 3943fed24..dd1a780d9 100644 --- a/code/sdk/zhihui/drivers/cywee/dml/cywee_dml.c +++ b/code/sdk/zhihui/drivers/cywee/dml/cywee_dml.c @@ -77,7 +77,7 @@ static char cywee_version[20] = {0}; static SLEEP_STAT_T sleep_stat[SLEEP_STATUS_LENGTH] = {0}; static inact_ext_result_t sleep_time = {0}; -// static NAP_T nap_data = {0}; +// static SLEEP_T nap_data = {0}; static int stat_num = 0; static int current_year = 0; static uint32_t fall_asleep_timestamp = 0; @@ -274,6 +274,58 @@ static void clean_sleep_data(void) wake_up_flag = 0; } + +void cywee_read_sleep_data(void) +{ + char day[12] = {0}; + uapi_get_YYMMDD_Time(day, '\0'); + + char file_path[64] = {0}; + sprintf_s(file_path, 64, SLEEP_TIME_PATH, day); + + FILE *fp = fopen(file_path, "rb"); + if (fp == NULL) + { + CWM_OS_dbgPrintf("read_sleep_data fopen fail %s \n",file_path); + return false; + } + + // 读取睡眠类型 + uint8_t sleep_type; + fread(&sleep_type, 1, 1, fp); + + if (sleep_type == 0) + { + fclose(fp); + return false; + } + + // 入睡时间 + uint32_t fall_asleep_timestamp; + fread(&fall_asleep_timestamp, 1, 4, fp); + + // 起床时间 + uint32_t wake_up_timestamp; + fread(&wake_up_timestamp, 1, 4, fp); + + // 睡眠总时间 + uint8_t total_time_hour, total_time_minute; + fread(&total_time_hour, 1, 1, fp); + fread(&total_time_minute, 1, 1, fp); + uint16_t total_time = total_time_hour * 60 + total_time_minute; + + // 累加睡眠数据 + sleep_data.fall_asleep_timestamp = fall_asleep_timestamp; + sleep_data.wake_up_timestamp = wake_up_timestamp; + sleep_data.total_time = total_time; + + sleep_update_timestamp = wake_up_timestamp; + + fclose(fp); + + return true; +} + static void cywee_set_sleep_time_data(inact_ext_result_t *sleep_data) { memset(&sleep_time, 0, sizeof(inact_ext_result_t)); @@ -358,11 +410,11 @@ static void cywee_save_sleep_time_data(void) ephemeral_flag = 0; } - // CWM_OS_dbgPrintf("wake_up_timestamp : %d ,fall_asleep_timestamp : %d \n",wake_up_timestamp,fall_asleep_timestamp); - // CWM_OS_dbgPrintf("total_time[%d], total_deep_sleep_time[%d], total_mild_sleep_time[%d], total_rem_sleep_time[%d], total_wake_time[%d] \n", - // total_time,total_deep_sleep_time,total_mild_sleep_time,total_rem_sleep_time,total_wake_time); + CWM_OS_dbgPrintf("wake_up_timestamp : %d ,fall_asleep_timestamp : %d \n",wake_up_timestamp,fall_asleep_timestamp); + CWM_OS_dbgPrintf("total_time[%d], total_deep_sleep_time[%d], total_mild_sleep_time[%d], total_rem_sleep_time[%d], total_wake_time[%d] \n", + total_time,total_deep_sleep_time,total_mild_sleep_time,total_rem_sleep_time,total_wake_time); - update_sleep_data(fall_asleep_timestamp,wake_up_timestamp,total_time); + // update_sleep_data(fall_asleep_timestamp,wake_up_timestamp,total_time); } @@ -498,7 +550,7 @@ static void cywee_save_nap_time_data(void) uint8_t total_time_minute = (total_time % 60); fwrite(&total_time_minute, 1, 1, fp); - // CWM_OS_dbgPrintf("save_nap_sleep_data succ \n"); + CWM_OS_dbgPrintf("save_nap_sleep_data succ \n"); fclose(fp); @@ -892,7 +944,7 @@ void cywee_oncharging_update(int oncharging_status) void cywee_wearstatus_update(int wearstatus) { -#if 1 +#if 0 uapi_dev_runtime_set_wear_status(wearstatus); memset(&csd, 0, sizeof(CUSTOM_OFFBODY_DETECT)); csd.sensorType = CUSTOM_OFFBODY_DETECT; @@ -976,7 +1028,7 @@ void cywee_inactivity_mode_change(int mode) //久坐、有效站立和小睡 case INACTIVITY_MODE_SEDENTARY_AND_NAP: - // CWM_OS_dbgPrintf("INACTIVITY_MODE_SEDENTARY_AND_NAP\r\n"); + CWM_OS_dbgPrintf("INACTIVITY_MODE_SEDENTARY_AND_NAP\r\n"); memset(&scl, 0, sizeof(scl)); scl.iData[0] = 1; scl.iData[1] = 3; @@ -1193,7 +1245,7 @@ void CWM_AP_SensorListen(pSensorEVT_t sensorEVT) { if((int)sensorEVT->fData[1] == CUSTOM_OFFBODY_DETECT) { CWM_OS_dbgPrintf("CUSTOM_OFFBODY_DETECT !!! \r\n"); -#if 1 +#if 0 if((int)sensorEVT->fData[2] == 1) { #ifdef SUPPORT_PPG_SERVICE @@ -1358,6 +1410,7 @@ void CWM_AP_SensorListen(pSensorEVT_t sensorEVT) { }else if((int)sensorEVT->fData[0] == 22){ + CWM_OS_dbgPrintf("sensorEVT->fData[0] == 22\n"); memset(&c_inact_result_t,0,sizeof(inact_result_t)); c_inact_result_t.output_number = (int)sensorEVT->fData[0]; @@ -1380,6 +1433,8 @@ void CWM_AP_SensorListen(pSensorEVT_t sensorEVT) { uapi_get_timestampe_ss_extend(&wake_up_timestamp,current_year,c_inact_result_t.month,c_inact_result_t.day,c_inact_result_t.hour,c_inact_result_t.minute,0); nap_update_timestamp = wake_up_timestamp; } + CWM_OS_dbgPrintf("fall_asleep_timestamp : %d\n,fall_asleep_timestampn"); + CWM_OS_dbgPrintf("nap_update_timestamp : %d\n,nap_update_timestamp"); // cywee_func(CYWEE_MSG_TYPE_INACTIVITY_UPDATE,&c_inact_result_t,sizeof(inact_result_t)); }else if((int)sensorEVT->fData[0] == 32){ diff --git a/code/sdk/zhihui/drivers/cywee/dml/cywee_hal.h b/code/sdk/zhihui/drivers/cywee/dml/cywee_hal.h index 454b6620e..2072b2aa3 100644 --- a/code/sdk/zhihui/drivers/cywee/dml/cywee_hal.h +++ b/code/sdk/zhihui/drivers/cywee/dml/cywee_hal.h @@ -143,13 +143,6 @@ typedef struct } SLEEP_STAT_T; -typedef struct -{ - uint32_t fall_asleep_timestamp; // 入睡 - uint32_t wake_up_timestamp; // 出睡 - uint16_t total_time; // 总时长 -} NAP_T; - typedef struct { uint32_t fall_asleep_timestamp; // 入睡 diff --git a/code/sdk/zhihui/drivers/cywee/service/cywee_service.c b/code/sdk/zhihui/drivers/cywee/service/cywee_service.c index 3d0389997..227684ab8 100644 --- a/code/sdk/zhihui/drivers/cywee/service/cywee_service.c +++ b/code/sdk/zhihui/drivers/cywee/service/cywee_service.c @@ -326,18 +326,18 @@ static void cywee_service_check_task(void const *arg) break; case CYWEE_SERVICE_CMD_SEDENTARY_MODE: - // cywee_inactivity_mode_change(INACTIVITY_MODE_SEDENTARY); + cywee_inactivity_mode_change(INACTIVITY_MODE_SEDENTARY); break; case CYWEE_SERVICE_CMD_NAP_MODE: - // cywee_inactivity_mode_change(INACTIVITY_MODE_NAP); + cywee_inactivity_mode_change(INACTIVITY_MODE_NAP); case CYWEE_SERVICE_CMD_NAP_SEDENTARY_MODE: - // cywee_inactivity_mode_change(INACTIVITY_MODE_SEDENTARY_AND_NAP); + cywee_inactivity_mode_change(INACTIVITY_MODE_SEDENTARY_AND_NAP); break; case CYWEE_SERVICE_CMD_SLEEPING_MODE: - // cywee_inactivity_mode_change(INACTIVITY_MODE_SLEEPING); + cywee_inactivity_mode_change(INACTIVITY_MODE_SLEEPING); break; case CYWEE_SERVICE_CMD_OPEN_HAND_UPDOWN: @@ -369,7 +369,7 @@ static void cywee_service_check_task(void const *arg) break; case CYWEE_SERVICE_CMD_SAVE_DATA: - // cywee_save_data(); + cywee_save_data(); break; case CYWEE_SERVICE_CMD_SET_SEDENTARY_INTERVAL: diff --git a/code/sdk/zhihui/drivers/ppg/CMakeLists.txt b/code/sdk/zhihui/drivers/ppg/CMakeLists.txt index 271ddd2e8..e90ddc98c 100644 --- a/code/sdk/zhihui/drivers/ppg/CMakeLists.txt +++ b/code/sdk/zhihui/drivers/ppg/CMakeLists.txt @@ -1,7 +1,6 @@ add_subdirectory_if_exist(service) add_subdirectory_if_exist(hx3695) add_subdirectory_if_exist(ppgBleService) -add_subdirectory_if_exist(vc9202) -add_subdirectory_if_exist(vc921x) +add_subdirectory_if_exist(pah8009) add_subdirectory_if_exist(gh3x2x) add_subdirectory_if_exist(hal) \ No newline at end of file diff --git a/code/sdk/zhihui/drivers/ppg/hal/ppg_hal.c b/code/sdk/zhihui/drivers/ppg/hal/ppg_hal.c index f6d9d9868..ed35c71a2 100644 --- a/code/sdk/zhihui/drivers/ppg/hal/ppg_hal.c +++ b/code/sdk/zhihui/drivers/ppg/hal/ppg_hal.c @@ -2,7 +2,7 @@ * @Author: penglei 1624952103@qq.com * @Date: 2024-03-13 15:08:38 * @LastEditors: penglei 1624952103@qq.com - * @LastEditTime: 2025-07-15 12:13:56 + * @LastEditTime: 2025-07-28 17:37:22 * @FilePath: /FD230/code/sdk/drivers/peripheral/ppg/hx3695/hx3695_hal.c * @Description: * @@ -35,6 +35,7 @@ #ifdef PPG_GH3X2X #include "gh3x2x_afe_drv.h" +// #include "gh_demo.h" #endif @@ -48,6 +49,7 @@ // S_AGPIO_R0 PRG_LED_POWER ON 心率等电源控制脚 #define GPIO_PIN_PRG_LED_ON S_AGPIO_R0 + void ppg_power_on(void) { // printf("ppg_power_on\n"); @@ -79,8 +81,11 @@ uint8_t ppg_get_hrs(void) uint8_t hrs = 0; #ifdef PPG_HX3695 hrs = hx3695_get_hrs(); - // printf("ppg_get_hrs : %d\n",hrs); +#elif defined PPG_PAH8009 + hrs = pah8009_get_hrs(); #endif + + printf("ppg_get_hrs : %d\n",hrs); return hrs; } @@ -89,6 +94,8 @@ uint8_t ppg_get_spo2(void) uint8_t spo2 = 0; #ifdef PPG_HX3695 spo2 = hx3695_get_spo2(); +#elif defined PPG_PAH8009 + spo2 = pah8009_get_spo2(); #endif return spo2; } @@ -98,14 +105,16 @@ uint8_t ppg_get_wear_status(void) uint8_t wear_status = 0; #ifdef PPG_HX3695 wear_status = hx3695_get_wear_status(); +#elif defined PPG_PAH8009 + wear_status = pah8009_get_wear_status(); #endif return wear_status; } uint16_t ppg_get_chip_id(void) { - ppg_power_on(); uint16_t chip_id = 0; + ppg_power_on(); #ifdef PPG_HX3695 chip_id = hx3695_chip_check(); #elif defined PPG_PAH8009 @@ -137,9 +146,6 @@ void ppg_int_handler(void) { #ifdef PPG_PAH8009 pah8009_int_handler(); -#elif defined PPG_PAH8009 - hal_gh3x2x_afe_int_handler_call_back(); - GH3X2X_AFE_ChipPro(); #endif } @@ -153,16 +159,18 @@ void ppg_send_cmd_to_driver(char* mode, uint8_t enable) #elif defined PPG_PAH8009 pah8009_control(mode,enable); #elif defined PPG_GH3X2X - gh3x2x_control(mode,enable); + // gh3x2x_control(mode,enable); #endif if(!enable) ppg_power_off(); + + } void ppg_get_leaklight_data(uint32_t *ch0,uint32_t *ch1,uint32_t *ch2) { #ifdef PPG_HX3695 - hx3695_get_factory_data(ch0,ch1,ch2); + hx3695_get_leaklight_data(ch0,ch1,ch2); #elif defined PPG_VC9202 vc9202_get_leaklight_data(ch0,ch1,ch2); #elif defined PPG_PAH8009 @@ -170,13 +178,21 @@ void ppg_get_leaklight_data(uint32_t *ch0,uint32_t *ch1,uint32_t *ch2) #endif } -uint32_t ppg_get_factory_data(void) +int32_t ppg_get_factory_data(void) { - uint32_t data = 0; + int32_t data = 0; #ifdef PPG_PAH8009 data = pah8009_get_factory_data(); #elif defined PPG_HX3695 - + data = hx3695_get_factory_data(); #endif return data; } + +void ppg_check_int(void) +{ +#ifdef PPG_HX3695 +#elif defined PPG_PAH8009 + pah8009_check_int(); +#endif +} diff --git a/code/sdk/zhihui/drivers/ppg/hal/ppg_hal.h b/code/sdk/zhihui/drivers/ppg/hal/ppg_hal.h index ad98eb73c..aef8c3944 100644 --- a/code/sdk/zhihui/drivers/ppg/hal/ppg_hal.h +++ b/code/sdk/zhihui/drivers/ppg/hal/ppg_hal.h @@ -2,7 +2,7 @@ * @Author: penglei 1624952103@qq.com * @Date: 2024-06-07 11:18:26 * @LastEditors: penglei 1624952103@qq.com - * @LastEditTime: 2025-07-09 16:12:34 + * @LastEditTime: 2025-07-28 16:41:38 * @FilePath: /FD230/code/sdk/drivers/peripheral/ppg/ppg/ppg_hal.h * @Description: * @@ -35,6 +35,17 @@ extern "C" { typedef uint32_t PPG_CMD_TYPE_T ; +typedef enum{ + PPG_MSG_TYPE_HRS_UPDATE, + PPG_MSG_TYPE_HRV_UPDATE, + PPG_MSG_TYPE_SPO2_UPDATE, + PPG_MSG_TYPE_WEARSTAT_UPDATE, + PPG_MSG_TYPE_STATIC_HRS_UPDATE, +} ppg_msg_type_t; + +typedef void (*ppg_msg_callback_t)(uint8_t msg_type, uint8_t *msg_data, int32_t msg_datalen); +uint32_t ppg_register_msg_callback(ppg_msg_callback_t func); +ppg_msg_callback_t ppg_get_send_msg_callback_func(void); void ppg_send_cmd_to_driver(char* mode, uint8_t enable); void ppg_timer_handler(uint8_t mode); @@ -47,7 +58,9 @@ void ppg_power_on(void); void ppg_power_off(void); void ppg_int_handler(void); void ppg_get_leaklight_data(uint32_t *ch0,uint32_t *ch1,uint32_t *ch2); -uint32_t ppg_get_factory_data(void); +int32_t ppg_get_factory_data(void); +void ppg_ble_send(uint8_t hr); +void ppg_check_int(void); #ifdef __cplusplus #if __cplusplus diff --git a/code/sdk/zhihui/drivers/ppg/pah8009/CMakeLists.txt b/code/sdk/zhihui/drivers/ppg/pah8009/CMakeLists.txt new file mode 100644 index 000000000..6f44d7ee0 --- /dev/null +++ b/code/sdk/zhihui/drivers/ppg/pah8009/CMakeLists.txt @@ -0,0 +1,57 @@ +#=============================================================================== +# @brief cmake file +# Copyright (c) @CompanyNameMagicTag 2022-2023. All rights reserved. +#=============================================================================== +set(COMPONENT_NAME "ppg_sensor_pah8009") + +set(SOURCES ${SOURCES} + ${CMAKE_CURRENT_SOURCE_DIR}/sensor/pah_800x.c + ${CMAKE_CURRENT_SOURCE_DIR}/sensor/pah800x_bsp.c + ${CMAKE_CURRENT_SOURCE_DIR}/sensor/pah800x_main.c + ${CMAKE_CURRENT_SOURCE_DIR}/factory/pah800x_factory_test.c + ${CMAKE_CURRENT_SOURCE_DIR}/algorithm/pah_hr/V303009/test_library_HRD.c +) +set(PUBLIC_HEADER + ${CMAKE_CURRENT_SOURCE_DIR}/sensor + ${CMAKE_CURRENT_SOURCE_DIR}/factory + ${CMAKE_CURRENT_SOURCE_DIR}/algorithm/pah_spo2/V703 + ${CMAKE_CURRENT_SOURCE_DIR}/algorithm/pah_stress/V6033 + ${CMAKE_CURRENT_SOURCE_DIR}/algorithm/pah_hr/V303009 +) + +set(PRIVATE_HEADER +) + +set(PRIVATE_DEFINES +) + +set(PUBLIC_DEFINES + +) + +# use this when you want to add ccflags like -include xxx +set(COMPONENT_PUBLIC_CCFLAGS +) + +set(COMPONENT_CCFLAGS +) + +set(WHOLE_LINK + true +) + +set(MAIN_COMPONENT + false +) + +if("PPG_PAH8009" IN_LIST DEFINES) + +find_library(LIB_PATH_SPO2 algorithm/pah_spo2/V703/libv703_0_1.a ${CMAKE_CURRENT_SOURCE_DIR}) +find_library(LIB_PATH_HR algorithm/pah_hr/V303009/libv307009_4.a ${CMAKE_CURRENT_SOURCE_DIR}) + +target_link_libraries(${TARGET_NAME} PRIVATE -Wl,--whole-archive ${LIB_PATH_HR} ${LIB_PATH_SPO2} PRIVATE -Wl,--whole-archive) + +endif() + +build_component() + diff --git a/code/sdk/zhihui/drivers/ppg/pah8009/algorithm/MEMS_INT/Interrupt_function.c b/code/sdk/zhihui/drivers/ppg/pah8009/algorithm/MEMS_INT/Interrupt_function.c new file mode 100644 index 000000000..6c91bba23 --- /dev/null +++ b/code/sdk/zhihui/drivers/ppg/pah8009/algorithm/MEMS_INT/Interrupt_function.c @@ -0,0 +1,12 @@ +#include "pxi_interp.h" + + +void PXI_MEMS_interp(int16_t *src_data, size_t src_data_count, int16_t *dst_data, size_t dst_data_count) +{ + pxi_interp_ex1(src_data, src_data_count ,dst_data,dst_data_count ,3); + pxi_interp_ex1(&src_data[1], src_data_count ,&dst_data[1],dst_data_count ,3); + pxi_interp_ex1(&src_data[2], src_data_count ,&dst_data[2],dst_data_count ,3); +} + + + diff --git a/code/sdk/zhihui/drivers/ppg/pah8009/algorithm/MEMS_INT/pxi_interp.c b/code/sdk/zhihui/drivers/ppg/pah8009/algorithm/MEMS_INT/pxi_interp.c new file mode 100644 index 000000000..36ed8cd8c --- /dev/null +++ b/code/sdk/zhihui/drivers/ppg/pah8009/algorithm/MEMS_INT/pxi_interp.c @@ -0,0 +1,42 @@ +#include "pxi_interp.h" + + +/***** +* @brief Example of Platform. In this function we initialize powerkey and register callback. +* @param None. +* @return None. +* +*****/ + +void pxi_interp_ex1(int16_t *src_data, size_t src_data_count, int16_t *dst_data, size_t dst_data_count, size_t offset) +{ + float pre_time_acc = 0.0f; + float time_acc = 0.0f; + float d_time = (float)dst_data_count / src_data_count; + size_t idx_ptr = 0; + + for (size_t i = 0; i < dst_data_count; ++i) + { + while (time_acc < (float)i) + { + pre_time_acc = time_acc; + time_acc = time_acc + d_time; + idx_ptr++; + } + + if (idx_ptr == 0) + { + dst_data[i * offset] = src_data[idx_ptr * offset]; + } + else if (idx_ptr == dst_data_count) + { + dst_data[i * offset] = src_data[(idx_ptr - 1) * offset]; + } + else + { + float time_ratio = ((float)i - pre_time_acc) / (time_acc - pre_time_acc); + dst_data[i * offset] = (int16_t)((float)src_data[(idx_ptr - 1) * offset] * (1.0f - time_ratio) + (float)src_data[idx_ptr * offset] * time_ratio + 0.5f); + } + } +} + diff --git a/code/sdk/zhihui/drivers/ppg/pah8009/algorithm/MEMS_INT/pxi_interp.h b/code/sdk/zhihui/drivers/ppg/pah8009/algorithm/MEMS_INT/pxi_interp.h new file mode 100644 index 000000000..15c4149b5 --- /dev/null +++ b/code/sdk/zhihui/drivers/ppg/pah8009/algorithm/MEMS_INT/pxi_interp.h @@ -0,0 +1,7 @@ +//#pragma once + +#include +#include + +void pxi_interp_ex1(int16_t *src_data, size_t src_data_count, int16_t *dst_data, size_t dst_data_count, size_t offset); +void PXI_MEMS_interp(int16_t *src_data, size_t src_data_count, int16_t *dst_data, size_t dst_data_count); diff --git a/code/sdk/zhihui/drivers/ppg/pah8009/algorithm/pah_hr/V303009/libv307009_4.a b/code/sdk/zhihui/drivers/ppg/pah8009/algorithm/pah_hr/V303009/libv307009_4.a new file mode 100644 index 0000000000000000000000000000000000000000..d0d7a954f30762108f5faa77bd93e2ca8c4a4a8d GIT binary patch literal 627020 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∨1^ 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%0A3BeCyYl6PmM}ux%QYf_U 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%0AILP@KlNJ>zbSz4oU3 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 *b9r6V!#mHu-Z=<{5Q<_6xwsX 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⁡r*Y3jcI5NJ6{7-V= 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 literal 0 HcmV?d00001 diff --git a/code/sdk/zhihui/drivers/ppg/pah8009/algorithm/pah_hr/V303009/pah8009_testpattern_HRD.h b/code/sdk/zhihui/drivers/ppg/pah8009/algorithm/pah_hr/V303009/pah8009_testpattern_HRD.h new file mode 100644 index 000000000..44b62ae41 --- /dev/null +++ b/code/sdk/zhihui/drivers/ppg/pah8009/algorithm/pah_hr/V303009/pah8009_testpattern_HRD.h @@ -0,0 +1,23944 @@ +#ifndef _PAH8009_TESTPATTERN_ +#define _PAH8009_TESTPATTERN_ + +#include +#define NF_PPG_CHANNEL 3 +#define NF_PPG_PER_CHANNEL 3 +static const int32_t PAH8009_rawdata_HRD[][NF_PPG_PER_CHANNEL*NF_PPG_CHANNEL] = +{ +{0, 123629, 5910}, +{0, 118569, 5918}, +{0, 113318, 5916}, +{0, 106371, 5944}, +{0, 105522, 5928}, +{0, 96770, 5938}, +{0, 91486, 5928}, +{0, 86122, 5918}, +{0, 81476, 5906}, +{0, 80788, 5908}, +{0, 80266, 5904}, +{0, 79770, 5909}, +{0, 79298, 5908}, +{0, 78950, 5892}, +{0, 78704, 5900}, +{0, 78700, 5897}, +{0, 78620, 5897}, +{0, 78202, 5900}, +{0, 77595, 5903}, +{0, 77266, 5899}, +{0, 77183, 5888}, +{0, 77194, 5893}, +{0, 77168, 5884}, +{0, 76801, 5883}, +{0, 76396, 5875}, +{0, 75904, 5877}, +{0, 75403, 5886}, +{0, 74506, 5860}, +{0, 72984, 5866}, +{0, 71718, 5857}, +{0, 70789, 5854}, +{0, 70106, 5851}, +{0, 69559, 5845}, +{0, 69000, 5840}, +{0, 68416, 5827}, +{0, 67926, 5840}, +{0, 67615, 5840}, +{0, 67369, 5826}, +{0, 66701, 5816}, +{0, 65556, 5820}, +{0, 64648, 5827}, +{0, 63936, 5806}, +{0, 63453, 5806}, +{0, 63170, 5815}, +{0, 62967, 5818}, +{0, 62761, 5801}, +{0, 62594, 5806}, +{0, 62541, 5807}, +{0, 62525, 5799}, +{0, 62088, 5792}, +{0, 61096, 5784}, +{0, 60432, 5782}, +{0, 60066, 5777}, +{0, 59871, 5789}, +{0, 59953, 5791}, +{0, 60000, 5791}, +{0, 60065, 5788}, +{0, 60235, 5786}, +{0, 60431, 5797}, +{0, 60713, 5797}, +{0, 60770, 5797}, +{0, 60015, 5801}, +{0, 59364, 5796}, +{0, 59129, 5776}, +{0, 59016, 5790}, +{0, 59049, 5791}, +{0, 59116, 5783}, +{0, 59132, 5786}, +{0, 59220, 5786}, +{0, 59394, 5795}, +{0, 59670, 5788}, +{0, 59727, 5788}, +{0, 59063, 5796}, +{0, 58552, 5788}, +{0, 58411, 5771}, +{0, 58361, 5771}, +{0, 58441, 5776}, +{0, 58643, 5771}, +{0, 58852, 5785}, +{0, 59047, 5777}, +{0, 59266, 5774}, +{0, 59575, 5779}, +{0, 59891, 5786}, +{0, 59477, 5801}, +{0, 58938, 5776}, +{0, 58697, 5772}, +{0, 58468, 5779}, +{0, 58370, 5771}, +{0, 58427, 5764}, +{0, 58382, 5775}, +{0, 58432, 5772}, +{0, 58479, 5781}, +{0, 58621, 5769}, +{0, 58790, 5773}, +{0, 58663, 5771}, +{0, 58086, 5758}, +{0, 57739, 5760}, +{0, 57461, 5759}, +{0, 57334, 5755}, +{0, 57343, 5751}, +{0, 57375, 5758}, +{0, 57431, 5746}, +{0, 57478, 5755}, +{0, 57565, 5755}, +{0, 57716, 5756}, +{0, 57982, 5749}, +{0, 57981, 5750}, +{0, 57916, 5757}, +{0, 57709, 5734}, +{0, 57546, 5743}, +{0, 57514, 5749}, +{0, 57607, 5742}, +{0, 57762, 5745}, +{0, 57895, 5749}, +{0, 58073, 5756}, +{0, 58254, 5751}, +{0, 58467, 5754}, +{0, 58649, 5742}, +{0, 58465, 5755}, +{0, 58106, 5747}, +{0, 57839, 5753}, +{0, 57640, 5741}, +{0, 57646, 5744}, +{0, 57765, 5744}, +{0, 57903, 5733}, +{0, 58067, 5750}, +{0, 58267, 5750}, +{0, 58492, 5758}, +{0, 58740, 5746}, +{0, 58888, 5746}, +{0, 58582, 5749}, +{0, 58189, 5741}, +{0, 58011, 5749}, +{0, 58024, 5743}, +{0, 58121, 5752}, +{0, 58343, 5745}, +{0, 58442, 5751}, +{0, 58542, 5750}, +{0, 58672, 5766}, +{0, 58794, 5753}, +{0, 58959, 5753}, +{0, 58984, 5760}, +{0, 58907, 5758}, +{0, 58684, 5751}, +{0, 58478, 5740}, +{0, 58365, 5746}, +{0, 58427, 5745}, +{0, 58506, 5751}, +{0, 58578, 5744}, +{0, 58631, 5751}, +{0, 58713, 5762}, +{0, 58823, 5748}, +{0, 58954, 5749}, +{0, 59096, 5754}, +{0, 58921, 5745}, +{0, 58644, 5748}, +{0, 58535, 5737}, +{0, 58464, 5744}, +{0, 58465, 5742}, +{0, 58579, 5748}, +{0, 58640, 5750}, +{0, 58767, 5753}, +{0, 58864, 5743}, +{0, 59022, 5758}, +{0, 59158, 5755}, +{0, 59290, 5754}, +{0, 59226, 5755}, +{0, 58941, 5751}, +{0, 58717, 5758}, +{0, 58687, 5748}, +{0, 58599, 5748}, +{0, 58670, 5744}, +{0, 58694, 5744}, +{0, 58653, 5730}, +{0, 58575, 5736}, +{0, 58443, 5738}, +{0, 58226, 5737}, +{0, 57957, 5731}, +{0, 57664, 5744}, +{0, 57410, 5727}, +{0, 57131, 5731}, +{0, 57002, 5729}, +{0, 56949, 5726}, +{0, 56996, 5734}, +{0, 57041, 5736}, +{0, 57073, 5740}, +{0, 57122, 5733}, +{0, 57229, 5737}, +{0, 57328, 5738}, +{0, 57443, 5738}, +{0, 57591, 5734}, +{0, 57670, 5737}, +{0, 57489, 5742}, +{0, 57335, 5727}, +{0, 57307, 5729}, +{0, 57370, 5730}, +{0, 57454, 5725}, +{0, 57553, 5731}, +{0, 57636, 5726}, +{0, 57694, 5731}, +{0, 57782, 5723}, +{0, 57860, 5731}, +{0, 57953, 5737}, +{0, 57978, 5735}, +{0, 57758, 5737}, +{0, 57593, 5730}, +{0, 57484, 5734}, +{0, 57454, 5735}, +{0, 57447, 5717}, +{0, 57429, 5728}, +{0, 57402, 5740}, +{0, 57444, 5734}, +{0, 57493, 5727}, +{0, 57583, 5723}, +{0, 57683, 5725}, +{0, 57812, 5729}, +{0, 57658, 5716}, +{0, 57615, 5722}, +{0, 57641, 5721}, +{0, 57787, 5715}, +{0, 57986, 5733}, +{0, 58116, 5725}, +{0, 58211, 5727}, +{0, 58335, 5724}, +{0, 58464, 5724}, +{0, 58575, 5719}, +{0, 58657, 5734}, +{0, 58753, 5740}, +{0, 58533, 5730}, +{0, 58259, 5721}, +{0, 58161, 5726}, +{0, 58156, 5737}, +{0, 58106, 5727}, +{0, 58076, 5737}, +{0, 58128, 5731}, +{0, 58129, 5735}, +{0, 58213, 5727}, +{0, 58282, 5733}, +{0, 58282, 5728}, +{0, 58252, 5728}, +{0, 57998, 5721}, +{0, 57697, 5706}, +{0, 57559, 5719}, +{0, 57528, 5713}, +{0, 57520, 5723}, +{0, 57651, 5727}, +{0, 57819, 5719}, +{0, 58009, 5717}, +{0, 58287, 5733}, +{0, 58597, 5741}, +{0, 58811, 5732}, +{0, 59046, 5744}, +{0, 59025, 5726}, +{0, 58912, 5734}, +{0, 58919, 5738}, +{0, 59012, 5732}, +{0, 59143, 5748}, +{0, 59188, 5745}, +{0, 59227, 5749}, +{0, 59316, 5743}, +{0, 59358, 5740}, +{0, 59496, 5750}, +{0, 59627, 5751}, +{0, 59740, 5746}, +{0, 59647, 5735}, +{0, 59492, 5738}, +{0, 59361, 5725}, +{0, 59307, 5727}, +{0, 59357, 5728}, +{0, 59335, 5731}, +{0, 59163, 5729}, +{0, 58947, 5736}, +{0, 58960, 5747}, +{0, 59110, 5739}, +{0, 59246, 5744}, +{0, 59243, 5742}, +{0, 58958, 5732}, +{0, 58742, 5735}, +{0, 58692, 5725}, +{0, 58708, 5746}, +{0, 58787, 5744}, +{0, 59036, 5750}, +{0, 59671, 5735}, +{0, 60295, 5756}, +{0, 60927, 5763}, +{0, 61483, 5775}, +{0, 62005, 5778}, +{0, 62364, 5775}, +{0, 62685, 5780}, +{0, 63073, 5793}, +{0, 63430, 5798}, +{0, 63809, 5806}, +{0, 64149, 5810}, +{0, 64475, 5804}, +{0, 64774, 5810}, +{0, 65019, 5809}, +{0, 65321, 5807}, +{0, 65612, 5812}, +{0, 65791, 5818}, +{0, 65710, 5815}, +{0, 65624, 5802}, +{0, 65575, 5809}, +{0, 65443, 5800}, +{0, 65313, 5812}, +{0, 65198, 5812}, +{0, 65152, 5796}, +{0, 65148, 5795}, +{0, 65237, 5799}, +{0, 65317, 5799}, +{0, 65423, 5803}, +{0, 65467, 5800}, +{0, 65256, 5792}, +{0, 65124, 5790}, +{0, 65061, 5803}, +{0, 65012, 5796}, +{0, 64980, 5796}, +{0, 64932, 5792}, +{0, 64922, 5795}, +{0, 64895, 5803}, +{0, 64900, 5798}, +{0, 64872, 5798}, +{0, 64872, 5793}, +{0, 64747, 5789}, +{0, 64413, 5798}, +{0, 64165, 5794}, +{0, 63986, 5790}, +{0, 63882, 5781}, +{0, 63760, 5789}, +{0, 63792, 5780}, +{0, 63732, 5794}, +{0, 63781, 5788}, +{0, 63736, 5803}, +{0, 63854, 5791}, +{0, 63865, 5789}, +{0, 63866, 5799}, +{0, 63594, 5778}, +{0, 63433, 5777}, +{0, 63378, 5791}, +{0, 63409, 5779}, +{0, 63463, 5764}, +{0, 63486, 5775}, +{0, 63487, 5787}, +{0, 63572, 5778}, +{0, 63735, 5783}, +{0, 63803, 5773}, +{0, 63922, 5785}, +{0, 64029, 5783}, +{0, 63849, 5789}, +{0, 63604, 5785}, +{0, 63504, 5782}, +{0, 63472, 5774}, +{0, 63538, 5777}, +{0, 63570, 5775}, +{0, 63577, 5784}, +{0, 63590, 5776}, +{0, 63669, 5778}, +{0, 63772, 5782}, +{0, 63856, 5779}, +{0, 63959, 5779}, +{0, 63837, 5784}, +{0, 63557, 5776}, +{0, 63414, 5778}, +{0, 63370, 5781}, +{0, 63343, 5787}, +{0, 63346, 5781}, +{0, 63259, 5773}, +{0, 63253, 5771}, +{0, 63201, 5782}, +{0, 63234, 5782}, +{0, 63266, 5773}, +{0, 63307, 5774}, +{0, 63246, 5774}, +{0, 62919, 5769}, +{0, 62727, 5774}, +{0, 62685, 5779}, +{0, 62739, 5766}, +{0, 62789, 5759}, +{0, 62847, 5762}, +{0, 63030, 5765}, +{0, 63262, 5770}, +{0, 63561, 5784}, +{0, 63943, 5792}, +{0, 64274, 5795}, +{0, 64520, 5789}, +{0, 64439, 5796}, +{0, 64276, 5802}, +{0, 64338, 5792}, +{0, 64500, 5801}, +{0, 64753, 5805}, +{0, 65005, 5806}, +{0, 65246, 5809}, +{0, 65430, 5798}, +{0, 65691, 5809}, +{0, 65870, 5815}, +{0, 66098, 5807}, +{0, 66239, 5814}, +{0, 65989, 5813}, +{0, 65656, 5812}, +{0, 65523, 5810}, +{0, 65470, 5802}, +{0, 65429, 5798}, +{0, 65380, 5802}, +{0, 65218, 5793}, +{0, 65087, 5787}, +{0, 64942, 5787}, +{0, 64877, 5793}, +{0, 64720, 5796}, +{0, 64662, 5780}, +{0, 64332, 5772}, +{0, 63902, 5763}, +{0, 63639, 5763}, +{0, 63495, 5766}, +{0, 63367, 5760}, +{0, 63324, 5764}, +{0, 63315, 5772}, +{0, 63263, 5764}, +{0, 63258, 5755}, +{0, 63344, 5763}, +{0, 63369, 5758}, +{0, 63416, 5762}, +{0, 63060, 5755}, +{0, 62872, 5763}, +{0, 62919, 5769}, +{0, 63045, 5764}, +{0, 63173, 5786}, +{0, 63278, 5775}, +{0, 63357, 5774}, +{0, 63445, 5773}, +{0, 63543, 5781}, +{0, 63648, 5780}, +{0, 63715, 5782}, +{0, 63488, 5777}, +{0, 62867, 5780}, +{0, 62518, 5783}, +{0, 62258, 5773}, +{0, 62083, 5771}, +{0, 61984, 5770}, +{0, 61896, 5759}, +{0, 61733, 5761}, +{0, 61567, 5759}, +{0, 61535, 5768}, +{0, 61595, 5758}, +{0, 61726, 5775}, +{0, 61675, 5762}, +{0, 61330, 5759}, +{0, 61190, 5756}, +{0, 61269, 5765}, +{0, 61508, 5774}, +{0, 61756, 5778}, +{0, 62028, 5785}, +{0, 62209, 5787}, +{0, 62461, 5787}, +{0, 62716, 5793}, +{0, 63008, 5787}, +{0, 63274, 5792}, +{0, 63253, 5789}, +{0, 62966, 5791}, +{0, 62966, 5788}, +{0, 62994, 5784}, +{0, 63066, 5796}, +{0, 63155, 5789}, +{0, 63205, 5792}, +{0, 63262, 5789}, +{0, 63272, 5793}, +{0, 63273, 5791}, +{0, 63206, 5779}, +{0, 63087, 5779}, +{0, 62588, 5777}, +{0, 62075, 5771}, +{0, 61794, 5769}, +{0, 61577, 5768}, +{0, 61466, 5766}, +{0, 61429, 5764}, +{0, 61455, 5758}, +{0, 61475, 5757}, +{0, 61626, 5755}, +{0, 61776, 5768}, +{0, 61934, 5752}, +{0, 61846, 5756}, +{0, 61389, 5753}, +{0, 61208, 5746}, +{0, 61084, 5748}, +{0, 61091, 5751}, +{0, 61154, 5746}, +{0, 61209, 5748}, +{0, 61262, 5759}, +{0, 61363, 5743}, +{0, 61588, 5752}, +{0, 61931, 5766}, +{0, 62269, 5764}, +{0, 62412, 5769}, +{0, 62312, 5770}, +{0, 62235, 5771}, +{0, 62334, 5778}, +{0, 62378, 5772}, +{0, 62394, 5772}, +{0, 62360, 5760}, +{0, 62291, 5763}, +{0, 62295, 5761}, +{0, 62378, 5751}, +{0, 62481, 5762}, +{0, 62624, 5774}, +{0, 62644, 5772}, +{0, 62389, 5770}, +{0, 62120, 5764}, +{0, 61878, 5753}, +{0, 61725, 5762}, +{0, 61746, 5757}, +{0, 61881, 5766}, +{0, 62153, 5760}, +{0, 62325, 5761}, +{0, 62548, 5761}, +{0, 62669, 5754}, +{0, 62879, 5764}, +{0, 62629, 5756}, +{0, 62332, 5769}, +{0, 62140, 5761}, +{0, 62120, 5757}, +{0, 62169, 5762}, +{0, 62272, 5766}, +{0, 62331, 5762}, +{0, 62382, 5769}, +{0, 62445, 5763}, +{0, 62407, 5762}, +{0, 62353, 5774}, +{0, 62361, 5773}, +{0, 62135, 5773}, +{0, 61827, 5766}, +{0, 61601, 5750}, +{0, 61589, 5761}, +{0, 61690, 5749}, +{0, 61801, 5744}, +{0, 61820, 5740}, +{0, 61842, 5747}, +{0, 61860, 5766}, +{0, 62029, 5760}, +{0, 62251, 5762}, +{0, 62550, 5769}, +{0, 62878, 5776}, +{0, 62925, 5768}, +{0, 62918, 5763}, +{0, 63128, 5777}, +{0, 63394, 5775}, +{0, 63669, 5780}, +{0, 63835, 5778}, +{0, 64013, 5789}, +{0, 64079, 5779}, +{0, 64186, 5784}, +{0, 64308, 5778}, +{0, 64334, 5784}, +{0, 64282, 5794}, +{0, 63926, 5776}, +{0, 63585, 5769}, +{0, 63334, 5760}, +{0, 63121, 5765}, +{0, 63129, 5768}, +{0, 63284, 5767}, +{0, 63503, 5765}, +{0, 63541, 5765}, +{0, 63550, 5769}, +{0, 63622, 5780}, +{0, 63724, 5771}, +{0, 63704, 5767}, +{0, 63429, 5774}, +{0, 63210, 5761}, +{0, 63150, 5774}, +{0, 63176, 5783}, +{0, 63244, 5765}, +{0, 63444, 5773}, +{0, 63690, 5795}, +{0, 63968, 5803}, +{0, 64241, 5807}, +{0, 64575, 5809}, +{0, 65009, 5814}, +{0, 65276, 5815}, +{0, 65257, 5803}, +{0, 65316, 5824}, +{0, 65368, 5818}, +{0, 65327, 5811}, +{0, 65260, 5814}, +{0, 65179, 5804}, +{0, 65040, 5801}, +{0, 64913, 5807}, +{0, 64802, 5797}, +{0, 64718, 5799}, +{0, 64611, 5797}, +{0, 64415, 5800}, +{0, 64046, 5793}, +{0, 63772, 5780}, +{0, 63499, 5775}, +{0, 63292, 5772}, +{0, 63055, 5758}, +{0, 62893, 5769}, +{0, 62851, 5762}, +{0, 62815, 5777}, +{0, 62848, 5775}, +{0, 62991, 5762}, +{0, 63131, 5772}, +{0, 62987, 5772}, +{0, 62700, 5771}, +{0, 62261, 5772}, +{0, 61915, 5753}, +{0, 61787, 5761}, +{0, 61831, 5763}, +{0, 61778, 5762}, +{0, 61723, 5754}, +{0, 61759, 5757}, +{0, 61860, 5750}, +{0, 61924, 5764}, +{0, 61758, 5756}, +{0, 61283, 5755}, +{0, 60873, 5753}, +{0, 60417, 5741}, +{0, 60167, 5751}, +{0, 59971, 5744}, +{0, 59851, 5749}, +{0, 59669, 5757}, +{0, 59506, 5756}, +{0, 59345, 5757}, +{0, 59243, 5752}, +{0, 59105, 5761}, +{0, 58659, 5769}, +{0, 57940, 5761}, +{0, 57566, 5749}, +{0, 57450, 5748}, +{0, 57445, 5745}, +{0, 57486, 5738}, +{0, 57651, 5744}, +{0, 57905, 5750}, +{0, 58216, 5751}, +{0, 58463, 5750}, +{0, 58707, 5755}, +{0, 58813, 5761}, +{0, 58531, 5752}, +{0, 58351, 5752}, +{0, 58368, 5753}, +{0, 58483, 5749}, +{0, 58537, 5752}, +{0, 58424, 5758}, +{0, 58200, 5751}, +{0, 58067, 5754}, +{0, 58120, 5753}, +{0, 58109, 5758}, +{0, 58206, 5758}, +{0, 58438, 5759}, +{0, 58333, 5757}, +{0, 58264, 5761}, +{0, 58408, 5762}, +{0, 58653, 5771}, +{0, 58882, 5773}, +{0, 59063, 5785}, +{0, 59244, 5778}, +{0, 59428, 5782}, +{0, 59686, 5780}, +{0, 59884, 5786}, +{0, 60120, 5780}, +{0, 59927, 5770}, +{0, 59720, 5783}, +{0, 59758, 5768}, +{0, 59921, 5776}, +{0, 60162, 5772}, +{0, 60400, 5777}, +{0, 60629, 5786}, +{0, 60963, 5788}, +{0, 61245, 5785}, +{0, 61478, 5798}, +{0, 61742, 5795}, +{0, 61906, 5801}, +{0, 61764, 5779}, +{0, 61563, 5771}, +{0, 61160, 5783}, +{0, 60853, 5774}, +{0, 60623, 5767}, +{0, 60401, 5764}, +{0, 60175, 5760}, +{0, 60017, 5747}, +{0, 59984, 5741}, +{0, 60044, 5749}, +{0, 60098, 5757}, +{0, 60058, 5750}, +{0, 59791, 5745}, +{0, 59593, 5738}, +{0, 59563, 5749}, +{0, 59562, 5745}, +{0, 59708, 5750}, +{0, 59850, 5761}, +{0, 60212, 5763}, +{0, 60788, 5772}, +{0, 61619, 5794}, +{0, 62580, 5807}, +{0, 63490, 5819}, +{0, 64080, 5810}, +{0, 64358, 5800}, +{0, 64702, 5810}, +{0, 65016, 5820}, +{0, 65346, 5815}, +{0, 65728, 5818}, +{0, 66106, 5825}, +{0, 66387, 5819}, +{0, 66487, 5803}, +{0, 66536, 5816}, +{0, 66665, 5812}, +{0, 66835, 5817}, +{0, 66918, 5815}, +{0, 66891, 5813}, +{0, 67104, 5823}, +{0, 67512, 5839}, +{0, 68016, 5847}, +{0, 68617, 5847}, +{0, 69134, 5837}, +{0, 69657, 5851}, +{0, 70277, 5850}, +{0, 70854, 5863}, +{0, 71531, 5868}, +{0, 72171, 5862}, +{0, 72584, 5858}, +{0, 72533, 5855}, +{0, 72529, 5860}, +{0, 72557, 5862}, +{0, 72559, 5848}, +{0, 72536, 5844}, +{0, 72540, 5857}, +{0, 72433, 5841}, +{0, 72360, 5839}, +{0, 72366, 5852}, +{0, 72429, 5853}, +{0, 72535, 5851}, +{0, 72559, 5844}, +{0, 72224, 5850}, +{0, 71803, 5831}, +{0, 71524, 5836}, +{0, 71237, 5830}, +{0, 70999, 5843}, +{0, 70703, 5831}, +{0, 70440, 5836}, +{0, 70200, 5825}, +{0, 70089, 5816}, +{0, 70102, 5825}, +{0, 70163, 5826}, +{0, 70264, 5824}, +{0, 69955, 5808}, +{0, 69458, 5817}, +{0, 69074, 5824}, +{0, 68792, 5815}, +{0, 68544, 5812}, +{0, 68363, 5816}, +{0, 68082, 5811}, +{0, 67793, 5806}, +{0, 67555, 5821}, +{0, 67313, 5802}, +{0, 67154, 5801}, +{0, 67135, 5806}, +{0, 66807, 5797}, +{0, 66342, 5796}, +{0, 65999, 5786}, +{0, 65750, 5789}, +{0, 65594, 5800}, +{0, 65564, 5798}, +{0, 65579, 5805}, +{0, 65708, 5793}, +{0, 65976, 5812}, +{0, 66309, 5818}, +{0, 66750, 5820}, +{0, 67196, 5828}, +{0, 67576, 5835}, +{0, 67401, 5824}, +{0, 67390, 5817}, +{0, 67687, 5828}, +{0, 68049, 5825}, +{0, 68289, 5837}, +{0, 68354, 5834}, +{0, 68266, 5829}, +{0, 68110, 5824}, +{0, 68086, 5824}, +{0, 68194, 5830}, +{0, 68355, 5820}, +{0, 68271, 5830}, +{0, 67668, 5818}, +{0, 67010, 5799}, +{0, 66590, 5790}, +{0, 66325, 5801}, +{0, 66197, 5803}, +{0, 66116, 5811}, +{0, 66067, 5796}, +{0, 66104, 5801}, +{0, 66128, 5794}, +{0, 66202, 5801}, +{0, 66259, 5798}, +{0, 66405, 5796}, +{0, 66178, 5803}, +{0, 65969, 5809}, +{0, 65970, 5826}, +{0, 66127, 5832}, +{0, 66350, 5823}, +{0, 66644, 5831}, +{0, 66948, 5833}, +{0, 67228, 5830}, +{0, 67423, 5831}, +{0, 67608, 5829}, +{0, 67628, 5835}, +{0, 67624, 5834}, +{0, 67072, 5819}, +{0, 66363, 5809}, +{0, 65909, 5814}, +{0, 65618, 5802}, +{0, 65434, 5811}, +{0, 65385, 5802}, +{0, 65371, 5799}, +{0, 65307, 5803}, +{0, 65389, 5807}, +{0, 65475, 5803}, +{0, 65600, 5797}, +{0, 65817, 5791}, +{0, 65903, 5795}, +{0, 65955, 5785}, +{0, 66018, 5803}, +{0, 66068, 5803}, +{0, 66256, 5823}, +{0, 66470, 5814}, +{0, 66754, 5827}, +{0, 66957, 5815}, +{0, 67166, 5819}, +{0, 67434, 5823}, +{0, 67766, 5814}, +{0, 67944, 5823}, +{0, 67453, 5815}, +{0, 66912, 5822}, +{0, 66562, 5816}, +{0, 66312, 5808}, +{0, 66113, 5809}, +{0, 66043, 5800}, +{0, 66037, 5791}, +{0, 66111, 5790}, +{0, 66138, 5798}, +{0, 66118, 5794}, +{0, 66166, 5803}, +{0, 65942, 5807}, +{0, 65162, 5806}, +{0, 64551, 5788}, +{0, 64171, 5790}, +{0, 64015, 5781}, +{0, 63944, 5776}, +{0, 63951, 5782}, +{0, 63982, 5786}, +{0, 64003, 5775}, +{0, 64111, 5764}, +{0, 64352, 5773}, +{0, 64586, 5778}, +{0, 64494, 5786}, +{0, 63841, 5793}, +{0, 63485, 5772}, +{0, 63356, 5772}, +{0, 63387, 5781}, +{0, 63461, 5781}, +{0, 63500, 5785}, +{0, 63508, 5800}, +{0, 63672, 5794}, +{0, 63958, 5790}, +{0, 64148, 5802}, +{0, 64287, 5803}, +{0, 64042, 5794}, +{0, 63661, 5795}, +{0, 63571, 5774}, +{0, 63626, 5783}, +{0, 63707, 5791}, +{0, 63814, 5801}, +{0, 63880, 5785}, +{0, 63927, 5803}, +{0, 64073, 5797}, +{0, 64378, 5796}, +{0, 64669, 5804}, +{0, 64946, 5804}, +{0, 64931, 5813}, +{0, 64756, 5802}, +{0, 64879, 5801}, +{0, 65114, 5806}, +{0, 65326, 5811}, +{0, 65482, 5805}, +{0, 65343, 5802}, +{0, 65069, 5793}, +{0, 64859, 5782}, +{0, 64643, 5790}, +{0, 64495, 5801}, +{0, 64215, 5786}, +{0, 63659, 5771}, +{0, 63267, 5771}, +{0, 63058, 5777}, +{0, 63026, 5772}, +{0, 63035, 5765}, +{0, 63062, 5765}, +{0, 62976, 5773}, +{0, 63006, 5776}, +{0, 63091, 5769}, +{0, 63301, 5774}, +{0, 63552, 5779}, +{0, 63545, 5769}, +{0, 63334, 5769}, +{0, 63208, 5782}, +{0, 63195, 5785}, +{0, 63141, 5778}, +{0, 63223, 5777}, +{0, 63365, 5770}, +{0, 63532, 5776}, +{0, 63595, 5770}, +{0, 63604, 5771}, +{0, 63612, 5767}, +{0, 63617, 5763}, +{0, 63330, 5759}, +{0, 63173, 5761}, +{0, 63254, 5759}, +{0, 63392, 5767}, +{0, 63557, 5776}, +{0, 63637, 5778}, +{0, 63674, 5785}, +{0, 63563, 5781}, +{0, 63390, 5773}, +{0, 63113, 5785}, +{0, 62949, 5781}, +{0, 62921, 5764}, +{0, 62731, 5772}, +{0, 62536, 5787}, +{0, 62566, 5779}, +{0, 62709, 5770}, +{0, 62973, 5761}, +{0, 62930, 5760}, +{0, 62722, 5768}, +{0, 62678, 5783}, +{0, 62750, 5773}, +{0, 62701, 5787}, +{0, 62641, 5766}, +{0, 62456, 5768}, +{0, 62061, 5769}, +{0, 61566, 5766}, +{0, 61094, 5759}, +{0, 60794, 5753}, +{0, 60716, 5763}, +{0, 60749, 5765}, +{0, 60691, 5766}, +{0, 60600, 5764}, +{0, 60608, 5762}, +{0, 60806, 5777}, +{0, 60900, 5761}, +{0, 60554, 5757}, +{0, 60184, 5767}, +{0, 60018, 5775}, +{0, 60038, 5756}, +{0, 60070, 5762}, +{0, 60201, 5765}, +{0, 60224, 5762}, +{0, 60226, 5762}, +{0, 60238, 5760}, +{0, 60294, 5759}, +{0, 60325, 5760}, +{0, 59975, 5763}, +{0, 59527, 5752}, +{0, 59243, 5747}, +{0, 59081, 5761}, +{0, 58982, 5754}, +{0, 59055, 5752}, +{0, 59020, 5769}, +{0, 58892, 5757}, +{0, 58811, 5770}, +{0, 58830, 5755}, +{0, 59012, 5760}, +{0, 58978, 5756}, +{0, 58707, 5739}, +{0, 58480, 5747}, +{0, 58500, 5750}, +{0, 58540, 5749}, +{0, 58683, 5751}, +{0, 58817, 5755}, +{0, 58919, 5747}, +{0, 59049, 5758}, +{0, 59185, 5754}, +{0, 59365, 5753}, +{0, 59505, 5756}, +{0, 59120, 5746}, +{0, 58775, 5738}, +{0, 58560, 5743}, +{0, 58458, 5742}, +{0, 58326, 5742}, +{0, 58099, 5744}, +{0, 57782, 5750}, +{0, 57663, 5747}, +{0, 57583, 5751}, +{0, 57501, 5759}, +{0, 57472, 5747}, +{0, 57352, 5762}, +{0, 57101, 5763}, +{0, 57000, 5754}, +{0, 57037, 5744}, +{0, 57180, 5745}, +{0, 57364, 5750}, +{0, 57533, 5755}, +{0, 57798, 5751}, +{0, 58047, 5752}, +{0, 58303, 5758}, +{0, 58605, 5755}, +{0, 58525, 5741}, +{0, 58442, 5743}, +{0, 58462, 5742}, +{0, 58490, 5739}, +{0, 58560, 5748}, +{0, 58525, 5749}, +{0, 58540, 5750}, +{0, 58503, 5746}, +{0, 58493, 5761}, +{0, 58545, 5739}, +{0, 58611, 5745}, +{0, 58398, 5744}, +{0, 58150, 5735}, +{0, 57974, 5747}, +{0, 57910, 5753}, +{0, 57873, 5755}, +{0, 57974, 5747}, +{0, 58039, 5739}, +{0, 58109, 5743}, +{0, 58262, 5747}, +{0, 58475, 5745}, +{0, 58743, 5746}, +{0, 58708, 5744}, +{0, 58682, 5740}, +{0, 58788, 5742}, +{0, 58870, 5735}, +{0, 59011, 5753}, +{0, 59102, 5744}, +{0, 59174, 5757}, +{0, 59160, 5765}, +{0, 59160, 5750}, +{0, 59133, 5736}, +{0, 59067, 5755}, +{0, 58809, 5752}, +{0, 58558, 5738}, +{0, 58407, 5739}, +{0, 58292, 5748}, +{0, 58251, 5740}, +{0, 58202, 5753}, +{0, 58198, 5752}, +{0, 58281, 5752}, +{0, 58366, 5745}, +{0, 58480, 5749}, +{0, 58661, 5750}, +{0, 58558, 5754}, +{0, 58560, 5735}, +{0, 58650, 5732}, +{0, 58802, 5744}, +{0, 59016, 5745}, +{0, 59198, 5744}, +{0, 59345, 5745}, +{0, 59413, 5746}, +{0, 59437, 5751}, +{0, 59463, 5743}, +{0, 59468, 5751}, +{0, 59121, 5749}, +{0, 58823, 5741}, +{0, 58629, 5749}, +{0, 58602, 5750}, +{0, 58552, 5750}, +{0, 58340, 5761}, +{0, 58175, 5760}, +{0, 58375, 5764}, +{0, 58742, 5756}, +{0, 59153, 5754}, +{0, 59574, 5776}, +{0, 59689, 5764}, +{0, 59730, 5765}, +{0, 59944, 5768}, +{0, 60291, 5767}, +{0, 60651, 5779}, +{0, 60970, 5778}, +{0, 61158, 5785}, +{0, 61301, 5789}, +{0, 61367, 5782}, +{0, 61452, 5783}, +{0, 61498, 5778}, +{0, 61177, 5765}, +{0, 60974, 5768}, +{0, 60937, 5779}, +{0, 60978, 5776}, +{0, 61039, 5773}, +{0, 61187, 5773}, +{0, 61391, 5770}, +{0, 61560, 5781}, +{0, 61708, 5771}, +{0, 61897, 5788}, +{0, 62062, 5781}, +{0, 61847, 5776}, +{0, 61679, 5774}, +{0, 61729, 5767}, +{0, 61817, 5762}, +{0, 62033, 5774}, +{0, 62435, 5781}, +{0, 62691, 5789}, +{0, 62874, 5778}, +{0, 62944, 5777}, +{0, 62923, 5779}, +{0, 62701, 5777}, +{0, 62265, 5769}, +{0, 61947, 5761}, +{0, 61728, 5770}, +{0, 61531, 5762}, +{0, 61388, 5766}, +{0, 61354, 5762}, +{0, 61261, 5760}, +{0, 61357, 5755}, +{0, 61658, 5767}, +{0, 61964, 5754}, +{0, 61978, 5752}, +{0, 61821, 5752}, +{0, 62047, 5752}, +{0, 62480, 5765}, +{0, 63117, 5784}, +{0, 63920, 5797}, +{0, 64722, 5820}, +{0, 65481, 5820}, +{0, 66153, 5840}, +{0, 66805, 5832}, +{0, 67430, 5830}, +{0, 67616, 5827}, +{0, 67176, 5799}, +{0, 66784, 5793}, +{0, 66504, 5784}, +{0, 66281, 5794}, +{0, 66279, 5800}, +{0, 66315, 5789}, +{0, 66427, 5794}, +{0, 66577, 5804}, +{0, 66901, 5812}, +{0, 67291, 5803}, +{0, 67197, 5807}, +{0, 66853, 5810}, +{0, 66640, 5799}, +{0, 66557, 5807}, +{0, 66489, 5808}, +{0, 66766, 5793}, +{0, 67121, 5817}, +{0, 67509, 5830}, +{0, 67877, 5826}, +{0, 68346, 5854}, +{0, 68755, 5840}, +{0, 68684, 5826}, +{0, 68376, 5810}, +{0, 68194, 5825}, +{0, 68102, 5820}, +{0, 68062, 5832}, +{0, 68109, 5815}, +{0, 68151, 5820}, +{0, 68191, 5810}, +{0, 68216, 5814}, +{0, 68286, 5829}, +{0, 68272, 5818}, +{0, 67857, 5811}, +{0, 67430, 5811}, +{0, 67198, 5808}, +{0, 67092, 5813}, +{0, 67054, 5812}, +{0, 67066, 5813}, +{0, 67162, 5817}, +{0, 67365, 5803}, +{0, 67515, 5823}, +{0, 67768, 5809}, +{0, 67856, 5817}, +{0, 67338, 5802}, +{0, 66942, 5818}, +{0, 66703, 5805}, +{0, 66609, 5818}, +{0, 66564, 5809}, +{0, 66526, 5814}, +{0, 66527, 5801}, +{0, 66432, 5804}, +{0, 66472, 5800}, +{0, 66588, 5799}, +{0, 66481, 5805}, +{0, 66056, 5796}, +{0, 65725, 5797}, +{0, 65665, 5795}, +{0, 65769, 5788}, +{0, 66041, 5791}, +{0, 66367, 5804}, +{0, 66625, 5811}, +{0, 66977, 5813}, +{0, 67326, 5818}, +{0, 67674, 5827}, +{0, 67523, 5818}, +{0, 67166, 5816}, +{0, 67022, 5814}, +{0, 67012, 5822}, +{0, 67069, 5810}, +{0, 67155, 5814}, +{0, 67175, 5823}, +{0, 67157, 5822}, +{0, 67220, 5814}, +{0, 67291, 5816}, +{0, 67360, 5808}, +{0, 66878, 5802}, +{0, 66324, 5808}, +{0, 65974, 5804}, +{0, 65771, 5792}, +{0, 65684, 5800}, +{0, 65698, 5797}, +{0, 65929, 5791}, +{0, 66161, 5804}, +{0, 66476, 5800}, +{0, 66790, 5811}, +{0, 66773, 5811}, +{0, 66449, 5805}, +{0, 66313, 5807}, +{0, 66311, 5804}, +{0, 66367, 5808}, +{0, 66407, 5801}, +{0, 66416, 5802}, +{0, 66329, 5807}, +{0, 66250, 5804}, +{0, 66168, 5804}, +{0, 65886, 5804}, +{0, 65142, 5794}, +{0, 64512, 5789}, +{0, 64154, 5792}, +{0, 63912, 5786}, +{0, 63745, 5783}, +{0, 63634, 5792}, +{0, 63618, 5781}, +{0, 63589, 5780}, +{0, 63621, 5784}, +{0, 63667, 5788}, +{0, 63723, 5775}, +{0, 63663, 5783}, +{0, 63543, 5781}, +{0, 63339, 5782}, +{0, 63415, 5785}, +{0, 63624, 5789}, +{0, 63856, 5790}, +{0, 64020, 5794}, +{0, 64166, 5786}, +{0, 64343, 5784}, +{0, 64011, 5788}, +{0, 63315, 5786}, +{0, 62970, 5781}, +{0, 62792, 5780}, +{0, 62726, 5779}, +{0, 62643, 5787}, +{0, 62619, 5769}, +{0, 62679, 5784}, +{0, 62745, 5781}, +{0, 62700, 5791}, +{0, 62715, 5785}, +{0, 62752, 5778}, +{0, 62799, 5784}, +{0, 62886, 5779}, +{0, 63014, 5777}, +{0, 63144, 5783}, +{0, 63154, 5773}, +{0, 63229, 5780}, +{0, 63342, 5798}, +{0, 63509, 5792}, +{0, 63717, 5777}, +{0, 63398, 5785}, +{0, 63108, 5783}, +{0, 63116, 5775}, +{0, 63216, 5775}, +{0, 63266, 5778}, +{0, 63243, 5771}, +{0, 63181, 5772}, +{0, 63147, 5782}, +{0, 63098, 5775}, +{0, 63081, 5767}, +{0, 62881, 5777}, +{0, 62521, 5773}, +{0, 62174, 5766}, +{0, 61926, 5762}, +{0, 62018, 5769}, +{0, 62183, 5772}, +{0, 62361, 5782}, +{0, 62569, 5774}, +{0, 62877, 5796}, +{0, 63329, 5813}, +{0, 63713, 5811}, +{0, 63611, 5812}, +{0, 63706, 5814}, +{0, 63983, 5806}, +{0, 64201, 5814}, +{0, 64393, 5814}, +{0, 64477, 5801}, +{0, 64463, 5795}, +{0, 64578, 5821}, +{0, 64567, 5806}, +{0, 64551, 5809}, +{0, 63995, 5803}, +{0, 63444, 5792}, +{0, 63179, 5788}, +{0, 63083, 5786}, +{0, 62980, 5785}, +{0, 63076, 5790}, +{0, 63157, 5795}, +{0, 63215, 5796}, +{0, 63245, 5782}, +{0, 63377, 5789}, +{0, 63108, 5779}, +{0, 62438, 5768}, +{0, 62142, 5767}, +{0, 62083, 5768}, +{0, 62217, 5782}, +{0, 62529, 5786}, +{0, 62895, 5785}, +{0, 63360, 5783}, +{0, 63766, 5790}, +{0, 63999, 5791}, +{0, 63939, 5785}, +{0, 63510, 5796}, +{0, 63254, 5793}, +{0, 63078, 5789}, +{0, 62948, 5798}, +{0, 62889, 5789}, +{0, 62802, 5789}, +{0, 62642, 5783}, +{0, 62496, 5771}, +{0, 62349, 5788}, +{0, 62173, 5776}, +{0, 61617, 5770}, +{0, 61141, 5772}, +{0, 60906, 5762}, +{0, 60834, 5761}, +{0, 60871, 5751}, +{0, 60932, 5757}, +{0, 61100, 5759}, +{0, 61308, 5760}, +{0, 61524, 5780}, +{0, 61754, 5773}, +{0, 61506, 5766}, +{0, 61086, 5773}, +{0, 61049, 5770}, +{0, 61115, 5770}, +{0, 61247, 5781}, +{0, 61427, 5769}, +{0, 61613, 5773}, +{0, 61668, 5765}, +{0, 61806, 5766}, +{0, 62008, 5774}, +{0, 61886, 5763}, +{0, 61188, 5751}, +{0, 60639, 5748}, +{0, 60412, 5752}, +{0, 60316, 5757}, +{0, 60310, 5761}, +{0, 60356, 5763}, +{0, 60405, 5761}, +{0, 60464, 5760}, +{0, 60630, 5762}, +{0, 60863, 5763}, +{0, 60954, 5765}, +{0, 60572, 5751}, +{0, 60416, 5757}, +{0, 60448, 5754}, +{0, 60505, 5759}, +{0, 60713, 5773}, +{0, 60769, 5766}, +{0, 60714, 5757}, +{0, 60657, 5755}, +{0, 60591, 5760}, +{0, 60567, 5755}, +{0, 60112, 5743}, +{0, 59439, 5753}, +{0, 59128, 5731}, +{0, 59000, 5746}, +{0, 59138, 5739}, +{0, 59421, 5744}, +{0, 59689, 5752}, +{0, 60117, 5751}, +{0, 60761, 5757}, +{0, 61771, 5789}, +{0, 62517, 5791}, +{0, 62664, 5798}, +{0, 62968, 5801}, +{0, 63303, 5791}, +{0, 63803, 5800}, +{0, 64494, 5805}, +{0, 65280, 5821}, +{0, 66256, 5819}, +{0, 67130, 5848}, +{0, 67923, 5853}, +{0, 68576, 5847}, +{0, 68487, 5828}, +{0, 67761, 5822}, +{0, 67183, 5810}, +{0, 66736, 5800}, +{0, 66396, 5800}, +{0, 66196, 5800}, +{0, 66150, 5812}, +{0, 66140, 5808}, +{0, 66223, 5807}, +{0, 66268, 5807}, +{0, 66370, 5801}, +{0, 65916, 5803}, +{0, 65289, 5797}, +{0, 64821, 5792}, +{0, 64674, 5784}, +{0, 64593, 5783}, +{0, 64812, 5790}, +{0, 65189, 5802}, +{0, 65670, 5820}, +{0, 66247, 5823}, +{0, 66900, 5832}, +{0, 67635, 5835}, +{0, 67749, 5830}, +{0, 67574, 5832}, +{0, 67596, 5835}, +{0, 67845, 5853}, +{0, 68130, 5834}, +{0, 68102, 5839}, +{0, 67864, 5832}, +{0, 67565, 5817}, +{0, 67381, 5813}, +{0, 67659, 5813}, +{0, 67756, 5819}, +{0, 67225, 5809}, +{0, 66788, 5813}, +{0, 66727, 5810}, +{0, 66886, 5812}, +{0, 67216, 5828}, +{0, 67493, 5832}, +{0, 67616, 5831}, +{0, 67729, 5828}, +{0, 67878, 5821}, +{0, 68146, 5828}, +{0, 68091, 5833}, +{0, 67867, 5838}, +{0, 68003, 5833}, +{0, 68079, 5834}, +{0, 67937, 5828}, +{0, 67850, 5834}, +{0, 67800, 5833}, +{0, 67676, 5819}, +{0, 67331, 5828}, +{0, 66976, 5818}, +{0, 66549, 5813}, +{0, 65528, 5792}, +{0, 64550, 5784}, +{0, 63974, 5792}, +{0, 63567, 5775}, +{0, 63210, 5783}, +{0, 63037, 5785}, +{0, 63024, 5771}, +{0, 62869, 5789}, +{0, 62621, 5779}, +{0, 62435, 5776}, +{0, 62339, 5775}, +{0, 61775, 5769}, +{0, 61353, 5765}, +{0, 61326, 5760}, +{0, 61299, 5772}, +{0, 61406, 5767}, +{0, 61483, 5767}, +{0, 61587, 5776}, +{0, 61659, 5764}, +{0, 61663, 5775}, +{0, 61582, 5779}, +{0, 61102, 5767}, +{0, 60299, 5770}, +{0, 59889, 5750}, +{0, 59580, 5755}, +{0, 59491, 5756}, +{0, 59531, 5760}, +{0, 59514, 5756}, +{0, 59516, 5766}, +{0, 59580, 5769}, +{0, 59621, 5763}, +{0, 59592, 5770}, +{0, 59062, 5761}, +{0, 58561, 5749}, +{0, 58431, 5756}, +{0, 58411, 5751}, +{0, 58573, 5750}, +{0, 58764, 5749}, +{0, 58822, 5753}, +{0, 58958, 5756}, +{0, 58950, 5749}, +{0, 58893, 5751}, +{0, 58397, 5752}, +{0, 57606, 5737}, +{0, 57424, 5743}, +{0, 57486, 5744}, +{0, 57633, 5747}, +{0, 57848, 5741}, +{0, 58040, 5749}, +{0, 58217, 5757}, +{0, 58392, 5764}, +{0, 58635, 5751}, +{0, 58852, 5764}, +{0, 58597, 5767}, +{0, 58185, 5757}, +{0, 58137, 5756}, +{0, 58330, 5762}, +{0, 58589, 5770}, +{0, 58916, 5764}, +{0, 59214, 5765}, +{0, 59515, 5769}, +{0, 59834, 5779}, +{0, 60227, 5769}, +{0, 60469, 5777}, +{0, 59967, 5764}, +{0, 59520, 5759}, +{0, 59356, 5752}, +{0, 59217, 5761}, +{0, 59071, 5750}, +{0, 59034, 5751}, +{0, 59003, 5744}, +{0, 58991, 5752}, +{0, 58937, 5750}, +{0, 58924, 5748}, +{0, 58454, 5738}, +{0, 58087, 5738}, +{0, 58107, 5734}, +{0, 58230, 5745}, +{0, 58340, 5740}, +{0, 58388, 5737}, +{0, 58381, 5745}, +{0, 58354, 5728}, +{0, 58366, 5737}, +{0, 58590, 5741}, +{0, 58713, 5734}, +{0, 58377, 5737}, +{0, 58177, 5748}, +{0, 58197, 5749}, +{0, 58062, 5748}, +{0, 57978, 5741}, +{0, 57882, 5752}, +{0, 57678, 5731}, +{0, 57587, 5724}, +{0, 57539, 5726}, +{0, 57666, 5733}, +{0, 57404, 5729}, +{0, 56725, 5725}, +{0, 56332, 5715}, +{0, 56194, 5713}, +{0, 56214, 5723}, +{0, 56322, 5732}, +{0, 56364, 5712}, +{0, 56641, 5722}, +{0, 57064, 5729}, +{0, 57575, 5739}, +{0, 57817, 5747}, +{0, 57687, 5748}, +{0, 57893, 5775}, +{0, 58419, 5768}, +{0, 58955, 5779}, +{0, 59378, 5779}, +{0, 59833, 5787}, +{0, 60090, 5779}, +{0, 60183, 5782}, +{0, 60170, 5779}, +{0, 60060, 5773}, +{0, 59675, 5754}, +{0, 59371, 5761}, +{0, 59183, 5759}, +{0, 59076, 5766}, +{0, 59091, 5759}, +{0, 59158, 5763}, +{0, 59216, 5767}, +{0, 59323, 5768}, +{0, 59399, 5748}, +{0, 59512, 5755}, +{0, 59429, 5746}, +{0, 59066, 5752}, +{0, 58959, 5743}, +{0, 59186, 5754}, +{0, 59638, 5765}, +{0, 60181, 5784}, +{0, 60936, 5800}, +{0, 61657, 5809}, +{0, 62331, 5817}, +{0, 62850, 5829}, +{0, 63079, 5819}, +{0, 62691, 5803}, +{0, 62403, 5797}, +{0, 62247, 5786}, +{0, 62108, 5783}, +{0, 61555, 5762}, +{0, 61147, 5759}, +{0, 61019, 5762}, +{0, 61070, 5766}, +{0, 61315, 5766}, +{0, 61772, 5788}, +{0, 61988, 5776}, +{0, 62173, 5791}, +{0, 62663, 5803}, +{0, 63542, 5812}, +{0, 64690, 5832}, +{0, 66229, 5843}, +{0, 67894, 5855}, +{0, 69538, 5866}, +{0, 71053, 5877}, +{0, 72442, 5889}, +{0, 73620, 5884}, +{0, 74230, 5880}, +{0, 74560, 5873}, +{0, 74737, 5875}, +{0, 74832, 5874}, +{0, 74956, 5873}, +{0, 74951, 5864}, +{0, 74822, 5857}, +{0, 74693, 5866}, +{0, 74461, 5861}, +{0, 74480, 5857}, +{0, 74253, 5856}, +{0, 74028, 5859}, +{0, 74087, 5863}, +{0, 74329, 5869}, +{0, 74604, 5869}, +{0, 74985, 5872}, +{0, 75312, 5874}, +{0, 75745, 5877}, +{0, 76194, 5893}, +{0, 76682, 5889}, +{0, 76737, 5877}, +{0, 76508, 5883}, +{0, 76662, 5895}, +{0, 76768, 5873}, +{0, 76785, 5878}, +{0, 76680, 5875}, +{0, 76524, 5863}, +{0, 76236, 5869}, +{0, 75933, 5864}, +{0, 75706, 5864}, +{0, 75246, 5848}, +{0, 74109, 5834}, +{0, 73140, 5829}, +{0, 72645, 5818}, +{0, 72371, 5817}, +{0, 72475, 5824}, +{0, 72654, 5823}, +{0, 72765, 5830}, +{0, 72691, 5835}, +{0, 72530, 5832}, +{0, 72256, 5837}, +{0, 71277, 5825}, +{0, 70128, 5815}, +{0, 69529, 5806}, +{0, 69262, 5810}, +{0, 69252, 5816}, +{0, 69429, 5813}, +{0, 69521, 5814}, +{0, 69398, 5808}, +{0, 69071, 5809}, +{0, 68771, 5810}, +{0, 68021, 5803}, +{0, 66642, 5792}, +{0, 65608, 5774}, +{0, 65018, 5777}, +{0, 64687, 5772}, +{0, 64674, 5762}, +{0, 65014, 5768}, +{0, 65759, 5787}, +{0, 66432, 5799}, +{0, 66646, 5787}, +{0, 67223, 5804}, +{0, 67929, 5815}, +{0, 68566, 5820}, +{0, 69257, 5830}, +{0, 69328, 5843}, +{0, 68808, 5829}, +{0, 68356, 5832}, +{0, 67702, 5829}, +{0, 67236, 5818}, +{0, 67059, 5822}, +{0, 67074, 5812}, +{0, 66592, 5811}, +{0, 66123, 5826}, +{0, 65668, 5814}, +{0, 65264, 5805}, +{0, 64861, 5811}, +{0, 64532, 5808}, +{0, 64333, 5818}, +{0, 64260, 5824}, +{0, 64172, 5831}, +{0, 64121, 5830}, +{0, 63886, 5824}, +{0, 63395, 5839}, +{0, 63283, 5831}, +{0, 63627, 5836}, +{0, 64740, 5851}, +{0, 66508, 5878}, +{0, 68738, 5908}, +{0, 70560, 5895}, +{0, 71276, 5922}, +{0, 72054, 5922}, +{0, 72124, 5912}, +{0, 71485, 5917}, +{0, 71691, 5902}, +{0, 70895, 5857}, +{0, 70368, 5851}, +{0, 70082, 5845}, +{0, 69925, 5843}, +{0, 69905, 5847}, +{0, 69942, 5852}, +{0, 70040, 5841}, +{0, 69994, 5837}, +{0, 69472, 5839}, +{0, 69057, 5846}, +{0, 68970, 5842}, +{0, 69231, 5851}, +{0, 69660, 5851}, +{0, 70155, 5869}, +{0, 70734, 5875}, +{0, 71378, 5881}, +{0, 72055, 5891}, +{0, 72588, 5879}, +{0, 72942, 5898}, +{0, 72781, 5882}, +{0, 73013, 5897}, +{0, 73351, 5887}, +{0, 73884, 5902}, +{0, 74289, 5901}, +{0, 74571, 5887}, +{0, 74683, 5891}, +{0, 74872, 5906}, +{0, 75047, 5900}, +{0, 74844, 5905}, +{0, 74167, 5891}, +{0, 73993, 5890}, +{0, 74094, 5896}, +{0, 74312, 5888}, +{0, 74558, 5894}, +{0, 74754, 5885}, +{0, 74920, 5899}, +{0, 75189, 5895}, +{0, 75489, 5888}, +{0, 75178, 5893}, +{0, 74596, 5882}, +{0, 74433, 5879}, +{0, 74408, 5886}, +{0, 74345, 5884}, +{0, 74341, 5877}, +{0, 74239, 5877}, +{0, 74135, 5869}, +{0, 74031, 5869}, +{0, 73905, 5879}, +{0, 73164, 5860}, +{0, 72268, 5851}, +{0, 71838, 5867}, +{0, 71706, 5854}, +{0, 71727, 5861}, +{0, 71907, 5857}, +{0, 72125, 5872}, +{0, 72408, 5868}, +{0, 72895, 5877}, +{0, 73338, 5881}, +{0, 73321, 5878}, +{0, 72919, 5878}, +{0, 72972, 5873}, +{0, 73083, 5870}, +{0, 73309, 5878}, +{0, 73530, 5869}, +{0, 73618, 5872}, +{0, 73596, 5885}, +{0, 73587, 5864}, +{0, 73547, 5868}, +{0, 73019, 5858}, +{0, 72151, 5853}, +{0, 71781, 5846}, +{0, 71687, 5852}, +{0, 71796, 5853}, +{0, 71949, 5857}, +{0, 72062, 5857}, +{0, 72167, 5856}, +{0, 72338, 5863}, +{0, 72655, 5873}, +{0, 72417, 5856}, +{0, 71948, 5861}, +{0, 71695, 5852}, +{0, 71640, 5850}, +{0, 71668, 5853}, +{0, 71761, 5849}, +{0, 71731, 5851}, +{0, 71692, 5849}, +{0, 71601, 5835}, +{0, 71472, 5843}, +{0, 70814, 5831}, +{0, 69756, 5818}, +{0, 69035, 5816}, +{0, 68569, 5805}, +{0, 68414, 5808}, +{0, 68345, 5801}, +{0, 68178, 5804}, +{0, 67999, 5794}, +{0, 67861, 5810}, +{0, 67663, 5807}, +{0, 66724, 5808}, +{0, 65861, 5795}, +{0, 65417, 5801}, +{0, 65260, 5785}, +{0, 65332, 5793}, +{0, 65283, 5795}, +{0, 64988, 5792}, +{0, 64675, 5786}, +{0, 64347, 5788}, +{0, 63951, 5783}, +{0, 62852, 5765}, +{0, 61867, 5770}, +{0, 61368, 5769}, +{0, 61239, 5778}, +{0, 61486, 5767}, +{0, 61988, 5774}, +{0, 62632, 5799}, +{0, 63408, 5796}, +{0, 64151, 5805}, +{0, 64517, 5813}, +{0, 63974, 5807}, +{0, 63699, 5805}, +{0, 63722, 5807}, +{0, 63989, 5806}, +{0, 64370, 5819}, +{0, 64688, 5805}, +{0, 64879, 5813}, +{0, 65024, 5816}, +{0, 65176, 5815}, +{0, 65004, 5808}, +{0, 64410, 5809}, +{0, 64106, 5817}, +{0, 63971, 5800}, +{0, 63992, 5799}, +{0, 64194, 5820}, +{0, 64332, 5812}, +{0, 64431, 5805}, +{0, 64604, 5800}, +{0, 64817, 5813}, +{0, 64292, 5806}, +{0, 63632, 5795}, +{0, 63383, 5804}, +{0, 63220, 5796}, +{0, 63175, 5793}, +{0, 63247, 5796}, +{0, 63233, 5804}, +{0, 63277, 5804}, +{0, 63287, 5797}, +{0, 63344, 5799}, +{0, 62868, 5787}, +{0, 62286, 5785}, +{0, 62076, 5784}, +{0, 62090, 5775}, +{0, 62301, 5781}, +{0, 62520, 5784}, +{0, 62761, 5789}, +{0, 62998, 5788}, +{0, 63236, 5788}, +{0, 63448, 5790}, +{0, 62970, 5788}, +{0, 62468, 5779}, +{0, 62254, 5775}, +{0, 62212, 5777}, +{0, 62281, 5775}, +{0, 62401, 5772}, +{0, 62447, 5780}, +{0, 62508, 5773}, +{0, 62578, 5768}, +{0, 62634, 5771}, +{0, 62224, 5761}, +{0, 61786, 5764}, +{0, 61571, 5758}, +{0, 61532, 5764}, +{0, 61525, 5764}, +{0, 61630, 5759}, +{0, 61746, 5766}, +{0, 61978, 5764}, +{0, 62241, 5771}, +{0, 62393, 5766}, +{0, 62041, 5760}, +{0, 61717, 5759}, +{0, 61744, 5750}, +{0, 61798, 5768}, +{0, 61958, 5764}, +{0, 62164, 5765}, +{0, 62281, 5764}, +{0, 62350, 5759}, +{0, 62417, 5768}, +{0, 62321, 5760}, +{0, 61874, 5756}, +{0, 61570, 5763}, +{0, 61516, 5769}, +{0, 61562, 5749}, +{0, 61738, 5742}, +{0, 61918, 5758}, +{0, 62105, 5751}, +{0, 62273, 5760}, +{0, 62529, 5749}, +{0, 62418, 5747}, +{0, 62035, 5750}, +{0, 61840, 5746}, +{0, 61803, 5759}, +{0, 61857, 5757}, +{0, 62023, 5745}, +{0, 62152, 5746}, +{0, 62293, 5747}, +{0, 62456, 5754}, +{0, 62602, 5756}, +{0, 62479, 5760}, +{0, 62059, 5758}, +{0, 61748, 5763}, +{0, 61755, 5754}, +{0, 62085, 5762}, +{0, 62519, 5778}, +{0, 63003, 5785}, +{0, 63486, 5788}, +{0, 63995, 5786}, +{0, 64508, 5784}, +{0, 64561, 5794}, +{0, 64397, 5786}, +{0, 64457, 5788}, +{0, 64575, 5796}, +{0, 64673, 5792}, +{0, 64803, 5785}, +{0, 64980, 5778}, +{0, 65071, 5783}, +{0, 65174, 5780}, +{0, 65294, 5781}, +{0, 65023, 5777}, +{0, 64700, 5781}, +{0, 64722, 5794}, +{0, 64954, 5779}, +{0, 65308, 5796}, +{0, 65654, 5803}, +{0, 66008, 5808}, +{0, 66386, 5811}, +{0, 66740, 5810}, +{0, 67062, 5798}, +{0, 66763, 5791}, +{0, 66183, 5779}, +{0, 65919, 5783}, +{0, 65646, 5777}, +{0, 65664, 5776}, +{0, 65711, 5785}, +{0, 65683, 5773}, +{0, 65671, 5785}, +{0, 65738, 5774}, +{0, 65819, 5787}, +{0, 65451, 5779}, +{0, 65118, 5771}, +{0, 65027, 5774}, +{0, 65271, 5782}, +{0, 65605, 5789}, +{0, 65948, 5793}, +{0, 66186, 5783}, +{0, 66328, 5788}, +{0, 66427, 5789}, +{0, 66466, 5792}, +{0, 65897, 5776}, +{0, 65270, 5771}, +{0, 64912, 5764}, +{0, 64731, 5766}, +{0, 64702, 5767}, +{0, 64758, 5761}, +{0, 64787, 5759}, +{0, 64938, 5753}, +{0, 65112, 5759}, +{0, 65230, 5762}, +{0, 65048, 5765}, +{0, 64882, 5767}, +{0, 64873, 5778}, +{0, 65103, 5769}, +{0, 65276, 5784}, +{0, 65464, 5784}, +{0, 65575, 5772}, +{0, 65649, 5774}, +{0, 65761, 5780}, +{0, 65777, 5775}, +{0, 65414, 5770}, +{0, 65099, 5769}, +{0, 65000, 5764}, +{0, 65025, 5770}, +{0, 65040, 5759}, +{0, 65073, 5765}, +{0, 65220, 5765}, +{0, 65406, 5760}, +{0, 65631, 5766}, +{0, 65865, 5770}, +{0, 65764, 5769}, +{0, 65743, 5777}, +{0, 65831, 5778}, +{0, 65952, 5775}, +{0, 66226, 5781}, +{0, 66401, 5784}, +{0, 66447, 5791}, +{0, 66398, 5780}, +{0, 66371, 5779}, +{0, 66423, 5780}, +{0, 66029, 5771}, +{0, 65662, 5765}, +{0, 65568, 5775}, +{0, 65594, 5771}, +{0, 65686, 5774}, +{0, 65890, 5776}, +{0, 66024, 5787}, +{0, 66182, 5775}, +{0, 66399, 5779}, +{0, 66569, 5771}, +{0, 66266, 5783}, +{0, 66114, 5786}, +{0, 66074, 5772}, +{0, 66060, 5784}, +{0, 66115, 5785}, +{0, 66105, 5783}, +{0, 66012, 5780}, +{0, 65946, 5782}, +{0, 65920, 5778}, +{0, 65734, 5790}, +{0, 65300, 5771}, +{0, 65110, 5768}, +{0, 65090, 5767}, +{0, 65144, 5777}, +{0, 65246, 5773}, +{0, 65414, 5770}, +{0, 65557, 5781}, +{0, 65740, 5768}, +{0, 65934, 5782}, +{0, 65981, 5768}, +{0, 65614, 5770}, +{0, 65409, 5768}, +{0, 65337, 5783}, +{0, 65317, 5779}, +{0, 65347, 5775}, +{0, 65401, 5779}, +{0, 65399, 5776}, +{0, 65420, 5777}, +{0, 65465, 5782}, +{0, 65206, 5776}, +{0, 64708, 5765}, +{0, 64445, 5773}, +{0, 64390, 5759}, +{0, 64474, 5761}, +{0, 64616, 5760}, +{0, 64708, 5766}, +{0, 64787, 5768}, +{0, 64904, 5764}, +{0, 65010, 5760}, +{0, 64665, 5743}, +{0, 64290, 5753}, +{0, 64118, 5758}, +{0, 64036, 5746}, +{0, 64071, 5753}, +{0, 64079, 5771}, +{0, 64008, 5758}, +{0, 63954, 5757}, +{0, 63947, 5762}, +{0, 63745, 5769}, +{0, 63147, 5749}, +{0, 62753, 5751}, +{0, 62511, 5745}, +{0, 62522, 5743}, +{0, 62658, 5738}, +{0, 62850, 5751}, +{0, 63096, 5758}, +{0, 63219, 5764}, +{0, 63397, 5760}, +{0, 63139, 5750}, +{0, 62637, 5742}, +{0, 62332, 5758}, +{0, 62161, 5737}, +{0, 62134, 5744}, +{0, 62162, 5727}, +{0, 62146, 5740}, +{0, 62211, 5742}, +{0, 62268, 5741}, +{0, 62296, 5735}, +{0, 61821, 5727}, +{0, 61329, 5731}, +{0, 61131, 5733}, +{0, 61167, 5723}, +{0, 61340, 5729}, +{0, 61444, 5732}, +{0, 61536, 5734}, +{0, 61631, 5747}, +{0, 61716, 5743}, +{0, 61505, 5735}, +{0, 60787, 5722}, +{0, 60345, 5731}, +{0, 60181, 5741}, +{0, 60248, 5729}, +{0, 60367, 5737}, +{0, 60461, 5731}, +{0, 60632, 5730}, +{0, 60762, 5744}, +{0, 60915, 5718}, +{0, 60493, 5732}, +{0, 60104, 5731}, +{0, 59990, 5723}, +{0, 60105, 5727}, +{0, 60318, 5729}, +{0, 60557, 5738}, +{0, 60774, 5735}, +{0, 60965, 5726}, +{0, 61098, 5739}, +{0, 60909, 5738}, +{0, 60327, 5738}, +{0, 59928, 5732}, +{0, 59877, 5738}, +{0, 59907, 5723}, +{0, 60155, 5737}, +{0, 60278, 5744}, +{0, 60408, 5733}, +{0, 60642, 5738}, +{0, 60747, 5738}, +{0, 60382, 5735}, +{0, 60107, 5730}, +{0, 60189, 5733}, +{0, 60398, 5731}, +{0, 60675, 5735}, +{0, 60925, 5743}, +{0, 61206, 5762}, +{0, 61511, 5754}, +{0, 61864, 5773}, +{0, 61935, 5746}, +{0, 61608, 5752}, +{0, 61605, 5754}, +{0, 61722, 5757}, +{0, 61819, 5756}, +{0, 61935, 5754}, +{0, 62005, 5755}, +{0, 62119, 5737}, +{0, 62356, 5755}, +{0, 62664, 5758}, +{0, 62743, 5758}, +{0, 62874, 5759}, +{0, 63192, 5772}, +{0, 63557, 5776}, +{0, 63993, 5791}, +{0, 64457, 5788}, +{0, 64667, 5808}, +{0, 64672, 5779}, +{0, 64583, 5778}, +{0, 64148, 5768}, +{0, 63687, 5762}, +{0, 63436, 5761}, +{0, 63363, 5751}, +{0, 63396, 5768}, +{0, 63591, 5753}, +{0, 63767, 5756}, +{0, 63919, 5763}, +{0, 64148, 5773}, +{0, 64423, 5776}, +{0, 64354, 5782}, +{0, 64326, 5774}, +{0, 64347, 5775}, +{0, 64417, 5781}, +{0, 64483, 5770}, +{0, 64511, 5768}, +{0, 64398, 5758}, +{0, 64234, 5750}, +{0, 64125, 5749}, +{0, 63702, 5748}, +{0, 63276, 5737}, +{0, 63115, 5742}, +{0, 63116, 5736}, +{0, 63333, 5760}, +{0, 63639, 5754}, +{0, 63971, 5768}, +{0, 64317, 5771}, +{0, 64662, 5779}, +{0, 64835, 5766}, +{0, 64640, 5774}, +{0, 64461, 5762}, +{0, 64329, 5772}, +{0, 64323, 5765}, +{0, 64358, 5771}, +{0, 64365, 5752}, +{0, 64315, 5762}, +{0, 64374, 5760}, +{0, 64409, 5775}, +{0, 64065, 5755}, +{0, 63710, 5764}, +{0, 63622, 5751}, +{0, 63622, 5763}, +{0, 63793, 5758}, +{0, 64031, 5763}, +{0, 64245, 5764}, +{0, 64488, 5756}, +{0, 64749, 5766}, +{0, 64617, 5757}, +{0, 64352, 5759}, +{0, 64136, 5758}, +{0, 64014, 5749}, +{0, 64040, 5754}, +{0, 64046, 5756}, +{0, 64095, 5763}, +{0, 64098, 5755}, +{0, 64138, 5759}, +{0, 63955, 5753}, +{0, 63361, 5760}, +{0, 63008, 5748}, +{0, 62864, 5747}, +{0, 62913, 5756}, +{0, 63108, 5748}, +{0, 63239, 5748}, +{0, 63376, 5747}, +{0, 63590, 5752}, +{0, 63659, 5756}, +{0, 63189, 5736}, +{0, 62855, 5750}, +{0, 62591, 5741}, +{0, 62464, 5747}, +{0, 62395, 5736}, +{0, 62361, 5739}, +{0, 62420, 5746}, +{0, 62539, 5740}, +{0, 62640, 5733}, +{0, 62287, 5744}, +{0, 61802, 5721}, +{0, 61712, 5732}, +{0, 61717, 5734}, +{0, 61936, 5731}, +{0, 62140, 5733}, +{0, 62389, 5746}, +{0, 62592, 5751}, +{0, 62793, 5754}, +{0, 62674, 5743}, +{0, 62331, 5746}, +{0, 62134, 5745}, +{0, 62047, 5740}, +{0, 62065, 5749}, +{0, 62175, 5738}, +{0, 62296, 5762}, +{0, 62479, 5745}, +{0, 62641, 5745}, +{0, 62776, 5754}, +{0, 62507, 5738}, +{0, 62360, 5742}, +{0, 62422, 5746}, +{0, 62578, 5742}, +{0, 62801, 5740}, +{0, 62981, 5744}, +{0, 63075, 5748}, +{0, 63254, 5757}, +{0, 63363, 5748}, +{0, 63030, 5745}, +{0, 62689, 5741}, +{0, 62470, 5740}, +{0, 62370, 5744}, +{0, 62403, 5750}, +{0, 62483, 5742}, +{0, 62575, 5738}, +{0, 62695, 5745}, +{0, 63069, 5756}, +{0, 63296, 5751}, +{0, 63314, 5749}, +{0, 63217, 5758}, +{0, 63309, 5760}, +{0, 63452, 5758}, +{0, 63635, 5744}, +{0, 63826, 5756}, +{0, 63935, 5759}, +{0, 63999, 5757}, +{0, 63655, 5750}, +{0, 63351, 5755}, +{0, 63208, 5745}, +{0, 63206, 5748}, +{0, 63277, 5749}, +{0, 63469, 5753}, +{0, 63729, 5755}, +{0, 63966, 5764}, +{0, 64137, 5752}, +{0, 64112, 5757}, +{0, 63987, 5759}, +{0, 63732, 5781}, +{0, 63601, 5766}, +{0, 63678, 5769}, +{0, 63797, 5772}, +{0, 63884, 5769}, +{0, 63884, 5768}, +{0, 63918, 5761}, +{0, 63836, 5765}, +{0, 63581, 5762}, +{0, 63400, 5760}, +{0, 63287, 5760}, +{0, 63299, 5762}, +{0, 63377, 5759}, +{0, 63602, 5756}, +{0, 63770, 5753}, +{0, 64167, 5770}, +{0, 64532, 5774}, +{0, 64516, 5779}, +{0, 64481, 5769}, +{0, 64437, 5773}, +{0, 64521, 5778}, +{0, 64509, 5767}, +{0, 64520, 5778}, +{0, 64447, 5777}, +{0, 64397, 5770}, +{0, 64370, 5765}, +{0, 64160, 5768}, +{0, 63821, 5759}, +{0, 63573, 5761}, +{0, 63482, 5763}, +{0, 63505, 5757}, +{0, 63565, 5761}, +{0, 63695, 5755}, +{0, 63855, 5770}, +{0, 63950, 5762}, +{0, 63716, 5763}, +{0, 63219, 5762}, +{0, 62846, 5748}, +{0, 62658, 5752}, +{0, 62592, 5761}, +{0, 62540, 5735}, +{0, 62563, 5750}, +{0, 62569, 5757}, +{0, 62628, 5747}, +{0, 62420, 5743}, +{0, 61910, 5741}, +{0, 61690, 5742}, +{0, 61672, 5757}, +{0, 61870, 5747}, +{0, 62132, 5740}, +{0, 62472, 5755}, +{0, 62911, 5765}, +{0, 63297, 5773}, +{0, 63437, 5765}, +{0, 63107, 5773}, +{0, 63006, 5772}, +{0, 62997, 5769}, +{0, 62962, 5762}, +{0, 63064, 5765}, +{0, 63159, 5763}, +{0, 63242, 5770}, +{0, 63358, 5761}, +{0, 63449, 5761}, +{0, 63321, 5766}, +{0, 63150, 5761}, +{0, 63133, 5762}, +{0, 63367, 5782}, +{0, 63649, 5759}, +{0, 64041, 5781}, +{0, 64376, 5779}, +{0, 64717, 5792}, +{0, 65015, 5789}, +{0, 64825, 5787}, +{0, 64526, 5781}, +{0, 64226, 5784}, +{0, 64006, 5777}, +{0, 63941, 5784}, +{0, 64014, 5776}, +{0, 64072, 5789}, +{0, 64077, 5770}, +{0, 64241, 5770}, +{0, 64040, 5772}, +{0, 63628, 5763}, +{0, 63414, 5762}, +{0, 63471, 5768}, +{0, 63684, 5773}, +{0, 63888, 5776}, +{0, 64024, 5770}, +{0, 64124, 5775}, +{0, 64260, 5777}, +{0, 64026, 5763}, +{0, 63414, 5776}, +{0, 62978, 5760}, +{0, 62713, 5760}, +{0, 62586, 5756}, +{0, 62588, 5743}, +{0, 62620, 5759}, +{0, 62765, 5748}, +{0, 62946, 5760}, +{0, 62902, 5754}, +{0, 62456, 5748}, +{0, 62211, 5749}, +{0, 62172, 5759}, +{0, 62189, 5746}, +{0, 62341, 5764}, +{0, 62470, 5762}, +{0, 62529, 5759}, +{0, 62579, 5764}, +{0, 62535, 5747}, +{0, 61983, 5739}, +{0, 61407, 5751}, +{0, 61151, 5747}, +{0, 61085, 5743}, +{0, 61183, 5736}, +{0, 61289, 5736}, +{0, 61472, 5737}, +{0, 61717, 5748}, +{0, 61983, 5754}, +{0, 61816, 5744}, +{0, 61361, 5754}, +{0, 61275, 5736}, +{0, 61235, 5741}, +{0, 61351, 5747}, +{0, 61462, 5755}, +{0, 61521, 5754}, +{0, 61551, 5747}, +{0, 61576, 5754}, +{0, 61585, 5764}, +{0, 61220, 5745}, +{0, 60991, 5743}, +{0, 61000, 5747}, +{0, 61196, 5740}, +{0, 61561, 5753}, +{0, 61866, 5754}, +{0, 62172, 5747}, +{0, 62484, 5759}, +{0, 62803, 5768}, +{0, 62628, 5752}, +{0, 62286, 5766}, +{0, 62272, 5762}, +{0, 62382, 5767}, +{0, 62551, 5763}, +{0, 62704, 5758}, +{0, 62756, 5755}, +{0, 62805, 5769}, +{0, 62874, 5762}, +{0, 62686, 5758}, +{0, 62017, 5756}, +{0, 61656, 5755}, +{0, 61481, 5747}, +{0, 61410, 5752}, +{0, 61404, 5751}, +{0, 61426, 5754}, +{0, 61636, 5756}, +{0, 61908, 5752}, +{0, 62211, 5760}, +{0, 62010, 5755}, +{0, 61685, 5756}, +{0, 61541, 5749}, +{0, 61511, 5746}, +{0, 61593, 5757}, +{0, 61610, 5760}, +{0, 61607, 5762}, +{0, 61511, 5753}, +{0, 61551, 5748}, +{0, 61497, 5747}, +{0, 61484, 5748}, +{0, 61526, 5750}, +{0, 61645, 5739}, +{0, 61786, 5751}, +{0, 62042, 5756}, +{0, 62390, 5757}, +{0, 62832, 5771}, +{0, 63289, 5769}, +{0, 63709, 5784}, +{0, 63647, 5782}, +{0, 63323, 5767}, +{0, 63181, 5771}, +{0, 63174, 5771}, +{0, 63162, 5763}, +{0, 63154, 5768}, +{0, 63011, 5762}, +{0, 63026, 5759}, +{0, 63142, 5753}, +{0, 62934, 5757}, +{0, 62515, 5760}, +{0, 62312, 5757}, +{0, 62297, 5754}, +{0, 62433, 5751}, +{0, 62682, 5754}, +{0, 62858, 5770}, +{0, 63028, 5755}, +{0, 63303, 5764}, +{0, 63398, 5755}, +{0, 62993, 5757}, +{0, 62608, 5753}, +{0, 62458, 5751}, +{0, 62346, 5743}, +{0, 62280, 5754}, +{0, 62242, 5763}, +{0, 62303, 5758}, +{0, 62358, 5765}, +{0, 62472, 5752}, +{0, 62424, 5752}, +{0, 62311, 5755}, +{0, 62270, 5752}, +{0, 62418, 5742}, +{0, 62654, 5760}, +{0, 62962, 5759}, +{0, 63310, 5777}, +{0, 63590, 5766}, +{0, 63899, 5772}, +{0, 64095, 5770}, +{0, 63684, 5757}, +{0, 63343, 5759}, +{0, 63230, 5759}, +{0, 63190, 5761}, +{0, 63277, 5762}, +{0, 63404, 5762}, +{0, 63526, 5775}, +{0, 63639, 5768}, +{0, 63752, 5771}, +{0, 63594, 5767}, +{0, 63147, 5760}, +{0, 62958, 5761}, +{0, 63029, 5754}, +{0, 63132, 5751}, +{0, 63350, 5763}, +{0, 63580, 5762}, +{0, 63728, 5762}, +{0, 63925, 5768}, +{0, 63941, 5769}, +{0, 63374, 5768}, +{0, 63028, 5750}, +{0, 62776, 5750}, +{0, 62640, 5756}, +{0, 62609, 5752}, +{0, 62681, 5755}, +{0, 62738, 5758}, +{0, 62820, 5763}, +{0, 62920, 5766}, +{0, 62639, 5759}, +{0, 62154, 5747}, +{0, 61864, 5743}, +{0, 61888, 5754}, +{0, 61960, 5753}, +{0, 62239, 5756}, +{0, 62466, 5758}, +{0, 62673, 5744}, +{0, 62900, 5764}, +{0, 62949, 5756}, +{0, 62397, 5750}, +{0, 61978, 5739}, +{0, 61755, 5753}, +{0, 61742, 5750}, +{0, 61845, 5753}, +{0, 62054, 5757}, +{0, 62186, 5766}, +{0, 62475, 5747}, +{0, 62930, 5770}, +{0, 63060, 5779}, +{0, 63022, 5779}, +{0, 63195, 5789}, +{0, 63697, 5783}, +{0, 64224, 5793}, +{0, 64910, 5810}, +{0, 65466, 5818}, +{0, 65995, 5809}, +{0, 66372, 5816}, +{0, 66701, 5813}, +{0, 66300, 5808}, +{0, 65946, 5809}, +{0, 65914, 5801}, +{0, 66021, 5804}, +{0, 66248, 5800}, +{0, 66482, 5807}, +{0, 66756, 5813}, +{0, 67131, 5814}, +{0, 67588, 5818}, +{0, 67899, 5825}, +{0, 67683, 5829}, +{0, 67813, 5826}, +{0, 68164, 5831}, +{0, 68446, 5820}, +{0, 68572, 5827}, +{0, 68717, 5829}, +{0, 68651, 5818}, +{0, 68414, 5813}, +{0, 67988, 5809}, +{0, 66941, 5788}, +{0, 65900, 5771}, +{0, 65298, 5767}, +{0, 64972, 5767}, +{0, 64967, 5779}, +{0, 65180, 5779}, +{0, 65468, 5791}, +{0, 65798, 5789}, +{0, 66108, 5798}, +{0, 66179, 5801}, +{0, 65593, 5790}, +{0, 65138, 5785}, +{0, 64874, 5788}, +{0, 64714, 5776}, +{0, 64530, 5775}, +{0, 64268, 5760}, +{0, 63955, 5763}, +{0, 63708, 5756}, +{0, 63417, 5753}, +{0, 62657, 5751}, +{0, 61682, 5742}, +{0, 61233, 5736}, +{0, 61069, 5742}, +{0, 61310, 5746}, +{0, 61715, 5746}, +{0, 62000, 5746}, +{0, 62230, 5752}, +{0, 62449, 5757}, +{0, 62507, 5774}, +{0, 61654, 5746}, +{0, 60821, 5744}, +{0, 60387, 5737}, +{0, 59880, 5735}, +{0, 59496, 5728}, +{0, 59358, 5732}, +{0, 59354, 5723}, +{0, 59329, 5742}, +{0, 59331, 5737}, +{0, 59350, 5734}, +{0, 58819, 5728}, +{0, 58525, 5740}, +{0, 58515, 5728}, +{0, 58705, 5738}, +{0, 59026, 5744}, +{0, 59270, 5742}, +{0, 59452, 5751}, +{0, 59545, 5756}, +{0, 59445, 5766}, +{0, 58818, 5743}, +{0, 58052, 5742}, +{0, 57569, 5734}, +{0, 57291, 5741}, +{0, 57174, 5719}, +{0, 57123, 5728}, +{0, 57029, 5735}, +{0, 57037, 5725}, +{0, 57128, 5732}, +{0, 57275, 5739}, +{0, 57110, 5733}, +{0, 56866, 5719}, +{0, 56784, 5736}, +{0, 56829, 5726}, +{0, 56994, 5735}, +{0, 57163, 5734}, +{0, 57203, 5731}, +{0, 57254, 5731}, +{0, 57384, 5735}, +{0, 57097, 5737}, +{0, 56576, 5730}, +{0, 56363, 5713}, +{0, 56377, 5712}, +{0, 56788, 5709}, +{0, 57322, 5724}, +{0, 57840, 5728}, +{0, 58287, 5746}, +{0, 58599, 5765}, +{0, 58873, 5755}, +{0, 58992, 5759}, +{0, 59133, 5769}, +{0, 59547, 5776}, +{0, 59909, 5776}, +{0, 60181, 5785}, +{0, 60555, 5793}, +{0, 61020, 5794}, +{0, 61340, 5797}, +{0, 61674, 5807}, +{0, 62036, 5793}, +{0, 61854, 5794}, +{0, 61705, 5814}, +{0, 61585, 5800}, +{0, 61722, 5805}, +{0, 62005, 5809}, +{0, 62302, 5810}, +{0, 62595, 5805}, +{0, 62918, 5820}, +{0, 63313, 5820}, +{0, 63635, 5831}, +{0, 63577, 5836}, +{0, 63674, 5823}, +{0, 64003, 5819}, +{0, 64328, 5816}, +{0, 64621, 5828}, +{0, 64843, 5829}, +{0, 64937, 5817}, +{0, 65114, 5801}, +{0, 65204, 5813}, +{0, 64832, 5809}, +{0, 64433, 5810}, +{0, 64394, 5802}, +{0, 64461, 5801}, +{0, 64496, 5809}, +{0, 64595, 5796}, +{0, 64774, 5791}, +{0, 65024, 5797}, +{0, 65207, 5801}, +{0, 65222, 5796}, +{0, 64850, 5784}, +{0, 64501, 5796}, +{0, 64304, 5796}, +{0, 64228, 5791}, +{0, 64207, 5780}, +{0, 64083, 5781}, +{0, 63955, 5779}, +{0, 63836, 5782}, +{0, 63848, 5786}, +{0, 63637, 5773}, +{0, 63210, 5761}, +{0, 62985, 5764}, +{0, 63039, 5767}, +{0, 63197, 5760}, +{0, 63341, 5778}, +{0, 63544, 5769}, +{0, 63739, 5767}, +{0, 63995, 5772}, +{0, 64323, 5767}, +{0, 64049, 5771}, +{0, 63642, 5765}, +{0, 63411, 5776}, +{0, 63356, 5765}, +{0, 63354, 5760}, +{0, 63317, 5751}, +{0, 63314, 5766}, +{0, 63295, 5763}, +{0, 63400, 5766}, +{0, 63437, 5758}, +{0, 63369, 5753}, +{0, 63327, 5767}, +{0, 63399, 5759}, +{0, 63467, 5750}, +{0, 63522, 5749}, +{0, 63643, 5760}, +{0, 63746, 5760}, +{0, 63901, 5755}, +{0, 63995, 5758}, +{0, 63701, 5752}, +{0, 63011, 5745}, +{0, 62404, 5752}, +{0, 62038, 5750}, +{0, 61801, 5749}, +{0, 61751, 5745}, +{0, 61743, 5751}, +{0, 61793, 5749}, +{0, 61898, 5745}, +{0, 62023, 5747}, +{0, 61989, 5745}, +{0, 61826, 5761}, +{0, 61562, 5750}, +{0, 61468, 5744}, +{0, 61576, 5749}, +{0, 61709, 5746}, +{0, 61772, 5750}, +{0, 61894, 5748}, +{0, 62009, 5755}, +{0, 61689, 5750}, +{0, 60954, 5751}, +{0, 60651, 5746}, +{0, 60585, 5749}, +{0, 60813, 5753}, +{0, 61144, 5773}, +{0, 61595, 5769}, +{0, 62118, 5771}, +{0, 62545, 5772}, +{0, 63013, 5782}, +{0, 62921, 5776}, +{0, 62850, 5789}, +{0, 63039, 5782}, +{0, 63403, 5789}, +{0, 63687, 5795}, +{0, 64014, 5791}, +{0, 64196, 5800}, +{0, 64372, 5798}, +{0, 64558, 5792}, +{0, 64607, 5795}, +{0, 64151, 5787}, +{0, 63895, 5787}, +{0, 63954, 5799}, +{0, 64189, 5779}, +{0, 64587, 5797}, +{0, 64970, 5815}, +{0, 65360, 5812}, +{0, 65723, 5796}, +{0, 66100, 5807}, +{0, 65975, 5796}, +{0, 65534, 5808}, +{0, 65351, 5795}, +{0, 65235, 5793}, +{0, 65136, 5783}, +{0, 64956, 5786}, +{0, 64777, 5778}, +{0, 64592, 5776}, +{0, 64480, 5778}, +{0, 64341, 5773}, +{0, 63685, 5778}, +{0, 63290, 5765}, +{0, 63096, 5767}, +{0, 63082, 5765}, +{0, 63151, 5769}, +{0, 63320, 5775}, +{0, 63511, 5790}, +{0, 63711, 5780}, +{0, 63809, 5779}, +{0, 63518, 5773}, +{0, 63015, 5767}, +{0, 62667, 5757}, +{0, 62371, 5760}, +{0, 62291, 5769}, +{0, 62318, 5751}, +{0, 62416, 5759}, +{0, 62491, 5772}, +{0, 62615, 5768}, +{0, 62820, 5780}, +{0, 62766, 5766}, +{0, 62747, 5767}, +{0, 63006, 5772}, +{0, 63298, 5786}, +{0, 63805, 5800}, +{0, 64308, 5792}, +{0, 64580, 5798}, +{0, 64543, 5797}, +{0, 64519, 5794}, +{0, 64231, 5788}, +{0, 63415, 5779}, +{0, 62813, 5780}, +{0, 62529, 5770}, +{0, 62474, 5761}, +{0, 62398, 5768}, +{0, 62397, 5763}, +{0, 62343, 5759}, +{0, 62261, 5762}, +{0, 62380, 5747}, +{0, 62215, 5753}, +{0, 61797, 5751}, +{0, 61596, 5748}, +{0, 61604, 5756}, +{0, 61836, 5762}, +{0, 62020, 5772}, +{0, 62051, 5761}, +{0, 62117, 5753}, +{0, 62315, 5767}, +{0, 62360, 5753}, +{0, 61815, 5764}, +{0, 61413, 5765}, +{0, 61228, 5760}, +{0, 61243, 5763}, +{0, 61355, 5763}, +{0, 61465, 5763}, +{0, 61588, 5761}, +{0, 61827, 5756}, +{0, 62006, 5774}, +{0, 61740, 5766}, +{0, 61107, 5748}, +{0, 60842, 5763}, +{0, 60838, 5763}, +{0, 60879, 5764}, +{0, 60958, 5768}, +{0, 61025, 5765}, +{0, 61060, 5758}, +{0, 61128, 5766}, +{0, 61120, 5766}, +{0, 60481, 5756}, +{0, 59914, 5755}, +{0, 59784, 5756}, +{0, 59777, 5762}, +{0, 59909, 5754}, +{0, 60083, 5757}, +{0, 60273, 5750}, +{0, 60514, 5752}, +{0, 60767, 5765}, +{0, 60808, 5754}, +{0, 60216, 5760}, +{0, 59910, 5738}, +{0, 59901, 5752}, +{0, 60023, 5769}, +{0, 60248, 5747}, +{0, 60533, 5744}, +{0, 60757, 5758}, +{0, 60971, 5770}, +{0, 61228, 5762}, +{0, 61118, 5753}, +{0, 60529, 5747}, +{0, 60192, 5745}, +{0, 60154, 5760}, +{0, 60270, 5749}, +{0, 60504, 5748}, +{0, 60755, 5762}, +{0, 60987, 5762}, +{0, 61232, 5763}, +{0, 61545, 5772}, +{0, 61119, 5764}, +{0, 60678, 5754}, +{0, 60493, 5762}, +{0, 60521, 5758}, +{0, 60591, 5754}, +{0, 60694, 5764}, +{0, 60803, 5757}, +{0, 60882, 5765}, +{0, 61101, 5764}, +{0, 61053, 5762}, +{0, 60476, 5753}, +{0, 60163, 5745}, +{0, 60176, 5754}, +{0, 60286, 5753}, +{0, 60471, 5761}, +{0, 60597, 5762}, +{0, 60765, 5750}, +{0, 60997, 5761}, +{0, 61186, 5760}, +{0, 61057, 5762}, +{0, 60504, 5741}, +{0, 60319, 5755}, +{0, 60354, 5755}, +{0, 60391, 5750}, +{0, 60439, 5751}, +{0, 60638, 5759}, +{0, 60767, 5754}, +{0, 60935, 5758}, +{0, 61126, 5760}, +{0, 60949, 5745}, +{0, 60527, 5750}, +{0, 60443, 5760}, +{0, 60562, 5750}, +{0, 60801, 5748}, +{0, 61128, 5754}, +{0, 61414, 5750}, +{0, 61637, 5757}, +{0, 61799, 5764}, +{0, 61925, 5765}, +{0, 61318, 5750}, +{0, 60805, 5743}, +{0, 60637, 5753}, +{0, 60530, 5749}, +{0, 60663, 5751}, +{0, 60765, 5756}, +{0, 60836, 5761}, +{0, 61034, 5764}, +{0, 61247, 5756}, +{0, 61305, 5746}, +{0, 60906, 5748}, +{0, 60653, 5750}, +{0, 60763, 5755}, +{0, 60995, 5751}, +{0, 61257, 5750}, +{0, 61507, 5756}, +{0, 61611, 5763}, +{0, 61801, 5767}, +{0, 62006, 5761}, +{0, 61518, 5762}, +{0, 60908, 5756}, +{0, 60678, 5741}, +{0, 60636, 5741}, +{0, 60638, 5755}, +{0, 60782, 5742}, +{0, 60932, 5749}, +{0, 61152, 5753}, +{0, 61356, 5757}, +{0, 61590, 5752}, +{0, 61185, 5753}, +{0, 60885, 5744}, +{0, 60924, 5749}, +{0, 61051, 5745}, +{0, 61224, 5755}, +{0, 61432, 5758}, +{0, 61663, 5753}, +{0, 61788, 5757}, +{0, 61848, 5763}, +{0, 61655, 5762}, +{0, 61100, 5749}, +{0, 60799, 5753}, +{0, 60930, 5756}, +{0, 61177, 5769}, +{0, 61555, 5760}, +{0, 61857, 5761}, +{0, 62092, 5772}, +{0, 62220, 5776}, +{0, 62445, 5767}, +{0, 62334, 5773}, +{0, 61905, 5771}, +{0, 61789, 5772}, +{0, 61878, 5775}, +{0, 62054, 5771}, +{0, 62205, 5772}, +{0, 62328, 5766}, +{0, 62407, 5769}, +{0, 62495, 5765}, +{0, 62495, 5759}, +{0, 62005, 5761}, +{0, 61616, 5767}, +{0, 61503, 5766}, +{0, 61602, 5758}, +{0, 61782, 5765}, +{0, 61961, 5753}, +{0, 62120, 5769}, +{0, 62290, 5768}, +{0, 62478, 5762}, +{0, 62490, 5762}, +{0, 61913, 5760}, +{0, 61594, 5758}, +{0, 61515, 5765}, +{0, 61640, 5761}, +{0, 61692, 5759}, +{0, 61827, 5755}, +{0, 61797, 5751}, +{0, 61813, 5742}, +{0, 62036, 5745}, +{0, 61561, 5728}, +{0, 61086, 5738}, +{0, 60923, 5739}, +{0, 60929, 5749}, +{0, 61136, 5744}, +{0, 61373, 5761}, +{0, 61605, 5756}, +{0, 61880, 5768}, +{0, 62064, 5774}, +{0, 62169, 5777}, +{0, 61895, 5761}, +{0, 62248, 5790}, +{0, 62649, 5785}, +{0, 63056, 5790}, +{0, 63459, 5794}, +{0, 63755, 5790}, +{0, 63968, 5803}, +{0, 63975, 5787}, +{0, 64034, 5803}, +{0, 63465, 5792}, +{0, 62798, 5789}, +{0, 62708, 5780}, +{0, 62791, 5788}, +{0, 62952, 5778}, +{0, 63170, 5772}, +{0, 63326, 5790}, +{0, 63500, 5789}, +{0, 63731, 5793}, +{0, 63953, 5791}, +{0, 63556, 5791}, +{0, 63278, 5797}, +{0, 63188, 5799}, +{0, 63161, 5783}, +{0, 63197, 5793}, +{0, 63261, 5793}, +{0, 63118, 5795}, +{0, 63035, 5797}, +{0, 62978, 5804}, +{0, 62831, 5781}, +{0, 62288, 5783}, +{0, 61923, 5779}, +{0, 61893, 5786}, +{0, 62082, 5781}, +{0, 62299, 5780}, +{0, 62488, 5772}, +{0, 62663, 5784}, +{0, 62891, 5785}, +{0, 63095, 5783}, +{0, 62599, 5780}, +{0, 62140, 5774}, +{0, 61934, 5768}, +{0, 61857, 5781}, +{0, 61991, 5782}, +{0, 62116, 5770}, +{0, 62133, 5780}, +{0, 62187, 5793}, +{0, 62388, 5779}, +{0, 62226, 5771}, +{0, 61572, 5774}, +{0, 61252, 5767}, +{0, 61281, 5764}, +{0, 61458, 5774}, +{0, 61656, 5776}, +{0, 61844, 5780}, +{0, 62050, 5790}, +{0, 62420, 5782}, +{0, 62644, 5777}, +{0, 62145, 5781}, +{0, 61751, 5780}, +{0, 61625, 5777}, +{0, 61618, 5789}, +{0, 61696, 5782}, +{0, 61788, 5782}, +{0, 61874, 5777}, +{0, 62052, 5785}, +{0, 62266, 5778}, +{0, 62277, 5786}, +{0, 61693, 5772}, +{0, 61435, 5778}, +{0, 61478, 5774}, +{0, 61711, 5764}, +{0, 61963, 5774}, +{0, 62215, 5776}, +{0, 62488, 5775}, +{0, 62743, 5788}, +{0, 63075, 5777}, +{0, 62594, 5783}, +{0, 62240, 5774}, +{0, 62145, 5775}, +{0, 62187, 5777}, +{0, 62278, 5776}, +{0, 62370, 5787}, +{0, 62541, 5776}, +{0, 62705, 5782}, +{0, 62874, 5783}, +{0, 62884, 5776}, +{0, 62389, 5773}, +{0, 62256, 5777}, +{0, 62397, 5768}, +{0, 62622, 5762}, +{0, 62894, 5773}, +{0, 63120, 5786}, +{0, 63277, 5773}, +{0, 63460, 5786}, +{0, 63655, 5783}, +{0, 63108, 5776}, +{0, 62718, 5775}, +{0, 62604, 5767}, +{0, 62563, 5769}, +{0, 62588, 5765}, +{0, 62552, 5769}, +{0, 62597, 5777}, +{0, 62628, 5780}, +{0, 62750, 5772}, +{0, 62529, 5768}, +{0, 61909, 5758}, +{0, 61576, 5762}, +{0, 61491, 5766}, +{0, 61657, 5759}, +{0, 61816, 5770}, +{0, 61928, 5765}, +{0, 62069, 5770}, +{0, 62260, 5770}, +{0, 62413, 5767}, +{0, 61801, 5770}, +{0, 61443, 5760}, +{0, 61378, 5762}, +{0, 61482, 5765}, +{0, 61646, 5765}, +{0, 61804, 5770}, +{0, 61832, 5771}, +{0, 61897, 5765}, +{0, 62009, 5767}, +{0, 61689, 5760}, +{0, 61014, 5750}, +{0, 60775, 5767}, +{0, 60705, 5755}, +{0, 60819, 5763}, +{0, 61163, 5762}, +{0, 61478, 5768}, +{0, 61753, 5764}, +{0, 62056, 5767}, +{0, 62274, 5765}, +{0, 61735, 5768}, +{0, 61425, 5760}, +{0, 61502, 5765}, +{0, 61651, 5762}, +{0, 61912, 5769}, +{0, 62253, 5775}, +{0, 62469, 5770}, +{0, 62734, 5774}, +{0, 62879, 5780}, +{0, 62580, 5783}, +{0, 61939, 5776}, +{0, 61669, 5771}, +{0, 61602, 5767}, +{0, 61671, 5786}, +{0, 61839, 5781}, +{0, 61977, 5771}, +{0, 62185, 5776}, +{0, 62400, 5783}, +{0, 62562, 5778}, +{0, 61962, 5760}, +{0, 61616, 5757}, +{0, 61672, 5776}, +{0, 61838, 5778}, +{0, 62090, 5758}, +{0, 62358, 5772}, +{0, 62582, 5779}, +{0, 62693, 5792}, +{0, 62966, 5791}, +{0, 62697, 5791}, +{0, 62455, 5783}, +{0, 62467, 5769}, +{0, 62605, 5783}, +{0, 62840, 5782}, +{0, 63168, 5786}, +{0, 63532, 5784}, +{0, 63896, 5794}, +{0, 64291, 5805}, +{0, 64758, 5804}, +{0, 64611, 5794}, +{0, 64211, 5797}, +{0, 64158, 5792}, +{0, 64267, 5801}, +{0, 64491, 5802}, +{0, 64811, 5805}, +{0, 65062, 5815}, +{0, 65306, 5812}, +{0, 65441, 5804}, +{0, 65284, 5799}, +{0, 64434, 5774}, +{0, 63854, 5784}, +{0, 63529, 5769}, +{0, 63279, 5760}, +{0, 63190, 5774}, +{0, 63219, 5760}, +{0, 63263, 5769}, +{0, 63351, 5765}, +{0, 63564, 5787}, +{0, 63277, 5774}, +{0, 62796, 5769}, +{0, 62506, 5764}, +{0, 62471, 5767}, +{0, 62562, 5770}, +{0, 62702, 5773}, +{0, 62732, 5769}, +{0, 62756, 5769}, +{0, 62713, 5764}, +{0, 62552, 5751}, +{0, 61826, 5756}, +{0, 61372, 5737}, +{0, 61237, 5751}, +{0, 61209, 5748}, +{0, 61388, 5754}, +{0, 61627, 5755}, +{0, 61730, 5766}, +{0, 61872, 5759}, +{0, 62014, 5754}, +{0, 61843, 5745}, +{0, 61188, 5759}, +{0, 60888, 5747}, +{0, 60594, 5760}, +{0, 60498, 5748}, +{0, 60528, 5757}, +{0, 60562, 5760}, +{0, 60561, 5753}, +{0, 60578, 5761}, +{0, 60557, 5750}, +{0, 59837, 5740}, +{0, 59182, 5725}, +{0, 58867, 5734}, +{0, 58708, 5732}, +{0, 58715, 5737}, +{0, 59117, 5744}, +{0, 59494, 5750}, +{0, 59745, 5759}, +{0, 60013, 5751}, +{0, 60076, 5742}, +{0, 59533, 5746}, +{0, 59173, 5744}, +{0, 59078, 5750}, +{0, 59113, 5750}, +{0, 59176, 5736}, +{0, 59239, 5744}, +{0, 59261, 5742}, +{0, 59241, 5745}, +{0, 59107, 5738}, +{0, 58684, 5723}, +{0, 58056, 5724}, +{0, 58010, 5735}, +{0, 58179, 5725}, +{0, 58548, 5737}, +{0, 59193, 5734}, +{0, 60022, 5738}, +{0, 61146, 5744}, +{0, 62468, 5761}, +{0, 63258, 5771}, +{0, 63210, 5769}, +{0, 63247, 5785}, +{0, 63493, 5783}, +{0, 63955, 5803}, +{0, 64734, 5807}, +{0, 65604, 5823}, +{0, 66555, 5835}, +{0, 67298, 5832}, +{0, 68032, 5844}, +{0, 68529, 5855}, +{0, 68500, 5848}, +{0, 68548, 5838}, +{0, 68630, 5840}, +{0, 68718, 5842}, +{0, 68746, 5839}, +{0, 68648, 5832}, +{0, 68411, 5830}, +{0, 68303, 5823}, +{0, 68230, 5824}, +{0, 67843, 5833}, +{0, 67282, 5807}, +{0, 67002, 5809}, +{0, 66832, 5822}, +{0, 66800, 5821}, +{0, 66781, 5823}, +{0, 66724, 5813}, +{0, 66764, 5822}, +{0, 66858, 5811}, +{0, 67014, 5811}, +{0, 66649, 5821}, +{0, 66162, 5810}, +{0, 65993, 5806}, +{0, 65948, 5800}, +{0, 66044, 5805}, +{0, 66143, 5811}, +{0, 66272, 5808}, +{0, 66337, 5807}, +{0, 66426, 5796}, +{0, 66364, 5809}, +{0, 65737, 5791}, +{0, 65333, 5797}, +{0, 65088, 5803}, +{0, 65079, 5785}, +{0, 65175, 5788}, +{0, 65235, 5798}, +{0, 65320, 5797}, +{0, 65371, 5797}, +{0, 65491, 5798}, +{0, 65058, 5780}, +{0, 64592, 5780}, +{0, 64366, 5793}, +{0, 64345, 5779}, +{0, 64479, 5778}, +{0, 64627, 5785}, +{0, 64727, 5778}, +{0, 64825, 5788}, +{0, 64874, 5782}, +{0, 64721, 5783}, +{0, 63950, 5786}, +{0, 63438, 5779}, +{0, 63242, 5777}, +{0, 63245, 5777}, +{0, 63368, 5781}, +{0, 63546, 5783}, +{0, 63663, 5789}, +{0, 63828, 5786}, +{0, 63995, 5789}, +{0, 63575, 5788}, +{0, 62933, 5784}, +{0, 62672, 5774}, +{0, 62758, 5769}, +{0, 62906, 5767}, +{0, 63141, 5777}, +{0, 63371, 5775}, +{0, 63553, 5780}, +{0, 63762, 5789}, +{0, 63802, 5792}, +{0, 62974, 5774}, +{0, 62377, 5777}, +{0, 62180, 5768}, +{0, 62152, 5770}, +{0, 62287, 5782}, +{0, 62424, 5782}, +{0, 62565, 5777}, +{0, 62763, 5785}, +{0, 62931, 5785}, +{0, 62525, 5779}, +{0, 61871, 5769}, +{0, 61663, 5767}, +{0, 61701, 5765}, +{0, 61877, 5774}, +{0, 62115, 5768}, +{0, 62270, 5775}, +{0, 62541, 5777}, +{0, 62833, 5772}, +{0, 62867, 5769}, +{0, 62178, 5770}, +{0, 61743, 5766}, +{0, 61632, 5765}, +{0, 61631, 5767}, +{0, 61840, 5772}, +{0, 61915, 5773}, +{0, 62116, 5774}, +{0, 62273, 5785}, +{0, 62462, 5782}, +{0, 62189, 5763}, +{0, 61577, 5771}, +{0, 61343, 5765}, +{0, 61373, 5776}, +{0, 61595, 5779}, +{0, 61835, 5772}, +{0, 62136, 5770}, +{0, 62389, 5774}, +{0, 62707, 5767}, +{0, 62890, 5778}, +{0, 62388, 5772}, +{0, 62031, 5768}, +{0, 61919, 5766}, +{0, 62038, 5766}, +{0, 62217, 5767}, +{0, 62342, 5770}, +{0, 62421, 5779}, +{0, 62534, 5775}, +{0, 62860, 5787}, +{0, 62865, 5785}, +{0, 62653, 5787}, +{0, 62773, 5770}, +{0, 63067, 5791}, +{0, 63408, 5789}, +{0, 63896, 5794}, +{0, 64195, 5796}, +{0, 64389, 5795}, +{0, 64516, 5796}, +{0, 64547, 5792}, +{0, 63648, 5790}, +{0, 62962, 5769}, +{0, 62591, 5780}, +{0, 62426, 5771}, +{0, 62464, 5774}, +{0, 62530, 5775}, +{0, 62655, 5774}, +{0, 62848, 5764}, +{0, 63071, 5762}, +{0, 62915, 5775}, +{0, 62279, 5765}, +{0, 62044, 5761}, +{0, 62044, 5760}, +{0, 62180, 5768}, +{0, 62331, 5767}, +{0, 62405, 5779}, +{0, 62539, 5781}, +{0, 62760, 5778}, +{0, 62957, 5778}, +{0, 62434, 5768}, +{0, 61954, 5766}, +{0, 61722, 5762}, +{0, 61691, 5765}, +{0, 61757, 5767}, +{0, 61894, 5758}, +{0, 62029, 5770}, +{0, 62164, 5769}, +{0, 62290, 5776}, +{0, 62143, 5773}, +{0, 61442, 5766}, +{0, 61082, 5754}, +{0, 61039, 5755}, +{0, 61151, 5761}, +{0, 61337, 5762}, +{0, 61538, 5760}, +{0, 61818, 5772}, +{0, 62053, 5768}, +{0, 62239, 5763}, +{0, 61566, 5760}, +{0, 60885, 5753}, +{0, 60757, 5757}, +{0, 60844, 5753}, +{0, 61042, 5757}, +{0, 61332, 5756}, +{0, 61622, 5756}, +{0, 61812, 5770}, +{0, 61931, 5763}, +{0, 61776, 5761}, +{0, 61115, 5756}, +{0, 60638, 5749}, +{0, 60487, 5749}, +{0, 60707, 5761}, +{0, 60958, 5741}, +{0, 61158, 5756}, +{0, 61232, 5749}, +{0, 61287, 5747}, +{0, 61422, 5757}, +{0, 60814, 5744}, +{0, 60165, 5735}, +{0, 59844, 5727}, +{0, 59797, 5725}, +{0, 59908, 5732}, +{0, 59991, 5739}, +{0, 59970, 5736}, +{0, 60230, 5727}, +{0, 60650, 5722}, +{0, 60913, 5729}, +{0, 60711, 5720}, +{0, 60289, 5718}, +{0, 59960, 5734}, +{0, 59757, 5715}, +{0, 59668, 5722}, +{0, 59582, 5723}, +{0, 59557, 5726}, +{0, 59620, 5734}, +{0, 59743, 5732}, +{0, 59203, 5731}, +{0, 58719, 5717}, +{0, 58536, 5716}, +{0, 58412, 5724}, +{0, 58451, 5723}, +{0, 58468, 5720}, +{0, 58452, 5733}, +{0, 58319, 5726}, +{0, 58223, 5732}, +{0, 58068, 5725}, +{0, 57694, 5717}, +{0, 57391, 5719}, +{0, 57123, 5707}, +{0, 57030, 5715}, +{0, 56991, 5721}, +{0, 57046, 5732}, +{0, 57170, 5730}, +{0, 57315, 5726}, +{0, 57433, 5728}, +{0, 57085, 5717}, +{0, 56826, 5730}, +{0, 56789, 5732}, +{0, 56786, 5714}, +{0, 56961, 5734}, +{0, 57075, 5743}, +{0, 57095, 5732}, +{0, 57127, 5726}, +{0, 57015, 5728}, +{0, 56576, 5730}, +{0, 55986, 5730}, +{0, 55667, 5724}, +{0, 55510, 5734}, +{0, 55469, 5732}, +{0, 55538, 5731}, +{0, 55559, 5733}, +{0, 55658, 5733}, +{0, 55836, 5742}, +{0, 56030, 5735}, +{0, 55839, 5739}, +{0, 55578, 5724}, +{0, 55592, 5732}, +{0, 55720, 5734}, +{0, 55944, 5735}, +{0, 56176, 5745}, +{0, 56352, 5748}, +{0, 56539, 5737}, +{0, 56714, 5750}, +{0, 56522, 5728}, +{0, 56097, 5738}, +{0, 55919, 5735}, +{0, 55870, 5735}, +{0, 55922, 5740}, +{0, 56056, 5751}, +{0, 56190, 5758}, +{0, 56245, 5751}, +{0, 56441, 5750}, +{0, 56457, 5745}, +{0, 56152, 5742}, +{0, 55996, 5746}, +{0, 56028, 5738}, +{0, 56175, 5745}, +{0, 56364, 5746}, +{0, 56600, 5746}, +{0, 56790, 5741}, +{0, 57027, 5749}, +{0, 57145, 5758}, +{0, 56925, 5744}, +{0, 56706, 5738}, +{0, 56700, 5745}, +{0, 56700, 5735}, +{0, 56770, 5746}, +{0, 56851, 5742}, +{0, 56970, 5743}, +{0, 57079, 5742}, +{0, 57204, 5748}, +{0, 57197, 5756}, +{0, 56916, 5738}, +{0, 56684, 5732}, +{0, 56706, 5730}, +{0, 56826, 5735}, +{0, 57092, 5732}, +{0, 57270, 5748}, +{0, 57462, 5739}, +{0, 57681, 5743}, +{0, 57812, 5743}, +{0, 57435, 5732}, +{0, 57147, 5740}, +{0, 57097, 5731}, +{0, 57157, 5734}, +{0, 57390, 5735}, +{0, 57618, 5750}, +{0, 57691, 5749}, +{0, 57788, 5748}, +{0, 57849, 5754}, +{0, 57736, 5756}, +{0, 57358, 5752}, +{0, 57049, 5732}, +{0, 56992, 5749}, +{0, 57064, 5739}, +{0, 57221, 5745}, +{0, 57493, 5737}, +{0, 57816, 5739}, +{0, 57955, 5753}, +{0, 57976, 5752}, +{0, 57485, 5749}, +{0, 57193, 5732}, +{0, 57121, 5742}, +{0, 56931, 5745}, +{0, 56800, 5743}, +{0, 56758, 5740}, +{0, 56842, 5736}, +{0, 56831, 5736}, +{0, 56778, 5749}, +{0, 56617, 5737}, +{0, 56046, 5736}, +{0, 55890, 5734}, +{0, 56052, 5730}, +{0, 56415, 5740}, +{0, 56673, 5735}, +{0, 56920, 5747}, +{0, 57196, 5743}, +{0, 57563, 5739}, +{0, 57915, 5749}, +{0, 57932, 5749}, +{0, 57920, 5732}, +{0, 57985, 5747}, +{0, 58101, 5759}, +{0, 58398, 5756}, +{0, 58657, 5749}, +{0, 59000, 5760}, +{0, 59327, 5760}, +{0, 59683, 5764}, +{0, 59682, 5757}, +{0, 59383, 5768}, +{0, 59284, 5749}, +{0, 59326, 5754}, +{0, 59510, 5762}, +{0, 59662, 5765}, +{0, 59903, 5764}, +{0, 60130, 5764}, +{0, 60352, 5753}, +{0, 60435, 5782}, +{0, 60048, 5753}, +{0, 59756, 5758}, +{0, 59621, 5756}, +{0, 59580, 5752}, +{0, 59641, 5761}, +{0, 59830, 5760}, +{0, 59982, 5766}, +{0, 60149, 5766}, +{0, 60287, 5766}, +{0, 60185, 5761}, +{0, 59823, 5761}, +{0, 59783, 5752}, +{0, 59734, 5753}, +{0, 59608, 5752}, +{0, 59343, 5744}, +{0, 59035, 5766}, +{0, 58994, 5754}, +{0, 59095, 5757}, +{0, 58951, 5751}, +{0, 58311, 5753}, +{0, 57810, 5751}, +{0, 57513, 5739}, +{0, 57431, 5744}, +{0, 57433, 5757}, +{0, 57538, 5760}, +{0, 57600, 5756}, +{0, 57706, 5760}, +{0, 57906, 5766}, +{0, 57933, 5761}, +{0, 57692, 5753}, +{0, 57595, 5759}, +{0, 57634, 5749}, +{0, 57804, 5753}, +{0, 57975, 5766}, +{0, 58127, 5756}, +{0, 58261, 5764}, +{0, 58500, 5764}, +{0, 58681, 5764}, +{0, 58418, 5741}, +{0, 58108, 5760}, +{0, 57945, 5755}, +{0, 57934, 5753}, +{0, 58145, 5755}, +{0, 58416, 5773}, +{0, 58614, 5759}, +{0, 58815, 5765}, +{0, 58994, 5764}, +{0, 58933, 5762}, +{0, 58552, 5761}, +{0, 58483, 5755}, +{0, 58520, 5769}, +{0, 58665, 5753}, +{0, 58897, 5752}, +{0, 59088, 5760}, +{0, 59329, 5766}, +{0, 59615, 5761}, +{0, 59787, 5763}, +{0, 59506, 5768}, +{0, 59280, 5761}, +{0, 59177, 5762}, +{0, 59261, 5756}, +{0, 59249, 5760}, +{0, 59316, 5765}, +{0, 59307, 5767}, +{0, 59357, 5772}, +{0, 59403, 5771}, +{0, 59406, 5764}, +{0, 59254, 5754}, +{0, 59190, 5761}, +{0, 59291, 5763}, +{0, 59545, 5762}, +{0, 59840, 5762}, +{0, 60165, 5765}, +{0, 60390, 5763}, +{0, 60620, 5769}, +{0, 60771, 5775}, +{0, 60512, 5761}, +{0, 60360, 5761}, +{0, 60213, 5770}, +{0, 60156, 5766}, +{0, 60120, 5765}, +{0, 60130, 5784}, +{0, 60283, 5778}, +{0, 60401, 5769}, +{0, 60492, 5776}, +{0, 60330, 5764}, +{0, 60068, 5763}, +{0, 59978, 5767}, +{0, 59953, 5759}, +{0, 60063, 5773}, +{0, 60169, 5752}, +{0, 60333, 5762}, +{0, 60513, 5755}, +{0, 60772, 5757}, +{0, 60695, 5764}, +{0, 60163, 5752}, +{0, 59778, 5756}, +{0, 59684, 5753}, +{0, 59685, 5753}, +{0, 59651, 5761}, +{0, 59614, 5756}, +{0, 59552, 5757}, +{0, 59510, 5753}, +{0, 59595, 5755}, +{0, 59255, 5753}, +{0, 58770, 5759}, +{0, 58577, 5757}, +{0, 58560, 5755}, +{0, 58583, 5753}, +{0, 58583, 5752}, +{0, 58582, 5750}, +{0, 58583, 5757}, +{0, 58737, 5757}, +{0, 58552, 5744}, +{0, 58014, 5751}, +{0, 57624, 5744}, +{0, 57584, 5737}, +{0, 57686, 5745}, +{0, 57722, 5751}, +{0, 57675, 5747}, +{0, 57624, 5748}, +{0, 57671, 5756}, +{0, 57748, 5740}, +{0, 57307, 5740}, +{0, 56921, 5737}, +{0, 56786, 5749}, +{0, 56851, 5745}, +{0, 57043, 5747}, +{0, 57191, 5747}, +{0, 57347, 5734}, +{0, 57539, 5741}, +{0, 57752, 5738}, +{0, 57509, 5721}, +{0, 57133, 5731}, +{0, 56986, 5728}, +{0, 56996, 5738}, +{0, 57230, 5743}, +{0, 57410, 5739}, +{0, 57515, 5739}, +{0, 57627, 5743}, +{0, 57699, 5740}, +{0, 57510, 5735}, +{0, 57097, 5742}, +{0, 56980, 5734}, +{0, 56984, 5725}, +{0, 57093, 5748}, +{0, 57203, 5733}, +{0, 57436, 5742}, +{0, 57640, 5750}, +{0, 57861, 5746}, +{0, 57906, 5730}, +{0, 57431, 5722}, +{0, 57308, 5725}, +{0, 57289, 5729}, +{0, 57486, 5730}, +{0, 57666, 5740}, +{0, 57832, 5742}, +{0, 58065, 5735}, +{0, 58216, 5731}, +{0, 58216, 5734}, +{0, 57671, 5735}, +{0, 57250, 5733}, +{0, 57038, 5727}, +{0, 57094, 5731}, +{0, 57244, 5733}, +{0, 57376, 5728}, +{0, 57454, 5735}, +{0, 57602, 5727}, +{0, 57737, 5719}, +{0, 57455, 5718}, +{0, 57109, 5721}, +{0, 57022, 5720}, +{0, 57099, 5732}, +{0, 57309, 5724}, +{0, 57564, 5732}, +{0, 57830, 5735}, +{0, 57975, 5728}, +{0, 58161, 5740}, +{0, 58118, 5737}, +{0, 57710, 5719}, +{0, 57527, 5728}, +{0, 57501, 5724}, +{0, 57592, 5722}, +{0, 57661, 5727}, +{0, 57671, 5732}, +{0, 57641, 5741}, +{0, 57605, 5734}, +{0, 57559, 5734}, +{0, 57396, 5723}, +{0, 57569, 5738}, +{0, 58093, 5756}, +{0, 58718, 5779}, +{0, 59324, 5776}, +{0, 59817, 5780}, +{0, 60291, 5792}, +{0, 60676, 5785}, +{0, 60910, 5786}, +{0, 60723, 5785}, +{0, 60731, 5783}, +{0, 60825, 5783}, +{0, 60989, 5788}, +{0, 61151, 5780}, +{0, 61360, 5794}, +{0, 61532, 5795}, +{0, 61786, 5794}, +{0, 61971, 5790}, +{0, 61843, 5791}, +{0, 61696, 5798}, +{0, 61734, 5793}, +{0, 61824, 5790}, +{0, 61995, 5783}, +{0, 62082, 5795}, +{0, 62183, 5798}, +{0, 62341, 5794}, +{0, 62467, 5798}, +{0, 62186, 5797}, +{0, 61929, 5794}, +{0, 61792, 5793}, +{0, 61775, 5788}, +{0, 61872, 5790}, +{0, 61929, 5782}, +{0, 61920, 5787}, +{0, 61914, 5790}, +{0, 61872, 5778}, +{0, 61670, 5778}, +{0, 61182, 5774}, +{0, 60971, 5761}, +{0, 60887, 5776}, +{0, 60914, 5772}, +{0, 61053, 5777}, +{0, 61298, 5777}, +{0, 61471, 5766}, +{0, 61733, 5766}, +{0, 61731, 5761}, +{0, 61416, 5763}, +{0, 61276, 5766}, +{0, 60872, 5759}, +{0, 60318, 5765}, +{0, 59821, 5768}, +{0, 59663, 5762}, +{0, 59724, 5768}, +{0, 59571, 5774}, +{0, 59225, 5767}, +{0, 58531, 5752}, +{0, 58153, 5761}, +{0, 58064, 5755}, +{0, 58052, 5752}, +{0, 58131, 5769}, +{0, 58161, 5762}, +{0, 58336, 5765}, +{0, 58513, 5767}, +{0, 58586, 5757}, +{0, 58015, 5762}, +{0, 57681, 5744}, +{0, 57555, 5753}, +{0, 57602, 5755}, +{0, 57802, 5748}, +{0, 57908, 5763}, +{0, 58042, 5768}, +{0, 58226, 5754}, +{0, 58298, 5745}, +{0, 57702, 5743}, +{0, 57215, 5751}, +{0, 57052, 5760}, +{0, 56961, 5749}, +{0, 57115, 5746}, +{0, 57342, 5768}, +{0, 57435, 5762}, +{0, 57506, 5762}, +{0, 57588, 5764}, +{0, 57205, 5760}, +{0, 56804, 5761}, +{0, 56664, 5745}, +{0, 56707, 5753}, +{0, 56811, 5762}, +{0, 56943, 5762}, +{0, 57149, 5754}, +{0, 57383, 5758}, +{0, 57559, 5767}, +{0, 57256, 5752}, +{0, 56872, 5742}, +{0, 56762, 5746}, +{0, 56790, 5745}, +{0, 56834, 5749}, +{0, 57029, 5737}, +{0, 57260, 5736}, +{0, 57682, 5739}, +{0, 58314, 5754}, +{0, 58656, 5770}, +{0, 58643, 5764}, +{0, 58539, 5761}, +{0, 58542, 5768}, +{0, 58596, 5765}, +{0, 58691, 5765}, +{0, 58731, 5774}, +{0, 58934, 5772}, +{0, 59123, 5761}, +{0, 59054, 5768}, +{0, 58660, 5759}, +{0, 58449, 5757}, +{0, 58359, 5759}, +{0, 58418, 5751}, +{0, 58399, 5759}, +{0, 58423, 5759}, +{0, 58394, 5764}, +{0, 58424, 5756}, +{0, 58387, 5754}, +{0, 58087, 5749}, +{0, 57859, 5749}, +{0, 57822, 5747}, +{0, 57919, 5751}, +{0, 58108, 5753}, +{0, 58344, 5748}, +{0, 58588, 5747}, +{0, 58813, 5756}, +{0, 58906, 5751}, +{0, 58689, 5746}, +{0, 58544, 5744}, +{0, 58565, 5745}, +{0, 58666, 5745}, +{0, 58771, 5744}, +{0, 58778, 5738}, +{0, 58750, 5758}, +{0, 58706, 5738}, +{0, 58619, 5747}, +{0, 58347, 5752}, +{0, 58253, 5750}, +{0, 58209, 5737}, +{0, 58327, 5749}, +{0, 58465, 5747}, +{0, 58677, 5773}, +{0, 58822, 5754}, +{0, 58988, 5770}, +{0, 59120, 5763}, +{0, 58836, 5753}, +{0, 58669, 5756}, +{0, 58673, 5750}, +{0, 58754, 5765}, +{0, 58889, 5752}, +{0, 59021, 5757}, +{0, 59062, 5777}, +{0, 59104, 5766}, +{0, 59146, 5760}, +{0, 58839, 5765}, +{0, 58500, 5767}, +{0, 58373, 5749}, +{0, 58279, 5756}, +{0, 58422, 5762}, +{0, 58559, 5765}, +{0, 58758, 5764}, +{0, 58937, 5768}, +{0, 59153, 5770}, +{0, 58995, 5766}, +{0, 58621, 5757}, +{0, 58507, 5756}, +{0, 58526, 5759}, +{0, 58618, 5752}, +{0, 58798, 5757}, +{0, 58994, 5757}, +{0, 59106, 5759}, +{0, 59158, 5761}, +{0, 58934, 5764}, +{0, 58364, 5763}, +{0, 58120, 5759}, +{0, 58090, 5757}, +{0, 58150, 5760}, +{0, 58238, 5758}, +{0, 58464, 5767}, +{0, 58693, 5760}, +{0, 58911, 5771}, +{0, 59013, 5762}, +{0, 58653, 5762}, +{0, 58510, 5743}, +{0, 58587, 5754}, +{0, 58661, 5758}, +{0, 58808, 5754}, +{0, 58986, 5763}, +{0, 59128, 5760}, +{0, 59136, 5765}, +{0, 59133, 5764}, +{0, 58746, 5762}, +{0, 58407, 5751}, +{0, 58295, 5754}, +{0, 58307, 5751}, +{0, 58368, 5763}, +{0, 58517, 5758}, +{0, 58731, 5752}, +{0, 58854, 5756}, +{0, 59067, 5765}, +{0, 58864, 5749}, +{0, 58655, 5752}, +{0, 58601, 5741}, +{0, 58679, 5745}, +{0, 58786, 5756}, +{0, 58916, 5763}, +{0, 58981, 5758}, +{0, 58914, 5763}, +{0, 58891, 5759}, +{0, 58888, 5764}, +{0, 58676, 5747}, +{0, 58834, 5759}, +{0, 59073, 5776}, +{0, 59332, 5767}, +{0, 59562, 5773}, +{0, 59824, 5773}, +{0, 60261, 5768}, +{0, 60683, 5770}, +{0, 61001, 5771}, +}; +static const int16_t PAH8009_mems_HRD[][3*NF_PPG_PER_CHANNEL] = +{ +{6305, -1007, 8865}, +{5777, -95, 9889}, +{6385, 1137, 8897}, +{4401, 833, 5425}, +{4465, -1647, 3153}, +{19985, 3937, 1713}, +{-2447, -3775, 8273}, +{5009, 4017, 12657}, +{6769, 1329, 6033}, +{5025, -1567, 6145}, +{6225, 1025, 5889}, +{5681, -351, 5057}, +{5905, 113, 5745}, +{5793, -31, 6369}, +{5297, 193, 5857}, +{5121, 657, 6321}, +{5121, 1041, 5937}, +{5873, 17, 6753}, +{6577, -1583, 6065}, +{5825, -63, 6385}, +{5601, 33, 4961}, +{6097, -303, 4785}, +{6001, 433, 5697}, +{6001, 929, 5553}, +{6145, 561, 5201}, +{6353, 1009, 5009}, +{6481, 1697, 5153}, +{6049, 1633, 5441}, +{6033, 1361, 5697}, +{6113, 1313, 5681}, +{6161, 1697, 5409}, +{6145, 1345, 5537}, +{6081, 1889, 5505}, +{5985, 1425, 5409}, +{5985, 1809, 5505}, +{5953, 1729, 5553}, +{5953, 1569, 5681}, +{5889, 1649, 5489}, +{6065, 1409, 5713}, +{6017, 1761, 5457}, +{6001, 1953, 5521}, +{5985, 2065, 5617}, +{5777, 1793, 5633}, +{5633, 1601, 5745}, +{5809, 1601, 5857}, +{5809, 1633, 5665}, +{5713, 1761, 5633}, +{5841, 1697, 5777}, +{5745, 1713, 5617}, +{5825, 1713, 5793}, +{5905, 1633, 5713}, +{5841, 1601, 5681}, +{5921, 1761, 5649}, +{5889, 1649, 5553}, +{5985, 1649, 5569}, +{5825, 1857, 5937}, +{5809, 1585, 5601}, +{6017, 1569, 5441}, +{5601, 1377, 5697}, +{5841, 1265, 5825}, +{6049, 1857, 6145}, +{5889, 1585, 4977}, +{6609, 1185, 5521}, +{6161, 1697, 5441}, +{6065, 1633, 5489}, +{6193, 1633, 5505}, +{6225, 1569, 5441}, +{6129, 1521, 5329}, +{6129, 1569, 5409}, +{6081, 1473, 5345}, +{5857, 1377, 5537}, +{5905, 1153, 5665}, +{6113, 1217, 5441}, +{6209, 1441, 5409}, +{6145, 1121, 5505}, +{6097, 1121, 5585}, +{6177, 1089, 5473}, +{6193, 1281, 5345}, +{6225, 1265, 5457}, +{5985, 1249, 5361}, +{6209, 1425, 5761}, +{6049, 1057, 5585}, +{5969, 1009, 5793}, +{6017, 1153, 5649}, +{6065, 1377, 5569}, +{6001, 1345, 5617}, +{6033, 1345, 5457}, +{6241, 1473, 5457}, +{6097, 1425, 5473}, +{6161, 1521, 5441}, +{6129, 1569, 5441}, +{6097, 1537, 5441}, +{6065, 1505, 5425}, +{6177, 1681, 5441}, +{6113, 1745, 5505}, +{6337, 1505, 5233}, +{6129, 1649, 5393}, +{6225, 1617, 5361}, +{6177, 1553, 5329}, +{6305, 1569, 5201}, +{6209, 1633, 5265}, +{6401, 1745, 5233}, +{6225, 1569, 5281}, +{6385, 1585, 5217}, +{6321, 1665, 5217}, +{6289, 1521, 5121}, +{6321, 1761, 5249}, +{6289, 1569, 5201}, +{6273, 1601, 5217}, +{6273, 1649, 5233}, +{6321, 1649, 5313}, +{6321, 1601, 5249}, +{6321, 1569, 5249}, +{6273, 1569, 5297}, +{6161, 1441, 5249}, +{6257, 1537, 5329}, +{6225, 1425, 5313}, +{6289, 1697, 5425}, +{6257, 1281, 5153}, +{6305, 1281, 5249}, +{6337, 1393, 5393}, +{6321, 1201, 5313}, +{6369, 1425, 5361}, +{6257, 1537, 5201}, +{6385, 1473, 5137}, +{6433, 1569, 5137}, +{6369, 1745, 4977}, +{6417, 1585, 5153}, +{6289, 1585, 5105}, +{6289, 1585, 5185}, +{6321, 1649, 5185}, +{6241, 1569, 5329}, +{6337, 1713, 5313}, +{6209, 1537, 5281}, +{6369, 1569, 5265}, +{6049, 1713, 5265}, +{6241, 1649, 5489}, +{6353, 1409, 5169}, +{6177, 1409, 5041}, +{6369, 1505, 5377}, +{6273, 1521, 5393}, +{6289, 1553, 5329}, +{6289, 1633, 5185}, +{6273, 1617, 5217}, +{6257, 1761, 5089}, +{6337, 1777, 5201}, +{6209, 1617, 5297}, +{6257, 1729, 5185}, +{6401, 1841, 5121}, +{6353, 1745, 5169}, +{6273, 1601, 5137}, +{6369, 1793, 5153}, +{6337, 1713, 5153}, +{6369, 1713, 5201}, +{6385, 1665, 5217}, +{6241, 2017, 5025}, +{6369, 1761, 5025}, +{6337, 1697, 5105}, +{6369, 1761, 5137}, +{6401, 1809, 5057}, +{6353, 1793, 5089}, +{6417, 1841, 5073}, +{6385, 1873, 5041}, +{6385, 1809, 5073}, +{6417, 1905, 5089}, +{6353, 1841, 5057}, +{6353, 1873, 5073}, +{6337, 1873, 5073}, +{6353, 1889, 5025}, +{6385, 1857, 5153}, +{6305, 1873, 5121}, +{6337, 1857, 5089}, +{6289, 1889, 4961}, +{6241, 1825, 4769}, +{6225, 1841, 4737}, +{6305, 1921, 4977}, +{6353, 2177, 4561}, +{6161, 1697, 4225}, +{6401, 3089, 6225}, +{6321, 2769, 5537}, +{6177, 2449, 5153}, +{6177, 2545, 5057}, +{6145, 2545, 5153}, +{6177, 2561, 5025}, +{6161, 2561, 5073}, +{6145, 2513, 5057}, +{6161, 2385, 5025}, +{6161, 2657, 5121}, +{6161, 2753, 4897}, +{6145, 2689, 4913}, +{6145, 2753, 4977}, +{6145, 2801, 5009}, +{6161, 2673, 5073}, +{6129, 2657, 5025}, +{6145, 2705, 5041}, +{6145, 2625, 5041}, +{6129, 2577, 5089}, +{6113, 2625, 5073}, +{6081, 2641, 5041}, +{6081, 2593, 5105}, +{6161, 2689, 5233}, +{6033, 2449, 5121}, +{6081, 2497, 5137}, +{6097, 2577, 5233}, +{6097, 2465, 5169}, +{6113, 2481, 5153}, +{6097, 2561, 5121}, +{6081, 2513, 5105}, +{6113, 2561, 5153}, +{6129, 2545, 5105}, +{6129, 2529, 5089}, +{6097, 2497, 5169}, +{6113, 2513, 5185}, +{6097, 2401, 5169}, +{6193, 2529, 5217}, +{6161, 2801, 5153}, +{6113, 2737, 5009}, +{6129, 2577, 4961}, +{6081, 2561, 5217}, +{6049, 2449, 5057}, +{6049, 2321, 5169}, +{6097, 2497, 5249}, +{6065, 2449, 5313}, +{6017, 2513, 5185}, +{6049, 2529, 5201}, +{6097, 2481, 5201}, +{6065, 2369, 5297}, +{6001, 2401, 5233}, +{6017, 2417, 5313}, +{6033, 2385, 5281}, +{5985, 2337, 5217}, +{5969, 2385, 5329}, +{6049, 2337, 5457}, +{6081, 2577, 5329}, +{5969, 2481, 5249}, +{5953, 2257, 5409}, +{5953, 2353, 5521}, +{5873, 2289, 5393}, +{5473, 3185, 5297}, +{6081, 2817, 3889}, +{6161, 3313, 5569}, +{5745, 2769, 5249}, +{6449, 2849, 4913}, +{5857, 2593, 5009}, +{5953, 2481, 5233}, +{6273, 2369, 4817}, +{6353, 2609, 4929}, +{6209, 2385, 4849}, +{6337, 2177, 5073}, +{6225, 2129, 5041}, +{6353, 2033, 5057}, +{6321, 2193, 4945}, +{6417, 2017, 5057}, +{6321, 2001, 4993}, +{6417, 2017, 4833}, +{6385, 1969, 4961}, +{6353, 1953, 4961}, +{6321, 2049, 5025}, +{6401, 2209, 4945}, +{6449, 2049, 5041}, +{6465, 2161, 4961}, +{6337, 2113, 5009}, +{6417, 2225, 4897}, +{6481, 2305, 4961}, +{6465, 2049, 4673}, +{6225, 2897, 5377}, +{6193, 2657, 5537}, +{6449, 2385, 4673}, +{6353, 2273, 4753}, +{6273, 2369, 4529}, +{6369, 3169, 6049}, +{6337, 2753, 5361}, +{6113, 2417, 5009}, +{6273, 2257, 5009}, +{6225, 2433, 4897}, +{6225, 2129, 5153}, +{6257, 2641, 5137}, +{6001, 2353, 5281}, +{6193, 2241, 4849}, +{6305, 2481, 5617}, +{6529, 2817, 5809}, +{6337, 3473, 5441}, +{6129, 1345, 3569}, +{6049, 1585, 3985}, +{6241, 1633, 4177}, +{6225, 2081, 5009}, +{6273, 1985, 4977}, +{6145, 1969, 5265}, +{6289, 1713, 4577}, +{6401, 1649, 4769}, +{6273, 1505, 4993}, +{6305, 1553, 5521}, +{6145, 1617, 5393}, +{6193, 1505, 5185}, +{6305, 1761, 5313}, +{6081, 1569, 5425}, +{6177, 1537, 5297}, +{6209, 1473, 5441}, +{6257, 1569, 5441}, +{6177, 1409, 5297}, +{6241, 1473, 5185}, +{6177, 1601, 4913}, +{6177, 1553, 5137}, +{6257, 1361, 5633}, +{6193, 1729, 5617}, +{6193, 1425, 5409}, +{6241, 1569, 5329}, +{6193, 1665, 5217}, +{6289, 1489, 5201}, +{6257, 1521, 5297}, +{6225, 1553, 5297}, +{6113, 1713, 5249}, +{6209, 1713, 5281}, +{6225, 1697, 5329}, +{6209, 1745, 5217}, +{6241, 1697, 5233}, +{6193, 1697, 5233}, +{6193, 1809, 5297}, +{6273, 1825, 5217}, +{6241, 1841, 5233}, +{6241, 1697, 5265}, +{6225, 1905, 5233}, +{6209, 1793, 5265}, +{6193, 1873, 5233}, +{6257, 1873, 5265}, +{6209, 1825, 5249}, +{6257, 1809, 5233}, +{6209, 1793, 5185}, +{6241, 1825, 5217}, +{6193, 1857, 5297}, +{6225, 1729, 5329}, +{6097, 1633, 5361}, +{6161, 1841, 5377}, +{6129, 1841, 5377}, +{6129, 1841, 5345}, +{6113, 1713, 5393}, +{6129, 1681, 5393}, +{6113, 1697, 5425}, +{6129, 1649, 5409}, +{6081, 1601, 5457}, +{6113, 1713, 5425}, +{6097, 1713, 5505}, +{6113, 1601, 5441}, +{6081, 1649, 5409}, +{6081, 1617, 5521}, +{6017, 1649, 5473}, +{6065, 1601, 5441}, +{6081, 1585, 5441}, +{6113, 1713, 5473}, +{6097, 1793, 5441}, +{6081, 1713, 5425}, +{6081, 1745, 5457}, +{6097, 1665, 5441}, +{6113, 1697, 5441}, +{6097, 1729, 5425}, +{6081, 1713, 5441}, +{6097, 1697, 5425}, +{6113, 1697, 5425}, +{6113, 1745, 5409}, +{6081, 1745, 5473}, +{6049, 1713, 5377}, +{6097, 1681, 5409}, +{6081, 1873, 5409}, +{6097, 1809, 5377}, +{6145, 1777, 5489}, +{6193, 1761, 5281}, +{6113, 1489, 5281}, +{6209, 1521, 5393}, +{6129, 1793, 5265}, +{6145, 1937, 5377}, +{6225, 1905, 5361}, +{6145, 1713, 5473}, +{6145, 1473, 5489}, +{5873, 1793, 5473}, +{5985, 1729, 5553}, +{6017, 1473, 5457}, +{6033, 1697, 5665}, +{6033, 1873, 5953}, +{6065, 1713, 5425}, +{5985, 1425, 5489}, +{5889, 1329, 5537}, +{5953, 1233, 5489}, +{6033, 1233, 5601}, +{5729, 849, 5761}, +{5681, 705, 5969}, +{5761, 833, 6161}, +{5729, 689, 6017}, +{5841, 705, 5953}, +{5713, 305, 5953}, +{5537, 481, 6001}, +{5665, 545, 6145}, +{5601, 465, 6081}, +{5601, 417, 6049}, +{5681, 449, 6081}, +{5633, 305, 6209}, +{5617, 529, 6049}, +{5633, 513, 6001}, +{5745, 481, 5969}, +{5697, 561, 5937}, +{5745, 641, 5985}, +{5921, 929, 5793}, +{5857, 737, 5681}, +{5985, 913, 5681}, +{6001, 961, 5633}, +{6097, 1473, 5393}, +{6033, 1217, 5489}, +{6145, 1233, 5649}, +{6289, 1457, 5361}, +{6273, 1441, 5249}, +{6273, 1265, 5265}, +{6145, 1665, 5377}, +{6241, 1633, 5409}, +{6161, 1617, 5377}, +{6177, 1729, 5297}, +{6177, 1665, 5409}, +{6129, 1553, 5361}, +{6161, 1569, 5345}, +{6193, 1745, 5377}, +{6273, 1361, 5393}, +{6177, 1505, 5489}, +{5905, 1073, 5553}, +{5953, 1441, 5681}, +{5873, 1249, 5777}, +{5745, 1233, 5777}, +{5921, 849, 5921}, +{5825, 913, 5873}, +{5777, 801, 5873}, +{5745, 1185, 5841}, +{5793, 1089, 5873}, +{5761, 945, 5921}, +{5793, 1041, 5841}, +{5889, 1281, 5681}, +{5793, 1153, 5777}, +{5649, 1425, 5713}, +{5809, 1553, 5809}, +{5441, 1745, 5841}, +{5537, 1841, 5729}, +{6945, 641, 5521}, +{6097, 2113, 4945}, +{5953, 2705, 5329}, +{6193, 2449, 5585}, +{5841, 1953, 5249}, +{6321, 1793, 5329}, +{6369, 1633, 5425}, +{6177, 1745, 5185}, +{6305, 1457, 4833}, +{6353, 769, 5201}, +{6529, 817, 5265}, +{6305, 641, 5473}, +{6289, 497, 5313}, +{6241, 337, 5361}, +{6321, 145, 5409}, +{6257, -63, 5441}, +{6177, 273, 5489}, +{6129, 193, 5585}, +{6241, -79, 5633}, +{6017, 65, 5665}, +{6257, 49, 5617}, +{5985, -255, 5873}, +{6049, -111, 5537}, +{6273, -15, 5585}, +{6113, 17, 5585}, +{6033, -255, 5649}, +{6017, 17, 5569}, +{6225, -287, 5553}, +{6321, -127, 5489}, +{6081, 97, 5601}, +{6193, 209, 5201}, +{6385, 241, 5217}, +{6273, 321, 5233}, +{6769, 449, 5697}, +{6433, 257, 5249}, +{6545, 689, 5089}, +{6305, 1313, 5281}, +{6177, 721, 5505}, +{6193, 1825, 5649}, +{6129, 961, 4705}, +{6641, 1121, 4961}, +{6513, 801, 4945}, +{6673, 641, 5345}, +{6241, -159, 5185}, +{6353, 657, 4977}, +{6305, 1377, 5361}, +{6433, 561, 5265}, +{6129, 1745, 5265}, +{6561, 465, 5329}, +{6417, 1089, 5505}, +{6193, 785, 5745}, +{6065, 1233, 5729}, +{5793, 1777, 5521}, +{6001, 993, 5937}, +{5905, 769, 5697}, +{6033, 1105, 5489}, +{6049, 1377, 5537}, +{5873, 1153, 5649}, +{5937, 1281, 5665}, +{6097, 2001, 5409}, +{6081, 2065, 5217}, +{6177, 1953, 5217}, +{6129, 2081, 5297}, +{6385, 1873, 5313}, +{5745, 1761, 5457}, +{6081, 2385, 5361}, +{6273, 1537, 5041}, +{6433, 1857, 4737}, +{6529, 1905, 4881}, +{6801, 1857, 4929}, +{6401, 1649, 5201}, +{6017, 1713, 4865}, +{6497, 1793, 5217}, +{5985, 1377, 4977}, +{6177, 1521, 5425}, +{6161, 1697, 5457}, +{5985, 1169, 5345}, +{6033, 1713, 5473}, +{6193, 1473, 5649}, +{5873, 1761, 5873}, +{6289, 1761, 5665}, +{5873, 1505, 5649}, +{5985, 1441, 5473}, +{6081, 1057, 5713}, +{6097, 1057, 5585}, +{6049, 1057, 5553}, +{5873, 1377, 5505}, +{6049, 1313, 5521}, +{6161, 1521, 5489}, +{6097, 1841, 5617}, +{6273, 2209, 5329}, +{6273, 2081, 5233}, +{6161, 1537, 5473}, +{6049, 2225, 4817}, +{6385, 2753, 4721}, +{6513, 2593, 4465}, +{6641, 2545, 4625}, +{6561, 2337, 4785}, +{6449, 2209, 4705}, +{6113, 1633, 4993}, +{6257, 2273, 5057}, +{6193, 1953, 5153}, +{6081, 1969, 5393}, +{5969, 1729, 5601}, +{5905, 1489, 5617}, +{6001, 1681, 5569}, +{5953, 1233, 5457}, +{5905, 1601, 5649}, +{6049, 1473, 5889}, +{5825, 1025, 6001}, +{6033, 1185, 5649}, +{6113, 1409, 5361}, +{6145, 1329, 5505}, +{6097, 1569, 5377}, +{6257, 1489, 5361}, +{6353, 1777, 5121}, +{6385, 2225, 4881}, +{6305, 2769, 5041}, +{6001, 2145, 4785}, +{6513, 1713, 5281}, +{6481, 641, 4769}, +{6657, 1297, 5137}, +{6609, 1425, 5025}, +{6529, 1185, 5201}, +{6369, 1233, 5057}, +{6465, 1441, 5041}, +{6401, 1473, 5137}, +{6417, 1473, 5025}, +{6337, 1633, 5073}, +{6305, 1521, 5313}, +{6273, 1313, 5425}, +{6129, 1089, 5601}, +{6273, 1185, 5329}, +{6225, 481, 5185}, +{6033, 193, 5153}, +{6161, 929, 5377}, +{6145, 385, 5553}, +{6065, -95, 5953}, +{5809, 33, 5969}, +{5857, 81, 5617}, +{6097, -15, 5601}, +{6001, 113, 5569}, +{6193, 465, 5633}, +{6065, 337, 5633}, +{6161, 513, 5649}, +{6257, 145, 5393}, +{6145, 497, 5505}, +{6305, 817, 5233}, +{6449, 769, 5281}, +{6385, 801, 5537}, +{6241, 1057, 5313}, +{6273, 977, 5121}, +{6529, 1137, 4897}, +{6609, 1329, 4849}, +{6801, 1649, 4897}, +{6561, 1713, 4961}, +{6545, 1537, 4817}, +{6545, 1457, 5153}, +{6401, 1553, 5057}, +{6513, 1169, 5137}, +{6513, 833, 5217}, +{6529, 1393, 4913}, +{6049, 1697, 5041}, +{5969, 2929, 5729}, +{6049, 2481, 6001}, +{5985, 2289, 5521}, +{5937, 1553, 5681}, +{5985, 1937, 5649}, +{6081, 1953, 5521}, +{6065, 1857, 5441}, +{5953, 1457, 5489}, +{5937, 1393, 5521}, +{5937, 1841, 5489}, +{6081, 1953, 5377}, +{5969, 1809, 5265}, +{6129, 2289, 5217}, +{6097, 1953, 5377}, +{6081, 2433, 5185}, +{6097, 2689, 5025}, +{6065, 2977, 5025}, +{6161, 2625, 5041}, +{6177, 2689, 5041}, +{6193, 2785, 5025}, +{5985, 2913, 4001}, +{7281, 2417, 4865}, +{6481, 3697, 5569}, +{6161, 2993, 4289}, +{6289, 2465, 4769}, +{6001, 3041, 5105}, +{6017, 2369, 5649}, +{6033, 2753, 5297}, +{5921, 2321, 5393}, +{5857, 2033, 5345}, +{5809, 1905, 5377}, +{5841, 1953, 5489}, +{5889, 2225, 5729}, +{5825, 1985, 5729}, +{6033, 1793, 5633}, +{6049, 1553, 5521}, +{5521, 1505, 5313}, +{6545, 705, 5585}, +{5553, 1905, 5713}, +{6049, 1633, 5633}, +{6369, 1073, 5121}, +{6193, 1313, 4961}, +{6273, 1873, 5201}, +{6481, 1681, 5841}, +{6113, 945, 5729}, +{6369, 1217, 4833}, +{6049, 1409, 5553}, +{6017, 1, 5745}, +{6209, 257, 5457}, +{6049, 929, 5681}, +{6001, 465, 5777}, +{5937, 257, 5921}, +{6001, 433, 5793}, +{6033, 433, 5601}, +{5937, 481, 5473}, +{6017, 529, 5585}, +{6049, 305, 5777}, +{6081, 97, 5649}, +{6065, 209, 5729}, +{5937, -15, 5649}, +{5857, 145, 5921}, +{5905, -143, 6065}, +{5681, -79, 6161}, +{5921, -239, 5649}, +{5761, -111, 5665}, +{5889, 113, 5697}, +{5841, -31, 5713}, +{5761, -399, 5809}, +{5489, -911, 5633}, +{5521, -767, 5585}, +{6433, 449, 5729}, +{6145, 33, 5793}, +{6385, 273, 5505}, +{6401, 961, 5057}, +{6385, 1505, 5185}, +{6273, 1377, 5409}, +{5985, 1841, 5201}, +{5857, 1825, 5489}, +{5889, 2209, 5777}, +{6177, 1601, 5473}, +{6113, 1969, 5601}, +{6033, 1953, 5473}, +{6193, 1857, 5601}, +{6225, 1697, 5617}, +{5985, 2353, 5601}, +{6481, 2161, 6273}, +{5713, 1585, 4849}, +{5921, 1377, 4849}, +{5825, 1009, 6209}, +{5089, 529, 5537}, +{5409, 129, 6113}, +{5761, 177, 5697}, +{6193, 289, 5249}, +{6193, 449, 5665}, +{6049, 657, 5425}, +{5905, 1329, 5153}, +{6145, 1409, 5265}, +{5329, 1137, 5857}, +{6001, 817, 5793}, +{6097, 769, 5697}, +{6513, 1393, 5297}, +{6433, 1729, 5265}, +{6321, 1537, 5169}, +{6305, 1329, 5249}, +{6097, 1185, 5265}, +{6161, 833, 5537}, +{5825, 641, 5537}, +{5889, 513, 5809}, +{6049, 401, 5969}, +{5697, 177, 6049}, +{5681, -63, 6081}, +{5601, -191, 6113}, +{5505, -863, 6289}, +{5329, -559, 6161}, +{5489, -911, 6001}, +{5441, -735, 6209}, +{5521, -959, 6225}, +{5841, -303, 5745}, +{5825, -367, 5921}, +{5825, -159, 5761}, +{6001, -47, 5681}, +{5969, 49, 5697}, +{6257, 529, 5345}, +{6241, 449, 5601}, +{5969, 769, 5617}, +{6145, 497, 5649}, +{5953, 513, 5537}, +{6097, 625, 5521}, +{6145, 993, 5313}, +{5857, 289, 5745}, +{6001, 737, 5697}, +{6065, 353, 5825}, +{5873, 641, 5905}, +{6193, 1137, 5569}, +{6145, 929, 5633}, +{6129, 1153, 5505}, +{6081, 913, 5921}, +{5873, 833, 5777}, +{5937, 193, 5809}, +{5953, 689, 5921}, +{5857, 145, 5809}, +{5873, 289, 5665}, +{5889, 241, 5633}, +{5937, 433, 5793}, +{6001, 225, 5841}, +{5921, 417, 5697}, +{6033, 1041, 5633}, +{6049, 1057, 5409}, +{5809, 1233, 5841}, +{5985, 1441, 5633}, +{6001, 1313, 5697}, +{6049, 1137, 5777}, +{6385, 1473, 5537}, +{6465, 1697, 4977}, +{6465, 1505, 4865}, +{6513, 1649, 5073}, +{6209, 1633, 4945}, +{6705, 1601, 5073}, +{6369, 1633, 5137}, +{6625, 1393, 5345}, +{6113, 1633, 4993}, +{6193, 1217, 5105}, +{6097, 1297, 5649}, +{5905, 1057, 5841}, +{5649, 897, 5937}, +{5553, 417, 6209}, +{5729, 945, 5825}, +{5921, 721, 5553}, +{5761, 593, 5297}, +{5345, 721, 5905}, +{5665, 641, 6113}, +{5697, 625, 5953}, +{5937, 705, 6209}, +{5745, 1121, 6177}, +{5953, 1105, 5329}, +{5889, 1393, 5233}, +{5745, 1217, 5937}, +{5857, 1441, 6033}, +{5889, 1585, 6065}, +{6833, 1921, 4721}, +{6801, 1969, 4417}, +{6737, 1905, 4561}, +{6657, 1921, 4785}, +{6305, 1953, 5089}, +{6065, 1937, 5281}, +{6177, 1985, 5377}, +{5985, 1905, 5553}, +{6049, 1601, 5713}, +{6001, 1313, 5713}, +{5793, 689, 5697}, +{5601, 561, 5937}, +{5505, 657, 6225}, +{5457, 433, 6449}, +{5521, 609, 6305}, +{5457, 353, 6193}, +{5361, -79, 6385}, +{5553, -223, 6017}, +{5521, -143, 6049}, +{5489, -15, 5905}, +{5505, 401, 6193}, +{5809, 689, 5793}, +{5857, 273, 5681}, +{5697, 817, 5841}, +{6177, 1137, 5441}, +{6065, 1089, 5633}, +{5969, 1313, 5745}, +{6161, 1697, 5521}, +{6241, 1761, 5329}, +{6385, 1729, 5233}, +{6353, 1617, 5137}, +{6289, 1441, 5281}, +{6145, 1601, 5425}, +{6177, 1553, 5425}, +{6065, 1393, 5553}, +{6161, 1873, 5393}, +{5889, 705, 5649}, +{5953, 881, 5777}, +{5745, 609, 5873}, +{5681, 1089, 6033}, +{5697, 721, 6033}, +{5505, 433, 6273}, +{5649, 769, 6033}, +{5809, 385, 5969}, +{5809, 305, 5665}, +{6049, 209, 5553}, +{5697, 337, 5985}, +{5809, 577, 5953}, +{5745, 721, 5921}, +{5697, 689, 5873}, +{5713, 961, 5665}, +{6049, 1105, 5649}, +{6145, 881, 5713}, +{6289, 961, 4961}, +{6465, 1425, 4689}, +{6625, 1969, 4817}, +{6241, 1425, 5265}, +{6257, 1425, 5313}, +{6001, 1793, 5377}, +{6113, 1697, 5585}, +{6097, 1905, 5393}, +{6145, 1249, 5537}, +{6177, 1601, 5489}, +{6049, 1073, 5553}, +{5889, 1521, 5681}, +{5857, 1169, 5873}, +{6001, 897, 5601}, +{6129, 1041, 5505}, +{6193, 881, 5377}, +{6289, 353, 5313}, +{5393, 1281, 6017}, +{5377, 1793, 5345}, +{5585, 1601, 6433}, +{6385, -463, 5361}, +{6449, 705, 5153}, +{6449, 577, 5425}, +{5969, 1329, 5505}, +{6529, -351, 5473}, +{6625, -79, 4689}, +{6657, 65, 4737}, +{6257, 721, 5249}, +{6129, 577, 5473}, +{6353, 161, 5441}, +{6465, 289, 5217}, +{6481, 465, 5105}, +{6465, 993, 4913}, +{6625, 673, 4865}, +{6465, 97, 5217}, +{6529, -463, 5601}, +{6513, 465, 5297}, +{6689, 17, 4721}, +{6401, -95, 4993}, +{6241, -319, 5729}, +{6193, -543, 5457}, +{6177, -495, 5361}, +{6273, -543, 5441}, +{6097, -879, 5201}, +{5393, -1551, 5457}, +{6113, -1183, 5361}, +{6225, -847, 5889}, +{6033, -879, 5809}, +{6289, -783, 5457}, +{6529, -239, 4865}, +{6545, 145, 5137}, +{6113, 593, 5249}, +{6609, 737, 5665}, +{5953, 209, 5569}, +{6241, 833, 5553}, +{6241, 769, 5489}, +{6353, 497, 5201}, +{5905, 1617, 4849}, +{6801, 865, 5553}, +{6145, -399, 5569}, +{6193, 545, 5649}, +{6113, 177, 5377}, +{6369, 481, 5409}, +{6241, 113, 5393}, +{5921, 161, 5633}, +{5729, 289, 6033}, +{5873, 449, 5969}, +{6001, 433, 6001}, +{5873, 417, 5761}, +{5985, -143, 5617}, +{6145, 209, 5489}, +{6097, 593, 5633}, +{5953, 577, 5713}, +{6017, 497, 5665}, +{6145, 769, 5665}, +{6289, 737, 5553}, +{6289, 785, 5409}, +{6337, 561, 5313}, +{6321, 881, 5121}, +{6337, 1457, 4561}, +{6273, 1313, 5057}, +{6321, 657, 4961}, +{6657, 1457, 4737}, +{6497, 1041, 4721}, +{6049, 1569, 6017}, +{5937, 945, 6017}, +{6161, 1441, 5601}, +{5985, 753, 5457}, +{6017, 737, 5537}, +{5905, 1137, 5745}, +{5761, -143, 4977}, +{5809, -127, 4097}, +{6145, 81, 5649}, +{5825, -191, 7201}, +{6017, -127, 6049}, +{6161, -383, 5633}, +{6337, 353, 5425}, +{6161, 225, 5665}, +{5937, 353, 5521}, +{6257, 465, 5137}, +{6417, 1041, 4785}, +{5873, 1937, 6305}, +{5905, 1297, 6593}, +{5713, 961, 6065}, +{5889, 1521, 5345}, +{5889, 2193, 5409}, +{5777, 1489, 6193}, +{6033, 1473, 5777}, +{5857, 1409, 5473}, +{6081, 1361, 5217}, +{6225, 1569, 4913}, +{5905, 1681, 5841}, +{5825, 1729, 5985}, +{5889, 1617, 5841}, +{6033, 1697, 5329}, +{6209, 977, 5425}, +{5857, 1521, 5921}, +{5841, 1761, 5697}, +{6097, 1665, 5553}, +{6097, 1457, 5473}, +{6033, 1393, 5473}, +{5937, 1857, 5649}, +{5905, 2001, 5649}, +{5809, 1873, 5633}, +{5825, 2017, 5761}, +{5985, 2081, 5713}, +{6049, 1825, 5185}, +{5953, 2145, 5217}, +{5937, 2305, 5489}, +{6033, 2433, 5873}, +{6177, 2161, 5441}, +{6001, 2113, 5073}, +{6177, 1889, 5185}, +{6097, 2017, 5441}, +{6033, 2033, 5537}, +{6033, 1633, 5553}, +{5921, 1521, 5761}, +{5889, 1633, 5729}, +{5873, 1825, 5553}, +{5937, 1601, 5361}, +{5937, 1745, 5569}, +{5937, 1601, 5761}, +{5809, 1329, 5649}, +{6049, 1313, 5441}, +{6001, 1569, 5441}, +{5969, 1329, 5633}, +{5921, 1521, 5697}, +{5873, 1841, 5489}, +{5665, 2161, 5233}, +{6177, 2193, 5217}, +{6113, 2321, 5521}, +{5985, 1857, 5393}, +{5841, 2753, 5217}, +{6097, 2513, 5441}, +{6049, 2497, 5297}, +{6081, 2129, 5153}, +{6065, 2433, 5201}, +{6129, 2449, 5297}, +{6033, 2113, 5361}, +{6049, 2209, 5249}, +{5953, 1921, 5425}, +{5889, 1921, 5633}, +{5745, 1617, 5745}, +{5649, 1889, 5889}, +{5649, 1809, 5777}, +{5729, 1217, 5857}, +{5633, 1521, 5953}, +{5585, 1489, 5969}, +{5713, 1425, 5793}, +{5697, 1393, 5729}, +{5889, 1905, 5713}, +{5809, 1969, 5665}, +{5777, 2065, 5569}, +{6033, 2081, 5169}, +{5905, 3217, 5393}, +{5681, 2865, 5457}, +{6033, 2977, 5345}, +{6033, 2881, 4865}, +{6017, 3121, 5041}, +{5921, 3089, 5121}, +{6017, 2689, 5217}, +{6113, 2673, 5201}, +{5937, 2913, 4961}, +{6001, 2449, 5185}, +{5921, 2401, 5377}, +{5953, 2353, 5409}, +{5777, 2577, 5521}, +{5585, 2129, 5873}, +{5553, 2081, 5889}, +{5601, 2177, 5729}, +{5729, 1825, 5697}, +{5745, 1569, 5713}, +{5761, 1345, 5889}, +{5617, 1953, 5777}, +{5649, 2065, 5729}, +{5713, 2065, 5649}, +{5633, 2209, 5537}, +{5745, 1921, 5857}, +{5809, 2849, 5745}, +{5793, 2577, 5521}, +{6017, 2689, 5041}, +{6049, 2929, 5025}, +{6001, 2369, 5409}, +{6065, 2593, 5025}, +{6065, 2289, 5345}, +{6033, 2705, 5185}, +{5953, 2673, 5249}, +{5889, 2289, 5393}, +{5921, 2417, 5521}, +{5809, 2193, 5665}, +{5889, 2161, 5521}, +{5889, 2145, 5441}, +{5969, 1873, 5505}, +{5969, 1713, 5537}, +{5649, 1713, 5777}, +{5713, 1521, 5793}, +{5793, 1489, 5857}, +{5729, 1345, 5841}, +{5841, 1681, 5857}, +{5777, 2097, 5617}, +{5729, 2193, 5537}, +{5905, 2353, 5777}, +{5697, 2273, 5697}, +{5745, 2321, 5569}, +{6129, 2945, 4241}, +{6033, 3089, 4129}, +{6657, 1537, 5345}, +{6529, 2641, 5969}, +{5809, 3153, 5137}, +{6145, 2337, 5281}, +{6385, 1553, 5025}, +{6305, 1041, 5121}, +{6177, 545, 5521}, +{5873, 609, 5777}, +{5697, 657, 6145}, +{5553, 273, 5713}, +{5217, -447, 6545}, +{5393, 273, 6129}, +{5873, 257, 5713}, +{5985, 385, 5905}, +{5841, 369, 5953}, +{5889, 529, 5905}, +{5681, 385, 5985}, +{5921, 913, 5793}, +{6033, 961, 5937}, +{5969, 801, 5649}, +{6001, 1297, 5873}, +{6017, 1409, 5937}, +{6001, 1121, 5809}, +{5953, 817, 5697}, +{6289, 1057, 5217}, +{6017, 1409, 5329}, +{6385, 929, 5297}, +{6049, -895, 5729}, +{5953, -479, 5569}, +{6529, 273, 5713}, +{6273, 17, 5185}, +{5889, -63, 4353}, +{5713, -207, 5537}, +{6257, 17, 5009}, +{5505, -527, 7665}, +{5073, -911, 6673}, +{5777, -303, 5825}, +{6065, 17, 5569}, +{5905, 401, 6081}, +{6193, 1281, 5761}, +{6049, 321, 5233}, +{5953, 1505, 5569}, +{5745, 1345, 5537}, +{6193, 769, 5937}, +{6193, 1233, 5569}, +{6129, 1457, 5457}, +{6337, 1681, 5457}, +{5777, 529, 5009}, +{5825, 2161, 5953}, +{5841, 2865, 6417}, +{6609, 2657, 5665}, +{6017, 2913, 4353}, +{6081, 3281, 4401}, +{5873, 3713, 5025}, +{5969, 1105, 5905}, +{5345, 1089, 6721}, +{5137, 977, 6129}, +{5441, 961, 6433}, +{5649, 257, 5585}, +{5905, -111, 5489}, +{6001, 1969, 6001}, +{5873, 1633, 5681}, +{6145, 1377, 5121}, +{6513, 1841, 4337}, +{6305, 3121, 5169}, +{6465, 2529, 4977}, +{6465, 2625, 4801}, +{6769, 2305, 4593}, +{6657, 1521, 4945}, +{6241, 1601, 4817}, +{6065, 1073, 5665}, +{5937, 1265, 5617}, +{6033, 1169, 5729}, +{5969, 1185, 5777}, +{5841, 929, 6049}, +{5585, 1169, 6177}, +{5809, 801, 5985}, +{5585, 337, 5953}, +{5441, -495, 6193}, +{5233, -223, 6209}, +{5329, -463, 6321}, +{5297, -351, 6113}, +{5569, -367, 6049}, +{5697, 113, 6097}, +{5889, 273, 5857}, +{6097, 849, 5569}, +{6097, 673, 5649}, +{6097, 1377, 5473}, +{6113, 993, 5521}, +{6065, 753, 5633}, +{5921, 993, 5841}, +{5825, 1137, 5921}, +{6129, 945, 5617}, +{6161, 1233, 5425}, +{6001, 1233, 5553}, +{5873, 881, 5841}, +{5825, 1297, 5825}, +{5649, 1329, 5985}, +{5649, 1761, 5937}, +{5569, 1233, 6049}, +{5489, 689, 6081}, +{5761, 945, 6017}, +{5793, 753, 5809}, +{5649, 561, 5857}, +{5761, 513, 5937}, +{5665, 817, 5953}, +{5889, 929, 5937}, +{5841, 1217, 5681}, +{5761, 977, 5761}, +{5745, 1393, 5809}, +{5825, 1217, 5809}, +{6097, 2081, 5521}, +{6097, 1681, 5457}, +{6001, 1585, 5537}, +{6177, 1793, 5345}, +{6241, 1841, 5297}, +{6257, 1601, 5329}, +{6289, 1345, 5409}, +{6017, 1121, 5505}, +{5873, 1009, 5633}, +{5857, 1025, 5665}, +{5489, 753, 6305}, +{5521, 273, 6113}, +{5633, 673, 6113}, +{5681, 769, 5985}, +{5729, 465, 6017}, +{5873, 545, 5857}, +{5777, 257, 5889}, +{5889, 833, 5857}, +{6065, 449, 5921}, +{5761, 577, 5953}, +{5809, 1105, 5729}, +{5633, 1393, 5937}, +{5889, 1601, 5649}, +{5953, 1649, 5441}, +{5985, 705, 5585}, +{5873, 1009, 5457}, +{6401, 1713, 5281}, +{6225, 2081, 5361}, +{6177, 2337, 5409}, +{6065, 2001, 5521}, +{6033, 1985, 5457}, +{5937, 1457, 5585}, +{5841, 1201, 5665}, +{5649, 1521, 5745}, +{5665, 1393, 5937}, +{5745, 1633, 5905}, +{5761, 865, 5761}, +{5953, 721, 5729}, +{5681, 545, 5857}, +{5521, 721, 6129}, +{5569, 529, 6225}, +{5617, 817, 5953}, +{5649, 1233, 5985}, +{5473, 945, 5905}, +{5825, 945, 5777}, +{5969, 1569, 5745}, +{6161, 2353, 5185}, +{6161, 2721, 4977}, +{6321, 2577, 5057}, +{6033, 2433, 5249}, +{6225, 2865, 4929}, +{6225, 2465, 5105}, +{6289, 2273, 5185}, +{6081, 2417, 5265}, +{6209, 2257, 5121}, +{6129, 2225, 5233}, +{5921, 1521, 5697}, +{5921, 1681, 5761}, +{5889, 1505, 5553}, +{5681, 1329, 6049}, +{5745, 1281, 6017}, +{5793, 1425, 5745}, +{5761, 1201, 5761}, +{5809, 961, 5825}, +{5905, 721, 5793}, +{5857, 1009, 5665}, +{5841, 593, 5889}, +{5889, 1681, 5809}, +{5921, 1377, 5665}, +{6033, 1441, 5361}, +{6017, 1601, 5425}, +{5825, 2225, 5633}, +{6241, 2321, 4865}, +{6465, 2273, 4929}, +{6257, 2529, 5057}, +{6193, 2673, 5009}, +{6225, 2625, 4833}, +{6289, 2129, 5217}, +{6097, 2209, 5297}, +{6113, 2065, 5345}, +{5905, 2353, 5393}, +{5969, 2177, 5505}, +{5857, 1697, 5633}, +{5697, 1729, 5809}, +{5633, 1793, 5841}, +{5601, 1569, 5953}, +{5665, 1681, 5969}, +{5681, 961, 6113}, +{5665, 1105, 6001}, +{5953, 1377, 5601}, +{5921, 577, 5825}, +{5713, 865, 5921}, +{6017, 1393, 5585}, +{6033, 1473, 5457}, +{6065, 1409, 5345}, +{6225, 1425, 5297}, +{6241, 1873, 5201}, +{6321, 1841, 5105}, +{5921, 2257, 4737}, +{5761, 2705, 5601}, +{5969, 2497, 5169}, +{6177, 2081, 5217}, +{6193, 2129, 5265}, +{6033, 2417, 5489}, +{5969, 1937, 5425}, +{6225, 1697, 5457}, +{6609, 977, 5185}, +{6305, -415, 5361}, +{6417, 913, 5313}, +{6209, -31, 5393}, +{6193, -511, 5569}, +{6337, -511, 5249}, +{6289, -207, 5073}, +{5729, -927, 6177}, +{5729, -991, 5985}, +{6017, -687, 5681}, +{6145, -367, 5377}, +{6273, -207, 5409}, +{6033, -575, 5633}, +{6193, -543, 5553}, +{6305, -271, 5521}, +{6273, -255, 5441}, +{6353, -335, 5681}, +{6321, 497, 5089}, +{6193, 705, 5425}, +{6369, 209, 5553}, +{6417, 337, 5265}, +{6577, 225, 5201}, +{6497, 1, 4689}, +{6497, -95, 5649}, +{6465, -735, 5345}, +{6849, 273, 5105}, +{6657, 97, 5153}, +{6385, 433, 5057}, +{6161, -63, 5681}, +{5393, 209, 4881}, +{5313, -591, 6641}, +{3681, -639, 5713}, +{5585, -2383, 7441}, +{5409, -447, 6241}, +{5313, -927, 6321}, +{5265, -399, 6369}, +{5601, -367, 6177}, +{5729, -287, 6113}, +{5809, -223, 5825}, +{5937, 561, 5457}, +{5793, 561, 5521}, +{6257, -383, 6001}, +{5793, 865, 5825}, +{6113, 881, 5857}, +{5969, 1265, 5377}, +{6017, 593, 5809}, +{5969, 593, 5745}, +{6049, 641, 5889}, +{5921, 1089, 5473}, +{5809, 609, 5569}, +{5745, 353, 5585}, +{5745, 369, 6257}, +{5713, -95, 6225}, +{5857, 385, 6129}, +{5281, 673, 5793}, +{5633, -559, 6401}, +{4961, -511, 6097}, +{5073, -783, 6145}, +{5185, -415, 6913}, +{4961, 241, 6401}, +{5281, 913, 6273}, +{5761, 657, 5569}, +{6081, 401, 5201}, +{5777, 2481, 5729}, +{6385, 753, 5537}, +{6145, 1569, 5265}, +{6465, 2049, 4929}, +{6161, 2017, 5169}, +{6417, 1953, 4961}, +{6241, 1553, 5297}, +{6097, 1617, 5617}, +{5937, 1953, 5345}, +{6193, 1649, 5425}, +{6177, 929, 5169}, +{6017, 945, 5441}, +{5985, 977, 5809}, +{5505, 609, 6385}, +{5265, 545, 6497}, +{5185, 385, 6753}, +{5665, 737, 5985}, +{5633, 225, 5617}, +{5761, 625, 5665}, +{5889, 1297, 5873}, +{6001, 1665, 5697}, +{6113, 1249, 5409}, +{6129, 1825, 4961}, +{6353, 2305, 5025}, +{6401, 2593, 5025}, +{6305, 2673, 4881}, +{6081, 2929, 4865}, +{6209, 2385, 5297}, +{6193, 2881, 5633}, +{6465, 2769, 6145}, +{5969, 4161, 6209}, +{6961, 1489, 2113}, +{6289, 2673, 5569}, +{6177, 1729, 5345}, +{6049, 1729, 5393}, +{6145, 1761, 5585}, +{6081, 785, 5649}, +{6113, 577, 5889}, +{5761, 177, 5617}, +{5329, 65, 5681}, +{5297, 1, 6305}, +{5825, -831, 5505}, +{6049, -623, 5201}, +{5649, 113, 5761}, +{5553, 321, 5713}, +{5665, 449, 6065}, +{5857, 1073, 6081}, +{6641, 673, 4961}, +{6545, 1073, 5345}, +{6177, 977, 5393}, +{6129, 1297, 5457}, +{6129, 817, 5649}, +{6081, 961, 5409}, +{5921, 1137, 5745}, +{5793, 993, 5921}, +{5873, 1073, 6001}, +{5873, 801, 5969}, +{6145, 1169, 5569}, +{6225, 1313, 5409}, +{6257, 897, 5457}, +{5617, -687, 5841}, +{5425, -191, 6225}, +{5489, -287, 6353}, +{5393, -703, 6241}, +{5569, -191, 5953}, +{5841, -751, 5617}, +{5185, -2287, 5969}, +{1905, -2751, 6785}, +{2049, -1903, 6993}, +{3505, -639, 7633}, +{4641, -1295, 7649}, +{4049, -2447, 7313}, +{4337, -1791, 7617}, +{6001, -319, 5953}, +{5857, -47, 5873}, +{5393, -863, 5153}, +{6001, -223, 5121}, +{5905, 577, 6161}, +{5825, -463, 5713}, +{5809, -15, 5633}, +{5761, -591, 5537}, +{5633, -207, 5841}, +{5649, -367, 6177}, +{6065, 225, 5569}, +{6113, 17, 5393}, +{6145, -287, 5473}, +{5713, 929, 5697}, +{4785, -319, 5921}, +{4465, -1951, 6753}, +{4705, -3103, 6465}, +{4465, -655, 7633}, +{4449, -927, 7297}, +{5009, -751, 6833}, +{5249, -1103, 5777}, +{5473, -1679, 5633}, +{5825, -543, 5953}, +{5777, 289, 6097}, +{5649, 625, 6129}, +{5985, 257, 5697}, +{6161, 385, 5313}, +{6161, 865, 5537}, +{6065, 1505, 5825}, +{6321, 257, 6177}, +{6209, 529, 5137}, +{6273, 513, 5009}, +{5969, 401, 5921}, +{5713, -95, 6321}, +{6801, 1729, 4705}, +{6241, 529, 5185}, +{6209, 257, 5729}, +{6145, 609, 5489}, +{6049, -335, 6113}, +{5921, -735, 5745}, +{6081, 657, 5921}, +{6321, -15, 5505}, +{6241, -735, 5105}, +{6097, 385, 5489}, +{6145, 1025, 5553}, +{6049, 1681, 5537}, +{5937, 353, 5729}, +{5745, 1585, 5841}, +{5841, 1825, 5857}, +{6017, 1409, 5553}, +{6769, 1313, 5329}, +{6097, 1889, 5633}, +{6225, 2129, 5313}, +{6177, 1361, 5233}, +{5777, 2433, 5313}, +{6129, 1729, 5857}, +{5825, 881, 5713}, +{5713, 625, 5713}, +{5601, 1265, 5889}, +{5665, 1105, 6145}, +{5585, 1009, 5985}, +{5681, 689, 6001}, +{5649, 1233, 6065}, +{5585, 273, 5905}, +{5425, 209, 5585}, +{6129, 225, 5537}, +{6513, 2369, 5921}, +{6737, 1025, 5681}, +{6065, 753, 5073}, +{6289, 1089, 4865}, +{6241, 1649, 5409}, +{6305, 641, 5377}, +{6209, 769, 5249}, +{6257, 1681, 5521}, +{6353, 1425, 5345}, +{6321, 1137, 5089}, +{6289, 881, 5105}, +{6737, 769, 5265}, +{6449, 1025, 5153}, +{6289, 401, 5153}, +{6449, 385, 5361}, +{6497, 481, 5217}, +{6577, 353, 5105}, +{6385, 257, 5361}, +{6289, 273, 5361}, +{6257, -143, 5441}, +{5825, -159, 6385}, +{4881, -303, 5505}, +{5425, -751, 7169}, +{5681, 273, 6961}, +{5585, 1, 5921}, +{6017, 65, 6017}, +{6145, 337, 5457}, +{6305, 1137, 5025}, +{6545, 1441, 4641}, +{5457, 305, 5025}, +{6209, -671, 6689}, +{6161, 849, 5825}, +{6081, 625, 5169}, +{5985, 65, 5457}, +{5569, 529, 6017}, +{5265, 321, 5953}, +{5441, 577, 6433}, +{5857, 289, 6017}, +{5697, 145, 5873}, +{5745, 1105, 5313}, +{6097, 1153, 5489}, +{5601, 481, 5921}, +{5409, 49, 6193}, +{4769, 241, 5921}, +{4273, 177, 6833}, +{5377, -47, 7265}, +{5521, -15, 6481}, +{5729, -703, 5889}, +{5905, -31, 5761}, +{5889, 577, 5585}, +{5905, 1297, 5137}, +{5777, 1537, 6305}, +{5441, 449, 6625}, +{5473, -319, 6465}, +{6193, 369, 5617}, +{6273, 881, 5393}, +{6321, 849, 5249}, +{6065, 737, 5329}, +{6177, 1025, 5649}, +{6113, 1617, 5617}, +{6065, 1217, 5329}, +{5489, -175, 6049}, +{5329, -303, 6193}, +{5521, -207, 6033}, +{5249, 161, 6161}, +{5169, -31, 6449}, +{4737, -207, 6241}, +{3729, -1407, 7473}, +{4369, -2463, 7729}, +{4305, -1775, 7345}, +{4353, -927, 6881}, +{4737, -1407, 6753}, +{4993, -863, 6001}, +{5409, -687, 5761}, +{6081, -367, 5905}, +{5585, 321, 5857}, +{5681, -671, 6225}, +{5569, 209, 5937}, +{5457, 49, 6321}, +{5281, -415, 6497}, +{5297, -255, 6545}, +{5425, -271, 6209}, +{5857, 417, 6225}, +{5809, 593, 5937}, +{5841, 497, 5697}, +{5809, 497, 5457}, +{5953, 481, 5601}, +{3889, 801, 5921}, +{5169, -1583, 6929}, +{3889, -1455, 7249}, +{3985, -1807, 7249}, +{3009, -2479, 7825}, +{2897, -1279, 8353}, +{2881, -1055, 7969}, +{3105, -1487, 7441}, +{3217, -1679, 7345}, +{3745, -1407, 7761}, +{6561, -1135, 2257}, +{6993, -3679, 1905}, +{5217, -1023, 6945}, +{5137, 305, 7137}, +{5857, -783, 5553}, +{5649, -1103, 6305}, +{5633, 337, 6561}, +{5745, -1407, 5617}, +{5873, -367, 5569}, +{6369, -831, 4913}, +{5521, -2015, 5217}, +{4833, -2847, 5409}, +{4097, -2559, 6817}, +{3985, -2479, 7025}, +{3185, -2911, 6673}, +{2817, -2991, 6817}, +{1153, -3359, 8033}, +{993, -2863, 8273}, +{1441, -3311, 7473}, +{1425, -3263, 7617}, +{2129, -2959, 7409}, +{3361, -2879, 6721}, +{3825, -2575, 6641}, +{4513, -2463, 5921}, +{4689, -1967, 6321}, +{4737, -2111, 6209}, +{5345, -239, 6385}, +{5633, -239, 5665}, +{4737, -1215, 5361}, +{4657, -911, 6305}, +{3633, -1695, 7025}, +{4625, -1263, 7345}, +{4593, -1823, 6865}, +{4689, -1711, 6001}, +{4641, -2159, 5793}, +{4465, -2095, 5953}, +{3905, -2191, 6785}, +{3841, -1519, 6817}, +{3457, -2031, 6833}, +{2833, -2735, 7345}, +{2641, -1535, 8193}, +{3057, -1583, 7873}, +{3249, -1871, 7537}, +{3345, -1487, 7473}, +{4321, -735, 6945}, +{4417, -1471, 6609}, +{4401, -2175, 6273}, +{5793, -1391, 5489}, +{5457, -975, 6033}, +{5537, -767, 6417}, +{5857, -591, 5985}, +{5729, -383, 6033}, +{5553, -799, 5921}, +{5553, -15, 6273}, +{5505, 369, 5761}, +{6033, -143, 5345}, +{5985, -879, 4481}, +{5857, -367, 5585}, +{5905, -399, 5985}, +{5873, 1, 5857}, +{5953, -223, 5985}, +{5825, 657, 5857}, +{5665, -207, 6193}, +{5361, -399, 6209}, +{5345, -623, 6257}, +{5121, -1263, 6273}, +{5553, -991, 6129}, +{5985, -767, 5601}, +{5841, -175, 5889}, +{6177, 449, 5729}, +{6433, 97, 5121}, +{6337, 481, 5409}, +{6641, 1649, 5057}, +{6481, 337, 5265}, +{6289, 817, 5297}, +{6673, 369, 4881}, +{6561, 513, 4961}, +{7025, 1121, 4209}, +{6129, -3407, 3809}, +{6641, -767, 8721}, +{5169, -1807, 7265}, +{2689, -2703, 6801}, +{1649, -735, 8769}, +{2625, -3599, 4865}, +{4945, -5679, 4913}, +{5457, -3967, 5233}, +{5489, -6543, 3473}, +{3105, -5199, 4049}, +{3169, -6127, 5345}, +{3521, -5727, 4833}, +{3841, -5087, 5105}, +{3889, -5663, 5169}, +{3793, -5695, 5089}, +{4161, -4959, 4625}, +{3825, -4015, 4609}, +{4529, -4527, 5665}, +{4769, -4879, 6209}, +{4529, -4191, 4817}, +{4545, -4095, 5409}, +{4657, -4111, 5233}, +{4849, -4255, 5601}, +{4913, -4431, 5585}, +{4833, -4287, 5345}, +{4897, -4879, 5793}, +{4673, -3903, 5649}, +{5521, -4511, 5537}, +{5201, -4943, 5217}, +{5601, -5439, 5953}, +{2977, -3487, 3777}, +{2609, -3775, 4929}, +{641, -1983, 6865}, +{-207, -3631, 3857}, +{-719, -543, 481}, +{13217, -4719, 12625}, +{4305, 1057, 11297}, +{6593, -655, 4145}, +{7249, 1937, 5025}, +{6513, 737, 4961}, +{6305, 1521, 4417}, +{6193, 689, 5585}, +{6289, 1057, 5121}, +{6193, 1489, 5393}, +{6273, 2081, 4977}, +{6257, 1265, 4849}, +{6433, 1201, 5041}, +{6529, 945, 5201}, +{6673, 1505, 4897}, +{6801, 881, 5233}, +{6753, 1121, 5073}, +{6561, 529, 4897}, +{6161, 145, 5441}, +{6209, 65, 5473}, +{6257, -175, 5313}, +{6225, -31, 5313}, +{6241, -623, 5569}, +{6353, -399, 5505}, +{6481, -703, 5169}, +{6545, -111, 4945}, +{6529, 353, 5057}, +{6401, 17, 5409}, +{6609, 353, 5169}, +{6545, 273, 5041}, +{6593, 593, 4945}, +{6641, 993, 4817}, +{6689, 481, 5073}, +{6689, 721, 5041}, +{6737, 625, 4929}, +{6545, 673, 4865}, +{6801, 625, 4849}, +{6833, 529, 4673}, +{6545, 241, 5073}, +{6481, 161, 5217}, +{6449, 65, 5313}, +{6369, 209, 5185}, +{6481, 209, 5153}, +{6497, 81, 5297}, +{6641, 321, 5201}, +{6689, 513, 4897}, +{6657, 753, 4881}, +{6737, 753, 5009}, +{6753, 849, 4977}, +{6513, 1025, 5025}, +{6449, 1281, 5185}, +{6385, 1137, 5249}, +{6465, 1441, 5025}, +{6385, 1265, 5009}, +{6625, 625, 5201}, +{6801, 929, 5009}, +{6625, 1009, 5057}, +{6593, 577, 4929}, +{6369, 369, 5425}, +{6273, -15, 5569}, +{6241, -111, 5441}, +{6305, 225, 5217}, +{6305, 81, 5249}, +{6193, -255, 5473}, +{6513, -399, 5265}, +{6145, -351, 5345}, +{6353, 225, 5409}, +{6417, 257, 5281}, +{6561, 241, 5169}, +{6369, 353, 5185}, +{6433, 481, 5345}, +{6513, 801, 5009}, +{6513, 721, 5105}, +{6449, 641, 5201}, +{6513, 801, 5025}, +{6673, 1041, 4865}, +{6737, 225, 5089}, +{6497, 33, 5089}, +{6497, 417, 5281}, +{6337, 113, 5249}, +{6385, -15, 5329}, +{6353, 33, 5105}, +{6321, -191, 5281}, +{6225, -511, 5537}, +{6401, -287, 5281}, +{5953, 177, 5425}, +{7201, 273, 4849}, +{6305, -447, 5473}, +{6545, 817, 5553}, +{6113, 1009, 5297}, +{6705, 833, 5329}, +{6561, 1761, 4881}, +{6657, 1793, 4913}, +{6417, 1281, 4993}, +{6641, 1281, 4945}, +{6929, 1409, 4785}, +{6817, 1457, 4673}, +{6561, 1649, 4577}, +{6465, 865, 5473}, +{6161, 1329, 5425}, +{6081, 1153, 5793}, +{6241, 833, 6241}, +{5697, 1329, 6065}, +{5745, 2593, 5169}, +{6353, 1969, 4721}, +{6289, 1409, 4929}, +{5969, 1841, 4817}, +{6385, 2433, 4913}, +{6305, 1857, 5505}, +{6305, 1793, 5217}, +{6401, 2257, 4705}, +{6449, 2321, 5089}, +{6321, 2273, 5249}, +{6561, 2209, 5249}, +{6401, 2161, 5729}, +{6161, 1601, 4945}, +{6273, 1921, 4641}, +{6257, 1585, 4241}, +{6097, 1409, 5217}, +{5953, 1425, 4993}, +{5905, 1505, 5889}, +{5905, 1697, 6305}, +{5745, 1761, 5745}, +{6273, 1329, 5297}, +{6529, 945, 5105}, +{5985, 1921, 5313}, +{6049, 2065, 5553}, +{6001, 1697, 5905}, +{6033, 1457, 5569}, +{6193, 1697, 5377}, +{6305, 2001, 5137}, +{6065, 1617, 5617}, +{6113, 1921, 5441}, +{6225, 1665, 5361}, +{6177, 1649, 5281}, +{6001, 1841, 5409}, +{6225, 1905, 5409}, +{6257, 1521, 5553}, +{6257, 1121, 5249}, +{6193, 1041, 5441}, +{6065, 1649, 5585}, +{6065, 1777, 5313}, +{6225, 1441, 5217}, +{6257, 1489, 5329}, +{6225, 1489, 5361}, +{6081, 2209, 5265}, +{6161, 2033, 5265}, +{6385, 2017, 5265}, +{6385, 1937, 4977}, +{6497, 2305, 4929}, +{6305, 1921, 5249}, +{6273, 1953, 5137}, +{6305, 1857, 5185}, +{6241, 1985, 5073}, +{6273, 1857, 5217}, +{6161, 1521, 5361}, +{5921, 1857, 5617}, +{6001, 1809, 5553}, +{6065, 1457, 5361}, +{6145, 1681, 5281}, +{5969, 1185, 5553}, +{5985, 1297, 5825}, +{6049, 1633, 5457}, +{6225, 1681, 5169}, +{6097, 1521, 5313}, +{5937, 1985, 5377}, +{5985, 2081, 5777}, +{6065, 1841, 5457}, +{6161, 2193, 5249}, +{6209, 2321, 5137}, +{6257, 2337, 5009}, +{6129, 2033, 5249}, +{6337, 2433, 5313}, +{6289, 2577, 5249}, +{6289, 2033, 5073}, +{6257, 1649, 5089}, +{5921, 2385, 5457}, +{5793, 1633, 5953}, +{6129, 1393, 5393}, +{6273, 1585, 5425}, +{5873, 1969, 5617}, +{6017, 1569, 5489}, +{6161, 1825, 5441}, +{6033, 1537, 5585}, +{5969, 1857, 5441}, +{5761, 2177, 5617}, +{6033, 2113, 5521}, +{5985, 2017, 5281}, +{6193, 2257, 5185}, +{6225, 2401, 5217}, +{6065, 2033, 5457}, +{6129, 2001, 5441}, +{6305, 2497, 5121}, +{6241, 2305, 5057}, +{6209, 1441, 5153}, +{5905, 1889, 5505}, +{5729, 1697, 5889}, +{6065, 1585, 5505}, +{5905, 1617, 5633}, +{5937, 1937, 5617}, +{5905, 1889, 5569}, +{6129, 1569, 5505}, +{6193, 1361, 5345}, +{6193, 1873, 5249}, +{6145, 2129, 5137}, +{6337, 2129, 5249}, +{6065, 1761, 5633}, +{6081, 2081, 5265}, +{5921, 2113, 5441}, +{5793, 2305, 5585}, +{6081, 2113, 5265}, +{6369, 2673, 6081}, +{6081, 2449, 4961}, +{6129, 1313, 5297}, +{5761, 1441, 5665}, +{6465, 1265, 5681}, +{6001, 625, 5377}, +{6097, 1089, 5537}, +{6065, 945, 5441}, +{6289, 129, 5361}, +{6481, 257, 5553}, +{6273, 577, 5217}, +{6289, 1505, 5281}, +{6273, 801, 5489}, +{6049, 977, 5553}, +{6161, 1297, 5409}, +{6449, 1553, 5201}, +{6353, 1393, 5425}, +{6433, 1521, 5313}, +{6385, 849, 5137}, +{6641, 1537, 4961}, +{6481, 993, 5073}, +{6289, 1009, 5249}, +{6097, 945, 5521}, +{6273, 545, 5329}, +{6033, 641, 5393}, +{6001, 801, 5697}, +{5809, 449, 6017}, +{6385, 465, 4849}, +{6513, 1041, 4737}, +{6625, 2129, 4785}, +{6721, 1473, 4881}, +{6625, 1265, 4833}, +{6545, 1873, 4753}, +{6801, 2145, 4593}, +{6625, 1697, 4929}, +{6449, 1489, 4801}, +{6481, 1393, 5329}, +{6673, 1265, 4961}, +{6641, 993, 4961}, +{6417, 1505, 4993}, +{6081, 785, 5393}, +{6017, 977, 5617}, +{6033, 769, 5633}, +{6401, 1057, 5409}, +{6257, 705, 5489}, +{6369, 689, 5361}, +{6385, 993, 5201}, +{6353, 1825, 4817}, +{6385, 1921, 4945}, +{6433, 1585, 5201}, +{6449, 1809, 4721}, +{6705, 2065, 4641}, +{6593, 2289, 4881}, +{6385, 1985, 4833}, +{6369, 1777, 5057}, +{6449, 1489, 5185}, +{6337, 1889, 5089}, +{6321, 1281, 5521}, +{5713, 1345, 5745}, +{6225, 1105, 5649}, +{6097, 1361, 5281}, +{6001, 1441, 5601}, +{5985, 2081, 5537}, +{6129, 1505, 5377}, +{5905, 1937, 5201}, +{5873, 993, 5633}, +{5905, 2161, 5457}, +{6417, 2305, 5169}, +{6529, 2177, 4465}, +{6641, 2641, 4161}, +{6353, 2673, 4897}, +{6305, 2849, 4929}, +{6401, 2593, 4929}, +{6353, 2193, 5153}, +{6513, 1521, 5489}, +{6353, 2049, 5313}, +{6129, 2161, 4833}, +{6001, 1425, 5201}, +{6273, 1201, 5185}, +{6289, 1361, 5345}, +{5873, 1233, 5681}, +{5889, 1153, 5873}, +{5857, 1361, 5665}, +{6881, 1873, 4801}, +{6593, 1825, 4993}, +{6273, 1585, 5105}, +{6497, 1713, 5137}, +{6273, 2161, 4945}, +{6513, 2001, 4961}, +{6369, 2049, 5057}, +{6257, 1985, 5153}, +{6289, 2017, 5137}, +{6417, 2177, 4993}, +{6369, 1489, 5153}, +{6257, 1457, 5265}, +{6193, 1681, 5233}, +{6145, 1649, 5457}, +{6001, 1585, 5393}, +{6129, 993, 5457}, +{6017, 1601, 5329}, +{5953, 1889, 5489}, +{6305, 1201, 5377}, +{6561, 1153, 5105}, +{6481, 1921, 4993}, +{6017, 2081, 5345}, +{6001, 1521, 5937}, +{5649, 2017, 6561}, +{5633, 2145, 5969}, +{6129, 2401, 4961}, +{6561, 1745, 4721}, +{5985, 1825, 5681}, +{6113, 2289, 5521}, +{6385, 1873, 5361}, +{6177, 1809, 5249}, +{6081, 1889, 5281}, +{6081, 1617, 5345}, +{6129, 1377, 5569}, +{6129, 1217, 5441}, +{5985, 1265, 5489}, +{6065, 1793, 5489}, +{6273, 1329, 5409}, +{6465, 1521, 5249}, +{6337, 1601, 5169}, +{6225, 1745, 5121}, +{6177, 1665, 5553}, +{5889, 2065, 5569}, +{6081, 1921, 5409}, +{6193, 2241, 5025}, +{6241, 2097, 5185}, +{5937, 2257, 5361}, +{6369, 1601, 5409}, +{6129, 2017, 5041}, +{6417, 1329, 5169}, +{5969, 1233, 5393}, +{5985, 1617, 6049}, +{6273, 1345, 5265}, +{6369, 1137, 5105}, +{5969, 1553, 5489}, +{6257, 1265, 5553}, +{5985, 1249, 5905}, +{6065, 1697, 5185}, +{6305, 2033, 4897}, +{6481, 1825, 5121}, +{6321, 1697, 5377}, +{6353, 1713, 5041}, +{6065, 2593, 5137}, +{6241, 1985, 5425}, +{6481, 2529, 4721}, +{6577, 1937, 4881}, +{6465, 1569, 5153}, +{6273, 1729, 5329}, +{6081, 2033, 5281}, +{6305, 1681, 5281}, +{6161, 1377, 5073}, +{5937, 1585, 5169}, +{5825, 2369, 6225}, +{6225, 1473, 5169}, +{6433, 1889, 4833}, +{6353, 1745, 4849}, +{6321, 2321, 4737}, +{6129, 2449, 5153}, +{6257, 2177, 4929}, +{6241, 2417, 4769}, +{6273, 2417, 5249}, +{6305, 2257, 5313}, +{6353, 1921, 5009}, +{6225, 2241, 5137}, +{6145, 1969, 5265}, +{6161, 2129, 5105}, +{6369, 2001, 5137}, +{6337, 1681, 5009}, +{6145, 1905, 5169}, +{6177, 2209, 5249}, +{6129, 1697, 5489}, +{6241, 1921, 5009}, +{6545, 1793, 4769}, +{6321, 2241, 5313}, +{6161, 2081, 5505}, +{6209, 2241, 5153}, +{6289, 2209, 4865}, +{6209, 2545, 5041}, +{6289, 2113, 5329}, +{6257, 2305, 5185}, +{6465, 2225, 5041}, +{6273, 1873, 5137}, +{6145, 1681, 5185}, +{6081, 1937, 5537}, +{6113, 1697, 5377}, +{6097, 1521, 5249}, +{6097, 1713, 5345}, +{5953, 1889, 5537}, +{6337, 1489, 5329}, +{6049, 1601, 5457}, +{6289, 1761, 5265}, +{6193, 2081, 5089}, +{6289, 2177, 5041}, +{6177, 2001, 5121}, +{6289, 1953, 5057}, +{6257, 2241, 5073}, +{6225, 2225, 5137}, +{6161, 2129, 5233}, +{6353, 1857, 4993}, +{6257, 1745, 5057}, +{6705, 1265, 6097}, +{5425, 2721, 5409}, +{6577, 1441, 4993}, +{6033, 1745, 5329}, +{6129, 1905, 5585}, +{5969, 1473, 5649}, +{6177, 1473, 5633}, +{6241, 865, 5201}, +{6321, 1121, 5153}, +{6609, 1345, 4865}, +{6353, 1057, 5297}, +{6305, 785, 5457}, +{6401, 1169, 5281}, +{6465, 1281, 4961}, +{6529, 1169, 4737}, +{6769, 1729, 4593}, +{7169, 1121, 4865}, +{6721, 1217, 4737}, +{6737, 897, 4865}, +{6497, 417, 5233}, +{6529, 609, 5025}, +{6625, 289, 5009}, +{6513, 369, 4977}, +{6129, 209, 5217}, +{6273, 177, 5377}, +{6481, 49, 5185}, +{6401, 353, 4993}, +{6833, 1057, 4833}, +{6593, 1953, 4625}, +{6289, 801, 4849}, +{6737, 897, 5473}, +{6257, 1665, 4833}, +{6577, 1921, 4881}, +{6465, 913, 5457}, +{6737, 689, 5121}, +{6513, 897, 4945}, +{6305, 1489, 5121}, +{6241, 1393, 5585}, +{6241, 513, 5569}, +{6241, 801, 5377}, +{6241, 1393, 5553}, +{6097, 977, 5553}, +{6177, 449, 5585}, +{6385, 1089, 5329}, +{6449, 1793, 4705}, +{6369, 2257, 4945}, +{6849, 1457, 5489}, +{6465, 1697, 4689}, +{6801, 2001, 4769}, +{6529, 2113, 4849}, +{6593, 1713, 4913}, +{6385, 1265, 5105}, +{6481, 1329, 5585}, +{5905, 1409, 5361}, +{6321, 1633, 5313}, +{6209, 689, 5473}, +{6113, 401, 5713}, +{6049, 1265, 5473}, +{5969, 1409, 5553}, +{6033, 1601, 5633}, +{6289, 1409, 5105}, +{6417, 1569, 4865}, +{6385, 1793, 5073}, +{6225, 2177, 5185}, +{6257, 1665, 5281}, +{6529, 1921, 4801}, +{6369, 2241, 5009}, +{6449, 1953, 5249}, +{6321, 2273, 5009}, +{6305, 2257, 4945}, +{6321, 1585, 5201}, +{6273, 1393, 5153}, +{6097, 1649, 5361}, +{6049, 1793, 5489}, +{6161, 1057, 5489}, +{6033, 1057, 5569}, +{5905, 1313, 5745}, +{6145, 1281, 5553}, +{6257, 1073, 5329}, +{6257, 2017, 5169}, +{6081, 2097, 5393}, +{6129, 1665, 5729}, +{6145, 1665, 5537}, +{6241, 2177, 5009}, +{6305, 2129, 5025}, +{6097, 2273, 5281}, +{6129, 2609, 5249}, +{6513, 1521, 5137}, +{6433, 1937, 4881}, +{6305, 1297, 5169}, +{6097, 1473, 5329}, +{5985, 1473, 5809}, +{6113, 1553, 5185}, +{6257, 1265, 5041}, +{6033, 1713, 5345}, +{6065, 1569, 5553}, +{6433, 1345, 5217}, +{6209, 2161, 4993}, +{6257, 2657, 4945}, +{6129, 2609, 5153}, +{5969, 2625, 5329}, +{6033, 2529, 4961}, +{6081, 3169, 4945}, +{6369, 2657, 4961}, +{6465, 2497, 4833}, +{6289, 1665, 5153}, +{6081, 1473, 5329}, +{5905, 2081, 5425}, +{5857, 1889, 5729}, +{6033, 1825, 5537}, +{6161, 1729, 5233}, +{6065, 1745, 5617}, +{6049, 1553, 5809}, +{6273, 2017, 5009}, +{6401, 1585, 5041}, +{6129, 1969, 5105}, +{6081, 2161, 5729}, +{6209, 2385, 5185}, +{6353, 1857, 4993}, +{6241, 2225, 4881}, +{6065, 2033, 5425}, +{6097, 2401, 5489}, +{6193, 1937, 5265}, +{6193, 1185, 5281}, +{5953, 2017, 5233}, +{6065, 1633, 5537}, +{6065, 1873, 5473}, +{6081, 1569, 5473}, +{6177, 1649, 5473}, +{6177, 1569, 5457}, +{6209, 1265, 5457}, +{6225, 1201, 5345}, +{6193, 1921, 5041}, +{6273, 2161, 5601}, +{6353, 1857, 5297}, +{6433, 1425, 4993}, +{6321, 1873, 4849}, +{6161, 2657, 5201}, +{6273, 2033, 5505}, +{6241, 1825, 5569}, +{6193, 913, 5025}, +{6097, 673, 4977}, +{6545, 1761, 5729}, +{6065, -111, 5601}, +{5969, 881, 5473}, +{6161, 1409, 5121}, +{5889, 737, 5585}, +{6097, 1713, 5057}, +{6561, 1377, 4449}, +{6673, 1697, 5313}, +{6433, 2689, 5345}, +{6401, 2049, 4737}, +{6081, 1777, 5153}, +{5969, 1793, 5969}, +{6081, 1553, 5745}, +{6081, 2049, 5201}, +{6257, 1313, 5201}, +{6433, 1297, 4801}, +{6337, 1009, 5249}, +{6081, 1121, 5601}, +{5713, 289, 6017}, +{5793, 417, 6113}, +{5729, 737, 6209}, +{6385, 913, 5345}, +{6049, 1121, 5457}, +{6177, 1553, 5153}, +{6321, 1713, 5217}, +{6113, 1921, 5665}, +{6177, 1489, 5185}, +{6225, 1825, 4993}, +{6241, 2097, 5265}, +{6369, 2241, 5201}, +{6369, 2289, 5009}, +{6385, 1761, 5409}, +{6289, 2049, 4977}, +{6129, 1553, 4657}, +{5905, 609, 5697}, +{5713, 785, 5905}, +{6193, 1073, 5553}, +{5761, 1233, 5873}, +{6129, 737, 5697}, +{6321, 1297, 5089}, +{6561, 1297, 4865}, +{6337, 1825, 5649}, +{6161, 1793, 5489}, +{6177, 1585, 5217}, +{6113, 1729, 5217}, +{6353, 2465, 5041}, +{6353, 2513, 4929}, +{6193, 1729, 5345}, +{6161, 1633, 5217}, +{6097, 1473, 5345}, +{6081, 2129, 5377}, +{6145, 2001, 5281}, +{5825, 1473, 5457}, +{6241, 1393, 5265}, +{6241, 1937, 5073}, +{6225, 1425, 5585}, +{6273, 1873, 5281}, +{6369, 1761, 5025}, +{6289, 1793, 5281}, +{5937, 1809, 5537}, +{5905, 2433, 5617}, +{6209, 2001, 5297}, +{6097, 1953, 5425}, +{6017, 2305, 5441}, +{6257, 2385, 5297}, +{5921, 1713, 5505}, +{6081, 1937, 5505}, +{6001, 2193, 5457}, +{5745, 2177, 5777}, +{5505, 993, 5393}, +{5089, 2737, 6161}, +{6737, 1953, 5041}, +{6753, 465, 5457}, +{6209, 961, 4657}, +{6849, 1057, 4817}, +{6641, 2289, 4801}, +{6593, 1617, 4785}, +{6401, 673, 5585}, +{6641, 1841, 4769}, +{6593, 1585, 4625}, +{6625, 1249, 4929}, +{6561, 1329, 5169}, +{6609, 1233, 4609}, +{6609, 1393, 4785}, +{6657, 833, 4913}, +{6241, 721, 5505}, +{6561, 593, 5473}, +{6561, 625, 4961}, +{6241, 897, 5313}, +{6481, 513, 5537}, +{6353, 369, 5313}, +{6257, 497, 5153}, +{6529, 1297, 4849}, +{6673, 1153, 5041}, +{6465, 801, 5393}, +{6609, 1057, 4961}, +{6641, 1473, 4977}, +{6241, 2113, 4657}, +{6257, 1873, 4977}, +{6689, 1121, 5185}, +{6673, 1249, 4769}, +{6641, 1393, 4849}, +{6497, 849, 5137}, +{6401, 977, 5505}, +{6289, 1249, 5457}, +{6305, 1185, 5249}, +{6081, 1633, 5457}, +{6161, 1361, 5569}, +{6353, 1633, 5009}, +{6545, 1601, 4961}, +{6337, 2081, 4865}, +{6401, 1601, 5169}, +{6385, 1569, 5185}, +{6577, 2737, 4769}, +{6321, 2001, 5009}, +{6321, 2529, 4897}, +{6337, 2161, 5121}, +{6305, 1937, 5233}, +{6193, 1409, 5393}, +{5665, 1777, 5585}, +{5889, 1457, 5857}, +{6097, 1505, 5489}, +{6065, 1585, 5425}, +{5953, 1697, 5473}, +{5921, 1361, 5777}, +{6049, 1569, 5377}, +{6369, 2049, 4929}, +{6561, 1985, 4977}, +{6001, 2481, 5185}, +{6145, 2065, 5217}, +{6273, 2161, 4881}, +{6177, 2305, 5137}, +{6177, 2465, 5409}, +{6193, 2433, 5345}, +{6337, 1985, 5057}, +{6065, 1745, 5265}, +{5873, 1665, 5649}, +{5649, 2049, 5905}, +{6209, 1761, 5233}, +{6145, 1297, 5249}, +{5921, 1601, 5617}, +{6081, 1873, 5729}, +{6257, 1825, 5137}, +{6385, 1857, 4801}, +{6033, 2545, 5537}, +{6257, 2465, 5377}, +{6289, 2033, 5137}, +{6465, 1905, 4833}, +{6593, 2353, 4737}, +{6289, 2289, 4961}, +{6353, 2273, 4785}, +{6417, 1537, 5137}, +{6257, 1617, 5137}, +{6209, 1345, 5393}, +{6001, 1697, 5249}, +{6241, 1505, 5377}, +{6001, 1281, 5425}, +{6017, 1137, 5537}, +{5793, 1377, 5921}, +{5777, 1185, 6001}, +{6257, 1409, 5169}, +{6273, 1793, 5201}, +{5889, 1873, 5521}, +{5809, 2161, 5425}, +{5921, 2065, 5409}, +{6097, 1841, 4993}, +{6305, 1761, 5473}, +{6209, 1857, 5649}, +{6449, 1393, 5217}, +{6209, 1121, 5361}, +{6273, 1041, 5361}, +{6065, 1633, 5345}, +{6321, 1297, 5777}, +{6353, 705, 5521}, +{6081, 865, 5297}, +{6017, 1009, 5649}, +{6081, 1025, 5569}, +{6289, 545, 5537}, +{6209, 1105, 5153}, +{6449, 1217, 5233}, +{6273, 1521, 5233}, +{6465, 1105, 5233}, +{6497, 1137, 4945}, +{6401, 1457, 5041}, +{6529, 1713, 5329}, +{6353, 1137, 5409}, +{6561, 1553, 5041}, +{6481, 1377, 5009}, +{6481, 1297, 5073}, +{6449, 721, 5345}, +{6305, 881, 5393}, +{6065, 369, 5649}, +{5761, 529, 5825}, +{5777, 721, 6129}, +{5585, 1217, 6081}, +{6449, 961, 5361}, +{6337, 993, 5137}, +{6305, 1329, 5201}, +{6209, 2113, 5057}, +{6353, 1793, 5361}, +{6721, 1297, 5393}, +{6497, 1841, 4817}, +{6177, 2193, 5073}, +{6225, 2017, 5377}, +{6145, 2049, 5473}, +{6497, 1505, 5105}, +{6001, 2225, 4817}, +{6273, 1649, 5217}, +{5969, 1921, 5569}, +{6161, 1521, 5457}, +{6193, 1249, 5393}, +{6033, 1169, 5649}, +{5921, 1537, 5665}, +{6129, 1409, 5585}, +{6113, 1633, 5297}, +{6273, 1457, 5121}, +{6289, 2049, 5281}, +{6145, 1969, 5569}, +{6161, 1761, 5249}, +{6273, 1761, 5009}, +{6465, 2273, 5025}, +{6433, 2081, 4961}, +{6449, 1793, 5153}, +{6449, 1905, 5201}, +{6481, 1905, 5009}, +{6385, 1761, 4817}, +{6401, 1473, 4977}, +{6081, 1713, 5217}, +{6113, 1505, 5217}, +{6145, 1489, 5201}, +{6129, 1457, 5425}, +{6113, 1761, 5585}, +{6321, 1521, 5169}, +{6561, 1537, 5025}, +{6417, 1777, 4945}, +{6193, 2289, 5153}, +{6273, 1761, 5345}, +{6001, 2017, 5185}, +{6465, 2305, 4977}, +{6321, 2401, 4865}, +{6433, 1777, 5185}, +{6353, 1633, 5281}, +{6497, 2289, 5425}, +{6337, 1473, 5217}, +{6337, 1649, 5041}, +{6161, 2097, 5441}, +{6017, 1905, 5425}, +{6209, 1569, 5249}, +{6193, 1425, 5217}, +{5937, 1713, 5313}, +{5889, 1953, 5777}, +{6113, 1457, 5985}, +{6433, 1697, 5137}, +{6337, 2241, 5137}, +{6097, 2289, 5089}, +{6161, 1633, 5521}, +{6257, 1889, 5185}, +{6353, 2161, 4929}, +{6305, 1969, 5249}, +{6305, 2033, 5281}, +{6353, 2225, 5137}, +{6401, 1841, 5041}, +{6401, 1569, 5169}, +{6097, 1889, 5377}, +{6001, 1697, 5361}, +{6033, 1713, 5217}, +{6113, 1425, 5505}, +{6017, 1649, 5649}, +{6177, 1441, 5409}, +{6481, 1425, 5153}, +{6385, 1761, 4961}, +{6081, 1953, 5217}, +{5777, 2097, 5553}, +{6609, 961, 5761}, +{6353, 2017, 4769}, +{6449, 2225, 5057}, +{6385, 1505, 5537}, +{6081, 1969, 5281}, +{6161, 497, 5553}, +{6449, 1121, 5329}, +{6177, 897, 5313}, +{6129, 753, 4929}, +{6273, -79, 5425}, +{6129, 305, 5505}, +{6033, -127, 5633}, +{6049, -223, 5777}, +{6289, 273, 5617}, +{6305, 113, 5377}, +{6433, 657, 5121}, +{6353, 209, 5361}, +{6209, 65, 5793}, +{6241, 593, 5345}, +{6561, 753, 5153}, +{6433, 673, 5233}, +{6705, 737, 5329}, +{6465, -335, 5345}, +{6161, 257, 4945}, +{6369, 145, 5073}, +{6225, 337, 5793}, +{5969, -463, 5697}, +{6065, 49, 5505}, +{6657, -847, 6177}, +{5777, 497, 5233}, +{6401, 545, 5649}, +{6449, 1057, 5137}, +{6561, 993, 5073}, +{6481, 1537, 4817}, +{6881, 1137, 4993}, +{6321, 1537, 5121}, +{6433, 1729, 4929}, +{6561, 1297, 5457}, +{6449, 1217, 5265}, +{6177, 1921, 5121}, +{6305, 1633, 5201}, +{6017, 1217, 5185}, +{6353, 785, 5441}, +{6321, 737, 5489}, +{6129, 977, 5201}, +{6193, 1329, 5137}, +{6257, 801, 5825}, +{6177, 1169, 5377}, +{6801, 1361, 4753}, +{6769, 1777, 4657}, +{6257, 2305, 4625}, +{6417, 1889, 4545}, +{6641, 1937, 4865}, +{6545, 2193, 5105}, +{6433, 2065, 5185}, +{6769, 1937, 5105}, +{6577, 1761, 5393}, +{6241, 2337, 5105}, +{6257, 1825, 5201}, +{6017, 1681, 5153}, +{5921, 1009, 5425}, +{5985, 1121, 5457}, +{5825, 1185, 5489}, +{6113, 1105, 5777}, +{6193, 1457, 5537}, +{6337, 1697, 4625}, +{6321, 1985, 4721}, +{6657, 2465, 5585}, +{6433, 2241, 4833}, +{6561, 2577, 4401}, +{6481, 2577, 4545}, +{6289, 2673, 4897}, +{6401, 2193, 5169}, +{6385, 2257, 5169}, +{6145, 2241, 4881}, +{5905, 1889, 5409}, +{5905, 1329, 5601}, +{6257, 1537, 5345}, +{6081, 1281, 5217}, +{6065, 1361, 5265}, +{5841, 1345, 5489}, +{5681, 1409, 5761}, +{6353, 1601, 5121}, +{6449, 1761, 5265}, +{6353, 1985, 5233}, +{6273, 2129, 5297}, +{6273, 1985, 5233}, +{6161, 1969, 4961}, +{6129, 2209, 5201}, +{6129, 2161, 5249}, +{6097, 2241, 5233}, +{6129, 2465, 5217}, +{6193, 1905, 5361}, +{6097, 1697, 5249}, +{6017, 1585, 5521}, +{5697, 1697, 5761}, +{5729, 1793, 5969}, +{5761, 1729, 5521}, +{5857, 1521, 6097}, +{5873, 2017, 6033}, +{5985, 1809, 5537}, +{6081, 1985, 5313}, +{6049, 2241, 5617}, +{5937, 3393, 6065}, +{6241, 3681, 4721}, +{6481, 3569, 4673}, +{6577, 3521, 4433}, +{6145, 2881, 3889}, +{6257, 2817, 5201}, +{6337, 2769, 5777}, +{6289, 2577, 5777}, +{6177, 1985, 5793}, +{5969, 2529, 4321}, +{5921, 1649, 4865}, +{6033, 1825, 5089}, +{6033, 1537, 5681}, +{6161, 929, 5841}, +{6001, 1041, 4945}, +{6385, 1201, 5153}, +{5889, 1441, 5393}, +{6113, 1633, 5297}, +{6129, 1457, 5313}, +{6001, 2145, 5537}, +{6161, 1809, 6065}, +{6161, 1745, 5105}, +{6481, 1969, 5073}, +{6481, 2113, 5073}, +{6209, 1953, 5393}, +{6113, 1889, 5601}, +{6273, 2033, 5073}, +{6177, 1681, 5201}, +{6033, 1649, 5489}, +{6001, 2145, 5297}, +{5809, 1505, 5329}, +{5713, 1249, 5873}, +{5921, 1249, 5905}, +{5745, 1057, 6049}, +{5873, 1377, 5729}, +{6289, 1089, 5265}, +{5953, 1713, 5377}, +{5793, 1425, 5953}, +{5985, 1169, 5681}, +{6049, 1185, 5489}, +{6305, 1713, 4945}, +{6225, 1905, 5681}, +{6161, 1457, 5665}, +{6177, 1233, 5409}, +{6369, 1153, 5169}, +{6097, 1345, 5345}, +{6017, 1073, 5921}, +{5841, 1201, 5729}, +{6081, 1105, 5377}, +{5969, 1217, 5729}, +{5809, 1185, 5921}, +{5857, 929, 5697}, +{6065, 2097, 5249}, +{6033, 2033, 5281}, +{6001, 2449, 5441}, +{6193, 1681, 5441}, +{6177, 1937, 5201}, +{6049, 1969, 5393}, +{6033, 1713, 5729}, +{6001, 2209, 5361}, +{6161, 1649, 5345}, +{6097, 1361, 5505}, +{5729, 1361, 5745}, +{5793, 1857, 5777}, +{6033, 1217, 5745}, +{5889, 1233, 5553}, +{5969, 1169, 5553}, +{6017, 1185, 5617}, +{5985, 1265, 5681}, +{6001, 1233, 5569}, +{6033, 1137, 5473}, +{5985, 2033, 5313}, +{5969, 1537, 5569}, +{6145, 1473, 5233}, +{6209, 1713, 5201}, +{6033, 1985, 5537}, +{6097, 1777, 5649}, +{6209, 1489, 5457}, +{6033, 1217, 5489}, +{6065, 1569, 5505}, +{6081, 1713, 5457}, +{6209, 1425, 5441}, +{6209, 945, 5393}, +{6145, 1169, 5489}, +{5937, 1569, 5569}, +{6145, 1441, 5569}, +{6225, 1569, 5265}, +{6353, 1441, 5025}, +{6209, 1937, 5521}, +{6177, 1873, 5569}, +{6145, 1953, 5137}, +{6337, 2145, 4897}, +{6337, 2081, 5137}, +{6225, 1857, 5345}, +{6321, 2017, 5281}, +{6209, 1633, 5249}, +{6113, 1745, 5377}, +{6177, 1809, 5297}, +{5905, 1169, 5617}, +{5825, 1505, 5665}, +{6001, 1601, 5617}, +{6033, 1969, 5505}, +{6113, 1153, 5585}, +{6257, 1793, 5041}, +{6225, 1617, 5137}, +{5937, 2689, 5121}, +{5521, 1345, 6049}, +{6609, 1329, 5889}, +{6577, 1729, 5457}, +{5617, 2225, 5537}, +{6753, 1521, 5489}, +{6433, 1073, 5569}, +{6497, 1617, 4961}, +{6097, 1329, 4785}, +{6049, 481, 5857}, +{6017, -79, 5521}, +{6161, 689, 5313}, +{6401, 81, 5393}, +{6241, 65, 5617}, +{6417, 353, 5441}, +{6321, 305, 5169}, +{6433, 577, 5057}, +{6241, 593, 5361}, +{6225, 465, 5569}, +{6241, 497, 5377}, +{6129, 497, 5553}, +{6177, 241, 5617}, +{6353, 1185, 5489}, +{6545, 209, 5537}, +{6289, -255, 5313}, +{6241, -191, 5409}, +{5889, -79, 6145}, +{6385, -143, 5441}, +{6273, 161, 5441}, +{6209, 257, 5393}, +{5873, -271, 6049}, +{6353, -367, 5585}, +{6385, 33, 5633}, +{6513, 1329, 4961}, +{6465, 1105, 4993}, +{6545, 993, 5105}, +{6369, 737, 5233}, +{6513, 1889, 5233}, +{6209, 1505, 5297}, +{6529, 817, 5377}, +{6625, 1009, 5441}, +{6433, 1105, 4881}, +{6273, 1569, 4689}, +{6817, 1761, 5137}, +{5905, 849, 5489}, +{6241, 1505, 5233}, +{6081, 1921, 5345}, +{6257, 1089, 5857}, +{5969, 401, 5617}, +{5921, 1249, 5361}, +{6209, 2145, 5041}, +{6337, 1825, 5521}, +{6177, 1489, 5665}, +{6113, 1425, 5313}, +{6289, 2289, 4817}, +{6177, 1233, 5521}, +{6081, 1921, 5425}, +{6417, 913, 5665}, +{6145, 1073, 5345}, +{6049, 1313, 5329}, +{5697, 1089, 6209}, +{5777, 1073, 5969}, +{5825, 849, 5697}, +{5985, 1345, 5649}, +{5729, 1505, 5729}, +{5905, 1185, 5841}, +{5937, 1185, 5585}, +{5809, 1297, 5505}, +{5681, 1761, 5745}, +{5969, 1569, 5777}, +{5937, 1393, 5649}, +{6225, 1729, 5281}, +{6241, 1697, 5281}, +{5953, 1505, 5633}, +{6049, 1905, 5585}, +{6273, 1409, 5345}, +{6257, 1073, 5473}, +{5905, 609, 5505}, +{5729, 497, 5665}, +{5665, 561, 6145}, +{5713, 257, 5793}, +{5409, 113, 6145}, +{5345, 913, 6401}, +{5825, 753, 5921}, +{6225, 961, 5585}, +{6241, 481, 5361}, +{5569, 593, 6065}, +{6049, 225, 6273}, +{5713, 673, 6321}, +{5825, 721, 5793}, +{5969, 977, 5441}, +{5889, 881, 5841}, +{5857, 849, 6017}, +{5985, 497, 5809}, +{5729, 865, 5873}, +{5841, 1089, 5745}, +{5649, 657, 6241}, +{5617, 401, 6081}, +{5569, 497, 6033}, +{5617, 481, 5905}, +{5537, 513, 6337}, +{5745, 449, 5969}, +{5873, 641, 5713}, +{6001, 785, 5473}, +{6001, 1265, 5601}, +{5969, 1041, 5809}, +{5969, 753, 5601}, +{5921, 1297, 5505}, +{5841, 1441, 5713}, +{5937, 1409, 5905}, +{5873, 1297, 5857}, +{6065, 1361, 5537}, +{6081, 1041, 5473}, +{5777, 1121, 5825}, +{5809, 865, 6161}, +{5681, 865, 5953}, +{5761, 529, 5873}, +{5681, 1041, 6337}, +{5665, 705, 6241}, +{5745, 657, 5969}, +{6001, 929, 5457}, +{6001, 1153, 5457}, +{6033, 1521, 5569}, +{5985, 817, 5713}, +{6017, 1329, 5377}, +{6161, 1809, 5361}, +{6049, 1633, 5569}, +{6001, 1345, 5601}, +{5953, 1313, 5633}, +{6049, 1473, 5569}, +{6001, 1105, 5569}, +{5617, 833, 5793}, +{5889, 961, 5905}, +{5953, 881, 5633}, +{5889, 673, 5617}, +{5793, 753, 5809}, +{5809, 1073, 5969}, +{6177, 1137, 5425}, +{6209, 1009, 5361}, +{6049, 1025, 5473}, +{6081, 1297, 5617}, +{5889, 977, 5809}, +{6033, 1281, 5505}, +{5953, 1505, 5489}, +{6097, 1793, 5793}, +{6001, 1457, 5825}, +{6049, 1521, 5537}, +{5985, 1281, 5473}, +{5745, 1009, 5841}, +{5521, 945, 6417}, +{6049, 1441, 5633}, +{5921, 1185, 5425}, +{5809, 1265, 5633}, +{5633, 1329, 6337}, +{5697, 1265, 5985}, +{6097, 1105, 5537}, +{6081, 1441, 5233}, +{5921, 2161, 5425}, +{6049, 1537, 5857}, +{6033, 1521, 5601}, +{6113, 1537, 5217}, +{6097, 1985, 5233}, +{6049, 1809, 5585}, +{6257, 1425, 5425}, +{6033, 1377, 5377}, +{6225, 1553, 5297}, +{5921, 1057, 5649}, +{5681, 1393, 6097}, +{5825, 913, 5713}, +{5985, 1025, 5489}, +{5761, 625, 5889}, +{5617, 849, 6305}, +{5857, 593, 6161}, +{5937, 977, 5457}, +{5985, 1489, 5393}, +{6065, 1425, 5553}, +{5937, 1217, 5985}, +{5969, 977, 5665}, +{6081, 1665, 5329}, +{6113, 1537, 5489}, +{5841, 1537, 5921}, +{6129, 1537, 5617}, +{5985, 657, 5681}, +{5825, 657, 5745}, +{5665, 1089, 5857}, +{5889, 1137, 6001}, +{5713, 657, 6033}, +{5793, 929, 5809}, +{5681, 769, 5921}, +{5697, 1025, 6273}, +{5809, 1601, 5665}, +{6129, 913, 5457}, +{5921, 657, 5489}, +{5713, 1921, 5585}, +{5825, 1489, 5889}, +{5825, 1249, 5585}, +{5841, 1361, 5521}, +{5921, 1521, 5921}, +{5825, 1905, 5825}, +{5953, 769, 5713}, +{6049, 1217, 5489}, +{5857, 881, 5553}, +{5921, 1393, 5713}, +{5793, 1153, 6049}, +{5905, 881, 5601}, +{5825, 737, 5761}, +{5681, 1105, 6065}, +{5649, 833, 6273}, +{5729, 961, 6033}, +{5953, 753, 5521}, +{5985, 1057, 5553}, +{5729, 2177, 5569}, +{6305, 433, 6561}, +{6273, 1345, 5137}, +{6257, 1361, 5345}, +{5905, 1249, 5505}, +{6209, 1009, 5393}, +{6033, 1361, 5265}, +{6401, 369, 5697}, +{6769, 1217, 4529}, +{6801, 1089, 4561}, +{6433, 865, 4481}, +{6449, 369, 5265}, +{6257, 81, 5457}, +{6321, 497, 5377}, +{6305, 81, 5521}, +{6545, 177, 5153}, +{6577, 97, 5025}, +{6609, 513, 4817}, +{6721, 865, 4929}, +{6609, 705, 5121}, +{6353, 241, 5345}, +{6241, 465, 5345}, +{6369, 1217, 5249}, +{6321, 945, 5265}, +{6593, 497, 5281}, +{6529, 737, 5089}, +{6897, 369, 5201}, +{6417, 1121, 4561}, +{6833, 161, 4833}, +{6337, -79, 5425}, +{6545, 49, 5137}, +{6369, 305, 5137}, +{6369, 1, 5681}, +{5857, 897, 5345}, +{6225, 657, 5809}, +{6385, 1041, 5233}, +{6689, 1137, 5281}, +{6497, 1569, 4881}, +{6337, 2225, 4497}, +{6081, 1377, 5089}, +{6609, 1633, 4721}, +{6465, 2017, 4641}, +{6593, 2065, 5073}, +{6481, 1313, 5217}, +{6465, 1265, 5585}, +{6465, 1505, 5313}, +{6353, 1905, 5489}, +{6385, 1729, 5777}, +{6257, 2145, 5921}, +{5409, 1489, 4737}, +{5121, -463, 6465}, +{5505, 801, 6209}, +{5265, 1137, 6385}, +{5729, 577, 5969}, +{5873, 321, 5777}, +{5761, 1553, 5569}, +{5857, 1697, 5793}, +{5889, 1073, 6385}, +{5841, 1409, 5969}, +{6049, 1249, 5441}, +{6209, 929, 5201}, +{6017, 545, 5729}, +{6001, 1441, 5937}, +{6209, 1073, 5681}, +{6161, 1153, 5585}, +{5889, 881, 5489}, +{5729, 833, 5825}, +{5777, 673, 6193}, +{5585, 817, 5953}, +{5425, 369, 6193}, +{5585, 481, 6193}, +{5793, 737, 5969}, +{6209, 1105, 5345}, +{6209, 1185, 5249}, +{6113, 1745, 5457}, +{5873, 1889, 5889}, +{5825, 1313, 5985}, +{5777, 1329, 5729}, +{5841, 1425, 5617}, +{5777, 2225, 5713}, +{5905, 2385, 5793}, +{5937, 1345, 5777}, +{5729, 1409, 5681}, +{5745, 1233, 5761}, +{5537, 1441, 5921}, +{5473, 1537, 6017}, +{5553, 929, 5921}, +{5585, 849, 6017}, +{5585, 1057, 6017}, +{5473, 673, 6401}, +{5537, 881, 5985}, +{6145, 1121, 5569}, +{5953, 1793, 5521}, +{6001, 1537, 5809}, +{5889, 1457, 5777}, +{6017, 1377, 5617}, +{5905, 1905, 5489}, +{5953, 1793, 5601}, +{6049, 1489, 5569}, +{5969, 1569, 5809}, +{5905, 1137, 5633}, +{5713, 1313, 5809}, +{5569, 1649, 6081}, +{5793, 929, 5985}, +{5681, 769, 5857}, +{5681, 961, 5793}, +{5729, 1345, 6001}, +{5617, 561, 6225}, +{5601, 849, 6049}, +{5921, 1233, 5569}, +{5857, 1649, 5569}, +{6017, 1713, 5601}, +{5889, 769, 5889}, +{5777, 1121, 5729}, +{5937, 1761, 5553}, +{5889, 1473, 5633}, +{5857, 1361, 5985}, +{6033, 1617, 5713}, +{6257, 1601, 5521}, +{6225, 1185, 5249}, +{6161, 1105, 5153}, +{6017, 849, 5297}, +{5633, 1169, 5937}, +{6113, 1393, 5473}, +{6257, 401, 5441}, +{5937, 657, 5697}, +{5985, 993, 5777}, +{5969, 1441, 5601}, +{6241, 1073, 5473}, +{5857, 1729, 5489}, +{6017, 1633, 5649}, +{6065, 1681, 5681}, +{6113, 1457, 5281}, +{6193, 1745, 5153}, +{6209, 1825, 5409}, +{6113, 1729, 5585}, +{5937, 1697, 5665}, +{6033, 1105, 5841}, +{6033, 2001, 5537}, +{6145, 1665, 5249}, +{6209, 865, 5297}, +{6017, 1377, 5601}, +{5793, 769, 5889}, +{5697, 1025, 5889}, +{5601, 897, 6081}, +{5617, 1249, 6049}, +{6097, 833, 5697}, +{6193, 1105, 5409}, +{6001, 1313, 5553}, +{6033, 1617, 5521}, +{5985, 1745, 5617}, +{6001, 1409, 5761}, +{6033, 1537, 5441}, +{6129, 1729, 5313}, +{6017, 1665, 5313}, +{5905, 1617, 5953}, +{5825, 1457, 5937}, +{6097, 1585, 5553}, +{5969, 1153, 5665}, +{5857, 1441, 5633}, +{5889, 1169, 5761}, +{5889, 1217, 5873}, +{5889, 881, 5793}, +{5633, 1089, 5985}, +{5649, 961, 6033}, +{5617, 993, 6049}, +{5681, 849, 6065}, +{5745, 1057, 5937}, +{5921, 1185, 5745}, +{5825, 945, 5729}, +{5841, 1249, 5665}, +{5889, 1441, 5681}, +{5905, 1329, 5809}, +{5857, 1249, 5697}, +{5937, 1489, 5665}, +{5809, 1681, 5937}, +{5889, 1873, 5665}, +{5921, 1505, 5697}, +{6065, 1489, 5361}, +{6049, 1265, 5409}, +{6017, 1489, 5489}, +{5937, 1201, 5617}, +{5745, 1265, 5937}, +{5777, 1281, 5873}, +{5937, 1265, 5649}, +{5745, 945, 5969}, +{5777, 929, 5905}, +{5761, 945, 5905}, +{5777, 961, 5793}, +{5921, 561, 5777}, +{5857, 865, 5761}, +{5969, 1201, 5569}, +{5681, 1633, 5777}, +{5681, 1089, 6129}, +{5537, 1377, 6001}, +{5825, 1617, 5777}, +{5697, 1601, 5841}, +{5745, 1441, 5953}, +{5729, 1313, 5985}, +{5921, 1377, 5681}, +{5841, 1521, 5729}, +{5793, 929, 5969}, +{5585, 1601, 5937}, +{5761, 1281, 5921}, +{5697, 945, 5873}, +{5697, 881, 5921}, +{5713, 1073, 5841}, +{5585, 993, 5841}, +{5489, 961, 5985}, +{5889, 785, 6321}, +{5745, 1057, 6145}, +{6529, 1441, 5249}, +{6321, 561, 4401}, +{6497, 913, 5089}, +{6161, 513, 5553}, +{6449, 353, 5233}, +{6401, 417, 5121}, +{6273, 561, 5217}, +{6577, 273, 5249}, +{6465, -335, 5025}, +{6417, 97, 5041}, +{6497, -319, 5185}, +{6209, -559, 5345}, +{6001, -719, 5697}, +{5937, -1039, 6241}, +{5905, -895, 5745}, +{5985, -687, 5425}, +{5985, -1103, 5601}, +{6193, -911, 5393}, +{6257, -943, 5313}, +{6433, -351, 5233}, +{6129, 65, 4865}, +{6369, 49, 5937}, +{6305, -543, 5537}, +{6577, -383, 5345}, +{6785, 737, 5185}, +{6673, 289, 4593}, +{5969, 1313, 4817}, +{7969, 145, 4897}, +{6497, 1393, 5057}, +{6593, -591, 5169}, +{5921, -159, 5201}, +{6113, -367, 5761}, +{6129, 33, 5649}, +{6577, -447, 5361}, +{6177, 769, 5073}, +{6241, 209, 5761}, +{6209, -79, 6321}, +{6305, 209, 5713}, +{6577, 881, 4945}, +{6497, 1489, 4785}, +{6321, 657, 5313}, +{6241, 625, 5601}, +{6529, 929, 5377}, +{6449, 1489, 4977}, +{6193, 1585, 4961}, +{6273, 625, 5825}, +{6257, 1457, 5345}, +{6529, 785, 5249}, +{6289, 913, 4929}, +{6081, 385, 4897}, +{5809, -223, 6113}, +{5889, -271, 6049}, +{5761, -463, 5905}, +{5905, 33, 5793}, +{5921, 17, 5729}, +{5873, -111, 6049}, +{6081, -175, 5777}, +{6065, 65, 5697}, +{6193, 769, 5169}, +{6305, 865, 5121}, +{6337, 337, 5505}, +{6177, 417, 5697}, +{6241, 881, 5297}, +{6065, 1009, 5297}, +{6017, 545, 5745}, +{6193, 257, 5649}, +{6433, 641, 5361}, +{6401, 705, 5265}, +{6161, -399, 5473}, +{6033, 289, 5745}, +{6113, 257, 5553}, +{6161, -175, 5601}, +{6193, -335, 5569}, +{6113, 81, 5361}, +{6113, 465, 5393}, +{6001, 641, 5313}, +{6161, 2049, 6881}, +{6257, 1105, 5473}, +{6129, 1761, 5313}, +{6353, 2529, 5249}, +{6353, 2737, 5377}, +{6545, 2257, 4897}, +{6497, 2497, 5281}, +{6353, 2977, 4929}, +{6353, 2129, 3681}, +{6449, 2593, 4081}, +{6001, 1505, 5937}, +{6353, 1425, 5169}, +{6049, 1665, 5457}, +{5953, 1409, 5489}, +{6017, 977, 5617}, +{5617, 753, 5793}, +{5761, 897, 5713}, +{5825, 577, 5841}, +{5937, 753, 5649}, +{5793, 353, 5425}, +{6001, 225, 6049}, +{6353, 417, 5169}, +{6353, 577, 5521}, +{5921, 913, 5377}, +{6017, 1153, 5025}, +{6193, 1537, 6129}, +{5937, 1393, 5921}, +{5969, 1265, 5553}, +{6081, 1505, 5505}, +{6097, 1729, 5329}, +{6129, 1921, 5729}, +{5937, 1617, 5521}, +{6113, 1665, 5297}, +{6241, 1505, 5297}, +{6273, 1857, 5249}, +{5921, 1185, 5729}, +{5889, 1073, 5905}, +{6145, 1025, 5569}, +{6049, 961, 5457}, +{5889, 1089, 5665}, +{5745, 1057, 5921}, +{5889, 289, 5969}, +{6049, 929, 5585}, +{6129, 1105, 5425}, +{6049, 977, 5569}, +{5873, 1361, 5697}, +{6161, 1393, 5569}, +{6033, 1457, 5473}, +{6241, 1649, 5233}, +{6209, 2001, 5185}, +{6161, 1681, 5345}, +{6097, 1697, 5473}, +{6161, 1777, 5297}, +{6273, 1681, 5297}, +{6225, 1793, 5313}, +{6017, 1553, 5441}, +{5921, 1201, 5745}, +{5889, 1425, 5697}, +{6033, 1073, 5633}, +{5905, 1089, 5489}, +{5921, 897, 5681}, +{5745, 977, 6049}, +{5937, 1265, 5681}, +{6097, 865, 5473}, +{6081, 1217, 5441}, +{5873, 1281, 5713}, +{5889, 1697, 5729}, +{6129, 1585, 5553}, +{6097, 1489, 5425}, +{6097, 1457, 5409}, +{6049, 1633, 5473}, +{6033, 1697, 5569}, +{6129, 1505, 5441}, +{6129, 1537, 5473}, +{6177, 1761, 5345}, +{6193, 1585, 5361}, +{6145, 1393, 5441}, +{5841, 1473, 5697}, +{6065, 1233, 5585}, +{6129, 1073, 5425}, +{6001, 1073, 5553}, +{5969, 1185, 5649}, +{6049, 1089, 5697}, +{6129, 817, 5569}, +{6033, 1201, 5409}, +{6049, 993, 5553}, +{5969, 1361, 5553}, +{6017, 1313, 5633}, +{6225, 1409, 5313}, +{6209, 1217, 5297}, +{6193, 1457, 5329}, +{6193, 1633, 5345}, +{6033, 1505, 5665}, +{6129, 1537, 5441}, +{6145, 1553, 5409}, +{6161, 1473, 5457}, +{6161, 1281, 5553}, +{5969, 1361, 5617}, +{5985, 1281, 5617}, +{6033, 1249, 5553}, +{6001, 1041, 5585}, +{5969, 1137, 5681}, +{5889, 1089, 5825}, +{5921, 1185, 5761}, +{6113, 993, 5649}, +{6129, 1153, 5441}, +{6049, 1121, 5601}, +{6017, 1137, 5601}, +{6081, 1265, 5457}, +{6081, 1265, 5521}, +{6081, 1233, 5601}, +{5937, 1425, 5633}, +{6049, 1361, 5601}, +{6017, 1345, 5665}, +{5969, 1265, 5665}, +{6113, 1697, 5473}, +{6177, 1617, 5425}, +{6129, 1025, 5521}, +{5921, 1121, 5713}, +{5841, 1089, 5825}, +{6033, 1185, 5649}, +{5985, 1105, 5601}, +{5905, 1089, 5729}, +{5857, 737, 5873}, +{5857, 897, 5921}, +{5809, 849, 5809}, +{6129, 1073, 5505}, +{6001, 673, 5569}, +{6113, 1073, 5569}, +{6097, 1281, 5569}, +{6097, 1441, 5457}, +{6113, 1233, 5329}, +{5409, 1953, 5489}, +{6065, 1281, 5969}, +{5905, 1969, 5569}, +{6449, 1313, 4977}, +{6529, 1329, 4401}, +{6657, 945, 5041}, +{6273, 1121, 5473}, +{6369, 417, 5169}, +{6321, 385, 5345}, +{6289, 705, 5185}, +{6433, 417, 5329}, +{6161, 225, 5505}, +{6257, 417, 5121}, +{6657, 177, 4881}, +{6337, 241, 5393}, +{6369, 657, 5457}, +{6609, 849, 5089}, +{6577, 433, 5169}, +{6465, 913, 5169}, +{6641, 865, 4849}, +{6545, 1201, 4897}, +{6401, 945, 5265}, +{6449, 801, 5233}, +{6689, 929, 5025}, +{6625, 1041, 4945}, +{6577, 897, 4929}, +{6385, 417, 5201}, +{6289, 289, 5601}, +{6145, 241, 5521}, +{6193, 609, 5361}, +{6209, 353, 5537}, +{6385, 401, 5585}, +{6673, 609, 5265}, +{6273, 465, 5217}, +{6545, 513, 5105}, +{6369, 1185, 4977}, +{6465, 913, 5121}, +{6433, 753, 5249}, +{6305, 1137, 5265}, +{6321, 1313, 5249}, +{6289, 1313, 5441}, +{6321, 1057, 5393}, +{6257, 993, 5345}, +{6321, 1217, 5169}, +{6401, 817, 5201}, +{6465, 577, 5313}, +{6257, 481, 5537}, +{6401, 769, 5441}, +{6305, 513, 5249}, +{6001, 929, 5441}, +{5969, 849, 5825}, +{5953, 785, 6177}, +{6097, 609, 5777}, +{6097, 1281, 5425}, +{6081, 1489, 5617}, +{6145, 1345, 5553}, +{6289, 1185, 5073}, +{6225, 1313, 5169}, +{6433, 1409, 4961}, +{6113, 1521, 5537}, +{6225, 1265, 5681}, +{6161, 705, 5665}, +{6353, 1041, 5585}, +{5953, 1377, 5521}, +{6097, 1265, 5473}, +{6081, 1265, 5489}, +{5681, 881, 6193}, +{5857, 1521, 5953}, +{6209, 1457, 4977}, +{5969, 1537, 5617}, +{5889, 1313, 5793}, +{6049, 1553, 5937}, +{6065, 1425, 5745}, +{6001, 1681, 5521}, +{5537, 1937, 5777}, +{5889, 1937, 6273}, +{6289, 1329, 5489}, +{6257, 1201, 5057}, +{6241, 1425, 4721}, +{6209, 1937, 4929}, +{6049, 913, 5601}, +{5969, 1201, 5905}, +{6097, 1313, 5681}, +{6097, 1201, 5681}, +{5937, 1169, 5825}, +{5857, 1281, 5857}, +{6097, 1073, 5601}, +{6001, 1009, 5521}, +{5985, 1137, 5713}, +{6033, 1137, 5601}, +{5857, 1217, 5665}, +{5905, 1009, 5889}, +{5969, 1265, 5745}, +{5985, 1313, 5553}, +{6209, 1649, 5313}, +{6049, 1377, 5633}, +{6305, 1505, 5313}, +{6385, 1457, 5105}, +{6289, 1601, 5089}, +{6353, 1729, 5265}, +{6225, 1713, 5457}, +{6289, 1505, 5425}, +{6289, 1617, 5313}, +{6273, 1665, 5233}, +{6081, 1409, 5441}, +{6145, 1553, 5361}, +{5985, 977, 5665}, +{5953, 1169, 5809}, +{5825, 865, 5889}, +{5905, 1073, 5921}, +{5809, 945, 5921}, +{5777, 673, 5857}, +{5873, 897, 5745}, +{5921, 545, 5745}, +{5953, 865, 5761}, +{5985, 1041, 5713}, +{5921, 1025, 5873}, +{5969, 1025, 5745}, +{5969, 849, 5633}, +{5953, 1105, 5569}, +{5969, 1457, 5665}, +{5985, 1393, 5633}, +{6033, 1137, 5713}, +{6097, 961, 5697}, +{6209, 1025, 5329}, +{6113, 641, 5553}, +{6049, 1089, 5649}, +{6001, 753, 5729}, +{5953, 817, 5729}, +{5969, 721, 5777}, +{5825, 1073, 5809}, +{5841, 897, 5905}, +{5873, 1009, 5809}, +{6001, 801, 5713}, +{5937, 865, 5713}, +{5969, 1185, 5633}, +{5921, 1281, 5665}, +{5969, 1521, 5601}, +{6033, 1457, 5681}, +{6001, 1473, 5537}, +{6033, 1569, 5441}, +{5969, 1617, 5537}, +{5969, 1809, 5681}, +{6017, 1585, 5665}, +{6177, 1729, 5409}, +{6145, 1649, 5281}, +{6017, 1841, 5473}, +{5857, 1585, 5569}, +{5761, 1297, 5809}, +{5905, 1585, 5761}, +{5969, 1201, 5729}, +{5825, 1409, 5601}, +{5681, 1313, 5953}, +{5729, 1473, 6097}, +{5857, 1025, 5969}, +{5953, 1185, 5585}, +{5969, 1377, 5537}, +{5985, 1633, 5633}, +{5921, 1457, 5745}, +{5889, 1601, 5729}, +{5873, 1409, 5617}, +{5905, 1777, 5649}, +{5777, 1969, 5681}, +{5905, 1889, 5649}, +{6017, 1873, 5553}, +{5985, 1761, 5617}, +{6033, 1553, 5537}, +{5937, 1521, 5569}, +{5841, 1313, 5681}, +{5841, 1585, 5729}, +{5921, 1265, 5761}, +{5937, 1569, 5329}, +{5953, 1025, 5809}, +{5873, 1553, 5905}, +{5921, 945, 5953}, +{5841, 1249, 5713}, +{5729, 1889, 5521}, +{5857, 2337, 5569}, +{6193, 2129, 5393}, +{5825, 2497, 5473}, +{6113, 1985, 5361}, +{5921, 2097, 5473}, +{5953, 2209, 5537}, +{6193, 1953, 5361}, +{6065, 2113, 5377}, +{6001, 1953, 5441}, +{5905, 1857, 5553}, +{5793, 1873, 5665}, +{5761, 1345, 5729}, +{5777, 865, 5473}, +{5729, 1073, 5649}, +{5553, 1569, 6065}, +{5665, 1169, 6177}, +{5873, 1473, 5425}, +{5985, 1729, 5169}, +{6033, 1809, 5281}, +{5617, 1745, 6097}, +{5793, 1841, 5441}, +{5777, 2081, 5185}, +{5793, 1905, 5809}, +{5457, 1841, 5905}, +{5617, 1569, 6129}, +{5809, 1633, 5921}, +{5889, 1889, 5729}, +{5873, 1553, 5537}, +{5793, 1217, 5457}, +{5713, 1265, 6241}, +{5777, 1201, 5857}, +{5745, 1153, 5761}, +{5841, 1041, 5873}, +{6049, 1025, 5665}, +{6257, 945, 5665}, +{6065, 849, 5281}, +{6321, 1089, 5185}, +{6369, 1505, 5169}, +{6401, 977, 5425}, +{6097, 913, 5681}, +{6289, 1105, 5345}, +{6449, 1441, 5201}, +{6305, 1137, 5121}, +{6465, 1329, 5073}, +{6369, 897, 5393}, +{6497, 1073, 5249}, +{6433, 1121, 4929}, +{6241, 1121, 5281}, +{6193, 641, 5569}, +{6177, 433, 5553}, +{6113, 513, 5393}, +{6161, 705, 5457}, +{6273, 289, 5649}, +{6193, 337, 5665}, +{6401, 577, 5329}, +{6561, 385, 5217}, +{6305, 1121, 4929}, +{6065, 2193, 5425}, +{6769, -47, 5345}, +{6449, 1889, 5041}, +{6417, 1409, 5345}, +{6177, 1521, 5281}, +{6001, 1873, 5393}, +{6417, 1249, 5057}, +{6225, 945, 4929}, +{6241, 1041, 4945}, +{5969, 1601, 5329}, +{5665, 1889, 6081}, +{5649, 2417, 6609}, +{5745, 1361, 5585}, +{5985, 1441, 5473}, +{5953, 2289, 5537}, +{5985, 1393, 5377}, +{5921, 2081, 5441}, +{5905, 2241, 5601}, +{5985, 1921, 5489}, +{6097, 1969, 5249}, +{6081, 2161, 5169}, +{6097, 2065, 5329}, +{6097, 2241, 5585}, +{6097, 2241, 5393}, +{6065, 1809, 5409}, +{5969, 1633, 5377}, +{5937, 1745, 5537}, +{5953, 1985, 5601}, +{5921, 1793, 5553}, +{5889, 1729, 5569}, +{5793, 1809, 5937}, +{5841, 1793, 5873}, +{6129, 1665, 5505}, +{6241, 1361, 5361}, +{6049, 2081, 5105}, +{5937, 2273, 5249}, +{6033, 2161, 5633}, +{5921, 2017, 5905}, +{5889, 2033, 5713}, +{6001, 2097, 5217}, +{5825, 2337, 5553}, +{5953, 2129, 5633}, +{6017, 2065, 5409}, +{6017, 1777, 5457}, +{6065, 2273, 5297}, +{5889, 1873, 5537}, +{5809, 1825, 5713}, +{5745, 1425, 5841}, +{5777, 1777, 5745}, +{5889, 1265, 5585}, +{5809, 1681, 5777}, +{5873, 1553, 5777}, +{6033, 1505, 5665}, +{6065, 1393, 5489}, +{5953, 2017, 5329}, +{6129, 1553, 5553}, +{6065, 1185, 5521}, +{6049, 1297, 5489}, +{6017, 1585, 5377}, +{6033, 1889, 5329}, +{5953, 1921, 5537}, +{6113, 1681, 5473}, +{6177, 1825, 5297}, +{6113, 1697, 5329}, +{5985, 1505, 5425}, +{5937, 1457, 5649}, +{5857, 1425, 5921}, +{5825, 1185, 5681}, +{5809, 1377, 5745}, +{5713, 1393, 5873}, +{5745, 1217, 6049}, +{5825, 1281, 5777}, +{5937, 1169, 5649}, +{5905, 1185, 5585}, +{5873, 1345, 5665}, +{5857, 1377, 5713}, +{5873, 1633, 5873}, +{5889, 1473, 5745}, +{5841, 1249, 5601}, +{5873, 1729, 5617}, +{5793, 1761, 5633}, +{5777, 1441, 5969}, +{5873, 1681, 5713}, +{5985, 1665, 5505}, +{5969, 1601, 5617}, +{5873, 1537, 5617}, +{5857, 1297, 5841}, +{5761, 1313, 5969}, +{6017, 1377, 5409}, +{5953, 1265, 5473}, +{5889, 1329, 5537}, +{5873, 1265, 5809}, +{5953, 1169, 5697}, +{6049, 1249, 5489}, +{6113, 1361, 5441}, +{6065, 1601, 5441}, +{5873, 1585, 5553}, +{5809, 1617, 5761}, +{5841, 1857, 5665}, +{5873, 1793, 5489}, +{5969, 1809, 5505}, +{5857, 1873, 5633}, +{5969, 2225, 5409}, +{6017, 1617, 5537}, +{6049, 1697, 5521}, +{5953, 1505, 5553}, +{5905, 1761, 5489}, +{6001, 1601, 5825}, +{5905, 1393, 5553}, +{5921, 1441, 5505}, +{5777, 1265, 5633}, +{5681, 1681, 5889}, +{5985, 1521, 5617}, +{6065, 1169, 5441}, +{5969, 1425, 5473}, +{5841, 1521, 5649}, +{5777, 1857, 5809}, +{5793, 1745, 5953}, +{5825, 1745, 5553}, +{5841, 1841, 5553}, +{5889, 2017, 5569}, +{5793, 1873, 5681}, +{5937, 1889, 5729}, +{5921, 1985, 5505}, +{6017, 1921, 5441}, +{5905, 1649, 5681}, +{5905, 1585, 5697}, +{5937, 1761, 5569}, +{6097, 1409, 5265}, +{6017, 1377, 5441}, +{5905, 1377, 5649}, +{5793, 1665, 5921}, +{6001, 1521, 5649}, +{6065, 1473, 5361}, +{6033, 1313, 5521}, +{5873, 1777, 5697}, +{5841, 1649, 5857}, +{5761, 1569, 6001}, +{5841, 1793, 5409}, +{5777, 1729, 5537}, +{5809, 1713, 5713}, +{5713, 1905, 5777}, +{5761, 1681, 5969}, +{5889, 1937, 5569}, +{5857, 1713, 5553}, +{5777, 1521, 5761}, +{5745, 1457, 5857}, +{5745, 1777, 5745}, +{5825, 1393, 5777}, +{5825, 1377, 5777}, +{5825, 1345, 5761}, +{5745, 1681, 5841}, +{5697, 1361, 5841}, +{5761, 1377, 5905}, +{5937, 1409, 5633}, +{5873, 1617, 5601}, +{5745, 1857, 5521}, +{5793, 1793, 5601}, +{5793, 1969, 5889}, +{5857, 2049, 5489}, +{5889, 2161, 5377}, +{5873, 2385, 5409}, +{5873, 2193, 5585}, +{5793, 2001, 5681}, +{5985, 2401, 5297}, +{6001, 2289, 5377}, +{5873, 2289, 5409}, +{5857, 1729, 5617}, +{5825, 2017, 5601}, +{5889, 1761, 5569}, +{5841, 1713, 5521}, +{5793, 1601, 5601}, +{5825, 1873, 5793}, +{5841, 1521, 5857}, +{5921, 1441, 5633}, +{5905, 1793, 5601}, +{5809, 1745, 5713}, +{5809, 1793, 5713}, +{5905, 1761, 5745}, +{5921, 1745, 5473}, +{5713, 1745, 5425}, +{5793, 2129, 5585}, +{6689, 897, 6161}, +{6065, 2913, 5681}, +{6097, 1521, 5537}, +{6097, 1761, 5457}, +{6273, 1153, 5441}, +{6273, 1521, 5361}, +{6257, 1889, 5137}, +{6033, 1329, 5009}, +{6033, 209, 5729}, +{6113, 177, 5713}, +{5953, 609, 5761}, +{6129, 481, 5713}, +{5937, 481, 5665}, +{6129, 449, 5409}, +{6177, 369, 5457}, +{6177, 609, 5489}, +{6225, 305, 5569}, +{6097, 401, 5537}, +{6145, 305, 5649}, +{6081, 625, 5457}, +{6113, 705, 5457}, +{6081, 561, 5473}, +{6273, 609, 5633}, +{6433, 481, 5281}, +{6385, 529, 5217}, +{5873, 593, 5569}, +{6657, -1983, 5969}, +{5873, 1185, 5345}, +{6289, -607, 5681}, +{5489, 1441, 5313}, +{6033, -63, 5921}, +{6081, 1009, 5745}, +{5889, 1041, 6129}, +{6241, 817, 5345}, +{6145, 689, 5313}, +{6209, 1121, 5377}, +{6321, 1121, 5665}, +{6321, 1505, 5297}, +{6321, 1537, 5185}, +{6161, 2001, 4721}, +{6513, 2097, 5041}, +{6513, 1777, 5313}, +{6289, 1793, 5361}, +{5921, 2241, 4977}, +{6369, 2865, 4865}, +{5953, 3041, 5185}, +{6273, 3457, 4753}, +{6097, 3841, 4641}, +{6241, 3521, 4577}, +{6145, 2705, 4753}, +{6113, 2305, 4481}, +{5729, 2353, 4609}, +{5777, 3169, 7057}, +{6065, 2049, 4977}, +{6049, 1953, 5073}, +{5857, 2673, 5393}, +{5873, 2625, 5633}, +{5953, 2289, 5633}, +{5761, 2657, 5377}, +{5841, 2577, 5217}, +{5841, 2529, 5377}, +{5857, 2433, 5585}, +{5857, 2849, 5585}, +{5937, 2385, 5329}, +{5905, 2449, 5201}, +{6001, 2337, 5329}, +{5841, 2273, 5473}, +{5793, 2273, 5505}, +{5761, 2209, 5649}, +{5809, 2209, 5633}, +{5745, 2033, 5649}, +{5745, 2177, 5745}, +{5633, 2177, 5793}, +{5921, 2049, 5569}, +{5937, 1681, 5489}, +{5873, 1905, 5553}, +{5761, 2401, 5553}, +{5697, 2545, 5633}, +{5697, 2481, 5665}, +{5809, 2305, 5697}, +{5873, 2417, 5313}, +{5809, 2593, 5377}, +{5745, 2449, 5553}, +{5793, 2465, 5713}, +{5905, 2689, 5313}, +{5969, 2065, 5457}, +{5841, 2081, 5489}, +{5761, 1921, 5569}, +{5713, 2289, 5569}, +{5665, 2401, 5825}, +{5745, 1857, 5585}, +{5857, 1713, 5521}, +{5761, 1969, 5601}, +{5857, 2065, 5761}, +{5761, 1969, 5713}, +{6033, 1361, 5521}, +{5873, 2209, 5505}, +{5761, 2289, 5345}, +{5713, 2497, 5249}, +{5905, 2801, 5649}, +{6001, 2529, 5057}, +{6001, 2625, 5041}, +{6033, 2817, 5185}, +{5873, 2913, 5297}, +{5857, 2561, 5505}, +{5825, 2337, 5585}, +{5857, 2065, 5361}, +{5905, 2193, 5377}, +{5873, 1985, 5665}, +{5793, 1969, 5585}, +{5905, 1889, 5617}, +{5729, 1905, 5745}, +{5857, 1633, 5697}, +{5777, 1889, 5681}, +{5969, 2129, 5441}, +{6113, 1617, 5617}, +{6065, 1649, 5569}, +{5809, 2161, 5377}, +{5889, 2369, 5441}, +{5905, 1825, 5745}, +{6001, 2529, 5377}, +{6033, 2321, 5089}, +{6065, 2129, 5313}, +{5985, 2209, 5441}, +{6001, 2273, 5553}, +{6033, 1889, 5601}, +{5937, 1617, 5361}, +{5905, 1841, 5409}, +{5953, 1777, 5601}, +{6001, 1793, 5761}, +{5873, 1457, 5633}, +{5857, 1857, 5457}, +{5905, 1393, 5761}, +{5889, 1345, 5697}, +{5985, 1313, 5489}, +{6017, 1521, 5409}, +{5889, 2577, 5217}, +{5937, 2673, 5457}, +{5921, 2913, 5393}, +{5889, 2737, 5265}, +{6001, 2433, 5025}, +{6017, 2625, 5121}, +{5953, 2721, 5265}, +{6033, 2881, 5297}, +{6049, 2593, 5217}, +{6065, 2529, 5217}, +{5985, 2513, 5121}, +{5825, 2593, 5489}, +{5889, 2289, 5633}, +{5873, 2081, 5505}, +{5761, 1985, 5553}, +{5841, 2129, 5553}, +{5857, 2209, 5729}, +{5969, 1953, 5281}, +{5953, 2129, 5265}, +{5985, 2177, 5441}, +{5937, 2497, 5473}, +{6017, 2337, 5265}, +{6001, 2289, 5137}, +{5889, 2625, 5281}, +{5889, 2561, 5441}, +{5921, 2369, 5585}, +{6177, 2465, 5201}, +{5953, 2497, 5249}, +{5953, 2273, 5345}, +{6001, 2193, 5393}, +{5793, 2113, 5521}, +{5873, 1921, 5697}, +{5777, 1729, 5697}, +{5793, 2113, 5745}, +{5921, 1777, 5841}, +{5873, 2033, 5665}, +{5985, 1793, 5521}, +{5953, 1745, 5553}, +{5889, 2273, 5377}, +{5889, 2465, 5457}, +{6049, 2225, 5521}, +{5889, 2033, 5473}, +{5873, 2273, 5393}, +{5857, 2577, 5585}, +{5953, 2433, 5697}, +{6017, 2417, 5425}, +{6033, 2289, 5169}, +{5921, 2065, 5329}, +{5889, 1953, 5729}, +{5857, 2113, 5617}, +{6033, 1793, 5345}, +{5921, 2097, 5201}, +{5873, 1681, 5729}, +{5825, 2113, 5697}, +{5953, 1921, 5489}, +{5985, 1761, 5425}, +{6081, 1665, 5393}, +{6001, 2289, 5569}, +{6049, 2401, 5537}, +{6017, 2273, 5457}, +{5921, 1809, 5297}, +{5937, 2225, 5329}, +{5985, 2433, 5585}, +{5953, 2049, 5425}, +{6033, 2193, 5297}, +{5969, 2113, 5393}, +{5857, 1809, 5505}, +{5921, 1969, 5537}, +{5937, 2353, 5265}, +{5985, 2033, 5393}, +{5841, 2257, 5409}, +{5777, 2049, 5649}, +{5809, 1873, 5857}, +{5921, 1793, 5393}, +{5713, 2785, 5745}, +{6017, 1777, 5649}, +{5857, 2785, 5313}, +{6065, 2049, 5937}, +{6033, 2113, 5281}, +{6001, 1985, 5153}, +{5905, 2417, 5505}, +{5713, 2305, 5713}, +{5905, 2641, 5921}, +{6497, 1777, 4417}, +{6497, 673, 4625}, +{6721, 1057, 4785}, +}; +static const uint32_t duration_HRD[] = +{ +41, +39, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +40, +40, +80, +40, +40, +}; +static const uint32_t frame_HRD[] = +{ +0, +1, +2, +3, +4, +5, +6, +7, +8, +9, +10, +11, +12, +13, +14, +15, +16, +17, +18, +19, +20, +21, +22, +23, +24, +25, +26, +27, +28, +29, +30, +31, +32, +33, +34, +35, +36, +37, +38, +39, +40, +41, +42, +43, +44, +45, +46, +47, +48, +49, +50, +51, +52, +53, +54, +55, +56, +57, +58, +59, +60, +61, +62, +63, +64, +65, +66, +67, +68, +69, +70, +71, +72, +73, +74, +75, +76, +77, +78, +79, +80, +81, +82, +83, +84, +85, +86, +87, +88, +89, +90, +91, +92, +93, +94, +95, +96, +97, +98, +99, +100, +101, +102, +103, +104, +105, +106, +107, +108, +109, +110, +111, +112, +113, +114, +115, +116, +117, +118, +119, +120, +121, +122, +123, +124, +125, +126, +127, +128, +129, +130, +131, +132, +133, +134, +135, +136, +137, +138, +139, +140, +141, +142, +143, +144, +145, +146, +147, +148, +149, +150, +151, +152, +153, +154, +155, +156, +157, +158, +159, +160, +161, +162, +163, +164, +165, +166, +167, +168, +169, +170, +171, +172, +173, +174, +175, +176, +177, +178, +179, +180, +181, +182, +183, +184, +185, +186, +187, +188, +189, +190, +191, +192, +193, +194, +195, +196, +197, +198, +199, +200, +201, +202, +203, +204, +205, +206, +207, +208, +209, +210, +211, +212, +213, +214, +215, +216, +217, +218, +219, +220, +221, +222, +223, +224, +225, +226, +227, +228, +229, +230, +231, +232, +233, +234, +235, +236, +237, +238, +239, +240, +241, +242, +243, +244, +245, +246, +247, +248, +249, +250, +251, +252, +253, +254, +255, +0, +1, +2, +3, +4, +5, +6, +7, +8, +9, +10, +11, +12, +13, +14, +15, +16, +17, +18, +19, +20, +21, +22, +23, +24, +25, +26, +27, +28, +29, +30, +31, +32, +33, +34, +35, +36, +37, +38, +39, +40, +41, +42, +43, +44, +45, +46, +47, +48, +49, +50, +51, +52, +53, +54, +55, +56, +57, +58, +59, +60, +61, +62, +63, +64, +65, +66, +67, +68, +69, +70, +71, +72, +73, +74, +75, +76, +77, +78, +79, +80, +81, +82, +83, +84, +85, +86, +87, +88, +89, +90, +91, +92, +93, +94, +95, +96, +97, +98, +99, +100, +101, +102, +103, +104, +105, +106, +107, +108, +109, +110, +111, +112, +113, +114, +115, +116, +117, +118, +119, +120, +121, +122, +123, +124, +125, +126, +127, +128, +129, +130, +131, +132, +133, +134, +135, +136, +137, +138, +139, +140, +141, +142, +143, +144, +145, +146, +147, +148, +149, +150, +151, +152, +153, +154, +155, +156, +157, +158, +159, +160, +161, +162, +163, +164, +165, +166, +167, +168, +169, +170, +171, +172, +173, +174, +175, +176, +177, +178, +179, +180, +181, +182, +183, +184, +185, +186, +187, +188, +189, +190, +191, +192, +193, +194, +195, +196, +197, +198, +199, +200, +201, +202, +203, +204, +205, +206, +207, +208, +209, +210, +211, +212, +213, +214, +215, +216, +217, +218, +219, +220, +221, +222, +223, +224, +225, +226, +227, +228, +229, +230, +231, +232, +233, +234, +235, +236, +237, +238, +239, +240, +241, +242, +243, +244, +245, +246, +247, +248, +249, +250, +251, +252, +253, +254, +255, +0, +1, +2, +3, +4, +5, +6, +7, +8, +9, +10, +11, +12, +13, +14, +15, +16, +17, +18, +19, +20, +21, +22, +23, +24, +25, +26, +27, +28, +29, +30, +31, +32, +33, +34, +35, +36, +37, +38, +39, +40, +41, +42, +43, +44, +45, +46, +47, +48, +49, +50, +51, +52, +53, +54, +55, +56, +57, +58, +59, +60, +61, +62, +63, +64, +65, +66, +67, +68, +69, +70, +71, +72, +73, +74, +75, +76, +77, +78, +79, +80, +81, +82, +83, +84, +85, +86, +87, +88, +89, +90, +91, +92, +93, +94, +95, +96, +97, +98, +99, +100, +101, +102, +103, +104, +105, +106, +107, +108, +109, +110, +111, +112, +113, +114, +115, +116, +117, +118, +119, +120, +121, +122, +123, +124, +125, +126, +127, +128, +129, +130, +131, +132, +133, +134, +135, +136, +137, +138, +139, +140, +141, +142, +143, +144, +145, +146, +147, +148, +149, +150, +151, +152, +153, +154, +155, +156, +157, +158, +159, +160, +161, +162, +163, +164, +165, +166, +167, +168, +169, +170, +171, +172, +173, +174, +175, +176, +177, +178, +179, +180, +181, +182, +183, +184, +185, +186, +187, +188, +189, +190, +191, +192, +193, +194, +195, +196, +197, +198, +199, +200, +201, +202, +203, +204, +205, +206, +207, +208, +209, +210, +211, +212, +213, +214, +215, +216, +217, +218, +219, +220, +221, +222, +223, +224, +225, +226, +227, +228, +229, +230, +231, +232, +233, +234, +235, +236, +237, +238, +239, +240, +241, +242, +243, +244, +245, +246, +247, +248, +249, +250, +251, +252, +253, +254, +255, +0, +1, +2, +3, +4, +5, +6, +7, +8, +9, +10, +11, +12, +13, +14, +15, +16, +17, +18, +19, +20, +21, +22, +23, +24, +25, +26, +27, +28, +29, +30, +31, +32, +33, +34, +35, +36, +37, +38, +39, +40, +41, +42, +43, +44, +45, +46, +47, +48, +49, +50, +51, +52, +53, +54, +55, +56, +57, +58, +59, +60, +61, +62, +63, +64, +65, +66, +67, +68, +69, +70, +71, +72, +73, +74, +75, +76, +77, +78, +79, +80, +81, +82, +83, +84, +85, +86, +87, +88, +89, +90, +91, +92, +93, +94, +95, +96, +97, +98, +99, +100, +101, +102, +103, +104, +105, +106, +107, +108, +109, +110, +111, +112, +113, +114, +115, +116, +117, +118, +119, +120, +121, +122, +123, +124, +125, +126, +127, +128, +129, +130, +131, +132, +133, +134, +135, +136, +137, +138, +139, +140, +141, +142, +143, +144, +145, +146, +147, +148, +149, +150, +151, +152, +153, +154, +155, +156, +157, +158, +159, +160, +161, +162, +163, +164, +165, +166, +167, +168, +169, +170, +171, +172, +173, +174, +175, +176, +177, +178, +179, +180, +181, +182, +183, +184, +185, +186, +187, +188, +189, +190, +191, +192, +193, +194, +195, +196, +197, +198, +199, +200, +201, +202, +203, +204, +205, +206, +207, +208, +209, +210, +211, +212, +213, +214, +215, +216, +217, +218, +219, +220, +221, +222, +223, +224, +225, +226, +227, +228, +229, +230, +231, +232, +233, +234, +235, +236, +237, +238, +239, +240, +241, +242, +243, +244, +245, +246, +247, +248, +249, +250, +251, +252, +253, +254, +255, +0, +1, +2, +3, +4, +5, +6, +7, +8, +9, +10, +11, +12, +13, +14, +15, +16, +17, +18, +19, +20, +21, +22, +23, +24, +25, +26, +27, +28, +29, +30, +31, +32, +33, +34, +35, +36, +37, +38, +39, +40, +41, +42, +43, +44, +45, +46, +47, +48, +49, +50, +51, +52, +53, +54, +55, +56, +57, +58, +59, +60, +61, +62, +63, +64, +65, +66, +67, +68, +69, +70, +71, +72, +73, +74, +75, +76, +77, +78, +79, +80, +81, +82, +83, +84, +85, +86, +87, +88, +89, +90, +91, +92, +93, +94, +95, +96, +97, +98, +99, +100, +101, +102, +103, +104, +105, +106, +107, +108, +109, +110, +111, +112, +113, +114, +115, +116, +117, +118, +119, +120, +121, +122, +123, +124, +125, +126, +127, +128, +129, +130, +131, +132, +133, +134, +135, +136, +137, +138, +139, +140, +141, +142, +143, +144, +145, +146, +147, +148, +149, +150, +151, +152, +153, +154, +155, +156, +157, +158, +159, +160, +161, +162, +163, +164, +165, +166, +167, +168, +169, +170, +171, +172, +173, +174, +175, +176, +177, +178, +179, +180, +181, +182, +183, +184, +185, +186, +187, +188, +189, +190, +191, +192, +193, +194, +195, +196, +197, +198, +199, +200, +201, +202, +203, +204, +205, +206, +207, +208, +209, +210, +211, +212, +213, +214, +215, +216, +217, +218, +219, +220, +221, +222, +223, +224, +225, +226, +227, +228, +229, +230, +231, +232, +233, +234, +235, +236, +237, +238, +239, +240, +241, +242, +243, +244, +245, +246, +247, +248, +249, +250, +251, +252, +253, +254, +255, +0, +1, +2, +3, +4, +5, +6, +7, +8, +9, +10, +11, +12, +13, +14, +15, +16, +17, +18, +19, +20, +21, +22, +23, +24, +25, +26, +27, +28, +29, +30, +31, +32, +33, +34, +35, +36, +37, +38, +39, +40, +41, +42, +43, +44, +45, +46, +47, +48, +49, +50, +51, +52, +53, +54, +55, +56, +57, +58, +59, +60, +61, +62, +63, +64, +65, +66, +67, +68, +69, +70, +71, +72, +73, +74, +75, +76, +77, +78, +79, +80, +81, +82, +83, +84, +85, +86, +87, +88, +89, +90, +91, +92, +93, +94, +95, +96, +97, +98, +99, +100, +101, +102, +103, +104, +105, +106, +107, +108, +109, +110, +111, +112, +113, +114, +115, +116, +117, +118, +119, +120, +121, +122, +123, +124, +125, +126, +127, +128, +129, +130, +131, +132, +133, +134, +135, +136, +137, +138, +139, +140, +141, +142, +143, +144, +145, +146, +147, +148, +149, +150, +151, +152, +153, +154, +155, +156, +157, +158, +159, +160, +161, +162, +163, +164, +165, +166, +167, +168, +169, +170, +171, +172, +173, +174, +175, +176, +177, +178, +179, +180, +181, +182, +183, +184, +185, +186, +187, +188, +189, +190, +191, +192, +193, +194, +195, +196, +197, +198, +199, +200, +201, +202, +203, +204, +205, +206, +207, +208, +209, +210, +211, +212, +213, +214, +215, +216, +217, +218, +219, +220, +221, +222, +223, +224, +225, +226, +227, +228, +229, +230, +231, +232, +233, +234, +235, +236, +237, +238, +239, +240, +241, +242, +243, +244, +245, +246, +247, +248, +249, +250, +251, +252, +253, +254, +255, +0, +1, +2, +3, +4, +5, +6, +7, +8, +9, +10, +11, +12, +13, +14, +15, +16, +17, +18, +19, +20, +21, +22, +23, +24, +25, +26, +27, +28, +29, +30, +31, +32, +33, +34, +35, +36, +37, +38, +39, +40, +41, +42, +43, +44, +45, +46, +47, +48, +49, +50, +51, +52, +53, +54, +55, +56, +57, +58, +59, +60, +61, +62, +63, +64, +65, +66, +67, +68, +69, +70, +71, +72, +73, +74, +75, +76, +77, +78, +79, +80, +81, +82, +83, +84, +85, +86, +87, +88, +89, +90, +91, +92, +93, +94, +95, +96, +97, +98, +99, +100, +101, +102, +103, +104, +105, +106, +107, +108, +109, +110, +111, +112, +113, +114, +115, +116, +117, +118, +119, +120, +121, +122, +123, +124, +125, +126, +127, +128, +129, +130, +131, +132, +133, +134, +135, +136, +137, +138, +139, +140, +141, +142, +143, +144, +145, +146, +147, +148, +149, +150, +151, +152, +153, +154, +155, +156, +157, +158, +159, +160, +161, +162, +163, +164, +165, +166, +167, +168, +169, +170, +171, +172, +173, +174, +175, +176, +177, +178, +179, +180, +181, +182, +183, +184, +185, +186, +187, +188, +189, +190, +191, +192, +193, +194, +195, +196, +197, +198, +199, +200, +201, +202, +203, +204, +205, +206, +207, +208, +209, +210, +211, +212, +213, +214, +215, +216, +217, +218, +219, +220, +221, +222, +223, +224, +225, +226, +227, +228, +229, +230, +231, +232, +233, +234, +235, +236, +237, +238, +239, +240, +241, +242, +243, +244, +245, +246, +247, +248, +249, +250, +251, +252, +253, +254, +255, +0, +1, +2, +3, +4, +5, +6, +7, +8, +9, +10, +11, +12, +13, +14, +15, +16, +17, +18, +19, +20, +21, +22, +23, +24, +25, +26, +27, +28, +29, +30, +31, +32, +33, +34, +35, +36, +37, +38, +39, +40, +41, +42, +43, +44, +45, +46, +47, +48, +49, +50, +51, +52, +53, +54, +55, +56, +57, +58, +59, +60, +61, +62, +63, +64, +65, +66, +67, +68, +69, +70, +71, +72, +73, +74, +75, +76, +77, +78, +79, +80, +81, +82, +83, +84, +85, +86, +87, +88, +89, +90, +91, +92, +93, +94, +95, +96, +97, +98, +99, +100, +101, +102, +103, +104, +105, +106, +107, +108, +109, +110, +111, +112, +113, +114, +115, +116, +117, +118, +119, +120, +121, +122, +123, +124, +125, +126, +127, +128, +129, +130, +131, +132, +133, +134, +135, +136, +137, +138, +139, +140, +141, +142, +143, +144, +145, +146, +147, +148, +149, +150, +151, +152, +153, +154, +155, +156, +157, +158, +159, +160, +161, +162, +163, +164, +165, +166, +167, +168, +169, +170, +171, +172, +173, +174, +175, +176, +177, +178, +179, +180, +181, +182, +183, +184, +185, +186, +187, +188, +189, +190, +191, +192, +193, +194, +195, +196, +197, +198, +199, +200, +201, +202, +203, +204, +205, +206, +207, +208, +209, +210, +211, +212, +213, +214, +215, +216, +217, +218, +219, +220, +221, +222, +223, +224, +225, +226, +227, +228, +229, +230, +231, +232, +233, +234, +235, +236, +237, +238, +239, +240, +241, +242, +243, +244, +245, +246, +247, +248, +249, +250, +251, +252, +253, +254, +255, +0, +1, +2, +3, +4, +5, +6, +7, +8, +9, +10, +11, +12, +13, +14, +15, +16, +17, +18, +19, +20, +21, +22, +23, +24, +25, +26, +27, +28, +29, +30, +31, +32, +33, +34, +35, +36, +37, +38, +39, +40, +41, +42, +43, +44, +45, +46, +47, +48, +49, +50, +51, +52, +53, +54, +55, +56, +57, +58, +59, +60, +61, +62, +63, +64, +65, +66, +67, +68, +69, +70, +71, +72, +73, +74, +75, +76, +77, +78, +79, +80, +81, +82, +83, +84, +85, +86, +87, +88, +89, +90, +91, +92, +93, +94, +95, +96, +97, +98, +99, +100, +101, +102, +103, +104, +105, +106, +107, +108, +109, +110, +111, +112, +113, +114, +115, +116, +117, +118, +119, +120, +121, +122, +123, +124, +125, +126, +127, +128, +129, +130, +131, +132, +133, +134, +135, +136, +137, +138, +139, +140, +141, +142, +143, +144, +145, +146, +147, +148, +149, +150, +151, +152, +153, +154, +155, +156, +157, +158, +159, +160, +161, +162, +163, +164, +165, +166, +167, +168, +169, +170, +171, +172, +173, +174, +175, +176, +177, +178, +179, +180, +181, +182, +183, +184, +185, +186, +187, +188, +189, +190, +191, +192, +193, +194, +195, +196, +197, +198, +199, +200, +201, +202, +203, +204, +205, +206, +207, +208, +209, +210, +211, +212, +213, +214, +215, +216, +217, +218, +219, +220, +221, +222, +223, +224, +225, +226, +227, +228, +229, +230, +231, +232, +233, +234, +235, +236, +237, +238, +239, +240, +241, +242, +243, +244, +245, +246, +247, +248, +249, +250, +251, +252, +253, +254, +255, +0, +1, +2, +3, +4, +5, +6, +7, +8, +9, +10, +11, +12, +13, +14, +15, +16, +17, +18, +19, +20, +21, +22, +23, +24, +25, +26, +27, +28, +29, +30, +31, +32, +33, +34, +35, +36, +37, +38, +39, +40, +41, +42, +43, +44, +45, +46, +47, +48, +49, +50, +51, +52, +53, +54, +55, +56, +57, +58, +59, +60, +61, +62, +63, +64, +65, +66, +67, +68, +69, +70, +71, +72, +73, +74, +75, +76, +77, +78, +79, +80, +81, +82, +83, +84, +85, +86, +87, +88, +89, +90, +91, +92, +93, +94, +95, +96, +97, +98, +99, +100, +101, +102, +103, +104, +105, +106, +107, +108, +109, +110, +111, +112, +113, +114, +115, +116, +117, +118, +119, +120, +121, +122, +123, +124, +125, +126, +127, +128, +129, +130, +131, +132, +133, +134, +135, +136, +137, +138, +139, +140, +141, +142, +143, +144, +145, +146, +147, +148, +149, +150, +151, +152, +153, +154, +155, +156, +157, +158, +159, +160, +161, +162, +163, +164, +165, +166, +167, +168, +169, +170, +171, +172, +173, +174, +175, +176, +177, +178, +179, +180, +181, +182, +183, +184, +185, +186, +187, +188, +189, +190, +191, +192, +193, +194, +195, +196, +197, +198, +199, +200, +201, +202, +203, +204, +205, +206, +207, +208, +209, +210, +211, +212, +213, +214, +215, +216, +217, +218, +219, +220, +221, +222, +223, +224, +225, +226, +227, +228, +229, +230, +231, +232, +233, +234, +235, +236, +237, +238, +239, +240, +241, +242, +243, +244, +245, +246, +247, +248, +249, +250, +251, +252, +253, +254, +255, +0, +1, +2, +3, +4, +5, +6, +7, +8, +9, +10, +11, +12, +13, +14, +15, +16, +17, +18, +19, +20, +21, +22, +23, +24, +25, +26, +27, +28, +29, +30, +31, +32, +33, +34, +35, +36, +37, +38, +39, +40, +41, +42, +43, +44, +45, +46, +47, +48, +49, +50, +51, +52, +53, +54, +55, +56, +57, +58, +59, +60, +61, +62, +63, +64, +65, +66, +67, +68, +69, +70, +71, +72, +73, +74, +75, +76, +77, +78, +79, +80, +81, +82, +83, +84, +85, +86, +87, +88, +89, +90, +91, +92, +93, +94, +95, +96, +97, +98, +99, +100, +101, +102, +103, +104, +105, +106, +107, +108, +109, +110, +111, +112, +113, +114, +115, +116, +117, +118, +119, +120, +121, +122, +123, +124, +125, +126, +127, +128, +129, +130, +131, +132, +133, +134, +135, +136, +137, +138, +139, +140, +141, +142, +143, +144, +145, +146, +147, +148, +149, +150, +151, +152, +153, +154, +155, +156, +157, +158, +159, +160, +161, +162, +163, +164, +165, +166, +167, +168, +169, +170, +171, +172, +173, +174, +175, +176, +177, +178, +179, +180, +181, +182, +183, +184, +185, +186, +187, +188, +189, +190, +191, +192, +193, +194, +195, +196, +197, +198, +199, +200, +201, +202, +203, +204, +205, +206, +207, +208, +209, +210, +211, +212, +213, +214, +215, +216, +217, +218, +219, +220, +221, +222, +223, +224, +225, +226, +227, +228, +229, +230, +231, +232, +233, +234, +235, +236, +237, +238, +239, +240, +241, +242, +243, +244, +245, +246, +247, +248, +249, +250, +251, +252, +253, +254, +255, +0, +1, +2, +3, +4, +5, +6, +7, +8, +9, +10, +11, +12, +13, +14, +15, +16, +17, +18, +19, +20, +21, +22, +23, +24, +25, +26, +27, +28, +29, +30, +31, +32, +33, +34, +35, +36, +37, +38, +39, +40, +41, +42, +43, +44, +45, +46, +47, +48, +49, +50, +51, +52, +53, +54, +55, +56, +57, +58, +59, +60, +61, +62, +63, +64, +65, +66, +67, +68, +69, +70, +71, +72, +73, +74, +75, +76, +77, +78, +79, +80, +81, +82, +83, +84, +85, +86, +87, +88, +89, +90, +91, +92, +93, +94, +95, +96, +97, +98, +99, +100, +101, +102, +103, +104, +105, +106, +107, +108, +109, +110, +111, +112, +113, +114, +115, +116, +117, +118, +119, +120, +121, +122, +123, +124, +125, +126, +127, +128, +129, +130, +131, +132, +133, +134, +135, +136, +137, +138, +139, +140, +141, +142, +143, +144, +145, +146, +147, +148, +149, +150, +151, +152, +153, +154, +155, +156, +157, +158, +159, +160, +161, +162, +163, +164, +165, +166, +167, +168, +169, +170, +171, +172, +173, +174, +175, +176, +177, +178, +179, +180, +181, +182, +183, +184, +185, +186, +187, +188, +189, +190, +191, +192, +193, +194, +195, +196, +197, +198, +199, +200, +201, +202, +203, +204, +205, +206, +207, +208, +209, +210, +211, +212, +213, +214, +215, +216, +217, +218, +219, +220, +221, +222, +223, +224, +225, +226, +227, +228, +229, +230, +231, +232, +233, +234, +235, +236, +237, +238, +239, +240, +241, +242, +243, +244, +245, +246, +247, +248, +249, +250, +251, +252, +253, +254, +255, +0, +1, +2, +3, +4, +5, +6, +7, +8, +9, +10, +11, +12, +13, +14, +15, +16, +17, +18, +19, +20, +21, +22, +23, +24, +25, +26, +27, +28, +29, +30, +31, +32, +33, +34, +35, +36, +37, +38, +39, +40, +41, +42, +43, +44, +45, +46, +47, +48, +49, +50, +51, +52, +53, +54, +55, +56, +57, +58, +59, +60, +61, +62, +63, +64, +65, +66, +67, +68, +69, +70, +71, +72, +73, +74, +75, +76, +77, +78, +79, +80, +81, +82, +83, +84, +85, +86, +87, +88, +89, +90, +91, +92, +93, +94, +95, +96, +97, +98, +99, +100, +101, +102, +103, +104, +105, +106, +107, +108, +109, +110, +111, +112, +113, +114, +115, +116, +117, +118, +119, +120, +121, +122, +123, +124, +125, +126, +127, +128, +129, +130, +131, +132, +133, +134, +135, +136, +137, +138, +139, +140, +141, +142, +143, +144, +145, +146, +147, +148, +149, +150, +151, +152, +153, +154, +155, +156, +157, +158, +159, +160, +161, +162, +163, +164, +165, +166, +167, +168, +169, +170, +171, +172, +173, +174, +175, +176, +177, +178, +179, +180, +181, +182, +183, +184, +185, +186, +187, +188, +189, +190, +191, +192, +193, +194, +195, +196, +197, +198, +199, +200, +201, +202, +203, +204, +205, +206, +207, +208, +209, +210, +211, +212, +213, +214, +215, +216, +217, +218, +219, +220, +221, +222, +223, +224, +225, +226, +227, +228, +229, +230, +231, +232, +233, +234, +235, +236, +237, +238, +239, +240, +241, +242, +243, +244, +245, +246, +247, +248, +249, +250, +251, +252, +253, +254, +255, +0, +1, +2, +3, +4, +5, +6, +7, +8, +9, +10, +11, +12, +13, +14, +15, +16, +17, +18, +19, +20, +21, +22, +23, +24, +25, +26, +27, +28, +29, +30, +31, +32, +33, +34, +35, +36, +37, +38, +39, +40, +41, +42, +43, +44, +45, +46, +47, +48, +49, +50, +51, +52, +53, +54, +55, +56, +57, +58, +59, +60, +61, +62, +63, +64, +65, +66, +67, +68, +69, +70, +71, +72, +73, +74, +75, +76, +77, +78, +79, +80, +81, +82, +83, +84, +85, +86, +87, +88, +89, +90, +91, +92, +93, +94, +95, +96, +97, +98, +99, +100, +101, +102, +103, +104, +105, +106, +107, +108, +109, +110, +111, +112, +113, +114, +115, +116, +117, +118, +119, +120, +121, +122, +123, +124, +125, +126, +127, +128, +129, +130, +131, +132, +133, +134, +135, +136, +137, +138, +139, +140, +141, +142, +143, +144, +145, +146, +147, +148, +149, +150, +151, +152, +153, +154, +155, +156, +157, +158, +159, +160, +161, +162, +163, +164, +165, +166, +167, +168, +169, +170, +171, +172, +173, +174, +175, +176, +177, +178, +179, +180, +181, +182, +183, +184, +185, +186, +187, +188, +189, +190, +191, +192, +193, +194, +195, +196, +197, +198, +199, +200, +201, +202, +203, +204, +205, +206, +207, +208, +209, +210, +211, +212, +213, +214, +215, +216, +217, +218, +219, +220, +221, +222, +223, +224, +225, +226, +227, +228, +229, +230, +231, +232, +233, +234, +235, +236, +237, +238, +239, +240, +241, +242, +243, +244, +245, +246, +247, +248, +249, +250, +251, +252, +253, +254, +255, +0, +1, +2, +3, +4, +5, +6, +7, +8, +9, +10, +11, +12, +13, +14, +15, +16, +17, +18, +19, +20, +21, +22, +23, +24, +25, +26, +27, +28, +29, +30, +31, +32, +33, +34, +35, +36, +37, +38, +39, +40, +41, +42, +43, +44, +45, +46, +47, +48, +49, +50, +51, +52, +53, +54, +55, +56, +57, +58, +59, +60, +61, +62, +63, +64, +65, +66, +67, +68, +69, +70, +71, +72, +73, +74, +75, +76, +77, +78, +79, +80, +81, +82, +83, +84, +85, +86, +87, +88, +89, +90, +91, +92, +93, +94, +95, +96, +97, +98, +99, +100, +101, +102, +103, +104, +105, +106, +107, +108, +109, +110, +111, +112, +113, +114, +115, +116, +117, +118, +119, +120, +121, +122, +123, +124, +125, +126, +127, +128, +129, +130, +131, +132, +133, +134, +135, +136, +137, +138, +139, +140, +141, +142, +143, +144, +145, +146, +147, +148, +149, +150, +151, +152, +153, +154, +155, +156, +157, +158, +159, +160, +161, +162, +163, +164, +165, +166, +167, +168, +169, +170, +171, +172, +173, +174, +175, +176, +177, +178, +179, +180, +181, +182, +183, +184, +185, +186, +187, +188, +189, +190, +191, +192, +193, +194, +195, +196, +197, +198, +199, +200, +201, +202, +203, +204, +205, +206, +207, +208, +209, +210, +211, +212, +213, +214, +215, +216, +217, +218, +219, +220, +221, +222, +223, +224, +225, +226, +227, +228, +229, +230, +231, +232, +233, +234, +235, +236, +237, +238, +239, +240, +241, +242, +243, +244, +245, +246, +247, +248, +249, +250, +251, +252, +253, +254, +255, +0, +1, +2, +3, +4, +5, +6, +7, +8, +9, +10, +11, +12, +13, +14, +15, +16, +17, +18, +19, +20, +21, +22, +23, +24, +25, +26, +27, +28, +29, +30, +31, +32, +33, +34, +35, +36, +37, +38, +39, +40, +41, +42, +43, +44, +45, +46, +47, +48, +49, +50, +51, +52, +53, +54, +55, +56, +57, +58, +59, +60, +61, +62, +63, +64, +65, +66, +67, +68, +69, +70, +71, +72, +73, +74, +75, +76, +77, +78, +79, +80, +81, +82, +83, +84, +85, +86, +87, +88, +89, +90, +91, +92, +93, +94, +95, +96, +97, +98, +99, +100, +101, +102, +103, +104, +105, +106, +107, +108, +109, +110, +111, +112, +113, +114, +115, +116, +117, +118, +119, +120, +121, +122, +123, +124, +125, +126, +127, +128, +129, +130, +131, +132, +133, +134, +135, +136, +137, +138, +139, +140, +141, +142, +143, +144, +145, +146, +147, +148, +149, +150, +}; + +static const uint8_t touch_HRD[] = +{ +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +1, +}; + +static const int32_t Expo_time[][NF_PPG_PER_CHANNEL*NF_PPG_CHANNEL] = +{ +{0, 256, 40}, +{0, 240, 40}, +{0, 224, 40}, +{0, 208, 40}, +{0, 208, 40}, +{0, 192, 40}, +{0, 184, 40}, +{0, 176, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +{0, 168, 40}, +}; + + + + +#endif diff --git a/code/sdk/zhihui/drivers/ppg/pah8009/algorithm/pah_hr/V303009/pxialg.h b/code/sdk/zhihui/drivers/ppg/pah8009/algorithm/pah_hr/V303009/pxialg.h new file mode 100644 index 000000000..bada56bbf --- /dev/null +++ b/code/sdk/zhihui/drivers/ppg/pah8009/algorithm/pah_hr/V303009/pxialg.h @@ -0,0 +1,698 @@ +#ifndef PXIALG_H__ +#define PXIALG_H__ +#include "stdint.h" +#include "pxivar.h" + +#define FW 1 + +#define FW_DEBUG 0 +#if ( FW == 0 ) +#undef FW_DEBUG +#define FW_DEBUG 0 +#endif + +//#define STRIIV + +#if FW == 1 +#define PXIALG_API +#else +#ifdef PXIALG_EXPORTS +#define PXIALG_API __declspec(dllexport) +#else +#define PXIALG_API __declspec(dllimport) +#endif +#endif +/* +typedef struct { + uint8_t frame_count; + uint32_t time; + uint8_t touch_flag; + uint32_t nf_ppg_channel; + uint32_t nf_ppg_per_channel; + int32_t *ppg_data; + uint32_t nf_mems; + int16_t *mems_data; +} pah8series_data_t; + +typedef enum { + FLAG_DATA_READY = 0, + FLAG_DATA_NOT_READY, + FLAG_DATA_LOSS, + FLAG_NO_TOUCH, + FLAG_DATA_ERROR, + FLAG_POOR_SIGNAL, + FLAG_FIFO_ERROR, + FLAG_TIMMING_ERROR, + FLAG_MEMS_ERROR, + FLAG_HR_UPDATE = 16, + FLAG_SG_UPDATE, +} PXI_STATUS_FLAG; + +typedef enum { + _quick_report_rms_gs_th = 0, + _hr_speed_mode, + _support_cal_motion_idx_enhancement_enh, + _rsv1, + _set_switch_mems_fft_max_energy_th, + _set_switch_mems_large_energy_num_th, + _set_switch_mn_fft_energy_lo_thr, + _set_switch_mn_fft_energy_hi_thr, + + _ppg_large_energy_num_th, + _max_hr_idx_th, + _min_hr_idx_th, + _ppg_fft_total_peak_num_th, + _mems_large_energy_num_th, + _mems_fft_max_energy_th, + _support_signal_grade_motion_detection_enh, + _support_signal_grade_check_signal_lelvel_enh, + _support_signal_grade_large_energy_num_enh, + _rsv2, + _rsv3, + _set_reg_shake_count_th0, +} PXI_PARAM_SET; + +typedef enum { + _rms_gs = 0, + _signal_level, + _cal_motion_idx, + _is_prediction_hr, + _get_switch_mems_fft_max_energy_th, + _get_switch_mems_large_energy_num_th, + _get_switch_mn_fft_energy_lo_thr, + _get_switch_mn_fft_energy_hi_thr, + + _hr_sample_count, + _ppg_large_energy_num, + _signal_grade_motion_frm, + _ppg_fft_max_energy_idx, + _ppg_fft_total_peak_num, + _mems_large_energy_num, + _mems_fft_max_energy, + _grade, + _signal_grade_hr_to_low_frm, + _flag_signal_grade_ready_go, + _motion_flag, + _get_reg_shake_count_th0, +} PXI_PARAM_GET; + +typedef enum { + MemsLargeEnergyNumTh = 0, + MemsFftMaxEnergyTh, + QuickReportRmsGsTh, + SupportSigGradeMotionDetection, + PpgLargeEnergyNumTh, + SupportSigGradeLargeEnergyNumEnh, + SupportSigGradeLargeEnergyNumTh, + SigGradeThr, + SupportSigGradeCheckSigLevel, + FlagCheckNotStableFirstHR, + MaxHrDefinition, + MinHrDefinition, +} PXI_PARAM2; +*/ + +#if FW == 1 +/** + * @brief When HRD and MEMS data are ready, call this function to do the algorithm processing + * + * @param[in] HRD_Data Pointer to the buffer where HRD data (13 Bytes) is stored. + * @param[in] MEMS_Data Pointer to the buffer where MEMS data (3*sizeof(float) Bytes) is stored. + * + * @return Return one of the PXI_STATUS_FLAG types. + */ +PXIALG_API int32_t PxiAlg_ProcessByTime(unsigned char *HRD_Data, float *MEMS_Data, float time); +PXIALG_API int32_t PxiAlg_Process(unsigned char *HRD_Data, float *MEMS_Data); + +/** + * @brief Call this function to get Heart Rate + * + * @param[out] hr Pointer to a float variable where heart rate is stored + * + * @return None + */ +PXIALG_API void PxiAlg_HrGet(float *hr); + + +PXIALG_API void PxiAlg_FlagInitialSignalNoiseGet(uint8_t *flag); +/** + * @brief Call this function to feed Algorithm raw data(19 Bytes), and get Signal Grade and Heart Rate + * + * @param[in] pixart_19_byte_data Pointer to a arrag where raw data is stored + * Format: 13 bytes PPG + G-sensor X_L[13] + X_H[14] + Y_L[15] + Y_H[16] + Z_L[17] + Z_H[18] + * @param[out] grade Pointer to a float variable where signal grade is stored. + * @param[out] heart_rate Pointer to a float variable where heart rate is stored + * + * @return status bit field, combinatoin of the list below + * 1 << FLAG_DATA_READY, + * 1 << FLAG_DATA_NOT_READY, + * 1 << FLAG_DATA_LOSS, + * 1 << FLAG_NO_TOUCH, + * 1 << FLAG_DATA_ERROR, + * 1 << FLAG_POOR_SIGNAL, + * 1 << FLAG_FIFO_ERROR, + * 1 << FLAG_TIMMING_ERROR, + * 1 << FLAG_MEMS_ERROR, + * 1 << FLAG_HR_UPDATE, + * 1 << FLAG_SG_UPDATE, + */ +PXIALG_API uint32_t PxiAlg_HRM(uint8_t *pixart_19_byte_data, float *grade, float * heart_rate); +#else +/** + * @brief When HRD, MEMS, and ECG data are ready, call this function to do the algorithm processing + * + * @param[in] HRD_Data Pointer to the buffer where HRD data (13 Bytes) is stored. + * @param[in] MEMS_Data Pointer to the buffer where MEMS data (12 Bytes) is stored. + * @param[in] ECG_Data Pointer to the buffer where ECG data (4 Bytes) is stored. + * + * @return Return one of the PXI_STATUS_FLAG types. + */ +PXIALG_API int32_t PxiAlg_Process(unsigned char *HRD_Data, float *MEMS_Data, float ECG_Data); + +/** + * @brief When HRD, MEMS, ECG data, and time interval are ready, call this function to do the algorithm processing + * + * @param[in] HRD_Data Pointer to the buffer where HRD data (13 Bytes) is stored. + * @param[in] MEMS_Data Pointer to the buffer where MEMS data (12 Bytes) is stored. + * @param[in] ECG_Data Pointer to the buffer where ECG data (4 Bytes) is stored. + * @param[in] time Time interval. + * + * @return Return one of the PXI_STATUS_FLAG types. + */ +PXIALG_API int32_t PxiAlg_ProcessByTime(unsigned char *HRD_Data, float *MEMS_Data, float ECG_Data, float time); + +/** + * @brief Call this function to get Heart Rate + * + * @param[out] hr Pointer to a float variable where heart rate is stored + * + * @return None + */ +PXIALG_API void PxiAlg_HrGet(float *hr); + +PXIALG_API void PxiAlg_FlagInitialSignalNoiseGet(uint8_t *flag); + +/** + * @brief Call this function to get output + * + * @param[out] output Pointer to a SHr_motion_plot variable where output information is stored + * + * @return None + */ +PXIALG_API int32_t PxiAlg_OutputGet(void *output); + +/** + * @brief Call this function to get a specific parameter + * + * @param[out] param Pointer to the start address of the variable of parameter list + * @param[in] offset Offset of the parameter variable + * @param[in] size Type size of the parameter + * + * @return None + */ +PXIALG_API void PxiAlg_ParamGet(uint8_t *param, int32_t offset, int32_t size); + +/** + * @brief Call this function to set a specific parameter + * + * @param[in] offset Offset of the parameter variable + * @param[in] size Type size of the parameter + * @param[in] param Pointer to the start address of the variable of parameter list + * + * @return None + */ +PXIALG_API void PxiAlg_ParamSet(int32_t offset, int32_t size, uint8_t *param); +#endif + +/** +* @brief When HRD, MEMS, and Expo data are ready, call this function to do the algorithm processing +* +* @param[in] HRD_Data Pointer to the buffer where HRD data (13 Bytes) is stored. +* @param[in] MEMS_Data Pointer to the buffer where MEMS data (12 Bytes) is stored. +* @param[in] expo Exposure Time. +* +* @return Return one of the PXI_STATUS_FLAG types. +*/ +PXIALG_API int32_t PxiAlg_Process_Expo(unsigned char *HRD_Data, float *MEMS_Data, int expo); + +/** + * @brief Call this function to determine the version of the algorithm + * + * + * @return Version of the algorithm + */ +PXIALG_API int32_t PxiAlg_Version(void); + +/** + * @brief Call this funtion to get Ready_Flag + * + * @return Return Ready_Flag + */ +PXIALG_API unsigned char PxiAlg_GetReadyFlag(void); + +/** + * @brief Call this funtion to get Motion_Flag + * + * @return Return Motion_Flag + */ +PXIALG_API unsigned char PxiAlg_GetMotionFlag(void); + + +/** +* @brief Call this function to get force flag +* +* @return force_flag +*/ +PXIALG_API unsigned char PxiAlg_GetForceFlag(void); + +/** + * @brief Call this funtion to get Timeout_Flag + * + * @return Return Timeout_Flag + */ +PXIALG_API unsigned char PxiAlg_GetTimeoutFlag(void); + +/** + * @brief Call this function to set PPG buffer pointer and size + * + * @param[in] ppg_buffer Pointer to a float buffer where the PPG data would be stored + * @param[in] size PPG buffer size + * + * @return None + */ +PXIALG_API void PxiAlg_SetPPGBuffer(float *ppg_buffer, int32_t size); + +/** + * @brief Call this function to set algorithm parameters + * + * @param[in] hr_param Pointer to a "HR_Param" sturcture where the parameters are stored. + * + * @return None + */ +PXIALG_API void PxiAlg_SetParam(void *hr_param); + +/** + * @brief Call this function to set data + * + * @param[in] data Pointer to an algorithm-dependent data + * + * @return None + */ +PXIALG_API void PxiAlg_SetData(void *data); + + +/** + * @brief Call this function to notify algorithm the Output Data Rate of PPG Sensor + * + * @param[in] odr The Output Data Rate of PPG Sensor. Only 10,20,40,160 and 200 ODR are supported. + * + * @return 1 for success. 0 for failure. + */ +PXIALG_API uint8_t PxiAlg_SetODR(int32_t odr); + +/** + * @brief Call this function to notify algorithm the Timeout Length of PPG Sensor + * + * @param[in] t The Timeout Length of PPG Sensor. Unit: second. + * + * @return 1 for success. 0 for failure. + */ +PXIALG_API uint8_t PxiAlg_SetTimeoutLength(int32_t t); + +/** + * @brief Call this function to notify algorithm the Quality Threshold of PPG Sensor + * + * @param[in] th The Quality Threshold of PPG Sensor. Range: 0.0 ~ 1.0 + * + * @return 1 for success. 0 for failure. + */ +PXIALG_API uint8_t PxiAlg_SetQualityThreshold(float th); + +/** +* @brief Call this function to notify algorithm the HR smooth weight of PPG Sensor +* +* @param[in] w The weight. Range: 0.0 ~ 1.0 +* +* @return 1 for success. 0 for failure. +*/ +PXIALG_API uint8_t PxiAlg_SetHRSmoothWeight(float w); + +/** +* @brief Call this function to notify algorithm the length of process window of PPG Sensor +* +* @param[in] t The normal time window. +* @param[in] t_fast The fast time window. +* +* @return 1 for success. 0 for failure. +*/ +PXIALG_API uint8_t PxiAlg_SetProcWindow(float t, float t_fast); + +/** + * @brief Call this function to notify algorithm the number of PPG sample to skip + * + * @param[in] num The number + * + * @return 1 for success. 0 for failure. + */ +PXIALG_API uint8_t PxiAlg_SetSkipSampleNum(int num); + + +/** + * @brief Call this function to notify algorithm the MEMS Scale of Motion Sensor + * + * @param[in] scale The MEMS Scale of Motion Sensor. 0: +-2G, 1: +-4G, 2: +-8G, and 3: +-16G + * + * @return 1 for success. 0 for failure. + */ +PXIALG_API uint8_t PxiAlg_SetMemsScale(int scale); +PXIALG_API uint8_t PxiAlg_SetMemsScaleBase(int scale, int th); + + + + + +/** + * @brief Call this function to notify algorithm the time length to force hr to update + * + * @param[in] t The time length + * @param[in] ub The upper bound + * @param[in] lb The lower bound + * + * @return 1 for success. 0 for failure. + */ +PXIALG_API uint8_t PxiAlg_SetForceOutput(int t, int ub, int lb); + + + +/** + * @brief Call this function to notify algorithm force hr to output + * + * @param[in] t The time length + * @param[in] ub The upper bound + * @param[in] lb The lower bound + * @param[in] link_flag To link with normal output + * @param[in] w Smoothing weight between force and normal + * + * @return 1 for success. 0 for failure. + */ +PXIALG_API uint8_t PxiAlg_SetForceOutputLink(int t, int ub, int lb, int link_flag, float w); + + +/** + * @brief Call this function to notify algorithm normal hr to output + * + * @param[in] ub The upper bound + * @param[in] lb The lower bound + * @param[in] static_flag First normal output at static + * + * @return 1 for success. 0 for failure. + */ +PXIALG_API uint8_t PxiAlg_SetNormalOutput(int ub, int lb, int static_flag); + + +/** + * @brief Call this function to notify algorithm the time to force hr to output + * + * @param[in] t The duration + * @param[in] bpm The amplitude + * + * @return 1 for success. 0 for failure. + */ +PXIALG_API uint8_t PxiAlg_SetForceRipple(int t, int bpm); + + +/** + * @brief Call this function to notify algorithm the time to force hr to output + * + * @param[in] ch The ppg channel selection + * @param[in] flag The resample flag + * + * @return 1 for success. 0 for failure. + */ +PXIALG_API uint8_t PxiAlg_SetPackage(int ch, int flag); + + +/** + * @brief Call this function to notify algorithm the time length to force hr to update + * + * @param[in] t The time length + * + * @return 1 for success. 0 for failure. + */ +PXIALG_API uint8_t PxiAlg_SetForceUpdateTimeLength(int t); +/** + * @brief Call this function to notify algorithm the time to force hr to output + * + * @param[in] t The time length + * + * @return 1 for success. 0 for failure. + */ +PXIALG_API uint8_t PxiAlg_SetForceOutputTime(int t); +/** + * @brief Call this function to notify algorithm the bound of hr + * + * @param[in] ub The upper bound + * @param[in] lb The lower bound + * + * @return 1 for success. 0 for failure. + */ +PXIALG_API uint8_t PxiAlg_SetFullHRBound(int ub, int lb); +/** + * @brief Call this function to notify algorithm the bound of first hr + * + * @param[in] ub The upper bound + * @param[in] lb The lower bound + * @param[in] t The time length to keep this bound + * + * @return 1 for success. 0 for failure. + */ +PXIALG_API uint8_t PxiAlg_SetFirstHRBound(int ub, int lb, int t); + + + +/** + * @brief Call this function to notify algorithm the MEMS Energy Threshold of Motion Sensor + * + * @param[in] lower The MEMS energy lower threshold + * @param[in] upper The MEMS energy upper threshold + * + * @return 1 for success. 0 for failure. + */ +PXIALG_API uint8_t PxiAlg_SetMemsEnergyThrd(int lower, int upper); + +/** + * @brief Call this function to set PPG Signal Grade Threshold + * + * @param[in] threshold The PPG Signal Grade Threshold. Its value ranges from 0 to 100. + * + * @return 1 for success. 0 for failure. + */ +PXIALG_API uint8_t PxiAlg_SetSigGradeThrd(float thrd); + +/** + * @brief Call this function to set parameters of PPG Signal Grade + * + * @param[in] frm_thrd The PPG Signal Grade Frame Threshold. + * @param[in] rep_count The PPG Signal Grade Repetitive Counter. + * + * @return 1 for success. 0 for failure. + */ +PXIALG_API uint8_t PxiAlg_SetSigGradeParam(int16_t frm_thrd, int16_t rep_count); + +/** + * @brief Call this function to enable or disable fast output mode + * + * @param[in] en The flag of fast output mode. + */ + +PXIALG_API void PxiAlg_EnableFastOutput(uint8_t en); + +/** + * @brief Call this function to enable or disable motion mode + * + * @param[in] en The flag of motion mode. + */ +PXIALG_API void PxiAlg_EnableMotionMode(uint8_t en); + +/** + * @brief Call this function to enable or disable auto mode + * + * @param[in] en The flag of auto mode. + */ +PXIALG_API void PxiAlg_EnableAutoMode(uint8_t en); + +/** + * @brief Call this function to enable or disable tracking mode after fast output + * + * @param[in] en The flag of tracking mode. + */ +PXIALG_API void PxiAlg_EnableTrackingAfterFastOut(uint8_t en); + +/** + * @brief Call this function to enable or disable mems0 signal grade mode + * + * @param[in] en 1 : enable. 0 : disable. + */ +PXIALG_API void PxiAlg_EnableMEMS0SigGrade(uint8_t en); + +//PXIALG_API void PxiAlg_EnableMEMS0SigGrade(uint8_t en, uint8_t idx); +//// idx = 0: PxiAlg_EnableFastOutput(uint8_t en); +//// idx = 1: PxiAlg_EnableMotionMode(uint8_t en); +//// idx = 2: PxiAlg_EnableAutoMode(uint8_t en); +//// idx = 3: PxiAlg_EnableTrackingAfterFastOut(uint8_t en); + +/** + * @brief Call this function to get PPG Signal Grade + * + * @param[out] grade Pointer to a float variable where signal grade is stored. + * + * @return Return 1 when Signal Grade is ready. Otherwise, return 0. + */ +PXIALG_API uint8_t PxiAlg_GetSigGrade(float *grade); + +/** + * @brief Call this function to get the alarm flag of fast output + * + * @param[out] flag The alarm flag of fast output + * + * @return Return 1 when the flag is set. Otherwise, return 0. + */ +PXIALG_API uint8_t PxiAlg_GetFastOutAlarmFlag(void); + +/** + * @brief Call this function to get the alarm flag of signal bad + * + * @param[out] flag The alarm flag of fast output + * + * @return Return 1 when the flag is set. Otherwise, return 0. + */ +PXIALG_API uint8_t PxiAlg_GetSignalBadAlarm(void); + +/** + * @brief Call this function to open algorithm + */ +#if FW == 1 +PXIALG_API uint8_t PxiAlg_Open_Mem(void *mem); +#else +PXIALG_API void PxiAlg_Open(void); +#endif + +/** + * @brief Call this function to close algorithm + */ +PXIALG_API void PxiAlg_Close(void); + +/** + * @brief Call this function to initialize 200Hz low-pass filter + */ +PXIALG_API void PxiAlg_LPF200Hz_Init(void); + +/** + * @brief Call this function to process 200Hz low-pass filter + */ +PXIALG_API float PxiAlg_LPF200Hz_Process(float data); + +/** + * @brief Call this function to get PPG Signal Level + * + * @param[out] grade Pointer to a float variable where signal level is stored. + * + * @return Return 1 when Signal Level is ready. Otherwise, return 0. + */ +#ifndef REDUCE_MORE_CODE_SIZE +PXIALG_API uint8_t PxiAlg_Get_Signal_Level(float *level); +#endif +/** + * @brief Call this function to enable/disable Check_Not_Stable_First_HR + * + * @param[in] 1 : enable, 0: disable + */ +PXIALG_API void PxiAlg_Check_Not_Stable_First_HR(uint8_t check); + +/** + * @brief Call this function to set Signal_Grade_Large_Energy_Num_Th_Lo + * + * @param[in] Threshold. + * + */ +PXIALG_API void PxiAlg_Set_Signal_Grade_Large_Energy_Num_Th_Lo(uint8_t th) ; + +/** + * @brief Call this function to Set SportMode + * + * @@param[in] en 0: disable 1: enable + * + * @return Return 1 when Set Signal Grade Large Energy Num Threshold is ready. Otherwise, return 0. + */ +PXIALG_API void PxiAlg_SetSportMode(uint8_t en); + +/** + * @brief Call this function to Set Signal Grade Large Energy Num Threshold + * + * @@param[in] th => threshold + * + * @return Return 1 when Set Signal Grade Large Energy Num Threshold is ready. Otherwise, return 0. + */ +PXIALG_API uint8_t PxiAlg_Set_Signal_Grade_Large_Energy_Num_Th(uint8_t th); + + +/** + * @brief Call this function to Set Algorithm Parameters + * + * @@param[in] index - index of parameters, param - parameter value + * + * @return Return 1 when Set algorithm parameter suceeessfully. Otherwise, return 0. + */ +PXIALG_API uint8_t PxiAlg_Set_Parameter(uint32_t index, float param); + +/** + * @brief Call this function to Get Algorithm Parameters + * + * @@param[in] index - index of parameters, *param - pointer to parameter value + * + * @return Return 1 when Set algorithm parameter suceeessfully. Otherwise, return 0. + */ +PXIALG_API uint8_t PxiAlg_Get_Parameter(uint32_t index, float *param); + +/** +* @brief Call this function to Set Algorithm Parameters (2nd Version) +* +* @@param[in] index - index of parameters, param - parameter value +* +* @return Return 1 when Set algorithm parameter suceeessfully. Otherwise, return 0. +*/ +PXIALG_API uint8_t PxiAlg_Set_Parameter2(uint32_t index, float param); + +/** +* @brief Call this function to Get Algorithm Parameters (2nd Version) +* +* @@param[in] index - index of parameters, *param - pointer to parameter value +* +* @return Return 1 when Set algorithm parameter suceeessfully. Otherwise, return 0. +*/ +PXIALG_API uint8_t PxiAlg_Get_Parameter2(uint32_t index, float *param); + + + +PXIALG_API uint8_t PxiAlg_Set_Cal_Flag_HR_Trust_Energy_Ratio(float fValue); +PXIALG_API uint8_t PxiAlg_Set_Cal_Flag_HR_Trust_Large_Energy_Num_Th(uint16_t fValue); +PXIALG_API uint8_t PxiAlg_Get_Cal_Flag_HR_Trust_Energy_Ratio(float *fValue); +PXIALG_API uint8_t PxiAlg_Get_Cal_Flag_HR_Trust_Large_Energy_Num_Th(uint16_t *fValue); + +PXIALG_API uint8_t PxiAlg_Get_Flag_HR_Trust(uint8_t *flag); + +#if (ANDROID_JNI==1) +PXIALG_API uint8_t PxiAlg_Get_ParameterName(uint32_t index, const char **param); +#endif + +PXIALG_API uint8_t PxiAlg_DecodeProcess(uint32_t data, int touch_flag, float time_in); +PXIALG_API uint8_t PxiAlg_Entrance_0(pah8series_data_t *pah8series_data); +PXIALG_API uint8_t PxiAlg_Entrance(pah8series_data_t *pah8series_data); +PXIALG_API uint8_t PxiAlg_EntranceD(pah8series_data_t *pah8series_data); +PXIALG_API uint32_t PxiAlg_Query_Mem_Size(void); +PXIALG_API uint8_t PxiAlg_GetHrUpdateFlag(void); + +PXIALG_API void PxiAlg_SetData_Seg(pah8series_data_t *pah8series_data); +PXIALG_API uint8_t PxiAlg_Process_Seg(uint8_t *is_finished); +PXIALG_API uint8_t PxiAlg_ProcessD_Seg(uint8_t *is_finished); +#endif /* PXIALG_H__ */ diff --git a/code/sdk/zhihui/drivers/ppg/pah8009/algorithm/pah_hr/V303009/pxivar.h b/code/sdk/zhihui/drivers/ppg/pah8009/algorithm/pah_hr/V303009/pxivar.h new file mode 100644 index 000000000..0f1dd761b --- /dev/null +++ b/code/sdk/zhihui/drivers/ppg/pah8009/algorithm/pah_hr/V303009/pxivar.h @@ -0,0 +1,96 @@ +#ifndef PXIVAR_H__ +#define PXIVAR_H__ + +#include "stdint.h" + +#ifndef pah8series_data_t +typedef struct { + uint8_t frame_count; + uint32_t time; + uint8_t touch_flag; + uint32_t nf_ppg_channel; + uint32_t nf_ppg_per_channel; + int32_t *ppg_data; + uint32_t nf_mems; + int16_t *mems_data; +} pah8series_data_t; +#endif + +typedef enum { + FLAG_DATA_READY = 0, + FLAG_DATA_NOT_READY, + FLAG_DATA_LOSS, + FLAG_NO_TOUCH, + FLAG_DATA_ERROR, + FLAG_POOR_SIGNAL, + FLAG_FIFO_ERROR, + FLAG_TIMMING_ERROR, + FLAG_MEMS_ERROR, + FLAG_HR_UPDATE = 16, + FLAG_SG_UPDATE, +} PXI_STATUS_FLAG; + +typedef enum { + _quick_report_rms_gs_th = 0, + _hr_speed_mode, + _support_cal_motion_idx_enhancement_enh, + _rsv1, + _set_switch_mems_fft_max_energy_th, + _set_switch_mems_large_energy_num_th, + _set_switch_mn_fft_energy_lo_thr, + _set_switch_mn_fft_energy_hi_thr, + + _ppg_large_energy_num_th, + _max_hr_idx_th, + _min_hr_idx_th, + _ppg_fft_total_peak_num_th, + _mems_large_energy_num_th, + _mems_fft_max_energy_th, + _support_signal_grade_motion_detection_enh, + _support_signal_grade_check_signal_lelvel_enh, + _support_signal_grade_large_energy_num_enh, + _rsv2, + _rsv3, + _set_reg_shake_count_th0, +} PXI_PARAM_SET; + +typedef enum { + _rms_gs = 0, + _signal_level, + _cal_motion_idx, + _is_prediction_hr, + _get_switch_mems_fft_max_energy_th, + _get_switch_mems_large_energy_num_th, + _get_switch_mn_fft_energy_lo_thr, + _get_switch_mn_fft_energy_hi_thr, + + _hr_sample_count, + _ppg_large_energy_num, + _signal_grade_motion_frm, + _ppg_fft_max_energy_idx, + _ppg_fft_total_peak_num, + _mems_large_energy_num, + _mems_fft_max_energy, + _grade, + _signal_grade_hr_to_low_frm, + _flag_signal_grade_ready_go, + _motion_flag, + _get_reg_shake_count_th0, +} PXI_PARAM_GET; + +typedef enum { + MemsLargeEnergyNumTh = 0, + MemsFftMaxEnergyTh, + QuickReportRmsGsTh, + SupportSigGradeMotionDetection, + PpgLargeEnergyNumTh, + SupportSigGradeLargeEnergyNumEnh, + SupportSigGradeLargeEnergyNumTh, + SigGradeThr, + SupportSigGradeCheckSigLevel, + FlagCheckNotStableFirstHR, + MaxHrDefinition, + MinHrDefinition, +} PXI_PARAM2; + +#endif /* PXIVAR_H__ */ diff --git a/code/sdk/zhihui/drivers/ppg/pah8009/algorithm/pah_hr/V303009/test_library_HRD.c b/code/sdk/zhihui/drivers/ppg/pah8009/algorithm/pah_hr/V303009/test_library_HRD.c new file mode 100644 index 000000000..0730dc245 --- /dev/null +++ b/code/sdk/zhihui/drivers/ppg/pah8009/algorithm/pah_hr/V303009/test_library_HRD.c @@ -0,0 +1,117 @@ + +#include "pah8009_testpattern_HRD.h" +// platform +#include +#include "pah800x_main.h" +#include "pah800x_bsp.h" +#include +#include "pxialg.h" +#include "pxivar.h" + +//#include "nrf_delay.h" +#define array_szie(arr) (sizeof(arr) / sizeof(arr[0])) + +void test_library_HRD(void) +{ + int i = 0; + void *hr_pBuffer = NULL; + static ppg_mems_data_t ppg_mems_data_alg; + + sRaw_Data_13Bytes hr_data; + + + // static Hr-V301009 + + PxiAlg_Close(); + int32_t version = PxiAlg_Version(); + DEBUG_PRINT("HR_Version = %d \r\n", version); + + + uint32_t Query_Mem_Size = PxiAlg_Query_Mem_Size(); + DEBUG_PRINT("HR_Mem_Size = %d \r\n", Query_Mem_Size); + + hr_pBuffer = malloc(Query_Mem_Size); + + + if(!PxiAlg_Open_Mem(hr_pBuffer)) + DEBUG_PRINT("PxiAlg_Open_Mem fail \n"); + + + PxiAlg_SetQualityThreshold(0.35f); + PxiAlg_SetHRSmoothWeight(0.9f); + PxiAlg_SetProcWindow(5.0f, 5.0f); + PxiAlg_SetTimeoutLength(30.0f); + PxiAlg_SetMemsScale(3); //MEMS 2/4/8/16G : 0/1/2/3 + PxiAlg_SetSkipSampleNum(10); + PxiAlg_SetMemsScaleBase(3, 0); //MEMS 2/4/8/16G : 0/1/2/3 + PxiAlg_SetForceOutputLink(10, 150, 40, 1, 0.9f); + PxiAlg_SetNormalOutput(200, 40, 0); + PxiAlg_SetForceRipple(3, 1); + //PxiAlg_SetForceOutput(30, 120, 45); + //PxiAlg_SetForceOutputTime(10); + PxiAlg_SetPackage(0, 1); + + + +//-----------------------------------------------// + + LOG_PRINT("ARRAY_SIZE = %d\n",array_szie(PAH8009_rawdata_HRD)); +//****************************************************************** + + float hr = 0.0f; + float hr_grader = 0.0f; + +//******************************************************************* + + //nrf_delay_ms(50); + + + for( i = 0 ; i 0 ? 0x80 : 0x00; + //LOG_PRINT("touch = %d ", hr_data.touch); + hr_data.rsv2 = 0; + + int exposure_time = Expo_time[i][1]; + //LOG_PRINT("exposure_time = %d \n",exposure_time); + + ppg_mems_data_alg.MEMS_Data[0]=PAH8009_mems_HRD[i][0]; + ppg_mems_data_alg.MEMS_Data[1]=PAH8009_mems_HRD[i][1]; + ppg_mems_data_alg.MEMS_Data[2]=PAH8009_mems_HRD[i][2]; + + int32_t ret = PxiAlg_Process_Expo((uint8_t*)&hr_data, ppg_mems_data_alg.MEMS_Data, exposure_time); + + //LOG_PRINT("ret_HR %d \n",ret); + + if(PxiAlg_GetHrUpdateFlag()) + { + PxiAlg_HrGet(&hr); + PxiAlg_GetSigGrade(&hr_grader); + } + + LOG_PRINT("ret %d , hr %f , hr_grade %f \n", ret, hr, hr_grader); + + } + + PxiAlg_Close(); + + return; +} + +void log_printf(char *s, float f) +{ + // printf("%s: %f\n", s, f); +} \ No newline at end of file diff --git a/code/sdk/zhihui/drivers/ppg/pah8009/algorithm/pah_spo2/V703/libv703_0_1.a b/code/sdk/zhihui/drivers/ppg/pah8009/algorithm/pah_spo2/V703/libv703_0_1.a new file mode 100644 index 0000000000000000000000000000000000000000..0cb0d3ba7446401a2e4e2e27b850c539d314d63a GIT binary patch literal 902382 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 TA8p9#?2FXC*X!@qu-yLzc@R2P literal 0 HcmV?d00001 diff --git a/code/sdk/zhihui/drivers/ppg/pah8009/algorithm/pah_spo2/V703/pah8009_testpattern_SPO2.h b/code/sdk/zhihui/drivers/ppg/pah8009/algorithm/pah_spo2/V703/pah8009_testpattern_SPO2.h new file mode 100644 index 000000000..d8d9d4950 --- /dev/null +++ b/code/sdk/zhihui/drivers/ppg/pah8009/algorithm/pah_spo2/V703/pah8009_testpattern_SPO2.h @@ -0,0 +1,257 @@ +#ifndef _PAH8009_TESTPATTERN_ +#define _PAH8009_TESTPATTERN_ + +#include +#define NF_PPG_CHANNEL 2 +#define NF_PPG_PER_CHANNEL 81 +static const int32_t PAH8009_rawdata_SPO2[][NF_PPG_PER_CHANNEL*NF_PPG_CHANNEL] = +{ +{1,44,1413227,1375343,1847643,1787527,1849059,1795619,1850643,1799035,1853773,1804053,1855985,1807487,1857211,1810045,1858155,1811489,1857549,1810013,1856203,1807653,1855885,1807985,1856225,1808433,1856443,1808915,1856873,1809501,1856415,1809469,1856153,1808027,1854979,1805393,1853881,1804191,1853475,1803313,1853703,1803495,1853817,1804027,1852163,1801415}, +{1,50,1849833,1797659,1848117,1794425,1846501,1792429,1846933,1794465,1848347,1797081,1847485,1795507,1845053,1791709,1845377,1792531,1845089,1792009,1844055,1790507,1844639,1792275,1845127,1792257,1844247,1791883,1845803,1795625,1848153,1799679,1848469,1799821,1847757,1799101,1847791,1798791,1847717,1799383,1847285,1799295,1846165,1798421,1846711,1799119,1846979,1800181,1847917,1802373,1850389,1806013}, +{1,54,1851247,1807949,1852643,1810447,1854655,1814097,1856243,1816695,1856223,1816223,1855313,1814589,1854833,1813203,1854871,1813909,1855589,1815461,1855909,1816625,1856441,1816653,1856433,1816745,1856403,1816085,1854765,1813617,1853649,1811729,1853635,1812979,1854253,1814335,1854801,1814861,1855735,1817119,1856677,1818893,1856001,1817823,1855067,1815591,1854373,1814907,1853907,1813719,1852421,1811229,1851319,1809519,1850537,1808687}, +{1,54,1850007,1808285,1850491,1808867,1851353,1810153,1850677,1808535,1849503,1806183,1847779,1803439,1845305,1798249,1842229,1794125,1841311,1792951,1840299,1790817,1839801,1790775,1839609,1791541,1840653,1792959,1840111,1792037,1838781,1789819,1838071,1788025,1837549,1786829,1837177,1786199,1834709,1782813,1835469,1783903,1837155,1788265,1838507,1791097,1839841,1792945,1841147,1795599,1842109,1797251,1842343,1798043,1843101,1799101}, +{1,52,1843105,1799891,1843259,1800647,1843283,1801331,1842971,1800695,1843171,1800911,1843061,1801429,1843091,1801291,1843385,1801803,1843243,1802025,1843955,1803115,1845053,1804645,1844847,1804419,1844275,1802959,1844563,1803241,1844051,1802191,1844389,1802653,1844789,1803795,1845123,1804267,1845465,1804429,1845769,1804835,1845421,1804775,1844911,1804409,1844629,1804201,1844617,1804613,1845049,1804889,1845049,1805099}, +{1,54,1845203,1805421,1844861,1805319,1845265,1805971,1845519,1806249,1845809,1806711,1845999,1807367,1846361,1807837,1846561,1808147,1847089,1809035,1847853,1810107,1848437,1811271,1848687,1811447,1848663,1811475,1848819,1811293,1848815,1811405,1847765,1810337,1847277,1809779,1847415,1809381,1846875,1808739,1846289,1808049,1846243,1807663,1846263,1807911,1845817,1807357,1845631,1807343,1845983,1807737,1846023,1807371,1845827,1807367}, +{1,52,1846061,1807943,1845723,1807769,1845883,1807671,1845831,1807777,1845765,1807449,1845733,1807487,1845631,1807823,1845133,1806927,1844505,1806271,1844083,1805967,1843839,1805569,1843705,1805473,1844097,1806027,1844243,1806141,1844395,1806617,1844113,1806423,1844341,1806709,1844363,1807205,1844527,1807439,1844603,1807187,1844567,1807015,1844563,1806931,1844247,1806691,1844457,1806229,1844533,1806451,1844537,1806307}, +{1,52,1844555,1806299,1843955,1806475,1843797,1805597,1843233,1805593,1843451,1805647,1843265,1805505,1843037,1805499,1843121,1805159,1843229,1805383,1843029,1804627,1843313,1805051,1843019,1805145,1843261,1804877,1842989,1804949,1842807,1804521,1843091,1805135,1843381,1805241,1843323,1805171,1843523,1805439,1843737,1805711,1843861,1806105,1843411,1806039,1842957,1805241,1842411,1804437,1842521,1804595,1842225,1804201}, +{1,54,1842265,1804225,1842225,1804141,1842091,1803731,1842001,1803837,1842331,1804307,1842349,1804483,1842811,1805057,1842709,1804691,1842997,1805397,1843061,1805025,1843003,1805237,1843179,1805291,1843309,1804907,1843287,1805309,1843237,1805263,1843353,1805513,1843121,1805413,1842015,1803891,1841531,1803513,1841903,1804169,1841713,1803343,1841855,1803643,1841597,1803495,1841721,1803983,1841979,1804191,1841961,1804663,1842237,1805463}, +{1,52,1842841,1805611,1843219,1805829,1843215,1806035,1843643,1806543,1843665,1807081,1844097,1807349,1844393,1807677,1844555,1808157,1844457,1808143,1845213,1809151,1844893,1808913,1844453,1808725,1844261,1808397,1844083,1808377,1844029,1807939,1843945,1807671,1843379,1807363,1843327,1806831,1843163,1806443,1842717,1806451,1842935,1806207,1842847,1806623,1843341,1806843,1843117,1806631,1842887,1806461,1843239,1806761}, +{1,52,1843491,1806813,1843455,1807039,1843207,1806913,1843179,1806881,1843535,1806961,1842847,1806401,1842167,1805047,1842027,1804743,1841633,1804475,1841295,1803827,1841263,1803435,1840961,1803563,1840957,1803337,1841055,1803563,1840755,1803551,1841335,1804649,1842085,1805085,1842247,1805269,1842033,1805263,1842063,1805325,1842263,1805527,1842563,1805681,1843101,1806203,1843291,1806545,1844207,1808087,1844433,1808143}, +{1,54,1844493,1808715,1843847,1808245,1844033,1809131,1844385,1809343,1844457,1808979,1844433,1808869,1844073,1808139,1843385,1807065,1843145,1806497,1843803,1807307,1843051,1806933,1844003,1809509,1845831,1812717,1847551,1816579,1851097,1823331,1860321,1839875,1866743,1849125,1865911,1843927,1860507,1835367,1859875,1834775,1858871,1833191,1857559,1830255,1854361,1824619,1852367,1821855,1851795,1820705,1850731,1818609,1850629,1818733}, +{1,52,1852007,1822665,1852347,1822961,1851195,1820025,1850279,1817891,1848753,1815595,1847853,1814407,1847935,1814333,1848401,1816057,1848725,1816107,1848753,1815591,1848549,1815471,1848717,1815887,1849229,1816815,1848961,1816479,1848807,1815707,1847681,1814379,1846801,1812689,1846111,1810819,1843763,1806849,1840543,1801615,1839751,1801757,1840755,1802973,1841277,1804533,1840179,1802529,1840005,1801457,1840333,1802113}, +{1,52,1839583,1800437,1838631,1799091,1838427,1799267,1839369,1800713,1839779,1801687,1840619,1804035,1841259,1804479,1841405,1804525,1841135,1804127,1841249,1804447,1840529,1804373,1840391,1804179,1839897,1803301,1839635,1802829,1839387,1802491,1839369,1802159,1839377,1802149,1839271,1801763,1839453,1802063,1839409,1802091,1839343,1802141,1839449,1802299,1839911,1802955,1840165,1803041,1840579,1803235,1840957,1803901}, +{1,54,1840957,1804053,1841015,1804355,1841415,1804557,1841627,1805273,1841847,1805861,1841179,1805361,1841343,1805159,1841357,1805579,1841353,1805249,1841153,1805343,1841231,1805547,1841491,1805587,1841633,1806263,1841685,1806429,1841651,1806705,1842211,1807541,1842779,1807939,1843069,1808897,1843483,1809417,1843837,1809717,1844225,1810343,1844371,1811299,1844701,1811483,1845013,1811833,1845563,1812531,1845239,1812135,1844749,1811935}, +{1,52,1844875,1812555,1844835,1812143,1844691,1811903,1844741,1811959,1844491,1811669,1844505,1811673,1844443,1811543,1844435,1811445,1844101,1811371,1844163,1811027,1844233,1811177,1843949,1811133,1844233,1811133,1844221,1811021,1844069,1810507,1844051,1810775,1844061,1810745,1844051,1810749,1843349,1810309,1842981,1809331,1842705,1809183,1842441,1808973,1842451,1808739,1842345,1808835,1842219,1808761,1842411,1808559}, +{1,54,1842157,1808645,1842139,1808919,1842389,1808895,1842463,1808749,1842335,1808767,1842407,1808839,1842527,1808295,1842543,1808405,1842563,1808735,1842229,1808049,1842567,1808585,1842535,1808383,1842411,1808495,1841747,1807763,1841427,1807067,1841277,1807089,1841295,1807213,1840813,1806619,1840951,1806783,1841151,1807095,1841019,1806927,1841053,1807181,1840885,1807043,1841227,1806959,1841073,1807035,1841063,1807181,1841215,1807417}, +{1,52,1841459,1807145,1841449,1807199,1841393,1807067,1841415,1806979,1841509,1807187,1841507,1807269,1841729,1807481,1840863,1806965,1840663,1806083,1840347,1805851,1840275,1805935,1840177,1805587,1839961,1805841,1840045,1805471,1839875,1805569,1840161,1805727,1840281,1805785,1840409,1805607,1840463,1806087,1840779,1806397,1840677,1806737,1841009,1806767,1841183,1807029,1841241,1807131,1841197,1807195,1841343,1807293}, +{1,52,1841673,1807403,1841477,1807223,1841063,1806543,1840397,1806369,1840027,1805805,1839885,1805675,1839769,1805283,1839823,1804973,1839867,1805033,1839169,1804963,1839217,1805009,1839599,1804875,1839439,1805443,1839685,1805367,1839583,1804599,1839377,1804201,1839027,1803559,1838803,1803089,1838555,1802459,1837971,1801073,1837439,1800159,1837599,1801079,1837897,1801331,1836701,1799857,1836455,1800321,1837069,1801853}, +{1,54,1837643,1802797,1837269,1801951,1836379,1801137,1836025,1799811,1835379,1799317,1835171,1798263,1834655,1798043,1834249,1797073,1833925,1796527,1833769,1796001,1833431,1795583,1833475,1795783,1833499,1795867,1832885,1794835,1832697,1794735,1832605,1794313,1832151,1793511,1832045,1793463,1831047,1792143,1830137,1791131,1829695,1790225,1829007,1789429,1829437,1789379,1828881,1789107,1828783,1789009,1829103,1789001,1828851,1789125}, +{1,52,1829207,1789139,1829051,1789453,1829331,1789623,1829469,1789449,1829407,1788433,1828309,1786533,1827885,1785401,1826885,1783253,1826359,1782583,1826343,1783151,1825813,1781565,1824831,1780531,1824051,1779917,1823559,1779967,1823461,1779837,1824221,1781705,1824447,1781357,1823893,1781117,1823901,1780941,1823883,1781123,1824131,1780957,1823839,1781045,1823811,1780333,1823719,1780059,1823785,1780587,1824243,1781293}, +{1,52,1824133,1781279,1824061,1781059,1823835,1780387,1823857,1779837,1823781,1780479,1823985,1780725,1823713,1780581,1822647,1779399,1822121,1779229,1822219,1779113,1821779,1778493,1822043,1779141,1822127,1779127,1822081,1779237,1822189,1779195,1822481,1779691,1822655,1779935,1823117,1780235,1823349,1780897,1823763,1780883,1823977,1781445,1823793,1780467,1823777,1780327,1823715,1780481,1823367,1779621,1823461,1779755}, +{1,52,1823465,1779557,1823283,1779347,1822891,1778737,1822153,1778157,1821487,1777481,1821353,1777227,1821121,1777199,1820645,1776801,1820579,1775975,1820005,1775847,1820139,1775845,1819555,1774539,1818991,1774099,1819245,1774247,1818719,1773383,1818675,1773563,1818791,1774507,1819827,1776039,1819635,1775619,1819863,1775813,1819399,1774935,1819159,1774599,1818537,1773767,1818973,1773683,1817563,1772195,1816719,1771193}, +{1,54,1816439,1770893,1816497,1770653,1816021,1770379,1815945,1769969,1816019,1769913,1815701,1769797,1815695,1769489,1815829,1769099,1814869,1769189,1815429,1769169,1815005,1768841,1815127,1768777,1814807,1768449,1815069,1768503,1814833,1768411,1814667,1768117,1814673,1767747,1814187,1767043,1814171,1766827,1813321,1765607,1812461,1764623,1811547,1763381,1811347,1762825,1811605,1763061,1811461,1763159,1811267,1763141,1811417,1763043}, +{1,52,1811207,1763505,1811399,1763381,1811279,1762695,1811127,1762769,1810949,1762285,1810439,1761947,1810625,1762151,1810679,1761753,1810119,1760941,1810021,1760303,1809585,1760031,1809807,1759923,1809531,1760353,1810315,1761195,1809123,1759887,1809127,1759245,1808331,1757739,1807961,1757407,1807691,1756865,1807641,1756431,1806881,1754813,1805857,1753145,1805035,1752749,1805217,1752675,1804987,1752327,1804667,1752295}, +{1,52,1804585,1751465,1803327,1749265,1803413,1749487,1803309,1749749,1803243,1749473,1803393,1750037,1803025,1749159,1802261,1747897,1801561,1747231,1800863,1746159,1799649,1745263,1799405,1744755,1798743,1743721,1798005,1742265,1798061,1742259,1797767,1741831,1796901,1740061,1796891,1740181,1796599,1739815,1798083,1743175,1799139,1743641,1798311,1742347,1797813,1740889,1797559,1740953,1799387,1743481,1798947,1742593}, +{1,54,1799303,1742917,1799445,1742663,1799517,1743083,1799889,1743079,1799733,1743379,1799933,1743517,1799961,1743591,1800597,1744391,1801647,1745711,1802941,1747685,1803389,1748443,1804265,1749357,1804725,1750605,1805401,1751169,1806089,1752397,1806809,1754191,1807241,1754333,1807415,1755207,1808975,1757327,1809331,1757363,1809041,1757489,1809379,1758127,1809705,1759277,1809865,1759227,1808869,1757333,1808459,1757331,1808091,1756473}, +{1,52,1807045,1755147,1807231,1755243,1806873,1755451,1806761,1754827,1806757,1754295,1806217,1753817,1806027,1753769,1806401,1754069,1806711,1754661,1806859,1755233,1806933,1755225,1807365,1755345,1807071,1755757,1807251,1755761,1807623,1756141,1807495,1756057,1807387,1755677,1807371,1755835,1807757,1756141,1807543,1755461,1806361,1754421,1805533,1753405,1805511,1753201,1805605,1753187,1805401,1752729,1805263,1752781}, +{1,52,1805613,1752315,1805137,1752665,1805399,1752813,1805449,1753159,1805729,1753197,1806223,1753723,1806507,1754129,1806973,1754699,1807193,1755253,1807833,1755965,1808139,1756455,1808989,1757391,1809501,1758191,1809683,1758837,1810497,1759453,1810839,1760163,1810781,1760455,1810839,1760599,1811329,1761517,1812057,1762755,1811983,1762155,1812405,1762877,1812733,1763441,1813155,1764143,1812799,1763593,1812693,1763099}, +{1,54,1812481,1762807,1812405,1762063,1812249,1761607,1812057,1761435,1812155,1761647,1811813,1761203,1811925,1761757,1811969,1761647,1811403,1761043,1811723,1761365,1810887,1760215,1810353,1759897,1809919,1759359,1809891,1759121,1809359,1758787,1809403,1758791,1808939,1757795,1808829,1757503,1808451,1756935,1808371,1756989,1808229,1756681,1807947,1755785,1807993,1756061,1807975,1755867,1807775,1755789,1807797,1755511,1807659,1754985}, +{1,52,1807571,1755303,1808317,1755933,1807913,1755669,1807827,1755669,1807589,1755723,1807089,1755683,1807089,1755355,1806965,1755235,1806689,1754925,1806067,1754607,1806019,1754393,1805933,1754103,1805657,1753807,1805565,1753949,1805707,1753847,1805747,1754023,1805729,1753903,1805827,1754413,1805801,1754563,1805921,1754255,1805897,1754011,1805921,1754429,1805871,1754121,1805919,1754323,1805671,1754277,1805263,1754413}, +{1,52,1805209,1754227,1805897,1755557,1806035,1755549,1806173,1755697,1806917,1756611,1806969,1757139,1806929,1757599,1807535,1758705,1807847,1759115,1807765,1758737,1807761,1759143,1808165,1759313,1807975,1758823,1807067,1757647,1807303,1758459,1807947,1759133,1807415,1758703,1807023,1758117,1805867,1757439,1805501,1756357,1805079,1756339,1804715,1755955,1804569,1756201,1804279,1755947,1804421,1756037,1804527,1756601}, +{1,52,1804421,1756603,1804003,1756661,1804229,1756589,1804137,1756763,1804239,1756745,1804127,1756897,1803851,1756615,1803973,1756601,1804061,1756971,1803985,1757065,1803905,1757175,1803039,1756335,1802317,1755469,1802149,1755613,1801841,1755233,1801673,1754699,1801405,1755127,1801317,1755405,1801865,1755553,1801775,1755783,1802007,1756199,1802047,1756413,1802665,1757401,1802757,1758035,1802861,1758265,1803333,1758617}, +{1,54,1803509,1759013,1803501,1758825,1803795,1759225,1803461,1759059,1802741,1758075,1801625,1757051,1801379,1756855,1801095,1756713,1801011,1756625,1800729,1756575,1800587,1757069,1800615,1757869,1800587,1757725,1801113,1758269,1801113,1758713,1800655,1757585,1799911,1756633,1799735,1756663,1800747,1757825,1800325,1756675,1799329,1755123,1799205,1755179,1799257,1755341,1798751,1755963,1798707,1756185,1798551,1755997,1797879,1755225}, +{1,52,1797367,1754219,1796909,1753631,1796335,1752809,1796371,1753193,1796439,1752919,1795339,1751653,1795025,1751049,1794957,1751515,1795433,1752569,1795659,1753511,1795905,1753413,1796083,1754171,1795839,1753729,1795621,1753535,1795993,1754393,1795527,1754129,1795243,1754023,1794505,1753095,1794037,1752227,1793841,1752365,1794041,1752597,1794273,1753441,1794505,1753691,1794229,1753579,1794331,1753715,1794029,1753835}, +{1,52,1794295,1753793,1793707,1753123,1793787,1753483,1793619,1753311,1793601,1753293,1793553,1753311,1794067,1753995,1794167,1754753,1794223,1754135,1794091,1754389,1793681,1753663,1792693,1752901,1792507,1753105,1792355,1753073,1792199,1753371,1792045,1752957,1792649,1753473,1792303,1753857,1792405,1753733,1792671,1753691,1792351,1753631,1793255,1754989,1794139,1756167,1794665,1757393,1795615,1759015,1797051,1760923}, +{1,54,1797991,1762359,1798559,1763421,1799031,1764405,1799703,1764909,1799057,1764355,1798547,1763805,1798737,1763389,1798591,1763057,1798417,1762189,1797965,1761883,1797911,1762243,1798551,1762849,1797751,1761471,1797311,1760659,1797417,1760673,1797075,1760535,1797289,1760857,1797417,1760483,1797421,1760539,1797065,1760297,1797083,1760017,1796897,1760843,1797111,1760641,1796375,1759817,1796065,1759407,1795299,1758599,1794891,1757997}, +{1,52,1795229,1758153,1794979,1758241,1794927,1758215,1794753,1758163,1794531,1757951,1794695,1758301,1794971,1758681,1794939,1758113,1794869,1757941,1794863,1758579,1794913,1758357,1795135,1758257,1795121,1758229,1795145,1758331,1795241,1758783,1795439,1758945,1795717,1758843,1795145,1758755,1794829,1758243,1794325,1757997,1794269,1757651,1793837,1757147,1793867,1756763,1793707,1756767,1793947,1756901,1793907,1757069}, +{1,52,1793863,1757511,1794237,1757447,1794113,1757077,1794527,1757489,1794525,1757479,1794553,1757143,1794273,1757065,1794167,1756233,1794219,1755963,1793971,1756111,1794189,1755799,1794015,1755489,1793939,1755603,1793237,1755003,1793173,1755039,1793027,1755271,1793255,1755335,1793263,1755113,1793111,1755211,1793295,1754985,1792939,1754713,1793013,1754815,1793161,1754861,1793095,1754365,1792969,1754167,1793191,1754639}, +{1,54,1793451,1754383,1793197,1754107,1793031,1753455,1793121,1753197,1792693,1752887,1792279,1751911,1792253,1752093,1792703,1752489,1792099,1752093,1791591,1751783,1791697,1752701,1792059,1752601,1792155,1752739,1792431,1752761,1792067,1752901,1792537,1753275,1792721,1753297,1792775,1753497,1793449,1753821,1793771,1754181,1794665,1754975,1795037,1755147,1795439,1756265,1796243,1757069,1796545,1757719,1797129,1757675,1797421,1757989}, +{1,52,1797827,1758691,1797973,1759365,1797889,1759835,1797707,1759929,1798089,1760553,1797719,1759745,1797963,1760145,1798387,1760733,1797475,1759877,1797719,1760201,1797945,1760113,1797449,1759531,1797545,1758953,1797247,1759083,1797243,1759055,1797479,1758935,1797465,1759611,1797809,1759615,1797825,1760007,1798013,1760127,1798061,1760455,1798125,1760327,1798311,1760599,1798243,1760345,1797265,1759101,1797247,1759037}, +{1,58,1797381,1759389,1797111,1758861,1797007,1758981,1796897,1758719,1796803,1758561,1796629,1758353,1796679,1758385,1796871,1758779,1796733,1758215,1796683,1758241,1796821,1758251,1796949,1758399,1797217,1757969,1797221,1758569,1797319,1758283,1797675,1758897,1797475,1758991,1797933,1759147,1797947,1759319,1797337,1758603,1797155,1758227,1797247,1758575,1797071,1758301,1796851,1758195,1797163,1758279,1796999,1758539,1797443,1758195,1797407,1758985,1797523,1759019}, +{1,54,1797665,1758957,1798177,1759151,1798279,1759715,1798257,1759849,1798347,1759957,1798085,1759513,1798725,1760179,1798381,1759415,1798631,1758657,1798133,1757821,1797741,1757073,1797115,1756099,1796243,1756261,1796673,1756537,1796193,1756149,1795713,1755589,1796811,1757377,1797029,1757761,1796433,1757651,1796611,1758049,1796941,1758911,1797003,1759107,1797399,1759213,1797483,1759619,1797973,1760635,1798445,1760547,1798707,1761071}, +{1,52,1799277,1761591,1799209,1762007,1799747,1762487,1800085,1763007,1800473,1763689,1800161,1763315,1799281,1762309,1799427,1762225,1799285,1762189,1798857,1761577,1798671,1760497,1798751,1760641,1798501,1760441,1798503,1759999,1798485,1759943,1798421,1760427,1798507,1759929,1798729,1760695,1798759,1760803,1799001,1760787,1798863,1760853,1799271,1761001,1799417,1761055,1799539,1761569,1799453,1761439,1799939,1761785}, +{1,52,1799521,1761459,1799089,1760973,1799063,1760833,1799165,1761269,1799197,1761375,1799115,1761385,1799119,1761357,1799431,1762063,1799201,1761749,1799539,1762119,1799779,1762307,1800183,1762571,1799943,1762585,1800245,1762687,1800507,1762937,1800815,1762705,1800153,1761703,1799965,1761459,1799775,1761463,1800245,1761255,1799463,1760381,1798795,1759877,1798223,1759481,1798399,1759619,1797981,1758723,1797529,1758127}, +{1,54,1797773,1758939,1797609,1759523,1797559,1758847,1797547,1759313,1797853,1759703,1797737,1759285,1797625,1759403,1797621,1759287,1797315,1758769,1797235,1758349,1797071,1758349,1797053,1757913,1797129,1758529,1797079,1758487,1796995,1757601,1796661,1758003,1795985,1757139,1795833,1756439,1795385,1756513,1795277,1756237,1794699,1755395,1794647,1754749,1794263,1754773,1794245,1754819,1794165,1754841,1794481,1755679,1794903,1755807}, +{1,52,1794625,1755947,1795273,1756347,1795101,1756915,1795403,1756917,1795127,1756865,1795403,1757271,1795659,1757553,1795611,1757319,1795523,1757197,1794793,1756527,1794047,1755617,1793775,1755553,1793823,1755307,1793357,1755129,1793289,1754855,1793255,1754727,1793405,1755159,1793295,1755351,1793335,1755091,1793449,1755155,1793713,1755899,1794673,1757867,1795135,1757937,1795539,1758279,1795975,1759213,1796069,1759687}, +{1,52,1796651,1759951,1796531,1759435,1796831,1759809,1796203,1759315,1796145,1759375,1795647,1758913,1796029,1759623,1796669,1760941,1796847,1761305,1796799,1761905,1797447,1762993,1797381,1763315,1797489,1763569,1798253,1764323,1798027,1764683,1798155,1764631,1798285,1765205,1798461,1764483,1798137,1764147,1798227,1764217,1798097,1763989,1799093,1766027,1799693,1766979,1799867,1767313,1799303,1765971,1798503,1765287}, +{1,54,1798307,1764545,1797951,1762859,1796985,1760899,1796723,1759923,1795953,1758823,1795443,1758565,1795571,1757899,1795531,1758375,1795553,1758657,1795931,1758991,1795749,1759015,1795917,1759203,1796105,1759485,1796149,1759805,1796439,1760077,1796647,1760847,1795843,1760169,1795723,1759507,1795759,1759849,1795887,1759327,1795799,1759411,1795665,1759475,1795647,1759827,1795957,1759475,1795777,1759623,1796025,1759873,1796037,1759975}, +{1,52,1796411,1760465,1796949,1761305,1797151,1761693,1797209,1761859,1797519,1762475,1798107,1763275,1798577,1764179,1798555,1763559,1797825,1762927,1797563,1762803,1797861,1763227,1797271,1762681,1797409,1762409,1797541,1762711,1797527,1762651,1797239,1762659,1797439,1762603,1797333,1762863,1797541,1762637,1797289,1762525,1797537,1762531,1797351,1762169,1797573,1761901,1797083,1761043,1797367,1761623,1797621,1761873}, +{1,52,1797069,1761279,1796973,1761463,1796817,1761251,1796341,1760013,1796203,1760165,1796109,1760417,1796381,1760849,1796693,1761665,1796749,1762427,1797123,1762151,1797207,1762723,1797189,1762507,1797507,1762963,1797247,1762963,1797439,1762715,1797345,1762151,1797163,1762137,1797283,1762127,1797269,1761891,1797275,1762087,1797221,1762317,1797551,1762243,1797199,1762437,1796967,1762469,1796577,1761907,1796891,1762031}, +{1,52,1796879,1762087,1796475,1761633,1796335,1761369,1796221,1761323,1796229,1760927,1796153,1761189,1796033,1761195,1796261,1761369,1796469,1761509,1796653,1761787,1796653,1762295,1796705,1762353,1797003,1762373,1797435,1762933,1796999,1762913,1797213,1762739,1797319,1762451,1797275,1762415,1797029,1762161,1796643,1761667,1796665,1761683,1796581,1761725,1796493,1761791,1796331,1761933,1796933,1762189,1796705,1761861}, +{1,54,1796393,1761875,1796577,1762031,1796785,1762059,1796927,1762581,1797395,1762817,1797349,1763037,1797311,1762709,1797705,1763311,1797773,1763181,1798243,1763395,1798337,1764331,1798319,1764243,1798777,1764225,1798547,1764299,1797991,1764139,1797627,1763685,1797763,1763559,1797817,1763385,1797261,1763007,1797181,1762803,1797279,1762903,1797123,1762785,1796995,1762405,1796875,1761985,1796715,1762127,1796755,1762299,1796795,1762247}, +{1,52,1796705,1761915,1796639,1761781,1796781,1762017,1796567,1761625,1796635,1761759,1796767,1761637,1796937,1761569,1796915,1761163,1796447,1761505,1795793,1760875,1795665,1760205,1795341,1759965,1795361,1759703,1795201,1759231,1795069,1759093,1794975,1758815,1794749,1758741,1794819,1758807,1794557,1758145,1794405,1758375,1794743,1758325,1794645,1757997,1794807,1758123,1794579,1758205,1794727,1758081,1794757,1757881}, +{1,52,1794385,1757605,1794561,1757691,1794659,1757157,1794645,1757035,1794735,1757133,1794549,1757525,1794019,1756869,1793285,1755965,1793183,1756265,1793175,1756043,1792965,1755397,1793139,1755405,1792573,1755299,1792889,1755007,1792437,1754819,1792645,1754827,1792471,1754855,1792623,1754449,1792529,1754653,1792695,1754523,1792885,1754707,1792867,1754815,1792827,1754847,1793089,1755175,1793173,1754949,1793333,1755165}, +{1,54,1793223,1754919,1793253,1755275,1793161,1754949,1793089,1754847,1792231,1754005,1792143,1753613,1791987,1753709,1791881,1753131,1791841,1753123,1791729,1753063,1791609,1753251,1791681,1752855,1791387,1752771,1791439,1752961,1791569,1752805,1791639,1752447,1791547,1752809,1792019,1752869,1791845,1753193,1792187,1753505,1792449,1753787,1792877,1754295,1792853,1754417,1793015,1754361,1793085,1754431,1793117,1754845,1793055,1754759}, +{1,52,1792707,1754499,1792507,1754283,1792915,1754739,1792681,1754707,1792783,1754495,1792445,1754611,1792783,1754883,1792657,1754647,1792635,1754231,1792965,1754795,1793209,1755035,1793481,1755817,1793771,1756199,1794081,1756745,1794263,1756981,1794367,1757439,1795033,1757721,1795113,1758629,1795901,1759047,1795817,1759439,1796159,1760469,1797013,1761309,1797127,1761781,1796853,1762017,1796891,1761851,1796785,1762085}, +{1,52,1796719,1761901,1797007,1762303,1797167,1762295,1796429,1761611,1796465,1761439,1796491,1761473,1796509,1761593,1796275,1761301,1796283,1761033,1796399,1761139,1795989,1760871,1796039,1760751,1796101,1761115,1796265,1761037,1796175,1761319,1796453,1761213,1796417,1761319,1796083,1761287,1795105,1759139,1794157,1757065,1793851,1756269,1793677,1756107,1793037,1754947,1792279,1754457,1792489,1755755,1792743,1756163}, +{1,54,1792657,1756201,1792783,1756523,1793001,1757021,1793215,1757845,1793271,1757961,1792601,1756879,1793499,1758159,1793027,1757799,1792929,1757563,1793259,1758237,1793343,1758329,1793467,1758671,1793659,1758523,1793223,1758423,1792769,1757645,1792245,1757271,1792151,1757807,1791901,1757467,1791333,1756099,1791435,1756375,1791097,1755941,1790999,1755859,1790493,1755525,1790839,1755977,1790609,1755849,1791075,1756593,1791239,1756499}, +}; +static const int16_t PAH8009_mems_SPO2[][3*NF_PPG_PER_CHANNEL] = +{ +{80, 155,370,2007,136,383,2012,170,393,2021,170,381,2016,150,376,2012,155,376,2010,163,383,2016,163,377,2015,156,367,2029,153,373,2014,161,402,1999,168,390,2012,151,385,2015,159,386,2015,167,390,2013,162,394,2014,161,391,2014,163,395,2014,166,394,2010,158,398,2010,159,396,2007,164,396,2007,162,397,2010,157,397,2008,160,403,2009,162,402,2008,162,400,2009,162,395,2009,161,396,2009,161,397,2013,161,394,2014,162,388,2011,159,386,2011,160,392,2012,159,391,2016,161,385,2015,162,386,2012,158,389,2016,161,392,2014,161,391,2011,159,394,2015,163,394,2011,161,393,2011,160,399,2010,162,402,2010,163,412,2014,159,428,1982,162,439,1993,173,352,2029,139,371,2020,162,419,2015,188,416,2011,164,412,2012,152,401,2004,165,402,1999,164,420,2002,157,443,1997,165,430,2007,166,388,2023,154,366,2016,156,396,2002,171,407,2010,162,408,2015,158,391,2010,161,386,2008,163,388,2012,163,363,2044,159,345,2022,151,404,2012,164,426,1988,169,409,2005,156,392,2018,158,382,2016,161,387,2013,157,408,2002,157,413,2008,162,400,2016,158,393,2012,158,392,2009,161,392,2010}, +{52, 162,411,2012,164,406,2008,164,407,2005,161,413,2006,165,412,2005,164,417,2005,169,407,2000,165,403,2010,160,409,2011,166,409,2008,161,412,2010,159,421,2016,165,417,2012,162,409,2008,166,391,2001,163,400,2005,164,411,2004,159,426,2013,160,420,2017,167,408,2004,170,402,2000,163,406,2003,161,410,2010,165,415,2010,161,415,2013,162,409,2010,165,395,2003,163,392,2003,168,398,2004,154,409,2017,157,409,2017,166,402,2016,161,400,2013,160,387,2006,157,391,2010,161,396,2012,164,395,2011,159,392,2012,159,392,2009,159,396,2013,160,399,2012,158,392,2009,159,391,2010,163,386,2007,161,384,2006,155,393,2014,165,387,2014,158,384,2015,162,342,2044,152,371,2009,164,419,1993,168,420,2003}, +{53, 158,390,2012,150,377,2025,160,377,2018,166,391,2011,164,403,2010,157,403,2009,157,398,2009,156,406,2013,161,402,2008,156,393,2012,152,393,2011,161,393,2012,164,393,2011,157,387,2010,160,397,2012,167,394,2010,151,396,2014,159,394,2013,161,395,2017,163,395,2011,159,390,2010,159,394,2013,164,393,2009,158,392,2013,159,393,2006,157,398,2012,163,404,2014,165,396,2013,165,388,2007,167,396,2004,161,400,2011,161,405,2015,167,399,2000,152,402,2041,180,407,2000,145,369,2002,159,417,2022,181,384,2001,143,413,2025,169,393,2004,159,412,2020,167,399,2006,160,399,2009,165,396,2003,161,410,2010,169,413,2006,168,412,2008,158,418,1996,163,441,1985,179,390,2022,155,380,2030,163,399,2005,175,415,2011}, +{52, 169,408,2005,161,400,2006,162,403,2009,171,408,2008,165,413,2009,166,417,2015,169,418,2012,172,406,2005,160,429,1989,167,441,1995,177,411,2006,158,409,2022,158,408,2010,173,400,2006,174,388,2003,161,392,2019,164,408,2011,166,419,2012,167,411,1997,161,417,2006,166,420,2009,163,395,2011,156,399,2000,165,410,2006,170,424,2015,166,420,2016,167,418,2011,167,417,2010,168,415,2006,163,423,1996,164,446,1991,175,396,2016,162,398,2019,161,429,2006,164,459,1984,170,422,2004,165,370,2017,157,368,2018,164,398,2000,167,404,2007,167,406,2008,159,402,2014,152,397,2013,159,388,2022,159,372,2026,151,408,2003,165,411,2000,159,399,2012,154,386,2010,153,393,2017,158,378,2014,157,383,2018}, +{52, 155,398,2007,160,397,2012,152,392,2014,159,379,2016,155,393,2018,153,407,2007,161,402,2010,153,391,2014,150,388,2011,154,391,2012,159,391,2010,154,394,2013,157,393,2011,154,390,2013,155,390,2013,155,391,2014,153,393,2015,156,381,2014,163,367,2031,147,382,2011,153,421,2002,169,415,2006,149,400,2016,154,399,2015,159,395,2008,152,392,2008,149,399,2009,161,404,2012,162,402,2012,158,395,2008,155,398,2008,157,403,2012,158,405,2011,156,401,2011,158,405,2009,158,401,2012,158,402,2011,159,399,2008,156,401,2011,158,402,2009,154,403,2009,155,402,2011,158,400,2010,158,402,2009,160,400,2010,154,399,2011,153,399,2009,156,400,2011,157,402,2013,153,399,2012,155,399,2011,158,399,2012}, +{53, 157,401,2011,157,398,2012,155,398,2011,154,396,2009,154,402,2011,159,400,2012,156,399,2012,159,398,2011,157,394,2008,155,399,2012,158,399,2011,155,398,2014,156,397,2011,156,398,2014,157,394,2009,155,395,2011,156,395,2012,156,393,2008,155,395,2014,157,398,2012,155,396,2013,154,397,2012,159,399,2014,158,392,2009,154,394,2011,157,395,2010,156,397,2015,158,400,2013,157,398,2012,156,397,2011,158,397,2009,160,395,2010,156,399,2011,158,402,2011,158,404,2012,157,401,2011,156,402,2012,157,404,2008,159,404,2010,158,403,2011,157,402,2012,157,404,2009,158,406,2010,160,405,2012,156,403,2011,156,401,2010,159,403,2008,159,404,2010,159,408,2010,158,408,2012,159,405,2010,157,397,2006,160,406,2012}, +{52, 160,407,2009,154,407,2013,160,403,2009,160,402,2008,159,405,2012,157,403,2010,156,404,2010,158,405,2010,157,407,2011,159,405,2009,158,402,2010,159,405,2010,160,406,2009,158,406,2012,156,408,2011,157,405,2008,159,405,2010,162,406,2007,156,404,2009,157,405,2008,159,405,2010,160,408,2010,157,405,2010,156,405,2008,161,402,2007,156,407,2014,159,405,2006,154,405,2013,158,410,2012,159,403,2009,156,405,2009,161,403,2006,157,405,2011,154,407,2012,157,404,2011,155,404,2013,158,402,2008,158,402,2013,157,403,2011,158,402,2009,157,402,2010,157,405,2011,157,406,2009,155,406,2011,156,406,2009,155,405,2011,159,404,2008,157,404,2007,157,407,2011,159,406,2008,156,407,2012,161,405,2007}, +{52, 157,406,2009,156,406,2011,159,408,2011,160,407,2007,158,408,2009,160,404,2011,158,405,2008,157,404,2008,158,407,2014,157,405,2011,156,408,2010,157,405,2007,158,407,2011,159,407,2009,156,405,2010,154,404,2007,158,407,2008,158,408,2009,158,405,2009,157,405,2007,158,405,2010,158,407,2007,159,407,2010,158,405,2009,155,406,2007,158,406,2008,157,409,2011,160,407,2006,156,406,2009,160,404,2005,154,405,2011,160,411,2012,157,407,2010,155,406,2011,158,402,2010,156,404,2006,161,408,2012,159,407,2006,154,406,2011,158,407,2011,159,405,2011,158,405,2010,156,404,2008,156,406,2010,157,408,2010,160,405,2009,153,403,2007,157,405,2008,157,408,2008,159,410,2011,159,405,2007,156,406,2007}, +{53, 157,405,2014,159,407,2006,156,411,2013,160,405,2004,159,407,2009,160,405,2006,153,406,2012,158,405,2005,156,409,2013,158,406,2007,157,404,2010,158,405,2009,159,408,2011,158,404,2010,156,402,2009,158,404,2010,158,406,2009,157,407,2012,157,405,2012,159,403,2008,159,404,2010,158,404,2010,157,407,2008,157,406,2012,157,405,2009,158,403,2009,157,407,2010,159,406,2011,159,406,2011,158,403,2008,157,406,2013,157,407,2011,155,409,2012,158,406,2008,156,406,2011,162,404,2006,159,403,2008,158,407,2010,158,408,2013,159,405,2011,155,408,2012,158,407,2010,157,407,2007,157,408,2010,158,405,2010,157,405,2008,159,407,2011,159,407,2012,156,405,2010,156,405,2008,157,406,2011,157,404,2009,156,405,2012}, +{52, 159,405,2010,159,400,2010,158,399,2009,155,404,2011,156,406,2013,155,405,2009,155,402,2012,160,401,2012,156,398,2009,158,402,2011,160,403,2009,157,403,2009,154,398,2013,154,405,2011,157,402,2009,155,402,2014,159,400,2010,155,397,2010,158,401,2011,158,404,2013,155,405,2012,156,400,2009,153,400,2011,158,399,2008,159,401,2012,155,400,2010,156,399,2008,159,404,2010,156,402,2012,153,399,2010,154,400,2010,158,402,2010,158,403,2011,160,401,2009,156,402,2014,157,404,2007,152,401,2012,157,403,2008,159,402,2011,158,405,2009,158,401,2010,158,403,2010,155,401,2008,156,404,2012,156,407,2012,156,405,2011,156,402,2010,158,402,2011,159,403,2009,155,400,2011,154,404,2012,159,405,2010}, +{52, 157,404,2012,157,404,2010,156,401,2009,155,402,2011,157,406,2012,161,403,2012,156,402,2012,156,402,2009,158,405,2013,157,404,2011,155,405,2012,157,403,2008,157,404,2011,159,404,2009,157,403,2008,157,405,2008,157,406,2012,156,405,2010,155,404,2009,156,403,2009,158,407,2008,157,406,2010,157,409,2010,158,403,2010,157,403,2008,157,403,2009,157,407,2012,160,402,2009,158,402,2010,158,400,2009,155,403,2008,156,405,2012,158,406,2011,159,403,2010,156,399,2012,157,400,2013,158,404,2007,156,403,2013,158,405,2011,155,399,2008,157,403,2013,160,403,2008,159,401,2014,160,403,2011,157,401,2011,161,405,2011,155,394,2007,151,401,2009,160,404,2010,158,404,2014,159,397,2008,158,400,2008}, +{53, 157,404,2011,157,401,2012,158,396,2010,156,397,2009,155,401,2010,158,404,2012,160,400,2012,158,397,2008,158,400,2010,156,404,2013,160,405,2009,156,401,2009,156,404,2011,158,401,2006,157,404,2007,161,405,2009,160,403,2008,159,408,2013,167,414,2010,168,405,2007,155,396,2006,154,394,2007,161,400,2008,163,399,2008,162,390,2008,155,392,2014,147,396,2024,159,365,2019,177,274,2086,159,354,2003,160,433,1978,145,472,1978,124,461,2001,145,446,2029,156,437,1987,152,444,1982,164,351,2016,134,333,2034,144,399,2014,177,420,2013,152,416,2013,143,414,2012,156,426,2011,159,453,1983,159,411,2010,146,366,2029,143,385,2013,162,417,2007,160,417,2005,151,410,1998,149,413,2024,171,416,2002,149,391,1996}, +{52, 147,423,2013,163,416,2007,143,434,2023,154,418,2010,152,423,2013,157,415,2004,157,415,1997,147,449,1979,160,416,2015,154,384,2029,144,410,2005,157,416,2006,157,414,2004,150,412,2007,157,416,2005,154,420,2007,152,421,2012,157,417,2010,156,413,2007,156,415,2007,156,413,2007,155,417,2010,156,409,2004,150,412,2010,154,417,2006,152,414,2012,154,417,2010,157,409,2006,156,411,2008,153,414,2011,154,418,2011,156,417,2009,156,420,2009,160,421,2007,148,433,2012,150,456,1968,156,466,1996,161,381,2024,147,358,2034,147,396,1999,165,401,2002,165,429,2017,167,409,2010,147,409,2014,158,413,2006,159,423,2016,160,415,2016,159,407,2010,161,402,2000,157,410,2007,162,420,2010,162,425,2008}, +{52, 162,427,2011,164,419,2006,153,423,1989,158,425,1990,170,379,2026,150,415,2006,165,422,2011,162,414,2010,156,409,2007,162,404,2006,162,412,2009,158,410,2011,155,409,2012,158,408,2011,162,405,2011,156,399,2007,155,401,2010,159,401,2009,160,402,2007,156,402,2012,157,402,2011,157,402,2011,159,405,2011,159,402,2011,158,404,2010,159,400,2010,157,404,2009,158,399,2009,159,403,2011,159,399,2007,154,404,2012,158,407,2011,160,405,2009,158,402,2010,157,404,2012,159,402,2008,162,406,2010,159,405,2010,158,405,2009,157,405,2011,157,404,2010,157,403,2012,160,404,2010,158,405,2011,157,407,2009,158,404,2012,158,404,2010,156,402,2009,156,406,2008,157,404,2010,160,403,2009,159,401,2009}, +{52, 158,403,2010,155,405,2012,159,400,2008,157,404,2012,157,402,2010,152,401,2012,158,403,2009,158,402,2011,156,403,2011,159,402,2011,157,402,2011,155,399,2009,156,401,2010,153,402,2012,155,403,2011,157,403,2009,155,401,2011,157,402,2010,156,398,2010,155,402,2011,156,403,2010,154,404,2014,155,400,2008,155,403,2011,157,401,2010,157,401,2012,156,398,2013,156,396,2009,155,400,2010,156,405,2011,151,401,2013,156,395,2010,158,393,2010,150,403,2021,161,399,2005,154,386,2008,153,410,2015,152,392,2012,153,395,2015,161,396,2011,156,394,2011,152,392,2011,154,399,2010,152,398,2011,152,396,2015,153,395,2015,153,395,2011,158,398,2012,158,396,2011,155,396,2016,155,395,2011,152,393,2010}, +{52, 151,397,2010,154,400,2013,155,398,2016,158,396,2012,157,393,2011,153,395,2014,155,399,2011,152,399,2009,151,396,2011,152,395,2013,156,395,2010,156,395,2011,156,396,2010,154,397,2013,155,396,2012,154,399,2012,153,398,2011,150,395,2013,155,396,2010,156,398,2012,157,398,2012,155,397,2014,154,397,2013,154,396,2013,152,397,2011,155,400,2013,154,401,2011,156,398,2014,157,395,2009,153,396,2011,154,399,2011,154,400,2009,154,397,2011,155,397,2010,153,396,2012,155,400,2013,157,400,2011,154,400,2013,156,395,2012,155,397,2011,155,397,2010,152,400,2013,154,402,2013,154,398,2012,155,398,2012,152,398,2012,153,401,2012,155,400,2011,154,398,2011,152,399,2012,154,399,2013,154,399,2012}, +{53, 154,399,2014,153,397,2011,155,398,2012,154,399,2013,156,399,2012,154,400,2012,154,399,2010,155,396,2012,155,398,2011,155,397,2009,155,399,2011,153,400,2012,154,401,2013,155,398,2010,153,398,2010,155,399,2011,155,400,2013,154,399,2012,155,399,2008,153,398,2010,156,401,2010,156,402,2010,154,398,2012,155,400,2011,157,400,2012,153,401,2014,156,400,2011,154,398,2012,157,399,2012,154,398,2011,153,398,2012,155,401,2011,153,402,2011,154,400,2015,155,396,2012,153,397,2009,155,399,2012,155,399,2011,154,398,2010,156,398,2010,154,397,2010,155,400,2014,157,401,2013,154,397,2010,153,398,2014,157,397,2012,153,397,2011,153,397,2012,155,400,2011,156,398,2012,155,395,2009,155,397,2012,155,401,2011}, +{52, 154,398,2011,154,398,2011,155,396,2011,154,397,2013,157,396,2011,156,400,2012,156,399,2012,154,397,2012,155,398,2012,155,398,2012,157,399,2011,154,398,2009,157,397,2010,156,399,2013,157,398,2011,152,400,2012,154,400,2011,157,398,2010,155,398,2011,155,399,2010,156,399,2012,158,401,2014,156,401,2011,152,398,2012,151,397,2013,156,398,2011,156,398,2011,153,398,2011,154,398,2012,154,399,2010,158,400,2015,156,397,2011,154,397,2012,153,399,2013,153,399,2015,157,398,2009,154,396,2013,154,397,2015,155,398,2013,154,397,2010,154,396,2012,156,398,2011,155,396,2010,155,395,2012,155,396,2012,157,395,2011,154,398,2014,153,395,2010,152,395,2012,154,398,2012,155,397,2012,155,396,2013}, +{52, 153,395,2012,155,395,2010,154,398,2014,159,399,2013,154,398,2012,154,397,2012,153,396,2010,156,396,2011,158,397,2013,157,398,2013,154,398,2012,153,399,2012,154,400,2013,154,397,2010,152,396,2015,154,399,2011,157,398,2013,158,400,2012,154,398,2013,152,397,2009,154,399,2013,153,400,2012,154,398,2014,153,397,2012,156,398,2013,156,398,2013,157,399,2012,154,400,2013,152,401,2016,156,403,2010,153,398,2012,154,397,2012,155,397,2009,155,402,2011,156,403,2011,154,398,2009,154,402,2009,157,406,2011,158,411,2014,157,404,2010,155,402,2007,157,400,2007,157,402,2010,158,403,2010,154,409,2015,159,407,2011,157,403,2012,156,397,2009,154,395,2008,158,395,2010,154,392,2005,152,399,2012}, +{53, 156,400,2012,153,398,2014,151,394,2011,149,391,2011,150,395,2013,156,396,2014,155,393,2012,154,389,2010,155,393,2014,157,395,2015,154,394,2011,151,395,2014,153,397,2012,154,394,2013,154,396,2014,152,395,2014,157,398,2013,157,397,2012,154,395,2012,152,400,2015,155,394,2011,155,392,2012,154,389,2010,152,396,2013,157,397,2013,153,395,2016,154,395,2013,157,390,2008,153,391,2014,155,393,2010,151,396,2016,157,397,2015,156,391,2015,152,391,2011,153,392,2014,157,393,2013,154,393,2014,155,393,2015,155,390,2010,156,392,2013,158,395,2014,156,392,2014,155,392,2012,154,393,2011,157,395,2012,156,395,2013,157,395,2012,155,390,2011,154,394,2012,159,393,2009,155,395,2015,155,393,2014,153,391,2014}, +{52, 155,394,2011,156,394,2011,155,393,2014,156,394,2010,151,395,2013,156,398,2013,156,393,2010,155,394,2012,156,397,2012,156,403,2015,157,397,2012,152,394,2011,156,395,2009,161,406,2010,165,409,2013,156,412,2012,155,402,2008,157,397,2004,156,407,2007,161,416,2012,155,414,2012,153,406,2007,156,402,2006,159,409,2008,163,406,2006,159,402,2010,158,407,2010,159,411,2015,158,404,2011,156,393,2011,153,396,2009,158,401,2011,162,409,2013,155,402,2013,151,398,2012,156,394,2009,157,395,2010,156,397,2013,157,397,2012,158,401,2012,159,398,2010,155,396,2013,157,396,2010,158,393,2012,157,402,2012,156,399,2010,154,401,2011,153,397,2009,157,396,2010,158,393,2009,155,399,2011,155,402,2015}, +{52, 158,404,2015,155,396,2014,154,395,2012,154,396,2013,158,403,2012,159,401,2011,156,398,2010,155,396,2011,155,393,2009,158,398,2010,156,400,2012,155,402,2013,156,397,2012,156,397,2015,156,396,2012,155,395,2010,158,396,2006,149,396,2017,166,397,2005,146,394,2013,166,403,2013,154,382,2013,156,396,2010,162,395,2011,156,402,2014,156,393,2014,154,391,2012,156,392,2012,160,396,2013,156,394,2014,158,390,2010,153,392,2013,155,394,2010,156,393,2013,155,392,2012,154,392,2011,156,396,2013,157,394,2011,157,392,2016,156,391,2010,152,393,2012,156,398,2012,159,401,2010,156,393,2012,157,394,2012,156,395,2011,157,401,2012,158,402,2012,156,402,2014,157,396,2008,156,396,2010,158,401,2010}, +{52, 159,404,2013,158,402,2011,158,399,2010,157,399,2010,159,401,2013,155,403,2014,155,401,2011,156,401,2009,160,401,2010,160,399,2010,156,397,2011,156,398,2009,157,401,2013,158,402,2014,155,399,2009,157,397,2010,160,401,2010,160,400,2012,156,400,2011,159,396,2011,156,399,2008,157,408,2013,158,406,2015,154,397,2011,156,390,2006,158,395,2007,160,403,2011,157,406,2015,157,401,2015,155,393,2008,155,392,2008,158,398,2011,158,396,2014,156,393,2012,154,395,2012,156,399,2015,154,396,2018,152,385,2019,150,382,2008,160,408,2004,165,408,2013,152,394,2013,150,395,2009,160,401,2011,156,404,2013,154,398,2013,157,395,2009,159,402,2012,156,402,2014,156,402,2011,159,398,2009,155,398,2012}, +{53, 155,400,2008,154,404,2014,158,404,2009,156,399,2012,157,400,2010,156,403,2009,155,402,2013,156,401,2014,158,397,2008,158,401,2012,156,404,2013,156,401,2007,157,399,2009,155,401,2010,157,401,2013,156,401,2012,155,399,2010,156,402,2009,159,403,2013,155,401,2012,157,398,2009,153,401,2010,155,400,2012,155,403,2016,156,397,2008,153,398,2008,157,399,2013,157,399,2013,157,403,2014,160,399,2010,156,399,2012,157,401,2013,155,400,2014,157,403,2013,158,399,2008,157,400,2009,156,402,2013,157,401,2013,156,404,2013,157,397,2007,157,402,2012,160,405,2011,159,405,2011,156,400,2011,158,399,2010,158,398,2007,156,401,2011,154,401,2012,157,402,2011,158,402,2013,159,392,2021,153,407,2010,161,394,2000}, +{52, 150,402,2014,161,398,2010,159,401,2013,158,402,2015,156,398,2015,158,396,2010,156,395,2011,157,400,2011,158,403,2014,156,400,2011,155,399,2011,155,396,2009,155,397,2010,156,399,2010,157,404,2014,157,404,2014,156,400,2011,155,402,2006,157,403,2011,157,402,2009,154,398,2005,155,399,2016,163,410,2011,155,397,2004,155,403,2013,158,394,2011,156,402,2013,164,405,2012,158,405,2016,149,396,2010,151,397,2010,160,400,2009,158,402,2009,151,398,2007,151,400,2009,158,403,2008,159,405,2012,158,402,2009,158,404,2008,160,409,2009,155,409,2011,152,408,2012,161,404,2005,166,401,2005,161,411,2009,163,408,2007,165,411,2008,160,407,2010,158,410,2011,157,404,2008,156,404,2011,160,405,2007}, +{52, 160,408,2012,160,414,2012,159,408,2010,158,403,2008,161,399,2001,159,402,2006,162,409,2009,156,410,2015,154,406,2011,166,399,2007,156,402,2011,159,404,2010,161,410,2011,156,404,2014,155,399,2009,161,397,2005,155,400,2009,157,404,2013,160,407,2011,160,403,2008,162,402,2010,154,400,2010,154,403,2011,161,403,2007,161,405,2010,157,407,2013,156,399,2006,160,401,2009,165,396,2005,154,409,2013,162,413,2013,160,408,2013,153,398,2008,158,396,2004,163,407,2010,167,412,2015,161,395,2009,152,390,2006,158,398,2009,165,416,2019,159,411,2018,149,397,2011,156,392,2006,163,401,2011,160,404,2013,157,392,2007,157,390,2004,158,393,2007,159,409,2015,167,420,2020,161,398,2010,151,392,2010}, +{53, 164,398,2005,161,405,2015,159,403,2012,157,397,2008,157,403,2009,161,405,2012,161,406,2015,159,401,2008,156,402,2008,161,406,2010,160,407,2009,158,408,2012,160,402,2008,159,407,2007,158,404,2007,161,407,2010,156,403,2009,156,409,2012,171,404,2009,154,411,2016,154,402,2007,160,405,2009,163,405,2009,159,403,2011,159,401,2009,160,408,2012,160,403,2008,155,403,2010,161,398,2008,159,400,2010,158,412,2013,164,412,2015,161,404,2011,161,394,2006,160,390,2004,157,399,2010,163,410,2016,161,409,2020,159,400,2012,159,393,2009,157,392,2009,162,394,2010,162,398,2011,160,394,2012,156,399,2018,161,403,2015,161,399,2014,154,397,2015,156,390,2012,165,386,2004,161,398,2013,157,404,2016,161,402,2013}, +{52, 157,394,2012,157,394,2008,165,393,2008,165,396,2010,160,403,2013,158,403,2014,158,403,2015,160,398,2011,158,394,2008,160,401,2013,164,400,2009,162,399,2011,157,397,2010,161,399,2009,160,405,2013,158,398,2009,156,401,2012,164,401,2009,164,401,2014,159,397,2011,158,397,2011,160,393,2010,159,396,2011,160,397,2012,158,395,2015,161,394,2011,161,393,2011,159,392,2012,158,391,2011,157,395,2015,161,398,2013,156,394,2013,158,396,2013,158,390,2010,159,394,2013,161,392,2010,155,395,2012,161,397,2012,160,398,2014,154,396,2013,153,392,2010,162,399,2012,166,396,2009,157,395,2014,159,394,2009,161,395,2010,159,404,2015,159,401,2014,157,394,2013,160,395,2010,162,397,2012,163,399,2012}, +{52, 158,396,2012,155,397,2012,159,395,2011,161,395,2013,161,396,2013,158,397,2014,157,398,2014,160,394,2013,160,393,2010,159,397,2013,157,394,2013,156,394,2014,159,393,2010,160,394,2011,158,393,2012,156,392,2011,155,394,2015,158,394,2011,156,393,2014,158,395,2013,159,392,2012,157,390,2011,157,394,2012,157,394,2013,157,393,2013,155,393,2012,156,395,2012,156,390,2012,159,390,2011,161,392,2012,161,393,2013,156,392,2010,155,391,2014,156,388,2013,154,388,2012,159,390,2012,158,394,2014,157,390,2013,157,393,2015,160,391,2013,157,392,2010,157,391,2012,157,393,2014,153,388,2012,157,390,2012,164,391,2013,161,397,2013,158,394,2014,155,394,2013,157,390,2012,161,392,2014,157,395,2013}, +{53, 157,397,2013,162,396,2010,163,396,2013,161,390,2006,159,394,2012,158,397,2011,155,400,2012,156,397,2011,164,398,2013,163,392,2009,157,390,2013,158,388,2009,160,400,2012,160,404,2015,153,398,2017,149,388,2010,158,391,2010,173,395,2009,168,395,2014,152,391,2015,148,392,2012,160,393,2011,159,397,2012,154,393,2013,155,394,2011,165,393,2009,165,393,2011,156,392,2013,156,393,2009,155,397,2015,162,399,2012,159,395,2014,159,391,2010,160,394,2010,162,398,2010,160,401,2013,157,392,2009,154,395,2013,160,399,2012,162,399,2012,160,399,2011,158,398,2013,160,394,2012,159,394,2010,156,399,2012,156,400,2012,160,396,2011,156,396,2009,157,398,2010,162,401,2017,165,398,2008,156,396,2013,159,398,2010}, +{52, 155,394,2014,156,398,2012,159,397,2012,159,402,2013,161,397,2014,160,394,2011,161,394,2010,157,394,2013,156,398,2014,156,397,2013,159,394,2010,159,394,2013,159,392,2012,158,393,2013,160,391,2015,157,393,2012,159,396,2011,158,393,2013,157,392,2013,159,390,2011,160,392,2010,157,395,2011,156,395,2012,158,393,2014,157,393,2014,161,388,2012,160,392,2012,157,393,2010,152,394,2013,155,391,2013,158,390,2014,158,392,2016,157,390,2014,158,387,2010,159,392,2012,161,393,2013,155,389,2013,155,390,2013,157,390,2012,158,391,2016,160,388,2013,153,387,2014,155,390,2013,157,388,2014,157,394,2015,159,391,2012,156,387,2013,161,389,2014,162,392,2015,159,391,2011,153,394,2011,153,392,2016}, +{52, 155,388,2014,160,384,2011,159,391,2013,162,389,2012,157,394,2018,157,388,2014,152,385,2009,159,384,2011,156,389,2016,155,388,2014,158,391,2015,163,385,2015,163,385,2010,159,382,2011,158,391,2015,156,391,2017,156,393,2018,161,390,2015,159,386,2014,157,384,2013,162,383,2011,162,388,2013,161,391,2013,158,391,2014,155,397,2015,158,395,2013,159,388,2011,159,383,2008,162,386,2011,161,387,2011,156,394,2015,155,395,2011,155,396,2016,159,391,2013,158,389,2012,160,387,2013,161,393,2014,161,390,2013,158,393,2014,159,388,2011,156,387,2012,156,393,2014,158,390,2014,159,388,2013,160,387,2011,160,390,2014,160,388,2014,158,388,2012,156,390,2014,158,392,2016,157,389,2014,158,386,2013}, +{53, 160,388,2012,161,388,2013,155,389,2015,155,387,2012,156,387,2011,156,389,2012,157,390,2016,157,385,2013,157,385,2013,163,387,2011,159,390,2016,158,389,2014,156,387,2013,158,387,2010,156,388,2016,158,387,2012,158,385,2015,161,386,2010,157,390,2015,158,387,2009,155,386,2014,159,391,2014,158,389,2013,157,387,2015,157,384,2014,157,385,2013,158,387,2014,157,388,2014,156,389,2014,159,386,2011,159,387,2012,159,389,2012,155,384,2013,154,390,2015,162,385,2008,152,386,2021,163,390,2011,154,385,2015,158,385,2013,157,387,2013,159,388,2017,158,383,2012,154,384,2015,158,384,2012,156,385,2014,159,386,2014,158,385,2017,158,386,2011,156,388,2013,159,392,2014,156,386,2014,158,387,2012,159,386,2009}, +{52, 158,390,2015,157,390,2015,155,387,2012,158,390,2013,161,388,2014,158,390,2016,161,391,2014,163,391,2011,161,389,2010,154,388,2011,153,389,2012,161,392,2015,163,389,2010,158,393,2016,160,389,2009,155,391,2013,160,389,2010,159,390,2013,156,383,2011,156,388,2015,160,385,2012,160,389,2017,163,380,2017,155,367,2027,151,390,2009,168,407,2001,161,395,2012,151,393,2016,160,395,2015,162,394,2014,157,391,2011,159,392,2009,163,390,2008,159,387,2011,158,392,2012,164,398,2012,161,406,2016,161,404,2019,160,396,2012,158,395,2007,157,387,2005,157,398,2010,165,402,2013,163,408,2013,156,395,2009,156,397,2009,159,397,2011,158,399,2013,161,401,2014,165,400,2010,159,398,2014,157,396,2010}, +{52, 154,398,2013,165,403,2010,166,402,2009,155,401,2014,159,403,2009,163,397,2008,163,399,2006,160,404,2011,156,409,2013,161,413,2015,165,401,2004,154,401,2011,165,409,2009,165,408,2012,155,400,2008,163,397,2003,162,406,2012,159,402,2009,154,399,2011,160,402,2008,162,403,2016,164,399,2013,161,395,2008,162,397,2011,162,407,2015,164,397,2011,156,390,2011,160,389,2008,160,396,2010,163,401,2013,163,400,2015,161,393,2010,161,390,2011,157,395,2013,158,399,2016,163,400,2016,162,393,2010,160,393,2011,163,392,2009,159,395,2012,160,396,2009,159,397,2011,160,395,2013,161,398,2013,159,393,2011,154,394,2012,160,397,2011,162,397,2011,157,394,2015,158,393,2011,159,394,2012,160,402,2011}, +{53, 159,397,2010,159,397,2013,161,396,2009,155,390,2010,162,397,2012,163,396,2011,157,393,2014,162,395,2011,158,395,2014,162,394,2013,158,394,2013,160,392,2008,160,390,2008,157,393,2012,159,393,2012,160,397,2014,161,398,2014,157,391,2011,157,388,2011,158,390,2012,159,396,2014,161,397,2015,161,391,2014,159,384,2010,157,391,2007,157,397,2015,162,395,2014,158,393,2013,154,390,2010,157,390,2013,161,388,2010,159,385,2013,159,390,2012,158,388,2012,158,388,2015,159,379,2022,154,382,2017,156,407,2000,170,400,2012,156,396,2018,159,390,2012,160,390,2011,156,390,2010,158,392,2011,161,390,2013,156,393,2016,157,387,2012,156,385,2011,158,388,2015,162,375,2024,153,378,2013,157,403,2002,163,402,2007}, +{52, 152,389,2014,153,386,2011,159,389,2015,162,384,2011,156,385,2019,158,386,2019,160,399,2014,162,391,2014,152,385,2012,156,390,2012,161,393,2014,160,393,2013,162,391,2010,160,396,2012,165,396,2010,158,401,2014,159,397,2009,160,388,2007,161,399,2012,165,393,2006,160,399,2014,159,403,2016,159,408,2014,168,405,2012,163,402,2013,157,395,2008,160,396,2005,161,404,2007,158,404,2008,158,408,2013,162,401,2008,155,404,2013,169,403,2005,165,406,2013,157,403,2013,158,399,2009,162,408,2013,164,406,2011,159,399,2009,157,399,2011,163,400,2006,159,405,2011,159,407,2012,157,404,2010,161,404,2011,163,402,2014,163,398,2008,160,399,2008,163,407,2010,159,409,2012,155,406,2010,152,396,2008}, +{52, 162,404,2010,171,404,2010,163,403,2011,157,402,2007,155,406,2010,156,406,2016,161,401,2007,161,402,2010,162,403,2012,162,403,2009,162,402,2005,158,401,2009,157,404,2009,159,404,2009,159,404,2014,168,404,2012,163,399,2008,159,398,2009,158,399,2009,160,404,2011,159,403,2011,158,408,2012,162,407,2012,162,403,2012,159,397,2008,160,401,2010,164,403,2010,161,401,2010,159,400,2011,158,403,2008,157,403,2011,161,404,2012,160,401,2011,161,400,2010,163,401,2011,162,403,2013,158,398,2007,157,402,2011,163,400,2010,160,398,2011,159,399,2011,165,403,2012,161,402,2010,155,400,2012,159,396,2009,160,400,2011,162,400,2012,159,401,2013,162,400,2009,160,399,2010,161,397,2013,162,399,2012}, +{53, 159,399,2010,160,402,2016,158,399,2010,161,396,2010,164,399,2010,159,398,2011,157,393,2012,162,397,2012,164,399,2010,158,402,2014,158,399,2012,161,397,2012,159,401,2012,167,399,2007,158,402,2015,157,401,2011,157,398,2009,162,401,2007,160,405,2012,162,402,2010,159,403,2013,161,402,2011,162,403,2010,161,398,2009,158,405,2011,160,406,2014,164,405,2007,158,396,2012,160,399,2009,161,400,2013,162,404,2011,160,401,2013,160,401,2009,154,400,2019,162,401,2012,160,393,2008,160,401,2009,161,399,2010,156,399,2010,160,401,2015,161,397,2010,158,398,2010,160,398,2010,162,398,2011,161,399,2010,159,400,2011,160,400,2012,158,400,2010,158,398,2013,158,397,2009,163,397,2010,163,401,2011,162,400,2010}, +{52, 157,400,2013,165,405,2014,162,402,2008,156,401,2012,164,400,2009,160,397,2009,158,401,2010,160,405,2011,158,406,2014,162,407,2013,164,399,2006,161,394,2006,160,396,2006,163,408,2013,159,406,2013,156,404,2012,161,401,2009,165,400,2012,161,393,2009,158,396,2010,162,400,2015,161,397,2012,155,398,2013,161,401,2012,160,396,2010,157,392,2012,160,395,2009,159,399,2012,159,399,2015,164,396,2013,160,397,2012,157,398,2011,159,400,2013,165,398,2008,159,393,2007,156,400,2012,160,402,2011,161,400,2012,163,397,2011,163,402,2008,161,403,2012,162,402,2013,159,400,2010,159,397,2007,161,398,2010,163,403,2014,163,403,2008,165,404,2012,168,406,2012,163,402,2010,157,401,2011,160,404,2011}, +{52, 161,403,2005,161,404,2012,167,403,2010,166,402,2009,161,402,2009,159,404,2010,163,398,2009,158,396,2010,156,408,2016,172,407,2012,169,406,2014,157,394,2011,160,392,2005,158,391,2008,157,401,2013,164,404,2014,165,402,2013,161,395,2009,160,394,2007,163,396,2009,160,402,2016,161,401,2011,160,402,2013,162,400,2012,161,397,2011,161,398,2009,165,400,2009,162,401,2012,164,403,2008,160,402,2010,160,401,2011,161,396,2008,163,398,2007,161,403,2015,166,400,2013,162,398,2011,160,398,2014,159,398,2012,161,394,2012,165,397,2011,162,398,2013,161,397,2013,160,396,2011,160,394,2009,163,395,2012,164,396,2014,162,398,2013,159,397,2012,161,398,2013,163,392,2010,160,392,2009,160,396,2011}, +{58, 165,399,2011,162,398,2012,162,398,2014,157,393,2012,158,396,2009,161,397,2011,162,395,2012,166,396,2011,161,395,2008,161,399,2014,164,396,2007,158,395,2012,158,397,2014,160,392,2010,161,396,2009,163,397,2014,162,398,2014,163,393,2010,161,394,2013,160,396,2010,160,395,2012,161,396,2011,164,394,2010,162,394,2017,161,398,2010,163,388,2009,163,405,2013,161,391,2011,157,396,2017,163,387,2006,161,399,2017,166,394,2009,158,394,2014,160,394,2011,159,393,2012,159,392,2012,161,396,2012,161,400,2013,164,395,2013,162,392,2012,160,388,2009,159,394,2012,161,397,2014,160,396,2013,159,395,2015,160,393,2012,160,392,2013,163,392,2011,161,393,2014,159,394,2013,159,397,2013,161,394,2014,162,393,2012,160,391,2010,160,395,2012,164,393,2010,160,391,2012,157,400,2018}, +{52, 164,389,2004,153,390,2017,165,391,2009,159,392,2012,164,396,2012,159,395,2017,165,392,2007,162,393,2009,160,398,2017,165,394,2010,160,390,2009,162,398,2012,161,399,2014,159,399,2011,161,400,2014,166,402,2010,163,401,2009,158,405,2011,162,403,2013,163,402,2007,161,410,2010,161,412,2010,162,406,2010,163,393,1999,162,407,2010,166,417,2011,159,406,2010,157,406,2010,167,410,2011,160,397,2009,158,390,2006,164,397,2005,164,407,2017,167,408,2016,162,395,2011,159,396,2006,160,395,2013,163,396,2014,161,391,2012,162,392,2009,163,393,2013,164,392,2011,162,393,2014,163,392,2011,157,389,2013,159,389,2013,161,387,2010,163,390,2011,162,394,2015,163,391,2014,163,387,2009,159,387,2013}, +{52, 158,392,2014,161,391,2013,159,390,2013,160,390,2010,161,387,2010,162,390,2010,158,391,2012,159,390,2010,156,388,2012,160,387,2012,160,393,2016,161,397,2016,161,387,2015,163,382,2006,160,386,2010,161,391,2014,162,394,2017,165,391,2014,162,392,2013,162,391,2011,160,394,2013,163,388,2009,161,389,2011,160,393,2011,160,397,2014,162,396,2010,159,396,2013,161,393,2010,163,395,2014,166,395,2007,157,393,2014,163,399,2014,163,395,2011,158,393,2010,162,396,2014,161,393,2012,162,395,2013,163,393,2010,161,396,2011,163,394,2011,159,395,2014,161,393,2013,161,392,2010,164,395,2012,163,397,2016,163,393,2012,159,395,2012,165,397,2012,165,396,2010,161,394,2010,160,396,2012,164,399,2015}, +{53, 164,395,2013,162,398,2011,161,396,2011,164,394,2012,165,396,2010,161,392,2008,162,396,2014,167,394,2012,163,397,2012,161,394,2013,163,398,2015,166,391,2010,161,391,2012,161,394,2010,162,398,2013,164,394,2011,163,394,2014,162,394,2014,160,392,2011,161,392,2012,165,393,2012,163,395,2013,164,397,2014,164,393,2011,161,392,2013,164,394,2012,162,397,2014,163,397,2013,163,395,2014,167,395,2010,165,400,2010,163,401,2013,162,401,2015,164,397,2009,161,400,2010,162,400,2013,169,400,2009,164,397,2009,161,402,2008,168,404,2010,166,406,2014,161,401,2011,161,401,2008,166,401,2008,168,404,2015,165,399,2009,159,403,2010,163,409,2008,165,408,2013,159,400,2010,161,394,2005,164,399,2007,164,406,2014}, +{52, 170,404,2011,162,405,2010,160,403,2013,160,404,2013,166,397,2011,165,396,2008,162,397,2008,160,404,2012,165,404,2014,164,398,2011,160,396,2009,162,398,2011,164,400,2013,165,402,2010,167,402,2011,158,403,2010,160,398,2007,165,400,2009,165,397,2009,163,403,2012,163,405,2015,161,400,2010,165,396,2008,166,401,2010,162,404,2015,168,408,2013,162,406,2014,162,394,2007,160,393,2009,164,399,2007,161,405,2014,162,408,2013,164,400,2009,161,398,2010,167,399,2009,163,402,2012,162,402,2014,165,403,2009,164,404,2011,162,404,2010,162,399,2010,164,400,2009,163,400,2007,163,404,2011,166,404,2011,163,405,2010,163,401,2008,163,400,2011,164,400,2010,162,400,2009,160,403,2012,161,404,2011}, +{52, 164,398,2008,161,397,2007,162,396,2009,165,399,2010,165,399,2012,159,396,2013,161,396,2009,162,399,2012,161,398,2011,161,395,2012,161,394,2013,164,395,2012,163,394,2011,161,399,2017,161,396,2012,159,396,2013,160,393,2012,164,396,2013,163,394,2010,162,397,2014,162,396,2012,166,395,2013,164,391,2011,158,394,2012,164,393,2014,163,393,2013,159,392,2010,163,396,2010,162,395,2017,164,392,2010,161,391,2012,160,390,2014,161,393,2010,162,394,2015,162,395,2014,164,392,2009,162,393,2015,162,394,2016,162,395,2010,162,396,2017,163,391,2013,161,385,2011,162,385,2007,159,391,2011,164,404,2018,165,398,2018,158,386,2012,156,385,2004,157,391,2013,161,394,2018,171,395,2010,159,386,2011}, +{53, 161,394,2011,164,394,2013,163,394,2015,164,389,2008,157,397,2011,166,392,2008,164,395,2015,166,391,2006,161,393,2012,166,400,2015,162,398,2012,165,394,2011,164,392,2011,166,392,2007,165,393,2012,167,397,2016,166,392,2014,163,391,2009,164,389,2013,163,391,2013,160,385,2012,164,389,2015,168,387,2012,163,386,2015,163,389,2016,164,385,2013,163,383,2014,163,381,2012,160,388,2017,164,386,2014,164,383,2018,164,379,2011,164,379,2012,161,388,2019,161,384,2014,160,384,2016,167,382,2012,164,380,2014,165,383,2016,162,382,2011,161,385,2018,169,379,2012,162,371,2008,158,378,2015,164,376,2017,166,360,2057,156,354,2005,162,425,1995,183,403,2007,150,390,2018,159,384,2015,172,392,2015,163,389,2012}, +{52, 160,390,2015,168,398,2016,172,398,2013,164,396,2011,162,395,2011,163,401,2009,166,406,2012,167,417,1996,169,412,2005,171,375,2020,158,393,2016,172,404,2010,165,403,2009,157,399,2010,163,400,2008,165,401,2011,165,401,2013,172,396,2011,169,402,2010,166,401,2013,164,400,2010,162,397,2010,163,399,2012,165,398,2012,167,400,2013,167,395,2010,167,397,2011,167,394,2010,163,393,2012,165,395,2014,167,398,2014,165,396,2014,163,395,2015,169,393,2012,167,392,2011,165,391,2012,164,394,2011,164,396,2013,166,398,2011,166,393,2011,163,395,2012,166,394,2011,166,396,2011,168,399,2015,167,398,2011,165,395,2010,164,395,2010,164,396,2010,165,396,2013,166,396,2013,167,394,2010,164,397,2014}, +{52, 166,392,2010,165,393,2010,165,395,2009,165,392,2010,163,393,2013,167,395,2012,167,391,2014,165,394,2013,167,387,2007,164,394,2017,169,389,2009,163,388,2015,164,389,2011,163,392,2016,166,393,2014,165,392,2014,166,392,2012,164,388,2013,165,389,2010,166,389,2013,166,391,2015,164,389,2010,165,392,2012,166,393,2013,165,392,2010,164,392,2013,166,391,2009,167,390,2010,163,392,2010,164,393,2015,165,395,2012,167,392,2010,166,393,2014,164,396,2014,166,391,2009,166,391,2011,164,391,2011,164,394,2013,165,394,2015,168,392,2008,165,389,2010,166,393,2010,167,395,2012,165,395,2015,167,394,2009,164,395,2012,164,397,2014,166,397,2011,166,391,2006,163,392,2007,165,398,2007,165,403,2014}, +{52, 165,401,2012,166,400,2009,164,396,2012,165,396,2009,166,394,2010,165,403,2013,168,402,2012,168,401,2013,165,394,2009,161,394,2008,162,399,2009,167,403,2013,168,400,2010,165,394,2009,162,396,2013,167,398,2012,165,391,2012,164,397,2010,163,397,2012,165,401,2011,161,391,2012,162,398,2013,167,396,2013,165,392,2011,163,388,2004,160,394,2013,163,398,2014,164,394,2013,164,391,2014,169,394,2008,164,395,2012,165,398,2015,166,395,2012,164,393,2009,164,390,2010,165,398,2012,166,400,2014,167,394,2011,165,391,2012,167,392,2008,163,395,2016,165,394,2011,165,397,2014,164,393,2011,162,393,2014,166,391,2010,163,395,2013,166,396,2011,166,393,2013,164,390,2012,160,390,2012,164,392,2011}, +{53, 166,393,2012,161,393,2014,163,395,2013,165,391,2011,162,390,2011,162,392,2011,162,393,2010,164,393,2014,163,396,2012,163,392,2011,163,392,2011,163,395,2011,165,393,2012,165,395,2012,160,394,2014,163,393,2010,164,390,2011,164,391,2011,163,393,2015,161,393,2012,164,389,2012,163,391,2012,163,390,2013,162,391,2013,162,388,2013,164,391,2012,164,390,2011,161,393,2013,163,390,2013,163,387,2014,165,390,2013,165,390,2013,163,391,2012,161,393,2015,161,390,2013,165,388,2012,164,391,2016,165,390,2009,159,393,2014,167,392,2012,164,390,2010,160,389,2012,163,392,2013,164,393,2013,166,390,2015,166,389,2011,162,389,2011,161,389,2013,164,390,2011,162,389,2013,162,390,2014,162,387,2013,164,388,2013}, +{52, 164,387,2016,161,389,2013,162,390,2012,165,391,2014,162,388,2011,161,388,2013,165,391,2014,165,385,2013,162,389,2012,164,392,2013,161,395,2014,167,392,2013,162,388,2012,159,387,2010,165,392,2013,167,395,2014,165,393,2016,165,389,2011,162,388,2011,164,390,2014,164,393,2011,167,394,2015,167,393,2014,164,388,2010,163,390,2012,165,392,2013,165,390,2014,160,390,2015,164,392,2013,167,394,2010,167,390,2011,163,388,2015,163,391,2012,164,392,2014,164,392,2014,166,393,2015,164,391,2015,163,390,2012,167,390,2014,162,392,2013,162,393,2014,164,392,2013,167,393,2012,163,390,2013,164,390,2010,164,392,2012,166,391,2014,164,391,2014,163,390,2013,165,389,2013,162,390,2014,164,391,2011}, +{52, 163,391,2014,165,392,2013,168,389,2012,164,390,2012,163,389,2014,164,391,2012,162,391,2013,164,391,2014,164,388,2013,166,388,2013,163,388,2014,161,389,2012,161,388,2012,163,391,2014,165,392,2015,163,389,2014,166,386,2012,166,389,2010,163,393,2013,164,393,2014,164,390,2012,163,389,2012,162,389,2011,164,391,2012,165,390,2014,166,391,2014,164,392,2011,163,392,2014,164,391,2010,161,390,2013,165,391,2011,167,391,2013,165,388,2011,163,389,2012,165,390,2010,164,391,2014,163,395,2014,163,390,2012,166,388,2013,165,391,2010,163,391,2014,165,391,2013,163,391,2012,164,392,2013,164,392,2013,163,391,2013,164,390,2013,163,390,2013,164,388,2016,162,388,2011,163,391,2015,162,392,2014}, +{53, 162,390,2013,165,389,2011,164,391,2012,163,392,2013,162,392,2012,162,391,2013,163,393,2013,165,390,2013,164,390,2012,162,391,2012,163,389,2011,164,390,2012,162,393,2015,163,394,2015,163,392,2015,166,386,2011,166,388,2013,161,389,2012,161,390,2013,164,394,2015,164,393,2015,163,387,2013,163,387,2011,163,390,2012,166,390,2012,164,388,2014,161,389,2013,162,391,2012,165,392,2016,165,392,2014,160,388,2014,163,388,2013,167,391,2014,163,390,2012,163,391,2012,162,392,2011,160,392,2014,164,390,2014,164,389,2014,163,389,2011,163,390,2014,165,391,2014,162,390,2011,160,390,2014,161,391,2014,163,386,2014,164,386,2014,164,389,2013,165,390,2014,163,390,2013,162,390,2015,162,390,2011,163,390,2017}, +{52, 164,389,2012,165,388,2012,165,391,2012,162,390,2013,164,390,2015,161,388,2012,160,392,2014,163,393,2013,166,388,2011,161,388,2011,163,387,2013,165,391,2015,163,392,2011,162,391,2014,160,390,2010,162,390,2011,164,393,2013,163,389,2014,163,389,2012,164,390,2012,166,392,2013,162,388,2014,160,389,2015,161,391,2015,164,390,2013,165,387,2011,162,389,2012,164,391,2013,167,389,2014,162,389,2011,162,390,2012,161,390,2013,163,391,2013,165,388,2013,165,390,2012,165,389,2012,162,390,2012,161,387,2012,162,392,2012,164,390,2013,160,388,2013,163,389,2011,168,390,2013,164,391,2014,162,389,2015,163,390,2012,161,389,2013,161,390,2014,164,388,2014,163,385,2012,165,391,2016,165,389,2013}, +{52, 162,391,2014,162,391,2013,162,388,2014,162,387,2013,164,388,2010,165,389,2012,165,391,2012,162,389,2012,161,389,2014,162,391,2013,162,390,2014,166,388,2014,163,387,2013,162,389,2013,164,391,2015,162,389,2013,162,389,2011,162,386,2011,160,389,2011,162,389,2013,167,396,2012,162,392,2016,163,392,2015,162,389,2014,164,391,2013,165,388,2013,161,390,2013,161,390,2012,163,395,2014,166,390,2013,165,389,2012,161,390,2010,162,392,2014,164,387,2013,161,390,2013,165,390,2013,163,392,2013,164,392,2013,166,392,2010,163,386,2012,161,388,2012,161,385,2011,160,392,2011,165,389,2011,162,388,2015,163,384,2013,164,385,2015,165,386,2012,165,386,2011,159,387,2015,161,387,2013,160,387,2013}, +{53, 165,384,2013,164,386,2014,163,381,2013,163,384,2012,165,387,2014,161,393,2017,163,391,2016,162,389,2013,165,386,2011,166,386,2010,162,387,2011,164,390,2012,164,392,2016,161,389,2013,164,391,2014,166,392,2011,163,388,2012,162,388,2013,164,390,2011,163,389,2013,164,392,2012,162,392,2014,162,392,2013,164,387,2010,162,389,2013,165,391,2014,166,391,2012,163,392,2012,160,388,2013,160,388,2009,165,389,2013,166,389,2015,165,390,2012,163,388,2016,162,390,2013,162,392,2015,162,399,2017,162,398,2014,164,395,2012,164,393,2007,165,399,2012,167,398,2008,163,398,2007,158,399,2010,164,412,2010,167,409,2010,158,398,2009,161,395,2004,167,396,2006,166,403,2008,164,404,2014,162,406,2017,166,397,2007}, +{53, 167,395,2010,167,393,2010,161,389,2012,162,393,2013,166,393,2016,165,388,2013,162,386,2014,165,395,2014,166,394,2017,164,387,2014,165,379,2012,163,381,2007,160,388,2013,164,394,2018,164,388,2016,163,383,2013,165,380,2013,164,383,2010,164,388,2012,160,390,2014,161,386,2012,160,384,2012,159,386,2013,164,382,2014,164,384,2015,164,383,2015,162,385,2015,163,386,2015,161,382,2012,160,382,2016,160,381,2009,160,381,2013,163,384,2017,167,386,2017,167,386,2016,160,385,2019,159,376,2012,159,378,2011,162,384,2013,164,387,2014,162,382,2016,163,381,2015,165,383,2013,164,383,2016,162,379,2013,158,385,2014,159,385,2014,163,384,2016,165,379,2014,162,378,2013,164,383,2014,163,384,2015,158,383,2017}, +}; +static const uint32_t duration_SPO2[] = +{ +1013, +1048, +1062, +1059, +1037, +1062, +1065, +1038, +1058, +1060, +1040, +1058, +1060, +1039, +1060, +1060, +1036, +1061, +1061, +1040, +1059, +1062, +1035, +1060, +1062, +1034, +1062, +1059, +1060, +1038, +1060, +1061, +1036, +1060, +1061, +1037, +1062, +1063, +1037, +1059, +1060, +1145, +1059, +1063, +1036, +1062, +1062, +1037, +1059, +1061, +1035, +1060, +1061, +1048, +1047, +1064, +1048, +1049, +1063, +}; + +static const uint8_t frame_SPO2[] = +{ +1, +2, +3, +4, +5, +6, +7, +8, +9, +10, +11, +12, +13, +14, +15, +16, +17, +18, +19, +20, +21, +22, +23, +24, +25, +26, +27, +28, +29, +30, +31, +32, +33, +34, +35, +36, +37, +38, +39, +40, +41, +42, +43, +44, +45, +46, +47, +48, +49, +50, +51, +52, +53, +54, +55, +56, +57, +58, +59, +}; + +#endif diff --git a/code/sdk/zhihui/drivers/ppg/pah8009/algorithm/pah_spo2/V703/pxialg_spo2.h b/code/sdk/zhihui/drivers/ppg/pah8009/algorithm/pah_spo2/V703/pxialg_spo2.h new file mode 100644 index 000000000..fdda92655 --- /dev/null +++ b/code/sdk/zhihui/drivers/ppg/pah8009/algorithm/pah_spo2/V703/pxialg_spo2.h @@ -0,0 +1,152 @@ +#ifndef __PXIALG_SPO2_H__ +#define __PXIALG_SPO2_H__ + + +#include + + +#if defined(WIN32) && !defined(PXIALG_STATIC_LIB) +# ifdef PXIALG_EXPORTS +# define PXIALG_API __declspec(dllexport) +# else +# define PXIALG_API __declspec(dllimport) +# endif +#else +# define PXIALG_API +#endif // WIN32 + +#pragma pack(1) +typedef struct SpO2_mems { + int16_t data[3]; +} SpO2_mems_t; + +typedef struct SpO2_info { + float IR_DC; + float R_DC; + float G_DC; + float IR_AC; + float R_AC; + float G_AC; + float R_IR_Ratio; + float R_G_Ratio; + float G_IR_Ratio; + float Noise; + float SpO2_ref; + float PI; + float PVI; + float RMS; + float MEMS; + float Output[5]; + float xyz_mean[3]; +} SpO2_info_t; +#pragma pack() + +typedef enum { + SPO2_MSG_SUCCESS = 0, + SPO2_MSG_ALG_NOT_OPEN, + SPO2_MSG_ALG_REOPEN, + SPO2_MSG_ALG_NOT_SUPPORT, + SPO2_MSG_INVALID_ARGUMENT, + SPO2_MSG_MOVING_SPO2_READY = 0x100, + SPO2_MSG_MOVING_SPO2_NOT_READY, + SPO2_MSG_MOVING_SPO2_STOP, +}spo2_msg_code_t; + + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + + +PXIALG_API uint32_t SpO2_OpenSize(void); +PXIALG_API int SpO2_Open(void *mem); +PXIALG_API int SpO2_Close(void); +PXIALG_API int SpO2_GetSpO2(float *spo2); +PXIALG_API int SpO2_GetReadyFlag(uint8_t *ready_flag); +PXIALG_API int SpO2_GetPeriodicity(float *periodicity); +PXIALG_API int SpO2_Version(void); +PXIALG_API int SpO2_Process(int touch_flag, int total_channel, int *input, int samples_per_ch, float time_in); +PXIALG_API int SpO2_ProcessD(int touch_flag, int total_channel, int *input, int samples_per_ch, float time_in); +PXIALG_API int SpO2_GetFilteredData(int touch_flag, int total_channel, int expo_R, int expo_IR, int DAC_R, int DAC_IR, float **filter_R, float **filter_IR, int *FilteredDataLength); + +//parameters +PXIALG_API int SpO2_SetIIRFilterRatio(float IIRFilterRatio); //0 ~ 0.5. bigger value more smooth. +PXIALG_API int SpO2_SetMotionDetectionLevel(float level); +PXIALG_API int SpO2_SetInputModelScale(float scale); +PXIALG_API int SpO2_SetInputCorrelationTh(float th); +PXIALG_API int SpO2_SetInputRatioLow(float ratio); +PXIALG_API int SpO2_SetInputCoefLow0(float coef); +PXIALG_API int SpO2_SetInputCoefLow1(float coef); +PXIALG_API int SpO2_SetInputCoefLow2(float coef); +PXIALG_API int SpO2_SetInputCoefLow3(float coef); +PXIALG_API int SpO2_SetInputCoefMid0(float coef); +PXIALG_API int SpO2_SetInputCoefMid1(float coef); +PXIALG_API int SpO2_SetInputCoefMid2(float coef); +PXIALG_API int SpO2_SetInputCoefMid3(float coef); +PXIALG_API int SpO2_SetInputCoefHigh0(float coef); +PXIALG_API int SpO2_SetInputCoefHigh1(float coef); +PXIALG_API int SpO2_SetInputCoefHigh2(float coef); +PXIALG_API int SpO2_SetInputCoefHigh3(float coef); +PXIALG_API int SpO2_SetInputRatioHighBound(float bound); +PXIALG_API int SpO2_SetInputRatioLowBound(float bound); +PXIALG_API int SpO2_SetInputFlagCheckHr(int value); +PXIALG_API int SpO2_SetOutputHighBound(float value); +PXIALG_API int SpO2_SetOutputLowBound(float value); +PXIALG_API int SpO2_Set_Init_Low_SpO2_Constrain(int value); +PXIALG_API int SpO2_Set_Init_Low_SpO2_Th(float value); + +PXIALG_API int SpO2_Set_Init_Low_SpO2_Check_Sec(int value); + +PXIALG_API int SpO2_Set_Motion_Rms_Th(float value); +PXIALG_API int SpO2_Set_Motion_Rms_Th2(float value); + +PXIALG_API int SpO2_Set_Correlation_Th2_Count(int value); +PXIALG_API int SpO2_Set_Input_Correlation_Th2(float value); + +PXIALG_API int SpO2_Set_Flag_Hold_Breathe_Mode(char value); + +PXIALG_API int SpO2_Set_Keep_Init_SpO2_Bound(float value); +PXIALG_API int SpO2_Set_Keep_Init_SpO2_Count_Th(int value); +PXIALG_API int SpO2_Set_SpO2_Bias_Value(float value); +PXIALG_API int SpO2_Set_SpO2_Outlier_Smooth_Coef(float value); +PXIALG_API int SpO2_Set_SpO2_Decrease_Coef(float value); + +PXIALG_API int SpO2_Set_Motion_MEMS_Th(float value); + +PXIALG_API int SpO2_Set_T1(float value); +PXIALG_API int SpO2_Set_T2(float value); +PXIALG_API int SpO2_Set_T3(float value); +PXIALG_API int SpO2_Set_T4(float value); +PXIALG_API int SpO2_Set_T5(float value); +PXIALG_API int SpO2_Set_Spo2_Force_Output_Second(int value); + +PXIALG_API int Spo2_Set_SpO2_First_Smooth_Th(float value); +PXIALG_API int Spo2_Set_SpO2_First_Smooth_Sec(int value); +PXIALG_API int Spo2_Set_SpO2_Correlation_Smooth_Th(float value); + +//set HR +PXIALG_API int SpO2_SetHrValue(int value); + +//get SPO2_Info +PXIALG_API int SpO2_GetInfo(SpO2_info_t *info); + +PXIALG_API int SpO2_SetMems(SpO2_mems_t *mems, int samples); + +PXIALG_API int SpO2_Set_Update_Sec(int spo2_update_sec); + +PXIALG_API int SpO2_SetMemsRmsThr(float mems_rms_thr); +PXIALG_API int SpO2_CalAvgSpO2(float mySpO2, float trust_flag, float mems_rms, float *result); //called every one second +PXIALG_API int SpO2_SetSkipDataLen(int len); +PXIALG_API int SpO2_SetChMapping(int8_t *alg_ch, int8_t ch_nr); + +PXIALG_API int Spo2_Set_Force_Output_Value(float value); +PXIALG_API int Spo2_Set_Force_Output_Value2(float value); + +PXIALG_API int SpO2_Set_Signal_Periodicity_Th(float value); + +#ifdef __cplusplus +} +#endif // __cplusplus + + +#endif diff --git a/code/sdk/zhihui/drivers/ppg/pah8009/algorithm/pah_spo2/V703/test_library_SPO2.c b/code/sdk/zhihui/drivers/ppg/pah8009/algorithm/pah_spo2/V703/test_library_SPO2.c new file mode 100644 index 000000000..2f76e5259 --- /dev/null +++ b/code/sdk/zhihui/drivers/ppg/pah8009/algorithm/pah_spo2/V703/test_library_SPO2.c @@ -0,0 +1,432 @@ +// algorithm +#include "pxialg_spo2.h" +// HR algorithm +#include "pxialg.h" +// testpattern +#include "pah8009_testpattern_SPO2.h" +// platform +#include + +#include "pah800x_main.h" +//#include "system_clock.h" +//#include "i2c.h" +//#include "gpio_ctrl.h" +//#include "pah_comm.h" +#include +#include "nrf_delay.h" +#define array_szie(arr) (sizeof(arr) / sizeof(arr[0])) + +#define SAMPLES_PER_CHANNEL 25 +#define TOTAL_CHANNEL 3 + +//#define Open_Rest_Flow + +static SpO2_mems_t mems_data_raw[150]; //add item + +typedef struct +{ + void *pBuffer; + void *hr_pBuffer; +} pxialg_spo2_state; + +//#define parameter_printf(...) NRF_LOG_RAW_INFO(__VA_ARGS__) + +extern void spo2_log_printf(char s, float f); +//static void spo2_log_printf(char s, float f) +//{ +// parameter_printf("%s= "LOG_FLOAT_MARKER" \n",s, LOG_FLOAT(f)); + +//} + + + + +static void bubblesort(float *input,int count) +{ + int i,j; + float sort_temp; + for(i=0;i=25) ) + { + alg_count = alg_count -25; + if (ReadyFlag > 0) + { + LOG_PRINT("myHR = "LOG_FLOAT_MARKER" ",LOG_FLOAT(myHR)); + //nrf_delay_ms(10); + LOG_PRINT(",grade = "LOG_FLOAT_MARKER" ",LOG_FLOAT(hr_grader)); + //nrf_delay_ms(10); + LOG_PRINT(",spo2 = "LOG_FLOAT_MARKER" ",LOG_FLOAT(mySpO2)); + //nrf_delay_ms(10); + LOG_PRINT(",correlation = "LOG_FLOAT_MARKER" ",LOG_FLOAT(correlation)); + //nrf_delay_ms(10); + LOG_PRINT(",trust_flag = "LOG_FLOAT_MARKER" ",LOG_FLOAT(trust_flag)); + //nrf_delay_ms(10); + LOG_PRINT(", SignalPeriodicity = "LOG_FLOAT_MARKER" ",LOG_FLOAT(SignalPeriodicity)); + //nrf_delay_ms(10); + LOG_PRINT(",MEMS_RMS = "LOG_FLOAT_MARKER" ",LOG_FLOAT(MEMS_RMS)); + //nrf_delay_ms(10); + LOG_PRINT(",reason = %d \n",no_value_reason); + } + else + { + LOG_PRINT("myHR = "LOG_FLOAT_MARKER" ",LOG_FLOAT(myHR)); + //nrf_delay_ms(10); + LOG_PRINT(",grade = "LOG_FLOAT_MARKER" ",LOG_FLOAT(hr_grader)); + //nrf_delay_ms(10); + LOG_PRINT(",spo2 = "LOG_FLOAT_MARKER" ",LOG_FLOAT(mySpO2)); + //nrf_delay_ms(10); + LOG_PRINT(",correlation = "LOG_FLOAT_MARKER" ",LOG_FLOAT(correlation)); + //nrf_delay_ms(10); + LOG_PRINT(",trust_flag = "LOG_FLOAT_MARKER" ",LOG_FLOAT(trust_flag)); + //nrf_delay_ms(10); + LOG_PRINT(", SignalPeriodicity = "LOG_FLOAT_MARKER" ",LOG_FLOAT(SignalPeriodicity)); + //nrf_delay_ms(10); + LOG_PRINT(",MEMS_RMS = "LOG_FLOAT_MARKER" ",LOG_FLOAT(MEMS_RMS)); + //nrf_delay_ms(10); + LOG_PRINT(",reason = %d \n",no_value_reason); + + } + +// float new_spo2=mySpO2; + + + #if defined(Optimize_SPO2_flow) + //time_accu=time_accu+time; + LOG_PRINT("time_accu = %d\n",time_accu); + if(time_accu>=31000) + { + spo2_array[count]=mySpO2; + count=count+1; + + LOG_PRINT("Over_30_sec_Stop_measurement\n"); + LOG_PRINT("This_meausrement_suggest_spo2_value is"); + + bubblesort(spo2_array,count); + + if(count % 2 == 0) + { + //LOG_PRINT(" "LOG_FLOAT_MARKER" \n", LOG_FLOAT(spo2_array[count/2])); + LOG_PRINT(" "LOG_FLOAT_MARKER" \n",LOG_FLOAT((spo2_array[(int)(count/2)] + spo2_array[(int)(count/2) - 1]) / 2.0f)); + } + else + { + LOG_PRINT(" "LOG_FLOAT_MARKER"\n", LOG_FLOAT(spo2_array[(int)(count/2)]*1.0f)); + } + count=0; + nrf_delay_ms(50); + //add sensor stop here + SpO2_Close(); + PxiAlg_Close(); + free(pBuffer); + free(_spo2_state.hr_pBuffer); + //NRF_LOG_FLUSH(); + return; + + } + else + { + if(mySpO2>0) + { + spo2_array[count]=mySpO2; + count=count+1; + } + + } + #endif + } + else + { + + switch (ret_value) + { + case SPO2_MSG_ALG_NOT_OPEN: + LOG_PRINT("Algorithm is not initialized. \n"); + break; + + case SPO2_MSG_ALG_REOPEN: + LOG_PRINT("Algorithm is re initialized. \n"); + break; + + case SPO2_MSG_ALG_NOT_SUPPORT: + LOG_PRINT("Algorithm is not support. \n"); + break; + case SPO2_MSG_SUCCESS: + //LOG_PRINT("Algorithm is SUCCESS. \n"); + break; + default: + LOG_PRINT("Algorithm unhandle error = %d \n", ret_value); + break; + } + } + + + + nrf_delay_ms(40); + } + + LOG_PRINT("Out of memory. \n"); + nrf_delay_ms(10); + SpO2_Close(); + PxiAlg_Close(); + free(pBuffer); + free(_spo2_state.hr_pBuffer); + return; +} diff --git a/code/sdk/zhihui/drivers/ppg/pah8009/algorithm/pah_stress/V6033/pxialg_hrv.h b/code/sdk/zhihui/drivers/ppg/pah8009/algorithm/pah_stress/V6033/pxialg_hrv.h new file mode 100644 index 000000000..0e2a0079a --- /dev/null +++ b/code/sdk/zhihui/drivers/ppg/pah8009/algorithm/pah_stress/V6033/pxialg_hrv.h @@ -0,0 +1,72 @@ +#ifndef _PXIALG_HRV_ +#define _PXIALG_HRV_ +#include "stdint.h" + +typedef struct +{ + void *pBuffer; + float collect_duration; + uint8_t has_got_sdnn; +} hrv_state_s; + + + +#if defined(WIN32) && !defined(PXIALG_STATIC_LIB) +# ifdef PXIALG_EXPORTS +# define PXIALG_API __declspec(dllexport) +# else +# define PXIALG_API __declspec(dllimport) +# endif +#else +# define PXIALG_API +#endif // WIN32 + + +#ifdef __cplusplus +extern "C" +{ +#endif + PXIALG_API int HRVReset(void); + PXIALG_API int HRVGetMemorySize(int enable_lhr, int test_seconds, int sampling_rate); + PXIALG_API int HRVOpen(void *p_buffer); + PXIALG_API int HRVProcess(int data_ready, float data); + PXIALG_API int HRVProcessD(int data_ready, uint32_t data); + PXIALG_API int HRVClose(void); + + PXIALG_API int HRVGetVersion(void); + PXIALG_API float HRVGetSDNN(void); + PXIALG_API int HRVGetSDNNLevel(int m_iAge, float dSDNN); + PXIALG_API float HRVGetLHRatio(float *nlf, float *nhf); + PXIALG_API float HRVGetRMSSD(void); + PXIALG_API int HRVGetSleepQuality(int age); + PXIALG_API int HRVGetOnlineRRIReportFlag(void); + PXIALG_API float HRVGetOnlineRRI(void); + PXIALG_API int HRVGetRawRRINum(void); + PXIALG_API float * HRVGetRawRRIBuf(void); + PXIALG_API float HRVGetNoiseRate(void); + PXIALG_API float HRVGetRRIStability(void); + PXIALG_API float HRVGetRRIQuality(void); + PXIALG_API int HRVGetReadyFlag(void); + PXIALG_API int HRVGetMotionFlag(void); + PXIALG_API int HRVGetAnomalyFlag(void); + PXIALG_API int HRVGetHRAvg(void); + + PXIALG_API void HRVSetSkipCounterTh(int SkipCounterTh); + PXIALG_API void HRVSetFreqOffset(float FreqOffset); + PXIALG_API void HRVSetDiffTime(float DiffTime, int SampleNum); + PXIALG_API void HRVSetPeakProcessReadyCounterTh(int PeakProcessReady3Counter_Th0, + int PeakProcessReady3Counter_Th1, + int PeakProcessReady3Counter_Th2, + int PeakProcessReady3Counter_Th3, + int m_PeakProcessReady3Counter_HeartRate_Th1, + int m_PeakProcessReady3Counter_HeartRate_Th2, + int m_PeakProcessReady3Counter_HeartRate_Th3); + + PXIALG_API float HRVGetStress(int grade); + +#ifdef __cplusplus +} +#endif + +#endif /* _PXIALG_HRV_ */ + diff --git a/code/sdk/zhihui/drivers/ppg/pah8009/factory/pah8009_factory_reg.h b/code/sdk/zhihui/drivers/ppg/pah8009/factory/pah8009_factory_reg.h new file mode 100644 index 000000000..af20cbf7a --- /dev/null +++ b/code/sdk/zhihui/drivers/ppg/pah8009/factory/pah8009_factory_reg.h @@ -0,0 +1,94 @@ +#ifndef __pah8009_factory_reg_h__ +#define __pah8009_factory_reg_h__ + +// pah +#include "pah800x_factory_test.h" + + +static const uint8_t PAH_800x_REG_DEVICE_INIT_FACTORY[][2] = { +// { 0xEE,0x07 }, //SW RESET + { 0xE8,0x00 },//Close suspend + { 0xD1,0xD0 },//{R_GPIO_0_IEB, R_GPIO_1_IEB, R_GPIO_0_OEB, R_GPIO_1_OEB, R_GPIO_0_PULLL_EnH, R_GPIO_1_PULLL_EnH, R_GPIO_0_PULLH_EnH, R_GPIO_1_PULLH_EnH}; + { 0xD2,0x00 },//R_GPIO_0_Open_Drain_EnH(0xD2[5]), 1(0x20):GPIO default open-drain mode, 0(0x00):GPIO debug mode + { 0xD3,0x20 },//GPIO debug select +// { 0xD6,0x30 },//{Dummy, R_I2C_SLEW, R_I2C_DRV[1:0], Dummy[3:0]} +// { 0xD5,0x44 },//IO-level(I2C), 44:3.3V, 00:1.8V +// { 0xB2,0x25 }, + { 0x55,0x24 },//Soft Reset:04 Hard Reset:24 + { 0x52,0x12 },//VDDAY=1.63V +// { 0xA6,0xF7 },//Cmd_vdday_pwrsv_sel_EnH=0 + { 0xAE,0x3F },//R_LPO_Cali_mode=1 +}; + +static const uint8_t PAH_800x_REG_BRIGHTNESS_TEST_FACTORY[][2] = { + { 0x03,0x40 },//Golden report period[7:0] (1T=31.25us) + { 0x04,0x06 },//Golden report period[15:8] + { 0x05,0x00 },//Golden report period[19:16] + { 0x08,0x00 },//A period + { 0x09,0x08 },//A period + { 0x0A,0x00 },//B period + { 0x0B,0x08 },//B period + { 0x0C,0x00 },//C period + { 0x0D,0x08 },//C period + { 0x0E,0x01 },//RDB_FrameNum_A[6:0] + { 0x0F,0x01 },//RDB_FrameNum_B[6:0] + { 0x10,0x01 },//RDB_FrameNum_C[6:0] + { 0x11,0x77 },//{R_OnOff_mode_C_EnH, R_OnOff_mode_B_EnH, R_OnOff_mode_A_EnH, R_ChC_EnH, R_ChB_EnH, R_ChA_EnH} + { 0x14,0x52 },//{RDB_ChA_congain_sel[1:0], Dummy[0], R_LEDDAC_code0[4:0]} + { 0x15,0x44 },//{RDB_ChB_congain_sel[1:0], Dummy[0], R_LEDDAC_code1[4:0]} + { 0x16,0x44 },//{RDB_ChC_congain_sel[1:0], Dummy[0], R_LEDDAC_code2[4:0]} + { 0x17,0x00 },//RDB_expo_A[7:0] + { 0x18,0x01 },//RDB_expo_A[15:8] + { 0x19,0x00 },//RDB_expo_B[7:0] + { 0x1A,0x01 },//RDB_expo_B[15:8] + { 0x1B,0x00 },//RDB_expo_C[7:0] + { 0x1C,0x01 },//RDB_expo_C[15:8] + { 0x1D,0x2F },//{R_ChA_LED_EnH[2:0], R_ChA_Pixel_EnH[3:0]}, [3]:pixel3, [2]:pixel2, [1]:pixel1, [0]:pixel0, enable high + { 0x1E,0x4F },//{R_ChB_LED_EnH[2:0], R_ChB_Pixel_EnH[3:0]}, [3]:pixel3, [2]:pixel2, [1]:pixel1, [0]:pixel0, enable high + { 0x1F,0x1F },//{R_ChC_LED_EnH[2:0], R_ChC_Pixel_EnH[3:0]}, [3]:pixel3, [2]:pixel2, [1]:pixel1, [0]:pixel0, enable high + { 0x22,0xF7 },//RDB_Int_En[7:0], [2]:touch flag [1]:overflow [0]:data ready + { 0x26,0x2A },//{R_ADCdata_C_Sel[1:0], R_ADCdata_B_Sel[1:0], R_ADCdata_A_Sel[1:0]}, 0:on, 1:off(需開On-Off), 2:on-off(需開On-Off) + { 0xEB,0x80 },//update_flag +// { 0x20,0xF7 },//Clear INT +}; + +static const uint8_t PAH_800x_REG_LEAK_LIGHT_TEST_FACTORY[][2] = { + { 0x03,0x40 },//Golden report period[7:0] (1T=31.25us) + { 0x04,0x06 },//Golden report period[15:8] + { 0x05,0x00 },//Golden report period[19:16] + { 0x08,0x00 },//A period + { 0x09,0x08 },//A period + { 0x0A,0x00 },//B period + { 0x0B,0x08 },//B period + { 0x0C,0x00 },//C period + { 0x0D,0x08 },//C period + { 0x0E,0x01 },//RDB_FrameNum_A[6:0] + { 0x0F,0x01 },//RDB_FrameNum_B[6:0] + { 0x10,0x01 },//RDB_FrameNum_C[6:0] + { 0x11,0x77 },//{R_OnOff_mode_C_EnH, R_OnOff_mode_B_EnH, R_OnOff_mode_A_EnH, R_ChC_EnH, R_ChB_EnH, R_ChA_EnH} + { 0x14,0x12 },//{RDB_ChA_congain_sel[1:0], Dummy[0], R_LEDDAC_code0[4:0]} + { 0x15,0x0A },//{RDB_ChB_congain_sel[1:0], Dummy[0], R_LEDDAC_code1[4:0]} + { 0x16,0x8A },//{RDB_ChC_congain_sel[1:0], Dummy[0], R_LEDDAC_code2[4:0]} + { 0x17,0x00 },//RDB_expo_A[7:0] + { 0x18,0x02 },//RDB_expo_A[15:8] + { 0x19,0x00 },//RDB_expo_B[7:0] + { 0x1A,0x02 },//RDB_expo_B[15:8] + { 0x1B,0x20 },//RDB_expo_C[7:0] + { 0x1C,0x00 },//RDB_expo_C[15:8] + { 0x1D,0x2F },//{R_ChA_LED_EnH[2:0], R_ChA_Pixel_EnH[3:0]}, [3]:pixel3, [2]:pixel2, [1]:pixel1, [0]:pixel0, enable high + { 0x1E,0x4F },//{R_ChB_LED_EnH[2:0], R_ChB_Pixel_EnH[3:0]}, [3]:pixel3, [2]:pixel2, [1]:pixel1, [0]:pixel0, enable high + { 0x1F,0x1F },//{R_ChC_LED_EnH[2:0], R_ChC_Pixel_EnH[3:0]}, [3]:pixel3, [2]:pixel2, [1]:pixel1, [0]:pixel0, enable high + { 0x22,0xF7 },//RDB_Int_En[7:0], [2]:touch flag [1]:overflow [0]:data ready + { 0x26,0x2A },//{R_ADCdata_C_Sel[1:0], R_ADCdata_B_Sel[1:0], R_ADCdata_A_Sel[1:0]}, 0:on, 1:off(需開On-Off), 2:on-off(需開On-Off) + { 0xEB,0x80 },//update_flag +// { 0x20,0xF7 },//Clear INT +}; + + +//============================================================================ +// Public function +//============================================================================ +void factory_test_mode(factory_test_type test_type, bool expo_adjust_en, uint16_t expo_a, uint16_t expo_b, uint16_t expo_c); + + +#endif // header guard diff --git a/code/sdk/zhihui/drivers/ppg/pah8009/factory/pah800x_factory_test.c b/code/sdk/zhihui/drivers/ppg/pah8009/factory/pah800x_factory_test.c new file mode 100644 index 000000000..d4cd39c3c --- /dev/null +++ b/code/sdk/zhihui/drivers/ppg/pah8009/factory/pah800x_factory_test.c @@ -0,0 +1,556 @@ +// pah +#include "pah800x_factory_test.h" +#include "pah8009_factory_reg.h" + +static uint16_t factory_test_ch[3] = {0}; + +//============================================================================ +// Static Global Variable +//============================================================================ +static pah_800x_test_t _factory_state; +static pah_verify_config_t g_config_table[test_type_num] = +{ + //factory_tesst_num=0 + { + .ch_spec[0] = + { + .verify_enabled = BRIGHTNESS_GLODEN_CHA_ENABLE, + .min_enabled = BRIGHTNESS_GLODEN_CHA_MIN_ENABLE, .max_enabled = BRIGHTNESS_GLODEN_CHA_MAX_ENABLE, + .min = BRIGHTNESS_GLODEN_CHA_MIN, .max = BRIGHTNESS_GLODEN_CHA_MAX + }, + .ch_spec[1] = + { + .verify_enabled = BRIGHTNESS_GLODEN_CHB_ENABLE, + .min_enabled = BRIGHTNESS_GLODEN_CHB_MIN_ENABLE, .max_enabled = BRIGHTNESS_GLODEN_CHB_MAX_ENABLE, + .min = BRIGHTNESS_GLODEN_CHB_MIN, .max = BRIGHTNESS_GLODEN_CHB_MAX + }, + .ch_spec[2] = + { + .verify_enabled = BRIGHTNESS_GLODEN_CHC_ENABLE, + .min_enabled = BRIGHTNESS_GLODEN_CHC_MIN_ENABLE, .max_enabled = BRIGHTNESS_GLODEN_CHC_MAX_ENABLE, + .min = BRIGHTNESS_GLODEN_CHC_MIN, .max = BRIGHTNESS_GLODEN_CHC_MAX + }, + .test_regs = + { + .init_reg_arr = + { + .reg_arr = (pah_reg*)PAH_800x_REG_DEVICE_INIT_FACTORY, + .reg_arr_len = PAH_ARRAY_SIZE(PAH_800x_REG_DEVICE_INIT_FACTORY) + }, + .test_reg_arr = + { + .reg_arr = (pah_reg*)PAH_800x_REG_BRIGHTNESS_TEST_FACTORY, + .reg_arr_len = PAH_ARRAY_SIZE(PAH_800x_REG_BRIGHTNESS_TEST_FACTORY) + } + } + }, + + //factory_tesst_num=1 + { + .ch_spec[0] = + { + .verify_enabled = BRIGHTNESS_TARGET_CHA_ENABLE, + .min_enabled = BRIGHTNESS_TARGET_CHA_MIN_ENABLE, .max_enabled = BRIGHTNESS_TARGET_CHA_MAX_ENABLE, + .min = BRIGHTNESS_TARGET_CHA_MIN, .max = BRIGHTNESS_TARGET_CHA_MAX + }, + .ch_spec[1] = + { + .verify_enabled = BRIGHTNESS_TARGET_CHB_ENABLE, + .min_enabled = BRIGHTNESS_TARGET_CHB_MIN_ENABLE, .max_enabled = BRIGHTNESS_TARGET_CHB_MAX_ENABLE, + .min = BRIGHTNESS_TARGET_CHB_MIN, .max = BRIGHTNESS_TARGET_CHB_MAX + }, + .ch_spec[2] = + { + .verify_enabled = BRIGHTNESS_TARGET_CHC_ENABLE, + .min_enabled = BRIGHTNESS_TARGET_CHC_MIN_ENABLE, .max_enabled = BRIGHTNESS_TARGET_CHC_MAX_ENABLE, + .min = BRIGHTNESS_TARGET_CHC_MIN, .max = BRIGHTNESS_TARGET_CHC_MAX + }, + .test_regs = + { + .init_reg_arr = + { + .reg_arr = (pah_reg*)PAH_800x_REG_DEVICE_INIT_FACTORY, + .reg_arr_len = PAH_ARRAY_SIZE(PAH_800x_REG_DEVICE_INIT_FACTORY) + }, + .test_reg_arr = + { + .reg_arr = (pah_reg*)PAH_800x_REG_BRIGHTNESS_TEST_FACTORY, + .reg_arr_len = PAH_ARRAY_SIZE(PAH_800x_REG_BRIGHTNESS_TEST_FACTORY) + } + } + }, + + //factory_tesst_num=2 + { + .ch_spec[0] = + { + .verify_enabled = LEAK_LIGHT_TARGET_CHA_ENABLE, + .min_enabled = LEAK_LIGHT_TARGET_CHA_MIN_ENABLE, .max_enabled = LEAK_LIGHT_TARGET_CHA_MAX_ENABLE, + .min = LEAK_LIGHT_TARGET_CHA_MIN, .max = LEAK_LIGHT_TARGET_CHA_MAX + }, + .ch_spec[1] = + { + .verify_enabled = LEAK_LIGHT_TARGET_CHB_ENABLE, + .min_enabled = LEAK_LIGHT_TARGET_CHB_MIN_ENABLE, .max_enabled = LEAK_LIGHT_TARGET_CHB_MAX_ENABLE, + .min = LEAK_LIGHT_TARGET_CHB_MIN, .max = LEAK_LIGHT_TARGET_CHB_MAX + }, + .ch_spec[2] = + { + .verify_enabled = LEAK_LIGHT_TARGET_CHC_ENABLE, + .min_enabled = LEAK_LIGHT_TARGET_CHC_MIN_ENABLE, .max_enabled = LEAK_LIGHT_TARGET_CHC_MAX_ENABLE, + .min = LEAK_LIGHT_TARGET_CHC_MIN, .max = LEAK_LIGHT_TARGET_CHC_MAX + }, + .test_regs = + { + .init_reg_arr = + { + .reg_arr = (pah_reg*)PAH_800x_REG_DEVICE_INIT_FACTORY, + .reg_arr_len = PAH_ARRAY_SIZE(PAH_800x_REG_DEVICE_INIT_FACTORY) + }, + .test_reg_arr = + { + .reg_arr = (pah_reg*)PAH_800x_REG_LEAK_LIGHT_TEST_FACTORY, + .reg_arr_len = PAH_ARRAY_SIZE(PAH_800x_REG_LEAK_LIGHT_TEST_FACTORY) + } + } + }, + + //factory_tesst_num=3 + { + .test_regs = + { + .init_reg_arr = + { + .reg_arr = (pah_reg*)PAH_800x_REG_DEVICE_INIT_FACTORY, + .reg_arr_len = PAH_ARRAY_SIZE(PAH_800x_REG_DEVICE_INIT_FACTORY) + }, + .test_reg_arr = + { + .reg_arr = (pah_reg*)PAH_800x_REG_LEAK_LIGHT_TEST_FACTORY, + .reg_arr_len = PAH_ARRAY_SIZE(PAH_800x_REG_LEAK_LIGHT_TEST_FACTORY) + } + } + } + +}; + +//============================================================================ +// Private function +//============================================================================ +static void pah_sensor_factory_mode_init(factory_test_type test_type, bool expo_adjust_en, uint16_t expo_a, uint16_t expo_b, uint16_t expo_c); +static void pah_sensor_factory_mode_start(void); +static void pah_sensor_factory_mode_stop(void); +static void pah_sensor_factory_mode_task(void); +static void pah_sensor_factory_mode_verify_result(void); + +static pah_ret _pah_800x_hal_comm_write(uint8_t addr, const uint8_t *data, size_t write_size); +static pah_ret _pah_800x_hal_comm_read(uint8_t addr, uint8_t *data, size_t read_size); +static pah_ret _comm_write(uint8_t addr, uint8_t data); + +static pah_ret _pah_800x_hal_write_reg_arr(const pah_reg_arr *reg_arr); +static pah_ret _pah_800x_hal_write_reg_array(const uint8_t reg_array[][2], size_t length); +static pah_ret _pah_800x_hal_write_suspend_state(bool suspend); +static pah_ret _pah_800x_hal_write_interrupt_clear(void); +static pah_ret _pah_800x_hal_write_ch_exposure(uint16_t expo_a, uint16_t expo_b, uint16_t expo_c, uint8_t ch_num); +static pah_ret _pah_800x_hal_tg_toggle(bool enable); +static pah_ret _pah_800x_hal_update_flag(void); + +static pah_ret _pah_800x_hal_read_product_id(uint16_t *product_id); +static pah_ret _pah_800x_hal_read_ppg_interrupt(uint8_t *ppg_interrupt); +static pah_ret _pah_800x_hal_read_ppg_overflow(uint8_t *ppg_overflow, uint8_t *overflow_num); +static pah_ret _pah_800x_hal_read_ppg_adc(uint16_t *ppg_adc, uint8_t ch_num); +static pah_ret _pah_800x_hal_check_enable_channel(pah_800x_test_t *factory_state, const pah_reg_arr *reg_arr); + + +//============================================================================ +// Public function +//============================================================================ +void factory_test_mode(factory_test_type test_type, bool expo_adjust_en, uint16_t expo_a, uint16_t expo_b, uint16_t expo_c) +{ + LOG_PRINT("test_type=%d\n{\n factory_test_brightness_golden_sample=0\n " \ + "factory_test_brightness_target_sample=1\n factory_test_leak_light_target_sample=2\n " \ + "factory_test_power_noise=3\n factory_test_INT_high=4\n factory_test_INT_low=5\n}\n", test_type); + + pah_sensor_factory_mode_init(test_type, expo_adjust_en, expo_a, expo_b, expo_c); + + pah_sensor_factory_mode_start(); + + pah_delay_ms(25); + + if (test_type < factory_test_power_noise) + { + pah_sensor_factory_mode_task(); + pah_sensor_factory_mode_verify_result(); + pah_sensor_factory_mode_stop(); + } + else + { + return; + } + + pah_delay_ms(500); + + return; + +} + + +//============================================================================ +// Private function +//============================================================================ +static void pah_sensor_factory_mode_init(factory_test_type test_type, bool expo_adjust_en, uint16_t expo_a, uint16_t expo_b, uint16_t expo_c) +{ + DEBUG_PRINT("%s(%d)\n", __func__, test_type); + + memset(&_factory_state, 0, sizeof(_factory_state)); + + uint16_t product_id = 0; + _pah_800x_hal_read_product_id(&product_id); + DEBUG_PRINT("product_id = 0x%04X\n", product_id); + if (product_id != PAH_800x_PRODUCT_ID) + { + DEBUG_PRINT("Failed to verify product_id\n"); + } +/**/ + for (int ch_index=0; ch_index<3; ch_index++) + { + _factory_state.verify_config.ch_spec[ch_index] = g_config_table[test_type].ch_spec[ch_index]; + } + + _factory_state.verify_config.test_regs = g_config_table[test_type].test_regs; + _pah_800x_hal_write_reg_arr(&_factory_state.verify_config.test_regs.init_reg_arr); + _pah_800x_hal_write_reg_arr(&_factory_state.verify_config.test_regs.test_reg_arr); + _pah_800x_hal_check_enable_channel(&_factory_state, &_factory_state.verify_config.test_regs.test_reg_arr); +/**/ + if (expo_adjust_en) + { + for(uint8_t ch_num=0; ch_num 0); + if (has_ppg_interrupt > 0) + { + for (uint8_t ch_num=0; ch_num < PAH_800x_MAX_CH_NUM; ch_num++) + { + if (_factory_state.test_ch_enabled[ch_num]) + { + _pah_800x_hal_read_ppg_adc(&_factory_state.test_result.adc[ch_num], ch_num); + } + } + } + + //clear_interrupt(state, has_ppg_interrupt, state->ppg_result.has_overflow); + +} + +static void pah_sensor_factory_mode_verify_result(void) +{ + DEBUG_PRINT("%s\n", __func__); + LOG_PRINT("=============== Verify_Result ===============\n" \ + "{\n result=1 : pass\n result=0 : fail\n}\n"); + + for (int i=0; i _factory_state.verify_config.ch_spec[i].max) + { + _factory_state.verify_result.ch_result[i].is_passed = false; + } + else + { + _factory_state.verify_result.ch_result[i].is_passed = true; + } + printf("ch[%d] : (min, value, max)=(%d, %d, %d), result=%d \n",\ + i, _factory_state.verify_config.ch_spec[i].min, \ + _factory_state.test_result.adc[i], \ + _factory_state.verify_config.ch_spec[i].max, \ + _factory_state.verify_result.ch_result[i].is_passed); + } + else if (_factory_state.verify_config.ch_spec[i].verify_enabled + && _factory_state.verify_config.ch_spec[i].min_enabled) + { + if (_factory_state.test_result.adc[i] < _factory_state.verify_config.ch_spec[i].min) + { + _factory_state.verify_result.ch_result[i].is_passed = false; + } + else + { + _factory_state.verify_result.ch_result[i].is_passed = true; + } + printf("ch[%d] : (min, value)=(%d, %d), result=%d \n",\ + i, _factory_state.verify_config.ch_spec[i].min, \ + _factory_state.test_result.adc[i], \ + _factory_state.verify_result.ch_result[i].is_passed); + } + else if (_factory_state.verify_config.ch_spec[i].verify_enabled + && _factory_state.verify_config.ch_spec[i].max_enabled) + { + if (_factory_state.test_result.adc[i] > _factory_state.verify_config.ch_spec[i].max) + { + _factory_state.verify_result.ch_result[i].is_passed = false; + } + else + { + _factory_state.verify_result.ch_result[i].is_passed = true; + } + + factory_test_ch[i] = _factory_state.test_result.adc[i]; + + printf("ch[%d] : (value, max)=(%d, %d), result=%d \n",\ + i, _factory_state.test_result.adc[i], \ + _factory_state.verify_config.ch_spec[i].max, \ + _factory_state.verify_result.ch_result[i].is_passed); + } + } +} + + +//============================================================================ +// Private function (HAL) +//============================================================================ +static pah_ret _pah_800x_hal_comm_write(uint8_t addr, const uint8_t *data, size_t write_size) +{ + //return plat->comm.write(&plat->comm, addr, data, write_size); + //return plat->comm.write(addr, data, write_size); + return pah_comm_i2c_write(addr, data, write_size); +} + +static pah_ret _pah_800x_hal_comm_read(uint8_t addr, uint8_t *data, size_t read_size) +{ + + //return plat->comm.read(&plat->comm, addr, data, read_size); + return pah_comm_i2c_read(addr, data, read_size); +} + +static pah_ret _comm_write(uint8_t addr, uint8_t data) +{ + //return pah_800x_hal_comm_write( addr, &data, 1); + return _pah_800x_hal_comm_write(addr, &data, 1); +} +#define _comm_read(addr, data) _pah_800x_hal_comm_read(addr, data, 1) +#define _comm_burst_read(addr, data, read_size) _pah_800x_hal_comm_read(addr, data, read_size) + + +static pah_ret _pah_800x_hal_write_reg_arr(const pah_reg_arr *reg_arr) +{ + return _pah_800x_hal_write_reg_array(reg_arr->reg_arr, reg_arr->reg_arr_len); +} + +static pah_ret _pah_800x_hal_write_reg_array(const uint8_t reg_array[][2], size_t length) +{ + size_t i = 0; + uint8_t reg_value = 0; + for (i = 0; i < length; ++i) + { + //for trim bit + if(reg_array[i][0] == 0x14) + { + _comm_read(0x14, ®_value); + reg_value = (reg_value & 0x1F) | (reg_array[i][1] & 0xE0); + _comm_write(reg_array[i][0], reg_value); + } + else + _comm_write(reg_array[i][0], reg_array[i][1]); + } + return PAH_RET_SUCCESS; +} + +static pah_ret _pah_800x_hal_write_suspend_state(bool suspend) +{ + uint8_t data = 0; + DEBUG_PRINT("%s(%d)\n", __func__, suspend); + if (suspend) + { + _comm_read(PAH_800x_ADDR_E8, &data); + PAH_SET_BIT(data, PAH_800x_ADDR_E8_CMD_SUSPEND_MODE_BIT); + _comm_write(PAH_800x_ADDR_E8, data); + } + else + { + _comm_read(PAH_800x_ADDR_E8, &data); + PAH_CLEAR_BIT(data, PAH_800x_ADDR_E8_CMD_SUSPEND_MODE_BIT); + _comm_write(PAH_800x_ADDR_E8, data); + + } + DEBUG_PRINT("%s(%d) end\n", __func__, suspend); + + return PAH_RET_SUCCESS; +} + +static pah_ret _pah_800x_hal_write_interrupt_clear(void) +{ + uint8_t data = 0; + // DR interrupt + _comm_read(PAH_800x_ADDR_20, &data); + //PAH_CLEAR_BIT(data, PAH_800x_ADDR_20_BIT_DR_FLAG); + _comm_write(PAH_800x_ADDR_20, (data|0x04)); //SD-revise-20191205 + return PAH_RET_SUCCESS; +} + +static pah_ret _pah_800x_hal_write_ch_exposure(uint16_t expo_a, uint16_t expo_b, uint16_t expo_c, uint8_t ch_num) +{ + //uint8_t data = 0; + DEBUG_PRINT("%s(%d, %d, %d, %d)\n", __func__, expo_a, expo_b, expo_c, ch_num); + + uint8_t a_exposure_low = PAH_UINT16_LOW(expo_a); + uint8_t a_exposure_high = PAH_UINT16_HIGH(expo_a); + uint8_t b_exposure_low = PAH_UINT16_LOW(expo_b); + uint8_t b_exposure_high = PAH_UINT16_HIGH(expo_b); + uint8_t c_exposure_low = PAH_UINT16_LOW(expo_c); + uint8_t c_exposure_high = PAH_UINT16_HIGH(expo_c); + + if(ch_num == PAH_800x_CH_NUM_A) + { + _comm_write(PAH_800x_ADDR_17, a_exposure_low); + _comm_write(PAH_800x_ADDR_18, a_exposure_high); + } + else if(ch_num == PAH_800x_CH_NUM_B) + { + _comm_write(PAH_800x_ADDR_19, b_exposure_low); + _comm_write(PAH_800x_ADDR_1A, b_exposure_high); + } + else if(ch_num == PAH_800x_CH_NUM_C) + { + _comm_write(PAH_800x_ADDR_1B, c_exposure_low); + _comm_write(PAH_800x_ADDR_1C, c_exposure_high); + } + + return PAH_RET_SUCCESS; +} + +static pah_ret _pah_800x_hal_tg_toggle(bool enable) +{ + uint8_t data = 0; + DEBUG_PRINT("%s(%d)\n", __func__, enable); + _comm_read( PAH_800x_ADDR_07_TG, &data); + if(enable) + PAH_SET_BIT(data, PAH_800x_ADDR_07_TG_BIT_EN); + else + PAH_CLEAR_BIT(data, PAH_800x_ADDR_07_TG_BIT_EN); + _comm_write(PAH_800x_ADDR_07_TG, data); + + return PAH_RET_SUCCESS; +} + +static pah_ret _pah_800x_hal_update_flag(void) +{ + _comm_write(PAH_800x_ADDR_EB, PAH_800x_ADDR_E8_UPDATE_FLAG); + + return PAH_RET_SUCCESS; +} + +static pah_ret _pah_800x_hal_read_product_id(uint16_t *product_id) +{ + return _comm_burst_read(PAH_800x_ADDR_00_PRODUCT_ID, (uint8_t *)product_id,2); +} + +static pah_ret _pah_800x_hal_read_ppg_interrupt(uint8_t *ppg_interrupt) +{ + uint8_t data = 0; + _comm_read(PAH_800x_ADDR_20, &data); + if (ppg_interrupt) + *ppg_interrupt = PAH_CHECK_BIT(data, PAH_800x_ADDR_20_BIT_DR_FLAG); + + return PAH_RET_SUCCESS; +} + +static pah_ret _pah_800x_hal_read_ppg_overflow(uint8_t *ppg_overflow, uint8_t *overflow_num) +{ + uint8_t data = 0; + _comm_read( PAH_800x_ADDR_20, &data); + if (ppg_overflow) + { + *ppg_overflow = PAH_CHECK_BIT(data, PAH_800x_ADDR_20_BIT_OVERFLOW_FLAG); + *overflow_num = (data&0x70)>>4; + } + return PAH_RET_SUCCESS; +} + +static pah_ret _pah_800x_hal_read_ppg_adc(uint16_t *ppg_adc, uint8_t ch_num) +{ + uint16_t data = 0; + + if(ch_num == PAH_800x_CH_NUM_A) + _comm_burst_read(PAH_800x_ADDR_2E, (uint8_t*)&data, 2); + else if(ch_num == PAH_800x_CH_NUM_B) + _comm_burst_read(PAH_800x_ADDR_39, (uint8_t*)&data, 2); + else if(ch_num == PAH_800x_CH_NUM_C) + _comm_burst_read(PAH_800x_ADDR_44, (uint8_t*)&data, 2); + + //*ppg_adc = data >> 2; + *ppg_adc = data >> 2; + + return PAH_RET_SUCCESS; +} + +static pah_ret _pah_800x_hal_check_enable_channel(pah_800x_test_t *factory_state, const pah_reg_arr *reg_arr) +{ + for(int i=0;ireg_arr_len;i++) + { + if(reg_arr->reg_arr[i][0] == PAH_800x_ADDR_11_EnCh) + { + uint8_t data = reg_arr->reg_arr[i][1]; + factory_state->test_ch_enabled[0] = PAH_CHECK_BIT(data, 0); // CH A + factory_state->test_ch_enabled[1] = PAH_CHECK_BIT(data, 1); // CH B + factory_state->test_ch_enabled[2] = PAH_CHECK_BIT(data, 2); // CH C + } + } + + return PAH_RET_SUCCESS; +} + + +void pah8009_get_leaklight_data(uint16_t *ch0,uint16_t *ch1,uint16_t *ch2) +{ + *ch0 = factory_test_ch[0]; + *ch1 = factory_test_ch[1]; + *ch2 = factory_test_ch[2]; + + factory_test_ch[0] = 0; + factory_test_ch[1] = 0; + factory_test_ch[2] = 0; +} diff --git a/code/sdk/zhihui/drivers/ppg/pah8009/factory/pah800x_factory_test.h b/code/sdk/zhihui/drivers/ppg/pah8009/factory/pah800x_factory_test.h new file mode 100644 index 000000000..7519958b8 --- /dev/null +++ b/code/sdk/zhihui/drivers/ppg/pah8009/factory/pah800x_factory_test.h @@ -0,0 +1,160 @@ +#ifndef __pah800x_factory_test_h__ +#define __pah800x_factory_test_h__ + +// pah +//#include "pah_800x.h" +#include "pah_unit.h" +#include "pah_800x_config.h" + + +//============================================================================ +// Definition +//============================================================================ + +/*---------Brightness Test Golden Option---------*/ +#define BRIGHTNESS_GLODEN_CHA_ENABLE true +#define BRIGHTNESS_GLODEN_CHA_MIN_ENABLE true +#define BRIGHTNESS_GLODEN_CHA_MAX_ENABLE true +#define BRIGHTNESS_GLODEN_CHA_MIN 7600 +#define BRIGHTNESS_GLODEN_CHA_MAX 8400 +#define BRIGHTNESS_GLODEN_CHB_ENABLE true +#define BRIGHTNESS_GLODEN_CHB_MIN_ENABLE true +#define BRIGHTNESS_GLODEN_CHB_MAX_ENABLE true +#define BRIGHTNESS_GLODEN_CHB_MIN 7600 +#define BRIGHTNESS_GLODEN_CHB_MAX 8400 +#define BRIGHTNESS_GLODEN_CHC_ENABLE true +#define BRIGHTNESS_GLODEN_CHC_MIN_ENABLE true +#define BRIGHTNESS_GLODEN_CHC_MAX_ENABLE true +#define BRIGHTNESS_GLODEN_CHC_MIN 7600 +#define BRIGHTNESS_GLODEN_CHC_MAX 8400 + +/*---------Brightness Test Target Option---------*/ +#define BRIGHTNESS_TARGET_CHA_ENABLE true +#define BRIGHTNESS_TARGET_CHA_MIN_ENABLE true +#define BRIGHTNESS_TARGET_CHA_MAX_ENABLE true +#define BRIGHTNESS_TARGET_CHA_MIN 2400 +#define BRIGHTNESS_TARGET_CHA_MAX 15200 +#define BRIGHTNESS_TARGET_CHB_ENABLE true +#define BRIGHTNESS_TARGET_CHB_MIN_ENABLE true +#define BRIGHTNESS_TARGET_CHB_MAX_ENABLE true +#define BRIGHTNESS_TARGET_CHB_MIN 2400 +#define BRIGHTNESS_TARGET_CHB_MAX 15200 +#define BRIGHTNESS_TARGET_CHC_ENABLE true +#define BRIGHTNESS_TARGET_CHC_MIN_ENABLE true +#define BRIGHTNESS_TARGET_CHC_MAX_ENABLE true +#define BRIGHTNESS_TARGET_CHC_MIN 4000 +#define BRIGHTNESS_TARGET_CHC_MAX 12000 + +/*---------Brightness Test Target Option---------*/ +#define LEAK_LIGHT_TARGET_CHA_ENABLE true +#define LEAK_LIGHT_TARGET_CHA_MIN_ENABLE false +#define LEAK_LIGHT_TARGET_CHA_MAX_ENABLE true +#define LEAK_LIGHT_TARGET_CHA_MIN 0 +#define LEAK_LIGHT_TARGET_CHA_MAX 160 +#define LEAK_LIGHT_TARGET_CHB_ENABLE true +#define LEAK_LIGHT_TARGET_CHB_MIN_ENABLE false +#define LEAK_LIGHT_TARGET_CHB_MAX_ENABLE true +#define LEAK_LIGHT_TARGET_CHB_MIN 0 +#define LEAK_LIGHT_TARGET_CHB_MAX 160 +#define LEAK_LIGHT_TARGET_CHC_ENABLE true +#define LEAK_LIGHT_TARGET_CHC_MIN_ENABLE false +#define LEAK_LIGHT_TARGET_CHC_MAX_ENABLE true +#define LEAK_LIGHT_TARGET_CHC_MIN 0 +#define LEAK_LIGHT_TARGET_CHC_MAX 160 + + +//============================================================================ +// Type Definition +//============================================================================ +typedef enum +{ + factory_test_brightness_golden_sample, + factory_test_brightness_target_sample, + factory_test_leak_light_target_sample, + factory_test_power_noise, + factory_test_INT_high, + factory_test_INT_low, + test_type_num, + +} factory_test_type; + +typedef struct +{ + bool verify_enabled; + + bool min_enabled; + bool max_enabled; + + uint16_t min; + uint16_t max; + +} pah_ch_verify_spec_t; + +typedef struct +{ + pah_reg_arr init_reg_arr; + pah_reg_arr test_reg_arr; + +} pah_verify_reg_t; + +typedef struct +{ + pah_ch_verify_spec_t ch_spec[PAH_800x_MAX_CH_NUM]; + + pah_verify_reg_t test_regs; + +} pah_verify_config_t; + +typedef struct +{ + bool has_data; + + // Avaiable only if has_data is true + bool has_overflow; + + uint8_t overflow_num; + + // Avaiable only if has_data is true + uint16_t exposure_time[PAH_800x_MAX_CH_NUM]; + uint16_t adc[PAH_800x_MAX_CH_NUM]; + +} pah_test_result_t; + +typedef struct +{ + uint16_t adc; + + bool is_passed; + +} pah_ch_verify_result_t; + +typedef struct +{ + pah_ch_verify_result_t ch_result[PAH_800x_MAX_CH_NUM]; + +} pah_verify_result_t; + +typedef struct +{ + // Config + //pah_plat plat; + pah_verify_config_t verify_config; + + bool test_ch_enabled[PAH_800x_MAX_CH_NUM]; + + // PPG state + pah_test_result_t test_result; + + // verify + pah_verify_result_t verify_result; + +} pah_800x_test_t; + + +//============================================================================ +// Public function +//============================================================================ +void factory_test_mode(factory_test_type test_type, bool expo_adjust_en, uint16_t expo_a, uint16_t expo_b, uint16_t expo_c); +void pah8009_get_leaklight_data(uint16_t *ch0,uint16_t *ch1,uint16_t *ch2); + +#endif // header guard diff --git a/code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah800x_bsp.c b/code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah800x_bsp.c new file mode 100644 index 000000000..b7c25d5bd --- /dev/null +++ b/code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah800x_bsp.c @@ -0,0 +1,95 @@ +/* + * @Author: penglei 1624952103@qq.com + * @Date: 2025-05-27 11:09:04 + * @LastEditors: penglei 1624952103@qq.com + * @LastEditTime: 2025-07-28 16:43:06 + * @FilePath: /sdk615/code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah800x_bsp.c + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ +// pah +#include "pah800x_bsp.h" +#include "custom_utils.h" +#include "systick.h" + +#ifdef SUPPORT_CYWEE_SERVICE +#include "cywee_hal.h" +#endif + +//============================================================================ +// Definition +//============================================================================ +#define PAH800xx_I2C_SLAVE_ID 0x40 +#define I2C_PPG_PORT_ID 1 +#define PAH800xx_I2C_BUS I2C_BUS_2 + +//============================================================================ +// Public function +//============================================================================ +void pah_delay_ms(uint32_t ms) +{ + // pxi_nrf_delay_ms(ms); + LOS_Mdelay(ms); +} + +uint64_t pah_get_tick_count(void) +{ + // return pxi_nrf_get_tick_count(); + uint64_t cnt = uapi_systick_get_ms(); + // printf("cnt : %llu\n",cnt); + return cnt; +} + +pah_ret pah_comm_i2c_write(uint8_t addr, const uint8_t *data, size_t write_size) +{ + //DEBUG_PRINT("W A:0x%02x,D:0x%02x\n",addr,*data); + // pxi_nrf_i2c_write(addr, data, write_size); + custom_i2c_write_reg(PAH800xx_I2C_SLAVE_ID, addr, 1, data, write_size, PAH800xx_I2C_BUS); + + return PAH_RET_SUCCESS; +} + +pah_ret pah_comm_i2c_read(uint8_t addr, uint8_t *data, size_t read_size) +{ + // pxi_nrf_i2c_read(addr, data, read_size); + custom_i2c_read_regs(PAH800xx_I2C_SLAVE_ID, addr, 1 , data, read_size, PAH800xx_I2C_BUS); + //DEBUG_PRINT("R A:0x%02x,D:0x%02x\n",addr,*data); + return PAH_RET_SUCCESS; +} + +void pah_print( + int32_t fileline, + const char *funcname, + const char *filename, + const char *format, ...) +{ + UNUSED_VAR(fileline); + UNUSED_VAR(funcname); + UNUSED_VAR(filename); + + char dest[256]; + va_list argptr; + int char_num = 0; + + if (!format) + return; + + va_start(argptr, format); + char_num = vsprintf(dest, format, argptr); + va_end(argptr); + + //uart_printf("%s", dest); + + //dest[char_num] = '\n'; + // pxi_nrf_uart_transmit((uint8_t*)dest, (uint16_t)(char_num + 1)); +} + +void ReadGSensor(float *x, float *y, float *z) +{ +#ifdef SUPPORT_CYWEE_SERVICE + gsenson_t data = {0}; + cywee_get_gsensor_data(1,&data); + *x = data.x; + *y = data.y; + *z = data.z; +#endif +} diff --git a/code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah800x_bsp.h b/code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah800x_bsp.h new file mode 100644 index 000000000..cae483f3b --- /dev/null +++ b/code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah800x_bsp.h @@ -0,0 +1,46 @@ +/* + * @Author: penglei 1624952103@qq.com + * @Date: 2025-05-27 11:09:04 + * @LastEditors: penglei 1624952103@qq.com + * @LastEditTime: 2025-05-27 11:32:50 + * @FilePath: /sdk615/code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah800x_bsp.h + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ +#ifndef __pah_800x_bsp_h__ +#define __pah_800x_bsp_h__ + +// c +#include +#include +#include +#include + +// pah +#include "pah_unit.h" +#include "pah_800x_config.h" + + +//============================================================================ +// Public function +//============================================================================ +#ifdef __cplusplus +extern "C" { +#endif + +void pah_delay_ms(uint32_t ms); +uint64_t pah_get_tick_count(void); +pah_ret pah_comm_i2c_write(uint8_t addr, const uint8_t *data, size_t write_size); +pah_ret pah_comm_i2c_read(uint8_t addr, uint8_t *data, size_t read_size); +void pah_print( + int32_t fileline, + const char *funcname, + const char *filename, + const char *format, ...); + +void ReadGSensor(float *x, float *y, float *z); + +#ifdef __cplusplus +} +#endif + +#endif // header guard diff --git a/code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah800x_main.c b/code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah800x_main.c new file mode 100644 index 000000000..d03000b3a --- /dev/null +++ b/code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah800x_main.c @@ -0,0 +1,1865 @@ +// pah +#include "pah800x_main.h" +//#include "pah_8009_reg_arr_default.h" +#include "pxialg_spo2.h" +#include "pxialg_hrv.h" +#include "pxivar.h" +#include "pah_8009_reg_arr_default_20220623.h" +#include "pah800x_factory_test.h" +#include "cmsis_os2.h" + +#ifdef SUPPORT_PPG_SERVICE +#include "ppg_service.h" +#include "ppg_hal.h" +#endif +#ifdef SUPPORT_CYWEE_SERVICE +#include "cywee_service.h" +#endif +#include "custom_runtime.h" +#ifdef SUPPORT_PPG_BLE_SERVICE +#include "ppgBleService.h" +#endif +//============================================================================ +// Static Global Variable +//============================================================================ +static main_state _main; +static ppg_mems_data_t ppg_mems_data_buf[FIFO_SIZE] ; +static int _read_index = 0 ; +static int _write_index = 0 ; + +// hr algotirhm +static float hr = 0.0f; +static float hr_grader =0.0f; +static ppg_mems_data_t ppg_mems_data_alg; + +// spo2 algorithm +void *pBuffer = NULL; +void *hr_pBuffer = NULL; +static float myHR = 0.0f; +static float mySpO2 = 0.0f; +static float correlation = 0.0f; +static float trust_flag = 0.0f; +static float MEMS_RMS = 0.0f; +uint8_t mySPO2_ReadyFlag = 0 ; +static uint8_t no_value_reason = 0 ; +static float SignalPeriodicity=0.0f ; + +static int time_accu = 0 ; +static int count =0; +static float spo2_array[31]={0.0f}; + +static uint32_t data_buf_count_spo2_alg=0; + +static SpO2_info_t _spo2_detect_item; +pah8series_data_t pxialg_data_spo2; +static SpO2_mems_t mems_data_raw[150]; +#ifdef PPG_MEMS_Synchronize +//int16_t mems_int_data_in[90] ={0}; +int16_t mems_int_data_out[90]={0}; +int time_temp=0; +static uint8_t ppg_data_num=0; +uint8_t mems_data_polling_ready = 0 ; +#endif + +// Stress Algorithm +static hrv_state_s _hrv_state; +void *stress_pBuffer = NULL; +#define HRV_ENABLE_LHR 1 +#define HRV_SAMPLING_RATE 20 +#define HRV_COLLECTION_SECONDS 180 +static uint32_t duration_total = 0; +uint8_t SDNN_ReadyFlag = 0; +uint8_t Get_Stress = 0; +static float Stress = 0.0f; +static uint8_t HRAvg = 0; +static float SQ_Stress = 0.0f; +static uint8_t AnomalyFlag = 0; +uint8_t Stress_ReadyFlag = 0; +uint8_t Weak_Flag = 0; + +static int32_t factory_data = 0; +static uint8_t work_mode = 0; +static uint8_t wear_status = 0; + +static osTimerId_t g_pah8009_timer = NULL; + +static uint8_t time_cnt = 0; + +static int history_wear_status = -1; + + +#if POLLING_MODE +static int time_out = 40; +#endif + +static uint8_t hrs_num = 0; +static int32_t sum_hrs = 0; +static int8_t hrs_data[7] = {0}; +static uint8_t left = 0; +static uint8_t right = -1; +static uint8_t avg_hrs = 0; + +static uint8_t timeout = 0; + +//============================================================================ +// Private function +//============================================================================ +static bool sensor_basic_verification(void); +static void process(uint64_t timestamp); +static void ppg_sensor_enable(void); +static void ppg_sensor_disable(void); +static void touch_sensor_enable(void); +static void touch_sensor_disable(void); + +static void report_touch_data(uint64_t timestamp, const int8_t *touch_flag); +static void report_ppg_data(const ppg_mems_data_t *ppg_mems_data_alg); +static void report_hr_data(const ppg_mems_data_t *ppg_mems_data_alg, int32_t ret, float hr, float hr_grader); +static void report_spo2_data(const ppg_mems_data_t *ppg_mems_data_alg, int32_t ret, float myHR, float mySpO2, float correlation, float trust_flag, float MEMS_RMS, int data_buf_count_spo2_alg, uint8_t no_value_reason, float SignalPeriodicity, int time_accu ); +static void report_stress_data(const ppg_mems_data_t *ppg_mems_data_alg, uint8_t Stress_ReadyFlag, uint32_t measuretime, float collect_time); + +static void error_handle(void); + + +static void pah8009_unwearstatus_update(void) +{ + uint8_t data = 0; + printf("uapi_dev_runtime_get_train_status() : %d\n",uapi_dev_runtime_get_train_status()); + if(uapi_dev_runtime_get_train_status()) + { +#ifdef SUPPORT_CYWEE_SERVICE + do_cywee_service_check_msg(CYWEE_SERVICE_CMD_HRS_CHANGE,&data); +#endif + } + else + { +// #ifdef SUPPORT_PPG_SERVICE +// ppg_msg_callback_t func = ppg_get_send_msg_callback_func(); +// if(func != NULL) +// { +// //为了主界面脱腕灵敏;需要增加未佩戴 +// func(PPG_MSG_TYPE_HRS_UPDATE, &data, 1); +// func(PPG_MSG_TYPE_WEARSTAT_UPDATE, &data,1); +// func(PPG_MSG_TYPE_WEARSTAT_UPDATE,&data,1); +// func(PPG_MSG_TYPE_WEARSTAT_UPDATE,&data,1); +// } +// #endif + } + +} + +static void pah8009_wearstatus_update(int wear_status) +{ + if(history_wear_status != wear_status) + { + history_wear_status = wear_status; +#ifdef SUPPORT_CYWEE_SERVICE + do_cywee_service_check_msg(CYWEE_SERVICE_CMD_WEAR_STATUS_CHANGE,(uint8_t *)&history_wear_status); +#endif + // if(wear_status != 1) + // { + // pah8009_unwearstatus_update(); + // } + } + +} + +static void bubblesort(float *input,int count) +{ + int i,j; + float sort_temp; + for(i=0;i= FIFO_SIZE) + tmp = 0 ; + if(tmp == _read_index) + return false; + ppg_mems_data_buf[tmp] = *data ; + _write_index = tmp ; + return true; +} + +bool pah_pop(ppg_mems_data_t *data) +{ + int tmp ; + if(isFIFOEmpty()) + return false; + tmp = _read_index + 1; + if(tmp >= FIFO_SIZE) + tmp = 0 ; + _read_index = tmp ; + *data = ppg_mems_data_buf[_read_index] ; + + return true; +} + + +//============================================================================ +// Public function +//============================================================================ +void pah_sensor_init(reg_config_type type) +{ + memset(&_main, 0, sizeof(_main)); + + pah_800x_reg_setting reg_setting; + memset(®_setting, 0, sizeof(reg_setting)); + + if (!sensor_basic_verification()) + { + // error_handle(); + LOG_PRINT("sensor_basic_verification failed\n"); + return; + } + + + // pah_800x + pah_800x_config pah_800x_config; + pah_800x_get_default_config(&pah_800x_config); + LOG_PRINT("PPG_SETTING_VESION = %d \n" ,PPG_SETTING_VERSION); + +#if (ENABLE_AE==0) + pah_800x_config.enable_ppg_convergence[0] = false; + pah_800x_config.enable_ppg_convergence[1] = false; + pah_800x_config.enable_ppg_convergence[2] = false; +#endif + +#if (ENABLE_AE_RECONVERGENCE==0) + pah_800x_config.enable_ppg_reconvergence_if_out_of_bounds[0] = false; + pah_800x_config.enable_ppg_reconvergence_if_out_of_bounds[1] = false; + pah_800x_config.enable_ppg_reconvergence_if_out_of_bounds[2] = false; +#endif + + if (type == pc_4mm_2g_ir_hrd) + { +#if (PC_4MM_2G_IR_HRD==1) + PAH_REG_ARR_SETUP(reg_setting.startup_init, PAH8009_REG_DEVICE_INIT); + PAH_REG_ARR_SETUP(reg_setting.ppg_enable, PAH8009_REG_PC_4MM_2G_IR_PPG); + PAH_REG_ARR_SETUP(reg_setting.touch_enable, PAH8009_REG_PC_4MM_2G_IR_TOUCH); +#endif + } + else if (type == diw_4mm_g_ir_hrd) + { +#if (DIW_4MM_G_IR_HRD==1) + PAH_REG_ARR_SETUP(reg_setting.startup_init, PAH8009_REG_DEVICE_INIT); + PAH_REG_ARR_SETUP(reg_setting.ppg_enable, PAH8009_REG_DIW_4MM_G_IR_PPG); + PAH_REG_ARR_SETUP(reg_setting.touch_enable, PAH8009_REG_DIW_4MM_G_IR_TOUCH); +#endif + } + else if (type == diw_4mm_ir_r_ir_spo2) + { +#if (DIW_4MM_IR_R_IR_SPO2==1) + for(int ch=0;ch 2) + { + min_hrs = hrs_data[0]; + max_hrs = hrs_data[0]; + for (int i = 0;i < hrs_num; i++) + { + if (hrs_data[i] < min_hrs) + min_hrs = hrs_data[i]; + if (hrs_data[i] > max_hrs) + max_hrs = hrs_data[i]; + } + avg_hrs = (sum_hrs - max_hrs - min_hrs) / (hrs_num - 2); + printf("max_hrs[%d],min_hrs[%d],avg_hrs[%d]\n",max_hrs,min_hrs,avg_hrs); + } +} + +void hr_alg_task(void) +{ + if(Check_alg_enable()) + { + if(Check_alg_enable()==MSG_ALG_ENABLE) + { + hr_algorithm_enable(); + }else if(Check_alg_enable()==MSG_ALG_DISABLE) + { + hr_algorithm_disable(); + } + Clear_alg_enable(); + } + + if(!isFIFOEmpty()) + { + if(pah_pop(&ppg_mems_data_alg)) //Get data from FIFO + { + if(_main.hr_is_enabled) + { + ppg_mems_data_alg.ppg_data.has_overflow = 0; + ppg_mems_data_alg.ppg_data.overflow_num = 0; + + + + // 13Bytes format to hr lib; + sRaw_Data_13Bytes hr_data; + + memset(&hr_data, 0, sizeof(hr_data)); + hr_data.loss = (uint8_t)ppg_mems_data_alg.ppg_data.overflow_num + 1; + hr_data.rawData = ppg_mems_data_alg.ppg_data.data[1]; + hr_data.non_zero1 = 1; + hr_data.non_zero2 = 2; + hr_data.non_zero3 = 3; + hr_data.frame_count = ppg_mems_data_alg.ppg_frame_count; + hr_data.time = ppg_mems_data_alg.duration; + hr_data.rsv = 0; + hr_data.touch = (ppg_mems_data_alg.touch_flag > 0 ? 0x80 : 0x00); + hr_data.rsv2 = 0; + + int32_t ret = PxiAlg_Process_Expo((uint8_t*)&hr_data, ppg_mems_data_alg.MEMS_Data, ppg_mems_data_alg.ppg_data.exposure_time[1]); + + + if(PxiAlg_GetHrUpdateFlag()) + { + PxiAlg_HrGet(&hr); + PxiAlg_GetSigGrade(&hr_grader); + } + if(ppg_mems_data_alg.touch_flag==0) + { + hr = 0 ; + hr_grader = 0; + } + + // if(hr > 0) + // printf("hr:%f\n",hr); +#ifdef SUPPORT_PPG_SERVICE + time_cnt++; + + if(time_cnt >= 15) + { + // ppg_msg_callback_t func = ppg_get_send_msg_callback_func(); + + uint8_t data = (uint8_t)hr; + + if(data > 30 && data < 220) + get_avg_hrs(data); + + // printf("func(PPG_MSG_TYPE_HRS_UPDATE, &avg_hrs, 1); :%d\n",avg_hrs); + // func(PPG_MSG_TYPE_HRS_UPDATE, &avg_hrs, 1); + + // data = cywee_wear_status; + // func(PPG_MSG_TYPE_WEARSTAT_UPDATE, &data, 1); + time_cnt = 0; + +#ifdef SUPPORT_PPG_BLE_SERVICE + if(uapi_dev_runtime_get_hrs_ble_status()) + { + ble_ppgtest_server_send_input_report(&avg_hrs,1); + } +#endif + } + + + + +#endif + report_hr_data(&ppg_mems_data_alg, ret, hr, hr_grader); + + + } + else + { + report_ppg_data(&ppg_mems_data_alg); + } + } + } +} + +// HRD- ALG- Task2 +void hr_alg_task2(uint8_t ppg_num) +{ +#ifdef PPG_MEMS_Synchronize + if(Check_alg_enable()) + { + if(Check_alg_enable()==MSG_ALG_ENABLE) + { + hr_algorithm_enable(); + }else if(Check_alg_enable()==MSG_ALG_DISABLE) + { + hr_algorithm_disable(); + } + Clear_alg_enable(); + } + + if(!isFIFOEmpty()) + { + for (int i=0; i 0 ? 0x80 : 0x00); + hr_data.rsv2 = 0; + + int32_t ret = PxiAlg_Process_Expo((uint8_t*)&hr_data, ppg_mems_data_alg.MEMS_Data, ppg_mems_data_alg.ppg_data.exposure_time[1]); + + + if(PxiAlg_GetHrUpdateFlag()) + { + PxiAlg_HrGet(&hr); + PxiAlg_GetSigGrade(&hr_grader); + } + + report_hr_data(&ppg_mems_data_alg, ret, hr, hr_grader); + + } + else + { + report_ppg_data(&ppg_mems_data_alg); + } + } + } + } +#endif +} + + + +// SPO2 +void spo2_algorithm_enable(void) +{ + if (_main.spo2_is_enabled) + { + return; + } + + + int version = SpO2_Version(); + DEBUG_PRINT("PxiAlg_Version() = %d\n", version); + + uint32_t buffer_size = SpO2_OpenSize(); + DEBUG_PRINT("SpO2_Open buffer_size = %d \n", buffer_size); + + pBuffer = malloc(buffer_size); + + if (SpO2_Open(pBuffer) != SPO2_MSG_SUCCESS) + { + DEBUG_PRINT("SpO2_Open() failed. \n"); + free(pBuffer); + return; + } + int8_t alg_ch[2] = {0, 1}; + + SpO2_SetChMapping(alg_ch, 2); + SpO2_SetInputRatioHighBound(94.0f); + SpO2_SetInputRatioLowBound(87.0f); + SpO2_SetInputModelScale(0.50f); + + SpO2_SetInputCoefHigh0(-36877.85546875f); + SpO2_SetInputCoefHigh1(1135.91394042969f); + SpO2_SetInputCoefHigh2(-11.6429319381714f); + SpO2_SetInputCoefHigh3(0.0398150011897087f); + + SpO2_SetInputCoefMid0(-1430.70520019531f); + SpO2_SetInputCoefMid1(50.1599006652832f); + SpO2_SetInputCoefMid2(-0.567422986030579f); + SpO2_SetInputCoefMid3(0.00219199992716312f); + + SpO2_SetInputCoefLow0(-8.19796657562256f); + SpO2_SetInputCoefLow1(1.74200701713562f); + SpO2_SetInputCoefLow2(-0.0173850003629923f); + SpO2_SetInputCoefLow3(0.000105999999505002f); + + SpO2_SetIIRFilterRatio(0.5f); + SpO2_SetInputCorrelationTh(0.850000078678131f); + SpO2_SetInputRatioLow(0.05f); + + SpO2_SetInputFlagCheckHr(1); + SpO2_SetMotionDetectionLevel(2.0f); + SpO2_Set_Update_Sec(1); + + SpO2_Set_Init_Low_SpO2_Constrain(0.0); + SpO2_SetOutputHighBound(100.0f); + SpO2_SetOutputLowBound(60.0f); + SpO2_Set_Keep_Init_SpO2_Bound(95.0f); + SpO2_Set_Keep_Init_SpO2_Count_Th(18.0f); + SpO2_Set_SpO2_Bias_Value(0.5f); + SpO2_Set_SpO2_Outlier_Smooth_Coef(5.5f); + SpO2_Set_SpO2_Decrease_Coef(0.5f); + SpO2_SetSkipDataLen(25); + + SpO2_Set_Flag_Hold_Breathe_Mode(0); + SpO2_Set_Input_Correlation_Th2(0.85000f); + SpO2_Set_Correlation_Th2_Count(30.0f); + SpO2_Set_Init_Low_SpO2_Th(94.5f); + SpO2_Set_Motion_Rms_Th(3000.0f); + SpO2_Set_Motion_Rms_Th2(1500.0f); + SpO2_Set_Motion_MEMS_Th(0.0f); + SpO2_Set_T1(0.85f); + SpO2_Set_Spo2_Force_Output_Second(15.0f); + + Spo2_Set_Force_Output_Value(97.50f); // Good Signal Force SpO2 + Spo2_Set_Force_Output_Value2(95.00f); // Bad Signal Force SpO2 + + SpO2_Set_Init_Low_SpO2_Check_Sec(20); + Spo2_Set_SpO2_First_Smooth_Th(95.0f); + Spo2_Set_SpO2_First_Smooth_Sec(15); + Spo2_Set_SpO2_Correlation_Smooth_Th(0.85f); + SpO2_Set_Signal_Periodicity_Th(0.50f); + + // static Hr-V301009 + PxiAlg_Close(); + version = PxiAlg_Version(); + DEBUG_PRINT("HR_Version = %d \r\n", version); + + + uint32_t Query_Mem_Size = PxiAlg_Query_Mem_Size(); + DEBUG_PRINT("HR_Mem_Size = %d \r\n", Query_Mem_Size); + + hr_pBuffer = malloc(Query_Mem_Size); + + + if(!PxiAlg_Open_Mem(hr_pBuffer)) + DEBUG_PRINT("PxiAlg_Open_Mem fail \n"); + + + PxiAlg_SetQualityThreshold(0.35f); + PxiAlg_SetHRSmoothWeight(0.9f); + PxiAlg_SetProcWindow(5.0f, 5.0f); + PxiAlg_SetTimeoutLength(30.0f); + PxiAlg_SetMemsScale(1); //MEMS 2/4/8/16G : 0/1/2/3 + PxiAlg_SetSkipSampleNum(10); + PxiAlg_SetMemsScaleBase(1, 0); //MEMS 2/4/8/16G : 0/1/2/3 + PxiAlg_SetForceOutputLink(15, 90, 60, 1, 0.9f); + PxiAlg_SetNormalOutput(200, 40, 1); + PxiAlg_SetForceRipple(3, 1); + PxiAlg_SetPackage(0, 1); + + myHR = 0.0f; + mySpO2 = 0.0f; + correlation = 0.0f; + trust_flag = 0.0f; + MEMS_RMS = 0.0f; + mySPO2_ReadyFlag = 0; + hr_grader = 0.0f; + data_buf_count_spo2_alg=0; + no_value_reason = 0 ; + SignalPeriodicity=0.0f ; + time_accu = 0 ; + count = 0 ; + memset(spo2_array, 0, sizeof(*spo2_array)); + _main.spo2_is_enabled = true; +} + +void spo2_algorithm_disable(void) +{ + if (!_main.spo2_is_enabled) + return; + PxiAlg_Close(); + SpO2_Close(); + free(pBuffer); + free(hr_pBuffer); + myHR = 0.0f; + mySpO2 = 0.0f; + correlation = 0.0f; + trust_flag = 0.0f; + MEMS_RMS = 0.0f; + mySPO2_ReadyFlag = 0; + hr_grader = 0.0f; + data_buf_count_spo2_alg=0; + + no_value_reason = 0 ; + SignalPeriodicity=0.0f ; + time_accu = 0 ; + + + _main.spo2_is_enabled = false; +} + +void spo2_alg_task(void) +{ + if(Check_alg_enable()) + { + if(Check_alg_enable()==MSG_ALG_ENABLE) + { + spo2_algorithm_enable(); + }else if(Check_alg_enable()==MSG_ALG_DISABLE) + { + spo2_algorithm_disable(); + } + Clear_alg_enable(); + } + + if(!isFIFOEmpty()) + { + if(pah_pop(&ppg_mems_data_alg)) //Get data from FIFO + { + if(_main.spo2_is_enabled) + { + // 13Bytes format to hr lib; + + int32_t RAW_DATA[2] ; + sRaw_Data_13Bytes hr_data; + + memset(&hr_data, 0, sizeof(hr_data)); + hr_data.loss = (uint8_t)ppg_mems_data_alg.ppg_data.overflow_num + 1; + hr_data.rawData = ppg_mems_data_alg.ppg_data.data[0]; + hr_data.non_zero1 = 1; + hr_data.non_zero2 = 2; + hr_data.non_zero3 = 3; + hr_data.frame_count = ppg_mems_data_alg.ppg_frame_count; + hr_data.time = ppg_mems_data_alg.duration; + hr_data.rsv = 0; + hr_data.touch = (ppg_mems_data_alg.touch_flag > 0 ? 0x80 : 0x00); + hr_data.rsv2 = 0; + + + int32_t ret = PxiAlg_Process_Expo((uint8_t*)&hr_data, ppg_mems_data_alg.MEMS_Data, ppg_mems_data_alg.ppg_data.exposure_time[0]); + + + + + if(PxiAlg_GetHrUpdateFlag()) + { + PxiAlg_HrGet(&myHR); + PxiAlg_GetSigGrade(&hr_grader); + } + + + int32_t spo2_raw_1=ppg_mems_data_alg.ppg_data.data[0]; + int32_t spo2_raw_2=ppg_mems_data_alg.ppg_data.data[1]; + + RAW_DATA[0]=spo2_raw_1; + RAW_DATA[1]=spo2_raw_2; + + mems_data_raw[0].data[0]=ppg_mems_data_alg.MEMS_Data[0]; + mems_data_raw[0].data[1]=ppg_mems_data_alg.MEMS_Data[1] ; + mems_data_raw[0].data[2]=ppg_mems_data_alg.MEMS_Data[2]; + + // SPO2 fill data on pah8series structure + pxialg_data_spo2.touch_flag = ppg_mems_data_alg.touch_flag ; + pxialg_data_spo2.time = ppg_mems_data_alg.duration ;; + pxialg_data_spo2.ppg_data = (int32_t*)RAW_DATA; + pxialg_data_spo2.nf_ppg_channel = 2; + pxialg_data_spo2.nf_ppg_per_channel = 1; + pxialg_data_spo2.frame_count = ppg_mems_data_alg.ppg_frame_count ; + pxialg_data_spo2.nf_mems = 1; + pxialg_data_spo2.mems_data = (int16_t*)mems_data_raw; + + + + // DEBUG_PRINT("data_buf_count_spo2_alg = %d \r\n", data_buf_count_spo2_alg); + + + SpO2_SetHrValue(myHR); + SpO2_SetMems(mems_data_raw, 1); + //int ret_value = SpO2_Process(ppg_mems_data_alg.touch_flag , 2, pxialg_data_spo2.ppg_data, 1); + int ret_value = SpO2_Process(ppg_mems_data_alg.touch_flag , 2, pxialg_data_spo2.ppg_data, 1,pxialg_data_spo2.time ); + + SpO2_GetSpO2(&mySpO2); + + // if(mySpO2 > 0) + // printf("SpO2 : %f\n",mySpO2); +#ifdef SUPPORT_PPG_SERVICE + time_cnt++; + + // ppg_msg_callback_t func = ppg_get_send_msg_callback_func(); + + // if(func != NULL && time_cnt >= 25) + // { + // uint8_t data = (uint8_t)mySpO2; + // func(PPG_MSG_TYPE_SPO2_UPDATE, &data, 1); + // time_cnt = 0; + // } +#endif + + SpO2_GetReadyFlag(&mySPO2_ReadyFlag); + SpO2_GetInfo(&_spo2_detect_item); + correlation =_spo2_detect_item.Noise; + trust_flag =_spo2_detect_item.Output[3]; + no_value_reason=_spo2_detect_item.Output[4]; + SpO2_GetPeriodicity(&SignalPeriodicity); + MEMS_RMS =_spo2_detect_item.RMS; + + + data_buf_count_spo2_alg++; + + #if defined(Optimize_SPO2_flow) + time_accu=time_accu+pxialg_data_spo2.time; + #endif + + if( (ret_value == 0 ) && (data_buf_count_spo2_alg>=25) ) + { + + #if defined(Optimize_SPO2_flow) + //time_accu=time_accu+pxialg_data->time; + DEBUG_PRINT("SPO2 Test Time = %d ,count =%d\n",time_accu,count); + if(time_accu>=60000) + { + spo2_array[count]=mySpO2; + count=count+1; + + LOG_PRINT("Over_30_sec_Stop_measurement\n"); + LOG_PRINT("This_meausrement_suggest_spo2_value is"); + + bubblesort(spo2_array,count); + + if(count % 2 == 0) + { + //log_printf(" "LOG_FLOAT_MARKER" \n", LOG_FLOAT(spo2_array[count/2])); + LOG_PRINT(" "LOG_FLOAT_MARKER" \n",LOG_FLOAT((spo2_array[(int)(count/2)] + spo2_array[(int)(count/2) - 1]) / 2.0f)); + } + else + { + LOG_PRINT(" "LOG_FLOAT_MARKER" \n", LOG_FLOAT(spo2_array[(int)(count/2)]*1.0f)); + } + + //log_pah8series_no_touch(); + spo2_algorithm_disable(); + pah_sensor_stop(); + count=0; + //add sensor stop here + } + else + { + if(mySpO2>0) + { + spo2_array[count]=mySpO2; + count=count+1; + } + } + #endif + //report_spo2_data(&ppg_mems_data_alg, ret, mySpO2, myHR, correlation, trust_flag, MEMS_RMS,data_buf_count_spo2_alg, Opt_SpO2, drop_flag, ascend_flag, mems_fla); + report_spo2_data(&ppg_mems_data_alg, ret, mySpO2, myHR, correlation, trust_flag, MEMS_RMS,data_buf_count_spo2_alg, no_value_reason, SignalPeriodicity, time_accu); + data_buf_count_spo2_alg = data_buf_count_spo2_alg -25; + } + else + { + //report_spo2_data(&ppg_mems_data_alg, ret, mySpO2, myHR, correlation, trust_flag, MEMS_RMS,data_buf_count_spo2_alg, Opt_SpO2, drop_flag, ascend_flag, mems_flag); + report_spo2_data(&ppg_mems_data_alg, ret, mySpO2, myHR, correlation, trust_flag, MEMS_RMS,data_buf_count_spo2_alg, no_value_reason, SignalPeriodicity, time_accu); + + switch (ret_value) + { + case SPO2_MSG_ALG_NOT_OPEN: + DEBUG_PRINT("Algorithm is not initialized. \n"); + break; + + case SPO2_MSG_ALG_REOPEN: + DEBUG_PRINT("Algorithm is re initialized. \n"); + break; + + case SPO2_MSG_ALG_NOT_SUPPORT: + DEBUG_PRINT("Algorithm is not support. \n"); + break; + + default: + // DEBUG_PRINT("Algorithm unhandle error = %d \n", ret_value); + break; + } + //return 1 ; + } + } + else + { + report_ppg_data(&ppg_mems_data_alg); + } + } + } +} + + + +// SPO2- ALG- Task2 +void spo2_alg_task2(uint8_t ppg_num) +{ +#ifdef PPG_MEMS_Synchronize + if(Check_alg_enable()) + { + if(Check_alg_enable()==MSG_ALG_ENABLE) + { + spo2_algorithm_enable(); + }else if(Check_alg_enable()==MSG_ALG_DISABLE) + { + spo2_algorithm_disable(); + } + Clear_alg_enable(); + } + + if(!isFIFOEmpty()) + { + for (int k=0; k 0 ? 0x80 : 0x00); + hr_data.rsv2 = 0; + + + int32_t ret = PxiAlg_Process_Expo((uint8_t*)&hr_data, ppg_mems_data_alg.MEMS_Data, ppg_mems_data_alg.ppg_data.exposure_time[0]); + + + + + if(PxiAlg_GetHrUpdateFlag()) + { + PxiAlg_HrGet(&myHR); + PxiAlg_GetSigGrade(&hr_grader); + } + + + int32_t spo2_raw_1=ppg_mems_data_alg.ppg_data.data[0]; + int32_t spo2_raw_2=ppg_mems_data_alg.ppg_data.data[1]; + + RAW_DATA[0]=spo2_raw_1; + RAW_DATA[1]=spo2_raw_2; + + mems_data_raw[0].data[0]=ppg_mems_data_alg.MEMS_Data[0]; + mems_data_raw[0].data[1]=ppg_mems_data_alg.MEMS_Data[1] ; + mems_data_raw[0].data[2]=ppg_mems_data_alg.MEMS_Data[2]; + + // SPO2 fill data on pah8series structure + pxialg_data_spo2.touch_flag = ppg_mems_data_alg.touch_flag ; + pxialg_data_spo2.time = ppg_mems_data_alg.duration ;; + pxialg_data_spo2.ppg_data = (int32_t*)RAW_DATA; + pxialg_data_spo2.nf_ppg_channel = 2; + pxialg_data_spo2.nf_ppg_per_channel = 1; + pxialg_data_spo2.frame_count = ppg_mems_data_alg.ppg_frame_count ; + pxialg_data_spo2.nf_mems = 1; + pxialg_data_spo2.mems_data = (int16_t*)mems_data_raw; + + + + //DEBUG_PRINT("data_buf_count_spo2_alg = %d \r\n", data_buf_count_spo2_alg); + + + SpO2_SetHrValue(myHR); + SpO2_SetMems(mems_data_raw, 1); + //int ret_value = SpO2_Process(ppg_mems_data_alg.touch_flag , 2, pxialg_data_spo2.ppg_data, 1); + int ret_value = SpO2_Process(ppg_mems_data_alg.touch_flag , 2, pxialg_data_spo2.ppg_data, 1,pxialg_data_spo2.time ); + + SpO2_GetSpO2(&mySpO2); + SpO2_GetReadyFlag(&mySPO2_ReadyFlag); + SpO2_GetInfo(&_spo2_detect_item); + correlation =_spo2_detect_item.Noise; + trust_flag =_spo2_detect_item.Output[3]; + no_value_reason=_spo2_detect_item.Output[4]; + SpO2_GetPeriodicity(&SignalPeriodicity); + MEMS_RMS =_spo2_detect_item.RMS; + + + data_buf_count_spo2_alg++; + + #if defined(Optimize_SPO2_flow) + time_accu=time_accu+pxialg_data_spo2.time; + #endif + + if( (ret_value == 0 ) && (data_buf_count_spo2_alg>=25) ) + { + + #if defined(Optimize_SPO2_flow) + //time_accu=time_accu+pxialg_data->time; + DEBUG_PRINT("SPO2 Test Time = %d ,count =%d\n",time_accu,count); + if(time_accu>=31000) + { + spo2_array[count]=mySpO2; + count=count+1; + + LOG_PRINT("Over_30_sec_Stop_measurement\n"); + LOG_PRINT("This_meausrement_suggest_spo2_value is"); + + bubblesort(spo2_array,count); + + if(count % 2 == 0) + { + //log_printf(" "LOG_FLOAT_MARKER" \n", LOG_FLOAT(spo2_array[count/2])); + LOG_PRINT(" "LOG_FLOAT_MARKER" \n",LOG_FLOAT((spo2_array[(int)(count/2)] + spo2_array[(int)(count/2) - 1]) / 2.0f)); + } + else + { + LOG_PRINT(" "LOG_FLOAT_MARKER" \n", LOG_FLOAT(spo2_array[(int)(count/2)]*1.0f)); + } + + //log_pah8series_no_touch(); + spo2_algorithm_disable(); + pah_sensor_stop(); + count=0; + //add sensor stop here + } + else + { + if(mySpO2>0) + { + spo2_array[count]=mySpO2; + count=count+1; + } + } + #endif + //report_spo2_data(&ppg_mems_data_alg, ret, mySpO2, myHR, correlation, trust_flag, MEMS_RMS,data_buf_count_spo2_alg, Opt_SpO2, drop_flag, ascend_flag, mems_fla); + report_spo2_data(&ppg_mems_data_alg, ret, mySpO2, myHR, correlation, trust_flag, MEMS_RMS,data_buf_count_spo2_alg, no_value_reason, SignalPeriodicity, time_accu); + data_buf_count_spo2_alg = data_buf_count_spo2_alg -25; + } + else + { + //report_spo2_data(&ppg_mems_data_alg, ret, mySpO2, myHR, correlation, trust_flag, MEMS_RMS,data_buf_count_spo2_alg, Opt_SpO2, drop_flag, ascend_flag, mems_flag); + report_spo2_data(&ppg_mems_data_alg, ret, mySpO2, myHR, correlation, trust_flag, MEMS_RMS,data_buf_count_spo2_alg, no_value_reason, SignalPeriodicity, time_accu); + + switch (ret_value) + { + case SPO2_MSG_ALG_NOT_OPEN: + DEBUG_PRINT("Algorithm is not initialized. \n"); + break; + + case SPO2_MSG_ALG_REOPEN: + DEBUG_PRINT("Algorithm is re initialized. \n"); + break; + + case SPO2_MSG_ALG_NOT_SUPPORT: + DEBUG_PRINT("Algorithm is not support. \n"); + break; + + default: + DEBUG_PRINT("Algorithm unhandle error = %d \n", ret_value); + break; + } + //return 1 ; + } + } + else + { + report_ppg_data(&ppg_mems_data_alg); + } + } + } + } +#endif +} + + + +// Stress +void stress_algorithm_enable(void) +{ + int buffer_size = 0; + if (_main.stress_is_enable) + { + return; + } + + LOG_PRINT("HRVGetVersion() = %d \n", HRVGetVersion()); + buffer_size = HRVGetMemorySize(HRV_ENABLE_LHR, HRV_COLLECTION_SECONDS, HRV_SAMPLING_RATE); + LOG_PRINT("HRVGetMemorySize(), open_size = %d \n", buffer_size); + + if (!buffer_size) + { + LOG_PRINT("HRVGetMemorySize(), failed to get memory size \n"); + return ; + } + + stress_pBuffer = (uint8_t*)malloc(buffer_size); + if (!stress_pBuffer) + { + LOG_PRINT("Out of memory \n"); + return ; + } + + if (!HRVOpen(stress_pBuffer)) + { + LOG_PRINT("HRVOpen() failed. \n"); + return ; + } + duration_total=0; + _hrv_state.collect_duration = 0; + + _main.stress_is_enable = true; +} + +void stress_algorithm_disable(void) +{ + if (!_main.stress_is_enable) + return; + HRVClose(); + free(stress_pBuffer); + + duration_total = 0; + SDNN_ReadyFlag = 0; + Get_Stress = 0; + Stress = 0.0f; + HRAvg = 0; + SQ_Stress = 0.0f; + AnomalyFlag = 0; + Stress_ReadyFlag = 0; + Weak_Flag = 0; + _main.stress_is_enable = false; +} + +void stress_alg_task(int grade) +{ + if(Check_alg_enable()) + { + if(Check_alg_enable()==MSG_ALG_ENABLE) + { + stress_algorithm_enable(); + }else if(Check_alg_enable()==MSG_ALG_DISABLE) + { + stress_algorithm_disable(); + } + Clear_alg_enable(); + } + + if(!isFIFOEmpty()) + { + if(pah_pop(&ppg_mems_data_alg)) //Get data from FIFO + { + if(_main.stress_is_enable) + { + uint32_t raw_data = ppg_mems_data_alg.ppg_data.data[1]; + uint8_t frame_count = ppg_mems_data_alg.ppg_frame_count; + uint8_t timeInterval = ppg_mems_data_alg.duration; + uint8_t touch_flag = ppg_mems_data_alg.touch_flag; + + // If using Interrupt mode call this API + HRVSetDiffTime(timeInterval,1); + + HRVProcess(touch_flag, raw_data); + + duration_total+=timeInterval; + + + if(Stress_ReadyFlag==0) + { + Stress_ReadyFlag=HRVGetReadyFlag(); + } + + if((duration_total>25000)&& Stress_ReadyFlag==0) + { + LOG_PRINT("PPG Raw data is too Weak\r\n"); + LOG_PRINT("TEST Stop\r\n"); + stress_algorithm_disable(); + Weak_Flag=1; + return ; + } + + if(Stress_ReadyFlag == 1 || HRVGetReadyFlag()) + { + Stress_ReadyFlag=1; + _hrv_state.collect_duration += timeInterval; + + if(_hrv_state.collect_duration > (HRV_COLLECTION_SECONDS * 1000)) + { + //int grade=100; + HRAvg = HRVGetHRAvg(); + Stress= HRVGetStress(grade); + SQ_Stress=HRVGetRRIQuality(); + AnomalyFlag= HRVGetAnomalyFlag(); + LOG_PRINT("HRAvg = %d Stress = %f HRV_Quality = %f AnomalyFlag= %d \n", HRAvg ,Stress,SQ_Stress,AnomalyFlag); + + if(SQ_Stress>0.4f) + { + LOG_PRINT("HRV_Quality Good\n"); + } + else + { + LOG_PRINT("HRV_Quality Weak\n"); + } + + + if(Stress >=80 && Stress<=100) + { + LOG_PRINT("Stress_Level High\n"); + } + else if(Stress >=60 && Stress<80) + { + LOG_PRINT("Stress_Level Medium\n"); + } + else if(Stress >=30 && Stress<60) + { + LOG_PRINT("Stress_Level Normal\n"); + } + else + { + LOG_PRINT("Stress_Level Relaxed\n"); + } + + stress_algorithm_disable(); + _hrv_state.has_got_sdnn = 1; + Get_Stress=1; + return ; + } + } + report_stress_data(&ppg_mems_data_alg,Stress_ReadyFlag, duration_total, _hrv_state.collect_duration ); + } + else + { + report_ppg_data(&ppg_mems_data_alg); + LOG_PRINT("Stress_Level Normal\n"); + } + } + } +} + + + + +//============================================================================ +// Private function +//============================================================================ +static bool sensor_basic_verification(void) +{ + uint16_t product_id = 0; + pah_800x_get_product_id(&product_id); + if (product_id != PAH_800x_PRODUCT_ID) + { + pah_800x_power_toggle(&_main.pah_800x, true); + pah_800x_get_product_id( &product_id); + } + + DEBUG_PRINT("product_id = 0x%04X\n", product_id); + if (product_id != PAH_800x_PRODUCT_ID) + { + DEBUG_PRINT("Failed to verify product_id\n"); + return false; + } + + return true; +} + +static void process(uint64_t timestamp) +{ + float mems_data[3] = { 0.0f, 0.0f, 0.0f }; + + // Task + pah_ret ret = pah_800x_task(&_main.pah_800x); + if (PAH_FAILED(ret)) + { + DEBUG_PRINT("pah_800x_task() failed, ret = %d\n", ret); + return; + } + + int8_t touch_flag = -1; + pah_800x_get_touch_flag(&_main.pah_800x, &touch_flag); + + // PRINT("touch_flag : %d\n",touch_flag); + + pah8009_wearstatus_update(touch_flag); + + if (_main.ppg_is_enabled) + { + pah_800x_ppg_data ppg_data; + pah_800x_ppg_get_data(&_main.pah_800x, &ppg_data); + + if (ppg_data.has_data) + { + // LOG_PRINT("ppg data %d %d %d %d %d %d %d %d\n",ppg_data.has_data,ppg_data.overflow_num,ppg_data.data[0],ppg_data.data[1],ppg_data.data[2], + // ppg_data.exposure_time[0],ppg_data.exposure_time[1],ppg_data.exposure_time[2]); + // LOG_PRINT("ppg data %d %d %d %d %d %d\n",ppg_data.frame_period[0],ppg_data.frame_period[1],ppg_data.frame_period[2] + // ,ppg_data.adc[0],ppg_data.adc[1],ppg_data.adc[2]); + + // PRINT("ppg data : %d %d %d\n",ppg_data.data[0],ppg_data.data[1],ppg_data.data[2]); + + factory_data = ppg_data.data[0]; + + uint64_t duration = timestamp - _main.ppg_prev_report_timestamp; + + if (!_main.ppg_has_prev_report_timestamp) + { + _main.ppg_has_prev_report_timestamp = true; + duration = 50; + } + _main.ppg_prev_report_timestamp = timestamp; + + if (duration > UINT8_MAX) + { + DEBUG_PRINT("duration > UINT8_MAX !!!\n"); + return; + } + + ppg_mems_data_t ppg_mems_data; + + /***********************G sensor explanation start***********************************/ + //If no G sensor, please set ppg_mems_data.MEMS_Data[3] = {0}; + //Please set G sensor default range = ±2G. + //If G sensor output data format is not 16bit, please change to 16bit format. + //For example: G sensor is 12bit + //ReadGSensor(&mems_data[0],&mems_data[1],&mems_data[2]) + //MEMS_SensorX() absolute data must be largest when let hand down at static state. + //MEMS_SensorZ() absolute data must be largest when let hand horizontal on the table at static state. + /***********************G sensor explanation end***********************************/ + + ReadGSensor(&mems_data[0],&mems_data[1],&mems_data[2]); + + ppg_mems_data.MEMS_Data[0] = mems_data[0] * 2048 / 10;//ReadGSensorX(); + ppg_mems_data.MEMS_Data[1] = mems_data[1] * 2048 / 10;//ReadGSensorY(); + ppg_mems_data.MEMS_Data[2] = mems_data[2] * 2048 / 10;//ReadGSensorZ(); + // printf("x:%f y:%f z:%f\n",ppg_mems_data.MEMS_Data[0],ppg_mems_data.MEMS_Data[1],ppg_mems_data.MEMS_Data[2]); + ppg_mems_data.duration = duration; + + ppg_mems_data.ppg_data = ppg_data ; + ppg_mems_data.touch_flag = touch_flag ; + ppg_mems_data.ppg_frame_count = _main.ppg_frame_count; //SD-revise-20200320 + + pah_push(&ppg_mems_data); + +#ifdef PPG_MEMS_Synchronize + time_temp+=duration; + mems_data_polling_ready=0; + if(time_temp>=Time_Interval) + { + mems_data_polling_ready=1; + time_temp =0; + } + ppg_data_num++; +#endif + ++_main.ppg_frame_count; + + //report_ppg_data(&ppg_mems_data); + + } + } + + if (_main.is_Auto_mode || _main.touch_is_enabled)//SD-reivse-20191205 + { + if ( _main.touch_last_is_touched != touch_flag) + { + _main.touch_last_is_touched = touch_flag; + + report_touch_data(timestamp, &touch_flag); + + bool is_touched = (touch_flag >= 1); + + if (_main.is_Auto_mode && is_touched)//SD-revise-20191205 + { + //touch_sensor_disable(); + ppg_sensor_enable(); + _main.alg_is_enabled = MSG_ALG_ENABLE; + } + else if (_main.is_Auto_mode && !is_touched) + { + // pah8009_unwearstatus_update(); + ppg_sensor_disable(); + pah_800x_update_touch_setting(&_main.pah_800x); + //touch_sensor_enable(); + _main.alg_is_enabled = MSG_ALG_DISABLE; + } + } + } +} + +static void ppg_sensor_enable(void) +{ + if (_main.ppg_is_enabled) + return; + + pah_800x_ppg_toggle(&_main.pah_800x, true); + + _main.debug_print_header = true; + _main.ppg_has_prev_report_timestamp = false; + _main.ppg_prev_report_timestamp = pah_get_tick_count(); + _main.ppg_frame_count = 0; + + _main.ppg_is_enabled = true; + + _read_index = 0 ; + _write_index = 0 ; +#ifdef PPG_MEMS_Synchronize + ppg_data_num = 0 ; +#endif + //LOG_PRINT("ppg_sensor_enable\n"); +} + +static void ppg_sensor_disable(void) +{ + if (!_main.ppg_is_enabled) + return; + + pah_800x_ppg_toggle(&_main.pah_800x, false); + + _main.ppg_is_enabled = false; +} + +static void touch_sensor_enable(void) +{ + if (_main.touch_is_enabled) + return; + + pah_800x_touch_toggle(&_main.pah_800x, true); + + _main.touch_last_is_touched = 0;//default no touch => touch mode + + _main.touch_is_enabled = true; +} + +static void touch_sensor_disable(void) +{ + if (!_main.touch_is_enabled) + return; + + pah_800x_touch_toggle(&_main.pah_800x, false); + + _main.touch_is_enabled = false; +} + +static void report_touch_data(uint64_t timestamp, const int8_t *touch_flag) +{ + LOG_PRINT("TOUCH: time = { %llu }, touch_flag = { %d } \n", timestamp, *touch_flag ); +} + +static void report_ppg_data(const ppg_mems_data_t *ppg_mems_data_alg) +{ + if (_main.debug_print_header == true) + { + LOG_PRINT("Frame, Time, Touch_Flag, Data_Ready, Overflow_Flag, Overflow_Num, ppg0, ppg1, ppg2, Expo_A, Expo_B, Expo_C, MEMS_X, MEMS_Y, MEMS_Z\n"); + _main.debug_print_header = false; + } + + LOG_PRINT("%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d\n", + ppg_mems_data_alg->ppg_frame_count, ppg_mems_data_alg->duration, ppg_mems_data_alg->touch_flag, + ppg_mems_data_alg->ppg_data.has_data, ppg_mems_data_alg->ppg_data.has_overflow, ppg_mems_data_alg->ppg_data.overflow_num, + ppg_mems_data_alg->ppg_data.data[0], ppg_mems_data_alg->ppg_data.data[1], ppg_mems_data_alg->ppg_data.data[2], + ppg_mems_data_alg->ppg_data.exposure_time[0], ppg_mems_data_alg->ppg_data.exposure_time[1], ppg_mems_data_alg->ppg_data.exposure_time[2], + (int)(ppg_mems_data_alg->MEMS_Data[0]), (int)(ppg_mems_data_alg->MEMS_Data[1]), (int)(ppg_mems_data_alg->MEMS_Data[2])); +} + +static void report_hr_data(const ppg_mems_data_t *ppg_mems_data_alg, int32_t ret, float hr, float hr_grader) +{ + if (_main.debug_print_header == true) + { + LOG_PRINT("Frame, Time, Touch_Flag, Data_Ready, Overflow_Flag, Overflow_Num, PPG0, PPG1, PPG2, Expo_A, Expo_B, Expo_C, MEMS_X, MEMS_Y, MEMS_Z, ret, hr, hr_grade\n"); + + _main.debug_print_header = false; + } + + LOG_PRINT("%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %f, %f\n", + ppg_mems_data_alg->ppg_frame_count, ppg_mems_data_alg->duration, ppg_mems_data_alg->touch_flag, + ppg_mems_data_alg->ppg_data.has_data, ppg_mems_data_alg->ppg_data.has_overflow, ppg_mems_data_alg->ppg_data.overflow_num, + ppg_mems_data_alg->ppg_data.data[0], ppg_mems_data_alg->ppg_data.data[1], ppg_mems_data_alg->ppg_data.data[2], + ppg_mems_data_alg->ppg_data.exposure_time[0], ppg_mems_data_alg->ppg_data.exposure_time[1], ppg_mems_data_alg->ppg_data.exposure_time[2], + (int)(ppg_mems_data_alg->MEMS_Data[0]), (int)(ppg_mems_data_alg->MEMS_Data[1]), (int)(ppg_mems_data_alg->MEMS_Data[2]), ret, hr, hr_grader); + +} + +//static void report_spo2_data(const ppg_mems_data_t *ppg_mems_data_alg, int32_t ret, float mySpO2, float myHR, float correlation, float trust_flag, float MEMS_RMS, int data_buf_count_spo2_alg, , float Opt_SpO2, int drop_flag, int ascend_flag, int mems_flag) +static void report_spo2_data(const ppg_mems_data_t *ppg_mems_data_alg, int32_t ret, float myHR, float mySpO2, float correlation, float trust_flag, float MEMS_RMS, int data_buf_count_spo2_alg, uint8_t no_value_reason, float SignalPeriodicity, int time_accu ) +{ + if (_main.debug_print_header == true) + { + + LOG_PRINT("Frame, Time, Touch_Flag, Data_Ready, Overflow_Flag, Overflow_Num, PPG0, PPG1, PPG2, Expo_A, Expo_B, Expo_C, MEMS_X, MEMS_Y, MEMS_Z, ret, spo2, myHR, hr_grader, correlation, MEMS_RMS, trust, no_value_reason, SignalPeriodicity, time_accu \n"); + _main.debug_print_header = false; + } + + if(data_buf_count_spo2_alg>=25) + { + LOG_PRINT("%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %f, %f, %f, %f, %f, %f, %d, %f, %d\n", + ppg_mems_data_alg->ppg_frame_count, ppg_mems_data_alg->duration, ppg_mems_data_alg->touch_flag, + ppg_mems_data_alg->ppg_data.has_data, ppg_mems_data_alg->ppg_data.has_overflow, ppg_mems_data_alg->ppg_data.overflow_num, + ppg_mems_data_alg->ppg_data.data[0], ppg_mems_data_alg->ppg_data.data[1], ppg_mems_data_alg->ppg_data.data[2], + ppg_mems_data_alg->ppg_data.exposure_time[0], ppg_mems_data_alg->ppg_data.exposure_time[1], ppg_mems_data_alg->ppg_data.exposure_time[2], + (int)(ppg_mems_data_alg->MEMS_Data[0]), (int)(ppg_mems_data_alg->MEMS_Data[1]), (int)(ppg_mems_data_alg->MEMS_Data[2]), ret, mySpO2,myHR,hr_grader,correlation, MEMS_RMS,trust_flag,no_value_reason,SignalPeriodicity, time_accu); + } + else + { + LOG_PRINT("%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d\n", + ppg_mems_data_alg->ppg_frame_count, ppg_mems_data_alg->duration, ppg_mems_data_alg->touch_flag, + ppg_mems_data_alg->ppg_data.has_data, ppg_mems_data_alg->ppg_data.has_overflow, ppg_mems_data_alg->ppg_data.overflow_num, + ppg_mems_data_alg->ppg_data.data[0], ppg_mems_data_alg->ppg_data.data[1], ppg_mems_data_alg->ppg_data.data[2], + ppg_mems_data_alg->ppg_data.exposure_time[0], ppg_mems_data_alg->ppg_data.exposure_time[1], ppg_mems_data_alg->ppg_data.exposure_time[2], + (int)(ppg_mems_data_alg->MEMS_Data[0]), (int)(ppg_mems_data_alg->MEMS_Data[1]), (int)(ppg_mems_data_alg->MEMS_Data[2]), ret); + + + } +} + + +static void report_stress_data(const ppg_mems_data_t *ppg_mems_data_alg, uint8_t Stress_ReadyFlag, uint32_t measuretime, float collect_time) +{ + if (_main.debug_print_header == true) + { + LOG_PRINT("Frame, Time, Touch_Flag, Data_Ready, Overflow_Flag, Overflow_Num, PPG0, PPG1, PPG2, Expo_A, Expo_B, Expo_C, MEMS_X, MEMS_Y, MEMS_Z, Stress_Ready, measure_time, collect_time\n"); + + _main.debug_print_header = false; + } + + LOG_PRINT("%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %f\n", + ppg_mems_data_alg->ppg_frame_count, ppg_mems_data_alg->duration, ppg_mems_data_alg->touch_flag, + ppg_mems_data_alg->ppg_data.has_data, ppg_mems_data_alg->ppg_data.has_overflow, ppg_mems_data_alg->ppg_data.overflow_num, + ppg_mems_data_alg->ppg_data.data[0], ppg_mems_data_alg->ppg_data.data[1], ppg_mems_data_alg->ppg_data.data[2], + ppg_mems_data_alg->ppg_data.exposure_time[0], ppg_mems_data_alg->ppg_data.exposure_time[1], ppg_mems_data_alg->ppg_data.exposure_time[2], + (int)(ppg_mems_data_alg->MEMS_Data[0]), (int)(ppg_mems_data_alg->MEMS_Data[1]), (int)(ppg_mems_data_alg->MEMS_Data[2]), Stress_ReadyFlag,duration_total, _hrv_state.collect_duration ); + +} +#ifdef PPG_MEMS_Synchronize +uint8_t get_ppg_data_num(void) +{ + return ppg_data_num; +} +void clear_ppg_data_num(void) +{ + ppg_data_num = 0; +} + +void mems_interpolation(int16_t *mems_int_data_in,uint8_t mems_num,uint8_t ppg_num) +{ + + // Customer Define MEMS-input X, Y, Z + // Put data in mems_int_data_in ,and mems_count + // Then call the PXI_MEMS_interp to do interpolation + + PXI_MEMS_interp(mems_int_data_in, mems_num, mems_int_data_out, ppg_num); + +} +#endif + +static void error_handle(void) +{ + while (true) + { + } +} + + + +uint16_t pah8009_get_chip_id(void) +{ + uint16_t product_id = 0; + pah_800x_get_product_id(&product_id); + return product_id; +} + +int32_t pah8009_get_factory_data(void) +{ + int32_t data = factory_data; + factory_data = 0; + return data; +} + +void pah8009_int_handler(void) +{ + timeout = 1; + ppg_interrupt_handle(); + ppg_sensor_task_interrupt(); + + if(work_mode == 1) + { + // PRINT("hr_alg_task \n"); + hr_alg_task(); + } + else if(work_mode == 2) + { + // PRINT("spo2_alg_task \n"); + spo2_alg_task(); + } + +} + +void pah8009_timer_handler(void) +{ + ppg_sensor_task_polling(); + + if(work_mode == 1) + { + // PRINT("hr_alg_task \n"); + hr_alg_task(); + } + else if(work_mode == 2) + { + // PRINT("spo2_alg_task \n"); + spo2_alg_task(); + } + +} + +static void pah8009_timer_callback(void) +{ + // printf("pah8009_timer_callback \n"); +#ifdef SUPPORT_PPG_SERVICE + send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_DO_PPG_HRS_TIMER_CALLBACK); +#endif +} + +static void pah8009_timer_init(void) +{ + if(g_pah8009_timer == NULL) + g_pah8009_timer = osTimerNew((osTimerFunc_t)pah8009_timer_callback, osTimerPeriodic, NULL, NULL); +} + +void pah8009_check_int(void) +{ +#if INTERRUPT_MODE + if(work_mode != 1) + { + // printf("work_mode != 1\n"); + return; + } + + if(!timeout) + { + // printf("pah8009_check_int \n"); + pah8009_int_handler(); + } + else + { + timeout = 0; + } +#endif +} + +void pah8009_reset(void) +{ + pah_sensor_stop(); + pah_sensor_init(diw_4mm_g_ir_hrd); + ppg_only_sensor_start(); +} + +void pah8009_control(char *mode,uint8_t enable) +{ + // printf("mode : %s ,enable : %d\n",mode,enable); + if(!enable) + { +#if POLLING_MODE + if(g_pah8009_timer != NULL) + osTimerStop(g_pah8009_timer); +#endif + pah_sensor_stop(); + work_mode = 0; + if(uapi_dev_runtime_get_sleep_monitoring_status() && uapi_dev_runtime_get_hrs_passivity_flag()) + { + pah8009_wearstatus_update(history_wear_status); + uapi_dev_runtime_set_hrs_passivity(0); + } + } + else + { +#if POLLING_MODE + pah8009_timer_init(); +#endif + + time_cnt = 0; + + if (strcmp(mode, "hrs") == 0) { + pah_sensor_init(diw_4mm_g_ir_hrd); + // auto_mode_sensor_start(); + work_mode = 1; + // touch_only_sensor_start(); + ppg_only_sensor_start(); +#if POLLING_MODE + time_out = 30; +#endif + } else if (strcmp(mode, "hrv") == 0) { + // md = HRV_MODE; + } else if (strcmp(mode, "spo2") == 0) { + // md = SPO2_MODE; + pah_sensor_init(diw_4mm_ir_r_ir_spo2); + ppg_only_sensor_start(); + work_mode = 2; +#if POLLING_MODE + time_out = 30; +#endif + } else if (strcmp(mode, "leaklight") == 0) { + // md = FT_LEAK_LIGHT_MODE; + factory_test_mode(factory_test_leak_light_target_sample, 0, 0, 0, 0); + // extern void test_library_HRD(void); + // test_library_HRD(); + } else if (strcmp(mode, "wear") == 0) { + pah_sensor_init(diw_4mm_g_ir_hrd); + touch_only_sensor_start(); +#if POLLING_MODE + time_out = 5000; +#endif + } +#if POLLING_MODE + if(g_pah8009_timer != NULL) + osTimerStart(g_pah8009_timer,time_out); +#endif + } +} + +uint8_t pah8009_get_hrs(void) +{ + return avg_hrs; +} + +uint8_t pah8009_get_spo2(void) +{ + return (uint8_t)mySpO2; +} + +uint8_t pah8009_get_wear_status(void) +{ + return history_wear_status; +} \ No newline at end of file diff --git a/code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah800x_main.h b/code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah800x_main.h new file mode 100644 index 000000000..19cb4bce8 --- /dev/null +++ b/code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah800x_main.h @@ -0,0 +1,197 @@ +#ifndef __pah_800x_main_h__ +#define __pah_800x_main_h__ + +// pah +#include "pah_800x.h" +#include "pah_unit.h" +#include "pah_800x_config.h" + + + +//static hr algotirhm +#include "pxialg.h" + +// spo2 algorithm +#include "pxialg_spo2.h" + +// Stress algorithm +#include "pxialg_hrv.h" +#ifdef PPG_MEMS_Synchronize +//MEMS-INT +#include "pxi_interp.h" +#endif +//============================================================================ +// Functions +//============================================================================ +#ifdef __cplusplus +extern "C" { +#endif + + +//============================================================================ +// Definition +//============================================================================ +#ifdef PPG_MEMS_Synchronize +#define FIFO_SIZE 50 //FIFO Size is dependent on the CPU performance +#else +#define FIFO_SIZE 8 //FIFO Size is dependent on the CPU performance +#endif + +//============================================================================ +// Type Definition +//============================================================================ +#pragma pack(1) +typedef struct raw_data_13bytes_t +{ + uint8_t loss; + uint32_t rawData; + uint8_t non_zero1; + uint8_t non_zero2; + uint8_t non_zero3; + uint8_t frame_count; + uint8_t time; + uint8_t rsv; + uint8_t touch; + uint8_t rsv2; +} sRaw_Data_13Bytes; + +typedef enum { + MSG_ALG_NOCHANGE = 0, + MSG_ALG_ENABLE, + MSG_ALG_DISABLE, +} alg_msg_code_t; +#pragma pack() + +typedef enum +{ + pc_4mm_2g_ir_hrd, // PC 4.25mm for HRD wear + diw_4mm_g_ir_hrd, // DI+WALL 4.25mm for HRD hrs + diw_4mm_ir_r_ir_spo2, // DI+WALL 4.25mm for SPO2 spo2 + pc_22mm_2g_ir_hrd, // PC 2.2mm for HRD + di_18mm_g_g_hrd, // DI 1.8mm for HRD + +} reg_config_type; + +typedef struct { + + volatile bool has_interrupt; + volatile uint64_t interrupt_timestamp; + + // pah + pah_800x pah_800x; + + bool is_Auto_mode; + // ppg + bool ppg_is_enabled; + //bool ppg_only_is_enabled; + bool ppg_has_prev_report_timestamp; + uint64_t ppg_prev_report_timestamp; + uint8_t ppg_frame_count; + + // touch + bool touch_is_enabled; + //bool touch_only_is_enabled; + int touch_last_is_touched; + + // alg + uint8_t alg_is_enabled; + bool hr_is_enabled; + bool spo2_is_enabled; + bool stress_is_enable; + // debug + bool debug_print_header; + uint8_t debug_frame_count; + +} main_state; + +typedef struct { + float MEMS_Data[3] ; + pah_800x_ppg_data ppg_data; + uint8_t touch_flag; + uint8_t duration; + uint8_t ppg_frame_count; + //pah_800x_touch_data touch_data; +} ppg_mems_data_t; + + + + + +//============================================================================ +// Public function +//============================================================================ +void pah_sensor_init(reg_config_type type); +void touch_only_sensor_start(void); +void ppg_only_sensor_start(void); +void auto_mode_sensor_start(void); +void pah_sensor_stop(void); +void ppg_interrupt_handle(void); +void ppg_sensor_task_interrupt(void); +void ppg_sensor_task_polling(void); + + +bool isFIFOEmpty(void); +bool pah_push(ppg_mems_data_t *data); +bool pah_pop(ppg_mems_data_t *data); + + +uint8_t Check_alg_enable(void); +void Clear_alg_enable(void); + +//HRD +void hr_algorithm_enable(void); +void hr_algorithm_disable(void); +void hr_alg_task(void); +void hr_alg_task2(uint8_t ppg_num); + +//SPO2 +void spo2_algorithm_enable(void); +void spo2_algorithm_disable(void); +void spo2_alg_task(void); +void spo2_alg_task2(uint8_t ppg_num); + +//Stress +void stress_algorithm_enable(void); +void stress_algorithm_disable(void); +//void stress_alg_task(void); +void stress_alg_task(int grade); + +uint16_t pah8009_get_chip_id(void); +void pah8009_control(char *mode,uint8_t enable); +int32_t pah8009_get_factory_data(void); +void pah8009_int_handler(void); +void pah8009_check_int(void); + +uint8_t pah8009_get_hrs(void); +uint8_t pah8009_get_spo2(void); +uint8_t pah8009_get_wear_status(void); + +/** + * @brief Macro to be used in a formatted string to a pass float number to the log. + * + * Macro should be used in formatted string instead of the %f specifier together with + * @ref LOG_FLOAT macro. + * Example: LOG_INFO("My float number" LOG_FLOAT_MARKER "\r\n", LOG_FLOAT(f))) + */ +#define LOG_FLOAT_MARKER "%c%d.%05d" + +/** + * @brief Macro for dissecting a float number into two numbers (integer and residuum). + */ +#define LOG_FLOAT(val) ((val >= 0.0f)?32:45),(int32_t)((val >= 0.0f)?val:val*-1) , (int32_t)(((val > 0) ? (val) - (int32_t)(val): (int32_t)(val) - (val))*100000) + + + +#ifdef PPG_MEMS_Synchronize +//MEMS Interpolation +//void mems_interpolation(uint8_t ppg_num); +void mems_interpolation(int16_t *mems_int_data_in,uint8_t mems_count,uint8_t ppg_num); +uint8_t get_ppg_data_num(void); +void clear_ppg_data_num(void); +#endif + +#ifdef __cplusplus +} +#endif + +#endif // header guard diff --git a/code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah_8009_reg_arr_default_20220623.h b/code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah_8009_reg_arr_default_20220623.h new file mode 100644 index 000000000..a05c1c17f --- /dev/null +++ b/code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah_8009_reg_arr_default_20220623.h @@ -0,0 +1,491 @@ +#ifndef __pah_8009_reg_arr_default_h__ +#define __pah_8009_reg_arr_default_h__ + +// c +#include + +//pah +#include "pah_800x_config.h" + + +static const uint8_t PAH8009_REG_DEVICE_INIT[][2] = { +// { 0xEE,0x07 }, //SW RESET + { 0xD1,0xD0 },//{R_GPIO_0_IEB, R_GPIO_1_IEB, R_GPIO_0_OEB, R_GPIO_1_OEB, R_GPIO_0_PULLL_EnH, R_GPIO_1_PULLL_EnH, R_GPIO_0_PULLH_EnH, R_GPIO_1_PULLH_EnH}; + { 0xD2,0x00+R_GPIO_SLEW+R_GPIO_0_OD_EnH },//R_GPIO_0_Open_Drain_EnH(0xD2[5]), 1(0x20):GPIO default open-drain mode, 0(0x00):GPIO debug mode + { 0xD3,0x20 },//GPIO debug select + { 0xD6,0x00+R_I2C_SLEW },//{Dummy, R_I2C_SLEW, Dummy[5:0]} +#if (INT_OD_EXTERNAL_PULLH) + { 0xD1,0xD0 },//{R_GPIO_0_IEB, R_GPIO_1_IEB, R_GPIO_0_OEB, R_GPIO_1_OEB, R_GPIO_0_PULLL_EnH, R_GPIO_1_PULLL_EnH, R_GPIO_0_PULLH_EnH, R_GPIO_1_PULLH_EnH}; + { 0xD2,0x20+R_GPIO_SLEW },//R_GPIO_0_Open_Drain_EnH(0xD2[5]), 1(0x20):GPIO default open-drain mode, 0(0x00):GPIO debug mode + { 0xD3,0x00 },//GPIO debug select + { 0xD6,0x00+R_I2C_SLEW },//{Dummy, R_I2C_SLEW, Dummy[5:0]} +#endif +#if (INT_OD_INTERNAL_PULLH) + { 0xD1,0xD2 },//{R_GPIO_0_IEB, R_GPIO_1_IEB, R_GPIO_0_OEB, R_GPIO_1_OEB, R_GPIO_0_PULLL_EnH, R_GPIO_1_PULLL_EnH, R_GPIO_0_PULLH_EnH, R_GPIO_1_PULLH_EnH}; + { 0xD2,0x20+R_GPIO_SLEW },//R_GPIO_0_Open_Drain_EnH(0xD2[5]), 1(0x20):GPIO default open-drain mode, 0(0x00):GPIO debug mode + { 0xD3,0x00 },//GPIO debug select + { 0xD6,0x00+R_I2C_SLEW },//{Dummy, R_I2C_SLEW, Dummy[5:0]} +#endif +#if (INT_PUP_WITHOUT_PULLH) + { 0xD1,0xD0 },//{R_GPIO_0_IEB, R_GPIO_1_IEB, R_GPIO_0_OEB, R_GPIO_1_OEB, R_GPIO_0_PULLL_EnH, R_GPIO_1_PULLL_EnH, R_GPIO_0_PULLH_EnH, R_GPIO_1_PULLH_EnH}; + { 0xD2,0x00+R_GPIO_SLEW },//R_GPIO_0_Open_Drain_EnH(0xD2[5]), 1(0x20):GPIO default open-drain mode, 0(0x00):GPIO debug mode + { 0xD3,0x00 },//GPIO debug select + { 0xD6,0x00+R_I2C_SLEW },//{Dummy, R_I2C_SLEW, Dummy[5:0]} +#endif +// { 0xD6,0x30 },//{Dummy, R_I2C_SLEW, R_I2C_DRV[1:0], Dummy[3:0]} +// { 0xD5,0x44 },//IO-level(I2C), 44:3.3V, 00:1.8V +// { 0xB2,0x25 }, + { 0x55,0x24 },//Soft Reset:04 Hard Reset:24 + { 0x52,0x12 },//VDDAY=1.63V +// { 0xA6,0xF7 },//Cmd_vdday_pwrsv_sel_EnH=0 + { 0xAE,0x3F },//R_LPO_Cali_mode=1 + { 0x20,0x05 },//Clear INT +}; +#ifndef LED_SUPPLIER_NEW +#ifdef DI_WALL_4mm +#define PPG_SETTING_VERSION 0x01 +#endif +#if (DIW_4MM_G_IR_HRD==1) +static const uint8_t PAH8009_REG_DIW_4MM_G_IR_PPG[][2] = { + //{ 0xEE,0x07 }, + { 0x03,0x40 },//Golden report period[7:0] (1T=31.25us) + { 0x04,0x06 },//Golden report period[15:8] + { 0x05,0x00 },//Golden report period[19:16] + { 0x12,0x01 },//ChC_report_divider[7:0] + { 0x13,0x00 },//ChC_report_divider[9:8] + { 0x08,0xE8 },//A period + { 0x09,0x03 },//A period + { 0x0A,0x00 },//B period + { 0x0B,0x08 },//B period + { 0x0C,0x00 },//C period + { 0x0D,0x01 },//C period + { 0x0E,0x04 },//RDB_FrameNum_A[6:0] + { 0x0F,0x08 },//RDB_FrameNum_B[6:0] + { 0x10,0x01 },//RDB_FrameNum_C[6:0] + { 0x11,0x76 },//{R_OnOff_mode_C_EnH, R_OnOff_mode_B_EnH, R_OnOff_mode_A_EnH, R_ChC_EnH, R_ChB_EnH, R_ChA_EnH} + { 0x14,0x12 },//{RDB_ChA_congain_sel[1:0], Dummy[0], R_LEDDAC_code0[4:0]} + { 0x15,0x04 },//{RDB_ChB_congain_sel[1:0], Dummy[0], R_LEDDAC_code1[4:0]} + { 0x16,0x92 },//{RDB_ChC_congain_sel[1:0], Dummy[0], R_LEDDAC_code2[4:0]} + { 0x17,0x58 },//RDB_expo_A[7:0] + { 0x18,0x02 },//RDB_expo_A[15:8] + { 0x19,0x00 },//RDB_expo_B[7:0] + { 0x1A,0x01 },//RDB_expo_B[15:8] + { 0x1B,0x20 },//RDB_expo_C[7:0] + { 0x1C,0x00 },//RDB_expo_C[15:8] + { 0x1D,0x1F },//{R_ChA_LED_EnH[2:0], R_ChA_Pixel_EnH[3:0]}, [3]:pixel3, [2]:pixel2, [1]:pixel1, [0]:pixel0, enable high + { 0x1E,0x2F },//{R_ChB_LED_EnH[2:0], R_ChB_Pixel_EnH[3:0]}, [3]:pixel3, [2]:pixel2, [1]:pixel1, [0]:pixel0, enable high + { 0x1F,0x1F },//{R_ChC_LED_EnH[2:0], R_ChC_Pixel_EnH[3:0]}, [3]:pixel3, [2]:pixel2, [1]:pixel1, [0]:pixel0, enable high + { 0x22,0xF7 },//RDB_Int_En[7:0], [2]:touch flag [1]:overflow [0]:data ready + { 0x26,0x20 },//{R_ADCdata_C_Sel[1:0], R_ADCdata_B_Sel[1:0], R_ADCdata_A_Sel[1:0]}, 0:on, 1:off(需開On-Off), 2:on-off(需開On-Off) + { 0x49,0x11 },//RDB_Touch_EnH + { 0x4A,0x00 },//R_TouchDetection_Th_Hi[7:0] + { 0x4B,0x07 },//R_TouchDetection_Th_Hi[13:8] + { 0x4C,0x00 },//R_TouchDetection_Th_Low[7:0] + { 0x4D,0x05 },//R_TouchDetection_Th_Low[13:8] + { 0x4E,0x00 },//R_TouchDetection_Count_Th[4:0] + { 0x4F,0x00 },//R_NoTouchDetection_Count_Th[4:0] +// #ifdef TOUCH_DETECT_TRH_1 +// { 0x4C,0x20 },//R_TouchDetection_Th_Low[7:0] +// { 0x4D,0x03 },//R_TouchDetection_Th_Low[13:8] //1800 ir阈值 +// #else +// { 0x4C,0x00 },//R_TouchDetection_Th_Low[7:0] //1280 ir阈值 +// { 0x4D,0x05 },//R_TouchDetection_Th_Low[13:8] +// #endif + { 0xEB,0x80 },//update_flag +}; + +static const uint8_t PAH8009_REG_DIW_4MM_G_IR_TOUCH[][2] = { + //{ 0xEE,0x07 }, + { 0x03,0x40 },//Golden report period[7:0] (1T=31.25us) + { 0x04,0x06 },//Golden report period[15:8] + { 0x05,0x00 },//Golden report period[19:16] + { 0x12,0x01 },//ChC_report_divider[7:0] + { 0x13,0x00 },//ChC_report_divider[9:8] + { 0x0C,0x00 },//C period + { 0x0D,0x01 },//C period + { 0x10,0x01 },//RDB_FrameNum_C[6:0] + { 0x11,0x44 },//{R_OnOff_mode_C_EnH, R_OnOff_mode_B_EnH, R_OnOff_mode_A_EnH, R_ChC_EnH, R_ChB_EnH, R_ChA_EnH} + { 0x16,0x92 },//{RDB_ChC_congain_sel[1:0], Dummy[0], R_LEDDAC_code2[4:0]} + { 0x1B,0x20 },//RDB_expo_C[7:0] + { 0x1C,0x00 },//RDB_expo_C[15:8] + { 0x1F,0x1F },//{R_ChC_LED_EnH[2:0], R_ChC_Pixel_EnH[3:0]}, [3]:pixel3, [2]:pixel2, [1]:pixel1, [0]:pixel0, enable high + { 0x22,0x04 },//RDB_Int_En[7:0], [2]:touch flag [1]:overflow [0]:data ready + { 0x26,0x20 },//{R_ADCdata_C_Sel[1:0], R_ADCdata_B_Sel[1:0], R_ADCdata_A_Sel[1:0]}, 0:on, 1:off(需開On-Off), 2:on-off(需開On-Off) + { 0x49,0x11 },//RDB_Touch_EnH + { 0x4A,0x00 },//R_TouchDetection_Th_Hi[7:0] + { 0x4B,0x07 },//R_TouchDetection_Th_Hi[13:8] + { 0x4C,0x00 },//R_TouchDetection_Th_Low[7:0] + { 0x4D,0x05 },//R_TouchDetection_Th_Low[13:8] + { 0x4E,0x00 },//R_TouchDetection_Count_Th[4:0] + { 0x4F,0x00 },//R_NoTouchDetection_Count_Th[4:0] + { 0xEB,0x80 },//update_flag +}; +#endif +#if (DIW_4MM_IR_R_IR_SPO2==1) +static const uint8_t PAH8009_REG_DIW_4MM_IR_R_IR_PPG[][2] = { + //{ 0xEE,0x07 }, + { 0x03,0x00 },//Golden report period[7:0] (1T=31.25us) + { 0x04,0x05 },//Golden report period[15:8] + { 0x05,0x00 },//Golden report period[19:16] + { 0x12,0x01 },//ChC_report_divider[7:0] + { 0x13,0x00 },//ChC_report_divider[9:8] + { 0x08,0x00 },//A period + { 0x09,0x01 },//A period + { 0x0A,0x00 },//B period + { 0x0B,0x01 },//B period + { 0x0C,0x00 },//C period + { 0x0D,0x01 },//C period + { 0x0E,0x40 },//RDB_FrameNum_A[6:0] + { 0x0F,0x40 },//RDB_FrameNum_B[6:0] + { 0x10,0x01 },//RDB_FrameNum_C[6:0] + { 0x11,0x77 },//{R_OnOff_mode_C_EnH, R_OnOff_mode_B_EnH, R_OnOff_mode_A_EnH, R_ChC_EnH, R_ChB_EnH, R_ChA_EnH} + { 0x14,0x52 },//{RDB_ChA_congain_sel[1:0], Dummy[0], R_LEDDAC_code0[4:0]} + { 0x15,0x44 },//{RDB_ChB_congain_sel[1:0], Dummy[0], R_LEDDAC_code1[4:0]} + { 0x16,0x84 },//{RDB_ChC_congain_sel[1:0], Dummy[0], R_LEDDAC_code2[4:0]} + { 0x17,0x40 },//RDB_expo_A[7:0] + { 0x18,0x00 },//RDB_expo_A[15:8] + { 0x19,0x40 },//RDB_expo_B[7:0] + { 0x1A,0x00 },//RDB_expo_B[15:8] + { 0x1B,0x20 },//RDB_expo_C[7:0] + { 0x1C,0x00 },//RDB_expo_C[15:8] + { 0x1D,0x1F },//{R_ChA_LED_EnH[2:0], R_ChA_Pixel_EnH[3:0]}, [3]:pixel3, [2]:pixel2, [1]:pixel1, [0]:pixel0, enable high + { 0x1E,0x4F },//{R_ChB_LED_EnH[2:0], R_ChB_Pixel_EnH[3:0]}, [3]:pixel3, [2]:pixel2, [1]:pixel1, [0]:pixel0, enable high + { 0x1F,0x1F },//{R_ChC_LED_EnH[2:0], R_ChC_Pixel_EnH[3:0]}, [3]:pixel3, [2]:pixel2, [1]:pixel1, [0]:pixel0, enable high + { 0x22,0xF7 },//RDB_Int_En[7:0], [2]:touch flag [1]:overflow [0]:data ready + { 0x26,0x20 },//{R_ADCdata_C_Sel[1:0], R_ADCdata_B_Sel[1:0], R_ADCdata_A_Sel[1:0]}, 0:on, 1:off(需開On-Off), 2:on-off(需開On-Off) + { 0x49,0x11 },//RDB_Touch_EnH + { 0x4A,0x00 },//R_TouchDetection_Th_Hi[7:0] + { 0x4B,0x07 },//R_TouchDetection_Th_Hi[13:8] + { 0x4C,0x00 },//R_TouchDetection_Th_Low[7:0] + { 0x4D,0x05 },//R_TouchDetection_Th_Low[13:8] + { 0x4E,0x00 },//R_TouchDetection_Count_Th[4:0] + { 0x4F,0x00 },//R_NoTouchDetection_Count_Th[4:0] + { 0xEB,0x80 },//update_flag +}; + + +static const uint8_t PAH8009_REG_DIW_4MM_IR_R_IR_TOUCH[][2] = { + //{ 0xEE,0x07 }, + { 0x03,0x00 },//Golden report period[7:0] (1T=31.25us) + { 0x04,0x05 },//Golden report period[15:8] + { 0x05,0x00 },//Golden report period[19:16] + { 0x12,0x01 },//ChC_report_divider[7:0] + { 0x13,0x00 },//ChC_report_divider[9:8] + { 0x0C,0x00 },//C period + { 0x0D,0x01 },//C period + { 0x10,0x01 },//RDB_FrameNum_C[6:0] + { 0x11,0x44 },//{R_OnOff_mode_C_EnH, R_OnOff_mode_B_EnH, R_OnOff_mode_A_EnH, R_ChC_EnH, R_ChB_EnH, R_ChA_EnH} + { 0x16,0x92 },//{RDB_ChC_congain_sel[1:0], Dummy[0], R_LEDDAC_code2[4:0]} + { 0x1B,0x20 },//RDB_expo_C[7:0] + { 0x1C,0x00 },//RDB_expo_C[15:8] + { 0x1F,0x1F },//{R_ChC_LED_EnH[2:0], R_ChC_Pixel_EnH[3:0]}, [3]:pixel3, [2]:pixel2, [1]:pixel1, [0]:pixel0, enable high + { 0x22,0x04 },//RDB_Int_En[7:0], [2]:touch flag [1]:overflow [0]:data ready + { 0x26,0x20 },//{R_ADCdata_C_Sel[1:0], R_ADCdata_B_Sel[1:0], R_ADCdata_A_Sel[1:0]}, 0:on, 1:off(需開On-Off), 2:on-off(需開On-Off) + { 0x49,0x11 },//RDB_Touch_EnH + { 0x4A,0x00 },//R_TouchDetection_Th_Hi[7:0] + { 0x4B,0x07 },//R_TouchDetection_Th_Hi[13:8] + { 0x4C,0x00 },//R_TouchDetection_Th_Low[7:0] + { 0x4D,0x05 },//R_TouchDetection_Th_Low[13:8] + { 0x4E,0x00 },//R_TouchDetection_Count_Th[4:0] + { 0x4F,0x00 },//R_NoTouchDetection_Count_Th[4:0] + { 0xEB,0x80 },//update_flag +}; + +#endif + +#if (PC_4MM_2G_IR_HRD==1) +#ifdef PC_4mm +#define PPG_SETTING_VERSION 0x11 +#endif +static const uint8_t PAH8009_REG_PC_4MM_2G_IR_PPG[][2] = { + //{ 0xEE,0x07 }, + { 0x03,0x40 },//Golden report period[7:0] (1T=31.25us) + { 0x04,0x06 },//Golden report period[15:8] + { 0x05,0x00 },//Golden report period[19:16] + { 0x12,0x01 },//ChC_report_divider[7:0] + { 0x13,0x00 },//ChC_report_divider[9:8] + { 0x08,0xE8 },//A period + { 0x09,0x03 },//A period + { 0x0A,0x00 },//B period + { 0x0B,0x08 },//B period + { 0x0C,0x00 },//C period + { 0x0D,0x01 },//C period + { 0x0E,0x04 },//RDB_FrameNum_A[6:0] + { 0x0F,0x08 },//RDB_FrameNum_B[6:0] + { 0x10,0x01 },//RDB_FrameNum_C[6:0] + { 0x11,0x76 },//{R_OnOff_mode_C_EnH, R_OnOff_mode_B_EnH, R_OnOff_mode_A_EnH, R_ChC_EnH, R_ChB_EnH, R_ChA_EnH} + { 0x14,0x12 },//{RDB_ChA_congain_sel[1:0], Dummy[0], R_LEDDAC_code0[4:0]} + { 0x15,0x44 },//{RDB_ChB_congain_sel[1:0], Dummy[0], R_LEDDAC_code1[4:0]} + { 0x16,0xC4 },//{RDB_ChC_congain_sel[1:0], Dummy[0], R_LEDDAC_code2[4:0]} + { 0x17,0x58 },//RDB_expo_A[7:0] + { 0x18,0x02 },//RDB_expo_A[15:8] + { 0x19,0x00 },//RDB_expo_B[7:0] + { 0x1A,0x01 },//RDB_expo_B[15:8] + { 0x1B,0x28 },//RDB_expo_C[7:0] + { 0x1C,0x00 },//RDB_expo_C[15:8] + { 0x1D,0x1F },//{R_ChA_LED_EnH[2:0], R_ChA_Pixel_EnH[3:0]}, [3]:pixel3, [2]:pixel2, [1]:pixel1, [0]:pixel0, enable high + { 0x1E,0x6F },//{R_ChB_LED_EnH[2:0], R_ChB_Pixel_EnH[3:0]}, [3]:pixel3, [2]:pixel2, [1]:pixel1, [0]:pixel0, enable high + { 0x1F,0x1F },//{R_ChC_LED_EnH[2:0], R_ChC_Pixel_EnH[3:0]}, [3]:pixel3, [2]:pixel2, [1]:pixel1, [0]:pixel0, enable high + { 0x22,0xF7 },//RDB_Int_En[7:0], [2]:touch flag [1]:overflow [0]:data ready + { 0x26,0x20 },//{R_ADCdata_C_Sel[1:0], R_ADCdata_B_Sel[1:0], R_ADCdata_A_Sel[1:0]}, 0:on, 1:off(需開On-Off), 2:on-off(需開On-Off) + { 0x49,0x11 },//RDB_Touch_EnH + { 0x4A,0x00 },//R_TouchDetection_Th_Hi[7:0] + { 0x4B,0x07 },//R_TouchDetection_Th_Hi[13:8] + { 0x4C,0x00 },//R_TouchDetection_Th_Low[7:0] + { 0x4D,0x05 },//R_TouchDetection_Th_Low[13:8] + { 0x4E,0x00 },//R_TouchDetection_Count_Th[4:0] + { 0x4F,0x00 },//R_NoTouchDetection_Count_Th[4:0] + { 0xEB,0x80 },//update_flag +}; + +static const uint8_t PAH8009_REG_PC_4MM_2G_IR_TOUCH[][2] = { + //{ 0xEE,0x07 }, + { 0x03,0x40 },//Golden report period[7:0] (1T=31.25us) + { 0x04,0x06 },//Golden report period[15:8] + { 0x05,0x00 },//Golden report period[19:16] + { 0x12,0x01 },//ChC_report_divider[7:0] + { 0x13,0x00 },//ChC_report_divider[9:8] + { 0x0C,0x00 },//C period + { 0x0D,0x01 },//C period + { 0x10,0x01 },//RDB_FrameNum_C[6:0] + { 0x11,0x44 },//{R_OnOff_mode_C_EnH, R_OnOff_mode_B_EnH, R_OnOff_mode_A_EnH, R_ChC_EnH, R_ChB_EnH, R_ChA_EnH} + { 0x16,0xD2 },//{RDB_ChC_congain_sel[1:0], Dummy[0], R_LEDDAC_code2[4:0]} + { 0x1B,0x28 },//RDB_expo_C[7:0] + { 0x1C,0x00 },//RDB_expo_C[15:8] + { 0x1F,0x1F },//{R_ChC_LED_EnH[2:0], R_ChC_Pixel_EnH[3:0]}, [3]:pixel3, [2]:pixel2, [1]:pixel1, [0]:pixel0, enable high + { 0x22,0x04 },//RDB_Int_En[7:0], [2]:touch flag [1]:overflow [0]:data ready + { 0x26,0x20 },//{R_ADCdata_C_Sel[1:0], R_ADCdata_B_Sel[1:0], R_ADCdata_A_Sel[1:0]}, 0:on, 1:off(需開On-Off), 2:on-off(需開On-Off) + { 0x49,0x11 },//RDB_Touch_EnH + { 0x4A,0x00 },//R_TouchDetection_Th_Hi[7:0] + { 0x4B,0x07 },//R_TouchDetection_Th_Hi[13:8] + { 0x4C,0x00 },//R_TouchDetection_Th_Low[7:0] + { 0x4D,0x05 },//R_TouchDetection_Th_Low[13:8] + { 0x4E,0x00 },//R_TouchDetection_Count_Th[4:0] + { 0x4F,0x00 },//R_NoTouchDetection_Count_Th[4:0] + { 0xEB,0x80 },//update_flag +}; +#endif + + +#else +#ifdef DI_WALL_4mm +#define PPG_SETTING_VERSION 0x21 +#endif +#if (DIW_4MM_G_IR_HRD==1) +static const uint8_t PAH8009_REG_DIW_4MM_G_IR_PPG[][2] = { + //{ 0xEE,0x07 }, + { 0x03,0x40 },//Golden report period[7:0] (1T=31.25us) + { 0x04,0x06 },//Golden report period[15:8] + { 0x05,0x00 },//Golden report period[19:16] + { 0x12,0x01 },//ChC_report_divider[7:0] + { 0x13,0x00 },//ChC_report_divider[9:8] + { 0x08,0xE8 },//A period + { 0x09,0x03 },//A period + { 0x0A,0x00 },//B period + { 0x0B,0x08 },//B period + { 0x0C,0x00 },//C period + { 0x0D,0x01 },//C period + { 0x0E,0x04 },//RDB_FrameNum_A[6:0] + { 0x0F,0x08 },//RDB_FrameNum_B[6:0] + { 0x10,0x01 },//RDB_FrameNum_C[6:0] + { 0x11,0x76 },//{R_OnOff_mode_C_EnH, R_OnOff_mode_B_EnH, R_OnOff_mode_A_EnH, R_ChC_EnH, R_ChB_EnH, R_ChA_EnH} + { 0x14,0x12 },//{RDB_ChA_congain_sel[1:0], Dummy[0], R_LEDDAC_code0[4:0]} + { 0x15,0x04 },//{RDB_ChB_congain_sel[1:0], Dummy[0], R_LEDDAC_code1[4:0]} + { 0x16,0x12 },//{RDB_ChC_congain_sel[1:0], Dummy[0], R_LEDDAC_code2[4:0]} + { 0x17,0x58 },//RDB_expo_A[7:0] + { 0x18,0x02 },//RDB_expo_A[15:8] + { 0x19,0x00 },//RDB_expo_B[7:0] + { 0x1A,0x01 },//RDB_expo_B[15:8] + { 0x1B,0x20 },//RDB_expo_C[7:0] + { 0x1C,0x00 },//RDB_expo_C[15:8] + { 0x1D,0x1F },//{R_ChA_LED_EnH[2:0], R_ChA_Pixel_EnH[3:0]}, [3]:pixel3, [2]:pixel2, [1]:pixel1, [0]:pixel0, enable high + { 0x1E,0x2F },//{R_ChB_LED_EnH[2:0], R_ChB_Pixel_EnH[3:0]}, [3]:pixel3, [2]:pixel2, [1]:pixel1, [0]:pixel0, enable high + { 0x1F,0x1F },//{R_ChC_LED_EnH[2:0], R_ChC_Pixel_EnH[3:0]}, [3]:pixel3, [2]:pixel2, [1]:pixel1, [0]:pixel0, enable high + { 0x22,0xF7 },//RDB_Int_En[7:0], [2]:touch flag [1]:overflow [0]:data ready + { 0x26,0x20 },//{R_ADCdata_C_Sel[1:0], R_ADCdata_B_Sel[1:0], R_ADCdata_A_Sel[1:0]}, 0:on, 1:off(需開On-Off), 2:on-off(需開On-Off) + { 0x49,0x11 },//RDB_Touch_EnH + { 0x4A,0x00 },//R_TouchDetection_Th_Hi[7:0] + { 0x4B,0x07 },//R_TouchDetection_Th_Hi[13:8] + { 0x4C,0x00 },//R_TouchDetection_Th_Low[7:0] + { 0x4D,0x05 },//R_TouchDetection_Th_Low[13:8] + { 0x4E,0x00 },//R_TouchDetection_Count_Th[4:0] + { 0x4F,0x00 },//R_NoTouchDetection_Count_Th[4:0] + { 0xEB,0x80 },//update_flag +}; + +static const uint8_t PAH8009_REG_DIW_4MM_G_IR_TOUCH[][2] = { + //{ 0xEE,0x07 }, + { 0x03,0x40 },//Golden report period[7:0] (1T=31.25us) + { 0x04,0x06 },//Golden report period[15:8] + { 0x05,0x00 },//Golden report period[19:16] + { 0x12,0x01 },//ChC_report_divider[7:0] + { 0x13,0x00 },//ChC_report_divider[9:8] + { 0x0C,0x00 },//C period + { 0x0D,0x01 },//C period + { 0x10,0x01 },//RDB_FrameNum_C[6:0] + { 0x11,0x44 },//{R_OnOff_mode_C_EnH, R_OnOff_mode_B_EnH, R_OnOff_mode_A_EnH, R_ChC_EnH, R_ChB_EnH, R_ChA_EnH} + { 0x16,0x12 },//{RDB_ChC_congain_sel[1:0], Dummy[0], R_LEDDAC_code2[4:0]} + { 0x1B,0x20 },//RDB_expo_C[7:0] + { 0x1C,0x00 },//RDB_expo_C[15:8] + { 0x1F,0x1F },//{R_ChC_LED_EnH[2:0], R_ChC_Pixel_EnH[3:0]}, [3]:pixel3, [2]:pixel2, [1]:pixel1, [0]:pixel0, enable high + { 0x22,0x04 },//RDB_Int_En[7:0], [2]:touch flag [1]:overflow [0]:data ready + { 0x26,0x20 },//{R_ADCdata_C_Sel[1:0], R_ADCdata_B_Sel[1:0], R_ADCdata_A_Sel[1:0]}, 0:on, 1:off(需開On-Off), 2:on-off(需開On-Off) + { 0x49,0x11 },//RDB_Touch_EnH + { 0x4A,0x00 },//R_TouchDetection_Th_Hi[7:0] + { 0x4B,0x07 },//R_TouchDetection_Th_Hi[13:8] + { 0x4C,0x00 },//R_TouchDetection_Th_Low[7:0] + { 0x4D,0x05 },//R_TouchDetection_Th_Low[13:8] + { 0x4E,0x00 },//R_TouchDetection_Count_Th[4:0] + { 0x4F,0x00 },//R_NoTouchDetection_Count_Th[4:0] + { 0xEB,0x80 },//update_flag +}; +#endif + +#if (DIW_4MM_IR_R_IR_SPO2==1) +static const uint8_t PAH8009_REG_DIW_4MM_IR_R_IR_PPG[][2] = { + //{ 0xEE,0x07 }, + { 0x03,0x00 },//Golden report period[7:0] (1T=31.25us) + { 0x04,0x05 },//Golden report period[15:8] + { 0x05,0x00 },//Golden report period[19:16] + { 0x12,0x01 },//ChC_report_divider[7:0] + { 0x13,0x00 },//ChC_report_divider[9:8] + { 0x08,0x00 },//A period + { 0x09,0x01 },//A period + { 0x0A,0x00 },//B period + { 0x0B,0x01 },//B period + { 0x0C,0x00 },//C period + { 0x0D,0x01 },//C period + { 0x0E,0x40 },//RDB_FrameNum_A[6:0] + { 0x0F,0x40 },//RDB_FrameNum_B[6:0] + { 0x10,0x01 },//RDB_FrameNum_C[6:0] + { 0x11,0x77 },//{R_OnOff_mode_C_EnH, R_OnOff_mode_B_EnH, R_OnOff_mode_A_EnH, R_ChC_EnH, R_ChB_EnH, R_ChA_EnH} + { 0x14,0x12 },//{RDB_ChA_congain_sel[1:0], Dummy[0], R_LEDDAC_code0[4:0]} + { 0x15,0x04 },//{RDB_ChB_congain_sel[1:0], Dummy[0], R_LEDDAC_code1[4:0]} + { 0x16,0x04 },//{RDB_ChC_congain_sel[1:0], Dummy[0], R_LEDDAC_code2[4:0]} + { 0x17,0x40 },//RDB_expo_A[7:0] + { 0x18,0x00 },//RDB_expo_A[15:8] + { 0x19,0x40 },//RDB_expo_B[7:0] + { 0x1A,0x00 },//RDB_expo_B[15:8] + { 0x1B,0x20 },//RDB_expo_C[7:0] + { 0x1C,0x00 },//RDB_expo_C[15:8] + { 0x1D,0x1F },//{R_ChA_LED_EnH[2:0], R_ChA_Pixel_EnH[3:0]}, [3]:pixel3, [2]:pixel2, [1]:pixel1, [0]:pixel0, enable high + { 0x1E,0x4F },//{R_ChB_LED_EnH[2:0], R_ChB_Pixel_EnH[3:0]}, [3]:pixel3, [2]:pixel2, [1]:pixel1, [0]:pixel0, enable high + { 0x1F,0x1F },//{R_ChC_LED_EnH[2:0], R_ChC_Pixel_EnH[3:0]}, [3]:pixel3, [2]:pixel2, [1]:pixel1, [0]:pixel0, enable high + { 0x22,0xF7 },//RDB_Int_En[7:0], [2]:touch flag [1]:overflow [0]:data ready + { 0x26,0x20 },//{R_ADCdata_C_Sel[1:0], R_ADCdata_B_Sel[1:0], R_ADCdata_A_Sel[1:0]}, 0:on, 1:off(需開On-Off), 2:on-off(需開On-Off) + { 0x49,0x11 },//RDB_Touch_EnH + { 0x4A,0x00 },//R_TouchDetection_Th_Hi[7:0] + { 0x4B,0x07 },//R_TouchDetection_Th_Hi[13:8] + { 0x4C,0x00 },//R_TouchDetection_Th_Low[7:0] + { 0x4D,0x05 },//R_TouchDetection_Th_Low[13:8] + { 0x4E,0x00 },//R_TouchDetection_Count_Th[4:0] + { 0x4F,0x00 },//R_NoTouchDetection_Count_Th[4:0] + { 0xEB,0x80 },//update_flag +}; + +static const uint8_t PAH8009_REG_DIW_4MM_IR_R_IR_TOUCH[][2] = { + //{ 0xEE,0x07 }, + { 0x03,0x00 },//Golden report period[7:0] (1T=31.25us) + { 0x04,0x05 },//Golden report period[15:8] + { 0x05,0x00 },//Golden report period[19:16] + { 0x12,0x01 },//ChC_report_divider[7:0] + { 0x13,0x00 },//ChC_report_divider[9:8] + { 0x0C,0x00 },//C period + { 0x0D,0x01 },//C period + { 0x10,0x01 },//RDB_FrameNum_C[6:0] + { 0x11,0x44 },//{R_OnOff_mode_C_EnH, R_OnOff_mode_B_EnH, R_OnOff_mode_A_EnH, R_ChC_EnH, R_ChB_EnH, R_ChA_EnH} + { 0x16,0x12 },//{RDB_ChC_congain_sel[1:0], Dummy[0], R_LEDDAC_code2[4:0]} + { 0x1B,0x20 },//RDB_expo_C[7:0] + { 0x1C,0x00 },//RDB_expo_C[15:8] + { 0x1F,0x1F },//{R_ChC_LED_EnH[2:0], R_ChC_Pixel_EnH[3:0]}, [3]:pixel3, [2]:pixel2, [1]:pixel1, [0]:pixel0, enable high + { 0x22,0x04 },//RDB_Int_En[7:0], [2]:touch flag [1]:overflow [0]:data ready + { 0x26,0x20 },//{R_ADCdata_C_Sel[1:0], R_ADCdata_B_Sel[1:0], R_ADCdata_A_Sel[1:0]}, 0:on, 1:off(需開On-Off), 2:on-off(需開On-Off) + { 0x49,0x11 },//RDB_Touch_EnH + { 0x4A,0x00 },//R_TouchDetection_Th_Hi[7:0] + { 0x4B,0x07 },//R_TouchDetection_Th_Hi[13:8] + { 0x4C,0x00 },//R_TouchDetection_Th_Low[7:0] + { 0x4D,0x05 },//R_TouchDetection_Th_Low[13:8] + { 0x4E,0x00 },//R_TouchDetection_Count_Th[4:0] + { 0x4F,0x00 },//R_NoTouchDetection_Count_Th[4:0] + { 0xEB,0x80 },//update_flag +}; +#endif + +//China LED + +#if (PC_4MM_2G_IR_HRD==1) +#ifdef PC_4mm +#define PPG_SETTING_VERSION 0x31 +#endif +static const uint8_t PAH8009_REG_PC_4MM_2G_IR_PPG[][2] = { + //{ 0xEE,0x07 }, + { 0x03,0x40 },//Golden report period[7:0] (1T=31.25us) + { 0x04,0x06 },//Golden report period[15:8] + { 0x05,0x00 },//Golden report period[19:16] + { 0x12,0x01 },//ChC_report_divider[7:0] + { 0x13,0x00 },//ChC_report_divider[9:8] + { 0x08,0xE8 },//A period + { 0x09,0x03 },//A period + { 0x0A,0x00 },//B period + { 0x0B,0x08 },//B period + { 0x0C,0x00 },//C period + { 0x0D,0x01 },//C period + { 0x0E,0x04 },//RDB_FrameNum_A[6:0] + { 0x0F,0x08 },//RDB_FrameNum_B[6:0] + { 0x10,0x01 },//RDB_FrameNum_C[6:0] + { 0x11,0x76 },//{R_OnOff_mode_C_EnH, R_OnOff_mode_B_EnH, R_OnOff_mode_A_EnH, R_ChC_EnH, R_ChB_EnH, R_ChA_EnH} + { 0x14,0x12 },//{RDB_ChA_congain_sel[1:0], Dummy[0], R_LEDDAC_code0[4:0]} + { 0x15,0x44 },//{RDB_ChB_congain_sel[1:0], Dummy[0], R_LEDDAC_code1[4:0]} + { 0x16,0x04 },//{RDB_ChC_congain_sel[1:0], Dummy[0], R_LEDDAC_code2[4:0]} + { 0x17,0x58 },//RDB_expo_A[7:0] + { 0x18,0x02 },//RDB_expo_A[15:8] + { 0x19,0x00 },//RDB_expo_B[7:0] + { 0x1A,0x01 },//RDB_expo_B[15:8] + { 0x1B,0x28 },//RDB_expo_C[7:0] + { 0x1C,0x00 },//RDB_expo_C[15:8] + { 0x1D,0x1F },//{R_ChA_LED_EnH[2:0], R_ChA_Pixel_EnH[3:0]}, [3]:pixel3, [2]:pixel2, [1]:pixel1, [0]:pixel0, enable high + { 0x1E,0x6F },//{R_ChB_LED_EnH[2:0], R_ChB_Pixel_EnH[3:0]}, [3]:pixel3, [2]:pixel2, [1]:pixel1, [0]:pixel0, enable high + { 0x1F,0x1F },//{R_ChC_LED_EnH[2:0], R_ChC_Pixel_EnH[3:0]}, [3]:pixel3, [2]:pixel2, [1]:pixel1, [0]:pixel0, enable high + { 0x22,0xF7 },//RDB_Int_En[7:0], [2]:touch flag [1]:overflow [0]:data ready + { 0x26,0x20 },//{R_ADCdata_C_Sel[1:0], R_ADCdata_B_Sel[1:0], R_ADCdata_A_Sel[1:0]}, 0:on, 1:off(需開On-Off), 2:on-off(需開On-Off) + { 0x49,0x11 },//RDB_Touch_EnH + { 0x4A,0x00 },//R_TouchDetection_Th_Hi[7:0] + { 0x4B,0x07 },//R_TouchDetection_Th_Hi[13:8] + { 0x4C,0x00 },//R_TouchDetection_Th_Low[7:0] + { 0x4D,0x05 },//R_TouchDetection_Th_Low[13:8] + { 0x4E,0x00 },//R_TouchDetection_Count_Th[4:0] + { 0x4F,0x00 },//R_NoTouchDetection_Count_Th[4:0] + { 0xEB,0x80 },//update_flag +}; + +static const uint8_t PAH8009_REG_PC_4MM_2G_IR_TOUCH[][2] = { + //{ 0xEE,0x07 }, + { 0x03,0x40 },//Golden report period[7:0] (1T=31.25us) + { 0x04,0x06 },//Golden report period[15:8] + { 0x05,0x00 },//Golden report period[19:16] + { 0x12,0x01 },//ChC_report_divider[7:0] + { 0x13,0x00 },//ChC_report_divider[9:8] + { 0x0C,0x00 },//C period + { 0x0D,0x01 },//C period + { 0x10,0x01 },//RDB_FrameNum_C[6:0] + { 0x11,0x44 },//{R_OnOff_mode_C_EnH, R_OnOff_mode_B_EnH, R_OnOff_mode_A_EnH, R_ChC_EnH, R_ChB_EnH, R_ChA_EnH} + { 0x16,0x12 },//{RDB_ChC_congain_sel[1:0], Dummy[0], R_LEDDAC_code2[4:0]} + { 0x1B,0x28 },//RDB_expo_C[7:0] + { 0x1C,0x00 },//RDB_expo_C[15:8] + { 0x1F,0x1F },//{R_ChC_LED_EnH[2:0], R_ChC_Pixel_EnH[3:0]}, [3]:pixel3, [2]:pixel2, [1]:pixel1, [0]:pixel0, enable high + { 0x22,0x04 },//RDB_Int_En[7:0], [2]:touch flag [1]:overflow [0]:data ready + { 0x26,0x20 },//{R_ADCdata_C_Sel[1:0], R_ADCdata_B_Sel[1:0], R_ADCdata_A_Sel[1:0]}, 0:on, 1:off(需開On-Off), 2:on-off(需開On-Off) + { 0x49,0x11 },//RDB_Touch_EnH + { 0x4A,0x00 },//R_TouchDetection_Th_Hi[7:0] + { 0x4B,0x07 },//R_TouchDetection_Th_Hi[13:8] + { 0x4C,0x00 },//R_TouchDetection_Th_Low[7:0] + { 0x4D,0x05 },//R_TouchDetection_Th_Low[13:8] + { 0x4E,0x00 },//R_TouchDetection_Count_Th[4:0] + { 0x4F,0x00 },//R_NoTouchDetection_Count_Th[4:0] + { 0xEB,0x80 },//update_flag +}; +#endif + +#endif + +#endif // header guard diff --git a/code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah_800x.c b/code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah_800x.c new file mode 100644 index 000000000..da77ddbdc --- /dev/null +++ b/code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah_800x.c @@ -0,0 +1,833 @@ +// pah +#include "pah_800x.h" + + +//============================================================================ +// Private function +//============================================================================ +static bool sensor_has_enabled(pah_800x *state); + +static pah_ret ppg_convergence_toggle(pah_800x *state, bool enable, uint8_t ch_num); + +static pah_ret ppg_reset_exposure(pah_800x *state, uint8_t ch_num); + +//static pah_ret touch_process(pah_800x *state, uint8_t *touch_flag); +static pah_ret ppg_process(pah_800x *state, pah_800x_ppg_data *ppg_result); +static pah_ret clear_interrupt(pah_800x *state, bool has_ppg_interrupt, bool has_overflow); + +static pah_ret ppg_converging(pah_800x *state, uint32_t ppg_value, uint8_t ch_num); +static uint16_t select_new_ppg_exposure(pah_800x *state, uint16_t old_ppg_exposure, uint16_t ppg_value, uint8_t ch_num); + +static bool is_touched(pah_800x *state); +static bool is_not_touched(pah_800x *state); + +static bool ppg_value_is_out_of_outer_bounds(pah_800x *state, uint32_t ppg_data, uint8_t ch_num); +static bool ppg_value_is_out_of_inner_bounds(pah_800x *state, uint16_t ppg_data, uint8_t ch_num); + +static pah_ret pah_800x_sw_reset(pah_800x *state); +///////////////////////////////////////////////////////////////////////////////////////////// + +//// comm + +static pah_ret pah_800x_hal_comm_write(uint8_t addr, const uint8_t *data, size_t write_size); +static pah_ret pah_800x_hal_comm_read(uint8_t addr, uint8_t *data, size_t read_size); + + +//// write +static pah_ret pah_800x_hal_write_reg_arr(const pah_reg_arr *reg_arr); +static pah_ret pah_800x_hal_write_reg_array(const uint8_t reg_array[][2], size_t length); +static pah_ret pah_800x_hal_write_suspend_state(bool suspend); +static pah_ret pah_800x_hal_write_interrupt_clear(void); +static pah_ret pah_800x_hal_write_interrupt_clear_v2(bool int_status_DR_FLAG_b); +static pah_ret pah_800x_hal_write_ppg_overflow_clear(void); +static pah_ret pah_800x_hal_write_exposure(uint16_t exposure, uint8_t ch_num); +static pah_ret pah_800x_hal_tg_toggle(bool enable); +static pah_ret pah_800x_hal_update_flag(void); +static pah_ret pah_800x_hal_write_sw_reset(void); +static pah_ret pah_800x_hal_reset_gpio_state(void); +//// read +static pah_ret pah_800x_hal_read_product_id(uint16_t *product_id); +static pah_ret pah_800x_hal_read_ppg_interrupt(uint8_t *ppg_interrupt); +static pah_ret pah_800x_hal_read_ppg_sync(uint32_t *ppg_data, uint8_t ch_num); +static pah_ret pah_800x_hal_read_ppg_overflow(uint8_t *ppg_overflow, uint8_t *overflow_num); +static pah_ret pah_800x_hal_read_ppg_exposure(uint16_t *als_exposure, uint8_t ch_num); +static pah_ret pah_800x_hal_touch_get_touch_flag(int8_t *touch_flag); +static pah_ret pah_800x_hal_touch_get_touch_info(int8_t *touch_flag,uint16_t *touch_value); + + +static pah_ret pah_800x_hal_check_enable_channel(pah_800x *state, const pah_reg_arr *reg_arr); +static pah_ret comm_write(uint8_t addr, uint8_t data); +static pah_ret pah_800x_hal_read_ppg_adc(uint16_t *ppg_adc, uint8_t ch_num); +static pah_ret pah_800x_hal_read_ppg_frame_period(uint16_t *ppg_frame_period, uint8_t ch_num); + + +//============================================================================ +// Public function +//============================================================================ +uint16_t pah_800x_get_i2c_default_slave_addr(void) +{ + return PAH_800x_DEFAULT_I2C_SLAVE_ID_1; +} + +void pah_800x_get_default_config(pah_800x_config *config) +{ + memset(config, 0, sizeof(*config)); + + config->enable_ppg_convergence[0] = PAH_800x_DEFAULT_ENABLE_PPG_CONVERGENCE; + config->enable_ppg_convergence[1] = PAH_800x_DEFAULT_ENABLE_PPG_CONVERGENCE; + config->enable_ppg_convergence[2] = false; + + config->enable_ppg_reconvergence_if_out_of_bounds[0] = PAH_800x_DEFAULT_ENABLE_PPG_RECONVERGENCE_IF_OUT_OF_BOUNDS; + config->enable_ppg_reconvergence_if_out_of_bounds[1] = PAH_800x_DEFAULT_ENABLE_PPG_RECONVERGENCE_IF_OUT_OF_BOUNDS; + config->enable_ppg_reconvergence_if_out_of_bounds[2] = false; + + for(int ch=0;chppg_convergence[ch].t_weight_normal_mode = PAH_800x_DEFAULT_PPG_CONVERGENCE_T_WEIGHT_NORMAL_MODE; + config->ppg_convergence[ch].t_weight_fast_mode = PAH_800x_DEFAULT_PPG_CONVERGENCE_T_WEIGHT_FAST_MODE; + config->ppg_convergence[ch].t_min = PAH_800x_DEFAULT_PPG_CONVERGENCE_T_MIN; + config->ppg_convergence[ch].t_max = PAH_800x_DEFAULT_PPG_CONVERGENCE_T_MAX; + config->ppg_convergence[ch].raw_outer_high_bound = PAH_800x_DEFAULT_PPG_CONVERGENCE_RAW_OUTER_HIGH_BOUND; + config->ppg_convergence[ch].raw_inner_high_target = PAH_800x_DEFAULT_PPG_CONVERGENCE_RAW_INNER_HIGH_TARGET; + config->ppg_convergence[ch].raw_inner_low_target = PAH_800x_DEFAULT_PPG_CONVERGENCE_RAW_INNER_LOW_TARGET; + config->ppg_convergence[ch].raw_outer_low_bound = PAH_800x_DEFAULT_PPG_CONVERGENCE_RAW_OUTER_LOW_BOUND; + config->ppg_convergence[ch].convergence_count = PAH_800x_DEFAULT_PPG_CONVERGENCE_COUNT; + config->ppg_initial_exposure[ch] = PAH_800x_DEFAULT_PPG_INITIAL_EXPOSURE; + } + +} + +pah_ret pah_800x_get_product_id(uint16_t *product_id) +{ + return pah_800x_hal_read_product_id(product_id); +} + +pah_ret pah_800x_init(pah_800x *state, const pah_800x_config *config) +{ + memset(state, 0, sizeof(*state)); + + // state->plat = *plat; + state->config = *config; + for(int ch=0;chenable_ppg_convergence[ch]); + if (config->enable_ppg_convergence[ch]) + { + DEBUG_PRINT("(t_weight_normal_mode, t_weight_fast_mode) = (%d, %d)\n", + config->ppg_convergence[ch].t_weight_normal_mode, + config->ppg_convergence[ch].t_weight_fast_mode); + DEBUG_PRINT("(t_min, t_max) = (%d, %d)\n", + config->ppg_convergence[ch].t_min, + config->ppg_convergence[ch].t_max); + DEBUG_PRINT("(raw_outer_high_bound, raw_inner_high_target) = (%d, %d)\n", + config->ppg_convergence[ch].raw_outer_high_bound, + config->ppg_convergence[ch].raw_inner_high_target); + DEBUG_PRINT("(raw_inner_low_target, raw_outer_low_bound) = (%d, %d)\n", + config->ppg_convergence[ch].raw_inner_low_target, + config->ppg_convergence[ch].raw_outer_low_bound); + } + } + + return PAH_RET_SUCCESS; +} + +pah_ret pah_800x_deinit(pah_800x *state) +{ + pah_800x_ppg_toggle(state, false); + pah_800x_touch_toggle(state, false); + pah_800x_power_toggle(state, false); + return PAH_RET_SUCCESS; +} + +pah_ret pah_800x_device_init(pah_800x *state, const pah_800x_reg_setting *reg_setting) +{ + DEBUG_PRINT("%s\n", __func__); + + //uint16_t *product_id; + uint16_t product_id; + state->reg_setting = *reg_setting; + + pah_800x_hal_write_suspend_state(false); + pah_800x_hal_write_sw_reset(); + pah_delay_ms(2); + pah_800x_power_toggle(state, true); + + // read id, delay for reg bank reset + //pah_800x_hal_read_product_id(product_id); + pah_800x_hal_read_product_id(&product_id); + pah_800x_hal_write_reg_arr(&state->reg_setting.startup_init); + + return PAH_RET_SUCCESS; +} + +pah_ret pah_800x_power_toggle(pah_800x *state, bool enable) +{ + DEBUG_PRINT("%s(%d, %d)\n", __func__, state->is_powered, enable); + + + if (enable) + { + if (state->is_powered == enable) + { + return PAH_RET_SUCCESS; + } + pah_800x_hal_write_suspend_state(false); + } + else + { + state->ppg_state.is_enabled = false; + state->touch_state.is_enabled = false; + + pah_800x_hal_write_suspend_state(false); + //pah_800x_hal_write_sw_reset(); + pah_delay_ms(2); + pah_800x_hal_write_suspend_state(true); + pah_800x_hal_reset_gpio_state(); + } + + state->is_powered = enable; + state->touch_state.touch_flag = TOUCH_TRALSE_VALUE; + + return PAH_RET_SUCCESS; +} + +pah_ret pah_800x_verify_product_id(pah_800x *state, uint16_t *product_id) +{ + return pah_800x_hal_read_product_id(product_id); +} + +pah_ret pah_800x_ppg_toggle(pah_800x *state, bool enable) +{ + DEBUG_PRINT("%s(%d, %d)\n", __func__, state->ppg_state.is_enabled, enable); + if (state->ppg_state.is_enabled == enable) + return PAH_RET_SUCCESS; + //pah_800x_hal_write_als_toggle( enable); + if (enable) + { + //load ppg setting + //comm_write(0xEB,0x80); +// for(uint8_t ch_num=0;ch_num < PAH_800x_MAX_CH_NUM;ch_num++) +// { +// ppg_reset_exposure(state,ch_num); +// pah_800x_hal_update_flag(); +// } + + pah_800x_hal_write_reg_arr(&state->reg_setting.ppg_enable); + + pah_800x_hal_check_enable_channel(state, &state->reg_setting.ppg_enable); + //DEBUG_PRINT("ch enable %d %d %d \n",state->ppg_state.ppg_ch_enabled[0],state->ppg_state.ppg_ch_enabled[1],state->ppg_state.ppg_ch_enabled[2]); + pah_800x_hal_update_flag(); + + pah_800x_hal_write_interrupt_clear(); + if(!state->touch_state.is_enabled) + pah_800x_hal_tg_toggle(true); + } + else + { + if(!state->touch_state.is_enabled) + pah_800x_hal_tg_toggle(false); + } + + + for(uint8_t ch_num=0;ch_num < PAH_800x_MAX_CH_NUM;ch_num++) + { + state->ppg_state.is_converging[ch_num] = enable; + state->ppg_state.cur_converging_count[ch_num] = 0; + } + + state->ppg_state.is_enabled = enable; + return PAH_RET_SUCCESS; +} + +pah_ret pah_800x_ppg_get_data(pah_800x *state, pah_800x_ppg_data *ppg_data) +{ + *ppg_data = state->ppg_result; + return PAH_RET_SUCCESS; +} + +pah_ret pah_800x_update_touch_setting(pah_800x *state) +{ + pah_800x_hal_write_reg_arr(&state->reg_setting.touch_enable); + pah_800x_hal_update_flag(); + + return PAH_RET_SUCCESS; +} + +pah_ret pah_800x_touch_toggle(pah_800x *state, bool enable) +{ + DEBUG_PRINT("%s(%d, %d)\n", __func__, state->touch_state.is_enabled, enable); + if (state->touch_state.is_enabled == enable) + return PAH_RET_SUCCESS; + + if (enable) + { + //load touch setting + pah_800x_hal_write_reg_arr(&state->reg_setting.touch_enable); + pah_800x_hal_update_flag(); + pah_800x_hal_tg_toggle(true); + } + else + pah_800x_hal_tg_toggle(false); + state->touch_state.is_enabled = enable; + + return PAH_RET_SUCCESS; +} + +pah_ret pah_800x_get_touch_flag(pah_800x *state, int8_t *touch_flag) +{ + *touch_flag = state->touch_flag; + return PAH_RET_SUCCESS; +} +pah_ret pah_800x_get_touch_value(pah_800x *state, uint16_t *touch_value) +{ + *touch_value = state->touch_value; + return PAH_RET_SUCCESS; +} + + +pah_ret pah_800x_task(pah_800x *state) +{ + uint8_t ppg_interrupt = 0; + bool has_ppg_interrupt = false; + memset(&state->ppg_result, 0, sizeof(state->ppg_result)); + state->touch_flag = -1; + //memset(&state->touch_result, 0, sizeof(state->touch_result)); + + //touch_process(state, &state->touch_flag); + pah_800x_hal_touch_get_touch_flag( &state->touch_flag); + //pah_800x_hal_touch_get_touch_info( &state->touch_flag,&state->touch_value); + + pah_800x_hal_read_ppg_interrupt(&ppg_interrupt); + + has_ppg_interrupt = (ppg_interrupt > 0); + //DEBUG_PRINT("%s(%d)(%d)\n", __func__, ppg_interrupt,state->touch_flag); + if (has_ppg_interrupt > 0) + { + ppg_process(state, &state->ppg_result); + } + + clear_interrupt(state, has_ppg_interrupt, state->ppg_result.has_overflow); + + return PAH_RET_SUCCESS; +} + + +//============================================================================ +// Private function +//============================================================================ +static bool sensor_has_enabled(pah_800x *state) +{ + return state->ppg_state.is_enabled + || state->touch_state.is_enabled; +} + +static pah_ret ppg_convergence_toggle(pah_800x *state, bool enable, uint8_t ch_num) +{ + //DEBUG_PRINT("%s(%d, %d, %d)\n", __func__, state->config.enable_ppg_convergence[ch_num], enable, ch_num); + + if (ch_num >= PAH_800x_MAX_CH_NUM) + return PAH_RET_INVALID_ARGUMENT; + + if (!state->config.enable_ppg_convergence[ch_num]) + return PAH_RET_SUCCESS; + + if (enable && state->ppg_state.cur_converging_count[ch_num] < state->config.ppg_convergence[ch_num].convergence_count) + { + state->ppg_state.cur_converging_count[ch_num]++; + return PAH_RET_SUCCESS; + } + else + { + state->ppg_state.cur_converging_count[ch_num] = 0; + } + state->ppg_state.is_converging[ch_num] = enable; + + return PAH_RET_SUCCESS; +} + +static pah_ret ppg_reset_exposure(pah_800x *state, uint8_t ch_num) +{ + //DEBUG_PRINT("%s(%d)\n", __func__, state->config.ppg_initial_exposure[ch_num]); + if (!state->config.enable_ppg_convergence[ch_num]) + return PAH_RET_SUCCESS; + + return pah_800x_hal_write_exposure( state->config.ppg_initial_exposure[ch_num],ch_num); +} +/*static pah_ret touch_process(pah_800x *state, uint8_t *touch_flag) +{ + + pah_800x_touch_get_touch_flag( touch_flag); + + return PAH_RET_SUCCESS; +}*/ + + +static pah_ret ppg_process(pah_800x *state, pah_800x_ppg_data *ppg_result) +{ + uint32_t ppg_value[PAH_800x_MAX_CH_NUM] = {0}; + uint8_t ppg_overflow = 0; + uint8_t overflow_num = 0; + uint16_t ppg_exposure = 0; + uint16_t ppg_adc = 0; + uint16_t ppg_frame_period = 0; + if (!state->ppg_state.is_enabled) + return PAH_RET_SUCCESS; + + for(uint8_t ch_num=0; ch_num < PAH_800x_MAX_CH_NUM; ch_num++) + { + if(state->ppg_state.ppg_ch_enabled[ch_num]) + { + pah_800x_hal_read_ppg_sync(&ppg_value[ch_num], ch_num); + pah_800x_hal_read_ppg_exposure(&ppg_exposure, ch_num); + pah_800x_hal_read_ppg_frame_period(&ppg_frame_period,ch_num); + pah_800x_hal_read_ppg_adc(&ppg_adc,ch_num); + ppg_converging(state, ppg_adc, ch_num);//SD-revise-20191205 + + ppg_result->data[ch_num] = ppg_value[ch_num]; + ppg_result->exposure_time[ch_num] = ppg_exposure; + ppg_result->frame_period[ch_num] = ppg_frame_period; + ppg_result->adc[ch_num] = ppg_adc; + } + } + pah_800x_hal_read_ppg_overflow(&ppg_overflow,&overflow_num); + ppg_result->has_data = true; + ppg_result->has_overflow = (ppg_overflow > 0); + ppg_result->overflow_num = overflow_num; + + return PAH_RET_SUCCESS; +} + +static pah_ret clear_interrupt(pah_800x *state, bool has_ppg_interrupt, bool has_overflow) +{ + + //pah_800x_hal_write_interrupt_clear(); + pah_800x_hal_write_interrupt_clear_v2(has_ppg_interrupt); + return PAH_RET_SUCCESS; +} + +static pah_ret ppg_converging(pah_800x *state, uint32_t ppg_adc, uint8_t ch_num) +{ + if (ch_num >= PAH_800x_MAX_CH_NUM) + return PAH_RET_INVALID_ARGUMENT; + + if (!state->config.enable_ppg_convergence[ch_num]) + return PAH_RET_SUCCESS; + + if (state->config.enable_ppg_reconvergence_if_out_of_bounds[ch_num] + && !state->ppg_state.is_converging[ch_num] + && is_touched(state) + && ppg_value_is_out_of_outer_bounds(state, ppg_adc, ch_num)) + { + ppg_convergence_toggle(state, true, ch_num); + } + else + { + state->ppg_state.cur_converging_count[ch_num] = 0; + } + + if (!state->ppg_state.is_converging[ch_num]) + return PAH_RET_SUCCESS; + + if (ppg_value_is_out_of_inner_bounds(state, ppg_adc, ch_num)) + { + uint16_t ppg_exposure = 0; + uint16_t new_ppg_exposure = 0; + + pah_800x_hal_read_ppg_exposure(&ppg_exposure, ch_num); + //DEBUG_PRINT("ppg converging[%d] exposure time %d ppg_value %d \n",ch_num, ppg_exposure,ppg_value); + new_ppg_exposure = select_new_ppg_exposure(state, ppg_exposure, ppg_adc, ch_num); + if(new_ppg_exposure==ppg_exposure) + { + return PAH_RET_SUCCESS; + } + + if (new_ppg_exposure > state->config.ppg_convergence[ch_num].t_max) + { + new_ppg_exposure = state->config.ppg_convergence[ch_num].t_max; + ppg_convergence_toggle(state, false, ch_num); + + DEBUG_PRINT("ppg converging complete: (exposure, t_max) = (%d)\n", new_ppg_exposure, state->config.ppg_convergence[ch_num].t_max); + } + else if (new_ppg_exposure < state->config.ppg_convergence[ch_num].t_min) + { + new_ppg_exposure = state->config.ppg_convergence[ch_num].t_min; + ppg_convergence_toggle(state, false, ch_num); + + DEBUG_PRINT("ppg converging complete: (exposure, t_min) = (%d)\n", new_ppg_exposure, state->config.ppg_convergence[ch_num].t_min); + } + + pah_800x_hal_write_exposure(new_ppg_exposure, ch_num); + pah_800x_hal_update_flag(); + + } + else + { + ppg_convergence_toggle(state, false, ch_num); + + DEBUG_PRINT("ppg converging complete: (low_target, als_lux_sync, high_target) = (%d, %d, %d)\n", + state->config.ppg_convergence[ch_num].raw_inner_low_target, ppg_adc, + state->config.ppg_convergence[ch_num].raw_inner_high_target); + } + + return PAH_RET_SUCCESS; +} + +static uint16_t select_new_ppg_exposure(pah_800x *state, uint16_t old_ppg_exposure, uint16_t ppg_value, uint8_t ch_num) +{ + int32_t new_ppg_exposure = (int32_t)old_ppg_exposure; + + if (ppg_value < state->config.ppg_convergence[ch_num].raw_outer_low_bound) + new_ppg_exposure += state->config.ppg_convergence[ch_num].t_weight_fast_mode; + else if (ppg_value < state->config.ppg_convergence[ch_num].raw_inner_low_target) + new_ppg_exposure += state->config.ppg_convergence[ch_num].t_weight_normal_mode; + else if (ppg_value > state->config.ppg_convergence[ch_num].raw_outer_high_bound) + { + if(new_ppg_exposure==state->config.ppg_convergence[ch_num].t_min) + { + return new_ppg_exposure; + } + new_ppg_exposure -= state->config.ppg_convergence[ch_num].t_weight_fast_mode; + + }else if (ppg_value > state->config.ppg_convergence[ch_num].raw_inner_high_target) + new_ppg_exposure -= state->config.ppg_convergence[ch_num].t_weight_normal_mode; + + return new_ppg_exposure; +} + +static bool is_touched(pah_800x *state) +{ + return state->touch_flag == 1; +} + +static bool is_not_touched(pah_800x *state) +{ + return state->touch_flag == 0; +} + +static bool ppg_value_is_out_of_outer_bounds(pah_800x *state, uint32_t ppg_data, uint8_t ch_num) +{ + return (ppg_data < state->config.ppg_convergence[ch_num].raw_outer_low_bound) + || (ppg_data > state->config.ppg_convergence[ch_num].raw_outer_high_bound); +} + +static bool ppg_value_is_out_of_inner_bounds(pah_800x *state, uint16_t ppg_data, uint8_t ch_num) +{ + return (ppg_data < state->config.ppg_convergence[ch_num].raw_inner_low_target) + || (ppg_data > state->config.ppg_convergence[ch_num].raw_inner_high_target); +} + +static pah_ret pah_800x_sw_reset(pah_800x *state) +{ + //set sw reset should not in suspend mode + if (state->is_powered == false) + return PAH_RET_FAILED; + + return pah_800x_hal_write_sw_reset(); +} +//////////////////////////////////////////////////////////////////////////////////////////// + + + +//=========================================================================== +// Private function +//=========================================================================== +static pah_ret pah_800x_hal_comm_write(uint8_t addr, const uint8_t *data, size_t write_size) +{ + //return plat->comm.write(&plat->comm, addr, data, write_size); + //return plat->comm.write(addr, data, write_size); + return pah_comm_i2c_write(addr, data, write_size); +} + +static pah_ret pah_800x_hal_comm_read(uint8_t addr, uint8_t *data, size_t read_size) +{ + + //return plat->comm.read(&plat->comm, addr, data, read_size); + return pah_comm_i2c_read(addr, data, read_size); +} + +static pah_ret comm_write(uint8_t addr, uint8_t data) +{ + //return pah_800x_hal_comm_write( addr, &data, 1); + return pah_800x_hal_comm_write(addr, &data, 1); +} +#define comm_read(addr, data) pah_800x_hal_comm_read(addr, data, 1) +#define comm_burst_read(addr, data, read_size) pah_800x_hal_comm_read(addr, data, read_size) + + +//=========================================================================== +// Private function (HAL) +//=========================================================================== +static pah_ret pah_800x_hal_write_reg_arr(const pah_reg_arr *reg_arr) +{ + return pah_800x_hal_write_reg_array(reg_arr->reg_arr, reg_arr->reg_arr_len); +} + +static pah_ret pah_800x_hal_write_reg_array(const uint8_t reg_array[][2], size_t length) +{ + size_t i = 0; + uint8_t reg_value = 0; + for (i = 0; i < length; ++i) + { + //for trim bit + if (reg_array[i][0] == 0x14) + { + comm_read(0x14, ®_value); + reg_value = (reg_value & 0x1F) | (reg_array[i][1] & 0xE0); + comm_write(reg_array[i][0], reg_value); + } + else + comm_write(reg_array[i][0], reg_array[i][1]); + } + return PAH_RET_SUCCESS; +} + +static pah_ret pah_800x_hal_write_suspend_state(bool suspend) +{ + uint8_t data = 0; + DEBUG_PRINT("%s(%d)\n", __func__, suspend); + if (suspend) + { + pah_800x_hal_write_interrupt_clear(); + comm_read(PAH_800x_ADDR_E8, &data); + PAH_SET_BIT(data, PAH_800x_ADDR_E8_CMD_SUSPEND_MODE_BIT); + comm_write(PAH_800x_ADDR_E8, data); + } + else + { + comm_read(PAH_800x_ADDR_E8, &data); + PAH_CLEAR_BIT(data, PAH_800x_ADDR_E8_CMD_SUSPEND_MODE_BIT); + comm_write(PAH_800x_ADDR_E8, data); + + } + DEBUG_PRINT("%s(%d) end\n", __func__, suspend); + + return PAH_RET_SUCCESS; +} + +static pah_ret pah_800x_hal_write_interrupt_clear(void) +{ + uint8_t data = 0; + // DR interrupt + comm_read(PAH_800x_ADDR_20, &data); + //PAH_CLEAR_BIT(data, PAH_800x_ADDR_20_BIT_DR_FLAG); + comm_write(PAH_800x_ADDR_20, (data|0x04)); //SD-revise-20191205 + return PAH_RET_SUCCESS; +} +static pah_ret pah_800x_hal_write_interrupt_clear_v2(bool int_status_DR_FLAG_b) +{ + uint8_t data = 0; + bool int_status_DR_FLAG = 0; + // DR interrupt + comm_read(PAH_800x_ADDR_20, &data); + int_status_DR_FLAG = PAH_CHECK_BIT(data, PAH_800x_ADDR_20_BIT_DR_FLAG) ; + + if(int_status_DR_FLAG_b==int_status_DR_FLAG) + { + comm_write(PAH_800x_ADDR_20, (data|0x04)); //SD-revise-20191205 + }else if((int_status_DR_FLAG_b)==0 &&(int_status_DR_FLAG==1)) + { + comm_write(PAH_800x_ADDR_20, ((data|0x04)&0xFE)); //SD-revise-20191205 + } + return PAH_RET_SUCCESS; +} + + +static pah_ret pah_800x_hal_write_ppg_overflow_clear(void) +{ + uint8_t data = 0; + // Clear ppg_overflow flag + comm_read(PAH_800x_ADDR_20, &data); + PAH_SET_BIT(data, PAH_800x_ADDR_20_BIT_OVERFLOW_FLAG); + comm_write( PAH_800x_ADDR_20, data); + // Recover + PAH_CLEAR_BIT(data, PAH_800x_ADDR_20_BIT_OVERFLOW_FLAG); + comm_write(PAH_800x_ADDR_20, data); + return PAH_RET_SUCCESS; +} + +static pah_ret pah_800x_hal_write_exposure(uint16_t exposure, uint8_t ch_num) +{ + //uint8_t data = 0; + uint8_t exposure_low = PAH_UINT16_LOW(exposure); + uint8_t exposure_high = PAH_UINT16_HIGH(exposure); + + if(ch_num == PAH_800x_CH_NUM_A) + { + comm_write(PAH_800x_ADDR_17, exposure_low); + comm_write(PAH_800x_ADDR_18, exposure_high); + } + else if(ch_num == PAH_800x_CH_NUM_B) + { + comm_write(PAH_800x_ADDR_19, exposure_low); + comm_write(PAH_800x_ADDR_1A, exposure_high); + } + else if(ch_num == PAH_800x_CH_NUM_C) + { + comm_write(PAH_800x_ADDR_1B, exposure_low); + comm_write(PAH_800x_ADDR_1C, exposure_high); + } + + return PAH_RET_SUCCESS; +} + +static pah_ret pah_800x_hal_read_product_id(uint16_t *product_id) +{ + return comm_burst_read(PAH_800x_ADDR_00_PRODUCT_ID, (uint8_t *)product_id,2); +} + +static pah_ret pah_800x_hal_read_ppg_interrupt(uint8_t *ppg_interrupt) +{ + uint8_t data = 0; + comm_read(PAH_800x_ADDR_20, &data); + if (ppg_interrupt) + *ppg_interrupt = PAH_CHECK_BIT(data, PAH_800x_ADDR_20_BIT_DR_FLAG); + + return PAH_RET_SUCCESS; +} + +static pah_ret pah_800x_hal_read_ppg_sync(uint32_t *ppg_data, uint8_t ch_num) +{ + if(ch_num == PAH_800x_CH_NUM_A) + comm_burst_read(PAH_800x_ADDR_27_RAWDATA_A_SYNC, (uint8_t*)ppg_data, 3); + else if(ch_num == PAH_800x_CH_NUM_B) + comm_burst_read(PAH_800x_ADDR_32_RAWDATA_B_SYNC, (uint8_t*)ppg_data, 3); + else if(ch_num == PAH_800x_CH_NUM_C) + comm_burst_read(PAH_800x_ADDR_3D_RAWDATA_C_SYNC, (uint8_t*)ppg_data, 3); + return PAH_RET_SUCCESS; +} + +static pah_ret pah_800x_hal_read_ppg_overflow(uint8_t *ppg_overflow, uint8_t *overflow_num) +{ + uint8_t data = 0; + comm_read( PAH_800x_ADDR_20, &data); + if (ppg_overflow) + { + *ppg_overflow = PAH_CHECK_BIT(data, PAH_800x_ADDR_20_BIT_OVERFLOW_FLAG); + *overflow_num = (data&0x70)>>4; + } + return PAH_RET_SUCCESS; +} + +static pah_ret pah_800x_hal_read_ppg_exposure(uint16_t *ppg_exposure, uint8_t ch_num) +{ + if(ch_num == PAH_800x_CH_NUM_A) + comm_burst_read(PAH_800x_ADDR_2A, (uint8_t*)ppg_exposure, 2); + else if(ch_num == PAH_800x_CH_NUM_B) + comm_burst_read(PAH_800x_ADDR_35, (uint8_t*)ppg_exposure, 2); + else if(ch_num == PAH_800x_CH_NUM_C) + comm_burst_read(PAH_800x_ADDR_40, (uint8_t*)ppg_exposure, 2); + + return PAH_RET_SUCCESS; +} + +static pah_ret pah_800x_hal_read_ppg_frame_period( uint16_t *ppg_frame_period, uint8_t ch_num) +{ + if(ch_num == PAH_800x_CH_NUM_A) + comm_burst_read(PAH_800x_ADDR_2C, (uint8_t*)ppg_frame_period, 2); + else if(ch_num == PAH_800x_CH_NUM_B) + comm_burst_read(PAH_800x_ADDR_37, (uint8_t*)ppg_frame_period, 2); + else if(ch_num == PAH_800x_CH_NUM_C) + comm_burst_read(PAH_800x_ADDR_42, (uint8_t*)ppg_frame_period, 2); + + return PAH_RET_SUCCESS; +} + +static pah_ret pah_800x_hal_read_ppg_adc(uint16_t *ppg_adc, uint8_t ch_num) +{ + uint16_t data = 0; + + if(ch_num == PAH_800x_CH_NUM_A) + comm_burst_read(PAH_800x_ADDR_2E, (uint8_t*)&data, 2); + else if(ch_num == PAH_800x_CH_NUM_B) + comm_burst_read(PAH_800x_ADDR_39, (uint8_t*)&data, 2); + else if(ch_num == PAH_800x_CH_NUM_C) + comm_burst_read(PAH_800x_ADDR_44, (uint8_t*)&data, 2); + + //*ppg_adc = data >> 2; + *ppg_adc = data >> 2; + + return PAH_RET_SUCCESS; +} + +static pah_ret pah_800x_hal_touch_get_touch_flag(int8_t *touch_flag) +{ + uint8_t data = 0; + uint16_t data1 = 0; +// comm_read(PAH_800x_ADDR_20, &data); + comm_burst_read(PAH_800x_ADDR_44, (uint8_t*)&data1, 2); + comm_read(PAH_800x_ADDR_20, &data); + // printf("data : %d, data1 : %d\n",data,data1); + if (touch_flag) + *touch_flag = PAH_CHECK_BIT(data, PAH_800x_ADDR_20_BIT_TOUCH_FLAG); + + return PAH_RET_SUCCESS; +} +static pah_ret pah_800x_hal_touch_get_touch_info(int8_t *touch_flag,uint16_t *touch_value) +{ + uint8_t data = 0; + uint16_t data1 = 0; +// comm_read(PAH_800x_ADDR_20, &data); + comm_burst_read(PAH_800x_ADDR_44, (uint8_t*)&data1, 2); + *touch_value =data1>>2; + comm_read(PAH_800x_ADDR_20, &data); + if (touch_flag) + *touch_flag = PAH_CHECK_BIT(data, PAH_800x_ADDR_20_BIT_TOUCH_FLAG); + + + return PAH_RET_SUCCESS; +} + +static pah_ret pah_800x_hal_tg_toggle(bool enable) +{ + uint8_t data = 0; + comm_read( PAH_800x_ADDR_07_TG, &data); + if(enable) + PAH_SET_BIT(data, PAH_800x_ADDR_07_TG_BIT_EN); + else + PAH_CLEAR_BIT(data, PAH_800x_ADDR_07_TG_BIT_EN); + comm_write(PAH_800x_ADDR_07_TG, data); + + return PAH_RET_SUCCESS; +} + +static pah_ret pah_800x_hal_update_flag(void) +{ + comm_write(PAH_800x_ADDR_EB, PAH_800x_ADDR_E8_UPDATE_FLAG); + + return PAH_RET_SUCCESS; +} + +static pah_ret pah_800x_hal_write_sw_reset(void) +{ + comm_write(PAH_800x_ADDR_EE, PAH_800x_ADDR_EE_SW_RESET); + + return PAH_RET_SUCCESS; +} + +static pah_ret pah_800x_hal_check_enable_channel(pah_800x *state, const pah_reg_arr *reg_arr) +{ + for(int i=0;ireg_arr_len;i++) + { + if(reg_arr->reg_arr[i][0] == PAH_800x_ADDR_11_EnCh) + { + uint8_t data = reg_arr->reg_arr[i][1]; + state->ppg_state.ppg_ch_enabled[0] = PAH_CHECK_BIT(data, 0); // CH A + state->ppg_state.ppg_ch_enabled[1] = PAH_CHECK_BIT(data, 1); // CH B + state->ppg_state.ppg_ch_enabled[2] = PAH_CHECK_BIT(data, 2); // CH C + } + } + + return PAH_RET_SUCCESS; +} + + +static pah_ret pah_800x_hal_reset_gpio_state(void) +{ + uint8_t data = 0; + + comm_read(PAH_800x_ADDR_D2, &data); + PAH_SET_BIT(data, PAH_800x_ADDR_D2_OD_EnH); + comm_write(PAH_800x_ADDR_D2, data); + + return PAH_RET_SUCCESS; +} diff --git a/code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah_800x.h b/code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah_800x.h new file mode 100644 index 000000000..2500dc690 --- /dev/null +++ b/code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah_800x.h @@ -0,0 +1,158 @@ +#ifndef __pah_800x_h__ +#define __pah_800x_h__ + +// pah +#include "pah_unit.h" +#include "pah_800x_config.h" + + +//============================================================================ +// Definition +//============================================================================ +#define TOUCH_TRALSE_VALUE (-1) + + +//============================================================================ +// Type Definition +//============================================================================ +typedef struct +{ + uint16_t t_weight_normal_mode; + uint16_t t_weight_fast_mode; + uint16_t t_min; + uint16_t t_max; + + uint16_t raw_outer_high_bound; + uint16_t raw_inner_high_target; + uint16_t raw_inner_low_target; + uint16_t raw_outer_low_bound; + + uint16_t convergence_count; +} pah_800x_ppg_convergence; + +typedef struct +{ + uint16_t ppg_initial_exposure[PAH_800x_MAX_CH_NUM]; + + bool enable_ppg_convergence[PAH_800x_MAX_CH_NUM]; + pah_800x_ppg_convergence ppg_convergence[PAH_800x_MAX_CH_NUM]; + bool enable_ppg_reconvergence_if_out_of_bounds[PAH_800x_MAX_CH_NUM]; + +} pah_800x_config; + +typedef struct +{ + bool is_enabled; + + bool is_converging[PAH_800x_MAX_CH_NUM]; + + bool ppg_ch_enabled[PAH_800x_MAX_CH_NUM]; + uint16_t cur_converging_count[PAH_800x_MAX_CH_NUM]; +} pah_800x_ppg_state; + +typedef struct +{ + bool has_data; + uint32_t data[PAH_800x_MAX_CH_NUM]; + + + // Avaiable only if has_data is true + bool has_overflow; + + uint8_t overflow_num; + + // Avaiable only if has_data is true + uint16_t exposure_time[PAH_800x_MAX_CH_NUM]; + uint16_t adc[PAH_800x_MAX_CH_NUM]; + uint16_t frame_period[PAH_800x_MAX_CH_NUM]; + +} pah_800x_ppg_data; + +typedef struct +{ + bool is_enabled; + + int8_t touch_flag; + +} pah_800x_touch_state; + +typedef struct +{ + pah_reg_arr startup_init; + pah_reg_arr ppg_enable; + pah_reg_arr touch_enable; + +} pah_800x_reg_setting; + +typedef struct +{ + // Config + //pah_plat plat; + pah_800x_config config; + + // Power state + bool is_powered; + + // PPG state + pah_800x_ppg_state ppg_state; + pah_800x_ppg_data ppg_result; + + // TOUCH state + pah_800x_touch_state touch_state; + int8_t touch_flag; + uint16_t touch_value; + // Other + pah_800x_reg_setting reg_setting; + +} pah_800x; + + +//============================================================================ +// Public function +//============================================================================ +#ifdef __cplusplus +extern "C" { +#endif + + +// Info +uint16_t pah_800x_get_i2c_default_slave_addr(void); +void pah_800x_get_default_config(pah_800x_config *config); +pah_ret pah_800x_get_product_id( uint16_t *product_id); + +// Init +pah_ret pah_800x_init(pah_800x *state, const pah_800x_config *config); +pah_ret pah_800x_deinit(pah_800x *state); + +// Device init +pah_ret pah_800x_device_init(pah_800x *state, const pah_800x_reg_setting *reg_setting); + +// Config +//pah_ret pah_800x_set_ppg_convergence(pah_800x *state,uint8_t ch_num, const pah_800x_ppg_convergence *ppg_convergence); + +// Power +pah_ret pah_800x_power_toggle(pah_800x *state, bool enable); + +// Basic verification +pah_ret pah_800x_verify_product_id(pah_800x *state, uint16_t *product_id); + +// PPG +pah_ret pah_800x_ppg_toggle(pah_800x *state, bool enable); +pah_ret pah_800x_ppg_get_data(pah_800x *state, pah_800x_ppg_data *ppg_data); + +// TOUCH +pah_ret pah_800x_touch_toggle(pah_800x *state, bool enable); +pah_ret pah_800x_get_touch_flag(pah_800x *state, int8_t *touch_flag); +pah_ret pah_800x_get_touch_value(pah_800x *state, uint16_t *touch_value); +pah_ret pah_800x_update_touch_setting(pah_800x *state); + +// Task +pah_ret pah_800x_task(pah_800x *state); + + + +#ifdef __cplusplus +} +#endif + +#endif // header guard diff --git a/code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah_800x_config.h b/code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah_800x_config.h new file mode 100644 index 000000000..b484f21c2 --- /dev/null +++ b/code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah_800x_config.h @@ -0,0 +1,166 @@ +#ifndef __pah_800x_config_h__ +#define __pah_800x_config_h__ + +// pah +#include "pah800x_bsp.h" +#include "debug_print.h" +#include "cywee_hal.h" + +/* + * Select LED Supplier + * If Use new Supplier LED , Need to define LED_SUPPLIER_NEW +*/ +#define LED_SUPPLIER_NEW + + +/* + * Select Cover Type +*/ +#define DI_WALL_4mm +//#define PC_4mm + +/* + * Select HW and ALG configuration + * PC_4MM_2G_IR_HRD : Printing Cover with 4mm 2 Green and 1 IR LED for HRD algorithm use (PAH8009ES) + * DIW_4MM_G_IR_HRD : DI+Wall Cover with 4mm 1 Green and 1 IR LED for HRD algorithm use (PAH8009ES) + * DIW_4MM_IR_R_IR_SPO2 : DI+Wall Cover with 4mm 1 IR LED and 1 RED for SpO2 algorithm use (PAH8009ES) + * This definition will enable the PPG register setting corresponding to different HW and ALG configuration + */ + +#define PC_4MM_2G_IR_HRD 1 +#define DIW_4MM_G_IR_HRD 1 +#define DIW_4MM_IR_R_IR_SPO2 1 + +//#endif + +//============================================================================ +// Debug Option +//============================================================================ +#define ENABLE_AE 1 +#define ENABLE_AE_RECONVERGENCE 1 + + +#define PAH_800x_ENABLE_DEBUG_PRINT +#define PAH_800x_ENABLE_LOG_PRINT + + +#ifdef PAH_800x_ENABLE_LOG_PRINT +#define LOG_PRINT(fmt, ...) \ + do { \ + CWM_OS_dbgPrintf(fmt"PAH:", ##__VA_ARGS__); \ + } while (0) +#else +#define LOG_PRINT(...) do {} while (0) +#endif + +#ifdef PAH_800x_ENABLE_DEBUG_PRINT +#define DEBUG_PRINT(fmt, ...) \ + do { \ + CWM_OS_dbgPrintf(fmt"PAH:", ##__VA_ARGS__); \ + } while (0) +#else +#define DEBUG_PRINT(...) do {} while (0) +#endif + +/* + * Select Interrupt or Polling Mode + * This definition will enable the corresponding demo functionin main.c + * If select INT mode, then slect following INT configuration type + */ +#define INTERRUPT_MODE 0 +#define POLLING_MODE 1 +#define Test_pattern_mode 0 + +/* + * Select INT HW configuration type + * INT_OD_EXTERNAL_PULLH : INT open-drain type with external pull-high resistor + * INT_OD_INTERNAL_PULLH : INT open-drain type with internal pull-high resistor + * INT_PUP_WITHOUT_PULLH : INT push-pull type without any pull-high resistor + * If user select POLLING_MODE, all define need to set 0 + * This definition will enable the GPIO register setting corresponding to different INT HW configuration + */ +#define INT_OD_EXTERNAL_PULLH 1 +#define INT_OD_INTERNAL_PULLH 0 +#define INT_PUP_WITHOUT_PULLH 0 + + +/* +* Configure VBUS Type + * Define VBUS_18V=1, compatible with VBUS=1.8V or 3.3V (default) + * Define VBUS_18V=0, only support VBUS=3.3V + * If user want to define VBUS_18V=0, or VBUS not 1.8V/3.3V, please contact with PixArt for evaluation + */ +#define VBUS_18V 1 +#if (VBUS_18V) + #define R_GPIO_0_OD_EnH (0x20) + #define R_GPIO_SLEW (0x01) + #define R_I2C_SLEW (0x40) + #define R_SCL_Sel (0x00) + #define R_SDA_Sel (0x00) +#else + #define R_GPIO_0_OD_EnH (0x20) + #define R_GPIO_SLEW 0 + #define R_I2C_SLEW 0 + #define R_SCL_Sel (0x40) + #define R_SDA_Sel (0x04) +#endif + +#define Time_Interval 400 +/* +If Customer platform use G-Sensor with FIFO,they can refer this flow to run pxi alg to get alg output +*/ +//#define PPG_MEMS_Synchronize +#define Optimize_SPO2_flow + +//****** Demo 800X mode Select ******// +//============HRD-INT================// +//#define touch_only_hrd_en +//#define ppg_only_hrd_en +#define auto_hrd_en + +//============HRD-Polling================// +//#define touch_only_polling_hrd_en +//#define ppg_only_polling_hrd_en +//#define auto_polling_hrd_en + + +//============SPO2-INT================// +//#define touch_only_spo2_en +//#define ppg_only_spo2_en +//#define auto_spo2_en + +//============SPO2-Polling================// +//#define touch_only_polling_spo2_en +//#define ppg_only_polling_spo2_en +//#define auto_polling_spo2_en + + +//============Stress-INT================// +//#define touch_only_stress_en +//#define ppg_only_stress_en +//#define auto_stress_en + +//============Stress-Polling================// +//#define touch_only_polling_stress_en +//#define ppg_only_polling_stress_en +//#define auto_polling_stress_en + +//=========== Test_pattern======== // +//#define hrd_testpattern_en +//#define spo2_testpattern_en + +//=========== Factory _Test=========// +//#define factory_test_en + + +//============HRD-INT====PC Cover============// +//#define touch_only_hrd_en_pc +//#define ppg_only_hrd_en_pc +//#define auto_hrd_en_pc + +//============HRD-Polling======PC Cover==========// +//#define touch_only_polling_hrd_en_pc +//#define ppg_only_polling_hrd_en_pc +//#define auto_polling_hrd_en_pc + +#endif // header guard diff --git a/code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah_unit.h b/code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah_unit.h new file mode 100644 index 000000000..64a1a7e67 --- /dev/null +++ b/code/sdk/zhihui/drivers/ppg/pah8009/sensor/pah_unit.h @@ -0,0 +1,340 @@ +#ifndef __pah_unit_h__ +#define __pah_unit_h__ + +// c +#include +#include +#include +#include +#include +#include + + +//============================================================================ +// Default +//============================================================================ +#define PAH_800x_DEFAULT_PPG_INITIAL_EXPOSURE (400) + +#define PAH_800x_DEFAULT_ENABLE_PPG_CONVERGENCE true + + +#define PAH_800x_DEFAULT_PPG_CONVERGENCE_COUNT (0) +#define PAH_800x_DEFAULT_PPG_CONVERGENCE_T_WEIGHT_NORMAL_MODE (8) +#define PAH_800x_DEFAULT_PPG_CONVERGENCE_T_WEIGHT_FAST_MODE (16) +#define PAH_800x_DEFAULT_PPG_CONVERGENCE_T_MIN (10) +#define PAH_800x_DEFAULT_PPG_CONVERGENCE_T_MAX (1792) +#define PAH_800x_DEFAULT_PPG_CONVERGENCE_RAW_OUTER_HIGH_BOUND (12288) +#define PAH_800x_DEFAULT_PPG_CONVERGENCE_RAW_INNER_HIGH_TARGET (10240) +#define PAH_800x_DEFAULT_PPG_CONVERGENCE_RAW_INNER_LOW_TARGET (8192) +#define PAH_800x_DEFAULT_PPG_CONVERGENCE_RAW_OUTER_LOW_BOUND (6144) + +#define PAH_800x_DEFAULT_ENABLE_PPG_RECONVERGENCE_IF_OUT_OF_BOUNDS true + + +//============================================================================ +// Definition +//============================================================================ + +// I2C 7-bit ID +#define PAH_800x_DEFAULT_I2C_SLAVE_ID_1 (0x40) +#define PAH_800x_DEFAULT_I2C_SLAVE_ID_2 (0x10) + +#define PAH_800x_PRODUCT_ID (0x8008) + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * @file pah_ret.h + * + * Copyright (c) 2016-2018 PixArt Imaging Inc. + * All Rights Reserved. + * Confidential and Proprietary - PixArt Imaging Inc. + **/ + +typedef enum { + + PAH_RET_SUCCESS = 0, // Success + + PAH_RET_PENDING, + + PAH_RET_FAILED, // Unknown error, generally there exists bug in this driver + + PAH_RET_PLAT_FAILED, // Platform API failed + PAH_RET_VERIFY_FAILED, // Verify device failed + + PAH_RET_NOT_IMPLEMENTED, // This API is not supported or is not implemented + + PAH_RET_INVALID_ARGUMENT, // Invalid argument to API + PAH_RET_INVALID_OPERATION, // This operation is not available at this time + + PAH_RET_FIFO_CKS_FAILED, // Failed to compare check sum with fifo data + PAH_RET_FIFO_OVERFLOW, // Fifo in device is overflow + + PAH_RET_ASYNC_PENDING, + +} pah_ret; + +typedef enum { + PAH_800x_CH_NUM_A = 0, + PAH_800x_CH_NUM_B, + PAH_800x_CH_NUM_C, + PAH_800x_MAX_CH_NUM, +} pah_800x_ch_num; + +#define PAH_SUCCEEDED(ret) (ret == PAH_RET_SUCCESS) +#define PAH_FAILED(ret) (!PAH_SUCCEEDED(ret)) + + +#define PAH_CHECK_RET(ret) \ + if (PAH_FAILED(ret)) { \ + return ret; \ + } + +#define PAH_CHECK_NULL(p) \ + if (!p) { \ + return PAH_RET_INVALID_ARGUMENT; \ + } + + + +/** + * @file pah_plat.h + * + * Copyright (c) 2016-2018 PixArt Imaging Inc. + * All Rights Reserved. + * Confidential and Proprietary - PixArt Imaging Inc. + **/ + + + + +//============================================================================ +// Definition +//============================================================================ + +//============================================================================ +// Macro +//============================================================================ +#ifndef __FILENAME__ +# define __FILENAME__ (strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__) +#endif + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + + +/** + * @file pah_util.h + * + * Copyright (c) 2016-2018 PixArt Imaging Inc. + * All Rights Reserved. + * Confidential and Proprietary - PixArt Imaging Inc. + **/ + + + +#define PAH_ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0])) + +#define PAH_SET_BIT(var,pos) do { ((var) |= (1 << (pos))); } while(0) +#define PAH_CLEAR_BIT(var,pos) do { ((var) &= ~(1 << (pos))); } while(0) +#define PAH_CHECK_BIT(var,pos) (((var) >> (pos)) & 1) + +// +// PAH_SET_BITSLICE +// +// ex1: +// // var = 0x00 : 00000000 +// // pos = 2 : ^ +// // mask = 0x3C : 00111100 +// // value = 0x0D : 1101 +// // ret = 0x34 : 00110100 +// uint8_t data = 0x00; +// uint8_t ret = PAH_SET_BITSLICE(data, 2, 0x3C, 0x0D); +// +// ex2: +// // var = 0x6D : 01101101 +// // pos = 6 : ^ +// // mask = 0xC0 : 11000000 +// // value = 0x02 : 10 +// // ret = 0xAD : 10101101 +// uint8_t data = 0x6D; +// uint8_t ret = PAH_SET_BITSLICE(data, 6, 0xC0, 0x02); +// +#define PAH_SET_BITSLICE(var, pos, mask, value) \ + ((var & ~mask) | ((value << pos) & mask)) + +// +// PAH_GET_BITSLICE +// +// ex1: +// // var = 0x5D : 01011101 +// // pos = 2 : ^ +// // mask = 0x3C : 00111100 +// // ret = 0x07 : 0111 +// uint8_t ret = PAH_GET_BITSLICE(0x5D, 2, 0x3C); +// +// ex2: +// // var = 0xA6 : 10100110 +// // pos = 5 : ^ +// // mask = 0xE0 : 11100000 +// // ret = 0x05 : 101 +// uint8_t ret = PAH_GET_BITSLICE(0xA6, 5, 0xE0); +// +#define PAH_GET_BITSLICE(var, pos, mask) \ + ((var & mask) >> pos) + +#define PAH_UINT64_HIGH(var) ((uint32_t)(var >> 32)) +#define PAH_UINT64_LOW(var) ((uint32_t)(var & UINT32_MAX)) + +#define PAH_UINT16_HIGH(var) ((uint8_t)(var >> 8)) +#define PAH_UINT16_LOW(var) ((uint8_t)(var & UINT8_MAX)) + +#define PAH_UNUSED_VAR(var) (void)(var) +#define UNUSED_VAR(var) (void)(var) + +#ifndef __FILENAME__ +# define __FILENAME__ (strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__) +#endif + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * @file pah_reg.h + * + * Copyright (c) 2016-2018 PixArt Imaging Inc. + * All Rights Reserved. + * Confidential and Proprietary - PixArt Imaging Inc. + **/ + + + + +//============================================================================ +// Definition +//============================================================================ +typedef const uint8_t (pah_reg)[2]; + + +typedef struct { + + pah_reg *reg_arr; + uint32_t reg_arr_len; + +} pah_reg_arr; + + +#define PAH_REG_ARR_SETUP(pah_reg_arr, reg_array) \ + do { \ + pah_reg_arr.reg_arr = (pah_reg*)reg_array; \ + pah_reg_arr.reg_arr_len = PAH_ARRAY_SIZE(reg_array); \ + } while(0) + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//============================================================================ +// Register address +//============================================================================ + +/*#define PAH_800x_ADDR_00_PRODUCT_ID (0x00) +#define PAH_800x_ADDR_03 (0x03) +#define PAH_800x_ADDR_03_BIT_R_PS_EN (0) +#define PAH_800x_ADDR_03_BIT_R_ALS_EN (1) +#define PAH_800x_ADDR_03_BIT_SW_SUSPEND (5) + +#define PAH_800x_ADDR_04 (0x04) +#define PAH_800x_ADDR_04_BIT_ALS_OVERFLOW_ECO (7) + +#define PAH_800x_ADDR_09 (0x09) +#define PAH_800x_ADDR_09_BIT_ALS_INTERRUPT (2) +#define PAH_800x_ADDR_09_BIT_PS_INTERRUPT (5) +#define PAH_800x_ADDR_09_BIT_PS_APPROACH (6) + +#define PAH_800x_ADDR_10_PS_ONOFF_SYNC (0x10) + +#define PAH_800x_ADDR_11 (0x11) +#define PAH_800x_ADDR_11_BIT_R_LED_CONTROL_OUT_EN (4) +#define PAH_800x_ADDR_11_BIT_R_PS_INTERRUPT_EN (7) + +#define PAH_800x_ADDR_0E_ALS_LUX_SYNC (0x0E) + +#define PAH_800x_ADDR_34 (0x34) +#define PAH_800x_ADDR_34_BIT_R_EXPOSURE_ALS_F0 (0) + +#define PAH_800x_ADDR_35 (0x35) +#define PAH_800x_ADDR_35_BIT_R_EXPOSURE_ALS_F0 (0) + +#define PAH_800x_ADDR_38 (0x38) +#define PAH_800x_ADDR_38_BIT_0_LOCK_EXPOTIME (0) +#define PAH_800x_ADDR_38_BIT_1_CLEAR_ALS_OVERFLOW_ECO (1) + +#define PAH_800x_ADDR_EC (0xEC) +#define PAH_800x_ADDR_EC_BIT_7_R_CLK_MANUAL (7)*/ + +#define PAH_800x_ADDR_00_PRODUCT_ID (0x00) + +#define PAH_800x_ADDR_07_TG (0X07) +#define PAH_800x_ADDR_07_TG_BIT_EN (0) + +#define PAH_800x_ADDR_20 (0x20) +#define PAH_800x_ADDR_20_BIT_DR_FLAG (0) +#define PAH_800x_ADDR_20_BIT_OVERFLOW_FLAG (1) +#define PAH_800x_ADDR_20_BIT_TOUCH_FLAG (2) + +//expo A Sync +#define PAH_800x_ADDR_2A (0x2A) +#define PAH_800x_ADDR_2B (0x2B) + +#define PAH_800x_ADDR_35 (0x35) +#define PAH_800x_ADDR_36 (0x36) + +#define PAH_800x_ADDR_40 (0x40) +#define PAH_800x_ADDR_41 (0x41) + +#define PAH_800x_ADDR_11_EnCh (0x11) + +//expo A write +#define PAH_800x_ADDR_17 (0x17) +#define PAH_800x_ADDR_18 (0x18) + +#define PAH_800x_ADDR_19 (0x19) +#define PAH_800x_ADDR_1A (0x1A) + +#define PAH_800x_ADDR_1B (0x1B) +#define PAH_800x_ADDR_1C (0x1C) + +//frame period + +#define PAH_800x_ADDR_2C (0x2C) +#define PAH_800x_ADDR_2D (0x2D) + +#define PAH_800x_ADDR_37 (0x37) +#define PAH_800x_ADDR_38 (0x38) + +#define PAH_800x_ADDR_42 (0x42) +#define PAH_800x_ADDR_43 (0x43) + +//adc + +#define PAH_800x_ADDR_2E (0x2E) +#define PAH_800x_ADDR_2F (0x2F) + +#define PAH_800x_ADDR_39 (0x39) +#define PAH_800x_ADDR_3A (0x3A) + +#define PAH_800x_ADDR_44 (0x44) +#define PAH_800x_ADDR_45 (0x45) + +#define PAH_800x_ADDR_27_RAWDATA_A_SYNC (0x27) +#define PAH_800x_ADDR_32_RAWDATA_B_SYNC (0x32) +#define PAH_800x_ADDR_3D_RAWDATA_C_SYNC (0x3D) + +#define PAH_800x_ADDR_E8 (0xE8) +#define PAH_800x_ADDR_E8_CMD_SUSPEND_MODE_BIT (0) + +#define PAH_800x_ADDR_EB (0xEB) +#define PAH_800x_ADDR_E8_UPDATE_FLAG (0x80) + +#define PAH_800x_ADDR_EE (0xEE) +#define PAH_800x_ADDR_EE_SW_RESET (0x1F)//(0x07) +#define PAH_800x_ADDR_D2 (0xD2) +#define PAH_800x_ADDR_D2_OD_EnH (5) + +#endif // header guard diff --git a/code/sdk/zhihui/drivers/ppg/service/ppg_service.cpp b/code/sdk/zhihui/drivers/ppg/service/ppg_service.cpp index ac40a9654..6cdc1dc75 100644 --- a/code/sdk/zhihui/drivers/ppg/service/ppg_service.cpp +++ b/code/sdk/zhihui/drivers/ppg/service/ppg_service.cpp @@ -41,15 +41,14 @@ extern "C" { #include "cmsis_os2.h" #include "ppg_service.h" #include "los_printf.h" - #include "thread_init.h" #include "custom_utils.h" #include "custom_save_runtime.h" #include "ppg_hal.h" -// #ifdef PPG_HX3695 -// #include "hx3695.h" -// #endif +#ifdef PPG_HX3695 +#include "hx3695.h" +#endif #if defined(PPG_VC9202) #include "vc9202_hal.h" @@ -58,8 +57,7 @@ extern "C" { #include "vc921x_hal.h" #include "vc921x_user_app.h" #elif defined(PPG_GH3X2X) -#include "gh3x2x_hal.h" -#include "gh3x2x_afe_drv.h" +// #include "gh_demo.h" #else #endif @@ -67,10 +65,6 @@ static bool g_ppg_service_initialled = false; uint8_t card_databuf[64] = {0}; uint8_t light_databuf[64] = {0}; - -osTimerId_t g_ppg_service_timer = NULL; - - /*** * 其他cmd在Header里定义,对外开放 */ @@ -95,151 +89,92 @@ void set_keep_in_wear_det_mode(uint8_t mod) keep_in_wear_det_mod = mod; } -#ifdef PPG_HX3695 -//漏光测试 -errcode_t update_leaklight_event_notify(uint8_t *data) -{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "send lightdata to ui %s",data); - //CustomEventPublish(TOPIC_EVENT_LEAKLIGHT_UPDATA,(uint8_t*)data,strlen((char*)data)); - return 0; -} -errcode_t update_leaklight_event_sendmsg_toUI(uint8_t *data) -{ - /**通过UI事件发送Notify*/ - GraphicService::GetInstance()->PostGraphicEvent(std::bind(update_leaklight_event_notify, data)); - return ERRCODE_SUCC; -} - - -//灰卡测试 -errcode_t update_graycard_event_notify(uint8_t *data) -{ - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "send carddata to ui %s",data); - //CustomEventPublish(TOPIC_EVENT_GRAYCARD_UPDATA,(uint8_t*)data,strlen((char*)data)); - return 0; -} -errcode_t update_graycard_event_sendmsg_toUI(uint8_t *data) -{ - /**通过UI事件发送Notify*/ - GraphicService::GetInstance()->PostGraphicEvent(std::bind(update_graycard_event_notify, data)); - return ERRCODE_SUCC; -} - - -//血氧 -errcode_t update_spo2_event_notify(uint8_t spo2) -{ - //CustomEventPublish(TOPIC_EVENT_SPO2_UPDATE,(uint8_t*)&spo2,sizeof(spo2)); - return 0; -} -errcode_t update_spo2_event_sendmsg_toUI(uint8_t spo2) -{ - /**通过UI事件发送Notify*/ - GraphicService::GetInstance()->PostGraphicEvent(std::bind(update_spo2_event_notify, spo2)); - return ERRCODE_SUCC; -} - -//心率 -errcode_t update_hrs_event_notify(uint8_t hrs) -{ - //CustomEventPublish(TOPIC_EVENT_HEARTRATE_UPDATA,(uint8_t*)&hrs,sizeof(hrs)); - return 0; -} -errcode_t update_hrs_event_sendmsg_toUI(uint8_t hrs) -{ - /**通过UI事件发送Notify*/ - GraphicService::GetInstance()->PostGraphicEvent(std::bind(update_hrs_event_notify, hrs)); - return ERRCODE_SUCC; -} - +// //血氧 +// errcode_t update_spo2_event_notify(uint8_t spo2) +// { +// CustomEventPublish(TOPIC_EVENT_SPO2_UPDATE,(uint8_t*)&spo2,sizeof(spo2)); +// return 0; +// } +// errcode_t update_spo2_event_sendmsg_toUI(uint8_t spo2) +// { +// /**通过UI事件发送Notify*/ +// GraphicService::GetInstance()->PostGraphicEvent(std::bind(update_spo2_event_notify, spo2)); +// return ERRCODE_SUCC; +// } -//穿戴状态 -errcode_t update_wearstatus_event_notify(int32_t wearstatus) -{ - //CustomEventPublish(TOPIC_EVENT_WEARSTATE_UPDATE,(uint8_t*)&wearstatus,sizeof(wearstatus)); - return 0; -} -errcode_t update_wearstatus_event_sendmsg_toUI(int32_t wearstatus) -{ - /**通过UI事件发送Notify*/ - GraphicService::GetInstance()->PostGraphicEvent(std::bind(update_wearstatus_event_notify, wearstatus)); - return ERRCODE_SUCC; -} +// //心率 +// errcode_t update_hrs_event_notify(uint8_t hrs) +// { +// CustomEventPublish(TOPIC_EVENT_HEARTRATE_UPDATA,(uint8_t*)&hrs,sizeof(hrs)); +// return 0; +// } +// errcode_t update_hrs_event_sendmsg_toUI(uint8_t hrs) +// { +// /**通过UI事件发送Notify*/ +// GraphicService::GetInstance()->PostGraphicEvent(std::bind(update_hrs_event_notify, hrs)); +// return ERRCODE_SUCC; +// } -//静息心率 -errcode_t update_static_hrs_event_notify(int32_t hrs) -{ - //CustomEventPublish(TOPIC_EVENT_STATIC_HEARTRATE_UPDATA,(uint8_t*)&hrs,sizeof(hrs)); - return 0; -} -errcode_t update_static_hrs_event_sendmsg_toUI(int32_t hrs) -{ - /**通过UI事件发送Notify*/ - GraphicService::GetInstance()->PostGraphicEvent(std::bind(update_static_hrs_event_notify, hrs)); - return ERRCODE_SUCC; -} +// //穿戴状态 +// errcode_t update_wearstatus_event_notify(int32_t wearstatus) +// { +// CustomEventPublish(TOPIC_EVENT_WEARSTATE_UPDATE,(uint8_t*)&wearstatus,sizeof(wearstatus)); +// return 0; +// } +// errcode_t update_wearstatus_event_sendmsg_toUI(int32_t wearstatus) +// { +// /**通过UI事件发送Notify*/ +// GraphicService::GetInstance()->PostGraphicEvent(std::bind(update_wearstatus_event_notify, wearstatus)); +// return ERRCODE_SUCC; +// } -void hx3695_msg_callback(uint8_t msg_type, uint8_t *msg_data, int32_t msg_datalen) -{ -#if 0 - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "hx3695_msg_callback"); - FT_CUSTOM_RESULTS_t sensor_data; // 使用更通用的名称 sensor_data -#if 1 - if (msg_datalen < sizeof(FT_CUSTOM_RESULTS_t)) { - // 数据长度不足以填充整个结构体 - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Invalid data length for SPO2 update"); - //return; - } -#endif - memcpy(&sensor_data, msg_data, sizeof(FT_CUSTOM_RESULTS_t)); - switch(msg_type) - { - case HX3695_MSG_TYPE_HRS_UPDATE: - //每秒心率 - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HX3695_MSG_TYPE_HRS_UPDATE = %d", sensor_data.lastesthrs); - update_hrs_event_sendmsg_toUI(sensor_data.lastesthrs); - break; - case HX3695_MSG_TYPE_HRV_UPDATE: - break; - case HX3695_MSG_TYPE_SPO2_UPDATE: - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HX3695_MSG_TYPE_SPO2_UPDATE = %d", sensor_data.lastestspo2); - update_spo2_event_sendmsg_toUI(sensor_data.lastestspo2); - break; - case HX3695_MSG_TYPE_LEAKLIGHT_UPDATE: - memset_s(light_databuf,64,0,64); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LEAKLIGHT_UPDATE"); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HX3695_MSG_TYPE_leak_green_UPDATE = %d", sensor_data.leak_green); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HX3695_MSG_TYPE_leak_red_UPDATE = %d", sensor_data.leak_red); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HX3695_MSG_TYPE_leak_ir_UPDATE = %d", sensor_data.leak_ir); - sprintf((char *)light_databuf,"%d,%d,%d",sensor_data.leak_green,sensor_data.leak_red,sensor_data.leak_ir); - update_leaklight_event_sendmsg_toUI(light_databuf); - break; - case HX3695_MSG_TYPE_GRAYCARD_UPDATE: - memset_s(card_databuf,64,0,64); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GRAYCARD_UPDATE"); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HX3695_MSG_TYPE_card_green_UPDATE = %d", sensor_data.card_green); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HX3695_MSG_TYPE_card_red_UPDATE = %d", sensor_data.card_red); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HX3695_MSG_TYPE_card_ir_UPDATE = %d", sensor_data.card_ir); - sprintf((char *)card_databuf,"%d,%d,%d",sensor_data.card_green,sensor_data.card_red,sensor_data.card_ir); - update_graycard_event_sendmsg_toUI(card_databuf); - break; - case HX3695_MSG_TYPE_WEARSTAT_UPDATE: - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HX3695_MSG_TYPE_WEARSTATUS_UPDATE = %d", sensor_data.wearstatus); - update_wearstatus_event_sendmsg_toUI(sensor_data.wearstatus); - break; - case HX3695_MSG_TYPE_STATIC_HRS_UPDATE: - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HX3695_MSG_TYPE_STATIC_HRS_UPDATE = %d", sensor_data.lastesthrs); - update_static_hrs_event_sendmsg_toUI(sensor_data.lastesthrs); - break; - default: - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Unknown sensor message type"); - break; - } -#endif -} +// //静息心率 +// errcode_t update_static_hrs_event_notify(int32_t hrs) +// { +// CustomEventPublish(TOPIC_EVENT_STATIC_HEARTRATE_UPDATA,(uint8_t*)&hrs,sizeof(hrs)); +// return 0; +// } +// errcode_t update_static_hrs_event_sendmsg_toUI(int32_t hrs) +// { +// /**通过UI事件发送Notify*/ +// GraphicService::GetInstance()->PostGraphicEvent(std::bind(update_static_hrs_event_notify, hrs)); +// return ERRCODE_SUCC; +// } -#endif +// void ppg_msg_callback(uint8_t msg_type, uint8_t *msg_data, int32_t msg_datalen) +// { +// WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ppg_msg_callback"); + +// if(msg_datalen > 1 || msg_data == NULL) +// return; + +// switch(msg_type) +// { +// case PPG_MSG_TYPE_HRS_UPDATE: +// //每秒心率 +// WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HX3695_MSG_TYPE_HRS_UPDATE = %d", *msg_data); +// update_hrs_event_sendmsg_toUI(*msg_data); +// break; +// case PPG_MSG_TYPE_HRV_UPDATE: +// break; +// case PPG_MSG_TYPE_SPO2_UPDATE: +// WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HX3695_MSG_TYPE_SPO2_UPDATE = %d", *msg_data); +// update_spo2_event_sendmsg_toUI(*msg_data); +// break; +// case PPG_MSG_TYPE_WEARSTAT_UPDATE: +// WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HX3695_MSG_TYPE_WEARSTATUS_UPDATE = %d", *msg_data); +// update_wearstatus_event_sendmsg_toUI(*msg_data); +// break; +// case PPG_MSG_TYPE_STATIC_HRS_UPDATE: +// WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HX3695_MSG_TYPE_STATIC_HRS_UPDATE = %d", *msg_data); +// update_static_hrs_event_sendmsg_toUI(*msg_data); +// break; +// default: +// WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Unknown sensor message type"); +// break; +// } +// } void uapi_ppg_service_deinit(void) { @@ -249,17 +184,21 @@ void uapi_ppg_service_deinit(void) errcode_t send_ppg_cmd_msg(int cmd) { errcode_t ret; - if (ppg_sensor_exist == false) + if (ppg_sensor_exist == false) { + // uapi_save_runtime_log(RUNTIME_LOG_HEART_EXIST_ERROR); return OSAL_FAILURE; + } + + // PRINT("cmd : 0x%x\n",cmd); - // printf("send_ppg_cmd_msg cmd : 0x%x\n",cmd); - PPG_CMD_TYPE_T mail = 0; mail = cmd; ret = osal_msg_queue_write_copy(g_app_queue, (void *)&mail, sizeof(PPG_CMD_TYPE_T), 0); if (ret != OSAL_SUCCESS) { - PRINT_ERR("Error ppg Check MSG 0x%02X send failed! err=0x%x! \r\n",cmd, ret); + PRINT_ERR("Error ppg Check MSG 0x%02X send failed! err=0x%x! \r\n", cmd, + ret); + // uapi_save_runtime_log(RUNTIME_LOG_HEART_MSG_ERROR); } return ret; } @@ -279,11 +218,9 @@ static void ppg_service_check_task(void *arg) } if((wear_mode_state == 1) && (mail > 0x10) && mail != PPG_SERVICE_CMD_TYPE_STOP_WEAR_MODE_TEST) { - // uapi_save_runtime_log(RUNTIME_LOG_WEAR_MIN_STOP); + uapi_save_runtime_log(RUNTIME_LOG_WEAR_MIN_STOP); wear_mode_state = 0; -#ifdef PPG_HX3695 ppg_send_cmd_to_driver("wear",0); -#endif ppg_service_running_stat = false; } char* cmd = "hrs"; @@ -292,6 +229,7 @@ static void ppg_service_check_task(void *arg) // #ifdef PPG_HX3695 // heart_rate_meas_timeout_handler(NULL); // #endif + // ppg_hrs_timer_handler(); ppg_timer_handler(HRS_TIMER_MODE); continue; }else if (mail == PPG_SERVICE_CMD_TYPE_DO_PPG_AGC_TIMER_CALLBACK){ @@ -304,11 +242,12 @@ static void ppg_service_check_task(void *arg) // #ifdef PPG_HX3695 // wear_mode_timeout_handler(NULL); // #endif + // ppg_wear_timer_handler(); ppg_timer_handler(WEAR_TIMER_MODE); continue; }else if (mail == PPG_SERVICE_CMD_TYPE_DO_PPG_TEST){ //do_cywee_service_check_msg(CYWEE_SERVICE_CMD_OPEN_GET_ACC,NULL); - // uapi_save_runtime_log(RUNTIME_LOG_HEART_DRIVER_MEASURE); + uapi_save_runtime_log(RUNTIME_LOG_HEART_DRIVER_MEASURE); cmd = "hrs"; enable = 1; // uint8_t cnt = pm_veto_get_id_cnt(PM_ID_HEART); @@ -330,8 +269,8 @@ static void ppg_service_check_task(void *arg) cmd = "graycard"; enable = 1; }else if (mail == PPG_SERVICE_CMD_TYPE_DO_WEAR_MODE_TEST){ - if (keep_in_wear_det_mod == 0) continue;; - // uapi_save_runtime_log(RUNTIME_LOG_WEAR_MIN_START); + if (keep_in_wear_det_mod == 0) continue; + uapi_save_runtime_log(RUNTIME_LOG_WEAR_MIN_START); cmd = "wear"; enable = 1; wear_mode_state = 1; @@ -347,7 +286,7 @@ static void ppg_service_check_task(void *arg) enable = 0; wear_mode_state = 0; }else if (mail == PPG_SERVICE_CMD_TYPE_STOP_PPG_TEST){ - // uapi_save_runtime_log(RUNTIME_LOG_HEART_DRIVER_MEASURE_END); + uapi_save_runtime_log(RUNTIME_LOG_HEART_DRIVER_MEASURE_END); cmd = "hrs"; enable = 0; // uint8_t cnt = pm_veto_get_id_cnt(PM_ID_HEART); @@ -360,30 +299,21 @@ static void ppg_service_check_task(void *arg) cmd = "spo2"; enable = 0; } - else if (mail == PPG_SERVICE_CMD_TYPE_OPEN_HRS_BLE) - { -#ifdef PPG_HX3695 - // hx3695_set_hrs_ble_swtich(1); -#endif - continue ; - } - else if (mail == PPG_SERVICE_CMD_TYPE_CLOSE_HRS_BLE) - { -#ifdef PPG_HX3695 - // hx3695_set_hrs_ble_swtich(0); -#endif - continue ; - }else if (mail == PPG_SERVICE_CMD_TYPE_INT_HANDLER){ -#ifdef PPG_VC9202 - vc9202_usr_interrupt_handler(SPORT_TYPE_NORMAL,0); -#elif defined PPG_VC921X - cmd = "int"; - enable = 1; - ppg_send_cmd_to_vc921x_driver(cmd,enable); -#elif defined PPG_GH3X2X - hal_gh3x2x_afe_int_handler_call_back(); - GH3X2X_AFE_ChipPro(); -#endif + else if (mail == PPG_SERVICE_CMD_TYPE_INT_HANDLER){ +// #ifdef PPG_VC9202 +// vc9202_usr_interrupt_handler(SPORT_TYPE_NORMAL,0); +// #elif defined PPG_VC921X +// cmd = "int"; +// enable = 1; +// ppg_send_cmd_to_vc921x_driver(cmd,enable); +// #elif defined PPG_GH3X2X +// hal_gh3x2x_afe_int_handler_call_back(); +// GH3X2X_AFE_ChipPro(); +// #elif defined PPG_PAH8009 +// hal_gh3x2x_afe_int_handler_call_back(); +// GH3X2X_AFE_ChipPro(); +// #endif + ppg_int_handler(); continue; } else if (mail == PPG_SERVICE_CMD_TYPE_FPC_TEST){ @@ -408,36 +338,23 @@ static void ppg_service_check_task(void *arg) continue ; } -#ifdef PPG_HX3695 ppg_send_cmd_to_driver(cmd,enable); -#elif defined (PPG_VC9202) - ppg_send_cmd_to_vc9202_driver(cmd,enable); -#elif defined(PPG_VC921X) - ppg_send_cmd_to_vc921x_driver(cmd,enable); -#elif defined(PPG_GH3X2X) - ppg_send_cmd_to_gh3x2x_driver(cmd,enable); -#endif if(enable == 1) ppg_service_running_stat = true; else ppg_service_running_stat = false; - if((strcmp(cmd, "wear") != 0) && (enable == 0)) { if (keep_in_wear_det_mod == 1) { uapi_save_runtime_log(RUNTIME_LOG_WEAR_MIN_START); -#ifdef PPG_HX3695 ppg_send_cmd_to_driver("wear",1); -#endif wear_mode_state = 1; ppg_service_running_stat = true; } } - } - } void create_ppg_queue(void) { @@ -452,7 +369,7 @@ errcode_t uapi_ppg_service_init(void) if (ppg_get_chip_id() != PPG_CHIP_ID) { - LOS_Mdelay(50); + LOS_Mdelay(10); if (ppg_get_chip_id() != PPG_CHIP_ID) { @@ -461,12 +378,19 @@ errcode_t uapi_ppg_service_init(void) } } + // ppg_register_msg_callback(ppg_msg_callback);//注册驱动回调 + // ppg_send_cmd_to_driver("wear",0); + ppg_sensor_exist = true; app_task_definition_t taskcfg={0}; taskcfg.create_queue_handle = create_ppg_queue; taskcfg.attr.name="ppg_service"; +// #ifdef BOARD_FD230 taskcfg.attr.priority = osPriorityBelowNormal4; +// #else +// taskcfg.attr.priority = osPriorityAboveNormal5; +// #endif taskcfg.attr.stack_size = PPG_SERVICE_TASK_SIZE; taskcfg.func = ppg_service_check_task; taskcfg.use_mem = USE_EXTEND_MEM; @@ -478,17 +402,14 @@ errcode_t uapi_ppg_service_init(void) return ERRCODE_FAIL; } - send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_DO_WEAR_MODE_TEST); - // g_ppg_service_timer = osTimerNew((osTimerFunc_t)ppg_int_callback, osTimerPeriodic, NULL, NULL); - return ERRCODE_SUCC; } void ppg_int_callback(pin_t pin, uintptr_t param) { uapi_gpio_clear_interrupt(pin); - uint32_t tm; - uapi_get_timestampe_ms(&tm); + // uint32_t tm; + // uapi_get_timestampe_ms(&tm); // PRINT("ppg_int_callback %d 0x%X tm : %d \n",pin,param,tm); send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_INT_HANDLER); } @@ -502,6 +423,7 @@ void ppg_int_callback(pin_t pin, uintptr_t param) // DEBUG_PRINTF("ppg_service_service suspend!\r\n"); // } + #ifdef __cplusplus #if __cplusplus } diff --git a/code/sdk/zhihui/drivers/ppg/vc9202/CMakeLists.txt b/code/sdk/zhihui/drivers/ppg/vc9202/CMakeLists.txt deleted file mode 100644 index 0bf14bb6e..000000000 --- a/code/sdk/zhihui/drivers/ppg/vc9202/CMakeLists.txt +++ /dev/null @@ -1,63 +0,0 @@ -#=============================================================================== -# @brief cmake file -# Copyright (c) @CompanyNameMagicTag 2022-2023. All rights reserved. -#=============================================================================== -set(COMPONENT_NAME "ppg_sensor_vc9202") - -if("PPG_VC9202" IN_LIST DEFINES) -set(SOURCES ${SOURCES} - ${CMAKE_CURRENT_SOURCE_DIR}/src/vc9202_driver_testmode.c - ${CMAKE_CURRENT_SOURCE_DIR}/src/vc9202_driver.c - ${CMAKE_CURRENT_SOURCE_DIR}/src/vc9202_user_debug.c - ${CMAKE_CURRENT_SOURCE_DIR}/src/vc9202_user.c - ${CMAKE_CURRENT_SOURCE_DIR}/src/vc9202_hal.c -) -set(PUBLIC_HEADER - ${CMAKE_CURRENT_SOURCE_DIR}/inc - -) - -else() -set(SOURCES ${SOURCES} - # ${CMAKE_CURRENT_SOURCE_DIR}/ztw523_touch/ztw523_ctrl.c -) -set(PUBLIC_HEADER - ${CMAKE_CURRENT_SOURCE_DIR} -) -endif() - - -set(PRIVATE_HEADER -) - -set(PRIVATE_DEFINES -) - -set(PUBLIC_DEFINES -) - -# use this when you want to add ccflags like -include xxx -set(COMPONENT_PUBLIC_CCFLAGS -) - -set(COMPONENT_CCFLAGS -) - -set(WHOLE_LINK - true -) - -set(MAIN_COMPONENT - false -) - -if("PPG_VC9202" IN_LIST DEFINES) - find_library(LIB_PATH_VC9202_1 lib/lib_BIO_v151_int_miniSDK_log_02.a ${CMAKE_CURRENT_SOURCE_DIR}) - find_library(LIB_PATH_VC9202_2 lib/lib_hr_v640ed04_miniSDK_NA_01.a ${CMAKE_CURRENT_SOURCE_DIR}) - find_library(LIB_PATH_VC9202_3 lib/lib_Sp_Int_HaiSi_01.a ${CMAKE_CURRENT_SOURCE_DIR}) - find_library(LIB_PATH_VC9202_4 lib/lib_spo2_9202A4_limit_HaiSi_NA_01.a ${CMAKE_CURRENT_SOURCE_DIR}) - - target_link_libraries(${TARGET_NAME} PRIVATE -Wl,--whole-archive ${LIB_PATH_VC9202_1} ${LIB_PATH_VC9202_2} ${LIB_PATH_VC9202_3} ${LIB_PATH_VC9202_4} PRIVATE -Wl,--whole-archive) -endif() -build_component() - diff --git a/code/sdk/zhihui/drivers/ppg/vc9202/inc/BIODetect_V15_1.h b/code/sdk/zhihui/drivers/ppg/vc9202/inc/BIODetect_V15_1.h deleted file mode 100644 index d03b0b1dd..000000000 --- a/code/sdk/zhihui/drivers/ppg/vc9202/inc/BIODetect_V15_1.h +++ /dev/null @@ -1,16 +0,0 @@ - - -#ifndef BIODETECT -#define BIODETECT - -#include -#include -#include - -void f_BIOInit(int32_t gapDeltaBIO, int32_t gapDeltaPS); - -uint8_t f_BIOdetect(int32_t inputBIO, int32_t inputPS, int32_t PSth); - -char* bioVersion(void); - -#endif /* BIODETECT */ \ No newline at end of file diff --git a/code/sdk/zhihui/drivers/ppg/vc9202/inc/algo.h b/code/sdk/zhihui/drivers/ppg/vc9202/inc/algo.h deleted file mode 100644 index a370e99ff..000000000 --- a/code/sdk/zhihui/drivers/ppg/vc9202/inc/algo.h +++ /dev/null @@ -1,70 +0,0 @@ - -#ifndef APP_ALGO_ALGO_H -#define APP_ALGO_ALGO_H - -#include -#include - -typedef enum -{ - SPORT_TYPE_NORMAL =0x00, // 日常 - SPORT_TYPE_RUNNING =0x01, // 跑步 - SPORT_TYPE_RIDE_BIKE =0X02, // 骑行 - SPORT_TYPE_JUMP_ROPE =0X03, // 跳绳 - SPORT_TYPE_SWIMMING =0X04, // 游泳 - SPORT_TYPE_BADMINTON =0X05, // 羽毛球 - SPORT_TYPE_TABLE_TENNIS=0X06, // 乒乓球 - SPORT_TYPE_TENNIS =0X07, // 网球 - SPORT_TYPE_CLIMBING =0X08, // 爬山 - SPORT_TYPE_WALKING =0X09, // 椭圆机 - SPORT_TYPE_BASKETBALL =0X0A, // 篮球 - SPORT_TYPE_FOOTBALL =0X0B, // 足球 - SPORT_TYPE_BASEBALL =0X0C, // 棒球 - SPORT_TYPE_VOLLEYBALL =0X0D, // 排球 - SPORT_TYPE_CRICKET = 0X0E, // 板球 - SPORT_TYPE_RUGBY = 0X0F, // 橄榄球 - SPORT_TYPE_HOCKEY =0X10, // 曲棍球 - SPORT_TYPE_DANCE = 0X11, // 跳舞 - SPORT_TYPE_SPINNING = 0X12, // 动感单车 - SPORT_TYPE_YOGA = 0X13, // 瑜伽 - SPORT_TYPE_SIT_UP =0X14, // 仰卧起坐 - SPORT_TYPE_TREADMILL =0X15, // 跑步机 - SPORT_TYPE_GYMNASTICS =0X16, // 体操 - SPORT_TYPE_BOATING = 0X17, // 划船 - SPORT_TYPE_JUMPING_JACK = 0X18, // 开合跳 - SPORT_TYPE_FREE_TRAINING = 0X19,// 自由训练 - SPORT_TYPE_PERIODIC_MONITORING = 0X1A,// 定时监测模式 -} AlgoSportMode; -//未出现在上表中的运动形式均先以跑步输入 - - -typedef struct -{ - int32_t x; - int32_t y; - int32_t z; -}AlgoAxesData_t; - -typedef struct -{ - int32_t hrData; - int32_t reliability; -}AlgoOutputData_t; - -typedef struct -{ - AlgoAxesData_t axes; - int32_t ppgSample; - int32_t envSample; -}AlgoInputData_t; - -void Algo_Init(void); -void Algo_Input(AlgoInputData_t *pInputData,int32_t gaptime,AlgoSportMode sportMode,int16_t surfaceRecogMode,int16_t opticalAidMode); -void Algo_Output(AlgoOutputData_t *pOutputData); - - - -#endif /* APP_ALGO_ALGO_H_ */ - - - diff --git a/code/sdk/zhihui/drivers/ppg/vc9202/inc/spo2Algo.h b/code/sdk/zhihui/drivers/ppg/vc9202/inc/spo2Algo.h deleted file mode 100644 index 351643ae3..000000000 --- a/code/sdk/zhihui/drivers/ppg/vc9202/inc/spo2Algo.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef __SPO2ALGO_H__ -#define __SPO2ALGO_H__ - -#include - -void spo2AlgoInit(void); -int32_t spo2Algo(int32_t r_ppg, int32_t ir_ppg, int32_t mode); - -void spo2_algo_content_init(void); - -char * -version_info_spo2(void); - -#endif diff --git a/code/sdk/zhihui/drivers/ppg/vc9202/inc/vc30x91x92x_common.h b/code/sdk/zhihui/drivers/ppg/vc9202/inc/vc30x91x92x_common.h deleted file mode 100644 index 36badd54a..000000000 --- a/code/sdk/zhihui/drivers/ppg/vc9202/inc/vc30x91x92x_common.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * @Author: penglei 1624952103@qq.com - * @Date: 2024-12-07 16:04:22 - * @LastEditors: penglei 1624952103@qq.com - * @LastEditTime: 2024-12-09 10:32:42 - * @FilePath: /sdk615/code/sdk/drivers/peripheral/ppg/vc9202/vc30x91x92x_common.h - * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE - */ -/********************************************************************************************************* - * Copyright(c) 2022, vcare Corporation. All rights reserved. - ********************************************************************************************************** - * @file vc30x91x92x_common.h - * @brief configuration file for vc30x,vc91x,vc92x. - * @details - * @author - * @date - * @version - *********************************************************************************************************/ -#ifndef __VC30x91x92x_COMMON_H__ -#define __VC30x91x92x_COMMON_H__ - -#include "algo.h" -#include "spo2Algo.h" -#include "vcSportMotionIntAlgo.h" - -#ifndef SUB -#define SUB(a, b) ((a) - (b)) -#endif -#ifndef ABS -#define ABS(a, b) (((a) > (b)) ? ((a) - (b)) : ((b) - (a))) -#endif - -#define FUNC_DISABLE (0) -#define FUNC_ENABLE (!FUNC_DISABLE) -#define WEAR_IS_DROP (0) -#define WEAR_IS_HOLD (1) - -typedef enum -{ - WEAR_STA_NONE = 0, - WEAR_STA_HOLD = 1, - WEAR_STA_DROP = 2, -}WearStatusTypeDef; - -typedef enum -{ - WORK_MODE_NONE = 0, - WORK_MODE_HR = 1, - WORK_MODE_SPO2 = 2, - WORK_MODE_HRV = 3, /* 100hz������ʹ��BIO������Ҫ��֤�ܹ��õ���ʱ��Ӧ��������Ȼ���ܻᵼ�¶��жϣ����������� */ - WORK_MODE_STRESS = 4, - WORK_MODE_WEAR = 5, - WORK_MODE_FACTORY = 6, - WORK_MODE_TEMPERATURE = 7, - WORK_MODE_FPC_TEST = 8, -}WorkModeTypeDef; - -typedef struct -{ - unsigned short sampling_gap_time; - WorkModeTypeDef work_mode; -}InitParamTypeDef; - -typedef struct -{ - unsigned char led_cur[3]; - unsigned char pd_res[3]; - unsigned char env_val[3]; - unsigned char pre_val[2]; - unsigned char ps_val; - unsigned char aenv_val[3]; - unsigned char apdbias_val[4]; - unsigned int pdbias; - unsigned char apre_val[2]; - unsigned char aps_val; - unsigned int ppg_data[128]; - unsigned short int bio_val_i; - unsigned short int bio_val_o; - signed short int temp_val_i; - signed short int temp_val_o; -}SamplingDataTypeDef; - -extern unsigned char usr_iic_write_bytes(unsigned char reg_addr, unsigned char *pBuffer, unsigned char buf_size); -extern unsigned char usr_iic_read_bytes(unsigned char reg_addr, unsigned char *pBuffer, unsigned char buf_size); -extern unsigned int usr_get_clock_ticks(void); - -#endif diff --git a/code/sdk/zhihui/drivers/ppg/vc9202/inc/vc9202_common.h b/code/sdk/zhihui/drivers/ppg/vc9202/inc/vc9202_common.h deleted file mode 100644 index 64d5ff998..000000000 --- a/code/sdk/zhihui/drivers/ppg/vc9202/inc/vc9202_common.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * @Author: penglei 1624952103@qq.com - * @Date: 2024-12-07 16:04:22 - * @LastEditors: penglei 1624952103@qq.com - * @LastEditTime: 2024-12-10 18:40:24 - * @FilePath: /sdk615/code/sdk/drivers/peripheral/ppg/vc9202/inc/vc9202_common.h - * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE - */ -/********************************************************************************************************* - * Copyright(c) 2022, vcare Corporation. All rights reserved. - ********************************************************************************************************** - * @file vc9202_common.h - * @brief configuration file for the hardware driver layer - * @details - * @author - * @date - * @version - *********************************************************************************************************/ -#ifndef __VC9202_COMMON_H__ -#define __VC9202_COMMON_H__ - -#include "vc30x91x92x_common.h" - -#define VC9202_CFG_DRV_BY_TIMER (FUNC_DISABLE) -/* VC_COMMON_VC9202_CFG_SAMPLE_RATE: default 25hz */ -#define VC9202_CFG_SAMPLE_RATE (25) -/*VC_COMMON_CFG_GPIO_TIME: 0-50us, 1-100us, 2-200us, 3-400us */ -#define VC9202_CFG_INTERRUPT_TIME (3) -/* 0:rising edge 1:descending edge */ -#define VC9202_CFG_INTERRUPT_MODE (0) - -#define VC9202_CFG_CLK_CHECK_FREQUENCY (32000) //counter 32K -#define VC9202_CFG_CLK_CHECK_MAX (0xFFFFFF) //24bits counter -#define VC9202_CFG_CLK_CHECK_GAPTIME (10) //seconds -#define VC9202_CFG_CLK_CHECK_DEVIATION (3) - -/**************************************************************************** - * Configuration wear parameters - ***************************************************************************/ -#define VC9202_CFG_WEAR_DETECTION (FUNC_ENABLE) // FUNC_DISABLE FUNC_ENABLE -#define VC9202_CFG_WEAR_DEFAULT_STATUS (WEAR_IS_HOLD) //1 is default wear,0 is default not wear WEAR_IS_HOLD WEAR_IS_DROP -#define VC9202_CFG_WEAR_BIO_EN (FUNC_ENABLE) -#define VC9202_CFG_WEAR_ALG_EN (FUNC_DISABLE) //开启心率摘下功能,必须开启满足(ATC|BIO)为真 -#define VC9202_CFG_WEAR_ACT_EN (FUNC_DISABLE) -#define VC9202_CFG_WEAR_THRESHOLD_EN (FUNC_ENABLE) //绝对阈值宏开关 -#define VC9202_CFG_WEAR_HOLD_CNT (1) -#define VC9202_CFG_WEAR_DROP_CNT (3) - -/* sensor serial default wear param */ -#define VC9202_CFG_WEAR_PARAM_PS (128) -#define VC9202_CFG_WEAR_PARAM_PSIN (100) -#define VC9202_CFG_WEAR_PARAM_ENVMAX (128) //8*16 -#define VC9202_CFG_WEAR_PARAM_ENVMIN (64) //4*16 -#define VC9202_CFG_WEAR_PARAM_BIOIN (40) - -#define VC9202_CFG_PS_SLOT_CUR (0x3A) /* 0x5A */ -#define VC9202_CFG_PS_SLOT_RES (0x47) - -/* board cap halve,电容减半,需要提高一倍采样率的配置 */ -#define VC9202_CFG_IS_HALVE_CAP 0 - -/* VC9202 function */ -extern unsigned char vc9202_drv_reg_init(InitParamTypeDef *pInit_Param); -extern unsigned char vc9202_drv_get_chip_id(void); -extern void vc9202_drv_start_sampling(void); -extern void vc9202_drv_stop_sampling(void); -extern void vc9202_drv_soft_reset(void); -extern unsigned char vc9202_drv_channel_switch(unsigned char num_channel, unsigned char enable_flag); -extern unsigned char vc9202_drv_get_int_reason(void); -extern void vc9202_drv_set_algo_wear_status(WearStatusTypeDef status); -extern void vc9202_drv_set_gsensor_actuating_quantity(unsigned int axis_diff); -extern WearStatusTypeDef vc9202_drv_get_wear_status(void); -extern unsigned char vc9202_drv_get_sampling_data(SamplingDataTypeDef *pSamplingData, unsigned char *psize); -/* electrostatic patch */ -extern void vc9202_drv_electrostatic_death( void ); - -#endif diff --git a/code/sdk/zhihui/drivers/ppg/vc9202/inc/vc9202_driver.h b/code/sdk/zhihui/drivers/ppg/vc9202/inc/vc9202_driver.h deleted file mode 100644 index 047534aaa..000000000 --- a/code/sdk/zhihui/drivers/ppg/vc9202/inc/vc9202_driver.h +++ /dev/null @@ -1,184 +0,0 @@ -/********************************************************************************************************* - * Copyright(c) 2022, vcare Corporation. All rights reserved. - ********************************************************************************************************* - * @file vc9202_driver.h - * @brief vc9202 driver layer interface implementation. - * @details - * @author - * @date - * @version - *********************************************************************************************************/ - -#ifndef __VC9202_DRIVER_H__ -#define __VC9202_DRIVER_H__ - -#include "vc9202_common.h" - -#define VC9202_STATUS_CONFLICT (1<<4) -#define VC9202_STATUS_INSAMPLE (1<<3) -#define VC9202_STATUS_OVERLOAD2 (1<<2) -#define VC9202_STATUS_OVERLOAD1 (1<<1) -#define VC9202_STATUS_OVERLOAD0 (1<<0) - -#define VC9202_EVENT_TEMP_MARK (1<<6) //128 -#define VC9202_EVENT_BIO_MARK (1<<5) //64 -#define VC9202_EVENT_PS_MARK (1<<4) //32 -#define VC9202_EVENT_OV_MARK (1<<3) //8 -#define VC9202_EVENT_FIFO_MARK (1<<2) //4 -#define VC9202_EVENT_ENV_MARK (1<<1) //2 -#define VC9202_EVENT_PPG_MARK (1<<0) //1 - -#define VC9202_MAX_RES_LEVEL 17 //21 9202offset只有0-2,3和2一样、所以表中只有17个等效 -#define VC9202_MAX_CUR_LEVEL 0x6F - -#define VC9202_ENV_MAX_TH 8*16 - -/* adjust marco */ -#define VC9202_PPG_TH_CELL 10 // Causes of PPG interruption PPG_TH = 300 -#define VC9202_ADJUST_INCREASE 22 // 1.4 << 4 = 22.4//1.4f -#define VC9202_ADJUST_DECREASE 11 // 0.7 << 4 = 11.2//0.7f -#define VC9202_ADJUST_STEP_MAX 32 -#define VC9202_ADJUST_STEP_MIN 1 -#define VC9202_SLOTCHNU 3 - -/* bio算法运算结果宏定义 */ -#define VC9202_BIO_STA_NONE 0 -#define VC9202_BIO_STA_DROP 1 -#define VC9202_BIO_STA_HOLD 2 - -/**************************************************************************** - * driver ret enum - ***************************************************************************/ -typedef enum -{ - RET_OK = 0, - RET_STATUS_ERR = (1<<0), - RET_OVERLOAD_ERR = (1<<1), - RET_ENV_ERR = (1<<2), - RET_PPG_ERR = (1<<3), - RET_OSC_ERR = (1<<4), - RET_FIFO_ERR = (1<<5), -}VC9202DrvRetTypeDef; - -/**************************************************************************** - * clock calibration_struct - ***************************************************************************/ -typedef struct -{ - unsigned int last_clk_count; - unsigned int osc_gap_cnt; - unsigned char count_index; - unsigned int osc_count[6]; - unsigned int clk_count[6]; - unsigned int last_clk_check; /* 2023.06.05,check running gaptime */ -}VC9202OscClkTypeDef; - -/**************************************************************************** - * WearStatus_struct - ***************************************************************************/ -typedef struct -{ - unsigned char wear_ps; - unsigned char wear_env; - short int wear_bio; - unsigned char wear_hold_cnt; - unsigned char wear_drop_cnt; - WearStatusTypeDef wear_status; - WearStatusTypeDef last_status; -}VC9202WearInfoTypeDef; - -typedef enum -{ - WEAR_NO_CHANGE = 0, - DROP_TO_HOLD = 1, - HOLD_TO_DROP = 2, -}VC9202WearChangeTypeDef; - -/**************************************************************************** - * ADJUST_struct - ***************************************************************************/ -typedef struct -{ - unsigned char res; - unsigned char offset; - unsigned char low; -}VC9202ResTableTypeDef; - -typedef struct -{ - unsigned char res_val; - unsigned char low_res; - unsigned char offset; - unsigned char offset3; -}VC9202ResLevelTypeDef; - -typedef enum -{ - AGC_DIR_NULL = 0, - AGC_DIR_UP = 1, - AGC_DIR_DOWN = 2, -}VC9202AgcDirTypeDef; - -typedef struct -{ - VC9202AgcDirTypeDef dir; - VC9202AgcDirTypeDef last_dir; - unsigned char current_step; -}VC9202AgcInfoTypeDef; - -typedef struct -{ - unsigned char max_current; - unsigned char max_res_level; - unsigned char record_env; - unsigned char slot_env; - unsigned char current; - unsigned char res_level; - VC9202AgcInfoTypeDef info; -}VC9202AdjustSlotTypeDef; - -/**************************************************************************** - * Dev_struct - ***************************************************************************/ -typedef struct -{ - unsigned short fifo_time; - unsigned char work_frequency; - unsigned char enable_bio; - WorkModeTypeDef work_mode; - - unsigned char work_status; - unsigned int int_event; - - WearStatusTypeDef wear_status; - unsigned char osc_clk_status; - unsigned char enfifo_div; - unsigned char enslot[2]; - unsigned char slot_number; - unsigned char read_fifo_address; - -}VC9202DrvInfoTypeDef; - -/**************************************************************************** - * test_struct - ***************************************************************************/ -typedef struct -{ - unsigned char wait_cnt; - unsigned char step1_ret; // step1_ret/step2_ret/step3_ret:0-wait test,1-pass,2-failed - unsigned char icid; - unsigned char reason; - unsigned char leak_pre_value; - unsigned char max_current; - signed short temperature; - unsigned int frequency; - - unsigned char step2_ret; - unsigned char ps_value; - unsigned short biovalue_max; - unsigned short biovalue_now[2]; - unsigned short biovalue_gap[2]; -} VC9202TestInfoTypeDef; - - -#endif diff --git a/code/sdk/zhihui/drivers/ppg/vc9202/inc/vc9202_hal.h b/code/sdk/zhihui/drivers/ppg/vc9202/inc/vc9202_hal.h deleted file mode 100644 index 5f7850520..000000000 --- a/code/sdk/zhihui/drivers/ppg/vc9202/inc/vc9202_hal.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * @Author: penglei 1624952103@qq.com - * @Date: 2024-06-07 11:18:26 - * @LastEditors: SnickerSun snickersun@163.com - * @LastEditTime: 2024-12-27 16:08:10 - * @FilePath: /FD230/code/sdk/drivers/peripheral/ppg/hx3695/hx3695_hal.h - * @Description: - * - * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. - */ -#ifndef VC_9202_H__ -#define VC_9202_H__ -#ifdef __cplusplus -#if __cplusplus -extern "C" { -#endif /* __cplusplus */ -#endif /* __cplusplus */ - -#include "stdint.h" - -typedef uint32_t PPG_CMD_TYPE_T ; - -#ifdef PPG_HX3695 - -#include "tyhx_hrs_custom.h" - - - -typedef enum{ - HX3695_MSG_TYPE_HRS_UPDATE, - HX3695_MSG_TYPE_HRV_UPDATE, - HX3695_MSG_TYPE_SPO2_UPDATE, - HX3695_MSG_TYPE_LEAKLIGHT_UPDATE, - HX3695_MSG_TYPE_GRAYCARD_UPDATE, - HX3695_MSG_TYPE_WEARSTAT_UPDATE, - HX3695_MSG_TYPE_STATIC_HRS_UPDATE, -} hx3695_msg_type_t; - - -typedef void (*hx3695_msg_callback_t)(uint8_t msg_type, uint8_t *msg_data, int32_t msg_datalen); -uint32_t hx3695_register_msg_callback(hx3695_msg_callback_t func); -hx3695_msg_callback_t hx3695_get_send_msg_callback_func(void); - -#endif - -void ppg_send_cmd_to_vc9202_driver(char* mode, uint8_t enable); - -uint32_t tyhx_poweron(void); -uint32_t tyhx_poweroff(void); - -#ifdef __cplusplus -#if __cplusplus -} -#endif /* __cplusplus */ -#endif /* __cplusplus */ - -#endif \ No newline at end of file diff --git a/code/sdk/zhihui/drivers/ppg/vc9202/inc/vc9202_user.h b/code/sdk/zhihui/drivers/ppg/vc9202/inc/vc9202_user.h deleted file mode 100644 index 213da80be..000000000 --- a/code/sdk/zhihui/drivers/ppg/vc9202/inc/vc9202_user.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * @Author: penglei 1624952103@qq.com - * @Date: 2024-12-07 16:04:22 - * @LastEditors: penglei 1624952103@qq.com - * @LastEditTime: 2025-01-07 16:00:59 - * @FilePath: /sdk615/code/sdk/drivers/peripheral/ppg/vc9202/inc/vc9202_user.h - * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE - */ -/********************************************************************************************************* - * Copyright(c) 2022, vcare Corporation. All rights reserved. - ********************************************************************************************************** - * @file vc9202_user.h - * @brief functional Module Layer - * @details The functional interface is implemented by calling the driver.contain init_func,irq_handler - * @author - * @date - * @version - *********************************************************************************************************/ - -#ifndef __VC9202_USER_H__ -#define __VC9202_USER_H__ - -#include "vc9202_common.h" - -/* gsensor struct */ -typedef struct -{ - unsigned char sampling_rate; /* 25hz,50hz */ - unsigned char sensing_range; /* ±4G, ±8G, ±16G*/ - unsigned char effective_bits; /* 11(12)bit, 15(16)bit */ - - int gsensor_x_axis[40]; - int gsensor_y_axis[40]; - int gsensor_z_axis[40]; -}GsensorTypeDef; - - -typedef struct -{ - short int hr_rate; - unsigned char spo2_val; - unsigned char hrv_results; - unsigned char stress_results; - signed short int temperature_value; -}AlgoCalcResultsTypeDef; - -void vc9202_usr_init( InitParamTypeDef *pInitParam ); -void vc9202_usr_get_chip_id( unsigned char *pchip_id, unsigned char *pvers_id ); -void vc9202_usr_start_sampling(void); -void vc9202_usr_stop_sampling(void); -void vc9202_usr_soft_reset(void); -unsigned char vc9202_usr_channel_switch(unsigned char num_channel, unsigned char enable_flag); -unsigned char vc9202_usr_get_int_reason(void); -unsigned char vc9202_usr_get_wear_status(void); -void vc9202_usr_interrupt_handler( AlgoSportMode hr_alg_mode, unsigned char spo2_alg_mode ); - -uint32_t vc9202_get_hr_ppg_data(void); -void vc9202_get_spo2_ppg_data(uint32_t *ir_data,uint32_t *red_data); -void vc9202_get_leaklight_data(uint32_t *led_cur,uint32_t *apre_val,uint32_t *aps_val); -void vc9202_get_graycard_data(uint32_t *apre_val,uint32_t *aps_val); - -#endif - diff --git a/code/sdk/zhihui/drivers/ppg/vc9202/inc/vcSportMotionIntAlgo.h b/code/sdk/zhihui/drivers/ppg/vc9202/inc/vcSportMotionIntAlgo.h deleted file mode 100644 index b137a7f06..000000000 --- a/code/sdk/zhihui/drivers/ppg/vc9202/inc/vcSportMotionIntAlgo.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef __VCSPORTMOTIONALGOH__ -#define __VCSPORTMOTIONALGOH__ - -#include -#include -#include - - -void vcSportMotionAlgoInit(void); -int32_t vcSportMotionCalculate(int32_t x, int32_t y, int32_t z); -char* version_info_SportMotion(void); - -#endif diff --git a/code/sdk/zhihui/drivers/ppg/vc9202/lib/.WeDrive b/code/sdk/zhihui/drivers/ppg/vc9202/lib/.WeDrive deleted file mode 100644 index c285ea891..000000000 --- a/code/sdk/zhihui/drivers/ppg/vc9202/lib/.WeDrive +++ /dev/null @@ -1 +0,0 @@ -C:\Users\zwj\Documents\WXWork\1688852039096625\WeDrive\维客昕微\技术支持组和应用方案开发组公共文件\1.心率IC\1.心率+血氧资料\2.驱动文件\VCHR9202\drv_9202_sensor_v218\algo \ No newline at end of file diff --git a/code/sdk/zhihui/drivers/ppg/vc9202/lib/lib_BIO_V151_MiniSdk_NA_01.a b/code/sdk/zhihui/drivers/ppg/vc9202/lib/lib_BIO_V151_MiniSdk_NA_01.a deleted file mode 100644 index cee79a175bf1325c78d317109a335926e0fb2f11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18232 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 diff --git a/code/sdk/zhihui/drivers/ppg/vc9202/lib/lib_BIO_v151_int_miniSDK_log_01.a b/code/sdk/zhihui/drivers/ppg/vc9202/lib/lib_BIO_v151_int_miniSDK_log_01.a deleted file mode 100644 index de6f1fb76c64371fe4dae4bdece43776ce91c956..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20668 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 anRre-4f9HqmWOI`d^1{&dA|k`Q}{n}UtN9x diff --git a/code/sdk/zhihui/drivers/ppg/vc9202/lib/lib_BIO_v151_int_miniSDK_log_02.a b/code/sdk/zhihui/drivers/ppg/vc9202/lib/lib_BIO_v151_int_miniSDK_log_02.a deleted file mode 100644 index 0512470828b7a5888cfe407d772efe276d95ac47..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20796 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
B+Qdc4vj(x2?WDn5)f^*K_+Et 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 diff --git a/code/sdk/zhihui/drivers/ppg/vc921x/lib/lib_spo2_vc30FS_float_V07_miniSDK_NA_01.a b/code/sdk/zhihui/drivers/ppg/vc921x/lib/lib_spo2_vc30FS_float_V07_miniSDK_NA_01.a deleted file mode 100644 index b4afede5207fe8e2e453a1312c339625ff40ae1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 184840 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

SNz*5^~9L-9#c5_w$-P=F4*ucz5=P z4#j6Ecn{{#q4*Sm<6qxBS!%`6rXdz4`vP>iqHAr{h33D;)5nBZvb=XP<+sQ zcv@!1KE9S8;JP<%cDAI2Oy6rX^$m%QQ3p+oV(^^Lp{%%MZ^=>zG4_;xib0F>~lpe1?Oc%^W%upJMQO z=Fp+|OafoR96A)AY2Xdap+oVR1K!9SIuxH1!Iv_J4#np*@N<|$hvHKO-ozX_6rZ!f zo0&t0;?oS?!W=pjpNqhkF^3MtXC?T#%%MZ^SqFX|bLdcft_5Gt96A)AZ-AfA96A)A zJHRhs4jqcmx4|!D4jqcmR`83MLxs<(4qJ|2Yv~2=umuc{+o9x zbLdcfeh0pSIdmvK?|@&%96A)A_rP13Lx24BS-IuxJY z;9p@59f}Y7hvZ$(96A&qJRh33nmKeRKBK_bFozDsXB_xi=Fp+|91VU2bLdcf@GghE zbB6?5oNd=`U$l{s`MK26|PGlvev=R)xH%%MZ^ zSpj|xbLdcfR)c?yIdmvKSA$>696A)Ao4~JQ4jqcmM)2#ILx6tnbSOUPE0wp2IdmvKQ^D_M4jqcmEbx1nLxP8%%MZ^xf=Yt%%MZ^xe5G1=Fp+|d<%RlbLdcf?goE|IdmvKTfo1^96A&q z^hu+SRoVa@iVvQL&U=_SG<~+xhM#~x66;WWehK~q=Fp+|ybAs(bLdcf-Ufe+IdmvK zc&<8c8*}JTd_D$$oH=wTKDh3Z_XKn3P<*<8|0i?kP<(oUZ)Xl2iqAmsCz(Ts;*$b@ ziaB&BJ_X=EWDXsQ&sgvs%%MZ^!SmgDKVl9YiqCZLrBUF^3Mt=Lzs% zF^3Mt=f~hLGlvev2hY3b{hB#+C_cXi{|$5KP<-A1|1ERqP<;Lj{t9#GP<-A8f0a3O zC_euHe~meGC_afS;=f}K9g0sj`0LD}L-FYi{swdCP<#e~zsVdr6dyc~pZ90x(4qMB zClvgJ`61A>?IGmSkor9oYqa$?6gHo~gdU+Zh4hpqj~A(Gp>M^TLi^Q|!pi1mQ`l5f zUr`8JxW7lV*e!b6j8d?VRaR71Hr1Rfi7>(=V;W5}HHB4;OP18ow`2+%8tHrG$Id%x z6g}5jb#~fB_4LqZ8mMimSOS6-Lq)T56i5e4k=8hsiXV+^Xe2*3 zzy|?`CaPh>FCPn1g2vrWwp)(eTI%CXc|7vec9VKa! zM;bF7P=cmMi!;ry;6h_R_v8DGE}59?hT`!>6G}_Rj+rnfH@C<}@PBbp(YSHra&wD| zD9-Y;x?VDU?u;PNIif6oi^_xfY#+jT;B9W0>1XrE9R`2d-;@Srd&r;{^3$uvTb)|CT?rn(|X&Jd+_aF&8Hz zN#D>_&rNGLU-9KbznOfaZ};{A8<4&mo1#OkRPH?{Q83$N4?84ydF8)g?uTIR-P+UU zdn)oPV~mLpaU7BGh#`b9|z~-i!nMgmen1| z7?sDerUMzHvtqeOrH%tr5ld>{(nD7hzmr#EG7Wv`v2MLK1}4L#nV;Jv^hL><^tm`@ zM|05(rhP8+vlyC?^KscU8C7Bsf9KVepUVd>)4ym*AGnOaXxW*+O_{~trnIjGU-FT|{XBeMSoJx6>JVQh+|Rt^ z`-JYt2lb1HmGosl`+>cwO-&W&m)pZ&kJ&E?@(1;N&%LPirH}Vfs`LdvjyCk=LsM6Z zCgU?#au-@^33DSYt$)|o_x4l0v?ys^iawq<*nT{ZKSh?1&jjg*!RT9JI3Ni!y2yCE zjE{^zZsdK?s;7P&kG@32)6#dS^7z&1I}-vq;d2=F+WP3=a=csFKKh|FPYy# zI=|=xQ1l%?TPrwh!{HN->)h`w6_H&)gB$kwohAE~rT<;uS)xN=CnQZrcGSvJdy9A+ z2XkQiFf}DU&$CB(_BhX;=GpT-`z+61>e(%xeX(b+@$9QT8|OD1xIAB1Q_8c!v+wlm zEuOv2v*l6~QBGejeMI)Vp8tEE{efq9vTXt&r-!{62ex~7Hu_Du@#rt*+M#Ecc=l1A zEsthU5DCxcFWnif&GX^^f5m&@v3|SrOWz)HOg_ca z>7|6EZ5!P6e+)#P%yUVYPYz# z)AHX+_CO~d+k%_luafPS=LWLf{C|_|UNmr^_llEn^LHQFZvG!4+s*GbvU6zQkTgFe z(Z?w-F1McR*uNwj*8n&q%_}5uEr3JP{GNonz2Z_GUCNP=H1CtjQj^xtU8EZvJ3;eu z+mCFr|Lnx~CfnT}2a)Y=Un#N|)4(BVMv`{d_foRmdcY8c0nieT!o8!rzD5=4& zNQ>`bmXY1;#A91=*UziS{(%#Z?y`?N_GYro2SW+*N05|UiS~3__rwj z*vQVb@32LkamY5E=`e0wvQLlfZ1Zihe-_!9<`J^bi0o|h4A}!| z;E-uvCSC5tze9GVW4DvNQ{8EKy5ZBj7nP3QY``+cdr?P5CrG><;dv|;H9 zzGv_6V4jXPowu9fwQhLJDPG@(G2U8+FLlj9Ne{)0ZUcBTLJdW6 zD58@LmQWOj+Hm4f(NUZ?KU75&hnYLmrN6?_dqG|LD;&Mo)uq3}(R+Da`YRm$SJ|ai z0CMMMD7^-}>hWI{SnSPr-2S!$IjNJ6 z=#K)l^5LYFLn|KzKArw3Kr0_ZIyD27-`lTz0@*1!Ab?g5r1^nXJ_lUVhgN<(xTFuQ z{A6%RA6hw%F*JQ><#piLfG9vK$1$FAXysVesaf<#0a`hZn^Utv>AmnYD8Gbs3K^#W ztsKWRnjdK8SA*lAo&vOT99JucR(>=1ar8$4TKPuOnjdK8cY@EOKMK&waSWyTfmZ%7 z_!sDp0<`icNGpd{j%{D-2U_{F;8H)(%6|qf^#iT^HE>zyp_RW0KA-+5Kr8eQ4!4H%?)Nq5!SDi^HLn<5?r!zMz%km@#z%rvt4#7hKk7Xyru? zhgLoY{6tO%TKN=*Ln}vHm%>RP1!(180GI6rTKNg!vb{hnuL75PgI2x}92*t|Xywfg zhgN6)dsRtbuM| zeI;}wYwV8#BtQZCpx_)U?fxZbVto&IGi&T$0_;2~V4o5!v(h{TeJ<;#q0eKDE^NVa z*1v*2pEcV5-~!g|(8xH2J7@?xTWPk?NS`l-4uwAg-i3Xj_4(56;9Z$R>+_}9XX*2$ z(E5BS@}|$1LhJLTzXk73e-xng`O@E$*5^y1_4(3w!4IN83efs|>4&8C`BG?ozSIQ7 zdlEn(tr99o|*#kCoIz7$%YFFgr-5c@;x^QC8kAHp13pD)F} zNuMu;*5^xcysgidLhJLTc=lDFFNN0UOR;at%jNW;_4(4Z;Deb%hvIV$I5u<&(4qKz z9X!PxTAwf72%gUzIuxIK!G|!14#nrY;30EpeZKSu;6s^1hvM@j_%PL& zIeJJOmd6t`Xxb#rOe$m@Se!;wQXh5A)dQlkGi{5kT08J0ORR^2bD1X0;ri#lrdfb>?Hyo(H<-{?? z)XD2 zcq*jWf{h9H?7>f8tJr-+TPx< zDluYZd-}Y?wx7i1DcIP)c{NgMaB{e5WuZ-B@v1o0aMjb%9KM-7Vr}6StpzK0&09^+ zKYsa*8}9ydYyQfQZ(qIko5{mIo~5Nr>jS%{aCKq`mn4l-Z5;2^rq)OzEcXq_(8r28oEs4BC}@|jfPvN*;4d3Q0(A3+68 z+1uTpX#$zhw1R&{hf(e$+FAODen|7;`6X?ujor`Q!R{22Sy5XqeMIrCU=BgwH%Y{1 zKb(5e-j_qr|8HsL;pygKIK+;f4^1}@NjC?jn*-C$0qJHgOq2OX`lAAq!k;ZnM)I@w zR4gnU9sQasmMpEW8O@{eiUqYzHRmj=X{b8Cym@I&RZG*dC7)|AQ0Z>D_gtL*pUpK3 z@$6Bv(axah`7vi3^d+sUGu3sq<;`^sc3joiY^s(uSsP>6E#-Af=&z~9ETspYEc)z~ zwuV-(g!wAf|G%qy=iZg(_3G>wWMp?u97;zwK}PR{?focyI}b`EEX~#4k=>+kB>|4< zrZEFDdCH7YN>buGPySu0I>vhC9<{=b zS}HqPf?6iI)DorGksa;e#sBtbrab+lp8Xroe#f&v@$7z4p*Xz}o;}U8aUF&O`(NPM zZvQ-#XM-1ipJ(Ho$xZK3&)(tLFL?Hwp1s?%yG4tE^NaW5x%12Q>|vgb_hh;LxPI;0 z@prE|eZ1pa<5gk&ujr46`gP}*zW(IcYXR>1kRpF~eZnQ5-#GPEO14{`$zM#? z9{2ikBRkXJ8tLyMo4)f+_LRuZv}OM&va{{?60VHwOoLZq#_dVA*-G}eocQfz2Q+ZV zw##;xnsjyMcNB-~*c$&=(nm*jrul?)&&bX;J!spyC9*TkAhHKUcDC(5_-=nA3THx4w>d8(xDSyL-rgezM1q$C%%79lt-_8!P5(XgH$=cTg8qAViw%Zr z7+XDin`i&Xv!D0u7d;#O5j7xvyyHy+Y}4W4httgueXP)HPrLbP_dfK+vc36eyjN$w zsE1$t0d47DC!O!4E1veyi#|Us9s8uyo$XXco$a(Up6v}rwth8Qzkh5$vP)b)avXgH zTe=O}PJ2$@FuyYx6@iWe4%8{nNxOFX?B8qLW`20h`T4s~8fytGbw-u(VQ z?ua*`gB3FFZ`aXBXr-fFdAW4G!zltzAIi&{msLhx@UV~RUCV1eH1=}{6KLqY&`PV7 z&u}=j@{_?Au|KqO?B{ydF^5*ZnRG8{z@e2t0gjy^1!(2(k=FE~m1Do4`Gi(}7`WsI zT6u}%53T%o#~)gGgTtYfUkqMP8KD5J9QVF-zR=3CKTr;>d<(eLGqm!z9e-%$ICR!@ zpq1PE1du zD~DFz0xkzl(8@1#IJ9zHyVUxDR*vHsEibh4tHI^Q3$$_^*Qh_V@;e-VXyscS4y_!= zYpKcfM*&*-k4YK|J9t>98#Xyx}i99sE<;8I>_ zGr^~F`q0X8 zT(0RuE6)X&^r4lb-Bu2*-1aG(#_8KWWzxptxL)TAt^QvCKZgCGm7nf#XyxVLXgDcA zE6*f57-F$KCl02w?gfs62nskq5016cK6e+)WPKR8ADVZ2F^s)iIc3CHE}Z3s#y6==rR1C=g&LKml!X zfQcwvNJDUfmE5Q7MAmD-PhyQWHo!p>g&SxHzGNl$DZ>tg!ksh(r&?+5fj*5j+Rxy0 z)(=B3VEq&{GE3oU8no};FQCgojrkP~!C6rB&T1M06o>+j4YVKG-K4c28MO8zdjPx( z{ZW9{eq`Sxt^LTLwIA8z;Mw#?0b2W!A#d7`3|jkh5c88ccr9^xrox6YZd?LyfAha zyZu)AYgC7Qh~r!e^U9$Cbx!F;;ZA~YI}>VpXzpFVOLO^K%{rm_jhxKjMfx_$P z*#E$NpdRVUc^G47I*iKF+ibhuWR0hFEtQvHQn?xCv*@iEJC9D$%Y!lfhU+`(tx!nU zlzU}P>3`j{0sNY(p#zS_P6j#QC3wJY2gtMZH|X=(Z$C#j>`D0d>=!Mi2Tbc*YMRRH znm*UN^=`uDbq#eb(#C)GV!TL|kuYmfCBd#9-RVET3PeLNYtn+56?G@nEm%TxDsQen zn|dRtT+rND+j3q-Q_X^^#_E~{6uF>rS^L`Y3Y?^ zSKkb~-Y5D589lr59do&F-Yd=OC$x`@10G{b3Ic3X?)!dV%V7#B4)%WZ|H60spe%7n zI`82CWjiZ!U>ofX2exz76o2g3IB@&~H6>n7cZhQQd@o*3Cv1EaMPl!Jr|Av8?O@Jt^(8XSRn;4-k(KSUz-RyfWs-1W_wGomuh;!$+l^D8z->BrSkaGjWyVrr+ zKA+-7O8V`heZK3!-K5=Ss7ZQ! zM}Ss;9Pdxg2jyoWl;@ItBypqzt?9rO904QsA4Yoe5Kv>Fm1CPdk~q?V)^v)5)5!K+ zSAXm!Cx@WC$5f7O{Yc_S2U^oPLO6{KwE9mWJ$WeoQJ6x5aQ9G3#x~S6M*RnJe%T8e6-l8V4S}3T;U9NZy{_;$I0{Vx zTCXeoh_qf;fY$2@*yi=R0<>ON_yxE$fY5qf0o50v@+hEc(#|{OIz%q<|K@q;zP9!M zd$&2&tsCrt4FS8p(HQGK0=CI`UlX4zV0*@PG=&C)hiC$vpYIP#eayyaK4Py z4`rCdF7{vjE)zeEdIu3sP!s!3)rf}Q%N_V#P0TIFM^uhyh@l*)H!a7Vq}}wkcZ$nI zQPvORZ;74)gTi)d15hTU=bmSNm+XXdUidzxH1`OBdJ zO$|jwVOs`&k5z%DhkUqx@6&`oR3{p%-{|7vv=hSvpBI*veA@HEd;agda6jid3*xr& zUv*kYXPlqMSt0f#3BIE9Z$B$URoQhnJ}EpX{iHA_?W9mo2IW*SBkiP+%7ty}|JU-nHH z^lWgib3y-15Nq21od@#q3C<4@ifGXDuKzm^v{hpEbslJsG37jPBf08%AhezbZUUE0 z9$L=>?+2&jAOvVV4}6HUo(DqfdEhp19FS7jMuVOQ?jWt_fzWy$_#8M6I4MBudEg7A z^*j*z-*z6DwsHTDKMnjJ_0ENO-x8l2VE>EuYzhqscV>2c9ypKU^cWw0t7wS#-Emxn z=ZAGP-lxZY3y8b(J%tV&t|I222QHEH(7qtNL&J8f_z!u)uw2IKx0zr^=YcE4k4842 zZ>by9yq2J9#KZ4bj-$qXm6%(Ox2YV@5JNez*&z<&J7~~pNSb|}2i{6?ZhBj&4M3TY zo_ij+g={(>TS_Av{uSqef6&Bfta(R1XueT+lk)deWW|1?i_vUyY=*B^+xn&%F`%8}I&o#>L|^cV6RgAhN*{RYN%O$i2TkeN4d(8eU*s0Hbv$)Pekc_J&Lddye_&2i(~rtDr>#$( z9zTkmfW0s0PUfl+`-=O_33<0uPoitBo$#@rS-p=QFe!U-cBlTd(E6EKz4^u}t>yU? zdsKFIHa$#TNKaNS?}a6|J9K-UHsC#Swa^oX&P7PW4ZeNlgT! z?DR>zY={rzJM|Q&+!*x|lw;9KB-L9`GVvdpRLDu;eMZJur#|Ausaw>S9)hJn>nsPp zY1}DA4KRmJsTJ7j86@J597_9KO@Ebf;;U<6bGvNq3slVM-^aJDq4# zN?d@PQ3ysSG0F-O`Y>Fg(2~yfA90^LeCAK_?C+vTQ%iY6V?!;jThx56H_Mw^W;N8x zy&-wby{V?6zWhYf)N)*1!?NZ$x~XMe#XNDflg$vL7SF91OjcTwHlaG$DPyC278Qfi zo!U^HmZCGSWev@B3ma;xbE_6rG?~iA#`>Cy2AlRQc*SYWYEDmrtSFK)bVA()H6}_7 zPvGN2O64u)+=}{THUEw8CZU6E!ak1pZ|V~8Pj)9R5{ZthBP)CP2`HA*@19nnPD#0`HJ)fY& z>D2^07k#APclxp8bb$0;a9lIe)61buy4Txs$(CDnq&PV51+cv_{Apm*-YG4(eK-CU zasQj%MS%K=1NYDH?YOz;c9yaI=18aaeTZEvmMuGw5yl& zyLjn$Y{%(yd|V#3*Qv~*GDT<_B zMYm{s#x#NH9!HW&>}AWv3-L;Lxy9S3+>o$6Qe%?vdix{{9mqN%K`jN!KR;r;zPZaE z@$T}1og4Xc{kr8xd>jVa^yBSepnbo79G^6k$)M9r2}v_er5$J5yv6aE=1aumd1Tu6 zC&rU>HuYr0>qBSfyFu{kVph<9oL(2Rn(Vku>|)=N15XZJ%{NHI>22$d0dF_ccSv-r>ZffAOyz z`xvr+@7Q<_0Q2C`*Y@*&Pfg1IITUaEFkEoy{LT*#YP+0liH_JvZ2+ULUxv8A5S*&1qS~! z$;S4j_F}Sg9os)5lp8ID%`HuI)1~~lnx=&{)yLL1R#wzE6G-n?N3TOb@4OhwcaG!@ z3wZTF94BvO!0QrXDDP;nAMe3S7~mAg;++Se7}qt_HkMPa>KYb)wjP1}5(Mh=yRfF& zOTl~f0kZGR&YQdUX(8{UKK|!}ygB(F5c0m76qjFKYT;xf{WC>gx+Sn}#nFU*q9{Q0 z3J5RKep5;(^j;5PKUfq^7%du_gI8hp(^-)tA~i*??(9o5B1b>ct6BS*ET;nOn>Sp$ z7%Oi_r?Cwc4TgqVinnK~@%gfQ-dbKxy)vmV&9&9FCDwJ{XR$czj!tQD+8i5tf*zB! zWTF%My-wxrHaxI^Hbx5Ap7ov=w$(wxp_Sukq*oLDQGiyCwq{@^zKy4&_hpLa$XhYIgTTAyo% zR!)~`O)!Q2D5NklpG!J8hB?}OeQpeEd5cqlm_Lv2d~fe-auNvH3U6$ zCjC*knTFIXE3HyJLen+H7)l;%T&KEsQ;4P^bn z;?(DPQEYvl7s=`Kyr($+<H zdJKd)Qy@scPoXy8aZwr-u1t=vvlzPlBd12U^ypFOW_xWFKf){Y+sfS!>DOWzUlVp)&yr_%=d-#3;N9EeFcD79R{|J{o!$YrOwK@4rLq z{dXMy>iu_Uz5l)pyem%&t@q#Y4jjGz4z2g!zXFazQ-Id{@BaZVr?Sv`|NT1f9_$aT z_up}Rtj~8t>;3mTz)_JDp!NCgyTQ>wQh?UyyPp7;6K-gIF8fE|XgnxD>vP#Z13#EK zv_6;p3-Afdq4l}!zkp+*QGnLxsXqWelsU9MPu&hakvX(JPu+`_kv<0v9S&xn0pO`v z>vPb9!Ld?MfDXlH2>2xC(E2@%Bf*C=ht}_4%mA0WW6=5?416OfZ!-Hs>vu5hx_Sh2 zyRM>7JM1r4boR$4tYm-Pl3ssBdkq0H~3QEFtYhYB}^&F3#^si>rJ zOB0V5scNBPGgDYy(NbXwE1R1QeNW1fGapsF%hn9B}Y0S5T1{=tLtpOUt_h@jJ zM;1YMzKBD3fd+Sa_}yz`_)p`0N~W8?D=2@seT#a*u1E9tDrudDq}{jTcus@Hy+=Sb z;!3F^u5p0Mzfhbz-~O~;*+9OSFPci7Z-OS!X$YGi(u!CFAwlClA=^#wp#j_v22>C%`IK=b&Rz}Bth;Tg-{u+Kues0jXNgep%Jwh7PZ!8J797WWY zUnKQ{^;OGZkLz?|8W+%l$GWNkeh4$X^zNY@(@x^37wjf9y;I1Ks$wZ28{VY!=Bhzs z%^${2woOqNN{==mY;)((fb?=`ARM(BBuy?Y)C;u{AzRbKvUaffI%RCJMml~?Eyvd2 zyuGlhu(5LS=-dPKAsSoy>H84XQ-+ZTZYzh;Rl`B{9RpiwStf4FFs-*um;OHJRn&P% zhFJTH@2Cq*2X7SME-U-$3uA7gT=9}TU{@CMloO<&*9D}bg~Vq~!JsQTfcYJHj)G^R zjs6fiXajR!$w=_hX1>V&$WT?3E(&<4jtQi9D()+{33|$`Q`XHzi|vw#69bH-XI;@aeg^Io`&r>zj6Tp zNm0N(YB%hCPdfd{p#$H8?qgGo%frhfoOd&a+X>`0PGI5`8~`yOR~gL}*fCu(4= zeU`yBBMq2-L)!FR?XkKW?>6F}*MnJnVjSO{i*EwDcecE{UeTSV%9@3B4Y;$V_no}E zTzlV%R7dZY7w*r+vyRg5;Fgz{mHpo{^zI6dk7_X5&C{W2q|=WQ(t3H?hc7fZG=_mw>5qb+&LH7#I`El%jCJ43 z{|Mo(znw2}Ot;s3r+1vrAmMI0*fZ!gT%;3(JT0~Zy;g;51bRIe=Qn{|*UN(*L4Op6 z(xC52#AU5i0VsXLfrg=SovWC1FbeelarZ88R#oNy|2~{E!yN|(xvRq*SRf7~!*Es9 z5di^_(2$VGVSqtUZgC6E3>-iKDHAg^Gc+WeluS+XmS|{ZYJAPi%>1gEx75fC@sj>N zpZz?~KI^O*#LWKR`mfiV*`MdVp1s!EYp;DyCUA^-;q4-rc}o4cYEv!o4`CR7*@I#k>t4zy0Ga

bBxD8IvqmAOdwS<#VCU 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%0A?EVlckPC ze*Y$!m^jin0^9H4%8B<1^IL*`Vyoe2o5XqF6IKNMdgW$A7r(;*?0W1&J#IxA*)Dvo zlX@(KpQK^7-^KfGp1>IWX#77lJHOr|g6EmzyyVvnKNM%wON3xH-jjQT;4IhTS)Of1 t55lh=*T(HrU&F!t>T&Ru+p3=0ig(opDHP%)Ki(VL?;VtHtwdUW{{t$XIo1FG diff --git a/code/sdk/zhihui/drivers/ppg/vc921x/src/vc921x_core.c b/code/sdk/zhihui/drivers/ppg/vc921x/src/vc921x_core.c deleted file mode 100644 index e86ebd052..000000000 --- a/code/sdk/zhihui/drivers/ppg/vc921x/src/vc921x_core.c +++ /dev/null @@ -1,956 +0,0 @@ -/********************************************************************************************** - * @Copyright(c) 2023, Chengdu vcaresensor Microelectronics Corporation. All rights reserved. - * @Author: Tse - * @Date: 2023-09-22 17:39:10 - * @LastEditTime: 2024-03-21 14:38:58 - * @LastEditors: Tse - * @Description: - **********************************************************************************************/ - -#include "vc921x_core.h" -#include "vc921x_core_com.h" - -#define CORE921x_FORMAT_ADCBIT_COMPARE(format_n,bit_n) ( ((format_n)>(bit_n))?((format_n)-(bit_n)):0) -#define CORE921x_DATA_FORMAT_COVNVERT(format_n,bit_n,data) ( (data)>>( CORE921x_FORMAT_ADCBIT_COMPARE( format_n, bit_n ) ) ) - -static const char CORE921x_VERSION[] = "core921x_v0.22"; - -/* rxgain+pdres ~ level */ -struct vc921x_core_res_table -{ - unsigned char level; - unsigned char pdres; - unsigned char rxgain; -}; -#if VC921x_CFG_DEFAULT_PPGGAIN_EN -#define MAX_RES_LEVEL 21 -#define MIN_RES_LEVEL 0 -#define MAX_CURRENT 0x7f -#define MIN_CURRENT 0 -const struct vc921x_core_res_table vc921x_res_table[] = - { - /* level, pdres, rxgain */ - {0, 0, 1}, /* 200K */ - {1, 1, 1}, - {2, 2, 1}, /* 400K */ - {3, 3, 1}, - {4, 4, 1}, /* 800K */ - {5, 5, 1}, - {6, 6, 1}, /* 1.6M */ - {7, 7, 1}, - {8, 8, 1},/* 3.2M */ - {9, 9, 1}, - {10, 10, 1}, /* 6.4M */ - {11, 11, 1}, /*8.96M*/ - {12, 12, 1}, - {13, 13, 1}, /*17.92*/ - {14, 12, 2}, - {15, 13, 2},/*35.84*/ - {16, 12, 3}, - {17, 13, 3},/*71.68*/ - {18, 12, 4}, - {19, 13, 4}, /* 143.36 */ - {20, 12, 5}, - {21, 13, 5}, /* 286.72 */ -}; -#else -#define MAX_RES_LEVEL 23 -#define MIN_RES_LEVEL 0 -#define MAX_CURRENT 0x7f -#define MIN_CURRENT 0 -const struct vc921x_core_res_table vc921x_res_table[] = - { - /* level, pdres, rxgain */ - {0, 0, 0}, /* 100K */ - {1, 1, 0}, - {2, 2, 0}, /* 200K */ - {3, 3, 0}, - {4, 4, 0}, /* 400K */ - {5, 5, 0}, - {6, 6, 0}, /* 800K */ - {7, 7, 0}, - {8, 8, 0}, /* 1.6M */ - {9, 9, 0}, - {10, 10, 0},/* 3.2M */ - {11, 11, 0}, - {12, 12, 0}, /* 6.4M */ - {13, 13, 0}, /*8.96M*/ - {14, 12, 1}, - {15, 13, 1}, /*17.92*/ - {16, 12, 2}, - {17, 13, 2},/*35.84*/ - {18, 12, 3}, - {19, 13, 3},/*71.68*/ - {20, 12, 4}, - {21, 13, 4}, /* 143.36 */ - {22, 12, 5}, - {23, 13, 5}, /* 286.72 */ -}; -#endif - -static unsigned char core921x_nto_version=0; /* 0127nto or(0808-1120mpw) */ -static unsigned char core921x_0808mpw=0; /* 0808mpw ~ 1120mpw */ -/* 需要在刚刚初始化完成之后去调用判断 */ -CORE921x_FUNC_RAM_SECTION int core921x_check_nto_version_init(void) -{ - unsigned char mpw0808_test=0xA0; - unsigned char read_buffer[4]={0}; - unsigned short count1=0, count2=0; - unsigned int delay_tick=1000; - vc921x_write_register(0x5C, &mpw0808_test, 1); - mpw0808_test=0; - vc921x_read_register(0x5C, &mpw0808_test, 1); - if( mpw0808_test==0xA0 ) - { - core921x_0808mpw=0; - mpw0808_test=0; - vc921x_write_register(0x5C, &mpw0808_test, 1); /* write 0, clear DEBUG register. */ - } - else - { - core921x_0808mpw=1; - } - /* 0127nto ~ 0808_1120mpw */ - vc921x_read_register( 0x05, &read_buffer[0], 2 ); - while(delay_tick--); - vc921x_read_register( 0x07, &read_buffer[2], 2 ); - count1 = (read_buffer[0]<<8)+read_buffer[1]; - count2 = (read_buffer[2]<<8)+read_buffer[3]; - if( count2-count1>=1 && count2-count1<=255 ) - { - core921x_nto_version=0; - } - else - { - core921x_nto_version=1; - } - CORE921x_DEBUG_LOG("0127nto=%d~0808mpw=%d", core921x_nto_version,core921x_0808mpw); - return core921x_nto_version; -} - -CORE921x_FUNC_RAM_SECTION static unsigned char get_level_by_res_rxgain(unsigned char pdres, unsigned char rxgain) -{ - unsigned char index = 0; - for (index = 0; index < sizeof(vc921x_res_table) / sizeof(vc921x_res_table[0]); index++) - { - if ((vc921x_res_table[index].pdres == pdres) && (vc921x_res_table[index].rxgain == rxgain)) - { - return vc921x_res_table[index].level; - } - } - return 0; -} -CORE921x_FUNC_RAM_SECTION static int get_res_rxgain_by_level(unsigned char level, unsigned char *ppdres, unsigned char *prxgain) -{ - *ppdres = vc921x_res_table[level].pdres; - *prxgain = vc921x_res_table[level].rxgain; - return 0; -} - -/**************************************************************** - * CORE_API.read() - * read IC event or sample data - ***************************************************************/ -CORE921x_FUNC_RAM_SECTION int __core921x_read_software_version(char **ppver) // -{ - if (ppver) - { - *ppver = (char *)CORE921x_VERSION; - return 0; - } - return -1; -} - -CORE921x_FUNC_RAM_SECTION int __core921x_read_id(unsigned char *pid1, unsigned char *pid2) // -{ - int ret = 0; - if ((NULL == pid1) || (NULL == pid2)) - { - return 1; - } - ret = vc921x_read_register(CORE921x_DEV_VER_ID_H_ADDR, pid1, 1); - ret = vc921x_read_register(CORE921x_FDY_EXT_ID_L_ADDR, pid2, 1); - return ret; -} - -CORE921x_FUNC_RAM_SECTION int __core921x_read_event_status(unsigned char *pevt, unsigned char *povsta, unsigned char *pwindex_bak, unsigned char *pwindex_rel ) // -{ - int ret = 0; - unsigned char reg[4] = {0}; - ret = vc921x_read_register(CORE921x_WORK_STATUS1_ADDR, reg, 4); - if (pevt) - { - *pevt = reg[0]; - } - if (povsta) - { - *povsta = reg[1]; - } - if( core921x_nto_version ) - { - if (pwindex_bak) - { - *pwindex_bak = reg[2]; - } - if (pwindex_rel) - { - *pwindex_rel = reg[3]; - } - } - else - { - if (pwindex_bak) - { - *pwindex_bak = reg[2]; - } - } - return ret; -} - -CORE921x_FUNC_RAM_SECTION int __core921x_read_rcosc_tick(unsigned short int *ptick0, unsigned short int *ptick1) // -{ - int ret = 0; - unsigned char reg[4] = {0}; - if( core921x_nto_version==1 ) - { - ret = vc921x_read_register(CORE921x_OSC_CNT0_H_ADDR+1, reg, 4); - } - else - { - ret = vc921x_read_register(CORE921x_OSC_CNT0_H_ADDR, reg, 4); - } - if (ptick0) - { - *ptick0 = (reg[0] << 8) + reg[1]; - } - if (ptick1) - { - *ptick1 = (reg[2] << 8) + reg[3]; - } - return ret; -} - -CORE921x_FUNC_RAM_SECTION int __core921x_read_output(vc921x_sample_info_t *psample_ret) -{ - int ret = 0; - core921x_reg_result_t reg_result = {0}; - if( core921x_nto_version==1 ) - { - ret = vc921x_read_register(CORE921x_SAMPLE_DATA_ADDR_BASE+1, (unsigned char *)®_result, sizeof(core921x_reg_result_t)); - } - else - { - ret = vc921x_read_register(CORE921x_SAMPLE_DATA_ADDR_BASE, (unsigned char *)®_result, sizeof(core921x_reg_result_t)); - } - - if (psample_ret) - { - psample_ret->slot_result[0].env_data = (reg_result.slot0_envh6 << 8) | reg_result.slot0_envl6; - psample_ret->slot_result[1].env_data = (reg_result.slot1_envh6 << 8) | reg_result.slot1_envl6; - psample_ret->slot_result[2].env_data = (reg_result.slot2_envh6 << 8) | reg_result.slot2_envl6; - - psample_ret->slot_result[0].u.ps_data = reg_result.slot0_ps; - psample_ret->slot_result[1].u.ps_data = reg_result.slot1_ps; - psample_ret->slot_result[2].u.ps_data = reg_result.slot2_ps; - - psample_ret->extra_result.bioinn_data = (reg_result.bioinn_valh << 8) | reg_result.bioinn_vall; - psample_ret->extra_result.bioext_data = (reg_result.bioext_valh << 8) | reg_result.bioext_vall; - psample_ret->extra_result.temp0_data = (reg_result.tempslot0_valh << 8) | reg_result.tempslot0_vall; - psample_ret->extra_result.temp1_data = (reg_result.tempslot1_valh << 8) | reg_result.tempslot1_vall; - psample_ret->extra_result.tempref_data = (reg_result.tempref_valh << 8) | reg_result.tempref_vall; - } - return ret; -} - -/*------------------------------------------------------------------------------------------------------------------------------------- -fifo 解析数据相关的函数功能模块 --------------------------------------------------------------------------------------------------------------------------------------*/ -CORE921x_FUNC_RAM_SECTION static inline int fifo_calc_sample_slot_nums(vc921x_sample_info_t *psample_ret, unsigned char *p_ppgfreq_slotnum, unsigned char *p_psfreq_slotnum, unsigned char *p_bioppgfreq_slotnum) -{ - /* 1 ppg slot infomation */ - for( unsigned char i=0; i<3; i++ ) - { - if( psample_ret->slot_result[i].slot_enwork==1 && psample_ret->slot_result[i].slot_freq_sel==VC921x_FREQ_PPG ) - { - (*p_ppgfreq_slotnum)++; - } - else if( psample_ret->slot_result[i].slot_enwork==2 && psample_ret->slot_result[i].slot_freq_sel==VC921x_FREQ_PS && psample_ret->slot_result[i].slot_storefifo==VC921x_IN_STORE ) - { - (*p_psfreq_slotnum)++; - } - } - - /* 3 bio slot infomation */ - if ((psample_ret->extra_result.bioext_enwork==1||psample_ret->extra_result.bioinn_enwork==1)&&(psample_ret->extra_result.biofifo_mode==VC921x_BIO_INFIFO_PS_SGL||psample_ret->extra_result.biofifo_mode==VC921x_BIO_INFIFO_PPG_SUM)) - { - if (psample_ret->extra_result.bioext_enwork == 1) - { - (*p_psfreq_slotnum)++; - } - if (psample_ret->extra_result.bioinn_enwork == 1) - { - (*p_psfreq_slotnum)++; - } - } - else if ((psample_ret->extra_result.bioext_enwork==1||psample_ret->extra_result.bioinn_enwork==1)&&(psample_ret->extra_result.biofifo_mode==VC921x_BIO_INFIFO_PPG_SGL)) - { - if (psample_ret->extra_result.bioext_enwork == 1) - { - (*p_bioppgfreq_slotnum)++; - } - if (psample_ret->extra_result.bioinn_enwork == 1) - { - (*p_bioppgfreq_slotnum)++; - } - } - CORE921x_DEBUG_LOG("slotnum_ppgfreq[%d],slotnum_psfreq[%d], slotnum_bioppg[%d]", *p_ppgfreq_slotnum, *p_psfreq_slotnum, *p_bioppgfreq_slotnum); - return 0; -} - -CORE921x_FUNC_RAM_SECTION static inline int read_data_from_fifo_buffer(const unsigned char *pbuffer, unsigned char *poffset, unsigned char fifo_format_is24bit, unsigned char adc_resolution ) -{ - int data = 0; - if( fifo_format_is24bit ) - { - if( (*poffset)+2 >=192 ) return 0; - data = (pbuffer[(*poffset)]<<16) + (pbuffer[(*poffset)+1]<<8) + pbuffer[(*poffset)+2]; - data = CORE921x_DATA_FORMAT_COVNVERT( 24, adc_resolution, data ); - *poffset += 3; - } - else - { - if( (*poffset)+1 >=192 ) return 0; - data = (pbuffer[(*poffset)] << 8) + pbuffer[(*poffset) + 1]; - data = CORE921x_DATA_FORMAT_COVNVERT( 16, adc_resolution, data ); - *poffset += 2; - } - return data; -} - -CORE921x_FUNC_RAM_SECTION static inline int write_data_to_fifo_buffer( unsigned char *pbuffer, unsigned char offset, unsigned int ppg_data, unsigned char fifo_format_is24bit ) -{ - if( fifo_format_is24bit ) - { - if( offset*3+2>=VC921x_PPGSLOT_BUFFER_NUM*3 ) return -1; - pbuffer[offset*3+0]=(ppg_data>>16)&0xff; - pbuffer[offset*3+1]=(ppg_data>>8) &0xff; - pbuffer[offset*3+2]=(ppg_data>>0) &0xff; - } - else - { - if( offset*2+1>=VC921x_PPGSLOT_BUFFER_NUM*3 ) return -1; - pbuffer[offset*2+0]=(ppg_data>>8) &0xff; - pbuffer[offset*2+1]=(ppg_data>>0) &0xff; - } - return 0; -} - -CORE921x_FUNC_RAM_SECTION int __core921x_read_fifo_data(vc921x_sample_info_t *psample_ret, unsigned char *pread_fifoaddr, unsigned char read_windex) // -{ - int ret = 0; - unsigned char i = 0, j = 0; - unsigned char rindex = *pread_fifoaddr; - unsigned char read_size = 0, wait_size = 0;; - unsigned char fifo_data[192] = {0}; - /* fifo有效通道数量 */ - unsigned char ppg_freq_slot_num = 0; /* ppg频率下ppg_slot的数量*/ - unsigned char ps_freq_slot_num = 0; /* ps频率下psbio_slot的数量*/ - unsigned char bio_ppgfreq_slot_num = 0; /* ppg频率下bio_slot的数量 */ - unsigned char ppg_ps_fifo_ratio = 0; /* ppg频率与ps频率的占比,用于计算有效ps频率的fifo数据位置 */ - - unsigned char fifo_bytes= 0; /* fifo_bytes= group_len*fifo_div */ - unsigned char group_len = 0; /* ppg0(slot1,2) ppg1(slot1,2) ps(1,2) */ - unsigned char group_num = 0; /* group_len * group_num = fifosize */ - /* array(ppg_freq+ps_freq) */ - unsigned char ppg_freq_array_len = 0; - unsigned char ps_freq_array_len = 0; - unsigned char array_offset = 0; /* group 组内偏移 */ - unsigned char slot_index = 0; - /* 当bio模式为VC921x_BIO_INFIFO_PPG_SGL,需要驱动进行加算 */ - unsigned short int bioext_ppgsgl_sum=0,bioinn_ppgsgl_sum=0; - /* 解析临时缓存ppg数据 */ - unsigned int analysis_ppg_data=0; - /************* 1.获取配置参数 *************/ - if (!psample_ret) - return 1; - ppg_ps_fifo_ratio = psample_ret->ps_div; /* 假设25/10=2.5hz,ppg频率中间隔10个,插入一个ps */ - fifo_calc_sample_slot_nums(psample_ret, &ppg_freq_slot_num, &ps_freq_slot_num, &bio_ppgfreq_slot_num); /* 获取各个fifo信息 */ - /* calc ppgfreq_fifodata/psfreq_fifodata array length, group length=ppg*ratio+ps */ - if( 1==psample_ret->fifo_format ) - { - ppg_freq_array_len += (ppg_freq_slot_num*3); - } - else - { - ppg_freq_array_len += (ppg_freq_slot_num*2); - } - ppg_freq_array_len+= (bio_ppgfreq_slot_num*2); - ps_freq_array_len += (ps_freq_slot_num * 2); - group_len = ppg_freq_array_len * ppg_ps_fifo_ratio + ps_freq_array_len; - fifo_bytes= group_len*psample_ret->fifo_div; - CORE921x_DEBUG_LOG("group_len(%d)=(%d*%d)+%d", group_len, ppg_freq_array_len, ppg_ps_fifo_ratio, ps_freq_array_len); - if(group_len==0||fifo_bytes==0) - { - return -1; - } - /************** 2.校验参数读取 *************/ - /* group=[ ppg0(slot0,slot1)+ppg1(slot0,slot1)+...ppgN(slot0,slot1)+ps(ps,bioinn,bioext) ] - fifo =[ group0,group1... ]n */ - if (0 == psample_ret->fifo_enable) - { - CORE921x_DEBUG_LOG("psample_ret->fifo_enable=%d", psample_ret->fifo_enable); - rindex = 0x00; /*disable fifo:fifo=ps频率,数据始于,0x00 */ - } - if (read_windex == rindex) /* 数据溢出或则无数据 */ - { - return -2; - } - if (read_windex > rindex) /* rindex-windex */ - { - wait_size = (read_windex - rindex); - } - else /* [rindex-192]+[0-windex] */ - { - wait_size = 192 - rindex + read_windex; - } - if( wait_size < fifo_bytes ) - { - CORE921x_DEBUG_ERR("[%x~%x]waite_size=%d, fifo_bytes=%d", rindex, read_windex, wait_size, fifo_bytes ); - return -3; - } - /* windex error process, the windex cover all fifo area and more than the rindex. */ - if (wait_size % fifo_bytes) - { - read_size = (wait_size/fifo_bytes)*fifo_bytes; - CORE921x_DEBUG_ERR("read_fifo_bytes(%d)/group_len(%d) != 0 read_size[%d]", wait_size, fifo_bytes, read_size ); - ret=1; - if( core921x_nto_version ) - { - return ret; - } - } - else - { - read_size=wait_size; - } - *pread_fifoaddr = ((rindex + read_size) >= 192) ? (rindex + read_size - 192) : (rindex + read_size); - ret = vc921x_write_register(CORE921x_FIFO_READADDR_INDEX, &rindex, 1); - ret = vc921x_read_register(CORE921x_FIFO_DATA_ADDR, &fifo_data[0], read_size); - - CORE921x_DEBUG_LOG("[%#x]-[%#x],fifo_bytes=%d,", rindex, read_windex, read_size); - CORE921x_DEBUG_LOG("PPG_data[0- 8]:0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x", fifo_data[0], fifo_data[1], fifo_data[2], fifo_data[3], fifo_data[4], fifo_data[5], fifo_data[6], fifo_data[7]); - CORE921x_DEBUG_LOG("PPG_data[9-16]:0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x", fifo_data[8], fifo_data[9], fifo_data[10], fifo_data[11], fifo_data[12], fifo_data[13], fifo_data[14], fifo_data[15]); - CORE921x_DEBUG_LOG("..............:0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x", fifo_data[read_size - 8], fifo_data[read_size - 7], fifo_data[read_size - 6], fifo_data[read_size - 5], fifo_data[read_size - 4], fifo_data[read_size - 3], fifo_data[read_size - 2], fifo_data[read_size - 1]); - /******** 3.group,array,cell analysis ********/ - if(group_len==0) - { - return 3; - } - group_num = read_size / group_len; - for (i = 0; i < group_num; i++) /* i=0~N,每次所有通道的采样PPG群数,每个群的处理 */ - { - array_offset = i * group_len; - bioinn_ppgsgl_sum=0,bioext_ppgsgl_sum=0; - /* ppg_freq array analysis*/ - for (j = 0; j < ppg_ps_fifo_ratio; j++) /* j=0-n,每个群里面拥有的ppg_freq的组数轮询 */ - { - for (slot_index = 0; slot_index < 3; slot_index++) - { - if (1 == psample_ret->slot_result[slot_index].slot_enwork && VC921x_FREQ_PPG == psample_ret->slot_result[slot_index].slot_freq_sel) - { - psample_ret->slot_result[slot_index].ppg_num += 1; - analysis_ppg_data = read_data_from_fifo_buffer(fifo_data, &array_offset, psample_ret->fifo_format, psample_ret->adc_resolution ); - write_data_to_fifo_buffer( psample_ret->slot_result[slot_index].ppg_buffer, psample_ret->slot_result[slot_index].ppg_num-1, analysis_ppg_data, psample_ret->fifo_format ); - CORE921x_DEBUG_LOG("slot_result[%d].ppg_data[%d]=%d", slot_index, i*ppg_ps_fifo_ratio+j, analysis_ppg_data ); - } - } - if( bio_ppgfreq_slot_num && VC921x_BIO_INFIFO_PPG_SGL==psample_ret->extra_result.biofifo_mode ) /* VC921x_BIO_INFIFO_PPG_SGL */ - { - if (1 == psample_ret->extra_result.bioinn_enwork) bioinn_ppgsgl_sum+=read_data_from_fifo_buffer(fifo_data, &array_offset, 0, 16 ); - if (1 == psample_ret->extra_result.bioext_enwork) bioext_ppgsgl_sum+=read_data_from_fifo_buffer(fifo_data, &array_offset, 0, 16 ); - } - } - if( bio_ppgfreq_slot_num && VC921x_BIO_INFIFO_PPG_SGL==psample_ret->extra_result.biofifo_mode ) - { - psample_ret->extra_result.bio_fifo_num += 1; - if (1 == psample_ret->extra_result.bioinn_enwork) - { - psample_ret->extra_result.bioinn_buffer[i] = bioinn_ppgsgl_sum; - CORE921x_DEBUG_LOG("result.bioinn_buffer[%d]=%d", i, psample_ret->extra_result.bioinn_buffer[i]); - } - if (1 == psample_ret->extra_result.bioext_enwork) - { - psample_ret->extra_result.bioext_buffer[i] = bioext_ppgsgl_sum; - CORE921x_DEBUG_LOG("result.bioext_buffer[%d]=%d", i, psample_ret->extra_result.bioext_buffer[i]); - } - } - /* ps_freq array analysis */ - // CORE921x_DEBUG_LOG("PS_ARRAY_OFFSET=(%d)?(%d)", ppg_freq_array_len * ppg_ps_fifo_ratio, array_offset); - /* 数据交换处理 */ - if ( VC921x_BIO_INFIFO_PS_SGL==psample_ret->extra_result.biofifo_mode ) - { - if (2 == psample_ret->slot_result[2].slot_enwork && VC921x_IN_STORE == psample_ret->slot_result[2].slot_storefifo) - { - psample_ret->slot_result[2].ppg_num += 1; - analysis_ppg_data = read_data_from_fifo_buffer( fifo_data, &array_offset, 0, 16 ); - write_data_to_fifo_buffer( psample_ret->slot_result[2].ppg_buffer, psample_ret->slot_result[2].ppg_num-1, analysis_ppg_data, 0 ); - CORE921x_DEBUG_LOG("slot_result[2].ps_data[%d]=%d", i, analysis_ppg_data); - } - if ( 1 == psample_ret->extra_result.bioinn_enwork || 1 == psample_ret->extra_result.bioext_enwork) - { - psample_ret->extra_result.bio_fifo_num += 1; - if (1 == psample_ret->extra_result.bioinn_enwork) - { - psample_ret->extra_result.bioinn_buffer[i] = read_data_from_fifo_buffer(fifo_data, &array_offset, 0, 16 ); - CORE921x_DEBUG_LOG("result.bioinn_buffer[%d]=%d", i, psample_ret->extra_result.bioinn_buffer[i]); - } - if (1 == psample_ret->extra_result.bioext_enwork) - { - psample_ret->extra_result.bioext_buffer[i] = read_data_from_fifo_buffer(fifo_data, &array_offset, 0, 16 ); - CORE921x_DEBUG_LOG("result.bioext_buffer[%d]=%d", i, psample_ret->extra_result.bioext_buffer[i]); - } - } - } - else if(VC921x_BIO_INFIFO_PPG_SUM == psample_ret->extra_result.biofifo_mode) - { - if ( 1==psample_ret->extra_result.bioinn_enwork||1==psample_ret->extra_result.bioext_enwork ) - { - psample_ret->extra_result.bio_fifo_num += 1; - if (1 == psample_ret->extra_result.bioinn_enwork) - { - psample_ret->extra_result.bioinn_buffer[i] = read_data_from_fifo_buffer(fifo_data, &array_offset, 0, 16 ); - CORE921x_DEBUG_LOG("result.bioinn_buffer[%d]=%d", i, psample_ret->extra_result.bioinn_buffer[i]); - } - if (1 == psample_ret->extra_result.bioext_enwork) - { - psample_ret->extra_result.bioext_buffer[i] = read_data_from_fifo_buffer(fifo_data, &array_offset, 0, 16 ); - CORE921x_DEBUG_LOG("result.bioext_buffer[%d]=%d", i, psample_ret->extra_result.bioext_buffer[i]); - } - } - if (2 == psample_ret->slot_result[2].slot_enwork && VC921x_IN_STORE == psample_ret->slot_result[2].slot_storefifo) - { - psample_ret->slot_result[2].ppg_num += 1; - analysis_ppg_data = read_data_from_fifo_buffer(fifo_data, &array_offset, 0, 16 ); - write_data_to_fifo_buffer( psample_ret->slot_result[2].ppg_buffer, psample_ret->slot_result[2].ppg_num-1, analysis_ppg_data, 0 ); - CORE921x_DEBUG_LOG("slot_result[2].ps_data[%d]=%d", i, analysis_ppg_data); - } - } - else /* VC921x_BIO_NOFIFO_PS_SGL VC921x_BIO_INFIFO_PPG_SGL */ - { - if (2 == psample_ret->slot_result[2].slot_enwork && VC921x_IN_STORE == psample_ret->slot_result[2].slot_storefifo) - { - psample_ret->slot_result[2].ppg_num += 1; - analysis_ppg_data = read_data_from_fifo_buffer(fifo_data, &array_offset, 0, 16 ); - write_data_to_fifo_buffer( psample_ret->slot_result[2].ppg_buffer, psample_ret->slot_result[2].ppg_num-1, analysis_ppg_data, 0 ); - CORE921x_DEBUG_LOG("slot_result[2].ps_data[%d]=%d", i, analysis_ppg_data); - } - } - } /* end of for(i 7) ? 7 : oversample; - slotcfg.slot_cfg1.bits.txch = txchsel; - slotcfg.slot_cfg2.bits.storefifo = slot_infifo; - - switch (sample_tim) - { - case VC921x_SAMPLE_TIM_50US: - slotcfg.slot_cfg1.bits.env_time = 2; - slotcfg.slot_cfg1.bits.sample_time = 0; - slotcfg.slot_cfg3.bits.sc = 3; /* env_time_config+1 */ - break; - case VC921x_SAMPLE_TIM_100US: - slotcfg.slot_cfg1.bits.env_time = 5; - slotcfg.slot_cfg1.bits.sample_time = 1; - slotcfg.slot_cfg3.bits.sc = 6; - break; - case VC921x_SAMPLE_TIM_150US: - slotcfg.slot_cfg1.bits.env_time = 8; - slotcfg.slot_cfg1.bits.sample_time = 2; - slotcfg.slot_cfg3.bits.sc = 9; - break; - case VC921x_SAMPLE_TIM_200US: - slotcfg.slot_cfg1.bits.env_time = 11; - slotcfg.slot_cfg1.bits.sample_time = 3; - slotcfg.slot_cfg3.bits.sc = 12; - break; - default: - slotcfg.slot_cfg1.bits.env_time = 5; - slotcfg.slot_cfg1.bits.sample_time = 1; - slotcfg.slot_cfg3.bits.sc = 6; - break; - } - ret = vc921x_write_register(slot_base_addr, (unsigned char *)&slotcfg, sizeof(core921x_slot_config_t)); - return ret; -} - -/* PPG通道及调整的函数接口 */ -CORE921x_FUNC_RAM_SECTION int __core921x_read_slot_adjust_param(unsigned char *pmax_res, unsigned char *pmin_res, unsigned char *pmax_curr, unsigned char *pmin_curr) -{ - *pmax_res = MAX_RES_LEVEL; - *pmin_res = MIN_RES_LEVEL; - *pmax_curr = MAX_CURRENT; - *pmin_curr = MIN_CURRENT; - return 0; -} - -/* 电流+电阻等级的读写,这部分是在使用过程中会反复调用的 */ -CORE921x_FUNC_RAM_SECTION int __core921x_read_slot_current_res(VC921x_PPG_SLOT_I slot_index, unsigned char *pslot_curr, unsigned char *pslot_reslvl) -{ - int ret = 0; - core921x_slot_config_t slotcfg = {0}; - /* read current */ - unsigned char cfg2_addr = CORE921x_CONFIG_SLOT_ADDR_BASE + (slot_index * 4) + 2; - ret = vc921x_read_register(cfg2_addr, (unsigned char *)&slotcfg.slot_cfg2, 1); - if (pslot_curr) - { - *pslot_curr = slotcfg.slot_cfg2.bits.current; - } - /* read reslvl */ - unsigned char cfg0_addr = CORE921x_CONFIG_SLOT_ADDR_BASE + (slot_index * 4); - unsigned char cfg3_addr = CORE921x_CONFIG_SLOT_ADDR_BASE + (slot_index * 4) + 3; - vc921x_read_register(cfg0_addr, (unsigned char *)&slotcfg.slot_cfg0, 1); - vc921x_read_register(cfg3_addr, (unsigned char *)&slotcfg.slot_cfg3, 1); - if (pslot_reslvl) - { - //*pslot_reslvl = slotcfg.slot_cfg3.bits.resistance; - *pslot_reslvl = get_level_by_res_rxgain(slotcfg.slot_cfg3.bits.resistance, slotcfg.slot_cfg0.bits.rxgain); - } - return ret; -} - -CORE921x_FUNC_RAM_SECTION int __core921x_set_ppgslot_current(VC921x_PPG_SLOT_I slot_index, unsigned char current) -{ - int ret = 0; - core921x_slot_cfg2bit slotcfg2 = {0}; - unsigned char cfg2_addr = CORE921x_CONFIG_SLOT_ADDR_BASE + (slot_index * 4) + 2; - ret = vc921x_read_register(cfg2_addr, (unsigned char *)&slotcfg2, 1); - slotcfg2.current = (current >= MAX_CURRENT) ? MAX_CURRENT : current; - ret = vc921x_write_register(cfg2_addr, (unsigned char *)&slotcfg2, 1); - return ret; -} - -CORE921x_FUNC_RAM_SECTION int __core921x_set_ppgslot_resistance(VC921x_PPG_SLOT_I slot_index, unsigned char res_level, unsigned char allow_oversample ) -{ - int ret = 0; - unsigned char res = 0, rxgain = 0; - core921x_slot_ppg_cfg0bit slotcfg0 = {0}; - core921x_slot_cfg3bit slotcfg3 = {0}; - unsigned char cfg0_addr = CORE921x_CONFIG_SLOT_ADDR_BASE + (slot_index * 4); - unsigned char cfg3_addr = CORE921x_CONFIG_SLOT_ADDR_BASE + (slot_index * 4) + 3; - ret = vc921x_read_register(cfg0_addr, (unsigned char *)&slotcfg0, 1); - ret = vc921x_read_register(cfg3_addr, (unsigned char *)&slotcfg3, 1); - res_level = (res_level >= MAX_RES_LEVEL) ? MAX_RES_LEVEL : res_level; - get_res_rxgain_by_level(res_level, &res, &rxgain); - slotcfg3.resistance = res; - slotcfg0.rxgain=rxgain; -#if 1 - if (slot_index <= 1 && allow_oversample) - { - slotcfg0.oversample = 1 * rxgain; - } -#endif - ret = vc921x_write_register(cfg0_addr, (unsigned char *)&slotcfg0, 1); - ret = vc921x_write_register(cfg3_addr, (unsigned char *)&slotcfg3, 1); - return ret; -} - -CORE921x_FUNC_RAM_SECTION int __core921x_set_slotx_pd_config( VC921x_SLOT_CHSEL slot0_pd, VC921x_SLOT_CHSEL slot1_pd, VC921x_SLOT_CHSEL slot2_pd ) -{ - int ret = 0; - core921x_pd_cfgbit pd_config = {0}; - pd_config.slot0_pdch = slot0_pd; - pd_config.slot1_pdch = slot1_pd; - pd_config.slot2_pdch = slot2_pd; - ret = vc921x_write_register(0x4C, (unsigned char *)&pd_config, sizeof(pd_config)); - return ret; -} - -CORE921x_FUNC_RAM_SECTION int __core921x_set_anti_slot_config( unsigned char anti_current, VC921x_CFG_FUNC deslot0, VC921x_CFG_FUNC deslot1, VC921x_CFG_FUNC deslot2, VC921x_PPG_TXCH_I antich ) -{ - int ret = 0; - core921x_anti_cfgbit anti_config = {0}; - core921x_anti_cfgbit_1120mpw anti_config_1120mpw={0}; - if( core921x_nto_version ) - { - anti_config.anti_current = anti_current>=7?7:anti_current; - anti_config.deslot0 = deslot0; - anti_config.deslot1 = deslot1; - anti_config.deslot2 = deslot2; - anti_config.antiTxch=antich; - ret = vc921x_write_register(0x4D, (unsigned char *)&anti_config, sizeof(core921x_anti_cfgbit)); - } - else - { - if( core921x_0808mpw ) return ret; - anti_config_1120mpw.anti_current = anti_current>=7?7:anti_current; - anti_config_1120mpw.deslot0 = deslot0; - anti_config_1120mpw.deslot1 = deslot1; - anti_config_1120mpw.deslot2 = deslot2; - ret = vc921x_write_register(0x4D, (unsigned char *)&anti_config_1120mpw, sizeof(core921x_anti_cfgbit_1120mpw)); - } - return ret; -} - -CORE921x_FUNC_RAM_SECTION int __core921x_set_common_config(VC921x_CFG_FUNC deenv_en, VC921x_CFG_FUNC i2crelease_en, VC921x_CFG_FUNC bio_disfreqHop, VC921x_CFG_FUNC fifo_format, VC921x_CFG_FUNC fifo_en, unsigned char cpd) -{ - int ret = 0; - core921x_com_cfgbit com_config = {0}; - com_config.deenv_en = deenv_en; - com_config.i2crelease_en = i2crelease_en; - com_config.bio_disfreqHop = bio_disfreqHop; - com_config.fifoformat = fifo_format; - com_config.fifo_en = fifo_en; - com_config.cpd = cpd; - if( core921x_0808mpw ) - { - com_config.bio_disfreqHop = 0; /* deFlick */ - ret = vc921x_write_register(0x4D, (unsigned char *)&com_config, sizeof(com_config)); - } - else - { - ret = vc921x_write_register(0x4E, (unsigned char *)&com_config, sizeof(com_config)); - } - return ret; -} - -CORE921x_FUNC_RAM_SECTION int __core921x_set_sample_frequency(unsigned short int div1, unsigned char div2, unsigned char div3) -{ - int ret = 0; - unsigned char freq_config[4] = {0}; - freq_config[0] = (div1 >> 8); - freq_config[1] = (div1 & 0xFF); - freq_config[2] = div2; - freq_config[3] = div3; - if( core921x_0808mpw ) - { - ret = vc921x_write_register(0x4E, freq_config, sizeof(freq_config)); - } - else - { - ret = vc921x_write_register(0x4F, freq_config, sizeof(freq_config)); - } - return ret; -} - -/**************************************************************** - * CORE_API.write()/set() - * txchx_comconfig & ppg threshold configuration - * write or set config registers - ***************************************************************/ -CORE921x_FUNC_RAM_SECTION int __core921x_set_threshold_config(unsigned char ppgth_h, unsigned char ppgth_l) -{ - int ret = 0; - core921x_ppgth_cfgbit ppgth_config = {0}; - ppgth_config.ppgthh = (ppgth_h >= 0xf) ? 0xf : ppgth_h; - ppgth_config.ppgthl = (ppgth_l >= 0xf) ? 0xf : ppgth_l; - if( core921x_0808mpw ) - { - ret = vc921x_write_register(0x52, (unsigned char *)&ppgth_config, 1); - } - else - { - ret = vc921x_write_register(0x53, (unsigned char *)&ppgth_config, 1); - } - return ret; -} -/**************************************************************** - * CORE_API.write()/set() - * extra(ADC,BIO,temperature,AT/DT) configuration - * write or set config registers - ***************************************************************/ -CORE921x_FUNC_RAM_SECTION int __core921x_set_interrupt_config(VC921x_IO_MODE int_mode, VC921x_IO_DIR int_dir, VC921x_IO_PULSE_TIM int_len, unsigned char evt_en) -{ - int ret = 0; - core921x_int_cfgbit int_config = {0}; - int_config.intmode = (unsigned char)int_mode; - int_config.intdir = (unsigned char)int_dir; - int_config.intlen = (unsigned char)int_len; - if (evt_en & VC921x_EN_EVT_FREQ2) - { - int_config.intfreq2_en = 1; - } - if (evt_en & VC921x_EN_EVT_FIFO) - { - int_config.intfifo_en = 1; - } - if (evt_en & VC921x_EN_EVT_OVLD) - { - int_config.intov_en = 1; - } - if (evt_en & VC921x_EN_EVT_PPG) - { - int_config.intppg_en = 1; - } - if( core921x_0808mpw ) - { - ret = vc921x_write_register(0x53, (unsigned char *)&int_config, sizeof(int_config)); - } - else - { - ret = vc921x_write_register(0x54, (unsigned char *)&int_config, sizeof(int_config)); - } - return ret; -} - -CORE921x_FUNC_RAM_SECTION int __core921x_set_bioslot_config(VC921x_CFG_FUNC bioinn_en, VC921x_CFG_FUNC bioext_en, VC921x_BIO_MODE biofifo_mode, VC921x_BIO_CHSEL bio_chsel, unsigned char biofreq, unsigned char biocap, unsigned char biotime) -{ - int ret = 0; - core921x_bio_cfg0bit bio_config0 = {0}; - core921x_bio_cfg1bit bio_config1 = {0}; - bio_config0.bio_inn_en = bioinn_en; - bio_config0.bio_ext_en = bioext_en; - bio_config0.bio_mode = biofifo_mode; - bio_config0.bio_pdch = bio_chsel; - bio_config0.bio_freq = (biofreq > 3) ? 3 : biofreq; - - bio_config1.bio_capadd = (biocap > 0x1f) ? (0x1f) : biocap; - bio_config1.bio_time = (biotime > 0x7) ? (0xf) : biotime; - if( core921x_0808mpw ) - { - ret = vc921x_write_register(0x54, (unsigned char *)&bio_config0, 1); - ret = vc921x_write_register(0x55, (unsigned char *)&bio_config1, 1); - } - else - { - ret = vc921x_write_register(0x55, (unsigned char *)&bio_config0, 1); - ret = vc921x_write_register(0x56, (unsigned char *)&bio_config1, 1); - } - return ret; -} - -CORE921x_FUNC_RAM_SECTION int __core921x_set_bioinn_addcap(unsigned char biocap) -{ - int ret = 0; - core921x_bio_cfg1bit bio_config1 = {0}; - if( core921x_0808mpw ) - { - vc921x_read_register(0x55, (unsigned char *)&bio_config1, 1); - bio_config1.bio_capadd = (biocap > 0x1f) ? (0x1f) : biocap; - ret = vc921x_write_register(0x55, (unsigned char *)&bio_config1, 1); - } - else - { - vc921x_read_register(0x56, (unsigned char *)&bio_config1, 1); - bio_config1.bio_capadd = (biocap > 0x1f) ? (0x1f) : biocap; - ret = vc921x_write_register(0x56, (unsigned char *)&bio_config1, 1); - } - return ret; -} - -CORE921x_FUNC_RAM_SECTION int __core921x_set_temperature_config(VC921x_CFG_FUNC tempslot0_en, VC921x_TEMP_SLOT tempslot0_chsel, unsigned char tempslot0_current, -VC921x_CFG_FUNC tempslot1_en, VC921x_TEMP_SLOT tempslot1_chsel, unsigned char tempslot1_current ) -{ - int ret = 0; - core921x_temp_cfgbit temp_config[2] = {0}; - temp_config[0].temp_enable = tempslot0_en; - temp_config[0].temp_slotch = tempslot0_chsel; - temp_config[0].temp_currset = (tempslot0_current >= 7) ? 7 : tempslot0_current; - temp_config[1].temp_enable = tempslot1_en; - temp_config[1].temp_slotch = tempslot1_chsel; - temp_config[1].temp_currset = (tempslot1_current >= 7) ? 7 : tempslot1_current; - if(core921x_0808mpw) - { - ret = vc921x_write_register(0x56, (unsigned char *)&temp_config, sizeof(temp_config)); - } - else - { - ret = vc921x_write_register(0x57, (unsigned char *)&temp_config, sizeof(temp_config)); - } - return ret; -} - -CORE921x_FUNC_RAM_SECTION int __core921x_set_adc_config( VC921x_ADC_RESOLUTION adc_resulution, VC921x_CFG_FUNC ovdata_sum_enable ) -{ - int ret=0; - core921x_adc_config_t adc_config={0}; - core921x_adc_config_t_1120mpw adc_config_1120mpw={0}; - if( core921x_nto_version ) - { - adc_config.ppg_resulution=adc_resulution; - adc_config.ovtype = ovdata_sum_enable; - adc_config.cmpset = 3; - adc_config.env_clkdiv=0; - adc_config.adc_speed=0; - ret = vc921x_write_register(0x59, (unsigned char *)&adc_config, sizeof(adc_config)); - } - else - { - adc_config_1120mpw.ppg_resulution=adc_resulution; - adc_config_1120mpw.ovtype = ovdata_sum_enable; - adc_config_1120mpw.reserved = 0; - adc_config_1120mpw.env_clkdiv=0; - adc_config_1120mpw.adc_speed=0; - if( core921x_0808mpw ) - { - ret = vc921x_write_register(0x58, (unsigned char *)&adc_config_1120mpw, sizeof(adc_config_1120mpw)); - } - else - { - ret = vc921x_write_register(0x59, (unsigned char *)&adc_config_1120mpw, sizeof(adc_config_1120mpw)); - } - } - //CORE921x_DEBUG_LOG("write register adc_resulution=[%d],ovdata_sum_enable=[%d]", adc_resulution, ovdata_sum_enable); - return ret; -} - -CORE921x_FUNC_RAM_SECTION int __core921x_set_rcosc_frequency(unsigned char oscset) -{ - int ret = 0; - if( core921x_0808mpw ) - { - ret = vc921x_write_register(0x59, &oscset, 1); - } - else - { - ret = vc921x_write_register(0x5A, &oscset, 1); - } - return ret; -} - -CORE921x_FUNC_RAM_SECTION int __core921x_write_work_cmd(VC921x_WORK_CMD cmd) // -{ - int ret = 0; - unsigned char wcmd = 0; - switch (cmd) - { - case VC921x_STOP_WORK_CMD: - wcmd = 0x00; - break; - case VC921x_START_WORK_CMD: - wcmd = 0x5A; - break; - case VC921x_RESET_SOFT_CMD: - wcmd = 0xA5; - break; - default: - return 1; - } - ret = vc921x_write_register(CORE921x_WORK_CMD_ADDR_BASE, &wcmd, 1); - return ret; -} diff --git a/code/sdk/zhihui/drivers/ppg/vc921x/src/vc921x_driver.c b/code/sdk/zhihui/drivers/ppg/vc921x/src/vc921x_driver.c deleted file mode 100644 index 1f6b548fd..000000000 --- a/code/sdk/zhihui/drivers/ppg/vc921x/src/vc921x_driver.c +++ /dev/null @@ -1,1907 +0,0 @@ -/********************************************************************************************** - * @Copyright(c) 2023, Chengdu vcaresensor Microelectronics Corporation. All rights reserved. - * @Author: Tse - * @Date: 2023-11-03 01:20:20 - * @LastEditTime: 2024-04-11 20:37:31 - * @LastEditors: Tse - * @Description: - **********************************************************************************************/ -#include "vc921x_core_com.h" -#include "vc921x_driver_config.h" -#include "vc921x_driver.h" - -#if (VC921x_CFG_WEAR_BIO_OLD_EN==VC921x_FUNC_ENABLE) -#include "BIODetect_V14_1.h" -#endif - -#ifndef VC_ABS_MAX -#define VC_ABS_MAX(a, b, max) (((a) > (b)) ? ((a) - (b)) : (max + (a) - (b))) -#endif -#ifndef VC_ABS -#define VC_ABS(a, b) (((a) > (b)) ? ((a) - (b)) : ((b) - (a))) -#endif - -#ifndef VC921x_ENV_CONVERT -#define VC921x_ENV_CONVERT( hex_env ) (((hex_env)>>8)*50+((hex_env)&0xff)) -#endif - -unsigned short int VC921x_CFG_MCU_TICK_FREQUENCY=32000; /* extern unsigned short int VC921x_CFG_MCU_TICK_FREQUENCY; */ -unsigned short int VC921x_WEAR_PARAM_BIO_ABS_HOLD=100; /* extern unsigned short int VC921x_WEAR_PARAM_BIO_ABS_HOLD; */ -unsigned short int VC921x_WEAR_PARAM_BIO_ABS_DROP=100; /* extern unsigned short int VC921x_WEAR_PARAM_BIO_ABS_HOLD; */ - -unsigned int vc921x_calc_ps_reflect_thh( unsigned char psI, unsigned char psR, unsigned char ps_adcbit ) -{ - unsigned int calc_psthh = 0; - float fix_I = vcare_I_exponent_func( 0.8f, VC921x_WEAR_PARAM_PS_CURRENT ); - float fix_R = vcare_R_exponent_func( 100.0f, VC921x_WEAR_PARAM_PS_RESISTANCE ); - float real_I= vcare_I_exponent_func( 0.8f, psI ); -#if VC921x_CFG_DEFAULT_PPGGAIN_EN - float real_R= vcare_R_exponent_func( 200.0f, psR ); /* !!notice:gain_min=1 */ -#else - float real_R= vcare_R_exponent_func( 100.0f, psR ); /* !!notice:gain_min=0 */ -#endif - unsigned int adc_gain=1<<(ps_adcbit-16); - float k = (real_I*real_R)/(fix_I*fix_R*(1<wear_drop_flag = 0; - if (drv_info_handle->fifo_read_data_valid) - { - /* ppg ps slot */ - for (i = 0; i < 3; i++) - { - presult_info->slot_result[i].ppg_num = 0; - vcare_memset(presult_info->slot_result[i].ppg_buffer, 0, sizeof(presult_info->slot_result[i].ppg_buffer)); - } - /* bioinn bioext */ - presult_info->extra_result.bio_fifo_num = 0; - vcare_memset(presult_info->extra_result.bioinn_buffer, 0, sizeof(presult_info->extra_result.bioinn_buffer)); - vcare_memset(presult_info->extra_result.bioext_buffer, 0, sizeof(presult_info->extra_result.bioext_buffer)); - } -} - -/******************************************************************************************************** - * 驱动参数保存部分 - ********************************************************************************************************/ -static int drv_infomation_param_save(void) -{ - int ret = 0; - unsigned char save_buf[12] = {0}; - save_buf[0] = 0xAA; - save_buf[1] = drv_info_handle->optimal_bio_valid = 1; - save_buf[2] = drv_info_handle->optimal_cap; - - save_buf[3] = (drv_info_handle->optimal_bio_gap >> 24) & 0xff; /* calibration deviation */ - save_buf[4] = (drv_info_handle->optimal_bio_gap >> 16) & 0xff; - save_buf[5] = (drv_info_handle->optimal_bio_gap >> 8) & 0xff; - save_buf[6] = (drv_info_handle->optimal_bio_gap >> 0) & 0xff; - save_buf[7] = (drv_info_handle->optimal_bio_temp >> 24) & 0xff; /* temperature deviation */ - save_buf[8] = (drv_info_handle->optimal_bio_temp >> 16) & 0xff; - save_buf[9] = (drv_info_handle->optimal_bio_temp >> 8) & 0xff; - save_buf[10] = (drv_info_handle->optimal_bio_temp >> 0) & 0xff; - ret = vc921x_param_write_flash(save_buf, sizeof(save_buf)); - VCARE_DBG_LOG("save bio param: %d,%d,%d,%d(temp)", drv_info_handle->optimal_bio_valid, drv_info_handle->optimal_cap, drv_info_handle->optimal_bio_gap, drv_info_handle->optimal_bio_temp); - return ret; /* successed return 0 */ -} -static int drv_infomation_param_load(void) -{ - int ret = 0; - unsigned char load_buf[12] = {0}; - ret = vc921x_param_read_flash(load_buf, sizeof(load_buf)); - if (load_buf[0] == 0xAA) - { - drv_info_handle->optimal_bio_valid = load_buf[1]; - drv_info_handle->optimal_cap = load_buf[2]; - drv_info_handle->optimal_bio_gap = (int)((load_buf[3] << 24) + (load_buf[4] << 16) + (load_buf[5] << 8) + (load_buf[6])); - drv_info_handle->optimal_bio_temp= (int)((load_buf[7] << 24) + (load_buf[8] << 16) + (load_buf[9] << 8) + (load_buf[10])); - } - else - { - drv_info_handle->optimal_bio_valid = 0; - drv_info_handle->optimal_cap = 0; - drv_info_handle->optimal_bio_gap = 0; - drv_info_handle->optimal_bio_temp=0; - ret=0; - } - VCARE_DBG_LOG("load bio param: %d,%d,%d,%d(temp)", drv_info_handle->optimal_bio_valid, drv_info_handle->optimal_cap, drv_info_handle->optimal_bio_gap, drv_info_handle->optimal_bio_temp); - return ret; /* successed return 0 */ -} -/* clear param,and */ -static int drv_infomation_param_reset(void) -{ - drv_info_handle->optimal_bio_valid = 0; - drv_info_handle->optimal_cap = 0; - drv_info_handle->optimal_bio_gap = 0; - drv_info_handle->optimal_bio_temp=0; - /* init [dichotomy]param */ - last_ext_bio=0; - remember_biomax_mark=0; - remember_biomin_mark=0; - remember_biomax_value = 0; - remember_biomin_value = 0; - /* 二分中值及采样标志 */ - last_inn_bio_mid=0; - set_flg_mid=0; - /* 二分初始数据 */ - set_cap_max=31; - set_cap_mid=16; - set_cap_min=1; - return 0; -} -/***************************************************************************** - * driver_work_mode table: - * {WORK_MODE, MODE_INIT_FUNC, MODE_HANDLER_FUNC } - *****************************************************************************/ -static const vc921x_mode_ops *sel_mode_ops = NULL; -static int drv_heartrate_mode_init(void); -static int drv_spo2_mode_init(void); -static int drv_bloodpressure_mode_init(void); -static int drv_wear_mode_init(void); -static int drv_temperature_mode_init(void); -static int drv_factory_green_ps_mode_init(void); -static int drv_factory_ir_red_mode_init(void); -static int drv_hrspo2_mode_init(void); -/*handler*/ -static int drv_ppg_mode_handler(const void *ops_self, vcare_ppg_device_t *pdev); -static int drv_factory_mode_handler(const void *ops_self, vcare_ppg_device_t *pdev); - -static const vc921x_mode_ops mode_ops[] = - { - /* work_mode, work_mode_init, work_mode_handler */ - {WORK_MODE_HR, drv_heartrate_mode_init, drv_ppg_mode_handler}, - {WORK_MODE_SPO2, drv_spo2_mode_init, drv_ppg_mode_handler}, - {WORK_MODE_HRV, drv_heartrate_mode_init, drv_ppg_mode_handler}, - {WORK_MODE_STRESS, drv_heartrate_mode_init, drv_ppg_mode_handler}, - {WORK_MODE_BLOODPRESSURE, drv_bloodpressure_mode_init, drv_ppg_mode_handler}, - {WORK_MODE_WEAR, drv_wear_mode_init, drv_ppg_mode_handler}, - {WORK_MODE_TEMPERATURE, drv_temperature_mode_init, drv_ppg_mode_handler}, - {WORK_MODE_FACTORY0, drv_factory_green_ps_mode_init, drv_factory_mode_handler}, - {WORK_MODE_FACTORY1, drv_factory_ir_red_mode_init, drv_factory_mode_handler}, - {WORK_MODE_HRSPO2, drv_hrspo2_mode_init, drv_ppg_mode_handler}, -}; - -/****************************************************************************** - * 初始化部分 - ******************************************************************************/ -static void drv_infomation_param_init(vcare_ppg_device_t *pdev) -{ - int i; - unsigned char max_cur = 0, min_cur = 0, max_res_lvl = 0, min_res_lvl = 0; - /* slot_adjust param */ - core921x_read_slot_adjust_param(&max_res_lvl, &min_res_lvl, &max_cur, &min_cur); - for (i = 0; i < 3; i++) - { - adjust_info_handle[i]->const_max_current = max_cur; - adjust_info_handle[i]->const_min_current = min_cur; - adjust_info_handle[i]->max_current = max_cur; - adjust_info_handle[i]->const_max_res_level = max_res_lvl; - adjust_info_handle[i]->const_min_res_level = min_res_lvl; - adjust_info_handle[i]->max_res_level = max_res_lvl; - adjust_info_handle[i]->adj_param.current_step = VC921x_ADJ_I_STEP_DFT; - adjust_info_handle[i]->adj_param.direction = VC921x_ADJUST_DIR_NONE; - adjust_info_handle[i]->adj_param.direction_last = VC921x_ADJUST_DIR_NONE; - } - /* dev_wear param */ - drv_info_handle->optimal_bio_valid =1; /* 先置1,等待在factory模式下主动清除后进行配平 */ -#if (VC921x_WEAR_DFT_HOLD == VC921x_CFG_WEAR_DEFAULT_STA) - wear_info_handle->last_status = (WEAR_STA_NONE == wear_info_handle->last_status) ? WEAR_STA_HOLD : wear_info_handle->last_status; -#else - #if (VC921x_CFG_WEAR_BIO_OLD_EN!=VC921x_FUNC_ENABLE) - /* 注意:只能非边沿活体的条件下,第一次或者停止工作后,重置活体状态为DROP。边沿的方式调用stop因为机制问题,无论如何都不能完美处理stop之后的状态 */ - wear_info_handle->bio_wear_result = (WEAR_STA_NONE == wear_info_handle->last_status) ? VC921x_BIO_STA_DROP : wear_info_handle->bio_wear_result; - #endif - wear_info_handle->last_status = (WEAR_STA_NONE == wear_info_handle->last_status) ? WEAR_STA_DROP : wear_info_handle->last_status; -#endif -#if (VC921x_FUNC_ENABLE != VC921x_CFG_WEAR_DETECTION) - wear_info_handle->last_status = WEAR_STA_HOLD; -#endif - /* 切换模式如果为摘下时,需要关灯 */ - if (wear_info_handle->last_status == WEAR_STA_DROP && (drv_info_handle->work_mode != WORK_MODE_FACTORY0 && drv_info_handle->work_mode != WORK_MODE_FACTORY1)) - { - for (i = 0; i < 3; i++) - { - if (sample_info_handle->slot_result[i].slot_enwork == 1) - { - core921x_set_enable_config((VC921x_PPG_SLOT_I)i, VC921x_CFG_DISABLE); - sample_info_handle->slot_result[i].slot_enwork = 0; - } - if( drv_info_handle->ppg_convert_ps ) - { - drv_info_handle->ppg_convert_ps=0; - VC921x_PS_SLOT_PARAM_CONFIG(sample_info_handle->slot_result[2] /*slot2_ps*/, VC921x_IN_STORE /*storefifo*/, VC921x_WEAR_PARAM_PS_CURRENT /*current*/, VC921x_WEAR_PARAM_PS_RESISTANCE /*resistance*/); - core921x_sample_slotx_config( VC921x_PPG_SLOT_2, sample_info_handle, VC921x_PPG_TXCH_2, VC921x_WEAR_PARAM_PS_GAIN /*rxgain*/, 0 /*oversample,2^N*/, VC921x_SAMPLE_TIM_100US); - } - } - } - wear_info_handle->wear_status = wear_info_handle->last_status; - pdev->wear = wear_info_handle->last_status; - - wear_info_handle->drop_cnt = VC921x_CFG_WEAR_DROP_CNT; - wear_info_handle->hold_cnt = VC921x_CFG_WEAR_HOLD_CNT; - wear_info_handle->acce_wear_status = WEAR_STA_HOLD; - wear_info_handle->algo_wear_status = WEAR_STA_HOLD; - /* dev_clk param */ - drv_calibration_clk_clear(); - /* read_fifo_address */ - drv_info_handle->read_fifo_address = 0; - if( drv_info_handle->work_mode==WORK_MODE_SPO2 || drv_info_handle->work_mode==WORK_MODE_HRSPO2 ) - { - drv_info_handle->ppg_max_thval = VC921x_PPG_SPO2_MAX_DEFT_THVAL; - drv_info_handle->ppg_min_thval = VC921x_PPG_SPO2_MIN_DEFT_THVAL; - } - else - { - drv_info_handle->ppg_max_thval = VC921x_PPG_MAX_DEFT_THVAL; - drv_info_handle->ppg_min_thval = VC921x_PPG_MIN_DEFT_THVAL; - } - if (wear_info_handle->bio_wear_result == VC921x_BIO_STA_NONE) - { -#if (VC921x_CFG_WEAR_BIO_OLD_EN==VC921x_FUNC_ENABLE) - f_BIOInit( VC921x_WEAR_PARAM_BIO_DELTA, VC921x_WEAR_PARAM_PS_DELTA ); - VCARE_DBG_LOG("f_BIOedgeinit(%d, %d, %d)", VC921x_WEAR_PARAM_BIO_DELTA, VC921x_WEAR_PARAM_PS_DELTA ); -#endif - } -} - -static int drv_calc_bioinn_auto_addcap(unsigned char status, vc921x_sample_info_t *psample_info) -{ - unsigned char finished_set=0; - unsigned char finished_mark=0; - if (status & VC921x_EVENT_INTPS_RDY) - { - if (drv_info_handle->optimal_bio_valid) - { - return 0; - } - /* 判断是否bioext发生变化,如果变化太大,那么直接校准失败 */ - if( last_ext_bio!=0 && VC_ABS(last_ext_bio,psample_info->extra_result.bioext_data)>=20 ) - { - VCARE_DBG_ERR("calc bioinn error, bioext running..."); - } - last_ext_bio = psample_info->extra_result.bioext_data; - /* 二分法校准,循环赋值,设置参数与采样值呈负相关 */ - if( set_flg_mid==1 ) - { - set_flg_mid=0; - last_inn_bio_mid=psample_info->extra_result.bioinn_data; - } - if( last_inn_bio_mid==0 ) - { - core921x_set_bioinn_addcap(psample_info,set_cap_mid); - set_flg_mid=1; - return 0; - } - /* 在合理范围内快速退出 */ - if( (psample_info->extra_result.bioext_data-VC921x_CALC_BIOINN_OFFSET)<=last_inn_bio_mid && (psample_info->extra_result.bioext_data+VC921x_CALC_BIOINN_OFFSET)>=last_inn_bio_mid ) - { - finished_set=set_cap_mid; - finished_mark=1; - VCARE_DBG_LOG("(+-100)now set cap[%d,%d,%d],now_bio_val[%d](%d) ->set[%d]", set_cap_min,set_cap_mid, set_cap_max, - last_inn_bio_mid, psample_info->extra_result.bioext_data, last_inn_bio_mid ); - } - else /* 不在范围,范围比较大,继续二分 */ - { - /* 检索完成,需要再min和max中取一个值 */ - if( (set_cap_max-set_cap_min)<=1 ) - { - if(remember_biomax_mark==1) - { - remember_biomax_mark=0; - remember_biomax_value = psample_info->extra_result.bioinn_data; - } - if( remember_biomin_mark==1 ) - { - remember_biomin_mark=0; - remember_biomin_value = psample_info->extra_result.bioinn_data; - } - if( remember_biomax_value==0 ) - { - remember_biomax_mark=1; - core921x_set_bioinn_addcap(psample_info,set_cap_max); - return 0; - } - if( remember_biomin_value==0 ) - { - remember_biomin_mark=1; - core921x_set_bioinn_addcap(psample_info,set_cap_min); - return 0; - } - if( VC_ABS(remember_biomin_value,psample_info->extra_result.bioext_data) <= VC_ABS(remember_biomax_value,psample_info->extra_result.bioext_data) ) - { - finished_set=set_cap_min;/* 取min,结束 */ - last_inn_bio_mid = remember_biomin_value; - } - else - { - finished_set=set_cap_max;/* 取max,结束 */ - last_inn_bio_mid = remember_biomax_value; - } - finished_mark=1; - VCARE_DBG_LOG("mingap(%d)[%d],maxgap(%d)[%d]->(%d)",set_cap_min,VC_ABS(remember_biomin_value,psample_info->extra_result.bioext_data), - set_cap_max,VC_ABS(remember_biomax_value,psample_info->extra_result.bioext_data), finished_set); - } - /* 继续执行二分逼近 */ - if( last_inn_bio_midextra_result.bioext_data ) - { - VCARE_DBG_LOG("(midset[%d]", set_cap_min,set_cap_mid, set_cap_max, - last_inn_bio_mid, psample_info->extra_result.bioext_data, (set_cap_min+set_cap_mid)/2 ); - set_cap_max = set_cap_mid; - set_cap_mid = (set_cap_min+set_cap_mid)/2; - set_flg_mid = 1; - core921x_set_bioinn_addcap(psample_info,set_cap_mid); - } - else if( last_inn_bio_mid>psample_info->extra_result.bioext_data ) - { - VCARE_DBG_LOG("(mid>bioext)now set cap[%d,%d,%d],now_bio_val[%d](%d) ->set[%d]", set_cap_min,set_cap_mid, set_cap_max, - last_inn_bio_mid, psample_info->extra_result.bioext_data, (set_cap_max+set_cap_mid)/2 ); - set_cap_min = set_cap_mid; - set_cap_mid = (set_cap_max+set_cap_mid)/2; - set_flg_mid = 1; - core921x_set_bioinn_addcap(psample_info,set_cap_mid); - } - else if( last_inn_bio_mid==psample_info->extra_result.bioext_data ) /* 完全相等,直接结束 */ - { - VCARE_DBG_LOG("(mid=bioext)now set cap[%d,%d,%d],now_bio_val[%d](%d) ->set[%d]", set_cap_min,set_cap_mid, set_cap_max, - last_inn_bio_mid, psample_info->extra_result.bioext_data, set_cap_mid); - finished_set=set_cap_mid; - finished_mark=1; - } - } - if( finished_mark ) /* 查找结束处理 */ - { - drv_info_handle->optimal_cap = finished_set; - drv_info_handle->optimal_bio_gap = last_inn_bio_mid - psample_info->extra_result.bioext_data; - drv_info_handle->optimal_bio_temp= psample_info->extra_result.temp0_data; /* inn_temp */ - /* set optimal_cap */ - core921x_set_bioinn_addcap(psample_info,drv_info_handle->optimal_cap); - VCARE_DBG_LOG("optimal_cap=%d, optimal_bio_gap=%d", drv_info_handle->optimal_cap, drv_info_handle->optimal_bio_gap ); - /* save flash_ok */ - drv_infomation_param_save(); - } - } - return -1; -} - -static void drv_calibration_entry_fast_irq( void ) -{ - core921x_set_interrupt_config( VC921x_EN_EVT_FREQ2|VC921x_EN_EVT_FIFO | VC921x_EN_EVT_OVLD | VC921x_EN_EVT_PPG ); -} -static void drv_calibration_exit_fast_irq( void ) -{ - if( drv_info_handle->work_mode==WORK_MODE_FACTORY0 || drv_info_handle->work_mode==WORK_MODE_FACTORY1 ) - { - core921x_set_interrupt_config( VC921x_EN_EVT_FREQ2 | VC921x_EN_EVT_FIFO | VC921x_EN_EVT_OVLD ); - } - else - { - core921x_set_interrupt_config( VC921x_EN_EVT_FIFO | VC921x_EN_EVT_OVLD | VC921x_EN_EVT_PPG ); - } -} - -static void drv_common_register_config( vc921x_drv_info *pdrv_info ) -{ - sample_info_handle->ppg_div = pdrv_info->ppg_div; - sample_info_handle->ps_div = pdrv_info->ps_div; - sample_info_handle->fifo_div = pdrv_info->fifo_div; - sample_info_handle->hold_div = pdrv_info->ps_div; - sample_info_handle->drop_div = pdrv_info->drop_div; -#if (VC921x_CFG_DROP_REDUCE_FREQ==VC921x_FUNC_ENABLE && 0==VC921x_PS_WORK_FREQUENCY_CONFIG) - if( WEAR_STA_DROP==wear_info_handle->wear_status ) - { - sample_info_handle->ps_div= pdrv_info->drop_div; - sample_info_handle->fifo_div=1; - } -#endif - sample_info_handle->fifo_enable = 1; - sample_info_handle->adc_resolution = 16; /* adc位数设置=16,18,20,22,注意初版0808mp的22bitADC不可用 */ - sample_info_handle->fifo_format = ( sample_info_handle->adc_resolution>=18 )?1:0; - core921x_set_common_config(sample_info_handle->fifo_enable, sample_info_handle->fifo_format, sample_info_handle->adc_resolution, - VC921x_CFG_PPG_CHANNL_SELECT, VC921x_CFG_PPG_CHANNL_SELECT, VC921x_CFG_PPG_CHANNL_SELECT); - /* set frequency and enable IRQ */ - core921x_set_sample_frequency(sample_info_handle->ppg_div, sample_info_handle->ps_div, sample_info_handle->fifo_div); - core921x_set_interrupt_config( VC921x_EN_EVT_FIFO | VC921x_EN_EVT_OVLD | VC921x_EN_EVT_PPG ); - /* ps2 */ - VC921x_PS_SLOT_PARAM_CONFIG(sample_info_handle->slot_result[2] /*slot2_ps*/, VC921x_IN_STORE /*storefifo*/, VC921x_WEAR_PARAM_PS_CURRENT /*current*/, VC921x_WEAR_PARAM_PS_RESISTANCE /*resistance*/); - core921x_sample_slotx_config( VC921x_PPG_SLOT_2, sample_info_handle, VC921x_PPG_TXCH_2, VC921x_WEAR_PARAM_PS_GAIN/*rxgain*/, 0 /*oversample,2^N*/, VC921x_SAMPLE_TIM_100US); - /* bio */ -#if (VC921x_FUNC_ENABLE == VC921x_CFG_WEAR_BIO_EN) - VC921x_BIO_SLOT_PARAM_CONFIG(sample_info_handle->extra_result, VC921x_CFG_ENABLE /*bio_innenable*/, VC921x_CFG_ENABLE /*bio_extenable*/, VC921x_BIO_INFIFO_PPG_SUM /*biofifo_mode*/); - core921x_set_bioslot_config(sample_info_handle, drv_info_handle->optimal_cap); -#endif - /* inn-slot0,用于修正活体问题偏差及检验IC异常状态 */ - VC921x_TMP_SLOT_PARAM_CONFIG(sample_info_handle->extra_result, VC921x_CFG_ENABLE /*tmpslot0_enable*/, VC921x_CFG_ENABLE /*tmpslot1_enable*/, 6 /*tmp_setcur*/); - core921x_set_temperature_config(sample_info_handle); -} - -static int drv_heartrate_mode_init(void) -{ - unsigned char hr_over_sample_config=0; - VC921x_SAMPLE_TIM sample_time_config = VC921x_SAMPLE_TIM_100US; - if( WORK_MODE_HR==sel_mode_ops->mode ) - { - hr_over_sample_config = 0; - sample_info_handle->adc_resolution = 16; /* adc位数设置=16,18,20 */ - if( drv_info_handle->hr_algo_mode != 0 ) /* 20240531.心率普通模式特殊配置,开启16倍过采,200us发光@algo.h */ - { - hr_over_sample_config = VC921x_CFG_SPORT_HR_OVERSAMPLE; - sample_time_config = VC921x_CFG_SPORT_HR_SAMPLETIME; - } - sample_info_handle->fifo_format = ( sample_info_handle->adc_resolution>=18 )?1:0; - core921x_set_common_config(sample_info_handle->fifo_enable, sample_info_handle->fifo_format, sample_info_handle->adc_resolution, - VC921x_CFG_PPG_CHANNL_SELECT, VC921x_CFG_PPG_CHANNL_SELECT, VC921x_CFG_PPG_CHANNL_SELECT); - } - /* ppg0 */ - VC921x_PPG_SLOT_PARAM_CONFIG(sample_info_handle->slot_result[0] /*slot0_ppg*/, VC921x_PPG_CURT /*current*/, VC921x_PPG_RESISTANCE /*resistance*/); - core921x_sample_slotx_config( VC921x_PPG_SLOT_0, sample_info_handle, VC921x_PPG_TXCH_0, VC921x_PPG_GAIN /*rxgain*/, hr_over_sample_config /*oversample,2^N*/, sample_time_config); - return 0; -} - -static int drv_spo2_mode_init(void) -{ - sample_info_handle->adc_resolution = 16; /* adc位数设置=16,18,20,22 */ - sample_info_handle->fifo_format = ( sample_info_handle->adc_resolution>=18 )?1:0; - core921x_set_common_config(sample_info_handle->fifo_enable, sample_info_handle->fifo_format, sample_info_handle->adc_resolution, - VC921x_CFG_PPG_CHANNL_SELECT, VC921x_CFG_PPG_CHANNL_SELECT, VC921x_CFG_PPG_CHANNL_SELECT); - /* ppg0 */ - VC921x_PPG_SLOT_PARAM_CONFIG(sample_info_handle->slot_result[0] /*slot0_ppg*/, VC921x_PPG_CURT /*current*/, VC921x_PPG_RESISTANCE /*resistance*/); - core921x_sample_slotx_config(VC921x_PPG_SLOT_0, sample_info_handle, VC921x_PPG_TXCH_2, VC921x_PPG_GAIN /*rxgain*/, 3 /*oversample,2^N*/, VC921x_SAMPLE_TIM_100US); - /* ppg1 */ - VC921x_PPG_SLOT_PARAM_CONFIG(sample_info_handle->slot_result[1] /*slot0_ppg*/, VC921x_PPG_CURT /*current*/, VC921x_PPG_RESISTANCE /*resistance*/); - core921x_sample_slotx_config(VC921x_PPG_SLOT_1, sample_info_handle, VC921x_PPG_TXCH_1, VC921x_PPG_GAIN /*rxgain*/, 3 /*oversample,2^N*/, VC921x_SAMPLE_TIM_100US); - return 0; -} -static int drv_bloodpressure_mode_init(void) -{ - /* ppg0 */ - VC921x_PPG_SLOT_PARAM_CONFIG(sample_info_handle->slot_result[0] /*slot0_ppg*/, VC921x_PPG_CURT /*current*/, VC921x_PPG_RESISTANCE /*resistance*/); - core921x_sample_slotx_config(VC921x_PPG_SLOT_0, sample_info_handle, VC921x_PPG_TXCH_2, VC921x_PPG_GAIN /*rxgain*/, 0 /*oversample,2^N*/, VC921x_SAMPLE_TIM_100US); - return 0; -} -static int drv_wear_mode_init(void) -{ - return 0; -} -static int drv_factory_green_ps_mode_init(void) -{ - /* ppg0 */ - VC921x_PPG_SLOT_PARAM_CONFIG(sample_info_handle->slot_result[0] /*slot0_ppg*/, VC921x_FAT_GREEN_MAX_CURT /*current*/, VC921x_FAT_RESISTANCE /*resistance*/); - core921x_sample_slotx_config(VC921x_PPG_SLOT_0, sample_info_handle, VC921x_PPG_TXCH_0, VC921x_FAT_GAIN /*rxgain*/, 0 /*oversample,2^N*/, VC921x_SAMPLE_TIM_100US); - /* ppg1 */ - VC921x_PPG_SLOT_PARAM_CONFIG(sample_info_handle->slot_result[1] /*slot0_ppg*/, VC921x_FAT_RED_MAX_CURT /*current*/, VC921x_FAT_RESISTANCE /*resistance*/); - core921x_sample_slotx_config(VC921x_PPG_SLOT_1, sample_info_handle, VC921x_PPG_TXCH_1, VC921x_FAT_GAIN /*rxgain*/, 0 /*oversample,2^N*/, VC921x_SAMPLE_TIM_100US); - /* ps2 */ - VC921x_PS_SLOT_PARAM_CONFIG(sample_info_handle->slot_result[2] /*slot2_ps*/, VC921x_IN_STORE /*storefifo*/, VC921x_WEAR_PARAM_PS_CURRENT /*current*/, VC921x_WEAR_PARAM_PS_RESISTANCE /*resistance*/); - core921x_sample_slotx_config(VC921x_PPG_SLOT_2, sample_info_handle, VC921x_PPG_TXCH_2, VC921x_WEAR_PARAM_PS_GAIN/*rxgain*/, 0 /*oversample,2^N*/, VC921x_SAMPLE_TIM_100US); - /* bio/temp */ -#if (VC921x_FUNC_ENABLE == VC921x_CFG_WEAR_BIO_EN) - VC921x_BIO_SLOT_PARAM_CONFIG(sample_info_handle->extra_result, VC921x_CFG_ENABLE /*bio_innenable*/, VC921x_CFG_ENABLE /*bio_extenable*/, VC921x_BIO_INFIFO_PPG_SUM /*biofifo_mode*/ ); - core921x_set_bioslot_config(sample_info_handle, drv_info_handle->optimal_cap); -#endif - /* += enable freq2ps irq */ - core921x_set_interrupt_config( VC921x_EN_EVT_FREQ2 | VC921x_EN_EVT_FIFO | VC921x_EN_EVT_OVLD ); - return 0; -} -static int drv_factory_ir_red_mode_init(void) -{ - /* ppg0 */ - VC921x_PPG_SLOT_PARAM_CONFIG(sample_info_handle->slot_result[0] /*slot0_ppg*/, VC921x_FAT_IR_MAX_CURT /*current*/, VC921x_FAT_RESISTANCE /*resistance*/); - core921x_sample_slotx_config(VC921x_PPG_SLOT_0, sample_info_handle, VC921x_PPG_TXCH_2, VC921x_FAT_GAIN /*rxgain*/, 0 /*oversample,2^N*/, VC921x_SAMPLE_TIM_100US); - /* ppg1 */ - VC921x_PPG_SLOT_PARAM_CONFIG(sample_info_handle->slot_result[1] /*slot0_ppg*/, VC921x_FAT_RED_MAX_CURT /*current*/, VC921x_FAT_RESISTANCE /*resistance*/); - core921x_sample_slotx_config(VC921x_PPG_SLOT_1, sample_info_handle, VC921x_PPG_TXCH_1, VC921x_FAT_GAIN /*rxgain*/, 0 /*oversample,2^N*/, VC921x_SAMPLE_TIM_100US); - /* ps2 */ - VC921x_PS_SLOT_PARAM_CONFIG(sample_info_handle->slot_result[2] /*slot2_ps*/, VC921x_IN_STORE /*storefifo*/, VC921x_WEAR_PARAM_PS_CURRENT /*current*/, VC921x_WEAR_PARAM_PS_RESISTANCE /*resistance*/); - core921x_sample_slotx_config(VC921x_PPG_SLOT_2, sample_info_handle, VC921x_PPG_TXCH_2, VC921x_WEAR_PARAM_PS_GAIN/*rxgain*/, 0 /*oversample,2^N*/, VC921x_SAMPLE_TIM_100US); - /* bio/temp */ -#if (VC921x_FUNC_ENABLE == VC921x_CFG_WEAR_BIO_EN) - VC921x_BIO_SLOT_PARAM_CONFIG(sample_info_handle->extra_result, VC921x_CFG_ENABLE /*bio_innenable*/, VC921x_CFG_ENABLE /*bio_extenable*/, VC921x_BIO_INFIFO_PPG_SUM /*biofifo_mode*/ ); - core921x_set_bioslot_config(sample_info_handle, drv_info_handle->optimal_cap); -#endif - VC921x_TMP_SLOT_PARAM_CONFIG(sample_info_handle->extra_result, VC921x_CFG_ENABLE /*tmpslot0_enable*/, VC921x_CFG_ENABLE /*tmpslot1_enable*/, 6 /*tmp_setcur*/); - core921x_set_temperature_config(sample_info_handle); - /* += enable freq2ps irq */ - core921x_set_interrupt_config( VC921x_EN_EVT_FREQ2 | VC921x_EN_EVT_FIFO | VC921x_EN_EVT_OVLD ); - return 0; -} -static int drv_temperature_mode_init(void) -{ - return 0; -} - -static int drv_hrspo2_mode_init(void) -{ - drv_info_handle->ppg_convert_ps=1; - /* ppg0 */ - VC921x_PPG_SLOT_PARAM_CONFIG(sample_info_handle->slot_result[0] /*slot0_ppg*/, VC921x_PPG_CURT /*current*/, VC921x_PPG_RESISTANCE /*resistance*/); - core921x_sample_slotx_config( VC921x_PPG_SLOT_0, sample_info_handle, VC921x_PPG_TXCH_0, VC921x_PPG_GAIN /*rxgain*/, 0 /*oversample,2^N*/, VC921x_SAMPLE_TIM_100US); - /* ppg1 */ - VC921x_PPG_SLOT_PARAM_CONFIG(sample_info_handle->slot_result[1] /*slot0_ppg*/, VC921x_PPG_CURT /*current*/, VC921x_PPG_RESISTANCE /*resistance*/); - core921x_sample_slotx_config( VC921x_PPG_SLOT_1, sample_info_handle, VC921x_PPG_TXCH_1, VC921x_PPG_GAIN /*rxgain*/, 3 /*oversample,2^N*/, VC921x_SAMPLE_TIM_100US); - /* ppg-ps2 */ - VC921x_PPG_SLOT_PARAM_CONFIG(sample_info_handle->slot_result[2] /*slot2_ppg*/, VC921x_PPG_CURT /*current*/, VC921x_PPG_RESISTANCE /*resistance*/); - core921x_sample_slotx_config( VC921x_PPG_SLOT_2, sample_info_handle, VC921x_PPG_TXCH_2, VC921x_PPG_GAIN /*rxgain*/, 3/*oversample,2^N*/, VC921x_SAMPLE_TIM_100US); - return 0; -} - -static void drv_work_init(vcare_ppg_device_t *pdev, int mode, unsigned short int ppg_div, unsigned char ps_div, unsigned char fifo_div, unsigned char drop_div, unsigned char algo_mode) -{ - if( VC921x_DEV_REV_ID==pdev->id1 && VC921x_FDY_VER_ID0==pdev->id2 ) - { - sample_info_handle->ic_type_id = VC921x_DEV_REV_ID; - sample_info_handle->ic_ficv_id = VC921x_FDY_VER_ID0; - } - else - { - VCARE_DBG_ERR("vc921x id error"); - return ; - } - /* set & init param */ - drv_info_handle->work_mode = mode; - drv_info_handle->ppg_div = ppg_div; - drv_info_handle->ps_div = ps_div; - drv_info_handle->fifo_div = fifo_div; - drv_info_handle->drop_div = drop_div; - drv_info_handle->hr_algo_mode = algo_mode; /* 新增传入算法模式,配置不同心率配置 */ - drv_info_handle->ppg_convert_ps=0; - drv_infomation_param_load(); - core921x_write_work_cmd(VC921x_RESET_SOFT_CMD); - core921x_write_work_cmd(VC921x_STOP_WORK_CMD); - core921x_write_work_cmd(VC921x_START_WORK_CMD); - drv921x_nto_version = core921x_check_nto_version_init(); /* 初始化判断1120mpw和0127nto */ - core921x_write_work_cmd(VC921x_RESET_SOFT_CMD); - core921x_write_work_cmd(VC921x_STOP_WORK_CMD); - /* 公共配置初始化 */ - drv_common_register_config( drv_info_handle ); - /* 模式配置初始化 */ - if (sel_mode_ops) - { - if (sel_mode_ops->mode_init) sel_mode_ops->mode_init(); - } - else - { - return; - } - /* 驱动参数初始化*/ - drv_infomation_param_init(pdev); - /* 血样模式配置不同的阈值 */ - core921x_set_threshold_config(drv_info_handle->ppg_max_thval, drv_info_handle->ppg_min_thval); -#if 1 - unsigned char config_debug_reg[32] = {0}; - unsigned char debug_index = 0; - vc921x_read_register(0x40, config_debug_reg, 26); - VCARE_DBG_LOG("[0x40]0x%02x,0x%02x,0x%02x,0x%02x 0x%02x,0x%02x,0x%02x,0x%02x", config_debug_reg[0 + debug_index], config_debug_reg[1 + debug_index], config_debug_reg[2 + debug_index], config_debug_reg[3 + debug_index], - config_debug_reg[4 + debug_index], config_debug_reg[5 + debug_index], config_debug_reg[6 + debug_index], config_debug_reg[7 + debug_index]); - debug_index += 8; - VCARE_DBG_LOG("[0x48]0x%02x,0x%02x,0x%02x,0x%02x 0x%02x,0x%02x,0x%02x,0x%02x", config_debug_reg[0 + debug_index], config_debug_reg[1 + debug_index], config_debug_reg[2 + debug_index], config_debug_reg[3 + debug_index], - config_debug_reg[4 + debug_index], config_debug_reg[5 + debug_index], config_debug_reg[6 + debug_index], config_debug_reg[7 + debug_index]); - debug_index += 8; - VCARE_DBG_LOG("[0x50]0x%02x,0x%02x,0x%02x,0x%02x 0x%02x,0x%02x,0x%02x,0x%02x", config_debug_reg[0 + debug_index], config_debug_reg[1 + debug_index], config_debug_reg[2 + debug_index], config_debug_reg[3 + debug_index], - config_debug_reg[4 + debug_index], config_debug_reg[5 + debug_index], config_debug_reg[6 + debug_index], config_debug_reg[7 + debug_index]); - debug_index += 8; - VCARE_DBG_LOG("[0x58]0x%02x,0x%02x,0x%02x,0x%02x 0x%02x,0x%02x,0x%02x,0x%02x", config_debug_reg[0 + debug_index], config_debug_reg[1 + debug_index], config_debug_reg[2 + debug_index], config_debug_reg[3 + debug_index], - config_debug_reg[4 + debug_index], config_debug_reg[5 + debug_index], config_debug_reg[6 + debug_index], config_debug_reg[7 + debug_index]); -#endif - core921x_write_work_cmd(VC921x_START_WORK_CMD); -} - -/******************************************************************************************************** - *佩戴检测部分代码 - ********************************************************************************************************/ -#if (VC921x_CFG_WEAR_BIO_OLD_EN==VC921x_FUNC_ENABLE) -static int drv_calc_biology_sense( vc921x_wear_info *pwear_info, vc921x_sample_info_t *presult, unsigned short int bioinn_data, unsigned short int bioext_data, unsigned short int ps_data ) -{ - static unsigned int calc_ps = 0; - static int calc_bio_ext=0; - int ret = 0; - /* bio ps 有效判断 */ - if( bioext_data && ps_data ) - { - calc_bio_ext = bioext_data; - calc_ps = ps_data; - } - ret = f_BIOdetect(calc_bio_ext, calc_ps, VC921x_WEAR_PARAM_PSTH); - VCARE_DBG_LOG("__f_TPedge(%d,%d,%d)=%d =>[%d]", calc_bio_ext, calc_ps, VC921x_WEAR_PARAM_PSTH, ret, pwear_info->bio_wear_result); - if ( VC921x_BIO_STA_HOLD == ret) - { - pwear_info->bio_wear_result = VC921x_BIO_STA_HOLD; - pwear_info->algo_wear_status = WEAR_STA_HOLD; /* bio重新佩戴重置心率算法佩戴状态 */ - } - else if ( VC921x_BIO_STA_DROP == ret) - { - pwear_info->bio_wear_result = VC921x_BIO_STA_DROP; - } - return pwear_info->bio_wear_result; -} -#else -static int drv_calc_biology_sense_absolute(vc921x_wear_info *pwear_info, vc921x_sample_info_t *presult, unsigned short int bioinn_data, unsigned short int bioext_data, unsigned short int ps_data) -{ - unsigned short int bio_refence_base = 0; - unsigned char bio_ps_decline = 0; /* 1-单次下降满足,2-连续下降满足 */ - if (presult->extra_result.bioinn_enwork == 0 && presult->extra_result.bioext_enwork ==0 ) - { - return VC921x_BIO_STA_NONE; - } - if( !drv_info_handle->optimal_bio_valid ) - { - return VC921x_BIO_STA_NONE; - } - /* ps 有效判断 */ - if (ps_data) - { - /* 单次下降达到阈值 */ - if (pwear_info->last_ps_data[0] > ps_data && (pwear_info->last_ps_data[0] - ps_data) >= VC921x_WEAR_PARAM_PS_DELTA) - { - bio_ps_decline = 1; - } - /*连续两次供下降达到了阈值的1.5倍,避免刚好遇到两次采样缓慢下降的情况*/ - if ((pwear_info->last_ps_data[1] > pwear_info->last_ps_data[0]) && (pwear_info->last_ps_data[0] > ps_data) && (pwear_info->last_ps_data[1] - ps_data) >= (VC921x_WEAR_PARAM_PS_DELTA * 15 / 10)) - { - bio_ps_decline = 2; - } - /* buffer move */ - pwear_info->last_ps_data[1] = pwear_info->last_ps_data[0]; - pwear_info->last_ps_data[0] = ps_data; - } - /* bio 有效判断 */ - if (bioinn_data && bioext_data) - { - int real_bio_gap = drv_info_handle->optimal_bio_gap+(drv_info_handle->optimal_bio_temp-presult->extra_result.temp0_data)/36.0f*1.735f; - VCARE_DBG_LOG("calc_temp=%f", (drv_info_handle->optimal_bio_temp-presult->extra_result.temp0_data)/36.0f*1.735f ); - bio_refence_base = bioinn_data - real_bio_gap; - VCARE_DBG_LOG("bio_gap=%d(real=%d), bio_base=%d, bio_ext=%d, abs_gap(%d?[%d,%d])", - drv_info_handle->optimal_bio_gap, real_bio_gap, bio_refence_base, - bioext_data, VC_ABS(bioext_data, bio_refence_base), VC921x_WEAR_PARAM_BIO_ABS_DROP, VC921x_WEAR_PARAM_BIO_ABS_HOLD); - presult->extra_result.bioabs_calc = VC_ABS(bioext_data, bio_refence_base); - if (VC_ABS(bioext_data, bio_refence_base) >= VC921x_WEAR_PARAM_BIO_ABS_HOLD) - { - pwear_info->bio_wear_result = VC921x_BIO_STA_HOLD; - pwear_info->algo_wear_status = WEAR_STA_HOLD; /* bio重新佩戴重置心率算法佩戴状态 */ - } - else if ((VC_ABS(bioext_data, bio_refence_base) <= VC921x_WEAR_PARAM_BIO_ABS_DROP) && bio_ps_decline) - { - pwear_info->bio_wear_result = VC921x_BIO_STA_DROP; - } - } - return pwear_info->bio_wear_result; -} -#endif - -static vc921x_wear_change drv_wear_status_identify(vc921x_wear_info *pwear_info, vc921x_sample_info_t *presult) -{ - vc921x_wear_change ret_change = VC921x_WEAR_NO_CHANGE; - int ret_bio_algo = VC921x_BIO_STA_NONE; - /* 根据是否存入fifo对参数进行取值 和 采样次数进行判断 */ - unsigned char data_index = 0; - unsigned char sample_num = 1; - unsigned int ps = 0; - unsigned short int env = 0; - unsigned short int bioinn = 0; - unsigned short int bioext = 0; - unsigned int calc_psthh=VC921x_WEAR_PARAM_PSTH; - - if (presult->slot_result[2].slot_storefifo == 1) - { - sample_num = presult->slot_result[2].ppg_num; - } - if( drv_info_handle->ppg_convert_ps ) - { - sample_num=1; - } - for (data_index = 0; data_index < sample_num; data_index++) - { - if (presult->slot_result[2].slot_storefifo == 1) - { - ps = VC921x_GET_SLOT_PS_DATA(presult, data_index ); - } - else - { - ps = presult->slot_result[2].u.ps_data << 8; - } - if (presult->extra_result.biofifo_mode == VC921x_BIO_NOFIFO_PS_SGL) - { - bioinn = presult->extra_result.bioinn_data; - bioext = presult->extra_result.bioext_data; - } - else - { - bioinn = presult->extra_result.bioinn_buffer[data_index]; - bioext = presult->extra_result.bioext_buffer[data_index]; - } - env = presult->slot_result[2].env_data; -#if (VC921x_FUNC_DISABLE == VC921x_CFG_WEAR_BIO_EN) - ret_bio_algo = VC921x_BIO_STA_NONE; -#else - if( drv_info_handle->ppg_convert_ps ) - { - ret_bio_algo = VC921x_BIO_STA_NONE; - } - else - { - #if (VC921x_CFG_WEAR_BIO_OLD_EN==VC921x_FUNC_ENABLE) - ret_bio_algo = drv_calc_biology_sense( pwear_info, presult, bioinn, bioext, ps ); - #else - ret_bio_algo = drv_calc_biology_sense_absolute(pwear_info, presult, bioinn, bioext, ps); - #endif - } -#endif - VCARE_DBG_LOG("status[%d] ps=%d,env=%d,bio_inn ext=(%d,%d)>bioret=%d", pwear_info->wear_status, ps, env, bioinn, bioext, ret_bio_algo); - VCARE_DBG_LOG("extern heart_algo_ret=%d,gsnesor_axis_ret=%d", pwear_info->algo_wear_status, pwear_info->acce_wear_status); -#if (VC921x_FUNC_DISABLE == VC921x_CFG_WEAR_ALG_EN) - pwear_info->algo_wear_status = WEAR_STA_HOLD; -#endif -#if (VC921x_FUNC_DISABLE == VC921x_CFG_WEAR_ACC_EN) - pwear_info->acce_wear_status = WEAR_STA_HOLD; -#endif - if( drv_info_handle->ppg_convert_ps ) - { - calc_psthh=vc921x_calc_ps_reflect_thh( presult->slot_result[2].slot_current, presult->slot_result[2].slot_resistance, presult->adc_resolution ); - VCARE_DBG_LOG("PS,fix(%d-%d),dyn(%d-%d)", ps, VC921x_WEAR_PARAM_PSTH, \ - VC921x_GET_SLOT_SAMPLE_DATA(presult, 2, presult->slot_result[2].ppg_num-1 ) ,calc_psthh ); - ps=VC921x_GET_SLOT_SAMPLE_DATA(presult, 2, presult->slot_result[2].ppg_num-1 ); - } - switch (pwear_info->wear_status) - { - case WEAR_STA_DROP: - if ((ps >= calc_psthh) && (env <= VC921x_WEAR_PARAM_ENVMIN) && (VC921x_BIO_STA_NONE == ret_bio_algo || VC921x_BIO_STA_HOLD == ret_bio_algo) && - (WEAR_STA_HOLD == pwear_info->algo_wear_status) && (WEAR_STA_HOLD == pwear_info->acce_wear_status)) - { - VCARE_DBG_LOG("drop->hold_cnt=%d", pwear_info->hold_cnt); - if (--pwear_info->hold_cnt <= 0) - { - pwear_info->hold_cnt = VC921x_CFG_WEAR_HOLD_CNT; - pwear_info->drop_cnt = VC921x_CFG_WEAR_DROP_CNT; - pwear_info->wear_status = WEAR_STA_HOLD; - ret_change = VC921x_DROP_TO_HOLD; - goto CHANGE_RETURN; - } - } - else - { - pwear_info->hold_cnt = VC921x_CFG_WEAR_HOLD_CNT; - } - break; - case WEAR_STA_HOLD: - if ((ps < calc_psthh) || (env > VC921x_WEAR_PARAM_ENVMAX) || (VC921x_BIO_STA_DROP == ret_bio_algo) || (WEAR_STA_DROP == pwear_info->algo_wear_status)) - { - if ((WEAR_STA_DROP == pwear_info->algo_wear_status) || (VC921x_BIO_STA_DROP == ret_bio_algo)) - { - pwear_info->drop_cnt = 1; - } - VCARE_DBG_LOG("hold->drop_cnt=%d", pwear_info->drop_cnt); - if (--pwear_info->drop_cnt <= 0) - { - pwear_info->hold_cnt = VC921x_CFG_WEAR_HOLD_CNT; - pwear_info->drop_cnt = VC921x_CFG_WEAR_DROP_CNT; - pwear_info->wear_status = WEAR_STA_DROP; - ret_change = VC921x_HOLD_TO_DROP; - goto CHANGE_RETURN; - } - } - else - { - pwear_info->drop_cnt = VC921x_CFG_WEAR_DROP_CNT; - } - break; - default: - break; - } - } -CHANGE_RETURN: - return ret_change; -} - -static int drv_read_wear_sample_data(vc921x_sample_info_t *pwear_result_info) -{ - drv_read_sample_param(pwear_result_info); - drv_read_fifo_data(pwear_result_info); - if( !clk_info_handle->clk_calc_status ) - { - pwear_result_info->slot_result[0].ppg_num=0;/* clear ppg_data number, the clock_frequency wait calibration */ - pwear_result_info->slot_result[1].ppg_num=0; - } - return 0; -} - -static wear_status drv_get_wear_status(vcare_ppg_device_t *pdev) -{ - wear_status calc_status = wear_info_handle->last_status; - vc921x_wear_change wear_change = VC921x_WEAR_NO_CHANGE; - vc921x_sample_info_t *result_info_ptr = pdev->result; -#if (VC921x_CFG_WEAR_DETECTION == VC921x_FUNC_DISABLE) - return WEAR_STA_HOLD; -#endif - drv_read_event_status(drv_info_handle); - drv_read_wear_sample_data(result_info_ptr); - VCARE_DBG_LOG("fifo_read_data_valid=%d", drv_info_handle->fifo_read_data_valid); - /* 数据读取及处理 */ - if ( drv_info_handle->fifo_read_data_valid ) - { - wear_change = drv_wear_status_identify(wear_info_handle, result_info_ptr); - if (VC921x_DROP_TO_HOLD == wear_change) - { - calc_status = WEAR_STA_HOLD; - wear_info_handle->wear_status = calc_status; - wear_info_handle->last_status = calc_status; - pdev->wear = calc_status; - drv_calibration_clk_clear(); - drv_work_init(pdev, drv_info_handle->work_mode, drv_info_handle->ppg_div, drv_info_handle->ps_div, drv_info_handle->fifo_div, drv_info_handle->drop_div, drv_info_handle->hr_algo_mode ); - } - else if (VC921x_HOLD_TO_DROP == wear_change) - { - calc_status = WEAR_STA_DROP; - wear_info_handle->wear_status = calc_status; - wear_info_handle->last_status = calc_status; - pdev->wear = calc_status; - /* 必须重新初始化,重置windex,否则摘下的瞬间,会出现windex错误偏移,导致数据解析出错 */ - drv_work_init(pdev, drv_info_handle->work_mode, drv_info_handle->ppg_div, drv_info_handle->ps_div, drv_info_handle->fifo_div, drv_info_handle->drop_div, drv_info_handle->hr_algo_mode); - result_info_ptr->wear_drop_flag = 1; /* 用于发送摘下时原始数据标志 */ - } - } - return calc_status; -} - -/******************************************************************************************************** - * 自动化调整部分代码 - ********************************************************************************************************/ -static int drv_adjust_overload_max_current(vc921x_sample_info_t *psample_result_info, unsigned char overload, int event) -{ - int ret = 0; - unsigned char slot_i = 0; - vc921x_adjust_info *padjust_info = NULL; - unsigned char ovload_mark[3] = {overload & VC921x_STATUS_CH0_OVERLOAD, overload & VC921x_STATUS_CH1_OVERLOAD, overload & VC921x_STATUS_CH2_OVERLOAD}; - for (slot_i = 0; slot_i < 3; slot_i++) - { - padjust_info = adjust_info_handle[slot_i]; - if (ovload_mark[slot_i]) - { - VCARE_DBG_LOG("ovload_mark[%d] now_cur=%d", slot_i, padjust_info->current); - if (padjust_info->current != 0) - { - padjust_info->current--; - padjust_info->max_current = padjust_info->current; - padjust_info->const_max_current = padjust_info->max_current; - /* set adjust mark & adjust param */ - core921x_set_ppgslot_current((VC921x_PPG_SLOT_I)slot_i, padjust_info->current); - } - else - { - ret = -1; - } - } - } - return ret; -} -static int drv_adjust_slot_current_res(vc921x_adjust_info *padjust_info, unsigned char slot_index, unsigned char thh_res_level, unsigned char thh_current) -{ - unsigned char allow_oversample = 0; - unsigned char old_res_level = padjust_info->res_level; - unsigned char old_current = padjust_info->current; - unsigned short int old_current_step = padjust_info->adj_param.current_step; - VCARE_DBG_LOG("ADF_SLOT[%d]-dir(%d)-I_R thh[%d,%d] I_R now(%d,%d)", slot_index, padjust_info->adj_param.direction, thh_res_level, thh_current, old_res_level, old_current); - if (padjust_info->current == thh_current) - { - if (padjust_info->res_level == thh_res_level) - { - VCARE_DBG_ERR("RESLVL-OFFSET-LOW IS MAX/MIN--[%d]>=[%d]", old_res_level, thh_res_level); - return -1; - } - else - { - if (padjust_info->adj_param.direction == VC921x_ADJUST_DIR_UP) - { - padjust_info->res_level = (old_res_level >= thh_res_level) ? (thh_res_level) : (old_res_level + 1); - } - else - { - padjust_info->res_level = (old_res_level <= thh_res_level) ? (thh_res_level) : (old_res_level - 1); - } - /* 20241030.电阻降到默认+4以下时,限制最大电流到约0x65,下调故当前电流置为最小 */ - if( drv_info_handle->work_mode!=WORK_MODE_FACTORY0 && drv_info_handle->work_mode!=WORK_MODE_FACTORY1 && padjust_info->res_level < VC921x_PPG_RESISTANCE+4 ) - { - padjust_info->max_current = 0x65; - padjust_info->current = (padjust_info->adj_param.direction == VC921x_ADJUST_DIR_UP)? padjust_info->max_current: padjust_info->const_min_current; - } - else if( drv_info_handle->work_mode!=WORK_MODE_FACTORY0 && drv_info_handle->work_mode!=WORK_MODE_FACTORY1 && padjust_info->res_level >= VC921x_PPG_RESISTANCE+4 ) - { - padjust_info->max_current = padjust_info->const_max_current; - padjust_info->current = (padjust_info->adj_param.direction == VC921x_ADJUST_DIR_UP)? padjust_info->max_current: padjust_info->const_min_current; - } - } - } - else - { - /* calc step */ - if (padjust_info->adj_param.direction_last == VC921x_ADJUST_DIR_NONE) - { - old_current_step *= 16; - } - else if (padjust_info->adj_param.direction_last == padjust_info->adj_param.direction) - { - old_current_step = (old_current_step == 1 || old_current_step == 2) ? ((old_current_step + 1) * 16) : (old_current_step * VC921x_ADJ_I_INCREASE); /* 同向加大步长,但是在1和2的时候,1.4倍无法使整型增长,就直接+1 */ - } - else - { - old_current_step = old_current_step * VC921x_ADJ_I_DECREASE; - } - padjust_info->adj_param.current_step = old_current_step >> 4; - padjust_info->adj_param.current_step = (padjust_info->adj_param.current_step <= VC921x_ADJ_I_STEP_MIN) ? VC921x_ADJ_I_STEP_MIN : padjust_info->adj_param.current_step; - padjust_info->adj_param.current_step = (padjust_info->adj_param.current_step >= VC921x_ADJ_I_STEP_MAX) ? VC921x_ADJ_I_STEP_MAX : padjust_info->adj_param.current_step; - /* adjust current */ - if (VC921x_ADJUST_DIR_UP == padjust_info->adj_param.direction) - { - padjust_info->current = ((old_current + padjust_info->adj_param.current_step) > thh_current) ? thh_current : (old_current + padjust_info->adj_param.current_step); - } - else if (VC921x_ADJUST_DIR_DOWN == padjust_info->adj_param.direction) - { - padjust_info->current = (old_current < padjust_info->adj_param.current_step) ? thh_current : old_current - padjust_info->adj_param.current_step; - } - padjust_info->adj_param.direction_last = padjust_info->adj_param.direction; - } - VCARE_DBG_LOG("index=%d,res_level=%d,current=%d,step=%d", slot_index, padjust_info->res_level, padjust_info->current, padjust_info->adj_param.current_step); - if (WORK_MODE_HR == drv_info_handle->work_mode) /* 暂定得是只有心率模式下支持修改过采配置 */ - { - allow_oversample = 0; - } - core921x_set_ppgslot_resistance((VC921x_PPG_SLOT_I)slot_index, padjust_info->res_level, allow_oversample ); - core921x_set_ppgslot_current((VC921x_PPG_SLOT_I)slot_index, padjust_info->current); - return 0; -} - -static int drv_adjust_slot_ppg_overflow(vc921x_sample_info_t *psample_result_info, int event) -{ - unsigned char slot_i = 0; - unsigned int over_ppgdata = 0; - vc921x_adjust_info *padjust_info = NULL; - vc921x_sample_slot_t *pslot_ret = NULL; - for (slot_i = 0; slot_i < 3; slot_i++) - { - padjust_info = adjust_info_handle[slot_i]; - pslot_ret = &psample_result_info->slot_result[slot_i]; - over_ppgdata = pslot_ret->u.pre_data; - if (1 == pslot_ret->slot_enwork) - { - VCARE_DBG_LOG("ppg_overflow(%d)=4bit[%d]", over_ppgdata, VC921x_PPG_CONV_BIT4(over_ppgdata) ); - if (VC921x_PPG_CONV_BIT4(over_ppgdata) > drv_info_handle->ppg_max_thval) - { - padjust_info->adj_param.direction = VC921x_ADJUST_DIR_DOWN; - drv_adjust_slot_current_res(padjust_info, slot_i, padjust_info->const_min_res_level, padjust_info->const_min_current); - } - else if (VC921x_PPG_CONV_BIT4(over_ppgdata) < drv_info_handle->ppg_min_thval) - { - padjust_info->adj_param.direction = VC921x_ADJUST_DIR_UP; - drv_adjust_slot_current_res(padjust_info, slot_i, padjust_info->max_res_level, padjust_info->max_current); - } - else - { - padjust_info->adj_param.direction = VC921x_ADJUST_DIR_NONE; - padjust_info->adj_param.direction_last = VC921x_ADJUST_DIR_NONE; - VCARE_DBG_LOG("slot[%d] in the range,clear slot adjustment direction", slot_i); - } - } - } - return 0; -} - -static int drv_auto_adjust_slot_config(int event, unsigned char ov_status) -{ - if( wear_info_handle->wear_status==WEAR_STA_DROP ) - { - return -1; - } - if ((event&VC921x_EVENT_INTOVLOAD)||VC921x_CFG_IRQ_BY_TIMER_EN) - { - drv_adjust_overload_max_current(sample_info_handle, ov_status, event); - } - if((event&VC921x_EVENT_INTPPG_STA)||VC921x_CFG_IRQ_BY_TIMER_EN) - { - drv_adjust_slot_ppg_overflow(sample_info_handle, event); - } - else - { - /* clear adjust_param */ - adjust_info_handle[0]->adj_param.direction = VC921x_ADJUST_DIR_NONE; - adjust_info_handle[0]->adj_param.direction_last = VC921x_ADJUST_DIR_NONE; - adjust_info_handle[1]->adj_param.direction = VC921x_ADJUST_DIR_NONE; - adjust_info_handle[1]->adj_param.direction_last = VC921x_ADJUST_DIR_NONE; - adjust_info_handle[2]->adj_param.direction = VC921x_ADJUST_DIR_NONE; - adjust_info_handle[2]->adj_param.direction_last = VC921x_ADJUST_DIR_NONE; - } - return 0; -} - -/******************************************************************************************************** - * 时钟校准部分 - *******************************************************************************************************/ -static int drv_calibration_oscclk_frequency(vc921x_clk_info *pclk_info) -{ - unsigned char count_vaild = 1; - unsigned char i = 0; - unsigned int clock_tick[2] = {0}; - unsigned short int osc_tick[2] = {0}; - unsigned short osc_frequency[2]; - - clock_tick[0] = vc921x_get_cputimer_tick(); - core921x_read_rcosc_tick(&osc_tick[0], &osc_tick[1]); - clock_tick[1] = vc921x_get_cputimer_tick(); - if ((osc_tick[0] > osc_tick[1]) || (clock_tick[0] > clock_tick[1])) - { - pclk_info->count_index = 0; - VCARE_DBG_ERR("osc/clk ticks is error\n"); - return 1; - } - pclk_info->osc_count[pclk_info->count_index * 2] = osc_tick[0]; - pclk_info->osc_count[pclk_info->count_index * 2 + 1] = osc_tick[1]; - pclk_info->clk_count[pclk_info->count_index * 2] = clock_tick[0]; - pclk_info->clk_count[pclk_info->count_index * 2 + 1] = clock_tick[1]; - pclk_info->count_index++; - if (pclk_info->count_index >= 3) - { - pclk_info->count_index = 0; - for (i = 0; i < 2; i++) - { - count_vaild = count_vaild && (VC_ABS(VC_ABS_MAX(pclk_info->clk_count[2 * i + 2], pclk_info->clk_count[2 * i], VC921x_CFG_MCU_TICK_MAX), VC_ABS_MAX(pclk_info->clk_count[2 * i + 3], pclk_info->clk_count[2 * i + 1], VC921x_CFG_MCU_TICK_MAX)) < VC921x_CFG_CLK_CALC_DEVIATION); - count_vaild = count_vaild && (VC_ABS(VC_ABS_MAX(pclk_info->osc_count[2 * i + 2], pclk_info->osc_count[2 * i], 0xffff), VC_ABS_MAX(pclk_info->osc_count[2 * i + 3], pclk_info->osc_count[2 * i + 1], 0xffff)) < VC921x_CFG_CLK_CALC_DEVIATION); - count_vaild = count_vaild && (!(pclk_info->clk_count[2 * i + 2] == pclk_info->clk_count[2 * i])); /* avoid divisor==0, diffCountIsOk set false */ - count_vaild = count_vaild && (!(pclk_info->osc_count[2 * i + 2] == pclk_info->osc_count[2 * i])); /* avoid divisor==0, diffCountIsOk set false */ - } - if (count_vaild) - { - for (i = 0; i < 2; i++) - { - osc_frequency[i] = VC_ABS_MAX((unsigned int)pclk_info->osc_count[2 * i + 2], pclk_info->osc_count[2 * i], 0xffff) * VC921x_CFG_MCU_TICK_FREQUENCY / VC_ABS_MAX((unsigned int)pclk_info->clk_count[2 * i + 2], pclk_info->clk_count[2 * i], VC921x_CFG_MCU_TICK_MAX); - VCARE_DBG_LOG("f20kOsc[20K_%d]=(%d)", i, osc_frequency[i]); - } - if (VC_ABS(osc_frequency[0], osc_frequency[1]) <= 20) - { - pclk_info->rcosc_frequency = (osc_frequency[0] + osc_frequency[1]) / 2; - pclk_info->clk_calc_freq_status = 1; - } - return 0; - } - } - return 2; -} - -static int drv_auto_calibration_oscclk(vc921x_clk_info *pclk_info) -{ - /* calibration the osc frequency by method of bisection */ - if (pclk_info->clk_calc_freq_status && pclk_info->rcosc_frequency) - { - pclk_info->clk_calc_freq_status = 0; - if (pclk_info->rcosc_frequency >= VC921x_FREQUENCY_MAX) - { - if( drv921x_nto_version ) - { - rcosc_min = (rcosc_mid <= 0xfe) ? rcosc_mid + 1 : 0xff; - } - else - { - rcosc_min = (rcosc_mid <= 0x7e) ? rcosc_mid + 1 : 0x7f; - } - } - else if (pclk_info->rcosc_frequency <= VC921x_FREQUENCY_MIN) - { - rcosc_max = (rcosc_mid >= 1) ? (rcosc_mid - 1) : 0; - } - else - { - pclk_info->clk_calc_status = 1; /* calibration finished mark */ - pclk_info->osc_gap_cnt = 0; - rcosc_max = rcosc_mid + 2; /* 修正成功后,扩张一个调整点的范围,以便温漂时调整余量 */ - rcosc_min = rcosc_mid - 2; - } - rcosc_mid = (rcosc_max + rcosc_min) / 2; - VCARE_DBG_LOG("min,max[%d,%d]~min(%d)", rcosc_min, rcosc_max, rcosc_mid); - core921x_set_rcosc_frequency(rcosc_mid); - pclk_info->rcosc_calibration = rcosc_mid; - /* 如果发生温漂,修改收缩的上下限,进行缓慢修正时钟 */ - if ((pclk_info->rcosc_frequency <= VC921x_FREQUENCY_MIN) && VC_ABS(rcosc_max, rcosc_min) <= 2) - { - rcosc_min -= 2; - VCARE_DBG_LOG("!!!temp->min,max[%d,%d]~min(%d)", rcosc_min, rcosc_max, rcosc_mid); - } - if ((pclk_info->rcosc_frequency >= VC921x_FREQUENCY_MAX) && VC_ABS(rcosc_max, rcosc_min) <= 2) - { - rcosc_max += 2; - VCARE_DBG_LOG("!!!temp->min,max[%d,%d]~min(%d)", rcosc_min, rcosc_max, rcosc_mid); - } - } - return 0; -} - -static int drv_calibration_oscclk_config(vcare_ppg_device_t *pdev) -{ - vc921x_clk_info *pclk_info = clk_info_handle; -#if 1 - if (pclk_info->clk_calc_status) -#else - if (pclk_info->clk_calc_status && pclk_info->osc_gap_cnt <= VC921x_CFG_CLK_CALC_GAPTIME) -#endif - { - pclk_info->osc_gap_cnt++; - return 0; - } - /* calibration clk running, enter fast irq config */ - drv_calibration_entry_fast_irq( ); - drv_calibration_oscclk_frequency(pclk_info); - drv_auto_calibration_oscclk(pclk_info); - if( pclk_info->clk_calc_status ) /* calibration clk finished, exit fast irq config */ - { - startup_inntemperature = sample_info_handle->extra_result.temp0_data; - drv_calibration_exit_fast_irq( ); - } - return 1; -} -static void drv_calibration_clk_clear(void) -{ - static unsigned char is_first_run = 1; - vc921x_clk_info *pclk_info = clk_info_handle; - pclk_info->last_check_ticks = 0; - pclk_info->osc_gap_cnt = 0; - pclk_info->count_index = 0; - pclk_info->clk_calc_freq_status = 0; - /* 校验频率温度清空 */ - check_cpu_tick[0]=0,check_cpu_tick[1]=0; - check_dev_tick[0]=0,check_dev_tick[1]=0; - if (is_first_run == 1) - { - is_first_run = 0; - if( drv921x_nto_version ) - { - rcosc_max = 255,rcosc_min = 0,rcosc_mid = 127; - } - else - { - rcosc_max = 127,rcosc_min = 0,rcosc_mid = 63; - } - pclk_info->clk_calc_status = 0; - core921x_set_rcosc_frequency(rcosc_mid); - } - else - { - if( pclk_info->rcosc_calibration==0 ) - { - if( drv921x_nto_version ) - { - rcosc_max = 255,rcosc_min = 0,rcosc_mid = 127; - } - else - { - rcosc_max = 127,rcosc_min = 0,rcosc_mid = 63; - } - pclk_info->clk_calc_status = 0; - pclk_info->rcosc_calibration=rcosc_mid; - } - core921x_set_rcosc_frequency(pclk_info->rcosc_calibration); - } -} - -static int drv_check_running_gaptime(void) -{ -#if VC921x_CFG_CLK_CLAC_IRQGAP_EN - int ret = 0; - unsigned short int curr_ticks = 0; - unsigned short int ticks_chk, ticks_gap = 0; - unsigned short int ticks1 = 0, ticks2 = 0; - unsigned char times_gap = 0; - core921x_read_rcosc_tick(&ticks1, &ticks2); - times_gap = (1000 * drv_info_handle->ppg_div / VC921x_DEFAULT_FREQ) * VC921x_IRQ_GAP_RATIO; - ticks_chk = (ticks2 >= ticks1) ? (ticks2 - ticks1) : (0xffff + ticks2 - ticks1); - if (ticks_chk <= 10) - { - curr_ticks = ticks1; - } - else - { /* IC问题,可能出现其中一个tick低位出现异常,如果出现异常则取另外一共tick作为运算准 */ - curr_ticks = (ticks2&0xff)?(ticks2):(ticks1); - VCARE_DBG_ERR("read check tick failed(%d,%d)", ticks1, ticks2); - } - // ticks_gap = 2000; - if (0 != curr_ticks && 0 != clk_info_handle->last_check_ticks) - { - ticks_gap = (curr_ticks >= clk_info_handle->last_check_ticks) ? (curr_ticks - clk_info_handle->last_check_ticks) : (0xffff + curr_ticks - clk_info_handle->last_check_ticks); - } - if (ticks_gap <= 20 * times_gap) /* 20k,1ms~20ticks */ - { - VCARE_DBG_ERR("last(%d)now(%d)gap[%d<%d]", clk_info_handle->last_check_ticks, curr_ticks, ticks_gap, 20 * times_gap); - ret = -1; - } - clk_info_handle->last_check_ticks = curr_ticks; - return ret; -#else - return 0; -#endif -} - -static void drv_fifo_error_softreset( void ) -{ - static unsigned char last_add_mark=0; - unsigned char save_config[32]={0}; - /* 软复位,清空所有数据,避免传入算法或者引起其他异常 */ - drv_sample_result_memroy_finished( sample_info_handle ); - vc921x_read_register( 0x40, save_config, sizeof(save_config) ); - core921x_write_work_cmd( VC921x_STOP_WORK_CMD ); - core921x_write_work_cmd( VC921x_RESET_SOFT_CMD ); - drv_info_handle->read_fifo_address = 0; - vc921x_write_register( 0x40, save_config, sizeof(save_config) ); - core921x_write_work_cmd( VC921x_START_WORK_CMD ); - if( last_add_mark==0 ) - { - last_add_mark=1; - core921x_set_rcosc_frequency( clk_info_handle->rcosc_calibration-1 ); - } - else - { - last_add_mark=0; - core921x_set_rcosc_frequency( clk_info_handle->rcosc_calibration+1 ); - } - #if 1 - unsigned char config_debug_reg[32] = {0}; - unsigned char debug_index = 0; - vc921x_read_register(0x40, config_debug_reg, 32); - VCARE_DBG_LOG("[0x40]0x%02x,0x%02x,0x%02x,0x%02x 0x%02x,0x%02x,0x%02x,0x%02x", config_debug_reg[0 + debug_index], config_debug_reg[1 + debug_index], config_debug_reg[2 + debug_index], config_debug_reg[3 + debug_index], - config_debug_reg[4 + debug_index], config_debug_reg[5 + debug_index], config_debug_reg[6 + debug_index], config_debug_reg[7 + debug_index]); - debug_index += 8; - VCARE_DBG_LOG("[0x48]0x%02x,0x%02x,0x%02x,0x%02x 0x%02x,0x%02x,0x%02x,0x%02x", config_debug_reg[0 + debug_index], config_debug_reg[1 + debug_index], config_debug_reg[2 + debug_index], config_debug_reg[3 + debug_index], - config_debug_reg[4 + debug_index], config_debug_reg[5 + debug_index], config_debug_reg[6 + debug_index], config_debug_reg[7 + debug_index]); - debug_index += 8; - VCARE_DBG_LOG("[0x50]0x%02x,0x%02x,0x%02x,0x%02x 0x%02x,0x%02x,0x%02x,0x%02x", config_debug_reg[0 + debug_index], config_debug_reg[1 + debug_index], config_debug_reg[2 + debug_index], config_debug_reg[3 + debug_index], - config_debug_reg[4 + debug_index], config_debug_reg[5 + debug_index], config_debug_reg[6 + debug_index], config_debug_reg[7 + debug_index]); - debug_index += 8; - VCARE_DBG_LOG("[0x58]0x%02x,0x%02x,0x%02x,0x%02x 0x%02x,0x%02x,0x%02x,0x%02x", config_debug_reg[0 + debug_index], config_debug_reg[1 + debug_index], config_debug_reg[2 + debug_index], config_debug_reg[3 + debug_index], - config_debug_reg[4 + debug_index], config_debug_reg[5 + debug_index], config_debug_reg[6 + debug_index], config_debug_reg[7 + debug_index]); - #endif -} -/******************************************************************************************************** - *数据读取部分 - ********************************************************************************************************/ -static int drv_read_fifo_data(vc921x_sample_info_t *psample_result) -{ - int read_fifo_ret = 0; - vc921x_sample_info_t *sample_result_ptr = psample_result; - unsigned char bio_fifo_error_cnt=0; - unsigned char bio_fifo_error_flg=0; - unsigned char ps_fifo_error_flg=0; - if (!sample_result_ptr) - { - return -1; - } - /* fifo中断 */ - if (0 != drv_info_handle->fifo_read_finished_sync) - { - return 0; - } - drv_info_handle->fifo_read_finished_sync = 1; - read_fifo_ret = core921x_read_fifo_data(sample_result_ptr, &drv_info_handle->read_fifo_address, drv_info_handle->write_fifo_address_bak); - VCARE_DBG_LOG("read_fifo updata read address: %d, write_address:%d, write_address_rel:%d",drv_info_handle->read_fifo_address, drv_info_handle->write_fifo_address_bak, drv_info_handle->write_fifo_address_rel ); - if (read_fifo_ret>=0) - { - drv_info_handle->fifo_read_data_valid = 1; - /* nto版本直接更新read_addr */ - if( drv921x_nto_version ) - { - if( read_fifo_ret==1 ) - { - drv_info_handle->read_fifo_address = drv_info_handle->write_fifo_address_bak; - /* fifo错误,清空fifo数据 */ - VCARE_DBG_LOG("===PS_FIFO_ERROR===") ; - drv_sample_result_memroy_finished( sample_info_handle ); - return read_fifo_ret; - } - } - else - { - if( read_fifo_ret==1 && (drv_info_handle->int_event&VC921x_EN_EVT_FIFO) && !(drv_info_handle->int_event&VC921x_EVENT_INSAMPLE) ) /* 当出现了fifo中断,且并不是fifo数量的倍数时,可以认定为错位,进行纠错处理 */ - { - drv_info_handle->read_fifo_address = drv_info_handle->write_fifo_address_bak; - drv_info_handle->fifo_read_data_valid = 2; - VCARE_DBG_LOG("delay response read_addr updata:%d=write_addr:%d", drv_info_handle->read_fifo_address, drv_info_handle->write_fifo_address_bak); - } - /* 20240119.校验RO_PS与fifo_PS是否异常(如果异常则可以判断为fifo异常错位:1.过度延后导致的fifo覆盖反转,2.ICfifo数据异常丢失) - * 20240229.添加bio的全部出现0xff的情况,判断为fifo异常错位 - */ - if( sample_result_ptr->extra_result.bioext_enwork && sample_result_ptr->extra_result.bio_fifo_num!=0 ) - { - for( bio_fifo_error_cnt=0; bio_fifo_error_cntextra_result.bio_fifo_num; bio_fifo_error_cnt++ ) - { - VCARE_DBG_LOG("bio=%x ~ 0xff",sample_result_ptr->extra_result.bioext_buffer[bio_fifo_error_cnt] ); - if( (sample_result_ptr->extra_result.bioext_buffer[bio_fifo_error_cnt]&0xff) != 0xff ) - { - bio_fifo_error_cnt=0; - break; - } - } - VCARE_DBG_LOG("bio_num=%d,%d",sample_result_ptr->extra_result.bio_fifo_num, bio_fifo_error_cnt); - if( sample_result_ptr->extra_result.bio_fifo_num==bio_fifo_error_cnt ) - { - bio_fifo_error_flg=1; - } - } - if( sample_result_ptr->slot_result[2].slot_enwork==2 && sample_result_ptr->slot_result[2].ppg_num!=0 ) - { - VCARE_DBG_LOG("last_ps=%x ~ %x",VC921x_GET_SLOT_PS_DATA(sample_result_ptr, sample_result_ptr->slot_result[2].ppg_num-1), sample_result_ptr->slot_result[2].u.ps_data ); - if( VC921x_GET_SLOT_PS_DATA(sample_result_ptr, sample_result_ptr->slot_result[2].ppg_num-1)>>8 != sample_result_ptr->slot_result[2].u.ps_data ) - { - ps_fifo_error_flg=1; - } - } - /* bio_fifo_error || ps_fifo_error */ - if( bio_fifo_error_flg || ps_fifo_error_flg ) - { - VCARE_DBG_LOG("===PS_FIFO_ERROR===") ; - drv_fifo_error_softreset(); - return read_fifo_ret; - } - } - /* 20241018.在insample的时候,如果出现中断延时处理/定时器,获取到的RO_bio的值可能还未完全采样计算完成,需要从fifo中更新数据 */ - if( (VC921x_CFG_IRQ_BY_TIMER_EN||drv_info_handle->int_event&VC921x_EVENT_INSAMPLE||0==drv_info_handle->int_event) && (VC921x_BIO_NOFIFO_PS_SGL!=sample_result_ptr->extra_result.biofifo_mode) ) - { - if( sample_result_ptr->extra_result.bioext_enwork && - sample_result_ptr->extra_result.bioext_data != sample_result_ptr->extra_result.bioext_buffer[sample_result_ptr->extra_result.bio_fifo_num-1] ) - { - sample_result_ptr->extra_result.bioext_data = sample_result_ptr->extra_result.bioext_buffer[sample_result_ptr->extra_result.bio_fifo_num-1]; - VCARE_DBG_ERR("INSAMPLE_ERR_EXTBIO-modify=%d",sample_result_ptr->extra_result.bioext_data); - } - if( sample_result_ptr->extra_result.bioinn_enwork && - sample_result_ptr->extra_result.bioinn_data != sample_result_ptr->extra_result.bioinn_buffer[sample_result_ptr->extra_result.bio_fifo_num-1]) - { - sample_result_ptr->extra_result.bioinn_data = sample_result_ptr->extra_result.bioinn_buffer[sample_result_ptr->extra_result.bio_fifo_num-1]; - VCARE_DBG_ERR("INSAMPLE_ERR_INNBIO-modify=%d",sample_result_ptr->extra_result.bioinn_data); - } - } - } - else - { - VCARE_DBG_ERR("read_fifo_ret error(%d)", read_fifo_ret); - return read_fifo_ret; - } - return 0; -} - -static int drv_read_sample_param(vc921x_sample_info_t *psample_ret) -{ - unsigned char slot_i = 0; - unsigned char slot_current = 0, slot_res_lvl = 0; - if (0 == drv_info_handle->param_read_finished_sync) - { - core921x_read_output(psample_ret); - VCARE_DBG_LOG("env(0x)=%x-%x-%x(%d,%d,%d)", psample_ret->slot_result[0].env_data, - psample_ret->slot_result[1].env_data, - psample_ret->slot_result[2].env_data, - VC921x_ENV_CONVERT(psample_ret->slot_result[0].env_data), - VC921x_ENV_CONVERT(psample_ret->slot_result[1].env_data), - VC921x_ENV_CONVERT(psample_ret->slot_result[2].env_data)); - VCARE_DBG_LOG("ppg/ps_data=%d-%d-%d", psample_ret->slot_result[0].u.ps_data, psample_ret->slot_result[1].u.ps_data, psample_ret->slot_result[2].u.ps_data); - VCARE_DBG_LOG("bio01_data=%d-%d", psample_ret->extra_result.bioinn_data, psample_ret->extra_result.bioext_data); - VCARE_DBG_LOG("temp01_data=%d-%d-ref(%d)", psample_ret->extra_result.temp0_data, psample_ret->extra_result.temp1_data, psample_ret->extra_result.tempref_data); - - psample_ret->slot_result[0].env_data = VC921x_ENV_CONVERT(psample_ret->slot_result[0].env_data); - psample_ret->slot_result[1].env_data = VC921x_ENV_CONVERT(psample_ret->slot_result[1].env_data); - psample_ret->slot_result[2].env_data = VC921x_ENV_CONVERT(psample_ret->slot_result[2].env_data); - for (slot_i = 0; slot_i < 3; slot_i++) - { - core921x_read_slot_current_res((VC921x_PPG_SLOT_I)slot_i, &slot_current, &slot_res_lvl); - psample_ret->slot_result[slot_i].slot_current = slot_current; - psample_ret->slot_result[slot_i].slot_resistance = slot_res_lvl; - adjust_info_handle[slot_i]->current = slot_current; - adjust_info_handle[slot_i]->res_level = slot_res_lvl; - } - drv_info_handle->param_read_finished_sync = 1; - VCARE_DBG_LOG("slot[0]cur%d,res%d ^ slot[1]cur%d,res%d ^ slot[2]cur%d,res%d", - psample_ret->slot_result[0].slot_current, psample_ret->slot_result[0].slot_resistance, - psample_ret->slot_result[1].slot_current, psample_ret->slot_result[1].slot_resistance, - psample_ret->slot_result[2].slot_current, psample_ret->slot_result[2].slot_resistance); - } - return 0; -} - -static int drv_read_event_status(vc921x_drv_info *pdrv_info) -{ - if (0 == pdrv_info->event_read_finished_sync) - { - core921x_read_event_status(&pdrv_info->int_event, &pdrv_info->ov_status, &pdrv_info->write_fifo_address_bak, &pdrv_info->write_fifo_address_rel); - pdrv_info->event_read_finished_sync = 1; - VCARE_DBG_LOG("read_event=[%x], read_status=[%x], read_Windex=[%x]~rel[%x]", pdrv_info->int_event, pdrv_info->ov_status, pdrv_info->write_fifo_address_bak, pdrv_info->write_fifo_address_rel ); - } - return 0; -} - -/******************************************************************************************************** - * 中断事件处理部分调用逻辑 - ********************************************************************************************************/ -static int drv_ppg_mode_handler(const void *ops_self, vcare_ppg_device_t *pdev) -{ - int ret = 0; - vc921x_sample_info_t *sample_result_ptr = pdev->result; - vc921x_mode_ops *self_ptr = (vc921x_mode_ops *)ops_self; - drv_calibration_oscclk_config( pdev ); - if( 1 == clk_info_handle->clk_calc_status ) - { - ret = drv_auto_adjust_slot_config(drv_info_handle->int_event, drv_info_handle->ov_status); - } - if (ret >= 0 && 1 == clk_info_handle->clk_calc_status) - { - drv_read_fifo_data(sample_result_ptr); - } - else - { - VCARE_DBG_ERR("WORK_MODE_[%d] clk_status[%d]", self_ptr->mode, clk_info_handle->clk_calc_status); - } - return ret; -} -static int drv_factory_mode_handler(const void *ops_self, vcare_ppg_device_t *pdev) -{ - int ret = 0; - unsigned short int base =0; - vc921x_sample_info_t *sample_result_ptr = pdev->result; - drv_calibration_oscclk_config( pdev ); - if (drv_info_handle->int_event & VC921x_EVENT_INTOVLOAD) - { - ret = drv_adjust_overload_max_current(sample_result_ptr, drv_info_handle->ov_status, drv_info_handle->int_event); - } - drv_read_fifo_data(sample_result_ptr); - if( 1==clk_info_handle->clk_calc_status ) - { - drv_calc_bioinn_auto_addcap(drv_info_handle->int_event, sample_result_ptr); - } - base = sample_result_ptr->extra_result.bioinn_data - drv_info_handle->optimal_bio_gap; - sample_result_ptr->extra_result.bioabs_calc = VC_ABS( sample_result_ptr->extra_result.bioext_data, base ); - return ret; -} - -/********************************************************************************************************* - * DRV_API 对外功能模块部分 - ********************************************************************************************************/ -int vc921x_drv_init_start_work(void *pdevice, int workmode, unsigned short int ppgdiv, unsigned char psdiv, unsigned char fifodiv, unsigned char dropdiv) -{ - vcare_ppg_device_t *pdev = (vcare_ppg_device_t *)pdevice; - char *drv_ver = NULL; - unsigned char mode_count = 0; - unsigned char mode_index = 0; - vcare_memset(sample_info_handle, 0, sizeof(vc921x_sample_info_t)); - pdev->result = sample_info_handle; /* 采样指针传递 */ - core921x_read_software_version(&drv_ver); - core921x_read_id(&pdev->id1, &pdev->id2); /* 0x24, 0x10 */ - VCARE_DBG_LOG("[%s]devID0-2=0x%02x 0x%02x", drv_ver, pdev->id1, pdev->id2); - mode_count = sizeof(mode_ops) / sizeof(mode_ops[0]); - sel_mode_ops = NULL; - for (mode_index = 0; mode_index < mode_count; mode_index++) - { - if (workmode == mode_ops[mode_index].mode) - { - sel_mode_ops = &mode_ops[mode_index]; - break; - } - } - if (!sel_mode_ops) - { - VCARE_DBG_ERR("work_mode is error(NULL),please code mode"); - return -1; - } - drv_work_init(pdev, workmode, ppgdiv, psdiv, fifodiv, dropdiv, pdev->heart_algo_mode); - return 0; -} -int vc921x_drv_get_hwsw_infomation(char **str_drv_ver, unsigned char *pid1, unsigned char *pid2) -{ - core921x_read_software_version(str_drv_ver); - core921x_read_id(pid1, pid2); - return 0; -} -int vc921x_drv_exit_stop_work(void *pdevice) -{ - wear_info_handle->last_status = WEAR_STA_NONE; - core921x_write_work_cmd(VC921x_RESET_SOFT_CMD); - core921x_write_work_cmd(VC921x_STOP_WORK_CMD); - return 0; -} -int vc921x_drv_software_reset(void *pdevice) -{ - wear_info_handle->last_status = WEAR_STA_NONE; - return core921x_write_work_cmd(VC921x_RESET_SOFT_CMD); -} -int vc921x_drv_wakeup_work(void *pdevice) -{ - return core921x_write_work_cmd(VC921x_START_WORK_CMD); -} -int vc921x_drv_sleep_work(void *pdevice) -{ - wear_info_handle->last_status = WEAR_STA_NONE; - return core921x_write_work_cmd(VC921x_STOP_WORK_CMD); -} -int vc921x_drv_set_algo_wear_status(void *pdevice, int status) -{ - wear_info_handle->algo_wear_status = (status == -1) ? (WEAR_STA_DROP) : (WEAR_STA_HOLD); - return 0; -} -int vc921x_drv_set_acce_wear_status(void *pdevice, int status) -{ - /* 产生运动量,清除心率摘下标志 */ - if (0 == status) - { - wear_info_handle->acce_wear_status = WEAR_STA_DROP; - } - else - { - wear_info_handle->acce_wear_status = WEAR_STA_HOLD; - wear_info_handle->algo_wear_status = WEAR_STA_HOLD; - } - return 0; -} -wear_status vc921x_drv_get_wear_status(void *pdevice) -{ - vcare_ppg_device_t *pdev = (vcare_ppg_device_t *)pdevice; - if (!sel_mode_ops) - { - return WEAR_STA_HOLD; - } - if (pdev->workmode == WORK_MODE_FACTORY0 || pdev->workmode == WORK_MODE_FACTORY1) - { - return WEAR_STA_HOLD; - } - return drv_get_wear_status(pdevice); -} - -void vc921x_drv_get_wear_detail_result( unsigned char *bio_ret, unsigned char *algo_ret, unsigned char *acce_ret ) -{ - *bio_ret = (VC921x_BIO_STA_HOLD==wear_info_handle->bio_wear_result)?1:0; - *algo_ret = (WEAR_STA_HOLD==wear_info_handle->algo_wear_status)?1:0; - *acce_ret = (WEAR_STA_HOLD==wear_info_handle->acce_wear_status)?1:0; -} - -/* irq/timer callback interface. */ -int vc921x_drv_get_result_handler(void *pdevice) -{ - vcare_ppg_device_t *pdev = (vcare_ppg_device_t *)pdevice; - pdev->result = sample_info_handle; - vc921x_sample_info_t *sample_result_ptr = pdev->result; - if (!sample_result_ptr || !sel_mode_ops ) - { - return -2; - } - /* 读取基础采样数据 */ - drv_read_event_status(drv_info_handle); - if( drv_info_handle->int_event==0 ) - { - return -1; - } - if (drv_info_handle->int_event & VC921x_EVENT_CONFLICT) - { - VCARE_DBG_ERR("work_status=%x", drv_info_handle->int_event); - return -1; - } - /* check gap time */ - if (0 != drv_check_running_gaptime()) - { - VCARE_DBG_ERR("running gaptime"); - return -1; - } - drv_read_sample_param(sample_result_ptr); - /* 模式数据处理 */ - if (sel_mode_ops->mode_handler) - { - sel_mode_ops->mode_handler(sel_mode_ops, pdev); - } - return 0; -} - -void vc921x_drv_read_event_infomation_byIRQ(void) -{ - drv_read_event_status(drv_info_handle); -} - -int vc921x_drv_is_fifo_event(void *pdevice) -{ - if( drv_info_handle->fifo_read_data_valid ) - { - return 1; - } - return 0; -} -int vc921x_drv_is_ps_event(void *pdevice) -{ - if (drv_info_handle->int_event & (VC921x_EVENT_INTPS_RDY)) - { - return 1; - } - return 0; -} -int vc921x_drv_is_ppg_event(void *pdevice) -{ - if (drv_info_handle->int_event & (VC921x_EVENT_INTPPG_STA)) - { - return 1; - } - return 0; -} -int vc921x_drv_clear_reset_bio_param(void *pdevice) -{ - drv_infomation_param_reset(); - core921x_set_bioinn_addcap( sample_info_handle, set_cap_mid ); - return 0; -} - -unsigned char vc921x_drv_check_frequency_abnormal( unsigned short dev_tick1, unsigned short dev_tick2, unsigned int cpu_tick1, unsigned int cpu_tick2 ) -{ - static unsigned short calc_freq[2]={0}; - unsigned int cpu_tick_diff=0,dev_tick_diff=0; - float gap_time_diff=0.0f; - if( !clk_info_handle->clk_calc_status ) return 0; - check_cpu_tick[1] = check_cpu_tick[0]; - check_dev_tick[1] = check_dev_tick[0]; - check_cpu_tick[0] = cpu_tick1; - check_dev_tick[0] = dev_tick1; - if( VC_ABS_MAX(dev_tick2,dev_tick1,0xffff)>=20 || VC_ABS_MAX(cpu_tick2, cpu_tick1, VC921x_CFG_MCU_TICK_MAX)>=32 ) - { - check_cpu_tick[0]=0,check_cpu_tick[1]=0; - check_dev_tick[0]=0,check_dev_tick[1]=0; - return 0; - } - if (0 == check_cpu_tick[1]||0 == check_cpu_tick[0]) - { - return 0; - } - if (0 == check_dev_tick[1]||0==check_dev_tick[0]) - { - return 0; - } - cpu_tick_diff = VC_ABS_MAX( check_cpu_tick[0], check_cpu_tick[1], VC921x_CFG_MCU_TICK_MAX ); - dev_tick_diff = VC_ABS_MAX( check_dev_tick[0], check_dev_tick[1], 0xFFFF ); - gap_time_diff = (float)cpu_tick_diff/(float)VC921x_CFG_MCU_TICK_FREQUENCY; - calc_freq[1] = calc_freq[0]; - calc_freq[0] = (float)dev_tick_diff/gap_time_diff; - if( calc_freq[0]&& calc_freq[1] && VC_ABS( calc_freq[0], calc_freq[1] )<=100 ) - { - VCARE_DBG_LOG("check temp freq=[%d][%d](%d,%d)", calc_freq[0],calc_freq[1], cpu_tick_diff, dev_tick_diff ); - if( 20000>=calc_freq[0] && (20000-calc_freq[0])/40 >= 60 ) /* 相较于上电时的频率温升60即返回出错 */ - { - check_cpu_tick[0]=0,check_cpu_tick[1]=0; - check_dev_tick[0]=0,check_dev_tick[1]=0; - return 1; - } - } - return 0; -} -#define CHECK_BUFF_SIZE 20 -int vc921x_drv_read_check_temperature_abnormal( void *pdevice, unsigned char *p_freq_ret, unsigned char *p_temp_ret, unsigned short *pdev_cnt1, unsigned short *pdev_cnt2 ) -{ - static unsigned char fiil_mark=0; - static unsigned char fill_index=0; - static unsigned short check_innbio_buff[CHECK_BUFF_SIZE]={0}; - static unsigned short check_extbio_buff[CHECK_BUFF_SIZE]={0}; - static unsigned short check_tick1_buff[CHECK_BUFF_SIZE]={0}; - static unsigned short check_tick2_buff[CHECK_BUFF_SIZE]={0}; - unsigned int check_clk_tick[2]={0}; - unsigned char i=0; - int check_ret=0; - *p_freq_ret = 0; - *p_temp_ret = 0; - - drv_read_sample_param( sample_info_handle ); - drv_info_handle->param_read_finished_sync = 0; /* 读取完成之后不置同步标志,该数据仅做异常检测 */ - /****** 进入临界区 ******/ - check_clk_tick[0] = vc921x_get_cputimer_tick(); - core921x_read_rcosc_tick( pdev_cnt1, pdev_cnt2 ); - check_clk_tick[1] = vc921x_get_cputimer_tick(); - /****** 退出临界区 ******/ - check_innbio_buff[fill_index]=sample_info_handle->extra_result.bioinn_data; - check_extbio_buff[fill_index]=sample_info_handle->extra_result.bioext_data; - check_tick1_buff[fill_index]=*pdev_cnt1; - check_tick2_buff[fill_index]=*pdev_cnt2; - /* 检验频率温度是否正常 */ - *p_freq_ret = vc921x_drv_check_frequency_abnormal( *pdev_cnt1, *pdev_cnt2, check_clk_tick[0], check_clk_tick[1] ); - /* 检验内部温度是否正常 */ -#if 0 /* 使用上电时的内部温度和当前的相对温度进行比较 或者是 内部一致就使用绝对比较 */ - if( sample_info_handle->extra_result.temp0_data>0 && startup_inntemperature>sample_info_handle->extra_result.temp0_data && (startup_inntemperature-sample_info_handle->extra_result.temp0_data)>=1000 ) -#else - if( sample_info_handle->extra_result.temp0_data>0 && sample_info_handle->extra_result.temp0_data<=18000 ) /* 如果客户那边内部得温度常温都在19000左右,就可以直接判断绝对值 */ -#endif - { - *p_temp_ret = 1; - } - /* 校验bio/rctick是否卡死且不为0 */ - if( ++fill_index >=CHECK_BUFF_SIZE ) - { - fill_index=0; - fiil_mark=1; - } - if( fiil_mark ) - { - for( i=0; iextra_result.bioext_enwork||0==sample_info_handle->extra_result.bioinn_enwork ) - { - check_ret++;break; /* bio未使能,忽略++ */ - } - if( check_innbio_buff[i]!=check_innbio_buff[i+1]||check_extbio_buff[i]!=check_extbio_buff[i+1] ) - { - check_ret++;break; /* bio未卡死,通过++ */ - } - } - for( i=0; iparam_read_finished_sync = 0; - drv_info_handle->fifo_read_finished_sync = 0; - drv_info_handle->event_read_finished_sync = 0; - drv_info_handle->fifo_read_data_valid = 0; - -#if 1 - unsigned char config_debug_reg[32] = {0}; - unsigned char debug_index = 0; - vc921x_read_register(0x40, config_debug_reg, 32); - VCARE_DBG_LOG("[0x40]0x%02x,0x%02x,0x%02x,0x%02x 0x%02x,0x%02x,0x%02x,0x%02x", config_debug_reg[0 + debug_index], config_debug_reg[1 + debug_index], config_debug_reg[2 + debug_index], config_debug_reg[3 + debug_index], - config_debug_reg[4 + debug_index], config_debug_reg[5 + debug_index], config_debug_reg[6 + debug_index], config_debug_reg[7 + debug_index]); - debug_index += 8; - VCARE_DBG_LOG("[0x48]0x%02x,0x%02x,0x%02x,0x%02x 0x%02x,0x%02x,0x%02x,0x%02x", config_debug_reg[0 + debug_index], config_debug_reg[1 + debug_index], config_debug_reg[2 + debug_index], config_debug_reg[3 + debug_index], - config_debug_reg[4 + debug_index], config_debug_reg[5 + debug_index], config_debug_reg[6 + debug_index], config_debug_reg[7 + debug_index]); - debug_index += 8; - VCARE_DBG_LOG("[0x50]0x%02x,0x%02x,0x%02x,0x%02x 0x%02x,0x%02x,0x%02x,0x%02x", config_debug_reg[0 + debug_index], config_debug_reg[1 + debug_index], config_debug_reg[2 + debug_index], config_debug_reg[3 + debug_index], - config_debug_reg[4 + debug_index], config_debug_reg[5 + debug_index], config_debug_reg[6 + debug_index], config_debug_reg[7 + debug_index]); - debug_index += 8; - VCARE_DBG_LOG("[0x58]0x%02x,0x%02x,0x%02x,0x%02x 0x%02x,0x%02x,0x%02x,0x%02x", config_debug_reg[0 + debug_index], config_debug_reg[1 + debug_index], config_debug_reg[2 + debug_index], config_debug_reg[3 + debug_index], - config_debug_reg[4 + debug_index], config_debug_reg[5 + debug_index], config_debug_reg[6 + debug_index], config_debug_reg[7 + debug_index]); -#endif - return 0; -} diff --git a/code/sdk/zhihui/drivers/ppg/vc921x/src/vc921x_hal.c b/code/sdk/zhihui/drivers/ppg/vc921x/src/vc921x_hal.c deleted file mode 100644 index 648fb7eef..000000000 --- a/code/sdk/zhihui/drivers/ppg/vc921x/src/vc921x_hal.c +++ /dev/null @@ -1,75 +0,0 @@ -/* - * @Author: penglei 1624952103@qq.com - * @Date: 2024-03-13 15:08:38 - * @LastEditors: penglei 1624952103@qq.com - * @LastEditTime: 2025-05-15 11:56:40 - * @FilePath: /FD230/code/sdk/drivers/peripheral/ppg/hx3695/hx3695_hal.c - * @Description: - * - * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. - */ - -#include -#include -#include -#include -#include -#include "pm_control.h" -#include "vc921x_user_app.h" - -static vcare_ppg_device_t *vc921x_device = NULL; - -void ppg_send_cmd_to_vc921x_driver(char* mode, uint8_t enable) -{ - work_mode md = 1; - if (strcmp(mode, "hrs") == 0) { - md = WORK_MODE_HR; - } else if (strcmp(mode, "hrv") == 0) { - md = WORK_MODE_HRV; - } else if (strcmp(mode, "spo2") == 0) { - md = WORK_MODE_SPO2; - } else if (strcmp(mode, "leaklight") == 0) { - md = WORK_MODE_UNDEFINED; - } else if (strcmp(mode, "graycard") == 0) { - md = WORK_MODE_UNDEFINED; - } else if (strcmp(mode, "ledoff") == 0) { - md = WORK_MODE_UNDEFINED; - } else if (strcmp(mode, "wear") == 0) { - md = WORK_MODE_WEAR; - } else if (strcmp(mode, "single") == 0) { - md = WORK_MODE_UNDEFINED; - }else if (strcmp(mode, "factory") == 0) { - md = WORK_MODE_UNDEFINED; - }else if (strcmp(mode, "fpc") == 0) { - md = WORK_MODE_UNDEFINED; - }else if (strcmp(mode, "int") == 0) { - if(vc921x_device) - vc921x_device->ops->dev_irq_handler(0,0); - return; - } - - if (enable == 1) - { - // ppg_service_running_stat = true; - // uapi_pm_control(PM_APP_WAKE_NEEDED); - tyhx_poweron(); - - vc921x_device = get_vc921x_device(); - if(!vc921x_device) - { - printf("get_vc921x_device failed !!!\n"); - tyhx_poweroff(); - return; - } - InitParamTypeDef pInit_Param = {0}; - pInit_Param.sampling_gap_time = 400; - pInit_Param.work_mode = md; - vc921x_device->ops->dev_init(&pInit_Param); - - } else { - - // uapi_pm_control(PM_APP_WAKE_NONEED); - vc921x_device->ops->stop_work(); - tyhx_poweroff(); - } -} \ No newline at end of file diff --git a/code/sdk/zhihui/drivers/ppg/vc921x/src/vc921x_original_data_send.c b/code/sdk/zhihui/drivers/ppg/vc921x/src/vc921x_original_data_send.c deleted file mode 100644 index 30e608675..000000000 --- a/code/sdk/zhihui/drivers/ppg/vc921x/src/vc921x_original_data_send.c +++ /dev/null @@ -1,267 +0,0 @@ -/********************************************************************************************** - * @Copyright(c) 2023, Chengdu vcaresensor Microelectronics Corporation. All rights reserved. - * @Author: Tse - * @Date: 2023-09-22 17:39:10 - * @LastEditTime: 2024-02-26 09:49:05 - * @LastEditors: Tse - * @Description: - **********************************************************************************************/ -/* system include */ -// #include "os_timer.h" -// #include -// #include "wristband_global_data.h" -// extern RtkWristBandSysType_t RtkWristbandSys; -/* vcare include */ -#include "vcare_device_com.h" -#include "vc921x_sample_result.h" - -static unsigned char ble_buf[2000] = {0}; -static unsigned short int buf_size = 0; -static unsigned short int buf_index = 0; -#define BLE_PACK_SIZE 200 -#define TIMER_BLE_GAP 10 - -static void debug_orginal_data_send(unsigned short int size); -/********************************************************************************************************* - * 调试蓝牙数据格式: - * [0~7]slot0_8bytes - * { - * .[0~2]ppg_data(h,m,l) - * .[3]ppg_mark - * .[4]resistance - * .[5]current - * .[6~7]env_bit14(h,l) - * } - * [ 8~15]slot1_8bytes{...} - * [16~23]slot2_8bytes{...} - * [24~25]bio0_2bytes(h,l) - * [26~27]bio1_2bytes(h,l) - * [28~29]ps_slot3_2bytes(h,l) - * [30~35]gsensorx/y/z(h,l) or tempRefADC, tempExtADC, temperature - * [36]hr - * [37]spo2 - * [38]algo_mode - * [39]wear_bioret(bit7) | algoret(bit6) | acceret(bit5) | wear_drv(bit3~bit0) - * - * #define FRAME_SIZE 40 - *********************************************************************************************************/ -#define ORIGINAL_DATA_DEBUG_ENABLE (1) -#if ORIGINAL_DATA_DEBUG_ENABLE - -#define HR_PPG_SLOT 0 -#define IR_PPG_SLOT 1 -#define RD_PPG_SLOT 2 -#define PS_PPG_SLOT 3 -/* 单采样帧字节数 */ -#define FRAME_SIZE 40 - -float vc921x_calc_sample_data_coefficient( unsigned int ppg_data, unsigned char ppg_I, unsigned char ppg_R, unsigned char ppg_bits ); -extern void vc921x_drv_get_wear_detail_result( unsigned char *bio_ret, unsigned char *algo_ret, unsigned char *acce_ret ); - -void vc921x_send_orginal_data(vcare_ppg_device_t *pdev, gsensor_axes *pgsensor, unsigned char ppgsize) -{ - unsigned char i = 0; - unsigned char j = 0; - unsigned char slot_k = 0; - unsigned char psfreq_index = 0; - /* wear all result param */ - unsigned char bio_result=0, algo_result=0, acce_result=0; - vc921x_sample_info_t *presult = (vc921x_sample_info_t *)pdev->result; - memset(ble_buf, 0, sizeof(ble_buf)); - vc921x_drv_get_wear_detail_result( &bio_result, &algo_result, &acce_result ); - unsigned char calc_slot=0; - vc921x_calc_sample_data_coefficient( VC921x_GET_SLOT_SAMPLE_DATA(presult, calc_slot, ppgsize-1), presult->slot_result[calc_slot].slot_current, presult->slot_result[calc_slot].slot_resistance, - presult->adc_resolution ); - - for (i = 0; i < ppgsize; i++) - { - j = 0; - /* 0-23,slot_ppg:3*8=24 */ - for (slot_k = 0; slot_k < 3; slot_k++) - { - ble_buf[i * FRAME_SIZE + j++] = (VC921x_GET_SLOT_SAMPLE_DATA(presult, slot_k, i)>>16)&0xff; - ble_buf[i * FRAME_SIZE + j++] = (VC921x_GET_SLOT_SAMPLE_DATA(presult, slot_k, i)>>8) &0xff; - ble_buf[i * FRAME_SIZE + j++] = (VC921x_GET_SLOT_SAMPLE_DATA(presult, slot_k, i)>>0) &0xff; - - ble_buf[i * FRAME_SIZE + j++] = (presult->adc_resolution-16)/2; - ble_buf[i * FRAME_SIZE + j++] = presult->slot_result[slot_k].slot_resistance; - ble_buf[i * FRAME_SIZE + j++] = presult->slot_result[slot_k].slot_current; - ble_buf[i * FRAME_SIZE + j++] = (presult->slot_result[slot_k].env_data >> 8) & 0xff; - ble_buf[i * FRAME_SIZE + j++] = (presult->slot_result[slot_k].env_data >> 0) & 0xff; - } - /*24-29 bio:2*2 + ps:2 */ - psfreq_index =(presult->wear_drop_flag)?(i/presult->hold_div):(i / presult->ps_div); - if (presult->extra_result.biofifo_mode != 0) //VC921x_BIO_NOFIFO_PS_SGL - { - ble_buf[i * FRAME_SIZE + j++] = (presult->extra_result.bioinn_buffer[psfreq_index] >> 8) & 0xff; - ble_buf[i * FRAME_SIZE + j++] = (presult->extra_result.bioinn_buffer[psfreq_index] >> 0) & 0xff; - ble_buf[i * FRAME_SIZE + j++] = (presult->extra_result.bioext_buffer[psfreq_index] >> 8) & 0xff; - ble_buf[i * FRAME_SIZE + j++] = (presult->extra_result.bioext_buffer[psfreq_index] >> 0) & 0xff; - } - else - { - ble_buf[i * FRAME_SIZE + j++] = (presult->extra_result.bioinn_data >> 8) & 0xff; - ble_buf[i * FRAME_SIZE + j++] = (presult->extra_result.bioinn_data >> 0) & 0xff; - ble_buf[i * FRAME_SIZE + j++] = (presult->extra_result.bioext_data >> 8) & 0xff; - ble_buf[i * FRAME_SIZE + j++] = (presult->extra_result.bioext_data >> 0) & 0xff; - } - if (presult->slot_result[2].slot_storefifo) - { - ble_buf[i * FRAME_SIZE + j++] = (VC921x_GET_SLOT_PS_DATA(presult, psfreq_index) >> 8) & 0xff; - ble_buf[i * FRAME_SIZE + j++] = (VC921x_GET_SLOT_PS_DATA(presult, psfreq_index) >> 0) & 0xff; - } - else - { - ble_buf[i * FRAME_SIZE + j++] = (presult->slot_result[2].u.ps_data >> 8) & 0xff; - ble_buf[i * FRAME_SIZE + j++] = (presult->slot_result[2].u.ps_data >> 0) & 0xff; - } -/* 30-35 xyz:2*3=6*/ -#if 1 - ble_buf[i * FRAME_SIZE + j++] = pgsensor->xData[i] >> 8; - ble_buf[i * FRAME_SIZE + j++] = pgsensor->xData[i] & 0xff; - ble_buf[i * FRAME_SIZE + j++] = pgsensor->yData[i] >> 8; - ble_buf[i * FRAME_SIZE + j++] = pgsensor->yData[i] & 0xff; - ble_buf[i * FRAME_SIZE + j++] = pgsensor->zData[i] >> 8; - ble_buf[i * FRAME_SIZE + j++] = pgsensor->zData[i] & 0xff; -#else /* temp result */ - ble_buf[i * FRAME_SIZE + j++] = presult->extra_result.tempref_data >> 8; - ble_buf[i * FRAME_SIZE + j++] = presult->extra_result.tempref_data & 0xff; - ble_buf[i * FRAME_SIZE + j++] = presult->extra_result.temp0_data >> 8; - ble_buf[i * FRAME_SIZE + j++] = presult->extra_result.temp0_data & 0xff; - ble_buf[i * FRAME_SIZE + j++] = presult->extra_result.temp1_data >> 8; - ble_buf[i * FRAME_SIZE + j++] = presult->extra_result.temp1_data & 0xff; -#endif - /* 36-spo2,37-hr,38-algo_mode */ - ble_buf[i * FRAME_SIZE + j++] = pdev->heart_rate; - ble_buf[i * FRAME_SIZE + j++] = pdev->spo2; - ble_buf[i * FRAME_SIZE + j++] = pdev->heart_algo_mode; - /* [39]wear_bioret(bit7) | algoret(bit6) | acceret(bit5) | wear_drv(bit3~bit0) */ - ble_buf[i * FRAME_SIZE + j++] = (bio_result<<7)|(algo_result<<6)|(acce_result<<5)| (pdev->wear & 0xf); - } - debug_orginal_data_send(ppgsize * FRAME_SIZE); -} - -#endif - -void vc921x_send_orginal_data_debug_mark_data( void ) -{ - for(int i=0; i= buf_size) - { - return 0; - } - // 判断剩余数据长度是否还需要分包 - residue_size = buf_size - buf_index; - if (residue_size <= BLE_PACK_SIZE) - { - send_data_by_ble(&ble_buf[buf_index], residue_size); - return 0; - } - else - { - send_data_by_ble(&ble_buf[buf_index], BLE_PACK_SIZE); - buf_index += BLE_PACK_SIZE; - return 1; - } -} - -/* 创建软件定时器,如果数据太长通过软件定时器发送 */ -#define TIMER_ID 0xf0 -static void *debug_send_timer = NULL; -static void debug_send_timer_start(void) -{ - if (debug_send_timer) - { - os_timer_restart(&debug_send_timer, TIMER_BLE_GAP); - } -} -static void debug_send_timer_stop(void) -{ - if (debug_send_timer) - { - os_timer_stop(&debug_send_timer); - } -} - -static void debug_send_timer_callback(void *p_handle) -{ - if (timer_send_data_function()) - { - /* 定时器继续循环 */ - os_timer_restart(&debug_send_timer, TIMER_BLE_GAP); - } - else - { - /* 关闭定时器 */ - debug_send_timer_stop(); - } -} - -void vc921x_send_orginal_data_timer_init(void) -{ - // if (debug_send_timer == NULL) - // { - // os_timer_create(&debug_send_timer, "debug_send_timer", TIMER_ID, TIMER_BLE_GAP, false, debug_send_timer_callback); - // } - // os_timer_restart(&debug_send_timer, TIMER_BLE_GAP); - // os_timer_stop(&debug_send_timer); -} - -static void debug_orginal_data_send(unsigned short int size) -{ - buf_index = 0; - buf_size = size; - printf("debug_orginal_data_send = %d", size); -#if 1 - if (buf_size <= BLE_PACK_SIZE) - { - send_data_by_ble(ble_buf, size); - } - else - { - send_data_by_ble(ble_buf, BLE_PACK_SIZE); - buf_index += BLE_PACK_SIZE; - debug_send_timer_start(); - } -#else - for (unsigned char i = 0; i * 8 < size; i++) - { - printf("[%d~%d]:%02x %02x %02x %02x , %02x %02x %02x %02x", i * 8, (i + 1) * 8, - ble_buf[i * 8], ble_buf[i * 8 + 1], ble_buf[i * 8 + 2], ble_buf[i * 8 + 3], ble_buf[i * 8 + 4], ble_buf[i * 8 + 5], ble_buf[i * 8 + 6], ble_buf[i * 8 + 7]); - } -#endif -} diff --git a/code/sdk/zhihui/drivers/ppg/vc921x/src/vc921x_user_app.c b/code/sdk/zhihui/drivers/ppg/vc921x/src/vc921x_user_app.c deleted file mode 100644 index c6b2281cb..000000000 --- a/code/sdk/zhihui/drivers/ppg/vc921x/src/vc921x_user_app.c +++ /dev/null @@ -1,897 +0,0 @@ -/********************************************************************************************** - * @Copyright(c) 2023, Chengdu vcaresensor Microelectronics Corporation. All rights reserved. - * @Author: Tse - * @Date: 2023-09-22 17:39:10 - * @LastEditTime: 2024-04-11 20:38:21 - * @LastEditors: Tse - * @Description: - **********************************************************************************************/ -/* 驱动头文件 */ -#include "vc921x_driver_com.h" -#include "vc921x_sample_result.h" -#include "vc921x_user_app.h" -/* 算法头文件 */ -#include "algo.h" -#include "spo2Algo_16bit.h" -#include "vcSportMotionIntAlgo.h" -#include "custom_utils.h" -#include "custom_utils.h" -#include "pinctrl_porting.h" -#include "hal_gpio.h" -#include "vcare_device_com.h" - -#define VC921X_I2C_BUS I2C_BUS_2 -#define CHIP_I2C_ADDRESS 0x33 - -/* vcare_ppg_device */ -static vcare_ppg_device_t vc921x_dev = {"vc921x", 0, 0, 0, 0, 0, 0, 0, NULL, NULL, 0, 0, 0, 0, 0, 0, 0, 0}; -/* G-Sensor Data */ -static gsensor_axes vc921x_gsensor_data = {0}; - -static void vc921x_get_board_gsensor_data(unsigned short int *pgsensor_len, unsigned short int ppg_count); -static unsigned int vc921x_gsensor_actuating_quantity(int x_axis, int y_axis, int z_axis); -static int vc921x_heart_rate_calculate(vcare_ppg_device_t *pdev, unsigned char hr_slot ); -static int vc921x_spo2_calculate(vcare_ppg_device_t *pdev, unsigned char ir_slot, unsigned char red_slot); - - -// S_AGPIO_L26 心率复位 PPG reset -#define GPIO_PIN_PRG_RESET S_AGPIO_L26 -// S_AGPIO_R0 PRG_LED_POWER ON 心率等电源控制脚 -#define GPIO_PIN_PRG_LED_ON S_AGPIO_R0 - -void tyhx_poweron(void) -{ - // uapi_pin_set_mode(GPIO_PIN_PRG_RESET, (pin_mode_t)HAL_PIO_FUNC_GPIO); - // uapi_gpio_set_dir(GPIO_PIN_PRG_RESET, GPIO_DIRECTION_OUTPUT); - // uapi_gpio_set_val(GPIO_PIN_PRG_RESET, GPIO_LEVEL_HIGH); - - uapi_pin_set_mode(GPIO_PIN_PRG_LED_ON, (pin_mode_t)HAL_PIO_FUNC_GPIO); - uapi_gpio_set_dir(GPIO_PIN_PRG_LED_ON, GPIO_DIRECTION_OUTPUT); - uapi_gpio_set_val(GPIO_PIN_PRG_LED_ON, GPIO_LEVEL_HIGH); - LOS_Mdelay(50); -} -void tyhx_poweroff(void) -{ - // uapi_pin_set_mode(GPIO_PIN_PRG_RESET, (pin_mode_t)HAL_PIO_FUNC_GPIO); - // uapi_gpio_set_dir(GPIO_PIN_PRG_RESET, GPIO_DIRECTION_OUTPUT); - // uapi_gpio_set_val(GPIO_PIN_PRG_RESET, GPIO_LEVEL_LOW); - - uapi_pin_set_mode(GPIO_PIN_PRG_LED_ON, (pin_mode_t)HAL_PIO_FUNC_GPIO); - uapi_gpio_set_dir(GPIO_PIN_PRG_LED_ON, GPIO_DIRECTION_OUTPUT); - uapi_gpio_set_val(GPIO_PIN_PRG_LED_ON, GPIO_LEVEL_LOW); - - LOS_Mdelay(1); -} - -/**************************************************************************** - * @description: 驱动参数保存/读取 - * @param {unsigned int} size - * @return {*} - ****************************************************************************/ -int vc921x_param_write_flash(unsigned char *pdata, unsigned int size) -{ - uapi_save_file_data("/user/userdata/vc921x.bin",pdata,size,"wb"); - return 0; -} -int vc921x_param_read_flash(unsigned char *pdata, unsigned int size) -{ - uapi_get_file_data("/user/userdata/vc921x.bin",pdata,&size); - return 0; -} - -/**************************************************************************** - * @description: 内存申请 - * @param {unsigned int} size - * @return {*} - ****************************************************************************/ -void *vc921x_malloc(unsigned int size) -{ - return malloc(size); -} -/**************************************************************************** - * @description: 内存释放 - * @param {void} *ptr - * @return {*} - ****************************************************************************/ -void vc921x_free(void *ptr) -{ - if (ptr) - { - free(ptr); - } -} -/**************************************************************************** - * @description: - * @param {unsigned char} regaddr - * @param {unsigned char*} pbuf - * @param {unsigned short int} size - * @return {*} - ****************************************************************************/ -int vc921x_read_register(unsigned char regaddr, unsigned char *pbuf, unsigned short int size) -{ - custom_i2c_read_regs(CHIP_I2C_ADDRESS, regaddr, 1 , pbuf, size, VC921X_I2C_BUS); - return 0; -} -int vc921x_write_register(unsigned char regaddr, unsigned char *pbuf, unsigned short int size) -{ - custom_i2c_write_reg(CHIP_I2C_ADDRESS, regaddr, 1, pbuf, size, VC921X_I2C_BUS); - return 0; -} -unsigned int vc921x_get_cputimer_tick(void) -{ - return uapi_systick_get_count(); -} - -/*********************************************************************************************************/ -/* user gsensor code */ -#define ENABLE_GSENSOR 0 -//#include "module_gsensor_stk8321.h" -//#include "hub_gsensor.h" -const unsigned char arry10[] = {0, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12}; -const unsigned char arry20[] = {0, 2, 3, 5, 6, 8, 9, 11, 12, 13, 15, 16, 18, 19, 21, 22, 24, 25, 27, 28}; -static void vc921x_get_board_gsensor_data(unsigned short int *pgsensor_len, unsigned short int ppg_count) -{ - int i = 0; - unsigned char gsensor_len = 0; - memset(&vc921x_gsensor_data, 0, sizeof(vc921x_gsensor_data)); -#if ENABLE_GSENSOR - /* Gsensor精度要求 ReadGsensorFIFO(+-4G11bit or +-8G12bit 256/g) 例如一个fifo周期为1sec,25组ppg数据,需要获取1sec内25组gsensor数据(40ms*25),用于匹配25组ppg信号。 - 如果ppg频率高于ppg频率则对进行抽样处理,以下代码仅参考 */ - AxesRaw_t gsensor_buff[40] = {0}; - stk8321_get_fifo_data(&gsensor_len, gsensor_buff); - VCARE_DBG_LOG("gsensor_len[%d]-ppgsize[%d]", gsensor_len, ppg_count); - if (0 == ppg_count) - { - /* 不抽样 */ - *pgsensor_len = gsensor_len; - for (i = 0; i < *pgsensor_len; i++) - { -#if (BOARD_VERSION == BOARD_NEW_BOARD) - vc921x_gsensor_data.xData[i] = gsensor_buff[i].AXIS_X; - vc921x_gsensor_data.yData[i] = gsensor_buff[i].AXIS_Y; - vc921x_gsensor_data.zData[i] = gsensor_buff[i].AXIS_Z; -#elif (BOARD_VERSION == BOARD_OLD_BOARD) - vc921x_gsensor_data.xData[i] = gsensor_buff[i].AXIS_Y; - vc921x_gsensor_data.yData[i] = gsensor_buff[i].AXIS_X; - vc921x_gsensor_data.zData[i] = gsensor_buff[i].AXIS_Z; -#endif - } - } - /* æ­¤demo中gsensor的采样频率高于ppg采样,所以正常情况下,gsensor的数量一定是大于ppg的数据。特殊情况需要考虑ppg数量大于gsensor数量。需要对gsensor数据进行补长 */ - if ((gsensor_len >= ppg_count) && (ppg_count != 0)) - { - *pgsensor_len = ppg_count; - /* ppglen = 10 抽样 */ - if (10 == ppg_count) - { - for (i = 0; i < ppg_count; i++) - { -#if (BOARD_VERSION == BOARD_NEW_BOARD) - vc921x_gsensor_data.xData[i] = gsensor_buff[arry10[i]].AXIS_X; - vc921x_gsensor_data.yData[i] = gsensor_buff[arry10[i]].AXIS_Y; - vc921x_gsensor_data.zData[i] = gsensor_buff[arry10[i]].AXIS_Z; -#elif (BOARD_VERSION == BOARD_OLD_BOARD) - vc921x_gsensor_data.xData[i] = gsensor_buff[arry10[i]].AXIS_Y; - vc921x_gsensor_data.yData[i] = gsensor_buff[arry10[i]].AXIS_X; - vc921x_gsensor_data.zData[i] = gsensor_buff[arry10[i]].AXIS_Z; -#endif - } - } - else /* ppglen = 20 、25抽样 */ - { - for (i = 0; i < ppg_count; i++) - { -#if (BOARD_VERSION == BOARD_NEW_BOARD) - vc921x_gsensor_data.xData[i] = gsensor_buff[arry20[i]].AXIS_X; - vc921x_gsensor_data.yData[i] = gsensor_buff[arry20[i]].AXIS_Y; - vc921x_gsensor_data.zData[i] = gsensor_buff[arry20[i]].AXIS_Z; -#elif (BOARD_VERSION == BOARD_OLD_BOARD) - vc921x_gsensor_data.xData[i] = gsensor_buff[arry20[i]].AXIS_Y; - vc921x_gsensor_data.yData[i] = gsensor_buff[arry20[i]].AXIS_X; - vc921x_gsensor_data.zData[i] = gsensor_buff[arry20[i]].AXIS_Z; -#endif - } - } - } - else if ((gsensor_len < ppg_count) && (gsensor_len != 0)) /* gsensor不足补全 */ - { - *pgsensor_len = ppg_count; - for (i = 0; i < gsensor_len; i++) - { -#if (BOARD_VERSION == BOARD_NEW_BOARD) - vc921x_gsensor_data.xData[i] = gsensor_buff[i].AXIS_X; - vc921x_gsensor_data.yData[i] = gsensor_buff[i].AXIS_Y; - vc921x_gsensor_data.zData[i] = gsensor_buff[i].AXIS_Z; -#elif (BOARD_VERSION == BOARD_OLD_BOARD) - vc921x_gsensor_data.xData[i] = gsensor_buff[i].AXIS_Y; - vc921x_gsensor_data.yData[i] = gsensor_buff[i].AXIS_X; - vc921x_gsensor_data.zData[i] = gsensor_buff[i].AXIS_Z; -#endif - } - for (i = gsensor_len; i < ppg_count; i++) - { -#if (BOARD_VERSION == BOARD_NEW_BOARD) - vc921x_gsensor_data.xData[i] = gsensor_buff[gsensor_len - 1].AXIS_X; - vc921x_gsensor_data.yData[i] = gsensor_buff[gsensor_len - 1].AXIS_Y; - vc921x_gsensor_data.zData[i] = gsensor_buff[gsensor_len - 1].AXIS_Z; -#elif (BOARD_VERSION == BOARD_OLD_BOARD) - vc921x_gsensor_data.xData[i] = gsensor_buff[gsensor_len - 1].AXIS_Y; - vc921x_gsensor_data.yData[i] = gsensor_buff[gsensor_len - 1].AXIS_X; - vc921x_gsensor_data.zData[i] = gsensor_buff[gsensor_len - 1].AXIS_Z; -#endif - } - } -#endif -} - -/**************************************************************************** - * @description: gsensor判断是否存在运动 - * @param {int} x_axis - * @param {int} y_axis - * @param {int} z_axis - * @return {*} - ****************************************************************************/ -static unsigned int vc921x_gsensor_actuating_quantity(int x_axis, int y_axis, int z_axis) -{ - unsigned int ret_atc = 0; - unsigned int abs_sum_current = 0; - static unsigned int abs_sum_last = 0; - if (x_axis < 0) - { - x_axis = -x_axis; - } - if (y_axis < 0) - { - y_axis = -y_axis; - } - if (z_axis < 0) - { - z_axis = -z_axis; - } - abs_sum_current = x_axis + y_axis + z_axis; - if (abs_sum_last && abs_sum_current) - { - if (((abs_sum_last > abs_sum_current) ? (abs_sum_last - abs_sum_current) : (abs_sum_current - abs_sum_last)) >= 40) - { - VCARE_DBG_LOG("ACTIVE..."); - ret_atc = 1; - } - } - abs_sum_last = abs_sum_current; - vc921x_drv_set_acce_wear_status(&vc921x_dev, ret_atc); - return ret_atc; -} - -/**************************************************************************** - * @description: ppg数据加入心率算法 - * @param {vcare_ppg_device_t} *pdev - * @return {*} - ****************************************************************************/ -static int vc921x_heart_rate_calculate(vcare_ppg_device_t *pdev, unsigned char hr_slot ) -{ - int heartRate = 0; - unsigned char reliability = 0; - AlgoInputData_t algoInputData_t = {0}; - AlgoOutputData_t algoOutputData = {0}; - vc921x_sample_info_t *result_info = NULL; - vc921x_sample_slot_t *result = NULL; - unsigned char adc_param = 0; - int i = 0; - if (!pdev) - { - return -1; - } - heartRate = pdev->heart_rate; - result_info = (vc921x_sample_info_t *)pdev->result; - result = &result_info->slot_result[hr_slot]; /* 驱动中初始化slot0为心率绿光ppg */ - adc_param = (result_info->adc_resolution-16)/2; - for (i = 0; i < result->ppg_num; i++) - { - algoInputData_t.axes.x = vc921x_gsensor_data.xData[i]; - algoInputData_t.axes.y = vc921x_gsensor_data.yData[i]; - algoInputData_t.axes.z = vc921x_gsensor_data.zData[i]; - algoInputData_t.envSample = result->env_data; - algoInputData_t.ppgSample = (adc_param<<24)|VC921x_GET_SLOT_SAMPLE_DATA(result_info, hr_slot, i ); /* 驱动中初始化slot0为心率绿光ppg */ - Algo_Input(&algoInputData_t, 1000 / 25, (AlgoSportMode)pdev->heart_algo_mode, 0, 0); - VCARE_DBG_LOG("mode[%d]-[%d] (%d)ppg=%d, x=%d, y=%d, z=%d \n", pdev->heart_algo_mode, i, adc_param, algoInputData_t.ppgSample&0xffffff, \ - algoInputData_t.axes.x, algoInputData_t.axes.y, algoInputData_t.axes.z); - } - Algo_Output(&algoOutputData); - heartRate = algoOutputData.hrData; - reliability = algoOutputData.reliability; - if (-1 == heartRate) - { - Algo_Init(); - /* call heart algo wear status check,[-1] */ - vc921x_drv_set_algo_wear_status(pdev, heartRate); - VCARE_DBG_LOG("ALGO_STA=-1"); - } - VCARE_DBG_LOG("ALGO-HR[%d][%d]", heartRate, reliability); - return heartRate; -} - -/**************************************************************************** - * @description: 血氧PPG数据加入血氧算法 - * @param {vcare_ppg_device_t} *pdev - * @return {*} - ****************************************************************************/ -static int vc921x_spo2_calculate(vcare_ppg_device_t *pdev, unsigned char red_slot, unsigned char ir_slot) -{ - vc921x_sample_info_t *result_info = NULL; - float spo2CalValue = -1.0f; - int spo2Value = 0; - unsigned char sportFlag = 0; - unsigned char adc_param = 0; - unsigned int ir_ppg_data = 0, red_ppg_data = 0; - if (!pdev) - { - return -1; - } - spo2Value = pdev->spo2; - result_info = (vc921x_sample_info_t *)pdev->result; - adc_param = (result_info->adc_resolution-16)/2; - for (int i = 0; i < result_info->slot_result[ir_slot].ppg_num; i++) - { - red_ppg_data= (adc_param<<24)|VC921x_GET_SLOT_SAMPLE_DATA(result_info, red_slot, i ); - ir_ppg_data = (adc_param<<24)|VC921x_GET_SLOT_SAMPLE_DATA(result_info, ir_slot, i ); - spo2CalValue = vcSpo2Calculate_16bit( red_ppg_data, ir_ppg_data, 1); - sportFlag = vcSportMotionCalculate(vc921x_gsensor_data.xData[i], vc921x_gsensor_data.yData[i], vc921x_gsensor_data.zData[i]); - if (-1 != (int)spo2CalValue && spo2CalValue <= 100 && 0 == sportFlag) - { - spo2Value = (int)spo2CalValue; - } - VCARE_DBG_LOG("[%d](%d) ppg_ir=%d, ppg_red=%d, x=%d, y=%d, z=%d", i, adc_param, \ - ir_ppg_data&0xffffff, red_ppg_data&0xffffff, \ - vc921x_gsensor_data.xData[i], vc921x_gsensor_data.yData[i], vc921x_gsensor_data.zData[i]); - } - VCARE_DBG_LOG("ALGO-SPO2[%d][%f]", (unsigned short int)spo2Value, spo2CalValue); - return spo2Value; -} - -/******************************************************************************************************** - * 温度功能部分,需要进行对数运算,必须包含math库 - ********************************************************************************************************/ -#include "math.h" -/* fix Rref = 10K R */ -#define REF_R 10 -/* NTC parameter */ -#define NTC_B 3380 -#define NTC_T (273.15f + 25) /* 25摄氏度下的绝对温度 */ -#define NTC_R 10 /* 10K */ -/* vc921x parameter */ -const unsigned char vc921x_temperature_current[] = {0, 2, 4, 8, 12, 16, 20, 24}; -static signed short int get_ntc_temperature(float ntc_value) -{ - signed short int temperature = 0; - float tmp = 0.0f; - tmp = 1 / (1 / NTC_T + (log(ntc_value / NTC_R) / NTC_B)) - 273.15f; - temperature = (signed short int)(tmp * 10); - VCARE_DBG_LOG("[CALC_TMP]=%d(%4.2f)", temperature, tmp); - return temperature; -} -static void vc921x_temperature_ntc_calculate(vcare_ppg_device_t *pdev) -{ - unsigned char ext_I = 0; - float ext_R = 0.0f; - vc921x_sample_info_t *presult_t = (vc921x_sample_info_t *)pdev->result; - if(presult_t->extra_result.tempslot1_enwork && presult_t->extra_result.temp1_data && presult_t->extra_result.tempref_data ) - { - /* 采样值转换为电阻值 */ - ext_I = vc921x_temperature_current[presult_t->extra_result.tempslot1_setcur]; - if (0 != ext_I) - { - ext_R = (float)(20 * REF_R * presult_t->extra_result.temp1_data) / (float)(presult_t->extra_result.tempref_data * ext_I); - VCARE_DBG_LOG("ext_R=%f", ext_R); - pdev->temperature1 = get_ntc_temperature(ext_R); - } - } -} - -/********************************************************************************************************* - * USER_API - ********************************************************************************************************/ -/* -!!!只针对[心率/摘配带]模式,其他模式均为自适应固定时间fifo时间,注意修改之前需要确认在使用的配置模式下,fifo不会溢出,否则将无法正确获取数据 -if( vc921x_PS_WORK_FAST_FREQUENCY==1 ) (ms) -{ps=12.5hz: fifotime=800,720,640,560...80} -else -{ps=5hz: fifotime=1000,800,600,400,200} -*/ -/**************************************************************************** - * @description: 初始化IC并启动工作 - * @param {InitParamTypeDef} *pinitconfig - * @return {*} - ****************************************************************************/ -void vc921x_usr_device_init( InitParamTypeDef *pinitconfig ) -{ - // tyhx_poweron(); - int algo_confirm_ret=0; - unsigned short int ppgdiv = 0; - unsigned char psdiv = 0; - unsigned char fifodiv = 0; - unsigned char dropdiv =20; /* drop_sta:ps_freq = ppg_hz/drop_div */ - unsigned char frequency=25; /* default frequency=25hz */ - /* ppg_freq=20K/ppgdiv, ps_freq=ppg_freq/psdiv, fifodiv=psfreq/fifodiv - * fifo_max=192byte. The amount of byte by once sampling must not be greater than fifo_max(192bytes). - */ - extern unsigned short int VC921x_CFG_MCU_TICK_FREQUENCY; /* mcu tick frequency parameter */ - extern unsigned short int VC921x_WEAR_PARAM_BIO_ABS_HOLD; /* factory calibration parameter-hold */ - extern unsigned short int VC921x_WEAR_PARAM_BIO_ABS_DROP; /* factory calibration parameter-drop */ - VC921x_CFG_MCU_TICK_FREQUENCY=32000; - VC921x_WEAR_PARAM_BIO_ABS_HOLD=150; /* save_diff*8/10 */ - VC921x_WEAR_PARAM_BIO_ABS_DROP=100; /* save_diff*5/10 */ - - vc921x_dev.workmode = (work_mode)pinitconfig->work_mode; - vc921x_dev.heart_algo_mode = pinitconfig->hr_algo_mode; - switch (pinitconfig->work_mode) - { - case WORK_MODE_HR: - case WORK_MODE_SPO2: - case WORK_MODE_WEAR: - case WORK_MODE_FACTORY0: - case WORK_MODE_FACTORY1: - case WORK_MODE_UNDEFINED: - case WORK_MODE_HRSPO2: - frequency=25; - break; - case WORK_MODE_STRESS: - frequency=50; - break; - case WORK_MODE_HRV: - case WORK_MODE_BLOODPRESSURE: - frequency=100; - break; - default: - break; - } - ppgdiv = 20000 / frequency; /* ppg_freq = frequency */ -#if (VC921x_PS_WORK_FREQUENCY_CONFIG==1) - psdiv = pinitconfig->sampling_gap_time*25/1000; /* 520ms ~ ps_div=13, fifo_div=1, 注意设置初始化参数的时间时,要估算一次fifo长度和fifo总长度的关系 */ - fifodiv = 1; - if( WORK_MODE_FACTORY0==pinitconfig->work_mode || WORK_MODE_FACTORY1==pinitconfig->work_mode ) - { - frequency=50; - ppgdiv = 20000 / frequency; - psdiv = pinitconfig->sampling_gap_time*25/1000; /* 注意:别修改psdiv,在有活体的配置里面,会影响活体的时间参数.所以此处通过提高一倍ppg频率,进而加快FAT模式的中断数据更新 */ - fifodiv=1; - } -#elif( VC921x_PS_WORK_FREQUENCY_CONFIG==0 ) /* ps=5hz */ - dropdiv =20; - if (frequency == 25) - { - psdiv = 5; - fifodiv = 4; /* ppg=25hz, psbio=5hz, fifo=1.25hz,fifotime=800ms */ - if( WORK_MODE_SPO2==pinitconfig->work_mode ) - { - fifodiv=2; - } - } - else if (frequency == 50) - { - psdiv = 10; - fifodiv = 2; /* ppg=50hz, psbio=5hz, fifo=2.5hz,fifotime=400ms */ - } - else if (frequency == 100) - { - psdiv = 20; - fifodiv = 1; /* ppg=100hz, psbio=5hz, fifo=5hz, fifotime=200ms */ - } - if( WORK_MODE_HR==pinitconfig->work_mode || WORK_MODE_WEAR==pinitconfig->work_mode ) - { - fifodiv = pinitconfig->sampling_gap_time*50/10000; - } - if( WORK_MODE_HRSPO2==pinitconfig->work_mode ) - { - fifodiv=2; - } - if( WORK_MODE_FACTORY0==pinitconfig->work_mode || WORK_MODE_FACTORY1==pinitconfig->work_mode ) - { - dropdiv = psdiv; - fifodiv=1; - } -#endif - /* 先初始化启动心率芯片 */ - vc921x_drv_init_start_work(&vc921x_dev, pinitconfig->work_mode, ppgdiv, psdiv, fifodiv, dropdiv); - vc921x_dev.dev_work_status = 1; - /* 如果需要保持测试值,比如24h的心率模式,初始化时则不清除记录值心率值,避免初始化后出现一段为0的情况 */ - vc921x_dev.heart_rate = 0; - vc921x_dev.stress=0; - vc921x_dev.hrv = 0; - vc921x_dev.spo2 = 0; - vc921x_dev.blood_pressure=0; - vc921x_dev.ecg=0; - /****** algo_identify_init ******/ - //algo_confirm_ret = Algo_Confirm_init( RtkWristbandSys.SecondCountRTC ); //1704038400 - Algo_Init(); - vcSpo2AlgoInit_16bit(); - vcSportMotionAlgoInit(); - VCARE_DBG_LOG("work_mode=%d,algo_confirm=%d", pinitconfig->work_mode, algo_confirm_ret ); -} - -/**************************************************************************** - * @description: 获取IC及驱动相关参数 - * @param {unsigned char} *pchip_id - * @param {unsigned char} *pvers_id - * @param {char} * - * @param {char} * - * @return {*} - ****************************************************************************/ -void vc921x_usr_get_dev_info(unsigned char *pchip_id, unsigned char *pvers_id, char **drv_name, char **dev_name) -{ - /* pchip_id=0x24, pvers_id=0x10... */ - vc921x_drv_get_hwsw_infomation(drv_name, pchip_id, pvers_id); -} -/**************************************************************************** - * @description: 开始工作 - * @return {*} - ****************************************************************************/ -void vc921x_usr_start_work(void) -{ - vc921x_drv_wakeup_work(&vc921x_dev); - vc921x_dev.dev_work_status = 1; -} -/**************************************************************************** - * @description: 停止工作 - * @return {*} - ****************************************************************************/ -void vc921x_usr_stop_work(void) -{ - vc921x_drv_sleep_work(&vc921x_dev); - vc921x_dev.dev_work_status = 0; -} -/**************************************************************************** - * @description: 软复位 - * @return {*} - ****************************************************************************/ -void vc921x_usr_soft_reset(void) -{ - vc921x_drv_software_reset(&vc921x_dev); - vc921x_dev.dev_work_status = 0; -} -/**************************************************************************** - * @description: 活体IC参数重置校准 - * @return {*} - ****************************************************************************/ -void vc921x_usr_reset_bio_param(void) -{ - vc921x_drv_clear_reset_bio_param(&vc921x_dev); -} -/**************************************************************************** - * @description: 获取佩戴状态 - * @return {*} - ****************************************************************************/ -int vc921x_usr_get_wear_status(void) -{ - if (WEAR_STA_HOLD == vc921x_dev.wear) - { - return 1; - } - return 0; -} -/**************************************************************************** - * @description: 定时器校验当前IC状态,如果发生异常,则重启LDO后初始化 - * @return {*} - ****************************************************************************/ -void vc921x_usr_check_temperature_abnormal(void) -{ - unsigned char check_same_ret = 0, check_freq_ret = 0, check_temp_ret = 0; - unsigned short check_cnt1 = 0, check_cnt2 = 0; - check_same_ret = vc921x_drv_read_check_temperature_abnormal(&vc921x_dev, &check_freq_ret, &check_temp_ret, &check_cnt1, &check_cnt2); - vc921x_temperature_ntc_calculate(&vc921x_dev); - vc921x_sample_info_t *result_info = (vc921x_sample_info_t *)vc921x_dev.result; - VCARE_DBG_LOG("status(%d),psbio_0(%d,%d),cnt=%d,%d,same_ret=%d,freq_ret=%d,temp_ret=%d, temp_ext=%d",vc921x_dev.dev_work_status, - result_info->slot_result[2].u.ps_data, result_info->extra_result.bioext_data, check_cnt1, check_cnt2, - check_same_ret, check_freq_ret, check_temp_ret, vc921x_dev.temperature1); - - if (1 == vc921x_dev.dev_work_status && /* IC处于工作状态 */ - ((result_info->slot_result[2].u.ps_data==0 && (result_info->extra_result.bioext_data==0&&result_info->extra_result.bioext_enwork)) /* ps和bio同时异常,或者RCOSC异常 */ - || (check_cnt1 == 0 && check_cnt2 == 0) - || (1 == check_same_ret) /* bio-cnt其中之一已经不再变化 */ - || (1 == check_freq_ret) /* 频率温度异常 */ - || (1 == check_temp_ret) /* 内部温度异常 */ - || vc921x_dev.temperature1 >= 600)) /* NTC温度异常,如果硬件NC则会固定250 */ - { - /* 1.close ldo, 2.delay(200ms), 3.open ldo, 4.delay(10ms), 5.init_dev */ - //extern void vcare_ldo_power_ctrl(unsigned char onoff); - //vcare_ldo_power_ctrl(0); - //platform_delay_ms(200); - //vcare_ldo_power_ctrl(1); - //platform_delay_ms(10); - vc921x_drv_init_start_work(&vc921x_dev, vc921x_dev.workmode, result_info->ppg_div, result_info->ps_div, result_info->fifo_div, result_info->drop_div); - } -} - -/**************************************************************************** - * @description: 中断事件处理事件 - * @param {unsigned char} heart_algo_mode - * @param {unsigned char} spo2_algo_mode - * @return {*} - ****************************************************************************/ -void vc921x_usr_device_handler( unsigned char heart_algo_mode, unsigned char spo2_algo_mode ) -{ - unsigned short int ppg_num = 0; - unsigned short int gsensor_num = 0; - vc921x_sample_info_t *sample_result_info_ptr = (vc921x_sample_info_t *)vc921x_dev.result; - if( !vc921x_dev.dev_work_status ) return; - VCARE_DBG_LOG("------------------"); - vc921x_dev.heart_algo_mode = heart_algo_mode; - vc921x_dev.spo2_algo_mode = spo2_algo_mode; - vc921x_drv_get_result_handler(&vc921x_dev); - vc921x_dev.wear = vc921x_drv_get_wear_status(&vc921x_dev); - if (vc921x_drv_is_ps_event(&vc921x_dev) || vc921x_drv_is_fifo_event(&vc921x_dev)) - { - //disp_data.wear_sta = vc921x_dev.wear; - //disp_data.disp_bio_val = sample_result_info_ptr->extra_result.bioext_data; - //disp_data.disp_bio_abs = sample_result_info_ptr->extra_result.bioabs_calc; - //VCARE_DBG_LOG("bio_absgap=%d, bioext=%d", disp_data.disp_bio_abs, disp_data.disp_bio_val ); - } - switch (vc921x_dev.workmode) - { - case WORK_MODE_HR: - if (vc921x_drv_is_fifo_event(&vc921x_dev)) - { - ppg_num = sample_result_info_ptr->slot_result[0].ppg_num; - if (ppg_num > 40) - break; - vc921x_get_board_gsensor_data(&gsensor_num, ppg_num); - if (gsensor_num) - { - vc921x_gsensor_actuating_quantity(vc921x_gsensor_data.xData[0], vc921x_gsensor_data.yData[0], vc921x_gsensor_data.zData[0]); - } - printf("vc921x_dev.wear : %d \n",vc921x_dev.wear); - if (WEAR_STA_HOLD == vc921x_dev.wear) - { - vc921x_dev.heart_rate = vc921x_heart_rate_calculate(&vc921x_dev, 0); - printf("vc921x_dev.heart_rate : %d \n",vc921x_dev.heart_rate); - //vc921x_send_orginal_data(&vc921x_dev, &vc921x_gsensor_data, ppg_num); - } - else - { - vc921x_dev.heart_rate = 0; - //vc921x_send_orginal_data(&vc921x_dev, &vc921x_gsensor_data, (ppg_num?ppg_num:1) ); - Algo_Init(); - } - //disp_data.hr_rate = vc921x_dev.heart_rate; - } - break; - case WORK_MODE_SPO2: - if (vc921x_drv_is_fifo_event(&vc921x_dev)) - { - ppg_num = sample_result_info_ptr->slot_result[1].ppg_num; - if (ppg_num > 40) - break; - vc921x_get_board_gsensor_data(&gsensor_num, ppg_num); - if (WEAR_STA_HOLD == vc921x_dev.wear) - { - vc921x_dev.spo2 = vc921x_spo2_calculate(&vc921x_dev, 1, 0); - //vc921x_send_orginal_data(&vc921x_dev, &vc921x_gsensor_data, ppg_num); - } - else - { - vc921x_dev.spo2 = 0; - vcSpo2AlgoInit_16bit(); - vcSportMotionAlgoInit(); - } - printf("vc921x_dev.spo2 : %d \n",vc921x_dev.spo2); - //disp_data.spo2_val = vc921x_dev.spo2; - } - break; - case WORK_MODE_HRV: - if (vc921x_drv_is_fifo_event(&vc921x_dev)) - { - ppg_num = sample_result_info_ptr->slot_result[0].ppg_num; - if (ppg_num > 40) - break; - vc921x_get_board_gsensor_data(&gsensor_num, ppg_num); - if (WEAR_STA_HOLD == vc921x_dev.wear) - { /*wear is hold,call_algo_func*/ - //vc921x_send_orginal_data(&vc921x_dev, &vc921x_gsensor_data, ppg_num); - } - else - { /*wear is drop,clear_algo_data*/ - } - } - break; - case WORK_MODE_STRESS: - if (vc921x_drv_is_fifo_event(&vc921x_dev)) - { - ppg_num = sample_result_info_ptr->slot_result[0].ppg_num; - if (ppg_num > 40) - break; - vc921x_get_board_gsensor_data(&gsensor_num, ppg_num); - if (WEAR_STA_HOLD == vc921x_dev.wear) - { /*wear is hold,call_algo_func*/ - //vc921x_send_orginal_data(&vc921x_dev, &vc921x_gsensor_data, ppg_num); - } - else - { /*wear is drop,clear_algo_data*/ - } - //disp_data.hr_rate = vc921x_dev.heart_rate; - } - break; - case WORK_MODE_BLOODPRESSURE: - if (vc921x_drv_is_fifo_event(&vc921x_dev)) - { - ppg_num = sample_result_info_ptr->slot_result[0].ppg_num; - if (ppg_num > 40) - break; - vc921x_get_board_gsensor_data(&gsensor_num, ppg_num); - if (WEAR_STA_HOLD == vc921x_dev.wear) - { /*wear is hold,call_algo_func*/ - //vc921x_send_orginal_data(&vc921x_dev, &vc921x_gsensor_data, ppg_num); - } - else - { /*wear is drop,clear_algo_data*/ - } - } - break; - case WORK_MODE_WEAR: - if (vc921x_drv_is_fifo_event(&vc921x_dev)) - { - vc921x_get_board_gsensor_data(&gsensor_num, ppg_num); - if (gsensor_num) - { - vc921x_gsensor_actuating_quantity(vc921x_gsensor_data.xData[0], vc921x_gsensor_data.yData[0], vc921x_gsensor_data.zData[0]); - } - //vc921x_send_orginal_data(&vc921x_dev, &vc921x_gsensor_data, sample_result_info_ptr->slot_result[2].ppg_num); - } - break; - case WORK_MODE_TEMPERATURE: - vc921x_temperature_ntc_calculate(&vc921x_dev); - //vc921x_send_orginal_data(&vc921x_dev, &vc921x_gsensor_data, 1); - //disp_data.temperature_value0 = vc921x_dev.temperature0; - //disp_data.temperature_value1 = vc921x_dev.temperature1; - break; - case WORK_MODE_FACTORY0: - //disp_data.gImx = sample_result_info_ptr->slot_result[0].slot_current; - //disp_data.gPre = sample_result_info_ptr->slot_result[0].u.pre_data; - //disp_data.rImx = sample_result_info_ptr->slot_result[1].slot_current; - //disp_data.rPre = sample_result_info_ptr->slot_result[1].u.pre_data; - //disp_data.ps = sample_result_info_ptr->slot_result[2].u.ps_data; - break; - case WORK_MODE_FACTORY1: - //disp_data.iImx = sample_result_info_ptr->slot_result[0].slot_current; - //disp_data.iPre = sample_result_info_ptr->slot_result[0].u.pre_data; - //disp_data.rImx = sample_result_info_ptr->slot_result[1].slot_current; - //disp_data.rPre = sample_result_info_ptr->slot_result[1].u.pre_data; - break; - case WORK_MODE_HRSPO2: - if (vc921x_drv_is_fifo_event(&vc921x_dev)) - { - ppg_num = sample_result_info_ptr->slot_result[0].ppg_num; - if (ppg_num > 40) - break; - vc921x_get_board_gsensor_data(&gsensor_num, ppg_num); - if (WEAR_STA_HOLD == vc921x_dev.wear) - { - vc921x_dev.heart_rate = vc921x_heart_rate_calculate(&vc921x_dev, 0); - vc921x_dev.spo2 = vc921x_spo2_calculate(&vc921x_dev, 1, 2); - //vc921x_send_orginal_data(&vc921x_dev, &vc921x_gsensor_data, ppg_num); - } - else - { - vc921x_dev.spo2 = 0; - vcSpo2AlgoInit_16bit(); - vcSportMotionAlgoInit(); - vc921x_dev.heart_rate = 0; - Algo_Init(); - } - //disp_data.spo2_val = vc921x_dev.spo2; - //disp_data.hr_rate = vc921x_dev.heart_rate; - } - break; - case WORK_MODE_UNDEFINED: - break; - default: - break; - } - /* 同步处理数据,清理fifo_buffer内存,为下次采样做准备 */ - vc921x_drv_finished_sync(&vc921x_dev); -} - -static const dev_ops vc921x_ops = - { - .dev_init = vc921x_usr_device_init, - .get_dev_info = vc921x_usr_get_dev_info, - .start_work = vc921x_usr_start_work, - .stop_work = vc921x_usr_stop_work, - .soft_reset = vc921x_usr_soft_reset, - .get_events = NULL, - .set_slot_enable = NULL, - .reset_bio_param = vc921x_usr_reset_bio_param, - .get_wear_status = vc921x_usr_get_wear_status, - .dev_irq_handler = vc921x_usr_device_handler, - .dev_check_temp_error = vc921x_usr_check_temperature_abnormal, -}; - -vcare_ppg_device_t *get_vc921x_device(void) -{ - vc921x_dev.ops = &vc921x_ops; - if (vc921x_drv_memroy_alloc()) - { - return NULL; - } - return &vc921x_dev; -} - -/************************************************************************ - * 以下为MCU外设初始化,任务调用 - * example function task_demo_application - ***********************************************************************/ -#if 0 -/* 系统头文件 */ -#include "os_task.h" -//..... -/* 驱动头文件 */ -#include "task_vcare_demo.h" -#include "vc921x_user_app.h" -/* 心率算法头文件 */ -#include "algo.h" - -#define DEMO_TASK_PRIORITY 2 //!< Task priorities -#define DEMO_TASK_STACK_SIZE 1024 * 3 //!< Task stack size -void *demo_task_handle; //!< APP Task handle -void *demo_queue_handle; -static void board_init(void); -void task_demo_application(void *pvParameters) -{ - T_IO_MSG demo_msg; - AlgoSportMode demo_heart_algo_mode = SPORT_TYPE_NORMAL; - unsigned char demo_spo2_algo_mode = 0; - InitParamTypeDef init_config={ 800, WORK_MODE_HR }; - vcare_ppg_device_t *ppg_dev = NULL; - os_msg_queue_create(&demo_queue_handle, 0x10, sizeof(T_IO_MSG)); - /* 通过芯片固定的id寄存器去获取ID,辨别不同的ppg设备,并且获取对应的设备对象 */ - unsigned char id0=0,id1=0; - i2c_read(0x00,&id0,1); - i2c_read(0x01,&id1,1); - if( id0==0x24) /* id0=0x24 */ - { - ppg_dev = get_vc921x_device(); - } - if( ppg_dev ) - { - board_init(); - init_config.work_mode = WORK_MODE_HR; - //init_config.work_mode = WORK_MODE_SPO2; - //init_config.work_mode = WORK_MODE_HRV; - //init_config.work_mode = WORK_MODE_BLOODPRESSURE; - //init_config.work_mode = WORK_MODE_WEAR; - //init_config.work_mode = WORK_MODE_TEMPERATURE; - //init_config.work_mode = WORK_MODE_FACTORY0; - //init_config.work_mode = WORK_MODE_FACTORY1; - ppg_dev->ops->dev_init( &init_config ); - } - while (1) - { - if (os_msg_recv(demo_queue_handle, &demo_msg, 0xFFFFFFFF) == true) - { - switch (demo_msg.subtype) - { - case DEMO_MSG_VC_IRQ_EVENT: - ppg_dev->ops->dev_irq_handler( demo_heart_algo_mode, demo_spo2_algo_mode ); - break; - case DEMO_MSG_KEY_IRQ_EVENT: - //调用初始化切换工作模式,调用ppg_dev->ops->dev_init(...)进行模式切换 - //demo_work_mode_switch(); - break; - case DEMO_MSG_ERR_IRQ: - ppg_device->ops->dev_check_temp_error(); /* 定时校验IC工作状态,并处理异常 */ - break; - default: - break; - } - } - } /* while(1) */ -} - -void task_demo_creat(void) -{ - //example app creat - if (os_task_create(&demo_task_handle, "demo", task_demo_application, NULL, DEMO_TASK_STACK_SIZE, DEMO_TASK_PRIORITY) != true) - { - VCARE_DBG_LOG(" demo_task creat is failed\r\n "); - } -} - -#endif /* end of example function */ diff --git a/code/sdk/zhihui/drivers/rotary_encoder/CMakeLists.txt b/code/sdk/zhihui/drivers/rotary_encoder/CMakeLists.txt index 25532568e..8fbccd694 100644 --- a/code/sdk/zhihui/drivers/rotary_encoder/CMakeLists.txt +++ b/code/sdk/zhihui/drivers/rotary_encoder/CMakeLists.txt @@ -48,6 +48,8 @@ set(SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/mixo/mixo_ots_driver.c ${CMAKE_CURRENT_SOURCE_DIR}/mixo/mixo_ots_access.c ${CMAKE_CURRENT_SOURCE_DIR}/mixo/mixo_at_cmd.c + ${CMAKE_CURRENT_SOURCE_DIR}/mixo/mixo_hal.c + ${CMAKE_CURRENT_SOURCE_DIR}/mixo/mixo_service.c ) set(PUBLIC_HEADER ${CMAKE_CURRENT_SOURCE_DIR}/mixo diff --git a/code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_hal.c b/code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_hal.c new file mode 100644 index 000000000..e4d7dcebb --- /dev/null +++ b/code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_hal.c @@ -0,0 +1,151 @@ +#include "at_cmd_api.h" +#include "pm_control.h" +#include "rotary_encoder_def.h" +#include "debug_print.h" +#include "mixo_ots_driver.h" +#include "custom_utils.h" +#include "pinctrl_porting.h" +#include "mixo_service.h" + +#define MIXO_INT_PIN S_AGPIO_L0 +#define INT_MODE 1 +#define TIMER_MODE 0 + +static uint8_t g_mixo_test_started = 0; +encoder_callback g_encoder_callback = NULL; + +void mixo_int_callback(pin_t pin, uintptr_t param) +{ + PRINT("mixo_int_callback %d 0x%X\n",pin,param); + uapi_gpio_clear_interrupt(pin); + // uapi_pin_set_ie(MIXO_INT_PIN,HAL_PIO_IE_DISABLE); + mixo_start(); // 启动定时器 +} + +void mixo_check(void) +{ + // if(mixo_get_check_mode() == TIMER_MODE) + mixo_ots_timer_callback(); + // else if(mixo_get_check_mode() == INT_MODE) + // { + // mixo_stop(); // 关闭定时器 + // // uapi_pin_set_ie(MIXO_INT_PIN,HAL_PIO_IE_ENBALE); + // } +} + + +void mixo_suspend(void) +{ + mixo_ots_enter_suspend_mode(1); +} + +void mixo_resume(void) +{ + mixo_ots_enter_suspend_mode(0); +} + + +uint32_t mixo_init(void) +{ + if(mixo_ots_init() != ERRCODE_SUCC) + return ERRCODE_FAIL; + + return ERRCODE_SUCC; +} + +static ext_errno mixo_encoder_init(void *attr) +{ + re_print("mixo_encoder_init\r\n"); + return EXT_ERR_SUCCESS; +} +static ext_errno mixo_encoder_deinit(void) +{ + re_print("mixo_encoder_deinit\r\n"); + return EXT_ERR_SUCCESS; +} +static ext_errno mixo_encoder_get_encoderinfo(uint8_t *data, uint8_t data_len) +{; + if (data_len != sizeof(re_input_event_info)) + return EXT_ERR_NOT_SUPPORT; + re_input_event_info *encoder_info = (re_input_event_info*)data; + int16_t diff = mixo_get_crown_result(); + int16_t stand_still = mixo_get_stand_still(); + // re_print("mixo_encoder_get_encoderinfo diff %d stand_still %d\n",diff,stand_still); + if (stand_still == 1 ) + { + encoder_info->re_event = MC_RE_COVER; + }else { + encoder_info->re_event = MC_RE_MOVE; + } + encoder_info->re_event_info.x_axis[0] = diff; + encoder_info->re_event_info.y_axis[0] = diff; + encoder_info->re_event_info.z_axis[0] = diff; + encoder_info->finger_id = 0 ; + encoder_info->point_num = 0 ; + encoder_info->tv_usec = (uint32_t)uapi_tcxo_get_ms(); + //re_print("mixo_encoder_get_encoderinfo %s rotate %d\r\n",encoder_info->re_event == MC_RE_SLIDE_UP?"MC_RE_SLIDE_UP":"MC_RE_SLIDE_DOWN",diff); + + return EXT_ERR_SUCCESS; +} +static ext_errno mixo_encoder_suspend(void) +{ + re_print("mixo_encoder_suspend\r\n"); + return EXT_ERR_SUCCESS; +} +static ext_errno mixo_encoder_resume(void) +{ + re_print("mixo_encoder_resume\r\n"); + mixo_start(); + return EXT_ERR_SUCCESS; +} +static ext_errno mixo_encoder_sleep(void) +{ + re_print("mixo_encoder_sleep\r\n"); + mixo_stop(); + return EXT_ERR_SUCCESS; +} +static ext_errno mixo_encoder_reset(void) +{ + re_print("mixo_encoder_reset\r\n"); + return EXT_ERR_SUCCESS; +} +static ext_errno mixo_encoder_bus_init(void *private_data) +{ + return EXT_ERR_SUCCESS; +} +static ext_errno mixo_register_callback(void *peri_data, encoder_callback func) +{ + re_print("mixo_register_callback\r\n"); + g_encoder_callback = func; + return EXT_ERR_SUCCESS; +} +static ext_errno mixo_unregister_callback(void *peri_data) +{ + re_print("mixo_unregister_callback\r\n"); + g_encoder_callback = NULL; + return EXT_ERR_SUCCESS; +} + +encoder_peripheral_api g_mixo_api = { + .encoder_init = mixo_encoder_init, + .encoder_deinit = mixo_encoder_deinit, + .encoder_get_encoderinfo = mixo_encoder_get_encoderinfo, + .encoder_suspend = mixo_encoder_suspend, + .encoder_resume = mixo_encoder_resume, + .encoder_sleep = mixo_encoder_sleep, + .encoder_reset = mixo_encoder_reset, + .encoder_bus_init = mixo_encoder_bus_init, + .register_callback = mixo_register_callback, + .unregister_callback = mixo_unregister_callback, +}; + + +void *rotary_encoder_get_mixo_api(void) +{ + return ((void *)&g_mixo_api); +} + +void *rotary_encoder_get_mixo_peri_attr(void) +{ + return ((void *)NULL); +} \ No newline at end of file diff --git a/code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_hal.h b/code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_hal.h new file mode 100644 index 000000000..e48f5146d --- /dev/null +++ b/code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_hal.h @@ -0,0 +1,47 @@ +/* + * @Author: penglei 1624952103@qq.com + * @Date: 2024-12-23 15:11:25 + * @LastEditors: penglei 1624952103@qq.com + * @LastEditTime: 2025-07-28 16:52:46 + * @FilePath: /sdk615/code/sdk/zhihui/drivers/rotary_encoder/hx3508/hx3508_hal.h + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE; + */ +/** + * Copyright (c) @CompanyNameMagicTag 2022-2022. All rights reserved. \n + * + * Description: Provides at cmd register func \n + * Author: @CompanyNameTag \n + * History: \n + * 2022-07-20, Create file. \n + */ +#ifndef MIXO_HAL_H +#define MIXO_HAL_H + +#include +#include +#include "errcode.h" +#include "soc_osal.h" +#include "rotary_encoder_def.h" +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif /* __cplusplus */ +#endif /* __cplusplus */ + +void *rotary_encoder_get_mixo_api(void); +void *rotary_encoder_get_mixo_peri_attr(void); + +uint32_t mixo_init(void); + +void mixo_check(void); + +void mixo_suspend(void); +void mixo_resume(void); + +#ifdef __cplusplus +#if __cplusplus +} +#endif /* __cplusplus */ +#endif /* __cplusplus */ + +#endif diff --git a/code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_ots_driver.c b/code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_ots_driver.c index 21e6ed824..34c2068dd 100644 --- a/code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_ots_driver.c +++ b/code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_ots_driver.c @@ -1,10 +1,10 @@ #include "mixo_ots_driver.h" - #include #include - #include "mixo_ots_access.h" #include "cmsis_os2.h" +#include "debug_print.h" +#include "mixo_hal.h" #ifndef ABS #define ABS(x) ((x) > 0 ? (x) : -(x)) @@ -16,17 +16,59 @@ static int dx_sum = 0; -static bool ots_timer_running = false; //ots定时器是否运行标志 +static uint16_t timer_cnt = 0; + +static int16_t ots_result = 0;//ots结果 +static int16_t stand_still = 1; //静止标志 1 静止,0 转动 + +static uint8_t int_mode = 0; -static osTimerId_t g_ots_timer = NULL; +extern encoder_callback g_encoder_callback; -static void ots_timer_callback(void) +static void put_crown_result(int16_t x) +{ + if(abs(x)<=1 ) + { + return; + } + if(abs(x)>=8 ) + { + ots_result += x/8; //大于4的值除以4, 代表角度, 单位0.5° + } + else + { + if(x>0) + { + ots_result+=1; //2~4 默认一个单位, 0.5° + } + else + { + ots_result-=1; //2~4 默认一个单位, 0.5° + } + } + + if (g_encoder_callback != NULL) + g_encoder_callback(); +} + +static void report_zero_data_for_start_stop_flag(void) +{ + ots_result = 0; + + if (g_encoder_callback != NULL) + g_encoder_callback(); +} + +void mixo_ots_timer_callback(void) { uint8_t mot_status = 0x00; mixo_ots_get_mot_status(&mot_status); + // printf("mot_status:0x%x\n",mot_status); if ((mot_status & 0x80) == 0x80) { + timer_cnt = 0; + int_mode = 0; // Get raw datas raw_data_t raw_data; mixo_ots_get_raw_data(&raw_data); @@ -34,35 +76,46 @@ static void ots_timer_callback(void) // Output raw data // printf("%ld,%d,%d,%d,%d\r\n", timestamp, raw_data.dx, raw_data.dy, mot_status, dx_sum); - } -} + // PRINT("%d,%d,%d,%d\r\n",raw_data.dx, raw_data.dy, mot_status, dx_sum); -void mixo_ots_start(void) -{ - if(ots_timer_running == false && g_ots_timer) - { - osTimerStart(g_ots_timer,10); - ots_timer_running = true; - } -} + // ots_result = raw_data.dx; -void mixo_ots_stop(void) -{ - if(ots_timer_running == true && g_ots_timer) + if (stand_still == 1) + { + //上次是静止,上报状态改变 + report_zero_data_for_start_stop_flag(); + } + stand_still = 0; + + put_crown_result(raw_data.dx); + + // if (g_encoder_callback != NULL) + // g_encoder_callback(); + + } + else { - osTimerStop(g_ots_timer); - ots_timer_running = false; + // timer_cnt++; + // if (timer_cnt == 20) // 20*10 = // 200ms:200ms内sensor没有检测到表冠转动就会关闭定时器重新开启中断响应 + // { + // printf("mixo enter int mode\n"); + // /** + // * 此处注意 mixo_ots_forced_clear_int + // * 必须放在 external_int_init 之前去做 + // * 否则可能造成功耗异常的问题 + // */ + // mixo_ots_forced_clear_int(); // 强制拉高MOT脚 + // int_mode = 1; + // } + if (stand_still == 0) + { + //上次是转动,上报状态改变 + report_zero_data_for_start_stop_flag(); + } + stand_still = 1; } } -void mixo_ots_timer_init(void) -{ - g_ots_timer = osTimerNew((osTimerFunc_t)ots_timer_callback, osTimerPeriodic, NULL, NULL); - - if(!g_ots_timer) - PRINT("g_ots_timer init failed \n"); -} - /** * @brief 接收1byte数据 @@ -142,7 +195,7 @@ int mixo_ots_get_raw_data(raw_data_t* raw_data) // If overflowed, clear out the data if ((ABS(raw_data->dx) == 2047) || (ABS(raw_data->dy) == 2047)) { - printf("dy/dx overflowed."); + // printf("dy/dx overflowed."); mixo_ots_reg_read(0x02, &tmp); mixo_ots_reg_read(0x02, &tmp); @@ -246,10 +299,13 @@ int callisto_2x_init(void) return ret; } - +static uint8_t mixo_installized = 0; int mixo_ots_init(void) { + if(mixo_installized) + return 0; + int rc = 0; uint8_t HardWareId = 0; @@ -269,11 +325,13 @@ int mixo_ots_init(void) break; default: printf("OTS Sensor Not Support!\n"); + rc = -1; break; } if(rc == 0) { + mixo_installized = 1; printf("mixo_ots_init succed !!! \n"); } else @@ -283,3 +341,36 @@ int mixo_ots_init(void) return rc; } +int16_t mixo_get_stand_still(void) +{ + return stand_still; +} + +void mixo_clean_result(void) +{ + ots_result = 0; +} + + +int16_t mixo_get_crown_result(void) +{ + int16_t resulttemp; + resulttemp=ots_result; + ots_result = 0; + return resulttemp; +} + +uint8_t mixo_get_check_mode(void) +{ + return int_mode; +} + + +void mixo_get_chip_id(uint16_t *id) +{ + mixo_ots_enter_suspend_mode(0); + uint8_t chip_id[2] = {0}; + mixo_ots_reg_read(0x00, &chip_id[0]); // Read chip-id high byte + mixo_ots_reg_read(0x01, &chip_id[1]); // Read chip-id low byte + *id = (chip_id[0] & 0XFF) << 8 | (chip_id[1] & 0XFF); +} \ No newline at end of file diff --git a/code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_ots_driver.h b/code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_ots_driver.h index 5093bb2ee..9bfa28928 100644 --- a/code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_ots_driver.h +++ b/code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_ots_driver.h @@ -1,3 +1,11 @@ +/* + * @Author: penglei 1624952103@qq.com + * @Date: 2025-01-04 10:53:54 + * @LastEditors: penglei 1624952103@qq.com + * @LastEditTime: 2025-07-28 16:51:32 + * @FilePath: /sdk615/code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_ots_driver.h + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ /* * Copyright (c) 2019 MixoSense Technology Ltd . * @@ -26,4 +34,14 @@ int mixo_ots_get_raw_data(raw_data_t* raw_data); void mixo_ots_forced_clear_int(void); void mixo_ots_enter_suspend_mode(uint8_t true_or_false); +void mixo_ots_start(void); +void mixo_ots_stop(void); + +int16_t mixo_get_stand_still(void); +int16_t mixo_get_crown_result(void); +void mixo_ots_timer_callback(void); +void mixo_clean_result(void); +uint8_t mixo_get_check_mode(void); +void mixo_get_chip_id(uint16_t *id); + #endif //_MXS_DRIVER_H_ diff --git a/code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_service.c b/code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_service.c new file mode 100644 index 000000000..ad62a5b46 --- /dev/null +++ b/code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_service.c @@ -0,0 +1,157 @@ + +#include "debug_print.h" +#include "soc_osal.h" +#include "tcxo.h" +#include "irmalloc.h" +#include "errcode.h" +#include "common_def.h" +#include "tcxo.h" +#include "input_app.h" +#include "cmsis_os2.h" +#include "custom_utils.h" +#include "mixo_hal.h" +#include "mixo_service.h" +#include "pinctrl_porting.h" + +// #include "custom_runtime.h" +/*** + * 其他cmd在Header里定义,对外开放 +*/ +#define MIXO_SERVICE_CMD_TIMER_CHECK 0x11 + +#define MIXO_SERVICE_TIMER_CHECK_MS 20 + +static bool g_mixo_service_initialled = false; + +static bool g_mixo_sensor_exist = false; + +static unsigned long g_app_queue= 0xFFFFFFFF; + +static bool mixo_service_timer_running = false; //ots定时器是否运行标志 + +static osTimerId_t g_mixo_service_timer = NULL; + +void do_mixo_service_check_msg(int cmd); + +static void mixo_service_timer_callback(void) +{ + do_mixo_service_check_msg(MIXO_SERVICE_CMD_TIMER_CHECK); +} + +void mixo_service_timer_start(void) +{ + if(mixo_service_timer_running == false && g_mixo_service_timer) + { + mixo_resume(); + osTimerStart(g_mixo_service_timer,MIXO_SERVICE_TIMER_CHECK_MS); + mixo_service_timer_running = true; + } +} + +void mixo_service_timer_stop(void) +{ + if(mixo_service_timer_running == true && g_mixo_service_timer) + { + mixo_suspend(); + // mixo_clean_result(); + osTimerStop(g_mixo_service_timer); + mixo_service_timer_running = false; + } +} + +void mixo_start(void) +{ + do_mixo_service_check_msg(MIXO_SERVICE_CMD_START_CHECK); +} + +void mixo_stop(void) +{ + do_mixo_service_check_msg(MIXO_SERVICE_CMD_STOP_CHECK); +} + + +void do_mixo_service_check_msg(int cmd) +{ + int ret; + if (g_mixo_sensor_exist == false) + return ; + common_notify_mail_t mail = {0}; + mail.comm.app = cmd; + ret = osal_msg_queue_write_copy(g_app_queue, (void *)&mail, + sizeof(common_notify_mail_t), 0); + if (ret != OSAL_SUCCESS) { + PRINT("Error mixo Check MSG 0x%02X send failed! err=0x%x! \r\n",cmd, ret); + } + +} + +static void mixo_service_check_task(void const *arg) +{ + unused(arg); + int32_t ret; + common_notify_mail_t mail; + uint32_t msgsize = (uint32_t)sizeof(common_notify_mail_t); + while (1) { + ret = osal_msg_queue_read_copy(g_app_queue, (void *)&mail, &msgsize, + OSAL_MSGQ_WAIT_FOREVER); + if (ret != OSAL_SUCCESS) { + continue; + } + + if (mail.comm.app == MIXO_SERVICE_CMD_TIMER_CHECK) { + mixo_check(); + }else if (mail.comm.app == MIXO_SERVICE_CMD_START_CHECK){ + mixo_service_timer_start(); + }else if (mail.comm.app == MIXO_SERVICE_CMD_STOP_CHECK){ + mixo_service_timer_stop(); + } + + + } +} +void create_mixo_queue(void) +{ + + if (osal_msg_queue_create("mixo_service_queue", APP_BOARD_MSG_COUNT, &g_app_queue, + 0, sizeof(common_notify_mail_t)) != ERRCODE_SUCC) { + PRINT("[mixo][service] app create mail fail\n"); + } +} + +#define MIXO_BOARD_TASK_SIZE 0x1000 +errcode_t uapi_mixo_service_init(void) +{ + PRINT("uapi_mixo_service_init !\r\n"); + + if(mixo_init() != ERRCODE_SUCC) + { + //TODO 设置光电编码器检测是否存在标识 + PRINT("mixo not found!\r\n"); + return ERRCODE_FAIL; + } + g_mixo_sensor_exist = true; + + app_task_definition_t taskcfg={0}; + taskcfg.create_queue_handle = create_mixo_queue; + taskcfg.attr.name="mixo_service"; + taskcfg.attr.priority = osPriorityNormal1; + taskcfg.attr.stack_size = MIXO_BOARD_TASK_SIZE; + taskcfg.func = mixo_service_check_task; + taskcfg.use_mem = USE_EXTEND_MEM; + + errcode_t ret=uapi_create_osThread_custom(&taskcfg); + if(ret != ERRCODE_SUCC) + { + PRINT("create mixo_service failed %d!\r\n",ret); + return ERRCODE_FAIL; + } + + // mixo_init(); + + g_mixo_service_timer = osTimerNew((osTimerFunc_t)mixo_service_timer_callback, osTimerPeriodic, NULL, NULL); + + mixo_start(); + + return ERRCODE_SUCC; +} + diff --git a/code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_service.h b/code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_service.h new file mode 100644 index 000000000..98b91d0ac --- /dev/null +++ b/code/sdk/zhihui/drivers/rotary_encoder/mixo/mixo_service.h @@ -0,0 +1,45 @@ +/* + * @Author: penglei 1624952103@qq.com + * @Date: 2024-12-23 15:12:01 + * @LastEditors: penglei 1624952103@qq.com + * @LastEditTime: 2025-07-28 16:55:36 + * @FilePath: /sdk615/code/sdk/zhihui/drivers/mixo/service/mixo_service.h + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ +/** + * Copyright (c) @CompanyNameMagicTag 2022-2022. All rights reserved. \n + * + * Description: Test adc header \n + * Author: @CompanyNameTag \n + * History: \n + * 2022-08-16, Create file. \n + */ + +#ifndef MIXO_SERVICE_H__ +#define MIXO_SERVICE_H__ + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif /* __cplusplus */ +#endif /* __cplusplus */ + +#include "stdint.h" +#include "errcode.h" +#include "platform_core.h" + +#define MIXO_SERVICE_CMD_START_CHECK 0x12 +#define MIXO_SERVICE_CMD_STOP_CHECK 0x13 + +errcode_t uapi_mixo_service_init(void); +void uapi_mixo_service_deinit(void); +void do_mixo_service_check_msg(int cmd); +void mixo_start(void); +void mixo_stop(void); +#ifdef __cplusplus +#if __cplusplus +} +#endif /* __cplusplus */ +#endif /* __cplusplus */ + +#endif \ No newline at end of file diff --git a/code/sdk/zhihui/drivers/rotary_encoder/rotary_encoder_drv.c b/code/sdk/zhihui/drivers/rotary_encoder/rotary_encoder_drv.c index 6d1e53190..d729f2895 100644 --- a/code/sdk/zhihui/drivers/rotary_encoder/rotary_encoder_drv.c +++ b/code/sdk/zhihui/drivers/rotary_encoder/rotary_encoder_drv.c @@ -13,17 +13,12 @@ #include "rotary_encoder_def.h" #include "input_app.h" -#ifdef ROTARYENCODER_HX3507 +#ifdef ROTARYENCODER_MIXO +#include "mixo_hal.h" +#elif defined ROTARYENCODER_HX3507 #include "hx3507_hal.h" #endif -#ifdef ROTARYENCODER_HX3508 -#include "hx3508_hal.h" -#endif - -#ifdef ROTARYENCODER_U8 -#include "crown_hal.h" -#endif // #if defined(TPTYPE_TMA525B) // #include "tma525b_drv1.h" // #include "tma525b_ctrl.h" @@ -425,12 +420,9 @@ uint32_t re_init(void) #ifdef ROTARYENCODER_HX3507 g_encoder_drv.private_data = rotary_encoder_get_hx3507_peri_attr(); g_encoder_drv.encoder_api = rotary_encoder_get_hx3507_api(); -#elif defined ROTARYENCODER_HX3508 - g_encoder_drv.private_data = rotary_encoder_get_hx3508_peri_attr(); - g_encoder_drv.encoder_api = rotary_encoder_get_hx3508_api(); -#elif defined ROTARYENCODER_U8 - g_encoder_drv.private_data = rotary_encoder_get_crown_peri_attr(); - g_encoder_drv.encoder_api = rotary_encoder_get_crown_api(); +#elif defined ROTARYENCODER_MIXO + g_encoder_drv.private_data = rotary_encoder_get_mixo_peri_attr(); + g_encoder_drv.encoder_api = rotary_encoder_get_mixo_api(); #endif g_encoder_drv.ops = &g_re_status_ops; redd = rotary_encoder_get_driver_data(); @@ -471,10 +463,8 @@ void rotary_encoder_suspend(void) /**灭屏,关闭Encoder*/ #ifdef ROTARYENCODER_HX3507 encoder_ptr = rotary_encoder_get_hx3507_api(); -#elif defined ROTARYENCODER_HX3508 - encoder_ptr = rotary_encoder_get_hx3508_api(); -#elif defined ROTARYENCODER_U8 - encoder_ptr = rotary_encoder_get_crown_api(); +#elif defined ROTARYENCODER_MIXO + encoder_ptr = rotary_encoder_get_mixo_api(); #endif if(encoder_ptr == NULL) return; @@ -488,10 +478,8 @@ void rotary_encoder_resume(void) #ifdef ROTARYENCODER_HX3507 /**亮屏,恢复Encoder工作*/ encoder_ptr = (encoder_peripheral_api*)rotary_encoder_get_hx3507_api(); -#elif defined ROTARYENCODER_HX3508 - encoder_ptr = (encoder_peripheral_api*)rotary_encoder_get_hx3508_api(); -#elif defined ROTARYENCODER_U8 - encoder_ptr = (encoder_peripheral_api*)rotary_encoder_get_crown_api(); +#elif defined ROTARYENCODER_MIXO + encoder_ptr = (encoder_peripheral_api*)rotary_encoder_get_mixo_api(); #endif if(encoder_ptr == NULL) return; @@ -518,4 +506,13 @@ void rotary_encoder_restart(void) // uapi_i2c_master_init(TOUCH_I2C_BUS, 400000, I2C_SPEED_MODE_FS); /* 400000: 400KHz */ re_err("rotary_encoder_restart ----------succ!!!\n"); +} + +void rotary_get_chip_id(uint16_t *id) +{ +#ifdef ROTARYENCODER_HX3507 + crown_read_id(id); +#elif defined ROTARYENCODER_MIXO + mixo_get_chip_id(id); +#endif } \ No newline at end of file diff --git a/code/sdk/zhihui/drivers/rotary_encoder/rotary_encoder_drv.h b/code/sdk/zhihui/drivers/rotary_encoder/rotary_encoder_drv.h index 3a37a05fd..ba50d8c61 100644 --- a/code/sdk/zhihui/drivers/rotary_encoder/rotary_encoder_drv.h +++ b/code/sdk/zhihui/drivers/rotary_encoder/rotary_encoder_drv.h @@ -11,6 +11,14 @@ #include "soc_osal.h" #include "rotary_encoder_queue1.h" +#ifdef ROTARYENCODER_HX3507 +#define ROTARY_CHIP_ID 0x30 +#elif defined ROTARYENCODER_MIXO +#define ROTARY_CHIP_ID 0x585b +#else +#define ROTARY_CHIP_ID 0 +#endif + struct re_driver_data { osal_task *task_handle; osal_event event; @@ -29,5 +37,6 @@ struct re_ops { ext_errno rotary_encoder_module_init(void); ext_errno rotary_encoder_module_deinit(void); ext_errno encoder_info_process(void); +void rotary_get_chip_id(uint16_t *id); #endif \ No newline at end of file diff --git a/code/sdk/zhihui/services/battery/service/battery_driver.cpp b/code/sdk/zhihui/services/battery/service/battery_driver.cpp index 31fca19dc..9baeccaa9 100644 --- a/code/sdk/zhihui/services/battery/service/battery_driver.cpp +++ b/code/sdk/zhihui/services/battery/service/battery_driver.cpp @@ -805,7 +805,7 @@ bool batteryservice_get_voltage_by_channel(float *voltage, uint8_t channel) #define GPIO_PIN_CHARGE_STAT S_AGPIO_L29 void disable_charge(void) { -#if defined(BOARD_FD230) || defined(BOARD_W9) +#if defined(BOARD_FD230) || defined(BOARD_W9) || defined(BOARD_N9) // PRINT("disable_charge\r\n"); uapi_pin_set_mode(GPIO_PIN_ENABLE_CHARGE, (pin_mode_t)HAL_PIO_FUNC_GPIO); uapi_gpio_set_dir(GPIO_PIN_ENABLE_CHARGE, GPIO_DIRECTION_OUTPUT); @@ -818,7 +818,7 @@ void disable_charge(void) void enable_charge(void) { -#if defined(BOARD_FD230) || defined(BOARD_W9) +#if defined(BOARD_FD230) || defined(BOARD_W9) || defined(BOARD_N9) // PRINT("enable_charge\r\n"); uapi_pin_set_mode(GPIO_PIN_ENABLE_CHARGE, (pin_mode_t)HAL_PIO_FUNC_GPIO); uapi_gpio_set_dir(GPIO_PIN_ENABLE_CHARGE, GPIO_DIRECTION_OUTPUT); @@ -832,7 +832,7 @@ void enable_charge(void) void enable_02c(void) { -#if defined(BOARD_FD230) || defined(BOARD_W9) +#if defined(BOARD_FD230) || defined(BOARD_W9) || defined(BOARD_N9) // PRINT("enable_charge_02c\r\n"); uapi_pin_set_mode(GPIO_PIN_ENABLE_CHARGE_0_2C, (pin_mode_t)HAL_PIO_FUNC_GPIO); uapi_gpio_set_dir(GPIO_PIN_ENABLE_CHARGE_0_2C, GPIO_DIRECTION_OUTPUT); @@ -852,7 +852,7 @@ uint8_t get_02c_value(void) } void disable_02c(void) { -#if defined(BOARD_FD230) || defined(BOARD_W9) +#if defined(BOARD_FD230) || defined(BOARD_W9) || defined(BOARD_N9) // PRINT("disable_charge_02c\r\n"); uapi_pin_set_mode(GPIO_PIN_ENABLE_CHARGE_0_2C, (pin_mode_t)HAL_PIO_FUNC_GPIO); uapi_gpio_set_dir(GPIO_PIN_ENABLE_CHARGE_0_2C, GPIO_DIRECTION_OUTPUT); diff --git a/code/sdk/zhihui/services/ble_service/blemoder/bleInstruct.cpp b/code/sdk/zhihui/services/ble_service/blemoder/bleInstruct.cpp index 2019a9e75..b92fcd044 100644 --- a/code/sdk/zhihui/services/ble_service/blemoder/bleInstruct.cpp +++ b/code/sdk/zhihui/services/ble_service/blemoder/bleInstruct.cpp @@ -24,7 +24,12 @@ #include "dirent.h" #include "custom_utils.h" -// #include "cywee_hal.h" +#ifdef SUPPORT_CYWEE_SERVICE +#include "cywee_hal.h" +#include "cywee_data.h" +#endif + + // #include "font/base_font.h" // #include "uicomponents/UIComponents.h" @@ -391,7 +396,7 @@ void install_Register_dial( char * name,uint16_t id) void delete_before_file(uint8_t type) { - #ifdef CYWEE_SPORT +#ifdef SUPPORT_CYWEE_SERVICE time_t currtime; struct tm *timeinfo; time(&currtime); @@ -515,7 +520,7 @@ void delete_before_file(uint8_t type) char * ble_sywee_history(uint8_t day,uint16_t *len ,uint8_t type) { - #ifdef CYWEE_SPORT +#ifdef SUPPORT_CYWEE_SERVICE char path_[64]={0}; char timeday[12] = {0}; uapi_get_YYMMDD_Time_extend(timeday, '_',day); diff --git a/code/sdk/zhihui/services/ble_service/blemoder/ble_congfig_adapt.cpp b/code/sdk/zhihui/services/ble_service/blemoder/ble_congfig_adapt.cpp index 5551e854c..e7518122f 100644 --- a/code/sdk/zhihui/services/ble_service/blemoder/ble_congfig_adapt.cpp +++ b/code/sdk/zhihui/services/ble_service/blemoder/ble_congfig_adapt.cpp @@ -11,7 +11,9 @@ #include "ui_service.h" #include "custom_utils.h" - +#ifdef SUPPORT_CYWEE_SERVICE +#include "cywee_service.h" +#endif void set_ota_upgrade_(void) { @@ -204,7 +206,7 @@ void set_user_data_(msg_user_info_t *data) if(data->distance) p_ConfigModel->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_SPORTS_GOAL_DISTANCE,data->distance); -#ifdef CYWEE_SPORT +#ifdef SUPPORT_CYWEE_SERVICE do_cywee_service_check_msg(CYWEE_SERVICE_CMD_SET_USER_INFO, NULL); #endif diff --git a/code/sdk/zhihui/services/ble_service/blemoder/bleinstruct_sample.cpp b/code/sdk/zhihui/services/ble_service/blemoder/bleinstruct_sample.cpp index 2e9c9dad1..17f039e2a 100644 --- a/code/sdk/zhihui/services/ble_service/blemoder/bleinstruct_sample.cpp +++ b/code/sdk/zhihui/services/ble_service/blemoder/bleinstruct_sample.cpp @@ -723,13 +723,13 @@ char * dir_to_json_buf_malloc_(uint8_t type) uint8_t ble_AT_add_nap_data(uint16_t time) { - OHOS::NAP_T data; - data.total_time=time; - uint32_t creationTime; - int ret =uapi_get_timestampe_ss(&creationTime); - data.fall_asleep_timestamp=creationTime-60*60; - data.wake_up_timestamp=creationTime; - set_nap_data(&data); + // OHOS::SLEEP_T data; + // data.total_time=time; + // uint32_t creationTime; + // int ret =uapi_get_timestampe_ss(&creationTime); + // data.fall_asleep_timestamp=creationTime-60*60; + // data.wake_up_timestamp=creationTime; + // set_nap_data(&data); } uint8_t ble_get_sleep_data(uint32_t file_size,uint8_t day_,uint8_t *data) diff --git a/code/sdk/zhihui/services/factorytest_service/factorytest_protocol.c b/code/sdk/zhihui/services/factorytest_service/factorytest_protocol.c index fe67e5dbb..f1b5a4131 100644 --- a/code/sdk/zhihui/services/factorytest_service/factorytest_protocol.c +++ b/code/sdk/zhihui/services/factorytest_service/factorytest_protocol.c @@ -2,7 +2,7 @@ * @Author: penglei 1624952103@qq.com * @Date: 2024-06-17 14:31:08 * @LastEditors: penglei 1624952103@qq.com - * @LastEditTime: 2025-07-14 15:28:33 + * @LastEditTime: 2025-07-28 16:50:17 * @FilePath: /FD230/code/sdk/application/wearable/service/factorytest_service/factorytest_protocol.c * @Description: * @@ -19,16 +19,19 @@ #include "app_common_api.h" #include "lcd_private.h" #include "app_at_process.h" +#include "cywee_hal.h" #ifdef SUPPORT_PPG_SERVICE #include "ppg_service.h" +#include "ppg_hal.h" #endif + #include "button_porting.h" #ifdef SUPPORT_CAT1_SERVICE #include "cat1_ctl.h" #include "cat1_server.h" #endif -#ifdef SUPPORT_PPG_SERVICE +#ifdef PPG_HX3695 #include "hx3695.h" #include "hx3695_hrs_agc.h" #include "hx3695_spo2_agc.h" @@ -46,10 +49,7 @@ #endif #include "battery_service.h" -#ifdef SUPPORT_CYWEE_SERVICE #include "cywee_service.h" -#include "cywee_hal.h" -#endif #include "broadcast_feature.h" #ifdef SUPPORT_TCPIP #include "lwip/api_shell.h" @@ -62,12 +62,10 @@ #include "lqbp_service.h" #include "lqbp002ta.h" #endif -#ifdef ENABLE_HP4507 +#ifdef ENABLE_HP4570 #include "hp4570.h" #endif -#ifdef PPG_VC9202 -#include "vc9202_user.h" -#endif + #ifdef SUPPORT_GNSS #include "gnss_ctl.h" #include "NMEA0183.h" @@ -78,6 +76,14 @@ static gps_data_t send_gps_data = {0}; #include "bp_ble_service.h" #endif +#ifdef ENABLE_GYRO +#include "gyro_service.h" +#include "gyro_hal.h" +#endif + +#include "touch_screen_drv.h" +#include "rotary_encoder_drv.h" + #pragma pack(1) typedef struct factorytest_cmd_header_t { @@ -105,8 +111,7 @@ static osTimerId_t g_ble_acc_timer = NULL; static int aging_time = 0; static uint8_t pwr_button_result = 0; -static uint8_t func_button_result = 0; -static uint8_t func2_button_result = 0; +static uint8_t func_button_result = 1; errcode_t factorytest_protocol_replymsg(uint8_t mode, uint8_t submode,uint8_t testitem, uint8_t *input_data,uint16_t input_len) @@ -167,19 +172,6 @@ static void func_button_callback_long_press_2s(void) func_button_result = 2; } -static void func2_button_callback_press(void) -{ - func2_button_result = 1; -} -static void func2_button_callback_click_2(void) -{ - func2_button_result = 3; -} -static void func2_button_callback_long_press_2s(void) -{ - func2_button_result = 2; -} - void ble_vibrator_check_timer_callback(void) { // uapi_vibrationModeSet(3); @@ -304,8 +296,8 @@ void aging_task(void) // /*********************TP 老化测试*****************************/ //读TP ID uint16_t tp_id; - touch_getid(&tp_id); - if(tp_id != 0x6456) + touch_get_chip_id(&tp_id); + if(tp_id != TP_CHIP_ID) { aging_t.tp_error++; aging_t.fail_num++; @@ -314,22 +306,18 @@ void aging_task(void) /*********************表冠 老化测试*****************************/ //读crown ID -#ifdef ROTARYENCODER_HX3507 - PRINT("crown_read_reg : %X \n",crown_read_reg(0x00)); - if(!(crown_read_reg(0x00) == 0x30)) + uint16_t crown_id = 0; + rotary_get_chip_id(&crown_id); + if(crown_id != ROTARY_CHIP_ID) { aging_t.crown_error++; aging_t.fail_num++; } -#endif PRINT("表冠 失败次数 : %d \r\n",aging_t.crown_error); /*********************充电 老化测试*****************************/ - bool state; - state = uapi_get_charger_plug_status(); - PRINT("充电 uapi_get_charger_plug_status() : %d \r\n",uapi_get_charger_plug_status()); - if(!uapi_get_charger_plug_status()) + if(!get_charge_stat()) { aging_t.charge_error++; aging_t.fail_num++; @@ -355,7 +343,7 @@ void aging_task(void) custom_VibratorFunc_int(4); LOS_Msleep(4000); // uapi_get_timestampe_ss(&age_time); - PRINT("current_time - enter_time[%d]\n",current_time - enter_time); + // PRINT("current_time - enter_time[%d]\n",current_time - enter_time); }while(current_time - enter_time <= 2 * 60); PRINT("马达失败次数 : %d \r\n",aging_t.motor_error); @@ -388,7 +376,7 @@ void aging_task(void) LOS_Msleep(2000); uapi_check_spk(0); aging_t.speaker_error = 0; - PRINT("current_time - enter_time[%d]\n",current_time - enter_time); + // PRINT("current_time - enter_time[%d]\n",current_time - enter_time); }while(current_time - enter_time <= 2 * 60); PRINT("spk失败次数 : %d \r\n",aging_t.speaker_error); /*********************ppg 老化测试*****************************/ @@ -406,24 +394,23 @@ void aging_task(void) return; } uapi_get_timestampe_ss(¤t_time); + + uint32_t green = 0; + uint32_t red = 0; + uint32_t ir = 0; + #ifdef SUPPORT_PPG_SERVICE - send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_DO_SINGLE_CHECK_MODE_TEST); -#endif - LOS_Msleep(200); - #ifdef SUPPORT_PPG_SERVICE - FT_RESULTS_t ft_result = hx3695_factroy_test(SINGLE_CHECK_TEST); - #endif -#ifdef SUPPORT_PPG_SERVICE + send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_DO_LEAKLIGHT_TEST); + LOS_Msleep(2000); + ppg_get_leaklight_data(&green,&red,&ir); send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_STOP_PPG_TEST); #endif - #ifdef SUPPORT_PPG_SERVICE - PRINT("ft_result.gr_data_final : %d , ft_result.red_data_final : %d , ft_result.ir_data_final : %d\r\n",ft_result.gr_data_final,ft_result.red_data_final,ft_result.ir_data_final); - if(!(ft_result.gr_data_final && ft_result.red_data_final && ft_result.ir_data_final)) + PRINT("green : %d , red : %d , ir : %d\r\n",green,red,ir); + if(!green && !red && !ir) { aging_t.ppg_error++; aging_t.fail_num++; } - #endif PRINT("current_time - enter_time[%d]\n",current_time - enter_time); }while(current_time - enter_time <= 2 * 60); @@ -445,19 +432,21 @@ void aging_task(void) return; } uapi_get_timestampe_ss(¤t_time); +#ifdef SUPPORT_CYWEE_SERVICE cywee_get_gsensor_data(1,&g); +#endif if(g.x == 0 && g.y == 0 && g.z == 0) { aging_t.gsensor_error++; aging_t.fail_num++; } LOS_Msleep(1000); - PRINT("current_time - enter_time[%d]\n",current_time - enter_time); + // PRINT("current_time - enter_time[%d]\n",current_time - enter_time); }while(current_time - enter_time <= 2 * 60); PRINT("gsensor失败次数 : %d \r\n",aging_t.gsensor_error); /*********************磁力计 老化测试*****************************/ - float fAzimuth = 0; + float fAzimuth,fPitch,fRoll; total_time = 2 * 60; enter_time = 0; @@ -472,15 +461,19 @@ void aging_task(void) return; } uapi_get_timestampe_ss(¤t_time); - // mmc5603_getdata(&fAzimuth); + do_mag_service_check_msg(MAG_SERVICE_CMD_START_CHECK); + LOS_Msleep(1000); +#ifdef SUPPORT_MAG_SERVICE fAzimuth = mag_get_fAzimuth(); +#endif + do_mag_service_check_msg(MAG_SERVICE_CMD_STOP_CHECK); if(fAzimuth < 0) { aging_t.mag_error++; aging_t.fail_num++; } LOS_Msleep(1000); - PRINT("current_time - enter_time[%d]\n",current_time - enter_time); + // PRINT("current_time - enter_time[%d]\n",current_time - enter_time); }while(current_time - enter_time <= 2 * 60); PRINT("磁力计失败次数 : %d \r\n",aging_t.mag_error); @@ -553,31 +546,18 @@ void factorytest_protocol_common_decode(uint8_t submode,uint8_t testitem,uint8_t factorytest_mode_flag = 1; -#ifdef FD230 ChargerEventPublish(TOPIC_EVENT_CHARGE_UNPLUG,0); //进入产测模式 关闭充电弹窗 uapi_dev_runtime_set_factory_test_status(1); //设置产测模式runtime svr_ble_adv_factory_test_start_param(); //设置蓝牙广播 避免出现连接问题 - - // do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_SET_FACTORY_BLE_ADV,NULL,0); -#endif + factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_COMMON, BLE_TEST_CMD_COMMON_SUB_MODE_SWITCH_MODE, 0x01, &send_data, 1); -#ifdef FD230 uapi_hfp_connect_(); - // uint8_t cmd = BR_HFP_CONNECT; - - // cmd = BR_A2DP_CONNECT; - // do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_BR_CONNECT,&cmd,sizeof(cmd)); - LOS_Msleep(500); - - // cmd = BR_A2DP_CONNECT; - // do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_BR_CONNECT,&cmd,sizeof(cmd)); uapi_a2dp_snk_connect_(); -#endif } else if (testitem == 0x02) { @@ -642,19 +622,21 @@ void factorytest_protocol_common_decode(uint8_t submode,uint8_t testitem,uint8_t if(id != 0x44) send_data[1] |= 1 << 1; - uint8_t mmc_id; + unsigned char mmc_id; #ifdef SUPPORT_MAG_SERVICE - mmc_id = mag_get_chip_id(); + mmc_id = mag_get_chip_id(); #endif if(mmc_id != 0x10) send_data[1] |= 2 << 4; - touch_getid(&tp_id); + touch_get_chip_id(&tp_id); + PRINT("touch_getid : %2X \r\n",tp_id); - if(tp_id != 0x6456) + if(tp_id != TP_CHIP_ID) send_data[1] |= 1 << 4; - - // uapi_ppg_get_id(&id); +#ifdef SUPPORT_PPG_SERVICE + id = ppg_get_chip_id(); +#endif if(id != 0x65) send_data[1] |= 1 << 3; @@ -740,10 +722,8 @@ void factorytest_protocol_common_decode(uint8_t submode,uint8_t testitem,uint8_t { uint8_t send_data = 0x00; - #ifdef SUPPORT_PPG_SERVICE send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_STOP_WEAR_MODE_TEST); send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_STOP_SPO2_TEST); - #endif uapi_set4GCapability(false); @@ -756,9 +736,7 @@ void factorytest_protocol_common_decode(uint8_t submode,uint8_t testitem,uint8_t { uint8_t send_data = 0x00; - #ifdef SUPPORT_CYWEE_SERVICE do_cywee_service_check_msg(CYWEE_SERVICE_CMD_STOP_ACC,NULL); - #endif stop_custom_ble_service(); LOS_Msleep(50); uapi_set4GCapability(false); @@ -887,7 +865,6 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint if(g_ble_vibrator_timer != NULL) { osTimerStop(g_ble_vibrator_timer); - // osTimerDelete(g_ble_vibrator_timer); } factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST, BLE_TEST_CMD_SOFT_TEST_SUB_MODE_VIBRATOR, @@ -905,7 +882,7 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint pwr_button_result = 0; func_button_result = 0; - func2_button_result = 0; + factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST, BLE_TEST_CMD_SOFT_TEST_SUB_MODE_KEY, 0x01, @@ -988,34 +965,6 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint &send_data, 1); } - else if(testitem == 0x08) - { - //开启功能键2测试 - uint8_t send_data = 0; - - uapi_button_unregister_event_cb(BUTTON2_CLICKUP_2); - uapi_button_unregister_event_cb(BUTTON2_LONGPRESS_2S); - - uapi_button_register_event_cb(func2_button_callback_press, BUTTON2_CLICKUP); - uapi_button_register_event_cb(func2_button_callback_click_2, BUTTON2_CLICKUP_2); - uapi_button_register_event_cb(func2_button_callback_long_press_2s, BUTTON2_LONGPRESS_2S); - - factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST, - BLE_TEST_CMD_SOFT_TEST_SUB_MODE_KEY, - 0x08, - &send_data, - 1); - } else if(testitem == 0x09) - { - //查询功能键2测试结果 - uint8_t send_data = func2_button_result; - - factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST, - BLE_TEST_CMD_SOFT_TEST_SUB_MODE_KEY, - 0x09, - &send_data, - 1); - } break; @@ -1094,10 +1043,12 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint { //查询老化标志 uint8_t send_data[3] = {0}; + do_custom_fileoperate_service_check_msg(CUSTOM_FILEOPERATE_MSG_TYPE_AGING_DATA_READ, NULL, 0); + LOS_Msleep(500); - send_data[1] = aging_t.flag; + send_data[1] = aging_result_t.flag; - if(aging_t.fail_num != 0) + if(aging_result_t.fail_num != 0) { send_data[2] = 0x01; } @@ -1324,7 +1275,8 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint //获取TP_ID uint16_t id = 0; uint8_t tp_id[3]; - touch_getid(&id); + + touch_get_chip_id(&id); tp_id[0] = 0; tp_id[1] = id >> 8; @@ -1379,7 +1331,9 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint { //获取原始数据 int16_t x,y; - // get_tp_info(&x,&y); +#ifdef TPTYPE_FT6X46 + get_tp_info(&x,&y); +#endif uint8_t databuf[5] = {0}; databuf[1] = (uint8_t)((x & 0XFF00) >> 8); @@ -1468,7 +1422,7 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint if(testitem == 0x01) { //获取 ppg_id - uint16_t ppg_id; + uint8_t ppg_id; #ifdef SUPPORT_PPG_SERVICE ppg_id = ppg_get_chip_id(); #endif @@ -1477,7 +1431,7 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint BLE_TEST_CMD_SOFT_TEST_SUB_MODE_HRS, 0x01, &ppg_id, - 2); + 1); } else if(testitem == 0x02) { @@ -1493,32 +1447,44 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint 1); } else if(testitem == 0x03) { - //打开心率检测 -#ifdef SUPPORT_PPG_SERVICE - send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_DO_SINGLE_CHECK_MODE_TEST); -#elif defined PPG_VC9202 - send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_DO_PPG_TEST); -#endif - LOS_Msleep(500); + //获取绿灯数据 uint8_t databuf[4] = {0}; -#ifdef SUPPORT_PPG_SERVICE +#ifdef BOARD_FD230 +#ifdef PPG_HX3695 + send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_DO_SINGLE_CHECK_MODE_TEST); + LOS_Msleep(2000); FT_RESULTS_t ft_result = hx3695_factroy_test(SINGLE_CHECK_TEST); + send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_STOP_PPG_TEST); + databuf[0] = (uint8_t)((ft_result.gr_data_final & 0xFF000000) >> 24); databuf[1] = (uint8_t)((ft_result.gr_data_final & 0x00FF0000) >> 16); databuf[2] = (uint8_t)((ft_result.gr_data_final & 0x0000FF00) >> 8); databuf[3] = (uint8_t)((ft_result.gr_data_final & 0x000000FF) >> 0); -#elif defined PPG_VC9202 - uint32_t ppg_data = vc9202_get_hr_ppg_data(); - PRINT("ppg_data : %d \n",ppg_data); - databuf[0] = (uint8_t)((ppg_data & 0xFF000000) >> 24); - databuf[1] = (uint8_t)((ppg_data & 0x00FF0000) >> 16); - databuf[2] = (uint8_t)((ppg_data & 0x0000FF00) >> 8); - databuf[3] = (uint8_t)((ppg_data & 0x000000FF) >> 0); + + PRINT("%2X %2X %2X %2X \r\n",databuf[0],databuf[1],databuf[2],databuf[3]); + + factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST, + BLE_TEST_CMD_SOFT_TEST_SUB_MODE_HRS, + 0x03, + databuf, + 4); +#endif +#elif defined BOARD_N9 + int32_t data = 0; +#ifdef SUPPORT_PPG_SERVICE + send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_DO_PPG_TEST); + LOS_Msleep(2000); + send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_STOP_PPG_TEST); + data = ppg_get_factory_data(); #endif + PRINT("%d\r\n",data); - #ifdef SUPPORT_PPG_SERVICE - send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_STOP_PPG_TEST); - #endif + + databuf[0] = (uint8_t)((data & 0xFF000000) >> 24); + databuf[1] = (uint8_t)((data & 0x00FF0000) >> 16); + databuf[2] = (uint8_t)((data & 0x0000FF00) >> 8); + databuf[3] = (uint8_t)((data & 0x000000FF) >> 0); +#endif PRINT("%2X %2X %2X %2X \r\n",databuf[0],databuf[1],databuf[2],databuf[3]); @@ -1530,55 +1496,50 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint } else if(testitem == 0x04) { - //打开血氧检测 -#ifdef SUPPORT_PPG_SERVICE + uint8_t databuf[4] = {0}; +#ifdef BOARD_FD230 +#ifdef PPG_HX3695 send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_DO_SINGLE_CHECK_MODE_TEST); -#elif defined PPG_VC9202 - send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_DO_SPO2_TEST); -#endif LOS_Msleep(500); - uint8_t databuf[8] = {0}; -#ifdef SUPPORT_PPG_SERVICE FT_RESULTS_t ft_result = hx3695_factroy_test(SINGLE_CHECK_TEST); + send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_STOP_PPG_TEST); + databuf[0] = (uint8_t)((ft_result.red_data_final & 0xFF000000) >> 24); databuf[1] = (uint8_t)((ft_result.red_data_final & 0x00FF0000) >> 16); databuf[2] = (uint8_t)((ft_result.red_data_final & 0x0000FF00) >> 8); databuf[3] = (uint8_t)((ft_result.red_data_final & 0x000000FF) >> 0); -#elif defined PPG_VC9202 - uint32_t red_data = 0; - uint32_t ir_data = 9; - vc9202_get_spo2_ppg_data(&ir_data,&red_data); - PRINT("ir_data : %d ,red_data : %d \n",ir_data,red_data); - databuf[0] = (uint8_t)((ir_data & 0xFF000000) >> 24); - databuf[1] = (uint8_t)((ir_data & 0x00FF0000) >> 16); - databuf[2] = (uint8_t)((ir_data & 0x0000FF00) >> 8); - databuf[3] = (uint8_t)((ir_data & 0x000000FF) >> 0); - - databuf[4] = (uint8_t)((red_data & 0xFF000000) >> 24); - databuf[5] = (uint8_t)((red_data & 0x00FF0000) >> 16); - databuf[6] = (uint8_t)((red_data & 0x0000FF00) >> 8); - databuf[7] = (uint8_t)((red_data & 0x000000FF) >> 0); #endif - #ifdef SUPPORT_PPG_SERVICE +#elif defined BOARD_N9 + //获取红灯数据 + int32_t data = 0; +#ifdef SUPPORT_PPG_SERVICE + send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_DO_SPO2_TEST); + LOS_Msleep(2000); send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_STOP_PPG_TEST); - #endif + data = ppg_get_factory_data(); +#endif + PRINT("%d\r\n",data); + + + databuf[0] = (uint8_t)((data & 0xFF000000) >> 24); + databuf[1] = (uint8_t)((data & 0x00FF0000) >> 16); + databuf[2] = (uint8_t)((data & 0x0000FF00) >> 8); + databuf[3] = (uint8_t)((data & 0x000000FF) >> 0); +#endif PRINT("%2X %2X %2X %2X \r\n",databuf[0],databuf[1],databuf[2],databuf[3]); - PRINT("%2X %2X %2X %2X \r\n",databuf[4],databuf[5],databuf[6],databuf[7]); factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST, BLE_TEST_CMD_SOFT_TEST_SUB_MODE_HRS, 0x04, databuf, - sizeof(databuf)); + 4); } else if(testitem == 0x05) { +#ifdef PPG_HX3695 //灰卡测试 - #ifdef SUPPORT_PPG_SERVICE send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_DO_GRAYCARD_TEST); - #endif - LOS_Msleep(500); -#ifdef SUPPORT_PPG_SERVICE + LOS_Msleep(2000); uint8_t databuf[12] = {0}; FT_RESULTS_t ft_result = hx3695_factroy_test(GRAY_CARD_TEST); databuf[0] = (uint8_t)((ft_result.gr_data_final & 0xFF000000) >> 24); @@ -1601,31 +1562,8 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint 0x05, databuf, 12); -#elif defined PPG_VC9202 - uint8_t databuf[8] = {0}; - uint32_t apre_val = 0; - uint32_t aps_val = 9; - vc9202_get_graycard_data(&apre_val,&aps_val); - PRINT("apre_val : %d ,aps_val : %d \n",apre_val,aps_val); - databuf[0] = (uint8_t)((apre_val & 0xFF000000) >> 24); - databuf[1] = (uint8_t)((apre_val & 0x00FF0000) >> 16); - databuf[2] = (uint8_t)((apre_val & 0x0000FF00) >> 8); - databuf[3] = (uint8_t)((apre_val & 0x000000FF) >> 0); - - databuf[4] = (uint8_t)((aps_val & 0xFF000000) >> 24); - databuf[5] = (uint8_t)((aps_val & 0x00FF0000) >> 16); - databuf[6] = (uint8_t)((aps_val & 0x0000FF00) >> 8); - databuf[7] = (uint8_t)((aps_val & 0x000000FF) >> 0); - - factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST, - BLE_TEST_CMD_SOFT_TEST_SUB_MODE_HRS, - 0x05, - databuf, - 8); -#endif - #ifdef SUPPORT_PPG_SERVICE send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_STOP_PPG_TEST); - #endif +#endif // PRINT("%2X %2X %2X %2X %2X %2X %2X %2X %2X %2X %2X %2X\r\n", // databuf[0],databuf[1],databuf[2],databuf[3], // databuf[4],databuf[5],databuf[6],databuf[7], @@ -1636,52 +1574,33 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint } else if(testitem == 0x06) { //漏光测试 - #ifdef SUPPORT_PPG_SERVICE - send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_DO_LEAKLIGHT_TEST); - #endif - LOS_Msleep(500); uint8_t databuf[12] = {0}; + + uint32_t green = 0; + uint32_t red = 0; + uint32_t ir = 0; + #ifdef SUPPORT_PPG_SERVICE - FT_RESULTS_t ft_result = hx3695_factroy_test(LEAK_LIGHT_TEST); + send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_DO_LEAKLIGHT_TEST); + LOS_Msleep(2000); + ppg_get_leaklight_data(&green,&red,&ir); + send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_STOP_PPG_TEST); +#endif + databuf[0] = (uint8_t)((green & 0xFF000000) >> 24); + databuf[1] = (uint8_t)((green & 0x00FF0000) >> 16); + databuf[2] = (uint8_t)((green & 0x0000FF00) >> 8); + databuf[3] = (uint8_t)((green & 0x000000FF) >> 0); - databuf[0] = (uint8_t)((ft_result.gr_data_final & 0xFF000000) >> 24); - databuf[1] = (uint8_t)((ft_result.gr_data_final & 0x00FF0000) >> 16); - databuf[2] = (uint8_t)((ft_result.gr_data_final & 0x0000FF00) >> 8); - databuf[3] = (uint8_t)((ft_result.gr_data_final & 0x000000FF) >> 0); + databuf[4] = (uint8_t)((red & 0xFF000000) >> 24); + databuf[5] = (uint8_t)((red & 0x00FF0000) >> 16); + databuf[6] = (uint8_t)((red & 0x0000FF00) >> 8); + databuf[7] = (uint8_t)((red & 0x000000FF) >> 0); - databuf[4] = (uint8_t)((ft_result.red_data_final & 0xFF000000) >> 24); - databuf[5] = (uint8_t)((ft_result.red_data_final & 0x00FF0000) >> 16); - databuf[6] = (uint8_t)((ft_result.red_data_final & 0x0000FF00) >> 8); - databuf[7] = (uint8_t)((ft_result.red_data_final & 0x000000FF) >> 0); + databuf[8] = (uint8_t)((ir & 0xFF000000) >> 24); + databuf[9] = (uint8_t)((ir & 0x00FF0000) >> 16); + databuf[10] = (uint8_t)((ir & 0x0000FF00) >> 8); + databuf[11] = (uint8_t)((ir & 0x000000FF) >> 0); - databuf[8] = (uint8_t)((ft_result.ir_data_final & 0xFF000000) >> 24); - databuf[9] = (uint8_t)((ft_result.ir_data_final & 0x00FF0000) >> 16); - databuf[10] = (uint8_t)((ft_result.ir_data_final & 0x0000FF00) >> 8); - databuf[11] = (uint8_t)((ft_result.ir_data_final & 0x000000FF) >> 0); -#elif defined PPG_VC9202 - uint32_t led_cur = 0; - uint32_t apre_val = 0; - uint32_t aps_val = 9; - vc9202_get_leaklight_data(&led_cur,&apre_val,&aps_val); - PRINT("led_cur : %d ,apre_val : %d ,aps_val : %d \n",led_cur,apre_val,aps_val); - databuf[0] = (uint8_t)((led_cur & 0xFF000000) >> 24); - databuf[1] = (uint8_t)((led_cur & 0x00FF0000) >> 16); - databuf[2] = (uint8_t)((led_cur & 0x0000FF00) >> 8); - databuf[3] = (uint8_t)((led_cur & 0x000000FF) >> 0); - - databuf[4] = (uint8_t)((apre_val & 0xFF000000) >> 24); - databuf[5] = (uint8_t)((apre_val & 0x00FF0000) >> 16); - databuf[6] = (uint8_t)((apre_val & 0x0000FF00) >> 8); - databuf[7] = (uint8_t)((apre_val & 0x000000FF) >> 0); - - databuf[8] = (uint8_t)((aps_val & 0xFF000000) >> 24); - databuf[9] = (uint8_t)((aps_val & 0x00FF0000) >> 16); - databuf[10] = (uint8_t)((aps_val & 0x0000FF00) >> 8); - databuf[11] = (uint8_t)((aps_val & 0x000000FF) >> 0); -#endif - #ifdef SUPPORT_PPG_SERVICE - send_ppg_cmd_msg(PPG_SERVICE_CMD_TYPE_STOP_PPG_TEST); - #endif // PRINT("%2X %2X %2X %2X %2X %2X %2X %2X %2X %2X %2X %2X\r\n", // databuf[0],databuf[1],databuf[2],databuf[3], @@ -1703,7 +1622,9 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint { //获取mmc5603 ID unsigned char chip_id; - mmc5603_getid(&chip_id); +#ifdef SUPPORT_MAG_SERVICE + chip_id = mag_get_chip_id(); +#endif factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST, BLE_TEST_CMD_SOFT_TEST_SUB_MODE_COMPASS, @@ -1714,48 +1635,59 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint } else if(testitem == 0x02) { //地磁sensor测试 - float fAzimuth = 0; + float fAzimuth,fPitch,fRoll; + do_mag_service_check_msg(MAG_SERVICE_CMD_START_CHECK); - LOS_Msleep(500); - // mmc5603_getdata(&fAzimuth); + LOS_Msleep(1000); +#ifdef SUPPORT_MAG_SERVICE fAzimuth = mag_get_fAzimuth(); +#endif do_mag_service_check_msg(MAG_SERVICE_CMD_STOP_CHECK); +#ifdef BOARD_FD230 + + uint8_t databuf[6] = {0}; + + databuf[0] = (uint8_t)(((uint32_t)fAzimuth & 0xFF00) >> 8); + databuf[1] = (uint8_t)((uint32_t)fAzimuth & 0x00FF); + + databuf[2] = (uint8_t)(((uint32_t)fPitch & 0xFF00) >> 8); + databuf[3] = (uint8_t)((uint32_t)fPitch & 0x00FF); + + databuf[4] = (uint8_t)(((uint32_t)fRoll & 0xFF00) >> 8); + databuf[5] = (uint8_t)((uint32_t)fRoll & 0x00FF); + + PRINT("%2X %2X %2X %2X %2X %2X\r\n",databuf[0],databuf[1],databuf[2],databuf[3],databuf[4],databuf[5]); + + factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST, + BLE_TEST_CMD_SOFT_TEST_SUB_MODE_COMPASS, + 0x02, + databuf, + 6); + +#elif defined BOARD_N9 uint8_t databuf[2] = {0}; databuf[0] = (uint8_t)(((uint32_t)fAzimuth & 0xFF00) >> 8); databuf[1] = (uint8_t)((uint32_t)fAzimuth & 0x00FF); - // PRINT("%2X %2X %2X %2X %2X %2X\r\n",databuf[0],databuf[1],databuf[2],databuf[3],databuf[4],databuf[5]); + PRINT("%2X %2X\r\n",databuf[0],databuf[1]); factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST, BLE_TEST_CMD_SOFT_TEST_SUB_MODE_COMPASS, 0x02, databuf, - sizeof(databuf)); + 2); +#endif } break; case BLE_TEST_CMD_SOFT_TEST_SUB_MODE_PM: - if(testitem == 0x01) - { - //获取充电IC ID - uint8_t chip_id = 0; -#ifdef ENABLE_HP4507 - chip_id = hp4507_get_id(); - PRINT("chip id = 0x%x\n",chip_id); -#endif - factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST, - BLE_TEST_CMD_SOFT_TEST_SUB_MODE_PM, - 0x01, - &chip_id, - 1); - } - else if(testitem == 0x02) + if(testitem == 0x02) { //获取充电状态 bool state; - state = get_charge_stat(); + state = uapi_get_charger_plug_status(); uint8_t send_data[2] = {0}; send_data[1] = state; factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST, @@ -1767,12 +1699,12 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint } else if(testitem == 0x03) { //获取电量 - float voltage; - uint8_t power = battery_get_voltage(&voltage); - + uint8_t power; + battery_getvolpower(&power); + uint8_t send_data[3] = {0}; send_data[2] = power & 0XFF; - PRINT("power : %d \n",power); + factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST, BLE_TEST_CMD_SOFT_TEST_SUB_MODE_PM, 0x03, @@ -1783,13 +1715,13 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint //获取电压 float voltage; uint16_t vol; - battery_get_voltage(&voltage); + battery_getvoltage(&voltage); uint8_t send_data[3] = {0}; vol = voltage * 1000; send_data[1] = (vol >> 8) ; send_data[2] = vol; - PRINT("vol : %d \n",vol); + factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST, BLE_TEST_CMD_SOFT_TEST_SUB_MODE_PM, 0x04, @@ -1807,29 +1739,7 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint 1); LOS_Mdelay(100); uapi_poweroff_device(); - } else if(testitem == 0x06) - { - //切换vbus供电测电流 - uint8_t send_data = 0x00; -#ifdef ENABLE_HP4507 - hp45xxx_init(HP4570C9); - hp45xxx_set_batfet_dis(true); - // hp45xxx_set_ceb_en(true); - hp45xxx_set_hiz_en(false); - LOS_Mdelay(50); - if (hp45xxx_read_status_vbus_pg()) - PRINT("VBUS is in Power Good state\n"); - else - PRINT("VBUS is not in Power Good state\n"); - -#endif - factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST, - BLE_TEST_CMD_SOFT_TEST_SUB_MODE_PM, - 0x06, - &send_data, - 1); } - break; @@ -1917,6 +1827,11 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint //查看sim卡插入状态 uint8_t send_data = 0; send_data = uapi_dev_runtime_get_cat1_simstat(); + if(!send_data) + { + LOS_Msleep(1000); + send_data = uapi_dev_runtime_get_cat1_simstat(); + } factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST, BLE_TEST_CMD_SOFT_TEST_SUB_MODE_CAT1, 0x03, @@ -1949,6 +1864,13 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint { //查看iMei号 char* imei = uapi_dev_runtime_get_cat1_imei(); + uint8_t retry = 0; + while(strlen(imei) == 0 && retry < 3) + { + retry++; + LOS_Msleep(2000); + imei = uapi_dev_runtime_get_cat1_imei(); + } PRINT("imei : %s \r\n",imei); factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST, @@ -2148,7 +2070,6 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint uint8_t send_data= 0; // uapi_start_audio_test(30); uapi_microhone_switch(1); - // do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_START_MIC,NULL,0); factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST, BLE_TEST_CMD_SOFT_TEST_SUB_MODE_SPEAKER, 0x01, @@ -2161,7 +2082,6 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint uint8_t send_data= 0; // uapi_stop_audio_test(); uapi_microhone_switch(0); - // do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_STOP_MIC,NULL,0); factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST, BLE_TEST_CMD_SOFT_TEST_SUB_MODE_SPEAKER, 0x02, @@ -2173,7 +2093,6 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint //播放录音 uint8_t send_data= 0; uapi_check_mic(1); - // do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_START_CHECK_MIC,NULL,0); factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST, BLE_TEST_CMD_SOFT_TEST_SUB_MODE_SPEAKER, 0x03, @@ -2184,7 +2103,6 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint //停止播放 uint8_t send_data= 0; uapi_check_mic(0); - // do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_STOP_CHECK_MIC,NULL,0); factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST, BLE_TEST_CMD_SOFT_TEST_SUB_MODE_SPEAKER, 0x04, @@ -2199,129 +2117,20 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint 0x05, &send_data, 1); - } else if(testitem == 0x06) - { - //播放扫频文件 - uint8_t send_data = 0; - uapi_check_spk(2); - factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST, - BLE_TEST_CMD_SOFT_TEST_SUB_MODE_SPEAKER, - 0x06, - &send_data, - 1); - } else if(testitem == 0x07) - { - //删除扫频文件 - uint8_t send_data = uapi_delete_files("/user/music/20-20KHZ.mp3"); - factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST, - BLE_TEST_CMD_SOFT_TEST_SUB_MODE_SPEAKER, - 0x07, - &send_data, - 1); } - else if (testitem == 0x08) - { - uint8_t send_data = 0x00; - - send_data = factorytest_upload_mic_file(); - factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST, - BLE_TEST_CMD_SOFT_TEST_SUB_MODE_SPEAKER, - 0x08, - &send_data, - 1); - } - - -// else if (testitem == 0x08) -// { -// uint8_t send_data = 0x00; -// #ifdef FD230 -// uapi_hfp_connect_(); -// LOS_Msleep(500); -// uapi_a2dp_snk_connect_(); -// #endif -// factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST, -// BLE_TEST_CMD_SOFT_TEST_SUB_MODE_SPEAKER, -// 0x03, -// &send_data, -// 1); -// } - - break; - - case BLE_TEST_CMD_SOFT_TEST_SUB_MODE_LQBP: - - if (testitem == 0x01) + if (testitem == 0x06) { uint8_t send_data = 0x00; -#ifdef ENABLE_LQBP002TA - send_data = lqbp002ta_get_id(); - PRINT("send_data : 0x%x \n",send_data); -#endif + uapi_hfp_connect_(); + LOS_Msleep(500); + uapi_a2dp_snk_connect_(); factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST, - BLE_TEST_CMD_SOFT_TEST_SUB_MODE_LQBP, - 0x01, + BLE_TEST_CMD_SOFT_TEST_SUB_MODE_SPEAKER, + 0x03, &send_data, 1); - } else if(testitem == 0x02) - { - //获取温度 - uint8_t databuf[4] = {0}; - float temp = 0; -#ifdef ENABLE_LQBP002TA - do_lqbp_service_check_msg(LQBP_SERVICE_CMD_START_CHECK); - LOS_Msleep(100); - temp = lqbp002ta_get_temp(); - do_lqbp_service_check_msg(LQBP_SERVICE_CMD_STOP_CHECK); -#endif - PRINT("temp : %f\n",temp); - - int integer_part = (int)temp; - - int decimal_part = (int)((temp - integer_part) * 100); - - PRINT("integer_part : %d , decimal_part : %d\n",integer_part,decimal_part); - - databuf[0] = (uint8_t)((integer_part >> 8) & 0xFF); - databuf[1] = (uint8_t)(integer_part & 0xFF); - - databuf[2] = (uint8_t)((decimal_part >> 8) & 0xFF); - databuf[3] = (uint8_t)(decimal_part & 0xFF); - - factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST, - BLE_TEST_CMD_SOFT_TEST_SUB_MODE_LQBP, - 0x02, - databuf, - sizeof(databuf)); - } else if(testitem == 0x03) - { - //获取气压 - uint8_t databuf[4] = {0}; - int pressure = 0; -#ifdef ENABLE_LQBP002TA - do_lqbp_service_check_msg(LQBP_SERVICE_CMD_START_CHECK); - LOS_Msleep(100); - pressure = (int)lqbp002ta_get_pressure(); - do_lqbp_service_check_msg(LQBP_SERVICE_CMD_STOP_CHECK); -#endif - PRINT("pressure : %d\n",pressure); - - // memcpy(databuf, &pressure, sizeof(pressure)); - databuf[0] = (uint8_t)((pressure & 0xFF000000) >> 24); - databuf[1] = (uint8_t)((pressure & 0x00FF0000) >> 16); - databuf[2] = (uint8_t)((pressure & 0x0000FF00) >> 8); - databuf[3] = (uint8_t)((pressure & 0x000000FF) >> 0); - - factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST, - BLE_TEST_CMD_SOFT_TEST_SUB_MODE_LQBP, - 0x03, - databuf, - sizeof(databuf)); } - - break; - case BLE_TEST_CMD_SOFT_TEST_SUB_MODE_GPS: if (testitem == 0x01) @@ -2335,7 +2144,7 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint gnss_start(); LOS_Msleep(100); do{ - gps_data_t *gps_data = getGPSGlobaldata(); + gps_data_t *gps_data = getPGPSGlobaldata(); if(gps_data == NULL) { PRINT("gps_data == NULL \n"); @@ -2359,8 +2168,8 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint memset_s(time,sizeof(time),0,sizeof(time)); sprintf_s(time,sizeof(time),"%d",send_data); strcat_s(tmp,sizeof(tmp),time); - // PRINT("send_gps_data.status : %d time : %d\n",send_gps_data.status,send_data); - // PRINT("tmp : %s size : %d\n",tmp,strlen(tmp)); + PRINT("send_gps_data.status : %d time : %d\n",send_gps_data.status,send_data); + PRINT("tmp : %s size : %d\n",tmp,strlen(tmp)); factorytest_protocol_replymsg(BLE_TEST_CMD_MODE_SOFT_TEST, BLE_TEST_CMD_SOFT_TEST_SUB_MODE_GPS, 0x01, @@ -2402,6 +2211,7 @@ void factorytest_protocol_soft_test_decode(uint8_t submode,uint8_t testitem,uint } break; + break; default: printf(""); @@ -2440,7 +2250,7 @@ errcode_t factorytest_protocol_decode(uint8_t *buf, uint16_t event_size) printf("crc16 0x%04X vs 0x%04X\n",crc16,crc16_2); - if( crc16 == crc16_2) //校验通过,开始正式解析 + // if( crc16 == crc16_2) //校验通过,开始正式解析 { if(factorytest_mode_flag == 0 && header.submod != BLE_TEST_CMD_COMMON_SUB_MODE_SWITCH_MODE) return ERRCODE_FAIL; @@ -2472,15 +2282,12 @@ errcode_t factorytest_protocol_decode(uint8_t *buf, uint16_t event_size) } - } - else if(header.header == BLE_TEST_BN02_HEADER) + }else if(header.header == BLE_TEST_BN02_HEADER) { #ifdef ENABLE_BN02 bn02_parse_frame(buf,event_size); #endif - } - else - { + }else{ printf("crc error!\r\n"); return ERRCODE_FAIL; } diff --git a/code/sdk/zhihui/services/gnss/driver/common/interface/board_interface/board_porting/tiot_board_pin_port.h b/code/sdk/zhihui/services/gnss/driver/common/interface/board_interface/board_porting/tiot_board_pin_port.h index 1a3570652..4d849083e 100644 --- a/code/sdk/zhihui/services/gnss/driver/common/interface/board_interface/board_porting/tiot_board_pin_port.h +++ b/code/sdk/zhihui/services/gnss/driver/common/interface/board_interface/board_porting/tiot_board_pin_port.h @@ -41,7 +41,7 @@ extern "C" { #define TIOT_PIN_UART_RTS S_MGPIO21 #define TIOT_PINMUX HAL_PIO_FUNC_UART1 -#elif defined(BOARD_L22) || defined(BOARD_W9) +#elif defined(BOARD_L22) || defined(BOARD_W9) || defined(BOARD_N9) #define TIOT_UART_PORT UART_BUS_1 #define TIOT_PIN_WAKEUP_HOST_NUM S_AGPIO_L15 /* 用于唤醒HOST. */ #define TIOT_PIN_WAKEUP_GNSS_NUM S_HGPIO0 /* 用于 唤醒GNSS. */ diff --git a/code/sdk/zhihui/services/gnss/src/gnss_ctl.c b/code/sdk/zhihui/services/gnss/src/gnss_ctl.c index ce8914b57..b0fe28fd8 100644 --- a/code/sdk/zhihui/services/gnss/src/gnss_ctl.c +++ b/code/sdk/zhihui/services/gnss/src/gnss_ctl.c @@ -62,7 +62,7 @@ S_AGPIO_L28 GPS_1V8 PRINT("GPS_PWREN set_value S_AGPIO_L30 GPIO_LEVEL_HIGH ret %d\n",ret); -#elif defined (BOARD_L22) || defined (BOARD_W9) +#elif defined (BOARD_L22) || defined (BOARD_W9) || defined(BOARD_N9) ret=uapi_gpio_set_dir(S_AGPIO_L16,GPIO_DIRECTION_OUTPUT); PRINT("set_dir S_AGPIO_L16,GPIO_DIRECTION_OUTPUT ret %d\n",ret); @@ -127,7 +127,7 @@ S_AGPIO_L28 GPS_1V8 PRINT("GPS_PWRON set_value S_AGPIO_L30 GPIO_LEVEL_LOW ret %d\n",ret); -#elif defined (BOARD_L22) || defined (BOARD_W9) +#elif defined (BOARD_L22) || defined (BOARD_W9) || defined(BOARD_N9) ret=uapi_gpio_set_dir(S_AGPIO_L16,GPIO_DIRECTION_OUTPUT); PRINT("set_dir S_AGPIO_L16,GPIO_DIRECTION_OUTPUT ret %d\n",ret); diff --git a/code/sdk/zhihui/utils/custom_fileoperate_service.c b/code/sdk/zhihui/utils/custom_fileoperate_service.c index 9362b3473..b5fc9956a 100644 --- a/code/sdk/zhihui/utils/custom_fileoperate_service.c +++ b/code/sdk/zhihui/utils/custom_fileoperate_service.c @@ -178,16 +178,16 @@ static void custom_fileoperate_service_check_task(void const *arg) break; case CUSTOM_FILEOPERATE_MSG_TYPE_SLEEPDATA_READ: #ifdef SUPPORT_CYWEE_SERVICE - custom_read_sleep_data(); + // custom_read_sleep_data(); #endif break; case CUSTOM_FILEOPERATE_MSG_TYPE_NAPDATA_READ: #ifdef SUPPORT_CYWEE_SERVICE - custom_read_nap_data(); + // custom_read_nap_data(); #endif break; case CUSTOM_FILEOPERATE_MSG_TYPE_SLEEPMODLE_UPDATE: - custom_sleep_model_updata(); + // custom_sleep_model_updata(); break; case CUSTOM_FILEOPERATE_MSG_TYPE_MMCDATA_SAVE: // mmc5603_savePara_infile(); @@ -226,7 +226,7 @@ static void custom_fileoperate_service_check_task(void const *arg) case CUSTOM_FILEOPERATE_MSG_TYPE_WEAR_DATA_READ: #ifdef SUPPORT_CYWEE_SERVICE - custom_read_wear_data(); + // custom_read_wear_data(); #endif break; diff --git a/code/sdk/zhihui/utils/custom_utils.c b/code/sdk/zhihui/utils/custom_utils.c index 56e4891f2..0829d14d9 100644 --- a/code/sdk/zhihui/utils/custom_utils.c +++ b/code/sdk/zhihui/utils/custom_utils.c @@ -2830,9 +2830,9 @@ void uapi_cywee_reset_daily_data(void) //cywee时间更新 void uapi_cywee_time_sync(void) { - #ifdef CYWEE_SPORT +#ifdef SUPPORT_CYWEE_SERVICE do_cywee_service_check_msg(CYWEE_SERVICE_CMD_TIME_SYNC,NULL); - #endif +#endif } void uapi_cywee_get_id(uint8_t *id) -- 2.17.1

*Ow* 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 X@2k>Ey*&IQa$~Qls>7u-`wIRS%@6Fe diff --git a/code/sdk/zhihui/drivers/ppg/vc9202/src/vc9202_driver.c b/code/sdk/zhihui/drivers/ppg/vc9202/src/vc9202_driver.c deleted file mode 100644 index 9c8fce5f8..000000000 --- a/code/sdk/zhihui/drivers/ppg/vc9202/src/vc9202_driver.c +++ /dev/null @@ -1,1621 +0,0 @@ -/********************************************************************************************************* - * Copyright(c) 2022, vcare Corporation. All rights reserved. - ********************************************************************************************************** - * @file vc9202_driver.c - * @brief vc9202 driver layer interface implementation. - * @details - * @author - * @date - * @version - *********************************************************************************************************/ -#include "vc9202_common.h" -#include "vc9202_driver.h" -#include "BIODetect_V15_1.h" - -/* static wear status declaration */ -static int bio_result = VC9202_BIO_STA_NONE; -static WearStatusTypeDef alg_wear_status = WEAR_STA_HOLD; -static unsigned int gsnesor_axis_diff = 0; -static VC9202WearInfoTypeDef dev9202_wear = {0}; -/* static adjust data declaration */ -static VC9202AdjustSlotTypeDef dev9202_adjust[3] = {0}; -static unsigned char ppg_mark[128 / 2] = {0}; -/* static device data declaration */ -static VC9202DrvInfoTypeDef dev9202_info = {0}; -/* static oscclk data declaration */ -static VC9202OscClkTypeDef dev9202_clk = {0}; - -static int Bio_Max_Value = 0; -static int Bio_Max_Diff_Value = 0; -static int Bio_Min_Diff_Value = 0; -static int Bio_Old_Value = 0; -static uint8_t Bio_cnt = 0; -static uint8_t Bio_HOLD_cnt = 0; -static uint8_t BIO_HOLD_DROP_FLAG = 2; -/* global test infomation declaration */ -extern VC9202TestInfoTypeDef vc9202_test_info; -extern void vc9202_test_handler(SamplingDataTypeDef *pResult, VC9202TestInfoTypeDef *ptest_info); -extern void vc9202_test_init(VC9202TestInfoTypeDef *ptest_info); -/* res-level tab */ -const static VC9202ResTableTypeDef res_table[22] = { - /* level: 0 */ {0, 0, 1}, - /* level: 1 */ {1, 0, 1}, - /* level: 2 */ {2, 0, 1}, - /* level: 3 */ {3, 0, 1}, - /* level: 4 */ {4, 0, 1}, - /* level: 5 */ {5, 0, 1}, - /* level: 6 */ {0, 0, 0}, - /* level: 7 */ {1, 0, 0}, - /* level: 8 */ {2, 0, 0}, - /* level: 9 */ {3, 0, 0}, - /* level:10 */ {4, 0, 0}, - /* level:11 */ {5, 0, 0}, - /* level:12 */ {6, 0, 0}, - /* level:13 */ {7, 0, 0}, - /* level:14 */ {6, 1, 0}, /* +2 */ - /* level:15 */ {7, 1, 0}, - /* level:16 */ {6, 2, 0}, /* +4 */ - /* level:17 */ {7, 2, 0}, - /* level:18 */ {6, 3, 0}, /* +6 */ - /* level:19 */ {7, 3, 0}, - /* level:20 */ {6, 4, 0}, /* +8 */ - /* level:21 */ {7, 4, 0}, -}; // 21-5 = 16 - -void vc9202_drv_set_gsensor_actuating_quantity(unsigned int axis_diff) -{ - gsnesor_axis_diff = axis_diff; -} - -void vc9202_drv_set_algo_wear_status(WearStatusTypeDef status) -{ - alg_wear_status = status; -} - -/******************************************************************************************************** - * 时钟校准部分 - ********************************************************************************************************/ -static void vc9202_drv_clear_clk(void) -{ - dev9202_clk.osc_gap_cnt = 0; - dev9202_clk.count_index = 0; - dev9202_clk.last_clk_count = 0; - dev9202_info.osc_clk_status = 0; - - dev9202_clk.last_clk_check = 0; -} -/** - * @brief 时钟校验,与原来的VC9201系列一致 - * @param 无 - * @retval - 0 校验正常通过 - 1 vc9202计数当次就溢出 - 2 mcu tick或vc9202后两次中断的时候有计数溢出 - 3 频率计算没有通过 - */ -static unsigned char vc9202_drv_calibration_osc_clk(void) -{ - unsigned char count_vaild = 1; - unsigned char i = 0; - unsigned char osc_buf[4] = {0}; - unsigned int osc_tick[2] = {0}; - unsigned int clock_tick[2] = {0}; - unsigned short int calc_div[2] = {0}; - unsigned short int mean_div = 0; - unsigned char reg_div1[2] = {0}; - /* 判断是否需要校准时钟,如不需则直接返回 */ - unsigned int sec_gap_cnt = VC9202_CFG_CLK_CHECK_GAPTIME * 1000 / dev9202_info.fifo_time; - if (dev9202_info.osc_clk_status && dev9202_clk.osc_gap_cnt++ <= sec_gap_cnt) - { - return 0; - } - /* 获取时钟计数 */ - clock_tick[0] = usr_get_clock_ticks(); - usr_iic_read_bytes(0x07, osc_buf, 4); - clock_tick[1] = usr_get_clock_ticks(); - osc_tick[0] = (osc_buf[0] << 8) + osc_buf[1]; - osc_tick[1] = (osc_buf[2] << 8) + osc_buf[3]; - if ((osc_tick[0] > osc_tick[1]) || (clock_tick[0] > clock_tick[1])) - { - dev9202_clk.count_index = 0; - return 1; - } - /* 存入校准缓存 */ - dev9202_clk.osc_count[dev9202_clk.count_index * 2] = osc_tick[0]; - dev9202_clk.osc_count[dev9202_clk.count_index * 2 + 1] = osc_tick[1]; - dev9202_clk.clk_count[dev9202_clk.count_index * 2] = clock_tick[0]; - dev9202_clk.clk_count[dev9202_clk.count_index * 2 + 1] = clock_tick[1]; - dev9202_clk.count_index++; - if (dev9202_clk.count_index >= 3) - { - dev9202_clk.count_index = 0; - for (i = 0; i < 2; i++) - { - count_vaild = count_vaild && (ABS((dev9202_clk.clk_count[2 * i + 2] - dev9202_clk.clk_count[2 * i]), (dev9202_clk.clk_count[2 * i + 3] - dev9202_clk.clk_count[2 * i + 1])) < VC9202_CFG_CLK_CHECK_DEVIATION); - count_vaild = count_vaild && (ABS((dev9202_clk.osc_count[2 * i + 2] - dev9202_clk.osc_count[2 * i]), (dev9202_clk.osc_count[2 * i + 3] - dev9202_clk.osc_count[2 * i + 1])) < VC9202_CFG_CLK_CHECK_DEVIATION); - count_vaild = count_vaild && (!(dev9202_clk.clk_count[2 * i + 2] == dev9202_clk.clk_count[2 * i])); /* avoid divisor==0, diffCountIsOk set false */ - } - if (count_vaild) - { - for (i = 0; i < 2; i++) - { - calc_div[i] = ((unsigned int)dev9202_clk.osc_count[2 * i + 2] - dev9202_clk.osc_count[2 * i]) * VC9202_CFG_CLK_CHECK_FREQUENCY / dev9202_info.work_frequency / ((unsigned int)dev9202_clk.clk_count[2 * i + 2] - dev9202_clk.clk_count[2 * i]) - 1; - if (calc_div[i] < (20000 / dev9202_info.work_frequency * 0.75f) || calc_div[i] > (20000 / dev9202_info.work_frequency * 1.25f)) - { - return 3; - } - } - /* 比较两次计算偏差是否合理 */ - if ((calc_div[1] - calc_div[0] <= 20) || (calc_div[0] - calc_div[1] <= 20)) - { - mean_div = (calc_div[1] + calc_div[0]) / 2; - reg_div1[0] = mean_div >> 8; - reg_div1[1] = mean_div; - usr_iic_write_bytes(0x14, reg_div1, 2); - dev9202_clk.count_index = 0; - dev9202_clk.osc_gap_cnt = 0; - dev9202_info.osc_clk_status = 1; - return 0; - } - } - } - return 2; -} -/******************************************************************************************************** - * 摘配带判断部分 - ********************************************************************************************************/ -/** - * @brief 佩戴检测,bio检测计算(内部阅读:f_BIOdetect,在BIO+PS均由佩戴产生的边缘时输出2佩戴;摘下时只依赖PS边缘) - * @param - bio_value bio采样值 - ps_value ps采样值 - * @retval bio结果 - */ -static int vc9202_drv_calc_biology_sense(unsigned short int bio_value, unsigned char ps_value, unsigned char env) -{ - static unsigned char calc_ps = 0; - static unsigned short int calc_bio = 0; - static int Bio_Diff_Value = 0; - int ret = 0; - if (bio_value) - { - calc_bio = bio_value; - Bio_Diff_Value = abs(Bio_Old_Value - calc_bio); - Bio_Old_Value = calc_bio; - } - if (ps_value) - { - calc_ps = ps_value; - } - if ((calc_ps < 100) && (env > 4)) - { - if (Bio_Diff_Value < VC9202_CFG_WEAR_PARAM_BIOIN * 0.2) - { - Bio_Max_Value = calc_bio; - Bio_Max_Diff_Value = Bio_Max_Value - (VC9202_CFG_WEAR_PARAM_BIOIN * 0.8); - Bio_Min_Diff_Value = Bio_Max_Value - (VC9202_CFG_WEAR_PARAM_BIOIN * 1.5); - } - } - if (Bio_Max_Diff_Value) - { - if ((calc_bio > Bio_Max_Diff_Value) && (Bio_Diff_Value < VC9202_CFG_WEAR_PARAM_BIOIN * 0.2)) - { - Bio_HOLD_cnt++; - if (Bio_HOLD_cnt > 4) - { - BIO_HOLD_DROP_FLAG = 1; - } - } - else if (calc_bio < Bio_Min_Diff_Value) - { - Bio_cnt++; - if (Bio_cnt > 2) - { - BIO_HOLD_DROP_FLAG = 2; - } - } - else - { - Bio_cnt = 0; - Bio_HOLD_cnt = 0; - BIO_HOLD_DROP_FLAG = 0; - } - } - uint32_t tm; - uapi_get_timestampe_ms(&tm); - // printf("before f_BIOdetect bio_value :%d , ps_value : %d , env : %d , tm : %d\n",bio_value,ps_value,env,tm); - // printf("before f_BIOdetect calc_bio :%d , calc_ps : %d , VC9202_CFG_WEAR_PARAM_PS : %d ,tm : %d , ret : %d\n",calc_bio,calc_ps,VC9202_CFG_WEAR_PARAM_PS,tm,ret); - ret = f_BIOdetect(calc_bio, calc_ps, VC9202_CFG_WEAR_PARAM_PS); - // printf("after f_BIOdetect calc_bio :%d , calc_ps : %d , VC9202_CFG_WEAR_PARAM_PS : %d ,tm : %d , ret : %d\n",calc_bio,calc_ps,VC9202_CFG_WEAR_PARAM_PS,tm,ret); - // printf("after f_BIOdetect bio_value :%d , ps_value : %d , env : %d , tm : %d\n",bio_value,ps_value,env,tm); - if (VC9202_BIO_STA_HOLD == ret) - { - vc9202_drv_set_algo_wear_status(WEAR_STA_HOLD); /* bio */ - bio_result = VC9202_BIO_STA_HOLD; - } - else if (VC9202_BIO_STA_DROP == ret) - { - bio_result = VC9202_BIO_STA_DROP; - } - return bio_result; -} -/** - * @brief 佩戴检测过程及状态 - * @param *pwear-佩戴结构体,env-环境光,ps-ps值,bio-活体值 - * @retval 识别改变结果 - */ -static VC9202WearChangeTypeDef vc9202_drv_wear_status_identify(VC9202WearInfoTypeDef *pwear, unsigned char env, unsigned char ps, unsigned short int bio) -{ - // printf("vc9202_drv_wear_status_identify bio : %d \n",bio); - VC9202WearChangeTypeDef ret_change = WEAR_NO_CHANGE; - int ret_bio_algo = VC9202_BIO_STA_NONE; - /* bio算法运算 */ - if (dev9202_info.enable_bio) - { - ret_bio_algo = vc9202_drv_calc_biology_sense(bio, ps, env); - } - else - { - ret_bio_algo = VC9202_BIO_STA_HOLD; /* 20230614 因为下面的条件把(ret_bio_algo== )佩戴的条件删了,所以此处必须添加,不然在未开bio的模式下无法佩戴*/ - } -#if (FUNC_DISABLE == VC9202_CFG_WEAR_THRESHOLD_EN) - BIO_HOLD_DROP_FLAG = 2; -#endif -#if (FUNC_DISABLE == VC9202_CFG_WEAR_BIO_EN) - ret_bio_algo = VC9202_BIO_STA_NONE; - BIO_HOLD_DROP_FLAG = 2; -#endif -#if (FUNC_DISABLE == VC9202_CFG_WEAR_ALG_EN) - alg_wear_status = WEAR_STA_HOLD; -#endif -#if (FUNC_DISABLE == VC9202_CFG_WEAR_ACT_EN) - gsnesor_axis_diff = 1; -#endif - switch (pwear->wear_status) - { - case WEAR_STA_DROP: - // printf("WEAR_STA_DROP ps : %d , env : %d , ret_bio_algo : %d , alg_wear_status : %d , gsnesor_axis_diff : %d , BIO_HOLD_DROP_FLAG : %d\n",ps,env,ret_bio_algo,alg_wear_status,gsnesor_axis_diff,BIO_HOLD_DROP_FLAG); - if ((ps >= VC9202_CFG_WEAR_PARAM_PS) && (env <= VC9202_CFG_WEAR_PARAM_ENVMIN) && (VC9202_BIO_STA_HOLD == ret_bio_algo) && - (WEAR_STA_HOLD == alg_wear_status) && (1 == gsnesor_axis_diff) && (BIO_HOLD_DROP_FLAG == 2)) - { - if (--pwear->wear_hold_cnt <= 0) - { - pwear->wear_hold_cnt = VC9202_CFG_WEAR_HOLD_CNT; - pwear->wear_drop_cnt = VC9202_CFG_WEAR_DROP_CNT; - ret_change = DROP_TO_HOLD; - } - } - else - { - pwear->wear_hold_cnt = VC9202_CFG_WEAR_HOLD_CNT; - } - break; - - case WEAR_STA_HOLD: - // printf("WEAR_STA_HOLD ps : %d , env : %d , ret_bio_algo : %d , alg_wear_status : %d , BIO_HOLD_DROP_FLAG : %d\n",ps,env,ret_bio_algo,alg_wear_status,BIO_HOLD_DROP_FLAG); - if ((ps < VC9202_CFG_WEAR_PARAM_PS) || (env > VC9202_CFG_WEAR_PARAM_ENVMIN) || (VC9202_BIO_STA_DROP == ret_bio_algo) || (WEAR_STA_DROP == alg_wear_status) || (BIO_HOLD_DROP_FLAG == 1)) - { - if ((WEAR_STA_DROP == alg_wear_status) || (ret_bio_algo == VC9202_BIO_STA_DROP)) - { - pwear->wear_drop_cnt = 1; - } - if (--pwear->wear_drop_cnt <= 0) - { - pwear->wear_hold_cnt = VC9202_CFG_WEAR_HOLD_CNT; - pwear->wear_drop_cnt = VC9202_CFG_WEAR_DROP_CNT; - ret_change = HOLD_TO_DROP; - } - } - else - { - pwear->wear_drop_cnt = VC9202_CFG_WEAR_DROP_CNT; - } - break; - default: - break; - } - return ret_change; -} - -/** - * @brief 佩戴检测及通道的开关 - * @param 无 - * @retval 佩戴检测状态 - */ -WearStatusTypeDef vc9202_drv_get_wear_status(void) -{ - WearStatusTypeDef wear_status = dev9202_wear.last_status; /* last status */ - VC9202WearChangeTypeDef calc_status = WEAR_NO_CHANGE; - unsigned char event = 0; - unsigned char en_int = 0; - unsigned char env_value = 0, ps_value = 0; - unsigned char bio_buffer[4] = {0}; - unsigned short int bio_value = 0; - unsigned char wear_interrupt = 0; - unsigned char slot_index = 0; -#if (VC9202_CFG_WEAR_DETECTION != FUNC_ENABLE) - return WEAR_IS_HOLD; -#endif - usr_iic_read_bytes(0x11, &en_int, 1); -#if 0 - usr_iic_read_bytes(0x02, &event, 1); -#else - event = dev9202_info.int_event; -#endif -#if (FUNC_ENABLE == VC9202_CFG_DRV_BY_TIMER) /* 定时触发时,不看中断原因,可能被清掉 */ - wear_interrupt = 1; -#else - /* 使能了PsInt,且使能PS */ - if ((event & VC9202_EVENT_PS_MARK) && (en_int & (1 << 4))) - { - wear_interrupt = 1; - } - /* 未使能PsInt下,ps_ppg同频通过fifo中断去识别摘配带 */ - if (event & VC9202_EVENT_FIFO_MARK) - { - wear_interrupt = 1; - } -#endif - /* 非心率模式,就算使能了运动量,也没有去做处理,直接置1忽略 */ - if (dev9202_info.work_mode != WORK_MODE_HR && dev9202_info.work_mode != WORK_MODE_WEAR) - { - gsnesor_axis_diff = 1; - } - if (wear_interrupt) - { -/* 读取佩戴检测所需的数据 */ -#if 0 - usr_iic_read_bytes(0x43, &env_value, 1); - usr_iic_read_bytes(0x46, &ps_value, 1); - usr_iic_read_bytes(0x4B, bio_buffer, 4); - bio_value = (bio_buffer[2] << 8) + bio_buffer[3]; -#else - env_value = dev9202_wear.wear_env; - ps_value = dev9202_wear.wear_ps; - bio_value = dev9202_wear.wear_bio; -#endif - /* 根据数据得出佩戴状态 */ - calc_status = vc9202_drv_wear_status_identify(&dev9202_wear, env_value, ps_value, bio_value); - if (DROP_TO_HOLD == calc_status) - { - wear_status = WEAR_STA_HOLD; - dev9202_wear.wear_status = wear_status; - dev9202_wear.last_status = wear_status; - InitParamTypeDef init_param = {dev9202_info.fifo_time, dev9202_info.work_mode}; - vc9202_drv_reg_init(&init_param); - } - else if (HOLD_TO_DROP == calc_status) - { - wear_status = WEAR_STA_DROP; - dev9202_wear.wear_status = wear_status; - dev9202_wear.last_status = wear_status; - /* 关灯操作:获取那些ppg通道使能/记录当前使能的通道,然后关闭通道 */ - for (slot_index = 0; slot_index <= 1; slot_index++) - { - if (dev9202_info.enslot[slot_index]) - { - vc9202_drv_channel_switch(slot_index, 0); - } - } - } /* end of(HOLD_TO_DROP == calc_status) */ - } - return wear_status; -} - -/******************************************************************************************************** - * IC状态读取部分,包括IC异常状态处理,常规数据的读取,ENV、PPG调整部分 - ********************************************************************************************************/ -/** - * @brief 等效电阻等级转化为寄存器参数 - * @param level 等效电阻等级 - * @retval 寄存器参数 - */ -static VC9202ResLevelTypeDef vc9202_drv_res_level_to_register(unsigned char level) -{ - VC9202ResLevelTypeDef reg; - reg.res_val = res_table[level].res; - reg.low_res = res_table[level].low; - if (res_table[level].offset >= 4) - { - reg.offset = 0; - reg.offset3 = 1; - } - else - { - reg.offset = res_table[level].offset; - reg.offset3 = 0; - } - return reg; -} - -/** - * @brief 寄存器参数转化为等效电阻等级 - * @param 寄存器参数 - * @retval 等效电阻等级 - */ -static unsigned char vc9202_drv_res_register_to_level(VC9202ResLevelTypeDef *preg) -{ - unsigned char index = 0; - unsigned char level = 0; - VC9202ResTableTypeDef table = {0}; - if (preg->offset3 == 1) - { - table.offset = 4; - } - else - { - table.offset = preg->offset; - } - table.res = preg->res_val; - table.low = preg->low_res; - for (index = 0; index < sizeof(res_table) / sizeof(res_table[0]); index++) - { - if (res_table[index].res == table.res && res_table[index].offset == table.offset && res_table[index].low == table.low) - { - level = index; - break; - } - } - return level; -} - -/** - * @brief 设置通道电流参数 - * @param 无 - * @retval 无 - */ -static void vc9202_drv_set_ppgSlot_current(unsigned char slot_index, unsigned char cur) -{ - unsigned char reg = 0; - unsigned char addr = 0x17 + slot_index; - cur = (cur > 0x7f) ? 0x7f : cur; - usr_iic_read_bytes(addr, ®, 1); - reg &= (1 << 7); - reg |= cur; - usr_iic_write_bytes(addr, ®, 1); -} - -/** - * @brief 设置通道电阻参数 - * @param 设置的通道号,设定的值 - * @retval 无 - */ -static void vc9202_drv_set_ppgSlot_resistance(unsigned char slot_index, unsigned char level) -{ - unsigned char reg_addr = 0x1A + slot_index; - unsigned char res_reg = 0; - unsigned char res_ext[2] = {0}; - VC9202ResLevelTypeDef res = {0}; - level = (level > VC9202_MAX_RES_LEVEL) ? VC9202_MAX_RES_LEVEL : level; - res = vc9202_drv_res_level_to_register(level); - usr_iic_read_bytes(0x22, res_ext, 2); - switch (slot_index) - { - case 0: - res_ext[0] &= ~(3 << 4); /* offset */ - res_ext[0] |= (res.offset << 4); - res_ext[0] &= ~(1 << 0); /* lowres */ - res_ext[0] |= (res.low_res << 0); - res_ext[1] &= ~(1 << 0); - res_ext[1] |= (res.offset3 << 0); - break; - case 1: - res_ext[0] &= ~(3 << 6); /* offset */ - res_ext[0] |= (res.offset << 6); - res_ext[0] &= ~(1 << 1); /* lowres */ - res_ext[0] |= (res.low_res << 1); - res_ext[1] &= ~(1 << 2); - res_ext[1] |= (res.offset3 << 2); - break; - default: - break; - } - usr_iic_read_bytes(reg_addr, &res_reg, 1); - res_reg &= (0x8f); - res_reg |= (res.res_val << 4); - usr_iic_write_bytes(reg_addr, &res_reg, 1); - usr_iic_write_bytes(0x22, res_ext, 2); -} -/** - * @brief 读取PPG饱和中断时的采样值 - * @param enfifo-是否使能fifo,slot_num-通道数,slot_index-通道号, *pdata 数据指针 - * @retval 返回当前读取地址 - */ -static unsigned char vc9202_drv_adjust_ppg_read(unsigned char enfifo, unsigned char slot_num, unsigned char slot_index, unsigned int *pdata) -{ - unsigned char write_index = 0, fifo_addr = 0; - unsigned char fifo_buff[2] = {0}; - /* PPG IRQ addr */ - usr_iic_read_bytes(0x03, &write_index, 1); - fifo_addr = write_index - slot_num * 2 + slot_index * 2; - fifo_addr = (fifo_addr < 0x80) ? (fifo_addr + 0x80) : (fifo_addr); - fifo_addr = enfifo ? fifo_addr : 0x80 + slot_index * 2; - /* read PPG data */ - usr_iic_read_bytes(fifo_addr, fifo_buff, 2); - *pdata = (fifo_buff[0] << 8) + fifo_buff[1]; - return write_index; -} - -/** - * @brief 参数调整时,添加调整标志位 - * @param 无 - * @retval 无 - */ -static void vc9202_drv_adjust_set_fifo_mark(unsigned char slot_index) // SamplingDataTypeDef **pp_result, unsigned char rindex, unsigned char windex, unsigned char slot_num ) -{ - unsigned char mark_ppg_index = 0; - unsigned char mark_offset = 0; - unsigned char rindex = dev9202_info.read_fifo_address; - unsigned char windex = 0; - usr_iic_read_bytes(0x03, &windex, 1); - /* calc PPGOffset */ - if (windex > rindex) - { - mark_offset = (windex - rindex); - } - else - { - mark_offset = windex + 128 - rindex; - } - if ((mark_offset < 2) || (mark_offset > 128)) - { - return; - } - mark_ppg_index = mark_offset / 2 - dev9202_info.slot_number + slot_index; /* 如果是双通道,要判断是那个通道产生的调整 */ - ppg_mark[mark_ppg_index] = 1; -} - -/** - * @brief 检测因电阻过大,电流的最小步长调整都会反复饱和的情况 - * @param dir 调整方向, slot_index 当前通道, res_level 当前电阻等级, cur 当前电流值 - * @retval 1:错误,0:正常 - */ -static unsigned char vc9202_drv_adjust_res_error(VC9202AgcDirTypeDef dir, unsigned char slot_index, uint8_t res_level, uint8_t cur) -{ - static VC9202AgcDirTypeDef lastDir = AGC_DIR_NULL; - static uint8_t last_level = 0; - static uint8_t last_cur[2][3] = {0}; - static uint8_t log_cnt = 0; - if (lastDir != dir && last_level == res_level) - { - last_cur[slot_index][0] = last_cur[slot_index][1]; - last_cur[slot_index][1] = last_cur[slot_index][2]; - last_cur[slot_index][2] = cur; - if (last_cur[slot_index][0] == last_cur[slot_index][2]) - log_cnt++; - } - else - { - log_cnt = 0; - } - lastDir = dir; - last_level = res_level; - if (log_cnt >= 3) - { - log_cnt = 0; - return 1; - } - else - { - return 0; - } -} - -/** - * @brief PPG饱和时,上/下调整电流电阻配置参数 - * @param *padjust-调整结构体,thh_res-电阻限值,thh_cur-电流限值,slot_index-通道编号 - * @retval 执行结果 - */ -static VC9202DrvRetTypeDef vc9202_drv_adjust_ppg_slot_current_res_config(VC9202AdjustSlotTypeDef *padjust, unsigned char thh_res, unsigned char thh_cur, unsigned char slot_index) -{ - unsigned char old_res_lvl = 0; - unsigned char old_current = 0; - unsigned short int old_current_step = 0; - old_res_lvl = padjust->res_level; - old_current = padjust->current; - old_current_step = padjust->info.current_step; - /* 电流已经最大,调电阻 */ - if (padjust->current == thh_cur) - { - if (old_res_lvl == thh_res) - { - return RET_PPG_ERR; - } - else - { - if (padjust->info.dir == AGC_DIR_UP) - { - padjust->res_level = (old_res_lvl >= VC9202_MAX_RES_LEVEL) ? (VC9202_MAX_RES_LEVEL) : (old_res_lvl + 1); - } - else - { - padjust->res_level = (old_res_lvl < 1) ? (0) : (old_res_lvl - 1); - } - vc9202_drv_adjust_set_fifo_mark(slot_index); - } - } - else /* 电流可调 */ - { - /* step calc */ - if (padjust->info.last_dir == AGC_DIR_NULL) - { - old_current_step *= 16; - } - else if (padjust->info.dir == padjust->info.last_dir) - { - if ((old_current_step == 1) || (old_current_step == 2)) - { - old_current_step = (old_current_step + 1) * 16; - } - else - { - old_current_step *= VC9202_ADJUST_INCREASE; - } - } - else - { - old_current_step *= VC9202_ADJUST_DECREASE; - } - padjust->info.current_step = old_current_step >> 4; - padjust->info.current_step = (padjust->info.current_step <= VC9202_ADJUST_STEP_MIN) ? VC9202_ADJUST_STEP_MIN : padjust->info.current_step; - padjust->info.current_step = (padjust->info.current_step >= VC9202_ADJUST_STEP_MAX) ? VC9202_ADJUST_STEP_MAX : padjust->info.current_step; - /* 调整方向 */ - if (padjust->info.dir == AGC_DIR_UP) - { - padjust->current = ((old_current + padjust->info.current_step) > thh_cur) ? thh_cur : (old_current + padjust->info.current_step); - } - else - { - padjust->current = (old_current < padjust->info.current_step) ? thh_cur : old_current - padjust->info.current_step; - } - vc9202_drv_adjust_set_fifo_mark(slot_index); - padjust->info.last_dir = padjust->info.dir; - } - if (vc9202_drv_adjust_res_error(padjust->info.dir, slot_index, padjust->res_level, padjust->current)) - { - if (padjust->res_level >= 13) - { - padjust->res_level--; - } - } - /* 调整后的电流电阻写入寄存器 */ - vc9202_drv_set_ppgSlot_resistance(slot_index, padjust->res_level); - vc9202_drv_set_ppgSlot_current(slot_index, padjust->current); - return RET_OK; -} - -/** - * @brief 环境光饱和中断调整电阻 - * @param *padjust-调整结构体,slot_index-通道编号 - * @retval 执行结果 - */ -static VC9202DrvRetTypeDef vc9202_drv_adjust_env_configure(VC9202AdjustSlotTypeDef *padjust, unsigned char slot_index) -{ - if (padjust->slot_env > VC9202_ENV_MAX_TH) - { - padjust->record_env = padjust->slot_env; - if (padjust->res_level != 0) - { - padjust->res_level--; - padjust->max_res_level = padjust->res_level; - vc9202_drv_adjust_set_fifo_mark(slot_index); - vc9202_drv_set_ppgSlot_resistance(slot_index, padjust->res_level); - } - else - { - return RET_ENV_ERR; - } - } - return RET_OK; -} - -/** - * @brief 如果产生overload,降低电流,和电流的最大限制,过载电流-1 - * @param *padjust-调整结构体,slot_index-通道编号,status-状态值 - * @retval 执行结果 - */ -static VC9202DrvRetTypeDef vc9202_drv_adjust_over_load_configure(VC9202AdjustSlotTypeDef *padjust, unsigned char slot_index, unsigned char status) -{ - unsigned char overload[3] = {status & VC9202_STATUS_OVERLOAD0, status & VC9202_STATUS_OVERLOAD1, status & VC9202_STATUS_OVERLOAD2}; - if (overload[slot_index]) - { - if (padjust->current != 0) - { - padjust->current--; - padjust->max_current = padjust->current; - vc9202_drv_adjust_set_fifo_mark(slot_index); - vc9202_drv_set_ppgSlot_current(slot_index, padjust->current); - } - else - { - return RET_OVERLOAD_ERR; - } - } - return RET_OK; -} - -/** - * @brief 获取PPG进行电流电阻的调整 - * @param *padjust-调整结构体,slot_index-通道编号,enfifo-是否使能fifo, slot_num-通道数 - * @retval 执行结果 - */ -static VC9202DrvRetTypeDef vc9202_drv_adjust_ppg_configure(VC9202AdjustSlotTypeDef *padjust, unsigned char slot_index, unsigned char enfifo, unsigned char slot_num) -{ - static unsigned char last_index = 0, cnt = 0; - VC9202DrvRetTypeDef vc_ret = RET_OK; - unsigned char windex = 0; - unsigned char index_gap = 0; - unsigned int data = 0; - // 根据通道号和是否enfifo获取产生ppg中断的ppg值。 - windex = vc9202_drv_adjust_ppg_read(enfifo, slot_num, slot_index, &data); - /* 修改last dir */ - if (enfifo) - { - index_gap = (windex > last_index) ? (windex - last_index) : (windex - last_index + 0x80); - if (index_gap != slot_num * 2) - { - padjust->info.last_dir = AGC_DIR_NULL; - } - cnt++; - if (cnt >= slot_num) - { - cnt = 0; - last_index = windex; - } - } - /* 根据ppg值进行电流、等效电阻上下调节 */ - if (data >= 3770) - { - padjust->info.dir = AGC_DIR_UP; - vc_ret |= vc9202_drv_adjust_ppg_slot_current_res_config(padjust, padjust->max_res_level, padjust->max_current, slot_index); - } - else if (data < 320) - { - padjust->info.dir = AGC_DIR_DOWN; - vc_ret |= vc9202_drv_adjust_ppg_slot_current_res_config(padjust, 0, 0, slot_index); - } - return vc_ret; -} - -/** - * @brief 最大电阻的调整,通过判断环境光,来恢复电阻的最大限制 - * @param *padjust-调整结构体,slot_index-通道编号 - * @retval 无 - */ -static void vc9202_drv_res_max_resize(VC9202AdjustSlotTypeDef *padjust, unsigned char slot_index) -{ - static unsigned short int count_qares[2] = {0}; - static unsigned short int count_pdres[2] = {0}; - unsigned char min_env = 0; - // 该通道得最大电阻已经是最大的等级了,无需恢复退出 - if (padjust->max_res_level >= VC9202_MAX_RES_LEVEL) - { - return; - } - /* 获取一个环境光比较值,取上一次环境光调整时的一半或者环境光中断阈值 */ - min_env = (padjust->record_env / 2 < VC9202_ENV_MAX_TH) ? (padjust->record_env / 2) : VC9202_ENV_MAX_TH; - if (padjust->slot_env < min_env) - { - /* 环境光一直小于1,持续超过30次,那么直接将电阻限制设置为最大 */ - if (padjust->slot_env <= 1) - { - count_pdres[slot_index] = 0; - count_qares[slot_index] = (count_qares[slot_index] == 30) ? 0 : count_qares[slot_index] + 1; - padjust->max_res_level = (count_qares[slot_index] == 30) ? VC9202_MAX_RES_LEVEL : padjust->max_res_level; - } - else - { - /* 环境光一直小于比较值,持续超过120次,那么直接将电阻限制+1 */ - count_qares[slot_index] = 0; - count_pdres[slot_index] = count_pdres[slot_index] + 1; - padjust->max_res_level = (count_pdres[slot_index] == 120) ? padjust->max_res_level + 1 : padjust->max_res_level; - } - } - else - { - count_pdres[slot_index] = 0; - count_qares[slot_index] = 0; - } -} - -/* 判断PS通道的过载和环境光是否异常 */ -VC9202DrvRetTypeDef vc9202_drv_ps_slot_status(VC9202AdjustSlotTypeDef *p_slot_ps, unsigned char event, unsigned char status) -{ - VC9202DrvRetTypeDef vc_ret = RET_OK; -#if (FUNC_ENABLE == VC9202_CFG_DRV_BY_TIMER) /* 定时触发时,不看中断原因,因为可能被清掉 */ - if (status & VC9202_STATUS_OVERLOAD2) - { - vc_ret |= RET_OVERLOAD_ERR; - } - if (p_slot_ps->slot_env > VC9202_ENV_MAX_TH) - { - vc_ret |= RET_ENV_ERR; - } -#else - if ((event & VC9202_EVENT_OV_MARK) && (status & VC9202_STATUS_OVERLOAD2)) - { - vc_ret |= RET_OVERLOAD_ERR; - } - if ((event & VC9202_EVENT_ENV_MARK) && (p_slot_ps->slot_env > VC9202_ENV_MAX_TH)) - { - vc_ret |= RET_ENV_ERR; - } -#endif - return vc_ret; -} -/** - * @brief 识别IC的中断状态及中断事件,并对不同的情况进行调整处理等 - * @param status-工作状态, event-中断事件 - * @retval 执行结果 - */ -static VC9202DrvRetTypeDef vc9202_drv_status_event_verify(unsigned char status, unsigned char event) -{ - VC9202DrvRetTypeDef vc_ret = RET_OK; - unsigned char index = 0; - unsigned char index_slot = 0; - if (status & (VC9202_STATUS_CONFLICT | VC9202_STATUS_INSAMPLE)) - { - return RET_STATUS_ERR; - } - /* PS通道异常判断 */ - vc_ret |= vc9202_drv_ps_slot_status(&dev9202_adjust[2], event, status); - /* PPG通道的环境光读取,异常中断处理 */ - for (index = 0; index < dev9202_info.slot_number; index++) - { - index_slot = (dev9202_info.slot_number == 2) ? index : (dev9202_info.enslot[0] ? 0 : 1); - /* 恢复最大电阻的限制,根据当前 */ - vc9202_drv_res_max_resize(&dev9202_adjust[index_slot], index_slot); - /* over load, max current */ - if (event & VC9202_EVENT_OV_MARK) - { - // printf("event & VC9202_EVENT_OV_MARK \n"); - vc_ret |= vc9202_drv_adjust_over_load_configure(&dev9202_adjust[index_slot], index_slot, status); - } - /* env, max res */ - if (event & VC9202_EVENT_ENV_MARK) - { - // printf("event & VC9202_EVENT_ENV_MARK \n"); - vc_ret |= vc9202_drv_adjust_env_configure(&dev9202_adjust[index_slot], index_slot); - } - /* ppg interruput */ - if (event & VC9202_EVENT_PPG_MARK) - { - vc_ret |= vc9202_drv_adjust_ppg_configure(&dev9202_adjust[index_slot], index_slot, dev9202_info.enfifo_div, dev9202_info.slot_number); - // printf("event & VC9202_EVENT_PPG_MARK vc_ret : 0x%x\n",vc_ret); - } - else - { - // printf("event : 0x%x \n",event); - dev9202_adjust[index].info.dir = AGC_DIR_NULL; - dev9202_adjust[index].info.last_dir = AGC_DIR_NULL; - } - } - return vc_ret; -} - -/******************************************************************************************************** - * fifo 读取部分 - ********************************************************************************************************/ -/** - * @brief 校验fifo读写的偏移的可用性,及fifo是否翻转等错误。 - * @param rindex-读地址,windex-写地址,slot_num-通道数量,fifo_div-fifo深度 - * @retval 无 - */ -static VC9202DrvRetTypeDef vc9202_drv_fifo_infomation_check(unsigned char *rindex, unsigned char *windex, unsigned char slot_num, unsigned char fifo_div) -{ - unsigned int clk_diffs = 0; - unsigned int clk_count = usr_get_clock_ticks(); - /* 间隔时间的校验,后续看是否需要补充 */ - clk_diffs = (dev9202_clk.last_clk_count < clk_count) ? (clk_count - dev9202_clk.last_clk_count) : (clk_count - dev9202_clk.last_clk_count + VC9202_CFG_CLK_CHECK_MAX); - if (clk_diffs > (unsigned int)((64.0f / dev9202_info.work_frequency) * 0.8f * VC9202_CFG_CLK_CHECK_FREQUENCY / dev9202_info.slot_number)) - { - *windex = 0; - *rindex = 0x80; - dev9202_clk.last_clk_count = clk_count; - return RET_FIFO_ERR; - } - /* 读写地址的校验 */ - if (*windex < 0x80) - { - *rindex = *rindex + (fifo_div + 1) * 2; - if (*rindex < 0x80) - { - *rindex += 0x80; - } - dev9202_clk.last_clk_count = clk_count; - return RET_FIFO_ERR; - } - if (*rindex < 0x80) - { - *rindex = *windex; - dev9202_clk.last_clk_count = clk_count; - return RET_FIFO_ERR; - } - if (*windex == *rindex) - { - dev9202_clk.last_clk_count = clk_count; - return RET_FIFO_ERR; - } - dev9202_clk.last_clk_count = clk_count; - return RET_OK; -} - -/** - * @brief 获取fifos数据 - * @param enfifo-是否使能fifo,p_result-数据地址,psize-数据大小,rindex-读地址,windex-写地址,slot_num-通道数量 - * @retval 无 - */ -static void vc9202_drv_read_fifo_data(unsigned char enfifo, SamplingDataTypeDef *p_result, unsigned char *psize, unsigned char *rindex, unsigned char *windex, unsigned char slot_num) -{ - unsigned char i = 0; - unsigned char fifo_length = 0; - unsigned char fifoData[128] = {0}; - unsigned char fifo_index_offset = 0; /*正常情况下:r=w, 异常情况下,r=w-fifo_index_offset */ - /*------------- disable fifo -------------*/ - if (!enfifo) - { - *psize = slot_num; - usr_iic_read_bytes(0x80, fifoData, slot_num * 2); - for (i = 0; i < *psize; i++) - { - p_result->ppg_data[i] = (fifoData[i * 2] << 8) + fifoData[i * 2 + 1]; - if (ppg_mark[i]) - { - ppg_mark[i] = 0; - p_result->ppg_data[i] |= 0x1000; // 0x01000000; - } - } - return; - } - /*------------- enable fifo -------------*/ - /* 读取解析fifo数据 */ - if (*windex > *rindex) - { - fifo_length = *windex - *rindex; - if ((fifo_length % (dev9202_info.slot_number * 2)) && (dev9202_info.slot_number >= 2)) /* 当是多通道,但是通道数与字节数对应不上的异常处理 */ - { - fifo_index_offset = fifo_length % (dev9202_info.slot_number * 2); - fifo_length = fifo_length - fifo_index_offset; /* 只读取满足通道数的fifo数量,如果未出现异常,fifo_index_offset=0,跟之前处理一样 */ - } - usr_iic_read_bytes(*rindex, fifoData, fifo_length); - *rindex = *windex - fifo_index_offset; - } - else - { - fifo_length = *windex + 0x80 - *rindex; - if ((fifo_length % (dev9202_info.slot_number * 2)) && (dev9202_info.slot_number >= 2)) /* 当是多通道,但是通道数与字节数对应不上的异常处理 */ - { - fifo_index_offset = fifo_length % (dev9202_info.slot_number * 2); - fifo_length = fifo_length - fifo_index_offset; /* 只读取满足通道数的fifo数量 */ - } - if (*windex == 0x80) /* 数据刚好在0xfe-0xff截至 */ - { - usr_iic_read_bytes(*rindex, fifoData, fifo_length); - if (fifo_index_offset) - { - *rindex = *windex + 0x80 - fifo_index_offset; - } - else - { - *rindex = *windex - fifo_index_offset; /* fifo_index_offset=0 */ - } - } - else /* (*windex != 0x80): 0x80及以后还有数据 */ - { - usr_iic_read_bytes(*rindex, fifoData, (256 - *rindex)); /* 获取rindex-0xff的数据 */ - usr_iic_read_bytes(0x80, &fifoData[256 - *rindex], (*windex - 0x80) - fifo_index_offset); /* 剩下的数据部分如果存在 */ - *rindex = *windex - fifo_index_offset; - } - } - - *psize = fifo_length / 2; - for (i = 0; i < *psize; i++) - { - p_result->ppg_data[i] = (fifoData[i * 2] << 8) + fifoData[i * 2 + 1]; - if (ppg_mark[i]) - { - ppg_mark[i] = 0; - p_result->ppg_data[i] |= 0x1000; // 0x01000000; - } - } -} - -/** - * @brief 校验fifo并获取结果 - * @param p_result-数据地址,psize-数据大小 - * @retval 执行结果 - */ -static VC9202DrvRetTypeDef vc9202_drv_read_fifo_result(SamplingDataTypeDef *p_result, unsigned char *psize) -{ - VC9202DrvRetTypeDef vc_ret = RET_OK; - unsigned char write_index = 0; - unsigned char event = 0; - event = dev9202_info.int_event; -#if (VC9202_CFG_DRV_BY_TIMER == FUNC_ENABLE) - event = VC9202_EVENT_FIFO_MARK; -#endif - if (event & VC9202_EVENT_FIFO_MARK) - { - usr_iic_read_bytes(0x03, &write_index, 1); - vc_ret |= vc9202_drv_fifo_infomation_check(&dev9202_info.read_fifo_address, &write_index, dev9202_info.slot_number, dev9202_info.enfifo_div); - if (RET_OK == vc_ret && dev9202_info.osc_clk_status) - { - vc9202_drv_read_fifo_data(dev9202_info.enfifo_div, p_result, psize, &dev9202_info.read_fifo_address, &write_index, dev9202_info.slot_number); - } - } - return vc_ret; -} - -/*********************************************************************************************************/ -/** - * @brief 读取相关采样值和寄存器值 - * @param 无 - * @retval 无 - */ -static unsigned char vc9202_drv_read_reg(SamplingDataTypeDef *read_reg) -{ - unsigned char reg_val[6] = {0}; - unsigned char res_ext[2] = {0}; - VC9202ResLevelTypeDef res = {0}; - - /* 4bit数据读取 */ - usr_iic_read_bytes(0x04, reg_val, 3); - read_reg->pre_val[0] = reg_val[0] & 0x0F; - read_reg->pre_val[1] = reg_val[1] & 0x0F; - read_reg->env_val[0] = (reg_val[0] >> 4) & 0x0F; - read_reg->env_val[1] = (reg_val[1] >> 4) & 0x0F; - read_reg->env_val[2] = (reg_val[2] >> 4) & 0x0F; - read_reg->ps_val = reg_val[2] & 0x0F; - - /* old param */ - usr_iic_read_bytes(0x17, reg_val, 6); - read_reg->led_cur[0] = reg_val[0] & 0x7F; - read_reg->led_cur[1] = reg_val[1] & 0x7F; - read_reg->led_cur[2] = reg_val[2] & 0x7F; - read_reg->pd_res[0] = (reg_val[3] >> 4) & 0x07; - read_reg->pd_res[1] = (reg_val[4] >> 4) & 0x07; - read_reg->pd_res[2] = (reg_val[5] >> 4) & 0x07; - /* 8bit数据读取 */ - usr_iic_read_bytes(0x41, reg_val, 6); - read_reg->aenv_val[0] = reg_val[0]; - read_reg->aenv_val[1] = reg_val[1]; - read_reg->aenv_val[2] = reg_val[2]; - read_reg->apre_val[0] = reg_val[3]; - read_reg->apre_val[1] = reg_val[4]; - read_reg->aps_val = reg_val[5]; - /* new param */ - usr_iic_read_bytes(0x22, res_ext, 2); - /* slot0 */ - dev9202_adjust[0].slot_env = read_reg->aenv_val[0]; - dev9202_adjust[0].current = read_reg->led_cur[0]; - res.res_val = read_reg->pd_res[0]; - res.low_res = (res_ext[0] >> 0) & 0x01; - res.offset = (res_ext[0] >> 4) & 0x03; - res.offset3 = 0; - dev9202_adjust[0].res_level = vc9202_drv_res_register_to_level(&res); - /* slot1 */ - dev9202_adjust[1].slot_env = read_reg->aenv_val[1]; - dev9202_adjust[1].current = read_reg->led_cur[1]; - res.res_val = read_reg->pd_res[1]; - res.low_res = (res_ext[0] >> 1) & 0x01; - res.offset = (res_ext[0] >> 6) & 0x03; - res.offset3 = 0; - dev9202_adjust[1].res_level = vc9202_drv_res_register_to_level(&res); - /* slot2 */ - dev9202_adjust[2].slot_env = read_reg->aenv_val[2]; - dev9202_adjust[2].current = read_reg->led_cur[2]; - dev9202_adjust[2].res_level = read_reg->pd_res[2]; - /* 如果有等效电阻的等级,那么传出等效等级 */ - read_reg->pd_res[0] = dev9202_adjust[0].res_level; - read_reg->pd_res[1] = dev9202_adjust[1].res_level; - read_reg->pd_res[2] = dev9202_adjust[2].res_level; - /* pdbias */ - usr_iic_read_bytes(0x47, reg_val, 4); - read_reg->apdbias_val[0] = reg_val[0]; - read_reg->apdbias_val[1] = reg_val[1]; - read_reg->apdbias_val[2] = reg_val[2]; - read_reg->apdbias_val[3] = reg_val[3] & 0xf; - read_reg->pdbias = read_reg->apdbias_val[2] * 16 + read_reg->apdbias_val[3]; - - usr_iic_read_bytes(0x4B, reg_val, 4); - read_reg->bio_val_i = (reg_val[0] << 8) + reg_val[1]; - read_reg->bio_val_o = (reg_val[2] << 8) + reg_val[3]; - - if ((read_reg->aps_val >> 4) == read_reg->ps_val) /* 防止数据错误,4bit与8bit不匹配,则不对佩戴数据进行更新,防止因为异常摘下 */ - { - dev9202_wear.wear_ps = read_reg->aps_val; - dev9202_wear.wear_env = read_reg->pdbias; - dev9202_wear.wear_bio = read_reg->bio_val_o; - } - return 0; -} - -// 注意,该部分需要分为两部分,一部分为中断调用,一部分为定时调用,保证低端客户的可用性较高 -/** - * @brief 通过宏定义#if (FUNC_ENABLE==VC9202_CFG_DRV_BY_TIMER) 已经对定时器调用方式做了对应的处理,现在通用一个函数接口即可 - * @param 无 - * @retval 无 - */ -static VC9202DrvRetTypeDef vc9202_drv_gpio_event_handler(SamplingDataTypeDef *pResult, unsigned char *psize) -{ - VC9202DrvRetTypeDef vc_ret = RET_OK; - switch (dev9202_info.work_mode) - { - case WORK_MODE_HR: - vc_ret |= vc9202_drv_status_event_verify(dev9202_info.work_status, dev9202_info.int_event); - vc9202_drv_calibration_osc_clk(); - vc_ret |= vc9202_drv_read_fifo_result(pResult, psize); - break; - case WORK_MODE_SPO2: - vc_ret |= vc9202_drv_status_event_verify(dev9202_info.work_status, dev9202_info.int_event); - vc9202_drv_calibration_osc_clk(); - vc_ret |= vc9202_drv_read_fifo_result(pResult, psize); - break; - case WORK_MODE_HRV: - vc_ret |= vc9202_drv_status_event_verify(dev9202_info.work_status, dev9202_info.int_event); - vc9202_drv_calibration_osc_clk(); - vc_ret |= vc9202_drv_read_fifo_result(pResult, psize); - break; - case WORK_MODE_STRESS: - vc_ret |= vc9202_drv_status_event_verify(dev9202_info.work_status, dev9202_info.int_event); - vc9202_drv_calibration_osc_clk(); - vc_ret |= vc9202_drv_read_fifo_result(pResult, psize); - break; - case WORK_MODE_WEAR: - vc_ret |= vc9202_drv_status_event_verify(dev9202_info.work_status, dev9202_info.int_event); - vc9202_drv_calibration_osc_clk(); - break; - case WORK_MODE_FACTORY: - if (dev9202_info.int_event & VC9202_EVENT_OV_MARK) - { - vc_ret |= vc9202_drv_adjust_over_load_configure(&dev9202_adjust[0], 0, dev9202_info.work_status); - } - pResult->led_cur[0] = dev9202_adjust[0].max_current; - break; - case WORK_MODE_FPC_TEST: - vc9202_test_handler(pResult, &vc9202_test_info); - break; - default: - break; - } - return vc_ret; -} - -/** - * @brief 初始化驱动参数 - * @param - @pInit fifo_div fifo分频深度 - @pInit enslot 通道使能配置 - * @retval 无 - */ -void vc9202_drv_system_param_init(unsigned char fifo_div, unsigned char enslot) -{ - unsigned char i = 0; - /* dev info param init */ - dev9202_info.enfifo_div = fifo_div; - dev9202_info.enslot[0] = (enslot & 0x01); - dev9202_info.enslot[1] = (enslot & 0x02) >> 1; - dev9202_info.slot_number = dev9202_info.enslot[0] + dev9202_info.enslot[1]; - - dev9202_info.osc_clk_status = 0; - dev9202_info.read_fifo_address = 0x80; - /* dev9202_adjust info param init */ - for (i = 0; i < 2; i++) - { - dev9202_adjust[i].max_current = VC9202_MAX_CUR_LEVEL; - dev9202_adjust[i].max_res_level = VC9202_MAX_RES_LEVEL; - dev9202_adjust[i].record_env = 0; - dev9202_adjust[i].info.dir = AGC_DIR_NULL; - dev9202_adjust[i].info.last_dir = AGC_DIR_NULL; - dev9202_adjust[i].info.current_step = 4; - } - dev9202_adjust[2].max_res_level = VC9202_MAX_RES_LEVEL; - /* dev9202_wear param init */ -#if (VC9202_CFG_WEAR_DEFAULT_STATUS == WEAR_IS_HOLD) - dev9202_info.wear_status = WEAR_STA_HOLD; - dev9202_wear.wear_status = WEAR_STA_HOLD; - dev9202_wear.last_status = (WEAR_STA_NONE == dev9202_wear.last_status) ? WEAR_STA_HOLD : dev9202_wear.last_status; -#else - dev9202_wear.wear_status = WEAR_STA_DROP; - dev9202_wear.last_status = (WEAR_STA_NONE == dev9202_wear.last_status) ? WEAR_STA_DROP : dev9202_wear.last_status; -#endif -#if (VC9202_CFG_WEAR_DETECTION != FUNC_ENABLE) - dev9202_info.wear_status = WEAR_STA_HOLD; - dev9202_wear.wear_status = WEAR_STA_HOLD; - dev9202_wear.last_status = WEAR_STA_HOLD; -#endif - if (dev9202_wear.last_status == WEAR_STA_DROP && dev9202_info.work_mode != WORK_MODE_FACTORY && dev9202_info.work_mode != WORK_MODE_FPC_TEST) - { - if (dev9202_info.enslot[0]) - { - vc9202_drv_channel_switch(0, 0); - } - if (dev9202_info.enslot[1]) - { - vc9202_drv_channel_switch(1, 0); - } - } - dev9202_wear.wear_status = dev9202_wear.last_status; - dev9202_info.wear_status = dev9202_wear.wear_status; - alg_wear_status = WEAR_STA_HOLD; - dev9202_wear.wear_drop_cnt = VC9202_CFG_WEAR_DROP_CNT; - dev9202_wear.wear_hold_cnt = VC9202_CFG_WEAR_HOLD_CNT; - vc9202_drv_clear_clk(); -#if 0 - f_BIOInit(VC9202_CFG_WEAR_PARAM_BIOIN, VC9202_CFG_WEAR_PARAM_PSIN); - bio_result = VC9202_BIO_STA_NONE; - if( dev9202_wear.last_status==WEAR_STA_HOLD ) - { - bio_result = VC9202_BIO_STA_HOLD; - } - else - { - bio_result = VC9202_BIO_STA_NONE; - } -#else - // printf("fifo_div : %d, enslot : %d \n", fifo_div, enslot ); - // printf("f_BIOedgeinit(%d, %d) \n", VC9202_CFG_WEAR_PARAM_BIOIN, VC9202_CFG_WEAR_PARAM_PSIN ); - if (VC9202_BIO_STA_NONE == bio_result) - { - uint32_t irq_sts = osal_irq_lock(); - f_BIOInit(VC9202_CFG_WEAR_PARAM_BIOIN, VC9202_CFG_WEAR_PARAM_PSIN); - osal_irq_restore(irq_sts); - // printf(" VC9202_BIO_STA_DROP == bio_result f_BIOedgeinit(%d, %d) \n", VC9202_CFG_WEAR_PARAM_BIOIN, VC9202_CFG_WEAR_PARAM_PSIN ); - } -#endif -} - -/********************************************************************************************************* - * 对外功能函数 - ********************************************************************************************************/ - -/** - * @brief 获取chip_id - * @param 无 - * @retval chip_id值 - */ -unsigned char vc9202_drv_get_chip_id(void) -{ - unsigned char chip_id = 0; - usr_iic_read_bytes(0x00, &chip_id, 1); - // printf("vc9202 chip id : 0x%x\n",chip_id); - return chip_id; -} - -/** - * @brief 开始采样 - * @param 无 - * @retval 无 - */ -void vc9202_drv_start_sampling(void) -{ - unsigned char temp = 0x00; - usr_iic_read_bytes(0x10, &temp, 1); - temp |= (1 << 7); - usr_iic_write_bytes(0x10, &temp, 1); -} - -/** - * @brief 停止采样 - * @param 无 - * @retval 无 - */ -void vc9202_drv_stop_sampling(void) -{ - unsigned char temp = 0x00; - usr_iic_read_bytes(0x10, &temp, 1); - temp &= ~(1 << 7); - usr_iic_write_bytes(0x10, &temp, 1); - bio_result = VC9202_BIO_STA_NONE; -} - -/** - * @brief 软复位 - * @param 无 - * @retval 无 - */ -void vc9202_drv_soft_reset(void) -{ - unsigned char reset_reg_cfg = 0x5A; - usr_iic_write_bytes(0x3B, &reset_reg_cfg, 1); -} - -/** - * @brief 独立使/失能某一物理通道 - * @param - @num_channel 通道编号(0,1,2) - @enable_flag 使能或失能标志位 - * @retval 0执行成功 - */ -unsigned char vc9202_drv_channel_switch(unsigned char num_channel, unsigned char enable_flag) -{ - unsigned char temp = 0x00; - usr_iic_read_bytes(0x10, &temp, 1); - if (num_channel > 2) - { - return 1; - } - if (enable_flag == 1) - { - temp |= (1 << num_channel); - usr_iic_write_bytes(0x10, &temp, 1); - /* 同频处理 */ - if (WORK_MODE_SPO2 == dev9202_info.work_mode) - { - usr_iic_read_bytes(0x11, &temp, 1); - temp &= ~(1 << 4); - usr_iic_write_bytes(0x11, &temp, 1); - temp = 0; - usr_iic_write_bytes(0x16, &temp, 1); - } - } - else if (enable_flag == 0) - { - temp &= ~(1 << num_channel); - usr_iic_write_bytes(0x10, &temp, 1); - /* 同频处理 */ - usr_iic_read_bytes(0x11, &temp, 1); - temp |= (1 << 4); - usr_iic_write_bytes(0x11, &temp, 1); - temp = dev9202_info.enfifo_div; - usr_iic_write_bytes(0x16, &temp, 1); - } - else - { - return 2; - } - return 0; -} - -/** - * @brief 获取中断原因 - * @param 无 - * @retval 中断原因 - */ -unsigned char vc9202_drv_get_int_reason(void) -{ - unsigned char int_reason = 0; - unsigned char int_enable = 0; - usr_iic_read_bytes(0x02, &int_reason, 1); - usr_iic_read_bytes(0x11, &int_enable, 1); - /* 在同频时,获取到的ps中断,并非ps所需要的中断 */ - if (!(int_enable & (1 << 4))) - { - int_reason &= ~(1 << 4); - } -#if (VC9202_CFG_DRV_BY_TIMER == FUNC_ENABLE) - int_reason = (VC9202_EVENT_PS_MARK | VC9202_EVENT_FIFO_MARK); -#endif - return int_reason; -} - -/** - * @brief 防止静电打死,自动恢复,定时去调用检查即可 - * @param 无 - * @retval - */ -void vc9202_drv_electrostatic_death(void) -{ - unsigned char work_reg = 1; - unsigned char bio_reg[2] = {1, 1}; - unsigned short bio_val = 0; - usr_iic_read_bytes(0x10, &work_reg, 1); - if(dev9202_info.enable_bio) - { - usr_iic_read_bytes(0x4D, bio_reg, 2); - } - bio_val = (bio_reg[1] << 8) + bio_reg[0]; - /* dev9202 death */ - if (0 == work_reg || 0 == bio_val) - { - InitParamTypeDef init_param = {dev9202_info.fifo_time, dev9202_info.work_mode}; - vc9202_drv_soft_reset(); - vc9202_drv_reg_init(&init_param); - } -} - -/** - * @brief 防止任务队列堆积处理,导致短时间连续执行 - * @param 无 - * @retval 0-pass,-1-fail - */ -#define CHECK_GAPTIME_RATIO 3/4 /* 最短中断时间的3/4,30ms,算上频率在[16K,24K]波动,限制的时间为[25~37]ms以内会被过滤掉 */ -static int vc9202_drv_check_running_gaptime(void) -{ - unsigned int last_count = dev9202_clk.last_clk_check; - unsigned int now_count = 0; - - unsigned int count1 = 0, count2 = 0; - unsigned int count_diff = 0; - unsigned char cnt_reg[4] = {0}; - int ret = 0; - unsigned char check_gap_time = (1000/dev9202_info.work_frequency)*CHECK_GAPTIME_RATIO; - usr_iic_read_bytes(0x07, cnt_reg, 4); - count1 = (cnt_reg[0] << 8) + cnt_reg[1]; - count2 = (cnt_reg[2] << 8) + cnt_reg[3]; - count_diff = (count1 <= count2) ? (count2 - count1) : (count2 - count1 + 0xffff); - /* count值获取正确有效 */ - if (count_diff <= 5) - { - now_count = count1; - } - count_diff = 8000; - if ((0 != now_count) && (0 != last_count)) - { - count_diff = (last_count <= now_count) ? (now_count - last_count) : (now_count - last_count + 0xffff); - } - /* 间隔时间过小,算上频率在[16K,24K]波动,限制的时间为[25~37]ms以内会被过滤掉 */ - if (count_diff <= 20 * check_gap_time) - { - ret = -1; - } - dev9202_clk.last_clk_check = now_count; - return ret; -} - -/** - * @brief 寄存器配置 - * @param - @pInit_Param->work_mode 工作模式 - @pInit_Param->sampling_gap_time FIFO中断间隔时间,FIFO深度 - * @retval 无 - */ -unsigned char vc9202_drv_reg_init(InitParamTypeDef *pInit_Param) -{ - unsigned short int clk_div = 0x0000; - unsigned char fifo_div = 0; - unsigned char reg_cfg[17] = {0x00, 0x1F, 0x8A, 0x00, 0x03, 0x1F, 0x00, 0x00, 0x80, 0x00, 0x57, 0x57, 0x07, 0x16, 0x56, 0x16, 0x00}; - unsigned char reg_new = (1 << 3); - unsigned char reg_bio_cfg[2] = {0x00, 0xA2}; -/* 设置中断触发方式 0上升沿 1下降沿 */ -#if VC9202_CFG_INTERRUPT_MODE - reg_cfg[1] |= (1 << 7); -#endif - -/* 设置中断电平保持时间 */ -#ifdef VC9202_CFG_INTERRUPT_TIME - reg_cfg[1] |= (VC9202_CFG_INTERRUPT_TIME << 5); -#endif - - /* 设置FIFO深度,FIFO/PS中断间隔时间,同时设置采样分频 */ - dev9202_info.work_frequency = VC9202_CFG_SAMPLE_RATE; - dev9202_info.work_mode = (WorkModeTypeDef)pInit_Param->work_mode; - dev9202_info.fifo_time = pInit_Param->sampling_gap_time; - if (WORK_MODE_HRV == dev9202_info.work_mode) - { - dev9202_info.work_frequency = 100; - dev9202_info.fifo_time = 200; - } - fifo_div = dev9202_info.fifo_time / (1000 / dev9202_info.work_frequency) - 1; - clk_div = (20000 / dev9202_info.work_frequency) - 1; - reg_cfg[3] = fifo_div; - reg_cfg[4] = (clk_div >> 8) & 0xFF; - reg_cfg[5] = (clk_div & 0xFF); - reg_cfg[6] = fifo_div; - - /* 设置PS通道PD电阻,LED电流 */ - reg_cfg[9] = VC9202_CFG_PS_SLOT_CUR; - reg_cfg[12] = VC9202_CFG_PS_SLOT_RES; - - switch (dev9202_info.work_mode) - { - case WORK_MODE_HR: - reg_cfg[0] = 0x45; -#if VC9202_CFG_IS_HALVE_CAP - reg_cfg[10] = 0x54; /* 根据发光时间设置滤波电阻 */ - reg_cfg[13] = 0x03; // 0x03; /* 绿灯(物理通道0)映射到逻辑通道0,并设置采样时长为50us */ - reg_cfg[16] = 0x01; /* 发光时间减半,开1倍过采 */ -#else - reg_cfg[10] = 0x57; /* 根据发光时间设置滤波电阻 0x57 */ - reg_cfg[13] = 0x16; /* 绿灯(物理通道0)映射到逻辑通道0,并设置采样时长为50us */ - reg_cfg[16] = 0x00; /* 发光时间减半,开1倍过采 */ -#endif - break; - - case WORK_MODE_SPO2: - reg_cfg[0] = 0x47; - reg_cfg[1] &= ~(1 << 4); /* 关闭PS中断 */ - reg_cfg[6] = 0x00; /* PS开同频,避免引入同频干扰 */ - reg_cfg[7] = 0x80; /* slot0(红光)开32倍增益 */ - reg_cfg[13] = 0xB6; /*B6-3 红外(物理通道2)映射到逻辑通道0,并设置采样时长为200us */ - reg_cfg[14] = 0x76; /*76-3 红光(物理通道1)映射到逻辑通道0,并设置采样时长为200us */ - reg_cfg[16] = 0x04; /* 开16倍过采 */ - break; - - case WORK_MODE_HRV: - reg_cfg[0] = 0x45; -#if VC9202_CFG_IS_HALVE_CAP - reg_cfg[10] = 0x54; /* 根据发光时间设置滤波电阻 */ - reg_cfg[13] = 0x03; /* 绿灯(物理通道0)映射到逻辑通道0,并设置采样时长为50us */ - reg_cfg[16] = 0x01; /* 发光时间减半,开1倍过采 */ -#else - reg_cfg[10] = 0x57; /* 根据发光时间设置滤波电阻 */ - reg_cfg[13] = 0x16; /* 绿灯(物理通道0)映射到逻辑通道0,并设置采样时长为50us */ - reg_cfg[16] = 0x00; /* 发光时间减半,开1倍过采 */ -#endif - reg_bio_cfg[1] = 0x00; - break; - - case WORK_MODE_STRESS: - reg_cfg[0] = 0x45; -#if VC9202_CFG_IS_HALVE_CAP - reg_cfg[10] = 0x54; /* 根据发光时间设置滤波电阻 */ - reg_cfg[13] = 0x03; /* 绿灯(物理通道0)映射到逻辑通道0,并设置采样时长为50us */ - reg_cfg[16] = 0x01; /* 发光时间减半,开1倍过采 */ -#else - reg_cfg[10] = 0x57; /* 根据发光时间设置滤波电阻 */ - reg_cfg[13] = 0x16; /* 绿灯(物理通道0)映射到逻辑通道0,并设置采样时长为50us */ - reg_cfg[16] = 0x00; /* 发光时间减半,开1倍过采 */ -#endif - break; - - case WORK_MODE_WEAR: - reg_cfg[0] = 0x44; - reg_cfg[1] = (reg_cfg[1] | (1 << 4)) & 0xF0; - break; - - case WORK_MODE_FACTORY: - reg_cfg[0] = 0x47; - reg_cfg[7] = 0xEF; - reg_cfg[8] = 0xEF; - reg_cfg[10] = 0x77; - reg_cfg[11] = 0x77; - break; - case WORK_MODE_FPC_TEST: - reg_cfg[0] = 0x47; - reg_cfg[7] = 0xEF; - reg_cfg[8] = 0xEF; - reg_cfg[10] = 0x77; - reg_cfg[11] = 0x77; - vc9202_test_init(&vc9202_test_info); - break; - default: - break; - } - usr_iic_write_bytes(0x10, reg_cfg, 17); /* 心率血氧相关寄存器配置 */ - usr_iic_write_bytes(0x22, ®_new, 1); - usr_iic_write_bytes(0x23, reg_bio_cfg, 2); /*BIO相关寄存器配置 */ - if (reg_bio_cfg[1] & 0x80) - { - dev9202_info.enable_bio = 1; - } - else - { - dev9202_info.enable_bio = 0; - } - vc9202_drv_system_param_init(fifo_div, reg_cfg[0]); - /* mode位置1,芯片开始工作 */ - vc9202_drv_start_sampling(); - return 0; -} - -/** - * @brief 传递采样数据 - * @param 采样数据保存地址,ppg数量 - * @retval 执行结果 - */ -unsigned char vc9202_drv_get_sampling_data(SamplingDataTypeDef *pSamplingData, unsigned char *psize) -{ - unsigned char ret = 0; - /* 读取状态及中断事件 */ - usr_iic_read_bytes(0x01, &dev9202_info.work_status, 1); - usr_iic_read_bytes(0x02, (unsigned char *)&dev9202_info.int_event, 1); - - // printf("dev9202_info.work_status : 0x%x ,dev9202_info.int_event : 0x%x\n",dev9202_info.work_status,dev9202_info.int_event); - - if (dev9202_info.work_status & 0xf8) /* 防止insample和conflict时数据错误,则不对设备进行处理 */ - { - // printf("dev9202_info.work_status & 0xf8 \n"); - dev9202_info.int_event = 0; /* 异常时,避免执行佩戴检测 */ - return 1; - } - if (-1 == vc9202_drv_check_running_gaptime()) - { - // printf("-1 == vc9202_drv_check_running_gaptime() \n"); - dev9202_info.int_event = 0; /* 异常时,避免执行佩戴检测 */ - return 1; - } - ret = vc9202_drv_read_reg(pSamplingData); - ret = (unsigned char)vc9202_drv_gpio_event_handler(pSamplingData, psize); - return ret; -} diff --git a/code/sdk/zhihui/drivers/ppg/vc9202/src/vc9202_driver_testmode.c b/code/sdk/zhihui/drivers/ppg/vc9202/src/vc9202_driver_testmode.c deleted file mode 100644 index 763c08e75..000000000 --- a/code/sdk/zhihui/drivers/ppg/vc9202/src/vc9202_driver_testmode.c +++ /dev/null @@ -1,176 +0,0 @@ -/********************************************************************************************************* - * Copyright(c) 2022, vcare Corporation. All rights reserved. - ********************************************************************************************************** - * @file vc9202_driver_testmode.c - * @brief - * @details - * @author - * @date - * @version - *********************************************************************************************************/ -//!!!注意:本文文件包含step1(id,频率,温度的读取判断),step2(bio是否满足变化/ps是否能够达到阈值)两步进行FPC测试,用于那些不使用测试板的测试的用户,排查基础问题 -//!!!注意:本文文件包含step1(id,频率,温度的读取判断),step2(bio是否满足变化/ps是否能够达到阈值)两步进行FPC测试,用于那些不使用测试板的测试的用户,排查基础问题 -//如果不需要,删除本文件和其他报错的地方即可 -#include "vc9202_common.h" -#include "vc9202_driver.h" - -VC9202TestInfoTypeDef vc9202_test_info = {0}; - -const static unsigned char disp_green[17] = {0xC5, 0x30, 0x8A, 0x40, 0x03, 0x1F, 0x00, - 0x30, 0x40, 0x5A, - 0x57, 0x37, 0x47, - 0x16, 0x56, 0x16, 0x00}; -const static unsigned char disp_red[17] = {0xC6, 0x30, 0x8A, 0x40, 0x03, 0x1F, 0x00, - 0x30, 0x40, 0x5A, - 0x57, 0x37, 0x47, - 0x16, 0x56, 0x16, 0x00}; -static unsigned int mcu_cnt[2] = {0}, chip_cnt[2] = {0}; -void vc9202_test_init(VC9202TestInfoTypeDef *ptest_info) -{ - mcu_cnt[0] = 0; - mcu_cnt[1] = 0; - chip_cnt[0] = 0; - chip_cnt[1] = 0; - memset(ptest_info, 0, sizeof(VC9202TestInfoTypeDef)); -} - -static unsigned int vc9202_test_real_frequency(void) -{ - unsigned char cnt_reg[4] = {0}; - unsigned int mcu_cnt_dif = 0; - unsigned int chp_cnt_dif = 0; - unsigned int calc_freq = 0; - - mcu_cnt[1] = mcu_cnt[0]; - chip_cnt[1] = chip_cnt[0]; - mcu_cnt[0] = usr_get_clock_ticks(); - usr_iic_read_bytes(0x07, cnt_reg, 4); - chip_cnt[0] = (cnt_reg[0] << 8) + cnt_reg[1]; - unsigned short cnt1 = (cnt_reg[0] << 8) + cnt_reg[1]; - unsigned short cnt2 = (cnt_reg[2] << 8) + cnt_reg[3]; - if (abs(cnt1 - cnt2) >= 10) - { - return 0xffff; - } - if ((0 == mcu_cnt[1]) || (0 == mcu_cnt[0])) - return 20 * 1000; - if ((0 == chip_cnt[1]) || (0 == chip_cnt[0])) - return 20 * 1000; - mcu_cnt_dif = (mcu_cnt[0] > mcu_cnt[1]) ? (mcu_cnt[0] - mcu_cnt[1]) : (VC9202_CFG_CLK_CHECK_MAX - mcu_cnt[1] + mcu_cnt[0]); - chp_cnt_dif = (chip_cnt[0] > chip_cnt[1]) ? (chip_cnt[0] - chip_cnt[1]) : (0xffff - chip_cnt[1] + chip_cnt[0]); - float timeDiff = (float)mcu_cnt_dif / (float)VC9202_CFG_CLK_CHECK_FREQUENCY; - calc_freq = (float)chp_cnt_dif / timeDiff; - if (calc_freq >= 0xffff) - calc_freq = 0xffff; - if (calc_freq <= 0) - calc_freq = 0; - return calc_freq; -} - -static int vc9202_test_led_glint(VC9202TestInfoTypeDef *ptest_info) -{ - static unsigned char glint_count = 0; - if (ptest_info->step1_ret && ptest_info->step2_ret) - { - glint_count++; - if (glint_count == 25) - { - usr_iic_write_bytes(0x10, (unsigned char *)disp_green, 17); - } - else if (glint_count == 50) - { - glint_count = 0; - usr_iic_write_bytes(0x10, (unsigned char *)disp_red, 17); - } - return 1; - } - return 0; -} -/*记录bio变化值的最大的差值,用于判断bio变化是否满足阈值判断*/ -static void vc9202_test_bio_variation(VC9202TestInfoTypeDef *ptest_info, unsigned short bio) -{ - unsigned short now_gap = 0; - ptest_info->biovalue_now[1] = ptest_info->biovalue_now[0]; - ptest_info->biovalue_now[0] = bio; - if (0 == ptest_info->biovalue_now[1] || 0 == ptest_info->biovalue_now[0]) - { - return; - } - now_gap = (ptest_info->biovalue_now[0] > ptest_info->biovalue_now[1]) ? (ptest_info->biovalue_now[0] - ptest_info->biovalue_now[1]) : (ptest_info->biovalue_now[1] - ptest_info->biovalue_now[0]); - if (now_gap > ptest_info->biovalue_max) - { - ptest_info->biovalue_max = now_gap; - ptest_info->biovalue_gap[0] = ptest_info->biovalue_now[0]; - ptest_info->biovalue_gap[1] = ptest_info->biovalue_now[1]; - } - return; -} -void vc9202_test_handler(SamplingDataTypeDef *pResult, VC9202TestInfoTypeDef *ptest_info) -{ - // 判断是否测试完成,只执行交替闪 - if (vc9202_test_led_glint(ptest_info)) - { - return; - } - // step1 计算频率 + 读取ID及中断原因 - if (0 == ptest_info->step1_ret) - { - ptest_info->max_current = pResult->led_cur[0]; - ptest_info->leak_pre_value = pResult->apre_val[0]; - ptest_info->frequency = vc9202_test_real_frequency(); - usr_iic_read_bytes(0x00, &ptest_info->icid, 1); - usr_iic_read_bytes(0x02, &ptest_info->reason, 1); - return; - } - // step2 bio.ps - if (0 != ptest_info->step1_ret && 0 == ptest_info->step2_ret) - { - ptest_info->ps_value = pResult->aps_val; - vc9202_test_bio_variation(ptest_info, pResult->bio_val_o); - } - return; -} - -// 在xx_user.c中调用 case WORK_MODE_FACTORY: factory_test_function( &data ); break; -#if 0 -static void fpc_test_function(SamplingDataTypeDef *pdata) -{ - extern VC9202TestInfoTypeDef vc9202_test_info; - /* 等待5次中断工作稳定 */ - if (vc9202_test_info.wait_cnt <= 5) - { - vc9202_test_info.wait_cnt++; - return; - } - /* 步骤一:常规数据读取判断是否在范围内,此处得数据请根据实际设计对参数进行调整 */ - if (0 == vc9202_test_info.step1_ret) - { - if (vc9202_test_info.icid == 0x21 && vc9202_test_info.reason & 0x3f && - vc9202_test_info.frequency >= 16000 && vc9202_test_info.frequency <= 24000) - { - vc9202_test_info.step1_ret = 1; - } - else - { - vc9202_test_info.step1_ret = 2; - } - } - /* 步骤二:bio/ps数据读取判断是否在范围内 */ - else if (0 == vc9202_test_info.step2_ret) - { - if (vc9202_test_info.biovalue_max >= 400 && vc9202_test_info.ps_value >= 200) - { - vc9202_test_info.step2_ret = 1; - } - } - /*注意:上述方式会一直等待,直到检测通过,也可以使用人为触发记录,进行比较两次触发时的记录值差距是否满足。 - 记录两次不同状态(模拟佩戴和摘下)下时的pdata->bio_val_o,比较差值 - 记录模拟佩戴下的pdata->ps_val,判断是否满足PS范围 - */ - /* 其中step1_ret和step2_ret,分别表示测试是否通过,由于step2_ret需要检测变化量,所以需要一直等待操作,如果测试通过后,驱动会控制红绿灯交替闪烁 */ - DEBUG("[FAT]icid=%#x,reason=%#x,frequency=%d,temperature=%d", vc9202_test_info.icid, vc9202_test_info.reason, vc9202_test_info.frequency, vc9202_test_info.temperature); - printf("[FAT]biovalue_max=%d,ps=%d,gap[%d,%d]", vc9202_test_info.biovalue_max, vc9202_test_info.ps_value, vc9202_test_info.biovalue_gap[0], vc9202_test_info.biovalue_gap[1]); - printf("[FAT]-ret(%d,%d)", vc9202_test_info.step1_ret, vc9202_test_info.step2_ret); -} - -#endif diff --git a/code/sdk/zhihui/drivers/ppg/vc9202/src/vc9202_hal.c b/code/sdk/zhihui/drivers/ppg/vc9202/src/vc9202_hal.c deleted file mode 100644 index 815e80656..000000000 --- a/code/sdk/zhihui/drivers/ppg/vc9202/src/vc9202_hal.c +++ /dev/null @@ -1,207 +0,0 @@ -/* - * @Author: penglei 1624952103@qq.com - * @Date: 2024-03-13 15:08:38 - * @LastEditors: penglei 1624952103@qq.com - * @LastEditTime: 2025-05-15 17:15:13 - * @FilePath: /FD230/code/sdk/drivers/peripheral/ppg/hx3695/hx3695_hal.c - * @Description: - * - * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. - */ - -#include -#include -#include -#include -#include - -#include "pm_control.h" -#include "platform_core.h" -#include "pinctrl_porting.h" -#include "hal_gpio.h" - -#ifdef PPG_VC9202 -#include "vc30x91x92x_common.h" -#include "vc9202_user.h" -#endif - -#ifdef PPG_HX3695 - - -hx3695_msg_callback_t g_send_msg_toUI = NULL; - -// typedef void (*hx3695_msg_callback_t)(uint8_t msg_type, uint8_t *msg_data, int32_t msg_datalen); -uint32_t hx3695_register_msg_callback(hx3695_msg_callback_t func) -{ - g_send_msg_toUI = func; - return 0; -} - -hx3695_msg_callback_t hx3695_get_send_msg_callback_func(void) -{ - return g_send_msg_toUI; -} - - -#include "hx3695.h" -#include "tyhx_hrs_custom.h" - -#endif - - -// S_AGPIO_L26 心率复位 PPG reset -#define GPIO_PIN_PRG_RESET S_AGPIO_L26 -// S_AGPIO_R0 PRG_LED_POWER ON 心率等电源控制脚 -#define GPIO_PIN_PRG_LED_ON S_AGPIO_R0 - -uint32_t tyhx_poweron(void) -{ - uapi_pin_set_mode(GPIO_PIN_PRG_RESET, (pin_mode_t)HAL_PIO_FUNC_GPIO); - uapi_gpio_set_dir(GPIO_PIN_PRG_RESET, GPIO_DIRECTION_OUTPUT); - uapi_gpio_set_val(GPIO_PIN_PRG_RESET, GPIO_LEVEL_HIGH); - - uapi_pin_set_mode(GPIO_PIN_PRG_LED_ON, (pin_mode_t)HAL_PIO_FUNC_GPIO); - uapi_gpio_set_dir(GPIO_PIN_PRG_LED_ON, GPIO_DIRECTION_OUTPUT); - uapi_gpio_set_val(GPIO_PIN_PRG_LED_ON, GPIO_LEVEL_HIGH); - LOS_Udelay(30); - return 0; -} -uint32_t tyhx_poweroff(void) -{ - uapi_pin_set_mode(GPIO_PIN_PRG_RESET, (pin_mode_t)HAL_PIO_FUNC_GPIO); - uapi_gpio_set_dir(GPIO_PIN_PRG_RESET, GPIO_DIRECTION_OUTPUT); - uapi_gpio_set_val(GPIO_PIN_PRG_RESET, GPIO_LEVEL_LOW); - - uapi_pin_set_mode(GPIO_PIN_PRG_LED_ON, (pin_mode_t)HAL_PIO_FUNC_GPIO); - uapi_gpio_set_dir(GPIO_PIN_PRG_LED_ON, GPIO_DIRECTION_OUTPUT); - uapi_gpio_set_val(GPIO_PIN_PRG_LED_ON, GPIO_LEVEL_LOW); - LOS_Mdelay(1); - return 0; -} - - -void ppg_send_cmd_to_vc9202_driver(char* mode, uint8_t enable) -{ -#ifdef PPG_VC9202 - WorkModeTypeDef md = WORK_MODE_NONE; -#elif defined PPG_HX3695 - WORK_MODE_T md = NULL_MODE; -#endif - if (strcmp(mode, "hrs") == 0) { -#ifdef PPG_VC9202 - md = WORK_MODE_HR; -#elif defined PPG_HX3695 - md = HRS_MODE; -#endif - } else if (strcmp(mode, "hrv") == 0) { -#ifdef PPG_VC9202 - md = WORK_MODE_HRV; -#elif defined PPG_HX3695 - md = HRV_MODE; -#endif - } else if (strcmp(mode, "spo2") == 0) { -#ifdef PPG_VC9202 - md = WORK_MODE_SPO2; -#elif defined PPG_HX3695 - md = SPO2_MODE; -#endif - } else if (strcmp(mode, "leaklight") == 0) { -#ifdef PPG_VC9202 - md = WORK_MODE_FACTORY; -#elif defined PPG_HX3695 - md = FT_LEAK_LIGHT_MODE; -#endif - } else if (strcmp(mode, "graycard") == 0) { -#ifdef PPG_VC9202 - md = WORK_MODE_FACTORY; -#elif defined PPG_HX3695 - md = FT_GRAY_CARD_MODE; -#endif - } else if (strcmp(mode, "ledoff") == 0) { -#ifdef PPG_VC9202 - md = WORK_MODE_NONE; -#elif defined PPG_HX3695 - md = FT_LED_OFF_MODE; -#endif - } else if (strcmp(mode, "wear") == 0) { -#ifdef PPG_VC9202 - md = WORK_MODE_WEAR; -#elif defined PPG_HX3695 - md = WEAR_MODE; -#endif - } else if (strcmp(mode, "single") == 0) { -#ifdef PPG_VC9202 - md = WORK_MODE_NONE; -#elif defined PPG_HX3695 - md = FT_SINGLE_CHECK_MODE; -#endif - }else if (strcmp(mode, "factory") == 0) { -#ifdef PPG_VC9202 - md = WORK_MODE_FACTORY; -#endif - }else if (strcmp(mode, "fpc") == 0) { -#ifdef PPG_VC9202 - md = WORK_MODE_FPC_TEST; -#endif - } - -#ifdef PPG_HX3695 - if (enable == 1 || md == FT_LED_OFF_MODE) -#elif defined PPG_VC9202 - if (enable == 1) -#endif - { - // ppg_service_running_stat = true; - // uapi_pm_control(PM_APP_WAKE_NEEDED); - tyhx_poweron(); -#ifdef PPG_HX3695 - hx3695_init(md); -#endif -#ifdef PPG_VC9202 - InitParamTypeDef pInit_Param = {0}; - pInit_Param.sampling_gap_time = 400; - pInit_Param.work_mode = md; - vc9202_usr_init(&pInit_Param); -#endif - } else { - -#ifdef PPG_HX3695 - // ppg_service_running_stat = false; - if(md == HRS_MODE|| md == FT_LEAK_LIGHT_MODE || md == FT_GRAY_CARD_MODE || md == WEAR_MODE || md == FT_SINGLE_CHECK_MODE) - { -#ifdef HRS_ALG_LIB - hx3695_hrs_disable(); - // PRINT("uapi_dev_runtime_get_sleep_monitoring_status : %d \n",uapi_dev_runtime_get_sleep_monitoring_status()); - // PRINT("uapi_dev_runtime_get_hrs_passivity_flag : %d \n",uapi_dev_runtime_get_hrs_passivity_flag()); - if(uapi_dev_runtime_get_sleep_monitoring_status() && uapi_dev_runtime_get_hrs_passivity_flag())//处于睡眠监测 且在心率周期检测期间 上报活体佩戴 - { - hx3695_wearstatus_update(); - uapi_dev_runtime_set_hrs_passivity(0);//清除被动检测runtime - } -#endif - }else if(md == HRV_MODE) - { -#ifdef HRV_ALG_LIB - hx3695_hrv_disable(); -#endif - }else if(md == SPO2_MODE) - { -#ifdef SPO2_ALG_LIB - hx3695_spo2_disable(); -#endif - } - else{ -#ifdef HRS_ALG_LIB - hx3695_hrs_disable(); -#endif - } - -#elif defined PPG_VC9202 - vc9202_usr_stop_sampling(); -#endif - - - // uapi_pm_control(PM_APP_WAKE_NONEED); - tyhx_poweroff(); - } -} \ No newline at end of file diff --git a/code/sdk/zhihui/drivers/ppg/vc9202/src/vc9202_user.c b/code/sdk/zhihui/drivers/ppg/vc9202/src/vc9202_user.c deleted file mode 100644 index 9cd777c2d..000000000 --- a/code/sdk/zhihui/drivers/ppg/vc9202/src/vc9202_user.c +++ /dev/null @@ -1,652 +0,0 @@ -/********************************************************************************************************* - * Copyright(c) 2022, vcare Corporation. All rights reserved. - ********************************************************************************************************** - * @file vc9202_user.c - * @brief functional Module Layer - * @details The functional interface is implemented by calling the driver.contain init_func,irq_handler - * @author - * @date - * @version - *********************************************************************************************************/ -#include "algo.h" -#include "spo2Algo.h" -#include "vcSportMotionIntAlgo.h" -#include "vc9202_common.h" -#include "vc9202_user.h" -#include "vc9202_driver.h" -#include "custom_utils.h" -#include "platform_core.h" -#include "systick.h" -#include "pinctrl_porting.h" -#include "hal_gpio.h" -#include "los_tick.h" - -static WorkModeTypeDef work_mode = WORK_MODE_NONE; -AlgoCalcResultsTypeDef vc9202_alg_results = {0}; - -/* 蓝牙发送原始数据接口 */ -extern void vc9202_debug_send_heart_rate_data( SamplingDataTypeDef* presult ,GsensorTypeDef* paxis, unsigned char heart_rate, unsigned char algo_mode, unsigned char ppgsize ); -extern void vc9202_debug_send_spo2_data( SamplingDataTypeDef* presult ,GsensorTypeDef* paxis, unsigned char spo2_val, unsigned char ppgsize ); - -/********************************************************************************************************* - * PERIPHERAL FUNCTIONS - ********************************************************************************************************/ -#define CHIP_I2C_ADDRESS 0x33 -#define VC9202_I2C_BUS I2C_BUS_2 - -static uint32_t gr_ppg_data = 0; -static uint32_t red_ppg_data = 0; -static uint32_t ir_ppg_data = 0; - -static uint32_t leaklight_led_cur = 0; //最大电流,黑箱通道2 -static uint32_t leaklight_apre_val = 0;//绿灯强度,漏光模式通道1 -static uint32_t leaklight_aps_val = 0;//红外强度,灰卡模式通道3 - -static uint32_t graycard_apre_val = 0;//绿灯强度,漏光模式通道1 -static uint32_t graycard_aps_val = 0;//红外强度,灰卡模式通道3 - -/** - * @brief iic多字节写 - * @param - * @arg reg_addr:寄存器地址 - * @arg pBuffer:缓冲区指针 - * @arg num_bytes:写的字节数 - * @retval 无 - */ -unsigned char usr_iic_write_bytes(unsigned char reg_addr, unsigned char *pBuffer, unsigned char buf_size) -{ - custom_i2c_write_reg(CHIP_I2C_ADDRESS, reg_addr, 1, pBuffer, buf_size, VC9202_I2C_BUS); - return 0; -} - - -/** - * @brief iic多字节读 - * @param - * @arg reg_addr:寄存器地址 - * @arg pBuffer:缓冲区指针 - * @arg num_bytes:读的字节数 - * @retval 无 - */ -unsigned char usr_iic_read_bytes(unsigned char reg_addr, unsigned char *pBuffer, unsigned char buf_size) -{ - custom_i2c_read_regs(CHIP_I2C_ADDRESS, reg_addr, 1 , pBuffer, buf_size, VC9202_I2C_BUS); - return 0; -} - - -/** - * @brief 校验用时钟tick获取 - * @param 无 - * @retval 时钟tick - */ -unsigned int usr_get_clock_ticks(void) -{ - return uapi_systick_get_count(); -} - -/********************************************************************************************************* - * API FUNCTIONS - ********************************************************************************************************/ -/** - * @brief 获取chip_id - * @param 无 - * @retval chip_id值 - */ -void vc9202_usr_get_chip_id( unsigned char *pchip_id, unsigned char *pvers_id ) -{ - tyhx_poweron(); - usr_iic_read_bytes( 0x00, pchip_id, 1 ); - usr_iic_read_bytes( 0x40, pvers_id, 1 ); - tyhx_poweroff(); -} - -/** - * @brief 初始化 - * @param 无 - * @retval 无 - */ -void vc9202_usr_init( InitParamTypeDef *pInitParam ) -{ - memset( &vc9202_alg_results, 0 ,sizeof(vc9202_alg_results) ); - // vcSpo2AlgoInit(); - spo2AlgoInit(); - Algo_Init(); - vcSportMotionAlgoInit(); - work_mode = (WorkModeTypeDef)pInitParam->work_mode; - vc9202_drv_soft_reset(); - vc9202_drv_reg_init( pInitParam ); -} - -/** - * @brief 开始采样 - * @param 无 - * @retval 无 - */ -void vc9202_usr_start_sampling(void) -{ - vc9202_drv_start_sampling(); -} - - -/** - * @brief 停止采样 - * @param 无 - * @retval 无 - */ -void vc9202_usr_stop_sampling(void) -{ - vc9202_drv_stop_sampling(); -} - - -/** - * @brief 软复位 - * @param 无 - * @retval 无 - */ -void vc9202_usr_soft_reset(void) -{ - vc9202_drv_soft_reset(); -} - -/** - * @brief 独立使/失能某一物理通道 - * @param - @num_channel 通道编号(1,2,3) - @enable_flag 使能或失能标志位 - * @retval 0-成功,其他-失败 - */ -unsigned char vc9202_usr_channel_switch(unsigned char num_channel, unsigned char enable_flag) -{ - return vc9202_drv_channel_switch(num_channel, enable_flag); -} - -/** - * @brief 获取中断原因 - * @param @无 - @ int_reason 中断原因 - * @retval 中断原因 - */ -unsigned char vc9202_usr_get_int_reason(void) -{ - /* bit2:fifo,bit4:ps */ - return vc9202_drv_get_int_reason(); -} -/** - * @brief 获取佩戴检测结果 - * @param @无 - @ 无 - * @retval 佩戴检测结果 - */ -unsigned char vc9202_usr_get_wear_status(void) -{ - unsigned char sta = 0; - WearStatusTypeDef retSta = vc9202_drv_get_wear_status(); - if( WEAR_STA_DROP == retSta ) - { - sta = 0; - } - else - { - sta = 1; - } - return sta; -} - -/**********************************************************************/ - -#define ENABLE_GSENSOR 0 -/* gsensor 相关的示例代码 */ -#if ENABLE_GSENSOR -typedef struct -{ - int16_t AXIS_X; - int16_t AXIS_Y; - int16_t AXIS_Z; -} AxesRaw_t; -static void gsensor_data_match(AxesRaw_t *org_data, GsensorTypeDef *pGsensorParam, unsigned char ppg_size) -{ - const unsigned char arry10[] = {0, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12}; - const unsigned char arry20[] = {0, 2, 3, 5, 6, 8, 9, 11, 12, 14, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30}; - /* ppglen = 10 抽样 */ - if( 10<=ppg_size ) - { - for (uint8_t i = 0; i < ppg_size; i++) - { - pGsensorParam->gsensor_x_axis[i] = org_data[arry10[i]].AXIS_X; - pGsensorParam->gsensor_y_axis[i] = org_data[arry10[i]].AXIS_Y; - pGsensorParam->gsensor_z_axis[i] = org_data[arry10[i]].AXIS_Z; - } - } - else /* ppglen = 20 、25抽样 */ - { - for (uint8_t i = 0; i < ppg_size; i++) - { - pGsensorParam->gsensor_x_axis[i] = org_data[arry20[i]].AXIS_X; - pGsensorParam->gsensor_y_axis[i] = org_data[arry20[i]].AXIS_Y; - pGsensorParam->gsensor_z_axis[i] = org_data[arry20[i]].AXIS_Z; - } - } -} -#endif - -static void get_gsensor_data( GsensorTypeDef *pGsensorParam, unsigned char *pgsensor_len, unsigned char ppg_size ) -{ - /* - Gsensor精度要求 ReadGsensorFIFO(+-4G11bit or +-8G12bit 256/g) - 一个fifo周期为800ms,20组ppg数据,需要获取800ms内至少获取ppgCount组gsensor数据(40ms*20),用于匹配20组ppg信号,此函数需要根据用户实际的gsensor进行匹配处理。 - */ -#if ENABLE_GSENSOR - unsigned char i = 0; - unsigned char gsensor_len = 0; - AxesRaw_t gsensor_buff[40] = {0}; - pGsensorParam->sampling_rate = 25; - pGsensorParam->sensing_range = 4; - pGsensorParam->effective_bits = 12; - // stk8321_get_fifo_data(&gsensor_len, gsensor_buff); - if (ppg_size == 0) - { - *pgsensor_len = gsensor_len; - /* 不抽样 */ - for (i = 0; i < *pgsensor_len; i++) - { - pGsensorParam->gsensor_x_axis[i] = gsensor_buff[i].AXIS_X; - pGsensorParam->gsensor_y_axis[i] = gsensor_buff[i].AXIS_Y; - pGsensorParam->gsensor_z_axis[i] = gsensor_buff[i].AXIS_Z; - } - } - /* æ­¤demo中gsensor的采样频率高于ppg采样,所以正常情况下,gsensor的数量一定是大于ppg的数据。特殊情况需要考虑ppg数量大于gsensor数量。需要对gsensor数据进行补长 */ - if( (gsensor_len>=ppg_size)&&(ppg_size!=0) ) - { - *pgsensor_len = ppg_size; - // gsensor_data_match( gsensor_buff,pGsensorParam, ppg_size ); - } - else if( (gsensor_lengsensor_x_axis[i] = gsensor_buff[i].AXIS_X; - pGsensorParam->gsensor_y_axis[i] = gsensor_buff[i].AXIS_Y; - pGsensorParam->gsensor_z_axis[i] = gsensor_buff[i].AXIS_Z; - } - for( i=gsensor_len; igsensor_x_axis[i] = gsensor_buff[gsensor_len-1].AXIS_X; - pGsensorParam->gsensor_y_axis[i] = gsensor_buff[gsensor_len-1].AXIS_Y; - pGsensorParam->gsensor_z_axis[i] = gsensor_buff[gsensor_len-1].AXIS_Z; - } - } -#endif -} - -static unsigned int vc9202_usr_gsensor_actuating_quantity(int x_axis, int y_axis, int z_axis) -{ - unsigned int ret_atc = 0; - unsigned int abs_sum_current = 0; - static unsigned int abs_sum_last = 0; - if(x_axis < 0) - { - x_axis = -x_axis; - } - if(y_axis < 0) - { - y_axis = -y_axis; - } - if(z_axis < 0) - { - z_axis = -z_axis; - } - abs_sum_current = x_axis + y_axis + z_axis; - if(abs_sum_last&&abs_sum_current) - { - if( ABS(abs_sum_last,abs_sum_current)>=40 ) - { - ret_atc = 1; - } - } - abs_sum_last = abs_sum_current; - /* 存在运动量时处理,释放掉心率算法摘下的状态 */ - if( ret_atc ) - { - vc9202_drv_set_algo_wear_status( WEAR_STA_HOLD ); - } - vc9202_drv_set_gsensor_actuating_quantity( ret_atc ); - return ret_atc; -} - -static short int alg_calculate_hr_handler( short int last_hr_val, SamplingDataTypeDef *pdata, unsigned char ppg_size, GsensorTypeDef *pgsensor, AlgoSportMode hr_alg_mode ) -{ - unsigned char i=0; - short int heart_rate_value = last_hr_val; - AlgoInputData_t alg_i_data={0}; - AlgoOutputData_t alg_o_data={0}; - /* 如果没有fifo则直接推出,此处return需要返回上一次的值 */ - if( ppg_size <= 0 ) - { - return heart_rate_value; - } - if(ppg_size>=40) - { - ppg_size = 40; - } - // printf("ppg_size : %d \n",ppg_size); - alg_i_data.envSample = pdata->env_val[0]; - for( i=0; igsensor_x_axis[i]; - alg_i_data.axes.y = pgsensor->gsensor_y_axis[i]; - alg_i_data.axes.z = pgsensor->gsensor_z_axis[i]; - alg_i_data.ppgSample = pdata->ppg_data[i]; - gr_ppg_data = (uint32_t)pdata->ppg_data[i]; - printf("pdata->ppg_data[%d] : %d \n",i,pdata->ppg_data[i]); - // printf(" i : alg_i_data.axes.x : %d ,alg_i_data.axes.y : %d , alg_i_data.axes.z : %d \n",i,alg_i_data.axes.x,alg_i_data.axes.y,alg_i_data.axes.z); - Algo_Input( &alg_i_data, 1000/25, hr_alg_mode, 1, 1 ); - } - Algo_Output( &alg_o_data ); - // printf("alg_o_data.hrData : %d \n",alg_o_data.hrData); - if( -1 == alg_o_data.hrData ) - { - vc9202_drv_set_algo_wear_status( WEAR_STA_DROP ); - } - else if( alg_o_data.hrData > 0 ) - { - heart_rate_value = alg_o_data.hrData; - } - return heart_rate_value; -} - -static unsigned char alg_calculate_spo2_handler( unsigned char last_spo2_val , SamplingDataTypeDef *pdata, unsigned char ppg_size, GsensorTypeDef *pgsensor, unsigned char spo2_alg_mode ) -{ - unsigned char i=0; - unsigned char spo2_value = last_spo2_val; - float ret_spo2 = 0.0f; - float ir_PPG = 0.0f; - float red_PPG = 0.0f; - float sport_flag = 0.0f; - /* 如果没有fifo则直接推出,此处return需要返回上一次的值 */ - if( ppg_size<=0 ) - { - return spo2_value; - } - for( i=0; ippg_data[i*2]; - red_PPG = (float)pdata->ppg_data[i*2+1]; - red_ppg_data = (uint32_t)red_PPG; - ir_ppg_data = (uint32_t)ir_PPG; - // printf("ir_PPG : %.3f , red_PPG : %.3f \n",ir_PPG,red_PPG); - // ret_spo2 = vcSpo2Calculate( red_PPG, ir_PPG ); - ret_spo2 = spo2Algo(red_PPG,ir_PPG,1); - sport_flag = vcSportMotionCalculate( pgsensor->gsensor_x_axis[i], pgsensor->gsensor_y_axis[i], pgsensor->gsensor_z_axis[i] ); - if ( (-1!=ret_spo2)&&(!sport_flag)) - { - spo2_value = (unsigned char)ret_spo2; - } - } - return spo2_value; -} - -static void factory_test_function( SamplingDataTypeDef *pdata ,uint16_t size) -{ - /* 最大电流 */ - unsigned char ledMaxCur = pdata->led_cur[0]; //最大电流,黑箱通道2 - /* 获取测试数据 */ - unsigned int pre0 = pdata->apre_val[0];//绿灯强度,漏光模式通道1 - unsigned int ps = pdata->aps_val;//红外强度,灰卡模式通道3 - /* 温度 */ - signed short int temp0 = pdata->temp_val_i; - signed short int temp1 = pdata->temp_val_o; - /* compare abs(bio0,bio1) */ - unsigned short int bio0 = pdata->bio_val_o; - unsigned short int bio1 = pdata->bio_val_o; - - // uint8_t leak_light_pass = 0; - // uint8_t gray_card_pass = 0; - // 黑箱测试: - printf("pdata->led_cur[0] : %d , pdata->apre_val[0] : %d , pdata->aps_val : %d \n",pdata->led_cur[0],pdata->apre_val[0],pdata->aps_val); - leaklight_led_cur = pdata->led_cur[0]; - leaklight_apre_val = pdata->apre_val[0]; - leaklight_aps_val = pdata->aps_val; - // if(pdata->led_cur[0] >= 100 && pdata->apre_val[0] <= 64 && pdata->aps_val <= 64) - // { - // leak_light_pass = 1; - // } - // else - // { - // leak_light_pass = 0; - // } - - // 灰卡测试: - printf("pdata->apre_val[0] : %d , pdata->aps_val : %d\n",pdata->apre_val[0],pdata->aps_val); - graycard_apre_val = pdata->apre_val[0]; - graycard_aps_val = pdata->aps_val; - - // if(pdata->apre_val[0] >= 210 && pdata->aps_val >= 210) - // { - // gray_card_pass = 1; - // } - // else - // { - // gray_card_pass = 0; - // } - -} -static void fpc_test_function(SamplingDataTypeDef *pdata) -{ - extern VC9202TestInfoTypeDef vc9202_test_info; - /* 等待5次中断工作稳定 */ - if (vc9202_test_info.wait_cnt <= 5) - { - vc9202_test_info.wait_cnt++; - return; - } - /* 步骤一:常规数据读取判断是否在范围内,此处得数据请根据实际设计对参数进行调整 */ - if (0 == vc9202_test_info.step1_ret) - { - if (vc9202_test_info.icid == 0x21 && vc9202_test_info.reason & 0x3f && - vc9202_test_info.frequency >= 16000 && vc9202_test_info.frequency <= 24000 ) - { - vc9202_test_info.step1_ret = 1; - } - else - { - vc9202_test_info.step1_ret = 2; - } - } - /* 步骤二:bio/ps数据读取判断是否在范围内 */ - else if (0 == vc9202_test_info.step2_ret) - { - if (vc9202_test_info.biovalue_max >= 60 && vc9202_test_info.ps_value >= 200) - { - vc9202_test_info.step2_ret = 1; - } - } - /*注意:上述方式会一直等待,直到检测通过,也可以使用人为触发记录,进行比较两次触发时的记录值差距是否满足。 - 记录两次不同状态(模拟佩戴和摘下)下时的pdata->bio_val_o,比较差值 - 记录模拟佩戴下的pdata->ps_val,判断是否满足PS范围 - */ - /* 其中step1_ret和step2_ret,分别表示测试是否通过,由于step2_ret需要检测变化量,所以需要一直等待操作,如果测试通过后,驱动会控制红绿灯交替闪烁 */ - printf("[FAT]icid=%#x,reason=%#x,frequency=%d,temperature=%d \n", vc9202_test_info.icid, vc9202_test_info.reason, vc9202_test_info.frequency, vc9202_test_info.temperature); - printf("[FAT]biovalue_max=%d,ps=%d,gap[%d,%d] \n", vc9202_test_info.biovalue_max, vc9202_test_info.ps_value, vc9202_test_info.biovalue_gap[0], vc9202_test_info.biovalue_gap[1]); - printf("[FAT]-ret(%d,%d) \n", vc9202_test_info.step1_ret, vc9202_test_info.step2_ret); -} - -void vc9202_usr_interrupt_handler( AlgoSportMode hr_alg_mode, unsigned char spo2_alg_mode ) -{ - unsigned char wear_status = WEAR_STA_NONE; - SamplingDataTypeDef data = {0}; - GsensorTypeDef gsensor_data = {0}; - unsigned char gsensor_size = 0; - unsigned char ppg_size = 0; - VC9202DrvRetTypeDef ret = vc9202_drv_get_sampling_data( &data, &ppg_size ); - // printf("ppg_size : %d work_mode : %d ret : %d\n",ppg_size,work_mode,ret); - switch ( work_mode ) - { - case WORK_MODE_HR: - // printf("11111 vc9202_usr_get_int_reason : 0x%x \n",vc9202_usr_get_int_reason()); - if( vc9202_usr_get_int_reason()&(VC9202_EVENT_PS_MARK|VC9202_EVENT_FIFO_MARK) ) - { - wear_status = vc9202_usr_get_wear_status(); - // printf("11111 wear_status : %d \n",wear_status); - get_gsensor_data(&gsensor_data, &gsensor_size, ppg_size); - if( gsensor_size>0 ) - { - vc9202_usr_gsensor_actuating_quantity( gsensor_data.gsensor_x_axis[0], gsensor_data.gsensor_y_axis[0], gsensor_data.gsensor_z_axis[0] ); - } - if(wear_status) - { - vc9202_alg_results.hr_rate = alg_calculate_hr_handler( vc9202_alg_results.hr_rate, &data, ppg_size, &gsensor_data, hr_alg_mode ); - // printf("vc9202_alg_results.hr_rate : %d \n",vc9202_alg_results.hr_rate); - vc9202_debug_send_heart_rate_data( &data, &gsensor_data, vc9202_alg_results.hr_rate, hr_alg_mode, ppg_size ); - } - else - { - vc9202_alg_results.hr_rate = 0; - Algo_Init(); - } - } - break; - - case WORK_MODE_SPO2: - if( vc9202_usr_get_int_reason()&(VC9202_EVENT_PS_MARK|VC9202_EVENT_FIFO_MARK) ) - { - wear_status = vc9202_usr_get_wear_status(); - get_gsensor_data(&gsensor_data, &gsensor_size, ppg_size); - if(wear_status) - { - vc9202_alg_results.spo2_val = alg_calculate_spo2_handler( vc9202_alg_results.spo2_val, &data, ppg_size/2, &gsensor_data, spo2_alg_mode ); - // printf("vc9202_alg_results.spo2_val : %d \n",vc9202_alg_results.spo2_val); - vc9202_debug_send_spo2_data( &data, &gsensor_data, vc9202_alg_results.spo2_val, ppg_size/2 ); - } - else - { - vc9202_alg_results.spo2_val = 0; - // vcSpo2AlgoInit(); - spo2AlgoInit(); - vcSportMotionAlgoInit(); - } - } - break; - - case WORK_MODE_HRV: - if( vc9202_usr_get_int_reason()&(VC9202_EVENT_PS_MARK|VC9202_EVENT_FIFO_MARK) ) - { - wear_status = vc9202_usr_get_wear_status(); - get_gsensor_data(&gsensor_data, &gsensor_size, ppg_size); - if(wear_status) - { - vc9202_alg_results.hr_rate = alg_calculate_hr_handler( vc9202_alg_results.hr_rate, &data, ppg_size, &gsensor_data, hr_alg_mode ); - /* 校验+算法HRV */ - } - else - { - vc9202_alg_results.hr_rate = 0; - Algo_Init(); - /* 清空数据+初始化算法 */ - } - } - break; - - case WORK_MODE_STRESS: - if( vc9202_usr_get_int_reason()&(VC9202_EVENT_PS_MARK|VC9202_EVENT_FIFO_MARK) ) - { - wear_status = vc9202_usr_get_wear_status(); - get_gsensor_data(&gsensor_data, &gsensor_size, ppg_size); - if(wear_status) - { - /* 校验+算法STRESS */ - } - else - { - /* 清空数据+初始化算法 */ - } - } - break; - - case WORK_MODE_WEAR: - if( vc9202_usr_get_int_reason() & VC9202_EVENT_PS_MARK ) - { - wear_status = vc9202_usr_get_wear_status(); - get_gsensor_data(&gsensor_data, &gsensor_size, ppg_size); - if( gsensor_size>0 ) - { - vc9202_usr_gsensor_actuating_quantity( gsensor_data.gsensor_x_axis[0], gsensor_data.gsensor_y_axis[0], gsensor_data.gsensor_z_axis[0] ); - } - /* 根据佩戴状态添加对应的处理代码 */ - if(wear_status) - { - // printf("111 wear \n"); - } - else - { - // printf("222 nowear \n"); - } - } - break; - case WORK_MODE_FACTORY: - factory_test_function( &data ,ppg_size); - break; - case WORK_MODE_FPC_TEST: - fpc_test_function(&data); - break; - - default: - break; - } -} - -uint32_t vc9202_get_hr_ppg_data(void) -{ - uint32_t ppg_data = gr_ppg_data; - gr_ppg_data = 0; - return ppg_data; -} - -void vc9202_get_spo2_ppg_data(uint32_t *ir_data,uint32_t *red_data) -{ - *ir_data = ir_ppg_data; - *red_data = red_ppg_data; - red_ppg_data = 0; - ir_ppg_data = 0; -} - -void vc9202_get_leaklight_data(uint32_t *led_cur,uint32_t *apre_val,uint32_t *aps_val) -{ - *led_cur = leaklight_led_cur; - *apre_val = leaklight_apre_val; - *aps_val = leaklight_aps_val; - - leaklight_led_cur = 0; - leaklight_apre_val = 0; - leaklight_aps_val = 0; -} - -void vc9202_get_graycard_data(uint32_t *apre_val,uint32_t *aps_val) -{ - *apre_val = graycard_apre_val; - *aps_val = graycard_aps_val; - - graycard_apre_val = 0; - graycard_aps_val = 0; -} - -#if 0 -int main(int argc, char *argv[]) -{ - board_driver_init(); //MCU外设初始化 - InitParamTypeDef config={400,WORK_MODE_HR}; //修改fifo间隔时间(关系到fifolength), 设定工作模式 - vc9102_usr_init( &config ); - while(1) - { - if( irq_msg ) - { - //调用时传入心率算法模式(日常、运动...)和血氧算法参数。 - vc9102_usr_interrupt_handler( algo_mode, 1 ); - } - } - return 0 -} -#endif - diff --git a/code/sdk/zhihui/drivers/ppg/vc9202/src/vc9202_user_debug.c b/code/sdk/zhihui/drivers/ppg/vc9202/src/vc9202_user_debug.c deleted file mode 100644 index c40192b8c..000000000 --- a/code/sdk/zhihui/drivers/ppg/vc9202/src/vc9202_user_debug.c +++ /dev/null @@ -1,188 +0,0 @@ -/********************************************************************************************************* - * Copyright(c) 2022, vcare Corporation. All rights reserved. - ********************************************************************************************************** - * @file vc9202_user_debug.c - * @brief example,debug send original data - * @details - * @author - * @date - * @version - *********************************************************************************************************/ - -#include "vc9202_common.h" -#include "vc9202_user.h" - -// #include "os_timer.h" -// #include -// #include "wristband_global_data.h" -// extern RtkWristBandSysType_t RtkWristbandSys; - -static unsigned char ble_buf[1024]={0}; -static unsigned short int buf_size = 0; -static unsigned short int buf_index = 0; -#define BLE_PACK_SIZE 160 -#define TIMER_BLE_GAP 100 - -/********************************************************************************************************** - * 对苹果手机APP不能连续接收长段数据,利用软件定时器,进行分包发送 - * 创建软件定时器及数据分包处理 - */ -static void send_data_by_ble( unsigned char *pbuf, unsigned short int size ) -{ - // if (RtkWristbandSys.gap_conn_state == GAP_CONN_STATE_CONNECTED) - // { - // hr_ble_service_send_v3_notify(RtkWristbandSys.wristband_conn_id, hr_ser_id, pbuf, size); - // DBG_DIRECT("ble_send_buffer_size=%d",size); - // } -} - -static int timer_send_data_function(void) -{ - unsigned short int residue_size = 0; - //数据发送已经完成 - if( buf_index >= buf_size ) - { - return 0; - } - //判断剩余数据长度是否还需要分包 - residue_size = buf_size-buf_index; - if( residue_size <= BLE_PACK_SIZE ) - { - send_data_by_ble( &ble_buf[buf_index], residue_size ); - return 0; - } - else - { - send_data_by_ble( &ble_buf[buf_index], BLE_PACK_SIZE ); - buf_index +=BLE_PACK_SIZE; - return 1; - } -} - - -/* 创建软件定时器,如果数据太长通过软件定时器发送 */ -#define TIMER_ID 0xf0 -static void *debug_send_timer = NULL; -static void debug_send_timer_start(void) -{ - if( debug_send_timer ) - { - // os_timer_restart(&debug_send_timer, TIMER_BLE_GAP); - } -} -static void debug_send_timer_stop(void) -{ - if( debug_send_timer ) - { - os_timer_stop(&debug_send_timer); - } -} - -static void debug_send_timer_callback( void *p_handle ) -{ - if( timer_send_data_function() ) - { - /* 定时器继续循环 */ - // os_timer_restart(&debug_send_timer, TIMER_BLE_GAP); - } - else - { - /* 关闭定时器 */ - debug_send_timer_stop(); - } -} - -void vc9202_debug_send_timer_init( void ) -{ - if(debug_send_timer == NULL) - { - os_timer_create(&debug_send_timer, "debug_send_timer", TIMER_ID, TIMER_BLE_GAP, false, debug_send_timer_callback); - } - // os_timer_restart(&debug_send_timer, TIMER_BLE_GAP); - os_timer_stop(&debug_send_timer); -} - -static void debug_orginal_data_send( unsigned short int size ) -{ - buf_index = 0; - buf_size = size; - if( buf_size <= BLE_PACK_SIZE ) - { - send_data_by_ble( ble_buf, size ); - } - else - { - send_data_by_ble( ble_buf, BLE_PACK_SIZE ); - buf_index += BLE_PACK_SIZE; - debug_send_timer_start(); - } -} - -/**********************************************************************************************************/ -#define ORIGINAL_DATA_DEBUG_ENABLE (1) - -#if ORIGINAL_DATA_DEBUG_ENABLE - -void vc9202_debug_send_heart_rate_data( SamplingDataTypeDef* presult ,GsensorTypeDef* paxis, unsigned char heart_rate, unsigned char algo_mode, unsigned char ppgsize ) -{ - unsigned short int i = 0; - for( i=0; ippg_data[i] >> 8; - ble_buf[i*16 + 1 ] = presult->ppg_data[i] & 0xff; - ble_buf[i*16 + 2 ] = paxis->gsensor_x_axis[i] >> 8; - ble_buf[i*16 + 3 ] = paxis->gsensor_x_axis[i] & 0xff; - ble_buf[i*16 + 4 ] = paxis->gsensor_y_axis[i] >> 8; - ble_buf[i*16 + 5 ] = paxis->gsensor_y_axis[i] & 0xff; - ble_buf[i*16 + 6 ] = paxis->gsensor_z_axis[i] >> 8; - ble_buf[i*16 + 7 ] = paxis->gsensor_z_axis[i] & 0xff; - ble_buf[i*16 + 8 ] = heart_rate; - ble_buf[i*16 + 9 ] = presult->pd_res[0]; - ble_buf[i*16 + 10] = presult->led_cur[0]; - ble_buf[i*16 + 11] = presult->env_val[2]; - ble_buf[i*16 + 12] = presult->pre_val[0]; - ble_buf[i*16 + 13] = presult->bio_val_o>>8; - ble_buf[i*16 + 14] = presult->bio_val_o&0xff; - ble_buf[i*16 + 15] = presult->aps_val; - } - if( ppgsize > 0 ) - { - debug_orginal_data_send( ppgsize*16 ); - } -} - -/**************************************************************************************** - * - */ -void vc9202_debug_send_spo2_data( SamplingDataTypeDef* presult ,GsensorTypeDef* paxis, unsigned char spo2_val, unsigned char ppgsize ) -{ - unsigned short int i = 0; - for( i=0; ippg_data[i*2] >> 8; - ble_buf[i*16 + 1 ] = presult->ppg_data[i*2] & 0xff; - ble_buf[i*16 + 2 ] = paxis->gsensor_x_axis[i] >> 8; - ble_buf[i*16 + 3 ] = paxis->gsensor_x_axis[i] & 0xff; - ble_buf[i*16 + 4 ] = paxis->gsensor_y_axis[i] >> 8; - ble_buf[i*16 + 5 ] = paxis->gsensor_y_axis[i] & 0xff; - ble_buf[i*16 + 6 ] = presult->pre_val[0]; - ble_buf[i*16 + 7 ] = presult->pre_val[1]; - ble_buf[i*16 + 8 ] = presult->ppg_data[i*2+1] >> 8; - ble_buf[i*16 + 9 ] = presult->ppg_data[i*2+1] & 0xff; - ble_buf[i*16 + 10] = spo2_val; - ble_buf[i*16 + 11] = presult->env_val[2]; - ble_buf[i*16 + 12] = presult->pd_res[0]; - ble_buf[i*16 + 13] = presult->led_cur[0]; - ble_buf[i*16 + 14] = presult->pd_res[1]; - ble_buf[i*16 + 15] = presult->led_cur[1]; - } - if( ppgsize > 0 ) - { - debug_orginal_data_send( ppgsize*16 ); - } -} - -#endif - - - diff --git a/code/sdk/zhihui/drivers/ppg/vc921x/CMakeLists.txt b/code/sdk/zhihui/drivers/ppg/vc921x/CMakeLists.txt deleted file mode 100644 index d91011b88..000000000 --- a/code/sdk/zhihui/drivers/ppg/vc921x/CMakeLists.txt +++ /dev/null @@ -1,62 +0,0 @@ -#=============================================================================== -# @brief cmake file -# Copyright (c) @CompanyNameMagicTag 2022-2023. All rights reserved. -#=============================================================================== -set(COMPONENT_NAME "ppg_sensor_vc921x") - -if("PPG_VC921X" IN_LIST DEFINES) -set(SOURCES ${SOURCES} - ${CMAKE_CURRENT_SOURCE_DIR}/src/vc921x_core.c - ${CMAKE_CURRENT_SOURCE_DIR}/src/vc921x_driver.c - ${CMAKE_CURRENT_SOURCE_DIR}/src/vc921x_original_data_send.c - ${CMAKE_CURRENT_SOURCE_DIR}/src/vc921x_user_app.c - ${CMAKE_CURRENT_SOURCE_DIR}/src/vc921x_hal.c -) -set(PUBLIC_HEADER - ${CMAKE_CURRENT_SOURCE_DIR}/inc - -) - -else() -set(SOURCES ${SOURCES} -) -set(PUBLIC_HEADER - ${CMAKE_CURRENT_SOURCE_DIR} -) -endif() - - -set(PRIVATE_HEADER -) - -set(PRIVATE_DEFINES -) - -set(PUBLIC_DEFINES -) - -# use this when you want to add ccflags like -include xxx -set(COMPONENT_PUBLIC_CCFLAGS -) - -set(COMPONENT_CCFLAGS -) - -set(WHOLE_LINK - true -) - -set(MAIN_COMPONENT - false -) - -if("PPG_VC921X" IN_LIST DEFINES) - find_library(LIB_PATH_VC921X_1 lib/lib_BIO_v141_int_miniSDK_NA_01.a ${CMAKE_CURRENT_SOURCE_DIR}) - find_library(LIB_PATH_VC921X_2 lib/lib_hr_vH102_int_miniSDK_NA_01.a ${CMAKE_CURRENT_SOURCE_DIR}) - find_library(LIB_PATH_VC921X_3 lib/lib_spo2_vc30FS_float_V07_miniSDK_NA_01.a ${CMAKE_CURRENT_SOURCE_DIR}) - find_library(LIB_PATH_VC921X_4 lib/lib_sportMotion_std_int_miniSDK_NA_01.a ${CMAKE_CURRENT_SOURCE_DIR}) - - target_link_libraries(${TARGET_NAME} PRIVATE -Wl,--whole-archive ${LIB_PATH_VC921X_1} ${LIB_PATH_VC921X_2} ${LIB_PATH_VC921X_3} ${LIB_PATH_VC921X_4} PRIVATE -Wl,--whole-archive) -endif() -build_component() - diff --git a/code/sdk/zhihui/drivers/ppg/vc921x/inc/BIODetect_V14_1.h b/code/sdk/zhihui/drivers/ppg/vc921x/inc/BIODetect_V14_1.h deleted file mode 100644 index 9b14b9d68..000000000 --- a/code/sdk/zhihui/drivers/ppg/vc921x/inc/BIODetect_V14_1.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - * - * Created on: 2023-6-04 - * Author: runningHorse - */ - -#ifndef BIODETECT -#define BIODETECT - -#include -#include - -void f_BIOInit(int32_t gapDeltaBIO, int32_t gapDeltaPS); - -uint8_t f_BIOdetect(int32_t inputBIO, int32_t inputPS, int32_t PSth); - -char* bioVersion(void); - -#endif /* BIODETECT */ \ No newline at end of file diff --git a/code/sdk/zhihui/drivers/ppg/vc921x/inc/algo.h b/code/sdk/zhihui/drivers/ppg/vc921x/inc/algo.h deleted file mode 100644 index 3e9531379..000000000 --- a/code/sdk/zhihui/drivers/ppg/vc921x/inc/algo.h +++ /dev/null @@ -1,70 +0,0 @@ - -#ifndef APP_ALGO_ALGO_H -#define APP_ALGO_ALGO_H - -#include -#include - -typedef enum -{ - SPORT_TYPE_NORMAL =0x00, // 日常 - SPORT_TYPE_RUNNING =0x01, // 跑步 - SPORT_TYPE_RIDE_BIKE =0X02, // 骑行 - SPORT_TYPE_JUMP_ROPE =0X03, // 跳绳 - SPORT_TYPE_SWIMMING =0X04, // 游泳 - SPORT_TYPE_BADMINTON =0X05, // 羽毛球 - SPORT_TYPE_TABLE_TENNIS=0X06, // 乒乓球 - SPORT_TYPE_TENNIS =0X07, // 网球 - SPORT_TYPE_CLIMBING =0X08, // 爬山 - SPORT_TYPE_WALKING =0X09, // 徒步 - SPORT_TYPE_BASKETBALL =0X0A, // 篮球 - SPORT_TYPE_FOOTBALL =0X0B, // 足球 - SPORT_TYPE_BASEBALL =0X0C, // 棒球 - SPORT_TYPE_VOLLEYBALL =0X0D, // 排球 - SPORT_TYPE_CRICKET = 0X0E, // 板球 - SPORT_TYPE_RUGBY = 0X0F, // 橄榄球 - SPORT_TYPE_HOCKEY =0X10, // 曲棍球 - SPORT_TYPE_DANCE = 0X11, // 跳舞 - SPORT_TYPE_SPINNING = 0X12, // 动感单车 - SPORT_TYPE_YOGA = 0X13, // 瑜伽 - SPORT_TYPE_SIT_UP =0X14, // 仰卧起坐 - SPORT_TYPE_TREADMILL =0X15, // 跑步机 - SPORT_TYPE_GYMNASTICS =0X16, // 体操 - SPORT_TYPE_BOATING = 0X17, // 划船 - SPORT_TYPE_JUMPING_JACK = 0X18, // 开合跳 - SPORT_TYPE_FREE_TRAINING = 0X19,// 自由训练 - SPORT_TYPE_PERIODIC_MONITORING = 0X1A,// 定时监测模式 -} AlgoSportMode; -//未出现在上表中的运动形式均先以跑步输入 - - -typedef struct -{ - int32_t x; - int32_t y; - int32_t z; -}AlgoAxesData_t; - -typedef struct -{ - int32_t hrData; - int32_t reliability; -}AlgoOutputData_t; - -typedef struct -{ - AlgoAxesData_t axes; - int32_t ppgSample; - int32_t envSample; -}AlgoInputData_t; - -void Algo_Init(void); -void Algo_Input(AlgoInputData_t *pInputData,int32_t gaptime,AlgoSportMode sportMode,int16_t surfaceRecogMode,int16_t opticalAidMode); -void Algo_Output(AlgoOutputData_t *pOutputData); - - - -#endif /* APP_ALGO_ALGO_H_ */ - - - diff --git a/code/sdk/zhihui/drivers/ppg/vc921x/inc/spo2Algo_16bit.h b/code/sdk/zhihui/drivers/ppg/vc921x/inc/spo2Algo_16bit.h deleted file mode 100644 index a838c5ede..000000000 --- a/code/sdk/zhihui/drivers/ppg/vc921x/inc/spo2Algo_16bit.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * File: main.h - * - * MATLAB Coder version : 3.3 - * C/C++ source code generated on : 09-Sep-2020 19:11:59 - */ - -/*************************************************************************/ -/* This automatically generated example C main file shows how to call */ -/* entry-point functions that MATLAB Coder generated. You must customize */ -/* this file for your application. Do not modify this file directly. */ -/* Instead, make a copy of this file, modify it, and integrate it into */ -/* your development environment. */ -/* */ -/* This file initializes entry-point function arguments to a default */ -/* size and value before calling the entry-point functions. It does */ -/* not store or use any values returned from the entry-point functions. */ -/* If necessary, it does pre-allocate memory for returned values. */ -/* You can use this file as a starting point for a main function that */ -/* you can deploy in your application. */ -/* */ -/* After you copy the file, and before you deploy it, you must make the */ -/* following changes: */ -/* * For variable-size function arguments, change the example sizes to */ -/* the sizes that your application requires. */ -/* * Change the example values of function arguments to the values that */ -/* your application requires. */ -/* * If the entry-point functions return values, store these values or */ -/* otherwise use them as required by your application. */ -/* */ -/*************************************************************************/ -#ifndef SPO2ALGO_16bit_H -#define SPO2ALGO_16bit_H - -/* Include Files */ -#include -#include -#include -#include -#include -//#include "rt_nonfinite.h" -//#include "rtwtypes.h" -//#include "spo2_algo_interface_types.h" - -/* Function Declarations */ -extern float vcSpo2Calculate_16bit(float r_ppg, float ir_ppg, float model); -extern int vcSpo2AlgoInit_16bit(void); -extern void vcSpo2AlgoTerminate_16bit(void); -extern char * -version_info_16bit(void); -#endif - -/* - * File trailer for main.h - * - * [EOF] - */ diff --git a/code/sdk/zhihui/drivers/ppg/vc921x/inc/vc921x_core.h b/code/sdk/zhihui/drivers/ppg/vc921x/inc/vc921x_core.h deleted file mode 100644 index 27f915d00..000000000 --- a/code/sdk/zhihui/drivers/ppg/vc921x/inc/vc921x_core.h +++ /dev/null @@ -1,325 +0,0 @@ -/********************************************************************************************** - * @Copyright(c) 2023, Chengdu vcaresensor Microelectronics Corporation. All rights reserved. - * @Author: Tse - * @Date: 2023-09-22 17:39:10 - * @LastEditTime: 2024-03-21 15:58:48 - * @LastEditors: Tse - * @Description: - **********************************************************************************************/ - -#ifndef __VC921x_CORE_H__ -#define __VC921x_CORE_H__ - -#ifndef VC_PACKED -#define VC921x_PACKED //__attribute__((packed)) -#endif - -/*=============================================================== -regist_list_map start... -================================================================*/ -#define CORE921x_DEV_VER_ID_H_ADDR (0x00) -#define CORE921x_FDY_EXT_ID_L_ADDR (0x01) -#define CORE921x_WORK_STATUS1_ADDR (0x02) -#define CORE921x_WORK_STATUS2_ADDR (0x03) -#define CORE921x_FIFO_W_INDEX_ADDR (0x04) -#define CORE921x_OSC_CNT0_H_ADDR (0x05) -#define CORE921x_OSC_CNT0_L_ADDR (0x06) -#define CORE921x_OSC_CNT1_H_ADDR (0x07) -#define CORE921x_OSC_CNT1_L_ADDR (0x08) - -/**************************************************************** - * ic sample param structure, 0x09 - 0x23 = 28byte - ***************************************************************/ -#define CORE921x_SAMPLE_DATA_ADDR_BASE (0x09) -typedef struct -{ - /* env data, 6byte_12bit[12,0] */ - unsigned char slot0_envh6; - unsigned char slot0_envl6; - unsigned char slot1_envh6; - unsigned char slot1_envl6; - unsigned char slot2_envh6; - unsigned char slot2_envl6; - /* ps data 3byte */ - unsigned char slot0_ps; - unsigned char slot1_ps; - unsigned char slot2_ps; - /* bio data 4byte */ - unsigned char bioinn_valh; - unsigned char bioinn_vall; - unsigned char bioext_valh; - unsigned char bioext_vall; - /* temp data 6byte */ - unsigned char tempslot0_valh; /* temp0-inside */ - unsigned char tempslot0_vall; - unsigned char tempslot1_valh; /* temp1-external */ - unsigned char tempslot1_vall; - unsigned char tempref_valh; /* temp_ext_ref */ - unsigned char tempref_vall; -} VC921x_PACKED core921x_reg_result_t; - -/**************************************************************** - * ic config param structure.[SLOT_CONFIG] - ***************************************************************/ -#define CORE921x_CONFIG_SLOT_ADDR_BASE (0x40) -typedef struct -{ - unsigned char oversample : 3; - unsigned char freq_isps : 1; - unsigned char rxgain : 3; - unsigned char enable : 1; -} VC921x_PACKED core921x_slot_ppg_cfg0bit; -typedef struct -{ - unsigned char env_time : 4; - unsigned char sample_time : 2; - unsigned char txch : 2; -} VC921x_PACKED core921x_slot_ppg_cfg1bit; -typedef struct -{ - unsigned char current : 7; - unsigned char storefifo : 1; -} VC921x_PACKED core921x_slot_cfg2bit; -typedef struct -{ - unsigned char sc : 4; - unsigned char resistance : 4; -} VC921x_PACKED core921x_slot_cfg3bit; -/*---[slot regist map]---*/ -typedef struct -{ - union /* 1_byte */ - { - unsigned char byte; - core921x_slot_ppg_cfg0bit bits; - } slot_cfg0; - union /* 2_byte */ - { - unsigned char byte; - core921x_slot_ppg_cfg1bit bits; - } slot_cfg1; - union /* 3_byte */ - { - unsigned char byte; - core921x_slot_cfg2bit bits; - } slot_cfg2; - union /* 4_byte */ - { - unsigned char byte; - core921x_slot_cfg3bit bits; - } slot_cfg3; -} VC921x_PACKED core921x_slot_config_t; - -/**************************************************************** - * ic config param structure.[PD_CONFIG + IRQ_RATE_CONFIG + IRQ_CONFIG] - ***************************************************************/ -#define CORE921x_INT_RATE_IRQ_CONFIG_ADDR_BASE (0x4C) - -typedef struct -{ - unsigned char slot0_pdch : 2; - unsigned char slot1_pdch : 2; - unsigned char slot2_pdch : 2; - unsigned char reserved : 2; -} VC921x_PACKED core921x_pd_cfgbit; - -typedef struct -{ - unsigned char anti_current : 3; - unsigned char reserved1 : 1; - unsigned char deslot0 : 1; - unsigned char deslot1 : 1; - unsigned char deslot2 : 1; - unsigned char reserved2 : 1; -} VC921x_PACKED core921x_anti_cfgbit_1120mpw; - -typedef struct -{ - unsigned char anti_current : 3; - unsigned char deslot0 : 1; - unsigned char deslot1 : 1; - unsigned char deslot2 : 1; - unsigned char antiTxch : 2; -} VC921x_PACKED core921x_anti_cfgbit; - -typedef struct -{ - unsigned char cpd : 3; - unsigned char fifo_en : 1; - unsigned char fifoformat : 1; - unsigned char bio_disfreqHop : 1; /* del function */ - unsigned char i2crelease_en : 1; - unsigned char deenv_en : 1; -} VC921x_PACKED core921x_com_cfgbit; -typedef struct -{ - unsigned char ppgthl : 4; - unsigned char ppgthh : 4; -} VC921x_PACKED core921x_ppgth_cfgbit; - -typedef struct -{ - unsigned char intppg_en : 1; - unsigned char intov_en : 1; - unsigned char intfifo_en : 1; - unsigned char intfreq2_en : 1; - unsigned char intlen : 2; - unsigned char intdir : 1; - unsigned char intmode : 1; -} VC921x_PACKED core921x_int_cfgbit; - -typedef struct -{ - /* 1byte pdch_config */ - union - { - unsigned char byte; - core921x_pd_cfgbit bits; - } pd_cfg; - /* 2_byte:anti_slot */ - union - { - unsigned char byte; - core921x_anti_cfgbit bits; - }; - /* 3_byte:com&pdcfg */ - union - { - unsigned char byte; - core921x_com_cfgbit bits; - } com_cfg; - /* 4~7_byte */ - unsigned char freq1_divH; - unsigned char freq1_divL; /* ppg_freq1_div = 20K / rete1 */ - unsigned char freq2_div; /* ps_freq2_div = ppg_freq / rate2 */ - unsigned char freq3_div; /* fifo_freq3_div = ps_freq / rate3 */ - /* 8_byte */ - union - { - unsigned char byte; - core921x_ppgth_cfgbit bits; - } ppgth_cfg; - /* 9_byte */ - union - { - unsigned char byte; - core921x_int_cfgbit bits; - } int_cfg; -} VC921x_PACKED core921x_common_config_t; - -/**************************************************************** - * ic config param structure.[EXTRA_CONFIG] - ***************************************************************/ -#define CORE921x_EXTRA_CONFIG_ADDR_BASE (0x54) - -typedef struct -{ - /* byte1 */ - unsigned char bio_freq : 2; - unsigned char bio_pdch : 2; - unsigned char bio_mode : 2; /* 00/01 work in freq2,noFIFO/inFIFO, single sample data - 10/11 work in freq1,inFIFO, single sample data / the sum data on freq2 */ - unsigned char bio_inn_en : 1; - unsigned char bio_ext_en : 1; -} VC921x_PACKED core921x_bio_cfg0bit; -typedef struct -{ - unsigned char bio_time : 3; - unsigned char bio_capadd : 5; -} VC921x_PACKED core921x_bio_cfg1bit; - -typedef struct -{ - unsigned char temp_currset : 3; - unsigned char temp_reserved_1 : 1; - unsigned char temp_slotch : 2; - unsigned char temp_reserved_2 : 1; - unsigned char temp_enable : 1; -} VC921x_PACKED core921x_temp_cfgbit; -typedef struct -{ - union /* 1_byte */ - { - unsigned char byte; - core921x_bio_cfg0bit bits; - } bio_cfg0; - union /* 2_byte */ - { - unsigned char byte; - core921x_bio_cfg1bit bits; - } bio_cfg1; - union /* 3_byte */ - { - unsigned char byte; - core921x_temp_cfgbit bits; - } temp0_cfg; - union /* 4_byte */ - { - unsigned char byte; - core921x_temp_cfgbit bits; - } temp1_cfg; -} VC921x_PACKED core921x_extra_config_t; // core921x_extra_config_t - -typedef struct -{ - unsigned char ovtype : 1; - unsigned char cmpset : 2; - unsigned char reserved : 1; - unsigned char ppg_resulution : 2; - unsigned char adc_speed : 1; /* reserved */ - unsigned char env_clkdiv : 1; /* reserved */ -} VC921x_PACKED core921x_adc_config_t; - -typedef struct -{ - unsigned char ovtype : 1; - unsigned char reserved : 3; - unsigned char ppg_resulution : 2; - unsigned char adc_speed : 1; /* reserved */ - unsigned char env_clkdiv : 1; /* reserved */ -} VC921x_PACKED core921x_adc_config_t_1120mpw; - -/**************************************************************** - * work_cmd & fifo_data structure - ***************************************************************/ -#define CORE921x_WORK_CMD_ADDR_BASE (0X7B) -#define CORE921x_WORK_CMD_SIZE (1) -/* fifo addr */ -#define CORE921x_FIFO_READADDR_INDEX (0xFE) -#define CORE921x_FIFO_DATA_ADDR (0xff) - -/**************************************************************** - * inline func: vc921x_core_memset,vc921x_core_memcpy - ***************************************************************/ -#ifndef NULL -#define NULL (void *)0 -#endif -static inline void *vc921x_core_memset(void *dest, int set, unsigned int n) -{ - if (dest == NULL || n <= 0) - { - return NULL; - } - char *pdest = (char *)dest; - while (n-- > 0) - { - *pdest++ = set; - } - return dest; -} -static inline void *vc921x_core_memcpy(void *dest, void *src, unsigned int n) -{ - if (dest == NULL || src == NULL) - { - return NULL; - } - char *pdest = (char *)dest; - char *psrc = (char *)src; - while (n--) - { - *pdest++ = *psrc++; - } - return dest; -} - -#endif /* __VC921x_CORE_H__ */ diff --git a/code/sdk/zhihui/drivers/ppg/vc921x/inc/vc921x_core_com.h b/code/sdk/zhihui/drivers/ppg/vc921x/inc/vc921x_core_com.h deleted file mode 100644 index 47c170662..000000000 --- a/code/sdk/zhihui/drivers/ppg/vc921x/inc/vc921x_core_com.h +++ /dev/null @@ -1,458 +0,0 @@ -/********************************************************************************************** - * @Copyright(c) 2023, Chengdu vcaresensor Microelectronics Corporation. All rights reserved. - * @Author: Tse - * @Date: 2023-09-22 17:39:10 - * @LastEditTime: 2024-04-09 15:26:54 - * @LastEditors: Tse - * @Description: - **********************************************************************************************/ -//!!!!!!注意:本头文件不允许用户自己包含及调用相关的API,仅允许vc921x_driver.c包含,避免出错或者是产生的ROM占用 -//!!!!!!注意:本头文件不允许用户自己包含及调用相关的API,仅允许vc921x_driver.c包含,避免出错或者是产生的ROM占用 -#ifndef __VC921x_CORE_COM_H__ -#define __VC921x_CORE_COM_H__ - -#include "vc921x_sample_result.h" -#include "vc921x_driver_config.h" - -/* 如果需要指定变量到对应的字段在次定义,且重新编译 */ -#define CORE921x_DATA_RAM_SECTION //__attribute__((section(".core921xdata"))) -#define CORE921x_FUNC_RAM_SECTION //__attribute__((section(".core921xfunc"))) -/*============================================================================ - * CORE921x_DEBUG :debug interface - ===========================================================================*/ -// #define CORE921x_DEBUG_VERSION -/* 在编译库的时候,-D CORE921x_DEBUG_VERSION 对代码进行分版本生成库(debug/release) */ -#ifdef CORE921x_DEBUG_VERSION -extern void log_direct(unsigned int info, const char *fmt, ...); -#define CORE921x_DEBUG_LOG(fmt, ...) \ - do \ - { \ - log_direct((33 << 24), "[CORE921x_LOG]line(%d)" fmt, __LINE__, ##__VA_ARGS__); \ - } while (0) -#define CORE921x_DEBUG_ERR(fmt, ...) \ - do \ - { \ - log_direct((33 << 24), "[CORE921x_ERR]line(%d)" fmt, __LINE__, ##__VA_ARGS__); \ - } while (0) -#else -#define CORE921x_DEBUG_LOG(fmt, ...) -#define CORE921x_DEBUG_ERR(fmt, ...) -#endif - -#if 0 // CORE921x_DEBUG_LOG example -extern int (*vc921x_dbglog_user)(const char *, ...); -#define CORE921x_DEBUG_LOG(fmt, ...) \ - do \ - { \ - if (vc921x_dbglog_user) \ - vc921x_dbglog_user("[CORE921x_LOG]%s(%d)" fmt, __func__, __LINE__, ##__VA_ARGS__); \ - } while (0) -#define CORE921x_DEBUG_ERR(fmt, ...) \ - do \ - { \ - if (vc921x_dbglog_user) \ - vc921x_dbglog_user("[CORE921x_ERR]%s(%d)" fmt, __func__, __LINE__, ##__VA_ARGS__); \ - } while (0) -//#else -#define CORE921x_DEBUG_LOG(fmt, ...) -#define CORE921x_DEBUG_ERR(fmt, ...) -#endif - -/*============================================================================ - * IC resources marco - ===========================================================================*/ - /* VC921x IC type ID */ -#define VC921x_DEV_REV_ID 0x24 -#define VC921x_FDY_VER_ID0 0x10 - -#define VC921x_FDY_VER_ID1 0x30 - -#define VC921x_DEFAULT_FREQ (20000) /* 20K */ -/* work event */ -#define VC921x_EVENT_BIO_FLOW (1 << 6) -#define VC921x_EVENT_INSAMPLE (1 << 5) -#define VC921x_EVENT_CONFLICT (1 << 4) -#define VC921x_EVENT_INTPS_RDY (1 << 3) -#define VC921x_EVENT_INTFIFO_RDY (1 << 2) -#define VC921x_EVENT_INTOVLOAD (1 << 1) -#define VC921x_EVENT_INTPPG_STA (1 << 0) -/* work status */ -#define VC921x_STATUS_CH2_OVERLOAD (1 << 2) -#define VC921x_STATUS_CH1_OVERLOAD (1 << 1) -#define VC921x_STATUS_CH0_OVERLOAD (1 << 0) -/* enable event */ -#define VC921x_EN_EVT_FREQ2 (1 << 3) -#define VC921x_EN_EVT_FIFO (1 << 2) -#define VC921x_EN_EVT_OVLD (1 << 1) -#define VC921x_EN_EVT_PPG (1 << 0) - -typedef enum -{ - VC921x_CFG_DISABLE = 0, - VC921x_CFG_ENABLE = 1, -} VC921x_CFG_FUNC; - -typedef enum -{ - VC921x_PPG_SLOT_0 = 0, - VC921x_PPG_SLOT_1 = 1, - VC921x_PPG_SLOT_2 = 2, /* fix=ps */ -} VC921x_PPG_SLOT_I; /* 逻辑工作通道 */ - -typedef enum -{ - VC921x_PPG_TXCH_0 = 0, /* default:green */ - VC921x_PPG_TXCH_1 = 1, /* default: red */ - VC921x_PPG_TXCH_2 = 2, /* fix=ps,or irled */ -} VC921x_PPG_TXCH_I; /* 物理发光通道 */ - -typedef enum -{ - VC921x_FREQ_PPG = 0, /* high */ - VC921x_FREQ_PS = 1, /* low */ -} VC921x_FREQ_SEL; - -typedef enum -{ - VC921x_NO_STORE = 0, - VC921x_IN_STORE = 1, -} VC921x_STORE_FIFO; - -typedef enum -{ - VC921x_IO_PUSH_PULL = 0, - VC921x_IO_OPEN_DRAIN = 1, -} VC921x_IO_MODE; -typedef enum -{ - VC921x_IO_DIR_UP_EDGE = 0, - VC921x_IO_DIR_DOWN_EDGE = 1, -} VC921x_IO_DIR; - -typedef enum -{ - VC921x_IO_PULSE_TIM_100US = 0, - VC921x_IO_PULSE_TIM_200US = 1, - VC921x_IO_PULSE_TIM_400US = 2, - VC921x_IO_PULSE_TIM_800US = 3, -} VC921x_IO_PULSE_TIM; - -typedef enum -{ - VC921x_SAMPLE_TIM_50US = 0, - VC921x_SAMPLE_TIM_100US = 1, - VC921x_SAMPLE_TIM_150US = 2, - VC921x_SAMPLE_TIM_200US = 3, -} VC921x_SAMPLE_TIM; - -typedef enum -{ - VC921x_SLOT_CHSEL_NONE= 0, - VC921x_SLOT_CHSEL_PD01= 1, - VC921x_SLOT_CHSEL_PD10= 2, - VC921x_SLOT_CHSEL_PD11= 3, -}VC921x_SLOT_CHSEL; - -typedef enum -{ - VC921x_BIO_NOFIFO_PS_SGL= 0, - VC921x_BIO_INFIFO_PS_SGL= 1, - VC921x_BIO_INFIFO_PPG_SGL= 2, - VC921x_BIO_INFIFO_PPG_SUM= 3, -}VC921x_BIO_MODE; - -typedef enum -{ - VC921x_BIO_CHSEL_NONE= 0, - VC921x_BIO_CHSEL_ETP0= 1, - VC921x_BIO_CHSEL_ETP1= 2, - VC921x_BIO_CHSEL_PD11= 3, -}VC921x_BIO_CHSEL; - -typedef enum -{ - VC921x_TEMP_SLOT_INN = 0, - VC921x_TEMP_SLOT_EXT0 = 1, - VC921x_TEMP_SLOT_EXT1 = 2, -}VC921x_TEMP_SLOT; - -typedef enum -{ - VC921x_ADC_RESOLUTION_16BIT = 0, - VC921x_ADC_RESOLUTION_18BIT = 1, - VC921x_ADC_RESOLUTION_20BIT = 2, - VC921x_ADC_RESOLUTION_22BIT = 3, -}VC921x_ADC_RESOLUTION; - -typedef enum -{ - VC921x_STOP_WORK_CMD = 0, - VC921x_START_WORK_CMD, - VC921x_RESET_SOFT_CMD, - VC921x_WORK_CMD_NUM, -} VC921x_WORK_CMD; -/*============================================================================ - * VC921x_CORE_API - ===========================================================================*/ -/**************************************************************************** - * @description: 获取内核驱动版本信息 - * @param {char} **ppver - * @return {int} 0(success),-1(read/write/ticks func_pointer error) - ****************************************************************************/ -static inline int core921x_read_software_version(char **ppver) -{ - extern int __core921x_read_software_version(char **ppver); - return __core921x_read_software_version(ppver); -} - -/**************************************************************************** - * @description: 读取ic的ID参数 - * @param {unsigned char} *pid1 版本ID - * @param {unsigned char} *pid2 扩展ID - * @return {int} 0(success),-1(read/write error),1(parameter error),2(ic_id error) - ****************************************************************************/ -static inline int core921x_read_id(unsigned char *pid1, unsigned char *pid2) -{ - extern int __core921x_read_id(unsigned char *pid1, unsigned char *pid2); - return __core921x_read_id(pid1, pid2); -} - -/**************************************************** - * @description: 读取中断事件和过载状态 - * @param {int} *pevt 事件状态 - * @param {unsigned char} *povsta 过载状态 - * @return {int} 0(success),-1(read/write error) - ****************************************************/ -static inline int core921x_read_event_status(unsigned char *pevt, unsigned char *povsta, unsigned char *pwindex_bak, unsigned char *pwindex_rel ) -{ - extern int __core921x_read_event_status(unsigned char *pevt, unsigned char *povsta, unsigned char *pwindex_bak, unsigned char *pwindex_rel); - return __core921x_read_event_status(pevt, povsta, pwindex_bak, pwindex_rel ); -} - -/*************************************************************************** - * @description: 读取时钟tick - * @param {unsigned int} *ptick0 - * @param {unsigned int} *ptick1 - * @return {int} 0(success),-1(read/write error) - ****************************************************************************/ -static inline int core921x_read_rcosc_tick(unsigned short int *ptick0, unsigned short int *ptick1) -{ - extern int __core921x_read_rcosc_tick(unsigned short int *ptick0, unsigned short int *ptick1); - return __core921x_read_rcosc_tick(ptick0, ptick1); -} - -/**************************************************************************** - * @description: 读取基础采样数据 - * @param {result_t} *psample_ret - * @return {int} 0(success),-1(read/write error) - ****************************************************************************/ -static inline int core921x_read_output(vc921x_sample_info_t *psample_ret) -{ - extern int __core921x_read_output(vc921x_sample_info_t * psample_ret); - return __core921x_read_output(psample_ret); -} - -/**************************************************************************** - * @description: 读取fifo_PPG数据 - * @param {result_t} *psample_ret - * @param {unsigned char} *pread_fifoaddr - * @return {int} 0(success),-1(read/write error),1(analysis err) - ****************************************************************************/ -static inline int core921x_read_fifo_data(vc921x_sample_info_t *psample_ret, unsigned char *pread_fifoaddr, unsigned char read_windex) -{ - extern int __core921x_read_fifo_data(vc921x_sample_info_t * psample_ret, unsigned char *pread_fifoaddr, unsigned char read_windex); - return __core921x_read_fifo_data(psample_ret, pread_fifoaddr, read_windex); -} - -/* 通道相关配置 */ -static inline int core921x_set_enable_config(VC921x_PPG_SLOT_I slot_index, VC921x_CFG_FUNC config_enable) -{ - extern int __core921x_set_slot_enable_config(VC921x_PPG_SLOT_I slot_index, VC921x_CFG_FUNC config_enable); - return __core921x_set_slot_enable_config(slot_index, config_enable); -} - -static inline int core921x_set_slot_fix_param_config(VC921x_PPG_SLOT_I slot_index, unsigned char rxgain, VC921x_CFG_FUNC freq_isps, unsigned char oversample, VC921x_PPG_TXCH_I txslot, VC921x_SAMPLE_TIM sample_tim, VC921x_CFG_FUNC slot_infifo ) -{ - extern int __core921x_set_slot_fix_param_config(VC921x_PPG_SLOT_I slot_index, unsigned char rxgain, VC921x_CFG_FUNC freq_isps, unsigned char oversample, VC921x_PPG_TXCH_I txchsel, VC921x_SAMPLE_TIM sample_tim, VC921x_CFG_FUNC slot_infifo ); - return __core921x_set_slot_fix_param_config(slot_index, rxgain, freq_isps, oversample, txslot, sample_tim, slot_infifo ); -} - -static inline int core921x_read_slot_adjust_param(unsigned char *pmax_res, unsigned char *pmin_res, unsigned char *pmax_curr, unsigned char *pmin_curr) -{ - extern int __core921x_read_slot_adjust_param(unsigned char *pmax_res, unsigned char *pmin_res, unsigned char *pmax_curr, unsigned char *pmin_curr); - return __core921x_read_slot_adjust_param(pmax_res, pmin_res, pmax_curr, pmin_curr); -} -static inline int core921x_read_slot_current_res(VC921x_PPG_SLOT_I slot_index, unsigned char *pslot_curr, unsigned char *pslot_reslvl) -{ - extern int __core921x_read_slot_current_res(VC921x_PPG_SLOT_I slot_index, unsigned char *pslot_curr, unsigned char *pslot_reslvl); - return __core921x_read_slot_current_res(slot_index, pslot_curr, pslot_reslvl); -} - -static inline int core921x_set_ppgslot_current(VC921x_PPG_SLOT_I slot_index, unsigned char current) -{ - extern int __core921x_set_ppgslot_current(VC921x_PPG_SLOT_I slot_index, unsigned char current); - return __core921x_set_ppgslot_current(slot_index, current); -} - -static inline int core921x_set_ppgslot_resistance(VC921x_PPG_SLOT_I slot_index, unsigned char res_level, unsigned char allow_oversample ) -{ - extern int __core921x_set_ppgslot_resistance(VC921x_PPG_SLOT_I slot_index, unsigned char res_level, unsigned char allow_oversample ); - return __core921x_set_ppgslot_resistance(slot_index, res_level, allow_oversample ); -} -/*--------------------------------------------------------------*/ -extern int __core921x_set_slotx_pd_config( VC921x_SLOT_CHSEL slot0_pd, VC921x_SLOT_CHSEL slot1_pd, VC921x_SLOT_CHSEL slot2_pd ); -extern int __core921x_set_anti_slot_config( unsigned char anti_current, VC921x_CFG_FUNC deslot0, VC921x_CFG_FUNC deslot1, VC921x_CFG_FUNC deslot2, VC921x_PPG_TXCH_I antich ); -extern int __core921x_set_adc_config( VC921x_ADC_RESOLUTION adc_resulution, VC921x_CFG_FUNC ovdata_sum_enable ); -extern int __core921x_set_common_config(VC921x_CFG_FUNC deenv_en, VC921x_CFG_FUNC i2crelease_en, VC921x_CFG_FUNC bio_disfreqHop, VC921x_CFG_FUNC fifo_format, VC921x_CFG_FUNC fifo_en, unsigned char cpd); -static inline int core921x_set_common_config(unsigned char fifo_enable, unsigned fifo_format, unsigned char adc_resolution, VC921x_SLOT_CHSEL slot0_pd, VC921x_SLOT_CHSEL slot1_pd, VC921x_SLOT_CHSEL slot2_pd ) -{ - VC921x_CFG_FUNC fifo_enable_cfg = (fifo_enable) ? VC921x_CFG_ENABLE : VC921x_CFG_DISABLE; - VC921x_CFG_FUNC fifo_format_cfg = (fifo_format) ? VC921x_CFG_ENABLE : VC921x_CFG_DISABLE; - VC921x_ADC_RESOLUTION adc_resolution_cfg = VC921x_ADC_RESOLUTION_16BIT; - switch ( adc_resolution ) - { - case 16:adc_resolution_cfg=VC921x_ADC_RESOLUTION_16BIT; break; - case 18:adc_resolution_cfg=VC921x_ADC_RESOLUTION_18BIT; break; - case 20:adc_resolution_cfg=VC921x_ADC_RESOLUTION_20BIT; break; - case 22:adc_resolution_cfg=VC921x_ADC_RESOLUTION_22BIT; break; - default:adc_resolution_cfg=VC921x_ADC_RESOLUTION_16BIT; break; - } - __core921x_set_slotx_pd_config( slot0_pd, slot1_pd, slot2_pd ); - __core921x_set_anti_slot_config( 0/*0-7*/, VC921x_CFG_DISABLE,VC921x_CFG_DISABLE,VC921x_CFG_DISABLE, VC921x_PPG_TXCH_2 ); - __core921x_set_adc_config( adc_resolution_cfg, VC921x_CFG_DISABLE /* ov_type */ ); - return __core921x_set_common_config(VC921x_CFG_ENABLE, VC921x_CFG_ENABLE, VC921x_CFG_ENABLE/*dis_biofreq_hop*/, fifo_format_cfg, fifo_enable_cfg, 0); -} -/* 频率设置相关API */ -/**************************************************************************** - * @description: (ppg=20K/div1,ps=ppg/div2,fifo=ps/div3) - * @param {unsigned short int} div1 - * @param {unsigned char} div2 - * @param {unsigned char} div3 - * @return {int} 0(success),-1(read/write error) - ****************************************************************************/ -static inline int core921x_set_sample_frequency(unsigned short int div1, unsigned char div2, unsigned char div3) -{ - extern int __core921x_set_sample_frequency(unsigned short int div1, unsigned char div2, unsigned char div3); - return __core921x_set_sample_frequency(div1 - 1, div2 - 1, div3 - 1); -} - -static inline int core921x_set_threshold_config(unsigned char ppgth_h, unsigned char ppgth_l) -{ - extern int __core921x_set_threshold_config(unsigned char ppgth_h, unsigned char ppgth_l); - return __core921x_set_threshold_config(ppgth_h, ppgth_l); -} -static inline int core921x_set_interrupt_config(unsigned char evt_en) -{ - extern int __core921x_set_interrupt_config(VC921x_IO_MODE int_mode, VC921x_IO_DIR int_dir, VC921x_IO_PULSE_TIM int_len, unsigned char evt_en); - return __core921x_set_interrupt_config(VC921x_IO_PUSH_PULL, VC921x_IO_DIR_UP_EDGE, VC921x_IO_PULSE_TIM_100US, evt_en); -} - -static inline int core921x_set_bioslot_config(vc921x_sample_info_t *psample_info, unsigned char addcap) -{ - unsigned char bio_time = 6; - if( VC921x_BIO_INFIFO_PPG_SGL==psample_info->extra_result.biofifo_mode || VC921x_BIO_INFIFO_PPG_SUM==psample_info->extra_result.biofifo_mode ) - { -#if (VC921x_PS_WORK_FREQUENCY_CONFIG==1) - bio_time = 3; /* (ps=(25/13)hz~520ms,ps_div=13,fifo_div=1) 5200us */ -#elif (VC921x_PS_WORK_FREQUENCY_CONFIG==0) - switch (psample_info->ps_div) /* time = 2^n * 50 * ps_div */ - { - case 5: /* ppg=25,ps=5 */ - bio_time = 5; /* default 8ms:5-4-3-2-1 , 4ms:4-3-2-1-0 */ - break; - case 10: - bio_time = 4; - break; - case 20: - bio_time = 3; - break; - case 40: - bio_time = 2; - break; - case 80: - bio_time = 1; - break; - default: - CORE921x_DEBUG_ERR("fifo time error when underclocking"); - break; - } -#endif - } - extern int __core921x_set_bioslot_config(VC921x_CFG_FUNC bioinn_en, VC921x_CFG_FUNC bioext_en, VC921x_BIO_MODE biofifo_mode, VC921x_BIO_CHSEL bio_chsel, unsigned char biofreq, unsigned char biocap, unsigned char biotime) ; - return __core921x_set_bioslot_config((VC921x_CFG_FUNC)psample_info->extra_result.bioinn_enwork, - (VC921x_CFG_FUNC)psample_info->extra_result.bioext_enwork, - (VC921x_BIO_MODE)psample_info->extra_result.biofifo_mode, - VC921x_CFG_BIO_CHANNL_SELECT, - 2, addcap, bio_time); -} -static inline int core921x_set_bioinn_addcap(vc921x_sample_info_t *psample_info,unsigned char biocap) -{ - extern int __core921x_set_bioinn_addcap(unsigned char biocap); - return __core921x_set_bioinn_addcap(biocap); -} - -static inline int core921x_set_temperature_config(vc921x_sample_info_t *psample_info) -{ - extern int __core921x_set_temperature_config(VC921x_CFG_FUNC tempslot0_en, VC921x_TEMP_SLOT tempslot0_chsel, unsigned char tempslot0_current, - VC921x_CFG_FUNC tempslot1_en, VC921x_TEMP_SLOT tempslot1_chsel, unsigned char tempslot1_current ); - return __core921x_set_temperature_config((VC921x_CFG_FUNC)psample_info->extra_result.tempslot0_enwork, VC921x_TEMP_SLOT_INN, psample_info->extra_result.tempslot0_setcur, - (VC921x_CFG_FUNC)psample_info->extra_result.tempslot1_enwork, VC921x_TEMP_SLOT_EXT1, psample_info->extra_result.tempslot1_setcur ); -} - -/**************************************************************************** - * @description: 设置RCOSC校准值 - * @param {unsigned char} oscfreq - * @return {int} 0(success),-1(read/write error) - ****************************************************************************/ -static inline int core921x_set_rcosc_frequency(unsigned char oscfreq) -{ - extern int __core921x_set_rcosc_frequency(unsigned char oscset); - return __core921x_set_rcosc_frequency(oscfreq); -} - -/**************************************************************************** - * @description: - * @param {VC921x_WORK_CMD} cmd - * @return {int} 0(success),-1(read/write error),1(parameter error) - ****************************************************************************/ -static inline int core921x_write_work_cmd(VC921x_WORK_CMD cmd) -{ - extern int __core921x_write_work_cmd(VC921x_WORK_CMD cmd); - return __core921x_write_work_cmd(cmd); -} - -/*============================================================================ - * IC config ppg/ps slot function - ===========================================================================*/ -static inline int core921x_sample_slotx_config(VC921x_PPG_SLOT_I slot_index ,vc921x_sample_info_t *psample_info, VC921x_PPG_TXCH_I ppg_tx, unsigned char rxgain, unsigned char oversample, VC921x_SAMPLE_TIM sampletime) -{ - /* ppg slot0 config */ - VC921x_CFG_FUNC freq_isps = (1==psample_info->slot_result[slot_index].slot_freq_sel)?VC921x_CFG_ENABLE:VC921x_CFG_DISABLE; - if (psample_info->slot_result[slot_index].slot_enwork) - { - core921x_set_ppgslot_current(slot_index, psample_info->slot_result[slot_index].slot_current); - core921x_set_ppgslot_resistance(slot_index, psample_info->slot_result[slot_index].slot_resistance, 0 ); - core921x_set_slot_fix_param_config(slot_index, rxgain, freq_isps, oversample, ppg_tx, sampletime, psample_info->slot_result[slot_index].slot_storefifo ); - core921x_set_enable_config(slot_index, VC921x_CFG_ENABLE); - } - return 0; -} -/*=====================================================================================================================================*/ -extern int core921x_check_nto_version_init(void); -/**************************************************************** - * CORE_API.write()/set() - * common interface to write/read configuration - * write or set config registers, debug or other function. - ***************************************************************/ - -extern int vc921x_param_write_flash(unsigned char *pdata, unsigned int size); -extern int vc921x_param_read_flash(unsigned char *pdata, unsigned int size); - -extern void *vc921x_malloc(unsigned int size); -extern void vc921x_free(void *ptr); - -extern int vc921x_read_register(unsigned char regaddr, unsigned char *pbuf, unsigned short int size); -extern int vc921x_write_register(unsigned char regaddr, unsigned char *pbuf, unsigned short int size); -extern unsigned int vc921x_get_cputimer_tick(void); - -#endif /* __VC921x_CORE_COM_H__ */ diff --git a/code/sdk/zhihui/drivers/ppg/vc921x/inc/vc921x_driver.h b/code/sdk/zhihui/drivers/ppg/vc921x/inc/vc921x_driver.h deleted file mode 100644 index 36f5bc36e..000000000 --- a/code/sdk/zhihui/drivers/ppg/vc921x/inc/vc921x_driver.h +++ /dev/null @@ -1,127 +0,0 @@ -/********************************************************************************************** - * @Copyright(c) 2023, Chengdu vcaresensor Microelectronics Corporation. All rights reserved. - * @Author: Tse - * @Date: 2023-09-22 17:39:10 - * @LastEditTime: 2023-12-21 15:37:20 - * @LastEditors: Tse - * @Description: - **********************************************************************************************/ - -#ifndef __VC921x_DRIVER_H__ -#define __VC921x_DRIVER_H__ - -#include "vcare_device_com.h" -/**************************************************************************** - * WearStatus_t - ***************************************************************************/ -#define VC921x_BIO_STA_NONE 0 -#define VC921x_BIO_STA_DROP 1 -#define VC921x_BIO_STA_HOLD 2 - -typedef enum -{ - VC921x_WEAR_NO_CHANGE = 0, - VC921x_HOLD_TO_DROP, - VC921x_DROP_TO_HOLD, -} vc921x_wear_change; - -typedef struct -{ - unsigned char hold_cnt; - unsigned char drop_cnt; - wear_status wear_status; - wear_status last_status; - wear_status algo_wear_status; - wear_status acce_wear_status; - int bio_wear_result; - unsigned short int last_ps_data[2]; - -} vc921x_wear_info; - -/**************************************************************************** - * oscclk_t - ***************************************************************************/ -typedef struct -{ - /* calc real frequency */ - unsigned int osc_count[6]; - unsigned int clk_count[6]; - unsigned char count_index; - unsigned char osc_gap_cnt; - unsigned short int rcosc_frequency; - /* check interrupt gaptime */ - unsigned short int last_check_ticks; - /* startup need get calc value */ - unsigned char rcosc_calibration; - unsigned char clk_calc_freq_status; /* calculate frequency finished */ - unsigned char clk_calc_status; /* calculate rcsoc status finished */ - -} vc921x_clk_info; - -/**************************************************************************** - * adjust_t - ***************************************************************************/ -#define VC921x_ADJUST_DIR_NONE 0 -#define VC921x_ADJUST_DIR_UP 1 -#define VC921x_ADJUST_DIR_DOWN 2 - -typedef struct -{ - unsigned char direction; - unsigned char direction_last; - unsigned short int current_step; -} vc921x_adjust_param; - -typedef struct -{ - unsigned char const_max_current; /* ic参数确定的最大电流电阻,固定 */ - unsigned char const_min_current; - unsigned char const_max_res_level; - unsigned char const_min_res_level; - unsigned char max_current; /* ic工作环境的最大电流电阻,可变 */ - unsigned char max_res_level; - unsigned char current; /* ic当前工作的最大电流电阻,可变 */ - unsigned char res_level; - - vc921x_adjust_param adj_param; - -} vc921x_adjust_info; -typedef struct -{ - int work_mode; - unsigned short ppg_div; - unsigned char ps_div; - unsigned char fifo_div; - unsigned char drop_div; - unsigned char hr_algo_mode; - - unsigned char int_event; - unsigned char ov_status; - unsigned char read_fifo_address; - unsigned char write_fifo_address_bak; /* write_addr when fifo event */ - unsigned char write_fifo_address_rel; /* write_addr at present */ - - int optimal_bio_gap; - int optimal_bio_temp; - unsigned char optimal_cap; - unsigned char optimal_bio_valid; - unsigned char ppg_max_thval; - unsigned char ppg_min_thval; - - unsigned char ppg_convert_ps; /* 如果不使用PS频率采集PS,使用PPGir来对佩戴检测进行识别,需要设置为1 */ - - unsigned char param_read_finished_sync; - unsigned char fifo_read_finished_sync; - unsigned char fifo_read_data_valid; /* 0-havn't fifo data, 1-normal fifo data, 2-read fifo data when fifo_windex offset */ - unsigned char event_read_finished_sync; - -} vc921x_drv_info; - -typedef struct -{ - work_mode mode; - int (*mode_init)(void); - int (*mode_handler)(const void *ops_self, vcare_ppg_device_t *pdev); -} vc921x_mode_ops; - -#endif /* __VC9211x_DRIVER_H__ */ diff --git a/code/sdk/zhihui/drivers/ppg/vc921x/inc/vc921x_driver_com.h b/code/sdk/zhihui/drivers/ppg/vc921x/inc/vc921x_driver_com.h deleted file mode 100644 index 55b1142a5..000000000 --- a/code/sdk/zhihui/drivers/ppg/vc921x/inc/vc921x_driver_com.h +++ /dev/null @@ -1,148 +0,0 @@ -/********************************************************************************************** - * @Copyright(c) 2023, Chengdu vcaresensor Microelectronics Corporation. All rights reserved. - * @Author: Tse - * @Date: 2023-09-22 17:39:10 - * @LastEditTime: 2023-09-26 15:22:19 - * @LastEditors: Tse - * @Description: - **********************************************************************************************/ - -#ifndef __VC921x_DRIVER_COM_H__ -#define __VC921x_DRIVER_COM_H__ - -#include "vcare_device_com.h" -/********************************************************************************************************* - * DRV_API - ********************************************************************************************************/ -/* 注意: -VC921x - fifo长度最长只有192字节,在多通道时,一次fifo的缓存不能超过192字节 - -typical: -ppg_div=800, ps_div=5, fifo_div=5 (ppg-25hz, psbio-5hz, fifo-1hz) 1000ms (921x_max=20*4+4*6=104) -ppg_div=800, ps_div=5, fifo_div=4 (ppg-25hz, psbio-5hz, fifo-1.25hz) 800ms (921x_max=20*4+4*6=104) -ppg_div=400, ps_div=10, fifo_div=2 (ppg-50hz, psbio-5hz, fifo-2.5hz) 400ms (921x_max=20*4+2*6=92) -ppg_div=200, ps_div=20, fifo_div=1 (ppg-100hz,psbio-5hz, fifo-5hz) 200ms (921x_max=20*4+1*6=88) -*/ -/**************************************************************************** - * @description: 初始化并且开始进行采样 - * @param {void} *pdevice - * @param {int} workmode - * @param {unsigned short int} ppgdiv - * @param {unsigned char} psdiv - * @param {unsigned char} fifodiv - * @return {*} - ****************************************************************************/ -int vc921x_drv_init_start_work(void *pdevice, int workmode, unsigned short int ppgdiv, unsigned char psdiv, unsigned char fifodiv, unsigned char dropdiv); -/**************************************************************************** - * @description: 获取驱动版本,IC的主ID,次ID - * @param {char} * - * @param {unsigned char} *pid1 - * @param {unsigned char} *pid2 - * @return {*} - ****************************************************************************/ -int vc921x_drv_get_hwsw_infomation(char **str_drv_ver, unsigned char *pid1, unsigned char *pid2); -/**************************************************************************** - * @description: 软复位IC并且退出工作(如需重新工作需要重新调用初始化) - * @param {void} *device - * @return {*} - ****************************************************************************/ -int vc921x_drv_exit_stop_work(void *device); -/**************************************************************************** - * @description: 软复位IC(如需重新工作需要重新调用初始化) - * @param {void} *device - * @return {*} - ****************************************************************************/ -int vc921x_drv_software_reset(void *device); -/**************************************************************************** - * @description: 唤醒工作(可以唤醒调用sleep停止工作) - * @param {void} *device - * @return {*} - ****************************************************************************/ -int vc921x_drv_wakeup_work(void *device); -/**************************************************************************** - * @description: 休眠工作(休眠后可以用wakeup唤醒工作) - * @param {void} *device - * @return {*} - ****************************************************************************/ -int vc921x_drv_sleep_work(void *device); -/**************************************************************************** - * @description: 心率算法扩展的摘下状态设置 - * @param {void} *device - * @param {int} status - * @return {*} - ****************************************************************************/ -int vc921x_drv_set_algo_wear_status(void *device, int status); -/**************************************************************************** - * @description: 运动量判断佩戴的状态设置 - * @param {void} *device - * @param {int} status - * @return {*} - ****************************************************************************/ -int vc921x_drv_set_acce_wear_status(void *device, int status); -/**************************************************************************** - * @description: 获取参数并且进行佩戴状态判断 - * @param {void} *device - * @return {*} - ****************************************************************************/ -wear_status vc921x_drv_get_wear_status(void *device); -/**************************************************************************** - * @description: 获取具体的佩戴状态各子状态 - * @param {unsigned char} *bio_ret - * @param {unsigned char} *algo_ret - * @param {unsigned char} *acce_ret - * @return {*} - ****************************************************************************/ -void vc921x_drv_get_wear_detail_result( unsigned char *bio_ret, unsigned char *algo_ret, unsigned char *acce_ret ); -/**************************************************************************** - * @description: 获取采样数据,包含PPG,PS,BIO,TMEP - * @param {void} *device - * @return {*} - ****************************************************************************/ -int vc921x_drv_get_result_handler(void *device); -/**************************************************************************** - * @description: 是否为fifo中断事件 - * @param {void} *pdevice - * @return {*} - ****************************************************************************/ -int vc921x_drv_is_fifo_event(void *pdevice); -/**************************************************************************** - * @description: 是否为PS中断事件 - * @param {void} *pdevice - * @return {*} - ****************************************************************************/ -int vc921x_drv_is_ps_event(void *pdevice); -/**************************************************************************** - * @description: 是否为PPG中断事件 - * @param {void} *pdevice - * @return {*} - ****************************************************************************/ -int vc921x_drv_is_ppg_event(void *pdevice); -/**************************************************************************** - * @description: 配平校准活体 - * @param {void} *pdevice - * @return {*} - ****************************************************************************/ -int vc921x_drv_clear_reset_bio_param(void *pdevice); -/**************************************************************************** - * @description: 同步驱动状态,清理状态数据 - * @param {void} *pdevice - * @return {*} - ****************************************************************************/ -int vc921x_drv_finished_sync(void *pdevice); -/**************************************************************************** - * @description: 提前读取中断信息,避免任务延时响应导致信息被刷掉 - * @param {*} - * @return {*} - ****************************************************************************/ -void vc921x_drv_read_event_infomation_byIRQ(void); -/**************************************************************************** - * @description: 软件定时器读取RO信息,用于定时温度检测 - * @param {*} - * @return {*} - ****************************************************************************/ -int vc921x_drv_read_check_temperature_abnormal( void *pdevice, unsigned char *p_freq_ret, unsigned char *p_temp_ret, unsigned short *pdev_cnt1, unsigned short *pdev_cnt2 ); - -int vc921x_drv_memroy_alloc(void); -int vc921x_drv_memroy_free(void); - -#endif /* __DRV_DEV_MANAGER_H__ */ diff --git a/code/sdk/zhihui/drivers/ppg/vc921x/inc/vc921x_driver_config.h b/code/sdk/zhihui/drivers/ppg/vc921x/inc/vc921x_driver_config.h deleted file mode 100644 index 15acae30e..000000000 --- a/code/sdk/zhihui/drivers/ppg/vc921x/inc/vc921x_driver_config.h +++ /dev/null @@ -1,115 +0,0 @@ -/********************************************************************************************** - * @Copyright(c) 2023, Chengdu vcaresensor Microelectronics Corporation. All rights reserved. - * @Author: Tse - * @Date: 2023-09-22 17:39:10 - * @LastEditTime: 2024-03-21 11:16:25 - * @LastEditors: Tse - * @Description: - **********************************************************************************************/ -#ifndef __VC921x_DRIVER_CONFIG_H__ -#define __VC921x_DRIVER_CONFIG_H__ - -/* wear default status select */ -#define VC921x_WEAR_DFT_NONE (0) -#define VC921x_WEAR_DFT_DROP (1) -#define VC921x_WEAR_DFT_HOLD (2) -/* function enable select */ -#define VC921x_FUNC_DISABLE (0) -#define VC921x_FUNC_ENABLE (1) - -#define VC921x_FREQUENCY_MAX 20000 -#define VC921x_FREQUENCY_MIN 19900 -//#define VC921x_CFG_MCU_TICK_FREQUENCY 32000 // counter 32K -extern unsigned short int VC921x_CFG_MCU_TICK_FREQUENCY; /* extern unsigned short int VC921x_CFG_MCU_TICK_FREQUENCY; */ -#define VC921x_CFG_MCU_TICK_MAX 0xffffff // 24-bit counters -#define VC921x_CFG_CLK_CALC_DEVIATION 3 -#define VC921x_CFG_CLK_CALC_GAPTIME 10 // interrupt gap times( 25hz_fifo_irq:20*40~0.4sec; 5hz_fifo_irq: 20*200 ~ 2sec; 1.25hz_fifo_irq: 10*800 ~ 8sec ) - -#define VC921x_CFG_CLK_CLAC_IRQGAP_EN (VC921x_FUNC_DISABLE) -/* interrupt run check timegap,dont write "(3/4)" !!! */ -/* 25hz(40ms~30ms), 50hz(20ms~15ms), 100hz(10ms~7ms) */ -#define VC921x_IRQ_GAP_RATIO 3/4 - -#define VC921x_CFG_IRQ_BY_TIMER_EN (VC921x_FUNC_DISABLE) -/* notice:ps_freq = ppg_freq/drop_div, and VC921x_PS_WORK_FREQUENCY_CONFIG(0). */ -#define VC921x_CFG_DROP_REDUCE_FREQ (VC921x_FUNC_ENABLE) - -#define VC921x_CFG_DEFAULT_PPGGAIN_EN (1) /* 1-最小使用2倍增益, 0-最小使用单倍增益 */ - -/**************************************************************************** - * Configuration hardware:PD/BIO channl; sport heartrate param; - ***************************************************************************/ -/* (VC921x_SLOT_CHSEL_PD11):setting ppgchx pd0+pd1, (VC921x_SLOT_CHSEL_PD01),setting pd0, (VC921x_SLOT_CHSEL_PD10),setting pd1 vc921x_core_com.h@VC921x_SLOT_CHSEL*/ -#define VC921x_CFG_PPG_CHANNL_SELECT (VC921x_SLOT_CHSEL_PD11) -/* (VC921x_BIO_CHSEL_PD11),setting biochx pd0+pd1, (VC921x_BIO_CHSEL_ETP1),setting extern touch vc921x_core_com.h@VC921x_BIO_CHSEL*/ -#define VC921x_CFG_BIO_CHANNL_SELECT (VC921x_BIO_CHSEL_PD11) -#define VC921x_CFG_SPORT_HR_OVERSAMPLE (3) /* oversample = 2^N */ -#define VC921x_CFG_SPORT_HR_SAMPLETIME (VC921x_SAMPLE_TIM_200US) - -/**************************************************************************** - * Configuration wear parameters - ***************************************************************************/ -#define VC921x_CFG_WEAR_DETECTION (VC921x_FUNC_ENABLE) -#define VC921x_CFG_WEAR_DEFAULT_STA (VC921x_WEAR_DFT_HOLD) -#define VC921x_CFG_WEAR_BIO_EN (VC921x_FUNC_ENABLE) -#define VC921x_CFG_WEAR_ALG_EN (VC921x_FUNC_DISABLE) -#define VC921x_CFG_WEAR_ACC_EN (VC921x_FUNC_DISABLE) -#define VC921x_CFG_WEAR_HOLD_CNT (1) -#define VC921x_CFG_WEAR_DROP_CNT (3) -/* sensor serial default wear param */ -#define VC921x_CFG_WEAR_BIO_OLD_EN (VC921x_FUNC_DISABLE) /* 使用算法相对的方式计算活体的佩戴状态 */ -#define VC921x_WEAR_PARAM_ENVMIN 100 /* 80nA/D */ -#define VC921x_WEAR_PARAM_ENVMAX 400 -#define VC921x_WEAR_PARAM_PSTH 0xA000 /* 16bit:0xA400~40960 , 8bit:0xA0~160 */ -#define VC921x_WEAR_PARAM_PS_DELTA 0x3000 /* 16bit:0x3000~12288 , 8bit:0x30~48 */ -#define VC921x_WEAR_PARAM_BIO_DELTA 100 /* bio0/1,建议取测试变化量的45%作为参数设置 */ - -//#define VC921x_WEAR_PARAM_BIO_ABS_HOLD 200 /* 80% */ -//#define VC921x_WEAR_PARAM_BIO_ABS_DROP 160 /* 50% */ -extern unsigned short int VC921x_WEAR_PARAM_BIO_ABS_HOLD; /* extern unsigned short int VC921x_WEAR_PARAM_BIO_ABS_HOLD; */ -extern unsigned short int VC921x_WEAR_PARAM_BIO_ABS_DROP; /* extern unsigned short int VC921x_WEAR_PARAM_BIO_ABS_DROP; */ - -/* 约定最后的一个slot一定作为红外采样 */ -#define VC921x_WEAR_PARAM_PS_CURRENT 0x25 /*range:0-0x7F */ -#define VC921x_WEAR_PARAM_PS_RESISTANCE 6 /*range:0-13 */ -#define VC921x_WEAR_PARAM_PS_GAIN 1 /* 2^n */ - -#if VC921x_CFG_DEFAULT_PPGGAIN_EN -#define VC921x_PPG_CURT 0x40 -#define VC921x_PPG_RESISTANCE 9 /* 9-1 ~ 4.48M */ -#define VC921x_PPG_GAIN 1 -/* Set the maximum current parameter in FAT1/FAT2 work_mode */ -#define VC921x_FAT_GREEN_MAX_CURT 0x60 /* 0-0x7F */ -#define VC921x_FAT_RED_MAX_CURT 0x60 /* 0-0x7F */ -#define VC921x_FAT_IR_MAX_CURT 0x60 /* 0-0x7F */ -#define VC921x_FAT_RESISTANCE 9 /* 9~4.48M, 11~8.96M */ -#define VC921x_FAT_GAIN 1 -#else -#define VC921x_PPG_CURT 0x40 -#define VC921x_PPG_RESISTANCE 11 /* 9-1 ~ 4.48M */ -#define VC921x_PPG_GAIN 0 -/* Set the maximum current parameter in FAT1/FAT2 work_mode */ -#define VC921x_FAT_GREEN_MAX_CURT 0x60 /* 0-0x7F */ -#define VC921x_FAT_RED_MAX_CURT 0x60 /* 0-0x7F */ -#define VC921x_FAT_IR_MAX_CURT 0x60 /* 0-0x7F */ -#define VC921x_FAT_RESISTANCE 11 /* 9~4.48M, 11~8.96M */ -#define VC921x_FAT_GAIN 0 -#endif - -/**************************************************************************** - * PPG AUTO ADJUST PARAMETERS - ***************************************************************************/ -#define VC921x_PPG_MIN_DEFT_THVAL (0x6) -#define VC921x_PPG_MAX_DEFT_THVAL (0xA) /*0xA~0xB*/ -#define VC921x_PPG_SPO2_MIN_DEFT_THVAL (0x09) -#define VC921x_PPG_SPO2_MAX_DEFT_THVAL (0x0A) /* 0x0A~0x0B */ -#define VC921x_ADJ_I_INCREASE 22 // 1.4 << 4 = 22.4//1.4f -#define VC921x_ADJ_I_DECREASE 11 // 0.7 << 4 = 11.2//0.7f -#define VC921x_ADJ_I_STEP_MAX 8 -#define VC921x_ADJ_I_STEP_MIN 1 -#define VC921x_ADJ_I_STEP_DFT 4 // default step - -/* fix 16bit ppg */ -#define VC921x_PPG_CONV_BIT4(data) ((data)>>4) - -#endif /* __VC921x_DRIVER_CONFIG_H__ */ diff --git a/code/sdk/zhihui/drivers/ppg/vc921x/inc/vc921x_hal.h b/code/sdk/zhihui/drivers/ppg/vc921x/inc/vc921x_hal.h deleted file mode 100644 index 5e4a11664..000000000 --- a/code/sdk/zhihui/drivers/ppg/vc921x/inc/vc921x_hal.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * @Author: penglei 1624952103@qq.com - * @Date: 2024-06-07 11:18:26 - * @LastEditors: SnickerSun snickersun@163.com - * @LastEditTime: 2024-12-27 16:08:24 - * @FilePath: /FD230/code/sdk/drivers/peripheral/ppg/hx3695/hx3695_hal.h - * @Description: - * - * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. - */ -#ifndef VC_921X_H__ -#define VC_921X_H__ -#ifdef __cplusplus -#if __cplusplus -extern "C" { -#endif /* __cplusplus */ -#endif /* __cplusplus */ - -#include "stdint.h" - -typedef uint32_t PPG_CMD_TYPE_T ; - -#ifdef PPG_HX3695 - -#include "tyhx_hrs_custom.h" - - - -typedef enum{ - HX3695_MSG_TYPE_HRS_UPDATE, - HX3695_MSG_TYPE_HRV_UPDATE, - HX3695_MSG_TYPE_SPO2_UPDATE, - HX3695_MSG_TYPE_LEAKLIGHT_UPDATE, - HX3695_MSG_TYPE_GRAYCARD_UPDATE, - HX3695_MSG_TYPE_WEARSTAT_UPDATE, - HX3695_MSG_TYPE_STATIC_HRS_UPDATE, -} hx3695_msg_type_t; - - -typedef void (*hx3695_msg_callback_t)(uint8_t msg_type, uint8_t *msg_data, int32_t msg_datalen); -uint32_t hx3695_register_msg_callback(hx3695_msg_callback_t func); -hx3695_msg_callback_t hx3695_get_send_msg_callback_func(void); - -#endif - -void ppg_send_cmd_to_vc921x_driver(char* mode, uint8_t enable); - -#ifdef __cplusplus -#if __cplusplus -} -#endif /* __cplusplus */ -#endif /* __cplusplus */ - -#endif \ No newline at end of file diff --git a/code/sdk/zhihui/drivers/ppg/vc921x/inc/vc921x_sample_result.h b/code/sdk/zhihui/drivers/ppg/vc921x/inc/vc921x_sample_result.h deleted file mode 100644 index 9b164f4dc..000000000 --- a/code/sdk/zhihui/drivers/ppg/vc921x/inc/vc921x_sample_result.h +++ /dev/null @@ -1,158 +0,0 @@ -/********************************************************************************************** - * @Copyright(c) 2023, Chengdu vcaresensor Microelectronics Corporation. All rights reserved. - * @Author: Tse - * @Date: 2023-09-22 17:39:10 - * @LastEditTime: 2024-03-21 10:49:02 - * @LastEditors: Tse - * @Description: - **********************************************************************************************/ -#ifndef __VC921x_SAMPLE_RESULT_H__ -#define __VC921x_SAMPLE_RESULT_H__ - -/**************************************************************************** -drviver vc921x RAM: -core+driver: 400bytes + fifo_data_memory <= 1kb -fifo_data_memory static: 128*2 + 64*(2*2+2*1) = 448 bytes -fifo_data_memory dynamic: 128*x + 64*(2*y+2*z) = 0~448 bytes -fifo_data_memory fixdync: -*/ -#define VC921x_USE_STATIC_MEMORY (0) -#define VC921x_USE_FIXDYNC_MEMORY (1) /* memory is allocated when the device is registered and freed when the device is deregistered */ -#define VC921x_USE_MEMORY_SELECT (VC921x_USE_STATIC_MEMORY) -#define VC921x_PPGSLOT_BUFFER_NUM (64) /* memory_buffer(40~64) = enable_ppgslot_num * ( VC921x_PPGSLOT_BUFFER_NUM * sizeof(unsigned short int) ) */ -#define VC921x_PS2SLOT_BUFFER_NUM (32) /* memory_buffer(20~32) = enable_bioslot_num * ( VC921x_PS2SLOT_BUFFER_NUM * sizeof(unsigned short int) ) + 1*( VC921x_PS2SLOT_BUFFER_NUM * sizeof(unsigned short int) ) */ - -/* ps sample frequency config, if work_fast,the frequency=12.5hz, otherwise is 5hz -[0] ps= 5hz~200ms, fifo_time=1000ms, 800ms, 600ms, 400ms, 200ms -[1] ps=(1000/520)hz~520ms, fifo_time=520ms(25hz), 260ms(50hz), 130ms(100hz), user defined time, ps-fifo working on the same frequency (~9201,VC30F). - !!!notice: need config bio_param_time @ vc30fx_core_com.h @ core30fx_set_bioslot_config -[2]........ -*/ -#define VC921x_PS_WORK_FREQUENCY_CONFIG (0) - -/* ppg/ps slot parameter description: -slot_config: structure handle. -enwork: slot configuration enable work, 0-disbale, 1-work_ppg, 2-work_ps. -freqsel: frequency selection, 0-ppg_frequency, 1-ps_frequency. vc921x_core_com.h:enum@VC921x_FREQ_SEL. -storefifo: fifo configuration, 0-nofifo,1-infifo, available when slot_freq_sel is ps_frequency. @VC921x_STORE_FIFO. -current: ppg_slot work current set(0x00~0x7f). -resistance: ppg_slot work resistance set(0~13). -*/ -#define VC921x_SLOT_PARAM_CONFIG(slot_config, enwork, freqsel, storefifo, current, resistance) \ - { \ - slot_config.slot_enwork = enwork; \ - slot_config.slot_freq_sel = freqsel; \ - slot_config.slot_storefifo = storefifo; \ - slot_config.slot_current = current; \ - slot_config.slot_resistance = resistance; \ - } -#define VC921x_PPG_SLOT_PARAM_CONFIG(slot_config, current, resistance) VC921x_SLOT_PARAM_CONFIG(slot_config, 1, VC921x_FREQ_PPG, VC921x_IN_STORE, current, resistance) -/*------PS slot default use slot2------*/ -#define VC921x_PS_SLOT_PARAM_CONFIG(slot_config, storefifo, current, resistance) VC921x_SLOT_PARAM_CONFIG(slot_config, 2, VC921x_FREQ_PS, storefifo, current, resistance) -/* bio slot parameter description: -bio_config: structure handle. -inn_enable: inside slot configuration enable work, @VC921x_CFG_FUNC. -ext_enable: external slot configuration enable work, @VC921x_CFG_FUNC. -fifo_mode: fifo and ppgmode configuration, @VC921x_BIO_MODE. -*/ -#define VC921x_BIO_SLOT_PARAM_CONFIG(bio_config, inn_enable, ext_enable, fifo_mode ) \ - { \ - bio_config.bioinn_enwork = inn_enable; \ - bio_config.bioext_enwork = ext_enable; \ - bio_config.biofifo_mode = fifo_mode; \ - } -/* tmp slot parameter description: -tmp_config: structure handle. -inn_enable: inside slot configuration enable work, @VC921x_CFG_FUNC. -ext_enable: external slot configuration enable work, @VC921x_CFG_FUNC. -setcur: external slot config work current(0~7). -*/ -#define VC921x_TMP_SLOT_PARAM_CONFIG(tmp_config, slot0_enable, slot1_enable, setcur) \ - { \ - tmp_config.tempslot0_enwork = slot0_enable; \ - tmp_config.tempslot1_enwork = slot1_enable; \ - tmp_config.tempslot0_setcur = setcur; \ - tmp_config.tempslot1_setcur = setcur; \ - } - -/**************************************************************** - * structures:vc921x_sample_info_t - ***************************************************************/ -typedef struct -{ - /* slot_config */ - unsigned char slot_enwork; /* slot_enwork, 0-disbale, 1-work_ppg, 2-work_ps. */ - unsigned char slot_freq_sel; /* 0-ppg_frequency, 1-ps_frequency. vc921x_core_com.h, @VC921x_FREQ_SEL. */ - unsigned char slot_storefifo; /* 0-nofifo,1-infifo, available when slot_freq_sel is ps_frequency. */ - unsigned char slot_led_sel; /* 0-green led, 1-red led, 2-infrared led */ - /* slot_variable_config */ - unsigned char slot_current; /* 0~0x7F */ - unsigned char slot_resistance; /* 0~13/0~23 */ - /* slot_result */ - unsigned short int env_data; - union - { - unsigned short int ps_data; - unsigned short int pre_data; - } u; - unsigned char ppg_num; - unsigned char ppg_buffer[VC921x_PPGSLOT_BUFFER_NUM*3]; /* 按字节存储,可以节省最大RAM */ -} vc921x_sample_slot_t; - -typedef struct -{ - /* bio_slot config */ - unsigned char bioinn_enwork; - unsigned char bioext_enwork; - unsigned char biofifo_mode; /* @VC921x_BIO_MODE */ - /* temp_slot config */ - unsigned char tempslot0_enwork; - unsigned char tempslot0_setcur; - unsigned char tempslot1_enwork; - unsigned char tempslot1_setcur; - /* extern result */ - unsigned char bio_fifo_num; - unsigned short int bioinn_data; - unsigned short int bioext_data; - unsigned short int bioabs_calc; /* abs(base-ext_now)?thh */ - unsigned short int temp0_data; - unsigned short int temp1_data; - unsigned short int tempref_data; - unsigned short int bioinn_buffer[VC921x_PS2SLOT_BUFFER_NUM]; - unsigned short int bioext_buffer[VC921x_PS2SLOT_BUFFER_NUM]; -} vc921x_sample_extra_t; - -typedef struct -{ - unsigned char ic_type_id; - unsigned char ic_ficv_id; - unsigned short int ppg_div; /* ppg_frequency = 20K / ppg_div */ - unsigned char ps_div; /* ps_frequency = ppg_frequency / ps_div */ - unsigned char fifo_div; /* fifo_frequency = ps_frequency / fifo_div */ - unsigned char hold_div; /* ps/fifo_frequency = ppg_frequency / hold_div */ - unsigned char drop_div; /* ps/fifo_frequency = ppg_frequency / drop_div */ - unsigned char fifo_enable; /* fifo_enable = 1*/ - unsigned char fifo_format; /* fifo_format,0:16bit, 1:24bit */ - unsigned char adc_resolution; /* */ - unsigned char wear_drop_flag; /* send original data flag as drop event happens */ - vc921x_sample_extra_t extra_result; - vc921x_sample_slot_t slot_result[3]; -} vc921x_sample_info_t; - -static inline unsigned int VC921x_GET_SLOT_SAMPLE_DATA( vc921x_sample_info_t* psample_info, unsigned char slot_index, unsigned char ppg_index ) -{ - if( psample_info->fifo_format == 0 ) - { - return (psample_info->slot_result[slot_index].ppg_buffer[ppg_index*2]<<8) + (psample_info->slot_result[slot_index].ppg_buffer[ppg_index*2+1] ); - } - else - { - return (psample_info->slot_result[slot_index].ppg_buffer[ppg_index*3]<<16) + (psample_info->slot_result[slot_index].ppg_buffer[ppg_index*3+1]<<8) + (psample_info->slot_result[slot_index].ppg_buffer[ppg_index*3+2] ); - } -} -static inline unsigned int VC921x_GET_SLOT_PS_DATA( vc921x_sample_info_t* psample_info, unsigned char ppg_index ) -{ - return (psample_info->slot_result[2].ppg_buffer[ppg_index*2]<<8) + (psample_info->slot_result[2].ppg_buffer[ppg_index*2+1] ); -} - -#endif /* __VC921x_SAMPLE_RESULT_H__ */ diff --git a/code/sdk/zhihui/drivers/ppg/vc921x/inc/vc921x_user_app.h b/code/sdk/zhihui/drivers/ppg/vc921x/inc/vc921x_user_app.h deleted file mode 100644 index e4c85209b..000000000 --- a/code/sdk/zhihui/drivers/ppg/vc921x/inc/vc921x_user_app.h +++ /dev/null @@ -1,47 +0,0 @@ -/********************************************************************************************** - * @Copyright(c) 2023, Chengdu vcaresensor Microelectronics Corporation. All rights reserved. - * @Author: Tse - * @Date: 2023-09-22 17:39:10 - * @LastEditTime: 2023-10-17 09:50:21 - * @LastEditors: Tse - * @Description: - **********************************************************************************************/ -#ifndef __VC921x_USER_APP_H__ -#define __VC921x_USER_APP_H__ - -#include "vcare_device_com.h" - -/* vc921x设备函数接口 */ -void vc921x_usr_device_init( InitParamTypeDef *pinitconfig ); -void vc921x_usr_get_dev_info(unsigned char *pchip_id, unsigned char *pvers_id, char **drv_name, char **dev_name); -void vc921x_usr_start_work(void); -void vc921x_usr_stop_work(void); -void vc921x_usr_soft_reset(void); -void vc921x_usr_reset_bio_param(void); -int vc921x_usr_get_wear_status(void); -void vc921x_usr_get_event_status_byIRQ(void); -void vc921x_usr_device_handler( unsigned char heart_algo_mode, unsigned char spo2_algo_mode ); -void vc921x_usr_check_temperature_abnormal(void); - - -void tyhx_poweron(void); -void tyhx_poweroff(void); - - -/* 获取vc921x设备/如果动态内存则会申请驱动内存,以下为获取的设备API,设备对象中会记录一部分计算参数和结果,用户需要直接使用即可,具体参考头文件"vcare_device_com.h": -{ - .dev_init = vc921x_usr_device_init, - .get_dev_info = vc921x_usr_get_dev_info, - .start_work = vc921x_usr_start_work, - .stop_work = vc921x_usr_stop_work, - .soft_reset = vc921x_usr_soft_reset, - .get_events = NULL, - .set_slot_enable = NULL, - .reset_bio_param = vc921x_usr_reset_bio_param, - .get_wear_status = vc921x_usr_get_wear_status, - .dev_irq_handler = vc921x_usr_device_handler, -}; -*/ -vcare_ppg_device_t *get_vc921x_device(void); - -#endif // ! diff --git a/code/sdk/zhihui/drivers/ppg/vc921x/inc/vcSportMotionIntAlgo.h b/code/sdk/zhihui/drivers/ppg/vc921x/inc/vcSportMotionIntAlgo.h deleted file mode 100644 index 9b4e7f307..000000000 --- a/code/sdk/zhihui/drivers/ppg/vc921x/inc/vcSportMotionIntAlgo.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef VC_SPORT_MOTION_ALGO_H -#define VC_SPORT_MOTION_ALGO_H - -#include -#include -#include - - -void vcSportMotionAlgoInit(void); -int32_t vcSportMotionCalculate(int32_t x, int32_t y, int32_t z); -char *sportMotionVersion(void); -#endif diff --git a/code/sdk/zhihui/drivers/ppg/vc921x/inc/vcare_device_com.h b/code/sdk/zhihui/drivers/ppg/vc921x/inc/vcare_device_com.h deleted file mode 100644 index a73436433..000000000 --- a/code/sdk/zhihui/drivers/ppg/vc921x/inc/vcare_device_com.h +++ /dev/null @@ -1,200 +0,0 @@ -/********************************************************************************************** - * @Copyright(c) 2023, Chengdu vcaresensor Microelectronics Corporation. All rights reserved. - * @Author: Tse - * @Date: 2023-02-23 17:47:18 - * @LastEditTime: 2023-11-14 17:38:46 - * @LastEditors: Tse - * @Description: - **********************************************************************************************/ - -#ifndef __VCARE_DEVICE_COM_H__ -#define __VCARE_DEVICE_COM_H__ - -/* parameter type sleep and retain */ -#ifndef PARAM_RETAIN -#define PARAM_RETAIN -#endif -/* define NULL 0 */ -#ifndef NULL -#define NULL ((void *)0) -#endif - -/* gsensor struct,user peripheral data */ -typedef struct -{ - short int xData[40]; - short int yData[40]; - short int zData[40]; -} gsensor_axes; - -typedef enum -{ - WEAR_STA_NONE = 0, - WEAR_STA_DROP, - WEAR_STA_HOLD, -} wear_status; - -typedef enum -{ - WORK_MODE_HR = 0, - WORK_MODE_SPO2, - WORK_MODE_HRV, - WORK_MODE_STRESS, - WORK_MODE_BLOODPRESSURE, - WORK_MODE_WEAR, - WORK_MODE_TEMPERATURE, - WORK_MODE_FACTORY0, - WORK_MODE_FACTORY1, - WORK_MODE_HRSPO2, - - WORK_MODE_UNDEFINED, - WORK_MODE_NUMBER, -} work_mode; - -typedef struct -{ - unsigned short sampling_gap_time; /* reserved. */ - unsigned char work_mode; /* work_mode,WorkModeTypeDef/unsigned char */ - unsigned char hr_algo_mode; -}InitParamTypeDef; - - -typedef void (*FUNC_DEV_INIT)( InitParamTypeDef *pInitconfig ); -typedef void (*FUNC_GET_DEV_INFO)(unsigned char *pchip_id, unsigned char *pvers_id, char **drv_name, char **dev_name); -typedef void (*FUNC_START_WORK)(void); -typedef void (*FUNC_STOP_WORK)(void); -typedef void (*FUNC_SOFT_RESET)(void); -typedef int (*FUNC_GET_EVENTS)(void); -typedef int (*FUNC_GET_WEAR_STATUS)(void); -typedef void (*FUNC_SET_SLOT_ENABLE)(unsigned char slot_index, unsigned char slot_enable); -typedef void (*FUNC_BIO_RESET_PARAM)(void); -typedef void (*FUNC_DEV_IRQ_HANDLER)(unsigned char heart_algo_mode, unsigned char spo2_algo_mode); -typedef void (*FUNC_DEV_CHK_TEMP_ERR)(void); - -typedef struct -{ - FUNC_DEV_INIT dev_init; - FUNC_GET_DEV_INFO get_dev_info; /* reserved */ - FUNC_START_WORK start_work; - FUNC_STOP_WORK stop_work; - FUNC_SOFT_RESET soft_reset; - FUNC_GET_EVENTS get_events; /* reserved */ - FUNC_GET_WEAR_STATUS get_wear_status; - FUNC_SET_SLOT_ENABLE set_slot_enable; /* reserved */ - FUNC_BIO_RESET_PARAM reset_bio_param; - FUNC_DEV_IRQ_HANDLER dev_irq_handler; - FUNC_DEV_CHK_TEMP_ERR dev_check_temp_error; -} dev_ops; - -typedef struct -{ - char *dev_name; - unsigned char id1; - unsigned char id2; - unsigned char dev_work_status; /* 0-don't work, 1-working */ - - unsigned char heart_algo_mode; - unsigned char spo2_algo_mode; - work_mode workmode; - wear_status wear; - /* raw result */ - void *result; - /* device ops */ - const dev_ops *ops; - /* calc result */ - int heart_rate; - int spo2; - int hrv; - int stress; - int ecg; - int temperature0; - int temperature1; - int blood_pressure; -} vcare_ppg_device_t; - -/**-------------------- defined functions --------------------**/ -#define ENABLE_MY_MEMFUNC 1 -#if ENABLE_MY_MEMFUNC -static inline void *vcare_memset(void *dest, int set, unsigned int n) -{ - if (dest == NULL || n <= 0) - { - return NULL; - } - char *pdest = (char *)dest; - while (n-- > 0) - { - *pdest++ = set; - } - return dest; -} - -static inline void *vcare_memcpy(void *dest, void *src, unsigned int n) -{ - if (dest == NULL || src == NULL) - { - return NULL; - } - char *pdest = (char *)dest; - char *psrc = (char *)src; - while (n--) - { - *pdest++ = *psrc++; - } - return dest; -} - -/* 2^(n/16) */ -static const float exponent_tab[]={1.000000,1.044274,1.090508,1.138789,1.189207,1.241858,1.296840,1.354256,1.414214, - 1.476826,1.542211,1.610490,1.681793,1.756252,1.834008,1.915207,2.000000}; -static inline float vcare_I_exponent_func( float base_i, unsigned char data_i ) -{ - unsigned char data_h = (data_i>>4)&0xf; - unsigned char data_l = (data_i>>0)&0xf; - return (base_i*(1<ijWmIW5`YO)~KSFJ*e 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