Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
Fork of Chemical_Sensor_DMA by
main.cpp@4:9fd291254686, 2015-11-06 (annotated)
- Committer:
- baxterja
- Date:
- Fri Nov 06 03:33:09 2015 +0000
- Revision:
- 4:9fd291254686
- Parent:
- 3:a85b742be262
- Child:
- 5:1b2dc43e8947
This is version 1 of the working filter
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
baxterja | 2:3771b3195c7b | 1 | #include "mbed.h" |
baxterja | 2:3771b3195c7b | 2 | #include "pause.cpp" |
baxterja | 2:3771b3195c7b | 3 | #include "Sample/adc.h" |
baxterja | 2:3771b3195c7b | 4 | #include "Sample/pdb.h" |
baxterja | 3:a85b742be262 | 5 | #include "SignalProcessing.h" |
baxterja | 2:3771b3195c7b | 6 | // for debug purposes |
baxterja | 2:3771b3195c7b | 7 | Serial pc(USBTX, USBRX); |
baxterja | 2:3771b3195c7b | 8 | DigitalOut led_red(LED_RED); |
baxterja | 2:3771b3195c7b | 9 | DigitalOut led_green(LED_GREEN); |
baxterja | 2:3771b3195c7b | 10 | DigitalOut led_blue(LED_BLUE); |
baxterja | 2:3771b3195c7b | 11 | |
baxterja | 2:3771b3195c7b | 12 | |
baxterja | 2:3771b3195c7b | 13 | void output_data(); |
baxterja | 2:3771b3195c7b | 14 | |
baxterja | 2:3771b3195c7b | 15 | Timer t1; |
baxterja | 2:3771b3195c7b | 16 | using namespace std; |
baxterja | 2:3771b3195c7b | 17 | |
baxterja | 4:9fd291254686 | 18 | |
baxterja | 4:9fd291254686 | 19 | // uint16_t out_val_pre[]; |
baxterja | 4:9fd291254686 | 20 | // |
baxterja | 4:9fd291254686 | 21 | // |
baxterja | 4:9fd291254686 | 22 | // uint16_t phase_counter2 = 0; |
baxterja | 4:9fd291254686 | 23 | // #define pre_compute_length 2000 |
baxterja | 4:9fd291254686 | 24 | // |
baxterja | 4:9fd291254686 | 25 | // void ISR_repeat() { |
baxterja | 4:9fd291254686 | 26 | // WaveOut.write_u16(out_val_pre[phase_counter2]); //creates a wave that bounces between 0 & 3.3 V |
baxterja | 4:9fd291254686 | 27 | // |
baxterja | 4:9fd291254686 | 28 | // phase_counter2++; |
baxterja | 4:9fd291254686 | 29 | // if (phase_counter2 >= pre_compute_length) phase_counter2 = 0; |
baxterja | 4:9fd291254686 | 30 | //} //ISR_repeat |
baxterja | 4:9fd291254686 | 31 | // |
baxterja | 4:9fd291254686 | 32 | //Ticker timer0; |
baxterja | 4:9fd291254686 | 33 | // |
baxterja | 4:9fd291254686 | 34 | |
baxterja | 4:9fd291254686 | 35 | |
baxterja | 4:9fd291254686 | 36 | |
baxterja | 4:9fd291254686 | 37 | #define PDB_DACINTC0_TOE 0x01 // 0x01 -> PDB DAC interal trigger enabled |
baxterja | 4:9fd291254686 | 38 | |
baxterja | 4:9fd291254686 | 39 | #define DAC0_DAT0 (uint16_t *)0x400CC000 // DAC word buffer base address |
baxterja | 4:9fd291254686 | 40 | |
baxterja | 4:9fd291254686 | 41 | uint16_t *p1; |
baxterja | 4:9fd291254686 | 42 | void setUpDac() |
baxterja | 4:9fd291254686 | 43 | { |
baxterja | 4:9fd291254686 | 44 | SIM_SCGC2 |= SIM_SCGC2_DAC0_MASK; // turn on clock to the DAC |
baxterja | 4:9fd291254686 | 45 | SIM_SCGC6 |= SIM_SCGC6_DAC0_MASK; // turn on clock to the DAC |
baxterja | 4:9fd291254686 | 46 | //DAC0_C0 = 0; |
baxterja | 4:9fd291254686 | 47 | DAC0_C0 |= DAC_C0_DACEN_MASK ; // enable the DAC; must do before any of the following |
baxterja | 4:9fd291254686 | 48 | //DAC0_C0 |= DAC_C0_REFSEL(0) |
baxterja | 4:9fd291254686 | 49 | //DAC0_C0 &= 0x9f; |
baxterja | 4:9fd291254686 | 50 | //DAC0_C0 |= DAC_C0_DACRFS_MASK; // 3.3V VDDA is DACREF_2 |
baxterja | 4:9fd291254686 | 51 | //DAC0_C2 =9; |
baxterja | 4:9fd291254686 | 52 | //DAC0_C2 |= 0x9; |
baxterja | 4:9fd291254686 | 53 | //DAC0_C2 |= DAC_C2_DACBFUP(9); |
baxterja | 4:9fd291254686 | 54 | DAC0_C2 =9; |
baxterja | 4:9fd291254686 | 55 | //DAC0_C2 |= DAC_C2_DACBFUP(9); // resets to 15 but setting it anyway... |
baxterja | 4:9fd291254686 | 56 | DAC0_C1 = 1; |
baxterja | 4:9fd291254686 | 57 | //DAC0_C1 |= (0x01); // 0x01 enables the DAC buffer! See note above |
baxterja | 4:9fd291254686 | 58 | |
baxterja | 4:9fd291254686 | 59 | // prefill the DAC buffer with first 16 values from the lut |
baxterja | 4:9fd291254686 | 60 | |
baxterja | 4:9fd291254686 | 61 | p1 = DAC0_DAT0; |
baxterja | 4:9fd291254686 | 62 | for (int i = 0; i < 16; i++) |
baxterja | 4:9fd291254686 | 63 | { |
baxterja | 4:9fd291254686 | 64 | *p1++ = (uint16_t) (cos(3.14159265359 * 2 * 10000 * .00001 * i) * 460.0 + 2870.0); // 3351.0 |
baxterja | 4:9fd291254686 | 65 | //printf("Pointer: %d\tValue: %d\n\r", (uint32_t)p1,(int) (cos(3.14159265359 * 2 * 10000 * .00001 * i) * 800.0 + 3103.0)); |
baxterja | 4:9fd291254686 | 66 | } |
baxterja | 4:9fd291254686 | 67 | printf ("data Low: %d\tdata High: %d\tTotal: %d\n\r",DAC0_DAT0L,DAC0_DAT0H,DAC0_DAT0L|DAC0_DAT0H<<8); |
baxterja | 4:9fd291254686 | 68 | printf ("data Low: %d\tdata High: %d\tTotal: %d\n\r",DAC0_DAT1L,DAC0_DAT1H,DAC0_DAT1L|DAC0_DAT1H<<8); |
baxterja | 4:9fd291254686 | 69 | printf ("data Low: %d\tdata High: %d\tTotal: %d\n\r",DAC0_DAT2L,DAC0_DAT2H,DAC0_DAT2L|DAC0_DAT2H<<8); |
baxterja | 4:9fd291254686 | 70 | printf ("data Low: %d\tdata High: %d\tTotal: %d\n\r",DAC0_DAT3L,DAC0_DAT3H,DAC0_DAT3L|DAC0_DAT3H<<8); |
baxterja | 4:9fd291254686 | 71 | printf ("data Low: %d\tdata High: %d\tTotal: %d\n\r",DAC0_DAT4L,DAC0_DAT4H,DAC0_DAT4L|DAC0_DAT4H<<8); |
baxterja | 4:9fd291254686 | 72 | printf ("data Low: %d\tdata High: %d\tTotal: %d\n\r",DAC0_DAT5L,DAC0_DAT5H,DAC0_DAT5L|DAC0_DAT5H<<8); |
baxterja | 4:9fd291254686 | 73 | printf ("data Low: %d\tdata High: %d\tTotal: %d\n\r",DAC0_DAT6L,DAC0_DAT6H,DAC0_DAT6L|DAC0_DAT6H<<8); |
baxterja | 4:9fd291254686 | 74 | printf ("data Low: %d\tdata High: %d\tTotal: %d\n\r",DAC0_DAT7L,DAC0_DAT7H,DAC0_DAT7L|DAC0_DAT7H<<8); |
baxterja | 4:9fd291254686 | 75 | printf ("data Low: %d\tdata High: %d\tTotal: %d\n\r",DAC0_DAT8L,DAC0_DAT8H,DAC0_DAT8L|DAC0_DAT8H<<8); |
baxterja | 4:9fd291254686 | 76 | printf ("data Low: %d\tdata High: %d\tTotal: %d\n\r",DAC0_DAT9L,DAC0_DAT9H,DAC0_DAT9L|DAC0_DAT9H<<8); |
baxterja | 4:9fd291254686 | 77 | //printf ("data High: %d\n\r",DAC0_DAT0H); |
baxterja | 4:9fd291254686 | 78 | |
baxterja | 4:9fd291254686 | 79 | //printf ("data Low: %d\n\r",DAC0_DAT1L); |
baxterja | 4:9fd291254686 | 80 | //printf ("data High: %d\n\r",DAC0_DAT1H); |
baxterja | 4:9fd291254686 | 81 | /* |
baxterja | 4:9fd291254686 | 82 | p1 = DAC0_DAT0; |
baxterja | 4:9fd291254686 | 83 | for (int i = 0; i < 16; i++) |
baxterja | 4:9fd291254686 | 84 | { |
baxterja | 4:9fd291254686 | 85 | *p1++; |
baxterja | 4:9fd291254686 | 86 | printf("Pointer: %d\n\r", (uint32_t)*p1); |
baxterja | 4:9fd291254686 | 87 | } |
baxterja | 4:9fd291254686 | 88 | |
baxterja | 4:9fd291254686 | 89 | DAC0_DAT0L =(uint8_t)(((uint16_t) (cos(3.14159265359 * 2 * 10000 * .00001 * 0) * 4965.0 + 49650.0))&0xFF); |
baxterja | 4:9fd291254686 | 90 | DAC0_DAT1L =(uint8_t)(((uint16_t) (cos(3.14159265359 * 2 * 10000 * .00001 * 1) * 4965.0 + 49650.0))&0xFF); |
baxterja | 4:9fd291254686 | 91 | DAC0_DAT2L =(uint8_t)(((uint16_t) (cos(3.14159265359 * 2 * 10000 * .00001 * 2) * 4965.0 + 49650.0))&0xFF); |
baxterja | 4:9fd291254686 | 92 | DAC0_DAT3L =(uint8_t)(((uint16_t) (cos(3.14159265359 * 2 * 10000 * .00001 * 3) * 4965.0 + 49650.0))&0xFF); |
baxterja | 4:9fd291254686 | 93 | DAC0_DAT4L =(uint8_t)(((uint16_t) (cos(3.14159265359 * 2 * 10000 * .00001 * 4) * 4965.0 + 49650.0))&0xFF); |
baxterja | 4:9fd291254686 | 94 | DAC0_DAT5L =(uint8_t)(((uint16_t) (cos(3.14159265359 * 2 * 10000 * .00001 * 5) * 4965.0 + 49650.0))&0xFF); |
baxterja | 4:9fd291254686 | 95 | DAC0_DAT6L =(uint8_t)(((uint16_t) (cos(3.14159265359 * 2 * 10000 * .00001 * 6) * 4965.0 + 49650.0))&0xFF); |
baxterja | 4:9fd291254686 | 96 | DAC0_DAT7L =(uint8_t)(((uint16_t) (cos(3.14159265359 * 2 * 10000 * .00001 * 7) * 4965.0 + 49650.0))&0xFF); |
baxterja | 4:9fd291254686 | 97 | DAC0_DAT8L =(uint8_t)(((uint16_t) (cos(3.14159265359 * 2 * 10000 * .00001 * 8) * 4965.0 + 49650.0))&0xFF); |
baxterja | 4:9fd291254686 | 98 | DAC0_DAT9L =(uint8_t)(((uint16_t) (cos(3.14159265359 * 2 * 10000 * .00001 * 9) * 4965.0 + 49650.0))&0xFF); |
baxterja | 4:9fd291254686 | 99 | |
baxterja | 4:9fd291254686 | 100 | DAC0_DAT0H =(uint8_t)((((uint16_t) (cos(3.14159265359 * 2 * 10000 * .00001 * 0) * 4965.0 + 49650.0))>>8)&0x0F); |
baxterja | 4:9fd291254686 | 101 | DAC0_DAT1H =(uint8_t)((((uint16_t) (cos(3.14159265359 * 2 * 10000 * .00001 * 1) * 4965.0 + 49650.0))>>8)&0x0F); |
baxterja | 4:9fd291254686 | 102 | DAC0_DAT2H =(uint8_t)((((uint16_t) (cos(3.14159265359 * 2 * 10000 * .00001 * 2) * 4965.0 + 49650.0))>>8)&0x0F); |
baxterja | 4:9fd291254686 | 103 | DAC0_DAT3H =(uint8_t)((((uint16_t) (cos(3.14159265359 * 2 * 10000 * .00001 * 3) * 4965.0 + 49650.0))>>8)&0x0F); |
baxterja | 4:9fd291254686 | 104 | DAC0_DAT4H =(uint8_t)((((uint16_t) (cos(3.14159265359 * 2 * 10000 * .00001 * 4) * 4965.0 + 49650.0))>>8)&0x0F); |
baxterja | 4:9fd291254686 | 105 | DAC0_DAT5H =(uint8_t)((((uint16_t) (cos(3.14159265359 * 2 * 10000 * .00001 * 5) * 4965.0 + 49650.0))>>8)&0x0F); |
baxterja | 4:9fd291254686 | 106 | DAC0_DAT6H =(uint8_t)((((uint16_t) (cos(3.14159265359 * 2 * 10000 * .00001 * 6) * 4965.0 + 49650.0))>>8)&0x0F); |
baxterja | 4:9fd291254686 | 107 | DAC0_DAT7H =(uint8_t)((((uint16_t) (cos(3.14159265359 * 2 * 10000 * .00001 * 7) * 4965.0 + 49650.0))>>8)&0x0F); |
baxterja | 4:9fd291254686 | 108 | DAC0_DAT8H =(uint8_t)((((uint16_t) (cos(3.14159265359 * 2 * 10000 * .00001 * 8) * 4965.0 + 49650.0))>>8)&0x0F); |
baxterja | 4:9fd291254686 | 109 | DAC0_DAT9H =(uint8_t)((((uint16_t) (cos(3.14159265359 * 2 * 10000 * .00001 * 9) * 4965.0 + 49650.0))>>8)&0x0F); |
baxterja | 4:9fd291254686 | 110 | */ |
baxterja | 4:9fd291254686 | 111 | /* |
baxterja | 4:9fd291254686 | 112 | DAC0_SR = 0x00; |
baxterja | 4:9fd291254686 | 113 | SIM_SCGC2 |= SIM_SCGC2_DAC0_MASK; |
baxterja | 4:9fd291254686 | 114 | SIM_SCGC6 |= SIM_SCGC2_DAC0_MASK; |
baxterja | 4:9fd291254686 | 115 | DAC0_C0 = 0; |
baxterja | 4:9fd291254686 | 116 | //DAC0_C0 |= DAC_C0_DACTRGSEL_MASK; |
baxterja | 4:9fd291254686 | 117 | DAC0_C0 |= DAC_C0_DACEN_MASK ; //The DAC system is enabled. |
baxterja | 4:9fd291254686 | 118 | |
baxterja | 4:9fd291254686 | 119 | DAC0_C1 = 0; |
baxterja | 4:9fd291254686 | 120 | //DAC0_C0 |= DAC_C0_DACTRGSEL_MASK; |
baxterja | 4:9fd291254686 | 121 | DAC0_C0 |= 0x80;//DAC_C0_DMAEN_MASK ; |
baxterja | 4:9fd291254686 | 122 | DAC0_DAT0L = 0xFF; |
baxterja | 4:9fd291254686 | 123 | DAC0_DAT0H = 0x00; |
baxterja | 4:9fd291254686 | 124 | */ |
baxterja | 4:9fd291254686 | 125 | } |
baxterja | 4:9fd291254686 | 126 | |
baxterja | 3:a85b742be262 | 127 | int main() |
baxterja | 3:a85b742be262 | 128 | { |
baxterja | 4:9fd291254686 | 129 | //DAC0_C2 =0; |
baxterja | 4:9fd291254686 | 130 | |
baxterja | 2:3771b3195c7b | 131 | led_blue = 1; |
baxterja | 2:3771b3195c7b | 132 | led_green = 1; |
baxterja | 2:3771b3195c7b | 133 | led_red = 1; |
baxterja | 3:a85b742be262 | 134 | pre_compute_tables(); |
baxterja | 3:a85b742be262 | 135 | |
baxterja | 2:3771b3195c7b | 136 | |
baxterja | 4:9fd291254686 | 137 | // t1.reset(); |
baxterja | 4:9fd291254686 | 138 | // for (int t = 0; t<500000; t++) |
baxterja | 4:9fd291254686 | 139 | // { |
baxterja | 4:9fd291254686 | 140 | // int input1 = 5000*cos(3.14159265359 * 2*10000*t*.00001)+2500; |
baxterja | 4:9fd291254686 | 141 | // int input2 = 2500*sin(3.14159265359 * 2*10000*t*.00001)+2500; |
baxterja | 4:9fd291254686 | 142 | // t1.start(); |
baxterja | 4:9fd291254686 | 143 | // filter100K(input1, input2); |
baxterja | 4:9fd291254686 | 144 | // t1.stop(); |
baxterja | 4:9fd291254686 | 145 | // } |
baxterja | 4:9fd291254686 | 146 | // printf("FINAL TIME: %f\n\r",t1.read()); |
baxterja | 4:9fd291254686 | 147 | |
baxterja | 4:9fd291254686 | 148 | |
baxterja | 4:9fd291254686 | 149 | |
baxterja | 4:9fd291254686 | 150 | // pc.baud(230400); |
baxterja | 2:3771b3195c7b | 151 | pc.printf("Starting...\r\n"); |
baxterja | 4:9fd291254686 | 152 | |
baxterja | 2:3771b3195c7b | 153 | |
baxterja | 2:3771b3195c7b | 154 | for(int i = 0; i < 86; i++) |
baxterja | 2:3771b3195c7b | 155 | { |
baxterja | 2:3771b3195c7b | 156 | if(NVIC_GetPriority((IRQn_Type) i) == 0) NVIC_SetPriority((IRQn_Type) i, 2); |
baxterja | 2:3771b3195c7b | 157 | } |
baxterja | 2:3771b3195c7b | 158 | |
baxterja | 2:3771b3195c7b | 159 | // Give hardware associated with |
baxterja | 2:3771b3195c7b | 160 | // sampling the highest priority |
baxterja | 2:3771b3195c7b | 161 | NVIC_SetPriority(ADC1_IRQn,0); |
baxterja | 2:3771b3195c7b | 162 | NVIC_SetPriority(ADC0_IRQn,0); |
baxterja | 2:3771b3195c7b | 163 | NVIC_SetPriority(PDB0_IRQn,0); |
baxterja | 2:3771b3195c7b | 164 | NVIC_SetPriority(DMA0_IRQn,0); |
baxterja | 2:3771b3195c7b | 165 | NVIC_SetPriority(DMA1_IRQn,0); |
baxterja | 2:3771b3195c7b | 166 | NVIC_SetPriority(DMA2_IRQn,0); |
baxterja | 2:3771b3195c7b | 167 | |
baxterja | 2:3771b3195c7b | 168 | NVIC_SetPriority(ENET_1588_Timer_IRQn,1); |
baxterja | 2:3771b3195c7b | 169 | NVIC_SetPriority(ENET_Transmit_IRQn,1); |
baxterja | 2:3771b3195c7b | 170 | NVIC_SetPriority(ENET_Receive_IRQn,1); |
baxterja | 2:3771b3195c7b | 171 | NVIC_SetPriority(ENET_Error_IRQn,1); |
baxterja | 2:3771b3195c7b | 172 | |
baxterja | 2:3771b3195c7b | 173 | //quad_init(); // initialize FTM2 quadrature decoder |
baxterja | 2:3771b3195c7b | 174 | //quad_invert(); // invert the direction of counting |
baxterja | 2:3771b3195c7b | 175 | adc_init(); // initialize ADCs (always initialize adc before dma) |
baxterja | 4:9fd291254686 | 176 | setUpDac(); |
baxterja | 4:9fd291254686 | 177 | // DAC0_C1 |= 0x80; |
baxterja | 4:9fd291254686 | 178 | // DAC0_DAT0L = 0xFF; |
baxterja | 4:9fd291254686 | 179 | // DAC0_DAT0H = 0xFF; |
baxterja | 4:9fd291254686 | 180 | // printf("Dac should be 3.3V"); |
baxterja | 2:3771b3195c7b | 181 | dma_init(); // initializes DMAs |
baxterja | 2:3771b3195c7b | 182 | pdb_init(); // initialize PDB0 as the timer for ADCs and DMA2 |
baxterja | 2:3771b3195c7b | 183 | |
baxterja | 2:3771b3195c7b | 184 | // flash green led indicating startup complete |
baxterja | 2:3771b3195c7b | 185 | led_red = 1; |
baxterja | 2:3771b3195c7b | 186 | led_blue = 1; |
baxterja | 2:3771b3195c7b | 187 | led_green = 0; |
baxterja | 2:3771b3195c7b | 188 | pause_ms(500); |
baxterja | 2:3771b3195c7b | 189 | led_green = 1; |
baxterja | 2:3771b3195c7b | 190 | pause_ms(200); |
baxterja | 2:3771b3195c7b | 191 | led_green = 0; |
baxterja | 4:9fd291254686 | 192 | pause_ms(500); |
baxterja | 2:3771b3195c7b | 193 | led_green = 1; |
baxterja | 2:3771b3195c7b | 194 | pdb_start(); |
baxterja | 4:9fd291254686 | 195 | |
baxterja | 4:9fd291254686 | 196 | //timer0.attach_us(&ISR_repeat, 10); |
baxterja | 2:3771b3195c7b | 197 | int startAddress = (int)&sample_array0[0]; |
baxterja | 4:9fd291254686 | 198 | //timer0.attach_us(&ISR_repeat, 100); |
baxterja | 4:9fd291254686 | 199 | int destinationIndex = (DMA_TCD0_DADDR-startAddress)/2; |
baxterja | 4:9fd291254686 | 200 | int currentIndex; |
baxterja | 4:9fd291254686 | 201 | /* |
baxterja | 4:9fd291254686 | 202 | printf("Dac Control0 Register: %X\n\r",DAC0_C0); |
baxterja | 4:9fd291254686 | 203 | printf("Dac Control2 Register: %X\n\r",DAC0_C2); |
baxterja | 4:9fd291254686 | 204 | printf("Dac Control1 Register: %X\n\r",DAC0_C1); |
baxterja | 4:9fd291254686 | 205 | printf("Dac Control2 Register: %X\n\r\n\r",DAC0_C2); |
baxterja | 4:9fd291254686 | 206 | //PDB0_DACINT0 = 0x257; |
baxterja | 4:9fd291254686 | 207 | printf("Dac intc Register: %X\n\r",PDB0_DACINTC0); |
baxterja | 4:9fd291254686 | 208 | printf("Dac int Register: %X\n\r",PDB0_DACINT0); |
baxterja | 4:9fd291254686 | 209 | */ |
baxterja | 2:3771b3195c7b | 210 | while (1) |
baxterja | 2:3771b3195c7b | 211 | { |
baxterja | 4:9fd291254686 | 212 | |
baxterja | 4:9fd291254686 | 213 | |
baxterja | 4:9fd291254686 | 214 | destinationIndex = (DMA_TCD0_DADDR-startAddress)/2; |
baxterja | 4:9fd291254686 | 215 | while (currentIndex!=destinationIndex) |
baxterja | 2:3771b3195c7b | 216 | { |
baxterja | 4:9fd291254686 | 217 | filter100K(sample_array0[currentIndex], sample_array1[currentIndex]); |
baxterja | 4:9fd291254686 | 218 | currentIndex++; |
baxterja | 4:9fd291254686 | 219 | if (currentIndex>=2000) |
baxterja | 4:9fd291254686 | 220 | currentIndex = 0; |
baxterja | 4:9fd291254686 | 221 | |
baxterja | 2:3771b3195c7b | 222 | } |
baxterja | 2:3771b3195c7b | 223 | |
baxterja | 2:3771b3195c7b | 224 | } |
baxterja | 4:9fd291254686 | 225 | |
baxterja | 4:9fd291254686 | 226 | |
baxterja | 4:9fd291254686 | 227 | } |