LEX_Threaded_Programming

Dependencies:   Heater_V2 MODSERIAL Nanopb FastPWM ADS8568_ADC

Revision:
7:a4fc853feb30
Parent:
6:ef2bcc5fe3af
Child:
8:58c6d51957df
--- a/main.cpp	Fri Aug 30 15:00:29 2019 +0000
+++ b/main.cpp	Wed Sep 04 10:18:33 2019 +0000
@@ -26,25 +26,32 @@
 FastPWM drive_lysis(PC_8);
 FastPWM guard_main(PC_7);
 FastPWM guard_lysis(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;
 
+int heater_ID = 0;
 
 
-//indicator LEDs
+//Indicator LEDs
 DigitalOut hb_led(PC_13);       //Green
 DigitalOut led_0(PC_4);         //Red
 DigitalOut led_1(PC_5);         //Green
 
+//Camera and LED drive
+DigitalOut camTrigger(PB_2);     //Trigger camera
+DigitalOut ledDrive(PB_4);       //Drive LED for fluorescence detection
+
 //User buttons
 DigitalIn user_0(PB_0);
 DigitalIn user_1(PB_1);
 
 BusOut converts(PC_0, PC_1, PC_2, PC_3);
 
-
 //Threads
 Thread heater_control(osPriorityHigh);
 Thread logging_thread(osPriorityAboveNormal);
@@ -69,21 +76,19 @@
 uint8_t buffer[512]; //FIXME: Needs to be longer
 
 
-
-
 //Functions for reading and decoding the message__________________________________________________
 
 void read_message()
 {
-    if (pc.scanf("%d",&message_length) < 0){pc.printf("Error reading message length");}
+    if (pc.scanf("%d",&message_length) < 0){pc.printf("# Error reading message length");}
     size_t buffer_length = sizeof(buffer);
     if (message_length > buffer_length) 
     {
-        pc.printf("Message length exceeds buffer. \n Input configuration file\n");
+        pc.printf("# Message length exceeds buffer. \n Input configuration file\n");
         read_message();
         return;
     }
-    pc.printf("Message is %d chars long, buffer length is %d\n",message_length,buffer_length);
+    pc.printf("# Message is %d chars long, buffer length is %d\n",message_length,buffer_length);
     unsigned int c;
     for (int i = 0; i < message_length; i++) 
     {
@@ -103,7 +108,7 @@
 
     // Check for errors...
     if (!status) {
-        pc.printf("Decoding failed: %s\n", PB_GET_ERROR(&istream));
+        pc.printf("# Decoding failed: %s\n", PB_GET_ERROR(&istream));
     }
 }
 
@@ -114,7 +119,7 @@
     status = pb_decode(stream, memspcr_ThermalStep_fields, & result);
 
     if (!status) {
-        pc.printf("Decode callback failed\n");
+        pc.printf("# Decode callback failed\n");
     }
 
     dest->push_back(result); //CHECK: Does result get copied into the vector?
@@ -131,8 +136,6 @@
     //N.B. update cannot be called directly from a ticker as tickers and
     //reading the ADC both rely on interrupts.
     flags.set(0x1);
-      
-
 }
 
 
@@ -141,6 +144,7 @@
 {
     flags.set(0x2);
 }
+
 void pressure_control()
 {
     //Input pressure control function here
@@ -174,7 +178,7 @@
     while(1){
         flags.wait_any(0x2,osWaitForever,true);
         //Output time, R_ref, R, error, error_integrated
-        pc.printf("%d,%f,%f,%f,%f",timer.read_ms(),heater->Get_R_ref(),heater->Get_R(),heater->Get_error(),heater->Get_error_integrated());
+        pc.printf("%10d,%10d,%10.6f,%10.6f\n", heater_ID, timer.read_ms(), heater->Get_R(), heater->Get_R_ref());
     }
 }
 
@@ -183,7 +187,7 @@
     vector <memspcr_ThermalStep>::iterator it_prev, it = profile.begin();
     if (it->elapsed_time_ms != 0)
     {
-        pc.printf("\nError: the first point in the profile should be at time 0.\n");
+        pc.printf("# Error: the first point in the profile should be at time 0.\n");
         return;
     }
     it++;
@@ -197,16 +201,23 @@
                      
             if (!triggered_flag && curr_time > it_prev->elapsed_time_ms + it->camera_offset_ms)
             {
-                //Start camera trigger
-                //trigger_out = 1;
+                //Start camera exposure and turn on LED
+                camTrigger = 0;
+                wait_us(10);
+                camTrigger = 1;
+                ledDrive = 1;
+                led_0 = 1;
                 triggered_flag = true;
             }
             else
             {
-                //trigger_out = 0;
+                //Stop camera exposure and turn off LED
+                camTrigger = 0;
+                ledDrive = 0;
+                led_0 = 0;
             }
 
-            wait_us(200);
+            wait_us(10000);
         }
         
     }
@@ -214,30 +225,24 @@
 
 
 
-
-
-
 int main()
 {
     pc.baud(115200);
     adc.init();
 
     buffer_length = sizeof(buffer)/sizeof(uint8_t);
-    pc.printf("\n\nInput configuration file\n");
+    pc.printf("# Input configuration file\n");
 
     //set up nanopb
     std::vector<memspcr_ThermalStep> profile;
     exp_config.profile.funcs.decode = decode_callback;
     exp_config.profile.arg = &profile;
 
-
     //read and decode configuration
     read_message();
-    pc.printf("\nMessage read\n");
+    pc.printf("# Message read\n");
     decode_message();
-    printf("\nMessage decoded\n");
-
-
+    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);
@@ -245,30 +250,31 @@
     //Select heater. Put control times in us for ticker functions
     if (exp_config.selected_heater == memspcr_ExperimentConfiguration_Heater_MAIN) {
         heater = heater_main;
+        heater_ID = heater_ID_main;
     } else if (exp_config.selected_heater == memspcr_ExperimentConfiguration_Heater_LYSIS) {
         heater = heater_lysis;
+        heater_ID = heater_ID_lysis;
     } else {
-        pc.printf("Error - no heater has been selected");
+        pc.printf("# Error - no heater has been selected");
         return 1;
     }
 
-    pc.printf("\nStarting pressure control\n");
+    pc.printf("# Starting pressure control\n");
     pressure_tick.attach(& pressure_control, 1);
-    pc.printf("\nWaiting for start signal to begin temperature control (type in an s or press button 0)\n");
+    pc.printf("# Waiting for start signal to begin temperature control (type in an s or press button 0)\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");
-
+    pc.printf("# Start signal received");
 
     logging_thread.start(& log_state);
     log_tick.attach_us(& log_trigger,exp_config.logging_interval_ms * 1000);
 
-
-    pc.printf("\nStarting routine\n");
+    pc.printf("# Starting routine\n");
+    pc.printf("#   heater,  time(ms),         r,      rSet\n");
     timer.start();
     set_point_routine(profile);
     
@@ -278,8 +284,7 @@
     wait(1);
     heater->turn_off();
 
-    pc.printf("Finished");
-    
-    
+    pc.printf("# Finished\n");
+     
     return 0;
 }
\ No newline at end of file