ECE3872 HW/SW Project Code

Dependencies:   mbed Servo mbed-rtos 4DGL-uLCD-SE PinDetect X_NUCLEO_53L0A1

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?

UserRevisionLine numberNew 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 }