Skip to content

Instantly share code, notes, and snippets.

@MoLow
Created May 30, 2016 06:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save MoLow/31fc58eca2b8059a20328ead7a68668b to your computer and use it in GitHub Desktop.
Save MoLow/31fc58eca2b8059a20328ead7a68668b to your computer and use it in GitHub Desktop.
#include <stdio.h>;
#define kTocMetaData (1L<<1)
#define kTocRawData (1L<<3)
#define kTocDAQmxRawData (1L<<7)
#define kTocInterleavedData (1L<<5)
#define kTocBigEndian (1L<<6)
#define kTocNewObjList (1L<<2)
typedef enum {
tdsTypeVoid,
tdsTypeI8,
tdsTypeI16,
tdsTypeI32,
tdsTypeI64,
tdsTypeU8,
tdsTypeU16,
tdsTypeU32,
tdsTypeU64,
tdsTypeSingleFloat,
tdsTypeDoubleFloat,
tdsTypeExtendedFloat,
tdsTypeSingleFloatWithUnit = 0x19,
tdsTypeDoubleFloatWithUnit,
tdsTypeExtendedFloatWithUnit,
tdsTypeString = 0x20,
tdsTypeBoolean = 0x21,
tdsTypeTimeStamp = 0x44,
tdsTypeFixedPoint = 0x4F,
tdsTypeComplexSingleFloat = 0x08000c,
tdsTypeComplexDoubleFloat = 0x10000d,
tdsTypeDAQmxRawData = 0xFFFFFFFF
} tdsDataType;
typedef struct
{
unsigned int path_length;
tdsDataType data_type;
char *path;
} metadata_item;
typedef struct {
unsigned int items_count;
unsigned int cursor;
metadata_item *items;
} metadata;
char *filename = "sample.tdms";
char *get_segment(const char *file, unsigned long long int offset, unsigned long long int length){
FILE *ptr = fopen(file, "rb");
char *result = (char *)malloc(length + 1);
fseek(ptr, offset, SEEK_SET);
fread(result, sizeof(char), length, ptr);
result[length] = 0;
fclose(ptr);
return result;
}
void read_metadata(int start){
char *buf = get_segment(filename, start, 4);
metadata md;
struct metadata_item * items = malloc((sizeof(metadata_item)) * (md.items_count = toUint32(buf, 0, 4, 0))); //create array of metadata items
md.cursor = start + 4;
md.items = items;
free(buf);
for (int i = 0; i < md.items_count; i++){
//read length of path and then path
md.items[i].path_length = toUint32(buf = get_segment(filename, (md.cursor += 4) - 4, 4), 0, 4, 0);
md.items[i].path = get_segment(filename, (md.cursor += md.items[i].path_length) - md.items[i].path_length, md.items[i].path_length);
unsigned int rawDataIndexLength = toUint32(buf = get_segment(filename, (md.cursor += 4) - 4, 4), 0, 4, 0);
md.items[i].data_type =(tdsDataType)toUint32(buf = get_segment(filename, (md.cursor += 4) - 4, 4), 0, 4, 0);
}
}
unsigned long long int toUint64(char * buffer, int start, int length, int bigEndian){
unsigned long long int result = (unsigned long long int)buffer[start], m = 8;
for (int i = start + 1; i < start + length; i++){
result = result | (unsigned long long int)buffer[i] << m;
m += 8;
}
return result;
}
unsigned int toUint32(char * buffer, int start, int length, int bigEndian){
unsigned int result = (unsigned int)buffer[start], m = 8;
for (int i = start + 1; i < start + length; i++){
result = result | (unsigned int)buffer[i] << m;
m += 8;
}
return result;
}
int main(){
printf("RoadMap\n-------------------- -\nMenu:\n1. Obstacle acquisition.\n2. Generate PRM and find shortest path.\n3. Temperature check.\n4. Plot.\n5. Students addition\n6. Exit.\n");
int input = 0;
while (1){
printf("Enter choice:\n");
scanf("%d", &input);
if (input == 1){
char *leadin = get_segment(filename, 0, 28);
printf("TDMS version - %d\n", toUint32(leadin, 8, 4, 0));
free(leadin);
read_metadata(28);
}
else if (input == 2)
exit();
else if (input == 3)
exit();
else if (input == 4)
exit();
else if (input == 5)
exit();
else if (input == 6){
printf("Bye Bye!\n");
exit(1);
}
else
printf("Error: unkonwn input\n");
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment