From de1fff5d8c1335f7d42c16bafb0d5e083c17c222 Mon Sep 17 00:00:00 2001 From: Yoann Ono Date: Sun, 30 Aug 2020 21:54:47 +0200 Subject: [PATCH] Add SONY and RAW encoding --- .../c_drivers/ir/micropython.mk | 4 +- .../LILYGO_T_WATCH_2020_V1/c_drivers/ir/mpy.c | 39 ++++++ .../c_drivers/ir/rmtlib/esp32_rmt_remotes.h | 11 ++ .../c_drivers/ir/rmtlib/rmtlib_raw.c | 77 ++++++++++++ .../c_drivers/ir/rmtlib/rmtlib_sony.c | 114 ++++++++++++++++++ 5 files changed, 244 insertions(+), 1 deletion(-) create mode 100644 ports/esp32/boards/LILYGO_T_WATCH_2020_V1/c_drivers/ir/rmtlib/rmtlib_raw.c create mode 100644 ports/esp32/boards/LILYGO_T_WATCH_2020_V1/c_drivers/ir/rmtlib/rmtlib_sony.c diff --git a/ports/esp32/boards/LILYGO_T_WATCH_2020_V1/c_drivers/ir/micropython.mk b/ports/esp32/boards/LILYGO_T_WATCH_2020_V1/c_drivers/ir/micropython.mk index 0e2bfe8eb1cf3..6f08b1edafcab 100644 --- a/ports/esp32/boards/LILYGO_T_WATCH_2020_V1/c_drivers/ir/micropython.mk +++ b/ports/esp32/boards/LILYGO_T_WATCH_2020_V1/c_drivers/ir/micropython.mk @@ -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 diff --git a/ports/esp32/boards/LILYGO_T_WATCH_2020_V1/c_drivers/ir/mpy.c b/ports/esp32/boards/LILYGO_T_WATCH_2020_V1/c_drivers/ir/mpy.c index 2b6fa9d4f3232..fd60538574186 100644 --- a/ports/esp32/boards/LILYGO_T_WATCH_2020_V1/c_drivers/ir/mpy.c +++ b/ports/esp32/boards/LILYGO_T_WATCH_2020_V1/c_drivers/ir/mpy.c @@ -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: @@ -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 @@ -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) } diff --git a/ports/esp32/boards/LILYGO_T_WATCH_2020_V1/c_drivers/ir/rmtlib/esp32_rmt_remotes.h b/ports/esp32/boards/LILYGO_T_WATCH_2020_V1/c_drivers/ir/rmtlib/esp32_rmt_remotes.h index 44b3d265bed99..db96798382c18 100644 --- a/ports/esp32/boards/LILYGO_T_WATCH_2020_V1/c_drivers/ir/rmtlib/esp32_rmt_remotes.h +++ b/ports/esp32/boards/LILYGO_T_WATCH_2020_V1/c_drivers/ir/rmtlib/esp32_rmt_remotes.h @@ -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" { @@ -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 diff --git a/ports/esp32/boards/LILYGO_T_WATCH_2020_V1/c_drivers/ir/rmtlib/rmtlib_raw.c b/ports/esp32/boards/LILYGO_T_WATCH_2020_V1/c_drivers/ir/rmtlib/rmtlib_raw.c new file mode 100644 index 0000000000000..7a60b9731f6d4 --- /dev/null +++ b/ports/esp32/boards/LILYGO_T_WATCH_2020_V1/c_drivers/ir/rmtlib/rmtlib_raw.c @@ -0,0 +1,77 @@ +#include "esp32_rmt_common.h" +#include "esp32_rmt_remotes.h" + +#include +#include +#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 \ No newline at end of file diff --git a/ports/esp32/boards/LILYGO_T_WATCH_2020_V1/c_drivers/ir/rmtlib/rmtlib_sony.c b/ports/esp32/boards/LILYGO_T_WATCH_2020_V1/c_drivers/ir/rmtlib/rmtlib_sony.c new file mode 100644 index 0000000000000..1fff8a9f7725a --- /dev/null +++ b/ports/esp32/boards/LILYGO_T_WATCH_2020_V1/c_drivers/ir/rmtlib/rmtlib_sony.c @@ -0,0 +1,114 @@ +#include "esp32_rmt_common.h" +#include "esp32_rmt_remotes.h" + +#include +#include +#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 \ No newline at end of file