JavaScript API ru

From ElphelWiki
Revision as of 03:21, 7 November 2005 by Khlut (talk | contribs) (Общий способ работы с функциями)
Jump to: navigation, search

(Проект)

in English | autotranslate | по-русски | [[{{{cn}}}|中文版]]

Библиотека предназначена для работы с камерами из javascript

Функции для работы с камерами

Общий способ работы с функциями

Каждая операция разбивается на два этапа - запрос и подтверждение. При запросе передаются callback-функции которые вызываются по приходу информации от камеры.

Для работы с функциями следует подключить файл-библиотеку libelphel_cam.js

Каждая функция имеет унифицированный набор параметров

cam_groupcmd(addr, params,.., functions,..)
  • cam_ - общий префикс всех библиотечных функций
  • group - имя группы функций, например info
  • cmd - имя функции в группе (может отсутствовать)
  • addr - строка - IP адрес или DNS имя камеры.
  • params,.. - дополнительные параметры (фиксированное для каждой функции количество)
  • functions,.. - call-back функции вызываемые по приходу информации от камеры или при обнаружении ошибки.

Callback-функции рекомендуется определять анонимно в месте вызова библитечной функции. Например:

cam_info(cam_adr,  //запрос информации о камере
  function(manufacturer, serial, hardware_version, software_version, img_type, rtp_type, mp_type) { //информация пришла
    ...
  },
  function(err) { //ошибка
    ...
  },
  function() { //таймаут
    ...
  },
  function() { //ожидание
    ...
  }
)

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

Рассмотрим пример. Пусть задан массив адресов cams. Мы сначала формируем таблицу а за тем переписываем строки по мере прихода информации.

for(j in cams) {
  function x(i) {
    document.write("<tr id=c"+i+"><td>"+cams[i]+" (wait...)</tr>\n");
    cam_info(cams[i],
      function(manufacturer, hardware_version, software_version, img_type, rtp_type, mp_type) {
        var x=document.getElementById("c"+i);
        x.innerHTML="<th>"+cams[i]+"<td>"+manufacturer+"<td>"+hardware_version+
            "<td>"+software_version+"<td>"+img_type+"<td>"+rtp_type+"<td>"+mp_type;
      },
      function(err,errtxt) {
        var x=document.getElementById("c"+i);
        x.innerHTML="<th>"+cams[i]+"<td>"+err+"<td colspan=5>"+errtxt;
      }
    );
  }
  x(j);
}

Внутри функции x определяется безымянная функция которая обращается к переменной i внешней функци. Если бы эту мы безымянную функцию определяли не внутри функции x то нужная нам переменная цикла (j) в момент вызова безымянной функции получила бы любое значение, но скорее всего последнее которое она получила в цикле. Неправильный пример:

for(i in cams) {
  document.write("<tr id=c"+i+"><td>"+cams[i]+" (wait...)</tr>\n");
  cam_info(cams[i],
    function(manufacturer, hardware_version, software_version, img_type, rtp_type, mp_type) {
      var x=document.getElementById("c"+i);
      x.innerHTML="<th>"+cams[i]+"<td>"+manufacturer+"<td>"+hardware_version+
          "<td>"+software_version+"<td>"+img_type+"<td>"+rtp_type+"<td>"+mp_type;
    },
    function(err,errtxt) {
      var x=document.getElementById("c"+i);
      x.innerHTML="<th>"+cams[i]+"<td>"+err+"<td colspan=5>"+errtxt;
    }
  );
}

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

for(j in cams) {
  var i=j;
  document.write("<tr id=c"+i+"><td>"+cams[i]+" (wait...)</tr>\n");
  cam_info(cams[i],
    function(manufacturer, hardware_version, software_version, img_type, rtp_type, mp_type) {
      var x=document.getElementById("c"+i);
      x.innerHTML="<th>"+cams[i]+"<td>"+manufacturer+"<td>"+hardware_version+
          "<td>"+software_version+"<td>"+img_type+"<td>"+rtp_type+"<td>"+mp_type;
    },
    function(err,errtxt) {
      var x=document.getElementById("c"+i);
      x.innerHTML="<th>"+cams[i]+"<td>"+err+"<td colspan=5>"+errtxt;
    }
  );
}

Инициализация

Нужна ли функция инициализации библиотеки? Думаю что общую инициализацию можно спрятать в сам JS файл библиотеки и такая функция не нужна.

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

Информация о камере

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

Параметры съёмки общие для видео и фото

функции установки/опроса параметров работают с массивами со строковыми индексами или полями объектов.

Имя тип значение
e число[ ? ] выдержка
iq число [ 1-100 ] параметр качества

Одиночные кадры

  • получение кадра с установленными параметрами
  • получение кадра с одновременной установкой параметров

Стримеры

запуск/остановка, параметры стримера

Работа с настройками

Сохранять/восстанавливать с куками и файлами. Файлы у клиента или в камере.

Внутренние функции

эти функции не предлагается использовать, они используются внутри библиотеки

cam_xml_req - Универсальный XML запрос

cam_xml_req(

  • url запроса,
  • function(xml) - вызываестся при получении данных,
  • function(err, errtxt) - вызывается при получении ошибки,
  • function() - вызывается при истечении времени ожидания ответа,
  • function() - вызывается во время ожидания,
  • максимальное время ожидания в тысячных секунды

)

Элементы UI

Слайдер

Двойной слайдер

для задания интервалов

Графический эквалайзер

Фото кадр

Просмотр видео

Универсальный просмотр фото/видео