Gdzie powinna być zapisana informacja o parametrach np.rpm,master caution itd.
Czy mogę prosić o pomoc.Co kolejno włączać.
variable $rpm
{
direct = in;
module = "FalconData";
id = "rpm";
type = double;
}
variable_changed $rpm
{
}
variable_changed $rpm
{
Log( "RPM = " + ToString( $rpm ) );
}
Zauważyłem,że stosujesz dwa rodzaje znaku równości "=" oraz "==".Co to oznacza?"=" to przypisanie wartości do zmiennej, a "==" to porównanie wartości. Zauważ, że "==" występuje tylko w warunkach "if".
Wbudowana funkcja ToString( zmienna_liczbowa) zamienia liczbę na znaki,możesz to potwierdzić?Tak, jest o tym na stronie. Bardzo przydatna i często wykorzystywana funkcja.
Ostatnia sprawa dotyczy zmiennych "lightBits.... " użytych w przykładzie.Domyślam się,że sterują LED-y np.podwozie wysunięte.Są typu int.Są typu int bo stany świateł w Falconie zapisywane są bitowo. Moduł, a właściwie biblioteka, która odczytuje dane z pamięci współdzielonej Falcona, definiuje trzy takie zmienne. Każda liczba int to 32 bity więc teoretycznie może być nawet 96 kontrolek, ale nie wszystkie są dostępne. Pełną listę postaram się wkrótce przygotować żeby ułatwić pisanie skryptów (chociaż ona jest chyba zgodna z tą listą od FAST dla OC). Tutaj nakieruje Cię na ważną w tym momencie funkcję - GetBitState( <zmienna> , <numer bitu> ) - jej działanie jest opisane na stronie i w przykładach.
Domyślam się,że zmienne odpowiedzialne za sterowanie konkretnymi LED i reprezentujące określony parametr symulatora będą przypisane do konkretnego portu platformy.Sterowanie LED'ami to jak przypisanie wartości true (lub false żeby zgasić) do zmiennej :) Więc nie trzeba się strasznie męczyć :)
Na razie muszę przebrnąć przez kilka stron i zrozumieć działanie poszczególnych funkcji.Czekam na kolejne pytania.
Cytat codeking
Są typu int bo stany świateł w Falconie zapisywane są bitowo. Moduł, a właściwie biblioteka, która odczytuje dane z pamięci współdzielonej Falcona, definiuje trzy takie zmienne. Każda liczba int to 32 bity więc teoretycznie może być nawet 96 kontrolek, ale nie wszystkie są dostępne. Pełną listę postaram się wkrótce przygotować żeby ułatwić pisanie skryptów (chociaż ona jest chyba zgodna z tą listą od FAST dla OC).
Programowanie w SIOC jest trywialne,widać to na przykładzieZrobienie tego samego w DomowyKokpit jest równie łatwe.
Funkcja TESTBIT sprawdza wartość bitów czy są ustawione czy zgaszone.Funkcja GetBitState w DomowyKokpit jest odpowiednikiem tej funkcji :)
cytat 5 listopad 2009Czy mogę prosić o rozwinięcie tego tematu tzn.co manualnie trzeba zrobić.
* do listy zmiennych i funkcji modułowych dodane zostało menu kontekstowe (wywoływane prawym przyciskiem myszy) z opcją generowania i skopiowania do schowka systemowego definicji zmiennej lub wywołania funkcji modułowej
cytat 11 listopad 2009O jakie pliki chodzi,jest tam tylko podstawowy plik.Czy mogę prosić o wyjaśnienie.
Dzisiaj krótko opiszę nowy moduł GameControllersInput. Na stronie z plikami dostępne jest archiwum z plikami, które trzeba skopiować do katalogu modules
Aby zrozumieć temat trzeba mieć minimum wiedzy informatycznej z szkołyśredniej lub studiów (może się mylę).Ja jestem w stanie zrozumieć to coopisuje autor,ale wymaga to trochę wysiłku.Talentu pedagogicznego nie mam (i nie zamierzam mieć), kto pyta nie błądzi :)
W SIOC można użyć oprócz klasycznej metody takiej jaką stosuje codekingz stosowaniem nawiasów itp.metodę uproszczoną tzn.wypełnia się okienkawpisując zmienne,operatory,funkcje itp.Może w przyszłości powstanie "klikalny" edytor skryptów. Jak się trochę takich skryptów popisze, to później idzie to szybko i taki edytor tylko by spowalniał. Ale zgadzam się, że jest to bardzo dobre narzędzie dla początkujących i osób, które nie chcą się za bardzo wtajemniczać w "suchy" kod.
Czy mogę prosić o rozwinięcie tego tematu tzn.co manualnie trzeba zrobić.Na liście zmiennych wybranego modułu, zaznaczamy interesującą nas zmienną i klikamy na niej prawym klawiszem myszy. Ukazuje nam się menu:
variable $lightBits
{
module = "FalconData";
id = "lightBits";
type = int;
direct = in;
}
i jednowierszowej:variable $lightBits { module = "FalconData"; id = "lightBits"; type = int; direct = in; }
Prosta funkcja dzięki której, nie trzeba pisać ręcznie deklaracji zmiennych.Drugie pytanie dotyczy następującego cytatu...O jakie pliki chodzi,jest tam tylko podstawowy plik.Czy mogę prosić o wyjaśnienie.Ten tekst powstał gdy udostępniłem na stronie moduł do ówczesnej wersji aplikacji DomowyKokpit. Dlatego ten moduł umieściłem w osobnym archiwum. Później udostępniłem nową wersję DomowyKokpit i ten moduł był już w nowym archiwum z programem więc usunąłem osobne archiwum z modułem :)
...,nie sądziłem,że w tak krótkim czasie zrobisz taki postęp w programie.Czasu właściwie minęło sporo od pierwszej wersji, nie było po prostu bodźca (urządzeń), które spowodowałyby zainteresowanie programem :)
Gdy powstanie interface programowy pomiędzy DomowymKokpitem oraz platformą Skalarki to będzie można to testować z platformą.
Chciałem sprawdzić skrypt 12 i natrafiłem na problem.Oczywiście nie mam aviador tylko Logitech Extreme 3D.Rozumiem,że muszę zmienić w skrypcie nazwy zmiennych np.$aviador_button_001 na $Logitech Extreme 3D_button_001 itp,ale co dalej.$aviador_button_001 to nazwa zmiennej i nie musi być w ogóle zmieniana (o tym później). Co musisz zrobić:
variable $Logitech_Extreme_3D_przycisk_000
{
module = "GameControllersInput";
id = "Logitech Extreme 3D:przycisk_000";
type = bool;
direct = in;
}
Teraz wystarczy, że usuniesz ze skryptu definicję zmiennej $aviador_button_001 a tam gdzie występuje jej nazwa ($aviador_button_001) zamieniasz na $Logitech_Extreme_3D_przycisk_000. W ten sposób postępujesz z wszystkimi zmiennymi reprezentującymi przyciski kontrolera czyli: $aviator_button_001, $aviator_button_002, $aviator_button_003 i $aviator_button_004.id = "aviator:button_001";
więc zmieniasz na:id = "Logitech Extreme 3D:button_001";
Ta część przed dwukropkiem (Logitech Extreme 3D) jest konfigurowana w oknie konfiguracji (pole ID pod listą wyboru kontrolera), stanowi ona identyfikator kontrolera i domyślnie jest nim nazwa kontrolera. W ten sposób zmieniasz tylko identyfikator zmiennej, możesz się nawet pokusić o skonfigurowanie swojego kontrolera tak, aby nie trzeba było zmieniać skryptu. Czyli nadajesz odpowiednie identyfikatory przyciskom i zmieniasz domyślny identyfikator kontrolera.Wczytuję PrzykładoweSkrypty,wybieram Skrypt_12 i go uruchamiam i co dalej.Jeśli wybiorę moduł KeyboardInput oraz przycisk konfiguracja to otworzę okno gdzie jest okienko Dodaj....W tym momencie nie wiem co dalej robić.Może wybrałem nie te moduły?W skrypcie użyte są funkcje z modułu KeyboardOutput, nie trzeba konfigurować modułu KeyboarInput (ten moduł służy do odczytywania stanu klawiatury i reprezentacji jej w skrypcie). KeyboardOutput nie ma konfiguracji. Ten moduł udostępnia tylko funkcje. W tym skrypcie nie trzeba nic zmieniać.
Z opisu tego przykładu wynika,że po otwarciu Notatnika i naciskaniu klawiszy w kontrolerze można zrobić pewne działania w Notatniku.Aby sprawdzić jego działanie należy uruchomić DK (DomowyKokpit), wczytać skrypt, wybrać Skrypt_12... i uruchomić. Następnie uruchomić Notatnik i pozostawić go jako aktywne okno (kursor do pisania miga w oknie notatnika). Teraz można naciskać przyciski kontrolera. Cytat ze strony:
Naciśnięcie przycisku 1 (zmienna $aviator_button_001)spowoduje wpisanie w notatniku tekstu “DomowyKokpit”. Przycisk 2spowoduje wywołanie okienka do drukowania (standardowy skrótklawiaturowy CTRL+P). Przycisk 3 powoduje naciśnięcie klawisza SHIFT,pisanie wtedy w notatniku z prawdziwej klawiatury zaowocuje dużymiliterami. Przycisk 4 zwalania klawisz SHIFT.
Załóżmy,że ten przykład będzie działał.Teraz pytanie zasadnicze.Chcę aby kontroler np. MJoy z SV Mapper działał w Falconie podobnie ale przy pomocy KokpituDomowego(KD).Jak to zrobić?Dla przykładu w MJoy button 001 jest przyporządkowany do kombinacji Ctrl+Alt+1 co odpowiada LMFD OSB 01 w symulatorze.Jak to zrobić przy pomocy KD?Należy skorzystać z funkcji KeyboardOutput:SendShortcut( "^%1" ); (znaki ^ i % są znakami specjalnymi, ^ - to CTRL a % to ALT, dodatkowo znak + to SHIFT). Czyli np.:
variable_changed $aviator_button_002
{
if ( $aviator_button_002 )
{
// wysłanie skrótu klawiaturowego CTRL+ALT+1
KeyboardOutput:SendShortcut( "^%1" );
}
}
Uf, trochę przydługawy ten post.Może przydługawy,ale potrzebny.Nie dziw się,że pytam,ale początki są najtrudniejsze.Jutro dam znać jak wypadły testy.
Proszę moderatora o przeniesieni postów (od 525) z tego wątka do nowego "Aplikacja DomowyKokpit" w tym samym dziale.To ma sens,ponieważ pytań będzie przybywać,taką mam nadzieję.Trochę się dziwię,że tyko ja pytam,ale może pytania były na pw.
Codeking pisze moduł umożliwiający sterowanie LCD z LPT.Jest to oczywiście rozwiązanie,ale trochę archaiczne.Gdyby można to zrobić na USB.Czy jesteś w stanie zrobić soft na uP,który umożliwi sterowanie znakowego LCD, komunikującego się z pc przez USB oraz z DomowymKokpitem.Pytanie co pradwa nie do mnie, ale do moich płytek będzie dostępne rozszerzenie do sterowania najpopularniejszymi tekstowymi wyświetlaczami LCD.
Gdy powstanie interface programowy pomiędzy DomowymKokpitem oraz platformą Skalarki to będzie można to testować z platformą.Nie za bardzo rozumiem, Aplikacja DomowyKokpit obsługuje moje płytki bez problemu i jest cały czas ulepszna, więc nic więcej nie potrzeba. Testować można od zaraz, pod warunkiem że ma się płytki ...
....W module 'GameControllerInput' nie znaleziono zmiennej o identyfikatorze 'Logitech Extreme 3D:button_001'....Przy okazji taka uwaga szkoda,że nie można kopiować informacji z log.Prześlę na pw mój zmodyfikowany skrypt,może znajdziesz błąd.
Próbowałem zastosować drugi sposób uruchomienia skryptu 12 na Logitech wg.Twojego opisu,ale powstał błąd.Sprawdź na liście zmiennych modułu czy istnieje zmienna o takim ID.Cytuj....W module 'GameControllerInput' nie znaleziono zmiennej o identyfikatorze 'Logitech Extreme 3D:button_001'....
Przy okazji taka uwaga szkoda,że nie można kopiować informacji z log.Kopiować można przy pomocy skrótu klawiaturowego CTRL+C. Menu podręczne też się przyda więc wezmę to pod uwagę.
Próbuję wysyłać skrót CTRL+ALT+1 do Falcona i nie widzę efektu.Sprawdziłem dokładnie i znalazłem błąd przy wysyłaniu klawiszy w module KeyboardOutput. Wiem na czym polega błąd, będę chciał go w miarę szybko poprawić. Ciekawe jest to, że Falcon nie potrafi "odczytać" tych klawiszy a inne programy oraz FS'y nie mają problemu.
Podejrzewam,że wczoraj to działało ponieważ miałem w tle włączony SVMapper i tego faktu nie zauważyłem.Jest to jedyne logiczne wyjaśnienie.
Czy można robiąc odpowiednie deklaracje w module GameControllersInput->konfiguracja->przyciski zrobić z wejść typu pushbuttons toggle switch.Na chwilę obecną nie da się tego zrobić poprzez konfigurację, jedynie pisząc odpowiednio skrypt. Podaj przykład co chciałbyś zrobić przy pomocy toggle switch'a, to postaram się opisać jak to zrealizować przy pomocy skryptu, jeśli okaże się, że lepiej żeby to moduł odpowiednio traktował przyciski to dodam taką opcję do modułu.
Są tam różne opcje typu oczekiwanie zdarzenia,sprawdzanie cykliczne,powtarzanie jak często i po jakim czasie.Opcje dotyczące samego kontrolera:
Przy okazji prośba o wyjaśnienie w jakich sytuacjach użyć te opcje.
Z mojego doświadczenia wynika,że najlepsza metoda testu jakiegoś nowego programu to pytania nawet jeśli są naiwne.Nie ma głupich pytań - są tylko głupie odpowiedzi, tak więc będę odpowiadał aż wszystko stanie się jasne i zrozumiałe :)
Na koniec jeszcze jedno spostrzeżnie dotyczące wysyłania kombinacji klawiszy.W DK wysyłane są klawisze wg.kolejności umieszczenia ich w tekscie tak się domyślam.W SIOC jest podobnie,ale rozróżniają w sekwencji oprócz kolejności wysłania naciśnięcie (down) oraz puszczenie (up).Tak, wysyłane są w takiej kolejności w jakiej się wpisze. Jeśli chcemy inną kolejność np. nacisnąć klawisz, nacisnąć inny, puści pierwszy i puścić drugi to można skorzystać z pozostałych funkcji z modułu KeyboardOutput: SendKeysDown i SendKeysUp.
Nie działa enkoder.U mnie enkodery są podłączone do MJoya i realizuję funkcję HSD Range Dec oraz Inc co odpowiada kombinacji klawiszy Shift+F11 oraz Shift+F12.Próbowałem ustawić w opcjach przycisków powtórzenia w ms,ale to nie miało wpływu.W SVMapper to działa.Enkoder w MJoy'u jest jak zwykły przycisk, nie trzeba konfigurować mu powtórzeń itd. Nie działa enkoder czy wysyłanie klawiszy SHIFT+F11 i SHIFT+F12 ?
Niestety, kiedy chcę uruchomić skrypt "SK" pojawia się błąd i skrypt kończy działnie:
Uruchamianie skryptu 'SK'...Uruchomiono wątek skryptu...Błąd działania skryptu: DomowyKokpit.Parser.CheckingScriptException: W module 'SkalarkiIO' nie znaleziono zmiennej o identyfikatorze 'usb:output_014'. at DomowyKokpit.Main.ProcessingThread(Object p)Zakończono działanie skryptu.
I teraz pytanie, czy jest to błąd w module SkalarkiIO? Błędnie napisany skrypt?
Czy tak powinien wyglądać zapis, czy może raczej tak:Wartość 0x1000 to bitowo 1 0000 0000 0000. Licząc od prawej i numerując od zera. To 1 jest na pozycji 12, więc do funkcji przekazujemy 12.
{
$AOAAboveLED = GetBitState( $lightBits , 0x1000 );
}
Kolejne pytanie to zapis bitu, czyli po przeliczeniu w kalkulatorze 0x1000 wynika, że jest to 12. Czyli zapis powinien wyglądać tak?-
{
$AOAAboveLED = GetBitState( $lightBits , 12 );
}
Mimochodem wychodzi tu niezły podręcznik użytkownikaJa myślę,że po testach powstanie coś podobnego do manuala MJoya.Chętnie pomogę w redagowaniu.
skorzystać z pozostałych funkcji z modułu KeyboardOutput: SendKeysDown i SendKeysUp.Ja to zauważyłem.Napisałem o tym dlatego,że nie rozumiem dlaczego w SIOC piszą tak precyzyjnie zwykłą czynność wciśnięcia i puszczenie klawiszy.U nich sekwencja np.shift+ctrl+alt+klawisz jest rozpisana na shiftdown/ctrldown/altdownklawisz/altup/ctrlup/shiftup dokładnie w takiej kolejności.
1.Ten plik monitorujący gdzie umieścić i jak go uruchomić.W archiwum jest plik FalconMonitor.exe, wystarczy uruchomić.
2.Nie mogę znaleźć na Twojej stronie pliku SharedMemHeaders.cs.Ten plik umieściłem w archiwum z programem. To jest link bezpośredni do archiwum http://angus.foxnet.pl/fs/falcon_monitor.zip
1.Mam kontroler np.MJoy lub Logitech i nie używam osi w skrypcie i mam wybraną opcję "oczekuj zdarzenia".Oś drga,czy w tym przypadku moduł jest zaangażowany mam na myśli drania osi czy to ignoruje?Tak, bo zdarzenie jest wspólne dla przycisków i dla osi (to jest zdarzenie generowane przez DirectInput w Windows). Jeśli masz drgające osie to może lepiej dać drugą opcję i ustawić interwał np. na 20ms.
2.Opcja powtarzaj po jakimś czasie dla przycisku.Praktycznie w jakiej sytuacji ją użyć?To zależy czy w ogóle potrzebujesz tej opcji. Jeśli np. używasz dwóch przycisków do kontrolowania przepustnicy, jeden otwiera drugi przymyka. Jedno naciśnięcie to zmiana np. o 1 jednostkę. Żeby nie trzeba było cały czas naciskać to włączasz opcję powtarzania i np. czas po jakim się zaczyna ustalasz na 500ms. I teraz po naciśnięciu przycisku i przytrzymaniu go ponad 500ms moduł zacznie generować sekwencje zdarzeń. W zdarzeniu masz zwiększanie/zmniejszanie otwarcia przepustnicy, więc kolejne generowane zdarzenia będą zmieniać otwarcie przepustnicy, a przy tym nie trzeba cały czas zwalniać i przyciskać przycisku (bo opcja powtarzania to symuluje).
Napisałem skrypt, nie wiem czy jest poprawny, czy też nie?Skrypt jest poprawny co zresztą potwierdzone jest przez jego działanie. Brawo EGHI :)
Nakręciłem na szybko filmik (sorry za jakość) gdzie można zobaczyć działanie tego skrypty.No jakość okropna :) Ale to co trzeba to da się zobaczyć. Na tym filmiku jakoś lepiej te światła od podwozia działają, czy mi się wydaje ?
http://www.youtube.com/watch?v=uVjTKE8SXr4 (http://www.youtube.com/watch?v=uVjTKE8SXr4)
czy można to zrobić skryptem? np. if False...... skrót (G) zostanie ponownie wysłany?Kod, który pokazaliście (vito_zm i EGHI) wysyła skrót klawiaturowy tylko gdy przycisk zostanie naciśnięty.
Masz na to jakiś pomysł?
variable_changed $usb_input_000
{
if ($usb_input_000 )
{
// wysłanie skrótu klawiaturowego g
KeyboardOutput:SendShortcut( "^%1" );
}
}
Odpowiedzialny jest za to warunek "if", który w powyższym przypadku sprawdza czy przycisk jest naciśnięty. Wystarczy usunąć warunek i mamy: variable_changed $usb_input_000
{
// wysłanie skrótu klawiaturowego CTRL+ALT+1
KeyboardOutput:SendShortcut( "^%1" );
}
W tym momencie skrót klawiaturowy zostanie wysłany gdy przycisk zostanie naciśnięty i gdy zostanie zwolniony.
Codeking mam do Ciebie pytania.Rozpakowałem program monitoringu Falcona.Jak go uruchomić tak aby monitorował Falcona.Po otwarciu mam w okienku status -nie uruchomiony.Są tam też inne okienka między innymi wersja danych,co to onacza?Możesz wyjaśnić.Wystarczy uruchomić program i Falcon'a. Program automatycznie odczytuje dane z pamięci współdzielonej. Wersję Falcon'a można wybrać podczas działania programu. Te 4 liczby (lightBits, lightBits2, lightBits3 i hsiBits) to dane odczytane z Falcon'a zapisane bitowo (32 bity każda). Dodatkowo dane dotyczące świateł są rozłożone na poszczególne bity w tabelkach i wyświetlany jest ich wartość (łatwiej odczytać z tabeli niż liczyć bity w jednym ciągu). W najnowszej wersji biblioteki jest możliwość odczytania wersji pamięci współdzielonej, nie wiem jakie to ma znaczenie, dodałem bo może to będzie pomocne przy konsultacja z autorem biblioteki.
Czy w tej bibliotece są rozróżniane wersje Falcona.Mam na myśli bity (3x32) odpowiedzialne za sygnalizowanie alarmów.Pytam dlatego,że widzę inne adresy bitów w FAST.Tak, ale trzeba zauważyć, że adresy z pod których odczytywane są stany świateł są ten same dla wszystkich wersji Falcon'a. Zmieniają się tylko znaczenia poszczególnych bitów. Np. zmienna lighBits3 jest różna dla jednych wersji (deklaracja public enum LightBits3 : int w SharedMemHeaders.cs) i inna dla innej wersji (public enum Bms4LightBits3 : int). Ale sposób odczytania tych danych z pamięci się nie różni. Kwestia interpretacji bitów.
Kwestia interpretacji bitów.Tym się zajmę w najbliższym czasie,ponieważ są pewne różnice w zależności od wersji Falcona.
System.BadImageFormatException: Nie można załadować pliku lub zestawu 'file:///C:\Program Files\DomowyKokpit_1_0_2_5\DomowyKokpit_1_0_2_5\modules\inpout32.dll' lub jednej z jego zależności. Oczekiwano, że moduł będzie zawierał manifest zestawu.Czy coś zrobiłem nieprawidłowo?
Nazwa pliku: 'file:///C:\Program Files\DomowyKokpit_1_0_2_5\DomowyKokpit_1_0_2_5\modules\inpout32.dll'
w System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)
Wczytywanie modułów wejścia/wyjścia...
Moduł wejścia: FalconData
Moduł wyjścia: FSDataOutput
Moduł wejścia: FSDataInput
Moduł wejścia: GameControllersInput
Moduł wejścia: KeyboardInput
Moduł wyjścia: KeyboardOutput
Moduł wejścia: TestModule
Moduł wyjścia: TestModule
Moduł wejścia: SkalarkiIO
Moduł wyjścia: SkalarkiIO
System.Reflection.ReflectionTypeLoadException: Nie można załadować jednego lub większej liczby żądanych typów. Aby uzyskać więcej informacji, pobierz właściwość LoaderExceptions.
w System.Reflection.Module._GetTypesInternal(StackCrawlMark& stackMark)
w System.Reflection.Module.GetTypes()
w DomowyKokpit.Main.LoadDevices()
Wczytano modułów: 10
Wejścia: 6
Wyjścia: 4
Ilość zmiennych: 3041
Wejścia: 2169
Wyjścia: 872
Start programu
Wczytywanie modułów wejścia/wyjścia...
Moduł wejścia: FalconData
Moduł wyjścia: FSDataOutput
Moduł wejścia: FSDataInput
Moduł wejścia: GameControllersInput
Moduł wejścia: KeyboardInput
Moduł wyjścia: KeyboardOutput
System.IO.FileNotFoundException: C:\Program Files\DomowyKokpit_1_0_2_6\DomowyKokpit_1_0_2_6\modules\LCDOnLPT.xml
w LCDOnLPT.ModuleConfiguration.Load(String fileName)
w LCDOnLPT.LCDOnLPTModule.LoadConfiguration()
w LCDOnLPT.LCDOnLPTModule.Load(ILog log)
w DomowyKokpit.Main.LoadDevices()
Moduł wejścia: TestModule
Moduł wyjścia: TestModule
Moduł wejścia: SkalarkiIO
Moduł wyjścia: SkalarkiIO
Wczytano modułów: 10
Wejścia: 6
Wyjścia: 4
Ilość zmiennych: 2905
Wejścia: 2033
Wyjścia: 872
// test modulu FalconData test zm1Uwaga:
script "Falcon"
{
variable $kias { module = "FalconData"; id = "kias"; type = double; direct = in; }
variable $rpm
{
direct = in;
module = "FalconData";
id = "rpm";
type = double;
}
variable_changed $rpm
{
Log("RPM=" + ToString(ToInt($rpm)));
}
variable_changed $kias
{
Log("prędkość=" + ToString(ToInt($kias)));
}
}
Z tymi światłami w Falcon'ie to są jakieś dziwne rzeczy, są problemy ze światłami położenia podwozia, u EGHI bardzo szybko są raportowane i to od razu 3 naraz - brak synchronizacji z tym co widać w Falcon'ie. Trzeba to jakoś wyprostować.To pewno jest tak samo jak w FSX. Aktywny bit tylko sygnalizuje fakt wypuszczenia bądź schowania podwozia, to są dwie skrajne wartości. Ale przecież pomiędzy rozpoczęciem otwierania podwozia a zakończeniem coś się dzieje, czyli podwozie się porusza. W fsx jest dostępna zmienna określająca położenie podwozia w %, ale w falcon chyba nie ma. Więc chyba światełka na panelu są programowo opóźniane, żeby dać żądany efekt, a to znaczy że wystarczy w skrypcie opóźnić odpalenie odpowiednich LED-ów o czas równy temu w FALCON.
Wczytywanie skryptów z pliku 'C:\Program Files\DomowyKokpit_1_0_2_6\DomowyKokpit_1_0_2_6\TestFalcon zm3.hcps'...Skrypt
Ilość wczytanych skryptów: 1.
"Falcon"
Uruchamianie skryptu 'Falcon'...
Uruchomiono wątek skryptu...
Błąd działania skryptu:
System.NullReferenceException: Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu.
w LCDOnLPT.LCDOnLPTModule.WriteControl(LCDSeq lcd, Int32 control)
w LCDOnLPT.LPTLCD.Initialize()
w LCDOnLPT.LCDOnLPTModule.Start(StartStopType startType)
w DomowyKokpit.Main.ProcessingThread(Object p)
Zakończono działanie skryptu
koniec cytatu
// test modulu FalconData test zm3 test LCDCodeking czy możesz powiedzieć co zrobiłem źle.Przy okazji mam do ciebie prośbę czy możesz na swojej stronie umieścić przykład skryptu,który realizuje np.wyświetlanie DED lub PFD na LCD.
script "Falcon"
{
variable $rpm
{
direct = in;
module = "FalconData";
id = "rpm";
type = double;
}
variable $a1
{
module = "LCDOnLPT";
id = "a1";
type = string;
direct = out;
}
variable_changed $rpm
{
Log("RPM=" + ToString($rpm));
$a1= ToString($rpm);
}
}
2.W aplikacjach gdzie zastosujemy ten moduł oraz LCD mogą wystąpić dosyć skąplikowane skrypty.I tak, i nie. Wszystko zależy jak od tego co i jak chcemy wyświetlać.
Już z tego wynika,że aby to zrealizować trzeba trochę wysiłku,aby napisać skrypt realizujący to zadanie.Codeking w jednym z przykładów napisał taki skrypt do FSX.Tak, skrypt FS-MultiRadio wygląda przerażającą. Ale gdy się bliżej przyjrzeć, to obsługa wyświetlacza sprowadza się tylko do przypisania odpowiedniej wartości do zmiennych reprezentujących obszary znakowe. Cała reszta to sterowanie radiami w FS. I tak naprawdę, to obsługa wyświetlacza w tym skrypcie sprowadziła się do deklaracji zmiennych i przypisaniu wartości w kilku funkcjach UpdateXXX np. UpdateXPDR($variable).
Przy okazji pytanie do codeking.W pamięci współdzielonej DEDLine mam informację dotyczącą 5 linii tekstowych to czy jest tam pełna informacja na podstawie,której można sterować wyświetlacz graficzny czy tylko znakowy?Dane nadają się do wyświetlacza alfanumerycznego, jednak wymaga to jeszcze dopracowania, ponieważ zauważyłem, że DED (PFL pewnie też) zawiera znaki specjalne, które są źle interpretowane przez wyświetlacz (nie posiadają ich poprawnego odwzorowania). Trzeba więc dorobić funkcję definiowania znaków na wyświetlaczu (HD44780 pozwala na zdefiniowanie chyba 8 znaków własnych), być może niektóre już są zdefiniowane, trzeba sprawdzić w dokumentacji). Potrzebna będzie jeszcze funkcja mapowania znaków odczytanych z Falcon'a na odpowiednie znaki na LCD (to jest do zrobienia).
2.Pytanie drugie wiąże się z pierwszym.Ponieważ gotowe rozwiązania na wyświetlaczach graficznych są bardzo drogie to pomyślałem o pewnym uproszczeniu.Dotyczy to PFL w Falconie.Informacja w PFL jest mniej skąplikowana od DED,dlatego prawdopodobnie można zrobić proste wzorce tablic znakowych.Nie wiem jak z długością tablicy czy 20 wystarczy.Co do 5 linii to można to zrobić przełączając przełącznikiem tzn.wyświetlać linie od 1 do 4 lub od 2 do 5.To taki mój pomysł na rozwiązanie PFL.Pomysł jest OK, ale wiadomo - wrażenia trochę zepsuje takie przełączanie, i pewnie trzeba by jeszcze przewijać kolumny (wyświetlacz ma 20 a DED ma 25) - może to zrobić pseudo automat w skrypcie. Jednak można się rozglądnąć za jakimś wyświetlaczem graficznym, na którym da się zrealizować DED i PFL bez konieczności przełączania ekranów itd. Taki wyświetlacz można by też ciekawie wykorzystać w FS. Problem stanowi interfejs sprzętowy LCD<->PC. Jeśli takowy będzie to chętnie zaimplementuje moduł do obsługi takich wyświetlaczy do DK.
script "DED - LCD"
{
// linie tekstu z modułu testowego (należy podmienić na zmienne z modułu LCDOnLPT)
variable $out_string_00 { module = "TestModule"; id = "out:string_00"; type = string; direct = out; }
variable $out_string_01 { module = "TestModule"; id = "out:string_01"; type = string; direct = out; }
variable $out_string_02 { module = "TestModule"; id = "out:string_02"; type = string; direct = out; }
variable $out_string_03 { module = "TestModule"; id = "out:string_03"; type = string; direct = out; }
variable $out_string_04 { module = "TestModule"; id = "out:string_04"; type = string; direct = out; }
// DED, tablica 5 wierszy wartości typu string
variable $dedLines
{
direct = in;
module = "FalconData";
id = "DEDLines";
type = string_array;
}
// zdarzenie zmiany wartości DED czyli zawartości wyświetlacza DED w Falcon
variable_changed $dedLines
{
// przypisanie odpowiednich wartości
// funkcja GetValue(<tablica>, <indeks>) służy do pobierania wartości z tablicy
$out_string_00 = GetValue( $dedLines , 0 );
$out_string_01 = GetValue( $dedLines , 1 );
$out_string_02 = GetValue( $dedLines , 2 );
$out_string_03 = GetValue( $dedLines , 3 );
$out_string_04 = GetValue( $dedLines , 4 );
}
}
linie tekstu z modułu testowego (należy podmienić na zmienne z modułu LCDOnLPT)Czy możesz to rozwinąć chciałbym zrobić test z fizycznym LPT.
Widziałem Twój film gdzie jest wyświetlany DED na LPT.Czy możesz to rozwinąć chciałbym zrobić test z fizycznym LPT.Chodzi o to, że konfigurujesz sobie obszar tekstowy na cały wiersz wyświetlacza. Możesz nadać mu id "out_string_00". Podmieniasz w skrypcie deklarację zmiennej $out_string_00 na tą z moduły LCDOnLPT.
Substring($string, $start, $dlugosc)– metoda zwraca wycinek łańcucha tekstowa przekazanego do funkcji, zmienna $start określa pozycję w łańcuch od której rozpocznie się kopiowanie (indeks od 0), zmienna $dlugosc określa ile liter ma być skopiowanych, użycie wartości wykraczających poza przekazany łańcuch tekstowy spowoduje błąd skryptu i przerwanie wykonywania skryptu
$zmienna = "DomowyKokpit" ;
$nowaZmienna = Substring( $zmienna , 3 , GetLength( $zmienna ) - 3 ) ;
Log( "$zmienna = " + $zmienna );
Log( "$nowaZmienna = " + $nowaZmienna );
Wynik:Skrypt: $zmienna = DomowyKokpit
Skrypt: $nowaZmienna = owyKokpit
script "PFL - LCD-_2linie"W tym momencie zabrałem się za czytanie strony codeking Operatory i funkcje wbudowane.Jest tam def.Substring($string,$start,$długość).W przykładzie jest trochę bardziej rozbudowane $nowaZmienna = Substring( $zmienna , 3 , GetLength( $zmienna ) - 3 ) ;
{
variable $L0 { module = "LCDOnLPT"; id = "L0"; type = string; direct = out; }
variable $L1 { module = "LCDOnLPT"; id = "L1"; type = string; direct = out; }
// PFL, tablica 5 wierszy wartości typu string
variable $PFLLines
{
module = "FalconData";
id = "PFLLines";
type = string_array;
direct = in;
}
// zdarzenie zmiany wartości PFL czyli zawartości wyświetlacza PFL w Falcon
variable_changed $PFLLines
{
// przypisanie odpowiednich wartości
// funkcja GetValue(<tablica>, <indeks>) służy do pobierania wartości z tablicy
$L0=GetValue($PFLLines , 0 );
$L1=GetValue($PFLLines , 2 );
}
}
script "PFL - LCD-2linie-Moduł-5linii"Zmienna a1 ma obszar znakowy 2x16,zmienne L0 oraz L1 16 znaków w wierszu 0 oraz 1.Nie potrafię dla tego przykładu zastosować funkcję Substring().Codeking w Tobie nadzieja,trochę wstyd się przyznać do porażki.
{
// linie tekstu z modułu testowego (należy podmienić na zmienne z modułu LCDOnLPT)
variable $out_string_00 { module = "TestModule"; id = "out:string_00"; type = string; direct = out; }
variable $out_string_01 { module = "TestModule"; id = "out:string_01"; type = string; direct = out; }
variable $out_string_02 { module = "TestModule"; id = "out:string_02"; type = string; direct = out; }
variable $out_string_03 { module = "TestModule"; id = "out:string_03"; type = string; direct = out; }
variable $out_string_04 { module = "TestModule"; id = "out:string_04"; type = string; direct = out; }
//variable $a1 { module = "LCDOnLPT"; id = "a1"; type = string; direct = out; }
variable $L0 { module = "LCDOnLPT"; id = "L0"; type = string; direct = out; }
variable $L1 { module = "LCDOnLPT"; id = "L1"; type = string; direct = out; }
// PFL, tablica 5 wierszy wartości typu string
variable $PFLLines
{
module = "FalconData";
id = "PFLLines";
type = string_array;
direct = in;
}
// zdarzenie zmiany wartości PFL czyli zawartości wyświetlacza PFL w Falcon
variable_changed $PFLLines
{
// przypisanie odpowiednich wartości
// funkcja GetValue(<tablica>, <indeks>) służy do pobierania wartości z tablicy
$out_string_00 = GetValue($PFLLines , 0 );
$out_string_01 = GetValue($PFLLines , 1 );
$out_string_02 = GetValue($PFLLines , 2 );
$out_string_03 = GetValue($PFLLines , 3 );
$out_string_04 = GetValue($PFLLines , 4 );
$L0=GetValue($PFLLines , 0 );
$L1=GetValue($PFLLines , 2 );
//$a1=GetValue($PFLLines , 0 );
}
}
Próbowałem sprawdzić funkcję dołącz do tekstu z lewej strony np.spację,ale to nie działa.Jeśli było ustawione na przycięcie z lewej strony to dołączenie nie miało sensu. Linia miała więcej niż 16 znaków więc obcięty został on do 16 z lewej strony. Czyli np. "12345678901234567890" zostałby obcięty i w wyniku wygląda tak: "5678901234567890". 4 znaki z lewej zostały usunięte.
W przykładzie jest trochę bardziej rozbudowane $nowaZmienna = Substring( $zmienna , 3 , GetLength( $zmienna ) - 3 ) ;Ten przykład robi prostą rzecz, ucina 3 pierwsze znaki i zwraca pozostałe do zmiennej $nowaZmienna. Dodałem funkcję GetLength(...), która zwraca długość tekstu, aby nie trzeba było wpisywać ilości znaków zwracanych. W tym przykładzie zawsze usunie 3 pierwsze znaki i zawsze zwróci pozostałe. Jeśli wiemy, że nasz tekst będzie miał zawsze 25 znaków to można to zapisać na stałe:
$nowaZmienna = Substring( $zmienna , 3 , 22 );
Próbowałem to zastosować do mojego skryptu,ale mam problemyNapisz dokładnie co chcesz uzyskać.
Zmienna a1 ma obszar znakowy 2x16,zmienne L0 oraz L1 16 znaków w wierszu 0 oraz 1.Nie potrafię dla tego przykładu zastosować funkcję Substring().
variable $tmpFunkcjaTrim { type = int; }
function FunkcjaTrimBegin( $tekst )
{
$tmpFunkcjaTrim = GetLength( $tekst ) ;
if ( $tmpFunkcjaTrim > 0 )
{
if ( Substring( $tekst , 0 , 1 ) == " " )
{
if ( $tmpFunkcjaTrim > 1 )
{
return FunkcjaTrimBegin( Substring( $tekst , 1 , $tmpFunkcjaTrim - 1 ) ) ;
}
else
{
return "" ;
}
}
}
return $tekst ;
}
function FunkcjaTrimEnd( $tekst )
{
$tmpFunkcjaTrim = GetLength( $tekst ) ;
if ( $tmpFunkcjaTrim > 0 )
{
if ( Substring( $tekst , $tmpFunkcjaTrim - 1 , 1 ) == " " )
{
if ( $tmpFunkcjaTrim > 1 )
{
return FunkcjaTrimEnd( Substring( $tekst , 0 , $tmpFunkcjaTrim - 1 ) ) ;
}
else
{
return "" ;
}
}
}
return $tekst ;
}
Ponieważ mam problemy z funkcją GetLength( $zmienna ) to zwracam długość obciętego tekstu (w przykładzie 22) ręcznie.Jaki problem ?
Teraz muszę opanować obcinanie z prawej strony za pomocą funkcji TrimEnd.W tym momencie prośba do codeking o pomoc,najlepiej przykład do mojego skryptu np.obcięcie 4 spacji z prawej strony dla zmiennej $L1Funkcje pokazane wcześniej (FunkcjaTrimBegin i FunkcjaTrimEnd) usuwają wszystkie spacje z lewej (Begin) i z prawej (End) strony tekstu. Nie można do niej przekazać ilości spacji, które ma usunąć. Problemem późniejszym może być to, że tekst wynikowy będzie miał np. 10 znaków, na wyświetlacz wysyłane są tylko te znaki, które się zmieniły (porównanie tego co jest na wyświetlaczu z tekstem). Dlatego trzeba ustawić w opcjach obszaru dołączanie spacji (z lewej jeśli chcemy wyrównać tekst do prawej, lub z prawej jeśli chcemy wyrównać tekst do lewej). Przykład użycia powyższych funkcji (należy je skopiować do skryptu wraz ze zmienną $tmpFunkcjaTrim):
$L0 = FunkcjaTrimBegin( FunkcjaTrimEnd ( GetValue( $PFLLines , 0 ) ) ) ;
Log( "Oryginal = \"" + GetValue( $PFLLines , 0 ) + "\"" );
Log( "$L0 = \"" + $L0 + "\"" );
Wynik działania:Skrypt: Oryginal = " te kst "
Skrypt: $L0 = "te kst"
Czyli widać dokładnie - funkcje usunęły wszystkie spacje z początku i końca tekstu. // zmienna pomocnicza
variable $trybLCDPFL { type = int; }
function ShowPFL()
{
if ( $trybLCDPFL == 1 )
{
// pokazujemy 1 i 2 linię
$L0 = FunkcjaTrimBegin( FunkcjaTrimEnd ( GetValue( $PFLLines , 1 ) ) ) ;
$L1 = FunkcjaTrimBegin( FunkcjaTrimEnd ( GetValue( $PFLLines , 2 ) ) ) ;
}
else
{
if ( $trybLCDPFL == 2 )
{
// pokazujemy 2 i 3 linię
$L0 = FunkcjaTrimBegin( FunkcjaTrimEnd ( GetValue( $PFLLines , 2 ) ) ) ;
$L1 = FunkcjaTrimBegin( FunkcjaTrimEnd ( GetValue( $PFLLines , 3 ) ) ) ;
}
else
{
if ( $trybLCDPFL == 3 )
{
// pokazujemy 3 i 4 linię
$L0 = FunkcjaTrimBegin( FunkcjaTrimEnd ( GetValue( $PFLLines , 3 ) ) ) ;
$L1 = FunkcjaTrimBegin( FunkcjaTrimEnd ( GetValue( $PFLLines , 4 ) ) ) ;
}
else
{
// pokazujemy 0 i 1 linię
$L0 = FunkcjaTrimBegin( FunkcjaTrimEnd ( GetValue( $PFLLines , 0 ) ) ) ;
$L1 = FunkcjaTrimBegin( FunkcjaTrimEnd ( GetValue( $PFLLines , 1 ) ) ) ;
}
}
}
}
// zdarzenie przycisku "Pokaż 0 i 1 linię PFL"
variable_changed $przycisk1
{
if ( $przycisk1 )
{
$trybLCDPFL = 0;
ShowPFL();
}
}
// zdarzenie przycisku "Pokaż 1 i 2 linię PFL"
variable_changed $przycisk2
{
if ( $przycisk2 )
{
$trybLCDPFL = 1;
ShowPFL();
}
}
// zdarzenie przycisku "Pokaż 2 i 3 linię PFL"
variable_changed $przycisk3
{
if ( $przycisk3 )
{
$trybLCDPFL = 2;
ShowPFL();
}
}
// zdarzenie przycisku "Pokaż 3 i 4 linię PFL"
variable_changed $przycisk4
{
if ( $przycisk4 )
{
$trybLCDPFL = 3;
ShowPFL();
}
}
// zdarzenie zmiany zawartości PFL
variable_changed $PFLLines
{
ShowPFL();
}
Aby ten kod zadziałał należy zdefiniować zmienne przycisków ($przycisk1, $przycisk2 itd.), zmienne $PFLLines, $L0 i $L1, oraz skopiować funkcje FunkcjaTrimBegin i FunkcjaTrimEnd z mojego poprzedniego postu. Tekst będzie się zmieniał na wyświetlaczu o jeden wiersz. Można zrobić tak, że będzie się zmieniał co 2 linie, wtedy wystarczy 3 przyciski (pokaż 0 i 1 linie, 2 i 3, 4).Teraz trywialne pytanie czy pisząc definicję wspomnianych funkcji piszę dosłownie jako argument ogólnie $tekst a wywołując te funkcje wstawiam konkretną zmienną tekstową np. GetValue( $PFLLines , 1 )?Tak, do funkcji przekazujesz dowolną zmienną typu string lub nawet wprost tekst, np. 'FunkcjaTrimBegin(" proszę usunąć spacje na początku tego tekstu").
Zauważyłem także,że można wywoływać funkcję "zagęszczoną" np.Można, traci się wtedy czytelność kodu. Można też oczywiście po kolei:
FunkcjaTrimBegin( FunkcjaTrimEnd ( GetValue( $PFLLines , 1 ) ) ).
$L0 = GetValue( $PFLLines , 2 ) ;
$L0 = FunkcjaTrimBegin( $L0 ) ;
$L0 = FunkcjaTrimEnd ( $L0 ) ;
Jak kto woli.Przepraszam,że pytam o szczegóły,ale dawno nie miałem do czynienia z programowaniem.Nie ma za co przepraszać, po to jest ten wątek :)
$out_string_00 = GetValue($PFLLines , 0 );Ponieważ mam na wyświetlaczu dodatkowe 3 znaki,które nie widzę w module wyjściowym to chciałbym zrobić log dla linii 0 (lub dla wszystkich 5 linii).I znowu prośba do codeking.Mogę prosić o instrukcję log dla linii 0 lub dla wszystkich.Chciałbym śledzić co się dzieje na tych liniach.
$out_string_01 = GetValue($PFLLines , 1 );
$out_string_02 = GetValue($PFLLines , 2 );
$out_string_03 = GetValue($PFLLines , 3 );
$out_string_04 = GetValue($PFLLines , 4 );
// pokazujemy 0 i 1 linię
$L0 = FunkcjaTrimBegin( FunkcjaTrimEnd ( GetValue( $PFLLines , 0 ) ) ) ;
$L1 = FunkcjaTrimBegin( FunkcjaTrimEnd ( GetValue( $PFLLines , 2 ) ) ) ;
Ponieważ mam na wyświetlaczu dodatkowe 3 znaki,które nie widzę w module wyjściowym to chciałbym zrobić log dla linii 0 (lub dla wszystkich 5 linii).I znowu prośba do codeking.Mogę prosić o instrukcję log dla linii 0 lub dla wszystkich.Chciałbym śledzić co się dzieje na tych liniach.Nie wiem dokładnie jakie te znaki dodatkowe widzisz. Jeśli są to pozostałości po starych wiadomościach to musisz ustawić w konfiguracji obszaru na wyświetlaczu opcję Dołączenie (z lewej lub prawej - w zależności od tego do której strony chcesz mieć przyrównany tekst), jako znak dołączany możesz wpisać spację.
Log( "$L0 = \"" + $L0 + "\"" );
Znaki \" powoduje wpisanie do Log znaku " (cudzysłów), który normalnie jest ogranicznikiem tekstu.
variable $aviator_przycisk_001 { module = "GameControllersInput"; id = "aviator:przycisk_001"; type = bool; direct = in; }
variable_changed $aviator_przycisk_001
{
if ( $aviator_przycisk_001 )
{
MouseOutput:Click( 0 , 120 , 418 );
}
}
script "Klawiatura - serwer"
{
// zmienna przechowuje "klawisze" do naciśnięcia
variable $klawisze { direct = in; module = "DataReceiver"; id = "klawisze"; type = string; }
// zmienna informująca o konieczności wysłania skrótu klawiaturowego
variable $sygnal { direct = in; module = "DataReceiver"; id = "sygnal"; type = bool; }
variable_changed $sygnal
{
KeyboardOutput:SendShortcut( $klawisze );
}
}
script "Klawiatura - klient"
{
// zmienna informująca serwer o konieczności wysłania skrótu klawiaturowego
variable $sygnal { direct = out; module = "DataSender"; id = "sygnal"; type = bool; }
// przycisk (z płytki SkalarkiIO)
variable $usb_input_000 { module = "SkalarkiIO"; id = "usb:input_000"; type = bool; direct = in; }
variable_changed $usb_input_000
{
// wysłanie skrótu klawiaturowego na serwer
DataSender:SendVariable( "klawisze" , "^p" );
// poinformowanie serwera o konieczności wykonania skrótu klawiaturowego
$sygnal = Not( $sygnal );
}
}
Wczytywanie skryptów z pliku 'C:\Program Files\DomowyKokpit_1_0_2_6\DomowyKokpit_1_0_2_6\Network-serwer.hcps'...1.W związku z czym pytanie: co ozn.to ostatnie zdanie w komunikacie?
Ilość wczytanych skryptów: 1.
"Network - serwer"
Uruchamianie skryptu 'Network - serwer'...
Uruchomiono wątek skryptu...
# DataReceiver : Próba uruchomienia serwera: 192.168.0.1:21142
# DataReceiver : Tylko jedno użycie każdego adresu gniazda (protokół/adres sieciowy/port) jest normalnie dozwolone
3.Pytanie trywialne.Kopiuję przykład z strony codeking do notatnika i mam plik .txt.Co zrobić aby był .HCPS?Ja to zrobiłem tak:
1.W związku z czym pytanie: co ozn.to ostatnie zdanie w komunikacie?To znaczy, że adres jest już wykorzystywany, pewnie miałeś uruchomiony jakiś program (DK?), który wykorzystywał port 21142.
2.Wpisałem 2 przykłady podane na stronie codeking network-klient oraz network-serwer.Co powinienem otrzymać na odbiorze?Na kliencie, w module testowym (okno konfiguracji) wpisz cokolwiek do zmiennej "string_00", wpisany tekst zostanie wysłany do serwera i pojawi się w oknie Log.
script "Skrypt_zm11 - wysyłanie wirtualnych klawiszy"Ten przykład pracował w innej wersji KD,ale to było dawno temu.Coś sobie przypominam,że była mała poprawka związana z definicją zmiennej $Logitech_Extreme_3D" dodano "..Pro_USB.."
{
variable $Logitech_Extreme_3D_Pro_USB_przycisk_010 { module = "GameControllersInput"; id = "Logitech Extreme 3D Pro USB:przycisk_010"; type = bool; direct = in; }
variable_changed $Logitech_Extreme_3D_Pro_USB_przycisk_010
{
if ( $Logitech_Extreme_3D_Pro_USB_przycisk_010 )
{
// wysłanie sekwencji
KeyboardOutput:SendKeys( "DomowyKokpit" );
}
}
}
script "Klawiatura - klient"Podobnie z drugim skyptem "Klawiatura-serwer" ten sam komunikat ale od pozycji 418
{
// zmienna informująca serwer o konieczności wysłania skrótu klawiaturowego
variable $sygnal { direct = out; module = "DataSender"; id = "sygnal"; type = bool; }
// przycisk (MJOY)
variable $MJ16_przycisk_069 { module = "GameControllersInput"; id = "MJ16:przycisk_069"; type = bool; direct = in; }
variable $MJ16_przycisk_077 { module = "GameControllersInput"; id = "MJ16:przycisk_077"; type = bool; direct = in; }
variable_changed $MJ16_przycisk_069
{
DataSender:SendVariable( "klawisze" , "^%r" );
// poinformowanie serwera o konieczności wykonania skrótu klawiaturowego
$sygnal = Not( $sygnal );
}
variable_changed $MJ16_przycisk_077
{
DataSender:SendVariable( "klawisze" , "+^%r" );
// poinformowanie serwera o konieczności wykonania skrótu klawiaturowego
$sygnal = Not( $sygnal );
}
}
script "Klawiatura - serwer"Czy mogę prosić o pomoc.
{
// zmienna przechowuje "klawisze" do naciśnięcia
variable $klawisze { direct = in; module = "DataReceiver"; id = "klawisze"; type = string; }
// zmienna informująca o konieczności wysłania skrótu klawiaturowego
variable $sygnal { direct = in; module = "DataReceiver"; id = "sygnal"; type = bool; }
variable_changed $sygnal
{
KeyboardOutput:SendShortcut( $klawisze );
}
}
script "wysylanie_danych"
{
// Trzy przyciski m mjoy-u
variable $p1 { module = "GameControllersInput"; id = "MJ18:przycisk_000"; type = bool; direct = in; }
variable $p2 { module = "GameControllersInput"; id = "MJ18:przycisk_001"; type = bool; direct = in; }
variable $p3 { module = "GameControllersInput"; id = "MJ18:przycisk_002"; type = bool; direct = in; }
// Zmienna lokalna, ktora przechowuje informacje jaki przycisk został przycisniety
variable $modelcd { type = int;}
// Zdarzenia przycisniecia przycisku, ktore powoduja zmiane zmiennej o $modelcd
variable_changed $p1
{ if ($p1== true)
{ $modelcd = 0 ;}
}
variable_changed $p2
{ if ($p2== true)
{ $modelcd = 1 ;}
}
variable_changed $p3
{ if ($p3== true)
{ $modelcd = 2 ;}
}
// Zdarzenie zmiany zmiennej $modelcd i wyłanie jej do serwera czyli komputera na której jest uruchomiony
// drugi DK i podlaczony wyswietlacz lcd
variable_changed $modelcd
{
DataSender:SendVariable( "data01" , $modelcd );
}
}variable $modelcd
{
direct = in ;
module = "DataReceiver" ;
id = "data01" ;
type = int ;
}variable $fsENG1N1 { module = "FSDataInput"; id = "0898"; type = int; direct = in; }
variable $fsENG1N2 { module = "FSDataInput"; id = "0896"; type = int; direct = in; }
variable $fsENG2N1 { module = "FSDataInput"; id = "0930"; type = int; direct = in; }
variable $fsENG2N2 { module = "FSDataInput"; id = "092E"; type = int; direct = in; }
variable $fsENG1EGT { module = "FSDataInput"; id = "08BE"; type = int; direct = in; }
variable $fsENG2EGT { module = "FSDataInput"; id = "0956"; type = int; direct = in; }
variable $fsENG1FF { module = "FSDataInput"; id = "0918"; type = double; direct = in; }
variable $fsENG2FF { module = "FSDataInput"; id = "09B0"; type = double; direct = in; }
variable $FS_FUEL_CENTRE { module = "FSDataInput"; id = "0B74"; type = int; direct = in; }
variable $FS_FUEL_LEFT { module = "FSDataInput"; id = "0B7C"; type = int; direct = in; }
variable $FS_FUEL_RIGHT { module = "FSDataInput"; id = "0B94"; type = int; direct = in; }variable_changed $FS_FUEL_LEFT
{ if($modelcd== 0)
{$FUEL_L = FormatNumber( ToDouble($FS_FUEL_LEFT) * 0.00010284886223222674759334973464183 , "0" ) + "0" ;}
}
variable_changed $FS_FUEL_CENTRE
{ if($modelcd== 0)
{$FUEL_S = FormatNumber( ToDouble($FS_FUEL_CENTRE) * 0.000343266569971970139145726313325 , "0" ) + "0" ;}
}
variable_changed $FS_FUEL_RIGHT
{ if($modelcd== 0)
{$FUEL_P = FormatNumber( ToDouble($FS_FUEL_RIGHT) * 0.00010284886223222674759334973464183 , "0" ) + "0";}
}
variable_changed $fsENG1N1
{ if($modelcd== 1)
{$N1_L = StringReplace ( FormatNumber( ToDouble($fsENG1N1) / 163.84 , "00.0" ),",", ".");}
}
variable_changed $fsENG2N1
{ if($modelcd== 1)
{$N1_P = StringReplace ( FormatNumber( ToDouble($fsENG2N1) / 163.84 , "00.0" ),",", ".");}
}
variable_changed $fsENG1N2
{ if($modelcd== 1)
{$N2_L = StringReplace ( FormatNumber( ToDouble($fsENG1N2) / 163.84 , "00.0" ),",", ".");}
}
variable_changed $fsENG2N2
{ if($modelcd== 1)
{$N2_P = StringReplace ( FormatNumber( ToDouble($fsENG2N2) / 163.84 , "00.0" ),",", ".");}
}
variable_changed $fsENG1EGT
{ if($modelcd== 1)
{$EGT_L = FormatNumber( $fsENG1EGT / 19.05116279069 , "000" );}
}
variable_changed $fsENG2EGT
{ if($modelcd== 1)
{$EGT_P = FormatNumber( $fsENG2EGT / 19.05116279069 , "000" );}
}
variable_changed $fsENG1FF
{ if($modelcd== 1)
{$FF_L = StringReplace ( FormatNumber( $fsENG1FF / 1000 , "0.00" ),",", ".");}
}
variable_changed $fsENG2FF
{ if($modelcd== 1)
{$FF_P = StringReplace ( FormatNumber( $fsENG2FF / 1000 , "0.00" ),",", ".");}
} Jeśli stosujesz moduł mouse to musisz mieć stabilny ekran symulatora 2D tak aby współrzędne przycisków nie zmieniały położenia.Czy możesz to potwierdzićTak potwierdzam, aby moduł prawidłowo działał współrzędne przycisków nie mogą się zmieniać, więc jedynym rozwiązaniem jest ekran symulatora tylko 2D.
Druga sprawa dotyczy wyświetlaczy znakowych LCD.W skrypcie jest kilka zmiennych.Czy masz podłączonych kilka LCD czy je przełączasz programowo?Mam podłączony jeden ekran LCD, a te zmienne to tylko obszary znakowe zdefiniowane w DK. Podczas prób wyświetlałem dane wyświetlałem na dwóch "wirtualnych" ekranach przełączanych przełącznikiem / odpowiedni skrypt w DK /, wiec tych obszarów znakowych było dużo - każdy wyświetlał inne dane, a podczas przełączenia "ekranów" wykorzystałem funkcje clearLCD
To formatowanie wygląda przerażająco.Rozumiem,że chodzi o umieszczenie informacji w określonym miejscu na ekranie oraz o odpowiedni wygląd.
Pytanie do autora DK.
Powili skrobie skrypt do mojego kokpitu, kolejne diody zaczynają świecić, przełączniki działać. DK działa w sieci, na komputerze serwer jest płytka Skalarki, Hotas i ramki MFD oraz karta OC-servo. Na kompie klient Mjoy, dwie karty BU0836. Wszystko fajnie działa ale, chcę przenieść Skalarki na klient(...)
widzę, że w DK [testowanie modułu] dodałeś funkcję [identyfikuj]. To znaczy, że w zakładce [Moduły wyjścia] w oknie [Zmienne modułu] nie będzie widoczna lista zmiennych?
Witam,kolejna faza aplikacji SimOUT w symulatorze Falcon.Mój cytat z innego wątku.Jestem już po testach,wypadły bardzo dobrze.Opis codeking jest bardzo dobry,nie miałem problemów z pisaniem skryptu.Teraz kolej na 7segLED.
script "Falcon - SimOUT - RPM"
{
variable $rpm { module = "FalconData"; id = "rpm"; type = double; direct = in; }
variable $RPM_ { module = "simOUT"; id = "RPM "; type = string; direct = out; }
variable_changed $rpm
{
$RPM_ = ToString($rpm);
}
}
$RPM_ = FormatNumber( $rpm , "000" );
Nie musisz się wtedy martwić o cyfry po przecinku itp., a wyświetlacz zawsze będzie pokazywał to co trzeba. Ustawienia obszaru w tym przypadku nie mają znaczenia i najlepiej ustawić wyrównanie do prawej, przycięcie z lewej i brak dopełnienia.$RPM_ = FormatNumber( $rpm , "0" );
a w obszarze ustaw wyrównanie do prawej, przycięcie z lewej i dopełnienie z lewej, a znak dopełniający wstaw spację$RPM_ = ToString( ToInt( $rpm ) );
a obszar ustaw dokładnie jak w poprzednim punkcieprzycięcie jest mylące i zastanawiałem się nad usunięciem tej funkcji,Nie usuwaj tej funkcji,jest przydatna.Postaram się to uzasadnić na przykładzie.Tak jak wspomniałem zrobiłem test Fuel Flow.Informacja w symulatorze jest wyświetlana na 5 pozycjach gdzie 2 ostatnie pozycje są zawsze zerami.W starym rozwiązaniu z kartami OC zrobiłem to w ten sposób,że wyświetlałem pierwsze 3 cyfry licząc z lewej strony a 2 ostatnie wyświetlały zawsze 00.
if ( $ChaffCount < 0 )
{
$CHAFF = "00";
}
else
{
$CHAFF = FormatNumber ( $ChaffCount,"00" );
}
Jeśli dane dla płytki Skalarki pochodzą z serwera to musisz na kliencie również uruchomić serwer :) Do tego na serwerze uruchomić też klienta. Tak więc będziesz miał dwa PC na których działa DK jednocześnie w trybie klienta i serwera. Z serwera (obecnego) będziesz wysyłał dane na klienta (obecnego) aczkolwiek aktualny serwer będzie działa również jako klient (bo klient może wysyłać dane na serwer), a aktualny klient będzie działał również jako serwer (bo tylko serwer może odbierać dane od klientów). Robisz wszystko tak jak do tej pory, to co zrobiłeś na serwerze zrób na kliencie i odwrotnie.
W SimOut chyba jest wspólna anoda?Tak jest wspólna anoda.Te,które wysłałem też mają wspólną anodę.SimOUT będzie realizował Fuel Quantity w Fuel Gauge,nie ma problemu.Planuję wykorzystać SimOUT do realizacji PFL,caution panel,generalnie ma sterować prawą stroną kokpitu.W zasadzie problemy z skryptami pod potrzeby Falcona stosowane w SimOUT są już prawie rozwiązane.Pozostaje sprawa wersji AF,OF ale to mam nadzieję też się wyjaśni.
// dioda na płytce Skalarki
variable $Glare_output_000
{
module = "SkalarkiIO";
id = "Glare:output_000";
type = bool;
direct = out;
}
// zmienna z klienta, światło MASTER CAUTION
variable $MASTER_Light
{
direct = in;
module = "DataReceiver";
id = "MASTER_Light";
type = bool;
}
// klient przysłał zmienną więc zapalan/gaszę diodę
variable_changed $MASTER_Light
{
$Glare_output_000 = $MASTER_Light;
}
variable $lightBits
{
direct = in;
module = "FalconData";
id = "lightBits";
type = int;
}
variable_changed $lightBits
{
DataSender:SendVariable( "MASTER_Light" , GetBitState( $lightBits , 0 ) );
}
Szkoda dwóch wyświetlaczy którymi można sterować, więc podłączyłbym je tak (na stałe do zasilania), żeby zawsze pokazywały 00. W ten sposób zostaną Tobie dwa wyświetlacze do wykorzystania (sterowanie).Ja tak zrobiłem w aplikacji z kartą OC,ale tam nie ma zysku,ponieważ jest inne rozwiązanie softu.W HSC jest zysk w postaci możliwości sterowania dwoma wyświetlaczami,ale trzeba zrobić małą modyfikacje pcb pod 5 wyświetlaczy 7segLED,co nie jest problemem.
Skrypt "powinien" działać :) Dzisiaj niedziela i ciężke pytanie zadałeś :)Zakładam, że skrypt będzie działać, jeszcze nie sprawdzałem.
variable $lightBits { module = "FalconData"; id = "lightBits"; type = int; direct = in; }
variable $lightBits2 { module = "FalconData"; id = "lightBits2"; type = int; direct = in; }
variable_changed $lightBits
{
//Right Indexer
//RefuelRDY=0x800
$led_001_001 = GetBitState( $lightBits , 15 );
//RefuelAR=0x1000
$led_001_002 = GetBitState( $lightBits , 16 );
//RefuelDSC=0x20000
$led_001_003 = GetBitState( $lightBits , 17 );
}
variable_changed $lightBits2
{
//LeftEyebrowLights
//ENGINE=0x80000000
$led_001_010 = GetBitState( $lightBits2 , 31 );
}
Po deklaracji variable_changed $lightBits w nawiasach muszą się znajdować zmienne związane z $lightBits .Nie można tam umieścić np. zmienną $lightBits2.
Tak samo nie można umieszczać deklaracje zmiennych w ten sposób:
variable_changed $lightBits
variable_changed $lightBits2
a następnie definiować funkcję np.
$led_001_001 = GetBitState( $lightBits , 15 );
$led_001_010 = GetBitState( $lightBits2 , 31 ); Po deklaracji variable_changed $lightBits w nawiasach muszą się znajdować zmienne związane z $lightBits .Nie można tam umieścić np. zmienną $lightBits2.W kodzie zdarzenia można używać wszystkich zmiennych zadeklarowanych w skrypcie, nie ma ograniczeń. Trzeba tylko pamiętać, że zdarzenie dotyczy konkretnej zmiennej i to ona zmieniła wartość. Więc jeśli w zdarzeniu dla $lightBits skorzystasz ze zmiennej $lightBits2, to nie jest błąd, ale taki kod jest niepotrzebny bo zdarzenie jest dla zmiennej $lightBits i to ona zmieniła wartość. Poniżej przykład:
variable_changed $lightBits
{
// korzystam z $lightBits
$led_001_001 = GetBitState( $lightBits , 15 );
// korzystam z $lightBits2 ale nie ma to za bardzo sensu bo wartość zmieniła $lightBits a nie $lightBits2
$led_001_010 = GetBitState( $lightBits2 , 31 );
}
Application starting...
Loading modules...
Input module : DataReceiver
Output module: DataSender
Input module : FalconData
System.NullReferenceException: Object reference not set to an instance of an object.
at FSData.ModulesConfiguration.Load()
at FSData.FSDataOutput.Load(ILog log)
at HomeSimCockpit.Main.LoadDevices()
Input module : GameControllersInput
Input module : KeyboardInput
Output module: KeyboardOutput
Output module: LCDOnLPT
Input module : TestModule
Output module: TestModule
Output module: MouseOutput
Output module: simOUT
Input module : SkalarkiIO
Output module: SkalarkiIO
Input module : Timer
Modules loaded: 14
Input: 7
Output: 7
Number of variables: 932
Input: 528
Output: 404
I muszę kopiować na dysk czystą instalkę... Żeby znowu działało. Czyli problem jest przy zapisie ustawień.// skrypt symulujący panel lights
// 8.10.2010
// mcd@interia.eu
script "FS - Lights"
{
// zmienne tekstu wyświetlanego na wyświetlaczu
variable $lcd_line_1
{
module = "TestModule";
id = "out:string_00";
type = string;
direct = out;
}
variable $lcd_line_2
{
module = "TestModule";
id = "out:string_01";
type = string;
direct = out;
}
variable $lcd_line_3
{
module = "TestModule";
id = "out:string_02";
type = string;
direct = out;
}
// zmienna przechowująca ustawienie świateł landing lights
variable $LandLights
{
module = "FSDataInput";
id = "028C";
type = int;
direct = in;
function = "LandingLightStatus";
}
variable $StrobeLights
{
module = "FSDataInput";
id = "0281";
type = int;
direct = in;
function = "StrobeLightStatus";
}
// funkcja pokazująca status landinglights na wyświetlaczu
function LandingLightStatus($variable)
{
if ( $LandLights == 1 )
{
$lcd_line_1 = "LANDING LIGHTS: ON";
}
else
{
$lcd_line_1 = "LANDING LIGHTS: OFF";
}
$lcd_line_2 = ToString( FormatNumber( FSDataInput:HexToInt( $LandLights ), "0" ) ) + " " + ToString( FormatNumber(
FSDataInput:HexToInt( $StrobeLights ), "0" ) );
}
function StrobeLightStatus($variable)
{
if ( $StrobeLights == 1 )
{
$lcd_line_3 = "STROBE LIGHTS: ON";
}
else
{
$lcd_line_3 = "STROBE LIGHTS: OFF";
}
$lcd_line_2 = ToString( FormatNumber( FSDataInput:HexToInt( $LandLights ), "0" ) ) + " " +ToString( FormatNumber(
FSDataInput:HexToInt( $StrobeLights ), "0" ) );
}
// zmienna do której zapisujemy rozkazy dla symulatora
variable $control
{
module = "FSDataOutput";
id = "028C";
type = int;
direct = out;
}
// pokazanie zmiany
variable_changed $LandLights
{
LandingLightStatus( $LandLights );
}
variable_changed $StrobeLights
{
StrobeLightStatus( $StrobeLights );
SetWithSignal( $control, 0 );
}
// zmienne przycisków i enkoderów joystick'a
variable $btnLandingLts
{
module = "TestModule";
id = "in:bool_00";
type = bool;
direct = in;
}
variable_changed $btnLandingLts
{
SetWithSignal( $control , 0);
}
}
// skrypt symulujący panel lights
// 8.10.2010
// mcd@interia.eu
script "FS - Lights"
{
// zmienne tekstu wyświetlanego na wyświetlaczu
variable $lcd_line_1
{
module = "TestModule";
id = "out:string_00";
type = string;
direct = out;
}
variable $lcd_line_2
{
module = "TestModule";
id = "out:string_01";
type = string;
direct = out;
}
variable $lcd_line_3
{
module = "TestModule";
id = "out:string_02";
type = string;
direct = out;
}
// zmienna przechowująca ustawienie świateł landing lights
variable $LandLights
{
module = "FSDataInput";
id = "028C";
type = int;
direct = in;
function = "LandingLightStatus";
}
variable $StrobeLights
{
module = "FSDataInput";
id = "0281";
type = int;
direct = in;
function = "StrobeLightStatus";
}
// funkcja pokazująca status landinglights na wyświetlaczu
function LandingLightStatus($variable)
{
if ( $LandLights == 1 )
{
$lcd_line_1 = "LANDING LIGHTS: ON";
}
else
{
$lcd_line_1 = "LANDING LIGHTS: OFF";
}
$lcd_line_2 = ToString( FormatNumber( $LandLights , "0" ) ) + " " +ToString( FormatNumber( $StrobeLights , "0" ) );
}
function StrobeLightStatus($variable)
{
if ( $StrobeLights == 1 )
{
$lcd_line_3 = "STROBE LIGHTS: ON";
}
else
{
$lcd_line_3 = "STROBE LIGHTS: OFF";
}
$lcd_line_2 = ToString( FormatNumber( $LandLights , "0" ) ) + " " +ToString( FormatNumber( $StrobeLights , "0" ) );
}
// zmienna do której zapisujemy rozkazy dla symulatora
variable $controlLandingLts
{
module = "FSDataOutput";
id = "028C";
type = int;
direct = out;
}
variable $controlStrobeLights
{
module = "FSDataOutput";
id = "0281";
type = int;
direct = out;
}
// zmienne przycisków i enkoderów joystick'a
variable $btnLandingLts
{
module = "TestModule";
id = "in:bool_00";
type = bool;
direct = in;
}
variable_changed $btnLandingLts
{
if ( $btnLandingLts )
{
SetWithSignal( $controlLandingLts , 1);
}
else
{
SetWithSignal( $controlLandingLts , 0);
}
}
variable $btnStrobeLights
{
module = "TestModule";
id = "in:bool_01";
type = bool;
direct = in;
}
variable_changed $btnStrobeLights
{
if ( $btnStrobeLights )
{
SetWithSignal( $controlStrobeLights , 1);
}
else
{
SetWithSignal( $controlStrobeLights , 0);
}
}
}
Ciekawe, że twój skrypt działa bez problemu.Ale ten mój skrypt działa u Ciebie ?
I tak szukam, czemu ta funkcja setwithsignal u ciebie działa, a u mnie pisało w logu" błąd (10), nie można wysłać wartości do symulatora" czy jakoś tak.OK, znalazłem kolejny błąd (właściwie moje przeoczenie pewnej sytuacji). Ten błąd również poprawię w kolejnej wersji.
Różnią się u nas tylko przecinkiem! Tzn. U mnie bo zmiennej jest od razu przecinek, a u ciebie jest po spacji. Parser jest na to czuły?Parser nie jest czuły na spacje przed i po przecinku. Wstawiam je żeby łatwiej było analizować kod. Normalnie przed przecinkiem nie daje spacji ale jak ktoś pierwszy raz styka się z programowaniem to od razu będzie widział przecinek :)
Witam. Jestem na forum nowy. Od kilku miesięcy przymierzam się do budowy własnego kokpitu. Trochę czytałem i zastanawiałem się nad wyborem softu. Wybór padł oczywiście na HSC, ze względu na to, że "Dobre bo Polskie", po naszemu udokumentowane i po naszemu wspieraneWitaj na naszym forum.Zrobiłeś dobry wybór,mam na myśli HSC.Moim zdaniem jest to bardzo dobry soft.Ponieważ jest cały czas rozwijany oraz udoskonalany to mogą wystąpić błędy,dlatego każdy nowy użytkownik HSC jest miłe widziany,ponieważ jest szansa,że coś zauważy.Gwarantuję,że codeking zrobi poprawkę i będzie o.k.
Ale ten mój skrypt działa u Ciebie ?
Ponieważ jest cały czas rozwijany oraz udoskonalany to mogą wystąpić błędy,dlatego każdy nowy użytkownik HSC jest miłe widziany,ponieważ jest szansa,że coś zauważy.Gwarantuję,że codeking zrobi poprawkę i będzie o.k.
if ( $zmienna == true )
{
// włączenie lub wyłączenie autopilota
}
if ( $zmienna )
{
// kod do wykonania
}
Reasumując w symulatorach może być dostępne dla tej samej funkcji np.włącz autopilota jedno przypisanie klawiatury.W tym przypadku stosujemy przycisk.Mogą być dostępne dwa przypisania dla On oraz Off.W tym drugim przypadku stosujemy przełącznik.Takie przypadki występują w Falconie.Chciałbym to wyjaśnić na przykładzie,aby nie było nieporozumień.
Problem z włączaniem autopilota jest banalny do rozwiązania. Tak, przycisk generuje dwa zdarzenia, gdy naciśniesz (zmienna ma wartość true) i gdy zwalniasz (wartość false). Rozwiązaniem jest reakcja tylko na wartość true, czyli np.Kod: [Zaznacz]if ( $zmienna == true )
{
// włączenie lub wyłączenie autopilota
}
// jeśli zmienna przycisku mjoy zmieni się na true to wykonaj:
if ( $zmiennaPrzycisk == true )
{
// włączenie lub wyłączenie autopilota <- ale tu jeszcze warunek
if ($zmiennaStatusAutopilota ==0)
{
włącz autopilota // <- jeśli wyłączony to włącz
}
else // <- w przeciwnym wypadku wyłącz
{
wyłącz autopilota
}
}
Udostępniłem aktualizację, proszę uruchomić aktualizację na zakładce Ustawienia. Program zaktualizuje się do wersji 1.1.1.1 a moduł FSData (Input i Output) do wersji 1.0.0.2. W przypadku błędu podczas startu programu i niezaładowania się modułów FSData należy skopiować plik FSData.xml z poprzedniej (działającej) wersji (jest w katalogu /modules) do katalogu /modules nowej wersji.
Aktualizacja odbyła się automatycznie i bez problemów.U mnie także.Ponieważ pc sterujący kokpit nie ma połączenia z internetem to muszę przekopiować aktualizowane pliki z pc połączonego z internetem do tego drugiego.
Aktualizacja objęła plik HomeSimCockpit.exe (główny plik aplikacji) i plik FSData.dll z katalogu /modulesZ tego wynika,że w moim przypadku muszę mieć informację nie tylko,że jest aktualizacja do pobrania,ale także które pliki mam kopiować.Dzięki za wyjaśnienia.
Z tego wynika,że w moim przypadku muszę mieć informację nie tylko,że jest aktualizacja do pobrania,ale także które pliki mam kopiować.Dzięki za wyjaśnienia.
Jeszcze jedna sprawa.Załóżmy,że nie aktualizuję przez dłuższy czas i w między czasie były np.3 aktualizacje dotyczące różnych modułów.Czy aktualizując HSC automatycznie program wie,które moduły ma aktualizować?
Prawdopodobnie porównując wersje modułów można to zrobić prawidłowo.Przepraszam,że pytam ale takie sytuacje mogą mieć miejsce.
Poniżej STATUS są cztery wyświetlacze 01, 02, CH i FL. Tutaj mogą być 7-seg, ale podczas awarii na wszystkich czterech jest wyświetlana informacja PROG FAIL GO BYP. To działa w MFDEX, czyli w SharedMem jest odpowiednia zmiennaEGHI jak można za symulować tą sytuację w AF.
w miejscu DISPRDY jest też wyświetlane AUTO DEGR (nie mam pewności czy działa to w OF).oraz tą.
Poniżej STATUS są cztery wyświetlacze 01, 02, CH i FL. Tutaj mogą być 7-seg, ale podczas awarii na wszystkich czterech jest wyświetlana informacja PROG FAIL GO BYP. To działa w MFDEX, czyli w SharedMem jest odpowiednia zmienna
# FSDataOutput : Błąd (10) podczas wysyłania wartości do symulatora.variable_changed $MJ16_przycisk_006
{
Log( "Hold Heading:" );
Log( $HdgHoldStatus );
if ( $MJ16_przycisk_006 == true )
{
if ( $HdgHoldStatus == 0 )
{
SetWithSignal( $controlHdgHold , 1);
}
else
{
SetWithSignal( $controlHdgHold , 0);
}
}
}// skrypt symulujący panel mcp
// 8.10.2010
// mcd(at)interia.eu
script "FS - cockpit"
{
// zmienne tekstu wyświetlanego na wyświetlaczu
// zmienna przechowująca ustawienie świateł landing lights
variable $i
{
type = int;
}
variable $testowa_line_1
{
module = "TestModule";
id = "out:string_00";
type = string;
direct = out;
}
variable $LandLights
{
module = "FSDataInput";
id = "028C";
type = int;
direct = in;
}
variable $AutopilotMasterStatus
{
module = "FSDataInput";
id = "07BC";
type = int;
direct = in;
}
variable $AutoThrottleStatus
{
module = "FSDataInput";
id = "0810";
type = int;
direct = in;
}
variable $AltHoldStatus
{
module = "FSDataInput";
id = "07D0";
type = int;
direct = in;
}
variable $AltValue
{
module = "FSDataInput";
id = "07D4";
type = int;
direct = in;
}
variable $HdgHoldStatus
{
module = "FSDataInput";
id = "07C8";
type = int;
direct = in;
}
variable $HdgValue
{
module = "FSDataInput";
id = "07CC";
type = int;
direct = in;
}
variable $FDStatus
{
module = "FSDataInput";
id = "2EE0";
type = int;
direct = in;
}
variable $AirSpeedHoldStatus
{
module = "FSDataInput";
id = "07DC";
type = int;
direct = in;
}
// zmienna do której zapisujemy rozkazy dla symulatora
variable $controlAutopilotMaster
{
module = "FSDataOutput";
id = "07BC";
type = int;
direct = out;
}
variable $controlAutoThrottle
{
module = "FSDataOutput";
id = "0810";
type = int;
direct = out;
}
variable $controlAltHold
{
module = "FSDataOutput";
id = "07D0";
type = int;
direct = out;
}
variable $controlAltValue
{
module = "FSDataOutput";
id = "07D4";
type = int;
direct = out;
}
variable $controlHdgHold
{
module = "FSDataOutput";
id = "07C8";
type = int;
direct = out;
}
variable $controlHdgValue
{
module = "FSDataOutput";
id = "07CC";
type = int;
direct = out;
}
variable $controlFD
{
module = "FSDataOutput";
id = "2EE0";
type = int;
direct = out;
}
variable $controlAirSpeedHold
{
module = "FSDataOutput";
id = "07DC";
type = int;
direct = out;
}
// zmienne przycisków i enkoderów joystick'a
// - przycisk reset - 4 przycisk w swmapper czyli 003 tutaj
variable $MJ16_przycisk_003
{
module = "GameControllersInput";
id = "MJ16:przycisk_003";
type = bool;
direct = in;
}
variable_changed $MJ16_przycisk_003
{
if ( $MJ16_przycisk_003 == true )
{
SetWithSignal( $controlAltHold , 0);
SetWithSignal( $controlAutopilotMaster , 0);
SetWithSignal( $controlAutoThrottle , 1);
SetWithSignal( $controlHdgHold , 0);
SetWithSignal( $controlAirSpeedHold , 0);
}
}
variable $MJ16_przycisk_000
{
module = "GameControllersInput";
id = "MJ16:przycisk_000";
type = bool;
direct = in;
}
variable_changed $MJ16_przycisk_000
{
if ( $MJ16_przycisk_000 == true )
{
if ( $AltHoldStatus == 0 )
{
SetWithSignal( $controlAltHold , 1);
}
else
{
SetWithSignal( $controlAltHold , 0);
}
}
}
variable $MJ16_przycisk_001
{
module = "GameControllersInput";
id = "MJ16:przycisk_001";
type = bool;
direct = in;
}
variable_changed $MJ16_przycisk_001
{
if ( $MJ16_przycisk_001 == true )
{
if ( $AutopilotMasterStatus == 0 )
{
SetWithSignal( $controlAutopilotMaster , 1);
}
else
{
SetWithSignal( $controlAutopilotMaster , 0);
}
}
}
//================FLIGHT DIRECTOR
variable $MJ16_przycisk_088
{
module = "GameControllersInput";
id = "MJ16:przycisk_088";
type = bool;
direct = in;
}
variable_changed $MJ16_przycisk_088
{
if ( $MJ16_przycisk_088 == true )
{
if ($FDStatus == 0)
{
SetWithSignal( $controlFD , 1);
}
}
}
variable $MJ16_przycisk_080
{
module = "GameControllersInput";
id = "MJ16:przycisk_080";
type = bool;
direct = in;
}
variable_changed $MJ16_przycisk_080
{
if ( $MJ16_przycisk_080 == true )
{
if ($FDStatus == 1)
{
SetWithSignal( $controlFD , 0);
}
}
}
//================AUTO THROTTLE
variable $MJ16_przycisk_081
{
module = "GameControllersInput";
id = "MJ16:przycisk_081";
type = bool;
direct = in;
}
variable_changed $MJ16_przycisk_081
{
if ( $MJ16_przycisk_081 == true )
{
if ($AutoThrottleStatus == 0)
{
SetWithSignal( $controlAutoThrottle , 1);
}
}
}
variable $MJ16_przycisk_089
{
module = "GameControllersInput";
id = "MJ16:przycisk_089";
type = bool;
direct = in;
}
variable_changed $MJ16_przycisk_089
{
if ( $MJ16_przycisk_089 == true )
{
if ($AutoThrottleStatus == 1)
{
SetWithSignal( $controlAutoThrottle , 0);
}
}
}
//================================HDG HOLD
variable $MJ16_przycisk_006
{
module = "GameControllersInput";
id = "MJ16:przycisk_006";
type = bool;
direct = in;
}
variable_changed $MJ16_przycisk_006
{
Log( "Hold Heading:" );
Log( $HdgHoldStatus );
if ( $MJ16_przycisk_006 == true )
{
if ( $HdgHoldStatus == 0 )
{
SetWithSignal( $controlHdgHold , 1);
}
else
{
SetWithSignal( $controlHdgHold , 0);
}
}
}
//================================AIR SPEED HOLD
variable $MJ16_przycisk_005
{
module = "GameControllersInput";
id = "MJ16:przycisk_005";
type = bool;
direct = in;
}
variable_changed $MJ16_przycisk_005
{
if ( $MJ16_przycisk_005 == true )
{
if ( $AirSpeedHoldStatus == 0 )
{
//if ( $AutoThrottleStatus == 1)
//{
SetWithSignal( $controlAirSpeedHold , 1);
//}
}
else
{
SetWithSignal( $controlAirSpeedHold , 0);
}
}
}
//================================HEADING KNOB - enkoder
//================================ w prawo
variable $MJ16_przycisk_098
{
module = "GameControllersInput";
id = "MJ16:przycisk_098";
type = bool;
direct = in;
}
variable_changed $MJ16_przycisk_098
{
if ( $MJ16_przycisk_098 == true )
{
$testowa_line_1 = ToString( FormatNumber( $HdgValue , "0" ) );
//$i= $HdgValue;
//$i=$i +1;
SetWithSignal( $controlHdgValue , $HdgValue + 182);
}
}
variable $MJ16_przycisk_106
{
module = "GameControllersInput";
id = "MJ16:przycisk_106";
type = bool;
direct = in;
}
variable_changed $MJ16_przycisk_106
{
if ( $MJ16_przycisk_106 == true )
{
$testowa_line_1 = ToString( FormatNumber( $HdgValue , "0" ) );
//$i= $HdgValue;
//$i=$i +1;
SetWithSignal( $controlHdgValue , $HdgValue + 1820);
}
}
//================================ w lewo
variable $MJ16_przycisk_096
{
module = "GameControllersInput";
id = "MJ16:przycisk_096";
type = bool;
direct = in;
}
variable_changed $MJ16_przycisk_096
{
if ( $MJ16_przycisk_096 == true )
{
$testowa_line_1 = ToString( FormatNumber( $HdgValue , "0" ) );
//$i= $HdgValue;
//$i=$i +1;
SetWithSignal( $controlHdgValue , $HdgValue - 182);
}
}
variable $MJ16_przycisk_104
{
module = "GameControllersInput";
id = "MJ16:przycisk_104";
type = bool;
direct = in;
}
variable_changed $MJ16_przycisk_104
{
if ( $MJ16_przycisk_104 == true )
{
$testowa_line_1 = ToString( FormatNumber( $HdgValue , "0" ) );
//$i= $HdgValue;
//$i=$i +1;
SetWithSignal( $controlHdgValue , $HdgValue - 1820);
}
}
//================================ALTITUDE KNOB - enkoder
//================================ w prawo
variable $MJ16_przycisk_102
{
module = "GameControllersInput";
id = "MJ16:przycisk_102";
type = bool;
direct = in;
}
variable_changed $MJ16_przycisk_102
{
if ( $MJ16_przycisk_102 == true )
{
$testowa_line_1 = ToString( FormatNumber( $AltValue , "0" ) );
//$i= $HdgValue;
//$i=$i +1;
SetWithSignal( $controlAltValue , $AltValue + 1997537);
}
}
variable $MJ16_przycisk_110
{
module = "GameControllersInput";
id = "MJ16:przycisk_110";
type = bool;
direct = in;
}
variable_changed $MJ16_przycisk_110
{
if ( $MJ16_przycisk_110 == true )
{
$testowa_line_1 = ToString( FormatNumber( $AltValue , "0" ) );
//$i= $HdgValue;
//$i=$i +1;
SetWithSignal( $controlAltValue , $AltValue + 19975370);
}
}
//================================ w lewo
variable $MJ16_przycisk_100
{
module = "GameControllersInput";
id = "MJ16:przycisk_100";
type = bool;
direct = in;
}
variable_changed $MJ16_przycisk_100
{
if ( $MJ16_przycisk_100 == true )
{
$testowa_line_1 = ToString( FormatNumber( $AltValue , "0" ) );
//$i= $HdgValue;
//$i=$i +1;
SetWithSignal( $controlAltValue , $AltValue - 1997537);
}
}
variable $MJ16_przycisk_108
{
module = "GameControllersInput";
id = "MJ16:przycisk_108";
type = bool;
direct = in;
}
variable_changed $MJ16_przycisk_108
{
if ( $MJ16_przycisk_108 == true )
{
$testowa_line_1 = ToString( FormatNumber( $AltValue , "0" ) );
//$i= $HdgValue;
//$i=$i +1;
SetWithSignal( $controlAltValue , $AltValue - 19975370);
}
}
variable_changed $HdgValue
{
$testowa_line_1 = ToString( FormatNumber( $HdgValue , "0" ) );
}
variable_changed $AltValue
{
$testowa_line_1 = ToString( FormatNumber( $AltValue , "0" ) );
}
}Tak jakby HSC nie potrafił nadpisać zmiennej, która posiada już taką samą wartość. Ale piszę "jakby" bo wydaje mi się, że mój skrypt zabezpiecza przed taką sytuacją.
Więc, dla offsetów, które powodują błąd 10, ustaw parametr "change" w pliku FSData.xml na wartość 0. Rozwiąże to problem.
codeking,
Cytat z Twojej strony- "Lista wszystkich offsetów została wyeksportowana do modułów FSDataInput i FSDataOutput."
Zakładam, że zostało to eksportowane automatycznie, to może być przyczyna. Popraw mnie jeśli się mylę. :)
shopiK, cieszę się, że mogłem pomóc :) Czekam na jakąś prezentację działania tego skryptu, najlepiej z "choinką" :)
To się nazywa Support ! ;)
shopiK,
tak szybkiej pomocy nie daje żadna firma na rynku. ;)
shopiK,
czytałeś manual? TITLE AND MENUS, strona 25.
iFly wydał 737 i obiecują wersję dla kokpitowców.Ja już wydałem pieniądze na pmdg - teraz muszę pokombinować :-)
Osobiście planuje zrobić sobie dodatkowych panel (w pliku panel.cfg), w którym wyświetlę wszystkie wymagane przełączniki. Panel wrzucę na drugi monitor (na pierwszym mam widok VC) i go wyłączę :) A HSC będzie klikał gdzie trzeba.I tak też będę musiał prawdopodobnie zrobić, choć już sprawdziłem, że pmdg ma kilka skrótów klawiaturowych do obsługi niektórych urządzeń. Tylko powiedz mi proszę:
HSC nie ma "mouse macro" a klikanie działa tak, że HSC klika na podanych współrzędnych ekranu, więc panel musi być widoczny. W HSC można włączać makra z FSUIPC więc, jeśli FSUIPC sobie radzi to jest to jakieś rozwiązanie.
(...) Osobiście planuje zrobić sobie dodatkowych panel (w pliku panel.cfg), w którym wyświetlę wszystkie wymagane przełączniki. Panel wrzucę na drugi monitor (na pierwszym mam widok VC) i go wyłączę :) A HSC będzie klikał gdzie trzeba.
Jeśli mamy np. płytkę SkalarkiIO lub OpenCockpits i chcemy wykorzystać ich wejścia w symulatorach innych niż FS, to możemy stworzyć wirtualny joystick i sterować nim stanami z płytek SkalarkiIO lub OC.Czy w moim przypadku karty OC,MJoy,SimOUT oraz Cougar zastosowanie PPJoy daje jakąś korzyść?
$FuelFLOW = Substring( FormatNumber ( $fuelFlow , "00000" ) , 0, 3 ) + "00";
<char chr="E" value="158" />
<char chr="e" value="158" />
<char chr="-" value="2" />
We wszystkim co ma związek z komputerem, wygodniej się posługiwać systemem szesnastkowym (h) albo dwójkowym (b) niż decymalnym vel dziesiątkowym (d).
Przelicz sobie w Windowsowym kalkulatorze (przy wielkości danych Word - nie mylić z pakietem Office):
a) x00h - xB6h = x??h =zamień na dec=> ??d
b) 65 536d / 2d = ??d =zamień na hex=> x??h
Z podpunktu "b)" wnioskuję (teoria nie poparta praktyką), że 180 też powinien podawać jako wartość "dodatnią".
Jeśli po tych ćwiczeniach nie będziesz znał wzoru, to dam następną podpowiedź.
(...)
Chyba się zapędziłem i zdublowałem zapis oznaczający zapis szesnastkowy.
Na matematyce (w zależności od szkoły) zapis wygląda np. 3Ah, w anglojęzycznych dokumentach często jest zapis x3A bądź 0x34, co oznacza to samo, czyli 58d zapisaną w formacie szesnastkowym.
Więc:
a) 00h - B6h = ??h =zamień na dec=> ??d
Zapytam z ciekawości kolejne segmenty g-a mają wartości binarne 2,4,8,16,32,64 oraz 128.Dlaczego akurat te wartości,czy to wynika z HSC?To wynika z wsadu do uC, jak się dobrze przyjrzysz schematowi sterownika LED, cały port B z Attiny2313 steruje segmentami. W uC mogę przypisać jedną liczbę do portu B i w rezultacie ta liczba wysteruje mi wszystkie osiem linii tego portu za jednym zamachem (tylko jedno przypisanie zamiast 8 oddzielnie dla każdego segmentu). Kolejne linie portu B sterują konkretnymi segmentami, stąd właśnie takie wartości. Ale to nie ma dla Ciebie (jako użytkownika) żadnego znaczenia, wszystko załatwia wsad do uC i moduł simOUT, który wie co wysłać do uC :)
Drugie pytanie datyczy dodatkowych znaków wynikających z kombinacji zapalonych segmentów np.-,A,B,C,D,E,F,H i innych.Dopisując te znaki do pliku SimOut.xml można je później użyć w wyświetlaczach np. -12345 lub FF dla kodu ASCI?Nie do końca, nie można wpisać jako znaku ciągu "-12345" lub "FF". Znak to znak, czyli jeden znak :) Nie ma (jeszcze) obsługi konkretnego kodu ASCII, narazie trzeba wpisać dokładnie znak jaki będzie zamieniany na konkretne segmenty.
script "lcd pic737"
{
variable $control { module = "FSDataOutput"; id = "3110"; type = double; direct = out; }
variable $altminus { module = "GameControllersInput"; id = "MJ16:przycisk_096"; type = bool; direct = in; }
variable $altplus { module = "GameControllersInput"; id = "MJ16:przycisk_097"; type = bool; direct = in; }
variable $altminusx10 { module = "GameControllersInput"; id = "MJ16:przycisk_104"; type = bool; direct = in; }
variable $altplusx10 { module = "GameControllersInput"; id = "MJ16:przycisk_105"; type = bool; direct = in; }
variable_changed $altminus
{
if($altminus== true)
{
SetWithSignal( $control , MakeDouble( 0 , 65893 ) );
}
}
variable_changed $altplus
{
if($altplus== true)
{
SetWithSignal( $control , MakeDouble( 0 , 65892 ) );
}
}
variable_changed $altminusx10
{
if($altminusx10== true)
{
SetWithSignal( $control , MakeDouble( 0 , 1016 ) );
}
}
variable_changed $altplusx10
{
if($altplusx10== true)
{
SetWithSignal( $control , MakeDouble( 0 , 1017 ) );
}
}
variable $hdgminus { module = "GameControllersInput"; id = "MJ16:przycisk_098"; type = bool; direct = in; }
variable $hdgplus { module = "GameControllersInput"; id = "MJ16:przycisk_099"; type = bool; direct = in; }
variable $hdgminusx10 { module = "GameControllersInput"; id = "MJ16:przycisk_106"; type = bool; direct = in; }
variable $hdgplusx10 { module = "GameControllersInput"; id = "MJ16:przycisk_107"; type = bool; direct = in; }
variable_changed $hdgminus
{
if($hdgminus== true)
{
SetWithSignal( $control , MakeDouble( 0 , 65880 ) );
}
}
variable_changed $hdgplus
{
if($hdgplus== true)
{
SetWithSignal( $control , MakeDouble( 0 , 65879 ) );
}
}
variable_changed $hdgminusx10
{
if($hdgminusx10== true)
{
SetWithSignal( $control , MakeDouble( 0 , 1024 ) );
}
}
variable_changed $hdgplusx10
{
if($hdgplusx10== true)
{
SetWithSignal( $control , MakeDouble( 0 , 1025 ) );
}
}
variable $LCD11 { module = "LCDOnLPT"; id = "11"; type = string; direct = out; }
variable $LCD12 { module = "LCDOnLPT"; id = "12"; type = string; direct = out; }
variable $fs_alt { module = "FSDataInput"; id = "07D4"; type = int; direct = in; }
variable $fs_hdg { module = "FSDataInput"; id = "07CC"; type = int; direct = in; }
variable $modehdg { type = int;}
variable_changed $fs_alt
{
$LCD11 = " " + FormatNumber( ToDouble( $fs_alt ) / 19975.372160788090854781092647005d , "000" );
}
variable_changed $fs_hdg
{
$modehdg = $fs_hdg / 182.04444444444444444444444444444d ;
}
variable_changed $modehdg
{
if($modehdg >= 0)
{
$LCD12 = FormatNumber( $modehdg , "000" );
}
else
{
$LCD12 = FormatNumber( $modehdg + 360 , "000" );
}
}
}
W uC mogę przypisać jedną liczbę do portu B i w rezultacie ta liczba wysteruje mi wszystkie osiem linii tego portu za jednym zamachemDzięki za wyjaśnienia.Bardzo to sprytnie zrobiłeś.
$led_022_01 =true;
$led_022_02 =true;
$led_022_03 =true;
$led_022_04 =true;
$led_022_05 =true;
[code]
móc zrobić np w pętli:
[code]
for i=0 to 10
$led_022_(i) =true;
next i
script "FalconOF-SimOUT-FullPit"Skrypt zawiera 4 niezalężne skrypty,które mogę uruchamiać i testować niezależnie od siebie.
//jest to skrypt dla Falcona OF
{
include { file = "FalconOF - MP71.hcps"; script = "FalconOF - MP71-panele LG,CMDS,TWAux"; }
include { file = "FalconAF - SimOUT - FuelTOTAL.hcps"; script = "FalconAF - SimOUT - FuelTOTAL"; }
include { file = "Falcon-simOUT-PFL.hcps"; script = "PFL-simOUT-LCD"; }
include { file = "FalconOF - LED - Right side.hcps"; script = "FalconOF - LED - Right side"; }
}
script "FalconAF - SimOUT - FuelTOTAL"U mnie podział na 4 skrypty wynika z elementów,które steruje SimOut.LED-y,7segLED oraz LCD mają swoje skrypty.Przyciski oraz przełączniki podłączone do kontrolera MJoy też mają swój skrypt w HSC.Jak widać możliwości HSC są bardzo duże i załatwiają to co niepotrafi zrobić SVMapper dla większej liczby kontrolerów gier.
{
variable $total { module = "FalconData"; id = "total"; type = double; direct = in; }
variable $FuelTOTAL { module = "simOUT"; id = "FuelTOTAL"; type = string; direct = out; }
variable_changed $total
{
$FuelTOTAL = FormatNumber ($total,"00000");
}
variable $fuelFlow { module = "FalconData"; id = "fuelFlow"; type = double; direct = in; }
variable $FuelFLOW { module = "simOUT"; id = "FuelFLOW"; type = string; direct = out; }
variable_changed $fuelFlow
{
// $FuelFLOW = FormatNumber ($fuelFlow,"00000");
$FuelFLOW = Substring (FormatNumber ($fuelFlow,"00000"),0,3) + "00";
}
}
Można sobie to wyobrazić tak jakby do notatnika wklejać po kolei całe skrypty wskazane rozkazem include, a później tak długi skrypt wczytać do HSC.
Include w HSC działa podobnie jak include w PHP czy C++.
Przy okazji pytanie jak zrobić aby np.załączony skrypt był przewijany (zajmnie mniej miejsca,zapomniałem jak to się robi).
// przykładowa zmienna "diody LED" z simOUT
variable $simOUT_LandingLights
{
module = "simOUT";
id = "COM36_led_021_001";
type = bool;
direct = out;
}
// zmienna przechowująca stan świateł lądowania
variable $LandLights
{
module = "FSDataInput";
id = "028C";
type = int;
direct = in;
}
// zdarzenie zmiany stanu świateł lądowania
variable_changed $LandLights
{
// jeśli zmienna ma wartość zero tzn., że światła lądowania nie są włączone
if ($LandLights == 0)
{
// światła wyłączone
$simOUT_LandingLights = false;
}
else
{
// światła włączone
$simOUT_LandingLights = true;
}
}
Idzie bez problemu. Ale robić te kombinacje to głupota jak można wykorzystać macro mause z fsuipc.Licz się z tym, że macro-FSUIPS ogranicza do chyba ( nie pamiętam) 15 kombinacji, w HSC można to robić bez ograniczeń.
I tu się pojawiają schody.
A po co funkcja "if, else" dla Toggle? To się raczej przypisuje dla przycisków.
Idzie bez problemu. Ale robić te kombinacje to głupota jak można wykorzystać macro mause z fsuipc.
jak w w kokpicie masz na jednej pozycji, a na monitorze w drugiej.Dlatego nie ma sensu tego stosować.Z toggle też może być w momencie włączenia symulatora konflikt,ale wystarczy zmienić pozycję przełącznika w kokpicie tak jak na ekranie i jest o.k.
variable $MJ16_przycisk_046
{
module = "GameControllersInput";
id = "MJ16:przycisk_046";
type = bool;
direct = in;
}
variable_changed$MJ16_przycisk_046
{
if($MJ16_przycisk_046)
{
KeyboardOutput:SendShortcut( "^+1" );
}
else
{
KeyboardOutput:SendShortcut( "^+3" );
}
}
To dlaczego nie zrobić tego tak samo z makrem:variable $efis_TFC
{module = "GameControllersInput";id = "MJ16:przycisk_046";type = bool;direct = in;}
variable_changed$efis_TFC
{
SetWithSignal($fs_MACRO, "B767:OVRD");
}
}
Problem może się pojawić wtedy, gdy np. FS, albo HSC się przyhaczy i nie zanotuje zmiany. Wtedy przełącznik zmieni pozycję np. na off, a FS w wirtualnym kokpicie już nie. Wygląda to nieatrakcyjnie, jak w w kokpicie masz na jednej pozycji, a na monitorze w drugiej. Trzeba by wyłączać HSC, przestawić przełącznik na odpowiednią pozycję i uruchomić ponownie skrypt, coby to zsynchronizować.Co masz na myśli pisząc "przyhaczy" ? Może da się to jakoś rozwiązać - muszę tylko wiedzieć co dokładnie :)
napewno taka opcja odczytywania stanu bezpośrednio z grafiki panelu byłaby przydatna w przypadku np. kontrolek wyświetlających ostrzeżenia (warning/caution panel) itp.
script "landinglights"
{
variable $_028C
{
module = "FSDataInput";
id = "028C";
type = int;
direct = in;
}
variable $in_int_00
{
module = "TestModule";
id = "in:int_00";
type = int;
direct = in;
}
variable $COM8_led_021_004
{
module = "simOUT";
id = "COM8_led_021_004";
type = bool;
direct = out;
}
variable $COM8_led_021_032
{
module = "simOUT";
id = "COM8_led_021_032";
type = bool;
direct = out;
}
/*variable_changed $in_int_00
{if ($in_int_00 == 0)
{$COM8_led_021_004 = true;
$COM8_led_021_032 = false;}
else
{$COM8_led_021_004 = false;
$COM8_led_021_032 = true;}
}*/
variable_changed $_028C
{if ($_028C == 0)
{$COM8_led_021_004 = false;
$COM8_led_021_032 = true;}
else
{$COM8_led_021_004 = true;
$COM8_led_021_032 = false;}
}}
[code]
input_started
{
ForceSignal($_028C);
}
ustawiam w programie że przejście przez punkt wyznaczający 10% na osi przepustnicy ma generować naciśnięcie przycisku "delete".Z ciekawości mam pytanie. Jeśli mam możliwość generowania informacji o zakresach np. przepustnicy to jak tę informację zaprezentować, zapalać LED-y? Co to daje w praktyce, mamy informację pośrednią ma wskaźniku prędkości. Mamy też mechaniczne ustawienia pierścieni na przepustnicy dające "kliknięcie".
script "A-10 throttle"
{
variable $tmp { type = int; value = -1; }
variable $LeftJoy_axis_X { module = "GameControllersInput"; id = "LeftJoy:axis_X"; type = int; direct = in; }
variable_changed $LeftJoy_axis_X
{
if ($LeftJoy_axis_X < 10)
{
if ($tmp <> 0)
{
KeyboardOutput:SendShortcut( "cośtam" );
$tmp = 0;
}
}
else
{
if ($tmp <> 1)
{
KeyboardOutput:SendShortcut( "cośtam innego" );
$tmp = 1;
}
}
}
}
script "FalconAF - MJoy-toggle"
{
variable $MP71_przycisk_003 { module = "GameControllersInput"; id = "MP71:przycisk_003"; type = bool; direct = in; }
variable $MP71_przycisk_004 { module = "GameControllersInput"; id = "MP71:przycisk_004"; type = bool; direct = in; }
variable_changed $MP71_przycisk_003
//Master Arm On
{
if ( $MP71_przycisk_003 )
{
KeyboardOutput : SendShortcut ( " +m ");
}
else
{
KeyboardOutput : SendShortcut ( " ^m ");
}
}
variable_changed $MP71_przycisk_004
//Master Arm Sim
{
if ( $MP71_przycisk_004)
{
KeyboardOutput : SendShortcut ( " %m ");
}
else
{
KeyboardOutput : SendShortcut ( " ^m ");
}
}
}
script "FalconAF - MJoy-toggle-push"
{
variable $MP71_przycisk_003 { module = "GameControllersInput"; id = "MP71:przycisk_003"; type = bool; direct = in; }
variable $MP71_przycisk_004 { module = "GameControllersInput"; id = "MP71:przycisk_004"; type = bool; direct = in; }
variable_changed $MP71_przycisk_003
//Master Arm On
{
if ( $MP71_przycisk_003 )
{
KeyboardOutput : SendShortcut ( " +m ");
}
else
{
KeyboardOutput : SendShortcut ( " ^m ");
}
}
variable_changed $MP71_przycisk_004
//Freeze
{
if ( $MP71_przycisk_004)
{
KeyboardOutput : SendShortcut ( " +p ");
}
else
{
KeyboardOutput : SendShortcut ( " +p ");
}
}
}
variable_changed $MP71_przycisk_004
//Freeze
{
if ( $MP71_przycisk_004)
{
KeyboardOutput : SendShortcut ( " +p ");
}
else
{
KeyboardOutput : SendShortcut ( " +p ");
}
}
}
variable_changed $MP71_przycisk_004
//Freeze
{
KeyboardOutput : SendShortcut ( " +p ");
}
}
1.W tym miejscu pytanie. Może to zjawisko jest związane z programem MJoya?
2.Kolejne pytanie jest powiązane z 1). Jeśli będziemy realizować programowanie klawiszy (funkcje symulatora) przy pomocy 2 programów SVMapper oraz HSC to pozycje mapy, które realizuje HSC powinny być puste w SVMapper? Taką sytuację będzie miał Flanker.
3.Próbowalem testować powyższy przykład przy pomocy 2 funkcji : SendKeysDown (...) oraz SendKeysUp (...), ale bez powodzenia. Czy jest to związane z tym, że np. funkcja SendKeysDown (...) działa w ten sposób, że zbiór klawiszy jest wysyłany cały czas do PC?
Jeśli tak to nie wiadomo jak na to zareaguje symulator. Tutaj nasuwa się kolejne pytanie dla jakich funkcji symulatora stosować powyższe funkcje HSC?
variable_changed $MP71_przycisk_004
//Freeze
{
KeyboardOutput : SendShortcut ( " +p ");
}
}Czy celowo nie wprowadzileś warunku IF. Tak jak opisałem w ostatnim post ten uproszczony kod ale z if bez else wyłącza funkcję "freez" po powtórnym przełączeniu. Czy jest to prawidłowe działanie?variable_changed $MP71_przycisk_004
//Freeze
{
KeyboardOutput : SendShortcut ( " +p ");
}
Nie analizowałem enkoderów, ponieważ w konfiguracji MJoya w HSC nie ma takiej opcji. Można do konfigurowania enkoderów zastosować SVMapper a do pozostałych funkcji HSC.
Funkcja SendKeysDown(...) naciska klawisze i nie zwalnia ich, czyli tak jakbyś nacisnął jakiś klawisz i cały czas trzymał. Funkcja SendKeysUp(...) zwalnia klawisze (puszcza).
script "hat"
{
variable $hat { module = "GameControllersInput"; id = "Logitech:hat_000"; type = int; direct = in; }
variable_changed $hat
{
if ($hat == 9000)
{
KeyboardOutput:SendKeys("dziala");
}
}
}Starting script 'hat'...
Script thread started...
Error ocurred during executing script 'hat'.
HomeSimCockpit.Parser.CheckingScriptException: Variable of ID 'Logitech:hat_000' not found in module 'GameControllersInput'.
at HomeSimCockpit.Main.ProcessingThread(Object p)
Script 'hat' stopped.
Przy wpisywaniu surowego kodu proponuję użyć tagu: [c o d e] i [/ c o d e] naturalnie bez spacji.
Pod tym linkiem są przykłady skryptów.
http://angus.foxnet.pl/fs/blog/
W tym wątku są prawdopodobnie też przykłady Zajca dla FSX. Było to robione dosyć dawno, dlatego najlepiej zapytać autora Codeking.
Sorry - poprawię się :-[
2403.87 Req: 041261 READ Offset: 281C Bytes: 004 value: 00 00 00 00
2403.99 Req: 041262 READ Offset: 281C Bytes: 004 value: 00 00 00 00
2404.09 Req: 041263 READ Offset: 281C Bytes: 004 value: 00 00 00 00
2404.18 Req: 041264 READ Offset: 281C Bytes: 004 value: 00 00 00 00
2404.28 Req: 041265 READ Offset: 281C Bytes: 004 value: 00 00 00 00
2404.30 Req: 041266 READ Offset: 337E Bytes: 002 value: 22 81
2404.30 Req: 041266 WRITE Offset: 3520 Bytes: 002 value: 23 81
2404.35 Req: 041267 READ Offset: 337E Bytes: 002 value: 24 81
2404.38 Req: 041268 READ Offset: 281C Bytes: 004 value: 00 00 00 00
2404.47 Req: 041269 READ Offset: 281C Bytes: 004 value: 00 00 00 00
2404.59 Req: 041270 READ Offset: 281C Bytes: 004 value: 00 00 00 00
2404.69 Req: 041271 READ Offset: 281C Bytes: 004 value: 00 00 00 00
2404.78 Req: 041272 READ Offset: 281C Bytes: 004 value: 00 00 00 00
2404.81 Req: 041273 READ Offset: 337E Bytes: 002 value: 37 81
2404.81 Req: 041273 WRITE Offset: 3520 Bytes: 002 value: 23 81
2404.85 Req: 041274 READ Offset: 337E Bytes: 002 value: 39 81
2404.88 Req: 041275 READ Offset: 281C Bytes: 004 value: 00 00 00 00
2404.98 Req: 041276 READ Offset: 281C Bytes: 004 value: 00 00 00 00
2405.07 Req: 041277 READ Offset: 281C Bytes: 004 value: 00 00 00 00
2405.19 Req: 041278 READ Offset: 281C Bytes: 004 value: 00 00 00 00
2405.29 Req: 041279 READ Offset: 281C Bytes: 004 value: 00 00 00 00
2405.31 Req: 041280 READ Offset: 337E Bytes: 002 value: 4C 81
2405.31 Req: 041280 WRITE Offset: 3520 Bytes: 002 value: 23 81
2405.36 Req: 041281 READ Offset: 337E Bytes: 002 value: 4E 81
2405.38 Req: 041282 READ Offset: 281C Bytes: 004 value: 00 00 00 00
2405.48 Req: 041283 READ Offset: 281C Bytes: 004 value: 00 00 00 00
2405.57 Req: 041284 READ Offset: 281C Bytes: 004 value: 00 00 00 00
2405.67 Req: 041285 READ Offset: 281C Bytes: 004 value: 00 00 00 00
2405.79 Req: 041286 READ Offset: 281C Bytes: 004 value: 00 00 00 00
2405.81 Req: 041287 READ Offset: 337E Bytes: 002 value: 61 81
2405.81 Req: 041287 WRITE Offset: 3520 Bytes: 002 value: 23 81
2405.86 Req: 041288 READ Offset: 337E Bytes: 002 value: 63 81
2405.88 Req: 041289 READ Offset: 281C Bytes: 004 value: 00 00 00 00
2405.98 Req: 041290 READ Offset: 281C Bytes: 004 value: 00 00 00 00
2406.07 Req: 041291 READ Offset: 281C Bytes: 004 value: 00 00 00 00
2406.19 Req: 041292 READ Offset: 281C Bytes: 004 value: 00 00 00 00
2406.29 Req: 041293 READ Offset: 281C Bytes: 004 value: 00 00 00 00
2406.31 Req: 041294 READ Offset: 337E Bytes: 002 value: 76 81
2406.31 Req: 041294 WRITE Offset: 3520 Bytes: 002 value: 23 81
2406.36 Req: 041295 READ Offset: 337E Bytes: 002 value: 78 81
2406.38 Req: 041296 READ Offset: 281C Bytes: 004 value: 00 00 00 00
2406.48 Req: 041297 READ Offset: 281C Bytes: 004 value: 00 00 00 00
2406.57 Req: 041298 READ Offset: 281C Bytes: 004 value: 00 00 00 00
2406.67 Req: 041299 READ Offset: 281C Bytes: 004 value: 00 00 00 00
2406.81 Req: 041300 READ Offset: 337E Bytes: 002 value: 8A 81
2406.81 Req: 041300 WRITE Offset: 3520 Bytes: 002 value: 23 81
2406.86 Req: 041301 READ Offset: 337E Bytes: 002 value: 8D 81
2407.31 Req: 041302 READ Offset: 337E Bytes: 002 value: 9F 81
2407.31 Req: 041302 WRITE Offset: 3520 Bytes: 002 value: 23 81
2407.36 Req: 041303 READ Offset: 337E Bytes: 002 value: A2 81
2407.79 Req: 041304 READ Offset: 337E Bytes: 002 value: B4 81
2407.79 Req: 041304 WRITE Offset: 3520 Bytes: 002 value: 23 81
2407.86 Req: 041305 READ Offset: 337E Bytes: 002 value: B7 81
2408.30 Req: 041306 READ Offset: 337E Bytes: 002 value: C9 81
2408.30 Req: 041306 WRITE Offset: 3520 Bytes: 002 value: 23 81
2408.37 Req: 041307 READ Offset: 337E Bytes: 002 value: CC 81
2408.80 Req: 041308 READ Offset: 337E Bytes: 002 value: DE 81
2408.80 Req: 041308 WRITE Offset: 3520 Bytes: 002 value: 23 81
2408.87 Req: 041309 READ Offset: 337E Bytes: 002 value: E1 81
2409.31 Req: 041310 READ Offset: 337E Bytes: 002 value: F3 81
// skrypt testowy
script "Test LT script 1"
{
variable $batin
{
module = "FSDataInput";
id = "281C";
type = int;
direct = in;
}
variable $batout
{
module = "simOUT";
id = "COM14_led_040_038";
type = bool;
direct = out;
}
variable_changed $batout
{
if ($batin == 0)
{
$batout = false;
}
else
{
$batout = true;
}
}
}
script "FalconOF - LED - Right side"
{
variable $lightBits { module = "FalconData"; id = "lightBits"; type = int; direct = in; }
variable $lightBits2 { module = "FalconData"; id = "lightBits2"; type = int; direct = in; }
// diody na płytce SimOUT
variable $led_001_001 { module = "simOUT"; id = "led_001_001"; type = bool; direct = out; }
variable $led_001_002 { module = "simOUT"; id = "led_001_002"; type = bool; direct = out; }
variable $led_001_003 { module = "simOUT"; id = "led_001_003"; type = bool; direct = out; }
variable $led_001_004 { module = "simOUT"; id = "led_001_004"; type = bool; direct = out; }
variable $led_001_005 { module = "simOUT"; id = "led_001_005"; type = bool; direct = out; }
variable $led_001_006 { module = "simOUT"; id = "led_001_006"; type = bool; direct = out; }
variable $led_001_007 { module = "simOUT"; id = "led_001_007"; type = bool; direct = out; }
variable $led_001_008 { module = "simOUT"; id = "led_001_008"; type = bool; direct = out; }
variable $led_001_009 { module = "simOUT"; id = "led_001_009"; type = bool; direct = out; }
variable $led_001_010 { module = "simOUT"; id = "led_001_010"; type = bool; direct = out; }
variable $led_001_011 { module = "simOUT"; id = "led_001_011"; type = bool; direct = out; }
variable $led_001_012 { module = "simOUT"; id = "led_001_012"; type = bool; direct = out; }
variable $led_001_013 { module = "simOUT"; id = "led_001_013"; type = bool; direct = out; }
variable $led_001_014 { module = "simOUT"; id = "led_001_014"; type = bool; direct = out; }
variable $led_001_015 { module = "simOUT"; id = "led_001_015"; type = bool; direct = out; }
variable $led_001_016 { module = "simOUT"; id = "led_001_016"; type = bool; direct = out; }
variable $led_001_017 { module = "simOUT"; id = "led_001_017"; type = bool; direct = out; }
variable $led_001_018 { module = "simOUT"; id = "led_001_018"; type = bool; direct = out; }
variable $led_001_019 { module = "simOUT"; id = "led_001_019"; type = bool; direct = out; }
variable $led_001_020 { module = "simOUT"; id = "led_001_020"; type = bool; direct = out; }
variable $led_001_021 { module = "simOUT"; id = "led_001_021"; type = bool; direct = out; }
variable $led_001_022 { module = "simOUT"; id = "led_001_022"; type = bool; direct = out; }
variable $led_001_023 { module = "simOUT"; id = "led_001_023"; type = bool; direct = out; }
variable $led_001_024 { module = "simOUT"; id = "led_001_024"; type = bool; direct = out; }
variable $led_001_025 { module = "simOUT"; id = "led_001_025"; type = bool; direct = out; }
variable $led_001_026 { module = "simOUT"; id = "led_001_026"; type = bool; direct = out; }
variable $led_001_027 { module = "simOUT"; id = "led_001_027"; type = bool; direct = out; }
variable $led_001_028 { module = "simOUT"; id = "led_001_028"; type = bool; direct = out; }
variable $led_001_029 { module = "simOUT"; id = "led_001_029"; type = bool; direct = out; }
variable $led_001_030 { module = "simOUT"; id = "led_001_030"; type = bool; direct = out; }
variable $led_001_031 { module = "simOUT"; id = "led_001_031"; type = bool; direct = out; }
variable $led_001_032 { module = "simOUT"; id = "led_001_032"; type = bool; direct = out; }
variable $led_001_033 { module = "simOUT"; id = "led_001_033"; type = bool; direct = out; }
variable $led_001_034 { module = "simOUT"; id = "led_001_034"; type = bool; direct = out; }
// zdarzenia zmian stanu alarmów w Falcon
// w pliku SharedMemHeader.cs są opisane w definicji "public enum LightBits : int"
// w pliku SharedMemHeader.cs są opisane w definicji "public enum LightBits2 : int"
variable_changed $lightBits
{
//TF-Fail=0x2
$led_001_008 = GetBitState( $lightBits , 1 );
//LFCSFAULT=0x40000
$led_001_009 = GetBitState( $lightBits , 18 );
//ENGINEFAULT=0x100000
$led_001_017 = GetBitState( $lightBits , 20 );
//OVERHEAT=0x200000
$led_001_021 = GetBitState( $lightBits , 21 );
//RADARALT=0x1000000
$led_001_026 = GetBitState( $lightBits , 24 );
//IFF=0x2000000
$led_001_027 = GetBitState( $lightBits , 25 );
//T_L_CFG=0x800
$led_001_007 = GetBitState( $lightBits , 11 );
//NWSFAIL=0x10000000
$led_001_030 = GetBitState( $lightBits , 28 );
//HOOK=0x8000000
$led_001_032 = GetBitState( $lightBits , 27 );
//CABINPRESS=0x20000000
$led_001_034 = GetBitState( $lightBits , 29 );
}
variable_changed $lightBits2
{
//HANDOFF=0x1
$led_001_001 = GetBitState( $lightBits2 , 0 );
//PRIMODE=0x4
$led_001_002 = GetBitState( $lightBits2 , 2 );
//TGTSEP-0x20
$led_001_003 = GetBitState( $lightBits2 , 5 );
//LAUNCH=0x2
$led_001_004 = GetBitState( $lightBits2 , 1 );
//UNKNOWN=0x10
$led_001_006 = GetBitState( $lightBits2 , 4 );
//NAVAL=0x8
$led_001_007 = GetBitState( $lightBits2 , 3 );
//ELEC SYS=0x400
$led_001_010 = GetBitState( $lightBits2 , 10 );
//PROBEHEAT=0x1000000
$led_001_011 = GetBitState( $lightBits2 , 24 );
//FWDFUELLOW=0x400000
$led_001_015 = GetBitState( $lightBits2 , 22 );
//AFTFUELLOW=0x8000
$led_001_016 = GetBitState( $lightBits2 , 19 );
//SEC=0x400000
$led_001_018 = GetBitState( $lightBits2 , 22 );
//FUELOILHOT=0x8000000
$led_001_019 = GetBitState( $lightBits2 , 27 );
//BUC=0x4000000
$led_001_023 = GetBitState( $lightBits2 , 26 );
//SEATNOTARMET=0x2000000
$led_001_029 = GetBitState( $lightBits2 , 25 );
//OXYLOW=0x800000
$led_001_033 = GetBitState( $lightBits2 , 23 );
}
}
W innej platformie SIOC też są pisane podobne skrypty dla FSX. Tam też budują kokpity dla maszyn takich jak Twoja, można zapytac na forum OpenCockipits o ten problem. Pod tym linkiem są skrypty dla FSX ale w SIOC http://www.lekseecon.nl/howto.html#ROTPush.Wszystko na spokojnie -Tu masz rację. Mnie to zajęło sporo czasu aby opanować SimOUT oraz HSC. Jak się później przekonasz HSC jest potężnym narzędziem, gdzie sterowanie SimOUT jest tylko jedną z możliwości. Możesz np. napisać skrypt pod MJoya i zrezygnować z SVMapper. Ja tak musiałem zrobić ze względu na ograniczenia tego programu. Podobnie z innymi płytkami nawet z OC. W twoim przypadku płyty z OpenCockpits oraz SIOC idealnie pasują do FSX czy X-plane, ale Zajac zrobił sterowanie FSX na platformie HSC oraz SimOUT i to działa. U mnie HSC działa bez problemów od wielu miesięcy. Oprócz LED steruje także 7segLED oraz LCD 2x16. Jeśli masz w pracy programistów to nie powinno być problemów.
// skrypt testowy
script "Test LT script 1"
{
//zmienne wejściowe
variable $batin {module = "FSDataInput";id = "281C";type = int; direct = in;}
//zmienne wyjściowe
variable $batout {module = "simOUT";id = "COM14_led_040_040";type = bool;direct = out;}
//zapalenie się diody - akcja
variable_changed $batin
{ $batout = GetBitState( $batin , 01000000 ); }
}
Nie sądziłem, że ktoś jeszcze korzysta z HSC czy simOUT/IN itp.HSC jest w niektórych sytuacjach niezbędny. SimOUT/IN podobnie jak sterowniki Damosa stają się już standardem.
// skrypt testowy
script "but_ap"
{
variable $AutopilotMasterStatus
{
module = "FSDataInput";
id = "07BC";
type = int;
direct = in;
}
variable $przycisk_056
{
module = "GameControllersInput";
id = "9-osiowy 112-przyciskowy urządzenie z przełącznikiem ustawień:przycisk_056";
type = bool;
direct = in;
}
variable $controlAutopilotMaster
{
module = "FSDataOutput";
id = "07BC";
type = int;
direct = out;
}
variable_changed $przycisk_056
{
if ( $przycisk_056 == true )
{
if ( $AutopilotMasterStatus == 0 )
{
SetWithSignal( $controlAutopilotMaster , 1);
}
else
{
SetWithSignal( $controlAutopilotMaster , 0);
}
}
}
}
// zmienna do której zapisujemy rozkazy dla symulatora
variable $control
{
module = "FSDataOutput";
id = "3110";
type = double;
direct = out;
}
script "hdg"
{
// wczytanie wartości hdg
variable $HdgValue
{
module = "FSDataInput";
id = "07CC";
type = int;
direct = in;
function = "HdgStatus";
}
// wczytanie grupy wyświetlaczy
variable $hdg
{
module = "simOUT";
id = "hdg";
type = string;
direct = out;
}
// wyświetlenie??????????????????????
function HdgStatus($variable)
{
$hdg = StringReplace(FormatNumber(FSDataInput:BCDFrequencyToDouble($HdgValue), "000"))
}
}
$hdg = FormatNumber(FSDataInput:BCDFrequencyToDouble($HdgValue), "000");
//Course_Right...
variable $_6522
{
module = "FSDataInput";
id = "6522";
type = int;
direct = in;
}
variable $_021
{
module = "simOUT";
id = "021";
type = string;
direct = out;
}
variable_changed $_6522
{
if ( $_6522 <= 9 )
{
Log( "CRS_RIGHT: 00" + ToString( $_6522 ));
$_021 = "00" + ToString( $_6522 ));
}
if ( $_6522 >= 10 )
{
if ( $_6522 <= 99)
{
Log( "CRS_RIGHT: 0" + ToString( $_6522 ));
$_021 = "0" + ToString( $_6522 ));
}
}
if ( $_6522 >= 100 )
{
Log( "CRS_RIGHT: "+ ToString( $_6522 ));
$_021 = ToString( $_6522 ));
}
}
//Speed...
//anun_IAS_Blank....................................
variable $_6528
{
module = "FSDataInput";
id = "6528";
type = int;
direct = in;
}
variable_changed $_6528
{
if ( $_6528 == 1 )
{
Log( "anun_IAS_Blank:ON " );
}
if ( $_6528 == 0 )
{
Log( "anun_IAS_Blank:OFF " );
}
}
//anun_Overspeed_Blank..............................
variable $_6529
{
module = "FSDataInput";
id = "6529";
type = int;
direct = in;
}
variable_changed $_6529
{
ForceSignal($_6524);
if ( $_6529 == 1 )
{
Log( "anun_OverSpeed_BLANK:ON " );
}
if ( $_6529 == 0 )
{
Log( "anun_OverSpeed_BLANK:OFF " );
}
}
//anun_Under_Overspeed_Blank.........................
variable $_652A
{
module = "FSDataInput";
id = "652A";
type = int;
direct = in;
}
variable_changed $_652A
{
ForceSignal($_6524);
if ( $_652A == 1 )
{
Log( "anun_Under_OverSpped:ON " );
}
if ( $_652A == 0 )
{
Log( "anun_Under_OverSpped:OFF " );
}
}
variable $_6524
{
module = "FSDataInput";
id = "6524";
type = int;
direct = in;
}
variable $_025
{
module = "simOUT";
id = "025";
type = string;
direct = out;
}
variable $COM2_7led_025_001_int
{
module = "simOUT";
id = "COM2_7led_025_001_int";
type = int;
direct = out;
}
variable_changed $_6524
{
if ( $_6524 <= 1124073472 )
{
if ( $_652A == 1 )
{
Log( "Speed: A " + ToString( $_6524/0131072--8448 ));
$_025 = " "+ ToString( $_6524/0131072--8448 ));
$COM2_7led_025_001_int = 238;
}
else
{
Log( "Speed: " + ToString( $_6524/0131072--8448 ));
$_025 = " "+ ToString( $_6524/0131072--8448 ));
$COM2_7led_025_001_int = 0;
}
}
if ( $_6524 > 1124073472 )
{
if ( $_6524 < 1132494830 )
{
if ( $_652A == 1 )
{
Log( "Speed: A " + ToString( $_6524/065536--17024));
$_025 = " "+ToString($_6524/065536--17024));
$COM2_7led_025_001_int = 238;
}
}
if ( $_6529 == 1 )
{
if ( $_6524 < 1132494840 )
{
if ( $_6524 > 1132494830 )
{
Log( "Speed: 8 " + ToString( $_6524/065536--17024));
$_025 = "8 "+ToString($_6524/065536--17024));
}
}
}
if ( $_6529 == 0 )
{
if ( $_652A == 0 )
{
if ( $_6524 < 1132494840 )
{
$COM2_7led_025_001_int = 0;
Log( "Speed: " + ToString( $_6524/065536--17024));
$_025 = " "+ToString($_6524/065536--17024));
}
}
}
}
if ( $_6524 > 1132494840 )
{
if ( $_6529 == 1 )
{
Log( "Speed: 8 " + ToString( $_6524/032768--34304 ));
$_025 = "8 "+ ToString( $_6524/032768--34304 ));
}
if ( $_6529 == 0 )
{
Log( "Speed: " + ToString( $_6524/032768--34304 ));
$_025 = " "+ ToString( $_6524/032768--34304 ));
}
}
}
variable $_6528
{
module = "FSDataInput";
id = "6528";
type = int;
direct = in;
}
Timer:StartTimer( "timer_00" );
Timer:StopTimer( "timer_00" );
input_started
{
Log( "Ustawienie licznika, nieskończenie wiele wywołań co 250ms" );
Timer:SetTimer( "timer_00", 250, 0 );
}
variable_changed $timer_00
{
// warto na początku sprawdzić wartość ofsetu, który decyduje o tym czy coś ma mrugać, jeśli nie ma mrugać to od razu return
// sprawdzić czy dioda jest zapalona, jeśli tak to zgasić, jeśli nie to zapalić
}
Do czego służy złącze EXTENSION PORT na simoutXL ? Podłącza się do niego analogi ?O ile mnie pamięć nie myli to można podłączać kolejne moduły simOUT. Nie mam schematu, ale z tego co pamiętam to jeden podstawowy simOUT powinien mieć interfejs RS232 do komunikacji z pc a pozostałe mogą być połączone przez te złącza 3 pin Extension port co daje oszczędność portów RS232 i przejściówek na USB.
Powiedź mi, czy DMkeys16 jest widziany w konsoli HSC w podobny sposób jak mjoy16 ?DMKeys8 nie jest widziany w HSC. Programowanie Damosa jest bardzo proste. Nie piszesz skryptów, jest to coś podobnego do SVMapper. Możesz podłączyć do pc kilka DMKeys8, ustawiasz w programie konfiguracyjnym IP oraz inne parametry. Na stronie Damosa jest to opisane. Można zmienić w MJoy vendor oraz ID, ale u mnie po jakimś czasie pc meldował inną nazwę i trzeba było od nowa ustawiać, dlatego wymieniłem swoje MJoy. Gdy pc widział inna nazwę niż MJoy to skypt dla tego MJoy nie dział w HSC co jest logiczne.
Inaczej mówiąc, czy będę zmuszony do korzystania oprogramowania Damosa albo czy będę mógł programować wejścia w HSC w podobny sposób jak w wypadku mjoy16?
Czy można podłączyć więcej niż 1 DMkeys16 pod jeden komputer bez zmieniania jego id ?
21-40 na jednym porcie COM? Ważne jest tylko aby na jednym porcie COM nie powtarzały się ID.