![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
LEX_Threaded_Programming
Dependencies: Heater_V2 MODSERIAL Nanopb FastPWM ADS8568_ADC
Diff: main.cpp
- 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