![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Contains all code needed for analog digital and oscope
main.cpp@5:6b72bf1da751, 2020-04-22 (annotated)
- Committer:
- EricGlunn
- Date:
- Wed Apr 22 20:19:52 2020 +0000
- Revision:
- 5:6b72bf1da751
- Parent:
- 4:374219f35b8e
- Child:
- 6:f2c589ad6241
added oscope triggers with variable voltage levels
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
EricGlunn | 0:f4b1c6a95f25 | 1 | #include "mbed.h" |
EricGlunn | 2:9a88de905577 | 2 | |
EricGlunn | 2:9a88de905577 | 3 | #define reset 0b00000000 //Define function masks |
EricGlunn | 0:f4b1c6a95f25 | 4 | #define digital 0b00100000 |
EricGlunn | 0:f4b1c6a95f25 | 5 | #define analog 0b01000000 |
EricGlunn | 0:f4b1c6a95f25 | 6 | #define I2C 0b01100000 |
EricGlunn | 2:9a88de905577 | 7 | #define oScope 0b10000000 |
EricGlunn | 2:9a88de905577 | 8 | |
EricGlunn | 2:9a88de905577 | 9 | #define stateMask 0b11100000 //general masks |
EricGlunn | 0:f4b1c6a95f25 | 10 | #define pinMask 0b00011111 |
EricGlunn | 2:9a88de905577 | 11 | #define FULL 0b11111111 |
EricGlunn | 2:9a88de905577 | 12 | |
EricGlunn | 2:9a88de905577 | 13 | #define pin1 0b00010000 //digital and analog masks |
EricGlunn | 0:f4b1c6a95f25 | 14 | #define pin2 0b00001000 |
EricGlunn | 0:f4b1c6a95f25 | 15 | #define pin3 0b00000100 |
EricGlunn | 0:f4b1c6a95f25 | 16 | #define pin4 0b00000010 |
EricGlunn | 0:f4b1c6a95f25 | 17 | #define pin5 0b00000001 |
EricGlunn | 0:f4b1c6a95f25 | 18 | |
EricGlunn | 2:9a88de905577 | 19 | #define ms1 0b00000000 //Oscope masks |
EricGlunn | 2:9a88de905577 | 20 | #define ms5 0b00000001 |
EricGlunn | 2:9a88de905577 | 21 | #define ms10 0b00000010 |
EricGlunn | 2:9a88de905577 | 22 | #define ms50 0b00000011 |
EricGlunn | 2:9a88de905577 | 23 | #define ms100 0b00000100 |
EricGlunn | 2:9a88de905577 | 24 | #define ms250 0b00000101 |
EricGlunn | 2:9a88de905577 | 25 | #define ms500 0b00000110 |
EricGlunn | 2:9a88de905577 | 26 | #define ms1000 0b00000111 |
EricGlunn | 2:9a88de905577 | 27 | #define rise 0b00010000 |
EricGlunn | 2:9a88de905577 | 28 | #define fall 0b00000000 |
EricGlunn | 5:6b72bf1da751 | 29 | #define timeMask 0b00000111 |
EricGlunn | 5:6b72bf1da751 | 30 | #define triggerType 0b00010000 |
EricGlunn | 5:6b72bf1da751 | 31 | #define triggerVolt 0b00001000 |
EricGlunn | 5:6b72bf1da751 | 32 | #define volt11 0b00000000 |
EricGlunn | 5:6b72bf1da751 | 33 | #define volt22 0b00001000 |
EricGlunn | 0:f4b1c6a95f25 | 34 | |
EricGlunn | 0:f4b1c6a95f25 | 35 | DigitalOut myled(LED1); |
EricGlunn | 0:f4b1c6a95f25 | 36 | DigitalOut DigitalStatus(LED2); //Led for when Digital read is running |
EricGlunn | 0:f4b1c6a95f25 | 37 | DigitalOut AnalogStatus(LED3); //LED for when Analog read is running |
EricGlunn | 2:9a88de905577 | 38 | DigitalOut oScopeStatus(LED4); //LED for Oscilloscope |
EricGlunn | 0:f4b1c6a95f25 | 39 | |
EricGlunn | 0:f4b1c6a95f25 | 40 | DigitalIn d1(p21); //Always set these pins for digital in |
EricGlunn | 0:f4b1c6a95f25 | 41 | DigitalIn d2(p22); |
EricGlunn | 0:f4b1c6a95f25 | 42 | DigitalIn d3(p23); |
EricGlunn | 0:f4b1c6a95f25 | 43 | DigitalIn d4(p24); |
EricGlunn | 0:f4b1c6a95f25 | 44 | DigitalIn d5(p25); |
EricGlunn | 0:f4b1c6a95f25 | 45 | |
EricGlunn | 2:9a88de905577 | 46 | |
EricGlunn | 2:9a88de905577 | 47 | AnalogIn a1(p16); //Always set these pins for analog in |
EricGlunn | 0:f4b1c6a95f25 | 48 | AnalogIn a2(p17); |
EricGlunn | 0:f4b1c6a95f25 | 49 | AnalogIn a3(p18); |
EricGlunn | 0:f4b1c6a95f25 | 50 | AnalogIn a4(p19); |
EricGlunn | 0:f4b1c6a95f25 | 51 | AnalogIn a5(p20); |
EricGlunn | 0:f4b1c6a95f25 | 52 | |
EricGlunn | 0:f4b1c6a95f25 | 53 | |
EricGlunn | 2:9a88de905577 | 54 | Serial PC(USBTX,USBRX); |
EricGlunn | 0:f4b1c6a95f25 | 55 | Ticker tickerboi; //Initialize the ticker for Sampling |
EricGlunn | 0:f4b1c6a95f25 | 56 | |
EricGlunn | 2:9a88de905577 | 57 | Ticker oScopeTicker; |
EricGlunn | 2:9a88de905577 | 58 | Ticker oScopeCut; |
EricGlunn | 2:9a88de905577 | 59 | |
EricGlunn | 0:f4b1c6a95f25 | 60 | volatile unsigned char DigitalSample; |
EricGlunn | 0:f4b1c6a95f25 | 61 | volatile unsigned char AnalogSample[5]; |
EricGlunn | 0:f4b1c6a95f25 | 62 | |
EricGlunn | 0:f4b1c6a95f25 | 63 | volatile unsigned char command; |
EricGlunn | 0:f4b1c6a95f25 | 64 | volatile unsigned char state; |
EricGlunn | 0:f4b1c6a95f25 | 65 | |
EricGlunn | 0:f4b1c6a95f25 | 66 | volatile bool newDigital=false; |
EricGlunn | 0:f4b1c6a95f25 | 67 | volatile bool newAnalog=false; |
EricGlunn | 0:f4b1c6a95f25 | 68 | |
EricGlunn | 2:9a88de905577 | 69 | volatile unsigned char oScopeTime; |
EricGlunn | 2:9a88de905577 | 70 | volatile bool oScope_poll; |
EricGlunn | 2:9a88de905577 | 71 | volatile bool newoScope=false; |
EricGlunn | 2:9a88de905577 | 72 | volatile unsigned char oScopeArray[20000]; |
EricGlunn | 2:9a88de905577 | 73 | volatile int oScopeCount=0; |
EricGlunn | 4:374219f35b8e | 74 | volatile unsigned char oScopeTriggerType; |
EricGlunn | 5:6b72bf1da751 | 75 | volatile unsigned char oScopeTriggerVoltageBit; |
EricGlunn | 5:6b72bf1da751 | 76 | volatile unsigned char oScopeTriggerVoltageVal; |
EricGlunn | 2:9a88de905577 | 77 | |
EricGlunn | 2:9a88de905577 | 78 | |
EricGlunn | 2:9a88de905577 | 79 | void digital_sample_func(void) //sampling function, samples each pin specified and Ors it |
EricGlunn | 2:9a88de905577 | 80 | { |
EricGlunn | 0:f4b1c6a95f25 | 81 | DigitalSample = digital; |
EricGlunn | 2:9a88de905577 | 82 | |
EricGlunn | 2:9a88de905577 | 83 | if( (command & pin1) == pin1) { |
EricGlunn | 0:f4b1c6a95f25 | 84 | DigitalSample=DigitalSample + d1*pin1; |
EricGlunn | 0:f4b1c6a95f25 | 85 | } |
EricGlunn | 2:9a88de905577 | 86 | if( (command & pin2) == pin2) { |
EricGlunn | 0:f4b1c6a95f25 | 87 | DigitalSample=DigitalSample + d2*pin2; |
EricGlunn | 0:f4b1c6a95f25 | 88 | } |
EricGlunn | 2:9a88de905577 | 89 | if( (command & pin3) == pin3) { |
EricGlunn | 0:f4b1c6a95f25 | 90 | DigitalSample=DigitalSample + d3*pin3; |
EricGlunn | 0:f4b1c6a95f25 | 91 | } |
EricGlunn | 2:9a88de905577 | 92 | if( (command & pin4) == pin4) { |
EricGlunn | 0:f4b1c6a95f25 | 93 | DigitalSample=DigitalSample + d4*pin4; |
EricGlunn | 0:f4b1c6a95f25 | 94 | } |
EricGlunn | 2:9a88de905577 | 95 | if( (command & pin5) == pin5) { |
EricGlunn | 0:f4b1c6a95f25 | 96 | DigitalSample=DigitalSample + d5*pin5; |
EricGlunn | 0:f4b1c6a95f25 | 97 | } |
EricGlunn | 0:f4b1c6a95f25 | 98 | newDigital=true; |
EricGlunn | 0:f4b1c6a95f25 | 99 | } |
EricGlunn | 0:f4b1c6a95f25 | 100 | |
EricGlunn | 0:f4b1c6a95f25 | 101 | |
EricGlunn | 2:9a88de905577 | 102 | void analog_sample_func(void) |
EricGlunn | 2:9a88de905577 | 103 | { |
EricGlunn | 2:9a88de905577 | 104 | for(int i=0; i<5; i++) { |
EricGlunn | 2:9a88de905577 | 105 | AnalogSample[i]=0; |
EricGlunn | 0:f4b1c6a95f25 | 106 | } |
EricGlunn | 2:9a88de905577 | 107 | if( (command & pin1) == pin1) { |
EricGlunn | 1:14e49afb1d7c | 108 | AnalogSample[0]=a1*254; |
EricGlunn | 0:f4b1c6a95f25 | 109 | } |
EricGlunn | 2:9a88de905577 | 110 | if( (command & pin2) == pin2) { |
EricGlunn | 1:14e49afb1d7c | 111 | AnalogSample[1]=a2 * 254; |
EricGlunn | 0:f4b1c6a95f25 | 112 | } |
EricGlunn | 2:9a88de905577 | 113 | if( (command & pin3) == pin3) { |
EricGlunn | 1:14e49afb1d7c | 114 | AnalogSample[2]=a3*254; |
EricGlunn | 0:f4b1c6a95f25 | 115 | } |
EricGlunn | 2:9a88de905577 | 116 | if( (command & pin4) == pin4) { |
EricGlunn | 1:14e49afb1d7c | 117 | AnalogSample[3]=a4*254; |
EricGlunn | 0:f4b1c6a95f25 | 118 | } |
EricGlunn | 2:9a88de905577 | 119 | if( (command & pin5) == pin5) { |
EricGlunn | 1:14e49afb1d7c | 120 | AnalogSample[4]=a5*254; |
EricGlunn | 0:f4b1c6a95f25 | 121 | } |
EricGlunn | 2:9a88de905577 | 122 | newAnalog=true; |
EricGlunn | 2:9a88de905577 | 123 | } |
EricGlunn | 2:9a88de905577 | 124 | |
EricGlunn | 2:9a88de905577 | 125 | |
EricGlunn | 2:9a88de905577 | 126 | void oScope_kill_func(void) |
EricGlunn | 2:9a88de905577 | 127 | { |
EricGlunn | 2:9a88de905577 | 128 | oScopeTicker.detach(); |
EricGlunn | 2:9a88de905577 | 129 | oScopeCut.detach(); |
EricGlunn | 2:9a88de905577 | 130 | newoScope=true; |
EricGlunn | 2:9a88de905577 | 131 | oScopeStatus=0; |
EricGlunn | 2:9a88de905577 | 132 | } |
EricGlunn | 2:9a88de905577 | 133 | |
EricGlunn | 2:9a88de905577 | 134 | void oScope_sample_func(void){ |
EricGlunn | 3:60f30ca6a65d | 135 | oScopeArray[oScopeCount++]=a1*254; |
EricGlunn | 2:9a88de905577 | 136 | } |
EricGlunn | 2:9a88de905577 | 137 | |
EricGlunn | 2:9a88de905577 | 138 | void oScope_poll_trig(){ |
EricGlunn | 4:374219f35b8e | 139 | bool nTriggered = true; |
EricGlunn | 4:374219f35b8e | 140 | myled=1; |
EricGlunn | 4:374219f35b8e | 141 | unsigned char trig; |
EricGlunn | 4:374219f35b8e | 142 | int state =0; |
EricGlunn | 5:6b72bf1da751 | 143 | if(oScopeTriggerVoltageBit == volt11){oScopeTriggerVoltageVal=85;} |
EricGlunn | 5:6b72bf1da751 | 144 | else{oScopeTriggerVoltageVal=169;} |
EricGlunn | 2:9a88de905577 | 145 | |
EricGlunn | 4:374219f35b8e | 146 | while(nTriggered){ |
EricGlunn | 4:374219f35b8e | 147 | |
EricGlunn | 4:374219f35b8e | 148 | trig=a1*254; |
EricGlunn | 4:374219f35b8e | 149 | switch(state){ |
EricGlunn | 4:374219f35b8e | 150 | |
EricGlunn | 4:374219f35b8e | 151 | case 0: |
EricGlunn | 5:6b72bf1da751 | 152 | if((trig < oScopeTriggerVoltageVal) & (oScopeTriggerType == rise) ){state = 1;} |
EricGlunn | 5:6b72bf1da751 | 153 | else if((trig > oScopeTriggerVoltageVal) & (oScopeTriggerType == fall) ){state = 2;} |
EricGlunn | 4:374219f35b8e | 154 | else { state = 0;} |
EricGlunn | 4:374219f35b8e | 155 | break; |
EricGlunn | 4:374219f35b8e | 156 | case 1: |
EricGlunn | 5:6b72bf1da751 | 157 | if(trig < oScopeTriggerVoltageVal){state=1;} |
EricGlunn | 5:6b72bf1da751 | 158 | if(trig > oScopeTriggerVoltageVal){state=3;} |
EricGlunn | 4:374219f35b8e | 159 | break; |
EricGlunn | 4:374219f35b8e | 160 | case 2: |
EricGlunn | 5:6b72bf1da751 | 161 | if(trig > oScopeTriggerVoltageVal){state = 2;} |
EricGlunn | 5:6b72bf1da751 | 162 | if(trig < oScopeTriggerVoltageVal){state = 3;} |
EricGlunn | 4:374219f35b8e | 163 | break; |
EricGlunn | 4:374219f35b8e | 164 | case 3: |
EricGlunn | 4:374219f35b8e | 165 | nTriggered=false; |
EricGlunn | 4:374219f35b8e | 166 | break; |
EricGlunn | 4:374219f35b8e | 167 | } |
EricGlunn | 4:374219f35b8e | 168 | wait(.01); |
EricGlunn | 4:374219f35b8e | 169 | } |
EricGlunn | 4:374219f35b8e | 170 | myled=0; |
EricGlunn | 2:9a88de905577 | 171 | switch(oScopeTime) { |
EricGlunn | 2:9a88de905577 | 172 | |
EricGlunn | 2:9a88de905577 | 173 | case ms1: |
EricGlunn | 2:9a88de905577 | 174 | oScopeCut.attach(oScope_kill_func, .001); |
EricGlunn | 2:9a88de905577 | 175 | break; |
EricGlunn | 2:9a88de905577 | 176 | |
EricGlunn | 2:9a88de905577 | 177 | case ms5: |
EricGlunn | 2:9a88de905577 | 178 | oScopeCut.attach(oScope_kill_func, .005); |
EricGlunn | 2:9a88de905577 | 179 | break; |
EricGlunn | 2:9a88de905577 | 180 | |
EricGlunn | 2:9a88de905577 | 181 | case ms10: |
EricGlunn | 2:9a88de905577 | 182 | oScopeCut.attach(oScope_kill_func, .01); |
EricGlunn | 2:9a88de905577 | 183 | break; |
EricGlunn | 2:9a88de905577 | 184 | |
EricGlunn | 2:9a88de905577 | 185 | case ms50: |
EricGlunn | 2:9a88de905577 | 186 | oScopeCut.attach(oScope_kill_func, .05); |
EricGlunn | 2:9a88de905577 | 187 | break; |
EricGlunn | 2:9a88de905577 | 188 | |
EricGlunn | 2:9a88de905577 | 189 | case ms100: |
EricGlunn | 2:9a88de905577 | 190 | oScopeCut.attach(oScope_kill_func, .1); |
EricGlunn | 2:9a88de905577 | 191 | break; |
EricGlunn | 2:9a88de905577 | 192 | |
EricGlunn | 2:9a88de905577 | 193 | case ms250: |
EricGlunn | 2:9a88de905577 | 194 | oScopeCut.attach(oScope_kill_func, .25); |
EricGlunn | 2:9a88de905577 | 195 | break; |
EricGlunn | 2:9a88de905577 | 196 | |
EricGlunn | 2:9a88de905577 | 197 | case ms500: |
EricGlunn | 2:9a88de905577 | 198 | oScopeCut.attach(oScope_kill_func, .5); |
EricGlunn | 2:9a88de905577 | 199 | break; |
EricGlunn | 2:9a88de905577 | 200 | |
EricGlunn | 2:9a88de905577 | 201 | case ms1000: |
EricGlunn | 2:9a88de905577 | 202 | oScopeCut.attach(oScope_kill_func, 1); |
EricGlunn | 2:9a88de905577 | 203 | break; |
EricGlunn | 3:60f30ca6a65d | 204 | default: |
EricGlunn | 3:60f30ca6a65d | 205 | oScopeCut.attach(oScope_kill_func, .01); |
EricGlunn | 3:60f30ca6a65d | 206 | break; |
EricGlunn | 2:9a88de905577 | 207 | } |
EricGlunn | 2:9a88de905577 | 208 | |
EricGlunn | 2:9a88de905577 | 209 | oScopeTicker.attach_us(oScope_sample_func, 50); |
EricGlunn | 0:f4b1c6a95f25 | 210 | |
EricGlunn | 0:f4b1c6a95f25 | 211 | } |
EricGlunn | 0:f4b1c6a95f25 | 212 | |
EricGlunn | 0:f4b1c6a95f25 | 213 | |
EricGlunn | 2:9a88de905577 | 214 | void SerialInterrupt(void) |
EricGlunn | 2:9a88de905577 | 215 | { |
EricGlunn | 2:9a88de905577 | 216 | command=PC.getc(); |
EricGlunn | 2:9a88de905577 | 217 | state= command & stateMask; |
EricGlunn | 2:9a88de905577 | 218 | |
EricGlunn | 2:9a88de905577 | 219 | switch(state) { |
EricGlunn | 2:9a88de905577 | 220 | case reset: |
EricGlunn | 2:9a88de905577 | 221 | tickerboi.detach(); //detach Ticker |
EricGlunn | 2:9a88de905577 | 222 | DigitalStatus=0; //turn off status LED |
EricGlunn | 2:9a88de905577 | 223 | AnalogStatus=0; |
EricGlunn | 3:60f30ca6a65d | 224 | |
EricGlunn | 2:9a88de905577 | 225 | if(oScopeStatus){ |
EricGlunn | 2:9a88de905577 | 226 | oScope_kill_func(); |
EricGlunn | 2:9a88de905577 | 227 | } |
EricGlunn | 2:9a88de905577 | 228 | |
EricGlunn | 0:f4b1c6a95f25 | 229 | break; |
EricGlunn | 2:9a88de905577 | 230 | |
EricGlunn | 2:9a88de905577 | 231 | case digital: |
EricGlunn | 2:9a88de905577 | 232 | tickerboi.attach(&digital_sample_func, .5); |
EricGlunn | 2:9a88de905577 | 233 | DigitalStatus=1; // turn on status LED |
EricGlunn | 2:9a88de905577 | 234 | break; |
EricGlunn | 2:9a88de905577 | 235 | |
EricGlunn | 2:9a88de905577 | 236 | case analog: |
EricGlunn | 2:9a88de905577 | 237 | tickerboi.attach(&analog_sample_func, .5); |
EricGlunn | 2:9a88de905577 | 238 | AnalogStatus=1; |
EricGlunn | 2:9a88de905577 | 239 | |
EricGlunn | 2:9a88de905577 | 240 | case oScope: |
EricGlunn | 2:9a88de905577 | 241 | oScopeTime=command & timeMask; |
EricGlunn | 2:9a88de905577 | 242 | oScope_poll=true; |
EricGlunn | 2:9a88de905577 | 243 | oScopeStatus=1; |
EricGlunn | 5:6b72bf1da751 | 244 | oScopeTriggerType= command & triggerType; |
EricGlunn | 5:6b72bf1da751 | 245 | oScopeTriggerVoltageBit = command & triggerVolt; |
EricGlunn | 2:9a88de905577 | 246 | break; |
EricGlunn | 2:9a88de905577 | 247 | } |
EricGlunn | 0:f4b1c6a95f25 | 248 | } |
EricGlunn | 0:f4b1c6a95f25 | 249 | |
EricGlunn | 2:9a88de905577 | 250 | int main() |
EricGlunn | 2:9a88de905577 | 251 | { |
EricGlunn | 2:9a88de905577 | 252 | PC.attach(&SerialInterrupt, Serial::RxIrq); |
EricGlunn | 0:f4b1c6a95f25 | 253 | |
EricGlunn | 2:9a88de905577 | 254 | |
EricGlunn | 0:f4b1c6a95f25 | 255 | while(1) { |
EricGlunn | 2:9a88de905577 | 256 | |
EricGlunn | 2:9a88de905577 | 257 | if(newDigital) { //if digital sampling was run |
EricGlunn | 0:f4b1c6a95f25 | 258 | PC.putc(DigitalSample); |
EricGlunn | 0:f4b1c6a95f25 | 259 | newDigital=false; |
EricGlunn | 0:f4b1c6a95f25 | 260 | } |
EricGlunn | 2:9a88de905577 | 261 | |
EricGlunn | 2:9a88de905577 | 262 | if(newAnalog) { //if analog sampling was run |
EricGlunn | 2:9a88de905577 | 263 | PC.putc(FULL); //First bit is 0b01000000 |
EricGlunn | 2:9a88de905577 | 264 | for(int i=0; i<5; i++) { //Send all of the analog bits |
EricGlunn | 2:9a88de905577 | 265 | PC.putc(AnalogSample[i]); |
EricGlunn | 0:f4b1c6a95f25 | 266 | } |
EricGlunn | 0:f4b1c6a95f25 | 267 | PC.putc(command); //Last bit is command from PC |
EricGlunn | 0:f4b1c6a95f25 | 268 | newAnalog=false; |
EricGlunn | 0:f4b1c6a95f25 | 269 | } |
EricGlunn | 0:f4b1c6a95f25 | 270 | |
EricGlunn | 3:60f30ca6a65d | 271 | if(oScope_poll){ |
EricGlunn | 3:60f30ca6a65d | 272 | oScope_poll=false; |
EricGlunn | 3:60f30ca6a65d | 273 | oScope_poll_trig(); } |
EricGlunn | 2:9a88de905577 | 274 | |
EricGlunn | 2:9a88de905577 | 275 | if(newoScope){ |
EricGlunn | 2:9a88de905577 | 276 | PC.putc(FULL); |
EricGlunn | 3:60f30ca6a65d | 277 | for(int j=0; j<oScopeCount; j++){ |
EricGlunn | 3:60f30ca6a65d | 278 | PC.putc(oScopeArray[j]); |
EricGlunn | 2:9a88de905577 | 279 | } |
EricGlunn | 2:9a88de905577 | 280 | oScopeCount=0; |
EricGlunn | 2:9a88de905577 | 281 | newoScope=false; |
EricGlunn | 2:9a88de905577 | 282 | } |
EricGlunn | 2:9a88de905577 | 283 | |
EricGlunn | 2:9a88de905577 | 284 | |
EricGlunn | 0:f4b1c6a95f25 | 285 | myled = 1; //indicate main loop is running |
EricGlunn | 0:f4b1c6a95f25 | 286 | wait(0.2); |
EricGlunn | 0:f4b1c6a95f25 | 287 | myled = 0; |
EricGlunn | 2:9a88de905577 | 288 | wait(0.2); |
EricGlunn | 0:f4b1c6a95f25 | 289 | } |
EricGlunn | 0:f4b1c6a95f25 | 290 | } |
EricGlunn | 0:f4b1c6a95f25 | 291 | |
EricGlunn | 0:f4b1c6a95f25 | 292 | |
EricGlunn | 0:f4b1c6a95f25 | 293 |