experimental fork

Dependencies:   NOKIA_5110 mbed

Committer:
mva111
Date:
Tue Oct 04 09:34:20 2016 +0000
Revision:
0:52895a475820
Child:
1:549e331aefab
initial;

Who changed what in which revision?

UserRevisionLine numberNew 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 }