Windshape control / Mbed OS Controle_ventilo_ethernet_v1_2_4

Fork of Controle_ventilo_ethernet_v1_2_4 by Sergio Márquez

Committer:
YuK41
Date:
Fri Jun 16 17:41:25 2017 +0000
Revision:
12:b9ac1a23ac41
Parent:
11:aa1cb8df15dc
Modifications by WindShape ; - Add comments in the code; - Add functionality to get rpm by counting time between rising edges; - Add function to set a different PWM to all fans for debugging purpose

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Brutus 0:5ca563ae05db 1 #include "mbed.h"
Brutus 0:5ca563ae05db 2 #include "EthernetInterface.h"
Brutus 0:5ca563ae05db 3 #include "SocketAddress.h"
Brutus 0:5ca563ae05db 4 #include "UDPSocket.h"
Brutus 11:aa1cb8df15dc 5 #include "lwip/ip.h"
Brutus 11:aa1cb8df15dc 6 #include "lwip/api.h"
Brutus 8:10dcb0846e2f 7 #include <string.h>
Brutus 3:6c54aa6db861 8
YuK41 12:b9ac1a23ac41 9 const char* ECHO_SERVER_ADDRESS = "192.168.1.148"; // addresse du PC home "192.168.1.2" sergio "169.254.61.104" or "129.194.185.33" or "192.168.137.1" liotard "10.136.134.73"
YuK41 12:b9ac1a23ac41 10 const int ECHO_SERVER_PORT = 1036;
Brutus 11:aa1cb8df15dc 11 //const int BROADCAST_PORT = 58083;
Brutus 8:10dcb0846e2f 12
Brutus 8:10dcb0846e2f 13 Timer t;
Brutus 11:aa1cb8df15dc 14 Timer t1;
Brutus 11:aa1cb8df15dc 15 Timer t2;
Brutus 11:aa1cb8df15dc 16 Timer t3;
Brutus 8:10dcb0846e2f 17 DigitalOut PSU_DEAD(D8); // Kill PSU
Brutus 8:10dcb0846e2f 18 DigitalOut PSU_OFF(D9); // Power On PSU
Brutus 8:10dcb0846e2f 19
YuK41 12:b9ac1a23ac41 20 volatile long int count = 0;
Brutus 11:aa1cb8df15dc 21 int tours = 5;
Brutus 8:10dcb0846e2f 22 double rpm[18] = {0.0};
Brutus 8:10dcb0846e2f 23 bool readRpm = 0;
Brutus 8:10dcb0846e2f 24 bool readAllRpm = 0;
Brutus 11:aa1cb8df15dc 25 bool skipRead = 0;
Brutus 3:6c54aa6db861 26
YuK41 12:b9ac1a23ac41 27 // PWM PINS
YuK41 12:b9ac1a23ac41 28 PwmOut rearFans[9]={PB_5, PB_15, PC_8, PB_10, PB_8, PE_10, PE_14, PE_6, PB_1};
YuK41 12:b9ac1a23ac41 29 PwmOut frontFans[9]= {PB_3, PB_9, PC_9, PB_11, PC_6, PD_13, PE_12, PE_5, PE_9};
Brutus 3:6c54aa6db861 30
YuK41 12:b9ac1a23ac41 31 // F00 PINS
YuK41 12:b9ac1a23ac41 32 PinName counterFront[9]={PA_3,PC_3,PF_5,PF_7,PD_7,PE_4,PC_2,PB_2,PE_3};
Brutus 11:aa1cb8df15dc 33 PinName counterRear[9]={PC_0,PF_3,PF_10,PF_9,PE_0,PG_0,PF_8,PD_11,PF_4};
catryus 6:6567daa93121 34
YuK41 12:b9ac1a23ac41 35 // LEDS
Brutus 10:617194438c6b 36 DigitalOut greenLed(LED1);
Brutus 10:617194438c6b 37 DigitalOut bleuLed(LED2);
Brutus 10:617194438c6b 38 DigitalOut redLed(LED3);
Brutus 3:6c54aa6db861 39
YuK41 12:b9ac1a23ac41 40 // ARGUMENTS TO BE RECEIVED BY ETHERNET
YuK41 12:b9ac1a23ac41 41 char arg1_str[2] = {0};
YuK41 12:b9ac1a23ac41 42 char arg2_str[10] = {0};
YuK41 12:b9ac1a23ac41 43 char arg3_str[4] = {0};
YuK41 12:b9ac1a23ac41 44
YuK41 12:b9ac1a23ac41 45 int arg1 = 0;
YuK41 12:b9ac1a23ac41 46 int arg3 = 0;
Brutus 3:6c54aa6db861 47 int fan[10] = {0};
YuK41 12:b9ac1a23ac41 48 int fan_nb = 0;
Brutus 3:6c54aa6db861 49 float pwm_f = 0.0;
YuK41 12:b9ac1a23ac41 50
YuK41 12:b9ac1a23ac41 51 int arg1_len = 0;
YuK41 12:b9ac1a23ac41 52 int arg2_len = 0;
YuK41 12:b9ac1a23ac41 53 int arg3_len = 0;
Brutus 3:6c54aa6db861 54
Brutus 3:6c54aa6db861 55 void splitString(char stringToSplit[]);
Brutus 5:cee119979b55 56 int transString(char stringToTrans[]);
Brutus 8:10dcb0846e2f 57 void countFunction();
YuK41 12:b9ac1a23ac41 58
Brutus 3:6c54aa6db861 59
Brutus 3:6c54aa6db861 60 int main(int argc, char *argv[]) {
Brutus 8:10dcb0846e2f 61
YuK41 12:b9ac1a23ac41 62 // Turn off the PSU (Standby Mode)
Brutus 8:10dcb0846e2f 63 PSU_OFF = true;
Brutus 3:6c54aa6db861 64
YuK41 12:b9ac1a23ac41 65 // Set PWM timer frequency and set PWM to 0.0%
Brutus 8:10dcb0846e2f 66 for(int i = 0; i < 9; i++){
Brutus 8:10dcb0846e2f 67 frontFans[i].period_ms(10);
Brutus 8:10dcb0846e2f 68 rearFans[i].period_ms(10);
Brutus 8:10dcb0846e2f 69 frontFans[i].write(0.0);
Brutus 8:10dcb0846e2f 70 rearFans[i].write(0.0);
Brutus 3:6c54aa6db861 71 }
YuK41 12:b9ac1a23ac41 72
YuK41 12:b9ac1a23ac41 73 // Initialize ethernet interface and UDP socket
YuK41 12:b9ac1a23ac41 74 EthernetInterface eth;
YuK41 12:b9ac1a23ac41 75 UDPSocket sock;
Brutus 3:6c54aa6db861 76 SocketAddress echo_server;
Brutus 3:6c54aa6db861 77
YuK41 12:b9ac1a23ac41 78 // Connect to the ethernet port
Brutus 0:5ca563ae05db 79 eth.connect();
Brutus 3:6c54aa6db861 80 sock.open(&eth);
Brutus 3:6c54aa6db861 81
YuK41 12:b9ac1a23ac41 82 // Get IP address of the board
Brutus 5:cee119979b55 83 const char *local_ip = eth.get_ip_address();
YuK41 12:b9ac1a23ac41 84 printf("\nClient IP Address is %s \n", local_ip);
YuK41 12:b9ac1a23ac41 85
YuK41 12:b9ac1a23ac41 86 // Get the MAC address of the board
Brutus 5:cee119979b55 87 const char *local_mac = eth.get_mac_address();
Brutus 8:10dcb0846e2f 88 printf("Port num is %d \n", ECHO_SERVER_PORT);
Brutus 1:179393386b47 89
Brutus 1:179393386b47 90 echo_server.set_ip_address(ECHO_SERVER_ADDRESS);
Brutus 1:179393386b47 91 echo_server.set_port(ECHO_SERVER_PORT);
Brutus 0:5ca563ae05db 92
Brutus 10:617194438c6b 93 greenLed = 1;
Brutus 3:6c54aa6db861 94 wait(1);
Brutus 10:617194438c6b 95 greenLed = 0;
Brutus 3:6c54aa6db861 96 wait(1);
Brutus 1:179393386b47 97
YuK41 4:fb63da7601aa 98 bool ack = 0;
Brutus 1:179393386b47 99
YuK41 4:fb63da7601aa 100 while(ack == 0){
Brutus 5:cee119979b55 101 char out_buffer[18];
YuK41 4:fb63da7601aa 102 snprintf(out_buffer, sizeof(out_buffer), "%s", eth.get_mac_address());
Brutus 8:10dcb0846e2f 103 //sprintf(out_buffer, "%s", eth.get_mac_address());
YuK41 4:fb63da7601aa 104 sock.sendto(echo_server, out_buffer, sizeof(out_buffer));
YuK41 4:fb63da7601aa 105
Brutus 5:cee119979b55 106 printf("%s\n", out_buffer);
YuK41 4:fb63da7601aa 107
YuK41 4:fb63da7601aa 108 sock.set_timeout(1000);
YuK41 4:fb63da7601aa 109
YuK41 4:fb63da7601aa 110 char in_buffer[256];
YuK41 4:fb63da7601aa 111 int n = sock.recvfrom(&echo_server, in_buffer, sizeof(in_buffer));
YuK41 4:fb63da7601aa 112 in_buffer[n] = '\0';
YuK41 4:fb63da7601aa 113
YuK41 4:fb63da7601aa 114 printf("%s\n", in_buffer);
YuK41 4:fb63da7601aa 115
Brutus 5:cee119979b55 116 int ack_message = transString(in_buffer);
Brutus 5:cee119979b55 117
Brutus 5:cee119979b55 118 if(ack_message == 1){
YuK41 4:fb63da7601aa 119 ack = 1;
YuK41 4:fb63da7601aa 120 sock.set_timeout(-1);
YuK41 12:b9ac1a23ac41 121 //PSU_OFF = false; // turns on the PSU if init is complet
YuK41 4:fb63da7601aa 122 }
YuK41 12:b9ac1a23ac41 123 }
YuK41 4:fb63da7601aa 124
YuK41 12:b9ac1a23ac41 125
Brutus 3:6c54aa6db861 126 while(1){
YuK41 12:b9ac1a23ac41 127 char out_buffer[] = "";
YuK41 12:b9ac1a23ac41 128 printf("\n-----------------------------------\n");
Brutus 3:6c54aa6db861 129 sock.sendto(echo_server, out_buffer, sizeof(out_buffer));
Brutus 3:6c54aa6db861 130
YuK41 12:b9ac1a23ac41 131
Brutus 3:6c54aa6db861 132 char in_buffer[256];
Brutus 3:6c54aa6db861 133 int n = sock.recvfrom(&echo_server, in_buffer, sizeof(in_buffer));
Brutus 3:6c54aa6db861 134
YuK41 12:b9ac1a23ac41 135 // Add \0 as end of line character to the input message
Brutus 3:6c54aa6db861 136 in_buffer[n] = '\0';
Brutus 3:6c54aa6db861 137
YuK41 12:b9ac1a23ac41 138 // Split the input message and save value in FR_str, fan_str and pwm_str
Brutus 3:6c54aa6db861 139 splitString(in_buffer);
Brutus 3:6c54aa6db861 140
YuK41 12:b9ac1a23ac41 141 // Print the order that was received
YuK41 12:b9ac1a23ac41 142 printf("ORDER RECEIVED : %s, %s, %s\n", arg1_str, arg2_str, arg3_str);
YuK41 12:b9ac1a23ac41 143
YuK41 12:b9ac1a23ac41 144 switch(arg1){
YuK41 12:b9ac1a23ac41 145
YuK41 12:b9ac1a23ac41 146 // Set the PWM of a front fan in particular
YuK41 12:b9ac1a23ac41 147 case 0:
YuK41 12:b9ac1a23ac41 148 if(fan[0] == 0){
YuK41 12:b9ac1a23ac41 149 for(int i = 0; i < 9; i++){
YuK41 12:b9ac1a23ac41 150 frontFans[i].write(pwm_f);
YuK41 12:b9ac1a23ac41 151 }
Brutus 8:10dcb0846e2f 152 }
YuK41 12:b9ac1a23ac41 153 else{
YuK41 12:b9ac1a23ac41 154 for(int i = 0; i < arg2_len; i++){
YuK41 12:b9ac1a23ac41 155 frontFans[fan[i] - 1].write(pwm_f);
YuK41 12:b9ac1a23ac41 156 }
Brutus 8:10dcb0846e2f 157 }
Brutus 3:6c54aa6db861 158 break;
Brutus 3:6c54aa6db861 159
YuK41 12:b9ac1a23ac41 160 // Set the PWM of a rear fan in particular
YuK41 12:b9ac1a23ac41 161 case 1:
Brutus 8:10dcb0846e2f 162 if(fan[0] == 0){
Brutus 8:10dcb0846e2f 163 for(int i = 0; i < 9; i++){
Brutus 8:10dcb0846e2f 164 rearFans[i].write(pwm_f);
Brutus 8:10dcb0846e2f 165 }
Brutus 8:10dcb0846e2f 166 }
Brutus 8:10dcb0846e2f 167 else{
YuK41 12:b9ac1a23ac41 168 for(int i = 0; i < arg2_len; i++){
Brutus 8:10dcb0846e2f 169 rearFans[fan[i] - 1].write(pwm_f);
Brutus 8:10dcb0846e2f 170 }
Brutus 3:6c54aa6db861 171 }
Brutus 3:6c54aa6db861 172 break;
Brutus 3:6c54aa6db861 173
Brutus 3:6c54aa6db861 174 case 2: // both fans
Brutus 8:10dcb0846e2f 175 if(fan[0] == 0){
Brutus 8:10dcb0846e2f 176 for(int i = 0; i < 9; i++){
Brutus 8:10dcb0846e2f 177 frontFans[i].write(pwm_f);
Brutus 8:10dcb0846e2f 178 rearFans[i].write(pwm_f);
Brutus 8:10dcb0846e2f 179 }
Brutus 8:10dcb0846e2f 180 }
Brutus 8:10dcb0846e2f 181 else{
YuK41 12:b9ac1a23ac41 182 for(int i = 0; i < arg2_len; i++){
Brutus 8:10dcb0846e2f 183 frontFans[fan[i] - 1].write(pwm_f);
Brutus 8:10dcb0846e2f 184 rearFans[fan[i] - 1].write(pwm_f);
Brutus 8:10dcb0846e2f 185 }
Brutus 8:10dcb0846e2f 186 }
Brutus 8:10dcb0846e2f 187 break;
Brutus 8:10dcb0846e2f 188
Brutus 8:10dcb0846e2f 189 case 3: // turns off PSU
Brutus 8:10dcb0846e2f 190 PSU_OFF = true;
Brutus 8:10dcb0846e2f 191 //char out_bufferF[] = "PSU OFF";
Brutus 8:10dcb0846e2f 192 //sock.sendto(echo_server, out_bufferF, sizeof(out_bufferF));
Brutus 8:10dcb0846e2f 193 break;
Brutus 8:10dcb0846e2f 194
Brutus 8:10dcb0846e2f 195 case 4: // turns on PSU
Brutus 8:10dcb0846e2f 196 PSU_OFF = false;
Brutus 8:10dcb0846e2f 197 //char out_bufferN[] = "PSU ON";
Brutus 8:10dcb0846e2f 198 //sock.sendto(echo_server, out_bufferN, sizeof(out_bufferN));
Brutus 8:10dcb0846e2f 199 break;
Brutus 8:10dcb0846e2f 200
Brutus 8:10dcb0846e2f 201 case 5: // kills the PSU
Brutus 8:10dcb0846e2f 202 PSU_DEAD = true;
Brutus 8:10dcb0846e2f 203 //char out_bufferK[] = "PSU KILLED";
Brutus 8:10dcb0846e2f 204 //sock.sendto(echo_server, out_bufferK, sizeof(out_bufferK));
Brutus 8:10dcb0846e2f 205 break;
Brutus 8:10dcb0846e2f 206
Brutus 8:10dcb0846e2f 207 case 6: // revives the PSU
Brutus 8:10dcb0846e2f 208 PSU_DEAD = false;
Brutus 8:10dcb0846e2f 209 //char out_bufferR[] = "PSU REVIVED";
Brutus 8:10dcb0846e2f 210 //sock.sendto(echo_server, out_bufferR, sizeof(out_bufferR));
Brutus 8:10dcb0846e2f 211 break;
Brutus 8:10dcb0846e2f 212
YuK41 12:b9ac1a23ac41 213 // Display F00 for front fans
YuK41 12:b9ac1a23ac41 214 case 20:{
YuK41 12:b9ac1a23ac41 215 for (int i =0;i<9;i++){
YuK41 12:b9ac1a23ac41 216 InterruptIn rpmIn1(counterFront[i]);
Brutus 11:aa1cb8df15dc 217 t1.reset();
YuK41 12:b9ac1a23ac41 218 count = 0;
YuK41 12:b9ac1a23ac41 219 rpmIn1.rise(&countFunction);
YuK41 12:b9ac1a23ac41 220 int c = 0;
YuK41 12:b9ac1a23ac41 221 while(count<=4 && c<1000){
YuK41 12:b9ac1a23ac41 222 c++;
Brutus 11:aa1cb8df15dc 223 }
Brutus 11:aa1cb8df15dc 224 rpmIn1.rise(NULL);
YuK41 12:b9ac1a23ac41 225 double rpm1 = 60*1000.0/(t1.read_ms()/2.0);
YuK41 12:b9ac1a23ac41 226 if (i%3==0)
YuK41 12:b9ac1a23ac41 227 printf("\n");
YuK41 12:b9ac1a23ac41 228 printf(" %lf ", rpm1);
YuK41 12:b9ac1a23ac41 229 }
YuK41 12:b9ac1a23ac41 230 printf("\n");
YuK41 12:b9ac1a23ac41 231 }
YuK41 12:b9ac1a23ac41 232 break;
YuK41 12:b9ac1a23ac41 233
YuK41 12:b9ac1a23ac41 234 // Display F00 for rear fans
YuK41 12:b9ac1a23ac41 235 case 21:{
YuK41 12:b9ac1a23ac41 236 for (int i =0;i<9;i++){
YuK41 12:b9ac1a23ac41 237 InterruptIn rpmIn1(counterRear[i]);
YuK41 12:b9ac1a23ac41 238 t1.reset();
YuK41 12:b9ac1a23ac41 239 count = 0;
YuK41 12:b9ac1a23ac41 240 rpmIn1.rise(&countFunction);
YuK41 12:b9ac1a23ac41 241 int c = 0;
YuK41 12:b9ac1a23ac41 242 while(count<=4 && c<1000){
YuK41 12:b9ac1a23ac41 243 c++;
Brutus 11:aa1cb8df15dc 244 }
YuK41 12:b9ac1a23ac41 245 rpmIn1.rise(NULL);
YuK41 12:b9ac1a23ac41 246 double rpm1 = 60*1000.0/(t1.read_ms()/2.0);
YuK41 12:b9ac1a23ac41 247 if (i%3==0)
YuK41 12:b9ac1a23ac41 248 printf("\n");
YuK41 12:b9ac1a23ac41 249 printf(" %lf ", rpm1);
YuK41 12:b9ac1a23ac41 250 }
YuK41 12:b9ac1a23ac41 251 printf("\n");
YuK41 12:b9ac1a23ac41 252
YuK41 12:b9ac1a23ac41 253 }
YuK41 12:b9ac1a23ac41 254 break;
YuK41 12:b9ac1a23ac41 255
YuK41 12:b9ac1a23ac41 256 // Set a diffenrent PWM value to all fans from 8% to 32% for test purpose
YuK41 12:b9ac1a23ac41 257 case 30:{
YuK41 12:b9ac1a23ac41 258 int pwm_17 = 8;
YuK41 12:b9ac1a23ac41 259 for(int i = 0; i < 9; i++){
YuK41 12:b9ac1a23ac41 260 float p=(pwm_17+2*i)/100.0;
YuK41 12:b9ac1a23ac41 261 frontFans[i].write(p);
YuK41 12:b9ac1a23ac41 262 rearFans[i].write(p);
Brutus 8:10dcb0846e2f 263 }
Brutus 8:10dcb0846e2f 264 }
Brutus 8:10dcb0846e2f 265 break;
Brutus 8:10dcb0846e2f 266
Brutus 8:10dcb0846e2f 267 case 99:{
Brutus 8:10dcb0846e2f 268
Brutus 3:6c54aa6db861 269 }
Brutus 3:6c54aa6db861 270 break;
Brutus 3:6c54aa6db861 271
Brutus 3:6c54aa6db861 272 default:
Brutus 8:10dcb0846e2f 273 for(int i = 0; i < 9; i++){
Brutus 8:10dcb0846e2f 274 frontFans[i].write(0.0);
Brutus 8:10dcb0846e2f 275 rearFans[i].write(0.0);
Brutus 8:10dcb0846e2f 276 }
Brutus 3:6c54aa6db861 277 }
Brutus 8:10dcb0846e2f 278 for(int i = 0; i <= 2; i++){
YuK41 12:b9ac1a23ac41 279 arg1_str[i] = '\0'; // "resets" the arg1_str
Brutus 8:10dcb0846e2f 280 }
Brutus 8:10dcb0846e2f 281 for(int i = 0; i <= 4; i++){
YuK41 12:b9ac1a23ac41 282 arg3_str[i] = '\0'; // "resets" the arg3_str
Brutus 8:10dcb0846e2f 283 }
Brutus 3:6c54aa6db861 284 }
Brutus 1:179393386b47 285 }
Brutus 1:179393386b47 286
Brutus 3:6c54aa6db861 287 void splitString(char stringToSplit[]){
Brutus 3:6c54aa6db861 288 char *comma_1 = strchr(stringToSplit, ',') + 1;
Brutus 3:6c54aa6db861 289 char *comma_2 = strchr(comma_1, ',') + 1;
Brutus 3:6c54aa6db861 290 char *comma_3 = strchr(comma_3, '\0');
Brutus 3:6c54aa6db861 291
YuK41 12:b9ac1a23ac41 292 arg1_len = comma_1 - stringToSplit - 1;
YuK41 12:b9ac1a23ac41 293 arg2_len = comma_2 - comma_1 - 1;
YuK41 12:b9ac1a23ac41 294 arg3_len = comma_3 - comma_2;
Brutus 3:6c54aa6db861 295
YuK41 12:b9ac1a23ac41 296 // Argument 1
YuK41 12:b9ac1a23ac41 297 strncpy(arg1_str, stringToSplit, arg1_len);
YuK41 12:b9ac1a23ac41 298 arg1 = strtol(arg1_str, NULL, 10);
YuK41 12:b9ac1a23ac41 299
YuK41 12:b9ac1a23ac41 300 // Argument 2
YuK41 12:b9ac1a23ac41 301 strncpy(arg2_str, comma_1, arg2_len);
YuK41 12:b9ac1a23ac41 302 for(int i = 0; i < arg2_len; i++){
YuK41 12:b9ac1a23ac41 303 fan[i] = arg2_str[i] - '0';
Brutus 3:6c54aa6db861 304 }
Brutus 3:6c54aa6db861 305
YuK41 12:b9ac1a23ac41 306 // Save the last number of arg2 into fan_nb as int
YuK41 12:b9ac1a23ac41 307 for(int i = 0; i<arg2_len; i++){
YuK41 12:b9ac1a23ac41 308 fan_nb = arg2_str[i] - '0';
YuK41 12:b9ac1a23ac41 309 }
YuK41 12:b9ac1a23ac41 310
YuK41 12:b9ac1a23ac41 311 // Argument 3
YuK41 12:b9ac1a23ac41 312 strncpy(arg3_str, comma_2, arg3_len);
YuK41 12:b9ac1a23ac41 313 double arg3 = strtod(arg3_str, NULL);
YuK41 12:b9ac1a23ac41 314 pwm_f = arg3/100.0;
Brutus 5:cee119979b55 315 }
Brutus 5:cee119979b55 316
Brutus 5:cee119979b55 317 int transString(char stringToTrans[]){
Brutus 5:cee119979b55 318 char in_str[2] = {0};
Brutus 5:cee119979b55 319 strncpy(in_str, stringToTrans,1);
Brutus 8:10dcb0846e2f 320 return atoi(in_str);
Brutus 8:10dcb0846e2f 321 }
Brutus 8:10dcb0846e2f 322
Brutus 8:10dcb0846e2f 323 void countFunction(){
YuK41 12:b9ac1a23ac41 324 // Start timer when the first rising edge is reached
YuK41 12:b9ac1a23ac41 325 if (count == 0)
YuK41 12:b9ac1a23ac41 326 t1.start();
YuK41 12:b9ac1a23ac41 327
YuK41 12:b9ac1a23ac41 328 // Stop timer when the fourth rising edge is reached (2 rotation)
YuK41 12:b9ac1a23ac41 329 if (count == 4)
YuK41 12:b9ac1a23ac41 330 t1.stop();
YuK41 12:b9ac1a23ac41 331
YuK41 12:b9ac1a23ac41 332 count++;
Brutus 8:10dcb0846e2f 333 }
Brutus 8:10dcb0846e2f 334