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