Masaya Shimoyamada / Mbed 2 deprecated Inp_Fiber_Logo_FOTA_reduce_msg_bytes

Dependencies:   BLE_API mbed nRF51822

Fork of Inp_Fiber_Logo_FOTA by inupathy

Committer:
jojisdogakane
Date:
Sat Jun 17 08:22:21 2017 +0000
Revision:
6:35f536162183
Parent:
5:b3fe9050a777
Child:
7:4118d5a717bc
Not implemented yet,; ; ?Animation

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jojisdogakane 6:35f536162183 1 // 20170617 ストレス値を"R"(relax)から"S"(stress)に変更し、(1.0 - relaxRatio)を送るよう改変
jojisdogakane 6:35f536162183 2 // 20170617 輝度調整の方法をrgbの合計値を基準にするように調整した。
jojisdogakane 6:35f536162183 3
jojisdogakane 0:2f6112d75752 4 #include "mbed.h"
jojisdogakane 0:2f6112d75752 5 #include "neopixel.h"
jojisdogakane 0:2f6112d75752 6 #include "nrf_soc.h"
jojisdogakane 0:2f6112d75752 7 #include "common.h"
jojisdogakane 0:2f6112d75752 8 #include "ble/BLE.h"
jojisdogakane 0:2f6112d75752 9 #include "ble/services/HeartRateService.h"
jojisdogakane 0:2f6112d75752 10 #include "ble/services/BatteryService.h"
jojisdogakane 0:2f6112d75752 11 #include "ble/services/DeviceInformationService.h"
jojisdogakane 0:2f6112d75752 12 #include "UARTService.h"
ayaando 1:f28bdfaf3005 13 #include "ble_gap.h"
ayaando 2:221df6d014f5 14 #include "ble/services/DFUService.h" // ★OTA用
ayaando 2:221df6d014f5 15
jojisdogakane 0:2f6112d75752 16 #define RAINBOW_RATIO 1
jojisdogakane 0:2f6112d75752 17 #define RCFILTER 0.9
jojisdogakane 0:2f6112d75752 18 #define RCFILTER2 0.9
jojisdogakane 4:a0150e0f285b 19 #define NEOPIXEL_COUNT 6
jojisdogakane 0:2f6112d75752 20 #define MIN_LIGHT 0
jojisdogakane 0:2f6112d75752 21 #define PNNX_FACTOR 0.1 // 0.06
jojisdogakane 4:a0150e0f285b 22 #define MAXARRAY 15 //15 // 心拍平均値計算用の配列サイズ //20
jojisdogakane 4:a0150e0f285b 23 #define MAXHRVARRAY 10 //30 // 脈間ゆらぎ平均値計算用の配列サイズ
jojisdogakane 0:2f6112d75752 24 #define MIN_INTERVAL 200
jojisdogakane 0:2f6112d75752 25 #define INTERVAL 10 // Loopの間隔 通常時推奨1 通信時推奨20
jojisdogakane 0:2f6112d75752 26 #define MAXCOLORARRAY 1 //(MIN_INTERVAL / INTERVAL) // 色平均値計算用の配列サイズ (MIN_INTERVAL / 7)
jojisdogakane 0:2f6112d75752 27 #define MAXCONARRAY 10
jojisdogakane 0:2f6112d75752 28 #define MAXSTRESSARRAY 3
jojisdogakane 6:35f536162183 29
jojisdogakane 6:35f536162183 30 #define BRIGHTNESS_MAX 150 // RGBLED1セットのpwm合計値の上限 ws2812b型のneopixelが6個の場合、150を超えた値にするとセンサーが誤作動する
jojisdogakane 6:35f536162183 31
jojisdogakane 6:35f536162183 32 #define DIM_LED ((float)(BRIGHTNESS_MAX) / (float)(255)) // R, G, Bそれぞれのpwm値がBRIGHTNESS_MAXを超えない様にする制限
jojisdogakane 6:35f536162183 33
jojisdogakane 0:2f6112d75752 34
jojisdogakane 0:2f6112d75752 35 // 心拍数の最低値、最高値
jojisdogakane 0:2f6112d75752 36 // 人間の場合は60~150、標準80
jojisdogakane 0:2f6112d75752 37 // 犬の場合は40~200、標準60
jojisdogakane 0:2f6112d75752 38 #define HR_MIN 40
jojisdogakane 0:2f6112d75752 39 #define HR_MAX 150
jojisdogakane 0:2f6112d75752 40
jojisdogakane 0:2f6112d75752 41 #define RELAX_RATIO_MIN 0.6
jojisdogakane 0:2f6112d75752 42
jojisdogakane 0:2f6112d75752 43 // ラジアンを度に変換する.
jojisdogakane 0:2f6112d75752 44 #define RadianToDegree(radian) ((180 / 3.14159) * (radian))
jojisdogakane 0:2f6112d75752 45
jojisdogakane 0:2f6112d75752 46 // 度をラジアンに変換する.
jojisdogakane 0:2f6112d75752 47 #define DegreeToRadian(degree) ((3.14159 / 180) * (degree))
jojisdogakane 0:2f6112d75752 48
jojisdogakane 0:2f6112d75752 49 // 色の識別値設定(ピンではない)
jojisdogakane 0:2f6112d75752 50 #define RED 0
jojisdogakane 0:2f6112d75752 51 #define BLUE 1
jojisdogakane 0:2f6112d75752 52 #define GREEN 2
jojisdogakane 0:2f6112d75752 53
jojisdogakane 0:2f6112d75752 54 #define SHOW_EXCITE 1
jojisdogakane 0:2f6112d75752 55 #define SHOW_HAPPY 2
jojisdogakane 0:2f6112d75752 56 #define SHOW_CONCENTRATION 4
jojisdogakane 0:2f6112d75752 57
jojisdogakane 0:2f6112d75752 58
jojisdogakane 0:2f6112d75752 59 BLE ble;
ayaando 2:221df6d014f5 60 DFUService *dfuService; // ★OTA用
jojisdogakane 0:2f6112d75752 61
jojisdogakane 0:2f6112d75752 62 AnalogIn HRSigIn(P0_4);
jojisdogakane 0:2f6112d75752 63
jojisdogakane 0:2f6112d75752 64
ayaando 1:f28bdfaf3005 65 //const static char DEVICE_NAME[] = "InupLogo";
ayaando 1:f28bdfaf3005 66 static char DEVICE_NAME[16] = "IND";
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 1:f28bdfaf3005 278 // MACアドレスを取得してBLEのデバイス名に組み込む
ayaando 1:f28bdfaf3005 279 void setBleDeviceName(char *deviceName)
ayaando 1:f28bdfaf3005 280 {
ayaando 1:f28bdfaf3005 281 int i;
ayaando 1:f28bdfaf3005 282
ayaando 1:f28bdfaf3005 283 //BLEProtocol::AddressType_t type; //< The type of the BLE address.
ayaando 1:f28bdfaf3005 284 //BLEProtocol::AddressBytes_t mac_address; //< The BLE address. // typedef uint8_t AddressBytes_t[ADDR_LEN]
ayaando 1:f28bdfaf3005 285
ayaando 1:f28bdfaf3005 286 ble_gap_addr_t mac_address;
ayaando 1:f28bdfaf3005 287
ayaando 1:f28bdfaf3005 288 if(sd_ble_gap_address_get(&mac_address) != NRF_SUCCESS){
ayaando 1:f28bdfaf3005 289 return;
ayaando 1:f28bdfaf3005 290 }
ayaando 1:f28bdfaf3005 291
ayaando 1:f28bdfaf3005 292 // ADDR_LENは6
ayaando 1:f28bdfaf3005 293 for(i=BLE_GAP_ADDR_LEN-1; i>=0; i--){
ayaando 1:f28bdfaf3005 294 sprintf(deviceName, "%s%02x", deviceName, (mac_address.addr)[i]);
ayaando 1:f28bdfaf3005 295 }
ayaando 1:f28bdfaf3005 296 sprintf(deviceName, "%s%s", deviceName, "\0");
ayaando 1:f28bdfaf3005 297
ayaando 1:f28bdfaf3005 298 /*
ayaando 1:f28bdfaf3005 299 if(ble.getAddress(&type, mac_address) == BLE_ERROR_NONE){
ayaando 1:f28bdfaf3005 300 // ADDR_LENは6
ayaando 1:f28bdfaf3005 301 for(i=BLEProtocol::ADDR_LEN-1; i>=0; i--){
ayaando 1:f28bdfaf3005 302 sprintf(deviceName, "%s%02x", deviceName, mac_address[i]);
ayaando 1:f28bdfaf3005 303 }
ayaando 1:f28bdfaf3005 304 sprintf(deviceName, "%s%s", deviceName, "\0");
ayaando 1:f28bdfaf3005 305 }
ayaando 1:f28bdfaf3005 306 */
ayaando 1:f28bdfaf3005 307 }
jojisdogakane 0:2f6112d75752 308
jojisdogakane 0:2f6112d75752 309 int main(void)
jojisdogakane 0:2f6112d75752 310 {
jojisdogakane 0:2f6112d75752 311 char msgIBI[100];
jojisdogakane 0:2f6112d75752 312 int nMsgIBILen = 0;
jojisdogakane 0:2f6112d75752 313 char msgHappy[10];
jojisdogakane 0:2f6112d75752 314 int nMsgHappyLen = 0;
jojisdogakane 0:2f6112d75752 315 char msgConcentration[10];
jojisdogakane 0:2f6112d75752 316 int nMsgConcentrationLen = 0;
jojisdogakane 0:2f6112d75752 317 char msgRelax[10];
jojisdogakane 0:2f6112d75752 318 int nMsgRelaxLen = 0;
jojisdogakane 0:2f6112d75752 319
jojisdogakane 0:2f6112d75752 320 char msg[256];
jojisdogakane 0:2f6112d75752 321 int nMsgLen = 0;
jojisdogakane 0:2f6112d75752 322
jojisdogakane 0:2f6112d75752 323 float Brightness = 1.0;
jojisdogakane 0:2f6112d75752 324 bool brighten = true;
jojisdogakane 0:2f6112d75752 325 float brightenSpeedMs = 1000.0;
jojisdogakane 0:2f6112d75752 326 float colorSpeedMs = 1000.0;
jojisdogakane 0:2f6112d75752 327 float conRatioShow = 0.5;
jojisdogakane 0:2f6112d75752 328
jojisdogakane 0:2f6112d75752 329 int i;
jojisdogakane 0:2f6112d75752 330 unsigned long lightPrevMillis = 0;
jojisdogakane 0:2f6112d75752 331
jojisdogakane 0:2f6112d75752 332 int currentBPM;
jojisdogakane 0:2f6112d75752 333
jojisdogakane 0:2f6112d75752 334 float fBeatIndex = 0.0;
jojisdogakane 0:2f6112d75752 335
jojisdogakane 0:2f6112d75752 336 static uint8_t rrIntervalH = 0;
jojisdogakane 0:2f6112d75752 337 static uint8_t rrIntervalL = 1;
jojisdogakane 6:35f536162183 338
jojisdogakane 6:35f536162183 339 int r = 0;
jojisdogakane 6:35f536162183 340 int g = 0;
jojisdogakane 6:35f536162183 341 int b = 0;
jojisdogakane 6:35f536162183 342 int brightnessSum = 0;
jojisdogakane 6:35f536162183 343 int brightnessMax = 0;
jojisdogakane 0:2f6112d75752 344
jojisdogakane 0:2f6112d75752 345 neopixel_strip_t neopixel1;
jojisdogakane 0:2f6112d75752 346 neopixel_init(&neopixel1, P0_7, 1);
jojisdogakane 0:2f6112d75752 347 neopixel_clear(&neopixel1);
jojisdogakane 0:2f6112d75752 348
jojisdogakane 0:2f6112d75752 349 neopixel_strip_t neopixel2;
jojisdogakane 0:2f6112d75752 350 neopixel_init(&neopixel2, P0_8, 1);
jojisdogakane 0:2f6112d75752 351 neopixel_clear(&neopixel2);
jojisdogakane 0:2f6112d75752 352
jojisdogakane 0:2f6112d75752 353 neopixel_strip_t neopixel3;
jojisdogakane 0:2f6112d75752 354 neopixel_init(&neopixel3, P0_10, 1);
jojisdogakane 0:2f6112d75752 355 neopixel_clear(&neopixel3);
jojisdogakane 0:2f6112d75752 356
jojisdogakane 0:2f6112d75752 357 neopixel_strip_t neopixel4;
jojisdogakane 0:2f6112d75752 358 neopixel_init(&neopixel4, P0_9, 1);
jojisdogakane 0:2f6112d75752 359 neopixel_clear(&neopixel4);
jojisdogakane 0:2f6112d75752 360
jojisdogakane 0:2f6112d75752 361 neopixel_strip_t neopixel5;
jojisdogakane 0:2f6112d75752 362 neopixel_init(&neopixel5, P0_15, 1);
jojisdogakane 0:2f6112d75752 363 neopixel_clear(&neopixel5);
jojisdogakane 0:2f6112d75752 364
jojisdogakane 0:2f6112d75752 365 neopixel_strip_t neopixel6;
jojisdogakane 0:2f6112d75752 366 neopixel_init(&neopixel6, P0_11, 1);
jojisdogakane 0:2f6112d75752 367 neopixel_clear(&neopixel6);
jojisdogakane 0:2f6112d75752 368
jojisdogakane 0:2f6112d75752 369 neopixel_strip_t *pixels[6];
jojisdogakane 0:2f6112d75752 370
jojisdogakane 0:2f6112d75752 371 pixels[0] = &neopixel1;
jojisdogakane 0:2f6112d75752 372 pixels[1] = &neopixel2;
jojisdogakane 0:2f6112d75752 373 pixels[2] = &neopixel3;
jojisdogakane 0:2f6112d75752 374 pixels[3] = &neopixel4;
jojisdogakane 0:2f6112d75752 375 pixels[4] = &neopixel5;
jojisdogakane 0:2f6112d75752 376 pixels[5] = &neopixel6;
jojisdogakane 0:2f6112d75752 377
jojisdogakane 4:a0150e0f285b 378
jojisdogakane 6:35f536162183 379
jojisdogakane 4:a0150e0f285b 380 SetMoodColor();
jojisdogakane 4:a0150e0f285b 381
jojisdogakane 0:2f6112d75752 382 ble.init();
jojisdogakane 0:2f6112d75752 383 ble.gap().onDisconnection(disconnectionCallback);
jojisdogakane 0:2f6112d75752 384
jojisdogakane 4:a0150e0f285b 385
jojisdogakane 0:2f6112d75752 386 UARTService uartService(ble);
jojisdogakane 0:2f6112d75752 387 uartServicePtr = &uartService;
jojisdogakane 0:2f6112d75752 388
ayaando 2:221df6d014f5 389 // ★OTA用
ayaando 2:221df6d014f5 390 dfuService = new DFUService(ble, NULL);
jojisdogakane 4:a0150e0f285b 391
jojisdogakane 0:2f6112d75752 392 /* Setup primary service. */
jojisdogakane 0:2f6112d75752 393 HeartRateService hrServiceBPM(ble, BPM, HeartRateService::LOCATION_CHEST);
jojisdogakane 0:2f6112d75752 394 // HeartRateService hrServiceIBI(ble, IBI, HeartRateService::LOCATION_FINGER);
jojisdogakane 0:2f6112d75752 395
jojisdogakane 0:2f6112d75752 396 // BatteryService batteryService(ble, 100);
jojisdogakane 0:2f6112d75752 397
jojisdogakane 0:2f6112d75752 398 /* Setup auxiliary service. */
ayaando 2:221df6d014f5 399 //DeviceInformationService deviceInfo(ble, "ARM", "Model1", "SN1", "hw-rev1", "fw-rev1", "soft-rev1");
ayaando 2:221df6d014f5 400 // ★
ayaando 2:221df6d014f5 401 DeviceInformationService deviceInfo(ble, "INUPATHY01", "0.0.1", "SN1", "0.0.1", "0.0.1", "0.0.1");
jojisdogakane 0:2f6112d75752 402
ayaando 1:f28bdfaf3005 403 // MACアドレスをDEVICE_NAMEに組み込む
ayaando 1:f28bdfaf3005 404 setBleDeviceName(DEVICE_NAME);
ayaando 1:f28bdfaf3005 405
jojisdogakane 0:2f6112d75752 406 /* Setup advertising. */
jojisdogakane 0:2f6112d75752 407 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
jojisdogakane 0:2f6112d75752 408 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
jojisdogakane 0:2f6112d75752 409 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::GENERIC_HEART_RATE_SENSOR);
jojisdogakane 0:2f6112d75752 410 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
jojisdogakane 0:2f6112d75752 411 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
jojisdogakane 0:2f6112d75752 412 ble.gap().setAdvertisingInterval(800); /* 1000ms */
jojisdogakane 0:2f6112d75752 413 ble.gap().startAdvertising();
jojisdogakane 0:2f6112d75752 414
jojisdogakane 4:a0150e0f285b 415 for( i = 0; i < NEOPIXEL_COUNT; i++)
jojisdogakane 6:35f536162183 416 {
jojisdogakane 6:35f536162183 417 // 起動時の色パターンを設定
jojisdogakane 6:35f536162183 418 ColorArrayR[i] = RainbowR[i];
jojisdogakane 6:35f536162183 419 ColorArrayG[i] = RainbowG[i];
jojisdogakane 6:35f536162183 420 ColorArrayB[i] = RainbowB[i];
jojisdogakane 6:35f536162183 421
jojisdogakane 4:a0150e0f285b 422 TargetColorArrayR[i] = ColorArrayR[i];
jojisdogakane 4:a0150e0f285b 423 TargetColorArrayG[i] = ColorArrayG[i];
jojisdogakane 4:a0150e0f285b 424 TargetColorArrayB[i] = ColorArrayB[i];
jojisdogakane 6:35f536162183 425
jojisdogakane 6:35f536162183 426 // 輝度調整
jojisdogakane 6:35f536162183 427 r = ColorArrayR[i] * DIM_LED;
jojisdogakane 6:35f536162183 428 g = ColorArrayG[i] * DIM_LED;
jojisdogakane 6:35f536162183 429 b = ColorArrayB[i] * DIM_LED;
jojisdogakane 6:35f536162183 430
jojisdogakane 6:35f536162183 431 brightnessSum = r + g + b;
jojisdogakane 6:35f536162183 432
jojisdogakane 6:35f536162183 433 // 輝度の合計値が上限を超えた場合は補正する
jojisdogakane 6:35f536162183 434 if(brightnessSum > BRIGHTNESS_MAX) {
jojisdogakane 6:35f536162183 435 r = (int)(r * ((float)BRIGHTNESS_MAX / (float)brightnessSum));
jojisdogakane 6:35f536162183 436 g = (int)(g * ((float)BRIGHTNESS_MAX / (float)brightnessSum));
jojisdogakane 6:35f536162183 437 b = (int)(b * ((float)BRIGHTNESS_MAX / (float)brightnessSum));
jojisdogakane 6:35f536162183 438 }
jojisdogakane 6:35f536162183 439
jojisdogakane 0:2f6112d75752 440 neopixel_set_color(
jojisdogakane 0:2f6112d75752 441 pixels[i],
jojisdogakane 0:2f6112d75752 442 0,
jojisdogakane 6:35f536162183 443 short(r),
jojisdogakane 6:35f536162183 444 short(g),
jojisdogakane 6:35f536162183 445 short(b));
jojisdogakane 0:2f6112d75752 446 neopixel_show(pixels[i]);
jojisdogakane 0:2f6112d75752 447 }
jojisdogakane 4:a0150e0f285b 448
jojisdogakane 0:2f6112d75752 449 t.start();
jojisdogakane 0:2f6112d75752 450
jojisdogakane 0:2f6112d75752 451 prevmillis = t.read_ms();
jojisdogakane 0:2f6112d75752 452
jojisdogakane 0:2f6112d75752 453 bool bPulseEvent = false;
jojisdogakane 0:2f6112d75752 454
jojisdogakane 0:2f6112d75752 455 float degPoint = 0;
jojisdogakane 0:2f6112d75752 456 float degRatio = 0;
jojisdogakane 0:2f6112d75752 457
jojisdogakane 0:2f6112d75752 458 bool bSwingR = false;
jojisdogakane 0:2f6112d75752 459
jojisdogakane 0:2f6112d75752 460 float swingIndex = 0.0;
jojisdogakane 0:2f6112d75752 461
jojisdogakane 0:2f6112d75752 462 float midPoint = 0.5;
jojisdogakane 0:2f6112d75752 463
jojisdogakane 0:2f6112d75752 464 // neopixelTick.attach(neopixelTick_Handler, 0.005);
jojisdogakane 0:2f6112d75752 465
jojisdogakane 0:2f6112d75752 466 while (1) {
jojisdogakane 0:2f6112d75752 467
jojisdogakane 0:2f6112d75752 468 // batteryService.updateBatteryLevel( (uint8_t)read_battery_level());
jojisdogakane 0:2f6112d75752 469
jojisdogakane 0:2f6112d75752 470 float currentValue = HRSigIn;
jojisdogakane 0:2f6112d75752 471
jojisdogakane 0:2f6112d75752 472 bPulseEvent = false;
jojisdogakane 0:2f6112d75752 473
jojisdogakane 4:a0150e0f285b 474 if ((currentValue <= 0.3) && (sensorValue > 0.3))
jojisdogakane 0:2f6112d75752 475 {
jojisdogakane 0:2f6112d75752 476 bPulseEvent = true;
jojisdogakane 0:2f6112d75752 477 }
jojisdogakane 0:2f6112d75752 478
jojisdogakane 0:2f6112d75752 479 int sens = 1023 * currentValue;
jojisdogakane 0:2f6112d75752 480
jojisdogakane 0:2f6112d75752 481 // printf("S%d", sens);
jojisdogakane 0:2f6112d75752 482 // printf("S%d\n", sens);
jojisdogakane 0:2f6112d75752 483
jojisdogakane 0:2f6112d75752 484 sensorValue = currentValue;
jojisdogakane 0:2f6112d75752 485
jojisdogakane 0:2f6112d75752 486 if(bPulseEvent) {
jojisdogakane 0:2f6112d75752 487 fBeatIndex = 0.0;
jojisdogakane 0:2f6112d75752 488 // batteryService.updateBatteryLevel( (uint8_t)read_battery_level());
jojisdogakane 0:2f6112d75752 489
jojisdogakane 0:2f6112d75752 490 // 現在の時刻を取得
jojisdogakane 0:2f6112d75752 491 // t.stop(); // stop, startは時間計測の結果を有意に短くしてしまうので使わない
jojisdogakane 0:2f6112d75752 492 currentmillis = t.read_ms();
jojisdogakane 0:2f6112d75752 493 // t.start();
jojisdogakane 0:2f6112d75752 494 // 現在時刻から過去時刻を引き、間隔を求める
jojisdogakane 0:2f6112d75752 495 intervalmillis = currentmillis - prevmillis;
jojisdogakane 0:2f6112d75752 496
jojisdogakane 0:2f6112d75752 497 // 心拍の間の間隔
jojisdogakane 0:2f6112d75752 498 IBI = intervalmillis;
jojisdogakane 0:2f6112d75752 499
jojisdogakane 0:2f6112d75752 500 // 現在の時刻を過去時刻として記録
jojisdogakane 0:2f6112d75752 501 prevmillis = currentmillis;
jojisdogakane 0:2f6112d75752 502
jojisdogakane 0:2f6112d75752 503 // 平均値算出用配列に値を詰める
jojisdogakane 0:2f6112d75752 504 double averageIntervalMillis;
jojisdogakane 0:2f6112d75752 505
jojisdogakane 0:2f6112d75752 506 for(i = 0; i < MAXARRAY ; i++)
jojisdogakane 0:2f6112d75752 507 {
jojisdogakane 0:2f6112d75752 508 // 最後尾以外の場合
jojisdogakane 0:2f6112d75752 509 if(i != MAXARRAY - 1)
jojisdogakane 0:2f6112d75752 510 {
jojisdogakane 0:2f6112d75752 511 // 次の要素の値をコピーする
jojisdogakane 0:2f6112d75752 512 intervalmillisArray[i] = intervalmillisArray[i + 1];
jojisdogakane 0:2f6112d75752 513 }
jojisdogakane 0:2f6112d75752 514 // 最後尾の場合
jojisdogakane 0:2f6112d75752 515 else {
jojisdogakane 0:2f6112d75752 516 // 最新値を詰める
jojisdogakane 0:2f6112d75752 517 intervalmillisArray[i] = intervalmillis;
jojisdogakane 0:2f6112d75752 518 }
jojisdogakane 0:2f6112d75752 519 }
jojisdogakane 0:2f6112d75752 520 // 先頭が0の間は何もしない
jojisdogakane 0:2f6112d75752 521 unsigned long sumIntervalMillis = 0;
jojisdogakane 0:2f6112d75752 522 unsigned long sumIntervalMillisV = 0;
jojisdogakane 0:2f6112d75752 523 if (intervalmillisArray[0] != 0)
jojisdogakane 0:2f6112d75752 524 {
jojisdogakane 0:2f6112d75752 525 // 平均値算出
jojisdogakane 0:2f6112d75752 526 averageIntervalMillis = 0;
jojisdogakane 0:2f6112d75752 527 for(i = 0; i < MAXARRAY ; i++)
jojisdogakane 0:2f6112d75752 528 {
jojisdogakane 0:2f6112d75752 529 sumIntervalMillis += intervalmillisArray[i];
jojisdogakane 0:2f6112d75752 530 sumIntervalMillisV += intervalmillisArray[i] * intervalmillisArray[i];
jojisdogakane 0:2f6112d75752 531 }
jojisdogakane 0:2f6112d75752 532 double squ;
jojisdogakane 0:2f6112d75752 533 double var;
jojisdogakane 0:2f6112d75752 534 double stdDev;
jojisdogakane 0:2f6112d75752 535
jojisdogakane 0:2f6112d75752 536 averageIntervalMillis = (double)sumIntervalMillis / (double)MAXARRAY;
jojisdogakane 0:2f6112d75752 537
jojisdogakane 0:2f6112d75752 538 squ = sumIntervalMillisV - (double)(sumIntervalMillis * sumIntervalMillis) / (double)MAXARRAY;
jojisdogakane 0:2f6112d75752 539 var = squ / (double)(MAXARRAY - 1);
jojisdogakane 0:2f6112d75752 540 stdDev = sqrt(var);
jojisdogakane 0:2f6112d75752 541
jojisdogakane 0:2f6112d75752 542 BPM = min32_of(60000 / averageIntervalMillis, 255);
jojisdogakane 0:2f6112d75752 543 // if(intervalmillis < averageIntervalMillis - stdDev) { // || intervalmillis > averageIntervalMillis + stdDev) {
jojisdogakane 0:2f6112d75752 544
jojisdogakane 0:2f6112d75752 545 currentBPM = min32_of(60000 / intervalmillis, 255);
jojisdogakane 0:2f6112d75752 546 /* }
jojisdogakane 0:2f6112d75752 547 else {
jojisdogakane 0:2f6112d75752 548 currentBPM = BPM;
jojisdogakane 0:2f6112d75752 549 } */
jojisdogakane 0:2f6112d75752 550 }
jojisdogakane 0:2f6112d75752 551 /*
jojisdogakane 0:2f6112d75752 552 int IBI1024 = IBI * (1024/1000);
jojisdogakane 0:2f6112d75752 553
jojisdogakane 0:2f6112d75752 554 bpm[1] = BPM;
jojisdogakane 0:2f6112d75752 555 bpm[6] = (IBI1024 & 0xFF00) >> 8;
jojisdogakane 0:2f6112d75752 556 bpm[7] = (IBI1024 & 0xFF);
jojisdogakane 0:2f6112d75752 557 */
jojisdogakane 0:2f6112d75752 558 // update bpm
jojisdogakane 0:2f6112d75752 559 if(ble.gap().getState().connected == 1)
jojisdogakane 0:2f6112d75752 560 {
jojisdogakane 0:2f6112d75752 561 hrServiceBPM.updateHeartRate(BPM);
jojisdogakane 0:2f6112d75752 562 // hrServiceIBI.updateHeartRate(IBI);
jojisdogakane 0:2f6112d75752 563 }
jojisdogakane 0:2f6112d75752 564
jojisdogakane 0:2f6112d75752 565 // printf("B%d\n", BPM);
jojisdogakane 0:2f6112d75752 566 // printf("Q%d\n", IBI);
jojisdogakane 0:2f6112d75752 567
jojisdogakane 0:2f6112d75752 568 // nMsgLen = sprintf(msg,"B%d\0", BPM);
jojisdogakane 0:2f6112d75752 569 // ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), (uint8_t*)msg, nMsgLen);
jojisdogakane 0:2f6112d75752 570
jojisdogakane 0:2f6112d75752 571 nMsgIBILen = sprintf(msgIBI,"Q%d\0", IBI);
jojisdogakane 0:2f6112d75752 572 // ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), (uint8_t*)msg, nMsgLen);
jojisdogakane 0:2f6112d75752 573
jojisdogakane 0:2f6112d75752 574 // 平均値算出用配列に値を詰める
jojisdogakane 0:2f6112d75752 575 for(i = 0; i < MAXHRVARRAY ; i++)
jojisdogakane 0:2f6112d75752 576 {
jojisdogakane 0:2f6112d75752 577 // 最後尾以外の場合
jojisdogakane 0:2f6112d75752 578 if(i != MAXHRVARRAY - 1)
jojisdogakane 0:2f6112d75752 579 {
jojisdogakane 0:2f6112d75752 580 // 次の要素の値をコピーする
jojisdogakane 0:2f6112d75752 581 intervalmillisHRVArray[i] = intervalmillisHRVArray[i + 1];
jojisdogakane 0:2f6112d75752 582 }
jojisdogakane 0:2f6112d75752 583 // 最後尾の場合
jojisdogakane 0:2f6112d75752 584 else {
jojisdogakane 0:2f6112d75752 585 // 最新値を詰める
jojisdogakane 0:2f6112d75752 586 intervalmillisHRVArray[i] = intervalmillis;
jojisdogakane 0:2f6112d75752 587 }
jojisdogakane 0:2f6112d75752 588 }
jojisdogakane 0:2f6112d75752 589
jojisdogakane 0:2f6112d75752 590 // 平均値算出
jojisdogakane 0:2f6112d75752 591 int nNNInterval;
jojisdogakane 0:2f6112d75752 592 unsigned long ulIntervalSum = 0;
jojisdogakane 0:2f6112d75752 593 int nSampleCount = 0;
jojisdogakane 0:2f6112d75752 594 for(i = 0; i < MAXHRVARRAY ; i++)
jojisdogakane 0:2f6112d75752 595 {
jojisdogakane 0:2f6112d75752 596 if(intervalmillisHRVArray[i] > 0)
jojisdogakane 0:2f6112d75752 597 {
jojisdogakane 0:2f6112d75752 598 ulIntervalSum += intervalmillisHRVArray[i];
jojisdogakane 0:2f6112d75752 599 nSampleCount++;
jojisdogakane 0:2f6112d75752 600 }
jojisdogakane 0:2f6112d75752 601 }
jojisdogakane 0:2f6112d75752 602
jojisdogakane 0:2f6112d75752 603 float IntervalAverage = 0.0;
jojisdogakane 0:2f6112d75752 604 if(nSampleCount > 0){
jojisdogakane 0:2f6112d75752 605 IntervalAverage = (float)ulIntervalSum / (float)nSampleCount;
jojisdogakane 0:2f6112d75752 606 }
jojisdogakane 0:2f6112d75752 607
jojisdogakane 0:2f6112d75752 608 nNNInterval = (int)((float)IntervalAverage * PNNX_FACTOR);
jojisdogakane 0:2f6112d75752 609
jojisdogakane 0:2f6112d75752 610
jojisdogakane 0:2f6112d75752 611 bool bContinue = false;
jojisdogakane 0:2f6112d75752 612 int nNNxCount = 0;
jojisdogakane 0:2f6112d75752 613 for(i = 0; i < MAXHRVARRAY ; i++)
jojisdogakane 0:2f6112d75752 614 {
jojisdogakane 0:2f6112d75752 615 // if not end
jojisdogakane 0:2f6112d75752 616 if(i < MAXHRVARRAY - 1) {
jojisdogakane 0:2f6112d75752 617 if(abs((int)(intervalmillisHRVArray[i] - intervalmillisHRVArray[i + 1])) >= nNNInterval)
jojisdogakane 0:2f6112d75752 618 {
jojisdogakane 0:2f6112d75752 619 if(bContinue == false)
jojisdogakane 0:2f6112d75752 620 {
jojisdogakane 0:2f6112d75752 621 nNNxCount++;
jojisdogakane 0:2f6112d75752 622 }
jojisdogakane 0:2f6112d75752 623 nNNxCount++;
jojisdogakane 0:2f6112d75752 624 bContinue = true;
jojisdogakane 0:2f6112d75752 625 }
jojisdogakane 0:2f6112d75752 626 else {
jojisdogakane 0:2f6112d75752 627 bContinue = false;
jojisdogakane 0:2f6112d75752 628 }
jojisdogakane 0:2f6112d75752 629 }
jojisdogakane 0:2f6112d75752 630 }
jojisdogakane 0:2f6112d75752 631
jojisdogakane 0:2f6112d75752 632 float diffRatio = (float)nNNxCount / (float)nSampleCount;
jojisdogakane 0:2f6112d75752 633
jojisdogakane 0:2f6112d75752 634 if(diffRatio > 1)
jojisdogakane 0:2f6112d75752 635 {
jojisdogakane 0:2f6112d75752 636 diffRatio = 1;
jojisdogakane 0:2f6112d75752 637 }
jojisdogakane 0:2f6112d75752 638
jojisdogakane 0:2f6112d75752 639 // リラックスの係数を算出する
jojisdogakane 0:2f6112d75752 640 relaxRatio = diffRatio;
jojisdogakane 0:2f6112d75752 641
jojisdogakane 6:35f536162183 642 nMsgRelaxLen = sprintf(msgRelax,"S%0.2f\0", (1-relaxRatio));
jojisdogakane 0:2f6112d75752 643
jojisdogakane 0:2f6112d75752 644 // nMsgLen = sprintf(msg,"R%0.2f\0", relaxRatio);
jojisdogakane 0:2f6112d75752 645 // ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), (uint8_t*)msg, nMsgLen);
jojisdogakane 0:2f6112d75752 646
jojisdogakane 0:2f6112d75752 647 // 現在値から最低値を引く
jojisdogakane 0:2f6112d75752 648 // relaxRatio = relaxRatio - RELAX_RATIO_MIN;
jojisdogakane 0:2f6112d75752 649
jojisdogakane 0:2f6112d75752 650 // 1.0 / 最低値 × 現在値
jojisdogakane 0:2f6112d75752 651 // relaxRatio = relaxRatio * (1.0 / (1.0 - RELAX_RATIO_MIN));
jojisdogakane 0:2f6112d75752 652
jojisdogakane 0:2f6112d75752 653 int x1, y1, x2, y2;
jojisdogakane 0:2f6112d75752 654 int tempx1, tempy1, tempx2, tempy2, tempx3, tempy3;
jojisdogakane 0:2f6112d75752 655 int longx, shortx, longy, shorty;
jojisdogakane 0:2f6112d75752 656 long xx1, xx2, yy1, yy2;
jojisdogakane 0:2f6112d75752 657
jojisdogakane 0:2f6112d75752 658 int movex, movey;
jojisdogakane 0:2f6112d75752 659
jojisdogakane 0:2f6112d75752 660 double dist1, dist2;
jojisdogakane 0:2f6112d75752 661 double conRatioRatio;
jojisdogakane 0:2f6112d75752 662
jojisdogakane 0:2f6112d75752 663 /*
jojisdogakane 0:2f6112d75752 664 // 最後尾の3データから二つのx, y地点を作る。
jojisdogakane 0:2f6112d75752 665 x1 = intervalmillisArray[nSampleCount - 1];
jojisdogakane 0:2f6112d75752 666 y1 = intervalmillisArray[nSampleCount - 2];
jojisdogakane 0:2f6112d75752 667 x2 = intervalmillisArray[nSampleCount - 2];
jojisdogakane 0:2f6112d75752 668 y2 = intervalmillisArray[nSampleCount - 3];
jojisdogakane 0:2f6112d75752 669 */
jojisdogakane 0:2f6112d75752 670
jojisdogakane 0:2f6112d75752 671 x1 = intervalmillis;
jojisdogakane 0:2f6112d75752 672 y1 = prevInterval;
jojisdogakane 0:2f6112d75752 673 x2 = prevInterval;
jojisdogakane 0:2f6112d75752 674 y2 = prevprevInterval;
jojisdogakane 0:2f6112d75752 675
jojisdogakane 0:2f6112d75752 676 // 2地点を結ぶ直線の長さを算出する。
jojisdogakane 0:2f6112d75752 677 if(x1 > x2)
jojisdogakane 0:2f6112d75752 678 {
jojisdogakane 0:2f6112d75752 679 longx = x1;
jojisdogakane 0:2f6112d75752 680 shortx = x2;
jojisdogakane 0:2f6112d75752 681 }
jojisdogakane 0:2f6112d75752 682 else {
jojisdogakane 0:2f6112d75752 683 longx = x2;
jojisdogakane 0:2f6112d75752 684 shortx = x1;
jojisdogakane 0:2f6112d75752 685 }
jojisdogakane 0:2f6112d75752 686
jojisdogakane 0:2f6112d75752 687 if(y1 > y2)
jojisdogakane 0:2f6112d75752 688 {
jojisdogakane 0:2f6112d75752 689 longy = y1;
jojisdogakane 0:2f6112d75752 690 shorty = y2;
jojisdogakane 0:2f6112d75752 691 }
jojisdogakane 0:2f6112d75752 692 else {
jojisdogakane 0:2f6112d75752 693 longy = y2;
jojisdogakane 0:2f6112d75752 694 shorty = y1;
jojisdogakane 0:2f6112d75752 695 }
jojisdogakane 0:2f6112d75752 696
jojisdogakane 0:2f6112d75752 697 xx1 = longx - shortx;
jojisdogakane 0:2f6112d75752 698 yy1 = longy - shorty;
jojisdogakane 0:2f6112d75752 699
jojisdogakane 0:2f6112d75752 700 dist1 = sqrt((double)((xx1 * xx1) + (yy1 * yy1)));
jojisdogakane 0:2f6112d75752 701
jojisdogakane 0:2f6112d75752 702 dist2 = longx + longy;
jojisdogakane 0:2f6112d75752 703 float distRatio = dist1 / dist2;
jojisdogakane 0:2f6112d75752 704
jojisdogakane 0:2f6112d75752 705 conRatioNow = 1 - distRatio;
jojisdogakane 0:2f6112d75752 706
jojisdogakane 0:2f6112d75752 707 // 平均値算出用配列に値を詰める
jojisdogakane 0:2f6112d75752 708 float averageConRatio = 0.5;
jojisdogakane 0:2f6112d75752 709 for(i = 0; i < MAXCONARRAY ; i++)
jojisdogakane 0:2f6112d75752 710 {
jojisdogakane 0:2f6112d75752 711 // 最後尾以外の場合
jojisdogakane 0:2f6112d75752 712 if(i != MAXCONARRAY - 1)
jojisdogakane 0:2f6112d75752 713 {
jojisdogakane 0:2f6112d75752 714 // 次の要素の値をコピーする
jojisdogakane 0:2f6112d75752 715 conArray[i] = conArray[i + 1];
jojisdogakane 0:2f6112d75752 716 }
jojisdogakane 0:2f6112d75752 717 // 最後尾の場合
jojisdogakane 0:2f6112d75752 718 else {
jojisdogakane 0:2f6112d75752 719 // 最新値を詰める
jojisdogakane 0:2f6112d75752 720 conArray[i] = distRatio;
jojisdogakane 0:2f6112d75752 721 }
jojisdogakane 0:2f6112d75752 722 }
jojisdogakane 0:2f6112d75752 723 // 先頭が0の間は何もしない
jojisdogakane 0:2f6112d75752 724 if (conArray[0] != 0)
jojisdogakane 0:2f6112d75752 725 {
jojisdogakane 0:2f6112d75752 726 // 平均値算出
jojisdogakane 0:2f6112d75752 727 averageConRatio = 0;
jojisdogakane 0:2f6112d75752 728 for(i = 0; i < MAXCONARRAY ; i++)
jojisdogakane 0:2f6112d75752 729 {
jojisdogakane 0:2f6112d75752 730 averageConRatio += conArray[i];
jojisdogakane 0:2f6112d75752 731 }
jojisdogakane 0:2f6112d75752 732 averageConRatio = averageConRatio / (double)MAXCONARRAY;
jojisdogakane 0:2f6112d75752 733 }
jojisdogakane 0:2f6112d75752 734 /*
jojisdogakane 0:2f6112d75752 735 float averageStressRatio = 0.5;
jojisdogakane 0:2f6112d75752 736 for(i = 0; i < MAXSTRESSARRAY ; i++)
jojisdogakane 0:2f6112d75752 737 {
jojisdogakane 0:2f6112d75752 738 // 最後尾以外の場合
jojisdogakane 0:2f6112d75752 739 if(i != MAXSTRESSARRAY - 1)
jojisdogakane 0:2f6112d75752 740 {
jojisdogakane 0:2f6112d75752 741 // 次の要素の値をコピーする
jojisdogakane 0:2f6112d75752 742 stressArray[i] = stressArray[i + 1];
jojisdogakane 0:2f6112d75752 743 }
jojisdogakane 0:2f6112d75752 744 // 最後尾の場合
jojisdogakane 0:2f6112d75752 745 else {
jojisdogakane 0:2f6112d75752 746 // 最新値を詰める
jojisdogakane 0:2f6112d75752 747 if(x1 > y1) {
jojisdogakane 0:2f6112d75752 748 stressArray[i] = y1 / x1;
jojisdogakane 0:2f6112d75752 749 }
jojisdogakane 0:2f6112d75752 750 else {
jojisdogakane 0:2f6112d75752 751 stressArray[i] = x1 / y1;
jojisdogakane 0:2f6112d75752 752 }
jojisdogakane 0:2f6112d75752 753 }
jojisdogakane 0:2f6112d75752 754 }
jojisdogakane 0:2f6112d75752 755 // 先頭が0の間は何もしない
jojisdogakane 0:2f6112d75752 756 if (stressArray[0] != 0)
jojisdogakane 0:2f6112d75752 757 {
jojisdogakane 0:2f6112d75752 758 // 平均値算出
jojisdogakane 0:2f6112d75752 759 averageStressRatio = 0;
jojisdogakane 0:2f6112d75752 760 for(i = 0; i < MAXSTRESSARRAY ; i++)
jojisdogakane 0:2f6112d75752 761 {
jojisdogakane 0:2f6112d75752 762 averageStressRatio += stressArray[i];
jojisdogakane 0:2f6112d75752 763 }
jojisdogakane 0:2f6112d75752 764 averageStressRatio = averageStressRatio / (double)MAXSTRESSARRAY;
jojisdogakane 0:2f6112d75752 765 }
jojisdogakane 0:2f6112d75752 766 */
jojisdogakane 0:2f6112d75752 767
jojisdogakane 0:2f6112d75752 768 /* float rcFilter = RCFILTER2;
jojisdogakane 0:2f6112d75752 769 float filteredDistRatio = 0.0;
jojisdogakane 0:2f6112d75752 770 float a;
jojisdogakane 0:2f6112d75752 771 if(prevFilteredDistRatio != 0) {
jojisdogakane 0:2f6112d75752 772 a = rcFilter * prevFilteredDistRatio;
jojisdogakane 0:2f6112d75752 773 filteredDistRatio = a + (1 - rcFilter) * distRatio;
jojisdogakane 0:2f6112d75752 774 }
jojisdogakane 0:2f6112d75752 775 else {
jojisdogakane 0:2f6112d75752 776 filteredDistRatio = (1 - rcFilter) * distRatio;
jojisdogakane 0:2f6112d75752 777 }
jojisdogakane 0:2f6112d75752 778 prevFilteredDistRatio = filteredDistRatio ;
jojisdogakane 0:2f6112d75752 779
jojisdogakane 0:2f6112d75752 780 conRatio = filteredDistRatio ;
jojisdogakane 0:2f6112d75752 781 */
jojisdogakane 0:2f6112d75752 782 conRatio = averageConRatio;
jojisdogakane 0:2f6112d75752 783 conRatio = 1 - conRatio;
jojisdogakane 0:2f6112d75752 784
jojisdogakane 0:2f6112d75752 785 nMsgConcentrationLen = sprintf(msgConcentration,"C%0.2f\0", conRatio);
jojisdogakane 0:2f6112d75752 786
jojisdogakane 0:2f6112d75752 787 // nMsgLen = sprintf(msg,"C%0.2f\0", conRatio);
jojisdogakane 0:2f6112d75752 788 // ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), (uint8_t*)msg, nMsgLen);
jojisdogakane 0:2f6112d75752 789
jojisdogakane 0:2f6112d75752 790
jojisdogakane 0:2f6112d75752 791 prevprevInterval = prevInterval;
jojisdogakane 0:2f6112d75752 792 prevInterval = intervalmillis;
jojisdogakane 0:2f6112d75752 793
jojisdogakane 0:2f6112d75752 794 // (x2, y2)が原点となるように座標を変換する
jojisdogakane 0:2f6112d75752 795 movex = x2 * -1;
jojisdogakane 0:2f6112d75752 796 movey = y2 * -1;
jojisdogakane 0:2f6112d75752 797
jojisdogakane 0:2f6112d75752 798 tempx1 = x1 - movex;
jojisdogakane 0:2f6112d75752 799 tempy1 = y1 - movey;
jojisdogakane 0:2f6112d75752 800 tempx2 = x2 - movex;
jojisdogakane 0:2f6112d75752 801 tempy2 = y2 - movey;
jojisdogakane 0:2f6112d75752 802 tempx3 = x3 - movex;
jojisdogakane 0:2f6112d75752 803 tempy3 = y3 - movey;
jojisdogakane 0:2f6112d75752 804
jojisdogakane 0:2f6112d75752 805 // (x2, y2)を中心とした円を考える。
jojisdogakane 0:2f6112d75752 806
jojisdogakane 0:2f6112d75752 807 // (x3, y3)を(x2, y2)を中心に180°回転する。→(rotx3, roty3)
jojisdogakane 0:2f6112d75752 808 double theta = DegreeToRadian(180);
jojisdogakane 0:2f6112d75752 809
jojisdogakane 0:2f6112d75752 810 double rotx3 = (tempx3) * cos(theta) - (tempy3) * sin(theta);
jojisdogakane 0:2f6112d75752 811 double roty3 = (tempx3) * sin(theta) + (tempy3) * cos(theta);
jojisdogakane 0:2f6112d75752 812
jojisdogakane 0:2f6112d75752 813 // ベクトル1とベクトル3の内積を求める
jojisdogakane 0:2f6112d75752 814 double vecInt = tempx1 * rotx3 + tempy1 * roty3;
jojisdogakane 0:2f6112d75752 815
jojisdogakane 0:2f6112d75752 816 // ベクトル1とベクトル3の外積を求める
jojisdogakane 0:2f6112d75752 817 double vecExt = tempx1 * roty3 - tempy1 * rotx3;
jojisdogakane 0:2f6112d75752 818
jojisdogakane 0:2f6112d75752 819 // ベクトル1とベクトル3の角度を求める
jojisdogakane 0:2f6112d75752 820 theta = atan2(vecExt, vecInt);
jojisdogakane 0:2f6112d75752 821
jojisdogakane 0:2f6112d75752 822 double deg = RadianToDegree(theta);
jojisdogakane 0:2f6112d75752 823
jojisdogakane 0:2f6112d75752 824 midPoint = degRatio;
jojisdogakane 0:2f6112d75752 825
jojisdogakane 0:2f6112d75752 826 if( deg <= 11.25 && deg >= -11.25) {
jojisdogakane 0:2f6112d75752 827 degPoint = 0.5;
jojisdogakane 0:2f6112d75752 828 }
jojisdogakane 0:2f6112d75752 829 else if(deg >= 11.25 && deg <= 33.75) {
jojisdogakane 0:2f6112d75752 830 degPoint = 0.375;
jojisdogakane 0:2f6112d75752 831 }
jojisdogakane 0:2f6112d75752 832 else if(deg >= 33.75 && deg <= 56.25) {
jojisdogakane 0:2f6112d75752 833 degPoint = 0.25;
jojisdogakane 0:2f6112d75752 834 }
jojisdogakane 0:2f6112d75752 835 else if(deg >= 56.25 && deg <= 78.75) {
jojisdogakane 0:2f6112d75752 836 degPoint = 0.125;
jojisdogakane 0:2f6112d75752 837 }
jojisdogakane 0:2f6112d75752 838 else if(deg >= 78.75 && deg <= 101.25) {
jojisdogakane 0:2f6112d75752 839 degPoint = 0;
jojisdogakane 0:2f6112d75752 840 }
jojisdogakane 0:2f6112d75752 841 else if(deg >= 101.25 && deg <= 123.75) {
jojisdogakane 0:2f6112d75752 842 degPoint = 0.125;
jojisdogakane 0:2f6112d75752 843 }
jojisdogakane 0:2f6112d75752 844 else if(deg >= 123.75 && deg <= 146.25) {
jojisdogakane 0:2f6112d75752 845 degPoint = 0.25;
jojisdogakane 0:2f6112d75752 846 }
jojisdogakane 0:2f6112d75752 847 else if(deg >= 146.25 && deg <= 168.75) {
jojisdogakane 0:2f6112d75752 848 degPoint = 0.375;
jojisdogakane 0:2f6112d75752 849 }
jojisdogakane 0:2f6112d75752 850 else if(deg >= 168.75 && deg <= 180 || deg <= 0 && deg >= -11.25) {
jojisdogakane 0:2f6112d75752 851 degPoint = 0.5;
jojisdogakane 0:2f6112d75752 852 }
jojisdogakane 0:2f6112d75752 853 else if(deg <= -11.25 && deg >= -33.75) {
jojisdogakane 0:2f6112d75752 854 degPoint = 0.625;
jojisdogakane 0:2f6112d75752 855 }
jojisdogakane 0:2f6112d75752 856 else if(deg <= -33.75 && deg >= -56.25) {
jojisdogakane 0:2f6112d75752 857 degPoint = 0.75;
jojisdogakane 0:2f6112d75752 858 }
jojisdogakane 0:2f6112d75752 859 else if(deg <= -56.25 && deg >= -78.75) {
jojisdogakane 0:2f6112d75752 860 degPoint = 0.875;
jojisdogakane 0:2f6112d75752 861 }
jojisdogakane 0:2f6112d75752 862 else if(deg <= -78.75 && deg >= -101.25) {
jojisdogakane 0:2f6112d75752 863 degPoint = 1;
jojisdogakane 0:2f6112d75752 864 }
jojisdogakane 0:2f6112d75752 865 else if(deg <= -101.25 && deg >= -123.75) {
jojisdogakane 0:2f6112d75752 866 degPoint = 0.875;
jojisdogakane 0:2f6112d75752 867 }
jojisdogakane 0:2f6112d75752 868 else if(deg <= -123.75 && deg >= -146.25) {
jojisdogakane 0:2f6112d75752 869 degPoint = 0.75;
jojisdogakane 0:2f6112d75752 870 }
jojisdogakane 0:2f6112d75752 871 else if(deg <= -146.25 && deg >= -168.75) {
jojisdogakane 0:2f6112d75752 872 degPoint = 0.625;
jojisdogakane 0:2f6112d75752 873 }
jojisdogakane 0:2f6112d75752 874 else {
jojisdogakane 0:2f6112d75752 875 degPoint = 0;
jojisdogakane 0:2f6112d75752 876 }
jojisdogakane 0:2f6112d75752 877
jojisdogakane 4:a0150e0f285b 878 happyRatioNow = degPoint;
jojisdogakane 4:a0150e0f285b 879
jojisdogakane 0:2f6112d75752 880 degRatio = (deg + 180.0) / 360.0;
jojisdogakane 0:2f6112d75752 881
jojisdogakane 0:2f6112d75752 882 float rcFilter = RCFILTER;
jojisdogakane 0:2f6112d75752 883 float filteredAngle = rcFilter * prevFilteredAngle + (1 - rcFilter) * degPoint;
jojisdogakane 0:2f6112d75752 884 prevFilteredAngle = filteredAngle ;
jojisdogakane 0:2f6112d75752 885
jojisdogakane 0:2f6112d75752 886 happyRatio = filteredAngle - 0.5;
jojisdogakane 0:2f6112d75752 887
jojisdogakane 0:2f6112d75752 888 if(happyRatio <= 0){
jojisdogakane 0:2f6112d75752 889 happyRatio = abs(happyRatio);
jojisdogakane 0:2f6112d75752 890 }
jojisdogakane 0:2f6112d75752 891 else {
jojisdogakane 0:2f6112d75752 892 happyRatio = 0;
jojisdogakane 0:2f6112d75752 893 }
jojisdogakane 0:2f6112d75752 894
jojisdogakane 0:2f6112d75752 895 // happyRatio = averageStressRatio ;// @@@
jojisdogakane 0:2f6112d75752 896
jojisdogakane 0:2f6112d75752 897 nMsgHappyLen = sprintf(msgHappy,"H%0.2f\0", happyRatio);
jojisdogakane 0:2f6112d75752 898
jojisdogakane 0:2f6112d75752 899 // nMsgLen = sprintf(msg,"H%0.2f\0", happyRatio);
jojisdogakane 0:2f6112d75752 900 // ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), (uint8_t*)msg, nMsgLen);
jojisdogakane 0:2f6112d75752 901
jojisdogakane 4:a0150e0f285b 902 // happyRatio = happyRatio * happyRatio * happyRatio;
jojisdogakane 0:2f6112d75752 903
jojisdogakane 4:a0150e0f285b 904 // happyRatio *= 10;
jojisdogakane 0:2f6112d75752 905
jojisdogakane 0:2f6112d75752 906 x3 = x2;
jojisdogakane 0:2f6112d75752 907 y3 = y2;
jojisdogakane 0:2f6112d75752 908
jojisdogakane 0:2f6112d75752 909 int HR_range = 0;
jojisdogakane 0:2f6112d75752 910
jojisdogakane 0:2f6112d75752 911 int HR_tempval = currentBPM;
jojisdogakane 0:2f6112d75752 912
jojisdogakane 0:2f6112d75752 913
jojisdogakane 0:2f6112d75752 914 // 心拍の係数を算出する
jojisdogakane 0:2f6112d75752 915
jojisdogakane 0:2f6112d75752 916 // 最大心拍数以上→最大心拍数に
jojisdogakane 0:2f6112d75752 917 if( HR_MAX < HR_tempval)
jojisdogakane 0:2f6112d75752 918 {
jojisdogakane 0:2f6112d75752 919 HR_tempval = HR_MAX;
jojisdogakane 0:2f6112d75752 920 }
jojisdogakane 0:2f6112d75752 921
jojisdogakane 0:2f6112d75752 922 // 最少心拍数以下→最少心拍数に
jojisdogakane 0:2f6112d75752 923 if( HR_MIN > HR_tempval)
jojisdogakane 0:2f6112d75752 924 {
jojisdogakane 0:2f6112d75752 925 HR_tempval = HR_MIN;
jojisdogakane 0:2f6112d75752 926 }
jojisdogakane 0:2f6112d75752 927
jojisdogakane 0:2f6112d75752 928 // 心拍の幅を計算
jojisdogakane 0:2f6112d75752 929 HR_range = HR_MAX - HR_MIN;
jojisdogakane 0:2f6112d75752 930
jojisdogakane 0:2f6112d75752 931 // 現在値-最少心拍数
jojisdogakane 0:2f6112d75752 932 HR_tempval = HR_tempval - HR_MIN;
jojisdogakane 0:2f6112d75752 933
jojisdogakane 0:2f6112d75752 934 // 心拍の係数を算出。0 ~ 1.0
jojisdogakane 0:2f6112d75752 935 HR_ratio = (double)HR_tempval / (double)HR_range;
jojisdogakane 0:2f6112d75752 936
jojisdogakane 0:2f6112d75752 937 if(conRatioNow >= 0.95 /* && averageAngle >= 0.7*/)
jojisdogakane 0:2f6112d75752 938 {
jojisdogakane 0:2f6112d75752 939 bConcentration = true;
jojisdogakane 0:2f6112d75752 940 }
jojisdogakane 0:2f6112d75752 941 else {
jojisdogakane 0:2f6112d75752 942 bConcentration = false;
jojisdogakane 0:2f6112d75752 943 }
jojisdogakane 0:2f6112d75752 944 prevRelaxRatio = relaxRatio;
jojisdogakane 0:2f6112d75752 945
jojisdogakane 0:2f6112d75752 946 int hval = 1023 * happyRatio;
jojisdogakane 0:2f6112d75752 947 int rval = 1023 * relaxRatio;
jojisdogakane 0:2f6112d75752 948 int cval = 1023 * conRatio;
jojisdogakane 0:2f6112d75752 949
jojisdogakane 0:2f6112d75752 950 // printf("H%d\n", hval);
jojisdogakane 0:2f6112d75752 951 // printf("R%d\n", rval);
jojisdogakane 0:2f6112d75752 952 // printf("C%d\n", cval);
jojisdogakane 0:2f6112d75752 953
jojisdogakane 0:2f6112d75752 954 sprintf(msg,"%s%s%s%s\0", msgIBI, msgHappy, msgRelax, msgConcentration);
jojisdogakane 0:2f6112d75752 955 ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(),
jojisdogakane 0:2f6112d75752 956 (uint8_t*)msg, nMsgIBILen + nMsgHappyLen + nMsgRelaxLen + nMsgConcentrationLen);
jojisdogakane 0:2f6112d75752 957 // (uint8_t*)msg, nMsgIBILen + 1 + nMsgHappyLen + 1 + nMsgRelaxLen + 1 + nMsgConcentrationLen);
jojisdogakane 0:2f6112d75752 958
jojisdogakane 0:2f6112d75752 959 // determine color range
jojisdogakane 0:2f6112d75752 960
jojisdogakane 0:2f6112d75752 961 conRatio = conRatio - 0.5;
jojisdogakane 0:2f6112d75752 962
jojisdogakane 0:2f6112d75752 963 if(conRatio < 0) {
jojisdogakane 0:2f6112d75752 964 conRatio = 0;
jojisdogakane 0:2f6112d75752 965 }
jojisdogakane 0:2f6112d75752 966
jojisdogakane 0:2f6112d75752 967 conRatio = conRatio * 2;
jojisdogakane 0:2f6112d75752 968
jojisdogakane 0:2f6112d75752 969 // happyRatio = happyRatio * 2;
jojisdogakane 0:2f6112d75752 970 // happyRatio = happyRatio * 2;
jojisdogakane 0:2f6112d75752 971 if(happyRatio > 1) {
jojisdogakane 0:2f6112d75752 972 happyRatio = 1;
jojisdogakane 0:2f6112d75752 973 }
jojisdogakane 4:a0150e0f285b 974 /*
jojisdogakane 0:2f6112d75752 975 if(BPM >= HR_MIN) {
jojisdogakane 0:2f6112d75752 976 happyRatio /= ((float)(BPM * 2) / 255.0) ;
jojisdogakane 0:2f6112d75752 977 }
jojisdogakane 4:a0150e0f285b 978 */
jojisdogakane 0:2f6112d75752 979 }
jojisdogakane 0:2f6112d75752 980
jojisdogakane 4:a0150e0f285b 981 if(BPM > 0 && bPulseEvent) {
jojisdogakane 4:a0150e0f285b 982 int NewMood = getMood(BPM, relaxRatio, happyRatio, conRatio) ;
jojisdogakane 4:a0150e0f285b 983
jojisdogakane 4:a0150e0f285b 984 for(i = 0 ; i < NEOPIXEL_COUNT; i++) {
jojisdogakane 4:a0150e0f285b 985 TargetColorArrayR[i] = MoodColorR[i][NewMood];
jojisdogakane 4:a0150e0f285b 986 TargetColorArrayG[i] = MoodColorG[i][NewMood];
jojisdogakane 4:a0150e0f285b 987 TargetColorArrayB[i] = MoodColorB[i][NewMood];
jojisdogakane 0:2f6112d75752 988 }
jojisdogakane 4:a0150e0f285b 989 }
jojisdogakane 0:2f6112d75752 990
jojisdogakane 6:35f536162183 991 for(i = NEOPIXEL_COUNT - 1; i >= 0; i--) {
jojisdogakane 6:35f536162183 992 if(ColorArrayR[i] < TargetColorArrayR[i]) {
jojisdogakane 6:35f536162183 993 ColorArrayR[i]++;
jojisdogakane 6:35f536162183 994 }
jojisdogakane 6:35f536162183 995 else if(ColorArrayR[i] > TargetColorArrayR[i]) {
jojisdogakane 6:35f536162183 996 ColorArrayR[i]--;
jojisdogakane 4:a0150e0f285b 997 }
jojisdogakane 6:35f536162183 998 if(ColorArrayG[i] < TargetColorArrayG[i]) {
jojisdogakane 6:35f536162183 999 ColorArrayG[i]++;
jojisdogakane 4:a0150e0f285b 1000 }
jojisdogakane 6:35f536162183 1001 else if(ColorArrayG[i] > TargetColorArrayG[i]) {
jojisdogakane 6:35f536162183 1002 ColorArrayG[i]--;
jojisdogakane 6:35f536162183 1003 }
jojisdogakane 6:35f536162183 1004 if(ColorArrayB[i] < TargetColorArrayB[i]) {
jojisdogakane 6:35f536162183 1005 ColorArrayB[i]++;
jojisdogakane 4:a0150e0f285b 1006 }
jojisdogakane 6:35f536162183 1007 else if(ColorArrayB[i] > TargetColorArrayB[i]) {
jojisdogakane 6:35f536162183 1008 ColorArrayB[i]--;
jojisdogakane 4:a0150e0f285b 1009 }
jojisdogakane 6:35f536162183 1010
jojisdogakane 6:35f536162183 1011 // 輝度調整
jojisdogakane 6:35f536162183 1012 r = ColorArrayR[i] * DIM_LED;
jojisdogakane 6:35f536162183 1013 g = ColorArrayG[i] * DIM_LED;
jojisdogakane 6:35f536162183 1014 b = ColorArrayB[i] * DIM_LED;
jojisdogakane 6:35f536162183 1015
jojisdogakane 6:35f536162183 1016 brightnessSum = r + g + b;
jojisdogakane 6:35f536162183 1017
jojisdogakane 6:35f536162183 1018 // 輝度の合計値が上限を超えた場合は補正する
jojisdogakane 6:35f536162183 1019 if(brightnessSum > BRIGHTNESS_MAX) {
jojisdogakane 6:35f536162183 1020 r = (int)(r * ((float)BRIGHTNESS_MAX / (float)brightnessSum));
jojisdogakane 6:35f536162183 1021 g = (int)(g * ((float)BRIGHTNESS_MAX / (float)brightnessSum));
jojisdogakane 6:35f536162183 1022 b = (int)(b * ((float)BRIGHTNESS_MAX / (float)brightnessSum));
jojisdogakane 0:2f6112d75752 1023 }
jojisdogakane 0:2f6112d75752 1024
jojisdogakane 4:a0150e0f285b 1025 neopixel_set_color(
jojisdogakane 6:35f536162183 1026 pixels[i],
jojisdogakane 4:a0150e0f285b 1027 0,
jojisdogakane 6:35f536162183 1028 short(r),
jojisdogakane 6:35f536162183 1029 short(g),
jojisdogakane 6:35f536162183 1030 short(b));
jojisdogakane 6:35f536162183 1031 neopixel_show(pixels[i]);
jojisdogakane 0:2f6112d75752 1032 }
jojisdogakane 4:a0150e0f285b 1033 //wait_ms(1);
jojisdogakane 6:35f536162183 1034 wait_ms(10); // 500usまで下げてもセンサー共振は起こらないことを確認
jojisdogakane 0:2f6112d75752 1035 }
jojisdogakane 0:2f6112d75752 1036 }