RTOS homework 4

Dependencies:   C12832_lcd mbed

Committer:
gatedClock
Date:
Sun Aug 18 19:35:56 2013 +0000
Revision:
18:f19721f1069e
Parent:
17:cd6c76be8046
Child:
19:0db1451d19ef
neatening.

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 18:f19721f1069e 10
gatedClock 0:1013288b8e43 11
gatedClock 0:1013288b8e43 12 controls:
gatedClock 0:1013288b8e43 13 1. joystick-up - increase metronome rate.
gatedClock 0:1013288b8e43 14 2. joystick-down - decrease metronome rate.
gatedClock 0:1013288b8e43 15 3. joystick-center - set metronome to 60BPM.
gatedClock 0:1013288b8e43 16
gatedClock 0:1013288b8e43 17 notes:
gatedClock 0:1013288b8e43 18
gatedClock 0:1013288b8e43 19 testing:
gatedClock 18:f19721f1069e 20
gatedClock 0:1013288b8e43 21
gatedClock 0:1013288b8e43 22 -----includes-----------------------------------//----------------------------*/
gatedClock 0:1013288b8e43 23 #include "mbed.h" // mbed class.
gatedClock 15:7c0a94d2a439 24 // #include "rtos.h"
gatedClock 14:fb4c76ac43a1 25 #include "C12832_lcd.h" // LCD class.
gatedClock 0:1013288b8e43 26 //---defines------------------------------------//------------------------------
gatedClock 0:1013288b8e43 27 #define LCD1 lcd.locate(0, 0); // LCD line 1.
gatedClock 0:1013288b8e43 28 #define LCD2 lcd.locate(0,11); // LCD line 2.
gatedClock 0:1013288b8e43 29 #define LCD3 lcd.locate(0,22); // LCD line 3.
gatedClock 7:562f136c7681 30
gatedClock 0:1013288b8e43 31 #define METROMAX 800 // max. beats per minute.
gatedClock 0:1013288b8e43 32 #define METROMIN 8 // min. beats per minute.
gatedClock 17:cd6c76be8046 33 #define METROTIME 10.0
gatedClock 0:1013288b8e43 34 #define UDSAMPLERATE 0.1 // how often to sample U/D joystick.
gatedClock 0:1013288b8e43 35 #define LCDSAMPLERATE 0.1 // how often to redraw the LCD.
gatedClock 0:1013288b8e43 36 #define PULSELENGTH 0.0625 // how long the LED-on-time is.
gatedClock 10:4f2fa66cc430 37 #define DEBOUNCE 0.16 // debounce pause duration in S.
gatedClock 0:1013288b8e43 38 //--global_definitions--------------------------//------------------------------
gatedClock 0:1013288b8e43 39 //--global_variables----------------------------//------------------------------
gatedClock 0:1013288b8e43 40 float fMetroDelay; // time between ticks, in seconds.
gatedClock 0:1013288b8e43 41 float fMetroDuty; // duration of metro high, in seconds.
gatedClock 0:1013288b8e43 42 int dMetroBPM; // master parameter.
gatedClock 0:1013288b8e43 43 long lUpDownHowMany; // count how long up/down joystick pressed.
gatedClock 12:fab8e658ae76 44 char cMetronomeOn; // 1 = allow blink.
gatedClock 0:1013288b8e43 45 //--global_instances----------------------------//------------------------------
gatedClock 18:f19721f1069e 46 C12832_LCD lcd; // LCD object.
gatedClock 0:1013288b8e43 47
gatedClock 18:f19721f1069e 48 InterruptIn iJoyStickUp (p15); // joystick up rising edge.
gatedClock 18:f19721f1069e 49 InterruptIn iJoyStickDown (p12); // joystick down rising edge.
gatedClock 18:f19721f1069e 50 InterruptIn iJoyStickLeft (p13); // joystick left rising edge.
gatedClock 18:f19721f1069e 51 InterruptIn iJoyStickRight (p16); // joystick right rising edge.
gatedClock 18:f19721f1069e 52 InterruptIn iJoyStickCenter(p14); // 1 if joystick middle pressed.
gatedClock 0:1013288b8e43 53
gatedClock 0:1013288b8e43 54 DigitalOut led3(LED1); // leftmost LED.
gatedClock 0:1013288b8e43 55
gatedClock 0:1013288b8e43 56 Ticker tickerMetronome; // blinking LED.
gatedClock 0:1013288b8e43 57 Ticker tickerJoystickUD; // joystick up/down sample.
gatedClock 0:1013288b8e43 58 Ticker tickerLCD; // display ticker.
gatedClock 0:1013288b8e43 59 Timeout timeoutDutyCycle; // LED duty cycle delay.
gatedClock 12:fab8e658ae76 60 Timeout timeoutMetronome;
gatedClock 0:1013288b8e43 61 //-------prototypes-----------------------------//------------------------------
gatedClock 0:1013288b8e43 62 void initialization(); // initialize settings.
gatedClock 0:1013288b8e43 63 void lcd_display(); // display on LCD.
gatedClock 18:f19721f1069e 64 void interrupt_service_M(); // metronome tick.
gatedClock 0:1013288b8e43 65 void led3_off(); // attachable LED control.
gatedClock 0:1013288b8e43 66 void led3_on(); // attachable LED control.
gatedClock 18:f19721f1069e 67 void ISR_up(); // stop metronome.
gatedClock 18:f19721f1069e 68 void ISR_down(); // start metronome.
gatedClock 18:f19721f1069e 69 void ISR_right_rising(); // decrease BPM.
gatedClock 18:f19721f1069e 70 void ISR_right_falling(); // bounce protection.
gatedClock 18:f19721f1069e 71 void ISR_left_rising(); // increase BPM.
gatedClock 18:f19721f1069e 72 void ISR_left_falling(); // bounce protection.
gatedClock 18:f19721f1069e 73 void ISR_center(); // set to 60BPM.
gatedClock 18:f19721f1069e 74 void turn_off_metronome(); // turn off blinker.
gatedClock 0:1013288b8e43 75 //==============================================//==============================
gatedClock 0:1013288b8e43 76 int main(void)
gatedClock 0:1013288b8e43 77 {
gatedClock 18:f19721f1069e 78 iJoyStickUp.rise (&ISR_up); // metronome stop.
gatedClock 18:f19721f1069e 79 iJoyStickDown.rise (&ISR_down); // metronome start.
gatedClock 11:e764ed79553a 80
gatedClock 18:f19721f1069e 81 iJoyStickLeft.rise (&ISR_left_rising); // increase BPM.
gatedClock 18:f19721f1069e 82 iJoyStickLeft.fall (&ISR_left_falling); // anti-bounce.
gatedClock 10:4f2fa66cc430 83
gatedClock 18:f19721f1069e 84 iJoyStickRight.rise(&ISR_right_rising); // decrease BPM.
gatedClock 18:f19721f1069e 85 iJoyStickRight.fall(&ISR_right_falling); // anti-bounce.
gatedClock 10:4f2fa66cc430 86
gatedClock 18:f19721f1069e 87 iJoyStickCenter.rise(&ISR_center); // 60BPM.
gatedClock 6:bb5f989e3425 88
gatedClock 18:f19721f1069e 89 initialization(); // initialize variables.
gatedClock 6:bb5f989e3425 90
gatedClock 18:f19721f1069e 91 // metronome ticker.
gatedClock 15:7c0a94d2a439 92 tickerMetronome.attach(&interrupt_service_M,fMetroDelay);
gatedClock 6:bb5f989e3425 93
gatedClock 15:7c0a94d2a439 94 // LCD ticker.
gatedClock 15:7c0a94d2a439 95 tickerLCD.attach(&lcd_display,LCDSAMPLERATE);
gatedClock 6:bb5f989e3425 96
gatedClock 18:f19721f1069e 97 while(1) // all timer/interrupt driven.
gatedClock 6:bb5f989e3425 98 {
gatedClock 6:bb5f989e3425 99 wait(10.0);
gatedClock 6:bb5f989e3425 100 }
gatedClock 0:1013288b8e43 101 }
gatedClock 0:1013288b8e43 102 /*----------------------------------------------//----------------------------*/
gatedClock 0:1013288b8e43 103 void initialization(void) // program initializations.
gatedClock 0:1013288b8e43 104 {
gatedClock 0:1013288b8e43 105 dMetroBPM = 60; // initialize to 60BPM.
gatedClock 0:1013288b8e43 106 fMetroDelay = 60.0 / (float) (dMetroBPM);
gatedClock 0:1013288b8e43 107 fMetroDuty = PULSELENGTH; // initialize LED on-duration.
gatedClock 18:f19721f1069e 108 // lUpDownHowMany = 0;
gatedClock 17:cd6c76be8046 109 cMetronomeOn = 0;
gatedClock 0:1013288b8e43 110 }
gatedClock 0:1013288b8e43 111 /*----------------------------------------------//----------------------------*/
gatedClock 11:e764ed79553a 112 void ISR_left_rising(void) // increase BPM.
gatedClock 1:5f41e2df0e85 113 {
gatedClock 18:f19721f1069e 114 __disable_irq(); // anti-bounce.
gatedClock 11:e764ed79553a 115
gatedClock 11:e764ed79553a 116 dMetroBPM++; // increase BPM.
gatedClock 11:e764ed79553a 117
gatedClock 12:fab8e658ae76 118 // saturate metronome BPM.
gatedClock 12:fab8e658ae76 119 if (dMetroBPM > METROMAX) dMetroBPM = METROMAX;
gatedClock 12:fab8e658ae76 120 if (dMetroBPM < METROMIN) dMetroBPM = METROMIN;
gatedClock 12:fab8e658ae76 121
gatedClock 11:e764ed79553a 122 wait(DEBOUNCE); // debounce time.
gatedClock 11:e764ed79553a 123
gatedClock 18:f19721f1069e 124 __enable_irq(); // safe by now.
gatedClock 1:5f41e2df0e85 125 }
gatedClock 1:5f41e2df0e85 126 /*----------------------------------------------//----------------------------*/
gatedClock 11:e764ed79553a 127 void ISR_left_falling(void) // ignore rising after falling edge.
gatedClock 11:e764ed79553a 128 {
gatedClock 18:f19721f1069e 129 __disable_irq(); // anti-bounce.
gatedClock 11:e764ed79553a 130
gatedClock 11:e764ed79553a 131 wait(DEBOUNCE); // debounce time.
gatedClock 11:e764ed79553a 132
gatedClock 18:f19721f1069e 133 __enable_irq(); // safe by now.
gatedClock 11:e764ed79553a 134 }
gatedClock 11:e764ed79553a 135 /*----------------------------------------------//----------------------------*/
gatedClock 10:4f2fa66cc430 136 void ISR_right_rising(void) // decrease BPM.
gatedClock 4:67d958cc00e8 137 {
gatedClock 18:f19721f1069e 138 __disable_irq(); // anti-bounce.
gatedClock 10:4f2fa66cc430 139
gatedClock 10:4f2fa66cc430 140 dMetroBPM--; // decrease BPM.
gatedClock 4:67d958cc00e8 141
gatedClock 12:fab8e658ae76 142 // saturate metronome BPM.
gatedClock 12:fab8e658ae76 143 if (dMetroBPM > METROMAX) dMetroBPM = METROMAX;
gatedClock 12:fab8e658ae76 144 if (dMetroBPM < METROMIN) dMetroBPM = METROMIN;
gatedClock 12:fab8e658ae76 145
gatedClock 10:4f2fa66cc430 146 wait(DEBOUNCE); // debounce time.
gatedClock 9:ea97a69b9b93 147
gatedClock 18:f19721f1069e 148 __enable_irq(); // safe by now.
gatedClock 10:4f2fa66cc430 149 }
gatedClock 10:4f2fa66cc430 150 /*----------------------------------------------//----------------------------*/
gatedClock 10:4f2fa66cc430 151 void ISR_right_falling(void) // ignore rising after falling edge.
gatedClock 10:4f2fa66cc430 152 {
gatedClock 18:f19721f1069e 153 __disable_irq(); // anti-bounce.
gatedClock 10:4f2fa66cc430 154
gatedClock 10:4f2fa66cc430 155 wait(DEBOUNCE); // debounce time.
gatedClock 10:4f2fa66cc430 156
gatedClock 18:f19721f1069e 157 __enable_irq(); // safe by now.
gatedClock 4:67d958cc00e8 158 }
gatedClock 4:67d958cc00e8 159 /*----------------------------------------------//----------------------------*/
gatedClock 18:f19721f1069e 160 void ISR_up(void) // turn off metronome.
gatedClock 1:5f41e2df0e85 161 {
gatedClock 17:cd6c76be8046 162 cMetronomeOn = 0;
gatedClock 1:5f41e2df0e85 163 }
gatedClock 1:5f41e2df0e85 164 /*----------------------------------------------//----------------------------*/
gatedClock 18:f19721f1069e 165 void ISR_down(void) // metronome on with timeout.
gatedClock 1:5f41e2df0e85 166 {
gatedClock 12:fab8e658ae76 167 cMetronomeOn = 1;
gatedClock 12:fab8e658ae76 168 timeoutMetronome.detach();
gatedClock 17:cd6c76be8046 169 timeoutMetronome.attach(&turn_off_metronome,METROTIME);
gatedClock 1:5f41e2df0e85 170 }
gatedClock 1:5f41e2df0e85 171 /*----------------------------------------------//----------------------------*/
gatedClock 3:8ff0c9c853be 172 void ISR_center(void) // set BPM = 60.
gatedClock 1:5f41e2df0e85 173 {
gatedClock 8:95f4f470ae28 174 dMetroBPM = 60;
gatedClock 1:5f41e2df0e85 175 }
gatedClock 1:5f41e2df0e85 176 /*----------------------------------------------//----------------------------*/
gatedClock 0:1013288b8e43 177 void lcd_display(void) // display metronome info.
gatedClock 0:1013288b8e43 178 {
gatedClock 0:1013288b8e43 179 lcd.cls(); // clear display.
gatedClock 0:1013288b8e43 180
gatedClock 0:1013288b8e43 181 LCD1; // line 1.
gatedClock 17:cd6c76be8046 182
gatedClock 16:d7bbd641929c 183 if (cMetronomeOn)
gatedClock 16:d7bbd641929c 184 lcd.printf(" metronome ON");
gatedClock 16:d7bbd641929c 185 else
gatedClock 16:d7bbd641929c 186 lcd.printf(" metronome OFF");
gatedClock 0:1013288b8e43 187
gatedClock 0:1013288b8e43 188 LCD2; // line 2.
gatedClock 0:1013288b8e43 189
gatedClock 0:1013288b8e43 190 if (dMetroBPM == METROMIN) // BPM, with saturation notification.
gatedClock 0:1013288b8e43 191 lcd.printf(" %5.2d BPM minimum",dMetroBPM);
gatedClock 0:1013288b8e43 192 else
gatedClock 0:1013288b8e43 193 if (dMetroBPM == METROMAX)
gatedClock 0:1013288b8e43 194 lcd.printf(" %5.2d BPM maximum",dMetroBPM);
gatedClock 0:1013288b8e43 195 else
gatedClock 0:1013288b8e43 196 lcd.printf(" %5.2d BPM",dMetroBPM);
gatedClock 0:1013288b8e43 197
gatedClock 0:1013288b8e43 198 LCD3; // line 3.
gatedClock 0:1013288b8e43 199
gatedClock 8:95f4f470ae28 200 lcd.printf(" RTOS HW 4");
gatedClock 0:1013288b8e43 201 }
gatedClock 0:1013288b8e43 202 /*----------------------------------------------//----------------------------*/
gatedClock 17:cd6c76be8046 203 // this metronome tick ISR will self-adjust to the current user-selected
gatedClock 17:cd6c76be8046 204 // metronome rate. that has to be done here, and at the start of the function,
gatedClock 17:cd6c76be8046 205 // in order to maintain a constant phase and to prevent a beat-skip.
gatedClock 17:cd6c76be8046 206
gatedClock 17:cd6c76be8046 207 void interrupt_service_M() // metronome tick.
gatedClock 17:cd6c76be8046 208 {
gatedClock 17:cd6c76be8046 209 if (cMetronomeOn)
gatedClock 17:cd6c76be8046 210 {
gatedClock 18:f19721f1069e 211 tickerMetronome.detach(); // only one attachment.
gatedClock 17:cd6c76be8046 212 tickerMetronome.attach(&interrupt_service_M,fMetroDelay);
gatedClock 17:cd6c76be8046 213 led3_on();
gatedClock 17:cd6c76be8046 214 timeoutDutyCycle.attach(&led3_off,fMetroDuty);
gatedClock 17:cd6c76be8046 215 } else led3_off();
gatedClock 17:cd6c76be8046 216 }
gatedClock 17:cd6c76be8046 217 /*----------------------------------------------//----------------------------*/
gatedClock 18:f19721f1069e 218 void turn_off_metronome(void) // turn off metronome.
gatedClock 17:cd6c76be8046 219 {
gatedClock 17:cd6c76be8046 220 cMetronomeOn = 0;
gatedClock 17:cd6c76be8046 221 }
gatedClock 17:cd6c76be8046 222 /*----------------------------------------------//----------------------------*/
gatedClock 0:1013288b8e43 223 void led3_off(void) {led3 = 0;} // turn off the LED.
gatedClock 0:1013288b8e43 224 /*----------------------------------------------//----------------------------*/
gatedClock 0:1013288b8e43 225 void led3_on( void) {led3 = 1;} // turn on the led.
gatedClock 15:7c0a94d2a439 226 /*----------------------------------------------//----------------------------*/