? meter.patch
? configs/SherlineLathe/core_stepper.hal
? configs/SherlineLathe/emc.nml
Index: lib/python/pyvcp_widgets.py
===================================================================
RCS file: /cvs/emc2/lib/python/pyvcp_widgets.py,v
retrieving revision 1.42
diff -u -r1.42 pyvcp_widgets.py
--- lib/python/pyvcp_widgets.py 30 Dec 2008 10:53:52 -0000 1.42
+++ lib/python/pyvcp_widgets.py 3 Jan 2009 16:25:45 -0000
@@ -290,15 +290,21 @@
[ 300 ]
[ "mymeter" ]
[ "My Voltage" ]
+ [ "Volts"
[ -22 ]
[ 123 ]
+ [ 10 ]
+ [ 5 ]
+ [ (70,80,"green") ]
+ [ (80,100,"orange") ]
+ [ (100,123,"red") ]
"""
# FIXME: logarithmic scale option
n=0
- def __init__(self,root,pycomp,halpin=None,
- size=200,text=None,min_=0,max_=100,**kw):
- pad=10
+ def __init__(self,root,pycomp,halpin=None, size=200,text=None,subtext=None,min_=0,max_=100,majorscale=None, minorscale=None,region1=None,region2=None,region3=None,**kw):
+ self.size = size
+ self.pad=10
Canvas.__init__(self,root,width=size,height=size)
self.halpin=halpin
self.min_=min_
@@ -306,64 +312,92 @@
range_=2.5
self.min_alfa=-math.pi/2-range_
self.max_alfa=-math.pi/2+range_
- self.circle=self.create_oval(pad,pad,size-pad,size-pad)
+ self.circle=self.create_oval(self.pad,self.pad,size-self.pad,size-self.pad, width=2)
self.itemconfig(self.circle,fill="white")
self.mid=size/2
- self.r=(size-2*pad)/2
+ self.r=(size-2*self.pad)/2
self.alfa=0
- self.line = self.create_line([self.mid,self.mid, \
- self.mid+0.8*self.r*math.cos(self.alfa), \
- self.mid+0.8*self.r*math.sin(self.alfa)],fill="red")
- self.itemconfig(self.line,width=3)
- if text!=None:
- t=self.create_text([self.mid,self.mid-20])
- self.itemconfig(t,text=text)
- self.itemconfig(t,font=('Arial',20))
-
+ if minorscale==None:
+ self.minorscale=0
+ else:
+ self.minorscale=minorscale
+ if majorscale==None:
+ self.majorscale=float((self.max_-self.min_)/10)
+ else:
+ self.majorscale=majorscale
+ if text!=None: t=self.create_text([self.mid,self.mid-size/12],font="Arial %d bold" % (size/10),text=text)
+ if subtext!=None: t=self.create_text([self.mid,self.mid+size/12],font="Arial %d" % (size/30+5),text=subtext)
+ if region1!=None: self.draw_region(region1)
+ if region2!=None: self.draw_region(region2)
+ if region3!=None: self.draw_region(region3)
self.draw_ticks()
+ self.line = self.create_line([self.mid,self.mid, self.mid+self.r*math.cos(self.alfa), self.mid+self.r*math.sin(self.alfa)],fill="red", arrow="last", arrowshape=(0.9*self.r,self.r,self.r/20))
+ self.itemconfig(self.line,width=3)
+
# create the hal pin
if halpin == None:
self.halpin = "meter."+str(pyvcp_meter.n)+".value"
pyvcp_meter.n += 1
pycomp.newpin(self.halpin, HAL_FLOAT, HAL_IN)
self.value = pycomp[self.halpin]
+
+ def rad2deg(self, rad): return rad*180/math.pi
+
+ def value2angle(self, value):
+ #returns angle for a given value
+ scale = (self.max_-self.min_)/(self.max_alfa-self.min_alfa)
+ alfa = self.min_alfa + (value-self.min_)/scale
+ if alfa > self.max_alfa:
+ alfa = self.max_alfa
+ elif alfa < self.min_alfa:
+ alfa = self.min_alfa
+ return alfa
+
+ def p2c(self, radius, angle):
+ #returns the cathesian coordinates (x,y) for given polar coordinates
+ #radius in percent of self.r; angle in radians
+ return self.mid+radius*self.r*math.cos(angle), self.mid+radius*self.r*math.sin(angle)
def update(self,pycomp):
self.value = pycomp[self.halpin]
- scale=(self.max_-self.min_)/(self.max_alfa-self.min_alfa)
- self.alfa=self.min_alfa + (self.value-self.min_)/scale
- if self.alfa > self.max_alfa:
- self.alfa = self.max_alfa
- elif self.alfa < self.min_alfa:
- self.alfa = self.min_alfa
-
- self.coords(self.line, self.mid,self.mid, \
- self.mid+0.8*self.r*math.cos(self.alfa), \
- self.mid+0.8*self.r*math.sin(self.alfa))
+ self.alfa = self.value2angle(self.value)
+ x,y = self.p2c(0.8, self.alfa)
+ self.coords(self.line,self.mid,self.mid,x,y)
+
+ def draw_region(self, (start, end, color)):
+ #Draws a colored region on the canvas between start and end
+ start = self.value2angle(start)
+ start = -self.rad2deg(start)
+ end = self.value2angle(end)
+ end = -self.rad2deg(end)
+ extent = end-start
+ halfwidth = math.floor(0.1*self.r/2)+1
+ xy = self.pad+halfwidth, self.pad+halfwidth, self.size-self.pad-halfwidth, self.size-self.pad-halfwidth
+ self.create_arc(xy, start=start, extent=extent, outline=color, width=(halfwidth-1)*2, style="arc")
def draw_ticks(self):
- d_alfa = float((self.max_alfa-self.min_alfa))/10
- d_value = float((self.max_-self.min_))/10
- for n in range(0,11):
- startx=self.mid+self.r*math.cos(self.min_alfa + n*d_alfa)
- starty=self.mid+self.r*math.sin(self.min_alfa + n*d_alfa)
- stopx=self.mid+0.85*self.r*math.cos(self.min_alfa + n*d_alfa)
- stopy=self.mid+0.85*self.r*math.sin(self.min_alfa + n*d_alfa)
- textx=stopx - 0.1*self.r*math.cos(self.min_alfa + n*d_alfa)
- texty=stopy - 0.1*self.r*math.sin(self.min_alfa + n*d_alfa)
- self.create_line([startx,starty,stopx,stopy])
- t=self.create_text([textx,texty])
- self.itemconfig(t,text=str(self.min_+d_value*n))
- for m in range(1,5):
- if n != 10:
- startx=self.mid+self.r*math.cos(self.min_alfa + (n+float(m)/5)*d_alfa)
- starty=self.mid+self.r*math.sin(self.min_alfa + (n+float(m)/5)*d_alfa)
- stopx=self.mid+0.90*self.r*math.cos(self.min_alfa + (n+float(m)/5)*d_alfa)
- stopy=self.mid+0.90*self.r*math.sin(self.min_alfa + (n+float(m)/5)*d_alfa)
- self.create_line([startx,starty,stopx,stopy])
-
+ value = self.min_
+ while value <= self.max_:
+ alfa = self.value2angle(value)
+ xy1 = self.p2c(1,alfa)
+ xy2 = self.p2c(0.85,alfa)
+ xytext = self.p2c(0.75,alfa)
+ self.create_text(xytext,font="Arial %d" % (self.size/30+5), text="%g" % value)
+ self.create_line(xy1, xy2, width=2)
+ value = value + self.majorscale
+ #minor ticks
+ value = self.min_
+ if self.minorscale > 0:
+ while value <= self.max_:
+ if (value % self.majorscale) != 0:
+ alfa = self.value2angle(value)
+ xy1 = self.p2c(1,alfa)
+ xy2 = self.p2c(0.9,alfa)
+ self.create_line(xy1, xy2)
+ value = value + self.minorscale
+
# -------------------------------------------