Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,6 @@ SRC_USERMOD += \
ir/rmtlib/esp32_rmt_common.c \
ir/rmtlib/rmtlib_nec.c \
ir/rmtlib/rmtlib_rc5.c \
ir/rmtlib/rmtlib_samsung.c
ir/rmtlib/rmtlib_samsung.c \
ir/rmtlib/rmtlib_sony.c \
ir/rmtlib/rmtlib_raw.c
39 changes: 39 additions & 0 deletions ports/esp32/boards/LILYGO_T_WATCH_2020_V1/c_drivers/ir/mpy.c
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,20 @@ STATIC mp_obj_t mp_rmtlib_samsung_send(size_t mp_n_args, const mp_obj_t *mp_args
STATIC MP_DEFINE_CONST_LV_FUN_OBJ_VAR(mp_rmtlib_samsung_send_obj, 1, mp_rmtlib_samsung_send, rmtlib_samsung_send);


/*
* ir extension definition for:
* void rmtlib_sony_send(unsigned long data)
*/

STATIC mp_obj_t mp_rmtlib_sony_send(size_t mp_n_args, const mp_obj_t *mp_args)
{
unsigned long data = (unsigned long)mp_obj_get_int(mp_args[0]);
rmtlib_sony_send(data);
return mp_const_none;
}

STATIC MP_DEFINE_CONST_LV_FUN_OBJ_VAR(mp_rmtlib_sony_send_obj, 1, mp_rmtlib_sony_send, rmtlib_sony_send);


/*
* ir extension definition for:
Expand All @@ -819,6 +833,29 @@ STATIC mp_obj_t mp_rmtlib_rc5_send(size_t mp_n_args, const mp_obj_t *mp_args)
STATIC MP_DEFINE_CONST_LV_FUN_OBJ_VAR(mp_rmtlib_rc5_send_obj, 1, mp_rmtlib_rc5_send, rmtlib_rc5_send);


/*
* ir extension definition for:
* void rmtlib_raw_send(int frequency, int data[])
*/

STATIC mp_obj_t mp_rmtlib_raw_send(size_t mp_n_args, const mp_obj_t *mp_args)
{
// retrieve frequency from mp_args
unsigned int frequency = (unsigned int)mp_obj_get_int(mp_args[0]);

// retrieve data from mp_args
mp_uint_t data_len;
mp_obj_t *data;
mp_obj_get_array(mp_args[1], &data_len, &data);

// call rmtlib_raw_send
rmtlib_raw_send(frequency, (int *)data, (int)data_len);
return mp_const_none;
}

STATIC MP_DEFINE_CONST_LV_FUN_OBJ_VAR(mp_rmtlib_raw_send_obj, 2, mp_rmtlib_raw_send, rmtlib_raw_send);



/*
* ir module definitions
Expand All @@ -829,6 +866,8 @@ STATIC const mp_rom_map_elem_t ir_globals_table[] = {

{ MP_ROM_QSTR(MP_QSTR_rmtlib_nec_send), MP_ROM_PTR(&mp_rmtlib_nec_send_obj) },
{ MP_ROM_QSTR(MP_QSTR_rmtlib_samsung_send), MP_ROM_PTR(&mp_rmtlib_samsung_send_obj) },
{ MP_ROM_QSTR(MP_QSTR_rmtlib_sony_send), MP_ROM_PTR(&mp_rmtlib_sony_send_obj) },
{ MP_ROM_QSTR(MP_QSTR_rmtlib_raw_send), MP_ROM_PTR(&mp_rmtlib_raw_send_obj) },
{ MP_ROM_QSTR(MP_QSTR_rmtlib_rc5_send), MP_ROM_PTR(&mp_rmtlib_rc5_send_obj) }


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@
#define RECEIVE_SAMSUNG 0
#define SEND_RC5 1
#define RECEIVE_RC5 0
#define SEND_SONY 1
#define RECEIVE_SONY 0
#define SEND_RAW 1

#ifdef __cplusplus
extern "C" {
Expand Down Expand Up @@ -44,6 +47,14 @@ void rmtlib_rc5_send(unsigned long data);
void rmtlib_rc5_receive();
#endif

#ifdef SEND_SONY
void rmtlib_sony_send(unsigned long data);
#endif

#ifdef SEND_RAW
void rmtlib_raw_send(unsigned int frequency, int data[], int data_len);
#endif

#ifdef __cplusplus
} // extern C
#endif
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
#include "esp32_rmt_common.h"
#include "esp32_rmt_remotes.h"

#include <stdio.h>
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "freertos/semphr.h"

#include "esp_err.h"
#include "esp_log.h"

#include "driver/rmt.h"
#include "driver/periph_ctrl.h"
#include "soc/rmt_reg.h"

#include "freertos/ringbuf.h"

#define TX_PIN_SSSS 13
const char* RAW_TAG = "RAW";

/*
* SEND
*/

#if SEND_RAW

void raw_tx_init(gpio_num_t gpio_num, unsigned int frequency)
{
rmt_config_t rmt_tx;
rmt_tx.channel = RMT_TX_CHANNEL;
rmt_tx.gpio_num = gpio_num;
rmt_tx.mem_block_num = 1;
rmt_tx.clk_div = RMT_CLK_DIV;
rmt_tx.tx_config.loop_en = false;
rmt_tx.tx_config.carrier_duty_percent = RMT_CARRIER_DUTY;
rmt_tx.tx_config.carrier_freq_hz = frequency;
rmt_tx.tx_config.carrier_level = RMT_CARRIER_LEVEL_HIGH;
rmt_tx.tx_config.carrier_en = RMT_TX_CARRIER_EN;
rmt_tx.tx_config.idle_level = RMT_IDLE_LEVEL_LOW;
rmt_tx.tx_config.idle_output_en = true;
rmt_tx.rmt_mode = RMT_MODE_TX;

rmt_tx_init(&rmt_tx);
}

void rmtlib_raw_build_items(rmt_item32_t* item, int data[], int data_len)
{
for(int i=0; i < data_len; i+=2) {
// I don't know why I need to divide by two each value oO
rmt_fill_item_level(item, data[i] >> 1, data[i+1] >> 1);
item++;
}
}

void rmtlib_raw_send(unsigned int frequency, int data[], int data_len)
{
vTaskDelay(10);
raw_tx_init(TX_PIN_SSSS, frequency);
int item_num = data_len/2;
size_t item_size = (sizeof(rmt_item32_t) * item_num * RMT_TX_DATA_NUM);
rmt_item32_t* item = (rmt_item32_t*) malloc(item_size);
memset((void*) item, 0, item_size);

rmtlib_raw_build_items(item, data, data_len);

esp_log_level_set(RAW_TAG, ESP_LOG_INFO);
ESP_LOGI(RAW_TAG, "RMT TX DATA");

rmt_write_items(RMT_TX_CHANNEL, item, item_num * RMT_TX_DATA_NUM, true);
rmt_wait_tx_done(RMT_TX_CHANNEL, 150);
free(item);
rmt_driver_uninstall(RMT_TX_CHANNEL);
}

#endif
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
#include "esp32_rmt_common.h"
#include "esp32_rmt_remotes.h"

#include <stdio.h>
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "freertos/semphr.h"

#include "esp_err.h"
#include "esp_log.h"

#include "driver/rmt.h"
#include "driver/periph_ctrl.h"
#include "soc/rmt_reg.h"

#include "freertos/ringbuf.h"

#define TX_PIN_SSSS 13
#define SONY_BITS 12
#define SONY_HEADER_HIGH_US 2400
#define SONY_HEADER_LOW_US 600
#define SONY_BIT_ONE_HIGH_US 1200
#define SONY_BIT_ONE_LOW_US 600
#define SONY_BIT_ZERO_HIGH_US 600
#define SONY_BIT_ZERO_LOW_US 600
//
#define SONY_DATA_ITEM_NUM 13 /*!< code item number: 3 bits header + 12bit data */
#define SONY_BIT_MARGIN 60 /* deviation from signal timing */

const char* SONY_TAG = "SONY";

/*
* SEND
*/

#if SEND_SONY

void sony_fill_item_header(rmt_item32_t* item)
{
rmt_fill_item_level(item, SONY_HEADER_HIGH_US, SONY_HEADER_LOW_US);
}

void sony_fill_item_bit_one(rmt_item32_t* item)
{
rmt_fill_item_level(item, SONY_BIT_ONE_HIGH_US, SONY_BIT_ONE_LOW_US);
}

void sony_fill_item_bit_zero(rmt_item32_t* item)
{
rmt_fill_item_level(item, SONY_BIT_ZERO_HIGH_US, SONY_BIT_ZERO_LOW_US);
}

void sony_build_items(rmt_item32_t* item, uint32_t cmd_data)
{
sony_fill_item_header(item++);

// parse from left to right 32 bits (0x80000000)
uint32_t mask = 0x01;
mask <<= SONY_BITS - 1;

for (int j = 0; j < SONY_BITS; j++) {
if (cmd_data & mask) {
sony_fill_item_bit_one(item);
} else {
sony_fill_item_bit_zero(item);
}
item++;
mask >>= 1;
}
}

void sony_tx_init(gpio_num_t gpio_num)
{
rmt_config_t rmt_tx;
rmt_tx.channel = RMT_TX_CHANNEL;
rmt_tx.gpio_num = gpio_num;
rmt_tx.mem_block_num = 1;
rmt_tx.clk_div = RMT_CLK_DIV;
rmt_tx.tx_config.loop_en = false;
rmt_tx.tx_config.carrier_duty_percent = RMT_CARRIER_DUTY;
rmt_tx.tx_config.carrier_freq_hz = RMT_CARRIER_FREQ_38;
rmt_tx.tx_config.carrier_level = RMT_CARRIER_LEVEL_HIGH;
rmt_tx.tx_config.carrier_en = RMT_TX_CARRIER_EN;
rmt_tx.tx_config.idle_level = RMT_IDLE_LEVEL_LOW;
rmt_tx.tx_config.idle_output_en = true;
rmt_tx.rmt_mode = RMT_MODE_TX;

rmt_tx_init(&rmt_tx);
}

void rmtlib_sony_send(unsigned long data)
{
vTaskDelay(10);
sony_tx_init(TX_PIN_SSSS);

esp_log_level_set(SONY_TAG, ESP_LOG_INFO);
ESP_LOGI(SONY_TAG, "RMT TX DATA");

size_t size = (sizeof(rmt_item32_t) * SONY_DATA_ITEM_NUM * RMT_TX_DATA_NUM);
rmt_item32_t* item = (rmt_item32_t*) malloc(size);
memset((void*) item, 0, size);

sony_build_items(item, data);

int item_num = SONY_DATA_ITEM_NUM * RMT_TX_DATA_NUM;
rmt_write_items(RMT_TX_CHANNEL, item, item_num, true);
rmt_wait_tx_done(RMT_TX_CHANNEL, 150);
free(item);
rmt_driver_uninstall(RMT_TX_CHANNEL);
}

#endif