<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://devzone.nordicsemi.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Import IR transmitter library on nrf52840 thread sdk</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/70375/import-ir-transmitter-library-on-nrf52840-thread-sdk</link><description>Hi, 
 
 I want to make universal AC remote, using nrf52840. 
 I have decoded IR codes of all AC remotes which have been decoded using IRremoteESP8266 library. 
 Since AC IR codes are quite long and each AC vendor has their own IR Protocol, how can I send</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Mon, 18 Jan 2021 15:02:39 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/70375/import-ir-transmitter-library-on-nrf52840-thread-sdk" /><item><title>RE: Import IR transmitter library on nrf52840 thread sdk</title><link>https://devzone.nordicsemi.com/thread/289824?ContentTypeID=1</link><pubDate>Mon, 18 Jan 2021 15:02:39 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:85f0c2e9-9be8-4dbd-bc00-2773d5452f9f</guid><dc:creator>J&amp;#248;rgen Holmefjord</dc:creator><description>&lt;p&gt;No, I&amp;#39;m saying that m_acknowledge_handler is assigned the handler passed as argument&amp;nbsp;acknowledge_handler when drv_ir_init() is called:&lt;/p&gt;
&lt;p&gt;&lt;img alt=" " src="https://devzone.nordicsemi.com/resized-image/__size/320x240/__key/communityserver-discussions-components-files/4/drv_5F00_ir_5F00_init.png" /&gt;&lt;/p&gt;
&lt;p&gt;It is the handler stored in&amp;nbsp;&lt;span&gt;m_acknowledge_handler&amp;nbsp;that is called in&amp;nbsp;drv_ir_send_symbol():&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img alt=" " src="https://devzone.nordicsemi.com/resized-image/__size/320x240/__key/communityserver-discussions-components-files/4/drv_5F00_ir_5F00_send_5F00_symbol.png" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;For the Smart Remote FW, the handler (m_ir_tx_drv_ack_handler) is implemented in m_ir_tx.c, and is passed as an argument to drv_ir_init():&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img alt=" " src="https://devzone.nordicsemi.com/resized-image/__size/320x240/__key/communityserver-discussions-components-files/4/m_5F00_ir_5F00_tx_5F00_init.png" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;So when&amp;nbsp;drv_ir_send_symbol() calls&amp;nbsp;m_acknowledge_handler(), it will actually run&amp;nbsp;m_ir_tx_drv_ack_handler().&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Import IR transmitter library on nrf52840 thread sdk</title><link>https://devzone.nordicsemi.com/thread/289672?ContentTypeID=1</link><pubDate>Mon, 18 Jan 2021 10:23:48 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:268c07dd-f7ba-4364-aa61-8442b0c54173</guid><dc:creator>mj_zen</dc:creator><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;argument in m_acknowledgement handler(m_ir_signal) is passed when i want to send a signal. and drv_ir_init() is called in main &amp;#39;s init once.&lt;/p&gt;
&lt;p&gt;so do you want to say that each time I want to send a pwm signal I should call drv_ir_init and call m_acknowledgement handler there with m_ir_signal as an argument?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Import IR transmitter library on nrf52840 thread sdk</title><link>https://devzone.nordicsemi.com/thread/289602?ContentTypeID=1</link><pubDate>Mon, 18 Jan 2021 02:34:16 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:b359300f-62d8-4b74-8b10-e819cafb1139</guid><dc:creator>mj_zen</dc:creator><description>&lt;p&gt;hi,&lt;/p&gt;
&lt;p&gt;Thank you very much for such quick replies.&lt;/p&gt;
&lt;p&gt;I am writing IR driver for Panasonic AC. It consists of 27 bytes (216 bits) message to be transferred but at receiver end I am receiving 220 bits.&lt;/p&gt;
&lt;p&gt;Following is the driver code..&lt;pre class="ui-code" data-mode="c_cpp"&gt;#include &amp;quot;ir_drv_lib.h&amp;quot;

#include &amp;lt;string.h&amp;gt;
#include &amp;quot;nrf_drv_pwm.h&amp;quot;
#include &amp;quot;ir_config.h&amp;quot;
#include &amp;quot;app_util_platform.h&amp;quot;
#include &amp;quot;nrf_log.h&amp;quot;
#include &amp;quot;nrf_delay.h&amp;quot;
#include &amp;quot;nrf_gpio.h&amp;quot;

