ECE3872 HW/SW Project Code
Dependencies: mbed Servo mbed-rtos 4DGL-uLCD-SE PinDetect X_NUCLEO_53L0A1
main.cpp@7:f5f265b139fe, 2020-04-07 (annotated)
- Committer:
- nnguyen99
- Date:
- Tue Apr 07 16:06:39 2020 +0000
- Revision:
- 7:f5f265b139fe
- Parent:
- 5:d34d14d33a89
State machine updates
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
nnguyen99 | 3:7486869c8027 | 1 | #include "mbed.h" |
nnguyen99 | 5:d34d14d33a89 | 2 | #include <iostream> |
trmontgomery | 4:1790aa9234a3 | 3 | #include "audio_out.h" |
nnguyen99 | 5:d34d14d33a89 | 4 | #include "PinDetect.h" |
nnguyen99 | 5:d34d14d33a89 | 5 | #include "uLCD_4DGL.h" |
nnguyen99 | 7:f5f265b139fe | 6 | DigitalOut myled1(LED1); DigitalOut myled2(LED2); DigitalOut myled3(LED3); DigitalOut myled4(LED4); |
nnguyen99 | 5:d34d14d33a89 | 7 | // LCD init |
nnguyen99 | 5:d34d14d33a89 | 8 | uLCD_4DGL guLCD(p28, p27, p29); // serial tx, serial rx, reset pin; |
nnguyen99 | 5:d34d14d33a89 | 9 | // Push buttons init |
nnguyen99 | 5:d34d14d33a89 | 10 | PinDetect pb1(p16); |
nnguyen99 | 5:d34d14d33a89 | 11 | PinDetect pb2(p17); |
nnguyen99 | 5:d34d14d33a89 | 12 | PinDetect pb3(p18); |
nnguyen99 | 5:d34d14d33a89 | 13 | PinDetect pb4(p19); |
nnguyen99 | 3:7486869c8027 | 14 | // States |
nnguyen99 | 7:f5f265b139fe | 15 | |
nnguyen99 | 3:7486869c8027 | 16 | // State Machine control global variables |
nnguyen99 | 3:7486869c8027 | 17 | bool X; //reset |
nnguyen99 | 3:7486869c8027 | 18 | bool P; //play |
nnguyen99 | 3:7486869c8027 | 19 | bool S; //stop |
nnguyen99 | 3:7486869c8027 | 20 | bool R; //record |
nnguyen99 | 3:7486869c8027 | 21 | bool E; //erase |
nnguyen99 | 3:7486869c8027 | 22 | |
nnguyen99 | 5:d34d14d33a89 | 23 | enum sm_state {sRESET, sSTOP, sRECORD, sPLAY, sERASE}; |
nnguyen99 | 3:7486869c8027 | 24 | |
nnguyen99 | 3:7486869c8027 | 25 | |
nnguyen99 | 3:7486869c8027 | 26 | void reset(){ |
nnguyen99 | 3:7486869c8027 | 27 | /* reset state: |
nnguyen99 | 3:7486869c8027 | 28 | Initial state upon powering up the device |
nnguyen99 | 3:7486869c8027 | 29 | 1. Cease all motion |
nnguyen99 | 3:7486869c8027 | 30 | 2. Reset all motors to initial position |
nnguyen99 | 3:7486869c8027 | 31 | 3. Mutes all audio |
nnguyen99 | 3:7486869c8027 | 32 | 4. Goes to erase state if reset button is held down for at least 3 seconds |
nnguyen99 | 3:7486869c8027 | 33 | 5. Goes to stop state according to rotary switch input |
nnguyen99 | 3:7486869c8027 | 34 | 6. LED goes from green to red |
nnguyen99 | 3:7486869c8027 | 35 | NOTE: ONLY exits to stop or erase state |
nnguyen99 | 3:7486869c8027 | 36 | */ |
nnguyen99 | 3:7486869c8027 | 37 | } |
nnguyen99 | 3:7486869c8027 | 38 | void stop(){ |
nnguyen99 | 3:7486869c8027 | 39 | /* stop state: |
nnguyen99 | 3:7486869c8027 | 40 | Initiated by rotary switch |
nnguyen99 | 3:7486869c8027 | 41 | 1. Cease all motion |
nnguyen99 | 3:7486869c8027 | 42 | 2. Stop recording |
nnguyen99 | 3:7486869c8027 | 43 | 3. Mute all audio |
nnguyen99 | 3:7486869c8027 | 44 | */ |
nnguyen99 | 3:7486869c8027 | 45 | } |
nnguyen99 | 3:7486869c8027 | 46 | void record(){ |
nnguyen99 | 3:7486869c8027 | 47 | /* record state: |
nnguyen99 | 3:7486869c8027 | 48 | Initiated by rotary switch |
nnguyen99 | 3:7486869c8027 | 49 | 1. Cease all motion |
nnguyen99 | 3:7486869c8027 | 50 | 2. Begin recording ToF inputs (distance and time) |
nnguyen99 | 3:7486869c8027 | 51 | 3. Convert distances to corresponding audio frequencies |
nnguyen99 | 3:7486869c8027 | 52 | 4. Append to list of frequencies |
nnguyen99 | 3:7486869c8027 | 53 | 5. |
nnguyen99 | 3:7486869c8027 | 54 | */ |
nnguyen99 | 3:7486869c8027 | 55 | } |
nnguyen99 | 3:7486869c8027 | 56 | void play(){ |
nnguyen99 | 3:7486869c8027 | 57 | /* play state: |
nnguyen99 | 3:7486869c8027 | 58 | Initiated by rotary switch |
nnguyen99 | 3:7486869c8027 | 59 | 1. wait a few seconds |
nnguyen99 | 3:7486869c8027 | 60 | 2. begin reading list of frequencies while concurrently: |
nnguyen99 | 3:7486869c8027 | 61 | - moving servo motors accordingly |
nnguyen99 | 3:7486869c8027 | 62 | - playing corresponding sounds |
nnguyen99 | 3:7486869c8027 | 63 | */ |
nnguyen99 | 3:7486869c8027 | 64 | } |
nnguyen99 | 3:7486869c8027 | 65 | void erase(){ |
nnguyen99 | 3:7486869c8027 | 66 | /* erase state: |
nnguyen99 | 3:7486869c8027 | 67 | erases entire audio recording |
nnguyen99 | 3:7486869c8027 | 68 | */ |
nnguyen99 | 3:7486869c8027 | 69 | } |
nnguyen99 | 3:7486869c8027 | 70 | |
nnguyen99 | 7:f5f265b139fe | 71 | |
nnguyen99 | 7:f5f265b139fe | 72 | void pb1_hit_callback (void) |
nnguyen99 | 7:f5f265b139fe | 73 | { |
nnguyen99 | 7:f5f265b139fe | 74 | guLCD.printf("REEST"); |
nnguyen99 | 7:f5f265b139fe | 75 | X = 1; |
nnguyen99 | 7:f5f265b139fe | 76 | } |
nnguyen99 | 7:f5f265b139fe | 77 | |
nnguyen99 | 7:f5f265b139fe | 78 | void pb2_hit_callback (void) |
nnguyen99 | 7:f5f265b139fe | 79 | { |
nnguyen99 | 7:f5f265b139fe | 80 | guLCD.printf("STOP"); |
nnguyen99 | 7:f5f265b139fe | 81 | P = 1; |
nnguyen99 | 7:f5f265b139fe | 82 | } |
nnguyen99 | 7:f5f265b139fe | 83 | |
nnguyen99 | 7:f5f265b139fe | 84 | void pb3_hit_callback (void) |
nnguyen99 | 7:f5f265b139fe | 85 | { |
nnguyen99 | 7:f5f265b139fe | 86 | guLCD.printf("RECORD"); |
nnguyen99 | 7:f5f265b139fe | 87 | S = 1; |
nnguyen99 | 7:f5f265b139fe | 88 | } |
nnguyen99 | 7:f5f265b139fe | 89 | |
nnguyen99 | 7:f5f265b139fe | 90 | void pb4_hit_callback (void) |
nnguyen99 | 7:f5f265b139fe | 91 | { |
nnguyen99 | 7:f5f265b139fe | 92 | guLCD.printf("PLAY"); |
nnguyen99 | 7:f5f265b139fe | 93 | R = 1; |
nnguyen99 | 7:f5f265b139fe | 94 | } |
nnguyen99 | 7:f5f265b139fe | 95 | |
nnguyen99 | 5:d34d14d33a89 | 96 | void hardware_init(){ |
nnguyen99 | 5:d34d14d33a89 | 97 | // Push buttons init |
nnguyen99 | 5:d34d14d33a89 | 98 | pb1.mode(PullUp); |
nnguyen99 | 5:d34d14d33a89 | 99 | pb2.mode(PullUp); |
nnguyen99 | 5:d34d14d33a89 | 100 | pb3.mode(PullUp); |
nnguyen99 | 5:d34d14d33a89 | 101 | pb4.mode(PullUp); |
nnguyen99 | 7:f5f265b139fe | 102 | // Delay for initial pullup to take effect |
nnguyen99 | 7:f5f265b139fe | 103 | wait(.01); |
nnguyen99 | 5:d34d14d33a89 | 104 | pb1.attach_deasserted(&pb1_hit_callback); |
nnguyen99 | 5:d34d14d33a89 | 105 | pb2.attach_deasserted(&pb2_hit_callback); |
nnguyen99 | 5:d34d14d33a89 | 106 | pb3.attach_deasserted(&pb3_hit_callback); |
nnguyen99 | 5:d34d14d33a89 | 107 | pb4.attach_deasserted(&pb4_hit_callback); |
nnguyen99 | 7:f5f265b139fe | 108 | |
nnguyen99 | 7:f5f265b139fe | 109 | guLCD.display_control(LANDSCAPE); |
nnguyen99 | 7:f5f265b139fe | 110 | guLCD.background_color(BLACK); |
nnguyen99 | 7:f5f265b139fe | 111 | guLCD.cls(); |
nnguyen99 | 7:f5f265b139fe | 112 | guLCD.baudrate(BAUD_1000000); //jack up baud rate to max for fast display |
nnguyen99 | 7:f5f265b139fe | 113 | wait(1.0); |
nnguyen99 | 5:d34d14d33a89 | 114 | pb1.setSampleFrequency(); |
nnguyen99 | 5:d34d14d33a89 | 115 | pb2.setSampleFrequency(); |
nnguyen99 | 5:d34d14d33a89 | 116 | pb3.setSampleFrequency(); |
nnguyen99 | 5:d34d14d33a89 | 117 | pb4.setSampleFrequency(); |
nnguyen99 | 5:d34d14d33a89 | 118 | } |
trmontgomery | 4:1790aa9234a3 | 119 | void state_machine_mgr(){ |
nnguyen99 | 3:7486869c8027 | 120 | sm_state curr_state = sRESET; |
nnguyen99 | 7:f5f265b139fe | 121 | X = !X; |
nnguyen99 | 3:7486869c8027 | 122 | while(1) { |
nnguyen99 | 3:7486869c8027 | 123 | switch(curr_state){ |
nnguyen99 | 3:7486869c8027 | 124 | case sRESET: |
nnguyen99 | 7:f5f265b139fe | 125 | S = 0; |
nnguyen99 | 7:f5f265b139fe | 126 | R = 0; |
nnguyen99 | 7:f5f265b139fe | 127 | E = 0; |
nnguyen99 | 7:f5f265b139fe | 128 | P = 0; |
nnguyen99 | 3:7486869c8027 | 129 | if(S) curr_state = sSTOP; |
nnguyen99 | 3:7486869c8027 | 130 | break; |
nnguyen99 | 3:7486869c8027 | 131 | case sSTOP: |
nnguyen99 | 7:f5f265b139fe | 132 | X = 0; |
nnguyen99 | 7:f5f265b139fe | 133 | R = 0; |
nnguyen99 | 7:f5f265b139fe | 134 | E = 0; |
nnguyen99 | 7:f5f265b139fe | 135 | P = 0; |
nnguyen99 | 3:7486869c8027 | 136 | if(X){ |
nnguyen99 | 3:7486869c8027 | 137 | curr_state = sRESET; |
nnguyen99 | 3:7486869c8027 | 138 | }else if(S&R){ |
nnguyen99 | 3:7486869c8027 | 139 | curr_state = sRECORD; |
nnguyen99 | 3:7486869c8027 | 140 | }else if(S&P){ |
nnguyen99 | 3:7486869c8027 | 141 | curr_state = sPLAY; |
nnguyen99 | 3:7486869c8027 | 142 | } |
nnguyen99 | 3:7486869c8027 | 143 | break; |
nnguyen99 | 3:7486869c8027 | 144 | case sRECORD: |
nnguyen99 | 7:f5f265b139fe | 145 | S = 0; |
nnguyen99 | 7:f5f265b139fe | 146 | X = 0; |
nnguyen99 | 7:f5f265b139fe | 147 | E = 0; |
nnguyen99 | 7:f5f265b139fe | 148 | P = 0; |
nnguyen99 | 3:7486869c8027 | 149 | if(X){ |
nnguyen99 | 3:7486869c8027 | 150 | curr_state = sRESET; |
nnguyen99 | 3:7486869c8027 | 151 | }else if(R&S){ |
nnguyen99 | 3:7486869c8027 | 152 | curr_state = sSTOP; |
nnguyen99 | 3:7486869c8027 | 153 | }else if(R&P){ |
nnguyen99 | 3:7486869c8027 | 154 | curr_state = sPLAY; |
nnguyen99 | 3:7486869c8027 | 155 | } |
nnguyen99 | 3:7486869c8027 | 156 | break; |
nnguyen99 | 3:7486869c8027 | 157 | case sPLAY: |
nnguyen99 | 7:f5f265b139fe | 158 | S = 0; |
nnguyen99 | 7:f5f265b139fe | 159 | R = 0; |
nnguyen99 | 7:f5f265b139fe | 160 | E = 0; |
nnguyen99 | 7:f5f265b139fe | 161 | X = 0; |
nnguyen99 | 3:7486869c8027 | 162 | if(X){ |
nnguyen99 | 3:7486869c8027 | 163 | curr_state = sRESET; |
nnguyen99 | 3:7486869c8027 | 164 | }else if(P&S){ |
nnguyen99 | 3:7486869c8027 | 165 | curr_state = sSTOP; |
nnguyen99 | 3:7486869c8027 | 166 | }else if(P&R){ |
nnguyen99 | 3:7486869c8027 | 167 | curr_state = sPLAY; |
nnguyen99 | 3:7486869c8027 | 168 | } |
nnguyen99 | 3:7486869c8027 | 169 | break; |
nnguyen99 | 3:7486869c8027 | 170 | case sERASE: |
nnguyen99 | 3:7486869c8027 | 171 | if(X){ |
nnguyen99 | 3:7486869c8027 | 172 | curr_state = sRESET; |
nnguyen99 | 3:7486869c8027 | 173 | } |
nnguyen99 | 3:7486869c8027 | 174 | } |
nnguyen99 | 3:7486869c8027 | 175 | } |
nnguyen99 | 3:7486869c8027 | 176 | } |
trmontgomery | 4:1790aa9234a3 | 177 | |
trmontgomery | 4:1790aa9234a3 | 178 | int main() { |
nnguyen99 | 5:d34d14d33a89 | 179 | hardware_init(); |
trmontgomery | 4:1790aa9234a3 | 180 | state_machine_mgr(); |
trmontgomery | 4:1790aa9234a3 | 181 | } |