#define _INKERNEL #include #include #include #include #include #include #include #include #include "cip.h" #include "conftty.h" typedef tipo_estacion *puntero; puntero bloque; char m_envi[200]; char m_reci[200]; int estado_general; int linea; int arranque; int puede; struct tm *fechag; char estacion[5]; int arrancado[20]; char lahora[20]; main () { FILE *fich; key_t key; struct shmid_ds buf; int dire, error; TTY mytty; time_t clock; clock=time(0); fechag=localtime(&clock); strcpy (estacion,getenv("estacion")); estacion[3] = 0; arranque = 0; /* asigna un bloque de memoria compartida, y lo identifica con el numero dire */ dire=shmget(IPC_PRIVATE,sizeof(tipo_estacion),1); if (dire == -1) { perror ("error de memoria"); exit (0); } /* guardo en buf el estado de ese bloque de memoria compartida */ error = shmctl (dire,IPC_STAT,&buf); /* crea un vinculo entre el bloque de memoria compartida y el puntero bloque. Deesta forma el bloque de memoria compartida es accesible a traves de esa variable*/ bloque = shmat (dire,0,1); /* guarda en un fichero la identificacion de ese bloque compartido */ fich = fopen("/tmp/fich","w+"); fwrite (&dire,sizeof(int),1,fich); fclose (fich); /* inicializa la estructura estacion */ inicio (); /* abro la linea serie en una variable general */ lttycfd ("L01",&mytty,0); linea = abretty(&mytty); /* funcion que realiza la comunicacion con el concentrador. Para terminar podemos poner en tpv_com algun comando desde el programa de tpv. De esa forma sale de esa funcion y devuelve a su estado normal la memoria */ comunica (); /* desvincula el bloque de memoria compartida de la variable del programa */ error = shmdt (bloque); /* desasigna el bloque de memoria compartida */ error = shmctl (dire,IPC_RMID,&buf); } inicio () { int i, j; int num; FILE *fich; char cadena[700]; char fich_sur[50]; for (i=0;i<16;i++) { for (j=0;j<4;j++) { bloque->surtidores[i].manguera[j].num_manguera[0] = '0'; bloque->surtidores[i].manguera[j].num_manguera[1] = '0'; bloque->surtidores[i].manguera[j].estado_manguera = '0'; bloque->surtidores[i].manguera[j].producto = '0'; bloque->surtidores[i].manguera[j].importe[0] = '0'; bloque->surtidores[i].manguera[j].importe[1] = '0'; bloque->surtidores[i].manguera[j].importe[2] = '0'; bloque->surtidores[i].manguera[j].importe[3] = '0'; bloque->surtidores[i].manguera[j].importe[4] = '0'; bloque->surtidores[i].manguera[j].precio[0] = '0'; bloque->surtidores[i].manguera[j].precio[1] = '0'; bloque->surtidores[i].manguera[j].precio[2] = '0'; bloque->surtidores[i].manguera[j].precio[3] = '0'; bloque->surtidores[i].manguera[j].litros[0] = '0'; bloque->surtidores[i].manguera[j].litros[1] = '0'; bloque->surtidores[i].manguera[j].litros[2] = '0'; bloque->surtidores[i].manguera[j].litros[3] = '0'; bloque->surtidores[i].manguera[j].litros[4] = '0'; bloque->surtidores[i].manguera[j].total[0] = '0'; bloque->surtidores[i].manguera[j].total[1] = '0'; bloque->surtidores[i].manguera[j].total[2] = '0'; bloque->surtidores[i].manguera[j].total[3] = '0'; bloque->surtidores[i].manguera[j].total[4] = '0'; bloque->surtidores[i].manguera[j].total[5] = '0'; bloque->surtidores[i].manguera[j].total[6] = '0'; bloque->surtidores[i].manguera[j].total[7] = '0'; bloque->surtidores[i].manguera[j].total[8] = '0'; bloque->surtidores[i].manguera[j].total[9] = '0'; bloque->surtidores[i].manguera[j].ultima = '0'; bloque->surtidores[i].manguera[j].graba = '0'; bloque->surtidores[i].manguera[j].libre[0] = '0'; bloque->surtidores[i].manguera[j].libre[1] = '0'; bloque->surtidores[i].manguera[j].libre[2] = '0'; bloque->surtidores[i].manguera[j].libre[3] = '0'; bloque->surtidores[i].manguera[j].libre[4] = '0'; bloque->surtidores[i].manguera[j].libre[5] = '0'; bloque->surtidores[i].manguera[j].libre[6] = '0'; bloque->surtidores[i].manguera[j].sep_m = '/'; } bloque->surtidores[i].n_calle[0] = '0'; bloque->surtidores[i].n_calle[1] = i + 0x30 + 1; if (i >= 9) { bloque->surtidores[i].n_calle[0] = '1'; bloque->surtidores[i].n_calle[1] = i + 0x30 - 9; } bloque->surtidores[i].estado = '2'; bloque->surtidores[i].sep_sur = 0x1f; arrancado[i] = 0; } bloque->tpv_com = '0'; bloque->cms_com = '0'; bloque->n_sur[0] = '0'; bloque->n_sur[1] = '0'; bloque->pre[0] = '0'; bloque->pre[1] = '0'; bloque->pre[2] = '0'; bloque->pre[3] = '0'; bloque->cambio[0] = '0'; bloque->cambio[1] = '0'; bloque->cambio[2] = '0'; bloque->cambio[3] = '0'; bloque->cambio[4] = '0'; bloque->cambio[5] = '0'; bloque->cambio[6] = '0'; bloque->cambio[7] = '0'; bloque->cambio[8] = '0'; bloque->cambio[9] = '0'; bloque->cambio[10] = '0'; bloque->cambio[11] = '0'; bloque->cambio[12] = '0'; bloque->cambio[13] = '0'; bloque->cambio[14] = '0'; bloque->cambio[15] = '0'; bloque->ultima[0] = '0'; bloque->ultima[1] = '0'; bloque->ultima[2] = '0'; bloque->ultima[3] = '0'; bloque->ultima[4] = '0'; bloque->ultima[5] = '0'; bloque->ultima[6] = '0'; bloque->ultima[7] = '0'; bloque->ultima[8] = '0'; bloque->ultima[9] = '0'; bloque->ultima[10] = '0'; bloque->ultima[11] = '0'; bloque->ultima[12] = '0'; bloque->ultima[13] = '0'; bloque->ultima[14] = '0'; bloque->ultima[15] = '0'; bloque->clase[0] = '0'; bloque->clase[1] = '0'; bloque->clase[2] = '0'; bloque->clase[3] = '0'; bloque->clase[4] = '0'; bloque->clase[5] = '0'; bloque->clase[6] = '0'; bloque->clase[7] = '0'; bloque->clase[8] = '0'; bloque->clase[9] = '0'; bloque->clase[10] = '0'; bloque->clase[11] = '0'; bloque->clase[12] = '0'; bloque->clase[13] = '0'; bloque->clase[14] = '0'; bloque->clase[15] = '0'; strcpy (fich_sur,getenv("dd_dir")); //strcpy (fich_sur,"/MICMAD/ALFA/JORGE"); strcat (fich_sur,"/SD/FSD01"); fich = fopen (fich_sur,"r"); num = 608; i = 0; while (num == 608 && i < 16) { num = fread(cadena,sizeof(char),608,fich); if (num == 608) { bloque->clase[i] = cadena[10]; bloque->combustible[i].proc[0] = cadena[3]; bloque->combustible[i].proc[1] = cadena[59]; bloque->combustible[i].proc[2] = cadena[115]; bloque->combustible[i].proc[3] = cadena[171]; i++; } } fclose (fich); } comunica () { m_envi[0] = '0'; while (bloque->tpv_com != 'F') { /*nap (050);*/ switch (bloque->tpv_com) { case 'm': arranca_resi (); break; case 'n': reset_sys (); break; case 'M': modo_trabajo (); break; case 'B': bloqueo_calle(); break; case 'D': desblo_calle(); break; case 'P': prefi_calle(); break; case 'C': cobrar_calle(); break; case 'S': cambio_precios(); break; case 'T': pide_total(); break; case 'J': pide_un_total(); break; case 'Z': test_resi(); break; case 'F': return(0); break; default: rastreo(); break; } /*bloque->tpv_com = '0';*/ } } arranca_resi () { int I,j; char cade[5]; cade[0] = bloque->n_sur[0]; cade[1] = bloque->n_sur[1]; cade[2] = '\0'; bloque->man_total = atoi(cade); cade[0] = bloque->pre[0]; cade[1] = bloque->pre[1]; cade[2] = '\0'; bloque->num_total = atoi(cade); m_envi[0]=0x01; m_envi[1]=0x4e; m_envi[2]=0x03; m_envi[3]=0x4d; m_envi[4]=0x04; envi(m_envi,5); reci(m_reci); m_envi[0]=0x01; m_envi[1]=0xffffffe2; m_envi[2]=0x03; m_envi[3]=0xffffffe1; m_envi[4]=0x04; envi(m_envi,5); reci(m_reci); bloque->tpv_com = '0'; arranque = 1; bloque->cms_com = 'V'; } pide_un_total() { int i,j; int vale; char *bloque_aux; tipo_surtidor copia; char cade[5]; int num_calle; int v; int son, num, iter; char car; FILE *fich; fich = fopen ("comu","a+"); cade[0] = bloque->n_sur[0]; cade[1] = bloque->n_sur[1]; i = atoi(cade) - 1; m_envi[0] = SOH; m_envi[1] = 'T'; m_envi[2] = bloque->n_sur[0]; m_envi[3] = bloque->n_sur[1]; m_envi[4] = ETX; m_envi[5] = m_envi[1] ^ m_envi[2] ^ m_envi[3] ^ m_envi[4]; m_envi[6] = EOT; envi (m_envi,7); fwrite (m_envi,sizeof(char),7,fich); son = 0; iter = 0; num = 0; while (son < 156 && iter < 25) { num = tread (linea,&car,1,1); fwrite (&car,sizeof(char),1,fich); if (num == 1) { m_reci[son++] = car; } else { iter ++; sleep (1); } } cade[0] = m_reci[1]; cade[1] = m_reci[2]; cade[2] = '\0'; num_calle = atoi(cade) - 1; if (m_reci[0] != ' ' && num_calle == i) { vale = ver_lrc(m_reci); if (vale == 0) { if (m_reci[0] == ACK) { reci (m_reci); } if (m_reci[0] == 2) { bloque_aux = &copia; for (j=0;j<152;j++) { *bloque_aux++ = m_reci[j+1]; } if (memcmp(&copia,&bloque->surtidores[i],152) != 0 && bloque->cms_com != 'b') { memcpy (&bloque->surtidores[i],&copia,152); bloque->cambio[i] = 'V'; bloque->cms_com = 'V'; if (bloque->surtidores[i].estado == '3') { for (v=0;v<4;v++) { if (bloque->surtidores[i].manguera[v].estado_manguera == '1') { bloque->ultima[i] = v + 0x30; } } } } m_envi[0] = ACK; envi (m_envi,1); } } } else { sleep (5); reci (m_reci); } /*for (i=0;inum_total;i++) { for (j=0;j<10;j++) bloque->surtidores[i].manguera[0].total[j] = 0x30 + j; }*/ fclose (fich); bloque->tpv_com = '0'; bloque->cms_com = 'T'; } pide_total() { int i,j; int vale; char *bloque_aux; tipo_surtidor copia; char cade[5]; int num_calle; int v; int son, num, iter; char car; char total_aux[11]; num = 1; /*while (num == 1) num = tread (linea,&car,1,1); num = 1; while (num == 1) num = tread (linea,&car,1,1); num = 1; while (num == 1) num = tread (linea,&car,1,1); num = 1; while (num == 1) num = tread (linea,&car,1,1); num = 1; while (num == 1) num = tread (linea,&car,1,1);*/ num = 1; while (num == 1) num = tread (linea,&car,1,1); num = 1; while (num == 1) num = tread (linea,&car,1,1); num = 1; while (num == 1) num = tread (linea,&car,1,1); num = 1; while (num == 1) num = tread (linea,&car,1,1); for (i=0;inum_total;i++) { if (bloque->clase[i] != '3') { m_envi[0] = SOH; m_envi[1] = 'T'; m_envi[2] = '0'; m_envi[3] = i + 1 + 0x30; if (i >= 9) { m_envi[2] = '1'; m_envi[3] = i + 0x30 - 9; } m_envi[4] = ETX; m_envi[5] = m_envi[1] ^ m_envi[2] ^ m_envi[3] ^ m_envi[4]; m_envi[6] = EOT; envi (m_envi,7); son = 0; iter = 0; num = 0; while (son < 156 && iter < 25) { num = tread (linea,&car,1,1); if (num == 1) { m_reci[son++] = car; } else { iter ++; sleep (1); } } cade[0] = m_reci[1]; cade[1] = m_reci[2]; cade[2] = '\0'; num_calle = atoi(cade) - 1; /*printf ("Llega: %d, Calle: %d",num_calle,i); printf ("Calle cero: %s\n",m_reci);*/ if (m_reci[0] != ' ' && num_calle == i) { /*printf ("Calle correcta\n");*/ vale = ver_lrc(m_reci); if (vale == 0) { if (m_reci[0] == ACK) { /*printf ("Recibo ACK\n");*/ reci (m_reci); } if (m_reci[0] == 2) { bloque_aux = &copia; for (j=0;j<152;j++) { *bloque_aux++ = m_reci[j+1]; } if (memcmp(&copia,&bloque->surtidores[i],152) != 0 && bloque->cms_com != 'b') { memcpy (&bloque->surtidores[i],&copia,152); bloque->cambio[i] = 'V'; bloque->cms_com = 'V'; if (bloque->surtidores[i].estado == '3') { for (v=0;v<4;v++) { if (bloque->surtidores[i].manguera[v].estado_manguera == '1') { bloque->ultima[i] = v + 0x30; } } } } m_envi[0] = ACK; envi (m_envi,1); } } } else { /*printf ("Vamos mal\n");*/ reci (m_reci); } } for (j=0;j<4;j++) { strncpy (total_aux,bloque->surtidores[i].manguera[j].total,10); total_aux[10] = 0; /*printf ("Surtidor %d, manguera %d, total %s\n",i,j,total_aux);*/ } } /*for (i=0;inum_total;i++) { strncpy (total_aux,bloque { bloque->surtidores[i].manguera[0].total[j] = 0x30; }*/ bloque->tpv_com = '0'; bloque->cms_com = 'T'; } cambio_precios() { int i,j,k; char *bloque_aux; for (i=0;inum_total;i++) { m_envi[0] = ACK; envi (m_envi,1); m_envi[0] = SOH; m_envi[1] = 'I'; bloque_aux = &bloque->surtidores[i]; for (j=0;j<152;j++) { m_envi[j+2] = *bloque_aux++; } m_envi[155] = m_envi[1]; m_envi[154] = ETX; for (j=2;j<155;j++) { m_envi[155] = m_envi[155] ^ m_envi[j]; } m_envi[156] = EOT; envi (m_envi,157); reci (m_reci); /*for (j=0;j<4;j++)*/ for (j=0;j<1;j++) { m_envi[0] = SOH; m_envi[1] = DC3; m_envi[2] = bloque->surtidores[i].manguera[j].num_manguera[0]; m_envi[3] = bloque->surtidores[i].manguera[j].num_manguera[1]; m_envi[4] = bloque->surtidores[i].manguera[j].precio[0]; m_envi[5] = bloque->surtidores[i].manguera[j].precio[1]; m_envi[6] = bloque->surtidores[i].manguera[j].precio[2]; m_envi[7] = bloque->surtidores[i].manguera[j].precio[3]; m_envi[8] = ETX; m_envi[9] = m_envi[1]; for (k=2;k<9;k++) { m_envi[9] = m_envi[9] ^ m_envi[k]; } m_envi[10] = EOT; m_envi[11] = 0; envi (m_envi,11); reci (m_reci); } } if (m_reci[0] == ACK || m_reci[0] == ' ') { bloque->tpv_com = '0'; bloque->cms_com = 'V'; } if (m_reci[0] == NACK) { cambio_precios (); } } prefi_calle() { char cade[3]; int num_calle; cade[0] = bloque->n_sur[0]; cade[1] = bloque->n_sur[1]; cade[2] = '\0'; num_calle = atoi(cade) - 1; m_envi[0] = SOH; m_envi[1] = DC4; m_envi[2] = bloque->n_sur[0]; m_envi[3] = bloque->n_sur[1]; m_envi[4] = bloque->pre[0]; m_envi[5] = bloque->pre[1]; m_envi[6] = bloque->pre[2]; m_envi[7] = bloque->pre[3]; m_envi[8] = bloque->pre[4]; m_envi[9] = ETX; m_envi[10] = m_envi[1] ^ m_envi[2] ^ m_envi[3] ^ m_envi[4] ^ m_envi[5] ^ m_envi[6] ^ m_envi[7] ^ m_envi[8] ^ m_envi[9]; m_envi[11] = EOT; m_envi[12] = 0; envi (m_envi,12); m_envi[12] = 0; reci (m_reci); if (m_reci[0] == ACK || m_reci[0] == ' ') { bloque->cambio[num_calle] = 'V'; bloque->pre[0] = '0'; bloque->pre[1] = '0'; bloque->pre[2] = '0'; bloque->pre[3] = '0'; bloque->pre[4] = '0'; bloque->cms_com = 'V'; bloque->tpv_com = '0'; return (0); } if (m_reci[0] == NACK) { prefi_calle (); } } cobrar_calle() { int num_calle; char cade[10]; cade[0] = bloque->n_sur[0]; cade[1] = bloque->n_sur[1]; cade[2] = '\0'; num_calle = atoi(cade) - 1; if (bloque->surtidores[num_calle].estado == '4') { m_envi[0] = SOH; m_envi[1] = DC2; m_envi[2] = bloque->n_sur[0]; m_envi[3] = bloque->n_sur[1]; m_envi[4] = ETX; m_envi[5] = m_envi[1] ^ m_envi[2] ^ m_envi[3] ^ m_envi[4]; m_envi[6] = EOT; envi (m_envi,7); reci (m_reci); if (m_reci[0] == ACK || m_reci[0] == ' ') { bloque->cambio[num_calle] = 'V'; bloque->cms_com = 'V'; bloque->tpv_com = '0'; return (0); } if (m_reci[0] == NACK) { cobrar_calle (); } } else { bloque->cambio[num_calle] = 'V'; bloque->cms_com = 'V'; bloque->tpv_com = '0'; } } desblo_calle() { int num_calle; char cade[10]; cade[0] = bloque->n_sur[0]; cade[1] = bloque->n_sur[1]; cade[2] = '\0'; num_calle = atoi(cade) - 1; m_envi[0] = SOH; m_envi[1] = DC2; m_envi[2] = bloque->n_sur[0]; m_envi[3] = bloque->n_sur[1]; m_envi[4] = ETX; m_envi[5] = m_envi[1] ^ m_envi[2] ^ m_envi[3] ^ m_envi[4]; m_envi[6] = EOT; envi (m_envi,7); reci (m_reci); if (m_reci[0] == ACK || m_reci[0] == ' ') { bloque->cambio[num_calle] = 'V'; bloque->cms_com = 'V'; bloque->tpv_com = '0'; return (0); } if (m_reci[0] == NACK) { desblo_calle (); } } bloqueo_calle() { int num_calle; char cade[10]; cade[0] = bloque->n_sur[0]; cade[1] = bloque->n_sur[1]; cade[2] = '\0'; num_calle = atoi(cade) - 1; m_envi[0] = SOH; m_envi[1] = DC1; m_envi[2] = bloque->n_sur[0]; m_envi[3] = bloque->n_sur[1]; m_envi[4] = ETX; m_envi[5] = m_envi[1] ^ m_envi[2] ^ m_envi[3] ^ m_envi[4]; m_envi[6] = EOT; envi (m_envi,7); reci (m_reci); if (m_reci[0] == ACK || m_reci[0] == ' ') { bloque->cambio[num_calle] = 'V'; bloque->cms_com = 'V'; bloque->tpv_com = '0'; return (0); } if (m_reci[0] == NACK) { bloqueo_calle (); } } modo_trabajo () { /*m_envi[0]=0x01; m_envi[1]=0x4e; m_envi[2]=0x03; m_envi[3]=0x4d; m_envi[4]=0x04;*/ /*envi(m_envi,5);*/ if (bloque->n_sur[0] == '1') { estado_general = 0; m_envi[0] = SOH; m_envi[1] = SS; m_envi[2] = ETX; m_envi[3] = m_envi[1] ^ m_envi[2]; m_envi[4] = EOT; } if (bloque->n_sur[0] == '2') { estado_general = 1; m_envi[0] = SOH; m_envi[1] = NN; m_envi[2] = ETX; m_envi[3] = m_envi[1] ^ m_envi[2]; m_envi[4] = EOT; } if (bloque->n_sur[0] == '3') { estado_general = 2; m_envi[0]=0x01; m_envi[1]=0xe2; m_envi[2]=0x03; m_envi[3]=0xe1; m_envi[4]=0x04; } if (bloque->n_sur[0] == '4') { estado_general = 3; m_envi[0]=0x01; m_envi[1]=0xe2; m_envi[2]=0x03; m_envi[3]=0xe1; m_envi[4]=0x04; } envi (m_envi,5); reci (m_reci); bloque->tpv_com = '0'; bloque->cms_com = 'V'; } ver_lrc (char *m_reci) { int es = 0; int i = 0; es = m_reci[0]; i = 1; while ( m_reci[i] != 0) { if (m_reci[i+2] != 0 && m_reci[i+1] != 0) es = es ^ m_reci[i]; i++; } if (es == m_reci[i-2]) return (0); else { limpia (); return (1); } return (0); } rastreo () { int j, vale; char *bloque_aux; tipo_surtidor copia; char cade[5]; int num_calle; static int i = 0; int v; int esla; int mismo; napms (100); if (arranque == 0) { return (0); } if (bloque->clase[i] == '3') { i++; if (i >= bloque->num_total ) { i = 0; } return (0); } mismo = 0; m_envi[0] = SOH; m_envi[1] = 'H'; m_envi[2] = '0'; m_envi[3] = i + 0x30 + 1; if (i >= 9) { m_envi[2] = '1'; m_envi[3] = i + 0x30 - 9; } m_envi[4] = ETX; m_envi[5] = m_envi[1] ^ m_envi[2] ^ m_envi[3] ^ m_envi[4]; m_envi[6] = EOT; m_envi[7] = 0; envi (m_envi,7); reci (m_reci); // printf ("Sale:%s\n",m_envi); // printf ("Llega:%s\n",m_reci); cade[0] = m_reci[1]; cade[1] = m_reci[2]; cade[2] = '\0'; num_calle = atoi(cade) - 1; if (m_reci[0] != ' ' && num_calle == i) { vale = ver_lrc(m_reci); if (vale == 0) { if (m_reci[0] == ACK) { reci (m_reci); } if (m_reci[0] == 'f') { m_envi[0] = ACK; envi (m_envi,1); m_envi[0] = SOH; m_envi[1] = 'I'; bloque_aux = &bloque->surtidores[i]; for (j=0;j<152;j++) { m_envi[j+2] = *bloque_aux++; } m_envi[155] = m_envi[1]; m_envi[154] = ETX; for (j=2;j<155;j++) { m_envi[155] = m_envi[155] ^ m_envi[j]; } m_envi[156] = EOT; envi (m_envi,157); reci (m_reci); if (m_reci[0] == NACK) { envi (m_envi,157); reci (m_reci); } } if (m_reci[0] == 2) { arrancado[i] = 1; bloque_aux = &copia; for (j=0;j<152;j++) { *bloque_aux++ = m_reci[j+1]; } if (memcmp(&copia,&bloque->surtidores[i],152) != 0 && bloque->cms_com != 'b') { memcpy (&bloque->surtidores[i],&copia,152); bloque->cambio[i] = 'V'; bloque->cms_com = 'V'; for (v=0;v<4;v++) { if (bloque->surtidores[i].manguera[v].estado_manguera == '1') { bloque->ultima[i] = v + 0x30; } } if (bloque->surtidores[i].estado == '3') { for (v=0;v<4;v++) { if (bloque->surtidores[i].manguera[v].estado_manguera == '1') { bloque->ultima[i] = v + 0x30; bloque->graba[i] = '1'; } } } if (bloque->surtidores[i].estado != '3' && bloque->graba[i] == '1') { mismo = 1; graba_datos(i); bloque->graba[i] = '0'; if (estado_general == 3) { if (i == 9) { bloque->n_sur[0] = '1'; bloque->n_sur[1] = '0'; } if (i > 9) { bloque->n_sur[0] = '1'; bloque->n_sur[1] = i + 0x30 + 1 - 10; } if (i < 9) { bloque->n_sur[0] = '0'; bloque->n_sur[1] = i + 0x30 + 1; } desblo_calle (); } } } } } if (vale != 0) { m_envi[0] = NACK; envi (m_envi,1); } } else { // m_envi[0] = ACK; // envi (m_envi,1); if (arrancado[i] == 0) { m_envi[0] = SOH; m_envi[1] = 'I'; bloque_aux = &bloque->surtidores[i]; for (j=0;j<152;j++) { m_envi[j+2] = *bloque_aux++; } m_envi[155] = m_envi[1]; m_envi[154] = ETX; for (j=2;j<155;j++) { m_envi[155] = m_envi[155] ^ m_envi[j]; } m_envi[156] = EOT; envi (m_envi,157); reci (m_reci); if (m_reci[0] == NACK) { envi (m_envi,157); reci (m_reci); } } else { m_envi[0] = NACK; envi (m_envi,1); } } if (mismo != 1) { i++; } if (i >= bloque->num_total ) { i = 0; } } /*************************************************************/ /* ENVI: funcion que envia por la linea serie los datos */ /* Entrada: - men: mensaje a trasmitir. */ /* - longi : longitud del mensaje. */ /*************************************************************/ envi (men, longi) char *men; int longi; { printf ("Sale:%s\n",men); write (linea,men,longi); } /************************************************************/ /* RECI: funcion que recibe mensaje por linea. */ /* Entradas: - men: mensaje recibido */ /************************************************************/ reci (men) char *men; { /******** Declaracion de funciones externas ***/ extern int tread (int,char*,int,int); /******* Declaracion de variables *************/ int fich; int I; int num; char men2[142]; num = tread (linea,men,156,3); men[num] = '\0'; if (men[0] == ' ') { men[1] = '\0'; } if (num < 1) { men[0] = ' '; men[1] = '\0'; } /*if (num == 156 && men[0] != 0x02) { num = 1; while (num>0) { num = tread (linea,men,1,1); } num = -1; men[0] = ' '; men[1] = '\0'; }*/ saca_hora(); printf ("%s --- Llega:%d,%s\n",lahora,num,men); return (num); } limpia () { int num = 0; char car[3]; num = 1; while (num == 1) num = tread (linea,car,1,1); } reset_sys () { } test_resi () { } graba_datos (int i) { FILE *fich; char ano[10]; char dia[10]; char mes[10]; char hora[10]; char minuto[10]; char segundo[10]; int fin=0; time_t clock; struct tm *fecha; double pid; char nombre[50]; int num; tipo_informe informe; int ulti; tipo_manguera boca; clock=time(0); fecha=localtime(&clock); pid=fecha->tm_hour; gcvt(pid,2,hora); if (pid < 10) { hora[1] = hora[0]; hora[0] = '0'; } pid=fecha->tm_min; gcvt(pid,2,minuto); if (pid < 10) { minuto[1] = minuto[0]; minuto[0] = '0'; } pid=fecha->tm_sec; gcvt(pid,2,segundo); if (pid < 10) { segundo[1] = segundo[0]; segundo[0] = '0'; } if (fecha->tm_mday != fechag->tm_mday || fecha->tm_mon != fechag->tm_mon || fecha->tm_year != fechag->tm_year) { fechag = fecha; } pid=fechag->tm_mday; gcvt(pid,2,dia); if (pid < 10) { dia[1] = dia[0]; dia[0] = '0'; } pid=fechag->tm_mon+1; gcvt(pid,2,mes); if (pid < 10) { mes[1] = mes[0]; mes[0] = '0'; } pid=fechag->tm_year+1900; gcvt(pid,4,ano); strncpy (nombre,ano,4); nombre[4] = 0; strncat (nombre,mes,2); nombre[6] = 0; strncat (nombre,dia,2); nombre[8] = 0; strcat (nombre,"."); strcat (nombre,estacion); fich = fopen (nombre,"a+"); pid=fecha->tm_mday; gcvt(pid,2,dia); if (pid < 10) { dia[1] = dia[0]; dia[0] = '0'; } pid=fecha->tm_mon+1; gcvt(pid,2,mes); if (pid < 10) { mes[1] = mes[0]; mes[0] = '0'; } pid=fecha->tm_year+1900; gcvt(pid,4,ano); strncpy (nombre,ano,4); nombre[4] = '/'; nombre[5] = 0; strncat (nombre,mes,2); nombre[7] = '/'; nombre[8] = 0; strncat (nombre,dia,2); nombre[10] = 0; strcpy (informe.dia,nombre); strncpy (nombre,hora,2); nombre[2] = ':'; nombre[3] = 0; strncat (nombre,minuto,2); nombre[5] = ':'; nombre[6] = 0; strncat (nombre,segundo,2); nombre[8] = 0; strcpy (informe.hora,nombre); nombre[10] = 0; informe.surtidor[0] = '0'; if (i >= 10) { informe.surtidor[0] = '1'; informe.surtidor[1] = i - 10 + 0x30; } if (i < 10) { informe.surtidor[0] = '0'; informe.surtidor[1] = i + 0x30; } informe.manguera[0]= '0'; informe.manguera[1] = bloque->ultima[i]; ulti = bloque->ultima[i] - 0x30; /*informe.producto = bloque->surtidores[i].manguera[ulti].producto;*/ informe.producto = bloque->combustible[i].proc[ulti]; strncpy (informe.importe,bloque->surtidores[i].manguera[ulti].importe,5); strncpy (informe.precio,bloque->surtidores[i].manguera[ulti].precio,4); strncpy (informe.litros,bloque->surtidores[i].manguera[ulti].litros,5); num = fwrite (&informe,sizeof(tipo_informe),1,fich); fclose (fich); } saca_hora () { char ano[10]; char dia[10]; char mes[10]; char hora[10]; char minuto[10]; char segundo[10]; int fin=0; time_t clock; struct tm *fecha; double pid; clock=time(0); fecha=localtime(&clock); pid=fecha->tm_hour; gcvt(pid,2,hora); if (pid < 10) { hora[1] = hora[0]; hora[0] = '0'; } pid=fecha->tm_min; gcvt(pid,2,minuto); if (pid < 10) { minuto[1] = minuto[0]; minuto[0] = '0'; } pid=fecha->tm_sec; gcvt(pid,2,segundo); if (pid < 10) { segundo[1] = segundo[0]; segundo[0] = '0'; } pid=fecha->tm_mday; gcvt(pid,2,dia); if (pid < 10) { dia[1] = dia[0]; dia[0] = '0'; } pid=fecha->tm_mon+1; gcvt(pid,2,mes); if (pid < 10) { mes[1] = mes[0]; mes[0] = '0'; } pid=fecha->tm_year+1900; gcvt(pid,4,ano); lahora[0] = 0; strncat(lahora,ano,4); lahora[4] = '/'; lahora[5] = 0; strncat(lahora,mes,2); lahora[7] = '/'; lahora[8] = 0; strncat(lahora,dia,2); lahora[10] = ' '; lahora[11] = 0; strncat(lahora,hora,2); lahora[13] = ':'; lahora[14] = 0; strncat(lahora,minuto,2); lahora[16] = ':'; lahora[17] = 0; strncat(lahora,segundo,2); lahora[19] = 0; }