STATIC_ASSERT(NRFX_PWM_ENABLED &amp;amp;&amp;amp; NRFX_PWM0_ENABLED);


#define PANASONIC_GUARD_ZEROS        1
#define PANASONIC_AC_BITS            216

#define PANASONIC_TOP_VALUE          27           // 36.7kHz carrier 27usec for 1MHz PWM_CLK 1us
#define PANASONIC_SYMBOL_REPEATS     15            // repeat each symbol 16 times - 16*27.25 = 436us

#define PANASONIC_MARK_SYMBOL        0x800E        // 14/27 usec - duty 1/2
#define PANASONIC_SPACE_SYMBOL       0x8000


#define PANASONIC_REPETION_MAX       0          // X times with 45 ms period
#define PANASONIC_REPETION_TIME      498784     // 498ms = 498784us
#define PANASONIC_REPETION_PERIODS   (PANASONIC_REPETION_TIME / PANASONIC_TOP_VALUE)


const uint16_t PANASONIC_START[] =
        {PANASONIC_MARK_SYMBOL, PANASONIC_MARK_SYMBOL, PANASONIC_MARK_SYMBOL, PANASONIC_MARK_SYMBOL,
         PANASONIC_MARK_SYMBOL, PANASONIC_MARK_SYMBOL, PANASONIC_MARK_SYMBOL, PANASONIC_MARK_SYMBOL,
         PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL};

const uint16_t PANASONIC_ONE[] =
        {PANASONIC_MARK_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL};

const uint16_t PANASONIC_ZERO[] =
        {PANASONIC_MARK_SYMBOL, PANASONIC_SPACE_SYMBOL};

const uint16_t PANASONIC_SECTION_GAP[] =
        {
          PANASONIC_MARK_SYMBOL,  PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL};

const uint16_t PANASONIC_AC_GAP[] =
        { PANASONIC_MARK_SYMBOL,  PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, \
          PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL, PANASONIC_SPACE_SYMBOL};

#define MAX_SEQ_SIZE            ARRAY_SIZE(PANASONIC_START) + \
                                ((PANASONIC_AC_BITS) * MAX(ARRAY_SIZE(PANASONIC_ZERO), ARRAY_SIZE(PANASONIC_ONE))) + \
                                ARRAY_SIZE(PANASONIC_SECTION_GAP)+ \
                                ARRAY_SIZE(PANASONIC_START) + \
                                (PANASONIC_GUARD_ZEROS * ARRAY_SIZE(PANASONIC_AC_GAP))

static nrf_drv_pwm_t m_pwm = CONFIG_IR_TX_PWM_INSTANCE;
static uint16_t m_seq_pwm_values[MAX_SEQ_SIZE];
static nrf_pwm_sequence_t m_seq;
static drv_ir_callback_t m_acknowledge_handler;
static const ir_symbol_t *mp_ir_symbol;
static bool m_pwm_active;
static bool m_enabled_flag;

void DBG_PIN_PULSE(const unsigned int pio) {
    if (IS_IO_VALID(pio)) {
        nrf_gpio_pin_set(pio);
        nrf_delay_us(1);
        nrf_gpio_pin_clear(pio);
    }
}


static void insert_start_symbol(uint16_t **pp_seq) {
    memcpy(*pp_seq, PANASONIC_START, sizeof(PANASONIC_START));
    *pp_seq += ARRAY_SIZE(PANASONIC_START);
}

static void insert_one_symbol(uint16_t **pp_seq) {
    memcpy(*pp_seq, PANASONIC_ONE, sizeof(PANASONIC_ONE));
    *pp_seq += ARRAY_SIZE(PANASONIC_ONE);
}

static void insert_zero_symbol(uint16_t **pp_seq) {
    memcpy(*pp_seq, PANASONIC_ZERO, sizeof(PANASONIC_ZERO));
    *pp_seq += ARRAY_SIZE(PANASONIC_ZERO);
}

static void insert_ac_section_gap(uint16_t **pp_seq) {
    memcpy(*pp_seq, PANASONIC_SECTION_GAP, sizeof(PANASONIC_SECTION_GAP));
    *pp_seq += ARRAY_SIZE(PANASONIC_SECTION_GAP);
}

static void insert_dummy_zero(uint16_t **pp_seq) {
    memcpy(*pp_seq, PANASONIC_AC_GAP, sizeof(PANASONIC_AC_GAP));
    *pp_seq += ARRAY_SIZE(PANASONIC_AC_GAP);
}

