72AG_terror Опубликовано: 27 сентября 2014 Опубликовано: 27 сентября 2014 А что если стоя в гамаке и в противогазе? .... Довольно остроумно скрипт написан, с интересом почитал, спасибо!
NobbyNobbs Опубликовано: 27 сентября 2014 Автор Опубликовано: 27 сентября 2014 Спасибо, Nobby. Всё работает... Пугает только объем скрипта.... для 6 кнопок набежит Хотя вешать на одну кнопку и single и double и long - это через чур. Думаю придется обойтись только single (на отпускание) и long Если честно, то это я написал типа "в порядке бреда, ну, то есть от фонаря, как говорится, из-под волос" (из Довлатова). Мне почему-то кажется, что аналогичную логику должно быть можно сделать через готовые таймеры (OnDelay, OffDelay и т.д.), должно получиться покороче. Но только вот тогда придется сперва думать, а потом писать Довольно остроумно скрипт написан, с интересом почитал, спасибо! 1
[IB]Zulu Опубликовано: 27 сентября 2014 Опубликовано: 27 сентября 2014 (изменено) 2 Nobby, Спасибо за идеи. Красивый код получился! Может чуть излишен, (с таймерами правильно заметил короче будет) но зато в текущем представлении замечательно читается и понятен. Изменено 27 сентября 2014 пользователем [I.B.]Zulu
AndreyYakobzon Опубликовано: 28 сентября 2014 Опубликовано: 28 сентября 2014 Поясните - подруливание это триммирование толкько средствами джойстика?
[IB]Zulu Опубликовано: 28 сентября 2014 Опубликовано: 28 сентября 2014 (изменено) Гы, гы. Тем, кто заглядывает, но скроллить тему лень. Облегчение понимания работы триггер-таймеров тут. Очень хорошее подспорье для смыслового описания данного в Help'е Изменено 28 сентября 2014 пользователем [I.B.]Zulu
=59=Moroka Опубликовано: 28 сентября 2014 Опубликовано: 28 сентября 2014 (изменено) Поясните - подруливание это триммирование толкько средствами джойстика? Нет. Триммирование от Terrora здесь. А это просто сдвиг оси на одну или другую фиксированную величину по нажатию хатки. Чес говоря не понял как это использовать... Изменено 28 сентября 2014 пользователем =J13=Moroka
[IB]Zulu Опубликовано: 28 сентября 2014 Опубликовано: 28 сентября 2014 (изменено) Спасибо, Nobby. Всё работает... Пугает только объем скрипта.... для 6 кнопок набежит Хотя вешать на одну кнопку и single и double и long - это через чур. Думаю придется обойтись только single (на отпускание) и long... Не так страшно, на самом деле. Выделяй отдельные функциональные блоки каким либо обрамлением через комментарии. Можно применить прицип глав и параграфов // ********************* ||| ОБРАБОТКА ДВОЙНЫХ ТРОЙНЫХ НАЖАТИЙ ||| **************************** // ------------------------------------- ***** Для кнопки JS1. B1 ********----------------- SEQUENCE IF (TRUE).... ......... ENDIF ENDSEQUENCE // ----------------------------------------------------------------------------------------------------- // // ------------------------------------- ***** Для кнопки JS1. B2 ********----------------- SEQUENCE IF (TRUE).... ......... ENDIF ENDSEQUENCE // ----------------------------------------------------------------------------------------------------- Изменено 28 сентября 2014 пользователем [I.B.]Zulu
[IB]Zulu Опубликовано: 28 сентября 2014 Опубликовано: 28 сентября 2014 Вот изюминка скрипта Nooby для дифференциациии одиночных, двойных и длинных нажатий в том, что он придумал как отделить одиночное от двойного. Т.е. концептуально сделать двойной клик самостоятельным, а не состоящим из двух одиночных!!! (Писать то мы все можем, а вот придумать, что писать, соображаем не всегда ) Правда там появляется задержка для срабатывания одиночного нажатия, но ИМХО, для большинства применений это не критично. Думаю только кнопки открытия огня и сброса бомб нельзя подвергать такой обработке. А все остальные кнопки можно - механизация там всякая, прицеливание, оглядывание и т.д...
NobbyNobbs Опубликовано: 28 сентября 2014 Автор Опубликовано: 28 сентября 2014 Гы, гы. Тем, кто заглядывает, но скроллить тему лень. Облегчение понимания работы триггер-таймеров тут. Очень хорошее подспорье для смыслового описания данного в Help'е Кстати, как раз втыкал в эти графики и думал, что переписать вчерашний скрипт будет несложно, но увы, нашел там одну неточность и теперь мне кажется, что малой кровью обойтись вряд ли удастся. На самом деле по OffDelay логическое устройство сразу становится True и продолжает быть таким T времени после отпускания кнопки. И картинка с период неполная. Там не показано, что D1 будет true T времени вне зависимости от того, что у него на входе. должно быть как-то вот так
[IB]Zulu Опубликовано: 28 сентября 2014 Опубликовано: 28 сентября 2014 Да.. Период в общем то без ошибки показан, просто не указывалось, что его длительность не изменится как долго кнопку не держать. А вот OFFDELAY - замечание серьезное. И если действительно так, то схемку мне надо перерисовать....
[IB]Zulu Опубликовано: 28 сентября 2014 Опубликовано: 28 сентября 2014 А тебя что именно измененный OFFDELAY смущает? Маскируй его условием на вызвавшую его кнопку и получишь результат как на моей исходной картинке TIMER (OFFDELAY, D1, 20) = JS1.B1 WHILE (D1) - условие будет выполнятся сразу после нажатия JS1.B1 и до момента исхода 20 интервалов после отжатия WHILE(D1 AND NOT JS1.B1) - условие будет выполнятся после отжатия JS1.B1 и до исхода 20 интервалов (как на рисунке)
NobbyNobbs Опубликовано: 28 сентября 2014 Автор Опубликовано: 28 сентября 2014 (изменено) Zulu" post="205767" timestamp="1411899085"]А тебя что именно измененный OFFDELAY смущает? Маскируй его условием на вызвавшую его кнопку и получишь результат как на моей исходной картинке показалось маленько затупил сначала.в общем и целом тут то же самое, но другими словами. %define FirstPush b1 %define SecondPush b2 %define LongPush b3 script sequence wait(js1.b13 and !FirstPush); FirstPush=true; endsequence timer(Period,d2,5)=!js1.b13 and FirstPush;//Фиксируем отпускание кнопки //и ждем второго нажатия ~четверть секунды timer(period,d3, 7)=!js1.b13 and FirstPush; //нужен чтобы отследить продолжительность паузы между нажатиями sequence //если через четверть секунды ничего не произошло wait(d3 and !d2 and FirstPush); //генерируем нажатие и сбрасываем флаг FirstPush=false; cms.b3=true; delay(5); cms.b3=false; endsequence if((d2 and js1.b13) or SecondPush) then //если во время работы d2 нажали кнопку, FirstPush=false; //то распознаем "даблклик" SecondPush=true; cms.b2=js1.b13; endif sequence //тот же фокус с флагом для выхода из условия что и в прошлом скрипте wait(SecondPush and !js1.b13); //(удивлен, но это корректно работает и без строки cms.b2=false o_O ) SecondPush=false; endsequence timer(ondelay,d1,10)=js1.b13; //для длинного нажатия самый обыкновенный таймер if((d1 and !SecondPush) or LongPush)then //отсекаем срабатываение при даблклике с последующим удержанием кнопки cms.b1=js1.b13; LongPush=true; endif if (LongPush and !js1.b13) then LongPush=false; FirstPush=false; endif endScript timers.zip Изменено 28 сентября 2014 пользователем NobbyNobbs 2
[IB]Zulu Опубликовано: 28 сентября 2014 Опубликовано: 28 сентября 2014 Кстати, как раз втыкал в эти графики и думал, что переписать вчерашний скрипт будет несложно, но увы, нашел там одну неточность и теперь мне кажется, что малой кровью обойтись вряд ли удастся. На самом деле по OffDelay логическое устройство сразу становится True и продолжает быть таким T времени после отпускания кнопки. И картинка с период неполная. Там не показано, что D1 будет true T времени вне зависимости от того, что у него на входе. должно быть как-то вот так timers.png Вот диаграммы логики триггер-таймеров с учетом примечания по PEROID и исправления в OFFDELAY 2
NobbyNobbs Опубликовано: 28 сентября 2014 Автор Опубликовано: 28 сентября 2014 Вот диаграммы логики триггер-таймеров с учетом примечания по PEROID и исправления в OFFDELAY CMLogics2.gif спасибо, утащил-распечатал.
[IB]Zulu Опубликовано: 28 сентября 2014 Опубликовано: 28 сентября 2014 (изменено) 2Nobby Пока искал способ убить уже запущенный таймер раньше срока заметил прикольную вещь. Знание её позволит экономить на объявлении переменных типа D (позволит её использовать в разных триггерах без влияния друг на друга). Даже не подозревал об этом. TIMER(PERIOD,D1,10) = JS4.B7; BTN0 = D1; TIMER(PERIOD,D1,40) = JS4.B7; BTN1 = D1; TIMER(PERIOD,D1,80) = JS4.B7; BTN2 = D1; Несмотря на использование одного и того же логического устройства D1 - фактически будет создано три независымх таймер-триггера, которые запустятся одновременно (по JS4.B7), а вот закончат свою работу в разное, строго определенное в теле, время. Гы-Гы, что можно видеть по времени отжатия кнопок BTN0 - BTN2 А убить уже запущенный на определенное время таймер уже видимо никак нельзя.... Очень жаль.. Изменено 28 сентября 2014 пользователем [I.B.]Zulu 1
NobbyNobbs Опубликовано: 29 сентября 2014 Автор Опубликовано: 29 сентября 2014 Несмотря на использование одного и того же логического устройства D1 фактически будет создано три независымх таймер-триггера, которые запустятся одновременно (по JS4.B7), а вот закончат свою работу в разное, строго определенное в теле, время. да уж. то что называется фича )) а чтобы убить toggle(d1) не прокатывает?
beretta5 Опубликовано: 29 сентября 2014 Опубликовано: 29 сентября 2014 Пощу только самую мякоту (без скрипт-ендскрипт и прочих define, должно быть понятно и так) Э парни я ж не программист.Можно весь скрипт с DEFINE.К тому же у меня стоит скрипт триммирования,надо будет их как то совместить.
=59=Moroka Опубликовано: 29 сентября 2014 Опубликовано: 29 сентября 2014 (изменено) Э парни я ж не программист.Можно весь скрипт с DEFINE.К тому же у меня стоит скрипт триммирования,надо будет их как то совместить. %Define J_Stick JS?.A? // Вместо ? - указать № твоего устройства и № его оси, которую хотим "сгладить" %Define C_Stick CMS.A? // Вместо ? - указать № оси CMS устройства, ось которого будет "сглажена" // script if ( [ J_Stick != C_Stick ] ) then if ( [ ( J_Stick + 1 ) > C_Stick ] ) then C_Stick = J_Stick - 1; endif if ( [ ( J_Stick - 1 ) < C_Stick ] ) then C_Stick = J_Stick + 1; endif if ( [ J_Stick == 255 ] ) then C_Stick = 255; endif if ( [ J_Stick == 0 ] ) then C_Stick = 0; endif endif endScript На самом деле скрипт просто задает "мертвую зону" +/-1. Поэтому результат "отстает" от входного значения на единицу... и, собственно поэтому, чтобы получить макс (255) и мин (0) отдельно два блока if внизу... П.С. Сначала Terror , а потом и Nobby научились красиво вставлять в свои посты код... Как это? Научите, то же хочется быть "опрятным" Изменено 29 сентября 2014 пользователем =J13=Moroka
NobbyNobbs Опубликовано: 29 сентября 2014 Автор Опубликовано: 29 сентября 2014 @@=J13=Moroka я у Террора подсмотрел надо код засунуть в блок {code=auto:0} здесь ваш код {/code}, только использовать квадратные скобки. @Zulu'] попробовал поубивать таймеры... тоже не получилось. 1
NobbyNobbs Опубликовано: 29 сентября 2014 Автор Опубликовано: 29 сентября 2014 Нашел маленький косяк в скрипте с таймерами. FirstPush лучше обнулять в предпоследнем условии, то есть при срабатывании длинного нажатия. Если обнулять в последнем, как у меня написано, то при быстром повторном нажатии кнопки срабатывает двойной клик
[IB]Zulu Опубликовано: 29 сентября 2014 Опубликовано: 29 сентября 2014 да уж. то что называется фича )) а чтобы убить toggle(d1) не прокатывает? Неа, будет создан еще один триггер и всего то. D1 походу только нам нужна при письме. В железе видимо после каждой записи создается свой девайс, со своим внутренним id и связями которые действовали на момент последовательного чтения компилятором нашего скрипта и прямого отношения к D1 они не имеют... Нашел маленький косяк в скрипте с таймерами. FirstPush лучше обнулять в предпоследнем условии, то есть при срабатывании длинного нажатия. Если обнулять в последнем, как у меня написано, то при быстром повторном нажатии кнопки срабатывает двойной клик Вот по сходной причине я и хотел научиться убивать уже активыне таймеры
beretta5 Опубликовано: 29 сентября 2014 Опубликовано: 29 сентября 2014 На самом деле скрипт просто задает "мертвую зону" +/-1. Поэтому результат "отстает" от входного значения на единицу... и, собственно поэтому, чтобы получить макс (255) и мин (0) отдельно два блока if внизу... Чё та не получилось у меня Скрипт триммирования я убрал,что бы не мешал пока.Всё равно колбасит кружочек.
beretta5 Опубликовано: 29 сентября 2014 Опубликовано: 29 сентября 2014 Чё та не получилось у меня Скрипт триммирования я убрал,что бы не мешал пока.Всё равно колбасит кружочек. Я так мыслю надо увеличить мёртвую зону.
[IB]Zulu Опубликовано: 29 сентября 2014 Опубликовано: 29 сентября 2014 Чё та не получилось у меня Скрипт триммирования я убрал,что бы не мешал пока.Всё равно колбасит кружочек. Скажи, в какой проге именно смотришь, что колбасит? Какие значения читаются? Мертва зона помогает только в случае нечеткого центрального положения (это к микростику, можно применить например). А вот дрожжание, убрать можно только сглаживанием.
beretta5 Опубликовано: 29 сентября 2014 Опубликовано: 29 сентября 2014 Скажи, в какой проге именно смотришь, что колбасит? Какие значения читаются? Мертва зона помогает только в случае нечеткого центрального положения (это к микростику, можно применить например). А вот дрожжание, убрать можно только сглаживанием. Смотрю в CH control manager.Вот она где собака порылась.Так в центре оси он стоит как вкопанный.А при отклонении больше половины,в некоторых положениях его колбасит.На глаз амплитуда где то 3 единицы.
=59=Moroka Опубликовано: 29 сентября 2014 Опубликовано: 29 сентября 2014 (изменено) Смотрю в CH control manager.Вот она где собака порылась.Так в центре оси он стоит как вкопанный.А при отклонении больше половины,в некоторых положениях его колбасит.На глаз амплитуда где то 3 единицы. попробуй в скрипте вместо единички поставить 2. тогда у тебя при "дрожании" в диапазоне +/- 2 cms дергаться не будет. Мертвая зона в скрипте не только в центре... Она относительно cms оси... cms ось "волочится" за J_Stick как привязанная на веревочке длинной в 1 шаг Если увеличить "длину веревочки" до 2 - то будет на 2 шага отставать... а триммирование на должно мешать! В его тело, вместо оси JS надо подставить ось cms из сглаживания... Изменено 29 сентября 2014 пользователем =J13=Moroka
beretta5 Опубликовано: 29 сентября 2014 Опубликовано: 29 сентября 2014 (изменено) Нет не работает скрипт нет изменений после замены значений Вот он %Define J_Stick JS3.a3 //реальная ось отключена NONE%Define C_Stick CMS.a3 // виртуальная ось в вкладке cms control script if ( [ J_Stick!= C_Stick ] ) thenif ( [ ( J_Stick + 1 ) > C_Stick ] ) thenC_Stick = J_Stick - 1;endifif ( [ ( J_Stick - 1 ) < C_Stick ] ) thenC_Stick = J_Stick + 1;endifif ( [ J_Stick == 255 ] ) thenC_Stick = 255;endifif ( [ J_Stick == 0 ] ) thenC_Stick = 0;endifendif Может что то я не так сделал? Изменено 29 сентября 2014 пользователем beretta5
=59=Moroka Опубликовано: 29 сентября 2014 Опубликовано: 29 сентября 2014 (изменено) Нет не работает скрипт нет изменений после замены значений Вот он ... Может что то я не так сделал? А что значит не работает? Не сглаживает? или вообще не реагирует? Если второе, то у тебя в конце endscript не стоит... или ты cms ось "на вывод" не назначил ...а так всё работает.. у себя проверил именно твой! взял копипастом Изменено 29 сентября 2014 пользователем =J13=Moroka
=59=Moroka Опубликовано: 29 сентября 2014 Опубликовано: 29 сентября 2014 (изменено) 2 beretta5 ... попробовал... просто подставить 2-ку вместо единички - не работает Изменено 29 сентября 2014 пользователем =J13=Moroka
beretta5 Опубликовано: 29 сентября 2014 Опубликовано: 29 сентября 2014 А что значит не работает? Не сглаживает? или вообще не реагирует? Если второе, то у тебя в конце endscript не стоит... или ты cms ось "на вывод" не назначил ...а так всё работает.. у себя проверил именно твой! взял копипастом Стоит в конце endscript,я просто забыл его в посте приписать.Не сглаживает он.Я так понял cms.a3 ось не волочится за js3.a3. В центре ось немного подрагивает а со скриптом стоит как вкопанная.А по сторонам водишь её она дрожит. Так 2-ки ставить вместо всех единичек?
beretta5 Опубликовано: 29 сентября 2014 Опубликовано: 29 сентября 2014 (изменено) У меня сложилось впечатление что скрипт влияет только когда ось в центральном положении он создаёт мертвую зону в центре. Вот к примеру если C_Stick = J_Stick - 1; ....... C_Stick = J_Stick +1 ; то показания в центре 129-127 единиц после возвращения педалей в центр. когда меняю на C_Stick = J_Stick - 2; ..... C_Stick = J_Stick - 2; то показания становятся 130-126 единиц. Причём "железно" и постоянно без каких либо колебаний. Изменено 29 сентября 2014 пользователем beretta5
[IB]Zulu Опубликовано: 29 сентября 2014 Опубликовано: 29 сентября 2014 (изменено) У меня сложилось впечатление что скрипт влияет только когда ось в центральном положении Не, не. Работает четко. У меня подрагивала ось маслорадиатора в пределах 1%. В результате предыдущий РД дрожжал строкой технострима об этом радиаторе. После применения скрипта, ось как вкопанная. Изменено 29 сентября 2014 пользователем [I.B.]Zulu
=59=Moroka Опубликовано: 29 сентября 2014 Опубликовано: 29 сентября 2014 (изменено) Так 2-ки ставить вместо всех единичек? Нет, просто подставить не получится!, НО если чуть изменить скрипт: %Define J_Stick JS1.A3 // здесь свои оси ставь %Define C_Stick CMS.A1 // и здесь свои... %Define mz 10 // сколько здесь поставишь, такой диапазон +/- mz и будет... // script if ( [ J_Stick > C_Stick+(mz-1) ] ) then if ( [ ( J_Stick + 1 ) > C_Stick ] ) then C_Stick = J_Stick - mz; endif endif if ( [ J_Stick < C_Stick-(mz-1) ] ) then if ( [ ( J_Stick - 1 ) < C_Stick ] ) then C_Stick = J_Stick + mz; endif endif if ( [ J_Stick == 255 ] ) then C_Stick = 255; endif if ( [ J_Stick == 0 ] ) then C_Stick = 0; endif endScript ...меняя значение mz от 1 до .... можно регулировать "зону сглаживания" п.с. Проверено... мин нет Изменено 29 сентября 2014 пользователем =J13=Moroka
beretta5 Опубликовано: 29 сентября 2014 Опубликовано: 29 сентября 2014 если чуть изменить скрипт: Уря заработало.Есть,правда небольшая мёртвая зона в центре,но это пустяки.Я выставил %Define mz 4,что бы совсем не дрожало
=59=Moroka Опубликовано: 29 сентября 2014 Опубликовано: 29 сентября 2014 ....Есть,правда небольшая мёртвая зона в центре,но это пустяки.Я выставил %Define mz 4,что бы совсем не дрожало Мертвая зона и есть тот коридор, внутри которого входная дрожь оси джойстика не передается на выход. Вообще этот алгоритм вернее называть не "сглаживание", а "пороговый шумоподавитель" ....
72AG_terror Опубликовано: 29 сентября 2014 Опубликовано: 29 сентября 2014 Вот диаграммы логики триггер-таймеров с учетом примечания по PEROID и исправления в OFFDELAY CMLogics2.gif О, блин! Ой, спасибо, блин, большое! Ой, очень большое, блин, спасибо!! А то у меня регулярно мозги заклинивает на тему того или иного on/offdelay. @@=J13=Moroka я у Террора подсмотрел надо код засунуть в блок {code=auto:0} здесь ваш код {/code}, только использовать квадратные скобки. Точно так. Только я auto:0 не пишу, это форум подставляет. Я просто code /code рисую и всё. Спасибо, парни, что Беретте помогли с этим кусочком, а то я только сейчас увидел. С вами не пропадёшь!
[IB]Zulu Опубликовано: 29 сентября 2014 Опубликовано: 29 сентября 2014 А у кого проблемы были с интеграцией сглаживания в уже работающие скрипты? Принцип следующий. В два этапа: 1) Код сглаживания помещаем в самый верх скрипта. И производим предварительное сглаживание физической оси JS в аналоговую переменную, например А1. 2) Далее в последующем коде на том месте где присутствовала ваша физическая ось ставим уже сглаженное значение А1. О, блин! Ой, спасибо, блин, большое! Ой, очень большое, блин, спасибо!! Всегда пожалуйста
beretta5 Опубликовано: 30 сентября 2014 Опубликовано: 30 сентября 2014 Zulu' timestamp='1412033084' post='206697'] А у кого проблемы были с интеграцией сглаживания в уже работающие скрипты? У мну скрипт "пороговый шумоподавитель" не работает со скриптом "триммирование".Я пока не переживаю,потом может поставлю скрипт подруливание.Просто информация к размышлению
=59=Moroka Опубликовано: 30 сентября 2014 Опубликовано: 30 сентября 2014 (изменено) Опаньки! Нашел... ещё пару лишних строк кода в нашем "сглаживателе" Оказывается, чтобы "получить" нужный люфт в передаче от оси джоя к cms-оси можно отлично обойтись: (%define опущено) script if ( [ J_Stick > C_Stick+(mz-1) ] ) then // ЗАБАНЕНО if ( [ ( J_Stick + 1 ) > C_Stick ] ) then C_Stick = J_Stick - mz; // ЗАБАНЕНО endif endif if ( [ J_Stick < C_Stick-(mz-1) ] ) then // ЗАБАНЕНО if ( [ ( J_Stick - 1 ) < C_Stick ] ) then C_Stick = J_Stick + mz; // ЗАБАНЕНО endif endif if ( [ J_Stick == 255 ] ) then C_Stick = 255; endif if ( [ J_Stick == 0 ] ) then C_Stick = 0; endif endScript В самом деле, ведь первое и второе условие IF идущие подряд работают по логике И. Но посмотрите... первое условие уже подразумевает выполнение второго ..тогда, что называется, зачем платить больше? Смело вычеркиваем 4 строки из скрипта... проверяем... Работает! Однако, в первой, оригинальной версии (с люфтом +/-1) Так Не получится! ... а потому что автор исходной версии уже один раз упростил скрипт, ограничиваясь в первом IF проверкой неравенства Js и Cms вместо двух проверок отклонения Js от Cms на единицу в одну и в другую сторону. Ведь это неравенство как раз и выполняется при отклонении на 1. В результате он "экономит" 2 строки, а мы, со своей дотошностью - 4! да ещё имеем возможность задавать величину лофта.... люфта П.С. Ура! Наши победили 2Terror, 2Nobby спасибо за code.../code наконец получилось! Изменено 30 сентября 2014 пользователем =J13=Moroka 2
72AG_terror Опубликовано: 30 сентября 2014 Опубликовано: 30 сентября 2014 У мну скрипт "пороговый шумоподавитель" не работает со скриптом "триммирование".Я пока не переживаю,потом может поставлю скрипт подруливание.Просто информация к размышлению Прикрепи скрипт. Я тебе интегрирую. Опаньки! Нашел... ещё пару лишних строк кода в нашем "сглаживателе" .... Утянул, спасибо!
Рекомендованные сообщения
Создайте аккаунт или войдите в него для комментирования
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйтесь для получения аккаунта. Это просто!
Зарегистрировать аккаунтВойти
Уже зарегистрированы? Войдите здесь.
Войти сейчас