Clone of the "Keyboard" project combined with string>LCD calls and Serial reading for the STM32F746G-DISCO. Screen has to be reset and the font set again, and Serial must be created and destroyed each time, to dodge apparent F7 lower-level issues. Keyboard can print prompt.
Dependencies: BSP_DISCO_F746NG mbed
Fork of Keyboard by
main.cpp@7:3d2369ac93a7, 2017-02-22 (annotated)
- Committer:
- jknowles
- Date:
- Wed Feb 22 15:25:12 2017 +0000
- Revision:
- 7:3d2369ac93a7
- Parent:
- 6:310e91584386
(serial fixed by creating/destroying it: still embed issues for this board)
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Faberge | 0:3ea368f65bca | 1 | /* |
Faberge | 0:3ea368f65bca | 2 | ******************************************************************************* |
Faberge | 0:3ea368f65bca | 3 | * Пример работы экранной клавиатуры на демо-плате STM32F746NG Discovery с |
Faberge | 0:3ea368f65bca | 4 | * использованием стандартного набора библиотек BSP и пользовательской |
Faberge | 0:3ea368f65bca | 5 | * библиотеки "keyboard.h" |
Faberge | 0:3ea368f65bca | 6 | ******************************************************************************* |
Faberge | 0:3ea368f65bca | 7 | */ |
Faberge | 0:3ea368f65bca | 8 | |
Faberge | 0:3ea368f65bca | 9 | /* Добавляем библиотеку для работы с LCD */ |
Faberge | 0:3ea368f65bca | 10 | #include "stm32746g_discovery_lcd.h" |
Faberge | 0:3ea368f65bca | 11 | /* Добавляем библиотеку экранной клавиатуры */ |
Faberge | 0:3ea368f65bca | 12 | #include "keyboard.h" |
Faberge | 0:3ea368f65bca | 13 | |
jknowles | 3:12b494808ffa | 14 | #include "mbed.h" |
jknowles | 3:12b494808ffa | 15 | |
jknowles | 5:50c5e677f71a | 16 | // no such file: #include "USBSerial.h" |
jknowles | 3:12b494808ffa | 17 | |
Faberge | 0:3ea368f65bca | 18 | /* Вспомогательные переменые */ |
Faberge | 0:3ea368f65bca | 19 | uint8_t i; |
Faberge | 0:3ea368f65bca | 20 | uint8_t key; |
jknowles | 1:25b8d7bfc7d4 | 21 | uint8_t len; |
Faberge | 0:3ea368f65bca | 22 | |
Faberge | 0:3ea368f65bca | 23 | /* Пользовательский буфер */ |
jknowles | 2:14dc9a7c52ac | 24 | char kb_buffer[45]; |
Faberge | 0:3ea368f65bca | 25 | |
jknowles | 3:12b494808ffa | 26 | |
jknowles | 3:12b494808ffa | 27 | |
jknowles | 3:12b494808ffa | 28 | /* |
jknowles | 3:12b494808ffa | 29 | * Calculates the mean and standard deviation of the array in data[] |
jknowles | 3:12b494808ffa | 30 | */ |
jknowles | 3:12b494808ffa | 31 | void GetMeanSD(float data[], int qty, float *mn, float *sd) |
jknowles | 3:12b494808ffa | 32 | { |
jknowles | 3:12b494808ffa | 33 | float sum = 0.0; |
jknowles | 3:12b494808ffa | 34 | float mean; |
jknowles | 3:12b494808ffa | 35 | float stdDev = 0.0; |
jknowles | 3:12b494808ffa | 36 | int i; |
jknowles | 3:12b494808ffa | 37 | float delt; |
jknowles | 3:12b494808ffa | 38 | for(i=0; i<qty; i++) { |
jknowles | 3:12b494808ffa | 39 | sum = sum + data[i]; |
jknowles | 3:12b494808ffa | 40 | } |
jknowles | 3:12b494808ffa | 41 | mean = sum/(float)qty; |
jknowles | 3:12b494808ffa | 42 | |
jknowles | 3:12b494808ffa | 43 | for(i=0; i<qty; i++) { |
jknowles | 3:12b494808ffa | 44 | delt = data[i] - mean; |
jknowles | 3:12b494808ffa | 45 | stdDev = stdDev + (delt * delt); |
jknowles | 3:12b494808ffa | 46 | } |
jknowles | 3:12b494808ffa | 47 | *sd = sqrt(stdDev/(float)qty); |
jknowles | 3:12b494808ffa | 48 | *mn = mean; |
jknowles | 3:12b494808ffa | 49 | } |
jknowles | 3:12b494808ffa | 50 | |
jknowles | 3:12b494808ffa | 51 | |
jknowles | 3:12b494808ffa | 52 | |
jknowles | 3:12b494808ffa | 53 | /* copies comma-seperate item into |
jknowles | 3:12b494808ffa | 54 | * rcvr_str, returns ptr to the next or end |
jknowles | 3:12b494808ffa | 55 | */ |
jknowles | 3:12b494808ffa | 56 | char *get_csv_itm(char *inbufloc, char *rcvr_str) |
jknowles | 3:12b494808ffa | 57 | { |
jknowles | 3:12b494808ffa | 58 | char *p1 = inbufloc; |
jknowles | 3:12b494808ffa | 59 | char *p2 = rcvr_str ; |
jknowles | 3:12b494808ffa | 60 | *p2 = '\0'; /* null the rcvr first */ |
jknowles | 3:12b494808ffa | 61 | if (*p1 == ',') /* this is and empty item */ |
jknowles | 3:12b494808ffa | 62 | { |
jknowles | 3:12b494808ffa | 63 | p1++; |
jknowles | 3:12b494808ffa | 64 | return(p1); |
jknowles | 3:12b494808ffa | 65 | } |
jknowles | 3:12b494808ffa | 66 | while (*p1 != '\0' && *p1 != ',') |
jknowles | 3:12b494808ffa | 67 | { |
jknowles | 3:12b494808ffa | 68 | *p2 = *p1; |
jknowles | 3:12b494808ffa | 69 | p1++; |
jknowles | 3:12b494808ffa | 70 | p2++; |
jknowles | 3:12b494808ffa | 71 | } |
jknowles | 3:12b494808ffa | 72 | if (*p1 == ',') |
jknowles | 3:12b494808ffa | 73 | { |
jknowles | 3:12b494808ffa | 74 | p1++; /* move to nxt item */ |
jknowles | 3:12b494808ffa | 75 | } |
jknowles | 3:12b494808ffa | 76 | *p2 = '\0'; |
jknowles | 3:12b494808ffa | 77 | return(p1); |
jknowles | 3:12b494808ffa | 78 | } |
jknowles | 3:12b494808ffa | 79 | |
jknowles | 3:12b494808ffa | 80 | |
jknowles | 3:12b494808ffa | 81 | |
jknowles | 3:12b494808ffa | 82 | |
jknowles | 3:12b494808ffa | 83 | |
jknowles | 3:12b494808ffa | 84 | |
jknowles | 2:14dc9a7c52ac | 85 | void start_KB_LCD() |
Faberge | 0:3ea368f65bca | 86 | { |
Faberge | 0:3ea368f65bca | 87 | /* Инициализация дисплея */ |
jknowles | 2:14dc9a7c52ac | 88 | /* Включаем дисплей */ |
jknowles | 2:14dc9a7c52ac | 89 | /* Настраиваем первый и второй слои дисплея */ |
Faberge | 0:3ea368f65bca | 90 | BSP_LCD_Init(); |
Faberge | 0:3ea368f65bca | 91 | BSP_LCD_LayerDefaultInit(0, LCD_FB_START_ADDRESS); |
Faberge | 0:3ea368f65bca | 92 | BSP_LCD_LayerDefaultInit(1, LCD_FB_START_ADDRESS + (BSP_LCD_GetXSize() * BSP_LCD_GetYSize() * 4)); |
Faberge | 0:3ea368f65bca | 93 | BSP_LCD_DisplayOn(); |
Faberge | 0:3ea368f65bca | 94 | BSP_LCD_SelectLayer(0); |
Faberge | 0:3ea368f65bca | 95 | BSP_LCD_Clear(LCD_COLOR_WHITE); |
Faberge | 0:3ea368f65bca | 96 | BSP_LCD_SelectLayer(1); |
Faberge | 0:3ea368f65bca | 97 | BSP_LCD_Clear(LCD_COLOR_BLACK); |
Faberge | 0:3ea368f65bca | 98 | BSP_LCD_SetTransparency(0, 0); |
Faberge | 0:3ea368f65bca | 99 | BSP_LCD_SetTransparency(1, 100); |
Faberge | 0:3ea368f65bca | 100 | /* Настраиваем цвет фона экрана и цвет текста, а также шрифт */ |
jknowles | 2:14dc9a7c52ac | 101 | BSP_LCD_SetTextColor(LCD_COLOR_WHITE); |
Faberge | 0:3ea368f65bca | 102 | BSP_LCD_SetBackColor(LCD_COLOR_BLACK); |
Faberge | 0:3ea368f65bca | 103 | BSP_LCD_SetFont(&Font16); |
jknowles | 2:14dc9a7c52ac | 104 | |
Faberge | 0:3ea368f65bca | 105 | /* Инициализация тач-экрана*/ |
Faberge | 0:3ea368f65bca | 106 | BSP_TS_Init(BSP_LCD_GetXSize(), BSP_LCD_GetYSize()); |
jknowles | 2:14dc9a7c52ac | 107 | |
jknowles | 2:14dc9a7c52ac | 108 | } |
jknowles | 2:14dc9a7c52ac | 109 | |
jknowles | 2:14dc9a7c52ac | 110 | |
jknowles | 4:0e5755618652 | 111 | |
jknowles | 4:0e5755618652 | 112 | void get_kbd_str(char *promp, char *bufr) |
jknowles | 2:14dc9a7c52ac | 113 | { |
jknowles | 2:14dc9a7c52ac | 114 | start_KB_LCD(); |
jknowles | 2:14dc9a7c52ac | 115 | Keyboard_init(0, 80); |
jknowles | 2:14dc9a7c52ac | 116 | while(1) { |
jknowles | 4:0e5755618652 | 117 | key = Keyboard_handler(promp, bufr); |
jknowles | 2:14dc9a7c52ac | 118 | if (key == KEY_ENTER_VALUE) break; // to go to another screen ? |
jknowles | 2:14dc9a7c52ac | 119 | HAL_Delay(10); |
jknowles | 2:14dc9a7c52ac | 120 | } |
jknowles | 2:14dc9a7c52ac | 121 | } |
jknowles | 2:14dc9a7c52ac | 122 | |
jknowles | 2:14dc9a7c52ac | 123 | |
jknowles | 2:14dc9a7c52ac | 124 | |
jknowles | 2:14dc9a7c52ac | 125 | |
jknowles | 2:14dc9a7c52ac | 126 | |
jknowles | 2:14dc9a7c52ac | 127 | /* Основная программа */ |
jknowles | 2:14dc9a7c52ac | 128 | int main(void) |
jknowles | 2:14dc9a7c52ac | 129 | { |
jknowles | 3:12b494808ffa | 130 | #define STATSIZE 128 |
jknowles | 6:310e91584386 | 131 | |
jknowles | 3:12b494808ffa | 132 | char sbuf[128]; |
jknowles | 3:12b494808ffa | 133 | char dbgtlk[128]; |
jknowles | 3:12b494808ffa | 134 | |
jknowles | 3:12b494808ffa | 135 | char tstr[128]; |
jknowles | 3:12b494808ffa | 136 | char bstr[32]; |
jknowles | 3:12b494808ffa | 137 | char cstr[32]; |
jknowles | 3:12b494808ffa | 138 | char estr[32]; |
jknowles | 3:12b494808ffa | 139 | char pbstr[32]; |
jknowles | 3:12b494808ffa | 140 | int ii; |
jknowles | 3:12b494808ffa | 141 | |
jknowles | 3:12b494808ffa | 142 | char *rawp; |
jknowles | 3:12b494808ffa | 143 | char *csvp; |
jknowles | 3:12b494808ffa | 144 | int rawq; |
jknowles | 3:12b494808ffa | 145 | int bi, ci, ei; |
jknowles | 3:12b494808ffa | 146 | float pbf, bf, cf, ef; |
jknowles | 3:12b494808ffa | 147 | float pbar[STATSIZE]; |
jknowles | 3:12b494808ffa | 148 | float bar[STATSIZE]; |
jknowles | 3:12b494808ffa | 149 | float car[STATSIZE]; |
jknowles | 3:12b494808ffa | 150 | float ear[STATSIZE]; |
jknowles | 3:12b494808ffa | 151 | int duds = 0; |
jknowles | 3:12b494808ffa | 152 | char gotc; |
jknowles | 3:12b494808ffa | 153 | |
jknowles | 3:12b494808ffa | 154 | float pb_mn, pb_sd, b_mn, b_sd, c_mn, c_sd, e_mn, e_sd; |
jknowles | 3:12b494808ffa | 155 | |
jknowles | 2:14dc9a7c52ac | 156 | char msg_b[128]; |
jknowles | 2:14dc9a7c52ac | 157 | int u_tries; |
jknowles | 2:14dc9a7c52ac | 158 | char u_name[128]; |
jknowles | 2:14dc9a7c52ac | 159 | char u_passwd[128]; |
jknowles | 2:14dc9a7c52ac | 160 | char out_str[128]; |
jknowles | 6:310e91584386 | 161 | char out_str2[128]; |
jknowles | 2:14dc9a7c52ac | 162 | |
jknowles | 6:310e91584386 | 163 | |
jknowles | 3:12b494808ffa | 164 | |
jknowles | 6:310e91584386 | 165 | |
jknowles | 6:310e91584386 | 166 | start_KB_LCD(); |
jknowles | 6:310e91584386 | 167 | BSP_LCD_SetFont(&Font24); |
jknowles | 6:310e91584386 | 168 | get_kbd_str("USE JOYSTICK TO ENTER NAME:", kb_buffer); |
jknowles | 6:310e91584386 | 169 | strcpy(u_name, kb_buffer); |
jknowles | 6:310e91584386 | 170 | kb_buffer[0] = '\0'; |
jknowles | 6:310e91584386 | 171 | |
jknowles | 6:310e91584386 | 172 | start_KB_LCD(); |
jknowles | 6:310e91584386 | 173 | BSP_LCD_SetFont(&Font24); |
jknowles | 6:310e91584386 | 174 | get_kbd_str("USE JOYSTICK TO ENTER PASSWORD:", kb_buffer); |
jknowles | 6:310e91584386 | 175 | strcpy(u_passwd, kb_buffer); |
jknowles | 6:310e91584386 | 176 | kb_buffer[0] = '\0'; |
jknowles | 3:12b494808ffa | 177 | |
jknowles | 6:310e91584386 | 178 | // DISPLAY WHAT USER PUT IN |
jknowles | 6:310e91584386 | 179 | start_KB_LCD(); |
jknowles | 6:310e91584386 | 180 | BSP_LCD_SetFont(&Font24); |
jknowles | 6:310e91584386 | 181 | strcpy(out_str, "USER NAME: "); |
jknowles | 6:310e91584386 | 182 | strcat(out_str, u_name); |
jknowles | 6:310e91584386 | 183 | BSP_LCD_DisplayStringAtLine(2, (uint8_t *) out_str); |
jknowles | 6:310e91584386 | 184 | strcpy(out_str, "USER PASWD: "); |
jknowles | 6:310e91584386 | 185 | strcat(out_str, u_passwd); |
jknowles | 6:310e91584386 | 186 | BSP_LCD_DisplayStringAtLine(4, (uint8_t *) out_str); |
jknowles | 6:310e91584386 | 187 | |
jknowles | 6:310e91584386 | 188 | HAL_Delay(2000); |
jknowles | 6:310e91584386 | 189 | |
jknowles | 6:310e91584386 | 190 | start_KB_LCD(); |
jknowles | 6:310e91584386 | 191 | strcpy(out_str, " READY TO TAKE MEASUREMENT "); |
jknowles | 6:310e91584386 | 192 | BSP_LCD_DisplayStringAtLine(2, (uint8_t *) out_str); |
jknowles | 6:310e91584386 | 193 | |
jknowles | 6:310e91584386 | 194 | HAL_Delay(2000); |
jknowles | 6:310e91584386 | 195 | |
jknowles | 6:310e91584386 | 196 | start_KB_LCD(); |
jknowles | 6:310e91584386 | 197 | strcpy(out_str, " TRIGGER DETECTED "); |
jknowles | 6:310e91584386 | 198 | BSP_LCD_DisplayStringAtLine(2, (uint8_t *) out_str); |
jknowles | 6:310e91584386 | 199 | HAL_Delay(3000); |
jknowles | 3:12b494808ffa | 200 | |
jknowles | 6:310e91584386 | 201 | start_KB_LCD(); |
jknowles | 6:310e91584386 | 202 | BSP_LCD_SetFont(&Font16); |
jknowles | 3:12b494808ffa | 203 | |
jknowles | 3:12b494808ffa | 204 | /* orangecalypso */ |
jknowles | 3:12b494808ffa | 205 | BSP_LCD_DisplayStringAtLine(1, (uint8_t *)"RDG Pb #B #C #E "); |
jknowles | 3:12b494808ffa | 206 | wait(1.0); |
jknowles | 3:12b494808ffa | 207 | for (ii=0; ii<STATSIZE; ii++) { |
jknowles | 3:12b494808ffa | 208 | |
jknowles | 3:12b494808ffa | 209 | pbf = 10.2 + (float)ii/20.1; |
jknowles | 3:12b494808ffa | 210 | bi = 80 + ii*20; bf = (float) bi; |
jknowles | 3:12b494808ffa | 211 | ci = 60 + ii*6; cf = (float) ci; |
jknowles | 3:12b494808ffa | 212 | ei = 30 + ii*4; ef = (float) ei; |
jknowles | 3:12b494808ffa | 213 | |
jknowles | 3:12b494808ffa | 214 | pbar[ii] = pbf; |
jknowles | 3:12b494808ffa | 215 | bar[ii] = bf; |
jknowles | 3:12b494808ffa | 216 | car[ii] = cf; |
jknowles | 3:12b494808ffa | 217 | ear[ii] = ef; |
jknowles | 3:12b494808ffa | 218 | |
jknowles | 3:12b494808ffa | 219 | sprintf(tstr, "%03d %3.2f %05d %05d %05d ", ii, pbf, bi, ci, ei); |
jknowles | 3:12b494808ffa | 220 | BSP_LCD_DisplayStringAtLine((2 + (ii%5)), (uint8_t *)tstr); |
jknowles | 3:12b494808ffa | 221 | |
jknowles | 3:12b494808ffa | 222 | if (ii > 2) { |
jknowles | 5:50c5e677f71a | 223 | |
jknowles | 5:50c5e677f71a | 224 | if (ii > 11) { |
jknowles | 5:50c5e677f71a | 225 | GetMeanSD(pbar + ii - 11 , 10, &pb_mn, &pb_sd); |
jknowles | 5:50c5e677f71a | 226 | GetMeanSD(bar + ii - 11, 10, &b_mn, &b_sd); |
jknowles | 5:50c5e677f71a | 227 | GetMeanSD(car + ii - 11, 10, &c_mn, &c_sd); |
jknowles | 5:50c5e677f71a | 228 | GetMeanSD(ear + ii - 11 , 10, &e_mn, &e_sd); |
jknowles | 5:50c5e677f71a | 229 | } |
jknowles | 5:50c5e677f71a | 230 | else { |
jknowles | 5:50c5e677f71a | 231 | GetMeanSD(pbar, ii, &pb_mn, &pb_sd); |
jknowles | 5:50c5e677f71a | 232 | GetMeanSD(bar, ii, &b_mn, &b_sd); |
jknowles | 5:50c5e677f71a | 233 | GetMeanSD(car, ii, &c_mn, &c_sd); |
jknowles | 5:50c5e677f71a | 234 | GetMeanSD(ear, ii, &e_mn, &e_sd); |
jknowles | 5:50c5e677f71a | 235 | } |
jknowles | 6:310e91584386 | 236 | |
jknowles | 3:12b494808ffa | 237 | sprintf(tstr, "Mean %4.2f %05d %05d %05d", pb_mn, (int)b_mn, (int)c_mn, (int)e_mn); |
jknowles | 3:12b494808ffa | 238 | BSP_LCD_DisplayStringAtLine((8), (uint8_t *)tstr); |
jknowles | 3:12b494808ffa | 239 | sprintf(tstr, "StDv %4.2f %05d %05d %05d", pb_sd, (int)b_sd, (int)c_sd, (int)e_sd); |
jknowles | 3:12b494808ffa | 240 | BSP_LCD_DisplayStringAtLine((9), (uint8_t *)tstr); |
jknowles | 3:12b494808ffa | 241 | |
jknowles | 3:12b494808ffa | 242 | sprintf(tstr, " %-04.2f%% %-04.2f%%", 100.0*(c_sd/c_mn), 100.0*(e_sd/e_mn)); |
jknowles | 3:12b494808ffa | 243 | BSP_LCD_DisplayStringAtLine((10), (uint8_t *)tstr); |
jknowles | 6:310e91584386 | 244 | |
jknowles | 3:12b494808ffa | 245 | strcpy (sbuf, "---trying serial----"); |
jknowles | 3:12b494808ffa | 246 | BSP_LCD_DisplayStringAtLine(LINE(11), (uint8_t *)sbuf); |
jknowles | 5:50c5e677f71a | 247 | |
jknowles | 3:12b494808ffa | 248 | rawq = 0; |
jknowles | 3:12b494808ffa | 249 | strcpy (sbuf, "--currently empty---"); |
jknowles | 5:50c5e677f71a | 250 | rawp = sbuf; |
jknowles | 5:50c5e677f71a | 251 | rawq = duds = 0; |
jknowles | 3:12b494808ffa | 252 | gotc = 'x'; |
jknowles | 5:50c5e677f71a | 253 | |
jknowles | 3:12b494808ffa | 254 | strcpy (dbgtlk, "---pt1---"); |
jknowles | 3:12b494808ffa | 255 | BSP_LCD_DisplayStringAtLine((12), (uint8_t *)dbgtlk); |
jknowles | 6:310e91584386 | 256 | |
jknowles | 5:50c5e677f71a | 257 | strcpy (dbgtlk, "---pt4---"); |
jknowles | 3:12b494808ffa | 258 | BSP_LCD_DisplayStringAtLine((12), (uint8_t *)dbgtlk); |
jknowles | 5:50c5e677f71a | 259 | |
jknowles | 6:310e91584386 | 260 | if (strlen(dbgtlk) > 1) |
jknowles | 6:310e91584386 | 261 | { |
jknowles | 6:310e91584386 | 262 | Serial pc(USBTX, USBRX); // Serial created and destroyed each cycle |
jknowles | 6:310e91584386 | 263 | pc.baud(9600); |
jknowles | 6:310e91584386 | 264 | pc.gets(sbuf , 30); |
jknowles | 6:310e91584386 | 265 | } |
jknowles | 6:310e91584386 | 266 | else |
jknowles | 6:310e91584386 | 267 | { |
jknowles | 6:310e91584386 | 268 | strcpy(sbuf, "---"); |
jknowles | 6:310e91584386 | 269 | } |
jknowles | 6:310e91584386 | 270 | // pc.scanf("%s", sbuf); |
jknowles | 5:50c5e677f71a | 271 | |
jknowles | 3:12b494808ffa | 272 | if (rawq > 0) *rawp = '\0'; |
jknowles | 6:310e91584386 | 273 | sbuf[40] = '\0'; // just for test .... truncate the line |
jknowles | 3:12b494808ffa | 274 | BSP_LCD_DisplayStringAtLine((11), (uint8_t *)sbuf); |
jknowles | 6:310e91584386 | 275 | |
jknowles | 6:310e91584386 | 276 | csvp = sbuf; |
jknowles | 6:310e91584386 | 277 | csvp = get_csv_itm(csvp, bstr); bi = atoi(bstr); |
jknowles | 6:310e91584386 | 278 | csvp = get_csv_itm(csvp, cstr); ci = atoi(cstr); |
jknowles | 6:310e91584386 | 279 | csvp = get_csv_itm(csvp, estr); ei = atoi(estr); |
jknowles | 6:310e91584386 | 280 | csvp = get_csv_itm(csvp, pbstr); pbf = atof(pbstr); |
jknowles | 6:310e91584386 | 281 | |
jknowles | 6:310e91584386 | 282 | sprintf(out_str2, "b>%d c>%d e>%d Pb> %s ", bi, ci, ei, pbstr); |
jknowles | 6:310e91584386 | 283 | BSP_LCD_DisplayStringAtLine((12), (uint8_t *)out_str2); |
jknowles | 3:12b494808ffa | 284 | } |
jknowles | 3:12b494808ffa | 285 | wait(2.0); |
jknowles | 3:12b494808ffa | 286 | } |
jknowles | 3:12b494808ffa | 287 | |
jknowles | 3:12b494808ffa | 288 | |
jknowles | 6:310e91584386 | 289 | |
jknowles | 2:14dc9a7c52ac | 290 | |
jknowles | 2:14dc9a7c52ac | 291 | |
Faberge | 0:3ea368f65bca | 292 | } |