RTOS homework 4

Dependencies:   C12832_lcd mbed

Committer:
gatedClock
Date:
Sun Aug 18 16:04:27 2013 +0000
Revision:
7:562f136c7681
Parent:
6:bb5f989e3425
Child:
8:95f4f470ae28
cleanup.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gatedClock 0:1013288b8e43 1 /*----------------------------------------------//------------------------------
gatedClock 0:1013288b8e43 2 student : m-moore
gatedClock 0:1013288b8e43 3 class : rtos
gatedClock 1:5f41e2df0e85 4 directory : RTOS_HW_04
gatedClock 0:1013288b8e43 5 file : main.cpp
gatedClock 0:1013288b8e43 6 ----description---------------------------------//------------------------------
gatedClock 0:1013288b8e43 7 Joystick-Controlled Metronome
gatedClock 0:1013288b8e43 8
gatedClock 0:1013288b8e43 9 features:
gatedClock 0:1013288b8e43 10 1. post-initialization functionality all timer-driven.
gatedClock 0:1013288b8e43 11 2. IRSs contain no blocking functions.
gatedClock 0:1013288b8e43 12 3. LED shows the metronome beat.
gatedClock 0:1013288b8e43 13 4. metronome speed controlled with up/down joystick.
gatedClock 0:1013288b8e43 14 5. rate-of-speed-change depends on how long the up/down has been active.
gatedClock 0:1013288b8e43 15 6. Beat-Per-Minute (BPM) shown on LCD display.
gatedClock 0:1013288b8e43 16
gatedClock 0:1013288b8e43 17 controls:
gatedClock 0:1013288b8e43 18 1. joystick-up - increase metronome rate.
gatedClock 0:1013288b8e43 19 2. joystick-down - decrease metronome rate.
gatedClock 0:1013288b8e43 20 3. joystick-center - set metronome to 60BPM.
gatedClock 0:1013288b8e43 21
gatedClock 0:1013288b8e43 22 notes:
gatedClock 0:1013288b8e43 23
gatedClock 0:1013288b8e43 24 testing:
gatedClock 0:1013288b8e43 25 1. confirm ease of being able to adjust one BPM rate with joystick up/down.
gatedClock 0:1013288b8e43 26 2. confirm three joystick up/down change rates, if keeping the stick pressed.
gatedClock 0:1013288b8e43 27 3. confirm max/min BPS saturation & display.
gatedClock 0:1013288b8e43 28 4. confirm joystick up/down control works to change display & LED BPM.
gatedClock 0:1013288b8e43 29 5. confirm joystick center-press sets rate to 60BPM immediately.
gatedClock 0:1013288b8e43 30 6. confirm long-test does not result in a crash.
gatedClock 0:1013288b8e43 31 -> all items confirmed.
gatedClock 0:1013288b8e43 32
gatedClock 0:1013288b8e43 33 -----includes-----------------------------------//----------------------------*/
gatedClock 0:1013288b8e43 34 #include "mbed.h" // mbed class.
gatedClock 0:1013288b8e43 35 #include "C12832_lcd.h" // LCD class.
gatedClock 0:1013288b8e43 36 //---defines------------------------------------//------------------------------
gatedClock 0:1013288b8e43 37 #define LCD1 lcd.locate(0, 0); // LCD line 1.
gatedClock 0:1013288b8e43 38 #define LCD2 lcd.locate(0,11); // LCD line 2.
gatedClock 0:1013288b8e43 39 #define LCD3 lcd.locate(0,22); // LCD line 3.
gatedClock 7:562f136c7681 40
gatedClock 0:1013288b8e43 41 #define METROMAX 800 // max. beats per minute.
gatedClock 0:1013288b8e43 42 #define METROMIN 8 // min. beats per minute.
gatedClock 0:1013288b8e43 43 #define UDSAMPLERATE 0.1 // how often to sample U/D joystick.
gatedClock 0:1013288b8e43 44 #define LCDSAMPLERATE 0.1 // how often to redraw the LCD.
gatedClock 0:1013288b8e43 45 #define PULSELENGTH 0.0625 // how long the LED-on-time is.
gatedClock 0:1013288b8e43 46 //--global_definitions--------------------------//------------------------------
gatedClock 0:1013288b8e43 47 //--global_variables----------------------------//------------------------------
gatedClock 0:1013288b8e43 48 float fMetroDelay; // time between ticks, in seconds.
gatedClock 0:1013288b8e43 49 float fMetroDuty; // duration of metro high, in seconds.
gatedClock 0:1013288b8e43 50 int dMetroBPM; // master parameter.
gatedClock 0:1013288b8e43 51 long lUpDownHowMany; // count how long up/down joystick pressed.
gatedClock 0:1013288b8e43 52 //--global_instances----------------------------//------------------------------
gatedClock 0:1013288b8e43 53 C12832_LCD lcd; // LCD object.
gatedClock 0:1013288b8e43 54
gatedClock 7:562f136c7681 55 InterruptIn iJoyStickUp (p15); // joystick up rising edge.
gatedClock 7:562f136c7681 56 InterruptIn iJoyStickDown (p12); // joystick down rising edge.
gatedClock 7:562f136c7681 57 InterruptIn iJoyStickLeft (p13); // joystick left rising edge.
gatedClock 7:562f136c7681 58 InterruptIn iJoyStickRight (p16); // joystick right rising edge.
gatedClock 7:562f136c7681 59 InterruptIn iJoyStickCenter(p14); // 1 if joystick middle pressed.
gatedClock 3:8ff0c9c853be 60
gatedClock 7:562f136c7681 61 DigitalIn dJoyStickUp (p15);
gatedClock 7:562f136c7681 62 DigitalIn dJoyStickDown (p12);
gatedClock 7:562f136c7681 63 DigitalIn dJoyStickLeft (p13);
gatedClock 7:562f136c7681 64 DigitalIn dJoyStickRight (p16);
gatedClock 7:562f136c7681 65 DigitalIn dJoyStickCenter(p14);
gatedClock 0:1013288b8e43 66
gatedClock 0:1013288b8e43 67 DigitalOut led3(LED1); // leftmost LED.
gatedClock 0:1013288b8e43 68
gatedClock 0:1013288b8e43 69 Ticker tickerMetronome; // blinking LED.
gatedClock 0:1013288b8e43 70 Ticker tickerJoystickUD; // joystick up/down sample.
gatedClock 0:1013288b8e43 71 Ticker tickerLCD; // display ticker.
gatedClock 0:1013288b8e43 72 Timeout timeoutDutyCycle; // LED duty cycle delay.
gatedClock 0:1013288b8e43 73 //-------prototypes-----------------------------//------------------------------
gatedClock 0:1013288b8e43 74 void initialization(); // initialize settings.
gatedClock 0:1013288b8e43 75 void lcd_display(); // display on LCD.
gatedClock 0:1013288b8e43 76 void interrupt_service_M(); // metronome tick.
gatedClock 0:1013288b8e43 77 void interrupt_service_UD(); // joystick up/down sample.
gatedClock 0:1013288b8e43 78 void led3_off(); // attachable LED control.
gatedClock 0:1013288b8e43 79 void led3_on(); // attachable LED control.
gatedClock 1:5f41e2df0e85 80 void ISR_up();
gatedClock 1:5f41e2df0e85 81 void ISR_down();
gatedClock 1:5f41e2df0e85 82 void ISR_right();
gatedClock 1:5f41e2df0e85 83 void ISR_left();
gatedClock 1:5f41e2df0e85 84 void ISR_center();
gatedClock 0:1013288b8e43 85 //==============================================//==============================
gatedClock 0:1013288b8e43 86 int main(void)
gatedClock 0:1013288b8e43 87 {
gatedClock 3:8ff0c9c853be 88 iJoyStickUp.rise(&ISR_up);
gatedClock 5:faa6d8a04501 89 iJoyStickDown.rise(&ISR_down);
gatedClock 5:faa6d8a04501 90 iJoyStickLeft.rise(&ISR_left);
gatedClock 5:faa6d8a04501 91 iJoyStickRight.rise(&ISR_right);
gatedClock 5:faa6d8a04501 92 iJoyStickCenter.rise(&ISR_center);
gatedClock 6:bb5f989e3425 93
gatedClock 6:bb5f989e3425 94 initialization();
gatedClock 6:bb5f989e3425 95
gatedClock 6:bb5f989e3425 96 // metronome ticker.
gatedClock 6:bb5f989e3425 97 tickerMetronome.attach(&interrupt_service_M,fMetroDelay);
gatedClock 6:bb5f989e3425 98
gatedClock 6:bb5f989e3425 99 // LCD ticker.
gatedClock 6:bb5f989e3425 100 tickerLCD.attach(&lcd_display,LCDSAMPLERATE);
gatedClock 6:bb5f989e3425 101
gatedClock 6:bb5f989e3425 102 while(1)
gatedClock 6:bb5f989e3425 103 {
gatedClock 6:bb5f989e3425 104
gatedClock 6:bb5f989e3425 105 wait(10.0);
gatedClock 6:bb5f989e3425 106 }
gatedClock 2:1a3acbc4d799 107
gatedClock 0:1013288b8e43 108 }
gatedClock 0:1013288b8e43 109 /*----------------------------------------------//----------------------------*/
gatedClock 0:1013288b8e43 110 void initialization(void) // program initializations.
gatedClock 0:1013288b8e43 111 {
gatedClock 0:1013288b8e43 112 dMetroBPM = 60; // initialize to 60BPM.
gatedClock 0:1013288b8e43 113 fMetroDelay = 60.0 / (float) (dMetroBPM);
gatedClock 0:1013288b8e43 114 fMetroDuty = PULSELENGTH; // initialize LED on-duration.
gatedClock 0:1013288b8e43 115 lUpDownHowMany = 0;
gatedClock 0:1013288b8e43 116 }
gatedClock 0:1013288b8e43 117 /*----------------------------------------------//----------------------------*/
gatedClock 4:67d958cc00e8 118 void ISR_left(void) // increase beat rate.
gatedClock 1:5f41e2df0e85 119 {
gatedClock 3:8ff0c9c853be 120 int dPressedSeconds; // how many seconds joystick pressed.
gatedClock 3:8ff0c9c853be 121 int dMultiCount; // slow count rate.
gatedClock 3:8ff0c9c853be 122 char cDiscontinuity; // 1 = break phase & change BPM now.
gatedClock 3:8ff0c9c853be 123
gatedClock 3:8ff0c9c853be 124 cDiscontinuity = 0; // don't break phase.
gatedClock 3:8ff0c9c853be 125
gatedClock 3:8ff0c9c853be 126 // calculate slow rate period.
gatedClock 3:8ff0c9c853be 127 dMultiCount = (int) ((float) (1.0 / ((float) UDSAMPLERATE)));
gatedClock 3:8ff0c9c853be 128
gatedClock 5:faa6d8a04501 129 while (dJoyStickLeft) // while joystick still pressed.
gatedClock 3:8ff0c9c853be 130 {
gatedClock 3:8ff0c9c853be 131 // rate-range calculations.
gatedClock 3:8ff0c9c853be 132 dPressedSeconds = (int) (((float) lUpDownHowMany) * UDSAMPLERATE);
gatedClock 3:8ff0c9c853be 133 if (dPressedSeconds < 5) {if (!(lUpDownHowMany % dMultiCount)) dMetroBPM ++;}
gatedClock 3:8ff0c9c853be 134 else
gatedClock 3:8ff0c9c853be 135 if (dPressedSeconds < 10) dMetroBPM++;
gatedClock 3:8ff0c9c853be 136 else dMetroBPM += 5;
gatedClock 3:8ff0c9c853be 137 lUpDownHowMany++; // joystick holddown time.
gatedClock 3:8ff0c9c853be 138 }
gatedClock 4:67d958cc00e8 139 lUpDownHowMany = 0; // clear when not up or down.
gatedClock 4:67d958cc00e8 140
gatedClock 4:67d958cc00e8 141 // saturate metronome BPM.
gatedClock 4:67d958cc00e8 142 if (dMetroBPM > METROMAX) dMetroBPM = METROMAX;
gatedClock 4:67d958cc00e8 143 if (dMetroBPM < METROMIN) dMetroBPM = METROMIN;
gatedClock 4:67d958cc00e8 144
gatedClock 4:67d958cc00e8 145 fMetroDelay = 60.0 / (float) (dMetroBPM); // calculate Ticker delay time.
gatedClock 4:67d958cc00e8 146
gatedClock 4:67d958cc00e8 147 if (cDiscontinuity) // implement 60BPS now.
gatedClock 4:67d958cc00e8 148 {
gatedClock 4:67d958cc00e8 149 tickerMetronome.detach(); // only one attachment.
gatedClock 4:67d958cc00e8 150 tickerMetronome.attach(&interrupt_service_M,fMetroDelay);
gatedClock 4:67d958cc00e8 151 }
gatedClock 1:5f41e2df0e85 152 }
gatedClock 1:5f41e2df0e85 153 /*----------------------------------------------//----------------------------*/
gatedClock 4:67d958cc00e8 154 void ISR_right(void) // decrease beat rate.
gatedClock 4:67d958cc00e8 155 {
gatedClock 4:67d958cc00e8 156 int dPressedSeconds; // how many seconds joystick pressed.
gatedClock 4:67d958cc00e8 157 int dMultiCount; // slow count rate.
gatedClock 4:67d958cc00e8 158 char cDiscontinuity; // 1 = break phase & change BPM now.
gatedClock 4:67d958cc00e8 159
gatedClock 4:67d958cc00e8 160 cDiscontinuity = 0; // don't break phase.
gatedClock 4:67d958cc00e8 161
gatedClock 4:67d958cc00e8 162 // calculate slow rate period.
gatedClock 4:67d958cc00e8 163 dMultiCount = (int) ((float) (1.0 / ((float) UDSAMPLERATE)));
gatedClock 5:faa6d8a04501 164 while (dJoyStickRight) // while joystick still pressed.
gatedClock 4:67d958cc00e8 165 {
gatedClock 4:67d958cc00e8 166 // rate-range calculations.
gatedClock 4:67d958cc00e8 167 dPressedSeconds = (int) (((float) lUpDownHowMany) * UDSAMPLERATE);
gatedClock 4:67d958cc00e8 168 if (dPressedSeconds < 5) {if (!(lUpDownHowMany % dMultiCount)) dMetroBPM --;}
gatedClock 4:67d958cc00e8 169 else
gatedClock 4:67d958cc00e8 170 if (dPressedSeconds < 10) dMetroBPM--;
gatedClock 4:67d958cc00e8 171 else dMetroBPM -= 5;
gatedClock 4:67d958cc00e8 172 lUpDownHowMany++; // joystick holddown time.
gatedClock 4:67d958cc00e8 173 }
gatedClock 4:67d958cc00e8 174 lUpDownHowMany = 0; // clear when not up or down.
gatedClock 4:67d958cc00e8 175
gatedClock 4:67d958cc00e8 176 // saturate metronome BPM.
gatedClock 4:67d958cc00e8 177 if (dMetroBPM > METROMAX) dMetroBPM = METROMAX;
gatedClock 4:67d958cc00e8 178 if (dMetroBPM < METROMIN) dMetroBPM = METROMIN;
gatedClock 4:67d958cc00e8 179
gatedClock 4:67d958cc00e8 180 fMetroDelay = 60.0 / (float) (dMetroBPM); // calculate Ticker delay time.
gatedClock 4:67d958cc00e8 181
gatedClock 4:67d958cc00e8 182 if (cDiscontinuity) // implement 60BPS now.
gatedClock 4:67d958cc00e8 183 {
gatedClock 4:67d958cc00e8 184 tickerMetronome.detach(); // only one attachment.
gatedClock 4:67d958cc00e8 185 tickerMetronome.attach(&interrupt_service_M,fMetroDelay);
gatedClock 4:67d958cc00e8 186 }
gatedClock 4:67d958cc00e8 187 }
gatedClock 4:67d958cc00e8 188 /*----------------------------------------------//----------------------------*/
gatedClock 4:67d958cc00e8 189 void ISR_up(void)
gatedClock 1:5f41e2df0e85 190 {
gatedClock 1:5f41e2df0e85 191 }
gatedClock 1:5f41e2df0e85 192 /*----------------------------------------------//----------------------------*/
gatedClock 4:67d958cc00e8 193 void ISR_down(void)
gatedClock 1:5f41e2df0e85 194 {
gatedClock 1:5f41e2df0e85 195 }
gatedClock 1:5f41e2df0e85 196 /*----------------------------------------------//----------------------------*/
gatedClock 3:8ff0c9c853be 197 void ISR_center(void) // set BPM = 60.
gatedClock 1:5f41e2df0e85 198 {
gatedClock 4:67d958cc00e8 199 int dPressedSeconds; // how many seconds joystick pressed.
gatedClock 4:67d958cc00e8 200 int dMultiCount; // slow count rate.
gatedClock 4:67d958cc00e8 201 char cDiscontinuity; // 1 = break phase & change BPM now.
gatedClock 4:67d958cc00e8 202
gatedClock 4:67d958cc00e8 203 if (dJoyStickCenter)
gatedClock 4:67d958cc00e8 204 {
gatedClock 4:67d958cc00e8 205 dMetroBPM = 60; // center-button -> 60BPM.
gatedClock 4:67d958cc00e8 206 cDiscontinuity = 1; // pending phase-break.
gatedClock 4:67d958cc00e8 207 }
gatedClock 4:67d958cc00e8 208
gatedClock 4:67d958cc00e8 209 fMetroDelay = 60.0 / (float) (dMetroBPM); // calculate Ticker delay time.
gatedClock 4:67d958cc00e8 210
gatedClock 4:67d958cc00e8 211 if (cDiscontinuity) // implement 60BPS now.
gatedClock 4:67d958cc00e8 212 {
gatedClock 4:67d958cc00e8 213 tickerMetronome.detach(); // only one attachment.
gatedClock 4:67d958cc00e8 214 tickerMetronome.attach(&interrupt_service_M,fMetroDelay);
gatedClock 4:67d958cc00e8 215 }
gatedClock 4:67d958cc00e8 216
gatedClock 1:5f41e2df0e85 217 }
gatedClock 1:5f41e2df0e85 218 /*----------------------------------------------//----------------------------*/
gatedClock 0:1013288b8e43 219 void lcd_display(void) // display metronome info.
gatedClock 0:1013288b8e43 220 {
gatedClock 0:1013288b8e43 221 lcd.cls(); // clear display.
gatedClock 0:1013288b8e43 222
gatedClock 0:1013288b8e43 223 LCD1; // line 1.
gatedClock 0:1013288b8e43 224 lcd.printf(" METRONOME");
gatedClock 0:1013288b8e43 225
gatedClock 0:1013288b8e43 226 LCD2; // line 2.
gatedClock 0:1013288b8e43 227
gatedClock 0:1013288b8e43 228 if (dMetroBPM == METROMIN) // BPM, with saturation notification.
gatedClock 0:1013288b8e43 229 lcd.printf(" %5.2d BPM minimum",dMetroBPM);
gatedClock 0:1013288b8e43 230 else
gatedClock 0:1013288b8e43 231 if (dMetroBPM == METROMAX)
gatedClock 0:1013288b8e43 232 lcd.printf(" %5.2d BPM maximum",dMetroBPM);
gatedClock 0:1013288b8e43 233 else
gatedClock 0:1013288b8e43 234 lcd.printf(" %5.2d BPM",dMetroBPM);
gatedClock 0:1013288b8e43 235
gatedClock 0:1013288b8e43 236 LCD3; // line 3.
gatedClock 0:1013288b8e43 237
gatedClock 0:1013288b8e43 238 lcd.printf(" RTOS HW 3 PART 1");
gatedClock 0:1013288b8e43 239 }
gatedClock 0:1013288b8e43 240 /*----------------------------------------------//----------------------------*/
gatedClock 0:1013288b8e43 241 // this metronome tick ISR will self-adjust to the current user-selected
gatedClock 0:1013288b8e43 242 // metronome rate. that has to be done here, and at the start of the function,
gatedClock 0:1013288b8e43 243 // in order to maintain a constant phase and to prevent a beat-skip.
gatedClock 0:1013288b8e43 244
gatedClock 0:1013288b8e43 245 void interrupt_service_M() // metronome tick.
gatedClock 0:1013288b8e43 246 {
gatedClock 0:1013288b8e43 247 tickerMetronome.detach(); // only one attachment.
gatedClock 0:1013288b8e43 248 tickerMetronome.attach(&interrupt_service_M,fMetroDelay);
gatedClock 0:1013288b8e43 249 led3 = 1;
gatedClock 0:1013288b8e43 250 timeoutDutyCycle.attach(&led3_off,fMetroDuty);
gatedClock 0:1013288b8e43 251 }
gatedClock 0:1013288b8e43 252 /*----------------------------------------------//----------------------------*/
gatedClock 0:1013288b8e43 253 // this routine measures the number of seconds for which the joystick is
gatedClock 0:1013288b8e43 254 // in the up or down position. for three ranges of time, three different
gatedClock 0:1013288b8e43 255 // BPM rates-of-change are used. This means that as the user controls the
gatedClock 0:1013288b8e43 256 // metronome rate using the joystick, at first it will change slowly, then
gatedClock 0:1013288b8e43 257 // it will change at a moderate speed, then it will change quickly.
gatedClock 0:1013288b8e43 258 // additionally, pressing the center joystick button will bring the metronome
gatedClock 0:1013288b8e43 259 // back to 60BPM immediately, breaking BPM phase continuity.
gatedClock 0:1013288b8e43 260 void interrupt_service_UD(void) // joystick up/down sample
gatedClock 0:1013288b8e43 261 {
gatedClock 0:1013288b8e43 262 int dPressedSeconds; // how many seconds joystick pressed.
gatedClock 0:1013288b8e43 263 int dMultiCount; // slow count rate.
gatedClock 0:1013288b8e43 264 char cDiscontinuity; // 1 = break phase & change BPM now.
gatedClock 0:1013288b8e43 265
gatedClock 0:1013288b8e43 266 cDiscontinuity = 0; // don't break phase.
gatedClock 0:1013288b8e43 267
gatedClock 0:1013288b8e43 268 // calculate slow rate period.
gatedClock 0:1013288b8e43 269 dMultiCount = (int) ((float) (1.0 / ((float) UDSAMPLERATE)));
gatedClock 0:1013288b8e43 270
gatedClock 3:8ff0c9c853be 271 if (dJoyStickUp) // joystick up.
gatedClock 0:1013288b8e43 272 {
gatedClock 0:1013288b8e43 273 // rate-range calculations.
gatedClock 0:1013288b8e43 274 dPressedSeconds = (int) (((float) lUpDownHowMany) * UDSAMPLERATE);
gatedClock 0:1013288b8e43 275 if (dPressedSeconds < 5) {if (!(lUpDownHowMany % dMultiCount)) dMetroBPM ++;}
gatedClock 0:1013288b8e43 276 else
gatedClock 0:1013288b8e43 277 if (dPressedSeconds < 10) dMetroBPM++;
gatedClock 0:1013288b8e43 278 else dMetroBPM += 5;
gatedClock 0:1013288b8e43 279 lUpDownHowMany++; // joystick holddown time.
gatedClock 0:1013288b8e43 280 }
gatedClock 0:1013288b8e43 281 else
gatedClock 3:8ff0c9c853be 282 if (dJoyStickDown) // joystick down.
gatedClock 0:1013288b8e43 283 {
gatedClock 0:1013288b8e43 284 // rate-range calculations.
gatedClock 0:1013288b8e43 285 dPressedSeconds = (int) (((float) lUpDownHowMany) * UDSAMPLERATE);
gatedClock 0:1013288b8e43 286 if (dPressedSeconds < 5) {if (!(lUpDownHowMany % dMultiCount)) dMetroBPM --;}
gatedClock 0:1013288b8e43 287 else
gatedClock 0:1013288b8e43 288 if (dPressedSeconds < 10) dMetroBPM--;
gatedClock 0:1013288b8e43 289 else dMetroBPM -= 5;
gatedClock 0:1013288b8e43 290 lUpDownHowMany++; // joystick holddown time.
gatedClock 0:1013288b8e43 291 }
gatedClock 0:1013288b8e43 292 else lUpDownHowMany = 0; // clear when not up or down.
gatedClock 0:1013288b8e43 293
gatedClock 3:8ff0c9c853be 294 if (dJoyStickCenter)
gatedClock 0:1013288b8e43 295 {
gatedClock 0:1013288b8e43 296 dMetroBPM = 60; // center-button -> 60BPM.
gatedClock 0:1013288b8e43 297 cDiscontinuity = 1; // pending phase-break.
gatedClock 0:1013288b8e43 298 }
gatedClock 0:1013288b8e43 299 // saturate metronome BPM.
gatedClock 0:1013288b8e43 300 if (dMetroBPM > METROMAX) dMetroBPM = METROMAX;
gatedClock 0:1013288b8e43 301 if (dMetroBPM < METROMIN) dMetroBPM = METROMIN;
gatedClock 0:1013288b8e43 302
gatedClock 0:1013288b8e43 303 fMetroDelay = 60.0 / (float) (dMetroBPM); // calculate Ticker delay time.
gatedClock 0:1013288b8e43 304
gatedClock 0:1013288b8e43 305 if (cDiscontinuity) // implement 60BPS now.
gatedClock 0:1013288b8e43 306 {
gatedClock 0:1013288b8e43 307 tickerMetronome.detach(); // only one attachment.
gatedClock 0:1013288b8e43 308 tickerMetronome.attach(&interrupt_service_M,fMetroDelay);
gatedClock 0:1013288b8e43 309 }
gatedClock 0:1013288b8e43 310
gatedClock 0:1013288b8e43 311 }
gatedClock 0:1013288b8e43 312 /*----------------------------------------------//----------------------------*/
gatedClock 0:1013288b8e43 313 void led3_off(void) {led3 = 0;} // turn off the LED.
gatedClock 0:1013288b8e43 314 /*----------------------------------------------//----------------------------*/
gatedClock 0:1013288b8e43 315 void led3_on( void) {led3 = 1;} // turn on the led.
gatedClock 0:1013288b8e43 316 /*----------------------------------------------//----------------------------*/