ECE3872 HW/SW Project Code

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

Committer:
nnguyen99
Date:
Tue Apr 07 16:13:28 2020 +0000
Revision:
8:a618687c7b19
Parent:
5:d34d14d33a89
Child:
9:770effc3af2d
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 3:7486869c8027 6 DigitalOut myled(LED1);
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 5:d34d14d33a89 15 #define sRESET 1
nnguyen99 5:d34d14d33a89 16 #define sSTOP 2
nnguyen99 5:d34d14d33a89 17 #define sRECORD 3
nnguyen99 5:d34d14d33a89 18 #define sPLAY 4
nnguyen99 5:d34d14d33a89 19 #define sERASE 5
nnguyen99 3:7486869c8027 20 // State Machine control global variables
nnguyen99 3:7486869c8027 21 bool X; //reset
nnguyen99 3:7486869c8027 22 bool P; //play
nnguyen99 3:7486869c8027 23 bool S; //stop
nnguyen99 3:7486869c8027 24 bool R; //record
nnguyen99 3:7486869c8027 25 bool E; //erase
nnguyen99 3:7486869c8027 26
nnguyen99 5:d34d14d33a89 27 enum sm_state {sRESET, sSTOP, sRECORD, sPLAY, sERASE};
nnguyen99 3:7486869c8027 28
nnguyen99 3:7486869c8027 29
nnguyen99 3:7486869c8027 30 void reset(){
nnguyen99 3:7486869c8027 31 /* reset state:
nnguyen99 3:7486869c8027 32 Initial state upon powering up the device
nnguyen99 3:7486869c8027 33 1. Cease all motion
nnguyen99 3:7486869c8027 34 2. Reset all motors to initial position
nnguyen99 3:7486869c8027 35 3. Mutes all audio
nnguyen99 3:7486869c8027 36 4. Goes to erase state if reset button is held down for at least 3 seconds
nnguyen99 3:7486869c8027 37 5. Goes to stop state according to rotary switch input
nnguyen99 3:7486869c8027 38 6. LED goes from green to red
nnguyen99 3:7486869c8027 39 NOTE: ONLY exits to stop or erase state
nnguyen99 3:7486869c8027 40 */
nnguyen99 3:7486869c8027 41 }
nnguyen99 3:7486869c8027 42 void stop(){
nnguyen99 3:7486869c8027 43 /* stop state:
nnguyen99 3:7486869c8027 44 Initiated by rotary switch
nnguyen99 3:7486869c8027 45 1. Cease all motion
nnguyen99 3:7486869c8027 46 2. Stop recording
nnguyen99 3:7486869c8027 47 3. Mute all audio
nnguyen99 3:7486869c8027 48 */
nnguyen99 3:7486869c8027 49 }
nnguyen99 3:7486869c8027 50 void record(){
nnguyen99 3:7486869c8027 51 /* record state:
nnguyen99 3:7486869c8027 52 Initiated by rotary switch
nnguyen99 3:7486869c8027 53 1. Cease all motion
nnguyen99 3:7486869c8027 54 2. Begin recording ToF inputs (distance and time)
nnguyen99 3:7486869c8027 55 3. Convert distances to corresponding audio frequencies
nnguyen99 3:7486869c8027 56 4. Append to list of frequencies
nnguyen99 3:7486869c8027 57 5.
nnguyen99 3:7486869c8027 58 */
nnguyen99 3:7486869c8027 59 }
nnguyen99 3:7486869c8027 60 void play(){
nnguyen99 3:7486869c8027 61 /* play state:
nnguyen99 3:7486869c8027 62 Initiated by rotary switch
nnguyen99 3:7486869c8027 63 1. wait a few seconds
nnguyen99 3:7486869c8027 64 2. begin reading list of frequencies while concurrently:
nnguyen99 3:7486869c8027 65 - moving servo motors accordingly
nnguyen99 3:7486869c8027 66 - playing corresponding sounds
nnguyen99 3:7486869c8027 67 */
nnguyen99 3:7486869c8027 68 }
nnguyen99 3:7486869c8027 69 void erase(){
nnguyen99 3:7486869c8027 70 /* erase state:
nnguyen99 3:7486869c8027 71 erases entire audio recording
nnguyen99 3:7486869c8027 72 */
nnguyen99 3:7486869c8027 73 }
nnguyen99 3:7486869c8027 74
nnguyen99 5:d34d14d33a89 75 void hardware_init(){
nnguyen99 5:d34d14d33a89 76 // Push buttons init
nnguyen99 5:d34d14d33a89 77 pb1.mode(PullUp);
nnguyen99 5:d34d14d33a89 78 pb2.mode(PullUp);
nnguyen99 5:d34d14d33a89 79 pb3.mode(PullUp);
nnguyen99 5:d34d14d33a89 80 pb4.mode(PullUp);
nnguyen99 5:d34d14d33a89 81 pb1.attach_deasserted(&pb1_hit_callback);
nnguyen99 5:d34d14d33a89 82 pb2.attach_deasserted(&pb2_hit_callback);
nnguyen99 5:d34d14d33a89 83 pb3.attach_deasserted(&pb3_hit_callback);
nnguyen99 5:d34d14d33a89 84 pb4.attach_deasserted(&pb4_hit_callback);
nnguyen99 5:d34d14d33a89 85 pb1.setSampleFrequency();
nnguyen99 5:d34d14d33a89 86 pb2.setSampleFrequency();
nnguyen99 5:d34d14d33a89 87 pb3.setSampleFrequency();
nnguyen99 5:d34d14d33a89 88 pb4.setSampleFrequency();
nnguyen99 5:d34d14d33a89 89 }
nnguyen99 5:d34d14d33a89 90
nnguyen99 5:d34d14d33a89 91 void pb1_hit_callback (void)
nnguyen99 5:d34d14d33a89 92 {
nnguyen99 8:a618687c7b19 93 X = 1;
nnguyen99 5:d34d14d33a89 94 guLCD.printf("REEST");
nnguyen99 5:d34d14d33a89 95 }
nnguyen99 5:d34d14d33a89 96
nnguyen99 5:d34d14d33a89 97 void pb2_hit_callback (void)
nnguyen99 5:d34d14d33a89 98 {
nnguyen99 8:a618687c7b19 99 P = 1;
nnguyen99 5:d34d14d33a89 100 guLCD.printf("STOP");
nnguyen99 5:d34d14d33a89 101 }
nnguyen99 5:d34d14d33a89 102
nnguyen99 5:d34d14d33a89 103 void pb3_hit_callback (void)
nnguyen99 5:d34d14d33a89 104 {
nnguyen99 8:a618687c7b19 105 S = 1;
nnguyen99 5:d34d14d33a89 106 guLCD.printf("RECORD");
nnguyen99 5:d34d14d33a89 107 }
nnguyen99 5:d34d14d33a89 108
nnguyen99 5:d34d14d33a89 109 void pb4_hit_callback (void)
nnguyen99 5:d34d14d33a89 110 {
nnguyen99 8:a618687c7b19 111 R = 1;
nnguyen99 5:d34d14d33a89 112 guLCD.printf("PLAY");
nnguyen99 5:d34d14d33a89 113 }
nnguyen99 5:d34d14d33a89 114
trmontgomery 4:1790aa9234a3 115 void state_machine_mgr(){
nnguyen99 3:7486869c8027 116 sm_state curr_state = sRESET;
nnguyen99 3:7486869c8027 117 while(1) {
nnguyen99 3:7486869c8027 118 switch(curr_state){
nnguyen99 3:7486869c8027 119 case sRESET:
nnguyen99 8:a618687c7b19 120 S = 0;
nnguyen99 8:a618687c7b19 121 R = 0;
nnguyen99 8:a618687c7b19 122 P = 0;
nnguyen99 8:a618687c7b19 123 E = 0;
nnguyen99 3:7486869c8027 124 if(S) curr_state = sSTOP;
nnguyen99 3:7486869c8027 125 break;
nnguyen99 3:7486869c8027 126 case sSTOP:
nnguyen99 8:a618687c7b19 127 X = 0;
nnguyen99 8:a618687c7b19 128 R = 0;
nnguyen99 8:a618687c7b19 129 P = 0;
nnguyen99 8:a618687c7b19 130 E = 0;
nnguyen99 3:7486869c8027 131 if(X){
nnguyen99 3:7486869c8027 132 curr_state = sRESET;
nnguyen99 3:7486869c8027 133 }else if(S&R){
nnguyen99 3:7486869c8027 134 curr_state = sRECORD;
nnguyen99 3:7486869c8027 135 }else if(S&P){
nnguyen99 3:7486869c8027 136 curr_state = sPLAY;
nnguyen99 3:7486869c8027 137 }
nnguyen99 3:7486869c8027 138 break;
nnguyen99 3:7486869c8027 139 case sRECORD:
nnguyen99 8:a618687c7b19 140 S = 0;
nnguyen99 8:a618687c7b19 141 X = 0;
nnguyen99 8:a618687c7b19 142 P = 0;
nnguyen99 8:a618687c7b19 143 E = 0;
nnguyen99 3:7486869c8027 144 if(X){
nnguyen99 3:7486869c8027 145 curr_state = sRESET;
nnguyen99 3:7486869c8027 146 }else if(R&S){
nnguyen99 3:7486869c8027 147 curr_state = sSTOP;
nnguyen99 3:7486869c8027 148 }else if(R&P){
nnguyen99 3:7486869c8027 149 curr_state = sPLAY;
nnguyen99 3:7486869c8027 150 }
nnguyen99 3:7486869c8027 151 break;
nnguyen99 3:7486869c8027 152 case sPLAY:
nnguyen99 8:a618687c7b19 153 S = 0;
nnguyen99 8:a618687c7b19 154 R = 0;
nnguyen99 8:a618687c7b19 155 X = 0;
nnguyen99 8:a618687c7b19 156 E = 0;
nnguyen99 3:7486869c8027 157 if(X){
nnguyen99 3:7486869c8027 158 curr_state = sRESET;
nnguyen99 3:7486869c8027 159 }else if(P&S){
nnguyen99 3:7486869c8027 160 curr_state = sSTOP;
nnguyen99 3:7486869c8027 161 }else if(P&R){
nnguyen99 3:7486869c8027 162 curr_state = sPLAY;
nnguyen99 3:7486869c8027 163 }
nnguyen99 3:7486869c8027 164 break;
nnguyen99 3:7486869c8027 165 case sERASE:
nnguyen99 3:7486869c8027 166 if(X){
nnguyen99 3:7486869c8027 167 curr_state = sRESET;
nnguyen99 3:7486869c8027 168 }
nnguyen99 3:7486869c8027 169 }
nnguyen99 3:7486869c8027 170 }
nnguyen99 3:7486869c8027 171 }
trmontgomery 4:1790aa9234a3 172
trmontgomery 4:1790aa9234a3 173 int main() {
nnguyen99 5:d34d14d33a89 174 hardware_init();
trmontgomery 4:1790aa9234a3 175 state_machine_mgr();
trmontgomery 4:1790aa9234a3 176 }