diff --git a/G940LEDControl/Forms/MainFrm.dfm b/G940LEDControl/Forms/MainFrm.dfm index 70b89a6..75885b1 100644 --- a/G940LEDControl/Forms/MainFrm.dfm +++ b/G940LEDControl/Forms/MainFrm.dfm @@ -1,7 +1,7 @@ object MainForm: TMainForm Left = 0 Top = 0 - ActiveControl = cbCheckUpdates + ActiveControl = cmbProfiles BorderIcons = [biSystemMenu, biMinimize] BorderStyle = bsSingle Caption = 'G940 LED Control' @@ -30,7 +30,7 @@ object MainForm: TMainForm Margins.Top = 8 Margins.Right = 8 Margins.Bottom = 8 - ActivePage = tsAbout + ActivePage = tsButtons Align = alClient TabOrder = 0 object tsButtons: TTabSheet @@ -276,6 +276,278 @@ object MainForm: TMainForm Height = 13 Shape = bsTopLine end + object imgFSXStateDisconnected: TImage + Left = 397 + Top = 67 + Width = 32 + Height = 32 + AutoSize = True + Picture.Data = { + 0954506E67496D61676589504E470D0A1A0A0000000D49484452000000200000 + 00200806000000737A7AF40000001974455874536F6674776172650041646F62 + 6520496D616765526561647971C9653C000005774944415478DAC597C74B6C59 + 10C64F9B737A9815DA8839A388115C28032266915988CE6660FE9199EDB8706F + C4D1850CA2A8288A2898338AA298033EF3336B4F7DA5E77A5B6DB5DF660E1CEE + EDDBB74FFD4ED55755A7353A9D4EFC9F4303008D46A33C282E2E76373535B536 + 333313262626FC9DFC5EFDDE47436E0A57CCC7C747F1F0F08079DEDCDCFC5DFD + 9E02505A5AEA78727252ECECECEC636969C9CF2480BC1A33A461F5F5EAEA4A77 + 7676B6E2E2E2D2DAD0D070AD07909D9DFD5B4040808F56AB153E3E3EC2C2C242 + D9BDDA0B3FE301CCDBDB5BB1B5B525565757C5FAFAFA7C4747C73F0A40414181 + 3BEDFAF798981891989868D0A8B121C0FBD8C8DDDD9DB8BFBFE7E7232323988F + E6E6E67F3535355D33406161A1D6DEDEBE22232343F8FAFAEAC55E6DD41800D2 + 91080B0B131452717979294647471962737353747777E39DEAC6C6C6430620E1 + 31406666A6F0F0F07803606C0820E0F0F070E1E4E4A400F5F7F7731876777745 + 5757171E57D7D7D73F0194949430404A4A8AF0F2F262B7595959899B9B1B1690 + 3100F86D545494A0F594671473B1B4B4C46B6D6F6F8BDEDE5EAC575D5757F704 + 4019C000494949C2DFDF5F242424080707074E9DF3F37341CAE5EBE9E929EFC2 + 50ED00747474B4B0B5B5559EEDEDED89E9E969FE0DD6DBD9D9110303031C0205 + A0ACAC4C4B062BE2E3E35984212121BCD8EB5D630710D4F1F131C715D78B8B0B + 7E6663632362636385B5B5B5F23EA5B5127B590B00303C3C8CCFD5B5B5B52F00 + 8E8E8E15701D42400A156E6E6E9C8E521386C4F69CDF1C77D40F39E0B5B1B131 + 0E230C030020D000A0E8D95B808888083688C5A062188627BCBDBD393BE0DAAF + 68E1F0F0504C4D4D291A820D18070800262626DE07080D0D6500189710EA4A48 + 158C61E0194320070707627C7C9C8DBD2AC30C2135F1068052A622282848B8BB + BB2BC6E57C5D8AE10D84EB3D0800A0D8C0B09CD238E6FEFEBE989B9BC3BDBE08 + 01E0E7E7A700A821A406A4417C4E4F4F17E4B53700D003F25C6D5CC61F6205C0 + E2E2E2FB00308E459182883DC408636A0FE01E9902B11A126667672767897AF7 + 00432A2373500DDF0580F26118C5048AC60484DA1B308E8605202CBEBCBC2C82 + 8383F53265707050ACADADB161D40D881113F7D7D7D75F07901E9061409141AE + C338DC89F28A0E87D0A5A5A529109393932C44E901BCFB2900B2002130040081 + C2088C63319453C4530E9471BC8381546B6F6FFF10809EBDF482CF0002030305 + 1A15EE115B7433C4523D90BE3939397C0F4394624AFABD06D8D8D8600FE801A0 + 1463113A98700B45DC2500F21E5E4075EBE9E9E1EB7B83CE152C60ACD9DADA2A + 8E8E8EBE0680662401D090D013E00DB5B0D088A4BA0D0DFC0EF501030DE739DD + 18408A510D40C7B297760C0018453341083C3D3D051DD178413B3B3B313F3FCF + 4DE4A381142E2A2A629D2C2C2C30C47B1E407B46257C73208107A406301182E4 + E4646ECFB3B3B39F0260E4E5E5B1F720508441ED017508004047B243BD23995A + 84302EBB627979B9989999114343439F024446468AD4D454365C5353C3460120 + 21641600808EE84F00F9F9F90CE0EAEAAAE701D9942A2B2BF9348B02F3D9C0EF + ABAAAAB8E1F4F5F5293D00531624D40E00B4B4B43C01E4E6E6B206D0EDD4BB97 + 15302E2E8EC5B7B2B2F22980AC0908973C0B604A4FE08A8645DFFDDDD6D6F69D + 01B2B2B2BE11C01FD4EF35EA562CA7B187520CD98AD5FD40C250463D5028FEA4 + 7A72CB00546235B4E35F290401A09667007523FA993F261240FDEF08058E0EA6 + 13B4C97FE960A263003A649850A7FA4622FC853CA125A38A3575173466C0A01A + E6F9D9239D1397E850D249E23EA386F50440954F432EB1A47B7BD2803DD1E164 + 699CCFBFE0188AFF0F0AC5396DE69CDAF3ADDE7F432A4026746F8ACD1A1B6F23 + 43F340000F246A1D3EFF0712759FFDF03F71A80000000049454E44AE426082} + Visible = False + end + object imgFSXStateConnected: TImage + Left = 359 + Top = 67 + Width = 32 + Height = 32 + AutoSize = True + Picture.Data = { + 0954506E67496D61676589504E470D0A1A0A0000000D49484452000000200000 + 00200806000000737A7AF4000000097048597300000EC400000EC401952B0E1B + 000008124944415478DAC5977B7054D51DC7BFF7B177DF9BCDE649221188840D + 2492A243487C2C3E68476D29D599A2A53E3AAD5275A60FFFE91FDAD67F9CB68E + 33AD558A05E91F75C4222DA2B49476B4DD100832986002C612A76D90B0E4BDBB + D9DDECEE7DF677CEEE86242E26FCD53373F7DEB97BEEF97DCEF7F738E708F83F + 3761FE8B8AF61DCD922405645986284AD4837511F37761EE975691D1F83BFAB1 + ACFCDD84699A300C9D2EF3D2E8F1C7078A0254DDBC73693A36F2A6ECAFDB20D8 + 7D648FFDC500A4FC5D2CC67B8596330C187437F8DD2220331DB5AC44E4AFAE40 + CDB648C7A3B13900BEA6674F3856843634D59761ED32179C6E0982457F8B22D9 + 16721D8BCDBA88A656BE8F65E4402CC1443A65A277701A670646A00F75BD19ED + FDE9D61980D2F52F360B8AB7AFF9861B70FFCD15106DB9893315662BCFC558CC + FCF5DC37C40D9743443A6342CD92021AF087E363E8EDEA3414C5563E7A6C7B2C + 07D0FA7248F45487BFFAC5B568A1D98B9200E67E360087B06685C16200A8BF4C + 1F6F5AEF476DB9827852C7BEF7C691552DF49E4FE1E0A11390856C70F4E863E7 + F890810D3B09A02AFC350268AC7390EA050001DCF382B068EFB3E650047CA9B5 + 04D565F63C90855D6F8F209535F1F1A7691CF8731714510B0E87BF9D0768FB6D + 48745785EFDAD88CE6650E2E9BCF2B2291A6E8B5989A020B8585FD4FCD6517F1 + E5363FCA4B6C33EF7A0692F86777028669E1CC600687FFCE007402F856016037 + 77C11DB7AC41FB6A27B6DE164065A90D9A6E612CA66124AA632CAE2132AE619A + 6434CDE2243E9784CDED2528F55E367E8E667CA82B46C6019DBEEBFB4F16EFBE + F73E6C821A1CE978A400F02A01D4846F696BC44377FA70FB3A1FBC349830CFE9 + CC7046353134AA6272CAC0D0988AF1B8C1DFF93D12EE0DF9E173CB33FD2F4DA8 + 78E31F516435529226A3190C4045E7D15390580C743C9403286DDB13927CB5E1 + D61B1BD07CAD02874D44439D82B5F52EACBAC601492A1E013CB7498CA9940E85 + BE713B2EA7C96854C5BE700C094A3F9DFAE99A059520CE7EAAE2FD63DD145B99 + E058C7837980F6DF85244F6D78DD1756A2E95A1B6CB2489700990C7B9D228138 + D052EF44C0277F469562EDBF97B278AB33CE83CE20E306D5225537B94BCF0EAA + E839D9531CA0B979255613804286D9251388C4B281152232BCAC4AC6F52B1C04 + E4BC22C8274359ECEB8843D7993ACCB8C59F5523A740FF7915677A7A28B5B3C1 + F18E6FCE06B8261C0CD623B89400949C028A4DE0F92C3100F1722AAE5B69C7E6 + 365F51884F2E66F1DABB711E2F2CEA59E06979F9558A958F2F6838D7779AFC97 + 094ECC075876DD0A342E5560B793719A3D73814D2A005CAEDB32A9F2E4E600AA + 03B6CF004CA50CFCEC8D711EF50C4033732AB040CCE60106FB3FA4882680A3F3 + 00BC55CB515B21A3DA2FA1C42DC24E81C514281426BE3CD1F38377F8D0B4DC71 + C5C07C6EEF3826E239FFEBCC38F93F963431126399A32139D4474B442638391F + C053B91C5E5A845831712B123C2E114E52C34EAEB0B18B201EBED38BD6602E06 + D8E01D7D296CBCDE3D27535EF94B0C5D1F65C8B085695A079254D05234FB74C6 + E00AA52E2E02C045000EBACBF96C60F7FBDA5DF8FAAD1E6E9C49FAAB8371F4FC + 5BC54D8D763CF99512AE0E6BFB3B93D81B4E72E935EAC7EAC422006AC39E8A15 + F07A8A03DCBED6C18D30E3A9B481170EC4D07F419F99F5E3777B4909177FFEE8 + 7C16CFFC3EFA3900BDB4541340E74C1A5221721340657D518050B3033FBCD7CF + 17A768C2C0CFF74731386ACCF13DAB1F3F7E20C09FD394FFDB9E1FE52E2A0A30 + F42129909D05C02A21956277E57578FA1B65A8ABB471BFB320B451656DA142C4 + 54189ED4F18B3FC61099348A06E0AFB797A1AA54E681F8BD9DE3383FA253F199 + 0540CA4D4D13C085D3D48701144AF186DD548A6BC2AE8A9578645309EEBFCD47 + 25D8CEA3BFD08627353CFB7A0C1309F38A1570DB4637B6B47BF8F3CBEFC4F0B7 + EE3434329CD17200D304902080E9A16E52400D4E1E7BB800B02B2479ABC38EF2 + 551484325F8ED7D4D9716B93135B6EF2A08C4AF0E15329EC3E92F8DC125C1B90 + F0D213E53C4E8E7C90C24B6FC7732EA04294CA92617241825C908E7C4031A006 + A3C7F3CBB1BFF595904C1B12A5BC91528F0148947E221C548C1EBDDB87074891 + 432793D87D38B1E0BEF485EF04D040EA9DBB90C5F77F33CE6B000348AB24FD34 + 2991D6908D9C2205B460B42BBF21F1AFDF41315019B60556C3E950E0A6FCB753 + 39E6AB62AD823D4F55E160570ABB0EC7B150DBD2EEC6F67BFCDCF7773D13E101 + 99290422D5836C3A03F51201587A307A22BF25F3DFF822015485E5400364C53D + A3002B3EAC24EF7F7A098EF7A7B1F3D0C2003E82FFD34F96E0C0B1247EF9568C + AF822A03C8B2A24467032D0575F8347741ECE41339005FCBF321D9571D964B96 + 43905D906C0E329E5F9629FAB76EF4F2F40B9FC92C08C0DA77EFF161CF91295E + 01355A14748D4168B42BCED08E39096D7C809E93ABE2DD4F0D70006FE38F1A24 + F7927F89AE0A41A03DB9202AFC62FB7341620B4EFE847435DBE2FCC1C4A21311 + 4C95CD985E6BFC6E242EAAA63A5596E87F2EC94774D6DC2742741DB1F91B3699 + 6A32B7CC8A32372C08855391781507A3C2B18C00D8E9888E6630753AA0581015 + 0FD491D3AF0A8AE3B1F4D05E8B0F69F3B448E6F4708354B26687E45C12A2A54F + E40315CE857C672C2ED27A9E814E43B95DB48999EDB4A9EB4672E81D3D71F607 + B26FD54535DE65720049AE132C7DCA473D6A04D1552B88F6001B220731F3931F + 7901CBF3552A9CD30416F89951CBCA4428D022A635999CD35D14A88A5826399E + 0E2D10AFE61CB27855F81656D0C8A5AA694DF092FA3F8CC8125D22B18C700000 + 000049454E44AE426082} + Visible = False + end + object imgPrepar3DStateDisconnected: TImage + Left = 397 + Top = 108 + Width = 32 + Height = 32 + AutoSize = True + Picture.Data = { + 0954506E67496D61676589504E470D0A1A0A0000000D49484452000000200000 + 00200806000000737A7AF40000001974455874536F6674776172650041646F62 + 6520496D616765526561647971C9653C0000032269545874584D4C3A636F6D2E + 61646F62652E786D7000000000003C3F787061636B657420626567696E3D22EF + BBBF222069643D2257354D304D7043656869487A7265537A4E54637A6B633964 + 223F3E203C783A786D706D65746120786D6C6E733A783D2261646F62653A6E73 + 3A6D6574612F2220783A786D70746B3D2241646F626520584D5020436F726520 + 352E332D633031312036362E3134353636312C20323031322F30322F30362D31 + 343A35363A32372020202020202020223E203C7264663A52444620786D6C6E73 + 3A7264663D22687474703A2F2F7777772E77332E6F72672F313939392F30322F + 32322D7264662D73796E7461782D6E7323223E203C7264663A44657363726970 + 74696F6E207264663A61626F75743D222220786D6C6E733A786D703D22687474 + 703A2F2F6E732E61646F62652E636F6D2F7861702F312E302F2220786D6C6E73 + 3A786D704D4D3D22687474703A2F2F6E732E61646F62652E636F6D2F7861702F + 312E302F6D6D2F2220786D6C6E733A73745265663D22687474703A2F2F6E732E + 61646F62652E636F6D2F7861702F312E302F73547970652F5265736F75726365 + 526566232220786D703A43726561746F72546F6F6C3D2241646F62652050686F + 746F73686F7020435336202857696E646F7773292220786D704D4D3A496E7374 + 616E636549443D22786D702E6969643A46373844414546353830333031314537 + 383642313835314144313333453444322220786D704D4D3A446F63756D656E74 + 49443D22786D702E6469643A4637384441454636383033303131453738364231 + 383531414431333345344432223E203C786D704D4D3A4465726976656446726F + 6D2073745265663A696E7374616E636549443D22786D702E6969643A46373844 + 4145463338303330313145373836423138353141443133334534443222207374 + 5265663A646F63756D656E7449443D22786D702E6469643A4637384441454634 + 383033303131453738364231383531414431333345344432222F3E203C2F7264 + 663A4465736372697074696F6E3E203C2F7264663A5244463E203C2F783A786D + 706D6574613E203C3F787061636B657420656E643D2272223F3E2AAC8A2B0000 + 05884944415478DAB5975D4C145714C7FF33BBCBF7571023864421A8A118BE2C + 51A0C627531BF1951A8920F1C147424830358813A55A2B515BEDBB4D15296B8A + 4DA07DE08918FB620C602D890F34C1867D0024F2B5B8B0BBB33DE7EEDE656676 + D8DD9AF4869B3BCCDC7BCFEFFCCF9973679523478E14E6E6E69EF4F97C45A150 + 48A50E5DD7637A30188C5EF31C6E3CC6EBD639722D75DDEFF77BBC5EEFEFCAF1 + E3C7CF2F2C2C14D143552E90CDBA91F1BE7514D73CDADD078F3130FAC6C68647 + 397AF468CFEAEAAA6AF42C6206F2DF44C6134118012001A86F6E6EEA4A7D7DBD + B6BEBE6EF2566E62356A0715EBAD8D7246A8C8353BBCE1F341A9ABABD33E7CF8 + B08DF190FC33198FCEB18C710DDB00B05DE5F0E1C31AC5228EE1F846B7C02C32 + 5BC0ACD71C02565EA9ADADD5027E7F7441C4BCC970F49E11328E11B3E711408B + 4A2152C0CB00870E1DD2EC12705B05128420EE330300DB5C5FF742A9A9AED642 + 06A3310A58F22026276CB3DEE2BD4D78743D08AF9714A8260085E72888F5DA40 + 24169BE69801604CC038092AC1F42087C01B06501505A969A9C8CCCC84C3E130 + D9D6433AA84E20E00F40A17939B93934C769F28EE55C595E813F924BD9D95970 + B952242FCDE38CF7515F17FB04820101B0E68D84808D1E3C7810675BCEC2E974 + 8A0D8D8D01868787F1E6CD1B5CEEBE8C94D4942D48656BCE13F7134CFF3D8D8E + 8E0EECDAB5CB5C5BA84D4F4F63E89721783C1E6C12ECDADA2A295055A5395D4E + 545656A2B5B515333333989F9B0F43D0E62E970BE59F944375A8B8F7FD3DD4D5 + D7C349C05B29A92023231D151515585A5AC69DDBB7D1D9D9898CCC0CBC7EFD1A + 814040CCCACFCFC7810307B0B2B282BEBE3EBC7BB78855BA5668A1C65E575555 + A2A5A50503033FE3D5AB57E2F0618D1D4E86AB407373330607DD78F9F2258502 + 505587080937863C73E60CF6ED2BC5952B57D0D5D5250CDDBFFF03975B31C741 + 0E34347C86D3A7BFC4E8E82886868604B0525E5E2E42505353430067F1F8F100 + 26272785026C4086E7DCB9563C7AD48F172F5E202F2F0F274E7C4EE17289CDD3 + 287F5881E7CFFFC0C8C8082E5EECA2CD9770F7EE77A053560A2572ACB7B7170B + F3F3B875AB0FEFDFBF875256562614A8A9A9162170BBDD34318B364D1300EC1D + C3B1CCBDBD5F63717151C4B7ADAD4D3CE3964A39B173E74EA1DCC39F1EA28B00 + 78F33B77EE8A722BF384017A2EF7880A78FDC67501A9505C04001524E1E5E0E0 + 2079F70579991B062708F682EF8F8F8F53687491A8DC5455154996929282A6A6 + 26D4D67E8A9B37BFC5850B1768F330805080001C14B2E2E2625CBAF49550EAC1 + 8F0FB0BC4C21D8BF7F7F14A0ADED1CE5C000DEBEFD074AA4387028D86B8E257B + BC77EFDE2880CC70F6ACB1B1915428C0D5ABD7D0DEDE2E72C8ED1E14D9CE5BE5 + EFD881538DA7904BAFF18D1BDF88B7C5BB46AF6169696934071880E33C313111 + 4E42831188F73B1BD7AE5D25C953A335801592C938363686A74F7F457777370A + 0B0B45B593AF34CFE13AD1DFDF8F67CF9E9143FEF0695852522200780127DBD4 + D414E6E6E68461B9B184484F4FC7B163C7A20AC86AC546666767E9B5FB4B84A5 + A1A1015959591115C3EBE9F38B72E44FD0D79778358304E7A3E2A4505C3499ED + 5B678DB920CBC6F3D8008F76870BAB261509C387ABA53CECF83977B94628B067 + CF1E4D6E6E94538EA693C1E6D32CF6008AFD58B5BBC79D1354292A2AD2A46746 + 10ABE776CA24FC3E8C3984CC8A0980DDBB776B4669B78348468D784AD8A92000 + A8A89800AC2148148A8F51C204505050A0B1713B80442A249B0B766A444340A7 + 540C40322A244ACA4430E2B39C3E86153A58E20224A342A2306CA78650202727 + 4793C6E3A9F07FE48300A03ADEA3861BFE6B32269B0FDBC11080AE505D3F4FA5 + B5880CA856059255E16394E01FA754093D6CB590363D49A38048C6F364429100 + 4CA7F3C04365F9B77F012DCE3F40F34BE76D0000000049454E44AE426082} + Visible = False + end + object imgPrepar3DStateConnected: TImage + Left = 359 + Top = 108 + Width = 32 + Height = 32 + AutoSize = True + Picture.Data = { + 0954506E67496D61676589504E470D0A1A0A0000000D49484452000000200000 + 00200806000000737A7AF4000000097048597300000EC400000EC401952B0E1B + 0000059A4944415478DAB5975D4C145714C7FF773F403E0482102124A0418CC5 + C08245BE4A7822B509BE5A8301E4C9873631C60453039200D55A89D06A7DB6A9 + 22654DB1893EF9640C7D41A2526BE2034DB0D10740A27CECB2B03BB33DE7EECC + 3033BBEE2E4D7AC37087997BEFF99DFF39F7DC41D4D5D579B2B3B36F040281DA + 7038ECA44BA8AA0AFBA5288A714F63C08DFB78977D8C36979B120C06A77C3EDF + D7A2A5A565727171F130BD74691304B4665FC8FCDCDECB7BEE633D07F7C6DF61 + 0D26B4B1B1F1443435356DAEAEAE3AE981301BD12725633C11841900BA1AF46B + 737353110D0D0D8ADFEF979E87B72CC28262004443457B1B43393394764F0E87 + 37020188FAFA7A757D7D1DB18D87F51F8B71638CAD8F6B381A006C57D4D6D6AA + 148B3886E31BDD02B3C96C03B3DF5308C0CA8B9A9A1A35140C1A1334F316C3C6 + 3333641C2356CF35409B4A6152C0C700870E1D52CD5B2BA102094210F79D0980 + 6DFAFD3E88EAAA2A356C321AA5802D0FA2722266D6DBBC8F111E5555E0F39102 + 55042037BE40B4D7262239D932C60A007302C649501D4C553804BE08804308A4 + EE48454646069C4EA7C5B61A56417502A1600882C6656567D11897C53B967365 + 7905412D9776EECC84DB9DA2F3D238CEF8005D7EB94E48094980359F1602367A + F0E041B477B4C3E572C905CD8D01EEDFBF8F57AF5EA1B7A71729A9295B90626B + CC5DEF5DCCFE3D8B3367CE60F7EEDD966DC96D76761613BF4DE0EDDBB7D824D8 + B5B55552C0E3515D6E172A2B2BD1D9D989B9B9392CCC2F44206871B7DB8DF24F + CAE1703A70EDC76BA86F68808B80B75252203D3D0D151515F8F06119C357AFE2 + ECD9B348CF48C78B172F100A85E4A8DCDC5CECDFBF1F2B2B2B181A1AC2BB774B + 58A57B411355F6DAE3A944474707C6C67EC5CCCC8C3C7C5863A78BE12A70E2C4 + 098C8F7B313D3D4DA1001C0EA70C0937866C6B6BC3BE7DA5E8EBEB437777B734 + 74FDFA4FA0722BC738C981C6C6CF70FCF89778F8F02126262624B0282F2F9721 + A8AEAE268076DCB93386E7CF9F4B05D8801E9E93273B71FBF628A6A6A6909393 + 8323473EA770B9E5E23B287F5881C9C93FF0E0C1039C3BD74D8B7FC0C8C80FA0 + 5356174AE6D8E0E02016171670E5CA10DEBF7F0F71E0C001A9407575950C81D7 + EBA58199B4E80E09C0DE311CCB3C38F82D969696647CBBBABAE43B6EA99413F9 + F9F952B95BBFDC423701F0E2C3C323B2DCEA79C200177A2FC80A78F1D2450929 + 282E12800A92F4727C7C9CBCFB82BCCC8E8013047BC1CF9F3E7D4AA15165A272 + 73381C32C952525270ECD831D4D47C8ACB97BFC7A953A768F108805480009C14 + B23D7BF6E0FCF96FA452377FBE89E5650A4159599901D0D5759272600CAF5FFF + 03A115070E057BCDB1648F4B4A4A0C003DC3D9B3D6D65652210FFDFD03387DFA + B4CC21AF775C663B2F95BB6B178EB61E45366DE34B97BE93BBC5B746DBB0B4B4 + D4C80106E0383F7BF62C9284262390FB7B270606FA49F254A306B0427A323E7A + F408F7EEFD8E9E9E1E141414C86AA76F691EC375627474148F1F3F26878291D3 + 70EFDEBD12802770B2BD7CF912F3F3F3D2B0BEB00E91969686E6E6664301BD5A + B191376FDED0B6FB4B86A5B1B1119999999A8A91F9F4F94539F227E8EB4B6E4D + 85E002549C04C545D5B37DEBACB11664BDF13836C07DACC38555D31589C047AA + A57ED8F17BBEF4395281E2E262555FDC2CA7DE5B4E86189F66D10750F4C76AAC + 677C71828AA2A22255F7CC0C62F73C963209BF0FA30E21AB6212A0B0B050354B + FB318864D488A7442C15240015150B803D048942F15F94B000E4E5E5A96C3C16 + 40221592CD85586A1821A0532A0A201915122565221806E08F6141074B5C8064 + 544814868FA92115C8CACA5234E3229E0AFF433E842500D5F14D32ECA44B6C37 + 1993CD878FC0308022A8AE4F52693D4C065CBA12DB55619B4A18FF9C52257CC2 + B27B68D11BD4D752EF149A85789E27138A3860FC40A1F3608ACAF257FF0266EC + 56107E5E17130000000049454E44AE426082} + Visible = False + end object btnP1: TButton Left = 11 Top = 67 @@ -641,6 +913,8 @@ object MainForm: TMainForm Align = alTop BevelOuter = bvNone TabOrder = 1 + ExplicitLeft = -19 + ExplicitTop = 8 object pnlFSX: TPanel AlignWithMargins = True Left = 233 @@ -650,67 +924,11 @@ object MainForm: TMainForm Align = alRight BevelOuter = bvNone TabOrder = 0 - object imgFSXStateNotConnected: TImage + object imgSimulatorState: TImage Left = 4 Top = 4 Width = 32 Height = 32 - AutoSize = True - Picture.Data = { - 0954506E67496D61676589504E470D0A1A0A0000000D49484452000000200000 - 00200806000000737A7AF40000001974455874536F6674776172650041646F62 - 6520496D616765526561647971C9653C000005774944415478DAC597C74B6C59 - 10C64F9B737A9815DA8839A388115C28032266915988CE6660FE9199EDB8706F - C4D1850CA2A8288A2898338AA298033EF3336B4F7DA5E77A5B6DB5DF660E1CEE - EDDBB74FFD4ED55755A7353A9D4EFC9F4303008D46A33C282E2E76373535B536 - 333313262626FC9DFC5EFDDE47436E0A57CCC7C747F1F0F08079DEDCDCFC5DFD - 9E02505A5AEA78727252ECECECEC636969C9CF2480BC1A33A461F5F5EAEA4A77 - 7676B6E2E2E2D2DAD0D070AD07909D9DFD5B4040808F56AB153E3E3EC2C2C242 - D9BDDA0B3FE301CCDBDB5BB1B5B525565757C5FAFAFA7C4747C73F0A40414181 - 3BEDFAF798981891989868D0A8B121C0FBD8C8DDDD9DB8BFBFE7E7232323988F - E6E6E67F3535355D33406161A1D6DEDEBE22232343F8FAFAEAC55E6DD41800D2 - 91080B0B131452717979294647471962737353747777E39DEAC6C6C6430620E1 - 31406666A6F0F0F07803606C0820E0F0F070E1E4E4A400F5F7F7731876777745 - 5757171E57D7D7D73F0194949430404A4A8AF0F2F262B7595959899B9B1B1690 - 3100F86D545494A0F594671473B1B4B4C46B6D6F6F8BDEDE5EAC575D5757F704 - 4019C000494949C2DFDF5F242424080707074E9DF3F37341CAE5EBE9E929EFC2 - 50ED00747474B4B0B5B5559EEDEDED89E9E969FE0DD6DBD9D9110303031C0205 - A0ACAC4C4B062BE2E3E35984212121BCD8EB5D630710D4F1F131C715D78B8B0B - 7E6663632362636385B5B5B5F23EA5B5127B590B00303C3C8CCFD5B5B5B52F00 - 8E8E8E15701D42400A156E6E6E9C8E521386C4F69CDF1C77D40F39E0B5B1B131 - 0E230C030020D000A0E8D95B808888083688C5A062188627BCBDBD393BE0DAAF - 68E1F0F0504C4D4D291A820D18070800262626DE07080D0D6500189710EA4A48 - 158C61E0194320070707627C7C9C8DBD2AC30C2135F1068052A622282848B8BB - BB2BC6E57C5D8AE10D84EB3D0800A0D8C0B09CD238E6FEFEBE989B9BC3BDBE08 - 01E0E7E7A700A821A406A4417C4E4F4F17E4B53700D003F25C6D5CC61F6205C0 - E2E2E2FB00308E459182883DC408636A0FE01E9902B11A126667672767897AF7 - 00432A2373500DDF0580F26118C5048AC60484DA1B308E8605202CBEBCBC2C82 - 8383F53265707050ACADADB161D40D881113F7D7D7D75F07901E9061409141AE - C338DC89F28A0E87D0A5A5A529109393932C44E901BCFB2900B2002130040081 - C2088C63319453C4530E9471BC8381546B6F6FFF10809EBDF482CF0002030305 - 1A15EE115B7433C4523D90BE3939397C0F4394624AFABD06D8D8D8600FE801A0 - 1463113A98700B45DC2500F21E5E4075EBE9E9E1EB7B83CE152C60ACD9DADA2A - 8E8E8EBE0680662401D090D013E00DB5B0D088A4BA0D0DFC0EF501030DE739DD - 18408A510D40C7B297760C0018453341083C3D3D051DD178413B3B3B313F3FCF - 4DE4A381142E2A2A629D2C2C2C30C47B1E407B46257C73208107A406301182E4 - E4646ECFB3B3B39F0260E4E5E5B1F720508441ED017508004047B243BD23995A - 84302EBB627979B9989999114343439F024446468AD4D454365C5353C3460120 - 21641600808EE84F00F9F9F90CE0EAEAAAE701D9942A2B2BF9348B02F3D9C0EF - ABAAAAB8E1F4F5F5293D00531624D40E00B4B4B43C01E4E6E6B206D0EDD4BB97 - 15302E2E8EC5B7B2B2F22980AC0908973C0B604A4FE08A8645DFFDDDD6D6F69D - 01B2B2B2BE11C01FD4EF35EA562CA7B187520CD98AD5FD40C250463D5028FEA4 - 7A72CB00546235B4E35F290401A09667007523FA993F261240FDEF08058E0EA6 - 13B4C97FE960A263003A649850A7FA4622FC853CA125A38A3575173466C0A01A - E6F9D9239D1397E850D249E23EA386F50440954F432EB1A47B7BD2803DD1E164 - 699CCFBFE0188AFF0F0AC5396DE69CDAF3ADDE7F432A4026746F8ACD1A1B6F23 - 43F340000F246A1D3EFF0712759FFDF03F71A80000000049454E44AE426082} - end - object imgFSXStateConnected: TImage - Left = 4 - Top = 4 - Width = 32 - Height = 32 - AutoSize = True Picture.Data = { 0954506E67496D61676589504E470D0A1A0A0000000D49484452000000200000 00200806000000737A7AF4000000097048597300000EC400000EC401952B0E1B @@ -780,9 +998,8 @@ object MainForm: TMainForm 7901CBF3552A9CD30416F89951CBCA4428D022A635999CD35D14A88A5826399E 0E2D10AFE61CB27855F81656D0C8A5AA694DF092FA3F8CC8125D22B18C700000 000049454E44AE426082} - Visible = False end - object lblFSX: TLabel + object lblSimulator: TLabel Left = 42 Top = 4 Width = 146 @@ -795,7 +1012,7 @@ object MainForm: TMainForm Font.Style = [fsBold] ParentFont = False end - object lblFSXState: TLabel + object lblSimulatorState: TLabel Left = 42 Top = 23 Width = 31 diff --git a/G940LEDControl/Forms/MainFrm.pas b/G940LEDControl/Forms/MainFrm.pas index 1be8b08..44310aa 100644 --- a/G940LEDControl/Forms/MainFrm.pas +++ b/G940LEDControl/Forms/MainFrm.pas @@ -40,6 +40,7 @@ const TM_UPDATE = 1; TM_NOUPDATE = 2; TM_FSXSTATE = 3; + TM_FSXSIMULATOR = 4; LED_COUNT = 8; @@ -107,10 +108,9 @@ type btnDeleteProfile: TButton; bvlProfiles: TBevel; pnlFSX: TPanel; - imgFSXStateNotConnected: TImage; - imgFSXStateConnected: TImage; - lblFSX: TLabel; - lblFSXState: TLabel; + imgSimulatorState: TImage; + lblSimulator: TLabel; + lblSimulatorState: TLabel; pnlState: TPanel; tsConfiguration: TTabSheet; cbProfileMenu: TCheckBox; @@ -130,6 +130,10 @@ type ApplicationEvents: TApplicationEvents; cbFSXSEAutoLaunch: TCheckBox; ScriptErrorDialog: TTaskDialog; + imgFSXStateDisconnected: TImage; + imgFSXStateConnected: TImage; + imgPrepar3DStateDisconnected: TImage; + imgPrepar3DStateConnected: TImage; procedure FormCreate(Sender: TObject); procedure lblLinkLinkClick(Sender: TObject; const Link: string; LinkType: TSysLinkType); @@ -167,6 +171,9 @@ type FLoadingSettings: Boolean; FFunctionRegistry: TLEDFunctionRegistry; + + FSimulator: TFSXSimConnectSimulator; + FSimulatorConnected: Boolean; protected procedure RegisterDeviceArrival; procedure UnregisterDeviceArrival; @@ -205,6 +212,7 @@ type procedure SetDeviceState(const AMessage: string; AFound: Boolean); procedure SetFSXState(const AMessage: string; AConnected: Boolean); + procedure UpdateSimulatorState; // procedure SetFSXToggleZoomButton(const ADeviceGUID: TGUID; AButtonIndex: Integer; const ADisplayText: string); procedure CheckForUpdatesThread(const ATask: IOmniTask); @@ -215,6 +223,7 @@ type procedure HandleDeviceStateMessage(AMessage: TOmniMessage); procedure HandleFSXStateMessage(AMessage: TOmniMessage); + procedure HandleSimulatorMessage(AMessage: TOmniMessage); procedure CMAskAutoUpdate(var Msg: TMessage); message CM_ASKAUTOUPDATE; @@ -222,6 +231,9 @@ type property Settings: TSettings read FSettings; property StateConsumerTask: IOmniTaskControl read FStateConsumerTask; + property Simulator: TFSXSimConnectSimulator read FSimulator write FSimulator; + property SimulatorConnected: Boolean read FSimulatorConnected write FSimulatorConnected; + property Log: IX2Log read FLog; property FunctionRegistry: TLEDFunctionRegistry read FFunctionRegistry; end; @@ -290,9 +302,10 @@ type protected function Initialize: Boolean; override; procedure Cleanup; override; - + public { IFSXSimConnectStateObserver } - procedure ObserverStateUpdate(ANewState: TFSXSimConnectState); + procedure ObserveStateUpdate(ANewState: TFSXSimConnectState); + procedure ObserveSimulatorUpdate(ASimulator: TFSXSimConnectSimulator); end; @@ -913,11 +926,39 @@ procedure TMainForm.SetFSXState(const AMessage: string; AConnected: Boolean); begin Log.Verbose(Format('FSX SimConnect state changed (connected = %s, status = %s)', [BoolToStr(AConnected, True), AMessage])); - lblFSXState.Caption := AMessage; - lblFSXState.Update; + lblSimulatorState.Caption := AMessage; + lblSimulatorState.Update; - imgFSXStateConnected.Visible := AConnected; - imgFSXStateNotConnected.Visible := not AConnected; + SimulatorConnected := AConnected; + UpdateSimulatorState; +end; + + +procedure TMainForm.UpdateSimulatorState; +begin + case Simulator of + scsFSX: + begin + lblSimulator.Caption := 'Flight Simulator X'; + lblSimulator.Update; + + if SimulatorConnected then + imgSimulatorState.Picture.Assign(imgFSXStateConnected.Picture) + else + imgSimulatorState.Picture.Assign(imgFSXStateDisconnected.Picture); + end; + + scsPrepar3D: + begin + lblSimulator.Caption := 'Prepar3D'; + lblSimulator.Update; + + if SimulatorConnected then + imgSimulatorState.Picture.Assign(imgPrepar3DStateConnected.Picture) + else + imgSimulatorState.Picture.Assign(imgPrepar3DStateDisconnected.Picture); + end; + end; end; @@ -1263,6 +1304,9 @@ begin TM_FSXSTATE: HandleFSXStateMessage(msg); + TM_FSXSIMULATOR: + HandleSimulatorMessage(msg); + TM_UPDATE: if MessageBox(Self.Handle, PChar('Version ' + msg.MsgData + ' is available on the G940 LED Control website.'#13#10 + 'Do you want to open the website now?'), 'Update available', @@ -1327,6 +1371,13 @@ begin end; +procedure TMainForm.HandleSimulatorMessage(AMessage: TOmniMessage); +begin + Simulator := TFSXSimConnectSimulator(AMessage.MsgData.AsInteger); + UpdateSimulatorState; +end; + + procedure TMainForm.TrayIconClick(Sender: TObject); begin Show(); @@ -1400,9 +1451,14 @@ begin inherited Cleanup; end; -procedure TFSXStateMonitorWorker.ObserverStateUpdate(ANewState: TFSXSimConnectState); +procedure TFSXStateMonitorWorker.ObserveStateUpdate(ANewState: TFSXSimConnectState); begin Task.Comm.Send(TM_FSXSTATE, Integer(ANewState)); end; +procedure TFSXStateMonitorWorker.ObserveSimulatorUpdate(ASimulator: TFSXSimConnectSimulator); +begin + Task.Comm.Send(TM_FSXSIMULATOR, Integer(ASimulator)); +end; + end. diff --git a/G940LEDControl/G940LEDControl.dproj b/G940LEDControl/G940LEDControl.dproj index 59bb1e2..a65a163 100644 --- a/G940LEDControl/G940LEDControl.dproj +++ b/G940LEDControl/G940LEDControl.dproj @@ -8,7 +8,7 @@ VCL 13.4 True - Release + Debug Win32 1 Application diff --git a/G940LEDControl/G940LEDControl.res b/G940LEDControl/G940LEDControl.res index 6bf97bc..4ed79be 100644 Binary files a/G940LEDControl/G940LEDControl.res and b/G940LEDControl/G940LEDControl.res differ diff --git a/G940LEDControl/Resources/Images/P3DConnected.png b/G940LEDControl/Resources/Images/P3DConnected.png new file mode 100644 index 0000000..f808c85 Binary files /dev/null and b/G940LEDControl/Resources/Images/P3DConnected.png differ diff --git a/G940LEDControl/Resources/Images/P3DDisconnected.png b/G940LEDControl/Resources/Images/P3DDisconnected.png new file mode 100644 index 0000000..bdff778 Binary files /dev/null and b/G940LEDControl/Resources/Images/P3DDisconnected.png differ diff --git a/G940LEDControl/Scripts/FSX/lib/strings.lua b/G940LEDControl/Scripts/FSX/lib/strings.lua index e0e61ad..8e5740c 100644 --- a/G940LEDControl/Scripts/FSX/lib/strings.lua +++ b/G940LEDControl/Scripts/FSX/lib/strings.lua @@ -3,14 +3,13 @@ local strings = {} strings.Category = {} strings.Category.FSX = {} -strings.Category.FSX.Default = 'Flight Simulator X' -strings.Category.FSX.AutoPilot = strings.Category.FSX.Default..' - Autopilot' -strings.Category.FSX.ControlSurfaces = strings.Category.FSX.Default..' - Control surfaces' -strings.Category.FSX.Engines = strings.Category.FSX.Default..' - Engines' -strings.Category.FSX.Instruments = strings.Category.FSX.Default..' - Instruments' -strings.Category.FSX.Lights = strings.Category.FSX.Default..' - Lights' -strings.Category.FSX.Panels = strings.Category.FSX.Default..' - Panels' -strings.Category.FSX.Radios = strings.Category.FSX.Default..' - Radios' -strings.Category.FSX.Systems = strings.Category.FSX.Default..' - Systems' +strings.Category.FSX.AutoPilot = 'Autopilot' +strings.Category.FSX.ControlSurfaces = 'Control surfaces' +strings.Category.FSX.Engines = 'Engines' +strings.Category.FSX.Instruments = 'Instruments' +strings.Category.FSX.Lights = 'Lights' +strings.Category.FSX.Panels = 'Panels' +strings.Category.FSX.Radios = 'Radios' +strings.Category.FSX.Systems = 'Systems' return strings \ No newline at end of file diff --git a/G940LEDControl/Units/FSXSimConnectClient.pas b/G940LEDControl/Units/FSXSimConnectClient.pas index 5100502..2d4dd3b 100644 --- a/G940LEDControl/Units/FSXSimConnectClient.pas +++ b/G940LEDControl/Units/FSXSimConnectClient.pas @@ -476,6 +476,14 @@ begin Log.Info('Succesfully connected'); TFSXSimConnectStateMonitor.SetCurrentState(scsConnected); + { Attempt to discover if it's FSX or Prepar3D } + if WaitNamedPipe('\\.\pipe\Lockheed Martin Prepar3D v2\SimConnect', 0) or + WaitNamedPipe('\\.\pipe\Lockheed Martin Prepar3D v3\SimConnect', 0) or + WaitNamedPipe('\\.\pipe\Lockheed Martin Prepar3D v4\SimConnect', 0) then + TFSXSimConnectStateMonitor.SetSimulator(scsPrepar3D) + else + TFSXSimConnectStateMonitor.SetSimulator(scsFSX); + Task.ClearTimer(TIMER_TRYSIMCONNECT); RegisterDefinitions; UpdateProfileMenu; diff --git a/G940LEDControl/Units/FSXSimConnectIntf.pas b/G940LEDControl/Units/FSXSimConnectIntf.pas index 51be233..bb3c17c 100644 --- a/G940LEDControl/Units/FSXSimConnectIntf.pas +++ b/G940LEDControl/Units/FSXSimConnectIntf.pas @@ -58,10 +58,12 @@ type TFSXSimConnectState = (scsDisconnected, scsConnecting, scsConnected, scsFailed); + TFSXSimConnectSimulator = (scsFSX, scsPrepar3D); IFSXSimConnectStateObserver = interface ['{0508904F-8189-479D-AF70-E98B00C9D9B2}'] - procedure ObserverStateUpdate(ANewState: TFSXSimConnectState); + procedure ObserveStateUpdate(ANewState: TFSXSimConnectState); + procedure ObserveSimulatorUpdate(ASimulator: TFSXSimConnectSimulator); end; diff --git a/G940LEDControl/Units/FSXSimConnectStateMonitor.pas b/G940LEDControl/Units/FSXSimConnectStateMonitor.pas index 483185f..481cb15 100644 --- a/G940LEDControl/Units/FSXSimConnectStateMonitor.pas +++ b/G940LEDControl/Units/FSXSimConnectStateMonitor.pas @@ -14,10 +14,14 @@ type FObservers: TInterfaceList; FCurrentStateLock: TCriticalSection; FCurrentState: TFSXSimConnectState; + FSimulator: TFSXSimConnectSimulator; + FSimulatorLock: TCriticalSection; procedure DoSetCurrentState(const Value: TFSXSimConnectState); + procedure DoSetSimulator(const Value: TFSXSimConnectSimulator); protected property CurrentStateLock: TCriticalSection read FCurrentStateLock; + property SimulatorLock: TCriticalSection read FCurrentStateLock; property Observers: TInterfaceList read FObservers; public constructor Create; @@ -25,11 +29,13 @@ type class function Instance: TFSXSimConnectStateMonitor; class procedure SetCurrentState(AState: TFSXSimConnectState); + class procedure SetSimulator(ASimulator: TFSXSimConnectSimulator); procedure Attach(AObserver: IFSXSimConnectStateObserver); procedure Detach(AObserver: IFSXSimConnectStateObserver); property CurrentState: TFSXSimConnectState read FCurrentState write DoSetCurrentState; + property Simulator: TFSXSimConnectSimulator read FSimulator write DoSetSimulator; end; @@ -55,11 +61,18 @@ begin end; +class procedure TFSXSimConnectStateMonitor.SetSimulator(ASimulator: TFSXSimConnectSimulator); +begin + Instance.DoSetSimulator(ASimulator); +end; + + constructor TFSXSimConnectStateMonitor.Create; begin inherited Create; FCurrentStateLock := TCriticalSection.Create; + FSimulatorLock := TCriticalSection.Create; FObservers := TInterfaceList.Create; end; @@ -100,11 +113,30 @@ begin end; for observer in Observers do - (observer as IFSXSimConnectStateObserver).ObserverStateUpdate(CurrentState); + (observer as IFSXSimConnectStateObserver).ObserveStateUpdate(CurrentState); end; end; +procedure TFSXSimConnectStateMonitor.DoSetSimulator(const Value: TFSXSimConnectSimulator); +var + observer: IInterface; + +begin + if Value <> FSimulator then + begin + CurrentStateLock.Acquire; + try + FSimulator := Value; + finally + CurrentStateLock.Release; + end; + + for observer in Observers do + (observer as IFSXSimConnectStateObserver).ObserveSimulatorUpdate(Simulator); + end; +end; + initialization FSXSimConnectStateInstance := TFSXSimConnectStateMonitor.Create; diff --git a/G940LEDControl/Units/LuaLEDFunctionProvider.pas b/G940LEDControl/Units/LuaLEDFunctionProvider.pas index 9b43d1d..05e90f7 100644 --- a/G940LEDControl/Units/LuaLEDFunctionProvider.pas +++ b/G940LEDControl/Units/LuaLEDFunctionProvider.pas @@ -348,7 +348,7 @@ begin fileName := fileName + ' - ' + string(debug.source) end; - TX2GlobalLog.Log(ALevel, AMessage, filename); + TX2GlobalLog.Category('Lua').Log(ALevel, AMessage, filename); end;