IP_HeartBand/main8.cpp

124 lines
3.8 KiB
C++

#include <iostream>
#include <vector>
#include <chrono>
#include <cstdlib> // rand()
#include <ctime> // time()
#include <windows.h>
// === Parameters ===
const int BPM_MIN = 55; // Minimum Normal BPM
const int BPM_MAX = 110; // Maximum Normal BPM
const int BPM_TACHYCARDIA = 40; // Minimum BPM for Tachycardia
const int BPM_BRADYCARDIA = 140; // Maximum BPM for Bradycardia
const int SAMPLE_INTERVAL_MS = 1000; // Sampling every 1s
const int THRESHOLD_CARDIAC_ARREST = 2;
// === Initialize random generator ===// === Simulate heart signal from sensor ===
int generateRandomHeartRate() {
int bpm = rand() % BPM_BRADYCARDIA + 1; // génère un BPM entre 0 et 140
return bpm;
}
// === Simulate buzzer activation ===
void activateBuzzer() {
std::cout << " Buzzer activated (CARDIAC ALERT)!" << std::endl;
}
// === Simulate vibration motor activation ===
void activateVibration() {
std::cout << " Vibration activated (CARDIAC ALERT)!" << std::endl;
}
// === Simulate Bluetooth transmission ===
void sendMessageBluetooth(bool urgence) {
std::cout << " Message Bluetooth send : " << (urgence ? "TRUE (urgence)" : "FALSE (normal)") << std::endl;
}
// send avg bvpm of the last minute
void sendAvgBPM(int avg){
std::cout << " \n [BLUETOOTH MESSAGE] Average BPM over the last minute : " << avg;
std::cout << "\n\n" <<std::endl;
}
// === Main program ===
int main() {
bool pulseDetected = false;
auto lastPulse = std::chrono::steady_clock::now();
std::cout << " \n STARTING OF CARDIAC SIMULATION ...\n";
int i=0;
int lastBPM;
int j = 0;
int time = 0;
int lastTime = 0;
std::vector<int> heartRateHistory;
heartRateHistory.reserve(1728000); //20*24*60*60 secondes de data (20 days)
int avgBPM = 0;
while (true) {
// DHeartrate detection
if (!pulseDetected) {
auto now = std::chrono::steady_clock::now();
auto intervalle = std::chrono::duration_cast<std::chrono::milliseconds>(now - lastPulse).count();
int bpm = generateRandomHeartRate();
time++;
std::cout << " \n -------------- \n Time since device turned ON (in seconds) " << time;
std::cout << " \n BPM measured : " << bpm;
if (bpm < BPM_MIN && bpm > BPM_TACHYCARDIA){
std::cout << " [BRADYCARDIA]" << std::endl;
activateVibration();
i=0;
} else if(bpm < BPM_BRADYCARDIA && bpm > BPM_MAX) {
std::cout << " [TACHYCARDIA]" << std::endl;
activateVibration();
i=0;
}else if(bpm < BPM_MAX && bpm > BPM_MIN){
std::cout << " [NORMAL]" << std::endl;
i=0;
} else if (bpm < BPM_TACHYCARDIA){
if (i=THRESHOLD_CARDIAC_ARREST && lastBPM < BPM_TACHYCARDIA){
i=0;
std::cout << " \n !! Number = 2 [HEART ATTACK]" << std::endl;
activateBuzzer();
activateVibration();
sendMessageBluetooth(true);
}else{
i+=1;
std::cout << " \n !! Low BPM, emergency alert if number gets to 2: "<<i << std::endl;
}
}
std::cout << std::endl;
lastPulse = now;
pulseDetected = true;
heartRateHistory.push_back(bpm);
lastBPM =bpm;
}else {
pulseDetected = false; // Ready to detect new pulse
}
if (time>(lastTime + 60)){
for (j = lastTime; j<time; j++){
avgBPM = avgBPM + heartRateHistory[j];
}
avgBPM = avgBPM/j;
sendAvgBPM(avgBPM);
lastTime = time;
}
Sleep(SAMPLE_INTERVAL_MS); // expects milliseconds
}
return 0;
}