Wim Huiskamp
/
mbed_audio_alert
IEC60601-1-8 Audible Alert Generator
See here for more info.
IEC60601-1-8.cpp@0:07767204347b, 2012-05-18 (annotated)
- Committer:
- wim
- Date:
- Fri May 18 19:51:12 2012 +0000
- Revision:
- 0:07767204347b
First Release
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
wim | 0:07767204347b | 1 | /**************************************************************** |
wim | 0:07767204347b | 2 | * IEC601601-1-8 |
wim | 0:07767204347b | 3 | * |
wim | 0:07767204347b | 4 | * This modules provides the IEC Medical Alert tones. |
wim | 0:07767204347b | 5 | * |
wim | 0:07767204347b | 6 | * |
wim | 0:07767204347b | 7 | * Copyright(C) 2007, NXP Semiconductor |
wim | 0:07767204347b | 8 | * All rights reserved. |
wim | 0:07767204347b | 9 | * |
wim | 0:07767204347b | 10 | * Port to mbed 2012 (WH) |
wim | 0:07767204347b | 11 | ****************************************************************/ |
wim | 0:07767204347b | 12 | #include "mbed.h" |
wim | 0:07767204347b | 13 | #include "IEC60601-1-8.h" |
wim | 0:07767204347b | 14 | |
wim | 0:07767204347b | 15 | #define DEBUG_ON 0 // Activate Testpins for timing |
wim | 0:07767204347b | 16 | #if(DEBUG_ON) |
wim | 0:07767204347b | 17 | // Activate Testpins for timing |
wim | 0:07767204347b | 18 | DigitalOut TimInt(p19); |
wim | 0:07767204347b | 19 | DigitalOut SeqInt(p20); |
wim | 0:07767204347b | 20 | #endif |
wim | 0:07767204347b | 21 | |
wim | 0:07767204347b | 22 | #define AMPL 200 // Output Amplitude |
wim | 0:07767204347b | 23 | #define PI 3.1415926 |
wim | 0:07767204347b | 24 | #define FSAMPLE 25000 // Timer Reload Frequency |
wim | 0:07767204347b | 25 | |
wim | 0:07767204347b | 26 | |
wim | 0:07767204347b | 27 | // define rise and fall time of tones |
wim | 0:07767204347b | 28 | #define HP_RISE 12 // rise time setting for high priority tones (12 = ~20ms Tr) |
wim | 0:07767204347b | 29 | // decrease to make slower, increase to make faster |
wim | 0:07767204347b | 30 | #define HP_FALL 12 // fall time setting for high priority tones (12 = ~20ms Tf) |
wim | 0:07767204347b | 31 | // decrease to make slower, increase to make faster |
wim | 0:07767204347b | 32 | #define MP_RISE 8 // rise time setting for high priority tones (8 = ~30ms Tr) |
wim | 0:07767204347b | 33 | // decrease to make slower, increase to make faster |
wim | 0:07767204347b | 34 | #define MP_FALL 8 // fall time setting for high priority tones (8 = ~30ms Tf) |
wim | 0:07767204347b | 35 | // decrease to make slower, increase to make faster |
wim | 0:07767204347b | 36 | |
wim | 0:07767204347b | 37 | |
wim | 0:07767204347b | 38 | Note_Type const _TuneSequence [][5] = {{C4,C4,C4,C4,C4}, // general |
wim | 0:07767204347b | 39 | {C5,B4,A4,G4,F4}, // oxygen |
wim | 0:07767204347b | 40 | {C4,A4,F4,A4,F4}, // ventilation |
wim | 0:07767204347b | 41 | {C4,E4,G4,G4,C5}, // cardiovascular |
wim | 0:07767204347b | 42 | {C4,D4,E4,F4,G4}, // temperature |
wim | 0:07767204347b | 43 | {C5,D4,G4,C5,D4}, // drug_delivery |
wim | 0:07767204347b | 44 | {C4,Fsharp4,C4,C4,Fsharp4}, // perfusion |
wim | 0:07767204347b | 45 | {C5,C4,C4,C5,C4}, // power_fail |
wim | 0:07767204347b | 46 | // {E4,C4,0,0,0}}; // low_alarm |
wim | 0:07767204347b | 47 | {E4,C4,C4,C4,C4}}; // low_alarm |
wim | 0:07767204347b | 48 | |
wim | 0:07767204347b | 49 | float const _FreqArray[][5]= {{261.626,523.252,784.878,1046.50,1308.13}, // C4 |
wim | 0:07767204347b | 50 | {293.67,587.34,881.01,1174.7,1468.3}, // D4 |
wim | 0:07767204347b | 51 | {329.63,659.26,988.89,1318.52,1648.15}, // E4 |
wim | 0:07767204347b | 52 | {349.23,698.46,1047.69,1396.9,1746.15}, // F4 |
wim | 0:07767204347b | 53 | {369.99,739.98,1109.97,1479.96,1849.95}, // FSharp4 |
wim | 0:07767204347b | 54 | {392.00,784.00,1176.0,1568.0,1960.0}, // G4 |
wim | 0:07767204347b | 55 | {440.000,880.00,1320.0,1760.00,2200.00}, // A4 |
wim | 0:07767204347b | 56 | {493.88,987.76,1481.64,1975.5,2469.4}, // B4 |
wim | 0:07767204347b | 57 | {523.251,1046.50,1569.756,2093.00,2616.25}}; // C5 |
wim | 0:07767204347b | 58 | |
wim | 0:07767204347b | 59 | unsigned char _ToneWeights[] = {255,255,255,255,255}; // used for test and |
wim | 0:07767204347b | 60 | // adjusting harmonic levels |
wim | 0:07767204347b | 61 | |
wim | 0:07767204347b | 62 | struct wave _Waves[9][5]; // 'Waves' holds tone gen coefficients and variables |
wim | 0:07767204347b | 63 | // the coefficients are calculated during initialization. |
wim | 0:07767204347b | 64 | |
wim | 0:07767204347b | 65 | |
wim | 0:07767204347b | 66 | IEC60601::IEC60601() { |
wim | 0:07767204347b | 67 | |
wim | 0:07767204347b | 68 | _InitDAC(); |
wim | 0:07767204347b | 69 | _InitSequencer(); |
wim | 0:07767204347b | 70 | _InitToneCoefArray(); |
wim | 0:07767204347b | 71 | _ticker.attach_us(this, &IEC60601::_TimerInteruptHandler, 40); |
wim | 0:07767204347b | 72 | }; |
wim | 0:07767204347b | 73 | |
wim | 0:07767204347b | 74 | |
wim | 0:07767204347b | 75 | |
wim | 0:07767204347b | 76 | void IEC60601::TurnOnAlarm(Prio_Type priority, Alarm_Type alarm_type) { |
wim | 0:07767204347b | 77 | |
wim | 0:07767204347b | 78 | _priority = priority; |
wim | 0:07767204347b | 79 | _alarm_type = alarm_type; |
wim | 0:07767204347b | 80 | |
wim | 0:07767204347b | 81 | _mscount = 0; |
wim | 0:07767204347b | 82 | _sequence = 1; |
wim | 0:07767204347b | 83 | |
wim | 0:07767204347b | 84 | } |
wim | 0:07767204347b | 85 | |
wim | 0:07767204347b | 86 | void IEC60601::TurnOffAlarm(void) { |
wim | 0:07767204347b | 87 | _sequence = 0; |
wim | 0:07767204347b | 88 | } |
wim | 0:07767204347b | 89 | |
wim | 0:07767204347b | 90 | void IEC60601::TestAlarm(Note_Type active_note, int w0, int w1, int w2, int w3, int w4) { |
wim | 0:07767204347b | 91 | |
wim | 0:07767204347b | 92 | _priority = TEST; |
wim | 0:07767204347b | 93 | |
wim | 0:07767204347b | 94 | _active_note = active_note; |
wim | 0:07767204347b | 95 | _ToneWeights[0]= w0; |
wim | 0:07767204347b | 96 | _ToneWeights[1]= w1; |
wim | 0:07767204347b | 97 | _ToneWeights[2]= w2; |
wim | 0:07767204347b | 98 | _ToneWeights[3]= w3; |
wim | 0:07767204347b | 99 | _ToneWeights[4]= w4; |
wim | 0:07767204347b | 100 | |
wim | 0:07767204347b | 101 | _mscount = 0; |
wim | 0:07767204347b | 102 | _sequence = 1; |
wim | 0:07767204347b | 103 | } |
wim | 0:07767204347b | 104 | |
wim | 0:07767204347b | 105 | |
wim | 0:07767204347b | 106 | // This modules provides the note sequencers and envelope control |
wim | 0:07767204347b | 107 | // functions for the alarm notes for the IEC Medical Alert tone demo. |
wim | 0:07767204347b | 108 | |
wim | 0:07767204347b | 109 | void IEC60601::_InitSequencer(void) { |
wim | 0:07767204347b | 110 | _envelope_on = false; |
wim | 0:07767204347b | 111 | _envelope_off = false; |
wim | 0:07767204347b | 112 | } |
wim | 0:07767204347b | 113 | |
wim | 0:07767204347b | 114 | |
wim | 0:07767204347b | 115 | void IEC60601::_TurnOnNote(void) { |
wim | 0:07767204347b | 116 | _envelope = 0; |
wim | 0:07767204347b | 117 | _note_on = true; |
wim | 0:07767204347b | 118 | _envelope_on = true; |
wim | 0:07767204347b | 119 | } |
wim | 0:07767204347b | 120 | |
wim | 0:07767204347b | 121 | void IEC60601::_TurnOffNote(void) { |
wim | 0:07767204347b | 122 | _note_on = false; |
wim | 0:07767204347b | 123 | } |
wim | 0:07767204347b | 124 | |
wim | 0:07767204347b | 125 | |
wim | 0:07767204347b | 126 | void IEC60601::_HighPriSequence (void) { |
wim | 0:07767204347b | 127 | |
wim | 0:07767204347b | 128 | switch (_mscount) { |
wim | 0:07767204347b | 129 | case 1: |
wim | 0:07767204347b | 130 | _active_note = _TuneSequence [_alarm_type][0]; // 1rst note of sequence |
wim | 0:07767204347b | 131 | _note_level = 170; |
wim | 0:07767204347b | 132 | _TurnOnNote(); |
wim | 0:07767204347b | 133 | break; |
wim | 0:07767204347b | 134 | case 145: // 145 ms (trise + tduration) |
wim | 0:07767204347b | 135 | _note_on = false; // begin decay as note turns "off" |
wim | 0:07767204347b | 136 | break; |
wim | 0:07767204347b | 137 | case 224: |
wim | 0:07767204347b | 138 | _active_note = _TuneSequence [_alarm_type][1]; // 2nd note of sequence |
wim | 0:07767204347b | 139 | _note_level = 255; |
wim | 0:07767204347b | 140 | _TurnOnNote(); |
wim | 0:07767204347b | 141 | break; |
wim | 0:07767204347b | 142 | case 368: |
wim | 0:07767204347b | 143 | _note_on = false; // begin decay as note turns "off" |
wim | 0:07767204347b | 144 | break; |
wim | 0:07767204347b | 145 | case 447: |
wim | 0:07767204347b | 146 | _active_note = _TuneSequence [_alarm_type][2]; // 3rd note of sequence |
wim | 0:07767204347b | 147 | _note_level = 255; |
wim | 0:07767204347b | 148 | _TurnOnNote(); |
wim | 0:07767204347b | 149 | break; |
wim | 0:07767204347b | 150 | case 591: |
wim | 0:07767204347b | 151 | _note_on = false; // begin decay as note turns "off" |
wim | 0:07767204347b | 152 | break; |
wim | 0:07767204347b | 153 | case 835: |
wim | 0:07767204347b | 154 | _active_note = _TuneSequence [_alarm_type][3]; // 4th note of sequence |
wim | 0:07767204347b | 155 | _note_level = 255; |
wim | 0:07767204347b | 156 | _TurnOnNote(); |
wim | 0:07767204347b | 157 | break; |
wim | 0:07767204347b | 158 | case 979: |
wim | 0:07767204347b | 159 | _note_on = false; // begin decay as note turns "off" |
wim | 0:07767204347b | 160 | break; |
wim | 0:07767204347b | 161 | case 1058: |
wim | 0:07767204347b | 162 | _active_note = _TuneSequence [_alarm_type][4]; // 5th note of sequence |
wim | 0:07767204347b | 163 | _note_level = 255; |
wim | 0:07767204347b | 164 | _TurnOnNote(); |
wim | 0:07767204347b | 165 | break; |
wim | 0:07767204347b | 166 | case 1202: |
wim | 0:07767204347b | 167 | _note_on = false; // begin decay as note turns "off" |
wim | 0:07767204347b | 168 | break; |
wim | 0:07767204347b | 169 | |
wim | 0:07767204347b | 170 | case 1250: // allows for fall time of envelope |
wim | 0:07767204347b | 171 | if (_sequence == 2) { // Done after one repeat |
wim | 0:07767204347b | 172 | _sequence = 0; |
wim | 0:07767204347b | 173 | _mscount = 0; |
wim | 0:07767204347b | 174 | } |
wim | 0:07767204347b | 175 | break; |
wim | 0:07767204347b | 176 | case 1750: |
wim | 0:07767204347b | 177 | if (_sequence == 1) { // If this is the first time through, repeat |
wim | 0:07767204347b | 178 | _sequence = 2; |
wim | 0:07767204347b | 179 | } |
wim | 0:07767204347b | 180 | _mscount = 0; |
wim | 0:07767204347b | 181 | break; |
wim | 0:07767204347b | 182 | } |
wim | 0:07767204347b | 183 | } |
wim | 0:07767204347b | 184 | |
wim | 0:07767204347b | 185 | |
wim | 0:07767204347b | 186 | void IEC60601::_MedPriSequence (void) { |
wim | 0:07767204347b | 187 | |
wim | 0:07767204347b | 188 | switch (_mscount) { |
wim | 0:07767204347b | 189 | case 1: |
wim | 0:07767204347b | 190 | _active_note = _TuneSequence [_alarm_type][0]; |
wim | 0:07767204347b | 191 | _note_level = 170; |
wim | 0:07767204347b | 192 | _TurnOnNote(); |
wim | 0:07767204347b | 193 | break; |
wim | 0:07767204347b | 194 | case 221: // 221 ms (trise(30) + tduration(190)+ start(1)) |
wim | 0:07767204347b | 195 | _note_on = false; // begin decay as note turns "off" |
wim | 0:07767204347b | 196 | break; |
wim | 0:07767204347b | 197 | case 441: |
wim | 0:07767204347b | 198 | _active_note = _TuneSequence [_alarm_type][1]; // 2nd note of sequence |
wim | 0:07767204347b | 199 | _note_level = 255; |
wim | 0:07767204347b | 200 | _TurnOnNote(); |
wim | 0:07767204347b | 201 | break; |
wim | 0:07767204347b | 202 | case 661: |
wim | 0:07767204347b | 203 | _note_on = false; // begin decay as note turns "off" |
wim | 0:07767204347b | 204 | break; |
wim | 0:07767204347b | 205 | case 881: |
wim | 0:07767204347b | 206 | _active_note = _TuneSequence [_alarm_type][2]; // 3rd note of sequence |
wim | 0:07767204347b | 207 | _note_level = 255; |
wim | 0:07767204347b | 208 | _TurnOnNote(); |
wim | 0:07767204347b | 209 | break; |
wim | 0:07767204347b | 210 | case 1101: |
wim | 0:07767204347b | 211 | _note_on = false; // begin decay as note turns "off" |
wim | 0:07767204347b | 212 | break; |
wim | 0:07767204347b | 213 | case 1151: // allows for fall time of envelope |
wim | 0:07767204347b | 214 | _sequence = 0; // Medium Prio does not repeat |
wim | 0:07767204347b | 215 | _mscount = 0; |
wim | 0:07767204347b | 216 | } |
wim | 0:07767204347b | 217 | |
wim | 0:07767204347b | 218 | } |
wim | 0:07767204347b | 219 | |
wim | 0:07767204347b | 220 | void IEC60601::_LowPriSequence (void) { |
wim | 0:07767204347b | 221 | |
wim | 0:07767204347b | 222 | switch (_mscount) { |
wim | 0:07767204347b | 223 | case 1: |
wim | 0:07767204347b | 224 | _active_note = _TuneSequence [_alarm_type][0]; |
wim | 0:07767204347b | 225 | _note_level = 170; |
wim | 0:07767204347b | 226 | _TurnOnNote(); |
wim | 0:07767204347b | 227 | break; |
wim | 0:07767204347b | 228 | case 261: // 261 ms (trise(35) + tduration(225)) |
wim | 0:07767204347b | 229 | _note_on = false; // begin decay as note turns "off" |
wim | 0:07767204347b | 230 | break; |
wim | 0:07767204347b | 231 | case 521: |
wim | 0:07767204347b | 232 | _active_note = _TuneSequence [_alarm_type][1]; // 2nd note of sequence |
wim | 0:07767204347b | 233 | _note_level = 255; |
wim | 0:07767204347b | 234 | _TurnOnNote(); |
wim | 0:07767204347b | 235 | break; |
wim | 0:07767204347b | 236 | case 781: |
wim | 0:07767204347b | 237 | _note_on = false; // begin decay as note turns "off" |
wim | 0:07767204347b | 238 | break; |
wim | 0:07767204347b | 239 | case 816: // Low Prio does not repeat |
wim | 0:07767204347b | 240 | _sequence = 0; |
wim | 0:07767204347b | 241 | _mscount = 0; |
wim | 0:07767204347b | 242 | } |
wim | 0:07767204347b | 243 | } |
wim | 0:07767204347b | 244 | |
wim | 0:07767204347b | 245 | void IEC60601::_TestSequence (void) { |
wim | 0:07767204347b | 246 | |
wim | 0:07767204347b | 247 | switch (_mscount) { |
wim | 0:07767204347b | 248 | case 1: |
wim | 0:07767204347b | 249 | // _active_note = _TuneSequence [_alarm_type][0]; |
wim | 0:07767204347b | 250 | _note_level = 255; |
wim | 0:07767204347b | 251 | _TurnOnNote(); |
wim | 0:07767204347b | 252 | break; |
wim | 0:07767204347b | 253 | |
wim | 0:07767204347b | 254 | case 1000: |
wim | 0:07767204347b | 255 | _note_on = false; // begin decay as note turns "off" |
wim | 0:07767204347b | 256 | break; |
wim | 0:07767204347b | 257 | |
wim | 0:07767204347b | 258 | case 1035: |
wim | 0:07767204347b | 259 | |
wim | 0:07767204347b | 260 | for (int i=0; i<5; i++) { // Restore weights |
wim | 0:07767204347b | 261 | _ToneWeights[i] = 255; |
wim | 0:07767204347b | 262 | }; |
wim | 0:07767204347b | 263 | _sequence = 0; // Test does not repeat |
wim | 0:07767204347b | 264 | _mscount = 0; |
wim | 0:07767204347b | 265 | break; |
wim | 0:07767204347b | 266 | } |
wim | 0:07767204347b | 267 | } |
wim | 0:07767204347b | 268 | |
wim | 0:07767204347b | 269 | void IEC60601::_EnvelopeControl(void) { |
wim | 0:07767204347b | 270 | |
wim | 0:07767204347b | 271 | if (_note_on) { |
wim | 0:07767204347b | 272 | if (_envelope >= _note_level) { |
wim | 0:07767204347b | 273 | _envelope = _note_level; |
wim | 0:07767204347b | 274 | } |
wim | 0:07767204347b | 275 | else { |
wim | 0:07767204347b | 276 | if (_priority == HIGH) { |
wim | 0:07767204347b | 277 | _envelope += HP_RISE; // high priority risetime control |
wim | 0:07767204347b | 278 | } |
wim | 0:07767204347b | 279 | else { |
wim | 0:07767204347b | 280 | _envelope += MP_RISE; // Medium priority risetime control |
wim | 0:07767204347b | 281 | } |
wim | 0:07767204347b | 282 | } |
wim | 0:07767204347b | 283 | } |
wim | 0:07767204347b | 284 | else { |
wim | 0:07767204347b | 285 | if (_envelope > 0) { |
wim | 0:07767204347b | 286 | if (_priority == HIGH) { |
wim | 0:07767204347b | 287 | _envelope -= HP_FALL; // high priority falltime control |
wim | 0:07767204347b | 288 | } |
wim | 0:07767204347b | 289 | else { |
wim | 0:07767204347b | 290 | _envelope -= MP_FALL; // Medium priority falltime control |
wim | 0:07767204347b | 291 | } |
wim | 0:07767204347b | 292 | } |
wim | 0:07767204347b | 293 | } |
wim | 0:07767204347b | 294 | if ((_envelope <= 0) && (!_note_on) && (_envelope_on) ) { |
wim | 0:07767204347b | 295 | _envelope = 0; |
wim | 0:07767204347b | 296 | _envelope_off = true; // synchronize with zero cross |
wim | 0:07767204347b | 297 | } |
wim | 0:07767204347b | 298 | } |
wim | 0:07767204347b | 299 | |
wim | 0:07767204347b | 300 | |
wim | 0:07767204347b | 301 | |
wim | 0:07767204347b | 302 | // This module generates multiple sine waves that are combined |
wim | 0:07767204347b | 303 | // to generate tones that contain a fundamental and 4 harmonics |
wim | 0:07767204347b | 304 | // per the IEC60601-1-8 Medical Alarm specification |
wim | 0:07767204347b | 305 | |
wim | 0:07767204347b | 306 | void IEC60601::_InitDAC(void) { |
wim | 0:07767204347b | 307 | |
wim | 0:07767204347b | 308 | LPC_PINCON->PINSEL1 &= ~0x00300000; // enable DAC P0.26 |
wim | 0:07767204347b | 309 | LPC_PINCON->PINSEL1 |= 0x00200000; |
wim | 0:07767204347b | 310 | LPC_PINCON->PINMODE1 &= ~0x00300000; // disable Rs on P0.26 |
wim | 0:07767204347b | 311 | LPC_PINCON->PINMODE1 |= 0x00200000; |
wim | 0:07767204347b | 312 | |
wim | 0:07767204347b | 313 | LPC_DAC->DACR = 0x8000; // init DAC to half on voltage |
wim | 0:07767204347b | 314 | } |
wim | 0:07767204347b | 315 | |
wim | 0:07767204347b | 316 | |
wim | 0:07767204347b | 317 | void IEC60601::_InitToneCoefArray(void) { // generate the coefficients and init array for tones |
wim | 0:07767204347b | 318 | |
wim | 0:07767204347b | 319 | unsigned char n; |
wim | 0:07767204347b | 320 | unsigned char j; |
wim | 0:07767204347b | 321 | |
wim | 0:07767204347b | 322 | for (j=0;j<9;j++) // Initialize all nine scale tones (C4-C5) |
wim | 0:07767204347b | 323 | { |
wim | 0:07767204347b | 324 | for (n=0;n<5;n++) // fundamental and 4 harmonics for IEC60601-1-8 |
wim | 0:07767204347b | 325 | { |
wim | 0:07767204347b | 326 | _Waves[j][n].coef = ((cos (2*PI*(float)(_FreqArray[j][n]/FSAMPLE)))* 32768) ; // 2* taken out, put in final calc as a shift |
wim | 0:07767204347b | 327 | _Waves[j][n].y1 = 0; |
wim | 0:07767204347b | 328 | _Waves[j][n].y2 = ((sin (2*PI*(float)((_FreqArray[j][n]/FSAMPLE))) * AMPL * 32768)); // Try 8388608 (+8 bits) w/ long coef |
wim | 0:07767204347b | 329 | } |
wim | 0:07767204347b | 330 | } |
wim | 0:07767204347b | 331 | } |
wim | 0:07767204347b | 332 | |
wim | 0:07767204347b | 333 | |
wim | 0:07767204347b | 334 | void IEC60601::_GenerateMultiTone (struct wave *t) { |
wim | 0:07767204347b | 335 | long int y; |
wim | 0:07767204347b | 336 | int i; |
wim | 0:07767204347b | 337 | int env_weights; |
wim | 0:07767204347b | 338 | long int output; |
wim | 0:07767204347b | 339 | static long int output_old; |
wim | 0:07767204347b | 340 | |
wim | 0:07767204347b | 341 | output = 0; // clear output accumulator |
wim | 0:07767204347b | 342 | for (i=0; i<5; i++) { // cycle through the 5 structures in the array |
wim | 0:07767204347b | 343 | y = ((t->coef *(long long)(t->y1)>>14)) - t->y2; // Goertzel Calculation |
wim | 0:07767204347b | 344 | t->y2 = t->y1; // store for next time |
wim | 0:07767204347b | 345 | t->y1 = y; // store for next time |
wim | 0:07767204347b | 346 | env_weights = _envelope * _ToneWeights[i]>>8; |
wim | 0:07767204347b | 347 | output += ((t->y1 * env_weights) >> 8); // sum fundamental and harmonics |
wim | 0:07767204347b | 348 | t++; // increment structure pointer |
wim | 0:07767204347b | 349 | } |
wim | 0:07767204347b | 350 | |
wim | 0:07767204347b | 351 | //// DAC->DACR = ((output >> 10) & 0xFFC0) + 0x8000; // make unsigned and output to DAC |
wim | 0:07767204347b | 352 | ///// Adapt to mbed !!!! |
wim | 0:07767204347b | 353 | LPC_DAC->DACR = ((output >> 10) & 0xFFC0) + 0x8000; // make unsigned and output to DAC |
wim | 0:07767204347b | 354 | |
wim | 0:07767204347b | 355 | |
wim | 0:07767204347b | 356 | if ((output >= 0) && (output_old <= 0)) { // zero crossing detect |
wim | 0:07767204347b | 357 | if (_envelope_off && (!_note_on)) { |
wim | 0:07767204347b | 358 | _envelope_on = false; // sychronizes turn off with zero cross |
wim | 0:07767204347b | 359 | _envelope_off = false; // reset envelope flag |
wim | 0:07767204347b | 360 | } |
wim | 0:07767204347b | 361 | } |
wim | 0:07767204347b | 362 | output_old = output; |
wim | 0:07767204347b | 363 | } |
wim | 0:07767204347b | 364 | |
wim | 0:07767204347b | 365 | #if(0) |
wim | 0:07767204347b | 366 | void IEC60601::_OutputTones(Note_Type note, unsigned char level) { |
wim | 0:07767204347b | 367 | |
wim | 0:07767204347b | 368 | _note_level = level; |
wim | 0:07767204347b | 369 | _GenerateMultiTone (&Waves[note][0]); |
wim | 0:07767204347b | 370 | } |
wim | 0:07767204347b | 371 | #endif |
wim | 0:07767204347b | 372 | |
wim | 0:07767204347b | 373 | |
wim | 0:07767204347b | 374 | void IEC60601::_TimerInteruptHandler (void){ |
wim | 0:07767204347b | 375 | static int timeval = 0; |
wim | 0:07767204347b | 376 | |
wim | 0:07767204347b | 377 | #if(DEBUG_ON) |
wim | 0:07767204347b | 378 | // Activate Testpins for timing |
wim | 0:07767204347b | 379 | TimInt = 1; |
wim | 0:07767204347b | 380 | #endif |
wim | 0:07767204347b | 381 | |
wim | 0:07767204347b | 382 | if (_envelope_on) { |
wim | 0:07767204347b | 383 | //Oude code |
wim | 0:07767204347b | 384 | // _OutputTones(_active_note, _note_level); // parameters are set in sequencer |
wim | 0:07767204347b | 385 | |
wim | 0:07767204347b | 386 | _GenerateMultiTone (&_Waves[_active_note][0]); // parameters set in sequencer |
wim | 0:07767204347b | 387 | } |
wim | 0:07767204347b | 388 | |
wim | 0:07767204347b | 389 | timeval++; |
wim | 0:07767204347b | 390 | if (timeval == 25) { // millisecond interval (@ 25 khz sample rate) |
wim | 0:07767204347b | 391 | |
wim | 0:07767204347b | 392 | #if(DEBUG_ON) |
wim | 0:07767204347b | 393 | // Activate Testpins for timing |
wim | 0:07767204347b | 394 | SeqInt=1; |
wim | 0:07767204347b | 395 | #endif |
wim | 0:07767204347b | 396 | if (_sequence != 0) { |
wim | 0:07767204347b | 397 | switch (_priority) { |
wim | 0:07767204347b | 398 | case HIGH: |
wim | 0:07767204347b | 399 | _HighPriSequence(); |
wim | 0:07767204347b | 400 | break; |
wim | 0:07767204347b | 401 | case MEDIUM: |
wim | 0:07767204347b | 402 | _MedPriSequence(); |
wim | 0:07767204347b | 403 | break; |
wim | 0:07767204347b | 404 | case LOW: |
wim | 0:07767204347b | 405 | _LowPriSequence(); |
wim | 0:07767204347b | 406 | break; |
wim | 0:07767204347b | 407 | case TEST: |
wim | 0:07767204347b | 408 | _TestSequence(); |
wim | 0:07767204347b | 409 | break; |
wim | 0:07767204347b | 410 | } |
wim | 0:07767204347b | 411 | } |
wim | 0:07767204347b | 412 | timeval = 0; // clear interval counter |
wim | 0:07767204347b | 413 | _mscount++; // increment ms counter |
wim | 0:07767204347b | 414 | _EnvelopeControl(); |
wim | 0:07767204347b | 415 | |
wim | 0:07767204347b | 416 | #if(DEBUG_ON) |
wim | 0:07767204347b | 417 | // Activate Testpins for timing |
wim | 0:07767204347b | 418 | SeqInt=0; |
wim | 0:07767204347b | 419 | #endif |
wim | 0:07767204347b | 420 | } |
wim | 0:07767204347b | 421 | |
wim | 0:07767204347b | 422 | #if(DEBUG_ON) |
wim | 0:07767204347b | 423 | // Activate Testpins for timing |
wim | 0:07767204347b | 424 | TimInt = 0; |
wim | 0:07767204347b | 425 | #endif |
wim | 0:07767204347b | 426 | |
wim | 0:07767204347b | 427 | } |
wim | 0:07767204347b | 428 | |
wim | 0:07767204347b | 429 | |
wim | 0:07767204347b | 430 |