Русский
Русский
English
Статистика
Реклама

Симуляторы

Индикатор искусственного горизонта на HTML5 canvas

28.11.2020 06:13:53 | Автор: admin
Ниже будет представлено воплощение средствами HTML5 одной из необычных идей по визуализации пространственного положения управляемого объекта. Код может использоваться в браузерных играх, имитирующих управление транспортным средством в трехмерном пространстве. Способ представления информации ориентирован на симуляторы субтеррин или других фантастических машин.



Назначение и область применения искусственного горизонта


Искусственный горизонт в рассматриваемом здесь узком смысле представляет собой визуализацию наклона объекта относительно местной вертикали, используемую для управления его движением. Наклон определяется значениями двух углов Эйлера, крена и тангажа. Авиационному термину тангаж моряки предпочитают синоним дифферент.

Родственные искусственному горизонту (но не вполне синонимичные) русскоязычные термины: авиагоризонт, пилотажно-командный прибор. В английском языке используются выражения attitude indicator, artificial horizon или gyro horizon.

Известные способы визуализации


Наибольшее количество работ по поиску удачных решений в области индикации тангажа и крена выполнено в интересах авиации. Этому есть простое объяснение: летчик должен считывать информацию быстро, а любая его ошибка в восприятии пространства грозит стать фатальной.

Большинство известных решений в области индикации крена и тангажа основано на использовании силуэта самолета и специального фона. Общие особенности:

  • фон разделен на две части, символизирующие небо и землю, линией, обозначающей горизонт;
  • силуэт самолета представляет собой упрощенный вид сзади, контрастирующий по цвету с фоном;
  • угол крена определяется по индикатору как угол между символической линией горизонта и линией, соединяющей законцовки крыла силуэта (обычно для точного считывания присутствует шкала отсчета);
  • угол тангажа отсчитывается вдоль шкалы, перпендикулярной условному горизонту по положению контрольной точки в центре силуэта.



Реализованные в массовом производстве системы имеют ряд общих решений:

  • информация задается взаимным расположением силуэта и фона;
  • изменение угла крена связано с угловым перемещением силуэта относительно фона;
  • изменение угла тангажа связано с линейным перемещением силуэта относительно фона.

Но нетрудно догадаться, что реализовать нужное относительное движение можно несколькими различными путями. После множества проб и ошибок прошлого века авиационная эволюция оставила два жизнеспособных сочетания:

1. Неподвижный силуэт, подвижный по крену и тангажу фон. Употребляемые названия: прямая индикация, вид с самолета на землю, реже эгоцентрическая индикация.



2. Подвижный только по крену силуэт, подвижный только по тангажу фон. Употребляемые названия: обратная индикация и вид с земли на самолет, реже геоцентрическая индикация.



Заметим, что названия п. 2 применяются к системе в целом, но отражают лишь принятый в ней принцип индикации угла крена. Индикация угла тангажа в обеих используемых системах является прямой и эгоцентрической.

В существующих авиационных симуляторах, например, в Microsoft Flight Simulator и Digital Combat Simulator, можно оценить в действии оба типа индикации.

Стоит отметить, что не все известные решения вписываются в приведенный выше шаблон. Для примера выхода за обозначенные рамки рассмотрим два патента на изобретения: RU 2561311 и RU 2331848.

Первый патент посвящен Авиагоризонту с разнесенными по высоте указателями крена и тангажа, его авторы: Путинцев В. И. и Литуев Н. А. Схема ниже взята из патента.



При необходимости можно найти расшифровку обозначений и описание работы в тексте первоисточника. В целом замысел изобретения довольно прост: идея вида с земли на самолет реализуется и по крену, и по тангажу (полный геоцентризм), но индикация разделяется на два самостоятельных компонента.

Второе изобретение имеет более сложное название: Командно-пилотажный прибор логической индикации положения и управления летательным аппаратом в пространстве. Авторы патента: Пленцов А. П. и Законова Н. А. Идея индикации тангажа и крена здесь весьма необычна.



Расшифровка обозначений схемы, описание прибора, сравнение с аналогами и дополнительные схемы с небольшими отличиями в оформлении приведены в патенте.

Есть одна общая черта с предыдущим изобретением концепция геоцентризма для обоих каналов. При этом авиагоризонт имеет только один символ самолета, как на существующих образцах, но это уже не силуэт, а трехмерная модель объемный макет. Если движение по крену получается похожим на реализованное в обратной индикации, то кабрирования и пикирования на этом приборе выглядят оригинально.



Существует ряд факторов, сдерживающих новаторство в проектировании реальных систем индикации. Например, одно из разумных оснований для консерватизма стремление к сохранению преемственности приобретенных оператором навыков, в том числе, навыков восприятия информации. Компьютерные игры могут позволить себе гораздо больше креатива, поэтому, не углубляясь в сравнительный анализ решений, возьмем за основу изобретение, выглядящее наиболее эффектным.

Требования к решению


Прежде чем приступить к написанию кода, определим задание:

1. Необходимо написать функцию drawAttitude(), рисующую средствами canvas индикатор искусственного горизонта на основе изобретения Пленцова А. П. и Законовой Н. А.

2. В качестве аргументов функция принимает контекст canvas, координаты центра индикатора, значения углов крена и тангажа в градусах, радиус лицевой части индикатора.

3. Значения угла тангажа ограничены интервалом от минус 30 до плюс 30 градусов.

4. Значения угла крена ограничены интервалом от минус 45 до плюс 45 градусов.

5. В случае выхода значения аргумента за указанные в пп. 4, 5 пределы индикатор показывает ближайшее разрешенное значение.

Создание функции


Код функции включает следующие части:

1. Проверка введенных значений на предмет выхода за ограничения.

2. Перевод значений углов в радианы.

3. Масштабирование характерного размера макета и шрифта по значению радиуса индикатора.

4. Рисование компонентов:
а) Корпус индикатора.
б) Макет.
в) Шкалы тангажа и крена.

Приведенная ниже функция написана именно в такой последовательности, а ее части разделены комментариями.

Полный код
Код файла index.html:

<!DOCTYPE html><html><head>  <title>Attitude</title>  <script src="js/attitude.js"></script></head><body>  <canvas id="drawingCanvas" width="640" height="480"></canvas></body></html>

Код файла attitude.js:

