Oliver Keller
/
muonhunter-K8
experimental fork
main.cpp@1:549e331aefab, 2016-10-04 (annotated)
- Committer:
- mva111
- Date:
- Tue Oct 04 11:21:03 2016 +0000
- Revision:
- 1:549e331aefab
- Parent:
- 0:52895a475820
- Child:
- 2:66a2e52ad175
example pc serial code added
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mva111 | 0:52895a475820 | 1 | #include "mbed.h" |
mva111 | 0:52895a475820 | 2 | #include "hvcontrol.cpp" |
mva111 | 0:52895a475820 | 3 | #include "detection.cpp" |
mva111 | 0:52895a475820 | 4 | #include <queue> |
mva111 | 0:52895a475820 | 5 | |
mva111 | 0:52895a475820 | 6 | //typically around 2 min data |
mva111 | 0:52895a475820 | 7 | //assuming normal background |
mva111 | 0:52895a475820 | 8 | #define DETECTION_MEMORY_LIMIT 128 |
mva111 | 0:52895a475820 | 9 | |
mva111 | 0:52895a475820 | 10 | //doesn't log the GM hits with a timestamp |
mva111 | 0:52895a475820 | 11 | //only counts them when set to 1 |
mva111 | 0:52895a475820 | 12 | #define DETECT_MUONS_ONLY 0 |
mva111 | 0:52895a475820 | 13 | |
mva111 | 0:52895a475820 | 14 | //set the coincidence time window in us |
mva111 | 0:52895a475820 | 15 | int coincidence_wait = 150; |
mva111 | 0:52895a475820 | 16 | bool mdet = 0; |
mva111 | 1:549e331aefab | 17 | bool buzzer = 0; |
mva111 | 0:52895a475820 | 18 | |
mva111 | 0:52895a475820 | 19 | int muon_total; |
mva111 | 0:52895a475820 | 20 | int gm1_total; |
mva111 | 0:52895a475820 | 21 | int gm2_total; |
mva111 | 0:52895a475820 | 22 | |
mva111 | 0:52895a475820 | 23 | //storing a detections in a FIFO queue |
mva111 | 0:52895a475820 | 24 | queue<Detection> detections; |
mva111 | 0:52895a475820 | 25 | |
mva111 | 0:52895a475820 | 26 | //High voltage controls |
mva111 | 0:52895a475820 | 27 | HVControl hv1(PA_3, PA_0); |
mva111 | 0:52895a475820 | 28 | HVControl hv2(PB_1, PA_1); |
mva111 | 0:52895a475820 | 29 | |
mva111 | 0:52895a475820 | 30 | Serial rpi(PA_9,PA_10); |
mva111 | 0:52895a475820 | 31 | |
mva111 | 0:52895a475820 | 32 | Timer coincidence_timer; |
mva111 | 0:52895a475820 | 33 | Timer main_t; |
mva111 | 0:52895a475820 | 34 | |
mva111 | 0:52895a475820 | 35 | Serial pc(USBTX, USBRX); |
mva111 | 0:52895a475820 | 36 | // Ticker debug; |
mva111 | 0:52895a475820 | 37 | Ticker hv1monitor; |
mva111 | 0:52895a475820 | 38 | Ticker hv2monitor; |
mva111 | 0:52895a475820 | 39 | Ticker memory_checker; |
mva111 | 0:52895a475820 | 40 | |
mva111 | 0:52895a475820 | 41 | DigitalOut led(LED1); |
mva111 | 0:52895a475820 | 42 | DigitalOut GM1_led(PA_12); |
mva111 | 0:52895a475820 | 43 | DigitalOut GM2_led(PA_8); |
mva111 | 0:52895a475820 | 44 | DigitalOut C_led(PA_11); |
mva111 | 0:52895a475820 | 45 | DigitalOut Buzzer(PF_0); |
mva111 | 0:52895a475820 | 46 | |
mva111 | 0:52895a475820 | 47 | InterruptIn GM1(PB_0); |
mva111 | 0:52895a475820 | 48 | InterruptIn GM2(PF_1); |
mva111 | 0:52895a475820 | 49 | |
mva111 | 0:52895a475820 | 50 | //global variables for voltages |
mva111 | 0:52895a475820 | 51 | volatile float v1 = 0; |
mva111 | 0:52895a475820 | 52 | volatile float v2 = 0; |
mva111 | 0:52895a475820 | 53 | |
mva111 | 0:52895a475820 | 54 | //ui functions |
mva111 | 0:52895a475820 | 55 | void reset_counters (void){ |
mva111 | 0:52895a475820 | 56 | muon_total = 0; |
mva111 | 0:52895a475820 | 57 | gm1_total = 0; |
mva111 | 0:52895a475820 | 58 | gm2_total = 0; |
mva111 | 0:52895a475820 | 59 | } |
mva111 | 0:52895a475820 | 60 | |
mva111 | 0:52895a475820 | 61 | void muon_buzz(void){ |
mva111 | 0:52895a475820 | 62 | C_led = 1; |
mva111 | 1:549e331aefab | 63 | |
mva111 | 1:549e331aefab | 64 | if(buzzer){ |
mva111 | 1:549e331aefab | 65 | for(int i = 0; i < 32; i++){ |
mva111 | 1:549e331aefab | 66 | Buzzer = !Buzzer; |
mva111 | 1:549e331aefab | 67 | wait(0.002); |
mva111 | 1:549e331aefab | 68 | }} else { |
mva111 | 1:549e331aefab | 69 | wait(0.05); |
mva111 | 1:549e331aefab | 70 | } |
mva111 | 1:549e331aefab | 71 | |
mva111 | 0:52895a475820 | 72 | C_led = 0; |
mva111 | 0:52895a475820 | 73 | } |
mva111 | 0:52895a475820 | 74 | |
mva111 | 0:52895a475820 | 75 | void GM1_buzz(void){ |
mva111 | 0:52895a475820 | 76 | GM1_led = 1; |
mva111 | 1:549e331aefab | 77 | if(buzzer){ |
mva111 | 0:52895a475820 | 78 | for(int i = 0; i < 16; i++) |
mva111 | 0:52895a475820 | 79 | { Buzzer = !Buzzer; |
mva111 | 0:52895a475820 | 80 | wait(0.001); |
mva111 | 1:549e331aefab | 81 | }} else { |
mva111 | 1:549e331aefab | 82 | wait(0.05); |
mva111 | 1:549e331aefab | 83 | } |
mva111 | 0:52895a475820 | 84 | GM1_led = 0; |
mva111 | 0:52895a475820 | 85 | } |
mva111 | 0:52895a475820 | 86 | |
mva111 | 0:52895a475820 | 87 | void GM2_buzz(void){ |
mva111 | 0:52895a475820 | 88 | GM2_led = 1; |
mva111 | 1:549e331aefab | 89 | if(buzzer){ |
mva111 | 0:52895a475820 | 90 | for(int i = 0; i < 16; i++) |
mva111 | 0:52895a475820 | 91 | { Buzzer = !Buzzer; |
mva111 | 0:52895a475820 | 92 | wait(0.001); |
mva111 | 1:549e331aefab | 93 | }} else { |
mva111 | 1:549e331aefab | 94 | wait(0.05); |
mva111 | 1:549e331aefab | 95 | } |
mva111 | 0:52895a475820 | 96 | GM2_led = 0; |
mva111 | 0:52895a475820 | 97 | } |
mva111 | 0:52895a475820 | 98 | |
mva111 | 0:52895a475820 | 99 | |
mva111 | 0:52895a475820 | 100 | //adds a detection onto the queue |
mva111 | 0:52895a475820 | 101 | void add_detection(int channel, float time){ |
mva111 | 1:549e331aefab | 102 | Detection* det = new Detection(channel, time); |
mva111 | 0:52895a475820 | 103 | detections.push(*det); |
mva111 | 0:52895a475820 | 104 | delete det; |
mva111 | 0:52895a475820 | 105 | } |
mva111 | 0:52895a475820 | 106 | |
mva111 | 0:52895a475820 | 107 | //callback for GM1 detection |
mva111 | 0:52895a475820 | 108 | void GM1_hit(void){ |
mva111 | 0:52895a475820 | 109 | coincidence_timer.start(); |
mva111 | 0:52895a475820 | 110 | while(coincidence_timer.read_us() < coincidence_wait){ |
mva111 | 0:52895a475820 | 111 | if(GM2 == 0){ |
mva111 | 0:52895a475820 | 112 | add_detection(3, main_t.read()); |
mva111 | 0:52895a475820 | 113 | muon_buzz(); |
mva111 | 0:52895a475820 | 114 | muon_total++; |
mva111 | 0:52895a475820 | 115 | mdet = 1; |
mva111 | 0:52895a475820 | 116 | } |
mva111 | 0:52895a475820 | 117 | wait(1e-7); |
mva111 | 0:52895a475820 | 118 | } |
mva111 | 0:52895a475820 | 119 | coincidence_timer.stop(); |
mva111 | 0:52895a475820 | 120 | coincidence_timer.reset(); |
mva111 | 0:52895a475820 | 121 | if(mdet == 0) GM1_buzz(); |
mva111 | 0:52895a475820 | 122 | if ( !DETECT_MUONS_ONLY ) add_detection(1, main_t.read()); |
mva111 | 0:52895a475820 | 123 | gm1_total++; |
mva111 | 0:52895a475820 | 124 | mdet = 0; |
mva111 | 0:52895a475820 | 125 | } |
mva111 | 0:52895a475820 | 126 | |
mva111 | 0:52895a475820 | 127 | //callback for GM2 detection |
mva111 | 0:52895a475820 | 128 | void GM2_hit(void){ |
mva111 | 0:52895a475820 | 129 | coincidence_timer.start(); |
mva111 | 0:52895a475820 | 130 | while(coincidence_timer.read_us() < coincidence_wait){ |
mva111 | 0:52895a475820 | 131 | if(GM1 == 0){ |
mva111 | 0:52895a475820 | 132 | add_detection(3, main_t.read()); |
mva111 | 0:52895a475820 | 133 | muon_buzz(); |
mva111 | 0:52895a475820 | 134 | muon_total++; |
mva111 | 0:52895a475820 | 135 | mdet = 1; |
mva111 | 0:52895a475820 | 136 | } |
mva111 | 0:52895a475820 | 137 | wait(1e-7); |
mva111 | 0:52895a475820 | 138 | } |
mva111 | 0:52895a475820 | 139 | coincidence_timer.stop(); |
mva111 | 0:52895a475820 | 140 | coincidence_timer.reset(); |
mva111 | 0:52895a475820 | 141 | if(mdet == 0) GM2_buzz(); |
mva111 | 0:52895a475820 | 142 | if ( !DETECT_MUONS_ONLY ) add_detection(2, main_t.read()); |
mva111 | 0:52895a475820 | 143 | gm2_total++; |
mva111 | 0:52895a475820 | 144 | mdet = 0; |
mva111 | 0:52895a475820 | 145 | } |
mva111 | 0:52895a475820 | 146 | |
mva111 | 0:52895a475820 | 147 | // high voltage software monitors |
mva111 | 0:52895a475820 | 148 | void hv1monitor_(void){ |
mva111 | 0:52895a475820 | 149 | if(hv1.measure()){ |
mva111 | 0:52895a475820 | 150 | if(v1 - hv1.get_voltage() > 100){ hv1.shutdown(); } //unusual voltage drop detected |
mva111 | 0:52895a475820 | 151 | }else{ hv1.shutdown(); } |
mva111 | 0:52895a475820 | 152 | v1 = hv1.get_voltage(); |
mva111 | 0:52895a475820 | 153 | } |
mva111 | 0:52895a475820 | 154 | |
mva111 | 0:52895a475820 | 155 | void hv2monitor_(void){ |
mva111 | 0:52895a475820 | 156 | if(hv2.measure()){ |
mva111 | 0:52895a475820 | 157 | if(v2 - hv2.get_voltage() > 100){ hv2.shutdown(); } //unusual voltage drop detected |
mva111 | 0:52895a475820 | 158 | }else{ hv2.shutdown(); } |
mva111 | 0:52895a475820 | 159 | v2 = hv2.get_voltage(); |
mva111 | 0:52895a475820 | 160 | } |
mva111 | 0:52895a475820 | 161 | |
mva111 | 0:52895a475820 | 162 | //discarding older items if buffer gets too big |
mva111 | 0:52895a475820 | 163 | void memory_checker_(void){ |
mva111 | 0:52895a475820 | 164 | if ( detections.size() > (DETECTION_MEMORY_LIMIT - (DETECTION_MEMORY_LIMIT/8)) ){ |
mva111 | 0:52895a475820 | 165 | while ( detections.size() > (DETECTION_MEMORY_LIMIT - (DETECTION_MEMORY_LIMIT/4)) ){ |
mva111 | 0:52895a475820 | 166 | detections.pop(); |
mva111 | 0:52895a475820 | 167 | } |
mva111 | 0:52895a475820 | 168 | } |
mva111 | 0:52895a475820 | 169 | } |
mva111 | 0:52895a475820 | 170 | |
mva111 | 0:52895a475820 | 171 | int main() { |
mva111 | 0:52895a475820 | 172 | //start main timer |
mva111 | 0:52895a475820 | 173 | main_t.start(); |
mva111 | 0:52895a475820 | 174 | |
mva111 | 0:52895a475820 | 175 | hv1.set_frequency(4500); |
mva111 | 0:52895a475820 | 176 | hv2.set_frequency(4500); |
mva111 | 0:52895a475820 | 177 | GM1.fall(&GM1_hit); |
mva111 | 0:52895a475820 | 178 | GM2.fall(&GM2_hit); |
mva111 | 0:52895a475820 | 179 | |
mva111 | 0:52895a475820 | 180 | //tickers to monitor the high voltage |
mva111 | 0:52895a475820 | 181 | hv1monitor.attach(&hv1monitor_, 0.1); |
mva111 | 0:52895a475820 | 182 | hv2monitor.attach(&hv2monitor_, 0.1); |
mva111 | 0:52895a475820 | 183 | |
mva111 | 0:52895a475820 | 184 | //ticker to monitor memory usage |
mva111 | 0:52895a475820 | 185 | memory_checker.attach(&memory_checker_, 0.1); |
mva111 | 0:52895a475820 | 186 | while(1){ |
mva111 | 1:549e331aefab | 187 | if(detections.size() > 1){ |
mva111 | 1:549e331aefab | 188 | Detection temp = detections.front(); |
mva111 | 1:549e331aefab | 189 | pc.printf("%d, %d, %f\n", detections.size(), temp.get_channel(), temp.get_time()); |
mva111 | 1:549e331aefab | 190 | detections.pop(); |
mva111 | 1:549e331aefab | 191 | } |
mva111 | 1:549e331aefab | 192 | wait(1); |
mva111 | 0:52895a475820 | 193 | } |
mva111 | 0:52895a475820 | 194 | } |