test public
Dependencies: HttpServer_snapshot_mbed-os
mbed-gr-libs/DisplayApp/DisplayApp.cpp@0:e9fd5575b10e, 2019-10-18 (annotated)
- Committer:
- anhtran
- Date:
- Fri Oct 18 03:09:43 2019 +0000
- Revision:
- 0:e9fd5575b10e
abc
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
anhtran | 0:e9fd5575b10e | 1 | /* Copyright (c) 2016 dkato |
anhtran | 0:e9fd5575b10e | 2 | * SPDX-License-Identifier: Apache-2.0 |
anhtran | 0:e9fd5575b10e | 3 | * |
anhtran | 0:e9fd5575b10e | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
anhtran | 0:e9fd5575b10e | 5 | * you may not use this file except in compliance with the License. |
anhtran | 0:e9fd5575b10e | 6 | * You may obtain a copy of the License at |
anhtran | 0:e9fd5575b10e | 7 | * |
anhtran | 0:e9fd5575b10e | 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
anhtran | 0:e9fd5575b10e | 9 | * |
anhtran | 0:e9fd5575b10e | 10 | * Unless required by applicable law or agreed to in writing, software |
anhtran | 0:e9fd5575b10e | 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
anhtran | 0:e9fd5575b10e | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
anhtran | 0:e9fd5575b10e | 13 | * See the License for the specific language governing permissions and |
anhtran | 0:e9fd5575b10e | 14 | * limitations under the License. |
anhtran | 0:e9fd5575b10e | 15 | */ |
anhtran | 0:e9fd5575b10e | 16 | #include "mbed.h" |
anhtran | 0:e9fd5575b10e | 17 | #include "DisplayApp.h" |
anhtran | 0:e9fd5575b10e | 18 | |
anhtran | 0:e9fd5575b10e | 19 | void DisplayApp::display_app_process() { |
anhtran | 0:e9fd5575b10e | 20 | int data; |
anhtran | 0:e9fd5575b10e | 21 | int pos_x_wk; |
anhtran | 0:e9fd5575b10e | 22 | int pos_wk; |
anhtran | 0:e9fd5575b10e | 23 | |
anhtran | 0:e9fd5575b10e | 24 | PcApp.connect(); |
anhtran | 0:e9fd5575b10e | 25 | |
anhtran | 0:e9fd5575b10e | 26 | while (!PcApp.configured()) { |
anhtran | 0:e9fd5575b10e | 27 | ThisThread::sleep_for(100); |
anhtran | 0:e9fd5575b10e | 28 | } |
anhtran | 0:e9fd5575b10e | 29 | |
anhtran | 0:e9fd5575b10e | 30 | while (1) { |
anhtran | 0:e9fd5575b10e | 31 | if (PcApp.readable()) { |
anhtran | 0:e9fd5575b10e | 32 | data = PcApp.getc(); |
anhtran | 0:e9fd5575b10e | 33 | if (data == '{') { |
anhtran | 0:e9fd5575b10e | 34 | pos_seq = POS_SEQ_START; |
anhtran | 0:e9fd5575b10e | 35 | } else if (data == 'X') { |
anhtran | 0:e9fd5575b10e | 36 | if (pos_seq == POS_SEQ_START) { |
anhtran | 0:e9fd5575b10e | 37 | pos_seq = POS_SEQ_X; |
anhtran | 0:e9fd5575b10e | 38 | } else { |
anhtran | 0:e9fd5575b10e | 39 | pos_seq = POS_SEQ_INIT; |
anhtran | 0:e9fd5575b10e | 40 | } |
anhtran | 0:e9fd5575b10e | 41 | } else if (data == 'Y') { |
anhtran | 0:e9fd5575b10e | 42 | if (pos_seq == POS_SEQ_C) { |
anhtran | 0:e9fd5575b10e | 43 | pos_seq = POS_SEQ_Y; |
anhtran | 0:e9fd5575b10e | 44 | } else { |
anhtran | 0:e9fd5575b10e | 45 | pos_seq = POS_SEQ_INIT; |
anhtran | 0:e9fd5575b10e | 46 | } |
anhtran | 0:e9fd5575b10e | 47 | } else if (data == '=') { |
anhtran | 0:e9fd5575b10e | 48 | if (pos_seq == POS_SEQ_X) { |
anhtran | 0:e9fd5575b10e | 49 | pos_seq = POS_SEQ_X_POS; |
anhtran | 0:e9fd5575b10e | 50 | pos_wk = 0; |
anhtran | 0:e9fd5575b10e | 51 | } else if (pos_seq == POS_SEQ_Y) { |
anhtran | 0:e9fd5575b10e | 52 | pos_seq = POS_SEQ_Y_POS; |
anhtran | 0:e9fd5575b10e | 53 | pos_wk = 0; |
anhtran | 0:e9fd5575b10e | 54 | } else { |
anhtran | 0:e9fd5575b10e | 55 | pos_seq = POS_SEQ_INIT; |
anhtran | 0:e9fd5575b10e | 56 | } |
anhtran | 0:e9fd5575b10e | 57 | } else if (data == '-') { |
anhtran | 0:e9fd5575b10e | 58 | if (pos_seq == POS_SEQ_X_POS) { |
anhtran | 0:e9fd5575b10e | 59 | pos_seq = POS_SEQ_X_M; |
anhtran | 0:e9fd5575b10e | 60 | } else if (pos_seq == POS_SEQ_Y_POS) { |
anhtran | 0:e9fd5575b10e | 61 | pos_seq = POS_SEQ_Y_M; |
anhtran | 0:e9fd5575b10e | 62 | } else { |
anhtran | 0:e9fd5575b10e | 63 | pos_seq = POS_SEQ_INIT; |
anhtran | 0:e9fd5575b10e | 64 | } |
anhtran | 0:e9fd5575b10e | 65 | } else if ((data >= '0') && (data <= '9')) { |
anhtran | 0:e9fd5575b10e | 66 | if ((pos_seq == POS_SEQ_X_POS) || (pos_seq == POS_SEQ_Y_POS)) { |
anhtran | 0:e9fd5575b10e | 67 | pos_wk = (pos_wk * 10) + (data - '0'); |
anhtran | 0:e9fd5575b10e | 68 | } else if ((pos_seq == POS_SEQ_X_M) && (data == '1')) { |
anhtran | 0:e9fd5575b10e | 69 | pos_wk = -1; |
anhtran | 0:e9fd5575b10e | 70 | } else if ((pos_seq == POS_SEQ_Y_M) && (data == '1')) { |
anhtran | 0:e9fd5575b10e | 71 | pos_wk = -1; |
anhtran | 0:e9fd5575b10e | 72 | } else { |
anhtran | 0:e9fd5575b10e | 73 | pos_seq = POS_SEQ_INIT; |
anhtran | 0:e9fd5575b10e | 74 | } |
anhtran | 0:e9fd5575b10e | 75 | } else if (data == ',') { |
anhtran | 0:e9fd5575b10e | 76 | if ((pos_seq == POS_SEQ_X_POS) || (pos_seq == POS_SEQ_X_M)) { |
anhtran | 0:e9fd5575b10e | 77 | pos_x_wk = pos_wk; |
anhtran | 0:e9fd5575b10e | 78 | pos_seq = POS_SEQ_C; |
anhtran | 0:e9fd5575b10e | 79 | } else { |
anhtran | 0:e9fd5575b10e | 80 | pos_seq = POS_SEQ_INIT; |
anhtran | 0:e9fd5575b10e | 81 | } |
anhtran | 0:e9fd5575b10e | 82 | } else if (data == '}') { |
anhtran | 0:e9fd5575b10e | 83 | if ((pos_seq == POS_SEQ_Y_POS) || (pos_seq == POS_SEQ_Y_M)) { |
anhtran | 0:e9fd5575b10e | 84 | pos_seq = POS_SEQ_END; |
anhtran | 0:e9fd5575b10e | 85 | if ((pos_x != pos_x_wk) || (pos_y != pos_wk)) { |
anhtran | 0:e9fd5575b10e | 86 | pos_x = pos_x_wk; |
anhtran | 0:e9fd5575b10e | 87 | pos_y = pos_wk; |
anhtran | 0:e9fd5575b10e | 88 | if (event) { |
anhtran | 0:e9fd5575b10e | 89 | event.call(); |
anhtran | 0:e9fd5575b10e | 90 | } |
anhtran | 0:e9fd5575b10e | 91 | } |
anhtran | 0:e9fd5575b10e | 92 | } else { |
anhtran | 0:e9fd5575b10e | 93 | pos_seq = POS_SEQ_INIT; |
anhtran | 0:e9fd5575b10e | 94 | } |
anhtran | 0:e9fd5575b10e | 95 | } else { |
anhtran | 0:e9fd5575b10e | 96 | pos_seq = POS_SEQ_INIT; |
anhtran | 0:e9fd5575b10e | 97 | } |
anhtran | 0:e9fd5575b10e | 98 | } else { |
anhtran | 0:e9fd5575b10e | 99 | ThisThread::sleep_for(10); |
anhtran | 0:e9fd5575b10e | 100 | } |
anhtran | 0:e9fd5575b10e | 101 | } |
anhtran | 0:e9fd5575b10e | 102 | } |
anhtran | 0:e9fd5575b10e | 103 | |
anhtran | 0:e9fd5575b10e | 104 | DisplayApp::DisplayApp(osPriority tsk_pri, uint32_t stack_size) : |
anhtran | 0:e9fd5575b10e | 105 | PcApp(false), displayThread(tsk_pri, stack_size) { |
anhtran | 0:e9fd5575b10e | 106 | displayThread.start(callback(this, &DisplayApp::display_app_process)); |
anhtran | 0:e9fd5575b10e | 107 | } |
anhtran | 0:e9fd5575b10e | 108 | |
anhtran | 0:e9fd5575b10e | 109 | void DisplayApp::SendHeader(uint32_t size) { |
anhtran | 0:e9fd5575b10e | 110 | uint8_t headder_data[12] = {0xFF,0xFF,0xAA,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; |
anhtran | 0:e9fd5575b10e | 111 | |
anhtran | 0:e9fd5575b10e | 112 | headder_data[8] = (uint8_t)((uint32_t)size >> 0); |
anhtran | 0:e9fd5575b10e | 113 | headder_data[9] = (uint8_t)((uint32_t)size >> 8); |
anhtran | 0:e9fd5575b10e | 114 | headder_data[10] = (uint8_t)((uint32_t)size >> 16); |
anhtran | 0:e9fd5575b10e | 115 | headder_data[11] = (uint8_t)((uint32_t)size >> 24); |
anhtran | 0:e9fd5575b10e | 116 | PcApp.send((uint8_t *)headder_data, sizeof(headder_data)); |
anhtran | 0:e9fd5575b10e | 117 | } |
anhtran | 0:e9fd5575b10e | 118 | |
anhtran | 0:e9fd5575b10e | 119 | void DisplayApp::SendData(uint8_t * buf, uint32_t size) { |
anhtran | 0:e9fd5575b10e | 120 | PcApp.send(buf, size); |
anhtran | 0:e9fd5575b10e | 121 | } |
anhtran | 0:e9fd5575b10e | 122 | |
anhtran | 0:e9fd5575b10e | 123 | int DisplayApp::SendRgb888(uint8_t * buf, uint32_t pic_width, uint32_t pic_height) { |
anhtran | 0:e9fd5575b10e | 124 | uint32_t offset_size = 54; |
anhtran | 0:e9fd5575b10e | 125 | uint32_t buf_stride = (((pic_width * 4u) + 31u) & ~31u); |
anhtran | 0:e9fd5575b10e | 126 | uint32_t pic_size = buf_stride * pic_height; |
anhtran | 0:e9fd5575b10e | 127 | uint32_t total_size = pic_size + offset_size; |
anhtran | 0:e9fd5575b10e | 128 | uint8_t wk_bitmap_buf[54]; |
anhtran | 0:e9fd5575b10e | 129 | int wk_idx = 0; |
anhtran | 0:e9fd5575b10e | 130 | |
anhtran | 0:e9fd5575b10e | 131 | if (!PcApp.configured()) { |
anhtran | 0:e9fd5575b10e | 132 | return 0; |
anhtran | 0:e9fd5575b10e | 133 | } |
anhtran | 0:e9fd5575b10e | 134 | SendHeader(total_size); |
anhtran | 0:e9fd5575b10e | 135 | |
anhtran | 0:e9fd5575b10e | 136 | /* BITMAPFILEHEADER */ |
anhtran | 0:e9fd5575b10e | 137 | wk_bitmap_buf[wk_idx++] = 'B'; |
anhtran | 0:e9fd5575b10e | 138 | wk_bitmap_buf[wk_idx++] = 'M'; |
anhtran | 0:e9fd5575b10e | 139 | wk_bitmap_buf[wk_idx++] = (uint8_t)(total_size >> 0); /* bfSize */ |
anhtran | 0:e9fd5575b10e | 140 | wk_bitmap_buf[wk_idx++] = (uint8_t)(total_size >> 8); /* bfSize */ |
anhtran | 0:e9fd5575b10e | 141 | wk_bitmap_buf[wk_idx++] = (uint8_t)(total_size >> 16); /* bfSize */ |
anhtran | 0:e9fd5575b10e | 142 | wk_bitmap_buf[wk_idx++] = (uint8_t)(total_size >> 24); /* bfSize */ |
anhtran | 0:e9fd5575b10e | 143 | wk_bitmap_buf[wk_idx++] = 0; /* bfReserved1 */ |
anhtran | 0:e9fd5575b10e | 144 | wk_bitmap_buf[wk_idx++] = 0; /* bfReserved1 */ |
anhtran | 0:e9fd5575b10e | 145 | wk_bitmap_buf[wk_idx++] = 0; /* bfReserved2 */ |
anhtran | 0:e9fd5575b10e | 146 | wk_bitmap_buf[wk_idx++] = 0; /* bfReserved2 */ |
anhtran | 0:e9fd5575b10e | 147 | wk_bitmap_buf[wk_idx++] = (uint8_t)(offset_size >> 0); /* bfOffBits */ |
anhtran | 0:e9fd5575b10e | 148 | wk_bitmap_buf[wk_idx++] = (uint8_t)(offset_size >> 8); /* bfOffBits */ |
anhtran | 0:e9fd5575b10e | 149 | wk_bitmap_buf[wk_idx++] = (uint8_t)(offset_size >> 16); /* bfOffBits */ |
anhtran | 0:e9fd5575b10e | 150 | wk_bitmap_buf[wk_idx++] = (uint8_t)(offset_size >> 24); /* bfOffBits */ |
anhtran | 0:e9fd5575b10e | 151 | |
anhtran | 0:e9fd5575b10e | 152 | /* BITMAPINFOHEADER */ |
anhtran | 0:e9fd5575b10e | 153 | wk_bitmap_buf[wk_idx++] = 40; /* biSize */ |
anhtran | 0:e9fd5575b10e | 154 | wk_bitmap_buf[wk_idx++] = 0; /* biSize */ |
anhtran | 0:e9fd5575b10e | 155 | wk_bitmap_buf[wk_idx++] = 0; /* biSize */ |
anhtran | 0:e9fd5575b10e | 156 | wk_bitmap_buf[wk_idx++] = 0; /* biSize */ |
anhtran | 0:e9fd5575b10e | 157 | wk_bitmap_buf[wk_idx++] = (uint8_t)(pic_width >> 0); /* biWidth */ |
anhtran | 0:e9fd5575b10e | 158 | wk_bitmap_buf[wk_idx++] = (uint8_t)(pic_width >> 8); /* biWidth */ |
anhtran | 0:e9fd5575b10e | 159 | wk_bitmap_buf[wk_idx++] = (uint8_t)(pic_width >> 16); /* biWidth */ |
anhtran | 0:e9fd5575b10e | 160 | wk_bitmap_buf[wk_idx++] = (uint8_t)(pic_width >> 24); /* biWidth */ |
anhtran | 0:e9fd5575b10e | 161 | wk_bitmap_buf[wk_idx++] = (uint8_t)((-(long)pic_height) >> 0); /* biHeight */ |
anhtran | 0:e9fd5575b10e | 162 | wk_bitmap_buf[wk_idx++] = (uint8_t)((-(long)pic_height) >> 8); /* biHeight */ |
anhtran | 0:e9fd5575b10e | 163 | wk_bitmap_buf[wk_idx++] = (uint8_t)((-(long)pic_height) >> 16); /* biHeight */ |
anhtran | 0:e9fd5575b10e | 164 | wk_bitmap_buf[wk_idx++] = (uint8_t)((-(long)pic_height) >> 24); /* biHeight */ |
anhtran | 0:e9fd5575b10e | 165 | wk_bitmap_buf[wk_idx++] = 1; /* biPlanes */ |
anhtran | 0:e9fd5575b10e | 166 | wk_bitmap_buf[wk_idx++] = 0; /* biPlanes */ |
anhtran | 0:e9fd5575b10e | 167 | wk_bitmap_buf[wk_idx++] = 32; /* biBitCount */ |
anhtran | 0:e9fd5575b10e | 168 | wk_bitmap_buf[wk_idx++] = 0; /* biBitCount */ |
anhtran | 0:e9fd5575b10e | 169 | |
anhtran | 0:e9fd5575b10e | 170 | wk_bitmap_buf[wk_idx++] = 0; /* biCopmression */ |
anhtran | 0:e9fd5575b10e | 171 | wk_bitmap_buf[wk_idx++] = 0; /* biCopmression */ |
anhtran | 0:e9fd5575b10e | 172 | wk_bitmap_buf[wk_idx++] = 0; /* biCopmression */ |
anhtran | 0:e9fd5575b10e | 173 | wk_bitmap_buf[wk_idx++] = 0; /* biCopmression */ |
anhtran | 0:e9fd5575b10e | 174 | wk_bitmap_buf[wk_idx++] = (uint8_t)(pic_size >> 0); /* biSizeImage */ |
anhtran | 0:e9fd5575b10e | 175 | wk_bitmap_buf[wk_idx++] = (uint8_t)(pic_size >> 8); /* biSizeImage */ |
anhtran | 0:e9fd5575b10e | 176 | wk_bitmap_buf[wk_idx++] = (uint8_t)(pic_size >> 16); /* biSizeImage */ |
anhtran | 0:e9fd5575b10e | 177 | wk_bitmap_buf[wk_idx++] = (uint8_t)(pic_size >> 24); /* biSizeImage */ |
anhtran | 0:e9fd5575b10e | 178 | wk_bitmap_buf[wk_idx++] = 0; /* biXPixPerMeter */ |
anhtran | 0:e9fd5575b10e | 179 | wk_bitmap_buf[wk_idx++] = 0; /* biXPixPerMeter */ |
anhtran | 0:e9fd5575b10e | 180 | wk_bitmap_buf[wk_idx++] = 0; /* biXPixPerMeter */ |
anhtran | 0:e9fd5575b10e | 181 | wk_bitmap_buf[wk_idx++] = 0; /* biXPixPerMeter */ |
anhtran | 0:e9fd5575b10e | 182 | wk_bitmap_buf[wk_idx++] = 0; /* biYPixPerMeter */ |
anhtran | 0:e9fd5575b10e | 183 | wk_bitmap_buf[wk_idx++] = 0; /* biYPixPerMeter */ |
anhtran | 0:e9fd5575b10e | 184 | wk_bitmap_buf[wk_idx++] = 0; /* biYPixPerMeter */ |
anhtran | 0:e9fd5575b10e | 185 | wk_bitmap_buf[wk_idx++] = 0; /* biYPixPerMeter */ |
anhtran | 0:e9fd5575b10e | 186 | |
anhtran | 0:e9fd5575b10e | 187 | wk_bitmap_buf[wk_idx++] = 0; /* biClrUsed */ |
anhtran | 0:e9fd5575b10e | 188 | wk_bitmap_buf[wk_idx++] = 0; /* biClrUsed */ |
anhtran | 0:e9fd5575b10e | 189 | wk_bitmap_buf[wk_idx++] = 0; /* biClrUsed */ |
anhtran | 0:e9fd5575b10e | 190 | wk_bitmap_buf[wk_idx++] = 0; /* biClrUsed */ |
anhtran | 0:e9fd5575b10e | 191 | wk_bitmap_buf[wk_idx++] = 0; /* biCirImportant */ |
anhtran | 0:e9fd5575b10e | 192 | wk_bitmap_buf[wk_idx++] = 0; /* biCirImportant */ |
anhtran | 0:e9fd5575b10e | 193 | wk_bitmap_buf[wk_idx++] = 0; /* biCirImportant */ |
anhtran | 0:e9fd5575b10e | 194 | wk_bitmap_buf[wk_idx++] = 0; /* biCirImportant */ |
anhtran | 0:e9fd5575b10e | 195 | PcApp.send(wk_bitmap_buf, wk_idx); |
anhtran | 0:e9fd5575b10e | 196 | |
anhtran | 0:e9fd5575b10e | 197 | SendData(buf, pic_size); |
anhtran | 0:e9fd5575b10e | 198 | wk_idx += pic_size; |
anhtran | 0:e9fd5575b10e | 199 | |
anhtran | 0:e9fd5575b10e | 200 | return wk_idx; |
anhtran | 0:e9fd5575b10e | 201 | }; |
anhtran | 0:e9fd5575b10e | 202 | |
anhtran | 0:e9fd5575b10e | 203 | void DisplayApp::SetCallback(Callback<void()> func) { |
anhtran | 0:e9fd5575b10e | 204 | event = func; |
anhtran | 0:e9fd5575b10e | 205 | } |
anhtran | 0:e9fd5575b10e | 206 | |
anhtran | 0:e9fd5575b10e | 207 | int DisplayApp::SendJpeg(uint8_t * buf, uint32_t size) { |
anhtran | 0:e9fd5575b10e | 208 | if (!PcApp.configured()) { |
anhtran | 0:e9fd5575b10e | 209 | return 0; |
anhtran | 0:e9fd5575b10e | 210 | } |
anhtran | 0:e9fd5575b10e | 211 | SendHeader(size); |
anhtran | 0:e9fd5575b10e | 212 | SendData(buf, size); |
anhtran | 0:e9fd5575b10e | 213 | |
anhtran | 0:e9fd5575b10e | 214 | return size; |
anhtran | 0:e9fd5575b10e | 215 | } |
anhtran | 0:e9fd5575b10e | 216 | |
anhtran | 0:e9fd5575b10e | 217 | int DisplayApp::GetMaxTouchNum(void) { |
anhtran | 0:e9fd5575b10e | 218 | return 1; |
anhtran | 0:e9fd5575b10e | 219 | } |
anhtran | 0:e9fd5575b10e | 220 | |
anhtran | 0:e9fd5575b10e | 221 | int DisplayApp::GetCoordinates(int touch_buff_num, touch_pos_t * p_touch) { |
anhtran | 0:e9fd5575b10e | 222 | touch_pos_t * wk_touch; |
anhtran | 0:e9fd5575b10e | 223 | int count = 0; |
anhtran | 0:e9fd5575b10e | 224 | int x = pos_x; |
anhtran | 0:e9fd5575b10e | 225 | int y = pos_y; |
anhtran | 0:e9fd5575b10e | 226 | |
anhtran | 0:e9fd5575b10e | 227 | if (touch_buff_num > 0) { |
anhtran | 0:e9fd5575b10e | 228 | count = 0; |
anhtran | 0:e9fd5575b10e | 229 | wk_touch = &p_touch[0]; |
anhtran | 0:e9fd5575b10e | 230 | wk_touch->valid = false; |
anhtran | 0:e9fd5575b10e | 231 | wk_touch->x = 0; |
anhtran | 0:e9fd5575b10e | 232 | wk_touch->y = 0; |
anhtran | 0:e9fd5575b10e | 233 | if (x >= 0) { |
anhtran | 0:e9fd5575b10e | 234 | count = 1; |
anhtran | 0:e9fd5575b10e | 235 | wk_touch->valid = true; |
anhtran | 0:e9fd5575b10e | 236 | wk_touch->x = (uint32_t)x; |
anhtran | 0:e9fd5575b10e | 237 | } |
anhtran | 0:e9fd5575b10e | 238 | if (y >= 0) { |
anhtran | 0:e9fd5575b10e | 239 | count = 1; |
anhtran | 0:e9fd5575b10e | 240 | wk_touch->valid = true; |
anhtran | 0:e9fd5575b10e | 241 | wk_touch->y = (uint32_t)y; |
anhtran | 0:e9fd5575b10e | 242 | } |
anhtran | 0:e9fd5575b10e | 243 | } |
anhtran | 0:e9fd5575b10e | 244 | |
anhtran | 0:e9fd5575b10e | 245 | return count; |
anhtran | 0:e9fd5575b10e | 246 | } |