LEX_Threaded_Programming

Dependencies:   Heater_V2 MODSERIAL Nanopb FastPWM ADS8568_ADC

Revision:
18:376350fb7ef9
Parent:
17:d86e749ae9be
Child:
19:8154688252fd
--- a/main.cpp	Fri Sep 20 14:54:15 2019 +0000
+++ b/main.cpp	Mon Sep 23 15:42:13 2019 +0000
@@ -37,8 +37,6 @@
   {{0.01887149,  10.39360225}, {0.03115874, 10.28199855}},
   {{0.052545339, 10.06008621}, {0.094239471, 10.11983777}}}; 
   
-float drive_cal[2] = {0.0, 1.0};
-
 Heater * heater;
 float r_gradient; //setpoint setting
 
@@ -58,19 +56,19 @@
 float pressure_set_high;
 
 //Heater Control
-FastPWM drive_main(PC_9);
-FastPWM drive_lysis(PC_8);
-FastPWM guard_main(PC_7);
-FastPWM guard_lysis(PC_6);
+FastPWM drive_1(PC_9);
+FastPWM drive_2(PC_8);
+FastPWM guard_1(PC_7);
+FastPWM guard_2(PC_6);
 
-int heater_ID_main = 1;
-int heater_ID_lysis = 2;
-int i_port_main = 0;
-int i_port_lysis = 2;
-int v_port_main = 1;
-int v_port_lysis = 3;
+//ADC channels for heater current and voltage measurements
+int i_port_1 = 0;
+int i_port_2 = 2;
+int v_port_1 = 1;
+int v_port_2 = 3;
 
-int heater_ID = 0;
+//Heater ID: heater 1 is nearer liquid sense location, heater 2 is other location
+int heater_ID;
 
 //Illumination LED Control
 
@@ -265,11 +263,14 @@
 
 int main()
 {
+    int i_board = -1;  
+    int i_heater;
+    float drive_cal_a, drive_cal_b;
+        
     pc.baud(115200);
     adc.init();
     
     pc.printf("\r\nUnique ID: %08X %08X %08X \r\n", uid[0], uid[1], uid[2]);   
-    int i_board = -1;  
     for (int i = 0; i < UID_TABLE_LENGTH; i++)
     {
       if (uid[0]==drive_board_uid[i][0] && uid[1]==drive_board_uid[i][1] && uid[2]==drive_board_uid[i][2])
@@ -291,49 +292,51 @@
     exp_config.profile.arg = &profile;
 
     //read and decode configuration
-    read_message();
-    
+    read_message();  
     pc.printf("# Message read\n");
     decode_message();
     pc.printf("# Message decoded\n");
 
-    Heater * heater_main = new Heater(i_port_main, v_port_main, & drive_main, & guard_main, & adc, adc_busy, exp_config.thermal);
-    Heater * heater_lysis = new Heater(i_port_lysis, v_port_lysis, & drive_lysis, & guard_lysis, & adc, adc_busy, exp_config.thermal);
 
-    //Select heater. Put control times in us for ticker functions
-    if (exp_config.selected_heater == memspcr_ExperimentConfiguration_Heater_HEATER_1) {
-        heater = heater_main;
-        heater_ID = heater_ID_main;
-    } else if (exp_config.selected_heater == memspcr_ExperimentConfiguration_Heater_HEATER_2) {
-        heater = heater_lysis;
-        heater_ID = heater_ID_lysis;
-    } else {
+    //Select heater
+    if (exp_config.selected_heater == memspcr_ExperimentConfiguration_Heater_HEATER_1)
+        i_heater = 0;
+    else if (exp_config.selected_heater == memspcr_ExperimentConfiguration_Heater_HEATER_2)
+        i_heater = 1;
+    else {
         pc.printf("# Error - no heater has been selected\n");
         return 1;
     }
+    heater_ID = i_heater + 1;
+    
+    //Set drive ADC->Resistance calibration coefficients (default: no change if board not found)
+    drive_cal_a = drive_board_cal[i_board][i_heater][0];
+    drive_cal_b = drive_board_cal[i_board][i_heater][1];
+        
+    pc.printf("# Heater: %d\n", heater_ID);
+    pc.printf("# Calibration: %10.6f, %10.6f\n", drive_cal_a, drive_cal_b);
 
-    //Set drive ADC->Resistance calibration coefficients
-    if (i_board != -1)
-        for (int i=0; i<2; i++) drive_cal[i] = drive_board_cal[i_board][heater_ID-1][i];
-    else {
-        drive_cal[0] = 0.0;
-        drive_cal[1] = 1.0;
-    }
-        
-    pc.printf("Heater: %d drive_cal[0]: %10.6f drive_cal[1]: %10.6f\n", heater_ID, drive_cal[0], drive_cal[1]);
-
-    pc.printf("# Starting pressure control\n");    
+    //Define heaters
+    Heater * heater_1 = new Heater(i_port_1, v_port_1, drive_cal_a, drive_cal_b, & drive_1, & guard_1, & adc, adc_busy, exp_config.thermal);
+    Heater * heater_2 = new Heater(i_port_2, v_port_2, drive_cal_a, drive_cal_b, & drive_2, & guard_2, & adc, adc_busy, exp_config.thermal);
+    if (i_heater == 0)
+        heater = heater_1;
+    else
+        heater = heater_2;
+    
+    pc.printf("# Waiting for signal to begin pressure control (type p or press button 0)\n");
+    while (pc.getcNb()!='p' && !user_0);
+    pc.printf("# Pressure control start signal received\n");
     pressure_thread.start(& pressure_control);
     pressure_tick.attach_us(& pressure_trigger, 500000);
 
-    pc.printf("# Waiting for start signal to begin temperature control (type in an s or press button 0)\n");
+    pc.printf("# Waiting for signal to begin temperature control (type s or press button 0)\n");
+    while (pc.getcNb()!='s' && !user_0);
+    pc.printf("# Temperature control start signal received\n");
+
     heater->Set_ref(0.0);
     heater_control.start(& temp_control);
-    heat_tick.attach_us(& temp_trigger,exp_config.thermal.control_loop_interval_ms * 1000);
-    
-    while (pc.getcNb()!='s' && !user_0);
-
-    pc.printf("# Start signal received\n");
+    heat_tick.attach_us(& temp_trigger,exp_config.thermal.control_loop_interval_ms * 1000);  
 
     logging_thread.start(& log_state);
     log_tick.attach_us(& log_trigger,exp_config.logging_interval_ms * 1000);
@@ -348,8 +351,7 @@
     log_tick.detach();
     wait(1);
     heater->turn_off();
-    
-    
+       
     pc.printf("# Finished\n");
      
     return 0;