⚠️Иформация не полная, будет постепенно дополняться/обновляться⚠️
В этой статье представлена общая информация по разработке модулей для 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 элемента | Запускает обработчик голосовых команд. Функция экспериментальная и работает не везде |
localization | const 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);