# Author: Jeff Grimmett (grimmtoo@softhome.net), adapted from original
# .wdr-derived demo
#
-# Created: 01/02/04
+# Created: 02-Jan-2004
# RCS-ID: $Id$
# Copyright:
# Licence: wxWindows license
import math
import wx
+haveJoystick = True
+if wx.Platform == "__WXMAC__":
+ haveJoystick = False
+
#----------------------------------------------------------------------------
# Once all supported versions of Python support 32-bit integers on all
# Restrict our drawing activities to the square defined
# above.
- dc.SetClippingRegion((xorigin, yorigin), (edgeSize, edgeSize))
+ dc.SetClippingRegion(xorigin, yorigin, edgeSize, edgeSize)
# Optimize drawing a bit (for Win)
dc.BeginDrawing()
dc.SetBrush(wx.Brush(wx.Colour(251, 252, 237)))
- dc.DrawRectangle((xorigin, yorigin), (edgeSize, edgeSize))
+ dc.DrawRectangle(xorigin, yorigin, edgeSize, edgeSize)
dc.SetPen(wx.Pen(wx.BLACK, 1, wx.DOT_DASH))
- dc.DrawLine((xorigin, yorigin + center), (xorigin + edgeSize, yorigin + center))
- dc.DrawLine((xorigin + center, yorigin), (xorigin + center, yorigin + edgeSize))
+ dc.DrawLine(xorigin, yorigin + center, xorigin + edgeSize, yorigin + center)
+ dc.DrawLine(xorigin + center, yorigin, xorigin + center, yorigin + edgeSize)
if self.stick:
# Get the joystick position as a float
joyy = float(self.stick.GetPosition().y)
# Get the joystick range of motion
- xrange = self.stick.GetXMax() - self.stick.GetXMin()
- yrange = self.stick.GetYMax() - self.stick.GetYMin()
+ xmin = self.stick.GetXMin()
+ xmax = self.stick.GetXMax()
+ if xmin < 0:
+ xmax += abs(xmin)
+ joyx += abs(xmin)
+ xmin = 0
+ xrange = max(xmax - xmin, 1)
+
+ ymin = self.stick.GetYMin()
+ ymax = self.stick.GetYMax()
+ if ymin < 0:
+ ymax += abs(ymin)
+ joyy += abs(ymin)
+ ymin = 0
+ yrange = max(ymax - ymin, 1)
# calc a ratio of our range versus the joystick range
xratio = float(edgeSize) / xrange
# calc the displayable value based on position times ratio
xval = int(joyx * xratio)
- yval = int(joyy * xratio)
+ yval = int(joyy * yratio)
# and normalize the value from our brush's origin
x = xval + xorigin
# Now to draw it.
dc.SetPen(wx.Pen(wx.RED, 2))
- dc.CrossHair((x, y))
+ dc.CrossHair(x, y)
# Turn off drawing optimization
dc.EndDrawing()
# our 'raster'.
dc.SetBrush(wx.Brush(wx.WHITE))
- dc.DrawCircle((xcenter, ycenter), diameter/2)
+ dc.DrawCircle(xcenter, ycenter, diameter/2)
dc.SetBrush(wx.Brush(wx.BLACK))
- dc.DrawCircle((xcenter, ycenter), 10)
+ dc.DrawCircle(xcenter, ycenter, 10)
# fancy decorations
dc.SetPen(wx.Pen(wx.BLACK, 1, wx.DOT_DASH))
- dc.DrawLine((xorigin, ycenter), (xorigin + diameter, ycenter))
- dc.DrawLine((xcenter, yorigin), (xcenter, yorigin + diameter))
+ dc.DrawLine(xorigin, ycenter, xorigin + diameter, ycenter)
+ dc.DrawLine(xcenter, yorigin, xcenter, yorigin + diameter)
if self.stick:
if self.avail:
# Draw the line
dc.SetPen(wx.Pen(wx.BLUE, 2))
- dc.DrawLine((xcenter, ycenter), (nx, ny))
+ dc.DrawLine(xcenter, ycenter, nx, ny)
# And a little thing to show the endpoint
dc.SetBrush(wx.Brush(wx.BLUE))
- dc.DrawCircle((nx, ny), 8)
+ dc.DrawCircle(nx, ny, 8)
# Turn off drawing optimization
dc.EndDrawing()
else:
dc.SetBrush(wx.Brush(wx.BLACK))
- dc.DrawCircle((center, center), bw/2)
+ dc.DrawCircle(center, center, bw/2)
txt = str(self.number)
# functions. The pseudo-shadow gives the text contrast
# regardless of whether the bar is under it or not.
dc.SetTextForeground(wx.WHITE)
- dc.DrawText(txt, (tx, ty))
+ dc.DrawText(txt, tx, ty)
# Turn off drawing optimization
dc.EndDrawing()
# functions. The pseudo-shadow gives the text contrast
# regardless of whether the bar is under it or not.
dc.SetTextForeground(wx.BLACK)
- dc.DrawText(txt, (tx, ty))
+ dc.DrawText(txt, tx, ty)
dc.SetTextForeground('white')
- dc.DrawText(txt, (tx-1, ty-1))
+ dc.DrawText(txt, tx-1, ty-1)
#----------------------------------------------------------------------------
self.GetMax = eval('stick.Get%sMax' % token)
# Create our displays and set them up.
- self.Min = wx.StaticText(self, -1, str(self.GetMin()),
- size=(40,-1), style=wx.ALIGN_RIGHT | wx.ST_NO_AUTORESIZE)
- self.Max = wx.StaticText(self, -1, str(self.GetMax()),
- size=(40,-1), style=wx.ALIGN_LEFT | wx.ST_NO_AUTORESIZE)
+ self.Min = wx.StaticText(self, -1, str(self.GetMin()), style=wx.ALIGN_RIGHT)
+ self.Max = wx.StaticText(self, -1, str(self.GetMax()), style=wx.ALIGN_LEFT)
self.bar = AxisBar(self)
sizer.Add(self.Min, 0, wx.ALL | wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 1)
else:
val = eval('self.stick.Get%sPosition()' % self.token)
+
#
# While we might be able to rely on a range of 0-FFFFFF on Win, that might
# not be true of all drivers on all platforms. Thus, calc the actual full
# range first.
#
+ if min < 0:
+ max += abs(min)
+ val += abs(min)
+ min = 0
range = float(max - min)
-
+
#
# The relative value is used by the derived wx.Gauge since it is a
# positive-only control.
#
relative = 0
if range:
- relative = int(val / range * 1000)
+ relative = int( val / range * 1000)
#
# Pass both the raw and relative values to the derived Gauge
# Capture Joystick events (if they happen)
self.Bind(wx.EVT_JOYSTICK_EVENTS, self.OnJoystick)
-
self.stick.SetMovementThreshold(10)
+
def Calibrate(self, evt=None):
# Do not try this without a stick
if not self.stick:
self.pov.Calibrate()
self.buttons.Calibrate()
+
def OnJoystick(self, evt=None):
if not self.stick:
return
self.axes.Update()
self.joy.Update()
self.pov.Update()
- self.buttons.Update()
+ if evt is not None and evt.IsButton():
+ self.buttons.Update()
+ def ShutdownDemo(self):
+ if self.stick:
+ self.stick.ReleaseCapture()
+ self.stick = None
+
#----------------------------------------------------------------------------
def runTest(frame, nb, log):
- win = JoystickDemoPanel(nb, log)
- return win
+ if haveJoystick:
+ win = JoystickDemoPanel(nb, log)
+ return win
+ else:
+ dlg = wx.MessageDialog(
+ frame, 'wx.Joystick is not available on this platform.',
+ 'Sorry', wx.OK | wx.ICON_INFORMATION
+ )
+ dlg.ShowModal()
+ dlg.Destroy()
+
#----------------------------------------------------------------------------
if __name__ == '__main__':
import sys,os
import run
- run.main(['', os.path.basename(sys.argv[0])])
+ run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])