Advertisement
Guest User

Script for Spyder5 driver

a guest
Mar 28th, 2016
226
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.65 KB | None | 0 0
  1. #!/usr/bin/env python2
  2. # -*- coding: utf-8 -*-
  3.  
  4. from glob import glob
  5. from time import strftime
  6. import math
  7. import os
  8. import pprint
  9. import sys
  10.  
  11.  
  12. def buf2ord64(buf):
  13.     val = ord(buf[7])
  14.     val = ((val << 8) + (0xff & ord(buf[6])))
  15.     val = ((val << 8) + (0xff & ord(buf[5])))
  16.     val = ((val << 8) + (0xff & ord(buf[4])))
  17.     val = ((val << 8) + (0xff & ord(buf[3])))
  18.     val = ((val << 8) + (0xff & ord(buf[2])))
  19.     val = ((val << 8) + (0xff & ord(buf[1])))
  20.     val = ((val << 8) + (0xff & ord(buf[0])))
  21.     return val
  22.  
  23.  
  24. def IEEE754_64todouble(ip):
  25.     sn = (ip >> 63) & 0x1;
  26.     ep = (ip >> 52) & 0x7ff;
  27.     ma = ip & ((1 << 52) - 1)
  28.     if ep == 0:  # Zero or denormalised
  29.         op = float(ma) / float(1 << 52)
  30.         op *= math.pow(2.0, -1022.0)
  31.     else:
  32.         op = float(ma | (1 << 52)) / float(1 << 52)
  33.         op *= math.pow(2.0, (int(ep) - 1023.0))
  34.     if sn:
  35.         op = -op
  36.     return op
  37.  
  38.  
  39. def readcals(filename):
  40.     cals = []
  41.     with open(filename, 'rb') as f:
  42.         buf = f.read()
  43.         size = f.tell()
  44.     for i in xrange(size / (41 * 8)):
  45.         display = {0: 'Identity',
  46.                    1: 'LCD (CCFL)',
  47.                    2: 'Wide Gamut LCD (CCFL)',
  48.                    3: 'LCD (White LED)',
  49.                    4: 'Wide Gamut LCD (RGB LED)',
  50.                    5: 'LCD (CCFL Type 2)',
  51.                    6: 'Unknown'}[i]
  52.         tech = {0: 'Identity',
  53.                 1: 'LCD CCFL TFT',
  54.                 2: 'LCD CCFL Wide Gamut TFT',
  55.                 3: 'LCD White LED TFT',
  56.                 4: 'LCD RGB LED TFT',
  57.                 5: 'LCD CCFL TFT',
  58.                 6: 'Unknown'}[i]
  59.         print 'Reading ', i
  60.         cal = Spyd4Cal(buf[41 * 8 * i:41 * 8 * (i + 1)], display, tech)
  61.         if sum(cal.spec) != len(cal.spec):
  62.             cals.append(cal)
  63.             print display, '|', tech, cal.spec
  64.         else:
  65.             print 'Skipping identity cal:', display, '|', tech, cal.spec
  66.     return cals
  67.  
  68.  
  69. class Spyd4Cal(object):
  70.     def __init__(self, buf, display, tech):
  71.         self.display = display
  72.         self.tech = tech
  73.         self.start_nm = 380
  74.         self.end_nm = 780
  75.         self.norm = 1.0
  76.         self.spec = []
  77.         for i in xrange(len(buf) / 8):
  78.             val = buf2ord64(buf[8 * i:8 * (i + 1)])
  79.             self.spec.append(IEEE754_64todouble(val))
  80.     def write_ccss(self, filename):
  81.         with open(filename, 'w') as f:
  82.             f.write('''CCSS  
  83.  
  84. ORIGINATOR "DataColor"
  85. CREATED "%(date)s"
  86. KEYWORD "DISPLAY"
  87. DISPLAY "%(display)s (Spyder 5)"
  88. KEYWORD "TECHNOLOGY"
  89. TECHNOLOGY "%(tech)s"
  90. KEYWORD "DISPLAY_TYPE_REFRESH"
  91. DISPLAY_TYPE_REFRESH "NO"
  92. KEYWORD "REFERENCE"
  93. REFERENCE "Not specified"
  94. KEYWORD "SPECTRAL_BANDS"
  95. SPECTRAL_BANDS "%(bands)i"
  96. KEYWORD "SPECTRAL_START_NM"
  97. SPECTRAL_START_NM "%(start_nm).6f"
  98. KEYWORD "SPECTRAL_END_NM"
  99. SPECTRAL_END_NM "%(end_nm).6f"
  100. KEYWORD "SPECTRAL_NORM"
  101. SPECTRAL_NORM "%(norm).6f"
  102. DESCRIPTOR "Not specified"
  103.  
  104. ''' % {'date': strftime('%a %b %d %H:%M:%S %Y'),
  105.        'display': self.display,
  106.        'tech': self.tech,
  107.        'bands': len(self.spec),
  108.        'start_nm': self.start_nm,
  109.        'end_nm': self.end_nm,
  110.        'norm': self.norm})
  111.             for i, spec in enumerate(self.spec):
  112.                 f.write('KEYWORD "SPEC_%i"\n' % (self.start_nm +
  113.                                                  (self.end_nm - self.start_nm) /
  114.                                                  (len(self.spec) -1) * i))
  115.             f.write('NUMBER_OF_FIELDS %i\n' % (1 + len(self.spec)))
  116.             f.write('BEGIN_DATA_FORMAT\n')
  117.             f.write('SAMPLE_ID ')
  118.             for i, spec in enumerate(self.spec):
  119.                 f.write('SPEC_%i ' % (self.start_nm +
  120.                                       (self.end_nm - self.start_nm) /
  121.                                       (len(self.spec) -1) * i))
  122.             f.write('''
  123. END_DATA_FORMAT
  124.  
  125. NUMBER_OF_SETS 3
  126. BEGIN_DATA
  127. ''')
  128.             for n in xrange(3):
  129.                 f.write('%i ' % (n + 1))
  130.                 for spec in self.spec:
  131.                     f.write('%.6f ' % spec)
  132.                 f.write('\n')
  133.             f.write('END_DATA\n')
  134.  
  135.  
  136. if __name__ == "__main__":
  137.     for spyd4cal in sys.argv[1:]:
  138.         for cal in readcals(spyd4cal):
  139.             cal.write_ccss(os.path.join(os.path.dirname(spyd4cal),
  140.                                         '%s (Spyder 5).ccss' % cal.display))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement