Эта история произошла ещё в доковидное время, на тот момент я была участковым терапевтом.
Шел размеренный вечерний приём. Из окошка сквозь тюль пробивались нежные закатные лучи солнца, птицы уже завершали свой песни, а удовлетворённые бабули уходили со своими льготными рецептами. Всю красоту момента нарушил внезапно влетевший в кабинет мужчина лет 45-ти:
- Мне срочно нужно обрезание!
Мы с медсестрой переглянулись.
- Вы оглохли?! Мне нужно срочно сделать обрезание, я уезжаю послезавтра!
Я слегка отошла от шока:
- Желание, конечно, похвальное, но ...
- Но что?!
- Я терапевт. Терапевты людей не режут
- И что мне теперь делать? Надо срочно!
- А что случилось-то?
- Да оно опять воспалилось. Как я с женой спать буду? Она ж не даст
- Показывайте
Мужчина подошёл поближе к столу и снял штаны. Зрелище было не из приятных: головка полового члена была красной и опухшей, крайняя плоть практически не двигалась и были видны следы засохших выделений.
- Это впервые?
- Нет, уже было такое.
- Причину знаете?
- У меня диабет. Такое случается, если сильно нарушить диету
- У кого-то на дне рождения погуляли?
- Типа того
- Урологу показывали?
- Да. Он сказал, что если сделать обрезание, то будет легче
- Думаю, он прав. А чего ж вы ко мне прибежали, а не к урологу?
- Так его нет, а вы здесь.
- Могу написать направление в приемное отделение, но гарантий не даю. Идёт?
- Нет, мне нужно чтоб точно. И чтоб за два дня - мне на вахту скоро.
- Погодите, поговорю со старшими. Может сможем связаться с нашими урологами.
Я подошла к заведующей и обрисовала ситуацию. Она решила пойти навстречу и позвонить заведующему нашей урологией:
- Иван Иванович, здравствуйте, это поликлиника. У нас вот такая ситуация....
- А фамилия у вашей ситуации какая?
- Петров. А что?
- Оооо, нашелся-таки
- Нашелся?
- Две недели назад прибежал к нам в приемник с выпученными глазами и требованием срочно обрезать. У нас мест в отделении не было, мы ему место оставили на этот понедельник, список анализов дали, а он не пришел и трубку не брал.
- Так чего делать будем? Он мне тут терапевта пугает
- Присылайте в приемник, глянем чего там.
Я написала мужчине нужные бумаги и объяснила как найти наших урологов. Насколько мне известно, тогда он обрезание так и не сделал, но и с такими просьбами по вечерам к терапевтам больше не залетал.
Начну с анекдота. Турист гуляет по африканской деревне и видит, как вокруг продают бананы. Он спрашивает у местного, как они эти бананы собирают.
Войны и конфликты оказывают огромное влияние на трансформацию экономических систем, выступая как разрушительной, так и созидательной силой. Военные действия приводят к разрушению инфраструктуры, деградации производительных сил и утрате человеческого капитала, что ослабляет экономический потенциал пострадавших стран. Однако одновременно конфликты могут ускорять технологическое развитие, стимулировать изменения в экономической структуре и создавать новые формы хозяйственных отношений. Например, две мировые войны XX века не только нанесли колоссальный урон экономике, но и привели к развитию авиации, атомной энергии и массового производства, что в дальнейшем способствовало экономическому подъёму.
Войны также играют ключевую роль в перераспределении ресурсов, как внутри стран, так и на международном уровне. Конфликтные ситуации вынуждают государства мобилизовывать ресурсы для достижения стратегических целей, что приводит к значительным изменениям в приоритетах экономической политики. Так, во время Второй мировой войны многие страны перешли к плановой экономике, централизованно распределяя трудовые ресурсы, сырьё и средства производства. Эти меры позволили наращивать производство, необходимое для фронта, но также создали предпосылки для последующей модернизации экономики в мирное время.
Военные конфликты часто становятся драйверами для появления новых форм экономической кооперации. После окончания войн, особенно масштабных, международное сообщество стремится предотвратить их повторение путём создания институтов, регулирующих торговлю и финансы. Так возникли такие организации, как МВФ, Всемирный банк и ГАТТ, впоследствии трансформировавшийся в ВТО. Эти структуры помогли не только восстановить разрушенные экономики, но и создать глобальную систему экономических связей, основанную на взаимозависимости.
На региональном уровне войны и конфликты стимулируют изменение экономических связей и перераспределение сфер влияния. Раздел территорий, санкции и эмбарго, а также смена политических режимов ведут к перестройке торговых маршрутов и перераспределению рынков. Так, распад колониальных империй после Второй мировой войны привёл к созданию независимых государств, которые начали строить собственные экономические системы, основываясь на национальных интересах. Это также дало толчок развитию движений за экономическую интеграцию, таких как Европейский Союз, где уроки прошлого конфликта были использованы для создания устойчивой мирной кооперации.
Современные технологии играют важную роль в изменении характера военных конфликтов и их экономических последствий. Искусственный интеллект, кибероружие и беспилотные системы делают войны менее зависимыми от традиционных ресурсов, таких как физическая инфраструктура или массовая мобилизация. Это, в свою очередь, меняет способы экономической мобилизации: акцент смещается на знания, данные и инновации. Такие трансформации создают основу для перехода к более технологически интегрированным экономическим системам, где войны уже не разрушительны в традиционном смысле, но остаются фактором глобальной перестройки.
С учётом эволюции капитализма роль войн и конфликтов в экономике может измениться. Вместо разрушения в виде войн конфликты могут стать катализаторами более глубоких интеграционных процессов и ускоренной адаптации систем. В условиях, где нейронные сети и глубокое обучение позволяют прогнозировать и минимизировать последствия кризисов, война может перестать быть необходимым элементом эволюции, уступая место мирным технологическим конкуренциям как основному двигателю экономических изменений.
Предыдущий пост: Социальные преобразования как катализатор экономической эволюции
Продолжение: Революции и технологические прорывы: импульсы для изменений
Этот пост входит в Часть 4. Влияние внешней среды на экономические системы
Рассмотрение влияния климатических, политических и социальных факторов на эволюцию экономических систем. Роль войн, революций и технологических прорывов в изменении их структуры.
Пациентка послана ко мне терапевтом с подозрением на онко:
- Доктор, я какая-то сонная в последнее время, просто жуть
- Давно?
- Около месяца
- Что-то в вашей жизни за этот месяц поменялось?
- Да вроде нет
- Что пьете из лекарств?
- Мне вот невролог антидепрессант назначил. Но это уже где-то год
- Понятно. Доза не менялась? Фирма лекарства?
- Нет.
- Что-то ещё пьете?
- Ну иногда настойку косточки авокадо. Для суставов
- Настойка на спирту?
- Разумеется на спирту. Какие ещё могут быть настойки?
- Вам говорили, что нельзя алкоголь с антидепрессантами пить?
- Так это ж не алкоголь, доктор. Это настоечка, для суставов
Социальные преобразования оказывают мощное воздействие на экономические системы, выступая катализатором их адаптации и эволюции. Изменения в структуре общества, такие как урбанизация, рост среднего класса, изменения в уровне образования и миграционные процессы, приводят к трансформации спроса и предложения, модифицируя экономические приоритеты и стимулируя развитие новых отраслей. Например, рост урбанизированного населения увеличивает потребность в услугах, таких как транспорт, образование и здравоохранение, одновременно повышая значимость технологических решений для оптимизации этих сфер. В свою очередь, увеличение доступности образования расширяет базу квалифицированных специалистов, что позволяет экономике переходить к более сложным моделям производства, основанным на инновациях и знаниях.
Одним из ключевых аспектов является трансформация ролей внутри общества, особенно в контексте гендерного равенства. Включение женщин в рабочую силу не только увеличивает общий экономический потенциал, но и стимулирует изменения в структуре рынка труда. Такие преобразования ведут к росту спроса на услуги, которые обеспечивают баланс между работой и семьёй, включая дошкольное образование и гибкие графики труда. Этим изменениям сопутствует перестройка социальных институтов и развитие новых форм социальной защиты, которые необходимы для поддержки таких трансформаций.
Миграционные процессы, как внутренние, так и международные, также играют важную роль в перестройке экономических систем. Перемещение значительных групп населения приводит к изменению демографической структуры, что влияет на распределение ресурсов, налоговую политику и стратегию развития инфраструктуры. В странах-реципиентах мигранты могут восполнять дефицит рабочей силы в ключевых секторах, таких как строительство, сельское хозяйство или здравоохранение, но при этом вызывают напряжение в социально-экономических системах, если адаптационные механизмы недостаточно развиты.
Эти процессы усиливаются развитием технологий, которые позволяют быстрее реагировать на социальные изменения. Нейронные сети и алгоритмы глубокого обучения уже сегодня используются для анализа больших массивов данных, чтобы предсказывать изменения в структуре населения, моделировать их влияние на рынок труда и разрабатывать эффективные стратегии адаптации. Например, прогнозирование миграционных потоков позволяет государствам заранее планировать инфраструктурные и социальные изменения, а анализ тенденций образования помогает скорректировать программы профессиональной подготовки.
Социальные преобразования представляют собой не только вызов для экономических систем, но и возможность для их обновления и повышения устойчивости. В условиях эволюции капитализма к более плановой и технологически интегрированной модели, где ключевую роль играют искусственный интеллект и справедливое распределение ресурсов, такие преобразования становятся важнейшими точками роста и адаптации. Это создаёт фундамент для перехода к экономике, основанной на высокоэффективном прогнозировании и удовлетворении потребностей общества, где социальные изменения рассматриваются как неотъемлемая часть стратегического планирования.
Продолжение: Роль войн и конфликтов в трансформации экономических отношений
Этот пост входит в Часть 4. Влияние внешней среды на экономические системы
Рассмотрение влияния климатических, политических и социальных факторов на эволюцию экономических систем. Роль войн, революций и технологических прорывов в изменении их структуры.
https://rutube.ru/shorts/8869f66e5f6e2c4bcacdf825066e917b/
Что происходит?
Два Линчела, один шкаф и очень недовольный взгляд... Кто из них настоящий? И почему у одного дергается глаз?
Как думаешь, кто из них настоящий? Пиши в комментариях!
Политические факторы играют ключевую роль в формировании структуры экономических систем, оказывая влияние как на макроэкономические, так и на микроэкономические процессы. Политическая стабильность или её отсутствие определяет степень доверия к институтам власти, что влияет на внутренние и внешние инвестиции, развитие предпринимательства и долгосрочное планирование. В условиях стабильных политических систем, где законы последовательно исполняются, создаются условия для экономического роста через защиту прав собственности, упрощение бюрократических процедур и поддержку инноваций. Примером может служить переход стран Западной Европы к либеральным экономическим моделям после Второй мировой войны, когда чёткие правила игры позволили привлечь значительные инвестиции и модернизировать промышленность.
С другой стороны, авторитарные политические режимы склонны к созданию централизованных экономических систем, которые концентрируют ресурсы в руках государства. Такой подход может приводить к ускоренной индустриализации и мобилизации ресурсов, как это наблюдалось в СССР или Китае в период их индустриального развития. Однако чрезмерная централизованность часто подавляет инициативу, что ограничивает гибкость системы в условиях внешних вызовов, таких как глобальные экономические кризисы или технологические изменения. Примеры успешных трансформаций встречаются, когда государства постепенно либерализуют экономику, сохраняя при этом значительное влияние, как это произошло в Китае после реформ Дэн Сяопина.
Влияние политической идеологии на экономические системы также велико. Например, неолиберальные концепции, активно внедряемые в 1980-1990-х годах, способствовали глобализации и дерегуляции рынков, что привело к ускорению экономического роста в ряде стран, но одновременно усилило неравенство. Социалистические подходы, напротив, сосредоточены на перераспределении богатства через налоги и социальные программы, что снижает неравенство, но иногда сдерживает темпы экономического роста. Современные гибридные модели, такие как в Скандинавских странах, стремятся сочетать рыночную эффективность с социальным равенством.
Текущие глобальные тренды показывают, что политические факторы всё чаще взаимодействуют с технологиями, влияя на динамику экономических систем. Распространение искусственного интеллекта и цифровых технологий создаёт новые инструменты для управления экономикой, повышая её предсказуемость и адаптивность. Политические режимы, которые активно используют эти технологии для прогноза экономических рисков, оптимизации налоговых систем и управления социальной поддержкой, демонстрируют высокую устойчивость к внешним шокам. В условиях эволюции капитализма к рыночному социализму, кооперативизму или технологическому коммунизму политическая система может стать ключевым драйвером координации ресурсов и адаптации экономики к новой реальности, где главную роль играют знания, технологии и справедливое распределение ресурсов.
Продолжение: Социальные преобразования как катализатор экономической эволюции
Этот пост входит в Часть 4. Влияние внешней среды на экономические системы
Рассмотрение влияния климатических, политических и социальных факторов на эволюцию экономических систем. Роль войн, революций и технологических прорывов в изменении их структуры.
Веду прием в обычной поликлинике. Во время беседы с другим пациентом в кабинет залетает мужчина:
- Вы мне дали не все направления!
- Здравствуйте, вы записаны?
- Я у вас был неделю назад
- На сегодня вы записаны?
- Мне анализы нужны. Я после вашего приема пошел в онкоцентр, там написали анализы перед операцией. Почему вы мне не дали все эти направления сразу?
- Вы были в онкоцентре до или после меня?
- После
- А как я могу предсказать, что вам там назначат в будущем?
- Мне нужны анализы!
- Подождите, будет просвет между талонами и приму
Убежал к заведующим. Вернулся. Подождал минут 30, получил направления.
Сегодня вспомним старую стрелялку, обогнавшую своё время и ставшую Modern Warfare за 4 года до самой Modern Warfare.
В начале нулевых жанр военных шутеров в современном виде ещё не сложился. Тогда в принципе большинство шутеров были классическими мясными FPS (сегодня мы называем их бумер-шутерами), а вся милитари-тематика по большей части была представлена тактическими симуляторами, вроде Rainbow Six или Spec Ops (The Line, если что, 11 в серии).
И вот в 2003 году выходят сразу два значимых для жанра проекта - Call of Duty и Delta Force: Black Hawk Down (далее по тексту - BHD). Речь пойдёт о втором.
Немного контекста: Black Hawk Down стала пятой игрой в серии. Первые три части были типичными для того времени тактическими симуляторами, отличавшимися разве что большими картами, а четвёртая (Urban Warfare) стала экспериментом по превращению серьёзной тактики во что-то сюжетное.
А вот BHD стала развитием этой идеи и сохранила лишь часть старых механик, став предтечей современных постановочных милитари-шутеров. Но об этом ниже.
Игра основана на книге Марка Боудена "Падение чёрного ястреба - История современной войны". Она же легла в основу и фильма Ридли Скотта "Падение чёрного ястреба", но, вопреки некоторым заблуждениям, объект сегодняшней статьи не является адаптацией киноленты.
И так мы плавно переходим к сюжету, ведь тут его, вроде бы, меньше, чем в картине Скотта, но вот событий заметно больше. Фильм охватывал только битву в Могадишо и делал упор на сюжет и персонажей, тогда как игра показывает более масштабную и мрачную картину войны.
Действие происходит в 1993 году в Сомали. Попадаем мы туда, сопровождая колонну гуманитарной помощи где-то далеко от столицы, а дальше принимаем участие в разных миссиях. И склады с оружием будем уничтожать, и мосты взрывать, и даже корабль один утопим. Но всё же рано или поздно нас заносит в Могадишо — и именно там начинаются основные приключения. Это примерно последняя треть компании. В финале нас даже ждёт немного альтернативной истории, но это уже спойлер.
Сюжет доносится через радио-переговоры и брифинги. Ну как брифинги - на экране загрузке мы видим столы с бумажками, где написана обстановка и условия предстоящей операции. А вот как таковых персонажей нет, мы выступаем в роли безымянной болванки и бегаем среди таких же молчаливых сослуживцев. Даже фамилий над головами не пишут, как принято сегодня. Но оно и не нужно, ведь мы здесь ради игрового процесса.
BHD была переходной стадией между чисто тактическими предыдущими частями и ещё не вышедшими на тот момент Modern Warfare. Нормальных (в современном понимании) катсцен тогда ещё не было, но какая-никакая постановка присутствовала: то и дело летали заскриптованные вертолёты, катались автоколонны, набигали орды врагов. По современным меркам это не просто норма, это база базовая, потому как все шутеры сегодня завязаны на скриптах, но в 2004 это было очень свежо и круто. При этом само построение уровней было классическим, когда они практически не были ограничены невидимыми стенами и завалами: вы могли в любой момент вернуться хоть в самое начало миссии.
Из классических геймплейных механик были: ручные (ограниченные) сохранения, выбор оружия перед уровнем и невозможность забирать его у поверженных врагов, лечение аптечками, подбирание коробок с патронами как в девяностых, ну и конечно же возможность управлять отрядом солдат. Да, за нами почти всегда ходит группа из 3-4 бойцов. Можно вообще забить на них и не обращать внимание, а можно отдавать команды.
Ещё есть мирные жители. Много мирных жителей. Битвы в большинстве случае происходят прямо на улицах городов и нужно постараться, чтобы случайно не цеплять бегающих под ногами гражданских во время перестрелок. Игра даже предусматривает допустимые потери среди гражданских на каждую операцию.
Стоит ещё отметить, что настроение миссий отличается в трёх компаниях. Основная сомалийская, это экшен с кучей взрывов и тысячами врагов на каждом уровне; колумбийская напротив делает ставку на стелс. Исключение иранская компания, там есть и стелс миссии (вроде той самой на нефтяной вышке), и экшен (вроде эпической битвы в пустыне с отстрелом шахидов).
Ах да, тут есть две дополнительные компании. Они вышли в 2004 году в рамках дополнения "Team Sabre". В одной мы боремся с наркокартелями в Колумбии, в другой свергаем мятежного генерала в Иране. Сегодня BHD уже не воспринимается отдельно от этого DLC.
Был тут и мультиплеер — на 32 игрока, с классическими режимами вроде захвата флага и удержания точки. Карты, как и в сингле, напоминали реальные городские кварталы, а бои часто превращались в хаотичную стрельбу с обстрелами из окон, переулков и крыш. Это был ещё не Battlefield, но уже что-то большее, чем просто deathmatch на складе контейнеров.
Графика по меркам 2003 года была не самой плохой, даже на фоне вышедшей в тот же год первой COD. Была и своя уникальная атмосфера: блеклые цвета, выжженные солнцем улицы, плотная застройка, откуда в любой момент могут выбежать парни с АК-47. Пыль висит в воздухе, вертолёты ревут над головой — всё это создаёт ощущение участия в реальной операции, а не в перестрелке из боевика. Особенно дополняла атмосферу проработка локаций: когда мы летим по пустыне на вертолёте и посреди бесконечного ничего видим деревню в пару улиц и приземляемся её зачищать. Ощущается намного лучше, чем глянцевые разрушающиеся мегаполисы.
Звук тоже играл роль: треск автоматов, рёв вертолётов, вопли по рации — всё это создаёт ощущение настоящего хаоса. Музыка использовалась сдержанно, чтобы не мешать напряжению. Но отдельно нужно упомянуть основную звуковую тему, играющую в меню, шедевральна до сих пор.
Стоит сказать пару слов о том, как сложилась судьба у серии после этой части. Novalogic несколько лет работали над шестой частью - Delta Force: Angel Falls, рассказывающей о войне в Южной Америке. Параллельно были выпущены спин-оффы: "Joint Operations: Typhoon Rising" и "Joint Operations: Escalation". Они были сконцентрированы на мультиплеере и прославились тем, что стали одними из самых масштабных мультиплеерных шутеров в истории. А ещё были выпущены "Delta Force: Xtreme" и "Delta Force: Xtreme 2". Первый был ремейком первой части с добавлением целой кучи механик и переносом на актуальный движок, а вторая уже могла похвастаться оригинальным сюжетом.
И вот тут случилась проблема, потому что вторая Xtreme провалилась с таким треском, что Novalogic обанкротилась и закрыла отдел разработки. Соответственно Angel Falls отменили, а права на серию повисли в воздухе и спустя много лет отошли китайцам из Tencent. В 2024 году ими был выпущен фритуплейный онлайн-перезапуск серии в футуристичном сеттинге. Но и про старых фанатов не забыли. В начале 2025 для этого перезапуска вышла кооперативная сюжетная компания "Чёрный ястреб", рассказывающая про войну в Сомали. По сути - ремейк BHD, но с оговорками.
К сожалению, мы уже не увидим возвращение Delta Force в том виде, в котором она была тогда. Novalogic не стали вкладываться во франшизу так, как это сделали Activision, включив конвейер и задействовав несколько студий. А могли бы тоже выпускать по одной части в год, понемногу дорабатывая движок и была бы у нас сегодня уже 27 часть Delta Force, а так ограничилось всё дополнением и неудачной дилогией Xtreme. Что иронично — китайцы из Tencent сделали для продвижения бренда Delta Force больше, чем американцы из Novalogic, особенно среди молодой аудитории.
А ещё в 2025 году вышел Dagger Directive - духовный наследник оригинальных Delta Force, сделанный одним человеком. Понравится тем, кому захотелось понастальгировать.
До Modern Warfare было ещё четыре года. До Battlefield 2 — два. Даже первая Ghost Recon выглядела тогда менее кинематографично. Играть в Black Hawk Down сегодня — это как заглянуть в прошлое военных шутеров, до того, как всё превратилось в цирк под названием Call of Duty (относительно исправившийся в последние годы) и тотального упора на донатно-лутбоксный онлайн. Это простой боевик с серьёзной темой, в котором война ощущается не как аттракцион, а как задача: выжить и выполнить приказ. Да, графика устарела, механики местами угловаты, но дух настоящей военной игры здесь жив до сих пор.
Вот как вы запоминаете других людей? Я, к примеру, всегда цепляюсь за мелкие детали (интересная шляпка, собачка, какая-то фраза) или строю ассоциации, начисто забывая фамилию пациента. И была одна история, когда я поняла, что не одинока в своем подходе.
Околоковидное время, я параллельно с другим врачом катаюсь по вызовам, но практически не попадаю на свой участок, чаще "моих" пациентов видит коллега. Очередной вызов "кашель, температура". Доктор расспросила пациента и его семью относительно жалоб, всех осмотрела, пишет назначения и попутно продолжает беседу:
- А вы давно в поликлинике вообще были?
- Нет. А что?
- Участкового своего знаете?
- Да у нас хохлушка молодая сейчас.
И вроде рядовая ситуация, но так совпало, что у самих людей фамилия Хохловы (чуток изменено). Считай, родственные души
Захотел собрать CarPC в Opel Astra H. Родной монохромный экран убрать нельзя, так как он является шлюзом между разными CAN-шинами и на него выводится много полезной информации. Оставлять второй экран в авто тоже не хочу. Потому буду парсить данные с шины экрана и выводить через композитный видеовыход, используя FPGA.
Предыстория
Более 10 лет назад, когда было много свободного времени и чесались руки, я, вдохновившись чужими CarPC проектами, тоже собрал себе компьютер в машину (Москвич 214145). В то время подрабатывал системным администратором и мне стало очень удобно не таскать с собой каждый день ноутбук.
Размещение экрана было очень неудобным, но тогда не было такой доступной 3D печати и выкручивались как могли. На фото CarPC установлен в торпедо от Opel Vectra A.
Настоящее время
Шло время, все менялось и теперь у меня есть автомобиль Opel Astra H, больше знаний и опыта, но «дурная голова рукам покоя не дает» и я решил снова собрать CarPC.
Цель всего проекта не CarPC, как результат, а самообразование. На рынке много готовых решений, которые будут дешевле. Я лишь делюсь описанием небольшого этапа.
Консоль
Следующим образом выглядит торпедо в автомобиле Opel Astra H
Штатный монохромный графический экран имеет удобное местоположение на торпедо, можно его убрать, распечатать переходную рамку под новую матрицу, но есть большое НО: штатный экран (у меня это трехстрочный монохромный графический экран, именуемый как GID) является шлюзом между разными CAN-шинами. Если его отключить, то не будет работать климатическая система.
Умельцы переносят этот экран в потолок. Печатают рамку на центральную часть магнитолы и переносят туда, но все это требует доработки штатной проводки, либо создание удлинителей. Мне кажется, что два экрана в авто – это перебор.
Можно спрятать GID за торпедо, но на него выводится много полезной информации и не хочется ее терять.
В 2020 году купил подходящую матрицу экрана и плату конвертера на контроллере RTD2662. Напечатал рамку, примерил и на этом мои силы кончились, так как ушли в домашний ремонт.
Прошло 5 лет, я снова вернулся к этому увлекательному проекту. Но пора заканчивать эту небольшую лирику и переходить к сути
Ломаем GID
Я решил и GID спрятать и информацию с него получать.
Можно ловить CAN-пакеты. Благодаря замечательному сообществу, именуемому как «Astra H CAN хакеры», декодировано и разобрано на биты огромное количество пакетов и параметров, которые в них содержатся.
Но я решил пойти другим путем: буду ловить данные, которые идут непосредственно на матрицу экрана. Таким образом плата от GID останется на родном месте.
Чтобы случайно не сломать мой экран, приобрел такой-же на разборке. Чтобы он включился на столе – необходима магнитола и соединить их по CAN шине. В таком случае экран включается при включении магнитолы.
Матрица экрана с кодовым названием 80509CN выглядит следующим образом:
Что примечательно – у нее два шлейфа. Ранее мне такие не попадались. По всевозможным номерам, которые есть на матрице – не ищется никакой документации. Значит буду проводить обратную разработку.
Матрица подключается к основной плате GID-а.
Осмотрев плату, стало понятно, что слоев в ней больше, чем два, так как некоторые переходные отверстия от сигнальных дорожек с одной стороны платы, никуда не подключены на обратной стороне.
Установлен микроконтроллер NEC v850eca2. Пролистав документацию, не увидел специализированного контроллера для экрана. Скорее всего экран сидит или на внешней шине данных, или на GPIO.
Не стал реверсить схему подключения экрана к микроконтроллеру, а решил пробежать по выводам. Внешне похоже, что оба разъема экрана имеют одинаковую распиновку. Прозвонил выводы двух разъемов на взаимное соединение, отметил КРАСНЫМ – линии, которые попарно соединены, а ЖЕЛТЫМ – которые у каждого разъема индивидуальны.
И действительно, большее число выводов подключено параллельно.
Случайно наткнулся в интернете на информацию, что если перевернуть экран на 180 градусов и подключить, то он тоже будет работать (внутри корпуса есть выступы, препятствующие этому, но один человек отколол часть матрицы и у него перестала работать нижняя половина, на которой наибольшее количество важной информации. Он удалил ограничители и перевернул экран)
Получается, что внутри экрана ДВА одинаковых контроллера. Что сильно облегчает дальнейшую работу.
Далее я взял осциллограф и начал смотреть, как себя ведут разные линии.
На фотографии ниже сделал отметки: если напряжение стабильное, то указал уровень. Сигнал положительной полярности (преобладает низкий уровень), то отметил как «p», сигнал отрицательной полярности (преобладает высокий уровень), то отметил как «n», если идет постоянный меандр, то указал частоту и заполнение. Цифровые сигналы имеют лог. Уровень 5в.
Из этой картины явно выделяется шина данных на 8 бит и сигналы выбора верхнего/нижнего контроллера (единственный сигнальный вывод на разъеме, который не объединен).
Подключил логический анализатор DSLogic, начал смотреть обмен на шине.
Сняв лог с выборкой 10ns в течение 1с, начал его просматривать и обнаружил интересные данные
Битовые данные на 8-битной шине повторяют надпись, которая отображается на экране.
Также увидел сигналы выбора верхнего/нижнего контроллера (на картинке - зеленым)
Сигнал отрицательной полярности, скорее всего – nWE, по его спаду (заднему фронту) контроллер защелкивает данные (на картинке - красным)
Далее по диаграмме нашел место, где начинается выборка нижнего контроллера.
После перехода должны идти команды. И действительно, последняя неизвестная линия – является сигналом выбора данные/команда. На картинке – оранжевым.
Подсчитал разрешение матрицы
Получилось, что GID у Astra H имеет разрешение 218х138 точек.
Анализируем полученные данные
Небольшая часть работы с паяльником уже проделана.
Предполагаю, что матрица экрана изготовлена под заказ GM, но стоит ли внутри известный контроллер или какой-то свой? Что ж, в этот момент я надеялся, что если контроллер и проприетарный, то писался с взглядом на существующие.
За полный цикл выдачи данных на одну верхнюю половину экрана, происходят 8 посылок следующего содержания: 3 байта команд и 208 байт данных.
Рассмотрим эти 3 байта команд. На картинке начало 4х посылок
В них последовательно инкрементируется единичка в первом командном слове. Таким образом становятся понятны MSB и LSB шины данных.
Полученная распиновка экрана на картинке:
Но вернемся к нашим четырем посылкам. Как же удобны цифровые анализаторы с программными декодерами.
Но посмотрим не только их, а все команды
8 команд перед посылками для верхней половины экрана:
[0xB0, 0x10, 0x05]
[0xB1, 0x10, 0x05]
[0xB2, 0x10, 0x05]
[0xB3, 0x10, 0x05]
[0xB4, 0x10, 0x05]
[0xB5, 0x10, 0x05]
[0xB6, 0x10, 0x05]
[0xB7, 0x10, 0x05]
8 команд перед посылками для нижней половины экрана:
[0xB0, 0x12, 0x05]
[0xB1, 0x12, 0x05]
[0xB2, 0x12, 0x05]
[0xB3, 0x12, 0x05]
[0xB4, 0x12, 0x05]
[0xB5, 0x12, 0x05]
[0xB6, 0x12, 0x05]
[0xB7, 0x12, 0x05]
Ширина экрана 218, но данных приходит только на 208. Но и на экране слева и справа отступы по 5 пикселей. Скорее всего 3-й байт данных – номер столбца, а младшие 4 бита в первом байте команды – номер «строки». Почему в кавычках – данные выдаются сразу на 8 строк. Получается, что это больше указатель на сектор строк.
После вышеуказанных 16 больших команд с данными приходит «дозаполнение» пустых ячеек.
Тут видно, что половины экрана «независимы». Приходят команды для каждой половинки, а затем данные идут сразу на две половинки.
Предположу, что внутри основного микроконтроллера NEC v850eca2 буфер видеокадра рассчитан на 208x128 точек, так как некоторые строки и столбцы прячутся за рамку экрана.
После полного заполнения «видимой части экрана», «дозаполнение» приходит на все оставшиеся пиксели (в том числе обрезки строк, шириной по 5 пикселей).
Экран обновляется раз в секунду.
Помимо буфера обновления экрана – иногда по шине приходят команды конфигурации экрана.
Из всех вышеперечисленных данных я нашел наиболее подходящий, по командам и описанию, контроллер - ST7565, только в моем случае – разрешение экрана побольше.
Но не все команды удалось найти в описании. Вот пример конфигурации экрана:
В машине, в настройках экрана можно включать инверсию. Теперь я понял, что передача буфера данных на экран не меняется – меняется только конфигурация для включения инверсии.
Пишем программный декодер
В целом, собранных данных достаточно, чтобы написать примитивный декодер. Его я буду писать на C# и выводить графику.
Для декодирования буду использовать собранный логическим анализатором дамп.
Выгружу его в формат csv и буду читать из файла.
Алгоритм работы программы, следующий:
С делал PictureBox размером 872x512 пикселей – в 4 раза больше, чем реальное разрешение экрана, буду выводить точки размером 4х4 (чтобы было не мелко). Сам видеобуфер размером 218x16 байт.
В обработчике PictureBox_Paint() буду отрисовывать данные из видеобуфера.
В основном цикле программы я пробегаю по всем строкам входного файла, разбираю значения, храню прошлое состояние nWE. Ищу спад (задний фронт), т.е. если старое значение 1, а новое 0, то выполняю действие.
Завел две глобальные переменные на номер строки и столбца.
Дополнительно у меня есть флаг валидности данных.
Фильтрую первую пришедшую команду по маске 0xF8. Если команда по маске 0xB0, беру из нее номер строки по маске 0x07. Если при этом выбрана верхняя часть экрана, то в номер строки пишу этот номер, если выбрана нижняя, то этот номер + 8. Следующие две команды – вспомогательные. Вторую не обрабатываю, из третьей беру номер столбца. Если эти три команды прошли, то поднимаю флаг валидности данных, что следующие данные можно писать в буфер. Каждая запись инкрементирует номер столбца.
Если в первую пришедшую команду по маске 0xF8 пришла команда отличная от 0xB0, то снимаю флаг валидности данных.
На картинке результат работы программного декодера.
Пишем аппаратный декодер
Для аппаратного декодера я использовал ПЛИС altera cyclone iv ep4ce10. У меня как раз лежит одна с выгоревшим jtag портом, но без проблем считывает конфигурацию с SPI флеш-памяти. У нее на борту есть аппаратные блоки двухпортовой SRAM-памяти. Это очень полезно, так как чтение и запись будут производиться разными модулями.
Так как уровни логических сигналов GID 5в, а у моей ПЛИС 3.3в, были использованы микросхемы для согласования уровней. У них есть сигнал OE. Его подключил к выходу ПЛИС, где генерирую постоянную лог «1». ПЛИС запускается не сразу, а сначала считывает конфигурацию. Чтобы в этот момент не было конфликтов (согласователи с автоматическим определением направления) – решил сделать так.
Для аппаратного декодера перенес с небольшими изменениями мою программную реализацию. Никаких оптимизаций, просто чтобы работало.
module decoder(
input clk,
input [7:0] data,
input nWE,
input DC,
input CS_up,
input CS_down,
output [12:0] mem_address,
output [7:0] mem_data,
output mem_we,
output mem_clk
);
reg [1:0] cmd_pos = 2'd0;
reg decoder_mem_we = 1'b0;
reg [7:0] col_adr = 8'h00;
reg [3:0] row_adr = 4'h0;
reg reg_mem_clk = 0;
reg mem_clk_cnt = 0;
always @(posedge nWE) begin
if(DC == 1'b0) begin
if(cmd_pos == 2'd0) begin
if((data & 8'hF8) == 8'hB0) begin
if(CS_up) begin
row_adr <= data & 8'h0F;
col_adr <= 0;
end else if(CS_down) begin
row_adr <= (data & 8'h0F) + 8'd8;
col_adr <= 0;
end
cmd_pos <= 1;
end
decoder_mem_we <= 1'b0;
end else if(cmd_pos == 2'd1) begin
col_adr <= col_adr | (data & 8'h01)<<4;
cmd_pos <= 2'd2;
end else if(cmd_pos == 2'd2) begin
col_adr <= col_adr | (data & 8'h0F);
cmd_pos <= 2'd0;
decoder_mem_we <= 1'b1;
end
end
if(decoder_mem_we & DC) begin
col_adr <= col_adr + 1;
end
end
assign mem_we = decoder_mem_we & DC & ~nWE;
assign mem_address = {row_adr[3:0], col_adr[7:0]};
assign mem_data = data;
always @(posedge clk)begin
if(~nWE) begin
if(~mem_clk_cnt) begin
if(~reg_mem_clk)begin
reg_mem_clk <= 1'b1;
end else begin
reg_mem_clk <= 1'b0;
mem_clk_cnt <= 1'b1;
end
end
end else begin
reg_mem_clk <= 1'b0;
mem_clk_cnt <= 1'b0;
end
end
assign mem_clk = reg_mem_clk;
endmodule
Код синтезировался и даже работает
Для отладки выводил данные, которые пишутся в SRAM на внешние выводы, но потом понял, что сразу в железе отладить не получится и придется писать тестбенч.
Взял добрый уютный iverilog. Очень мало времени работаю с ПЛИС, не знаю многих подходов, потому вместо чтения csv файла средствами iverilog – в моем программном декодере написал конвертер входных данных в строки для тестбенча (да закидают меня тапками, сейчас я уже знаю как правильно, но на тот момент это было быстрое рабочее решение)
Получил строки вида:
И с головой ушел в моделирование
В результате – модуль декодера стучится в SRAM, генерирует необходимые сигналы: адрес, данные, разрешение записи и clk для защелкивания.
Пишем аппаратный вывод данных
Вывод данных должен быть универсальным. В том числе, чтобы в машину (кто еще не потерял нить рассуждений и дочитал до этого момента, я же делаю все это для машины) можно было поставить китайскую магнитолу, а ее экран перенести наверх (если я не доберусь до постройки CarPC). Обычно у магнитол из доступных разъемов – только CVBS, а у используемого мной контроллера экрана RTD2662 доступно до 4х аналоговых видеовходов, то его и будем использовать.
Для аналогового вывода использовал 8-битный DAC R2R (но на каждый выход использовал 2 порта ввода-вывода, чтобы повысить ток. В общей сложности использовал 16 портов), а сигнал синхронизации - суммировал к текущему уровню.
Одна статья с хабра очень помогла быстро запустить CVBS и написать его заново под свои нужды.
Начал разбираться и заметил особенность. Что в моей реализации, что в реализации из статьи: если попытаться передать чередующиеся строки белая-черная-белая, то экран вместо строк начинает мерцать. Если 2 строки белые – 2 черные – 2 белые, то все ОК, но разрешение падает в 2 раза (мне не критично, т.к. мне нужно вообще 128 строк).
Под рукой всегда держал шпаргалку:
Затем сделал некоторые свои тесты с нужным разрешением экрана
Таким получился мой модуль вывода Monochrome Composite Video
module PAL(
input clk,
output [15:0]mem_address,
input mem_data,
output mem_clk,
output [7:0]video_out
);
wire sync;
reg frame = 0;
wire [7:0]video_in;
assign video_in = (mem_data) ? BRIGHT : 8'd0; //test
wire [7:0]video;
assign video = (frame) ? video_in : 8'd0;
assign video_out = (sync) ? (video + 8'd25) : 8'd0;
localparam BRIGHT = 8'h80;
localparam BROAD_SYNC_SECTION1 = 5'd0; //5
localparam SHORT_SYNC_SECTION1 = 5'd1; //5
localparam EMPTY_LINE1 = 5'd3; //18
localparam FULL_LINE1 = 5'd4; //287
localparam SHORT_SYNC_SECTION2 = 5'd5; //5
localparam BROAD_SYNC_SECTION2 = 5'd6; //5
localparam SHORT_SYNC_SECTION3 = 5'd7; //5
localparam EMPTY_SYNC_SECTION = 5'd8; //1
localparam EMPTY_LINE2 = 5'd10; //17
localparam FULL_LINE2 = 5'd11; //287
localparam SHORT_LINE = 5'd12; //1
localparam SHORT_SYNC_SECTION4 = 5'd13; //5
localparam X_END_HALF_LINE = 12'd1600;
localparam X_END_FULL_LINE = 12'd3200;
localparam IMAGE_START_CLK = 12'd573;//12'd520;
localparam IMAGE_STOP_CLK = 12'd2971;//12'd2923; 2644-900 = 8clk/1px
reg [12:0]x_end_counter = 12'd0;
reg [12:0]y_end_counter = 12'd0;
reg [12:0]sync_start_counter = 12'd0;
reg [12:0]x_clk_count = 12'd0;
reg [12:0]y_clk_count = 12'd0;
reg [5:0] current_state = 6'h00;
reg [5:0] next_state = 6'h00;
reg [8:0] count_states_max = 9'h000;
reg [12:0]image_clk_count = 12'd0;
reg [9:0]x_pos = 10'h000;
reg [3:0]x_tmp_pos = 4'd0;
//assign x_pos[9:0] = image_clk_count[12:3];
wire [12:0]y_tmp_clk_count;
assign y_tmp_clk_count = y_clk_count - 16;
wire [9:0]y_pos;
assign y_pos[9:0] = y_tmp_clk_count[10:1];
always @(posedge clk) begin
if(x_clk_count >= x_end_counter - 1) begin
frame <= 0;
x_clk_count <= 12'd0;
image_clk_count <= 12'd0;
x_pos <= 10'd0;
if(y_clk_count >= y_end_counter - 1) begin
current_state <= next_state;
y_clk_count <= 12'd0;
end else begin
y_clk_count <= y_clk_count + 1;
end
end else begin
x_clk_count <= x_clk_count + 1;
if(x_clk_count >= IMAGE_START_CLK && x_clk_count < IMAGE_STOP_CLK && (current_state == FULL_LINE1 || current_state == FULL_LINE2))begin
if(y_clk_count >= 16 && y_clk_count < 272) //16-271 ; 256/64 4line/1px
begin
frame <= 1;
end else begin
frame <= 0;
end
//if(image_clk_count )
if(x_tmp_pos == 4'd10)begin
x_tmp_pos <= 0;
x_pos <= x_pos + 1;
end else begin
x_tmp_pos <= x_tmp_pos + 1;
end
image_clk_count <= image_clk_count + 1;
end else begin
frame <= 0;
end
end
end
assign sync = (x_clk_count >= sync_start_counter) ? 1'b1 : 1'b0;
always @(*) begin
case (current_state)
BROAD_SYNC_SECTION1: begin //0 - 2.5
next_state = SHORT_SYNC_SECTION1;
x_end_counter = X_END_HALF_LINE;
y_end_counter = 12'd5;
sync_start_counter = 12'd1365;
end
SHORT_SYNC_SECTION1: begin //2.5 - 5
next_state = EMPTY_LINE1;
x_end_counter = X_END_HALF_LINE;
y_end_counter = 12'd5;
sync_start_counter = 12'd120;
end
EMPTY_LINE1: begin //7-23
next_state = FULL_LINE1;
x_end_counter = X_END_FULL_LINE;
y_end_counter = 12'd18;
sync_start_counter = 12'd235;
end
FULL_LINE1: begin //24-310
next_state = SHORT_SYNC_SECTION2;
x_end_counter = X_END_FULL_LINE;
y_end_counter = 12'd287;
sync_start_counter = 12'd235;
end
SHORT_SYNC_SECTION2: begin //311-312.5
next_state = BROAD_SYNC_SECTION2;
x_end_counter = X_END_HALF_LINE;
y_end_counter = 12'd5;
sync_start_counter = 12'd120;
end
BROAD_SYNC_SECTION2: begin //312.5-315
next_state = SHORT_SYNC_SECTION3;
x_end_counter = X_END_HALF_LINE;
y_end_counter = 12'd5;
sync_start_counter = 12'd1365;
end
SHORT_SYNC_SECTION3: begin //316-317.5
next_state = EMPTY_SYNC_SECTION;
x_end_counter = X_END_HALF_LINE;
y_end_counter = 12'd5;
sync_start_counter = 12'd120;
end
EMPTY_SYNC_SECTION: begin //317.5
next_state = EMPTY_LINE2;
x_end_counter = X_END_HALF_LINE;
y_end_counter = 12'd1;
sync_start_counter = 12'd0;
end
EMPTY_LINE2: begin
next_state = FULL_LINE2;
x_end_counter = X_END_FULL_LINE;
y_end_counter = 12'd17;
sync_start_counter = 12'd235;
end
FULL_LINE2: begin
next_state = SHORT_LINE;
x_end_counter = X_END_FULL_LINE;
y_end_counter = 12'd287;
sync_start_counter = 12'd235;
end
SHORT_LINE: begin
next_state = SHORT_SYNC_SECTION4;
x_end_counter = X_END_HALF_LINE;
y_end_counter = 12'd1;
sync_start_counter = 12'd235;
end
SHORT_SYNC_SECTION4: begin
next_state = BROAD_SYNC_SECTION1;
x_end_counter = X_END_HALF_LINE;
y_end_counter = 12'd5;
sync_start_counter = 12'd120;
end
endcase
end
assign mem_address[15:0] = {y_pos[6:3], x_pos[7:0], y_pos[2:0]};
assign mem_clk = clk & frame;
endmodule
Много лишнего, не оптимально, так что прошу строго не судить.
Модуль верхнего уровня и память
Память двухпортовая. Причем на вход она 8-битная, а на выход – 1-битная.
Отлаживать и моделировать пришлось долго, так как было много глупых ошибок, вроде такой:
Так как моделирую в iverilog, то накидал простую модель
module SRAM(
input [12:0] address_a,
input [7:0] data_a,
input clock_a,
input wren_a,
output [7:0] q_a,
input [15:0] address_b,
input [7:0] data_b,
input clock_b,
input wren_b,
output q_b
);
reg [7:0]mem[8191:0];
reg [7:0]r_q_a = 8'h00;
assign q_a = r_q_a;
reg r_q_b = 1'b0;
assign q_b = r_q_b;
always @(posedge clock_a) begin
r_q_a <= mem[address_a];
if(wren_a == 1'b1)begin
mem[address_a] <= data_a;
end
end
always @(posedge clock_b) begin
r_q_b <= mem[address_b[15:3]][address_b[2:0]];
if(wren_b == 1'b1)begin
mem[address_b] <= data_b;
end
end
endmodule
Вот как выглядит мой TOP-модуль
module GID(
input clk,
input [7:0]lcd_data,
input lcd_nWE,
input lcd_DC,
input lcd_CS_up,
input lcd_CS_down,
output [7:0]LED,
output driver_oe,
output [7:0]video_out,
output [7:0]video_out2
);
assign driver_oe = 1'b1;
wire [7:0]video;
assign video_out = video;
assign video_out2 = video;
wire [7:0] test_ledout;
assign test_ledout[7:0] = address_a[7:0];
assign LED = ~test_ledout;
wire [12:0] address_a;
wire [7:0] data_a;
wire wren_a;
wire mem_clk_a;
wire [15:0] address_b;
wire data_b;
wire mem_clk_b;
decoder decoder(
.clk ( clk ),
.data ( lcd_data ),
.nWE ( lcd_nWE ),
.DC ( lcd_DC ),
.CS_up ( lcd_CS_up ),
.CS_down ( lcd_CS_down ),
.mem_address ( address_a ),
.mem_data ( data_a ),
.mem_we ( wren_a ),
.mem_clk ( mem_clk_a )
);
SRAM SRAM(
.address_a ( address_a ),
.data_a ( data_a ),
.clock_a ( mem_clk_a ),
.wren_a ( wren_a ),
.q_a ( ),
.address_b ( address_b ),
.data_b ( ),
.clock_b ( mem_clk_b ),
.wren_b ( 1'b0 ),
.q_b ( data_b )
);
PAL PAL(
.clk ( clk ),
.mem_address ( address_b ),
.mem_data ( data_b ),
.mem_clk ( mem_clk_b ),
.video_out ( video )
);
endmodule
Схема в блоках выглядит даже не плохо, если не залезать внутрь
Результат
Ну и вот что мы имеем на выходе:
Понимаю, что все не очень оптимально, сделано на коленке за 3-4 вечера, но я очень доволен результатом и много чего полезного узнал.
Спасибо за внимание.
Работаю в поликлинике. Выдала пациентке список документов для МСЭ, обсуждаем список:
- Доктор, а тут в списке написано, что надо копию трудовой книжки
- Да, надо
- Это ее копировать?
- Да
- А заверять на работе надо?
- Вы где-то работаете?
- Нет
- Значит не надо
- Но копировать надо?
- Да
- Все страницы?
- Да
- А заверять?
- Если вы нигде не работаете, то нет
- А если работаю?
- То заверять в отделе кадров
- Но я нигде не работаю
- Значит не заверять
- Но копировать?
- Да
Сверху - переходник 1/2 на 3/4 нормального человека, снизу - переходник курильщика. Не табака. А если вы думаете, что "ну не было у парня переходника - сделал как есть", как мне сказали мои друзья-сантехники, то ни фига. Это на всём этаже так.
Не знаю, зачем вам эта информация. Но лично я негодую.
Добавлю ещё от своего товарища:
Среди сантехников бытует поверье, что если обмотаться льном в три оборота, то ты станешь бессмертным.
Спасибо за внимание :)
Вот вам за компанию заставка для рабочего стола. Сам фоткал.