Changes in / [450:d009a75685e8:431:207f92566e4f]
- Files:
-
- 2 deleted
- 18 edited
Legend:
- Unmodified
- Added
- Removed
-
.hgignore
r442 r276 6 6 mlx-common.nsh 7 7 locale/.+/LC_MESSAGES 8 locale/.+/mlx_delay.po9 src/mlx/gui/dcdata.py10 xplra.py -
.hgtags
r449 r419 8 8 cc775599652d39ab574dac90fe8730ef52842744 version_0.14 9 9 e11be493e87d09619387e352c389208cca54097d version_0.15 10 89c9d5d516eb0da04f2cd10db58332f054249bb1 version_0.16 -
Makefile
r439 r276 3 3 all: $(foreach lang,$(LANGUAGES),locale/$(lang)/LC_MESSAGES/mlx.mo) 4 4 5 locale/%/LC_MESSAGES/mlx.mo: locale/%/mlx.po locale/%/mlx_delay.po5 locale/%/LC_MESSAGES/mlx.mo: locale/%/mlx.po 6 6 mkdir -p `dirname $@` 7 msgcat $^ | msgfmt -o $@ - 8 9 locale/hu/mlx_delay.po locale/en/mlx_delay.po: dcdatagen.py 10 ./dcdatagen.py 7 msgfmt -o $@ $^ -
doc/overview.dox
r444 r302 11 11 * Note, that to be able to understand the code most effectively, it 12 12 * is important to either use the application actively, or to read its 13 * user documentation carefully. 13 * user documentation carefully. 14 14 * 15 15 * \section overview Overview 16 16 * 17 * The application was written in 17 * The application was written in 18 18 * <a href="http://python.org">Python 2</a>. The Python wrapper 19 19 * <a href="http://gtk.org">Gtk+</a> toolkit was used for the graphical … … 23 23 * as the primary toolkit, while it has no reliable port for Windows 24 24 * yet. Therefore it was decided to support both Gtk+ 2 and 3 25 * depending on the platform. For Gtk+ 2 the 25 * depending on the platform. For Gtk+ 2 the 26 26 * <a href="http://pygtk.org">PyGTK</a> wrapper is used, while for Gtk+ 27 27 * 3 the <a href="https://live.gnome.org/PyGObject">PyGObject</a> … … 33 33 * <a href="http://www.schiratti.com/dowson.html">FSUIPC</a> 34 34 * interface. The author has created a Python mapping for it, which 35 * has been submitted for inclusion into the SDK, so it will hopefully 35 * has been submitted for inclusion into the SDK, so it will hopefully 36 36 * appear in its next version. It is planned to support X-Plane in the 37 37 * near future (hopefully by the end of 2012) on both Linux and … … 45 45 * Gtk+ and Gtk+ itself. Since Python is an interpreted language, 46 46 * there is no need for any special build system. 47 * 47 * 48 48 * Python and Gtk+ are readily available on most Linux distributions, 49 49 * but some links are probably useful for Windows users: … … 54 54 * \li To create install packages, you also need py2exe: <a href="http://www.py2exe.org/">http://www.py2exe.org</a>, 55 55 * \li as well as the Nullsoft Install System: http://nsis.sourceforge.net/Main_Page 56 * 56 * 57 57 * The install package can be created by running the \c makeinst.bat 58 58 * file. It contains some absolute paths, so check those befure … … 81 81 * thread. Instead, use \c gobject.idle_add to "inject" the 82 82 * operation into the main thread. 83 * -# To ensure the responsiveness of the GUI, only operations 83 * -# To ensure the responsiveness of the GUI, only operations 84 84 * that take a short time should be executed in the GUI thread. 85 85 * … … 98 98 * simulator is to be supported, a class with the same (or at least 99 99 * sufficiently similar) public interface should be implemented. 100 * 100 * 101 101 * The most important function of the program is the 102 102 * continuous monitoring of the aircraft's parameters and some other 103 103 * data. The monitoring is started using the \ref 104 104 * mlx.fsuipc.Simulator.startMonitoring "startMonitoring" function of 105 * the simulator object. If started, it calls the \ref 105 * the simulator object. If started, it calls the \ref 106 106 * mlx.acft.Aircraft.handleState "handleState" function of the 107 107 * mlx.acft.Aircraft instance used. The mlx.acft module contains one … … 114 114 * smoothed values of IAS and VS, and then calls each "checker". A 115 115 * checker is an instance of a subclass of mlx.checks.StateChecker, 116 * which checks a one or a few parameters that are important from some 116 * which checks a one or a few parameters that are important from some 117 117 * aspect of the correct execution of a flight. For example, a checker 118 * may check if the \ref mlx.checks.StrobeLightsChecker 118 * may check if the \ref mlx.checks.StrobeLightsChecker 119 119 * "strobe lights" are switched on and off at the right stages of the 120 120 * flight. But some checkers simply log some \ref 121 121 * mlx.checks.AltimeterLogger "value" whenever it changes 122 122 * in an "interesting" way, or \ref mlx.checks.ACARSSender "send the 123 * ACARS" periodically. 123 * ACARS" periodically. 124 124 * 125 125 * There is also a \ref mlx.checks.StageCheker "checker" which 126 126 * detects the changes in the stage of the flight, and calls the 127 127 * \ref mlx.acft.Aircraft.setStage "setStage" function of the 128 * aircraft, if there is a change. It first calls the 128 * aircraft, if there is a change. It first calls the 129 129 * \ref mlx.flight.Flight "flight"'s \ref mlx.flight.Flight.setStage 130 130 * "setStage" function, which notifies the GUI and the \ref … … 139 139 * mlx.soundsched.SoundScheduler "sound scheduler" to check if some 140 140 * backround sound should be played. If the check list hotkey is 141 * pressed, the \ref mlx.soundsched.ChecklistScheduler 141 * pressed, the \ref mlx.soundsched.ChecklistScheduler 142 142 * "checklist scheduler" is notified too. 143 143 * 144 144 * As mentioned, there is a \ref mlx.logger.Logger "logger" in the 145 145 * application, which contains the textual log lines as well as the 146 * faults and their scores. 146 * faults and their scores. 147 147 * 148 148 * The business logic part contains many other components, but they … … 151 151 * modules for more information. 152 152 * 153 * \subsection arch_gui GUI 153 * \subsection arch_gui GUI 154 154 * 155 155 * As mentioned, the GUI is implemented using Gtk+. This toolkit … … 158 158 * experience with Glade in an earlier project, it was decided to not 159 159 * use it. Instead, the GUI elements are created and handled by 160 * hand-written code. 160 * hand-written code. 161 161 * 162 162 * The central class of the graphical user interface is … … 165 165 * connection to the simulator and creates the \ref mlx.flight.Flight 166 166 * "flight" and \ref mlx.flight.Aircraft "aircraft" objects as 167 * needed. 167 * needed. 168 168 * 169 169 * To understand the operation of the GUI, one should be familiar with 170 170 * Gtk+, but otherwise it is pretty straighforward. See the 171 * documentation of the relevant modules for more information. 172 * 173 * \section newtype Adding a new aircraft type 174 * 175 * While new aircraft types will probably not be added too often, here 176 * is a checklist about what should be modified when such a 177 * requirement arises. 178 * 179 * First, it is worth to know what data you need to add the new type: 180 * 181 * \li the aircraft's type name and its ICAO code 182 * \li the following weights: DOW, MZFW, MTOW, MLW 183 * \li the flap settings and their speed limits 184 * \li the speed limit for extending/retracting the gear (VLE) 185 * \li the number and types of the fuel tanks 186 * \li the type code the MAVA website uses to identify the type 187 * \li if the plane has reversers, what is the operating limit speed, 188 * if any 189 * \li does the plane support the notion of a takeoff derate, and if 190 * so, what data should be given 191 * \li what lights does the plane have 192 * 193 * If you have the data, you can add the type by modifying the source 194 * files as per the checklist below: 195 * 196 * -# \c src/mlx/const.py: look for the constants named AIRCRAFT_xxx. 197 * Add the new type at the end of the list of those constants, with 198 * a number 1 greater than the number of the last existing 199 * type. The part of the constant's name after the underscore (xxx 200 * above) should be the ICAO code of the aircraft type. 201 * -# \c src/mlx/const.py: below this list of constants, you can find 202 * an array named \c aircraftTypes. Add the type constant to it. 203 * -# \c src/mlx/const.py: further below you can find a dictionary 204 * mapping te aircraft type to the corresponding ICAO codes. Add 205 * the new type to it. 206 * -# \c src/mlx/acft.py: add a new subclass of \ref 207 * mlx.acft.Aircraft. Its name should be the ICAO code. Check an 208 * existing aircraft and add the same variables containing the 209 * weights, the flap speed limits and the gear speed limit. There 210 * may be some other member variables or functions that should be 211 * -# \c src/mlx/acft.py: there is a dictionary named \c _classes 212 * towards the end of the file. Add the type to it. 213 * -# \c src/mlx/web.py: the \ref mlx.web.BookedFlight class contains 214 * two dictionaries, the mapping between the types and the values the MAVA 215 * website uses to identify the type. Add the appropriate values 216 * here. 217 * -# \c src/mlx/fsuipc.py: add a subclass of \ref 218 * mlx.fsuipc.GenericAircraftModel for the new type named the ICAO 219 * code of the type followed by the word \c Model. Implement its 220 * constructor to supply the base class with the flaps notches 221 * (starting with 0), the array of constants describing the fuel 222 * tanks the model has, and the number of engines. Also implement 223 * the name of the model, which should be something like 224 * "FSUIPC/Generic ...". If necessary implement other functions or 225 * set other members. 226 * -# \c src/mlx/fsuipc.py: add the new type and model class to the 227 * dictionary named \c _genericModels towards the end of the file. 228 * -# \c src/mlx/fsuipc.py: if you have a model that has some 229 * non-generic characteristics, create a specific class for 230 * it. This class should be a subclass of the generic class 231 * created, and it should be registered at the bottom of the file, 232 * as the other models are. 233 * -# \c src/mlx/gui/common.py: this file contains a dictionary called 234 * \c mlx.gui.common.aircraftNames. Add the new type it it. It 235 * contains the mapping from the type constants to their 236 * language-specific names. The string ID is "aircraft_" followed by 237 * the lower-cased ICAO code. 238 * -# \c locale/hu/mlx.po, locale/en/mlx.po: the beginning of this 239 * file contains mapping from the string ID previously used to the 240 * actual name of the aircraft. Add the new type as appropriate. 241 * -# \c dcdatagen.py: this program generates some source and message 242 * files related to the delay codes. Currently there are two 243 * tables, one for old-timer types and the other for the "modern" types. 244 * The file contains a list of lists called \c typeGroups. Add the 245 * type's ICAO code the appropriate list. 246 * 247 * When all the changes have been made, run \c make in the root 248 * directory to update some source files. 171 * documentation of the relevant modules for more information. 249 172 */ 173 -
locale/en/mlx.po
r445 r393 63 63 msgid "aircraft_yk40" 64 64 msgstr "Yakovlev Yak-40" 65 66 msgid "aircraft_b462"67 msgstr "British Aerospace 146-200"68 65 69 66 msgid "file_filter_all" … … 780 777 msgstr "N_ominal/takeoff:" 781 778 782 msgid "takeoff_derate_b462"783 msgstr "Der_ate (yes/no):"784 785 779 msgid "takeoff_derate_tooltip" 786 780 msgstr "Enter the takeoff derate parameter." … … 977 971 msgid "info_delay" 978 972 msgstr "Delay codes" 973 974 msgid "info_delay_loading" 975 msgstr "L_oading problems" 976 977 msgid "info_delay_vatsim" 978 msgstr "_VATSIM problem" 979 980 msgid "info_delay_net" 981 msgstr "_Net problems" 982 983 msgid "info_delay_atc" 984 msgstr "Controll_er's fault" 985 986 msgid "info_delay_system" 987 msgstr "S_ystem crash/freeze" 988 989 msgid "info_delay_nav" 990 msgstr "Naviga_tion problem" 991 992 msgid "info_delay_traffic" 993 msgstr "T_raffic problems" 994 995 msgid "info_delay_apron" 996 msgstr "_Apron navigation problem" 997 998 msgid "info_delay_weather" 999 msgstr "_Weather problems" 1000 1001 msgid "info_delay_personal" 1002 msgstr "_Personal reasons" 979 1003 980 1004 msgid "statusbar_conn_tooltip" -
locale/hu/mlx.po
r445 r393 64 64 msgstr "Jakovlev Jak-40" 65 65 66 msgid "aircraft_b462"67 msgstr "British Aerospace 146-200"68 69 66 msgid "file_filter_all" 70 67 msgstr "Összes fájl" … … 781 778 msgstr "Névleges/felszállási:" 782 779 783 msgid "takeoff_derate_b462"784 msgstr "Teljesítménycsökkentés (yes/no):"785 786 780 msgid "takeoff_derate_tooltip" 787 781 msgstr "Írd be a felszállási teljesítménycsökkentés értékét." … … 980 974 msgid "info_delay" 981 975 msgstr "Késés kódok" 976 977 msgid "info_delay_loading" 978 msgstr "_Betöltési problémák" 979 980 msgid "info_delay_vatsim" 981 msgstr "_VATSIM probléma" 982 983 msgid "info_delay_net" 984 msgstr "_Hálózati problémák" 985 986 msgid "info_delay_atc" 987 msgstr "Irán_yító hibája" 988 989 msgid "info_delay_system" 990 msgstr "_Rendszer elszállás/fagyás" 991 992 msgid "info_delay_nav" 993 msgstr "Navi_gációs probléma" 994 995 msgid "info_delay_traffic" 996 msgstr "_Forgalmi problémák" 997 998 msgid "info_delay_apron" 999 msgstr "_Előtér navigációs probléma" 1000 1001 msgid "info_delay_weather" 1002 msgstr "Időjárási _problémák" 1003 1004 msgid "info_delay_personal" 1005 msgstr "S_zemélyes okok" 982 1006 983 1007 msgid "statusbar_conn_tooltip" -
src/mlx/acft.py
r447 r409 152 152 self._checkers.append(checks.VSChecker()) 153 153 154 timeout = 30.0 + config.realIASSmoothingLength - 1154 timeout = 5.0 + config.realIASSmoothingLength - 1 155 155 self._checkers.append(checks.OverspeedChecker(timeout = timeout)) 156 156 … … 1017 1017 #--------------------------------------------------------------------------------------- 1018 1018 1019 class B462(Aircraft):1020 """British Aerospace BAe-146 aircraft.1021 1022 The aircraft type-specific values in the aircraft state have the following1023 structure:1024 - fuel: left, centre, right1025 - n1: left outer, left inner, right inner, right outer1026 - reverser: empty (the plane has no reversers)"""1027 def __init__(self, flight):1028 super(B462, self).__init__(flight)1029 self.dow = 257061030 self.mtow = 439981031 self.mlw = 385991032 self.mzfw = 337921033 self.gearSpeedLimit = 2101034 self.flapSpeedLimits = { 18 : 217,1035 24 : 180,1036 30 : 170,1037 33 : 150 }1038 1039 @property1040 def derateLabels(self):1041 """Get the derate strings for this type."""1042 return (xstr("takeoff_derate_b462"), None)1043 1044 @property1045 def derateTemplate(self):1046 """Get the derate template for this aicraft type."""1047 return "Derate enabled: %s"1048 1049 #---------------------------------------------------------------------------------------1050 1051 1019 mostFuelTanks = [const.FUELTANK_LEFT_TIP, const.FUELTANK_EXTERNAL1, 1052 1020 const.FUELTANK_LEFT_AUX, … … 1072 1040 const.AIRCRAFT_T134 : T134, 1073 1041 const.AIRCRAFT_T154 : T154, 1074 const.AIRCRAFT_YK40 : YK40, 1075 const.AIRCRAFT_B462 : B462 } 1042 const.AIRCRAFT_YK40 : YK40 } 1076 1043 1077 1044 #--------------------------------------------------------------------------------------- -
src/mlx/checks.py
r450 r430 1054 1054 def isCondition(self, flight, aircraft, oldState, state): 1055 1055 """Check if the fault condition holds.""" 1056 return state.gLoad>2.0 and not state.onTheGround and\1057 (flight.stage!=const.STAGE_LANDING orstate.radioAltitude>=50)1056 return state.gLoad>2.0 and (flight.stage!=const.STAGE_LANDING or \ 1057 state.radioAltitude>=50) 1058 1058 1059 1059 def logFault(self, flight, aircraft, logger, oldState, state): … … 1122 1122 (flight.stage in 1123 1123 [const.STAGE_CRUISE, const.STAGE_DESCENT, 1124 const.STAGE_GOAROUND] or \ 1125 (flight.stage==const.STAGE_LANDING and 1126 state.groundSpeed>50.0) or \ 1124 const.STAGE_LANDING, const.STAGE_GOAROUND] or \ 1127 1125 ((not state.autoXPDR or \ 1128 1126 (self._liftOffTime is not None and … … 1241 1239 class OverspeedChecker(PatientFaultChecker): 1242 1240 """Check if Vne has been exceeded.""" 1243 def __init__(self, timeout = 30.0):1241 def __init__(self, timeout = 5.0): 1244 1242 """Construct the checker.""" 1245 1243 super(OverspeedChecker, self).__init__(timeout = timeout) … … 1310 1308 return flight.stage in [const.STAGE_DESCENT, const.STAGE_LANDING, 1311 1309 const.STAGE_TAXIAFTERLAND] and \ 1312 state.reverser and \1313 1310 state.groundSpeed<aircraft.reverseMinSpeed and max(state.reverser) 1314 1311 -
src/mlx/const.py
r443 r417 11 11 12 12 ## The version of the program 13 VERSION="0.1 6"13 VERSION="0.15" 14 14 15 15 #------------------------------------------------------------------------------- … … 95 95 ## Aircraft type: Yakovlev Yak-40 96 96 AIRCRAFT_YK40 = 15 97 98 ## Aircraft type: British Aerospace BAe-14699 AIRCRAFT_B462 = 16100 97 101 98 #------------------------------------------------------------------------------- … … 111 108 AIRCRAFT_B733, AIRCRAFT_B734, AIRCRAFT_B735, 112 109 AIRCRAFT_T154, AIRCRAFT_T134, 113 AIRCRAFT_YK40, AIRCRAFT_DC3, 114 AIRCRAFT_B462] 110 AIRCRAFT_YK40, AIRCRAFT_DC3] 115 111 116 112 #------------------------------------------------------------------------------- … … 133 129 AIRCRAFT_T134 : "T134", 134 130 AIRCRAFT_T154 : "T154", 135 AIRCRAFT_YK40 : "YK40", 136 AIRCRAFT_B462 : "B462" } 131 AIRCRAFT_YK40 : "YK40" } 137 132 138 133 #------------------------------------------------------------------------------- … … 242 237 #------------------------------------------------------------------------------- 243 238 239 ## Delay code: loading problems 240 DELAYCODE_LOADING = 0 241 242 ## Delay code: VATSIM problem 243 DELAYCODE_VATSIM = 1 244 245 ## Delay code: network problems 246 DELAYCODE_NETWORK = 2 247 248 ## Delay code: controller's fault 249 DELAYCODE_CONTROLLER = 3 250 251 ## Delay code: system crash or freeze 252 DELAYCODE_SYSTEM = 4 253 254 ## Delay code: navigation problem 255 DELAYCODE_NAVIGATION = 5 256 257 ## Delay code: traffic problems 258 DELAYCODE_TRAFFIC = 6 259 260 ## Delay code: apron navigation 261 DELAYCODE_APRON = 7 262 263 ## Delay code: weather problems 264 DELAYCODE_WEATHER = 8 265 266 ## Delay code: personal reasons 267 DELAYCODE_PERSONAL = 9 268 269 #------------------------------------------------------------------------------- 270 244 271 ## Message type: logger error 245 272 # FIXME: cannot set the hotkey -
src/mlx/fsuipc.py
r443 r412 2043 2043 #------------------------------------------------------------------------------ 2044 2044 2045 class B462Model(GenericAircraftModel):2046 """Generic model for the British Aerospace BAe 146-200 aircraft."""2047 fuelTanks = [const.FUELTANK_LEFT, const.FUELTANK_CENTRE,2048 const.FUELTANK_RIGHT]2049 2050 def __init__(self):2051 """Construct the model."""2052 super(B462Model, self). \2053 __init__(flapsNotches = [0, 18, 24, 30, 33],2054 fuelTanks = B462Model.fuelTanks,2055 numEngines = 4)2056 2057 @property2058 def name(self):2059 """Get the name for this aircraft model."""2060 return "FSUIPC/Generic British Aerospace 146"2061 2062 def getAircraftState(self, aircraft, timestamp, data):2063 """Get an aircraft state object for the given monitoring data.2064 2065 This removes the reverser value for the middle engine."""2066 state = super(B462Model, self).getAircraftState(aircraft, timestamp, data)2067 state.reverser = []2068 return state2069 2070 #------------------------------------------------------------------------------2071 2072 2045 _genericModels = { const.AIRCRAFT_B736 : B737Model, 2073 2046 const.AIRCRAFT_B737 : B737Model, … … 2085 2058 const.AIRCRAFT_T134 : T134Model, 2086 2059 const.AIRCRAFT_T154 : T154Model, 2087 const.AIRCRAFT_YK40 : YK40Model, 2088 const.AIRCRAFT_B462 : B462Model } 2060 const.AIRCRAFT_YK40 : YK40Model } 2089 2061 2090 2062 #------------------------------------------------------------------------------ -
src/mlx/gui/common.py
r443 r401 73 73 74 74 SHADOW_IN = gtk.SHADOW_IN 75 SHADOW_NONE = gtk.SHADOW_NONE76 75 77 76 POLICY_AUTOMATIC = gtk.POLICY_AUTOMATIC … … 87 86 88 87 EVENT_BUTTON_PRESS = gdk.BUTTON_PRESS 89 90 TREE_VIEW_COLUMN_FIXED = gtk.TREE_VIEW_COLUMN_FIXED91 92 FILL = gtk.FILL93 EXPAND = gtk.EXPAND94 88 95 89 pixbuf_new_from_file = gdk.pixbuf_new_from_file … … 145 139 146 140 SHADOW_IN = gtk.ShadowType.IN 147 SHADOW_NONE = gtk.ShadowType.NONE148 141 149 142 POLICY_AUTOMATIC = gtk.PolicyType.AUTOMATIC … … 159 152 160 153 EVENT_BUTTON_PRESS = gdk.EventType.BUTTON_PRESS 161 162 TREE_VIEW_COLUMN_FIXED = gtk.TreeViewColumnSizing.FIXED163 164 FILL = gtk.AttachOptions.FILL165 EXPAND = gtk.AttachOptions.EXPAND166 154 167 155 pixbuf_new_from_file = gdkPixbuf.Pixbuf.new_from_file … … 298 286 _const.AIRCRAFT_T134 : xstr("aircraft_t134"), 299 287 _const.AIRCRAFT_T154 : xstr("aircraft_t154"), 300 _const.AIRCRAFT_YK40 : xstr("aircraft_yk40"), 301 _const.AIRCRAFT_B462 : xstr("aircraft_b462") } 288 _const.AIRCRAFT_YK40 : xstr("aircraft_yk40") } 302 289 303 290 #------------------------------------------------------------------------------ -
src/mlx/gui/flight.py
r436 r413 368 368 def _loginClicked(self, button): 369 369 """Called when the login button was clicked.""" 370 print "mlx.flight.LoginPage: logg ingin"370 print "mlx.flight.LoginPage: logged in" 371 371 self._wizard.login(self._handleLoginResult, 372 372 self._pilotID.get_text(), … … 591 591 flight = self._getSelectedFlight() 592 592 self._wizard._bookedFlight = flight 593 self._wizard.gui.enableFlightInfo( flight.aircraftType)593 self._wizard.gui.enableFlightInfo() 594 594 595 595 self._updateDepartureGate() -
src/mlx/gui/gui.py
r450 r430 493 493 self.reset() 494 494 495 def enableFlightInfo(self , aircraftType):495 def enableFlightInfo(self): 496 496 """Enable the flight info tab.""" 497 self._flightInfo.enable( aircraftType)497 self._flightInfo.enable() 498 498 499 499 def cancelFlight(self): -
src/mlx/gui/info.py
r441 r349 1 1 2 2 from common import * 3 4 from mlx.gui.delaycodes import DelayCodeTable5 3 6 4 from mlx.i18n import xstr … … 23 21 """The flight info tab.""" 24 22 @staticmethod 23 def _delayCodes(): 24 """Get an array of delay codes.""" 25 return [ (const.DELAYCODE_LOADING, xstr("info_delay_loading")), 26 (const.DELAYCODE_VATSIM, xstr("info_delay_vatsim")), 27 (const.DELAYCODE_NETWORK, xstr("info_delay_net")), 28 (const.DELAYCODE_CONTROLLER, xstr("info_delay_atc")), 29 (const.DELAYCODE_SYSTEM, xstr("info_delay_system")), 30 (const.DELAYCODE_NAVIGATION, xstr("info_delay_nav")), 31 (const.DELAYCODE_TRAFFIC, xstr("info_delay_traffic")), 32 (const.DELAYCODE_APRON, xstr("info_delay_apron")), 33 (const.DELAYCODE_WEATHER, xstr("info_delay_weather")), 34 (const.DELAYCODE_PERSONAL, xstr("info_delay_personal")) ] 35 36 @staticmethod 25 37 def _createCommentArea(label): 26 38 """Create a comment area. … … 40 52 41 53 scroller = gtk.ScrolledWindow() 42 scroller.set_policy(POLICY_AUTOMATIC, POLICY_AUTOMATIC) 43 scroller.set_shadow_type(SHADOW_IN) 44 54 # FIXME: these should be constants 55 scroller.set_policy(gtk.PolicyType.AUTOMATIC if pygobject 56 else gtk.POLICY_AUTOMATIC, 57 gtk.PolicyType.AUTOMATIC if pygobject 58 else gtk.POLICY_AUTOMATIC) 59 scroller.set_shadow_type(gtk.ShadowType.IN if pygobject 60 else gtk.SHADOW_IN) 45 61 comments = gtk.TextView() 46 62 comments.set_wrap_mode(WRAP_WORD) … … 78 94 79 95 alignment = gtk.Alignment(xalign = 0.5, yalign = 0.5, 80 xscale = 1.0, yscale = 1.0)96 xscale = 0.0, yscale = 0.0) 81 97 alignment.set_padding(padding_top = 4, padding_bottom = 4, 82 98 padding_left = 8, padding_right = 8) 83 99 84 self._delayCodeTable = table = DelayCodeTable() 85 self._delayWindow = scrolledWindow = gtk.ScrolledWindow() 86 scrolledWindow.add(table) 87 scrolledWindow.set_size_request(-1, 185) 88 scrolledWindow.set_policy(POLICY_AUTOMATIC, POLICY_AUTOMATIC) 89 scrolledWindow.set_shadow_type(SHADOW_IN) 100 self._delayTable = table = gtk.Table(5, 2) 101 table.set_col_spacings(16) 90 102 91 alignment.add(scrolledWindow) 103 row = 0 104 column = 0 105 106 self._delayCodeWidgets = [] 107 for (_code, label) in FlightInfo._delayCodes(): 108 button = gtk.CheckButton(label) 109 button.set_use_underline(True) 110 table.attach(button, column, column + 1, row, row + 1) 111 self._delayCodeWidgets.append(button) 112 if column==0: 113 column += 1 114 else: 115 row += 1 116 column = 0 117 118 alignment.add(table) 92 119 frame.add(alignment) 93 120 94 121 self._delayAlignment = gtk.Alignment(xalign = 0.5, yalign = 0.5, 95 xscale = 1.0, yscale = 1.0)122 xscale = 0.0, yscale = 0.0) 96 123 self._delayAlignment.add(frame) 97 self._delayAlignment.set_padding(padding_top = 0, padding_bottom = 0,98 padding_left = 8, padding_right = 8)99 124 100 125 self.pack_start(self._delayAlignment, False, False, 8) … … 122 147 def delayCodes(self): 123 148 """Get the list of delay codes checked by the user.""" 124 return self._delayCodeTable.delayCodes 149 codes = [] 150 delayCodes = FlightInfo._delayCodes() 151 for index in range(0, len(delayCodes)): 152 if self._delayCodeWidgets[index].get_active(): 153 codes.append(delayCodes[index][0]) 154 return codes 125 155 126 def enable(self , aircraftType):156 def enable(self): 127 157 """Enable the flight info tab.""" 128 158 self._comments.set_sensitive(True) 129 159 self._flightDefects.set_sensitive(True) 130 self._delayCodeTable.setType(aircraftType) 131 self._delayWindow.set_sensitive(True) 132 self._delayCodeTable.setStyle() 160 self._delayTable.set_sensitive(True) 133 161 134 162 def disable(self): … … 136 164 self._comments.set_sensitive(False) 137 165 self._flightDefects.set_sensitive(False) 138 self._delayWindow.set_sensitive(False) 139 self._delayCodeTable.setStyle() 166 self._delayTable.set_sensitive(False) 140 167 141 168 def reset(self): … … 143 170 self._comments.get_buffer().set_text("") 144 171 self._flightDefects.get_buffer().set_text("") 145 self._delayCodeTable.reset() 172 173 for widget in self._delayCodeWidgets: 174 widget.set_active(False) 146 175 147 176 def _commentsChanged(self, textbuffer): -
src/mlx/gui/pirep.py
r437 r303 241 241 for code in pirep.delayCodes: 242 242 if delayCodes: delayCodes += ", " 243 delayCodes += code243 delayCodes += PIREP.delayCodeNames[code] 244 244 245 245 self._delayCodes.get_buffer().set_text(delayCodes) -
src/mlx/pirep.py
r437 r401 19 19 class PIREP(object): 20 20 """A pilot's report of a flight.""" 21 delayCodeNames = { const.DELAYCODE_LOADING : "Loading Problems", 22 const.DELAYCODE_NETWORK : "Net Problems", 23 const.DELAYCODE_SYSTEM : "System Crash/Freezing", 24 const.DELAYCODE_TRAFFIC : "Traffic Problems", 25 const.DELAYCODE_WEATHER : "Weather Problems", 26 const.DELAYCODE_VATSIM : "VATSIM Problem", 27 const.DELAYCODE_CONTROLLER : "Controller's Fault", 28 const.DELAYCODE_NAVIGATION : "Navigation Problem", 29 const.DELAYCODE_APRON : "Apron Navigation Problems", 30 const.DELAYCODE_PERSONAL : "Personal Reasons" } 31 21 32 @staticmethod 22 33 def _formatLine(timeStr, line): … … 129 140 for code in self.delayCodes: 130 141 if s: s += ", " 131 s += code142 s += PIREP.delayCodeNames[code] 132 143 return s 133 144 -
src/mlx/pyuipc_sim.py
r443 r408 158 158 ENGINE_3 = 2 159 159 160 ## Engine index: engine #4161 ENGINE_4 = 3162 163 160 ## The number of hotkey entries 164 161 HOTKEY_SIZE = 56 … … 298 295 self.visibility = 10000 299 296 300 self.n1 = [0.0, 0.0, 0.0 , 0.0]301 self.throttles = [0.0, 0.0, 0.0 , 0.0]297 self.n1 = [0.0, 0.0, 0.0] 298 self.throttles = [0.0, 0.0, 0.0] 302 299 303 300 self.payloadCount = 1 … … 331 328 self.eng2DeIce = False 332 329 self.eng3DeIce = False 333 self.eng4DeIce = False334 330 self.propDeIce = False 335 331 self.structDeIce = False … … 431 427 elif offset==0x09e2: # Engine #3 de-ice 432 428 return 1 if self.eng3DeIce else 0 433 elif offset==0x0a54: # Engine #4 throttle434 return self._getThrottle(self.ENGINE_4)435 elif offset==0x0a7a: # Engine #4 de-ice436 return 1 if self.eng4DeIce else 0437 429 elif offset==0x0af4: # Fuel weight 438 430 return int(self.fuelWeight * 256.0) … … 541 533 return self.n1[self.ENGINE_2] 542 534 elif offset==0x2200: # Engine #3 N1 543 return self.n1[self.ENGINE_3]544 elif offset==0x2300: # Engine #4 N1545 535 return self.n1[self.ENGINE_3] 546 536 elif offset==0x2ea0: # Elevator trim … … 705 695 elif offset==0x09e2: # Engine #3 de-ice 706 696 self.eng3DeIce = value!=0 707 elif offset==0x0a54: # Engine #4 throttle708 self._setThrottle(self.ENGINE_4, value)709 elif offset==0x0a7a: # Engine #4 de-ice710 self.eng4DeIce = value!=0711 697 elif offset==0x0af4: # Fuel weight 712 698 self.fuelWeight = value / 256.0 … … 810 796 elif offset==0x2200: # Engine #3 N1 811 797 self.n1[self.ENGINE_3] = value 812 elif offset==0x2300: # Engine #4 N1813 self.n1[self.ENGINE_4] = value814 798 elif offset==0x2ea0: # Elevator trim 815 799 self.elevatorTrim = value * 180.0 / math.pi … … 1429 1413 self._valueHandlers["n1_3"] = ([(0x2200, "f")], lambda value: value, 1430 1414 lambda word: float(word)) 1431 self._valueHandlers["n1_4"] = ([(0x2300, "f")], lambda value: value,1432 lambda word: float(word))1433 1415 1434 1416 self._valueHandlers["throttle_1"] = ([(0x088c, "H")], … … 1439 1421 CLI.throttle2pyuipc) 1440 1422 self._valueHandlers["throttle_3"] = ([(0x09bc, "H")], 1441 CLI.pyuipc2throttle,1442 CLI.throttle2pyuipc)1443 self._valueHandlers["throttle_4"] = ([(0x0a54, "H")],1444 1423 CLI.pyuipc2throttle, 1445 1424 CLI.throttle2pyuipc) … … 1511 1490 CLI.bool2str, CLI.str2bool) 1512 1491 self._valueHandlers["eng3Deice"] = ([(0x09e2, "H")], 1513 CLI.bool2str, CLI.str2bool)1514 self._valueHandlers["eng4Deice"] = ([(0x0a7a, "H")],1515 1492 CLI.bool2str, CLI.str2bool) 1516 1493 self._valueHandlers["propDeice"] = ([(0x337c, "b")], -
src/mlx/web.py
r450 r430 63 63 "TU3" : const.AIRCRAFT_T134, 64 64 "TU5" : const.AIRCRAFT_T154, 65 "YK4" : const.AIRCRAFT_YK40, 66 "146" : const.AIRCRAFT_B462 } 65 "YK4" : const.AIRCRAFT_YK40 } 67 66 68 67 TYPE2TYPECODE = { const.AIRCRAFT_B736 : "736", … … 81 80 const.AIRCRAFT_T134 : "TU3", 82 81 const.AIRCRAFT_T154 : "TU5", 83 const.AIRCRAFT_YK40 : "YK4", 84 const.AIRCRAFT_B462 : "146" } 82 const.AIRCRAFT_YK40 : "YK4" } 85 83 86 84 @staticmethod
Note:
See TracChangeset
for help on using the changeset viewer.