Документация разработчика

В этой статье представлена общая информация по разработке модулей для RA150.

HTML структура модуля

<!doctype html>
<html><head>
  <title>...</title>
  <script async src="/theme.js"></script>
  <script async src="/h2i.js"></script>
  <script src="/ui.js"></script>
  <meta name="viewport" content="width=device-width,initial-scale=1.0">
  <link rel="icon" href="/logo.avif">
  <link rel="apple-touch-icon" sizes="256x256" href="/logo.avif">
<head>
  <style>
 /* CSS */
  </style>
</head>
<body style="opacity:0">
	<div class="conn_lost_out" id="conn_layout" style="display:none">
		<div class="conn_lost_in"></div>
	</div>
	<div id="layout">
		<div id="main">
			<div id="messages"></div>
			<div class="cntr ps" id="ps">
				<div class="spinner"></div>
			</div>
			<div class="content" id="cMenu">
				<div class="pure-g" id="x" hidden>
				<!-- Your html code here -->
				</div>
			</div>
		</div>
	</div>
<footer style="text-align: right;font-size: 10px;opacity: .15; font-family: monospace">v1.00</footer>
<script>
	//your js code
</script>
</body>
</html>

Базовые функции и классы

Функция/КлассПараметры/МетодыРезультат
showWarning(text, timeout)text — текст сообщения
timeout — таймаут скрытия сообщения (Если не задан, сообщение будет перманентным)
Выводит текст с красным фоном в верху интерфейса
hideWarning()Скрывает сообщение вызванное функцией showWarning()
showNotification(text)text — текст сообщенияВыводит текст с зеленым фоном в верху интерфейса на 4 секунды
set(cmd, d, msg)cmd — текст команды MCU
в — задержка выполнения в мс, нужно, если используется серия команд, минимальная задержка 100мс
msg — сообщение оповещения
Отправляет команду MCU с оповещением через showNotification()
brr(duration)duration — время вибрации 1-1000мсВибро-отклик, если поддерживается
toggle_dark()Переключение темы
Screenshot(elementId, fileName = «screenshot.png»)elementId — id DOM элементаФункция для создания скриншота. Возвращает formData. Должен быть подключен h2i.js
getScreen(id)id — id DOM элементаОтправка скриншота боту
getLoc()Отправка геолокации боту
getLog()Отправка лога с логгера боту
getConf()Отправка боту конфига MCU
isMobile()Возвращает true, если платформа телефон или планшет
longTap(selector, longTapCallback = null, longTapTimeout = 500, twoFingerTapCallback = null, threeFingerTapCallback = null)
voiceCMD(cls)cls — класс DOM элементаЗапускает обработчик голосовых команд. Функция экспериментальная и работает не везде
localizationconst translations = {
‘en’: {
«mdq.fan»: «Fan»,
},
‘ru’: {
«mdq.fan»: «Вентилятор»,
},
‘es’: {
«mdq.fan»: «Ventilador»,
}
};

addMultiLanguageTranslations(translations)
Динамическая локализация. Доступны 3 языка, en, ru, es
bnd(id, event, function)let el = document.getElementyById(‘#container’);
bnd(el, ‘click’, () => {
console.log(‘clicked’);
});
Привязка функции к элементу DOM по событиям

Получение данных с MCU

Для получения данных сенсоров с MCU можно использовать код с модулей, нас интересует следующий базовый код (структура данных описана тут)

function updateText(resp) {
...
}

function displayT(data) {
...
}

function fetchT() {
...
}

onLoad(function() {
  dynamicManifest("module-name"); //PWA
  fetchT(); //Get telemetry/etc settings
  loaded = true;
});

Для подключения телеметрии нужно так же добавить

let gps_options = {
	enableHighAccuracy: true,
	timeout: 30000,
	maximumAge: 0
};

function getLocation() {
	if (navigator.geolocation) {
		navigator.geolocation.watchPosition(gpsData, function() {
			gps_failed = true
		}, gps_options);
	}
}

function gpsData(position) {
	gps_lat = position.coords.latitude;
	gps_long = position.coords.longitude;
	gps_speed = Math.trunc(position.coords.speed * 3.6);
	gps_failed = position.coords.speed == null ? true : false;
}

let odoSaveCounter = 0;
let isOffline = false;

function initOdometer() {
...
}

const SESS_LIMIT = 100000;
let logsRestored = false;
let longOffline = false;
let lastProcessTime = 0;
let datapoints = 0;

function logs_handler() {
...
}

Так же необходимо добавить минимальный набор необходимых глобальных переменных

let beep = false;
let a_count = 0;
let old_rlc;
let ext_cmd_stop = false;
let data; //MCU data array
let session = Date.now();
let session_start = false;
const t_settings = [];
let t_log = [];
let telemetry_error = true;
let gps_lat = 0;
let gps_long = 0;
let gps_speed = 0;
let gps_failed = false;
let logger;
let freq;
let clear_rbc = false;
let l_count = 0;
let wr_freq = 0;
let odo_mem;
let odo_curr = 0;
let odo_dash = "0.00";
let odo_trip = "0.00";
let curr_spd = 0;
let old_spd = 0;
let trip_exclude = 0;
let logger_full = false;
let bot = null;
let warn_sended = false;
let logger_card_toggle = false;

Для отправки сообщений телеграм-боту можно использовать следующий метод (настройки бота в Services должны быть заполнены)

bot.sendMessage('some text', null, null, false);