static uint16_t PANASONIC_symbol_encoder(const ir_symbol_t *p_sirc_symbol) {
    uint16_t *p_seq;
    uint8_t address;
    int i;

    p_seq = m_seq_pwm_values;
    insert_start_symbol(&amp;amp;p_seq);

    for (int a = 0; a &amp;lt; 8; a++) {
        address = p_sirc_symbol-&amp;gt;ir_command[a];
        NRF_LOG_INFO(&amp;quot;symbol received: %02x&amp;quot;, p_sirc_symbol-&amp;gt;ir_command[a]);
        for (i = 0; i &amp;lt; 8; i++) {
            if (address &amp;amp; 0x01) {
                insert_one_symbol(&amp;amp;p_seq);
            } else {
                insert_zero_symbol(&amp;amp;p_seq);
            }
            address = address &amp;gt;&amp;gt; 1;
        }
    }

    insert_ac_section_gap(&amp;amp;p_seq);
    NRF_LOG_INFO(&amp;quot;insert ac section gap&amp;quot;);
    NRF_LOG_INFO(&amp;quot;insert next header&amp;quot;);
    insert_start_symbol(&amp;amp;p_seq);

    for (int a = 8; a &amp;lt; (p_sirc_symbol-&amp;gt;ir_address); a++) {
        address = p_sirc_symbol-&amp;gt;ir_command[a];
        NRF_LOG_INFO(&amp;quot;symbol received: %02x&amp;quot;, p_sirc_symbol-&amp;gt;ir_command[a]);
        for (i = 0; i &amp;lt; 8; i++) {
            if (address &amp;amp; 0x01) {
                insert_one_symbol(&amp;amp;p_seq);
            } else {
                insert_zero_symbol(&amp;amp;p_seq);
            }
            address = address &amp;gt;&amp;gt; 1;
        }
    }

    for (i = 0; i &amp;lt; PANASONIC_GUARD_ZEROS; i++) {
        insert_dummy_zero(&amp;amp;p_seq);
    }
    NRF_LOG_INFO(&amp;quot;Length of message: %d&amp;quot;, (uint16_t)(p_seq - m_seq_pwm_values));

    return (uint16_t)(p_seq - m_seq_pwm_values);
}


static void pwm_handler(nrf_drv_pwm_evt_type_t event) {
    DBG_PIN_PULSE(CONFIG_IO_DBG_IR_TX_PWM_INT);

    if (((event == NRF_DRV_PWM_EVT_END_SEQ0) || (event == NRF_DRV_PWM_EVT_END_SEQ1)) &amp;amp;&amp;amp; (mp_ir_symbol == NULL)) {
        nrf_drv_pwm_stop(&amp;amp;m_pwm, true); // Stop during repetition gap.
        m_acknowledge_handler(NULL);     // Acknowledge end.
        m_pwm_active = false;

        DBG_PIN_PULSE(CONFIG_IO_DBG_IR_TX_EACK);
    }


    if (event == NRF_DRV_PWM_EVT_FINISHED) {
        if ((mp_ir_symbol == NULL)) {
            // Acknowledge end.
            m_acknowledge_handler(NULL);

            DBG_PIN_PULSE(CONFIG_IO_DBG_IR_TX_EACK);
        }

        m_pwm_active = false;
    }
}

