• Как работает библиотека Irremote.h?

    Можно открыть библиотеку и посмотреть. По умолчанию на винде в C:\Program Files (x86)\Arduino\libraries\RobotIRremote\srcI\IRremote.cpp
    Исходя из беглого анализа, то:
    // initialization
    void IRrecv::enableIRIn() {
      cli();
      // setup pulse clock timer interrupt
      //Prescale /8 (16M/8 = 0.5 microseconds per tick)
      // Therefore, the timer interval can range from 0.5 to 128 microseconds
      // depending on the reset value (255 to 0)
      TIMER_CONFIG_NORMAL();
    
      //Timer2 Overflow Interrupt Enable
      TIMER_ENABLE_INTR;
    
      TIMER_RESET;
    
      sei();  // enable interrupts
    
      // initialize state machine variables
      irparams.rcvstate = STATE_IDLE;
      irparams.rawlen = 0;
    
      // set pin modes
      pinMode(irparams.recvpin, INPUT);
    }
    
    //само прерывание
    ISR(TIMER_INTR_NAME)
    {
      TIMER_RESET;
    
      uint8_t irdata = (uint8_t)digitalRead(irparams.recvpin);
    
      irparams.timer++; // One more 50us tick
      if (irparams.rawlen >= RAWBUF) {
        // Buffer overflow
        irparams.rcvstate = STATE_STOP;
      }
      switch(irparams.rcvstate) {
      case STATE_IDLE: // In the middle of a gap
        if (irdata == MARK) {
          if (irparams.timer < GAP_TICKS) {
            // Not big enough to be a gap.
            irparams.timer = 0;
          } 
          else {
            // gap just ended, record duration and start recording transmission
            irparams.rawlen = 0;
            irparams.rawbuf[irparams.rawlen++] = irparams.timer;
            irparams.timer = 0;
            irparams.rcvstate = STATE_MARK;
          }
        }
        break;
      case STATE_MARK: // timing MARK
        if (irdata == SPACE) {   // MARK ended, record time
          irparams.rawbuf[irparams.rawlen++] = irparams.timer;
          irparams.timer = 0;
          irparams.rcvstate = STATE_SPACE;
        }
        break;
      case STATE_SPACE: // timing SPACE
        if (irdata == MARK) { // SPACE just ended, record it
          irparams.rawbuf[irparams.rawlen++] = irparams.timer;
          irparams.timer = 0;
          irparams.rcvstate = STATE_MARK;
        } 
        else { // SPACE
          if (irparams.timer > GAP_TICKS) {
            // big SPACE, indicates gap between codes
            // Mark current code as ready for processing
            // Switch to STOP
            // Don't reset timer; keep counting space width
            irparams.rcvstate = STATE_STOP;
          } 
        }
        break;
      case STATE_STOP: // waiting, measuring gap
        if (irdata == MARK) { // reset gap timer
          irparams.timer = 0;
        }
        break;
      }
    
      if (irparams.blinkflag) {
        if (irdata == MARK) {
          BLINKLED_ON();  // turn pin 13 LED on
        } 
        else {
          BLINKLED_OFF();  // turn pin 13 LED off
        }
      }
    }

    Идет запуск таймера с периодом 0,5мкс и разрешение прерываний + соответственно чтение состояний высокий/низкий уровень. А дальше уже функции разгребания полученных MARK и SPACE.

    Т.е. до функций декодирование работает просто, как лог. анализатор, читая лог. уровни каждые 50мкс и сохраняя их.
    uint8_t irdata = (uint8_t)digitalRead(irparams.recvpin);


    Аналогично можно узнать о работе других библиотек.
    Ответ написан
    Комментировать
  • Автозаполнение с элементом div'a?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Сравнительно недавно делал похожее на jQuery UI Autocomplete
    40b3f5af75ea497faf1798f8cfb3fe23.png

    Необходимо переопределить метод _renderItem, отвечающий за формирование элементов выпадающего списка:
    $('#search-query').autocomplete({ ... }).autocomplete("instance")._renderItem = function(ul, item) {
      var menuItem = $('<li>');
      if (item.icon)
        menuItem.append('<img src="' + item.icon + '">');
      else
        menuItem.append('<img src="/static/img/empty_64x64.png">');
      menuItem
        .append('<a href="' + item.url + '">' + shorten(item.label, 25) + '<br><span>' + shorten(item.desc, 80) + '</span></a>')
        .appendTo(ul);
      return menuItem;
    };


    Для простоты выбросил из примера ajax и категории https://jsfiddle.net/TheDeadOne/1Lox6x8f/
    Ответ написан
    1 комментарий
  • Открытие поиска на сайте?

    .active {
        font-weight: 700;
    }
    $(function() {
        $('#search').click(function(e) {
            var row = $('#search_block');
            if (row.is(':visible')) {
                row.css('display', 'none');
                $(this).removeClass('active');
            }
            else {
                row.css('display', 'block');
                $(this).addClass('active');
            }
            e.stopPropagation();
            return false;
        });
    });
    <div id="search_block" style="display: none;">Search</div>
    <nav>
        <ul>
            <li><a href="#">Home</a></li>
            <li><a href="#">About</a></li>
            <li><a href="#">Contact</a></li>
            <li><a href="#" id="search">Search</a></li>
        </ul>
    </nav>
    Ответ написан
    Комментировать
  • Как в photoshop вставить картинку в монитор (веб-дизайн)?

    torrie
    @torrie
    Всё знаю, всё умею
    www.instantshift.com/2014/03/21/free-macbook-mocku... качайте и вставляйте картинку на нужный слой, предварительно правильно оттранспортировав(ctrl+t)
    Ответ написан
    Комментировать
  • Как написать сценарий в linux, формирующий список файлов и записывающий в другой файл .txt?

    @korjavin
    #!/bin/sh
    ls > /path/to/file.txt
    pwd >> /path/to/file.txt
    date >> /path/to/file.txt
    Ответ написан
    Комментировать