Funcionamiento push bottom con delay 300ms

Dependencies:   mbed

Fork of Proyecto_3_simulacionesC by Simulaciones Computacionales

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include <math.h>
00003 Serial pc(USBTX, USBRX);
00004 DigitalIn botton(PTD1);
00005 DigitalOut myled(LED1);
00006 double mu_q1 = 8.0;           //Tasa de servicio de Cola Q1
00007 double mu_q2 = 3.0*3.0;         //Tasa de servicio de Cola Q2 *3 por n�mero de servidores
00008 double mu_q3 = 15.0;          //Tasa de servicio de Cola Q3
00009 
00010 double lamb = 10.0;           //Tasa de llegada de paquetes
00011 
00012 float P = 0.5;           //Probabilidad de llegada a Q2 (vs. Q1)
00013 float S = 0.1;           //Probabilidad de llegada a Q1 (vs. Salida)
00014 
00015 double t=0;               //Inicializaci�n del tiempo actual
00016 double t_ant=0;           //Inicializacion del tiempo anterior
00017 const int total =30000;
00018 //double Vt[total];             //Vector de tiempos de eventos
00019 int k = 1;                 //Indice de los eventos ocurridos
00020 float Tf=1000;           //Tiempo m�ximo de simulaci�n
00021 
00022 int C_Q1=0;             //Log de N�mero de paquetes en la cola Q1
00023 int C_Q2=0;             //Log de N�mero de paquetes en la cola Q2
00024 int C_Q3=0;             //Log de N�mero de paquetes en la cola Q3
00025 
00026 double t_arrival=0;       //Tiempo de llegada de paquetes
00027 double t_out1=0;          //Tiempo de salida de la cola Q1
00028 double t_out2=0;          //Tiempo de salida de la cola Q2
00029 double t_out3=0;          //Tiempo de salida de la cola Q3
00030 double t_min=10000;           //Variable auxiliar
00031 int mini=100;            //Variable auxiliar
00032 
00033 double evalmin[4];
00034 
00035 double a=16807.0;
00036 double m=2147483646.0;
00037 int c=0.0;
00038 double x=72841.0;
00039 double u=x/m;
00040 
00041 int suma1 = 0;
00042 int suma2 = 0;
00043 int suma3 = 0;
00044 
00045 double mean1 = 0;
00046 double mean2 = 0;
00047 double mean3 = 0;
00048 double meanT = 0;
00049 
00050 double uti1 = 0;
00051 double uti2 = 0;
00052 double uti3 = 0;
00053 // RANDOM
00054 double r_unif(void)
00055 {
00056     x= (a*x+c)-m*floor((a*x+c)/m);
00057     u=x/m;
00058     return u;
00059 }
00060 
00061 // RANDOM EXPONENCIAL
00062 double r_exp(double mu)
00063 {
00064     double temp=-mu*log(r_unif());
00065     return temp;
00066 }
00067 
00068 int main()
00069 {
00070     pc.baud(115200);
00071 
00072     for(k=1; k<total; k++) {
00073         //t_arrival= r_exp(1.0/lamb);  //Tiempo de llegada del siguiente paquete
00074         if(C_Q1+C_Q2+C_Q3==0)
00075             while(botton);
00076         myled=botton;
00077         if(botton==0) {
00078             t_arrival=0.001;
00079         } else {
00080             t_arrival=10000;
00081         }
00082         if (C_Q1>0) {
00083             t_out1= r_exp(1.0/mu_q1);
00084         } else {
00085             t_out1=t_arrival+1.0;
00086         }
00087         if (C_Q2>0) {
00088             t_out2= r_exp(1.0/mu_q2);
00089         } else {
00090             t_out2=t_arrival+1.0;
00091         }
00092         if (C_Q3>0)  {
00093             t_out3= r_exp(1.0/mu_q3);
00094         } else {
00095             t_out3=t_arrival+1.0;
00096         }
00097 
00098 //Se calcula el evento que pasara primero
00099         evalmin[0]=t_arrival;
00100         evalmin[1]= t_out1;
00101         evalmin[2]=t_out2;
00102         evalmin[3]= t_out3;
00103         t_min=1000000;
00104         for (int i=0; i<4; i++ ) {
00105             if(t_min > evalmin[i]) {
00106                 t_min= evalmin[i];
00107                 mini=i;
00108             }
00109         }
00110 
00111 // Se actualiza el vector de tiempos
00112         t_ant=t;
00113         t=t+t_min;
00114 //Se actualiza el log de eventos
00115         //Vt[k]=t;
00116 
00117 //Ahora se analiza el evento de minimo tiempo y se aplican los cambios
00118 
00119         switch (mini) {
00120             case 0:
00121                 //pc.printf("Arriving\r\n");
00122                 if (r_unif() >= P) {
00123                     C_Q1 = C_Q1+1;  //Entra a Q1
00124                     C_Q2 = C_Q2;    //Q2 permanece igual
00125                     C_Q3 = C_Q3;    //Q3 permanece igual
00126                 } else {
00127                     C_Q2 = C_Q2+1;  //Entra a Q2
00128                     C_Q1 = C_Q1;   //Q1 permanece igual
00129                     C_Q3 = C_Q3;   //Q3 permanece igual
00130                 }
00131                 break;
00132             case 1:             //La salida de la cola 1 es primero
00133                 //pc.printf("Leaving 1\r\n");
00134                 C_Q1 = C_Q1-1;  //Sale de Q1
00135                 C_Q3 = C_Q3+1;  //Entra a Q3
00136                 C_Q2 = C_Q2;    //Q2 permanece igual
00137                 break;
00138             case 2:                  //La salida de la cola 2 es primero
00139                 //pc.printf("Leaving 2\r\n");
00140                 C_Q2 = C_Q2-1;      //Sale de Q2
00141                 C_Q3 = C_Q3+1;      //Entra a Q3
00142                 C_Q1 = C_Q1;        //Q1 permanece igual
00143                 break;
00144             case 3:
00145                 //pc.printf("Leaving 3\r\n");
00146                 C_Q3 = C_Q3-1;     //Sale de Q3
00147                 C_Q2 = C_Q2;       //Q2 permanece igual
00148                 if (r_unif()<S) {    //Distr. uniforme para calcular prob 0.1
00149                     C_Q1 = C_Q1+1; //Entra a Q1
00150                 } else {
00151                     C_Q1 = C_Q1;    //Q1 permanece igual
00152                 }
00153                 break;
00154             default:
00155                 pc.printf("Error\r\n");
00156                 //mini=0;
00157                 break;
00158         }
00159         mean1=(mean1*t_ant+C_Q1*(t-t_ant))/t;
00160         mean2=(mean2*t_ant+C_Q2*(t-t_ant))/t;
00161         mean3=(mean3*t_ant+C_Q3*(t-t_ant))/t;
00162         meanT = mean1+mean2+mean3;
00163 
00164         if (C_Q1 == 0) {
00165             uti1=uti1+t-t_ant;
00166         }
00167 
00168         if (C_Q2 == 0) {
00169             uti2=uti2+t-t_ant;
00170         }
00171 
00172         if (C_Q3 == 0) {
00173             uti3=uti3+t-t_ant;
00174         }
00175         wait_ms(300);
00176         pc.printf("Cola 1: %d \t",C_Q1);
00177         pc.printf("Cola 2: %d \t",C_Q2);
00178         pc.printf("Cola 3: %d \r\n",C_Q3);
00179 
00180     }
00181 
00182 
00183 
00184     uti1= 1 - uti1/t;
00185     uti2= 1-uti2/t;
00186     uti3= 1-uti3/t;
00187 
00188 
00189     pc.printf("Media Cola 1: %f \r\n",mean1);
00190     pc.printf("Media Cola 2: %f \r\n",mean2);
00191     pc.printf("Media Cola 3: %f \r\n",mean3);
00192     pc.printf("Media Total : %f \r\n",meanT);
00193     pc.printf("Tiempo promedio de utilizacion de cola 1: %f \r\n",uti1);
00194     pc.printf("Tiempo promedio de utilizacion de Cola 2 de no utilizacion: %f \r\n",uti2);
00195     pc.printf("Tiempo promedio de utilizacion de Cola 3 de no utilizacion: %f \r\n",uti3);
00196     pc.printf("Tiempo promedio de Tareas en la Cala 1 de no utilizacion: %f \r\n",mean1/(lamb*0.5+(0.1/mu_q1)));
00197     pc.printf("Tiempo promedio de Tareas en la Cala 2 de no utilizacion: %f \r\n",mean2/(0.5*lamb));
00198     pc.printf("Tiempo promedio de Tareas en la Cala 3 de no utilizacion: %f \r\n",mean3/(1.0/mu_q1+1.0/mu_q2));
00199     pc.printf("Tiempo medio de respuesta del sistema  %f \r\n",meanT/lamb);
00200 }