Testing 1 blue pill

Dependencies:   mbed mbed-rtos TextLCD

main.cpp

Committer:
thomasmorris
Date:
2019-02-11
Revision:
15:7cf5595ed1b1
Parent:
14:63998be3d43c
Child:
16:9f98ec0ededb

File content as of revision 15:7cf5595ed1b1:

#include "mbed.h"
#include "SETUP.hpp"
//Thread Functions
DigitalOut led(LED1);

void up_signal(){up_thread.signal_set(1);}      //Sets the up thread to operate
void down_signal(){down_thread.signal_set(1);}    //Sets the down thread to operate
void start_signal(){start_stop_thread.signal_set(1);}   //Sets the start thread to operate
void function_signal(){function_thread.signal_set(1);}//Sets the function thread to operate
void select_signal(){select_thread.signal_set(1);}  //Sets the select thread to operate

void LCD_thread(){
    while(1){
        lcd.cls();
        if(Function == 0){//Turn
            lcd.printf("Mode: Turn\n");
            lcd.printf("Done: %d ToDo: %d\n",turns_done,turns_todo);
        }else if(Function == 1){//Anneal
            lcd.printf("Mode: Anneal\n");
            lcd.printf("Loop:%d Wait:%d\n",Loop,Wait_Time);
      
        }else if(Function == 2){//Test
            lcd.printf("Mode: Test\n");
            lcd.printf("Duty: %d Time: %d\n",Duty_Cycle,Power_Time);
        }
        Thread::wait(250);
        lcd.cls();
    } 
}
void LED_thread(){
    while (1){
        led2 = !led2;
        Thread::wait(1000);
    }
}
//Interrupt functions
void up_thread_function(){//Action if the up button is pressed increment
    while(1)
    {
        Thread::signal_wait(1);
        up_thread.signal_set(0);
        led1 = !led1;
        pc.printf("Up Button Pressed\n");
        
        if (Function == 0){
            
            No_Of_Rotations = No_Of_Rotations + 1;//Increases Turn number
            turns_todo = No_Of_Rotations;
        }else if (Function == 1){
            if (Select == false){
                Loop = Loop + 1;  //Increases Repetitions in Annealing
            }else if (Select == true){
                Wait_Time = Wait_Time + 1;  //Increases Wait time
            }
            }else if (Function == 2){  
                if (Select == false){
                    if (Duty_Cycle < 100){
                        Duty_Cycle = Duty_Cycle + 10; //Increases Testing Duty Cycle
                    }}else if (Select == true){
                        Power_Time = Power_Time + 1;    //Increases time on
                    }
            }
    Thread::wait(1000);//Button debounce
    }
}
void down_thread_function(){ //Action if the down button is pressed decrement
    while(1)
    {
        Thread::signal_wait(1);
        down_thread.signal_set(0);
        pc.printf("Down Button Pressed\n");
        if (Function == 0){ 
            No_Of_Rotations = No_Of_Rotations - 1;
            turns_todo = No_Of_Rotations;
            }else if (Function == 1){
                if (Select == false){
                    if (Loop > 0){
                        Loop = Loop - 1;
                    }
                    }else if (Select == true){
                        if (Wait_Time > 0){
                            Wait_Time = Wait_Time - 1;
                        }
                    }
            }else if (Function == 2){  
                if (Select == false){
                     if (Duty_Cycle > 0){
                        Duty_Cycle = Duty_Cycle - 10;     //Decreases duty
                        }}else if (Select == true){
                    if (Power_Time > 0){
                    Power_Time = Power_Time - 1;    //Decreases Time on
                }
            }
         }
         Thread::wait(1000);//Button debounce
    }
}
void start_stop_thread_function(){ //Action if the Start/Stop button is pressed
    while(1)
    {
        Thread::signal_wait(1);
        start_stop_thread.signal_set(0);
        pc.printf("S/S Button Pressed\n");
        if (Function == 0)//Twist selected
        {
            Twist_Go = !Twist_Go;//toggle used for coiling and twisting
        }else if (Function == 1){ //Annealing selected 
            Anneal_Go = !Anneal_Go;//toggle
        }else if (Function == 2){ //Testing selected 
            Test_Go = !Test_Go;//toggle
        }
         Thread::wait(1000);//Button debounce
    }
}
void Function_Selection_thread_function() { //Action if the Function button is pressed
    while(1)
    {
        Thread::signal_wait(1);
        function_thread.signal_set(0);
        pc.printf("Function Button Pressed\n");
        if (Function < 2){
            Function = Function + 1;
        }else{
            Function = 0;
        }
         Thread::wait(2000);//Button debounce
    }
}
void Selection_thread_function() { //Action if the Select button is pressed
    while(1)
    {
        Thread::signal_wait(1);
        select_thread.signal_set(0);
        pc.printf("Select Button Pressed\n");
        Select = !Select;
        Thread::wait(1000);//Button debounce
    }
}

int main() 
{
    
    //Interrupt setters
    button_up.rise(&up_signal);                        //Sets up Up button
    button_down.rise(&down_signal);                    //Sets up Down Button
    button_start.rise(&start_signal);             //Sets up Start/Stop Button
    button_funct.rise(&function_signal);     //Sets up Function Button
    button_select.rise(&select_signal);             //Sets up Select Button
    
    //Thread Starts
    lcd_thread.start(LCD_thread);
    led_thread.start(LED_thread);  
      
    up_thread.start(up_thread_function);
    start_stop_thread.start(start_stop_thread_function);
    
    down_thread.start(down_thread_function);
    function_thread.start(Function_Selection_thread_function);
    select_thread.start(Selection_thread_function);
    
    No_Of_Rotations = 20;//Defaults at 20 as a starting value
    turns_todo = No_Of_Rotations;
    Twist_Go = false;  //
    Anneal_Go = false; // The Values for the start/ stop button on each select setting
    Test_Go = false;   //
    
    Function = 0;   //These values are used to navigate the differing modes
    Select = false;    //
    
    Loop = 8;       //Default loops
    Wait_Time = 6;  //Default wait time
    
    Duty_Cycle = 50; //Percent
    Power_Time = 6; //Seconds
    
    /*
    Function 0 = Turn
    Function 1 = Anneal
    Function 2 = Test
    */

    pc.printf("Program start\n");//Outputs informtation to the putty terminal

    
    while(1)            // Main code
    {
        if (Function == 0){       //Turning Code
            if (Twist_Go == true){
                STEPPER_MOTOR_1.Rotate_Steps(No_Of_Rotations);//Rotates for the specified number of steps given
            }
        }else if (Function == 1){  //Annealing Code
            if (Anneal_Go == true)
            {
                for ( int counter = 0; counter < Loop; counter++)  //Loop value, check if works
                {
                    Tendon_Power.period(0.01); // set PWM period to 10 ms don't use pwm have this just to declare
                    Tendon_Power=1; // set duty cycle to 100%
                    wait(Wait_Time);//Variable
                    Tendon_Power=0; // set duty cycle to 0%
                    wait(6);//Fixed off time
                 }
              }
        }else if (Function == 2){  //Testing Code
            if (Test_Go == true)
            {
                Tendon_Power.period(0.01); // set PWM period to 10 ms don't use pwm have this just to declare
                Tendon_Power= Duty_Cycle / 100; // set duty cycle to variable input from buttons between 0-1 (on lcd this is a percentage) also increment by values of 10
                wait(Power_Time);//Variable on time for power on
                Tendon_Power=0; // set duty cycle to 0% and power off
            }
        }
    }
}