Нашел фичу (@amperka/led)

Тема в разделе "Iskra JS, Espruino, Йодо", создана пользователем Winmarrow, 5 ноя 2017.

  1. Winmarrow

    Winmarrow Нерд

    Купив ребёнку няшку, решил сам поковыряться, и на втором эксперименте с диодом (@amperka/led) получил неожиданный результат. Согласно вике, метод "Led.brightness([value])" - устанавливает или возвращает яркость свечения. Яркость устанавливается в условных единицах в диапазоне [0.0; 1.0].

    Код из файла библиотеки (http://js.amperka.ru/modules/@amperka/led.js)
    ...
    Код (Javascript):
    Led.prototype.brightness = function(value) {
      if (arguments.length === 0) {
        return this._brightness;
      }

      value = Math.max(0.0, Math.min(value, 1.0));
      this._brightness = value;
      this._update();

      return this;
    };
    ...

    Однако все мои попытки получить значение яркости из объекта (var brightness = лед.brightness();) потерпели поражение. Может arguments.length не вычисляются, то ли дело в прошивке (обновил до последней 29.10), но функция устанавливает значение яркости в NaN (само собой разумеющиеся при отсутствии значения аргумента в скобках). После этого диод "виснет" - не регистрирует на любые команды.

    Пример смотрите ниже:
    [​IMG]
    П.С, шагать кнопкой бтн1
    П.П.С. ну, либо я дибил - делаю что то не так
     

    Вложения:

    Последнее редактирование: 5 ноя 2017
  2. Morgan

    Morgan Гик

    Не, тут как в Ардуино с delay'ями и while(true) не работает. Надо через setTimeout или setInterval.

    Код ниже поможет разобраться как связать кнопку со светодиодом.

    Код (Javascript):

    var myButton = require('@amperka/button').connect(BTN1, {
        holdTime: 0.5
    });

    var myLed = require('@amperka/led').connect(P8);
    var brightness = 0.1

    myButton.on('press', function() {
        console.log("I'm just pressed");
        myLed.brightness(brightness);
        brightness += 0.1;
        if (brightness > 1) brightness = 0;
    });

    myButton.on('hold', function() {
        console.log("I'm hold down for 0.5 seconds");
        myLed.toggle();
    });
     
    А то что led.brightness() возвращает объект, а не значение яркости — так и должно быть. Просто в документации ошибка) Поправлю на днях. Спасибо
     
    arkadyf нравится это.
  3. sys

    sys Злобный Буратино Модератор

    Вы волшебник! Такой магии кода я давно не видел :D
    а зачем вам wait(500) вы же и так все стопорите опросом кнопки?

    а по поводу возврата значения беда в том что есть аргумент или нет arguments.length в данном случае всегда вернет 1... объект заполняется либо определенным значением либо неопределенным...
    условие сработает только если
    Код (Javascript):
    Led.prototype.brightness = function(value) {
      if (!arguments.toString()) {
        return this._brightness;
      }

      value = Math.max(0.0, Math.min(value, 1.0));
      this._brightness = value;
      this._update();

      return this;
    };
     
    arkadyf нравится это.
  4. sys

    sys Злобный Буратино Модератор

    нет. там не просто led.brightness() объект возвращает, там еще и значению яркости NaN присваевается... сбой происходит из-за несрабатывания условия argumetns.length===0 и дальнейшего выполнения кода где value неопределен... выше я код костыля условия выложил. Можно было бы isNaN(arguments) использовать, но она не гарантирует полное отсутствие аргумента, т.к. под условия могут попасть и нечисловые переменнные...
     
    Последнее редактирование: 5 ноя 2017
    arkadyf нравится это.
  5. Winmarrow

    Winmarrow Нерд

    Я не волшебник, в моём резюме просто написано:
    ...
    "- nojavascript developer" ;)
    ...

    1. Я только открыл инструкцию по искре
    => не знаком с вашими библиотеками и их событиями
    => узнал что то новое, спасибо Морган, лучше раньше, чем позже.
    2. Код выполнял свою демонстративную функцию (считывание значения кнопки не стопорит) ... да это уже не важно.
    Главное я указал на ошибку в модуле и привлёк внимание заголовком многих, но не вас:(.

    Sys, я думаю это некорректное решение => свой вариант привожу ниже

    Код (Javascript):
    Led.prototype.brightness = function(value) {
      if (typeof value === 'undefined') {
        return this._brightness;
      }

      value = Math.max(0.0, Math.min(value, 1.0));
      this._brightness = value;
      this._update();

      return this;
    };
    Этот вариант гарантирует обработку ( пусто ) 100%:cool:

    Прошу исправить модуль
     
    Morgan и sys нравится это.
  6. sys

    sys Злобный Буратино Модератор

    Не обижайтесь. Я ни в коем случае не хотел Вас обидеть. Просто действительно необычный код получился...

    while(!BTN1.read()) - не асинхронная операция, поэтому выполняя ее интерпретатор приостанавливает работу остального кода, пока не сработает антиусловие... можете проверить - запустите ее в консоле IDE и Вы увидите, что интерпретатор "замрет" в ожидании нажатия и не даст Вам дальше с ним работать.

    По коду модуля. Согласен, у Вас более красивое решение :) Хотя мой вариант тоже рабочий. Может тогда универсальное решение сделать без привязки к имени?
    Код (Javascript):
     if (typeof arguments[0] === 'undefined') {
        return this._brightness;
      }
    Не?
     
    Последнее редактирование: 5 ноя 2017
    arkadyf нравится это.
  7. Winmarrow

    Winmarrow Нерд

    Главное что бы исправили, а решение по поводу кода пусть делают специалисты Амперки, я уже писал что я в этом не сильно разбираюсь, тем более что вы сами ответ писали.
     
  8. Morgan

    Morgan Гик

    да, что-то я пропустил первый return, только return this увидел
     
  9. Konkery

    Konkery Гик

    Сын второй год занимается с IskraJS, начинал с Йода и примеров в брошюре.
    Код установки яркости Led.brightness(<value>) не работал никогда,поэтому
    он по максимуму использует базовые ф-и espruino, в данном случае analogWrite(<port>,<value>)
     
    arkadyf нравится это.
  10. Yatman

    Yatman Нуб

    Тоже столкнулся с этим... Только начал изучать эту штуку и потерял довольно много времени пока понял что баг не у меня. Особенно доставила документация.
    Ещё иногда зависает диод если установить яркость 1 или больше..
     
  11. SportyDaa

    SportyDaa Нерд

    Извиняюсь за глупый вопрос...
    А исходники библиотек есть где посмотреть?

    Сам спросил - сам ответил
    http://js.amperka.ru/modules/@amperka/led.js
     
    Konkery и arkadyf нравится это.