ECE3872 HW/SW Project Code

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

Committer:
trmontgomery
Date:
Sat Apr 11 20:56:21 2020 +0000
Revision:
24:930fc58e927a
Parent:
12:0528ef6978ec
re-added motor_ctl.h

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 11:299f2c8a4092 7 //Serial mac(USBTX,USBRX);
nnguyen99 10:f10105ec435f 8
nnguyen99 3:7486869c8027 9 // States
nnguyen99 5:d34d14d33a89 10 #define sRESET 1
nnguyen99 5:d34d14d33a89 11 #define sSTOP 2
nnguyen99 5:d34d14d33a89 12 #define sRECORD 3
nnguyen99 5:d34d14d33a89 13 #define sPLAY 4
nnguyen99 5:d34d14d33a89 14 #define sERASE 5
nnguyen99 3:7486869c8027 15 // State Machine control global variables
nnguyen99 3:7486869c8027 16 bool X; //reset
nnguyen99 3:7486869c8027 17 bool P; //play
nnguyen99 3:7486869c8027 18 bool S; //stop
nnguyen99 3:7486869c8027 19 bool R; //record
nnguyen99 3:7486869c8027 20 bool E; //erase
nnguyen99 3:7486869c8027 21
nnguyen99 3:7486869c8027 22
nnguyen99 3:7486869c8027 23
nnguyen99 3:7486869c8027 24 void reset(){
nnguyen99 3:7486869c8027 25 /* reset state:
nnguyen99 3:7486869c8027 26 Initial state upon powering up the device
nnguyen99 3:7486869c8027 27 1. Cease all motion
nnguyen99 3:7486869c8027 28 2. Reset all motors to initial position
nnguyen99 3:7486869c8027 29 3. Mutes all audio
nnguyen99 3:7486869c8027 30 4. Goes to erase state if reset button is held down for at least 3 seconds
nnguyen99 3:7486869c8027 31 5. Goes to stop state according to rotary switch input
nnguyen99 3:7486869c8027 32 6. LED goes from green to red
nnguyen99 3:7486869c8027 33 NOTE: ONLY exits to stop or erase state
nnguyen99 3:7486869c8027 34 */
trmontgomery 24:930fc58e927a 35
trmontgomery 24:930fc58e927a 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 5:d34d14d33a89 71
nnguyen99 5:d34d14d33a89 72
nnguyen99 5:d34d14d33a89 73
trmontgomery 4:1790aa9234a3 74 void state_machine_mgr(){
nnguyen99 11:299f2c8a4092 75 char curr_state = 1;
trmontgomery 24:930fc58e927a 76 char prev_state = 1;
nnguyen99 12:0528ef6978ec 77 char key_input;
nnguyen99 11:299f2c8a4092 78 X = 1;
nnguyen99 11:299f2c8a4092 79 S = 0;
nnguyen99 11:299f2c8a4092 80 R = 0;
nnguyen99 11:299f2c8a4092 81 P = 0;
nnguyen99 11:299f2c8a4092 82 E = 0;
nnguyen99 3:7486869c8027 83 while(1) {
nnguyen99 11:299f2c8a4092 84 if (pc.readable()) { // if they have pressed a key
nnguyen99 12:0528ef6978ec 85 key_input = pc.getc();
nnguyen99 12:0528ef6978ec 86 if(key_input == '1') X=1; //toggle reset
nnguyen99 12:0528ef6978ec 87 if(key_input == '2') S=1; //toggle stop
nnguyen99 12:0528ef6978ec 88 if(key_input == '3') R=1; //toogle record
nnguyen99 12:0528ef6978ec 89 if(key_input == '4') P=1; //toggle play
nnguyen99 12:0528ef6978ec 90 if(key_input == '5') E=1; //toggle erase
nnguyen99 11:299f2c8a4092 91 }
trmontgomery 24:930fc58e927a 92 if (curr_state != prev_state){
trmontgomery 24:930fc58e927a 93 pc.printf("X: %d\n",X);
trmontgomery 24:930fc58e927a 94 pc.printf("S: %d\n",S);
trmontgomery 24:930fc58e927a 95 pc.printf("R: %d\n",R);
trmontgomery 24:930fc58e927a 96 pc.printf("P: %d\n",P);
trmontgomery 24:930fc58e927a 97 pc.printf("E: %d\n",E);
trmontgomery 24:930fc58e927a 98 pc.printf("Current State %d\n",curr_state);
trmontgomery 24:930fc58e927a 99 }
nnguyen99 11:299f2c8a4092 100 // Implementing state machine logical transitions based on what states can exit to other states
nnguyen99 11:299f2c8a4092 101 if(X){
nnguyen99 11:299f2c8a4092 102 if(E){
nnguyen99 11:299f2c8a4092 103 curr_state = 5;
nnguyen99 12:0528ef6978ec 104 X = 0;
nnguyen99 11:299f2c8a4092 105 }else if(S){
nnguyen99 11:299f2c8a4092 106 curr_state = 2;
nnguyen99 12:0528ef6978ec 107 X = 0;
nnguyen99 11:299f2c8a4092 108 }
nnguyen99 11:299f2c8a4092 109 }else if(S){
nnguyen99 11:299f2c8a4092 110 if(X){
nnguyen99 11:299f2c8a4092 111 curr_state = 1;
nnguyen99 12:0528ef6978ec 112 S = 0;
nnguyen99 11:299f2c8a4092 113 }else if(R){
nnguyen99 11:299f2c8a4092 114 curr_state = 3;
nnguyen99 12:0528ef6978ec 115 S = 0;
nnguyen99 11:299f2c8a4092 116 }else if(P){
nnguyen99 11:299f2c8a4092 117 curr_state = 4;
nnguyen99 12:0528ef6978ec 118 S = 0;
nnguyen99 11:299f2c8a4092 119 }
nnguyen99 11:299f2c8a4092 120 }else if(R){
nnguyen99 11:299f2c8a4092 121 if(X){
nnguyen99 11:299f2c8a4092 122 curr_state = 1;
nnguyen99 12:0528ef6978ec 123 R = 0;
nnguyen99 11:299f2c8a4092 124 }else if(S){
nnguyen99 11:299f2c8a4092 125 curr_state = 2;
nnguyen99 12:0528ef6978ec 126 R = 0;
nnguyen99 11:299f2c8a4092 127 }
nnguyen99 11:299f2c8a4092 128 }else if(P){
nnguyen99 11:299f2c8a4092 129 if(X){
nnguyen99 11:299f2c8a4092 130 curr_state = 1;
nnguyen99 12:0528ef6978ec 131 P = 0;
nnguyen99 11:299f2c8a4092 132 }else if(S){
nnguyen99 11:299f2c8a4092 133 curr_state = 2;
nnguyen99 12:0528ef6978ec 134 P = 0;
nnguyen99 11:299f2c8a4092 135 }
nnguyen99 11:299f2c8a4092 136 }else if(E){
nnguyen99 11:299f2c8a4092 137 if(X){
nnguyen99 11:299f2c8a4092 138 curr_state = 1;
nnguyen99 12:0528ef6978ec 139 E = 0;
nnguyen99 11:299f2c8a4092 140 }
nnguyen99 11:299f2c8a4092 141 }
nnguyen99 3:7486869c8027 142 switch(curr_state){
nnguyen99 10:f10105ec435f 143 case 1:
nnguyen99 12:0528ef6978ec 144 // pc.printf("RESET\n");
nnguyen99 10:f10105ec435f 145 reset();
nnguyen99 3:7486869c8027 146 break;
nnguyen99 10:f10105ec435f 147 case 2:
nnguyen99 12:0528ef6978ec 148 // pc.printf("STOP\n");
nnguyen99 10:f10105ec435f 149 stop();
nnguyen99 3:7486869c8027 150 break;
nnguyen99 10:f10105ec435f 151 case 3:
nnguyen99 12:0528ef6978ec 152 // pc.printf("RECORD\n");
nnguyen99 10:f10105ec435f 153 record();
nnguyen99 3:7486869c8027 154 break;
nnguyen99 10:f10105ec435f 155 case 4:
nnguyen99 12:0528ef6978ec 156 // pc.printf("PLAY\n");
nnguyen99 10:f10105ec435f 157 play();
nnguyen99 3:7486869c8027 158 break;
nnguyen99 10:f10105ec435f 159 case 5:
nnguyen99 12:0528ef6978ec 160 // pc.printf("ERASE\n");
nnguyen99 10:f10105ec435f 161 erase();
nnguyen99 11:299f2c8a4092 162 break;
nnguyen99 3:7486869c8027 163 }
nnguyen99 3:7486869c8027 164 }
nnguyen99 3:7486869c8027 165 }
trmontgomery 4:1790aa9234a3 166
trmontgomery 4:1790aa9234a3 167 int main() {
trmontgomery 4:1790aa9234a3 168 state_machine_mgr();
trmontgomery 4:1790aa9234a3 169 }