HFAC

Dependencies:   mbed

Committer:
hassan_elahi
Date:
Thu Jul 02 17:55:54 2020 +0000
Revision:
0:6ec9b61d5bb5
HFAC

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hassan_elahi 0:6ec9b61d5bb5 1 #include "Functions.h"
hassan_elahi 0:6ec9b61d5bb5 2
hassan_elahi 0:6ec9b61d5bb5 3
hassan_elahi 0:6ec9b61d5bb5 4 DigitalIn shockButton(p16);
hassan_elahi 0:6ec9b61d5bb5 5 DigitalIn chargeButton(p17);
hassan_elahi 0:6ec9b61d5bb5 6 DigitalIn byPassButton(p32);
hassan_elahi 0:6ec9b61d5bb5 7
hassan_elahi 0:6ec9b61d5bb5 8 //sync IN, ECG R wave In pin
hassan_elahi 0:6ec9b61d5bb5 9 InterruptIn SyncIn(p14);
hassan_elahi 0:6ec9b61d5bb5 10 //InterruptIn byPassButton(p15);
hassan_elahi 0:6ec9b61d5bb5 11
hassan_elahi 0:6ec9b61d5bb5 12 //shock signal to defeb
hassan_elahi 0:6ec9b61d5bb5 13 DigitalOut shock(p26);
hassan_elahi 0:6ec9b61d5bb5 14 //charge signal to defeb
hassan_elahi 0:6ec9b61d5bb5 15 DigitalOut charge(p25);
hassan_elahi 0:6ec9b61d5bb5 16
hassan_elahi 0:6ec9b61d5bb5 17 //charge signal from defeb
hassan_elahi 0:6ec9b61d5bb5 18 DigitalIn chargeLEDCheck(p30);
hassan_elahi 0:6ec9b61d5bb5 19
hassan_elahi 0:6ec9b61d5bb5 20 // Relay to power Amplifier
hassan_elahi 0:6ec9b61d5bb5 21 DigitalOut HFAC_Relay(p5);
hassan_elahi 0:6ec9b61d5bb5 22 //Middle Relay off
hassan_elahi 0:6ec9b61d5bb5 23 DigitalOut M_Relay_B(p6);
hassan_elahi 0:6ec9b61d5bb5 24 //Middle Relay On
hassan_elahi 0:6ec9b61d5bb5 25 DigitalOut M_Relay(p7);
hassan_elahi 0:6ec9b61d5bb5 26 // Resistor Relay : No need any more
hassan_elahi 0:6ec9b61d5bb5 27 DigitalOut R_Relay(p8);
hassan_elahi 0:6ec9b61d5bb5 28
hassan_elahi 0:6ec9b61d5bb5 29 //Sync out to dfeb to deliver the shock
hassan_elahi 0:6ec9b61d5bb5 30 DigitalOut SyncOut(p20);
hassan_elahi 0:6ec9b61d5bb5 31
hassan_elahi 0:6ec9b61d5bb5 32 //HFAC Analog out put
hassan_elahi 0:6ec9b61d5bb5 33 AnalogOut HFAC(p18);
hassan_elahi 0:6ec9b61d5bb5 34
hassan_elahi 0:6ec9b61d5bb5 35 //Test leds
hassan_elahi 0:6ec9b61d5bb5 36 DigitalOut led1(LED1);
hassan_elahi 0:6ec9b61d5bb5 37 DigitalOut led2(LED2);
hassan_elahi 0:6ec9b61d5bb5 38 DigitalOut led3(LED3);
hassan_elahi 0:6ec9b61d5bb5 39 DigitalOut led4(LED4);
hassan_elahi 0:6ec9b61d5bb5 40
hassan_elahi 0:6ec9b61d5bb5 41 //Shock button Leds
hassan_elahi 0:6ec9b61d5bb5 42 DigitalOut shockRedLED(p34);
hassan_elahi 0:6ec9b61d5bb5 43 DigitalOut shockGreenLED(p33);
hassan_elahi 0:6ec9b61d5bb5 44
hassan_elahi 0:6ec9b61d5bb5 45 //Charge button Leds
hassan_elahi 0:6ec9b61d5bb5 46 DigitalOut chargeRedLED(p39);
hassan_elahi 0:6ec9b61d5bb5 47 DigitalOut chargeGreenLED(p38);
hassan_elahi 0:6ec9b61d5bb5 48
hassan_elahi 0:6ec9b61d5bb5 49 // serial link for LCD
hassan_elahi 0:6ec9b61d5bb5 50 Serial LCD(p9, p10);
hassan_elahi 0:6ec9b61d5bb5 51
hassan_elahi 0:6ec9b61d5bb5 52 // serial link for PC
hassan_elahi 0:6ec9b61d5bb5 53 Serial pc(USBTX, USBRX);
hassan_elahi 0:6ec9b61d5bb5 54
hassan_elahi 0:6ec9b61d5bb5 55 uint16_t sample = 0;
hassan_elahi 0:6ec9b61d5bb5 56
hassan_elahi 0:6ec9b61d5bb5 57 char temp;
hassan_elahi 0:6ec9b61d5bb5 58 int HFAC_Duration = 1300;
hassan_elahi 0:6ec9b61d5bb5 59 int HFAC_Amplitude = 100;
hassan_elahi 0:6ec9b61d5bb5 60 int LCD_Counter = 0;
hassan_elahi 0:6ec9b61d5bb5 61 int LCD_Message = 0;
hassan_elahi 0:6ec9b61d5bb5 62 int LCD_Source = 0;
hassan_elahi 0:6ec9b61d5bb5 63
hassan_elahi 0:6ec9b61d5bb5 64 bool byPassOldStatus = false;
hassan_elahi 0:6ec9b61d5bb5 65 bool byPassStatus = false;
hassan_elahi 0:6ec9b61d5bb5 66
hassan_elahi 0:6ec9b61d5bb5 67 //Timer for calculating the time bewteen each R wave signal
hassan_elahi 0:6ec9b61d5bb5 68 Timer heartRateTimer;
hassan_elahi 0:6ec9b61d5bb5 69 //TimeOut Timer for deleviring shock after detecting "HeartRateAvg + 1" R wave signal
hassan_elahi 0:6ec9b61d5bb5 70 Timeout deliverTimeout;
hassan_elahi 0:6ec9b61d5bb5 71
hassan_elahi 0:6ec9b61d5bb5 72 bool heartRateTimerStart = false;
hassan_elahi 0:6ec9b61d5bb5 73 int heartRate = 0;
hassan_elahi 0:6ec9b61d5bb5 74 int heartMeanCounter = 0;
hassan_elahi 0:6ec9b61d5bb5 75 int heartRateTemp = 0;
hassan_elahi 0:6ec9b61d5bb5 76
hassan_elahi 0:6ec9b61d5bb5 77 bool syncActivate = false;
hassan_elahi 0:6ec9b61d5bb5 78 bool syncShock = false;
hassan_elahi 0:6ec9b61d5bb5 79
hassan_elahi 0:6ec9b61d5bb5 80 bool DfebCharged = false;
hassan_elahi 0:6ec9b61d5bb5 81
hassan_elahi 0:6ec9b61d5bb5 82 int main()
hassan_elahi 0:6ec9b61d5bb5 83 {
hassan_elahi 0:6ec9b61d5bb5 84
hassan_elahi 0:6ec9b61d5bb5 85 ////////init//////////////
hassan_elahi 0:6ec9b61d5bb5 86 LCD.baud(115200);
hassan_elahi 0:6ec9b61d5bb5 87 shockButton.mode(PullUp);
hassan_elahi 0:6ec9b61d5bb5 88 chargeButton.mode(PullUp);
hassan_elahi 0:6ec9b61d5bb5 89 byPassButton.mode(PullUp);
hassan_elahi 0:6ec9b61d5bb5 90 chargeLEDCheck.mode(PullDown);
hassan_elahi 0:6ec9b61d5bb5 91
hassan_elahi 0:6ec9b61d5bb5 92 SyncIn.mode(PullDown);
hassan_elahi 0:6ec9b61d5bb5 93
hassan_elahi 0:6ec9b61d5bb5 94 // byPassButton.rise(&checkByPass);
hassan_elahi 0:6ec9b61d5bb5 95 // byPassButton.fall(&checkByPass);
hassan_elahi 0:6ec9b61d5bb5 96
hassan_elahi 0:6ec9b61d5bb5 97 M_Relay = 1;
hassan_elahi 0:6ec9b61d5bb5 98 wait_ms(1);
hassan_elahi 0:6ec9b61d5bb5 99 M_Relay = 0;
hassan_elahi 0:6ec9b61d5bb5 100 HFAC_Relay = 0;
hassan_elahi 0:6ec9b61d5bb5 101 R_Relay = 0;
hassan_elahi 0:6ec9b61d5bb5 102 // Make the HFAC analog to VDD/2
hassan_elahi 0:6ec9b61d5bb5 103 HFAC.write_u16(offset);
hassan_elahi 0:6ec9b61d5bb5 104
hassan_elahi 0:6ec9b61d5bb5 105 led1 = 1;
hassan_elahi 0:6ec9b61d5bb5 106 SyncOut =0;
hassan_elahi 0:6ec9b61d5bb5 107 wait_ms(200);
hassan_elahi 0:6ec9b61d5bb5 108
hassan_elahi 0:6ec9b61d5bb5 109 checkByPass();
hassan_elahi 0:6ec9b61d5bb5 110
hassan_elahi 0:6ec9b61d5bb5 111 SyncIn.rise(&syncInFunc);
hassan_elahi 0:6ec9b61d5bb5 112 SyncIn.fall(&syncInFuncFall);
hassan_elahi 0:6ec9b61d5bb5 113
hassan_elahi 0:6ec9b61d5bb5 114
hassan_elahi 0:6ec9b61d5bb5 115 while(1) {
hassan_elahi 0:6ec9b61d5bb5 116 //Check if the bypass status has changed
hassan_elahi 0:6ec9b61d5bb5 117 if (byPassOldStatus != byPassButton){
hassan_elahi 0:6ec9b61d5bb5 118 wait_ms(200);
hassan_elahi 0:6ec9b61d5bb5 119 checkByPass();
hassan_elahi 0:6ec9b61d5bb5 120 }
hassan_elahi 0:6ec9b61d5bb5 121
hassan_elahi 0:6ec9b61d5bb5 122 byPassOldStatus = byPassButton;
hassan_elahi 0:6ec9b61d5bb5 123
hassan_elahi 0:6ec9b61d5bb5 124 //Check Charge button status
hassan_elahi 0:6ec9b61d5bb5 125 if (!chargeButton){
hassan_elahi 0:6ec9b61d5bb5 126 charge =1;
hassan_elahi 0:6ec9b61d5bb5 127 led3 = 1;
hassan_elahi 0:6ec9b61d5bb5 128 led4 = 0;
hassan_elahi 0:6ec9b61d5bb5 129
hassan_elahi 0:6ec9b61d5bb5 130 //R_Relay = 1;
hassan_elahi 0:6ec9b61d5bb5 131
hassan_elahi 0:6ec9b61d5bb5 132 //M_Relay_B = 1;
hassan_elahi 0:6ec9b61d5bb5 133 //wait_ms(1);
hassan_elahi 0:6ec9b61d5bb5 134 //M_Relay_B = 0;
hassan_elahi 0:6ec9b61d5bb5 135
hassan_elahi 0:6ec9b61d5bb5 136 //HFAC_Relay = 1;
hassan_elahi 0:6ec9b61d5bb5 137 wait_ms(100);
hassan_elahi 0:6ec9b61d5bb5 138 charge=0;
hassan_elahi 0:6ec9b61d5bb5 139 }
hassan_elahi 0:6ec9b61d5bb5 140 if (chargeLEDCheck){
hassan_elahi 0:6ec9b61d5bb5 141 DfebCharged = true;
hassan_elahi 0:6ec9b61d5bb5 142 }
hassan_elahi 0:6ec9b61d5bb5 143 //Check Shock button status
hassan_elahi 0:6ec9b61d5bb5 144 if (!shockButton) {
hassan_elahi 0:6ec9b61d5bb5 145 //pc.printf("shock");
hassan_elahi 0:6ec9b61d5bb5 146 wait_ms(50);
hassan_elahi 0:6ec9b61d5bb5 147 if (!shockButton){
hassan_elahi 0:6ec9b61d5bb5 148 led4 = 1;
hassan_elahi 0:6ec9b61d5bb5 149 led3 = 0;
hassan_elahi 0:6ec9b61d5bb5 150 shock = 1;
hassan_elahi 0:6ec9b61d5bb5 151 wait_ms(300);
hassan_elahi 0:6ec9b61d5bb5 152
hassan_elahi 0:6ec9b61d5bb5 153 M_Relay_B = 1;
hassan_elahi 0:6ec9b61d5bb5 154 wait_ms(1);
hassan_elahi 0:6ec9b61d5bb5 155 M_Relay_B = 0;
hassan_elahi 0:6ec9b61d5bb5 156
hassan_elahi 0:6ec9b61d5bb5 157 HFAC_Relay = 1;
hassan_elahi 0:6ec9b61d5bb5 158 if (syncActivate){
hassan_elahi 0:6ec9b61d5bb5 159 heartRateTimer.stop();
hassan_elahi 0:6ec9b61d5bb5 160 heartRateTimer.reset();
hassan_elahi 0:6ec9b61d5bb5 161 heartRateTimerStart = false;
hassan_elahi 0:6ec9b61d5bb5 162 heartRate = 0;
hassan_elahi 0:6ec9b61d5bb5 163 heartMeanCounter = 0;
hassan_elahi 0:6ec9b61d5bb5 164 heartRateTemp = 0;
hassan_elahi 0:6ec9b61d5bb5 165 syncShock = true;
hassan_elahi 0:6ec9b61d5bb5 166 }
hassan_elahi 0:6ec9b61d5bb5 167 else{
hassan_elahi 0:6ec9b61d5bb5 168 if (byPassStatus)
hassan_elahi 0:6ec9b61d5bb5 169 Delivering (HFAC_Amplitude, HFAC_Duration);
hassan_elahi 0:6ec9b61d5bb5 170 else
hassan_elahi 0:6ec9b61d5bb5 171 Delivering (10, 100);
hassan_elahi 0:6ec9b61d5bb5 172
hassan_elahi 0:6ec9b61d5bb5 173 wait_ms(1000);
hassan_elahi 0:6ec9b61d5bb5 174 }
hassan_elahi 0:6ec9b61d5bb5 175 }
hassan_elahi 0:6ec9b61d5bb5 176 }
hassan_elahi 0:6ec9b61d5bb5 177 //Check if there is a message from LCD
hassan_elahi 0:6ec9b61d5bb5 178 // The LCD message is in format of: 'A' + 2 bytes or 'B' + 2 bytes
hassan_elahi 0:6ec9b61d5bb5 179 // 'C' and 'D' for Activiate or Deactivate the sync mode ( Shock on R wave)
hassan_elahi 0:6ec9b61d5bb5 180 if(LCD.readable()) {
hassan_elahi 0:6ec9b61d5bb5 181
hassan_elahi 0:6ec9b61d5bb5 182 temp = LCD.getc();
hassan_elahi 0:6ec9b61d5bb5 183 led2 = !led2;
hassan_elahi 0:6ec9b61d5bb5 184 if (temp == 0x43)
hassan_elahi 0:6ec9b61d5bb5 185 syncActivate = true;
hassan_elahi 0:6ec9b61d5bb5 186 else if (temp == 0x44)
hassan_elahi 0:6ec9b61d5bb5 187 syncActivate = false;
hassan_elahi 0:6ec9b61d5bb5 188
hassan_elahi 0:6ec9b61d5bb5 189
hassan_elahi 0:6ec9b61d5bb5 190 if ((temp == 0x41 || temp == 0x42)&& !LCD_Counter){
hassan_elahi 0:6ec9b61d5bb5 191 LCD_Source = temp;
hassan_elahi 0:6ec9b61d5bb5 192 LCD_Counter ++;
hassan_elahi 0:6ec9b61d5bb5 193 }
hassan_elahi 0:6ec9b61d5bb5 194 else if (LCD_Counter == 1){
hassan_elahi 0:6ec9b61d5bb5 195 LCD_Counter ++;
hassan_elahi 0:6ec9b61d5bb5 196 LCD_Message = temp;
hassan_elahi 0:6ec9b61d5bb5 197 }
hassan_elahi 0:6ec9b61d5bb5 198 else if (LCD_Counter == 2){
hassan_elahi 0:6ec9b61d5bb5 199 LCD_Counter ++;
hassan_elahi 0:6ec9b61d5bb5 200 LCD_Message = LCD_Message + (temp << 8);
hassan_elahi 0:6ec9b61d5bb5 201 LCD_Counter = 0;
hassan_elahi 0:6ec9b61d5bb5 202 if (LCD_Source == 0x41){
hassan_elahi 0:6ec9b61d5bb5 203 HFAC_Duration = LCD_Message;
hassan_elahi 0:6ec9b61d5bb5 204 pc.printf("HF %d\n", HFAC_Duration);
hassan_elahi 0:6ec9b61d5bb5 205 }
hassan_elahi 0:6ec9b61d5bb5 206 else if (LCD_Source == 0x42){
hassan_elahi 0:6ec9b61d5bb5 207 HFAC_Amplitude = LCD_Message ;
hassan_elahi 0:6ec9b61d5bb5 208 pc.printf("AM %d\n", HFAC_Amplitude);
hassan_elahi 0:6ec9b61d5bb5 209 }
hassan_elahi 0:6ec9b61d5bb5 210 }
hassan_elahi 0:6ec9b61d5bb5 211
hassan_elahi 0:6ec9b61d5bb5 212 }
hassan_elahi 0:6ec9b61d5bb5 213 }
hassan_elahi 0:6ec9b61d5bb5 214
hassan_elahi 0:6ec9b61d5bb5 215 }