Нашел фичу (@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 нравится это.
  12. Nagh

    Nagh Нерд

    Я, конечно, дико извиняюсь, такая дискуссия и всё-такое. Но уже близится 2022, а баг и ныне там. Есть планы по исправлению?
     
  13. b707

    b707 Гуру

    вряд ли, амперка забросила форум
    Рецепт лечения дан в сообщении #9 - используйте analogWrite(<port>,<value>)
     
    Konkery нравится это.
  14. Nagh

    Nagh Нерд

    Ну, рецептов лечения, на самом деле сильно больше. Тут хотелось бы, чтобы стандартные библиотеки работали без ошибок.
    Но забросили, так забросили. Жаль, казалось у нас могут хоть что-то сделать нормально.
     
  15. b707

    b707 Гуру

    попробуйте обратиться в поддержку напрямую, форум они не читают уже года два
     
  16. Nagh

    Nagh Нерд

    Да, спасибо, попробую именно так и сделать.
     
  17. Nagh

    Nagh Нерд

    В общем написал в поддержку. Пообещали исправить.
    Сегодня проверил, на моём устройстве починилось, так что по идее этот вопрос закрыт.
    Спасибо!
     
    b707 нравится это.
  18. Konkery

    Konkery Гик

    Дело не в количестве "рецептов". Дело в правильном подходе. Я своего ребенка в принципе учу использовать сторонние библиотеки по минимуму. Изучая API программист понимает как на самом деле это работает и это сильно его меняет, укрепляет профессиональные навыки, экспертизу. Без библиотек конечно не обойтись в современной разработке, но в данном случае это легко обходится простым использованием API, а временные затраты на изучения описания библиотеки и API, равнозначны, при том что описание библиотеки не редко отстает от реализации самой библиотеки (не раз писал на данном форуме о таких примерах) а API использует и проверяет не соизмеримо большая аудитория.
     
  19. Nagh

    Nagh Нерд

    Вы путаете тёплое с мягким. Лично я сюда пришел для исправления ошибки в наборе "Йода".
    Этот набор состоит из некоторого количества железок, ПО и обучающей документации, причем это всё на очень раннем уровне.
    Поэтому важно, чтобы при прохождения обучения по этому набору, человек не тыкался в проблемы набора.

    А что касается вашего комментария, то могу прокомментировать так - изучение программирования строится немножко совсем иначе, чем предлагается в программировании этих железок. И изучать программирование по примерам кода - это очень плохой вариант обучения.
    Библиотеки - это способ не изобретать велосипед заново, использовать сторонние библиотеки можно и нужно по максимуму. Да, нужно тщательно подходить к выбору библиотеки и писать свою библиотеку, если подходящей нет. А принимать решение, насколько глубоко вам лезть в потроха различных вещей нужно по конкретной задаче. И для вас это никогда не будет проблемой, если вы получили фундаментальные знания, а не пытаетесь учиться по примерам.
     
  20. Konkery

    Konkery Гик

    По мне это уже холивар чистой воды)
    Но все же прокомментирую. Как правильно учить человека, этот вопрос на который нет точного ответа, ни у кого. Могу сказать за себя, у меня 20 с лишним лет стажа, большая часть из которых в роли программиста, разработчика систем реального времени и руководителя компании. Сын начал изучать робототехнику ровно в 7 лет, мы с ним осознанно выбрали, для старта платформу Espruino и ее аппаратный форк Iskra/Амперка. С самого начала там были не стыковки в библиотеках, в конце концов библиотеки не их коммерческий продукт, так что воспринимали мы их как есть. И опять же с самого начала я показывал как "на самом" деле устроена инфраструктура платформы и на аппаратном и программном уровне.
    Что касается
    то не согласен в принципе. Библиотека - это совсем не о велосипедах, будь это так не было бы множества библиотек активно развивающихся параллельный и длительное время поддерживаемое сообществом, а в реальности на каждой платформе ситуация обстоит именно так. Если попытаться дать определение назначения, то одно из них могло бы звучать так, библиотека это инструмент, не более и не менее. Но как и в любом деле для каждой задачи существует не один инструмент для решения, какой выбирать решение за вами.
    Объяснить ребенку (у которого нулевой опыт),что такое require, задача не тривиальная. А вот объяснить как работает команда управления ШИМ задача вполне решаемая. Более того, очень быстро изучающий натыкается на желание "что нить поменять в примере" и в результате такого библиотека уже не справляется.
    также не согласен с
    где написано что изучать нужно так ? Процесс изучения полностью в зоне вашей ответственности, в наборе просто приведены лишь примеры, вы вольны их и реализовать по своему и строить процесс обучения как вы считаете нужным. В заключение отмечу, чтио факультативно читаю начальным классам курс робототехники, это дети 3-7 классов, так что немного разбираюсь в том о чем выше написал)