fork download
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <fcntl.h>
  4. #include <string.h>
  5.  
  6. #define BIN_IN_FILE_PERMS ("rb") // READ ONLY
  7. #define BIN_OUT_FILE_PERMS ("wb") // READ/WRITE for owner, group and others
  8. # define XOR_SWAP(a,b) do\
  9.   {\
  10.   a ^= b;\
  11.   b ^= a;\
  12.   a ^= b;\
  13.   } while (0)
  14. /**
  15.   TODO: re-define the size to optimal block size of the actual device you are
  16.   trying to read from or the max buffer you can have because of memory constraints
  17. **/
  18. #define MAX_ACCEL_READ_BYTES 16
  19. #define MAX_WRITE_BYTES 16
  20. #define MAX_LAST_VALUES 32
  21. #define SIZE_OF_EACH_ACCEL_READ 12
  22. #define log_write printf
  23.  
  24.  
  25. uint8_t buffer_write(uint8_t dest_buf[], uint8_t src_buf[], uint8_t size)
  26. {
  27. int i;
  28. for(i=0;i<size-1;i++)
  29. dest_buf[i] = src_buf[i];
  30. dest_buf[size-1] = '\r';
  31. dest_buf[size] = '\n';
  32. return (size+1);
  33. }
  34.  
  35.  
  36. int main(int argc, char *argv[])
  37. {
  38. FILE *bin_in_file_desc, *bin_out_file_desc;
  39. uint32_t num_of_bytes_read;
  40. uint8_t byte_read_buffer[MAX_ACCEL_READ_BYTES];
  41. uint8_t byte_write_buffer[MAX_WRITE_BYTES];
  42. uint8_t sorted_signature[] = "--Sorted Max 32 Values--";
  43. uint8_t last_32_signature[] = "--Last 32 Values--";
  44. uint8_t last_32_values = ((SIZE_OF_EACH_ACCEL_READ * MAX_LAST_VALUES)/8);
  45. uint32_t bin_in_file_size;
  46. uint32_t accel_data = 0;
  47. uint8_t bytes_written = 0;
  48. int i;
  49. int a=35,b=34;
  50. XOR_SWAP(a, b);
  51. printf("main: swap %d %d\n", a, b);
  52. if (argc!=3)
  53. {
  54. log_write("Usage: %s infile outfile\n", argv[0]);
  55. return 1;
  56. }
  57.  
  58. // open input file for read in binary mode
  59. if ((bin_in_file_desc = fopen(argv[1], BIN_IN_FILE_PERMS)) == NULL)
  60. log_write("%s: can't open %s\n", argv[0], argv[1]);
  61.  
  62. // create output file for writing in binary mode
  63. if ((bin_out_file_desc = fopen(argv[2], "wb")) == NULL)
  64. log_write("%s: can't create %s with MODE %03o\n", argv[0], argv[2], BIN_OUT_FILE_PERMS);
  65.  
  66. // calculate file size
  67. fseek (bin_in_file_desc , 0 , SEEK_END);
  68. bin_in_file_size = ftell (bin_in_file_desc);
  69. rewind (bin_in_file_desc);
  70.  
  71. printf("main: bin_in_file_size:%d last_32_values:%d\n", bin_in_file_size, last_32_values);
  72.  
  73. //start_entry = ((bin_in_file_size*8)/12)-32)
  74.  
  75.  
  76. bytes_written = buffer_write(byte_write_buffer, sorted_signature, sizeof(sorted_signature));
  77. fwrite(byte_write_buffer, sizeof(char), bytes_written, bin_out_file_desc);
  78. while ((num_of_bytes_read = fread(byte_read_buffer, sizeof(uint8_t), MAX_ACCEL_READ_BYTES , bin_in_file_desc)) > 0)
  79. {
  80. //printf("main: num_of_bytes_read:%d\n", num_of_bytes_read);
  81.  
  82. #if 0
  83. for(i=0;i<num_of_bytes_read;i++)
  84. {
  85. if ((i!=0)&&(i&1))
  86. printf("%x %x ", (byte_read_buffer[i]&0xF0)>>4, (byte_read_buffer[i]&0xF));
  87. printf("%x ", byte_read_buffer[i]);
  88. if ((i!=0)&&((i%8)==0)) printf("\n");
  89. //if(i&1)
  90. //printf("%x \n%x", (byte_read_buffer[i]&0xF0)>>4, (byte_read_buffer[i]&0xF));
  91. //else
  92. //printf("%x %x ", (byte_read_buffer[i]&0xF0)>>4, (byte_read_buffer[i]&0xF));
  93. }
  94. accel_data = (uint32_t) (byte_write_buffer[0] | byte_write_buffer[1] << 8);
  95. memcpy(byte_write_buffer, byte_read_buffer, 3);
  96. memcpy(byte_write_buffer+3, "\n", 1);
  97. //printf("main: byte_write_buffer:0x%01x 0x%01x 0x%01x 0x%01x\n", byte_write_buffer[0], byte_write_buffer[1], byte_write_buffer[2], byte_write_buffer[3]);
  98.  
  99. //fwrite(byte_write_buffer, sizeof(uint8_t), 3, bin_out_file_desc);
  100.  
  101. //fwrite(byte_write_buffer, sizeof(uint8_t), num_of_bytes_read, bin_out_file_desc);
  102. #endif
  103.  
  104. }
  105.  
  106. //fseek (bin_in_file_desc , -last_32_values , SEEK_END);
  107. fseek (bin_in_file_desc , -2 , SEEK_END);
  108. // calculate file size
  109. //fseek (bin_in_file_desc , , SEEK_END);
  110. //bin_in_file_size = ftell (bin_in_file_desc);
  111. //rewind (bin_in_file_desc);
  112. //printf("main: bin_in_file_size:%d last_32_values:%d\n", bin_in_file_size, last_32_values);
  113.  
  114.  
  115.  
  116. bytes_written = buffer_write(byte_write_buffer, last_32_signature, sizeof(last_32_signature));
  117. fwrite(byte_write_buffer, sizeof(char), bytes_written, bin_out_file_desc);
  118.  
  119. //fwrite(signature_last_32, sizeof(char), sizeof(signature_last_32), bin_out_file_desc);
  120. //while ((num_of_bytes_read = fread(byte_read_buffer, sizeof(uint8_t), MAX_ACCEL_READ_BYTES , bin_in_file_desc)) > 0)
  121. num_of_bytes_read = fread(byte_read_buffer, sizeof(uint8_t), MAX_ACCEL_READ_BYTES , bin_in_file_desc);
  122. {
  123. printf("main: num_of_bytes_read:%d\n", num_of_bytes_read);
  124.  
  125. for(i=0;i<num_of_bytes_read-1;i+=2)
  126. {
  127. accel_data = (byte_read_buffer[i]&0xF0)<<4;
  128. accel_data = accel_data | ((byte_read_buffer[i+1]&0xF));
  129. printf("byte_read_buffer[%d]:%0x %0x %0x %0x accel_data:0x%04x\n", i, byte_read_buffer[i], ((byte_read_buffer[i]&0xF0)>>4), byte_read_buffer[i+1], byte_read_buffer[i+1], accel_data);
  130. }
  131.  
  132. byte_write_buffer[0] = 0x36; //byte_read_buffer[0];
  133. byte_write_buffer[1] = 0x38; //(byte_read_buffer[1]&0xF0)>>4;
  134. byte_write_buffer[2] = '\r';
  135. byte_write_buffer[3] = '\n';
  136. //memcpy(byte_write_buffer, byte_write_buffer, 2);
  137. //memcpy(byte_write_buffer+2, "\n", 1);
  138. //printf("main: byte_write_buffer:0x%0x 0x%0x 0x%0x 0x%0x 0x%0x 0x%0x\n", byte_write_buffer[0]<<4, byte_write_buffer[1]>>4, byte_write_buffer[2]>>4, byte_write_buffer[0]<<4, byte_write_buffer[1]<<4, byte_write_buffer[2]<<4);
  139.  
  140. fwrite(byte_write_buffer, sizeof(uint8_t), 4, bin_out_file_desc);
  141.  
  142.  
  143. }
  144.  
  145.  
  146. //flush
  147. fclose(bin_in_file_desc);
  148. fclose(bin_out_file_desc);
  149. return 0;
  150. }
Runtime error #stdin #stdout 0s 3412KB
stdin
Standard input is empty
stdout
main: swap 34 35
Usage: ./prog infile outfile