window.onload = function () {    let canvas = document.getElementById("drawingCanvas");    let context = canvas.getContext("2d");        let run = function () {        drawAttitude(context, 320, 240, 30 * Math.sin(performance.now() / 2000), 45 * Math.sin(performance.now() / 5000), 200);    }    let interval = setInterval(run, 1000 / 60);};drawAttitude = function (ctx, centreX, centreY, pitch, roll, radius = 100) {    //Проверка значений по ограничениям:    if (pitch > 30) pitch = 30;    if (pitch < -30) pitch = -30;    if (roll > 45) roll = 45;    if (roll < -45) roll = -45;    //перевод в радианы:    roll *= Math.PI / 180;    pitch *= Math.PI / 180;    //размер "макета" и шрифта:    let vehicleSize = radius * 0.8;    ctx.font = Math.round(radius / 8) + "px Arial";    //корпус индикатора и заливка фона:    ctx.lineWidth = 2;    ctx.strokeStyle = "Black";    //нижний полукруг:    ctx.beginPath();    ctx.arc(centreX, centreY, radius, 0, Math.PI, false);    ctx.fillStyle = "Maroon";    ctx.stroke();    ctx.fill();    //верхний полукруг:    ctx.beginPath();    ctx.arc(centreX, centreY, radius, 0, Math.PI, true);    ctx.fillStyle = "SkyBlue";    ctx.stroke();    ctx.fill();    //"макет":    ctx.beginPath();    //цвет:    let topSideIsVisible = (pitch >= 0);    ctx.strokeStyle = topSideIsVisible ? "Orange" : "Brown";    ctx.fillStyle = topSideIsVisible ? "Yellow" : "Red";    ctx.lineWidth = 3;    //контур    //проходит через 4 точки, начиная с задней центральной против часовой стрелки,    //если смотреть сверху:    ctx.moveTo(centreX, centreY - Math.sin(pitch) * vehicleSize / 2);    ctx.lineTo(centreX + vehicleSize * Math.cos(roll), centreY + vehicleSize * Math.sin(roll) * Math.cos(pitch));    ctx.lineTo(centreX, centreY - 2 * Math.sin(pitch) * vehicleSize);    ctx.lineTo(centreX - vehicleSize * Math.cos(roll), centreY - vehicleSize * Math.sin(roll) * Math.cos(pitch));    ctx.lineTo(centreX, centreY - Math.sin(pitch) * vehicleSize / 2);    ctx.stroke();    ctx.fill();    //шкала тангажа:    //верхняя часть:    ctx.beginPath();    ctx.strokeStyle = "Black";    ctx.fillStyle = "Black";    ctx.lineWidth = 1;    //текст:    ctx.fillText(30, centreX - radius * 0.28, centreY - vehicleSize + radius / 20);    ctx.fillText(20, centreX - radius * 0.28, centreY - vehicleSize * 0.684 + radius / 20);    ctx.fillText(10, centreX - radius * 0.28, centreY - vehicleSize * 0.348 + radius / 20);    //метки - линии:    ctx.moveTo(centreX - radius / 10, centreY - vehicleSize);    ctx.lineTo(centreX + radius / 10, centreY - vehicleSize);    ctx.stroke();    ctx.moveTo(centreX - radius / 10, centreY - vehicleSize * 0.684);    ctx.lineTo(centreX + radius / 10, centreY - vehicleSize * 0.684);    ctx.stroke();    ctx.moveTo(centreX - radius / 10, centreY - vehicleSize * 0.348);    ctx.lineTo(centreX + radius / 10, centreY - vehicleSize * 0.348);    ctx.stroke();    //нижняя часть:    ctx.beginPath();    ctx.strokeStyle = "White";    ctx.fillStyle = "White";    //текст:    ctx.fillText(30, centreX - radius * 0.28, centreY + vehicleSize + radius / 20);    ctx.fillText(20, centreX - radius * 0.28, centreY + vehicleSize * 0.684 + radius / 20);    ctx.fillText(10, centreX - radius * 0.28, centreY + vehicleSize * 0.348 + radius / 20);    //метки - линии:    ctx.moveTo(centreX - radius / 10, centreY + vehicleSize);    ctx.lineTo(centreX + radius / 10, centreY + vehicleSize);    ctx.stroke();    ctx.moveTo(centreX - radius / 10, centreY + vehicleSize * 0.684);    ctx.lineTo(centreX + radius / 10, centreY + vehicleSize * 0.684);    ctx.stroke();    ctx.moveTo(centreX - radius / 10, centreY + vehicleSize * 0.348);    ctx.lineTo(centreX + radius / 10, centreY + vehicleSize * 0.348);    ctx.stroke();    //шкала крена:    ctx.lineWidth = 2;    //+-15 градусов:    ctx.fillText(15, centreX + radius * 0.6, centreY + radius * 0.22);    ctx.moveTo(centreX + 0.966 * 0.8 * radius, centreY + 0.259 * 0.8 * radius);    ctx.lineTo(centreX + 0.966 * 0.95 * radius, centreY + 0.259 * 0.95 * radius);    ctx.fillText(15, centreX - radius * 0.75, centreY + radius * 0.22);    ctx.moveTo(centreX - 0.966 * 0.8 * radius, centreY + 0.259 * 0.8 * radius);    ctx.lineTo(centreX - 0.966 * 0.95 * radius, centreY + 0.259 * 0.95 * radius);    //+-30 градусов:    ctx.moveTo(centreX + 0.866 * 0.8 * radius, centreY + 0.5 * 0.8 * radius);    ctx.lineTo(centreX + 0.866 * 0.95 * radius, centreY + 0.5 * 0.95 * radius);    ctx.moveTo(centreX - 0.866 * 0.8 * radius, centreY + 0.5 * 0.8 * radius);    ctx.lineTo(centreX - 0.866 * 0.95 * radius, centreY + 0.5 * 0.95 * radius);    //+-45 градусов:    ctx.moveTo(centreX + 0.707 * 0.8 * radius, centreY + 0.707 * 0.8 * radius);    ctx.lineTo(centreX + 0.707 * 0.95 * radius, centreY + 0.707 * 0.95 * radius);    ctx.moveTo(centreX - 0.707 * 0.8 * radius, centreY + 0.707 * 0.8 * radius);    ctx.lineTo(centreX - 0.707 * 0.95 * radius, centreY + 0.707 * 0.95 * radius);    ctx.stroke();}



Наиболее сложным для понимания представляется код рисования макета. Рассмотрим его более детально. В качестве макета решено использовать плоскую симметричную фигуру, имеющую в плане форму стрелки.



Верхняя и нижняя поверхности макета отличаются друг от друга по цвету контура и заливки. Выбор текущего цветового решения первая часть кода.
Далее происходит построение контура фигуры.

Наиболее сложная задача определение координат проекций вершин фигуры на плоскость YOZ. Именно ее решают выражения с тригонометрическими функциями. Обход вершин в коде производится по порядку их нумерации на рисунке.

Самая объемная часть кода посвящена шкалам и подписям. Отметки шкал имеют множество различий: верхние и нижние, левые и правые, с подписями и без. Внушительное количество строк обусловлено написанием индивидуального кода каждого элемента.

Для нанесения меток крена используются тригонометрические функции соответствующих углов. Поскольку значения углов каждой метки известны заранее, в коде прописаны готовые значения синусов и косинусов.

Оценивать вид индикатора лучше в динамике. Покажем с помощью новой функции колебания по тангажу и крену. Для максимального разнообразия положений сделаем амплитуды колебаний соответствующими ограничениям индикатора, а периоды различными и взаимно простыми.



Заключение


Строго говоря, представленный выше код визуализации крена и тангажа следует называть индикацией по мотивам изобретения Пленцова А. П. и Законовой Н. А. Некоторые отступления от оригинальных схем сделаны с целью упрощения задачи, другие для улучшения реализации.

Представленный индикатор далек от идеала в плане дизайна. Не являются оптимальными по какому-либо объективному критерию и принятые ограничения отображаемых значений. Тем не менее, задачу создания демонстратора интересной технологии можно считать решенной.
Подробнее..

Разработка симулятора космического корабля Союз ТМА

12.12.2020 22:14:43 | Автор: admin
Тренажёр предстартовой подготовки ТПК Союз ТМА. Фото: ЦПК им. ГагаринаТренажёр предстартовой подготовки ТПК Союз ТМА. Фото: ЦПК им. Гагарина

Привет! Мы - команда симулятора Союз ТМА, программы, имитирующей орбитальный полёт космического аппарата Союз и Международной Космической Станции, сближение и стыковку КА с МКС, а так же расстыковку и спуск. Всё это имитируется как в автоматическом (т.е. под управлением моделями бортовой аппаратуры Системы Управления Движением), так и в ручном режимах полёта, которые по своему алгоритмическому и логическому составу идентичны тем. что использовались на борту КА Союз ТМА.

Нами разработано программное обеспечение под названием "Моделирование и Управление" в среде C++ Builder 6. Почему именно в ней, а не в VS - это наш первый проект и ранее никто из нас не имел опыта в программировании, а тем более в тренажёростроении, поэтому для "пробы пера" была выбрана наиболее простая среда, но при этом код разрабатывается так, что бы его можно было максимально быстро интегрировать в другую среду (Qt, VS).

В первую очередь мы решили разработать основные оконные формы для отладки работы алгоритмов ПО - журнал протоколирования событий, а также форматы, имитирующие бортовую аппаратуру, с которой взаимодействует космонавт во время выполнения программы полёта.

Первой формой была - "Ввод начальных условий". На данной форме вводятся все необходимые параметры для выставления начального состояния КА и МКС, минимальный набор начальных параметров состояния бортовых систем, оскулирующие элементы и др. параметры, необходимые для начала режима. Сам список какие именно параметры необходимы для моделирования столь сложной системы нам были неизвестны, но изучив статьи на данную тему, имеющиеся в интернете, а так же пообщавшись с разработчиками тренажёров подготовки космонавтов мы выяснили приблизительный набор параметров, которые использует ЦПК им. Гагарина и НАСА для задания начальных условий режимов полёта.

В этот список входят несколько групп параметров:

  1. Основные характеристики:

    • Массив моментов инерции (Jxx, Jyy, Jzz, Jxy, Jyz, Jzx) - который необходим для математической модели движения. Вводится как для корабля, так и для станции.

    • Масса корабля и станции (в кг).

    • Координаты центра масс корабля и станции.

  2. Параметры орбиты:

    • Параметры орбиты в виде набора Кеплеровых элементов.

    • Параметры орбиты в виде векторов в J2000.

  3. Параметры ориентации:

    • Начальная система координат корабля и станции (инерциальная текущая или орбитальная СК).

    • Углы (тангаж, крен, рыскание).

    • Угловые скорости (Wx, Wy, Wz).

  4. Параметры режима:

    • Признаки занятости стыковочных узлов (наличие пристыкованных кораблей).

    • Начальный режим работы Системы Управления Движением и Навигации.

    • Конфигурация станции.

    • Набор состояния признаков состояния бортовых систем корабля и станции.

    • Дата и время начала режима.

Пользовательский интерфейс данного формата выглядит следующим образом:

Формат "Ввод НУ" - КомплексныйФормат "Ввод НУ" - Комплексный

Пользовательский интерфейс, а так же набор и расположение параметров были позаимствованы у тренажёра ДОН Союз-ТМА, как единственные известные нам, по ходу разработки мы от них откажемся и разработаем свой пользовательский интерфейс, основываясь на задачах, поставленных перед симулятором и необходимых параметрах для моделирования.

Из за обширного количества вводимых значений, в данный формат мы добавили возможность загрузки и сохранения параметров начальных условий в файл. Принцип сохранения и загрузки прост и использует дефолтные компоненты, такие как TSaveDialog и TOpenDialog. Данные сохраняются и загружаются в ini файл (TIniFile), что довольно удобно. Структура файла так же разделена на группы в соответствии с логикой набора параметров начальных условий.

Все действия оператора (загрузка и сохранение, а так же все возможные ошибки) протоколируются в журнал событий с указанием времени и описанием действия.

Квитанция о загрузке начальных условий из файлаКвитанция о загрузке начальных условий из файла

Разработка данного формата позволила нам сформировать структуру начальных условий, для последующей работы с ними.

// Структура для математических моделейstruct{//// Д А Т А ////TDateTime nu_day;                   // 2   Модельное время/дата//// М К С ////double vec_j2000_mks[3];                // 8   Массив вектора положения Ц.М. МКС в J2000 (X, Y, Z)double vel_j2000_mks[3];                // 11  Массив скорости    Ц.М.    МКС    в J2000 (X, Y, Z)double Q_mks[4];                        // 14  Массив компонентов кватерниона МКС                                             0  1  2double w_j2000_mks[3];                  // 18  Массив вектора угловой скорости МКС относительно J2000 в проекциях на ССК РС (Wx Wy Wz)double vec_mks_PC[3];                   // 21  Массив координат   Ц.М.    МКС    в  РС   (X, Y, Z)double m_mk;                            // 24  Масса МКСdouble mi_mks[3][3];                    // 25  Двумерный массив моментов инерции МКС (Jxx, Jxy, Jxz...)//// Т К ////double vec_j2000_tk[3];                 // 34  Массив вектора положения Ц.М. ТК в J2000 (X, Y, Z)double vel_j2000_tk[3];                 // 37  Массив скорости    Ц.М.    ТК    в J2000 (X, Y, Z)                   0   1   2   3double Q_tk[4];                         // 40  Массив компонентов кватерниона разворота ССК ТК относительно J2000 (Qs, Qx, Qy, Qz)double w_j2000_tk[3];                   // 44  Массив вектора угловой скорости ТК относительно J2000 в проекциях на ССК ТК (Wx Wy Wz)double vec_tk_TPK[3];                   // 47  Массив координат   Ц.М.    ТГК/ТПК    в  РС   (X, Y, Z)double m_tk;                            // 50  Масса ТКdouble mi_tk[3][3];                     // 51  Двумерный массив моментов инерции ТК (Jxx, Jxy, Jxz...)//// M I S C ////double vec_solar[3];                    // 60  Единичный вектор из центра J2000 на Солнце в проекциях на J2000 (ex, ey, ez)unsigned long r_st_mks;                 // 63  Режим стабилизации МКСunsigned long n_su_4_dk;                // 64  Номер стыковочного узла МКС, к которому выполняется причаливание ТК (резерв, не используется)unsigned long nu_otor_switch_styk_dk;  // 65   СУ, к которому пристыкован ТК (для задания состояния состыкованного ТК)double tk_top_zap;                      // 66  Запас топлива ТК (КДУ О+Г)double mks_top_zap;                     // 67  Запас топлива МКС (РС ОДУ О+Г)unsigned long pr_doking;                // 68  Признак состыкованного состояния ТК и МКС по НУunsigned long nr_sudn;                  // 69  Начальный режим работы СУДН ТК} NU_temp;// Массив признаков УСОstatic bool USO_Booled[20][16];         // Матрица УСО (разблюдовка в ТО_УСО п.п. 3.7)

После этого мы изучили некоторые статьи по разработке математических моделей бортовых систем космических аппаратов (Е. А. Микрин - Бортовые комплексы управления космическими аппаратами ISBN 5-7038-2178-9), а так же различные технические документы на Союз ТМА (в основном SoyCOM) и составили список основного приборного состава оборудования, которое необходимо реализовать для минимального функционирования системы и отладки основных алгоритмов управления.

В качестве математической модели движения на первом этапе было решено использовать модель SGP4, переработанную под нужды симулятора (вместо входных параметров TLE - массив параметров НУ).

Из приборного состава в первую очередь был реализован Пульт Ручного Ввода Информации (ПРВИ) в UI исполнении, как он был реализован на пульте космонавтов "Нептун" корабля Союз-ТМ

Данный пульт предназначен для информационного обмена оператора с БЦВК "Аргон-16". На кораблях серии ТМА данный пульт был исполнен в программном обеспечении Интегрированного Пульта управления (ИнПУ).

Так как на первом этапе разработки симулятора не предполагалось использовать обмен с моделью ИнПУ, то было решено использовать встроенную модель пульта ПРВИ с сам симулятор.

Логика работы с пультом следующая: оператор последовательно заполняет цифровые Индикаторы Ручного Ввода Информации (ИРВИ) кроме 15-го индикатора (знак + / -), после чего выдает команду на исполнение кнопкой "ИСП" и после обработки введённой информации наблюдает ответ-квитанцию от БЦВК на ИРВИ. Все действия с данным прибором так же логируются в журнал. С помощью ПРВИ можно:

  • Произвести чтение/запись уставочной информации (состояние логических признаков управляющих слов 16-разрядной ячейки памяти Аргона).

  • Управлять форматами дисплея (форматы отображения Блока Формирования Изображения).

  • Организовать динамический вывод информации на ИРВИ.

  • Чтение/запись восьмеричных или десятичных чисел в память Аргона.

Исходя из вышеперечисленного можно сказать, что данный формат позволяет производить полный информационный обмен с памятью БЦВК, что на этапе отладки модели БЦВК крайне важно.

Для облегчения восприятия информации и ввода вывода уставочной информации, начиная с кораблей серии Союз ТМА-М работу с ПРВИ упразднили, оставив лишь формат отображения ИнПУ "ПРВИ" (индекс 2Ф46), на который выведены основные управляющие слова (В1-ТА1) для контроля их состояния (при выполнении штатной программы полёта, изменение состояния логических признаков происходит по Командной Радио Линии (КРЛ) с Земли группой ГОГУ). Ниже представлен скриншот формата ПРВИ корабля Союз МС с выведенным на экран состоянием логических признаков управляющего слова А20.

Для удобства работы с кодом и последующей миграции кода из C++ Builder 6 в среду Visual Studio (планируется, что итоговое приложение будет MFC + OpenGL в качестве графического движка для системы визуализации) каждый формат имеет помимо своего файла формы (***_form.cpp) так же файл с логикой, где описаны все процедуры и функции для данной системы/прибора. Логика работы прибора ПРВИ в симуляторе следующая:

Вначале пользователь должен включить прибор, нажав клавишу ON, тем самым он выставит логический признак brvi_on = true;

void __fastcall TIrBrForm::brvi_on_btnClick(TObject *Sender){brvi_on=true;           // Признак включения ПРВИPanel1->Color=clLime;   // Зажигаем индикатор состояния прибора зеленым цветом}

Далее используя один из кодов ввода-вывода необходимо ввести последовательно режим, адрес и число, а так же если необходимо, то и знак. Знак можно ввести на любом этапе заполнения цифровых индикаторов. Ниже описаны коды ввода-вывода информации, актуальные для ПрО Союз ТМА 228

Операция

Код

Одиночный ввод десятичных чисел

14

Одиночный ввод восьмеричных чисел

15

Групповой ввод десятичных чисел

17

Групповой ввод восьмеричных чисел

18

Запись "0" в заданный разряд ячейки ОЗУ

30

Запись "1" в заданный разряд ячейки ОЗУ

31

Операция

Код

Одиночный вывод десятичных чисел

24

Одиночный вывод восьмеричных чисел

25

Групповой вывод десятичных чисел

27

Групповой вывод восьмеричных чисел

28

Динамический вывод десятичных чисел

04

Динамический вывод восьмеричных чисел

05

В ПО каждый индикатор является компонентом TPanel, где заполняется свойство Caption. При нажатии на какую-либо цифровую клавишу последовательно проверяется занятость каждого индикатора и заполняется последний свободный индикатор. Ниже приведен участок кода обработки нажатия цифровой клавиши "1":

void __fastcall TIrBrForm::brvi_btn_1Click(TObject *Sender){if(brvi_on){USO_BitType[16][3] = 0111;if(i1->Caption=="")        i1->Caption="1";else if(i2->Caption=="")        i2->Caption="1";else if(i3->Caption=="")        i3->Caption="1";else if(i4->Caption=="")        i4->Caption="1";else if(i5->Caption=="")        i5->Caption="1";else if(i6->Caption=="")        i6->Caption="1";else if(i7->Caption=="")        i7->Caption="1";else if(i8->Caption=="")        i8->Caption="1";else if(i9->Caption=="")        i9->Caption="1";else if(i10->Caption=="")        i10->Caption="1";else if(i11->Caption=="")        i11->Caption="1";else if(i12->Caption=="")        i12->Caption="1";else if(i13->Caption=="")        i13->Caption="1";else if(i14->Caption=="")        i14->Caption="1";else {}}}

Мы не смогли разобраться, как записать это в виде цикла for, поэтому сделали таким образом. По такой же логике работают обработчики и на остальных клавишах. Если необходимо очистить индикаторы, то для этого надо нажать клавишу "СБР", а если убрать последний введенный индикатор, то клавишу "ГАШ".

После окончания заполнения индикаторов необходимо отправить введенные значения на обработку в БЦВК, ниже представлен код обработчика клавиши ИСП:

void __fastcall TIrBrForm::isp_btnClick(TObject *Sender){if(brvi_on) { // Если БРВИ вклif(i1->Caption==""&&i2->Caption==""){  // Если первый и второй индикаторы пустые,i1->Caption=="A";     // Тогда сообщение ААi2->Caption=="A";JPS(3,is_irvi,is_operator,"АА","");  // и лог в журнал} else {              // или (если 1И и 2И не пустые)AnsiString brvi_msg = i1->Caption+i2->Caption+i3->Caption+i4->Caption+    // Создаем строку текущего состояния И ИРВИi5->Caption+i6->Caption+i7->Caption+i8->Caption+i9->Caption+i10->Caption+i11->Caption+i12->Caption+i13->Caption+i14->Caption+i15->Caption;JPS(1,is_operator,is_irvi,brvi_msg,"");Timer1->Enabled=true;  // Включаем таймер задержки индикации// Обнуляем индикаторы перед индикациейi1->Caption="";i2->Caption="";i3->Caption="";i4->Caption="";i5->Caption="";i6->Caption="";i7->Caption="";i8->Caption="";i9->Caption="";i10->Caption="";i11->Caption="";i12->Caption="";i13->Caption="";i14->Caption="";i15->Caption="";irvi_string = brvi_msg; // Присваиваем глобальной переменной значение ИРВИChekIrvi(irvi_string); }} else  // Если БРВИ выключенJPS(3,is_miu,is_operator,cmd_brvi_error,"");   // Ошибка в Журнал}

Здесь мы собираем из индикаторов строку, которую после присваиваем глобальной AnsiString переменной irvi_string. Процедура ChekIrvi принимает в качестве аргумента сформированную строку и производит с ней следующие операции:

void ChekIrvi (AnsiString irvi_str){if(irvi_str.IsEmpty())JPS(3,is_miu,is_operator,"Пустой ввод!",""); else {irvi_type.mode = StrToInt(irvi_str.SubString(1,2)); // Вырезаем первые два символа строки ирви "режим"switch (irvi_type.mode) {   // Обработчик режима        case 00: /* Приоритетный или принудительный режим выдачи пр-м 1 - 4 */ break;        case 04: /* Динамический вывод 10-х чисел */ break;        case 05: /* Динамический вывод 8-х чисел */ break;        case 10: /* Ввод уставки РУС */   break;           // Arg addr RUS AUS data?        case 11: /* Ввод уставки АУС 1-й группы */  break;        case 12: /* Ввод уставки АУС 2-й группы */  break;        case 14: /* Одиночный ввод 10-х чисел */                       // Если режим 14, то                 if((irvi_str.SubString(3,5)).IsEmpty())JPS(3,is_miu,is_operator,"Пустой адрес!",""); else {                 irvi_type.addr = StrToInt(irvi_str.SubString(3,5));   // Присваиваем значение адреса                 if(CorrectAddr(irvi_type.addr)) {                     // Проверяем корректность адреса, если корректен, то                 if((irvi_str.SubString(8,7)).IsEmpty())JPS(3,is_miu,is_operator,"Пустое число!",""); else {                 irvi_type.value = StrToInt(irvi_str.SubString(8,7));  // Присваиваем значение                 ArgonMemoryType[irvi_type.addr] = irvi_type.value;    // Записываем его в ячейку памяти Аргона                 SetItvi(irvi_type.mode,irvi_type.addr,ArgonMemoryType[irvi_type.addr], irvi_type.z );   // Выставляем результат на ИРВИ                 JPS(4,is_argon,is_irvi,"Запись числа "+               // Логируем результат (от имени Аргона)                 IntToStr(irvi_type.value)+" по адресу "+IntToStr(irvi_type.addr),"");}}                 else {                                                 // Если адрес не корректен ,то                 irvi_err = true;                 JPS(3,is_argon,is_operator,arg_addr_error,"");     } }  // Логируем превышение допустимого значения памяти А16                 break;        case 15: /* Одиночный ввод 8-х чисел */  break;        case 17: /* Групповой ввод 10-х чисел */ break;        case 18: /* Групповой ввод 8-х чисел */                // irvi_type.addr = StrToInt(irvi_str.SubString(3,5));   // Присваиваем значение адреса                 // if(CorrectAddr(irvi_type.addr)) {                    // Проверяем корректность адреса, если корректен, то                 //irvi_type.value = StrToInt(irvi_str.SubString(8,7));  // Присваиваем значение                // ArgonMemoryType[irvi_type.addr] = irvi_type.value;   // Записываем его в ячейку памяти Аргона                 //SetItvi(irvi_type.mode,(irvi_type.addr)+1,ArgonMemoryType[irvi_type.addr], irvi_type.z );   // Выставляем результат на ИРВИ                 //mode18act=true;                 break;        case 21: /* Вывод уставки АУС 1-й группы */ break;        case 22: /* Вывод уставки АУС 2-й группы */ break;        case 24: /* Одиночный вывод 10-х чисел */                      // Если режим 24, то                 irvi_type.addr = StrToInt(irvi_str.SubString(3,5));   // Присваиваем значение адреса временной переменной                 if(CorrectAddr(irvi_type.addr)) {                     // Проверяем корректность адреса, если корректен, то                 SetItvi(irvi_type.mode,irvi_type.addr,ArgonMemoryType[irvi_type.addr], irvi_type.z ); }  // Выставляем результат на ИРВИ                 else   {                                               // Если адрес не корректен ,то                 irvi_err = true;                 JPS(3,is_argon,is_operator,arg_addr_error,"");   }     // Логируем превышение допустимого значения памяти А16                 break;        case 25: /* Одиночный вывод 8-х чисел */ break;        case 27: /* Групповой вывод 10-х чисел */ break;        case 28: /* Групповой вывод 8-х чисел  */break;        case 30: /* Изменение состояния признака в слове - запись единицы */                 irvi_type.addr = StrToInt(irvi_str.SubString(3,5));   // Присваиваем значение адреса временной переменной                 if(CorrectAddr(irvi_type.addr)) {                     // Проверяем корректность адреса, если корректен, то                 irvi_type.value = StrToInt(irvi_str.SubString(8,7));  // Присваиваем значение                 mode_30(irvi_type.addr,irvi_type.value); }             // Выставляем результат на ИРВИ                 else   {                                              // Если адрес не корректен ,то                 irvi_err = true;                 JPS(3,is_argon,is_operator,arg_addr_error,"");   }    // Логируем превышение допустимого значения памяти А16                 break;        case 31: /* Изменение состояния признака в слове - запись нуля */                 irvi_type.addr = StrToInt(irvi_str.SubString(3,5));   // Присваиваем значение адреса временной переменной                 if(CorrectAddr(irvi_type.addr)) {                     // Проверяем корректность адреса, если корректен, то                 irvi_type.value = StrToInt(irvi_str.SubString(8,7));  // Присваиваем значение                 mode_31(irvi_type.addr,irvi_type.value); }             // Выставляем результат на ИРВИ                 else   {                                              // Если адрес не корректен ,то                 irvi_err = true;                 JPS(3,is_argon,is_operator,arg_addr_error,"");   }    // Логируем превышение допустимого значения памяти А16                 break;        case 40: /*  */ break;        case 41: /*  */ break;        case 42: /*  */ break;        case 43: /*  */ break;        case 44: /*  */ break;        case 45: /*  */ break;        case 46: /*  */ break;        case 48: /* Сверка времени */        break;        default: irvi_err = true;       // Флаг ошибки (для индикации на ИРВИ)                 JPS(3,is_argon,is_irvi,"АА","");        // Логируем ошибку о несуществующем режиме                 JPS(3,is_miu,is_operator,"Несуществующий режим!","");        irvi_type.addr = StrToInt(irvi_str.SubString(3,5));        irvi_type.value = StrToInt(irvi_str.SubString(8,7));        break;} } }

Все эти операции позволяют нам организовать стандартную логику работы с ПРВИ и контролировать/изменять состояние уставочной информации штатным образом, как это было реализовано на корабля серии ТМА. Все действия оператора так же логируются в журнал, что позволяет производить анализ действий по окончанию режима на соответствие требованиям бортовой документации:

Вся необходимая информация (инструкции, аварии, состояние логических признаков и др.) хранится в ячейках памяти и мы можем ее вызвать в любое время используя формат ПРВИ.

Это был первый формат относящийся к модели БЦВК "Аргон-16", но его оказалось недостаточно и в последствии был разработан еще один формат для отладки модели БЦВК "Отладка А16", скриншот которого представлен ниже:

На нём можно наблюдать виртуальные клавиши принудительной выдачи команд в БЦВК (имитации релейных команд для отладки некоторых процедур и алгоритмов), вывести число из ОЗУ без использования ПРВИ (если ПРВИ занят, т.к. с ним могут работать 2 оператора - обмен по UDP), наблюдать текущее значение глобальной переменной ИРВИ, наблюдать статусное окно выбранных каналов БЦВК (т.к. он работает по мажоритарной схеме 2 из 3) и др. Пустые поля по мере разработки будут заполнятся отладочными командами. Все компоненты TLabel выводятся в обработчике таймера, который каждый тик присваивает им состояние переменных.

Этот формат позволит нам отслеживать работу алгоритмов БЦВК (как самых сложных в реализации) и прерывать работу модели при нештатной работе (отклонении от нормы).

Следующими основными форматами, без которых невозможно управление кораблём Союз, являются - КСПл и КСПп. Около половины времени работы космонавта с ПрО пульта "Нептун-МЭ" приходится именно на эти форматы. На них представлены основные команды выдаваемые оператором в бортовые системы корабля - включение и пуск БЦВК, команды управления двигательной установкой, управление ССВП и др. Ниже представлены форматы КСПл и КСПп разработанные для симулятора:

Данные форматы по своему информационному обеспечению идентичны одноименным форматам используемым в ПрО и ИО ИнПУ, что так же позволяет работать с ними как с штатными форматами отображения, для сравнения - ниже скриншот штатного формата КСПл корабля Союз ТМА 219 (ПО 5.19, ИО 5.1)

Логика работы с данным форматом уникальна и разработана Тяпченко Ю.А. Основным преимуществом данного типа пульта является матричный способ выдачи команд и развернутая форма представления информации. С точки зрения эргономики это довольно удобный способ представления большого количества команд, при малом количестве органов взаимодействия. Логика работы с данным форматом следующая - оператор выбирает вначале строку (букву) и выдает ее, буква загорается и разрешается выбор столбца (цифры), где нечётная цифра включает команду, а чётная ее выключает. К примеру, что бы выдать команду на включение РУД, необходимо вначале нажать клавишу "В", а потом "7". Таким образом будет подана команда на включение питания ручки управления движением, а в пульт придёт обратная квитанция об успешности исполнения команды, которая "зажжёт" транспарант светло зеленым цветом.

Так же можно заметить, что на некоторых транспарантах присутствуют дополнительные символы, обозначение которых описано ниже:

Это обозначает, что если команда без сигнализации - значит обратной квитанции и загорания соответствующего транспаранта не будет, а если команда только прямая, значит при выдаче чётной цифры (выключения) команда не пройдет и транспарант не погаснет. Обычно эти команды выключаются другими командами, к примеру для снятия признака выбора К11 "РРЖ 4С" необходимо выдать Л15 "РРЖ 15С" или Л13 "РРЖ 8С".

В симуляторе логика КСП реализована следующим образом. Объявлен двумерный булевый массив

static bool KSP_Booled[16][9];

который хранит состояние команд, если мы выдаем ту или иную команду КСП, то присваиваем соответствующему элементу значение true, которое снимается обработчиком получившей его системы. К примеру при выдаче команды А7 "СДД ОТКЛ" мы выставляем признак KSP_Booled[0][6]=true; , основной обработчик УСО каждый тик обрабатывает весь массив и при KSP_Booled[0][6]=1 сразу снимает эту команду и посылает команду в КДУ и другие системы соответствующие признаки, в это время в КСП стоит обработчик квитанций УСО, который в свою очередь опрашивает каждый элемент массива УСО и если видит ответную квитанцию об успешном отключении сигнальных датчиков СДД от системы управления, зажигает транспарант "СДД ОТКЛ", ниже представлен код обработки этой команды:

// Модуль КСПл, обработчик нажатия цифры 7 ...   if (KSP_Let[0]){ // А                              Если выбранна буква А   KSP_Booled[0][6]=true;                          // Тогда выставляем признак А7 - правда   JPS(1,is_operator,is_miu,is_ksp,"А7"); } else   // Логируем выдачу команды ... // Модуль uso_model.cpp процедура USO_work ...     if(KSP_Booled[0][6]) { // A 7        KSP_Booled[0][6] = false;        // 95 Исключение СДД из схемы управления        USO_Booled[0][3]=true;        kdu_sdd = false;     } ... // Модуль КСПл - тик таймера индикации ...  if(USO_Booled[0][3]){  // KSP A7  A7_LABEL->Color=clLime;  A7_LABEL->Font->Color=clBlack;  } else {  A7_LABEL->Color=clGreen;  A7_LABEL->Font->Color=clYellow; } ...  

Таким образом мы реализуем штатную логику работы с КСП и УСО, конечно если тут есть люди разбирающиеся в УСО корабля Союз, которые нашли ошибку в нашей интерпретации логики работы с КСП, прошу нас поправить, т.к. у нас ни материалов по УСО ничего и данную логику мы построили изучая работу моделей ИнПУ и руководство по работу с системой Нептун-МЭ.

Я думаю это довольно много информации ддля одного поста, поэтому остальные форматы опишу в следующем посте.

Подробнее..

Simctl управление симуляторами Apple через терминал

15.06.2020 00:20:27 | Автор: admin
Всем привет! Меня зовут Паша Лесюк, я работаю мобильным тестировщиком в компании Циан. В этой статье я расскажу о возможностях управления яблочными симуляторами из командной строки.


simctl утилита командной строки для взаимодействия с симуляторами. Она очень похожа на ADB для Android, устанавливается вместе со средой разработки Xcode и используется вместе с xcrun (Xcode-раннер командной строки). Двоичный файл программы можно найти по пути:

/Applications/Xcode.app/Contents/Developer/usr/bin/simctl

Содержание
Работа с объектами устройств
Просмотр списка доступных команд и информации по ним
Просмотр списка доступных устройств, сред выполнения, устройств и пар устройств
Создание нового устройства
Запуск устройства
Апгрейд устройства
Клонирование устройства
Очистка данных и настроек устройства
Переименование устройства
Вывод переменных среды устройства
Проверка состояния загрузки устройства
Выключение устройства
Удаление устройств

Работа с контентом устройств
Снятие скриншота и видео с устройства
Добавление медиа на устройство
Открытие URL на устройстве
Управление сертификатами устройства
Установка приложения на устройство
Запуск приложения на устройстве
Предоставление, отзыв и сброс разрешений приложения
Отображение информации о приложении
Отображение пути к контейнерам установленного приложения
Закрытие приложения на устройстве
Удаление приложения с устройства
Симуляция отправки пуш-уведомления
Изменение и очистка статус-бара устройства
Установка темной или светлой темы

Работа с логами и внутренними механизмами устройств
Выполнение указанной операции на устройстве
Включение и отключение подробного логирования на устройстве
Отображение логов с устройства
Сбор диагностической информации и логов

Заключение
Включение и отключение полноэкранного режима окна симулятора
Включение и отключение отображения нажатий на устройстве

Работа с объектами устройств


Просмотр списка доступных команд и информации по ним


Команда simctl без подкоманд выводит в консоль список всех доступных подкоманд (далее будет использоваться термин команда).

$ xcrun simctl

Для просмотра подробной информации по команде нужно использовать команду help с названием искомой команды.

$ xcrun simctl help list

Просмотр списка доступных устройств, сред выполнения, устройств и пар устройств


Команда list выводит список всех установленных устройств и окружений. Рядом с каждым устройством будет отображен UDID (уникальный идентификатор устройства), который можно прокидывать в некоторые подкоманды simctl.

$ xcrun simctl list

Пример UDID:

4599F586-F482-4E9C-92A7-8AC4EF348BD9

Список можно фильтровать по заголовкам: devices, devicetypes, runtimes, pairs.

$ xcrun simctl list devices== Devices ==-- iOS 11.0 --    iPhone 7 (422566D6-AD4C-40E5-AC64-233043A00814) (Shutdown)-- iOS 13.4 --    iPhone 8 (CB87B315-F01A-41AA-9C85-6FE24E5A66B9) (Shutdown)

Вместе с фильтром по заголовку можно использовать поисковый запрос или параметр available, который выведет список всех доступных пунктов.

$ xcrun simctl list devices available

Примером поискового запроса может служить выборка по устройствам c экраном 12.9 дюймов.

$ xcrun simctl list devicetypes 12.9== Device Types ==iPad Pro (12.9-inch) (com.apple.CoreSimulator.SimDeviceType.iPad-Pro)iPad Pro (12.9-inch) (2nd generation) (com.apple.CoreSimulator.SimDeviceType.iPad-Pro--12-9-inch---2nd-generation-)iPad Pro (12.9-inch) (3rd generation) (com.apple.CoreSimulator.SimDeviceType.iPad-Pro--12-9-inch---3rd-generation-)iPad Pro (12.9-inch) (4th generation) (com.apple.CoreSimulator.SimDeviceType.iPad-Pro--12-9-inch---4th-generation-)

Можно вывести более подробную информацию списка c помощью параметра -v.

$ xcrun simctl list -v devices== Devices ==-- iOS 11.0 (15A8401) [/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS 11.0.simruntime] --    iPhone 7 (7B68E927-161C-440C-AABE-654CD96E8694) (Shutdown)-- iOS 13.3 (17C45) [/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime] --    iPhone 8 (F3909F6E-E227-4BD7-939F-D3D05B1B8AAD) (Shutdown)

Можно вывести информацию в формате JSON с помощью параметра -j или --json.

$ xcrun simctl list -j -v devices{    "devices" : {    "com.apple.CoreSimulator.SimRuntime.iOS-13-3" : [        {        "dataPath" : "\/Users\/pavel\/Library\/Developer\/CoreSimulator\/Devices\/9EA47EEB-F19F-44EE-9854-EA06BEB8FBD1\/data",        "logPath" : "\/Users\/pavel\/Library\/Logs\/CoreSimulator\/9EA47EEB-F19F-44EE-9854-EA06BEB8FBD1",        "udid" : "9EA47EEB-F19F-44EE-9854-EA06BEB8FBD1",        "isAvailable" : true,        "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-7-Plus",        "state" : "Shutdown",        "name" : "iPhone-7-Plus"        },        {        "dataPath" : "\/Users\/pavel\/Library\/Developer\/CoreSimulator\/Devices\/F3909F6E-E227-4BD7-939F-D3D05B1B8AAD\/data",        "logPath" : "\/Users\/pavel\/Library\/Logs\/CoreSimulator\/F3909F6E-E227-4BD7-939F-D3D05B1B8AAD",        "udid" : "F3909F6E-E227-4BD7-939F-D3D05B1B8AAD",        "isAvailable" : true,        "deviceTypeIdentifier" : "com.apple.CoreSimulator.SimDeviceType.iPhone-8",        "state" : "Shutdown",        "name" : "iPhone 8"        }    ],    ...

Создание нового устройства


Для создания нового симулятора используется команда create, после которой указываются имя устройства, его тип и среда (эти данные есть в выводе команды list). После выполнения команды отобразится UDID созданного симулятора.

$ xcrun simctl create iPhone-7-Plus com.apple.CoreSimulator.SimDeviceType.iPhone-7-Plus com.apple.CoreSimulator.SimRuntime.iOS-13-49EA47EEB-F19F-44EE-9854-EA06BEB8FBD1

Запуск устройства


Команда boot запускает устройство с указанным UDID, делая его доступным для взаимодействия.

$ xcrun simctl boot CB87B315-F01A-41AA-9C85-6FE24E5A66B9

После запуска устройства можно передавать команду booted вместо UDID. Если запущено несколько устройств, то simctl выберет одно из них.

Чтобы увидеть симулятор в действии нужно запустить приложение Simulator.

$ open /Applications/Xcode.app/Contents/Developer/Applications/Simulator.app/

Апгрейд устройства


Команда upgrade позволяет повысить версию среды устройства до необходимой.

$ xcrun simctl upgrade 422566D6-AD4C-40E5-AC64-233043A00814 com.apple.CoreSimulator.SimRuntime.iOS-13-4

Клонирование устройства


Команда clone позволяет клонировать существующее устройство, копируя его тип и среду.

$ xcrun simctl clone booted NewPhone

Очистка данных и настроек устройства


Для сброса симулятора к настройкам по умолчанию используется команда erase. Перед очисткой симулятора его нужно выключить, иначе возникнет ошибка.

$ xcrun simctl erase booted

Если нужно сбросить данные всех симуляторов, то нужно использовать команду erase all.

$ xcrun simctl erase all

Переименование устройства


Изменить имя устройства можно с помощью команды rename.

$ xcrun simctl rename booted MyiPhone

Вывод переменных среды устройства


Команда getenv позволяет выводить значения переменных среды устройства. Например, встроенная переменная симулятора SIMULATOR_SHARED_RESOURCES_DIRECTORY указывает на путь, где хранятся данные симулятора.

$ xcrun simctl getenv booted SIMULATOR_SHARED_RESOURCES_DIRECTORY/Users/pavel/Library/Developer/CoreSimulator/Devices/F3909F6E-E227-4BD7-939F-D3D05B1B8AAD/data

Проверка состояния загрузки устройства


Команда bootstatus позволяет убедиться в том, что устройство загружено и готово к работе. Имеет три необязательных ключа:

  • -b загружает указанный симулятор, если он не загружен.
  • -d отображает информацию о миграции данных.
  • -c постоянно отслеживает состояние загрузки и выключения.

$ xcrun simctl bootstatus booted$ xcrun simctl bootstatus booted -c

Выключение устройства


Когда работа с симулятором закончена, можно выключить его, используя команду shutdown.

$ xcrun simctl shutdown booted

Для выключения всех симуляторов используется команда shutdown all.

$ xcrun simctl shutdown all

Удаление устройств


В ходе работы с симуляторами может накапливаться большое количество старых устройств, многие из которых могут быть недоступны для последних версий iOS. Для их удаления используется команда delete unavailable.

$ xcrun simctl delete unavailable

Для удаления конкретного симулятора используется команда delete.

$ xcrun simctl delete booted

Для удаления всех устройств используется команда delete all.

$ xcrun simctl delete all

Работа с контентом устройств


Снятие скриншота и видео с устройства


Можно просто использовать шорткат 4, навести курсором на окно симулятора, нажать пробел и сделать скриншот. Но тогда на скриншоте кроме самого экрана будут видны рамки симулятора.
Для снятия скриншота только экрана используется команда io в связке со screenshot. Можно сохранять изображения в формате .png, .tiff, .bmp, .gif и .jpeg.

$ xcrun simctl io booted screenshot ~/Pictures/app-screenshot.png


Аналогично, можно просто использовать шорткат S в открытом приложении Simulator, скриншот окна сохранится на рабочем столе.

Также можно использовать команду io в связке с recordVideo для записи видео взаимодействия с экраном симулятора. Можно сохранять видео в формате .mov, .h264, .mp4 и .fmp4.

$ xcrun simctl io booted recordVideo ~/Movies/app-preview.mp4

Для завершения записи нужно нажать C в окне терминала.

Добавление медиа на устройство


Команда addmedia используется для добавления фото или видео на симулятор.

$ xcrun simctl addmedia booted ~/Pictures/test.png$ xcrun simctl addmedia booted ~/Pictures/test.gif$ xcrun simctl addmedia booted ~/Pictures/test.mp4

Также можно просто перетащить файл из Finder в окно симулятора.

Открытие URL на устройстве


Команда openurl открывает указанный URL на симуляторе.

$ xcrun simctl openurl booted "https://www.google.com/"

Также может использоваться кастомная схема, ассоциированная с нативным приложением.

$ xcrun simctl openurl booted maps://

Управление сертификатами устройства


Команда keychain позволяет добавлять сертификаты в доверенное корневое хранилище или keychain, а также сбрасывать keychain.

$ xcrun simctl keychain booted add-root-cert ~/my-selfsigned.cer$ xcrun simctl keychain booted add-cert ~/my-selfsigned.cer$ xcrun simctl keychain booted reset

Установка приложения на устройство


Можно легко установить приложение на симулятор если известен путь к файлу .app. Для этого используется команда install.

$ xcrun simctl install booted ~/Циан.app

Также можно просто перетащить приложение из Finder в окно симулятора.

Перечень opensource-приложений для iOS можно найти тут.

Запуск приложения на устройстве


Запуск приложения осуществляется с помощью команды launch и указанием bundle ID.

$ xcrun simctl launch booted ru.cian.mobile

Как узнать bundle ID описано тут.

Предоставление, отзыв и сброс разрешений приложения


Команда privacy может предоставлять, отзывать и сбрасывать разрешения приложения.

$ xcrun simctl privacy <device> <action> <service> <bundle ID>

Значения action (действия) могут быть следующие:

  • grant предоставляет доступ к сервису. Неободим bundle ID.
  • revoke запрещает доступ к сервису. Необходим bundle ID.
  • reset сбрасывает доступ к сервису. bundle ID опционален.

Значения service (службы) могут быть следующие:

  • all применяет действие ко всем службам.
  • calendar предоставляеть доступ к календарю.
  • contacts-limited предоставляет доступ к основной контактной информации.
  • contacts предоставляет полный доступ к контактной информации.
  • location предоставляет доступ к службам определения местоположения при использовании приложения.
  • location-always предоставляет доступ к службам определения местоположения в любое время.
  • photos-add предоставляет доступ на добавление фотографий в библиотеку фотографий.
  • photos предоставляет полный доступ к библиотеке фотографий.
  • media-library предоставляет доступ к медиа-библиотеке.
  • microphone предоставляет доступ к микрофону.
  • motion предоставляет доступ к фитнес-данным.
  • reminders предоставляет доступ к напоминаниям.
  • siri предоставляет возможность использовать приложение вместе с Siri.

Пример использования:

$ xcrun simctl privacy booted grant photos ru.cian.mobile$ xcrun simctl privacy booted grant location ru.cian.mobile$ xcrun simctl privacy booted revoke all ru.cian.mobile

На данный момент не все сервисы доступны для настройки. Отсутствуют уведомления, здоровье, Bluetooth и Face ID.

Отображение информации о приложении


Команда appinfo выводит информацию о приложении.

$ xcrun simctl appinfo booted ru.cian.mobile

Формат отображения информации следующий:

{    ApplicationType = User;    Bundle = <PATH_TO_APP_FILE>;    BundleContainer = <PATH_TO_APP_FILE_FOLDER>;    CFBundleDisplayName = "Циан";    CFBundleExecutable = "Циан";    CFBundleIdentifier = "ru.cian.mobile";    CFBundleName = "Циан";    CFBundleVersion = 1;    DataContainer = <PATH_TO_DATA_FOLDER>;    GroupContainers =     {        <GROUP_CONTAINER_NAME> = <PATH_TO_GROUP_CONTAINER_FOLDER>;    };    Path = <PATH_TO_APP_FILE>;    SBAppTags =     (    );}

Отображение пути к контейнерам установленного приложения


Можно вывести путь к контейнерам приложения через команду get_app_container с указанием bundle ID. У команды есть несколько опций для указания типа контейнера:

  • app указывает на расположение самого приложения и используется по умолчанию.

$ xcrun simctl get_app_container booted ru.cian.mobile$ xcrun simctl get_app_container booted ru.cian.mobile app

  • data указывает на расположение данных приложения.

$ xcrun simctl get_app_container booted ru.cian.mobile data

  • groups указывает на расположение группы приложений. Если групп несколько, то нужно использовать имя искомой группы.

$ xcrun simctl get_app_container booted ru.cian.mobile groups$ xcrun simctl get_app_container booted ru.cian.mobile group.ru.cian.mobile.widget

Закрытие приложения на устройстве


Закрытие приложения осуществляется с помощью команды terminate и указанием bundle ID.

$ xcrun simctl launch terminate ru.cian.mobile

Удаление приложения с устройства


Можно удалить приложение с симулятора с помощью команды uninstall, используя bundle ID.

$ xcrun simctl uninstall booted ru.cian.mobile

Симуляция отправки пуш-уведомления


Для отправки пуша нужно подготовить файл, который должен содержать структуру в формате JSON и сохранить его с расширением .apns (Apple Push Notification service):

{    "aps": {        "alert": {            "title": "Tester on Steroids",            "body": "About mobile apps testing"        },        "badge": 3,        "sound": "default"    }}

Затем нужно дать разрешение на отправку приложению уведомлений. После этого нужно выполнить команду push с указанием устройства, bundle ID и пути до файла .apns.

$ xcrun simctl push booted ru.cian.mobile ~/Documents/mocks/push.apns

Если добавить в файл параметр "Simulator Target Bundle", то необходимость указывать каждый раз bundle ID отпадает.

{    "aps": {        "alert": {            "title": "Tester on Steroids",            "body": "About mobile apps testing"        },        "badge": 3,        "sound": "default"    },    "Simulator Target Bundle": "ru.cian.mobile"}

$ xcrun simctl push booted ~/Documents/mocks/push.apns

Также, если указан параметр "Simulator Target Bundle", то файл можно просто перетащить в окно симулятора.

Изменение и очистка статус-бара устройства


У команды status_bar есть три подкоманды:

  • override принимает параметры для элементов статус-бара и меняет их в зависимости от значений.

$ xcrun simctl status_bar booted override --time 10:30 --dataNetwork wifi --wifiMode active --wifiBars 2 --cellularMode active --cellularBars 3 --operatorName @tester_on_steroids --batteryState charging --batteryLevel 75

  • list выводит значения перезаписанных параметров.

$ simctl status_bar booted listCurrent Status Bar Overrides:=============================Time: 10:30DataNetworkType: 1Cell Mode: 3, Cell Bars: 3Operator Name: @tester_on_steroidsBattery State: 1, Battery Level: 75, Not Charging: 1

  • clear очищает перезаписанный статуc-бар.

$ simctl status_bar booted clear

Установка темной или светлой темы


Данная опция доступна для симуляторов с iOS от 13.0 и выше. C помощью команды ui appearance можно поменять тему устройства на темную или светлую.

$ xcrun simctl ui booted appearance dark$ xcrun simctl ui booted appearance light

Работа с логами и внутренними механизмами устройств


Выполнение указанной операции на устройстве


Команда spawn создает указанный процесс на симуляторе.

$ xcrun simctl spawn booted defaults write ru.cian.mobile ResetDatabase -bool YES

Здесь используется интерфейс defaults, в котором флагу ResetDatabase устанавливается значение YES. Это удобный способ менять пользовательские настройки до запуска приложения.

Включение и отключение подробного логирования на устройстве


Команда logverbose позволяет включать и отключать подробное логирование на устройстве. Для того, чтобы изменения вступили в силу, нужно перезапустить симулятор.

$ simctl logverbose booted enable$ simctl logverbose booted disable

Отображение логов с устройства


В iOS существует пять уровней логов:

  1. Default. Используется для сбора информации о вещах, которые могут привести к сбою.
  2. Info. Полезная, но необязательная информация для устранения ошибок.
  3. Debug. Информация, которая может быть полезна во время разработки или устранения конкретной проблемы. Отслеживание debug-логов предназначено для использования на стадии разработки, а не на стадии эксплуатации программы конечными пользователями.
  4. Error. Используется для сбора информации об ошибках процесса.
  5. Fault. Используется для сбора информации об ошибках системного уровня или мульти-процессов.

Для того, чтобы просмотреть вывод логов с симулятора в командной строке, необходимо выполнить следующую команду:

$ xcrun simctl spawn booted log stream

По умолчанию вывод логов будет включать в себя уровни default, error и fault. Для использования уровней info и debug нужно использовать аргумент --level. --level=info будет отображать уровни по умолчанию, а так же info. --level=debug будет отображать уровни по умолчанию, а так же info и debug.

$ xcrun simctl spawn booted log stream --level=info$ xcrun simctl spawn booted log stream --level=debug

Также можно фильтровать логи. Например, по конкретному приложению или по типу ивентов и сообщений.

$ xcrun simctl spawn booted log stream --predicate 'processImagePath endswith "Циан"'$ xcrun simctl spawn booted log stream --predicate 'eventMessage contains "error" and messageType == info'

Чтобы выключить вывод логов нужно нажать C в окне терминала.

C помощью операции log collect можно сделать дамп журнала логов.

$ xcrun simctl spawn booted log collect

Сбор диагностической информации и логов


С помощью команды diagnose можно сгенерировать подробный журнал всего, что происходило в сессии приложения Simulator.

$ xcrun simctl diagnose

Журнал будет включать в себя:

  • системные логи,
  • логи симулятора,
  • устройства и окружения,
  • настройки устройств,
  • дополнительную информацию.

В журнале будет содержаться конфиденциальная информация, поэтому с этими данными нужно быть осторожным.

После генерации журнала будет открыта папка с архивом, содержащим всю информацию.

Заключение


В заключение хотелось бы поделиться еще парой полезных команд для работы с симуляторами.

Включение и отключение полноэкранного режима окна симулятора


Позволяет использовать окно симулятора в полноэкранном режиме macOS. Например, можно открыть отдельный рабочий стол с Xcode и симулятором.

defaults write com.apple.iphonesimulator AllowFullscreenMode 1defaults write com.apple.iphonesimulator AllowFullscreenMode 0

Включение и отключение отображения нажатий на устройстве


Отображает тапы на симуляторе. Удобно при записи видео.

defaults write com.apple.iphonesimulator ShowSingleTouches 1defaults write com.apple.iphonesimulator ShowSingleTouches 0



P.S.
Если вам интересна тема тестирования, то приглашаю вас подписаться на мой блог в телеграме.
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru