diff --git a/data/example_log_vr.bin b/data/example_log_vr.bin new file mode 100755 index 000000000..a7b9a7fc6 Binary files /dev/null and b/data/example_log_vr.bin differ diff --git a/examples/pybullet/examples/dumpVrLog.py b/examples/pybullet/examples/dumpVrLog.py new file mode 100644 index 000000000..0fe87cdf0 --- /dev/null +++ b/examples/pybullet/examples/dumpVrLog.py @@ -0,0 +1,108 @@ +import time +import math +from datetime import datetime +import struct +import sys +import os, fnmatch +import argparse +from time import sleep + +def readLogFile(filename, verbose = True): + f = open(filename, 'rb') + + print('Opened'), + print(filename) + + keys = f.readline().decode('utf8').rstrip('\n').split(',') + fmt = f.readline().decode('utf8').rstrip('\n') + + # The byte number of one record + sz = struct.calcsize(fmt) + # The type number of one record + ncols = len(fmt) + + if verbose: + print('Keys:'), + print(keys) + print('Format:'), + print(fmt) + print('Size:'), + print(sz) + print('Columns:'), + print(ncols) + + # Read data + wholeFile = f.read() + # split by alignment word + chunks = wholeFile.split(b'\xaa\xbb') + log = list() + if verbose: + print("num chunks:") + print(len(chunks)) + chunkIndex = 0 + for chunk in chunks: + print("len(chunk)=",len(chunk)," sz = ", sz) + if len(chunk) == sz: + print("chunk #",chunkIndex) + chunkIndex=chunkIndex+1 + values = struct.unpack(fmt, chunk) + record = list() + for i in range(ncols): + record.append(values[i]) + if verbose: + print(" ",keys[i],"=",values[i]) + + log.append(record) + + return log + + +numArgs = len(sys.argv) + +print ('Number of arguments:', numArgs, 'arguments.') +print ('Argument List:', str(sys.argv)) +fileName = "data/example_log_vr.bin" + +if (numArgs>1): + fileName = sys.argv[1] + +print("filename=") +print(fileName) + +verbose = True + +log = readLogFile(fileName,verbose) + +# the index of the first integer in the vr log file for packed buttons +firstPackedButtonIndex = 13 +# the number of packed buttons in one integer +numGroupedButtons = 10 +# the number of integers for packed buttons +numPackedButtons = 7 +# the mask to get the button state +buttonMask = 7 + +for record in log: + # indices of buttons that are down + buttonDownIndices = [] + # indices of buttons that are triggered + buttonTriggeredIndices = [] + # indices of buttons that are released + buttonReleasedIndices = [] + buttonIndex = 0 + for packedButtonIndex in range(firstPackedButtonIndex, firstPackedButtonIndex+numPackedButtons): + for packButtonShift in range(numGroupedButtons): + buttonEvent = buttonMask & record[packedButtonIndex] + if buttonEvent & 1: + buttonDownIndices.append(buttonIndex) + elif buttonEvent & 2: + buttonTriggeredIndices.append(buttonIndex) + elif buttonEvent & 4: + buttonReleasedIndices.append(buttonIndex) + record[packedButtonIndex] = record[packedButtonIndex] >> 3 + buttonIndex += 1 + if len(buttonDownIndices) or len(buttonTriggeredIndices) or len(buttonReleasedIndices): + print ('timestamp: ', record[1]) + print ('button is down: ', buttonDownIndices) + print ('button is triggered: ', buttonTriggeredIndices) + print ('button is released: ', buttonReleasedIndices)