140 lines
4.3 KiB
C++
140 lines
4.3 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(bool activationBuz) {
|
|
if (activationBuz) {
|
|
std::cout << " Buzzer activated (CARDIAC ALERT)!" << std::endl;
|
|
} else {
|
|
std::cout << " Buzzer desactivated" << std::endl;
|
|
}
|
|
}
|
|
|
|
|
|
// === Simulate vibration motor activation ===
|
|
void activateVibration(bool activationVib) {
|
|
if (activationVib) {
|
|
std::cout << " Vibration activated (CARDIAC ALERT)!" << std::endl;
|
|
} else {
|
|
std::cout << " Vibration desactivated" << std::endl;
|
|
}
|
|
}
|
|
|
|
// === Simulate Bluetooth transmission ===
|
|
void sendMessageBluetooth(bool urgence) {
|
|
if (urgence) {
|
|
std::cout << " Message Bluetooth send : TRUE (urgence)" << std::endl;
|
|
} else {
|
|
std::cout << " Message Bluetooth send : 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(true);
|
|
i=0;
|
|
|
|
} else if(bpm < BPM_BRADYCARDIA && bpm > BPM_MAX) {
|
|
std::cout << " [TACHYCARDIA]" << std::endl;
|
|
activateVibration(true);
|
|
i=0;
|
|
|
|
}else if(bpm < BPM_MAX && bpm > BPM_MIN){
|
|
std::cout << " [NORMAL]" << std::endl;
|
|
activateBuzzer(false);
|
|
activateVibration(false);
|
|
sendMessageBluetooth(false);
|
|
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(true);
|
|
activateVibration(true);
|
|
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;
|
|
}
|