|
@@ -0,0 +1,92 @@
|
|
|
|
|
+""" Class used to create and control radamec device """
|
|
|
|
|
+from math import *
|
|
|
|
|
+from PandaObject import *
|
|
|
|
|
+from DirectDeviceManager import *
|
|
|
|
|
+
|
|
|
|
|
+import DirectNotifyGlobal
|
|
|
|
|
+import OnscreenText
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+"""
|
|
|
|
|
+TODO:
|
|
|
|
|
+Handle interaction between widget, followSelectedTask and updateTask
|
|
|
|
|
+"""
|
|
|
|
|
+
|
|
|
|
|
+# ANALOGS
|
|
|
|
|
+NULL_AXIS = -1
|
|
|
|
|
+RAD_PAN = 0
|
|
|
|
|
+RAD_TILT = 1
|
|
|
|
|
+RAD_ZOOM = 2
|
|
|
|
|
+RAD_FOCUS = 3
|
|
|
|
|
+
|
|
|
|
|
+class DirectRadamec(PandaObject):
|
|
|
|
|
+ radamecCount = 0
|
|
|
|
|
+ notify = DirectNotifyGlobal.directNotify.newCategory('DirectRadamec')
|
|
|
|
|
+
|
|
|
|
|
+ def __init__(self, device = 'Analog0', nodePath = direct.camera):
|
|
|
|
|
+ # See if device manager has been initialized
|
|
|
|
|
+ if direct.deviceManager == None:
|
|
|
|
|
+ direct.deviceManager = DirectDeviceManager()
|
|
|
|
|
+ # Set name
|
|
|
|
|
+ DirectRadamec.radamecCount += 1
|
|
|
|
|
+ self.name = 'Radamec-' + `DirectRadamec.radamecCount`
|
|
|
|
|
+ # Get analogs
|
|
|
|
|
+ self.device = device
|
|
|
|
|
+ self.analogs = direct.deviceManager.createAnalogs(self.device)
|
|
|
|
|
+ self.aList = [0,0,0,0,0,0,0,0]
|
|
|
|
|
+ # Radamec device max/mins - measured on 7/31/2001 - Samir
|
|
|
|
|
+ # Note: These values change quite often, i.e. everytime
|
|
|
|
|
+ # you unplug the radamec cords, or jostle them too
|
|
|
|
|
+ # much. For best results, re-record these values often.
|
|
|
|
|
+ self.minRange = [-180.0, -90, 524290.0, 520315.0]
|
|
|
|
|
+ self.maxRange = [180.0, 90, 542700.0, 559518.0]
|
|
|
|
|
+ # Pick initial mode
|
|
|
|
|
+ self.updateFunc = self.radamecUpdate
|
|
|
|
|
+ # Spawn update task
|
|
|
|
|
+ self.enable()
|
|
|
|
|
+
|
|
|
|
|
+ def enable(self):
|
|
|
|
|
+ # Kill existing task
|
|
|
|
|
+ self.disable()
|
|
|
|
|
+ # Update task
|
|
|
|
|
+ taskMgr.spawnMethodNamed(self.updateTask, self.name + '-updateTask')
|
|
|
|
|
+
|
|
|
|
|
+ def disable(self):
|
|
|
|
|
+ taskMgr.removeTasksNamed(self.name + '-updateTask')
|
|
|
|
|
+
|
|
|
|
|
+ def destroy(self):
|
|
|
|
|
+ self.disable()
|
|
|
|
|
+
|
|
|
|
|
+ def updateTask(self, state):
|
|
|
|
|
+ self.updateVals()
|
|
|
|
|
+ self.updateFunc()
|
|
|
|
|
+ return Task.cont
|
|
|
|
|
+
|
|
|
|
|
+ def updateVals(self):
|
|
|
|
|
+ numControls = self.analogs.__len__()
|
|
|
|
|
+ self.notify.debug("We have %s analog controls." % numControls)
|
|
|
|
|
+ # Update analogs
|
|
|
|
|
+ for i in range(len(self.analogs)):
|
|
|
|
|
+ self.aList[i] = self.analogs[i]
|
|
|
|
|
+
|
|
|
|
|
+ def radamecUpdate(self):
|
|
|
|
|
+ panVal = self.normalizeChannel(RAD_PAN,-180,180)
|
|
|
|
|
+ tiltVal = self.normalizeChannel(RAD_TILT,-90,90)
|
|
|
|
|
+
|
|
|
|
|
+ self.notify.debug("PAN = %s" % self.aList[RAD_PAN])
|
|
|
|
|
+ self.notify.debug("TILT = %s" % self.aList[RAD_TILT])
|
|
|
|
|
+ self.notify.debug("ZOOM = %s" % self.aList[RAD_ZOOM])
|
|
|
|
|
+ self.notify.debug("FOCUS = %s" % self.aList[RAD_FOCUS])
|
|
|
|
|
+ self.notify.debug("Normalized: panVal: %s tiltVal: %s" % (panVal, tiltVal))
|
|
|
|
|
+
|
|
|
|
|
+ # Normalize to the range [-minVal,maxVal] based on some hard-coded
|
|
|
|
|
+ # max/min numbers of the Radamec device
|
|
|
|
|
+ def normalizeChannel(self, chan, minVal = -1, maxVal = 1):
|
|
|
|
|
+ try:
|
|
|
|
|
+ maxRange = self.maxRange[chan]
|
|
|
|
|
+ minRange = self.minRange[chan]
|
|
|
|
|
+ except IndexError:
|
|
|
|
|
+ raise RuntimeError, "can't normalize this channel (chanel %d)" % chan
|
|
|
|
|
+ range = maxRange - minRange
|
|
|
|
|
+ clampedVal = CLAMP(self.aList[chan], minRange, maxRange)
|
|
|
|
|
+ return ((maxVal - minVal) * (clampedVal - minRange) / range) + minVal
|