mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
examples: Standardise naming of files, symbols, etc. in examples
* Use "example" in all example function & variable names, ie use i2c_example_xxx instead of i2c_xxx for example functions. Closes #198 https://github.com/espressif/esp-idf/issues/198 * Mark example functions, etc. static * Replace uses of "test" & "demo" with "example" * Split the UART example into two * Rename "main" example files to end with "_main.c" for disambiguation
This commit is contained in:
parent
8ee6f8227e
commit
821c70f5d7
@ -32,4 +32,7 @@ In addition, here are some tips for creating good examples:
|
|||||||
|
|
||||||
* A good example is documented and the basic options can be configured.
|
* A good example is documented and the basic options can be configured.
|
||||||
* A good example does not contain a lot of code. If there is a lot of generic code in the example, consider refactoring that code into a standalone component and then use the component's API in your example.
|
* A good example does not contain a lot of code. If there is a lot of generic code in the example, consider refactoring that code into a standalone component and then use the component's API in your example.
|
||||||
|
* Names (of files, functions, variables, etc.) inside examples should be distinguishable from names of other parts of IDF (ideally, use `example` in names.)
|
||||||
|
* Functions and variables used inside examples should be declared static where possible.
|
||||||
|
* Examples should demonstrate one distinct thing each. Avoid multi-purposed "demo" examples, split these into multiple examples instead.
|
||||||
* Examples must be licensed under the Apache License 2.0 or (preferably for examples) if possible you can declare the example to be Public Domain / Creative Commons Zero.
|
* Examples must be licensed under the Apache License 2.0 or (preferably for examples) if possible you can declare the example to be Public Domain / Creative Commons Zero.
|
||||||
|
@ -1,10 +1,8 @@
|
|||||||
#ifndef __BLUFI_DEMO_H__
|
#pragma once
|
||||||
#define __BLUFI_DEMO_H__
|
|
||||||
|
|
||||||
|
#define BLUFI_EXAMPLE_TAG "BLUFI_EXAMPLE"
|
||||||
#define BLUFI_DEMO_TAG "BLUFI_DEMO"
|
#define BLUFI_INFO(fmt, ...) ESP_LOGI(BLUFI_EXAMPLE_TAG, fmt, ##__VA_ARGS__)
|
||||||
#define BLUFI_INFO(fmt, ...) ESP_LOGI(BLUFI_DEMO_TAG, fmt, ##__VA_ARGS__)
|
#define BLUFI_ERROR(fmt, ...) ESP_LOGE(BLUFI_EXAMPLE_TAG, fmt, ##__VA_ARGS__)
|
||||||
#define BLUFI_ERROR(fmt, ...) ESP_LOGE(BLUFI_DEMO_TAG, fmt, ##__VA_ARGS__)
|
|
||||||
|
|
||||||
void blufi_dh_negotiate_data_handler(uint8_t *data, int len, uint8_t **output_data, int *output_len, bool *need_free);
|
void blufi_dh_negotiate_data_handler(uint8_t *data, int len, uint8_t **output_data, int *output_len, bool *need_free);
|
||||||
int blufi_aes_encrypt(uint8_t iv8, uint8_t *crypt_data, int crypt_len);
|
int blufi_aes_encrypt(uint8_t iv8, uint8_t *crypt_data, int crypt_len);
|
||||||
@ -13,5 +11,3 @@ uint16_t blufi_crc_checksum(uint8_t iv8, uint8_t *data, int len);
|
|||||||
|
|
||||||
int blufi_security_init(void);
|
int blufi_security_init(void);
|
||||||
void blufi_security_deinit(void);
|
void blufi_security_deinit(void);
|
||||||
|
|
||||||
#endif /* __BLUFI_DEMO_H__ */
|
|
@ -30,19 +30,19 @@
|
|||||||
#include "esp_gap_ble_api.h"
|
#include "esp_gap_ble_api.h"
|
||||||
#include "esp_bt_main.h"
|
#include "esp_bt_main.h"
|
||||||
#include "esp_bt_device.h"
|
#include "esp_bt_device.h"
|
||||||
#include "blufi_demo.h"
|
#include "blufi_example.h"
|
||||||
|
|
||||||
static void blufi_event_callback(esp_blufi_cb_event_t event, esp_blufi_cb_param_t *param);
|
static void example_event_callback(esp_blufi_cb_event_t event, esp_blufi_cb_param_t *param);
|
||||||
|
|
||||||
#define BLUFI_DEVICE_NAME "BLUFI_DEVICE"
|
#define BLUFI_DEVICE_NAME "BLUFI_DEVICE"
|
||||||
static uint8_t blufi_service_uuid128[32] = {
|
static uint8_t example_service_uuid128[32] = {
|
||||||
/* LSB <--------------------------------------------------------------------------------> MSB */
|
/* LSB <--------------------------------------------------------------------------------> MSB */
|
||||||
//first uuid, 16bit, [12],[13] is the value
|
//first uuid, 16bit, [12],[13] is the value
|
||||||
0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
|
0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
|
||||||
};
|
};
|
||||||
|
|
||||||
//static uint8_t test_manufacturer[TEST_MANUFACTURER_DATA_LEN] = {0x12, 0x23, 0x45, 0x56};
|
//static uint8_t test_manufacturer[TEST_MANUFACTURER_DATA_LEN] = {0x12, 0x23, 0x45, 0x56};
|
||||||
static esp_ble_adv_data_t blufi_adv_data = {
|
static esp_ble_adv_data_t example_adv_data = {
|
||||||
.set_scan_rsp = false,
|
.set_scan_rsp = false,
|
||||||
.include_name = true,
|
.include_name = true,
|
||||||
.include_txpower = true,
|
.include_txpower = true,
|
||||||
@ -54,11 +54,11 @@ static esp_ble_adv_data_t blufi_adv_data = {
|
|||||||
.service_data_len = 0,
|
.service_data_len = 0,
|
||||||
.p_service_data = NULL,
|
.p_service_data = NULL,
|
||||||
.service_uuid_len = 16,
|
.service_uuid_len = 16,
|
||||||
.p_service_uuid = blufi_service_uuid128,
|
.p_service_uuid = example_service_uuid128,
|
||||||
.flag = 0x6,
|
.flag = 0x6,
|
||||||
};
|
};
|
||||||
|
|
||||||
static esp_ble_adv_params_t blufi_adv_params = {
|
static esp_ble_adv_params_t example_adv_params = {
|
||||||
.adv_int_min = 0x100,
|
.adv_int_min = 0x100,
|
||||||
.adv_int_max = 0x100,
|
.adv_int_max = 0x100,
|
||||||
.adv_type = ADV_TYPE_IND,
|
.adv_type = ADV_TYPE_IND,
|
||||||
@ -88,7 +88,7 @@ static uint8_t gl_sta_bssid[6];
|
|||||||
static uint8_t gl_sta_ssid[32];
|
static uint8_t gl_sta_ssid[32];
|
||||||
static int gl_sta_ssid_len;
|
static int gl_sta_ssid_len;
|
||||||
|
|
||||||
static esp_err_t event_handler(void *ctx, system_event_t *event)
|
static esp_err_t example_net_event_handler(void *ctx, system_event_t *event)
|
||||||
{
|
{
|
||||||
wifi_mode_t mode;
|
wifi_mode_t mode;
|
||||||
|
|
||||||
@ -146,7 +146,7 @@ static void initialise_wifi(void)
|
|||||||
{
|
{
|
||||||
tcpip_adapter_init();
|
tcpip_adapter_init();
|
||||||
wifi_event_group = xEventGroupCreate();
|
wifi_event_group = xEventGroupCreate();
|
||||||
ESP_ERROR_CHECK( esp_event_loop_init(event_handler, NULL) );
|
ESP_ERROR_CHECK( esp_event_loop_init(example_net_event_handler, NULL) );
|
||||||
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
|
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
|
||||||
ESP_ERROR_CHECK( esp_wifi_init(&cfg) );
|
ESP_ERROR_CHECK( esp_wifi_init(&cfg) );
|
||||||
ESP_ERROR_CHECK( esp_wifi_set_storage(WIFI_STORAGE_RAM) );
|
ESP_ERROR_CHECK( esp_wifi_set_storage(WIFI_STORAGE_RAM) );
|
||||||
@ -154,24 +154,24 @@ static void initialise_wifi(void)
|
|||||||
ESP_ERROR_CHECK( esp_wifi_start() );
|
ESP_ERROR_CHECK( esp_wifi_start() );
|
||||||
}
|
}
|
||||||
|
|
||||||
static esp_blufi_callbacks_t blufi_callbacks = {
|
static esp_blufi_callbacks_t example_callbacks = {
|
||||||
.event_cb = blufi_event_callback,
|
.event_cb = example_event_callback,
|
||||||
.negotiate_data_handler = blufi_dh_negotiate_data_handler,
|
.negotiate_data_handler = blufi_dh_negotiate_data_handler,
|
||||||
.encrypt_func = blufi_aes_encrypt,
|
.encrypt_func = blufi_aes_encrypt,
|
||||||
.decrypt_func = blufi_aes_decrypt,
|
.decrypt_func = blufi_aes_decrypt,
|
||||||
.checksum_func = blufi_crc_checksum,
|
.checksum_func = blufi_crc_checksum,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void blufi_event_callback(esp_blufi_cb_event_t event, esp_blufi_cb_param_t *param)
|
static void example_event_callback(esp_blufi_cb_event_t event, esp_blufi_cb_param_t *param)
|
||||||
{
|
{
|
||||||
/* actually, should post to blufi_task handle the procedure,
|
/* actually, should post to blufi_task handle the procedure,
|
||||||
* now, as a demo, we do simplely */
|
* now, as a example, we do it more simply */
|
||||||
switch (event) {
|
switch (event) {
|
||||||
case ESP_BLUFI_EVENT_INIT_FINISH:
|
case ESP_BLUFI_EVENT_INIT_FINISH:
|
||||||
BLUFI_INFO("BLUFI init finish\n");
|
BLUFI_INFO("BLUFI init finish\n");
|
||||||
|
|
||||||
esp_ble_gap_set_device_name(BLUFI_DEVICE_NAME);
|
esp_ble_gap_set_device_name(BLUFI_DEVICE_NAME);
|
||||||
esp_ble_gap_config_adv_data(&blufi_adv_data);
|
esp_ble_gap_config_adv_data(&example_adv_data);
|
||||||
break;
|
break;
|
||||||
case ESP_BLUFI_EVENT_DEINIT_FINISH:
|
case ESP_BLUFI_EVENT_DEINIT_FINISH:
|
||||||
BLUFI_INFO("BLUFI init finish\n");
|
BLUFI_INFO("BLUFI init finish\n");
|
||||||
@ -184,7 +184,7 @@ static void blufi_event_callback(esp_blufi_cb_event_t event, esp_blufi_cb_param_
|
|||||||
break;
|
break;
|
||||||
case ESP_BLUFI_EVENT_BLE_DISCONNECT:
|
case ESP_BLUFI_EVENT_BLE_DISCONNECT:
|
||||||
BLUFI_INFO("BLUFI ble disconnect\n");
|
BLUFI_INFO("BLUFI ble disconnect\n");
|
||||||
esp_ble_gap_start_advertising(&blufi_adv_params);
|
esp_ble_gap_start_advertising(&example_adv_params);
|
||||||
break;
|
break;
|
||||||
case ESP_BLUFI_EVENT_SET_WIFI_OPMODE:
|
case ESP_BLUFI_EVENT_SET_WIFI_OPMODE:
|
||||||
BLUFI_INFO("BLUFI Set WIFI opmode %d\n", param->wifi_mode.op_mode);
|
BLUFI_INFO("BLUFI Set WIFI opmode %d\n", param->wifi_mode.op_mode);
|
||||||
@ -297,11 +297,11 @@ static void blufi_event_callback(esp_blufi_cb_event_t event, esp_blufi_cb_param_
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param)
|
static void example_gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param)
|
||||||
{
|
{
|
||||||
switch (event) {
|
switch (event) {
|
||||||
case ESP_GAP_BLE_ADV_DATA_SET_COMPLETE_EVT:
|
case ESP_GAP_BLE_ADV_DATA_SET_COMPLETE_EVT:
|
||||||
esp_ble_gap_start_advertising(&blufi_adv_params);
|
esp_ble_gap_start_advertising(&example_adv_params);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@ -340,8 +340,8 @@ void app_main()
|
|||||||
BLUFI_INFO("BLUFI VERSION %04x\n", esp_blufi_get_version());
|
BLUFI_INFO("BLUFI VERSION %04x\n", esp_blufi_get_version());
|
||||||
|
|
||||||
blufi_security_init();
|
blufi_security_init();
|
||||||
esp_ble_gap_register_callback(gap_event_handler);
|
esp_ble_gap_register_callback(example_gap_event_handler);
|
||||||
|
|
||||||
esp_blufi_register_callbacks(&blufi_callbacks);
|
esp_blufi_register_callbacks(&example_callbacks);
|
||||||
esp_blufi_profile_init();
|
esp_blufi_profile_init();
|
||||||
}
|
}
|
@ -29,7 +29,7 @@
|
|||||||
#include "esp_bt_defs.h"
|
#include "esp_bt_defs.h"
|
||||||
#include "esp_gap_ble_api.h"
|
#include "esp_gap_ble_api.h"
|
||||||
#include "esp_bt_main.h"
|
#include "esp_bt_main.h"
|
||||||
#include "blufi_demo.h"
|
#include "blufi_example.h"
|
||||||
|
|
||||||
#include "mbedtls/aes.h"
|
#include "mbedtls/aes.h"
|
||||||
#include "mbedtls/dhm.h"
|
#include "mbedtls/dhm.h"
|
||||||
|
@ -34,7 +34,7 @@
|
|||||||
#include "driver/gpio.h"
|
#include "driver/gpio.h"
|
||||||
#include "tlk110_phy.h"
|
#include "tlk110_phy.h"
|
||||||
|
|
||||||
static const char *TAG = "eth_demo";
|
static const char *TAG = "eth_example";
|
||||||
|
|
||||||
#define DEFAULT_PHY_CONFIG (AUTO_MDIX_ENABLE|AUTO_NEGOTIATION_ENABLE|AN_1|AN_0|LED_CFG)
|
#define DEFAULT_PHY_CONFIG (AUTO_MDIX_ENABLE|AUTO_NEGOTIATION_ENABLE|AN_1|AN_0|LED_CFG)
|
||||||
#define PIN_PHY_POWER 17
|
#define PIN_PHY_POWER 17
|
@ -41,13 +41,13 @@
|
|||||||
|
|
||||||
static xQueueHandle gpio_evt_queue = NULL;
|
static xQueueHandle gpio_evt_queue = NULL;
|
||||||
|
|
||||||
void IRAM_ATTR gpio_isr_handler(void* arg)
|
static void IRAM_ATTR gpio_isr_handler(void* arg)
|
||||||
{
|
{
|
||||||
uint32_t gpio_num = (uint32_t) arg;
|
uint32_t gpio_num = (uint32_t) arg;
|
||||||
xQueueSendFromISR(gpio_evt_queue, &gpio_num, NULL);
|
xQueueSendFromISR(gpio_evt_queue, &gpio_num, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void gpio_task_example(void* arg)
|
static void gpio_task_example(void* arg)
|
||||||
{
|
{
|
||||||
uint32_t io_num;
|
uint32_t io_num;
|
||||||
for(;;) {
|
for(;;) {
|
||||||
@ -62,7 +62,7 @@ void app_main()
|
|||||||
gpio_config_t io_conf;
|
gpio_config_t io_conf;
|
||||||
//disable interrupt
|
//disable interrupt
|
||||||
io_conf.intr_type = GPIO_PIN_INTR_DISABLE;
|
io_conf.intr_type = GPIO_PIN_INTR_DISABLE;
|
||||||
//set as output mode
|
//set as output mode
|
||||||
io_conf.mode = GPIO_MODE_OUTPUT;
|
io_conf.mode = GPIO_MODE_OUTPUT;
|
||||||
//bit mask of the pins that you want to set,e.g.GPIO18/19
|
//bit mask of the pins that you want to set,e.g.GPIO18/19
|
||||||
io_conf.pin_bit_mask = GPIO_OUTPUT_PIN_SEL;
|
io_conf.pin_bit_mask = GPIO_OUTPUT_PIN_SEL;
|
@ -47,18 +47,18 @@
|
|||||||
#define RW_TEST_LENGTH 129 /*!<Data length for r/w test, any value from 0-DATA_LENGTH*/
|
#define RW_TEST_LENGTH 129 /*!<Data length for r/w test, any value from 0-DATA_LENGTH*/
|
||||||
#define DELAY_TIME_BETWEEN_ITEMS_MS 1234 /*!< delay time between different test items */
|
#define DELAY_TIME_BETWEEN_ITEMS_MS 1234 /*!< delay time between different test items */
|
||||||
|
|
||||||
#define I2C_SLAVE_SCL_IO 26 /*!<gpio number for i2c slave clock */
|
#define I2C_EXAMPLE_SLAVE_SCL_IO 26 /*!<gpio number for i2c slave clock */
|
||||||
#define I2C_SLAVE_SDA_IO 25 /*!<gpio number for i2c slave data */
|
#define I2C_EXAMPLE_SLAVE_SDA_IO 25 /*!<gpio number for i2c slave data */
|
||||||
#define I2C_SLAVE_NUM I2C_NUM_0 /*!<I2C port number for slave dev */
|
#define I2C_EXAMPLE_SLAVE_NUM I2C_NUM_0 /*!<I2C port number for slave dev */
|
||||||
#define I2C_SLAVE_TX_BUF_LEN (2*DATA_LENGTH) /*!<I2C slave tx buffer size */
|
#define I2C_EXAMPLE_SLAVE_TX_BUF_LEN (2*DATA_LENGTH) /*!<I2C slave tx buffer size */
|
||||||
#define I2C_SLAVE_RX_BUF_LEN (2*DATA_LENGTH) /*!<I2C slave rx buffer size */
|
#define I2C_EXAMPLE_SLAVE_RX_BUF_LEN (2*DATA_LENGTH) /*!<I2C slave rx buffer size */
|
||||||
|
|
||||||
#define I2C_MASTER_SCL_IO 19 /*!< gpio number for I2C master clock */
|
#define I2C_EXAMPLE_MASTER_SCL_IO 19 /*!< gpio number for I2C master clock */
|
||||||
#define I2C_MASTER_SDA_IO 18 /*!< gpio number for I2C master data */
|
#define I2C_EXAMPLE_MASTER_SDA_IO 18 /*!< gpio number for I2C master data */
|
||||||
#define I2C_MASTER_NUM I2C_NUM_1 /*!< I2C port number for master dev */
|
#define I2C_EXAMPLE_MASTER_NUM I2C_NUM_1 /*!< I2C port number for master dev */
|
||||||
#define I2C_MASTER_TX_BUF_DISABLE 0 /*!< I2C master do not need buffer */
|
#define I2C_EXAMPLE_MASTER_TX_BUF_DISABLE 0 /*!< I2C master do not need buffer */
|
||||||
#define I2C_MASTER_RX_BUF_DISABLE 0 /*!< I2C master do not need buffer */
|
#define I2C_EXAMPLE_MASTER_RX_BUF_DISABLE 0 /*!< I2C master do not need buffer */
|
||||||
#define I2C_MASTER_FREQ_HZ 100000 /*!< I2C master clock frequency */
|
#define I2C_EXAMPLE_MASTER_FREQ_HZ 100000 /*!< I2C master clock frequency */
|
||||||
|
|
||||||
#define BH1750_SENSOR_ADDR 0x23 /*!< slave address for BH1750 sensor */
|
#define BH1750_SENSOR_ADDR 0x23 /*!< slave address for BH1750 sensor */
|
||||||
#define BH1750_CMD_START 0x23 /*!< Command to set measure mode */
|
#define BH1750_CMD_START 0x23 /*!< Command to set measure mode */
|
||||||
@ -81,7 +81,7 @@ xSemaphoreHandle print_mux;
|
|||||||
* --------|--------------------------|----------------------|--------------------|------|
|
* --------|--------------------------|----------------------|--------------------|------|
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
esp_err_t i2c_master_read_slave(i2c_port_t i2c_num, uint8_t* data_rd, size_t size)
|
static esp_err_t i2c_example_master_read_slave(i2c_port_t i2c_num, uint8_t* data_rd, size_t size)
|
||||||
{
|
{
|
||||||
if (size == 0) {
|
if (size == 0) {
|
||||||
return ESP_OK;
|
return ESP_OK;
|
||||||
@ -110,7 +110,7 @@ esp_err_t i2c_master_read_slave(i2c_port_t i2c_num, uint8_t* data_rd, size_t siz
|
|||||||
* --------|---------------------------|----------------------|------|
|
* --------|---------------------------|----------------------|------|
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
esp_err_t i2c_master_write_slave(i2c_port_t i2c_num, uint8_t* data_wr, size_t size)
|
static esp_err_t i2c_example_master_write_slave(i2c_port_t i2c_num, uint8_t* data_wr, size_t size)
|
||||||
{
|
{
|
||||||
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
|
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
|
||||||
i2c_master_start(cmd);
|
i2c_master_start(cmd);
|
||||||
@ -135,7 +135,7 @@ esp_err_t i2c_master_write_slave(i2c_port_t i2c_num, uint8_t* data_wr, size_t si
|
|||||||
* | start | slave_addr + rd_bit + ack | read 1 byte + ack | read 1 byte + nack | stop |
|
* | start | slave_addr + rd_bit + ack | read 1 byte + ack | read 1 byte + nack | stop |
|
||||||
* --------|---------------------------|--------------------|--------------------|------|
|
* --------|---------------------------|--------------------|--------------------|------|
|
||||||
*/
|
*/
|
||||||
esp_err_t i2c_master_sensor_test(i2c_port_t i2c_num, uint8_t* data_h, uint8_t* data_l)
|
static esp_err_t i2c_example_master_sensor_test(i2c_port_t i2c_num, uint8_t* data_h, uint8_t* data_l)
|
||||||
{
|
{
|
||||||
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
|
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
|
||||||
i2c_master_start(cmd);
|
i2c_master_start(cmd);
|
||||||
@ -166,42 +166,46 @@ esp_err_t i2c_master_sensor_test(i2c_port_t i2c_num, uint8_t* data_h, uint8_t* d
|
|||||||
/**
|
/**
|
||||||
* @brief i2c master initialization
|
* @brief i2c master initialization
|
||||||
*/
|
*/
|
||||||
void i2c_master_init()
|
static void i2c_example_master_init()
|
||||||
{
|
{
|
||||||
int i2c_master_port = I2C_MASTER_NUM;
|
int i2c_master_port = I2C_EXAMPLE_MASTER_NUM;
|
||||||
i2c_config_t conf;
|
i2c_config_t conf;
|
||||||
conf.mode = I2C_MODE_MASTER;
|
conf.mode = I2C_MODE_MASTER;
|
||||||
conf.sda_io_num = I2C_MASTER_SDA_IO;
|
conf.sda_io_num = I2C_EXAMPLE_MASTER_SDA_IO;
|
||||||
conf.sda_pullup_en = GPIO_PULLUP_ENABLE;
|
conf.sda_pullup_en = GPIO_PULLUP_ENABLE;
|
||||||
conf.scl_io_num = I2C_MASTER_SCL_IO;
|
conf.scl_io_num = I2C_EXAMPLE_MASTER_SCL_IO;
|
||||||
conf.scl_pullup_en = GPIO_PULLUP_ENABLE;
|
conf.scl_pullup_en = GPIO_PULLUP_ENABLE;
|
||||||
conf.master.clk_speed = I2C_MASTER_FREQ_HZ;
|
conf.master.clk_speed = I2C_EXAMPLE_MASTER_FREQ_HZ;
|
||||||
i2c_param_config(i2c_master_port, &conf);
|
i2c_param_config(i2c_master_port, &conf);
|
||||||
i2c_driver_install(i2c_master_port, conf.mode, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0);
|
i2c_driver_install(i2c_master_port, conf.mode,
|
||||||
|
I2C_EXAMPLE_MASTER_RX_BUF_DISABLE,
|
||||||
|
I2C_EXAMPLE_MASTER_TX_BUF_DISABLE, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief i2c slave initialization
|
* @brief i2c slave initialization
|
||||||
*/
|
*/
|
||||||
void i2c_slave_init()
|
static void i2c_example_slave_init()
|
||||||
{
|
{
|
||||||
int i2c_slave_port = I2C_SLAVE_NUM;
|
int i2c_slave_port = I2C_EXAMPLE_SLAVE_NUM;
|
||||||
i2c_config_t conf_slave;
|
i2c_config_t conf_slave;
|
||||||
conf_slave.sda_io_num = I2C_SLAVE_SDA_IO;
|
conf_slave.sda_io_num = I2C_EXAMPLE_SLAVE_SDA_IO;
|
||||||
conf_slave.sda_pullup_en = GPIO_PULLUP_ENABLE;
|
conf_slave.sda_pullup_en = GPIO_PULLUP_ENABLE;
|
||||||
conf_slave.scl_io_num = I2C_SLAVE_SCL_IO;
|
conf_slave.scl_io_num = I2C_EXAMPLE_SLAVE_SCL_IO;
|
||||||
conf_slave.scl_pullup_en = GPIO_PULLUP_ENABLE;
|
conf_slave.scl_pullup_en = GPIO_PULLUP_ENABLE;
|
||||||
conf_slave.mode = I2C_MODE_SLAVE;
|
conf_slave.mode = I2C_MODE_SLAVE;
|
||||||
conf_slave.slave.addr_10bit_en = 0;
|
conf_slave.slave.addr_10bit_en = 0;
|
||||||
conf_slave.slave.slave_addr = ESP_SLAVE_ADDR;
|
conf_slave.slave.slave_addr = ESP_SLAVE_ADDR;
|
||||||
i2c_param_config(i2c_slave_port, &conf_slave);
|
i2c_param_config(i2c_slave_port, &conf_slave);
|
||||||
i2c_driver_install(i2c_slave_port, conf_slave.mode, I2C_SLAVE_RX_BUF_LEN, I2C_SLAVE_TX_BUF_LEN, 0);
|
i2c_driver_install(i2c_slave_port, conf_slave.mode,
|
||||||
|
I2C_EXAMPLE_SLAVE_RX_BUF_LEN,
|
||||||
|
I2C_EXAMPLE_SLAVE_TX_BUF_LEN, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief test function to show buffer
|
* @brief test function to show buffer
|
||||||
*/
|
*/
|
||||||
void disp_buf(uint8_t* buf, int len)
|
static void disp_buf(uint8_t* buf, int len)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < len; i++) {
|
for (i = 0; i < len; i++) {
|
||||||
@ -213,7 +217,7 @@ void disp_buf(uint8_t* buf, int len)
|
|||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void i2c_test_task(void* arg)
|
static void i2c_test_task(void* arg)
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
int ret;
|
int ret;
|
||||||
@ -224,7 +228,7 @@ void i2c_test_task(void* arg)
|
|||||||
uint8_t sensor_data_h, sensor_data_l;
|
uint8_t sensor_data_h, sensor_data_l;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
ret = i2c_master_sensor_test( I2C_MASTER_NUM, &sensor_data_h, &sensor_data_l);
|
ret = i2c_example_master_sensor_test( I2C_EXAMPLE_MASTER_NUM, &sensor_data_h, &sensor_data_l);
|
||||||
xSemaphoreTake(print_mux, portMAX_DELAY);
|
xSemaphoreTake(print_mux, portMAX_DELAY);
|
||||||
printf("*******************\n");
|
printf("*******************\n");
|
||||||
printf("TASK[%d] MASTER READ SENSOR( BH1750 )\n", task_idx);
|
printf("TASK[%d] MASTER READ SENSOR( BH1750 )\n", task_idx);
|
||||||
@ -243,12 +247,12 @@ void i2c_test_task(void* arg)
|
|||||||
for (i = 0; i < DATA_LENGTH; i++) {
|
for (i = 0; i < DATA_LENGTH; i++) {
|
||||||
data[i] = i;
|
data[i] = i;
|
||||||
}
|
}
|
||||||
size_t d_size = i2c_slave_write_buffer(I2C_SLAVE_NUM, data, RW_TEST_LENGTH, 1000 / portTICK_RATE_MS);
|
size_t d_size = i2c_slave_write_buffer(I2C_EXAMPLE_SLAVE_NUM, data, RW_TEST_LENGTH, 1000 / portTICK_RATE_MS);
|
||||||
if (d_size == 0) {
|
if (d_size == 0) {
|
||||||
printf("i2c slave tx buffer full\n");
|
printf("i2c slave tx buffer full\n");
|
||||||
ret = i2c_master_read_slave(I2C_MASTER_NUM, data_rd, DATA_LENGTH);
|
ret = i2c_example_master_read_slave(I2C_EXAMPLE_MASTER_NUM, data_rd, DATA_LENGTH);
|
||||||
} else {
|
} else {
|
||||||
ret = i2c_master_read_slave(I2C_MASTER_NUM, data_rd, RW_TEST_LENGTH);
|
ret = i2c_example_master_read_slave(I2C_EXAMPLE_MASTER_NUM, data_rd, RW_TEST_LENGTH);
|
||||||
}
|
}
|
||||||
xSemaphoreTake(print_mux, portMAX_DELAY);
|
xSemaphoreTake(print_mux, portMAX_DELAY);
|
||||||
printf("*******************\n");
|
printf("*******************\n");
|
||||||
@ -270,9 +274,9 @@ void i2c_test_task(void* arg)
|
|||||||
data_wr[i] = i + 10;
|
data_wr[i] = i + 10;
|
||||||
}
|
}
|
||||||
//we need to fill the slave buffer so that master can read later
|
//we need to fill the slave buffer so that master can read later
|
||||||
ret = i2c_master_write_slave( I2C_MASTER_NUM, data_wr, RW_TEST_LENGTH);
|
ret = i2c_example_master_write_slave( I2C_EXAMPLE_MASTER_NUM, data_wr, RW_TEST_LENGTH);
|
||||||
if (ret == ESP_OK) {
|
if (ret == ESP_OK) {
|
||||||
size = i2c_slave_read_buffer( I2C_SLAVE_NUM, data, RW_TEST_LENGTH, 1000 / portTICK_RATE_MS);
|
size = i2c_slave_read_buffer( I2C_EXAMPLE_SLAVE_NUM, data, RW_TEST_LENGTH, 1000 / portTICK_RATE_MS);
|
||||||
}
|
}
|
||||||
xSemaphoreTake(print_mux, portMAX_DELAY);
|
xSemaphoreTake(print_mux, portMAX_DELAY);
|
||||||
printf("*******************\n");
|
printf("*******************\n");
|
||||||
@ -294,8 +298,8 @@ void i2c_test_task(void* arg)
|
|||||||
void app_main()
|
void app_main()
|
||||||
{
|
{
|
||||||
print_mux = xSemaphoreCreateMutex();
|
print_mux = xSemaphoreCreateMutex();
|
||||||
i2c_slave_init();
|
i2c_example_slave_init();
|
||||||
i2c_master_init();
|
i2c_example_master_init();
|
||||||
|
|
||||||
xTaskCreate(i2c_test_task, "i2c_test_task_0", 1024 * 2, (void* ) 0, 10, NULL);
|
xTaskCreate(i2c_test_task, "i2c_test_task_0", 1024 * 2, (void* ) 0, 10, NULL);
|
||||||
xTaskCreate(i2c_test_task, "i2c_test_task_1", 1024 * 2, (void* ) 1, 10, NULL);
|
xTaskCreate(i2c_test_task, "i2c_test_task_1", 1024 * 2, (void* ) 1, 10, NULL);
|
@ -53,7 +53,7 @@ typedef struct {
|
|||||||
uint32_t status; /*pulse counter internal status*/
|
uint32_t status; /*pulse counter internal status*/
|
||||||
} pcnt_evt_t;
|
} pcnt_evt_t;
|
||||||
|
|
||||||
void IRAM_ATTR pcnt_intr_handler(void* arg)
|
static void IRAM_ATTR pcnt_example_intr_handler(void* arg)
|
||||||
{
|
{
|
||||||
uint32_t intr_status = PCNT.int_st.val;
|
uint32_t intr_status = PCNT.int_st.val;
|
||||||
int i;
|
int i;
|
||||||
@ -122,7 +122,7 @@ static void ledc_init(void)
|
|||||||
ledc_timer_config(&ledc_timer);
|
ledc_timer_config(&ledc_timer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pcnt_init(void)
|
static void pcnt_example_init(void)
|
||||||
{
|
{
|
||||||
pcnt_config_t pcnt_config = {
|
pcnt_config_t pcnt_config = {
|
||||||
/*Set PCNT_INPUT_SIG_IO as pulse input gpio */
|
/*Set PCNT_INPUT_SIG_IO as pulse input gpio */
|
||||||
@ -175,7 +175,7 @@ static void pcnt_init(void)
|
|||||||
/*Reset counter value*/
|
/*Reset counter value*/
|
||||||
pcnt_counter_clear(PCNT_TEST_UNIT);
|
pcnt_counter_clear(PCNT_TEST_UNIT);
|
||||||
/*Register ISR handler*/
|
/*Register ISR handler*/
|
||||||
pcnt_isr_register(pcnt_intr_handler, NULL, 0, NULL);
|
pcnt_isr_register(pcnt_example_intr_handler, NULL, 0, NULL);
|
||||||
/*Enable interrupt for PCNT unit*/
|
/*Enable interrupt for PCNT unit*/
|
||||||
pcnt_intr_enable(PCNT_TEST_UNIT);
|
pcnt_intr_enable(PCNT_TEST_UNIT);
|
||||||
/*Resume counting*/
|
/*Resume counting*/
|
||||||
@ -189,7 +189,7 @@ void app_main()
|
|||||||
/*Init PCNT event queue */
|
/*Init PCNT event queue */
|
||||||
pcnt_evt_queue = xQueueCreate(10, sizeof(pcnt_evt_t));
|
pcnt_evt_queue = xQueueCreate(10, sizeof(pcnt_evt_t));
|
||||||
/*Init PCNT functions*/
|
/*Init PCNT functions*/
|
||||||
pcnt_init();
|
pcnt_example_init();
|
||||||
|
|
||||||
int16_t count = 0;
|
int16_t count = 0;
|
||||||
pcnt_evt_t evt;
|
pcnt_evt_t evt;
|
@ -2,5 +2,7 @@
|
|||||||
|
|
||||||
This example uses the remote control (RMT) peripheral to transmit and receive codes for the NEC infrared remote protocol.
|
This example uses the remote control (RMT) peripheral to transmit and receive codes for the NEC infrared remote protocol.
|
||||||
|
|
||||||
Configuration (pin numbers, etc.) can be modified in top of the main/infrared_nec.c file.
|
Configuration (pin numbers, etc.) can be modified in top of the main/infrared_nec_main.c file.
|
||||||
|
|
||||||
|
By default, this example runs a self test which assumes the TX and RX GPIO pins are connected together. To disable this, comment RMT_RX_SELF_TEST in infrared_nec_main.c.
|
||||||
|
|
||||||
|
@ -1,358 +0,0 @@
|
|||||||
/* NEC remote infrared RMT example
|
|
||||||
|
|
||||||
This example code is in the Public Domain (or CC0 licensed, at your option.)
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, this
|
|
||||||
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
|
|
||||||
CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
*/
|
|
||||||
#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"
|
|
||||||
|
|
||||||
static const char* NEC_TAG = "NEC";
|
|
||||||
|
|
||||||
//CHOOSE SELF TEST OR NORMAL TEST
|
|
||||||
#define RMT_RX_SELF_TEST 1
|
|
||||||
|
|
||||||
/******************************************************/
|
|
||||||
/***** SELF TEST: *****/
|
|
||||||
/*Connect RMT_TX_GPIO_NUM with RMT_RX_GPIO_NUM */
|
|
||||||
/*TX task will send NEC data with carrier disabled */
|
|
||||||
/*RX task will print NEC data it receives. */
|
|
||||||
/******************************************************/
|
|
||||||
#if RMT_RX_SELF_TEST
|
|
||||||
#define RMT_RX_ACTIVE_LEVEL 1 /*!< Data bit is active high for self test mode */
|
|
||||||
#define RMT_TX_CARRIER_EN 0 /*!< Disable carrier for self test mode */
|
|
||||||
#else
|
|
||||||
//Test with infrared LED, we have to enable carrier for transmitter
|
|
||||||
//When testing via IR led, the receiver waveform is usually active-low.
|
|
||||||
#define RMT_RX_ACTIVE_LEVEL 0 /*!< If we connect with a IR receiver, the data is active low */
|
|
||||||
#define RMT_TX_CARRIER_EN 1 /*!< Enable carrier for IR transmitter test with IR led */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define RMT_TX_CHANNEL 1 /*!< RMT channel for transmitter */
|
|
||||||
#define RMT_TX_GPIO_NUM 16 /*!< GPIO number for transmitter signal */
|
|
||||||
#define RMT_RX_CHANNEL 0 /*!< RMT channel for receiver */
|
|
||||||
#define RMT_RX_GPIO_NUM 19 /*!< GPIO number for receiver */
|
|
||||||
#define RMT_CLK_DIV 100 /*!< RMT counter clock divider */
|
|
||||||
#define RMT_TICK_10_US (80000000/RMT_CLK_DIV/100000) /*!< RMT counter value for 10 us.(Source clock is APB clock) */
|
|
||||||
|
|
||||||
#define NEC_HEADER_HIGH_US 9000 /*!< NEC protocol header: positive 9ms */
|
|
||||||
#define NEC_HEADER_LOW_US 4500 /*!< NEC protocol header: negative 4.5ms*/
|
|
||||||
#define NEC_BIT_ONE_HIGH_US 560 /*!< NEC protocol data bit 1: positive 0.56ms */
|
|
||||||
#define NEC_BIT_ONE_LOW_US (2250-NEC_BIT_ONE_HIGH_US) /*!< NEC protocol data bit 1: negative 1.69ms */
|
|
||||||
#define NEC_BIT_ZERO_HIGH_US 560 /*!< NEC protocol data bit 0: positive 0.56ms */
|
|
||||||
#define NEC_BIT_ZERO_LOW_US (1120-NEC_BIT_ZERO_HIGH_US) /*!< NEC protocol data bit 0: negative 0.56ms */
|
|
||||||
#define NEC_BIT_END 560 /*!< NEC protocol end: positive 0.56ms */
|
|
||||||
#define NEC_BIT_MARGIN 20 /*!< NEC parse margin time */
|
|
||||||
|
|
||||||
#define NEC_ITEM_DURATION(d) ((d & 0x7fff)*10/RMT_TICK_10_US) /*!< Parse duration time from memory register value */
|
|
||||||
#define NEC_DATA_ITEM_NUM 34 /*!< NEC code item number: header + 32bit data + end */
|
|
||||||
#define RMT_TX_DATA_NUM 100 /*!< NEC tx test data number */
|
|
||||||
#define rmt_item32_tIMEOUT_US 9500 /*!< RMT receiver timeout value(us) */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @brief Build register value of waveform for NEC one data bit
|
|
||||||
*/
|
|
||||||
inline void nec_fill_item_level(rmt_item32_t* item, int high_us, int low_us)
|
|
||||||
{
|
|
||||||
item->level0 = 1;
|
|
||||||
item->duration0 = (high_us) / 10 * RMT_TICK_10_US;
|
|
||||||
item->level1 = 0;
|
|
||||||
item->duration1 = (low_us) / 10 * RMT_TICK_10_US;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @brief Generate NEC header value: active 9ms + negative 4.5ms
|
|
||||||
*/
|
|
||||||
static void nec_fill_item_header(rmt_item32_t* item)
|
|
||||||
{
|
|
||||||
nec_fill_item_level(item, NEC_HEADER_HIGH_US, NEC_HEADER_LOW_US);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @brief Generate NEC data bit 1: positive 0.56ms + negative 1.69ms
|
|
||||||
*/
|
|
||||||
static void nec_fill_item_bit_one(rmt_item32_t* item)
|
|
||||||
{
|
|
||||||
nec_fill_item_level(item, NEC_BIT_ONE_HIGH_US, NEC_BIT_ONE_LOW_US);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @brief Generate NEC data bit 0: positive 0.56ms + negative 0.56ms
|
|
||||||
*/
|
|
||||||
static void nec_fill_item_bit_zero(rmt_item32_t* item)
|
|
||||||
{
|
|
||||||
nec_fill_item_level(item, NEC_BIT_ZERO_HIGH_US, NEC_BIT_ZERO_LOW_US);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @brief Generate NEC end signal: positive 0.56ms
|
|
||||||
*/
|
|
||||||
static void nec_fill_item_end(rmt_item32_t* item)
|
|
||||||
{
|
|
||||||
nec_fill_item_level(item, NEC_BIT_END, 0x7fff);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @brief Check whether duration is around target_us
|
|
||||||
*/
|
|
||||||
inline bool nec_check_in_range(int duration_ticks, int target_us, int margin_us)
|
|
||||||
{
|
|
||||||
if(( NEC_ITEM_DURATION(duration_ticks) < (target_us + margin_us))
|
|
||||||
&& ( NEC_ITEM_DURATION(duration_ticks) > (target_us - margin_us))) {
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @brief Check whether this value represents an NEC header
|
|
||||||
*/
|
|
||||||
static bool nec_header_if(rmt_item32_t* item)
|
|
||||||
{
|
|
||||||
if((item->level0 == RMT_RX_ACTIVE_LEVEL && item->level1 != RMT_RX_ACTIVE_LEVEL)
|
|
||||||
&& nec_check_in_range(item->duration0, NEC_HEADER_HIGH_US, NEC_BIT_MARGIN)
|
|
||||||
&& nec_check_in_range(item->duration1, NEC_HEADER_LOW_US, NEC_BIT_MARGIN)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @brief Check whether this value represents an NEC data bit 1
|
|
||||||
*/
|
|
||||||
static bool nec_bit_one_if(rmt_item32_t* item)
|
|
||||||
{
|
|
||||||
if((item->level0 == RMT_RX_ACTIVE_LEVEL && item->level1 != RMT_RX_ACTIVE_LEVEL)
|
|
||||||
&& nec_check_in_range(item->duration0, NEC_BIT_ONE_HIGH_US, NEC_BIT_MARGIN)
|
|
||||||
&& nec_check_in_range(item->duration1, NEC_BIT_ONE_LOW_US, NEC_BIT_MARGIN)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @brief Check whether this value represents an NEC data bit 0
|
|
||||||
*/
|
|
||||||
static bool nec_bit_zero_if(rmt_item32_t* item)
|
|
||||||
{
|
|
||||||
if((item->level0 == RMT_RX_ACTIVE_LEVEL && item->level1 != RMT_RX_ACTIVE_LEVEL)
|
|
||||||
&& nec_check_in_range(item->duration0, NEC_BIT_ZERO_HIGH_US, NEC_BIT_MARGIN)
|
|
||||||
&& nec_check_in_range(item->duration1, NEC_BIT_ZERO_LOW_US, NEC_BIT_MARGIN)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @brief Parse NEC 32 bit waveform to address and command.
|
|
||||||
*/
|
|
||||||
static int nec_parse_items(rmt_item32_t* item, int item_num, uint16_t* addr, uint16_t* data)
|
|
||||||
{
|
|
||||||
int w_len = item_num;
|
|
||||||
if(w_len < NEC_DATA_ITEM_NUM) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
int i = 0, j = 0;
|
|
||||||
if(!nec_header_if(item++)) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
uint16_t addr_t = 0;
|
|
||||||
for(j = 0; j < 16; j++) {
|
|
||||||
if(nec_bit_one_if(item)) {
|
|
||||||
addr_t |= (1 << j);
|
|
||||||
} else if(nec_bit_zero_if(item)) {
|
|
||||||
addr_t |= (0 << j);
|
|
||||||
} else {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
item++;
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
uint16_t data_t = 0;
|
|
||||||
for(j = 0; j < 16; j++) {
|
|
||||||
if(nec_bit_one_if(item)) {
|
|
||||||
data_t |= (1 << j);
|
|
||||||
} else if(nec_bit_zero_if(item)) {
|
|
||||||
data_t |= (0 << j);
|
|
||||||
} else {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
item++;
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
*addr = addr_t;
|
|
||||||
*data = data_t;
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @brief Build NEC 32bit waveform.
|
|
||||||
*/
|
|
||||||
static int nec_build_items(int channel, rmt_item32_t* item, int item_num, uint16_t addr, uint16_t cmd_data)
|
|
||||||
{
|
|
||||||
int i = 0, j = 0;
|
|
||||||
if(item_num < NEC_DATA_ITEM_NUM) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
nec_fill_item_header(item++);
|
|
||||||
i++;
|
|
||||||
for(j = 0; j < 16; j++) {
|
|
||||||
if(addr & 0x1) {
|
|
||||||
nec_fill_item_bit_one(item);
|
|
||||||
} else {
|
|
||||||
nec_fill_item_bit_zero(item);
|
|
||||||
}
|
|
||||||
item++;
|
|
||||||
i++;
|
|
||||||
addr >>= 1;
|
|
||||||
}
|
|
||||||
for(j = 0; j < 16; j++) {
|
|
||||||
if(cmd_data & 0x1) {
|
|
||||||
nec_fill_item_bit_one(item);
|
|
||||||
} else {
|
|
||||||
nec_fill_item_bit_zero(item);
|
|
||||||
}
|
|
||||||
item++;
|
|
||||||
i++;
|
|
||||||
cmd_data >>= 1;
|
|
||||||
}
|
|
||||||
nec_fill_item_end(item);
|
|
||||||
i++;
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @brief RMT transmitter initialization
|
|
||||||
*/
|
|
||||||
static void rmt_tx_init()
|
|
||||||
{
|
|
||||||
rmt_config_t rmt_tx;
|
|
||||||
rmt_tx.channel = RMT_TX_CHANNEL;
|
|
||||||
rmt_tx.gpio_num = RMT_TX_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 = 50;
|
|
||||||
rmt_tx.tx_config.carrier_freq_hz = 38000;
|
|
||||||
rmt_tx.tx_config.carrier_level = 1;
|
|
||||||
rmt_tx.tx_config.carrier_en = RMT_TX_CARRIER_EN;
|
|
||||||
rmt_tx.tx_config.idle_level = 0;
|
|
||||||
rmt_tx.tx_config.idle_output_en = true;
|
|
||||||
rmt_tx.rmt_mode = 0;
|
|
||||||
rmt_config(&rmt_tx);
|
|
||||||
rmt_driver_install(rmt_tx.channel, 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @brief RMT receiver initialization
|
|
||||||
*/
|
|
||||||
void rmt_rx_init()
|
|
||||||
{
|
|
||||||
rmt_config_t rmt_rx;
|
|
||||||
rmt_rx.channel = RMT_RX_CHANNEL;
|
|
||||||
rmt_rx.gpio_num = RMT_RX_GPIO_NUM;
|
|
||||||
rmt_rx.clk_div = RMT_CLK_DIV;
|
|
||||||
rmt_rx.mem_block_num = 1;
|
|
||||||
rmt_rx.rmt_mode = RMT_MODE_RX;
|
|
||||||
rmt_rx.rx_config.filter_en = true;
|
|
||||||
rmt_rx.rx_config.filter_ticks_thresh = 100;
|
|
||||||
rmt_rx.rx_config.idle_threshold = rmt_item32_tIMEOUT_US / 10 * (RMT_TICK_10_US);
|
|
||||||
rmt_config(&rmt_rx);
|
|
||||||
rmt_driver_install(rmt_rx.channel, 1000, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief RMT receiver demo, this task will print each received NEC data.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void rmt_nec_rx_task()
|
|
||||||
{
|
|
||||||
int channel = RMT_RX_CHANNEL;
|
|
||||||
rmt_rx_init();
|
|
||||||
RingbufHandle_t rb = NULL;
|
|
||||||
//get RMT RX ringbuffer
|
|
||||||
rmt_get_ringbuf_handler(channel, &rb);
|
|
||||||
rmt_rx_start(channel, 1);
|
|
||||||
while(rb) {
|
|
||||||
size_t rx_size = 0;
|
|
||||||
//try to receive data from ringbuffer.
|
|
||||||
//RMT driver will push all the data it receives to its ringbuffer.
|
|
||||||
//We just need to parse the value and return the spaces of ringbuffer.
|
|
||||||
rmt_item32_t* item = (rmt_item32_t*) xRingbufferReceive(rb, &rx_size, 1000);
|
|
||||||
if(item) {
|
|
||||||
uint16_t rmt_addr;
|
|
||||||
uint16_t rmt_cmd;
|
|
||||||
int offset = 0;
|
|
||||||
while(1) {
|
|
||||||
//parse data value from ringbuffer.
|
|
||||||
int res = nec_parse_items(item + offset, rx_size / 4 - offset, &rmt_addr, &rmt_cmd);
|
|
||||||
if(res > 0) {
|
|
||||||
offset += res + 1;
|
|
||||||
ESP_LOGI(NEC_TAG, "RMT RCV --- addr: 0x%04x cmd: 0x%04x", rmt_addr, rmt_cmd);
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//after parsing the data, return spaces to ringbuffer.
|
|
||||||
vRingbufferReturnItem(rb, (void*) item);
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
vTaskDelete(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief RMT transmitter demo, this task will periodically send NEC data. (100 * 32 bits each time.)
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void rmt_nec_tx_task()
|
|
||||||
{
|
|
||||||
vTaskDelay(10);
|
|
||||||
rmt_tx_init();
|
|
||||||
esp_log_level_set(NEC_TAG, ESP_LOG_INFO);
|
|
||||||
int channel = RMT_TX_CHANNEL;
|
|
||||||
uint16_t cmd = 0x0;
|
|
||||||
uint16_t addr = 0x11;
|
|
||||||
int nec_tx_num = RMT_TX_DATA_NUM;
|
|
||||||
for(;;) {
|
|
||||||
ESP_LOGI(NEC_TAG, "RMT TX DATA");
|
|
||||||
size_t size = (sizeof(rmt_item32_t) * NEC_DATA_ITEM_NUM * nec_tx_num);
|
|
||||||
//each item represent a cycle of waveform.
|
|
||||||
rmt_item32_t* item = (rmt_item32_t*) malloc(size);
|
|
||||||
int item_num = NEC_DATA_ITEM_NUM * nec_tx_num;
|
|
||||||
memset((void*) item, 0, size);
|
|
||||||
int i, offset = 0;
|
|
||||||
while(1) {
|
|
||||||
//To build a series of waveforms.
|
|
||||||
i = nec_build_items(channel, item + offset, item_num - offset, ((~addr) << 8) | addr, cmd);
|
|
||||||
if(i < 0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
cmd++;
|
|
||||||
addr++;
|
|
||||||
offset += i;
|
|
||||||
}
|
|
||||||
//To send data according to the waveform items.
|
|
||||||
rmt_write_items(channel, item, item_num, true);
|
|
||||||
//Wait until sending is done.
|
|
||||||
rmt_wait_tx_done(channel);
|
|
||||||
//before we free the data, make sure sending is already done.
|
|
||||||
free(item);
|
|
||||||
vTaskDelay(2000 / portTICK_PERIOD_MS);
|
|
||||||
}
|
|
||||||
vTaskDelete(NULL);
|
|
||||||
}
|
|
@ -7,17 +7,358 @@
|
|||||||
CONDITIONS OF ANY KIND, either express or implied.
|
CONDITIONS OF ANY KIND, either express or implied.
|
||||||
*/
|
*/
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
#include "freertos/FreeRTOS.h"
|
#include "freertos/FreeRTOS.h"
|
||||||
#include "freertos/task.h"
|
#include "freertos/task.h"
|
||||||
#include "esp_system.h"
|
#include "freertos/queue.h"
|
||||||
#include "nvs_flash.h"
|
#include "freertos/semphr.h"
|
||||||
|
#include "esp_err.h"
|
||||||
|
#include "esp_log.h"
|
||||||
#include "driver/rmt.h"
|
#include "driver/rmt.h"
|
||||||
#include "driver/periph_ctrl.h"
|
#include "driver/periph_ctrl.h"
|
||||||
extern void rmt_nec_tx_task();
|
#include "soc/rmt_reg.h"
|
||||||
extern void rmt_nec_rx_task();
|
|
||||||
|
static const char* NEC_TAG = "NEC";
|
||||||
|
|
||||||
|
//CHOOSE SELF TEST OR NORMAL TEST
|
||||||
|
#define RMT_RX_SELF_TEST 1
|
||||||
|
|
||||||
|
/******************************************************/
|
||||||
|
/***** SELF TEST: *****/
|
||||||
|
/*Connect RMT_TX_GPIO_NUM with RMT_RX_GPIO_NUM */
|
||||||
|
/*TX task will send NEC data with carrier disabled */
|
||||||
|
/*RX task will print NEC data it receives. */
|
||||||
|
/******************************************************/
|
||||||
|
#if RMT_RX_SELF_TEST
|
||||||
|
#define RMT_RX_ACTIVE_LEVEL 1 /*!< Data bit is active high for self test mode */
|
||||||
|
#define RMT_TX_CARRIER_EN 0 /*!< Disable carrier for self test mode */
|
||||||
|
#else
|
||||||
|
//Test with infrared LED, we have to enable carrier for transmitter
|
||||||
|
//When testing via IR led, the receiver waveform is usually active-low.
|
||||||
|
#define RMT_RX_ACTIVE_LEVEL 0 /*!< If we connect with a IR receiver, the data is active low */
|
||||||
|
#define RMT_TX_CARRIER_EN 1 /*!< Enable carrier for IR transmitter test with IR led */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define RMT_TX_CHANNEL 1 /*!< RMT channel for transmitter */
|
||||||
|
#define RMT_TX_GPIO_NUM 16 /*!< GPIO number for transmitter signal */
|
||||||
|
#define RMT_RX_CHANNEL 0 /*!< RMT channel for receiver */
|
||||||
|
#define RMT_RX_GPIO_NUM 19 /*!< GPIO number for receiver */
|
||||||
|
#define RMT_CLK_DIV 100 /*!< RMT counter clock divider */
|
||||||
|
#define RMT_TICK_10_US (80000000/RMT_CLK_DIV/100000) /*!< RMT counter value for 10 us.(Source clock is APB clock) */
|
||||||
|
|
||||||
|
#define NEC_HEADER_HIGH_US 9000 /*!< NEC protocol header: positive 9ms */
|
||||||
|
#define NEC_HEADER_LOW_US 4500 /*!< NEC protocol header: negative 4.5ms*/
|
||||||
|
#define NEC_BIT_ONE_HIGH_US 560 /*!< NEC protocol data bit 1: positive 0.56ms */
|
||||||
|
#define NEC_BIT_ONE_LOW_US (2250-NEC_BIT_ONE_HIGH_US) /*!< NEC protocol data bit 1: negative 1.69ms */
|
||||||
|
#define NEC_BIT_ZERO_HIGH_US 560 /*!< NEC protocol data bit 0: positive 0.56ms */
|
||||||
|
#define NEC_BIT_ZERO_LOW_US (1120-NEC_BIT_ZERO_HIGH_US) /*!< NEC protocol data bit 0: negative 0.56ms */
|
||||||
|
#define NEC_BIT_END 560 /*!< NEC protocol end: positive 0.56ms */
|
||||||
|
#define NEC_BIT_MARGIN 20 /*!< NEC parse margin time */
|
||||||
|
|
||||||
|
#define NEC_ITEM_DURATION(d) ((d & 0x7fff)*10/RMT_TICK_10_US) /*!< Parse duration time from memory register value */
|
||||||
|
#define NEC_DATA_ITEM_NUM 34 /*!< NEC code item number: header + 32bit data + end */
|
||||||
|
#define RMT_TX_DATA_NUM 100 /*!< NEC tx test data number */
|
||||||
|
#define rmt_item32_tIMEOUT_US 9500 /*!< RMT receiver timeout value(us) */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief Build register value of waveform for NEC one data bit
|
||||||
|
*/
|
||||||
|
static inline void nec_fill_item_level(rmt_item32_t* item, int high_us, int low_us)
|
||||||
|
{
|
||||||
|
item->level0 = 1;
|
||||||
|
item->duration0 = (high_us) / 10 * RMT_TICK_10_US;
|
||||||
|
item->level1 = 0;
|
||||||
|
item->duration1 = (low_us) / 10 * RMT_TICK_10_US;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief Generate NEC header value: active 9ms + negative 4.5ms
|
||||||
|
*/
|
||||||
|
static void nec_fill_item_header(rmt_item32_t* item)
|
||||||
|
{
|
||||||
|
nec_fill_item_level(item, NEC_HEADER_HIGH_US, NEC_HEADER_LOW_US);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief Generate NEC data bit 1: positive 0.56ms + negative 1.69ms
|
||||||
|
*/
|
||||||
|
static void nec_fill_item_bit_one(rmt_item32_t* item)
|
||||||
|
{
|
||||||
|
nec_fill_item_level(item, NEC_BIT_ONE_HIGH_US, NEC_BIT_ONE_LOW_US);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief Generate NEC data bit 0: positive 0.56ms + negative 0.56ms
|
||||||
|
*/
|
||||||
|
static void nec_fill_item_bit_zero(rmt_item32_t* item)
|
||||||
|
{
|
||||||
|
nec_fill_item_level(item, NEC_BIT_ZERO_HIGH_US, NEC_BIT_ZERO_LOW_US);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief Generate NEC end signal: positive 0.56ms
|
||||||
|
*/
|
||||||
|
static void nec_fill_item_end(rmt_item32_t* item)
|
||||||
|
{
|
||||||
|
nec_fill_item_level(item, NEC_BIT_END, 0x7fff);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief Check whether duration is around target_us
|
||||||
|
*/
|
||||||
|
inline bool nec_check_in_range(int duration_ticks, int target_us, int margin_us)
|
||||||
|
{
|
||||||
|
if(( NEC_ITEM_DURATION(duration_ticks) < (target_us + margin_us))
|
||||||
|
&& ( NEC_ITEM_DURATION(duration_ticks) > (target_us - margin_us))) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief Check whether this value represents an NEC header
|
||||||
|
*/
|
||||||
|
static bool nec_header_if(rmt_item32_t* item)
|
||||||
|
{
|
||||||
|
if((item->level0 == RMT_RX_ACTIVE_LEVEL && item->level1 != RMT_RX_ACTIVE_LEVEL)
|
||||||
|
&& nec_check_in_range(item->duration0, NEC_HEADER_HIGH_US, NEC_BIT_MARGIN)
|
||||||
|
&& nec_check_in_range(item->duration1, NEC_HEADER_LOW_US, NEC_BIT_MARGIN)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief Check whether this value represents an NEC data bit 1
|
||||||
|
*/
|
||||||
|
static bool nec_bit_one_if(rmt_item32_t* item)
|
||||||
|
{
|
||||||
|
if((item->level0 == RMT_RX_ACTIVE_LEVEL && item->level1 != RMT_RX_ACTIVE_LEVEL)
|
||||||
|
&& nec_check_in_range(item->duration0, NEC_BIT_ONE_HIGH_US, NEC_BIT_MARGIN)
|
||||||
|
&& nec_check_in_range(item->duration1, NEC_BIT_ONE_LOW_US, NEC_BIT_MARGIN)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief Check whether this value represents an NEC data bit 0
|
||||||
|
*/
|
||||||
|
static bool nec_bit_zero_if(rmt_item32_t* item)
|
||||||
|
{
|
||||||
|
if((item->level0 == RMT_RX_ACTIVE_LEVEL && item->level1 != RMT_RX_ACTIVE_LEVEL)
|
||||||
|
&& nec_check_in_range(item->duration0, NEC_BIT_ZERO_HIGH_US, NEC_BIT_MARGIN)
|
||||||
|
&& nec_check_in_range(item->duration1, NEC_BIT_ZERO_LOW_US, NEC_BIT_MARGIN)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief Parse NEC 32 bit waveform to address and command.
|
||||||
|
*/
|
||||||
|
static int nec_parse_items(rmt_item32_t* item, int item_num, uint16_t* addr, uint16_t* data)
|
||||||
|
{
|
||||||
|
int w_len = item_num;
|
||||||
|
if(w_len < NEC_DATA_ITEM_NUM) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
int i = 0, j = 0;
|
||||||
|
if(!nec_header_if(item++)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
uint16_t addr_t = 0;
|
||||||
|
for(j = 0; j < 16; j++) {
|
||||||
|
if(nec_bit_one_if(item)) {
|
||||||
|
addr_t |= (1 << j);
|
||||||
|
} else if(nec_bit_zero_if(item)) {
|
||||||
|
addr_t |= (0 << j);
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
item++;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
uint16_t data_t = 0;
|
||||||
|
for(j = 0; j < 16; j++) {
|
||||||
|
if(nec_bit_one_if(item)) {
|
||||||
|
data_t |= (1 << j);
|
||||||
|
} else if(nec_bit_zero_if(item)) {
|
||||||
|
data_t |= (0 << j);
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
item++;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
*addr = addr_t;
|
||||||
|
*data = data_t;
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief Build NEC 32bit waveform.
|
||||||
|
*/
|
||||||
|
static int nec_build_items(int channel, rmt_item32_t* item, int item_num, uint16_t addr, uint16_t cmd_data)
|
||||||
|
{
|
||||||
|
int i = 0, j = 0;
|
||||||
|
if(item_num < NEC_DATA_ITEM_NUM) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
nec_fill_item_header(item++);
|
||||||
|
i++;
|
||||||
|
for(j = 0; j < 16; j++) {
|
||||||
|
if(addr & 0x1) {
|
||||||
|
nec_fill_item_bit_one(item);
|
||||||
|
} else {
|
||||||
|
nec_fill_item_bit_zero(item);
|
||||||
|
}
|
||||||
|
item++;
|
||||||
|
i++;
|
||||||
|
addr >>= 1;
|
||||||
|
}
|
||||||
|
for(j = 0; j < 16; j++) {
|
||||||
|
if(cmd_data & 0x1) {
|
||||||
|
nec_fill_item_bit_one(item);
|
||||||
|
} else {
|
||||||
|
nec_fill_item_bit_zero(item);
|
||||||
|
}
|
||||||
|
item++;
|
||||||
|
i++;
|
||||||
|
cmd_data >>= 1;
|
||||||
|
}
|
||||||
|
nec_fill_item_end(item);
|
||||||
|
i++;
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief RMT transmitter initialization
|
||||||
|
*/
|
||||||
|
static void nec_tx_init()
|
||||||
|
{
|
||||||
|
rmt_config_t rmt_tx;
|
||||||
|
rmt_tx.channel = RMT_TX_CHANNEL;
|
||||||
|
rmt_tx.gpio_num = RMT_TX_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 = 50;
|
||||||
|
rmt_tx.tx_config.carrier_freq_hz = 38000;
|
||||||
|
rmt_tx.tx_config.carrier_level = 1;
|
||||||
|
rmt_tx.tx_config.carrier_en = RMT_TX_CARRIER_EN;
|
||||||
|
rmt_tx.tx_config.idle_level = 0;
|
||||||
|
rmt_tx.tx_config.idle_output_en = true;
|
||||||
|
rmt_tx.rmt_mode = 0;
|
||||||
|
rmt_config(&rmt_tx);
|
||||||
|
rmt_driver_install(rmt_tx.channel, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @brief RMT receiver initialization
|
||||||
|
*/
|
||||||
|
static void nec_rx_init()
|
||||||
|
{
|
||||||
|
rmt_config_t rmt_rx;
|
||||||
|
rmt_rx.channel = RMT_RX_CHANNEL;
|
||||||
|
rmt_rx.gpio_num = RMT_RX_GPIO_NUM;
|
||||||
|
rmt_rx.clk_div = RMT_CLK_DIV;
|
||||||
|
rmt_rx.mem_block_num = 1;
|
||||||
|
rmt_rx.rmt_mode = RMT_MODE_RX;
|
||||||
|
rmt_rx.rx_config.filter_en = true;
|
||||||
|
rmt_rx.rx_config.filter_ticks_thresh = 100;
|
||||||
|
rmt_rx.rx_config.idle_threshold = rmt_item32_tIMEOUT_US / 10 * (RMT_TICK_10_US);
|
||||||
|
rmt_config(&rmt_rx);
|
||||||
|
rmt_driver_install(rmt_rx.channel, 1000, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief RMT receiver demo, this task will print each received NEC data.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static void rmt_example_nec_rx_task()
|
||||||
|
{
|
||||||
|
int channel = RMT_RX_CHANNEL;
|
||||||
|
nec_rx_init();
|
||||||
|
RingbufHandle_t rb = NULL;
|
||||||
|
//get RMT RX ringbuffer
|
||||||
|
rmt_get_ringbuf_handler(channel, &rb);
|
||||||
|
rmt_rx_start(channel, 1);
|
||||||
|
while(rb) {
|
||||||
|
size_t rx_size = 0;
|
||||||
|
//try to receive data from ringbuffer.
|
||||||
|
//RMT driver will push all the data it receives to its ringbuffer.
|
||||||
|
//We just need to parse the value and return the spaces of ringbuffer.
|
||||||
|
rmt_item32_t* item = (rmt_item32_t*) xRingbufferReceive(rb, &rx_size, 1000);
|
||||||
|
if(item) {
|
||||||
|
uint16_t rmt_addr;
|
||||||
|
uint16_t rmt_cmd;
|
||||||
|
int offset = 0;
|
||||||
|
while(1) {
|
||||||
|
//parse data value from ringbuffer.
|
||||||
|
int res = nec_parse_items(item + offset, rx_size / 4 - offset, &rmt_addr, &rmt_cmd);
|
||||||
|
if(res > 0) {
|
||||||
|
offset += res + 1;
|
||||||
|
ESP_LOGI(NEC_TAG, "RMT RCV --- addr: 0x%04x cmd: 0x%04x", rmt_addr, rmt_cmd);
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//after parsing the data, return spaces to ringbuffer.
|
||||||
|
vRingbufferReturnItem(rb, (void*) item);
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
vTaskDelete(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief RMT transmitter demo, this task will periodically send NEC data. (100 * 32 bits each time.)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static void rmt_example_nec_tx_task()
|
||||||
|
{
|
||||||
|
vTaskDelay(10);
|
||||||
|
nec_tx_init();
|
||||||
|
esp_log_level_set(NEC_TAG, ESP_LOG_INFO);
|
||||||
|
int channel = RMT_TX_CHANNEL;
|
||||||
|
uint16_t cmd = 0x0;
|
||||||
|
uint16_t addr = 0x11;
|
||||||
|
int nec_tx_num = RMT_TX_DATA_NUM;
|
||||||
|
for(;;) {
|
||||||
|
ESP_LOGI(NEC_TAG, "RMT TX DATA");
|
||||||
|
size_t size = (sizeof(rmt_item32_t) * NEC_DATA_ITEM_NUM * nec_tx_num);
|
||||||
|
//each item represent a cycle of waveform.
|
||||||
|
rmt_item32_t* item = (rmt_item32_t*) malloc(size);
|
||||||
|
int item_num = NEC_DATA_ITEM_NUM * nec_tx_num;
|
||||||
|
memset((void*) item, 0, size);
|
||||||
|
int i, offset = 0;
|
||||||
|
while(1) {
|
||||||
|
//To build a series of waveforms.
|
||||||
|
i = nec_build_items(channel, item + offset, item_num - offset, ((~addr) << 8) | addr, cmd);
|
||||||
|
if(i < 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
cmd++;
|
||||||
|
addr++;
|
||||||
|
offset += i;
|
||||||
|
}
|
||||||
|
//To send data according to the waveform items.
|
||||||
|
rmt_write_items(channel, item, item_num, true);
|
||||||
|
//Wait until sending is done.
|
||||||
|
rmt_wait_tx_done(channel);
|
||||||
|
//before we free the data, make sure sending is already done.
|
||||||
|
free(item);
|
||||||
|
vTaskDelay(2000 / portTICK_PERIOD_MS);
|
||||||
|
}
|
||||||
|
vTaskDelete(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
void app_main()
|
void app_main()
|
||||||
{
|
{
|
||||||
xTaskCreate(rmt_nec_rx_task, "rmt_nec_rx_task", 2048, NULL, 10, NULL);
|
xTaskCreate(rmt_example_nec_rx_task, "rmt_nec_rx_task", 2048, NULL, 10, NULL);
|
||||||
xTaskCreate(rmt_nec_tx_task, "rmt_nec_tx_task", 2048, NULL, 10, NULL);
|
xTaskCreate(rmt_example_nec_tx_task, "rmt_nec_tx_task", 2048, NULL, 10, NULL);
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
/**
|
/**
|
||||||
* @brief Sigma-delta initialization.
|
* @brief Sigma-delta initialization.
|
||||||
*/
|
*/
|
||||||
static void sigmadelta_init(void)
|
static void sigmadelta_example_init(void)
|
||||||
{
|
{
|
||||||
sigmadelta_config_t sigmadelta_cfg = {
|
sigmadelta_config_t sigmadelta_cfg = {
|
||||||
/* Sigma-delta channel0*/
|
/* Sigma-delta channel0*/
|
||||||
@ -40,7 +40,7 @@ static void sigmadelta_init(void)
|
|||||||
*/
|
*/
|
||||||
void app_main()
|
void app_main()
|
||||||
{
|
{
|
||||||
sigmadelta_init();
|
sigmadelta_example_init();
|
||||||
int8_t duty = 0;
|
int8_t duty = 0;
|
||||||
int inc = 1;
|
int inc = 1;
|
||||||
while(1) {
|
while(1) {
|
@ -147,7 +147,7 @@ void ili_init(spi_device_handle_t spi)
|
|||||||
//before sending the line data itself; a total of 6 transactions. (We can't put all of this in just one transaction
|
//before sending the line data itself; a total of 6 transactions. (We can't put all of this in just one transaction
|
||||||
//because the D/C line needs to be toggled in the middle.)
|
//because the D/C line needs to be toggled in the middle.)
|
||||||
//This routine queues these commands up so they get sent as quickly as possible.
|
//This routine queues these commands up so they get sent as quickly as possible.
|
||||||
void send_line(spi_device_handle_t spi, int ypos, uint16_t *line)
|
static void send_line(spi_device_handle_t spi, int ypos, uint16_t *line)
|
||||||
{
|
{
|
||||||
esp_err_t ret;
|
esp_err_t ret;
|
||||||
int x;
|
int x;
|
||||||
@ -198,7 +198,7 @@ void send_line(spi_device_handle_t spi, int ypos, uint16_t *line)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void send_line_finish(spi_device_handle_t spi)
|
static void send_line_finish(spi_device_handle_t spi)
|
||||||
{
|
{
|
||||||
spi_transaction_t *rtrans;
|
spi_transaction_t *rtrans;
|
||||||
esp_err_t ret;
|
esp_err_t ret;
|
||||||
@ -214,7 +214,7 @@ void send_line_finish(spi_device_handle_t spi)
|
|||||||
//Simple routine to generate some patterns and send them to the LCD. Don't expect anything too
|
//Simple routine to generate some patterns and send them to the LCD. Don't expect anything too
|
||||||
//impressive. Because the SPI driver handles transactions in the background, we can calculate the next line
|
//impressive. Because the SPI driver handles transactions in the background, we can calculate the next line
|
||||||
//while the previous one is being sent.
|
//while the previous one is being sent.
|
||||||
void display_pretty_colors(spi_device_handle_t spi)
|
static void display_pretty_colors(spi_device_handle_t spi)
|
||||||
{
|
{
|
||||||
uint16_t line[2][320];
|
uint16_t line[2][320];
|
||||||
int x, y, frame=0;
|
int x, y, frame=0;
|
@ -44,7 +44,7 @@ static void inline print_u64(uint64_t val)
|
|||||||
printf("0x%08x%08x\n", (uint32_t) (val >> 32), (uint32_t) (val));
|
printf("0x%08x%08x\n", (uint32_t) (val >> 32), (uint32_t) (val));
|
||||||
}
|
}
|
||||||
|
|
||||||
void timer_evt_task(void *arg)
|
static void timer_example_evt_task(void *arg)
|
||||||
{
|
{
|
||||||
while(1) {
|
while(1) {
|
||||||
timer_event_t evt;
|
timer_event_t evt;
|
||||||
@ -135,7 +135,7 @@ void IRAM_ATTR timer_group0_isr(void *para)
|
|||||||
/*
|
/*
|
||||||
* @brief timer group0 hardware timer0 init
|
* @brief timer group0 hardware timer0 init
|
||||||
*/
|
*/
|
||||||
void tg0_timer0_init()
|
static void example_tg0_timer0_init()
|
||||||
{
|
{
|
||||||
int timer_group = TIMER_GROUP_0;
|
int timer_group = TIMER_GROUP_0;
|
||||||
int timer_idx = TIMER_0;
|
int timer_idx = TIMER_0;
|
||||||
@ -165,7 +165,7 @@ void tg0_timer0_init()
|
|||||||
/*
|
/*
|
||||||
* @brief timer group0 hardware timer1 init
|
* @brief timer group0 hardware timer1 init
|
||||||
*/
|
*/
|
||||||
void tg0_timer1_init()
|
static void example_tg0_timer1_init()
|
||||||
{
|
{
|
||||||
int timer_group = TIMER_GROUP_0;
|
int timer_group = TIMER_GROUP_0;
|
||||||
int timer_idx = TIMER_1;
|
int timer_idx = TIMER_1;
|
||||||
@ -198,8 +198,8 @@ void tg0_timer1_init()
|
|||||||
void app_main()
|
void app_main()
|
||||||
{
|
{
|
||||||
timer_queue = xQueueCreate(10, sizeof(timer_event_t));
|
timer_queue = xQueueCreate(10, sizeof(timer_event_t));
|
||||||
tg0_timer0_init();
|
example_tg0_timer0_init();
|
||||||
tg0_timer1_init();
|
example_tg0_timer1_init();
|
||||||
xTaskCreate(timer_evt_task, "timer_evt_task", 2048, NULL, 5, NULL);
|
xTaskCreate(timer_example_evt_task, "timer_evt_task", 2048, NULL, 5, NULL);
|
||||||
}
|
}
|
||||||
|
|
@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
static const char* TAG = "Touch pad";
|
static const char* TAG = "Touch pad";
|
||||||
|
|
||||||
static bool touch_pad_activated[TOUCH_PAD_MAX];
|
static bool s_pad_activated[TOUCH_PAD_MAX];
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -29,7 +29,7 @@ static bool touch_pad_activated[TOUCH_PAD_MAX];
|
|||||||
Do not touch any pads when this routine
|
Do not touch any pads when this routine
|
||||||
is running (on application start).
|
is running (on application start).
|
||||||
*/
|
*/
|
||||||
static void touch_pad_set_thresholds(void)
|
static void tp_example_set_thresholds(void)
|
||||||
{
|
{
|
||||||
uint16_t touch_value;
|
uint16_t touch_value;
|
||||||
for (int i=0; i<TOUCH_PAD_MAX; i++) {
|
for (int i=0; i<TOUCH_PAD_MAX; i++) {
|
||||||
@ -44,17 +44,17 @@ static void touch_pad_set_thresholds(void)
|
|||||||
If so, then print it out on a serial monitor.
|
If so, then print it out on a serial monitor.
|
||||||
Clear related entry in the table afterwards
|
Clear related entry in the table afterwards
|
||||||
*/
|
*/
|
||||||
static void touch_pad_read_task(void *pvParameter)
|
static void tp_example_read_task(void *pvParameter)
|
||||||
{
|
{
|
||||||
static int show_message;
|
static int show_message;
|
||||||
while (1) {
|
while (1) {
|
||||||
for (int i=0; i<TOUCH_PAD_MAX; i++) {
|
for (int i=0; i<TOUCH_PAD_MAX; i++) {
|
||||||
if (touch_pad_activated[i] == true) {
|
if (s_pad_activated[i] == true) {
|
||||||
ESP_LOGI(TAG, "T%d activated!", i);
|
ESP_LOGI(TAG, "T%d activated!", i);
|
||||||
// Wait a while for the pad being released
|
// Wait a while for the pad being released
|
||||||
vTaskDelay(200 / portTICK_PERIOD_MS);
|
vTaskDelay(200 / portTICK_PERIOD_MS);
|
||||||
// Clear information on pad activation
|
// Clear information on pad activation
|
||||||
touch_pad_activated[i] = false;
|
s_pad_activated[i] = false;
|
||||||
// Reset the counter triggering a message
|
// Reset the counter triggering a message
|
||||||
// that application is running
|
// that application is running
|
||||||
show_message = 1;
|
show_message = 1;
|
||||||
@ -73,7 +73,7 @@ static void touch_pad_read_task(void *pvParameter)
|
|||||||
Handle an interrupt triggered when a pad is touched.
|
Handle an interrupt triggered when a pad is touched.
|
||||||
Recognize what pad has been touched and save it in a table.
|
Recognize what pad has been touched and save it in a table.
|
||||||
*/
|
*/
|
||||||
static void touch_pad_rtc_intr(void * arg)
|
static void tp_example_rtc_intr(void * arg)
|
||||||
{
|
{
|
||||||
uint32_t pad_intr = READ_PERI_REG(SENS_SAR_TOUCH_CTRL2_REG) & 0x3ff;
|
uint32_t pad_intr = READ_PERI_REG(SENS_SAR_TOUCH_CTRL2_REG) & 0x3ff;
|
||||||
uint32_t rtc_intr = READ_PERI_REG(RTC_CNTL_INT_ST_REG);
|
uint32_t rtc_intr = READ_PERI_REG(RTC_CNTL_INT_ST_REG);
|
||||||
@ -84,7 +84,7 @@ static void touch_pad_rtc_intr(void * arg)
|
|||||||
if (rtc_intr & RTC_CNTL_TOUCH_INT_ST) {
|
if (rtc_intr & RTC_CNTL_TOUCH_INT_ST) {
|
||||||
for (int i = 0; i < TOUCH_PAD_MAX; i++) {
|
for (int i = 0; i < TOUCH_PAD_MAX; i++) {
|
||||||
if ((pad_intr >> i) & 0x01) {
|
if ((pad_intr >> i) & 0x01) {
|
||||||
touch_pad_activated[i] = true;
|
s_pad_activated[i] = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -96,9 +96,9 @@ void app_main()
|
|||||||
// Initialize touch pad peripheral
|
// Initialize touch pad peripheral
|
||||||
ESP_LOGI(TAG, "Initializing touch pad");
|
ESP_LOGI(TAG, "Initializing touch pad");
|
||||||
touch_pad_init();
|
touch_pad_init();
|
||||||
touch_pad_set_thresholds();
|
tp_example_set_thresholds();
|
||||||
touch_pad_isr_handler_register(touch_pad_rtc_intr, NULL, 0, NULL);
|
touch_pad_isr_handler_register(tp_example_rtc_intr, NULL, 0, NULL);
|
||||||
|
|
||||||
// Start a task to show what pads have been touched
|
// Start a task to show what pads have been touched
|
||||||
xTaskCreate(&touch_pad_read_task, "touch_pad_read_task", 2048, NULL, 5, NULL);
|
xTaskCreate(&tp_example_read_task, "touch_pad_read_task", 2048, NULL, 5, NULL);
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
Read values sensed at all available touch pads.
|
Read values sensed at all available touch pads.
|
||||||
Print out values in a loop on a serial monitor.
|
Print out values in a loop on a serial monitor.
|
||||||
*/
|
*/
|
||||||
void touch_pad_read_task(void *pvParameter)
|
static void tp_example_read_task(void *pvParameter)
|
||||||
{
|
{
|
||||||
while (1) {
|
while (1) {
|
||||||
uint16_t touch_value;
|
uint16_t touch_value;
|
||||||
@ -36,6 +36,6 @@ void app_main()
|
|||||||
touch_pad_init();
|
touch_pad_init();
|
||||||
|
|
||||||
// Start task to read values sensed by pads
|
// Start task to read values sensed by pads
|
||||||
xTaskCreate(&touch_pad_read_task, "touch_pad_read_task", 2048, NULL, 5, NULL);
|
xTaskCreate(&tp_example_read_task, "touch_pad_read_task", 2048, NULL, 5, NULL);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
# project subdirectory.
|
# project subdirectory.
|
||||||
#
|
#
|
||||||
|
|
||||||
PROJECT_NAME := uart
|
PROJECT_NAME := uart_echo
|
||||||
|
|
||||||
include $(IDF_PATH)/make/project.mk
|
include $(IDF_PATH)/make/project.mk
|
||||||
|
|
73
examples/peripherals/uart_echo/main/uart_echo_example_main.c
Normal file
73
examples/peripherals/uart_echo/main/uart_echo_example_main.c
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
/* Uart Events Example
|
||||||
|
|
||||||
|
This example code is in the Public Domain (or CC0 licensed, at your option.)
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, this
|
||||||
|
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
|
||||||
|
CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
*/
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "freertos/FreeRTOS.h"
|
||||||
|
#include "freertos/task.h"
|
||||||
|
#include "esp_system.h"
|
||||||
|
#include "nvs_flash.h"
|
||||||
|
#include "driver/uart.h"
|
||||||
|
#include "freertos/queue.h"
|
||||||
|
#include "esp_log.h"
|
||||||
|
#include "soc/uart_struct.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is a example exaple which echos any data it receives on UART1 back to the sender, with hardware flow control
|
||||||
|
* turned on. It does not use UART driver event queue.
|
||||||
|
*
|
||||||
|
* - port: UART1
|
||||||
|
* - rx buffer: on
|
||||||
|
* - tx buffer: off
|
||||||
|
* - flow control: on
|
||||||
|
* - event queue: off
|
||||||
|
* - pin assignment: txd(io4), rxd(io5), rts(18), cts(19)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define ECHO_TEST_TXD (4)
|
||||||
|
#define ECHO_TEST_RXD (5)
|
||||||
|
#define ECHO_TEST_RTS (18)
|
||||||
|
#define ECHO_TEST_CTS (19)
|
||||||
|
|
||||||
|
#define BUF_SIZE (1024)
|
||||||
|
|
||||||
|
//an example of echo test with hardware flow control on UART1
|
||||||
|
static void echo_task()
|
||||||
|
{
|
||||||
|
const int uart_num = UART_NUM_1;
|
||||||
|
uart_config_t uart_config = {
|
||||||
|
.baud_rate = 115200,
|
||||||
|
.data_bits = UART_DATA_8_BITS,
|
||||||
|
.parity = UART_PARITY_DISABLE,
|
||||||
|
.stop_bits = UART_STOP_BITS_1,
|
||||||
|
.flow_ctrl = UART_HW_FLOWCTRL_CTS_RTS,
|
||||||
|
.rx_flow_ctrl_thresh = 122,
|
||||||
|
};
|
||||||
|
//Configure UART1 parameters
|
||||||
|
uart_param_config(uart_num, &uart_config);
|
||||||
|
//Set UART1 pins(TX: IO4, RX: I05, RTS: IO18, CTS: IO19)
|
||||||
|
uart_set_pin(uart_num, ECHO_TEST_TXD, ECHO_TEST_RXD, ECHO_TEST_RTS, ECHO_TEST_CTS);
|
||||||
|
//Install UART driver (we don't need an event queue here)
|
||||||
|
//In this example we don't even use a buffer for sending data.
|
||||||
|
uart_driver_install(uart_num, BUF_SIZE * 2, 0, 0, NULL, 0);
|
||||||
|
|
||||||
|
uint8_t* data = (uint8_t*) malloc(BUF_SIZE);
|
||||||
|
while(1) {
|
||||||
|
//Read data from UART
|
||||||
|
int len = uart_read_bytes(uart_num, data, BUF_SIZE, 20 / portTICK_RATE_MS);
|
||||||
|
//Write data back to UART
|
||||||
|
uart_write_bytes(uart_num, (const char*) data, len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void app_main()
|
||||||
|
{
|
||||||
|
//A uart read/write example without event queue;
|
||||||
|
xTaskCreate(echo_task, "uart_echo_task", 1024, NULL, 10, NULL);
|
||||||
|
}
|
9
examples/peripherals/uart_events/Makefile
Normal file
9
examples/peripherals/uart_events/Makefile
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#
|
||||||
|
# This is a project Makefile. It is assumed the directory this Makefile resides in is a
|
||||||
|
# project subdirectory.
|
||||||
|
#
|
||||||
|
|
||||||
|
PROJECT_NAME := uart_events
|
||||||
|
|
||||||
|
include $(IDF_PATH)/make/project.mk
|
||||||
|
|
3
examples/peripherals/uart_events/main/component.mk
Normal file
3
examples/peripherals/uart_events/main/component.mk
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
#
|
||||||
|
# Main Makefile. This is basically the same as a component makefile.
|
||||||
|
#
|
@ -17,46 +17,36 @@
|
|||||||
#include "freertos/queue.h"
|
#include "freertos/queue.h"
|
||||||
#include "esp_log.h"
|
#include "esp_log.h"
|
||||||
#include "soc/uart_struct.h"
|
#include "soc/uart_struct.h"
|
||||||
static const char *TAG = "uart_example";
|
|
||||||
|
static const char *TAG = "uart_events";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test code brief
|
* This example shows how to use the UART driver to handle special UART events.
|
||||||
* This example shows how to configure uart settings and install uart driver.
|
*
|
||||||
|
* It also reads data from UART0 directly, and echoes it to console.
|
||||||
*
|
*
|
||||||
* uart_evt_test() is an example that read and write data on UART0, and handler some of the special events.
|
|
||||||
* - port: UART0
|
* - port: UART0
|
||||||
* - rx buffer: on
|
* - rx buffer: on
|
||||||
* - tx buffer: on
|
* - tx buffer: on
|
||||||
* - flow control: off
|
* - flow control: off
|
||||||
* - event queue: on
|
* - event queue: on
|
||||||
* - pin assignment: txd(default), rxd(default)
|
* - pin assignment: txd(default), rxd(default)
|
||||||
*
|
|
||||||
* uart_echo_test() is an example that read and write data on UART1, with hardware flow control turning on.
|
|
||||||
* - port: UART1
|
|
||||||
* - rx buffer: on
|
|
||||||
* - tx buffer: off
|
|
||||||
* - flow control: on
|
|
||||||
* - event queue: off
|
|
||||||
* - pin assignment: txd(io4), rxd(io5), rts(18), cts(19)
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define BUF_SIZE (1024)
|
#define EX_UART_NUM UART_NUM_0
|
||||||
#define ECHO_TEST_TXD (4)
|
|
||||||
#define ECHO_TEST_RXD (5)
|
|
||||||
#define ECHO_TEST_RTS (18)
|
|
||||||
#define ECHO_TEST_CTS (19)
|
|
||||||
|
|
||||||
QueueHandle_t uart0_queue;
|
#define BUF_SIZE (1024)
|
||||||
void uart_task(void *pvParameters)
|
static QueueHandle_t uart0_queue;
|
||||||
|
|
||||||
|
static void uart_event_task(void *pvParameters)
|
||||||
{
|
{
|
||||||
int uart_num = (int) pvParameters;
|
|
||||||
uart_event_t event;
|
uart_event_t event;
|
||||||
size_t buffered_size;
|
size_t buffered_size;
|
||||||
uint8_t* dtmp = (uint8_t*) malloc(BUF_SIZE);
|
uint8_t* dtmp = (uint8_t*) malloc(BUF_SIZE);
|
||||||
for(;;) {
|
for(;;) {
|
||||||
//Waiting for UART event.
|
//Waiting for UART event.
|
||||||
if(xQueueReceive(uart0_queue, (void * )&event, (portTickType)portMAX_DELAY)) {
|
if(xQueueReceive(uart0_queue, (void * )&event, (portTickType)portMAX_DELAY)) {
|
||||||
ESP_LOGI(TAG, "uart[%d] event:", uart_num);
|
ESP_LOGI(TAG, "uart[%d] event:", EX_UART_NUM);
|
||||||
switch(event.type) {
|
switch(event.type) {
|
||||||
//Event of UART receving data
|
//Event of UART receving data
|
||||||
/*We'd better handler data event fast, there would be much more data events than
|
/*We'd better handler data event fast, there would be much more data events than
|
||||||
@ -64,7 +54,7 @@ void uart_task(void *pvParameters)
|
|||||||
be full.
|
be full.
|
||||||
in this example, we don't process data in event, but read data outside.*/
|
in this example, we don't process data in event, but read data outside.*/
|
||||||
case UART_DATA:
|
case UART_DATA:
|
||||||
uart_get_buffered_data_len(uart_num, &buffered_size);
|
uart_get_buffered_data_len(EX_UART_NUM, &buffered_size);
|
||||||
ESP_LOGI(TAG, "data, len: %d; buffered len: %d", event.size, buffered_size);
|
ESP_LOGI(TAG, "data, len: %d; buffered len: %d", event.size, buffered_size);
|
||||||
break;
|
break;
|
||||||
//Event of HW FIFO overflow detected
|
//Event of HW FIFO overflow detected
|
||||||
@ -72,14 +62,14 @@ void uart_task(void *pvParameters)
|
|||||||
ESP_LOGI(TAG, "hw fifo overflow\n");
|
ESP_LOGI(TAG, "hw fifo overflow\n");
|
||||||
//If fifo overflow happened, you should consider adding flow control for your application.
|
//If fifo overflow happened, you should consider adding flow control for your application.
|
||||||
//We can read data out out the buffer, or directly flush the rx buffer.
|
//We can read data out out the buffer, or directly flush the rx buffer.
|
||||||
uart_flush(uart_num);
|
uart_flush(EX_UART_NUM);
|
||||||
break;
|
break;
|
||||||
//Event of UART ring buffer full
|
//Event of UART ring buffer full
|
||||||
case UART_BUFFER_FULL:
|
case UART_BUFFER_FULL:
|
||||||
ESP_LOGI(TAG, "ring buffer full\n");
|
ESP_LOGI(TAG, "ring buffer full\n");
|
||||||
//If buffer full happened, you should consider encreasing your buffer size
|
//If buffer full happened, you should consider encreasing your buffer size
|
||||||
//We can read data out out the buffer, or directly flush the rx buffer.
|
//We can read data out out the buffer, or directly flush the rx buffer.
|
||||||
uart_flush(uart_num);
|
uart_flush(EX_UART_NUM);
|
||||||
break;
|
break;
|
||||||
//Event of UART RX break detected
|
//Event of UART RX break detected
|
||||||
case UART_BREAK:
|
case UART_BREAK:
|
||||||
@ -109,9 +99,9 @@ void uart_task(void *pvParameters)
|
|||||||
vTaskDelete(NULL);
|
vTaskDelete(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void uart_evt_test()
|
/* Configure the UART events example */
|
||||||
|
void app_main()
|
||||||
{
|
{
|
||||||
int uart_num = UART_NUM_0;
|
|
||||||
uart_config_t uart_config = {
|
uart_config_t uart_config = {
|
||||||
.baud_rate = 115200,
|
.baud_rate = 115200,
|
||||||
.data_bits = UART_DATA_8_BITS,
|
.data_bits = UART_DATA_8_BITS,
|
||||||
@ -121,63 +111,26 @@ void uart_evt_test()
|
|||||||
.rx_flow_ctrl_thresh = 122,
|
.rx_flow_ctrl_thresh = 122,
|
||||||
};
|
};
|
||||||
//Set UART parameters
|
//Set UART parameters
|
||||||
uart_param_config(uart_num, &uart_config);
|
uart_param_config(EX_UART_NUM, &uart_config);
|
||||||
//Set UART log level
|
//Set UART log level
|
||||||
esp_log_level_set(TAG, ESP_LOG_INFO);
|
esp_log_level_set(TAG, ESP_LOG_INFO);
|
||||||
//Install UART driver, and get the queue.
|
//Install UART driver, and get the queue.
|
||||||
uart_driver_install(uart_num, BUF_SIZE * 2, BUF_SIZE * 2, 10, &uart0_queue, 0);
|
uart_driver_install(EX_UART_NUM, BUF_SIZE * 2, BUF_SIZE * 2, 10, &uart0_queue, 0);
|
||||||
//Set UART pins,(-1: default pin, no change.)
|
|
||||||
//For UART0, we can just use the default pins.
|
//Set UART pins (using UART0 default pins ie no changes.)
|
||||||
//uart_set_pin(uart_num, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
|
uart_set_pin(EX_UART_NUM, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
|
||||||
|
|
||||||
//Set uart pattern detect function.
|
//Set uart pattern detect function.
|
||||||
uart_enable_pattern_det_intr(uart_num, '+', 3, 10000, 10, 10);
|
uart_enable_pattern_det_intr(EX_UART_NUM, '+', 3, 10000, 10, 10);
|
||||||
//Create a task to handler UART event from ISR
|
//Create a task to handler UART event from ISR
|
||||||
xTaskCreate(uart_task, "uart_task", 2048, (void*)uart_num, 12, NULL);
|
xTaskCreate(uart_event_task, "uart_event_task", 2048, NULL, 12, NULL);
|
||||||
//process data
|
//process data
|
||||||
uint8_t* data = (uint8_t*) malloc(BUF_SIZE);
|
uint8_t* data = (uint8_t*) malloc(BUF_SIZE);
|
||||||
do {
|
do {
|
||||||
int len = uart_read_bytes(uart_num, data, BUF_SIZE, 100 / portTICK_RATE_MS);
|
int len = uart_read_bytes(EX_UART_NUM, data, BUF_SIZE, 100 / portTICK_RATE_MS);
|
||||||
if(len > 0) {
|
if(len > 0) {
|
||||||
ESP_LOGI(TAG, "uart read : %d", len);
|
ESP_LOGI(TAG, "uart read : %d", len);
|
||||||
uart_write_bytes(uart_num, (const char*)data, len);
|
uart_write_bytes(EX_UART_NUM, (const char*)data, len);
|
||||||
}
|
}
|
||||||
} while(1);
|
} while(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
//an example of echo test with hardware flow control on UART1
|
|
||||||
void uart_echo_test()
|
|
||||||
{
|
|
||||||
int uart_num = UART_NUM_1;
|
|
||||||
uart_config_t uart_config = {
|
|
||||||
.baud_rate = 115200,
|
|
||||||
.data_bits = UART_DATA_8_BITS,
|
|
||||||
.parity = UART_PARITY_DISABLE,
|
|
||||||
.stop_bits = UART_STOP_BITS_1,
|
|
||||||
.flow_ctrl = UART_HW_FLOWCTRL_CTS_RTS,
|
|
||||||
.rx_flow_ctrl_thresh = 122,
|
|
||||||
};
|
|
||||||
//Configure UART1 parameters
|
|
||||||
uart_param_config(uart_num, &uart_config);
|
|
||||||
//Set UART1 pins(TX: IO4, RX: I05, RTS: IO18, CTS: IO19)
|
|
||||||
uart_set_pin(uart_num, ECHO_TEST_TXD, ECHO_TEST_RXD, ECHO_TEST_RTS, ECHO_TEST_CTS);
|
|
||||||
//Install UART driver( We don't need an event queue here)
|
|
||||||
//In this example we don't even use a buffer for sending data.
|
|
||||||
uart_driver_install(uart_num, BUF_SIZE * 2, 0, 0, NULL, 0);
|
|
||||||
|
|
||||||
uint8_t* data = (uint8_t*) malloc(BUF_SIZE);
|
|
||||||
while(1) {
|
|
||||||
//Read data from UART
|
|
||||||
int len = uart_read_bytes(uart_num, data, BUF_SIZE, 20 / portTICK_RATE_MS);
|
|
||||||
//Write data back to UART
|
|
||||||
uart_write_bytes(uart_num, (const char*) data, len);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void app_main()
|
|
||||||
{
|
|
||||||
//A uart read/write example without event queue;
|
|
||||||
xTaskCreate(uart_echo_test, "uart_echo_test", 1024, NULL, 10, NULL);
|
|
||||||
|
|
||||||
//A uart example with event queue.
|
|
||||||
uart_evt_test();
|
|
||||||
}
|
|
@ -65,7 +65,7 @@ static void message_handler(struct coap_context_t *ctx, const coap_endpoint_t *l
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void coap_demo_thread(void *p)
|
static void coap_example_task(void *p)
|
||||||
{
|
{
|
||||||
struct hostent *hp;
|
struct hostent *hp;
|
||||||
struct ip4_addr *ip4_addr;
|
struct ip4_addr *ip4_addr;
|
||||||
@ -201,5 +201,5 @@ void app_main(void)
|
|||||||
{
|
{
|
||||||
ESP_ERROR_CHECK( nvs_flash_init() );
|
ESP_ERROR_CHECK( nvs_flash_init() );
|
||||||
wifi_conn_init();
|
wifi_conn_init();
|
||||||
xTaskCreate(coap_demo_thread, "coap", 2048, NULL, 5, NULL);
|
xTaskCreate(coap_example_task, "coap", 2048, NULL, 5, NULL);
|
||||||
}
|
}
|
@ -80,7 +80,7 @@ async_handler(coap_context_t *ctx, struct coap_resource_t *resource,
|
|||||||
async = coap_register_async(ctx, peer, request, COAP_ASYNC_SEPARATE | COAP_ASYNC_CONFIRM, (void*)"no data");
|
async = coap_register_async(ctx, peer, request, COAP_ASYNC_SEPARATE | COAP_ASYNC_CONFIRM, (void*)"no data");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void coap_demo_thread(void *p)
|
static void coap_example_thread(void *p)
|
||||||
{
|
{
|
||||||
coap_context_t* ctx = NULL;
|
coap_context_t* ctx = NULL;
|
||||||
coap_address_t serv_addr;
|
coap_address_t serv_addr;
|
||||||
@ -188,5 +188,5 @@ void app_main(void)
|
|||||||
ESP_ERROR_CHECK( nvs_flash_init() );
|
ESP_ERROR_CHECK( nvs_flash_init() );
|
||||||
wifi_conn_init();
|
wifi_conn_init();
|
||||||
|
|
||||||
xTaskCreate(coap_demo_thread, "coap", 2048, NULL, 5, NULL);
|
xTaskCreate(coap_example_thread, "coap", 2048, NULL, 5, NULL);
|
||||||
}
|
}
|
@ -125,7 +125,7 @@ static void query_mdns_service(mdns_server_t * mdns, const char * service, const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mdns_task(void *pvParameters)
|
static void mdns_example_task(void *pvParameters)
|
||||||
{
|
{
|
||||||
mdns_server_t * mdns = NULL;
|
mdns_server_t * mdns = NULL;
|
||||||
while(1) {
|
while(1) {
|
||||||
@ -180,5 +180,5 @@ void app_main()
|
|||||||
{
|
{
|
||||||
ESP_ERROR_CHECK( nvs_flash_init() );
|
ESP_ERROR_CHECK( nvs_flash_init() );
|
||||||
initialise_wifi();
|
initialise_wifi();
|
||||||
xTaskCreate(&mdns_task, "mdns_task", 2048, NULL, 5, NULL);
|
xTaskCreate(&mdns_example_task, "mdns_example_task", 2048, NULL, 5, NULL);
|
||||||
}
|
}
|
||||||
|
@ -7,8 +7,8 @@
|
|||||||
CONDITIONS OF ANY KIND, either express or implied.
|
CONDITIONS OF ANY KIND, either express or implied.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _OPENSSL_DEMO_H_
|
#ifndef _OPENSSL_EXAMPLE_H_
|
||||||
#define _OPENSSL_DEMO_H_
|
#define _OPENSSL_EXAMPLE_H_
|
||||||
|
|
||||||
/* The examples use simple WiFi configuration that you can set via
|
/* The examples use simple WiFi configuration that you can set via
|
||||||
'make menuconfig'.
|
'make menuconfig'.
|
||||||
@ -23,21 +23,21 @@
|
|||||||
you can set via 'make menuconfig'.
|
you can set via 'make menuconfig'.
|
||||||
|
|
||||||
If you'd rather not, just change the below entries to strings with
|
If you'd rather not, just change the below entries to strings with
|
||||||
the config you want - ie #define OPENSSL_DEMO_TARGET_NAME "www.baidu.com"
|
the config you want - ie #define OPENSSL_EXAMPLE_TARGET_NAME "www.baidu.com"
|
||||||
and ie #define OPENSSL_DEMO_TARGET_TCP_PORT 433
|
and ie #define OPENSSL_EXAMPLE_TARGET_TCP_PORT 433
|
||||||
*/
|
*/
|
||||||
#define OPENSSL_DEMO_TARGET_NAME CONFIG_TARGET_DOMAIN
|
#define OPENSSL_EXAMPLE_TARGET_NAME CONFIG_TARGET_DOMAIN
|
||||||
#define OPENSSL_DEMO_TARGET_TCP_PORT CONFIG_TARGET_PORT_NUMBER
|
#define OPENSSL_EXAMPLE_TARGET_TCP_PORT CONFIG_TARGET_PORT_NUMBER
|
||||||
|
|
||||||
#define OPENSSL_DEMO_REQUEST "{\"path\": \"/v1/ping/\", \"method\": \"GET\"}\r\n"
|
#define OPENSSL_EXAMPLE_REQUEST "{\"path\": \"/v1/ping/\", \"method\": \"GET\"}\r\n"
|
||||||
|
|
||||||
#define OPENSSL_DEMO_THREAD_NAME "OpenSSL_demo"
|
#define OPENSSL_EXAMPLE_TASK_NAME "openssl_example"
|
||||||
#define OPENSSL_DEMO_THREAD_STACK_WORDS 10240
|
#define OPENSSL_EXAMPLE_TASK_STACK_WORDS 10240
|
||||||
#define OPENSSL_DEMO_THREAD_PRORIOTY 8
|
#define OPENSSL_EXAMPLE_TASK_PRORIOTY 8
|
||||||
|
|
||||||
#define OPENSSL_DEMO_RECV_BUF_LEN 1024
|
#define OPENSSL_EXAMPLE_RECV_BUF_LEN 1024
|
||||||
|
|
||||||
#define OPENSSL_DEMO_LOCAL_TCP_PORT 443
|
#define OPENSSL_EXAMPLE_LOCAL_TCP_PORT 443
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -7,7 +7,7 @@
|
|||||||
CONDITIONS OF ANY KIND, either express or implied.
|
CONDITIONS OF ANY KIND, either express or implied.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "openssl_client.h"
|
#include "openssl_client_example.h"
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
@ -33,9 +33,9 @@ static EventGroupHandle_t wifi_event_group;
|
|||||||
to the AP with an IP? */
|
to the AP with an IP? */
|
||||||
const static int CONNECTED_BIT = BIT0;
|
const static int CONNECTED_BIT = BIT0;
|
||||||
|
|
||||||
const static char *TAG = "Openssl_demo";
|
const static char *TAG = "openssl_example";
|
||||||
|
|
||||||
void openssl_demo_thread(void *p)
|
static void openssl_example_task(void *p)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
SSL_CTX *ctx;
|
SSL_CTX *ctx;
|
||||||
@ -46,15 +46,15 @@ void openssl_demo_thread(void *p)
|
|||||||
struct ip4_addr *ip4_addr;
|
struct ip4_addr *ip4_addr;
|
||||||
|
|
||||||
int recv_bytes = 0;
|
int recv_bytes = 0;
|
||||||
char recv_buf[OPENSSL_DEMO_RECV_BUF_LEN];
|
char recv_buf[OPENSSL_EXAMPLE_RECV_BUF_LEN];
|
||||||
|
|
||||||
const char send_data[] = OPENSSL_DEMO_REQUEST;
|
const char send_data[] = OPENSSL_EXAMPLE_REQUEST;
|
||||||
const int send_bytes = sizeof(send_data);
|
const int send_bytes = sizeof(send_data);
|
||||||
|
|
||||||
ESP_LOGI(TAG, "OpenSSL demo thread start OK");
|
ESP_LOGI(TAG, "OpenSSL demo thread start OK");
|
||||||
|
|
||||||
ESP_LOGI(TAG, "get target IP address");
|
ESP_LOGI(TAG, "get target IP address");
|
||||||
hp = gethostbyname(OPENSSL_DEMO_TARGET_NAME);
|
hp = gethostbyname(OPENSSL_EXAMPLE_TARGET_NAME);
|
||||||
if (!hp) {
|
if (!hp) {
|
||||||
ESP_LOGI(TAG, "failed");
|
ESP_LOGI(TAG, "failed");
|
||||||
goto failed1;
|
goto failed1;
|
||||||
@ -84,7 +84,7 @@ void openssl_demo_thread(void *p)
|
|||||||
memset(&sock_addr, 0, sizeof(sock_addr));
|
memset(&sock_addr, 0, sizeof(sock_addr));
|
||||||
sock_addr.sin_family = AF_INET;
|
sock_addr.sin_family = AF_INET;
|
||||||
sock_addr.sin_addr.s_addr = 0;
|
sock_addr.sin_addr.s_addr = 0;
|
||||||
sock_addr.sin_port = htons(OPENSSL_DEMO_LOCAL_TCP_PORT);
|
sock_addr.sin_port = htons(OPENSSL_EXAMPLE_LOCAL_TCP_PORT);
|
||||||
ret = bind(socket, (struct sockaddr*)&sock_addr, sizeof(sock_addr));
|
ret = bind(socket, (struct sockaddr*)&sock_addr, sizeof(sock_addr));
|
||||||
if (ret) {
|
if (ret) {
|
||||||
ESP_LOGI(TAG, "failed");
|
ESP_LOGI(TAG, "failed");
|
||||||
@ -92,11 +92,11 @@ void openssl_demo_thread(void *p)
|
|||||||
}
|
}
|
||||||
ESP_LOGI(TAG, "OK");
|
ESP_LOGI(TAG, "OK");
|
||||||
|
|
||||||
ESP_LOGI(TAG, "socket connect to remote %s ......", OPENSSL_DEMO_TARGET_NAME);
|
ESP_LOGI(TAG, "socket connect to remote %s ......", OPENSSL_EXAMPLE_TARGET_NAME);
|
||||||
memset(&sock_addr, 0, sizeof(sock_addr));
|
memset(&sock_addr, 0, sizeof(sock_addr));
|
||||||
sock_addr.sin_family = AF_INET;
|
sock_addr.sin_family = AF_INET;
|
||||||
sock_addr.sin_addr.s_addr = ip4_addr->addr;
|
sock_addr.sin_addr.s_addr = ip4_addr->addr;
|
||||||
sock_addr.sin_port = htons(OPENSSL_DEMO_TARGET_TCP_PORT);
|
sock_addr.sin_port = htons(OPENSSL_EXAMPLE_TARGET_TCP_PORT);
|
||||||
ret = connect(socket, (struct sockaddr*)&sock_addr, sizeof(sock_addr));
|
ret = connect(socket, (struct sockaddr*)&sock_addr, sizeof(sock_addr));
|
||||||
if (ret) {
|
if (ret) {
|
||||||
ESP_LOGI(TAG, "failed");
|
ESP_LOGI(TAG, "failed");
|
||||||
@ -115,7 +115,7 @@ void openssl_demo_thread(void *p)
|
|||||||
SSL_set_fd(ssl, socket);
|
SSL_set_fd(ssl, socket);
|
||||||
|
|
||||||
ESP_LOGI(TAG, "SSL connected to %s port %d ......",
|
ESP_LOGI(TAG, "SSL connected to %s port %d ......",
|
||||||
OPENSSL_DEMO_TARGET_NAME, OPENSSL_DEMO_TARGET_TCP_PORT);
|
OPENSSL_EXAMPLE_TARGET_NAME, OPENSSL_EXAMPLE_TARGET_TCP_PORT);
|
||||||
ret = SSL_connect(ssl);
|
ret = SSL_connect(ssl);
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
ESP_LOGI(TAG, "failed " );
|
ESP_LOGI(TAG, "failed " );
|
||||||
@ -124,7 +124,7 @@ void openssl_demo_thread(void *p)
|
|||||||
ESP_LOGI(TAG, "OK");
|
ESP_LOGI(TAG, "OK");
|
||||||
|
|
||||||
ESP_LOGI(TAG, "send https request to %s port %d ......",
|
ESP_LOGI(TAG, "send https request to %s port %d ......",
|
||||||
OPENSSL_DEMO_TARGET_NAME, OPENSSL_DEMO_TARGET_TCP_PORT);
|
OPENSSL_EXAMPLE_TARGET_NAME, OPENSSL_EXAMPLE_TARGET_TCP_PORT);
|
||||||
ret = SSL_write(ssl, send_data, send_bytes);
|
ret = SSL_write(ssl, send_data, send_bytes);
|
||||||
if (ret <= 0) {
|
if (ret <= 0) {
|
||||||
ESP_LOGI(TAG, "failed");
|
ESP_LOGI(TAG, "failed");
|
||||||
@ -133,7 +133,7 @@ void openssl_demo_thread(void *p)
|
|||||||
ESP_LOGI(TAG, "OK");
|
ESP_LOGI(TAG, "OK");
|
||||||
|
|
||||||
do {
|
do {
|
||||||
ret = SSL_read(ssl, recv_buf, OPENSSL_DEMO_RECV_BUF_LEN - 1);
|
ret = SSL_read(ssl, recv_buf, OPENSSL_EXAMPLE_RECV_BUF_LEN - 1);
|
||||||
if (ret <= 0) {
|
if (ret <= 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -141,7 +141,7 @@ void openssl_demo_thread(void *p)
|
|||||||
ESP_LOGI(TAG, "%s", recv_buf);
|
ESP_LOGI(TAG, "%s", recv_buf);
|
||||||
} while (1);
|
} while (1);
|
||||||
|
|
||||||
ESP_LOGI(TAG, "totaly read %d bytes data from %s ......", recv_bytes, OPENSSL_DEMO_TARGET_NAME);
|
ESP_LOGI(TAG, "totaly read %d bytes data from %s ......", recv_bytes, OPENSSL_EXAMPLE_TARGET_NAME);
|
||||||
|
|
||||||
failed5:
|
failed5:
|
||||||
SSL_shutdown(ssl);
|
SSL_shutdown(ssl);
|
||||||
@ -159,20 +159,20 @@ failed1:
|
|||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void openssl_client_init(void)
|
static void openssl_example_client_init(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
xTaskHandle openssl_handle;
|
xTaskHandle openssl_handle;
|
||||||
|
|
||||||
ret = xTaskCreate(openssl_demo_thread,
|
ret = xTaskCreate(openssl_example_task,
|
||||||
OPENSSL_DEMO_THREAD_NAME,
|
OPENSSL_EXAMPLE_TASK_NAME,
|
||||||
OPENSSL_DEMO_THREAD_STACK_WORDS,
|
OPENSSL_EXAMPLE_TASK_STACK_WORDS,
|
||||||
NULL,
|
NULL,
|
||||||
OPENSSL_DEMO_THREAD_PRORIOTY,
|
OPENSSL_EXAMPLE_TASK_PRORIOTY,
|
||||||
&openssl_handle);
|
&openssl_handle);
|
||||||
|
|
||||||
if (ret != pdPASS) {
|
if (ret != pdPASS) {
|
||||||
ESP_LOGI(TAG, "create thread %s failed", OPENSSL_DEMO_THREAD_NAME);
|
ESP_LOGI(TAG, "create thread %s failed", OPENSSL_EXAMPLE_TASK_NAME);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -184,7 +184,7 @@ static esp_err_t wifi_event_handler(void *ctx, system_event_t *event)
|
|||||||
break;
|
break;
|
||||||
case SYSTEM_EVENT_STA_GOT_IP:
|
case SYSTEM_EVENT_STA_GOT_IP:
|
||||||
xEventGroupSetBits(wifi_event_group, CONNECTED_BIT);
|
xEventGroupSetBits(wifi_event_group, CONNECTED_BIT);
|
||||||
openssl_client_init();
|
openssl_example_client_init();
|
||||||
break;
|
break;
|
||||||
case SYSTEM_EVENT_STA_DISCONNECTED:
|
case SYSTEM_EVENT_STA_DISCONNECTED:
|
||||||
/* This is a workaround as ESP32 WiFi libs don't currently
|
/* This is a workaround as ESP32 WiFi libs don't currently
|
@ -21,13 +21,13 @@
|
|||||||
#define EXAMPLE_WIFI_SSID CONFIG_WIFI_SSID
|
#define EXAMPLE_WIFI_SSID CONFIG_WIFI_SSID
|
||||||
#define EXAMPLE_WIFI_PASS CONFIG_WIFI_PASSWORD
|
#define EXAMPLE_WIFI_PASS CONFIG_WIFI_PASSWORD
|
||||||
|
|
||||||
#define OPENSSL_DEMO_THREAD_NAME "OpenSSL_demo"
|
#define OPENSSL_EXAMPLE_TASK_NAME "openssl_example"
|
||||||
#define OPENSSL_DEMO_THREAD_STACK_WORDS 10240
|
#define OPENSSL_EXAMPLE_TASK_STACK_WORDS 10240
|
||||||
#define OPENSSL_DEMO_THREAD_PRORIOTY 8
|
#define OPENSSL_EXAMPLE_TASK_PRORIOTY 8
|
||||||
|
|
||||||
#define OPENSSL_DEMO_RECV_BUF_LEN 1024
|
#define OPENSSL_EXAMPLE_RECV_BUF_LEN 1024
|
||||||
|
|
||||||
#define OPENSSL_DEMO_LOCAL_TCP_PORT 443
|
#define OPENSSL_EXAMPLE_LOCAL_TCP_PORT 443
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -7,7 +7,7 @@
|
|||||||
CONDITIONS OF ANY KIND, either express or implied.
|
CONDITIONS OF ANY KIND, either express or implied.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "openssl_server.h"
|
#include "openssl_server_example.h"
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
@ -33,20 +33,20 @@ static EventGroupHandle_t wifi_event_group;
|
|||||||
to the AP with an IP? */
|
to the AP with an IP? */
|
||||||
const static int CONNECTED_BIT = BIT0;
|
const static int CONNECTED_BIT = BIT0;
|
||||||
|
|
||||||
const static char *TAG = "Openssl_demo";
|
const static char *TAG = "Openssl_example";
|
||||||
|
|
||||||
#define OPENSSL_DEMO_SERVER_ACK "HTTP/1.1 200 OK\r\n" \
|
#define OPENSSL_EXAMPLE_SERVER_ACK "HTTP/1.1 200 OK\r\n" \
|
||||||
"Content-Type: text/html\r\n" \
|
"Content-Type: text/html\r\n" \
|
||||||
"Content-Length: 98\r\n\r\n" \
|
"Content-Length: 98\r\n\r\n" \
|
||||||
"<html>\r\n" \
|
"<html>\r\n" \
|
||||||
"<head>\r\n" \
|
"<head>\r\n" \
|
||||||
"<title>OpenSSL demo</title></head><body>\r\n" \
|
"<title>OpenSSL example</title></head><body>\r\n" \
|
||||||
"OpenSSL server demo!\r\n" \
|
"OpenSSL server example!\r\n" \
|
||||||
"</body>\r\n" \
|
"</body>\r\n" \
|
||||||
"</html>\r\n" \
|
"</html>\r\n" \
|
||||||
"\r\n"
|
"\r\n"
|
||||||
|
|
||||||
static void openssl_demo_thread(void *p)
|
static void openssl_example_task(void *p)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
@ -57,9 +57,9 @@ static void openssl_demo_thread(void *p)
|
|||||||
socklen_t addr_len;
|
socklen_t addr_len;
|
||||||
struct sockaddr_in sock_addr;
|
struct sockaddr_in sock_addr;
|
||||||
|
|
||||||
char recv_buf[OPENSSL_DEMO_RECV_BUF_LEN];
|
char recv_buf[OPENSSL_EXAMPLE_RECV_BUF_LEN];
|
||||||
|
|
||||||
const char send_data[] = OPENSSL_DEMO_SERVER_ACK;
|
const char send_data[] = OPENSSL_EXAMPLE_SERVER_ACK;
|
||||||
const int send_bytes = sizeof(send_data);
|
const int send_bytes = sizeof(send_data);
|
||||||
|
|
||||||
extern const unsigned char cacert_pem_start[] asm("_binary_cacert_pem_start");
|
extern const unsigned char cacert_pem_start[] asm("_binary_cacert_pem_start");
|
||||||
@ -110,7 +110,7 @@ static void openssl_demo_thread(void *p)
|
|||||||
memset(&sock_addr, 0, sizeof(sock_addr));
|
memset(&sock_addr, 0, sizeof(sock_addr));
|
||||||
sock_addr.sin_family = AF_INET;
|
sock_addr.sin_family = AF_INET;
|
||||||
sock_addr.sin_addr.s_addr = 0;
|
sock_addr.sin_addr.s_addr = 0;
|
||||||
sock_addr.sin_port = htons(OPENSSL_DEMO_LOCAL_TCP_PORT);
|
sock_addr.sin_port = htons(OPENSSL_EXAMPLE_LOCAL_TCP_PORT);
|
||||||
ret = bind(socket, (struct sockaddr*)&sock_addr, sizeof(sock_addr));
|
ret = bind(socket, (struct sockaddr*)&sock_addr, sizeof(sock_addr));
|
||||||
if (ret) {
|
if (ret) {
|
||||||
ESP_LOGI(TAG, "failed");
|
ESP_LOGI(TAG, "failed");
|
||||||
@ -155,8 +155,8 @@ reconnect:
|
|||||||
|
|
||||||
ESP_LOGI(TAG, "SSL server read message ......");
|
ESP_LOGI(TAG, "SSL server read message ......");
|
||||||
do {
|
do {
|
||||||
memset(recv_buf, 0, OPENSSL_DEMO_RECV_BUF_LEN);
|
memset(recv_buf, 0, OPENSSL_EXAMPLE_RECV_BUF_LEN);
|
||||||
ret = SSL_read(ssl, recv_buf, OPENSSL_DEMO_RECV_BUF_LEN - 1);
|
ret = SSL_read(ssl, recv_buf, OPENSSL_EXAMPLE_RECV_BUF_LEN - 1);
|
||||||
if (ret <= 0) {
|
if (ret <= 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -199,15 +199,15 @@ static void openssl_client_init(void)
|
|||||||
int ret;
|
int ret;
|
||||||
xTaskHandle openssl_handle;
|
xTaskHandle openssl_handle;
|
||||||
|
|
||||||
ret = xTaskCreate(openssl_demo_thread,
|
ret = xTaskCreate(openssl_example_task,
|
||||||
OPENSSL_DEMO_THREAD_NAME,
|
OPENSSL_EXAMPLE_TASK_NAME,
|
||||||
OPENSSL_DEMO_THREAD_STACK_WORDS,
|
OPENSSL_EXAMPLE_TASK_STACK_WORDS,
|
||||||
NULL,
|
NULL,
|
||||||
OPENSSL_DEMO_THREAD_PRORIOTY,
|
OPENSSL_EXAMPLE_TASK_PRORIOTY,
|
||||||
&openssl_handle);
|
&openssl_handle);
|
||||||
|
|
||||||
if (ret != pdPASS) {
|
if (ret != pdPASS) {
|
||||||
ESP_LOGI(TAG, "create thread %s failed", OPENSSL_DEMO_THREAD_NAME);
|
ESP_LOGI(TAG, "create task %s failed", OPENSSL_EXAMPLE_TASK_NAME);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -135,7 +135,7 @@ static bool read_past_http_header(char text[], int total_len, esp_ota_handle_t u
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool connect_to_http_server()
|
static bool connect_to_http_server()
|
||||||
{
|
{
|
||||||
ESP_LOGI(TAG, "Server IP: %s Server Port:%s", EXAMPLE_SERVER_IP, EXAMPLE_SERVER_PORT);
|
ESP_LOGI(TAG, "Server IP: %s Server Port:%s", EXAMPLE_SERVER_IP, EXAMPLE_SERVER_PORT);
|
||||||
sprintf(http_request, "GET %s HTTP/1.1\r\nHost: %s:%s \r\n\r\n", EXAMPLE_FILENAME, EXAMPLE_SERVER_IP, EXAMPLE_SERVER_PORT);
|
sprintf(http_request, "GET %s HTTP/1.1\r\nHost: %s:%s \r\n\r\n", EXAMPLE_FILENAME, EXAMPLE_SERVER_IP, EXAMPLE_SERVER_PORT);
|
||||||
@ -168,7 +168,7 @@ bool connect_to_http_server()
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void __attribute__((noreturn)) task_fatal_error()
|
static void __attribute__((noreturn)) task_fatal_error()
|
||||||
{
|
{
|
||||||
ESP_LOGE(TAG, "Exiting task due to fatal error...");
|
ESP_LOGE(TAG, "Exiting task due to fatal error...");
|
||||||
close(socket_id);
|
close(socket_id);
|
||||||
@ -179,7 +179,7 @@ void __attribute__((noreturn)) task_fatal_error()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void main_task(void *pvParameter)
|
static void ota_example_task(void *pvParameter)
|
||||||
{
|
{
|
||||||
esp_err_t err;
|
esp_err_t err;
|
||||||
/* update handle : set by esp_ota_begin(), must be freed via esp_ota_end() */
|
/* update handle : set by esp_ota_begin(), must be freed via esp_ota_end() */
|
||||||
@ -295,5 +295,5 @@ void app_main()
|
|||||||
ESP_ERROR_CHECK( err );
|
ESP_ERROR_CHECK( err );
|
||||||
|
|
||||||
initialise_wifi();
|
initialise_wifi();
|
||||||
xTaskCreate(&main_task, "main_task", 8192, NULL, 5, NULL);
|
xTaskCreate(&ota_example_task, "ota_example_task", 8192, NULL, 5, NULL);
|
||||||
}
|
}
|
@ -127,7 +127,7 @@ static void initialise_wifi(void)
|
|||||||
ESP_ERROR_CHECK( esp_wifi_start() );
|
ESP_ERROR_CHECK( esp_wifi_start() );
|
||||||
}
|
}
|
||||||
|
|
||||||
static void wpa2_enterprise_task(void *pvParameters)
|
static void wpa2_enterprise_example_task(void *pvParameters)
|
||||||
{
|
{
|
||||||
tcpip_adapter_ip_info_t ip;
|
tcpip_adapter_ip_info_t ip;
|
||||||
memset(&ip, 0, sizeof(tcpip_adapter_ip_info_t));
|
memset(&ip, 0, sizeof(tcpip_adapter_ip_info_t));
|
||||||
@ -150,5 +150,5 @@ void app_main()
|
|||||||
{
|
{
|
||||||
ESP_ERROR_CHECK( nvs_flash_init() );
|
ESP_ERROR_CHECK( nvs_flash_init() );
|
||||||
initialise_wifi();
|
initialise_wifi();
|
||||||
xTaskCreate(&wpa2_enterprise_task, "wpa2_enterprise_task", 4096, NULL, 5, NULL);
|
xTaskCreate(&wpa2_enterprise_example_task, "wpa2_enterprise_example_task", 4096, NULL, 5, NULL);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user