First commit for threaded programme

Dependencies:   Heater MODSERIAL FastPWM ADS8568_ADC

main.cpp

Committer:
omatthews
Date:
2019-08-19
Revision:
98:6c7c7d36a5fe
Parent:
88:bea4f2daa48c

File content as of revision 98:6c7c7d36a5fe:

#include "mbed.h"
#include "MODSERIAL.h"
#include "ADS8568_ADC.h"
#include "Heater.h"
#include "FastPWM.h"

#define ALL_CH              15     //value of convst bus to read all chanels simultaneosly

float r_gradient;
float r_set_points[5] = {0.0,0.50,0.51,0.52,0.50};
int time_points[5] = {0,5000,10000,15000,20000};
int trig_time[5] = {0,0,50,50,50};
int curr_time;
//Globals
int camera_read_time;

MODSERIAL pc(PA_9, PA_10, 512); //mcu TX, RX, 512 byte TX and RX buffers
ADS8568_ADC adc(PB_15, PB_14, PB_13, PB_12, PC_15, PC_0, PC_1, PC_2, PC_3);
I2C i2c(PB_7, PB_8);            //SDA, SCL
Timer timer;
DigitalIn adc_busy(PA_8);                   //Busy interrupt sig#


//Heater Control
FastPWM drive_1(PC_9);
FastPWM drive_2(PC_8);
FastPWM guard_1(PC_7);
FastPWM guard_2(PC_6);


//Heaters
Heater heater_1(0,1,&drive_1, &guard_1, 525.2, -206);
Heater heater_2(2,3,&drive_2, &guard_2, 525.2, -206);

//indicator LEDs
DigitalOut hb_led(PC_13);       //Green
DigitalOut led_0(PC_4);         //Red
DigitalOut led_1(PC_5);         //Green

//User buttons
DigitalIn user_0(PB_0);
DigitalIn user_1(PB_1);

BusOut converts(PC_0, PC_1, PC_2, PC_3);


//Threads
Thread serial_listen;
Thread heater_control;

//Semaphores
Semaphore heater_semaphore;

//Tickers
Ticker heat_tick;
Ticker pressure_tick;


//Flags
bool start_flag = false;
bool config_flag = false;
volatile bool heater_flag = false;
bool triggered_flag = false;
bool untriggered_flag = false;


//Functions

void serial_rx(){
    while(pc.getc() != 'c');
    config_flag = true;
    while(pc.getc() != 's');
    start_flag = true;
    }
    
    
void temp_trigger() {
    heater_flag = true;
    led_1 = !led_1;
    }

void temp_control() {
    while(1){
        while(!heater_flag);
        heater_1.update();
        } 
    }

    
void set_point_routine() {
    for (int i_set = 1; i_set < sizeof(r_set_points)/sizeof(float); i_set ++){
        r_gradient = (r_set_points[i_set] - r_set_points[i_set-1])/(time_points[i_set] - time_points[i_set-1]);
        while ((curr_time = timer.read_ms()) <= time_points[i_set]){
            heater_1.Set_ref(r_set_points[i_set-1] + r_gradient * (curr_time - time_points[i_set-1]));
            if (!triggered_flag && curr_time > time_points[i_set - 1] + trig_time[i_set]){
                //Start camera trigger
                triggered_flag = true;
                }
            if (!untriggered_flag && curr_time > time_points[i_set - 1] + trig_time[i_set] + camera_read_time){
                //End camera read
                untriggered_flag = true;
                }
            wait_ms(1);
        }
        
    }
}   

void pressure_control() {
    //Input pressure control function here
    //i.e.
    //read_pressure();
    //if (pressure < lower_bound) {
            //pump_turn_on();
        //}
    //else if (pressure > upper_bound) {
            //pump_turn_off();
        //}
    }
            

        
        
int main() {
    pc.baud(115200);
    
    serial_listen.start(&serial_rx);
    heater_control.start(& temp_control);
    pressure_tick.attach(& pressure_control, 1);
    heat_tick.attach_us(& temp_trigger,3000);
    
    while (!start_flag){
        pc.printf("Waiting for start signal\n");
        wait(1);
        }
    
    pc.printf("Starting routine...\n");
    set_point_routine();


    }