Measuring air flow, relative humidity & temperature, then showing results at TFT

Dependencies:   FT800_2 HYT mbed

Air flow is measured with FS7 sensor by IST-AG, humidity & temperature are measured by HYT-271 sensor by IST. Graphs displayed it TFT by Riverdi via graphical controller FFT801.

Hardware

For documentation on the FT800 library, please refer to the library pages.

Connection

MCU-board to TFT-module

MCU-board is connected to TFT-module via Break Out Board. You need 6 signals to connect: SCK, MOSI and MISO are connected to a SPI channel, SS is the chip select signal, PD work as powerdown and INT for interrupts from TFT to MCU.

/media/uploads/Ksenia/4_-22-.jpg

You have to connect VDD to BLVDD at Break Out Board if you use the board:

/media/uploads/Ksenia/4_-5-.jpg

MCU-board to HYT sensor

MCU-board is connected to sensor via I2C. Remember to use pull-up resisrors there:

/media/uploads/Ksenia/freshpaint-20-2016.09.16-10.37.03.png

MCU-board to FS7 sensor

MCU-board is connected to sensor via FS flowmodule. FS-flowmodul is a PCB implementing bridge circuit which is necessary for FS7.

https://habrastorage.org/files/b25/056/287/b250562871614b4ca4286af885f1fa24

https://habrastorage.org/files/72d/04c/cac/72d04ccac07b4fcfb436e0ffbac73066

