Cynthia Wang / Mbed 2 deprecated ECE4180-FinalProject

Dependencies:   mbed-rtos mbed Servo Motor SoftPWM

main.cpp

Committer:
yjaafar3
Date:
2022-11-15
Revision:
3:9febeec1f271
Parent:
2:002f2def130e
Child:
5:e5bf798e0522

File content as of revision 3:9febeec1f271:

#include "mbed.h"
#include "rtos.h"
#include "Serial.h"
#include "Servo.h"

Serial blue(p28, p27);
Servo  turret(p24);

volatile float speed_left = 0;
volatile float speed_right = 0;
volatile float turret_delta = 0;
volatile bool  fire = false;


Mutex drive_mutex;
Mutex turret_mutex;
Mutex fire_mutex;

Thread thread_drive;
Thread thread_turret;
Thread thread_fire;

void input_loop();
void set_speed(float l, float r);
void set_turret_delta(float delta);
void fire_cannon(bool f);
 
void input_thread() {
    
}

void drive_thread() {
 
}

void turret_thread() {
    while (1) {
        turret_mutex.lock();
        if (turret + turret_delta < 0) {
            turret = 1;
        } else if (turret + turret_delta > 1){
            turret = 0;
        } else {
            turret = turret +  turret_delta;
        }
        turret_mutex.unlock();
        Thread::wait(50);
    }
}

void fire_thread() {
    
}

 
int main() {
    thread_drive.start(drive_thread);
    thread_turret.start(turret_thread);
    thread_fire.start(fire_thread);
    
    input_loop();
}

void input_loop() {
    char bnum=0;
    char bhit=0;
    while(1) {
        if (blue.getc()=='!') {
            if (blue.getc()=='B') { //button data packet
                bnum = blue.getc(); //button number
                bhit = blue.getc(); //1=hit, 0=release
                if (blue.getc()==char(~('!' + 'B' + bnum + bhit))) { //checksum OK?
                    switch(bnum) {
                        case '1': //Turret Left Button
                            if (bhit == '1') {
                                set_turret_delta(-0.05);
                            } else {
                                set_turret_delta(0);
                            }
                            break;
                        case '2': //Turret Right Button
                            if (bhit == '1') {
                                set_turret_delta(0.05);
                            } else {
                                set_turret_delta(0);
                            }
                            break;
                        case '3': //Fire Button
                            if (bhit == '1') {
                                fire_cannon(true);
                            } else {
                                fire_cannon(false);
                            }
                            break;
                        case '5': //button 5 up arrow
                            if (bhit=='1') {
                                set_speed(0.5, 0.5);
                            } else {
                                set_speed(0, 0);
                            }
                            break;
                        case '6': //button 6 down arrow
                            if (bhit=='1') {
                                set_speed(-0.5, -0.5);
                            } else {
                                set_speed(0, 0);
                            }
                            break;
                        case '7': //button 7 left arrow
                            if (bhit=='1') {
                                set_speed(-0.5, 0.5);
                            } else {
                                set_speed(0, 0);
                            }
                            break;
                        case '8': //button 8 right arrow
                            if (bhit=='1') {
                                set_speed(0.5, -0.5);
                            } else {
                                set_speed(0, 0);
                            }
                            break;
                        default:
                            break;
                    }
                }
            }
        }
        Thread::wait(50);
    }
}

void set_speed(float left, float right) {
    drive_mutex.lock();
    speed_left = left;
    speed_right = right;
    drive_mutex.unlock();
}

void set_turret_delta(float delta) {
    turret_mutex.lock();
    turret_delta = delta;
    turret_mutex.unlock();
}

void fire_cannon(bool f) {
    fire_mutex.lock();
    fire = f;
    fire_mutex.unlock();
}