Ignore:
Files:
1 added
13 edited

Legend:

Unmodified
Added
Removed
  • MLXMANIFEST

    r494 r504  
    77library/fnmatch.pyc     3414    4d50000f78e903598af06ef1c5cfb3ef
    88library/libexpat-1.dll  143096  701659d3689bf4a8265b669b7d774255
    9 library/gtk/_gtk.pyc    549     01ab724263b682fef252e76719620966
     9library/gtk/_gtk.pyc    549     0d0a77cca8e542a13b7f8ed84ae3a547
    1010library/encodings/cp858.pyc     7591    02054a0b8e91b9758826eb70cddf096f
    1111library/mlx/pirep.pyc   4623    2a008f269c900fb604b94b4e427f61b5
     
    1313library/encodings/unicode_internal.pyc  2022    1e902113491e0c334b44deb0c8940e01
    1414library/libpango-1.0-0.dll      333729  5a14efd93ee27cfe960220fe4a904911
    15 library/mlx/gui/gui.pyc 50869   f16e03a735b1b3181d5477272f937f49
     15library/mlx/gui/gui.pyc 51077   c54af5d2051a31bc3c46a7d690cd1552
    1616library/stat.pyc        2503    d3b6dc7a54e705219f04d0be75a212de
    1717library/posixpath.pyc   10734   d694316c239784c444b252c801c97efa
     
    2222doc/manual/hu/bugreport.png     12385   c71c7db56f19870ae5d6bb7f533d3679
    2323library/share/locale/hu/LC_MESSAGES/gtk20.mo    58794   6ee4491ae7bc9d3dfb778578eb29a0b3
    24 library/gobject/_gobject.pyc    573     10867282062943d560e4ee8a6fe45c02
    25 locale/en/LC_MESSAGES/mlx.mo    61476   1698298a3947ef2f3a24496b9357ed12
     24library/gobject/_gobject.pyc    573     92d29c5d8b466d18acef25eaa9cba97f
     25locale/en/LC_MESSAGES/mlx.mo    61639   aa73425f6f3c43fa83be90b9909f369e
    2626library/encodings/utf_7.pyc     1747    2beeb059236527197d6c640396476ce8
    2727doc/manual/hu/pirepViewer.png   26835   267e4325e550ed14ed22f86a2c7e8e9d
     
    6363library/encodings/utf_8.pyc     1806    4b8dee0284ea2f55c4142fcde7463524
    6464library/unicodedata.pyd 688128  c856c31a03dc892e4f2aee93d0bfee44
    65 locale/hu/LC_MESSAGES/mlx.mo    66075   a3ac01dc28e8960460ef446c47766217
     65locale/hu/LC_MESSAGES/mlx.mo    66240   db0a23e9f1d4657562180946ae340f22
    6666library/encodings/mac_roman.pyc 2716    4b4745eccfcb77860b70b374ac07fbcc
    6767library/copy_reg.pyc    4893    7a58bc441232056d1c123cd3375b3774
     
    7676library/_hashlib.pyd    287232  a1a18de0644f481749fcbcf26005eeaf
    7777doc/manual/en/monitorWindow.png 20886   42e08d10c758e21209c4c021f391dee7
    78 library/_hashlib.pyc    549     bb6f94508135e4f447a7af40f75e97c7
     78library/_hashlib.pyc    549     ec9a5e38a98eaf491bd44048fe3f8d16
    7979library/libpng14-14.dll 230529  f3a15497e25baaa721f96638d7a4d2f8
    8080library/copy.pyc        11674   30d1745c5e38ab170f8a0486fbebf305
     
    8787library/select.pyd      11776   d90bf525f9f6c9c3aa6532fa6e569b4f
    8888library/base64.pyc      10528   39abec9c60dc011d3c763f443f9b1a11
    89 library/mlx/gui/bugreport.pyc   4602    cb1b9d897bafb5ece830db76df683f63
     89library/mlx/gui/bugreport.pyc   4602    40b93f71f84bcbaa3c4918516acae15c
    9090library/traceback.pyc   11223   50ace5c2c6c040a923082442da94cd78
    9191library/_weakrefset.pyc 9290    a56e87c491c0511cd329a3c8c4cd9563
    92 library/mlx/flight.pyc  17303   5dea088a693918b1749263990c6e8b25
     92library/mlx/flight.pyc  17473   8b37fd80c11c3a89738f5e4e1cda5578
    9393library/urllib2.pyc     43566   7eb57ea0dcd1086d1d9073a5cefb0903
    9494doc/manual/en/flightSelection.png       29847   7817c8f5ed8d7fe64cf72d0addaf3e4a
     
    135135sounds/767taxi.mp3      160496  4cb43cda6e1214fbe15328a716827345
    136136doc/manual/en/prefsAdvanced.png 16169   64c14e0842c413cac98b92926279f3e0
    137 library/cairo/_cairo.pyc        561     bc5f5d52b0855de9123a104c87c1ff05
    138 library/win32file.pyc   552     d5615f88eec920b139331f60a7451d6f
     137library/cairo/_cairo.pyc        561     6ac388cead1acc49e51e05d06033ad23
     138library/win32file.pyc   552     e12cc4667c80e4f5fb88cf46ec92d734
    139139library/encodings/cp865.pyc     7868    7d40a7ba053ac23339218be8799e5397
    140140library/lib/gtk-2.0/2.10.0/engines/libwimp.dll  97984   a5bbbe46e1363aba9020a76f2d58e9d6
     
    145145library/share/locale/hu/LC_MESSAGES/gtk20-properties.mo 167125  cd1b1b3693c1e3c74bfcea20be640cc6
    146146conn_red.png    914     860388cb7c3b26b2f348fdbee40780ce
    147 library/bz2.pyc 534     3480c8fcdb012cd24bc649ca4fbac334
     147library/bz2.pyc 534     5595f0a4a8ffd0b63f7542fddc918028
    148148library/xml/sax/expatreader.pyc 13563   4f64c0efb2f1f8dbba84cdb5c6036f2d
    149149library/email/utils.pyc 8840    a7be428df6fddee6121cfce55382d1f8
     
    161161library/mlx/gui/statusbar.pyc   4812    87773f7d0bd28ed6250acf1972110ca8
    162162library/warnings.pyc    12666   9788b5f45765e8204e04c820f2711094
    163 mlxupdate.exe   19456   a9a83918df9f5a042697d207d68bd300
    164 library/mlx/const.pyc   6707    95c101c7e31b0fdc9c219ceed3269136
     163mlxupdate.exe   18944   b8bf9f3d22348aa1f78727f81d967f93
     164library/mlx/const.pyc   6710    2187949c18be095bada1927f3127d0cf
    165165library/email/errors.pyc        3229    cdb78ab237e195ad69f059128bc03b1d
    166166library/linecache.pyc   3091    666e6f81b0ea9a7637f8068493f738d5
     
    175175library/shlex.pyc       7282    cbe1a4823894c97c87d01f9d9faf5b8f
    176176library/cairo/__init__.pyc      142     010dd7cc8485565d5782d60e92e4ba34
    177 library/_ssl.pyc        537     fc20fea54ee0d9da3826a70fc3d6b19c
     177library/_ssl.pyc        537     d7b3b5f87a333acdf28a28f52c5c8ce7
    178178library/encodings/iso8859_8.pyc 2717    f3ad6ce58cfac9e3ca86cf5c2fef092b
    179179library/encodings/iso2022_jp_1.pyc      1699    faed9d5747e982cec9fa8b3ad8e1de26
     
    196196library/encodings/cp1252.pyc    2676    b4c43cc72650c911cf3654dbaf565df9
    197197library/share/locale/hu/LC_MESSAGES/atk10.mo    8465    e3f3466da367215aad971d7b0394229d
    198 library/unicodedata.pyc 558     13df5f4887a442353ba4946d4da4887f
    199 library/select.pyc      543     40f3097f43a31700f3fb640cefb93106
     198library/unicodedata.pyc 558     9570da5a79cb8e2156f6577185461f85
     199library/select.pyc      543     ad5bc4844763975968138f81e1e9ac65
    200200library/encodings/uu_codec.pyc  4646    5282a5fcb676851224d2924aa3e48a9e
    201201library/ConfigParser.pyc        23857   1d17020dd0000ce0f73de812effa152f
     
    217217library/mlx/singleton.pyc       9184    3b71000d428959ab355db2658cea9557
    218218library/locale.pyc      48754   a51d20267132acc6bc66ac6252cf870f
     219library/xplra.pyc       32012   50a1d9f19c0cc88783d264909ad1c678
    219220library/socket.pyc      15488   35f8eb455d6d8df8e19826d1dd7193f2
    220221sounds/notify.wav       119384  108025b17f67e61946df5d7fbf713cdb
     
    228229doc/manual/hu/flightInfoTab.png 28786   3e8af27775131f02696b0912ca441f36
    229230library/encodings/utf_8_sig.pyc 4625    1b1405db186e5819fa271ff96c1ca2c5
    230 library/pangocairo.pyc  555     64aeb5c4fabbf2e53888ad5f32a6a543
     231library/pangocairo.pyc  555     33065d79493949ba073d7fc7b165004b
    231232library/encodings/cp1255.pyc    2697    b265913c887f2e1c8736632b652c0093
    232233library/encodings/zlib_codec.pyc        4308    319c9073aff840436a03cc1fa0b08fb5
     
    235236doc/manual/hu/connect.png       28822   929f3eb85ee3cad019e12017c923f664
    236237library/encodings/palmos.pyc    2876    9284ad53dcfd82dfae0a79923b1cf91d
    237 library/mlx/web.pyc     30343   f51920501671cdb2752a7e3aba736f8b
     238library/mlx/web.pyc     30343   0cab98a640fd3937828d24c2fe8ef0ef
    238239library/mlx/gui/gates.pyc       5384    9f6acad03872832505e31406a1b6762b
    239240library/email/feedparser.pyc    10682   4de6a63da8dc270c9881edb9c2f28508
     
    241242library/intl.dll        152489  eb2d4c4d4a527bc88a69a16cc99afcf5
    242243library/encodings/mbcs.pyc      1883    2213911a7dd0deada6799b63e18b695b
    243 library/pyuipc.pyc      543     2c9972aae2b17df1fb358cdd2338e577
     244library/pyuipc.pyc      543     c194030ac361f97edfcf756a91a949f1
    244245sounds/TOC.mp3  273032  fae1be2ad25c8b54806bd1d759919705
    245246library/encodings/iso8859_4.pyc 2678    16f2fe7994051752360c533c052b892b
     
    265266doc/manual/hu/flightSelection.png       30815   e8bcdda6079c6b16ffa72ca62c21ca85
    266267library/win32pipe.pyd   24064   de374eded459293b2a7eb8ed8fb38eaa
    267 library/win32pipe.pyc   552     aa728de41e6d4631d29aff7cd881238f
     268library/win32pipe.pyc   552     79ce5d61fe62ec37a212e8a854f2807b
    268269doc/manual/hu/cruise.png        27460   a2610173563e45baae1b0f9e63007ebd
    269270doc/manual/hu/logTab.png        28706   f48004202310bd2a1cb2f873d8064e93
    270271library/encodings/iso2022_jp_2004.pyc   1723    66376e788f3819e781897268c1100986
    271 library/win32event.pyc  555     e63b8e35e47f054dff396030169e6620
     272library/win32event.pyc  555     63b964537d2e2157645cab4a6b90e68d
    272273library/encodings/cp866.pyc     8103    f36418dcf93b17b3ced63bd544f44159
    273 library/gio/_gio.pyc    549     834dd5bbbac7b7a4b756a0d5f66a47f0
     274library/gio/_gio.pyc    549     41b7fad0fabe6f41db16a6e05d415848
    274275library/encodings/cp437.pyc     7874    63f1278c0a66129c6fb4f504d6b61b66
    275276doc/manual/hu/helpTab.png       27961   8e7cc4aeb8d7f40fcf186c7caf53583b
     
    294295library/mlx/gui/pirep.pyc       16749   7a295b28dbdad43b33c52d814be60792
    295296library/mimetypes.pyc   17806   927ce6a7079707aaee925e855ed23454
    296 library/_ctypes.pyc     546     f6d7b651ecb48c9f39af248b440a7102
     297library/_ctypes.pyc     546     d4c47f95473dc9d7b363d62b26db0a7e
    297298sounds/F70taxi.mp3      154854  51332dc691d3519355f61ed06c959d8d
    298299library/encodings/cp857.pyc     7611    1b46c8959ac097b73e1c680d464cdc32
     
    312313library/repr.pyc        5045    82f0d89c685c3dacd941e01e4b2f31ef
    313314library/quopri.pyc      6352    87c42d94f753dd4c8a761cfa79453bb8
    314 library/mlx/gui/monitor.pyc     12021   e6ca05162aa5fee265de2a5a63f0a62c
     315library/mlx/gui/monitor.pyc     12214   6814c319b26ad7213e0759cf909c788d
    315316library/encodings/latin_1.pyc   2111    52427573ccbfd06220b67d5a9dd1376e
    316317library/mlx/update.pyc  16952   b4c0e85d094410aa0b7075476962730d
     
    321322doc/manual/en/gatesTab.png      29585   00ebc96a2b4a7473dbb6a3162a04192f
    322323library/bdb.pyc 17708   9a8fdcaa65f595c842689247847879d9
    323 library/mlx/gui/flight.pyc      111770  b038aaa14a31b4ba86b86b84f1a98aca
     324library/mlx/gui/flight.pyc      112899  536e12fba696bbc0781e2b5e73e8ea54
    324325library/unittest/case.pyc       37758   1d2235e74c246b562c5c00ddf73c621a
    325326library/subprocess.pyc  38648   c9f749db06dfc9fb32079de51d6efd01
     
    337338library/encodings/cp863.pyc     7868    fc7ff06dab536b93c68fcb8e7bac713f
    338339library/xml/parsers/__init__.pyc        294     83f6a77ed8cd962b3c75c4779dc557ac
    339 library/pyexpat.pyc     546     5a5b32b24e875d2d4a1cbd12351ee7c1
     340library/pyexpat.pyc     546     3868a2225d9e99907f2cd9d97ef9a300
    340341doc/manual/hu/gateSelection.png 29237   bac37e7001261a40a84e4202247f6052
    341342logo.png        69816   4a7517b22cfd75cc9c15e3fc1b7ebeec
     
    363364library/_socket.pyd     38400   5d273be76603399e88cf57f2605004bf
    364365sounds/ding.wav 80856   18e639792d3767436ac6955eb60e4f54
    365 library/_socket.pyc     546     287b7b44eacfe6d10ec0f114f2f212c2
     366library/_socket.pyc     546     e4eede84eacb1ffb8a725cfda432fb76
    366367library/encodings/hex_codec.pyc 3520    a8b8d5b7c8810379c7007bcbc253951c
    367 library/mlx/checks.pyc  58364   a10d1aef350f56c74fc4cdfe04bedfcd
     368library/mlx/checks.pyc  58567   d6c6eebab7a0a19c5f33007ce8b4c3e5
    368369doc/manual/en/statusIcon2.png   5875    71fc121823dee0a4c00715fac1b5665c
    369 library/mlx/sound.pyc   6326    fdf54890d13eb07e1bd1f8c490d61893
     370library/mlx/sound.pyc   10001   78655c3a51de983d8e550934c05e1f30
    370371doc/manual/en/pirepViewer.png   25098   7c545e70b995ac0f9fcae93fe5d0e899
    371372library/encodings/aliases.pyc   8750    75c22196420d0157fec085d285947a71
    372 library/glib/_glib.pyc  555     7e925b500c71e85d074b65a6a541e9ec
     373library/glib/_glib.pyc  555     465b8ddc57386c9f7ef448d9cb802abd
    373374library/libpangowin32-1.0-0.dll 108945  d07f128828225b7cc38e9e590eb3ba8a
    374375library/encodings/iso8859_10.pyc        2693    5e6cc8f721486ddbc1c99da285e13191
    375 library/win32api.pyc    549     64dda4ce6ef6ed316210bf9a3679f919
     376library/win32api.pyc    549     efb111e7d3dae80fd15bf47d026e6114
    376377library/gobject/constants.pyc   1957    2e9cdc605e7c449ef4fc23f56128acec
    377378library/libgtk-win32-2.0-0.dll  4938115 cc6dca192aca6f91bd96a5b5f86e036d
    378379doc/manual/hu/calloutsEditor.png        16026   fede870894a85e5d21ca16a026aa6a98
     380library/mlx/xplane.pyc  66878   9ee20e3efd68fd414ca3b4716c1f2985
    379381library/ssl.pyc 13785   d90c880699ecbedb3182f556b9733868
    380382library/tempfile.pyc    18526   e2cc2d63c29e15f20ee9325e790643a3
     
    419421library/libgthread-2.0-0.dll    44287   7ad6f303082b382bff7bafbab246c61f
    420422library/glib._glib.pyd  58368   0de636503e43c4eb00e80927bc9bda97
    421 library/mlx/config.pyc  29918   40fff6f2c4a35ff492efe8781cbf5ff8
    422 library/atk.pyc 534     8407c9b900936751dde6b616e124a504
     423library/mlx/config.pyc  30521   406992cc40c69fc2054e02d516088ba9
     424library/atk.pyc 534     7e987d4ee2de16ac0050d9e1944a860a
    423425library/gio._gio.pyd    263168  acb8c95fdc391079bebdf7d8685b0dbc
    424426library/encodings/cp861.pyc     7868    c97a8970ce4d9f40cbafbea6576fbdca
     
    430432library/__future__.pyc  4177    43d264d951ac2085334c7b9dd4558595
    431433library/logging/__init__.pyc    54813   7bcdf2e8da474f5e94d8e499f6fc3ed4
    432 runmlx.exe      64000   c7dc94ee996f138cad50db207cebf391
     434runmlx.exe      63488   3060aa0ed73648edc26992e224568352
    433435library/optparse.pyc    51253   39594a40bc1222173d57b7d5740e3d92
    434 library/mlx/fs.pyc      11756   0d3bccf67fe41e1bdc60c718ee0388fa
     436library/mlx/fs.pyc      11803   268cda55420c4ce0750029ea203155e6
    435437doc/manual/en/takeoff.png       26128   63fb0227347eba88fe4f108d730dc8c0
    436438library/unittest/result.pyc     7444    aefbb3cc79c0ff17787ce84faed7f5e8
     
    443445library/glib/option.pyc 11891   bd90183c75d8f473ecf653e3d63a27f9
    444446library/StringIO.pyc    11100   f4eb4a2bb3d6fb0af925681c5375c673
    445 library/pango.pyc       540     026b1be89c67b8c07e97a8bd88b348ca
     447library/pango.pyc       540     1b3d8d42905b120b95525147e2fd4b0a
    446448Microsoft.VC90.CRT/msvcp90.dll  568832  6de5c66e434a9c1729575763d891c6c2
    447449library/sre_parse.pyc   18380   fe2376a101668be1124f9ee316662bab
  • locale/en/mlx.po

    r508 r509  
    470470msgid "connect_gate"
    471471msgstr "Gate:"
     472
     473msgid "connect_sim"
     474msgstr "Simulator:"
     475
     476msgid "connect_sim_msfs"
     477msgstr "_MS FS"
     478
     479msgid "connect_sim_xplane"
     480msgstr "_X-Plane"
    472481
    473482msgid "button_connect"
  • locale/hu/mlx.po

    r508 r509  
    473473msgstr "Kapu:"
    474474
     475msgid "connect_sim"
     476msgstr "Szimulátor:"
     477
     478msgid "connect_sim_msfs"
     479msgstr "_MS FS"
     480
     481msgid "connect_sim_xplane"
     482msgstr "_X-Plane"
     483
    475484msgid "button_connect"
    476485msgstr "K_apcsolódás"
  • setup.py

    r378 r497  
    6666      package_dir = { "" : "src" },
    6767      packages = ["mlx", "mlx.gui"],
    68       requires = ["pyuipc"],
     68      requires = ["pyuipc", "xplra"],
    6969      windows = [{ "script" : "runmlx.py",
    7070                   "icon_resources" : [(1, "logo.ico")]},
  • src/mlx/checks.py

    r480 r496  
    957957        """Check if the fault condition holds."""
    958958        if flight.stage==const.STAGE_CRUISE:
    959             bankLimit = 30
     959            isDH8DXplane = flight.aircraftType==const.AIRCRAFT_DH8D and \
     960                           (flight.fsType==const.SIM_XPLANE10 or
     961                            flight.fsType==const.SIM_XPLANE9)
     962            bankLimit = 35 if isDH8DXplane else 30
    960963        elif flight.stage in [const.STAGE_TAKEOFF, const.STAGE_CLIMB,
    961964                              const.STAGE_DESCENT, const.STAGE_LANDING]:
     
    968971    def logFault(self, flight, aircraft, logger, oldState, state):
    969972        """Log the fault."""
     973        message = "Bank too steep (%.1f)" % (state.bank,)
    970974        flight.handleFault(BankChecker, state.timestamp,
    971                            FaultChecker._appendDuring(flight, "Bank too steep"),
     975                           FaultChecker._appendDuring(flight, message),
    972976                           2)
    973977
  • src/mlx/config.py

    r486 r503  
    236236        self._pirepAutoSave = False
    237237
     238        self._defaultMSFS = os.name=="nt"
     239
    238240        self._enableSounds = not secondaryInstallation
    239241
     
    471473        if pirepAutoSave!=self._pirepAutoSave:
    472474            self._pirepAutoSave = pirepAutoSave
     475            self._modified = True
     476
     477    @property
     478    def defaultMSFS(self):
     479        """Get if the default simulator type is MS FS."""
     480        return self._defaultMSFS
     481
     482    @defaultMSFS.setter
     483    def defaultMSFS(self, defaultMSFS):
     484        """Set if the default simulator type is MS FS."""
     485        if defaultMSFS!=self._defaultMSFS:
     486            self._defaultMSFS = defaultMSFS
    473487            self._modified = True
    474488
     
    704718                ApproachCallouts.fromConfig(config, aircraftType)
    705719
     720        self._defaultMSFS = self._getBoolean(config, "general",
     721                                             "defaultMSFS", os.name=="nt")
     722
    706723        self._modified = False
    707724
     
    746763                   "yes" if self._pirepAutoSave else "no")
    747764
     765        config.set("general", "defaultMSFS",
     766                   "yes" if self._defaultMSFS else "no")
     767
    748768        config.add_section(Config._messageTypesSection)
    749769        for messageType in const.messageTypes:
     
    890910        print "  pirepAutoSave:", self._pirepAutoSave
    891911
     912        print "  defaultMSFS:", self._defaultMSFS
     913
    892914        print "  enableSounds:", self._enableSounds
    893915
  • src/mlx/const.py

    r506 r509  
    1111
    1212## The version of the program
    13 VERSION="0.19"
     13VERSION="0.19xpl"
    1414
    1515#-------------------------------------------------------------------------------
  • src/mlx/flight.py

    r391 r430  
    8686        """Get the flight stage."""
    8787        return self._stage
     88
     89    @property
     90    def fsType(self):
     91        """Get the flight simulator type."""
     92        return self._gui.fsType
    8893
    8994    @property
  • src/mlx/fs.py

    r408 r501  
    33from sound import startSound
    44
     5import os
     6
    57import fsuipc
     8import xplane
     9
    610import threading
    711import time
     
    5660    FIXME: add info
    5761    """
    58     assert type in [const.SIM_MSFS9, const.SIM_MSFSX], \
    59            "Only MS Flight Simulator 2004 and X are supported"
    60     return fsuipc.Simulator(connectionListener, connectAttempts = 3)
     62    if type in [const.SIM_MSFS9, const.SIM_MSFSX]:
     63        return fsuipc.Simulator(connectionListener, connectAttempts = 3)
     64    elif type in [const.SIM_XPLANE9, const.SIM_XPLANE10]:
     65        return xplane.Simulator(connectionListener, connectAttempts = 3)
     66    else:
     67        "Only MS Flight Simulator 2004 and X or X-Plane 9 and 10 are supported"
    6168
    6269#-------------------------------------------------------------------------------
     
    9097        with self._requestCondition:
    9198            self._toQuit = True
    92             self._requestCondition.notifty()
     99            self._requestCondition.notify()
    93100        self.join()
    94101
  • src/mlx/gui/flight.py

    r436 r503  
    880880                                          completedHelp = xstr("connect_chelp"))
    881881
     882        self._selectSimulator = os.name=="nt" or "FORCE_SELECT_SIM" in os.environ
     883
    882884        alignment = gtk.Alignment(xalign = 0.5, yalign = 0.5,
    883885                                  xscale = 0.0, yscale = 0.0)
    884886
    885         table = gtk.Table(5, 2)
     887        table = gtk.Table(7 if self._selectSimulator else 5, 2)
    886888        table.set_row_spacings(4)
    887889        table.set_col_spacings(16)
     
    949951        labelAlignment.add(self._departureGate)
    950952        table.attach(labelAlignment, 1, 2, 4, 5)
     953
     954        if self._selectSimulator:
     955            labelAlignment = gtk.Alignment(xalign=1.0, xscale=0.0, yalign=0.5)
     956            label = gtk.Label(xstr("connect_sim"))
     957            labelAlignment.add(label)
     958            table.attach(labelAlignment, 0, 1, 5, 7)
     959
     960            selectAlignment = gtk.Alignment(xalign=0.0, xscale=0.0, yalign=0.5)
     961
     962            selectBox = gtk.HBox()
     963            if pygobject:
     964                self._selectMSFS = \
     965                  gtk.RadioButton.new_with_mnemonic_from_widget(None,
     966                                                                xstr("connect_sim_msfs"))
     967            else:
     968                self._selectMSFS = gtk.RadioButton(None,
     969                                                   xstr("connect_sim_msfs"))
     970
     971            selectBox.pack_start(self._selectMSFS, False, False, 0);
     972
     973            if pygobject:
     974                self._selectXPlane = \
     975                  gtk.RadioButton.new_with_mnemonic_from_widget(self._selectMSFS,
     976                                                                xstr("connect_sim_xplane"))
     977            else:
     978                self._selectXPlane = gtk.RadioButton(self._selectMSFS,
     979                                                     xstr("connect_sim_xplane"))
     980
     981            selectBox.pack_start(self._selectXPlane, False, False, 8);
     982
     983            selectAlignment.add(selectBox)
     984            table.attach(selectAlignment, 1, 2, 5, 7)
     985
    951986
    952987        self.addCancelFlightButton()
     
    9821017        self._departureGate.set_markup(gate)
    9831018
     1019        if self._selectSimulator:
     1020            config = self._wizard.gui.config
     1021            self._selectMSFS.set_active(config.defaultMSFS)
     1022            self._selectXPlane.set_active(not config.defaultMSFS)
     1023
    9841024    def finalize(self):
    9851025        """Finalize the page."""
     
    9961036    def _connectClicked(self, button):
    9971037        """Called when the Connect button is pressed."""
    998         self._wizard._connectSimulator()
     1038        if self._selectSimulator:
     1039            simulatorType = const.SIM_MSFS9 if self._selectMSFS.get_active() \
     1040                                            else const.SIM_XPLANE10
     1041        else:
     1042            simulatorType = const.SIM_MSFS9 if os.name=="nt" \
     1043              else const.SIM_XPLANE10
     1044
     1045        config = self._wizard.gui.config
     1046        config.defaultMSFS = simulatorType == const.SIM_MSFS9
     1047        config.save()
     1048
     1049        self._wizard._connectSimulator(simulatorType)
    9991050
    10001051    def _forwardClicked(self, button):
     
    34943545        self.gui.rtoToggled(indicated)
    34953546
    3496     def _connectSimulator(self):
     3547    def _connectSimulator(self, simulatorType):
    34973548        """Connect to the simulator."""
    3498         self.gui.connectSimulator(self._bookedFlight.aircraftType)
     3549        self.gui.connectSimulator(self._bookedFlight.aircraftType,
     3550                                  simulatorType)
    34993551
    35003552    def _arrivalMETARCallback(self, returned, result):
  • src/mlx/gui/gui.py

    r491 r501  
    6969        self._flight = None
    7070        self._simulator = None
     71        self._fsType = None
    7172        self._monitoring = False
    7273
     
    208209
    209210    @property
     211    def fsType(self):
     212        """Get the flight simulator type."""
     213        return self._fsType
     214
     215    @property
    210216    def entranceExam(self):
    211217        """Get whether an entrance exam is about to be taken."""
     
    428434            self._wizard.connected(fsType, descriptor)
    429435        self._reconnecting = False
     436        self._fsType = fsType
    430437        self._listenHotkeys()
    431438
     
    512519        """Reset the GUI."""
    513520        self._disconnect()
     521
     522        self._simulator = None
    514523
    515524        self._flightInfo.reset()
     
    887896            self._stdioStartingLine = False
    888897
    889     def connectSimulator(self, aircraftType):
     898    def connectSimulator(self, aircraftType, simulatorType):
    890899        """Connect to the simulator for the first time."""
    891900        self._logger.reset()
     
    898907
    899908        if self._simulator is None:
    900             self._simulator = fs.createSimulator(const.SIM_MSFS9, self)
     909            self._simulator = fs.createSimulator(simulatorType, self)
    901910            fs.setupMessageSending(self.config, self._simulator)
    902911            self._setupTimeSync()
  • src/mlx/gui/monitor.py

    r480 r496  
    226226        table.attach(label, 0, 1, 8, 9)
    227227        table.attach(self._qnh, 1, 2, 8, 9)
     228
     229        (label, self._cog) = self._createLabeledEntry("CoG:", 7)
     230        table.attach(label, 2, 3, 8, 9)
     231        table.attach(self._cog, 3, 4, 8, 9)
    228232
    229233        alignment.add(table)
     
    312316            self._adf2.set_text("-")
    313317            self._qnh.set_text("-")
     318            self._cog.set_text("-")
    314319        else:
    315320            self._timestamp.set_text(time.strftime("%H:%M:%S",
     
    386391            self._gearControlDown.set_sensitive(aircraftState.gearControlDown)
    387392            self._gearsDown.set_sensitive(aircraftState.gearsDown)
    388             self._spoilersArmed.set_sensitive(aircraftState.spoilersArmed)
     393            self._spoilersArmed.set_sensitive(aircraftState.spoilersArmed is True)
    389394            self._spoilersExtension.set_text("%.0f" % (aircraftState.spoilersExtension,))
    390395            self._windSpeed.set_text("%.0f" % (aircraftState.windSpeed,))
     
    404409            self._adf1.set_text("-" if aircraftState.adf1 is None else aircraftState.adf1)
    405410            self._adf2.set_text("-" if aircraftState.adf2 is None else aircraftState.adf2)
     411            self._cog.set_text("%.2f%%" % (aircraftState.cog*100.0,))
    406412
    407413#------------------------------------------------------------------------------
  • src/mlx/sound.py

    r401 r422  
    166166    def startSound(name, finishCallback = None, extra = None):
    167167        """Start playing back the given sound.
    168        
     168
    169169        name should be the name of a sound file relative to the sound directory
    170170        given in initializeSound."""
    171171        _thread.requestSound(name, finishCallback = finishCallback,
    172172                             extra = extra)
    173        
     173
    174174#------------------------------------------------------------------------------
    175175
    176176else: # os.name!="nt"
    177     def initializeSound(soundsDirectory):
    178         """Initialize the sound handling with the given directory containing
    179         the sound files."""
    180         pass
    181 
    182     def startSound(name, finishCallback = None, extra = None):
    183         """Start playing back the given sound.
    184 
    185         FIXME: it does not do anything currently, but it should."""
    186         print "sound.startSound:", name
     177    import threading
     178    try:
     179        import pyglet
     180
     181        class SoundThread(threading.Thread):
     182            """A thread executing the pyglet event loop that directs the
     183            playback of the sound files."""
     184            class Player(pyglet.media.ManagedSoundPlayer):
     185                """Player which handles the end-of-stream condition
     186                properly."""
     187
     188                def __init__(self, finishCallback, extra):
     189                    """Construct the player with the given data."""
     190                    super(SoundThread.Player, self).__init__()
     191
     192                    self._finishCallback = finishCallback
     193                    self._extra = extra
     194
     195                def _on_eos(self):
     196                    if self._finishCallback is not None:
     197                        self._finishCallback(True, self._extra)
     198                    return super(SoundThread.Player, self)._on_eos()
     199
     200            class EventLoop(pyglet.app.EventLoop):
     201                """Own implementation of the event loop that collects the
     202                requested sound files and plays them."""
     203
     204                def __init__(self, soundsDirectory):
     205                    """Construct the event loop."""
     206                    super(SoundThread.EventLoop, self).__init__()
     207
     208                    self._soundsDirectory = soundsDirectory
     209
     210                    self._lock = threading.Lock()
     211                    self._requestedSounds = []
     212
     213                def startSound(self, name, finishCallback, extra):
     214                    """Add the sound with the given name"""
     215                    with self._lock:
     216                        path = os.path.join(self._soundsDirectory, name)
     217                        self._requestedSounds.append( (path,
     218                                                       finishCallback, extra) )
     219
     220                def idle(self):
     221                    """The idle callback."""
     222                    with self._lock:
     223                        requestedSounds = self._requestedSounds
     224                        self._requestedSounds = []
     225
     226                    for (path, finishCallback, extra) in requestedSounds:
     227                        try:
     228                            media = pyglet.media.load(path)
     229                            player = SoundThread.Player(finishCallback, extra)
     230                            player.queue(media)
     231                            player.play()
     232                        except Exception, e:
     233                            print "mlx.SoundThread.EventLoop.idle: " + str(e)
     234                            if finishCallback is not None:
     235                                finishCallback(False, extra)
     236
     237                    timeout = super(SoundThread.EventLoop, self).idle()
     238                    return 0.1 if timeout is None else min(timeout, 0.1)
     239
     240            def __init__(self, soundsDirectory):
     241                """Construct the sound playing thread with the given
     242                directory."""
     243                super(SoundThread, self).__init__()
     244
     245                self.daemon = True
     246                self.eventLoop = SoundThread.EventLoop(soundsDirectory)
     247
     248            def run(self):
     249                """Run the event loop."""
     250                self.eventLoop.run()
     251
     252            def startSound(self, name, finishCallback = None, extra = None):
     253                """Start the playback of the given sound."""
     254                self.eventLoop.startSound(name, finishCallback, extra)
     255
     256        _thread = None
     257
     258        def initializeSound(soundsDirectory):
     259            """Initialize the sound handling with the given directory containing
     260            the sound files."""
     261            global _thread
     262            _thread = SoundThread(soundsDirectory)
     263            _thread.start()
     264
     265
     266        def startSound(name, finishCallback = None, extra = None):
     267            """Start playing back the given sound."""
     268            _thread.startSound(name, finishCallback = finishCallback,
     269                               extra = extra)
     270
     271    except:
     272        print "The pyglet library is missing from your system. It is needed for sound playback on Linux"
     273        def initializeSound(soundsDirectory):
     274            """Initialize the sound handling with the given directory containing
     275            the sound files."""
     276            pass
     277
     278        def startSound(name, finishCallback = None, extra = None):
     279            """Start playing back the given sound.
     280
     281            FIXME: it does not do anything currently, but it should."""
     282            print "sound.startSound:", name
    187283
    188284#------------------------------------------------------------------------------
     
    192288    def callback(result, extra):
    193289        print "callback", result, extra
    194    
     290
    195291    initializeSound("e:\\home\\vi\\tmp")
    196292    startSound("malev.mp3", finishCallback = callback, extra="malev.mp3")
Note: See TracChangeset for help on using the changeset viewer.