ret_code_t drv_ir_send_symbol(const ir_symbol_t *p_ir_symbol) {
    bool callback_flag = false;
    uint16_t seq_length;

    if (m_enabled_flag != true) {
        return NRF_ERROR_INVALID_STATE;
    }

    CRITICAL_REGION_ENTER();
    mp_ir_symbol = p_ir_symbol;
    if ((mp_ir_symbol == NULL) &amp;amp;&amp;amp; !m_pwm_active) {
        callback_flag = true;
    }
    CRITICAL_REGION_EXIT();

    if (callback_flag) {
        // Acknowledge of prematurely ended sequence - it won&amp;#39;t be acknowledge by handler.
        m_acknowledge_handler(NULL);
        NRF_LOG_INFO(&amp;quot;callback;&amp;quot;);
        DBG_PIN_PULSE(CONFIG_IO_DBG_IR_TX_EACK);
    } else if (mp_ir_symbol) {
        seq_length = PANASONIC_symbol_encoder(mp_ir_symbol);

       // NRF_LOG_INFO(&amp;quot;Message to be send: %d, %d&amp;quot;, mp_ir_symbol-&amp;gt;ir_address, mp_ir_symbol-&amp;gt;ir_command);
        if (seq_length &amp;gt; 0) {
            m_seq.values.p_common = m_seq_pwm_values;
            m_seq.length = seq_length;
            m_seq.repeats = PANASONIC_SYMBOL_REPEATS;
            m_seq.end_delay = PANASONIC_REPETION_PERIODS - ((PANASONIC_SYMBOL_REPEATS + 1) * seq_length);
        } else {
            return NRF_ERROR_NOT_SUPPORTED;
        }

        m_pwm_active = true;
        NRF_LOG_INFO(&amp;quot;return from drv_ir_send_symbol 1;&amp;quot;);

        nrf_drv_pwm_simple_playback(&amp;amp;m_pwm, &amp;amp;m_seq, PANASONIC_REPETION_MAX,
                                    NRF_DRV_PWM_FLAG_SIGNAL_END_SEQ0 | NRF_DRV_PWM_FLAG_SIGNAL_END_SEQ1);
        NRF_LOG_INFO(&amp;quot;return from drv_ir_send_symbol 2 ;&amp;quot;);
        m_acknowledge_handler(mp_ir_symbol);
        NRF_LOG_INFO(&amp;quot;return from drv_ir_send_symbol 3;&amp;quot;);

        DBG_PIN_PULSE(CONFIG_IO_DBG_IR_TX_SACK);
    }

    NRF_LOG_INFO(&amp;quot;return from drv_ir_send_symbol ;&amp;quot;);
    return NRF_SUCCESS;
}

ret_code_t drv_ir_enable(void) {
    ASSERT(m_enabled_flag == false);

    m_enabled_flag = true;
    nrf_pwm_enable(m_pwm.p_registers);

    return NRF_SUCCESS;
}

ret_code_t drv_ir_disable(void) {
    NRF_LOG_INFO(&amp;quot;PWM disabled 1 &amp;quot;);

    ASSERT(m_enabled_flag == true);

    NRF_LOG_INFO(&amp;quot;PWM disabled&amp;quot;);
    nrf_pwm_disable(m_pwm.p_registers);
    m_enabled_flag = false;

    return NRF_SUCCESS;
}

