summaryrefslogtreecommitdiff
path: root/df10ch_setup_pkg/device_drv.py
diff options
context:
space:
mode:
Diffstat (limited to 'df10ch_setup_pkg/device_drv.py')
-rw-r--r--df10ch_setup_pkg/device_drv.py93
1 files changed, 68 insertions, 25 deletions
diff --git a/df10ch_setup_pkg/device_drv.py b/df10ch_setup_pkg/device_drv.py
index cf00272..8941df7 100644
--- a/df10ch_setup_pkg/device_drv.py
+++ b/df10ch_setup_pkg/device_drv.py
@@ -233,13 +233,25 @@ def GetCommErrMsg(stat):
CONFIG_VALID_ID = 0xA0A1
-CONFIG_VERSION = 0x0001
-CONFIG_CLASS_VERSION = 0x0001
+CONFIG_VERSION = 0x0002
+CONFIG_CLASS_VERSION = 0x0002
DEFAULT_GAMMA_VAL = 22
MIN_GAMMA_VAL = 10
MAX_GAMMA_VAL = 50
+DEFAULT_OVERSCAN = 30
+MIN_OVERSCAN = 0
+MAX_OVERSCAN = 200
+
+DEFAULT_EDGE_WEIGHTING = 80
+MIN_EDGE_WEIGHTING = 10
+MAX_EDGE_WEIGHTING = 200
+
+DEFAULT_ANALYZE_SIZE = 1
+MIN_ANALYZE_SIZE = 0
+MAX_ANALYZE_SIZE = 5
+
AREA_NAMES = "Top", "Bottom", "Left", "Right", "Center", "TopLeft", "TopRight", "BottomLeft", "BottomRight"
MAX_AREAS = 30, 30, 30, 30, 1, 1, 1, 1, 1
@@ -297,7 +309,8 @@ class DF10CHController:
self.version = version
self.serial = serial
self.id = 'DF10CH[{0},{1}]'.format(self.busnum, self.devnum)
-
+ self.error_count = 0
+
def release(self):
self.usbdev.releaseInterface()
@@ -310,11 +323,14 @@ class DF10CHController:
retry = retry - 1
written = self.usbdev.controlMsg(usb.ENDPOINT_OUT|usb.RECIP_DEVICE|usb.TYPE_VENDOR, req, data, value, index, timeout)
except usb.USBError as err:
+ self.error_count = self.error_count + 1
+ print 'write req={0}, retry={1}: {2}'.format(req, retry, err.__str__())
if retry == 0:
- raise AtmoControllerError(self, err.__str__())
+ raise AtmoControllerError(self, 'write req={0}: {1}'.format(req, err.__str__()))
else:
if written != len(data):
- raise AtmoControllerError(self, 'could not write all payload data to device')
+ self.error_count = self.error_count + 1
+ raise AtmoControllerError(self, 'write req={0}: could not write all payload data'.format(req))
break
def ctrl_read(self, req, value = 0, index = 0, size = 0, timeout = DEF_USB_TIMEOUT, retry = DEF_RETRY):
@@ -323,27 +339,33 @@ class DF10CHController:
retry = retry - 1
data = self.usbdev.controlMsg(usb.ENDPOINT_IN|usb.RECIP_DEVICE|usb.TYPE_VENDOR, req, size, value, index, timeout)
except usb.USBError as err:
+ print 'read req={0}, retry={1}: {2}'.format(req, retry, err.__str__())
if retry == 0:
- raise AtmoControllerError(self, err.__str__())
+ self.error_count = self.error_count + 1
+ raise AtmoControllerError(self, 'read req={0}: {1}'.format(req, err.__str__()))
else:
if len(data) != size:
- raise AtmoControllerError(self, 'could not read all payload data')
+ self.error_count = self.error_count + 1
+ raise AtmoControllerError(self, 'read req={0}: could not read all payload data'.format(req))
break
return data
def pwm_ctrl_write(self, req, value, index, data, timeout = DEF_USB_TIMEOUT, retry = DEF_RETRY):
if len(data) > MAX_PWM_REQ_PAYLOAD_SIZE:
+ self.error_count = self.error_count + 1
raise AtmoControllerError(self, 'to many bytes in payload request data')
self.ctrl_write(req, value, index, data, timeout, retry)
def pwm_ctrl_read(self, req, value = 0, index = 0, size = 0, timeout = DEF_USB_TIMEOUT, retry = DEF_RETRY):
if size > MAX_PWM_REPLY_PAYLOAD_SIZE:
+ self.error_count = self.error_count + 1
raise AtmoControllerError(self, 'to many bytes for reply payload data')
return self.ctrl_read(req, value, index, size, timeout, retry)
def verify_reply_data(self, start, data, rdata, msg):
for i in range(len(data)):
if data[i] != rdata[i]:
+ self.error_count = self.error_count + 1
raise AtmoControllerError(self, '{4}: verify of written {3} data fails {0:04X}: write {1:02X} read {2:02X}'.format(start + i, data[i], rdata[i], msg, self.id))
def read_ee_data(self, start, size):
@@ -461,6 +483,13 @@ class DF10CHController:
data = self.pwm_ctrl_read(PWM_REQ_GET_VERSION, 0, 0, 2)
return data[1]
+ def pwm_echo_test(self, testValue):
+ v = testValue & 0x0FFFF
+ i = testValue >> 16
+ data = self.pwm_ctrl_read(PWM_REQ_ECHO_TEST, v, i, 8)
+ if (data[2] + data[3] * 256) != v or (data[4] + data[5] * 256) != i:
+ raise AtmoControllerError(self, 'echo test fails for value {0}'.format(testValue))
+
def get_pwm_flash_page_size(self):
data = self.pwm_ctrl_read(BL_PWM_REQ_GET_PAGE_SIZE, 0, 0, 2)
return data[0] + data[1] * 256
@@ -493,6 +522,7 @@ class dummyController:
self.flash = dict()
self.pwm_vers = PWM_VERS_APPL
self.pwm_flash = dict()
+ self.error_count = 0
def _reset_setup(self):
self.common_bright = NCOMMONBRIGHTS - 1
@@ -618,6 +648,9 @@ class dummyController:
def get_pwm_version(self):
return 1
+ def pwm_echo_test(self, testValue):
+ pass
+
def get_bootloader_request_error_status(self):
return 0
@@ -668,23 +701,36 @@ class ControllerConfig:
self.commonPWMRes = self.ctrl.get_common_max_pwm_value()
self.pwmFreq = self.ctrl.get_pwm_freq()
self.commonBright = self.ctrl.get_common_brightness()
+ self.configVersion = 0
self.numAreas = [ 0 ] * NumBaseAreas()
-
- eedata = self.ctrl.read_ee_data(1, 5 + len(self.numAreas) + NCHANNELS * 6)
+ self.numReqChannels = 0
+ self.analyzeSize = DEFAULT_ANALYZE_SIZE
+ self.edgeWeighting = DEFAULT_EDGE_WEIGHTING
+ self.overscan = DEFAULT_OVERSCAN
+
+ eedata = self.ctrl.read_ee_data(1, 8 + len(self.numAreas) + NCHANNELS * 6)
#print "read eedata:", eedata
configValidId = eedata[0] + eedata[1] * 256
if configValidId == CONFIG_VALID_ID:
- configVersion = "{0:04X}".format(eedata[2] + eedata[3] * 256)
- for p in range(len(self.numAreas)):
- self.numAreas[p] = eedata[4 + p]
- if self.numAreas[p] > MAX_AREAS[p]: self.numAreas = MAX_AREAS[p]
+ self.configVersion = eedata[2] + eedata[3] * 256
+ configVersionStr = "{0:04X}".format(self.configVersion)
+ p = 4
+ for i in range(len(self.numAreas)):
+ self.numAreas[i] = min(eedata[p], MAX_AREAS[i])
+ p = p + 1
+ self.numReqChannels = min(eedata[p], NCHANNELS)
+ p = p + 1
+ if self.configVersion > 1:
+ p = p + self.numReqChannels * 6
+ self.overscan = max(min(eedata[p], MAX_OVERSCAN), MIN_OVERSCAN)
+ self.analyzeSize = max(min(eedata[p + 1], MAX_ANALYZE_SIZE), MIN_ANALYZE_SIZE)
+ self.edgeWeighting = max(min(eedata[p + 2], MAX_EDGE_WEIGHTING), MIN_EDGE_WEIGHTING)
else:
- configVersion = ""
- self.version = "USB:{0} PWM:{1:04X} CONFIG:{2}".format(self.ctrl.version, self.ctrl.get_pwm_version(), configVersion)
+ configVersionStr = ""
+ self.version = "USB:{0} PWM:{1:04X} CONFIG:{2}".format(self.ctrl.version, self.ctrl.get_pwm_version(), configVersionStr)
pwmChannelMap = self.ctrl.get_channel_map(0, NCHANNELS)
#print "read pwmChannelMap", pwmChannelMap
self.channelMap = dict()
- self.numReqChannels = 0
for portName in PORT_NAME_MAP.keys():
foundArea = None
port, pin = PORT_NAME_MAP[portName]
@@ -694,21 +740,15 @@ class ControllerConfig:
outPins = channelRec['pins']
if outPort == port and (outPins & pin):
if configValidId == CONFIG_VALID_ID:
- p = 4 + len(self.numAreas)
- self.numReqChannels = eedata[p]
- if self.numReqChannels > NCHANNELS: self.numReqChannels = 0
- p = p + 1
+ p = 5 + len(self.numAreas)
for i in range(self.numReqChannels):
if eedata[p] == reqChannel:
area = AreaName(eedata[p + 1], eedata[p + 2])
if area:
foundArea = area
color = eedata[p + 1] & 0x03
- gamma = eedata[p + 3]
- if gamma < MIN_GAMMA_VAL: gamma = MIN_GAMMA_VAL
- if gamma > MAX_GAMMA_VAL: gamma = MAX_GAMMA_VAL
- whiteCal = eedata[p + 4] + eedata[p + 5] * 256
- if whiteCal > self.pwmRes: whiteCal = self.pwmRes
+ gamma = max(min(eedata[p + 3], MAX_GAMMA_VAL), MIN_GAMMA_VAL)
+ whiteCal = min((eedata[p + 4] + eedata[p + 5] * 256), self.pwmRes)
break
p = p + 6
break
@@ -757,6 +797,9 @@ class ControllerConfig:
pwmChannelMap.append(dict(channel=reqChannel, port=port, pins=pin))
eedata[4 + len(self.numAreas)] = n
+ eedata.append(self.overscan)
+ eedata.append(self.analyzeSize)
+ eedata.append(self.edgeWeighting)
self.numReqChannels = 0
while len(pwmChannelMap) < NCHANNELS: