X-Git-Url: http://git.tremily.us/?p=hooke.git;a=blobdiff_plain;f=hooke%2Fdriver%2Fjpk.py;h=bc13761b8c5d2da637b95d9d4a53311ebdb1b5d7;hp=2cbb852d627ec5e93ccbeb928ce1dbce18b54e64;hb=38c7cee99afe427b9c5a2b17b6ab9f92fddb1c1c;hpb=565f9d7b69d2e4a9ea447d7a50f8f835c3e08642 diff --git a/hooke/driver/jpk.py b/hooke/driver/jpk.py index 2cbb852..bc13761 100644 --- a/hooke/driver/jpk.py +++ b/hooke/driver/jpk.py @@ -39,6 +39,8 @@ class JPKDriver (Driver): super(JPKDriver, self).__init__(name='jpk') def is_me(self, path): + if os.path.isdir(path): + return False if zipfile.is_zipfile(path): # JPK file versions since at least 0.5 with Closing(zipfile.ZipFile(path, 'r')) as f: if 'header.properties' not in f.namelist(): @@ -72,14 +74,18 @@ class JPKDriver (Driver): for i in range(len([p for p in f.namelist() if p.endswith('segment-header.properties')])): segments.append(self._zip_segment(f, path, info, zip_info, i)) - for name in ['approach', 'retract']: - if len([s for s in segments if s.info['name'] == name]) == 0: - raise ValueError( - 'No segment for %s in %s, only %s' - % (name, path, [s.info['name'] for s in segments])) - return (segments, - self._zip_translate_params(zip_info, - segments[0].info['raw info'])) + if zip_info['file-format-version'] not in ['0.5']: + raise NotImplementedError( + 'JPK file version %s not supported (yet).' + % zip_info['file-format-version']) + for name in ['approach', 'retract']: + if len([s for s in segments if s.info['name'] == name]) == 0: + raise ValueError( + 'No segment for %s in %s, only %s' + % (name, path, [s.info['name'] for s in segments])) + return (segments, + self._zip_translate_params(zip_info, + segments[0].info['raw info'])) def _zip_info(self, zipfile): with Closing(zipfile.open('header.properties')) as f: @@ -119,14 +125,16 @@ class JPKDriver (Driver): 'Non-float data format:\n%s' % pprint.pformat(chan_info) data = numpy.frombuffer( buffer(f.read()), - dtype=numpy.dtype(numpy.float32).newbyteorder('>'), - # Is JPK data always big endian? I can't find a config - # setting. The ForceRobot brochure - # http://www.jpk.com/forcerobot300-1.download.6d694150f14773dc76bc0c3a8a6dd0e8.pdf - # lists a PowerPC chip on page 4, under Control - # electronics, and PPCs are usually big endian. - # http://en.wikipedia.org/wiki/PowerPC#Endian_modes - ) + dtype=numpy.dtype(numpy.float32).newbyteorder('>')) + # '>' (big endian) byte order. + # From version 0.3 of JPKForceSpec.txt in the "Binary data" section: + # All forms of raw data are stored in chronological order + # (the order in which they were collected), and the + # individual values are stored in network byte order + # (big-endian). The data type used to store the data is + # specified by the "channel.*.data.type" property, and is + # either short (2 bytes per value), integer (4 bytes), or + # float (4 bytes, IEEE format). f.close() return data