diff --git a/LICENSE-Russian b/LICENSE-Russian index eba06122..e22d04f7 100644 --- a/LICENSE-Russian +++ b/LICENSE-Russian @@ -1,304 +1,304 @@ - GNU. 2, - 1991 . +Генеральная публичная лицензия GNU. Редакция 2, +Июнь 1991 г. Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, -Fifth Floor, Boston, MA 02110-1301 USA. : -, 2002, 2016. - , . - - - , . - GNU, , - , , - . , -, - , , - . ( - -GNU). . - " ", - , . - , - ( - ); , - ; , - ; , . - , , - . - , - . -, , -, , . - , -. -, . - : (1) - (2) , - , () - . -, , - , - . - - , - , -- , , - , . - , -. - , . - , - , - . - , - . - GNU - , - -0. -, , () - -. "" -, ", " - , , - () - . ( - ). , , - "". - , , , - ; . - , - , - , ( , - ). -, . -1. - , - - , , - ; , - ; - . - , - -. -2. () , - , ; - 1, - , : -a) , , - , , . -b) -, - , . -c) -, , - , - (, , - ); , - , , - . (: - , , -, , ). - . - - - , , -, , , . - , - , - ; , -, , - , , . - , - , ; -, - , . - , , - ( , ), - , - . -3. ( -, 2), -, , , - 1 2, : -a) - , - , 1 2, -, ; -b) - , , - , - - , , - 1 2, , -; -c) , - . ( - , -, , -, b). - , - . - , - , , - . , - , , - ( , ) - (, ..) , - , -, . - - , - - , , - . -4. , , - , , . -, , - , - . , - , , - , . -5. , , - . - . - , . -, ( , - ), - , - , . -6. , ( - , ), - , - , . - - , . - . -7. , - ( ) -( , ), - , - . , -, , -, . , - , - , - , - . - , - , - ; - . - - - ; - , - . - , -, ; - , , - (, ) , - . - - . -8. () - , , - , - , -, , - . , - , . -9. () - . - , , - . - . - , - , " ()", - , - . - , , - . -10. - , -, , -. , - , ; - . : - , - , - . - -11. , - , , - . , - () , - , - - , , , - . - , . , - , , - , . -12. -, , , - () -, , - , , - - ( -, , , - ), -, - . - - - , - , -- -, -. - , -. - , - ; - , -. -< .> Copyright < - > < > - ; () , - GNU, - ; 2 , ( -) , . - , , - - , - . - GNU. - - GNU, , - (Free Software Foundation, Inc.), 51 Franklin Street, +Fifth Floor, Boston, MA 02110-1301 USA. Перевод: Павел Протасов +, 2002, 2016. Разрешается свободно копировать и +распространять текст настоящей Лицензии, запрещается вносить в него изменения. +Введение +Лицензионные договоры на использование большинства программных продуктов +составлены так, чтобы запретить Вам распространять и изменять их. Генеральная +публичная лицензия GNU, напротив, ставит своей целью обеспечить Вам право на +распространение и изменение, то есть убедиться в том, что все пользователи +программы могут свободно использовать ее. На условиях, изложенных в настоящей +Лицензии, осуществляется использование большей части программ Фонда свободного +программного обеспечения, а также любой программы, автор которой соглашается с +этими условиями. (На некоторые из программ Фонда свободного программного +обеспечения распространяет свое действие Малая Генеральная публичная лицензия +GNU). Вы также можете распространять свои программы на этих условиях. +Когда нами употребляется термин "свободное программное обеспечение", он +относится к свободе использования, а не к бесплатности. Наши Генеральные +публичные лицензии составлены так, чтобы обеспечить Вам свободное +распространение копий свободного программного обеспечения (при желании Вы можете +брать за это плату); получение исходных текстов, либо возможность их получения +по желанию; внесение в программу изменений, а также использование ее частей в +новых свободных программах; знание того, что Вы можете совершать эти действия. +Для того, чтобы защитить Ваши права, мы должны исключить возможность отказа в их +предоставлении либо понуждения к отказу от них. Эти ограничения налагают +определенную ответственность и на Вас, если Вы распространяете ее копии или +изменяете ее. +Например, если Вы распространяете копии такой программы, безвозмездно или за +плату, Вы должны предоставить пользователям все те права, которые имеете сами. +Вы также должны быть уверены в том, что они получили или могут получить исходные +тексты. Также Вы должны ознакомить их с условиями настоящего соглашения для +того, чтобы они знали о своих правах. +Мы защищаем Ваши права при помощи следующих мер: (1) закрепляем авторское право +на программу и (2) предлагаем Вам принять условия настоящей Лицензии, +закрепляющей Ваше право на создание копий, распространение и (или) модификацию +программного обеспечения. +Также, для защиты каждого автора и своей собственной защиты, мы хотим быть +уверены в том, что каждый уведомлен об отсутствии гарантий на настоящее +свободное программное обеспечение. Если программа изменена кем-либо и +осуществляется распространение ее измененной версии, мы хотим уведомить +пользователей о том, что это -- не первоначальный вариант, чтобы проблемы, +вызванные другими, не отразились на деловой репутации автора исходной программы. +И наконец, любой свободной программе постоянно угрожает возможность ее +патентования. Мы хотим исключить возможность получения распространителями +программы патентов на нее, вследствие чего программа станет их собственностью. +Для предотвращения этого мы разъясняем, что любому лицу должно быть +предоставлено право на свободное использование любого такого патента, в +противном случае такое право не должно предоставляться никому. +Детальные определения используемых терминов и описание условий копирования, +распространения и внесения изменений приведены ниже. +ГЕНЕРАЛЬНАЯ ПУБЛИЧНАЯ ЛИЦЕНЗИЯ GNU +ТЕРМИНЫ И УСЛОВИЯ КОПИРОВАНИЯ, +РАСПРОСТРАНЕНИЯ И ВНЕСЕНИЯ ИЗМЕНЕНИЙ +0. Настоящая Лицензия распространяет свое действие на любую программу или другое +произведение, которое содержит уведомление правообладателя о том, что ее (его) +использование осуществляется на условиях настоящей Генеральной публичной +лицензии. Термин "Программа" в дальнейшем обозначает любую такую программу или +произведение, а "произведение, основанное на Программе" обозначает Программу или +производное произведение, защищенное авторским правом, то есть содержащее в себе +саму Программу либо ее часть в неизменном или модифицированном виде и (или) +переведенную на другой язык. (В дальнейшем понятие перевода целиком включается в +понятие модификации ). Лицо, присоединившееся к Соглашению , в дальнейшем +именуется "Вы". +На действия, отличные от копирования, распространения и модификации, настоящая +Лицензия не распространяется; они не входят в сферу ее действия. +Функционирование Программы ею не ограничено, на порождаемую Программой +информацию она распространяется только в том случае, если эта информация +является произведением, основанным на Программе (независимо от того, была она +получена при запуске Программы или нет). Истинность этого условия зависит от +того, какие действия выполняет Программа. +1. После получения исходного текста Программы Вы можете создавать его копии и +распространять его без внесения изменений на любом носителе, при условии +сопровождения каждой копии надлежащим уведомлением об авторских правах и отказе +от предоставления гарантий, сделанным таким образом, чтобы обеспечить +ознакомление с ним пользователя; оставления в неизменном виде всех уведомлений, +относящихся к настоящей Лицензии и отсутствию гарантий; передачи другим +получателям Программы копии настоящей Лицензии вместе с ней. +Вы можете брать плату за передачу экземпляра Программы, также Вы можете по +своему усмотрению предлагать пользователям гарантийное обслуживание за +вознаграждение. +2. Вы можете перерабатывать свою копию (копии) Программы или любой ее части, +создавая таким образом произведение, основанное на Программе; воспроизводить и +распространять такие изменения или само произведение на условиях Раздела 1, +приведенного выше, при соблюдении следующих условий: +a) Вы обязаны снабдить измененные файлы в месте, заметном для пользователя, +сообщением о том, что файл изменен, и датой каждого изменения. +b) Вы обязаны заключить со всеми третьими лицами договор на использование любого +произведения, содержащего Программу или ее часть либо основанного на ней или на +ее части с условиями, содержащимися в настоящей Лицензии. +c) Если модифицированная программа при работе получает команды в диалоговом +режиме, Вы должны сделать так, чтобы при обычном начале работы в таком режиме +она выводила сообщение, включающее в себя надлежащее оповещение об авторских +правах и об отказе от предоставления гарантий (или, наоборот, об их +предоставлении Вами); уведомление пользователя о том, что он может +распространять программу на этих условиях, и сведения о том, как пользователь +может ознакомиться с копией настоящей Лицензии. (Примечание: если Программа +работает в диалоговом режиме, но обычно не выводит подобных сообщений, от вашего +произведения, основанного на Программе, этого также не требуется). +Эти требования применяются ко всему производному произведению в целом. Если +могущие быть идентифицированными части такого произведения не являются +производными от Программы и сами по себе могут обоснованно считаться +самостоятельными и независимыми произведениями, то, в случае отдельного их +распространения, условия, изложенные в настоящей Лицензии, к ним не применяются. +Однако в случае распространения тех же частей в составном произведении, +основанном на Программе, их распространение должно осуществляться на условиях +настоящей Лицензии; при этом права, приобретаемые пользователями на ее +основании, распространяются на составное произведение в целом, включая каждую из +его частей, независимо от того, кто является ее автором. +Таким образом, целью данного раздела Лицензии является не предъявление претензий +или оспаривание Ваших прав на произведение, автором которого Вы являетесь; +скорее, его цель состоит в обеспечении права на контроль за распространением +производных и составных произведений, основанных на Программе. +Кроме того, простое объединение Программы с другим произведением, не основанным +на Программе (либо произведением, основанным на Программе), на одном устройстве +памяти или дистрибутивном носителе информации, не ведет к распространению +условий настоящей Лицензии на это произведение. +3. Вы можете копировать и распространять Программу (либо основанное на ней +произведение, созданное соответствии с Разделом 2), в виде объектного кода или в +форме, пригодной для функционирования, в соответствии с условиями, описанными в +приведенных выше Разделах 1 и 2, при выполнении одного из следующих действий: +a) Прилагая к ней полный исходный текст в машинно-читаемой форме, +распространяемый на условиях, описанных в приведенных выше Разделах 1 и 2, +способом, обычно используемым для обмена программным обеспечением; или +b) Прилагая к ней в письменной форме действительное в течение трех лет +предложение передать любому третьему лицу за плату, не превышающую издержек, +понесенных Вами при совершении передачи, машинно-читаемую копию полного +исходного текста произведения, на условиях, описанных в приведенных выше +Разделах 1 и 2, способом, обычно используемым для обмена программным +обеспечением; или +c) Прилагая к ней информацию, полученную Вами в качестве предложения передать +полный исходный текст. (Соблюдение данного условия допускается только при +распространении без извлечения прибыли и только в случаях, когда Вы получили +программу, в виде объектного кода или в исполняемой форме, в комплекте с таким +предложением, описанным в приведенном выше подразделе b). +Под исходным текстом понимается произведение в форме, наиболее подходящей для +внесения в него изменений. Для произведения в исполняемой форме под полным +исходным текстом понимается исходный текст всех составляющих его модулей, любые +прилагаемые файлы с описанием интерфейса, тексты сценариев, используемых для +управления процессами компиляции и установки исполняемых файлов. Однако, в +порядке исключения, в распространяемый исходный текст не нужно включать то, что +обычно распространяется ( как в виде исходного текста, так и объектного кода) с +основными компонентами (компилятор, ядро и т.п.) операционной системы, под +управлением которой происходит выполнение исполняемого файла, за исключением +случаев, когда исполняемый файл комплектуется этим компонентом. +Если распространение исполняемого файла или объектного кода осуществляется с +помощью предоставления доступа для копирования из определенного источника, +предложение аналогичной возможности копирования исходного текста из того же +источника приравнивается к распространению исходного текста, даже в том случае, +если возможно копирование объектного кода отдельно от исходного текста. +4. Вам запрещается копировать, изменять, сублицензировать или распространять +Программу иначе, чем на условиях, описанных в настоящей Лицензии. Любая попытка +копирования, изменения, сублицензирования или распространения Программы иначе не +имеет юридической силы и автоматически лишает Вас прав, предоставленных +настоящей Лицензией. Однако соглашения с третьими лицами, получившими от Вас +копии программы или права, предоставляемые настоящим Соглашением, не прекращают +своего действия до тех пор, пока указанные лица соблюдают его условия. +5. В случае, если Вы не подписали настоящую Лицензию, от Вас не требуется +принятия ее условий. Однако изменение или распространение Программы или +основанных на ней произведений на иных условиях не разрешается. Если Вы не +исполняете условий настоящей Лицензии, Ваши действия преследуются по закону. +Следовательно, изменяя или распространяя Программу (либо произведение, +основанное на Программе), Вы выражаете свое согласие с условиями настоящей +Лицензии и ее условиями на копирование, распространение и изменение Программы +или произведений, основанных на ней. +6. Каждый раз, когда Вы распространяете полученную от других лиц Программу (или +любое произведение, основанное на Программе), ее получатель автоматически +принимает условия соглашения с первоначальным правообладателем на копирование, +распространение и изменение Программы, описанные в настоящей Лицензии. В +дальнейшем Вы не можете налагать ограничения на осуществление пользователем +предоставленных ему прав, описанных выше. Вы не несете ответственности за +несоблюдение третьими лицами условий настоящей Лицензии. +7. Если вследствие судебного решения, заявления о нарушении патента или по любой +иной причине (не ограниченной патентными спорами) на Вас наложены обязательства +(по решению суда, соглашению или на ином основании), которые противоречат +условиям настоящей Лицензии, это не освобождает Вас от соблюдения условий +настоящей Лицензии. Если Вы не можете заниматься распространением, исполняя +обязательства, наложенные на Вас настоящей Лицензией, одновременно с другими +обязательствами, Вы не должны распространять Программу. Например, если условиями +соглашения об использовании патента пользователям, получившим экземпляры +Программы непосредственно от Вас или через посредников, не разрешено самим +безвозмездно распространять их, то единственным способом удовлетворения его +условий и условий настоящей Лицензии будет отказ от распространения Программы. +В случае, если любое из положений настоящего раздела решением суда было признано +не имеющим силы либо не подлежащим применению в конкретном случае, остальные +положения раздела подлежат применению; весь раздел целиком подлежит применению в +иных случаях. +Целью настоящего раздела не является побуждение Вас к нарушению патентных или +иных имущественных прав либо оспаривание юридической силы любого положения или +договора из области этих прав; его назначение состоит исключительно в защите +принципов системы распространения свободного программного обеспечения, которые +закрепляются посредством публичных лицензий. Многие люди оказали большое +содействие в разработке большого числа программ, распространяемых подобным +образом, будучи уверенными в последовательном применении этих принципов; вопрос +о том, распространять ли программное обеспечение на других условиях, решается +автором (лицом, оказывающим поддержку) самостоятельно, лицензиат не может влиять +на принятие данного решения. +Назначение этого раздела состоит в окончательном разъяснении последствий +применения остальной части настоящей Лицензии. +8. Если распространение и (или) использование Программы в отдельных государствах +ограничено нормами авторского или патентного права, правообладатель, +первоначально распространивший на Программу условия настоящей Лицензии, может в +явной форме ограничить территорию ее распространения, исключив из нее такие +страны, с тем, чтобы разрешить распространение только внутри остальных стран +либо между ними. В этом случае такое условие включается в настоящую Лицензию, +имея одинаковую силу с условиями, содержащимися в ее тексте. +9. Фонд свободного программного обеспечения может публиковать измененные и (или) +новые редакции Генеральной публичной лицензии. Такие редакции будут сходны в +основных принципах с настоящей редакцией, но могут отличаться от нее в деталях, +направленных на решение новых проблем и вопросов. +Каждой редакции присваивается собственный уникальный номер. Если в документации +на Программу указан номер редакции настоящей Лицензии, условия которой +распространяются на нее, а также слова "и любые следующие версии (редакции)", то +Вы имеете право выбора между условиями этой редакции и любой редакции, +опубликованной Фондом свободного программного обеспечения после нее. Если для +Программы не указан номер редакции Лицензии, Вы можете выбрать любую редакцию, +опубликованную Фондом свободного программного обеспечения. +10. Если Вы намереваетесь включить части Программы в состав другого свободного +программного обеспечения, условия распространения которого отличаются от +условий, описанных в настоящей Лицензии, Вы должны получить на это разрешение +автора. Для программы, авторское право на которую принадлежит Фонду свободного +программного обеспечения, разрешение следует получать у Фонда; иногда мы делаем +исключения в таких случаях. При этом мы руководствуемся двумя целями: +обеспечением сохранения своего статуса всеми произведениями, основанными на +свободном программном обеспечении, и достижением более широкого распространения +и использования программного обеспечения вообще. +ОТСУТСТВИЕ ГАРАНТИЙ +11. Поскольку использование Программы осуществляется безвозмездно, на нее не +предоставляется никаких гарантий, за исключением тех, которые установлены +действующим законодательством. Если иное не указано в письменной форме, +правообладатели и (или) иные стороны предоставляют Программу в том виде, в +котором осуществляется ее распространение, без принятия на себя каких-либо +гарантийных обязательств, как выраженных явно, так и подразумеваемых, в том +числе подразумеваемых гарантий качества и пригодности для конкретных целей. Вы +несете все риски, касающиеся качества и работы Программы. В случае, если в +Программе будут обнаружены недостатки, на Вас возлагаются все расходы, связанные +с обслуживанием, восстановлением или исправлением Программы. +12. Если иное не предусмотрено действующим законодательством или соглашением +сторон, заключенным в письменной форме, правообладатель или иное лицо, которое +имеет возможность изменять и (или) повторно распространять Программу на +условиях, сформулированных выше, не может нести ответственность перед Вами за +причиненный ущерб, включая ущерб общего либо специфического характера, +причиненный случайно или являющийся следствием использования программы либо +невозможности ее использования (в том числе уничтожение или модификацию +информации, либо убытки, понесенные вами или третьими лицами, либо сбои +Программы при взаимодействии с другим программным обеспечением), в том числе и в +случаях, когда правообладатель или третье лицо предупреждены о возможности +причинения таких убытков. +КОНЕЦ ОПРЕДЕЛЕНИЙ И УСЛОВИЙ +Порядок применения условий Лицензии к Вашим программам +Если Вы разрабатываете новую программу и хотите, чтобы ее использование принесло +максимальную пользу обществу, наилучший способ достичь этого -- сделать ее +свободной, чтобы все могли распространять и изменять ее на условиях настоящей +Лицензии. +Для этого сделайте так, чтобы программа содержала в себе описанные ниже +уведомления. Наиболее надежным способом для этого является включение их в начало +каждого файла исходного текста, чтобы наиболее эффективным образом сообщить об +отсутствии гарантий; каждый файл должен иметь по меньшей мере строку с +оповещением об авторских правах и указание на то, где находится полный текст +уведомлений. +<Строка с названием программы и информацией о ее назначении.> Copyright © <год +выпуска программы в свет> <имя автора> +Эта программа является свободной; Вы можете распространять ее и (или) изменять, +соблюдая условия Генеральной публичной лицензии GNU, опубликованной Фондом +свободного программного обеспечения; либо редакции 2 Лицензии, либо (на ваше +усмотрение) любой редакции, выпущенной позже. +Эта программа распространяется в надежде на то, что она окажется полезной, но +БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, включая подразумеваемую гарантию КАЧЕСТВА либо +ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробности содержатся в Генеральной +публичной лицензии GNU. +Вместе с этой программой должен распространяться экземпляр Генеральной публичной +лицензии GNU, если он отсутствует, сообщите об этом в Фонд свободного +программного обеспечения (Free Software Foundation, Inc.), 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - , - . - , , - , -: -Gnomovision 69, ; . -Gnomovision ; -, "show w". , - , ; , -, "show c". - "show w" "show c" - . , , - , , "show w" "show c"; - -- -, . - ( -) , , , - , . , - , : -Yoyodyne, Inc. - 'Gnomovision' ( ), -. -<>, 1 1989 . , - - , - . -, , - . , - GNU -. \ No newline at end of file +Также добавьте информацию о том, как связаться с Вами посредством электронной +или обычной почты. +Если программа работает в диалоговом режиме, сделайте так, чтобы при начале +такого режима работы она выводила короткое сообщение, подобное приведенному +ниже: +Gnomovision версии 69, © год первого выпуска программы в свет; имя автора. +Gnomovision распространяется БЕЗО ВСЯКИХ ГАРАНТИЙ; для получения подробной +информации, введите команду "show w". Это свободное программное обеспечение, Вы +можете распространять его, соблюдая определенные условия; для того, чтобы с ними +ознакомиться, введите команду "show c". +Гипотетические команды "show w" и "show c" должны приводить к выводу +соответствующих частей Генеральной публичной лицензии. Разумеется, команды, +которые используете Вы, могут быть названы иначе, не "show w" и "show c"; они +могут представлять собой нажатия кнопок мыши или выбор пунктов меню -- то есть +все, что можно выполнить при работе с программой. +Вы также должны получить от своего работодателя (если вы работаете +программистом) или, при необходимости, учебного заведения, письменный отказ от +исключительных прав на нее, если это необходимо. Ниже приведен образец, Вы +можете использовать его, заменив имена: +Yoyodyne, Inc. отказывается от всех исключительных прав на использование +программы 'Gnomovision' (выполняющей проходы компилятора), написанной Джеймсом +Хакером. +<Подпись>, 1 апреля 1989 г. Тай Кун, заместитель директора +Условиями настоящей Генеральной публичной лицензии не разрешается включать Вашу +программу в состав программы, которая не удовлетворяет критериям свободного +программного обеспечения. Если ваша программа представляет собой библиотеку +процедур, Вы можете прийти к выводу, что более полезным было бы разрешение на +связывание ее с такой программой. Если Вы хотите сделать это, используйте +условия Малой Генеральной публичной лицензии GNU вместо условий настоящей +Лицензии. \ No newline at end of file diff --git a/RRS.pro b/RRS.pro index 5c77d8aa..71262f6b 100644 --- a/RRS.pro +++ b/RRS.pro @@ -6,29 +6,29 @@ SUBDIRS += ./CfgReader SUBDIRS += ./CfgEditor SUBDIRS += ./filesystem SUBDIRS += ./libJournal -SUBDIRS += ./log SUBDIRS += ./tcp-connection SUBDIRS += ./asound SUBDIRS += ./simulator -SUBDIRS += ./addons/default-vehicle -SUBDIRS += ./addons/test-loco -SUBDIRS += ./addons/sapsan-motor -SUBDIRS += ./addons/sapsan-non-motor -SUBDIRS += ./addons/es1-motor -SUBDIRS += ./addons/es1-non-motor +SUBDIRS += ./viewer + SUBDIRS += ./addons/passcar SUBDIRS += ./addons/vl60 SUBDIRS += ./addons/tep70 -#SUBDIRS += ./addons/chs4t SUBDIRS += ./addons/chs2t SUBDIRS += ./addons/ep20 SUBDIRS += ./launcher SUBDIRS += ./launcher2 -SUBDIRS += ./viewer SUBDIRS += ./tools/profconv SUBDIRS += ./tools/pathconv SUBDIRS += ./tools/routeconv + +#SOURCES += \ +# addons/vl60/vl60-equipment/src/tapping-sound.cpp \ +# addons/vl60/vl60-equipment/src/tapping-sound.cpp + +#HEADERS += \ +# addons/vl60/vl60-equipment/include/tapping-sound.h diff --git a/addons/chs2t/chs2t/include/chs2t-horn.h b/addons/chs2t/chs2t/include/chs2t-horn.h index 87e8410d..934da7f1 100644 --- a/addons/chs2t/chs2t/include/chs2t-horn.h +++ b/addons/chs2t/chs2t/include/chs2t-horn.h @@ -16,9 +16,9 @@ class CHS2tHorn : public TrainHorn void stepKeysControl(double t, double dt) { - //TrainHorn::stepKeysControl(t, dt); + TrainHorn::stepKeysControl(t, dt); - if (control_signals.analogSignal[KM_SVISTOK].is_active) + /*if (control_signals.analogSignal[KM_SVISTOK].is_active) { if (is_svistok = static_cast(control_signals.analogSignal[KM_SVISTOK].cur_value)) { @@ -28,7 +28,7 @@ class CHS2tHorn : public TrainHorn { emit soundSetVolume("Svistok", 0); } - } + }*/ } }; diff --git a/addons/default-vehicle/default-vehicle.pro b/addons/default-vehicle/default-vehicle.pro deleted file mode 100644 index 38337a63..00000000 --- a/addons/default-vehicle/default-vehicle.pro +++ /dev/null @@ -1,5 +0,0 @@ -TEMPLATE = subdirs - -CONFIG += ordered - -SUBDIRS += ./default-vehicle \ No newline at end of file diff --git a/addons/default-vehicle/default-vehicle/default-vehicle.pro b/addons/default-vehicle/default-vehicle/default-vehicle.pro deleted file mode 100644 index e0444b43..00000000 --- a/addons/default-vehicle/default-vehicle/default-vehicle.pro +++ /dev/null @@ -1,32 +0,0 @@ -TEMPLATE = lib - -QT -= gui -QT += xml - -TARGET = default-vehicle - -DESTDIR = ../../../../modules/$$join(TARGET,,,) - -CONFIG(debug, debug|release) { - - LIBS += -L../../../../lib -lCfgReader_d - LIBS += -L../../../../lib -lphysics_d - LIBS += -L../../../../lib -lvehicle_d - -} else { - - LIBS += -L../../../../lib -lCfgReader - LIBS += -L../../../../lib -lphysics - LIBS += -L../../../../lib -lvehicle -} - -INCLUDEPATH += ./include -INCLUDEPATH += ../../../CfgReader/include - -INCLUDEPATH += ../../../simulator/solver/include -INCLUDEPATH += ../../../simulator/physics/include -INCLUDEPATH += ../../../simulator/vehicle/include -INCLUDEPATH += ../../../simulator/device/include - -HEADERS += $$files(./include/*.h) -SOURCES += $$files(./src/*.cpp) diff --git a/addons/default-vehicle/default-vehicle/include/default-vehicle.h b/addons/default-vehicle/default-vehicle/include/default-vehicle.h deleted file mode 100644 index 1028cc5a..00000000 --- a/addons/default-vehicle/default-vehicle/include/default-vehicle.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef DEFAULT_VEHICLE_H -#define DEFAULT_VEHICLE_H - -#include "vehicle.h" - -class DefaultVehicle : public Vehicle -{ -public: - - DefaultVehicle(); - ~DefaultVehicle(); -}; - -#endif // DEFAULT_VEHICLE_H diff --git a/addons/default-vehicle/default-vehicle/src/default-vehicle.cpp b/addons/default-vehicle/default-vehicle/src/default-vehicle.cpp deleted file mode 100644 index 09074b14..00000000 --- a/addons/default-vehicle/default-vehicle/src/default-vehicle.cpp +++ /dev/null @@ -1,13 +0,0 @@ -#include "default-vehicle.h" - -DefaultVehicle::DefaultVehicle() -{ - -} - -DefaultVehicle::~DefaultVehicle() -{ - -} - -GET_VEHICLE(DefaultVehicle) diff --git a/addons/ep20/blok-display/blok-display.pro b/addons/ep20/blok-display/blok-display.pro new file mode 100644 index 00000000..8fd16ef2 --- /dev/null +++ b/addons/ep20/blok-display/blok-display.pro @@ -0,0 +1,32 @@ +TEMPLATE = lib + +QT += core +QT += gui +QT += widgets +QT += opengl +QT += xml + +TARGET = blok-display + +DESTDIR = ../../../../modules/ep20 + +CONFIG(debug, debug|release) { + + LIBS += -L../../../../lib -ldisplay_d + LIBS += -L../../../../lib -lCfgReader_d + +} else { + + LIBS += -L../../../../lib -ldisplay + LIBS += -L../../../../lib -lCfgReader +} + +INCLUDEPATH += ./include +INCLUDEPATH += ../ep20/include +INCLUDEPATH += ../../../simulator/vehicle/include +INCLUDEPATH += ../../../CfgReader/include +INCLUDEPATH += ../../../viewer/display/include + +HEADERS += $$files(./include/*.h) +SOURCES += $$files(./src/*.cpp) +RESOURCES += $$files(./resources/*.qrc) diff --git a/addons/ep20/blok-display/include/DisconnectionServer.h b/addons/ep20/blok-display/include/DisconnectionServer.h new file mode 100644 index 00000000..3727dbb2 --- /dev/null +++ b/addons/ep20/blok-display/include/DisconnectionServer.h @@ -0,0 +1,42 @@ +//----------------------------------------------------------------------------- +// +// Экран потери связи +// (c) РГУПС, ВЖД 18/07/2017 +// Разработал: Даглдиян Б.Д. +// +//----------------------------------------------------------------------------- +/*! + * \file + * \brief Экран потери связи + * \copyright РГУПС, ВЖД + * \author Даглдиян Б.Д. + * \date 18/07/2017 + */ + +#ifndef DISCONNECTIONSERVER_H +#define DISCONNECTIONSERVER_H + +#include +#include + +/*! + * \class DisconnectionServer + * \brief Класс, вызываемый при потере связи с сервером + */ +class DisconnectionServer : public QLabel +{ + +public: + /*! + * \brief Конструктор. + * \param size - размер элемента + */ + DisconnectionServer(QSize size, QWidget* parent = Q_NULLPTR); + + /// Деструктор + ~DisconnectionServer(); + + +}; + +#endif // DISCONNECTIONSERVER_H diff --git a/addons/ep20/blok-display/include/ImageLabel.h b/addons/ep20/blok-display/include/ImageLabel.h new file mode 100644 index 00000000..f3be256d --- /dev/null +++ b/addons/ep20/blok-display/include/ImageLabel.h @@ -0,0 +1,50 @@ +#ifndef IMAGE_LABEL_H +#define IMAGE_LABEL_H + +#include +#include + +class ImageLabel : public QLabel +{ +public: + + ImageLabel(QWidget *parent = Q_NULLPTR) : QLabel(parent) + , pixmap(Q_NULLPTR) + { + + } + + ImageLabel(const QString &text, QWidget *parent = Q_NULLPTR) : QLabel(text, parent) + , pixmap(Q_NULLPTR) + { + + } + + virtual ~ImageLabel() + { + + } + + void setPixmap(QPixmap *pxmp) + { + pixmap = pxmp; + } + + +private: + + QPixmap *pixmap; + + void paintEvent(QPaintEvent *) + { + if (pixmap == Q_NULLPTR) + return; + + QPainter p(this); + p.setWindow(this->frameGeometry()); + p.drawPixmap(this->frameGeometry(), *pixmap); + } +}; + + +#endif // IMAGE_LABEL_H diff --git a/addons/ep20/blok-display/include/InformPart.h b/addons/ep20/blok-display/include/InformPart.h new file mode 100644 index 00000000..fcca2207 --- /dev/null +++ b/addons/ep20/blok-display/include/InformPart.h @@ -0,0 +1,84 @@ +//----------------------------------------------------------------------------- +// +// Элемент блока информации +// (c) РГУПС, ВЖД 12/04/2017 +// Разработал: Даглдиян Б.Д. +// +//----------------------------------------------------------------------------- +/*! + * \file + * \brief Класс элемента блока информации + * \copyright РГУПС, ВЖД + * \author Даглдиян Б.Д. + * \date 12/04/2017 + */ + +#ifndef INFORMPART_H +#define INFORMPART_H + + +#include +#include +#include + +#include "ImageLabel.h" + +/*! + * \class InformPart + * \brief Класс, описывающий элемент блока информации + */ +class InformPart : public ImageLabel +{ + Q_OBJECT + +public: + /*! + * \brief Конструктор. Рисуем элемент информационного блока + * \param geo - геометрия элемента (позиция, размер) + * \param strHead - текст заголовка + * \param strText - текст + * \param align - выравнивание + * \param marginLeft - отступ текста слева + * \param isDrawX - рисовать ли крестик + * \param isDrawO - рисовать ли эллипс + */ + InformPart( QRect geo, QString strHead, QString strText, + Qt::Alignment align, QWidget *parent = Q_NULLPTR, + QString config_path = "", + int marginLeft =0, bool isDrawX =false, bool isDrawO =false ); + /// Деструктор + ~InformPart(); + + /*! + * \brief Установить текст элемента + * \param strText - текст + */ + void setText(QString strText); + + void setTextOverHead(QString headText, QRect geo); + + void setImgOverLabel(); + +private: + + QLabel* labelText_; ///< виждет для отображения текста элемента + QLabel* labelTextOverHead_; ///< перекрывающий текст заголовка + int fooWidth_; + + void drawX(); ///< Нарисовать крестик + void drawO(); ///< Нарисовать эллипс + + // --- cfg параметры --- // + QString colorBorder_; + QString colorTextHead_; + QString colorText_; + int fontSize_; + // --------------------- // + + QPixmap pm; + + /// Чтение конфигураций + bool loadInformPartCfg(QString cfg_path); +}; + +#endif // INFORMPART_H diff --git a/addons/ep20/blok-display/include/InformPart2.h b/addons/ep20/blok-display/include/InformPart2.h new file mode 100644 index 00000000..077d571b --- /dev/null +++ b/addons/ep20/blok-display/include/InformPart2.h @@ -0,0 +1,63 @@ +//----------------------------------------------------------------------------- +// +// Элемент 2 блока информации +// (c) РГУПС, ВЖД 13/04/2017 +// Разработал: Даглдиян Б.Д. +// +//----------------------------------------------------------------------------- +/*! + * \file + * \brief Класс элемента блока информации + * \copyright РГУПС, ВЖД + * \author Даглдиян Б.Д. + * \date 13/04/2017 + */ + +#ifndef INFORMPART2_H +#define INFORMPART2_H + + +#include +#include +#include + + +/*! + * \class InformPart + * \brief Класс, описывающий элемент блока информации + */ +class InformPart2 : public QLabel +{ + Q_OBJECT + +public: + /*! + * \brief Конструктор. Рисуем элементы информационного блока + * \param geo - геометрия элемента (позиция, размер) + * \param strHead - текст заголовка + */ + InformPart2(QRect geo, QString strHead, QWidget *parent = Q_NULLPTR ); + /// Деструктор + ~InformPart2(); + + /// Установить текст элемента + void setVal(double strVal); + +private: + + QLabel* labelVal_; ///< виджет для отображения значения элемента + QLabel* labelBar_; ///< виджет для отображения прогресс бара + QImage imgBar_; ///< картинка для прогресс бара + + /// Установить виджет для отображения текста + void setTextLabel_(QLabel* label, QRect geo, QColor color, QString str ); + + /// Нарисовать тело элемента + void drawBodyLabel_(); + + +}; + + + +#endif // INFORMPART2_H diff --git a/addons/ep20/blok-display/include/InformPartPressure.h b/addons/ep20/blok-display/include/InformPartPressure.h new file mode 100644 index 00000000..a2a2e0bd --- /dev/null +++ b/addons/ep20/blok-display/include/InformPartPressure.h @@ -0,0 +1,43 @@ +//----------------------------------------------------------------------------- +// +// Элемент-давления блока информации +// (c) РГУПС, ВЖД 15/01/2020 +// Разработал: Даглдиян Б.Д. +// +//----------------------------------------------------------------------------- +/*! + * \file + * \brief Класс элемента-давления блока информации + * \copyright РГУПС, ВЖД + * \author Даглдиян Б.Д. + * \date 15/01/2020 + */ + + +#ifndef INFORMPARTPRESSURE_H +#define INFORMPARTPRESSURE_H + +#include +#include +#include +#include "ImageLabel.h" + +class InformPartPressure : public ImageLabel +{ +public: + InformPartPressure(QString strHead, QWidget *parent = Q_NULLPTR); + + void setValPressure(double val); + +private: + ImageLabel* labelPressureBar_; + QLabel* labelPressureVal_; + + QImage img_; + QPixmap pm; + + void drawLabel(QString val, int posY); + +}; + +#endif // INFORMPARTPRESSURE_H diff --git a/addons/ep20/blok-display/include/InformPartTriangle.h b/addons/ep20/blok-display/include/InformPartTriangle.h new file mode 100644 index 00000000..c417b504 --- /dev/null +++ b/addons/ep20/blok-display/include/InformPartTriangle.h @@ -0,0 +1,84 @@ +//----------------------------------------------------------------------------- +// +// Элемент блока информации (треугольник) +// (c) РГУПС, ВЖД 14/04/2017 +// Разработал: Даглдиян Б.Д. +// +//----------------------------------------------------------------------------- +/*! + * \file + * \brief Класс элемента блока информации (треугольник) + * \copyright РГУПС, ВЖД + * \author Даглдиян Б.Д. + * \date 14/04/2017 + */ + +#ifndef INFORMPARTTRIANGLE_H +#define INFORMPARTTRIANGLE_H + +#include +#include +#include + + +/*! + * \class InformPartTriangle + * \brief Класс, описывающий элемент блока информации (треугольник) + */ +class InformPartTriangle : public QLabel +{ + Q_OBJECT + +public: + /*! + * \brief Конструктор. Рисуем элемент информационного блока (треугольник) + * \param pos - позиция элемента + * \param size - размер элемента + * \param color - цвет элемента + */ + InformPartTriangle( QPoint pos, int size, QColor color, + QWidget *parent = Q_NULLPTR); + /// Деструктор + ~InformPartTriangle(); + + /*! + * \brief Прорисовка треугольника + * \param angle - установить угол поворота треугольника + * \param isBrush - заполнять ли треугольник цветом + * \param drawCircle - рисовать ли кругом внутри + */ + void setTriangle(int angle, bool isBrush, + bool drawCircle = false, bool drawStr = false); + + +private: + + //QLabel* labelTriangle_; ///< виджет для отображения треугольника + QImage imgTriangle_; ///< картинка для треугольника + QColor colorTriangle_; ///< цвет треугольника + + + /*! + * \brief Нарисовать треугольник + * \param paint - живописец + * \param i, j - для определения вершин треугольника + */ + void drawTriangle_(QPainter &paint, int i, int j); + + /*! + * \brief Нарисовать круг в треугольнике + * \param paint - живописец + */ + void drawCircle_(QPainter &paint); + + /*! + * \brief Нарисовать текст в треугольнике + * \param paint - живописец + * \param str - текст + */ + void drawText(QPainter &paint, QString str); + + +}; + +#endif // INFORMPARTTRIANGLE_H diff --git a/addons/ep20/blok-display/include/SArcLimit.h b/addons/ep20/blok-display/include/SArcLimit.h new file mode 100644 index 00000000..064f221d --- /dev/null +++ b/addons/ep20/blok-display/include/SArcLimit.h @@ -0,0 +1,72 @@ +//----------------------------------------------------------------------------- +// +// Спидометр. Дуга ограничения +// (c) РГУПС, ВЖД 31/03/2017 +// Разработал: Даглдиян Б.Д. +// +//----------------------------------------------------------------------------- +/*! + * \file + * \brief Класс "Дуга ограничения" спидометра + * \copyright РГУПС, ВЖД + * \author Даглдиян Б.Д. + * \date 04/05/2017 + */ + +#ifndef SARCLIMIT_H +#define SARCLIMIT_H + +#include +#include + +/*! + * \class SArcLimit + * \brief Прорисовка дуги ограничения на шкале спидометра + */ +class SArcLimit : public QLabel +{ + +public: + + /*! + * \brief Конструктор. + * \param valVMax - максимальное значение скорости спидометра + * \param arcSplitAngle - угол центра разрыва дуги + * \param arcSplitPoint - длина дуги-разрыва + */ + SArcLimit(int valVMax, int arcSplitAngle, int arcSplitPoint, + QWidget *parent = Q_NULLPTR , QString config_dir = ""); + /// Деструктор + ~SArcLimit(); + + /*! + * \brief Нарисовать дуги ограничений скорости + * \param valSpeedLimit - значение текущего ограничения + * \param nextValSpeedLimit - значение следующего ограничения + */ + void setValSpeedLimit(double curSpeedLimit, double nextSpeedLimit); + + /// Получить ширину дуги ограничения скорости + int getArcLimitWidth(); + +private: + + QImage img_; ///< картинка + + // --- cfg параметры --- // + /// дуга ограничения шкалы спидометра + int arcLimit_width_; ///< ширина + QString arcLimit_color_; ///< цвет + QString arcLimitNext_color_; ///< цвет + // --------------------- // + + int valVMax_; ///< максимальное значение скорости спидометра + int arcSplitAngle_; ///< угол центра разрыва дуги + int arcSplitPoint_; ///< длина дуги-разрыва + + /// Чтение конфигураций + bool loadSArcLimitCfg(QString cfg_path); + +}; + +#endif // SARCLIMIT_H diff --git a/addons/ep20/blok-display/include/SArrow.h b/addons/ep20/blok-display/include/SArrow.h new file mode 100644 index 00000000..118b30f6 --- /dev/null +++ b/addons/ep20/blok-display/include/SArrow.h @@ -0,0 +1,62 @@ +//----------------------------------------------------------------------------- +// +// Спидометр. Стрелка +// (c) РГУПС, ВЖД 02/05/2017 +// Разработал: Даглдиян Б.Д. +// +//----------------------------------------------------------------------------- +/*! + * \file + * \brief Класс "Стрелка" спидометра + * \copyright РГУПС, ВЖД + * \author Даглдиян Б.Д. + * \date 02/05/2017 + */ + +#ifndef SARROW_H +#define SARROW_H + + +#include +#include + +/*! + * \class SArrow + * \brief Класс, описывающий стрелку спидометра + */ +class SArrow : public QLabel +{ + +public: + /// Конструктор + SArrow(QWidget *parent = Q_NULLPTR, QString config_dir = ""); + /// Деструктор + ~SArrow(); + + /// Вращение стрелки + void setValSpeed(double angle); + + +private: + QImage img_; ///< картинка стрелки спидометра + + double w_2_; ///< половина ширины класса + double h_2_; ///< половина высоты класса + + // --- cfg параметры --- // + /// стрелка спидометра + double kLength_; ///< коэфициент длины стрелки (от ширины спидометра) + double width_; ///< ширина основания стрелки + QString color_; ///< цвет стрелки + + // --------------------- // + + + /// Чтение конфигураций + bool loadSArrowCfg(QString cfg_path); + +}; + + + +#endif // SARROW_H diff --git a/addons/ep20/blok-display/include/SScale.h b/addons/ep20/blok-display/include/SScale.h new file mode 100644 index 00000000..8580edab --- /dev/null +++ b/addons/ep20/blok-display/include/SScale.h @@ -0,0 +1,115 @@ +//----------------------------------------------------------------------------- +// +// Спидометр. Шкала +// (c) РГУПС, ВЖД 03/05/2017 +// Разработал: Даглдиян Б.Д. +// +//----------------------------------------------------------------------------- +/*! + * \file + * \brief Класс "Шкала" спидометра + * \copyright РГУПС, ВЖД + * \author Даглдиян Б.Д. + * \date 03/05/2017 + */ + +#ifndef SSCALE_H +#define SSCALE_H + +#include +#include +#include + +/*! + * \class SScale + * \brief Класс, описывающий шкалу спидометра + */ +class SScale : public QLabel +{ + +public: + + /*! + * \brief Конструктор. + * \param valVMax - максимальное значение скорости спидометра + * \param valVStep - шаг скорости + * \param arcSplitAngle - угол центра разрыва дуги + * \param arcSplitPoint - длина дуги-разрыва + */ + SScale(int valVMax, int valVStep, int arcSplitAngle, int arcSplitPoint, + QWidget *parent = Q_NULLPTR , QString config_dir = ""); + /// Деструктор + ~SScale(); + +private: + + /// Рисуем шкалу спидометра + void drawSScale_(); + + // --- элементы шкалы спидометра --- // + /// Второстепенные черточки + void drawMinorLines_(); + /// Точки на шкале + void drawPoints_(); + /// Значения скоростей + void drawValV_(); + /// Основная дуга + void drawArcMain_(); + /// Центральный круг + void drawCircleCener_(); + // --------------------------------- // + + QPainter paint_; ///< рисовальщик + + double w_2_; ///< половина ширины класса + double h_2_; ///< половина высоты класса + + /// Кол-во основных черточек на шкале спидометра + int countLines_; ///< = максимальное_значение_скорости/шаг + /// Шаг угла + double aStep_; + /// Угол стартовой точки (0 - начало шкалы спидометра) + double aZeroPoint_; + + + int valV_max_; ///< макс. скорость + int valV_step_; ///< шаг скорости + int arc_splitPoint_; ///< угол центра разрыва дуги + int arc_splitAngle_; ///< длина дуги-разрыва + + + // --- cfg параметры --- // + /// второстепенные черточки на шкале спидометра + bool minorLine_isDraw_; ///< рисовать ли черточки + QString minorLine_color_; ///< цвет + int minorLine_width_; ///< ширина + int minorLine_length_; ///< длина + int minorLine_count_; ///< кол-во черточек между основными черточками + + /// вспомогательные точки на шкале спидометра + bool points_isDraw_; ///< рисовать ли точки на спидометре + QString points_color_; ///< цвет + int points_width_; ///< диаметр + + /// значения скоростей на шкале спидометра + QString valV_color_; ///< цвет + int valV_fontSize_; ///< размер шрифта + int valV_margin_; ///< отступ от края дуги + + /// дуга шкалы спидометра + QString arc_color_; ///< цвет + int arc_width_; ///< ширина + + /// центральный круг спидометра + QString circleCener_color_; ///< цвет + int circleCener_width_; ///< диаметр + // --------------------- // + + + /// Чтение конфигураций + bool loadSScaleCfg(QString cfg_path); + + +}; + +#endif // SSCALE_H diff --git a/addons/ep20/blok-display/include/SScaleMajorLine.h b/addons/ep20/blok-display/include/SScaleMajorLine.h new file mode 100644 index 00000000..29e049a5 --- /dev/null +++ b/addons/ep20/blok-display/include/SScaleMajorLine.h @@ -0,0 +1,69 @@ +//----------------------------------------------------------------------------- +// +// Шкала спидометра. Основные линии на шкале +// (c) РГУПС, ВЖД 12/05/2017 +// Разработал: Даглдиян Б.Д. +// +//----------------------------------------------------------------------------- +/*! + * \file + * \brief Шкала спидометра. Основные линии на шкале + * \copyright РГУПС, ВЖД + * \author Даглдиян Б.Д. + * \date 12/05/2017 + */ + +#ifndef SSCALEMAJORLINE_H +#define SSCALEMAJORLINE_H + +#include +#include + +/*! + * \class SScaleMajorLine + * \brief Прорисовка основных линий скоростей на шкале спидометра + */ +class SScaleMajorLine : public QLabel +{ +public: + + /*! + * \brief Конструктор + * \param len - длина линии + * \param width - ширина линии + * \param color - цвет линии + * \param col - количество линий + * \param angleStep - угол шага линий + * \param angleZeroPoint - начальный угол + * \param arcLimitWidth - ширина дуги ограничения + */ + SScaleMajorLine( int len, int width, QColor color, int col, + double angleStep, double angleZeroPoint, + int arcLimitWidth, + QWidget* parent = Q_NULLPTR ); + /// Деструктор + ~SScaleMajorLine(); + + /// Нарисовать линии + void drawMajorLine(); + +private: + + QImage img_; ///< картинка для линий + + double w_2_; ///< половина ширины класса + double h_2_; ///< половина высоты класса + + + int lineLength_; ///< длина линии + int lineWidth_; ///< ширина линии + QColor lineColor_; ///< цвет линии + int lineCount_; ///< количество линий + double angleStep_; ///< шаг угла + double aZeroPoint_; ///< Угол стартовой точки (0 - начало шкалы спидометра) + int arcLimitWidth_; ///< ширина дуги ограничения + + +}; + +#endif // SSCALEMAJORLINE_H diff --git a/addons/ep20/blok-display/include/STriangle.h b/addons/ep20/blok-display/include/STriangle.h new file mode 100644 index 00000000..c53f6ea8 --- /dev/null +++ b/addons/ep20/blok-display/include/STriangle.h @@ -0,0 +1,66 @@ +//----------------------------------------------------------------------------- +// +// Спидометр. Треугольник ограничения +// (c) РГУПС, ВЖД 02/05/2017 +// Разработал: Даглдиян Б.Д. +// +//----------------------------------------------------------------------------- +/*! + * \file + * \brief Класс "Треугольник ограничения" спидометра + * \copyright РГУПС, ВЖД + * \author Даглдиян Б.Д. + * \date 02/05/2017 + */ + +#ifndef STRIANGLE_H +#define STRIANGLE_H + + +#include +#include + +/*! + * \class STriangle + * \brief Класс, описывающий треугольник ограничения спидометра + */ +class STriangle : public QLabel +{ + +public: + /// Конструктор + STriangle(QWidget *parent = Q_NULLPTR); + /// Деструктор + ~STriangle(); + + /*! + * \brief Вращение треугольника + * \param angle - угол поворота + */ + void setValSpeed(double angle); + + /*! + * \brief Установка параметров треугольника + * \param width - ширина основания + * \param length - длина треугольника + * \param color - цвет треугольника + */ + void setParameters(double width, double length, QColor color); + + +private: + QImage img_; ///< картинка + + /// Параметры треугольника ограничения спидометра + double widthTriangle_; ///< ширина основания + double lengthTriangle_; ///< длина + QColor colorTriangle_; ///< цвет + + + +}; + + + + +#endif // STRIANGLE_H diff --git a/addons/ep20/blok-display/include/Speedometer.h b/addons/ep20/blok-display/include/Speedometer.h new file mode 100644 index 00000000..9bc8f708 --- /dev/null +++ b/addons/ep20/blok-display/include/Speedometer.h @@ -0,0 +1,177 @@ +//----------------------------------------------------------------------------- +// +// Спидометр +// (c) РГУПС, ВЖД 31/03/2017 +// Разработал: Даглдиян Б.Д. +// +//----------------------------------------------------------------------------- +/*! + * \file + * \brief Класс элемента "Спидометр" + * \copyright РГУПС, ВЖД + * \author Даглдиян Б.Д. + * \date 31/03/2017 + */ + +#ifndef SPEEDOMETER_H +#define SPEEDOMETER_H + + +#include +#include +#include + +#include "SArrow.h" +//#include "STriangle.h" +#include "SScale.h" +#include "SScaleMajorLine.h" +#include "SArcLimit.h" + + +/*! + * \class Speedometer + * \brief Класс, описывающий спидометр + */ +class Speedometer : public QLabel +{ + Q_OBJECT + +public: + + /*! + * \brief Конструктор + * \param geo - геометрия элемента: размер, положение + */ + Speedometer(QRect geo, QWidget *parent = Q_NULLPTR, QString config_dir = ""); + /// Деструктор + ~Speedometer(); + + /*! + * \brief Установить текущую скорость + * \param speed - скорость + */ + void setSpeedCur(double speed); + +// /// Установить ограничение скорости +// void setSpeedLimit(int speedLimit); + + /*! + * \brief Установить ограничения скорости + * \param speedLimit - значение текущего ограничения + * \param nextSpeedLimit - значение следующего ограничения + */ + void setSpeedLimits(int speedLimit, int nextSpeedLimit); + +// /// Установить заданную скорость с рукоятки +// void setSpeed_Yellow(int speedLimit_Yellow); + +// /// Установить zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz +// void setSpeed_Red(int speedLimit_Red); + +public slots: + /// Моргание значения тек. скорости, при приближении к значению ограничения + void onTimer(); + +private: + QTimer* timerForBlink_; ///< таймер, для моргания значения тек. скорости + int timeCount_; ///< счетчик для таймера + + SArrow* sArrow_; ///< СТРЕЛКА +// STriangle* sTriangleYellow_; // ЖЕЛТЫЙ ТРЕУГОЛЬНИК +// STriangle* sTriangleRed_; // КРАСНЫЙ ТРЕУГОЛЬНИК + SScale* sScale_; ///< ШКАЛА + SScaleMajorLine* sScaleMajorLine_; ///< ОСНОВНЫЕ ЛИНИИ НА ШКАЛЕ + SArcLimit* sArcLimit_; ///< ДУГА ОГРАНИЧЕНИЯ + + /// виджет для отображения значения тек. скорости в центре спидометра + QLabel* labelValVCenter_; + /// виджет для отображения знач. ограничения скорости в центре спидометра + QLabel* labelSpeedLimit_; + + + int speedCurOld_i_; ///< предыдущая текущая скорость + double speedCurOld_d_; ///< предыдущая текущая скорость + int speedLimitOld_; ///< предыдущее ограничение скорости +// int speedRefOld_; ///< предыдущая заданная скорость с рукоятки +// int zzzOld_; ///< предыдущая zzzzzzzzzz +// int speedLimit_; ///< текущее значение ограничения скорости + + + double aBeginPoint_; ///< угол начальной точки (0 на шкале спидометра) + double aStep_; ///< шаг угла + + + // --- cfg параметры --- // + /// основные черточки на шкале спидометра + QString majorLine_color_; ///< цвет + int majorLine_width_; ///< ширина + int majorLine_length_; ///< длина + + + + int valV_max_; ///< макс. скорость + int valV_step_; ///< шаг скорости + int arc_splitAngle_; ///< длина дуги-разрыва + int arc_splitPoint_; ///< угол центра разрыва дуги + + + /// текущая скорость на центральном круге + int labelValVCenter_x_; ///< положение по оси OX + int labelValVCenter_y_; ///< положение по оси OY + QString labelValVCenter_color_; ///< цвет + int labelValVCenter_fontSize_; ///< размер шрифта + + /// ограничение скорости под центральным кругом спидометра + int labelSpeedLimit_x_; ///< положение по оси OX + int labelSpeedLimit_y_; ///< положение по оси OY + QString labelSpeedLimit_color_; ///< цвет + int labelSpeedLimit_fontSize_; ///< размер шрифта + + // --------------------- // + + // --- cfg параметры ТРЕУГОЛЬНИКА --- // + /// Параметры ЖЕЛТОГО ТРЕУГОЛЬНИКА + double widthTriangle_Yellow_; ///< ширина основания + double lengthTriangle_Yellow_; ///< длина треугольника + QString colorTriangle_Yellow_; ///< цвет треугольника + + /// Параметры КРАСНОГО ТРЕУГОЛЬНИКА + double widthTriangle_Red_; ///< ширина основания + double lengthTriangle_Red_; ///< длина треугольника + QString colorTriangle_Red_; ///< цвет треугольника + // --------------------- // + + + /*! + * \brief Отрисовка скорости на центральном круге спидометра + * \param label - видждет для отображения + * \param x - координата оси OX + * \param y - координата оси OY + * \param color - цвет + * \param fontSize - размер текста + */ + void myDrawValVCenter_( QLabel* label, int x, int y, QString color, + int fontSize ); + + + /*! + * \brief Установка границ скоростей + * \param valSpeed - значение текущей скорости + */ + inline double setSpeedRange_(double valSpeed); + + /*! + * \brief Парсинг значения скорости в 3х-значное число + * \param valSpeed - значение текущей скорости + * \return - текстовое 3х-значное значение текущей скорости + */ + inline QString parsSpeedCur_(double valSpeed); + + + /// Чтение конфигураций + bool loadSpeedometerCfg(QString cfg_path); + bool loadSTriangleCfg(QString cfg_path); + +}; + +#endif // SPEEDOMETER_H diff --git a/addons/ep20/blok-display/include/TopBlock.h b/addons/ep20/blok-display/include/TopBlock.h new file mode 100644 index 00000000..a72a0166 --- /dev/null +++ b/addons/ep20/blok-display/include/TopBlock.h @@ -0,0 +1,174 @@ +//----------------------------------------------------------------------------- +// +// Верхний блок БЛОКа +// (c) РГУПС, ВЖД 30/03/2017 +// Разработал: Даглдиян Б.Д. +// +//----------------------------------------------------------------------------- +/*! + * \file + * \brief Класс "Верхний блок" БЛОКа + * \copyright РГУПС, ВЖД + * \author Даглдиян Б.Д. + * \date 30/03/2017 + */ + +#ifndef TOPBLOCK_H +#define TOPBLOCK_H + +#include +#include + +#include "Speedometer.h" +#include "InformPart.h" +#include "InformPart2.h" +#include "InformPartPressure.h" +#include "InformPartTriangle.h" +#include "structures-BLOK.h" + +//----------------------------------------------------------------------------- +// Структура элементов информационного блока +//----------------------------------------------------------------------------- +struct ip_t +{ + QString coordinate; + QString station; + QString time; +// QString grafic; + QString P; + QString P2; + QString chanel; + QString numRoad; + QString acceleration; + QString distanceTargetSAUT; + QString coeffBraking; + QString distanceTarget; + QString typeTarget; + QString nameTarget; + QString zz; + + ip_t() + { + coordinate = "coordinate"; + station = "station"; + time = "time"; +// grafic = "grafic"; + P = "P"; + P2 = "P2"; + chanel = "chanel"; + numRoad = "numRoad"; + acceleration = "acceleration"; + distanceTargetSAUT = "distanceSAUT"; + coeffBraking = "coeffBraking"; + distanceTarget = "distance"; + typeTarget = "type"; + nameTarget = "name"; + zz = "zz"; + } +}; + +//----------------------------------------------------------------------------- +// Структура элементов информационного блока 2 +//----------------------------------------------------------------------------- +struct ip2_t +{ + QString BC; + QString TM; + QString UR; + + ip2_t() + { + BC = "BC"; + TM = "TM"; + UR = "UR"; + } +}; + + +/*! + * \class TopBlock + * \brief Класс, описывающий верхний блок БЛОКа + */ +class TopBlock : public QWidget +{ + Q_OBJECT + +public: + + /*! + * \brief Конструктор + * \param geo - размер и положение блока + */ + TopBlock(QRect geo, QWidget* parent = Q_NULLPTR, QString config_dir = ""); + /// Деструктор + ~TopBlock(); + + + /// Установить значения элементов информационного блока + void set_ipVal(ip_val_t* val); + + /// Установить значения элементов информационного блока 2 + void set_ip2Val(ip2_val_t* val); + + /// Зажечь "проверка бдительности" (жёлтый треугольник) + void setTriangleYellow(bool isSignal); + + /// зажечь ТСКБМ (красный треугольник) + void setTriangleRed(bool isSignal); + + /// Установить текущее и следующее ограничение скорости + void setSpeedLimits(int curSpeedLimit, int nextSpeedLimit); + + /// Установить текущую скорость + void setCurSpeed(double speed); + + +//private slots: +// void onTimer(); ///< Установить текущее время на блоке + +private: + /// Элемент блока информации + InformPart* informPart_; + /// элемент блока информации (давление) + InformPartPressure* ipPressureUR_; + InformPartPressure* ipPressureTM_; + InformPartPressure* ipPressureTC_; + /// Элемент блока информации (треугольник) + InformPartTriangle* ipTriangleRed_; + InformPartTriangle* ipTriangleYellow_; + InformPartTriangle* ipTriangle_; + /// Спидометр + Speedometer* speedometer_; + + /// Ассоциативный массив элементов информационных блоков + QMap informPartMap_; + +// QLabel* labelCurTime_; ///< виджет для отображения времени на блоке +// void drawCurentTime_(); ///< нарисовать элемент отображения времени блока + + ip_t* ip_; ///< структура элементов информационного блока + ip2_t* ip2_; ///< структура элементов информационного блока 2 + + + QString getCoordinateStr_(double coordinate); + QString getAccelerationStr_(double a); + + + // --- cfg параметры ТРЕУГОЛЬНИКА --- // + /// Параметры ЖЕЛТОГО ТРЕУГОЛЬНИКА + double widthTriangle_Yellow_; ///< ширина основания + double lengthTriangle_Yellow_; ///< длина треугольника + QString colorTriangle_Yellow_; ///< цвет треугольника + + /// Параметры КРАСНОГО ТРЕУГОЛЬНИКА + double widthTriangle_Red_; ///< ширина основания + double lengthTriangle_Red_; ///< длина треугольника + QString colorTriangle_Red_; ///< цвет треугольника + // --------------------- // + + /// Чтение конфигураций + bool loadIPTriangleCfg(QString cfg_path); + +}; + +#endif // TOPBLOCK_H diff --git a/addons/ep20/blok-display/include/blok-display.h b/addons/ep20/blok-display/include/blok-display.h new file mode 100644 index 00000000..f51197a3 --- /dev/null +++ b/addons/ep20/blok-display/include/blok-display.h @@ -0,0 +1,44 @@ +#ifndef BLOK_DISPLAY_H +#define BLOK_DISPLAY_H + +#include "display.h" +#include "blok-funcs.h" +#include "structures-BLOK.h" + +#include +#include + +#include "TopBlock.h" + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +class BlokDisplay : public AbstractDisplay +{ +public: + + BlokDisplay(QWidget *parent = Q_NULLPTR, + Qt::WindowFlags f = Qt::WindowFlags()); + + ~BlokDisplay(); + + void init(); + +private: + + QTimer *updateTimer; + + TopBlock *topBlock; + + structs_BLOK_t structsBLOK; + + void initMainWindow(); + + void initTopBlock(); + +private slots: + + void slotUpdateTimer(); +}; + +#endif // BLOK_DISPLAY_H diff --git a/addons/ep20/blok-display/include/blok-funcs.h b/addons/ep20/blok-display/include/blok-funcs.h new file mode 100644 index 00000000..4e8d70ef --- /dev/null +++ b/addons/ep20/blok-display/include/blok-funcs.h @@ -0,0 +1,12 @@ +#ifndef BLOK_FUNCS_H +#define BLOK_FUNCS_H + +#include +#include + +QString getConfigPath(QString config_name) +{ + return QDir::separator() + QString("BLOK") + QDir::separator() + config_name; +} + +#endif // BLOCK_FUNCS_H diff --git a/addons/ep20/blok-display/include/structures-BLOK.h b/addons/ep20/blok-display/include/structures-BLOK.h new file mode 100644 index 00000000..17e449a4 --- /dev/null +++ b/addons/ep20/blok-display/include/structures-BLOK.h @@ -0,0 +1,138 @@ +//----------------------------------------------------------------------------- +// +// Общая структура для приёма данных от сервера +// (c) РГУПС, ВЖД 06/06/2017 +// Разработал: Даглдиян Б.Д. +// +//----------------------------------------------------------------------------- +/*! + * \file + * \brief Общая структура для приёма данных от сервера + * \copyright РГУПС, ВЖД + * \author Даглдиян Б.Д. + * \date 06/06/2017 + */ + +#ifndef STRUCTURESBLOK_H +#define STRUCTURESBLOK_H + +#include +#include + +//----------------------------------------------------------------------------- +// Структура значений элементов информационного блока +//----------------------------------------------------------------------------- +#pragma pack(push, 1) +struct ip_val_t +{ + double coordinate; ///< координата + char time[9]; + char grafic[9]; +// QString P; +// QString P2; + char station[51]; ///< станция + char numRoad[15]; ///< номер пути + char chanel[7]; ///< канал + double acceleration; ///< ускорение + int distanceTargetSAUT; ///< расстояние до цели САУТ + double coeffBraking; ///< коэф. торм. + int distanceTarget; ///< расстояние до цели + char typeTarget[36]; ///< вид цели + char nameTarget[36]; ///< название цели + char zz[256]; ///< + + ip_val_t() + { + coordinate = 0.0; + strcpy(time, "00:00:00"); + strcpy(grafic, "00:00:00"); +// P; +// P2; + strcpy(station, "Станция1"); + strcpy(numRoad, "путь1"); + strcpy(chanel, "25Гц"); + acceleration = 0.01; + distanceTargetSAUT = 0; + coeffBraking = 0.0; + distanceTarget = 0; + strcpy(typeTarget, "Вид цели"); + strcpy(nameTarget, "Название цели"); + strcpy(zz, ""); + } +}; +#pragma pack(pop) + +//----------------------------------------------------------------------------- +// Структура значений элементов информационного блока 2 +//----------------------------------------------------------------------------- +#pragma pack(push, 1) +struct ip2_val_t +{ + double BC; ///< давление тормозного цилиндра + double TM; /// давление тормозной магистрали + double UR; /// давление уравнительного резервуара + + ip2_val_t() + { + BC = 0.5; + TM = 0.0; + UR = 0.0; + } +}; +#pragma pack(pop) + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +#pragma pack(push, 1) +struct other_val_t +{ + + bool signalControlLookOut; ///< сигнал "проверка бдительности" + bool signalTSKBM; ///< сигнал тевоги ТСКБМ + int curSpeedLimit; ///< текущее ограничение скорости + int nextSpeedLimit; ///< следующее ограничение скорости + double curSpeed; ///< текущая скорость поезда + short semaphor_color; ///< сигнал семафора + short semaphor_free_bloks; ///< + + other_val_t() + { + signalTSKBM = false; + signalControlLookOut = false; + curSpeedLimit = 0; + nextSpeedLimit = 0; + curSpeed = 0; + semaphor_color = 0; + semaphor_free_bloks = 1; + } +}; +#pragma pack(pop) + + +//----------------------------------------------------------------------------- +// Структура для приёма данных с сервера +//----------------------------------------------------------------------------- +#pragma pack(push, 1) +struct structs_BLOK_t +{ + bool wasSendData; ///< были ли отправленны данные с сервера + ip_val_t ip_val; + ip2_val_t ip2_val; + other_val_t other_val; + + structs_BLOK_t() + { + wasSendData = false; + } + +}; +#pragma pack(pop) + + + + +Q_DECLARE_METATYPE(structs_BLOK_t) + + +#endif // STRUCTURESBLOK_H diff --git a/addons/ep20/blok-display/resources/img/img-cassete.png b/addons/ep20/blok-display/resources/img/img-cassete.png new file mode 100644 index 00000000..798089ef Binary files /dev/null and b/addons/ep20/blok-display/resources/img/img-cassete.png differ diff --git a/addons/ep20/blok-display/resources/res.qrc b/addons/ep20/blok-display/resources/res.qrc new file mode 100644 index 00000000..5552e22f --- /dev/null +++ b/addons/ep20/blok-display/resources/res.qrc @@ -0,0 +1,5 @@ + + + img/img-cassete.png + + diff --git a/addons/ep20/blok-display/src/DisconnectionServer.cpp b/addons/ep20/blok-display/src/DisconnectionServer.cpp new file mode 100644 index 00000000..f5f29933 --- /dev/null +++ b/addons/ep20/blok-display/src/DisconnectionServer.cpp @@ -0,0 +1,77 @@ +//----------------------------------------------------------------------------- +// +// Экран потери связи +// (c) РГУПС, ВЖД 18/07/2017 +// Разработал: Даглдиян Б.Д. +// +//----------------------------------------------------------------------------- +/*! + * \file + * \brief Экран потери связи + * \copyright РГУПС, ВЖД + * \author Даглдиян Б.Д. + * \date 18/07/2017 + */ + +#include "DisconnectionServer.h" + + +//----------------------------------------------------------------------------- +// Конструктор +//----------------------------------------------------------------------------- +DisconnectionServer::DisconnectionServer(QSize size, QWidget *parent) + : QLabel(parent) +{ + this->resize(size); + + + QImage imgScreen(this->size(), QImage::Format_ARGB32_Premultiplied); + imgScreen.fill(Qt::transparent); + + QPainter paint(&imgScreen); + + + int fooX0 = this->width()/4; + int fooY0 = this->height()/4; + int fooPadd = 4; + int fooW = this->width()/2; + int fooH = this->height()/2; + + // Рисуем прямоугольники + paint.setBrush(Qt::black); + paint.drawRect(-1, -1, + this->width(), this->height()); + + paint.setBrush(Qt::red); + paint.drawRect(fooX0 - 1, fooY0 - 1, + fooW, fooH); + + paint.setBrush(Qt::black); + paint.drawRect(fooX0 + fooPadd - 1, fooY0 + fooPadd - 1, + fooW - fooPadd*2, fooH - fooPadd*2); + + paint.setBrush(Qt::red); + paint.drawRect(fooX0 + fooPadd*2 - 1, fooY0 + fooPadd*2 - 1, + fooW - fooPadd*4, fooH - fooPadd*4); + + // Выводим надпись + paint.setFont(QFont("Arial", 22, 86)); + paint.drawText(fooW - 170 , fooH, QString("Потеряна связь с КЛУБ")); + + + paint.end(); + + this->setPixmap(QPixmap::fromImage(imgScreen)); + +} + +//----------------------------------------------------------------------------- +// Деструктор +//----------------------------------------------------------------------------- +DisconnectionServer::~DisconnectionServer() +{ + +} + + + diff --git a/addons/ep20/blok-display/src/InformPart.cpp b/addons/ep20/blok-display/src/InformPart.cpp new file mode 100644 index 00000000..22ba29d8 --- /dev/null +++ b/addons/ep20/blok-display/src/InformPart.cpp @@ -0,0 +1,231 @@ +//----------------------------------------------------------------------------- +// +// Элемент блока информации +// (c) РГУПС, ВЖД 12/04/2017 +// Разработал: Даглдиян Б.Д. +// +//----------------------------------------------------------------------------- +/*! + * \file + * \brief Класс элемента блока информации + * \copyright РГУПС, ВЖД + * \author Даглдиян Б.Д. + * \date 12/04/2017 + */ + +#include "InformPart.h" +#include "CfgReader.h" + +const QString INFORMPART_CFG = "../cfg/BLOK/InformPart.xml"; + +//const QString CASSETE_IMG_PREFIX_ = ":/cassete/images/img-cassete/"; + +//----------------------------------------------------------------------------- +// Конструктор. Рисуем элементы информационного блока +//----------------------------------------------------------------------------- +InformPart::InformPart(QRect geo, QString strHead, QString strText, + Qt::Alignment align, + QWidget *parent , QString config_path, int marginLeft, bool isDrawX, bool isDrawO) : ImageLabel(parent) +{ + // устанавливаем геометрию класса + this->setGeometry(geo); + + // загружаем параметры с конфига + loadInformPartCfg(config_path + "InformPart.xml"); + + // 1. Текст-заголовок + QLabel* label_ = new QLabel("", this); + // задаем шрифт и размер + label_->setFont(QFont("Arial", fontSize_)); + // задаем цвет заголовка текста + label_->setStyleSheet( "color: "+ colorTextHead_ + ";" + + "font-weight: bold;" ); + // задаем геометрию + label_->setGeometry( 0, + 4, + this->width(), + label_->height() ); + // выравниваем по центру + label_->setAlignment(Qt::AlignCenter); + // сам текст + label_->setText(strHead); + + + // 2. Текст внутри прямоугольника + labelText_ = new QLabel("", this); + QFont font = labelText_->font(); + font.setStyleStrategy(QFont::NoAntialias); + labelText_->setFont(font); + // задаем шрифт и размер + labelText_->setFont(QFont("Arial", fontSize_)); + // задаем цвет текста + labelText_->setStyleSheet("color: "+ colorText_ + ";" + + "font-weight: bold;" + + "border: 2px solid "+ colorBorder_ +";"); + // задаем геометрию + labelText_->setGeometry( 0, + label_->height(), + this->width(), + this->height() - label_->height() ); + // выравниваем по центру + labelText_->setAlignment(align); + labelText_->setContentsMargins(QMargins(marginLeft,0,0,0)); + // сам текст + labelText_->setText(strText); + + if (isDrawX) + drawX(); + if (isDrawO) + drawO(); + +} + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +InformPart::~InformPart() +{ + +} + +//----------------------------------------------------------------------------- +// Установить текст в прямоугольнике элемента информационного блока +//----------------------------------------------------------------------------- +void InformPart::setText(QString strText) +{ + this->labelText_->setText(strText); +} + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void InformPart::setTextOverHead(QString headText, QRect geo) +{ + this->setGeometry(geo); + + labelTextOverHead_ = new QLabel("", this); + // задаем шрифт и размер + labelTextOverHead_->setFont(QFont("Arial", fontSize_)); + // задаем цвет заголовка текста + labelTextOverHead_->setStyleSheet( "color: "+ colorTextHead_ + ";" + + "font-weight: bold;"); + // задаем геометрию + labelTextOverHead_->setGeometry( 0, + 4, + 250, + labelTextOverHead_->height() ); + // выравниваем по центру + labelTextOverHead_->setAlignment(Qt::AlignCenter); + // сам текст + labelTextOverHead_->setText(headText); + +} + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void InformPart::setImgOverLabel() +{ + QPixmap pixmap(":/cassete/img-cassete"); + QLabel* labImg = new QLabel(this); + labImg->setGeometry(labelText_->geometry()); + labImg->setAlignment(Qt::AlignCenter); + labImg->setPixmap(pixmap); + +} + +//----------------------------------------------------------------------------- +// Нарисовать крестик +//----------------------------------------------------------------------------- +void InformPart::drawX() +{ + // создаем img с размером label + QImage img = QImage( this->size(), + QImage::Format_ARGB32_Premultiplied ); + + + img.fill(Qt::transparent); + + QPainter paint(&img); + paint.setRenderHint(QPainter::Antialiasing, true); + paint.setPen(QPen(QColor(255,0,0),3,Qt::SolidLine)); + + int fooMargLeft = 17; + int fooMargTop = this->height()/2 + 10; + int fooH = 10; + int fooW = 8; + paint.drawLine(fooMargLeft,fooMargTop, fooMargLeft+fooW,fooMargTop+fooH); + paint.drawLine(fooMargLeft+fooW,fooMargTop, fooMargLeft,fooMargTop+fooH); + + paint.end(); + + pm = QPixmap::fromImage(img); + this->setPixmap(&pm); +} + +//----------------------------------------------------------------------------- +// Нарисовать эллипс +//----------------------------------------------------------------------------- +void InformPart::drawO() +{ + // создаем img с размером label + QImage img = QImage( this->size(), + QImage::Format_ARGB32_Premultiplied ); + + + img.fill(Qt::transparent); + + QPainter paint(&img); + paint.setRenderHint(QPainter::Antialiasing, true); + paint.setPen(QPen(QColor(255,0,0),3,Qt::SolidLine)); + paint.setBrush(QColor(255,0,0)); + + paint.drawEllipse(QPoint(this->width()/2, this->height()/4*3-1), + this->width()/2-8, + this->height()/4-6); + + paint.end(); + pm = QPixmap::fromImage(img); + this->setPixmap(&pm); +} + +//----------------------------------------------------------------------------- +// Чтение конфигов +//----------------------------------------------------------------------------- +bool InformPart::loadInformPartCfg(QString cfg_path) +{ + CfgReader cfg; + + if (cfg.load(cfg_path)) + { + QString sectionName = "InformPart"; + + // --- параметры спидометра --- // + // цвет границы + if (!cfg.getString(sectionName, "colorBorder", colorBorder_)) + colorBorder_ = "#ffff00"; + // цвет текста-заголовка + if (!cfg.getString(sectionName, "colorTextHead", colorTextHead_)) + colorTextHead_ = "#ffff00"; + // цвет текста + if (!cfg.getString(sectionName, "colorText", colorText_)) + colorText_ = "#ffffff"; + // размер шрифта + if (!cfg.getInt(sectionName, "fontSize", fontSize_)) + fontSize_ = 16; + + } + else + { + // Параметры по умолчанию. + + // параметры спидометра + colorBorder_ = "#ffff00"; // цвет границы + colorTextHead_ = "#ffff00"; // цвет текста-заголовка + colorText_ = "#ffffff"; // цвет текста + fontSize_ = 16; // размер шрифта + + } + + return true; +} diff --git a/addons/ep20/blok-display/src/InformPart2.cpp b/addons/ep20/blok-display/src/InformPart2.cpp new file mode 100644 index 00000000..7cea1de6 --- /dev/null +++ b/addons/ep20/blok-display/src/InformPart2.cpp @@ -0,0 +1,148 @@ +//----------------------------------------------------------------------------- +// +// Элемент 2 блока информации +// (c) РГУПС, ВЖД 13/04/2017 +// Разработал: Даглдиян Б.Д. +// +//----------------------------------------------------------------------------- +/*! + * \file + * \brief Класс элемента блока информации + * \copyright РГУПС, ВЖД + * \author Даглдиян Б.Д. + * \date 13/04/2017 + */ + +#include "InformPart2.h" + +//----------------------------------------------------------------------------- +// Конструктор. Рисуем элементы информационного блока +//----------------------------------------------------------------------------- +InformPart2::InformPart2( QRect geo, QString strHead, + QWidget *parent ) : QLabel(parent) +{ + this->setGeometry(geo); + + // 1. Текст-заголовок + setTextLabel_( new QLabel("", this), + QRect(0,5,this->width(),this->height()/3), + QColor(255,255,0), + strHead ); + + // 2. Рисуем рамку + QLabel* label = new QLabel("", this); + label->setStyleSheet("border: 3px solid "+ QColor(255,255,0).name()); + label->setGeometry( 0, + this->height()/3, + this->width(), + this->height()*2/3 ); + + // 3. Рисуем тело элемента + drawBodyLabel_(); +} + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +InformPart2::~InformPart2() +{ + +} + +//----------------------------------------------------------------------------- +// Установить текст в прямоугольнике элемента информационного блока +//----------------------------------------------------------------------------- +void InformPart2::setVal(double val) +{ + // 1. Устанавливаем численное значение + QString val_str((qAbs(val) < 0.005)?("0"):(QString::number(val, 'f', 2))); + this->labelVal_->setText(val_str); + + // 2. Рисуем прогресс бар + imgBar_.fill(Qt::transparent); + + QPainter paint(&imgBar_); + + paint.setPen(QColor(255, 255, 255)); + paint.setBrush(QColor(255, 255, 255)); + + QPolygon rect; + rect << QPoint(0, 0) + << QPoint(0, labelBar_->height()) + << QPoint(labelBar_->width()*val, labelBar_->height()) + << QPoint(labelBar_->width()*val, 0); + + paint.drawPolygon(rect); + paint.end(); + + labelBar_->setPixmap(QPixmap::fromImage(imgBar_)); +} + +//----------------------------------------------------------------------------- +// Установить label +//----------------------------------------------------------------------------- +void InformPart2::setTextLabel_(QLabel* label, QRect geo, QColor color, QString str) +{ + // задаем шрифт и размер + label->setFont(QFont("Arial", 14)); + // задаем цвет текста + label->setStyleSheet( "color: "+ QColor(color).name() + ";" + + "font-weight: bold;" ); + // задаем геометрию + label->setGeometry(geo); + // выравниваем по центру + label->setAlignment(Qt::AlignCenter); + // сам текст + label->setText(str); +} + +//----------------------------------------------------------------------------- +// Нарисовать тело элемента +//----------------------------------------------------------------------------- +void InformPart2::drawBodyLabel_() +{ + // 1 - прогресс бар + labelBar_ = new QLabel("", this); + labelBar_->setStyleSheet("border: 2px solid white;"); + labelBar_->setGeometry( 10, + this->height()*2/3 + 4, + this->width() - 20, + 20 + 2 ); + imgBar_ = QImage(labelBar_->size(), QImage::Format_ARGB32_Premultiplied); + + QLabel* label; + // 1.1 - элемент "|" слева + label = new QLabel("", this); + label->setStyleSheet("border: 2px solid white;"); + label->setGeometry( labelBar_->x(), + labelBar_->y() - labelBar_->height() +4, + 2, + labelBar_->height() ); + // 1.2 - элемент "0" + setTextLabel_( new QLabel("", this), + QRect(labelBar_->x(), this->height()/2, 20, 25), + QColor(255,255,255), + "0" ); + + // 1.3 - элемент "|" справа + label = new QLabel("", this); + label->setStyleSheet("border: 2px solid white;"); + label->setGeometry( labelBar_->x() + labelBar_->width() - 2, + labelBar_->y() - labelBar_->height() +4, + 2, + labelBar_->height() ); + // 1.4 - элемент "1" + setTextLabel_( new QLabel("", this), + QRect(labelBar_->x() + labelBar_->width() - 20, this->height()/2, 20, 25), + QColor(255,255,255), + "1" ); + + // 2 - численное значение прогрес-бара + labelVal_ = new QLabel("", this); + setTextLabel_( labelVal_, + QRect(0, this->height()/3+2, this->width(), this->height()/4), + QColor(0,150,255), + "0.00" ); +} + + diff --git a/addons/ep20/blok-display/src/InformPartPressure.cpp b/addons/ep20/blok-display/src/InformPartPressure.cpp new file mode 100644 index 00000000..e62c2af0 --- /dev/null +++ b/addons/ep20/blok-display/src/InformPartPressure.cpp @@ -0,0 +1,139 @@ +//----------------------------------------------------------------------------- +// +// Элемент-давления блока информации +// (c) РГУПС, ВЖД 15/01/2020 +// Разработал: Даглдиян Б.Д. +// +//----------------------------------------------------------------------------- +/*! + * \file + * \brief Класс элемента-давления блока информации + * \copyright РГУПС, ВЖД + * \author Даглдиян Б.Д. + * \date 15/01/2020 + */ + +#include "InformPartPressure.h" + + +//----------------------------------------------------------------------------- +// Конструктор +//----------------------------------------------------------------------------- +InformPartPressure::InformPartPressure(QString strHead, QWidget *parent) + : ImageLabel(parent) +{ + this->setGeometry(0, 0, 70, 550); + this->setStyleSheet("border: 2px solid yellow;" + "color: white;" + "font-weight: bold;"); + + // --- ВЕРХНЯЯ ЧАСТЬ ЭЛЕМЕНТА --- // + QLabel* labelTop = new QLabel(this); + labelTop->setGeometry(0, 0, + this->width(), this->height()*0.8); + + double deltaY = (labelTop->height()-20)/5; + drawLabel("1.00", 3); + drawLabel("0.80", deltaY); + drawLabel("0.60", deltaY*2); + drawLabel("0.40", deltaY*3); + drawLabel("0.20", deltaY*4); + drawLabel("0.00", deltaY*5); + + QImage img(QSize(labelTop->width(), labelTop->height() - 10), + QImage::Format_ARGB32_Premultiplied); + img.fill(Qt::transparent); + QPainter paint(&img); + + paint.setBrush(QColor(255, 255, 255)); + QPolygon rect; + rect << QPoint(37, 0) + << QPoint(37, labelTop->height() - 13) + << QPoint(60, labelTop->height() - 13) + << QPoint(60, 0); + paint.drawPolygon(rect); + + paint.setPen(QColor(0, 0, 255)); + double deltaBarY = (labelTop->height() - 13)/10.0; + for (int i = 1; i < 10; ++i) + { + paint.drawLine((i%2 == 0) ? (38) : (50), deltaBarY*i, + 59, deltaBarY*i); + } + + paint.end(); + labelTop->setPixmap(QPixmap::fromImage(img)); + + // + labelPressureBar_ = new ImageLabel(this); + labelPressureBar_->setGeometry(labelTop->geometry()); + + img_ = QImage(QSize(labelTop->width(), labelTop->height() - 10), + QImage::Format_ARGB32_Premultiplied); + + + + + + + // --- НИЖНЯЯ ЧАСТЬ ЭЛЕМЕНТА --- // + QLabel* labelBottom = new QLabel(this); + labelBottom->setGeometry(0, labelTop->height(), + this->width(), this->height()*0.2); + labelBottom->setFont(QFont("Arial", 16)); + labelBottom->setStyleSheet("color: yellow"); + labelBottom->setAlignment(Qt::AlignTop | Qt::AlignHCenter); + labelBottom->setText(strHead); + + labelPressureVal_ = new QLabel("0,0", this); + labelPressureVal_->setGeometry(labelBottom->geometry()); + labelPressureVal_->setFont(QFont("Arial", 16)); + labelPressureVal_->setAlignment(Qt::AlignCenter); + + QLabel* label_MPa = new QLabel("МПа", this); + label_MPa->setGeometry(labelBottom->geometry()); + label_MPa->setFont(QFont("Arial", 16)); + label_MPa->setAlignment(Qt::AlignBottom | Qt::AlignHCenter); + +} + + + +//----------------------------------------------------------------------------- +// Установить значение давления +//----------------------------------------------------------------------------- +void InformPartPressure::setValPressure(double val) +{ + labelPressureVal_->setText(QString("%1").arg(val, 4, 'f', 2).replace('.', ',')); + + img_.fill(Qt::transparent); + QPainter paint(&img_); + paint.setPen(Qt::NoPen); + paint.setBrush(QColor(0, 150, 255)); + double pressureBarH = labelPressureBar_->height() - 13; + QPolygon rect; + rect << QPoint(43, (pressureBarH)*(1.0 - val)) + << QPoint(43, pressureBarH) + << QPoint(54, pressureBarH) + << QPoint(54, (pressureBarH)*(1.0 - val)); + paint.drawPolygon(rect); + paint.end(); + pm = QPixmap::fromImage(img_); + labelPressureBar_->setPixmap(&pm); +} + + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void InformPartPressure::drawLabel(QString val, int posY) +{ + QLabel* label = new QLabel(val, this); + label->setFont(QFont("Arial", 10)); + label->setStyleSheet("border: none"); + label->move(7, posY); + +} + + diff --git a/addons/ep20/blok-display/src/InformPartTriangle.cpp b/addons/ep20/blok-display/src/InformPartTriangle.cpp new file mode 100644 index 00000000..d0088a57 --- /dev/null +++ b/addons/ep20/blok-display/src/InformPartTriangle.cpp @@ -0,0 +1,136 @@ +//----------------------------------------------------------------------------- +// +// Элемент блока информации (треугольник) +// (c) РГУПС, ВЖД 14/04/2017 +// Разработал: Даглдиян Б.Д. +// +//----------------------------------------------------------------------------- +/*! + * \file + * \brief Класс элемента блока информации (треугольник) + * \copyright РГУПС, ВЖД + * \author Даглдиян Б.Д. + * \date 14/04/2017 + */ + +#include "InformPartTriangle.h" +#include + + +//----------------------------------------------------------------------------- +// Конструктор. Рисуем элементы информационного блока +//----------------------------------------------------------------------------- +InformPartTriangle::InformPartTriangle(QPoint pos, int size, QColor color, + QWidget *parent) : QLabel(parent) +{ + colorTriangle_ = color; + + // устанавливаем геометрию класса + this->setGeometry(pos.x(), pos.y(), size, size*0.8); + + +// labelTriangle_ = new QLabel("", this); +// // задаем геометрию +// labelTriangle_->setGeometry( 0, +// 0, +// this->width(), +// this->height() ); + + // создаем img с размером label + imgTriangle_ = QImage( this->size(), + QImage::Format_ARGB32_Premultiplied ); + + setTriangle(0, false, false); +} + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +InformPartTriangle::~InformPartTriangle() +{ + +} + +//----------------------------------------------------------------------------- +// Прорисовка треугольника +//----------------------------------------------------------------------------- +void InformPartTriangle::setTriangle(int angle, bool isBrush, + bool drawCircle, bool drawStr) +{ + imgTriangle_.fill(Qt::transparent); + + QPainter paint(&imgTriangle_); + paint.setPen(QPen(colorTriangle_,1,Qt::SolidLine)); + paint.setRenderHint(QPainter::Antialiasing, true); + + + if (isBrush) + { + paint.setBrush(colorTriangle_); + drawTriangle_(paint, 1, 1); + } + else + { + int j = 0; + for (int i = 1; i <= 5; i++) + { + if (i % 2 == 0) + j++; + + drawTriangle_(paint, i, j); + } + } + + if (drawCircle) + drawCircle_(paint); + + if (drawStr) + drawText(paint, "ТСКБМ"); + + paint.end(); + + this->setPixmap(QPixmap::fromImage(imgTriangle_) + .transformed( QTransform().rotate(angle), + Qt::SmoothTransformation) ); + +} + +//----------------------------------------------------------------------------- +// Нарисовать треугольник +//----------------------------------------------------------------------------- +void InformPartTriangle::drawTriangle_(QPainter &paint, int i, int j) +{ + QPolygon triangle; + triangle << QPoint(i, j) + << QPoint(this->width()-i, j) + << QPoint(this->width()/2, this->height() - i); + paint.drawPolygon(triangle); +} + +//----------------------------------------------------------------------------- +// Нарисовать круг в треугольнике +//----------------------------------------------------------------------------- +void InformPartTriangle::drawCircle_(QPainter &paint) +{ + // 1. указываем цвет, толщину и стиль линии + paint.setPen(QPen( QColor(255,0,0), + this->width()/4, + Qt::SolidLine, + Qt::RoundCap )); + // рисуем круг + paint.drawPoint(this->width()/2, this->height()*0.4); // (1-1/qSqrt(3))* +} + +//----------------------------------------------------------------------------- +// Нарисовать текст в треугольнике +//----------------------------------------------------------------------------- +void InformPartTriangle::drawText(QPainter &paint, QString str) +{ + paint.setPen(QPen(QColor(255,255,255))); + paint.setFont(QFont("Arial",10,87)); + paint.drawText( QRect( this->width()/2-str.size()*4.5, + this->height()/5, + this->width(), + this->height() ), + str); +} diff --git a/addons/ep20/blok-display/src/SArcLimit.cpp b/addons/ep20/blok-display/src/SArcLimit.cpp new file mode 100644 index 00000000..a3c65d0c --- /dev/null +++ b/addons/ep20/blok-display/src/SArcLimit.cpp @@ -0,0 +1,160 @@ +//----------------------------------------------------------------------------- +// +// Спидометр. Дуга ограничения +// (c) РГУПС, ВЖД 31/03/2017 +// Разработал: Даглдиян Б.Д. +// +//----------------------------------------------------------------------------- +/*! + * \file + * \brief Класс "Дуга ограничения" спидометра + * \copyright РГУПС, ВЖД + * \author Даглдиян Б.Д. + * \date 04/05/2017 + */ + +#include "SArcLimit.h" +#include "CfgReader.h" +#include "qmath.h" + +const QString SARCLIMIT_CFG = "../cfg/BLOK/SArcLimit.xml"; + +const double EPS = 0.0001; + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +SArcLimit::SArcLimit( int valVMax, int arcSplitAngle, int arcSplitPoint, + QWidget *parent, QString config_dir ) : QLabel(parent) +{ + this->resize(parent->size()); + + // установить максимальное значение скорости спидометра + this->valVMax_ = valVMax; + // установить угол центра разрыва дуги + this->arcSplitAngle_ = arcSplitAngle; + // установить длину дуги-разрыва + this->arcSplitPoint_ = arcSplitPoint; + + // загружаем параметры с конфига + loadSArcLimitCfg(config_dir + "SArcLimit.xml"); + + // создаем img размером с widget + img_ = QImage( this->size(), + QImage::Format_ARGB32_Premultiplied ); + +} + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +SArcLimit::~SArcLimit() +{ + +} + +//----------------------------------------------------------------------------- +// Нарисовать дугу ограничения скорости +//----------------------------------------------------------------------------- +void SArcLimit::setValSpeedLimit(double curSpeedLimit, double nextSpeedLimit) +{ // Богос. Требуется рефакторинг. + curSpeedLimit += 2; + + img_.fill(Qt::transparent); + // создаем и загружаем pixmap с картинки img_ + QPixmap pixSpeedLimit = QPixmap::fromImage(img_); + // передаем ссылку на pixmap в QPainter + QPainter paintSL(&pixSpeedLimit); + // повышаем качество рисовки + paintSL.setRenderHint(QPainter::Antialiasing, true); + + + QRectF rectangleSpeedLimit(30, 30, this->width()-60, this->height()-60); + + // значение угла максимальной скорости на шкале + double foo_a_maxSpeed = arcSplitPoint_ + arcSplitAngle_/2; + // значение шага скорости дуги шкалы (т.е. сколько градусов в 1 км/ч?) + double foo_a_step = (360.0 - arcSplitAngle_)/valVMax_; + + // значение угла значения ограничения + double foo_a = foo_a_maxSpeed /*+ arcLimit_width_/8*/ + + (valVMax_ - curSpeedLimit)*foo_a_step; + + + // --- рисуем желтую дугу ограничения --- // + double foo_aLen = 0; // значение длины дуги ограничения + if (nextSpeedLimit < curSpeedLimit) + foo_aLen = (curSpeedLimit - nextSpeedLimit)*foo_a_step - arcLimit_width_/8/**2*/; + else + foo_aLen = (2)*foo_a_step - arcLimit_width_/8/**2*/; + + paintSL.setPen(QPen( QColor(arcLimitNext_color_), + arcLimit_width_, + Qt::SolidLine )); + paintSL.drawArc( rectangleSpeedLimit, + (foo_a)*16, + (foo_aLen)*16 ); + // -------------------------------------- // + + // --- рисуем красную дугу ограничения --- // + paintSL.setPen(QPen( QColor(arcLimit_color_), + arcLimit_width_, + Qt::SolidLine )); + paintSL.drawArc( rectangleSpeedLimit, + (foo_a_maxSpeed + arcLimit_width_/8)*16, + ( 360 - arcSplitAngle_ - arcLimit_width_/8*2 - + curSpeedLimit*foo_a_step )*16 ); + // --------------------------------------- // + + paintSL.end(); + + this->setPixmap(pixSpeedLimit); + +} + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +int SArcLimit::getArcLimitWidth() +{ + return this->arcLimit_width_; +} + +//----------------------------------------------------------------------------- +// Чтение конфигураций дуги ограничения шкалы спидометра +//----------------------------------------------------------------------------- +bool SArcLimit::loadSArcLimitCfg(QString cfg_path) +{ + CfgReader cfg; + + if (cfg.load(cfg_path)) + { + + QString sectionName = "SArcLimit"; + + // --- параметры дуги ограничения шкалы спидометра --- // + // ширина линии + if (!cfg.getInt(sectionName, "arcLimit_width", arcLimit_width_)) + arcLimit_width_ = 4; + // цвет + if (!cfg.getString(sectionName, "arcLimit_color", arcLimit_color_)) + arcLimit_color_ = "#ff3232"; + // цвет + if (!cfg.getString(sectionName, "arcLimitNext_color", arcLimitNext_color_)) + arcLimitNext_color_ = "#ffff50"; + + + } + else + { + // Параметры по умолчанию. + + // параметры дуги ограничения шкалы спидометра + arcLimit_width_ = 4; // ширина линии + arcLimit_color_ = "#ff3232"; // цвет + arcLimitNext_color_ = "#ffff50"; // цвет + + } + + return true; +} diff --git a/addons/ep20/blok-display/src/SArrow.cpp b/addons/ep20/blok-display/src/SArrow.cpp new file mode 100644 index 00000000..af026478 --- /dev/null +++ b/addons/ep20/blok-display/src/SArrow.cpp @@ -0,0 +1,119 @@ +//----------------------------------------------------------------------------- +// +// Спидометр. Стрелка +// (c) РГУПС, ВЖД 02/05/2017 +// Разработал: Даглдиян Б.Д. +// +//----------------------------------------------------------------------------- +/*! + * \file + * \brief Класс "Стрелка" спидометра + * \copyright РГУПС, ВЖД + * \author Даглдиян Б.Д. + * \date 02/05/2017 + */ + +#include "SArrow.h" +#include "CfgReader.h" +#include "qmath.h" + +const QString SARROW_CFG = "../cfg/BLOK/SArrow.xml"; + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +SArrow::SArrow(QWidget *parent, QString config_dir) : QLabel(parent) +{ + this->resize( parent->size() ); + w_2_ = this->width()/2.0; + h_2_ = this->height()/2.0; + + // загружаем параметры с конфига + loadSArrowCfg(config_dir + "SArrow.xml"); + + img_ = QImage( this->size(), + QImage::Format_ARGB32_Premultiplied ); + +} + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +SArrow::~SArrow() +{ + +} + +//----------------------------------------------------------------------------- +// Вращение стрелки +//----------------------------------------------------------------------------- +void SArrow::setValSpeed(double angle) +{ + img_.fill(Qt::transparent); + + QPainter paint(&img_); + // указываем цвет границы + paint.setPen(QPen(QColor(color_), 1, Qt::SolidLine)); + // указываем цвет заливки + paint.setBrush(QColor(color_)); + // повышаем качество рисовки + paint.setRenderHint(QPainter::Antialiasing, true); + + + angle = qDegreesToRadians(angle); + double fooAngle = qDegreesToRadians(90.0); + // длина стрелки + double r = kLength_; + // половина ширины основания стрелки + double r2 = width_; + + QPolygonF triangle; + triangle << QPointF( w_2_ + (w_2_*r)*cos(angle), + h_2_ + (h_2_*r)*sin(angle) ) + << QPointF( w_2_ + r2*cos(angle+fooAngle), + h_2_ + r2*sin(angle+fooAngle) ) + << QPointF( w_2_ + r2*cos(angle-fooAngle), + h_2_ + r2*sin(angle-fooAngle) ); + + paint.drawPolygon(triangle); + paint.end(); + + this->setPixmap(QPixmap::fromImage(img_)); + +} + +//----------------------------------------------------------------------------- +// Чтение конфига +//----------------------------------------------------------------------------- +bool SArrow::loadSArrowCfg(QString cfg_path) +{ + CfgReader cfg; + + if (cfg.load(cfg_path)) + { + QString sectionName = "SArrow"; + + // коэфициент длины стрелки (от ширины спидометра) + if (!cfg.getDouble(sectionName, "koef_length", kLength_)) + kLength_ = 0.8; + // ширина основания стрелки + if (!cfg.getDouble(sectionName, "width", width_)) + width_ = 6.0; + // цвет стрелки спидометра + if (!cfg.getString(sectionName, "color", color_)) + color_ = "#ffffff"; + + } + else + { + // Параметры по умолчанию. + // стрелка спидометра + kLength_ = 0.8; // коэфициент длины стрелки (от ширины спидометра) + width_ = 6.0; // ширина основания стрелки + color_ = "#ffffff"; // цвет стрелки спидометра + + } + + return true; +} diff --git a/addons/ep20/blok-display/src/SScale.cpp b/addons/ep20/blok-display/src/SScale.cpp new file mode 100644 index 00000000..cfbe1612 --- /dev/null +++ b/addons/ep20/blok-display/src/SScale.cpp @@ -0,0 +1,334 @@ +//----------------------------------------------------------------------------- +// +// Спидометр. Шкала +// (c) РГУПС, ВЖД 03/05/2017 +// Разработал: Даглдиян Б.Д. +// +//----------------------------------------------------------------------------- +/*! + * \file + * \brief Класс "Шкала" спидометра + * \copyright РГУПС, ВЖД + * \author Даглдиян Б.Д. + * \date 03/05/2017 + */ + +#include "SScale.h" +#include "CfgReader.h" +#include "math.h" + +const QString SSCALE_CFG = "../cfg/BLOK/SScale.xml"; + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +SScale::SScale( int valVMax, int valVStep, int arcSplitAngle, int arcSplitPoint, + QWidget *parent, QString config_dir ) : QLabel(parent) +{ + this->resize( parent->size() ); + w_2_ = this->width()/2.0; + h_2_ = this->height()/2.0; + + // установить максимальное значение скорости спидометра + this->valV_max_ = valVMax; + // установить шаг значения скоростей на шкале спидометра + this->valV_step_ = valVStep; + // установить угол центра разрыва дуги + this->arc_splitAngle_ = arcSplitAngle; + // установить длину дуги-разрыва + this->arc_splitPoint_ = arcSplitPoint; + + /******************************************** + * форумулы нахождения точки на окружности + * x = x0 + r*cos(a) + * y = y0 + r*sin(a) + ********************************************/ + + // загружаем параметры с конфига + loadSScaleCfg(config_dir + "SScale.xml"); + + // округляем значение макс. скорости на велечину шага + if ( valV_max_ % valV_step_ != 0 ) + valV_max_ = valV_max_ + valV_step_ - (valV_max_ % valV_step_); + + // кол-во основных черточек + countLines_ = valV_max_/valV_step_; // Богос. вытащить + // шаг угла + aStep_ = (360.0 - arc_splitAngle_)/countLines_; // Богос. вытащить + // угол стартовой точки (0 - начало шкалы спидометра) + aZeroPoint_ = arc_splitPoint_ - arc_splitAngle_/2; // Богос. вытащить + + // рисуем шкалу спидометра + drawSScale_(); + +} + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +SScale::~SScale() +{ + +} + +//----------------------------------------------------------------------------- +// Рисуем шкалу спидометра +//----------------------------------------------------------------------------- +void SScale::drawSScale_() +{ + // создаем img размером с widget + QImage img = QImage( this->size(), + QImage::Format_ARGB32_Premultiplied ); + // делаем его прозрачным + img.fill(Qt::transparent); + // создаем и загружаем pixmap с картинки img + QPixmap pix = QPixmap::fromImage(img); + // передаем ссылку на pixmap в QPainter + paint_.begin(&pix); + // повышаем качество рисовки + paint_.setRenderHint(QPainter::Antialiasing, true); + + + // --- рисуем элементы шкалы спидометра --- // + + // рисуем второстепенные черточки + if (minorLine_isDraw_) + drawMinorLines_(); + // рисуем точки + if (points_isDraw_) + drawPoints_(); + // рисуем значения скоростей + drawValV_(); + // рисуем основную дугу шкалы спидометра + drawArcMain_(); + // рисуем центральный круг спидометра + drawCircleCener_(); + + // ---------------------------------------- // + + paint_.end(); + this->setPixmap(pix); + +} + +//----------------------------------------------------------------------------- +// Второстепенные черточки +//----------------------------------------------------------------------------- +void SScale::drawMinorLines_() +{ + for (int i = 0; i < countLines_; i++) + { + + for (int j = 1; j < (minorLine_count_ + 1); j++) + { + double angle = i*aStep_ + + j*aStep_/(minorLine_count_ + 1) - + aZeroPoint_; + angle = qDegreesToRadians(angle); + + // радиус круга + double r = - 31 - (26 - minorLine_length_)/2; // Богос (26 = "majorLine_length") + // радиус "внутреннего" круга + double r2 = - 31 - (26 + minorLine_length_)/2; // Богос (26 = "majorLine_length") + + // 1. указываем цвет, толщину и стиль линии + paint_.setPen(QPen( QColor(minorLine_color_), + minorLine_width_, + Qt::SolidLine, + Qt::RoundCap )); + + // 2. рисуем линию + paint_.drawLine( w_2_ + (w_2_ + r)*cos(angle), + h_2_ + (h_2_ + r)*sin(angle), + w_2_ + (w_2_ + r2)*cos(angle), + h_2_ + (h_2_ + r2)*sin(angle) ); + + } + } +} + +//----------------------------------------------------------------------------- +// Точки на шкале +//----------------------------------------------------------------------------- +void SScale::drawPoints_() +{ + for (int i = 0; i < countLines_; i++) + { + double angle = (i + 0.5)*aStep_ - aZeroPoint_; + angle = qDegreesToRadians(angle); + + // радиус круга + double r = - 20 - (26 + minorLine_length_); // Богос (26 = "majorLine_length") + + // 1. указываем цвет, толщину и стиль линии + paint_.setPen(QPen( QColor(points_color_), + points_width_, + Qt::SolidLine, + Qt::RoundCap )); + + // 2. рисуем линию + paint_.drawPoint( w_2_ + (w_2_ + r)*cos(angle), + h_2_ + (h_2_ + r)*sin(angle) ); + } + +} + +//----------------------------------------------------------------------------- +// Значения скоростей +//----------------------------------------------------------------------------- +void SScale::drawValV_() +{ + double r = - 10 - valV_margin_; + + // 1. указываем цвет текста + paint_.setPen(QPen(QColor(valV_color_))); + + // 2. указываем шрифт, размер и "жирность" + paint_.setFont(QFont("Arial", valV_fontSize_, 75)); + + // 3. рисуем текст + for (int i = 0; i <= countLines_; i++) + { + double angle = i*aStep_ - aZeroPoint_; + angle = qDegreesToRadians(angle); + + paint_.drawText( (w_2_ - 20) + (w_2_ + r)*cos(angle), + (h_2_ + 10) + (h_2_ + r)*sin(angle), + QString::number(i*valV_step_) ); + } + +} + + +//----------------------------------------------------------------------------- +// Основная дуга +//----------------------------------------------------------------------------- +void SScale::drawArcMain_() +{ + paint_.setPen(QPen( QColor(arc_color_), + arc_width_, + Qt::SolidLine )); + QRectF rectangle(30, 30, this->width()-60, this->height()-60); + paint_.drawArc( rectangle, + (arc_splitPoint_ + arc_splitAngle_/2 + arc_width_/8)*16, + (360 - arc_splitAngle_ - arc_width_/8*2)*16 ); + +} + +//----------------------------------------------------------------------------- +// Центральный круг +//----------------------------------------------------------------------------- +void SScale::drawCircleCener_() +{ + paint_.setPen(QPen( QColor(circleCener_color_), + circleCener_width_, + Qt::SolidLine, + Qt::RoundCap )); + paint_.drawPoint( this->width()/2, + this->height()/2 ); + +} + + +//----------------------------------------------------------------------------- +// Чтение конфига +//----------------------------------------------------------------------------- +bool SScale::loadSScaleCfg(QString cfg_path) +{ + CfgReader cfg; + + if (cfg.load(cfg_path)) + { + QString sectionName = "SScale"; + + // --- второстепенные черточки на шкале спидометра --- // + // рисовать ли черточки + if (!cfg.getBool(sectionName, "minorLine_isDraw", minorLine_isDraw_)) + minorLine_isDraw_ = true; + // цвет + if (!cfg.getString(sectionName, "minorLine_color", minorLine_color_)) + minorLine_color_ = "#ffffff"; + // ширина + if (!cfg.getInt(sectionName, "minorLine_width", minorLine_width_)) + minorLine_width_ = 2; + // длина + if (!cfg.getInt(sectionName, "minorLine_length", minorLine_length_)) + minorLine_length_ = 10; + // количество черточек между основными черточками + if (!cfg.getInt(sectionName, "minorLine_count", minorLine_count_)) + minorLine_count_ = 4; + + // --- вспомогательные точки на шкале спидометра --- // + // рисовать ли точки на спидометре + if (!cfg.getBool(sectionName, "points_isDraw", points_isDraw_)) + points_isDraw_ = false; + // цвет + if (!cfg.getString(sectionName, "points_color", points_color_)) + points_color_ = "#ffffff"; + // диаметр + if (!cfg.getInt(sectionName, "points_width", points_width_)) + points_width_ = 5; + + // --- значения скоростей на шкале спидометра --- // + // цвет + if (!cfg.getString(sectionName, "valV_color", valV_color_)) + valV_color_ = "#ffffff"; + // размер шрифта + if (!cfg.getInt(sectionName, "valV_fontSize", valV_fontSize_)) + valV_fontSize_ = 20; + // отступ от края дуги + if (!cfg.getInt(sectionName, "valV_margin", valV_margin_)) + valV_margin_ = 70; + + // --- дуга шкалы спидометра --- // + // цвет + if (!cfg.getString(sectionName, "arc_color", arc_color_)) + arc_color_ = "#ffffff"; + // ширина + if (!cfg.getInt(sectionName, "arc_width", arc_width_)) + arc_width_ = 4; + + // --- центральный круг спидометра --- // + // цвет + if (!cfg.getString(sectionName, "circleCener_color", circleCener_color_)) + circleCener_color_ = "#ffffff"; + // диаметр + if (!cfg.getInt(sectionName, "circleCener_width", circleCener_width_)) + circleCener_width_ = 70; + + } + else + { + // Параметры по умолчанию. + + // второстепенные черточки на шкале спидометра + minorLine_isDraw_ = true; // рисовать ли черточки + minorLine_color_ = "#ffffff"; // цвет + minorLine_width_ = 2; // ширина + minorLine_length_ = 10; // длина + minorLine_count_ = 4; // кол-во черточек + + // вспомогательные точки на шкале спидометра + points_isDraw_ = false; // рисовать ли точки на спидометре + points_color_ = "#ffffff"; // цвет + points_width_ = 5; // диаметр + + // значения скоростей на шкале спидометра + valV_color_ = "#ffffff"; // цвет + valV_fontSize_ = 20; // размер шрифта + valV_margin_ = 70; // отступ от края дуги + + // дуга шкалы спидометра --- // + arc_color_ = "#ffffff"; // цвет + arc_width_ = 4; // ширина + + + // центральный круг спидометра + circleCener_color_ = "#ffffff"; // цвет + circleCener_width_ = 70; // диаметр + + } + + return true; +} diff --git a/addons/ep20/blok-display/src/SScaleMajorLine.cpp b/addons/ep20/blok-display/src/SScaleMajorLine.cpp new file mode 100644 index 00000000..0200c4ed --- /dev/null +++ b/addons/ep20/blok-display/src/SScaleMajorLine.cpp @@ -0,0 +1,97 @@ +//----------------------------------------------------------------------------- +// +// Шкала спидометра. Основные линии на шкале +// (c) РГУПС, ВЖД 12/05/2017 +// Разработал: Даглдиян Б.Д. +// +//----------------------------------------------------------------------------- +/*! + * \file + * \brief Шкала спидометра. Основные линии на шкале + * \copyright РГУПС, ВЖД + * \author Даглдиян Б.Д. + * \date 12/05/2017 + */ + +#include "SScaleMajorLine.h" +#include + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +SScaleMajorLine::SScaleMajorLine( int len, int width, QColor color, int col, + double angleStep, double angleZeroPoint, + int arcLimitWidth, + QWidget *parent ) : QLabel(parent) +{ + this->resize( parent->size() ); + + w_2_ = this->width()/2.0; + h_2_ = this->height()/2.0; + + this->lineLength_ = len; + this->lineWidth_ = width; + this->lineColor_ = color; + this->lineCount_ = col; + this->angleStep_ = angleStep; + this->aZeroPoint_ = angleZeroPoint; + this->arcLimitWidth_ = arcLimitWidth; + + // создаем img размером с widget + img_ = QImage( this->size(), + QImage::Format_ARGB32_Premultiplied ); + +} + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +SScaleMajorLine::~SScaleMajorLine() +{ + +} + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +void SScaleMajorLine::drawMajorLine() +{ + img_.fill(Qt::transparent); + // создаем и загружаем pixmap с картинки img_ + QPixmap pix = QPixmap::fromImage(img_); + // передаем ссылку на pixmap в QPainter + QPainter paint(&pix); + // повышаем качество рисовки + paint.setRenderHint(QPainter::Antialiasing, true); + + + for (int i = 0; i <= lineCount_; i++) + { + double angle = i*angleStep_ - aZeroPoint_; + angle = qDegreesToRadians(angle); + + // радиус круга + double r = - 28 + arcLimitWidth_/2; + // радиус "внутреннего" круга + double r2 = - 28 + arcLimitWidth_/2 - lineLength_; + + // 1. указываем цвет, толщину и стиль линии + paint.setPen(QPen( QColor(lineColor_), + lineWidth_, + Qt::SolidLine, + Qt::RoundCap )); + + // 2. рисуем линию + paint.drawLine( w_2_ + (w_2_ + r)*cos(angle), + h_2_ + (h_2_ + r)*sin(angle), + w_2_ + (w_2_ + r2)*cos(angle), + h_2_ + (h_2_ + r2)*sin(angle) ); + + } + + + paint.end(); + + this->setPixmap(pix); +} + diff --git a/addons/ep20/blok-display/src/STriangle.cpp b/addons/ep20/blok-display/src/STriangle.cpp new file mode 100644 index 00000000..a28fb684 --- /dev/null +++ b/addons/ep20/blok-display/src/STriangle.cpp @@ -0,0 +1,104 @@ +//----------------------------------------------------------------------------- +// +// Спидометр. Треугольник ограничения +// (c) РГУПС, ВЖД 02/05/2017 +// Разработал: Даглдиян Б.Д. +// +//----------------------------------------------------------------------------- +/*! + * \file + * \brief Класс "Треугольник ограничения" спидометра + * \copyright РГУПС, ВЖД + * \author Даглдиян Б.Д. + * \date 02/05/2017 + */ + +#include "STriangle.h" +#include "qmath.h" + + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +STriangle::STriangle(QWidget *parent) : QLabel(parent) +{ + this->resize( parent->size() ); + + // инициализация (параметры треугольника по умолчанию) + widthTriangle_ = 6.0; + lengthTriangle_ = 20.0; + colorTriangle_ = QColor(255,255,255); + + + img_ = QImage( this->size(), + QImage::Format_ARGB32_Premultiplied ); + + +} + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +STriangle::~STriangle() +{ + +} + +//----------------------------------------------------------------------------- +// Вращение треугольника +//----------------------------------------------------------------------------- +void STriangle::setValSpeed(double angle) +{ + img_.fill(Qt::transparent); + + QPainter paint(&img_); + // указываем цвет границы + paint.setPen(QPen(QColor(colorTriangle_), 1, Qt::SolidLine)); + // указываем цвет заливки + paint.setBrush(QColor(colorTriangle_)); + // повышаем качество рисовки + paint.setRenderHint(QPainter::Antialiasing, true); + + + + angle = qDegreesToRadians(angle); + double fooAngle = qDegreesToRadians(90.0); + // положение середины основания треугольника + double x0 = this->width()/2.0 + ((this->width() - 50)/2.0)*cos(angle) + lengthTriangle_*cos(angle), + // положение середины основания треугольника + y0 = this->height()/2.0 + ((this->height() - 50)/2.0)*sin(angle) + lengthTriangle_*sin(angle), + // длина треугольника + r = -lengthTriangle_, + // половина ширины основания треугольника + r2 = widthTriangle_; + + QPolygonF triangle; + triangle << QPointF( x0 + r*cos(angle), + y0 + r*sin(angle) ) + << QPointF( x0 + r2*cos(angle+fooAngle), + y0 + r2*sin(angle+fooAngle) ) + << QPointF( x0 + r2*cos(angle-fooAngle), + y0 + r2*sin(angle-fooAngle) ); + + + paint.drawPolygon(triangle); + paint.end(); + + this->setPixmap(QPixmap::fromImage(img_)); + +} + +//----------------------------------------------------------------------------- +// Установка параметров треугольника +//----------------------------------------------------------------------------- +void STriangle::setParameters(double width, double length, QColor color) +{ + this->widthTriangle_ = width; + this->lengthTriangle_ = length; + this->colorTriangle_ = color; +} + + + + + diff --git a/addons/ep20/blok-display/src/Speedometer.cpp b/addons/ep20/blok-display/src/Speedometer.cpp new file mode 100644 index 00000000..057ff632 --- /dev/null +++ b/addons/ep20/blok-display/src/Speedometer.cpp @@ -0,0 +1,454 @@ +//----------------------------------------------------------------------------- +// +// Спидометр +// (c) РГУПС, ВЖД 31/03/2017 +// Разработал: Даглдиян Б.Д. +// +//----------------------------------------------------------------------------- +/*! + * \file + * \brief Класс элемента "Спидометр" + * \copyright РГУПС, ВЖД + * \author Даглдиян Б.Д. + * \date 31/03/2017 + */ + +#include "Speedometer.h" +#include "CfgReader.h" +#include "cmath" + +using namespace std; + +const QString SPEEDOMETER_CFG = "../cfg/BLOK/Speedometer.xml"; +//const QString STRIANGLE_CFG = "../cfg/BLOK/STriangle.xml"; +const double EPS = 0.0001; + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +Speedometer::Speedometer(QRect geo, QWidget *parent, QString config_dir) : QLabel(parent) +{ +// this->setAutoFillBackground(true); +// this->setPalette(QPalette(QColor(150,255,150))); +// this->setStyleSheet("border: 2px solid red"); + + this->resize(geo.width(),geo.height()); + this->move(geo.left(), geo.top()); + + // загружаем параметры с конфига + loadSpeedometerCfg(config_dir + "Speedometer.xml"); +// loadSTriangleCfg(STRIANGLE_CFG); + + // инициализация переменных + speedCurOld_i_ = -1; // предыдущая текущая скорость (int) + speedCurOld_d_ = -1; // предыдущая текущая скорость (double) + speedLimitOld_ = -1; // предыдущее ограничение скорости +// speedRefOld_ = -1; // предыдущая заданная скорость с рукоятки +// zzzOld_ = -1; + + timeCount_ = 0; + timerForBlink_ = new QTimer(); + timerForBlink_->setInterval(500); + connect(timerForBlink_, SIGNAL(timeout()), this, SLOT(onTimer())); + + + // ШКАЛА + sScale_ = new SScale( valV_max_, valV_step_, + arc_splitAngle_, arc_splitPoint_, + this, config_dir ); + + // угол начальной точки (0 на шкале спидометра) // Богос... + aBeginPoint_ = 360.0 - arc_splitPoint_ + arc_splitAngle_/2; + aStep_ = (360.0 - arc_splitAngle_)/valV_max_; // шаг угла + + + +// // ЖЕЛТЫЙ ТРЕУГОЛЬНИК +// sTriangleYellow_ = new STriangle(this); +// sTriangleYellow_->setParameters( widthTriangle_Yellow_, +// lengthTriangle_Yellow_, +// QColor(colorTriangle_Yellow_) ); + +// // КРАСНЫЙ ТРЕУГОЛЬНИК +// sTriangleRed_ = new STriangle(this); +// sTriangleRed_->setParameters( widthTriangle_Red_, +// lengthTriangle_Red_, +// QColor(colorTriangle_Red_) ); + + // ДУГА ОГРАНИЧЕНИЯ + sArcLimit_ = new SArcLimit(valV_max_, arc_splitAngle_, arc_splitPoint_, this, config_dir); + + // ОСНОВНЫЕ ЛИНИИ ШКАЛЫ СПИДОМЕТРА + sScaleMajorLine_ = new SScaleMajorLine( majorLine_length_, + majorLine_width_, + majorLine_color_, + valV_max_/valV_step_, + arc_splitPoint_/(valV_max_/valV_step_), + arc_splitPoint_ - arc_splitAngle_/2, + sArcLimit_->getArcLimitWidth(), + this); + + // СТРЕЛКА + sArrow_ = new SArrow(this, config_dir); + + + // ТЕКУЩАЯ СКОРОСТЬ (в центре спидометра) + labelValVCenter_ = new QLabel("0", this); + // ОГРАНИЧЕНИЕ СКОРОСТИ (в центре спидометра) + labelSpeedLimit_ = new QLabel("120", this); + // устанавливаем положение label текущей скорости в центре спидометра + myDrawValVCenter_( labelValVCenter_, + labelValVCenter_x_, + labelValVCenter_y_, + labelValVCenter_color_, + labelValVCenter_fontSize_ ); + // устанавливаем положение label ограничения скорости + myDrawValVCenter_( labelSpeedLimit_, + labelSpeedLimit_x_, + labelSpeedLimit_y_, + labelSpeedLimit_color_, + labelSpeedLimit_fontSize_ ); + + timerForBlink_->start(); +} + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +Speedometer::~Speedometer() +{ + +} + +//----------------------------------------------------------------------------- +// Установить текущую скорость +//----------------------------------------------------------------------------- +void Speedometer::setSpeedCur(double speed) +{ + // чтобы не перерисовывать стрелку спидометра, если значение не изменилось + if ( abs(speedCurOld_d_ - speed) < EPS ) + return; + speedCurOld_d_ = speed; + + // рисуем значение текущей скорости стрелкой + sArrow_->setValSpeed(aBeginPoint_ + setSpeedRange_(speed)*aStep_); + + // чтобы не перерисовывать знач. текущей скорости, если оно не изменилось + if ( abs(speedCurOld_i_ - round(speed)) < EPS ) + return; + speedCurOld_i_ = static_cast(round(speed)); + + + // возможно надо будет убрать условия, которые ограничивают перерисовывание, + // чтобы мигание "не испортить"/не прерывать. Богос + + + // рисуем значение текущей скорости на центральном круге спидометра + labelValVCenter_->setText( parsSpeedCur_(setSpeedRange_(speed)) ); + +} + +//----------------------------------------------------------------------------- +// Установить значение ограничения скорости +//----------------------------------------------------------------------------- +//void Speedometer::setSpeedLimit(int speedLimit) +//{ +// // чтобы не перерисовывать знач. огранич. скорости, если оно не изменилось +// if ( abs(speedLimitOld_ - speedLimit) < EPS ) +// return; +// speedLimitOld_ = speedLimit; + +// // рисуем ограничение скорости +// labelSpeedLimit_->setText( parsSpeedCur_(setSpeedRange_(speedLimit)) ); + +//} + +//----------------------------------------------------------------------------- +// Установить ограничения скорости +//----------------------------------------------------------------------------- +void Speedometer::setSpeedLimits(int speedLimit, int nextSpeedLimit) +{ + // чтобы не перерисовывать, если значение не изменилось + if ( abs(speedLimitOld_ - speedLimit) <= 1 ) + return; + speedLimitOld_ = speedLimit; + + // рисуем значение ограничения скорости в центре спидометра + labelSpeedLimit_->setText( parsSpeedCur_(setSpeedRange_(speedLimit)) ); + + // рисуем текущее ограничение скорости дугой + sArcLimit_->setValSpeedLimit( setSpeedRange_(speedLimit), + setSpeedRange_(nextSpeedLimit) ); + + // рисуем следующее ограничение скорости дугой + sScaleMajorLine_->drawMajorLine(); + // zzzzzzzzzzzzzzzzzzzzzzzzzzzz +} + +//----------------------------------------------------------------------------- +// Моргание значения текущей скорости, при приближении к значению ограничения +//----------------------------------------------------------------------------- +void Speedometer::onTimer() +{ + // условие значения приближения + if (speedLimitOld_ - speedCurOld_i_ <= 3) + { + timeCount_++; + // "время ожидания" перед миганием + if (timeCount_ > 2) + { + // процесс мигания + labelValVCenter_->setVisible(!labelValVCenter_->isVisible()); + } + } + else + { + timeCount_ = 0; + labelValVCenter_->setVisible(true); + } +} + +//----------------------------------------------------------------------------- +// Установить заданную скорость с рукоятки +//----------------------------------------------------------------------------- +//void Speedometer::setSpeed_Yellow(int speedLimit_Yellow) +//{ +// // чтобы не перерисовывать, если значение не изменилось +// if ( abs(speedRefOld_ - speedLimit_Yellow) < EPS ) +// return; +// speedRefOld_ = speedLimit_Yellow; + +// sTriangleYellow_->setValSpeed(aBeginPoint_ + +// setSpeedRange_(speedLimit_Yellow)*aStep_); +//} + +//----------------------------------------------------------------------------- +// Установить zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz +//----------------------------------------------------------------------------- +//void Speedometer::setSpeed_Red(int speedLimit_Red) +//{ +// // чтобы не перерисовывать, если значение не изменилось +// if ( abs(zzzOld_ - speedLimit_Red) < EPS ) +// return; +// zzzOld_ = speedLimit_Red; + +// sTriangleRed_->setValSpeed(aBeginPoint_ + +// setSpeedRange_(speedLimit_Red)*aStep_); +//} + +//----------------------------------------------------------------------------- +// Рисуем первоначальную скорость в центре спидометра +//----------------------------------------------------------------------------- +void Speedometer::myDrawValVCenter_(QLabel *label, int x, int y, QString color, + int fontSize) +{ + // задаем шрифт и размер + label->setFont(QFont("Arial", fontSize, 87)); + // задаем цвет текста + label->setStyleSheet("color: "+ color); + // задаем геометрию + label->setGeometry( this->width()/2 - label->width() + x, + this->height()/2 - label->height() + y, + label->width()*2, + label->height()*2 ); + // выравниваем текст по центру + label->setAlignment(Qt::AlignCenter); + +} + +//----------------------------------------------------------------------------- +// Установка границ скоростей +//----------------------------------------------------------------------------- +double Speedometer::setSpeedRange_(double valSpeed) + { + if (valSpeed > valV_max_) + valSpeed = valV_max_; + else + if (valSpeed < 0) + valSpeed = 0; + + return valSpeed; +} + +//----------------------------------------------------------------------------- +// Парсинг значения скорости в 3х-значное число +//----------------------------------------------------------------------------- +QString Speedometer::parsSpeedCur_(double valSpeed) +{ + QString s1 = ""; // сотни + QString s2 = ""; // десятки + QString s3 = ""; // единицы + int speedRound = 0; // + int i1 = 0; // сотни + int i2 = 0; // десятки + int i3 = 0; // единицы + + speedRound = static_cast(round(valSpeed)); + i1 = speedRound/100; // Выделяем сотни + i2 = (speedRound % 100)/10; // Выделяем десятки + i3 = speedRound - 100*i1 - 10*i2; // Выделяем единицы + + // возвращаем строку из 3х-значного числа + return s1.setNum(i1) + s2.setNum(i2) + s3.setNum(i3) ; +} + + +//----------------------------------------------------------------------------- +// Чтение конфигураций спидометра +//----------------------------------------------------------------------------- +bool Speedometer::loadSpeedometerCfg(QString cfg_path) +{ + CfgReader cfg; + + if (cfg.load(cfg_path)) + { + QString sectionName = "Speedometer"; + + // --- основные черточки на шкале спидометра --- // + // цвет + if (!cfg.getString(sectionName, "majorLine_color", majorLine_color_)) + majorLine_color_ = "#ffffff"; + // ширина + if (!cfg.getInt(sectionName, "majorLine_width", majorLine_width_)) + majorLine_width_ = 4; + // длина + if (!cfg.getInt(sectionName, "majorLine_length", majorLine_length_)) + majorLine_length_ = 26; + + + + // макс. скорость + if (!cfg.getInt(sectionName, "valV_max_OnScale", valV_max_)) + valV_max_ = 300; + // шаг скорости + if (!cfg.getInt(sectionName, "valV_step_OnScale", valV_step_)) + valV_step_ = 20; + + // угол центра разрыва дуги + if (!cfg.getInt(sectionName, "arc_splitPoint", arc_splitPoint_)) + arc_splitPoint_ = 270; + // длина дуги-разрыва + if (!cfg.getInt(sectionName, "arc_splitAngle", arc_splitAngle_)) + arc_splitAngle_ = 90; + + + + + // --- текущая скорость на центральном круге --- // + // пложение + if (!cfg.getInt(sectionName, "labelValVCenter_x", labelValVCenter_x_)) + labelValVCenter_x_ = 0; + if (!cfg.getInt(sectionName, "labelValVCenter_y", labelValVCenter_y_)) + labelValVCenter_y_ = 0; + // цвет + if (!cfg.getString(sectionName, "labelValVCenter_color", labelValVCenter_color_)) + labelValVCenter_color_ = "#ffffff"; + // размер шрифта + if (!cfg.getInt(sectionName, "labelValVCenter_fontSize", labelValVCenter_fontSize_)) + labelValVCenter_fontSize_ = 26; + + // --- ограничение скорости под центральным кругом спидометра --- // + // пложение + if (!cfg.getInt(sectionName, "labelSpeedLimit_x", labelSpeedLimit_x_)) + labelSpeedLimit_x_ = 0; + if (!cfg.getInt(sectionName, "labelSpeedLimit_y", labelSpeedLimit_y_)) + labelSpeedLimit_y_ = 70; + // цвет + if (!cfg.getString(sectionName, "labelSpeedLimit_color", labelSpeedLimit_color_)) + labelSpeedLimit_color_ = "#ffffff"; + // размер шрифта + if (!cfg.getInt(sectionName, "labelSpeedLimit_fontSize", labelSpeedLimit_fontSize_)) + labelSpeedLimit_fontSize_ = 26; + + } + else + { + // Параметры по умолчанию. + + // основные черточки на шкале спидометра + majorLine_color_ = "#ffffff"; // цвет + majorLine_width_ = 4; // ширина + majorLine_length_ = 26; // длина + + + + valV_max_ = 300; // макс. скорость + valV_step_ = 20; // шаг скорости + + arc_splitPoint_ = 270; // угол центра разрыва дуги + arc_splitAngle_ = 90; // длина дуги-разрыва + + + + + // текущая скорость на центральном круге + labelValVCenter_x_ = 0; // пложение + labelValVCenter_y_ = 0; // пложение + labelValVCenter_color_ = "#ffffff"; // цвет + labelValVCenter_fontSize_ = 26; // размер шрифта + + // ограничение скорости под центральным кругом спидометра + labelSpeedLimit_x_ = 0; // пложение + labelSpeedLimit_y_ = 70; // пложение + labelSpeedLimit_color_ = "#ffffff"; // цвет + labelSpeedLimit_fontSize_ = 26; // размер шрифта + + } + + return true; +} + +//----------------------------------------------------------------------------- +// Чтение конфигураций треугольников ограничений +//----------------------------------------------------------------------------- +bool Speedometer::loadSTriangleCfg(QString cfg_path) +{ + CfgReader cfg; + QString sectionName = ""; + + if (cfg.load(cfg_path)) + { + + // --- параметры ЖЕЛТОГО треугольника ограничения --- // + sectionName = "STriangle1"; + // ширина + if (!cfg.getDouble(sectionName, "widthTriangle", widthTriangle_Yellow_)) + widthTriangle_Yellow_ = 6; + // длина + if (!cfg.getDouble(sectionName, "lengthTriangle", lengthTriangle_Yellow_)) + lengthTriangle_Yellow_ = 20; + // цвет + if (!cfg.getString(sectionName, "colorTriangle", colorTriangle_Yellow_)) + colorTriangle_Yellow_ = "#ffff50"; + + // --- параметры КРАСНОГО треугольника ограничения --- // + sectionName = "STriangle2"; + // ширина + if (!cfg.getDouble(sectionName, "widthTriangle", widthTriangle_Red_)) + widthTriangle_Red_ = 6; + // длина + if (!cfg.getDouble(sectionName, "lengthTriangle", lengthTriangle_Red_)) + lengthTriangle_Red_ = 20; + // цвет + if (!cfg.getString(sectionName, "colorTriangle", colorTriangle_Red_)) + colorTriangle_Red_ = "#ff2020"; + + } + else + { + // Параметры по умолчанию. + + // параметры ЖЕЛТОГО треугольника ограничения + widthTriangle_Yellow_ = 6; // ширина + lengthTriangle_Yellow_ = 20; // длина + colorTriangle_Yellow_ = "#ffff50"; // цвет + + // параметры КРАСНОГО треугольника ограничения + widthTriangle_Red_ = 6; // ширина + lengthTriangle_Red_ = 20; // длина + colorTriangle_Red_ = "#ff2020"; // цвет + + } + + return true; +} diff --git a/addons/ep20/blok-display/src/TopBlock.cpp b/addons/ep20/blok-display/src/TopBlock.cpp new file mode 100644 index 00000000..b136d659 --- /dev/null +++ b/addons/ep20/blok-display/src/TopBlock.cpp @@ -0,0 +1,335 @@ +//----------------------------------------------------------------------------- +// +// Верхний блок БЛОКа +// (c) РГУПС, ВЖД 30/03/2017 +// Разработал: Даглдиян Б.Д. +// +//----------------------------------------------------------------------------- +/*! + * \file + * \brief Класс "Верхний блок" БЛОКа + * \copyright РГУПС, ВЖД + * \author Даглдиян Б.Д. + * \date 30/03/2017 + */ + + +#include "TopBlock.h" +#include "cmath" +#include "CfgReader.h" +#include + +const QString INFORMPARTTRIANGLE_CFG = "../cfg/BLOK/InformPartTriangle.xml"; + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +TopBlock::TopBlock(QRect geo, QWidget *parent, QString config_dir) : QWidget(parent) +{ + this->setGeometry(geo); + this->setAutoFillBackground(true); + this->setPalette(QPalette(QColor(0,0,0))); +// this->setStyleSheet("border: 2px solid green"); + + // загружаем параметры с конфига + loadIPTriangleCfg(config_dir + "InformPartTriangle.xml"); + +// QTimer* curTime = new QTimer(); +// curTime->setInterval(100); +// connect(curTime, SIGNAL(timeout()), this, SLOT(onTimer())); +// // текущее время +// labelCurTime_ = new QLabel("", this); +// // нарисовать текущее время +// drawCurentTime_(); +// curTime->start(); + + ip_ = new ip_t(); + + QRect geoIP; // размер и положение элементов + int fooH_ip = 70; // высота элементов + Qt::Alignment alignLeft = Qt::Alignment(Qt::AlignVCenter + Qt::AlignLeft); + Qt::Alignment alignCenter = Qt::AlignCenter; + + // устанавливаем элементы информационного блока и заносим в map + geoIP = QRect(10,0, 200,fooH_ip); + informPart_ = new InformPart(geoIP, "КООРДИНАТА", "1222км 7пк 19м", alignCenter, this, config_dir); + informPartMap_.insert(ip_->coordinate, informPart_); + geoIP = QRect(212,0, 160,fooH_ip); + informPart_ = new InformPart(geoIP, "СТАНЦИЯ", "ТЕМРЮК", alignCenter, this, config_dir); + informPartMap_.insert(ip_->station, informPart_); + geoIP = QRect(374,0, 110,fooH_ip); + informPart_ = new InformPart(geoIP, "ВРЕМЯ", "14:59:11", alignCenter, this, config_dir); + informPartMap_.insert(ip_->time, informPart_); +// geoIP = QRect(530,0, 140,fooH_ip); +// informPart_ = new InformPart(geoIP, "ПО ГРАФИКУ", "14:59:00", alignCenter, this); +// informPartMap_.insert(ip_->grafic, informPart_); + geoIP = QRect(489,0, 50,fooH_ip); + informPart_ = new InformPart(geoIP, "", "П", alignCenter, this, config_dir); + informPartMap_.insert(ip_->P, informPart_); + geoIP = QRect(537,0, 50,fooH_ip); + informPart_ = new InformPart(geoIP, "", "", alignCenter, this, config_dir); + informPart_->setImgOverLabel(); + informPartMap_.insert(ip_->P2, informPart_); + + geoIP = QRect(10,80, 80,fooH_ip); + informPart_ = new InformPart(geoIP, "КАНАЛ", "25Гц", alignCenter, this, config_dir); + informPartMap_.insert(ip_->chanel, informPart_); + geoIP = QRect(110,80, 100,fooH_ip); + informPart_ = new InformPart(geoIP, "№ ПУТИ", "1ПР", alignCenter, this, config_dir); + informPartMap_.insert(ip_->numRoad, informPart_); + geoIP = QRect(15,170, 150,fooH_ip); + informPart_ = new InformPart(geoIP, "УСКОРЕНИЕ", "-0.00", alignCenter, this, config_dir); + informPartMap_.insert(ip_->acceleration, informPart_); + geoIP = QRect(15,250, 150,fooH_ip); + informPart_ = new InformPart(geoIP, "", "1477м", alignCenter, this, config_dir); + informPart_->setTextOverHead("РАССТ. ДО ЦЕЛИ САУТ", QRect(15,250, 250,fooH_ip)); // РАССТ. ДО ЦЕЛИ САУТ + informPartMap_.insert(ip_->distanceTargetSAUT, informPart_); + geoIP = QRect(15,330, 150,fooH_ip); + informPart_ = new InformPart(geoIP, "КОЭФ. ТОРМ.", "0.47", alignCenter, this, config_dir); + informPartMap_.insert(ip_->coeffBraking, informPart_); + + geoIP = QRect(10,this->height()-fooH_ip-65, 207,fooH_ip); + informPart_ = new InformPart(geoIP, "РАССТ. ДО ЦЕЛИ", "", alignCenter, this, config_dir); + informPartMap_.insert(ip_->distanceTarget, informPart_); + geoIP = QRect(227,this->height()-fooH_ip-65, 207,fooH_ip); + informPart_ = new InformPart(geoIP, "ВИД ЦЕЛИ", "", alignCenter, this, config_dir); + informPartMap_.insert(ip_->typeTarget, informPart_); + geoIP = QRect(444,this->height()-fooH_ip-65, 207,fooH_ip); + informPart_ = new InformPart(geoIP, "НАЗВАНИЕ ЦЕЛИ", "", alignCenter, this, config_dir); + informPartMap_.insert(ip_->nameTarget, informPart_); + + geoIP = QRect(10,this->height()-fooH_ip-10, 640,fooH_ip); + informPart_ = new InformPart(geoIP, "", "", alignCenter, this, config_dir); + informPartMap_.insert(ip_->zz, informPart_); + + // ЭЛЕМЕНТЫ ИНФОРМАЦИОННОГО БЛОКА_2 (ДАВЛЕНИЯ В ЦИЛИНДРАХ) + ipPressureUR_ = new InformPartPressure("УР", this); + ipPressureTM_ = new InformPartPressure("ТМ", this); + ipPressureTC_ = new InformPartPressure("ТЦ", this); + int ipPW = ipPressureUR_->width(); + int ipPY = this->height() - ipPressureUR_->height() - 10; + ipPressureUR_->move(this->width() - ipPW - 20, ipPY); + ipPressureTM_->move(ipPressureUR_->x() - ipPW - 10, ipPY); + ipPressureTC_->move(ipPressureTM_->x() - ipPW - 10, ipPY); + + + // размер и положение элементов + int fooX = this->width() - 40; + int fooY = 10; + // устанавливаем КРАСНЫЙ ТРЕУГОЛЬНИК + fooX -= widthTriangle_Red_; + ipTriangleRed_ = new InformPartTriangle( QPoint(fooX, fooY), + widthTriangle_Red_, + QColor(colorTriangle_Red_), + this ); + + // устанавливаем ЖЁЛТЫЙ ТРЕУГОЛЬНИК + fooX -= widthTriangle_Yellow_ + 20; + ipTriangleYellow_ = new InformPartTriangle( QPoint(fooX, fooY), + widthTriangle_Yellow_, + QColor(colorTriangle_Yellow_), + this ); + ipTriangleYellow_->setTriangle(0, false, true); + + + // устанавливаем СПИДОМЕТР + int speedW = 480; + speedometer_ = new Speedometer( QRect( this->width()/2 - speedW/2, + -15, // Богос (смещение сверху) + speedW, + speedW ), + this, config_dir ); + speedometer_->move(240, 130); + speedometer_->setSpeedLimits(120, 80); // zБогос. Удалить. + speedometer_->setSpeedCur(0.0); // zБогос. Удалить. + + // устанавливаем маленький треугольник возле спидометра снизу справа + ipTriangle_ = new InformPartTriangle( QPoint(speedometer_->x() - 30, + speedometer_->y() + speedometer_->height()*0.78), + 40, + QColor(255,255,0), + this ); + ipTriangle_->setTriangle(180, true); +} + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +TopBlock::~TopBlock() +{ + +} + +//----------------------------------------------------------------------------- +// Установить значения элементов информационного блока +//----------------------------------------------------------------------------- +void TopBlock::set_ipVal(ip_val_t *val) +{ + informPartMap_[ip_->coordinate]->setText(getCoordinateStr_(val->coordinate)); + informPartMap_[ip_->time]->setText(val->time); + informPartMap_[ip_->station]->setText(QString(val->station)); + informPartMap_[ip_->numRoad]->setText(QString(val->numRoad)); + informPartMap_[ip_->chanel]->setText(QString(val->chanel)); + informPartMap_[ip_->acceleration]->setText(getAccelerationStr_(val->acceleration)); + informPartMap_[ip_->distanceTargetSAUT]->setText(QString::number(val->distanceTargetSAUT) + "м"); + informPartMap_[ip_->coeffBraking]->setText(QString::number(val->coeffBraking, 'f', 2)); + informPartMap_[ip_->distanceTarget]->setText(QString::number(val->distanceTarget) + "м"); + informPartMap_[ip_->typeTarget]->setText(QString(val->typeTarget)); + informPartMap_[ip_->nameTarget]->setText(QString(val->nameTarget)); + informPartMap_[ip_->zz]->setText(QString(val->zz)); +} + +//----------------------------------------------------------------------------- +// Установить значения элементов информационного блока 2 +//----------------------------------------------------------------------------- +void TopBlock::set_ip2Val(ip2_val_t *val) +{ + ipPressureUR_->setValPressure(val->UR); + ipPressureTM_->setValPressure(val->TM); + ipPressureTC_->setValPressure(val->BC); +} + +//----------------------------------------------------------------------------- +// Зажечь "проверка бдительности" (жёлтый треугольник) +//----------------------------------------------------------------------------- +void TopBlock::setTriangleYellow(bool isSignal) +{ + ipTriangleYellow_->setTriangle(0,isSignal,true); +} + +//----------------------------------------------------------------------------- +// зажечь ТСКБМ (красный треугольник) +//----------------------------------------------------------------------------- +void TopBlock::setTriangleRed(bool isSignal) +{ + ipTriangleRed_->setTriangle(180, isSignal, false, false); +} + +//----------------------------------------------------------------------------- +// Установить текущее и следующее ограничение скорости +//----------------------------------------------------------------------------- +void TopBlock::setSpeedLimits(int curSpeedLimit, int nextSpeedLimit) +{ + speedometer_->setSpeedLimits(curSpeedLimit, nextSpeedLimit); +} + +//----------------------------------------------------------------------------- +// Установить текущую скорость +//----------------------------------------------------------------------------- +void TopBlock::setCurSpeed(double speed) +{ + speedometer_->setSpeedCur(speed); +} + +//----------------------------------------------------------------------------- +// Вернуть строку координаты, типа: "..км ..пк ..м" +//----------------------------------------------------------------------------- +QString TopBlock::getCoordinateStr_(double coordinate) +{ + if (coordinate <= 0) + { + return "0км 0пк 0м"; + } + + int coord_km = static_cast(coordinate); + int coord_ostatok = qRound((coordinate - coord_km) * 1000); + int coord_pk = coord_ostatok / 100;// + 1; + int coord_m = ((coord_ostatok - 100 * coord_pk) / 10) * 10; + + return QString("%1км %2пк %3м").arg(coord_km).arg(coord_pk).arg(coord_m); +} + +//----------------------------------------------------------------------------- +// Вернуть строку ускорения, типа: " ' '/'-' " +//----------------------------------------------------------------------------- +QString TopBlock::getAccelerationStr_(double a) +{ + QString fooA_s = ""; + (a >= 0)? (fooA_s = " ") : (fooA_s = "-"); + (qAbs(a) < 0.005)? (fooA_s += "0") : (fooA_s += QString::number(qAbs(a), 'f', 2)); + + return fooA_s; +} + +//----------------------------------------------------------------------------- +// Установить текущее время на блоке +//----------------------------------------------------------------------------- +//void TopBlock::onTimer() +//{ +// QTime time = QTime::currentTime(); +// QString text = time.toString("hh:mm:ss"); + +// labelCurTime_->setText(text); +//} + + +//----------------------------------------------------------------------------- +// Нарисовать текущее время +//----------------------------------------------------------------------------- +//void TopBlock::drawCurentTime_() +//{ +// QString strStyle = "color: "+ QColor(255,255,255).name() + ";" + +// "font-weight: bold;"; + +// // задаем шрифт и размер +// labelCurTime_->setFont(QFont("Arial", 24)); +// // задаем цвет текста +// labelCurTime_->setStyleSheet(strStyle); +// // задаем геометрию +// labelCurTime_->resize(200, 45); +// labelCurTime_->move(0,0); +// // выравниваем +// labelCurTime_->setAlignment(Qt::AlignLeft); +// // сам текст +// labelCurTime_->setText("00:00:00"); + +//} + + +//----------------------------------------------------------------------------- +// Чтение конфигураций элемента информации (треугольник) +//----------------------------------------------------------------------------- +bool TopBlock::loadIPTriangleCfg(QString cfg_path) +{ + CfgReader cfg; + QString sectionName = ""; + + if (cfg.load(cfg_path)) + { + + // --- параметры ЖЕЛТОГО треугольника --- // + sectionName = "InformPartTriangle1"; + // ширина + if (!cfg.getDouble(sectionName, "widthTriangle", widthTriangle_Yellow_)) + widthTriangle_Yellow_ = 120; + // цвет + if (!cfg.getString(sectionName, "colorTriangle", colorTriangle_Yellow_)) + colorTriangle_Yellow_ = "#ffff50"; + + // --- параметры КРАСНОГО треугольника --- // + sectionName = "InformPartTriangle2"; + // ширина + if (!cfg.getDouble(sectionName, "widthTriangle", widthTriangle_Red_)) + widthTriangle_Red_ = 120; + // цвет + if (!cfg.getString(sectionName, "colorTriangle", colorTriangle_Red_)) + colorTriangle_Red_ = "#ff2020"; + + } + else + { + // Параметры по умолчанию. + + // параметры ЖЕЛТОГО треугольника ограничения + widthTriangle_Yellow_ = 120; // ширина + colorTriangle_Yellow_ = "#ffff50"; // цвет + + // параметры КРАСНОГО треугольника ограничения + widthTriangle_Red_ = 120; // ширина + colorTriangle_Red_ = "#ff2020"; // цвет + + } + + return true; +} + diff --git a/addons/ep20/blok-display/src/blok-display.cpp b/addons/ep20/blok-display/src/blok-display.cpp new file mode 100644 index 00000000..b76a3f07 --- /dev/null +++ b/addons/ep20/blok-display/src/blok-display.cpp @@ -0,0 +1,121 @@ +#include "blok-display.h" +#include "ep20-signals.h" + +#include "CfgReader.h" + +#include +#include + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +BlokDisplay::BlokDisplay(QWidget *parent, Qt::WindowFlags f) + : AbstractDisplay(parent, f) + +{ + this->setWindowFlag(Qt::WindowType::FramelessWindowHint); + this->resize(1024, 768); + this->setAutoFillBackground(true); + this->setPalette(QPalette(QColor(0, 0, 0))); + + this->setLayout(new QVBoxLayout); + this-> setFocusPolicy(Qt::FocusPolicy::NoFocus); +} + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +BlokDisplay::~BlokDisplay() +{ + +} + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +void BlokDisplay::init() +{ + initMainWindow(); + + initTopBlock(); + + AbstractDisplay::init(); +} + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +void BlokDisplay::initMainWindow() +{ + CfgReader cfg; + + int sizeWindow_X = 1024; + int sizeWindow_Y = 768; + bool hideCursor = true; + int timeInterval = 100; + + if (cfg.load(config_dir + getConfigPath("main.xml"))) + { + QString sectionName = "Main"; + cfg.getInt(sectionName, "sizeWindow_X", sizeWindow_X); + cfg.getInt(sectionName, "sizeWindow_Y", sizeWindow_Y); + cfg.getBool(sectionName, "hideCursor", hideCursor); + cfg.getInt(sectionName, "timeInterval", timeInterval); + } + + this->setCursor( hideCursor ? Qt::BlankCursor : Qt::ArrowCursor); + + this->setWindowFlag(Qt::WindowType::FramelessWindowHint); + this->resize(sizeWindow_X, sizeWindow_Y); + this->setAutoFillBackground(true); + this->setPalette(QPalette(QColor(0, 0, 0))); + + updateTimer = new QTimer; + connect(updateTimer, &QTimer::timeout, this, &BlokDisplay::slotUpdateTimer, Qt::QueuedConnection); + updateTimer->setInterval(timeInterval); + updateTimer->start(); +} + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +void BlokDisplay::initTopBlock() +{ + int margX = 20; + int margY = 20; + + QRect rect = QRect(margX + 10, + margY, + this->width() - margX * 2, + this->height() - margY * 2); + + topBlock = new TopBlock(rect, this, config_dir + getConfigPath("")); + this->layout()->addWidget(topBlock); +} + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +void BlokDisplay::slotUpdateTimer() +{ + structsBLOK.ip2_val.TM = static_cast(input_signals[BLOK_TM_PRESS]); + structsBLOK.ip2_val.UR = static_cast(input_signals[BLOK_UR_PRESS]); + structsBLOK.ip2_val.BC = static_cast(input_signals[BLOK_TC_PRESS]); + + topBlock->set_ip2Val(&structsBLOK.ip2_val); + + structsBLOK.ip_val.coordinate = static_cast(input_signals[BLOK_RAILWAY_COORD]); + structsBLOK.ip_val.acceleration = 0.0; + strcpy(structsBLOK.ip_val.station, "Ростов Гл."); + + topBlock->set_ipVal(&structsBLOK.ip_val); + + structsBLOK.other_val.curSpeed = qRound(input_signals[BLOK_VELOCITY]); + structsBLOK.other_val.curSpeedLimit = qRound(input_signals[BLOK_VELOCITY_CURRENT_LIMIT]); + structsBLOK.other_val.nextSpeedLimit = qRound(input_signals[BLOK_VELOCITY_NEXT_LIMIT]); + + topBlock->setCurSpeed(structsBLOK.other_val.curSpeed); + topBlock->setSpeedLimits(structsBLOK.other_val.curSpeedLimit, structsBLOK.other_val.nextSpeedLimit); +} + +GET_DISPLAY(BlokDisplay) diff --git a/addons/ep20/ep20.pro b/addons/ep20/ep20.pro index bd194691..f20c5ac1 100644 --- a/addons/ep20/ep20.pro +++ b/addons/ep20/ep20.pro @@ -1,3 +1,4 @@ TEMPLATE = subdirs +SUBDIRS += ./blok-display SUBDIRS += ./ep20 \ No newline at end of file diff --git a/addons/ep20/ep20/include/ep20-signals.h b/addons/ep20/ep20/include/ep20-signals.h index b3cd6e39..afadba45 100644 --- a/addons/ep20/ep20/include/ep20-signals.h +++ b/addons/ep20/ep20/include/ep20-signals.h @@ -6,11 +6,32 @@ enum KONTROLLER = 0, RUK_KRM130 = 1, RUK_KVT224 = 2, + KMB2_Real = 3, + KMB2_Fake = 4, + KeyCard_Fake = 5, + KeyCard_Low = 6, + STRELKA_pTM = 10, STRELKA_pGR = 11, STRELKA_pTC = 12, - STRELKA_pUR = 13 + STRELKA_pUR = 13, + + BLOK_TM_PRESS = 100, + BLOK_UR_PRESS = 101, + BLOK_TC_PRESS = 102, + + BLOK_RAILWAY_COORD = 103, + BLOK_VELOCITY = 104, + BLOK_VELOCITY_CURRENT_LIMIT = 105, + BLOK_VELOCITY_NEXT_LIMIT = 106, + + WHEEL_1 = 194, + WHEEL_2 = 195, + WHEEL_3 = 196, + WHEEL_4 = 197, + WHEEL_5 = 198, + WHEEL_6 = 199 }; #endif // EP20_SIGNALS_H diff --git a/addons/ep20/ep20/include/ep20.h b/addons/ep20/ep20/include/ep20.h index 52d0720f..bc08306a 100644 --- a/addons/ep20/ep20/include/ep20.h +++ b/addons/ep20/ep20/include/ep20.h @@ -25,6 +25,7 @@ #include "ac-motor-compressor.h" #include "ep20-signals.h" #include "ep20-brake-mech.h" +#include "kmb2.h" /*! * \class @@ -90,7 +91,6 @@ class EP20 : public Vehicle /// Мотор компрессор std::array motorCompAC; -// ACMotorCompressor *motorCompAC; /// Входные значения mpcs_input_t mpcsInput; @@ -131,6 +131,9 @@ class EP20 : public Vehicle std::array rd304; std::array pSplit; + /// Бесконтактный контроллер машиниста + KMB2 *kmb2; + /// Инициализация void initialization(); @@ -143,6 +146,9 @@ class EP20 : public Vehicle /// Инициализация МПСУ void initMPCS(); + /// Инициализация КМБ2 + void initKMB2(); + /// Шаг моделирования всех систем локомотива в целом void step(double t, double dt); @@ -155,6 +161,9 @@ class EP20 : public Vehicle /// Шаг моделирования тормозного крана void stepBrakeControls(double t, double dt); + /// Шаг моделирования бесконтактного контроллера машиниста + void stepKMB2(double t, double dt); + /// Загрузка данных из конфигурационных файлов void loadConfig(QString cfg_path); diff --git a/addons/ep20/ep20/include/kmb2.h b/addons/ep20/ep20/include/kmb2.h new file mode 100644 index 00000000..87844ef5 --- /dev/null +++ b/addons/ep20/ep20/include/kmb2.h @@ -0,0 +1,99 @@ +#ifndef KMB2_H +#define KMB2_H + +#include "device.h" +#include "timer.h" + +//------------------------------------------------------------------------------ +//Класс контроллера машиниста электронного бесконтактного! +//------------------------------------------------------------------------------ +class KMB2 : public Device { + +public: + + KMB2(QObject *parent = Q_NULLPTR); + + ~KMB2(); + + // Получить направление реверса + float getReverseDir(); + + // Получить положение тяги + float getTractionPosition(); + + // Получить положение скорости + float getVelocityPosition(); + + // Получить уровень тяги + float getTractionLevel(); + + // Получить уровень скорости + float getVelocityLevel(); + + // Получить реверсивное состояние + float getReverseState(); + + + double getPovorot(); + + double getS3(); + +private: + + // Таймер уровня тяги + Timer *tractionVelocityLevelTimer; + + // Таймер состояния реверса + Timer *reverseStateTimer; + + // Реверсивное направление + int reverse_dir; + + // Положение тяги + int traction_pos; + + // Положение скорости + int velocity_pos; + + // Уровень тяги (для таймера) + int traction_level; + + // Уровень скорости (для таймера) + int velocity_level; + + // Реверсивное состояние (для таймера) + int reverse_state; + + //Коэффициент из конфига + int traction_rate; + + //Коэффициент из конфига + int velocity_rate; + + double T; + + double S1; + + double S2; + + double S3; + + bool old_state_W; + bool old_state_S; + + void preStep(state_vector_t &Y, double t); + + void ode_system(const state_vector_t &Y, state_vector_t &dYdt, double t); + + void load_config(CfgReader &cfg); + + void stepKeysControl(double t, double dt); + +private slots: + + void levelTimerHandler(); + + void reverseTimerHandler(); +}; + +#endif // KMB2_H diff --git a/addons/ep20/ep20/src/ep20-signals-output.cpp b/addons/ep20/ep20/src/ep20-signals-output.cpp index 3bfa77d8..1fcc0926 100644 --- a/addons/ep20/ep20/src/ep20-signals-output.cpp +++ b/addons/ep20/ep20/src/ep20-signals-output.cpp @@ -9,4 +9,26 @@ void EP20::stepSignals() analogSignal[RUK_KRM130] = krm->getHandlePosition(); analogSignal[RUK_KVT224] = static_cast(kvt->getHandlePosition()); + + analogSignal[KMB2_Real] = kmb2->getTractionPosition(); + analogSignal[KMB2_Fake] = kmb2->getVelocityPosition(); + + analogSignal[KeyCard_Fake] = kmb2->getPovorot(); + analogSignal[KeyCard_Low] = kmb2->getS3(); + + analogSignal[BLOK_TC_PRESS] = static_cast(brake_mech[FWD_TROLLEY]->getBrakeCylinderPressure()); + analogSignal[BLOK_TM_PRESS] = static_cast(pTM); + analogSignal[BLOK_UR_PRESS] = static_cast(krm->getEqReservoirPressure()); + + analogSignal[BLOK_RAILWAY_COORD] = static_cast(railway_coord / 1000.0); + analogSignal[BLOK_VELOCITY] = static_cast(velocity * Physics::kmh); + analogSignal[BLOK_VELOCITY_CURRENT_LIMIT] = 200.0f; + analogSignal[BLOK_VELOCITY_NEXT_LIMIT] = 200.0f; + + analogSignal[WHEEL_1] = static_cast(dir * wheel_rotation_angle[0] / 2.0 / Physics::PI); + analogSignal[WHEEL_2] = static_cast(dir * wheel_rotation_angle[1] / 2.0 / Physics::PI); + analogSignal[WHEEL_3] = static_cast(dir * wheel_rotation_angle[2] / 2.0 / Physics::PI); + analogSignal[WHEEL_4] = static_cast(dir * wheel_rotation_angle[3] / 2.0 / Physics::PI); + analogSignal[WHEEL_5] = static_cast(dir * wheel_rotation_angle[4] / 2.0 / Physics::PI); + analogSignal[WHEEL_6] = static_cast(dir * wheel_rotation_angle[5] / 2.0 / Physics::PI); } diff --git a/addons/ep20/ep20/src/ep20.cpp b/addons/ep20/ep20/src/ep20.cpp index a6b7d223..706c96c5 100644 --- a/addons/ep20/ep20/src/ep20.cpp +++ b/addons/ep20/ep20/src/ep20.cpp @@ -50,6 +50,8 @@ void EP20::initialization() // Вызываем метод initBrakeControls(modules_dir); + + initKMB2(); } //------------------------------------------------------------------------------ @@ -66,6 +68,17 @@ void EP20::initMPCS() mpcs->init(); } + +//------------------------------------------------------------------------------ +// Инициализация КМБ2 +//------------------------------------------------------------------------------ +void EP20::initKMB2() +{ + kmb2 = new KMB2(); + + kmb2->read_custom_config(config_dir + QDir::separator() + "kmb2"); +} + //------------------------------------------------------------------------------ // Инициализация высоковольтной схемы //------------------------------------------------------------------------------ @@ -154,20 +167,34 @@ void EP20::step(double t, double dt) stepBrakeControls(t, dt); + stepKMB2(t, dt); + // Выводим на экран симулятор, высоту подъема/спуска, выходное напряжение, род ток! - DebugMsg = QString("t: %1 s, U2_4: %2, Q: %3, pUR: %4, pTM: %5, KrM: %6, pTC_2: %7, pTC_1: %8 pZR: %9 pos: %10") +// DebugMsg = QString("t: %1 s, U2_4: %2, Q: %3, pUR: %4, pTM: %5, KrM: %6, pTC_2: %7, pTC_1: %8 pZR: %9 pos: %10 trac_pos: %11") +// .arg(t, 10, 'f', 2) +// .arg(auxConv[3]->getU2(), 5, 'f', 1) +// .arg(main_reservoir->getPressure(), 4, 'f', 2) +// .arg(krm->getEqReservoirPressure(), 4, 'f', 2) +// .arg(pTM, 4, 'f', 2) +// .arg(krm->getPositionName(), 4) +// .arg(brake_mech[FWD_TROLLEY]->getBrakeCylinderPressure(), 4, 'f', 2) +// .arg(brake_mech[BWD_TROLLEY]->getBrakeCylinderPressure(), 4, 'f', 2) +// .arg(spareReservoir->getPressure(), 4, 'f', 2) +// .arg(kvt->getHandlePosition(), 4, 'f', 2); + + + + DebugMsg = QString("t: %1 s, Reverse_State: %2, Trac_Level: %3, Vel_Level: %4, Reverse_Dir: %5, Trac_Pos: %6, Vel_Pos: %7") .arg(t, 10, 'f', 2) - .arg(auxConv[3]->getU2(), 5, 'f', 1) - .arg(main_reservoir->getPressure(), 4, 'f', 2) - .arg(krm->getEqReservoirPressure(), 4, 'f', 2) - .arg(pTM, 4, 'f', 2) - .arg(krm->getPositionName(), 4) - .arg(brake_mech[FWD_TROLLEY]->getBrakeCylinderPressure(), 4, 'f', 2) - .arg(brake_mech[BWD_TROLLEY]->getBrakeCylinderPressure(), 4, 'f', 2) - .arg(spareReservoir->getPressure(), 4, 'f', 2) - .arg(kvt->getHandlePosition(), 4, 'f', 2); + .arg(kmb2->getReverseState(), 2) + .arg(kmb2->getTractionLevel(), 2) + .arg(kmb2->getVelocityLevel(), 2) + .arg(kmb2->getReverseDir(), 2) + .arg(kmb2->getTractionPosition(), 2) + .arg(kmb2->getVelocityPosition(), 2); stepSignals(); + //________________________________________________ // .arg(t, 10, 'f', 2) @@ -380,6 +407,12 @@ void EP20::stepBrakeControls(double t, double dt) Q_r[6] = brake_mech[BWD_TROLLEY]->getBrakeTorque(); } +void EP20::stepKMB2(double t, double dt) +{ + kmb2->setControl(keys); + kmb2->step(t, dt); +} + //------------------------------------------------------------------------------ // Загрузка конфига //------------------------------------------------------------------------------ @@ -439,10 +472,10 @@ void EP20::load_brakes_config(QString path) int loco_crane_pos = 0; - /*if (cfg.getInt(secName, "LocoCranePos", loco_crane_pos)) + if (cfg.getInt(secName, "LocoCranePos", loco_crane_pos)) { - loco_crane->setHandlePosition(loco_crane_pos); - }*/ + kvt->setHandlePosition(loco_crane_pos); + } } } diff --git a/addons/ep20/ep20/src/kmb2.cpp b/addons/ep20/ep20/src/kmb2.cpp new file mode 100644 index 00000000..b0a55d05 --- /dev/null +++ b/addons/ep20/ep20/src/kmb2.cpp @@ -0,0 +1,224 @@ +#include "kmb2.h" +#include "iostream" +#include + +//------------------------------------------------------------------------------ +// Конструктор класса +//------------------------------------------------------------------------------ +KMB2::KMB2(QObject *parent) + : reverse_dir(0), + traction_pos(0), + velocity_pos(0), + traction_level(0), + velocity_level(0), + reverse_state(0), + traction_rate(0), + velocity_rate(0), + T(0.5), + S1(0), + S2(0), + S3(0), + old_state_W(false), + old_state_S(false) +{ + tractionVelocityLevelTimer = new Timer(0.1, false, Q_NULLPTR); + connect(tractionVelocityLevelTimer, &Timer::process, this, &KMB2::levelTimerHandler); + + // Запуск таймера + tractionVelocityLevelTimer->start(); + + reverseStateTimer = new Timer(0.3, false, Q_NULLPTR); + connect(reverseStateTimer, &Timer::process, this, &KMB2::reverseTimerHandler); +} + +//------------------------------------------------------------------------------ +// Деструктор класса +//------------------------------------------------------------------------------ +KMB2::~KMB2() +{ + +} + +//------------------------------------------------------------------------------ +// Деструктор класса +//------------------------------------------------------------------------------ +float KMB2::getReverseDir() +{ + return reverse_dir; +} + + + + + + + + + +//------------------------------------------------------------------------------ +// Деструктор класса +//------------------------------------------------------------------------------ +float KMB2::getTractionPosition() +{ + return traction_pos; +} + +//------------------------------------------------------------------------------ +// Деструктор класса +//------------------------------------------------------------------------------ +float KMB2::getVelocityPosition() +{ + return velocity_pos; +} + +//------------------------------------------------------------------------------ +// Деструктор класса +//------------------------------------------------------------------------------ +float KMB2::getTractionLevel() +{ + return traction_level; +} + +//------------------------------------------------------------------------------ +// Деструктор класса +//------------------------------------------------------------------------------ +float KMB2::getVelocityLevel() +{ + return velocity_level; +} + +//------------------------------------------------------------------------------ +// Деструктор класса +//------------------------------------------------------------------------------ +float KMB2::getReverseState() +{ + return reverse_state; +} + +double KMB2::getPovorot() +{ + return getY(0); +} + +double KMB2::getS3() +{ + return S3; +} + +void KMB2::preStep(state_vector_t &Y, double t) +{ + S1 = Y[0] - 0.99; + S2 = hs_p(S1); + S3 = S2 + pf(reverse_state); +} + +void KMB2::ode_system(const state_vector_t &Y, state_vector_t &dYdt, double t) +{ + dYdt[0] = (nf(reverse_state) - Y[0])/T; +} + +void KMB2::load_config(CfgReader &cfg) +{ + QString secName = "Device"; + + cfg.getInt(secName, "traction_rate", traction_rate); + cfg.getInt(secName, "velocity_rate", velocity_rate); +} + +//------------------------------------------------------------------------------ +// Обработчик клавиш +//------------------------------------------------------------------------------ +void KMB2::stepKeysControl(double t, double dt) +{ + // Реверс движения! + if (getKeyState(KEY_W)) + { + reverse_dir = 1; + if (!old_state_W) + { + reverseStateTimer->start(); + old_state_W = true; + } + } + else { + old_state_W = false; + } + + if (getKeyState(KEY_S)) + { + reverse_dir = -1; + + if (!old_state_S) + { + reverseStateTimer->start(); + old_state_S = true; + } + } + else { + old_state_S = false; + } + + + // Положение тяги + if (getKeyState(KEY_A)) + { + traction_pos = 1; + } + if(getKeyState(KEY_D)) + { + traction_pos = -1; + } + if (!getKeyState(KEY_A) && !getKeyState(KEY_D)) + traction_pos = 0; + + // Положение скорости + if(getKeyState(KEY_Q)) + { + velocity_pos = 1; + } + if(getKeyState(KEY_E)) + { + velocity_pos = -1; + } + if (!getKeyState(KEY_Q) && !getKeyState(KEY_E)) + velocity_pos = 0; + + // Обнуление + if (isControl()) + { + if (getKeyState(KEY_D)) + { + traction_level = 0; + velocity_level = 0; + } + } + + tractionVelocityLevelTimer->step(t, dt); + reverseStateTimer->step(t, dt); +} + +void KMB2::levelTimerHandler() +{ + // Если реверс равен нулю! + if(reverse_state == 0) + return; + + traction_level += traction_pos * traction_rate; + traction_level = cut(traction_level, -1, 1); + + velocity_level += velocity_pos * velocity_rate; + velocity_level = cut(velocity_level, 0, 1); +} + +void KMB2::reverseTimerHandler() +{ + // Если тяга не равна нулю + if (traction_level != 0) + return; + + reverse_state += reverse_dir; + reverse_state = cut(reverse_state, -1, 1); + + reverseStateTimer->stop(); +} + diff --git a/addons/ep20/ep20/src/mpcs.cpp b/addons/ep20/ep20/src/mpcs.cpp index f90640ca..42a84770 100644 --- a/addons/ep20/ep20/src/mpcs.cpp +++ b/addons/ep20/ep20/src/mpcs.cpp @@ -213,7 +213,7 @@ void MPCS::ode_system(const state_vector_t &Y, state_vector_t &dYdt, double t) //------------------------------------------------------------------------------ void MPCS::load_config(CfgReader &cfg) { - + Q_UNUSED(cfg) } //------------------------------------------------------------------------------ diff --git a/addons/es1-motor/es1-motor.pro b/addons/es1-motor/es1-motor.pro deleted file mode 100644 index 78e11455..00000000 --- a/addons/es1-motor/es1-motor.pro +++ /dev/null @@ -1,5 +0,0 @@ -TEMPLATE = subdirs - -CONFIG += ordered - -SUBDIRS += ./es1-motor diff --git a/addons/es1-motor/es1-motor/es1-motor.pro b/addons/es1-motor/es1-motor/es1-motor.pro deleted file mode 100644 index f49d21e6..00000000 --- a/addons/es1-motor/es1-motor/es1-motor.pro +++ /dev/null @@ -1,37 +0,0 @@ -TEMPLATE = lib - -QT -= gui -QT += xml - -TARGET = es1-motor - -DESTDIR = ../../../../modules/$$join(TARGET,,,) - -CONFIG(debug, debug|release) { - - LIBS += -L../../../../lib -lCfgReader_d - LIBS += -L../../../../lib -lphysics_d - LIBS += -L../../../../lib -lvehicle_d - LIBS += -L../../../../lib -ldevice_d - LIBS += -L../../../lib -lfilesystem_d - -} else { - - LIBS += -L../../../../lib -lCfgReader - LIBS += -L../../../../lib -lphysics - LIBS += -L../../../../lib -lvehicle - LIBS += -L../../../../lib -ldevice - LIBS += -L../../../lib -lfilesystem -} - -INCLUDEPATH += ./include -INCLUDEPATH += ../../../CfgReader/include - -INCLUDEPATH += ../../../simulator/solver/include -INCLUDEPATH += ../../../simulator/physics/include -INCLUDEPATH += ../../../simulator/vehicle/include -INCLUDEPATH += ../../../simulator/device/include -INCLUDEPATH += ../../../filesystem/include - -HEADERS += $$files(./include/*.h) -SOURCES += $$files(./src/*.cpp) diff --git a/addons/es1-motor/es1-motor/include/es1-motor.h b/addons/es1-motor/es1-motor/include/es1-motor.h deleted file mode 100644 index 0292bb10..00000000 --- a/addons/es1-motor/es1-motor/include/es1-motor.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef SAPSAN_MOTOR_H -#define SAPSAN_MOTOR_H - -#include "vehicle.h" - -//------------------------------------------------------------------------------ -// -//------------------------------------------------------------------------------ -class ES1Motor : public Vehicle -{ -public: - - ES1Motor(); - - ~ES1Motor(); - -private: - - double traction_level; - bool inc_loc; - bool dec_loc; - - bool auto_reg; - - double vz; - - void keyProcess(); - - void step(double t, double dt); - - double traction_char(double v); -}; - -#endif // SAPSAN_MOTOR_H diff --git a/addons/es1-motor/es1-motor/src/es1-motor.cpp b/addons/es1-motor/es1-motor/src/es1-motor.cpp deleted file mode 100644 index 17159da0..00000000 --- a/addons/es1-motor/es1-motor/src/es1-motor.cpp +++ /dev/null @@ -1,116 +0,0 @@ -#include "es1-motor.h" -#include "physics.h" - -//------------------------------------------------------------------------------ -// -//------------------------------------------------------------------------------ -ES1Motor::ES1Motor() : Vehicle () - , traction_level(0.0) - , inc_loc(false) - , dec_loc(false) - , auto_reg(false) -{ - -} - -//------------------------------------------------------------------------------ -// -//------------------------------------------------------------------------------ -ES1Motor::~ES1Motor() -{ - -} - -//------------------------------------------------------------------------------ -// -//------------------------------------------------------------------------------ -void ES1Motor::keyProcess() -{ - double traction_step = 0.1; - - if (keys[KEY_A] && !inc_loc) - { - traction_level += traction_step; - inc_loc = true; - } - else - { - inc_loc = false; - } - - if (keys[KEY_D] && !dec_loc) - { - traction_level -= traction_step; - dec_loc = true; - } - else - { - dec_loc = false; - } - - - - if (keys[KEY_C]) - { - vz = velocity * Physics::kmh; - } - - vz = cut(vz, 0.0, 160.0); -} - -//------------------------------------------------------------------------------ -// -//------------------------------------------------------------------------------ -void ES1Motor::step(double t, double dt) -{ - Q_UNUSED(t) - Q_UNUSED(dt) - - if (auto_reg) - { - double K1 = 1.6; - traction_level = K1 * (vz / Physics::kmh - velocity); - } - - traction_level = Physics::cut(traction_level, -1.0, 1.0); - - double actor_torque = traction_char(velocity) * wheel_diameter / num_axis / 2.0; - - double trac_torque = actor_torque * pf(traction_level); - double brake_troque = actor_torque * nf(traction_level); - - for (size_t i = 1; i < Q_a.size(); i++) - { - Q_a[i] = trac_torque; - Q_r[i] = brake_troque; - } - - DebugMsg = QString("Время: %1 Коорд.: %5 Зад. Скор.: %4 Скор.: %2 Тяга: %3 ") - .arg(t, 10, 'f', 1) - .arg(velocity * Physics::kmh, 6, 'f', 1) - .arg(traction_level, 4, 'f', 1) - .arg(vz, 6, 'f', 1) - .arg(railway_coord, 7, 'f', 2); - - if (next_vehicle != nullptr) - { - DebugMsg += next_vehicle->getDebugMsg(); - } -} - -//------------------------------------------------------------------------------ -// -//------------------------------------------------------------------------------ -double ES1Motor::traction_char(double v) -{ - double max_traction = 127.5e3; - - double vn = 81.0 / Physics::kmh; - - if (abs(v) <= vn) - return max_traction; - else - return max_traction * vn / v; -} - -GET_VEHICLE(ES1Motor) diff --git a/addons/es1-non-motor/es1-non-motor.pro b/addons/es1-non-motor/es1-non-motor.pro deleted file mode 100644 index 34c216a3..00000000 --- a/addons/es1-non-motor/es1-non-motor.pro +++ /dev/null @@ -1,5 +0,0 @@ -TEMPLATE = subdirs - -CONFIG += ordered - -SUBDIRS += ./es1-non-motor diff --git a/addons/es1-non-motor/es1-non-motor/es1-non-motor.pro b/addons/es1-non-motor/es1-non-motor/es1-non-motor.pro deleted file mode 100644 index ed135331..00000000 --- a/addons/es1-non-motor/es1-non-motor/es1-non-motor.pro +++ /dev/null @@ -1,37 +0,0 @@ -TEMPLATE = lib - -QT -= gui -QT += xml - -TARGET = es1-non-motor - -DESTDIR = ../../../../modules/$$join(TARGET,,,) - -CONFIG(debug, debug|release) { - - LIBS += -L../../../../lib -lCfgReader_d - LIBS += -L../../../../lib -lphysics_d - LIBS += -L../../../../lib -lvehicle_d - LIBS += -L../../../../lib -ldevice_d - LIBS += -L../../../lib -lfilesystem_d - -} else { - - LIBS += -L../../../../lib -lCfgReader - LIBS += -L../../../../lib -lphysics - LIBS += -L../../../../lib -lvehicle - LIBS += -L../../../../lib -ldevice - LIBS += -L../../../lib -lfilesystem -} - -INCLUDEPATH += ./include -INCLUDEPATH += ../../../CfgReader/include - -INCLUDEPATH += ../../../simulator/solver/include -INCLUDEPATH += ../../../simulator/physics/include -INCLUDEPATH += ../../../simulator/vehicle/include -INCLUDEPATH += ../../../simulator/device/include -INCLUDEPATH += ../../../filesystem/include - -HEADERS += $$files(./include/*.h) -SOURCES += $$files(./src/*.cpp) diff --git a/addons/es1-non-motor/es1-non-motor/include/es1-non-motor.h b/addons/es1-non-motor/es1-non-motor/include/es1-non-motor.h deleted file mode 100644 index 54484bca..00000000 --- a/addons/es1-non-motor/es1-non-motor/include/es1-non-motor.h +++ /dev/null @@ -1,47 +0,0 @@ -#ifndef SAPSAN_MOTOR_H -#define SAPSAN_MOTOR_H - -#include "vehicle.h" -#include "brake-mech.h" - -//------------------------------------------------------------------------------ -// -//------------------------------------------------------------------------------ -enum -{ - MAX_BRAKE_POS = 7 -}; - -//------------------------------------------------------------------------------ -// -//------------------------------------------------------------------------------ -class ES1NonMotor : public Vehicle -{ -public: - - ES1NonMotor(); - - ~ES1NonMotor(); - -private: - - int brake_pos; - double brake_step; - double pBC_max; - - BrakeMech *brake_mech; - - QString brake_mech_module; - QString brake_mech_config; - - - void initialization(); - - void keyProcess(); - - void step(double t, double dt); - - double traction_char(double v); -}; - -#endif // SAPSAN_MOTOR_H diff --git a/addons/es1-non-motor/es1-non-motor/src/es1-non-motor.cpp b/addons/es1-non-motor/es1-non-motor/src/es1-non-motor.cpp deleted file mode 100644 index c87303c2..00000000 --- a/addons/es1-non-motor/es1-non-motor/src/es1-non-motor.cpp +++ /dev/null @@ -1,79 +0,0 @@ -#include "es1-non-motor.h" -#include "physics.h" -#include "filesystem.h" - -//------------------------------------------------------------------------------ -// -//------------------------------------------------------------------------------ -ES1NonMotor::ES1NonMotor() : Vehicle () - , brake_pos(MAX_BRAKE_POS) - , brake_step(0.0) - , pBC_max(0.5) - , brake_mech(nullptr) - , brake_mech_module("carbrakes-mech") - , brake_mech_config("es1-mech") -{ - -} - -//------------------------------------------------------------------------------ -// -//------------------------------------------------------------------------------ -ES1NonMotor::~ES1NonMotor() -{ - -} - -//------------------------------------------------------------------------------ -// -//------------------------------------------------------------------------------ -void ES1NonMotor::initialization() -{ - brake_step = pBC_max / MAX_BRAKE_POS; - - FileSystem &fs = FileSystem::getInstance(); - QString modules_dir(fs.getModulesDir().c_str()); - - brake_mech = loadBrakeMech(modules_dir + fs.separator() + brake_mech_module); - - if (brake_mech != nullptr) - { - brake_mech->read_config(brake_mech_config); - } -} - -//------------------------------------------------------------------------------ -// -//------------------------------------------------------------------------------ -void ES1NonMotor::keyProcess() -{ - brake_pos = cut(brake_pos, 0, static_cast(MAX_BRAKE_POS)); -} - -//------------------------------------------------------------------------------ -// -//------------------------------------------------------------------------------ -void ES1NonMotor::step(double t, double dt) -{ - Q_UNUSED(t) - Q_UNUSED(dt) - - double pBC_z = brake_pos * brake_step; - double K1 = 5e-2; - double p = brake_mech->getBrakeCylinderPressure(); - double Q = K1 * (pBC_z - p); - brake_mech->setAirFlow(Q); - - for (size_t i = 1; i < Q_a.size(); i++) - { - Q_r[i] = brake_mech->getBrakeTorque(); - } - - brake_mech->step(t, dt); - - DebugMsg = QString(" КрМ: %2 ТЦ: %1") - .arg(p, 4, 'f', 2) - .arg(brake_pos, 1); -} - -GET_VEHICLE(ES1NonMotor) diff --git a/addons/passcar/passcar/include/passcar.h b/addons/passcar/passcar/include/passcar.h index e97b47e0..81f25f34 100644 --- a/addons/passcar/passcar/include/passcar.h +++ b/addons/passcar/passcar/include/passcar.h @@ -7,6 +7,8 @@ #ifndef PASSCAR_H #define PASSCAR_H +#include + #include "vehicle.h" #include "brake-mech.h" #include "reservoir.h" @@ -44,6 +46,10 @@ class PassCarrige : public Vehicle QString electro_airdist_module; QString electro_airdist_config; + QString soundDir; + + QMap sounds; + void initialization(); void step(double t, double dt); @@ -56,6 +62,14 @@ class PassCarrige : public Vehicle void initEPT(); + void initSounds(); + + void soundStep(); + + void getSoundList(); + + void playPasscarSound(QString sound_name); + void stepEPT(double t, double dt); }; diff --git a/addons/passcar/passcar/src/passcar-sound.cpp b/addons/passcar/passcar/src/passcar-sound.cpp new file mode 100644 index 00000000..27cc3e6c --- /dev/null +++ b/addons/passcar/passcar/src/passcar-sound.cpp @@ -0,0 +1,72 @@ +#include "passcar.h" +#include "filesystem.h" + +#include + +//------------------------------------------------------------------------------ +// Инициализация звуков, воспроизведение их на нулевой громкости +//------------------------------------------------------------------------------ +void PassCarrige::initSounds() +{ + getSoundList(); +} + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +void PassCarrige::soundStep() +{ + double speed = velocity * 3.6; + QMap::const_iterator i = sounds.constBegin(); + QString soundPlay = ""; + + while (i != sounds.constEnd()) + { + if (speed >= i.key()) + { + soundPlay = i.value(); + } + if (speed < i.key()) + { + break; + } + ++i; + } + + playPasscarSound(soundPlay); +} + +void PassCarrige::getSoundList() +{ + sounds.insert(5, "passcar_5_10"); + sounds.insert(10, "passcar_10_15"); + sounds.insert(15, "passcar_15_20"); + sounds.insert(20, "passcar_20_30"); + sounds.insert(30, "passcar_30_40"); + sounds.insert(40, "passcar_40_50"); + sounds.insert(50, "passcar_50_60"); + sounds.insert(60, "passcar_60_70"); + sounds.insert(70, "passcar_70_80"); + sounds.insert(80, "passcar_80_90"); + sounds.insert(90, "passcar_90_100"); + sounds.insert(100, "passcar_100_120"); + sounds.insert(120, "passcar_120_140"); +} + +void PassCarrige::playPasscarSound(QString sound_name) +{ + QMap::const_iterator i = sounds.constBegin(); + int volume; + + while (i != sounds.constEnd()) + { + if (sound_name == i.value()) + { + volume = 100; + } else { + volume = 0; + } + emit soundSetVolume(i.value(), volume); + ++i; + } +} diff --git a/addons/passcar/passcar/src/passcar-step-ept.cpp b/addons/passcar/passcar/src/passcar-step-ept.cpp index 5353d089..d17da1f0 100644 --- a/addons/passcar/passcar/src/passcar-step-ept.cpp +++ b/addons/passcar/passcar/src/passcar-step-ept.cpp @@ -1,8 +1,13 @@ #include "passcar.h" - +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ void PassCarrige::stepEPT(double t, double dt) { + Q_UNUSED(t) + Q_UNUSED(dt) + ept_control[0] = 0; if (prev_vehicle != nullptr) @@ -20,5 +25,6 @@ void PassCarrige::stepEPT(double t, double dt) electroAirDist->setControlLine(ept_control[0]); - ept_current[0] += electroAirDist->getValveState(0) + electroAirDist->getValveState(1); + ept_current[0] += electroAirDist->getValveState(0) + + electroAirDist->getValveState(1); } diff --git a/addons/passcar/passcar/src/passcar.cpp b/addons/passcar/passcar/src/passcar.cpp index 302fc3c5..7e8a5504 100644 --- a/addons/passcar/passcar/src/passcar.cpp +++ b/addons/passcar/passcar/src/passcar.cpp @@ -80,6 +80,7 @@ void PassCarrige::initialization() } initEPT(); + initSounds(); } //------------------------------------------------------------------------------ @@ -139,7 +140,9 @@ void PassCarrige::step(double t, double dt) DebugMsg += airdist->getDebugMsg(); DebugMsg += QString(" Тепм. ДР.: %1") - .arg(auxRate, 9, 'f', 4); + .arg(auxRate, 9, 'f', 4); + + soundStep(); } //------------------------------------------------------------------------------ diff --git a/addons/sapsan-motor/sapsan-motor.pro b/addons/sapsan-motor/sapsan-motor.pro deleted file mode 100644 index 19797e36..00000000 --- a/addons/sapsan-motor/sapsan-motor.pro +++ /dev/null @@ -1,5 +0,0 @@ -TEMPLATE = subdirs - -CONFIG += ordered - -SUBDIRS += ./sapsan-motor diff --git a/addons/sapsan-motor/sapsan-motor/include/sapsan-motor.h b/addons/sapsan-motor/sapsan-motor/include/sapsan-motor.h deleted file mode 100644 index 9ce7fff0..00000000 --- a/addons/sapsan-motor/sapsan-motor/include/sapsan-motor.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef SAPSAN_MOTOR_H -#define SAPSAN_MOTOR_H - -#include "vehicle.h" - -class SapsanMotor : public Vehicle -{ -public: - - SapsanMotor(); - - ~SapsanMotor(); - -private: - - double traction_level; - bool inc_loc; - bool dec_loc; - - void keyProcess(); - - void step(double t, double dt); - - double traction_char(double v); -}; - -#endif // SAPSAN_MOTOR_H diff --git a/addons/sapsan-motor/sapsan-motor/sapsan-motor.pro b/addons/sapsan-motor/sapsan-motor/sapsan-motor.pro deleted file mode 100644 index 888601ad..00000000 --- a/addons/sapsan-motor/sapsan-motor/sapsan-motor.pro +++ /dev/null @@ -1,32 +0,0 @@ -TEMPLATE = lib - -QT -= gui -QT += xml - -TARGET = sapsan-motor - -DESTDIR = ../../../../modules/$$join(TARGET,,,) - -CONFIG(debug, debug|release) { - - LIBS += -L../../../../lib -lCfgReader_d - LIBS += -L../../../../lib -lphysics_d - LIBS += -L../../../../lib -lvehicle_d - -} else { - - LIBS += -L../../../../lib -lCfgReader - LIBS += -L../../../../lib -lphysics - LIBS += -L../../../../lib -lvehicle -} - -INCLUDEPATH += ./include -INCLUDEPATH += ../../../CfgReader/include - -INCLUDEPATH += ../../../simulator/solver/include -INCLUDEPATH += ../../../simulator/physics/include -INCLUDEPATH += ../../../simulator/vehicle/include -INCLUDEPATH += ../../../simulator/device/include - -HEADERS += $$files(./include/*.h) -SOURCES += $$files(./src/*.cpp) diff --git a/addons/sapsan-motor/sapsan-motor/src/sapsan-motor.cpp b/addons/sapsan-motor/sapsan-motor/src/sapsan-motor.cpp deleted file mode 100644 index dcbb8a80..00000000 --- a/addons/sapsan-motor/sapsan-motor/src/sapsan-motor.cpp +++ /dev/null @@ -1,68 +0,0 @@ -#include "sapsan-motor.h" -#include "physics.h" - -SapsanMotor::SapsanMotor() : Vehicle () - , traction_level(0.0) - , inc_loc(false) - , dec_loc(false) -{ - -} - -SapsanMotor::~SapsanMotor() -{ - -} - -void SapsanMotor::keyProcess() -{ - double traction_step = 0.1; - - if (keys[97] && !inc_loc) - { - traction_level += traction_step; - inc_loc = true; - } - else - { - inc_loc = false; - } - - if (keys[100] && !dec_loc) - { - traction_level -= traction_step; - dec_loc = true; - } - else - { - dec_loc = false; - } -} - -void SapsanMotor::step(double t, double dt) -{ - Q_UNUSED(t) - Q_UNUSED(dt) - - traction_level = Physics::cut(traction_level, -1.0, 1.0); - - for (size_t i = 0; i < Q_a.size(); i++) - { - double torque = traction_level * traction_char(velocity) * wheel_diameter / num_axis / 2.0; - Q_a[i] = torque; - } -} - -double SapsanMotor::traction_char(double v) -{ - double max_traction = 355e3 / 4.0; - - double vn = 81.0 / Physics::kmh; - - if (abs(v) <= vn) - return max_traction; - else - return max_traction * vn / v; -} - -GET_VEHICLE(SapsanMotor) diff --git a/addons/sapsan-non-motor/sapsan-non-motor.pro b/addons/sapsan-non-motor/sapsan-non-motor.pro deleted file mode 100644 index e9ac9cf0..00000000 --- a/addons/sapsan-non-motor/sapsan-non-motor.pro +++ /dev/null @@ -1,5 +0,0 @@ -TEMPLATE = subdirs - -CONFIG += ordered - -SUBDIRS += ./sapsan-non-motor diff --git a/addons/sapsan-non-motor/sapsan-non-motor/include/sapsan-non-motor.h b/addons/sapsan-non-motor/sapsan-non-motor/include/sapsan-non-motor.h deleted file mode 100644 index cf3dcd8d..00000000 --- a/addons/sapsan-non-motor/sapsan-non-motor/include/sapsan-non-motor.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef SAPSAN_MOTOR_H -#define SAPSAN_MOTOR_H - -#include "vehicle.h" - -class SapsanNonMotor : public Vehicle -{ -public: - - SapsanNonMotor(); - - ~SapsanNonMotor(); -}; - -#endif // SAPSAN_MOTOR_H diff --git a/addons/sapsan-non-motor/sapsan-non-motor/sapsan-non-motor.pro b/addons/sapsan-non-motor/sapsan-non-motor/sapsan-non-motor.pro deleted file mode 100644 index e4ab481e..00000000 --- a/addons/sapsan-non-motor/sapsan-non-motor/sapsan-non-motor.pro +++ /dev/null @@ -1,32 +0,0 @@ -TEMPLATE = lib - -QT -= gui -QT += xml - -TARGET = sapsan-non-motor - -DESTDIR = ../../../../modules/$$join(TARGET,,,) - -CONFIG(debug, debug|release) { - - LIBS += -L../../../../lib -lCfgReader_d - LIBS += -L../../../../lib -lphysics_d - LIBS += -L../../../../lib -lvehicle_d - -} else { - - LIBS += -L../../../../lib -lCfgReader - LIBS += -L../../../../lib -lphysics - LIBS += -L../../../../lib -lvehicle -} - -INCLUDEPATH += ./include -INCLUDEPATH += ../../../CfgReader/include - -INCLUDEPATH += ../../../simulator/solver/include -INCLUDEPATH += ../../../simulator/physics/include -INCLUDEPATH += ../../../simulator/vehicle/include -INCLUDEPATH += ../../../simulator/device/include - -HEADERS += $$files(./include/*.h) -SOURCES += $$files(./src/*.cpp) diff --git a/addons/sapsan-non-motor/sapsan-non-motor/src/spasan-non-motor.cpp b/addons/sapsan-non-motor/sapsan-non-motor/src/spasan-non-motor.cpp deleted file mode 100644 index 216d8f65..00000000 --- a/addons/sapsan-non-motor/sapsan-non-motor/src/spasan-non-motor.cpp +++ /dev/null @@ -1,13 +0,0 @@ -#include "sapsan-non-motor.h" - -SapsanNonMotor::SapsanNonMotor() -{ - -} - -SapsanNonMotor::~SapsanNonMotor() -{ - -} - -GET_VEHICLE(SapsanNonMotor) diff --git a/addons/test-loco/test-loco.pro b/addons/test-loco/test-loco.pro deleted file mode 100644 index ab9bbe1a..00000000 --- a/addons/test-loco/test-loco.pro +++ /dev/null @@ -1,5 +0,0 @@ -TEMPLATE = subdirs - -CONFIG += ordered - -SUBDIRS += ./test-loco diff --git a/addons/test-loco/test-loco/include/test-loco.h b/addons/test-loco/test-loco/include/test-loco.h deleted file mode 100644 index 6f91b4ae..00000000 --- a/addons/test-loco/test-loco/include/test-loco.h +++ /dev/null @@ -1,111 +0,0 @@ -//------------------------------------------------------------------------------ -// -// -// -// -// -//------------------------------------------------------------------------------ -#ifndef TEST_LOCO_H -#define TEST_LOCO_H - -#include "vehicle.h" -#include "brake-crane.h" -#include "brake-mech.h" -#include "physics.h" -#include "reservoir.h" -#include "airdistributor.h" -#include "pneumo-relay.h" -#include "switching-valve.h" -#include "loco-crane.h" -#include "automatic-train-stop.h" -#include "traction-controller.h" -#include "train-horn.h" - -class TestLoco : public Vehicle -{ -public: - - TestLoco(); - ~TestLoco(); - - void initBrakeDevices(double p0, double pTM, double pFL); - -private: - - double tau; - double delay; - - double traction_level; - - bool inc_loc; - bool dec_loc; - - bool inc_crane_loc; - bool dec_crane_loc; - - int crane_pos; - int crane_step; - double crane_motion; - double crane_duration; - - double pz; - bool inc_brake; - bool dec_brake; - - QString brake_crane_module; - QString brake_crane_config; - - BrakeCrane *brake_crane; - BrakeMech *brake_mech; - - QString brake_mech_module; - QString brake_mech_config; - - double charge_press; - - QString loco_crane_module; - QString loco_crane_config; - - double loco_crane_pos; - - QString autostop_module; - QString autostop_config; - - QString traction_controller_module; - QString traction_controller_config; - - AirDistributor *airdist; - - QString airdist_module; - QString airdist_config; - - Reservoir *supply_reservoir; - - PneumoReley *repiter; - - SwitchingValve *zpk; - - LocoCrane *loco_crane; - - - AutoTrainStop *autostop; - - TractionController *trac_controller; - - TrainHorn *horn; - - void step(double t, double dt); - - double traction_char(double V); - - void initialization(); - - void loadConfig(QString cfg_path); - - void keyProcess(); -}; - - - - -#endif // TESTLOCO_H diff --git a/addons/test-loco/test-loco/src/test-loco.cpp b/addons/test-loco/test-loco/src/test-loco.cpp deleted file mode 100644 index ee602d5a..00000000 --- a/addons/test-loco/test-loco/src/test-loco.cpp +++ /dev/null @@ -1,317 +0,0 @@ -#include "test-loco.h" - -#include "CfgReader.h" -#include "filesystem.h" - -#include - -//------------------------------------------------------------------------------ -// -//------------------------------------------------------------------------------ -TestLoco::TestLoco() : Vehicle() - , tau(0.0) - , delay(0.2) - , traction_level(0.0) - , inc_loc(false) - , dec_loc(false) - , inc_crane_loc(false) - , dec_crane_loc(false) - , crane_pos(1) - , crane_step(0) - , crane_motion(1.0) - , crane_duration(0.0) - , pz(0.0) - , inc_brake(false) - , dec_brake(false) - , brake_crane_module("krm395") - , brake_crane_config("krm395") - , brake_crane(nullptr) - , brake_mech(nullptr) - , brake_mech_module("carbrake-mech") - , brake_mech_config("tep70bs-mech") - , charge_press(0.5) - , loco_crane_module("kvt254") - , loco_crane_config("kvt254") - , loco_crane_pos(0.0) - , autostop_module("epk150") - , autostop_config("epk150") - , traction_controller_module("km2202") - , traction_controller_config("km2202") -{ - -} - -//------------------------------------------------------------------------------ -// -//------------------------------------------------------------------------------ -TestLoco::~TestLoco() -{ - -} - -//------------------------------------------------------------------------------ -// -//------------------------------------------------------------------------------ -void TestLoco::initBrakeDevices(double p0, double pTM, double pFL) -{ - if (supply_reservoir != nullptr) - supply_reservoir->setY(0, pTM); - - if (brake_crane != nullptr) - { - brake_crane->init(pTM, pFL); - charge_press = p0; - brake_crane->setChargePressure(charge_press); - } - - if (airdist != nullptr) - airdist->init(pTM, pFL); - - if (autostop != nullptr) - { - autostop->setFeedlinePressure(pFL); - autostop->init(pTM, pFL); - } -} - -//------------------------------------------------------------------------------ -// -//------------------------------------------------------------------------------ -void TestLoco::step(double t, double dt) -{ - feedback_signals_t trac_feedback = trac_controller->getFeedback(); - - //traction_level = Physics::cut(static_cast(trac_feedback.analogSignal[0]), 0.0, 1.0); - - if (brake_mech != nullptr) - { - brake_mech->setVelocity(velocity); - - brake_mech->setAirFlow(repiter->getBrakeCylAirFlow()); - brake_mech->step(t, dt); - } - - for (size_t i = 1; i < Q_a.size(); i++) - { - double torque = traction_level * traction_char(velocity) * wheel_diameter / num_axis / 2.0; - double brakeTorque = brake_mech->getBrakeTorque(); - //Q_a[i] = torque * static_cast(trac_feedback.analogSignal[1]); - Q_r[i] = brakeTorque; - } - - if (brake_crane != nullptr) - { - brake_crane->setChargePressure(charge_press); - brake_crane->setFeedLinePressure(0.9); - p0 = brake_crane->getBrakePipeInitPressure(); - brake_crane->setBrakePipePressure(pTM); - //brake_crane->setPosition(crane_pos); - brake_crane->setControl(keys); - brake_crane->step(t, dt); - } - - if ( supply_reservoir != nullptr ) - { - supply_reservoir->setAirFlow(airdist->getAirSupplyFlow()); - supply_reservoir->step(t, dt); - } - - if ( airdist != nullptr) - { - airdist->setBrakepipePressure(pTM); - //airdist->setBrakeCylinderPressure(repiter->getWorkPressure()); - //airdist->setBrakeCylinderPressure(zpk->getPressure1()); - airdist->setBrakeCylinderPressure(loco_crane->getAirDistribPressure()); - airdist->setAirSupplyPressure(supply_reservoir->getPressure()); - - auxRate = airdist->getAuxRate() + autostop->getEmergencyBrakeRate(); - - airdist->step(t, dt); - } - - repiter->setPipelinePressure(0.9); - repiter->setBrakeCylPressure(brake_mech->getBrakeCylinderPressure()); - //repiter->setWorkAirFlow(airdist->getBrakeCylinderAirFlow()); - repiter->setWorkAirFlow(zpk->getOutputFlow()); - - repiter->step(t, dt); - - zpk->setInputFlow2(loco_crane->getBrakeCylinderFlow()); - //zpk->setInputFlow1(airdist->getBrakeCylinderAirFlow()); - zpk->setInputFlow1(0.0); - zpk->setOutputPressure(repiter->getWorkPressure()); - - zpk->step(t, dt); - - loco_crane->setFeedlinePressure(0.9); - //loco_crane->setAirDistributorFlow(0.0); - loco_crane->setAirDistributorFlow(airdist->getBrakeCylinderAirFlow()); - loco_crane->setBrakeCylinderPressure(zpk->getPressure2()); - //loco_crane->setHandlePosition(loco_crane_pos); - - loco_crane->setControl(keys); - loco_crane->step(t, dt); - - autostop->setFeedlinePressure(0.9); - autostop->setBrakepipePressure(pTM); - - autostop->step(t, dt); - - trac_controller->setControl(keys); - trac_controller->step(t, dt); - - horn->setControl(keys); - horn->step(t, dt); - - emit soundSetPitch("Disel", 1.0f + static_cast(traction_level) / 1.0f); - - DebugMsg = QString("Время: %1 Шаг: %5 Коорд.: %2 Скор.: %3 Тяга: %4 УР: %6 ТМ: %7 ТЦ: %8 КрМ: %9 ЗР: %10 v2: %11") - .arg(t, 7, 'f', 1) - .arg(railway_coord, 10, 'f', 2) - .arg(velocity * Physics::kmh, 6, 'f', 1) - .arg(traction_level, 3, 'f', 1) - .arg(dt, 8, 'f', 6) - .arg(brake_crane->getEqReservoirPressure(), 4, 'f', 2) - .arg(pTM, 4, 'f', 2) - .arg(brake_mech->getBrakeCylinderPressure(), 4, 'f', 2) - .arg(brake_crane->getPositionName(), 4) - .arg(supply_reservoir->getPressure(), 4, 'f', 2) - .arg(airdist->getY(5), 10, 'f', 6); - - DebugMsg += airdist->getDebugMsg(); - - tau += dt; -} - -//------------------------------------------------------------------------------ -// -//------------------------------------------------------------------------------ -double TestLoco::traction_char(double v) -{ - double max_traction = 280e3; - - double vn = 81.0 / Physics::kmh; - - if (abs(v) <= vn) - return max_traction; - else - return max_traction * vn / abs(v); -} - -//------------------------------------------------------------------------------ -// -//------------------------------------------------------------------------------ -void TestLoco::initialization() -{ - FileSystem &fs = FileSystem::getInstance(); - QString modules_dir(fs.getModulesDir().c_str()); - brake_crane = loadBrakeCrane(modules_dir + fs.separator() + brake_crane_module); - brake_mech = loadBrakeMech(modules_dir + fs.separator() + brake_mech_module); - supply_reservoir = new Reservoir(0.078); - - airdist = loadAirDistributor(modules_dir + fs.separator() + airdist_module); - - repiter = new PneumoReley(); - repiter->read_config("rd304"); - - zpk = new SwitchingValve(); - zpk->read_config("zpk"); - - if (brake_crane != nullptr) - { - brake_crane->read_config(brake_crane_config); - - brake_mech->read_config(brake_mech_config); - brake_mech->setEffFricRadius(wheel_diameter / 2.0); - brake_mech->setWheelDiameter(wheel_diameter); - - airdist->read_config(airdist_config); - - connect(brake_crane, &BrakeCrane::soundSetVolume, this, &TestLoco::soundSetVolume); - } - - loco_crane = loadLocoCrane(modules_dir + fs.separator() + loco_crane_module); - - if (loco_crane != nullptr) - { - loco_crane->read_config(loco_crane_config); - } - - autostop = loadAutoTrainStop(modules_dir + fs.separator() + autostop_module); - - if (autostop != nullptr) - { - autostop->read_config(autostop_config); - autostop->powerOn(true); - autostop->keyOn(false); - - connect(autostop, &AutoTrainStop::soundSetVolume, this, &TestLoco::soundSetVolume); - } - - trac_controller = loadTractionController(modules_dir + fs.separator() + traction_controller_module); - - - if (trac_controller != nullptr) - { - trac_controller->read_config(traction_controller_config); - } - - horn = new TrainHorn(); - connect(horn, &TrainHorn::soundSetVolume, this, &TestLoco::soundSetVolume); -} - -//------------------------------------------------------------------------------ -// -//------------------------------------------------------------------------------ -void TestLoco::loadConfig(QString cfg_path) -{ - CfgReader cfg; - - if (cfg.load(cfg_path)) - { - QString secName = "Vehicle"; - - cfg.getString(secName, "BrakeCraneModule", brake_crane_module); - cfg.getString(secName, "BrakeCraneConfig", brake_crane_config); - - cfg.getString(secName, "BrakeMechModule", brake_mech_module); - cfg.getString(secName, "BrakeMechCinfig", brake_mech_config); - - cfg.getString(secName, "AirDistModule", airdist_module); - cfg.getString(secName, "AirDistConfig", airdist_config); - } -} - -//------------------------------------------------------------------------------ -// -//------------------------------------------------------------------------------ -void TestLoco::keyProcess() -{ - analogSignal[0] = static_cast(traction_level); - analogSignal[1] = static_cast(brake_crane->getBrakePipeInitPressure()); - analogSignal[2] = static_cast(brake_crane->getEqReservoirPressure()); - analogSignal[3] = crane_pos; - analogSignal[4] = static_cast(pTM); - - analogSignal[20] = brake_crane->getHandlePosition(); - analogSignal[21] = static_cast(pTM / 1.0); - analogSignal[22] = static_cast(brake_crane->getEqReservoirPressure() / 1.0); - analogSignal[23] = static_cast(0.9 / 1.6); - analogSignal[24] = static_cast(repiter->getWorkPressure() / 1.0); - analogSignal[25] = static_cast(brake_mech->getBrakeCylinderPressure() / 1.0); - analogSignal[26] = static_cast(abs(velocity) * Physics::kmh / 220.0); - analogSignal[27] = static_cast(abs(velocity) * Physics::kmh / 150.0); - analogSignal[28] = static_cast(traction_level); - analogSignal[29] = static_cast(loco_crane->getHandlePosition()); - - analogSignal[194] = static_cast(wheel_rotation_angle[0] / 2.0 / Physics::PI); - analogSignal[195] = static_cast(wheel_rotation_angle[1] / 2.0 / Physics::PI); - analogSignal[196] = static_cast(wheel_rotation_angle[2] / 2.0 / Physics::PI); - analogSignal[197] = static_cast(wheel_rotation_angle[3] / 2.0 / Physics::PI); - analogSignal[198] = static_cast(wheel_rotation_angle[4] / 2.0 / Physics::PI); - analogSignal[199] = static_cast(wheel_rotation_angle[5] / 2.0 / Physics::PI); - - //analogSignal[30] = trac_controller->getFeedback().analogSignal[1]; -} - -GET_VEHICLE(TestLoco) diff --git a/addons/test-loco/test-loco/test-loco.pro b/addons/test-loco/test-loco/test-loco.pro deleted file mode 100644 index 8d95d4e3..00000000 --- a/addons/test-loco/test-loco/test-loco.pro +++ /dev/null @@ -1,39 +0,0 @@ -TEMPLATE = lib - -QT -= gui -QT += xml - -TARGET = test-loco - -DESTDIR = ../../../../modules/$$join(TARGET,,,) - -#CONFIG += force_debug_info - -CONFIG(debug, debug|release) { - - LIBS += -L../../../../lib -lCfgReader_d - LIBS += -L../../../../lib -lphysics_d - LIBS += -L../../../../lib -lvehicle_d - LIBS += -L../../../../lib -ldevice_d - LIBS += -L../../../lib -lfilesystem_d - -} else { - - LIBS += -L../../../../lib -lCfgReader - LIBS += -L../../../../lib -lphysics - LIBS += -L../../../../lib -lvehicle - LIBS += -L../../../../lib -ldevice - LIBS += -L../../../lib -lfilesystem -} - -INCLUDEPATH += ./include -INCLUDEPATH += ../../../CfgReader/include - -INCLUDEPATH += ../../../simulator/solver/include -INCLUDEPATH += ../../../simulator/physics/include -INCLUDEPATH += ../../../simulator/vehicle/include -INCLUDEPATH += ../../../simulator/device/include -INCLUDEPATH += ../../../filesystem/include - -HEADERS += $$files(./include/*.h) -SOURCES += $$files(./src/*.cpp) diff --git a/addons/vl60/vl60-equipment/include/ekg-8g.h b/addons/vl60/vl60-equipment/include/ekg-8g.h index 3478896d..c6d38687 100644 --- a/addons/vl60/vl60-equipment/include/ekg-8g.h +++ b/addons/vl60/vl60-equipment/include/ekg-8g.h @@ -65,6 +65,9 @@ class EKG_8G : public Device bool is_auto; + /// Имя звука ЭКГ-8Ж + QString sound_name; + /// Таймер управления переключением позиций Timer pos_switcher; diff --git a/addons/vl60/vl60-equipment/include/kme-60-044.h b/addons/vl60/vl60-equipment/include/kme-60-044.h index 47556dd5..a12d70f5 100644 --- a/addons/vl60/vl60-equipment/include/kme-60-044.h +++ b/addons/vl60/vl60-equipment/include/kme-60-044.h @@ -28,7 +28,6 @@ class ControllerKME_60_044 : public TractionController /// Состояние главного вала int main_pos; - /// Состояние реверсивного вала int revers_pos; diff --git a/addons/vl60/vl60-equipment/src/dc-motor.cpp b/addons/vl60/vl60-equipment/src/dc-motor.cpp index 1e766d37..c00c7370 100644 --- a/addons/vl60/vl60-equipment/src/dc-motor.cpp +++ b/addons/vl60/vl60-equipment/src/dc-motor.cpp @@ -109,6 +109,8 @@ void DCMotor::setDirection(int revers_state) //------------------------------------------------------------------------------ void DCMotor::preStep(state_vector_t &Y, double t) { + Q_UNUSED(t) + torque = Y[0] * calcCPhi(Y[0] * beta * direction); emit soundSetPitch("TED", static_cast(abs(omega) / omega_nom)); @@ -122,6 +124,8 @@ void DCMotor::ode_system(const state_vector_t &Y, state_vector_t &dYdt, double t) { + Q_UNUSED(t) + double R = R_a + beta * R_gp + R_dp + R_r; double E = omega * calcCPhi(Y[0] * beta * direction); diff --git a/addons/vl60/vl60-equipment/src/ekg-8g.cpp b/addons/vl60/vl60-equipment/src/ekg-8g.cpp index 4151c843..bd360d18 100644 --- a/addons/vl60/vl60-equipment/src/ekg-8g.cpp +++ b/addons/vl60/vl60-equipment/src/ekg-8g.cpp @@ -14,6 +14,7 @@ EKG_8G::EKG_8G(QObject *parent) : Device(parent) , is_fix_off(false) , dir(0) , is_auto(false) + , sound_name("") { connect(&pos_switcher, &Timer::process, this, &EKG_8G::slotPosSwitch); @@ -99,6 +100,7 @@ void EKG_8G::process() // Нулевая позиция if (km_state.pos_state[POS_ZERO] && (position != 0) && !is_auto) { + sound_name = "EKG_serv_auto"; pos_switcher.start(); dir = -1; } @@ -106,6 +108,7 @@ void EKG_8G::process() // Фиксация пуска if (km_state.pos_state[POS_FP]) { + sound_name = ""; is_fix_start = true; dir = 1; } @@ -113,6 +116,7 @@ void EKG_8G::process() // Ручной пуск if (km_state.pos_state[POS_RP] && is_fix_start) { + sound_name = "EKG_serv_rp"; is_fix_start = false; pos_switcher.start(); } @@ -120,6 +124,7 @@ void EKG_8G::process() // Фиксация выключения if (km_state.pos_state[POS_FV]) { + sound_name = ""; is_fix_off = true; dir = -1; } @@ -127,6 +132,7 @@ void EKG_8G::process() // Ручное выключение if (km_state.pos_state[POS_RV] && is_fix_off) { + sound_name = "EKG_serv_rp"; is_fix_off = false; pos_switcher.start(); } @@ -134,6 +140,7 @@ void EKG_8G::process() // Автоматический пуск if (km_state.pos_state[POS_AP] && !is_auto) { + sound_name = "EKG_serv_auto"; pos_switcher.start(); dir = 1; } @@ -141,6 +148,7 @@ void EKG_8G::process() // Автоматический пуск if (km_state.pos_state[POS_AV] && !is_auto) { + sound_name = "EKG_serv_auto"; pos_switcher.start(); dir = -1; } @@ -153,6 +161,9 @@ void EKG_8G::process() //------------------------------------------------------------------------------ void EKG_8G::preStep(state_vector_t &Y, double t) { + Q_UNUSED(Y) + Q_UNUSED(t) + // Если на ЭКГ подано питание if (is_enabled) { @@ -219,7 +230,7 @@ void EKG_8G::slotPosSwitch() position = cut(position, 0, static_cast(NUM_POSITIONS - 1)); if ( (position != 0) && (position != NUM_POSITIONS - 1) ) - emit soundPlay("EKG_serv"); + emit soundPlay(sound_name); // Останавливаемся, если не находимся на переходных позициях if ( ( (position < PP_MIN) || (position > PP_MAX) ) && !is_auto ) diff --git a/addons/vl60/vl60-equipment/src/kme-60-044.cpp b/addons/vl60/vl60-equipment/src/kme-60-044.cpp index edf80cc5..e46bd882 100644 --- a/addons/vl60/vl60-equipment/src/kme-60-044.cpp +++ b/addons/vl60/vl60-equipment/src/kme-60-044.cpp @@ -66,6 +66,9 @@ void ControllerKME_60_044::setReversPos(int pos) //------------------------------------------------------------------------------ void ControllerKME_60_044::preStep(state_vector_t &Y, double t) { + Q_UNUSED(Y) + Q_UNUSED(t) + std::fill(state.pos_state.begin(), state.pos_state.end(), false); state.pos_state[static_cast(main_pos)] = true; @@ -91,7 +94,9 @@ void ControllerKME_60_044::ode_system(const state_vector_t &Y, state_vector_t &dYdt, double t) { - + Q_UNUSED(Y) + Q_UNUSED(dYdt) + Q_UNUSED(t) } //------------------------------------------------------------------------------ @@ -99,7 +104,7 @@ void ControllerKME_60_044::ode_system(const state_vector_t &Y, //------------------------------------------------------------------------------ void ControllerKME_60_044::load_config(CfgReader &cfg) { - + Q_UNUSED(cfg) } //------------------------------------------------------------------------------ @@ -176,9 +181,14 @@ void ControllerKME_60_044::incMain() if (revers_pos == REVERS_ZERO) return; + int main_pos_old = main_pos; + main_pos++; main_pos = cut(main_pos, static_cast(POS_BV), static_cast(POS_AP)); + + if (main_pos_old != main_pos) + emit soundPlay("kme_60_044"); } //------------------------------------------------------------------------------ @@ -189,9 +199,14 @@ void ControllerKME_60_044::decMain() if (revers_pos == REVERS_ZERO) return; + int main_pos_old = main_pos; + main_pos--; main_pos = cut(main_pos, static_cast(POS_BV), static_cast(POS_AP)); + + if (main_pos_old != main_pos) + emit soundPlay("kme_60_044"); } //------------------------------------------------------------------------------ @@ -202,9 +217,14 @@ void ControllerKME_60_044::incRevers() if ( (revers_pos == REVERS_BACKWARD) && (main_pos != POS_ZERO) ) return; + int revers_pos_old = revers_pos; + revers_pos++; revers_pos = cut(revers_pos, static_cast(REVERS_BACKWARD), static_cast(REVERS_OP3)); + + if (revers_pos_old != revers_pos) + emit soundPlay("revers"); } //------------------------------------------------------------------------------ @@ -215,7 +235,12 @@ void ControllerKME_60_044::decRevers() if ( (revers_pos == REVERS_FORWARD) && (main_pos != POS_ZERO) ) return; + int revers_pos_old = revers_pos; + revers_pos--; revers_pos = cut(revers_pos, static_cast(REVERS_BACKWARD), static_cast(REVERS_OP3)); + + if (revers_pos_old != revers_pos) + emit soundPlay("revers"); } diff --git a/addons/vl60/vl60-equipment/src/motor-fan.cpp b/addons/vl60/vl60-equipment/src/motor-fan.cpp index a8b37dd8..2412284d 100644 --- a/addons/vl60/vl60-equipment/src/motor-fan.cpp +++ b/addons/vl60/vl60-equipment/src/motor-fan.cpp @@ -31,6 +31,15 @@ MotorFan::~MotorFan() //------------------------------------------------------------------------------ void MotorFan::setU_power(double value) { + QString sndName = QString("Motor_Fan%1").arg(idx); + + if (floor(value) > 0 && floor(U_power) == 0) + emit soundPlay(sndName); + + if (floor(value) == 0 && floor(U_power) > 0) + emit soundStop(sndName); + + U_power = value; } @@ -47,11 +56,12 @@ float MotorFan::isNoReady() //------------------------------------------------------------------------------ void MotorFan::preStep(state_vector_t &Y, double t) { + Q_UNUSED(t) + QString sndName = QString("Motor_Fan%1").arg(idx); is_no_ready = hs_n(Y[0] - 0.95 * omega_nom); - - emit soundSetPitch(sndName, static_cast(Y[0] / omega0)); + //emit soundSetPitch(sndName, static_cast(Y[0] / omega0)); } //------------------------------------------------------------------------------ @@ -83,5 +93,5 @@ void MotorFan::ode_system(const state_vector_t &Y, //------------------------------------------------------------------------------ void MotorFan::load_config(CfgReader &cfg) { - + Q_UNUSED(cfg) } diff --git a/addons/vl60/vl60-equipment/src/phase-splitter.cpp b/addons/vl60/vl60-equipment/src/phase-splitter.cpp index 5633687b..793d9f65 100644 --- a/addons/vl60/vl60-equipment/src/phase-splitter.cpp +++ b/addons/vl60/vl60-equipment/src/phase-splitter.cpp @@ -31,6 +31,12 @@ PhaseSplitter::~PhaseSplitter() //------------------------------------------------------------------------------ void PhaseSplitter::setU_power(double value) { + if (floor(value) > 0 && floor(U_power) == 0) + emit soundPlay("Phase_Splitter"); + + if (floor(value) == 0 && floor(U_power) > 0) + emit soundStop("Phase_Splitter"); + U_power = value; } @@ -59,7 +65,7 @@ void PhaseSplitter::preStep(state_vector_t &Y, double t) U_out = k_eds * Y[0]; - emit soundSetPitch("Phase_Splitter", static_cast(Y[0] / omega0)); + //emit soundSetPitch("Phase_Splitter", static_cast(Y[0] / omega0)); } //------------------------------------------------------------------------------ diff --git a/addons/vl60/vl60k/include/vl60.h b/addons/vl60/vl60k/include/vl60.h index 1d9e1bdc..215af359 100644 --- a/addons/vl60/vl60k/include/vl60.h +++ b/addons/vl60/vl60k/include/vl60.h @@ -61,6 +61,9 @@ class VL60k : public Vehicle MAIN_RESERVOIR_VOLUME = 1200 }; + /// Список звуков перестука + QList tap_sounds; + float pant1_pos; float pant2_pos; float gv_pos; @@ -254,6 +257,8 @@ class VL60k : public Vehicle void initTriggers(); + void initTapSounds(); + /// Шаг симуляции всех систем электровоза void step(double t, double dt); @@ -282,12 +287,16 @@ class VL60k : public Vehicle void stepOtherEquipment(double t, double dt); + void stepTapSound(); + void lineContactorsControl(bool state); float isLineContactorsOff(); void stepSignalsOutput(); + void stepDecodeAlsn(); + double getTractionForce(); bool getHoldingCoilState() const; diff --git a/addons/vl60/vl60k/src/vl60-debug.cpp b/addons/vl60/vl60k/src/vl60-debug.cpp index aa905675..b3ecc62f 100644 --- a/addons/vl60/vl60k/src/vl60-debug.cpp +++ b/addons/vl60/vl60k/src/vl60-debug.cpp @@ -5,18 +5,10 @@ //------------------------------------------------------------------------------ void VL60k::debugPrint(double t) { - DebugMsg = QString("t: %1 x: %12 км v: %11 км/ч ЗР: %2 МПа ТЦ1: %3 ТЦ2: %4 Наж. на колодку: %5 кН Uву: %10 В Uтэд: %6 В Поз.: %7 Iя: %8 А Iв: %9 А") - + DebugMsg = QString("t: %1 x: %2 км v: %3 км/ч АЛСН: %4 Дист.: %5") .arg(t, 10, 'f', 2) - .arg(supply_reservoir->getPressure(), 4, 'f', 2) - .arg(trolley_mech[TROLLEY_FWD]->getBrakeCylinderPressure(), 4, 'f', 2) - .arg(trolley_mech[TROLLEY_BWD]->getBrakeCylinderPressure(), 4, 'f', 2) - .arg(trolley_mech[TROLLEY_FWD]->getShoeForce() / 1000.0, 5, 'f', 1) - .arg(motor[TED1]->getUd(), 6, 'f', 1) - .arg(trac_trans->getPosName(), 2) - .arg(motor[TED1]->getIa(), 6,'f',1) - .arg(motor[TED1]->getIf(), 6,'f',1) - .arg(vu[VU1]->getU_out(), 6, 'f', 1) + .arg((railway_coord + dir * length / 2.0) / 1000.0, 8, 'f', 3) .arg(velocity * Physics::kmh, 6, 'f', 1) - .arg(railway_coord / 1000.0, 7, 'f', 2); + .arg(alsn_info.code_alsn, 2) + .arg(alsn_info.signal_dist, 7, 'f', 1); } diff --git a/addons/vl60/vl60k/src/vl60-decode-alsn.cpp b/addons/vl60/vl60k/src/vl60-decode-alsn.cpp new file mode 100644 index 00000000..9ef6ba7a --- /dev/null +++ b/addons/vl60/vl60k/src/vl60-decode-alsn.cpp @@ -0,0 +1,46 @@ +#include "vl60.h" + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +void VL60k::stepDecodeAlsn() +{ + analogSignal[LS_W] = 0.0f; + analogSignal[LS_YK] = 0.0f; + analogSignal[LS_R] = 0.0f; + analogSignal[LS_Y] = 0.0f; + analogSignal[LS_G] = 0.0f; + + switch (alsn_info.code_alsn) + { + case ALSN_WHITE: + + analogSignal[LS_W] = 1.0f; + + break; + + case ALSN_RED: + + analogSignal[LS_R] = 1.0f; + + break; + + case ALSN_RED_YELLOW: + + analogSignal[LS_YK] = 1.0f; + + break; + + case ALSN_YELLOW: + + analogSignal[LS_Y] = 1.0f; + + break; + + case ALSN_GREEN: + + analogSignal[LS_G] = 1.0f; + + break; + } +} diff --git a/addons/vl60/vl60k/src/vl60-init.cpp b/addons/vl60/vl60k/src/vl60-init.cpp index 7f3479d5..ad28d605 100644 --- a/addons/vl60/vl60k/src/vl60-init.cpp +++ b/addons/vl60/vl60k/src/vl60-init.cpp @@ -61,12 +61,14 @@ void VL60k::initHighVoltageScheme() void VL60k::initSupplyMachines() { phase_spliter = new PhaseSplitter(); - connect(phase_spliter, &PhaseSplitter::soundSetPitch, this, &VL60k::soundSetPitch); + connect(phase_spliter, &PhaseSplitter::soundPlay, this, &VL60k::soundPlay); + connect(phase_spliter, &PhaseSplitter::soundStop, this, &VL60k::soundStop); for (size_t i = 0; i < motor_fans.size(); ++i) { motor_fans[i] = new MotorFan(i + 1); - connect(motor_fans[i], &MotorFan::soundSetPitch, this, &VL60k::soundSetPitch); + connect(motor_fans[i], &MotorFan::soundPlay, this, &VL60k::soundPlay); + connect(motor_fans[i], &MotorFan::soundStop, this, &VL60k::soundStop); } main_reservoir = new Reservoir(static_cast(MAIN_RESERVOIR_VOLUME) / 1000.0); @@ -94,6 +96,9 @@ void VL60k::initBrakeControls(QString modules_dir) loco_crane = loadLocoCrane(modules_dir + QDir::separator() + "kvt254"); loco_crane->read_config("kvt254"); + connect(loco_crane, &LocoCrane::soundPlay, this, &VL60k::soundPlay); + connect(loco_crane, &LocoCrane::soundStop, this, &VL60k::soundStop); + connect(loco_crane, &LocoCrane::soundSetVolume, this, &VL60k::soundSetVolume); } //------------------------------------------------------------------------------ @@ -141,6 +146,7 @@ void VL60k::initBrakeEquipment(QString modules_dir) void VL60k::initTractionControl() { controller = new ControllerKME_60_044(); + connect(controller, &ControllerKME_60_044::soundPlay, this, &VL60k::soundPlay); main_controller = new EKG_8G(); main_controller->read_custom_config(config_dir + QDir::separator() + "ekg-8g"); @@ -180,6 +186,8 @@ void VL60k::initOtherEquipment() horn = new TrainHorn(); connect(horn, &TrainHorn::soundSetVolume, this, &VL60k::soundSetVolume); + connect(horn, &TrainHorn::soundPlay, this, &VL60k::soundPlay); + connect(horn, &TrainHorn::soundStop, this, &VL60k::soundStop); //reg = new Registrator("brakes"); } @@ -206,6 +214,23 @@ void VL60k::initTriggers() start_count = 0; } +void VL60k::initTapSounds() { + QString f_p = "tap_"; + + tap_sounds << (f_p + "5-10"); + tap_sounds << (f_p + "10-20"); + tap_sounds << (f_p + "20-30"); + tap_sounds << (f_p + "30-40"); + tap_sounds << (f_p + "40-50"); + tap_sounds << (f_p + "50-60"); + tap_sounds << (f_p + "60-70"); + tap_sounds << (f_p + "70-80"); + tap_sounds << (f_p + "80-90"); + tap_sounds << (f_p + "90-100"); + tap_sounds << (f_p + "100-110"); + tap_sounds << (f_p + "110-~"); +} + //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ @@ -234,4 +259,6 @@ void VL60k::initialization() initOtherEquipment(); initTriggers(); + + initTapSounds(); } diff --git a/addons/vl60/vl60k/src/vl60-signals-output.cpp b/addons/vl60/vl60k/src/vl60-signals-output.cpp index 287bef7d..63a883a0 100644 --- a/addons/vl60/vl60k/src/vl60-signals-output.cpp +++ b/addons/vl60/vl60k/src/vl60-signals-output.cpp @@ -40,7 +40,7 @@ void VL60k::stepSignalsOutput() analogSignal[GV_POS] = static_cast(main_switch->getKnifePos()); // Состояние локомотивного светофора - analogSignal[LS_G] = 1.0f; + stepDecodeAlsn(); // Состояние контрольных ламп analogSignal[SIG_LIGHT_GV] = main_switch->getLampState(); diff --git a/addons/vl60/vl60k/src/vl60-step.cpp b/addons/vl60/vl60k/src/vl60-step.cpp index 7d1addfd..960a870d 100644 --- a/addons/vl60/vl60k/src/vl60-step.cpp +++ b/addons/vl60/vl60k/src/vl60-step.cpp @@ -14,6 +14,19 @@ void VL60k::stepOtherEquipment(double t, double dt) debugPrint(t); } +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +void VL60k::stepTapSound() +{ + double speed = abs(this->velocity) * 3.6; + + for (int i = 0; i < tap_sounds.count(); ++i) + { + emit volumeCurveStep(tap_sounds[i], static_cast(speed)); + } +} + //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ @@ -45,6 +58,8 @@ void VL60k::step(double t, double dt) stepOtherEquipment(t, dt); + stepTapSound(); + autoStartTimer->step(t, dt); } diff --git a/addons/vl60/vl60pk/include/vl60.h b/addons/vl60/vl60pk/include/vl60.h index f5e91ecf..d7643f31 100644 --- a/addons/vl60/vl60pk/include/vl60.h +++ b/addons/vl60/vl60pk/include/vl60.h @@ -61,6 +61,9 @@ class VL60pk : public Vehicle MAIN_RESERVOIR_VOLUME = 1200 }; + /// Список звуков перестука + QList tap_sounds; + double U_bat; float pant1_pos; @@ -265,6 +268,8 @@ class VL60pk : public Vehicle void initTriggers(); + void initTapSounds(); + /// Инициализация ЭПТ void initEPT(const QString &modules_dir); @@ -297,12 +302,16 @@ class VL60pk : public Vehicle void stepEPT(double t, double dt); + void stepTapSound(); + void lineContactorsControl(bool state); float isLineContactorsOff(); void stepSignalsOutput(); + void stepDecodeAlsn(); + double getTractionForce(); bool getHoldingCoilState() const; diff --git a/addons/vl60/vl60pk/src/vl60-debug.cpp b/addons/vl60/vl60pk/src/vl60-debug.cpp index e2139716..a2bc0a59 100644 --- a/addons/vl60/vl60pk/src/vl60-debug.cpp +++ b/addons/vl60/vl60pk/src/vl60-debug.cpp @@ -5,20 +5,12 @@ //------------------------------------------------------------------------------ void VL60pk::debugPrint(double t) { - DebugMsg = QString("t: %1 x: %12 км v: %11 км/ч ЗР: %2 МПа ТЦ1: %3 ТЦ2: %4 Наж. на колодку: %5 кН Uву: %10 В Uтэд: %6 В Поз.: %7 Iя: %8 А Iв: %9 А") - + DebugMsg = QString("t: %1 x: %2 км v: %3 км/ч АЛСН: %4 Дист.: %5") .arg(t, 10, 'f', 2) - .arg(supply_reservoir->getPressure(), 4, 'f', 2) - .arg(trolley_mech[TROLLEY_FWD]->getBrakeCylinderPressure(), 4, 'f', 2) - .arg(trolley_mech[TROLLEY_BWD]->getBrakeCylinderPressure(), 4, 'f', 2) - .arg(trolley_mech[TROLLEY_FWD]->getShoeForce() / 1000.0, 5, 'f', 1) - .arg(motor[TED1]->getUd(), 6, 'f', 1) - .arg(trac_trans->getPosName(), 2) - .arg(motor[TED1]->getIa(), 6,'f',1) - .arg(motor[TED1]->getIf(), 6,'f',1) - .arg(vu[VU1]->getU_out(), 6, 'f', 1) + .arg((railway_coord + dir * length / 2.0) / 1000.0, 8, 'f', 3) .arg(velocity * Physics::kmh, 6, 'f', 1) - .arg(railway_coord / 1000.0, 7, 'f', 2); + .arg(alsn_info.code_alsn, 2) + .arg(alsn_info.signal_dist, 7, 'f', 1); //DebugMsg = brake_crane->getDebugMsg(); } diff --git a/addons/vl60/vl60pk/src/vl60-decode-alsn.cpp b/addons/vl60/vl60pk/src/vl60-decode-alsn.cpp new file mode 100644 index 00000000..d8283c1a --- /dev/null +++ b/addons/vl60/vl60pk/src/vl60-decode-alsn.cpp @@ -0,0 +1,46 @@ +#include "vl60.h" + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +void VL60pk::stepDecodeAlsn() +{ + analogSignal[LS_W] = 0.0f; + analogSignal[LS_YK] = 0.0f; + analogSignal[LS_R] = 0.0f; + analogSignal[LS_Y] = 0.0f; + analogSignal[LS_G] = 0.0f; + + switch (alsn_info.code_alsn) + { + case ALSN_WHITE: + + analogSignal[LS_W] = 1.0f; + + break; + + case ALSN_RED: + + analogSignal[LS_R] = 1.0f; + + break; + + case ALSN_RED_YELLOW: + + analogSignal[LS_YK] = 1.0f; + + break; + + case ALSN_YELLOW: + + analogSignal[LS_Y] = 1.0f; + + break; + + case ALSN_GREEN: + + analogSignal[LS_G] = 1.0f; + + break; + } +} diff --git a/addons/vl60/vl60pk/src/vl60-init.cpp b/addons/vl60/vl60pk/src/vl60-init.cpp index ade79865..3a92a719 100644 --- a/addons/vl60/vl60pk/src/vl60-init.cpp +++ b/addons/vl60/vl60pk/src/vl60-init.cpp @@ -61,12 +61,15 @@ void VL60pk::initHighVoltageScheme() void VL60pk::initSupplyMachines() { phase_spliter = new PhaseSplitter(); - connect(phase_spliter, &PhaseSplitter::soundSetPitch, this, &VL60pk::soundSetPitch); + connect(phase_spliter, &PhaseSplitter::soundPlay, this, &VL60pk::soundPlay); + connect(phase_spliter, &PhaseSplitter::soundStop, this, &VL60pk::soundStop); for (size_t i = 0; i < motor_fans.size(); ++i) { motor_fans[i] = new MotorFan(i + 1); - connect(motor_fans[i], &MotorFan::soundSetPitch, this, &VL60pk::soundSetPitch); + //connect(motor_fans[i], &MotorFan::soundSetPitch, this, &VL60pk::soundSetPitch); + connect(motor_fans[i], &MotorFan::soundPlay, this, &VL60pk::soundPlay); + connect(motor_fans[i], &MotorFan::soundStop, this, &VL60pk::soundStop); } main_reservoir = new Reservoir(static_cast(MAIN_RESERVOIR_VOLUME) / 1000.0); @@ -94,6 +97,9 @@ void VL60pk::initBrakeControls(QString modules_dir) loco_crane = loadLocoCrane(modules_dir + QDir::separator() + "kvt254"); loco_crane->read_config("kvt254"); + connect(loco_crane, &LocoCrane::soundPlay, this, &VL60pk::soundPlay); + connect(loco_crane, &LocoCrane::soundStop, this, &VL60pk::soundStop); + connect(loco_crane, &LocoCrane::soundSetVolume, this, &VL60pk::soundSetVolume); } //------------------------------------------------------------------------------ @@ -136,6 +142,7 @@ void VL60pk::initBrakeEquipment(QString modules_dir) void VL60pk::initTractionControl() { controller = new ControllerKME_60_044(); + connect(controller, &ControllerKME_60_044::soundPlay, this, &VL60pk::soundPlay); main_controller = new EKG_8G(); main_controller->read_custom_config(config_dir + QDir::separator() + "ekg-8g"); @@ -174,7 +181,9 @@ void VL60pk::initOtherEquipment() connect(speed_meter, &SL2M::soundSetVolume, this, &VL60pk::soundSetVolume); horn = new TrainHorn(); + connect(horn, &TrainHorn::soundPlay, this, &VL60pk::soundPlay); connect(horn, &TrainHorn::soundSetVolume, this, &VL60pk::soundSetVolume); + connect(horn, &TrainHorn::soundStop, this, &VL60pk::soundStop); //reg = new Registrator("brakes"); } @@ -201,6 +210,23 @@ void VL60pk::initTriggers() start_count = 0; } +void VL60pk::initTapSounds() { + QString f_p = "tap_"; + + tap_sounds << (f_p + "5-10"); + tap_sounds << (f_p + "10-20"); + tap_sounds << (f_p + "20-30"); + tap_sounds << (f_p + "30-40"); + tap_sounds << (f_p + "40-50"); + tap_sounds << (f_p + "50-60"); + tap_sounds << (f_p + "60-70"); + tap_sounds << (f_p + "70-80"); + tap_sounds << (f_p + "80-90"); + tap_sounds << (f_p + "90-100"); + tap_sounds << (f_p + "100-110"); + tap_sounds << (f_p + "110-~"); +} + //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ @@ -231,4 +257,6 @@ void VL60pk::initialization() initTriggers(); initEPT(modules_dir); + + initTapSounds(); } diff --git a/addons/vl60/vl60pk/src/vl60-signals-output.cpp b/addons/vl60/vl60pk/src/vl60-signals-output.cpp index a2dd293c..1481e45e 100644 --- a/addons/vl60/vl60pk/src/vl60-signals-output.cpp +++ b/addons/vl60/vl60pk/src/vl60-signals-output.cpp @@ -40,7 +40,7 @@ void VL60pk::stepSignalsOutput() analogSignal[GV_POS] = static_cast(main_switch->getKnifePos()); // Состояние локомотивного светофора - analogSignal[LS_G] = 1.0f; + stepDecodeAlsn(); // Состояние контрольных ламп analogSignal[SIG_LIGHT_GV] = main_switch->getLampState(); diff --git a/addons/vl60/vl60pk/src/vl60-step.cpp b/addons/vl60/vl60pk/src/vl60-step.cpp index 54e7dcf2..9a474c42 100644 --- a/addons/vl60/vl60pk/src/vl60-step.cpp +++ b/addons/vl60/vl60pk/src/vl60-step.cpp @@ -14,6 +14,19 @@ void VL60pk::stepOtherEquipment(double t, double dt) debugPrint(t); } +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +void VL60pk::stepTapSound() +{ + double speed = abs(this->velocity) * 3.6; + + for (int i = 0; i < tap_sounds.count(); ++i) + { + emit volumeCurveStep(tap_sounds[i], static_cast(speed)); + } +} + //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ @@ -47,6 +60,8 @@ void VL60pk::step(double t, double dt) stepEPT(t, dt); + stepTapSound(); + autoStartTimer->step(t, dt); } @@ -314,6 +329,9 @@ void VL60pk::stepTractionControl(double t, double dt) //------------------------------------------------------------------------------ void VL60pk::stepLineContactors(double t, double dt) { + Q_UNUSED(t) + Q_UNUSED(dt) + km_state_t km_state = controller->getState(); bool motor_fans_state = true; diff --git a/asound b/asound index 00084fac..97877f29 160000 --- a/asound +++ b/asound @@ -1 +1 @@ -Subproject commit 00084fac84cf97c5e7b456256676cd1a14909eb8 +Subproject commit 97877f29d3a9699460bfe443fff16223608a6f09 diff --git a/cfg/trains/2te116.xml b/cfg/trains/2te116.xml deleted file mode 100644 index 9cfd9534..00000000 --- a/cfg/trains/2te116.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - ef-coupling - 0 - 2ТЭ116 - Сущее баловство - - - test-loco - 2te116-a - 1 - 1 - - - test-loco - 2te116-b - 1 - 1 - - diff --git a/cfg/trains/2tep70bs.xml b/cfg/trains/2tep70bs.xml deleted file mode 100644 index dfc16ac4..00000000 --- a/cfg/trains/2tep70bs.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - ef-coupling - 0 - Пассажирский супер-поезд - Сущее баловство - - - test-loco - test-loco - 2 - 1 - - - passcar - passcar - 25 - 1 - - - test-loco - test-loco - 2 - 1 - - - passcar - passcar - 25 - 1 - - diff --git a/cfg/trains/VL60k-poezd2342.xml b/cfg/trains/VL60k-poezd2342.xml new file mode 100644 index 00000000..31b9a0f4 --- /dev/null +++ b/cfg/trains/VL60k-poezd2342.xml @@ -0,0 +1,35 @@ + + + + ef-coupling + 0 + + + 0.5 + + 0.9 + + 0 + + vl60k + 50331734 + 71630.0 + + Поезд №2342 + Грузовой поезд для ВЖД + + + vl60k + VL60k-1737 + 1 + 1 + + + + passcar + Fr_hopper_RZD-2851 + 46 + 0 + + + diff --git a/cfg/trains/cargo-train.xml b/cfg/trains/cargo-train.xml deleted file mode 100644 index 4a314882..00000000 --- a/cfg/trains/cargo-train.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - ef-coupling - 0 - Грузовой поезд - Снова баловство - - - test-loco - 2te116-a - 1 - 1 - - - test-loco - 2te116-b - 1 - 1 - - - passcar - poluvagon - 50 - 1 - - diff --git a/cfg/trains/cargo-train2.xml b/cfg/trains/cargo-train2.xml deleted file mode 100644 index d92f7961..00000000 --- a/cfg/trains/cargo-train2.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - ef-coupling - 0 - Грузовой поезд (тест физики) - Снова баловство - - - test-loco - 2te116-a - 1 - 1 - - - test-loco - 2te116-b - 1 - 1 - - - passcar - poluvagon - 1 - 1 - - diff --git a/cfg/trains/chs4t-single.xml b/cfg/trains/chs4t-single.xml deleted file mode 100644 index d892ace3..00000000 --- a/cfg/trains/chs4t-single.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - ef-coupling - 0 - - - 0.5 - - 0 - - ЧС4т - Пассажирский электровоз переменного тока ЧС4т - - - chs4t - chs4t - 1 - 1 - - - diff --git a/cfg/trains/cisterna.xml b/cfg/trains/cisterna.xml deleted file mode 100644 index a7fcf791..00000000 --- a/cfg/trains/cisterna.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - ef-coupling - 0 - Цистерна - Цистерна (тест) - - - passcar - cisterna - 1 - 1 - - diff --git a/cfg/trains/default.xml b/cfg/trains/default.xml deleted file mode 100644 index e60725ac..00000000 --- a/cfg/trains/default.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - ef-coupling - 0 - Тестовый поезд - Поезд из 20 пассажирских (плацкартных) вагонов и тестового локомотива. Предназначен для отладки симулятора и будет удален впоследствии - - - test-loco - test-loco - 1 - 1 - - - passcar - passcar - 20 - 1 - - diff --git a/cfg/trains/default2.xml b/cfg/trains/default2.xml deleted file mode 100644 index 1916b4e9..00000000 --- a/cfg/trains/default2.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - ef-coupling - 0 - Тестовый поезд 2 - Поезд из 20 пассажирских (плацкартных) вагонов и тестового локомотива. Предназначен для отладки симулятора и будет удален впоследствии - - - test-loco - test-loco - 1 - 1 - - - default-vehicle - default-vehicle - 20 - 1 - - diff --git a/cfg/trains/dessau.xml b/cfg/trains/dessau.xml deleted file mode 100644 index 58928808..00000000 --- a/cfg/trains/dessau.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - default-coupling - 0 - Проверка - Проверка - - - - passcar - rrsFr_refsG-9167 - 1 - 1 - - \ No newline at end of file diff --git a/cfg/trains/hevy-cargo-train.xml b/cfg/trains/hevy-cargo-train.xml deleted file mode 100644 index e0b75e74..00000000 --- a/cfg/trains/hevy-cargo-train.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - ef-coupling - 0 - ТЯжелый грузовой поезд - Снова баловство - - - test-loco - 2te116-a - 1 - 1 - - - test-loco - 2te116-b - 1 - 1 - - - test-loco - 2te116-a - 1 - 1 - - - test-loco - 2te116-b - 1 - 1 - - - passcar - poluvagon - 70 - 1 - - diff --git a/cfg/trains/lastochka.xml b/cfg/trains/lastochka.xml deleted file mode 100644 index cfd0f18e..00000000 --- a/cfg/trains/lastochka.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - default-coupling - 0 - ЭС1 "Ласточка" - Скоростной электропоезд ЭС1 "Ласточка" - - - es1-motor - es1-A - 1 - 1 - - - es1-non-motor - es1-B - 1 - 1 - - - es1-non-motor - es1-C - 1 - 1 - - - es1-non-motor - es1-D - 1 - 1 - - - es1-motor - es1-E - 1 - 1 - - diff --git a/cfg/trains/mixed-pass.xml b/cfg/trains/mixed-pass.xml deleted file mode 100644 index 877679ee..00000000 --- a/cfg/trains/mixed-pass.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - ef-coupling - 0 - Пассажирский поезд - Поезд пассажирский с купейными вагонами Аммендорф - - - test-loco - test-loco - 1 - 1 - - - passcar - ammendorf-cupe - 5 - 1 - - - passcar - passcar - 15 - 1 - - diff --git a/cfg/trains/passcar.xml b/cfg/trains/passcar.xml deleted file mode 100644 index 57dceeee..00000000 --- a/cfg/trains/passcar.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - ef-coupling - 0 - Одиночный вагон - Одиночный пассажирский вагон - - - - passcar - passcar - 1 - 1 - - - diff --git a/cfg/trains/poluvagon.xml b/cfg/trains/poluvagon.xml deleted file mode 100644 index db3cd05f..00000000 --- a/cfg/trains/poluvagon.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - ef-coupling - 0 - Полувагон - Полувагон (тест) - - - passcar - poluvagon - 1 - 1 - - diff --git a/cfg/trains/sapsan.xml b/cfg/trains/sapsan.xml deleted file mode 100644 index 7992ec50..00000000 --- a/cfg/trains/sapsan.xml +++ /dev/null @@ -1,69 +0,0 @@ - - - - ef-coupling - 0 - ЭВС2 Сапсан - Высокоскоростной электропоезд - - - sapsan-motor - sr-b-01 - 1 - 1 - - - sapsan-non-motor - dr-t-02 - 1 - 1 - - - sapsan-non-motor - mw-t-03 - 1 - 1 - - - sapsan-motor - sr-t-04 - 1 - 1 - - - sapsan-non-motor - bat-r-05 - 1 - 1 - - - sapsan-non-motor - bat-t-06 - 1 - 1 - - - sapsan-motor - sr-t-07 - 1 - 1 - - - sapsan-non-motor - mw-t-08 - 1 - 1 - - - sapsan-non-motor - dr-t-09 - 1 - 1 - - - sapsan-motor - sr-b-10 - 1 - 1 - - diff --git a/cfg/trains/single-car.xml b/cfg/trains/single-car.xml deleted file mode 100644 index 0a901c9b..00000000 --- a/cfg/trains/single-car.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - ef-coupling - 0 - Пассажирский поезд из одного вагона - Поезд пассажирский с купейным вагонам Аммендорф (для теста ВР242) - - - test-loco - test-loco - 1 - 1 - - - passcar - ammendorf-cupe - 1 - 1 - - diff --git a/cfg/trains/super-train.xml b/cfg/trains/super-train.xml deleted file mode 100644 index dfc16ac4..00000000 --- a/cfg/trains/super-train.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - ef-coupling - 0 - Пассажирский супер-поезд - Сущее баловство - - - test-loco - test-loco - 2 - 1 - - - passcar - passcar - 25 - 1 - - - test-loco - test-loco - 2 - 1 - - - passcar - passcar - 25 - 1 - - diff --git a/cfg/trains/test-loco.xml b/cfg/trains/test-loco.xml deleted file mode 100644 index 82d26dbb..00000000 --- a/cfg/trains/test-loco.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - ef-coupling - 0 - Тестовый локомотив (резервом) - Тестовый локомотив резервом - - - test-loco - test-loco - 1 - 1 - - diff --git a/cfg/trains/vl60pk-1543-T33_15.xml b/cfg/trains/vl60pk-1543-T33_15.xml new file mode 100644 index 00000000..37f9a69b --- /dev/null +++ b/cfg/trains/vl60pk-1543-T33_15.xml @@ -0,0 +1,77 @@ + + + + ef-coupling + 0 + + + 0.5 + + 0.9 + + 0 + + ВЛ60пк-1543_Поезд 33 + Состав из 15 вагонов и вагона-ресторана + + + vl60pk + vl60pk-1543 + 1 + 1 + + + passcar + IMR_pass_rzd-25924 + 3 + 1 + + + passcar + IMR_pass_rzd-13819 + 1 + 1 + + + passcar + IMR_pass_rzd-11100 + 2 + 1 + + + passcar + IMR_pass_rzd-13819 + 1 + 1 + + + passcar + IMR_pass_rzd-65361 + 1 + 1 + + + passcar + IMR_pass_rzd-16733 + 1 + 1 + + + passcar + IMR_pass_rzd-13819 + 1 + 1 + + + passcar + IMR_pass_rzd-11100 + 2 + 1 + + + passcar + IMR_pass_rzd-25924 + 2 + 1 + + diff --git a/cfg/trains/vl60pk-1543-poezd-romich.xml b/cfg/trains/vl60pk-1543-T65_17.xml similarity index 50% rename from cfg/trains/vl60pk-1543-poezd-romich.xml rename to cfg/trains/vl60pk-1543-T65_17.xml index 7f8b94fa..416eb6aa 100644 --- a/cfg/trains/vl60pk-1543-poezd-romich.xml +++ b/cfg/trains/vl60pk-1543-T65_17.xml @@ -3,10 +3,17 @@ ef-coupling 0 - ВЛ60пк-1543 с новыми вагонами - Тест новых вагонов - + + 0.5 + + 0.9 + + 0 + + ВЛ60пк-1543_Поезд 65 + Состав из 17 вагонов и вагона-бара + vl60pk vl60pk-1543 @@ -14,19 +21,26 @@ 1 + + passcar + IMR_pass_rzd-13819 + 3 + 1 + + passcar IMR_pass_rzd-11100 - 1 + 2 1 passcar IMR_pass_rzd-13819 - 1 + 3 1 - + passcar @@ -44,9 +58,23 @@ passcar - IMR_pass_rzd-25924 + IMR_pass_rzd-13819 + 2 + 1 + + + + passcar + IMR_pass_rzd-11100 1 1 + + + passcar + IMR_pass_rzd-25924 + 3 + 1 + diff --git a/cfg/trains/vl60pk-1543-UZpass.xml b/cfg/trains/vl60pk-1543-UZpass.xml deleted file mode 100644 index a79dd598..00000000 --- a/cfg/trains/vl60pk-1543-UZpass.xml +++ /dev/null @@ -1,58 +0,0 @@ - - - - ef-coupling - 0 - vl60pk-1543-UZpass - ВЛ60Пк+Вагоны_УЗ - - - - vl60pk - vl60pk-1543 - 1 - 1 - - - - passcar - zdsPassBagaz_50290 - 1 - 1 - - - - passcar - zdsPassPlac_28486 - 1 - 1 - - - - passcar - zdsPassCup_14585 - 1 - 1 - - - - passcar - zdsPassBar_63491 - 1 - 1 - - - - passcar - zdsPassCup_10062 - 1 - 1 - - - - passcar - zdsPassPlac_22760 - 1 - 1 - - \ No newline at end of file diff --git a/cfg/trains/vl60pk-1543-pass.xml b/cfg/trains/vl60pk-1543-pass.xml deleted file mode 100644 index 28c2162c..00000000 --- a/cfg/trains/vl60pk-1543-pass.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - ef-coupling - 0 - ВЛ60пк-1543 - Пассажирский поезд - - - - vl60 - vl60pk-1543 - 1 - 1 - - - - passcar - IMR_pass_rzd-21071 - 5 - 1 - - - diff --git a/cfg/trains/vl60pk-1543-poezd.xml b/cfg/trains/vl60pk-1543-poezd.xml index c41db286..3c1df4d6 100644 --- a/cfg/trains/vl60pk-1543-poezd.xml +++ b/cfg/trains/vl60pk-1543-poezd.xml @@ -3,8 +3,8 @@ ef-coupling 0 - ВЛ60пк-1543 (с поездом) - Магистральный пассажирский электропоз переменного тока с поездом из 15 вагонов + ВЛ60пк-1543 с поездом + ВЛ60пк с пассажирским поезлом @@ -16,9 +16,82 @@ passcar - passcar - 15 + IMR_pass_rzd-11100 + 1 1 - + + + passcar + IMR_pass_rzd-13819 + 1 + 1 + + + + passcar + IMR_pass_rzd-11100 + 1 + 1 + + + + passcar + IMR_pass_rzd-13819 + 1 + 1 + + + + passcar + IMR_pass_rzd-11100 + 1 + 1 + + + + passcar + IMR_pass_rzd-13819 + 1 + 1 + + + + passcar + IMR_pass_rzd-11100 + 1 + 1 + + + + + passcar + IMR_pass_rzd-17669 + 1 + 1 + + + + passcar + IMR_pass_rzd-16733 + 1 + 1 + + + + + passcar + IMR_pass_rzd-25924 + 5 + 1 + + + + + passcar + IMR_pass_rzd-11100 + 1 + 1 + + diff --git a/cfg/trains/vl60pk-1543-pass-train.xml b/cfg/trains/vl60pk-1543-poezd2.xml similarity index 86% rename from cfg/trains/vl60pk-1543-pass-train.xml rename to cfg/trains/vl60pk-1543-poezd2.xml index f182a2be..982f3819 100644 --- a/cfg/trains/vl60pk-1543-pass-train.xml +++ b/cfg/trains/vl60pk-1543-poezd2.xml @@ -3,8 +3,10 @@ ef-coupling 0 - Поезд с ВЛ60пк-1543 - Пассажирский поезд из 15 вагонов с электровозом ВЛ60пк-1543 + Поезд №2 + Сетевая конфигурация для ВЖД РГУПС + vl60pk + 50331782 @@ -13,8 +15,8 @@ 1 1 - - + + passcar IMR_pass_rzd-11100 @@ -64,7 +66,7 @@ 1 - + passcar IMR_pass_rzd-17669 @@ -79,7 +81,7 @@ 1 - + passcar IMR_pass_rzd-25924 @@ -87,12 +89,12 @@ 1 - + passcar IMR_pass_rzd-11100 1 1 - + diff --git a/cfg/vehicles/2te116-a/2te116-a.xml b/cfg/vehicles/2te116-a/2te116-a.xml deleted file mode 100644 index 0829a303..00000000 --- a/cfg/vehicles/2te116-a/2te116-a.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - 138000 - 0 - 18.15 - 1.050 - default - 6 - 2.0 - - 2te116-a/2te116-a.osgt - 0.0 0.0 0.311 - - 2te116-a/wheel.osgt - - 0.0 -6.6898 0.85 - 0.0 -4.8488 0.85 - 0.0 -2.9933 0.85 - - 0.0 6.6898 0.85 - 0.0 4.8488 0.85 - 0.0 2.9933 0.85 - - krm395 - krm395 - - carbrakes-mech - tep70bs-mech - - vr242 - vr242 - - - diff --git a/cfg/vehicles/2te116-b/2te116-b.xml b/cfg/vehicles/2te116-b/2te116-b.xml deleted file mode 100644 index 094e87a0..00000000 --- a/cfg/vehicles/2te116-b/2te116-b.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - 138000 - 0 - 18.15 - 1.050 - default - 6 - 2.0 - - 2te116-b/2te116-b.osgt - 0.0 0.0 0.311 - - 2te116-b/wheel.osgt - - 0.0 -6.6898 0.85 - 0.0 -4.8488 0.85 - 0.0 -2.9933 0.85 - - 0.0 6.6898 0.85 - 0.0 4.8488 0.85 - 0.0 2.9933 0.85 - - krm395 - krm395 - - carbrakes-mech - tep70bs-mech - - vr242 - vr242 - - - diff --git a/cfg/vehicles/Fr_hopper_RZD-2851/Fr_hopper_RZD-2851.xml b/cfg/vehicles/Fr_hopper_RZD-2851/Fr_hopper_RZD-2851.xml index b4c12a1c..9830a54d 100644 --- a/cfg/vehicles/Fr_hopper_RZD-2851/Fr_hopper_RZD-2851.xml +++ b/cfg/vehicles/Fr_hopper_RZD-2851/Fr_hopper_RZD-2851.xml @@ -9,6 +9,7 @@ default 4 5 + freight 2.0 FrWag_hopper_1/Fr_hopper-1.osgt diff --git a/cfg/vehicles/IMR_pass_rzd-11100/IMR_pass_rzd-11100.xml b/cfg/vehicles/IMR_pass_rzd-11100/IMR_pass_rzd-11100.xml index 09972928..1774020b 100644 --- a/cfg/vehicles/IMR_pass_rzd-11100/IMR_pass_rzd-11100.xml +++ b/cfg/vehicles/IMR_pass_rzd-11100/IMR_pass_rzd-11100.xml @@ -9,6 +9,7 @@ passcar 4 5 + pass 2.0 IMR_pass_rzd/Pass_CupAmm4.osgt diff --git a/cfg/vehicles/IMR_pass_rzd-13819/IMR_pass_rzd-13819.xml b/cfg/vehicles/IMR_pass_rzd-13819/IMR_pass_rzd-13819.xml index 10a5ef66..aa4c87cc 100644 --- a/cfg/vehicles/IMR_pass_rzd-13819/IMR_pass_rzd-13819.xml +++ b/cfg/vehicles/IMR_pass_rzd-13819/IMR_pass_rzd-13819.xml @@ -9,6 +9,7 @@ passcar 4 5 + pass 2.0 IMR_pass_rzd/Pass_CupAmm1.osgt diff --git a/cfg/vehicles/IMR_pass_rzd-16733/IMR_pass_rzd-16733.xml b/cfg/vehicles/IMR_pass_rzd-16733/IMR_pass_rzd-16733.xml index e67e9d2e..28b85412 100644 --- a/cfg/vehicles/IMR_pass_rzd-16733/IMR_pass_rzd-16733.xml +++ b/cfg/vehicles/IMR_pass_rzd-16733/IMR_pass_rzd-16733.xml @@ -9,6 +9,7 @@ passcar 4 5 + pass 2.0 IMR_pass_rzd/Pass_CupAmm7.osgt diff --git a/cfg/vehicles/IMR_pass_rzd-17669/IMR_pass_rzd-17669.xml b/cfg/vehicles/IMR_pass_rzd-17669/IMR_pass_rzd-17669.xml index 449b10b7..03c8591a 100644 --- a/cfg/vehicles/IMR_pass_rzd-17669/IMR_pass_rzd-17669.xml +++ b/cfg/vehicles/IMR_pass_rzd-17669/IMR_pass_rzd-17669.xml @@ -9,6 +9,7 @@ passcar 4 5 + pass 2.0 IMR_pass_rzd/Pass_CupAmmBar1.osgt diff --git a/cfg/vehicles/IMR_pass_rzd-25924/IMR_pass_rzd-25924.xml b/cfg/vehicles/IMR_pass_rzd-25924/IMR_pass_rzd-25924.xml index e9e5a33a..a498594c 100644 --- a/cfg/vehicles/IMR_pass_rzd-25924/IMR_pass_rzd-25924.xml +++ b/cfg/vehicles/IMR_pass_rzd-25924/IMR_pass_rzd-25924.xml @@ -9,6 +9,7 @@ passcar 4 5 + pass 2.0 IMR_pass_rzd/Pass_TVZ_61-826-kvr.osgt diff --git a/cfg/vehicles/passcar/passcar.xml b/cfg/vehicles/IMR_pass_rzd-65361/IMR_pass_rzd-65361.xml similarity index 74% rename from cfg/vehicles/passcar/passcar.xml rename to cfg/vehicles/IMR_pass_rzd-65361/IMR_pass_rzd-65361.xml index 2070ec4f..b02204ee 100644 --- a/cfg/vehicles/passcar/passcar.xml +++ b/cfg/vehicles/IMR_pass_rzd-65361/IMR_pass_rzd-65361.xml @@ -2,16 +2,16 @@ - 53500 - 6000 + 55600 + 4000 25.0 0.95 - default + passcar 4 5 2.0 - passcar/tvz-21071.osgt + IMR_pass_rzd/Pass_RestAmm2.osgt carbrakes-mech carbrakes-mech-composite diff --git a/cfg/vehicles/VL60k-1737/VL60k-1737.xml b/cfg/vehicles/VL60k-1737/VL60k-1737.xml index 58a6244e..f3a9bf59 100644 --- a/cfg/vehicles/VL60k-1737/VL60k-1737.xml +++ b/cfg/vehicles/VL60k-1737/VL60k-1737.xml @@ -9,6 +9,7 @@ 6 7 2.0 + vl60 3.83 diff --git a/cfg/vehicles/ammendorf-cupe/ammendorf-cupe.xml b/cfg/vehicles/ammendorf-cupe/ammendorf-cupe.xml deleted file mode 100644 index fcf7817f..00000000 --- a/cfg/vehicles/ammendorf-cupe/ammendorf-cupe.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - 56000 - 4000 - 25.0 - 0.95 - default - 4 - 5 - 2.0 - - ammendorf-cupe/rrsPass_11100.osgt - - ammendorf-cupe/wheel.osgt - - - 0.0 -7.5 0.786 - 0.0 -9.9 0.786 - - 0.0 7.5 0.786 - 0.0 9.9 0.786 - - carbrakes-mech - carbrakes-mech - - - diff --git a/cfg/vehicles/bat-r-05/bat-r-05.xml b/cfg/vehicles/bat-r-05/bat-r-05.xml deleted file mode 100644 index 2bb0859e..00000000 --- a/cfg/vehicles/bat-r-05/bat-r-05.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - 58862 - 5940 - 28.5 - 0.92 - sapsan - 4 - 2.0 - - sapsan/BAT-R-05.osgt - 0.0 0.0 0.2 - - sapsan/textures/5_.tga - - sapsan/wheel.osgt - sapsan/textures/sapsan.tga - - 0.0 -11.133 0.75 - 0.0 -8.467 0.75 - - - 0.0 8.126 0.75 - 0.0 10.842 0.75 - - - - diff --git a/cfg/vehicles/bat-t-06/bat-t-06.xml b/cfg/vehicles/bat-t-06/bat-t-06.xml deleted file mode 100644 index 520b3731..00000000 --- a/cfg/vehicles/bat-t-06/bat-t-06.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - 58760 - 6170 - 28.5 - 0.92 - sapsan - 4 - 2.0 - - sapsan/BAT-T-06.osgt - 0.0 0.0 0.2 - - sapsan/textures/6_.tga - - sapsan/wheel.osgt - sapsan/textures/sapsan.tga - - 0.0 11.133 0.75 - 0.0 8.467 0.75 - - - 0.0 -8.126 0.75 - 0.0 -10.842 0.75 - - - - diff --git a/cfg/vehicles/chs4t/chs4t-gv.xml b/cfg/vehicles/chs4t/chs4t-gv.xml deleted file mode 100644 index 1b88bfcb..00000000 --- a/cfg/vehicles/chs4t/chs4t-gv.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - 3.33 - 1e-3 - 1.1 - 1.0 - 1e-3 - 1e-3 - 0.3 - - - - 2 - - diff --git a/cfg/vehicles/chs4t/chs4t-pantograph.xml b/cfg/vehicles/chs4t/chs4t-pantograph.xml deleted file mode 100644 index 91c65e76..00000000 --- a/cfg/vehicles/chs4t/chs4t-pantograph.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - 1.2 - 6.0 - 6.0 - 0.2 - - - - - 1 - - diff --git a/cfg/vehicles/chs4t/chs4t.xml b/cfg/vehicles/chs4t/chs4t.xml deleted file mode 100644 index ce69bdaa..00000000 --- a/cfg/vehicles/chs4t/chs4t.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - 135000 - 0 - 19.98 - 1.25 - default - 6 - 2.0 - - chs4t/chs4t-kuzov.osgt - 0.0 0.0 0.2 - - chs4t/chs4t-wheels.osgt - - 0.0 -7.105 0.912 - 0.0 -4.804 0.912 - 0.0 -2.502 0.912 - - 0.0 2.441 0.912 - 0.0 4.742 0.912 - 0.0 7.043 0.912 - - chs4t/chs4t-cab.osgt - 0.0 0.0 0.0 - - 0.93 9.02 3.75 - - - diff --git a/cfg/vehicles/cisterna/cisterna.xml b/cfg/vehicles/cisterna/cisterna.xml deleted file mode 100644 index 1826f264..00000000 --- a/cfg/vehicles/cisterna/cisterna.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - 23.7 - 70000 - 11.3 - 0.95 - default - 4 - 5 - 2.0 - - cisterna/cisterna.osgt - 0.0 0.0 0.311 - - cisterna/wheel.osgt - - - 0.0 -3.010 0.79 - 0.0 -4.869 0.79 - - 0.0 4.869 0.79 - 0.0 3.010 0.79 - - carbrakes-mech - carbrakes-mech - - vr242 - vr242 - - - diff --git a/cfg/vehicles/default-vehicle/default-vehicle.xml b/cfg/vehicles/default-vehicle/default-vehicle.xml deleted file mode 100644 index 81632bf3..00000000 --- a/cfg/vehicles/default-vehicle/default-vehicle.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - 53500 - 6000 - 25.0 - 0.95 - default - 4 - 5 - 2.0 - - default-vehicle/wag-1.osgt - default-vehicle/zdsPassPlac_21071.tga - - default-vehicle/wheel-1.osgt - default-vehicle/zdsPassPlac_21071.tga - - 0.0 -7.3 0.786 - 0.0 -9.7 0.786 - - 0.0 7.3 0.786 - 0.0 9.7 0.786 - - - diff --git a/cfg/vehicles/dr-t-02/dr-t-02.xml b/cfg/vehicles/dr-t-02/dr-t-02.xml deleted file mode 100644 index 502075b9..00000000 --- a/cfg/vehicles/dr-t-02/dr-t-02.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - 60887 - 7000 - 28.5 - 0.92 - sapsan - 4 - 2.0 - - sapsan/DR-T-02.osgt - 0.0 0.0 0.2 - - sapsan/textures/2_.tga - - sapsan/wheel.osgt - sapsan/textures/sapsan.tga - - 0.0 -11.882 0.75 - 0.0 -8.216 0.75 - - - 0.0 8.39 0.75 - 0.0 11.093 0.75 - - - - diff --git a/cfg/vehicles/dr-t-09/dr-t-09.xml b/cfg/vehicles/dr-t-09/dr-t-09.xml deleted file mode 100644 index 54ee45f3..00000000 --- a/cfg/vehicles/dr-t-09/dr-t-09.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - 60887 - 7000 - 28.5 - 0.92 - sapsan - 4 - 2.0 - - sapsan/DR-T-09.osgt - 0.0 0.0 0.2 - - sapsan/textures/2_.tga - - sapsan/wheel.osgt - sapsan/textures/sapsan.tga - - 0.0 11.882 0.75 - 0.0 8.216 0.75 - - - 0.0 -8.39 0.75 - 0.0 -11.093 0.75 - - - - diff --git a/cfg/vehicles/ep20/BLOK/BottomBlock.xml b/cfg/vehicles/ep20/BLOK/BottomBlock.xml new file mode 100644 index 00000000..dba577f6 --- /dev/null +++ b/cfg/vehicles/ep20/BLOK/BottomBlock.xml @@ -0,0 +1,19 @@ + + + + + #ffffff + + #ffffff + 11 + + #ffffff + + #ffffff + 12 + + #0096ff + + + + diff --git a/cfg/vehicles/ep20/BLOK/InformPart.xml b/cfg/vehicles/ep20/BLOK/InformPart.xml new file mode 100644 index 00000000..0affd336 --- /dev/null +++ b/cfg/vehicles/ep20/BLOK/InformPart.xml @@ -0,0 +1,13 @@ + + + + + + #ffff00 + #ffff00 + #ffffff + 16 + + + + diff --git a/cfg/vehicles/ep20/BLOK/InformPart3.xml b/cfg/vehicles/ep20/BLOK/InformPart3.xml new file mode 100644 index 00000000..a38cbf5c --- /dev/null +++ b/cfg/vehicles/ep20/BLOK/InformPart3.xml @@ -0,0 +1,12 @@ + + + + + 180 + 29 + #ffff00 + #ffffff + 15 + + + diff --git a/cfg/vehicles/ep20/BLOK/InformPartSquare.xml b/cfg/vehicles/ep20/BLOK/InformPartSquare.xml new file mode 100644 index 00000000..67016338 --- /dev/null +++ b/cfg/vehicles/ep20/BLOK/InformPartSquare.xml @@ -0,0 +1,13 @@ + + + + + + 270 + 390 + 35 + #ffff00 + + + + diff --git a/cfg/vehicles/ep20/BLOK/InformPartTriangle.xml b/cfg/vehicles/ep20/BLOK/InformPartTriangle.xml new file mode 100644 index 00000000..df38c9c5 --- /dev/null +++ b/cfg/vehicles/ep20/BLOK/InformPartTriangle.xml @@ -0,0 +1,17 @@ + + + + + + 120 + #ffff00 + + + + + 120 + #ff0000 + + + + \ No newline at end of file diff --git a/cfg/vehicles/ep20/BLOK/SArcLimit.xml b/cfg/vehicles/ep20/BLOK/SArcLimit.xml new file mode 100644 index 00000000..80586b36 --- /dev/null +++ b/cfg/vehicles/ep20/BLOK/SArcLimit.xml @@ -0,0 +1,11 @@ + + + + + 12 + #ff0000 + #ffff00 + + + + \ No newline at end of file diff --git a/cfg/vehicles/ep20/BLOK/SArrow.xml b/cfg/vehicles/ep20/BLOK/SArrow.xml new file mode 100644 index 00000000..58bc942c --- /dev/null +++ b/cfg/vehicles/ep20/BLOK/SArrow.xml @@ -0,0 +1,11 @@ + + + + + 0.92 + 17.0 + #0096ff + + + + diff --git a/cfg/vehicles/ep20/BLOK/SScale.xml b/cfg/vehicles/ep20/BLOK/SScale.xml new file mode 100644 index 00000000..1d5c0fd6 --- /dev/null +++ b/cfg/vehicles/ep20/BLOK/SScale.xml @@ -0,0 +1,32 @@ + + + + + + false + #ffffff + 2 + 10 + 4 + + + false + #ffffff + 5 + + + #ffffff + 19 + 70 + + + #ffffff + 2 + + + #0096ff + 110 + + + + \ No newline at end of file diff --git a/cfg/vehicles/ep20/BLOK/STriangle.xml b/cfg/vehicles/ep20/BLOK/STriangle.xml new file mode 100644 index 00000000..1ff8b713 --- /dev/null +++ b/cfg/vehicles/ep20/BLOK/STriangle.xml @@ -0,0 +1,19 @@ + + + + + + 6 + 20 + #ffff00 + + + + + 6 + 20 + #ff0000 + + + + diff --git a/cfg/vehicles/ep20/BLOK/Speedometer.xml b/cfg/vehicles/ep20/BLOK/Speedometer.xml new file mode 100644 index 00000000..97f4b19a --- /dev/null +++ b/cfg/vehicles/ep20/BLOK/Speedometer.xml @@ -0,0 +1,36 @@ + + + + + + + #ffffff + 2 + 26 + + + 0 + 0 + #ffffff + 38 + + + 0 + 110 + #ff0000 + 38 + + + 300 + + 20 + + + 270 + + 90 + + + + + diff --git a/cfg/vehicles/ep20/BLOK/TcpData.xml b/cfg/vehicles/ep20/BLOK/TcpData.xml new file mode 100644 index 00000000..b2935c3a --- /dev/null +++ b/cfg/vehicles/ep20/BLOK/TcpData.xml @@ -0,0 +1,9 @@ + + + + 127.0.0.1 + BLOK + 1992 + 500 + + \ No newline at end of file diff --git a/cfg/vehicles/ep20/BLOK/TopBlock.xml b/cfg/vehicles/ep20/BLOK/TopBlock.xml new file mode 100644 index 00000000..b707b796 --- /dev/null +++ b/cfg/vehicles/ep20/BLOK/TopBlock.xml @@ -0,0 +1,15 @@ + + + + + 500 + + + + + + + + + \ No newline at end of file diff --git a/cfg/vehicles/ep20/BLOK/blocks.xml b/cfg/vehicles/ep20/BLOK/blocks.xml new file mode 100644 index 00000000..4aa58423 --- /dev/null +++ b/cfg/vehicles/ep20/BLOK/blocks.xml @@ -0,0 +1,57 @@ + + + + + 112 + 90 + 800 + 588 + + + + 112 + 0 + 800 + 90 + onoff;brightness;nothingcolor;language;viewdisplays;events;solvebydriver;solvebytech;nothingpaper + 70 + 70 + + + + 912 + 0 + 112 + 768 + correction;left;right;up;down;input; + 70 + 70 + + + + 112 + 678 + 800 + 90 + digit0;digit1;digit2;digit3;digit4;digit5;digit6;digit7;digit8;digit9 + 70 + 70 + + + + 0 + 0 + 112 + 768 + 70 + 70 + + + + 20 + 20 + 00ff00 + ffff00 + ff0000 + + \ No newline at end of file diff --git a/cfg/vehicles/ep20/BLOK/display-core.xml b/cfg/vehicles/ep20/BLOK/display-core.xml new file mode 100644 index 00000000..60173fba --- /dev/null +++ b/cfg/vehicles/ep20/BLOK/display-core.xml @@ -0,0 +1,19 @@ + + + + 1 + 100 + + + 1 + #c8c8c8 + + + 250 + 10000 + 500 + + + 500 + + \ No newline at end of file diff --git a/cfg/vehicles/ep20/BLOK/display1.xml b/cfg/vehicles/ep20/BLOK/display1.xml new file mode 100644 index 00000000..68250a23 --- /dev/null +++ b/cfg/vehicles/ep20/BLOK/display1.xml @@ -0,0 +1,20 @@ + + + + 0 + 0 + 0 + + + + 3 + 127.0.0.1 + display1 + 1992 + 500 + + + + main + + \ No newline at end of file diff --git a/cfg/vehicles/ep20/BLOK/main.xml b/cfg/vehicles/ep20/BLOK/main.xml new file mode 100644 index 00000000..68aad39b --- /dev/null +++ b/cfg/vehicles/ep20/BLOK/main.xml @@ -0,0 +1,16 @@ + + +
+ + 1024 + 768 + + + true + + + 100 + +
+ +
\ No newline at end of file diff --git a/cfg/vehicles/ep20/brakes-init.xml b/cfg/vehicles/ep20/brakes-init.xml index 28b920fb..07e6ee0f 100644 --- a/cfg/vehicles/ep20/brakes-init.xml +++ b/cfg/vehicles/ep20/brakes-init.xml @@ -15,7 +15,7 @@ 2 - 1 + 0
\ No newline at end of file diff --git a/cfg/vehicles/ep20/displays.xml b/cfg/vehicles/ep20/displays.xml new file mode 100644 index 00000000..26f73b31 --- /dev/null +++ b/cfg/vehicles/ep20/displays.xml @@ -0,0 +1,16 @@ + + + + + + blok-display + BLOK_display + + 1.0 1.0 + 0.0 1.0 + 0.0 0.0 + 1.0 0.0 + + + + \ No newline at end of file diff --git a/cfg/vehicles/ep20/ep20.xml b/cfg/vehicles/ep20/ep20.xml index 24b8ab00..e658d7bc 100644 --- a/cfg/vehicles/ep20/ep20.xml +++ b/cfg/vehicles/ep20/ep20.xml @@ -2,17 +2,17 @@ - 54200 - 4500 - 25.0 - 0.95 - passcar - 4 - 5 - 2.0 + 135000 + 0 + 22.55 + 1.25 + loco-resist + 6 + 7 + 2.0 - ep20/EP20_2.osgt - ep20/Cab.osgt + ep20/EP20_2.osgt + ep20/Cab.osgt diff --git a/cfg/vehicles/ep20/kmb2.xml b/cfg/vehicles/ep20/kmb2.xml new file mode 100644 index 00000000..16dbc0c5 --- /dev/null +++ b/cfg/vehicles/ep20/kmb2.xml @@ -0,0 +1,11 @@ + + + + 1 + + 1 + + 1 + + + \ No newline at end of file diff --git a/cfg/vehicles/ep20/mdl_trolley-brake-mech.xml b/cfg/vehicles/ep20/mdl-trolley-brake-mech.xml similarity index 100% rename from cfg/vehicles/ep20/mdl_trolley-brake-mech.xml rename to cfg/vehicles/ep20/mdl-trolley-brake-mech.xml diff --git a/cfg/vehicles/ep20/mpcs.xml b/cfg/vehicles/ep20/mpcs.xml new file mode 100644 index 00000000..e1398457 --- /dev/null +++ b/cfg/vehicles/ep20/mpcs.xml @@ -0,0 +1,4 @@ + + + 1 + \ No newline at end of file diff --git a/cfg/vehicles/ep20/pantograph.xml b/cfg/vehicles/ep20/pantograph.xml new file mode 100644 index 00000000..face2470 --- /dev/null +++ b/cfg/vehicles/ep20/pantograph.xml @@ -0,0 +1,7 @@ + + + + 0.78 + 3.0 + + diff --git a/cfg/vehicles/es1-A/es1-A.xml b/cfg/vehicles/es1-A/es1-A.xml deleted file mode 100644 index c7a4c869..00000000 --- a/cfg/vehicles/es1-A/es1-A.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - 60800 - 9900 - 26.28 - 0.92 - lastochka - 4 - 2.0 - - lastochka/es1-A.osgt - 0.0 0.0 0.311 - - - lastochka/wheel_m.osgt - - - 0.0 -10.703 0.75 - 0.0 -8.023 0.75 - - - 0.0 7.071 0.75 - 0.0 9.75 0.75 - - lastochka/Kabina.osgt - - 0.0 0.0 0.0 - - carbrakes-mech - es1-mech - - 0.93 9.02 3.75 - - - diff --git a/cfg/vehicles/es1-B/es1-B.xml b/cfg/vehicles/es1-B/es1-B.xml deleted file mode 100644 index 92b15599..00000000 --- a/cfg/vehicles/es1-B/es1-B.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - 60700 - 7100 - 24.94 - 0.92 - lastochka - 4 - 2.0 - - lastochka/es1-B.osgt - 0.0 0.0 0.311 - - - lastochka/wheel.osgt - - - 0.0 -7.521 0.75 - 0.0 -10.201 0.75 - 0.0 7.586 0.75 - 0.0 10.266 0.75 - - carbrakes-mech - es1-mech - - - diff --git a/cfg/vehicles/es1-C/es1-C.xml b/cfg/vehicles/es1-C/es1-C.xml deleted file mode 100644 index 9dde2443..00000000 --- a/cfg/vehicles/es1-C/es1-C.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - 55000 - 12800 - 24.94 - 0.92 - lastochka - 4 - 2.0 - - lastochka/es1-C.osgt - 0.0 0.0 0.311 - - - lastochka/wheel.osgt - - - 0.0 -10.187 0.75 - 0.0 -7.507 0.75 - - - 0.0 7.588 0.75 - 0.0 10.268 0.75 - - carbrakes-mech - es1-mech - - - diff --git a/cfg/vehicles/es1-D/es1-D.xml b/cfg/vehicles/es1-D/es1-D.xml deleted file mode 100644 index 1536760b..00000000 --- a/cfg/vehicles/es1-D/es1-D.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - 48200 - 12800 - 24.94 - 0.92 - lastochka - 4 - 2.0 - - lastochka/es1-D.osgt - 0.0 0.0 0.311 - - - lastochka/wheel.osgt - - - 0.0 7.521 0.75 - 0.0 10.201 0.75 - 0.0 -7.586 0.75 - 0.0 -10.266 0.75 - - carbrakes-mech - es1-mech - - - - diff --git a/cfg/vehicles/es1-E/es1-E.xml b/cfg/vehicles/es1-E/es1-E.xml deleted file mode 100644 index 35977a05..00000000 --- a/cfg/vehicles/es1-E/es1-E.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - 55000 - 12800 - 26.28 - 0.92 - lastochka - 4 - 2.0 - - lastochka/es1-E.osgt - 0.0 0.0 0.311 - - - lastochka/wheel_m.osgt - - - 0.0 10.703 0.75 - 0.0 8.023 0.75 - - - 0.0 -7.071 0.75 - 0.0 -9.75 0.75 - - carbrakes-mech - es1-mech - - - - diff --git a/cfg/vehicles/mw-t-03/mw-t-03.xml b/cfg/vehicles/mw-t-03/mw-t-03.xml deleted file mode 100644 index 998fa456..00000000 --- a/cfg/vehicles/mw-t-03/mw-t-03.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - 53444 - 7000 - 28.5 - 0.92 - sapsan - 4 - 2.0 - - sapsan/MW-T-03.osgt - 0.0 0.0 0.2 - - sapsan/textures/2_.tga - - sapsan/wheel.osgt - sapsan/textures/sapsan.tga - - 0.0 -10.893 0.75 - 0.0 -8.21 0.75 - - - 0.0 8.406 0.75 - 0.0 11.076 0.75 - - - - diff --git a/cfg/vehicles/mw-t-08/mw-t-08.xml b/cfg/vehicles/mw-t-08/mw-t-08.xml deleted file mode 100644 index c6b3ed24..00000000 --- a/cfg/vehicles/mw-t-08/mw-t-08.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - 53480 - 7000 - 28.5 - 0.92 - sapsan - 4 - 2.0 - - sapsan/MW-T-08.osgt - 0.0 0.0 0.2 - - sapsan/textures/2_.tga - - sapsan/wheel.osgt - sapsan/textures/sapsan.tga - - 0.0 10.893 0.75 - 0.0 8.21 0.75 - - - 0.0 -8.406 0.75 - 0.0 -11.076 0.75 - - - - diff --git a/cfg/vehicles/pass_rzd-17669/pass_rzd-17669.xml b/cfg/vehicles/pass_rzd-17669/pass_rzd-17669.xml deleted file mode 100644 index 19b0f01a..00000000 --- a/cfg/vehicles/pass_rzd-17669/pass_rzd-17669.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - 56500 - 4000 - 25.0 - 0.95 - default - 4 - 5 - 2.0 - - IMR_pass_rzd/Pass_CupAmmBar1.osgt - - carbrakes-mech - carbrakes-mech - - vr242 - vr242 - - - diff --git a/cfg/vehicles/poluvagon/poluvagon.xml b/cfg/vehicles/poluvagon/poluvagon.xml deleted file mode 100644 index 37c1674f..00000000 --- a/cfg/vehicles/poluvagon/poluvagon.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - 23.7 - 70000 - 14.92 - 0.95 - default - 4 - 5 - 2.0 - - poluvagon/poluvagon-body.osgt - 0.0 0.0 0.311 - - poluvagon/wheel.osgt - - - 0.0 -5.51 0.79 - 0.0 -3.67 0.79 - - 0.0 5.51 0.79 - 0.0 3.67 0.79 - - carbrakes-mech - carbrakes-mech - - vr242 - vr242 - - - diff --git a/cfg/vehicles/rrsFr_refsG-9167/rrsFr_refsG-9167.xml b/cfg/vehicles/rrsFr_refsG-9167/rrsFr_refsG-9167.xml deleted file mode 100644 index 8d4007ad..00000000 --- a/cfg/vehicles/rrsFr_refsG-9167/rrsFr_refsG-9167.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - 64000 - 9000 - 17.8 - 0.938 - default - 4 - 5 - 2.0 - - rrsFr_refsDessau/rrsFr_refsG-9167.osgt - - - - rrsFr_refsDessau/rrsFr_refs-wheel.osgt - - - - 0.0 -7.201 0.786 - 0.0 -4.799 0.786 - - 0.0 4.799 0.786 - 0.0 7.201 0.786 - - carbrakes-mech - carbrakes-mech - - - diff --git a/cfg/vehicles/sr-b-01/sr-b-01.xml b/cfg/vehicles/sr-b-01/sr-b-01.xml deleted file mode 100644 index 0ab6efe8..00000000 --- a/cfg/vehicles/sr-b-01/sr-b-01.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - 61621 - 5495 - 28.5 - 0.92 - sapsan - 4 - 2.0 - - sapsan/SR-B-01.osgt - 0.0 0.0 0.311 - - sapsan/cabina.osgt - 0.0 0.0 0.311 - - sapsan/textures/1_.tga - - 0.0 11.227 2.8 - - - diff --git a/cfg/vehicles/sr-b-10/sr-b-10.xml b/cfg/vehicles/sr-b-10/sr-b-10.xml deleted file mode 100644 index 67b1968f..00000000 --- a/cfg/vehicles/sr-b-10/sr-b-10.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - 61708 - 5415 - 28.5 - 0.92 - sapsan - 4 - 2.0 - - sapsan/SR-B-10.osgt - 0.0 0.0 0.311 - - sapsan/textures/1_.tga - - sapsan/wheel_m.osgt - sapsan/textures/sapsan.tga - - 0.0 11.49 0.75 - 0.0 8.32 0.75 - - - 0.0 -7.68 0.75 - 0.0 -10.85 0.75 - - - - diff --git a/cfg/vehicles/sr-t-04/sr-t-04.xml b/cfg/vehicles/sr-t-04/sr-t-04.xml deleted file mode 100644 index f2f0ec06..00000000 --- a/cfg/vehicles/sr-t-04/sr-t-04.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - 61132 - 7160 - 28.5 - 0.92 - sapsan - 4 - 2.0 - - sapsan/SR-T-04.osgt - 0.0 0.0 0.3 - - sapsan/textures/4_.tga - - sapsan/wheel_m.osgt - sapsan/textures/sapsan.tga - - 0.0 -11.077 0.75 - 0.0 -7.905 0.75 - - - 0.0 8.078 0.75 - 0.0 11.264 0.75 - - - - diff --git a/cfg/vehicles/sr-t-07/sr-t-07.xml b/cfg/vehicles/sr-t-07/sr-t-07.xml deleted file mode 100644 index c9e5dc13..00000000 --- a/cfg/vehicles/sr-t-07/sr-t-07.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - 61056 - 7155 - 28.5 - 0.92 - sapsan - 4 - 2.0 - - sapsan/SR-T-07.osgt - 0.0 0.0 0.3 - - sapsan/textures/4_.tga - - sapsan/wheel_m.osgt - sapsan/textures/sapsan.tga - - 0.0 11.077 0.75 - 0.0 7.905 0.75 - - 0.0 -8.078 0.75 - 0.0 -11.264 0.75 - - - - diff --git a/cfg/vehicles/tep70/tep70.xml b/cfg/vehicles/tep70/tep70.xml deleted file mode 100644 index 72d3d4bd..00000000 --- a/cfg/vehicles/tep70/tep70.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - 135000 - 0 - 21.7 - 1.22 - default - 6 - 2.0 - - tep70/tep70-body.osgt - 0.0 0.0 0.317 - - tep70/tep70-cabine.osgt - 0.0 0.0 0.317 - - krm395 - krm395 - - kvt254 - kvt254 - - carbrakes-mech - tep70bs-mech - - vr242 - vr242 - - 0.93 9.02 3.75 - - - diff --git a/cfg/vehicles/test-loco/test-loco.xml b/cfg/vehicles/test-loco/test-loco.xml deleted file mode 100644 index 44541862..00000000 --- a/cfg/vehicles/test-loco/test-loco.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - - 135000 - 0 - 21.7 - 1.25 - default - 6 - 2.0 - - test-loco/kuzov.osgt - - - - test-loco/add-textures - - - 0.0 0.0 0.0 - - test-loco/kolpara_tepl.osgt - - - 0.0 -8.5 0.85 - 0.0 -6.2 0.85 - 0.0 -4.1 0.85 - - 0.0 8.5 0.85 - 0.0 6.2 0.85 - 0.0 4.1 0.85 - - test-loco/cab.osgt - - 0.0 0.0 0.0 - - krm395 - krm395 - - carbrakes-mech - tep70bs-mech - - vr242 - vr242 - - - diff --git a/cfg/vehicles/vl60pk-1543/vl60pk-1543.xml b/cfg/vehicles/vl60pk-1543/vl60pk-1543.xml index 03fc7497..945cf922 100644 --- a/cfg/vehicles/vl60pk-1543/vl60pk-1543.xml +++ b/cfg/vehicles/vl60pk-1543/vl60pk-1543.xml @@ -9,6 +9,7 @@ 6 7 2.0 + vl60 2.73 diff --git a/cfg/vehicles/zdsPassBagaz_50290/zdsPassBagaz_50290.xml b/cfg/vehicles/zdsPassBagaz_50290/zdsPassBagaz_50290.xml deleted file mode 100644 index 5aaca2f0..00000000 --- a/cfg/vehicles/zdsPassBagaz_50290/zdsPassBagaz_50290.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - 54200 - 4500 - 25.0 - 0.95 - default - 4 - 5 - 2.0 - - Od_pass_uz/Pass_TVZ_61-826-kvr.osgt - Od_pass_uz/zdsPassBagaz_50290 - - carbrakes-mech - carbrakes-mech - - vr242 - vr242 - - - diff --git a/cfg/vehicles/zdsPassBar_63491/zdsPassBar_63491.xml b/cfg/vehicles/zdsPassBar_63491/zdsPassBar_63491.xml deleted file mode 100644 index 9e620b5d..00000000 --- a/cfg/vehicles/zdsPassBar_63491/zdsPassBar_63491.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - 56500 - 4000 - 25.0 - 0.95 - default - 4 - 5 - 2.0 - - Od_pass_uz/Pass_TVZ_61-826-kvr.osgt - Od_pass_uz/zdsPassBar_63491 - - carbrakes-mech - carbrakes-mech - - vr242 - vr242 - - - diff --git a/cfg/vehicles/zdsPassCup_10062/zdsPassCup_10062.xml b/cfg/vehicles/zdsPassCup_10062/zdsPassCup_10062.xml deleted file mode 100644 index 41f4e1f9..00000000 --- a/cfg/vehicles/zdsPassCup_10062/zdsPassCup_10062.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - 56500 - 4000 - 25.0 - 0.95 - default - 4 - 5 - 2.0 - - Od_pass_uz/Pass_CupAmm4.osgt - Od_pass_uz/zdsPassCup_10062 - - carbrakes-mech - carbrakes-mech - - vr242 - vr242 - - - diff --git a/cfg/vehicles/zdsPassCup_14585/zdsPassCup_14585.xml b/cfg/vehicles/zdsPassCup_14585/zdsPassCup_14585.xml deleted file mode 100644 index 20b7d227..00000000 --- a/cfg/vehicles/zdsPassCup_14585/zdsPassCup_14585.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - 56500 - 4000 - 25.0 - 0.95 - default - 4 - 5 - 2.0 - - Od_pass_uz/Pass_CupAmm1.osgt - Od_pass_uz/zdsPassCup_14585 - - carbrakes-mech - carbrakes-mech - - vr242 - vr242 - - - diff --git a/cfg/vehicles/zdsPassPlac_22760/zdsPassPlac_22760.xml b/cfg/vehicles/zdsPassPlac_22760/zdsPassPlac_22760.xml deleted file mode 100644 index c16250f2..00000000 --- a/cfg/vehicles/zdsPassPlac_22760/zdsPassPlac_22760.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - 54200 - 4500 - 25.0 - 0.95 - default - 4 - 5 - 2.0 - - Od_pass_uz/Pass_TVZ_61-826-kvr.osgt - Od_pass_uz/zdsPassPlac_22760 - - carbrakes-mech - carbrakes-mech - - vr242 - vr242 - - - diff --git a/cfg/vehicles/zdsPassPlac_28486/zdsPassPlac_28486.xml b/cfg/vehicles/zdsPassPlac_28486/zdsPassPlac_28486.xml deleted file mode 100644 index bcf19494..00000000 --- a/cfg/vehicles/zdsPassPlac_28486/zdsPassPlac_28486.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - 54200 - 4500 - 25.0 - 0.95 - default - 4 - 5 - 2.0 - - Od_pass_uz/Pass_TVZ_61-826-kvr.osgt - Od_pass_uz/zdsPassPlac_28486 - - carbrakes-mech - carbrakes-mech - - vr242 - vr242 - - - diff --git a/cfg/virtual-railway.xml b/cfg/virtual-railway.xml new file mode 100644 index 00000000..8f9ea753 --- /dev/null +++ b/cfg/virtual-railway.xml @@ -0,0 +1,7 @@ + + + + 127.0.0.1 + 1993 + + \ No newline at end of file diff --git a/common-headers/server-data-struct.h b/common-headers/server-data-struct.h index a829d29f..fdde4aa6 100644 --- a/common-headers/server-data-struct.h +++ b/common-headers/server-data-struct.h @@ -35,8 +35,8 @@ struct vehicle_data_t float angle; float omega; wchar_t DebugMsg[DEBUG_STRING_SIZE]; - bool discreteSignal[MAX_DISCRETE_SIGNALS]; - float analogSignal[MAX_ANALOG_SIGNALS]; + std::array discreteSignal; + std::array analogSignal; vehicle_data_t() : coord(0.0f) @@ -45,8 +45,8 @@ struct vehicle_data_t , omega(0.0f) , DebugMsg(L"") { - memset(discreteSignal, 0, sizeof (bool) * MAX_DISCRETE_SIGNALS); - memset(analogSignal, 0, sizeof (float) * MAX_ANALOG_SIGNALS); + std::fill(discreteSignal.begin(), discreteSignal.end(), false); + std::fill(analogSignal.begin(), analogSignal.end(), 0.0f); } }; diff --git a/log/include/log.h b/log/include/log.h deleted file mode 100644 index 67760542..00000000 --- a/log/include/log.h +++ /dev/null @@ -1,62 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Print messages to log-file -// (с) maisvendoo, 23/06/2017 -// Developer: Dmitry Pritykin -// -//------------------------------------------------------------------------------ -/*! - * \file - * \brief Print messages to log-file - * \copyright maisvendoo - * \author Dmitry Pritykin - * \date 23/06/2017 - */ - -#ifndef LOG_H -#define LOG_H - -#include -#include -#include - -#if defined(LOG_LIB) - #define LOG_EXPORT Q_DECL_EXPORT -#else - #define LOG_EXPORT Q_DECL_IMPORT -#endif - -//------------------------------------------------------------------------------ -// -//------------------------------------------------------------------------------ -class LOG_EXPORT Log : public QObject -{ - Q_OBJECT - -public: - - /*! - * \brief - * \param path - log-file path - * \param clean - celar log-file - */ - Log(const QString &path, bool clean = false, bool print_header = true); - - /// Деструктор - virtual ~Log(); - -public slots: - - /*! - * \brief - * \param msg - text of the message - */ - void printMessage(QString msg); - -private: - - /// Log-file object - QFile *logFile; -}; - -#endif // LOG_H diff --git a/log/log.pro b/log/log.pro deleted file mode 100644 index 0ef22115..00000000 --- a/log/log.pro +++ /dev/null @@ -1,22 +0,0 @@ -TEMPLATE = lib - -QT -= gui - -DEFINES += LOG_LIB - -TARGET = log - -DESTDIR = ../../lib - -CONFIG(debug, debug|release) { - - TARGET = $$join(TARGET,,,_d) - -} else { - -} - -INCLUDEPATH += ./include - -HEADERS += $$files(./include/*.h) -SOURCES += $$files(./src/*.cpp) diff --git a/log/src/log.cpp b/log/src/log.cpp deleted file mode 100644 index b9b1968b..00000000 --- a/log/src/log.cpp +++ /dev/null @@ -1,94 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Print messages to log-file -// (с) maisvendoo, 23/06/2017 -// Developer: Dmitry Pritykin -// -//------------------------------------------------------------------------------ -/*! - * \file - * \brief Print messages to log-file - * \copyright maisvendoo - * \author Dmitry Pritykin - * \date 23/06/2017 - */ - -#include "log.h" - -#include -#include - -#define HEADER_SYMBOLS 80 - -//------------------------------------------------------------------------------ -// -//------------------------------------------------------------------------------ -Log::Log(const QString &path, bool clean, bool print_header) -{ - // File creation - logFile = new QFile(path); - - // Try open file - bool isOpened = false; - - if (clean) - isOpened = logFile->open(QIODevice::WriteOnly | QIODevice::Text); - else - isOpened = logFile->open(QIODevice::Append | QIODevice::Text); - - if (!isOpened) - return; - - // Write log header - - // Current date and time - QDate date = QDate::currentDate(); - QTime time = QTime::currentTime(); - - QTextStream out(logFile); - - if (print_header) - { - for (int i = 0; i < HEADER_SYMBOLS; i++) - out << "-"; - - out << "\n\n"; - - QString text = "\tSession at " + - date.toString() + " " + - time.toString() + "\n\n"; - - out << text; - - for (int i = 0; i < HEADER_SYMBOLS; i++) - out << "-"; - - out << "\n"; - } - - // Try close file - logFile->close(); -} - -//------------------------------------------------------------------------------ -// -//------------------------------------------------------------------------------ -Log::~Log() -{ - -} - -//------------------------------------------------------------------------------ -// -//------------------------------------------------------------------------------ -void Log::printMessage(QString msg) -{ - if (!logFile->open(QIODevice::Append | QIODevice::Text)) - return; - - QTextStream out(logFile); - - out << msg << "\n"; - - logFile->close(); -} diff --git a/scripts/windeploy.bat b/scripts/windeploy.bat index f7093abd..100e9b53 100644 --- a/scripts/windeploy.bat +++ b/scripts/windeploy.bat @@ -15,6 +15,9 @@ mkdir %RRS_DEV_ROOT%\themes mkdir %RRS_DEV_ROOT%\sdk mkdir %RRS_DEV_ROOT%\sdk\include +mkdir %RRS_DEV_ROOT%\logs +mkdir %RRS_DEV_ROOT%\screenshots + rem Копируем бинарные файлы xcopy ..\..\bin\*.exe %RRS_DEV_ROOT%\bin\ @@ -47,6 +50,8 @@ xcopy ..\cfg\vehicles\IMR_pass_rzd-13819\*.* %RRS_DEV_ROOT%\cfg\vehicles\IMR_pas xcopy ..\cfg\vehicles\IMR_pass_rzd-16733\*.* %RRS_DEV_ROOT%\cfg\vehicles\IMR_pass_rzd-16733\ xcopy ..\cfg\vehicles\IMR_pass_rzd-17669\*.* %RRS_DEV_ROOT%\cfg\vehicles\IMR_pass_rzd-17669\ xcopy ..\cfg\vehicles\IMR_pass_rzd-25924\*.* %RRS_DEV_ROOT%\cfg\vehicles\IMR_pass_rzd-25924\ +xcopy ..\cfg\vehicles\IMR_pass_rzd-21071\*.* %RRS_DEV_ROOT%\cfg\vehicles\IMR_pass_rzd-21071\ +xcopy ..\cfg\vehicles\IMR_pass_rzd-65361\*.* %RRS_DEV_ROOT%\cfg\vehicles\IMR_pass_rzd-65361\ xcopy ..\cfg\vehicles\Fr_hopper_RZD-2851\*.* %RRS_DEV_ROOT%\cfg\vehicles\Fr_hopper_RZD-2851\ xcopy ..\cfg\trains\vl60pk-1543.xml %RRS_DEV_ROOT%\cfg\trains\ @@ -64,6 +69,7 @@ xcopy %OSG_BIN_PATH%\libosgGA.dll %RRS_DEV_ROOT%\bin\ xcopy %OSG_BIN_PATH%\libosgText.dll %RRS_DEV_ROOT%\bin\ xcopy %OSG_BIN_PATH%\libosgUtil.dll %RRS_DEV_ROOT%\bin\ xcopy %OSG_BIN_PATH%\libosgViewer.dll %RRS_DEV_ROOT%\bin\ +xcopy %OSG_BIN_PATH%\libosgQt5.dll %RRS_DEV_ROOT%\bin\ xcopy %OSG_BIN_PATH%\osgPlugins-3.7.0\*.dll %RRS_DEV_ROOT%\bin\osgPlugins-3.7.0\ del /S %RRS_DEV_ROOT%\bin\osgPlugins-3.7.0\*d.dll @@ -78,12 +84,11 @@ rem Копируем данные игры (модели, звуки, конфи rem ВЛ60пк xcopy /S ..\..\data\models\VL60pk-1543\*.* %RRS_DEV_ROOT%\data\models\VL60pk-1543\ -xcopy /S ..\..\data\sounds\vl60pk-1543\*.* %RRS_DEV_ROOT%\data\sounds\vl60pk-1543\ +xcopy /S ..\..\data\sounds\vl60pk-1543\*.* %RRS_DEV_ROOT%\data\sounds\vl60\ xcopy /S ..\..\data\animations\vl60pk-1543\*.* %RRS_DEV_ROOT%\data\animations\vl60pk-1543\ rem ВЛ60к xcopy /S ..\..\data\models\VL60k-1737\*.* %RRS_DEV_ROOT%\data\models\VL60k-1737\ -xcopy /S ..\..\data\sounds\VL60k-1737\*.* %RRS_DEV_ROOT%\data\sounds\VL60k-1737\ xcopy /S ..\..\data\animations\VL60k-1737\*.* %RRS_DEV_ROOT%\data\animations\VL60k-1737\ rem Пассажирские вагоны @@ -93,6 +98,9 @@ xcopy /S ..\..\data\animations\IMR_pass_rzd-13819\*.* %RRS_DEV_ROOT%\data\animat xcopy /S ..\..\data\animations\IMR_pass_rzd-16733\*.* %RRS_DEV_ROOT%\data\animations\IMR_pass_rzd-16733\ xcopy /S ..\..\data\animations\IMR_pass_rzd-17669\*.* %RRS_DEV_ROOT%\data\animations\IMR_pass_rzd-17669\ xcopy /S ..\..\data\animations\IMR_pass_rzd-25924\*.* %RRS_DEV_ROOT%\data\animations\IMR_pass_rzd-25924\ +xcopy /S ..\..\data\animations\IMR_pass_rzd-21071\*.* %RRS_DEV_ROOT%\data\animations\IMR_pass_rzd-21071\ +xcopy /S ..\..\data\animations\IMR_pass_rzd-15563\*.* %RRS_DEV_ROOT%\data\animations\IMR_pass_rzd-15563\ + rem Вагоны-хоперы xcopy /S ..\..\data\models\FrWag_hopper_1\*.* %RRS_DEV_ROOT%\data\models\FrWag_hopper_1\ @@ -117,7 +125,9 @@ xcopy /Q ..\simulator\solver\include\*.h %RRS_DEV_ROOT%\sdk\include\ xcopy /Q ..\simulator\physics\include\*.h %RRS_DEV_ROOT%\sdk\include\ xcopy /Q ..\simulator\vehicle\include\*.h %RRS_DEV_ROOT%\sdk\include\ xcopy /Q ..\simulator\device\include\*.h %RRS_DEV_ROOT%\sdk\include\ -xcopy /S ..\..\sdk\examples\*.* %RRS_DEV_ROOT%\sdk\examples\ +xcopy /Q ..\viewer\display\include\*.h %RRS_DEV_ROOT%\sdk\include\ +xcopy /S ..\..\sdk\examples\*.* %RRS_DEV_ROOT% +\sdk\examples\ rem Копируем иконку @@ -144,3 +154,4 @@ windeployqt %RRS_DEV_ROOT%\bin\profconv.exe windeployqt %RRS_DEV_ROOT%\bin\routeconv.exe windeployqt %RRS_DEV_ROOT%\bin\CfgReader.dll windeployqt %RRS_DEV_ROOT%\bin\TcpConnection.dll +rem windeployqt %RRS_DEV_ROOT%\bin\libosgQt5.dll \ No newline at end of file diff --git a/setup/setup.iss b/setup/setup.iss index 44484eb8..bd7dc88a 100644 --- a/setup/setup.iss +++ b/setup/setup.iss @@ -1,5 +1,5 @@ #define Name "RRS" -#define Version "1.0.4" +#define Version "1.0.5" #define arch "x86_64" #define Publisher "maisvendoo" diff --git a/simulator/device/include/loco-crane.h b/simulator/device/include/loco-crane.h index 6c906b8e..34ea067c 100644 --- a/simulator/device/include/loco-crane.h +++ b/simulator/device/include/loco-crane.h @@ -30,6 +30,8 @@ class DEVICE_EXPORT LocoCrane : public BrakeDevice virtual double getAirDistribPressure() const; + virtual void stepSound(); + void release(bool is_release); protected: diff --git a/simulator/device/src/ept-converter.cpp b/simulator/device/src/ept-converter.cpp index 33f44000..5b2a9f12 100644 --- a/simulator/device/src/ept-converter.cpp +++ b/simulator/device/src/ept-converter.cpp @@ -26,6 +26,9 @@ EPTConverter::~EPTConverter() //------------------------------------------------------------------------------ void EPTConverter::preStep(state_vector_t &Y, double t) { + Q_UNUSED(Y) + Q_UNUSED(t) + U_out = ks * U_bat - r * I_out; } @@ -35,7 +38,9 @@ void EPTConverter::preStep(state_vector_t &Y, double t) void EPTConverter::ode_system(const state_vector_t &Y, state_vector_t &dYdt, double t) { - + Q_UNUSED(Y) + Q_UNUSED(dYdt) + Q_UNUSED(t) } //------------------------------------------------------------------------------ diff --git a/simulator/device/src/ept-pass-control.cpp b/simulator/device/src/ept-pass-control.cpp index 2bda6762..49a50715 100644 --- a/simulator/device/src/ept-pass-control.cpp +++ b/simulator/device/src/ept-pass-control.cpp @@ -16,6 +16,9 @@ EPTPassControl::~EPTPassControl() void EPTPassControl::preStep(state_vector_t &Y, double t) { + Q_UNUSED(Y) + Q_UNUSED(t) + control_signal = 0.0; if (is_hold) @@ -33,10 +36,12 @@ void EPTPassControl::preStep(state_vector_t &Y, double t) void EPTPassControl::ode_system(const state_vector_t &Y, state_vector_t &dYdt, double t) { - + Q_UNUSED(Y) + Q_UNUSED(dYdt) + Q_UNUSED(t) } void EPTPassControl::load_config(CfgReader &cfg) { - + Q_UNUSED(cfg) } diff --git a/simulator/device/src/loco-crane.cpp b/simulator/device/src/loco-crane.cpp index 72c65eb5..1ed89e7b 100644 --- a/simulator/device/src/loco-crane.cpp +++ b/simulator/device/src/loco-crane.cpp @@ -80,6 +80,14 @@ void LocoCrane::release(bool is_release) this->is_release = static_cast(is_release); } +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +void LocoCrane::stepSound() +{ + return; +} + //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ diff --git a/simulator/device/src/pneumo-splitter.cpp b/simulator/device/src/pneumo-splitter.cpp index 046894ae..476b1a09 100644 --- a/simulator/device/src/pneumo-splitter.cpp +++ b/simulator/device/src/pneumo-splitter.cpp @@ -75,6 +75,8 @@ double PneumoSplitter::getP_in() const //------------------------------------------------------------------------------ void PneumoSplitter::preStep(state_vector_t &Y, double t) { + Q_UNUSED(t) + Q_out1 = K[1] * (Y[0] - p_out1) + K[4] * (p_out2 - p_out1); Q_out2 = K[2] * (Y[0] - p_out2) + K[4] * (p_out1 - p_out2); } @@ -86,8 +88,10 @@ void PneumoSplitter::ode_system(const state_vector_t &Y, state_vector_t &dYdt, double t) { - dYdt[0] = ( Q_in - K[3] *(Q_out1 + Q_out2) ) / V0; + Q_UNUSED(Y) + Q_UNUSED(t) + dYdt[0] = ( Q_in - K[3] *(Q_out1 + Q_out2) ) / V0; } //------------------------------------------------------------------------------ diff --git a/simulator/device/src/switcher.cpp b/simulator/device/src/switcher.cpp index d8b40051..428595ca 100644 --- a/simulator/device/src/switcher.cpp +++ b/simulator/device/src/switcher.cpp @@ -36,6 +36,9 @@ void Switcher::ode_system(const state_vector_t& Y, state_vector_t& dYdt, double //------------------------------------------------------------------------------ void Switcher::stepKeysControl(double t, double dt) { + Q_UNUSED(t) + Q_UNUSED(dt) + if (getKeyState(keyCode)) { if (ableToPress) diff --git a/simulator/device/src/train-horn.cpp b/simulator/device/src/train-horn.cpp index 1682bba4..b52af981 100644 --- a/simulator/device/src/train-horn.cpp +++ b/simulator/device/src/train-horn.cpp @@ -46,21 +46,34 @@ void TrainHorn::stepKeysControl(double t, double dt) Q_UNUSED(t) Q_UNUSED(dt) - if (is_svistok = getKeyState(KEY_Space)) - { - emit soundSetVolume("Svistok", 100); - } - else - { - emit soundSetVolume("Svistok", 0); - } + bool is_svistok_old = is_svistok; + is_svistok = getKeyState(KEY_Space); + + if (is_svistok_old != is_svistok) - if (is_tifon = getKeyState(KEY_B)) { - emit soundSetVolume("Tifon", 100); + if (is_svistok) + { + emit soundPlay("Svistok"); + } + else + { + emit soundStop("Svistok"); + } } - else + + bool is_tifon_old = is_tifon; + is_tifon = getKeyState(KEY_B); + + if (is_tifon_old != is_tifon) { - emit soundSetVolume("Tifon", 0); + if (is_tifon) + { + emit soundPlay("Tifon"); + } + else + { + emit soundStop("Tifon"); + } } } diff --git a/simulator/device/src/ubt367m.cpp b/simulator/device/src/ubt367m.cpp index 8199981c..b70ca1da 100644 --- a/simulator/device/src/ubt367m.cpp +++ b/simulator/device/src/ubt367m.cpp @@ -103,6 +103,8 @@ float BrakeLock::getMainHandlePos() const //------------------------------------------------------------------------------ void BrakeLock::preStep(state_vector_t &Y, double t) { + Q_UNUSED(t) + handle_unlocked = static_cast(hs_n(Y[0] - p1)); crane_pFL = loco_pFL * state; @@ -141,6 +143,8 @@ void BrakeLock::ode_system(const state_vector_t &Y, state_vector_t &dYdt, double t) { + Q_UNUSED(t) + double Q0 = K[2] * (crane_pTM * state - Y[0]) * is_comb_opened - K[1] * Y[0] * is_emerg_brake; dYdt[0] = Q0 / V0; diff --git a/simulator/evr305/src/evr305.cpp b/simulator/evr305/src/evr305.cpp index 84dea838..3a79686d 100644 --- a/simulator/evr305/src/evr305.cpp +++ b/simulator/evr305/src/evr305.cpp @@ -32,9 +32,11 @@ EVR305::~EVR305() // //------------------------------------------------------------------------------ void EVR305::ode_system(const state_vector_t &Y, - state_vector_t &dYdt, - double t) + state_vector_t &dYdt, + double t) { + Q_UNUSED(t) + // Состояние вентиля перекрыши double up = abs(control_line[0]); diff --git a/simulator/kvt224/src/kvt224.cpp b/simulator/kvt224/src/kvt224.cpp index bd5546d4..3d5a4fa8 100644 --- a/simulator/kvt224/src/kvt224.cpp +++ b/simulator/kvt224/src/kvt224.cpp @@ -39,7 +39,7 @@ LocoCrane224::~LocoCrane224() //------------------------------------------------------------------------------ double LocoCrane224::getHandlePosition() const { - return pos; + return cur_pos; } //------------------------------------------------------------------------------ @@ -204,27 +204,27 @@ void LocoCrane224::stepKeysControl(double t, double dt) { if (getKeyState(KEY_8)) { - pos = fixed_pos[0]; + cur_pos = fixed_pos[0]; } if (getKeyState(KEY_9)) { - pos = fixed_pos[1]; + cur_pos = fixed_pos[1]; } if (getKeyState(KEY_0)) { - pos = fixed_pos[2]; + cur_pos = fixed_pos[2]; } if (getKeyState(KEY_Minus)) { - pos = fixed_pos[3]; + cur_pos = fixed_pos[3]; } if (getKeyState(KEY_Equals)) { - pos = fixed_pos[4]; + cur_pos = fixed_pos[4]; } } } diff --git a/simulator/kvt254/include/kvt254.h b/simulator/kvt254/include/kvt254.h index 3a899667..02e579d1 100644 --- a/simulator/kvt254/include/kvt254.h +++ b/simulator/kvt254/include/kvt254.h @@ -30,6 +30,9 @@ class LocoCrane254 : public LocoCrane double getAirDistribPressure() const; + /// Получение номера позиции + int getPositionNumber() const; + void init(double pTM, double pFL); private: @@ -50,19 +53,31 @@ class LocoCrane254 : public LocoCrane double pos_duration; + double volume; + + double p_volume; + int dir; + int pos_num; + + std::array positions; + std::array step_pressures; std::array K; std::array k; + bool isStop; + void ode_system(const state_vector_t &Y, state_vector_t &dYdt, double t); void load_config(CfgReader &cfg); void stepKeysControl(double t, double dt); + + void stepSound(); }; #endif // KVT254_H diff --git a/simulator/kvt254/src/kvt254.cpp b/simulator/kvt254/src/kvt254.cpp index 9e3241bf..528ff3fa 100644 --- a/simulator/kvt254/src/kvt254.cpp +++ b/simulator/kvt254/src/kvt254.cpp @@ -15,7 +15,9 @@ LocoCrane254::LocoCrane254(QObject *parent) : LocoCrane(parent) , max_pos(1.0) , pos_duration(1.0) , dir(0) + , positions({0.0, 0.325, 0.5, 0.752, 1.0}) , step_pressures({0.0, 0.13, 0.20, 0.30, 0.40}) + , isStop(false) { std::fill(K.begin(), K.end(), 0.0); std::fill(k.begin(), k.end(), 0.0); @@ -116,6 +118,53 @@ void LocoCrane254::ode_system(const state_vector_t &Y, dYdt[1] = Q2 / V2; // p2 dYdt[2] = Qpz / Vpz; // p_pz + + stepSound(); +} + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +void LocoCrane254::stepSound() +{ + p_volume = volume; + + // 250000 поправочный коэффициент для перевода 1кг/cм^3 в 1кг/м^3 + // Для звуков взято 400000 с малым запасом + volume = abs(Qbc) * 400000; + + if (volume > 30) + { + if (Qbc > 0) + { + if (p_volume <= 30) + { + emit soundPlay("254_vpusk"); + } + emit soundSetVolume("254_vypusk", 0); + emit soundSetVolume("254_vpusk", volume); + } + + if (Qbc < 0) + { + if (p_volume <= 30) + { + emit soundPlay("254_vypusk"); + } + emit soundSetVolume("254_vpusk", 0); + emit soundSetVolume("254_vypusk", volume); + } + isStop = false; + } + else + { + if (!isStop) + { + emit soundStop("254_vpusk"); + emit soundStop("254_vypusk"); + isStop = true; + } + } } //------------------------------------------------------------------------------ @@ -185,6 +234,8 @@ void LocoCrane254::stepKeysControl(double t, double dt) dir = 0; } + int old_pos_n = pos_num; + pos += dir * pos_duration * dt; pos = cut(pos, min_pos, max_pos); @@ -219,6 +270,33 @@ void LocoCrane254::stepKeysControl(double t, double dt) pos = step_pressures[4] / max_step; } } + + pos_num = getPositionNumber(); + + if (pos_num != old_pos_n && pos_num != -1) + emit soundPlay("254-chelk"); +} + +//------------------------------------------------------------------------------ +// Позиция крана по канавкам (только для звуков) +//------------------------------------------------------------------------------ +int LocoCrane254::getPositionNumber() const +{ + int pos_n = -1; + + if (pos == 0.0) + return 0; + + if (pos == 1.0) + return 4; + + for (uint i = 0; i < positions.size() - (dir == -1 ? 2 : 1); ++i) + { + if (pos >= positions[i] && pos <= positions[i+1]) + pos_n = static_cast(i); + } + + return pos_n; } GET_LOCO_CRANE(LocoCrane254) diff --git a/simulator/model/include/model.h b/simulator/model/include/model.h index def8b620..6b17c5eb 100644 --- a/simulator/model/include/model.h +++ b/simulator/model/include/model.h @@ -24,7 +24,6 @@ #include "simulator-command-line.h" #include "filesystem.h" -#include "log.h" #include "train.h" #include "elapsed-timer.h" @@ -36,6 +35,8 @@ #include "virtual-interface-device.h" +#include "sim-client.h" + #if defined(MODEL_LIB) #define MODEL_EXPORT Q_DECL_EXPORT #else @@ -73,6 +74,8 @@ class MODEL_EXPORT Model : public QObject void sendDataToTrain(QByteArray data); + void getRecvData(sim_dispatcher_data_t &disp_data); + public slots: /// Messages output @@ -81,10 +84,10 @@ public slots: /// void controlProcess(); -private: + /// Обмен данными с ВЖД + void virtualRailwayFeedback(); - /// Simulator's log object - Log *simLog; +private: /// Current simulation time double t; @@ -120,8 +123,12 @@ public slots: /// TCP-server Server *server; + /// Виртуальное устройство для сопряжения с внешним пультом VirtualInterfaceDevice *control_panel; + /// Клиент для связи с ВЖД + SimTcpClient *sim_client; + KeysControl keys_control; /// Server data to clinet transmission @@ -132,11 +139,9 @@ public slots: QByteArray data; QTimer controlTimer; + QTimer networkTimer; - ElapsedTimer simTimer; - - /// Log initialization - void logInit(bool clear_log = false); + ElapsedTimer simTimer; /// Actions, which prerare integration step void preStep(double t); @@ -159,9 +164,12 @@ public slots: void initControlPanel(QString cfg_path); + void initSimClient(QString cfg_path); + /// TCP feedback void tcpFeedBack(); + /// Shered memory feedback void sharedMemoryFeedback(); diff --git a/simulator/model/model.pro b/simulator/model/model.pro index bb6c92b0..5b8c81b2 100644 --- a/simulator/model/model.pro +++ b/simulator/model/model.pro @@ -16,7 +16,6 @@ CONFIG(debug, debug|release) { LIBS += -L../../../lib -lfilesystem_d LIBS += -L../../../lib -lJournal_d - LIBS += -L../../../lib -llog_d LIBS += -L../../../lib -lCfgReader_d LIBS += -L../../../lib -lphysics_d LIBS += -L../../../lib -lvehicle_d @@ -25,6 +24,7 @@ CONFIG(debug, debug|release) { LIBS += -L../../../lib -ltrain_d LIBS += -L../../../lib -lbrakepipe_d LIBS += -L../../../lib -lTcpConnection_d + LIBS += -L../../../lib -lsim-client_d LIBS += -L../../../lib -lprofile_d LIBS += -L../../../lib -ldevice_d @@ -34,8 +34,7 @@ CONFIG(debug, debug|release) { } else { LIBS += -L../../../lib -lfilesystem - LIBS += -L../../../lib -lJournal - LIBS += -L../../../lib -llog + LIBS += -L../../../lib -lJournal LIBS += -L../../../lib -lCfgReader LIBS += -L../../../lib -lphysics LIBS += -L../../../lib -lvehicle @@ -44,6 +43,7 @@ CONFIG(debug, debug|release) { LIBS += -L../../../lib -ltrain LIBS += -L../../../lib -lbrakepipe LIBS += -L../../../lib -lTcpConnection + LIBS += -L../../../lib -lsim-client LIBS += -L../../../lib -lprofile LIBS += -L../../../lib -ldevice @@ -75,10 +75,10 @@ INCLUDEPATH += ../coupling/include INCLUDEPATH += ../brakepipe/include INCLUDEPATH += ../profile/include INCLUDEPATH += ../device/include +INCLUDEPATH += ../sim-client/include INCLUDEPATH += ../../CfgReader/include INCLUDEPATH += ../../filesystem/include INCLUDEPATH += ../../libJournal/include -INCLUDEPATH += ../../log/include INCLUDEPATH += ../../tcp-connection/include INCLUDEPATH += ../../asound/include INCLUDEPATH += ../sound-manager/include diff --git a/simulator/model/src/keys-control.cpp b/simulator/model/src/keys-control.cpp index b9771160..c28ba4e5 100644 --- a/simulator/model/src/keys-control.cpp +++ b/simulator/model/src/keys-control.cpp @@ -1,4 +1,5 @@ #include "keys-control.h" +#include "Journal.h" //------------------------------------------------------------------------------ // @@ -12,7 +13,7 @@ KeysControl::KeysControl(QObject *parent) : QObject(parent) { if (!keys_data.attach()) { - emit logMessage("ERROR: Can't attach to shared memory"); + Journal::instance()->error("ERROR: Can't attach to shared memory"); } } } diff --git a/simulator/model/src/model.cpp b/simulator/model/src/model.cpp index f58046c4..dc959e14 100644 --- a/simulator/model/src/model.cpp +++ b/simulator/model/src/model.cpp @@ -21,13 +21,10 @@ #include "Journal.h" #include "JournalFile.h" -const QString LOG_FILE_NAME = "simulator.log"; - //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ Model::Model(QObject *parent) : QObject(parent) - , simLog(Q_NULLPTR) , t(0.0) , dt(0.001) , start_time(0.0) @@ -46,6 +43,8 @@ Model::Model(QObject *parent) : QObject(parent) { shared_memory.attach(); } + + sim_client = Q_NULLPTR; } //------------------------------------------------------------------------------ @@ -62,13 +61,6 @@ Model::~Model() //------------------------------------------------------------------------------ bool Model::init(const simulator_command_line_t &command_line) { - // Log creation - logInit(command_line.clear_log.is_present); - - //FileSystem &fs = FileSystem::getInstance(); - //QString path = QString(fs.combinePath(fs.getLogsDir(), "journal.log").c_str()); - //journalInit(path); - // Check is debug print allowed is_debug_print = command_line.debug_print.is_present; @@ -125,7 +117,6 @@ bool Model::init(const simulator_command_line_t &command_line) { if (!keys_data.attach()) { - emit logMessage("ERROR: Can't attach to shared memory"); Journal::instance()->error("Can't attach to shread memory. Unable process keyboard"); } } @@ -136,6 +127,8 @@ bool Model::init(const simulator_command_line_t &command_line) initControlPanel("control-panel"); + initSimClient("virtual-railway"); + Journal::instance()->info("Train is initialized successfully"); return true; @@ -181,17 +174,6 @@ void Model::controlProcess() control_panel->process(); } -//------------------------------------------------------------------------------ -// -//------------------------------------------------------------------------------ -void Model::logInit(bool clear_log) -{ - FileSystem &fs = FileSystem::getInstance(); - simLog = new Log(QString(fs.getLogsDir().c_str()) + fs.separator() + LOG_FILE_NAME, clear_log, true); - connect(this, &Model::logMessage, simLog, &Log::printMessage); - connect(this, &Model::logMessage, this, &Model::outMessage); -} - //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ @@ -325,10 +307,7 @@ void Model::overrideByCommandLine(init_data_t &init_data, if (command_line.init_coord.is_present) { - init_data.init_coord = command_line.init_coord.value; - - emit logMessage(QString("OK: Command line coordinate: %1").arg(command_line.init_coord.value)); - emit logMessage(QString("OK: New initial line coordinate: %1").arg(init_data.init_coord)); + init_data.init_coord = command_line.init_coord.value; } if (command_line.direction.is_present) @@ -450,6 +429,53 @@ void Model::initControlPanel(QString cfg_path) } } +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +void Model::initSimClient(QString cfg_path) +{ + if (train->getTrainID().isEmpty()) + return; + + if (train->getClientName().isEmpty()) + return; + + CfgReader cfg; + FileSystem &fs = FileSystem::getInstance(); + QString full_path = QString(fs.getConfigDir().c_str()) + fs.separator() + cfg_path + ".xml"; + + if (cfg.load(full_path)) + { + QString secName = "VRServer"; + tcp_config_t tcp_config; + + cfg.getString(secName, "HostAddr", tcp_config.host_addr); + int port = 0; + + if (!cfg.getInt(secName, "Port", port)) + { + port = 1993; + } + + tcp_config.port = static_cast(port); + tcp_config.name = train->getClientName(); + + sim_client = new SimTcpClient(); + connect(this, &Model::getRecvData, sim_client, &SimTcpClient::getRecvData); + sim_client->init(tcp_config); + sim_client->start(); + + Journal::instance()->info("Started virtual railway TCP-client..."); + + connect(&networkTimer, &QTimer::timeout, this, &Model::virtualRailwayFeedback); + networkTimer.start(100); + } + else + { + Journal::instance()->error("There is no virtual railway configuration in file " + full_path); + } +} + //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ @@ -491,6 +517,38 @@ void Model::tcpFeedBack() emit sendDataToTrain(server->getReceivedData());*/ } +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +void Model::virtualRailwayFeedback() +{ + if (sim_client == Q_NULLPTR) + return; + + if (!sim_client->isConnected()) + return; + + sim_dispatcher_data_t disp_data; + emit getRecvData(disp_data); + + alsn_info_t alsn_info; + alsn_info.code_alsn = disp_data.code_alsn; + alsn_info.num_free_block = disp_data.num_free_block; + alsn_info.response_code = disp_data.response_code; + alsn_info.signal_dist = disp_data.signal_dist; + strcpy(alsn_info.current_time, disp_data.current_time); + + train->getFirstVehicle()->setASLN(alsn_info); + + sim_train_data_t train_data; + strcpy(train_data.train_id, train->getTrainID().toStdString().c_str()); + train_data.direction = train->getDirection(); + train_data.coord = train->getFirstVehicle()->getRailwayCoord(); + train_data.speed = train->getFirstVehicle()->getVelocity(); + + sim_client->sendTrainData(train_data); +} + //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ @@ -510,15 +568,16 @@ void Model::sharedMemoryFeedback() viewer_data.te[i].angle = static_cast((*it)->getWheelAngle(0)); viewer_data.te[i].omega = static_cast((*it)->getWheelOmega(0)); - (*it)->getDebugMsg().toWCharArray(viewer_data.te[i].DebugMsg); + (*it)->getDebugMsg().toWCharArray(viewer_data.te[i].DebugMsg); - memcpy(viewer_data.te[i].discreteSignal, - (*it)->getDiscreteSignals(), - sizeof (viewer_data.te[i].discreteSignal)); + /*std::copy((*it)->getDiscreteSignals().begin(), + (*it)->getDiscreteSignals().end(), + viewer_data.te[i].discreteSignal.begin());*/ + + std::copy((*it)->getAnalogSignals().begin(), + (*it)->getAnalogSignals().end(), + viewer_data.te[i].analogSignal.begin()); - memcpy(viewer_data.te[i].analogSignal, - (*it)->getAnalogSignals(), - sizeof (viewer_data.te[i].analogSignal)); ++i; } @@ -582,8 +641,7 @@ void Model::process() postStep(t); } - //train->vehiclesStep(t, integration_time); - train->inputProcess(); + train->inputProcess(); // Debug print, is allowed if (is_debug_print) diff --git a/simulator/rk4/src/rk4.cpp b/simulator/rk4/src/rk4.cpp index a27eb243..b786d5d4 100644 --- a/simulator/rk4/src/rk4.cpp +++ b/simulator/rk4/src/rk4.cpp @@ -10,9 +10,16 @@ RK4Solver::~RK4Solver() } -bool RK4Solver::step(OdeSystem *ode_sys, state_vector_t &Y, state_vector_t &dYdt, double t, double &dt, double max_step, double local_err) +bool RK4Solver::step(OdeSystem *ode_sys, + state_vector_t &Y, + state_vector_t &dYdt, + double t, + double &dt, + double max_step, + double local_err) { - + Q_UNUSED(max_step) + Q_UNUSED(local_err) // Share required memory if (first_step) diff --git a/simulator/sim-client/include/shared-sim-dispatcher-stuctures.h b/simulator/sim-client/include/shared-sim-dispatcher-stuctures.h new file mode 100644 index 00000000..3a73f6de --- /dev/null +++ b/simulator/sim-client/include/shared-sim-dispatcher-stuctures.h @@ -0,0 +1,53 @@ +#ifndef SHARED_SIM_DISPATCHER_STRUCTURES_H +#define SHARED_SIM_DISPATCHER_STRUCTURES_H + +#pragma pack(push, 1) +struct sim_dispatcher_data_t +{ + +public: + + short code_alsn; + int num_free_block; + int response_code; + char current_time[9]; + char signal_name[23]; + double signal_dist; + + // Конструктор + sim_dispatcher_data_t() + : code_alsn(4) + , num_free_block(0) + , response_code(0) + , current_time("00:00:00") + , signal_name("") + , signal_dist(0.0) + { + + } +}; +#pragma pack(pop) + +#pragma pack(push, 1) +struct sim_train_data_t +{ + +public: + + double coord; + int direction; + double speed; + char train_id[9]; + + sim_train_data_t() + : coord(0.0) + , direction(0) + , speed(0) + , train_id("") + { + + } +}; +#pragma pack(pop) + +#endif // SHARED_SIM_DISPATCHER_STRUCTURES_H diff --git a/simulator/sim-client/include/sim-client.h b/simulator/sim-client/include/sim-client.h new file mode 100644 index 00000000..a5382f84 --- /dev/null +++ b/simulator/sim-client/include/sim-client.h @@ -0,0 +1,50 @@ +#ifndef SIM_CLIENT_H +#define SIM_CLIENT_H + +#include +#include + +#include "tcp-client-structs.h" +#include "shared-sim-dispatcher-stuctures.h" + +Q_DECLARE_METATYPE(sim_dispatcher_data_t) + +Q_DECLARE_METATYPE(sim_train_data_t) + +class TcpClient; + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +class SimTcpClient : public QObject +{ + Q_OBJECT + +public: + + SimTcpClient(QObject *parent = Q_NULLPTR); + + ~SimTcpClient(); + + bool isConnected() const; + + void init(const tcp_config_t &tcp_config); + +public slots: + + void start(); + + void stop(); + + void getRecvData(sim_dispatcher_data_t &disp_data); + + void sendTrainData(sim_train_data_t train_data); + +private: + + TcpClient *tcp_client; + + sim_dispatcher_data_t disp_data; +}; + +#endif diff --git a/simulator/sim-client/sim-client.pro b/simulator/sim-client/sim-client.pro new file mode 100644 index 00000000..09af131f --- /dev/null +++ b/simulator/sim-client/sim-client.pro @@ -0,0 +1,27 @@ +TEMPLATE = lib + +QT -= gui +QT += network + +DEFINES += SIM_CLIENT_LIB + +TARGET = sim-client + +DESTDIR = ../../../lib + +CONFIG(debug, debug|release) { + + TARGET = $$join(TARGET,,,_d) + LIBS += -L../../../lib/ -lTcpConnection_d + + +} else { + + LIBS += -L../../../lib/ -lTcpConnection +} + +INCLUDEPATH += ./include +INCLUDEPATH += ../../tcp-connection/include + +HEADERS += $$files(./include/*.h) +SOURCES += $$files(./src/*.cpp) diff --git a/simulator/sim-client/src/sim-client.cpp b/simulator/sim-client/src/sim-client.cpp new file mode 100644 index 00000000..0888d1ae --- /dev/null +++ b/simulator/sim-client/src/sim-client.cpp @@ -0,0 +1,92 @@ +#include "sim-client.h" +#include "tcp-client.h" + +#include + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +SimTcpClient::SimTcpClient(QObject *parent) : QObject(parent) + , tcp_client(new TcpClient) +{ + qRegisterMetaType(); + qRegisterMetaType(); +} + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +SimTcpClient::~SimTcpClient() +{ + +} + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +bool SimTcpClient::isConnected() const +{ + return tcp_client->isConnected(); +} + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +void SimTcpClient::getRecvData(sim_dispatcher_data_t &disp_data) +{ + if (tcp_client == Q_NULLPTR) + return; + + QByteArray recv_data = tcp_client->getBuffer(); + + if (recv_data.size() < static_cast(sizeof (sim_dispatcher_data_t))) + { + return; + } + + sim_dispatcher_data_t *dsp = static_cast(static_cast(recv_data.data())); + + disp_data = *dsp; + + return; +} + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +void SimTcpClient::sendTrainData(sim_train_data_t train_data) +{ + if (tcp_client == Q_NULLPTR) + return; + + tcp_client->sendToServer(ATcp::tcPOSTGET, ATcp::toByteArrayHard(train_data)); +} + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +void SimTcpClient::init(const tcp_config_t &tcp_config) +{ + tcp_client->init(tcp_config); + tcp_client->setNoProxy(); +} + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +void SimTcpClient::start() +{ + if (tcp_client != Q_NULLPTR) + tcp_client->start(); +} + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +void SimTcpClient::stop() +{ + if (tcp_client != Q_NULLPTR) + { + tcp_client->stop(); + } +} diff --git a/simulator/simulator.pro b/simulator/simulator.pro index f21b6994..341242f6 100644 --- a/simulator/simulator.pro +++ b/simulator/simulator.pro @@ -13,6 +13,7 @@ SUBDIRS += ./coupling SUBDIRS += ./brakepipe SUBDIRS += ./profile SUBDIRS += ./train +SUBDIRS += ./sim-client SUBDIRS += ./model SUBDIRS += ./default-coupling SUBDIRS += ./ef-coupling diff --git a/simulator/simulator/simulator.pro b/simulator/simulator/simulator.pro index 79e74124..781c6814 100644 --- a/simulator/simulator/simulator.pro +++ b/simulator/simulator/simulator.pro @@ -20,7 +20,6 @@ CONFIG(debug, debug|release) { LIBS += -L../../../lib -lCfgReader_d LIBS += -L../../../lib -lfilesystem_d LIBS += -L../../../lib -lJournal_d - LIBS += -L../../../lib -llog_d LIBS += -L../../../lib -lphysics_d LIBS += -L../../../lib -lvehicle_d LIBS += -L../../../lib -lcoupling_d @@ -29,6 +28,7 @@ CONFIG(debug, debug|release) { LIBS += -L../../../lib -lbrakepipe_d LIBS += -L../../../lib -lmodel_d LIBS += -L../../../lib -lTcpConnection_d + LIBS += -L../../../lib -lsim-client_d LIBS += -L../../../lib -lprofile_d LIBS += -L../../../lib -ldevice_d @@ -40,7 +40,6 @@ CONFIG(debug, debug|release) { LIBS += -L../../../lib -lCfgReader LIBS += -L../../../lib -lfilesystem LIBS += -L../../../lib -lJournal - LIBS += -L../../../lib -llog LIBS += -L../../../lib -lphysics LIBS += -L../../../lib -lvehicle LIBS += -L../../../lib -lcoupling @@ -49,6 +48,7 @@ CONFIG(debug, debug|release) { LIBS += -L../../../lib -lbrakepipe LIBS += -L../../../lib -lmodel LIBS += -L../../../lib -lTcpConnection + LIBS += -L../../../lib -lsim-client LIBS += -L../../../lib -lprofile LIBS += -L../../../lib -ldevice @@ -76,7 +76,6 @@ INCLUDEPATH += ../../common-headers/ INCLUDEPATH += ../../CfgReader/include INCLUDEPATH += ../../filesystem/include INCLUDEPATH += ../../libJournal/include -INCLUDEPATH += ../../log/include INCLUDEPATH += ../../tcp-connection/include INCLUDEPATH += ../physics/include @@ -88,6 +87,7 @@ INCLUDEPATH += ../coupling/include INCLUDEPATH += ../brakepipe/include INCLUDEPATH += ../profile/include INCLUDEPATH += ../device/include +INCLUDEPATH += ../sim-client/include INCLUDEPATH += ../../asound/include INCLUDEPATH += ../sound-manager/include diff --git a/simulator/solver/include/ode-system.h b/simulator/solver/include/ode-system.h index b7d82048..907d46bd 100644 --- a/simulator/solver/include/ode-system.h +++ b/simulator/solver/include/ode-system.h @@ -43,9 +43,6 @@ class SOLVER_EXPORT OdeSystem : public QObject protected: - /// ODE system order - int n; - /// ODE state vector state_vector_t y; /// State vector derivative by time diff --git a/simulator/sound-manager/include/sound-config.h b/simulator/sound-manager/include/sound-config.h index 734920e9..9bee4363 100644 --- a/simulator/sound-manager/include/sound-config.h +++ b/simulator/sound-manager/include/sound-config.h @@ -14,6 +14,7 @@ struct sound_config_t float init_pitch; bool loop; bool play_on_start; + QMap volume_curve; sound_config_t() : sound(Q_NULLPTR) diff --git a/simulator/sound-manager/include/sound-manager.h b/simulator/sound-manager/include/sound-manager.h index 9b9bf8f8..6f4b79ac 100644 --- a/simulator/sound-manager/include/sound-manager.h +++ b/simulator/sound-manager/include/sound-manager.h @@ -38,6 +38,8 @@ public slots: void setVolume(QString name, int volume); void setPitch(QString name, float pitch); + + void volumeCurveStep(QString name, float param); }; #endif // SOUND_MANAGER_H diff --git a/simulator/sound-manager/sound-manager.pro b/simulator/sound-manager/sound-manager.pro index eb2a5c5e..8689aace 100644 --- a/simulator/sound-manager/sound-manager.pro +++ b/simulator/sound-manager/sound-manager.pro @@ -17,12 +17,14 @@ CONFIG(debug, debug|release) { LIBS += -L../../../lib -lasound_d LIBS += -L../../../lib -lCfgReader_d LIBS += -L../../../lib -lfilesystem_d + LIBS += -L../../../lib -lJournal_d } else { LIBS += -L../../../lib -lasound LIBS += -L../../../lib -lCfgReader LIBS += -L../../../lib -lfilesystem + LIBS += -L../../../lib -lJournal } @@ -44,6 +46,7 @@ INCLUDEPATH += ./include INCLUDEPATH += ../../asound/include INCLUDEPATH += ../../CfgReader/include INCLUDEPATH += ../../filesystem/include +INCLUDEPATH += ../../libJournal/include HEADERS += $$files(./include/*.h) SOURCES += $$files(./src/*.cpp) diff --git a/simulator/sound-manager/src/sound-manager.cpp b/simulator/sound-manager/src/sound-manager.cpp index 154cf53c..db6ae07e 100644 --- a/simulator/sound-manager/src/sound-manager.cpp +++ b/simulator/sound-manager/src/sound-manager.cpp @@ -1,6 +1,7 @@ #include "sound-manager.h" #include "CfgReader.h" #include "filesystem.h" +#include "Journal.h" //------------------------------------------------------------------------------ // @@ -30,6 +31,7 @@ void SoundManager::loadSounds(const QString &vehicle_name) + vehicle_name.toStdString(); std::string path = soundsDir + fs.separator() + "sounds.xml"; + Journal::instance()->info("Loaded sound config file: " + QString(path.c_str())); CfgReader cfg; @@ -53,6 +55,16 @@ void SoundManager::loadSounds(const QString &vehicle_name) cfg.getBool(secNode, "Loop", sound_config.loop); cfg.getBool(secNode, "PlayOnStart", sound_config.play_on_start); + QString t_Str; + cfg.getString(secNode, "VolumeCurve", t_Str); + QRegExp rx("([+-]?\\d*\\.?\\d+)(?:\\t*)([+-]?\\d*\\.?\\d+)"); + foreach(const QString &lst1, t_Str.split(QLatin1Char('\n'))) + { + if (rx.indexIn(lst1) > -1) + sound_config.volume_curve.insert(rx.cap(1).toDouble(), + static_cast((rx.cap(2).toDouble()))); + } + sound_config.sound = new ASound(QString((soundsDir + fs.separator()).c_str()) + sound_config.path); @@ -153,3 +165,31 @@ void SoundManager::setPitch(QString name, float pitch) } } } + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +void SoundManager::volumeCurveStep(QString name, float param) +{ + auto it = sounds.find(name); + + if (it.key() == name) + { + QMap::const_iterator i = it->volume_curve.constBegin(); + + int volume = 0; + + while (i != it->volume_curve.constEnd()) + { + if (param >= static_cast(i.key())) + { + volume = i.value(); + } else { + break; + } + ++i; + } + + it.value().sound->setVolume(volume); + } +} diff --git a/simulator/train/include/train.h b/simulator/train/include/train.h index c290118d..03c2bbd4 100644 --- a/simulator/train/include/train.h +++ b/simulator/train/include/train.h @@ -88,6 +88,12 @@ class TRAIN_EXPORT Train : public OdeSystem size_t getVehiclesNumber() const; + QString getClientName(); + + QString getTrainID(); + + int getDirection() const; + std::vector *getVehicles(); signals: @@ -132,6 +138,12 @@ class TRAIN_EXPORT Train : public OdeSystem /// Sound manager SoundManager *soundMan; + /// Имя сетевого клиента для ВЖД + QString client_name; + + /// Идентификатор поезда для ВЖД + QString train_id; + /// All train's vehicles std::vector vehicles; diff --git a/simulator/train/src/train.cpp b/simulator/train/src/train.cpp index 7fd324c3..6594b757 100644 --- a/simulator/train/src/train.cpp +++ b/simulator/train/src/train.cpp @@ -45,7 +45,6 @@ bool Train::init(const init_data_t &init_data) if (train_motion_solver == Q_NULLPTR) { - emit logMessage("ERROR: solver " + solver_path + " is't found"); Journal::instance()->error("Solver " + solver_path + " is't found"); return false; } @@ -69,7 +68,6 @@ bool Train::init(const init_data_t &init_data) // Loading of train if (!loadTrain(full_config_path)) { - emit logMessage("ERROR: train is't loaded"); Journal::instance()->error("Train is't loaded"); return false; } @@ -92,7 +90,6 @@ bool Train::init(const init_data_t &init_data) // Loading of couplings if (!loadCouplings(full_config_path)) { - emit logMessage("ERROR: couplings is't loaded"); Journal::instance()->error("Coupling model is't loaded"); return false; } @@ -201,7 +198,7 @@ void Train::vehiclesStep(double t, double dt) auto begin = vehicles.begin(); brakepipe->setBeginPressure((*begin)->getBrakepipeBeginPressure()); - int j = 1; + size_t j = 1; for (auto i = begin; i != end; ++i) { @@ -294,6 +291,33 @@ size_t Train::getVehiclesNumber() const return vehicles.size(); } +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +QString Train::getClientName() +{ + return client_name; +} + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +QString Train::getTrainID() +{ + return train_id; +} + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +int Train::getDirection() const +{ + return dir; +} + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ std::vector *Train::getVehicles() { return &vehicles; @@ -327,6 +351,16 @@ bool Train::loadTrain(QString cfg_path) no_air = false; } + if (!cfg.getString("Common", "ClientName", client_name)) + { + client_name = ""; + } + + if (!cfg.getString("Common", "TrainID", train_id)) + { + train_id = ""; + } + QDomNode vehicle_node = cfg.getFirstSection("Vehicle"); if (vehicle_node.isNull()) @@ -339,7 +373,6 @@ bool Train::loadTrain(QString cfg_path) QString module_name = ""; if (!cfg.getString(vehicle_node, "Module", module_name)) { - emit logMessage("ERROR: Module section is not find"); Journal::instance()->error("Module section is not found"); break; } @@ -369,18 +402,14 @@ bool Train::loadTrain(QString cfg_path) payload_coeff = 0; } - // Loading sounds - soundMan->loadSounds(module_cfg_name); - for (int i = 0; i < n_vehicles; i++) { Vehicle *vehicle = loadVehicle(QString(fs.getModulesDir().c_str()) + fs.separator() + - relModulePath); + relModulePath); if (vehicle == Q_NULLPTR) { - emit logMessage("ERROR: vehicle " + module_name + " is't loaded"); Journal::instance()->error("Vehicle " + module_name + " is't loaded"); break; } @@ -412,10 +441,14 @@ bool Train::loadTrain(QString cfg_path) vehicle->setIndex(index); index = ode_order; + // Loading sounds + soundMan->loadSounds(vehicle->getSoundsDir()); + connect(vehicle, &Vehicle::soundPlay, soundMan, &SoundManager::play, Qt::DirectConnection); connect(vehicle, &Vehicle::soundStop, soundMan, &SoundManager::stop, Qt::DirectConnection); connect(vehicle, &Vehicle::soundSetVolume, soundMan, &SoundManager::setVolume, Qt::DirectConnection); connect(vehicle, &Vehicle::soundSetPitch, soundMan, &SoundManager::setPitch, Qt::DirectConnection); + connect(vehicle, &Vehicle::volumeCurveStep, soundMan, &SoundManager::volumeCurveStep, Qt::DirectConnection); if (vehicles.size() !=0) { @@ -424,10 +457,7 @@ bool Train::loadTrain(QString cfg_path) vehicle->setPrevVehicle(prev); } - vehicles.push_back(vehicle); - - emit logMessage("OK: Loaded vehicle: " + module_name + - " with configuration: " + module_cfg_name + ".xml"); + vehicles.push_back(vehicle); } vehicle_node = cfg.getNextSection(); @@ -442,7 +472,6 @@ bool Train::loadTrain(QString cfg_path) } else { - emit logMessage("ERROR: file " + cfg_path + " is't found"); Journal::instance()->error("File " + cfg_path + " is't found"); } @@ -479,7 +508,6 @@ bool Train::loadCouplings(QString cfg_path) if (coupling == Q_NULLPTR) { - emit logMessage("ERROR: coupling module " + coupling_module + " is't found"); return false; } @@ -499,7 +527,6 @@ bool Train::loadCouplings(QString cfg_path) } else { - emit logMessage("ERROR: file " + cfg_path + " is't found"); Journal::instance()->error("File " + cfg_path + " is't found"); } @@ -528,11 +555,9 @@ void Train::setInitConditions(const init_data_t &init_data) } } - double x0 = init_data.init_coord * 1000.0; + double x0 = init_data.init_coord * 1000.0 - dir * this->getFirstVehicle()->getLength() / 2.0; y[0] = x0; - emit logMessage(QString("OK: Setting up of initial coordinate: %1").arg(x0)); - Journal::instance()->info(QString("Vehicle[%2] coordinate: %1").arg(y[0]).arg(0, 3)); for (size_t i = 1; i < vehicles.size(); i++) @@ -562,4 +587,3 @@ void Train::initVehiclesBrakes() vehicles[i]->initBrakeDevices(charging_pressure, pTM, init_main_res_pressure); } } - diff --git a/simulator/vehicle/include/alsn-struct.h b/simulator/vehicle/include/alsn-struct.h new file mode 100644 index 00000000..3ad1c077 --- /dev/null +++ b/simulator/vehicle/include/alsn-struct.h @@ -0,0 +1,45 @@ +#ifndef ALSN_STRUCT_H +#define ALSN_STRUCT_H + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +enum +{ + ALSN_WHITE = 0, + ALSN_RED = 1, + ALSN_RED_YELLOW = 2, + ALSN_YELLOW = 3, + ALSN_GREEN = 4 +}; + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +#pragma pack(push, 1) + +struct alsn_info_t +{ + short code_alsn; + int num_free_block; + int response_code; + char current_time[9]; + char signal_name[23]; + double signal_dist; + + + alsn_info_t() + : code_alsn(ALSN_GREEN) + , num_free_block(1) + , response_code(0) + , current_time("00:00:00") + , signal_name("") + , signal_dist(0.0) + { + + } +}; + +#pragma pack(pop) + +#endif // ALSNSTRUCT_H diff --git a/common-headers/vehicle-signals.h b/simulator/vehicle/include/vehicle-signals.h similarity index 100% rename from common-headers/vehicle-signals.h rename to simulator/vehicle/include/vehicle-signals.h diff --git a/simulator/vehicle/include/vehicle.h b/simulator/vehicle/include/vehicle.h index 1d8efe11..b7ba84a0 100644 --- a/simulator/vehicle/include/vehicle.h +++ b/simulator/vehicle/include/vehicle.h @@ -24,18 +24,18 @@ #include "solver-types.h" #include "key-symbols.h" +#include "vehicle-signals.h" #include "control-signals.h" #include "feedback-signals.h" +#include "alsn-struct.h" + #if defined(VEHICLE_LIB) #define VEHICLE_EXPORT Q_DECL_EXPORT #else #define VEHICLE_EXPORT Q_DECL_IMPORT #endif -const int NUM_ANALOG_SIGNALS = 1000; -const int NUM_DISCRETE_SIGNALS = 1000; - //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ @@ -115,12 +115,12 @@ class VEHICLE_EXPORT Vehicle : public QObject double getWheelOmega(size_t i); - bool getDiscreteSignal(int i); + bool getDiscreteSignal(size_t i); - float getAnalogSignal(int i); + float getAnalogSignal(size_t i); - bool *getDiscreteSignals(); - float *getAnalogSignals(); + std::array getDiscreteSignals(); + std::array getAnalogSignals(); /// Common acceleration calculation virtual state_vector_t getAcceleration(state_vector_t &Y, double t); @@ -149,6 +149,9 @@ class VEHICLE_EXPORT Vehicle : public QObject QString getDebugMsg() const; + /// vehicle get sounds directory + QString getSoundsDir() const; + /// Init vehicle brake devices virtual void initBrakeDevices(double p0, double pTM, double pFL); @@ -162,6 +165,8 @@ class VEHICLE_EXPORT Vehicle : public QObject double getEPTControl(size_t i); + void setASLN(alsn_info_t alsn_info); + public slots: void receiveData(QByteArray data); @@ -180,6 +185,8 @@ public slots: void soundSetPitch(QString name, float pitch); + void volumeCurveStep(QString name, float param); + void sendFeedBackSignals(feedback_signals_t feedback_signals); protected: @@ -195,6 +202,8 @@ public slots: double payload_coeff; /// Full vehicle mass double full_mass; + /// Vehicle sounds directory + QString soundDirectory; /// Length between coupling's axis double length; @@ -273,9 +282,9 @@ public slots: QMutex keys_mutex; /// Discrete signals for outpput - bool discreteSignal[NUM_DISCRETE_SIGNALS]; + std::array discreteSignal; /// Analog signals for output - float analogSignal[NUM_ANALOG_SIGNALS]; + std::array analogSignal; control_signals_t control_signals; @@ -287,6 +296,9 @@ public slots: /// Ток в линии управления ЭПТ std::vector ept_current; + /// Информация АЛСН + alsn_info_t alsn_info; + /// User defined initialization virtual void initialization(); diff --git a/simulator/vehicle/src/vehicle.cpp b/simulator/vehicle/src/vehicle.cpp index 750a67eb..f4bd7341 100644 --- a/simulator/vehicle/src/vehicle.cpp +++ b/simulator/vehicle/src/vehicle.cpp @@ -59,7 +59,8 @@ Vehicle::Vehicle(QObject *parent) : QObject(parent) , Uks(0.0) , current_kind(0) { - memset(analogSignal, 0, sizeof (float) * NUM_ANALOG_SIGNALS); + std::fill(analogSignal.begin(), analogSignal.end(), 0.0f); + std::fill(discreteSignal.begin(), discreteSignal.end(), false); } //------------------------------------------------------------------------------ @@ -298,9 +299,9 @@ double Vehicle::getWheelOmega(size_t i) //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ -bool Vehicle::getDiscreteSignal(int i) +bool Vehicle::getDiscreteSignal(size_t i) { - if (i < NUM_DISCRETE_SIGNALS) + if (i < discreteSignal.size()) return discreteSignal[i]; else return false; @@ -309,9 +310,9 @@ bool Vehicle::getDiscreteSignal(int i) //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ -float Vehicle::getAnalogSignal(int i) +float Vehicle::getAnalogSignal(size_t i) { - if (i < NUM_ANALOG_SIGNALS) + if (i < analogSignal.size()) return analogSignal[i]; else return 0.0f; @@ -476,12 +477,18 @@ void Vehicle::setCurrentKind(int value) current_kind = value; } +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ void Vehicle::setEPTControl(size_t i, double value) { if (i < ept_control.size()) ept_control[i] = value; } +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ double Vehicle::getEPTCurrent(size_t i) { if (i < ept_current.size()) @@ -490,6 +497,9 @@ double Vehicle::getEPTCurrent(size_t i) return 0; } +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ double Vehicle::getEPTControl(size_t i) { if (i < ept_control.size()) @@ -498,6 +508,14 @@ double Vehicle::getEPTControl(size_t i) return 0; } +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +void Vehicle::setASLN(alsn_info_t alsn_info) +{ + this->alsn_info = alsn_info; +} + //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ @@ -509,7 +527,7 @@ void Vehicle::setUks(double value) //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ -bool *Vehicle::getDiscreteSignals() +std::array Vehicle::getDiscreteSignals() { return discreteSignal; } @@ -517,7 +535,7 @@ bool *Vehicle::getDiscreteSignals() //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ -float *Vehicle::getAnalogSignals() +std::array Vehicle::getAnalogSignals() { return analogSignal; } @@ -555,11 +573,14 @@ void Vehicle::loadConfiguration(QString cfg_path) cfg.getDouble(secName, "PayloadMass", payload_mass); cfg.getDouble(secName, "Length", length); cfg.getDouble(secName, "WheelDiameter", wheel_diameter); + cfg.getString(secName, "SoundDir", soundDirectory); + Journal::instance()->info(QString("EmptyMass: %1 kg").arg(empty_mass)); Journal::instance()->info(QString("PayloadMass: %1 kg").arg(payload_mass)); Journal::instance()->info(QString("Length: %1 m").arg(length)); Journal::instance()->info(QString("WheelDiameter: %1 m").arg(wheel_diameter)); + Journal::instance()->info(QString("SoundsDirectory: " + soundDirectory)); rk = wheel_diameter / 2.0; @@ -592,7 +613,6 @@ void Vehicle::loadConfiguration(QString cfg_path) } else { - emit logMessage("ERROR: file " + cfg_path + "is't found"); Journal::instance()->error("File " + cfg_path + " is't found"); } @@ -629,7 +649,6 @@ void Vehicle::loadMainResist(QString cfg_path, QString main_resist_cfg) } else { - emit logMessage("ERROR: file " + file_path + "is't found"); Journal::instance()->error("File " + file_path + " is't found"); } } @@ -745,3 +764,11 @@ void Vehicle::initBrakeDevices(double p0, double pTM, double pFL) Q_UNUSED(pTM) Q_UNUSED(pFL) } + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +QString Vehicle::getSoundsDir() const +{ + return soundDirectory; +} diff --git a/tcp-connection b/tcp-connection index a30a2330..46f7a082 160000 --- a/tcp-connection +++ b/tcp-connection @@ -1 +1 @@ -Subproject commit a30a2330f9cceae338726ce18d453c4455a16c39 +Subproject commit 46f7a0823dff1b440596b86122809393741b2eaf diff --git a/tools/routeconv/src/mainwindow.cpp b/tools/routeconv/src/mainwindow.cpp index 6782870a..e5e9adca 100644 --- a/tools/routeconv/src/mainwindow.cpp +++ b/tools/routeconv/src/mainwindow.cpp @@ -170,6 +170,8 @@ void MainWindow::slotConvert() //------------------------------------------------------------------------------ void MainWindow::slotIsPathconvFinished(int error_code) { + Q_UNUSED(error_code) + startProfConverter(routeDir); } @@ -178,5 +180,7 @@ void MainWindow::slotIsPathconvFinished(int error_code) //------------------------------------------------------------------------------ void MainWindow::slotIsProfconvFinished(int error_code) { + Q_UNUSED(error_code) + ui->lStatus->setText(tr("OK: conversion complete")); } diff --git a/viewer/display/display.pro b/viewer/display/display.pro new file mode 100644 index 00000000..9718e84f --- /dev/null +++ b/viewer/display/display.pro @@ -0,0 +1,30 @@ +DEFINES += DISPLAY_LIB + +TEMPLATE = lib + +QT += core +QT += gui +QT += widgets +QT += opengl + +DESTDIR = ../../../lib + +TARGET = display + +CONFIG(debug, debug|release) { + + TARGET = $$join(TARGET,,,_d) + + + +} else { + + +} + +INCLUDEPATH += ./include +INCLUDEPATH += ../../common-headers +INCLUDEPATH += ../../simulator/vehicle/include + +HEADERS += $$files(./include/*.h) +SOURCES += $$files(./src/*.cpp) diff --git a/viewer/display/include/display-export.h b/viewer/display/include/display-export.h new file mode 100644 index 00000000..af8bed56 --- /dev/null +++ b/viewer/display/include/display-export.h @@ -0,0 +1,12 @@ +#ifndef DISPLAY_EXPORT_H +#define DISPLAY_EXPORT_H + +#include + +#if defined(DISPLAY_LIB) + #define DISPLAY_EXPORT Q_DECL_EXPORT +#else + #define DISPLAY_EXPORT Q_DECL_IMPORT +#endif + +#endif // DISPLAY_EXPORT_H diff --git a/viewer/display/include/display-types.h b/viewer/display/include/display-types.h new file mode 100644 index 00000000..3a45138d --- /dev/null +++ b/viewer/display/include/display-types.h @@ -0,0 +1,10 @@ +#ifndef DISPLAY_TYPES_H +#define DISPLAY_TYPES_H + +#include + +#include "vehicle-signals.h" + +typedef std::array display_signals_t; + +#endif // DISPLAY_TYPES_H diff --git a/viewer/display/include/display.h b/viewer/display/include/display.h new file mode 100644 index 00000000..4750241a --- /dev/null +++ b/viewer/display/include/display.h @@ -0,0 +1,84 @@ +//------------------------------------------------------------------------------ +// +// +// +// +//------------------------------------------------------------------------------ +#ifndef DISPLAY_H +#define DISPLAY_H + +#include + +#include "display-export.h" +#include "display-types.h" + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +class DISPLAY_EXPORT AbstractDisplay : public QWidget +{ +public: + + AbstractDisplay(QWidget *parent = Q_NULLPTR, + Qt::WindowFlags f = Qt::WindowFlags()); + + virtual ~AbstractDisplay(); + + /// Инициализация дисплея + virtual void init(); + + /// Задать входной сигнал + void setInputSignal(size_t index, float value); + + /// Задать массив входных сигналов + void setInputSignals(const display_signals_t &input_signals); + + /// Получить выходной сигнал + float getOutputSignal(size_t index); + + /// Получить массив выходных сигналов + display_signals_t getOutputSignals(); + + /// Задать каталог с конфигруционными файлами + void setConfigDir(QString config_dir); + + /// Получить путь к каталогу с конфигами + QString getConfigDir() const; + +protected: + + /// Входные сигналы, отображаемые на интерфейсе дисплея и управляющие его поведением + display_signals_t input_signals; + + /// Выходные (командные) сигналы, передаваемые с дисплея + display_signals_t output_signals; + + /// Путь к каталогу конфигурации + QString config_dir; +}; + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +#define TO_BOOL(SignalName) static_cast(SignalName) + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +typedef AbstractDisplay* (*GetDisplay)(); + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +#define GET_DISPLAY(ClassName) \ + extern "C" Q_DECL_EXPORT AbstractDisplay *getDisplay() \ + {\ + return new (ClassName)(); \ + } + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +extern "C" Q_DECL_EXPORT AbstractDisplay *loadDisplay(QString lib_path); + +#endif // DISPLAY_H diff --git a/viewer/display/src/display.cpp b/viewer/display/src/display.cpp new file mode 100644 index 00000000..825a32ed --- /dev/null +++ b/viewer/display/src/display.cpp @@ -0,0 +1,103 @@ +#include "display.h" + +#include + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +AbstractDisplay::AbstractDisplay(QWidget *parent, Qt::WindowFlags f) + : QWidget(parent, f) + +{ + +} + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +AbstractDisplay::~AbstractDisplay() +{ + +} + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +void AbstractDisplay::setInputSignal(size_t index, float value) +{ + if (index < input_signals.size()) + input_signals[index] = value; +} + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +float AbstractDisplay::getOutputSignal(size_t index) +{ + if (index < output_signals.size()) + return output_signals[index]; + + return 0.0f; +} + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +void AbstractDisplay::setInputSignals(const display_signals_t &input_signals) +{ + this->input_signals = input_signals; +} + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +display_signals_t AbstractDisplay::getOutputSignals() +{ + return output_signals; +} + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +void AbstractDisplay::setConfigDir(QString config_dir) +{ + this->config_dir = config_dir; +} + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +QString AbstractDisplay::getConfigDir() const +{ + return this->config_dir; +} + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +void AbstractDisplay::init() +{ + +} + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +AbstractDisplay *loadDisplay(QString lib_path) +{ + AbstractDisplay *display = Q_NULLPTR; + + QLibrary lib(lib_path); + + if (lib.load()) + { + GetDisplay getDisplay = reinterpret_cast(lib.resolve("getDisplay")); + + if (getDisplay != Q_NULLPTR) + { + display = getDisplay(); + } + } + + return display; +} diff --git a/viewer/route-loader/route-loader.pro b/viewer/route-loader/route-loader.pro index c2160ed3..d0c94e7e 100644 --- a/viewer/route-loader/route-loader.pro +++ b/viewer/route-loader/route-loader.pro @@ -78,6 +78,7 @@ unix { INCLUDEPATH += ../../common-headers +INCLUDEPATH += ../../simulator/vehicle/include INCLUDEPATH += ../../filesystem/include INCLUDEPATH += ../library/include INCLUDEPATH += ./include diff --git a/viewer/viewer.pro b/viewer/viewer.pro index 984b50a2..e1d75f7f 100644 --- a/viewer/viewer.pro +++ b/viewer/viewer.pro @@ -6,5 +6,6 @@ SUBDIRS += ./osgdb_dmd SUBDIRS += ./library SUBDIRS += ./route-loader SUBDIRS += ./zds-route-loader +SUBDIRS += ./display SUBDIRS += ./viewer diff --git a/viewer/viewer/include/display-config.h b/viewer/viewer/include/display-config.h new file mode 100644 index 00000000..9280273a --- /dev/null +++ b/viewer/viewer/include/display-config.h @@ -0,0 +1,21 @@ +#ifndef DISPLAY_CONFIG_H +#define DISPLAY_CONFIG_H + +#include +#include + +struct display_config_t +{ + QString module_name; + QString surface_name; + osg::ref_ptr texcoord; + + display_config_t() + : module_name("") + , surface_name("") + { + + } +}; + +#endif // DISPLAY_CONFIG_H diff --git a/viewer/viewer/include/display-container.h b/viewer/viewer/include/display-container.h new file mode 100644 index 00000000..2ca34a82 --- /dev/null +++ b/viewer/viewer/include/display-container.h @@ -0,0 +1,33 @@ +#ifndef DISPLAY_CONTAINER_H +#define DISPLAY_CONTAINER_H + +#include +#include +#include + +#include "display.h" +#include "display-config.h" + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +struct display_container_t +{ + AbstractDisplay *display; + osg::ref_ptr widgetImage; + osg::ref_ptr texture; + osg::ref_ptr handler; + + display_container_t() + : display(nullptr) + { + + } +}; + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +typedef std::vector displays_t; + +#endif // DISPLAY_CONTAINER_H diff --git a/viewer/viewer/include/display-loader.h b/viewer/viewer/include/display-loader.h new file mode 100644 index 00000000..288affd5 --- /dev/null +++ b/viewer/viewer/include/display-loader.h @@ -0,0 +1,12 @@ +#ifndef DISPLAY_LOADER_H +#define DISPLAY_LOADER_H + +#include "display-container.h" + +#include + +void loadDisplayModule(const display_config_t &display_config, + display_container_t *dc, + osg::Node *model); + +#endif // DISPLAY_LOADER_H diff --git a/viewer/viewer/include/display-surface-visitor.h b/viewer/viewer/include/display-surface-visitor.h new file mode 100644 index 00000000..ef53b80a --- /dev/null +++ b/viewer/viewer/include/display-surface-visitor.h @@ -0,0 +1,25 @@ +#ifndef DISPLAY_SURFACE_VISITOR_H +#define DISPLAY_SURFACE_VISITOR_H + +#include "display-container.h" + +#include +#include +#include +#include + +class DisplaySurfaceVisitor : public osg::NodeVisitor +{ +public: + + DisplaySurfaceVisitor(display_container_t *dc, display_config_t display_config); + + virtual void apply(osg::Geode &geode); + +private: + + display_container_t *dc; + display_config_t display_config; +}; + +#endif // DISPLAY_VISITOR_H diff --git a/viewer/viewer/include/display-visitor.h b/viewer/viewer/include/display-visitor.h new file mode 100644 index 00000000..ac9c608b --- /dev/null +++ b/viewer/viewer/include/display-visitor.h @@ -0,0 +1,24 @@ +#ifndef DISPLAY_VISITOR_H +#define DISPLAY_VISITOR_H + +#include +#include +#include + +#include "display-container.h" + +class DisplayVisitor : public osg::NodeVisitor +{ +public: + + DisplayVisitor(display_container_t *dc, display_config_t display_config); + + virtual void apply(osg::Transform &transform); + +private: + + display_container_t *dc; + display_config_t display_config; +}; + +#endif // DISPLAY_VISITOR_H diff --git a/viewer/viewer/include/motion-blur.h b/viewer/viewer/include/motion-blur.h deleted file mode 100644 index 9c8a4508..00000000 --- a/viewer/viewer/include/motion-blur.h +++ /dev/null @@ -1,53 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Motion blur effect operation (view post processing) -// (c) maisvendoo, 02/12/2018 -// -//------------------------------------------------------------------------------ -/*! - * \file - * \brief Motion blur effect operation (view post processing) - * \copyright maisvendoo - * \author maisvendoo - * \date 02/12/2018 - */ - -#ifndef MOTION_BLUR_H -#define MOTION_BLUR_H - -#include -#include - -/*! - * \class - * \brief Motion blur operation - */ -//------------------------------------------------------------------------------ -// -//------------------------------------------------------------------------------ -class MotionBlurOperation : public osg::Operation -{ -public: - - /// Constructor - MotionBlurOperation(double persistence) - : osg::Referenced(true) - , osg::Operation("MotionBlur", true) - , _persistence(persistence) - , _t0(0.0) - , _cleared(false) - { - - } - - /// Motion blur handler - virtual void operator() (osg::Object *object); - -protected: - - double _persistence; - double _t0; - bool _cleared; -}; - -#endif // MOTION_BLUR_H diff --git a/viewer/viewer/include/train-exterior.h b/viewer/viewer/include/train-exterior.h index 572e298e..69c05935 100644 --- a/viewer/viewer/include/train-exterior.h +++ b/viewer/viewer/include/train-exterior.h @@ -31,6 +31,8 @@ #include "camera-position.h" #include "settings.h" #include "server-data-struct.h" +#include "config-reader.h" +#include "display.h" #include @@ -123,7 +125,11 @@ class TrainExteriorHandler : public QObject, public osgGA::GUIEventHandler /// Load vehicle animations void loadAnimations(const std::string vehicle_name, osg::Node *cabine, animations_t &animations); - void loadModelAnimations(const std::string vehicle_name, osg::Node *model, animations_t &animations); + void loadModelAnimations(const std::string vehicle_name, osg::Node *model, animations_t &animations); + + void loadDisplays(ConfigReader &cfg, osgDB::XmlNode *vehicle_node, osg::Node *model, displays_t &displays); + + void timerEvent(QTimerEvent *); }; #endif // TRAIN_EXTERIOR_H diff --git a/viewer/viewer/include/vehicle-exterior.h b/viewer/viewer/include/vehicle-exterior.h index f89cf0db..1fe75f30 100644 --- a/viewer/viewer/include/vehicle-exterior.h +++ b/viewer/viewer/include/vehicle-exterior.h @@ -2,7 +2,8 @@ #define VEHICLE_EXTERIOR_H #include -#include +#include "animations-list.h" +#include "display-container.h" //------------------------------------------------------------------------------ // @@ -20,6 +21,7 @@ struct vehicle_exterior_t osg::Vec3 driver_pos; animations_t *anims; + displays_t *displays; }; #endif // VEHICLE_EXTERIOR_H diff --git a/viewer/viewer/include/viewer.h b/viewer/viewer/include/viewer.h index d3b1078d..2a57a785 100644 --- a/viewer/viewer/include/viewer.h +++ b/viewer/viewer/include/viewer.h @@ -80,10 +80,7 @@ class RouteViewer bool initEngineSettings(osg::Group *root); /// Init display - bool initDisplay(osgViewer::Viewer *viewer, const settings_t &settings); - - /// Init motion blur - bool initMotionBlurEffect(osgViewer::Viewer *viewer, const settings_t &settings); + bool initDisplay(osgViewer::Viewer *viewer, const settings_t &settings); }; #endif // VIEWER_H diff --git a/viewer/viewer/src/display-loader.cpp b/viewer/viewer/src/display-loader.cpp new file mode 100644 index 00000000..834c49af --- /dev/null +++ b/viewer/viewer/src/display-loader.cpp @@ -0,0 +1,26 @@ +#include "display-loader.h" + +#include + +#include "display.h" +#include "display-visitor.h" + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +void loadDisplayModule(const display_config_t &display_config, + display_container_t *dc, + osg::Node *model) +{ + dc->display = loadDisplay(display_config.module_name); + + if (dc->display == nullptr) + { + OSG_FATAL << "Module " << display_config.module_name.toStdString() << " is't found"; + return; + } + + DisplayVisitor dv(dc, display_config); + dv.setTraversalMode(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN); + model->accept(dv); +} diff --git a/viewer/viewer/src/display-surface-visitor.cpp b/viewer/viewer/src/display-surface-visitor.cpp new file mode 100644 index 00000000..bcc6642e --- /dev/null +++ b/viewer/viewer/src/display-surface-visitor.cpp @@ -0,0 +1,36 @@ +#include "display-surface-visitor.h" + +#include +#include +#include +#include + +DisplaySurfaceVisitor::DisplaySurfaceVisitor(display_container_t *dc, display_config_t display_config) + : osg::NodeVisitor() + , dc(dc) + , display_config(display_config) + +{ + +} + +void DisplaySurfaceVisitor::apply(osg::Geode &geode) +{ + dc->widgetImage = new osgQt::QWidgetImage(dc->display); + dc->texture = new osg::Texture2D(dc->widgetImage.get()); + dc->texture->setWrap(osg::Texture::WRAP_S, osg::Texture::REPEAT); + dc->texture->setWrap(osg::Texture::WRAP_T, osg::Texture::REPEAT); + + osg::StateSet *stateset = geode.getOrCreateStateSet(); + stateset->setTextureAttributeAndModes(0, dc->texture.get()); + + dc->handler = new osgViewer::InteractiveImageHandler(dc->widgetImage.get()); + + geode.getDrawable(0)->setEventCallback(dc->handler.get()); + geode.getDrawable(0)->setCullCallback(dc->handler.get()); + + osg::Geometry *geom = static_cast(geode.getDrawable(0)); + geom->setTexCoordArray(0, display_config.texcoord.get()); + + traverse(geode); +} diff --git a/viewer/viewer/src/display-visitor.cpp b/viewer/viewer/src/display-visitor.cpp new file mode 100644 index 00000000..d957f397 --- /dev/null +++ b/viewer/viewer/src/display-visitor.cpp @@ -0,0 +1,29 @@ +#include "display-visitor.h" + +#include +#include +#include + +#include "display-surface-visitor.h" + +DisplayVisitor::DisplayVisitor(display_container_t *dc, display_config_t display_config) + : osg::NodeVisitor() + , dc(dc) + , display_config(display_config) +{ + +} + +void DisplayVisitor::apply(osg::Transform &transform) +{ + osg::MatrixTransform *matrix_trans = static_cast(&transform); + + if (matrix_trans->getName() == display_config.surface_name.toStdString()) + { + DisplaySurfaceVisitor dsv(dc, display_config); + dsv.setTraversalMode(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN); + matrix_trans->accept(dsv); + } + + traverse(transform); +} diff --git a/viewer/viewer/src/motion-blur.cpp b/viewer/viewer/src/motion-blur.cpp deleted file mode 100644 index 1cbad706..00000000 --- a/viewer/viewer/src/motion-blur.cpp +++ /dev/null @@ -1,46 +0,0 @@ -//------------------------------------------------------------------------------ -// -// Motion blur effect operation (view post processing) -// (c) maisvendoo, 02/12/2018 -// -//------------------------------------------------------------------------------ -/*! - * \file - * \brief Motion blur effect operation (view post processing) - * \copyright maisvendoo - * \author maisvendoo - * \date 02/12/2018 - */ - -#include "motion-blur.h" - -//------------------------------------------------------------------------------ -// -//------------------------------------------------------------------------------ -void MotionBlurOperation::operator()(osg::Object *object) -{ - osg::GraphicsContext *gc = dynamic_cast(object); - - if (!gc) - return; - - double t = gc->getState()->getFrameStamp()->getSimulationTime(); - - if (!_cleared) - { - glClearColor(0, 0, 0, 0); - glClear(GL_ACCUM_BUFFER_BIT); - _cleared = true; - _t0 = t; - } - - double dt = fabs(t - _t0); - _t0 = t; - - float s = static_cast(pow(0.2, dt / _persistence)); - - - glAccum(GL_MULT, s); - glAccum(GL_ACCUM, 1.0f - s); - glAccum(GL_RETURN, 1.0f); -} diff --git a/viewer/viewer/src/train-exterior.cpp b/viewer/viewer/src/train-exterior.cpp index 2e07ff3c..ce431a42 100644 --- a/viewer/viewer/src/train-exterior.cpp +++ b/viewer/viewer/src/train-exterior.cpp @@ -31,6 +31,8 @@ #include "model-animation.h" +#include "display-loader.h" + //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ @@ -279,6 +281,7 @@ void TrainExteriorHandler::load(const std::string &train_config) vehicle_ext.driver_pos = driver_pos; vehicle_ext.anims = new animations_t(); + vehicle_ext.displays = new displays_t(); loadModelAnimations(module_config_name, vehicle_model.get(), *vehicle_ext.anims); loadAnimations(module_config_name, vehicle_model.get(), *vehicle_ext.anims); @@ -286,6 +289,8 @@ void TrainExteriorHandler::load(const std::string &train_config) anim_managers.push_back(new AnimationManager(vehicle_ext.anims)); + loadDisplays(cfg, child, cabine.get(), *vehicle_ext.displays); + vehicles_ext.push_back(vehicle_ext); trainExterior->addChild(vehicle_ext.transform.get()); } @@ -293,6 +298,7 @@ void TrainExteriorHandler::load(const std::string &train_config) } //animation_manager = new AnimationManager(&animations); + this->startTimer(100); } //------------------------------------------------------------------------------ @@ -337,15 +343,8 @@ void TrainExteriorHandler::moveTrain(double ref_time, const network_data_t &nd) { ProcAnimation *animation = it.value(); animation->setPosition(nd.sd.back().te[i].analogSignal[animation->getSignalID()]); - } - } - - // Set parameters for animations - /*for (auto it = animations.begin(); it != animations.end(); ++it) - { - ProcAnimation *animation = it.value(); - animation->setPosition(nd.sd.back().te[static_cast(cur_vehicle)].analogSignal[animation->getSignalID()]); - }*/ + } + } } //------------------------------------------------------------------------------ @@ -512,3 +511,109 @@ void TrainExteriorHandler::loadModelAnimations(const std::string vehicle_name, } } } + +//------------------------------------------------------------------------------ +// +//------------------------------------------------------------------------------ +void TrainExteriorHandler::loadDisplays(ConfigReader &cfg, + osgDB::XmlNode *vehicle_node, + osg::Node *model, + displays_t &displays) +{ + // Определяем имя модуля для формирования пути к библиотекам дисплеев + osgDB::XmlNode *module_node = cfg.findSection(vehicle_node, "Module"); + + if (module_node == nullptr) + { + OSG_FATAL << "Vehicle's module is't represented"; + return; + } + + std::string module_name; + getValue(module_node->contents, module_name); + FileSystem &fs = FileSystem::getInstance(); + std::string modules_dir = fs.combinePath(fs.getModulesDir(), module_name); + QString md(modules_dir.c_str()); + + // Определяем имя конфига для формирования пути к файлу displays.xml, + // где хранится список дисплеев + osgDB::XmlNode *module_config_node = cfg.findSection(vehicle_node, "ModuleConfig"); + + if (module_node == nullptr) + { + OSG_FATAL << "Vehicle's module config is't represented"; + return; + } + + std::string module_config_name; + getValue(module_config_node->contents, module_config_name); + std::string vehicles_config_dir = fs.combinePath(fs.getConfigDir(), fs.combinePath("vehicles", module_config_name)); + std::string displays_config = fs.combinePath(vehicles_config_dir, "displays.xml"); + + ConfigReader displays_cfg(displays_config); + + if (!displays_cfg.isOpenned()) + { + OSG_FATAL << "File " << displays_config << " is't found"; + return; + } + + osgDB::XmlNode *config_node = displays_cfg.getConfigNode(); + + for (auto it = config_node->children.begin(); it != config_node->children.end(); ++it) + { + osgDB::XmlNode *display_node = *it; + + if (display_node->name == "Display") + { + display_config_t display_config; + + osgDB::XmlNode *module_node = displays_cfg.findSection(display_node, "Module"); + std::string module_path = fs.combinePath(modules_dir, module_node->contents); + display_config.module_name = QString(module_path.c_str()); + + osgDB::XmlNode *surface_name_node = displays_cfg.findSection(display_node, "SurfaceName"); + display_config.surface_name = QString(surface_name_node->contents.c_str()); + + display_config.texcoord = new osg::Vec2Array; + for (size_t i = 0; i < 4; ++i) + { + QString corner_name = QString("Corner%1").arg(i+1); + osgDB::XmlNode *corner_node = displays_cfg.findSection(display_node, corner_name.toStdString()); + + std::stringstream ss(corner_node->contents); + float x, y; + ss >> x >> y; + osg::Vec2 texel(x, y); + display_config.texcoord->push_back(texel); + } + + display_container_t *dc = new display_container_t(); + + loadDisplayModule(display_config, dc, model); + + if (dc->display == nullptr) + continue; + + dc->display->setConfigDir(QString(vehicles_config_dir.c_str())); + dc->display->init(); + + displays.push_back(dc); + } + } +} + +void TrainExteriorHandler::timerEvent(QTimerEvent *) +{ + if (nd.sd.size() == 0) + return; + + for (size_t i = 0; i < vehicles_ext.size(); ++i) + { + for (auto it = vehicles_ext[i].displays->begin(); it != vehicles_ext[i].displays->end(); ++it) + { + display_container_t *dc = *it; + dc->display->setInputSignals(nd.sd.back().te[i].analogSignal); + } + } +} diff --git a/viewer/viewer/src/viewer.cpp b/viewer/viewer/src/viewer.cpp index 0e8d6057..05540478 100644 --- a/viewer/viewer/src/viewer.cpp +++ b/viewer/viewer/src/viewer.cpp @@ -32,7 +32,6 @@ #include "notify.h" #include "abstract-loader.h" #include "lighting.h" -#include "motion-blur.h" #include "qt-events.h" #include "screen-capture.h" #include "hud.h" @@ -90,7 +89,6 @@ int RouteViewer::run() viewer.addEventHandler(statsHandler.get()); - viewer.setThreadingModel(osgViewer::Viewer::SingleThreaded); // Cabine camera manipulator @@ -457,28 +455,3 @@ bool RouteViewer::initDisplay(osgViewer::Viewer *viewer, return true; } - -//------------------------------------------------------------------------------ -// -//------------------------------------------------------------------------------ -bool RouteViewer::initMotionBlurEffect(osgViewer::Viewer *viewer, - const settings_t &settings) -{ - (void) settings; - - if (viewer == nullptr) - return false; - - osg::DisplaySettings::instance()->setMinimumNumAccumBits(8, 8, 8, 8); - viewer->realize(); - - osgViewer::Viewer::Windows windows; - viewer->getWindows(windows); - - for (auto it = windows.begin(); it != windows.end(); ++it) - { - (*it)->add(new MotionBlurOperation(settings.persistence)); - } - - return true; -} diff --git a/viewer/viewer/viewer.pro b/viewer/viewer/viewer.pro index 8a0003ff..26984fa9 100644 --- a/viewer/viewer/viewer.pro +++ b/viewer/viewer/viewer.pro @@ -6,6 +6,7 @@ QT += core QT += gui QT += widgets QT += network +QT += opengl TARGET = viewer @@ -28,11 +29,13 @@ win32 { LIBS += -L$$OSG_LIB_DIRECTORY -losgGAd LIBS += -L$$OSG_LIB_DIRECTORY -losgUtild LIBS += -L$$OSG_LIB_DIRECTORY -losgTextd + LIBS += -L$$OSG_LIB_DIRECTORY -losgQt5d LIBS += -L../../../lib -lroute-loader_d LIBS += -L../../../lib -llibrary_d LIBS += -L../../../lib -lfilesystem_d LIBS += -L../../../lib -lTcpConnection_d + LIBS += -L../../../lib -ldisplay_d } else { @@ -43,14 +46,16 @@ win32 { LIBS += -L$$OSG_LIB_DIRECTORY -losgGA LIBS += -L$$OSG_LIB_DIRECTORY -losgUtil LIBS += -L$$OSG_LIB_DIRECTORY -losgText + LIBS += -L$$OSG_LIB_DIRECTORY -losgQt5 LIBS += -L../../../lib -lroute-loader LIBS += -L../../../lib -llibrary LIBS += -L../../../lib -lfilesystem LIBS += -L../../../lib -lTcpConnection + LIBS += -L../../../lib -ldisplay } - LIBS += -lopengl32 -lglu32 + #LIBS += -lopengl32 -lglu32 INCLUDEPATH += $$OSG_INCLUDE_DIRECTORY } @@ -68,11 +73,13 @@ unix { LIBS += -losgGAd LIBS += -losgUtild LIBS += -losgTextd + LIBS += -losgQt5d LIBS += -L../../../lib -lroute-loader_d LIBS += -L../../../lib -llibrary_d LIBS += -L../../../lib -lfilesystem_d LIBS += -L../../lib -lTcpConnection_d + LIBS += -L../../lib -ldisplay_d } else { @@ -83,14 +90,16 @@ unix { LIBS += -losgGA LIBS += -losgUtil LIBS += -losgText + LIBS += -losgQt5 LIBS += -L../../../lib -lroute-loader LIBS += -L../../../lib -llibrary LIBS += -L../../../lib -lfilesystem LIBS += -L../../lib -lTcpConnection + LIBS += -L../../lib -ldisplay } - LIBS += -lGL + #LIBS += -lGL } #QMAKE_CXXFLAGS += -pg @@ -101,10 +110,12 @@ unix { #CONFIG += force_debug_info INCLUDEPATH += ../../common-headers +INCLUDEPATH += ../../simulator/vehicle/include INCLUDEPATH += ../../filesystem/include INCLUDEPATH += ../../tcp-connection/include INCLUDEPATH += ../route-loader/include INCLUDEPATH += ../library/include +INCLUDEPATH += ../display/include INCLUDEPATH += ./include HEADERS += $$files(./include/*.h) diff --git a/viewer/zds-route-loader/zds-route-loader.pro b/viewer/zds-route-loader/zds-route-loader.pro index 8fc397af..aab2969b 100644 --- a/viewer/zds-route-loader/zds-route-loader.pro +++ b/viewer/zds-route-loader/zds-route-loader.pro @@ -72,6 +72,7 @@ unix { } INCLUDEPATH += ../../common-headers +INCLUDEPATH += ../../simulator/vehicle/include INCLUDEPATH += ../../filesystem/include INCLUDEPATH += ../route-loader/include INCLUDEPATH += ./include