Committer:
Ksenia
Date:
Thu Mar 16 08:58:18 2017 +0000
Revision:
0:3f440c2facb0
Initial Commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Ksenia 0:3f440c2facb0 1 #include "Display.h"
Ksenia 0:3f440c2facb0 2
Ksenia 0:3f440c2facb0 3 /**************************************************************************************************************************
Ksenia 0:3f440c2facb0 4 ************************** Display Main Menu ******************************************************************************
Ksenia 0:3f440c2facb0 5 **************************************************************************************************************************/
Ksenia 0:3f440c2facb0 6 void Display::MainScreen()
Ksenia 0:3f440c2facb0 7 {
Ksenia 0:3f440c2facb0 8 uint8_t numberOfGraphs = showHumidity + showFlow + showTemperature;
Ksenia 0:3f440c2facb0 9
Ksenia 0:3f440c2facb0 10 // start FT800 display list
Ksenia 0:3f440c2facb0 11 StartDL();
Ksenia 0:3f440c2facb0 12
Ksenia 0:3f440c2facb0 13 /****************************************************************************************************/
Ksenia 0:3f440c2facb0 14 (*_TFT).DL(SET_BACKGROUND_COLOR);
Ksenia 0:3f440c2facb0 15 (*_TFT).DL(TAG_MASK(1));
Ksenia 0:3f440c2facb0 16 (*_TFT).DL(TAG(SHOW_HUMIDITY));
Ksenia 0:3f440c2facb0 17 (*_TFT).DL(BEGIN(RECTS));
Ksenia 0:3f440c2facb0 18 (*_TFT).DL(VERTEX2II(0, 0, 0, 0));
Ksenia 0:3f440c2facb0 19 (*_TFT).DL(VERTEX2II(0 + BUTTON_1_WIDTH + X_LEFT_OFFSET, Y_UPPER_OFFSET + BUTTON_HEIGHT + Y_UPPER_OFFSET, 0, 0));
Ksenia 0:3f440c2facb0 20 (*_TFT).DL(END());
Ksenia 0:3f440c2facb0 21 (*_TFT).DL(TAG_MASK(0));
Ksenia 0:3f440c2facb0 22
Ksenia 0:3f440c2facb0 23 (*_TFT).DL(TAG_MASK(1));
Ksenia 0:3f440c2facb0 24 (*_TFT).DL(TAG(SHOW_FLOW));
Ksenia 0:3f440c2facb0 25 (*_TFT).DL(BEGIN(RECTS));
Ksenia 0:3f440c2facb0 26 (*_TFT).DL(VERTEX2II(X_LEFT_OFFSET + BUTTON_1_WIDTH + X_LEFT_OFFSET / 2, 0, 0, 0));
Ksenia 0:3f440c2facb0 27 (*_TFT).DL(VERTEX2II(X_LEFT_OFFSET + BUTTON_1_WIDTH + X_LEFT_OFFSET + BUTTON_2_WIDTH + X_LEFT_OFFSET / 2, Y_UPPER_OFFSET + BUTTON_HEIGHT + Y_UPPER_OFFSET, 0, 0));
Ksenia 0:3f440c2facb0 28 (*_TFT).DL(END());
Ksenia 0:3f440c2facb0 29 (*_TFT).DL(TAG_MASK(0));
Ksenia 0:3f440c2facb0 30
Ksenia 0:3f440c2facb0 31 (*_TFT).DL(TAG_MASK(1));
Ksenia 0:3f440c2facb0 32 (*_TFT).DL(TAG(SHOW_TEMPERATURE));
Ksenia 0:3f440c2facb0 33 (*_TFT).DL(BEGIN(RECTS));
Ksenia 0:3f440c2facb0 34 (*_TFT).DL(VERTEX2II(X_LEFT_OFFSET + BUTTON_1_WIDTH + X_LEFT_OFFSET + BUTTON_2_WIDTH + X_LEFT_OFFSET / 2, 0, 0, 0));
Ksenia 0:3f440c2facb0 35 (*_TFT).DL(VERTEX2II(X_LEFT_OFFSET + BUTTON_1_WIDTH + X_LEFT_OFFSET + BUTTON_2_WIDTH + X_LEFT_OFFSET + BUTTON_3_WIDTH + X_LEFT_OFFSET / 2, Y_UPPER_OFFSET + BUTTON_HEIGHT + Y_UPPER_OFFSET, 0, 0));
Ksenia 0:3f440c2facb0 36 (*_TFT).DL(END());
Ksenia 0:3f440c2facb0 37 (*_TFT).DL(TAG_MASK(0));
Ksenia 0:3f440c2facb0 38
Ksenia 0:3f440c2facb0 39 /****************************************************************************************************/
Ksenia 0:3f440c2facb0 40 if (showHumidity) {
Ksenia 0:3f440c2facb0 41 (*_TFT).DL(SET_HUMIDITY_COLOR);
Ksenia 0:3f440c2facb0 42 } else {
Ksenia 0:3f440c2facb0 43 (*_TFT).DL(SET_HUMIDITY_LOW_COLOR);
Ksenia 0:3f440c2facb0 44 }
Ksenia 0:3f440c2facb0 45 (*_TFT).DL(BEGIN(RECTS));
Ksenia 0:3f440c2facb0 46 (*_TFT).DL(VERTEX2II(X_LEFT_OFFSET, Y_UPPER_OFFSET, 0, 0));
Ksenia 0:3f440c2facb0 47 (*_TFT).DL(VERTEX2II(X_LEFT_OFFSET + BUTTON_1_WIDTH, Y_UPPER_OFFSET + BUTTON_HEIGHT, 0, 0));
Ksenia 0:3f440c2facb0 48 (*_TFT).DL(END());
Ksenia 0:3f440c2facb0 49 if (showHumidity) {
Ksenia 0:3f440c2facb0 50 (*_TFT).DL(SET_HUMIDITY_LOW_COLOR);
Ksenia 0:3f440c2facb0 51 (*_TFT).DL(BEGIN(LINES));
Ksenia 0:3f440c2facb0 52 (*_TFT).DL(VERTEX2II(X_LEFT_OFFSET, Y_UPPER_OFFSET + BUTTON_HEIGHT, 0, 0));
Ksenia 0:3f440c2facb0 53 (*_TFT).DL(VERTEX2II(X_LEFT_OFFSET + BUTTON_1_WIDTH, Y_UPPER_OFFSET + BUTTON_HEIGHT, 0, 0));
Ksenia 0:3f440c2facb0 54 (*_TFT).DL(END());
Ksenia 0:3f440c2facb0 55 (*_TFT).DL(BEGIN(LINES));
Ksenia 0:3f440c2facb0 56 (*_TFT).DL(VERTEX2II(X_LEFT_OFFSET, Y_UPPER_OFFSET, 0, 0));
Ksenia 0:3f440c2facb0 57 (*_TFT).DL(VERTEX2II(X_LEFT_OFFSET, Y_UPPER_OFFSET + BUTTON_HEIGHT, 0, 0));
Ksenia 0:3f440c2facb0 58 (*_TFT).DL(END());
Ksenia 0:3f440c2facb0 59 (*_TFT).DL(SET_WHITE_COLOR);
Ksenia 0:3f440c2facb0 60 } else {
Ksenia 0:3f440c2facb0 61 (*_TFT).DL(COLOR_RGB(100, 100, 100));
Ksenia 0:3f440c2facb0 62 }
Ksenia 0:3f440c2facb0 63 CreateStringRussian("Отн. влажность");
Ksenia 0:3f440c2facb0 64 (*_TFT).Text(X_LEFT_OFFSET + 5, Y_UPPER_OFFSET + 5, 4, 0, russianStr);
Ksenia 0:3f440c2facb0 65
Ksenia 0:3f440c2facb0 66
Ksenia 0:3f440c2facb0 67 (*_TFT).DL(SET_FLOW_COLOR);
Ksenia 0:3f440c2facb0 68 if (showFlow)
Ksenia 0:3f440c2facb0 69 (*_TFT).DL(SET_FLOW_COLOR);
Ksenia 0:3f440c2facb0 70 else
Ksenia 0:3f440c2facb0 71 (*_TFT).DL(SET_FLOW_LOW_COLOR);
Ksenia 0:3f440c2facb0 72 (*_TFT).DL(BEGIN(RECTS));
Ksenia 0:3f440c2facb0 73 (*_TFT).DL(VERTEX2II(X_LEFT_OFFSET + BUTTON_1_WIDTH + X_LEFT_OFFSET, Y_UPPER_OFFSET, 0, 0));
Ksenia 0:3f440c2facb0 74 (*_TFT).DL(VERTEX2II(X_LEFT_OFFSET + BUTTON_1_WIDTH + X_LEFT_OFFSET + BUTTON_2_WIDTH, Y_UPPER_OFFSET + BUTTON_HEIGHT, 0, 0));
Ksenia 0:3f440c2facb0 75 (*_TFT).DL(END());
Ksenia 0:3f440c2facb0 76 if (showFlow) {
Ksenia 0:3f440c2facb0 77 (*_TFT).DL(SET_FLOW_LOW_COLOR);
Ksenia 0:3f440c2facb0 78 (*_TFT).DL(BEGIN(LINES));
Ksenia 0:3f440c2facb0 79 (*_TFT).DL(VERTEX2II(X_LEFT_OFFSET + BUTTON_1_WIDTH + X_LEFT_OFFSET, Y_UPPER_OFFSET + BUTTON_HEIGHT, 0, 0));
Ksenia 0:3f440c2facb0 80 (*_TFT).DL(VERTEX2II(X_LEFT_OFFSET + BUTTON_1_WIDTH + X_LEFT_OFFSET + BUTTON_2_WIDTH, Y_UPPER_OFFSET + BUTTON_HEIGHT, 0, 0));
Ksenia 0:3f440c2facb0 81 (*_TFT).DL(END());
Ksenia 0:3f440c2facb0 82 (*_TFT).DL(BEGIN(LINES));
Ksenia 0:3f440c2facb0 83 (*_TFT).DL(VERTEX2II(X_LEFT_OFFSET + BUTTON_1_WIDTH + X_LEFT_OFFSET, Y_UPPER_OFFSET, 0, 0));
Ksenia 0:3f440c2facb0 84 (*_TFT).DL(VERTEX2II(X_LEFT_OFFSET + BUTTON_1_WIDTH + X_LEFT_OFFSET, Y_UPPER_OFFSET + BUTTON_HEIGHT, 0, 0));
Ksenia 0:3f440c2facb0 85 (*_TFT).DL(END());
Ksenia 0:3f440c2facb0 86 (*_TFT).DL(SET_WHITE_COLOR);
Ksenia 0:3f440c2facb0 87 } else {
Ksenia 0:3f440c2facb0 88 (*_TFT).DL(COLOR_RGB(100, 100, 100));
Ksenia 0:3f440c2facb0 89 }
Ksenia 0:3f440c2facb0 90 CreateStringRussian("Скорость потока");
Ksenia 0:3f440c2facb0 91 (*_TFT).Text(X_LEFT_OFFSET + BUTTON_1_WIDTH + X_LEFT_OFFSET + 5, Y_UPPER_OFFSET + 5, 4, 0, russianStr);
Ksenia 0:3f440c2facb0 92
Ksenia 0:3f440c2facb0 93
Ksenia 0:3f440c2facb0 94 if (showTemperature)
Ksenia 0:3f440c2facb0 95 (*_TFT).DL(SET_TEMPERATURE_COLOR);
Ksenia 0:3f440c2facb0 96 else
Ksenia 0:3f440c2facb0 97 (*_TFT).DL(SET_TEMPERATURE_LOW_COLOR);
Ksenia 0:3f440c2facb0 98 (*_TFT).DL(BEGIN(RECTS));
Ksenia 0:3f440c2facb0 99 (*_TFT).DL(VERTEX2II(X_LEFT_OFFSET + BUTTON_1_WIDTH + X_LEFT_OFFSET + BUTTON_2_WIDTH + X_LEFT_OFFSET, Y_UPPER_OFFSET, 0, 0));
Ksenia 0:3f440c2facb0 100 (*_TFT).DL(VERTEX2II(X_LEFT_OFFSET + BUTTON_1_WIDTH + X_LEFT_OFFSET + BUTTON_2_WIDTH + X_LEFT_OFFSET + BUTTON_3_WIDTH, Y_UPPER_OFFSET + BUTTON_HEIGHT, 0, 0));
Ksenia 0:3f440c2facb0 101 (*_TFT).DL(END());
Ksenia 0:3f440c2facb0 102 if (showTemperature) {
Ksenia 0:3f440c2facb0 103 (*_TFT).DL(SET_TEMPERATURE_LOW_COLOR);
Ksenia 0:3f440c2facb0 104 (*_TFT).DL(BEGIN(LINES));
Ksenia 0:3f440c2facb0 105 (*_TFT).DL(VERTEX2II(X_LEFT_OFFSET + BUTTON_1_WIDTH + X_LEFT_OFFSET + BUTTON_2_WIDTH + X_LEFT_OFFSET, Y_UPPER_OFFSET + BUTTON_HEIGHT, 0, 0));
Ksenia 0:3f440c2facb0 106 (*_TFT).DL(VERTEX2II(X_LEFT_OFFSET + BUTTON_1_WIDTH + X_LEFT_OFFSET + BUTTON_2_WIDTH + X_LEFT_OFFSET + BUTTON_3_WIDTH, Y_UPPER_OFFSET + BUTTON_HEIGHT, 0, 0));
Ksenia 0:3f440c2facb0 107 (*_TFT).DL(END());
Ksenia 0:3f440c2facb0 108 (*_TFT).DL(BEGIN(LINES));
Ksenia 0:3f440c2facb0 109 (*_TFT).DL(VERTEX2II(X_LEFT_OFFSET + BUTTON_1_WIDTH + X_LEFT_OFFSET + BUTTON_2_WIDTH + X_LEFT_OFFSET, Y_UPPER_OFFSET, 0, 0));
Ksenia 0:3f440c2facb0 110 (*_TFT).DL(VERTEX2II(X_LEFT_OFFSET + BUTTON_1_WIDTH + X_LEFT_OFFSET + BUTTON_2_WIDTH + X_LEFT_OFFSET, Y_UPPER_OFFSET + BUTTON_HEIGHT, 0, 0));
Ksenia 0:3f440c2facb0 111 (*_TFT).DL(END());
Ksenia 0:3f440c2facb0 112 (*_TFT).DL(SET_WHITE_COLOR);
Ksenia 0:3f440c2facb0 113 } else {
Ksenia 0:3f440c2facb0 114 (*_TFT).DL(COLOR_RGB(100, 100, 100));
Ksenia 0:3f440c2facb0 115 }
Ksenia 0:3f440c2facb0 116 CreateStringRussian("Температура");
Ksenia 0:3f440c2facb0 117 (*_TFT).Text(X_LEFT_OFFSET + BUTTON_1_WIDTH + X_LEFT_OFFSET + BUTTON_2_WIDTH + X_LEFT_OFFSET + 5, Y_UPPER_OFFSET + 5, 4, 0, russianStr);
Ksenia 0:3f440c2facb0 118
Ksenia 0:3f440c2facb0 119
Ksenia 0:3f440c2facb0 120 /****************************************************************************************************/
Ksenia 0:3f440c2facb0 121 if (showTemperature) {
Ksenia 0:3f440c2facb0 122 (*_TFT).DL(BEGIN(EDGE_STRIP_B));
Ksenia 0:3f440c2facb0 123 for (int i = 0; i <= POINTS_NUMBER; i++) {
Ksenia 0:3f440c2facb0 124 if (i <= current_X) {
Ksenia 0:3f440c2facb0 125 (*_TFT).DL(COLOR_RGB(210,255,2016));
Ksenia 0:3f440c2facb0 126 (*_TFT).DL(VERTEX2II((i * X_AXIS_MULTIPLIER + X_LEFT_OFFSET), my_DispHeight - temperature_Y[i], 0, 0));
Ksenia 0:3f440c2facb0 127 }
Ksenia 0:3f440c2facb0 128 }
Ksenia 0:3f440c2facb0 129 }
Ksenia 0:3f440c2facb0 130 if (showHumidity) {
Ksenia 0:3f440c2facb0 131 (*_TFT).DL(BEGIN(EDGE_STRIP_B));
Ksenia 0:3f440c2facb0 132 for (int i = 0; i <= POINTS_NUMBER; i++) {
Ksenia 0:3f440c2facb0 133 if (i <= current_X) {
Ksenia 0:3f440c2facb0 134 (*_TFT).DL(COLOR_RGB(184,213,255));
Ksenia 0:3f440c2facb0 135 (*_TFT).DL(VERTEX2II((i * X_AXIS_MULTIPLIER + X_LEFT_OFFSET), my_DispHeight - humidity_Y[i], 0, 0));
Ksenia 0:3f440c2facb0 136 }
Ksenia 0:3f440c2facb0 137 }
Ksenia 0:3f440c2facb0 138 }
Ksenia 0:3f440c2facb0 139 if (showFlow) {
Ksenia 0:3f440c2facb0 140 (*_TFT).DL(BEGIN(EDGE_STRIP_B));
Ksenia 0:3f440c2facb0 141 for (int i = 0; i <= POINTS_NUMBER; i++) {
Ksenia 0:3f440c2facb0 142 if (i <= current_X) {
Ksenia 0:3f440c2facb0 143 (*_TFT).DL(COLOR_RGB(255,198,255));
Ksenia 0:3f440c2facb0 144 (*_TFT).DL(VERTEX2II((i * X_AXIS_MULTIPLIER + X_LEFT_OFFSET), my_DispHeight - flow_Y[i], 0, 0));
Ksenia 0:3f440c2facb0 145 }
Ksenia 0:3f440c2facb0 146 }
Ksenia 0:3f440c2facb0 147 }
Ksenia 0:3f440c2facb0 148
Ksenia 0:3f440c2facb0 149 /****************************************************************************************************/
Ksenia 0:3f440c2facb0 150 if (numberOfGraphs != 1) {
Ksenia 0:3f440c2facb0 151 HorisontalGrid();
Ksenia 0:3f440c2facb0 152 } else {
Ksenia 0:3f440c2facb0 153 if (showHumidity)
Ksenia 0:3f440c2facb0 154 HorisontalGrid_Humidity();
Ksenia 0:3f440c2facb0 155 if (showFlow)
Ksenia 0:3f440c2facb0 156 HorisontalGrid_Flow();
Ksenia 0:3f440c2facb0 157 if (showTemperature)
Ksenia 0:3f440c2facb0 158 HorisontalGrid_Temperature();
Ksenia 0:3f440c2facb0 159 }
Ksenia 0:3f440c2facb0 160
Ksenia 0:3f440c2facb0 161 VerticalGrid();
Ksenia 0:3f440c2facb0 162
Ksenia 0:3f440c2facb0 163 /****************************************************************************************************/
Ksenia 0:3f440c2facb0 164 for (int i = 0; i <= POINTS_NUMBER; i++) {
Ksenia 0:3f440c2facb0 165 (*_TFT).DL(BEGIN(POINTS));
Ksenia 0:3f440c2facb0 166 (*_TFT).DL(POINT_SIZE(40));
Ksenia 0:3f440c2facb0 167 if (i <= current_X || i >= current_X + 13) {
Ksenia 0:3f440c2facb0 168 (*_TFT).DL(SET_HUMIDITY_COLOR);
Ksenia 0:3f440c2facb0 169 if (showHumidity)
Ksenia 0:3f440c2facb0 170 (*_TFT).DL(VERTEX2II((i * X_AXIS_MULTIPLIER + X_LEFT_OFFSET), my_DispHeight - humidity_Y[i], 0, 0));
Ksenia 0:3f440c2facb0 171 (*_TFT).DL(SET_FLOW_COLOR);
Ksenia 0:3f440c2facb0 172 if (showFlow)
Ksenia 0:3f440c2facb0 173 (*_TFT).DL(VERTEX2II((i * X_AXIS_MULTIPLIER + X_LEFT_OFFSET), my_DispHeight - flow_Y[i], 0, 0));
Ksenia 0:3f440c2facb0 174 (*_TFT).DL(SET_TEMPERATURE_COLOR);
Ksenia 0:3f440c2facb0 175 if (showTemperature)
Ksenia 0:3f440c2facb0 176 (*_TFT).DL(VERTEX2II((i * X_AXIS_MULTIPLIER + X_LEFT_OFFSET), my_DispHeight - temperature_Y[i], 0, 0));
Ksenia 0:3f440c2facb0 177 }
Ksenia 0:3f440c2facb0 178 (*_TFT).DL(END());
Ksenia 0:3f440c2facb0 179 }
Ksenia 0:3f440c2facb0 180
Ksenia 0:3f440c2facb0 181 /****************************************************************************************************/
Ksenia 0:3f440c2facb0 182 (*_TFT).DL(SET_HUMIDITY_COLOR);
Ksenia 0:3f440c2facb0 183 if (showHumidity)
Ksenia 0:3f440c2facb0 184 (*_TFT).Text((current_X * X_AXIS_MULTIPLIER + X_LEFT_OFFSET), my_DispHeight - humidity_Y[current_X] - 25, 4, 0, humidityStr);
Ksenia 0:3f440c2facb0 185 (*_TFT).DL(SET_FLOW_COLOR);
Ksenia 0:3f440c2facb0 186 if (showFlow)
Ksenia 0:3f440c2facb0 187 (*_TFT).Text((current_X * X_AXIS_MULTIPLIER + X_LEFT_OFFSET), my_DispHeight - flow_Y[current_X] - 25, 4, 0, flowStr);
Ksenia 0:3f440c2facb0 188 (*_TFT).DL(SET_TEMPERATURE_COLOR);
Ksenia 0:3f440c2facb0 189 if (showTemperature)
Ksenia 0:3f440c2facb0 190 (*_TFT).Text((current_X * X_AXIS_MULTIPLIER + X_LEFT_OFFSET), my_DispHeight - temperature_Y[current_X] - 25, 4, 0, temperatureStr);
Ksenia 0:3f440c2facb0 191
Ksenia 0:3f440c2facb0 192 /****************************************************************************************************/
Ksenia 0:3f440c2facb0 193 // (*_TFT).Number(my_DispWidth - 25, my_DispHeight - 150, 27, 0, sec / 60);
Ksenia 0:3f440c2facb0 194 // (*_TFT).Number(my_DispWidth - 25, my_DispHeight - 135, 27, 0, sec % 60);
Ksenia 0:3f440c2facb0 195
Ksenia 0:3f440c2facb0 196 /****************************************************************************************************/
Ksenia 0:3f440c2facb0 197 (*_TFT).DL(SCISSOR_XY(0, my_DispHeight - Y_BOTTOM_OFFSET + 3));
Ksenia 0:3f440c2facb0 198 (*_TFT).DL(SCISSOR_SIZE(X_LEFT_OFFSET + (POINTS_NUMBER * X_AXIS_MULTIPLIER + 5), Y_BOTTOM_OFFSET - 3));
Ksenia 0:3f440c2facb0 199 (*_TFT).Gradient(0, my_DispHeight, BACKGROUND_COLOR, X_LEFT_OFFSET + (POINTS_NUMBER * X_AXIS_MULTIPLIER + 5), my_DispHeight - Y_BOTTOM_OFFSET + 3, BACKGROUND_COLOR);
Ksenia 0:3f440c2facb0 200
Ksenia 0:3f440c2facb0 201
Ksenia 0:3f440c2facb0 202 // finish FT801 display list
Ksenia 0:3f440c2facb0 203 FinishDL();
Ksenia 0:3f440c2facb0 204 }