Oliver Keller
/
muonhunter-K8
experimental fork
main.cpp@0:52895a475820, 2016-10-04 (annotated)
- Committer:
- mva111
- Date:
- Tue Oct 04 09:34:20 2016 +0000
- Revision:
- 0:52895a475820
- Child:
- 1:549e331aefab
initial;
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 | 0:52895a475820 | 17 | |
mva111 | 0:52895a475820 | 18 | int muon_total; |
mva111 | 0:52895a475820 | 19 | int gm1_total; |
mva111 | 0:52895a475820 | 20 | int gm2_total; |
mva111 | 0:52895a475820 | 21 | |
mva111 | 0:52895a475820 | 22 | //storing a detections in a FIFO queue |
mva111 | 0:52895a475820 | 23 | queue<Detection> detections; |
mva111 | 0:52895a475820 | 24 | |
mva111 | 0:52895a475820 | 25 | //High voltage controls |
mva111 | 0:52895a475820 | 26 | HVControl hv1(PA_3, PA_0); |
mva111 | 0:52895a475820 | 27 | HVControl hv2(PB_1, PA_1); |
mva111 | 0:52895a475820 | 28 | |
mva111 | 0:52895a475820 | 29 | Serial rpi(PA_9,PA_10); |
mva111 | 0:52895a475820 | 30 | |
mva111 | 0:52895a475820 | 31 | Timer coincidence_timer; |
mva111 | 0:52895a475820 | 32 | Timer main_t; |
mva111 | 0:52895a475820 | 33 | |
mva111 | 0:52895a475820 | 34 | Serial pc(USBTX, USBRX); |
mva111 | 0:52895a475820 | 35 | // Ticker debug; |
mva111 | 0:52895a475820 | 36 | Ticker hv1monitor; |
mva111 | 0:52895a475820 | 37 | Ticker hv2monitor; |
mva111 | 0:52895a475820 | 38 | Ticker memory_checker; |
mva111 | 0:52895a475820 | 39 | |
mva111 | 0:52895a475820 | 40 | DigitalOut led(LED1); |
mva111 | 0:52895a475820 | 41 | DigitalOut GM1_led(PA_12); |
mva111 | 0:52895a475820 | 42 | DigitalOut GM2_led(PA_8); |
mva111 | 0:52895a475820 | 43 | DigitalOut C_led(PA_11); |
mva111 | 0:52895a475820 | 44 | DigitalOut Buzzer(PF_0); |
mva111 | 0:52895a475820 | 45 | |
mva111 | 0:52895a475820 | 46 | InterruptIn GM1(PB_0); |
mva111 | 0:52895a475820 | 47 | InterruptIn GM2(PF_1); |
mva111 | 0:52895a475820 | 48 | |
mva111 | 0:52895a475820 | 49 | //global variables for voltages |
mva111 | 0:52895a475820 | 50 | volatile float v1 = 0; |
mva111 | 0:52895a475820 | 51 | volatile float v2 = 0; |
mva111 | 0:52895a475820 | 52 | |
mva111 | 0:52895a475820 | 53 | //ui functions |
mva111 | 0:52895a475820 | 54 | void reset_counters (void){ |
mva111 | 0:52895a475820 | 55 | muon_total = 0; |
mva111 | 0:52895a475820 | 56 | gm1_total = 0; |
mva111 | 0:52895a475820 | 57 | gm2_total = 0; |
mva111 | 0:52895a475820 | 58 | } |
mva111 | 0:52895a475820 | 59 | |
mva111 | 0:52895a475820 | 60 | void muon_buzz(void){ |
mva111 | 0:52895a475820 | 61 | C_led = 1; |
mva111 | 0:52895a475820 | 62 | for(int i = 0; i < 32; i++){ |
mva111 | 0:52895a475820 | 63 | Buzzer = !Buzzer; |
mva111 | 0:52895a475820 | 64 | wait(0.002); |
mva111 | 0:52895a475820 | 65 | } |
mva111 | 0:52895a475820 | 66 | C_led = 0; |
mva111 | 0:52895a475820 | 67 | } |
mva111 | 0:52895a475820 | 68 | |
mva111 | 0:52895a475820 | 69 | void GM1_buzz(void){ |
mva111 | 0:52895a475820 | 70 | GM1_led = 1; |
mva111 | 0:52895a475820 | 71 | for(int i = 0; i < 16; i++) |
mva111 | 0:52895a475820 | 72 | { Buzzer = !Buzzer; |
mva111 | 0:52895a475820 | 73 | wait(0.001); |
mva111 | 0:52895a475820 | 74 | } |
mva111 | 0:52895a475820 | 75 | GM1_led = 0; |
mva111 | 0:52895a475820 | 76 | } |
mva111 | 0:52895a475820 | 77 | |
mva111 | 0:52895a475820 | 78 | void GM2_buzz(void){ |
mva111 | 0:52895a475820 | 79 | GM2_led = 1; |
mva111 | 0:52895a475820 | 80 | for(int i = 0; i < 16; i++) |
mva111 | 0:52895a475820 | 81 | { Buzzer = !Buzzer; |
mva111 | 0:52895a475820 | 82 | wait(0.001); |
mva111 | 0:52895a475820 | 83 | } |
mva111 | 0:52895a475820 | 84 | GM2_led = 0; |
mva111 | 0:52895a475820 | 85 | } |
mva111 | 0:52895a475820 | 86 | |
mva111 | 0:52895a475820 | 87 | |
mva111 | 0:52895a475820 | 88 | //adds a detection onto the queue |
mva111 | 0:52895a475820 | 89 | void add_detection(int channel, float time){ |
mva111 | 0:52895a475820 | 90 | Detection* det; |
mva111 | 0:52895a475820 | 91 | det = new Detection(channel, time); |
mva111 | 0:52895a475820 | 92 | detections.push(*det); |
mva111 | 0:52895a475820 | 93 | delete det; |
mva111 | 0:52895a475820 | 94 | } |
mva111 | 0:52895a475820 | 95 | |
mva111 | 0:52895a475820 | 96 | //callback for GM1 detection |
mva111 | 0:52895a475820 | 97 | void GM1_hit(void){ |
mva111 | 0:52895a475820 | 98 | coincidence_timer.start(); |
mva111 | 0:52895a475820 | 99 | while(coincidence_timer.read_us() < coincidence_wait){ |
mva111 | 0:52895a475820 | 100 | if(GM2 == 0){ |
mva111 | 0:52895a475820 | 101 | add_detection(3, main_t.read()); |
mva111 | 0:52895a475820 | 102 | muon_buzz(); |
mva111 | 0:52895a475820 | 103 | muon_total++; |
mva111 | 0:52895a475820 | 104 | mdet = 1; |
mva111 | 0:52895a475820 | 105 | } |
mva111 | 0:52895a475820 | 106 | wait(1e-7); |
mva111 | 0:52895a475820 | 107 | } |
mva111 | 0:52895a475820 | 108 | coincidence_timer.stop(); |
mva111 | 0:52895a475820 | 109 | coincidence_timer.reset(); |
mva111 | 0:52895a475820 | 110 | if(mdet == 0) GM1_buzz(); |
mva111 | 0:52895a475820 | 111 | if ( !DETECT_MUONS_ONLY ) add_detection(1, main_t.read()); |
mva111 | 0:52895a475820 | 112 | gm1_total++; |
mva111 | 0:52895a475820 | 113 | mdet = 0; |
mva111 | 0:52895a475820 | 114 | } |
mva111 | 0:52895a475820 | 115 | |
mva111 | 0:52895a475820 | 116 | //callback for GM2 detection |
mva111 | 0:52895a475820 | 117 | void GM2_hit(void){ |
mva111 | 0:52895a475820 | 118 | coincidence_timer.start(); |
mva111 | 0:52895a475820 | 119 | while(coincidence_timer.read_us() < coincidence_wait){ |
mva111 | 0:52895a475820 | 120 | if(GM1 == 0){ |
mva111 | 0:52895a475820 | 121 | add_detection(3, main_t.read()); |
mva111 | 0:52895a475820 | 122 | muon_buzz(); |
mva111 | 0:52895a475820 | 123 | muon_total++; |
mva111 | 0:52895a475820 | 124 | mdet = 1; |
mva111 | 0:52895a475820 | 125 | } |
mva111 | 0:52895a475820 | 126 | wait(1e-7); |
mva111 | 0:52895a475820 | 127 | } |
mva111 | 0:52895a475820 | 128 | coincidence_timer.stop(); |
mva111 | 0:52895a475820 | 129 | coincidence_timer.reset(); |
mva111 | 0:52895a475820 | 130 | if(mdet == 0) GM2_buzz(); |
mva111 | 0:52895a475820 | 131 | if ( !DETECT_MUONS_ONLY ) add_detection(2, main_t.read()); |
mva111 | 0:52895a475820 | 132 | gm2_total++; |
mva111 | 0:52895a475820 | 133 | mdet = 0; |
mva111 | 0:52895a475820 | 134 | } |
mva111 | 0:52895a475820 | 135 | |
mva111 | 0:52895a475820 | 136 | // high voltage software monitors |
mva111 | 0:52895a475820 | 137 | void hv1monitor_(void){ |
mva111 | 0:52895a475820 | 138 | if(hv1.measure()){ |
mva111 | 0:52895a475820 | 139 | if(v1 - hv1.get_voltage() > 100){ hv1.shutdown(); } //unusual voltage drop detected |
mva111 | 0:52895a475820 | 140 | }else{ hv1.shutdown(); } |
mva111 | 0:52895a475820 | 141 | v1 = hv1.get_voltage(); |
mva111 | 0:52895a475820 | 142 | } |
mva111 | 0:52895a475820 | 143 | |
mva111 | 0:52895a475820 | 144 | void hv2monitor_(void){ |
mva111 | 0:52895a475820 | 145 | if(hv2.measure()){ |
mva111 | 0:52895a475820 | 146 | if(v2 - hv2.get_voltage() > 100){ hv2.shutdown(); } //unusual voltage drop detected |
mva111 | 0:52895a475820 | 147 | }else{ hv2.shutdown(); } |
mva111 | 0:52895a475820 | 148 | v2 = hv2.get_voltage(); |
mva111 | 0:52895a475820 | 149 | } |
mva111 | 0:52895a475820 | 150 | |
mva111 | 0:52895a475820 | 151 | //discarding older items if buffer gets too big |
mva111 | 0:52895a475820 | 152 | void memory_checker_(void){ |
mva111 | 0:52895a475820 | 153 | if ( detections.size() > (DETECTION_MEMORY_LIMIT - (DETECTION_MEMORY_LIMIT/8)) ){ |
mva111 | 0:52895a475820 | 154 | while ( detections.size() > (DETECTION_MEMORY_LIMIT - (DETECTION_MEMORY_LIMIT/4)) ){ |
mva111 | 0:52895a475820 | 155 | detections.pop(); |
mva111 | 0:52895a475820 | 156 | } |
mva111 | 0:52895a475820 | 157 | } |
mva111 | 0:52895a475820 | 158 | } |
mva111 | 0:52895a475820 | 159 | |
mva111 | 0:52895a475820 | 160 | int main() { |
mva111 | 0:52895a475820 | 161 | //start main timer |
mva111 | 0:52895a475820 | 162 | main_t.start(); |
mva111 | 0:52895a475820 | 163 | |
mva111 | 0:52895a475820 | 164 | hv1.set_frequency(4500); |
mva111 | 0:52895a475820 | 165 | hv2.set_frequency(4500); |
mva111 | 0:52895a475820 | 166 | GM1.fall(&GM1_hit); |
mva111 | 0:52895a475820 | 167 | GM2.fall(&GM2_hit); |
mva111 | 0:52895a475820 | 168 | |
mva111 | 0:52895a475820 | 169 | //tickers to monitor the high voltage |
mva111 | 0:52895a475820 | 170 | hv1monitor.attach(&hv1monitor_, 0.1); |
mva111 | 0:52895a475820 | 171 | hv2monitor.attach(&hv2monitor_, 0.1); |
mva111 | 0:52895a475820 | 172 | |
mva111 | 0:52895a475820 | 173 | //ticker to monitor memory usage |
mva111 | 0:52895a475820 | 174 | memory_checker.attach(&memory_checker_, 0.1); |
mva111 | 0:52895a475820 | 175 | |
mva111 | 0:52895a475820 | 176 | while(1){ |
mva111 | 0:52895a475820 | 177 | } |
mva111 | 0:52895a475820 | 178 | } |