ECE3872 HW/SW Project Code

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

Committer:
trmontgomery
Date:
Mon Apr 13 02:16:45 2020 +0000
Revision:
16:62976c3c029e
Parent:
14:7e81f2cd4b4b
Child:
18:0e0edd4f9e4d
map servo movement to freqs

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