experimental fork

Dependencies:   NOKIA_5110 mbed

Committer:
OliverKeller
Date:
Wed Dec 21 15:34:09 2016 +0000
Revision:
7:6a0958c2be7e
Parent:
6:e95598c44a7f
added nokia display, disabled queue (save quite some flash space)

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"
OliverKeller 7:6a0958c2be7e 4 //#include <queue>
OliverKeller 7:6a0958c2be7e 5 #include "NOKIA_5110.h"
mva111 0:52895a475820 6
mva111 5:9c7c88f8f800 7 //set the frequency of the oscillators below
OliverKeller 7:6a0958c2be7e 8 int f1 = 3600; //3500;
OliverKeller 7:6a0958c2be7e 9 int f2 = 3497;
mva111 5:9c7c88f8f800 10
mva111 5:9c7c88f8f800 11 //set the coincidence times in us below
OliverKeller 7:6a0958c2be7e 12 int coincidence_wait = 50; //150;
OliverKeller 7:6a0958c2be7e 13 bool buzzer = 0;
mva111 5:9c7c88f8f800 14
mva111 5:9c7c88f8f800 15 /* NO USER CONFIGURABLE OPTIONS BELOW
mva111 5:9c7c88f8f800 16 */
mva111 5:9c7c88f8f800 17
mva111 0:52895a475820 18 //typically around 2 min data
mva111 0:52895a475820 19 //assuming normal background
OliverKeller 7:6a0958c2be7e 20 #define DETECTION_MEMORY_LIMIT 32 //128
mva111 0:52895a475820 21
mva111 0:52895a475820 22 //doesn't log the GM hits with a timestamp
mva111 0:52895a475820 23 //only counts them when set to 1
OliverKeller 7:6a0958c2be7e 24 #define DETECT_MUONS_ONLY 1
mva111 5:9c7c88f8f800 25
mva111 0:52895a475820 26 bool mdet = 0;
OliverKeller 7:6a0958c2be7e 27 /*volatile*/ int muon_total;
OliverKeller 7:6a0958c2be7e 28 /*volatile*/ int gm1_total;
OliverKeller 7:6a0958c2be7e 29 /*volatile*/ int gm2_total;
OliverKeller 7:6a0958c2be7e 30 int minutes = 0; //global minutes counter
mva111 0:52895a475820 31
mva111 0:52895a475820 32 //storing a detections in a FIFO queue
OliverKeller 7:6a0958c2be7e 33 //queue<Detection> detections;
mva111 0:52895a475820 34
mva111 0:52895a475820 35 //High voltage controls
mva111 0:52895a475820 36 HVControl hv1(PA_3, PA_0);
mva111 0:52895a475820 37 HVControl hv2(PB_1, PA_1);
mva111 0:52895a475820 38
OliverKeller 7:6a0958c2be7e 39 //Serial rpi(PA_9,PA_10);
mva111 0:52895a475820 40
mva111 0:52895a475820 41 Timer coincidence_timer;
mva111 0:52895a475820 42 Timer main_t;
mva111 0:52895a475820 43
mva111 0:52895a475820 44 Serial pc(USBTX, USBRX);
mva111 0:52895a475820 45 // Ticker debug;
mva111 0:52895a475820 46 Ticker hv1monitor;
mva111 0:52895a475820 47 Ticker hv2monitor;
OliverKeller 7:6a0958c2be7e 48 //Ticker memory_checker;
mva111 0:52895a475820 49
mva111 0:52895a475820 50 DigitalOut led(LED1);
mva111 0:52895a475820 51 DigitalOut GM1_led(PA_12);
mva111 0:52895a475820 52 DigitalOut GM2_led(PA_8);
mva111 0:52895a475820 53 DigitalOut C_led(PA_11);
mva111 0:52895a475820 54 DigitalOut Buzzer(PF_0);
mva111 0:52895a475820 55
mva111 0:52895a475820 56 InterruptIn GM1(PB_0);
mva111 0:52895a475820 57 InterruptIn GM2(PF_1);
mva111 0:52895a475820 58
mva111 0:52895a475820 59 //global variables for voltages
mva111 0:52895a475820 60 volatile float v1 = 0;
mva111 0:52895a475820 61 volatile float v2 = 0;
mva111 0:52895a475820 62
mva111 0:52895a475820 63 //ui functions
OliverKeller 7:6a0958c2be7e 64 void reset_counters (void)
OliverKeller 7:6a0958c2be7e 65 {
mva111 0:52895a475820 66 muon_total = 0;
mva111 0:52895a475820 67 gm1_total = 0;
mva111 0:52895a475820 68 gm2_total = 0;
OliverKeller 7:6a0958c2be7e 69 }
OliverKeller 7:6a0958c2be7e 70
OliverKeller 7:6a0958c2be7e 71 void muon_buzz(void)
OliverKeller 7:6a0958c2be7e 72 {
mva111 0:52895a475820 73 C_led = 1;
OliverKeller 7:6a0958c2be7e 74
OliverKeller 7:6a0958c2be7e 75 if(buzzer) {
OliverKeller 7:6a0958c2be7e 76 for(int i = 0; i < 32; i++) {
OliverKeller 7:6a0958c2be7e 77 Buzzer = !Buzzer;
OliverKeller 7:6a0958c2be7e 78 wait(0.002);
OliverKeller 7:6a0958c2be7e 79 }
OliverKeller 7:6a0958c2be7e 80 } else {
OliverKeller 7:6a0958c2be7e 81 wait(0.05);
mva111 0:52895a475820 82 }
OliverKeller 7:6a0958c2be7e 83 C_led = 0;
OliverKeller 7:6a0958c2be7e 84 }
OliverKeller 7:6a0958c2be7e 85
OliverKeller 7:6a0958c2be7e 86 void GM1_buzz(void)
OliverKeller 7:6a0958c2be7e 87 {
mva111 0:52895a475820 88 GM1_led = 1;
OliverKeller 7:6a0958c2be7e 89 if(buzzer) {
OliverKeller 7:6a0958c2be7e 90 for(int i = 0; i < 16; i++) {
OliverKeller 7:6a0958c2be7e 91 Buzzer = !Buzzer;
OliverKeller 7:6a0958c2be7e 92 wait(0.001);
OliverKeller 7:6a0958c2be7e 93 }
OliverKeller 7:6a0958c2be7e 94 } else {
OliverKeller 7:6a0958c2be7e 95 wait(0.05);
mva111 0:52895a475820 96 }
OliverKeller 7:6a0958c2be7e 97 GM1_led = 0;
OliverKeller 7:6a0958c2be7e 98 }
OliverKeller 7:6a0958c2be7e 99
OliverKeller 7:6a0958c2be7e 100 void GM2_buzz(void)
OliverKeller 7:6a0958c2be7e 101 {
mva111 0:52895a475820 102 GM2_led = 1;
OliverKeller 7:6a0958c2be7e 103 if(buzzer) {
OliverKeller 7:6a0958c2be7e 104 for(int i = 0; i < 16; i++) {
OliverKeller 7:6a0958c2be7e 105 Buzzer = !Buzzer;
OliverKeller 7:6a0958c2be7e 106 wait(0.001);
OliverKeller 7:6a0958c2be7e 107 }
OliverKeller 7:6a0958c2be7e 108 } else {
OliverKeller 7:6a0958c2be7e 109 wait(0.05);
mva111 0:52895a475820 110 }
OliverKeller 7:6a0958c2be7e 111 GM2_led = 0;
OliverKeller 7:6a0958c2be7e 112 }
OliverKeller 7:6a0958c2be7e 113
OliverKeller 7:6a0958c2be7e 114
mva111 0:52895a475820 115 //adds a detection onto the queue
OliverKeller 7:6a0958c2be7e 116 void add_detection(int channel, float time)
OliverKeller 7:6a0958c2be7e 117 {
OliverKeller 7:6a0958c2be7e 118 //Detection* det = new Detection(channel, time);
OliverKeller 7:6a0958c2be7e 119 //detections.push(*det);
OliverKeller 7:6a0958c2be7e 120 //delete det;
OliverKeller 7:6a0958c2be7e 121 }
OliverKeller 7:6a0958c2be7e 122
mva111 0:52895a475820 123 //callback for GM1 detection
OliverKeller 7:6a0958c2be7e 124 void GM1_hit(void)
OliverKeller 7:6a0958c2be7e 125 {
mva111 0:52895a475820 126 coincidence_timer.start();
OliverKeller 7:6a0958c2be7e 127 while(coincidence_timer.read_us() < coincidence_wait) {
OliverKeller 7:6a0958c2be7e 128 if(GM2 == 0 && !mdet) {
OliverKeller 7:6a0958c2be7e 129 add_detection(3, main_t.read_us());
mva111 0:52895a475820 130 muon_buzz();
mva111 0:52895a475820 131 muon_total++;
mva111 6:e95598c44a7f 132 gm2_total++;
mva111 0:52895a475820 133 mdet = 1;
OliverKeller 7:6a0958c2be7e 134 }
mva111 0:52895a475820 135 wait(1e-7);
OliverKeller 7:6a0958c2be7e 136 }
mva111 0:52895a475820 137 coincidence_timer.stop();
mva111 0:52895a475820 138 coincidence_timer.reset();
mva111 0:52895a475820 139 if(mdet == 0) GM1_buzz();
mva111 0:52895a475820 140 if ( !DETECT_MUONS_ONLY ) add_detection(1, main_t.read());
mva111 0:52895a475820 141 gm1_total++;
mva111 0:52895a475820 142 mdet = 0;
OliverKeller 7:6a0958c2be7e 143 }
mva111 0:52895a475820 144
mva111 0:52895a475820 145 //callback for GM2 detection
OliverKeller 7:6a0958c2be7e 146 void GM2_hit(void)
OliverKeller 7:6a0958c2be7e 147 {
OliverKeller 7:6a0958c2be7e 148 coincidence_timer.start();
OliverKeller 7:6a0958c2be7e 149 while(coincidence_timer.read_us() < coincidence_wait) {
OliverKeller 7:6a0958c2be7e 150 if(GM1 == 0 && !mdet) {
mva111 0:52895a475820 151 add_detection(3, main_t.read());
mva111 0:52895a475820 152 muon_buzz();
mva111 0:52895a475820 153 muon_total++;
mva111 6:e95598c44a7f 154 gm1_total++;
mva111 0:52895a475820 155 mdet = 1;
OliverKeller 7:6a0958c2be7e 156 }
mva111 0:52895a475820 157 wait(1e-7);
OliverKeller 7:6a0958c2be7e 158 }
mva111 0:52895a475820 159 coincidence_timer.stop();
OliverKeller 7:6a0958c2be7e 160 coincidence_timer.reset();
mva111 0:52895a475820 161 if(mdet == 0) GM2_buzz();
mva111 0:52895a475820 162 if ( !DETECT_MUONS_ONLY ) add_detection(2, main_t.read());
mva111 0:52895a475820 163 gm2_total++;
mva111 0:52895a475820 164 mdet = 0;
OliverKeller 7:6a0958c2be7e 165 }
OliverKeller 7:6a0958c2be7e 166
mva111 0:52895a475820 167 // high voltage software monitors
OliverKeller 7:6a0958c2be7e 168 void hv1monitor_(void)
OliverKeller 7:6a0958c2be7e 169 {
OliverKeller 7:6a0958c2be7e 170 if(hv1.measure()) {
OliverKeller 7:6a0958c2be7e 171 if(v1 - hv1.get_voltage() > 100) {
OliverKeller 7:6a0958c2be7e 172 hv1.shutdown(); //unusual voltage drop detected
OliverKeller 7:6a0958c2be7e 173 }
OliverKeller 7:6a0958c2be7e 174 } else {
OliverKeller 7:6a0958c2be7e 175 hv1.shutdown();
OliverKeller 7:6a0958c2be7e 176 }
mva111 0:52895a475820 177 v1 = hv1.get_voltage();
OliverKeller 7:6a0958c2be7e 178 }
mva111 0:52895a475820 179
OliverKeller 7:6a0958c2be7e 180 void hv2monitor_(void)
OliverKeller 7:6a0958c2be7e 181 {
OliverKeller 7:6a0958c2be7e 182 if(hv2.measure()) {
OliverKeller 7:6a0958c2be7e 183 if(v2 - hv2.get_voltage() > 100) {
OliverKeller 7:6a0958c2be7e 184 hv2.shutdown(); //unusual voltage drop detected
OliverKeller 7:6a0958c2be7e 185 }
OliverKeller 7:6a0958c2be7e 186 } else {
OliverKeller 7:6a0958c2be7e 187 hv2.shutdown();
OliverKeller 7:6a0958c2be7e 188 }
mva111 0:52895a475820 189 v2 = hv2.get_voltage();
OliverKeller 7:6a0958c2be7e 190 }
mva111 0:52895a475820 191
mva111 0:52895a475820 192 //discarding older items if buffer gets too big
OliverKeller 7:6a0958c2be7e 193 //void memory_checker_(void)
OliverKeller 7:6a0958c2be7e 194 //{
OliverKeller 7:6a0958c2be7e 195 // if ( detections.size() > (DETECTION_MEMORY_LIMIT - (DETECTION_MEMORY_LIMIT/8)) ) {
OliverKeller 7:6a0958c2be7e 196 // while ( detections.size() > (DETECTION_MEMORY_LIMIT - (DETECTION_MEMORY_LIMIT/4)) ) {
OliverKeller 7:6a0958c2be7e 197 // detections.pop();
OliverKeller 7:6a0958c2be7e 198 // }
OliverKeller 7:6a0958c2be7e 199 // }
OliverKeller 7:6a0958c2be7e 200 //}
mva111 0:52895a475820 201
OliverKeller 7:6a0958c2be7e 202 char* itoa(int value, char* result, int base)
OliverKeller 7:6a0958c2be7e 203 {
OliverKeller 7:6a0958c2be7e 204 // check that the base if valid
OliverKeller 7:6a0958c2be7e 205 if ( base < 2 || base > 36 ) {
OliverKeller 7:6a0958c2be7e 206 *result = '\0';
OliverKeller 7:6a0958c2be7e 207 return result;
OliverKeller 7:6a0958c2be7e 208 }
OliverKeller 7:6a0958c2be7e 209
OliverKeller 7:6a0958c2be7e 210 char* ptr = result, *ptr1 = result, tmp_char;
OliverKeller 7:6a0958c2be7e 211 int tmp_value;
OliverKeller 7:6a0958c2be7e 212
OliverKeller 7:6a0958c2be7e 213 do {
OliverKeller 7:6a0958c2be7e 214 tmp_value = value;
OliverKeller 7:6a0958c2be7e 215 value /= base;
OliverKeller 7:6a0958c2be7e 216 *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz"[35 + (tmp_value - value * base)];
OliverKeller 7:6a0958c2be7e 217 } while ( value );
OliverKeller 7:6a0958c2be7e 218
OliverKeller 7:6a0958c2be7e 219 // Apply negative sign
OliverKeller 7:6a0958c2be7e 220 if ( tmp_value < 0 )
OliverKeller 7:6a0958c2be7e 221 *ptr++ = '-';
OliverKeller 7:6a0958c2be7e 222 *ptr-- = '\0';
OliverKeller 7:6a0958c2be7e 223
OliverKeller 7:6a0958c2be7e 224 while ( ptr1 < ptr ) {
OliverKeller 7:6a0958c2be7e 225 tmp_char = *ptr;
OliverKeller 7:6a0958c2be7e 226 *ptr-- = *ptr1;
OliverKeller 7:6a0958c2be7e 227 *ptr1++ = tmp_char;
OliverKeller 7:6a0958c2be7e 228 }
OliverKeller 7:6a0958c2be7e 229
OliverKeller 7:6a0958c2be7e 230 return result;
OliverKeller 7:6a0958c2be7e 231 }
OliverKeller 7:6a0958c2be7e 232
OliverKeller 7:6a0958c2be7e 233 int main()
OliverKeller 7:6a0958c2be7e 234 {
OliverKeller 7:6a0958c2be7e 235 //start main timer
OliverKeller 7:6a0958c2be7e 236 pc.baud(230400);
OliverKeller 7:6a0958c2be7e 237 main_t.start();
OliverKeller 7:6a0958c2be7e 238 LcdPins myPins;
OliverKeller 7:6a0958c2be7e 239
OliverKeller 7:6a0958c2be7e 240 myPins.rst = PA_6;
OliverKeller 7:6a0958c2be7e 241 myPins.sce = PA_4;
OliverKeller 7:6a0958c2be7e 242 myPins.dc = PB_4;
OliverKeller 7:6a0958c2be7e 243 myPins.mosi = PA_7;//SPI_MOSI;
OliverKeller 7:6a0958c2be7e 244 myPins.miso = NC;
OliverKeller 7:6a0958c2be7e 245 myPins.sclk = PA_5;//SPI_SCK;
mva111 0:52895a475820 246
OliverKeller 7:6a0958c2be7e 247 // Start the LCD
OliverKeller 7:6a0958c2be7e 248 NokiaLcd myLcd( myPins );
OliverKeller 7:6a0958c2be7e 249 myLcd.InitLcd(); // LCD is reset and DDRAM is cleared
OliverKeller 7:6a0958c2be7e 250 myLcd.DrawString("MUON HUNTER V2");
OliverKeller 7:6a0958c2be7e 251 myLcd.SetXY(0,1);
OliverKeller 7:6a0958c2be7e 252 myLcd.DrawString("TIME ");
OliverKeller 7:6a0958c2be7e 253 myLcd.SetXY(0,3);
OliverKeller 7:6a0958c2be7e 254 myLcd.DrawString("MUON COUNT");
OliverKeller 7:6a0958c2be7e 255 myLcd.SetXY(0,4);
OliverKeller 7:6a0958c2be7e 256 myLcd.DrawString("GM1 COUNT");
OliverKeller 7:6a0958c2be7e 257 myLcd.SetXY(0,5);
OliverKeller 7:6a0958c2be7e 258 myLcd.DrawString("GM2 COUNT");
OliverKeller 7:6a0958c2be7e 259
OliverKeller 7:6a0958c2be7e 260 hv1.set_frequency(f1);
OliverKeller 7:6a0958c2be7e 261 hv2.set_frequency(f2);
OliverKeller 7:6a0958c2be7e 262 GM1.fall(&GM1_hit);
OliverKeller 7:6a0958c2be7e 263 GM2.fall(&GM2_hit);
mva111 0:52895a475820 264
OliverKeller 7:6a0958c2be7e 265 //tickers to monitor the high voltage
OliverKeller 7:6a0958c2be7e 266 hv1monitor.attach(&hv1monitor_, 0.1);
OliverKeller 7:6a0958c2be7e 267 hv2monitor.attach(&hv2monitor_, 0.1);
OliverKeller 7:6a0958c2be7e 268
OliverKeller 7:6a0958c2be7e 269 char number[10];
OliverKeller 7:6a0958c2be7e 270
OliverKeller 7:6a0958c2be7e 271 //ticker to monitor memory usage
OliverKeller 7:6a0958c2be7e 272 //memory_checker.attach(&memory_checker_, 0.2);
OliverKeller 7:6a0958c2be7e 273 while(1) {
mva111 4:87037e41c888 274
OliverKeller 7:6a0958c2be7e 275 myLcd.SetXY(5*6,1);
OliverKeller 7:6a0958c2be7e 276 unsigned int seconds = (int) main_t.read();
OliverKeller 7:6a0958c2be7e 277 //int minutes = (seconds/60);
OliverKeller 7:6a0958c2be7e 278 if (seconds >= 60) {
OliverKeller 7:6a0958c2be7e 279 main_t.reset();
OliverKeller 7:6a0958c2be7e 280 minutes++;
OliverKeller 7:6a0958c2be7e 281 }
OliverKeller 7:6a0958c2be7e 282 if (minutes < 10)
OliverKeller 7:6a0958c2be7e 283 myLcd.DrawChar('0');
OliverKeller 7:6a0958c2be7e 284 itoa(minutes, number, 10);
OliverKeller 7:6a0958c2be7e 285 myLcd.DrawString(number);
OliverKeller 7:6a0958c2be7e 286 myLcd.DrawChar(':');
OliverKeller 7:6a0958c2be7e 287 if ((seconds%60) < 10)
OliverKeller 7:6a0958c2be7e 288 myLcd.DrawChar('0');
OliverKeller 7:6a0958c2be7e 289 itoa(seconds%60, number,10);
OliverKeller 7:6a0958c2be7e 290 myLcd.DrawString(number);
OliverKeller 7:6a0958c2be7e 291
OliverKeller 7:6a0958c2be7e 292 myLcd.SetXY(11*6,3);
OliverKeller 7:6a0958c2be7e 293 itoa(muon_total, number, 10);
OliverKeller 7:6a0958c2be7e 294 myLcd.DrawString(number);
OliverKeller 7:6a0958c2be7e 295
OliverKeller 7:6a0958c2be7e 296 myLcd.SetXY(11*6,4);
OliverKeller 7:6a0958c2be7e 297 itoa(gm1_total, number, 10);
OliverKeller 7:6a0958c2be7e 298 myLcd.DrawString(number);
OliverKeller 7:6a0958c2be7e 299
OliverKeller 7:6a0958c2be7e 300 myLcd.SetXY(11*6,5);
OliverKeller 7:6a0958c2be7e 301 itoa(gm2_total, number, 10);
OliverKeller 7:6a0958c2be7e 302 myLcd.DrawString(number);
OliverKeller 7:6a0958c2be7e 303
OliverKeller 7:6a0958c2be7e 304
OliverKeller 7:6a0958c2be7e 305 // while(!detections.empty()){
OliverKeller 7:6a0958c2be7e 306 // Detection temp = detections.front();
OliverKeller 7:6a0958c2be7e 307 //
OliverKeller 7:6a0958c2be7e 308 // pc.printf("Ch: %d, Time: %.2fs, V1: %.1fV, V2: %.1fV \n\r", temp.channel, temp.time, v1, v2);
OliverKeller 7:6a0958c2be7e 309 // pc.printf("Total GM1: %d, Total GM2: %d, Total Coinc: %d \n\r \n\r", gm1_total, gm2_total, muon_total);
OliverKeller 7:6a0958c2be7e 310 // detections.pop();
OliverKeller 7:6a0958c2be7e 311 // }
OliverKeller 7:6a0958c2be7e 312
OliverKeller 7:6a0958c2be7e 313 pc.printf("%.fs, GM1: %d, GM2: %d, Muons: %d \n\r", main_t.read(), gm1_total, gm2_total, muon_total);
OliverKeller 7:6a0958c2be7e 314 pc.printf("V1: %.1fV, V2: %.1fV \n\r", v1, v2);
mva111 1:549e331aefab 315 wait(1);
OliverKeller 7:6a0958c2be7e 316 }
mva111 0:52895a475820 317 }