ret_code_t drv_ir_init(drv_ir_callback_t acknowledge_handler) {
    ret_code_t status;

    static const nrf_drv_pwm_config_t config =
            {
                    .output_pins =
                            {
                                    IS_IO_VALID(CONFIG_IO_IR_TX_LED) ? CONFIG_IO_IR_TX_LED : NRF_DRV_PWM_PIN_NOT_USED,
                                    NRF_DRV_PWM_PIN_NOT_USED,
                                    NRF_DRV_PWM_PIN_NOT_USED,
                                    NRF_DRV_PWM_PIN_NOT_USED,
                            },

                    .irq_priority   = 7,
                    .base_clock     = NRF_PWM_CLK_1MHz,
                    .count_mode     = NRF_PWM_MODE_UP,
                    .top_value      = PANASONIC_TOP_VALUE,
                    .load_mode      = NRF_PWM_LOAD_COMMON,
                    .step_mode      = NRF_PWM_STEP_AUTO
            };

    if (acknowledge_handler == NULL) {
        return NRF_ERROR_INVALID_PARAM;
    }

    m_acknowledge_handler = m_acknowledge_handler;
    m_enabled_flag = false;
    m_pwm_active = false;
    mp_ir_symbol = NULL;

    status = nrf_drv_pwm_init(&amp;amp;m_pwm, &amp;amp;config, pwm_handler);
    if (status == NRF_SUCCESS) {
        nrf_pwm_disable(m_pwm.p_registers);
    }

    return status;
}
&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Structure type for data is&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;typedef struct
{
    uint8_t ir_command[27];  /**&amp;lt; panasonic signl to be send */
    uint8_t ir_address;  /**&amp;lt; no of bytes to be sent*/
} ir_symbol_t;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Could you please help me identify the issue here.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Import IR transmitter library on nrf52840 thread sdk</title><link>https://devzone.nordicsemi.com/thread/289583?ContentTypeID=1</link><pubDate>Sun, 17 Jan 2021 18:36:25 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:ac8be5c7-264f-417f-a4f7-f9368d23c09d</guid><dc:creator>J&amp;#248;rgen Holmefjord</dc:creator><description>&lt;p&gt;&lt;span&gt;m_acknowledge_handler is called in&amp;nbsp;drv_ir_send_symbol, but you need to implement it elsewhere in the application.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;m_acknowledge_handler is assigned the argument&amp;nbsp;acknowledge_handler in&amp;nbsp;drv_ir_init() in the bottom of drv_ir_sirc.c file. If you do not pass a handler to this function when you call&amp;nbsp;drv_ir_init() from your application, it will jump to a random address (or possibly the NULL pointer), which most likely will cause a HardFault.&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Import IR transmitter library on nrf52840 thread sdk</title><link>https://devzone.nordicsemi.com/thread/289569?ContentTypeID=1</link><pubDate>Sun, 17 Jan 2021 09:30:48 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:93f7f229-dd31-4165-b0ac-f7c52a67f6c6</guid><dc:creator>mj_zen</dc:creator><description>&lt;p&gt;This m_acknowledgement_handler is passed in &amp;quot;drv_ir_send_symbol&amp;quot; in drv_ir_sirc.c file.&lt;/p&gt;
&lt;p&gt;In m_acknowledge_handler(mp_ir_symbol), ir signal to be transmitted is passed in this m_acknowledge handler. &lt;/p&gt;
&lt;p&gt;But after transmitting the signal once, code is stuck in this handler&amp;nbsp; and keeps on sending garbage values and my board reboots after sometime because of Watchdog which is enabled in main().&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Please suggest what could be done.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Import IR transmitter library on nrf52840 thread sdk</title><link>https://devzone.nordicsemi.com/thread/289493?ContentTypeID=1</link><pubDate>Fri, 15 Jan 2021 15:52:51 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:d0270e6f-9fdf-4389-ba4b-64b241a5d281</guid><dc:creator>J&amp;#248;rgen Holmefjord</dc:creator><description>&lt;p&gt;How did you implement the acknowledgement handler? This should be passed to&amp;nbsp;drv_ir_init(), see&amp;nbsp;m_ir_tx_drv_ack_handler() in m_ir_tx.c.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Import IR transmitter library on nrf52840 thread sdk</title><link>https://devzone.nordicsemi.com/thread/289203?ContentTypeID=1</link><pubDate>Thu, 14 Jan 2021 12:47:55 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:91f8d4b1-2e87-4b1e-9620-1eff5394d44e</guid><dc:creator>mj_zen</dc:creator><description>&lt;p&gt;Hi&lt;/p&gt;
&lt;p&gt;Thank you for the help.&lt;/p&gt;
&lt;p&gt;I have imported the IR driver in NRF_SDK_for_Thread_and_Zigbee and able to send SIRC command. But once the PWM signal is initiated it doesn&amp;#39;t stop. After sending the SIRC signal, it keeps on sending some garbage value. it is stuck in m_acknowledgement_handler.&lt;/p&gt;
&lt;p&gt;How to get out of acknowledgement handler?&lt;/p&gt;
&lt;p&gt;Also I want to control AC using this library.&lt;/p&gt;
&lt;p&gt;In AC signals instead of command and address, state is given, can you help me in conversion of this data?&lt;/p&gt;
&lt;p&gt;Basically I want to add Panasonic AC IR protocol driver, do you know to add any AC protocol IR driver in it.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Import IR transmitter library on nrf52840 thread sdk</title><link>https://devzone.nordicsemi.com/thread/288923?ContentTypeID=1</link><pubDate>Wed, 13 Jan 2021 13:01:46 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:79316bde-30e5-4f75-8d65-743e4ad04625</guid><dc:creator>J&amp;#248;rgen Holmefjord</dc:creator><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;The best solution would be to use the PWM peripheral, as this can output sequences directly from RAM without any CPU intervention.&lt;/p&gt;
&lt;p&gt;We have implemented IR in our Smart Remote 3 reference design. I would recommend you to have a look at the&amp;nbsp;&lt;a title="Infrared transmitter" href="https://infocenter.nordicsemi.com/topic/com.nordic.infocenter.sr3nrf52.firmware/ir.html?cp=14_2_1_2_9"&gt;Infrared transmitter&lt;/a&gt;&amp;nbsp;documentation, and download the &lt;a href="https://www.nordicsemi.com/Software-and-tools/Reference-Designs/nRFready-Smart-Remote-3-for-nRF52-Series/Download#infotabs"&gt;firmware&lt;/a&gt;, to look at how it is implemented in the code.&lt;/p&gt;
&lt;p&gt;Best regards,&lt;br /&gt;Jørgen&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>