2 from Tkconstants import *
3 from FlightGear import FlightGear
9 def __init__(self, parent, prop, label):
11 self.field = Tix.LabelEntry( parent, label=label,
17 self.field.pack( side=Tix.TOP, padx=20, pady=2 )
19 def update_field(self,fgfs):
21 self.field.entry.delete(0,'end')
22 self.field.entry.insert(0, val)
24 class PropertyPage(Tix.Frame):
25 def __init__(self,parent,fgfs):
26 Tix.Frame.__init__(self,parent)
28 self.pack( side=Tix.TOP, padx=2, pady=2, fill=Tix.BOTH, expand=1 )
31 def addField(self, prop, label):
32 f = PropertyField(self, prop, label)
35 def update_fields(self):
37 f.update_field(self.fgfs)
38 Tix.Frame.update(self)
40 class FGFSDemo(Tix.Frame):
41 def __init__(self,fgfs,root=None):
42 Tix.Frame.__init__(self,root)
43 z = root.winfo_toplevel()
44 z.wm_protocol("WM_DELETE_WINDOW", lambda self=self: self.quitcmd())
52 def createWidgets(self):
53 self.nb = Tix.NoteBook(self)
54 self.nb.add( 'sim', label='Simulation',
55 raisecmd= lambda self=self: self.update_page() )
56 self.nb.add( 'view', label='View',
57 raisecmd= lambda self=self: self.update_page() )
58 self.nb.add( 'loc', label='Location',
59 raisecmd= lambda self=self: self.update_page() )
60 self.nb.add( 'weather', label='Weather',
61 raisecmd= lambda self=self: self.update_page() )
62 self.nb.add( 'clouds', label='Clouds',
63 raisecmd= lambda self=self: self.update_page() )
64 self.nb.add( 'velocities', label='Velocities',
65 raisecmd= lambda self=self: self.update_page() )
67 page = PropertyPage( self.nb.sim, self.fgfs )
68 self.pages['sim'] = page
69 page.addField( '/sim/aircraft', 'Aircraft:')
70 page.addField( '/sim/startup/airport-id', 'Airport ID:')
71 page.addField( '/sim/time/gmt', 'Current time (GMT):')
72 page.addField( '/sim/startup/trim', 'Trim on ground (true/false):')
73 page.addField( '/sim/sound/audible', 'Sound enabled (true/false):')
74 page.addField( '/sim/startup/browser-app', 'Web browser:')
76 page = PropertyPage( self.nb.view, self.fgfs )
77 self.pages['view'] = page
78 page.addField( '/sim/view-mode', 'View mode:')
79 page.addField( "/sim/current-view/field-of-view", "Field of view (deg):" )
80 page.addField( "/sim/current-view/pitch-offset-deg", "View pitch offset (deg):" )
81 page.addField( "/sim/current-view/heading-offset-deg", "View heading offset (deg):" )
83 page = PropertyPage( self.nb.loc, self.fgfs )
84 self.pages['loc'] = page
85 page.addField( "/position/altitude-ft", "Altitude (ft):" )
86 page.addField( "/position/longitude-deg", "Longitude (deg):" )
87 page.addField( "/position/latitude-deg", "Latitude (deg):" )
88 page.addField( "/orientation/roll-deg", "Roll (deg):" )
89 page.addField( "/orientation/pitch-deg", "Pitch (deg):" )
90 page.addField( "/orientation/heading-deg", "Heading (deg):" )
92 page = PropertyPage( self.nb.weather, self.fgfs )
93 self.pages['weather'] = page
94 page.addField("/environment/wind-from-heading-deg",
95 "Wind direction (deg FROM):")
96 page.addField("/environment/params/base-wind-speed-kt",
98 page.addField("/environment/params/gust-wind-speed-kt",
100 page.addField("/environment/wind-from-down-fps",
102 page.addField("/environment/temperature-degc", "Temperature (degC):")
103 page.addField("/environment/dewpoint-degc", "Dewpoint (degC):")
104 page.addField("/environment/pressure-sea-level-inhg",
105 "Altimeter setting (inHG):")
107 page = PropertyPage( self.nb.clouds, self.fgfs )
108 self.pages['clouds'] = page
109 page.addField("/environment/clouds/layer[0]/type",
111 page.addField("/environment/clouds/layer[0]/elevation-ft",
112 "Layer 0 height (ft):")
113 page.addField("/environment/clouds/layer[0]/thickness-ft",
114 "Layer 0 thickness (ft):")
115 page.addField("/environment/clouds/layer[1]/type",
117 page.addField("/environment/clouds/layer[1]/elevation-ft",
118 "Layer 1 height (ft):")
119 page.addField("/environment/clouds/layer[1]/thickness-ft",
120 "Layer 1 thickness (ft):")
121 page.addField("/environment/clouds/layer[2]/type",
123 page.addField("/environment/clouds/layer[2]/elevation-ft",
124 "Layer 2 height (ft):")
125 page.addField("/environment/clouds/layer[2]/thickness-ft",
126 "Layer 2 thickness (ft):")
127 page.addField("/environment/clouds/layer[3]/type",
129 page.addField("/environment/clouds/layer[3]/elevation-ft",
130 "Layer 3 height (ft):")
131 page.addField("/environment/clouds/layer[3]/thickness-ft",
132 "Layer 3 thickness (ft):")
133 page.addField("/environment/clouds/layer[4]/type",
135 page.addField("/environment/clouds/layer[4]/elevation-ft",
136 "Layer 4 height (ft):")
137 page.addField("/environment/clouds/layer[4]/thickness-ft",
138 "Layer 4 thickness (ft):")
140 page = PropertyPage( self.nb.velocities, self.fgfs )
141 self.pages['velocities'] = page
142 page.addField("/velocities/airspeed-kt", "Airspeed (kt):")
143 page.addField("/velocities/speed-down-fps", "Descent speed (fps):")
145 self.nb.pack( expand=1, fill=Tix.BOTH, padx=5, pady=5, side=Tix.TOP )
147 self.QUIT = Tix.Button(self)
148 self.QUIT['text'] = 'Quit'
149 self.QUIT['command'] = self.quitcmd
150 self.QUIT.pack({"side": "bottom"})
154 self.after_cancel(self.after_id)
158 def update_page(self):
159 page = self.pages[ self.nb.raised() ]
162 self.after_id = self.after( 1000, lambda self=self: self.update_page() )
165 if len(sys.argv) != 3:
166 print 'Usage: %s host port' % sys.argv[0]
171 port = int( sys.argv[2] )
172 except ValueError, msg:
173 print 'Error: expected a number for port'
178 fgfs = FlightGear( host, port )
179 except socket.error, msg:
180 print 'Error connecting to flightgear:', msg[1]
184 app = FGFSDemo( fgfs, root )
187 if __name__ == '__main__':