LEX_Threaded_Programming
Dependencies: Heater_V2 MODSERIAL Nanopb FastPWM ADS8568_ADC
main.cpp@0:54bedd3964e2, 2019-08-27 (annotated)
- Committer:
- omatthews
- Date:
- Tue Aug 27 07:51:34 2019 +0000
- Revision:
- 0:54bedd3964e2
- Child:
- 2:b27d8f9a6e49
Forgot ADC init
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
omatthews | 0:54bedd3964e2 | 1 | #include "mbed.h" |
omatthews | 0:54bedd3964e2 | 2 | #include "pb.h" |
omatthews | 0:54bedd3964e2 | 3 | #include "pb_decode.h" |
omatthews | 0:54bedd3964e2 | 4 | #include "pb_encode.h" |
omatthews | 0:54bedd3964e2 | 5 | #include "MODSERIAL.h" |
omatthews | 0:54bedd3964e2 | 6 | #include "ADS8568_ADC.h" |
omatthews | 0:54bedd3964e2 | 7 | #include "Heater.h" |
omatthews | 0:54bedd3964e2 | 8 | #include "FastPWM.h" |
omatthews | 0:54bedd3964e2 | 9 | #include "memspcr.pb.h" |
omatthews | 0:54bedd3964e2 | 10 | #include <vector> |
omatthews | 0:54bedd3964e2 | 11 | #include <iterator> |
omatthews | 0:54bedd3964e2 | 12 | |
omatthews | 0:54bedd3964e2 | 13 | |
omatthews | 0:54bedd3964e2 | 14 | #define ALL_CH 15 //value of convst bus to read all chanels simultaneosly |
omatthews | 0:54bedd3964e2 | 15 | Heater * heater; |
omatthews | 0:54bedd3964e2 | 16 | float r_gradient; |
omatthews | 0:54bedd3964e2 | 17 | int curr_time; |
omatthews | 0:54bedd3964e2 | 18 | |
omatthews | 0:54bedd3964e2 | 19 | MODSERIAL pc(PA_9, PA_10, 512); //mcu TX, RX, 512 byte TX and RX buffers |
omatthews | 0:54bedd3964e2 | 20 | ADS8568_ADC adc(PB_15, PB_14, PB_13, PB_12, PC_15, PC_0, PC_1, PC_2, PC_3); |
omatthews | 0:54bedd3964e2 | 21 | I2C i2c(PB_7, PB_8); //SDA, SCL |
omatthews | 0:54bedd3964e2 | 22 | Timer timer; |
omatthews | 0:54bedd3964e2 | 23 | DigitalIn adc_busy(PA_8); //Busy interrupt sig# |
omatthews | 0:54bedd3964e2 | 24 | int i; |
omatthews | 0:54bedd3964e2 | 25 | |
omatthews | 0:54bedd3964e2 | 26 | //Heater Control |
omatthews | 0:54bedd3964e2 | 27 | FastPWM drive_1(PC_9); |
omatthews | 0:54bedd3964e2 | 28 | FastPWM drive_2(PC_8); |
omatthews | 0:54bedd3964e2 | 29 | FastPWM guard_1(PC_7); |
omatthews | 0:54bedd3964e2 | 30 | FastPWM guard_2(PC_6); |
omatthews | 0:54bedd3964e2 | 31 | |
omatthews | 0:54bedd3964e2 | 32 | |
omatthews | 0:54bedd3964e2 | 33 | |
omatthews | 0:54bedd3964e2 | 34 | //indicator LEDs |
omatthews | 0:54bedd3964e2 | 35 | DigitalOut hb_led(PC_13); //Green |
omatthews | 0:54bedd3964e2 | 36 | DigitalOut led_0(PC_4); //Red |
omatthews | 0:54bedd3964e2 | 37 | DigitalOut led_1(PC_5); //Green |
omatthews | 0:54bedd3964e2 | 38 | |
omatthews | 0:54bedd3964e2 | 39 | //User buttons |
omatthews | 0:54bedd3964e2 | 40 | DigitalIn user_0(PB_0); |
omatthews | 0:54bedd3964e2 | 41 | DigitalIn user_1(PB_1); |
omatthews | 0:54bedd3964e2 | 42 | |
omatthews | 0:54bedd3964e2 | 43 | BusOut converts(PC_0, PC_1, PC_2, PC_3); |
omatthews | 0:54bedd3964e2 | 44 | |
omatthews | 0:54bedd3964e2 | 45 | |
omatthews | 0:54bedd3964e2 | 46 | //Threads |
omatthews | 0:54bedd3964e2 | 47 | Thread heater_control; |
omatthews | 0:54bedd3964e2 | 48 | |
omatthews | 0:54bedd3964e2 | 49 | //Tickers |
omatthews | 0:54bedd3964e2 | 50 | Ticker heat_tick; |
omatthews | 0:54bedd3964e2 | 51 | Ticker pressure_tick; |
omatthews | 0:54bedd3964e2 | 52 | Ticker log_tick; |
omatthews | 0:54bedd3964e2 | 53 | |
omatthews | 0:54bedd3964e2 | 54 | |
omatthews | 0:54bedd3964e2 | 55 | //Flags |
omatthews | 0:54bedd3964e2 | 56 | bool start_flag = false; |
omatthews | 0:54bedd3964e2 | 57 | bool config_flag = false; |
omatthews | 0:54bedd3964e2 | 58 | volatile bool heater_flag = false; |
omatthews | 0:54bedd3964e2 | 59 | bool triggered_flag = false; |
omatthews | 0:54bedd3964e2 | 60 | bool untriggered_flag = false; |
omatthews | 0:54bedd3964e2 | 61 | bool status = true; |
omatthews | 0:54bedd3964e2 | 62 | |
omatthews | 0:54bedd3964e2 | 63 | //Configuration data |
omatthews | 0:54bedd3964e2 | 64 | memspcr_ExperimentConfiguration exp_config = memspcr_ExperimentConfiguration_init_zero; |
omatthews | 0:54bedd3964e2 | 65 | int buffer_length; |
omatthews | 0:54bedd3964e2 | 66 | std::vector<memspcr_ThermalStep> profile; |
omatthews | 0:54bedd3964e2 | 67 | unsigned int c = 0; |
omatthews | 0:54bedd3964e2 | 68 | size_t message_length; |
omatthews | 0:54bedd3964e2 | 69 | uint8_t buffer[256]; |
omatthews | 0:54bedd3964e2 | 70 | |
omatthews | 0:54bedd3964e2 | 71 | |
omatthews | 0:54bedd3964e2 | 72 | |
omatthews | 0:54bedd3964e2 | 73 | |
omatthews | 0:54bedd3964e2 | 74 | //Functions for reading and decoding the message__________________________________________________ |
omatthews | 0:54bedd3964e2 | 75 | |
omatthews | 0:54bedd3964e2 | 76 | void read_message() |
omatthews | 0:54bedd3964e2 | 77 | { |
omatthews | 0:54bedd3964e2 | 78 | if (pc.scanf("%d",&message_length) < 0){pc.printf("Error reading message length");} |
omatthews | 0:54bedd3964e2 | 79 | pc.printf("Message is %d chars long, buffer length is %d\n",message_length,buffer_length); |
omatthews | 0:54bedd3964e2 | 80 | for (i = 0; i < message_length; i++) |
omatthews | 0:54bedd3964e2 | 81 | { |
omatthews | 0:54bedd3964e2 | 82 | i = i % buffer_length; |
omatthews | 0:54bedd3964e2 | 83 | pc.scanf("%02X",&c); |
omatthews | 0:54bedd3964e2 | 84 | buffer[i] = (char) c; |
omatthews | 0:54bedd3964e2 | 85 | } |
omatthews | 0:54bedd3964e2 | 86 | } |
omatthews | 0:54bedd3964e2 | 87 | |
omatthews | 0:54bedd3964e2 | 88 | void decode_message() |
omatthews | 0:54bedd3964e2 | 89 | { |
omatthews | 0:54bedd3964e2 | 90 | // Create a stream that reads from the buffer. |
omatthews | 0:54bedd3964e2 | 91 | |
omatthews | 0:54bedd3964e2 | 92 | pb_istream_t istream = pb_istream_from_buffer(buffer, message_length); |
omatthews | 0:54bedd3964e2 | 93 | |
omatthews | 0:54bedd3964e2 | 94 | //Now we are ready to decode the message. |
omatthews | 0:54bedd3964e2 | 95 | status = pb_decode(&istream, memspcr_ExperimentConfiguration_fields, &exp_config); |
omatthews | 0:54bedd3964e2 | 96 | |
omatthews | 0:54bedd3964e2 | 97 | // Check for errors... |
omatthews | 0:54bedd3964e2 | 98 | if (!status) |
omatthews | 0:54bedd3964e2 | 99 | { |
omatthews | 0:54bedd3964e2 | 100 | pc.printf("Decoding failed: %s\n", PB_GET_ERROR(&istream)); |
omatthews | 0:54bedd3964e2 | 101 | } |
omatthews | 0:54bedd3964e2 | 102 | } |
omatthews | 0:54bedd3964e2 | 103 | |
omatthews | 0:54bedd3964e2 | 104 | bool decode_callback(pb_istream_t *stream, const pb_field_t *field, void **arg) |
omatthews | 0:54bedd3964e2 | 105 | { |
omatthews | 0:54bedd3964e2 | 106 | vector <memspcr_ThermalStep> * dest = (vector <memspcr_ThermalStep> *)(*arg); |
omatthews | 0:54bedd3964e2 | 107 | memspcr_ThermalStep result = memspcr_ThermalStep_init_zero; |
omatthews | 0:54bedd3964e2 | 108 | status = pb_decode(stream, memspcr_ThermalStep_fields, & result); |
omatthews | 0:54bedd3964e2 | 109 | |
omatthews | 0:54bedd3964e2 | 110 | if (!status) |
omatthews | 0:54bedd3964e2 | 111 | { |
omatthews | 0:54bedd3964e2 | 112 | pc.printf("Decode callback failed\n"); |
omatthews | 0:54bedd3964e2 | 113 | } |
omatthews | 0:54bedd3964e2 | 114 | |
omatthews | 0:54bedd3964e2 | 115 | dest->push_back(result); |
omatthews | 0:54bedd3964e2 | 116 | return true; |
omatthews | 0:54bedd3964e2 | 117 | } |
omatthews | 0:54bedd3964e2 | 118 | |
omatthews | 0:54bedd3964e2 | 119 | |
omatthews | 0:54bedd3964e2 | 120 | //Ticking functions_________________________________________________________________ |
omatthews | 0:54bedd3964e2 | 121 | |
omatthews | 0:54bedd3964e2 | 122 | void temp_trigger() |
omatthews | 0:54bedd3964e2 | 123 | { |
omatthews | 0:54bedd3964e2 | 124 | //This function triggers a temperature update. |
omatthews | 0:54bedd3964e2 | 125 | //N.B. update cannot be called directly from a ticker as tickers and |
omatthews | 0:54bedd3964e2 | 126 | //reading the ADC both rely on interrupts. |
omatthews | 0:54bedd3964e2 | 127 | heater_flag = true; |
omatthews | 0:54bedd3964e2 | 128 | } |
omatthews | 0:54bedd3964e2 | 129 | |
omatthews | 0:54bedd3964e2 | 130 | void pressure_control() |
omatthews | 0:54bedd3964e2 | 131 | { |
omatthews | 0:54bedd3964e2 | 132 | //Input pressure control function here |
omatthews | 0:54bedd3964e2 | 133 | //i.e. |
omatthews | 0:54bedd3964e2 | 134 | //read_pressure(); |
omatthews | 0:54bedd3964e2 | 135 | //if (pressure < lower_bound) { |
omatthews | 0:54bedd3964e2 | 136 | //pump_turn_on(); |
omatthews | 0:54bedd3964e2 | 137 | //} |
omatthews | 0:54bedd3964e2 | 138 | //else if (pressure > upper_bound) { |
omatthews | 0:54bedd3964e2 | 139 | //pump_turn_off(); |
omatthews | 0:54bedd3964e2 | 140 | //} |
omatthews | 0:54bedd3964e2 | 141 | led_1 = !led_1; |
omatthews | 0:54bedd3964e2 | 142 | } |
omatthews | 0:54bedd3964e2 | 143 | |
omatthews | 0:54bedd3964e2 | 144 | void log_state() |
omatthews | 0:54bedd3964e2 | 145 | { |
omatthews | 0:54bedd3964e2 | 146 | heater->log(); |
omatthews | 0:54bedd3964e2 | 147 | } |
omatthews | 0:54bedd3964e2 | 148 | |
omatthews | 0:54bedd3964e2 | 149 | |
omatthews | 0:54bedd3964e2 | 150 | //Other functions__________________________________________________________________ |
omatthews | 0:54bedd3964e2 | 151 | |
omatthews | 0:54bedd3964e2 | 152 | |
omatthews | 0:54bedd3964e2 | 153 | void temp_control() { |
omatthews | 0:54bedd3964e2 | 154 | while(1){ |
omatthews | 0:54bedd3964e2 | 155 | while(!heater_flag); |
omatthews | 0:54bedd3964e2 | 156 | led_0 = !led_0; |
omatthews | 0:54bedd3964e2 | 157 | heater->read(); |
omatthews | 0:54bedd3964e2 | 158 | heater->update(); |
omatthews | 0:54bedd3964e2 | 159 | heater_flag = false; |
omatthews | 0:54bedd3964e2 | 160 | } |
omatthews | 0:54bedd3964e2 | 161 | } |
omatthews | 0:54bedd3964e2 | 162 | |
omatthews | 0:54bedd3964e2 | 163 | |
omatthews | 0:54bedd3964e2 | 164 | void set_point_routine() { |
omatthews | 0:54bedd3964e2 | 165 | memspcr_ThermalStep step; |
omatthews | 0:54bedd3964e2 | 166 | step.resistance = 0.0; |
omatthews | 0:54bedd3964e2 | 167 | step.elapsed_time_ms = 0; |
omatthews | 0:54bedd3964e2 | 168 | step.camera_offset_ms = 0; |
omatthews | 0:54bedd3964e2 | 169 | vector <memspcr_ThermalStep>::iterator it = profile.begin(); |
omatthews | 0:54bedd3964e2 | 170 | vector <memspcr_ThermalStep>::iterator it_prev; |
omatthews | 0:54bedd3964e2 | 171 | profile.insert(it,step); |
omatthews | 0:54bedd3964e2 | 172 | |
omatthews | 0:54bedd3964e2 | 173 | for (it_prev = profile.begin(); it < profile.end(); it ++, it_prev++){ |
omatthews | 0:54bedd3964e2 | 174 | triggered_flag = false; |
omatthews | 0:54bedd3964e2 | 175 | untriggered_flag = false; |
omatthews | 0:54bedd3964e2 | 176 | r_gradient = (it->resistance - it_prev->resistance)/(it->elapsed_time_ms - it_prev->elapsed_time_ms); |
omatthews | 0:54bedd3964e2 | 177 | while ((curr_time = timer.read_ms()) <= it->elapsed_time_ms){ |
omatthews | 0:54bedd3964e2 | 178 | heater->Set_ref(it_prev->resistance + r_gradient * (curr_time - it_prev->elapsed_time_ms)); |
omatthews | 0:54bedd3964e2 | 179 | |
omatthews | 0:54bedd3964e2 | 180 | if (!untriggered_flag && triggered_flag) |
omatthews | 0:54bedd3964e2 | 181 | { |
omatthews | 0:54bedd3964e2 | 182 | //Untrigger on the next cycle |
omatthews | 0:54bedd3964e2 | 183 | //trigger_out = 0; |
omatthews | 0:54bedd3964e2 | 184 | untriggered_flag = true; |
omatthews | 0:54bedd3964e2 | 185 | } |
omatthews | 0:54bedd3964e2 | 186 | |
omatthews | 0:54bedd3964e2 | 187 | if (!triggered_flag && curr_time > it_prev->elapsed_time_ms + it->camera_offset_ms) |
omatthews | 0:54bedd3964e2 | 188 | { |
omatthews | 0:54bedd3964e2 | 189 | //Start camera trigger |
omatthews | 0:54bedd3964e2 | 190 | //trigger_out = 1; |
omatthews | 0:54bedd3964e2 | 191 | triggered_flag = true; |
omatthews | 0:54bedd3964e2 | 192 | } |
omatthews | 0:54bedd3964e2 | 193 | |
omatthews | 0:54bedd3964e2 | 194 | wait_ms(1); |
omatthews | 0:54bedd3964e2 | 195 | } |
omatthews | 0:54bedd3964e2 | 196 | |
omatthews | 0:54bedd3964e2 | 197 | } |
omatthews | 0:54bedd3964e2 | 198 | } |
omatthews | 0:54bedd3964e2 | 199 | |
omatthews | 0:54bedd3964e2 | 200 | |
omatthews | 0:54bedd3964e2 | 201 | |
omatthews | 0:54bedd3964e2 | 202 | |
omatthews | 0:54bedd3964e2 | 203 | |
omatthews | 0:54bedd3964e2 | 204 | |
omatthews | 0:54bedd3964e2 | 205 | int main() { |
omatthews | 0:54bedd3964e2 | 206 | pc.baud(115200); |
omatthews | 0:54bedd3964e2 | 207 | adc.init(); |
omatthews | 0:54bedd3964e2 | 208 | buffer_length = sizeof(buffer)/sizeof(uint8_t); |
omatthews | 0:54bedd3964e2 | 209 | pc.printf("Input configuration file\n"); |
omatthews | 0:54bedd3964e2 | 210 | |
omatthews | 0:54bedd3964e2 | 211 | read_message(); |
omatthews | 0:54bedd3964e2 | 212 | |
omatthews | 0:54bedd3964e2 | 213 | pc.printf("\nMessage read\n"); |
omatthews | 0:54bedd3964e2 | 214 | |
omatthews | 0:54bedd3964e2 | 215 | exp_config.thermal.profile.arg = &profile; |
omatthews | 0:54bedd3964e2 | 216 | exp_config.thermal.profile.funcs.decode = decode_callback; |
omatthews | 0:54bedd3964e2 | 217 | |
omatthews | 0:54bedd3964e2 | 218 | |
omatthews | 0:54bedd3964e2 | 219 | decode_message(); |
omatthews | 0:54bedd3964e2 | 220 | printf("\nMessage decoded\n"); |
omatthews | 0:54bedd3964e2 | 221 | Heater heater_(exp_config.thermal); |
omatthews | 0:54bedd3964e2 | 222 | heater = &heater_; |
omatthews | 0:54bedd3964e2 | 223 | |
omatthews | 0:54bedd3964e2 | 224 | pc.printf("\nStarting pressure control\n"); |
omatthews | 0:54bedd3964e2 | 225 | pressure_tick.attach(& pressure_control, 1); |
omatthews | 0:54bedd3964e2 | 226 | pc.printf("\nWaiting for start signal to begin temperature control\n"); |
omatthews | 0:54bedd3964e2 | 227 | |
omatthews | 0:54bedd3964e2 | 228 | while (pc.getc()!='s'); |
omatthews | 0:54bedd3964e2 | 229 | |
omatthews | 0:54bedd3964e2 | 230 | pc.printf("Start signal received"); |
omatthews | 0:54bedd3964e2 | 231 | heater_control.start(& temp_control); |
omatthews | 0:54bedd3964e2 | 232 | heat_tick.attach_us(& temp_trigger,exp_config.thermal.control_loop_interval); |
omatthews | 0:54bedd3964e2 | 233 | |
omatthews | 0:54bedd3964e2 | 234 | log_tick.attach_us(& log_state,exp_config.logging_interval_ms * 1000); |
omatthews | 0:54bedd3964e2 | 235 | |
omatthews | 0:54bedd3964e2 | 236 | |
omatthews | 0:54bedd3964e2 | 237 | pc.printf("\nStarting routine\n"); |
omatthews | 0:54bedd3964e2 | 238 | set_point_routine(); |
omatthews | 0:54bedd3964e2 | 239 | pc.printf("Finished"); |
omatthews | 0:54bedd3964e2 | 240 | |
omatthews | 0:54bedd3964e2 | 241 | |
omatthews | 0:54bedd3964e2 | 242 | } |