Advertisement
gonzalob

Untitled

Mar 7th, 2022
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.67 KB | None | 0 0
  1. #include <stdint.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include "TpFinal.h"
  6.  
  7.  
  8. void Leer_Datos(emisora_t **d,const char* nombre_archivo,uint32_t *longitud)
  9. {
  10.  
  11. uint8_t i=0; //Cantidad de paquetes
  12. uint8_t *data_Completa=NULL;
  13. uint8_t Size=0;
  14. FILE *f = fopen(nombre_archivo,"rb"); //Abro un archivo binario para lectura
  15. if(f == NULL) // si f es distinto de NULL se abre el archivo
  16. {
  17. perror("No existe carpeta");
  18. exit(1); // termina el programa con un código de error
  19. }
  20.  
  21. while (getc(f)!=EOF) //getc retorta EOF si llega al final del archivo
  22. {
  23. fseek(f,-1,1); // Posiciono el puntero en el archivo
  24. fread(&(*d)->dato.H1,sizeof(uint8_t),1,f); //Recupero los datos
  25. if((*d)->dato.H1=='<') //Arranco la lectura si H1 corresponde a '<'
  26. {
  27. fread(&(*d)->dato.id,sizeof(uint8_t),1,f);
  28. i=(*d)->dato.id;
  29. fread(&(*d)->dato.dest,sizeof(uint8_t),1,f);
  30. if((*d)->dato.dest==1) //Sigo la lectura solo si el destinatario corresponde a 1
  31. {
  32. if (*longitud<(*d)->dato.id) //Realoco memoria cada vez que agrego un paquete con un id mayor.
  33. {
  34. *longitud=(*d)->dato.id;
  35. realocacion_memoria_struct(d,*longitud);
  36. }
  37. fread(&(*d)[i-1].dato.Size,sizeof(uint8_t),1,f);
  38. Size=(*d)[i-1].dato.Size+3; //Agrego los bytes del CRC
  39. Reservar_Memoria_Data(&(*d)[i-1].data,(*d)[i-1].dato.Size);
  40. fread((*d)[i-1].data,sizeof(uint8_t),(*d)[i-1].dato.Size,f);
  41. fread(&(*d)[i-1].crc,sizeof(uint16_t),1,f);
  42. data_Completa = (uint8_t *)calloc(Size,sizeof(uint8_t));
  43.  
  44. data_Completa[0] = i;
  45. data_Completa[1] = (*d)->dato.dest;
  46. data_Completa[2] = (*d)[i-1].dato.Size;
  47.  
  48.  
  49. for (int l=3;l<Size;l++)
  50. {
  51. data_Completa[l] = (*d)[i-1].data[l-3];
  52. }
  53.  
  54.  
  55. //strcat(data_Completa,); //+1
  56. //strcat(data_Completa,&(*d)[i-1].data); //+size
  57.  
  58.  
  59. //strcat(data_Completa,d[i-1]->dato.dest);
  60. /*
  61. for(int k=0;k<Size;k++)
  62. {
  63. printf("data_Completa %d\n",data_Completa[k]);
  64.  
  65. }
  66. */
  67. //printf("\n");
  68. (*d)[i-1].crc_comprobar=calculate_checksum(data_Completa,Size);
  69. fread(&(*d)->dato.H2,sizeof(uint8_t),1,f);
  70. //Uso el siguiente printf para ver si dan iguales o no
  71. // printf("\ni=%d, crc_comprobar= %d, crc data= %d ",i,(*d)[i-1].crc_comprobar,(*d)[i-1].crc);
  72. //PaqBorrado=Comprobar_CRC(*d,longitud,CRC_Comprobar,i,PaqBorrado);
  73. //printf("paq=%d",PaqBorrado);
  74. /* if((*d)[i-1].crc_comprobar!=0)
  75. {
  76. PaqBorrado = PaqBorrado +1;
  77. for (int x = i;x<*longitud;x++)
  78. {
  79. d[x-1]->data= d[x]->data; //piso los valores desde el siguiente
  80. }
  81. }*/
  82. }
  83. }
  84.  
  85. }
  86. }
  87.  
  88. //Funcion no necesaria para ejecutar el programa. Muestra en forma organizada los datos
  89. void Mostrar_Paquetes(emisora_t *d,uint32_t longitud)
  90. {
  91. printf("Mostrar_Paquetes: \n");
  92. for(int i=0;i<longitud+1;i++)
  93. {
  94.  
  95. printf("\n\n ID= %u, Size= %u, CRCCOM= %u CRC= %u\n",i,d[i-1].dato.Size,(d)[i-1].crc_comprobar,(d)[i-1].crc);
  96.  
  97. if((d)[i-1].crc_comprobar==(d)[i-1].crc)
  98. {
  99.  
  100. for (int j=0;j<d[i-1].dato.Size;j++)
  101. {
  102.  
  103. printf("data = (%u)%u ",j+1,d[i-1].data[j]);
  104. }
  105. }
  106.  
  107.  
  108. }
  109. }
  110.  
  111. //VERIFICACION CRC
  112. void calculate_checksum_ptr(uint8_t input[], uint16_t length, uint16_t *result)
  113. {
  114. static int16_t CRCPoly = 0xA001;
  115. static uint16_t i = 0;
  116. static uint8_t j = 0;
  117. static uint8_t data = 0;
  118. static uint8_t result_bit = 0;
  119. static uint8_t data_bit = 0;
  120.  
  121. // for every byte
  122. for (i = 0; i < length; i++) {
  123. data = input[i];
  124. // for every bit
  125. for (j = 0; j < 8; j++) {
  126. result_bit = *result & 0x1; // get LSbit
  127. *result = *result >> 1; // shift down
  128. data_bit = data & 0x1; // get LSbit
  129. data = data >> 1; // shift down
  130. if (result_bit != data_bit) {
  131. *result = *result ^ CRCPoly;
  132. }
  133. }
  134. }
  135. }
  136.  
  137. uint16_t calculate_checksum(uint8_t input[], uint16_t length)
  138. {
  139. uint16_t checksum = 0;
  140.  
  141. calculate_checksum_ptr(input, length, &checksum);
  142.  
  143.  
  144.  
  145.  
  146. return checksum;
  147. }
  148. /*
  149. uint8_t Comprobar_CRC(emisora_t *d,uint32_t *longitud,uint16_t CRC_Comprobar,uint8_t i,uint8_t PaqBorrado)
  150. {
  151.  
  152. if(CRC_Comprobar!=0) //Si retorta un valor distinto de cero, se descarta el paquete.
  153. {
  154. printf("crc_comprobar=%d",CRC_Comprobar);
  155. PaqBorrado=PaqBorrado+1;
  156. //printf("Se descarta el paquete debido a que no cumple la verificación por redundancia cíclica1(CRC)");
  157. for (uint8_t x = i;x<*longitud;x++)
  158. {
  159. printf("%d",d[i-1].data[x]);
  160. d[x-1].data = d[x].data; //piso los valores desde el siguiente
  161.  
  162.  
  163.  
  164. // d[x].data = d[x+1].data; //piso los valores desde el siguiente
  165. }
  166.  
  167. }
  168. return PaqBorrado;
  169. }*/
  170. void grabar_archivo_bmp(emisora_t *d, uint32_t longitud,char* nombre_archivo)
  171. {
  172. FILE *f = fopen(nombre_archivo,"wb"); //Creo un archivo binario para escritura.
  173. if (f==NULL)
  174. {
  175. printf("No se puede abrir.\n");
  176. }
  177. else
  178. {
  179. for(int i=0; i<longitud+1; i++)
  180. {
  181. if(d[i-1].crc_comprobar==0)
  182. {
  183. for (int j=0; j<d[i-1].dato.Size; j++)
  184. {
  185. printf("(%u)%u ",j+1,d[i-1].data[j]);
  186. fwrite(&d[i-1].data[j], sizeof(uint8_t),d[i-1].dato.Size, f); //Guardo los datos en el archivo bmp
  187. }
  188. }
  189. }
  190. }
  191. fclose(f);
  192.  
  193. }
  194. //Funcion para eliminar dentro de cada paquete cuando aparecen los simbolos '<' '>' dobles
  195. void Eliminar_doble(emisora_t *d,uint32_t longitud)
  196. {
  197. int cantidadBorrados = 0; //Declaro variable para luego modificar el Size
  198. for(int i=0; i<longitud+1; i++)
  199. {
  200. cantidadBorrados = 0;
  201. for (int j=0; j<d[i-1].dato.Size; j++)
  202. {
  203. if ((d[i-1].data[j]==60)||(d[i-1].data[j]==62)) //Busco la aparicion de '<' '>'
  204. {
  205. if ((d[i-1].data[j] == d[i-1].data[j+1]) && (j<d[i-1].dato.Size)) //Veo si el elemento que sigue es igual al actual y que el contador sea menor al Size
  206. {
  207. cantidadBorrados = cantidadBorrados +1;
  208. for (int x = j;x<d[i-1].dato.Size-1;x++)
  209. {
  210. d[i-1].data[x] = d[i-1].data[x+1]; //piso los valores desde el siguiente
  211. }
  212. }
  213. }
  214. }
  215. if (cantidadBorrados>0) //si se borraron elementos, modifico el tamaño del paquete
  216. {
  217. d[i-1].dato.Size = d[i-1].dato.Size - cantidadBorrados;
  218. }
  219. }
  220.  
  221. }
  222.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement