#include <stdio.h>
#include <stdint.h>
#include <fcntl.h>
#include <string.h>
#define BIN_IN_FILE_PERMS ("rb") // READ ONLY
#define BIN_OUT_FILE_PERMS ("wb") // READ/WRITE for owner, group and others
# define XOR_SWAP(a,b) do\
{\
a ^= b;\
b ^= a;\
a ^= b;\
} while (0)
/**
TODO: re-define the size to optimal block size of the actual device you are
trying to read from or the max buffer you can have because of memory constraints
**/
#define MAX_ACCEL_READ_BYTES 16
#define MAX_WRITE_BYTES 16
#define MAX_LAST_VALUES 32
#define SIZE_OF_EACH_ACCEL_READ 12
#define log_write printf
uint8_t buffer_write(uint8_t dest_buf[], uint8_t src_buf[], uint8_t size)
{
int i;
for(i=0;i<size-1;i++)
dest_buf[i] = src_buf[i];
dest_buf[size-1] = '\r';
dest_buf[size] = '\n';
return (size+1);
}
int main(int argc, char *argv[])
{
FILE *bin_in_file_desc, *bin_out_file_desc;
uint32_t num_of_bytes_read;
uint8_t byte_read_buffer[MAX_ACCEL_READ_BYTES];
uint8_t byte_write_buffer[MAX_WRITE_BYTES];
uint8_t sorted_signature[] = "--Sorted Max 32 Values--";
uint8_t last_32_signature[] = "--Last 32 Values--";
uint8_t last_32_values = ((SIZE_OF_EACH_ACCEL_READ * MAX_LAST_VALUES)/8);
uint32_t bin_in_file_size;
uint32_t accel_data = 0;
uint8_t bytes_written = 0;
int i;
int a=35,b=34;
XOR_SWAP(a, b);
printf("main: swap %d %d\n", a, b);
if (argc!=3)
{
log_write("Usage: %s infile outfile\n", argv[0]);
return 1;
}
// open input file for read in binary mode
if ((bin_in_file_desc = fopen(argv[1], BIN_IN_FILE_PERMS)) == NULL)
log_write("%s: can't open %s\n", argv[0], argv[1]);
// create output file for writing in binary mode
if ((bin_out_file_desc = fopen(argv[2], "wb")) == NULL)
log_write("%s: can't create %s with MODE %03o\n", argv[0], argv[2], BIN_OUT_FILE_PERMS);
// calculate file size
fseek (bin_in_file_desc , 0 , SEEK_END);
bin_in_file_size = ftell (bin_in_file_desc);
rewind (bin_in_file_desc);
printf("main: bin_in_file_size:%d last_32_values:%d\n", bin_in_file_size, last_32_values);
//start_entry = ((bin_in_file_size*8)/12)-32)
bytes_written = buffer_write(byte_write_buffer, sorted_signature, sizeof(sorted_signature));
fwrite(byte_write_buffer, sizeof(char), bytes_written, bin_out_file_desc);
while ((num_of_bytes_read = fread(byte_read_buffer, sizeof(uint8_t), MAX_ACCEL_READ_BYTES , bin_in_file_desc)) > 0)
{
//printf("main: num_of_bytes_read:%d\n", num_of_bytes_read);
#if 0
for(i=0;i<num_of_bytes_read;i++)
{
if ((i!=0)&&(i&1))
printf("%x %x ", (byte_read_buffer[i]&0xF0)>>4, (byte_read_buffer[i]&0xF));
printf("%x ", byte_read_buffer[i]);
if ((i!=0)&&((i%8)==0)) printf("\n");
//if(i&1)
//printf("%x \n%x", (byte_read_buffer[i]&0xF0)>>4, (byte_read_buffer[i]&0xF));
//else
//printf("%x %x ", (byte_read_buffer[i]&0xF0)>>4, (byte_read_buffer[i]&0xF));
}
accel_data = (uint32_t) (byte_write_buffer[0] | byte_write_buffer[1] << 8);
memcpy(byte_write_buffer, byte_read_buffer, 3);
memcpy(byte_write_buffer+3, "\n", 1);
//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]);
//fwrite(byte_write_buffer, sizeof(uint8_t), 3, bin_out_file_desc);
//fwrite(byte_write_buffer, sizeof(uint8_t), num_of_bytes_read, bin_out_file_desc);
#endif
}
//fseek (bin_in_file_desc , -last_32_values , SEEK_END);
fseek (bin_in_file_desc , -2 , SEEK_END);
// calculate file size
//fseek (bin_in_file_desc , , SEEK_END);
//bin_in_file_size = ftell (bin_in_file_desc);
//rewind (bin_in_file_desc);
//printf("main: bin_in_file_size:%d last_32_values:%d\n", bin_in_file_size, last_32_values);
bytes_written = buffer_write(byte_write_buffer, last_32_signature, sizeof(last_32_signature));
fwrite(byte_write_buffer, sizeof(char), bytes_written, bin_out_file_desc);
//fwrite(signature_last_32, sizeof(char), sizeof(signature_last_32), bin_out_file_desc);
//while ((num_of_bytes_read = fread(byte_read_buffer, sizeof(uint8_t), MAX_ACCEL_READ_BYTES , bin_in_file_desc)) > 0)
num_of_bytes_read = fread(byte_read_buffer, sizeof(uint8_t), MAX_ACCEL_READ_BYTES , bin_in_file_desc);
{
printf("main: num_of_bytes_read:%d\n", num_of_bytes_read);
for(i=0;i<num_of_bytes_read-1;i+=2)
{
accel_data = (byte_read_buffer[i]&0xF0)<<4;
accel_data = accel_data | ((byte_read_buffer[i+1]&0xF));
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);
}
byte_write_buffer[0] = 0x36; //byte_read_buffer[0];
byte_write_buffer[1] = 0x38; //(byte_read_buffer[1]&0xF0)>>4;
byte_write_buffer[2] = '\r';
byte_write_buffer[3] = '\n';
//memcpy(byte_write_buffer, byte_write_buffer, 2);
//memcpy(byte_write_buffer+2, "\n", 1);
//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);
fwrite(byte_write_buffer, sizeof(uint8_t), 4, bin_out_file_desc);
}
//flush
fclose(bin_in_file_desc);
fclose(bin_out_file_desc);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRpbnQuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCiNkZWZpbmUgQklOX0lOX0ZJTEVfUEVSTVMgKCJyYiIpIC8vIFJFQUQgT05MWQojZGVmaW5lIEJJTl9PVVRfRklMRV9QRVJNUyAoIndiIikgLy8gUkVBRC9XUklURSBmb3Igb3duZXIsIGdyb3VwIGFuZCBvdGhlcnMKIyBkZWZpbmUgWE9SX1NXQVAoYSxiKSBkb1wKICAgIHtcCiAgICAgIGEgXj0gYjtcCiAgICAgIGIgXj0gYTtcCiAgICAgIGEgXj0gYjtcCiAgICB9IHdoaWxlICgwKQovKiogCiAgIFRPRE86IHJlLWRlZmluZSB0aGUgc2l6ZSB0byBvcHRpbWFsIGJsb2NrIHNpemUgb2YgdGhlIGFjdHVhbCBkZXZpY2UgeW91IGFyZSAKICAgdHJ5aW5nIHRvIHJlYWQgZnJvbSBvciB0aGUgbWF4IGJ1ZmZlciB5b3UgY2FuIGhhdmUgYmVjYXVzZSBvZiBtZW1vcnkgY29uc3RyYWludHMKKiovCiNkZWZpbmUgTUFYX0FDQ0VMX1JFQURfQllURVMgMTYKI2RlZmluZSBNQVhfV1JJVEVfQllURVMgMTYKI2RlZmluZSBNQVhfTEFTVF9WQUxVRVMgMzIKI2RlZmluZSBTSVpFX09GX0VBQ0hfQUNDRUxfUkVBRCAxMgojZGVmaW5lIGxvZ193cml0ZSBwcmludGYKCgp1aW50OF90IGJ1ZmZlcl93cml0ZSh1aW50OF90IGRlc3RfYnVmW10sIHVpbnQ4X3Qgc3JjX2J1ZltdLCB1aW50OF90IHNpemUpCnsKCWludCBpOwogIAlmb3IoaT0wO2k8c2l6ZS0xO2krKykKCQlkZXN0X2J1ZltpXSA9IHNyY19idWZbaV07CglkZXN0X2J1ZltzaXplLTFdID0gJ1xyJzsKCWRlc3RfYnVmW3NpemVdID0gJ1xuJzsKCXJldHVybiAoc2l6ZSsxKTsKfQoKCmludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCnsKCUZJTEUgKmJpbl9pbl9maWxlX2Rlc2MsICpiaW5fb3V0X2ZpbGVfZGVzYzsKCXVpbnQzMl90IG51bV9vZl9ieXRlc19yZWFkOwoJdWludDhfdCBieXRlX3JlYWRfYnVmZmVyW01BWF9BQ0NFTF9SRUFEX0JZVEVTXTsKCXVpbnQ4X3QgYnl0ZV93cml0ZV9idWZmZXJbTUFYX1dSSVRFX0JZVEVTXTsKCXVpbnQ4X3Qgc29ydGVkX3NpZ25hdHVyZVtdID0gIi0tU29ydGVkIE1heCAzMiBWYWx1ZXMtLSI7Cgl1aW50OF90IGxhc3RfMzJfc2lnbmF0dXJlW10gPSAiLS1MYXN0IDMyIFZhbHVlcy0tIjsKCXVpbnQ4X3QgbGFzdF8zMl92YWx1ZXMgPSAoKFNJWkVfT0ZfRUFDSF9BQ0NFTF9SRUFEICogTUFYX0xBU1RfVkFMVUVTKS84KTsJCQoJdWludDMyX3QgYmluX2luX2ZpbGVfc2l6ZTsKCXVpbnQzMl90IGFjY2VsX2RhdGEgPSAwOwoJdWludDhfdCBieXRlc193cml0dGVuID0gMDsKCWludCBpOwoJaW50IGE9MzUsYj0zNDsKCVhPUl9TV0FQKGEsIGIpOwoJcHJpbnRmKCJtYWluOiBzd2FwICVkICVkXG4iLCBhLCBiKTsKCWlmIChhcmdjIT0zKQoJewoJCWxvZ193cml0ZSgiVXNhZ2U6ICVzIGluZmlsZSBvdXRmaWxlXG4iLCBhcmd2WzBdKTsKCQlyZXR1cm4gMTsKCX0KCQoJLy8gb3BlbiBpbnB1dCBmaWxlIGZvciByZWFkIGluIGJpbmFyeSBtb2RlCglpZiAoKGJpbl9pbl9maWxlX2Rlc2MgPSBmb3Blbihhcmd2WzFdLCBCSU5fSU5fRklMRV9QRVJNUykpID09IE5VTEwpCgkJbG9nX3dyaXRlKCIlczogY2FuJ3Qgb3BlbiAlc1xuIiwgYXJndlswXSwgYXJndlsxXSk7CgoJLy8gY3JlYXRlIG91dHB1dCBmaWxlIGZvciB3cml0aW5nIGluIGJpbmFyeSBtb2RlCglpZiAoKGJpbl9vdXRfZmlsZV9kZXNjID0gZm9wZW4oYXJndlsyXSwgIndiIikpID09IE5VTEwpCgkJbG9nX3dyaXRlKCIlczogY2FuJ3QgY3JlYXRlICVzIHdpdGggTU9ERSAlMDNvXG4iLCBhcmd2WzBdLCBhcmd2WzJdLCBCSU5fT1VUX0ZJTEVfUEVSTVMpOwoJCgkvLyBjYWxjdWxhdGUgZmlsZSBzaXplCglmc2VlayAoYmluX2luX2ZpbGVfZGVzYyAsIDAgLCBTRUVLX0VORCk7CiAgCWJpbl9pbl9maWxlX3NpemUgPSBmdGVsbCAoYmluX2luX2ZpbGVfZGVzYyk7CiAgCXJld2luZCAoYmluX2luX2ZpbGVfZGVzYyk7CgoJcHJpbnRmKCJtYWluOiBiaW5faW5fZmlsZV9zaXplOiVkIGxhc3RfMzJfdmFsdWVzOiVkXG4iLCBiaW5faW5fZmlsZV9zaXplLCBsYXN0XzMyX3ZhbHVlcyk7CgoJLy9zdGFydF9lbnRyeSA9ICgoYmluX2luX2ZpbGVfc2l6ZSo4KS8xMiktMzIpCgkKCglieXRlc193cml0dGVuID0gYnVmZmVyX3dyaXRlKGJ5dGVfd3JpdGVfYnVmZmVyLCBzb3J0ZWRfc2lnbmF0dXJlLCBzaXplb2Yoc29ydGVkX3NpZ25hdHVyZSkpOwoJZndyaXRlKGJ5dGVfd3JpdGVfYnVmZmVyLCBzaXplb2YoY2hhciksIGJ5dGVzX3dyaXR0ZW4sIGJpbl9vdXRfZmlsZV9kZXNjKTsKCXdoaWxlICgobnVtX29mX2J5dGVzX3JlYWQgPSBmcmVhZChieXRlX3JlYWRfYnVmZmVyLCBzaXplb2YodWludDhfdCksIE1BWF9BQ0NFTF9SRUFEX0JZVEVTICwgYmluX2luX2ZpbGVfZGVzYykpID4gMCkKCXsKCQkvL3ByaW50ZigibWFpbjogbnVtX29mX2J5dGVzX3JlYWQ6JWRcbiIsIG51bV9vZl9ieXRlc19yZWFkKTsKCQkKI2lmIDAKCQlmb3IoaT0wO2k8bnVtX29mX2J5dGVzX3JlYWQ7aSsrKQoJCXsKCQkJaWYgKChpIT0wKSYmKGkmMSkpCgkJCQlwcmludGYoIiV4ICV4ICIsIChieXRlX3JlYWRfYnVmZmVyW2ldJjB4RjApPj40LCAoYnl0ZV9yZWFkX2J1ZmZlcltpXSYweEYpKTsKCQkJcHJpbnRmKCIleCAiLCBieXRlX3JlYWRfYnVmZmVyW2ldKTsKCQkJaWYgKChpIT0wKSYmKChpJTgpPT0wKSkgcHJpbnRmKCJcbiIpOwoJCSAgIC8vaWYoaSYxKQoJCSAvL3ByaW50ZigiJXggXG4leCIsIChieXRlX3JlYWRfYnVmZmVyW2ldJjB4RjApPj40LCAoYnl0ZV9yZWFkX2J1ZmZlcltpXSYweEYpKTsKCQkgICAvL2Vsc2UKCQkJLy9wcmludGYoIiV4ICV4ICIsIChieXRlX3JlYWRfYnVmZmVyW2ldJjB4RjApPj40LCAoYnl0ZV9yZWFkX2J1ZmZlcltpXSYweEYpKTsKCQl9CgkJYWNjZWxfZGF0YSA9ICh1aW50MzJfdCkgKGJ5dGVfd3JpdGVfYnVmZmVyWzBdIHwgYnl0ZV93cml0ZV9idWZmZXJbMV0gPDwgOCk7CgkJbWVtY3B5KGJ5dGVfd3JpdGVfYnVmZmVyLCBieXRlX3JlYWRfYnVmZmVyLCAzKTsKCQltZW1jcHkoYnl0ZV93cml0ZV9idWZmZXIrMywgIlxuIiwgMSk7CgkJLy9wcmludGYoIm1haW46IGJ5dGVfd3JpdGVfYnVmZmVyOjB4JTAxeCAweCUwMXggMHglMDF4IDB4JTAxeFxuIiwgYnl0ZV93cml0ZV9idWZmZXJbMF0sIGJ5dGVfd3JpdGVfYnVmZmVyWzFdLCBieXRlX3dyaXRlX2J1ZmZlclsyXSwgYnl0ZV93cml0ZV9idWZmZXJbM10pOwoJCQoJCS8vZndyaXRlKGJ5dGVfd3JpdGVfYnVmZmVyLCBzaXplb2YodWludDhfdCksIDMsIGJpbl9vdXRfZmlsZV9kZXNjKTsKCQkKCQkvL2Z3cml0ZShieXRlX3dyaXRlX2J1ZmZlciwgc2l6ZW9mKHVpbnQ4X3QpLCBudW1fb2ZfYnl0ZXNfcmVhZCwgYmluX291dF9maWxlX2Rlc2MpOwkKI2VuZGlmCgkJCgl9CgoJLy9mc2VlayAoYmluX2luX2ZpbGVfZGVzYyAsIC1sYXN0XzMyX3ZhbHVlcyAsIFNFRUtfRU5EKTsKCWZzZWVrIChiaW5faW5fZmlsZV9kZXNjICwgLTIgLCBTRUVLX0VORCk7CgkvLyBjYWxjdWxhdGUgZmlsZSBzaXplCgkvL2ZzZWVrIChiaW5faW5fZmlsZV9kZXNjICwgICwgU0VFS19FTkQpOwogIAkvL2Jpbl9pbl9maWxlX3NpemUgPSBmdGVsbCAoYmluX2luX2ZpbGVfZGVzYyk7CiAgCS8vcmV3aW5kIChiaW5faW5fZmlsZV9kZXNjKTsKCS8vcHJpbnRmKCJtYWluOiBiaW5faW5fZmlsZV9zaXplOiVkIGxhc3RfMzJfdmFsdWVzOiVkXG4iLCBiaW5faW5fZmlsZV9zaXplLCBsYXN0XzMyX3ZhbHVlcyk7CgoKCglieXRlc193cml0dGVuID0gYnVmZmVyX3dyaXRlKGJ5dGVfd3JpdGVfYnVmZmVyLCBsYXN0XzMyX3NpZ25hdHVyZSwgc2l6ZW9mKGxhc3RfMzJfc2lnbmF0dXJlKSk7Cglmd3JpdGUoYnl0ZV93cml0ZV9idWZmZXIsIHNpemVvZihjaGFyKSwgYnl0ZXNfd3JpdHRlbiwgYmluX291dF9maWxlX2Rlc2MpOwoKCS8vZndyaXRlKHNpZ25hdHVyZV9sYXN0XzMyLCBzaXplb2YoY2hhciksIHNpemVvZihzaWduYXR1cmVfbGFzdF8zMiksIGJpbl9vdXRfZmlsZV9kZXNjKTsKCS8vd2hpbGUgKChudW1fb2ZfYnl0ZXNfcmVhZCA9IGZyZWFkKGJ5dGVfcmVhZF9idWZmZXIsIHNpemVvZih1aW50OF90KSwgTUFYX0FDQ0VMX1JFQURfQllURVMgLCBiaW5faW5fZmlsZV9kZXNjKSkgPiAwKQoJbnVtX29mX2J5dGVzX3JlYWQgPSBmcmVhZChieXRlX3JlYWRfYnVmZmVyLCBzaXplb2YodWludDhfdCksIE1BWF9BQ0NFTF9SRUFEX0JZVEVTICwgYmluX2luX2ZpbGVfZGVzYyk7Cgl7CgkJcHJpbnRmKCJtYWluOiBudW1fb2ZfYnl0ZXNfcmVhZDolZFxuIiwgbnVtX29mX2J5dGVzX3JlYWQpOwoJCQoJCWZvcihpPTA7aTxudW1fb2ZfYnl0ZXNfcmVhZC0xO2krPTIpCgkJewoJCQlhY2NlbF9kYXRhID0gKGJ5dGVfcmVhZF9idWZmZXJbaV0mMHhGMCk8PDQ7CgkJCWFjY2VsX2RhdGEgPSBhY2NlbF9kYXRhIHwgKChieXRlX3JlYWRfYnVmZmVyW2krMV0mMHhGKSk7CgkJCXByaW50ZigiYnl0ZV9yZWFkX2J1ZmZlclslZF06JTB4ICUweCAlMHggJTB4IGFjY2VsX2RhdGE6MHglMDR4XG4iLCBpLCBieXRlX3JlYWRfYnVmZmVyW2ldLCAoKGJ5dGVfcmVhZF9idWZmZXJbaV0mMHhGMCk+PjQpLCBieXRlX3JlYWRfYnVmZmVyW2krMV0sIGJ5dGVfcmVhZF9idWZmZXJbaSsxXSwgYWNjZWxfZGF0YSk7CgkJfQoJCQoJCWJ5dGVfd3JpdGVfYnVmZmVyWzBdID0gMHgzNjsgLy9ieXRlX3JlYWRfYnVmZmVyWzBdOwoJCWJ5dGVfd3JpdGVfYnVmZmVyWzFdID0gMHgzODsgLy8oYnl0ZV9yZWFkX2J1ZmZlclsxXSYweEYwKT4+NDsKCQlieXRlX3dyaXRlX2J1ZmZlclsyXSA9ICdccic7CgkJYnl0ZV93cml0ZV9idWZmZXJbM10gPSAnXG4nOwoJCS8vbWVtY3B5KGJ5dGVfd3JpdGVfYnVmZmVyLCBieXRlX3dyaXRlX2J1ZmZlciwgMik7CgkJLy9tZW1jcHkoYnl0ZV93cml0ZV9idWZmZXIrMiwgIlxuIiwgMSk7CgkJLy9wcmludGYoIm1haW46IGJ5dGVfd3JpdGVfYnVmZmVyOjB4JTB4IDB4JTB4IDB4JTB4ICAweCUweCAweCUweCAweCUweFxuIiwgYnl0ZV93cml0ZV9idWZmZXJbMF08PDQsIGJ5dGVfd3JpdGVfYnVmZmVyWzFdPj40LCBieXRlX3dyaXRlX2J1ZmZlclsyXT4+NCwgYnl0ZV93cml0ZV9idWZmZXJbMF08PDQsIGJ5dGVfd3JpdGVfYnVmZmVyWzFdPDw0LCBieXRlX3dyaXRlX2J1ZmZlclsyXTw8NCk7CgkKCQlmd3JpdGUoYnl0ZV93cml0ZV9idWZmZXIsIHNpemVvZih1aW50OF90KSwgNCwgYmluX291dF9maWxlX2Rlc2MpOwkKCgkJCgl9CgoJCgkvL2ZsdXNoCglmY2xvc2UoYmluX2luX2ZpbGVfZGVzYyk7CglmY2xvc2UoYmluX291dF9maWxlX2Rlc2MpOwoJcmV0dXJuIDA7CQp9