AudioRecord and FFT/MSE comparison. Call AudioRecord_demo for control record and AudioSample for subsequent recordings.

Dependencies:   CMSIS_DSP_401 STM32L4xx_HAL_Driver

Fork of OneHopeOnePrayer by Senior Design: Sound Monitor

Committer:
EricLew
Date:
Sat Dec 05 16:17:25 2015 +0000
Revision:
5:f6afbd3fc47a
Parent:
4:652cb54276d0
Ported to Nucleo

Who changed what in which revision?

UserRevisionLine numberNew contents of line
EricLew 4:652cb54276d0 1 //EXTERNAL FUNCTIONS/VARIABLES:
EricLew 4:652cb54276d0 2 //AudioRecord_demo
EricLew 4:652cb54276d0 3 //AudioSample
EricLew 4:652cb54276d0 4 //PWRCONTROLMSE
EricLew 4:652cb54276d0 5 //PHSCONTROLMSE
EricLew 4:652cb54276d0 6 //CONTROLPWR0
EricLew 4:652cb54276d0 7 //CONTROLPHASE0
EricLew 4:652cb54276d0 8 //DISPLAYFFT
EricLew 4:652cb54276d0 9
EricLew 0:d4e5ad7ad71c 10 #include "main.h"
EricLew 0:d4e5ad7ad71c 11
EricLew 4:652cb54276d0 12 //GLOBAL VARIABLES
EricLew 3:ec7e3c37fe80 13
EricLew 4:652cb54276d0 14 int EXIT=0; //WHILE LOOP EXIT FLAG
EricLew 4:652cb54276d0 15 float32_t compare[1024]; //BUFFER VARIABLE FOR MSE FUNCTIONS
EricLew 4:652cb54276d0 16 uint32_t counter=0; //COUNTER for lenthg of record
EricLew 4:652cb54276d0 17 uint32_t n; //Generic variable for "for" loops
EricLew 0:d4e5ad7ad71c 18
EricLew 4:652cb54276d0 19 float32_t PWRCONTROLMSE=0; //CONTROL POWER MSE
EricLew 4:652cb54276d0 20 float32_t PHSCONTROLMSE=0; //CONTROL PHASE MSE
EricLew 3:ec7e3c37fe80 21
EricLew 4:652cb54276d0 22 float32_t CONTROLPWR0[1024]; //CONTROL RECRODING 0 MAGNITUDE
EricLew 4:652cb54276d0 23 float32_t CONTROLPHASE0[1024];//CONTROL RECORDING 0 PHASE
EricLew 0:d4e5ad7ad71c 24
EricLew 4:652cb54276d0 25 float32_t DISPLAYFFT[1024];
EricLew 0:d4e5ad7ad71c 26
EricLew 4:652cb54276d0 27
EricLew 4:652cb54276d0 28 const static arm_cfft_instance_f32 *S=&arm_cfft_sR_f32_len2048;
EricLew 0:d4e5ad7ad71c 29
EricLew 0:d4e5ad7ad71c 30 void AudioRecord_demo(void)
EricLew 0:d4e5ad7ad71c 31 {
EricLew 1:1ae4b642c533 32
EricLew 4:652cb54276d0 33 static uint16_t RecordBuffer[2048]; //RECORDING BUFFER FOR Control #0
EricLew 4:652cb54276d0 34 static uint16_t RecordBuffer1[2048];//RECORDING BUFFER FOR Control #1
EricLew 0:d4e5ad7ad71c 35
EricLew 4:652cb54276d0 36 float32_t FloatBuff0[2048]; //Casting Int array to float array
EricLew 4:652cb54276d0 37 float32_t FloatBuff1[2048];
EricLew 4:652cb54276d0 38
EricLew 4:652cb54276d0 39 float32_t CONTROLPWR1[1024]; //CONTROL RECRODING 1 MAGNITUDE
EricLew 4:652cb54276d0 40 float32_t CONTROLPHASE1[1024];//CONTROL RECORDING 1 PHASE
EricLew 4:652cb54276d0 41
EricLew 4:652cb54276d0 42 float32_t CONTROLREAL0[1024]; //CONTROL RECORDING 0 REAL
EricLew 4:652cb54276d0 43 float32_t CONTROLIMAG0[1024]; //CONTROL RECORDING 0 IMAGINARY
EricLew 4:652cb54276d0 44 float32_t CONTROLREAL1[1024]; //CONTROL RECORDING 1 REAL
EricLew 4:652cb54276d0 45 float32_t CONTROLIMAG1[1024]; //CONTROL REOCRDING 1 REAL
EricLew 4:652cb54276d0 46
EricLew 4:652cb54276d0 47 float32_t FloatBuffout0[4096];//CONTROL RECORDING WITH ZEROS ADDED FOR COMPLEX PORTIONS
EricLew 4:652cb54276d0 48 float32_t FloatBuffout1[4096];
EricLew 4:652cb54276d0 49
EricLew 4:652cb54276d0 50
EricLew 1:1ae4b642c533 51 //INITIALIZE RECORDING #0
EricLew 4:652cb54276d0 52
EricLew 4:652cb54276d0 53 /* Initialize audio input */
EricLew 4:652cb54276d0 54 BSP_AUDIO_IN_Init(48000, DEFAULT_AUDIO_IN_BIT_RESOLUTION, DEFAULT_AUDIO_IN_CHANNEL_NBR);
EricLew 0:d4e5ad7ad71c 55
EricLew 0:d4e5ad7ad71c 56 /* Start the audio record */
EricLew 4:652cb54276d0 57
EricLew 4:652cb54276d0 58 BSP_AUDIO_IN_Record(&RecordBuffer[0], 2048);
EricLew 4:652cb54276d0 59
EricLew 0:d4e5ad7ad71c 60 /* PCM samples recording loop */
EricLew 4:652cb54276d0 61 while (EXIT != SET)
EricLew 0:d4e5ad7ad71c 62 {
EricLew 1:1ae4b642c533 63
EricLew 1:1ae4b642c533 64 if (counter==10000000) //Approximately 3 seconds of record time
EricLew 1:1ae4b642c533 65 {
EricLew 4:652cb54276d0 66 EXIT=1;
EricLew 4:652cb54276d0 67 }
EricLew 4:652cb54276d0 68 else
EricLew 4:652cb54276d0 69 {
EricLew 4:652cb54276d0 70 counter=counter++;
EricLew 4:652cb54276d0 71 }
EricLew 4:652cb54276d0 72 }
EricLew 4:652cb54276d0 73 /* Stop audio input */
EricLew 4:652cb54276d0 74 BSP_AUDIO_IN_Stop();
EricLew 4:652cb54276d0 75
EricLew 4:652cb54276d0 76 BSP_AUDIO_IN_Record(&RecordBuffer1[0], 2048);
EricLew 4:652cb54276d0 77 EXIT = 0; //RESET AUDIO RECORD FLAG
EricLew 4:652cb54276d0 78 counter=0; //RESET COUNTER
EricLew 4:652cb54276d0 79 /* PCM samples recording loop */ //COPIED FROM ABOVE USE '1' WHEN REFERENCING VARIABLES
EricLew 4:652cb54276d0 80 while (EXIT != SET)
EricLew 4:652cb54276d0 81 {
EricLew 4:652cb54276d0 82
EricLew 4:652cb54276d0 83 if (counter==10000000) //Approximately 3 seconds of record time
EricLew 4:652cb54276d0 84 {
EricLew 4:652cb54276d0 85 EXIT=1; //FLAG IS REGISTER R5
EricLew 1:1ae4b642c533 86 }
EricLew 1:1ae4b642c533 87 else
EricLew 1:1ae4b642c533 88 {
EricLew 1:1ae4b642c533 89 counter=counter++;
EricLew 1:1ae4b642c533 90 }
EricLew 4:652cb54276d0 91
EricLew 1:1ae4b642c533 92 }
EricLew 4:652cb54276d0 93 /* Stop audio input */
EricLew 4:652cb54276d0 94 BSP_AUDIO_IN_Stop();
EricLew 4:652cb54276d0 95 /* De-initialize audio input */
EricLew 4:652cb54276d0 96 BSP_AUDIO_IN_DeInit();
EricLew 4:652cb54276d0 97
EricLew 4:652cb54276d0 98 //END OF RECORDING #1
EricLew 0:d4e5ad7ad71c 99
EricLew 4:652cb54276d0 100 /* Reset EXIT flag */
EricLew 4:652cb54276d0 101 EXIT = 0;
EricLew 4:652cb54276d0 102
EricLew 4:652cb54276d0 103 //CASTS THE RECORD BUFFER AS A SINGLE FLOAT
EricLew 4:652cb54276d0 104 //RECORDING 0
EricLew 4:652cb54276d0 105 for (n=0; n<2048; n++)
EricLew 4:652cb54276d0 106 {FloatBuff0[n]=(float)RecordBuffer[n];}
EricLew 4:652cb54276d0 107 //RECORDING 1
EricLew 4:652cb54276d0 108 for (n=0; n<2048; n++)
EricLew 4:652cb54276d0 109 {FloatBuff1[n]=(float)RecordBuffer1[n];}
EricLew 4:652cb54276d0 110
EricLew 4:652cb54276d0 111 for(n=0;n<2048;n++)
EricLew 4:652cb54276d0 112 {FloatBuffout0[n*2] = FloatBuff0[n];
EricLew 4:652cb54276d0 113 FloatBuffout0[(n*2)+1] = 0.0;
EricLew 4:652cb54276d0 114 FloatBuffout1[n*2] = FloatBuff1[n];
EricLew 4:652cb54276d0 115 FloatBuffout1[(n*2)+1] = 0.0;}
EricLew 4:652cb54276d0 116
EricLew 4:652cb54276d0 117 //PERFORMS THE FFT
EricLew 4:652cb54276d0 118 //RECORDING 0
EricLew 5:f6afbd3fc47a 119 arm_cfft_f32(S, FloatBuffout0, 0,0); //Output of FFT is half the record buffer size
EricLew 4:652cb54276d0 120 //RECORDING 1
EricLew 5:f6afbd3fc47a 121 arm_cfft_f32(S, FloatBuffout1, 0,0);
EricLew 4:652cb54276d0 122
EricLew 4:652cb54276d0 123 //FloatBuffout0[0]=0;
EricLew 4:652cb54276d0 124 //FloatBuffout1[0]=0;
EricLew 4:652cb54276d0 125 // //RECORDING 0
EricLew 4:652cb54276d0 126 for(n=0;n<2048;n=n+2)
EricLew 4:652cb54276d0 127 {CONTROLREAL0[n]=FloatBuffout0[n];}//Parses Real parts from the buffer
EricLew 4:652cb54276d0 128 for(n=1;n<2048;n=n+2)
EricLew 4:652cb54276d0 129 {CONTROLIMAG0[n]=FloatBuffout0[n];}//Parses Imaginary parts from the buffer
EricLew 4:652cb54276d0 130 //RECORDING 1
EricLew 4:652cb54276d0 131 for(n=0;n<2048;n=n+2)
EricLew 4:652cb54276d0 132 {CONTROLREAL1[n]=FloatBuffout1[n];}//Parses Real parts from the buffer
EricLew 4:652cb54276d0 133 for(n=1;n<2048;n=n+2)
EricLew 4:652cb54276d0 134 {CONTROLIMAG1[n]=FloatBuffout1[n];}//Parses Imaginary parts from the buffer
EricLew 4:652cb54276d0 135
EricLew 4:652cb54276d0 136
EricLew 4:652cb54276d0 137 //CALCULATES PHASE AND MAGITUDE
EricLew 4:652cb54276d0 138 //RECORDING 0
EricLew 4:652cb54276d0 139 for(n=0;n<1024;n++)
EricLew 4:652cb54276d0 140 {CONTROLPHASE0[n]=atan2(CONTROLIMAG0[n],CONTROLREAL0[n]);}//Calculates control phase
EricLew 4:652cb54276d0 141 for(n=0;n<1024;n++)
EricLew 4:652cb54276d0 142 {CONTROLPWR0[n]=sqrt((CONTROLIMAG0[n]*CONTROLIMAG0[n])+(CONTROLREAL0[n]*CONTROLREAL0[n]));} //calculates control power
EricLew 4:652cb54276d0 143 //RECORDING 1
EricLew 4:652cb54276d0 144 for(n=0;n<1024;n++)
EricLew 4:652cb54276d0 145 {CONTROLPHASE1[n]=atan2(CONTROLIMAG1[n],CONTROLREAL1[n]);}//Calculates control phase
EricLew 4:652cb54276d0 146 for(n=0;n<1024;n++)
EricLew 4:652cb54276d0 147 {CONTROLPWR1[n]=sqrt((CONTROLIMAG1[n]*CONTROLIMAG1[n])+(CONTROLREAL1[n]*CONTROLREAL1[n]));} //calculates control power
EricLew 4:652cb54276d0 148
EricLew 4:652cb54276d0 149 //MEAN SQUARED ERROR FOR CONTROL MAGNITUDES
EricLew 4:652cb54276d0 150 for(n=0;n<1024;n++)
EricLew 4:652cb54276d0 151 {compare[n]=CONTROLPWR0[n]-CONTROLPWR1[n];} //Error between FFT magnitudes, stored in compare
EricLew 4:652cb54276d0 152
EricLew 4:652cb54276d0 153 for(n=0;n<1024;n++)
EricLew 4:652cb54276d0 154 {compare[n]=(compare[n]*compare[n]);} //Squares the error, stores back in compare
EricLew 4:652cb54276d0 155
EricLew 4:652cb54276d0 156 for(n=0;n<1024;n++)
EricLew 4:652cb54276d0 157 {PWRCONTROLMSE=PWRCONTROLMSE+compare[n];} //Takes the mean of the error, stores MSE in CONTROLMSE
EricLew 4:652cb54276d0 158 PWRCONTROLMSE=PWRCONTROLMSE/1024.0f;
EricLew 4:652cb54276d0 159 //MEAN SQUARED ERROR FOR CONTROL PHASE
EricLew 4:652cb54276d0 160 for(n=0;n<1024;n++)
EricLew 4:652cb54276d0 161 {compare[n]=CONTROLPHASE0[n]-CONTROLPHASE1[n];} //Error between FFT magnitudes, stored in compare
EricLew 4:652cb54276d0 162
EricLew 4:652cb54276d0 163 for(n=0;n<1024;n++)
EricLew 4:652cb54276d0 164 {compare[n]=(compare[n]*compare[n]);} //Squares the error, stores back in compare
EricLew 4:652cb54276d0 165
EricLew 4:652cb54276d0 166 for(n=0;n<1024;n++)
EricLew 4:652cb54276d0 167 {PHSCONTROLMSE=PHSCONTROLMSE+compare[n];} //Takes the mean of the error, stores MSE in CONTROLMSE
EricLew 4:652cb54276d0 168 PHSCONTROLMSE=PHSCONTROLMSE/1024.0f;
EricLew 4:652cb54276d0 169 }
EricLew 4:652cb54276d0 170
EricLew 4:652cb54276d0 171 void AudioSample(void)
EricLew 4:652cb54276d0 172 {
EricLew 4:652cb54276d0 173 //SAMPLE VARIABLES
EricLew 4:652cb54276d0 174 static uint16_t SampleBuffer[2048]; //SAMPLE RECORDING
EricLew 4:652cb54276d0 175
EricLew 4:652cb54276d0 176 float32_t FloatBuffSAMPLE[2048]; //Casting Int array to float array
EricLew 4:652cb54276d0 177
EricLew 4:652cb54276d0 178 float32_t SAMPLEPWR[1024]; //SAMPLE RECRODING 1 MAGNITUDE
EricLew 4:652cb54276d0 179 float32_t SAMPLEPHASE[1024];//SAMPLE RECORDING 1 PHASE
EricLew 4:652cb54276d0 180
EricLew 4:652cb54276d0 181 float32_t SAMPLEREAL[1024]; //SAMPLE RECORDING 0 REAL
EricLew 4:652cb54276d0 182 float32_t SAMPLEIMAG[1024]; //SAMPLE RECORDING 0 IMAGINARY
EricLew 4:652cb54276d0 183
EricLew 4:652cb54276d0 184 float32_t SAMPLEPWRMSE=0; //MSE
EricLew 4:652cb54276d0 185 float32_t SAMPLEPHASEMSE=0; //MSE
EricLew 4:652cb54276d0 186
EricLew 4:652cb54276d0 187 //INITIALIZE RECORDING
EricLew 4:652cb54276d0 188
EricLew 4:652cb54276d0 189 BSP_AUDIO_IN_Init(48000, DEFAULT_AUDIO_IN_BIT_RESOLUTION, DEFAULT_AUDIO_IN_CHANNEL_NBR);
EricLew 4:652cb54276d0 190
EricLew 4:652cb54276d0 191
EricLew 4:652cb54276d0 192 BSP_AUDIO_IN_Record(&SampleBuffer[0], 2048);
EricLew 4:652cb54276d0 193 EXIT = 0; //RESET AUDIO RECORD FLAG
EricLew 1:1ae4b642c533 194 counter=0; //RESET COUNTER
EricLew 1:1ae4b642c533 195 /* PCM samples recording loop */ //COPIED FROM ABOVE USE '1' WHEN REFERENCING VARIABLES
EricLew 4:652cb54276d0 196 while (EXIT != SET)
EricLew 1:1ae4b642c533 197 {
EricLew 1:1ae4b642c533 198
EricLew 5:f6afbd3fc47a 199 if (counter==10000000) //Approximately 3 seconds of record time
EricLew 1:1ae4b642c533 200 {
EricLew 4:652cb54276d0 201 EXIT=1; //FLAG IS REGISTER R5
EricLew 1:1ae4b642c533 202 }
EricLew 1:1ae4b642c533 203 else
EricLew 1:1ae4b642c533 204 {
EricLew 1:1ae4b642c533 205 counter=counter++;
EricLew 1:1ae4b642c533 206 }
EricLew 4:652cb54276d0 207
EricLew 1:1ae4b642c533 208 }
EricLew 4:652cb54276d0 209 /* Stop audio input */
EricLew 4:652cb54276d0 210 BSP_AUDIO_IN_Stop();
EricLew 4:652cb54276d0 211 /* De-initialize audio input */
EricLew 4:652cb54276d0 212 BSP_AUDIO_IN_DeInit();
EricLew 4:652cb54276d0 213
EricLew 4:652cb54276d0 214 //END OF RECORDING
EricLew 1:1ae4b642c533 215
EricLew 4:652cb54276d0 216 //CASTS THE RECORDING BUFFER AS A FLOAT
EricLew 4:652cb54276d0 217 for (n=0; n<2048; n++)
EricLew 4:652cb54276d0 218 {FloatBuffSAMPLE[n]=(float)SampleBuffer[n];}
EricLew 4:652cb54276d0 219
EricLew 4:652cb54276d0 220 float32_t FloatBuffSAMPLEout[4096];
EricLew 4:652cb54276d0 221
EricLew 4:652cb54276d0 222 for(n=0;n<2048;n++)
EricLew 4:652cb54276d0 223 {FloatBuffSAMPLEout[n*2] = FloatBuffSAMPLE[n];
EricLew 4:652cb54276d0 224 FloatBuffSAMPLEout[(n*2)+1] = 0.0;}
EricLew 4:652cb54276d0 225
EricLew 4:652cb54276d0 226 //PERFORMS THE
EricLew 5:f6afbd3fc47a 227 arm_cfft_f32(S, FloatBuffSAMPLEout, 0,0); //Output of FFT is half the record buffer size
EricLew 4:652cb54276d0 228 //FloatBuffSAMPLEout[0]=0;
EricLew 4:652cb54276d0 229 //MSE FUNCTION
EricLew 4:652cb54276d0 230 //SEPARATES REAL AND IMAGINARY PARTS
EricLew 4:652cb54276d0 231 for(n=0;n<2048;n=n+2)
EricLew 4:652cb54276d0 232 {SAMPLEREAL[n]=FloatBuffSAMPLEout[n];}//Parses Real parts from the buffer
EricLew 4:652cb54276d0 233 for(n=1;n<2048;n=n+2)
EricLew 4:652cb54276d0 234 {SAMPLEIMAG[n]=FloatBuffSAMPLEout[n];}//Parses Imaginary parts from the buffer
EricLew 4:652cb54276d0 235
EricLew 4:652cb54276d0 236 //CALCULATES PHASE AND MAGITUDE
EricLew 4:652cb54276d0 237 //SAMPLE RECORDING
EricLew 4:652cb54276d0 238 for(n=0;n<1024;n++)
EricLew 4:652cb54276d0 239 {SAMPLEPHASE[n]=atan2(SAMPLEIMAG[n],SAMPLEREAL[n]);}//Calculates control phase
EricLew 4:652cb54276d0 240 for(n=0;n<1024;n++)
EricLew 4:652cb54276d0 241 {SAMPLEPWR[n]=sqrt((SAMPLEIMAG[n]*SAMPLEIMAG[n])+(SAMPLEREAL[n]*SAMPLEREAL[n]));} //calculates control power
EricLew 4:652cb54276d0 242
EricLew 4:652cb54276d0 243 //ASSIGNS SAMPLE MAGNITUDE TO DISPLAY EXTERNAL FOR GRAPHING
EricLew 4:652cb54276d0 244 for(n=0;n<1024;n++)
EricLew 4:652cb54276d0 245 {DISPLAYFFT[n]=SAMPLEPWR[n];}
EricLew 4:652cb54276d0 246
EricLew 0:d4e5ad7ad71c 247
EricLew 4:652cb54276d0 248 //MEAN SQUARED ERROR FOR SAMPLE MAGNITUDES
EricLew 4:652cb54276d0 249 SAMPLEPWRMSE=0;
EricLew 4:652cb54276d0 250 for(n=0;n<1024;n++)
EricLew 4:652cb54276d0 251 {compare[n]=CONTROLPWR0[n]-SAMPLEPWR[n];} //Error between FFT magnitudes, stored in compare
EricLew 4:652cb54276d0 252
EricLew 4:652cb54276d0 253 for(n=0;n<1024;n++)
EricLew 4:652cb54276d0 254 {compare[n]=(compare[n]*compare[n]);} //Squares the error, stores back in compare
EricLew 4:652cb54276d0 255
EricLew 4:652cb54276d0 256 for(n=0;n<1024;n++)
EricLew 4:652cb54276d0 257 {SAMPLEPWRMSE=SAMPLEPWRMSE+compare[n];} //Takes the mean of the error, stores MSE in CONTROLMSE
EricLew 4:652cb54276d0 258 SAMPLEPWRMSE=SAMPLEPWRMSE/1024.0f;
EricLew 4:652cb54276d0 259 //MEAN SQUARED ERROR FOR SAMPLE PHASE
EricLew 4:652cb54276d0 260 SAMPLEPHASEMSE=0;
EricLew 4:652cb54276d0 261 for(n=0;n<1024;n++)
EricLew 4:652cb54276d0 262 {compare[n]=CONTROLPHASE0[n]-SAMPLEPHASE[n];} //Error between FFT magnitudes, stored in compare
EricLew 4:652cb54276d0 263
EricLew 4:652cb54276d0 264 for(n=0;n<1024;n++)
EricLew 4:652cb54276d0 265 {compare[n]=(compare[n]*compare[n]);} //Squares the error, stores back in compare
EricLew 4:652cb54276d0 266
EricLew 4:652cb54276d0 267 for(n=0;n<1024;n++)
EricLew 4:652cb54276d0 268 {SAMPLEPHASEMSE=SAMPLEPHASEMSE+compare[n];} //Takes the mean of the error, stores MSE in CONTROLMSE
EricLew 4:652cb54276d0 269 SAMPLEPHASEMSE=SAMPLEPHASEMSE/1024.0f;
EricLew 4:652cb54276d0 270
EricLew 5:f6afbd3fc47a 271 float32_t TEST[6];
EricLew 4:652cb54276d0 272 TEST[0]=PWRCONTROLMSE;
EricLew 4:652cb54276d0 273 TEST[1]=PHSCONTROLMSE;
EricLew 4:652cb54276d0 274 TEST[2]=SAMPLEPHASEMSE;
EricLew 4:652cb54276d0 275 TEST[3]=SAMPLEPWRMSE;
EricLew 4:652cb54276d0 276 TEST[4]=(SAMPLEPWRMSE/PWRCONTROLMSE); //The ratio of sample MSE and control MSE
EricLew 4:652cb54276d0 277 TEST[5]=(SAMPLEPHASEMSE/PHSCONTROLMSE);
EricLew 5:f6afbd3fc47a 278 float32_t low=.001; //LOW END OF ACCEPTED TOLERANCE RANGE
EricLew 5:f6afbd3fc47a 279 float32_t high=20; //HIGH END OF ACCEPTED TOLERANCE RANGE
EricLew 5:f6afbd3fc47a 280
EricLew 5:f6afbd3fc47a 281 //COMPARISON
EricLew 5:f6afbd3fc47a 282 //if(SAMPLEPHASEMSE>(10*PHSCONTROLMSE))
EricLew 5:f6afbd3fc47a 283 //{
EricLew 5:f6afbd3fc47a 284 //SEND ERROR MESSAGE
EricLew 5:f6afbd3fc47a 285 //CREATE EVENT
EricLew 5:f6afbd3fc47a 286 //}
EricLew 5:f6afbd3fc47a 287 if(TEST[4]>high)//MODEM FUNCTIONS
EricLew 5:f6afbd3fc47a 288 {
EricLew 5:f6afbd3fc47a 289 //SEND ERROR MESSAGE
EricLew 5:f6afbd3fc47a 290 //CREATE EVENT
EricLew 5:f6afbd3fc47a 291 }
EricLew 5:f6afbd3fc47a 292 if(TEST[4] < low)
EricLew 5:f6afbd3fc47a 293 {
EricLew 5:f6afbd3fc47a 294 //SEND ERROR MESSAGE
EricLew 5:f6afbd3fc47a 295 //CREATE EVENT
EricLew 5:f6afbd3fc47a 296 }
EricLew 0:d4e5ad7ad71c 297 }