Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: BLE_API mbed nRF51822
Fork of Inp_Fiber_Logo_FOTA by
main.cpp@7:4118d5a717bc, 2017-06-19 (annotated)
- Committer:
- ayaando
- Date:
- Mon Jun 19 00:47:31 2017 +0000
- Revision:
- 7:4118d5a717bc
- Parent:
- 6:35f536162183
- Child:
- 8:1ad3ab5148bc
?DeviceInformation?SerialNumber?IND+Mac???????; ?DEVICE NAME?INUPATHY???
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| ayaando | 7:4118d5a717bc | 1 | // 20170619 DeviceInformationのSerialNumberにIND+Macアドレスを適用し、DEVICENAMEはINUPATHYとした |
| jojisdogakane | 6:35f536162183 | 2 | // 20170617 ストレス値を"R"(relax)から"S"(stress)に変更し、(1.0 - relaxRatio)を送るよう改変 |
| jojisdogakane | 6:35f536162183 | 3 | // 20170617 輝度調整の方法をrgbの合計値を基準にするように調整した。 |
| jojisdogakane | 6:35f536162183 | 4 | |
| jojisdogakane | 0:2f6112d75752 | 5 | #include "mbed.h" |
| jojisdogakane | 0:2f6112d75752 | 6 | #include "neopixel.h" |
| jojisdogakane | 0:2f6112d75752 | 7 | #include "nrf_soc.h" |
| jojisdogakane | 0:2f6112d75752 | 8 | #include "common.h" |
| jojisdogakane | 0:2f6112d75752 | 9 | #include "ble/BLE.h" |
| jojisdogakane | 0:2f6112d75752 | 10 | #include "ble/services/HeartRateService.h" |
| jojisdogakane | 0:2f6112d75752 | 11 | #include "ble/services/BatteryService.h" |
| jojisdogakane | 0:2f6112d75752 | 12 | #include "ble/services/DeviceInformationService.h" |
| jojisdogakane | 0:2f6112d75752 | 13 | #include "UARTService.h" |
| ayaando | 1:f28bdfaf3005 | 14 | #include "ble_gap.h" |
| ayaando | 2:221df6d014f5 | 15 | #include "ble/services/DFUService.h" // ★OTA用 |
| ayaando | 2:221df6d014f5 | 16 | |
| jojisdogakane | 0:2f6112d75752 | 17 | #define RAINBOW_RATIO 1 |
| jojisdogakane | 0:2f6112d75752 | 18 | #define RCFILTER 0.9 |
| jojisdogakane | 0:2f6112d75752 | 19 | #define RCFILTER2 0.9 |
| jojisdogakane | 4:a0150e0f285b | 20 | #define NEOPIXEL_COUNT 6 |
| jojisdogakane | 0:2f6112d75752 | 21 | #define MIN_LIGHT 0 |
| jojisdogakane | 0:2f6112d75752 | 22 | #define PNNX_FACTOR 0.1 // 0.06 |
| jojisdogakane | 4:a0150e0f285b | 23 | #define MAXARRAY 15 //15 // 心拍平均値計算用の配列サイズ //20 |
| jojisdogakane | 4:a0150e0f285b | 24 | #define MAXHRVARRAY 10 //30 // 脈間ゆらぎ平均値計算用の配列サイズ |
| jojisdogakane | 0:2f6112d75752 | 25 | #define MIN_INTERVAL 200 |
| jojisdogakane | 0:2f6112d75752 | 26 | #define INTERVAL 10 // Loopの間隔 通常時推奨1 通信時推奨20 |
| jojisdogakane | 0:2f6112d75752 | 27 | #define MAXCOLORARRAY 1 //(MIN_INTERVAL / INTERVAL) // 色平均値計算用の配列サイズ (MIN_INTERVAL / 7) |
| jojisdogakane | 0:2f6112d75752 | 28 | #define MAXCONARRAY 10 |
| jojisdogakane | 0:2f6112d75752 | 29 | #define MAXSTRESSARRAY 3 |
| jojisdogakane | 6:35f536162183 | 30 | |
| jojisdogakane | 6:35f536162183 | 31 | #define BRIGHTNESS_MAX 150 // RGBLED1セットのpwm合計値の上限 ws2812b型のneopixelが6個の場合、150を超えた値にするとセンサーが誤作動する |
| jojisdogakane | 6:35f536162183 | 32 | |
| jojisdogakane | 6:35f536162183 | 33 | #define DIM_LED ((float)(BRIGHTNESS_MAX) / (float)(255)) // R, G, Bそれぞれのpwm値がBRIGHTNESS_MAXを超えない様にする制限 |
| jojisdogakane | 6:35f536162183 | 34 | |
| jojisdogakane | 0:2f6112d75752 | 35 | |
| jojisdogakane | 0:2f6112d75752 | 36 | // 心拍数の最低値、最高値 |
| jojisdogakane | 0:2f6112d75752 | 37 | // 人間の場合は60~150、標準80 |
| jojisdogakane | 0:2f6112d75752 | 38 | // 犬の場合は40~200、標準60 |
| jojisdogakane | 0:2f6112d75752 | 39 | #define HR_MIN 40 |
| jojisdogakane | 0:2f6112d75752 | 40 | #define HR_MAX 150 |
| jojisdogakane | 0:2f6112d75752 | 41 | |
| jojisdogakane | 0:2f6112d75752 | 42 | #define RELAX_RATIO_MIN 0.6 |
| jojisdogakane | 0:2f6112d75752 | 43 | |
| jojisdogakane | 0:2f6112d75752 | 44 | // ラジアンを度に変換する. |
| jojisdogakane | 0:2f6112d75752 | 45 | #define RadianToDegree(radian) ((180 / 3.14159) * (radian)) |
| jojisdogakane | 0:2f6112d75752 | 46 | |
| jojisdogakane | 0:2f6112d75752 | 47 | // 度をラジアンに変換する. |
| jojisdogakane | 0:2f6112d75752 | 48 | #define DegreeToRadian(degree) ((3.14159 / 180) * (degree)) |
| jojisdogakane | 0:2f6112d75752 | 49 | |
| jojisdogakane | 0:2f6112d75752 | 50 | // 色の識別値設定(ピンではない) |
| jojisdogakane | 0:2f6112d75752 | 51 | #define RED 0 |
| jojisdogakane | 0:2f6112d75752 | 52 | #define BLUE 1 |
| jojisdogakane | 0:2f6112d75752 | 53 | #define GREEN 2 |
| jojisdogakane | 0:2f6112d75752 | 54 | |
| jojisdogakane | 0:2f6112d75752 | 55 | #define SHOW_EXCITE 1 |
| jojisdogakane | 0:2f6112d75752 | 56 | #define SHOW_HAPPY 2 |
| jojisdogakane | 0:2f6112d75752 | 57 | #define SHOW_CONCENTRATION 4 |
| jojisdogakane | 0:2f6112d75752 | 58 | |
| jojisdogakane | 0:2f6112d75752 | 59 | |
| jojisdogakane | 0:2f6112d75752 | 60 | BLE ble; |
| ayaando | 2:221df6d014f5 | 61 | DFUService *dfuService; // ★OTA用 |
| jojisdogakane | 0:2f6112d75752 | 62 | |
| jojisdogakane | 0:2f6112d75752 | 63 | AnalogIn HRSigIn(P0_4); |
| jojisdogakane | 0:2f6112d75752 | 64 | |
| jojisdogakane | 0:2f6112d75752 | 65 | |
| ayaando | 7:4118d5a717bc | 66 | const static char DEVICE_NAME[] = "INUPATHY"; |
| jojisdogakane | 0:2f6112d75752 | 67 | static const uint16_t uuid16_list[] = {GattService::UUID_HEART_RATE_SERVICE, |
| jojisdogakane | 0:2f6112d75752 | 68 | GattService::UUID_DEVICE_INFORMATION_SERVICE}; |
| jojisdogakane | 0:2f6112d75752 | 69 | static volatile bool triggerSensorPolling = true; |
| jojisdogakane | 0:2f6112d75752 | 70 | |
| jojisdogakane | 4:a0150e0f285b | 71 | short ColorArrayR[NEOPIXEL_COUNT]; |
| jojisdogakane | 4:a0150e0f285b | 72 | short ColorArrayG[NEOPIXEL_COUNT]; |
| jojisdogakane | 4:a0150e0f285b | 73 | short ColorArrayB[NEOPIXEL_COUNT]; |
| jojisdogakane | 0:2f6112d75752 | 74 | |
| jojisdogakane | 4:a0150e0f285b | 75 | short TargetColorArrayR[NEOPIXEL_COUNT]; |
| jojisdogakane | 4:a0150e0f285b | 76 | short TargetColorArrayG[NEOPIXEL_COUNT]; |
| jojisdogakane | 4:a0150e0f285b | 77 | short TargetColorArrayB[NEOPIXEL_COUNT]; |
| jojisdogakane | 0:2f6112d75752 | 78 | |
| jojisdogakane | 0:2f6112d75752 | 79 | |
| jojisdogakane | 4:a0150e0f285b | 80 | #define NEOPIXEL_COMMANDLEN ((NEOPIXEL_COUNT * 3) + 1 + 1) |
| jojisdogakane | 0:2f6112d75752 | 81 | |
| jojisdogakane | 0:2f6112d75752 | 82 | |
| jojisdogakane | 0:2f6112d75752 | 83 | unsigned long pixelStartCounter; |
| jojisdogakane | 0:2f6112d75752 | 84 | |
| jojisdogakane | 0:2f6112d75752 | 85 | int mainCurrentPixel = 0; |
| jojisdogakane | 0:2f6112d75752 | 86 | int mainPrevPixel = 0; |
| jojisdogakane | 0:2f6112d75752 | 87 | int mainPixelLightCount; |
| jojisdogakane | 0:2f6112d75752 | 88 | int mainPixelStep = 0; |
| jojisdogakane | 0:2f6112d75752 | 89 | int mainStepsRemain = 0; |
| jojisdogakane | 0:2f6112d75752 | 90 | |
| jojisdogakane | 0:2f6112d75752 | 91 | unsigned long currentmillis = 0; |
| jojisdogakane | 0:2f6112d75752 | 92 | unsigned long prevmillis = 0; |
| jojisdogakane | 0:2f6112d75752 | 93 | unsigned long intervalmillis = 0; |
| jojisdogakane | 0:2f6112d75752 | 94 | unsigned long prevIntervalmillis = 0; |
| jojisdogakane | 0:2f6112d75752 | 95 | unsigned long intervalmillisArray[MAXARRAY] = {1000}; |
| jojisdogakane | 4:a0150e0f285b | 96 | unsigned long intervalmillisHRVArray[MAXHRVARRAY] = {1000}; |
| jojisdogakane | 0:2f6112d75752 | 97 | float conArray[MAXCONARRAY] = {0.5}; |
| jojisdogakane | 0:2f6112d75752 | 98 | |
| jojisdogakane | 0:2f6112d75752 | 99 | //float stressArray[MAXSTRESSARRAY] = {0.5}; |
| jojisdogakane | 0:2f6112d75752 | 100 | |
| jojisdogakane | 0:2f6112d75752 | 101 | float prevFilteredAngle = 0.5; |
| jojisdogakane | 0:2f6112d75752 | 102 | float happyRatio = 0.0; |
| jojisdogakane | 4:a0150e0f285b | 103 | float happyRatioNow = 0.0; |
| jojisdogakane | 0:2f6112d75752 | 104 | float prevRelaxRatio = 1.0; |
| jojisdogakane | 0:2f6112d75752 | 105 | float prevFilteredDistRatio = 0.0; |
| jojisdogakane | 4:a0150e0f285b | 106 | |
| jojisdogakane | 4:a0150e0f285b | 107 | #define HR_THRESHOLD 2 |
| jojisdogakane | 6:35f536162183 | 108 | int HRThreshold[] = {100, 1000}; |
| jojisdogakane | 4:a0150e0f285b | 109 | |
| jojisdogakane | 0:2f6112d75752 | 110 | |
| jojisdogakane | 4:a0150e0f285b | 111 | // 気分判定フラグ |
| jojisdogakane | 4:a0150e0f285b | 112 | #define IS_RELAX 0 |
| jojisdogakane | 4:a0150e0f285b | 113 | #define IS_EXCITED 1 |
| jojisdogakane | 4:a0150e0f285b | 114 | #define IS_HAPPY 2 |
| jojisdogakane | 4:a0150e0f285b | 115 | #define IS_INTERESTED 3 |
| jojisdogakane | 4:a0150e0f285b | 116 | #define IS_STRESSED 4 // IS_STRESSEDはMOODの個数としても扱うので最後の番号にすること |
| jojisdogakane | 4:a0150e0f285b | 117 | #define MOOD_COUNT IS_STRESSED + 1 |
| jojisdogakane | 0:2f6112d75752 | 118 | |
| jojisdogakane | 4:a0150e0f285b | 119 | // 気分判定係数 |
| jojisdogakane | 4:a0150e0f285b | 120 | #define CONMARGIN 0.85 |
| jojisdogakane | 4:a0150e0f285b | 121 | #define RELAXMARGIN 0.2 |
| jojisdogakane | 4:a0150e0f285b | 122 | #define HAPPYMARGIN 0.225 |
| jojisdogakane | 0:2f6112d75752 | 123 | |
| jojisdogakane | 4:a0150e0f285b | 124 | // 気分判定フラグを索引にする |
| jojisdogakane | 4:a0150e0f285b | 125 | int MoodColorR[NEOPIXEL_COUNT][MOOD_COUNT]; |
| jojisdogakane | 4:a0150e0f285b | 126 | int MoodColorG[NEOPIXEL_COUNT][MOOD_COUNT]; |
| jojisdogakane | 4:a0150e0f285b | 127 | int MoodColorB[NEOPIXEL_COUNT][MOOD_COUNT]; |
| jojisdogakane | 4:a0150e0f285b | 128 | |
| jojisdogakane | 0:2f6112d75752 | 129 | |
| jojisdogakane | 4:a0150e0f285b | 130 | unsigned char RainbowR[] = { 50, 50, 50, 127, 200, 255}; |
| jojisdogakane | 4:a0150e0f285b | 131 | unsigned char RainbowG[] = { 50, 127, 255, 127, 100, 50}; |
| jojisdogakane | 4:a0150e0f285b | 132 | unsigned char RainbowB[] = {255, 127, 50, 50, 50, 50}; |
| jojisdogakane | 4:a0150e0f285b | 133 | |
| jojisdogakane | 6:35f536162183 | 134 | unsigned char HappyR[] = { 50, 50, 50, 127, 200, 255}; |
| jojisdogakane | 6:35f536162183 | 135 | unsigned char HappyG[] = { 50, 127, 255, 127, 100, 50}; |
| jojisdogakane | 6:35f536162183 | 136 | unsigned char HappyB[] = {255, 127, 50, 50, 50, 50}; |
| jojisdogakane | 6:35f536162183 | 137 | |
| jojisdogakane | 6:35f536162183 | 138 | unsigned char RelaxR[] = { 0, 0, 0, 0, 0, 0}; |
| jojisdogakane | 4:a0150e0f285b | 139 | unsigned char RelaxG[] = {255, 255, 255, 255, 255, 255}; |
| jojisdogakane | 6:35f536162183 | 140 | unsigned char RelaxB[] = { 0, 0, 0, 0, 0, 0}; |
| jojisdogakane | 0:2f6112d75752 | 141 | |
| jojisdogakane | 4:a0150e0f285b | 142 | unsigned char ExciteR[] = {255, 255, 255, 255, 255, 255}; |
| jojisdogakane | 4:a0150e0f285b | 143 | unsigned char ExciteG[] = {100, 100, 100, 100, 100, 100}; |
| jojisdogakane | 6:35f536162183 | 144 | unsigned char ExciteB[] = { 0, 0, 0, 0, 0, 0}; |
| jojisdogakane | 6:35f536162183 | 145 | |
| jojisdogakane | 6:35f536162183 | 146 | unsigned char StressR[] = {100, 100, 100, 100, 100, 100}; |
| jojisdogakane | 4:a0150e0f285b | 147 | unsigned char StressG[] = { 0, 0, 0, 0, 0, 0}; |
| jojisdogakane | 6:35f536162183 | 148 | unsigned char StressB[] = {255, 255, 255, 255, 255, 255}; |
| jojisdogakane | 4:a0150e0f285b | 149 | |
| jojisdogakane | 4:a0150e0f285b | 150 | unsigned char InterestR[] = {255, 255, 255, 255, 255, 255}; |
| jojisdogakane | 4:a0150e0f285b | 151 | unsigned char InterestG[] = {255, 255, 255, 255, 255, 255}; |
| jojisdogakane | 6:35f536162183 | 152 | unsigned char InterestB[] = {255, 255, 255, 255, 255, 255}; |
| jojisdogakane | 0:2f6112d75752 | 153 | |
| jojisdogakane | 0:2f6112d75752 | 154 | float rainbowOffset = 0.0; |
| jojisdogakane | 0:2f6112d75752 | 155 | |
| jojisdogakane | 0:2f6112d75752 | 156 | bool bConcentration; |
| jojisdogakane | 0:2f6112d75752 | 157 | unsigned long loopCounter = 0; |
| jojisdogakane | 0:2f6112d75752 | 158 | int lightPos = 1; |
| jojisdogakane | 0:2f6112d75752 | 159 | int prevLightPos = 1; |
| jojisdogakane | 0:2f6112d75752 | 160 | |
| jojisdogakane | 0:2f6112d75752 | 161 | double relaxRatio = 0.0; |
| jojisdogakane | 0:2f6112d75752 | 162 | float conRatio = 0.5; |
| jojisdogakane | 0:2f6112d75752 | 163 | float conRatioNow = 0.5; |
| jojisdogakane | 0:2f6112d75752 | 164 | double HR_ratio = 0.0; |
| jojisdogakane | 0:2f6112d75752 | 165 | |
| jojisdogakane | 0:2f6112d75752 | 166 | unsigned long IBI; |
| jojisdogakane | 0:2f6112d75752 | 167 | |
| jojisdogakane | 0:2f6112d75752 | 168 | int x3, y3; |
| jojisdogakane | 0:2f6112d75752 | 169 | |
| jojisdogakane | 0:2f6112d75752 | 170 | int mainPixelCounter; |
| jojisdogakane | 0:2f6112d75752 | 171 | |
| jojisdogakane | 0:2f6112d75752 | 172 | int prevInterval; |
| jojisdogakane | 0:2f6112d75752 | 173 | int prevprevInterval; |
| jojisdogakane | 0:2f6112d75752 | 174 | |
| jojisdogakane | 0:2f6112d75752 | 175 | void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason) |
| jojisdogakane | 0:2f6112d75752 | 176 | { |
| jojisdogakane | 0:2f6112d75752 | 177 | ble.gap().startAdvertising(); // restart advertising |
| jojisdogakane | 0:2f6112d75752 | 178 | } |
| jojisdogakane | 0:2f6112d75752 | 179 | /* |
| jojisdogakane | 0:2f6112d75752 | 180 | void ConnectTimeoutCallback(Gap::EventCallback_t timeoutCallback) |
| jojisdogakane | 0:2f6112d75752 | 181 | { |
| jojisdogakane | 0:2f6112d75752 | 182 | ble.gap().startAdvertising(); // restart advertising |
| jojisdogakane | 0:2f6112d75752 | 183 | } |
| jojisdogakane | 0:2f6112d75752 | 184 | */ |
| jojisdogakane | 0:2f6112d75752 | 185 | |
| jojisdogakane | 0:2f6112d75752 | 186 | uint8_t BPM = 0; |
| jojisdogakane | 0:2f6112d75752 | 187 | float sensorValue = 0; |
| jojisdogakane | 0:2f6112d75752 | 188 | Timer t; |
| jojisdogakane | 0:2f6112d75752 | 189 | Timer tRand; |
| jojisdogakane | 0:2f6112d75752 | 190 | |
| jojisdogakane | 0:2f6112d75752 | 191 | float redVal = 0; |
| jojisdogakane | 0:2f6112d75752 | 192 | float blueVal = 255; |
| jojisdogakane | 0:2f6112d75752 | 193 | float greenVal = 0; |
| jojisdogakane | 0:2f6112d75752 | 194 | |
| jojisdogakane | 0:2f6112d75752 | 195 | Ticker neopixelTick; |
| jojisdogakane | 0:2f6112d75752 | 196 | |
| jojisdogakane | 0:2f6112d75752 | 197 | UARTService *uartServicePtr; |
| jojisdogakane | 0:2f6112d75752 | 198 | |
| jojisdogakane | 0:2f6112d75752 | 199 | void neopixelTick_Handler() { |
| jojisdogakane | 0:2f6112d75752 | 200 | return; |
| jojisdogakane | 0:2f6112d75752 | 201 | } |
| jojisdogakane | 0:2f6112d75752 | 202 | |
| jojisdogakane | 4:a0150e0f285b | 203 | void SetMoodColor() { |
| jojisdogakane | 4:a0150e0f285b | 204 | int i = 0; |
| jojisdogakane | 4:a0150e0f285b | 205 | |
| jojisdogakane | 4:a0150e0f285b | 206 | for(i = 0; i < NEOPIXEL_COUNT; i++) { |
| jojisdogakane | 4:a0150e0f285b | 207 | MoodColorR[i][IS_RELAX] = RelaxR[i]; |
| jojisdogakane | 4:a0150e0f285b | 208 | MoodColorG[i][IS_RELAX] = RelaxG[i]; |
| jojisdogakane | 4:a0150e0f285b | 209 | MoodColorB[i][IS_RELAX] = RelaxB[i]; |
| jojisdogakane | 4:a0150e0f285b | 210 | } |
| jojisdogakane | 4:a0150e0f285b | 211 | for(i = 0; i < NEOPIXEL_COUNT; i++) { |
| jojisdogakane | 4:a0150e0f285b | 212 | MoodColorR[i][IS_EXCITED] = ExciteR[i]; |
| jojisdogakane | 4:a0150e0f285b | 213 | MoodColorG[i][IS_EXCITED] = ExciteG[i]; |
| jojisdogakane | 4:a0150e0f285b | 214 | MoodColorB[i][IS_EXCITED] = ExciteB[i]; |
| jojisdogakane | 4:a0150e0f285b | 215 | } |
| jojisdogakane | 4:a0150e0f285b | 216 | |
| jojisdogakane | 4:a0150e0f285b | 217 | for(i = 0; i < NEOPIXEL_COUNT; i++) { |
| jojisdogakane | 4:a0150e0f285b | 218 | MoodColorR[i][IS_HAPPY] = HappyR[i]; |
| jojisdogakane | 4:a0150e0f285b | 219 | MoodColorG[i][IS_HAPPY] = HappyG[i]; |
| jojisdogakane | 4:a0150e0f285b | 220 | MoodColorB[i][IS_HAPPY] = HappyB[i]; |
| jojisdogakane | 4:a0150e0f285b | 221 | } |
| jojisdogakane | 4:a0150e0f285b | 222 | for(i = 0; i < NEOPIXEL_COUNT; i++) { |
| jojisdogakane | 4:a0150e0f285b | 223 | MoodColorR[i][IS_INTERESTED] = InterestR[i]; |
| jojisdogakane | 4:a0150e0f285b | 224 | MoodColorG[i][IS_INTERESTED] = InterestG[i]; |
| jojisdogakane | 4:a0150e0f285b | 225 | MoodColorB[i][IS_INTERESTED] = InterestB[i]; |
| jojisdogakane | 4:a0150e0f285b | 226 | } |
| jojisdogakane | 4:a0150e0f285b | 227 | for(i = 0; i < NEOPIXEL_COUNT; i++) { |
| jojisdogakane | 4:a0150e0f285b | 228 | MoodColorR[i][IS_STRESSED] = StressR[i]; |
| jojisdogakane | 4:a0150e0f285b | 229 | MoodColorG[i][IS_STRESSED] = StressG[i]; |
| jojisdogakane | 4:a0150e0f285b | 230 | MoodColorB[i][IS_STRESSED] = StressB[i]; |
| jojisdogakane | 4:a0150e0f285b | 231 | } |
| jojisdogakane | 0:2f6112d75752 | 232 | } |
| jojisdogakane | 0:2f6112d75752 | 233 | |
| jojisdogakane | 4:a0150e0f285b | 234 | // 現在の気分の判定 |
| jojisdogakane | 4:a0150e0f285b | 235 | int getMood(int bpm, double relaxRatio, double happyRatio, double conRatio) { |
| jojisdogakane | 4:a0150e0f285b | 236 | // 第一優先:集中 |
| jojisdogakane | 4:a0150e0f285b | 237 | // 集中係数が0.95以上なら集中と判定 |
| jojisdogakane | 4:a0150e0f285b | 238 | if(conRatio >= CONMARGIN) |
| jojisdogakane | 4:a0150e0f285b | 239 | { |
| jojisdogakane | 4:a0150e0f285b | 240 | return IS_INTERESTED; |
| jojisdogakane | 4:a0150e0f285b | 241 | } |
| jojisdogakane | 0:2f6112d75752 | 242 | |
| jojisdogakane | 4:a0150e0f285b | 243 | // 第二優先:Stress |
| jojisdogakane | 4:a0150e0f285b | 244 | // リラックス係数が0.2以下 |
| jojisdogakane | 4:a0150e0f285b | 245 | if(relaxRatio <= RELAXMARGIN) { |
| jojisdogakane | 4:a0150e0f285b | 246 | return IS_STRESSED; |
| jojisdogakane | 4:a0150e0f285b | 247 | } |
| jojisdogakane | 0:2f6112d75752 | 248 | |
| jojisdogakane | 4:a0150e0f285b | 249 | // 第三優先:Happy |
| jojisdogakane | 4:a0150e0f285b | 250 | // Happy係数が0.2以上 |
| jojisdogakane | 4:a0150e0f285b | 251 | if(happyRatio >= HAPPYMARGIN && relaxRatio > 0.5) { |
| jojisdogakane | 4:a0150e0f285b | 252 | return IS_HAPPY; |
| jojisdogakane | 4:a0150e0f285b | 253 | } |
| jojisdogakane | 0:2f6112d75752 | 254 | |
| jojisdogakane | 4:a0150e0f285b | 255 | // それ以外は興奮度合い |
| jojisdogakane | 4:a0150e0f285b | 256 | // 心拍数の閾値判定 |
| jojisdogakane | 4:a0150e0f285b | 257 | int i = 0; |
| jojisdogakane | 4:a0150e0f285b | 258 | for(i = 0; i < HR_THRESHOLD; i++) { |
| jojisdogakane | 4:a0150e0f285b | 259 | if (BPM <= HRThreshold[i]) { |
| jojisdogakane | 0:2f6112d75752 | 260 | break; |
| jojisdogakane | 0:2f6112d75752 | 261 | } |
| jojisdogakane | 0:2f6112d75752 | 262 | } |
| jojisdogakane | 4:a0150e0f285b | 263 | switch(i) { |
| jojisdogakane | 4:a0150e0f285b | 264 | // 第1領域:NORMAL |
| jojisdogakane | 4:a0150e0f285b | 265 | case 0: |
| jojisdogakane | 4:a0150e0f285b | 266 | return IS_RELAX; |
| jojisdogakane | 4:a0150e0f285b | 267 | // 第2領域:EXCITED1 |
| jojisdogakane | 4:a0150e0f285b | 268 | case 1: |
| jojisdogakane | 4:a0150e0f285b | 269 | return IS_EXCITED; |
| jojisdogakane | 0:2f6112d75752 | 270 | } |
| jojisdogakane | 0:2f6112d75752 | 271 | |
| jojisdogakane | 4:a0150e0f285b | 272 | return IS_RELAX; |
| jojisdogakane | 4:a0150e0f285b | 273 | } |
| jojisdogakane | 0:2f6112d75752 | 274 | |
| jojisdogakane | 4:a0150e0f285b | 275 | //Serial mySerial(USBTX, USBRX); |
| jojisdogakane | 4:a0150e0f285b | 276 | //Serial mySerial(P0_9, P0_11); |
| jojisdogakane | 0:2f6112d75752 | 277 | |
| ayaando | 7:4118d5a717bc | 278 | // MACアドレスを取得してBLEのSerialNumberに組み込む |
| ayaando | 7:4118d5a717bc | 279 | void setBleSerialNumber(char *serialNumber) |
| ayaando | 1:f28bdfaf3005 | 280 | { |
| ayaando | 1:f28bdfaf3005 | 281 | int i; |
| ayaando | 1:f28bdfaf3005 | 282 | |
| ayaando | 1:f28bdfaf3005 | 283 | ble_gap_addr_t mac_address; |
| ayaando | 1:f28bdfaf3005 | 284 | |
| ayaando | 1:f28bdfaf3005 | 285 | if(sd_ble_gap_address_get(&mac_address) != NRF_SUCCESS){ |
| ayaando | 1:f28bdfaf3005 | 286 | return; |
| ayaando | 1:f28bdfaf3005 | 287 | } |
| ayaando | 1:f28bdfaf3005 | 288 | |
| ayaando | 1:f28bdfaf3005 | 289 | // ADDR_LENは6 |
| ayaando | 1:f28bdfaf3005 | 290 | for(i=BLE_GAP_ADDR_LEN-1; i>=0; i--){ |
| ayaando | 7:4118d5a717bc | 291 | sprintf(serialNumber, "%s%02x", serialNumber, (mac_address.addr)[i]); |
| ayaando | 1:f28bdfaf3005 | 292 | } |
| ayaando | 7:4118d5a717bc | 293 | sprintf(serialNumber, "%s%s", serialNumber, "\0"); |
| ayaando | 1:f28bdfaf3005 | 294 | |
| ayaando | 7:4118d5a717bc | 295 | } |
| jojisdogakane | 0:2f6112d75752 | 296 | |
| jojisdogakane | 0:2f6112d75752 | 297 | int main(void) |
| jojisdogakane | 0:2f6112d75752 | 298 | { |
| jojisdogakane | 0:2f6112d75752 | 299 | char msgIBI[100]; |
| jojisdogakane | 0:2f6112d75752 | 300 | int nMsgIBILen = 0; |
| jojisdogakane | 0:2f6112d75752 | 301 | char msgHappy[10]; |
| jojisdogakane | 0:2f6112d75752 | 302 | int nMsgHappyLen = 0; |
| jojisdogakane | 0:2f6112d75752 | 303 | char msgConcentration[10]; |
| jojisdogakane | 0:2f6112d75752 | 304 | int nMsgConcentrationLen = 0; |
| jojisdogakane | 0:2f6112d75752 | 305 | char msgRelax[10]; |
| jojisdogakane | 0:2f6112d75752 | 306 | int nMsgRelaxLen = 0; |
| jojisdogakane | 0:2f6112d75752 | 307 | |
| jojisdogakane | 0:2f6112d75752 | 308 | char msg[256]; |
| jojisdogakane | 0:2f6112d75752 | 309 | int nMsgLen = 0; |
| jojisdogakane | 0:2f6112d75752 | 310 | |
| jojisdogakane | 0:2f6112d75752 | 311 | float Brightness = 1.0; |
| jojisdogakane | 0:2f6112d75752 | 312 | bool brighten = true; |
| jojisdogakane | 0:2f6112d75752 | 313 | float brightenSpeedMs = 1000.0; |
| jojisdogakane | 0:2f6112d75752 | 314 | float colorSpeedMs = 1000.0; |
| jojisdogakane | 0:2f6112d75752 | 315 | float conRatioShow = 0.5; |
| jojisdogakane | 0:2f6112d75752 | 316 | |
| jojisdogakane | 0:2f6112d75752 | 317 | int i; |
| jojisdogakane | 0:2f6112d75752 | 318 | unsigned long lightPrevMillis = 0; |
| jojisdogakane | 0:2f6112d75752 | 319 | |
| jojisdogakane | 0:2f6112d75752 | 320 | int currentBPM; |
| jojisdogakane | 0:2f6112d75752 | 321 | |
| jojisdogakane | 0:2f6112d75752 | 322 | float fBeatIndex = 0.0; |
| jojisdogakane | 0:2f6112d75752 | 323 | |
| jojisdogakane | 0:2f6112d75752 | 324 | static uint8_t rrIntervalH = 0; |
| jojisdogakane | 0:2f6112d75752 | 325 | static uint8_t rrIntervalL = 1; |
| jojisdogakane | 6:35f536162183 | 326 | |
| jojisdogakane | 6:35f536162183 | 327 | int r = 0; |
| jojisdogakane | 6:35f536162183 | 328 | int g = 0; |
| jojisdogakane | 6:35f536162183 | 329 | int b = 0; |
| jojisdogakane | 6:35f536162183 | 330 | int brightnessSum = 0; |
| jojisdogakane | 6:35f536162183 | 331 | int brightnessMax = 0; |
| jojisdogakane | 0:2f6112d75752 | 332 | |
| jojisdogakane | 0:2f6112d75752 | 333 | neopixel_strip_t neopixel1; |
| jojisdogakane | 0:2f6112d75752 | 334 | neopixel_init(&neopixel1, P0_7, 1); |
| jojisdogakane | 0:2f6112d75752 | 335 | neopixel_clear(&neopixel1); |
| jojisdogakane | 0:2f6112d75752 | 336 | |
| jojisdogakane | 0:2f6112d75752 | 337 | neopixel_strip_t neopixel2; |
| jojisdogakane | 0:2f6112d75752 | 338 | neopixel_init(&neopixel2, P0_8, 1); |
| jojisdogakane | 0:2f6112d75752 | 339 | neopixel_clear(&neopixel2); |
| jojisdogakane | 0:2f6112d75752 | 340 | |
| jojisdogakane | 0:2f6112d75752 | 341 | neopixel_strip_t neopixel3; |
| jojisdogakane | 0:2f6112d75752 | 342 | neopixel_init(&neopixel3, P0_10, 1); |
| jojisdogakane | 0:2f6112d75752 | 343 | neopixel_clear(&neopixel3); |
| jojisdogakane | 0:2f6112d75752 | 344 | |
| jojisdogakane | 0:2f6112d75752 | 345 | neopixel_strip_t neopixel4; |
| jojisdogakane | 0:2f6112d75752 | 346 | neopixel_init(&neopixel4, P0_9, 1); |
| jojisdogakane | 0:2f6112d75752 | 347 | neopixel_clear(&neopixel4); |
| jojisdogakane | 0:2f6112d75752 | 348 | |
| jojisdogakane | 0:2f6112d75752 | 349 | neopixel_strip_t neopixel5; |
| jojisdogakane | 0:2f6112d75752 | 350 | neopixel_init(&neopixel5, P0_15, 1); |
| jojisdogakane | 0:2f6112d75752 | 351 | neopixel_clear(&neopixel5); |
| jojisdogakane | 0:2f6112d75752 | 352 | |
| jojisdogakane | 0:2f6112d75752 | 353 | neopixel_strip_t neopixel6; |
| jojisdogakane | 0:2f6112d75752 | 354 | neopixel_init(&neopixel6, P0_11, 1); |
| jojisdogakane | 0:2f6112d75752 | 355 | neopixel_clear(&neopixel6); |
| jojisdogakane | 0:2f6112d75752 | 356 | |
| jojisdogakane | 0:2f6112d75752 | 357 | neopixel_strip_t *pixels[6]; |
| jojisdogakane | 0:2f6112d75752 | 358 | |
| jojisdogakane | 0:2f6112d75752 | 359 | pixels[0] = &neopixel1; |
| jojisdogakane | 0:2f6112d75752 | 360 | pixels[1] = &neopixel2; |
| jojisdogakane | 0:2f6112d75752 | 361 | pixels[2] = &neopixel3; |
| jojisdogakane | 0:2f6112d75752 | 362 | pixels[3] = &neopixel4; |
| jojisdogakane | 0:2f6112d75752 | 363 | pixels[4] = &neopixel5; |
| jojisdogakane | 0:2f6112d75752 | 364 | pixels[5] = &neopixel6; |
| jojisdogakane | 0:2f6112d75752 | 365 | |
| jojisdogakane | 4:a0150e0f285b | 366 | |
| jojisdogakane | 6:35f536162183 | 367 | |
| jojisdogakane | 4:a0150e0f285b | 368 | SetMoodColor(); |
| jojisdogakane | 4:a0150e0f285b | 369 | |
| jojisdogakane | 0:2f6112d75752 | 370 | ble.init(); |
| jojisdogakane | 0:2f6112d75752 | 371 | ble.gap().onDisconnection(disconnectionCallback); |
| jojisdogakane | 0:2f6112d75752 | 372 | |
| jojisdogakane | 4:a0150e0f285b | 373 | |
| jojisdogakane | 0:2f6112d75752 | 374 | UARTService uartService(ble); |
| jojisdogakane | 0:2f6112d75752 | 375 | uartServicePtr = &uartService; |
| jojisdogakane | 0:2f6112d75752 | 376 | |
| ayaando | 2:221df6d014f5 | 377 | // ★OTA用 |
| ayaando | 2:221df6d014f5 | 378 | dfuService = new DFUService(ble, NULL); |
| jojisdogakane | 4:a0150e0f285b | 379 | |
| jojisdogakane | 0:2f6112d75752 | 380 | /* Setup primary service. */ |
| jojisdogakane | 0:2f6112d75752 | 381 | HeartRateService hrServiceBPM(ble, BPM, HeartRateService::LOCATION_CHEST); |
| jojisdogakane | 0:2f6112d75752 | 382 | // HeartRateService hrServiceIBI(ble, IBI, HeartRateService::LOCATION_FINGER); |
| jojisdogakane | 0:2f6112d75752 | 383 | |
| jojisdogakane | 0:2f6112d75752 | 384 | // BatteryService batteryService(ble, 100); |
| jojisdogakane | 0:2f6112d75752 | 385 | |
| jojisdogakane | 0:2f6112d75752 | 386 | /* Setup auxiliary service. */ |
| ayaando | 2:221df6d014f5 | 387 | //DeviceInformationService deviceInfo(ble, "ARM", "Model1", "SN1", "hw-rev1", "fw-rev1", "soft-rev1"); |
| ayaando | 7:4118d5a717bc | 388 | |
| ayaando | 7:4118d5a717bc | 389 | char serialNumber[16] = "IND"; |
| ayaando | 7:4118d5a717bc | 390 | // SerialNumberStringにMACアドレスを組み込む |
| ayaando | 7:4118d5a717bc | 391 | setBleSerialNumber(serialNumber); |
| ayaando | 7:4118d5a717bc | 392 | |
| ayaando | 2:221df6d014f5 | 393 | // ★ |
| ayaando | 7:4118d5a717bc | 394 | DeviceInformationService deviceInfo(ble, "INUPATHY01", "0.0.1", serialNumber, "0.0.1", "0.0.1", "0.0.1"); |
| ayaando | 1:f28bdfaf3005 | 395 | |
| jojisdogakane | 0:2f6112d75752 | 396 | /* Setup advertising. */ |
| jojisdogakane | 0:2f6112d75752 | 397 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); |
| jojisdogakane | 0:2f6112d75752 | 398 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list)); |
| jojisdogakane | 0:2f6112d75752 | 399 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::GENERIC_HEART_RATE_SENSOR); |
| jojisdogakane | 0:2f6112d75752 | 400 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); |
| jojisdogakane | 0:2f6112d75752 | 401 | ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); |
| jojisdogakane | 0:2f6112d75752 | 402 | ble.gap().setAdvertisingInterval(800); /* 1000ms */ |
| jojisdogakane | 0:2f6112d75752 | 403 | ble.gap().startAdvertising(); |
| jojisdogakane | 0:2f6112d75752 | 404 | |
| jojisdogakane | 4:a0150e0f285b | 405 | for( i = 0; i < NEOPIXEL_COUNT; i++) |
| jojisdogakane | 6:35f536162183 | 406 | { |
| jojisdogakane | 6:35f536162183 | 407 | // 起動時の色パターンを設定 |
| jojisdogakane | 6:35f536162183 | 408 | ColorArrayR[i] = RainbowR[i]; |
| jojisdogakane | 6:35f536162183 | 409 | ColorArrayG[i] = RainbowG[i]; |
| jojisdogakane | 6:35f536162183 | 410 | ColorArrayB[i] = RainbowB[i]; |
| jojisdogakane | 6:35f536162183 | 411 | |
| jojisdogakane | 4:a0150e0f285b | 412 | TargetColorArrayR[i] = ColorArrayR[i]; |
| jojisdogakane | 4:a0150e0f285b | 413 | TargetColorArrayG[i] = ColorArrayG[i]; |
| jojisdogakane | 4:a0150e0f285b | 414 | TargetColorArrayB[i] = ColorArrayB[i]; |
| jojisdogakane | 6:35f536162183 | 415 | |
| jojisdogakane | 6:35f536162183 | 416 | // 輝度調整 |
| jojisdogakane | 6:35f536162183 | 417 | r = ColorArrayR[i] * DIM_LED; |
| jojisdogakane | 6:35f536162183 | 418 | g = ColorArrayG[i] * DIM_LED; |
| jojisdogakane | 6:35f536162183 | 419 | b = ColorArrayB[i] * DIM_LED; |
| jojisdogakane | 6:35f536162183 | 420 | |
| jojisdogakane | 6:35f536162183 | 421 | brightnessSum = r + g + b; |
| jojisdogakane | 6:35f536162183 | 422 | |
| jojisdogakane | 6:35f536162183 | 423 | // 輝度の合計値が上限を超えた場合は補正する |
| jojisdogakane | 6:35f536162183 | 424 | if(brightnessSum > BRIGHTNESS_MAX) { |
| jojisdogakane | 6:35f536162183 | 425 | r = (int)(r * ((float)BRIGHTNESS_MAX / (float)brightnessSum)); |
| jojisdogakane | 6:35f536162183 | 426 | g = (int)(g * ((float)BRIGHTNESS_MAX / (float)brightnessSum)); |
| jojisdogakane | 6:35f536162183 | 427 | b = (int)(b * ((float)BRIGHTNESS_MAX / (float)brightnessSum)); |
| jojisdogakane | 6:35f536162183 | 428 | } |
| jojisdogakane | 6:35f536162183 | 429 | |
| jojisdogakane | 0:2f6112d75752 | 430 | neopixel_set_color( |
| jojisdogakane | 0:2f6112d75752 | 431 | pixels[i], |
| jojisdogakane | 0:2f6112d75752 | 432 | 0, |
| jojisdogakane | 6:35f536162183 | 433 | short(r), |
| jojisdogakane | 6:35f536162183 | 434 | short(g), |
| jojisdogakane | 6:35f536162183 | 435 | short(b)); |
| jojisdogakane | 0:2f6112d75752 | 436 | neopixel_show(pixels[i]); |
| jojisdogakane | 0:2f6112d75752 | 437 | } |
| jojisdogakane | 4:a0150e0f285b | 438 | |
| jojisdogakane | 0:2f6112d75752 | 439 | t.start(); |
| jojisdogakane | 0:2f6112d75752 | 440 | |
| jojisdogakane | 0:2f6112d75752 | 441 | prevmillis = t.read_ms(); |
| jojisdogakane | 0:2f6112d75752 | 442 | |
| jojisdogakane | 0:2f6112d75752 | 443 | bool bPulseEvent = false; |
| jojisdogakane | 0:2f6112d75752 | 444 | |
| jojisdogakane | 0:2f6112d75752 | 445 | float degPoint = 0; |
| jojisdogakane | 0:2f6112d75752 | 446 | float degRatio = 0; |
| jojisdogakane | 0:2f6112d75752 | 447 | |
| jojisdogakane | 0:2f6112d75752 | 448 | bool bSwingR = false; |
| jojisdogakane | 0:2f6112d75752 | 449 | |
| jojisdogakane | 0:2f6112d75752 | 450 | float swingIndex = 0.0; |
| jojisdogakane | 0:2f6112d75752 | 451 | |
| jojisdogakane | 0:2f6112d75752 | 452 | float midPoint = 0.5; |
| jojisdogakane | 0:2f6112d75752 | 453 | |
| jojisdogakane | 0:2f6112d75752 | 454 | // neopixelTick.attach(neopixelTick_Handler, 0.005); |
| jojisdogakane | 0:2f6112d75752 | 455 | |
| jojisdogakane | 0:2f6112d75752 | 456 | while (1) { |
| jojisdogakane | 0:2f6112d75752 | 457 | |
| jojisdogakane | 0:2f6112d75752 | 458 | // batteryService.updateBatteryLevel( (uint8_t)read_battery_level()); |
| jojisdogakane | 0:2f6112d75752 | 459 | |
| jojisdogakane | 0:2f6112d75752 | 460 | float currentValue = HRSigIn; |
| jojisdogakane | 0:2f6112d75752 | 461 | |
| jojisdogakane | 0:2f6112d75752 | 462 | bPulseEvent = false; |
| jojisdogakane | 0:2f6112d75752 | 463 | |
| jojisdogakane | 4:a0150e0f285b | 464 | if ((currentValue <= 0.3) && (sensorValue > 0.3)) |
| jojisdogakane | 0:2f6112d75752 | 465 | { |
| jojisdogakane | 0:2f6112d75752 | 466 | bPulseEvent = true; |
| jojisdogakane | 0:2f6112d75752 | 467 | } |
| jojisdogakane | 0:2f6112d75752 | 468 | |
| jojisdogakane | 0:2f6112d75752 | 469 | int sens = 1023 * currentValue; |
| jojisdogakane | 0:2f6112d75752 | 470 | |
| jojisdogakane | 0:2f6112d75752 | 471 | // printf("S%d", sens); |
| jojisdogakane | 0:2f6112d75752 | 472 | // printf("S%d\n", sens); |
| jojisdogakane | 0:2f6112d75752 | 473 | |
| jojisdogakane | 0:2f6112d75752 | 474 | sensorValue = currentValue; |
| jojisdogakane | 0:2f6112d75752 | 475 | |
| jojisdogakane | 0:2f6112d75752 | 476 | if(bPulseEvent) { |
| jojisdogakane | 0:2f6112d75752 | 477 | fBeatIndex = 0.0; |
| jojisdogakane | 0:2f6112d75752 | 478 | // batteryService.updateBatteryLevel( (uint8_t)read_battery_level()); |
| jojisdogakane | 0:2f6112d75752 | 479 | |
| jojisdogakane | 0:2f6112d75752 | 480 | // 現在の時刻を取得 |
| jojisdogakane | 0:2f6112d75752 | 481 | // t.stop(); // stop, startは時間計測の結果を有意に短くしてしまうので使わない |
| jojisdogakane | 0:2f6112d75752 | 482 | currentmillis = t.read_ms(); |
| jojisdogakane | 0:2f6112d75752 | 483 | // t.start(); |
| jojisdogakane | 0:2f6112d75752 | 484 | // 現在時刻から過去時刻を引き、間隔を求める |
| jojisdogakane | 0:2f6112d75752 | 485 | intervalmillis = currentmillis - prevmillis; |
| jojisdogakane | 0:2f6112d75752 | 486 | |
| jojisdogakane | 0:2f6112d75752 | 487 | // 心拍の間の間隔 |
| jojisdogakane | 0:2f6112d75752 | 488 | IBI = intervalmillis; |
| jojisdogakane | 0:2f6112d75752 | 489 | |
| jojisdogakane | 0:2f6112d75752 | 490 | // 現在の時刻を過去時刻として記録 |
| jojisdogakane | 0:2f6112d75752 | 491 | prevmillis = currentmillis; |
| jojisdogakane | 0:2f6112d75752 | 492 | |
| jojisdogakane | 0:2f6112d75752 | 493 | // 平均値算出用配列に値を詰める |
| jojisdogakane | 0:2f6112d75752 | 494 | double averageIntervalMillis; |
| jojisdogakane | 0:2f6112d75752 | 495 | |
| jojisdogakane | 0:2f6112d75752 | 496 | for(i = 0; i < MAXARRAY ; i++) |
| jojisdogakane | 0:2f6112d75752 | 497 | { |
| jojisdogakane | 0:2f6112d75752 | 498 | // 最後尾以外の場合 |
| jojisdogakane | 0:2f6112d75752 | 499 | if(i != MAXARRAY - 1) |
| jojisdogakane | 0:2f6112d75752 | 500 | { |
| jojisdogakane | 0:2f6112d75752 | 501 | // 次の要素の値をコピーする |
| jojisdogakane | 0:2f6112d75752 | 502 | intervalmillisArray[i] = intervalmillisArray[i + 1]; |
| jojisdogakane | 0:2f6112d75752 | 503 | } |
| jojisdogakane | 0:2f6112d75752 | 504 | // 最後尾の場合 |
| jojisdogakane | 0:2f6112d75752 | 505 | else { |
| jojisdogakane | 0:2f6112d75752 | 506 | // 最新値を詰める |
| jojisdogakane | 0:2f6112d75752 | 507 | intervalmillisArray[i] = intervalmillis; |
| jojisdogakane | 0:2f6112d75752 | 508 | } |
| jojisdogakane | 0:2f6112d75752 | 509 | } |
| jojisdogakane | 0:2f6112d75752 | 510 | // 先頭が0の間は何もしない |
| jojisdogakane | 0:2f6112d75752 | 511 | unsigned long sumIntervalMillis = 0; |
| jojisdogakane | 0:2f6112d75752 | 512 | unsigned long sumIntervalMillisV = 0; |
| jojisdogakane | 0:2f6112d75752 | 513 | if (intervalmillisArray[0] != 0) |
| jojisdogakane | 0:2f6112d75752 | 514 | { |
| jojisdogakane | 0:2f6112d75752 | 515 | // 平均値算出 |
| jojisdogakane | 0:2f6112d75752 | 516 | averageIntervalMillis = 0; |
| jojisdogakane | 0:2f6112d75752 | 517 | for(i = 0; i < MAXARRAY ; i++) |
| jojisdogakane | 0:2f6112d75752 | 518 | { |
| jojisdogakane | 0:2f6112d75752 | 519 | sumIntervalMillis += intervalmillisArray[i]; |
| jojisdogakane | 0:2f6112d75752 | 520 | sumIntervalMillisV += intervalmillisArray[i] * intervalmillisArray[i]; |
| jojisdogakane | 0:2f6112d75752 | 521 | } |
| jojisdogakane | 0:2f6112d75752 | 522 | double squ; |
| jojisdogakane | 0:2f6112d75752 | 523 | double var; |
| jojisdogakane | 0:2f6112d75752 | 524 | double stdDev; |
| jojisdogakane | 0:2f6112d75752 | 525 | |
| jojisdogakane | 0:2f6112d75752 | 526 | averageIntervalMillis = (double)sumIntervalMillis / (double)MAXARRAY; |
| jojisdogakane | 0:2f6112d75752 | 527 | |
| jojisdogakane | 0:2f6112d75752 | 528 | squ = sumIntervalMillisV - (double)(sumIntervalMillis * sumIntervalMillis) / (double)MAXARRAY; |
| jojisdogakane | 0:2f6112d75752 | 529 | var = squ / (double)(MAXARRAY - 1); |
| jojisdogakane | 0:2f6112d75752 | 530 | stdDev = sqrt(var); |
| jojisdogakane | 0:2f6112d75752 | 531 | |
| jojisdogakane | 0:2f6112d75752 | 532 | BPM = min32_of(60000 / averageIntervalMillis, 255); |
| jojisdogakane | 0:2f6112d75752 | 533 | // if(intervalmillis < averageIntervalMillis - stdDev) { // || intervalmillis > averageIntervalMillis + stdDev) { |
| jojisdogakane | 0:2f6112d75752 | 534 | |
| jojisdogakane | 0:2f6112d75752 | 535 | currentBPM = min32_of(60000 / intervalmillis, 255); |
| jojisdogakane | 0:2f6112d75752 | 536 | /* } |
| jojisdogakane | 0:2f6112d75752 | 537 | else { |
| jojisdogakane | 0:2f6112d75752 | 538 | currentBPM = BPM; |
| jojisdogakane | 0:2f6112d75752 | 539 | } */ |
| jojisdogakane | 0:2f6112d75752 | 540 | } |
| jojisdogakane | 0:2f6112d75752 | 541 | /* |
| jojisdogakane | 0:2f6112d75752 | 542 | int IBI1024 = IBI * (1024/1000); |
| jojisdogakane | 0:2f6112d75752 | 543 | |
| jojisdogakane | 0:2f6112d75752 | 544 | bpm[1] = BPM; |
| jojisdogakane | 0:2f6112d75752 | 545 | bpm[6] = (IBI1024 & 0xFF00) >> 8; |
| jojisdogakane | 0:2f6112d75752 | 546 | bpm[7] = (IBI1024 & 0xFF); |
| jojisdogakane | 0:2f6112d75752 | 547 | */ |
| jojisdogakane | 0:2f6112d75752 | 548 | // update bpm |
| jojisdogakane | 0:2f6112d75752 | 549 | if(ble.gap().getState().connected == 1) |
| jojisdogakane | 0:2f6112d75752 | 550 | { |
| jojisdogakane | 0:2f6112d75752 | 551 | hrServiceBPM.updateHeartRate(BPM); |
| jojisdogakane | 0:2f6112d75752 | 552 | // hrServiceIBI.updateHeartRate(IBI); |
| jojisdogakane | 0:2f6112d75752 | 553 | } |
| jojisdogakane | 0:2f6112d75752 | 554 | |
| jojisdogakane | 0:2f6112d75752 | 555 | // printf("B%d\n", BPM); |
| jojisdogakane | 0:2f6112d75752 | 556 | // printf("Q%d\n", IBI); |
| jojisdogakane | 0:2f6112d75752 | 557 | |
| jojisdogakane | 0:2f6112d75752 | 558 | // nMsgLen = sprintf(msg,"B%d\0", BPM); |
| jojisdogakane | 0:2f6112d75752 | 559 | // ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), (uint8_t*)msg, nMsgLen); |
| jojisdogakane | 0:2f6112d75752 | 560 | |
| jojisdogakane | 0:2f6112d75752 | 561 | nMsgIBILen = sprintf(msgIBI,"Q%d\0", IBI); |
| jojisdogakane | 0:2f6112d75752 | 562 | // ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), (uint8_t*)msg, nMsgLen); |
| jojisdogakane | 0:2f6112d75752 | 563 | |
| jojisdogakane | 0:2f6112d75752 | 564 | // 平均値算出用配列に値を詰める |
| jojisdogakane | 0:2f6112d75752 | 565 | for(i = 0; i < MAXHRVARRAY ; i++) |
| jojisdogakane | 0:2f6112d75752 | 566 | { |
| jojisdogakane | 0:2f6112d75752 | 567 | // 最後尾以外の場合 |
| jojisdogakane | 0:2f6112d75752 | 568 | if(i != MAXHRVARRAY - 1) |
| jojisdogakane | 0:2f6112d75752 | 569 | { |
| jojisdogakane | 0:2f6112d75752 | 570 | // 次の要素の値をコピーする |
| jojisdogakane | 0:2f6112d75752 | 571 | intervalmillisHRVArray[i] = intervalmillisHRVArray[i + 1]; |
| jojisdogakane | 0:2f6112d75752 | 572 | } |
| jojisdogakane | 0:2f6112d75752 | 573 | // 最後尾の場合 |
| jojisdogakane | 0:2f6112d75752 | 574 | else { |
| jojisdogakane | 0:2f6112d75752 | 575 | // 最新値を詰める |
| jojisdogakane | 0:2f6112d75752 | 576 | intervalmillisHRVArray[i] = intervalmillis; |
| jojisdogakane | 0:2f6112d75752 | 577 | } |
| jojisdogakane | 0:2f6112d75752 | 578 | } |
| jojisdogakane | 0:2f6112d75752 | 579 | |
| jojisdogakane | 0:2f6112d75752 | 580 | // 平均値算出 |
| jojisdogakane | 0:2f6112d75752 | 581 | int nNNInterval; |
| jojisdogakane | 0:2f6112d75752 | 582 | unsigned long ulIntervalSum = 0; |
| jojisdogakane | 0:2f6112d75752 | 583 | int nSampleCount = 0; |
| jojisdogakane | 0:2f6112d75752 | 584 | for(i = 0; i < MAXHRVARRAY ; i++) |
| jojisdogakane | 0:2f6112d75752 | 585 | { |
| jojisdogakane | 0:2f6112d75752 | 586 | if(intervalmillisHRVArray[i] > 0) |
| jojisdogakane | 0:2f6112d75752 | 587 | { |
| jojisdogakane | 0:2f6112d75752 | 588 | ulIntervalSum += intervalmillisHRVArray[i]; |
| jojisdogakane | 0:2f6112d75752 | 589 | nSampleCount++; |
| jojisdogakane | 0:2f6112d75752 | 590 | } |
| jojisdogakane | 0:2f6112d75752 | 591 | } |
| jojisdogakane | 0:2f6112d75752 | 592 | |
| jojisdogakane | 0:2f6112d75752 | 593 | float IntervalAverage = 0.0; |
| jojisdogakane | 0:2f6112d75752 | 594 | if(nSampleCount > 0){ |
| jojisdogakane | 0:2f6112d75752 | 595 | IntervalAverage = (float)ulIntervalSum / (float)nSampleCount; |
| jojisdogakane | 0:2f6112d75752 | 596 | } |
| jojisdogakane | 0:2f6112d75752 | 597 | |
| jojisdogakane | 0:2f6112d75752 | 598 | nNNInterval = (int)((float)IntervalAverage * PNNX_FACTOR); |
| jojisdogakane | 0:2f6112d75752 | 599 | |
| jojisdogakane | 0:2f6112d75752 | 600 | |
| jojisdogakane | 0:2f6112d75752 | 601 | bool bContinue = false; |
| jojisdogakane | 0:2f6112d75752 | 602 | int nNNxCount = 0; |
| jojisdogakane | 0:2f6112d75752 | 603 | for(i = 0; i < MAXHRVARRAY ; i++) |
| jojisdogakane | 0:2f6112d75752 | 604 | { |
| jojisdogakane | 0:2f6112d75752 | 605 | // if not end |
| jojisdogakane | 0:2f6112d75752 | 606 | if(i < MAXHRVARRAY - 1) { |
| jojisdogakane | 0:2f6112d75752 | 607 | if(abs((int)(intervalmillisHRVArray[i] - intervalmillisHRVArray[i + 1])) >= nNNInterval) |
| jojisdogakane | 0:2f6112d75752 | 608 | { |
| jojisdogakane | 0:2f6112d75752 | 609 | if(bContinue == false) |
| jojisdogakane | 0:2f6112d75752 | 610 | { |
| jojisdogakane | 0:2f6112d75752 | 611 | nNNxCount++; |
| jojisdogakane | 0:2f6112d75752 | 612 | } |
| jojisdogakane | 0:2f6112d75752 | 613 | nNNxCount++; |
| jojisdogakane | 0:2f6112d75752 | 614 | bContinue = true; |
| jojisdogakane | 0:2f6112d75752 | 615 | } |
| jojisdogakane | 0:2f6112d75752 | 616 | else { |
| jojisdogakane | 0:2f6112d75752 | 617 | bContinue = false; |
| jojisdogakane | 0:2f6112d75752 | 618 | } |
| jojisdogakane | 0:2f6112d75752 | 619 | } |
| jojisdogakane | 0:2f6112d75752 | 620 | } |
| jojisdogakane | 0:2f6112d75752 | 621 | |
| jojisdogakane | 0:2f6112d75752 | 622 | float diffRatio = (float)nNNxCount / (float)nSampleCount; |
| jojisdogakane | 0:2f6112d75752 | 623 | |
| jojisdogakane | 0:2f6112d75752 | 624 | if(diffRatio > 1) |
| jojisdogakane | 0:2f6112d75752 | 625 | { |
| jojisdogakane | 0:2f6112d75752 | 626 | diffRatio = 1; |
| jojisdogakane | 0:2f6112d75752 | 627 | } |
| jojisdogakane | 0:2f6112d75752 | 628 | |
| jojisdogakane | 0:2f6112d75752 | 629 | // リラックスの係数を算出する |
| jojisdogakane | 0:2f6112d75752 | 630 | relaxRatio = diffRatio; |
| jojisdogakane | 0:2f6112d75752 | 631 | |
| jojisdogakane | 6:35f536162183 | 632 | nMsgRelaxLen = sprintf(msgRelax,"S%0.2f\0", (1-relaxRatio)); |
| jojisdogakane | 0:2f6112d75752 | 633 | |
| jojisdogakane | 0:2f6112d75752 | 634 | // nMsgLen = sprintf(msg,"R%0.2f\0", relaxRatio); |
| jojisdogakane | 0:2f6112d75752 | 635 | // ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), (uint8_t*)msg, nMsgLen); |
| jojisdogakane | 0:2f6112d75752 | 636 | |
| jojisdogakane | 0:2f6112d75752 | 637 | // 現在値から最低値を引く |
| jojisdogakane | 0:2f6112d75752 | 638 | // relaxRatio = relaxRatio - RELAX_RATIO_MIN; |
| jojisdogakane | 0:2f6112d75752 | 639 | |
| jojisdogakane | 0:2f6112d75752 | 640 | // 1.0 / 最低値 × 現在値 |
| jojisdogakane | 0:2f6112d75752 | 641 | // relaxRatio = relaxRatio * (1.0 / (1.0 - RELAX_RATIO_MIN)); |
| jojisdogakane | 0:2f6112d75752 | 642 | |
| jojisdogakane | 0:2f6112d75752 | 643 | int x1, y1, x2, y2; |
| jojisdogakane | 0:2f6112d75752 | 644 | int tempx1, tempy1, tempx2, tempy2, tempx3, tempy3; |
| jojisdogakane | 0:2f6112d75752 | 645 | int longx, shortx, longy, shorty; |
| jojisdogakane | 0:2f6112d75752 | 646 | long xx1, xx2, yy1, yy2; |
| jojisdogakane | 0:2f6112d75752 | 647 | |
| jojisdogakane | 0:2f6112d75752 | 648 | int movex, movey; |
| jojisdogakane | 0:2f6112d75752 | 649 | |
| jojisdogakane | 0:2f6112d75752 | 650 | double dist1, dist2; |
| jojisdogakane | 0:2f6112d75752 | 651 | double conRatioRatio; |
| jojisdogakane | 0:2f6112d75752 | 652 | |
| jojisdogakane | 0:2f6112d75752 | 653 | /* |
| jojisdogakane | 0:2f6112d75752 | 654 | // 最後尾の3データから二つのx, y地点を作る。 |
| jojisdogakane | 0:2f6112d75752 | 655 | x1 = intervalmillisArray[nSampleCount - 1]; |
| jojisdogakane | 0:2f6112d75752 | 656 | y1 = intervalmillisArray[nSampleCount - 2]; |
| jojisdogakane | 0:2f6112d75752 | 657 | x2 = intervalmillisArray[nSampleCount - 2]; |
| jojisdogakane | 0:2f6112d75752 | 658 | y2 = intervalmillisArray[nSampleCount - 3]; |
| jojisdogakane | 0:2f6112d75752 | 659 | */ |
| jojisdogakane | 0:2f6112d75752 | 660 | |
| jojisdogakane | 0:2f6112d75752 | 661 | x1 = intervalmillis; |
| jojisdogakane | 0:2f6112d75752 | 662 | y1 = prevInterval; |
| jojisdogakane | 0:2f6112d75752 | 663 | x2 = prevInterval; |
| jojisdogakane | 0:2f6112d75752 | 664 | y2 = prevprevInterval; |
| jojisdogakane | 0:2f6112d75752 | 665 | |
| jojisdogakane | 0:2f6112d75752 | 666 | // 2地点を結ぶ直線の長さを算出する。 |
| jojisdogakane | 0:2f6112d75752 | 667 | if(x1 > x2) |
| jojisdogakane | 0:2f6112d75752 | 668 | { |
| jojisdogakane | 0:2f6112d75752 | 669 | longx = x1; |
| jojisdogakane | 0:2f6112d75752 | 670 | shortx = x2; |
| jojisdogakane | 0:2f6112d75752 | 671 | } |
| jojisdogakane | 0:2f6112d75752 | 672 | else { |
| jojisdogakane | 0:2f6112d75752 | 673 | longx = x2; |
| jojisdogakane | 0:2f6112d75752 | 674 | shortx = x1; |
| jojisdogakane | 0:2f6112d75752 | 675 | } |
| jojisdogakane | 0:2f6112d75752 | 676 | |
| jojisdogakane | 0:2f6112d75752 | 677 | if(y1 > y2) |
| jojisdogakane | 0:2f6112d75752 | 678 | { |
| jojisdogakane | 0:2f6112d75752 | 679 | longy = y1; |
| jojisdogakane | 0:2f6112d75752 | 680 | shorty = y2; |
| jojisdogakane | 0:2f6112d75752 | 681 | } |
| jojisdogakane | 0:2f6112d75752 | 682 | else { |
| jojisdogakane | 0:2f6112d75752 | 683 | longy = y2; |
| jojisdogakane | 0:2f6112d75752 | 684 | shorty = y1; |
| jojisdogakane | 0:2f6112d75752 | 685 | } |
| jojisdogakane | 0:2f6112d75752 | 686 | |
| jojisdogakane | 0:2f6112d75752 | 687 | xx1 = longx - shortx; |
| jojisdogakane | 0:2f6112d75752 | 688 | yy1 = longy - shorty; |
| jojisdogakane | 0:2f6112d75752 | 689 | |
| jojisdogakane | 0:2f6112d75752 | 690 | dist1 = sqrt((double)((xx1 * xx1) + (yy1 * yy1))); |
| jojisdogakane | 0:2f6112d75752 | 691 | |
| jojisdogakane | 0:2f6112d75752 | 692 | dist2 = longx + longy; |
| jojisdogakane | 0:2f6112d75752 | 693 | float distRatio = dist1 / dist2; |
| jojisdogakane | 0:2f6112d75752 | 694 | |
| jojisdogakane | 0:2f6112d75752 | 695 | conRatioNow = 1 - distRatio; |
| jojisdogakane | 0:2f6112d75752 | 696 | |
| jojisdogakane | 0:2f6112d75752 | 697 | // 平均値算出用配列に値を詰める |
| jojisdogakane | 0:2f6112d75752 | 698 | float averageConRatio = 0.5; |
| jojisdogakane | 0:2f6112d75752 | 699 | for(i = 0; i < MAXCONARRAY ; i++) |
| jojisdogakane | 0:2f6112d75752 | 700 | { |
| jojisdogakane | 0:2f6112d75752 | 701 | // 最後尾以外の場合 |
| jojisdogakane | 0:2f6112d75752 | 702 | if(i != MAXCONARRAY - 1) |
| jojisdogakane | 0:2f6112d75752 | 703 | { |
| jojisdogakane | 0:2f6112d75752 | 704 | // 次の要素の値をコピーする |
| jojisdogakane | 0:2f6112d75752 | 705 | conArray[i] = conArray[i + 1]; |
| jojisdogakane | 0:2f6112d75752 | 706 | } |
| jojisdogakane | 0:2f6112d75752 | 707 | // 最後尾の場合 |
| jojisdogakane | 0:2f6112d75752 | 708 | else { |
| jojisdogakane | 0:2f6112d75752 | 709 | // 最新値を詰める |
| jojisdogakane | 0:2f6112d75752 | 710 | conArray[i] = distRatio; |
| jojisdogakane | 0:2f6112d75752 | 711 | } |
| jojisdogakane | 0:2f6112d75752 | 712 | } |
| jojisdogakane | 0:2f6112d75752 | 713 | // 先頭が0の間は何もしない |
| jojisdogakane | 0:2f6112d75752 | 714 | if (conArray[0] != 0) |
| jojisdogakane | 0:2f6112d75752 | 715 | { |
| jojisdogakane | 0:2f6112d75752 | 716 | // 平均値算出 |
| jojisdogakane | 0:2f6112d75752 | 717 | averageConRatio = 0; |
| jojisdogakane | 0:2f6112d75752 | 718 | for(i = 0; i < MAXCONARRAY ; i++) |
| jojisdogakane | 0:2f6112d75752 | 719 | { |
| jojisdogakane | 0:2f6112d75752 | 720 | averageConRatio += conArray[i]; |
| jojisdogakane | 0:2f6112d75752 | 721 | } |
| jojisdogakane | 0:2f6112d75752 | 722 | averageConRatio = averageConRatio / (double)MAXCONARRAY; |
| jojisdogakane | 0:2f6112d75752 | 723 | } |
| jojisdogakane | 0:2f6112d75752 | 724 | /* |
| jojisdogakane | 0:2f6112d75752 | 725 | float averageStressRatio = 0.5; |
| jojisdogakane | 0:2f6112d75752 | 726 | for(i = 0; i < MAXSTRESSARRAY ; i++) |
| jojisdogakane | 0:2f6112d75752 | 727 | { |
| jojisdogakane | 0:2f6112d75752 | 728 | // 最後尾以外の場合 |
| jojisdogakane | 0:2f6112d75752 | 729 | if(i != MAXSTRESSARRAY - 1) |
| jojisdogakane | 0:2f6112d75752 | 730 | { |
| jojisdogakane | 0:2f6112d75752 | 731 | // 次の要素の値をコピーする |
| jojisdogakane | 0:2f6112d75752 | 732 | stressArray[i] = stressArray[i + 1]; |
| jojisdogakane | 0:2f6112d75752 | 733 | } |
| jojisdogakane | 0:2f6112d75752 | 734 | // 最後尾の場合 |
| jojisdogakane | 0:2f6112d75752 | 735 | else { |
| jojisdogakane | 0:2f6112d75752 | 736 | // 最新値を詰める |
| jojisdogakane | 0:2f6112d75752 | 737 | if(x1 > y1) { |
| jojisdogakane | 0:2f6112d75752 | 738 | stressArray[i] = y1 / x1; |
| jojisdogakane | 0:2f6112d75752 | 739 | } |
| jojisdogakane | 0:2f6112d75752 | 740 | else { |
| jojisdogakane | 0:2f6112d75752 | 741 | stressArray[i] = x1 / y1; |
| jojisdogakane | 0:2f6112d75752 | 742 | } |
| jojisdogakane | 0:2f6112d75752 | 743 | } |
| jojisdogakane | 0:2f6112d75752 | 744 | } |
| jojisdogakane | 0:2f6112d75752 | 745 | // 先頭が0の間は何もしない |
| jojisdogakane | 0:2f6112d75752 | 746 | if (stressArray[0] != 0) |
| jojisdogakane | 0:2f6112d75752 | 747 | { |
| jojisdogakane | 0:2f6112d75752 | 748 | // 平均値算出 |
| jojisdogakane | 0:2f6112d75752 | 749 | averageStressRatio = 0; |
| jojisdogakane | 0:2f6112d75752 | 750 | for(i = 0; i < MAXSTRESSARRAY ; i++) |
| jojisdogakane | 0:2f6112d75752 | 751 | { |
| jojisdogakane | 0:2f6112d75752 | 752 | averageStressRatio += stressArray[i]; |
| jojisdogakane | 0:2f6112d75752 | 753 | } |
| jojisdogakane | 0:2f6112d75752 | 754 | averageStressRatio = averageStressRatio / (double)MAXSTRESSARRAY; |
| jojisdogakane | 0:2f6112d75752 | 755 | } |
| jojisdogakane | 0:2f6112d75752 | 756 | */ |
| jojisdogakane | 0:2f6112d75752 | 757 | |
| jojisdogakane | 0:2f6112d75752 | 758 | /* float rcFilter = RCFILTER2; |
| jojisdogakane | 0:2f6112d75752 | 759 | float filteredDistRatio = 0.0; |
| jojisdogakane | 0:2f6112d75752 | 760 | float a; |
| jojisdogakane | 0:2f6112d75752 | 761 | if(prevFilteredDistRatio != 0) { |
| jojisdogakane | 0:2f6112d75752 | 762 | a = rcFilter * prevFilteredDistRatio; |
| jojisdogakane | 0:2f6112d75752 | 763 | filteredDistRatio = a + (1 - rcFilter) * distRatio; |
| jojisdogakane | 0:2f6112d75752 | 764 | } |
| jojisdogakane | 0:2f6112d75752 | 765 | else { |
| jojisdogakane | 0:2f6112d75752 | 766 | filteredDistRatio = (1 - rcFilter) * distRatio; |
| jojisdogakane | 0:2f6112d75752 | 767 | } |
| jojisdogakane | 0:2f6112d75752 | 768 | prevFilteredDistRatio = filteredDistRatio ; |
| jojisdogakane | 0:2f6112d75752 | 769 | |
| jojisdogakane | 0:2f6112d75752 | 770 | conRatio = filteredDistRatio ; |
| jojisdogakane | 0:2f6112d75752 | 771 | */ |
| jojisdogakane | 0:2f6112d75752 | 772 | conRatio = averageConRatio; |
| jojisdogakane | 0:2f6112d75752 | 773 | conRatio = 1 - conRatio; |
| jojisdogakane | 0:2f6112d75752 | 774 | |
| jojisdogakane | 0:2f6112d75752 | 775 | nMsgConcentrationLen = sprintf(msgConcentration,"C%0.2f\0", conRatio); |
| jojisdogakane | 0:2f6112d75752 | 776 | |
| jojisdogakane | 0:2f6112d75752 | 777 | // nMsgLen = sprintf(msg,"C%0.2f\0", conRatio); |
| jojisdogakane | 0:2f6112d75752 | 778 | // ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), (uint8_t*)msg, nMsgLen); |
| jojisdogakane | 0:2f6112d75752 | 779 | |
| jojisdogakane | 0:2f6112d75752 | 780 | |
| jojisdogakane | 0:2f6112d75752 | 781 | prevprevInterval = prevInterval; |
| jojisdogakane | 0:2f6112d75752 | 782 | prevInterval = intervalmillis; |
| jojisdogakane | 0:2f6112d75752 | 783 | |
| jojisdogakane | 0:2f6112d75752 | 784 | // (x2, y2)が原点となるように座標を変換する |
| jojisdogakane | 0:2f6112d75752 | 785 | movex = x2 * -1; |
| jojisdogakane | 0:2f6112d75752 | 786 | movey = y2 * -1; |
| jojisdogakane | 0:2f6112d75752 | 787 | |
| jojisdogakane | 0:2f6112d75752 | 788 | tempx1 = x1 - movex; |
| jojisdogakane | 0:2f6112d75752 | 789 | tempy1 = y1 - movey; |
| jojisdogakane | 0:2f6112d75752 | 790 | tempx2 = x2 - movex; |
| jojisdogakane | 0:2f6112d75752 | 791 | tempy2 = y2 - movey; |
| jojisdogakane | 0:2f6112d75752 | 792 | tempx3 = x3 - movex; |
| jojisdogakane | 0:2f6112d75752 | 793 | tempy3 = y3 - movey; |
| jojisdogakane | 0:2f6112d75752 | 794 | |
| jojisdogakane | 0:2f6112d75752 | 795 | // (x2, y2)を中心とした円を考える。 |
| jojisdogakane | 0:2f6112d75752 | 796 | |
| jojisdogakane | 0:2f6112d75752 | 797 | // (x3, y3)を(x2, y2)を中心に180°回転する。→(rotx3, roty3) |
| jojisdogakane | 0:2f6112d75752 | 798 | double theta = DegreeToRadian(180); |
| jojisdogakane | 0:2f6112d75752 | 799 | |
| jojisdogakane | 0:2f6112d75752 | 800 | double rotx3 = (tempx3) * cos(theta) - (tempy3) * sin(theta); |
| jojisdogakane | 0:2f6112d75752 | 801 | double roty3 = (tempx3) * sin(theta) + (tempy3) * cos(theta); |
| jojisdogakane | 0:2f6112d75752 | 802 | |
| jojisdogakane | 0:2f6112d75752 | 803 | // ベクトル1とベクトル3の内積を求める |
| jojisdogakane | 0:2f6112d75752 | 804 | double vecInt = tempx1 * rotx3 + tempy1 * roty3; |
| jojisdogakane | 0:2f6112d75752 | 805 | |
| jojisdogakane | 0:2f6112d75752 | 806 | // ベクトル1とベクトル3の外積を求める |
| jojisdogakane | 0:2f6112d75752 | 807 | double vecExt = tempx1 * roty3 - tempy1 * rotx3; |
| jojisdogakane | 0:2f6112d75752 | 808 | |
| jojisdogakane | 0:2f6112d75752 | 809 | // ベクトル1とベクトル3の角度を求める |
| jojisdogakane | 0:2f6112d75752 | 810 | theta = atan2(vecExt, vecInt); |
| jojisdogakane | 0:2f6112d75752 | 811 | |
| jojisdogakane | 0:2f6112d75752 | 812 | double deg = RadianToDegree(theta); |
| jojisdogakane | 0:2f6112d75752 | 813 | |
| jojisdogakane | 0:2f6112d75752 | 814 | midPoint = degRatio; |
| jojisdogakane | 0:2f6112d75752 | 815 | |
| jojisdogakane | 0:2f6112d75752 | 816 | if( deg <= 11.25 && deg >= -11.25) { |
| jojisdogakane | 0:2f6112d75752 | 817 | degPoint = 0.5; |
| jojisdogakane | 0:2f6112d75752 | 818 | } |
| jojisdogakane | 0:2f6112d75752 | 819 | else if(deg >= 11.25 && deg <= 33.75) { |
| jojisdogakane | 0:2f6112d75752 | 820 | degPoint = 0.375; |
| jojisdogakane | 0:2f6112d75752 | 821 | } |
| jojisdogakane | 0:2f6112d75752 | 822 | else if(deg >= 33.75 && deg <= 56.25) { |
| jojisdogakane | 0:2f6112d75752 | 823 | degPoint = 0.25; |
| jojisdogakane | 0:2f6112d75752 | 824 | } |
| jojisdogakane | 0:2f6112d75752 | 825 | else if(deg >= 56.25 && deg <= 78.75) { |
| jojisdogakane | 0:2f6112d75752 | 826 | degPoint = 0.125; |
| jojisdogakane | 0:2f6112d75752 | 827 | } |
| jojisdogakane | 0:2f6112d75752 | 828 | else if(deg >= 78.75 && deg <= 101.25) { |
| jojisdogakane | 0:2f6112d75752 | 829 | degPoint = 0; |
| jojisdogakane | 0:2f6112d75752 | 830 | } |
| jojisdogakane | 0:2f6112d75752 | 831 | else if(deg >= 101.25 && deg <= 123.75) { |
| jojisdogakane | 0:2f6112d75752 | 832 | degPoint = 0.125; |
| jojisdogakane | 0:2f6112d75752 | 833 | } |
| jojisdogakane | 0:2f6112d75752 | 834 | else if(deg >= 123.75 && deg <= 146.25) { |
| jojisdogakane | 0:2f6112d75752 | 835 | degPoint = 0.25; |
| jojisdogakane | 0:2f6112d75752 | 836 | } |
| jojisdogakane | 0:2f6112d75752 | 837 | else if(deg >= 146.25 && deg <= 168.75) { |
| jojisdogakane | 0:2f6112d75752 | 838 | degPoint = 0.375; |
| jojisdogakane | 0:2f6112d75752 | 839 | } |
| jojisdogakane | 0:2f6112d75752 | 840 | else if(deg >= 168.75 && deg <= 180 || deg <= 0 && deg >= -11.25) { |
| jojisdogakane | 0:2f6112d75752 | 841 | degPoint = 0.5; |
| jojisdogakane | 0:2f6112d75752 | 842 | } |
| jojisdogakane | 0:2f6112d75752 | 843 | else if(deg <= -11.25 && deg >= -33.75) { |
| jojisdogakane | 0:2f6112d75752 | 844 | degPoint = 0.625; |
| jojisdogakane | 0:2f6112d75752 | 845 | } |
| jojisdogakane | 0:2f6112d75752 | 846 | else if(deg <= -33.75 && deg >= -56.25) { |
| jojisdogakane | 0:2f6112d75752 | 847 | degPoint = 0.75; |
| jojisdogakane | 0:2f6112d75752 | 848 | } |
| jojisdogakane | 0:2f6112d75752 | 849 | else if(deg <= -56.25 && deg >= -78.75) { |
| jojisdogakane | 0:2f6112d75752 | 850 | degPoint = 0.875; |
| jojisdogakane | 0:2f6112d75752 | 851 | } |
| jojisdogakane | 0:2f6112d75752 | 852 | else if(deg <= -78.75 && deg >= -101.25) { |
| jojisdogakane | 0:2f6112d75752 | 853 | degPoint = 1; |
| jojisdogakane | 0:2f6112d75752 | 854 | } |
| jojisdogakane | 0:2f6112d75752 | 855 | else if(deg <= -101.25 && deg >= -123.75) { |
| jojisdogakane | 0:2f6112d75752 | 856 | degPoint = 0.875; |
| jojisdogakane | 0:2f6112d75752 | 857 | } |
| jojisdogakane | 0:2f6112d75752 | 858 | else if(deg <= -123.75 && deg >= -146.25) { |
| jojisdogakane | 0:2f6112d75752 | 859 | degPoint = 0.75; |
| jojisdogakane | 0:2f6112d75752 | 860 | } |
| jojisdogakane | 0:2f6112d75752 | 861 | else if(deg <= -146.25 && deg >= -168.75) { |
| jojisdogakane | 0:2f6112d75752 | 862 | degPoint = 0.625; |
| jojisdogakane | 0:2f6112d75752 | 863 | } |
| jojisdogakane | 0:2f6112d75752 | 864 | else { |
| jojisdogakane | 0:2f6112d75752 | 865 | degPoint = 0; |
| jojisdogakane | 0:2f6112d75752 | 866 | } |
| jojisdogakane | 0:2f6112d75752 | 867 | |
| jojisdogakane | 4:a0150e0f285b | 868 | happyRatioNow = degPoint; |
| jojisdogakane | 4:a0150e0f285b | 869 | |
| jojisdogakane | 0:2f6112d75752 | 870 | degRatio = (deg + 180.0) / 360.0; |
| jojisdogakane | 0:2f6112d75752 | 871 | |
| jojisdogakane | 0:2f6112d75752 | 872 | float rcFilter = RCFILTER; |
| jojisdogakane | 0:2f6112d75752 | 873 | float filteredAngle = rcFilter * prevFilteredAngle + (1 - rcFilter) * degPoint; |
| jojisdogakane | 0:2f6112d75752 | 874 | prevFilteredAngle = filteredAngle ; |
| jojisdogakane | 0:2f6112d75752 | 875 | |
| jojisdogakane | 0:2f6112d75752 | 876 | happyRatio = filteredAngle - 0.5; |
| jojisdogakane | 0:2f6112d75752 | 877 | |
| jojisdogakane | 0:2f6112d75752 | 878 | if(happyRatio <= 0){ |
| jojisdogakane | 0:2f6112d75752 | 879 | happyRatio = abs(happyRatio); |
| jojisdogakane | 0:2f6112d75752 | 880 | } |
| jojisdogakane | 0:2f6112d75752 | 881 | else { |
| jojisdogakane | 0:2f6112d75752 | 882 | happyRatio = 0; |
| jojisdogakane | 0:2f6112d75752 | 883 | } |
| jojisdogakane | 0:2f6112d75752 | 884 | |
| jojisdogakane | 0:2f6112d75752 | 885 | // happyRatio = averageStressRatio ;// @@@ |
| jojisdogakane | 0:2f6112d75752 | 886 | |
| jojisdogakane | 0:2f6112d75752 | 887 | nMsgHappyLen = sprintf(msgHappy,"H%0.2f\0", happyRatio); |
| jojisdogakane | 0:2f6112d75752 | 888 | |
| jojisdogakane | 0:2f6112d75752 | 889 | // nMsgLen = sprintf(msg,"H%0.2f\0", happyRatio); |
| jojisdogakane | 0:2f6112d75752 | 890 | // ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), (uint8_t*)msg, nMsgLen); |
| jojisdogakane | 0:2f6112d75752 | 891 | |
| jojisdogakane | 4:a0150e0f285b | 892 | // happyRatio = happyRatio * happyRatio * happyRatio; |
| jojisdogakane | 0:2f6112d75752 | 893 | |
| jojisdogakane | 4:a0150e0f285b | 894 | // happyRatio *= 10; |
| jojisdogakane | 0:2f6112d75752 | 895 | |
| jojisdogakane | 0:2f6112d75752 | 896 | x3 = x2; |
| jojisdogakane | 0:2f6112d75752 | 897 | y3 = y2; |
| jojisdogakane | 0:2f6112d75752 | 898 | |
| jojisdogakane | 0:2f6112d75752 | 899 | int HR_range = 0; |
| jojisdogakane | 0:2f6112d75752 | 900 | |
| jojisdogakane | 0:2f6112d75752 | 901 | int HR_tempval = currentBPM; |
| jojisdogakane | 0:2f6112d75752 | 902 | |
| jojisdogakane | 0:2f6112d75752 | 903 | |
| jojisdogakane | 0:2f6112d75752 | 904 | // 心拍の係数を算出する |
| jojisdogakane | 0:2f6112d75752 | 905 | |
| jojisdogakane | 0:2f6112d75752 | 906 | // 最大心拍数以上→最大心拍数に |
| jojisdogakane | 0:2f6112d75752 | 907 | if( HR_MAX < HR_tempval) |
| jojisdogakane | 0:2f6112d75752 | 908 | { |
| jojisdogakane | 0:2f6112d75752 | 909 | HR_tempval = HR_MAX; |
| jojisdogakane | 0:2f6112d75752 | 910 | } |
| jojisdogakane | 0:2f6112d75752 | 911 | |
| jojisdogakane | 0:2f6112d75752 | 912 | // 最少心拍数以下→最少心拍数に |
| jojisdogakane | 0:2f6112d75752 | 913 | if( HR_MIN > HR_tempval) |
| jojisdogakane | 0:2f6112d75752 | 914 | { |
| jojisdogakane | 0:2f6112d75752 | 915 | HR_tempval = HR_MIN; |
| jojisdogakane | 0:2f6112d75752 | 916 | } |
| jojisdogakane | 0:2f6112d75752 | 917 | |
| jojisdogakane | 0:2f6112d75752 | 918 | // 心拍の幅を計算 |
| jojisdogakane | 0:2f6112d75752 | 919 | HR_range = HR_MAX - HR_MIN; |
| jojisdogakane | 0:2f6112d75752 | 920 | |
| jojisdogakane | 0:2f6112d75752 | 921 | // 現在値-最少心拍数 |
| jojisdogakane | 0:2f6112d75752 | 922 | HR_tempval = HR_tempval - HR_MIN; |
| jojisdogakane | 0:2f6112d75752 | 923 | |
| jojisdogakane | 0:2f6112d75752 | 924 | // 心拍の係数を算出。0 ~ 1.0 |
| jojisdogakane | 0:2f6112d75752 | 925 | HR_ratio = (double)HR_tempval / (double)HR_range; |
| jojisdogakane | 0:2f6112d75752 | 926 | |
| jojisdogakane | 0:2f6112d75752 | 927 | if(conRatioNow >= 0.95 /* && averageAngle >= 0.7*/) |
| jojisdogakane | 0:2f6112d75752 | 928 | { |
| jojisdogakane | 0:2f6112d75752 | 929 | bConcentration = true; |
| jojisdogakane | 0:2f6112d75752 | 930 | } |
| jojisdogakane | 0:2f6112d75752 | 931 | else { |
| jojisdogakane | 0:2f6112d75752 | 932 | bConcentration = false; |
| jojisdogakane | 0:2f6112d75752 | 933 | } |
| jojisdogakane | 0:2f6112d75752 | 934 | prevRelaxRatio = relaxRatio; |
| jojisdogakane | 0:2f6112d75752 | 935 | |
| jojisdogakane | 0:2f6112d75752 | 936 | int hval = 1023 * happyRatio; |
| jojisdogakane | 0:2f6112d75752 | 937 | int rval = 1023 * relaxRatio; |
| jojisdogakane | 0:2f6112d75752 | 938 | int cval = 1023 * conRatio; |
| jojisdogakane | 0:2f6112d75752 | 939 | |
| jojisdogakane | 0:2f6112d75752 | 940 | // printf("H%d\n", hval); |
| jojisdogakane | 0:2f6112d75752 | 941 | // printf("R%d\n", rval); |
| jojisdogakane | 0:2f6112d75752 | 942 | // printf("C%d\n", cval); |
| jojisdogakane | 0:2f6112d75752 | 943 | |
| jojisdogakane | 0:2f6112d75752 | 944 | sprintf(msg,"%s%s%s%s\0", msgIBI, msgHappy, msgRelax, msgConcentration); |
| jojisdogakane | 0:2f6112d75752 | 945 | ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), |
| jojisdogakane | 0:2f6112d75752 | 946 | (uint8_t*)msg, nMsgIBILen + nMsgHappyLen + nMsgRelaxLen + nMsgConcentrationLen); |
| jojisdogakane | 0:2f6112d75752 | 947 | // (uint8_t*)msg, nMsgIBILen + 1 + nMsgHappyLen + 1 + nMsgRelaxLen + 1 + nMsgConcentrationLen); |
| jojisdogakane | 0:2f6112d75752 | 948 | |
| jojisdogakane | 0:2f6112d75752 | 949 | // determine color range |
| jojisdogakane | 0:2f6112d75752 | 950 | |
| jojisdogakane | 0:2f6112d75752 | 951 | conRatio = conRatio - 0.5; |
| jojisdogakane | 0:2f6112d75752 | 952 | |
| jojisdogakane | 0:2f6112d75752 | 953 | if(conRatio < 0) { |
| jojisdogakane | 0:2f6112d75752 | 954 | conRatio = 0; |
| jojisdogakane | 0:2f6112d75752 | 955 | } |
| jojisdogakane | 0:2f6112d75752 | 956 | |
| jojisdogakane | 0:2f6112d75752 | 957 | conRatio = conRatio * 2; |
| jojisdogakane | 0:2f6112d75752 | 958 | |
| jojisdogakane | 0:2f6112d75752 | 959 | // happyRatio = happyRatio * 2; |
| jojisdogakane | 0:2f6112d75752 | 960 | // happyRatio = happyRatio * 2; |
| jojisdogakane | 0:2f6112d75752 | 961 | if(happyRatio > 1) { |
| jojisdogakane | 0:2f6112d75752 | 962 | happyRatio = 1; |
| jojisdogakane | 0:2f6112d75752 | 963 | } |
| jojisdogakane | 4:a0150e0f285b | 964 | /* |
| jojisdogakane | 0:2f6112d75752 | 965 | if(BPM >= HR_MIN) { |
| jojisdogakane | 0:2f6112d75752 | 966 | happyRatio /= ((float)(BPM * 2) / 255.0) ; |
| jojisdogakane | 0:2f6112d75752 | 967 | } |
| jojisdogakane | 4:a0150e0f285b | 968 | */ |
| jojisdogakane | 0:2f6112d75752 | 969 | } |
| jojisdogakane | 0:2f6112d75752 | 970 | |
| jojisdogakane | 4:a0150e0f285b | 971 | if(BPM > 0 && bPulseEvent) { |
| jojisdogakane | 4:a0150e0f285b | 972 | int NewMood = getMood(BPM, relaxRatio, happyRatio, conRatio) ; |
| jojisdogakane | 4:a0150e0f285b | 973 | |
| jojisdogakane | 4:a0150e0f285b | 974 | for(i = 0 ; i < NEOPIXEL_COUNT; i++) { |
| jojisdogakane | 4:a0150e0f285b | 975 | TargetColorArrayR[i] = MoodColorR[i][NewMood]; |
| jojisdogakane | 4:a0150e0f285b | 976 | TargetColorArrayG[i] = MoodColorG[i][NewMood]; |
| jojisdogakane | 4:a0150e0f285b | 977 | TargetColorArrayB[i] = MoodColorB[i][NewMood]; |
| jojisdogakane | 0:2f6112d75752 | 978 | } |
| jojisdogakane | 4:a0150e0f285b | 979 | } |
| jojisdogakane | 0:2f6112d75752 | 980 | |
| jojisdogakane | 6:35f536162183 | 981 | for(i = NEOPIXEL_COUNT - 1; i >= 0; i--) { |
| jojisdogakane | 6:35f536162183 | 982 | if(ColorArrayR[i] < TargetColorArrayR[i]) { |
| jojisdogakane | 6:35f536162183 | 983 | ColorArrayR[i]++; |
| jojisdogakane | 6:35f536162183 | 984 | } |
| jojisdogakane | 6:35f536162183 | 985 | else if(ColorArrayR[i] > TargetColorArrayR[i]) { |
| jojisdogakane | 6:35f536162183 | 986 | ColorArrayR[i]--; |
| jojisdogakane | 4:a0150e0f285b | 987 | } |
| jojisdogakane | 6:35f536162183 | 988 | if(ColorArrayG[i] < TargetColorArrayG[i]) { |
| jojisdogakane | 6:35f536162183 | 989 | ColorArrayG[i]++; |
| jojisdogakane | 4:a0150e0f285b | 990 | } |
| jojisdogakane | 6:35f536162183 | 991 | else if(ColorArrayG[i] > TargetColorArrayG[i]) { |
| jojisdogakane | 6:35f536162183 | 992 | ColorArrayG[i]--; |
| jojisdogakane | 6:35f536162183 | 993 | } |
| jojisdogakane | 6:35f536162183 | 994 | if(ColorArrayB[i] < TargetColorArrayB[i]) { |
| jojisdogakane | 6:35f536162183 | 995 | ColorArrayB[i]++; |
| jojisdogakane | 4:a0150e0f285b | 996 | } |
| jojisdogakane | 6:35f536162183 | 997 | else if(ColorArrayB[i] > TargetColorArrayB[i]) { |
| jojisdogakane | 6:35f536162183 | 998 | ColorArrayB[i]--; |
| jojisdogakane | 4:a0150e0f285b | 999 | } |
| jojisdogakane | 6:35f536162183 | 1000 | |
| jojisdogakane | 6:35f536162183 | 1001 | // 輝度調整 |
| jojisdogakane | 6:35f536162183 | 1002 | r = ColorArrayR[i] * DIM_LED; |
| jojisdogakane | 6:35f536162183 | 1003 | g = ColorArrayG[i] * DIM_LED; |
| jojisdogakane | 6:35f536162183 | 1004 | b = ColorArrayB[i] * DIM_LED; |
| jojisdogakane | 6:35f536162183 | 1005 | |
| jojisdogakane | 6:35f536162183 | 1006 | brightnessSum = r + g + b; |
| jojisdogakane | 6:35f536162183 | 1007 | |
| jojisdogakane | 6:35f536162183 | 1008 | // 輝度の合計値が上限を超えた場合は補正する |
| jojisdogakane | 6:35f536162183 | 1009 | if(brightnessSum > BRIGHTNESS_MAX) { |
| jojisdogakane | 6:35f536162183 | 1010 | r = (int)(r * ((float)BRIGHTNESS_MAX / (float)brightnessSum)); |
| jojisdogakane | 6:35f536162183 | 1011 | g = (int)(g * ((float)BRIGHTNESS_MAX / (float)brightnessSum)); |
| jojisdogakane | 6:35f536162183 | 1012 | b = (int)(b * ((float)BRIGHTNESS_MAX / (float)brightnessSum)); |
| jojisdogakane | 0:2f6112d75752 | 1013 | } |
| jojisdogakane | 0:2f6112d75752 | 1014 | |
| jojisdogakane | 4:a0150e0f285b | 1015 | neopixel_set_color( |
| jojisdogakane | 6:35f536162183 | 1016 | pixels[i], |
| jojisdogakane | 4:a0150e0f285b | 1017 | 0, |
| jojisdogakane | 6:35f536162183 | 1018 | short(r), |
| jojisdogakane | 6:35f536162183 | 1019 | short(g), |
| jojisdogakane | 6:35f536162183 | 1020 | short(b)); |
| jojisdogakane | 6:35f536162183 | 1021 | neopixel_show(pixels[i]); |
| jojisdogakane | 0:2f6112d75752 | 1022 | } |
| jojisdogakane | 4:a0150e0f285b | 1023 | //wait_ms(1); |
| jojisdogakane | 6:35f536162183 | 1024 | wait_ms(10); // 500usまで下げてもセンサー共振は起こらないことを確認 |
| jojisdogakane | 0:2f6112d75752 | 1025 | } |
| jojisdogakane | 0:2f6112d75752 | 1026 | } |
